diff --git a/qrevint_22_06_22/Classes/BoatData.py b/Classes/BoatData.py
similarity index 70%
rename from qrevint_22_06_22/Classes/BoatData.py
rename to Classes/BoatData.py
index b748f176eb8c844fe56b0c1f9d047ba169070825..a0ecabc8b557cd4d7b85bd87ce5ab780f2d79e33 100644
--- a/qrevint_22_06_22/Classes/BoatData.py
+++ b/Classes/BoatData.py
@@ -1,8 +1,17 @@
 import copy
 import numpy as np
 from numpy.matlib import repmat
-from MiscLibs.common_functions import cosd, sind, cart2pol, iqr, pol2cart, nan_less_equal, \
-    nan_greater_equal, nan_greater, nan_less
+from MiscLibs.common_functions import (
+    cosd,
+    sind,
+    cart2pol,
+    iqr,
+    pol2cart,
+    nan_less_equal,
+    nan_greater_equal,
+    nan_greater,
+    nan_less,
+)
 from MiscLibs.robust_loess import rloess
 
 
@@ -15,13 +24,22 @@ class BoatData(object):
     Original data provided to the class
         raw_vel_mps: np.array
             Contains the raw unfiltered velocity data in m/s.
-            First index is 1-4 are beams 1,2,3,3 if if beam or u,v,w,d if otherwise.
+
+            First index is 1-4 are beams 1,2,3,3 if if beam or u,v,w,d if
+             otherwise.
         frequency_khz: np.array or float
             Defines ADCP frequency used for velocity Measurement.
         orig_coord_sys: str
-            Defines the original raw data velocity Coordinate, "Beam", "Inst", "Ship", "Earth".
+
+            Defines the original raw data velocity Coordinate, "Beam", "Inst",
+            "Ship", "Earth".
         nav_ref: str
-            Defines the original raw data navigation reference, "None", "BT", "GGA" "VTG".
+            Defines the original raw data navigation reference, "None", "BT",
+            "GGA" "VTG".
+        corr: np.array
+            Correlation values for bottom track
+        rssi: np.array
+            Returned signal strength for bottom track
         corr: np.array
             Correlation values for bottom track
         rssi: np.array
@@ -29,7 +47,8 @@ class BoatData(object):
 
     Coordinate transformed data
         coord_sys: str
-            Defines the current coordinate system "Beam", "Inst", "Ship", "Earth" used to compute u, v, w, and d.
+            Defines the current coordinate system "Beam", "Inst", "Ship",
+            "Earth" used to compute u, v, w, and d.
         u_mps: np.array(float)
             Horizontal velocity in x-direction, in m/s.
         v_mps: np.array(float)
@@ -37,7 +56,8 @@ class BoatData(object):
         w_mps: np.array(float)
             Vertical velocity (+ up), m/s.
         d_mps: np.array(float)
-            Difference in vertical velocities compute from opposing beam pairs in m/s.
+            Difference in vertical velocities compute from opposing beam
+            pairs in m/s.
         num_invalid: float
             Number of ensembles with invalid velocity data.
         bottom_mode: str
@@ -54,11 +74,11 @@ class BoatData(object):
     Settings variables
         d_filter: str
             Difference velocity filter "Manual", "Off", "Auto".
-        d_filter_thresholds: float
+        d_filter_thresholds: dict
             Threshold for difference velocity filter.
         w_filter: str
             Vertical velocity filter "Manual", "Off", "Auto".
-        w_filter_threshold: float
+        w_filter_thresholds: dict
             Threshold for vertical velocity filter.
         gps_diff_qual_filter: integer
             Differential correction quality (1,2,4).
@@ -83,20 +103,26 @@ class BoatData(object):
         interpolate: str
             Type of interpolation: "None", "Linear", "Smooth" etc.
         beam_filter: integer
-            Minimum number of beams for valid data, 3 for 3-beam solutions, 4 for 4-beam.
+            Minimum number of beams for valid data, 3 for 3-beam solutions,
+            4 for 4-beam.
         valid_data: np.array(bool)
-            Logical array of identifying valid and invalid data for each filter applied.
+            Logical array of identifying valid and invalid data for each
+            filter applied.
                 Row 1 [0] - composite
                 Row 2 [1] - original
                 Row 3 [2] - d_filter of diff_qual
                 Row 4 [3] - w_filter or altitude
                 Row 5 [4] - smooth_filter
                 Row 6 [5] - beam_filter or HDOP
-
+        ping_type: np.array(int)
+            Indicates type of ping for each cell: 0-incoherent, 1-coherent,
+             2-surface
         d_meas_thresholds: dict
-            Dictionary of difference velocity thresholds computed using the whole measurement
+            Dictionary of difference velocity thresholds computed using the
+            whole measurement
         w_meas_thresholds: dict
-            Dictionary of vertical velocity thresholds computed using the whole measurement
+            Dictionary of vertical velocity thresholds computed using the
+            whole measurement
         use_measurement_thresholds: bool
             Indicates if the measurement based thresholds should be used
     """
@@ -105,45 +131,46 @@ class BoatData(object):
         """Initialize instance variables."""
 
         # Variables passed to the constructor
-        self.raw_vel_mps = None  # contains the raw unfiltered velocity data in m/s.
-        self.frequency_khz = None  # Defines ADCP frequency used for velocity Measurement
-        self.orig_coord_sys = None  # Defines the original raw data velocity Coordinate
-        self.nav_ref = None  # Defines the original raw data navigation reference
+        self.raw_vel_mps = None
+        self.frequency_khz = None
+        self.orig_coord_sys = None
+        self.nav_ref = None
         self.corr = np.array([])
         self.rssi = np.array([])
-
-        # Coordinate transformed data
-        self.coord_sys = None  # Defines the current coordinate system "Beam", "Inst", "Ship", "Earth"
-        self.u_mps = None  # Horizontal velocity in x-direction, in m/s
-        self.v_mps = None  # Horizontal velocity in y-direction, in m/s
-        self.w_mps = None  # Vertical velocity (+ up), m/s
-        self.d_mps = None  # Difference in vertical velocities compute from opposing beam pairs in m/s
-        self.num_invalid = None  # Number of ensembles with invalid velocity data
-        self.bottom_mode = None  # BT mode for TRDI, 'Variable' for SonTek
+        self.corr = np.array([])
+        self.rssi = np.array([])
+        self.coord_sys = None
+        self.u_mps = None
+        self.v_mps = None
+        self.w_mps = None
+        self.d_mps = None
+        self.num_invalid = None
+        self.bottom_mode = None
 
         # Processed data
-        self.u_processed_mps = None  # Horizontal velocity in x-direction filtered and interpolated
-        self.v_processed_mps = None  # Horizontal velocity in y-direction filtered and interpolated
-        self.processed_source = None  # Source of data, BT, GGA, VTG, INT
+        self.u_processed_mps = None
+        self.v_processed_mps = None
+        self.processed_source = None
 
         # Filter and interpolation properties
-        self.d_filter = None  # Difference velocity filter "Manual", "Off", "Auto"
-        self.d_filter_thresholds = {}  # Threshold for difference velocity filter
-        self.w_filter = None  # Vertical velocity filter "On", "Off"
-        self.w_filter_thresholds = {}  # Threshold for vertical velocity filter
-        self.gps_diff_qual_filter = None  # Differential correction quality (1,2,4)
-        self.gps_altitude_filter = None  # Change in altitude filter "Auto", "Manual", "Off"
-        self.gps_altitude_filter_change = None  # Threshold from mean for altitude filter
-        self.gps_HDOP_filter = None  # HDOP filter "Auto", "Manual", "Off"
-        self.gps_HDOP_filter_max = None  # Max acceptable value for HDOP
-        self.gps_HDOP_filter_change = None  # Maximum change allowed from mean
-        self.smooth_filter = None  # Filter based on smoothing function
-        self.smooth_speed = None  # Smoothed boat speed
-        self.smooth_upper_limit = None  # Smooth function upper limit of window
-        self.smooth_lower_limit = None  # Smooth function lower limit of window
-        self.interpolate = None  # Type of interpolation: "None", "Linear", "Smooth" etc.
-        self.beam_filter = None  # 3 for 3-beam solutions, 4 for 4-beam SolutionStackDescription
-        self.valid_data = None  # Logical array of identifying valid and invalid data for each filter applied
+        self.d_filter = None
+        self.d_filter_thresholds = {}
+        self.w_filter = None
+        self.w_filter_thresholds = {}
+        self.gps_diff_qual_filter = None
+        self.gps_altitude_filter = None
+        self.gps_altitude_filter_change = None
+        self.gps_HDOP_filter = None
+        self.gps_HDOP_filter_max = None
+        self.gps_HDOP_filter_change = None
+        self.smooth_filter = None
+        self.smooth_speed = None
+        self.smooth_upper_limit = None
+        self.smooth_lower_limit = None
+        self.interpolate = None
+        self.beam_filter = None
+        self.valid_data = None
+        self.ping_type = np.array([])
 
         # Filter settings populated from Measurement.create_filter_composites
         self.d_meas_thresholds = {}
@@ -151,8 +178,19 @@ class BoatData(object):
 
         self.use_measurement_thresholds = False
 
-    def populate_data(self, source, vel_in, freq_in, coord_sys_in, nav_ref_in, beam_filter_in=3,
-                      bottom_mode_in='Variable', corr_in=None, rssi_in=None):
+    def populate_data(
+        self,
+        source,
+        vel_in,
+        freq_in,
+        coord_sys_in,
+        nav_ref_in,
+        beam_filter_in=3,
+        bottom_mode_in="Variable",
+        corr_in=None,
+        rssi_in=None,
+        ping_type=None,
+    ):
         """Assigns data to instance variables.
 
         Parameters
@@ -171,19 +209,22 @@ class BoatData(object):
             Minimum number of valid beams for valid data.
         bottom_mode_in: str
             Bottom mode for TRDI ADCP
-        corr: np.array
+        corr_in: np.array
             Correlation values for bottom track
-        rssi: np.array
+        rssi_in: np.array
             Returned signal strength for bottom track
+        ping_type: np.array(str)
+            Indicates type of ping used for bottom tracking
         """
 
         # Identify invalid ensembles for SonTek data.
-        if source == 'SonTek':
+        if source == "SonTek":
             vel_in = BoatData.filter_sontek(vel_in)
 
         # Store input data
         self.raw_vel_mps = vel_in
         self.frequency_khz = freq_in
+        self.ping_type = ping_type
         self.coord_sys = coord_sys_in
         self.orig_coord_sys = coord_sys_in
         self.nav_ref = nav_ref_in
@@ -194,21 +235,22 @@ class BoatData(object):
         if rssi_in is not None:
             self.rssi = rssi_in
 
-        if nav_ref_in == 'BT':
+        if nav_ref_in == "BT":
 
-            # Boat velocities are referenced to ADCP not the streambed and thus must be reversed
+            # Boat velocities are referenced to ADCP not the streambed and
+            # thus must be reversed
             self.u_mps = np.copy(-1 * vel_in[0, :])
             self.v_mps = np.copy(-1 * vel_in[1, :])
             self.w_mps = np.copy(vel_in[2, :])
             self.d_mps = np.copy(vel_in[3, :])
 
             # Default filtering applied during initial construction of object
-            self.d_filter = 'Off'
+            self.d_filter = "Off"
             self.d_filter_thresholds = {}
-            self.w_filter = 'Off'
+            self.w_filter = "Off"
             self.w_filter_thresholds = {}
-            self.smooth_filter = 'Off'
-            self.interpolate = 'None'
+            self.smooth_filter = "Off"
+            self.interpolate = "None"
 
         else:
 
@@ -220,13 +262,13 @@ class BoatData(object):
 
             # Default filtering
             self.gps_diff_qual_filter = 2
-            self.gps_altitude_filter = 'Off'
+            self.gps_altitude_filter = "Off"
             self.gps_altitude_filter_change = 3
-            self.gps_HDOP_filter = 'Off'
+            self.gps_HDOP_filter = "Off"
             self.gps_HDOP_filter_max = 2.5
             self.gps_HDOP_filter_change = 1
-            self.smooth_filter = 'Off'
-            self.interpolate = 'None'
+            self.smooth_filter = "Off"
+            self.interpolate = "None"
 
         # Assign data to processed property
         self.u_processed_mps = np.copy(self.u_mps)
@@ -246,20 +288,21 @@ class BoatData(object):
         valid_vel[np.isnan(self.raw_vel_mps)] = False
 
         # Identify invalid ensembles
-        if nav_ref_in == 'BT':
+        if nav_ref_in == "BT":
             self.valid_data[1, np.sum(valid_vel, 0) < 3] = False
         else:
             self.valid_data[1, np.sum(valid_vel, 0) < 2] = False
 
         # Combine all filter data to composite valid data
         self.valid_data[0, :] = np.all(self.valid_data[1:, :], 0)
-        self.num_invalid = np.sum(self.valid_data[0, :] == False)
-        self.processed_source = np.array([''] * self.u_mps.shape[0], dtype=object)
-        self.processed_source[np.where(self.valid_data[0, :] == True)] = nav_ref_in
-        self.processed_source[np.where(self.valid_data[0, :] == False)] = "INT"
+        self.num_invalid = np.sum(np.logical_not(self.valid_data[0, :]))
+        self.processed_source = np.array([""] * self.u_mps.shape[0], dtype=object)
+        self.processed_source[np.where(self.valid_data[0, :])] = nav_ref_in
+        self.processed_source[np.where(np.logical_not(self.valid_data[0, :]))] = "INT"
 
     def populate_from_qrev_mat(self, mat_data):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -275,30 +318,41 @@ class BoatData(object):
             self.frequency_khz = None
         else:
             self.frequency_khz = np.array([mat_data.frequency_hz])
+
+        if hasattr(mat_data, "ping_type"):
+            if type(mat_data.ping_type) is np.ndarray:
+                if np.size(mat_data.ping_type):
+                    self.ping_type = mat_data.ping_type
+                    self.ping_type = np.char.strip(self.ping_type)
+                else:
+                    self.ping_type = None
+        else:
+            self.ping_type = None
+
         self.orig_coord_sys = mat_data.origCoordSys
         self.nav_ref = mat_data.navRef
 
         # Data requiring manipulation if only 1 ensemble
         if type(mat_data.u_mps) is float:
-            self.raw_vel_mps = mat_data.rawVel_mps.reshape(mat_data.rawVel_mps.shape[0], 1)
+            self.raw_vel_mps = mat_data.rawVel_mps.reshape(
+                mat_data.rawVel_mps.shape[0], 1
+            )
             # Coordinate transformed data
             self.coord_sys = np.array([mat_data.coordSys])
             self.u_mps = np.array([mat_data.u_mps])
             self.v_mps = np.array([mat_data.v_mps])
             self.w_mps = np.array([mat_data.w_mps])
             self.d_mps = np.array([mat_data.d_mps])
-            if hasattr(mat_data, 'corr'):
+            if hasattr(mat_data, "corr"):
                 self.corr = mat_data.corr.reshape(mat_data.corr.shape[0], 1)
-            if hasattr(mat_data, 'rssi'):
+            if hasattr(mat_data, "rssi"):
                 self.rssi = mat_data.rssi.reshape(mat_data.rssi.shape[0], 1)
 
-            # self.bottom_mode = np.array([mat_data.bottomMode])
-
             # Processed data
             self.u_processed_mps = np.array([mat_data.uProcessed_mps])
             self.v_processed_mps = np.array([mat_data.vProcessed_mps])
             self.processed_source = np.array([mat_data.processedSource])
-            self.valid_data = np.array([ mat_data.validData]).astype(bool)
+            self.valid_data = np.array([mat_data.validData]).astype(bool)
             if self.valid_data.shape[1] > 1:
                 self.valid_data = self.valid_data.reshape(-1, 1)
             self.smooth_speed = np.array([mat_data.smoothSpeed])
@@ -308,18 +362,22 @@ class BoatData(object):
             self.raw_vel_mps = mat_data.rawVel_mps
             # Coordinate transformed data
             self.coord_sys = mat_data.coordSys
-            self.u_mps = mat_data.u_mps
-            self.v_mps = mat_data.v_mps
-            self.w_mps = mat_data.w_mps
-            self.d_mps = mat_data.d_mps
-
-            if hasattr(mat_data, 'corr'):
+            self.u_mps = mat_data.u_mps.astype("float64")
+            self.v_mps = mat_data.v_mps.astype("float64")
+            try:
+                self.w_mps = mat_data.w_mps.astype("float64")
+            except AttributeError:
+                self.w_mps = np.array(mat_data.w_mps)
+            try:
+                self.d_mps = mat_data.d_mps.astype("float64")
+            except AttributeError:
+                self.d_mps = np.array(mat_data.d_mps)
+
+            if hasattr(mat_data, "corr"):
                 self.corr = mat_data.corr
-            if hasattr(mat_data, 'rssi'):
+            if hasattr(mat_data, "rssi"):
                 self.rssi = mat_data.rssi
 
-            # self.bottom_mode = mat_data.bottomMode
-
             # Processed data
             self.u_processed_mps = mat_data.uProcessed_mps
             self.v_processed_mps = mat_data.vProcessed_mps
@@ -397,7 +455,7 @@ class BoatData(object):
         self.beam_filter = mat_data.beamFilter
 
         # Use measurement for filter
-        if hasattr(mat_data, 'use_measurement_thresholds'):
+        if hasattr(mat_data, "use_measurement_thresholds"):
             self.use_measurement_thresholds = mat_data.use_measurement_thresholds
             self.d_meas_thresholds = self.struct_to_dict(mat_data.d_meas_thresholds)
             self.w_meas_thresholds = self.struct_to_dict(mat_data.w_meas_thresholds)
@@ -433,7 +491,8 @@ class BoatData(object):
     def change_coord_sys(self, new_coord_sys, sensors, adcp):
         """This function allows the coordinate system to be changed.
 
-        Current implementation is only to allow change to a higher order coordinate system Beam - Inst - Ship - Earth
+        Current implementation is only to allow change to a higher order
+        coordinate system Beam - Inst - Ship - Earth
 
         Parameters
         ----------
@@ -464,36 +523,35 @@ class BoatData(object):
             r = getattr(sensors.roll_deg, sensors.roll_deg.selected).data
             h = getattr(sensors.heading_deg, sensors.heading_deg.selected).data
 
-            # Modify the transformation matrix and heading, pitch, and roll values base on
-            # the original coordinate system so that only the needed values are used in
-            # computing the new coordinate system
-            if o_coord_sys == 'Beam':
+            # Modify the transformation matrix and heading, pitch, and roll
+            # values base on the original coordinate system so that only
+            # the needed values are used in computing the new coordinate system
+            if o_coord_sys == "Beam":
                 orig_sys = 1
-            elif o_coord_sys == 'Inst':
+            elif o_coord_sys == "Inst":
                 orig_sys = 2
-                t_matrix[:] = np.eye(t_matrix.shape[0])
-            elif o_coord_sys == 'Ship':
+            elif o_coord_sys == "Ship":
                 orig_sys = 3
                 p = np.zeros(h.shape)
                 r = np.zeros(h.shape)
-                t_matrix[:] = np.eye(t_matrix.shape[0])
-            elif o_coord_sys == 'Earth':
+            elif o_coord_sys == "Earth":
                 orig_sys = 4
 
             # Assign a value to the new coordinate system
-            if new_coord_sys == 'Beam':
+            if new_coord_sys == "Beam":
                 new_sys = 1
-            elif new_coord_sys == 'Inst':
+            elif new_coord_sys == "Inst":
                 new_sys = 2
-            elif new_coord_sys == 'Ship':
+            elif new_coord_sys == "Ship":
                 new_sys = 3
-            elif new_coord_sys == 'Earth':
+            elif new_coord_sys == "Earth":
                 new_sys = 4
 
-            # Check to ensure the new coordinate system is a higher order than the original system
+            # Check to ensure the new coordinate system is a higher order
+            # than the original system
             if new_sys - orig_sys > 0:
 
-                # Compute trig function for heaing, pitch and roll
+                # Compute trig function for heading, pitch and roll
                 ch = cosd(h)
                 sh = sind(h)
                 cp = cosd(p)
@@ -507,23 +565,27 @@ class BoatData(object):
                 for ii in range(n_ens):
 
                     # Compute matrix for heading, pitch, and roll
-                    hpr_matrix = [[((ch[ii] * cr[ii]) + (sh[ii]*sp[ii]*sr[ii])),
-                                   (sh[ii] * cp[ii]),
-                                   ((ch[ii] * sr[ii]) - sh[ii]*sp[ii]*cr[ii])],
-                                  [(-1 * sh[ii] * cr[ii])+(ch[ii] * sp[ii] * sr[ii]),
-                                   ch[ii] * cp[ii],
-                                   (-1 * sh[ii] * sr[ii])-(ch[ii] * sp[ii] * cr[ii])],
-                                  [(-1.*cp[ii] * sr[ii]),
-                                   sp[ii],
-                                   cp[ii] * cr[ii]]]
+                    hpr_matrix = [
+                        [
+                            ((ch[ii] * cr[ii]) + (sh[ii] * sp[ii] * sr[ii])),
+                            (sh[ii] * cp[ii]),
+                            ((ch[ii] * sr[ii]) - sh[ii] * sp[ii] * cr[ii]),
+                        ],
+                        [
+                            (-1 * sh[ii] * cr[ii]) + (ch[ii] * sp[ii] * sr[ii]),
+                            ch[ii] * cp[ii],
+                            (-1 * sh[ii] * sr[ii]) - (ch[ii] * sp[ii] * cr[ii]),
+                        ],
+                        [(-1.0 * cp[ii] * sr[ii]), sp[ii], cp[ii] * cr[ii]],
+                    ]
 
                     # Transform beam coordinates
-                    if o_coord_sys == 'Beam':
+                    if o_coord_sys == "Beam":
 
                         # Determine frequency index for transformation matrix
                         if len(t_matrix.shape) > 2:
                             idx_freq = np.where(t_matrix_freq == self.frequency_khz[ii])
-                            t_mult = np.copy(t_matrix[idx_freq])
+                            t_mult = np.copy(t_matrix[:, :, idx_freq[0][0]])
                         else:
                             t_mult = np.copy(t_matrix)
 
@@ -537,7 +599,7 @@ class BoatData(object):
                         if len(idx_3_beam[0]) == 1:
 
                             # Special processing for RiverRay
-                            if adcp.model == 'RiverRay':
+                            if adcp.model == "RiverRay":
 
                                 # Set beam pairing
                                 beam_pair_1a = 0
@@ -545,16 +607,22 @@ class BoatData(object):
                                 beam_pair_2a = 2
                                 beam_pair_2b = 3
 
-                                # Set speed of sound correction variables Note: Currently (2013-09-06)
-                                # WinRiver II does not use a variable correction and assumes the speed
-                                # of sound and the reference speed of sound are the same.
-                                # sos = sensors.speed_ofs_sound_mps.selected.data[ii]
+                                # Set speed of sound correction variables
+                                # Note: Currently (2013-09-06)
+                                # WinRiver II does not use a variable
+                                # correction and assumes the speed
+                                # of sound and the reference speed of sound
+                                # are the same.
+                                # sos =
+                                # sensors.speed_ofs_sound_mps.selected.data[ii]
                                 # sos_reference = 1536
-                                # sos_correction = np.sqrt(((2 * sos_reference) / sos) **2 -1)
+                                # sos_correction = np.sqrt(((2 *
+                                # sos_reference) / sos) **2 -1)
 
                                 sos_correction = np.sqrt(3)
 
-                                # Reconfigure transformation matrix based on which beam is invalid
+                                # Reconfigure transformation matrix based on
+                                # which beam is invalid
 
                                 # Beam 1 invalid
                                 if idx_3_beam[0][0] == beam_pair_1a:
@@ -562,19 +630,32 @@ class BoatData(object):
                                     # Double valid beam in invalid pair
                                     t_mult[0:2, beam_pair_1b] *= 2
 
-                                    # Eliminate invalid pair from vertical velocity computations
-                                    t_mult[2, :] = [0, 0, 1/sos_correction, 1/sos_correction]
-
-                                    # Reconstruct beam velocity matrix to use only valid beams
-                                    t_mult = t_mult[0:3, [beam_pair_1b, beam_pair_2a, beam_pair_2b]]
-
-                                    # Reconstruct beam velocity matrix to use only valid beams
-                                    vel = vel[[beam_pair_1b, beam_pair_2a, beam_pair_2b]]
+                                    # Eliminate invalid pair from vertical
+                                    # velocity computations
+                                    t_mult[2, :] = [
+                                        0,
+                                        0,
+                                        1 / sos_correction,
+                                        1 / sos_correction,
+                                    ]
+
+                                    # Reconstruct beam velocity matrix to use
+                                    # only valid beams
+                                    t_mult = t_mult[
+                                        0:3, [beam_pair_1b, beam_pair_2a, beam_pair_2b]
+                                    ]
+
+                                    # Reconstruct beam velocity matrix to
+                                    # use only valid beams
+                                    vel = vel[
+                                        [beam_pair_1b, beam_pair_2a, beam_pair_2b]
+                                    ]
 
                                     # Apply transformation matrix
                                     temp_t = t_mult.dot(vel)
 
-                                    # Correct horizontal velocity for invalid pair with the vertical velocity
+                                    # Correct horizontal velocity for invalid
+                                    # pair with the vertical velocity
                                     # and speed of sound correction
                                     temp_t[0] = temp_t[0] + temp_t[2] * sos_correction
 
@@ -582,21 +663,36 @@ class BoatData(object):
                                 if idx_3_beam[0][0] == beam_pair_1b:
 
                                     # Double valid beam in invalid pair
-                                    t_mult[0:2, beam_pair_1a] = t_mult[0:2, beam_pair_1a] * 2
-
-                                    # Eliminate invalid pair from vertical velocity computations
-                                    t_mult[2, :] = [0, 0, 1/sos_correction, 1/sos_correction]
-
-                                    # Reconstruct transformation matrix as a 3x3 matrix
-                                    t_mult = t_mult[0:3, [beam_pair_1a, beam_pair_2a, beam_pair_2b]]
-
-                                    # Reconstruct beam velocity matrix to use only valid beams
-                                    vel = vel[[beam_pair_1a, beam_pair_2a, beam_pair_2b]]
+                                    t_mult[0:2, beam_pair_1a] = (
+                                        t_mult[0:2, beam_pair_1a] * 2
+                                    )
+
+                                    # Eliminate invalid pair from vertical
+                                    # velocity computations
+                                    t_mult[2, :] = [
+                                        0,
+                                        0,
+                                        1 / sos_correction,
+                                        1 / sos_correction,
+                                    ]
+
+                                    # Reconstruct transformation matrix as a
+                                    # 3x3 matrix
+                                    t_mult = t_mult[
+                                        0:3, [beam_pair_1a, beam_pair_2a, beam_pair_2b]
+                                    ]
+
+                                    # Reconstruct beam velocity matrix to use
+                                    # only valid beams
+                                    vel = vel[
+                                        [beam_pair_1a, beam_pair_2a, beam_pair_2b]
+                                    ]
 
                                     # Apply transformation matrix
                                     temp_t = t_mult.dot(vel)
 
-                                    # Correct horizontal velocity for invalid pair with the vertical
+                                    # Correct horizontal velocity for invalid
+                                    # pair with the vertical
                                     # velocity and speed of sound correction
                                     temp_t[0] = temp_t[0] - temp_t[2] * sos_correction
 
@@ -604,21 +700,36 @@ class BoatData(object):
                                 if idx_3_beam[0][0] == beam_pair_2a:
 
                                     # Double valid beam in invalid pair
-                                    t_mult[0:2, beam_pair_2b] = t_mult[:2, beam_pair_2b] * 2
-
-                                    # Eliminate invalid pair from vertical velocity computations
-                                    t_mult[2, :] = [1/sos_correction, 1/sos_correction, 0, 0]
-
-                                    # Reconstruct transformation matrix as a 3x3 matrid
-                                    t_mult = t_mult[:3, [beam_pair_1a, beam_pair_1b, beam_pair_2b]]
-
-                                    # Reconstruct beam velocity matrix to use only valid beams
-                                    vel = vel[[beam_pair_1a, beam_pair_1b, beam_pair_2b]]
+                                    t_mult[0:2, beam_pair_2b] = (
+                                        t_mult[:2, beam_pair_2b] * 2
+                                    )
+
+                                    # Eliminate invalid pair from vertical
+                                    # velocity computations
+                                    t_mult[2, :] = [
+                                        1 / sos_correction,
+                                        1 / sos_correction,
+                                        0,
+                                        0,
+                                    ]
+
+                                    # Reconstruct transformation matrix as a
+                                    # 3x3 matrid
+                                    t_mult = t_mult[
+                                        :3, [beam_pair_1a, beam_pair_1b, beam_pair_2b]
+                                    ]
+
+                                    # Reconstruct beam velocity matrix to use
+                                    # only valid beams
+                                    vel = vel[
+                                        [beam_pair_1a, beam_pair_1b, beam_pair_2b]
+                                    ]
 
                                     # Apply transformation matrix
                                     temp_t = t_mult.dot(vel)
 
-                                    # Correct horizontal velocity for invalid pair with the vertical
+                                    # Correct horizontal velocity for invalid
+                                    # pair with the vertical
                                     # velocity and speed of sound correction
                                     temp_t[1] = temp_t[1] - temp_t[2] * sos_correction
 
@@ -628,19 +739,32 @@ class BoatData(object):
                                     # Double valid beam in invalid pair
                                     t_mult[:2, beam_pair_2a] *= 2
 
-                                    # Eliminate invalid pair from vertical velocity computations
-                                    t_mult[2, :] = [1/sos_correction, 1/sos_correction, 0, 0]
-
-                                    # Reconstruct transformations matrix as a 3x3 matrix
-                                    t_mult = t_mult[:3, [beam_pair_1a, beam_pair_1b, beam_pair_2a]]
-
-                                    # Reconstruct beam velocity matrix to use only valid beams
-                                    vel = vel[[beam_pair_1a, beam_pair_1b, beam_pair_2a]]
+                                    # Eliminate invalid pair from vertical
+                                    # velocity computations
+                                    t_mult[2, :] = [
+                                        1 / sos_correction,
+                                        1 / sos_correction,
+                                        0,
+                                        0,
+                                    ]
+
+                                    # Reconstruct transformations matrix as a
+                                    # 3x3 matrix
+                                    t_mult = t_mult[
+                                        :3, [beam_pair_1a, beam_pair_1b, beam_pair_2a]
+                                    ]
+
+                                    # Reconstruct beam velocity matrix to use
+                                    # only valid beams
+                                    vel = vel[
+                                        [beam_pair_1a, beam_pair_1b, beam_pair_2a]
+                                    ]
 
                                     # Apply transformation matrix
                                     temp_t = t_mult.dot(vel)
 
-                                    # Correct horizontal velocity for invalid pair with the vertical
+                                    # Correct horizontal velocity for invalid
+                                    # pair with the vertical
                                     # velocity and speed of sound correction
                                     temp_t[1] = temp_t[1] + temp_t[2] * sos_correction
 
@@ -650,7 +774,9 @@ class BoatData(object):
                                 vel_3_beam_zero = vel
                                 vel_3_beam_zero[np.isnan(vel)] = 0
                                 vel_error = np.matmul(t_mult[3, :], vel_3_beam_zero)
-                                vel[idx_3_beam] = -1 * vel_error / np.squeeze(t_mult[3, idx_3_beam])
+                                vel[idx_3_beam] = (
+                                    -1 * vel_error / np.squeeze(t_mult[3, idx_3_beam])
+                                )
                                 temp_t = t_mult.dot(vel)
 
                             # Apply transformation matrix for 3 beam solutions
@@ -671,7 +797,8 @@ class BoatData(object):
                         # Get velocity data
                         vel = np.copy(np.squeeze(self.raw_vel_mps[:, ii]))
 
-                        # Apply heading pitch roll for inst and ship coordinate data
+                        # Apply heading pitch roll for inst and ship
+                        # coordinate data
                         temp_thpr = np.array(hpr_matrix).dot(vel[:3])
                         temp_thpr = np.hstack([temp_thpr, vel[3]])
 
@@ -687,8 +814,8 @@ class BoatData(object):
                 self.v_processed_mps = np.copy(self.v_mps)
 
     def change_heading(self, heading_change):
-        """Rotates the boat velocities for a change in heading due to a change in
-        magnetic variation, heading offset, or heading source.
+        """Rotates the boat velocities for a change in heading due to a change
+        in magnetic variation, heading offset, or heading source.
 
         Parameters
         ----------
@@ -698,7 +825,9 @@ class BoatData(object):
 
         # Apply change to processed data
         direction, mag = cart2pol(self.u_processed_mps, self.v_processed_mps)
-        self.u_processed_mps, self.v_processed_mps = pol2cart(direction - np.deg2rad(heading_change), mag)
+        self.u_processed_mps, self.v_processed_mps = pol2cart(
+            direction - np.deg2rad(heading_change), mag
+        )
 
         # Apply change to unprocessed data
         direction, mag = cart2pol(self.u_mps, self.v_mps)
@@ -719,8 +848,8 @@ class BoatData(object):
         if self.u_mps is not None:
             self.u_processed_mps = np.copy(self.u_mps)
             self.v_processed_mps = np.copy(self.v_mps)
-            self.u_processed_mps[self.valid_data[0, :] == False] = np.nan
-            self.v_processed_mps[self.valid_data[0, :] == False] = np.nan
+            self.u_processed_mps[np.logical_not(self.valid_data[0, :])] = np.nan
+            self.v_processed_mps[np.logical_not(self.valid_data[0, :])] = np.nan
 
             # Determine interpolation methods to apply
             if interpolation_method is None:
@@ -730,33 +859,36 @@ class BoatData(object):
 
             # Apply specified interpolation method
 
-            if interpolation_method == 'None':
+            if interpolation_method == "None":
                 # Sets invalid data to nan with no interpolation
                 self.interpolate_none()
 
-            elif interpolation_method == 'ExpandedT':
-                # Set interpolate to none as the interpolation done is in the QComp
+            elif interpolation_method == "ExpandedT":
+                # Set interpolate to none as the interpolation done is in
+                # the QComp
                 self.interpolate_next()
 
-            elif interpolation_method == 'Hold9':
-                # Interpolates using SonTek method of holding last valid for up to 9 samples
+            elif interpolation_method == "Hold9":
+                # Interpolates using SonTek method of holding last valid
+                # for up to 9 samples
                 self.interpolate_hold_9()
 
-            elif interpolation_method == 'HoldLast':
+            elif interpolation_method == "HoldLast":
                 # Interpolates by holding last valid indefinitely
                 self.interpolate_hold_last()
 
-            elif interpolation_method == 'Linear':
+            elif interpolation_method == "Linear":
                 # Interpolates using linear interpolation
                 self.interpolate_linear(transect)
 
-            elif interpolation_method == 'Smooth':
+            elif interpolation_method == "Smooth":
                 # Interpolates using smooth interpolation
                 self.interpolate_smooth(transect)
 
-            elif interpolation_method == 'TRDI':
+            elif interpolation_method == "TRDI":
                 # TRDI interpolation is done in discharge.
-                # For TRDI the interpolation is done on discharge not on velocities
+                # For TRDI the interpolation is done on discharge not on
+                # velocities
                 self.interpolate_none()
 
     def apply_composite(self, u_composite, v_composite, composite_source):
@@ -768,17 +900,17 @@ class BoatData(object):
             Composite u-velocity component, in m/s
         v_composite: np.array(float)
             Composite v-velocity component, in m/s
-        composite_source: str
+        composite_source: np.array()
             Reference used for each ensemble velocity.
         """
 
         self.u_processed_mps = u_composite
         self.v_processed_mps = v_composite
-        self.processed_source[composite_source == 1] = 'BT'
-        self.processed_source[composite_source == 2] = 'GGA'
-        self.processed_source[composite_source == 3] = 'VTG'
-        self.processed_source[composite_source == 0] = 'INT'
-        self.processed_source[composite_source == -1] = 'INV'
+        self.processed_source[composite_source == 1] = "BT"
+        self.processed_source[composite_source == 2] = "GGA"
+        self.processed_source[composite_source == 3] = "VTG"
+        self.processed_source[composite_source == 0] = "INT"
+        self.processed_source[composite_source == -1] = "INV"
 
     def sos_correction(self, ratio):
         """Correct boat velocity for a change in speed of sound.
@@ -795,7 +927,8 @@ class BoatData(object):
         self.w_mps = self.w_mps * ratio
 
     def interpolate_hold_9(self):
-        """This function applies Sontek's approach to maintaining the last valid boat speed for up to 9 invalid samples.
+        """This function applies Sontek's approach to maintaining the last
+        valid boat speed for up to 9 invalid samples.
         """
 
         # Initialize variables
@@ -804,14 +937,15 @@ class BoatData(object):
         # Get data from object
         self.u_processed_mps = np.copy(self.u_mps)
         self.v_processed_mps = np.copy(self.v_mps)
-        self.u_processed_mps[self.valid_data[0, :] == False] = np.nan
-        self.v_processed_mps[self.valid_data[0, :] == False] = np.nan
+        self.u_processed_mps[np.logical_not(self.valid_data[0, :])] = np.nan
+        self.v_processed_mps[np.logical_not(self.valid_data[0, :])] = np.nan
 
         n_invalid = 0
         # Process data by ensembles
         for n in range(n_ensembles):
-            # Check if ensemble is invalid and number of consecutive invalids is less than 9
-            if self.valid_data[0, n] == False and n_invalid < 9:
+            # Check if ensemble is invalid and number of consecutive
+            # invalids is less than 9
+            if self.valid_data[0, n] is False and n_invalid < 9:
                 self.u_processed_mps[n] = self.u_processed_mps[n - 1]
                 self.v_processed_mps[n] = self.v_processed_mps[n - 1]
                 n_invalid += 1
@@ -819,16 +953,18 @@ class BoatData(object):
                 n_invalid = 0
 
     def interpolate_none(self):
-        """This function removes any interpolation from the data and sets filtered data to nan."""
+        """This function removes any interpolation from the data and sets
+        filtered data to nan."""
 
         # Reset processed data
         self.u_processed_mps = np.copy(self.u_mps)
         self.v_processed_mps = np.copy(self.v_mps)
-        self.u_processed_mps[self.valid_data[0, :] == False] = np.nan
-        self.v_processed_mps[self.valid_data[0, :] == False] = np.nan
+        self.u_processed_mps[np.logical_not(self.valid_data[0, :])] = np.nan
+        self.v_processed_mps[np.logical_not(self.valid_data[0, :])] = np.nan
 
     def interpolate_hold_last(self):
-        """This function holds the last valid value until the next valid data point."""
+        """This function holds the last valid value until the next valid data
+        point."""
 
         if self.u_mps is not None:
             # Initialize variables
@@ -837,14 +973,15 @@ class BoatData(object):
             # Get data from object
             self.u_processed_mps = np.copy(self.u_mps)
             self.v_processed_mps = np.copy(self.v_mps)
-            self.u_processed_mps[self.valid_data[0, :] == False] = np.nan
-            self.v_processed_mps[self.valid_data[0, :] == False] = np.nan
+            self.u_processed_mps[np.logical_not(self.valid_data[0, :])] = np.nan
+            self.v_processed_mps[np.logical_not(self.valid_data[0, :])] = np.nan
 
             n_invalid = 0
             # Process data by ensembles
             for n in range(1, n_ensembles):
-                # Check if ensemble is invalid and number of consecutive invalids is less than 9
-                if (self.valid_data[0, n] == False) and (n_invalid < 9):
+                # Check if ensemble is invalid and number of consecutive
+                # invalids is less than 9
+                if (self.valid_data[0, n] is False) and (n_invalid < 9):
                     self.u_processed_mps[n] = self.u_processed_mps[n - 1]
                     self.v_processed_mps[n] = self.v_processed_mps[n - 1]
 
@@ -857,13 +994,14 @@ class BoatData(object):
         # Process ensembles
         n_ens = len(valid_ens)
 
-        for n in np.arange(0, n_ens-1)[::-1]:
+        for n in np.arange(0, n_ens - 1)[::-1]:
             if not valid_ens[n]:
-                self.u_processed_mps[n] = self.u_processed_mps[n+1]
-                self.v_processed_mps[n] = self.v_processed_mps[n+1]
+                self.u_processed_mps[n] = self.u_processed_mps[n + 1]
+                self.v_processed_mps[n] = self.v_processed_mps[n + 1]
 
     def interpolate_smooth(self, transect):
-        """This function interpolates data flagged invalid using the smooth function.
+        """This function interpolates data flagged invalid using the smooth
+        function.
 
         Parameters
         ----------
@@ -872,11 +1010,10 @@ class BoatData(object):
         """
 
         # Get data from object
-
         u = np.copy(self.u_mps)
         v = np.copy(self.v_mps)
-        u[self.valid_data[0, :] == False] = np.nan
-        v[self.valid_data[0, :] == False] = np.nan
+        u[np.logical_not(self.valid_data[0, :])] = np.nan
+        v[np.logical_not(self.valid_data[0, :])] = np.nan
 
         # Compute ens_time
         ens_time = np.nancumsum(transect.date_time.ens_duration_sec)
@@ -892,7 +1029,8 @@ class BoatData(object):
         self.v_processed_mps[np.isnan(v)] = v_smooth[np.isnan(v)]
 
     def interpolate_linear(self, transect):
-        """This function interpolates data flagged invalid using linear interpolation.
+        """This function interpolates data flagged invalid using linear
+        interpolation.
 
         Parameters
         ----------
@@ -903,7 +1041,7 @@ class BoatData(object):
         u = np.copy(self.u_mps)
         v = np.copy(self.v_mps)
 
-        valid = np.isnan(u) == False
+        valid = np.logical_not(np.isnan(u))
 
         # Check for valid data
         if sum(valid) > 1 and sum(self.valid_data[0, :]) > 1:
@@ -912,20 +1050,25 @@ class BoatData(object):
             ens_time = np.nancumsum(transect.date_time.ens_duration_sec)
 
             # Apply linear interpolation
-            self.u_processed_mps = np.interp(x=ens_time,
-                                             xp=ens_time[self.valid_data[0, :]],
-                                             fp=u[self.valid_data[0, :]],
-                                             left=np.nan,
-                                             right=np.nan)
+            self.u_processed_mps = np.interp(
+                x=ens_time,
+                xp=ens_time[self.valid_data[0, :]],
+                fp=u[self.valid_data[0, :]],
+                left=np.nan,
+                right=np.nan,
+            )
             # Apply linear interpolation
-            self.v_processed_mps = np.interp(x=ens_time,
-                                             xp=ens_time[self.valid_data[0, :]],
-                                             fp=v[self.valid_data[0, :]],
-                                             left=np.nan,
-                                             right=np.nan)
+            self.v_processed_mps = np.interp(
+                x=ens_time,
+                xp=ens_time[self.valid_data[0, :]],
+                fp=v[self.valid_data[0, :]],
+                left=np.nan,
+                right=np.nan,
+            )
 
     def interpolate_composite(self, transect):
-        """This function interpolates processed data flagged invalid using linear interpolation.
+        """This function interpolates processed data flagged invalid using
+        linear interpolation.
 
         Parameters
         ----------
@@ -936,7 +1079,7 @@ class BoatData(object):
         u = np.copy(self.u_processed_mps)
         v = np.copy(self.v_processed_mps)
 
-        valid = np.isnan(u) == False
+        valid = np.logical_not(np.isnan(u))
 
         # Check for valid data
         if np.sum(valid) > 1:
@@ -948,23 +1091,32 @@ class BoatData(object):
             diff_time = np.diff(ens_time[valid])
             idx = np.where(diff_time == 0)[0]
             mono_array = np.vstack([ens_time[valid], u[valid], v[valid]])
+
             # Replace non-monotonic times with average values
             for i in idx[::-1]:
-                mono_array[1, i] = np.nanmean(mono_array[1, i:i+2])
-                mono_array[2, i] = np.nanmean(mono_array[2, i:i + 2])
-                mono_array = np.delete(mono_array, i+1, 1)
-            # Apply linear interpolation
+                mono_array[1, i] = np.nanmean(mono_array[1, i : i + 2])
+                mono_array[2, i] = np.nanmean(mono_array[2, i : i + 2])
+                mono_array = np.delete(mono_array, i + 1, 1)
+
             # Apply linear interpolation
-            self.u_processed_mps = np.interp(ens_time,
-                                             mono_array[0, :],
-                                             mono_array[1, :])
+            self.u_processed_mps = np.interp(
+                ens_time, mono_array[0, :], mono_array[1, :]
+            )
             # Apply linear interpolation
-            self.v_processed_mps = np.interp(ens_time,
-                                             mono_array[0, :],
-                                             mono_array[2, :])
-
-    def apply_filter(self, transect, beam=None, difference=None, difference_threshold=None, vertical=None,
-                     vertical_threshold=None, other=None):
+            self.v_processed_mps = np.interp(
+                ens_time, mono_array[0, :], mono_array[2, :]
+            )
+
+    def apply_filter(
+        self,
+        transect,
+        beam=None,
+        difference=None,
+        difference_threshold=None,
+        vertical=None,
+        vertical_threshold=None,
+        other=None,
+    ):
         """Function to apply filters to navigation data.
 
         More than one filter can be applied during a single call.
@@ -987,7 +1139,19 @@ class BoatData(object):
             Setting to other filter
         """
 
-        if len({beam, difference, difference_threshold, vertical, vertical_threshold, other}) > 1:
+        if (
+            len(
+                {
+                    beam,
+                    difference,
+                    difference_threshold,
+                    vertical,
+                    vertical_threshold,
+                    other,
+                }
+            )
+            > 1
+        ):
 
             # Filter based on number of valid beams
             if beam is not None:
@@ -995,14 +1159,16 @@ class BoatData(object):
 
             # Filter based on difference velocity
             if difference is not None:
-                if difference == 'Manual':
-                    self.filter_diff_vel(setting=difference, threshold=difference_threshold)
+                if difference == "Manual":
+                    self.filter_diff_vel(
+                        setting=difference, threshold=difference_threshold
+                    )
                 else:
                     self.filter_diff_vel(setting=difference)
 
             # Filter based on vertical velocity
             if vertical is not None:
-                if vertical == 'Manual':
+                if vertical == "Manual":
                     self.filter_vert_vel(setting=vertical, threshold=vertical_threshold)
                 else:
                     self.filter_vert_vel(setting=vertical)
@@ -1013,8 +1179,12 @@ class BoatData(object):
 
         else:
             self.filter_beam(setting=self.beam_filter)
-            self.filter_diff_vel(setting=self.d_filter, threshold=self.d_filter_thresholds)
-            self.filter_vert_vel(setting=self.w_filter, threshold=self.w_filter_thresholds)
+            self.filter_diff_vel(
+                setting=self.d_filter, threshold=self.d_filter_thresholds
+            )
+            self.filter_vert_vel(
+                setting=self.w_filter, threshold=self.w_filter_thresholds
+            )
             self.filter_smooth(setting=self.smooth_filter, transect=transect)
 
         # Apply previously specified interpolation method
@@ -1045,7 +1215,8 @@ class BoatData(object):
 
         self.beam_filter = setting
 
-        # In manual mode determine number of raw invalid and number of 3 beam solutions
+        # In manual mode determine number of raw invalid and number of 3
+        # beam solutions
         # 3 beam solutions if selected
         if self.beam_filter > 0:
 
@@ -1071,9 +1242,11 @@ class BoatData(object):
             self.filter_beam(3)
             beam_3_valid_data = copy.deepcopy(self.valid_data)
             self.filter_beam(4)
-            valid_3_beams = np.logical_xor(beam_3_valid_data[5, :], self.valid_data[5, :])
+            valid_3_beams = np.logical_xor(
+                beam_3_valid_data[5, :], self.valid_data[5, :]
+            )
             n_ens = len(self.valid_data[5, :])
-            idx = np.where(valid_3_beams == True)[0]
+            idx = np.where(valid_3_beams)[0]
 
             # If 3 beam solutions exist evaluate there validity
             if len(idx) > 0:
@@ -1090,28 +1263,33 @@ class BoatData(object):
 
                         # Find nearest 4 beam solutions before and after
                         # 3 beam solution
-                        ref_idx_before = np.where(self.valid_data[5, :idx[m]] == True)[0]
+                        ref_idx_before = np.where(self.valid_data[5, : idx[m]])[0]
                         if len(ref_idx_before) > 0:
                             ref_idx_before = ref_idx_before[-1]
                         else:
                             ref_idx_before = None
 
-                        ref_idx_after = np.where(self.valid_data[5, idx[m]:] == True)[0]
+                        ref_idx_after = np.where(self.valid_data[5, idx[m] :])[0]
                         if len(ref_idx_after) > 0:
                             ref_idx_after = idx[m] + ref_idx_after[0]
                         else:
                             ref_idx_after = None
 
                         if (ref_idx_after is not None) and (ref_idx_before is not None):
-                            u_ratio = (self.u_mps[idx[m]]) / ((self.u_mps[ref_idx_before]
-                                                               + self.u_mps[ref_idx_after]) / 2.) - 1
-                            v_ratio = (self.v_mps[idx[m]]) / ((self.v_mps[ref_idx_before]
-                                                               + self.v_mps[ref_idx_after]) / 2.) - 1
+                            u_ratio = (self.u_mps[idx[m]]) / (
+                                (self.u_mps[ref_idx_before] + self.u_mps[ref_idx_after])
+                                / 2.0
+                            ) - 1
+                            v_ratio = (self.v_mps[idx[m]]) / (
+                                (self.v_mps[ref_idx_before] + self.v_mps[ref_idx_after])
+                                / 2.0
+                            ) - 1
                         else:
                             u_ratio = 1
                             v_ratio = 1
 
-                        # If 3-beam differs from 4-beam by more than 50% mark it invalid
+                        # If 3-beam differs from 4-beam by more than 50% mark
+                        # it invalid
                         if (np.abs(u_ratio) > 0.5) and (np.abs(v_ratio) > 0.5):
                             self.valid_data[5, idx[m]] = False
                         else:
@@ -1121,7 +1299,7 @@ class BoatData(object):
 
         # Combine all filter data to composite valid data
         self.valid_data[0, :] = np.all(self.valid_data[1:, :], 0)
-        self.num_invalid = np.sum(self.valid_data[0, :] == False)
+        self.num_invalid = np.sum(np.logical_not(self.valid_data[0, :]))
 
     def filter_diff_vel(self, setting, threshold=None):
         """Applies either manual or automatic filtering of the difference
@@ -1132,47 +1310,62 @@ class BoatData(object):
         should follow a gaussian distribution. Therefore, 5 iqr
         should encompass all of the valid data. The standard deviation and
         limits (multiplier*standard deviation) are computed in an iterative
-        process until filtering out additional data does not change the computed
-        standard deviation.
+        process until filtering out additional data does not change the
+        computed standard deviation.
 
         Parameters
         ----------
         setting: str
             Difference velocity setting (Off, Manual, Auto)
-        threshold: float
+        threshold: float, dict
             If manual, the user specified threshold
         """
 
         self.d_filter = setting
-        if setting == 'Manual':
+        if setting == "Manual":
             self.d_filter_thresholds = threshold
 
         # Apply selected method
-        if self.d_filter == 'Manual':
+        if self.d_filter == "Manual":
             d_vel_max_ref = np.abs(self.d_filter_thresholds)
             d_vel_min_ref = -1 * d_vel_max_ref
-            invalid_idx = np.where(np.logical_or(nan_greater(self.d_mps, d_vel_max_ref),
-                                                 nan_less(self.d_mps, d_vel_min_ref)))[0]
-        elif self.d_filter == 'Off':
+            invalid_idx = np.where(
+                np.logical_or(
+                    nan_greater(self.d_mps, d_vel_max_ref),
+                    nan_less(self.d_mps, d_vel_min_ref),
+                )
+            )[0]
+        elif self.d_filter == "Off":
             invalid_idx = np.array([])
 
-        elif self.d_filter == 'Auto':
+        elif self.d_filter == "Auto":
             if self.use_measurement_thresholds:
-                freq_ensembles = self.frequency_khz.astype(int).astype(str)
+                if self.ping_type is None:
+                    freq_ensembles = self.frequency_khz.astype(int).astype(str)
+                else:
+                    freq_ensembles = self.ping_type
                 invalid_idx = np.array([])
                 for freq in self.d_meas_thresholds.keys():
                     filter_data = np.copy(self.d_mps)
                     filter_data[freq_ensembles != freq] = np.nan
-                    idx = np.where(np.logical_or(np.greater(filter_data, self.d_meas_thresholds[freq][0]),
-                                                 np.less(filter_data, self.d_meas_thresholds[freq][1])))[0]
+                    idx = np.where(
+                        np.logical_or(
+                            np.greater(filter_data, self.d_meas_thresholds[freq][0]),
+                            np.less(filter_data, self.d_meas_thresholds[freq][1]),
+                        )
+                    )[0]
                     if idx.size > 0:
                         if invalid_idx.size > 0:
                             invalid_idx = np.hstack((invalid_idx, idx))
                         else:
                             invalid_idx = idx
             else:
-                freq_used = np.unique(self.frequency_khz).astype(int).astype(str)
-                freq_ensembles = self.frequency_khz.astype(int).astype(str)
+                if self.ping_type is None:
+                    freq_used = np.unique(self.frequency_khz).astype(int).astype(str)
+                    freq_ensembles = self.frequency_khz.astype(int).astype(str)
+                else:
+                    freq_used = np.unique(self.ping_type)
+                    freq_ensembles = self.ping_type
                 self.d_filter_thresholds = {}
                 invalid_idx = np.array([])
                 for freq in freq_used:
@@ -1180,8 +1373,12 @@ class BoatData(object):
                     filter_data[freq_ensembles != freq] = np.nan
                     d_vel_max_ref, d_vel_min_ref = self.iqr_filter(filter_data)
                     self.d_filter_thresholds[freq] = [d_vel_max_ref, d_vel_min_ref]
-                    idx = np.where(np.logical_or(nan_greater(filter_data, d_vel_max_ref),
-                                                 nan_less(filter_data, d_vel_min_ref)))[0]
+                    idx = np.where(
+                        np.logical_or(
+                            nan_greater(filter_data, d_vel_max_ref),
+                            nan_less(filter_data, d_vel_min_ref),
+                        )
+                    )[0]
                     if idx.size > 0:
                         if invalid_idx.size > 0:
                             invalid_idx = np.hstack((invalid_idx, idx))
@@ -1197,7 +1394,7 @@ class BoatData(object):
 
         # Combine all filter data to composite filter data
         self.valid_data[0, :] = np.all(self.valid_data[1:, :], 0)
-        self.num_invalid = np.sum(self.valid_data[0, :] == False)
+        self.num_invalid = np.sum(np.logical_not(self.valid_data[0, :]))
 
     def filter_vert_vel(self, setting, threshold=None):
         """Applies either manual or automatic filtering of the vertical
@@ -1207,42 +1404,57 @@ class BoatData(object):
         ----------
         setting: str
             Filter setting (Off, Manual, Auto)
-        threshold: float
+        threshold: float, dict
             If setting is manual, the user specified threshold
         """
 
         # Set vertical velocity filter properties
         self.w_filter = setting
-        if setting == 'Manual':
+        if setting == "Manual":
             self.w_filter_thresholds = threshold
 
         # Apply selected method
-        if self.w_filter == 'Manual':
+        if self.w_filter == "Manual":
             w_vel_max_ref = np.abs(self.w_filter_thresholds)
             w_vel_min_ref = -1 * w_vel_max_ref
-            invalid_idx = np.where(np.logical_or(nan_greater(self.w_mps, w_vel_max_ref),
-                                                 nan_less(self.w_mps, w_vel_min_ref)))[0]
-
-        elif self.w_filter == 'Off':
+            invalid_idx = np.where(
+                np.logical_or(
+                    nan_greater(self.w_mps, w_vel_max_ref),
+                    nan_less(self.w_mps, w_vel_min_ref),
+                )
+            )[0]
+
+        elif self.w_filter == "Off":
             invalid_idx = np.array([])
 
-        elif self.w_filter == 'Auto':
+        elif self.w_filter == "Auto":
             if self.use_measurement_thresholds:
-                freq_ensembles = self.frequency_khz.astype(int).astype(str)
+                if self.ping_type is None:
+                    freq_ensembles = self.frequency_khz.astype(int).astype(str)
+                else:
+                    freq_ensembles = self.ping_type
                 invalid_idx = np.array([])
                 for freq in self.w_meas_thresholds.keys():
                     filter_data = np.copy(self.w_mps.astype(float))
                     filter_data[freq_ensembles != freq] = np.nan
-                    idx = np.where(np.logical_or(np.greater(filter_data, self.w_meas_thresholds[freq][0]),
-                                                 np.less(filter_data, self.w_meas_thresholds[freq][1])))[0]
+                    idx = np.where(
+                        np.logical_or(
+                            np.greater(filter_data, self.w_meas_thresholds[freq][0]),
+                            np.less(filter_data, self.w_meas_thresholds[freq][1]),
+                        )
+                    )[0]
                     if idx.size > 0:
                         if invalid_idx.size > 0:
                             invalid_idx = np.hstack((invalid_idx, idx))
                         else:
                             invalid_idx = idx
             else:
-                freq_used = np.unique(self.frequency_khz).astype(int).astype(str)
-                freq_ensembles = self.frequency_khz.astype(int).astype(str)
+                if self.ping_type is None:
+                    freq_used = np.unique(self.frequency_khz).astype(int).astype(str)
+                    freq_ensembles = self.frequency_khz.astype(int).astype(str)
+                else:
+                    freq_used = np.unique(self.ping_type)
+                    freq_ensembles = self.ping_type
                 self.w_filter_thresholds = {}
                 invalid_idx = np.array([])
                 for freq in freq_used:
@@ -1250,8 +1462,12 @@ class BoatData(object):
                     filter_data[freq_ensembles != freq] = np.nan
                     w_vel_max_ref, w_vel_min_ref = self.iqr_filter(filter_data)
                     self.w_filter_thresholds[freq] = [w_vel_max_ref, w_vel_min_ref]
-                    idx = np.where(np.logical_or(nan_greater(filter_data, w_vel_max_ref),
-                                                 nan_less(filter_data, w_vel_min_ref)))[0]
+                    idx = np.where(
+                        np.logical_or(
+                            nan_greater(filter_data, w_vel_max_ref),
+                            nan_less(filter_data, w_vel_min_ref),
+                        )
+                    )[0]
                     if idx.size > 0:
                         if invalid_idx.size > 0:
                             invalid_idx = np.hstack((invalid_idx, idx))
@@ -1267,10 +1483,10 @@ class BoatData(object):
 
         # Combine all filter data to composite valid data
         self.valid_data[0, :] = np.all(self.valid_data[1:, :], 0)
-        self.num_invalid = np.sum(self.valid_data[0, :] == False)
+        self.num_invalid = np.sum(np.logical_not(self.valid_data[0, :]))
 
     @staticmethod
-    def iqr_filter(data, multiplier=5,  minimum_window = 0.01):
+    def iqr_filter(data, multiplier=5, minimum_window=0.01):
         """Apply the iqr filter to bt data.
 
         Parameters
@@ -1298,7 +1514,6 @@ class BoatData(object):
             k = 0
             iqr_diff = 1
 
-
             # Loop until no additional data are removed
             while iqr_diff != 0 and k < 1000:
                 k += 1
@@ -1336,9 +1551,10 @@ class BoatData(object):
 
         First a robust Loess smooth is fitted to the boat speed time series and
         residuals between the raw data and the smoothed line are computed. The
-        trimmed standard deviation is computed by selecting the number of residuals
-        specified by "halfwidth" before the target point and after the target point,
-        but not including the target point. These values are then sorted, and the points
+        trimmed standard deviation is computed by selecting the number of
+        residuals specified by "halfwidth" before the target point and
+        after the target point,  but not including the target point.
+        These values are then sorted, and the points
         with the highest and lowest values are removed from the subset, and the
         standard deviation of the trimmed subset is computed. The filter
         criteria are determined by multiplying the standard deviation by a user
@@ -1367,8 +1583,9 @@ class BoatData(object):
         # Compute ens_time
         ens_time = np.nancumsum(transect.date_time.ens_duration_sec)
         n_ensembles = len(ens_time)
+
         # Determine if smooth filter should be applied
-        if self.smooth_filter == 'On':
+        if self.smooth_filter == "On":
             # Initialize arrays
             self.smooth_speed = repmat([np.nan], 1, n_ensembles)
             self.smooth_upper_limit = repmat([np.nan], 1, n_ensembles)
@@ -1405,13 +1622,17 @@ class BoatData(object):
                 lower_limit = speed_smooth - multiplier * filter_array
 
                 # Apply filter to residuals
-                bt_bad_idx = np.where(np.logical_or(np.greater(speed, upper_limit), np.less(speed, lower_limit)))[0]
+                bt_bad_idx = np.where(
+                    np.logical_or(
+                        np.greater(speed, upper_limit), np.less(speed, lower_limit)
+                    )
+                )[0]
                 speed_res[bt_bad_idx] = np.nan
 
             # Update valid_data property
             self.valid_data[4, :] = True
             self.valid_data[4, bt_bad_idx] = False
-            self.valid_data[4, self.valid_data[1, :] == False] = True
+            self.valid_data[4, np.logical_not(self.valid_data[1, :])] = True
             self.smooth_upper_limit = upper_limit
             self.smooth_lower_limit = lower_limit
             self.smooth_speed = speed_smooth
@@ -1425,11 +1646,25 @@ class BoatData(object):
             self.smooth_speed = np.nan
 
         # Combine all filter data to composite valid data
-        self.valid_data[0, :] = np.all(self.valid_data[1:, ], 0)
-        self.num_invalid = np.sum(self.valid_data[0, :] == False, 0)
-
-    def apply_gps_filter(self, transect, differential=None, altitude=None, altitude_threshold=None,
-                         hdop=None, hdop_max_threshold=None, hdop_change_threshold=None, other=None):
+        self.valid_data[0, :] = np.all(
+            self.valid_data[
+                1:,
+            ],
+            0,
+        )
+        self.num_invalid = np.sum(np.logical_not(self.valid_data[0, :]), 0)
+
+    def apply_gps_filter(
+        self,
+        transect,
+        differential=None,
+        altitude=None,
+        altitude_threshold=None,
+        hdop=None,
+        hdop_max_threshold=None,
+        hdop_change_threshold=None,
+        other=None,
+    ):
         """Applies filters to GPS referenced boat velocity data.
 
         Parameters
@@ -1452,26 +1687,49 @@ class BoatData(object):
             Other filter typically a smooth.
         """
 
-        if len({differential, altitude, altitude_threshold, hdop,
-                hdop_max_threshold, hdop_change_threshold, other}) > 0:
-            # Differential filter only applies to GGA data, defaults to 1 for VTG
+        if (
+            len(
+                {
+                    differential,
+                    altitude,
+                    altitude_threshold,
+                    hdop,
+                    hdop_max_threshold,
+                    hdop_change_threshold,
+                    other,
+                }
+            )
+            > 0
+        ):
+            # Differential filter only applies to GGA data, defaults to 1
+            # for VTG
             if differential is not None:
-                if self.nav_ref == 'GGA':
-                    self.filter_diff_qual(gps_data=transect.gps, setting=int(differential))
+                if self.nav_ref == "GGA":
+                    self.filter_diff_qual(
+                        gps_data=transect.gps, setting=int(differential)
+                    )
                 else:
                     self.filter_diff_qual(gps_data=transect.gps, setting=1)
 
             # Altitude filter only applies to GGA data
             if altitude is not None:
-                if (altitude == 'Manual') and (self.nav_ref == 'GGA'):
-                    self.filter_altitude(gps_data=transect.gps, setting=altitude, threshold=altitude_threshold)
-                elif self.nav_ref == 'GGA':
+                if (altitude == "Manual") and (self.nav_ref == "GGA"):
+                    self.filter_altitude(
+                        gps_data=transect.gps,
+                        setting=altitude,
+                        threshold=altitude_threshold,
+                    )
+                elif self.nav_ref == "GGA":
                     self.filter_altitude(gps_data=transect.gps, setting=altitude)
 
             if hdop is not None:
-                if hdop == 'Manual':
-                    self.filter_hdop(gps_data=transect.gps, setting=hdop, max_threshold=hdop_max_threshold,
-                                     change_threshold=hdop_change_threshold)
+                if hdop == "Manual":
+                    self.filter_hdop(
+                        gps_data=transect.gps,
+                        setting=hdop,
+                        max_threshold=hdop_max_threshold,
+                        change_threshold=hdop_change_threshold,
+                    )
                 else:
                     self.filter_hdop(gps_data=transect.gps, setting=hdop)
 
@@ -1487,7 +1745,8 @@ class BoatData(object):
         self.apply_interpolation(transect=transect)
 
     def filter_diff_qual(self, gps_data, setting=None):
-        """Filters GPS data based on the minimum acceptable differential correction quality.
+        """Filters GPS data based on the minimum acceptable differential
+        correction quality.
 
         Parameters
         ----------
@@ -1520,14 +1779,14 @@ class BoatData(object):
                     self.valid_data[2, gps_data.diff_qual_ens < 4] = False
 
                 # If there is no indication of the quality assume 1 fot vtg
-                if self.nav_ref == 'VTG':
+                if self.nav_ref == "VTG":
                     self.valid_data[2, np.isnan(gps_data.diff_qual_ens)] = True
             else:
                 self.valid_data[2, :] = False
 
         # Combine all filter data to composite valid data
         self.valid_data[0, :] = np.all(self.valid_data[1:, :], 0)
-        self.num_invalid = np.sum(self.valid_data[0, :] == False)
+        self.num_invalid = np.sum(np.logical_not(self.valid_data[0, :]))
 
     def filter_altitude(self, gps_data, setting=None, threshold=None):
         """Filter GPS data based on a change in altitude.
@@ -1551,19 +1810,18 @@ class BoatData(object):
         # New filter settings if provided
         if setting is not None:
             self.gps_altitude_filter = setting
-            if setting == 'Manual':
+            if setting == "Manual":
                 self.gps_altitude_filter_change = threshold
 
         # Set threshold for Auto
-        if self.gps_altitude_filter == 'Auto':
+        if self.gps_altitude_filter == "Auto":
             self.gps_altitude_filter_change = 3
 
         # Set all data to valid
         self.valid_data[3, :] = True
-        # self.valid_data[5, :] = True
 
         # Manual or Auto is selected, apply filter
-        if not self.gps_altitude_filter == 'Off':
+        if not self.gps_altitude_filter == "Off":
             # Initialize variables
             num_valid_old = np.sum(self.valid_data[3, :])
             k = 0
@@ -1572,17 +1830,20 @@ class BoatData(object):
             while k < 100 and change > 0.1:
                 # Compute mean using valid ensembles
                 if self.valid_data.shape[1] == 1:
-                    if self.valid_data[1,0]:
+                    if self.valid_data[1, 0]:
                         alt_mean = gps_data.altitude_ens_m
                     else:
                         alt_mean = np.nan
                 else:
-                    alt_mean = np.nanmean(gps_data.altitude_ens_m[self.valid_data[1, :]])
+                    alt_mean = np.nanmean(
+                        gps_data.altitude_ens_m[self.valid_data[1, :]]
+                    )
 
                 # Compute difference for each ensemble
                 diff = np.abs(gps_data.altitude_ens_m - alt_mean)
 
-                # Mark invalid those ensembles with differences greater than the change threshold
+                # Mark invalid those ensembles with differences greater than
+                # the change threshold
                 self.valid_data[3, diff > self.gps_altitude_filter_change] = False
                 k += 1
                 num_valid = np.sum(self.valid_data[3, :])
@@ -1590,9 +1851,11 @@ class BoatData(object):
 
         # Combine all filter data to composite valid data
         self.valid_data[0, :] = np.all(self.valid_data[1:, :], 0)
-        self.num_invalid = np.sum(self.valid_data[0, :] == False)
+        self.num_invalid = np.sum(np.logical_not(self.valid_data[0, :]))
 
-    def filter_hdop(self, gps_data, setting=None, max_threshold=None, change_threshold=None):
+    def filter_hdop(
+        self, gps_data, setting=None, max_threshold=None, change_threshold=None
+    ):
         """Filter GPS data based on both a maximum HDOP and a change in HDOP
         over the transect.
 
@@ -1609,17 +1872,17 @@ class BoatData(object):
         """
 
         if gps_data.hdop_ens is None or gps_data.hdop_ens.size == 0:
-            self.valid_data[5, :self.valid_data.shape[1]] = True
+            self.valid_data[5, : self.valid_data.shape[1]] = True
         else:
             # New settings if provided
             if setting is not None:
                 self.gps_HDOP_filter = setting
-                if self.gps_HDOP_filter == 'Manual':
+                if self.gps_HDOP_filter == "Manual":
                     self.gps_HDOP_filter_max = max_threshold
                     self.gps_HDOP_filter_change = change_threshold
 
             # Settings for auto mode
-            if self.gps_HDOP_filter == 'Auto':
+            if self.gps_HDOP_filter == "Auto":
                 self.gps_HDOP_filter_change = 3
                 self.gps_HDOP_filter_max = 4
 
@@ -1627,7 +1890,7 @@ class BoatData(object):
             self.valid_data[5, :] = True
 
             # Apply filter for manual or auto
-            if not self.gps_HDOP_filter == 'Off':
+            if not self.gps_HDOP_filter == "Off":
 
                 # Initialize variables
                 num_valid_old = np.sum(self.valid_data[5, :])
@@ -1635,7 +1898,9 @@ class BoatData(object):
                 change = 1
 
                 # Apply max filter
-                self.valid_data[5, np.greater(gps_data.hdop_ens, self.gps_HDOP_filter_max)] = False
+                self.valid_data[
+                    5, np.greater(gps_data.hdop_ens, self.gps_HDOP_filter_max)
+                ] = False
 
                 # Loop until the number of valid ensembles does not change
                 while k < 100 and change > 0.1:
@@ -1649,12 +1914,15 @@ class BoatData(object):
                     else:
                         hdop_mean = np.nanmean(gps_data.hdop_ens[self.valid_data[5, :]])
 
-                    # Compute the difference in HDOP and the mean for all ensembles
+                    # Compute the difference in HDOP and the mean for
+                    # all ensembles
                     diff = np.abs(gps_data.hdop_ens - hdop_mean)
 
                     # If the change is HDOP or the value of HDOP is greater
                     # than the threshold setting mark the data invalid
-                    self.valid_data[5, np.greater(diff, self.gps_HDOP_filter_change)] = False
+                    self.valid_data[
+                        5, np.greater(diff, self.gps_HDOP_filter_change)
+                    ] = False
 
                     k += 1
                     num_valid = np.sum(self.valid_data[5, :])
@@ -1663,13 +1931,14 @@ class BoatData(object):
 
         # Combine all filter data to composite data
         self.valid_data[0, :] = np.all(self.valid_data[1:, :], 0)
-        self.num_invalid = np.sum(self.valid_data[0, :] == False)
+        self.num_invalid = np.sum(np.logical_not(self.valid_data[0, :]))
 
     @staticmethod
     def filter_sontek(vel_in):
         """Determines invalid raw bottom track samples for SonTek data.
 
-        Invalid data are those that are zero or where the velocity doesn't change between ensembles.
+        Invalid data are those that are zero or where the velocity doesn't
+        change between ensembles.
 
         Parameters
         ----------
@@ -1679,7 +1948,8 @@ class BoatData(object):
         Returns
         -------
         vel_out: np.array(float)
-            Filtered bottom track velocity data with all invalid data set to np.nan.
+            Filtered bottom track velocity data with all invalid data set to
+            np.nan.
         """
 
         # Identify all samples where the velocity did not change
@@ -1687,7 +1957,9 @@ class BoatData(object):
 
         # Identify all samples with all zero values
         test2 = np.nansum(np.abs(vel_in), 0) < 0.00001
-        test2 = test2[1:] * 4  # using 1: makes the array dimension consistent with test1 as diff results in 1 less.
+        # using 1: makes the array dimension
+        # consistent with test1 as diff results in 1 less.
+        test2 = test2[1:] * 4
 
         # Combine criteria
         test_sum = np.sum(test1, 0) + test2
@@ -1695,6 +1967,7 @@ class BoatData(object):
         # Develop logical vector of invalid ensembles
         invalid_bool = np.full(test_sum.size, False)
         invalid_bool[test_sum > 3] = True
+
         # Handle first ensemble
         invalid_bool = np.concatenate((np.array([False]), invalid_bool), 0)
         if np.nansum(vel_in[:, 0]) == 0:
@@ -1710,14 +1983,16 @@ class BoatData(object):
     def run_std_trim(half_width, my_data):
         """Computes a standard deviation over +/- halfwidth of points.
 
-        The routine accepts a column vector as input. "halfWidth" number of data
+        The routine accepts a column vector as input.
+        "halfWidth" number of data
         points for computing the standard deviation are selected before and
         after the target data point, but not including the target data point.
         Near the ends of the series the number of points before or after are
         reduced. nan in the data are counted as points. The selected subset of
         points are sorted and the points with the highest and lowest values are
         removed from the subset and the standard deviation computed on the
-        remaining points in the subset. The process occurs for each point in the
+        remaining points in the subset.
+        The process occurs for each point in the
         provided column vector. A column vector with the computed standard
         deviation at each point is returned.
 
@@ -1738,7 +2013,7 @@ class BoatData(object):
         # Determine number of points to process
         n_pts = my_data.shape[0]
         if n_pts < 20:
-            half_width = np.floor(n_pts / 2.)
+            half_width = np.floor(n_pts / 2.0)
 
         filter_array = []
         # Compute standard deviation for each point
@@ -1746,22 +2021,26 @@ class BoatData(object):
 
             # Sample selection for 1st point
             if n == 0:
-                sample = my_data[1:1 + half_width]
+                sample = my_data[1 : 1 + half_width]
 
             # Sample selection at end of data set
             elif n + half_width > n_pts:
-                sample = np.hstack((my_data[n - half_width - 1:n - 1], my_data[n:n_pts]))
+                sample = np.hstack(
+                    (my_data[n - half_width - 1 : n - 1], my_data[n:n_pts])
+                )
 
             # Sample selection at beginning of data set
             elif half_width >= n + 1:
-                sample = np.hstack((my_data[0:n], my_data[n + 1:n + half_width + 1]))
+                sample = np.hstack((my_data[0:n], my_data[n + 1 : n + half_width + 1]))
 
             # Samples selection in body of data set
             else:
-                sample = np.hstack((my_data[n - half_width:n], my_data[n + 1:n + half_width + 1]))
+                sample = np.hstack(
+                    (my_data[n - half_width : n], my_data[n + 1 : n + half_width + 1])
+                )
 
             # Sort and compute trummed standard deviation
             sample = np.sort(sample)
-            filter_array.append(np.nanstd(sample[1:sample.shape[0] - 1], ddof=1))
+            filter_array.append(np.nanstd(sample[1 : sample.shape[0] - 1], ddof=1))
 
         return np.array(filter_array)
diff --git a/qrevint_22_06_22/Classes/BoatStructure.py b/Classes/BoatStructure.py
similarity index 53%
rename from qrevint_22_06_22/Classes/BoatStructure.py
rename to Classes/BoatStructure.py
index f009c7b74aefdc84938dd8d0c22cbaadd309598a..d16022192bc35aa40347af331b24179270ca7969 100644
--- a/qrevint_22_06_22/Classes/BoatStructure.py
+++ b/Classes/BoatStructure.py
@@ -23,17 +23,29 @@ class BoatStructure(object):
 
     def __init__(self):
 
-        self.selected = None  # Name of BoatData object to be used for discharge computations
-        self.bt_vel = None  # BoatData object for bottom track velocity
-        self.gga_vel = None  # BoatData object for gga velocity
-        self.vtg_vel = None  # BoatData object for vtg velocity
+        self.selected = None
+        self.bt_vel = None
+        self.gga_vel = None
+        self.vtg_vel = None
 
-        # Composite track information is not currently provided by the manufacturers.
+        # Composite track information is not currently provided by the
+        # manufacturers.
         # Future versions may try to determine this setting from SonTek data
-        self.composite = 'Off'  # Setting for compositir tracks
-
-    def add_boat_object(self, source, vel_in, freq_in=None, coord_sys_in=None, nav_ref_in=None,
-                        min_beams=3, bottom_mode='Variable', corr_in=None, rssi_in=None):
+        self.composite = "Off"
+
+    def add_boat_object(
+        self,
+        source,
+        vel_in,
+        freq_in=None,
+        coord_sys_in=None,
+        nav_ref_in=None,
+        min_beams=3,
+        bottom_mode="Variable",
+        corr_in=None,
+        rssi_in=None,
+        ping_type=None,
+    ):
         """Adds a BoatData object to the appropriate property
 
         Parameters
@@ -49,24 +61,46 @@ class BoatStructure(object):
         nav_ref_in: str
             Source of boat velocity data
         min_beams: int
-            Setting to allow 3 beam solutions or require 4 beam solutions or set to Auto (-1)
+            Setting to allow 3 beam solutions or require 4 beam solutions or
+            set to Auto (-1)
         bottom_mode: str
             Bottom mode used
+        corr_in: np.array
+            Correlation values for bottom track
+        rssi_in: np.array
+            Returned signal strength for bottom track
+        ping_type: np.array
+            Indicates type of ping used for bottom tracking
         """
 
-        if nav_ref_in == 'BT':
+        if nav_ref_in == "BT":
             self.bt_vel = BoatData()
-            self.bt_vel.populate_data(source, vel_in, freq_in, coord_sys_in, nav_ref_in, min_beams, bottom_mode,
-                                      corr_in, rssi_in)
-        if nav_ref_in == 'GGA':
+            self.bt_vel.populate_data(
+                source,
+                vel_in,
+                freq_in,
+                coord_sys_in,
+                nav_ref_in,
+                min_beams,
+                bottom_mode,
+                corr_in,
+                rssi_in,
+                ping_type=ping_type,
+            )
+        if nav_ref_in == "GGA":
             self.gga_vel = BoatData()
-            self.gga_vel.populate_data(source, vel_in, freq_in, coord_sys_in, nav_ref_in)
-        if nav_ref_in == 'VTG':
+            self.gga_vel.populate_data(
+                source, vel_in, freq_in, coord_sys_in, nav_ref_in, ping_type=ping_type
+            )
+        if nav_ref_in == "VTG":
             self.vtg_vel = BoatData()
-            self.vtg_vel.populate_data(source, vel_in, freq_in, coord_sys_in, nav_ref_in)
+            self.vtg_vel.populate_data(
+                source, vel_in, freq_in, coord_sys_in, nav_ref_in, ping_type=ping_type
+            )
 
     def set_nav_reference(self, reference):
-        """This function will set the navigation reference property to the specified object reference.
+        """This function will set the navigation reference property to the
+        specified object reference.
 
         Parameters
         ----------
@@ -74,16 +108,16 @@ class BoatStructure(object):
             Navigation reference, BT, GGA, or VTG
         """
 
-        if reference == 'BT':
-            self.selected = 'bt_vel'
-        elif reference == 'GGA':
-            self.selected = 'gga_vel'
-        elif reference == 'VTG':
-            self.selected = 'vtg_vel'
+        if reference == "BT":
+            self.selected = "bt_vel"
+        elif reference == "GGA":
+            self.selected = "gga_vel"
+        elif reference == "VTG":
+            self.selected = "vtg_vel"
 
     def change_nav_reference(self, reference, transect):
-        """This function changes the navigation reference to the specified object reference and recomputes
-        the composite tracks, if necessary.
+        """This function changes the navigation reference to the specified
+        object reference and recomputes the composite tracks, if necessary.
 
         Parameters
         ----------
@@ -93,24 +127,25 @@ class BoatStructure(object):
             Object of TransectData.
         """
 
-        if reference == 'BT':
-            self.selected = 'bt_vel'
-        elif reference == 'GGA':
-            self.selected = 'gga_vel'
-        elif reference == 'VTG':
-            self.selected = 'vtg_vel'
-        elif reference == 'bt_vel':
-            self.selected = 'bt_vel'
-        elif reference == 'gga_vel':
-            self.selected = 'gga_vel'
-        elif reference == 'vtg_vel':
-            self.selected = 'vtg_vel'
+        if reference == "BT":
+            self.selected = "bt_vel"
+        elif reference == "GGA":
+            self.selected = "gga_vel"
+        elif reference == "VTG":
+            self.selected = "vtg_vel"
+        elif reference == "bt_vel":
+            self.selected = "bt_vel"
+        elif reference == "gga_vel":
+            self.selected = "gga_vel"
+        elif reference == "vtg_vel":
+            self.selected = "vtg_vel"
 
         self.composite_tracks(transect)
 
     def change_coord_sys(self, new_coord_sys, sensors, adcp):
-        """This function will change the coordinate system of the boat velocity reference.
-        
+        """This function will change the coordinate system of the boat
+        velocity reference.
+
         Parameters
         ----------
         new_coord_sys: str
@@ -130,8 +165,9 @@ class BoatStructure(object):
             self.vtg_vel.change_coord_sys(new_coord_sys, sensors, adcp)
 
     def composite_tracks(self, transect, setting=None):
-        """If new composite setting is provided it is used, if not the setting saved in the object is used
-        
+        """If new composite setting is provided it is used, if not the
+        setting saved in the object is used
+
         Parameters
         ----------
         transect: TransectData
@@ -147,7 +183,7 @@ class BoatStructure(object):
             self.composite = setting
 
         # Composite depths turned on
-        if setting == 'On':
+        if setting == "On":
             # Initialize variables
             u_bt = np.array([])
             v_bt = np.array([])
@@ -162,8 +198,8 @@ class BoatStructure(object):
                 v_bt = self.bt_vel.v_processed_mps
                 # Set to invalid all interpolated velocities
                 valid_bt = self.bt_vel.valid_data[0, :]
-                u_bt[valid_bt == False] = np.nan
-                v_bt[valid_bt == False] = np.nan
+                u_bt[np.logical_not(valid_bt)] = np.nan
+                v_bt[np.logical_not(valid_bt)] = np.nan
 
             # Prepare gga data
             if self.gga_vel is not None:
@@ -172,8 +208,8 @@ class BoatStructure(object):
                 v_gga = self.gga_vel.v_processed_mps
                 # Set to invalid all interpolated velocities
                 valid_gga = self.gga_vel.valid_data[0, :]
-                u_gga[valid_gga == False] = np.nan
-                v_gga[valid_gga == False] = np.nan
+                u_gga[np.logical_not(valid_gga)] = np.nan
+                v_gga[np.logical_not(valid_gga)] = np.nan
             elif self.bt_vel is not None:
                 u_gga = np.tile([np.nan], u_bt.shape)
                 v_gga = np.tile([np.nan], v_bt.shape)
@@ -185,128 +221,179 @@ class BoatStructure(object):
                 v_vtg = self.vtg_vel.v_processed_mps
                 # Set to invalid all interpolated velocities
                 valid_vtg = self.vtg_vel.valid_data[0, :]
-                u_vtg[valid_vtg == False] = np.nan
-                v_vtg[valid_vtg == False] = np.nan
+                u_vtg[np.logical_not(valid_vtg)] = np.nan
+                v_vtg[np.logical_not(valid_vtg)] = np.nan
             elif self.bt_vel is not None:
                 u_vtg = np.tile([np.nan], u_bt.shape)
                 v_vtg = np.tile([np.nan], v_bt.shape)
 
             # Process bt as primary
-            if self.selected == 'bt_vel':
+            if self.selected == "bt_vel":
                 # Initialize composite source
                 comp_source = np.tile(np.nan, u_bt.shape)
 
                 # Process u velocity component
                 u_comp = u_bt
-                comp_source[np.isnan(u_comp) == False] = 1
+                comp_source[np.logical_not(np.isnan(u_comp))] = 1
 
-                # If BT data are not valid try VTG and set composite source (BUG HERE DSM)
+                # If BT data are not valid try VTG and set composite source
                 u_comp[np.isnan(u_comp)] = u_vtg[np.isnan(u_comp)]
-                comp_source[np.logical_and(np.isnan(u_comp) == False, np.isnan(comp_source))] = 3
-
-                # If there are still invalid boat velocities, try GGA and set composite source
+                comp_source[
+                    np.logical_and(
+                        np.logical_not(np.isnan(u_comp)), np.isnan(comp_source)
+                    )
+                ] = 3
+
+                # If there are still invalid boat velocities, try GGA and
+                # set composite source
                 u_comp[np.isnan(u_comp)] = u_gga[np.isnan(u_comp)]
-                comp_source[np.logical_and(np.isnan(u_comp) == False, np.isnan(comp_source))] = 2
+                comp_source[
+                    np.logical_and(
+                        np.logical_not(np.isnan(u_comp)), np.isnan(comp_source)
+                    )
+                ] = 2
 
                 # If there are still invalid boat velocities, use interpolated
                 # values if present and set composite source
-                comp_source[np.logical_and(np.isnan(u_comp) == False, np.isnan(comp_source))] = 0
-
-                # Set composite source to invalid for all remaining invalid boat velocity data
+                comp_source[
+                    np.logical_and(
+                        np.logical_not(np.isnan(u_comp)), np.isnan(comp_source)
+                    )
+                ] = 0
+
+                # Set composite source to invalid for all remaining invalid
+                # boat velocity data
                 comp_source[np.isnan(comp_source)] = -1
 
-                # Process v velocity component.  Assume that the composite source is the same
-                # as the u component
+                # Process v velocity component.  Assume that the composite
+                # source is the same as the u component
                 v_comp = v_bt
                 v_comp[np.isnan(v_comp)] = v_vtg[np.isnan(v_comp)]
                 v_comp[np.isnan(v_comp)] = v_gga[np.isnan(v_comp)]
-                v_comp[np.isnan(v_comp)] = self.bt_vel.v_processed_mps[np.isnan(v_comp)]
 
-                # Apply the composite settings to the bottom track Boatdata objects
+                # Apply the composite settings to the bottom track Boatdata
+                # objects
                 self.bt_vel.apply_composite(u_comp, v_comp, comp_source)
                 self.bt_vel.interpolate_composite(transect)
 
             # Process gga as primary
-            elif self.selected == 'gga_vel':
+            elif self.selected == "gga_vel":
                 # Initialize the composite source
                 comp_source = np.tile([np.nan], u_bt.shape)
 
                 # Process the u velocity component
                 u_comp = u_gga
-                comp_source[np.isnan(u_comp) == False] = 2
+                comp_source[np.logical_not(np.isnan(u_comp))] = 2
 
                 # If GGA data are not valid try VTG and set composite source
                 u_comp[np.isnan(u_comp)] = u_vtg[np.isnan(u_comp)]
-                comp_source[np.logical_and(np.isnan(u_comp) == False, np.isnan(comp_source))] = 3
-
-                # If there are still invalid boar velocities, try BT and set composite source
+                comp_source[
+                    np.logical_and(
+                        np.logical_not(np.isnan(u_comp)), np.isnan(comp_source)
+                    )
+                ] = 3
+
+                # If there are still invalid boat velocities, try BT and set
+                # composite source
                 u_comp[np.isnan(u_comp)] = u_bt[np.isnan(u_comp)]
-                comp_source[np.logical_and(np.isnan(u_comp) == False, np.isnan(comp_source))] = 1
-
-                # If there are still invalid boat velocities, use interpolated values,
-                # if present and set composite source
-                comp_source[np.logical_and(np.isnan(u_comp) == False, np.isnan(comp_source))] = 0
-
-                # Set composite source to invalid for all remaining invalid boat velocity data
+                comp_source[
+                    np.logical_and(
+                        np.logical_not(np.isnan(u_comp)), np.isnan(comp_source)
+                    )
+                ] = 1
+
+                # If there are still invalid boat velocities,
+                # use interpolated values, if present and set composite source
+                comp_source[
+                    np.logical_and(
+                        np.logical_not(np.isnan(u_comp)), np.isnan(comp_source)
+                    )
+                ] = 0
+
+                # Set composite source to invalid for all remaining invalid
+                # boat velocity data
                 comp_source[np.isnan(comp_source)] = -1
 
-                # Process v velocity component.  Assume that the composite source is the
-                # same as the u component
+                # Process v velocity component.  Assume that the composite
+                # source is the same as the u component
                 v_comp = v_gga
                 v_comp[np.isnan(v_comp)] = v_vtg[np.isnan(v_comp)]
                 v_comp[np.isnan(v_comp)] = v_bt[np.isnan(v_comp)]
-                # v_comp[np.isnan(v_comp)] = self.gga_vel.v_processed_mps[np.isnan(v_comp)]
 
                 # Apply the composite settings to the gga BoatData object
-                # For the situation where the transect has no GGA data but other transects do and composite tracks
-                # has been turned on, create the gga_vel object and populate only the u and v processed, comp_source,
+                # For the situation where the transect has no GGA data but
+                # other transects do and composite tracks
+                # has been turned on, create the gga_vel object and populate
+                # only the u and v processed, comp_source,
                 # and valid_data attributes.
                 if self.gga_vel is None:
                     self.gga_vel = BoatData()
-                    self.gga_vel.processed_source = np.array([''] * comp_source.shape[0], dtype=object)
+                    self.gga_vel.processed_source = np.array(
+                        [""] * comp_source.shape[0], dtype=object
+                    )
                     self.gga_vel.valid_data = np.full((6, comp_source.shape[0]), False)
                 self.gga_vel.apply_composite(u_comp, v_comp, comp_source)
                 self.gga_vel.interpolate_composite(transect)
 
             # Process vtg as primary
-            elif self.selected == 'vtg_vel':
+            elif self.selected == "vtg_vel":
                 # Initialize the composite source
                 comp_source = np.tile([np.nan], u_bt.shape)
 
                 # Process the u velocity component
                 u_comp = u_vtg
-                comp_source[np.isnan(u_comp) == False] = 3
+                comp_source[np.logical_not(np.isnan(u_comp))] = 3
 
                 # If VTG data are not valid try GGA and set composite source
                 u_comp[np.isnan(u_comp)] = u_gga[np.isnan(u_comp)]
-                comp_source[np.logical_and(np.isnan(u_comp) == False, np.isnan(comp_source))] = 2
-
-                # If there are still invalid boat velocities, try BT and set composite source
+                comp_source[
+                    np.logical_and(
+                        np.logical_not(np.isnan(u_comp)), np.isnan(comp_source)
+                    )
+                ] = 2
+
+                # If there are still invalid boat velocities, try BT and set
+                # composite source
                 u_comp[np.isnan(u_comp)] = u_bt[np.isnan(u_comp)]
-                comp_source[np.logical_and(np.isnan(u_comp) == False, np.isnan(comp_source))] = 1
-
-                # If there are still invalid boat velocities, use interpolated values,
+                comp_source[
+                    np.logical_and(
+                        np.logical_not(np.isnan(u_comp)), np.isnan(comp_source)
+                    )
+                ] = 1
+
+                # If there are still invalid boat velocities,
+                # use interpolated values,
                 # if present and set composite source
-                comp_source[np.logical_and(np.isnan(u_comp) == False, np.isnan(comp_source))] = 0
-
-                # Set composite source to invalid for all remaining invalid boat velocity data
+                comp_source[
+                    np.logical_and(
+                        np.logical_not(np.isnan(u_comp)), np.isnan(comp_source)
+                    )
+                ] = 0
+
+                # Set composite source to invalid for all remaining invalid
+                # boat velocity data
                 comp_source[np.isnan(comp_source)] = -1
 
-                # Process v velocity component.  Assume that the composite source is the
+                # Process v velocity component.  Assume that the composite
+                # source is the
                 # same as the u component
                 v_comp = v_vtg
-                # DSM wrong in Matlab version 1/29/2018 v_comp[np.isnan(v_comp)] = v_vtg[np.isnan(v_comp)]
+                # DSM wrong in Matlab version 1/29/2018 v_comp[np.isnan(
+                # v_comp)] = v_vtg[np.isnan(v_comp)]
                 v_comp[np.isnan(v_comp)] = v_gga[np.isnan(v_comp)]
                 v_comp[np.isnan(v_comp)] = v_bt[np.isnan(v_comp)]
-                # v_comp[np.isnan(v_comp)] = self.vtg_vel.v_processed_mps[np.isnan(v_comp)]
 
                 # Apply the composite settings to the gga BoatData object
-                # For the situation where the transect has no GGA data but other transects do and composite tracks
-                # has been turned on, create the gga_vel object and populate only the u and v processed, comp_source,
+                # For the situation where the transect has no GGA data but
+                # other transects do and composite tracks
+                # has been turned on, create the gga_vel object and populate
+                # only the u and v processed, comp_source,
                 # and valid_data attributes.
                 if self.vtg_vel is None:
                     self.vtg_vel = BoatData()
-                    self.vtg_vel.processed_source = np.array([''] * comp_source.shape[0], dtype=object)
+                    self.vtg_vel.processed_source = np.array(
+                        [""] * comp_source.shape[0], dtype=object
+                    )
                     self.vtg_vel.valid_data = np.full((6, comp_source.shape[0]), False)
                 self.vtg_vel.apply_composite(u_comp, v_comp, comp_source)
                 self.vtg_vel.interpolate_composite(transect)
@@ -315,74 +402,107 @@ class BoatStructure(object):
 
             # Use only interpolations for bt
             if self.bt_vel is not None:
-                self.bt_vel.apply_interpolation(transect=transect,
-                                                interpolation_method=transect.boat_vel.bt_vel.interpolate)
+                self.bt_vel.apply_interpolation(
+                    transect=transect,
+                    interpolation_method=transect.boat_vel.bt_vel.interpolate,
+                )
                 comp_source = np.tile(np.nan, self.bt_vel.u_processed_mps.shape)
                 comp_source[self.bt_vel.valid_data[0, :]] = 1
-                comp_source[np.logical_and(np.isnan(comp_source),
-                                           (np.isnan(self.bt_vel.u_processed_mps) == False))] = 0
+                comp_source[
+                    np.logical_and(
+                        np.isnan(comp_source),
+                        (np.logical_not(np.isnan(self.bt_vel.u_processed_mps))),
+                    )
+                ] = 0
                 comp_source[np.isnan(comp_source)] = -1
-                self.bt_vel.apply_composite(u_composite=self.bt_vel.u_processed_mps,
-                                            v_composite=self.bt_vel.v_processed_mps,
-                                            composite_source=comp_source)
+                self.bt_vel.apply_composite(
+                    u_composite=self.bt_vel.u_processed_mps,
+                    v_composite=self.bt_vel.v_processed_mps,
+                    composite_source=comp_source,
+                )
 
             # Use only interpolations for gga
             if self.gga_vel is not None:
-                # This if statement handles the situation where there is no GPS data for a transect but there is GPS
-                # data for other transects and the user has turned on / off composite tracks.
+                # This if statement handles the situation where there is no
+                # GPS data for a transect but there is GPS data for other
+                # transects and the user has turned on / off composite tracks.
                 if self.gga_vel.u_mps is not None:
-                    self.gga_vel.apply_interpolation(transect=transect,
-                                                     interpolation_method=transect.boat_vel.gga_vel.interpolate)
+                    self.gga_vel.apply_interpolation(
+                        transect=transect,
+                        interpolation_method=transect.boat_vel.gga_vel.interpolate,
+                    )
                     comp_source = np.tile(np.nan, self.gga_vel.u_processed_mps.shape)
                     comp_source[self.gga_vel.valid_data[0, :]] = 2
-                    comp_source[np.logical_and(np.isnan(comp_source),
-                                               (np.isnan(self.gga_vel.u_processed_mps) == False))] = 0
+                    comp_source[
+                        np.logical_and(
+                            np.isnan(comp_source),
+                            (np.logical_not(np.isnan(self.gga_vel.u_processed_mps))),
+                        )
+                    ] = 0
                     comp_source[np.isnan(comp_source)] = -1
-                    self.gga_vel.apply_composite(u_composite=self.gga_vel.u_processed_mps,
-                                                 v_composite=self.gga_vel.v_processed_mps,
-                                                 composite_source=comp_source)
+                    self.gga_vel.apply_composite(
+                        u_composite=self.gga_vel.u_processed_mps,
+                        v_composite=self.gga_vel.v_processed_mps,
+                        composite_source=comp_source,
+                    )
                 else:
                     self.gga_vel = None
 
             # Use only interpolations for vtg
             if self.vtg_vel is not None:
-                # This if statement handles the situation where there is no GPS data for a transect but there is GPS
-                # data for other transects and the user has turned on / off composite tracks.
+                # This if statement handles the situation where there is no
+                # GPS data for a transect but there is GPS data for other
+                # transects and the user has turned on / off composite tracks.
                 if self.vtg_vel.u_mps is not None:
-                    self.vtg_vel.apply_interpolation(transect=transect,
-                                                     interpolation_method=transect.boat_vel.vtg_vel.interpolate)
+                    self.vtg_vel.apply_interpolation(
+                        transect=transect,
+                        interpolation_method=transect.boat_vel.vtg_vel.interpolate,
+                    )
                     comp_source = np.tile(np.nan, self.vtg_vel.u_processed_mps.shape)
                     comp_source[self.vtg_vel.valid_data[0, :]] = 3
-                    comp_source[np.logical_and(np.isnan(comp_source),
-                                               (np.isnan(self.vtg_vel.u_processed_mps) == False))] = 0
+                    comp_source[
+                        np.logical_and(
+                            np.isnan(comp_source),
+                            (np.logical_not(np.isnan(self.vtg_vel.u_processed_mps))),
+                        )
+                    ] = 0
                     comp_source[np.isnan(comp_source)] = -1
-                    self.vtg_vel.apply_composite(u_composite=self.vtg_vel.u_processed_mps,
-                                                 v_composite=self.vtg_vel.v_processed_mps,
-                                                 composite_source=comp_source)
+                    self.vtg_vel.apply_composite(
+                        u_composite=self.vtg_vel.u_processed_mps,
+                        v_composite=self.vtg_vel.v_processed_mps,
+                        composite_source=comp_source,
+                    )
                 else:
                     self.vtg_vel = None
 
     @staticmethod
     def compute_boat_track(transect, ref=None):
-        """Computes the shiptrack coordinates, along track distance, and distance made
-        good for the selected boat reference.
+        """Computes the shiptrack coordinates, along track distance,
+        and distance made good for the selected boat reference.
 
         Parameters
         ----------
         transect: TransectData
             Object of TransectData
         ref: str
-            Setting to determine what navigation reference should be used. In None use selected.
+            Setting to determine what navigation reference should be used.
+            If None use selected.
 
         Returns
         -------
         boat_track: dict
-            Dictionary containing shiptrack coordinates (track_x_m, track_y_m), along track distance (distance_m),
+            Dictionary containing shiptrack coordinates (track_x_m,
+            track_y_m), along track distance (distance_m),
             and distance made good (dmg_m)
         """
 
         # Initialize dictionary
-        boat_track = {'track_x_m': np.nan, 'track_y_m': np.nan, 'distance_m': np.nan, 'dmg_m': np.nan}
+        boat_track = {
+            "track_x_m": np.nan,
+            "track_y_m": np.nan,
+            "distance_m": np.nan,
+            "dmg_m": np.nan,
+        }
 
         # Compute incremental track coordinates
         if ref is None:
@@ -391,25 +511,34 @@ class BoatStructure(object):
             boat_vel_selected = getattr(transect.boat_vel, ref)
 
         if boat_vel_selected is None:
-            boat_vel_selected = getattr(transect.boat_vel, 'bt_vel')
-        track_x = boat_vel_selected.u_processed_mps[transect.in_transect_idx] * \
-            transect.date_time.ens_duration_sec[transect.in_transect_idx]
-        track_y = boat_vel_selected.v_processed_mps[transect.in_transect_idx] * \
-            transect.date_time.ens_duration_sec[transect.in_transect_idx]
+            boat_vel_selected = getattr(transect.boat_vel, "bt_vel")
+        track_x = (
+            boat_vel_selected.u_processed_mps[transect.in_transect_idx]
+            * transect.date_time.ens_duration_sec[transect.in_transect_idx]
+        )
+        track_y = (
+            boat_vel_selected.v_processed_mps[transect.in_transect_idx]
+            * transect.date_time.ens_duration_sec[transect.in_transect_idx]
+        )
 
         # Check for any valid data
         idx = np.where(np.logical_not(np.isnan(track_x)))
         if idx[0].size > 1:
             # Compute variables
-            boat_track['distance_m'] = np.nancumsum(np.sqrt(track_x ** 2 + track_y ** 2))
-            boat_track['track_x_m'] = np.nancumsum(track_x)
-            boat_track['track_y_m'] = np.nancumsum(track_y)
-            boat_track['dmg_m'] = np.sqrt(boat_track['track_x_m'] ** 2 + boat_track['track_y_m'] ** 2)
+            boat_track["distance_m"] = np.nancumsum(
+                np.sqrt(track_x**2 + track_y**2)
+            )
+            boat_track["track_x_m"] = np.nancumsum(track_x)
+            boat_track["track_y_m"] = np.nancumsum(track_y)
+            boat_track["dmg_m"] = np.sqrt(
+                boat_track["track_x_m"] ** 2 + boat_track["track_y_m"] ** 2
+            )
 
         return boat_track
 
     def populate_from_qrev_mat(self, transect):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -417,21 +546,27 @@ class BoatStructure(object):
            Matlab data structure obtained from sio.loadmat
         """
 
-        if hasattr(transect, 'boatVel'):
-            if hasattr(transect.boatVel, 'btVel'):
-                if hasattr(transect.boatVel.btVel, 'u_mps'):
+        if hasattr(transect, "boatVel"):
+            if hasattr(transect.boatVel, "btVel"):
+                if hasattr(transect.boatVel.btVel, "u_mps"):
                     self.bt_vel = BoatData()
                     self.bt_vel.populate_from_qrev_mat(transect.boatVel.btVel)
-            if hasattr(transect.boatVel, 'ggaVel'):
-                if hasattr(transect.boatVel.ggaVel, 'u_mps'):
+            if hasattr(transect.boatVel, "ggaVel"):
+                if hasattr(transect.boatVel.ggaVel, "u_mps"):
                     self.gga_vel = BoatData()
                     self.gga_vel.populate_from_qrev_mat(transect.boatVel.ggaVel)
-            if hasattr(transect.boatVel, 'vtgVel'):
-                if hasattr(transect.boatVel.vtgVel, 'u_mps'):
+            if hasattr(transect.boatVel, "vtgVel"):
+                if hasattr(transect.boatVel.vtgVel, "u_mps"):
                     self.vtg_vel = BoatData()
                     self.vtg_vel.populate_from_qrev_mat(transect.boatVel.vtgVel)
-            nav_dict = {'btVel':'bt_vel', 'bt_vel':'bt_vel',
-                        'ggaVel':'gga_vel', 'gga_vel':'gga_vel',
-                        'vtgVel':'vtg_vel', 'vtg_vel':'vtg_vel'}
+            if hasattr(transect.boatVel, "composite"):
+                self.composite = transect.boatVel.composite
+            nav_dict = {
+                "btVel": "bt_vel",
+                "bt_vel": "bt_vel",
+                "ggaVel": "gga_vel",
+                "gga_vel": "gga_vel",
+                "vtgVel": "vtg_vel",
+                "vtg_vel": "vtg_vel",
+            }
             self.selected = nav_dict[transect.boatVel.selected]
-
diff --git a/qrevint_22_06_22/Classes/CompassCal.py b/Classes/CompassCal.py
similarity index 77%
rename from qrevint_22_06_22/Classes/CompassCal.py
rename to Classes/CompassCal.py
index 2b279e9546044410c7c86628cd69d9f01d774f9b..de93d0b99cc22d5d2b49b9ae1e671a31cfa49683 100644
--- a/qrevint_22_06_22/Classes/CompassCal.py
+++ b/Classes/CompassCal.py
@@ -2,7 +2,8 @@ import re
 
 
 class CompassCal(object):
-    """Class stores compass calibration or evaluation data and parses the compass error from the raw data.
+    """Class stores compass calibration or evaluation data and parses the
+    compass error from the raw data.
 
     Attributes
     ----------
@@ -11,7 +12,8 @@ class CompassCal(object):
     data: str
         All calibration or evaluation data provided by the manufacturer.
     error: float
-        Remaining compass error after calibration or from evaluation, in degrees.
+        Remaining compass error after calibration or from evaluation, in
+        degrees.
     """
 
     def __init__(self):
@@ -34,8 +36,10 @@ class CompassCal(object):
         self.time_stamp = time_stamp
         self.data = data_in
 
-        splits = re.split('(Total error:|Double Cycle Errors:|Error from calibration:)', data_in)
+        splits = re.split(
+            "(Total error:|Double Cycle Errors:|Error from calibration:)", data_in
+        )
         if len(splits) > 1:
-            self.error = re.search('\d+\.*\d*', splits[2])[0]
+            self.error = re.search("\d+\.*\d*", splits[2])[0]
         else:
-            self.error = 'N/A'
+            self.error = "N/A"
diff --git a/qrevint_22_06_22/Classes/ComputeExtrap.py b/Classes/ComputeExtrap.py
similarity index 69%
rename from qrevint_22_06_22/Classes/ComputeExtrap.py
rename to Classes/ComputeExtrap.py
index fd272d1919231e75950931a69624ffd1fe1ca34c..a728b44814ef77baa007dd19aba101bce6553e23 100644
--- a/qrevint_22_06_22/Classes/ComputeExtrap.py
+++ b/Classes/ComputeExtrap.py
@@ -5,7 +5,8 @@ from Classes.NormData import NormData
 
 
 class ComputeExtrap(object):
-    """Class to compute the optimized or manually specified extrapolation methods
+    """Class to compute the optimized or manually specified extrapolation
+    methods
 
     Attributes
     ----------
@@ -26,27 +27,35 @@ class ComputeExtrap(object):
     use_weighted: bool
         Specifies if discharge weighted medians are used in extrapolations
     sub_from_left: bool
-        Specifies if when subsectioning the subsection should start from left to right.
+        Specifies if when subsectioning the subsection should start from
+        left to right.
     use_q: bool
         Specifies to use the discharge rather than the xprod when subsectioning
 
     """
-    
+
     def __init__(self):
         """Initialize instance variables."""
 
-        self.threshold = None  # Threshold as a percent for determining if a median is valid
-        self.subsection = None  # Percent of discharge, does not account for transect direction
-        self.fit_method = None  # Method used to determine fit.  Automatic or manual
-        self.norm_data = []  # Object of class norm data
-        self.sel_fit = []  # Object of class SelectFit
-        self.q_sensitivity = None  # Object of class ExtrapQSensitivity
-        self.messages = []  # Variable for messages to UserWarning
+        self.threshold = None
+        self.subsection = None
+        self.fit_method = None
+        self.norm_data = []
+        self.sel_fit = []
+        self.q_sensitivity = None
+        self.messages = []
         self.use_weighted = False
         self.use_q = False
         self.sub_from_left = False
-        
-    def populate_data(self, transects, compute_sensitivity=True, use_weighted=False, use_q=True, sub_from_left=True):
+
+    def populate_data(
+        self,
+        transects,
+        compute_sensitivity=True,
+        use_weighted=False,
+        use_q=True,
+        sub_from_left=True,
+    ):
         """Store data in instance variables.
 
         Parameters
@@ -56,24 +65,35 @@ class ComputeExtrap(object):
         compute_sensitivity: bool
             Determines is sensitivity should be computed.
         use_weighted: bool
-        Specifies if discharge weighted medians are used in extrapolations
+            Specifies if discharge weighted medians are used in extrapolations
+        use_q: bool
+            Specifies to use the discharge rather than the xprod when subsectioning
+        sub_from_left: bool
+            Specifies if when subsectioning the subsection should start from
+            left to right.
         """
 
         self.threshold = 20
         self.subsection = [0, 100]
-        self.fit_method = 'Automatic'
+        self.fit_method = "Automatic"
         self.use_weighted = use_weighted
         self.use_q = use_q
         self.sub_from_left = sub_from_left
-        self.process_profiles(transects=transects, data_type='q', use_weighted=use_weighted)
+        self.process_profiles(
+            transects=transects, data_type="q", use_weighted=use_weighted
+        )
 
-        # Compute the sensitivity of the final discharge to changes in extrapolation methods
+        # Compute the sensitivity of the final discharge to changes in
+        # extrapolation methods
         if compute_sensitivity:
             self.q_sensitivity = ExtrapQSensitivity()
-            self.q_sensitivity.populate_data(transects=transects, extrap_fits=self.sel_fit)
+            self.q_sensitivity.populate_data(
+                transects=transects, extrap_fits=self.sel_fit
+            )
 
     def populate_from_qrev_mat(self, meas_struct):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -81,17 +101,18 @@ class ComputeExtrap(object):
            Matlab data structure obtained from sio.loadmat
         """
 
-        if hasattr(meas_struct, 'extrapFit'):
+        if hasattr(meas_struct, "extrapFit"):
             self.threshold = meas_struct.extrapFit.threshold
             self.subsection = meas_struct.extrapFit.subsection
             self.fit_method = meas_struct.extrapFit.fitMethod
 
-            # Check for consistency between transects and norm_data. If only checked transects were saved, the
-            # normData and selfit will also include unchecked transects which must be removed prior to
+            # Check for consistency between transects and norm_data. If only
+            # checked transects were saved, the normData and selfit will also
+            # include unchecked transects which must be removed prior to
             # continuing to process.
 
-            # If only a single transect the meas_struct.transects will be structure not an array, so the len method
-            # won't work.
+            # If only a single transect the meas_struct.transects will be
+            # structure not an array, so the len method won't work.
             try:
                 n_transects = len(meas_struct.transects)
             except TypeError:
@@ -113,7 +134,8 @@ class ComputeExtrap(object):
                 else:
                     for transect in meas_struct.transects:
                         file_names.append(transect.fileName)
-                # Create a list of norm_data and sel_fit objects that match the filenames in transects
+                # Create a list of norm_data and sel_fit objects that match
+                # the filenames in transects
                 for n in range(len(meas_struct.extrapFit.normData) - 1):
                     if meas_struct.extrapFit.normData[n].fileName in file_names:
                         valid_norm_data.append(meas_struct.extrapFit.normData[n])
@@ -129,17 +151,17 @@ class ComputeExtrap(object):
             self.sel_fit = SelectFit.qrev_mat_in(meas_struct.extrapFit)
             self.q_sensitivity = ExtrapQSensitivity()
             self.q_sensitivity.populate_from_qrev_mat(meas_struct.extrapFit)
-            if hasattr(meas_struct.extrapFit, 'use_weighted'):
+            if hasattr(meas_struct.extrapFit, "use_weighted"):
                 self.use_weighted = meas_struct.extrapFit.use_weighted
             else:
                 self.use_weighted = False
 
-            if hasattr(meas_struct.extrapFit, 'use_q'):
+            if hasattr(meas_struct.extrapFit, "use_q"):
                 self.use_q = meas_struct.extrapFit.use_q
             else:
                 self.use_q = False
 
-            if hasattr(meas_struct.extrapFit, 'sub_from_left'):
+            if hasattr(meas_struct.extrapFit, "sub_from_left"):
                 self.sub_from_left = meas_struct.extrapFit.sub_from_left
             else:
                 self.sub_from_left = False
@@ -149,7 +171,9 @@ class ComputeExtrap(object):
             elif type(meas_struct.extrapFit.messages) is np.ndarray:
                 self.messages = meas_struct.extrapFit.messages.tolist()
 
-    def process_profiles(self, transects, data_type, use_weighted=None, use_q=True, sub_from_left=True):
+    def process_profiles(
+        self, transects, data_type, use_weighted=None, use_q=True, sub_from_left=True
+    ):
         """Function that coordinates the fitting process.
 
         Parameters
@@ -158,10 +182,14 @@ class ComputeExtrap(object):
             Object of TransectData
         data_type: str
             Type of data processing (q or v)
+        use_weighted: bool
+            Specifies if discharge weighted medians are used in extrapolations
         sub_from_left: bool
-            Specifies if when subsectioning the subsection should start from left to right.
+            Specifies if when subsectioning the subsection should start from
+            left to right.
         use_q: bool
-            Specifies to use the discharge rather than the xprod when subsectioning
+            Specifies to use the discharge rather than the xprod when
+            subsectioning
         """
         if use_weighted is not None:
             self.use_weighted = use_weighted
@@ -175,30 +203,36 @@ class ComputeExtrap(object):
         self.norm_data = []
         for transect in transects:
             norm_data = NormData()
-            norm_data.populate_data(transect=transect,
-                                    data_type=data_type,
-                                    threshold=self.threshold,
-                                    data_extent=self.subsection,
-                                    use_weighted=self.use_weighted,
-                                    use_q=self.use_q,
-                                    sub_from_left=self.sub_from_left)
+            norm_data.populate_data(
+                transect=transect,
+                data_type=data_type,
+                threshold=self.threshold,
+                data_extent=self.subsection,
+                use_weighted=self.use_weighted,
+                use_q=self.use_q,
+                sub_from_left=self.sub_from_left,
+            )
             self.norm_data.append(norm_data)
 
         # Compute composite normalized data
         comp_data = NormData()
         comp_data.use_q = self.norm_data[-1].use_q
         comp_data.sub_from_left = self.norm_data[-1].sub_from_left
-        comp_data.create_composite(transects=transects, norm_data=self.norm_data, threshold=self.threshold)
+        comp_data.create_composite(
+            transects=transects, norm_data=self.norm_data, threshold=self.threshold
+        )
         self.norm_data.append(comp_data)
 
         # Compute the fit for the selected  method
-        if self.fit_method == 'Manual':
+        if self.fit_method == "Manual":
             for n in range(len(transects)):
-                self.sel_fit[n].populate_data(normalized=self.norm_data[n],
-                                              fit_method=self.fit_method,
-                                              top=transects[n].extrap.top_method,
-                                              bot=transects[n].extrap.bot_method,
-                                              exponent=transects[n].extrap.exponent)
+                self.sel_fit[n].populate_data(
+                    normalized=self.norm_data[n],
+                    fit_method=self.fit_method,
+                    top=transects[n].extrap.top_method,
+                    bot=transects[n].extrap.bot_method,
+                    exponent=transects[n].extrap.exponent,
+                )
         else:
             self.sel_fit = []
             for n in range(len(self.norm_data)):
@@ -207,11 +241,15 @@ class ComputeExtrap(object):
                 self.sel_fit.append(sel_fit)
 
         if self.sel_fit[-1].top_fit_r2 is not None:
-            # Evaluate if there is a potential that a 3-point top method may be appropriate
-            if (self.sel_fit[-1].top_fit_r2 > 0.9 or self.sel_fit[-1].top_r2 > 0.9) \
-                    and np.abs(self.sel_fit[-1].top_max_diff) > 0.2:
-                self.messages.append('The measurement profile may warrant a 3-point fit at the top')
-                
+            # Evaluate if there is a potential that a 3-point top method may
+            # be appropriate
+            if (
+                self.sel_fit[-1].top_fit_r2 > 0.9 or self.sel_fit[-1].top_r2 > 0.9
+            ) and np.abs(self.sel_fit[-1].top_max_diff) > 0.2:
+                self.messages.append(
+                    "The measurement profile may warrant a 3-point fit at " "the top"
+                )
+
     def update_q_sensitivity(self, transects):
         """Updates the discharge sensitivity values.
 
@@ -222,8 +260,17 @@ class ComputeExtrap(object):
         """
         self.q_sensitivity = ExtrapQSensitivity()
         self.q_sensitivity.populate_data(transects, self.sel_fit)
-        
-    def change_fit_method(self, transects, new_fit_method, idx, top=None, bot=None, exponent=None, compute_qsens=True):
+
+    def change_fit_method(
+        self,
+        transects,
+        new_fit_method,
+        idx,
+        top=None,
+        bot=None,
+        exponent=None,
+        compute_qsens=True,
+    ):
         """Function to change the extrapolation method.
 
         Parameters
@@ -245,14 +292,17 @@ class ComputeExtrap(object):
         """
         self.fit_method = new_fit_method
 
-        self.sel_fit[idx].populate_data(self.norm_data[idx], new_fit_method,  top=top, bot=bot, exponent=exponent)
-        if compute_qsens & idx == len(self.norm_data)-1:
+        self.sel_fit[idx].populate_data(
+            self.norm_data[idx], new_fit_method, top=top, bot=bot, exponent=exponent
+        )
+        if compute_qsens & idx == len(self.norm_data) - 1:
             self.q_sensitivity = ExtrapQSensitivity()
             self.q_sensitivity.populate_data(transects, self.sel_fit)
-        
+
     def change_threshold(self, transects, data_type, threshold):
-        """Function to change the threshold for accepting the increment median as valid.  The threshold
-        is in percent of the median number of points in all increments.
+        """Function to change the threshold for accepting the increment
+        median as valid.  The threshold is in percent of the median number
+        of points in all increments.
 
         Parameters
         ----------
@@ -261,17 +311,19 @@ class ComputeExtrap(object):
         data_type: str
             Specifies the data type (discharge or velocity)
         threshold: float
-            Percent of data that must be in a median to include the median in the fit algorithm
+            Percent of data that must be in a median to include the median
+            in the fit algorithm
         """
-        
+
         self.threshold = threshold
         self.process_profiles(transects=transects, data_type=data_type)
         self.q_sensitivity = ExtrapQSensitivity()
         self.q_sensitivity.populate_data(transects=transects, extrap_fits=self.sel_fit)
-        
+
     def change_extents(self, transects, data_type, extents, use_q, sub_from_left):
-        """Function allows the data to be subsection by specifying the percent cumulative discharge
-        for the start and end points.  Currently this function does not consider transect direction.
+        """Function allows the data to be subsection by specifying the
+        percent cumulative discharge for the start and end points.
+        Currently this function does not consider transect direction.
 
         Parameters
         ----------
@@ -280,20 +332,27 @@ class ComputeExtrap(object):
         data_type: str
             Specifies the data type (discharge or velocity)
         extents: list
-            List containing two values, the minimum and maximum discharge percentages to subsectioning
+            List containing two values, the minimum and maximum discharge
+            percentages to subsectioning
+        sub_from_left: bool
+            Specifies if when subsectioning the subsection should start from
+            left to right.
+        use_q: bool
+            Specifies to use the discharge rather than the xprod when
+            subsectioning
         sub_from_left: bool
             Specifies if when subsectioning the subsection should start from left to right.
         use_q: bool
             Specifies to use the discharge rather than the xprod when subsectioning
         """
-        
+
         self.subsection = extents
         self.use_q = use_q
         self.sub_from_left = sub_from_left
-        self.process_profiles(transects=transects, data_type=data_type )
+        self.process_profiles(transects=transects, data_type=data_type)
         self.q_sensitivity = ExtrapQSensitivity()
         self.q_sensitivity.populate_data(transects=transects, extrap_fits=self.sel_fit)
-        
+
     def change_data_type(self, transects, data_type):
         """Changes the data type to be processed in extrap.
 
@@ -304,12 +363,14 @@ class ComputeExtrap(object):
         data_type: str
             Specifies the data type (discharge or velocity)
         """
-        if data_type.lower() == 'q':
+        if data_type.lower() == "q":
             use_weighted = self.use_weighted
         else:
             use_weighted = False
 
-        self.process_profiles(transects=transects, data_type=data_type, use_weighted=use_weighted)
+        self.process_profiles(
+            transects=transects, data_type=data_type, use_weighted=use_weighted
+        )
         self.q_sensitivity = ExtrapQSensitivity()
         self.q_sensitivity.populate_data(transects=transects, extrap_fits=self.sel_fit)
 
@@ -323,8 +384,11 @@ class ComputeExtrap(object):
         """
         self.threshold = 20
         self.subsection = [0, 100]
-        self.process_profiles(transects=transects, data_type='q', use_weighted=self.use_weighted)
+        self.process_profiles(
+            transects=transects, data_type="q", use_weighted=self.use_weighted
+        )
 
-        # Compute the sensitivity of the final discharge to changes in extrapolation methods
+        # Compute the sensitivity of the final discharge to changes in
+        # extrapolation methods
         self.q_sensitivity = ExtrapQSensitivity()
         self.q_sensitivity.populate_data(transects=transects, extrap_fits=self.sel_fit)
diff --git a/qrevint_22_06_22/Classes/CoordError.py b/Classes/CoordError.py
similarity index 70%
rename from qrevint_22_06_22/Classes/CoordError.py
rename to Classes/CoordError.py
index 1411a302024774957e85c6eca52b4ebb0e92408d..95800f9f7b9a6f5332b19fea80c32a12d36e25ae 100644
--- a/qrevint_22_06_22/Classes/CoordError.py
+++ b/Classes/CoordError.py
@@ -1,4 +1,3 @@
 class CoordError(Exception):
-
     def __init__(self, text):
-        self.text = text
\ No newline at end of file
+        self.text = text
diff --git a/Classes/CrossSectionComp.py b/Classes/CrossSectionComp.py
new file mode 100644
index 0000000000000000000000000000000000000000..9cc94c4b0c89c60c5552fb4ed0ce55b8524abed3
--- /dev/null
+++ b/Classes/CrossSectionComp.py
@@ -0,0 +1,675 @@
+import math
+import os
+
+import matplotlib.pyplot as plt
+import numpy as np
+import utm
+
+from Classes.BoatStructure import BoatStructure
+
+# ToDo: Add stats to show variability between transects ie Area and
+# mean depth variance.
+
+
+class CrossSectionComp(object):
+    """Creates average cross-section.
+
+    Attributes
+    ----------
+        cross_section: list
+            list of transect cross-sections stored as np.arrays.
+        checked_idx: np.array
+            Array of checked transect indices
+        gps: bool
+            True is GPS data available
+        rec_spacing: float
+            Recommended spacing for horizontal cross-section
+        unproj_xs: list of np.array
+            List of unprojected cross-sections
+
+    """
+
+    def __init__(self, transects, path=None):
+        """Initiate attributes"""
+
+        self.cross_section = []
+        self.checked_idx = []
+        self.gps = True
+        self.rec_spacing = 0
+        self.unproj_xs = []
+        self.zone_number = None
+        self.zone_letter = None
+
+        self.create_cross_sections(transects)
+
+        # Export CSV and PDF plots for testing
+        if path is not None:
+            self.export_csv(path)
+            self.export_plots(path)
+
+    def create_cross_sections(self, transects):
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        transects: TransectData
+            Object of TransectData containing boat speeds
+
+        """
+
+        # Initialize variables
+        self.cross_section = []
+        self.checked_idx = []
+        left_edge = []
+        start_edge = []
+        lon_list = []
+        lat_list = []
+        x_list = []
+        y_list = []
+        depth_list = []
+        self.gps = True
+        station_list = []
+
+        # Process each transect
+        for n, transect in enumerate(transects):
+
+            if transect.checked:
+
+                # self.checked_idx = np.append(checked_idx, n)
+                self.checked_idx.append(n)
+
+                # Compute boat track properties
+                boat_track = BoatStructure.compute_boat_track(transect)
+
+                if np.logical_not(np.all(np.isnan(boat_track["track_x_m"]))):
+
+                    # get x/y boat track data
+                    unit_x = boat_track["track_x_m"]
+                    unit_y = boat_track["track_y_m"]
+
+                    # if the start bank is right then flip the x/y coords.
+                    if transect.start_edge == "Right":
+                        unit_x = (np.amax(unit_x) - unit_x - (0 - np.amin(unit_x))) * -1
+                        unit_y = (np.amax(unit_y) - unit_y - (0 - np.amin(unit_y))) * -1
+                        edge = [transect.start_edge, transect.edges.left.distance_m]
+                    else:
+                        edge = [transect.start_edge, transect.edges.left.distance_m]
+
+                    start_edge.append(edge)
+                    x_list.append(unit_x)
+                    y_list.append(unit_y)
+                    left_edge.append(transect.edges.left.distance_m)
+
+                    # Get selected depth object
+                    depth = getattr(transect.depths, transect.depths.selected)
+                    depth_a = np.copy(depth.depth_processed_m)
+                    depth_a[np.isnan(depth_a)] = 0
+                    depth_list.append(depth_a)
+
+                    # pull GPS coords if available. If not fill with NANs
+                    if hasattr(transect.gps, "gga_lon_ens_deg"):
+                        if transect.boat_vel.selected == "vtg_vel" or "gga_vel":
+                            try:
+                                lon = transect.gps.gga_lon_ens_deg
+                                lat = transect.gps.gga_lat_ens_deg
+
+                                # replace nan values with 0 to avoid utm crash
+                                lon_nan = np.argwhere(np.isnan(lon))
+                                lat_nan = np.argwhere(np.isnan(lat))
+
+                                if len(lon_nan) > 0:
+                                    lon = np.nan_to_num(lon, nan=0)
+
+                                if len(lat_nan) > 0:
+                                    lat = np.nan_to_num(lat, nan=0)
+
+                                # convert lat/lon to UTM coords.
+                                lat_lon = utm.from_latlon(lat, lon)
+                                lat = lat_lon[0]
+                                lon = lat_lon[1]
+                                self.zone_number = lat_lon[2]
+                                self.zone_letter = lat_lon[3]
+
+                                # replace 0 values with nan
+                                if len(lat_nan) > 0:
+                                    for idx in lat_nan:
+                                        lat[idx] = np.nan
+                                if len(lon_nan) > 0:
+                                    for idx in lon_nan:
+                                        lon[idx] = np.nan
+
+                                self.gps = True
+                                lon_list.append(lon)
+                                lat_list.append(lat)
+
+                            except (ValueError, TypeError):
+                                lat, lon = self.create_empty_gps(unit_x)
+                                self.gps = False
+                                lon_list.append(lon)
+                                lat_list.append(lat)
+                        else:
+                            lat, lon = self.create_empty_gps(unit_x)
+                            self.gps = False
+                            lon_list.append(lon)
+                            lat_list.append(lat)
+
+                    else:
+                        lat, lon = self.create_empty_gps(unit_x)
+                        self.gps = False
+                        lon_list.append(lon)
+                        lat_list.append(lat)
+
+                    unprojected_xs = np.array([lon, lat, unit_x, unit_y, depth_a]).T
+                    self.unproj_xs.append(unprojected_xs)
+
+        if self.gps is True:
+            (
+                lon_list,
+                lat_list,
+                gps_slope,
+                gps_intercept,
+            ) = self.create_projected_cross_section(lon_list, lat_list)
+
+        x_list, y_list, xy_slope, xy_intercept = self.create_projected_cross_section(
+            x_list, y_list
+        )
+
+        x_list, y_list = self.adjust_xy_distances(x_list, y_list, xy_slope, start_edge)
+
+        for xs in range(len(x_list)):
+
+            station = np.sqrt(x_list[xs] ** 2 + y_list[xs] ** 2)
+            station_list.append(station)
+
+            xs = np.array(
+                [
+                    lon_list[xs],
+                    lat_list[xs],
+                    x_list[xs],
+                    y_list[xs],
+                    station_list[xs],
+                    depth_list[xs],
+                ]
+            ).T
+
+            self.cross_section.append(xs)
+
+        # set recommended spacing
+        self.compute_auto_spacing(station_list)
+
+        # compute average cross section and append
+        avg_cs = self.average_cross_section(self.cross_section)
+        self.cross_section.append(avg_cs)
+
+    @staticmethod
+    def create_empty_gps(unit_x):
+
+        array_size = unit_x.shape
+        lon = np.empty(array_size)
+        lon[:] = np.nan
+        lat = np.empty(array_size)
+        lat[:] = np.nan
+
+        return lat, lon
+
+    @staticmethod
+    def create_projected_cross_section(x_list, y_list):
+        """Computes projected ship track to convert transects to.
+
+        Parameters
+        ----------
+        x_list: lst of np.arrays
+            arrays are either long or x data.
+        y_list: lst of np.arrays
+            arrays are either lat or y data.
+
+        :return projected_x_list: lst of np.arrays
+            arrays are either long or x data.
+            projected_y_list: lst of np.arrays
+            arrays are either lat or y data.
+
+        """
+
+        x_array = np.concatenate(x_list)
+        y_array = np.concatenate(y_list)
+
+        # remove nan values to avoid convergence crash
+        idx = np.argwhere(np.isnan(x_array))
+        x_array = np.delete(x_array, idx)
+        y_array = np.delete(y_array, idx)
+
+        idx = np.argwhere(np.isnan(y_array))
+        x_array = np.delete(x_array, idx)
+        y_array = np.delete(y_array, idx)
+
+        # Find ranges and extremes
+        x_w = np.amin(x_array)
+        x_e = np.amax(x_array)
+        y_s = np.amin(y_array)
+        y_n = np.amax(y_array)
+
+        x_rng = x_e - x_w
+        y_rng = y_n - y_s
+
+        # use Least squares polynomial fit
+        if x_rng >= y_rng:
+            model = np.polyfit(x_array, y_array, 1)
+            # predict_function = np.poly1d(model)
+
+            slope = model[0]
+            intercept = model[1]
+
+        else:
+            model = np.polyfit(y_array, x_array, 1)
+            # predict_function = np.poly1d(model)
+
+            # slope and intercept in terms of x
+            slope = 1 / model[0]
+            intercept = -model[1] / model[0]
+
+        # map the ensembles to the mean cross-section line
+        projected_x_list = []
+        projected_y_list = []
+        for transect in range(len(x_list)):
+
+            projected_x = (
+                x_list[transect] - (slope * intercept) + (slope * y_list[transect])
+            ) / (slope**2 + 1)
+
+            projected_y = (
+                intercept + (slope * x_list[transect]) + (slope**2 * y_list[transect])
+            ) / (slope**2 + 1)
+
+            projected_x_list.append(projected_x)
+            projected_y_list.append(projected_y)
+
+        return projected_x_list, projected_y_list, slope, intercept
+
+    @staticmethod
+    def adjust_xy_distances(x_list, y_list, slope, start_edge):
+        """Adjusts projected x/y based on start edge distance.
+
+        Parameters
+        ----------
+        x_list: lst of np.arrays
+            arrays are either long or x data.
+        y_list: lst of np.arrays
+            arrays are either lat or y data.
+        slope: float
+            slope of projection
+        start_edge: list
+            list of start edges and distances
+
+        :return projected_x_list: lst of np.arrays
+                    arrays are either long or x data.
+                projected_y_list: lst of np.arrays
+                    arrays are either lat or y data.
+        """
+
+        theta = math.atan(slope)
+
+        projected_x_list = []
+        projected_y_list = []
+        for transect in range(len(x_list)):
+
+            # adjust the x/y lists using the left edge distance
+            if start_edge[transect][0] == "Left":
+                dist_x = start_edge[transect][1] * (math.cos(theta))
+                dist_y = start_edge[transect][1] * (math.sin(theta))
+                projected_x = x_list[transect] - dist_x
+                projected_y = y_list[transect] - dist_y
+            else:
+                dist_x = start_edge[transect][1] * (math.cos(theta))
+                dist_y = start_edge[transect][1] * (math.sin(theta))
+
+                projected_x = x_list[transect] - dist_x
+                projected_y = y_list[transect] - dist_y
+
+            projected_x_list.append(projected_x)
+            projected_y_list.append(projected_y)
+
+        return projected_x_list, projected_y_list
+
+    @staticmethod
+    def create_gps_xs(stations, x_start, y_start, slope):
+        """Adjusts projected x/y based on start edge distance.
+
+        Parameters
+        ----------
+        stations: np.arrays
+            mean cross-section.
+        x_start: float
+            starting point of transect on x axis
+        y_start: float
+            starting point of transect on y axis
+        slope: float
+            slope of projection
+        start: float
+            list of start edges and distances
+
+        :return x_array: np.arrays
+                    mean cross-section x values
+                y_array: np.arrays
+                    mean cross-section y values
+        """
+
+        # compute the geographic angle of the mean cross-section
+        theta = math.atan(slope)
+
+        # create x and y arrays
+        x_array = (stations * (math.cos(theta))) + x_start
+        y_array = (stations * (math.sin(theta))) + y_start
+
+        return x_array, y_array
+
+    def average_cross_section(self, cross_section, hor_spacing="Auto"):
+        """Compute average cross-section.
+
+        Parameters
+        ----------
+        cross_section: list of np.arrays
+            list of cross-section
+        hor_spacing: 'Auto' or float
+            spacing for stationing. Defaults to 'Auto'
+
+        :return average_cs
+
+        """
+
+        x_list = []
+        y_list = []
+        depth_list = []
+        length_list = []
+        start_list = []
+        end_list = []
+        lon_end_lst = []
+        lat_end_lst = []
+        lon_start_lst = []
+        lat_start_lst = []
+
+        # find max and min for the all transects to create mean xs
+        for transect in cross_section:
+            trans_end = np.max(np.array(transect[:, 4], dtype="f"), axis=0)
+            trans_end_idx = np.argmax(np.array(transect[:, 4], dtype="f"), axis=0)
+
+            trans_start = np.min(np.array(transect[:, 4], dtype="f"), axis=0)
+            trans_start_idx = np.argmin(np.array(transect[:, 4], dtype="f"), axis=0)
+
+            lat_start_lst.append(transect[:, 1][trans_start_idx])
+            lon_start_lst.append(transect[:, 0][trans_start_idx])
+            lat_end_lst.append(transect[:, 1][trans_end_idx])
+            lon_end_lst.append(transect[:, 0][trans_end_idx])
+
+            rows = transect.shape[0]
+
+            start_list.append(trans_start)
+            end_list.append(trans_end)
+            length_list.append(rows)
+
+        max_trans_start = np.min(start_list)
+        idx = np.argmin(start_list)
+        lat_start = lat_start_lst[idx]
+        lon_start = lon_start_lst[idx]
+        min_trans_end = np.max(end_list)
+        idx = np.argmax(start_list)
+        lat_end = lat_end_lst[idx]
+        lon_end = lon_end_lst[idx]
+
+        # set horizontal spacing. Default to 0.1m for xs widths > 10m.
+        if hor_spacing == "Auto":
+            spacing = self.rec_spacing
+        else:
+            spacing = hor_spacing
+
+        # create mean cross-section stationing line
+        station_line = np.arange(max_trans_start, min_trans_end, spacing)
+
+        # create nan array
+        num_pnts = station_line.shape[0]
+        nan_array = np.empty(num_pnts)
+        nan_array[:] = np.nan
+
+        # create GPS array for mcs
+        if not self.gps:
+            lon_array = nan_array.copy()
+            lat_array = nan_array.copy()
+        else:
+            lon_array = np.linspace(lon_start, lon_end, num_pnts)
+            lat_array = np.linspace(lat_start, lat_end, num_pnts)
+
+        for transect in cross_section:
+
+            # sort and separate individual arrays and set d-type.
+            sort_array = transect[transect[:, 4].argsort()].copy()
+
+            station_array = np.array(sort_array[:, 4], dtype="f")
+            depth_array = np.array(sort_array[:, 5], dtype="f")
+            x_array = np.array(sort_array[:, 2], dtype="f")
+            y_array = np.array(sort_array[:, 3], dtype="f")
+
+            # get index for stations outside current transect
+            station_max = station_array.max()
+            station_min = station_array.min()
+            greater = np.argwhere(station_line >= station_max)
+            less = np.argwhere(station_line <= station_min)
+
+            # Create stationing for transect
+            one_m_station = np.interp(station_line, station_array, station_array)
+
+            # create array of intervals and interpolate x/y and depth
+            new_x = np.interp(one_m_station, station_array, x_array)
+            new_y = np.interp(one_m_station, station_array, y_array)
+            new_depth = np.interp(one_m_station, station_array, depth_array)
+
+            # fill extents of transect with NANs as to avoid repeating values
+            if len(greater) > 0:
+                for idx in greater:
+                    new_depth[idx] = np.nan
+                    new_x[idx] = np.nan
+                    new_y[idx] = np.nan
+            if len(less) > 0:
+                for idx in less:
+                    new_depth[idx] = np.nan
+                    new_x[idx] = np.nan
+                    new_y[idx] = np.nan
+
+            x_list.append(new_x)
+            y_list.append(new_y)
+            depth_list.append(new_depth)
+
+        # create new arrays from list of arrays for each element
+        x_array = np.array(x_list, dtype="f")
+        y_array = np.array(y_list, dtype="f")
+        depth_array = np.array(depth_list, dtype="f")
+
+        # create mean array of each element
+        depth_avg = np.nanmean(depth_array, axis=0)
+        x_avg = np.nanmean(x_array, axis=0)
+        y_avg = np.nanmean(y_array, axis=0)
+
+        # create new array
+        average_cs = np.array(
+            [lon_array, lat_array, x_avg, y_avg, station_line, depth_avg]
+        ).T
+
+        return average_cs
+
+    def compute_auto_spacing(self, station_list):
+        """Compute recomended horizontal spacing.
+
+        Parameters
+        ----------
+        station_list: list of np.arrays
+            list of stations
+
+        """
+
+        stations = np.concatenate(station_list)
+
+        # remove nan values to avoid convergence crash
+        stations = stations[~np.isnan(stations)]
+
+        station_dif = np.diff(stations)
+        diff_med = np.median(station_dif)
+        diff_std = np.std(station_dif)
+
+        self.rec_spacing = diff_med + diff_std
+
+    def export_csv(self, file_name):
+        """Exports CSV file for each checked transect.
+
+        Parameters
+        ----------
+        file_name: str
+            path to save files
+        """
+        # Todo add comment lines at the top of the file for metadata.
+        for n in range(len(self.cross_section)):
+
+            if n == (len(self.cross_section) - 1):
+                f_name = "cross_section_mean"
+            else:
+                f_name = "transect_" + str(self.checked_idx[n])
+
+            path = file_name[:-8] + f_name + "_QRev" + ".csv"
+            path = os.path.join(os.getcwd(), path)
+
+            np.savetxt(path, self.cross_section[n], delimiter=",", fmt="%s")
+
+    def export_plots(self, file_name):
+        """Exports PDF file of cross-section plots. This method is used for
+         troubleshooting.
+
+        Parameters
+        ----------
+        file_name: str
+            path to save files
+        """
+
+        mean_survey = self.cross_section[-1].T
+
+        try:
+            # XY plot
+            fig = plt.figure()
+            ax_1 = fig.add_subplot(1, 1, 1)
+
+            for index, xs in enumerate(self.cross_section[:-1]):
+                survey = xs.T
+
+                ax_1.plot(survey[2], survey[3], ".", label=index)
+
+            ax_1.plot(
+                mean_survey[2], mean_survey[3], ".", label="Projected Cross-Section"
+            )
+
+            # set axis labels and legend
+            ax_1.set_xlabel("X")
+            ax_1.set_ylabel("Y")
+            ax_1.legend()
+
+            # save plot to PDF
+            path = file_name[:-8] + "plots" + "_QRev" + ".pdf"
+            path = os.path.join(os.getcwd(), path)
+            fig.savefig(path)
+
+        except BaseException:
+            pass
+
+        try:
+            # mean depth plot
+            fig_2 = plt.figure()
+            ax_2 = fig_2.add_subplot(1, 1, 1)
+
+            for index, xs in enumerate(self.cross_section[:-1]):
+                survey = xs.T
+
+                ax_2.plot(survey[4], survey[5], "-", label=index)
+
+            ax_2.plot(
+                mean_survey[4], mean_survey[5], "-", label="Average Cross-Section"
+            )
+
+            ax_2.set_xlabel("Station")
+            ax_2.set_ylabel("Depth")
+            ax_2.invert_yaxis()
+            ax_2.legend()
+
+            path_2 = file_name[:-8] + "plots_2" + "_QRev" + ".pdf"
+            path_2 = os.path.join(os.getcwd(), path_2)
+            fig_2.savefig(path_2)
+
+        except BaseException:
+            pass
+
+        try:
+            # mean GPS plot
+            fig_3 = plt.figure()
+            ax_3 = fig_3.add_subplot(1, 1, 1)
+
+            for index, xs in enumerate(self.cross_section[:-1]):
+                survey = xs.T
+
+                ax_3.plot(survey[0], survey[1], ".", label=index)
+
+            ax_3.plot(
+                mean_survey[0], mean_survey[1], ".", label="Projected Cross-Section"
+            )
+
+            ax_3.set_xlabel("Long UTM")
+            ax_3.set_ylabel("Lat UTM")
+            ax_3.legend()
+
+            path_3 = file_name[:-8] + "plots_3" + "_QRev" + ".pdf"
+            path_3 = os.path.join(os.getcwd(), path_3)
+            fig_3.savefig(path_3)
+
+        except BaseException:
+            pass
+
+        try:
+            # unprojected XY with mean xs
+            fig_4 = plt.figure()
+            ax_4 = fig_4.add_subplot(1, 1, 1)
+            for index, xs in enumerate(self.unproj_xs):
+                survey = xs.T
+
+                ax_4.plot(survey[2], survey[3], "-", label=index)
+
+            ax_4.plot(
+                mean_survey[2], mean_survey[3], "-", label="Projected Cross-Section"
+            )
+
+            ax_4.set_xlabel("X")
+            ax_4.set_ylabel("Y")
+            ax_4.legend()
+
+            path_4 = file_name[:-8] + "plots_4" + "_QRev" + ".pdf"
+            path_4 = os.path.join(os.getcwd(), path_4)
+            fig_4.savefig(path_4)
+
+        except BaseException:
+            pass
+
+        try:
+            # unprojected GPS with mean xs
+            fig_5 = plt.figure()
+            ax_5 = fig_5.add_subplot(1, 1, 1)
+            for index, xs in enumerate(self.unproj_xs):
+                survey = xs.T
+
+                ax_5.plot(survey[0], survey[1], "-", label=index)
+
+            ax_5.plot(
+                mean_survey[0], mean_survey[1], "-", label="Projected Cross-Section"
+            )
+
+            ax_5.set_xlabel("Long UTM")
+            ax_5.set_ylabel("Lat UTM")
+            ax_5.legend()
+
+            path_5 = file_name[:-8] + "plots_5" + "_QRev" + ".pdf"
+            path_5 = os.path.join(os.getcwd(), path_5)
+            fig_5.savefig(path_5)
+
+        except BaseException:
+            pass
diff --git a/qrevint_22_06_22/Classes/DateTime.py b/Classes/DateTime.py
similarity index 64%
rename from qrevint_22_06_22/Classes/DateTime.py
rename to Classes/DateTime.py
index 9f7e3d39b61d2b5985ca34128fb62b2ae22e3d9c..6d811f2a1bb780362c98e041a0352c19597045b6 100644
--- a/qrevint_22_06_22/Classes/DateTime.py
+++ b/Classes/DateTime.py
@@ -1,5 +1,6 @@
 import numpy as np
 
+
 class DateTime(object):
     """This stores the date and time data in Python compatible format.
 
@@ -8,24 +9,26 @@ class DateTime(object):
     date: str
         Measurement date as mm/dd/yyyy
     start_serial_time: float
-        Python serial time for start of transect (seconds since 1/1/1970), timestamp
+        Python serial time for start of transect (seconds since 1/1/1970),
+        timestamp
     end_serial_time: float
-        Python serial time for end of transect (seconds since 1/1/1970), timestamp
+        Python serial time for end of transect (seconds since 1/1/1970),
+        timestamp
     transect_duration_sec: float
         Duration of transect, in seconds.
     ens_duration_sec: np.array(float)
         Duration of each ensemble, in seconds.
     """
-    
+
     def __init__(self):
         """Initialize class and instance variables."""
 
-        self.date = None  # Measurement date mm/dd/yyyy
-        self.start_serial_time = None  # Python serial time for start of transect, timestamp
-        self.end_serial_time = None  # Python serial time for end of transect, timestamp
-        self.transect_duration_sec = None  # Duration of transect in seconds
-        self.ens_duration_sec = None  # Duration of each ensemble in seconds
-        
+        self.date = None
+        self.start_serial_time = None
+        self.end_serial_time = None
+        self.transect_duration_sec = None
+        self.ens_duration_sec = None
+
     def populate_data(self, date_in, start_in, end_in, ens_dur_in):
         """Populate data in object.
 
@@ -40,7 +43,7 @@ class DateTime(object):
         ens_dur_in: np.array(float)
             Duration of each ensemble, in seconds.
         """
-        
+
         self.date = date_in
         self.start_serial_time = start_in
         self.end_serial_time = end_in
@@ -48,7 +51,8 @@ class DateTime(object):
         self.ens_duration_sec = ens_dur_in.astype(float)
 
     def populate_from_qrev_mat(self, transect):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -56,22 +60,19 @@ class DateTime(object):
            Matlab data structure obtained from sio.loadmat
         """
 
-        if hasattr(transect, 'dateTime'):
+        if hasattr(transect, "dateTime"):
             seconds_day = 86400
             time_correction = 719529.0000000003
 
             self.date = transect.dateTime.date
-            self.start_serial_time = (transect.dateTime.startSerialTime - time_correction) * seconds_day
-            self.end_serial_time = (transect.dateTime.endSerialTime - time_correction) * seconds_day
+            self.start_serial_time = (
+                transect.dateTime.startSerialTime - time_correction
+            ) * seconds_day
+            self.end_serial_time = (
+                transect.dateTime.endSerialTime - time_correction
+            ) * seconds_day
             self.transect_duration_sec = float(transect.dateTime.transectDuration_sec)
             try:
                 self.ens_duration_sec = transect.dateTime.ensDuration_sec.astype(float)
             except AttributeError:
                 self.ens_duration_sec = np.array([np.nan])
-
-            #
-            # self.date = transect.dateTime.date
-            # self.start_serial_time = transect.dateTime.startSerialTime
-            # self.end_serial_time = transect.dateTime.endSerialTime
-            # self.transect_duration_sec = float(transect.dateTime.transectDuration_sec)
-            # self.ens_duration_sec = transect.dateTime.ensDuration_sec.astype(float)
diff --git a/qrevint_22_06_22/Classes/DepthData.py b/Classes/DepthData.py
similarity index 70%
rename from qrevint_22_06_22/Classes/DepthData.py
rename to Classes/DepthData.py
index 946908873307ac7467ed20d1f11eff5c0355daa0..a891f7afc27e81eb297599c01ef37aff4d94e33c 100644
--- a/qrevint_22_06_22/Classes/DepthData.py
+++ b/Classes/DepthData.py
@@ -1,7 +1,5 @@
 import copy
-import concurrent.futures
 import numpy as np
-import itertools as it
 from numpy.matlib import repmat
 from MiscLibs.common_functions import iqr, nan_less, nan_greater
 from MiscLibs.robust_loess_compiled import rloess
@@ -10,16 +8,17 @@ from MiscLibs.run_iqr import run_iqr, compute_quantile
 
 
 class DepthData(object):
-    """Process and store depth data.
-    Supported sources include bottom track
+    """Process and store depth data. Supported sources include bottom track
     vertical beam, and external depth sounder.
 
     Attributes
     ----------
         depth_orig_m: np.array
-            Original multi-beam depth data from transect file (includes draft_orig) in meters.
+            Original multi-beam depth data from transect file (includes
+            draft_orig) in meters.
         depth_beams_m: np.array
-            Depth data from transect file adjusted for any draft changes, in meters.
+            Depth data from transect file adjusted for any draft changes,
+            in meters.
         depth_processed_m: np.array
             Depth data filtered and interpolated.
         depth_freq_kHz: float
@@ -37,11 +36,13 @@ class DepthData(object):
         depth_cell_depth_orig_m: np.array
             Depth to centerline of depth cells in raw data, in meters.
         depth_cell_depth_m: np.array
-            Depth to centerline of depth cells adjusted for draft or speed of sound changes, in meters.
+            Depth to centerline of depth cells adjusted for draft or speed
+            of sound changes, in meters.
         depth_cell_size_orig_m: np.array
             Size of depth cells in meters from raw data, in meters.
         depth_cell_size_m:
-            Size of depth cells adjusted for draft or speed of sound changes, in meters.
+            Size of depth cells adjusted for draft or speed of sound
+            changes, in meters.
         smooth_depth: np.array
             Smoothed beam depth, in meters.
         smooth_upper_limit: np.array
@@ -49,7 +50,8 @@ class DepthData(object):
         smooth_lower_limit: np.array
             Smooth function lower limit or window, in meters.
         avg_method:str
-            Defines averaging method: "Simple", "IDW", only applicable to bottom track.
+            Defines averaging method: "Simple", "IDW", only applicable to
+            bottom track.
         filter_type: str
             Type of filter: "None", "TRDI", "Smooth".
         interp_type: str
@@ -61,35 +63,36 @@ class DepthData(object):
         valid_beams: np.array
             Logical array, 1 row for each beam identifying valid data.
     """
-    
-    def __init__(self):
-        """Initialize attributes.
-        """
 
-        self.depth_orig_m = None  # Original multi-beam depth data from transect file (includes draft_orig) in meters
-        self.depth_beams_m = None  # Depth data from transect file adjusted for any draft changes, in meters
-        self.depth_processed_m = None  # Depth data filtered and interpolated
-        self.depth_freq_kHz = None  # Defines ADCP frequency used of each raw data point
-        self.depth_invalid_index = None  # Index of depths marked invalid
-        self.depth_source = None  # Source of depth data ("BT", "VB", "DS")
-        self.depth_source_ens = None  # Source of each depth value ("BT", "VB", "DS", "IN")
-        self.draft_orig_m = None  # Original draft from data files, in meters
-        self.draft_use_m = None  # Draft used in computation of depth_beams_m and depth_cell_depths_m
-        self.depth_cell_depth_orig_m = None  # Depth cell range from the transducer, in meters
-        self.depth_cell_depth_m = None  # Depth to centerline of depth cells, in meters
-        self.depth_cell_size_orig_m = None  # Size of depth cells in meters from raw data
-        self.depth_cell_size_m = None  # Size of depth cells in meters
-        self.smooth_depth = None  # Smoothed beam depth
-        self.smooth_upper_limit = None  # Smooth function upper limit of window
-        self.smooth_lower_limit = None  # Smooth function lowerl limit or window
-        self.avg_method = None  # Defines averaging method: "Simple", "IDW"
-        self.filter_type = None  # Type of filter: "None", "TRDI", "Smooth"
-        self.interp_type = None  # Type of interpolation: "None", "Linear", "Smooth"
-        self.valid_data_method = None  # QRev or TRDI
-        self.valid_data = None  # Logical array of valid mean depth for each ensemble
-        self.valid_beams = None  # Logical array, 1 row for each beam identifying valid data
-        
-    def populate_data(self, depth_in, source_in, freq_in, draft_in, cell_depth_in, cell_size_in):
+    def __init__(self):
+        """Initialize attributes."""
+
+        self.depth_orig_m = None
+        self.depth_beams_m = None
+        self.depth_processed_m = None
+        self.depth_freq_kHz = None
+        self.depth_invalid_index = None
+        self.depth_source = None
+        self.depth_source_ens = None
+        self.draft_orig_m = None
+        self.draft_use_m = None
+        self.depth_cell_depth_orig_m = None
+        self.depth_cell_depth_m = None
+        self.depth_cell_size_orig_m = None
+        self.depth_cell_size_m = None
+        self.smooth_depth = None
+        self.smooth_upper_limit = None
+        self.smooth_lower_limit = None
+        self.avg_method = None
+        self.filter_type = None
+        self.interp_type = None
+        self.valid_data_method = None
+        self.valid_data = None
+        self.valid_beams = None
+
+    def populate_data(
+        self, depth_in, source_in, freq_in, draft_in, cell_depth_in, cell_size_in
+    ):
         """Stores data in DepthData.
 
         Parameters
@@ -103,11 +106,13 @@ class DepthData(object):
         draft_in: float
             Draft of transducer used to measure depths, in meters.
         cell_depth_in: np.array
-            Depth to centerline of each depth cell, in meters. If source does not have depth cells the depth cell depth
+            Depth to centerline of each depth cell, in meters. If source
+            does not have depth cells the depth cell depth
             from bottom track should be used.
         cell_size_in: np.array
-            Size of each depth cell, in meters. If source does not have depth cells the depth cell size
-            from bottom track should be used.
+            Size of each depth cell, in meters. If source does not have
+            depth cells the depth cell size from bottom track should be used.
+
         """
 
         self.depth_orig_m = depth_in
@@ -117,15 +122,15 @@ class DepthData(object):
         self.depth_freq_kHz = freq_in
         self.draft_orig_m = draft_in
         self.draft_use_m = draft_in
-        self.filter_type = 'None'
-        self.interp_type = 'None'
-        self.valid_data_method = 'QRev'
-        
+        self.filter_type = "None"
+        self.interp_type = "None"
+        self.valid_data_method = "QRev"
+
         # For BT data set method to average multiple beam depths
-        if source_in == 'BT':
-            self.avg_method = 'IDW'
+        if source_in == "BT":
+            self.avg_method = "IDW"
         else:
-            self.avg_method = 'None'
+            self.avg_method = "None"
 
         # Store cell data
         self.depth_cell_depth_orig_m = cell_depth_in
@@ -134,10 +139,11 @@ class DepthData(object):
         self.depth_cell_depth_m = cell_depth_in
 
         # Remove all filters to initialize data
-        self.apply_filter('dummy', filter_type='Off')
+        self.apply_filter("dummy", filter_type="Off")
 
     def populate_from_qrev_mat(self, mat_data):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -167,7 +173,7 @@ class DepthData(object):
         self.depth_cell_size_m = mat_data.depthCellSize_m
 
         # Configure arrays properly for VB and DS
-        if mat_data.depthSource == 'BT':
+        if mat_data.depthSource == "BT":
             self.depth_beams_m = mat_data.depthBeams_m
             self.depth_orig_m = mat_data.depthOrig_m
             self.smooth_depth = mat_data.smoothDepth
@@ -197,44 +203,69 @@ class DepthData(object):
 
         self.valid_beams = self.valid_beams.astype(bool)
 
-        # Handle data with one ensemble and multiple cells or one cell and multiple ensembles
+        # Handle data with one ensemble and multiple cells or one cell and
+        # multiple ensembles
         if len(self.depth_beams_m.shape) == 1:
             # One ensemble multiple cells
-            self.depth_beams_m = self.depth_beams_m.reshape(self.depth_beams_m.shape[0], 1)
-            self.depth_cell_depth_m = self.depth_cell_depth_m.reshape(self.depth_cell_depth_m.shape[0], 1)
+            self.depth_beams_m = self.depth_beams_m.reshape(
+                self.depth_beams_m.shape[0], 1
+            )
+            self.depth_cell_depth_m = self.depth_cell_depth_m.reshape(
+                self.depth_cell_depth_m.shape[0], 1
+            )
             self.depth_cell_depth_orig_m = self.depth_cell_depth_orig_m.reshape(
-                self.depth_cell_depth_orig_m.shape[0], 1)
-            self.depth_cell_size_m = self.depth_cell_size_m.reshape(self.depth_cell_size_m.shape[0], 1)
-            self.depth_cell_size_orig_m = self.depth_cell_size_orig_m.reshape(self.depth_cell_size_orig_m.shape[0], 1)
+                self.depth_cell_depth_orig_m.shape[0], 1
+            )
+            self.depth_cell_size_m = self.depth_cell_size_m.reshape(
+                self.depth_cell_size_m.shape[0], 1
+            )
+            self.depth_cell_size_orig_m = self.depth_cell_size_orig_m.reshape(
+                self.depth_cell_size_orig_m.shape[0], 1
+            )
             self.depth_orig_m = self.depth_orig_m.reshape(self.depth_orig_m.shape[0], 1)
             self.depth_processed_m = np.array([self.depth_processed_m])
             self.smooth_depth = self.smooth_depth.reshape(self.smooth_depth.shape[0], 1)
-            self.smooth_lower_limit = self.smooth_lower_limit.reshape(self.smooth_lower_limit.shape[0], 1)
-            self.smooth_upper_limit = self.smooth_upper_limit.reshape(self.smooth_upper_limit.shape[0], 1)
+            self.smooth_lower_limit = self.smooth_lower_limit.reshape(
+                self.smooth_lower_limit.shape[0], 1
+            )
+            self.smooth_upper_limit = self.smooth_upper_limit.reshape(
+                self.smooth_upper_limit.shape[0], 1
+            )
             self.valid_data = np.array([self.valid_data])
             self.depth_source_ens = np.array([mat_data.depthSourceEns])
         elif len(self.depth_cell_depth_m.shape) == 1:
             # One cell, multiple ensembles
-            self.depth_cell_depth_m = self.depth_cell_depth_m.reshape(1, self.depth_cell_depth_m.shape[0])
-            self.depth_cell_depth_orig_m = self.depth_cell_depth_orig_m.reshape(1,
-                                                                                self.depth_cell_depth_orig_m.shape[0])
-            self.depth_cell_size_m = self.depth_cell_size_m.reshape(1, self.depth_cell_size_m.shape[0])
-            self.depth_cell_size_orig_m = self.depth_cell_size_orig_m.reshape(1, self.depth_cell_size_orig_m.shape[0])
+            self.depth_cell_depth_m = self.depth_cell_depth_m.reshape(
+                1, self.depth_cell_depth_m.shape[0]
+            )
+            self.depth_cell_depth_orig_m = self.depth_cell_depth_orig_m.reshape(
+                1, self.depth_cell_depth_orig_m.shape[0]
+            )
+            self.depth_cell_size_m = self.depth_cell_size_m.reshape(
+                1, self.depth_cell_size_m.shape[0]
+            )
+            self.depth_cell_size_orig_m = self.depth_cell_size_orig_m.reshape(
+                1, self.depth_cell_size_orig_m.shape[0]
+            )
 
     def change_draft(self, draft):
         """Changes the draft for object
-        
-        draft: new draft for object
+
+        Parameters
+        ----------
+        draft: float
+            New draft for object
         """
+
         # Compute draft change
         draft_change = draft - self.draft_use_m
         self.draft_use_m = draft
-        
+
         # Apply draft to ensemble depths if BT or VB
-        if self.depth_source != 'DS':
+        if self.depth_source != "DS":
             self.depth_beams_m = self.depth_beams_m + draft_change
-            self.depth_processed_m = self.depth_processed_m + draft_change 
-            
+            self.depth_processed_m = self.depth_processed_m + draft_change
+
         # Apply draft to depth cell locations
         if len(self.depth_cell_depth_m) > 0:
             self.depth_cell_depth_m = self.depth_cell_depth_m + draft_change
@@ -249,7 +280,7 @@ class DepthData(object):
         bt_depths: DepthData
             Object of DepthData with bottom track depths
         """
-        
+
         self.depth_cell_depth_orig_m = bt_depths.depth_cell_depth_orig_m
         self.depth_cell_size_m = bt_depths.depth_cell_size_m
         self.depth_cell_depth_m = bt_depths.depth_cell_depth_m
@@ -271,7 +302,9 @@ class DepthData(object):
         depth[np.logical_not(self.valid_beams)] = np.nan
 
         # Compute average depths
-        self.depth_processed_m = DepthData.average_depth(depth, self.draft_use_m, self.avg_method)
+        self.depth_processed_m = DepthData.average_depth(
+            depth, self.draft_use_m, self.avg_method
+        )
 
         # Set depths to nan if depth are not valid beam depths
         self.depth_processed_m[np.equal(self.valid_data, False)] = np.nan
@@ -288,31 +321,31 @@ class DepthData(object):
         """
 
         # Compute selected filter
-        if filter_type == 'Off' or filter_type is None:
+        if filter_type == "Off" or filter_type is None:
             # No filter
             self.filter_none()
             # Savitzky-Golay
-        elif filter_type == 'SavGol':
+        elif filter_type == "SavGol":
             self.filter_savgol(transect)
-        elif filter_type == 'Smooth':
+        elif filter_type == "Smooth":
             # Smooth filter
             self.filter_smooth(transect)
-        elif filter_type == 'TRDI' and self.depth_source == 'BT':
+        elif filter_type == "TRDI" and self.depth_source == "BT":
             # TRDI filter for multiple returns
             self.filter_trdi()
-            self.filter_type = 'TRDI'
-            
+            self.filter_type = "TRDI"
+
         self.valid_mean_data()
 
         # Update processed depth with filtered results
-        if self.depth_source == 'BT':
+        if self.depth_source == "BT":
             # Multiple beams require averaging to obtain 1-D array
             self.compute_avg_bt_depth()
         else:
             # Single beam (VB or DS) save to 1-D array
             self.depth_processed_m = np.array(self.depth_beams_m[0, :])
             self.depth_processed_m[np.squeeze(np.equal(self.valid_data, 0))] = np.nan
-            
+
     def apply_interpolation(self, transect, method=None):
         """Coordinates application of interpolations
 
@@ -323,29 +356,29 @@ class DepthData(object):
         method: str
             Type of interpolation to apply (None, HoldLast, Smooth, Linear)
         """
-        
+
         # Determine interpolation to apply
         if method is None:
             method = self.interp_type
-            
+
         # Apply selected interpolation
         self.interp_type = method
         # No filtering
-        if method == 'None':
+        if method == "None":
             self.interpolate_none()
 
         # Hold last valid depth indefinitely
-        elif method == 'HoldLast':
+        elif method == "HoldLast":
             self.interpolate_hold_last()
 
         # Use values form a Loess smooth
-        elif method == 'Smooth':
+        elif method == "Smooth":
             self.interpolate_smooth()
 
         # Linear interpolation
         else:
             self.interpolate_linear(transect=transect)
-            
+
         # Identify ensembles with interpolated depths
         idx = np.where(np.logical_not(self.valid_data[:]))
         if len(idx[0]) > 0:
@@ -353,8 +386,8 @@ class DepthData(object):
             idx2 = np.where(np.logical_not(np.isnan(self.depth_processed_m[idx])))
             if len(idx2) > 0:
                 idx2 = idx2[0]
-                self.depth_source_ens[idx[idx2]] = 'IN'
-        
+                self.depth_source_ens[idx[idx2]] = "IN"
+
     def apply_composite(self, comp_depth, comp_source):
         """Applies the data from CompDepth computed in DepthStructure
         to DepthData object
@@ -366,17 +399,17 @@ class DepthData(object):
         comp_source: str
             Source of composite depth (BT, VB, DS)
         """
-        
+
         # Assign composite depth to property
         self.depth_processed_m = comp_depth
-        
+
         # Assign appropriate composite source for each ensemble
-        self.depth_source_ens[comp_source == 1] = 'BT'
-        self.depth_source_ens[comp_source == 2] = 'VB'
-        self.depth_source_ens[comp_source == 3] = 'DS'
-        self.depth_source_ens[comp_source == 4] = 'IN'
-        self.depth_source_ens[comp_source == 0] = 'NA'
-        
+        self.depth_source_ens[comp_source == 1] = "BT"
+        self.depth_source_ens[comp_source == 2] = "VB"
+        self.depth_source_ens[comp_source == 3] = "DS"
+        self.depth_source_ens[comp_source == 4] = "IN"
+        self.depth_source_ens[comp_source == 0] = "NA"
+
     def sos_correction(self, ratio):
         """Correct depth for new speed of sound setting
 
@@ -385,53 +418,60 @@ class DepthData(object):
         ratio: float
             Ratio of new to old speed of sound value
         """
-        
+
         # Correct unprocessed depths
-        self.depth_beams_m = self.draft_use_m+np.multiply(self.depth_beams_m-self.draft_use_m, ratio)
-        
+        self.depth_beams_m = self.draft_use_m + np.multiply(
+            self.depth_beams_m - self.draft_use_m, ratio
+        )
+
         # Correct processed depths
-        self.depth_processed_m = self.draft_use_m+np.multiply(self.depth_processed_m-self.draft_use_m, ratio)
-        
+        self.depth_processed_m = self.draft_use_m + np.multiply(
+            self.depth_processed_m - self.draft_use_m, ratio
+        )
+
         # Correct cell size and location
         self.depth_cell_size_m = np.multiply(self.depth_cell_size_m, ratio)
-        self.depth_cell_depth_m = self.draft_use_m + np.multiply(self.depth_cell_depth_m - self.draft_use_m, ratio)
-        
+        self.depth_cell_depth_m = self.draft_use_m + np.multiply(
+            self.depth_cell_depth_m - self.draft_use_m, ratio
+        )
+
     def valid_mean_data(self):
-        """Determines if raw data are sufficient to compute a valid depth without interpolation.
+        """Determines if raw data are sufficient to compute a valid depth
+        without interpolation.
         """
-        
-        if self.depth_source == 'BT':
+
+        if self.depth_source == "BT":
             self.valid_data = np.tile(True, self.valid_beams.shape[1])
             nvalid = np.sum(self.valid_beams, axis=0)
-            
-            if self.valid_data_method == 'TRDI':
+
+            if self.valid_data_method == "TRDI":
                 self.valid_data[nvalid < 3] = False
             else:
                 self.valid_data[nvalid < 2] = False
         else:
             self.valid_data = self.valid_beams[0, :]
-            
+
     def filter_none(self):
-        """Applies no filter to depth data. Removes filter if one was applied.
-        """
-        
+        """Applies no filter to depth data. Removes filter if one was applied."""
+
         # Set all ensembles to have valid data
         if len(self.depth_beams_m.shape) > 1:
             self.valid_beams = np.tile(True, self.depth_beams_m.shape)
         else:
             self.valid_beams = np.tile(True, (1, self.depth_beams_m.shape[0]))
-        
+
         # Set ensembles with no depth data to invalid
         self.valid_beams[self.depth_beams_m == 0] = False
         self.valid_beams[np.isnan(self.depth_beams_m)] = False
-        
-        self.filter_type = 'None'
-        
+
+        self.filter_type = "None"
+
     def filter_smooth(self, transect):
-        """This filter uses a moving InterQuartile Range filter on residuals from a
-        robust Loess smooth of the depths in each beam to identify unnatural spikes in the depth
-        measurements from each beam.  Each beam is filtered independently.  The filter
-        criteria are set to be the maximum of the IQR filter, 5% of the measured depth, or 0.1 meter
+        """This filter uses a moving InterQuartile Range filter on residuals
+        from a robust Loess smooth of the depths in each beam
+        to identify unnatural spikes in the depth measurements from each beam.
+        Each beam is filtered independently. The filter criteria are set
+        to be the maximum of the IQR filter, 5% of the measured depth, or 0.1 meter
 
         Parameters
         ----------
@@ -440,25 +480,26 @@ class DepthData(object):
 
         Notes
         -----
-        half_width - number of points to each side of target point used in computing IQR.
-            This is the raw number of points actual points used may be less if some are bad.
+        half_width - number of points to each side of target point used in
+        computing IQR. This is the raw number of points actual points used may be less
+        if some are bad.
 
-        multiplier - number multiplied times the IQR to determine the filter criteria
-        
+        multiplier - number multiplied times the IQR to determine the filter
+        criteria
         """
 
         # If the smoothed depth has not been computed
         if self.smooth_depth is None or len(self.smooth_depth) == 0:
-            
+
             # Set filter characteristics
-            self.filter_type = 'Smooth'
-            # cycles = 3
-            # half_width = 10
-            # multiplier = 15
-            
+            self.filter_type = "Smooth"
+
             # Determine number of beams
             if len(self.depth_orig_m.shape) > 1:
-                n_beams, n_ensembles = self.depth_orig_m.shape[0], self.depth_orig_m.shape[1]
+                n_beams, n_ensembles = (
+                    self.depth_orig_m.shape[0],
+                    self.depth_orig_m.shape[1],
+                )
                 depth_raw = np.copy(self.depth_orig_m)
             else:
                 n_beams = 1
@@ -470,7 +511,6 @@ class DepthData(object):
 
             # Arrays initialized
             depth_smooth = repmat([np.nan], n_beams, n_ensembles)
-            # depth_res = repmat([np.nan], n_beams, n_ensembles)
             upper_limit = repmat([np.nan], n_beams, n_ensembles)
             lower_limit = repmat([np.nan], n_beams, n_ensembles)
             depth_filtered = depth
@@ -479,34 +519,29 @@ class DepthData(object):
             # Create position array
             boat_vel_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
             if boat_vel_selected is not None:
-                track_x = boat_vel_selected.u_processed_mps * transect.date_time.ens_duration_sec
-                track_y = boat_vel_selected.v_processed_mps * transect.date_time.ens_duration_sec
+                track_x = (
+                    boat_vel_selected.u_processed_mps
+                    * transect.date_time.ens_duration_sec
+                )
+                track_y = (
+                    boat_vel_selected.v_processed_mps
+                    * transect.date_time.ens_duration_sec
+                )
             else:
                 track_x = np.nan
                 track_y = np.nan
 
             idx = np.where(np.isnan(track_x))
             if len(idx[0]) < 2:
-                x = np.nancumsum(np.sqrt(track_x**2+track_y**2))
+                x = np.nancumsum(np.sqrt(track_x**2 + track_y**2))
             else:
                 x = np.nancumsum(transect.date_time.ens_duration_sec)
 
-            multi_processing = False
-            # start = time.perf_counter()
-            if multi_processing:
-                with concurrent.futures.ProcessPoolExecutor() as executor:
-                    results = executor.map(self.compute_smooth, depth, depth_filtered, it.repeat(x))
-
-                for j, result in enumerate(results):
-                    depth_smooth[j] = result[0]
-                    upper_limit[j] = result[1]
-                    lower_limit[j] = result[2]
-            else:
-                # Loop for each beam, smooth is applied to each beam
-                for j in range(n_beams):
-                    depth_smooth[j], upper_limit[j], lower_limit[j] = self.compute_smooth(depth[j],
-                                                                                          depth_filtered[j],
-                                                                                          x)
+            # Loop for each beam, smooth is applied to each beam
+            for j in range(n_beams):
+                depth_smooth[j], upper_limit[j], lower_limit[j] = self.compute_smooth(
+                    depth[j], depth_filtered[j], x
+                )
 
             # Save smooth results to avoid recomputing them if needed later
             self.smooth_depth = depth_smooth
@@ -515,13 +550,16 @@ class DepthData(object):
 
         # Reset valid data
         self.filter_none()
-        
+
         # Set filter type
-        self.filter_type = 'Smooth'
-        
+        self.filter_type = "Smooth"
+
         # Determine number of beams
         if len(self.depth_orig_m.shape) > 1:
-            n_beams, n_ensembles = self.depth_orig_m.shape[0], self.depth_orig_m.shape[1]
+            n_beams, n_ensembles = (
+                self.depth_orig_m.shape[0],
+                self.depth_orig_m.shape[1],
+            )
             depth_raw = np.copy(self.depth_orig_m)
         else:
             n_beams = 1
@@ -533,13 +571,16 @@ class DepthData(object):
         # Set bad depths to nan
         depth = repmat(np.nan, depth_raw.shape[0], depth_raw.shape[1])
         depth[nan_greater(depth_raw, 0)] = depth_raw[nan_greater(depth_raw, 0)]
-        
+
         # Apply filter
         for j in range(n_beams):
             if np.nansum(self.smooth_upper_limit[j, :]) > 0:
                 bad_idx = np.where(
-                    np.logical_or(nan_greater(depth[j], self.smooth_upper_limit[j]),
-                                  nan_less(depth[j], self.smooth_lower_limit[j])))[0]
+                    np.logical_or(
+                        nan_greater(depth[j], self.smooth_upper_limit[j]),
+                        nan_less(depth[j], self.smooth_lower_limit[j]),
+                    )
+                )[0]
                 # Update depth matrix
                 depth_res[j, bad_idx] = np.nan
 
@@ -559,7 +600,7 @@ class DepthData(object):
         lower_limit = np.nan
 
         # At least 50% of the data in a beam must be valid to apply the smooth
-        # if np.nansum((np.isnan(depth_filtered) == False) / len(depth_filtered)) > .5:
+        # if np.nansum((np.isnan(depth_filtered) == False) / len( depth_filtered)) > .5:
         # Compute residuals based on robust loess smooth
         if len(x) > 1:
             # Fit smooth
@@ -585,14 +626,24 @@ class DepthData(object):
 
             # Compute filter criteria and apply appropriate
             criteria = multiplier * fill_array
-            idx = np.where(nan_less(criteria, np.max(np.vstack((depth * .05,
-                                                                np.ones(depth.shape) / 10)), 0)))[0]
+            idx = np.where(
+                nan_less(
+                    criteria,
+                    np.max(np.vstack((depth * 0.05, np.ones(depth.shape) / 10)), 0),
+                )
+            )[0]
             if len(idx) > 0:
-                criteria[idx] = np.max(np.vstack((depth[idx] * .05, np.ones(idx.shape) / 10)), 0)
+                criteria[idx] = np.max(
+                    np.vstack((depth[idx] * 0.05, np.ones(idx.shape) / 10)), 0
+                )
 
             # Compute limits
             upper_limit = depth_smooth + criteria
-            idx = np.where(np.logical_or(np.greater(upper_limit, max_upper_limit), np.isnan(upper_limit)))[0]
+            idx = np.where(
+                np.logical_or(
+                    np.greater(upper_limit, max_upper_limit), np.isnan(upper_limit)
+                )
+            )[0]
             if len(idx) > 0:
                 upper_limit[idx] = max_upper_limit
             lower_limit = depth_smooth - criteria
@@ -600,9 +651,11 @@ class DepthData(object):
             lower_limit[idx] = 0
 
             bad_idx = np.where(
-                np.logical_or(nan_greater(depth, upper_limit), nan_less(depth, lower_limit)))[0]
+                np.logical_or(
+                    nan_greater(depth, upper_limit), nan_less(depth, lower_limit)
+                )
+            )[0]
             # Update depth matrix
-            # depth_res[bad_idx] = np.nan
             if len(bad_idx) == 0:
                 break
             else:
@@ -619,11 +672,12 @@ class DepthData(object):
         return depth_smooth, upper_limit, lower_limit
 
     def filter_savgol(self, transect):
-        """This filter uses a moving InterQuartile Range filter on residuals from a
-        a Savitzky-Golay filter on y with non-uniform spaced x
+        """This filter uses a moving InterQuartile Range filter on residuals
+        from a Savitzky-Golay filter on y with non-uniform spaced x
         of the depths in each beam to identify unnatural spikes in the depth
-        measurements from each beam.  Each beam is filtered independently.  The filter
-        criteria are set to be the maximum of the IQR filter, 5% of the measured depth, or 0.1 meter
+        measurements from each beam.  Each beam is filtered independently.
+        The filter criteria are set to be the maximum of the IQR filter,
+        5% of the measured depth, or 0.1 meter
 
         Parameters
         ----------
@@ -632,17 +686,21 @@ class DepthData(object):
 
         Notes
         -----
-        half_width - number of points to each side of target point used in computing IQR.
-            This is the raw number of points actual points used may be less if some are bad.
-
-        multiplier - number multiplied times the IQR to determine the filter criteria
+        half_width - number of points to each side of target point used in
+        computing IQR. This is the raw number of points actual points used
+        may be less if some are bad.
 
+        multiplier - number multiplied times the IQR to determine the filter
+        criteria
         """
 
         # Determine number of beams
         if len(self.depth_orig_m.shape) > 1:
             # For slant beams
-            n_beams, n_ensembles = self.depth_orig_m.shape[0], self.depth_orig_m.shape[1]
+            n_beams, n_ensembles = (
+                self.depth_orig_m.shape[0],
+                self.depth_orig_m.shape[1],
+            )
             depth_raw = np.copy(self.depth_orig_m)
         else:
             # For vertical beam or depth sounder
@@ -658,7 +716,7 @@ class DepthData(object):
         if self.smooth_depth is None:
 
             # Set filter characteristics
-            self.filter_type = 'SavGol'
+            self.filter_type = "SavGol"
             cycles = 3
             half_width = 10
             multiplier = 15
@@ -669,20 +727,27 @@ class DepthData(object):
             upper_limit = repmat([np.nan], n_beams, n_ensembles)
             lower_limit = repmat([np.nan], n_beams, n_ensembles)
 
-            # Create position array. If there are insufficient track data use elapsed time
+            # Create position array. If there are insufficient track data
+            # use elapsed time
             boat_vel_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
-            if boat_vel_selected is not None and \
-                    np.nansum(np.isnan(boat_vel_selected.u_processed_mps)) < 2:
-                track_x = boat_vel_selected.u_processed_mps * transect.date_time.ens_duration_sec
-                track_y = boat_vel_selected.v_processed_mps * transect.date_time.ens_duration_sec
-                x = np.nancumsum(np.sqrt(track_x ** 2 + track_y ** 2))
+            if (
+                boat_vel_selected is not None
+                and np.nansum(np.isnan(boat_vel_selected.u_processed_mps)) < 2
+            ):
+                track_x = (
+                    boat_vel_selected.u_processed_mps
+                    * transect.date_time.ens_duration_sec
+                )
+                track_y = (
+                    boat_vel_selected.v_processed_mps
+                    * transect.date_time.ens_duration_sec
+                )
+                x = np.nancumsum(np.sqrt(track_x**2 + track_y**2))
             else:
                 x = np.nancumsum(transect.date_time.ens_duration_sec)
 
             # Loop for each beam, smooth is applied to each beam
             for j in range(n_beams):
-                # At least 50% of the data in a beam must be valid to apply the smooth
-                # if np.nansum((np.isnan(depth[j, :]) == False) / depth.shape[0]) > .5:
 
                 # Compute residuals based on non-uniform Savitzky-Golay
                 try:
@@ -700,23 +765,36 @@ class DepthData(object):
                 for n in range(cycles - 1):
 
                     # Compute inner quartile range
-                    # fill_array = DepthData.run_iqr(half_width, depth_res[j, :])
+
                     fill_array = run_iqr(half_width, depth_res[j, :])
                     # Compute filter criteria
                     criteria = multiplier * fill_array
 
-                    # Adjust criteria so that it is never less than 5% of depth or 0.1 m which ever is greater
-                    idx = np.where(criteria < np.max(np.vstack((depth[j, :] * .05,
-                                                                np.ones(depth.shape) / 10)), 0))[0]
+                    # Adjust criteria so that it is never less than 5% of
+                    # depth or 0.1 m which ever is greater
+                    idx = np.where(
+                        criteria
+                        < np.max(
+                            np.vstack((depth[j, :] * 0.05, np.ones(depth.shape) / 10)),
+                            0,
+                        )
+                    )[0]
                     if len(idx) > 0:
-                        criteria[idx] = np.max(np.vstack((depth[j, idx] * .05, np.ones(idx.shape) / 10)), 0)
+                        criteria[idx] = np.max(
+                            np.vstack((depth[j, idx] * 0.05, np.ones(idx.shape) / 10)),
+                            0,
+                        )
 
                     # Compute limits
                     upper_limit[j] = depth_smooth[j, :] + criteria
                     lower_limit[j] = depth_smooth[j, :] - criteria
 
-                    bad_idx = np.where(np.logical_or(np.greater(depth[j], upper_limit[j]),
-                                                     np.less(depth[j], lower_limit[j])))[0]
+                    bad_idx = np.where(
+                        np.logical_or(
+                            np.greater(depth[j], upper_limit[j]),
+                            np.less(depth[j], lower_limit[j]),
+                        )
+                    )[0]
                     # Update residual matrix
                     depth_res[j, bad_idx] = np.nan
 
@@ -729,14 +807,17 @@ class DepthData(object):
         self.filter_none()
 
         # Set filter type
-        self.filter_type = 'SavGol'
+        self.filter_type = "SavGol"
 
         # Apply filter
         for j in range(n_beams):
             if np.nansum(self.smooth_upper_limit[j]) > 0:
                 bad_idx = np.where(
-                    np.logical_or(np.greater(depth[j], self.smooth_upper_limit[j]),
-                                  np.less(depth[j], self.smooth_lower_limit[j])))[0]
+                    np.logical_or(
+                        np.greater(depth[j], self.smooth_upper_limit[j]),
+                        np.less(depth[j], self.smooth_lower_limit[j]),
+                    )
+                )[0]
             else:
                 bad_idx = np.isnan(depth[j])
 
@@ -744,64 +825,64 @@ class DepthData(object):
             self.valid_beams[j, bad_idx] = False
 
     def interpolate_none(self):
-        """Applies no interpolation.
-        """
-        
+        """Applies no interpolation."""
+
         # Compute processed depth without interpolation
-        if self.depth_source == 'BT':
+        if self.depth_source == "BT":
             # Bottom track methods
             self.compute_avg_bt_depth()
         else:
             # Vertical beam or depth sounder depths
             self.depth_processed_m = self.depth_beams_m[0, :]
-            
+
         self.depth_processed_m[np.squeeze(np.equal(self.valid_data, False))] = np.nan
-        
+
         # Set interpolation type
-        self.interp_type = 'None'
-        
+        self.interp_type = "None"
+
     def interpolate_hold_last(self):
-        """This function holds the last valid value until the next valid data point.
+        """This function holds the last valid value until the next valid
+        data point.
         """
-        
+
         # Get number of ensembles
         n_ensembles = len(self.depth_processed_m)
-        
+
         # Process data by ensemble
         for n in range(1, n_ensembles):
-            
-            # If current ensemble's depth is invalid assign depth from previous example
+
+            # If current ensemble's depth is invalid assign depth from
+            # previous example
             if not self.valid_data[n]:
-                self.depth_processed_m[n] = self.depth_processed_m[n-1]
+                self.depth_processed_m[n] = self.depth_processed_m[n - 1]
 
     def interpolate_next(self):
-        """This function back fills with the next valid value.
-        """
+        """This function back fills with the next valid value."""
 
         # Get number of ensembles
         n_ens = len(self.depth_processed_m)
 
         # Process data by ensemble
-        for n in np.arange(0, n_ens-1)[::-1]:
+        for n in np.arange(0, n_ens - 1)[::-1]:
 
-            # If current ensemble's depth is invalid assign depth from previous example
+            # If current ensemble's depth is invalid assign depth from
+            # previous example
             if not self.valid_data[n]:
                 self.depth_processed_m[n] = self.depth_processed_m[n + 1]
 
     def interpolate_smooth(self):
-        """Apply interpolation based on the robust loess smooth
-        """
-        
-        self.interp_type = 'Smooth'
-        
+        """Apply interpolation based on the robust loess smooth"""
+
+        self.interp_type = "Smooth"
+
         # Get depth data from object
         depth_new = self.depth_beams_m
-        
+
         # Update depth data with interpolated depths
         depth_new[not self.valid_beams] = self.smooth_depth[not self.valid_beams]
-        
+
         # Compute processed depths with interpolated values
-        if self.depth_source == 'BT':
+        if self.depth_source == "BT":
             # Temporarily change self.depth_beams_m to compute average
             # for bottom track based depths
             temp_save = copy.deepcopy(self.depth_beams_m)
@@ -812,13 +893,12 @@ class DepthData(object):
         else:
             # Assignment for VB or DS
             self.depth_processed_m = depth_new[0, :]
-            
+
     def interpolate_linear(self, transect):
-        """Apply linear interpolation
-        """
-        
+        """Apply linear interpolation"""
+
         # Set interpolation type
-        self.interp_type = 'Linear'
+        self.interp_type = "Linear"
 
         # Create position array
         select = getattr(transect.boat_vel, transect.boat_vel.selected)
@@ -828,38 +908,43 @@ class DepthData(object):
             track_x = boat_vel_x * transect.date_time.ens_duration_sec
             track_y = boat_vel_y * transect.date_time.ens_duration_sec
         else:
-            select = getattr(transect.boat_vel, 'bt_vel')
+            select = getattr(transect.boat_vel, "bt_vel")
             track_x = np.tile(np.nan, select.u_processed_mps.shape)
             track_y = np.tile(np.nan, select.v_processed_mps.shape)
-              
+
         idx = np.where(np.isnan(track_x[1:]))
-        
-        # If the navigation reference has no gaps use it for interpolation, if not use time
+
+        # If the navigation reference has no gaps use it for interpolation,
+        # if not use time
         if len(idx[0]) < 1:
             x = np.nancumsum(np.sqrt(track_x**2 + track_y**2))
         else:
             # Compute accumulated time
             x = np.nancumsum(transect.date_time.ens_duration_sec)
-            
+
         # Determine number of beams
         n_beams = self.depth_beams_m.shape[0]
         depth_mono = copy.deepcopy(self.depth_beams_m)
         depth_new = copy.deepcopy(self.depth_beams_m)
-        
-#       Create strict monotonic arrays for depth and track by identifying duplicate
-#       track values.  The first track value is used and the remaining duplicates
-#       are set to nan.  The depth assigned to that first track value is the average
-#       of all duplicates.  The depths for the duplicates are then set to nan.  Only
-#       valid strictly monotonic track and depth data are used for the input in to linear
-#       interpolation.   Only the interpolated data for invalid depths are added
-#       to the valid depth data to create depth_new
+
+        # Create strict monotonic arrays for depth and track by
+        # identifying duplicate track values.
+        # The first track value is used and the remaining duplicates
+        # are set to nan.  The depth assigned to that first track
+        # value is the average of all duplicates.
+        # The depths for the duplicates are then set to nan.  Only
+        # valid strictly monotonic track and depth data are used for
+        # the input in to linear interpolation.
+        # Only the interpolated data for invalid depths are added
+        # to the valid depth data to create depth_new
 
         x_mono = x
-        
+
         idx0 = np.where(np.diff(x) == 0)[0]
         if len(idx0) > 0:
             if len(idx0) > 1:
-                # Split array into subarrays in proper sequence e.g [[2,3,4],[7,8,9]] etc.
+                # Split array into subarrays in proper sequence e.g [[2,3,
+                # 4],[7,8,9]] etc.
                 idx1 = np.add(np.where(np.diff(idx0) != 1)[0], 1)
                 group = np.split(idx0, idx1)
 
@@ -876,7 +961,7 @@ class DepthData(object):
                 depth_mono[:, indices[0]] = depth_avg
                 depth_mono[:, indices[1:]] = np.nan
                 x[indices[1:]] = np.nan
-                
+
         # Interpolate each beam
 
         for n in range(n_beams):
@@ -889,13 +974,23 @@ class DepthData(object):
 
             if np.sum(valid) > 1:
                 # Compute interpolation function from all valid data
-                depth_int = np.interp(x_mono, x_mono[valid], depth_mono[n, valid], left=np.nan, right=np.nan)
+                depth_int = np.interp(
+                    x_mono,
+                    x_mono[valid],
+                    depth_mono[n, valid],
+                    left=np.nan,
+                    right=np.nan,
+                )
                 # Fill in invalid data with interpolated data
-                depth_new[n, np.logical_not(self.valid_beams[n])] = depth_int[np.logical_not(self.valid_beams[n])]
+                depth_new[n, np.logical_not(self.valid_beams[n])] = depth_int[
+                    np.logical_not(self.valid_beams[n])
+                ]
 
-        if self.depth_source == 'BT':
+        if self.depth_source == "BT":
             # Bottom track depths
-            self.depth_processed_m = self.average_depth(depth_new, self.draft_use_m, self.avg_method)
+            self.depth_processed_m = self.average_depth(
+                depth_new, self.draft_use_m, self.avg_method
+            )
         else:
             # Vertical beam or depth sounder depths
             self.depth_processed_m = np.copy(depth_new[0, :])
@@ -907,31 +1002,35 @@ class DepthData(object):
         Parameters
         ----------
         depth: np.array(float)
-            Individual beam depths for each beam in each ensemble including the draft
+            Individual beam depths for each beam in each ensemble including
+            the draft
         draft: float
             Draft of ADCP
         method: str
             Averaging method (Simple, IDW)
-        
+
         Returns
         -------
         avg_depth: np.array(float)
             Average depth for each ensemble
-        
+
         """
-        if method == 'Simple':
+        if method == "Simple":
             avg_depth = np.nanmean(depth, 0)
         else:
             # Compute inverse weighted mean depth
             rng = depth - draft
             w = 1 - np.divide(rng, np.nansum(rng, 0))
-            avg_depth = draft+np.nansum(np.divide((rng * w), np.nansum(w, 0), where=np.nansum(w, 0) != 0), 0)
+            avg_depth = draft + np.nansum(
+                np.divide((rng * w), np.nansum(w, 0), where=np.nansum(w, 0) != 0), 0
+            )
             avg_depth[avg_depth == draft] = np.nan
 
         return avg_depth
 
     def filter_trdi(self):
-        """Filter used by TRDI to filter out multiple reflections that get digitized as depth.
+        """Filter used by TRDI to filter out multiple reflections that get
+        digitized as depth.
         """
 
         # Assign raw depth data to local variable
@@ -944,7 +1043,7 @@ class DepthData(object):
         self.filter_none()
 
         # Set filter type to TRDI
-        self.filter_type = 'TRDI'
+        self.filter_type = "TRDI"
 
         for n in range(n_beams):
             depth_ratio = depth_raw[n, :] / depth_raw
@@ -952,28 +1051,32 @@ class DepthData(object):
             exceeded_ens = np.nansum(exceeded, 0)
             self.valid_beams[n, exceeded_ens > 0] = False
 
-    # ============================================================================================
+    # =======================================================================
     # The methods below are not being used.
-    # The methods have been moved to separate files and compiled using Numba AOT.
+    # The methods have been moved to separate files and compiled using Numba
+    # AOT.
     # The methods below are included here for historical purposes
-    # and may provide an easier approach to adding new features/algorithms prior to recoding
-    # them in a manner that can be compiled using Numba AOT.
-    # =============================================================================================
+    # and may provide an easier approach to adding new features/algorithms
+    # prior to recoding them in a manner that can be compiled using Numba AOT.
+    # ======================================================================
     @staticmethod
     def run_iqr(half_width, data):
         """Computes a running Innerquartile Range
-        The routine accepts a column vector as input.  "halfWidth" number of data
+        The routine accepts a column vector as input.
+        "halfWidth" number of data
         points for computing the Innerquartile Range are selected before and
         after the target data point, but no including the target data point.
-        Near the ends of the series the number of points before or after are reduced.
-        Nan in the data are counted as points.  The IQR is computed on the slected
-        subset of points.  The process occurs for each point in the provided column vector.
+        Near the ends of the series the number of points before or after are
+        reduced.  Nan in the data are counted as points.
+        The IQR is computed on the slected subset of points.
+        The process occurs for each point in the provided column vector.
         A column vector with the computed IQR at each point is returned.
 
         Parameters
         ----------
         half_width: int
-            Number of ensembles before and after current ensemble which are used to compute the IQR
+            Number of ensembles before and after current ensemble which are
+            used to compute the IQR
         data: np.array(float)
             Data for which the IQR is computed
         """
@@ -990,19 +1093,21 @@ class DepthData(object):
 
             # Sample selection for 1st point
             if n == 0:
-                sample = data[1:1 + half_width]
+                sample = data[1 : 1 + half_width]
 
             # Sample selection a end of data set
             elif n + half_width > npts:
-                sample = np.hstack([data[n - half_width - 1:n - 1], data[n:npts]])
+                sample = np.hstack([data[n - half_width - 1 : n - 1], data[n:npts]])
 
             # Sample selection at beginning of data set
             elif half_width >= n + 1:
-                sample = np.hstack([data[0:n], data[n + 1:n + half_width + 1]])
+                sample = np.hstack([data[0:n], data[n + 1 : n + half_width + 1]])
 
             # Sample selection in body of data set
             else:
-                sample = np.hstack([data[n - half_width:n], data[n + 1:n + half_width + 1]])
+                sample = np.hstack(
+                    [data[n - half_width : n], data[n + 1 : n + half_width + 1]]
+                )
 
             iqr_array.append(iqr(sample))
 
diff --git a/qrevint_22_06_22/Classes/DepthStructure.py b/Classes/DepthStructure.py
similarity index 58%
rename from qrevint_22_06_22/Classes/DepthStructure.py
rename to Classes/DepthStructure.py
index 4dcb2c6bbdb9445e065259fb056f92fc31c6d6bf..fe615a05d80375c8f2f6323bb2a29ea5b7c32808 100644
--- a/qrevint_22_06_22/Classes/DepthStructure.py
+++ b/Classes/DepthStructure.py
@@ -3,7 +3,8 @@ from Classes.DepthData import DepthData
 
 
 class DepthStructure(object):
-    """This class creates the data structure used store depths from different sources
+    """This class creates the data structure used store depths from
+    different sources
 
     Attributes
     ----------
@@ -18,62 +19,72 @@ class DepthStructure(object):
     composite: str
         Indicates use of composite depths ("On" or "Off".
     """
-    
+
     def __init__(self):
         """Creates object and initializes variables to None"""
 
-        self.selected = None  # name of object DepthData that contains the depth data for q computation
-        self.bt_depths = None  # object of DepthData for by depth data
-        self.vb_depths = None  # object of DepthData for vertical beam depth data
-        self.ds_depths = None  # object of DepthData for depth sounder depth data
-        self.composite = "On"  # Turn composite depths "on" or "off"
+        self.selected = None
+        self.bt_depths = None
+        self.vb_depths = None
+        self.ds_depths = None
+        self.composite = "On"
 
-    def add_depth_object(self, depth_in, source_in, freq_in, draft_in, cell_depth_in, cell_size_in):
-        """Adds a DepthData object to the depth structure for the specified type of depths.
+    def add_depth_object(
+        self, depth_in, source_in, freq_in, draft_in, cell_depth_in, cell_size_in
+    ):
+        """Adds a DepthData object to the depth structure for the specified
+        type of depths.
 
         Parameters
         ----------
         depth_in: np.array
             Depth data in meters.
         source_in: str
-            Specifies source of depth data: bottom track (BT), vertical beam (VB), or depth sounder (DS)
+            Specifies source of depth data: bottom track (BT), vertical beam
+            (VB), or depth sounder (DS)
         freq_in: np.array
             Acoustic frequency in kHz of beams used to determine depth.
         draft_in:
             Draft of transducer (in meters) used to measure depths.
         cell_depth_in
-            Depth of each cell in the profile. If the referenced depth does not have depth cells the depth cell
-            values from the bottom track (BT) depths should be used.
+            Depth of each cell in the profile. If the referenced depth does
+            not have depth cells the depth cell values from the bottom track
+            (BT) depths should be used.
         cell_size_in
-            Size of each depth cell. If the referenced depth does not have depth cells the cell size from
-            the bottom track (BT) depths should be used.
+            Size of each depth cell. If the referenced depth does not have
+            depth cells the cell size from the bottom track (BT)
+            depths should be used.
         """
 
-        if source_in == 'BT':
+        if source_in == "BT":
             self.bt_depths = DepthData()
-            self.bt_depths.populate_data(depth_in, source_in, freq_in, draft_in, cell_depth_in, cell_size_in)
-        elif source_in == 'VB':
+            self.bt_depths.populate_data(
+                depth_in, source_in, freq_in, draft_in, cell_depth_in, cell_size_in
+            )
+        elif source_in == "VB":
             self.vb_depths = DepthData()
-            self.vb_depths.populate_data(depth_in, source_in, freq_in, draft_in, cell_depth_in, cell_size_in)
-        elif source_in == 'DS':
+            self.vb_depths.populate_data(
+                depth_in, source_in, freq_in, draft_in, cell_depth_in, cell_size_in
+            )
+        elif source_in == "DS":
             self.ds_depths = DepthData()
-            self.ds_depths.populate_data(depth_in, source_in, freq_in, draft_in, cell_depth_in, cell_size_in)
+            self.ds_depths.populate_data(
+                depth_in, source_in, freq_in, draft_in, cell_depth_in, cell_size_in
+            )
 
     def populate_from_qrev_mat(self, transect):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
         transect: mat_struct
            Matlab data structure obtained from sio.loadmat
         """
-        if hasattr(transect, 'depths'):
+        if hasattr(transect, "depths"):
 
-            # try:
             self.bt_depths = DepthData()
             self.bt_depths.populate_from_qrev_mat(transect.depths.btDepths)
-            # except AttributeError:
-            #     self.bt_depths = None
 
             try:
                 self.vb_depths = DepthData()
@@ -87,29 +98,40 @@ class DepthStructure(object):
             except AttributeError:
                 self.ds_depths = None
 
-            if transect.depths.selected == 'btDepths':
-                self.selected = 'bt_depths'
-            elif transect.depths.selected == 'vbDepths':
-                self.selected = 'vb_depths'
-            elif transect.depths.selected == 'dsDepths':
-                self.selected = 'ds_depths'
+            if (
+                transect.depths.selected == "btDepths"
+                or transect.depths.selected == "bt_depths"
+            ):
+                self.selected = "bt_depths"
+            elif (
+                transect.depths.selected == "vbDepths"
+                or transect.depths.selected == "vb_depths"
+            ):
+                self.selected = "vb_depths"
+            elif (
+                transect.depths.selected == "dsDepths"
+                or transect.depths.selected == "ds_depths"
+            ):
+                self.selected = "ds_depths"
+            else:
+                self.selected = "bt_depths"
             self.composite = transect.depths.composite
             if self.vb_depths is None and self.ds_depths is None:
-                self.composite = 'Off'
+                self.composite = "Off"
 
     def composite_depths(self, transect, setting="Off"):
         """Depth composite is based on the following assumptions
-        
-        1. If a depth sounder is available the user must have assumed the ADCP beams
-        (BT or vertical) might have problems and it will be the second alternative if 
-        not selected as the preferred source
-        
-        2. For 4-beam BT depths, if 3 beams are valid the average is considered valid.
-        It may be based on interpolation of the invalid beam.  However, if only 2 beams
-        are valid even though the other two beams may be interpolated and included in the average the
-        average will be replaced by an alternative if available.  If no alternative is 
-        available the multi-beam average based on available beams and interpolation will
-        be used.
+
+        1. If a depth sounder is available the user must have assumed the
+        ADCP beams (BT or vertical) might have problems
+        and it will be the second alternative if not selected as the preferred source
+
+        2. For 4-beam BT depths, if 3 beams are valid the average is
+        considered valid. It may be based on interpolation of the invalid beam.
+        However, if only 2 beams are valid even though the other two beams may be
+        interpolated and included in the average the average will be replaced by an
+        alternative if available.  If no alternative is available the multi-beam average
+        based on available beams and interpolation will be used.
 
         Parameters
         ----------
@@ -118,87 +140,145 @@ class DepthStructure(object):
         setting: str
             Setting to use ("On") or not use ("Off") composite depths.
         """
-        
+
         if setting is None:
             setting = self.composite
         else:
             self.composite = setting
-            
+
         # The primary depth reference is the selected reference
         ref = self.selected
         comp_depth = np.array([])
 
-        if setting == 'On':
-            # Prepare vector of valid BT averages, which are defined as having at least 2 valid beams
+        if setting == "On":
+            # Prepare vector of valid BT averages, which are defined as
+            # having at least 2 valid beams
             bt_valid = self.bt_depths.valid_data
             n_ensembles = bt_valid.shape[-1]
             bt_filtered = np.copy(self.bt_depths.depth_processed_m)
             bt_filtered[np.logical_not(bt_valid)] = np.nan
-            
-            # Prepare vertical beam data, using only data prior to interpolation
+
+            # Prepare vertical beam data, using only data prior to
+            # interpolation
             if self.vb_depths is not None:
                 vb_filtered = np.copy(self.vb_depths.depth_processed_m)
-                vb_filtered[np.squeeze(np.equal(self.vb_depths.valid_data, False))] = np.nan
+                vb_filtered[
+                    np.squeeze(np.equal(self.vb_depths.valid_data, False))
+                ] = np.nan
             else:
                 vb_filtered = np.tile(np.nan, n_ensembles)
-                  
-            # Prepare depth sounder data, using only data prior to interpolation
+
+            # Prepare depth sounder data, using only data prior to
+            # interpolation
             if self.ds_depths is not None:
                 ds_filtered = np.copy(self.ds_depths.depth_processed_m)
-                ds_filtered[np.squeeze(np.equal(self.ds_depths.valid_data, False))] = np.nan
+                ds_filtered[
+                    np.squeeze(np.equal(self.ds_depths.valid_data, False))
+                ] = np.nan
             else:
                 ds_filtered = np.tile(np.nan, n_ensembles)
 
             comp_source = np.tile(np.nan, bt_filtered.shape)
 
             # Apply composite depths
-            if ref == 'bt_depths':
+            if ref == "bt_depths":
                 comp_depth = np.copy(bt_filtered)
                 comp_source[np.isnan(comp_depth) == False] = 1
-                comp_depth[np.isnan(comp_depth)] = np.squeeze(ds_filtered[np.isnan(comp_depth)])
-                comp_source[np.logical_and((np.isnan(comp_depth) == False), (np.isnan(comp_source) == True))] = 3
+                comp_depth[np.isnan(comp_depth)] = np.squeeze(
+                    ds_filtered[np.isnan(comp_depth)]
+                )
+                comp_source[
+                    np.logical_and(
+                        (np.isnan(comp_depth) == False), (np.isnan(comp_source) == True)
+                    )
+                ] = 3
                 comp_depth[np.isnan(comp_depth)] = vb_filtered[np.isnan(comp_depth)]
-                comp_source[np.logical_and((np.isnan(comp_depth) == False), (np.isnan(comp_source) == True))] = 2
-                comp_depth = self.interpolate_composite(transect=transect, composite_depth=comp_depth)
-                # comp_depth[np.isnan(comp_depth)] = np.squeeze(self.bt_depths.depth_processed_m[np.isnan(comp_depth)])
-                comp_source[np.logical_and((np.isnan(comp_depth) == False), (np.isnan(comp_source) == True))] = 4
-                
-            elif ref == 'vb_depths':
+                comp_source[
+                    np.logical_and(
+                        (np.isnan(comp_depth) == False), (np.isnan(comp_source) == True)
+                    )
+                ] = 2
+                comp_depth = self.interpolate_composite(
+                    transect=transect, composite_depth=comp_depth
+                )
+
+                comp_source[
+                    np.logical_and(
+                        (np.isnan(comp_depth) == False), (np.isnan(comp_source) == True)
+                    )
+                ] = 4
+
+            elif ref == "vb_depths":
                 comp_depth = np.copy(vb_filtered)
                 comp_source[np.isnan(comp_depth) == False] = 2
-                comp_depth[np.isnan(comp_depth)] = np.squeeze(ds_filtered[np.isnan(comp_depth)])
-                comp_source[np.logical_and((np.isnan(comp_depth) == False), (np.isnan(comp_source) == True))] = 3
-                comp_depth[np.isnan(comp_depth)] = np.squeeze(bt_filtered[np.isnan(comp_depth)])
-                comp_source[np.logical_and((np.isnan(comp_depth) == False), (np.isnan(comp_source) == True))] = 1
-                comp_depth = self.interpolate_composite(transect=transect, composite_depth=comp_depth)
-                # comp_depth[np.isnan(comp_depth)] = np.squeeze(self.vb_depths.depth_processed_m[np.isnan(comp_depth)])
-                comp_source[np.logical_and((np.isnan(comp_depth) == False), (np.isnan(comp_source) == True))] = 4
-                
-            elif ref == 'ds_depths':
+                comp_depth[np.isnan(comp_depth)] = np.squeeze(
+                    ds_filtered[np.isnan(comp_depth)]
+                )
+                comp_source[
+                    np.logical_and(
+                        (np.isnan(comp_depth) == False), (np.isnan(comp_source) == True)
+                    )
+                ] = 3
+                comp_depth[np.isnan(comp_depth)] = np.squeeze(
+                    bt_filtered[np.isnan(comp_depth)]
+                )
+                comp_source[
+                    np.logical_and(
+                        (np.isnan(comp_depth) == False), (np.isnan(comp_source) == True)
+                    )
+                ] = 1
+                comp_depth = self.interpolate_composite(
+                    transect=transect, composite_depth=comp_depth
+                )
+                comp_source[
+                    np.logical_and(
+                        (np.isnan(comp_depth) == False), (np.isnan(comp_source) == True)
+                    )
+                ] = 4
+
+            elif ref == "ds_depths":
                 comp_depth = np.copy(ds_filtered)
                 comp_source[np.isnan(comp_depth) == False] = 3
-                comp_depth[np.isnan(comp_depth)] = np.squeeze(vb_filtered[np.isnan(comp_depth)])
-                comp_source[np.logical_and((np.isnan(comp_depth) == False), (np.isnan(comp_source) == True))] = 2
-                comp_depth[np.isnan(comp_depth)] = np.squeeze(bt_filtered[np.isnan(comp_depth)])
-                comp_source[np.logical_and((np.isnan(comp_depth) == False), (np.isnan(comp_source) == True))] = 1
-                comp_depth = self.interpolate_composite(transect=transect, composite_depth=comp_depth)
-                # comp_depth[np.isnan(comp_depth)] = np.squeeze(self.ds_depths.depth_processed_m[np.isnan(comp_depth)])
-                comp_source[np.logical_and((np.isnan(comp_depth) == False), (np.isnan(comp_source) == True))] = 4
-
-            # Save composite depth to depth_processed of selected primary reference
+                comp_depth[np.isnan(comp_depth)] = np.squeeze(
+                    vb_filtered[np.isnan(comp_depth)]
+                )
+                comp_source[
+                    np.logical_and(
+                        (np.isnan(comp_depth) == False), (np.isnan(comp_source) == True)
+                    )
+                ] = 2
+                comp_depth[np.isnan(comp_depth)] = np.squeeze(
+                    bt_filtered[np.isnan(comp_depth)]
+                )
+                comp_source[
+                    np.logical_and(
+                        (np.isnan(comp_depth) == False), (np.isnan(comp_source) == True)
+                    )
+                ] = 1
+                comp_depth = self.interpolate_composite(
+                    transect=transect, composite_depth=comp_depth
+                )
+                comp_source[
+                    np.logical_and(
+                        (np.isnan(comp_depth) == False), (np.isnan(comp_source) == True)
+                    )
+                ] = 4
+
+            # Save composite depth to depth_processed of selected primary
+            # reference
             selected_data = getattr(self, ref)
             selected_data.apply_composite(comp_depth, comp_source.astype(int))
-                
+
         else:
             selected_data = getattr(self, ref)
             comp_source = np.zeros(selected_data.depth_processed_m.shape)
-            
-            if ref == 'bt_depths':
+
+            if ref == "bt_depths":
                 selected_data.valid_data[np.isnan(selected_data.valid_data)] = False
                 comp_source[np.squeeze(selected_data.valid_data)] = 1
-            elif ref == 'vb_depths':
+            elif ref == "vb_depths":
                 comp_source[np.squeeze(selected_data.valid_data)] = 2
-            elif ref == 'ds_depths':
+            elif ref == "ds_depths":
                 comp_source[np.squeeze(selected_data.valid_data)] = 3
 
             selected_data.apply_interpolation(transect)
@@ -215,13 +295,13 @@ class DepthStructure(object):
         draft: float
             New draft.
         """
-        
-        if target == 'ADCP':
+
+        if target == "ADCP":
             self.bt_depths.change_draft(draft)
             self.vb_depths.change_draft(draft)
         else:
-            self.ds_depths.change_draft(draft)    
-            
+            self.ds_depths.change_draft(draft)
+
     def depth_filter(self, transect, filter_method):
         """Method to apply filter to all available depth sources, so that
         all sources have the same filter applied.
@@ -233,14 +313,14 @@ class DepthStructure(object):
         filter_method: str
             Method to use to filter data (Smooth, TRDI, None).
         """
-        
+
         if self.bt_depths is not None:
             self.bt_depths.apply_filter(transect, filter_method)
         if self.vb_depths is not None:
             self.vb_depths.apply_filter(transect, filter_method)
         if self.ds_depths is not None:
             self.ds_depths.apply_filter(transect, filter_method)
-            
+
     def depth_interpolation(self, transect, method=None):
         """Method to apply interpolation to all available depth sources, so
         that all sources have the same filter applied.
@@ -251,15 +331,15 @@ class DepthStructure(object):
             Object of TransectData
         method: str
             Interpolation method (None, HoldLast, Smooth, Linear)
-            """
-        
+        """
+
         if self.bt_depths is not None:
             self.bt_depths.apply_interpolation(transect, method)
         if self.vb_depths is not None:
             self.vb_depths.apply_interpolation(transect, method)
         if self.ds_depths is not None:
             self.ds_depths.apply_interpolation(transect, method)
-            
+
     def sos_correction(self, ratio):
         """Correct depths for change in speed of sound.
 
@@ -268,11 +348,11 @@ class DepthStructure(object):
         ratio: float
             Ratio of new to old speed of sound.
         """
-        
+
         # Bottom Track Depths
         if self.bt_depths is not None:
             self.bt_depths.sos_correction(ratio)
-            
+
         # Vertical beam depths
         if self.vb_depths is not None:
             self.vb_depths.sos_correction(ratio)
@@ -303,15 +383,16 @@ class DepthStructure(object):
             track_x = boat_vel_x * transect.date_time.ens_duration_sec
             track_y = boat_vel_y * transect.date_time.ens_duration_sec
         else:
-            select = getattr(transect.boat_vel, 'bt_vel')
+            select = getattr(transect.boat_vel, "bt_vel")
             track_x = np.tile(np.nan, select.u_processed_mps.shape)
             track_y = np.tile(np.nan, select.v_processed_mps.shape)
 
         idx = np.where(np.isnan(track_x[1:]))
 
-        # If the navigation reference has no gaps use it for interpolation, if not use time
+        # If the navigation reference has no gaps use it for interpolation,
+        # if not use time
         if len(idx[0]) < 1:
-            x = np.nancumsum(np.sqrt(track_x ** 2 + track_y ** 2))
+            x = np.nancumsum(np.sqrt(track_x**2 + track_y**2))
         else:
             # Compute accumulated time
             x = np.nancumsum(transect.date_time.ens_duration_sec)
@@ -319,20 +400,21 @@ class DepthStructure(object):
         depth_mono = np.copy(composite_depth)
         depth_new = np.copy(composite_depth)
 
-        #       Create strict monotonic arrays for depth and track by identifying duplicate
-        #       track values.  The first track value is used and the remaining duplicates
-        #       are set to nan.  The depth assigned to that first track value is the average
-        #       of all duplicates.  The depths for the duplicates are then set to nan.  Only
-        #       valid strictly monotonic track and depth data are used for the input in to linear
-        #       interpolation.   Only the interpolated data for invalid depths are added
-        #       to the valid depth data to create depth_new
+        # Create strict monotonic arrays for depth and track by identifying duplicate
+        # track values.  The first track value is used and the remaining duplicates
+        # are set to nan.  The depth assigned to that first track value is the average
+        # of all duplicates.  The depths for the duplicates are then set to nan.  Only
+        # valid strictly monotonic track and depth data are used for the input in to
+        # linear interpolation.   Only the interpolated data for invalid
+        # depths are added to the valid depth data to create depth_new
 
         x_mono = x
 
         idx0 = np.where(np.diff(x) == 0)[0]
         if len(idx0) > 0:
             if len(idx0) > 1:
-                # Split array into subarrays in proper sequence e.g [[2,3,4],[7,8,9]] etc.
+                # Split array into subarrays in proper sequence e.g [[2,3,
+                # 4],[7,8,9]] etc.
                 idx1 = np.add(np.where(np.diff(idx0) != 1)[0], 1)
                 group = np.split(idx0, idx1)
 
@@ -352,7 +434,6 @@ class DepthStructure(object):
 
         # Interpolate
 
-
         # Determine ensembles with valid depth data
         valid_depth_mono = np.logical_not(np.isnan(depth_mono))
         valid_x_mono = np.logical_not(np.isnan(x_mono))
@@ -361,8 +442,12 @@ class DepthStructure(object):
 
         if np.sum(valid) > 1:
             # Compute interpolation function from all valid data
-            depth_int = np.interp(x_mono, x_mono[valid], depth_mono[valid], left=np.nan, right=np.nan)
+            depth_int = np.interp(
+                x_mono, x_mono[valid], depth_mono[valid], left=np.nan, right=np.nan
+            )
             # Fill in invalid data with interpolated data
-            depth_new[np.logical_not(valid_depth_mono)] = depth_int[np.logical_not(valid_depth_mono)]
+            depth_new[np.logical_not(valid_depth_mono)] = depth_int[
+                np.logical_not(valid_depth_mono)
+            ]
 
         return depth_new
diff --git a/qrevint_22_06_22/Classes/EdgeData.py b/Classes/EdgeData.py
similarity index 78%
rename from qrevint_22_06_22/Classes/EdgeData.py
rename to Classes/EdgeData.py
index a4fddc5b6a27f4bff7c2943af6925923854a8b8b..f927a65d1284d4c7404be74e761e8767b3d941c5 100644
--- a/qrevint_22_06_22/Classes/EdgeData.py
+++ b/Classes/EdgeData.py
@@ -27,27 +27,31 @@ class EdgeData(object):
     orig_user_discharge_cms: float
         Original user supplied discharge for edge, in cms.
     """
-    
+
     def __init__(self):
-        """Initialize EdgeData.
-        """
-        
-        self.type = None       # Shape of edge: 'Triangular', 'Rectangular', 'Custom, 'User Q'
-        self.distance_m = None          # Distance to shore
-        self.cust_coef = None     # Custom coefficient provided by user
-        self.number_ensembles = None   # Number of ensembles to average for depth and velocities
-        self.user_discharge_cms = None      # User supplied edge discharge.
+        """Initialize EdgeData."""
 
-        self.orig_type = None  # Shape of edge: 'Triangular', 'Rectangular', 'Custom, 'User Q'
-        self.orig_distance_m = None  # Distance to shore
-        self.orig_cust_coef = None  # Custom coefficient provided by user
-        self.orig_number_ensembles = None  # Number of ensembles to average for depth and velocities
-        self.orig_user_discharge_cms = None  # User supplied edge discharge.
+        self.type = None
+        self.distance_m = None
+        self.cust_coef = None
+        self.number_ensembles = None
+        self.user_discharge_cms = None
+        self.orig_type = None
+        self.orig_distance_m = None
+        self.orig_cust_coef = None
+        self.orig_number_ensembles = None
+        self.orig_user_discharge_cms = None
 
-        
-    def populate_data(self, edge_type, distance=None, number_ensembles=10, coefficient=None, user_discharge=None):
+    def populate_data(
+        self,
+        edge_type,
+        distance=None,
+        number_ensembles=10,
+        coefficient=None,
+        user_discharge=None,
+    ):
         """Construct left or right edge object from provided inputs
-        
+
         Parameters
         ----------
         edge_type: str
@@ -77,7 +81,8 @@ class EdgeData(object):
             self.orig_cust_coef = coefficient
 
     def populate_from_qrev_mat(self, mat_data):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -93,7 +98,7 @@ class EdgeData(object):
                 self.user_discharge_cms = mat_data.userQ_cms
         if type(mat_data.custCoef) is float:
             self.cust_coef = mat_data.custCoef
-        if hasattr(mat_data, 'orig_type'):
+        if hasattr(mat_data, "orig_type"):
             self.orig_type = mat_data.orig_type
             self.orig_distance_m = mat_data.orig_distance_m
             self.orig_number_ensembles = mat_data.orig_number_ensembles
diff --git a/qrevint_22_06_22/Classes/Edges.py b/Classes/Edges.py
similarity index 90%
rename from qrevint_22_06_22/Classes/Edges.py
rename to Classes/Edges.py
index 436cec20918248fd3b72a7f6c9462bf9b577b683..594f9375f304bc8020de61bd807d729528f361e5 100644
--- a/qrevint_22_06_22/Classes/Edges.py
+++ b/Classes/Edges.py
@@ -15,16 +15,15 @@ class Edges(object):
     right: EdgeData
         Object of EdgeData for right edge.
     """
-    
+
     def __init__(self):
-        """Initialize Edges.
-        """
+        """Initialize Edges."""
 
         self.rec_edge_method = None
         self.vel_method = None
         self.left = EdgeData()
         self.right = EdgeData()
-        
+
     def populate_data(self, rec_edge_method, vel_method):
         """Store the general methods used for edge data.
 
@@ -39,19 +38,20 @@ class Edges(object):
         self.vel_method = vel_method
 
     def populate_from_qrev_mat(self, transect):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
         transect: mat_struct
            Matlab data structure obtained from sio.loadmat
-       """
+        """
 
-        if hasattr(transect, 'edges'):
-            if hasattr(transect.edges, 'left'):
+        if hasattr(transect, "edges"):
+            if hasattr(transect.edges, "left"):
                 self.left = EdgeData()
                 self.left.populate_from_qrev_mat(transect.edges.left)
-            if hasattr(transect.edges, 'right'):
+            if hasattr(transect.edges, "right"):
                 self.right = EdgeData()
                 self.right.populate_from_qrev_mat(transect.edges.right)
             self.rec_edge_method = transect.edges.recEdgeMethod
@@ -59,7 +59,7 @@ class Edges(object):
 
     def change_property(self, prop, setting, edge=None):
         """Change edge property
-        
+
         Parameters
         ----------
         prop: str
@@ -69,7 +69,7 @@ class Edges(object):
         edge: str
             Edge to change (left, right)
         """
-        
+
         if edge is None:
             setattr(self, prop, setting)
         else:
diff --git a/qrevint_22_06_22/Classes/ExtrapData.py b/Classes/ExtrapData.py
similarity index 79%
rename from qrevint_22_06_22/Classes/ExtrapData.py
rename to Classes/ExtrapData.py
index 2a6e1d445bc65e7a9e264087a0655eaea8c4ecbd..4f29abb3f2fe8b5ef8168e400f030a36e2386cef 100644
--- a/qrevint_22_06_22/Classes/ExtrapData.py
+++ b/Classes/ExtrapData.py
@@ -4,28 +4,30 @@ class ExtrapData(object):
     Attributes
     ----------
     top_method_orig: str
-        Original extrapolation method for top of profile: Power, Constant, 3-Point.
+        Original extrapolation method for top of profile: Power, Constant,
+        3-Point.
     bot_method_orig: str
         Original extrapolation method for bottom of profile: Power, No Slip.
     exponent_orig: float
         Original exponent for power of no slip methods.
     top_method: str
-        Applied extrapolation method for top of profile: Power, Constant, 3-Point.
+        Applied extrapolation method for top of profile: Power, Constant,
+        3-Point.
     bot_method: str
         Applied extrapolation method for bottom of profile: Power, No Slip
     exponent: float
         Applied exponent for power of no slip methods
     """
-    
+
     def __init__(self):
         """Initialize class and set defaults."""
-        self.top_method_orig = None  # Extrapolation method for top of profile: Power, Constant, 3-Point
-        self.bot_method_orig = None  # Extrapolation method for bottom of profile: Power, No Slip
-        self.exponent_orig = None  # Exponent for power of no slip methods
-        self.top_method = None  # Extrapolation method for top of profile: Power, Constant, 3-Point
-        self.bot_method = None  # Extrapolation method for bottom of profile: Power, No Slip
-        self.exponent = None  # Exponent for power of no slip methods
-        
+        self.top_method_orig = None
+        self.bot_method_orig = None
+        self.exponent_orig = None
+        self.top_method = None
+        self.bot_method = None
+        self.exponent = None
+
     def populate_data(self, top, bot, exp):
         """Store data in class variables.
 
@@ -46,7 +48,8 @@ class ExtrapData(object):
         self.exponent = float(exp)
 
     def populate_from_qrev_mat(self, transect):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -54,7 +57,7 @@ class ExtrapData(object):
            Matlab data structure obtained from sio.loadmat
         """
 
-        if hasattr(transect, 'extrap'):
+        if hasattr(transect, "extrap"):
             self.top_method_orig = transect.extrap.topMethodOrig
             self.bot_method_orig = transect.extrap.botMethodOrig
             self.exponent_orig = transect.extrap.exponentOrig
@@ -77,7 +80,7 @@ class ExtrapData(object):
         self.top_method = top
         self.bot_method = bot
         self.exponent = exp
-        
+
     def set_property(self, prop, setting):
         """Allows setting any property.
 
diff --git a/qrevint_22_06_22/Classes/ExtrapQSensitivity.py b/Classes/ExtrapQSensitivity.py
similarity index 68%
rename from qrevint_22_06_22/Classes/ExtrapQSensitivity.py
rename to Classes/ExtrapQSensitivity.py
index 75be866e6350f063018c447403d94212dd4aca41..886890ed88fbe2564c500e89ce43367acabe38cc 100644
--- a/qrevint_22_06_22/Classes/ExtrapQSensitivity.py
+++ b/Classes/ExtrapQSensitivity.py
@@ -3,7 +3,8 @@ from Classes.QComp import QComp
 
 
 class ExtrapQSensitivity(object):
-    """Class to compute the sensitivity of the discharge to various extrapolation methods.
+    """Class to compute the sensitivity of the discharge to various
+    extrapolation methods.
 
     Attributes
     ----------
@@ -50,80 +51,90 @@ class ExtrapQSensitivity(object):
     q_pp_opt_list: list
         List of single transect discharges base on optimized power-power law
     q_cns_list: list
-        List of single transect discharges base on default 1/6 constant no slip law
+        List of single transect discharges base on default 1/6 constant no
+        slip law
     q_cns_opt_list: list
-        List of single transect discharges base on optimized constant no slip law
+        List of single transect discharges base on optimized constant no
+        slip law
     q_3p_ns_list: list
         List of single transect discharges base on default 3pt no slip
     q_3p_ns_opt_list: list
         List of single transect discharges base on optimized 3pt no slip
     q_top_pp_list: list
-        List of single transect top discharges base on default 1/6 power-power law
+        List of single transect top discharges base on default 1/6
+        power-power law
     q_top_pp_opt_list: list
-        List of single transect top discharges base on optimized power-power law
+        List of single transect top discharges base on optimized power-power
+        law
     q_top_cns_list: list
-        List of single transect top discharges base on default 1/6 constant no slip law
+        List of single transect top discharges base on default 1/6 constant
+        no slip law
     q_top_cns_opt_list: list
-        List of single transect top discharges base on optimized constant no slip law
+        List of single transect top discharges base on optimized constant no
+        slip law
     q_top_3p_ns_list: list
         List of single transect top discharges base on default 3pt no slip
     q_top_3p_ns_opt_list: list
         List of single transect top discharges base on optimized 3pt no slip
     q_bot_pp_list: list
-        List of single transect bottom discharges base on default 1/6 power-power law
+        List of single transect bottom discharges base on default 1/6
+        power-power law
     q_bot_pp_opt_list: list
-        List of single transect bottom discharges base on optimized power-power law
+        List of single transect bottom discharges base on optimized
+        power-power law
     q_bot_cns_list: list
-        List of single transect bottom discharges base on default 1/6 constant no slip law
+        List of single transect bottom discharges base on default 1/6
+        constant no slip law
     q_bot_cns_opt_list: list
-        List of single transect bottom discharges base on optimized constant no slip law
+        List of single transect bottom discharges base on optimized constant
+        no slip law
     q_bot_3p_ns_list: list
         List of single transect bottom discharges base on default 3pt no slip
     q_bot_3p_ns_opt_list: list
         List of single transect bottom discharges base on optimized 3pt no slip
     """
-    
+
     def __init__(self):
         """Initialize object and instance variables."""
 
-        self.q_pp_mean = None  # Discharge power power 1/6
-        self.q_pp_opt_mean = None  # discharge power power optimized
-        self.q_cns_mean = None  # Discharge constant no RoutingSlipDelivery
-        self.q_cns_opt_mean = None  # Discharge constant optimized no slip
-        self.q_3p_ns_mean = None  # Discharge 3-pt no slip
-        self.q_3p_ns_opt_mean = None  # Discharge 3-pt optimized no slip
-        self.q_pp_per_diff = None  # Power power 1/6 difference from reference
-        self.q_pp_opt_per_diff = None  # Power power optimized percent difference from reference
-        self.q_cns_per_diff = None  # Constant no slip percent difference from reference
-        self.q_cns_opt_per_diff = None  # Constant optimized no slip percent difference from reference
-        self.q_3p_ns_per_diff = None  # 3-point no skip percent difference from reference
-        self.q_3p_ns_opt_per_diff = None  # 3-point optimized no slip percent difference from reference
-        self.pp_exp = None  # Optimized power power exponent
-        self.ns_exp = None  # Optimized no slip Exponent
-        self.man_top = None  # Manually specified top method
-        self.man_bot = None  # Manually specified bottom method
-        self.man_exp = None  # Manually specified exponent
-        self.q_man_mean = None  # Mean discharge for manually specified extrapolations
-        self.q_man_per_diff = None  # Manually specified extrapolations percent difference from reference
-        self.q_pp_list = []  # List of single transect discharges base on default 1/6 power-power law
-        self.q_pp_opt_list = []  # List of single transect discharges base on optimized power-power law
-        self.q_cns_list = []  # List of single transect discharges base on default 1/6 constant no slip law
-        self.q_cns_opt_list = []  # List of single transect discharges base on optimized constant no slip law
-        self.q_3p_ns_list = []  # List of single transect discharges base on default 3pt no slip
-        self.q_3p_ns_opt_list = []  # List of single transect discharges base on optimized 3pt no slip
-        self.q_top_pp_list = []  # List of single transect top discharges base on default 1/6 power-power law
-        self.q_top_pp_opt_list = []  # List of single transect top discharges base on optimized power-power law
-        self.q_top_cns_list = []  # List of single transect top discharges base on default 1/6 constant no slip law
-        self.q_top_cns_opt_list = []  # List of single transect top discharges base on optimized constant no slip law
-        self.q_top_3p_ns_list = []  # List of single transect top discharges base on default 3pt no slip
-        self.q_top_3p_ns_opt_list = []  # List of single transect top discharges base on optimized 3pt no slip
-        self.q_bot_pp_list = []  # List of single transect bottom discharges base on default 1/6 power-power law
-        self.q_bot_pp_opt_list = []  # List of single transect bottom discharges base on optimized power-power law
-        self.q_bot_cns_list = []  # List of single transect bottom discharges base on default 1/6 constant no slip law
-        self.q_bot_cns_opt_list = []  # List of single transect bottom discharges base on optimized constant no slip law
-        self.q_bot_3p_ns_list = []  # List of single transect bottom discharges base on default 3pt no slip
-        self.q_bot_3p_ns_opt_list = []  # List of single transect bottom discharges base on optimized 3pt no slip
-        
+        self.q_pp_mean = None
+        self.q_pp_opt_mean = None
+        self.q_cns_mean = None
+        self.q_cns_opt_mean = None
+        self.q_3p_ns_mean = None
+        self.q_3p_ns_opt_mean = None
+        self.q_pp_per_diff = None
+        self.q_pp_opt_per_diff = None
+        self.q_cns_per_diff = None
+        self.q_cns_opt_per_diff = None
+        self.q_3p_ns_per_diff = None
+        self.q_3p_ns_opt_per_diff = None
+        self.pp_exp = None
+        self.ns_exp = None
+        self.man_top = None
+        self.man_bot = None
+        self.man_exp = None
+        self.q_man_mean = None
+        self.q_man_per_diff = None
+        self.q_pp_list = []
+        self.q_pp_opt_list = []
+        self.q_cns_list = []
+        self.q_cns_opt_list = []
+        self.q_3p_ns_list = []
+        self.q_3p_ns_opt_list = []
+        self.q_top_pp_list = []
+        self.q_top_pp_opt_list = []
+        self.q_top_cns_list = []
+        self.q_top_cns_opt_list = []
+        self.q_top_3p_ns_list = []
+        self.q_top_3p_ns_opt_list = []
+        self.q_bot_pp_list = []
+        self.q_bot_pp_opt_list = []
+        self.q_bot_cns_list = []
+        self.q_bot_cns_opt_list = []
+        self.q_bot_3p_ns_list = []
+        self.q_bot_3p_ns_opt_list = []
+
     def populate_data(self, transects, extrap_fits):
         """Compute means and percent differences.
 
@@ -159,37 +170,68 @@ class ExtrapQSensitivity(object):
         q_3p_ns_bot = []
         q_3p_ns_opt_bot = []
 
-        # Compute discharges for each transect for possible extrapolation combinations
+        # Compute discharges for each transect for possible extrapolation
+        # combinations
         for transect in transects:
             if transect.checked:
                 q = QComp()
 
-                q.populate_data(data_in=transect, top_method='Power', bot_method='Power', exponent=0.1667)
+                q.populate_data(
+                    data_in=transect,
+                    top_method="Power",
+                    bot_method="Power",
+                    exponent=0.1667,
+                )
                 q_pp.append(q.total)
                 q_pp_top.append(q.top)
                 q_pp_bot.append(q.bottom)
 
-                q.populate_data(data_in=transect, top_method='Power', bot_method='Power', exponent=self.pp_exp)
+                q.populate_data(
+                    data_in=transect,
+                    top_method="Power",
+                    bot_method="Power",
+                    exponent=self.pp_exp,
+                )
                 q_pp_opt.append(q.total)
                 q_pp_opt_top.append(q.top)
                 q_pp_opt_bot.append(q.bottom)
 
-                q.populate_data(data_in=transect, top_method='Constant', bot_method='No Slip', exponent=0.1667)
+                q.populate_data(
+                    data_in=transect,
+                    top_method="Constant",
+                    bot_method="No Slip",
+                    exponent=0.1667,
+                )
                 q_cns.append(q.total)
                 q_cns_top.append(q.top)
                 q_cns_bot.append(q.bottom)
 
-                q.populate_data(data_in=transect, top_method='Constant', bot_method='No Slip', exponent=self.ns_exp)
+                q.populate_data(
+                    data_in=transect,
+                    top_method="Constant",
+                    bot_method="No Slip",
+                    exponent=self.ns_exp,
+                )
                 q_cns_opt.append(q.total)
                 q_cns_opt_top.append(q.top)
                 q_cns_opt_bot.append(q.bottom)
 
-                q.populate_data(data_in=transect, top_method='3-Point', bot_method='No Slip', exponent=0.1667)
+                q.populate_data(
+                    data_in=transect,
+                    top_method="3-Point",
+                    bot_method="No Slip",
+                    exponent=0.1667,
+                )
                 q_3p_ns.append(q.total)
                 q_3p_ns_top.append(q.top)
                 q_3p_ns_bot.append(q.bottom)
 
-                q.populate_data(data_in=transect, top_method='3-Point', bot_method='No Slip', exponent=self.ns_exp)
+                q.populate_data(
+                    data_in=transect,
+                    top_method="3-Point",
+                    bot_method="No Slip",
+                    exponent=self.ns_exp,
+                )
                 q_3p_ns_opt.append(q.total)
                 q_3p_ns_opt_top.append(q.top)
                 q_3p_ns_opt_bot.append(q.bottom)
@@ -229,7 +271,8 @@ class ExtrapQSensitivity(object):
         self.compute_percent_diff(extrap_fits=extrap_fits, transects=transects)
 
     def populate_from_qrev_mat(self, mat_data):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -237,7 +280,7 @@ class ExtrapQSensitivity(object):
            Matlab data structure obtained from sio.loadmat
         """
 
-        if hasattr(mat_data, 'qSensitivity'):
+        if hasattr(mat_data, "qSensitivity"):
             self.q_pp_mean = mat_data.qSensitivity.qPPmean
             self.q_pp_opt_mean = mat_data.qSensitivity.qPPoptmean
             self.q_cns_mean = mat_data.qSensitivity.qCNSmean
@@ -246,7 +289,7 @@ class ExtrapQSensitivity(object):
             self.q_3p_ns_opt_mean = mat_data.qSensitivity.q3pNSoptmean
 
             # For compatibility with older QRev.mat files
-            if hasattr(mat_data.qSensitivity, 'qPPperdiff'):
+            if hasattr(mat_data.qSensitivity, "qPPperdiff"):
                 self.q_pp_per_diff = mat_data.qSensitivity.qPPperdiff
             else:
                 self.q_pp_per_diff = np.nan
@@ -268,7 +311,7 @@ class ExtrapQSensitivity(object):
                 self.q_man_per_diff = mat_data.qSensitivity.qManperdiff
 
             # Add compatibility for Oursin uncertainty model
-            if hasattr(mat_data.qSensitivity, 'q_pp_list'):
+            if hasattr(mat_data.qSensitivity, "q_pp_list"):
                 self.q_pp_list = mat_data.qSensitivity.q_pp_list
                 self.q_pp_opt_list = mat_data.qSensitivity.q_pp_opt_list
                 self.q_cns_list = mat_data.qSensitivity.q_cns_list
@@ -305,10 +348,11 @@ class ExtrapQSensitivity(object):
                 self.q_bot_cns_list = []
                 self.q_bot_cns_opt_list = []
                 self.q_bot_3p_ns_list = []
-                self.q_bot_3p_ns_opt_list =[]
+                self.q_bot_3p_ns_opt_list = []
 
     def compute_percent_diff(self, extrap_fits, transects=None):
-        """Computes the percent difference for each of the extrapolation options as compared to selected method.
+        """Computes the percent difference for each of the extrapolation
+        options as compared to selected method.
 
         Parameters
         ----------
@@ -318,7 +362,7 @@ class ExtrapQSensitivity(object):
             List of TransectData objects
         """
         # Determine which mean is the reference
-        if extrap_fits[-1].fit_method == 'Manual':
+        if extrap_fits[-1].fit_method == "Manual":
             self.man_top = extrap_fits[-1].top_method
             self.man_bot = extrap_fits[-1].bot_method
             self.man_exp = extrap_fits[-1].exponent
@@ -331,10 +375,12 @@ class ExtrapQSensitivity(object):
                     q = QComp()
                     checked.append(transect.checked)
 
-                    q.populate_data(data_in=transect,
-                                    top_method=self.man_top,
-                                    bot_method=self.man_bot,
-                                    exponent=self.man_exp)
+                    q.populate_data(
+                        data_in=transect,
+                        top_method=self.man_top,
+                        bot_method=self.man_bot,
+                        exponent=self.man_exp,
+                    )
                     q_man.append(q)
                 container = []
                 for index, item in enumerate(q_man):
@@ -344,12 +390,12 @@ class ExtrapQSensitivity(object):
             reference_mean = self.q_man_mean
 
         else:
-            if extrap_fits[-1].top_method_auto == 'Power':
+            if extrap_fits[-1].top_method_auto == "Power":
                 if np.abs(extrap_fits[-1].exponent_auto - 0.1667) < 0.0001:
                     reference_mean = self.q_pp_mean
                 else:
                     reference_mean = self.q_pp_opt_mean
-            elif extrap_fits[-1].top_method_auto == 'Constant':
+            elif extrap_fits[-1].top_method_auto == "Constant":
                 if np.abs(extrap_fits[-1].exponent_auto - 0.1667) < 0.0001:
                     reference_mean = self.q_cns_mean
                 else:
@@ -362,11 +408,23 @@ class ExtrapQSensitivity(object):
 
         # Compute percent difference from reference
         self.q_pp_per_diff = ((self.q_pp_mean - reference_mean) / reference_mean) * 100
-        self.q_pp_opt_per_diff = ((self.q_pp_opt_mean - reference_mean) / reference_mean) * 100
-        self.q_cns_per_diff = ((self.q_cns_mean - reference_mean) / reference_mean) * 100
-        self.q_cns_opt_per_diff = ((self.q_cns_opt_mean - reference_mean) / reference_mean) * 100
-        self.q_3p_ns_per_diff = ((self.q_3p_ns_mean - reference_mean) / reference_mean) * 100
-        self.q_3p_ns_opt_per_diff = ((self.q_3p_ns_opt_mean - reference_mean) / reference_mean) * 100
-
-        if extrap_fits[-1].fit_method == 'Manual':
-            self.q_man_per_diff = ((self.q_man_mean - reference_mean) / reference_mean) * 100
+        self.q_pp_opt_per_diff = (
+            (self.q_pp_opt_mean - reference_mean) / reference_mean
+        ) * 100
+        self.q_cns_per_diff = (
+            (self.q_cns_mean - reference_mean) / reference_mean
+        ) * 100
+        self.q_cns_opt_per_diff = (
+            (self.q_cns_opt_mean - reference_mean) / reference_mean
+        ) * 100
+        self.q_3p_ns_per_diff = (
+            (self.q_3p_ns_mean - reference_mean) / reference_mean
+        ) * 100
+        self.q_3p_ns_opt_per_diff = (
+            (self.q_3p_ns_opt_mean - reference_mean) / reference_mean
+        ) * 100
+
+        if extrap_fits[-1].fit_method == "Manual":
+            self.q_man_per_diff = (
+                (self.q_man_mean - reference_mean) / reference_mean
+            ) * 100
diff --git a/qrevint_22_06_22/Classes/FitData.py b/Classes/FitData.py
similarity index 68%
rename from qrevint_22_06_22/Classes/FitData.py
rename to Classes/FitData.py
index da61b868a2c4bf991104e6c8183d92b23e3d099f..41dfb06bba13079e277565f4f630e853987bd3fa 100644
--- a/qrevint_22_06_22/Classes/FitData.py
+++ b/Classes/FitData.py
@@ -4,7 +4,8 @@ from scipy.stats import t
 
 
 class FitData(object):
-    """Class to compute top and bottom extrapolation methods and associated statistics.
+    """Class to compute top and bottom extrapolation methods and associated
+    statistics.
 
      Data required for the constructor method include data of class
      NormData, threshold for the minimum number of points for a valid
@@ -46,20 +47,20 @@ class FitData(object):
     def __init__(self):
         """Initialize object and instance variables."""
 
-        self.file_name = None  # Name of transect file
-        self.top_method = 'Power'  # Top extrapolation method
-        self.bot_method = 'Power'  # Bottom extrapolation method
-        self.coef = 0  # Power fit coefficient
-        self.exponent = 0.1667  # Power fit exponent
-        self.u = None  # Fit values of the variable
-        self.u_auto = None  # Fit values from automatic fit
-        self.z_auto = None  # z values for automtic fit
-        self.z = None  # Distance from the streambed for fit variable
-        self.exp_method = 'Power'  # Method to determine exponent (default, optimize, or manual)
-        self.data_type = None  # Type of data (velocity or unit discharge)
-        self.exponent_95_ci = 0  # 95% confidence intervals for optimized exponent
-        self.residuals = np.array([])  # Residuals from fit
-        self.r_squared = 0  # R squared of model
+        self.file_name = None
+        self.top_method = "Power"
+        self.bot_method = "Power"
+        self.coef = 0
+        self.exponent = 0.1667
+        self.u = None
+        self.u_auto = None
+        self.z_auto = None
+        self.z = None
+        self.exp_method = "Power"
+        self.data_type = None
+        self.exponent_95_ci = 0
+        self.residuals = np.array([])
+        self.r_squared = 0
 
     def populate_data(self, norm_data, top, bot, method, exponent=None):
         """Computes fit and stores associated data.
@@ -73,7 +74,8 @@ class FitData(object):
         bot: str
             Bottom extrapolation method
         method:
-            Method used to define the exponent (default, optimize, or manual), default is 1/6.
+            Method used to define the exponent (default, optimize, or manual),
+            default is 1/6.
         exponent:
             Exponent for power or no slip fit methods.
         """
@@ -93,26 +95,26 @@ class FitData(object):
         if len(idxz) > 0:
             idx_power = idxz
 
-            # Create arrays for data fitting
-            # Select median values to use in extrapolation methods selected and create
-            # methods selected and create fir output data arrays
+            # Create arrays for data fitting.
+            # Select median values to use in extrapolation methods selected
+            # and create methods selected and create fir output data arrays
 
             # If bottom is No Slip, Power at top is not allowed
-            if bot == 'No Slip':
-                if top == 'Power':
-                    top = 'Constant'
+            if bot == "No Slip":
+                if top == "Power":
+                    top = "Constant"
 
-            fit_combo = ''.join([top, bot])
-            if fit_combo == 'PowerPower':
+            fit_combo = "".join([top, bot])
+            if fit_combo == "PowerPower":
                 self.z = np.arange(0, 1.01, 0.01)
                 zc = np.nan
                 uc = np.nan
-            elif fit_combo == 'ConstantPower':
+            elif fit_combo == "ConstantPower":
                 self.z = np.arange(0, np.max(avg_z[idxz]), 0.01)
                 self.z = np.hstack([self.z, np.nan])
                 zc = np.arange(np.max(avg_z[idxz]) + 0.01, 1.0, 0.01)
                 uc = np.tile(y[idxz[0]], zc.shape)
-            elif fit_combo == '3-PointPower':
+            elif fit_combo == "3-PointPower":
                 self.z = np.arange(0, np.max(avg_z[idxz]), 0.01)
                 self.z = np.hstack([self.z, np.nan])
                 # If less than 6 bins use constant at the top
@@ -125,17 +127,19 @@ class FitData(object):
                     # zc = zc.T
                     uc = zc * p[0] + p[1]
 
-            elif fit_combo == 'ConstantNo Slip':
+            elif fit_combo == "ConstantNo Slip":
                 # Optimize constant / no slip if sufficient cells are available
-                if method.lower() == 'optimize':
-                    idx = idxz[int(1+len(idxz) - np.floor(len(avg_z[idxz]) / 3) - 1)::]
+                if method.lower() == "optimize":
+                    idx = idxz[
+                        int(1 + len(idxz) - np.floor(len(avg_z[idxz]) / 3) - 1) : :
+                    ]
                     if len(idx) < 4:
-                        method = 'default'
+                        method = "default"
 
                 # Compute Constant / No Slip using WinRiver II and
                 # RiverSurveyor Live default cells
                 else:
-                    idx = np.where(avg_z[idxz] <= .2)[0]
+                    idx = np.where(avg_z[idxz] <= 0.2)[0]
                     if len(idx) < 1:
                         idx = idxz[-1]
                     else:
@@ -149,17 +153,19 @@ class FitData(object):
                 zc = np.arange(np.max(avg_z[idxz]) + 0.01, 1.00, 0.01)
                 uc = np.tile(y[idxz[0]], zc.shape)
 
-            elif fit_combo == '3-PointNo Slip':
+            elif fit_combo == "3-PointNo Slip":
                 # Optimize 3-Point / no slip if sufficient cells are available
-                if method.lower() == 'optimize':
-                    idx = idxz[int(1 + len(idxz) - np.floor(len(avg_z[idxz])) / 3) - 1::]
+                if method.lower() == "optimize":
+                    idx = idxz[
+                        int(1 + len(idxz) - np.floor(len(avg_z[idxz])) / 3) - 1 : :
+                    ]
                     if len(idx) < 4:
-                        method = 'default'
+                        method = "default"
 
                 # Compute 3-Point / No Slip using WinRiver II and
                 # RiverSurveyor Live default cells
                 else:
-                    idx = np.where(avg_z[idxz] <= .2)[0]
+                    idx = np.where(avg_z[idxz] <= 0.2)[0]
                     if len(idx) < 1:
                         idx = idxz[-1]
                     else:
@@ -189,77 +195,87 @@ class FitData(object):
             self.exponent = np.nan
             self.exponent_95_ci = np.nan
             self.r_squared = np.nan
-            fit_func = 'linear'
+            fit_func = "linear"
 
             lower_method = method.lower()
 
-            if lower_method == 'manual':
-                fit_func = 'linear'
+            if lower_method == "manual":
+                fit_func = "linear"
                 self.exponent = exponent
                 bounds = None
                 p0 = None
 
-            elif lower_method == 'default':
-                fit_func = 'linear'
-                self.exponent = 1./6.
+            elif lower_method == "default":
+                fit_func = "linear"
+                self.exponent = 1.0 / 6.0
                 bounds = None
                 p0 = None
 
-            elif lower_method == 'optimize':
-                fit_func = 'power'
+            elif lower_method == "optimize":
+                fit_func = "power"
                 bounds = [lower_bound, upper_bound]
                 strt = yfit[ok_]
-                p0 = [strt[-1], 1./6]
+                p0 = [strt[-1], 1.0 / 6]
 
             fit_funcs = {
-                'linear': lambda x, a: a * x**self.exponent,
-                'power': lambda x, a, b: a * x**b
+                "linear": lambda x, a: a * x**self.exponent,
+                "power": lambda x, a, b: a * x**b,
             }
 
             if ok_.size > 1:
                 if bounds is not None:
-                    popt, pcov = curve_fit(fit_funcs[fit_func],
-                                           zfit, yfit, p0=p0, bounds=bounds)
+                    popt, pcov = curve_fit(
+                        fit_funcs[fit_func], zfit, yfit, p0=p0, bounds=bounds
+                    )
                 else:
-                    popt, pcov = curve_fit(fit_funcs[fit_func],
-                                           zfit, yfit, p0=p0)
+                    popt, pcov = curve_fit(fit_funcs[fit_func], zfit, yfit, p0=p0)
 
                 # Extract exponent and confidence intervals from fit
-                if lower_method == 'optimize':
+                if lower_method == "optimize":
                     self.exponent = popt[1]
                     if self.exponent is None or self.exponent < 0.05:
                         self.exponent = 0.05
 
                 if len(zfit[ok_]) > 2:
 
-                    n = len(zfit)    # number of data points
+                    n = len(zfit)  # number of data points
 
-                    t_val = t.ppf(.975, n-2)
+                    t_val = t.ppf(0.975, n - 2)
 
                     # Get 95% confidence intervals
-                    lower = (popt[-1] - t_val * np.sqrt(np.diag(pcov)[-1]))
-                    upper = (popt[-1] + t_val * np.sqrt(np.diag(pcov)[-1]))
+                    lower = popt[-1] - t_val * np.sqrt(np.diag(pcov)[-1])
+                    upper = popt[-1] + t_val * np.sqrt(np.diag(pcov)[-1])
                     self.exponent_95_ci = np.hstack([lower, upper])
 
                     # Get the rsquared for the model
-                    ss_tot = np.sum((y[idx_power] - np.mean(yfit))**2)
-                    ss_res = np.sum((y[idx_power] - fit_funcs[fit_func](zfit, *popt))**2)
-                    self.r_squared = 1 - (ss_res/ss_tot)
+                    ss_tot = np.sum((y[idx_power] - np.mean(yfit)) ** 2)
+                    ss_res = np.sum(
+                        (y[idx_power] - fit_funcs[fit_func](zfit, *popt)) ** 2
+                    )
+                    self.r_squared = 1 - (ss_res / ss_tot)
                 else:
                     self.exponent_95_ci = [np.nan, np.nan]
                     self.r_squared = np.nan
 
             # Fit power curve to appropriate data
-            self.coef = ((self.exponent + 1) * 0.05 * np.nansum(y[idx_power])) / \
-                np.nansum(((avg_z[idx_power] + (0.5 * 0.05))**(self.exponent + 1)
-                           - ((avg_z[idx_power] - (0.5 * 0.05))**(self.exponent + 1))))
+            self.coef = (
+                (self.exponent + 1) * 0.05 * np.nansum(y[idx_power])
+            ) / np.nansum(
+                (
+                    (avg_z[idx_power] + (0.5 * 0.05)) ** (self.exponent + 1)
+                    - ((avg_z[idx_power] - (0.5 * 0.05)) ** (self.exponent + 1))
+                )
+            )
 
             # Compute residuals
-            self.residuals = y[idx_power] - self.coef * avg_z[idx_power]**self.exponent
+            self.residuals = (
+                y[idx_power] - self.coef * avg_z[idx_power] ** self.exponent
+            )
             if self.residuals is None:
                 self.residuals = np.array([])
 
-            # Compute values (velocity or discharge) based on exponent and compute coefficient
+            # Compute values (velocity or discharge) based on exponent and
+            # compute coefficient
             self.u = self.coef * self.z**self.exponent
             if type(zc) == np.ndarray:
                 self.u = np.append(self.u, uc)
diff --git a/qrevint_22_06_22/Classes/GPSData.py b/Classes/GPSData.py
similarity index 76%
rename from qrevint_22_06_22/Classes/GPSData.py
rename to Classes/GPSData.py
index 1ca09b5eb61736ba1d11da2a79f695584b689846..a48a98c5997d0c0fa914bd32a927c3c1a468c92e 100644
--- a/qrevint_22_06_22/Classes/GPSData.py
+++ b/Classes/GPSData.py
@@ -4,7 +4,7 @@ from MiscLibs.common_functions import azdeg2rad, pol2cart, nans, nan_less
 
 
 class GPSData(object):
-    """Class containing the raw GPS data and algorithms to convert 
+    """Class containing the raw GPS data and algorithms to convert
     that raw data to boat velocity.
 
     Attributes
@@ -51,7 +51,8 @@ class GPSData(object):
         ext_gga_utc: np.array(float)
             UTC time, hhmmss.ss for each ensemble [ensemble]
         ext_gga_serial_time: np.array(float)
-            UTC time of gga data in seconds past midnight for each ensemble [ensemble]
+            UTC time of gga data in seconds past midnight for each ensemble
+            [ensemble]
         ext_gga_num_sats: np.array(float)
             Number of satellites for each ensemble [ensemble]
         ext_vtg_course_deg: np.array(float)
@@ -61,9 +62,11 @@ class GPSData(object):
 
     # User specifications:
         gga_position_method: str
-            Method used to process gga data for position ('End', 'Average' 'External')
+            Method used to process gga data for position ('End', 'Average'
+            'External')
         gga_velocity_method: str
-            Method used to process gga data for velocity ('End','Average' 'External')
+            Method used to process gga data for velocity ('End','Average'
+            'External')
         vtg_velocity_method: str
             Method used to process vtg data for velocity ('Average' 'External)
 
@@ -75,77 +78,103 @@ class GPSData(object):
         utm_ens_m: np.array(float)
             UTM position from processed gga data, in m [2,ensemble]
         gga_velocity_ens_mps: np.array(float)
-            Boat velocity components computed from gga data, in m/s [2,ensemble]
+            Boat velocity components computed from gga data, in m/s [2,
+            ensemble]
         gga_serial_time_ens: np.array(float)
             UTC time of gga data, in seconds past midnight [ensemble]
         vtg_velocity_ens_mps: np.array(float)
-            Boat velocity components computed from vtg data, in m/s [2,ensemble]
+            Boat velocity components computed from vtg data, in m/s [2,
+            ensemble]
         per_good_ens: np.array(float)
-            Percentage of available data used to compute ensemble value [ensemble]
+            Percentage of available data used to compute ensemble value [
+            ensemble]
         hdop_ens: np.array(float)
             HDOP for each ensemble using velocity method [ensemble]
         num_sats_ens: np.array(float)
-            Number of satellites for each ensemble, using velocity method [ensemble]
+            Number of satellites for each ensemble, using velocity method [
+            ensemble]
         altitude_ens_m: np.array(float)
             Altitude for each ensemble, using velocity method [ensemble]
         diff_qual_ens: np.array(float)
-            Differential quality for each ensemble, using velocity method [ensemble]
+            Differential quality for each ensemble, using velocity method [
+            ensemble]
     """
-    
+
     def __init__(self):
-        """Initialize instance variables.
-        """
-        
+        """Initialize instance variables."""
+
         # Raw properties
-        self.raw_gga_lat_deg = None         # self.raw_ latitude, in degress [ensemble,n]
-        self.raw_gga_lon_deg = None         # self.raw_ longitude, in degrees [ensemble,n]
-        self.raw_gga_altitude_m = None     # self.raw_ altitude in meters, [ensemble,n]
-        self.raw_gga_differential = None    # Differential correction indicator [ensemble,n]
-        self.raw_gga_hdop = None            # Horizontal dilution of precision [ensemble,n]
-        self.raw_gga_utc = None             # UTC time, in hhmmss.ss [ensemble,n]
-        self.raw_gga_serial_time = None     # UTC time of gga data, in seconds past midnight [ensemble,n]
-        self.raw_gga_num_sats = None        # Number of satellites reported in gga sentence [ensemble,n]
-        self.raw_vtg_course_deg = None      # Course, in degress [ensemble,n]
-        self.raw_vtg_speed_mps = None       # Speed, in m/s [ensemble,n]
-        self.raw_vtg_delta_time = None      # vtg delta time, in sec [ensemble,n]
-        self.raw_vtg_mode_indicator = None  # vtg mode indicator [ensemble,n]
-        self.raw_gga_delta_time = None      # gga delta time, in sec [ensemble,n]
-        
+        self.raw_gga_lat_deg = None
+        self.raw_gga_lon_deg = None
+        self.raw_gga_altitude_m = None
+        self.raw_gga_differential = None
+        self.raw_gga_hdop = None
+        self.raw_gga_utc = None
+        self.raw_gga_serial_time = None
+        self.raw_gga_num_sats = None
+        self.raw_vtg_course_deg = None
+        self.raw_vtg_speed_mps = None
+        self.raw_vtg_delta_time = None
+        self.raw_vtg_mode_indicator = None
+        self.raw_gga_delta_time = None
+
         # Manufacturer assigned ensemble values
-        self.ext_gga_lat_deg = None         # Raw latitude, in degrees [1,ensemble]
-        self.ext_gga_lon_deg = None         # Raw longitude, in degrees [1,ensemble]
-        self.ext_gga_altitude_m = None      # Raw altitude, in meters [1,ensemble]
-        self.ext_gga_differential = None    # Differential correction indicator [1,ensemble]
-        self.ext_gga_hdop = None            # Horizontal dilution of precision [1,ensemble]
-        self.ext_gga_utc = None             # UTC time, in hhmmss.ss [1, ensemble]
-        self.ext_gga_serial_time = None     # UTC time of gga data, in seconds past midnight [1,ensemble]
-        self.ext_gga_num_sats = None        # Number of satellites reported by software [1,ensemble]
-        self.ext_vtg_course_deg = None      # Course, in degress [1, ensemble]
-        self.ext_vtg_speed_mps = None       # Speed, in m/s [1, ensemble]
-       
+        self.ext_gga_lat_deg = None
+        self.ext_gga_lon_deg = None
+        self.ext_gga_altitude_m = None
+        self.ext_gga_differential = None
+        self.ext_gga_hdop = None
+        self.ext_gga_utc = None
+        self.ext_gga_serial_time = None
+        self.ext_gga_num_sats = None
+        self.ext_vtg_course_deg = None
+        self.ext_vtg_speed_mps = None
+
         # User specification
-        self.gga_position_method = None     # Method used to process gga data for position ('End', 'Average' 'External')
-        self.gga_velocity_method = None     # Method used to process gga data for velocity ('End','Average' 'External')
-        self.vtg_velocity_method = None     # Method used to process vtg data for velocity ('Average' 'External)
-        
+        self.gga_position_method = None
+        self.gga_velocity_method = None
+        self.vtg_velocity_method = None
+
         # Computed properties for ensembles
-        self.gga_lat_ens_deg = None         # Processed latitude in degrees, [ensemble]
-        self.gga_lon_ens_deg = None         # Processed longitude in degrees, [ensemble]
-        self.utm_ens_m = None               # UTM position from processed gga data, [2,ensemble]
-        self.gga_velocity_ens_mps = None    # Boat velocity computed from gga data [2,ensemble]
-        self.gga_serial_time_ens = None     # UTC time of gga data in seconds past midnight, [ensemble]
-        self.vtg_velocity_ens_mps = None    # Boat velocity computed from vtg data [2,ensemble]
-        self.per_good_ens = None            # Percentage of available data used to compute ensemble value [ensemble]
-        self.hdop_ens = None                # HDOP for each ensemble using velocity method [ensemble]
-        self.num_sats_ens = None            # Number of satellites for each ensemble, using velocity method [ensemble]
-        self.altitude_ens_m = None          # Altitude for each ensemble, using velocity method [ensemble]
-        self.diff_qual_ens = None           # Differential quality for each ensemble, using velocity method [ensemble]
-        
-    def populate_data(self, raw_gga_utc, raw_gga_lat, raw_gga_lon, raw_gga_alt, raw_gga_diff,
-                      raw_gga_hdop, raw_gga_num_sats, raw_gga_delta_time, raw_vtg_course, raw_vtg_speed,
-                      raw_vtg_delta_time, raw_vtg_mode_indicator, ext_gga_utc, ext_gga_lat, ext_gga_lon, ext_gga_alt,
-                      ext_gga_diff, ext_gga_hdop, ext_gga_num_sats, ext_vtg_course, ext_vtg_speed,
-                      gga_p_method, gga_v_method, vtg_method):
+        self.gga_lat_ens_deg = None
+        self.gga_lon_ens_deg = None
+        self.utm_ens_m = None
+        self.gga_velocity_ens_mps = None
+        self.gga_serial_time_ens = None
+        self.vtg_velocity_ens_mps = None
+        self.per_good_ens = None
+        self.hdop_ens = None
+        self.num_sats_ens = None
+        self.altitude_ens_m = None
+        self.diff_qual_ens = None
+
+    def populate_data(
+        self,
+        raw_gga_utc,
+        raw_gga_lat,
+        raw_gga_lon,
+        raw_gga_alt,
+        raw_gga_diff,
+        raw_gga_hdop,
+        raw_gga_num_sats,
+        raw_gga_delta_time,
+        raw_vtg_course,
+        raw_vtg_speed,
+        raw_vtg_delta_time,
+        raw_vtg_mode_indicator,
+        ext_gga_utc,
+        ext_gga_lat,
+        ext_gga_lon,
+        ext_gga_alt,
+        ext_gga_diff,
+        ext_gga_hdop,
+        ext_gga_num_sats,
+        ext_vtg_course,
+        ext_vtg_speed,
+        gga_p_method,
+        gga_v_method,
+        vtg_method,
+    ):
         """Store and process provided data in GPSData class.
 
         Parameters
@@ -193,9 +222,11 @@ class GPSData(object):
         ext_vtg_speed: np.array(float)
             Speed for each ensemble, in m/s [ensemble]
         gga_p_method: str
-            Method used to process gga data for position ('End', 'Average' 'External')
+            Method used to process gga data for position ('End', 'Average'
+            'External')
         gga_v_method: str
-            Method used to process gga data for velocity ('End','Average' 'External')
+            Method used to process gga data for velocity ('End','Average'
+            'External')
         vtg_method: str
             Method used to process vtg data for velocity ('Average' 'External)
         """
@@ -206,23 +237,31 @@ class GPSData(object):
             self.raw_gga_serial_time = np.tile([np.nan], raw_gga_lat.shape)
         else:
             self.raw_gga_utc = raw_gga_utc
-            self.raw_gga_serial_time = np.floor(raw_gga_utc / 10000) * 3600 \
-                + np.floor(np.mod(raw_gga_utc, 10000, where=~np.isnan(raw_gga_utc)) / 100) \
-                                       * 60 + np.mod(raw_gga_utc, 100, where=~np.isnan(raw_gga_utc))
+            self.raw_gga_serial_time = (
+                np.floor(raw_gga_utc / 10000) * 3600
+                + np.floor(
+                    np.mod(raw_gga_utc, 10000, where=~np.isnan(raw_gga_utc)) / 100
+                )
+                * 60
+                + np.mod(raw_gga_utc, 100, where=~np.isnan(raw_gga_utc))
+            )
 
         self.raw_gga_lat_deg = raw_gga_lat
         self.raw_gga_lon_deg = raw_gga_lon
-        self.raw_gga_lat_deg[np.where(np.logical_and((self.raw_gga_lat_deg == 0),
-                                                     (self.raw_gga_lon_deg == 0)))] = np.nan
+        self.raw_gga_lat_deg[
+            np.where(
+                np.logical_and((self.raw_gga_lat_deg == 0), (self.raw_gga_lon_deg == 0))
+            )
+        ] = np.nan
         self.raw_gga_lat_deg[nan_less(raw_gga_diff, 1)] = np.nan
         self.raw_gga_lon_deg[np.isnan(self.raw_gga_lat_deg)] = np.nan
         self.raw_gga_altitude_m = raw_gga_alt
         self.raw_gga_altitude_m[np.isnan(self.raw_gga_lat_deg)] = np.nan
-        self.raw_gga_differential = raw_gga_diff.astype('float')
+        self.raw_gga_differential = raw_gga_diff.astype("float")
         self.raw_gga_differential[np.isnan(self.raw_gga_lat_deg)] = np.nan
-        self.raw_gga_hdop = raw_gga_hdop.astype('float')
+        self.raw_gga_hdop = raw_gga_hdop.astype("float")
         self.raw_gga_hdop[np.isnan(self.raw_gga_lat_deg)] = np.nan
-        self.raw_gga_num_sats = raw_gga_num_sats.astype('float')
+        self.raw_gga_num_sats = raw_gga_num_sats.astype("float")
         self.raw_gga_num_sats[np.isnan(self.raw_gga_lat_deg)] = np.nan
         self.raw_gga_serial_time[np.isnan(self.raw_gga_lat_deg)] = np.nan
 
@@ -234,8 +273,13 @@ class GPSData(object):
 
         self.raw_vtg_course_deg = raw_vtg_course
         self.raw_vtg_speed_mps = raw_vtg_speed
-        self.raw_vtg_course_deg[np.where(np.logical_and((self.raw_vtg_course_deg == 0),
-                                                        (self.raw_vtg_speed_mps == 0)))] = np.nan
+        self.raw_vtg_course_deg[
+            np.where(
+                np.logical_and(
+                    (self.raw_vtg_course_deg == 0), (self.raw_vtg_speed_mps == 0)
+                )
+            )
+        ] = np.nan
         self.raw_vtg_speed_mps[np.isnan(self.raw_vtg_course_deg)] = np.nan
 
         # Delta time is a TRDI only variable
@@ -245,7 +289,7 @@ class GPSData(object):
             self.raw_vtg_delta_time = raw_vtg_delta_time
 
         self.raw_vtg_mode_indicator = np.array(raw_vtg_mode_indicator)
-        
+
         # Assign input data to ensemble values computed by other software
         self.ext_gga_utc = ext_gga_utc
         self.ext_gga_lat_deg = ext_gga_lat
@@ -254,26 +298,30 @@ class GPSData(object):
         self.ext_gga_differential = ext_gga_diff
         self.ext_gga_hdop = ext_gga_hdop
         self.ext_gga_num_sats = ext_gga_num_sats
-        self.ext_gga_serial_time = np.floor(np.array(ext_gga_utc) / 10000) * 3600 + \
-            np.floor(np.mod(ext_gga_utc, 10000) / 100) * 60 + np.mod(ext_gga_utc, 100)
+        self.ext_gga_serial_time = (
+            np.floor(np.array(ext_gga_utc) / 10000) * 3600
+            + np.floor(np.mod(ext_gga_utc, 10000) / 100) * 60
+            + np.mod(ext_gga_utc, 100)
+        )
         self.ext_vtg_course_deg = ext_vtg_course
         self.ext_vtg_speed_mps = ext_vtg_speed
-        
+
         # Assign input data to method properties
         self.gga_position_method = gga_p_method
         self.gga_velocity_method = gga_v_method
         self.vtg_velocity_method = vtg_method
-        
+
         # If gga data exist compute position and velocity
-        if np.sum(np.sum(np.isnan(raw_gga_lat) == False)) > 0:
+        if np.sum(np.sum(np.logical_not(np.isnan(raw_gga_lat)))) > 0:
             self.process_gga()
-        
+
         # If vtg data exist compute velocity
-        if np.sum(np.sum(np.isnan(raw_vtg_speed) == False)) > 0:
+        if np.sum(np.sum(np.logical_not(np.isnan(raw_vtg_speed)))) > 0:
             self.process_vtg()
 
     def populate_from_qrev_mat(self, transect):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -281,8 +329,8 @@ class GPSData(object):
            Matlab data structure obtained from sio.loadmat
         """
 
-        if hasattr(transect, 'gps'):
-            if hasattr(transect.gps, 'diffQualEns'):
+        if hasattr(transect, "gps"):
+            if hasattr(transect.gps, "diffQualEns"):
 
                 # Raw properties
                 self.raw_gga_lat_deg = transect.gps.rawGGALat_deg
@@ -297,10 +345,13 @@ class GPSData(object):
                 self.raw_vtg_speed_mps = transect.gps.rawVTGSpeed_mps
                 self.raw_vtg_delta_time = transect.gps.rawVTGDeltaTime
 
-                # Older versions of QRev Matlab files represented the VTG mode differently.
+                # Older versions of QRev Matlab files represented the VTG
+                # mode differently.
                 try:
-                    if transect.gps.rawVTGModeIndicator.ndim == 2 and \
-                            type(transect.gps.rawVTGModeIndicator[0][0]) is np.float64:
+                    if (
+                        transect.gps.rawVTGModeIndicator.ndim == 2
+                        and type(transect.gps.rawVTGModeIndicator[0][0]) is np.float64
+                    ):
                         indicator = []
                         for row in transect.gps.rawVTGModeIndicator.astype(int):
                             row_indicator = []
@@ -308,11 +359,13 @@ class GPSData(object):
                                 if 127 > value > 0:
                                     row_indicator.append(chr(value))
                                 else:
-                                    row_indicator. append('')
+                                    row_indicator.append("")
                             indicator.append(row_indicator)
                         self.raw_vtg_mode_indicator = np.array(indicator)
                     else:
-                        raw_vtg_mode_indicator = transect.gps.rawVTGModeIndicator.tolist()
+                        raw_vtg_mode_indicator = (
+                            transect.gps.rawVTGModeIndicator.tolist()
+                        )
                         new_list = []
                         for row in raw_vtg_mode_indicator:
                             new_list.append(list(row))
@@ -364,9 +417,11 @@ class GPSData(object):
         Parameters
         ----------
         p_setting: str
-            Specifies method to use for computing positions from gga data (External, End, First, Average, Mindt).
+            Specifies method to use for computing positions from gga data (
+            External, End, First, Average, Mindt).
         v_setting: str
-            Specifies method to use for computing velocity from gga data (External, End, First, Average, Mindt).
+            Specifies method to use for computing velocity from gga data (
+            External, End, First, Average, Mindt).
         """
 
         if p_setting is None:
@@ -374,39 +429,39 @@ class GPSData(object):
 
         if v_setting is None:
             v_setting = self.gga_velocity_method
-            
+
         # Use only valid gga data
         valid = np.copy(self.raw_gga_lat_deg)
         valid[np.logical_not(np.isnan(valid))] = 1
         valid[np.isnan(valid)] = 0
         # valid[valid > 0] = 1
         gga_lat_deg = np.copy(self.raw_gga_lat_deg)
-        gga_lat_deg[valid == False] = np.nan
+        gga_lat_deg[np.logical_not(valid)] = np.nan
         gga_lon_deg = np.copy(self.raw_gga_lon_deg)
-        gga_lon_deg[valid == False] = np.nan
+        gga_lon_deg[np.logical_not(valid)] = np.nan
         gga_serial_time = np.copy(self.raw_gga_serial_time)
-        gga_serial_time[valid == False] = np.nan
+        gga_serial_time[np.logical_not(valid)] = np.nan
         gga_delta_time = np.copy(self.raw_gga_delta_time)
-        gga_delta_time[valid == False] = np.nan
+        gga_delta_time[np.logical_not(valid)] = np.nan
         gga_hdop = np.copy(self.raw_gga_hdop)
-        gga_hdop[valid == False] = np.nan
+        gga_hdop[np.logical_not(valid)] = np.nan
         gga_num_sats = np.copy(self.raw_gga_num_sats)
-        gga_num_sats[valid == False] = np.nan
+        gga_num_sats[np.logical_not(valid)] = np.nan
         gga_altitude_m = np.copy(self.raw_gga_altitude_m)
-        gga_altitude_m[valid == False] = np.nan
+        gga_altitude_m[np.logical_not(valid)] = np.nan
         gga_differential = np.copy(self.raw_gga_differential)
-        gga_differential[valid == False] = np.nan
+        gga_differential[np.logical_not(valid)] = np.nan
         n_ensembles = gga_lat_deg.shape[0]
 
         # Apply method for computing position of ensemble
 
         # Use ensemble data from other software
-        if p_setting == 'External':
+        if p_setting == "External":
             self.gga_lat_ens_deg = self.ext_gga_lat_deg
             self.gga_lon_ens_deg = self.ext_gga_lon_deg
 
         # Uses last valid data for each ensemble
-        elif p_setting == 'End':
+        elif p_setting == "End":
             self.gga_lat_ens_deg = np.tile(np.nan, gga_lat_deg.shape[0])
             self.gga_lon_ens_deg = np.tile(np.nan, gga_lon_deg.shape[0])
             for n in range(n_ensembles):
@@ -419,7 +474,7 @@ class GPSData(object):
                 self.gga_lon_ens_deg[n] = gga_lon_deg[n, idx]
 
         # Use first valid data for each ensemble
-        elif p_setting == 'First':
+        elif p_setting == "First":
             self.gga_lat_ens_deg = np.tile(np.nan, gga_lat_deg.shape[0])
             self.gga_lon_ens_deg = np.tile(np.nan, gga_lon_deg.shape[0])
             for n in range(n_ensembles):
@@ -428,26 +483,26 @@ class GPSData(object):
                 self.gga_lon_ens_deg[n] = gga_lon_deg[n, idx]
 
         # Use minimum delta time
-        elif p_setting == 'Mindt':
+        elif p_setting == "Mindt":
             self.gga_lat_ens_deg = np.tile(np.nan, gga_lat_deg.shape[0])
             self.gga_lon_ens_deg = np.tile(np.nan, gga_lon_deg.shape[0])
             d_time = np.abs(gga_delta_time)
             d_time_min = np.nanmin(d_time.T, 0).T
-            
+
             use = []
             for n in range(len(d_time_min)):
                 use.append(np.abs(d_time[n, :]) == d_time_min[n])
-                
+
             use = np.array(use)
-            self.gga_lat_ens_deg = np.tile([np.nan], (len(d_time_min))) 
+            self.gga_lat_ens_deg = np.tile([np.nan], (len(d_time_min)))
             self.gga_lon_ens_deg = np.tile([np.nan], (len(d_time_min)))
             for n in range(len(d_time_min)):
-                idx = np.where(use[n, :] == True)[0]
+                idx = np.where(use[n, :])[0]
                 if len(idx) > 0:
                     idx = idx[0]
                     self.gga_lat_ens_deg[n] = gga_lat_deg[n, idx]
                     self.gga_lon_ens_deg[n] = gga_lon_deg[n, idx]
-                    
+
         y_utm, x_utm = self.compute_utm(self.gga_lat_ens_deg, self.gga_lon_ens_deg)
         self.utm_ens_m = (x_utm, y_utm)
 
@@ -459,9 +514,9 @@ class GPSData(object):
         self.diff_qual_ens = np.tile([np.nan], n_ensembles)
         self.hdop_ens = np.tile([np.nan], n_ensembles)
         self.num_sats_ens = np.tile([np.nan], n_ensembles)
-        
+
         # Apply method for computing velocity of ensemble
-        if v_setting == 'External':
+        if v_setting == "External":
             lat = self.ext_gga_lat_deg
             lon = self.ext_gga_lon_deg
             self.gga_serial_time_ens = self.ext_gga_serial_time
@@ -469,9 +524,9 @@ class GPSData(object):
             self.num_sats_ens = self.ext_gga_num_sats
             self.altitude_ens_m = self.ext_gga_altitude_m
             self.diff_qual_ens = self.ext_gga_differential
-            
+
         # Average all position during an ensemble
-        elif v_setting == 'Average':
+        elif v_setting == "Average":
             lat = np.nanmean(gga_lat_deg, 1)
             lon = np.nanmean(gga_lon_deg, 1)
             self.gga_serial_time_ens = np.nanmean(gga_serial_time, 1)
@@ -479,12 +534,12 @@ class GPSData(object):
             self.num_sats_ens = np.floor(np.nanmean(gga_num_sats, 1))
             self.altitude_ens_m = np.nanmean(self.raw_gga_altitude_m, 1)
             self.diff_qual_ens = np.floor(np.nanmean(self.raw_gga_differential, 1))
-            
+
         # Use the last valid data in an ensemble
-        elif v_setting == 'End':
+        elif v_setting == "End":
 
             for n in range(n_ensembles):
-                idx = np.where(np.isnan(gga_lat_deg[n, :]) == False)[0]
+                idx = np.where(np.logical_not(np.isnan(gga_lat_deg[n, :])))[0]
                 if len(idx) > 0:
                     idx = idx[-1]
                     lat[n] = gga_lat_deg[n, idx]
@@ -495,12 +550,12 @@ class GPSData(object):
 
                 if idx <= len(self.raw_gga_hdop):
                     self.hdop_ens[n] = gga_hdop[n, idx]
-                    
+
                 if idx <= len(gga_num_sats[n]):
                     self.num_sats_ens[n] = gga_num_sats[n, idx]
 
         # Use the first valid data in an ensemble
-        elif v_setting == 'First':
+        elif v_setting == "First":
             for n in range(n_ensembles):
                 idx = 0
                 lat[n] = gga_lat_deg[n, idx]
@@ -508,23 +563,23 @@ class GPSData(object):
                 self.gga_serial_time_ens[n] = gga_serial_time[n, idx]
                 self.altitude_ens_m[n] = gga_altitude_m[n, idx]
                 self.diff_qual_ens[n] = gga_differential[n, idx]
-                
+
                 if idx <= len(self.raw_gga_hdop):
                     self.hdop_ens[n] = gga_hdop[n, idx]
-                    
+
                 if idx <= len(gga_num_sats[n]):
                     self.num_sats_ens[n] = gga_num_sats[n, idx]
 
         # Use the minimum delta time to assign data to an ensemble
-        elif v_setting == 'Mindt':
+        elif v_setting == "Mindt":
             d_time = np.abs(gga_delta_time)
             d_time_min = np.nanmin(d_time, 1)
             use = []
             for n in range(len(d_time_min)):
                 use.append(np.abs(d_time[n, :]) == d_time_min[n])
-            use = np.array(use)  
+            use = np.array(use)
             for n in range(len(d_time_min)):
-                idx = np.where(use[n, :] == True)[0]
+                idx = np.where(use[n, :])[0]
                 if len(idx) > 0:
                     idx = idx[0]
                     lat[n] = gga_lat_deg[n, idx]
@@ -532,15 +587,15 @@ class GPSData(object):
                     self.gga_serial_time_ens[n] = gga_serial_time[n, idx]
                     self.altitude_ens_m[n] = gga_altitude_m[n, idx]
                     self.diff_qual_ens[n] = gga_differential[n, idx]
-                    
+
                 if idx <= len(gga_hdop[n]):
                     self.hdop_ens[n] = gga_hdop[n, idx]
-                    
+
                 if idx <= len(gga_num_sats[n]):
                     self.num_sats_ens[n] = gga_num_sats[n, idx]
-                    
+
         # Identify valid values
-        idx_values = np.where(np.isnan(x_utm) == False)[0]
+        idx_values = np.where(np.logical_not(np.isnan(x_utm)))[0]
         if len(idx_values) > 1:
             u, v = self.gga2_vel_trdi(lat, lon, self.gga_serial_time_ens, idx_values)
             self.gga_velocity_ens_mps = np.tile([np.nan], (2, len(lat)))
@@ -550,14 +605,15 @@ class GPSData(object):
             self.gga_velocity_ens_mps = np.tile([np.nan], (2, len(lat)))
 
     def process_vtg(self, v_setting=None):
-        """Processes raw vtg data to achieve a velocity for each ensemble containing data.
+        """Processes raw vtg data to achieve a velocity for each ensemble
+        containing data.
 
         Parameters
         ----------
         v_setting: str
             Method to used to compute ensemble velocity.
         """
-        
+
         # Determine method used to compute ensemble velocity
         if v_setting is None:
             v_setting = self.vtg_velocity_method
@@ -568,13 +624,13 @@ class GPSData(object):
         vtg_delta_time = np.copy(self.raw_vtg_delta_time)
 
         # Use mode indicator to identify invalid original data
-        idx = np.where(self.raw_vtg_mode_indicator == 'N')
+        idx = np.where(self.raw_vtg_mode_indicator == "N")
         vtg_speed_mps[idx] = np.nan
         vtg_course_deg[idx] = np.nan
         vtg_delta_time[idx] = np.nan
 
         # Use average velocity for ensemble velocity
-        if v_setting == 'Average':
+        if v_setting == "Average":
             # Compute vtg velocity in x y coordinates from speed and course
             direction = azdeg2rad(vtg_course_deg)
             vx, vy = pol2cart(direction, vtg_speed_mps)
@@ -585,11 +641,11 @@ class GPSData(object):
             self.vtg_velocity_ens_mps = np.vstack([vx_mean.T, vy_mean.T])
 
         # Use last velocity for ensemble velocity
-        elif v_setting == 'End':
+        elif v_setting == "End":
             n_ensembles = vtg_speed_mps.shape[0]
             vtg_vel = nans(n_ensembles)
             vtg_dir = nans(n_ensembles)
-            
+
             for n in range(n_ensembles):
                 idx = np.where(~np.isnan(vtg_speed_mps[n, :]))[0]
                 if len(idx) > 0:
@@ -598,7 +654,7 @@ class GPSData(object):
                     idx = 0
                 vtg_vel[n] = vtg_speed_mps[n, idx]
                 vtg_dir[n] = vtg_course_deg[n, idx]
-                
+
             direction = azdeg2rad(vtg_dir)
             vx, vy = pol2cart(direction, vtg_vel)
             vx[np.logical_and(vx == 0, vy == 0)] = np.nan
@@ -606,11 +662,11 @@ class GPSData(object):
             self.vtg_velocity_ens_mps = np.vstack([vx, vy])
 
         # Use first velocity for ensemble velocity
-        elif v_setting == 'First':
+        elif v_setting == "First":
             n_ensembles = vtg_speed_mps.shape[0]
             vtg_vel = nans(n_ensembles)
             vtg_dir = nans(n_ensembles)
-            
+
             for n in range(n_ensembles):
                 idx = 0
                 vtg_vel[n] = vtg_speed_mps[n, idx]
@@ -621,22 +677,23 @@ class GPSData(object):
             vy[np.isnan(vx)] = np.nan
             self.vtg_velocity_ens_mps = np.vstack([vx, vy])
 
-        # Use the velocity with the minimum delta time for the ensemble velocity
-        elif v_setting == 'Mindt':
+        # Use the velocity with the minimum delta time for the ensemble
+        # velocity
+        elif v_setting == "Mindt":
             d_time = np.abs(vtg_delta_time)
             # d_time[d_time==0] = np.nan
             d_time_min = np.nanmin(d_time.T, 0).T
-            
+
             use = []
             vtg_speed = []
             vtg_dir = []
-            
+
             for n in range(len(d_time_min)):
                 use.append(np.abs(d_time[n, :]) == d_time_min[n])
-                
+
             use = np.array(use)
             for n in range(len(d_time_min)):
-                idx = np.where(use[n, :] == True)[0]
+                idx = np.where(use[n, :])[0]
                 if len(idx) > 0:
                     idx = idx[0]
                     vtg_speed.append(vtg_speed_mps[n, idx])
@@ -644,13 +701,13 @@ class GPSData(object):
                 else:
                     vtg_speed.append(np.nan)
                     vtg_dir.append(np.nan)
-                    
+
                 direction = azdeg2rad(np.array(vtg_dir))
                 vx, vy = pol2cart(direction, np.array(vtg_speed))
                 self.vtg_velocity_ens_mps = np.vstack([vx, vy])
 
         # Use velocity selected by external algorithm for ensemble velocity
-        elif v_setting == 'External':
+        elif v_setting == "External":
             direction = azdeg2rad(self.ext_vtg_course_deg)
             vx, vy = pol2cart(direction, self.ext_vtg_speed_mps)
             self.vtg_velocity_ens_mps = np.vstack([vx.T, vy.T])
@@ -673,50 +730,60 @@ class GPSData(object):
 
         lat2 = np.deg2rad(lat_in)
         lon2 = np.deg2rad(lon_in)
-        
+
         y = np.tile([np.nan], lat_in.shape)
         x = np.tile([np.nan], lon_in.shape)
-        idx = np.where(np.logical_and((np.isnan(lat2) == False), (np.isnan(lon2) == False)))
+        idx = np.where(
+            np.logical_and(
+                (np.logical_not(np.isnan(lat2))), (np.logical_not(np.isnan(lon2)))
+            )
+        )
         for ind in idx[0]:
             y[ind], x[ind], _, _ = utm.from_latlon(lat2[ind], lon2[ind])
         x_utm = x.reshape(lon_in.shape)
         y_utm = y.reshape(lat_in.shape)
-        
+
         return y_utm, x_utm
 
     @staticmethod
     def gga2_vel_trdi(lat, lon, t, idx_values):
-        """Computes velocity from gga data using approach from TRDI WinRiver II.
+        """Computes velocity from gga data using approach from TRDI WinRiver
+        II.
 
         Parameters
         ----------
         lat: np.array(float)
-            Latitude for each ensemble used for velocity computations, in degrees.
+            Latitude for each ensemble used for velocity computations,
+            in degrees.
         lon: np.array(float)
-            Longitude for each ensemble used for velocity computations, in degrees.
+            Longitude for each ensemble used for velocity computations,
+            in degrees.
         t: np.array(float)
-            GGA time associated with the latitude and longitude selected for velocity computations.
+            GGA time associated with the latitude and longitude selected for
+            velocity computations.
         idx_values: np.array(bool)
             Index of valid lat-lon data.
         """
-        
+
         u = np.zeros(lat.shape)
         v = np.zeros(lat.shape)
-        
+
         for n in range(1, len(idx_values)):
-            lat1 = lat[idx_values[n-1]]
+            lat1 = lat[idx_values[n - 1]]
             lat2 = lat[idx_values[n]]
-            lon1 = lon[idx_values[n-1]]
+            lon1 = lon[idx_values[n - 1]]
             lon2 = lon[idx_values[n]]
-            t1 = t[idx_values[n-1]]
+            t1 = t[idx_values[n - 1]]
             t2 = t[idx_values[n]]
 
             lat_avg_rad = ((lat1 + lat2) / 2) * np.pi / 180
             sin_lat_avg_rad = np.sin(lat_avg_rad)
             coefficient = 6378137 * np.pi / 180
             ellipticity = 1 / 298.257223563
-            re = coefficient * (1 + ellipticity * sin_lat_avg_rad ** 2)
-            rn = coefficient * (1 - 2 * ellipticity + 3 * ellipticity * sin_lat_avg_rad ** 2)
+            re = coefficient * (1 + ellipticity * sin_lat_avg_rad**2)
+            rn = coefficient * (
+                1 - 2 * ellipticity + 3 * ellipticity * sin_lat_avg_rad**2
+            )
             delta_x = re * (lon2 - lon1) * np.cos(lat_avg_rad)
             delta_y = rn * (lat2 - lat1)
             delta_time = t2 - t1
@@ -726,6 +793,5 @@ class GPSData(object):
             else:
                 u[idx_values[n]] = np.nan
                 v[idx_values[n]] = np.nan
-            
-        return u, v
 
+        return u, v
diff --git a/qrevint_22_06_22/Classes/HeadingData.py b/Classes/HeadingData.py
similarity index 78%
rename from qrevint_22_06_22/Classes/HeadingData.py
rename to Classes/HeadingData.py
index aa660d5de5ed3ed159c452945dcd03fedacf8889..d9d084956587ca93fa363aa2aa520b38ca41388c 100644
--- a/qrevint_22_06_22/Classes/HeadingData.py
+++ b/Classes/HeadingData.py
@@ -14,13 +14,16 @@ class HeadingData(object):
     source: str
         Source of heading data (internal, external).
     mag_var_deg: float
-        Magnetic variation applied to get corrected data, in degrees (East +, West -).
+        Magnetic variation applied to get corrected data, in degrees (East
+        +, West -).
     mag_var_orig_deg: float
         Original magnetic variation, in degrees (East +, West -).
     align_correction_deg: float
-        Alignment correction to align compass with instrument (used for external heading), in degrees CW.
+        Alignment correction to align compass with instrument (used for
+        external heading), in degrees CW.
     align_correction_orig_deg: float
-        Alignment correction to align compass with instrument (used for external heading), in degrees CW.
+        Alignment correction to align compass with instrument (used for
+        external heading), in degrees CW.
     mag_error: np.array(float)
         Percent change in mean magnetic field from calibration (SonTek only).`
     pitch_limit: np.array(float)
@@ -28,22 +31,31 @@ class HeadingData(object):
     roll_limit: np.array(float)
         Roll limit of compass calibration (SonTek only), in degrees.
     """
-    
+
     def __init__(self):
         """Initialize class and set variables to None."""
 
-        self.data = None  # Corrected self.data data
-        self.original_data = None  # original uncorrected self.data data
-        self.source = None  # Source of self.data data (internal, external)
-        self.mag_var_deg = None  # Magnetic variation for these self.data data
-        self.mag_var_orig_deg = None  # Original magnetic variation
-        self.align_correction_deg = None  # Alignment correction to align compass with instrument
+        self.data = None
+        self.original_data = None
+        self.source = None
+        self.mag_var_deg = None
+        self.mag_var_orig_deg = None
+        self.align_correction_deg = None
         self.align_correction_orig_deg = None
-        self.mag_error = None  # Percent change in mean magnetic field from calibration`
-        self.pitch_limit = None  # Pitch limit of compass calibration (SonTek only), in degrees.
-        self.roll_limit = None  # Roll limit of compass calibration (SonTek only), in degrees.
-        
-    def populate_data(self, data_in, source_in, magvar=0, align=0, mag_error=None, pitch_limit=None, roll_limit=None):
+        self.mag_error = None
+        self.pitch_limit = None
+        self.roll_limit = None
+
+    def populate_data(
+        self,
+        data_in,
+        source_in,
+        magvar=0,
+        align=0,
+        mag_error=None,
+        pitch_limit=None,
+        roll_limit=None,
+    ):
         """Assigns values to instance variables.
 
         Parameters
@@ -83,7 +95,7 @@ class HeadingData(object):
             self.roll_limit = roll_limit
 
         # Correct the original data for the magvar and alignment
-        if source_in == 'internal':
+        if source_in == "internal":
             self.data = self.original_data + self.mag_var_deg
         else:
             self.data = self.original_data + self.align_correction_deg
@@ -91,7 +103,8 @@ class HeadingData(object):
         self.interp_heading()
 
     def populate_from_qrev_mat(self, mat_data):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -105,7 +118,7 @@ class HeadingData(object):
         self.mag_var_deg = float(mat_data.magVar_deg)
         self.mag_var_orig_deg = float(mat_data.magVarOrig_deg)
         self.align_correction_deg = mat_data.alignCorrection_deg
-        if hasattr(mat_data, 'align_correction_orig_deg'):
+        if hasattr(mat_data, "align_correction_orig_deg"):
             self.align_correction_orig_deg = mat_data.align_correction_orig_deg
         else:
             self.align_correction_orig_deg = mat_data.alignCorrection_deg
@@ -145,10 +158,10 @@ class HeadingData(object):
         """
 
         self.mag_var_deg = mag_var
-        if h_source == 'internal':
+        if h_source == "internal":
             self.data = self.original_data + self.mag_var_deg
             self.fix_upper_limit()
-            
+
     def set_align_correction(self, align_correction, h_source):
         """Applies a new alignment correction to the object data.
 
@@ -161,38 +174,41 @@ class HeadingData(object):
         """
 
         self.align_correction_deg = align_correction
-        if h_source == 'external':
+        if h_source == "external":
             self.data = self.original_data + self.align_correction_deg
             self.fix_upper_limit()
 
     def fix_upper_limit(self):
-        """Fixes heading when magvar and or alignment are applied resulting in heading greater than 360 degrees.
+        """Fixes heading when magvar and or alignment are applied resulting
+        in heading greater than 360 degrees.
         """
 
         idx = np.where(self.data > 360)[0]
         if len(idx) > 0:
-            self.data[idx] = self.data[idx] - 360   
-            
+            self.data[idx] = self.data[idx] - 360
+
     def interp_heading(self):
         """Interpolate invalid headings. Use linear interpolation if there are
-        valid values on either side of the invalid heading. If the invalid heading
-        occurs at the beginning of the time series, back fill using the 1st valid.
-        If the invalid heading occurs at the end of the time series, forward fill
-        with the last valid self.data.
+        valid values on either side of the invalid heading. If the invalid
+        heading occurs at the beginning of the time series, back fill using the 1st
+        valid. If the invalid heading occurs at the end of the time series, forward
+        fill with the last valid self.data.
         """
-        
+
         idx_invalid = np.where(np.isnan(self.data))[0]
-        
+
         if len(idx_invalid) > 0:
-            
+
             first_valid_idx = np.where(np.isnan(self.data) == False)[0][0]
             last_valid_idx = np.where(np.isnan(self.data) == False)[0][-1]
-        
+
             # Process each invalid self.data
             for n in range(len(idx_invalid)):
-                before_idx = np.where(np.isnan(self.data[0:idx_invalid[n] + 1]) == False)[0]
-                after_idx = np.where(np.isnan(self.data[idx_invalid[n]:]) == False)[0]
-                
+                before_idx = np.where(
+                    np.isnan(self.data[0 : idx_invalid[n] + 1]) == False
+                )[0]
+                after_idx = np.where(np.isnan(self.data[idx_invalid[n] :]) == False)[0]
+
                 # If invalid self.data is beginning back fill
                 if len(before_idx) < 1:
                     self.data[idx_invalid[n]] = self.data[first_valid_idx]
@@ -205,7 +221,7 @@ class HeadingData(object):
                 else:
                     before_idx = before_idx[-1]
                     after_idx = after_idx[0] + idx_invalid[n]
-                    
+
                     test1 = self.data[before_idx] > 180
                     test2 = self.data[after_idx] > 180
                     c = None
@@ -215,9 +231,13 @@ class HeadingData(object):
                         c = 360
                     elif test2:
                         c = -360
-                    self.data[idx_invalid[n]] = (((self.data[after_idx] - self.data[before_idx] + c) /
-                                                  (before_idx - after_idx)) *
-                                                 (before_idx - idx_invalid[n])) + self.data[before_idx]
+                    self.data[idx_invalid[n]] = (
+                        (
+                            (self.data[after_idx] - self.data[before_idx] + c)
+                            / (before_idx - after_idx)
+                        )
+                        * (before_idx - idx_invalid[n])
+                    ) + self.data[before_idx]
                     if self.data[idx_invalid[n]] > 360:
                         self.data[idx_invalid[n]] = self.data[idx_invalid[n]] - 360
                     elif self.data[idx_invalid[n]] < 0:
diff --git a/Classes/InstrumentData.py b/Classes/InstrumentData.py
new file mode 100644
index 0000000000000000000000000000000000000000..51769fec35a1e5ad3511e6dbad6fb85955e0ecbb
--- /dev/null
+++ b/Classes/InstrumentData.py
@@ -0,0 +1,322 @@
+import numpy as np
+from Classes.TransformationMatrix import TransformationMatrix
+
+
+class InstrumentData(object):
+    """Container for characteristics of the ADCP used to make the measurement
+
+    Attributes
+    ----------
+    serial_num: str
+        Serial number of ADCP.
+    manufacturer: str
+        Name of manufacturer.
+    model: str
+        Model name of ADCP.
+    firmware: str
+        Firmware version in the ADCP.
+    frequency_khz:
+        Frequency or frequencies used by ADCP.
+    beam_angle_deg:
+        Angle of the beams from vertical in degrees.
+    beam_pattern:
+        Pattern of the beam angles, concave or convex.
+    t_matrix: TransformationMatrix
+        Object of TransformationMatrix.
+    configuration_commands:
+        Commands used to configure the instrument.
+    """
+
+    def __init__(self):
+        """Constructor initializes the variables to None."""
+
+        self.serial_num = None
+        self.manufacturer = None
+        self.model = None
+        self.firmware = None
+        self.frequency_khz = None
+        self.beam_angle_deg = None
+        self.beam_pattern = None
+        self.t_matrix = None
+        self.configuration_commands = np.array([])
+
+    def populate_data(self, manufacturer, raw_data, mmt_transect=None, mmt=None):
+        """Manages method calls for different manufacturers.
+
+        Parameters
+        ----------
+        manufacturer: str
+            Name of manufacturer.
+        raw_data: object
+            Object of Pd0TRDI for TRDI or Object of MatSonTek for SonTek
+        mmt_transect: MMT_Transect
+            Object of Transect (mmt object)
+        mmt: MMT_TRDI
+            Object of MMT_TRDI
+        """
+
+        # Process based on manufacturer
+        if manufacturer == "TRDI":
+            self.manufacturer = manufacturer
+            self.trdi(pd0=raw_data, mmt_transect=mmt_transect, mmt=mmt)
+        elif manufacturer == "SonTek":
+            self.manufacturer = manufacturer
+            self.sontek(rs=raw_data)
+        elif manufacturer == "Nortek":
+            self.manufacturer = manufacturer
+            self.nortek(rs=raw_data)
+
+    def trdi(self, pd0, mmt_transect, mmt):
+        """Populates the variables with data from TRDI ADCPs.
+
+        Parameters
+        ----------
+        pd0: Pd0TRDI
+            Object of Pd0TRDI
+        mmt_transect: MMT_Transect
+            Object of MMT_Transect
+        mmt: MMT_Transect
+            Object of MMT_Transect
+        """
+
+        # Instrument frequency
+        self.frequency_khz = pd0.Inst.freq[0]
+
+        # Firmware
+        self.firmware = pd0.Inst.firm_ver[0]
+
+        # Instrument beam angle and pattern
+        self.beam_angle_deg = pd0.Inst.beam_ang[0]
+        self.beam_pattern = pd0.Inst.pat[0]
+
+        # Instrument characteristics
+        mmt_site = getattr(mmt, "site_info")
+        mmt_config = getattr(mmt_transect, "active_config")
+
+        self.serial_num = mmt_site["ADCPSerialNmb"]
+
+        # Determine TRDI model
+        num = float(self.firmware)
+        model_switch = np.floor(num)
+
+        if model_switch == 10:
+            self.model = "Rio Grande"
+            if "Fixed_Commands" in mmt_config.keys():
+                self.configuration_commands = np.append(
+                    self.configuration_commands, "Fixed"
+                )
+                self.configuration_commands = np.append(
+                    self.configuration_commands, mmt_config["Fixed_Commands"]
+                )
+
+        elif model_switch == 31:
+            self.model = "StreamPro"
+            self.frequency_khz = 2000
+            if "Fixed_Commands_StreamPro" in mmt_config.keys():
+                self.configuration_commands = np.append(
+                    self.configuration_commands, "Fixed"
+                )
+                self.configuration_commands = np.append(
+                    self.configuration_commands, mmt_config["Fixed_Commands_StreamPro"]
+                )
+
+        elif model_switch == 44:
+            self.model = "RiverRay"
+            if "Fixed_Commands_RiverRay" in mmt_config.keys():
+                self.configuration_commands = np.append(
+                    self.configuration_commands, "Fixed"
+                )
+                self.configuration_commands = np.append(
+                    self.configuration_commands, mmt_config["Fixed_Commands_RiverRay"]
+                )
+
+        elif model_switch == 56:
+            self.model = "RiverPro"
+            if pd0.Cfg.n_beams[0] < 5:
+                if "RG_Test" in mmt.qaqc.keys():
+                    idx = mmt.qaqc["RG_Test"][0].find("RioPro")
+                    if idx != -1:
+                        self.model = "RioPro"
+                    else:
+                        self.model = "RiverPro"
+                else:
+                    # Assume RioPro based on number of beams
+                    self.model = "RioPro"
+
+            if "Fixed_Commands_RiverPro" in mmt_config.keys():
+                self.configuration_commands = np.append(
+                    self.configuration_commands, "Fixed"
+                )
+                self.configuration_commands = np.append(
+                    self.configuration_commands, mmt_config["Fixed_Commands_RiverPro"]
+                )
+            else:
+                self.configuration_commands = np.append(
+                    self.configuration_commands, "Fixed"
+                )
+                self.configuration_commands = np.append(
+                    self.configuration_commands, " "
+                )
+
+        else:
+            self.model = "Unknown"
+            if "Fixed_Commands" in mmt_config.keys():
+                self.configuration_commands = np.append(
+                    self.configuration_commands, "Fixed"
+                )
+                self.configuration_commands = np.append(
+                    self.configuration_commands, mmt_config["Fixed_Commands"]
+                )
+
+        if "Wizard_Commands" in mmt_config.keys():
+            self.configuration_commands = np.append(
+                self.configuration_commands, ["Wizard"]
+            )
+            self.configuration_commands = np.append(
+                self.configuration_commands, mmt_config["Wizard_Commands"]
+            )
+
+        if "User_Commands" in mmt_config.keys():
+            self.configuration_commands = np.append(
+                self.configuration_commands, ["User"]
+            )
+            self.configuration_commands = np.append(
+                self.configuration_commands, mmt_config["User_Commands"]
+            )
+
+        # Obtain transformation matrix from one of the available sources
+        if not np.isnan(pd0.Inst.t_matrix[0, 0]):
+            self.t_matrix = TransformationMatrix()
+            self.t_matrix.populate_data(manufacturer="TRDI", model="pd0", data_in=pd0)
+        # elif self.model == "RiverRay":
+        #     self.t_matrix = TransformationMatrix()
+        #     self.t_matrix.populate_data(
+        #         manufacturer="TRDI", model=self.model, data_in="Nominal"
+        #     )
+        else:
+            if isinstance(mmt.qaqc, dict) and len(mmt.qaqc) > 0:
+                if "RG_Test" in mmt.qaqc.keys():
+
+                    self.t_matrix = TransformationMatrix()
+                    self.t_matrix.populate_data(
+                        manufacturer="TRDI",
+                        model=self.model,
+                        data_in=mmt.qaqc["RG_Test"][0],
+                    )
+
+                elif "Compass_Calibration" in mmt.qaqc.keys():
+
+                    self.t_matrix = TransformationMatrix()
+                    self.t_matrix.populate_data(
+                        manufacturer="TRDI",
+                        model=self.model,
+                        data_in=mmt.qaqc["Compass_Calibration"][0],
+                    )
+
+                elif "Compass_Eval_Timestamp" in mmt.qaqc.keys():
+
+                    self.t_matrix = TransformationMatrix()
+                    self.t_matrix.populate_data(
+                        manufacturer="TRDI",
+                        model=self.model,
+                        data_in=mmt.qaqc["Compass_Evaluation"][0],
+                    )
+
+                else:
+                    self.t_matrix = TransformationMatrix()
+                    self.t_matrix.populate_data(
+                        manufacturer="TRDI", model=self.model, data_in="Nominal"
+                    )
+            else:
+                self.t_matrix = TransformationMatrix()
+                self.t_matrix.populate_data(
+                    manufacturer="TRDI", model=self.model, data_in="Nominal"
+                )
+
+    def sontek(self, rs):
+        """Populates the variables with data from SonTek ADCPs.
+
+        Parameters
+        ----------
+        rs: MatSonTek
+        """
+
+        self.serial_num = rs.System.SerialNumber
+        self.frequency_khz = rs.Transformation_Matrices.Frequency
+        if self.frequency_khz[2] > 0:
+            self.model = "M9"
+        elif hasattr(rs.WaterTrack, "Vel_Expected_StdDev"):
+            self.model = "RS5"
+        else:
+            self.model = "S5"
+        if hasattr(rs, "SystemHW"):
+            revision = str(rs.SystemHW.FirmwareRevision)
+            if len(revision) < 2:
+                revision = "0" + revision
+            self.firmware = str(rs.SystemHW.FirmwareVersion) + "." + revision
+        elif self.model == "RS5":
+            try:
+                self.firmware = str(rs.System.FirmwareVersion)
+            except BaseException:
+                self.firmware = ""
+        else:
+            self.firmware = ""
+        self.beam_angle_deg = 25
+        self.beam_pattern = "Convex"
+        self.t_matrix = TransformationMatrix()
+        self.t_matrix.populate_data("SonTek", data_in=rs.Transformation_Matrices.Matrix)
+        self.configuration_commands = None
+
+    def nortek(self, rs):
+        """Populates the variables with data from Nortek ADCPs.
+
+        Parameters
+        ----------
+        rs: MatSonTek
+        """
+
+        self.serial_num = rs.System.SerialNumber
+        self.frequency_khz = rs.Transformation_Matrices.Frequency
+        self.model = rs.System.InstrumentModel
+        if hasattr(rs, "SystemHW"):
+            revision = str(rs.SystemHW.FirmwareRevision)
+            if len(revision) < 2:
+                revision = "0" + revision
+            self.firmware = str(rs.SystemHW.FirmwareVersion) + "." + revision
+        else:
+            self.firmware = ""
+        self.beam_angle_deg = 25
+        self.beam_pattern = "Convex"
+        self.t_matrix = TransformationMatrix()
+        self.t_matrix.populate_data("SonTek", data_in=rs.Transformation_Matrices.Matrix)
+        self.configuration_commands = None
+
+    def populate_from_qrev_mat(self, transect):
+        """Populates the object using data from previously saved QRev Matlab
+         file.
+
+         Parameters
+        ----------
+        transect: mat_struct
+            Matlab data structure obtained from sio.loadmat
+        """
+
+        self.serial_num = str(transect.adcp.serialNum)
+        self.manufacturer = transect.adcp.manufacturer
+        self.model = transect.adcp.model
+        self.firmware = transect.adcp.firmware
+        self.frequency_khz = transect.adcp.frequency_hz
+        self.beam_angle_deg = transect.adcp.beamAngle_deg
+        self.beam_pattern = transect.adcp.beamPattern
+        self.t_matrix = TransformationMatrix()
+        self.t_matrix.populate_from_qrev_mat(transect.adcp.tMatrix)
+
+        if len(transect.adcp.configurationCommands) > 0:
+            self.configuration_commands = []
+            for command in transect.adcp.configurationCommands:
+                if type(command) == str:
+                    self.configuration_commands.append(command)
+            self.configuration_commands = np.array(self.configuration_commands)
+
+        else:
+            self.configuration_commands = None
diff --git a/Classes/MAP.py b/Classes/MAP.py
new file mode 100644
index 0000000000000000000000000000000000000000..e71590c519df6d1f9e41b0937f890070dada4956
--- /dev/null
+++ b/Classes/MAP.py
@@ -0,0 +1,1643 @@
+import utm
+import copy
+from sklearn.linear_model import LinearRegression
+import numpy as np
+import scipy as sc
+import pandas as pd
+from scipy.optimize.minpack import curve_fit
+
+from MiscLibs.common_functions import cart2pol, pol2cart, nan_greater
+from MiscLibs.abba_2d_interpolation import abba_idw_interpolation
+
+
+class MAP(object):
+    """Multitransect Averaged Profile (MAP) generates an average profile of selected transects.
+
+    Attributes
+    ----------
+    slope: float
+        Slope of the average cross-section
+    intercept: float
+        Intercept of the average cross-section
+    x_raw_coordinates: np.list(np.array(float))
+        East distance from left bank for each selected transect
+    y_raw_coordinates: np.list(np.array(float))
+        North distance from left bank for each selected transect
+    x_projected: np.list(np.array(float))
+        East distance after projection on average cross-section
+    y_projected: np.list(np.array(float))
+        North distance after projection on average cross-section
+    acs_distance: np.list(np.array(float))
+        Distance from the left bank on average cross-section
+
+    primary_velocity: np.array(float)
+        Primary velocity of each MAP cell
+    secondary_velocity: np.array(float)
+        Secondary velocity of each MAP cell
+    vertical_velocity: np.array(float)
+        Vertical velocity of each MAP cell
+    streamwise_velocity: np.array(float)
+        Streamwise velocity of each MAP cell
+    east_velocity: np.array(float)
+        Velocity component in East direction
+    north_velocity: np.array(float)
+        Velocity component in North direction
+    transverse_velocity: np.array(float)
+        Transverse velocity of each MAP cell
+    depths: np.array(float) 1D
+        Depths for each MAP vertical
+    depth_by_transect: np.list(np.array(float))
+        Depth for each transect
+
+    direction_ens: np.array(float) 1D
+        Main direction of each MAP ensemble
+    borders_ens: np.array(float) 1D
+        Borders of each MAP vertical (distance from left bank)
+    x: np.array(float) 1D
+        X coordinates from the average cross-section
+    y: np.array(float) 1D
+        Y coordinates from the average cross-section
+    main_depth_layers: np.array(float) 1D
+        Borders of each MAP depth layer (distance from surface)
+    depth_cells_center: np.array(float)
+        Depth of each MAP cell center
+    distance_cells_center: np.array(float)
+        Distance of each MAP cell center
+    cells_area: np.array(float)
+        Area of each MAP cell
+
+    cells_discharge: np.array(float) 1D
+        MAP discharge for each cell
+    total_discharge: float
+        MAP total discharge
+    """
+
+    def __init__(self):
+        """Initialize class and instance variables."""
+
+        self.slope = np.nan  # Slope of the average cross-section
+        self.intercept = np.nan  # Intercept of the average cross-section
+        self.x_raw_coordinates = (
+            []
+        )  # East distance from left bank for each selected transect
+        self.y_raw_coordinates = (
+            []
+        )  # North distance from left bank for each selected transect
+        # self.lat_gps_coordinate = []  # Latitude coordinates
+        # self.lon_gps_coordinate = []  # Longitude coordinates
+        self.x_projected = (
+            None  # East distance after projection on average cross-section
+        )
+        self.y_projected = (
+            None  # North distance after projection on average cross-section
+        )
+        self.acs_distance = None  # Distance from the left bank on average cross-section
+
+        self.primary_velocity = None  # Primary velocity (ROZ) of each MAP cell
+        self.secondary_velocity = None  # Secondary velocity (ROZ) of each MAP cell
+        self.vertical_velocity = None  # Vertical velocity of each MAP cell
+        self.streamwise_velocity = None  # Streamwise velocity of each MAP cell
+        self.transverse_velocity = None  # Transverse velocity of each MAP cell
+        self.east_velocity = None  # Velocity component in East direction
+        self.north_velocity = None  # Velocity component in North direction
+        self.depths = None  # Depths for each MAP vertical
+        self.depth_by_transect = None  # Depth for each transect
+        self.rssi = None  # RSSI of each MAP cell
+        self.count_valid = None  # Count used values to compute each cell
+        self.direction_ens = None  # Main direction of each MAP ensemble
+        self.borders_ens = (
+            None  # Borders of each MAP vertical (distance from left bank)
+        )
+        self._unit = 1
+        self._x_left = 0  # Default x position in m
+        self._y_left = 0  # Default y position in m
+        self.x = None  # x coordinates
+        self.y = None  # y coordinates
+        self.main_depth_layers = (
+            None  # Borders of each MAP depth layer (distance from surface)
+        )
+        self.depth_cells_center = None  # Depth of each MAP cell center
+        self.depth_cells_border = None  # Depth layers
+        self.distance_cells_center = None  # Distance of each MAP cell center
+        self.cells_area = np.nan  # Area of each MAP cell
+        self.left_geometry = None  # Distance and shape coefficient of left bank
+        self.right_geometry = None  # Distance and shape coefficient of right bank
+
+        self.cells_discharge = None  # MAP discharge for each cell
+        self.total_discharge = None  # MAP total discharge
+
+    def populate_data(
+            self,
+            meas,
+            node_horizontal_user=None,
+            node_vertical_user=None,
+            extrap_option=True,
+            edges_option=True,
+            interp_option=False,
+            n_burn=None,
+    ):
+        """Attributes
+        ----------
+        meas: Measurement
+            Object of Measurement class
+        node_horizontal_user: float
+            Length of MAP cells, if None a value is selected automatically
+        node_vertical_user: float
+            Depth of MAP cells, if None a value is selected automatically
+        extrap_option: bool
+            Indicates if top/bottom extrapolation should be applied
+        edges_option: bool
+            Indicates if edge extrapolation should be applied
+        interp_option: bool
+            Indicates if velocities interpolation should be applied
+        """
+
+        # Get meas current parameters
+        settings = meas.current_settings()
+        checked_transect_idx = meas.checked_transect_idx
+        if n_burn is None:
+            n_burn = int(1 + len(meas.checked_transect_idx) / 3)
+
+        # Get main data from selected transects
+        data_transects = self.collect_data(meas, settings["NavRef"])
+
+        # Compute coefficients of the average cross-section
+        self.compute_coef()
+
+        # Project raw coordinates on average cross-section
+        acs_distance_raw = self.project_transect()
+
+        # Compare bathymetry and translate transects on average cross-section if needed
+        if settings["NavRef"] == "gga_vel":
+            self.acs_distance = acs_distance_raw
+        else:
+            self.translated_transects(acs_distance_raw, data_transects["depth_data"])
+
+        # Define horizontal and vertical mesh
+        self.compute_node_size(
+            meas,
+            data_transects,
+            node_horizontal_user,
+            node_vertical_user,
+            extrap_option,
+        )
+
+        # Compute transect median velocity on each mesh (North, East and vertical velocities) and depth on each vertical
+        tr_nodes_data = self.compute_nodes_velocity(
+            checked_transect_idx, data_transects
+        )
+
+        # Compute mesh mean value of selected transects
+        self.compute_mean(tr_nodes_data, n_burn)
+
+        if self.east_velocity is not None:
+            # Compute primary and secondary velocity according Rozovskii projection
+            self.compute_rozovskii(self.east_velocity, self.north_velocity)
+
+            # Interpolate empty values
+            if interp_option:
+                self.compute_interpolation()
+
+            # Compute top/bottom extrapolation according QRevInt method/exponent
+            if extrap_option:
+                self.compute_extrap_velocity(settings)
+
+            # Compute edge extrapolation
+            if edges_option:
+                self.compute_edges(settings)
+            else:
+                self.left_geometry = None
+                self.right_geometry = None
+
+            # Compute discharge
+            self.compute_discharge()
+
+        # Compute coordinates
+        direction_section = np.arctan2(self.slope, 1)
+        if self.left_geometry is not None:
+            distance = self.borders_ens - self.left_geometry[0]
+        else:
+            distance = self.borders_ens
+        x = self._unit * (distance * np.cos(direction_section))
+        y = self._unit * (distance * np.sin(direction_section))
+        self.x = self._x_left + x
+        self.y = self._y_left + y
+
+    def collect_data(self, meas, nav_ref="bt_vel"):
+        """Collect data of valid position and depth for each selected transect
+        Attributes
+        ----------
+        meas: Measurement
+            Object of Measurement class
+        interp_option: bool
+            Indicates if velocities interpolation should be applied
+        nav_ref: str
+            Current navigation reference from settings
+        Returns
+        -------
+        data_transects: dict
+            Dictionary of transects data loaded from Measurement
+        """
+        # Create empty lists to iterate
+        depth_data = []
+        w_vel_x = []
+        w_vel_y = []
+        w_vel_z = []
+        orig_start_edge = []
+        invalid_data = []
+        cell_depth = []
+        rssi = []
+        self.x_raw_coordinates = []
+        self.y_raw_coordinates = []
+
+        checked_transect_idx = meas.checked_transect_idx
+
+        left_param = np.tile([np.nan], (len(checked_transect_idx), 2))
+        right_param = np.tile([np.nan], (len(checked_transect_idx), 2))
+
+        for id_transect in checked_transect_idx:
+            transect = meas.transects[id_transect]
+            index_transect = checked_transect_idx.index(id_transect)
+            in_transect_idx = transect.in_transect_idx
+            ship_data = transect.boat_vel.compute_boat_track(transect, nav_ref)
+
+            if transect.orig_start_edge == "Right":
+                # Reverse transects in ordred to start at 0 on left edge
+                valid = transect.depths.bt_depths.valid_data[::-1]
+                if nav_ref == "gga_vel":
+                    nan_idx = np.argwhere(
+                        np.isnan(
+                            transect.gps.gga_lat_ens_deg[::-1]
+                            + transect.gps.gga_lon_ens_deg[::-1]
+                        )
+                    )
+                    for i in nan_idx:
+                        valid[i[0]] = False
+                    lat = transect.gps.gga_lat_ens_deg[::-1][valid]
+                    lon = transect.gps.gga_lon_ens_deg[::-1][valid]
+                    x_transect, y_transect, _, _ = utm.from_latlon(lat, lon)
+                else:
+                    dmg_ind = np.where(
+                        abs(ship_data["dmg_m"]) == max(abs(ship_data["dmg_m"]))
+                    )[0][0]
+                    x_track = ship_data["track_x_m"] - ship_data["track_x_m"][dmg_ind]
+                    y_track = ship_data["track_y_m"] - ship_data["track_y_m"][dmg_ind]
+                    x_transect = x_track[::-1]
+                    y_transect = y_track[::-1]
+                    x_transect = x_transect[valid]
+                    y_transect = y_transect[valid]
+                # Depth
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+                depth_transect = depth_selected.depth_processed_m[::-1]
+                cells_depth = depth_selected.depth_cell_depth_m[:, ::-1]
+                # Velocity data
+                vel_x = np.copy(transect.w_vel.u_processed_mps[:, ::-1])
+                vel_y = np.copy(transect.w_vel.v_processed_mps[:, ::-1])
+                vel_z = np.copy(transect.w_vel.w_mps[:, ::-1])
+                invalid = np.logical_not(
+                    transect.w_vel.valid_data[0, :, in_transect_idx]
+                ).T[:, ::-1]
+
+                vel_x[invalid] = np.nan
+                vel_y[invalid] = np.nan
+                vel_z[invalid] = np.nan
+                x_velocity = vel_x[:, valid]
+                y_velocity = vel_y[:, valid]
+                z_velocity = vel_z[:, valid]
+
+                # RSSI data
+                rssi_temp = np.nanmean(transect.w_vel.rssi, axis=0)[:, ::-1]
+                rssi_temp[invalid] = np.nan
+                rssi_mean = rssi_temp[:, valid]
+
+            else:
+                valid = transect.depths.bt_depths.valid_data
+                if nav_ref == "gga_vel":
+                    nan_idx = np.argwhere(
+                        np.isnan(
+                            transect.gps.gga_lat_ens_deg + transect.gps.gga_lon_ens_deg
+                        )
+                    )
+                    for i in nan_idx:
+                        valid[i[0]] = False
+                    lat = transect.gps.gga_lat_ens_deg[valid]
+                    lon = transect.gps.gga_lon_ens_deg[valid]
+                    x_transect, y_transect, _, _ = utm.from_latlon(lat, lon)
+                else:
+                    x_transect = ship_data["track_x_m"]
+                    y_transect = ship_data["track_y_m"]
+                    x_transect = x_transect[valid]
+                    y_transect = y_transect[valid]
+                # Depth
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+                depth_transect = depth_selected.depth_processed_m
+                cells_depth = depth_selected.depth_cell_depth_m
+
+                # Velocity data
+                vel_x = np.copy(transect.w_vel.u_processed_mps)
+                vel_y = np.copy(transect.w_vel.v_processed_mps)
+                vel_z = np.copy(transect.w_vel.w_mps)
+                invalid = np.logical_not(
+                    transect.w_vel.valid_data[0, :, in_transect_idx]
+                ).T
+
+                vel_x[invalid] = np.nan
+                vel_y[invalid] = np.nan
+                vel_z[invalid] = np.nan
+                x_velocity = vel_x[:, valid]
+                y_velocity = vel_y[:, valid]
+                z_velocity = vel_z[:, valid]
+
+                # RSSI data
+                rssi_temp = np.nanmean(transect.w_vel.rssi, axis=0)
+                rssi_temp[invalid] = np.nan
+                rssi_mean = rssi_temp[:, valid]
+
+            self.x_raw_coordinates.append(x_transect)
+            self.y_raw_coordinates.append(y_transect)
+            depth_data.append(depth_transect[valid])
+            cell_depth.append(cells_depth[:, valid])
+            w_vel_x.append(x_velocity)
+            w_vel_y.append(y_velocity)
+            w_vel_z.append(z_velocity)
+            invalid_data.append(invalid[:, valid])
+            rssi.append(rssi_mean)
+
+            # Edges parameters
+            left = [
+                meas.transects[id_transect].edges.left.distance_m,
+                meas.discharge[id_transect].edge_coef(
+                    "left", meas.transects[id_transect]
+                ),
+            ]
+            if isinstance(left[1], list):
+                left[1] = np.nan
+            left_param[index_transect, :] = left
+
+            right = [
+                meas.transects[id_transect].edges.right.distance_m,
+                meas.discharge[id_transect].edge_coef(
+                    "right", meas.transects[id_transect]
+                ),
+            ]
+            if isinstance(right[1], list):
+                right[1] = np.nan
+            right_param[index_transect, :] = right
+
+            self.left_geometry = np.nanmedian(left_param, axis=0)
+            self.right_geometry = np.nanmedian(right_param, axis=0)
+
+            orig_start_edge.append(transect.orig_start_edge)
+
+        data_transects = {
+            "w_vel_x": w_vel_x,
+            "w_vel_y": w_vel_y,
+            "w_vel_z": w_vel_z,
+            "depth_data": depth_data,
+            "orig_start_edge": orig_start_edge,
+            "invalid_data": invalid_data,
+            "cell_depth": cell_depth,
+            "rssi": rssi,
+        }
+        self.depth_by_transect = depth_data
+
+        return data_transects
+
+    def compute_coef(self):
+        """Compute straight average cross-section from edges coordinates."""
+
+        x_left = [item[0] for item in self.x_raw_coordinates]
+        x_right = [item[-1] for item in self.x_raw_coordinates]
+        y_left = [item[0] for item in self.y_raw_coordinates]
+        y_right = [item[-1] for item in self.y_raw_coordinates]
+
+        x_med_left = np.nanmedian(x_left)
+        y_med_left = np.nanmedian(y_left)
+        self.slope = (np.nanmedian(y_right) - y_med_left) / (
+                np.nanmedian(x_right) - x_med_left
+        )
+        self.intercept = y_med_left - self.slope * x_med_left
+        self._x_left = x_med_left
+        self._y_left = y_med_left
+        if x_med_left > np.nanmedian(x_right):
+            self._unit = -1
+        else:
+            self._unit = 1
+
+    def project_transect(self):
+        """Project transects on the average cross-section.
+        Returns
+        -------
+        acs_distance: list(np.array(float))
+            List of 1D arrays of the distance (uncorrected) from left bank on the average cross-section
+        """
+        self.x_projected = list()
+        self.y_projected = list()
+
+        # Project transect
+        for i in range(len(self.x_raw_coordinates)):
+            # Project x and y coordinates on the cross-section
+            self.x_projected.append(
+                (
+                        self.x_raw_coordinates[i]
+                        - self.slope * self.intercept
+                        + self.slope * self.y_raw_coordinates[i]
+                )
+                / (self.slope ** 2 + 1)
+            )
+            self.y_projected.append(
+                (
+                        self.intercept
+                        + self.slope * self.x_raw_coordinates[i]
+                        + self.slope ** 2 * self.y_raw_coordinates[i]
+                )
+                / (self.slope ** 2 + 1)
+            )
+
+        left_x = np.nanmedian([item[0] for item in self.x_projected])
+        left_y = np.nanmedian([item[0] for item in self.y_projected])
+
+        # Boundaries on x and y coordinates for the selected transects
+        x_boundaries = [
+            min([min(l) for l in self.x_projected]),
+            max([max(l) for l in self.x_projected]),
+        ]
+        y_boundaries = [
+            min([min(l) for l in self.y_projected]),
+            max([max(l) for l in self.y_projected]),
+        ]
+
+        # Compute distance on the average cross-section
+        acs_distance = list()
+        x_distance = np.array(self.x_projected, dtype=object) - min(
+            x_boundaries, key=lambda x: abs(x - left_x)
+        )
+        y_distance = np.array(self.y_projected, dtype=object) - min(
+            y_boundaries, key=lambda x: abs(x - left_y)
+        )
+        for i in range(len(self.x_projected)):
+            acs_distance.append((x_distance[i] ** 2 + y_distance[i] ** 2) ** 0.5)
+
+        return acs_distance
+
+    def translated_transects(self, acs_distance_raw, depth_data):
+        """Compare bathymetry and translate transects on average cross-section if needed.
+        Attributes
+        ----------
+        acs_distance_raw: list(np.array(float))
+            List of 1D arrays of the distance (uncorrected) from left bank on the average cross-section
+        depth_data: list(np.array(float))
+            List of 1D arrays of bathymetry from selected transects
+        """
+
+        acs_translated = list()
+        # Use the first transect as reference and define a homogeneous x grid across measurement
+        acs_translated.append(copy.deepcopy(acs_distance_raw[0]))
+        max_tr = [max(l) for l in acs_distance_raw]
+        min_tr = [min(l) for l in acs_distance_raw]
+        id_max = np.argmax([max_i - min_i for max_i, min_i in zip(max_tr, min_tr)])
+        grid_acs = np.arange(
+            min([min(l) for l in acs_distance_raw]),
+            max([max(l) for l in acs_distance_raw]),
+            (
+                    max([max(l) for l in acs_distance_raw])
+                    - min([min(l) for l in acs_distance_raw])
+            )
+            / 100,
+        )
+        acs_depth_ref = sc.interpolate.griddata(
+            acs_distance_raw[id_max], depth_data[id_max], grid_acs
+        )
+
+        for i in range(1, len(acs_distance_raw)):
+            if i == id_max:
+                acs_translated.append(acs_distance_raw[i])
+                continue
+            # Interpolate depth on x grid
+            acs_depth = sc.interpolate.griddata(
+                acs_distance_raw[i], depth_data[i], grid_acs
+            )
+            if not np.all(np.isnan(acs_depth)):
+                first_valid_acs = int(np.argwhere(~np.isnan(acs_depth))[0])
+                last_valid_acs = int(np.argwhere(~np.isnan(acs_depth))[-1])
+                valid_acs_depth = last_valid_acs - first_valid_acs + 1
+                acs_depth_valid = acs_depth[first_valid_acs: last_valid_acs + 1]
+
+                # Find the best position to minimize median of sum square
+                default_acs_ssd = np.nanmean(
+                    (acs_depth_ref[:valid_acs_depth] - acs_depth_valid) ** 2
+                )
+                lag_acs_idx = 0
+                for j in range(1, len(acs_depth_ref) - valid_acs_depth + 1):
+                    acs_ssd = np.nanmean(
+                        (acs_depth_ref[j: j + valid_acs_depth] - acs_depth_valid) ** 2
+                    )
+                    if (
+                            acs_ssd < default_acs_ssd or np.isnan(default_acs_ssd)
+                    ) and np.count_nonzero(
+                        np.isnan(acs_depth_ref[j: j + valid_acs_depth])
+                    ) < 0.5 * valid_acs_depth:
+                        default_acs_ssd = acs_ssd
+                        lag_acs_idx = j
+                # Correct average cross-section distance by translation
+                acs_corrected = acs_distance_raw[i] - (
+                        grid_acs[first_valid_acs] - grid_acs[lag_acs_idx]
+                )
+                acs_translated.append(acs_corrected)
+            else:
+                acs_translated.append(acs_distance_raw[i])
+
+        # Start from 0
+        min_dist = min([min(l) for l in acs_translated])
+        for i in range(len(acs_translated)):
+            acs_translated[i] -= min_dist
+
+        self.acs_distance = acs_translated
+
+    def compute_node_size(
+            self,
+            meas,
+            data_transects,
+            node_horizontal_user,
+            node_vertical_user,
+            extrap_option,
+    ):
+        """Define horizontal and vertical mesh
+
+        Attributes
+        ----------
+        meas: Measurement
+            Object of Measurement class
+        data_transects: dict
+            Dictionary of transects data loaded from Measurement
+        node_horizontal_user: float
+            Horizontal size of the mesh define by the user
+        node_vertical_user: float
+            Vertical size of the mesh define by the user
+        extrap_option: bool
+            Indicates if top/bottom extrapolation should be applied
+        """
+
+        # Meshs widths
+        acs_distance = self.acs_distance
+        # Define number of meshs on the average cross-section
+        acs_total = max([max(l) for l in acs_distance]) - min(
+            [min(l) for l in acs_distance]
+        )
+        if node_horizontal_user is None:
+            flat_acs = np.sort(np.concatenate(acs_distance).ravel())
+            node_horz = np.nanmax(
+                [np.quantile(flat_acs[1:] - flat_acs[:-1], 0.95),
+                 np.nanmedian(
+                     np.abs([np.quantile(l[1:] - l[:-1], 0.95) for l in acs_distance])
+                 )]
+            )
+
+
+        else:
+            node_horz = node_horizontal_user
+
+        # Divise total length in same size meshs
+        # TODO see logspace and normalized depth layer
+        if not extrap_option:
+            transect = meas.transects[meas.checked_transect_idx[0]]
+            top_cell = (
+                    np.nanmedian(transect.depths.bt_depths.depth_cell_depth_m[0, :])
+                    - np.nanmedian(transect.depths.bt_depths.depth_cell_size_m[0, :]) / 2
+            )
+        else:
+            top_cell = 0
+
+        nb_horz = int(acs_total / node_horz)
+        self.borders_ens = np.linspace(
+            min([min(l) for l in acs_distance]),
+            max([max(l) for l in acs_distance]) + 10 ** -5,
+            nb_horz,
+        )
+        # self.borders_ens = np.round(np.arange(min([min(l) for l in acs_distance]),
+        #                                       max([max(l) for l in acs_distance]) + node_vertical_user,
+        #                                       node_vertical_user).tolist(), 3)
+
+        # Meshes height
+        cell_depth = data_transects["cell_depth"]
+        depth_data = data_transects["depth_data"]
+        all_depth = np.array([item for subarray in depth_data for item in subarray])
+        if node_vertical_user:
+            self.main_depth_layers = np.round(
+                np.arange(
+                    top_cell,
+                    np.nanmax(all_depth) + node_vertical_user,
+                    node_vertical_user,
+                ).tolist(),
+                3,
+            )
+        else:
+            lag = np.nanmax([0.1, 2 * (cell_depth[0][1, 0] - cell_depth[0][0, 0])])
+            self.main_depth_layers = np.arange(
+                top_cell, np.nanmax(all_depth) + lag, lag
+            )
+
+    def compute_nodes_velocity(self, checked_transect_idx, data_transects):
+        """Compute transect median velocity on each mesh (North, East and vertical velocities)
+        and depth on each vertical
+
+        Attributes
+        ----------
+        checked_transect_idx: list(int)
+            List of selected transects
+        data_transects: dict
+            Dictionary of transects data loaded from Measurement
+
+        Returns
+        -------
+        tr_nodes_data: dict
+            Dictionary of data by transects
+        """
+
+        w_vel_x = data_transects["w_vel_x"]
+        w_vel_y = data_transects["w_vel_y"]
+        w_vel_z = data_transects["w_vel_z"]
+        rssi_data = data_transects["rssi"]
+        cell_depth = data_transects["cell_depth"]
+        depth_data = data_transects["depth_data"]
+        acs_distance = self.acs_distance
+        # borders_ens = self.borders_ens
+        # main_depth_layers = self.main_depth_layers
+        # orig_start_edge = data_transects['orig_start_edge']
+
+        node_mid = (self.borders_ens[1:] + self.borders_ens[:-1]) / 2
+        # Create list to save transects interpolated on mesh grid
+        transects_nodes = list()
+        transects_node_x_velocity = np.tile(
+            np.nan,
+            (len(checked_transect_idx), len(self.main_depth_layers) - 1, len(node_mid)),
+        )
+        transects_node_y_velocity = np.tile(
+            np.nan,
+            (len(checked_transect_idx), len(self.main_depth_layers) - 1, len(node_mid)),
+        )
+        transects_node_vertical_velocity = np.tile(
+            np.nan,
+            (len(checked_transect_idx), len(self.main_depth_layers) - 1, len(node_mid)),
+        )
+        transects_node_rssi = np.tile(
+            np.nan,
+            (len(checked_transect_idx), len(self.main_depth_layers) - 1, len(node_mid)),
+        )
+        transects_node_depth = np.tile(
+            np.nan, (len(checked_transect_idx), len(node_mid))
+        )
+
+        for id_transect in checked_transect_idx:
+            index_transect = checked_transect_idx.index(id_transect)
+            w_vel_x_tr = w_vel_x[index_transect]
+            w_vel_y_tr = w_vel_y[index_transect]
+            w_vel_z_tr = w_vel_z[index_transect]
+            cell_depth_tr = cell_depth[index_transect]
+            depth_ens_tr = depth_data[index_transect]
+            rssi_tr = rssi_data[index_transect]
+
+            # Find the representative mesh of each transect's vertical
+            lag_distance = self.borders_ens[1] - self.borders_ens[0]
+            data = {
+                "Index_ensemble": np.arange(len(acs_distance[index_transect])),
+                "Index_Node": [
+                    int(i) for i in acs_distance[index_transect] / lag_distance
+                ],
+                "Distance_ensemble": acs_distance[index_transect],
+            }
+            df = pd.DataFrame(data)
+
+            # Transect's nodes
+            id_proj = list(np.unique(df["Index_Node"]))
+            transects_nodes.append(id_proj)
+
+            # Run through nodes to determine each parameters
+            for node in id_proj:
+                index_node = np.array(df[df["Index_Node"] == node]["Index_ensemble"])
+                w_vel_x_node = w_vel_x_tr[:, index_node]
+                w_vel_y_node = w_vel_y_tr[:, index_node]
+                w_vel_z_node = w_vel_z_tr[:, index_node]
+                rssi_node = rssi_tr[:, index_node]
+                mid_cell_node = cell_depth_tr[:, index_node]
+                depth_node = depth_ens_tr[index_node]
+
+                transects_node_depth[index_transect, node] = np.nanmedian(depth_node)
+                # Determine every transect's cells in the mesh
+                for id_vert in range(len(self.main_depth_layers) - 1):
+                    (id_x, id_y) = np.where(
+                        np.logical_and(
+                            mid_cell_node >= self.main_depth_layers[id_vert],
+                            mid_cell_node < self.main_depth_layers[id_vert + 1],
+                        )
+                    )
+                    w_vel_x_loc = w_vel_x_node[id_x, id_y]
+                    w_vel_y_loc = w_vel_y_node[id_x, id_y]
+                    w_vel_z_loc = w_vel_z_node[id_x, id_y]
+                    rssi_loc = rssi_node[id_x, id_y]
+
+                    transects_node_x_velocity[
+                        index_transect, id_vert, node
+                    ] = np.nanmedian(w_vel_x_loc)
+                    transects_node_y_velocity[
+                        index_transect, id_vert, node
+                    ] = np.nanmedian(w_vel_y_loc)
+                    transects_node_vertical_velocity[
+                        index_transect, id_vert, node
+                    ] = np.nanmedian(w_vel_z_loc)
+                    transects_node_rssi[
+                        index_transect, id_vert, node
+                    ] = np.nanmedian(rssi_loc)
+
+        tr_nodes_data = {
+            "x_velocity": transects_node_x_velocity,
+            "y_velocity": transects_node_y_velocity,
+            "vertical_velocity": transects_node_vertical_velocity,
+            "depth": transects_node_depth,
+            "rssi": transects_node_rssi,
+            "nodes": transects_nodes,
+        }
+
+        return tr_nodes_data
+
+    def compute_mean(self, tr_nodes_data, n_burn):
+        """Compute mesh mean value of selected transects
+
+        Parameters
+        ----------
+        tr_nodes_data: dict
+            Dictionary of data by transects
+        n_burn: int
+            Number of transects which need to detect an information to make it valid
+        """
+
+        transects_nodes = tr_nodes_data["nodes"]
+        transects_node_x_velocity = tr_nodes_data["x_velocity"]
+        transects_node_y_velocity = tr_nodes_data["y_velocity"]
+        transects_node_vertical_velocity = tr_nodes_data["vertical_velocity"]
+        transects_node_rssi = tr_nodes_data["rssi"]
+        transects_node_depth = tr_nodes_data["depth"]
+
+        # Define meshs detected by enough transects
+        unique_node = list(np.unique([x for l in transects_nodes for x in l]))
+        node_selected = copy.deepcopy(unique_node)
+        if n_burn is None:
+            n_burn = int(len(transects_nodes) / 3)
+        valid_cell = max(n_burn, 1)
+
+        for node in unique_node:
+            if (
+                    sum(x.count(node) for x in transects_nodes) < valid_cell
+                    or np.isnan(transects_node_depth[:, node]).all()
+            ):
+                node_selected.remove(node)
+
+        if len(node_selected) > 0:
+            node_min = np.nanmin(node_selected)
+            node_max = np.nanmax(node_selected)
+            node_range = list(range(node_min, node_max + 1))
+            node_range_border = list(range(node_min, node_max + 2))
+
+            borders_ens = self.borders_ens[node_range_border]
+            dist_start = min(borders_ens)
+            borders_ens -= dist_start
+            self.acs_distance -= dist_start
+
+            map_depth_cells_border = np.tile(
+                np.nan, (len(self.main_depth_layers), len(node_range))
+            )
+            for i in range(len(node_range)):
+                map_depth_cells_border[:, i] = self.main_depth_layers
+
+            # Initialize MAP data
+            self.east_velocity = np.tile(
+                np.nan, (len(self.main_depth_layers) - 1, len(node_range))
+            )
+            self.north_velocity = np.tile(
+                np.nan, (len(self.main_depth_layers) - 1, len(node_range))
+            )
+            map_vertical_velocity = np.tile(
+                np.nan, (len(self.main_depth_layers) - 1, len(node_range))
+            )
+            map_rssi = np.tile(
+                np.nan, (len(self.main_depth_layers) - 1, len(node_range))
+            )
+            map_count = np.tile(
+                np.nan, (len(self.main_depth_layers) - 1, len(node_range))
+            )
+            map_depth = np.tile(np.nan, len(node_range))
+
+            # Previous version
+            for node in node_selected:
+                index_node = node_range.index(node)
+                row = np.array(
+                    [j for (j, sub) in enumerate(transects_nodes) if node in sub]
+                )
+
+                x_map_cell = transects_node_x_velocity[row, :, node]
+                y_map_cell = transects_node_y_velocity[row, :, node]
+                vertical_map_cell = transects_node_vertical_velocity[row, :, node]
+                rssi_map_cell = transects_node_rssi[row, :, node]
+                depth_map_cell = transects_node_depth[row, node]
+
+                map_depth[index_node] = np.nanmean(depth_map_cell)
+
+                # Cut values under streambed
+                if np.isnan(map_depth[index_node]):
+                    depth_limit = 0
+                else:
+                    depth_limit = next(
+                        x[0]
+                        for x in enumerate(self.main_depth_layers)
+                        if x[1] > map_depth[index_node]
+                    )
+
+                x_map_cell[:, depth_limit:] = np.nan
+                y_map_cell[:, depth_limit:] = np.nan
+                vertical_map_cell[:, depth_limit:] = np.nan
+                rssi_map_cell[:, depth_limit:] = np.nan
+
+                # Cut value if not detected by enough transects
+                # self.east_velocity[
+                #     np.count_nonzero(~np.isnan(x_map_cell), axis=0) >= valid_cell, index_node
+                # ] = np.nanmedian(
+                #     x_map_cell[
+                #         :, np.count_nonzero(~np.isnan(x_map_cell), axis=0) >= valid_cell
+                #     ],
+                #     axis=0,
+                # )
+                # self.north_velocity[
+                #     np.count_nonzero(~np.isnan(y_map_cell), axis=0) >= valid_cell, index_node
+                # ] = np.nanmedian(
+                #     y_map_cell[
+                #         :, np.count_nonzero(~np.isnan(y_map_cell), axis=0) >= valid_cell
+                #     ],
+                #     axis=0,
+                # )
+                # map_vertical_velocity[
+                #     np.count_nonzero(~np.isnan(vertical_map_cell), axis=0) >= valid_cell,
+                #     index_node,
+                # ] = np.nanmedian(
+                #     vertical_map_cell[
+                #         :,
+                #         np.count_nonzero(~np.isnan(vertical_map_cell), axis=0) > valid_cell,
+                #     ],
+                #     axis=0,
+                # )
+                # map_rssi[
+                #     np.count_nonzero(~np.isnan(rssi_map_cell), axis=0) >= valid_cell,
+                #     index_node,
+                # ] = np.nanmedian(
+                #     vertical_map_cell[
+                #     :,
+                #     np.count_nonzero(~np.isnan(rssi_map_cell), axis=0) >= valid_cell,
+                #     ],
+                #     axis=0,
+                # )
+
+                self.east_velocity[:, index_node] = np.nanmean(x_map_cell, axis=0)
+                self.north_velocity[:, index_node] = np.nanmean(y_map_cell, axis=0)
+                map_vertical_velocity[:, index_node] = np.nanmean(vertical_map_cell, axis=0)
+                map_rssi[:, index_node] = np.nanmean(rssi_map_cell, axis=0)
+                map_count[:, index_node] = np.count_nonzero(~np.isnan(x_map_cell), axis=0)
+                map_depth_cells_border[depth_limit, index_node] = map_depth[index_node]
+                map_depth_cells_border[depth_limit + 1:, index_node] = np.nan
+
+            self.vertical_velocity = map_vertical_velocity
+            self.rssi = map_rssi
+            self.count_valid = map_count
+            self.depths = map_depth
+            self.depth_cells_border = map_depth_cells_border
+            self.depth_cells_center = (
+                                              map_depth_cells_border[1:] + map_depth_cells_border[:-1]
+                                      ) / 2
+            self.borders_ens = borders_ens
+            self.distance_cells_center = np.tile(
+                [(borders_ens[1:] + borders_ens[:-1]) / 2],
+                (self.depth_cells_center.shape[0], 1),
+            )
+
+            distance = self.borders_ens[1:] - self.borders_ens[:-1]
+            depth = self.depth_cells_border[1:, :] - self.depth_cells_border[:-1, :]
+
+            self.cells_area = distance * depth
+
+    def compute_rozovskii(self, x_velocity, y_velocity):
+        """Compute primary and secondary velocity according Rozovskii projection
+
+        Parameters
+        ----------
+        x_velocity: np.array
+            East velocity on each cell of the MAP section
+        y_velocity: np.array
+            North velocity on each cell of the MAP section
+        """
+        # Compute mean velocity components in each ensemble
+        w_vel_mean_1 = np.nanmean(x_velocity, 0)
+        w_vel_mean_2 = np.nanmean(y_velocity, 0)
+
+        # Compute a unit vector
+        direction, _ = cart2pol(w_vel_mean_1, w_vel_mean_2)
+        unit_vec_1, unit_vec_2 = pol2cart(direction, 1)
+        unit_vec = np.vstack([unit_vec_1, unit_vec_2])
+
+        # Compute the velocity magnitude in the direction of the mean velocity of each
+        # ensemble using the dot product and unit vector
+        w_vel_prim = np.tile([np.nan], x_velocity.shape)
+        w_vel_sec = np.tile([np.nan], x_velocity.shape)
+        for i in range(x_velocity.shape[0]):
+            w_vel_prim[i, :] = np.sum(
+                np.vstack([x_velocity[i, :], y_velocity[i, :]]) * unit_vec, 0
+            )
+            w_vel_sec[i, :] = (
+                    unit_vec_2 * x_velocity[i, :] - unit_vec_1 * y_velocity[i, :]
+            )
+
+        self.primary_velocity = w_vel_prim
+        self.secondary_velocity = w_vel_sec
+        self.direction_ens = direction
+
+    def compute_extrap_velocity(self, settings):
+        """Compute top/bottom extrapolation according QRevInt velocity exponent
+
+        Parameters
+        ----------
+        settings: dict
+            Measurement current settings
+
+        Returns
+        -------
+        idx_bot: np.array(int)
+            Index to the bottom most valid depth cell in each ensemble
+        idx_top: np.array(int)
+            Index to the top most valid depth cell in each ensemble
+        """
+        depths = self.depths
+        depth_cells_border = self.depth_cells_border
+        depth_cells_center = self.depth_cells_center
+        mid_bed_cells = depths - depth_cells_center
+        w_vel_prim_extrap = np.copy(self.primary_velocity)
+        w_vel_sec_extrap = np.copy(self.secondary_velocity)
+        w_vel_z_extrap = np.copy(self.vertical_velocity)
+
+        map_depth_cells_border = np.tile(np.nan, depth_cells_border.shape)
+        for i in range(depth_cells_border.shape[1]):
+            map_depth_cells_border[:, i] = self.main_depth_layers
+
+        map_depth_cells_center = (
+                                         map_depth_cells_border[1:, :] + map_depth_cells_border[:-1, :]
+                                 ) / 2
+
+        # Blanking on the bottom
+        blanking_depth = depths * 0.9
+        for i in range(map_depth_cells_center.shape[1]):
+            invalid = map_depth_cells_center[:, i] > blanking_depth[i]
+            if np.sum(~np.isnan(w_vel_prim_extrap[~invalid, i])) > 0:
+                w_vel_prim_extrap[invalid, i] = np.nan
+                w_vel_sec_extrap[invalid, i] = np.nan
+                w_vel_z_extrap[invalid, i] = np.nan
+
+            # Identify valid data
+            valid_data = np.logical_not(np.isnan(w_vel_prim_extrap))
+            # Preallocate variables
+            n_ensembles = valid_data.shape[1]
+            idx_bot = np.tile(-1, (valid_data.shape[1])).astype(int)
+            idx_top = np.tile(-1, valid_data.shape[1]).astype(int)
+            idx_top_3 = np.tile(-1, (3, valid_data.shape[1])).astype(int)
+
+            for n in range(n_ensembles):
+                # Identifying bottom most valid cell
+                idx_temp = np.where(np.logical_not(np.isnan(w_vel_prim_extrap[:, n])))[
+                    0
+                ]
+                if len(idx_temp) > 0:
+                    idx_top[n] = idx_temp[0]
+                    idx_bot[n] = idx_temp[-1]
+                    if len(idx_temp) > 2:
+                        idx_top_3[:, n] = idx_temp[0:3]
+                else:
+                    idx_top[n] = 0
+
+        for n in range(n_ensembles):
+            # Identifying bottom most valid cell
+            idx_temp = np.where(np.logical_not(np.isnan(w_vel_prim_extrap[:, n])))[0]
+            if len(idx_temp) > 0:
+                idx_top[n] = idx_temp[0]
+                idx_bot[n] = idx_temp[-1]
+                if len(idx_temp) > 2:
+                    idx_top_3[:, n] = idx_temp[0:3]
+            else:
+                idx_top[n] = 0
+
+        # QRevInt extrapolation method
+        idx_bed = copy.deepcopy(idx_bot)
+        bot_method = settings["extrapBot"]
+        top_method = settings["extrapTop"]
+        exponent = settings["extrapExp"]
+
+        if bot_method == "Power":
+            coef_primary_bot = np.nanmean(w_vel_prim_extrap, 0)
+
+        elif bot_method == "No Slip":
+            cutoff_depth = 0.8 * depths
+            depth_ok = nan_greater(
+                depth_cells_center,
+                np.tile(cutoff_depth, (depth_cells_center.shape[0], 1)),
+            )
+            component_ok = np.logical_not(np.isnan(w_vel_prim_extrap))
+            use_ns = depth_ok * component_ok
+            for j in range(len(idx_bot)):
+                if idx_bot[j] >= 0:
+                    use_ns[idx_bot[j], j] = 1
+            component_ns = np.copy(w_vel_prim_extrap)
+            component_ns[np.logical_not(use_ns)] = np.nan
+
+            coef_primary_bot = np.nanmean(component_ns, 0)
+
+        # Extrapolation Bot velocity
+        for n in range(len(idx_bed)):
+            if idx_bed[n] > -1:
+                while (
+                        idx_bed[n] < len(depth_cells_center[:, n])
+                        and depth_cells_border[idx_bed[n] + 1, n] <= depths[n]
+                ):
+                    idx_bed[n] += 1
+                # Shape of bottom cells
+                bot_depth = mid_bed_cells[idx_bot[n] + 1: (idx_bed[n]), n]
+
+                # Extrapolation for Primary velocity
+                bot_prim_value = (
+                        coef_primary_bot[n]
+                        * ((1 + 1 / exponent) / (1 / exponent))
+                        * ((bot_depth / depths[n]) ** exponent)
+                )
+                w_vel_prim_extrap[(idx_bot[n] + 1): (idx_bed[n]), n] = bot_prim_value
+
+                # Constant extrapolation for Secondary velocity
+                w_vel_sec_extrap[(idx_bot[n] + 1): (idx_bed[n]), n] = w_vel_sec_extrap[
+                    idx_bot[n], n
+                ]
+                # Linear extrapolation to 0 at streambed for Vertical velocity
+                try:
+                    w_vel_z_extrap[
+                    (idx_bot[n] + 1): (idx_bed[n]), n
+                    ] = sc.interpolate.griddata(
+                        np.append(mid_bed_cells[idx_bot[n], n], 0),
+                        np.append(self.vertical_velocity[idx_bot[n], n], 0),
+                        mid_bed_cells[(idx_bot[n] + 1): (idx_bed[n]), n],
+                    )
+                except Exception:
+                    pass
+
+        # Top power extrapolation (primary)
+        if top_method == "Power":
+            coef_primary_top = np.nanmean(w_vel_prim_extrap, 0)
+            for n in range(len(idx_top)):
+                top_depth = mid_bed_cells[: idx_top[n], n]
+                top_prim_value = (
+                        coef_primary_top[n]
+                        * ((1 + 1 / exponent) / (1 / exponent))
+                        * ((top_depth / depths[n]) ** exponent)
+                )
+                w_vel_prim_extrap[: idx_top[n], n] = top_prim_value
+
+        # Top constant extrapolation (primary)
+        elif top_method == "Constant":
+            n_ensembles = len(idx_top)
+            for n in range(n_ensembles):
+                if idx_top[n] >= 0:
+                    w_vel_prim_extrap[: idx_top[n], n] = w_vel_prim_extrap[
+                        idx_top[n], n
+                    ]
+
+        elif top_method == "3-Point":
+            # Determine number of bins available in each profile
+            valid_data = np.logical_not(np.isnan(w_vel_prim_extrap))
+            n_bins = np.nansum(valid_data, 0)
+            # Determine number of ensembles
+            n_ensembles = len(idx_top)
+
+            for n in range(n_ensembles):
+                if (n_bins[n] < 6) and (n_bins[n] > 0) and (idx_top[n] >= 0):
+                    w_vel_prim_extrap[: idx_top[n], n] = w_vel_prim_extrap[
+                        idx_top[n], n
+                    ]
+
+                # If 6 or more bins use 3-pt at top
+                if n_bins[n] > 5:
+                    top_depth = depth_cells_center[: idx_top[n], n]
+                    top_3_depth = depth_cells_center[idx_top_3[0:3, n], n]
+                    top_3_vel = w_vel_prim_extrap[idx_top_3[0:3, n], n]
+                    WLS = LinearRegression()
+                    WLS.fit(top_3_depth.reshape(-1, 1), top_3_vel.reshape(-1, 1))
+                    w_vel_prim_extrap[: idx_top[n], n] = (
+                            WLS.coef_ * top_depth + WLS.intercept_
+                    )
+
+        # Extrap top for second and vertical velocities
+        for n in range(len(idx_top)):
+            if idx_top[n] >= 0:
+                w_vel_sec_extrap[: idx_top[n], n] = w_vel_sec_extrap[idx_top[n], n]
+                try:
+                    top_z_value = sc.interpolate.griddata(
+                        np.append(mid_bed_cells[idx_top[n], n], self.depths[n]),
+                        np.append(w_vel_z_extrap[idx_top[n], n], 0),
+                        mid_bed_cells[: idx_top[n], n],
+                    )
+                    w_vel_z_extrap[: idx_top[n], n] = top_z_value
+                except Exception:
+                    pass
+
+        self.primary_velocity = w_vel_prim_extrap
+        self.secondary_velocity = w_vel_sec_extrap
+        self.vertical_velocity = w_vel_z_extrap
+
+    @staticmethod
+    def group(L):
+        first = last = L[0]
+        for n in L[1:]:
+            if n - 1 == last:
+                last = n
+            else:
+                yield first, last
+                first = last = n
+        yield first, last
+
+    def compute_interpolation(self):
+        # Interpolate depth
+        not_nan = np.logical_not(np.isnan(self.depths))
+        indices = np.arange(len(self.depths))
+        self.depths = np.interp(indices, indices[not_nan], self.depths[not_nan])
+        self.direction_ens = np.interp(
+            indices, indices[not_nan], self.direction_ens[not_nan]
+        )
+
+        data_list = [
+            self.primary_velocity,
+            self.secondary_velocity,
+            self.vertical_velocity,
+        ]
+        # Identify valid data
+        valid_data = np.logical_not(np.isnan(self.primary_velocity))
+        cells_above_sl = np.full(self.primary_velocity.shape, True)
+        # Preallocate variables
+        n_ensembles = valid_data.shape[1]
+        idx_bot = np.tile(-1, (valid_data.shape[1])).astype(int)
+        idx_top = np.tile(-1, valid_data.shape[1]).astype(int)
+
+        # Define valid cells
+        invalid_ens = []
+        for n in range(n_ensembles):
+            # Identifying bottom most valid cell
+            idx_temp = np.where(np.logical_not(np.isnan(self.primary_velocity[:, n])))[
+                0
+            ]
+            if len(idx_temp) > 0:
+                idx_top[n] = idx_temp[0]
+                idx_bot[n] = idx_temp[-1]
+                cells_above_sl[: idx_top[n], n] = False
+                cells_above_sl[idx_bot[n] + 1:, n] = False
+            else:
+                idx_top[n] = 0
+                invalid_ens.append(n)
+
+        # Remove top/bottom cells
+        if len(invalid_ens) > 0:
+            grouped_invalid = list(self.group(invalid_ens))
+            for x in grouped_invalid:
+                top = min(idx_top[x[0] - 1], idx_top[x[1] + 1])
+                bot = max(idx_bot[x[0] - 1], idx_bot[x[1] + 1])
+
+                for ens in range(x[0], x[1] + 1):
+                    cells_above_sl[:top, ens] = False
+                    cells_above_sl[bot + 1:, ens] = False
+
+        # Use bottom of cells as depth
+        last_cell = []
+        for n in range(len(self.depths)):
+            last_cell.append(
+                next(
+                    (i, v)
+                    for i, v in enumerate(self.main_depth_layers)
+                    if v > self.depths[n]
+                )
+            )
+        y_depth = [x[1] for x in last_cell]
+
+        # Update depth data
+        i = -1
+        for x in last_cell:
+            i += 1
+            self.depth_cells_border[x[0], i] = self.depths[i]
+            self.depth_cells_border[x[0] + 1:, i] = np.nan
+
+        y_cell_size = self.depth_cells_border[1:, :] - self.depth_cells_border[:-1, :]
+        y_centers = self.depth_cells_border[:-1, :] + 0.5 * y_cell_size
+        x_shiptrack = self.distance_cells_center[0, :]
+        search_loc = ["above", "below", "before", "after"]
+        normalize = False
+
+        # Update new geometry
+        self.depth_cells_center = y_centers
+        x_cell_size = self.borders_ens[1:] - self.borders_ens[:-1]
+        self.cells_area = x_cell_size * y_cell_size
+
+        # abba interpolation
+        interpolated_data = abba_idw_interpolation(
+            data_list=data_list,
+            valid_data=valid_data,
+            cells_above_sl=cells_above_sl,
+            y_centers=y_centers,
+            y_cell_size=y_cell_size,
+            y_depth=y_depth,
+            x_shiptrack=x_shiptrack,
+            search_loc=search_loc,
+            normalize=normalize,
+        )
+
+        # apply interpolated results
+        if interpolated_data is not None:
+            # Incorporate interpolated values
+            for n in range(len(interpolated_data[0])):
+                self.primary_velocity[interpolated_data[0][n][0]] = interpolated_data[
+                    0
+                ][n][1]
+                self.secondary_velocity[interpolated_data[1][n][0]] = interpolated_data[
+                    1
+                ][n][1]
+                self.vertical_velocity[interpolated_data[2][n][0]] = interpolated_data[
+                    2
+                ][n][1]
+
+    def compute_edges(self, settings):
+        """Compute edge extrapolation
+
+        Parameters
+        ----------
+        borders_ens: list(float)
+            Horizontal grid length on the average cross-section
+        mid_direction: np.array
+            1D array of mean velocity direction of each MAP vertical
+        settings: dict
+            Measurement current settings
+        edges_option: bool
+            Option to define if edge's meshs should share the exact same length or if they should be
+            the same length as those in the middle (except the last vertical which is shorter)
+
+        Returns
+        -------
+        left_direction/right_direction: np.array
+            Direction of the first/last ensemble applied to edge
+        left_area/right_area: np.array
+            Area of edge's cells
+        left_mid_cells_x/right_mid_cells_x: np.array
+            Longitudinal position of the middle of each cell
+        left_mid_cells_y/right_mid_cells_y: np.array
+            Depth position of the middle of each cell
+        """
+        exponent = settings["extrapExp"]
+
+        left_distance, left_coef = self.left_geometry
+        self.edge_velocity("left", left_distance, left_coef, exponent)
+
+        right_distance, right_coef = self.right_geometry
+        self.edge_velocity("right", right_distance, right_coef, exponent)
+
+    @staticmethod
+    def interpolation(data1, data2, data1_interp_value, style="linear"):
+        funcs = {
+            "linear": lambda x, a, b: a * x + b,
+            "power": lambda x, a, b: a * x ** b,
+            "power_rectangular": lambda x, a: a * x ** 0.1,
+            "power_triangular": lambda x, a: a * x ** 0.41,
+        }
+        valid = ~(np.isnan(data2) | np.isinf(data2))
+        if np.isnan(data2[valid]).all():
+            value = np.nan
+        elif len(data2[valid]) == 1:
+            value = data2[valid]
+        else:
+            try:
+                popt, _ = curve_fit(
+                    funcs[style], data1[valid], data2[valid], maxfev=1000
+                )
+                value = funcs[style](data1_interp_value, *popt)
+            except Exception:
+                value = np.nan
+        return value
+
+    def edge_velocity(self, edge, edge_distance, edge_coef, exponent):
+        """Compute edge extrapolation
+
+        Parameters
+        ----------
+        edge: str
+            'left' or 'right'
+        edge_distance: float
+            Edge distance
+        edge_coef: float
+            Shape coefficient of the edge
+        """
+
+        if edge == "left":
+            id_edge = 0
+            node_size = abs(self.borders_ens[1] - self.borders_ens[0])
+        elif edge == "right":
+            id_edge = -1
+            node_size = abs(self.borders_ens[-1] - self.borders_ens[-2])
+
+        nodes = edge_distance - np.arange(0, edge_distance, node_size)[::-1]
+        nodes = np.insert(nodes, 0, 0)
+        nb_nodes = len(nodes) - 1
+
+        nodes_mid = (nodes[1:] + nodes[:-1]) / 2
+        edge_size_raw = self.depth_cells_border[:, id_edge]
+
+        if edge_coef == 0.3535 and edge_distance > 0:
+            depth_edge = self.depths[id_edge] * (
+                    edge_distance / (edge_distance + node_size / 2)
+            )
+            # depth_edge = self.depths[id_edge]
+            # Depth arrays
+            border_depths = np.multiply(nodes, depth_edge / edge_distance)
+            cells_borders_depths_1 = np.transpose(
+                [edge_size_raw] * (len(border_depths) - 1)
+            )
+            cells_borders_depths_2 = np.transpose(
+                [edge_size_raw] * (len(border_depths))
+            )
+
+            for i in range(len(border_depths) - 1):
+                sub_index = next(
+                    x[0]
+                    for x in enumerate(cells_borders_depths_1[:, i])
+                    if x[1] >= int(1000 * border_depths[i + 1]) / 1000
+                )
+                cells_borders_depths_1[sub_index, i] = border_depths[i + 1]
+                cells_borders_depths_1[sub_index + 1:, i] = np.nan
+                cells_borders_depths_2[sub_index - 1, i + 1] = border_depths[i + 1]
+                cells_borders_depths_2[sub_index:, i] = np.nan
+
+            # Distance arrays
+            cut_x = (
+                    edge_distance * edge_size_raw[edge_size_raw <= depth_edge] / depth_edge
+            )
+            x_left = np.tile(nodes, (cells_borders_depths_1.shape[0], 1))
+
+            for j in range(np.count_nonzero(~np.isnan(cut_x))):
+                col, _ = next(x for x in enumerate(nodes) if x[1] > cut_x[j])
+                row = np.where(edge_size_raw == edge_size_raw[j])[0][0]
+                x_left[row, col - 1] = cut_x[j]
+                x_left[row + 1:, col - 1] = nodes[col]
+
+            # Cells separate in 2 rectangles and 1 triangle
+            area_rec2 = (x_left[:-1, 1:] - x_left[1:, :-1]) * (
+                    cells_borders_depths_1[1:, :] - cells_borders_depths_1[:-1, :]
+            )
+            area_rec1 = (x_left[1:, :-1] - x_left[:-1, :-1]) * (
+                    cells_borders_depths_2[:-1, :-1] - cells_borders_depths_1[:-1, :]
+            )
+            area_tri1 = (
+                    (x_left[1:, :-1] - x_left[:-1, :-1])
+                    * (cells_borders_depths_1[1:, :] - cells_borders_depths_2[:-1, :-1])
+                    / 2
+            )
+            area_tra1 = area_rec1 + area_tri1
+            area = area_tra1 + area_rec2
+
+            # Compute mid of every shape
+            mid_rec2_x = (x_left[:-1, 1:] + x_left[1:, :-1]) / 2
+            mid_rec2_y = (
+                                 cells_borders_depths_1[:-1, :] + cells_borders_depths_1[1:, :]
+                         ) / 2
+
+            mid_rec1_x = (x_left[:-1, :-1] + x_left[1:, :-1]) / 2
+            mid_rec1_y = (
+                                 cells_borders_depths_1[:-1, :] + cells_borders_depths_2[:-1, :-1]
+                         ) / 2
+
+            mid_tri1_x = (x_left[:-1, :-1] + 2 * x_left[1:, :-1]) / 3
+            mid_tri1_y = (
+                                 2 * cells_borders_depths_2[:-1, :-1] + cells_borders_depths_1[1:, :]
+                         ) / 3
+
+            mid_tra1_x = (area_rec1 * mid_rec1_x + area_tri1 * mid_tri1_x) / (area_tra1)
+            mid_tra1_y = (area_rec1 * mid_rec1_y + area_tri1 * mid_tri1_y) / (area_tra1)
+            mid_tra1_x[area_tra1 == 0] = 0
+            mid_tra1_y[area_tra1 == 0] = 0
+
+            # Compute cell's mid
+            mid_cells_x = (area_rec2 * mid_rec2_x + area_tra1 * mid_tra1_x) / area
+            mid_cells_y = (area_rec2 * mid_rec2_y + area_tra1 * mid_tra1_y) / area
+            edge_exp = 2.41
+
+            bed_distance = mid_cells_y * edge_distance / depth_edge
+            vertical_depth = mid_cells_x * depth_edge / edge_distance
+
+            is_edge = True
+
+        elif edge_coef == 0.91 and edge_distance > 0:
+            depth_edge = self.depths[id_edge]
+            border_depths = np.tile(self.depths[id_edge], len(nodes))
+            mid_cells_x = np.tile([nodes_mid], (len(edge_size_raw) - 1, 1))
+            mid_cells_y = np.transpose([self.depth_cells_center[:, id_edge]] * nb_nodes)
+
+            size_x = np.tile([nodes[1:] - nodes[:-1]], (len(edge_size_raw) - 1, 1))
+            size_y = np.transpose([edge_size_raw[1:] - edge_size_raw[:-1]] * nb_nodes)
+            area = size_x * size_y
+            bed_distance = np.tile(0, area.shape)
+            vertical_depth = np.tile([self.depths[id_edge]], area.shape)
+            edge_exp = 10
+
+            is_edge = True
+
+        else:
+            border_depths = np.tile(np.nan, len(nodes))
+            mid_cells_x = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
+            mid_cells_y = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
+            area = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
+            bed_distance = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
+            vertical_depth = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
+            edge_exp = np.nan
+
+            is_edge = False
+
+        if np.all(np.isnan(self.primary_velocity[:, id_edge])) or not is_edge:
+            edge_primary_velocity = np.tile(
+                [np.nan], (len(edge_size_raw) - 1, nb_nodes)
+            )
+            edge_secondary_velocity = np.tile(
+                [np.nan], (len(edge_size_raw) - 1, nb_nodes)
+            )
+            edge_vertical_velocity = np.tile(
+                [np.nan], (len(edge_size_raw) - 1, nb_nodes)
+            )
+
+        else:
+            # Primary velocity : Power-power extrapolation from first ensemble
+            # Mean velocity on the first valid ensemble
+            primary_mean_valid = np.nanmean(self.primary_velocity[:, id_edge])
+            is_nan = np.isnan(self.primary_velocity[:, id_edge])
+
+            # Compute mean velocity according power law at middle_distance position
+            vp_mean = primary_mean_valid * (mid_cells_x / edge_distance) ** (
+                    1 / edge_exp
+            )
+            # Compute velocity according power law on the chosen vertical
+            edge_primary_velocity = (
+                    vp_mean
+                    * (((1 / exponent) + 1) / (1 / exponent))
+                    * ((vertical_depth - mid_cells_y) / vertical_depth) ** exponent
+            )
+
+            test = np.nanmean(edge_primary_velocity, axis=0)
+
+            # Vertical velocity : linear extrapolation from first ensemble vertical distribution
+            vertical_vel_first = np.insert(self.vertical_velocity[:, id_edge], 0, 0)
+            vertical_vel_first = np.append(vertical_vel_first, 0)
+            norm_depth_first = np.insert(
+                self.depth_cells_center[:, id_edge] / depth_edge, 0, 0
+            )
+            norm_depth_first = np.append(norm_depth_first, 1)
+            norm_depth_edge = mid_cells_y / vertical_depth
+            edge_vertical_velocity = sc.interpolate.griddata(
+                norm_depth_first, vertical_vel_first, norm_depth_edge
+            )
+
+            # Secondary velocity : linear interpolation to 0 at edge
+            secondary_vel_first = np.insert(
+                self.secondary_velocity[:, id_edge],
+                0,
+                self.secondary_velocity[0, id_edge],
+            )
+            secondary_vel_first = np.append(
+                secondary_vel_first,
+                secondary_vel_first[np.where(~np.isnan(secondary_vel_first))[-1][-1]],
+            )
+            depth_first = np.insert(self.depth_cells_center[:, id_edge], 0, 0)
+            depth_first = np.append(depth_first, depth_edge)
+            edge_secondary_vel_interp = sc.interpolate.griddata(
+                depth_first, secondary_vel_first, mid_cells_y
+            )
+
+            edge_secondary_velocity = np.tile(np.nan, edge_primary_velocity.shape)
+
+            for j in range(edge_primary_velocity.shape[1]):
+                for i in range(
+                        np.count_nonzero(~np.isnan(edge_secondary_vel_interp[:, j]))
+                ):
+                    edge_secondary_velocity[i, j] = MAP.interpolation(
+                        np.array([bed_distance[i, j], edge_distance]),
+                        np.array([0, edge_secondary_vel_interp[i, j]]),
+                        mid_cells_x[i, j],
+                    )
+            edge_primary_velocity[is_nan] = np.nan
+            edge_secondary_velocity[is_nan] = np.nan
+            edge_vertical_velocity[is_nan] = np.nan
+
+        if edge == "right":
+            self.primary_velocity = np.c_[
+                self.primary_velocity, edge_primary_velocity[:, ::-1]
+            ]
+            self.secondary_velocity = np.c_[
+                self.secondary_velocity, edge_secondary_velocity[:, ::-1]
+            ]
+            self.vertical_velocity = np.c_[
+                self.vertical_velocity, edge_vertical_velocity[:, ::-1]
+            ]
+            self.rssi = np.c_[
+                self.rssi,
+                np.tile(np.nan, edge_primary_velocity.shape)
+            ]
+            self.count_valid = np.c_[
+                self.count_valid,
+                np.tile(np.nan, edge_primary_velocity.shape)
+            ]
+            self.direction_ens = np.append(
+                self.direction_ens,
+                np.tile(self.direction_ens[id_edge], edge_primary_velocity.shape[1]),
+            )
+
+            depth = (border_depths[1:] + border_depths[:-1]) / 2
+            self.depths = np.append(self.depths, depth[::-1])
+            self.depth_cells_center = np.c_[
+                self.depth_cells_center, mid_cells_y[:, ::-1]
+            ]
+
+            max_dist = self.borders_ens[-1]
+
+            self.borders_ens = np.append(
+                self.borders_ens, max_dist + abs(edge_distance - nodes[:-1][::-1])
+            )
+            self.distance_cells_center = np.c_[
+                self.distance_cells_center,
+                max_dist + abs(edge_distance - mid_cells_x[:, ::-1]),
+            ]
+
+            self.cells_area = np.c_[self.cells_area, area[:, ::-1]]
+
+        else:
+            self.primary_velocity = np.c_[edge_primary_velocity, self.primary_velocity]
+            self.secondary_velocity = np.c_[
+                edge_secondary_velocity, self.secondary_velocity
+            ]
+            self.vertical_velocity = np.c_[
+                edge_vertical_velocity, self.vertical_velocity
+            ]
+            self.rssi = np.c_[
+                np.tile(np.nan, edge_primary_velocity.shape),
+                self.rssi,
+            ]
+            self.count_valid = np.c_[
+                np.tile(np.nan, edge_primary_velocity.shape),
+                self.count_valid,
+            ]
+
+            self.direction_ens = np.insert(
+                self.direction_ens,
+                0,
+                np.tile(self.direction_ens[id_edge], edge_primary_velocity.shape[1]),
+            )
+
+            depth = (border_depths[1:] + border_depths[:-1]) / 2
+            self.depths = np.insert(self.depths, 0, depth)
+            self.depth_cells_center = np.c_[mid_cells_y, self.depth_cells_center]
+
+            self.borders_ens = np.insert(
+                self.borders_ens + edge_distance, 0, nodes[:-1]
+            )
+
+            self.distance_cells_center = np.c_[
+                mid_cells_x, self.distance_cells_center + edge_distance
+            ]
+
+            self.cells_area = np.c_[area, self.cells_area]
+
+            self.acs_distance += edge_distance
+
+    def compute_discharge(self):
+        """Compute streamwise velocity and discharge."""
+
+        direction_meas = np.arctan2(-1, self.slope)
+
+        distance = (self.borders_ens[1:] + self.borders_ens[:-1]) / 2
+
+        direction_ens = sc.interpolate.griddata(
+            distance[~np.isnan(self.direction_ens)], self.direction_ens[~np.isnan(self.direction_ens)], distance
+        )
+
+        streamwise_velocity = self.primary_velocity * np.cos(
+            direction_ens - direction_meas
+        ) + self.secondary_velocity * np.sin(direction_ens - direction_meas)
+
+        transverse_velocity = self.primary_velocity * np.sin(
+            direction_ens - direction_meas
+        ) - self.secondary_velocity * np.cos(direction_ens - direction_meas)
+
+        cells_discharge = self.cells_area * streamwise_velocity
+        total_discharge = np.nansum(cells_discharge)
+
+        self.streamwise_velocity = streamwise_velocity * -self._unit
+        self.transverse_velocity = transverse_velocity * -self._unit
+        self.cells_discharge = cells_discharge * -self._unit
+        self.total_discharge = total_discharge * -self._unit
diff --git a/Classes/MMT_TRDI.py b/Classes/MMT_TRDI.py
new file mode 100644
index 0000000000000000000000000000000000000000..23adaf1aa276585c2e00ebd0856b8231834aabd8
--- /dev/null
+++ b/Classes/MMT_TRDI.py
@@ -0,0 +1,660 @@
+import os
+import re
+import xmltodict
+import numpy as np
+
+
+class MMTtrdi(object):
+    """Class to read and store data from a WinRiver 2 mmt file.
+
+    Attributes
+    ----------
+    project: dict
+        Dictionary of measurement information
+    site_info: dict
+        Dictionary of site information
+    transects: list
+        List of Transect objects containing information for each discharge
+        transect
+    summary: dict
+        Dictionary of measurement summary for each available boat velocity
+        reference
+    qaqc: dict
+        Dictionary of premeasurement tests, calibrations, and evaluations
+    mbt_transects: list
+        List of Transect objects containing information for each moving-bed
+        test transect
+    path: str
+        Path for mmt file and associated files
+    """
+
+    def __init__(self, mmt_file):
+        """Initialize instance variables and reads mmt file.
+
+        Parameters
+        ----------
+        mmt_file: str
+            Full filename including path of mmt file.
+        """
+
+        # Intialize instance variables
+        self.project = {}
+        self.site_info = {}
+        self.transects = []
+        self.summary = {}
+        self.qaqc = {}
+        self.mbt_transects = []
+        self.path = None
+
+        # Process mmt file
+        self.process_mmt(mmt_file)
+
+    def process_mmt(self, mmt_file):
+        """Method to read and process the mmt file.
+
+        Parameters
+        ----------
+        mmt_file: str
+            Full filename including path of mmt file.
+        """
+
+        # Open the file and convert to an ordered dictionary tree
+        with open(mmt_file, "r", encoding="utf-8") as fd:
+            xml_data = fd.read()
+            clean_xml_data = ""
+            remove_re = re.compile("[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F%]")
+            for line in xml_data:
+                new_line, count = remove_re.subn("", line)
+                clean_xml_data = clean_xml_data + new_line
+
+            win_river = xmltodict.parse(clean_xml_data)
+        # UnicodeDecodeError
+        win_river = win_river["WinRiver"]
+
+        self.path = os.path.split(mmt_file)[0]
+
+        # Process project settings
+        self.project["Name"] = win_river["Project"]["@Name"]
+        self.project["Version"] = win_river["Project"]["@Version"]
+        if "Locked" in win_river["Project"].keys():
+            self.project["Locked"] = win_river["Project"]["Locked"]
+        else:
+            self.project["Locked"] = None
+
+        # Process site information
+        siteinfo_keys = win_river["Project"]["Site_Information"].keys()
+
+        # Iterate through all of the keys and values of site info
+        for x in siteinfo_keys:
+            site_data = win_river["Project"]["Site_Information"][x]
+            if site_data is not None:
+                # Remove @ symbol from properties
+                if "@" in x:
+                    x = x[1:]
+                if x == "Water_Temperature":
+                    self.site_info[x] = float(site_data)
+                    # -32768 used to denote no data
+                    if self.site_info[x] < -100:
+                        self.site_info[x] = ""
+                else:
+                    self.site_info[x] = site_data
+            else:
+                self.site_info[x] = ""
+        if "Transect" in win_river["Project"]["Site_Discharge"].keys():
+            trans = win_river["Project"]["Site_Discharge"]["Transect"]
+
+            # Create a Transect class for each transect found under
+            # Site_Discharge
+            if type(trans) == list:
+                for i in range(len(trans)):
+                    if "File" in trans[i]:
+                        self.transects.append(MMTtransect(trans[i]))
+            else:
+                self.transects = [MMTtransect(trans)]
+
+            # Discharge Summary
+            if "Discharge_Summary" in win_river["Project"]["Site_Discharge"].keys():
+                discharge_summary = win_river["Project"]["Site_Discharge"][
+                    "Discharge_Summary"
+                ]
+
+                self.summary["NONE"] = self.mmtqsum(discharge_summary["None"])
+                self.summary["BT"] = self.mmtqsum(discharge_summary["BottomTrack"])
+                self.summary["GGA"] = self.mmtqsum(discharge_summary["GGA"])
+                self.summary["VTG"] = self.mmtqsum(discharge_summary["VTG"])
+
+        # QA_QC
+        if "QA_QC" in win_river["Project"].keys():
+            qaqc = win_river["Project"]["QA_QC"]
+            for qaqc_type, data in qaqc.items():
+                # Parse qaqc data from dictionary if the type is a test,
+                # cal, or eval
+                if qaqc_type in [
+                    "RG_Test",
+                    "Compass_Calibration",
+                    "Compass_Evaluation",
+                ]:
+                    # There could be multiple tests of the same type so they
+                    # are stored in a list
+                    time_stamp = qaqc_type + "_TimeStamp"
+                    if not isinstance(data["TestResult"], list):
+                        self.qaqc[qaqc_type] = [data["TestResult"]["Text"]]
+                        self.qaqc[time_stamp] = [data["TestResult"]["TimeStamp"]]
+                    else:
+                        self.qaqc[qaqc_type] = []
+                        self.qaqc[time_stamp] = []
+                        for result in data["TestResult"]:
+                            self.qaqc[qaqc_type].append(result["Text"])
+                            self.qaqc[time_stamp].append(result["TimeStamp"])
+
+                if qaqc_type == "Moving_Bed_Test":
+                    if "Transect" in data.keys():
+                        self.moving_bed_test(data)
+
+    def moving_bed_test(self, mb_data):
+        """Method to parse data from moving-bed test dictionary.
+
+        Parameters
+        ----------
+        mb_data: dict
+            Dictionary containing moving-bed test information
+        """
+
+        transects = mb_data["Transect"]
+
+        # If only one transect make it a list
+        if not isinstance(transects, list):
+            transects = [transects]
+
+        # Process each transect dictionary
+        for tsect in transects:
+            transect = MMTtransect(tsect)
+
+            # Determine type of moving-bed test
+            if "@MBTType" in tsect:
+                if tsect["@MBTType"] == "0":
+                    transect.moving_bed_type = "Loop"
+                elif tsect["@MBTType"] == "1":
+                    transect.moving_bed_type = "Stationary"
+            else:
+                # Use the file name to determine the moving-bed test type
+                file_name = transect.Files[0]
+                fidx = file_name.rfind(".")
+                if file_name[fidx - 3 : fidx] == "SBT":
+                    transect.moving_bed_type = "Stationary"
+                elif file_name[fidx - 3 : fidx] == "LBT":
+                    transect.moving_bed_type = "Loop"
+                else:
+                    # If type can't be determined process as stationary
+                    transect.moving_bed_type = "Stationary"
+
+            self.mbt_transects.append(transect)
+
+    @staticmethod
+    def mmtqsum(data):
+        """Method to parse the MMT Q summary data.
+
+        Parameters
+        ----------
+        data: dict
+            A summary dictionary from mmt file.
+
+        Returns
+        -------
+        sum_dict: dict
+            Dictionary of summary with a couple of key names changed.
+        """
+
+        sum_dict = {
+            "Use": [],
+            "Begin_Left": [],
+            "FileName": [],
+            "LeftEdgeSlopeCoeff": [],
+            "RightEdgeSlopeCoeff": [],
+        }
+
+        # Iterate through each transect
+        for transect in data.values():
+            # Iterate through each key and val in the transect summary
+            for key2, val2 in transect.items():
+                # Append value from transect to appropriate key
+                if key2 == "UseInSummary":
+                    sum_dict["Use"].append(float(val2))
+                elif key2 == "BeginLeft":
+                    sum_dict["Begin_Left"].append(float(val2))
+                elif key2 == "FileName":
+                    sum_dict["FileName"].append(val2)
+                elif key2 == "LeftEdgeSlopeCoeff":
+                    sum_dict["LeftEdgeSlopeCoeff"].append(float(val2))
+                elif key2 == "RightEdgeSlopeCoeff":
+                    sum_dict["RightEdgeSlopeCoeff"].append(float(val2))
+                else:
+                    # If the key has not been specified use key from
+                    # transect summary
+                    if key2 not in sum_dict:
+                        sum_dict[key2] = []
+                    try:
+                        sum_dict[key2].append(float(val2))
+                    except ValueError:
+                        sum_dict[key2].append(np.nan)
+        return sum_dict
+
+
+class MMTtransect(object):
+    """Class to hold properties of MMT transect dictionary attributes.
+
+    Attributes
+    ----------
+    Checked: int
+    Files: list
+    Notes: list
+    """
+
+    def __init__(self, trans):
+        """Constructor immediately begins extraction of data"""
+
+        self.Checked = int(trans["@Checked"])
+        self.Files = []
+        self.Notes = []
+        self.field_config = None
+        self.active_config = None
+        self.moving_bed_type = None
+
+        files = trans["File"]
+
+        # Create File classes for each file associated with transect
+        if type(files) is list:
+            for file in files:
+                self.Files.append(file["#text"])
+        else:
+            self.Files.append(files["#text"])
+
+        # Create Note classes for each file associated with transect
+        if "Note" in trans.keys():
+            note = trans["Note"]
+            if type(note) is list:
+                for n in note:
+                    if type(trans["File"]) is list:
+                        self.Notes.append(
+                            self.note_dict(n, trans["File"][0]["@TransectNmb"])
+                        )
+                    else:
+                        self.Notes.append(
+                            self.note_dict(n, trans["File"]["@TransectNmb"])
+                        )
+            else:
+                if type(trans["File"]) is list:
+                    self.Notes.append(
+                        self.note_dict(note, trans["File"][0]["@TransectNmb"])
+                    )
+                else:
+                    self.Notes.append(
+                        self.note_dict(note, trans["File"]["@TransectNmb"])
+                    )
+
+        # Create configuration dictionaries for each config attribute
+        if type(trans["Configuration"]) is list:
+            for config in trans["Configuration"]:
+                if int(config["@Checked"]) == 0:
+                    self.field_config = self.parse_config(config)
+                if int(config["@Checked"]) == 1:
+                    self.active_config = self.parse_config(config)
+        else:
+            if int(trans["Configuration"]["@Checked"]) == 0:
+                self.field_config = self.parse_config(trans["Configuration"])
+            if int(trans["Configuration"]["@Checked"]) == 1:
+                self.active_config = self.parse_config(trans["Configuration"])
+
+        # Assign active config to field config if there is no field config
+        if self.field_config is None:
+            self.field_config = self.active_config
+
+    def set_moving_bed_type(self, mvb_type):
+        """Setter for moving bed type in the case of MBT Transects
+
+        Parameters
+        ----------
+        mvb_type: str
+            Type of moving-bed test.
+        """
+
+        self.moving_bed_type = mvb_type
+
+    @staticmethod
+    def parse_config(config):
+        """Method to parse configuration file from mmt xml.
+
+        Parameters
+        ----------
+        config: dict
+            Dictionary of configuration settings
+
+        Returns
+        -------
+        config_dict: dict
+            Processed dictionary of configuration settings
+        """
+
+        # Initialize dictionary for configuration
+        config_dict = {}
+
+        # Store all instrument commands
+        command_groups = config["Commands"]
+        for group in command_groups.keys():
+            config_dict[group] = []
+            for key, command in command_groups[group].items():
+                if key != "@Status":
+                    config_dict[group].append(command)
+
+        # Depth sounder configuration
+        if "Use_Depth_Sounder_In_Processing" in config["Depth_Sounder"].keys():
+            if (
+                config["Depth_Sounder"]["Use_Depth_Sounder_In_Processing"]["#text"]
+                == "YES"
+            ):
+                config_dict["DS_Use_Process"] = 1
+            else:
+                config_dict["DS_Use_Process"] = 0
+        else:
+            config_dict["DS_Use_Process"] = -1
+
+        config_dict["DS_Transducer_Depth"] = float(
+            config["Depth_Sounder"]["Depth_Sounder_Transducer_Depth"]["#text"]
+        )
+        config_dict["DS_Transducer_Offset"] = float(
+            config["Depth_Sounder"]["Depth_Sounder_Transducer_Offset"]["#text"]
+        )
+
+        if (
+            config["Depth_Sounder"]["Depth_Sounder_Correct_Speed_of_Sound"]["#text"]
+            == "YES"
+        ):
+            config_dict["DS_Cor_Spd_Sound"] = 1
+        else:
+            config_dict["DS_Cor_Spd_Sound"] = 0
+
+        config_dict["DS_Scale_Factor"] = float(
+            config["Depth_Sounder"]["Depth_Sounder_Scale_Factor"]["#text"]
+        )
+
+        # External heading configuration
+        config_dict["Ext_Heading_Offset"] = float(
+            config["Ext_Heading"]["Offset"]["#text"]
+        )
+
+        if "Use_Ext_Heading" in config["Ext_Heading"].keys():
+            if config["Ext_Heading"]["Use_Ext_Heading"]["#text"] == "NO":
+                config_dict["Ext_Heading_Use"] = False
+            else:
+                config_dict["Ext_Heading_Use"] = True
+        else:
+            config_dict["Ext_Heading_Use"] = False
+
+        # GPS configuration
+        if "GPS" in config.keys():
+            config_dict["GPS_Time_Delay"] = config["GPS"]["Time_Delay"]["#text"]
+
+        # Discharge settings
+        config_dict["Q_Top_Method"] = float(
+            config["Discharge"]["Top_Discharge_Estimate"]["#text"]
+        )
+        config_dict["Q_Bottom_Method"] = float(
+            config["Discharge"]["Bottom_Discharge_Estimate"]["#text"]
+        )
+        config_dict["Q_Power_Curve_Coeff"] = float(
+            config["Discharge"]["Power_Curve_Coef"]["#text"]
+        )
+        config_dict["Q_Cut_Top_Bins"] = float(
+            config["Discharge"]["Cut_Top_Bins"]["#text"]
+        )
+        config_dict["Q_Bins_Above_Sidelobe"] = float(
+            config["Discharge"]["Cut_Bins_Above_Sidelobe"]["#text"]
+        )
+        config_dict["Q_Left_Edge_Type"] = float(
+            config["Discharge"]["River_Left_Edge_Type"]["#text"]
+        )
+        config_dict["Q_Left_Edge_Coeff"] = float(
+            config["Discharge"]["Left_Edge_Slope_Coeff"]["#text"]
+        )
+        config_dict["Q_Right_Edge_Type"] = float(
+            config["Discharge"]["River_Right_Edge_Type"]["#text"]
+        )
+        config_dict["Q_Right_Edge_Coeff"] = float(
+            config["Discharge"]["Right_Edge_Slope_Coeff"]["#text"]
+        )
+        config_dict["Q_Shore_Pings_Avg"] = float(
+            config["Discharge"]["Shore_Pings_Avg"]["#text"]
+        )
+
+        # Edge estimate settings
+        config_dict["Edge_Begin_Shore_Distance"] = config["Edge_Estimates"][
+            "Begin_Shore_Distance"
+        ]["#text"]
+        config_dict["Edge_End_Shore_Distance"] = float(
+            config["Edge_Estimates"]["End_Shore_Distance"]["#text"]
+        )
+        if config["Edge_Estimates"]["Begin_Left_Bank"]["#text"] == "YES":
+            config_dict["Edge_Begin_Left_Bank"] = 1
+        else:
+            config_dict["Edge_Begin_Left_Bank"] = 0
+
+        # Check for user discharge feature in mmt file
+        if "Begin_Manual_Discharge" in config["Edge_Estimates"]:
+            config_dict["Edge_Begin_Manual_Discharge"] = float(
+                config["Edge_Estimates"]["Begin_Manual_Discharge"]["#text"]
+            )
+            config_dict["Edge_Begin_Method_Distance"] = config["Edge_Estimates"][
+                "Begin_Edge_Discharge_Method_Distance"
+            ]["#text"]
+            config_dict["Edge_End_Manual_Discharge"] = float(
+                config["Edge_Estimates"]["End_Manual_Discharge"]["#text"]
+            )
+            config_dict["Edge_End_Method_Distance"] = config["Edge_Estimates"][
+                "End_Edge_Discharge_Method_Distance"
+            ]["#text"]
+
+        # Offsets
+        for key in config["Offsets"].keys():
+            if key == "ADCP_Transducer_Depth":
+                child = "Offsets_Transducer_Depth"
+            else:
+                child = "Offsets_" + key
+
+            config_dict[child] = float(config["Offsets"][key]["#text"])
+
+        # Processing settings
+        for key in config["Processing"].keys():
+            if key == "Use_3_Beam_Solution_For_BT":
+                child = "Proc_Use_3_Beam_BT"
+            elif key == "Use_3_Beam_Solution_For_WT":
+                child = "Proc_Use_3_Beam_WT"
+            elif key == "BT_Error_Velocity_Threshold":
+                child = "Proc_BT_Error_Vel_Threshold"
+            elif key == "WT_Error_Velocity_Threshold":
+                child = "Proc_WT_Error_Velocity_Threshold"
+            elif key == "BT_Up_Velocity_Threshold":
+                child = "Proc_BT_Up_Vel_Threshold"
+            elif key == "WT_Up_Velocity_Threshold":
+                child = "Proc_WT_Up_Vel_Threshold"
+            elif key == "Fixed_Speed_Of_Sound":
+                child = "Proc_Fixed_Speed_Of_Sound"
+            elif key == "Mark_Below_Bottom_Bad":
+                child = "Proc_Mark_Below_Bottom_Bad"
+            elif key == "Use_Weighted_Mean":
+                child = "Proc_Use_Weighted_Mean"
+            elif key == "Absorption":
+                child = "Proc_Absorption"
+            else:
+                child = "Proc_" + key
+
+            # Try to cast to float otherwise assign 1 or 0 based on string
+            # value
+            try:
+                config_dict[child] = float(config["Processing"][key]["#text"])
+            except ValueError:
+                if config["Processing"][key]["#text"] == "YES":
+                    config_dict[child] = 1
+                else:
+                    config_dict[child] = 0
+
+            # Recording
+            config_dict["Rec_Filename_Prefix"] = config["Recording"]["Filename_Prefix"][
+                "#text"
+            ]
+            config_dict["Rec_Output_Directory"] = config["Recording"][
+                "Output_Directory"
+            ]["#text"]
+
+            if "Root_Directory" in config["Recording"].keys():
+                if "#text" in config["Recording"]["Root_Directory"]:
+                    config_dict["Rec_Root_Directory"] = config["Recording"][
+                        "Root_Directory"
+                    ]["#text"]
+                else:
+                    config_dict["Rec_Root_Directory"] = None
+            else:
+                config_dict["Rec_Root_Directory"] = None
+
+            if config["Recording"]["MeasurmentNmb"] is None:
+                config_dict["Rec_MeasNmb"] = config["Recording"]["MeasurmentNmb"]
+            else:
+                config_dict["Rec_MeasNmb"] = config["Recording"]["MeasurmentNmb"]
+            config_dict["Rec_GPS"] = config["Recording"]["GPS_Recording"]["#text"]
+            config_dict["Rec_DS"] = config["Recording"]["DS_Recording"]["#text"]
+            config_dict["Rec_EH"] = config["Recording"]["EH_Recording"]["#text"]
+            config_dict["Rec_ASCII_Output"] = config["Recording"][
+                "ASCII_Output_Recording"
+            ]["#text"]
+            config_dict["Rec_Max_File_Size"] = float(
+                config["Recording"]["Maximum_File_Size"]["#text"]
+            )
+            config_dict["Rec_Next_Transect_Number"] = float(
+                config["Recording"]["Next_Transect_Number"]["#text"]
+            )
+            config_dict["Rec_Add_Date_Time"] = float(
+                config["Recording"]["Add_Date_Time"]["#text"]
+            )
+            config_dict["Rec_Use_Delimiter"] = config["Recording"]["Use_Delimiter"][
+                "#text"
+            ]
+            config_dict["Rec_Delimiter"] = config["Recording"]["Custom_Delimiter"][
+                "#text"
+            ]
+            config_dict["Rec_Prefix"] = config["Recording"]["Use_Prefix"]["#text"]
+            config_dict["Rec_Use_MeasNmb"] = config["Recording"]["Use_MeasurementNmb"][
+                "#text"
+            ]
+            config_dict["Rec_Use_TransectNmb"] = config["Recording"]["Use_TransectNmb"][
+                "#text"
+            ]
+            config_dict["Rec_Use_SequenceNmb"] = config["Recording"]["Use_SequenceNmb"][
+                "#text"
+            ]
+
+            # Wizard settings
+            config_dict["Wiz_ADCP_Type"] = float(config["Wizard_Info"]["ADCP_Type"])
+            config_dict["Wiz_Firmware"] = float(
+                config["Wizard_Info"]["ADCP_FW_Version"]
+            )
+            config_dict["Wiz_Use_Ext_Heading"] = config["Wizard_Info"][
+                "Use_Ext_Heading"
+            ]
+            config_dict["Wiz_Use_GPS"] = config["Wizard_Info"]["Use_GPS"]
+            config_dict["Wiz_Use_DS"] = config["Wizard_Info"]["Use_Depth_Sounder"]
+            config_dict["Wiz_Max_Water_Depth"] = float(
+                config["Wizard_Info"]["Max_Water_Depth"]
+            )
+            config_dict["Wiz_Max_Water_Speed"] = float(
+                config["Wizard_Info"]["Max_Water_Speed"]
+            )
+            config_dict["Wiz_Max_Boat_Space"] = float(
+                config["Wizard_Info"]["Max_Boat_Speed"]
+            )
+            config_dict["Wiz_Material"] = float(config["Wizard_Info"]["Material"])
+            config_dict["Wiz_Water_Mode"] = float(config["Wizard_Info"]["Water_Mode"])
+            config_dict["Wiz_Bottom_Mode"] = float(config["Wizard_Info"]["Bottom_Mode"])
+            config_dict["Wiz_Beam_Angle"] = float(config["Wizard_Info"]["Beam_Angle"])
+            config_dict["Wiz_Pressure_Sensor"] = config["Wizard_Info"][
+                "Pressure_Sensor"
+            ]
+            config_dict["Wiz_Water_Mode_13"] = float(
+                config["Wizard_Info"]["Water_Mode_13_Avail"]
+            )
+            config_dict["Wiz_StreamPro_Default"] = float(
+                config["Wizard_Info"]["Use_StreamPro_Def_Cfg"]
+            )
+            config_dict["Wiz_StreamPro_Bin_Size"] = float(
+                config["Wizard_Info"]["StreamPro_Bin_Size"]
+            )
+            config_dict["Wiz_StreamPro_Bin_Number"] = float(
+                config["Wizard_Info"]["StreamPro_Bin_Num"]
+            )
+
+            if "Use_GPS_Internal" in config["Wizard_Info"].keys():
+                config_dict["Wiz_Use_GPS_Internal"] = config["Wizard_Info"][
+                    "Use_GPS_Internal"
+                ]
+            if "Internal_GPS_Baud_Rate_Index" in config["Wizard_Info"].keys():
+                config_dict["Wiz_Internal_GPS_Baud_Rate_Index"] = float(
+                    config["Wizard_Info"]["Internal_GPS_Baud_Rate_Index"]
+                )
+
+        return config_dict
+
+    @staticmethod
+    def file_dict(file):
+        """Create dictionary for file information.
+
+        Parameters
+        ----------
+        file: dict
+            Dictionary for file from mmt
+
+        Returns
+        -------
+        transect_file: dict
+            Dictionary of transect file information
+                Path: str
+                    Full filename of transect including path
+                File: str
+                    Filename of transect
+                Number: str
+                    Transect number assigned in WinRiver 2
+        """
+
+        transect_file = {
+            "Path": file["@PathName"],
+            "File": file["#text"],
+            "Number": file["@TransectNmb"],
+        }
+        return transect_file
+
+    @staticmethod
+    def note_dict(note, number):
+        """Create dictionary for notes.
+
+        Parameters
+        ----------
+        note: dict
+            Dictionary from mmt for notes
+        number: str
+            Transect number
+
+        Returns
+        -------
+        note_dict_out: dict
+            Dictionary for note information
+                NoteFileNo: str
+                    Transect number associated with the note
+                NoteDate: str
+                    Date note was entered
+                NoteText: str
+                    Text of note
+        """
+
+        note_dict_out = {
+            "NoteFileNo": number,
+            "NoteDate": note["@TimeStamp"],
+            "NoteText": note["@Text"],
+        }
+        return note_dict_out
diff --git a/qrevint_22_06_22/Classes/MatSonTek.py b/Classes/MatSonTek.py
similarity index 50%
rename from qrevint_22_06_22/Classes/MatSonTek.py
rename to Classes/MatSonTek.py
index e78c3467c224b188d71eeefe7be2343392658c2d..83d1b130ea82d510050332565900cff3c69713e4 100644
--- a/qrevint_22_06_22/Classes/MatSonTek.py
+++ b/Classes/MatSonTek.py
@@ -1,13 +1,15 @@
 import scipy.io as sio
 import numpy as np
 
+
 class MatSonTek(object):
     """Read SonTek Matlab files and returns a dictionary of mat_struct.
-     Any data in English units are converted to SI units.
+    Any data in English units are converted to SI units.
     """
 
     def __init__(self, fullname):
-        """Initializes the object, reads the Matlab file, and converts all English units to metric.
+        """Initializes the object, reads the Matlab file, and converts all
+        English units to metric.
 
         Parameters
         ----------
@@ -18,15 +20,18 @@ class MatSonTek(object):
         # Read Matlab file
         mat_data = sio.loadmat(fullname, struct_as_record=False, squeeze_me=True)
 
-        if 'BottomTrack' in mat_data:
+        if "BottomTrack" in mat_data:
             # Convert data to SI units if in English units
-            if mat_data['BottomTrack'].Units.BT_Depth == 'ft':
+            if mat_data["BottomTrack"].Units.BT_Depth == "ft":
                 self.convert2metric(mat_data)
 
-            if hasattr(mat_data['RawGPSData'], 'VtgMode'):
-                mat_data['RawGPSData'].VtgMode[np.isnan(mat_data['RawGPSData'].VtgMode)] = 0
-                mat_data['RawGPSData'].VtgMode = \
-                    np.array([chr(x) for x in range(127)])[mat_data['RawGPSData'].VtgMode.astype(int)]
+            if hasattr(mat_data["RawGPSData"], "VtgMode"):
+                mat_data["RawGPSData"].VtgMode[
+                    np.isnan(mat_data["RawGPSData"].VtgMode)
+                ] = 0
+                mat_data["RawGPSData"].VtgMode = np.array([chr(x) for x in range(127)])[
+                    mat_data["RawGPSData"].VtgMode.astype(int)
+                ]
 
         # Create structure from dictionary
         vars(self).update(mat_data)
@@ -41,24 +46,31 @@ class MatSonTek(object):
             Dictionary of data from Matlab file
         """
 
-        data2correct = ['BottomTrack', 'GPS', 'Setup', 'Summary', 'System', 'WaterTrack']
+        data2correct = [
+            "BottomTrack",
+            "GPS",
+            "Setup",
+            "Summary",
+            "System",
+            "WaterTrack",
+        ]
         for item in data2correct:
             data = mat_data[item]
             units = data.Units
             names = units._fieldnames
             for name in names:
-                if getattr(units, name) == 'ft':
+                if getattr(units, name) == "ft":
                     setattr(data, name, getattr(data, name) * 0.3048)
-                    setattr(units, name, 'm')
-                elif getattr(units, name) == 'ft/s':
+                    setattr(units, name, "m")
+                elif getattr(units, name) == "ft/s":
                     setattr(data, name, getattr(data, name) * 0.3048)
-                    setattr(units, name, 'm/s')
-                elif getattr(units, name) == 'degF':
-                    setattr(data, name, (getattr(data, name)-32) * (5.0/9.0))
-                    setattr(units, name, 'degC')
-                elif getattr(units, name) == 'cfs':
+                    setattr(units, name, "m/s")
+                elif getattr(units, name) == "degF":
+                    setattr(data, name, (getattr(data, name) - 32) * (5.0 / 9.0))
+                    setattr(units, name, "degC")
+                elif getattr(units, name) == "cfs":
                     setattr(data, name, getattr(data, name) * (0.3048**3))
-                    setattr(units, name, 'm3/s')
-                elif getattr(units, name) == 'ft2':
-                    setattr(data, name, getattr(data, name) * (0.3048 ** 2))
-                    setattr(units, name, 'm2')
+                    setattr(units, name, "m3/s")
+                elif getattr(units, name) == "ft2":
+                    setattr(data, name, getattr(data, name) * (0.3048**2))
+                    setattr(units, name, "m2")
diff --git a/Classes/Measurement.py b/Classes/Measurement.py
new file mode 100644
index 0000000000000000000000000000000000000000..87710cc2fd1b1fd67394d555ff8d8ea47cf2f63e
--- /dev/null
+++ b/Classes/Measurement.py
@@ -0,0 +1,4986 @@
+import os
+import datetime
+import numpy as np
+import xml.etree.ElementTree as ETree
+from xml.dom.minidom import parseString
+import utm
+from Classes.MMT_TRDI import MMTtrdi
+from Classes.TransectData import TransectData
+from Classes.PreMeasurement import PreMeasurement
+from Classes.MovingBedTests import MovingBedTests
+from Classes.QComp import QComp
+from Classes.MatSonTek import MatSonTek
+from Classes.ComputeExtrap import ComputeExtrap
+from Classes.CrossSectionComp import CrossSectionComp
+from Classes.ExtrapQSensitivity import ExtrapQSensitivity
+from Classes.Uncertainty import Uncertainty
+from Classes.QAData import QAData
+from Classes.BoatStructure import BoatStructure
+from Classes.BoatData import BoatData
+from Classes.WaterData import WaterData
+from Classes.Oursin import Oursin
+from Classes.MAP import MAP
+from Classes.Pd0TRDI_2 import Pd0TRDI
+from MiscLibs.common_functions import cart2pol, pol2cart, rad2azdeg, nans, azdeg2rad
+# from profilehooks import profile
+
+
+class Measurement(object):
+    """Class to hold all measurement details.
+
+    Attributes
+    ----------
+    station_name: str
+        Station name
+    station_number: str
+        Station number
+    meas_number: str
+        Measurement number
+    persons: str
+        Persons collecting and/or processing the measurement
+    transects: list
+        List of transect objects of TransectData
+    mb_tests: list
+        List of moving-bed test objects of MovingBedTests
+    system_tst: list
+        List of system test objects of PreMeasurement
+    compass_cal: list
+        List of compass calibration objects of PreMeasurement
+    compass_eval: list
+        List of compass evaluation objects of PreMeasurement
+    extrap_fit: ComputeExtrap
+        Object of ComputeExtrap
+    processing: str
+        Type of processing, default QRev
+    discharge: list
+        List of discharge objects of QComp
+    uncertainty: Uncertainty
+        Object of Uncertainty
+    initial_settings: dict
+        Dictionary of all initial processing settings
+    qa: QAData
+        Object of QAData
+    user_rating: str
+        Optional user rating
+    comments: list
+        List of all user supplied comments
+    ext_temp_chk: dict
+        Dictionary of external temperature readings
+    use_weighted: bool
+        Indicates the setting for use_weighted to be used for reprocessing
+    use_ping_type: bool
+        Indicates if ping types should be used in BT and WT filters
+    use_measurement_thresholds: bool
+        Indicates if the entire measurement should be used to set filter
+        thresholds
+    stage_start_m: float
+        Stage at start of measurement
+    stage_end_m: float
+        Stage at end of measurement
+    stage_meas_m: float
+        Stage assigned to measurement
+    export_xs: bool
+        Indicates if average cross-section should be computed and exported
+    use_weighted: bool
+        Indicates the setting for use_weighted to be used for reprocessing
+    use_ping_type: bool
+        Indicates if ping types should be used in BT and WT filters
+    use_measurement_thresholds: bool
+        Indicates if the entire measurement should be used to set filter thresholds
+    stage_start_m: float
+        Stage at start of measurement
+    stage_end_m: float
+        Stage at end of measurement
+    stage_meas_m: float
+        Stage assigned to measurement
+    gps_quality_threshold: int
+        Sets the threshold for which the GPS quality must equal to or greater than
+    export_xs: bool
+        Specifies if average cross-section should be computed and exported
+    run_map: bool
+        Indicates if the MAP computation should be run
+    snr_3beam_comp: bool
+        Indicates the use of 3-beam velocity computations when invalid SNR is found
+    """
+
+    # @profile
+    def __init__(
+            self,
+            in_file,
+            source,
+            proc_type="QRev",
+            checked=False,
+            run_oursin=False,
+            use_weighted=False,
+            use_measurement_thresholds=False,
+            use_ping_type=True,
+            min_transects=2,
+            min_duration=720,
+            export_xs=True,
+            run_map=True,
+            gps_quality_threshold=2,
+            snr_3beam_comp=False,
+    ):
+        """Initialize instance variables and initiate processing of measurement
+        data.
+
+        Parameters
+        ----------
+        in_file: str or list or dict
+            String containing fullname of mmt file for TRDI data, dict for
+            QRev data, or list of files for SonTek
+        source: str
+            Source of data. TRDI, SonTek, QRev
+        proc_type: str
+            Type of processing. QRev, None, Original
+        checked: bool
+            Boolean to determine if only checked transects should be load for
+            TRDI data.
+        run_oursin: bool
+            Determines if the Oursin uncertainty model should be run
+        use_weighted: bool
+            Specifies if discharge weighted medians are used for extrapolation
+        use_measurement_thresholds: bool
+            Specifies if filters are based on a transect or whole measurement
+        use_ping_type: bool
+            Specifies if filters are based on ping type and frequency
+        min_transects: int
+            Minimum number of transects required to pass QA
+        min_duration: float
+            Minimum duration in seconds of all transects to pass QA
+        export_xs: bool
+            Specifies if average cross-section should be computed and exported
+        run_map: bool
+            Indicates if the MAP computation should be run
+        gps_quality_threshold: int
+            Sets the threshold for which the GPS quality must equal to or greater than
+        """
+
+        self.use_ping_type = use_ping_type
+        self.use_measurement_thresholds = use_measurement_thresholds
+        self.run_oursin = run_oursin
+        self.min_transects = min_transects
+        self.min_duration = min_duration
+        self.station_name = None
+        self.station_number = None
+        self.persons = ""
+        self.meas_number = ""
+        self.transects = []
+        self.mb_tests = []
+        self.system_tst = []
+        self.compass_cal = []
+        self.compass_eval = []
+        self.extrap_fit = None
+        self.processing = None
+        self.discharge = []
+        self.uncertainty = None
+        self.initial_settings = None
+        self.qa = None
+        self.user_rating = "Not Rated"
+        self.comments = []
+        self.ext_temp_chk = {
+            "user": np.nan,
+            "units": "C",
+            "adcp": np.nan,
+            "user_orig": np.nan,
+            "adcp_orig": np.nan,
+        }
+        self.checked_transect_idx = []
+        self.oursin = None
+        self.map = None
+        self.use_weighted = use_weighted
+        self.observed_no_moving_bed = False
+        self.stage_meas_m = 0
+        self.stage_end_m = 0
+        self.stage_start_m = 0
+        self.export_xs = export_xs
+        self.run_map = run_map
+        self.gps_quality_threshold = gps_quality_threshold
+
+        # Load data from selected source
+        if source == "QRev":
+            self.load_qrev_mat(mat_data=in_file)
+            if proc_type == "QRev":
+                # Apply QRev default settings
+                self.run_oursin = run_oursin
+                self.use_weighted = use_weighted
+                self.use_measurement_thresholds = use_measurement_thresholds
+                settings = self.current_settings()
+                settings["WTEnsInterpolation"] = "abba"
+                settings["WTCellInterpolation"] = "abba"
+                settings["Processing"] = "QRev"
+                settings["UseMeasurementThresholds"] = use_measurement_thresholds
+                self.apply_settings(settings)
+
+        else:
+
+            if source == "TRDI":
+                self.load_trdi(in_file, checked=checked)
+
+            elif source == "SonTek":
+                self.load_sontek(in_file, snr_3beam_comp=snr_3beam_comp)
+
+            elif source == "Nortek":
+                self.load_sontek(in_file, snr_3beam_comp=snr_3beam_comp)
+
+            # Process data
+            if len(self.transects) > 0:
+                # Save initial settings
+                self.initial_settings = self.current_settings()
+
+                # Set processing type
+                if proc_type == "QRev":
+
+                    # Apply QRev default settings
+                    settings = self.qrev_default_settings(
+                        check_user_excluded_dist=True, use_weighted=use_weighted
+                    )
+
+                    settings["Processing"] = "QRev"
+                    settings["UseMeasurementThresholds"] = use_measurement_thresholds
+
+                    settings["UsePingType"] = self.use_ping_type
+                    self.apply_settings(settings)
+
+                elif proc_type == "None":
+                    # Processing with no filters and interpolation
+                    settings = self.no_filter_interp_settings(self)
+                    settings["Processing"] = "None"
+                    self.apply_settings(settings)
+
+                elif proc_type == "Original":
+                    # Processing for original settings
+                    # from manufacturer software
+                    for transect in self.transects:
+                        q = QComp()
+                        q.populate_data(data_in=transect, moving_bed_data=self.mb_tests)
+
+                        self.discharge.append(q)
+
+                # Process moving-bed tests
+                if len(self.mb_tests) > 0:
+                    # Get navigation reference
+                    select = self.initial_settings["NavRef"]
+                    ref = None
+
+                    if select == "bt_vel":
+                        ref = "BT"
+
+                    elif select == "gga_vel":
+                        ref = "GGA"
+
+                    elif select == "vtg_vel":
+                        ref = "VTG"
+                    self.mb_tests = MovingBedTests.auto_use_2_correct(
+                        moving_bed_tests=self.mb_tests, boat_ref=ref
+                    )
+
+                self.uncertainty = Uncertainty()
+                self.uncertainty.compute_uncertainty(self)
+                self.qa = QAData(self)
+
+    def load_trdi(self, mmt_file, transect_type="Q", checked=False):
+        """Method to load TRDI data.
+
+        Parameters
+        ----------
+        mmt_file: str
+            Full pathname to mmt file.
+        transect_type: str
+            Type of data (Q: discharge, MB: moving-bed test
+        checked: bool
+            Determines if all files are loaded (False) or only checked (True)
+        """
+
+        # Read mmt file
+        mmt = MMTtrdi(mmt_file)
+
+        # Get properties if they exist, otherwise set them as blank strings
+        self.station_name = str(mmt.site_info["Name"])
+        self.station_number = str(mmt.site_info["Number"])
+        self.persons = str(mmt.site_info["Party"])
+        self.meas_number = str(mmt.site_info["MeasurementNmb"])
+
+        # Get stage readings, if available. Note: mmt stage is always in m.
+        if mmt.site_info["Use_Inside_Gage_Height"] == "1":
+            stage = float(mmt.site_info["Inside_Gage_Height"])
+        else:
+            stage = float(mmt.site_info["Outside_Gage_Height"])
+
+        self.stage_start_m = stage
+        change = float(mmt.site_info["Gage_Height_Change"])
+        self.stage_end_m = stage + change
+        self.stage_meas_m = (self.stage_start_m + self.stage_end_m) / 2.0
+
+        # Initialize processing variable
+        self.processing = "WR2"
+
+        if len(mmt.transects) > 0:
+            # Create transect objects for  TRDI data
+            self.transects = self.allocate_transects(
+                mmt=mmt, transect_type=transect_type, checked=checked
+            )
+
+            self.checked_transect_idx = self.checked_transects(self)
+
+            # Create object for pre-measurement tests
+            if isinstance(mmt.qaqc, dict) or isinstance(mmt.mbt_transects, list):
+                self.qaqc_trdi(mmt)
+
+            # Save comments from mmt file in comments
+            self.comments.append("MMT Remarks: " + mmt.site_info["Remarks"])
+
+            for t in range(len(self.transects)):
+                notes = getattr(mmt.transects[t], "Notes")
+                for note in notes:
+                    note_text = (
+                            " File: "
+                            + note["NoteFileNo"]
+                            + " "
+                            + note["NoteDate"]
+                            + ": "
+                            + note["NoteText"]
+                    )
+                    self.comments.append(note_text)
+
+            # Get external temperature
+            if type(mmt.site_info["Water_Temperature"]) is float:
+                self.ext_temp_chk["user"] = mmt.site_info["Water_Temperature"]
+                self.ext_temp_chk["units"] = "C"
+                self.ext_temp_chk["user_orig"] = mmt.site_info["Water_Temperature"]
+
+            # Initialize thresholds settings dictionary
+            threshold_settings = dict()
+            threshold_settings["wt_settings"] = {}
+            threshold_settings["bt_settings"] = {}
+            threshold_settings["depth_settings"] = {}
+
+            # Select reference transect use first checked or if none then
+            # first transect
+            if len(self.checked_transect_idx) > 0:
+                ref_transect = self.checked_transect_idx[0]
+            else:
+                ref_transect = 0
+
+            # Water track filter threshold settings
+            threshold_settings["wt_settings"][
+                "beam"
+            ] = self.set_num_beam_wt_threshold_trdi(mmt.transects[ref_transect])
+            threshold_settings["wt_settings"]["difference"] = "Manual"
+            threshold_settings["wt_settings"]["difference_threshold"] = mmt.transects[
+                ref_transect
+            ].active_config["Proc_WT_Error_Velocity_Threshold"]
+            threshold_settings["wt_settings"]["vertical"] = "Manual"
+            threshold_settings["wt_settings"]["vertical_threshold"] = mmt.transects[
+                ref_transect
+            ].active_config["Proc_WT_Up_Vel_Threshold"]
+
+            # Bottom track filter threshold settings
+            threshold_settings["bt_settings"][
+                "beam"
+            ] = self.set_num_beam_bt_threshold_trdi(mmt.transects[ref_transect])
+            threshold_settings["bt_settings"]["difference"] = "Manual"
+            threshold_settings["bt_settings"]["difference_threshold"] = mmt.transects[
+                ref_transect
+            ].active_config["Proc_BT_Error_Vel_Threshold"]
+            threshold_settings["bt_settings"]["vertical"] = "Manual"
+            threshold_settings["bt_settings"]["vertical_threshold"] = mmt.transects[
+                ref_transect
+            ].active_config["Proc_BT_Up_Vel_Threshold"]
+
+            # Depth filter and averaging settings
+            threshold_settings["depth_settings"][
+                "depth_weighting"
+            ] = self.set_depth_weighting_trdi(mmt.transects[ref_transect])
+            threshold_settings["depth_settings"]["depth_valid_method"] = "TRDI"
+            threshold_settings["depth_settings"][
+                "depth_screening"
+            ] = self.set_depth_screening_trdi(mmt.transects[ref_transect])
+
+            # Determine reference used in WR2 if available
+            reference = "BT"
+            if "Reference" in mmt.site_info.keys():
+                reference = mmt.site_info["Reference"]
+                if reference == "BT":
+                    target = "bt_vel"
+                elif reference == "GGA":
+                    target = "gga_vel"
+                elif reference == "VTG":
+                    target = "vtg_vel"
+                else:
+                    target = "bt_vel"
+
+                for transect in self.transects:
+                    if getattr(transect.boat_vel, target) is None:
+                        reference = "BT"
+
+            # Convert to earth coordinates
+            for transect_idx, transect in enumerate(self.transects):
+                # Convert to earth coordinates
+                transect.change_coord_sys(new_coord_sys="Earth")
+
+                # Set navigation reference
+                transect.change_nav_reference(update=False, new_nav_ref=reference)
+
+                # Apply WR2 thresholds
+                self.thresholds_trdi(transect, threshold_settings)
+
+                # Apply boat interpolations
+                transect.boat_interpolations(update=False, target="BT", method="None")
+                if transect.gps is not None:
+                    transect.boat_interpolations(
+                        update=False, target="GPS", method="HoldLast"
+                    )
+
+                # Update water data for changes in boat velocity
+                transect.update_water()
+
+                # Filter water data
+                transect.w_vel.apply_filter(transect=transect, wt_depth=True)
+
+                # Interpolate water data
+                transect.w_vel.apply_interpolation(
+                    transect=transect, ens_interp="None", cells_interp="None"
+                )
+
+                # Apply speed of sound computations as required
+                mmt_sos_method = mmt.transects[transect_idx].active_config[
+                    "Proc_Speed_of_Sound_Correction"
+                ]
+
+                # Speed of sound computed based on user supplied values
+                if mmt_sos_method == 1:
+                    salinity = mmt.transects[transect_idx].active_config[
+                        "Proc_Salinity"
+                    ]
+                    transect.change_sos(
+                        parameter="salinity", selected="user", salinity=salinity
+                    )
+                elif mmt_sos_method == 2:
+                    # Speed of sound set by user
+                    speed = mmt.transects[transect_idx].active_config[
+                        "Proc_Fixed_Speed_Of_Sound"
+                    ]
+                    transect.change_sos(
+                        parameter="sosSrc", selected="user", speed=speed
+                    )
+
+    def qaqc_trdi(self, mmt):
+        """Processes qaqc test, calibrations, and evaluations
+
+        Parameters
+        ----------
+        mmt: MMTtrdi
+            Object of MMT_TRDI
+        """
+
+        # ADCP Test
+        if "RG_Test" in mmt.qaqc:
+            for n in range(len(mmt.qaqc["RG_Test"])):
+                p_m = PreMeasurement()
+                p_m.populate_data(
+                    mmt.qaqc["RG_Test_TimeStamp"][n], mmt.qaqc["RG_Test"][n], "TST"
+                )
+                self.system_tst.append(p_m)
+
+        # Compass calibration
+        if "Compass_Calibration" in mmt.qaqc:
+            for n in range(len(mmt.qaqc["Compass_Calibration"])):
+                cc = PreMeasurement()
+                cc.populate_data(
+                    mmt.qaqc["Compass_Calibration_TimeStamp"][n],
+                    mmt.qaqc["Compass_Calibration"][n],
+                    "TCC",
+                )
+                self.compass_cal.append(cc)
+
+        # Compass evaluation
+        if "Compass_Evaluation" in mmt.qaqc:
+            for n in range(len(mmt.qaqc["Compass_Evaluation"])):
+                ce = PreMeasurement()
+                ce.populate_data(
+                    mmt.qaqc["Compass_Evaluation_TimeStamp"][n],
+                    mmt.qaqc["Compass_Evaluation"][n],
+                    "TCC",
+                )
+                self.compass_eval.append(ce)
+
+        # Check for moving-bed tests
+        if len(mmt.mbt_transects) > 0:
+
+            # Create transect objects
+            transects = self.allocate_transects(mmt, transect_type="MB")
+
+            # Process moving-bed tests
+            if len(transects) > 0:
+                self.mb_tests = []
+                for n in range(len(transects)):
+
+                    # Create moving-bed test object
+                    mb_test = MovingBedTests()
+                    mb_test.populate_data(
+                        source="TRDI",
+                        file=transects[n],
+                        test_type=mmt.mbt_transects[n].moving_bed_type,
+                    )
+
+                    # Save notes from mmt files in comments
+                    notes = getattr(mmt.mbt_transects[n], "Notes")
+                    for note in notes:
+                        note_text = (
+                                " File: "
+                                + note["NoteFileNo"]
+                                + " "
+                                + note["NoteDate"]
+                                + ": "
+                                + note["NoteText"]
+                        )
+                        self.comments.append(note_text)
+
+                    self.mb_tests.append(mb_test)
+
+    @staticmethod
+    def thresholds_trdi(transect, settings):
+        """Retrieve and apply manual filter settings from mmt file
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        settings: dict
+            Threshold settings computed before processing
+        """
+
+        # Apply WT settings
+        transect.w_vel.apply_filter(transect, **settings["wt_settings"])
+
+        # Apply BT settings
+        transect.boat_vel.bt_vel.apply_filter(transect, **settings["bt_settings"])
+
+        # Apply depth settings
+        transect.depths.bt_depths.valid_data_method = settings["depth_settings"][
+            "depth_valid_method"
+        ]
+        transect.depths.depth_filter(
+            transect=transect,
+            filter_method=settings["depth_settings"]["depth_screening"],
+        )
+        transect.depths.bt_depths.compute_avg_bt_depth(
+            method=settings["depth_settings"]["depth_weighting"]
+        )
+
+        # Apply composite depths as per setting stored in transect
+        # from TransectData
+        transect.depths.composite_depths(transect)
+
+    def load_sontek(self, fullnames, snr_3beam_comp):
+        """Coordinates reading of all SonTek data files.
+
+        Parameters
+        ----------
+        fullnames: list
+            File names including path for all discharge transects converted
+            to Matlab files.
+        snr_3beam_comp: bool
+            Indicates the use of 3-beam velocity computations when invalid SNR is found
+        """
+
+        # Initialize variables
+        rsdata = None
+        pathname = None
+        fullnames.sort()
+
+        for file in fullnames:
+            # Read data file
+            rsdata = MatSonTek(file)
+            pathname, file_name = os.path.split(file)
+
+            if hasattr(rsdata, "BottomTrack"):
+                # Create transect objects for each discharge transect
+                self.transects.append(TransectData())
+                self.transects[-1].sontek(
+                    rsdata, file_name, snr_3beam_comp=snr_3beam_comp
+                )
+            else:
+                self.comments.append(
+                    file + " is incomplete and is not included in "
+                           "measurement processing"
+                )
+
+        # Identify checked transects
+        self.checked_transect_idx = self.checked_transects(self)
+
+        # Site information pulled from last file
+        if hasattr(rsdata, "SiteInfo"):
+            if hasattr(rsdata.SiteInfo, "Site_Name"):
+                if len(rsdata.SiteInfo.Site_Name) > 0:
+                    self.station_name = rsdata.SiteInfo.Site_Name
+                else:
+                    self.station_name = ""
+            if hasattr(rsdata.SiteInfo, "Station_Number"):
+                if len(rsdata.SiteInfo.Station_Number) > 0:
+                    self.station_number = rsdata.SiteInfo.Station_Number
+                else:
+                    self.station_number = ""
+            if hasattr(rsdata.SiteInfo, "Meas_Number"):
+                if len(rsdata.SiteInfo.Meas_Number) > 0:
+                    self.meas_number = rsdata.SiteInfo.Meas_Number
+            if hasattr(rsdata.SiteInfo, "Party"):
+                if len(rsdata.SiteInfo.Party) > 0:
+                    self.persons = rsdata.SiteInfo.Party
+
+            if hasattr(rsdata.SiteInfo, "Comments"):
+                if len(rsdata.SiteInfo.Comments) > 0:
+                    self.comments.append("RS Comments: " + rsdata.SiteInfo.Comments)
+
+            # Although units imply meters the data are actually stored as m
+            # / 10,000
+            if hasattr(rsdata.Setup, "startGaugeHeight"):
+                self.stage_start_m = rsdata.Setup.startGaugeHeight / 10000.0
+
+            if hasattr(rsdata.Setup, "endGaugeHeight"):
+                self.stage_end_m = rsdata.Setup.endGaugeHeight / 10000.0
+
+            self.stage_meas_m = (self.stage_start_m + self.stage_end_m) / 2.0
+
+        self.qaqc_sontek(pathname, snr_3beam_comp=snr_3beam_comp)
+
+        for transect in self.transects:
+            transect.change_coord_sys(new_coord_sys="Earth")
+            transect.change_nav_reference(
+                update=False,
+                new_nav_ref=self.transects[
+                    self.checked_transect_idx[0]
+                ].boat_vel.selected,
+            )
+            transect.boat_interpolations(update=False, target="BT", method="Hold9")
+            transect.boat_interpolations(update=False, target="GPS", method="None")
+            transect.apply_averaging_method(setting="Simple")
+            transect.process_depths(update=False, interpolation_method="HoldLast")
+            transect.update_water()
+
+            # Filter water data
+            transect.w_vel.apply_filter(transect=transect, wt_depth=True)
+
+            # Interpolate water data
+            transect.w_vel.apply_interpolation(
+                transect=transect, ens_interp="None", cells_interp="None"
+            )
+            transect.w_vel.apply_interpolation(
+                transect=transect, ens_interp="None", cells_interp="TRDI"
+            )
+
+            if transect.sensors.speed_of_sound_mps.selected == "user":
+                transect.sensors.speed_of_sound_mps.selected = "internal"
+                transect.change_sos(
+                    parameter="sosSrc",
+                    selected="user",
+                    speed=transect.sensors.speed_of_sound_mps.user.data,
+                )
+            elif transect.sensors.salinity_ppt.selected == "user":
+                transect.change_sos(
+                    parameter="salinity",
+                    selected="user",
+                    salinity=transect.sensors.salinity_ppt.user.data,
+                )
+            elif transect.sensors.temperature_deg_c.selected == "user":
+                transect.change_sos(
+                    parameter="temperature",
+                    selected="user",
+                    temperature=transect.sensors.temperature_deg_c.user.data,
+                )
+
+    def qaqc_sontek(self, pathname, snr_3beam_comp):
+        """Reads and stores system tests, compass calibrations,
+        and moving-bed tests.
+
+        Parameters
+        ----------
+        pathname: str
+            Path to discharge transect files.
+        snr_3beam_comp: bool
+            Indicates the use of 3-beam velocity computations when invalid SNR is found
+        """
+
+        # Compass Calibration
+        compass_cal_folder = os.path.join(pathname, "CompassCal")
+        time_stamp = None
+        if os.path.isdir(compass_cal_folder):
+            for file in os.listdir(compass_cal_folder):
+                valid_file = False
+                # G3 compasses
+                if file.endswith(".ccal"):
+                    time_stamp = file.split("_")
+                    time_stamp = time_stamp[0] + "_" + time_stamp[1]
+                    valid_file = True
+
+                # G2 compasses
+                elif file.endswith(".txt"):
+                    prefix, _ = os.path.splitext(file)
+                    time_stamp = prefix.split("l")[1]
+                    valid_file = True
+
+                if valid_file:
+                    with open(os.path.join(compass_cal_folder, file)) as f:
+                        cal_data = f.read()
+                        cal = PreMeasurement()
+                        cal.populate_data(time_stamp, cal_data, "SCC")
+                        self.compass_cal.append(cal)
+
+        # System Test
+        system_test_folder = os.path.join(pathname, "SystemTest")
+        if os.path.isdir(system_test_folder):
+            for file in os.listdir(system_test_folder):
+                # Find system test files.
+                if file.startswith("SystemTest"):
+                    with open(os.path.join(system_test_folder, file)) as f:
+                        test_data = f.read()
+                        test_data = test_data.replace("\x00", "")
+                    time_stamp = file[10:24]
+                    sys_test = PreMeasurement()
+                    sys_test.populate_data(
+                        time_stamp=time_stamp, data_in=test_data, data_type="SST"
+                    )
+                    self.system_tst.append(sys_test)
+
+        # Moving-bed tests
+        self.sontek_moving_bed_tests(pathname, snr_3beam_comp=snr_3beam_comp)
+
+    def sontek_moving_bed_tests(self, pathname, snr_3beam_comp):
+        """Locates and processes SonTek moving-bed tests.
+
+        Searches the pathname for Matlab files that start with Loop or SMBA.
+        Processes these files as moving bed tests.
+
+        Parameters
+        ----------
+        pathname: str
+            Path to discharge transect files.
+        snr_3beam_comp: bool
+            Indicates the use of 3-beam velocity computations when invalid SNR is found
+        """
+        for file in os.listdir(pathname):
+            # Find moving-bed test files.
+            if file.endswith(".mat"):
+                # Process Loop test
+                if file.lower().startswith("loop"):
+                    self.mb_tests.append(MovingBedTests())
+                    self.mb_tests[-1].populate_data(
+                        source="SonTek",
+                        file=os.path.join(pathname, file),
+                        test_type="Loop",
+                        snr_3beam_comp=snr_3beam_comp,
+                    )
+                # Process Stationary test
+                elif file.lower().startswith("smba"):
+                    self.mb_tests.append(MovingBedTests())
+                    self.mb_tests[-1].populate_data(
+                        source="SonTek",
+                        file=os.path.join(pathname, file),
+                        test_type="Stationary",
+                        snr_3beam_comp=snr_3beam_comp,
+                    )
+
+    def load_qrev_mat(self, mat_data):
+        """Loads and coordinates the mapping of existing QRev Matlab files
+        into Python instance variables.
+
+        Parameters
+        ----------
+        mat_data: dict
+            Dictionary containing Matlab data.
+        """
+
+        meas_struct = mat_data["meas_struct"]
+
+        # Assign data from meas_struct to associated instance variables
+        # in Measurement and associated objects.
+        if len(meas_struct.stationName) > 0:
+            self.station_name = meas_struct.stationName
+        if len(meas_struct.stationNumber) > 0:
+            self.station_number = meas_struct.stationNumber
+        if hasattr(meas_struct, "meas_number"):
+            if len(meas_struct.meas_number) == 0:
+                self.meas_number = ""
+            else:
+                self.meas_number = meas_struct.meas_number
+        if hasattr(meas_struct, "persons"):
+            if len(meas_struct.persons) == 0:
+                self.persons = ""
+            else:
+                self.persons = meas_struct.persons
+        if hasattr(meas_struct, "stage_start_m"):
+            self.stage_start_m = meas_struct.stage_start_m
+        if hasattr(meas_struct, "stage_end_m"):
+            self.stage_end_m = meas_struct.stage_end_m
+        if hasattr(meas_struct, "stage_meas_m"):
+            self.stage_meas_m = meas_struct.stage_meas_m
+        self.processing = meas_struct.processing
+        if type(meas_struct.comments) == np.ndarray:
+            self.comments = meas_struct.comments.tolist()
+
+            # Needed to handle comments with blank lines
+            for n, comment in enumerate(self.comments):
+                if type(comment) is not str:
+                    new_comment = ""
+                    for item in comment:
+                        if len(item.strip()) > 0:
+                            new_comment = new_comment + item
+                        else:
+                            new_comment = new_comment + "\n"
+                    self.comments[n] = new_comment
+        else:
+            self.comments = [meas_struct.comments]
+
+        # Check to make sure all comments are str
+        for n, comment in enumerate(self.comments):
+            if type(comment) is np.ndarray:
+                # Using comment =... didn't work but self.comments[n] does
+                self.comments[2] = np.array2string(comment)
+
+        if hasattr(meas_struct, "userRating"):
+            self.user_rating = meas_struct.userRating
+        else:
+            self.user_rating = ""
+
+        self.initial_settings = vars(meas_struct.initialSettings)
+
+        # Update initial settings to agree with Python definitions
+        nav_dict = {
+            "btVel": "bt_vel",
+            "ggaVel": "gga_vel",
+            "vtgVel": "vtg_vel",
+            "bt_vel": "bt_vel",
+            "gga_vel": "gga_vel",
+            "vtg_vel": "vtg_vel",
+        }
+        self.initial_settings["NavRef"] = nav_dict[self.initial_settings["NavRef"]]
+
+        on_off_dict = {"Off": False, "On": True, 0: False, 1: True}
+        self.initial_settings["WTwtDepthFilter"] = on_off_dict[
+            self.initial_settings["WTwtDepthFilter"]
+        ]
+
+        if type(self.initial_settings["WTsnrFilter"]) is np.ndarray:
+            self.initial_settings["WTsnrFilter"] = "Off"
+
+        nav_dict = {
+            "btDepths": "bt_depths",
+            "vbDepths": "vb_depths",
+            "dsDepths": "ds_depths",
+            "bt_depths": "bt_depths",
+            "vb_depths": "vb_depths",
+            "ds_depths": "ds_depths",
+        }
+        self.initial_settings["depthReference"] = nav_dict[
+            self.initial_settings["depthReference"]
+        ]
+
+        self.ext_temp_chk = {
+            "user": meas_struct.extTempChk.user,
+            "units": meas_struct.extTempChk.units,
+            "adcp": meas_struct.extTempChk.adcp,
+        }
+
+        if hasattr(meas_struct.extTempChk, "user_orig"):
+            self.ext_temp_chk["user_orig"] = meas_struct.extTempChk.user_orig
+        else:
+            self.ext_temp_chk["user_orig"] = meas_struct.extTempChk.user
+
+        if hasattr(meas_struct.extTempChk, "adcp_orig"):
+            self.ext_temp_chk["adcp_orig"] = meas_struct.extTempChk.adcp_orig
+        else:
+            self.ext_temp_chk["adcp_orig"] = meas_struct.extTempChk.adcp
+
+        if type(self.ext_temp_chk["user"]) is str:
+            self.ext_temp_chk["user"] = np.nan
+        if type(self.ext_temp_chk["adcp"]) is str:
+            self.ext_temp_chk["adcp"] = np.nan
+        if type(self.ext_temp_chk["user"]) is np.ndarray:
+            self.ext_temp_chk["user"] = np.nan
+        if type(self.ext_temp_chk["adcp"]) is np.ndarray:
+            self.ext_temp_chk["adcp"] = np.nan
+        if type(self.ext_temp_chk["user_orig"]) is str:
+            self.ext_temp_chk["user_orig"] = np.nan
+        if type(self.ext_temp_chk["adcp_orig"]) is str:
+            self.ext_temp_chk["adcp_orig"] = np.nan
+        if type(self.ext_temp_chk["user_orig"]) is np.ndarray:
+            self.ext_temp_chk["user_orig"] = np.nan
+        if type(self.ext_temp_chk["adcp_orig"]) is np.ndarray:
+            self.ext_temp_chk["adcp_orig"] = np.nan
+
+        self.system_tst = PreMeasurement.sys_test_qrev_mat_in(meas_struct)
+
+        # no compass cal compassCal is mat_struct with len(data) = 0
+        try:
+            self.compass_cal = PreMeasurement.cc_qrev_mat_in(meas_struct)
+        except AttributeError:
+            self.compass_cal = []
+
+        try:
+            self.compass_eval = PreMeasurement.ce_qrev_mat_in(meas_struct)
+        except AttributeError:
+            self.compass_eval = []
+
+        self.transects = TransectData.qrev_mat_in(meas_struct)
+        self.mb_tests = MovingBedTests.qrev_mat_in(meas_struct)
+        self.extrap_fit = ComputeExtrap()
+        self.extrap_fit.populate_from_qrev_mat(meas_struct)
+
+        self.discharge = QComp.qrev_mat_in(meas_struct)
+
+        # For compatibility with older QRev.mat files that didn't have this
+        # feature
+        for n in range(len(self.transects)):
+            if len(self.discharge[n].left_idx) == 0:
+                self.discharge[n].left_idx = self.discharge[n].edge_ensembles(
+                    edge_loc="left", transect=self.transects[n]
+                )
+
+            if len(self.discharge[n].right_idx) == 0:
+                self.discharge[n].right_idx = self.discharge[n].edge_ensembles(
+                    edge_loc="right", transect=self.transects[n]
+                )
+
+            if type(self.discharge[n].correction_factor) is list:
+                self.discharge[n].correction_factor = (
+                        self.discharge[n].total / self.discharge[n].total_uncorrected
+                )
+            self.discharge[n].compute_topbot_speed(self.transects[n])
+            self.discharge[n].compute_edge_speed(self.transects[n])
+
+        # Identify checked transects
+        self.checked_transect_idx = self.checked_transects(self)
+
+        if hasattr(meas_struct, "observed_no_moving_bed"):
+            self.observed_no_moving_bed = meas_struct.observed_no_moving_bed
+        else:
+            self.observed_no_moving_bed = False
+
+        self.uncertainty = Uncertainty()
+        self.uncertainty.populate_from_qrev_mat(meas_struct)
+        self.qa = QAData(self, mat_struct=meas_struct, compute=False)
+        if hasattr(meas_struct, "run_oursin"):
+            self.run_oursin = meas_struct.run_oursin
+        else:
+            self.run_oursin = False
+        if hasattr(meas_struct, "oursin"):
+            self.oursin = Oursin()
+            self.oursin.populate_from_qrev_mat(meas_struct=meas_struct)
+        else:
+            self.oursin = None
+
+        self.use_weighted = self.extrap_fit.use_weighted
+        self.use_measurement_thresholds = self.transects[
+            self.checked_transect_idx[0]
+        ].boat_vel.bt_vel.use_measurement_thresholds
+
+        if self.run_map:
+            self.compute_map()
+
+    def create_filter_composites(self):
+        """Create composite for water and bottom track difference and
+        vertical velocities and compute the thresholds using these composites.
+        """
+
+        # Initialize dictionaries
+        wt_d = {}
+        wt_w = {}
+        bt_d = {}
+        bt_w = {}
+
+        # Create composite arrays for all checked transects
+        for transect in self.transects:
+            if transect.checked:
+                if transect.adcp.model == "RS5":
+                    bt_pt = transect.boat_vel.bt_vel.ping_type
+                    pt = np.unique(bt_pt)
+                    for p in pt:
+                        if p in bt_d:
+                            bt_d[p] = np.hstack(
+                                (bt_d[p], transect.boat_vel.bt_vel.d_mps[bt_pt == p])
+                            )
+                            bt_w[p] = np.hstack(
+                                (bt_w[p], transect.boat_vel.bt_vel.w_mps[bt_pt == p])
+                            )
+                        else:
+                            bt_d[p] = transect.boat_vel.bt_vel.d_mps[bt_pt == p]
+                            bt_w[p] = transect.boat_vel.bt_vel.w_mps[bt_pt == p]
+                else:
+                    bt_freq = transect.boat_vel.bt_vel.frequency_khz.astype(int).astype(
+                        str
+                    )
+                    freq = np.unique(bt_freq)
+                    for f in freq:
+                        if f in bt_d:
+                            bt_d[f] = np.hstack(
+                                (bt_d[f], transect.boat_vel.bt_vel.d_mps[bt_freq == f])
+                            )
+                            bt_w[f] = np.hstack(
+                                (bt_w[f], transect.boat_vel.bt_vel.w_mps[bt_freq == f])
+                            )
+                        else:
+                            bt_d[f] = transect.boat_vel.bt_vel.d_mps[bt_freq == f]
+                            bt_w[f] = transect.boat_vel.bt_vel.w_mps[bt_freq == f]
+
+                if transect.w_vel.ping_type.size > 0:
+                    # Identify the ping types used in the transect
+                    p_types = np.unique(transect.w_vel.ping_type)
+                    # Composite for each ping type
+                    for p_type in p_types:
+                        if p_type in wt_d:
+                            wt_d[p_type] = np.hstack(
+                                (
+                                    wt_d[p_type],
+                                    transect.w_vel.d_mps[
+                                        np.logical_and(
+                                            transect.w_vel.ping_type == p_type,
+                                            transect.w_vel.cells_above_sl,
+                                        )
+                                    ],
+                                )
+                            )
+                            wt_w[p_type] = np.hstack(
+                                (
+                                    wt_d[p_type],
+                                    transect.w_vel.w_mps[
+                                        np.logical_and(
+                                            transect.w_vel.ping_type == p_type,
+                                            transect.w_vel.cells_above_sl,
+                                        )
+                                    ],
+                                )
+                            )
+                        else:
+                            wt_d[p_type] = transect.w_vel.d_mps[
+                                np.logical_and(
+                                    transect.w_vel.ping_type == p_type,
+                                    transect.w_vel.cells_above_sl,
+                                )
+                            ]
+                            wt_w[p_type] = transect.w_vel.w_mps[
+                                np.logical_and(
+                                    transect.w_vel.ping_type == p_type,
+                                    transect.w_vel.cells_above_sl,
+                                )
+                            ]
+                else:
+                    p_types = np.array(["U"])
+                    for p_type in p_types:
+                        if p_type in wt_d:
+                            wt_d[p_type] = np.hstack(
+                                (
+                                    wt_d[p_type],
+                                    transect.w_vel.d_mps[transect.w_vel.cells_above_sl],
+                                )
+                            )
+                            wt_w[p_type] = np.hstack(
+                                (
+                                    wt_d[p_type],
+                                    transect.w_vel.w_mps[transect.w_vel.cells_above_sl],
+                                )
+                            )
+                        else:
+                            wt_d[p_type] = transect.w_vel.d_mps[
+                                transect.w_vel.cells_above_sl
+                            ]
+                            wt_w[p_type] = transect.w_vel.w_mps[
+                                transect.w_vel.cells_above_sl
+                            ]
+
+        # Compute thresholds based on composite arrays
+
+        # Water track
+        wt_d_meas_thresholds = {}
+        wt_w_meas_thresholds = {}
+        for p_type in wt_d.keys():
+            wt_d_meas_thresholds[p_type] = WaterData.meas_iqr_filter(
+                wt_d[p_type], multiplier=5
+            )
+            wt_w_meas_thresholds[p_type] = WaterData.meas_iqr_filter(
+                wt_w[p_type], multiplier=5
+            )
+
+        # Bottom track
+        bt_d_meas_thresholds = {}
+        bt_w_meas_thresholds = {}
+        for freq in bt_d.keys():
+            bt_d_meas_thresholds[freq] = BoatData.iqr_filter(bt_d[freq])
+            bt_w_meas_thresholds[freq] = BoatData.iqr_filter(bt_w[freq])
+
+        # Assign threshold to each transect
+        for transect in self.transects:
+            transect.w_vel.d_meas_thresholds = wt_d_meas_thresholds
+            transect.w_vel.w_meas_thresholds = wt_w_meas_thresholds
+            transect.boat_vel.bt_vel.d_meas_thresholds = bt_d_meas_thresholds
+            transect.boat_vel.bt_vel.w_meas_thresholds = bt_w_meas_thresholds
+
+        if len(self.mb_tests) > 0:
+            for test in self.mb_tests:
+                transect = test.transect
+                transect.w_vel.d_meas_thresholds = wt_d_meas_thresholds
+                transect.w_vel.w_meas_thresholds = wt_w_meas_thresholds
+                transect.boat_vel.bt_vel.d_meas_thresholds = bt_d_meas_thresholds
+                transect.boat_vel.bt_vel.w_meas_thresholds = bt_w_meas_thresholds
+
+    @staticmethod
+    def set_num_beam_wt_threshold_trdi(mmt_transect):
+        """Get number of beams to use in processing for WT from mmt file
+
+        Parameters
+        ----------
+        mmt_transect: MMT_Transect
+            Object of MMT_Transect
+
+        Returns
+        -------
+        num_3_beam_wt_Out: int
+        """
+
+        use_3_beam_wt = mmt_transect.active_config["Proc_Use_3_Beam_WT"]
+        if use_3_beam_wt == 0:
+            num_beam_wt_out = 4
+        else:
+            num_beam_wt_out = 3
+
+        return num_beam_wt_out
+
+    @staticmethod
+    def set_num_beam_bt_threshold_trdi(mmt_transect):
+        """Get number of beams to use in processing for BT from mmt file
+
+        Parameters
+        ----------
+        mmt_transect: MMT_Transect
+            Object of MMT_Transect
+
+        Returns
+        -------
+        num_3_beam_WT_Out: int
+        """
+
+        use_3_beam_bt = mmt_transect.active_config["Proc_Use_3_Beam_BT"]
+        if use_3_beam_bt == 0:
+            num_beam_bt_out = 4
+        else:
+            num_beam_bt_out = 3
+
+        return num_beam_bt_out
+
+    @staticmethod
+    def set_depth_weighting_trdi(mmt_transect):
+        """Get the average depth method from mmt
+
+        Parameters
+        ----------
+        mmt_transect: MMT_Transect
+            Object of MMT_Transect
+
+        Returns
+        -------
+        depth_weighting_setting: str
+            Method to compute mean depth
+        """
+
+        depth_weighting = mmt_transect.active_config["Proc_Use_Weighted_Mean_Depth"]
+
+        if depth_weighting == 0:
+            depth_weighting_setting = "Simple"
+        else:
+            depth_weighting_setting = "IDW"
+
+        return depth_weighting_setting
+
+    @staticmethod
+    def set_depth_screening_trdi(mmt_transect):
+        """Get the depth screening setting from mmt
+
+        Parameters
+        ----------
+        mmt_transect: MMT_Transect
+            Object of MMT_Transect
+
+        Returns
+        -------
+        depth_screening_setting: str
+            Type of depth screening to use
+        """
+
+        depth_screen = mmt_transect.active_config["Proc_Screen_Depth"]
+        if depth_screen == 0:
+            depth_screening_setting = "None"
+        else:
+            depth_screening_setting = "TRDI"
+
+        return depth_screening_setting
+
+    def change_sos(
+            self,
+            transect_idx=None,
+            parameter=None,
+            salinity=None,
+            temperature=None,
+            selected=None,
+            speed=None,
+    ):
+        """Applies a change in speed of sound to one or all transects
+        and update the discharge and uncertainty computations
+
+        Parameters
+        ----------
+        transect_idx: int
+            Index of transect to change
+        parameter: str
+            Speed of sound parameter to be changed ('temperatureSrc',
+            'temperature', 'salinity', 'sosSrc')
+        salinity: float
+            Salinity in ppt
+        temperature: float
+            Temperature in deg C
+        selected: str
+            Selected speed of sound ('internal', 'computed', 'user') or
+            temperature ('internal', 'user')
+        speed: float
+            Manually supplied speed of sound for 'user' source
+        """
+
+        s = self.current_settings()
+        if transect_idx is None:
+            # Apply to all transects
+            for transect in self.transects:
+                transect.change_sos(
+                    parameter=parameter,
+                    salinity=salinity,
+                    temperature=temperature,
+                    selected=selected,
+                    speed=speed,
+                )
+        else:
+            # Apply to a single transect
+            self.transects[transect_idx].change_sos(
+                parameter=parameter,
+                salinity=salinity,
+                temperature=temperature,
+                selected=selected,
+                speed=speed,
+            )
+        # Reapply settings to newly adjusted data
+        self.apply_settings(s)
+
+    def change_magvar(self, magvar, transect_idx=None):
+        """Coordinates changing the magnetic variation.
+
+        Parameters
+        ----------
+        magvar: float
+            Magnetic variation
+        transect_idx: int
+            Index of transect to which the change is applied. None is all
+            transects.
+        """
+
+        # Get current settings
+        s = self.current_settings()
+
+        # Initialize variables
+        n_transects = len(self.transects)
+        recompute = False
+        n = 0
+
+        # If the internal compass is used the recompute is necessary
+        while n < n_transects and recompute is False:
+            if self.transects[n].sensors.heading_deg.selected == "internal":
+                recompute = True
+            n += 1
+
+        # Apply change
+        if transect_idx is None:
+            # Apply change to all transects
+            for transect in self.transects:
+                transect.change_mag_var(magvar)
+
+            # Apply change to moving-bed tests
+            if len(self.mb_tests) > 0:
+                for test in self.mb_tests:
+                    old_magvar = test.transect.sensors.heading_deg.internal.mag_var_deg
+                    test.transect.change_mag_var(magvar)
+                    test.magvar_change(magvar, old_magvar)
+        else:
+            self.transects[transect_idx].change_mag_var(magvar)
+
+        # Recompute is specified
+        if recompute:
+            self.apply_settings(s)
+        else:
+            self.qa.compass_qa(self)
+            self.qa.check_compass_settings(self)
+
+    def change_h_offset(self, h_offset, transect_idx=None):
+        """Coordinates changing the heading offset for external heading.
+
+        Parameters
+        ----------
+        h_offset: float
+            Heading offset
+        transect_idx: int
+            Index of transect to which the change is applied. None is all
+            transects.
+        """
+
+        # Get current settings
+        s = self.current_settings()
+
+        # Initialize variables
+        n_transects = len(self.transects)
+        recompute = False
+        n = 0
+
+        # If external compass is used then a recompute is necessary
+        while n < n_transects and recompute is False:
+            if self.transects[n].sensors.heading_deg.selected == "external":
+                recompute = True
+            n += 1
+
+        # Apply change
+        if transect_idx is None:
+            for transect in self.transects:
+                transect.change_offset(h_offset)
+
+            # Apply change to moving-bed tests
+            if len(self.mb_tests) > 0:
+                for test in self.mb_tests:
+                    old_h_offset = (
+                        test.transect.sensors.heading_deg.external.align_correction_deg
+                    )
+                    test.transect.change_offset(h_offset)
+                    test.h_offset_change(h_offset, old_h_offset)
+        else:
+            self.transects[transect_idx].change_offset(h_offset)
+
+        # Rcompute is specified
+        if recompute:
+            self.apply_settings(s)
+        else:
+            self.qa.compass_qa(self)
+            self.qa.check_compass_settings(self)
+
+    def change_h_source(self, h_source, transect_idx=None):
+        """Coordinates changing the heading source.
+
+        Parameters
+        ----------
+        h_source: str
+            Heading source (internal or external)
+        transect_idx: int
+            Index of transect to which the change is applied. None is all
+            transects.
+        """
+
+        # Get current settings
+        s = self.current_settings()
+
+        # Apply change
+        if transect_idx is None:
+            for transect in self.transects:
+                transect.change_heading_source(h_source)
+
+            # Apply change to moving-bed tests
+            if len(self.mb_tests) > 0:
+                for test in self.mb_tests:
+                    test.transect.change_heading_source(h_source)
+                    test.process_mb_test(source=test.transect.adcp.manufacturer)
+                settings = self.current_settings()
+                select = settings["NavRef"]
+                ref = None
+                if select == "bt_vel":
+                    ref = "BT"
+                elif select == "gga_vel":
+                    ref = "GGA"
+                elif select == "vtg_vel":
+                    ref = "VTG"
+                self.mb_tests = MovingBedTests.auto_use_2_correct(
+                    moving_bed_tests=self.mb_tests, boat_ref=ref
+                )
+
+        else:
+            self.transects[transect_idx].change_heading_source(h_source)
+
+        self.apply_settings(s)
+
+    def change_draft(self, draft, transect_idx=None):
+        """Coordinates changing the ADCP draft.
+
+        Parameters
+        ----------
+        draft: float
+            Draft of ADCP in m
+        transect_idx: int
+            Index of transect to which the change is applied. None is all
+            transects.
+        """
+
+        # Get current settings
+        s = self.current_settings()
+
+        # Apply change
+        if transect_idx is None:
+            for transect in self.transects:
+                transect.change_draft(draft)
+        else:
+            self.transects[transect_idx].change_draft(draft)
+
+        self.apply_settings(s)
+
+    @staticmethod
+    def h_external_valid(meas):
+        """Determine if valid external heading data is included in the
+        measurement.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of Measurement
+        """
+
+        external = False
+        for transect in meas.transects:
+            if transect.sensors.heading_deg.external is not None:
+                external = True
+                break
+        return external
+
+    def apply_settings(self, settings, force_abba=True):
+        """Applies reference, filter, and interpolation settings.
+
+        Parameters
+        ----------
+        settings: dict
+            Dictionary of reference, filter, and interpolation settings
+        force_abba: bool
+            Allows the above, below, before, after interpolation to be
+            applied even when the data use another approach.
+        """
+
+        self.use_ping_type = settings["UsePingType"]
+
+        # If SonTek data does not have ping type identified, determine ping
+        # types
+        if (
+                self.transects[0].w_vel.ping_type.size == 1
+                and self.transects[0].adcp.manufacturer == "SonTek"
+        ):
+            for transect in self.transects:
+                ping_type = TransectData.sontek_ping_type(
+                    transect.w_vel.corr, transect.w_vel.frequency
+                )
+                transect.w_vel.ping_type = np.tile(
+                    np.array([ping_type]), (transect.w_vel.corr.shape[1], 1)
+                )
+
+        # If the measurement thresholds have not been computed, compute them
+        if not self.transects[0].w_vel.d_meas_thresholds:
+            self.create_filter_composites()
+
+        # Apply settings to moving-bed tests:
+        if len(self.mb_tests) > 0:
+            self.apply_settings_to_movingbed(settings, force_abba=True)
+
+        # Apply settings to discharge transects
+        for transect in self.transects:
+
+            if not settings["UsePingType"]:
+                transect.w_vel.ping_type = np.tile("U", transect.w_vel.ping_type.shape)
+                transect.boat_vel.bt_vel.frequency_khz = np.tile(
+                    0, transect.boat_vel.bt_vel.frequency_khz.shape
+                )
+
+            # Moving-boat ensembles
+            if "Processing" in settings.keys():
+                transect.change_q_ensembles(proc_method=settings["Processing"])
+                self.processing = settings["Processing"]
+
+            # Navigation reference
+            if transect.boat_vel.selected != settings["NavRef"]:
+                transect.change_nav_reference(
+                    update=False, new_nav_ref=settings["NavRef"]
+                )
+                if len(self.mb_tests) > 0:
+                    self.mb_tests = MovingBedTests.auto_use_2_correct(
+                        moving_bed_tests=self.mb_tests, boat_ref=settings["NavRef"]
+                    )
+
+            # Changing the nav reference applies the current setting for
+            # Composite tracks, check to see if a change is needed
+            if transect.boat_vel.composite != settings["CompTracks"]:
+                transect.composite_tracks(update=False, setting=settings["CompTracks"])
+
+            # Set difference velocity BT filter
+            bt_kwargs = {}
+            if settings["BTdFilter"] == "Manual":
+                bt_kwargs["difference"] = settings["BTdFilter"]
+                bt_kwargs["difference_threshold"] = settings["BTdFilterThreshold"]
+            else:
+                bt_kwargs["difference"] = settings["BTdFilter"]
+
+            # Set vertical velocity BT filter
+            if settings["BTwFilter"] == "Manual":
+                bt_kwargs["vertical"] = settings["BTwFilter"]
+                bt_kwargs["vertical_threshold"] = settings["BTwFilterThreshold"]
+            else:
+                bt_kwargs["vertical"] = settings["BTwFilter"]
+
+                # Apply beam filter
+                bt_kwargs["beam"] = settings["BTbeamFilter"]
+
+                # Apply smooth filter
+                bt_kwargs["other"] = settings["BTsmoothFilter"]
+
+            transect.boat_vel.bt_vel.use_measurement_thresholds = settings[
+                "UseMeasurementThresholds"
+            ]
+
+            # Apply BT settings
+            transect.boat_filters(update=False, **bt_kwargs)
+
+            # BT Interpolation
+            transect.boat_interpolations(
+                update=False, target="BT", method=settings["BTInterpolation"]
+            )
+
+            # GPS filter settings
+            if transect.gps is not None:
+                gga_kwargs = {}
+                if transect.boat_vel.gga_vel is not None:
+                    # GGA
+                    gga_kwargs["differential"] = settings["ggaDiffQualFilter"]
+                    if settings["ggaAltitudeFilter"] == "Manual":
+                        gga_kwargs["altitude"] = settings["ggaAltitudeFilter"]
+                        gga_kwargs["altitude_threshold"] = settings[
+                            "ggaAltitudeFilterChange"
+                        ]
+                    else:
+                        gga_kwargs["altitude"] = settings["ggaAltitudeFilter"]
+
+                    # Set GGA HDOP Filter
+                    if settings["GPSHDOPFilter"] == "Manual":
+                        gga_kwargs["hdop"] = settings["GPSHDOPFilter"]
+                        gga_kwargs["hdop_max_threshold"] = settings["GPSHDOPFilterMax"]
+                        gga_kwargs["hdop_change_threshold"] = settings[
+                            "GPSHDOPFilterChange"
+                        ]
+                    else:
+                        gga_kwargs["hdop"] = settings["GPSHDOPFilter"]
+
+                    gga_kwargs["other"] = settings["GPSSmoothFilter"]
+                    # Apply GGA filters
+                    transect.gps_filters(update=False, **gga_kwargs)
+
+                if transect.boat_vel.vtg_vel is not None:
+                    vtg_kwargs = {}
+                    if settings["GPSHDOPFilter"] == "Manual":
+                        vtg_kwargs["hdop"] = settings["GPSHDOPFilter"]
+                        vtg_kwargs["hdop_max_threshold"] = settings["GPSHDOPFilterMax"]
+                        vtg_kwargs["hdop_change_threshold"] = settings[
+                            "GPSHDOPFilterChange"
+                        ]
+                        vtg_kwargs["other"] = settings["GPSSmoothFilter"]
+                    else:
+                        vtg_kwargs["hdop"] = settings["GPSHDOPFilter"]
+                        vtg_kwargs["other"] = settings["GPSSmoothFilter"]
+
+                    # Apply VTG filters
+                    transect.gps_filters(update=False, **vtg_kwargs)
+
+                transect.boat_interpolations(
+                    update=False, target="GPS", method=settings["GPSInterpolation"]
+                )
+
+            # Set depth reference
+            transect.set_depth_reference(
+                update=False, setting=settings["depthReference"]
+            )
+
+            transect.process_depths(
+                update=True,
+                filter_method=settings["depthFilterType"],
+                interpolation_method=settings["depthInterpolation"],
+                composite_setting=settings["depthComposite"],
+                avg_method=settings["depthAvgMethod"],
+                valid_method=settings["depthValidMethod"],
+            )
+
+            # Set WT difference velocity filter
+            wt_kwargs = {}
+            if settings["WTdFilter"] == "Manual":
+                wt_kwargs["difference"] = settings["WTdFilter"]
+                wt_kwargs["difference_threshold"] = settings["WTdFilterThreshold"]
+            else:
+                wt_kwargs["difference"] = settings["WTdFilter"]
+
+            # Set WT vertical velocity filter
+            if settings["WTwFilter"] == "Manual":
+                wt_kwargs["vertical"] = settings["WTwFilter"]
+                wt_kwargs["vertical_threshold"] = settings["WTwFilterThreshold"]
+            else:
+                wt_kwargs["vertical"] = settings["WTwFilter"]
+
+            wt_kwargs["beam"] = settings["WTbeamFilter"]
+            wt_kwargs["other"] = settings["WTsmoothFilter"]
+            wt_kwargs["snr"] = settings["WTsnrFilter"]
+            wt_kwargs["wt_depth"] = settings["WTwtDepthFilter"]
+            wt_kwargs["excluded"] = settings["WTExcludedDistance"]
+
+            # Data loaded from old QRev.mat files will be set to use this
+            # new interpolation method. When reprocessing
+            # any data the interpolation method should be 'abba'
+            if force_abba:
+                transect.w_vel.interpolate_cells = "abba"
+                transect.w_vel.interpolate_ens = "abba"
+                settings["WTEnsInterpolation"] = "abba"
+                settings["WTCellInterpolation"] = "abba"
+
+            transect.w_vel.use_measurement_thresholds = settings[
+                "UseMeasurementThresholds"
+            ]
+            if (
+                    transect.w_vel.ping_type.size == 0
+                    and transect.adcp.manufacturer == "SonTek"
+            ):
+                # Correlation and frequency can be used to determine ping type
+                transect.w_vel.ping_type = TransectData.sontek_ping_type(
+                    corr=transect.w_vel.corr, freq=transect.w_vel.frequency
+                )
+
+            transect.w_vel.apply_filter(transect=transect, **wt_kwargs)
+
+            # Edge methods
+            transect.edges.rec_edge_method = settings["edgeRecEdgeMethod"]
+            transect.edges.vel_method = settings["edgeVelMethod"]
+
+        if settings["UseWeighted"] and not self.use_weighted:
+            if self.extrap_fit.norm_data[-1].weights is None:
+                # Compute normalized data for each transect to obtain the
+                # weights
+                self.extrap_fit.process_profiles(
+                    self.transects,
+                    self.extrap_fit.norm_data[-1].data_type,
+                    use_weighted=settings["UseWeighted"],
+                )
+
+        self.use_weighted = settings["UseWeighted"]
+
+        if len(self.checked_transect_idx) > 0:
+            ref_transect = self.checked_transect_idx[0]
+        else:
+            ref_transect = 0
+
+        if self.transects[ref_transect].w_vel.interpolate_cells == "TRDI":
+            if self.extrap_fit is None:
+                self.extrap_fit = ComputeExtrap()
+                self.extrap_fit.populate_data(
+                    transects=self.transects,
+                    compute_sensitivity=False,
+                    use_weighted=settings["UseWeighted"],
+                )
+                self.change_extrapolation(
+                    self.extrap_fit.fit_method,
+                    compute_q=False,
+                    use_weighted=settings["UseWeighted"],
+                )
+            elif self.extrap_fit.fit_method == "Automatic":
+                self.change_extrapolation(
+                    self.extrap_fit.fit_method,
+                    compute_q=False,
+                    use_weighted=settings["UseWeighted"],
+                )
+            else:
+                if "extrapTop" not in settings.keys():
+                    settings["extrapTop"] = self.extrap_fit.sel_fit[-1].top_method
+                    settings["extrapBot"] = self.extrap_fit.sel_fit[-1].bot_method
+                    settings["extrapExp"] = self.extrap_fit.sel_fit[-1].exponent
+
+            self.change_extrapolation(
+                self.extrap_fit.fit_method,
+                top=settings["extrapTop"],
+                bot=settings["extrapBot"],
+                exp=settings["extrapExp"],
+                compute_q=False,
+                use_weighted=settings["UseWeighted"],
+            )
+
+        for transect in self.transects:
+            # Water track interpolations
+            transect.w_vel.apply_interpolation(
+                transect=transect,
+                ens_interp=settings["WTEnsInterpolation"],
+                cells_interp=settings["WTCellInterpolation"],
+            )
+
+        if self.extrap_fit is None:
+            self.extrap_fit = ComputeExtrap()
+            self.extrap_fit.populate_data(
+                transects=self.transects,
+                compute_sensitivity=False,
+                use_weighted=settings["UseWeighted"],
+            )
+            self.change_extrapolation(
+                self.extrap_fit.fit_method,
+                compute_q=False,
+                use_weighted=settings["UseWeighted"],
+            )
+        elif self.extrap_fit.fit_method == "Automatic":
+            self.change_extrapolation(
+                self.extrap_fit.fit_method,
+                compute_q=False,
+                use_weighted=settings["UseWeighted"],
+            )
+        else:
+            if "extrapTop" not in settings.keys():
+                settings["extrapTop"] = self.extrap_fit.sel_fit[-1].top_method
+                settings["extrapBot"] = self.extrap_fit.sel_fit[-1].bot_method
+                settings["extrapExp"] = self.extrap_fit.sel_fit[-1].exponent
+
+        self.change_extrapolation(
+            self.extrap_fit.fit_method,
+            top=settings["extrapTop"],
+            bot=settings["extrapBot"],
+            exp=settings["extrapExp"],
+            compute_q=False,
+            use_weighted=settings["UseWeighted"],
+        )
+
+        self.extrap_fit.q_sensitivity = ExtrapQSensitivity()
+        self.extrap_fit.q_sensitivity.populate_data(
+            transects=self.transects, extrap_fits=self.extrap_fit.sel_fit
+        )
+
+        self.compute_discharge()
+
+        self.compute_uncertainty()
+        if self.run_map:
+            self.compute_map()
+
+    def apply_settings_to_movingbed(self, settings, force_abba=True):
+        """Applies reference, filter, and interpolation settings.
+
+        Parameters
+        ----------
+        settings: dict
+            Dictionary of reference, filter, and interpolation settings
+        force_abba: bool
+            Allows the above, below, before, after interpolation to be applied
+            even when the data use another approach.
+        """
+
+        self.use_ping_type = settings["UsePingType"]
+        # If SonTek data does not have ping type identified, determine ping
+        # types
+        if (
+                self.mb_tests[0].transect.w_vel.ping_type.size == 1
+                and self.transects[0].adcp.manufacturer == "SonTek"
+        ):
+            for test in self.mb_tests:
+                transect = test.transect
+                ping_type = TransectData.sontek_ping_type(
+                    transect.w_vel.corr, transect.w_vel.frequency
+                )
+                transect.w_vel.ping_type = np.tile(
+                    np.array([ping_type]), (transect.w_vel.corr.shape[1], 1)
+                )
+
+        for test in self.mb_tests:
+            transect = test.transect
+
+            if not settings["UsePingType"]:
+                transect.w_vel.ping_type = np.tile("U", transect.w_vel.ping_type.shape)
+                transect.boat_vel.bt_vel.frequency_khz = np.tile(
+                    0, transect.boat_vel.bt_vel.frequency_khz.shape
+                )
+
+            # Moving-boat ensembles
+            if "Processing" in settings.keys():
+                transect.change_q_ensembles(proc_method=settings["Processing"])
+                self.processing = settings["Processing"]
+
+            # Set difference velocity BT filter
+            bt_kwargs = {}
+            if settings["BTdFilter"] == "Manual":
+                bt_kwargs["difference"] = settings["BTdFilter"]
+                bt_kwargs["difference_threshold"] = settings["BTdFilterThreshold"]
+            else:
+                bt_kwargs["difference"] = settings["BTdFilter"]
+
+            # Set vertical velocity BT filter
+            if settings["BTwFilter"] == "Manual":
+                bt_kwargs["vertical"] = settings["BTwFilter"]
+                bt_kwargs["vertical_threshold"] = settings["BTwFilterThreshold"]
+            else:
+                bt_kwargs["vertical"] = settings["BTwFilter"]
+
+                # Apply beam filter
+                bt_kwargs["beam"] = settings["BTbeamFilter"]
+
+                # Apply smooth filter
+                bt_kwargs["other"] = settings["BTsmoothFilter"]
+
+            transect.boat_vel.bt_vel.use_measurement_thresholds = settings[
+                "UseMeasurementThresholds"
+            ]
+
+            # Apply BT settings
+            transect.boat_filters(update=False, **bt_kwargs)
+
+            # Don't interpolate for stationary tests
+            if test.type == "Loop":
+                # BT Interpolation
+                transect.boat_interpolations(
+                    update=False, target="BT", method=settings["BTInterpolation"]
+                )
+
+            # GPS filter settings
+            if transect.gps is not None:
+                gga_kwargs = {}
+                if transect.boat_vel.gga_vel is not None:
+                    # GGA
+                    gga_kwargs["differential"] = settings["ggaDiffQualFilter"]
+                    if settings["ggaAltitudeFilter"] == "Manual":
+                        gga_kwargs["altitude"] = settings["ggaAltitudeFilter"]
+                        gga_kwargs["altitude_threshold"] = settings[
+                            "ggaAltitudeFilterChange"
+                        ]
+                    else:
+                        gga_kwargs["altitude"] = settings["ggaAltitudeFilter"]
+
+                    # Set GGA HDOP Filter
+                    if settings["GPSHDOPFilter"] == "Manual":
+                        gga_kwargs["hdop"] = settings["GPSHDOPFilter"]
+                        gga_kwargs["hdop_max_threshold"] = settings["GPSHDOPFilterMax"]
+                        gga_kwargs["hdop_change_threshold"] = settings[
+                            "GPSHDOPFilterChange"
+                        ]
+                    else:
+                        gga_kwargs["hdop"] = settings["GPSHDOPFilter"]
+
+                    gga_kwargs["other"] = settings["GPSSmoothFilter"]
+                    # Apply GGA filters
+                    transect.gps_filters(update=False, **gga_kwargs)
+
+                if transect.boat_vel.vtg_vel is not None:
+                    vtg_kwargs = {}
+                    if settings["GPSHDOPFilter"] == "Manual":
+                        vtg_kwargs["hdop"] = settings["GPSHDOPFilter"]
+                        vtg_kwargs["hdop_max_threshold"] = settings["GPSHDOPFilterMax"]
+                        vtg_kwargs["hdop_change_threshold"] = settings[
+                            "GPSHDOPFilterChange"
+                        ]
+                        vtg_kwargs["other"] = settings["GPSSmoothFilter"]
+                    else:
+                        vtg_kwargs["hdop"] = settings["GPSHDOPFilter"]
+                        vtg_kwargs["other"] = settings["GPSSmoothFilter"]
+
+                    # Apply VTG filters
+                    transect.gps_filters(update=False, **vtg_kwargs)
+
+                # Don't interpolate for stationary tests
+                if test.type == "Loop":
+                    transect.boat_interpolations(
+                        update=False, target="GPS", method=settings["GPSInterpolation"]
+                    )
+
+            # Set depth reference
+            transect.set_depth_reference(
+                update=False, setting=settings["depthReference"]
+            )
+            transect.process_depths(
+                update=False,
+                filter_method=settings["depthFilterType"],
+                interpolation_method=settings["depthInterpolation"],
+                composite_setting=settings["depthComposite"],
+                avg_method=settings["depthAvgMethod"],
+                valid_method=settings["depthValidMethod"],
+            )
+
+            # Set WT difference velocity filter
+            wt_kwargs = {}
+            if settings["WTdFilter"] == "Manual":
+                wt_kwargs["difference"] = settings["WTdFilter"]
+                wt_kwargs["difference_threshold"] = settings["WTdFilterThreshold"]
+            else:
+                wt_kwargs["difference"] = settings["WTdFilter"]
+
+            # Set WT vertical velocity filter
+            if settings["WTwFilter"] == "Manual":
+                wt_kwargs["vertical"] = settings["WTwFilter"]
+                wt_kwargs["vertical_threshold"] = settings["WTwFilterThreshold"]
+            else:
+                wt_kwargs["vertical"] = settings["WTwFilter"]
+
+            wt_kwargs["beam"] = settings["WTbeamFilter"]
+            wt_kwargs["other"] = settings["WTsmoothFilter"]
+            wt_kwargs["snr"] = settings["WTsnrFilter"]
+            wt_kwargs["wt_depth"] = settings["WTwtDepthFilter"]
+            wt_kwargs["excluded"] = settings["WTExcludedDistance"]
+
+            # Data loaded from old QRev.mat files will be set to use this new
+            # interpolation method. When reprocessing any data the interpolation method
+            # should be 'abba'
+            if force_abba:
+                transect.w_vel.interpolate_cells = "abba"
+                transect.w_vel.interpolate_ens = "abba"
+                settings["WTEnsInterpolation"] = "abba"
+                settings["WTCellInterpolation"] = "abba"
+
+            transect.w_vel.use_measurement_thresholds = settings[
+                "UseMeasurementThresholds"
+            ]
+            if (
+                    transect.w_vel.ping_type.size == 0
+                    and transect.adcp.manufacturer == "SonTek"
+            ):
+                # Correlation and frequency can be used to determine ping type
+                transect.w_vel.ping_type = TransectData.sontek_ping_type(
+                    corr=transect.w_vel.corr, freq=transect.w_vel.frequency
+                )
+
+            transect.w_vel.apply_filter(transect=transect, **wt_kwargs)
+
+            transect.w_vel.apply_interpolation(
+                transect=transect,
+                ens_interp=settings["WTEnsInterpolation"],
+                cells_interp=settings["WTCellInterpolation"],
+            )
+
+            test.process_mb_test(source=self.transects[0].adcp.manufacturer)
+
+    def current_settings(self):
+        """Saves the current settings for a measurement. Since all settings
+        in QRev are consistent among all transects in a measurement only the
+        settings from the first transect are saved
+        """
+
+        settings = {}
+
+        if len(self.checked_transect_idx) > 0:
+            ref_transect = self.checked_transect_idx[0]
+        else:
+            ref_transect = 0
+        transect = self.transects[ref_transect]
+
+        # Navigation reference
+        settings["NavRef"] = transect.boat_vel.selected
+
+        # Composite tracks
+        settings["CompTracks"] = transect.boat_vel.composite
+
+        # Water track settings
+        settings["WTbeamFilter"] = transect.w_vel.beam_filter
+        settings["WTdFilter"] = transect.w_vel.d_filter
+        settings["WTdFilterThreshold"] = transect.w_vel.d_filter_thresholds
+        settings["WTwFilter"] = transect.w_vel.w_filter
+        settings["WTwFilterThreshold"] = transect.w_vel.w_filter_thresholds
+        settings["WTsmoothFilter"] = transect.w_vel.smooth_filter
+        settings["WTsnrFilter"] = transect.w_vel.snr_filter
+        settings["WTwtDepthFilter"] = transect.w_vel.wt_depth_filter
+        settings["WTEnsInterpolation"] = transect.w_vel.interpolate_ens
+        settings["WTCellInterpolation"] = transect.w_vel.interpolate_cells
+        settings["WTExcludedDistance"] = transect.w_vel.excluded_dist_m
+
+        # Bottom track settings
+        settings["BTbeamFilter"] = transect.boat_vel.bt_vel.beam_filter
+        settings["BTdFilter"] = transect.boat_vel.bt_vel.d_filter
+        settings["BTdFilterThreshold"] = transect.boat_vel.bt_vel.d_filter_thresholds
+        settings["BTwFilter"] = transect.boat_vel.bt_vel.w_filter
+        settings["BTwFilterThreshold"] = transect.boat_vel.bt_vel.w_filter_thresholds
+        settings["BTsmoothFilter"] = transect.boat_vel.bt_vel.smooth_filter
+        settings["BTInterpolation"] = transect.boat_vel.bt_vel.interpolate
+
+        # Gps Settings
+        gga_present = False
+        for idx in self.checked_transect_idx:
+            if self.transects[idx].boat_vel.gga_vel is not None:
+                gga_present = True
+                transect = self.transects[idx]
+                break
+
+        # GGA settings
+        if gga_present:
+            settings[
+                "ggaDiffQualFilter"
+            ] = transect.boat_vel.gga_vel.gps_diff_qual_filter
+            settings[
+                "ggaAltitudeFilter"
+            ] = transect.boat_vel.gga_vel.gps_altitude_filter
+            settings[
+                "ggaAltitudeFilterChange"
+            ] = transect.boat_vel.gga_vel.gps_altitude_filter_change
+            settings["GPSHDOPFilter"] = transect.boat_vel.gga_vel.gps_HDOP_filter
+            settings["GPSHDOPFilterMax"] = transect.boat_vel.gga_vel.gps_HDOP_filter_max
+            settings[
+                "GPSHDOPFilterChange"
+            ] = transect.boat_vel.gga_vel.gps_HDOP_filter_change
+            settings["GPSSmoothFilter"] = transect.boat_vel.gga_vel.smooth_filter
+            settings["GPSInterpolation"] = transect.boat_vel.gga_vel.interpolate
+        else:
+            settings["ggaDiffQualFilter"] = 1
+            settings["ggaAltitudeFilter"] = "Off"
+            settings["ggaAltitudeFilterChange"] = []
+
+            settings["ggaSmoothFilter"] = "Off"
+            if "GPSInterpolation" not in settings.keys():
+                settings["GPSInterpolation"] = "None"
+            if "GPSHDOPFilter" not in settings.keys():
+                settings["GPSHDOPFilter"] = "Off"
+                settings["GPSHDOPFilterMax"] = []
+                settings["GPSHDOPFilterChange"] = []
+            if "GPSSmoothFilter" not in settings.keys():
+                settings["GPSSmoothFilter"] = "Off"
+
+        # VTG settings
+        vtg_present = False
+        for idx in self.checked_transect_idx:
+            if self.transects[idx].boat_vel.vtg_vel is not None:
+                vtg_present = True
+                transect = self.transects[idx]
+                break
+
+        if vtg_present:
+            settings["GPSHDOPFilter"] = transect.boat_vel.vtg_vel.gps_HDOP_filter
+            settings["GPSHDOPFilterMax"] = transect.boat_vel.vtg_vel.gps_HDOP_filter_max
+            settings[
+                "GPSHDOPFilterChange"
+            ] = transect.boat_vel.vtg_vel.gps_HDOP_filter_change
+            settings["GPSSmoothFilter"] = transect.boat_vel.vtg_vel.smooth_filter
+            settings["GPSInterpolation"] = transect.boat_vel.vtg_vel.interpolate
+
+        # Depth Settings
+        settings["depthAvgMethod"] = transect.depths.bt_depths.avg_method
+        settings["depthValidMethod"] = transect.depths.bt_depths.valid_data_method
+
+        # Depth settings are always applied to all available depth sources.
+        # Only those saved in the bt_depths are used here but are applied to
+        # all sources
+        settings["depthFilterType"] = transect.depths.bt_depths.filter_type
+        settings["depthReference"] = transect.depths.selected
+        settings["depthComposite"] = transect.depths.composite
+        select = getattr(transect.depths, transect.depths.selected)
+        settings["depthInterpolation"] = select.interp_type
+
+        # Extrap Settings
+        if self.extrap_fit is None:
+            settings["extrapTop"] = transect.extrap.top_method
+            settings["extrapBot"] = transect.extrap.bot_method
+            settings["extrapExp"] = transect.extrap.exponent
+        else:
+            settings["extrapTop"] = self.extrap_fit.sel_fit[-1].top_method
+            settings["extrapBot"] = self.extrap_fit.sel_fit[-1].bot_method
+            settings["extrapExp"] = self.extrap_fit.sel_fit[-1].exponent
+
+        # Use of self.use_weighted allows a QRev mat file to be loaded and
+        # initially processed with the settings from the QRev file but upon
+        # reprocessing the self.use_weights will be set to the options setting
+        # for use_weights
+        settings["UseWeighted"] = self.use_weighted
+
+        # Edge Settings
+        settings["edgeVelMethod"] = transect.edges.vel_method
+        settings["edgeRecEdgeMethod"] = transect.edges.rec_edge_method
+
+        settings["UseMeasurementThresholds"] = transect.w_vel.use_measurement_thresholds
+        settings["UsePingType"] = self.use_ping_type
+
+        return settings
+
+    def qrev_default_settings(self, check_user_excluded_dist=False, use_weighted=False):
+        """QRev default and filter settings for a measurement."""
+
+        settings = dict()
+
+        if len(self.checked_transect_idx) > 0:
+            ref_transect = self.checked_transect_idx[0]
+        else:
+            ref_transect = 0
+
+        # Navigation reference
+        settings["NavRef"] = self.transects[ref_transect].boat_vel.selected
+
+        # Composite tracks
+        settings["CompTracks"] = "Off"
+
+        # Water track filter settings
+        settings["WTbeamFilter"] = -1
+        settings["WTdFilter"] = "Auto"
+        settings["WTdFilterThreshold"] = np.nan
+        settings["WTwFilter"] = "Auto"
+        settings["WTwFilterThreshold"] = np.nan
+        settings["WTsmoothFilter"] = "Off"
+
+        if self.transects[ref_transect].adcp.manufacturer == "TRDI":
+            settings["WTsnrFilter"] = "Off"
+        else:
+            settings["WTsnrFilter"] = "Auto"
+
+        if check_user_excluded_dist:
+            temp = [x.w_vel for x in self.transects]
+            excluded_dist = np.nanmin([x.excluded_dist_m for x in temp])
+        else:
+            excluded_dist = 0
+        if excluded_dist < 0.158 and self.transects[ref_transect].adcp.model == "M9":
+            settings["WTExcludedDistance"] = 0.16
+        elif (
+                excluded_dist < 0.248
+                and self.transects[ref_transect].adcp.model == "RioPro"
+        ):
+            settings["WTExcludedDistance"] = 0.25
+        else:
+            settings["WTExcludedDistance"] = excluded_dist
+
+        # Bottom track filter settings
+        settings["BTbeamFilter"] = -1
+        settings["BTdFilter"] = "Auto"
+        settings["BTdFilterThreshold"] = np.nan
+        settings["BTwFilter"] = "Auto"
+        settings["BTwFilterThreshold"] = np.nan
+        settings["BTsmoothFilter"] = "Off"
+
+        # GGA Filter settings
+        settings["ggaDiffQualFilter"] = self.gps_quality_threshold
+        settings["ggaAltitudeFilter"] = "Auto"
+        settings["ggaAltitudeFilterChange"] = np.nan
+
+        # VTG filter settings
+        settings["vtgsmoothFilter"] = "Off"
+
+        # GGA and VTG filter settings
+        settings["GPSHDOPFilter"] = "Auto"
+        settings["GPSHDOPFilterMax"] = np.nan
+        settings["GPSHDOPFilterChange"] = np.nan
+        settings["GPSSmoothFilter"] = "Off"
+
+        # Depth Averaging
+        settings["depthAvgMethod"] = "IDW"
+        settings["depthValidMethod"] = "QRev"
+
+        # Depth Reference
+
+        # Default to 4 beam depth average
+        settings["depthReference"] = "bt_depths"
+        # Depth settings
+        settings["depthFilterType"] = "Smooth"
+        settings["depthComposite"] = "Off"
+        for transect in self.transects:
+            if transect.checked:
+
+                if (
+                        transect.depths.vb_depths is not None
+                        or transect.depths.ds_depths is not None
+                ):
+                    settings["depthComposite"] = "On"
+                    break
+                else:
+                    settings["depthComposite"] = "Off"
+                    break
+
+        # Interpolation settings
+        settings = self.qrev_default_interpolation_methods(settings)
+
+        # Edge settings
+        settings["edgeVelMethod"] = "MeasMag"
+        settings["edgeRecEdgeMethod"] = "Fixed"
+
+        # Extrapolation Settings
+        settings["extrapTop"] = "Power"
+        settings["extrapBot"] = "Power"
+        settings["extrapExp"] = 0.1667
+        settings["UseWeighted"] = use_weighted
+
+        settings["UseMeasurementThresholds"] = False
+        settings["UsePingType"] = True
+
+        return settings
+
+    def update_qa(self):
+        self.qa = QAData(self)
+
+    @staticmethod
+    def no_filter_interp_settings(self):
+        """Settings to turn off all filters and interpolations.
+
+        Returns
+        -------
+        settings: dict
+            Dictionary of all processing settings.
+        """
+
+        settings = dict()
+        if len(self.checked_transect_idx) > 0:
+            ref_transect = self.checked_transect_idx[0]
+        else:
+            ref_transect = 0
+
+        settings["NavRef"] = self.transects[ref_transect].boatVel.selected
+
+        # Composite tracks
+        settings["CompTracks"] = "Off"
+
+        # Water track filter settings
+        settings["WTbeamFilter"] = 3
+        settings["WTdFilter"] = "Off"
+        settings["WTdFilterThreshold"] = np.nan
+        settings["WTwFilter"] = "Off"
+        settings["WTwFilterThreshold"] = np.nan
+        settings["WTsmoothFilter"] = "Off"
+        settings["WTsnrFilter"] = "Off"
+
+        temp = [x.w_vel for x in self.transects]
+        excluded_dist = np.nanmin([x.excluded_dist_m for x in temp])
+
+        settings["WTExcludedDistance"] = excluded_dist
+
+        # Bottom track filter settings
+        settings["BTbeamFilter"] = 3
+        settings["BTdFilter"] = "Off"
+        settings["BTdFilterThreshold"] = np.nan
+        settings["BTwFilter"] = "Off"
+        settings["BTwFilterThreshold"] = np.nan
+        settings["BTsmoothFilter"] = "Off"
+
+        # GGA filter settings
+        settings["ggaDiffQualFilter"] = 1
+        settings["ggaAltitudeFilter"] = "Off"
+        settings["ggaAltitudeFilterChange"] = np.nan
+
+        # VTG filter settings
+        settings["vtgsmoothFilter"] = "Off"
+
+        # GGA and VTG filter settings
+        settings["GPSHDOPFilter"] = "Off"
+        settings["GPSHDOPFilterMax"] = np.nan
+        settings["GPSHDOPFilterChange"] = np.nan
+        settings["GPSSmoothFilter"] = "Off"
+
+        # Depth Averaging
+        settings["depthAvgMethod"] = "IDW"
+        settings["depthValidMethod"] = "QRev"
+
+        # Depth Reference
+
+        # Default to 4 beam depth average
+        settings["depthReference"] = "btDepths"
+        # Depth settings
+        settings["depthFilterType"] = "None"
+        settings["depthComposite"] = "Off"
+
+        # Interpolation settings
+        settings["BTInterpolation"] = "None"
+        settings["WTEnsInterpolation"] = "None"
+        settings["WTCellInterpolation"] = "None"
+        settings["GPSInterpolation"] = "None"
+        settings["depthInterpolation"] = "None"
+        settings["WTwtDepthFilter"] = "Off"
+
+        # Edge Settings
+        settings["edgeVelMethod"] = "MeasMag"
+        # settings['edgeVelMethod'] = 'Profile'
+        settings["edgeRecEdgeMethod"] = "Fixed"
+
+        return settings
+
+    def selected_transects_changed(self, selected_transects_idx):
+        """Handle changes in the transects selected for computing discharge.
+
+        Parameters
+        ----------
+        selected_transects_idx: list
+            List of indices of the transects used to compute discharge
+        """
+
+        # Update transect settings
+        self.checked_transect_idx = []
+        for n in range(len(self.transects)):
+            if n in selected_transects_idx:
+                self.transects[n].checked = True
+                self.checked_transect_idx.append(n)
+            else:
+                self.transects[n].checked = False
+
+        # Update computations
+        self.create_filter_composites()
+        settings = self.current_settings()
+        self.apply_settings(settings=settings)
+
+    def compute_discharge(self):
+        """Computes the discharge for all transects in the measurement."""
+
+        self.discharge = []
+        for transect in self.transects:
+            q = QComp()
+            q.populate_data(data_in=transect, moving_bed_data=self.mb_tests)
+            self.discharge.append(q)
+
+    def compute_uncertainty(self):
+        """Computes uncertainty using QRev model and Oursin model if selected."""
+
+        self.uncertainty = Uncertainty()
+        self.uncertainty.compute_uncertainty(self)
+        self.qa = QAData(self)
+
+        if self.run_oursin:
+            if self.oursin is None:
+                self.oursin = Oursin()
+                user_advanced_settings = None
+                u_measurement_user = None
+            else:
+                user_advanced_settings = self.oursin.user_advanced_settings
+                u_measurement_user = self.oursin.u_measurement_user
+                self.oursin = Oursin()
+            self.oursin.compute_oursin(
+                self,
+                user_advanced_settings=user_advanced_settings,
+                u_measurement_user=u_measurement_user,
+            )
+
+    def compute_map(
+            self,
+            node_horizontal_user=None,
+            node_vertical_user=None,
+            extrap_option=True,
+            edges_option=True,
+            interp_option=False,
+    ):
+        """Computes Multi-transect Average Profile
+
+        Parameters
+        ----------
+        node_horizontal_user: float
+            Width of MAP cell (in m)
+        node_vertical_user: float
+            Height of MAP cell (in m)
+        extrap_option: bool
+            Boolean indicating if top/bottom extrapolation should be apply
+        edges_option: bool
+            Boolean indicating if edges extrapolation should be apply
+        interp_option: bool
+            Boolean indicating if interpolated data should be used
+        """
+
+        # Check for heading data
+        if all(
+                deg == 0
+                for deg in self.transects[
+                    self.checked_transect_idx[0]
+                ].sensors.heading_deg.internal.data
+        ):
+            self.map = None
+        else:
+            self.map = MAP()
+            self.map.populate_data(
+                self,
+                node_horizontal_user,
+                node_vertical_user,
+                extrap_option,
+                edges_option,
+                interp_option,
+            )
+
+    @staticmethod
+    def compute_edi(meas, selected_idx, percents):
+        """Computes the locations and vertical properties for the user selected
+        transect and flow percentages.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        selected_idx: int
+            Index of selected transect
+        percents: list
+            List of selected flow percents
+        """
+
+        # Get transect and discharge data
+        transect = meas.transects[selected_idx]
+        discharge = meas.discharge[selected_idx]
+
+        # Sort the percents in ascending order
+        percents.sort()
+
+        # Compute cumulative discharge
+        q_cum = np.nancumsum(
+            discharge.middle_ens + discharge.top_ens + discharge.bottom_ens
+        )
+
+        # Adjust for moving-bed conditions
+        q_cum = q_cum * discharge.correction_factor
+
+        # Adjust q for starting edge
+        if transect.start_edge == "Left":
+            q_cum = q_cum + discharge.left
+            q_cum[-1] = q_cum[-1] + discharge.right
+            start_dist = transect.edges.left.distance_m
+        else:
+            q_cum = q_cum + discharge.right
+            q_cum[-1] = q_cum[-1] + discharge.left
+            start_dist = transect.edges.right.distance_m
+
+        # Determine ensemble at each percent
+        ensembles = []
+        q_target = []
+        for percent in percents:
+            q_target.append(q_cum[-1] * percent / 100)
+            if q_target[-1] > 0:
+                ensembles.append(np.where(q_cum > q_target[-1])[0][0])
+            if q_target[-1] < 0:
+                ensembles.append(np.where(q_cum < q_target[-1])[0][0])
+
+        # Compute distance from start bank
+        boat_vel_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
+        track_x = np.nancumsum(
+            boat_vel_selected.u_processed_mps[transect.in_transect_idx]
+            * transect.date_time.ens_duration_sec[transect.in_transect_idx]
+        )
+        track_y = np.nancumsum(
+            boat_vel_selected.v_processed_mps[transect.in_transect_idx]
+            * transect.date_time.ens_duration_sec[transect.in_transect_idx]
+        )
+
+        dist = np.sqrt(track_x ** 2 + track_y ** 2) + start_dist
+
+        # Initialize variables for computing vertical data
+        n_pts_in_avg = int(len(q_cum) * 0.01)
+        depth_selected = getattr(transect.depths, transect.depths.selected)
+        q_actual = []
+        distance = []
+        lat = []
+        lon = []
+        depth = []
+        velocity = []
+
+        # Compute data for each vertical
+        for ensemble in ensembles:
+            q_actual.append(q_cum[ensemble])
+            distance.append(dist[ensemble])
+            # Report lat and lon if available
+            try:
+                lat.append(transect.gps.gga_lat_ens_deg[ensemble])
+                lon.append(transect.gps.gga_lon_ens_deg[ensemble])
+            except (ValueError, AttributeError, TypeError):
+                lat.append("")
+                lon.append("")
+            depth.append(depth_selected.depth_processed_m[ensemble])
+
+            # The velocity is an average velocity for ensembles +/- 1% of the
+            # total ensembles about the selected ensemble
+            u = np.nanmean(
+                transect.w_vel.u_processed_mps[
+                :, ensemble - n_pts_in_avg: ensemble + n_pts_in_avg + 1
+                ],
+                1,
+            )
+            v = np.nanmean(
+                transect.w_vel.v_processed_mps[
+                :, ensemble - n_pts_in_avg: ensemble + n_pts_in_avg + 1
+                ],
+                1,
+            )
+            velocity.append(np.sqrt(np.nanmean(u) ** 2 + np.nanmean(v) ** 2))
+
+        # Save computed results in a dictionary
+        edi_results = {
+            "percent": percents,
+            "target_q": q_target,
+            "actual_q": q_actual,
+            "distance": distance,
+            "depth": depth,
+            "velocity": velocity,
+            "lat": lat,
+            "lon": lon,
+        }
+        return edi_results
+
+    @staticmethod
+    def qrev_default_interpolation_methods(settings):
+        """Adds QRev default interpolation settings to existing settings data structure
+
+        Parameters
+        ----------
+        settings: dict
+            Dictionary of reference and filter settings
+
+        Returns
+        -------
+        settings: dict
+            Dictionary with reference, filter, and interpolation settings
+        """
+
+        settings["BTInterpolation"] = "Linear"
+        settings["WTEnsInterpolation"] = "abba"
+        settings["WTCellInterpolation"] = "abba"
+        settings["GPSInterpolation"] = "Linear"
+        settings["depthInterpolation"] = "Linear"
+        settings["WTwtDepthFilter"] = "On"
+
+        return settings
+
+    def change_extrapolation(
+            self,
+            method,
+            top=None,
+            bot=None,
+            exp=None,
+            extents=None,
+            threshold=None,
+            compute_q=True,
+            use_weighted=False,
+    ):
+        """Applies the selected extrapolation method to each transect.
+
+        Parameters
+        ----------
+        method: str
+            Method of computation Automatic or Manual
+        top: str
+            Top extrapolation method
+        bot: str
+            Bottom extrapolation method
+        exp: float
+            Exponent for power or no slip methods
+        threshold: float
+            Threshold as a percent for determining if a median is valid
+        extents: list
+            Percent of discharge, does not account for transect direction
+        compute_q: bool
+            Specifies if the discharge should be computed
+        use_weighted: bool
+            Specifies is discharge weighting is used
+        """
+
+        if top is None:
+            top = self.extrap_fit.sel_fit[-1].top_method
+        if bot is None:
+            bot = self.extrap_fit.sel_fit[-1].bot_method
+        if exp is None:
+            exp = self.extrap_fit.sel_fit[-1].exponent
+        if extents is not None:
+            self.extrap_fit.subsection = extents
+        if threshold is not None:
+            self.extrap_fit.threshold = threshold
+
+        data_type = self.extrap_fit.norm_data[-1].data_type
+        if data_type is None:
+            data_type = "q"
+
+        if method == "Manual":
+            self.extrap_fit.fit_method = "Manual"
+            for transect in self.transects:
+                transect.extrap.set_extrap_data(top=top, bot=bot, exp=exp)
+            self.extrap_fit.process_profiles(
+                transects=self.transects, data_type=data_type, use_weighted=use_weighted
+            )
+        else:
+            self.extrap_fit.fit_method = "Automatic"
+            self.extrap_fit.process_profiles(
+                transects=self.transects, data_type=data_type, use_weighted=use_weighted
+            )
+            for transect in self.transects:
+                transect.extrap.set_extrap_data(
+                    top=self.extrap_fit.sel_fit[-1].top_method,
+                    bot=self.extrap_fit.sel_fit[-1].bot_method,
+                    exp=self.extrap_fit.sel_fit[-1].exponent,
+                )
+
+        if compute_q:
+            self.extrap_fit.q_sensitivity = ExtrapQSensitivity()
+            self.extrap_fit.q_sensitivity.populate_data(
+                transects=self.transects, extrap_fits=self.extrap_fit.sel_fit
+            )
+
+            self.compute_discharge()
+
+    @staticmethod
+    def measurement_duration(self):
+        """Computes the duration of the measurement."""
+
+        duration = 0
+        for transect in self.transects:
+            if transect.checked:
+                duration += transect.date_time.transect_duration_sec
+        return duration
+
+    @staticmethod
+    def mean_discharges(self):
+        """Computes the mean discharge for the measurement."""
+
+        # Initialize lists
+        total_q = []
+        uncorrected_q = []
+        top_q = []
+        bot_q = []
+        mid_q = []
+        left_q = []
+        right_q = []
+        int_cells_q = []
+        int_ensembles_q = []
+
+        for n, transect in enumerate(self.transects):
+            if transect.checked:
+                total_q.append(self.discharge[n].total)
+                uncorrected_q.append(self.discharge[n].total_uncorrected)
+                top_q.append(self.discharge[n].top)
+                mid_q.append(self.discharge[n].middle)
+                bot_q.append(self.discharge[n].bottom)
+                left_q.append(self.discharge[n].left)
+                right_q.append(self.discharge[n].right)
+                int_cells_q.append(self.discharge[n].int_cells)
+                int_ensembles_q.append(self.discharge[n].int_ens)
+
+        discharge = {
+            "total_mean": np.nanmean(total_q),
+            "uncorrected_mean": np.nanmean(uncorrected_q),
+            "top_mean": np.nanmean(top_q),
+            "mid_mean": np.nanmean(mid_q),
+            "bot_mean": np.nanmean(bot_q),
+            "left_mean": np.nanmean(left_q),
+            "right_mean": np.nanmean(right_q),
+            "int_cells_mean": np.nanmean(int_cells_q),
+            "int_ensembles_mean": np.nanmean(int_ensembles_q),
+        }
+
+        return discharge
+
+    @staticmethod
+    def compute_measurement_properties(self):
+        """Computes characteristics of the transects and measurement that
+        assist in evaluating the consistency of the transects.
+
+        Returns
+        -------
+        trans_prop: dict
+        Dictionary of transect properties
+            width: float
+                width in m
+            width_cov: float
+                coefficient of variation of width in percent
+            area: float
+                cross sectional area in m**2
+            area_cov: float
+                coefficient of variation of are in percent
+            avg_boat_speed: float
+                average boat speed in mps
+            avg_boat_course: float
+                average boat course in degrees
+            avg_water_speed: float
+                average water speed in mps
+            avg_water_dir: float
+                average water direction in degrees
+            avg_depth: float
+                average depth in m
+            max_depth: float
+                maximum depth in m
+            max_water_speed: float
+                99th percentile of water speed in mps
+        """
+
+        # Initialize variables
+        checked_idx = np.array([], dtype=int)
+        n_transects = len(self.transects)
+        trans_prop = {
+            "width": np.array([np.nan] * (n_transects + 1)),
+            "width_cov": np.array([np.nan] * (n_transects + 1)),
+            "area": np.array([np.nan] * (n_transects + 1)),
+            "area_cov": np.array([np.nan] * (n_transects + 1)),
+            "avg_boat_speed": np.array([np.nan] * (n_transects + 1)),
+            "avg_boat_course": np.array([np.nan] * n_transects),
+            "avg_water_speed": np.array([np.nan] * (n_transects + 1)),
+            "avg_water_dir": np.array([np.nan] * (n_transects + 1)),
+            "avg_depth": np.array([np.nan] * (n_transects + 1)),
+            "max_depth": np.array([np.nan] * (n_transects + 1)),
+            "max_water_speed": np.array([np.nan] * (n_transects + 1)),
+        }
+
+        # Process each transect
+        for n, transect in enumerate(self.transects):
+
+            # Compute boat track properties
+            boat_track = BoatStructure.compute_boat_track(transect)
+
+            # Get boat speeds
+            in_transect_idx = transect.in_transect_idx
+            if getattr(transect.boat_vel, transect.boat_vel.selected) is not None:
+                boat_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
+                u_boat = boat_selected.u_processed_mps[in_transect_idx]
+                v_boat = boat_selected.v_processed_mps[in_transect_idx]
+            else:
+                u_boat = nans(
+                    transect.boat_vel.bt_vel.u_processed_mps[in_transect_idx].shape
+                )
+                v_boat = nans(
+                    transect.boat_vel.bt_vel.v_processed_mps[in_transect_idx].shape
+                )
+
+            if np.logical_not(np.all(np.isnan(boat_track["track_x_m"]))):
+
+                # Compute boat course and mean speed
+                [course_radians, dmg] = cart2pol(
+                    boat_track["track_x_m"][-1], boat_track["track_y_m"][-1]
+                )
+                trans_prop["avg_boat_course"][n] = rad2azdeg(course_radians)
+                trans_prop["avg_boat_speed"][n] = np.nanmean(
+                    np.sqrt(u_boat ** 2 + v_boat ** 2)
+                )
+
+                # Compute width
+                trans_prop["width"][n] = np.nansum(
+                    [
+                        dmg,
+                        transect.edges.left.distance_m,
+                        transect.edges.right.distance_m,
+                    ]
+                )
+
+                # Project the shiptrack onto a line from the beginning to end
+                # of the transect
+                unit_x, unit_y = pol2cart(course_radians, 1)
+                bt = np.array([boat_track["track_x_m"], boat_track["track_y_m"]]).T
+                dot_prod = bt @ np.array([unit_x, unit_y])
+                projected_x = dot_prod * unit_x
+                projected_y = dot_prod * unit_y
+                station = np.sqrt(projected_x ** 2 + projected_y ** 2)
+
+                # Get selected depth object
+                depth = getattr(transect.depths, transect.depths.selected)
+                depth_a = np.copy(depth.depth_processed_m)
+                depth_a[np.isnan(depth_a)] = 0
+                # Compute area of the moving-boat portion of the cross section
+                # using trapezoidal integration. This method is consistent with
+                # AreaComp but is different from QRev in Matlab
+                area_moving_boat = np.abs(
+                    np.trapz(depth_a[in_transect_idx], station[in_transect_idx])
+                )
+
+                # Compute area of left edge
+                edge_type = transect.edges.left.type
+                coef = 1
+                if edge_type == "Triangular":
+                    coef = 0.5
+                elif edge_type == "Rectangular":
+                    coef = 1.0
+                elif edge_type == "Custom":
+                    coef = 0.5 + (transect.edges.left.cust_coef - 0.3535)
+                elif edge_type == "User Q":
+                    coef = 0.5
+                edge_idx = QComp.edge_ensembles("left", transect)
+                edge_depth = np.nanmean(depth.depth_processed_m[edge_idx])
+                area_left = edge_depth * transect.edges.left.distance_m * coef
+
+                # Compute area of right edge
+                edge_type = transect.edges.right.type
+                if edge_type == "Triangular":
+                    coef = 0.5
+                elif edge_type == "Rectangular":
+                    coef = 1.0
+                elif edge_type == "Custom":
+                    coef = 0.5 + (transect.edges.right.cust_coef - 0.3535)
+                elif edge_type == "User Q":
+                    coef = 0.5
+                edge_idx = QComp.edge_ensembles("right", transect)
+                edge_depth = np.nanmean(depth.depth_processed_m[edge_idx])
+                area_right = edge_depth * transect.edges.right.distance_m * coef
+
+                # Compute total cross sectional area
+                trans_prop["area"][n] = np.nansum(
+                    [area_left, area_moving_boat, area_right]
+                )
+
+                # Compute average water speed
+                trans_prop["avg_water_speed"][n] = (
+                        self.discharge[n].total / trans_prop["area"][n]
+                )
+
+                # Compute flow direction using discharge weighting
+                u_water = transect.w_vel.u_processed_mps[:, in_transect_idx]
+                v_water = transect.w_vel.v_processed_mps[:, in_transect_idx]
+                weight = np.abs(self.discharge[n].middle_cells)
+                u = np.nansum(np.nansum(u_water * weight)) / np.nansum(
+                    np.nansum(weight)
+                )
+                v = np.nansum(np.nansum(v_water * weight)) / np.nansum(
+                    np.nansum(weight)
+                )
+                trans_prop["avg_water_dir"][n] = np.arctan2(u, v) * 180 / np.pi
+                if trans_prop["avg_water_dir"][n] < 0:
+                    trans_prop["avg_water_dir"][n] = (
+                            trans_prop["avg_water_dir"][n] + 360
+                    )
+
+                # Compute average and max depth
+                # This is a deviation from QRev in Matlab which simply
+                # averaged all the depths
+                trans_prop["avg_depth"][n] = (
+                        trans_prop["area"][n] / trans_prop["width"][n]
+                )
+                trans_prop["max_depth"][n] = np.nanmax(
+                    depth.depth_processed_m[in_transect_idx]
+                )
+
+                # Compute max water speed using the 99th percentile
+                water_speed = np.sqrt(u_water ** 2 + v_water ** 2)
+                trans_prop["max_water_speed"][n] = np.nanpercentile(water_speed, 99)
+                if transect.checked:
+                    checked_idx = np.append(checked_idx, n)
+
+            # Only transects used for discharge are included in measurement
+            # properties
+            if len(checked_idx) > 0:
+                n = n_transects
+                trans_prop["width"][n] = np.nanmean(trans_prop["width"][checked_idx])
+                trans_prop["width_cov"][n] = (
+                                                     np.nanstd(trans_prop["width"][checked_idx], ddof=1)
+                                                     / trans_prop["width"][n]
+                                             ) * 100
+                trans_prop["area"][n] = np.nanmean(trans_prop["area"][checked_idx])
+                trans_prop["area_cov"][n] = (
+                                                    np.nanstd(trans_prop["area"][checked_idx], ddof=1)
+                                                    / trans_prop["area"][n]
+                                            ) * 100
+                trans_prop["avg_boat_speed"][n] = np.nanmean(
+                    trans_prop["avg_boat_speed"][checked_idx]
+                )
+                trans_prop["avg_water_speed"][n] = np.nanmean(
+                    trans_prop["avg_water_speed"][checked_idx]
+                )
+                trans_prop["avg_depth"][n] = np.nanmean(
+                    trans_prop["avg_depth"][checked_idx]
+                )
+                trans_prop["max_depth"][n] = np.nanmax(
+                    trans_prop["max_depth"][checked_idx]
+                )
+                trans_prop["max_water_speed"][n] = np.nanmax(
+                    trans_prop["max_water_speed"][checked_idx]
+                )
+
+                # Compute average water direction using vector coordinates to
+                # avoid the problem of averaging fluctuations that cross zero degrees
+                x_coord = []
+                y_coord = []
+                for idx in checked_idx:
+                    water_dir_rad = azdeg2rad(trans_prop["avg_water_dir"][idx])
+                    x, y = pol2cart(water_dir_rad, 1)
+                    x_coord.append(x)
+                    y_coord.append(y)
+                avg_water_dir_rad, _ = cart2pol(np.mean(x_coord), np.mean(y_coord))
+                trans_prop["avg_water_dir"][n] = rad2azdeg(avg_water_dir_rad)
+
+        return trans_prop
+
+    @staticmethod
+    def checked_transects(meas):
+        """Create a list of indices of the checked transects."""
+
+        checked_transect_idx = []
+        for n in range(len(meas.transects)):
+            if meas.transects[n].checked:
+                checked_transect_idx.append(n)
+        return checked_transect_idx
+
+    @staticmethod
+    def compute_time_series(meas, variable=None):
+        """Computes the time series using serial time for any variable.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        variable: np.ndarray()
+            Data for which the time series is requested
+        """
+
+        # Initialize variables
+        data = np.array([])
+        serial_time = np.array([])
+        idx_transects = Measurement.checked_transects(meas)
+
+        # Process transects
+        for idx in idx_transects:
+            if variable == "Temperature":
+                data = np.append(
+                    data, meas.transects[idx].sensors.temperature_deg_c.internal.data
+                )
+            ens_cum_time = np.nancumsum(meas.transects[idx].date_time.ens_duration_sec)
+            ens_time = meas.transects[idx].date_time.start_serial_time + ens_cum_time
+            serial_time = np.append(serial_time, ens_time)
+
+        return data, serial_time
+
+    def xml_output(self, version, file_name):
+        channel = ETree.Element(
+            "Channel",
+            QRevFilename=os.path.basename(file_name[:-4]),
+            QRevVersion=version,
+        )
+
+        # (2) SiteInformation Node
+        if self.station_name or self.station_number:
+            site_info = ETree.SubElement(channel, "SiteInformation")
+
+            # (3) StationName Node
+            if self.station_name:
+                ETree.SubElement(
+                    site_info, "StationName", type="char"
+                ).text = self.station_name
+
+            # (3) SiteID Node
+            if type(self.station_number) is str:
+                ETree.SubElement(
+                    site_info, "SiteID", type="char"
+                ).text = self.station_number
+            else:
+                ETree.SubElement(site_info, "SiteID", type="char").text = str(
+                    self.station_number
+                )
+
+            # (3) Persons
+            ETree.SubElement(site_info, "Persons", type="char").text = self.persons
+
+            # (3) Measurement Number
+            ETree.SubElement(
+                site_info, "MeasurementNumber", type="char"
+            ).text = self.meas_number
+
+            # (3) Stage start
+            temp = self.stage_start_m
+            ETree.SubElement(
+                site_info, "StageStart", type="double", unitsCode="m"
+            ).text = "{:.5f}".format(temp)
+
+            # (4) Stage start
+            temp = self.stage_end_m
+            ETree.SubElement(
+                site_info, "StageEnd", type="double", unitsCode="m"
+            ).text = "{:.5f}".format(temp)
+
+            # (3) Stage start
+            temp = self.stage_meas_m
+            ETree.SubElement(
+                site_info, "StageMeasurement", type="double", unitsCode="m"
+            ).text = "{:.5f}".format(temp)
+
+        # (2) QA Node
+        qa = ETree.SubElement(channel, "QA")
+
+        # (3) DiagnosticTestResult Node
+        if len(self.system_tst) > 0:
+            last_test = self.system_tst[-1].data
+            failed_idx = last_test.count("FAIL")
+            if failed_idx == 0:
+                test_result = "Pass"
+            else:
+                test_result = str(failed_idx) + " Failed"
+        else:
+            test_result = "None"
+        ETree.SubElement(qa, "DiagnosticTestResult", type="char").text = test_result
+
+        # (3) CompassCalibrationResult Node
+        try:
+            last_eval = self.compass_eval[-1]
+            # StreamPro, RR
+            idx = last_eval.data.find("Typical Heading Error: <")
+            if idx == (-1):
+                # Rio Grande
+                idx = last_eval.data.find(">>> Total error:")
+                if idx != (-1):
+                    idx_start = idx + 17
+                    idx_end = idx_start + 10
+                    comp_error = last_eval.data[idx_start:idx_end]
+                    comp_error = "".join(
+                        [n for n in comp_error if n.isdigit() or n == "."]
+                    )
+                else:
+                    comp_error = ""
+            else:
+                # StreamPro, RR
+                idx_start = idx + 24
+                idx_end = idx_start + 10
+                comp_error = last_eval.data[idx_start:idx_end]
+                comp_error = "".join([n for n in comp_error if n.isdigit() or n == "."])
+
+            # Evaluation could not be determined
+            if not comp_error:
+                ETree.SubElement(
+                    qa, "CompassCalibrationResult", type="char"
+                ).text = "Yes"
+            elif comp_error == "":
+                ETree.SubElement(
+                    qa, "CompassCalibrationResult", type="char"
+                ).text = "No"
+            else:
+                ETree.SubElement(qa, "CompassCalibrationResult", type="char").text = (
+                        "Max " + comp_error
+                )
+
+        except (IndexError, TypeError, AttributeError):
+            try:
+                if len(self.compass_cal) > 0:
+                    ETree.SubElement(
+                        qa, "CompassCalibrationResult", type="char"
+                    ).text = "Yes"
+                else:
+                    ETree.SubElement(
+                        qa, "CompassCalibrationResult", type="char"
+                    ).text = "No"
+            except (IndexError, TypeError):
+                ETree.SubElement(
+                    qa, "CompassCalibrationResult", type="char"
+                ).text = "No"
+
+        # (3) MovingBedTestType Node
+        if not self.mb_tests:
+            ETree.SubElement(qa, "MovingBedTestType", type="char").text = "None"
+        else:
+            selected_idx = [
+                i for (i, val) in enumerate(self.mb_tests) if val.selected is True
+            ]
+            if len(selected_idx) >= 1:
+                temp = self.mb_tests[selected_idx[0]].type
+            else:
+                temp = self.mb_tests[-1].type
+            ETree.SubElement(qa, "MovingBedTestType", type="char").text = str(temp)
+
+            # MovingBedTestResult Node
+            temp = "Unknown"
+            for idx in selected_idx:
+                if self.mb_tests[idx].moving_bed == "Yes":
+                    temp = "Yes"
+                    break
+                elif self.mb_tests[idx].moving_bed == "No":
+                    temp = "No"
+
+            ETree.SubElement(qa, "MovingBedTestResult", type="char").text = temp
+
+        # (3) DiagnosticTest and Text Node
+        if self.system_tst:
+            test_text = ""
+            for test in self.system_tst:
+                test_text += test.data
+            diag_test = ETree.SubElement(qa, "DiagnosticTest")
+            ETree.SubElement(diag_test, "Text", type="char").text = test_text
+
+        # (3) CompassCalibration and Text Node
+        compass_text = ""
+        try:
+            for each in self.compass_cal:
+                if (
+                        self.transects[self.checked_transect_idx[0]].adcp.manufacturer
+                        == "SonTek"
+                ):
+                    idx = each.data.find("CAL_TIME")
+                    compass_text += each.data[idx:]
+                else:
+                    compass_text += each.data
+        except (IndexError, TypeError, AttributeError):
+            pass
+        try:
+            for each in self.compass_eval:
+                if (
+                        self.transects[self.checked_transect_idx[0]].adcp.manufacturer
+                        == "SonTek"
+                ):
+                    idx = each.data.find("CAL_TIME")
+                    compass_text += each.data[idx:]
+                else:
+                    compass_text += each.data
+        except (IndexError, TypeError, AttributeError):
+            pass
+
+        if len(compass_text) > 0:
+            comp_cal = ETree.SubElement(qa, "CompassCalibration")
+            ETree.SubElement(comp_cal, "Text", type="char").text = compass_text
+
+        # (3) MovingBedTest Node
+        if self.mb_tests:
+            for each in self.mb_tests:
+                mbt = ETree.SubElement(qa, "MovingBedTest")
+
+                # (4) Filename Node
+                ETree.SubElement(
+                    mbt, "Filename", type="char"
+                ).text = each.transect.file_name
+
+                # (4) TestType Node
+                ETree.SubElement(mbt, "TestType", type="char").text = each.type
+
+                # (4) Duration Node
+                ETree.SubElement(
+                    mbt, "Duration", type="double", unitsCode="sec"
+                ).text = "{:.2f}".format(each.duration_sec)
+
+                # (4) PercentInvalidBT Node
+                ETree.SubElement(
+                    mbt, "PercentInvalidBT", type="double"
+                ).text = "{:.4f}".format(each.percent_invalid_bt)
+
+                # (4) HeadingDifference Node
+                if each.compass_diff_deg:
+                    temp = "{:.2f}".format(each.compass_diff_deg)
+                else:
+                    temp = ""
+                ETree.SubElement(
+                    mbt, "HeadingDifference", type="double", unitsCode="deg"
+                ).text = temp
+
+                # (4) MeanFlowDirection Node
+                if each.flow_dir:
+                    temp = "{:.2f}".format(each.flow_dir)
+                else:
+                    temp = ""
+                ETree.SubElement(
+                    mbt, "MeanFlowDirection", type="double", unitsCode="deg"
+                ).text = temp
+
+                # (4) MovingBedDirection Node
+                if each.mb_dir:
+                    temp = "{:.2f}".format(each.mb_dir)
+                else:
+                    temp = ""
+                ETree.SubElement(
+                    mbt, "MovingBedDirection", type="double", unitsCode="deg"
+                ).text = temp
+
+                # (4) DistanceUpstream Node
+                ETree.SubElement(
+                    mbt, "DistanceUpstream", type="double", unitsCode="m"
+                ).text = "{:.4f}".format(each.dist_us_m)
+
+                # (4) MeanFlowSpeed Node
+                ETree.SubElement(
+                    mbt, "MeanFlowSpeed", type="double", unitsCode="mps"
+                ).text = "{:.4f}".format(each.flow_spd_mps)
+
+                # (4) MovingBedSpeed Node
+                ETree.SubElement(
+                    mbt, "MovingBedSpeed", type="double", unitsCode="mps"
+                ).text = "{:.4f}".format(each.mb_spd_mps)
+
+                # (4) PercentMovingBed Node
+                ETree.SubElement(
+                    mbt, "PercentMovingBed", type="double"
+                ).text = "{:.2f}".format(each.percent_mb)
+
+                # (4) TestQuality Node
+                ETree.SubElement(
+                    mbt, "TestQuality", type="char"
+                ).text = each.test_quality
+
+                # (4) MovingBedPresent Node
+                ETree.SubElement(
+                    mbt, "MovingBedPresent", type="char"
+                ).text = each.moving_bed
+
+                # (4) UseToCorrect Node
+                if each.use_2_correct:
+                    ETree.SubElement(mbt, "UseToCorrect", type="char").text = "Yes"
+                else:
+                    ETree.SubElement(mbt, "UseToCorrect", type="char").text = "No"
+
+                # (4) UserValid Node
+                if each.user_valid:
+                    ETree.SubElement(mbt, "UserValid", type="char").text = "Yes"
+                else:
+                    ETree.SubElement(mbt, "UserValid", type="char").text = "No"
+
+                # (4) Message Node
+                if len(each.messages) > 0:
+                    str_out = ""
+                    for message in each.messages:
+                        str_out = str_out + message + "; "
+                    ETree.SubElement(mbt, "Message", type="char").text = str_out
+
+        # (3) TemperatureCheck Node
+        temp_check = ETree.SubElement(qa, "TemperatureCheck")
+
+        # (4) VerificationTemperature Node
+        if not np.isnan(self.ext_temp_chk["user"]):
+            ETree.SubElement(
+                temp_check, "VerificationTemperature", type="double", unitsCode="degC"
+            ).text = "{:.2f}".format(self.ext_temp_chk["user"])
+
+        # (4) InstrumentTemperature Node
+        if not np.isnan(self.ext_temp_chk["adcp"]):
+            ETree.SubElement(
+                temp_check, "InstrumentTemperature", type="double", unitsCode="degC"
+            ).text = "{:.2f}".format(self.ext_temp_chk["adcp"])
+
+        # (4) TemperatureChange Node:
+        temp_all = np.array([np.nan])
+        for each in self.transects:
+            # Check for situation where user has entered a constant temperature
+            temperature_selected = getattr(
+                each.sensors.temperature_deg_c, each.sensors.temperature_deg_c.selected
+            )
+            temperature = temperature_selected.data
+            if each.sensors.temperature_deg_c.selected != "user":
+                # Temperatures for ADCP.
+                temp_all = np.concatenate((temp_all, temperature))
+            else:
+                # User specified constant temperature.
+                # Concatenate a matrix of size of internal data with repeated
+                # user values.
+                user_arr = np.tile(
+                    each.sensors.temperature_deg_c.user.data,
+                    (np.size(each.sensors.temperature_deg_c.internal.data)),
+                )
+                temp_all = np.concatenate((temp_all, user_arr))
+
+        t_range = np.nanmax(temp_all) - np.nanmin(temp_all)
+        ETree.SubElement(
+            temp_check, "TemperatureChange", type="double", unitsCode="degC"
+        ).text = "{:.2f}".format(t_range)
+
+        # (3) QRev_Message Node
+        qa_check_keys = [
+            "bt_vel",
+            "compass",
+            "depths",
+            "edges",
+            "extrapolation",
+            "gga_vel",
+            "movingbed",
+            "system_tst",
+            "temperature",
+            "transects",
+            "user",
+            "vtg_vel",
+            "w_vel",
+        ]
+
+        # For each qa check retrieve messages
+        messages = []
+        for key in qa_check_keys:
+            qa_type = getattr(self.qa, key)
+            if qa_type["messages"]:
+                for message in qa_type["messages"]:
+                    if type(message) is str:
+                        if message[:3].isupper():
+                            messages.append([message, 1])
+                        else:
+                            messages.append([message, 2])
+                    else:
+                        messages.append(message)
+
+        # Sort messages with warning at top
+        messages.sort(key=lambda x: x[1])
+
+        if len(messages) > 0:
+            temp = ""
+            for message in messages:
+                temp = temp + message[0]
+            ETree.SubElement(qa, "QRev_Message", type="char").text = temp
+
+        # (2) Instrument Node
+        instrument = ETree.SubElement(channel, "Instrument")
+
+        # (3) Manufacturer Node
+        ETree.SubElement(instrument, "Manufacturer", type="char").text = self.transects[
+            self.checked_transect_idx[0]
+        ].adcp.manufacturer
+
+        # (3) Model Node
+        ETree.SubElement(instrument, "Model", type="char").text = self.transects[
+            self.checked_transect_idx[0]
+        ].adcp.model
+
+        # (3) SerialNumber Node
+        sn = self.transects[self.checked_transect_idx[0]].adcp.serial_num
+        ETree.SubElement(instrument, "SerialNumber", type="char").text = str(sn)
+
+        # (3) FirmwareVersion Node
+        ver = self.transects[self.checked_transect_idx[0]].adcp.firmware
+        ETree.SubElement(instrument, "FirmwareVersion", type="char").text = str(ver)
+
+        # (3) Frequency Node
+        freq = self.transects[self.checked_transect_idx[0]].adcp.frequency_khz
+        if type(freq) == np.ndarray:
+            freq = "Multi"
+        ETree.SubElement(
+            instrument, "Frequency", type="char", unitsCode="kHz"
+        ).text = str(freq)
+
+        # (3) BeamAngle Node
+        ang = self.transects[self.checked_transect_idx[0]].adcp.beam_angle_deg
+        ETree.SubElement(
+            instrument, "BeamAngle", type="double", unitsCode="deg"
+        ).text = "{:.1f}".format(ang)
+
+        # (3) BlankingDistance Node
+        w_vel = []
+        for each in self.transects:
+            w_vel.append(each.w_vel)
+        blank = []
+        for each in w_vel:
+            blank.append(each.blanking_distance_m)
+        if isinstance(blank[0], float):
+            temp = np.mean(blank)
+            if (
+                    self.transects[self.checked_transect_idx[0]].w_vel.excluded_dist_m
+                    > temp
+            ):
+                temp = self.transects[
+                    self.checked_transect_idx[0]
+                ].w_vel.excluded_dist_m
+        else:
+            temp = self.transects[self.checked_transect_idx[0]].w_vel.excluded_dist_m
+        ETree.SubElement(
+            instrument, "BlankingDistance", type="double", unitsCode="m"
+        ).text = "{:.4f}".format(temp)
+
+        # (3) InstrumentConfiguration Node
+        commands = ""
+        if (
+                self.transects[self.checked_transect_idx[0]].adcp.configuration_commands
+                is not None
+        ):
+            for each in self.transects[
+                self.checked_transect_idx[0]
+            ].adcp.configuration_commands:
+                if type(each) is str:
+                    commands += each + "  "
+            ETree.SubElement(
+                instrument, "InstrumentConfiguration", type="char"
+            ).text = commands
+
+        # (2) Processing Node
+        processing = ETree.SubElement(channel, "Processing")
+
+        # (3) SoftwareVersion Node
+        ETree.SubElement(processing, "SoftwareVersion", type="char").text = version
+
+        # (3) Type Node
+        ETree.SubElement(processing, "Type", type="char").text = self.processing
+
+        # (3) AreaComputationMethod Node
+        ETree.SubElement(
+            processing, "AreaComputationMethod", type="char"
+        ).text = "Parallel"
+
+        # (3) Navigation Node
+        navigation = ETree.SubElement(processing, "Navigation")
+
+        # (4) Reference Node
+        ETree.SubElement(navigation, "Reference", type="char").text = self.transects[
+            self.checked_transect_idx[0]
+        ].w_vel.nav_ref
+
+        # (4) CompositeTrack
+        ETree.SubElement(
+            navigation, "CompositeTrack", type="char"
+        ).text = self.transects[self.checked_transect_idx[0]].boat_vel.composite
+
+        # (4) MagneticVariation Node
+        mag_var = self.transects[
+            self.checked_transect_idx[0]
+        ].sensors.heading_deg.internal.mag_var_deg
+        ETree.SubElement(
+            navigation, "MagneticVariation", type="double", unitsCode="deg"
+        ).text = "{:.2f}".format(mag_var)
+
+        # (4) BeamFilter
+        nav_data = getattr(
+            self.transects[self.checked_transect_idx[0]].boat_vel,
+            self.transects[self.checked_transect_idx[0]].boat_vel.selected,
+        )
+        temp = nav_data.beam_filter
+        if temp < 0:
+            temp = "Auto"
+        else:
+            temp = str(temp)
+        ETree.SubElement(navigation, "BeamFilter", type="char").text = temp
+
+        # (4) ErrorVelocityFilter Node
+        evf = nav_data.d_filter
+        if evf == "Manual":
+            evf = "{:.4f}".format(nav_data.d_filter_thresholds)
+        ETree.SubElement(
+            navigation, "ErrorVelocityFilter", type="char", unitsCode="mps"
+        ).text = evf
+
+        # (4) VerticalVelocityFilter Node
+        vvf = nav_data.w_filter
+        if vvf == "Manual":
+            vvf = "{:.4f}".format(nav_data.w_filter_thresholds)
+        ETree.SubElement(
+            navigation, "VerticalVelocityFilter", type="char", unitsCode="mps"
+        ).text = vvf
+
+        # (4) Use measurement thresholds
+        temp = nav_data.use_measurement_thresholds
+        if temp:
+            temp = "Yes"
+        else:
+            temp = "No"
+        ETree.SubElement(
+            navigation, "UseMeasurementThresholds", type="char"
+        ).text = temp
+
+        # (4) OtherFilter Node
+        o_f = nav_data.smooth_filter
+        ETree.SubElement(navigation, "OtherFilter", type="char").text = o_f
+
+        # (4) GPSDifferentialQualityFilter Node
+        temp = nav_data.gps_diff_qual_filter
+        if temp:
+            if isinstance(temp, int) or isinstance(temp, float):
+                temp = str(temp)
+            ETree.SubElement(
+                navigation, "GPSDifferentialQualityFilter", type="char"
+            ).text = temp
+
+        # (4) GPSAltitudeFilter Node
+        temp = nav_data.gps_altitude_filter
+        if temp:
+            if temp == "Manual":
+                temp = self.transects[
+                    self.checked_transect_idx[0]
+                ].boat_vel.gps_altitude_filter_change
+            ETree.SubElement(
+                navigation, "GPSAltitudeFilter", type="char", unitsCode="m"
+            ).text = str(temp)
+
+        # (4) HDOPChangeFilter
+        temp = nav_data.gps_HDOP_filter
+        if temp:
+            if temp == "Manual":
+                temp = "{:.2f}".format(
+                    self.transects[
+                        self.checked_transect_idx[0]
+                    ].boat_vel.gps_hdop_filter_change
+                )
+            ETree.SubElement(navigation, "HDOPChangeFilter", type="char").text = temp
+
+        # (4) HDOPThresholdFilter
+        temp = nav_data.gps_HDOP_filter
+        if temp:
+            if temp == "Manual":
+                temp = "{:.2f}".format(
+                    self.transects[
+                        self.checked_transect_idx[0]
+                    ].boat_vel.gps_HDOP_filter_max
+                )
+            ETree.SubElement(navigation, "HDOPThresholdFilter", type="char").text = temp
+
+        # (4) InterpolationType Node
+        temp = nav_data.interpolate
+        ETree.SubElement(navigation, "InterpolationType", type="char").text = temp
+
+        # (3) Depth Node
+        depth = ETree.SubElement(processing, "Depth")
+
+        # (4) Reference Node
+        if self.transects[self.checked_transect_idx[0]].depths.selected == "bt_depths":
+            temp = "BT"
+        elif (
+                self.transects[self.checked_transect_idx[0]].depths.selected == "vb_depths"
+        ):
+            temp = "VB"
+        elif (
+                self.transects[self.checked_transect_idx[0]].depths.selected == "ds_depths"
+        ):
+            temp = "DS"
+        ETree.SubElement(depth, "Reference", type="char").text = temp
+
+        # (4) CompositeDepth Node
+        ETree.SubElement(depth, "CompositeDepth", type="char").text = self.transects[
+            self.checked_transect_idx[0]
+        ].depths.composite
+
+        # (4) ADCPDepth Node
+        depth_data = getattr(
+            self.transects[self.checked_transect_idx[0]].depths,
+            self.transects[self.checked_transect_idx[0]].depths.selected,
+        )
+        temp = depth_data.draft_use_m
+        ETree.SubElement(
+            depth, "ADCPDepth", type="double", unitsCode="m"
+        ).text = "{:.4f}".format(temp)
+
+        # (4) ADCPDepthConsistent Node
+        drafts = []
+        for transect in self.transects:
+            if transect.checked:
+                transect_depth = getattr(transect.depths, transect.depths.selected)
+                drafts.append(transect_depth.draft_use_m)
+        unique_drafts = set(drafts)
+        num_drafts = len(unique_drafts)
+        if num_drafts > 1:
+            temp = "No"
+        else:
+            temp = "Yes"
+        ETree.SubElement(depth, "ADCPDepthConsistent", type="boolean").text = temp
+
+        # (4) FilterType Node
+        temp = depth_data.filter_type
+        ETree.SubElement(depth, "FilterType", type="char").text = temp
+
+        # (4) InterpolationType Node
+        temp = depth_data.interp_type
+        ETree.SubElement(depth, "InterpolationType", type="char").text = temp
+
+        # (4) AveragingMethod Node
+        temp = depth_data.avg_method
+        ETree.SubElement(depth, "AveragingMethod", type="char").text = temp
+
+        # (4) ValidDataMethod Node
+        temp = depth_data.valid_data_method
+        ETree.SubElement(depth, "ValidDataMethod", type="char").text = temp
+
+        # (3) WaterTrack Node
+        water_track = ETree.SubElement(processing, "WaterTrack")
+
+        # (4) ExcludedDistance Node
+        temp = self.transects[self.checked_transect_idx[0]].w_vel.excluded_dist_m
+        ETree.SubElement(
+            water_track, "ExcludedDistance", type="double", unitsCode="m"
+        ).text = "{:.4f}".format(temp)
+
+        # (4) BeamFilter Node
+        temp = self.transects[self.checked_transect_idx[0]].w_vel.beam_filter
+        if temp < 0:
+            temp = "Auto"
+        else:
+            temp = str(temp)
+        ETree.SubElement(water_track, "BeamFilter", type="char").text = temp
+
+        # (4) ErrorVelocityFilter Node
+        temp = self.transects[self.checked_transect_idx[0]].w_vel.d_filter
+        if temp == "Manual":
+            temp = "{:.4f}".format(
+                self.transects[self.checked_transect_idx[0]].w_vel.d_filter_thresholds
+            )
+        ETree.SubElement(
+            water_track, "ErrorVelocityFilter", type="char", unitsCode="mps"
+        ).text = temp
+
+        # (4) VerticalVelocityFilter Node
+        temp = self.transects[self.checked_transect_idx[0]].w_vel.w_filter
+        if temp == "Manual":
+            temp = "{:.4f}".format(
+                self.transects[self.checked_transect_idx[0]].w_vel.w_filter_thresholds
+            )
+        ETree.SubElement(
+            water_track, "VerticalVelocityFilter", type="char", unitsCode="mps"
+        ).text = temp
+
+        # (4) Use measurement thresholds
+        temp = self.transects[
+            self.checked_transect_idx[0]
+        ].w_vel.use_measurement_thresholds
+        if temp:
+            temp = "Yes"
+        else:
+            temp = "No"
+        ETree.SubElement(
+            water_track, "UseMeasurementThresholds", type="char"
+        ).text = temp
+
+        # (4) OtherFilter Node
+        temp = self.transects[self.checked_transect_idx[0]].w_vel.smooth_filter
+        ETree.SubElement(water_track, "OtherFilter", type="char").text = temp
+
+        # (4) SNRFilter Node
+        temp = self.transects[self.checked_transect_idx[0]].w_vel.snr_filter
+        ETree.SubElement(water_track, "SNRFilter", type="char").text = temp
+
+        # (4) CellInterpolation Node
+        temp = self.transects[self.checked_transect_idx[0]].w_vel.interpolate_cells
+        ETree.SubElement(water_track, "CellInterpolation", type="char").text = temp
+
+        # (4) EnsembleInterpolation Node
+        temp = self.transects[self.checked_transect_idx[0]].w_vel.interpolate_ens
+        ETree.SubElement(water_track, "EnsembleInterpolation", type="char").text = temp
+
+        # (3) Edge Node
+        edge = ETree.SubElement(processing, "Edge")
+
+        # (4) RectangularEdgeMethod Node
+        temp = self.transects[self.checked_transect_idx[0]].edges.rec_edge_method
+        ETree.SubElement(edge, "RectangularEdgeMethod", type="char").text = temp
+
+        # (4) VelocityMethod Node
+        temp = self.transects[self.checked_transect_idx[0]].edges.vel_method
+        ETree.SubElement(edge, "VelocityMethod", type="char").text = temp
+
+        # (4) LeftType Node
+        typ = []
+        for n in self.transects:
+            if n.checked:
+                typ.append(n.edges.left.type)
+        unique_type = set(typ)
+        num_types = len(unique_type)
+        if num_types > 1:
+            temp = "Varies"
+        else:
+            temp = typ[0]
+        ETree.SubElement(edge, "LeftType", type="char").text = temp
+
+        # LeftEdgeCoefficient
+        if temp == "User Q":
+            temp = "N/A"
+        elif temp == "Varies":
+            temp = "N/A"
+        else:
+            coef = []
+            for transect in self.transects:
+                if transect.checked:
+                    coef.append(QComp.edge_coef("left", transect))
+            num_coef = len(set(coef))
+            if num_coef > 1:
+                temp = "Varies"
+            else:
+                temp = "{:.4f}".format(coef[0])
+        ETree.SubElement(edge, "LeftEdgeCoefficient", type="char").text = temp
+
+        # (4) RightType Node
+        typ = []
+        for n in self.transects:
+            if n.checked:
+                typ.append(n.edges.right.type)
+        unique_type = set(typ)
+        num_types = len(unique_type)
+        if num_types > 1:
+            temp = "Varies"
+        else:
+            temp = typ[0]
+        ETree.SubElement(edge, "RightType", type="char").text = temp
+
+        # RightEdgeCoefficient
+        if temp == "User Q":
+            temp = "N/A"
+        elif temp == "Varies":
+            temp = "N/A"
+        else:
+            coef = []
+            for transect in self.transects:
+                if transect.checked:
+                    coef.append(QComp.edge_coef("right", transect))
+            num_coef = len(set(coef))
+            if num_coef > 1:
+                temp = "Varies"
+            else:
+                temp = "{:.4f}".format(coef[0])
+        ETree.SubElement(edge, "RightEdgeCoefficient", type="char").text = temp
+
+        # (3) Extrapolation Node
+        extrap = ETree.SubElement(processing, "Extrapolation")
+
+        # (4) TopMethod Node
+        temp = self.transects[self.checked_transect_idx[0]].extrap.top_method
+        ETree.SubElement(extrap, "TopMethod", type="char").text = temp
+
+        # (4) BottomMethod Node
+        temp = self.transects[self.checked_transect_idx[0]].extrap.bot_method
+        ETree.SubElement(extrap, "BottomMethod", type="char").text = temp
+
+        # (4) Exponent Node
+        temp = self.transects[self.checked_transect_idx[0]].extrap.exponent
+        ETree.SubElement(extrap, "Exponent", type="double").text = "{:.4f}".format(temp)
+
+        # (4) Discharge weighted medians
+        temp = self.extrap_fit.use_weighted
+        if temp:
+            temp = "Yes"
+        else:
+            temp = "No"
+        ETree.SubElement(extrap, "UseWeighted", type="char").text = temp
+
+        # (3) Sensor Node
+        sensor = ETree.SubElement(processing, "Sensor")
+
+        # (4) TemperatureSource Node
+        temp = []
+        for n in self.transects:
+            if n.checked:
+                # k+=1
+                temp.append(n.sensors.temperature_deg_c.selected)
+        sources = len(set(temp))
+        if sources > 1:
+            temp = "Varies"
+        else:
+            temp = temp[0]
+        ETree.SubElement(sensor, "TemperatureSource", type="char").text = temp
+
+        # (4) Salinity
+        temp = np.array([])
+        for transect in self.transects:
+            if transect.checked:
+                sal_selected = getattr(
+                    transect.sensors.salinity_ppt,
+                    transect.sensors.salinity_ppt.selected,
+                )
+                temp = np.append(temp, sal_selected.data)
+        values = np.unique(temp)
+        if len(values) > 1:
+            temp = "Varies"
+        else:
+            temp = "{:2.1f}".format(values[0])
+        ETree.SubElement(sensor, "Salinity", type="char", unitsCode="ppt").text = temp
+
+        # (4) SpeedofSound Node
+        temp = []
+        for n in self.transects:
+            if n.checked:
+                temp.append(n.sensors.speed_of_sound_mps.selected)
+        sources = len(set(temp))
+        if sources > 1:
+            temp = "Varies"
+        else:
+            temp = temp[0]
+        if temp == "internal":
+            temp = "ADCP"
+        ETree.SubElement(
+            sensor, "SpeedofSound", type="char", unitsCode="mps"
+        ).text = temp
+
+        # (2) Transect Node
+        other_prop = self.compute_measurement_properties(self)
+        for n in range(len(self.transects)):
+            if self.transects[n].checked:
+                transect = ETree.SubElement(channel, "Transect")
+
+                # (3) Filename Node
+                temp = self.transects[n].file_name
+                ETree.SubElement(transect, "Filename", type="char").text = temp
+
+                # (3) StartDateTime Node
+                temp = int(self.transects[n].date_time.start_serial_time)
+                temp = datetime.datetime.utcfromtimestamp(temp).strftime(
+                    "%m/%d/%Y %H:%M:%S"
+                )
+                ETree.SubElement(transect, "StartDateTime", type="char").text = temp
+
+                # (3) EndDateTime Node
+                temp = int(self.transects[n].date_time.end_serial_time)
+                temp = datetime.datetime.utcfromtimestamp(temp).strftime(
+                    "%m/%d/%Y %H:%M:%S"
+                )
+                ETree.SubElement(transect, "EndDateTime", type="char").text = temp
+
+                # (3) Discharge Node
+                t_q = ETree.SubElement(transect, "Discharge")
+
+                # (4) Top Node
+                temp = self.discharge[n].top
+                ETree.SubElement(
+                    t_q, "Top", type="double", unitsCode="cms"
+                ).text = "{:.5f}".format(temp)
+
+                # (4) Middle Node
+                temp = self.discharge[n].middle
+                ETree.SubElement(
+                    t_q, "Middle", type="double", unitsCode="cms"
+                ).text = "{:.5f}".format(temp)
+
+                # (4) Bottom Node
+                temp = self.discharge[n].bottom
+                ETree.SubElement(
+                    t_q, "Bottom", type="double", unitsCode="cms"
+                ).text = "{:.5f}".format(temp)
+
+                # (4) Left Node
+                temp = self.discharge[n].left
+                ETree.SubElement(
+                    t_q, "Left", type="double", unitsCode="cms"
+                ).text = "{:.5f}".format(temp)
+
+                # (4) Right Node
+                temp = self.discharge[n].right
+                ETree.SubElement(
+                    t_q, "Right", type="double", unitsCode="cms"
+                ).text = "{:.5f}".format(temp)
+
+                # (4) Total Node
+                temp = self.discharge[n].total
+                ETree.SubElement(
+                    t_q, "Total", type="double", unitsCode="cms"
+                ).text = "{:.5f}".format(temp)
+
+                # (4) MovingBedPercentCorrection Node
+                temp = (
+                               (self.discharge[n].total / self.discharge[n].total_uncorrected) - 1
+                       ) * 100
+                ETree.SubElement(
+                    t_q, "MovingBedPercentCorrection", type="double"
+                ).text = "{:.2f}".format(temp)
+
+                # (3) Edge Node
+                t_edge = ETree.SubElement(transect, "Edge")
+
+                # (4) StartEdge Node
+                temp = self.transects[n].start_edge
+                ETree.SubElement(t_edge, "StartEdge", type="char").text = temp
+
+                # (4) RectangularEdgeMethod Node
+                temp = self.transects[n].edges.rec_edge_method
+                ETree.SubElement(
+                    t_edge, "RectangularEdgeMethod", type="char"
+                ).text = temp
+
+                # (4) VelocityMethod Node
+                temp = self.transects[n].edges.vel_method
+                ETree.SubElement(t_edge, "VelocityMethod", type="char").text = temp
+
+                # (4) LeftType Node
+                temp = self.transects[n].edges.left.type
+                ETree.SubElement(t_edge, "LeftType", type="char").text = temp
+
+                # (4) LeftEdgeCoefficient Node
+                if temp == "User Q":
+                    temp = ""
+                else:
+                    temp = "{:.4f}".format(QComp.edge_coef("left", self.transects[n]))
+                ETree.SubElement(
+                    t_edge, "LeftEdgeCoefficient", type="double"
+                ).text = temp
+
+                # (4) LeftDistance Node
+                temp = "{:.4f}".format(self.transects[n].edges.left.distance_m)
+                ETree.SubElement(
+                    t_edge, "LeftDistance", type="double", unitsCode="m"
+                ).text = temp
+
+                # (4) LeftNumberEnsembles
+                temp = "{:.0f}".format(self.transects[n].edges.left.number_ensembles)
+                ETree.SubElement(
+                    t_edge, "LeftNumberEnsembles", type="double"
+                ).text = temp
+
+                # (4) RightType Node
+                temp = self.transects[n].edges.right.type
+                ETree.SubElement(t_edge, "RightType", type="char").text = temp
+
+                # (4) RightEdgeCoefficient Node
+                if temp == "User Q":
+                    temp = ""
+                else:
+                    temp = "{:.4f}".format(QComp.edge_coef("right", self.transects[n]))
+                ETree.SubElement(
+                    t_edge, "RightEdgeCoefficient", type="double"
+                ).text = temp
+
+                # (4) RightDistance Node
+                temp = "{:.4f}".format(self.transects[n].edges.right.distance_m)
+                ETree.SubElement(
+                    t_edge, "RightDistance", type="double", unitsCode="m"
+                ).text = temp
+
+                # (4) RightNumberEnsembles Node
+                temp = "{:.0f}".format(self.transects[n].edges.right.number_ensembles)
+                ETree.SubElement(
+                    t_edge, "RightNumberEnsembles", type="double"
+                ).text = temp
+
+                # (3) Sensor Node
+                t_sensor = ETree.SubElement(transect, "Sensor")
+
+                # (4) TemperatureSource Node
+                temp = self.transects[n].sensors.temperature_deg_c.selected
+                ETree.SubElement(t_sensor, "TemperatureSource", type="char").text = temp
+
+                # (4) MeanTemperature Node
+                dat = getattr(
+                    self.transects[n].sensors.temperature_deg_c,
+                    self.transects[n].sensors.temperature_deg_c.selected,
+                )
+                temp = np.nanmean(dat.data)
+                temp = "{:.2f}".format(temp)
+                ETree.SubElement(
+                    t_sensor, "MeanTemperature", type="double", unitsCode="degC"
+                ).text = temp
+
+                # (4) MeanSalinity
+                sal_data = getattr(
+                    self.transects[n].sensors.salinity_ppt,
+                    self.transects[n].sensors.salinity_ppt.selected,
+                )
+                temp = "{:.0f}".format(np.nanmean(sal_data.data))
+                ETree.SubElement(
+                    t_sensor, "MeanSalinity", type="double", unitsCode="ppt"
+                ).text = temp
+
+                # (4) SpeedofSoundSource Node
+                sos_selected = getattr(
+                    self.transects[n].sensors.speed_of_sound_mps,
+                    self.transects[n].sensors.speed_of_sound_mps.selected,
+                )
+                temp = sos_selected.source
+                ETree.SubElement(
+                    t_sensor, "SpeedofSoundSource", type="char"
+                ).text = temp
+
+                # (4) SpeedofSound
+                sos_data = getattr(
+                    self.transects[n].sensors.speed_of_sound_mps,
+                    self.transects[n].sensors.speed_of_sound_mps.selected,
+                )
+                temp = "{:.4f}".format(np.nanmean(sos_data.data))
+                ETree.SubElement(
+                    t_sensor, "SpeedofSound", type="double", unitsCode="mps"
+                ).text = temp
+
+                # (3) Other Node
+                t_other = ETree.SubElement(transect, "Other")
+
+                # (4) Duration Node
+                temp = "{:.2f}".format(
+                    self.transects[n].date_time.transect_duration_sec
+                )
+                ETree.SubElement(
+                    t_other, "Duration", type="double", unitsCode="sec"
+                ).text = temp
+
+                # (4) Width
+                temp = other_prop["width"][n]
+                ETree.SubElement(
+                    t_other, "Width", type="double", unitsCode="m"
+                ).text = "{:.4f}".format(temp)
+
+                # (4) Area
+                temp = other_prop["area"][n]
+                ETree.SubElement(
+                    t_other, "Area", type="double", unitsCode="sqm"
+                ).text = "{:.4f}".format(temp)
+
+                # (4) MeanBoatSpeed
+                temp = other_prop["avg_boat_speed"][n]
+                ETree.SubElement(
+                    t_other, "MeanBoatSpeed", type="double", unitsCode="mps"
+                ).text = "{:.4f}".format(temp)
+
+                # (4) QoverA
+                temp = other_prop["avg_water_speed"][n]
+                ETree.SubElement(
+                    t_other, "QoverA", type="double", unitsCode="mps"
+                ).text = "{:.4f}".format(temp)
+
+                # (4) CourseMadeGood
+                temp = other_prop["avg_boat_course"][n]
+                ETree.SubElement(
+                    t_other, "CourseMadeGood", type="double", unitsCode="deg"
+                ).text = "{:.2f}".format(temp)
+
+                # (4) MeanFlowDirection
+                temp = other_prop["avg_water_dir"][n]
+                ETree.SubElement(
+                    t_other, "MeanFlowDirection", type="double", unitsCode="deg"
+                ).text = "{:.2f}".format(temp)
+
+                # (4) NumberofEnsembles
+                temp = len(self.transects[n].boat_vel.bt_vel.u_processed_mps)
+                ETree.SubElement(
+                    t_other, "NumberofEnsembles", type="integer"
+                ).text = str(temp)
+
+                # (4) PercentInvalidBins
+                valid_ens, valid_cells = TransectData.raw_valid_data(self.transects[n])
+                temp = (
+                               1
+                               - (
+                                       np.nansum(np.nansum(valid_cells))
+                                       / np.nansum(np.nansum(self.transects[n].w_vel.cells_above_sl))
+                               )
+                       ) * 100
+                ETree.SubElement(
+                    t_other, "PercentInvalidBins", type="double"
+                ).text = "{:.2f}".format(temp)
+
+                # (4) PercentInvalidEnsembles
+                temp = (
+                               1
+                               - (
+                                       np.nansum(valid_ens)
+                                       / len(self.transects[n].boat_vel.bt_vel.u_processed_mps)
+                               )
+                       ) * 100
+                ETree.SubElement(
+                    t_other, "PercentInvalidEns", type="double"
+                ).text = "{:.2f}".format(temp)
+
+                pitch_source_selected = getattr(
+                    self.transects[n].sensors.pitch_deg,
+                    self.transects[n].sensors.pitch_deg.selected,
+                )
+                roll_source_selected = getattr(
+                    self.transects[n].sensors.roll_deg,
+                    self.transects[n].sensors.roll_deg.selected,
+                )
+
+                # (4) MeanPitch
+                temp = np.nanmean(pitch_source_selected.data)
+                ETree.SubElement(
+                    t_other, "MeanPitch", type="double", unitsCode="deg"
+                ).text = "{:.2f}".format(temp)
+
+                # (4) MeanRoll
+                temp = np.nanmean(roll_source_selected.data)
+                ETree.SubElement(
+                    t_other, "MeanRoll", type="double", unitsCode="deg"
+                ).text = "{:.2f}".format(temp)
+
+                # (4) PitchStdDev
+                temp = np.nanstd(pitch_source_selected.data, ddof=1)
+                ETree.SubElement(
+                    t_other, "PitchStdDev", type="double", unitsCode="deg"
+                ).text = "{:.2f}".format(temp)
+
+                # (4) RollStdDev
+                temp = np.nanstd(roll_source_selected.data, ddof=1)
+                ETree.SubElement(
+                    t_other, "RollStdDev", type="double", unitsCode="deg"
+                ).text = "{:.2f}".format(temp)
+
+                # (4) ADCPDepth
+                depth_source_selected = getattr(
+                    self.transects[n].depths, self.transects[n].depths.selected
+                )
+                temp = depth_source_selected.draft_use_m
+                ETree.SubElement(
+                    t_other, "ADCPDepth", type="double", unitsCode="m"
+                ).text = "{:.4f}".format(temp)
+
+        # (2) ChannelSummary Node
+        summary = ETree.SubElement(channel, "ChannelSummary")
+
+        # (3) Discharge Node
+        s_q = ETree.SubElement(summary, "Discharge")
+        discharge = self.mean_discharges(self)
+
+        # (4) Top
+        temp = discharge["top_mean"]
+        ETree.SubElement(
+            s_q, "Top", type="double", unitsCode="cms"
+        ).text = "{:.5f}".format(temp)
+
+        # (4) Middle
+        temp = discharge["mid_mean"]
+        ETree.SubElement(
+            s_q, "Middle", type="double", unitsCode="cms"
+        ).text = "{:.5f}".format(temp)
+
+        # (4) Bottom
+        temp = discharge["bot_mean"]
+        ETree.SubElement(
+            s_q, "Bottom", type="double", unitsCode="cms"
+        ).text = "{:.5f}".format(temp)
+
+        # (4) Left
+        temp = discharge["left_mean"]
+        ETree.SubElement(
+            s_q, "Left", type="double", unitsCode="cms"
+        ).text = "{:.5f}".format(temp)
+
+        # (4) Right
+        temp = discharge["right_mean"]
+        ETree.SubElement(
+            s_q, "Right", type="double", unitsCode="cms"
+        ).text = "{:.5f}".format(temp)
+
+        # (4) Total
+        temp = discharge["total_mean"]
+        ETree.SubElement(
+            s_q, "Total", type="double", unitsCode="cms"
+        ).text = "{:.5f}".format(temp)
+
+        # (4) MovingBedPercentCorrection
+        temp = ((discharge["total_mean"] / discharge["uncorrected_mean"]) - 1) * 100
+        ETree.SubElement(
+            s_q, "MovingBedPercentCorrection", type="double"
+        ).text = "{:.2f}".format(temp)
+
+        # (3) Uncertainty Node
+        s_u = ETree.SubElement(summary, "Uncertainty")
+        if self.run_oursin:
+            u_total = self.oursin.u_measurement_user["total_95"][0]
+            u_model = "OURSIN"
+        else:
+            u_total = self.uncertainty.total_95_user
+            u_model = "QRevUA"
+
+        if not np.isnan(temp):
+            ETree.SubElement(s_u, "Total", type="double").text = "{:.1f}".format(
+                u_total
+            )
+            ETree.SubElement(s_u, "Model", type="char").text = u_model
+
+        # (3) QRev_UA Uncertainty Node
+        if self.uncertainty is not None:
+            s_qu = ETree.SubElement(summary, "QRevUAUncertainty")
+            uncertainty = self.uncertainty
+
+            # (4) COV Node
+            temp = uncertainty.cov
+            if not np.isnan(temp):
+                ETree.SubElement(s_qu, "COV", type="double").text = "{:.1f}".format(
+                    temp
+                )
+
+            # (4) AutoRandom Node
+            temp = uncertainty.cov_95
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_qu, "AutoRandom", type="double"
+                ).text = "{:.1f}".format(temp)
+
+            # (4) AutoInvalidData Node
+            temp = uncertainty.invalid_95
+            ETree.SubElement(
+                s_qu, "AutoInvalidData", type="double"
+            ).text = "{:.1f}".format(temp)
+
+            # (4) AutoEdge Node
+            temp = uncertainty.edges_95
+            ETree.SubElement(s_qu, "AutoEdge", type="double").text = "{:.1f}".format(
+                temp
+            )
+
+            # (4) AutoExtrapolation Node
+            temp = uncertainty.extrapolation_95
+            ETree.SubElement(
+                s_qu, "AutoExtrapolation", type="double"
+            ).text = "{:.1f}".format(temp)
+
+            # (4) AutoMovingBed
+            temp = uncertainty.moving_bed_95
+            ETree.SubElement(
+                s_qu, "AutoMovingBed", type="double"
+            ).text = "{:.1f}".format(temp)
+
+            # (4) AutoSystematic
+            temp = uncertainty.systematic
+            ETree.SubElement(
+                s_qu, "AutoSystematic", type="double"
+            ).text = "{:.1f}".format(temp)
+
+            # (4) AutoTotal
+            temp = uncertainty.total_95
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_qu, "AutoTotal", type="double"
+                ).text = "{:.1f}".format(temp)
+
+            # (4) UserRandom Node
+            user_random = uncertainty.cov_95_user
+            if user_random:
+                ETree.SubElement(
+                    s_qu, "UserRandom", type="double"
+                ).text = "{:.1f}".format(user_random)
+
+            # (4) UserInvalidData Node
+            user_invalid = uncertainty.invalid_95_user
+            if user_invalid:
+                ETree.SubElement(
+                    s_qu, "UserInvalidData", type="double"
+                ).text = "{:.1f}".format(user_invalid)
+
+            # (4) UserEdge
+            user_edge = uncertainty.edges_95_user
+            if user_edge:
+                ETree.SubElement(
+                    s_qu, "UserEdge", type="double"
+                ).text = "{:.1f}".format(user_edge)
+
+            # (4) UserExtrapolation
+            user_extrap = uncertainty.extrapolation_95_user
+            if user_extrap:
+                ETree.SubElement(
+                    s_qu, "UserExtrapolation", type="double"
+                ).text = "{:.1f}".format(user_extrap)
+
+            # (4) UserMovingBed
+            user_mb = uncertainty.moving_bed_95_user
+            if user_mb:
+                ETree.SubElement(
+                    s_qu, "UserMovingBed", type="double"
+                ).text = "{:.1f}".format(user_mb)
+
+            # (4) UserSystematic
+            user_systematic = uncertainty.systematic_user
+            if user_systematic:
+                ETree.SubElement(
+                    s_qu, "UserSystematic", type="double"
+                ).text = "{:.1f}".format(user_systematic)
+
+            # (4) UserTotal Node
+            temp = uncertainty.total_95_user
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_qu, "UserTotal", type="double"
+                ).text = "{:.1f}".format(temp)
+
+            # (4) Random
+            if user_random:
+                temp = user_random
+            else:
+                temp = uncertainty.cov_95
+            if not np.isnan(temp):
+                ETree.SubElement(s_qu, "Random", type="double").text = "{:.1f}".format(
+                    temp
+                )
+
+            # (4) InvalidData
+            if user_invalid:
+                temp = user_invalid
+            else:
+                temp = uncertainty.invalid_95
+            ETree.SubElement(s_qu, "InvalidData", type="double").text = "{:.1f}".format(
+                temp
+            )
+
+            # (4) Edge
+            if user_edge:
+                temp = user_edge
+            else:
+                temp = uncertainty.edges_95
+            ETree.SubElement(s_qu, "Edge", type="double").text = "{:.1f}".format(temp)
+
+            # (4) Extrapolation
+            if user_extrap:
+                temp = user_extrap
+            else:
+                temp = uncertainty.extrapolation_95
+            ETree.SubElement(
+                s_qu, "Extrapolation", type="double"
+            ).text = "{:.1f}".format(temp)
+
+            # (4) MovingBed
+            if user_mb:
+                temp = user_mb
+            else:
+                temp = uncertainty.moving_bed_95
+            ETree.SubElement(s_qu, "MovingBed", type="double").text = "{:.1f}".format(
+                temp
+            )
+
+            # (4) Systematic
+            if user_systematic:
+                temp = user_systematic
+            else:
+                temp = uncertainty.systematic
+            ETree.SubElement(s_qu, "Systematic", type="double").text = "{:.1f}".format(
+                temp
+            )
+
+            # (4) UserTotal Node
+            temp = uncertainty.total_95_user
+            if not np.isnan(temp):
+                ETree.SubElement(s_qu, "Total", type="double").text = "{:.1f}".format(
+                    temp
+                )
+
+        # Oursin Uncertainty Node
+        if self.oursin is not None:
+            # (3) Uncertainty Node
+            s_ou = ETree.SubElement(summary, "OursinUncertainty")
+            oursin = self.oursin
+
+            # (4) System Node
+            temp = oursin.u_measurement["u_syst"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(s_ou, "System", type="double").text = "{:.2f}".format(
+                    temp
+                )
+
+            # (4) Compass Node
+            temp = oursin.u_measurement["u_compass"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(s_ou, "Compass", type="double").text = "{:.2f}".format(
+                    temp
+                )
+
+            # (4) Moving-bed Node
+            temp = oursin.u_measurement["u_movbed"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "MovingBed", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Ensembles Node
+            temp = oursin.u_measurement["u_ens"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "Ensembles", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Measured Node
+            temp = oursin.u_measurement["u_meas"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "Measured", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Top Node
+            temp = oursin.u_measurement["u_top"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(s_ou, "Top", type="double").text = "{:.2f}".format(
+                    temp
+                )
+
+            # (4) Bottom Node
+            temp = oursin.u_measurement["u_bot"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(s_ou, "Bottom", type="double").text = "{:.2f}".format(
+                    temp
+                )
+
+            # (4) Left Node
+            temp = oursin.u_measurement["u_left"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(s_ou, "Left", type="double").text = "{:.2f}".format(
+                    temp
+                )
+
+            # (4) Bottom Node
+            temp = oursin.u_measurement["u_right"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(s_ou, "Right", type="double").text = "{:.2f}".format(
+                    temp
+                )
+
+            # (4) Invalid Boat Node
+            temp = oursin.u_measurement["u_boat"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "InvalidBoat", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Invalid Depth Node
+            temp = oursin.u_measurement["u_depth"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "InvalidDepth", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Invalid Water Node
+            temp = oursin.u_measurement["u_water"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "InvalidWater", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) COV Node
+            temp = oursin.u_measurement["u_cov"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(s_ou, "COV", type="double").text = "{:.2f}".format(
+                    temp
+                )
+
+            # (4) Auto Total 95% Node
+            temp = oursin.u_measurement["total_95"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "AutoTotal95", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Extrapolation Power/Power Minimum
+            temp = oursin.default_advanced_settings["exp_pp_min"]
+            if type(temp) is float:
+                ETree.SubElement(
+                    s_ou, "ExtrapPPMin", type="double"
+                ).text = "{:.2f}".format(temp)
+            else:
+                ETree.SubElement(s_ou, "ExtrapPPMin", type="char").text = temp
+
+            # (4) Extrapolation Power/Power Maximum
+            temp = oursin.default_advanced_settings["exp_pp_max"]
+            if type(temp) is float:
+                ETree.SubElement(
+                    s_ou, "ExtrapPPMax", type="double"
+                ).text = "{:.2f}".format(temp)
+            else:
+                ETree.SubElement(s_ou, "ExtrapPPMax", type="char").text = temp
+
+            # (4) Extrapolation No Slip Minimum
+            temp = oursin.default_advanced_settings["exp_ns_min"]
+            if type(temp) is float:
+                ETree.SubElement(
+                    s_ou, "ExtrapNSMin", type="double"
+                ).text = "{:.2f}".format(temp)
+            else:
+                ETree.SubElement(s_ou, "ExtrapNSMin", type="char").text = temp
+
+            # (4) Extrapolation No Slip Maximum
+            temp = oursin.default_advanced_settings["exp_ns_max"]
+            if type(temp) is float:
+                ETree.SubElement(
+                    s_ou, "ExtrapNSMax", type="double"
+                ).text = "{:.2f}".format(temp)
+            else:
+                ETree.SubElement(s_ou, "ExtrapNSMax", type="char").text = temp
+
+            # (4) Draft error in m
+            temp = oursin.default_advanced_settings["draft_error_m"]
+            if type(temp) is float:
+                ETree.SubElement(
+                    s_ou, "DraftErrorm", type="double"
+                ).text = "{:.2f}".format(temp)
+            else:
+                ETree.SubElement(s_ou, "DraftErrorm", type="char").text = temp
+
+            # (4) Bin size error in percent
+            temp = oursin.default_advanced_settings["dzi_prct"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "BinErrorPer", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Right edge distance error in percent
+            temp = oursin.default_advanced_settings["right_edge_dist_prct"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "REdgeDistErrorPer", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Left edge distance error in percent
+            temp = oursin.default_advanced_settings["left_edge_dist_prct"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "LEdgeDistErrorPer", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) GGA Boat Velocity Error in mps
+            temp = oursin.default_advanced_settings["gga_boat_mps"]
+            if type(temp) is float:
+                ETree.SubElement(
+                    s_ou, "GGABoatVelErrormps", type="double"
+                ).text = "{:.2f}".format(temp)
+            else:
+                ETree.SubElement(s_ou, "GGABoatVelErrormps", type="char").text = temp
+
+            # (4) VTG Boat Velocity Error in mps
+            temp = oursin.default_advanced_settings["vtg_boat_mps"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "VTGBoatVelErrormps", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Compass Error in deg
+            temp = oursin.default_advanced_settings["compass_error_deg"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "CompassErrordeg", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Bayesian COV prior in percent
+            temp = oursin.default_advanced_settings["cov_prior"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "BayesCOVPriorper", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Bayesian COV prior uncertaint in percent
+            temp = oursin.default_advanced_settings["cov_prior_u"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "BayesCOVPriorUncertaintyper", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # User
+
+            # (4) System Node
+            temp = oursin.u_measurement_user["u_syst"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "SystemUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Compass Node
+            temp = oursin.u_measurement_user["u_compass"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "CompassUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Moving-bed Node
+            temp = oursin.u_measurement_user["u_movbed"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "MovingBedUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Ensembles Node
+            temp = oursin.u_measurement_user["u_ens"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "EnsemblesUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Measured Node
+            temp = oursin.u_measurement_user["u_meas"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "MeasuredUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Top Node
+            temp = oursin.u_measurement_user["u_top"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(s_ou, "TopUser", type="double").text = "{:.2f}".format(
+                    temp
+                )
+
+            # (4) Bottom Node
+            temp = oursin.u_measurement_user["u_bot"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "BottomUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Left Node
+            temp = oursin.u_measurement_user["u_left"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "LeftUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Bottom Node
+            temp = oursin.u_measurement_user["u_right"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "RightUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Invalid Boat Node
+            temp = oursin.u_measurement_user["u_boat"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "InvalidBoatUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Invalid Depth Node
+            temp = oursin.u_measurement_user["u_depth"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "InvalidDepthUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Invalid Water Node
+            temp = oursin.u_measurement_user["u_water"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "InvalidWaterUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Auto Total 95% Node
+            temp = oursin.u_measurement_user["total_95"][0]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "AutoTotal95User", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Extrapolation Power/Power Minimum
+            temp = oursin.user_advanced_settings["exp_pp_min_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "ExtrapPPMinUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Extrapolation Power/Power Maximum
+            temp = oursin.user_advanced_settings["exp_pp_max_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "ExtrapPPMaxUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Extrapolation No Slip Minimum
+            temp = oursin.user_advanced_settings["exp_ns_min_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "ExtrapNSMinUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Extrapolation No Slip Maximum
+            temp = oursin.user_advanced_settings["exp_ns_max_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "ExtrapNSMaxUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Draft error in m
+            temp = oursin.user_advanced_settings["draft_error_m_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "DraftErrormUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Bin size error in percent
+            temp = oursin.user_advanced_settings["dzi_prct_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "BinErrorperUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Right edge distance error in percent
+            temp = oursin.user_advanced_settings["right_edge_dist_prct_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "REdgeDistErrorperUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Left edge distance error in percent
+            temp = oursin.user_advanced_settings["left_edge_dist_prct_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "LEdgeDistErrorperUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) GGA Boat Velocity Error in mps
+            temp = oursin.user_advanced_settings["gga_boat_mps_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "GGABoatVelErrormpsUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) VTG Boat Velocity Error in mps
+            temp = oursin.user_advanced_settings["vtg_boat_mps_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "VTGBoatVelErrormpsUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Compass Error in deg
+            temp = oursin.user_advanced_settings["compass_error_deg_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "CompassErrordegUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Bayesian COV prior in percent
+            temp = oursin.user_advanced_settings["cov_prior_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "BayesCOVPriorperUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+            # (4) Bayesian COV prior uncertaint in percent
+            temp = oursin.user_advanced_settings["cov_prior_u_user"]
+            if not np.isnan(temp):
+                ETree.SubElement(
+                    s_ou, "BayesCOVPriorUncertaintyperUser", type="double"
+                ).text = "{:.2f}".format(temp)
+
+        # (3) Other Node
+        s_o = ETree.SubElement(summary, "Other")
+
+        # (4) MeanWidth
+        temp = other_prop["width"][-1]
+        ETree.SubElement(
+            s_o, "MeanWidth", type="double", unitsCode="m"
+        ).text = "{:.4f}".format(temp)
+
+        # (4) WidthCOV
+        temp = other_prop["width_cov"][-1]
+        if not np.isnan(temp):
+            ETree.SubElement(s_o, "WidthCOV", type="double").text = "{:.4f}".format(
+                temp
+            )
+
+        # (4) MeanArea
+        temp = other_prop["area"][-1]
+        ETree.SubElement(
+            s_o, "MeanArea", type="double", unitsCode="sqm"
+        ).text = "{:.4f}".format(temp)
+
+        # (4) AreaCOV
+        temp = other_prop["area_cov"][-1]
+        if not np.isnan(temp):
+            ETree.SubElement(s_o, "AreaCOV", type="double").text = "{:.2f}".format(temp)
+
+        # (4) MeanBoatSpeed
+        temp = other_prop["avg_boat_speed"][-1]
+        ETree.SubElement(
+            s_o, "MeanBoatSpeed", type="double", unitsCode="mps"
+        ).text = "{:.4f}".format(temp)
+
+        # (4) MeanQoverA
+        temp = other_prop["avg_water_speed"][-1]
+        ETree.SubElement(
+            s_o, "MeanQoverA", type="double", unitsCode="mps"
+        ).text = "{:.4f}".format(temp)
+
+        # (4) MeanCourseMadeGood
+        temp = other_prop["avg_boat_course"][-1]
+        ETree.SubElement(
+            s_o, "MeanCourseMadeGood", type="double", unitsCode="deg"
+        ).text = "{:.2f}".format(temp)
+
+        # (4) MeanFlowDirection
+        temp = other_prop["avg_water_dir"][-1]
+        ETree.SubElement(
+            s_o, "MeanFlowDirection", type="double", unitsCode="deg"
+        ).text = "{:.2f}".format(temp)
+
+        # (4) MeanDepth
+        temp = other_prop["avg_depth"][-1]
+        ETree.SubElement(
+            s_o, "MeanDepth", type="double", unitsCode="m"
+        ).text = "{:.4f}".format(temp)
+
+        # (4) MaximumDepth
+        temp = other_prop["max_depth"][-1]
+        ETree.SubElement(
+            s_o, "MaximumDepth", type="double", unitsCode="m"
+        ).text = "{:.4f}".format(temp)
+
+        # (4) MaximumWaterSpeed
+        temp = other_prop["max_water_speed"][-1]
+        ETree.SubElement(
+            s_o, "MaximumWaterSpeed", type="double", unitsCode="mps"
+        ).text = "{:.4f}".format(temp)
+
+        # (4) NumberofTransects
+        temp = len(self.checked_transects(self))
+        ETree.SubElement(s_o, "NumberofTransects", type="integer").text = str(temp)
+
+        # (4) Duration
+        temp = self.measurement_duration(self)
+        ETree.SubElement(
+            s_o, "Duration", type="double", unitsCode="sec"
+        ).text = "{:.2f}".format(temp)
+
+        # (4) LeftQPer
+        temp = 100 * discharge["left_mean"] / discharge["total_mean"]
+        ETree.SubElement(s_o, "LeftQPer", type="double").text = "{:.2f}".format(temp)
+
+        # (4) RightQPer
+        temp = 100 * discharge["right_mean"] / discharge["total_mean"]
+        ETree.SubElement(s_o, "RightQPer", type="double").text = "{:.2f}".format(temp)
+
+        # (4) InvalidCellsQPer
+        temp = 100 * discharge["int_cells_mean"] / discharge["total_mean"]
+        ETree.SubElement(s_o, "InvalidCellsQPer", type="double").text = "{:.2f}".format(
+            temp
+        )
+
+        # (4) InvalidEnsQPer
+        temp = 100 * discharge["int_ensembles_mean"] / discharge["total_mean"]
+        ETree.SubElement(s_o, "InvalidEnsQPer", type="double").text = "{:.2f}".format(
+            temp
+        )
+
+        # (4) UserRating
+        if self.user_rating:
+            temp = self.user_rating
+        else:
+            temp = "Not Rated"
+        ETree.SubElement(s_o, "UserRating", type="char").text = temp
+
+        # (4) DischargePPDefault
+        temp = self.extrap_fit.q_sensitivity.q_pp_mean
+        ETree.SubElement(
+            s_o, "DischargePPDefault", type="double"
+        ).text = "{:.2f}".format(temp)
+
+        # (2) UserComment
+        if len(self.comments) > 1:
+            temp = ""
+            for comment in self.comments:
+                temp = temp + comment.replace("\n", " |||") + " |||"
+            ETree.SubElement(channel, "UserComment", type="char").text = temp
+
+        # Average cross-section
+        if self.export_xs:
+            # xs = CrossSectionComp(self.transects, file_name)
+            xs = CrossSectionComp(self.transects)
+
+            cross_section = xs.cross_section[(len(xs.cross_section) - 1)]
+            rows = cross_section.shape[0]
+
+            survey = ETree.SubElement(channel, "CrossSectionSurvey")
+
+            for row in range(rows):
+                lon = cross_section[row, 0]
+                lat = cross_section[row, 1]
+                dist_x = cross_section[row, 2]
+                dist_y = cross_section[row, 3]
+                station = cross_section[row, 4]
+                depth = cross_section[row, 5]
+
+                if not np.isnan(lon):
+                    try:
+                        lat, lon = utm.to_latlon(
+                            lat,
+                            lon,
+                            zone_number=xs.zone_number,
+                            zone_letter=xs.zone_letter,
+                        )
+                    except BaseException:
+                        lat = np.nan
+                        lon = np.nan
+
+                meas_pts = ETree.SubElement(survey, "MeasurementPoints")
+                ETree.SubElement(meas_pts, "TableRow", type="integer").text = str(row)
+
+                # latitude
+                measurements = ETree.SubElement(meas_pts, "Measurements")
+                sensor = ETree.SubElement(measurements, "Sensor")
+                s_type = ETree.SubElement(sensor, "SensorType")
+                parm = ETree.SubElement(s_type, "Parameter")
+                ETree.SubElement(parm, "Name").text = "Latitude"
+                ETree.SubElement(parm, "Units").text = "Degrees"
+                ETree.SubElement(measurements, "Value", type="double").text = str(lat)
+
+                # Longitude
+                measurements = ETree.SubElement(meas_pts, "Measurements")
+                sensor = ETree.SubElement(measurements, "Sensor")
+                s_type = ETree.SubElement(sensor, "SensorType")
+                parm = ETree.SubElement(s_type, "Parameter")
+                ETree.SubElement(parm, "Name").text = "Longitude"
+                ETree.SubElement(parm, "Units").text = "Degrees"
+                ETree.SubElement(measurements, "Value", type="double").text = str(lon)
+
+                # station
+                measurements = ETree.SubElement(meas_pts, "Measurements")
+                sensor = ETree.SubElement(measurements, "Sensor")
+                s_type = ETree.SubElement(sensor, "SensorType")
+                parm = ETree.SubElement(s_type, "Parameter")
+                ETree.SubElement(parm, "Name").text = "Distance"
+                ETree.SubElement(parm, "Units").text = "Meters"
+                ETree.SubElement(
+                    measurements, "Value", type="double", unitsCode="m"
+                ).text = "{:.3f}".format(station)
+
+                # distance x
+                measurements = ETree.SubElement(meas_pts, "Measurements")
+                sensor = ETree.SubElement(measurements, "Sensor")
+                s_type = ETree.SubElement(sensor, "SensorType")
+                parm = ETree.SubElement(s_type, "Parameter")
+                ETree.SubElement(parm, "Name").text = "Distance X"
+                ETree.SubElement(parm, "Units").text = "Meters"
+                ETree.SubElement(
+                    measurements, "Value", type="double", unitsCode="m"
+                ).text = "{:.3f}".format(dist_x)
+
+                # distance y
+                measurements = ETree.SubElement(meas_pts, "Measurements")
+                sensor = ETree.SubElement(measurements, "Sensor")
+                s_type = ETree.SubElement(sensor, "SensorType")
+                parm = ETree.SubElement(s_type, "Parameter")
+                ETree.SubElement(parm, "Name").text = "Distance Y"
+                ETree.SubElement(parm, "Units").text = "Meters"
+                ETree.SubElement(
+                    measurements, "Value", type="double", unitsCode="m"
+                ).text = "{:.3f}".format(dist_y)
+
+                # depth
+                measurements = ETree.SubElement(meas_pts, "Measurements")
+                sensor = ETree.SubElement(measurements, "Sensor")
+                s_type = ETree.SubElement(sensor, "SensorType")
+                parm = ETree.SubElement(s_type, "Parameter")
+                ETree.SubElement(parm, "Name").text = "Depth"
+                ETree.SubElement(parm, "Units").text = "Meters"
+                ETree.SubElement(
+                    measurements, "Value", type="double", unitsCode="m"
+                ).text = "{:.3f}".format(depth)
+
+        # Create xml output file
+        with open(file_name, "wb") as xml_file:
+            # Create binary coded output file
+            et = ETree.ElementTree(channel)
+            root = et.getroot()
+            xml_out = ETree.tostring(root)
+            # Add stylesheet instructions
+            xml_out = (
+                    b'<?xml-stylesheet type= "text/xsl" '
+                    b'href="QRevStylesheet.xsl"?>' + xml_out
+            )
+            # Add tabs to make output more readable and apply utf-8 encoding
+            xml_out = parseString(xml_out).toprettyxml(encoding="utf-8")
+            # Write file
+            xml_file.write(xml_out)
+
+    @staticmethod
+    def add_transect(mmt, filename, index, transect_type):
+        """Processes a pd0 file into a TransectData object.
+
+        Parameters
+        ----------
+        mmt: MMTtrdi
+            Object of MMTtrdi
+        filename: str
+            Pd0 filename to be processed
+        index: int
+            Index to file in the mmt
+        transect_type: str
+            Indicates type of transect discharge (Q), or moving_bed (MB)
+
+        Returns
+        -------
+        transect: TransectData
+            Object of TransectData
+        """
+        pd0_data = Pd0TRDI(filename)
+
+        if transect_type == "MB":
+            mmt_transect = mmt.mbt_transects[index]
+        else:
+            mmt_transect = mmt.transects[index]
+
+        transect = TransectData()
+        transect.trdi(mmt=mmt, mmt_transect=mmt_transect, pd0_data=pd0_data)
+        return transect
+
+    def allocate_transects(self, mmt, transect_type="Q", checked=False):
+        """Method to load transect data. Changed from Matlab approach by Greg
+        to allow possibility of multi-thread approach.
+
+        Parameters
+        ----------
+        mmt: MMT_TRDI
+            Object of MMT_TRDI
+        transect_type: str
+            Type of transect (Q: discharge or MB: moving-bed test)
+        checked: bool
+            Determines if all files are loaded (False) or only checked files
+            (True)
+        """
+
+        file_names = []
+        file_idx = []
+
+        # Setup processing for discharge or moving-bed transects
+        if transect_type == "Q":
+            # Identify discharge transect files to load
+            if checked:
+                for idx, transect in enumerate(mmt.transects):
+                    if transect.Checked == 1:
+                        file_names.append(transect.Files[0])
+                        file_idx.append(idx)
+
+            else:
+                file_names = [transect.Files[0] for transect in mmt.transects]
+                file_idx = list(range(0, len(file_names)))
+
+        elif transect_type == "MB":
+            file_names = [transect.Files[0] for transect in mmt.mbt_transects]
+            file_idx = list(range(0, len(file_names)))
+
+        # Determine if any files are missing
+        valid_files = []
+        valid_indices = []
+        for index, name in enumerate(file_names):
+            fullname = os.path.join(mmt.path, name)
+            if os.path.exists(fullname):
+                valid_files.append(fullname)
+                valid_indices.append(file_idx[index])
+
+        transects = []
+        num = len(valid_indices)
+
+        for k in range(num):
+            temp = self.add_transect(
+                mmt, valid_files[k], valid_indices[k], transect_type
+            )
+            if temp.w_vel is not None:
+                transects.append(temp)
+
+        return transects
+
+
+if __name__ == "__main__":
+    pass
diff --git a/qrevint_22_06_22/Classes/MovingBedTests.py b/Classes/MovingBedTests.py
similarity index 67%
rename from qrevint_22_06_22/Classes/MovingBedTests.py
rename to Classes/MovingBedTests.py
index 117ab213f96cd9c0d5064dad98de424c4d6b2f67..9e46fc1cbc5328edaede3b6774d99d13f5980ac0 100644
--- a/qrevint_22_06_22/Classes/MovingBedTests.py
+++ b/Classes/MovingBedTests.py
@@ -4,7 +4,14 @@ from Classes.TransectData import adjusted_ensemble_duration
 from Classes.TransectData import TransectData
 from Classes.QComp import QComp
 from Classes.MatSonTek import MatSonTek
-from MiscLibs.common_functions import cart2pol, sind, pol2cart, rad2azdeg, nan_less, nan_greater
+from MiscLibs.common_functions import (
+    cart2pol,
+    sind,
+    pol2cart,
+    rad2azdeg,
+    nan_less,
+    nan_greater,
+)
 
 
 class MovingBedTests(object):
@@ -37,13 +44,15 @@ class MovingBedTests(object):
     moving_bed: str
         Moving-bed determined ("Yes" or "No")
     user_valid: bool
-        Boolean to allow user to determine if test should be considered a valid test (True or False)
+        Boolean to allow user to determine if test should be considered a
+        valid test (True or False)
     test_quality: str
         Quality of test, 'Valid' 'Warnings' 'Errors'
     use_2_correct: bool
         Use this test to correct discharge (True or False)
     selected: bool
-        Selected as valid moving-bed test to use for correction or determine moving-bed condition
+        Selected as valid moving-bed test to use for correction or determine
+        moving-bed condition
     messages: list
         List of strings for warning and error messages based on data processing
     near_bed_speed_mps: float
@@ -77,32 +86,32 @@ class MovingBedTests(object):
     gps_flow_spd_mps: float
         Corrected flow speed using BT and GPS
     """
-    
+
     def __init__(self):
         """Initialize class and instance variables."""
 
-        self.type = None  # Loop or Stationary
-        self.transect = None  # Object of TransectData
-        self.duration_sec = np.nan  # Duration of test in secs
-        self.percent_invalid_bt = np.nan  # Percent of invalid bottom track
-        self.compass_diff_deg = np.nan  # Difference in heading for out and back of loop
-        self.flow_dir = np.nan  # Mean flow direction from loop test
-        self.mb_dir = np.nan  # Moving bed or closure error direction
-        self.dist_us_m = np.nan  # Distance moved upstream in m
-        self.flow_spd_mps = np.nan  # Magnitude of water velocity in mps
-        self.mb_spd_mps = np.nan  # Magnitude of moving=bed velocity in mps
-        self.percent_mb = np.nan  # Potential error due to moving bed in percent
-        self.moving_bed = np.nan  # Moving-bed determined 'Yes' 'No'
-        self.user_valid = True  # Logical to allow user to determine if test should be considered a valid test
-        self.test_quality = None  # Quality of test 'Valid' 'Warnings' 'Errors'
-        self.use_2_correct = None  # Use this test to correct discharge
-        self.selected = None  # Selected valid moving-bed test to use for correction or determine moving-bed condition
-        self.messages = None  # Cell array of warning and error messages based on data processing
-        self.near_bed_speed_mps = np.nan  # Mean near-bed water speed for test in mps
-        self.stationary_us_track = np.array([])  # Upstream component of the bottom track referenced ship track
-        self.stationary_cs_track = np.array([])  # Cross=stream component of the bottom track referenced ship track
-        self.stationary_mb_vel = np.array([])  # Moving-bed velocity by ensemble
-        self.ref = 'BT'
+        self.type = None
+        self.transect = None
+        self.duration_sec = np.nan
+        self.percent_invalid_bt = np.nan
+        self.compass_diff_deg = np.nan
+        self.flow_dir = np.nan
+        self.mb_dir = np.nan
+        self.dist_us_m = np.nan
+        self.flow_spd_mps = np.nan
+        self.mb_spd_mps = np.nan
+        self.percent_mb = np.nan
+        self.moving_bed = np.nan
+        self.user_valid = True
+        self.test_quality = None
+        self.use_2_correct = None
+        self.selected = None
+        self.messages = None
+        self.near_bed_speed_mps = np.nan
+        self.stationary_us_track = np.array([])
+        self.stationary_cs_track = np.array([])
+        self.stationary_mb_vel = np.array([])
+        self.ref = "BT"
         self.bt_percent_mb = np.nan
         self.bt_dist_us_m = np.nan
         self.bt_mb_dir = np.nan
@@ -113,8 +122,8 @@ class MovingBedTests(object):
         self.gps_mb_dir = np.nan
         self.gps_mb_spd_mps = np.nan
         self.gps_flow_spd_mps = np.nan
-        
-    def populate_data(self, source, file=None, test_type=None):
+
+    def populate_data(self, source, snr_3beam_comp=False, file=None, test_type=None):
         """Process and store moving-bed test data.
 
         Parameters
@@ -125,56 +134,59 @@ class MovingBedTests(object):
             Object of TransectData for TRDI and str of filename for SonTek
         test_type: str
             Type of moving-bed test (Loop or Stationary)
+        snr_3beam_comp: bool
+            Indicates is 3 beam solutions should be used for invalid snr data
         """
 
-        if source == 'TRDI':
+        if source == "TRDI":
             self.mb_trdi(file, test_type)
         else:
-            self.mb_sontek(file, test_type)
+            self.mb_sontek(file, test_type, snr_3beam_comp)
 
         self.process_mb_test(source)
 
     def process_mb_test(self, source):
-        
+
         # Convert to earth coordinates and set the navigation reference to BT
         # for both boat and water data
-        # self.transect.boat_vel.bt_vel.apply_interpolation(transect=self.transect, interpolation_method='Linear')
-        self.transect.change_coord_sys(new_coord_sys='Earth')
-        self.transect.change_nav_reference(update=True, new_nav_ref='BT')
-            
-        # Adjust data for default manufacturer specific handling of invalid data
-        delta_t = adjusted_ensemble_duration(self.transect, 'mbt')
-        
-        if self.type == 'Loop':
-            if source == 'TRDI':
+        self.transect.change_coord_sys(new_coord_sys="Earth")
+        self.transect.change_nav_reference(update=True, new_nav_ref="BT")
+
+        # Adjust data for default manufacturer specific handling of invalid
+        # data
+        delta_t = adjusted_ensemble_duration(self.transect, "mbt")
+
+        if self.type == "Loop":
+            if source == "TRDI":
                 self.loop_test(delta_t)
             else:
                 self.loop_test()
-        elif self.type == 'Stationary':
+        elif self.type == "Stationary":
             self.stationary_test()
         else:
-            raise ValueError('Invalid moving-bed test identifier specified.')
+            raise ValueError("Invalid moving-bed test identifier specified.")
 
     @staticmethod
     def qrev_mat_in(meas_struct):
-        """Processes the Matlab data structure to obtain a list of TransectData objects containing transect
-           data from the Matlab data structure.
+        """Processes the Matlab data structure to obtain a list of
+         TransectData objects containing transect data from the Matlab data structure.
 
-       Parameters
-       ----------
-       meas_struct: mat_struct
-           Matlab data structure obtained from sio.loadmat
+        Parameters
+        ----------
+        meas_struct: mat_struct
+            Matlab data structure obtained from sio.loadmat
 
-       Returns
-       -------
-       mb_tests: list
-           List of MovingBedTests objects
-       """
+        Returns
+        -------
+        mb_tests: list
+            List of MovingBedTests objects
+        """
 
         mb_tests = []
-        if hasattr(meas_struct, 'mbTests'):
+        if hasattr(meas_struct, "mbTests"):
             try:
-                # If there are multiple test the Matlab structure will be an array
+                # If there are multiple test the Matlab structure will be an
+                # array
                 if type(meas_struct.mbTests) == np.ndarray:
                     for test in meas_struct.mbTests:
                         temp = MovingBedTests()
@@ -190,7 +202,8 @@ class MovingBedTests(object):
         return mb_tests
 
     def populate_from_qrev_mat(self, mat_data):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -231,7 +244,7 @@ class MovingBedTests(object):
         self.stationary_mb_vel = mat_data.stationaryMBVel
 
         # Feature that can use GPS for moving-bed tests
-        if hasattr(mat_data, 'bt_percent_mb'):
+        if hasattr(mat_data, "bt_percent_mb"):
             self.bt_percent_mb = self.return_float(mat_data.bt_percent_mb)
             self.bt_dist_us_m = self.return_float(mat_data.bt_dist_us_m)
             self.bt_mb_dir = self.return_float(mat_data.bt_mb_dir)
@@ -270,11 +283,12 @@ class MovingBedTests(object):
 
     @staticmethod
     def make_list(array_in):
-        """Method to make list from several special cases that can occur in the Matlab data.
+        """Method to make list from several special cases that can occur in
+        the Matlab data.
 
         Parameters
         ----------
-        array_in: np.ndarray
+        array_in: np.array
             Input that needs to be convert to a list
         """
 
@@ -302,12 +316,12 @@ class MovingBedTests(object):
             Object of TransectData
         test_type: str
             Type of moving-bed test."""
-        
+
         self.transect = transect
         self.user_valid = True
         self.type = test_type
 
-    def mb_sontek(self, file_name, test_type):
+    def mb_sontek(self, file_name, test_type, snr_3beam_comp):
         """Function to create object properties for SonTek moving-bed tests
 
         Parameters
@@ -315,7 +329,10 @@ class MovingBedTests(object):
         file_name: str
             Name of moving-bed test data file
         test_type: str
-            Type of moving-bed test."""
+            Type of moving-bed test.
+        snr_3beam_comp: bool
+            Indicates is 3 beam solutions should be used for invalid snr data
+        """
         self.type = test_type
 
         # Read Matlab file for moving-bed test
@@ -323,9 +340,9 @@ class MovingBedTests(object):
 
         # Create transect objects for each discharge transect
         self.transect = TransectData()
-        self.transect.sontek(rsdata, file_name)
-        
-    def loop_test(self, ens_duration=None, ref='BT'):
+        self.transect.sontek(rsdata, file_name, snr_3beam_comp=snr_3beam_comp)
+
+    def loop_test(self, ens_duration=None, ref="BT"):
         """Process loop moving bed test.
 
         Parameters
@@ -337,8 +354,10 @@ class MovingBedTests(object):
         """
 
         # Assign data from transect to local variables
-        # self.transect.boat_interpolations(update=False, target='BT', method='Linear')
-        # self.transect.boat_interpolations(update=False, target='GPS', method='Linear')
+        # self.transect.boat_interpolations(update=False, target='BT',
+        # method='Linear')
+        # self.transect.boat_interpolations(update=False, target='GPS',
+        # method='Linear')
         trans_data = copy.deepcopy(self.transect)
         in_transect_idx = trans_data.in_transect_idx
         n_ensembles = len(in_transect_idx)
@@ -382,14 +401,22 @@ class MovingBedTests(object):
 
             # Compute flow speed and direction
             self.flow_dir = rad2azdeg(direct)
-            
+
             # Compute the area weighted mean velocity components for the
-            # purposed of computing the mean flow speed. Area weighting is used for flow speed instead of
-            # discharge so that the flow speed is not included in the weighting used to compute the mean flow speed.
-            wght_area = np.multiply(np.multiply(np.sqrt(bt_u ** 2 + bt_v ** 2), bin_size), ens_duration)
-            idx = np.where(np.isnan(wt_u) == False)
-            se = np.nansum(np.nansum(wt_u[idx] * wght_area[idx])) / np.nansum(np.nansum(wght_area[idx]))
-            sn = np.nansum(np.nansum(wt_v[idx] * wght_area[idx])) / np.nansum(np.nansum(wght_area[idx]))
+            # purposed of computing the mean flow speed. Area weighting is
+            # used for flow speed instead of
+            # discharge so that the flow speed is not included in the
+            # weighting used to compute the mean flow speed.
+            wght_area = np.multiply(
+                np.multiply(np.sqrt(bt_u**2 + bt_v**2), bin_size), ens_duration
+            )
+            idx = np.where(np.logical_not(np.isnan(wt_u)))
+            se = np.nansum(np.nansum(wt_u[idx] * wght_area[idx])) / np.nansum(
+                np.nansum(wght_area[idx])
+            )
+            sn = np.nansum(np.nansum(wt_v[idx] * wght_area[idx])) / np.nansum(
+                np.nansum(wght_area[idx])
+            )
             dir_a, self.bt_flow_spd_mps = cart2pol(se, sn)
             self.bt_flow_spd_mps = self.bt_flow_spd_mps + self.bt_mb_spd_mps
 
@@ -400,7 +427,7 @@ class MovingBedTests(object):
             self.compute_mb_gps()
 
             # Store selected test characteristics
-            if ref == 'BT':
+            if ref == "BT":
                 self.mb_spd_mps = self.bt_mb_spd_mps
                 self.dist_us_m = self.bt_dist_us_m
                 self.percent_mb = self.bt_percent_mb
@@ -415,9 +442,12 @@ class MovingBedTests(object):
 
             # Assess invalid bottom track
             # Compute percent invalid bottom track
-            self.percent_invalid_bt = (np.nansum(bt_valid == False) / len(bt_valid)) * 100
+            self.percent_invalid_bt = (
+                np.nansum(np.logical_not(bt_valid)) / len(bt_valid)
+            ) * 100
 
-            # Determine if more than 9 consecutive seconds of invalid BT occurred
+            # Determine if more than 9 consecutive seconds of invalid BT
+            # occurred
             consect_bt_time = np.zeros(n_ensembles)
             for n in range(1, n_ensembles):
                 if bt_valid[n]:
@@ -430,22 +460,24 @@ class MovingBedTests(object):
             # Evaluate compass calibration based on flow direction
 
             # Find apex of loop adapted from
-            # http://www.mathworks.de/matlabcentral/newsreader/view_thread/164048
+            # http://www.mathworks.de/matlabcentral/newsreader/view_thread
+            # /164048
             loop_out = np.array([bt_x[0], bt_y[0], 0])
             loop_return = np.array([bt_x[-1], bt_y[-1], 0])
 
             distance = np.zeros(n_ensembles)
             for n in range(n_ensembles):
                 p = np.array([bt_x[n], bt_y[n], 0])
-                distance[n] = np.linalg.norm(np.cross(loop_return - loop_out, p - loop_out))  \
-                    / np.linalg.norm(loop_return - loop_out)
+                distance[n] = np.linalg.norm(
+                    np.cross(loop_return - loop_out, p - loop_out)
+                ) / np.linalg.norm(loop_return - loop_out)
 
             dmg_idx = np.where(distance == np.nanmax(distance))[0][0]
 
             # Compute flow direction on outgoing part of loop
-            u_out = wt_u[:, :dmg_idx + 1]
-            v_out = wt_v[:, :dmg_idx + 1]
-            wght = np.abs(q[:, :dmg_idx+1])
+            u_out = wt_u[:, : dmg_idx + 1]
+            v_out = wt_v[:, : dmg_idx + 1]
+            wght = np.abs(q[:, : dmg_idx + 1])
             se = np.nansum(u_out * wght) / np.nansum(wght)
             sn = np.nansum(v_out * wght) / np.nansum(wght)
             direct, _ = cart2pol(se, sn)
@@ -458,22 +490,28 @@ class MovingBedTests(object):
             # Compute difference from mean and correct to +/- 180
             v_dir_corr = flow_dir_cell - flow_dir1
             v_dir_idx = nan_greater(v_dir_corr, 180)
-            v_dir_corr[v_dir_idx] = 360-v_dir_corr[v_dir_idx]
+            v_dir_corr[v_dir_idx] = 360 - v_dir_corr[v_dir_idx]
             v_dir_idx = nan_less(v_dir_corr, -180)
             v_dir_corr[v_dir_idx] = 360 + v_dir_corr[v_dir_idx]
 
             # Number of invalid weights
-            idx2 = np.where(np.isnan(wght) == False)
+            idx2 = np.where(np.logical_not(np.isnan(wght)))
             nwght = len(idx2[0])
 
             # Compute 95% uncertainty using weighted standard deviation
-            uncert1 = 2. * np.sqrt(np.nansum(np.nansum(wght * v_dir_corr**2))
-                                   / (((nwght - 1) * np.nansum(np.nansum(wght))) / nwght)) / np.sqrt(nwght)
+            uncert1 = (
+                2.0
+                * np.sqrt(
+                    np.nansum(np.nansum(wght * v_dir_corr**2))
+                    / (((nwght - 1) * np.nansum(np.nansum(wght))) / nwght)
+                )
+                / np.sqrt(nwght)
+            )
 
             # Compute flow direction on returning part of loop
-            u_ret = wt_u[:, dmg_idx + 1:]
-            v_ret = wt_v[:, dmg_idx + 1:]
-            wght = np.abs(q[:, dmg_idx+1:])
+            u_ret = wt_u[:, dmg_idx + 1 :]
+            v_ret = wt_v[:, dmg_idx + 1 :]
+            wght = np.abs(q[:, dmg_idx + 1 :])
             se = np.nansum(u_ret * wght) / np.nansum(wght)
             sn = np.nansum(v_ret * wght) / np.nansum(wght)
             direct, _ = cart2pol(se, sn)
@@ -491,12 +529,18 @@ class MovingBedTests(object):
             v_dir_corr[v_dir_idx] = 360 + v_dir_corr[v_dir_idx]
 
             # Number of valid weights
-            idx2 = np.where(np.isnan(wght) == False)
+            idx2 = np.where(np.logical_not(np.isnan(wght)))
             nwght = len(idx2[0])
 
             # Compute 95% uncertainty using weighted standard deviation
-            uncert2 = 2.*np.sqrt(np.nansum(np.nansum(wght * v_dir_corr**2))
-                                 / (((nwght-1)*np.nansum(np.nansum(wght))) / nwght)) / np.sqrt(nwght)
+            uncert2 = (
+                2.0
+                * np.sqrt(
+                    np.nansum(np.nansum(wght * v_dir_corr**2))
+                    / (((nwght - 1) * np.nansum(np.nansum(wght))) / nwght)
+                )
+                / np.sqrt(nwght)
+            )
 
             # Compute and report difference in flow direction
             diff_dir = np.abs(flow_dir1 - flow_dir2)
@@ -506,93 +550,140 @@ class MovingBedTests(object):
             uncert = uncert1 + uncert2
 
             # Compute potential compass error
-            idx = np.where(np.isnan(bt_x) == False)
+            idx = np.where(np.logical_not(np.isnan(bt_x)))
             if len(idx[0]) > 0:
                 idx = idx[0][-1]
-            width = np.sqrt((bt_x[dmg_idx] - bt_x[idx] / 2) ** 2 + (bt_y[dmg_idx] - bt_y[idx] / 2) ** 2)
-            compass_error = (2 * width * sind(diff_dir / 2) * 100) / (self.duration_sec * self.flow_spd_mps)
+            width = np.sqrt(
+                (bt_x[dmg_idx] - bt_x[idx] / 2) ** 2
+                + (bt_y[dmg_idx] - bt_y[idx] / 2) ** 2
+            )
+            compass_error = (2 * width * sind(diff_dir / 2) * 100) / (
+                self.duration_sec * self.flow_spd_mps
+            )
 
             # Initialize message counter
-            self.test_quality = 'Good'
+            self.test_quality = "Good"
 
             # Low water velocity
             if self.flow_spd_mps < 0.25:
-                self.messages.append('WARNING: The water velocity is less than recommended minimum for '
-                                     + 'this test and could cause the loop method to be inaccurate. '
-                                     + 'CONSIDER USING A STATIONARY TEST TO CHECK MOVING-BED CONDITIONS')
-                self.test_quality = 'Warnings'
+                self.messages.append(
+                    "WARNING: The water velocity is less than recommended "
+                    "minimum for " + "this test and could cause the loop method to be "
+                    "inaccurate. "
+                    + "CONSIDER USING A STATIONARY TEST TO CHECK MOVING-BED "
+                    "CONDITIONS"
+                )
+                self.test_quality = "Warnings"
 
             # Percent invalid bottom track
             if self.percent_invalid_bt > 20:
-                self.messages.append('ERROR: Percent invalid bottom track exceeds 20 percent. '
-                                     + 'THE LOOP IS NOT ACCURATE. TRY A STATIONARY MOVING-BED TEST.')
-                self.test_quality = 'Errors'
+                self.messages.append(
+                    "ERROR: Percent invalid bottom track exceeds 20 percent. "
+                    + "THE LOOP IS NOT ACCURATE. TRY A STATIONARY MOVING-BED "
+                    "TEST."
+                )
+                self.test_quality = "Errors"
             elif self.percent_invalid_bt > 5:
-                self.messages.append('WARNING: Percent invalid bottom track exceeds 5 percent. '
-                                     + 'Loop may not be accurate. PLEASE REVIEW DATA.')
-                self.test_quality = 'Warnings'
+                self.messages.append(
+                    "WARNING: Percent invalid bottom track exceeds 5 percent. "
+                    + "Loop may not be accurate. PLEASE REVIEW DATA."
+                )
+                self.test_quality = "Warnings"
 
             # More than 9 consecutive seconds of invalid BT
             if max_consect_bt_time > 9:
-                self.messages.append('ERROR: Bottom track is invalid for more than 9 consecutive seconds.'
-                                     + 'THE LOOP IS NOT ACCURATE. TRY A STATIONARY MOVING-BED TEST.')
-                self.test_quality = 'Errors'
-
-            if np.abs(compass_error) > 5 and np.abs(diff_dir) > 3 and np.abs(diff_dir) > uncert:
-                self.messages.append('ERROR: Difference in flow direction between out and back sections of '
-                                     + 'loop could result in a 5 percent or greater error in final discharge. '
-                                     + 'REPEAT LOOP AFTER COMPASS CAL. OR USE A STATIONARY MOVING-BED TEST.')
-                self.test_quality = 'Errors'
+                self.messages.append(
+                    "ERROR: Bottom track is invalid for more than 9 "
+                    "consecutive seconds."
+                    + "THE LOOP IS NOT ACCURATE. TRY A STATIONARY MOVING-BED "
+                    "TEST."
+                )
+                self.test_quality = "Errors"
+
+            if (
+                np.abs(compass_error) > 5
+                and np.abs(diff_dir) > 3
+                and np.abs(diff_dir) > uncert
+            ):
+                self.messages.append(
+                    "ERROR: Difference in flow direction between out and "
+                    "back sections of "
+                    + "loop could result in a 5 percent or greater error in "
+                    "final discharge. "
+                    + "REPEAT LOOP AFTER COMPASS CAL. OR USE A STATIONARY "
+                    "MOVING-BED TEST."
+                )
+                self.test_quality = "Errors"
 
         else:
-            self.messages.append('ERROR: Loop has no valid bottom track data. '
-                                 + 'REPEAT OR USE A STATIONARY MOVING-BED TEST.')
-            self.test_quality = 'Errors'
+            self.messages.append(
+                "ERROR: Loop has no valid bottom track data. "
+                + "REPEAT OR USE A STATIONARY MOVING-BED "
+                "TEST."
+            )
+            self.test_quality = "Errors"
 
         # If loop is valid then evaluate moving-bed condition
-        if self.test_quality != 'Errors':
+        if self.test_quality != "Errors":
 
             # Check minimum moving-bed velocity criteria
             if self.mb_spd_mps > vel_criteria:
                 # Check that closure error is in upstream direction
                 if 135 < np.abs(self.flow_dir - self.mb_dir) < 225:
-                    # Check if moving-bed is greater than 1% of the mean flow speed
+                    # Check if moving-bed is greater than 1% of the mean
+                    # flow speed
                     if self.percent_mb > 1:
-                        self.messages.append('Loop Indicates a Moving Bed -- Use GPS as reference. If GPS is '
-                                             + 'unavailable or invalid use the loop method to correct the '
-                                             + 'final discharge.')
-                        self.moving_bed = 'Yes'
+                        self.messages.append(
+                            "Loop Indicates a Moving Bed -- Use GPS as "
+                            "reference. If GPS is "
+                            + "unavailable or invalid use the loop method to "
+                            "correct the " + "final discharge."
+                        )
+                        self.moving_bed = "Yes"
                     else:
-                        self.messages.append('Moving Bed Velocity < 1% of Mean Velocity -- No Correction Recommended')
-                        self.moving_bed = 'No'
+                        self.messages.append(
+                            "Moving Bed Velocity < 1% of Mean Velocity -- No "
+                            "Correction Recommended"
+                        )
+                        self.moving_bed = "No"
                 else:
-                    self.messages.append('ERROR: Loop closure error not in upstream direction. '
-                                         + 'REPEAT LOOP or USE STATIONARY TEST')
-                    self.test_quality = 'Errors'
-                    self.moving_bed = 'Unknown'
+                    self.messages.append(
+                        "ERROR: Loop closure error not in upstream direction. "
+                        + "REPEAT LOOP or USE STATIONARY TEST"
+                    )
+                    self.test_quality = "Errors"
+                    self.moving_bed = "Unknown"
             else:
-                self.messages.append('Moving-bed velocity < Minimum moving-bed velocity criteria '
-                                     + '-- No correction recommended')
-                self.moving_bed = 'No'
+                self.messages.append(
+                    "Moving-bed velocity < Minimum moving-bed velocity "
+                    "criteria " + "-- No correction recommended"
+                )
+                self.moving_bed = "No"
 
             # Notify of differences in results of test between BT and GPS
             if not np.isnan(self.gps_percent_mb):
                 if np.abs(self.bt_percent_mb - self.gps_percent_mb) > 2:
-                    self.messages.append('WARNING - Bottom track and GPS results differ by more than 2%.')
-                    self.test_quality = 'Warnings'
-
-                if np.logical_xor(self.bt_percent_mb >= 1,  self.gps_percent_mb >= 1):
-                    self.messages.append('WARNING - Bottom track and GPS results do not agree.')
-                    self.test_quality = 'Warnings'
+                    self.messages.append(
+                        "WARNING - Bottom track and GPS results differ by "
+                        "more than 2%."
+                    )
+                    self.test_quality = "Warnings"
+
+                if np.logical_xor(self.bt_percent_mb >= 1, self.gps_percent_mb >= 1):
+                    self.messages.append(
+                        "WARNING - Bottom track and GPS results do not agree."
+                    )
+                    self.test_quality = "Warnings"
 
         else:
-            self.messages.append('ERROR: Due to ERRORS noted above this loop is NOT VALID. '
-                                 + 'Please consider suggestions.')
-            self.moving_bed = 'Unknown'
+            self.messages.append(
+                "ERROR: Due to ERRORS noted above this loop is NOT VALID. "
+                + "Please consider suggestions."
+            )
+            self.moving_bed = "Unknown"
 
-    def stationary_test(self, ref='BT'):
-        """Processed the stationary moving-bed tests.
-        """
+    def stationary_test(self, ref="BT"):
+        """Processed the stationary moving-bed tests."""
 
         # Assign data from transect to local variables
         trans_data = copy.deepcopy(self.transect)
@@ -611,10 +702,10 @@ class MovingBedTests(object):
 
             # Use only data with valid bottom track
             valid_bt = trans_data.boat_vel.bt_vel.valid_data[0, in_transect_idx]
-            wt_u[:, valid_bt == False] = np.nan
-            wt_v[:, valid_bt == False] = np.nan
-            bt_u[valid_bt == False] = np.nan
-            bt_v[valid_bt == False] = np.nan
+            wt_u[:, np.logical_not(valid_bt)] = np.nan
+            wt_v[:, np.logical_not(valid_bt)] = np.nan
+            bt_u[np.logical_not(valid_bt)] = np.nan
+            bt_v[np.logical_not(valid_bt)] = np.nan
 
             u_water = np.nanmean(wt_u)
             v_water = np.nanmean(wt_v)
@@ -622,12 +713,16 @@ class MovingBedTests(object):
             if self.flow_dir < 0:
                 self.flow_dir = self.flow_dir + 360
 
-            bin_depth = trans_data.depths.bt_depths.depth_cell_depth_m[:, in_transect_idx]
+            bin_depth = trans_data.depths.bt_depths.depth_cell_depth_m[
+                :, in_transect_idx
+            ]
             trans_select = getattr(trans_data.depths, trans_data.depths.selected)
             depth_ens = trans_select.depth_processed_m[in_transect_idx]
 
-            nb_u, nb_v, unit_nbu, unit_nbv = self.near_bed_velocity(wt_u, wt_v, depth_ens, bin_depth)
-            
+            nb_u, nb_v, unit_nbu, unit_nbv = self.near_bed_velocity(
+                wt_u, wt_v, depth_ens, bin_depth
+            )
+
             # Compute bottom track parallel to water velocity
             unit_nb_vel = np.vstack([unit_nbu, unit_nbv])
             bt_vel = np.vstack([bt_u, bt_v])
@@ -643,9 +738,9 @@ class MovingBedTests(object):
             bt_vel_cs = np.sum(bt_vel * nb_vel_unit_cs, 0)
             bt_cs_strm_dist = bt_vel_cs * ens_duration
             bt_cs_strm_dist_cum = np.nancumsum(bt_cs_strm_dist)
-            
+
             # Compute cumulative mean moving bed velocity
-            valid_bt_vel_up_strm = np.isnan(bt_vel_up_strm) == False
+            valid_bt_vel_up_strm = np.logical_not(np.isnan(bt_vel_up_strm))
 
             mb_vel = np.nancumsum(bt_vel_up_strm) / np.nancumsum(valid_bt_vel_up_strm)
 
@@ -656,17 +751,22 @@ class MovingBedTests(object):
             else:
                 u_corrected = wt_u
                 v_corrected = wt_v
-                
+
             # Compute the mean of the ensemble magnitudes
 
-            # Mean is computed using magnitudes because if a Streampro with no compass is the data source the change
-            # in direction could be either real change in water direction or an uncompensated turn of the floating
-            # platform. This approach is the best compromise when there is no compass or the compass is unreliable,
-            # which is often why the stationary method is used. A weighted average is used to account for the possible
-            # change in cell size within and ensemble for the RiverRay and RiverPro.
+            # Mean is computed using magnitudes because if a Streampro with
+            # no compass is the data source the change in direction could be
+            # either real change in water direction or an uncompensated turn of
+            # the floating platform. This approach is the best compromise when
+            # there is no compass or the compass is unreliable,
+            # which is often why the stationary method is used. A weighted
+            # average is used to account for the possible cell size within and
+            # ensemble for the RiverRay and RiverPro.
 
             mag = np.sqrt(u_corrected**2 + v_corrected**2)
-            depth_cell_size = trans_data.depths.bt_depths.depth_cell_size_m[:, in_transect_idx]
+            depth_cell_size = trans_data.depths.bt_depths.depth_cell_size_m[
+                :, in_transect_idx
+            ]
             depth_cell_size[np.isnan(mag)] = np.nan
             mag_w = mag * depth_cell_size
             self.bt_flow_spd_mps = np.nansum(mag_w) / np.nansum(depth_cell_size)
@@ -676,14 +776,16 @@ class MovingBedTests(object):
                 self.bt_percent_mb = 0
 
             # Compute percent invalid bottom track
-            self.percent_invalid_bt = (np.nansum(bt_valid == False) / len(bt_valid)) * 100
+            self.percent_invalid_bt = (
+                np.nansum(np.logical_not(bt_valid)) / len(bt_valid)
+            ) * 100
             self.duration_sec = np.nansum(ens_duration)
 
             # Compute test using GPS
             self.compute_mb_gps()
 
             # Store selected test characteristics
-            if ref == 'BT':
+            if ref == "BT":
                 self.mb_spd_mps = self.bt_mb_spd_mps
                 self.dist_us_m = self.bt_dist_us_m
                 self.percent_mb = self.bt_percent_mb
@@ -696,67 +798,91 @@ class MovingBedTests(object):
                 self.mb_dir = self.gps_mb_dir
                 self.flow_spd_mps = self.bt_flow_spd_mps
 
-            self.near_bed_speed_mps = np.sqrt(np.nanmean(nb_u)**2 + np.nanmean(nb_v)**2)
+            self.near_bed_speed_mps = np.sqrt(
+                np.nanmean(nb_u) ** 2 + np.nanmean(nb_v) ** 2
+            )
             self.stationary_us_track = bt_up_strm_dist_cum
             self.stationary_cs_track = bt_cs_strm_dist_cum
             self.stationary_mb_vel = mb_vel
 
             # Quality check
-            self.test_quality = 'Good'
+            self.test_quality = "Good"
             # Check duration
             if self.duration_sec < 299:
-                self.messages.append('WARNING - Duration of stationary test is less than 5 minutes')
-                self.test_quality = 'Warnings'
-                
+                self.messages.append(
+                    "WARNING - Duration of stationary test is less than 5 " "minutes"
+                )
+                self.test_quality = "Warnings"
+
             # Check validity of mean moving-bed velocity
             if self.duration_sec > 60:
                 mb_vel_std = np.nanstd(mb_vel[-30:], ddof=1)
                 cov = mb_vel_std / mb_vel[-1]
                 if cov > 0.25 and mb_vel_std > 0.03:
-                    self.messages.append('WARNING - Moving-bed velocity may not be consistent. '
-                                         + 'Average maybe inaccurate.')
-                    self.test_quality = 'Warnings'
-                    
+                    self.messages.append(
+                        "WARNING - Moving-bed velocity may not be consistent. "
+                        + "Average maybe inaccurate."
+                    )
+                    self.test_quality = "Warnings"
+
             # Check percentage of invalid BT data
             if np.nansum(ens_duration[valid_bt_vel_up_strm]) <= 120:
-                
-                self.messages.append('ERROR - Total duration of valid BT data is insufficient for a valid test.')
-                self.test_quality = 'Errors'
-                self.moving_bed = 'Unknown'
+
+                self.messages.append(
+                    "ERROR - Total duration of valid BT data is insufficient "
+                    "for a valid test."
+                )
+                self.test_quality = "Errors"
+                self.moving_bed = "Unknown"
             elif self.percent_invalid_bt > 10:
-                self.messages.append('WARNING - Number of ensembles with invalid bottom track exceeds 10%')
-                self.test_quality = 'Warnings'
-                
+                self.messages.append(
+                    "WARNING - Number of ensembles with invalid bottom track "
+                    "exceeds 10%"
+                )
+                self.test_quality = "Warnings"
+
             # Determine if the test indicates a moving bed
-            if self.test_quality != 'Errors':
+            if self.test_quality != "Errors":
                 if self.percent_mb >= 1:
-                    self.moving_bed = 'Yes'
+                    self.moving_bed = "Yes"
                 else:
-                    self.moving_bed = 'No'
+                    self.moving_bed = "No"
 
             # Notify of differences in results of test between BT and GPS
             if not np.isnan(self.gps_percent_mb):
                 if np.abs(self.bt_percent_mb - self.gps_percent_mb) > 2:
-                    self.messages.append('WARNING - Bottom track and GPS results differ by more than 2%.')
-                    self.test_quality = 'Warnings'
-
-                if np.logical_xor(self.bt_percent_mb >= 1,  self.gps_percent_mb >= 1):
-                    self.messages.append('WARNING - Bottom track and GPS results do not agree.')
-                    self.test_quality = 'Warnings'
+                    self.messages.append(
+                        "WARNING - Bottom track and GPS results differ by "
+                        "more than 2%."
+                    )
+                    self.test_quality = "Warnings"
+
+                if np.logical_xor(self.bt_percent_mb >= 1, self.gps_percent_mb >= 1):
+                    self.messages.append(
+                        "WARNING - Bottom track and GPS results do not agree."
+                    )
+                    self.test_quality = "Warnings"
 
         else:
-            self.messages.append('ERROR - Stationary moving-bed test has no valid bottom track data.')
-            self.test_quality = 'Errors'
-            self.moving_bed = 'Unknown'
-            self.duration_sec = np.nansum(trans_data.date_time.ens_duration_sec[in_transect_idx])
+            self.messages.append(
+                "ERROR - Stationary moving-bed test has no valid bottom " "track data."
+            )
+            self.test_quality = "Errors"
+            self.moving_bed = "Unknown"
+            self.duration_sec = np.nansum(
+                trans_data.date_time.ens_duration_sec[in_transect_idx]
+            )
             self.percent_invalid_bt = 100
 
     def compute_mb_gps(self):
-        """Computes moving-bed data using GPS.
-        """
+        """Computes moving-bed data using GPS."""
         if np.isnan(self.flow_dir):
-            u_water = np.nanmean(self.transect.w_vel.u_processed_mps[:, self.transect.in_transect_idx])
-            v_water = np.nanmean(self.transect.w_vel.v_processed_mps[:, self.transect.in_transect_idx])
+            u_water = np.nanmean(
+                self.transect.w_vel.u_processed_mps[:, self.transect.in_transect_idx]
+            )
+            v_water = np.nanmean(
+                self.transect.w_vel.v_processed_mps[:, self.transect.in_transect_idx]
+            )
             self.flow_dir = np.arctan2(u_water, v_water) * 180 / np.pi
             if self.flow_dir < 0:
                 self.flow_dir = self.flow_dir + 360
@@ -764,14 +890,16 @@ class MovingBedTests(object):
         gps_bt = None
         # Use GGA data if available and VTG is GGA is not available
         if self.transect.boat_vel.gga_vel is not None:
-            gps_bt = TransectData.compute_gps_bt(self.transect, gps_ref='gga_vel')
+            gps_bt = TransectData.compute_gps_bt(self.transect, gps_ref="gga_vel")
         elif self.transect.boat_vel.vtg_vel is not None:
-            gps_bt = TransectData.compute_gps_bt(self.transect, gps_ref='vtg_vel')
+            gps_bt = TransectData.compute_gps_bt(self.transect, gps_ref="vtg_vel")
         if gps_bt is not None and len(gps_bt) > 0:
-            self.gps_dist_us_m = gps_bt['mag']
-            self.gps_mb_dir = gps_bt['dir']
+            self.gps_dist_us_m = gps_bt["mag"]
+            self.gps_mb_dir = gps_bt["dir"]
             self.gps_mb_spd_mps = self.gps_dist_us_m / self.duration_sec
-            self.gps_flow_spd_mps = self.bt_flow_spd_mps - self.bt_mb_spd_mps + self.gps_mb_spd_mps
+            self.gps_flow_spd_mps = (
+                self.bt_flow_spd_mps - self.bt_mb_spd_mps + self.gps_mb_spd_mps
+            )
             self.gps_percent_mb = (self.gps_mb_spd_mps / self.gps_flow_spd_mps) * 100
 
     def magvar_change(self, magvar, old_magvar):
@@ -785,12 +913,13 @@ class MovingBedTests(object):
             Existing magvar
         """
 
-        if self.transect.sensors.heading_deg.selected == 'internal':
+        if self.transect.sensors.heading_deg.selected == "internal":
             magvar_change = magvar - old_magvar
             self.bt_mb_dir = self.bt_mb_dir + magvar_change
             self.flow_dir = self.flow_dir + magvar_change
 
-            # Recompute moving-bed tests with GPS and set results using existing reference
+            # Recompute moving-bed tests with GPS and set results using
+            # existing reference
             self.compute_mb_gps()
             self.change_ref(self.ref)
 
@@ -805,12 +934,13 @@ class MovingBedTests(object):
             Existing h_offset
         """
 
-        if self.transect.sensors.heading_deg.selected == 'external':
+        if self.transect.sensors.heading_deg.selected == "external":
             h_offset_change = h_offset - old_h_offset
             self.bt_mb_dir = self.bt_mb_dir + h_offset_change
             self.flow_dir = self.flow_dir + h_offset_change
 
-            # Recompute moving-bed tests with GPS and set results using existing reference
+            # Recompute moving-bed tests with GPS and set results using
+            # existing reference
             self.compute_mb_gps()
             self.change_ref(self.ref)
 
@@ -823,60 +953,63 @@ class MovingBedTests(object):
             Defines specified reference (BT or GPS)
         """
 
-        if ref == 'BT':
+        if ref == "BT":
             self.mb_spd_mps = self.bt_mb_spd_mps
             self.dist_us_m = self.bt_dist_us_m
             self.percent_mb = self.bt_percent_mb
             self.mb_dir = self.bt_mb_dir
             self.flow_spd_mps = self.bt_flow_spd_mps
-            self.ref = 'BT'
+            self.ref = "BT"
             check_mb = True
-            if self.test_quality != 'Errors':
-                if self.type == 'Loop':
+            if self.test_quality != "Errors":
+                if self.type == "Loop":
                     if self.mb_spd_mps <= 0.012:
                         check_mb = False
-                        self.moving_bed = 'No'
+                        self.moving_bed = "No"
                     else:
                         if 135 < np.abs(self.flow_dir - self.mb_dir) < 225:
                             check_mb = True
                         else:
                             check_mb = False
-                            self.moving_bed = 'Unknown'
+                            self.moving_bed = "Unknown"
                 if check_mb:
                     if self.percent_mb > 1:
-                        self.moving_bed = 'Yes'
+                        self.moving_bed = "Yes"
                     else:
-                        self.moving_bed = 'No'
+                        self.moving_bed = "No"
             else:
-                self.moving_bed = 'Unknown'
-        elif ref == 'GPS':
+                self.moving_bed = "Unknown"
+        elif ref == "GPS":
             self.mb_spd_mps = self.gps_mb_spd_mps
             self.dist_us_m = self.gps_dist_us_m
             self.percent_mb = self.gps_percent_mb
             self.mb_dir = self.gps_mb_dir
             self.flow_spd_mps = self.gps_flow_spd_mps
-            self.ref = 'GPS'
+            self.ref = "GPS"
             check_mb = True
-            if self.test_quality != 'Errors':
-                if self.type == 'Loop':
+            if self.test_quality != "Errors":
+                if self.type == "Loop":
                     if self.mb_spd_mps <= 0.012:
                         check_mb = False
-                        self.moving_bed = 'No'
+                        self.moving_bed = "No"
                     else:
                         if 135 < np.abs(self.flow_dir - self.mb_dir) < 225:
                             check_mb = True
                         else:
                             check_mb = False
-                            self.messages.append('ERROR: GPS Loop closure error not in upstream direction. '
-                                                 + 'REPEAT LOOP or USE STATIONARY TEST')
-                            self.moving_bed = 'Unknown'
+                            self.messages.append(
+                                "ERROR: GPS Loop closure error not in "
+                                "upstream direction. "
+                                + "REPEAT LOOP or USE STATIONARY TEST"
+                            )
+                            self.moving_bed = "Unknown"
                 if check_mb:
                     if self.percent_mb > 1:
-                        self.moving_bed = 'Yes'
+                        self.moving_bed = "Yes"
                     else:
-                        self.moving_bed = 'No'
+                        self.moving_bed = "No"
             else:
-                self.moving_bed = 'Unknown'
+                self.moving_bed = "Unknown"
 
     @staticmethod
     def near_bed_velocity(u, v, depth, bin_depth):
@@ -921,7 +1054,7 @@ class MovingBedTests(object):
 
         # Compute near bed velocity for each ensemble
         for n in range(n_ensembles):
-            idx = np.where(np.isnan(u[:, n]) == False)
+            idx = np.where(np.logical_not(np.isnan(u[:, n])))
             if len(idx[-1]) > 0:
                 if len(idx[-1]) > 0:
                     idx = idx[-1][-2::]
@@ -931,8 +1064,12 @@ class MovingBedTests(object):
                 z_depth[n] = depth[n] - np.nanmean(bin_depth[idx, n], 0)
                 u_mean[n] = np.nanmean(u[idx, n], 0)
                 v_mean[n] = np.nanmean(v[idx, n], 0)
-                nb_u[n] = (u_mean[n] / z_depth[n] ** (1. / 6.)) * (z_near_bed[n] ** (1. / 6.))
-                nb_v[n] = (v_mean[n] / z_depth[n] ** (1. / 6.)) * (z_near_bed[n] ** (1. / 6.))
+                nb_u[n] = (u_mean[n] / z_depth[n] ** (1.0 / 6.0)) * (
+                    z_near_bed[n] ** (1.0 / 6.0)
+                )
+                nb_v[n] = (v_mean[n] / z_depth[n] ** (1.0 / 6.0)) * (
+                    z_near_bed[n] ** (1.0 / 6.0)
+                )
                 speed_near_bed[n] = np.sqrt(nb_u[n] ** 2 + nb_v[n] ** 2)
                 unit_nbu[n] = nb_u[n] / speed_near_bed[n]
                 unit_nbv[n] = nb_v[n] / speed_near_bed[n]
@@ -942,7 +1079,8 @@ class MovingBedTests(object):
     @staticmethod
     def auto_use_2_correct(moving_bed_tests, boat_ref=None):
         """Apply logic to determine which moving-bed tests should be used
-        for correcting bottom track referenced discharges with moving-bed conditions.
+        for correcting bottom track referenced discharges with moving-bed
+        conditions.
 
         Parameters
         ----------
@@ -969,33 +1107,37 @@ class MovingBedTests(object):
                 test.use_2_correct = False
                 test.selected = False
                 # Valid test according to user
-                lidx_user.append(test.user_valid == True)
+                lidx_user.append(test.user_valid)
                 # Valid test according to quality assessment
-                lidx_no_errors.append(test.test_quality != 'Errors')
+                lidx_no_errors.append(test.test_quality != "Errors")
                 # Identify type of test
                 test_type.append(test.type)
-                lidx_stationary.append(test.type == 'Stationary')
-                lidx_loop.append(test.type == 'Loop')
+                lidx_stationary.append(test.type == "Stationary")
+                lidx_loop.append(test.type == "Loop")
                 flow_speed.append(test.flow_spd_mps)
 
             # Combine
-            lidx_valid_loop = np.all(np.vstack((lidx_user, lidx_no_errors, lidx_loop)), 0)
-            lidx_valid_stationary = np.all(np.vstack((lidx_user, lidx_no_errors, lidx_stationary)), 0)
+            lidx_valid_loop = np.all(
+                np.vstack((lidx_user, lidx_no_errors, lidx_loop)), 0
+            )
+            lidx_valid_stationary = np.all(
+                np.vstack((lidx_user, lidx_no_errors, lidx_stationary)), 0
+            )
 
             # Check flow speed
             lidx_flow_speed = np.array(flow_speed) > 0.25
 
             # Determine if there are valid loop tests
-            # This is the code in matlab but I don't think it is correct. I the valid loop should also have a valid
-            # flow speed, if not then a stationary test, if available could be used.
-            lidx_loops_2_select = np.all(np.vstack((lidx_flow_speed, lidx_valid_loop)), 0)
+            lidx_loops_2_select = np.all(
+                np.vstack((lidx_flow_speed, lidx_valid_loop)), 0
+            )
             if np.any(lidx_loops_2_select):
                 # Select last loop
                 idx_select = np.where(lidx_loops_2_select)[0][-1]
                 test_select = moving_bed_tests[idx_select]
                 test_select.selected = True
 
-                if test_select.moving_bed == 'Yes':
+                if test_select.moving_bed == "Yes":
                     test_select.use_2_correct = True
 
             # If there are no valid loop look for valid stationary tests
@@ -1004,23 +1146,26 @@ class MovingBedTests(object):
                 for n, lidx in enumerate(lidx_valid_stationary):
                     if lidx:
                         moving_bed_tests[n].selected = True
-                        # Determine if any stationary test resulted in a moving bed
-                        if moving_bed_tests[n].moving_bed == 'Yes':
+                        # Determine if any stationary test resulted in a
+                        # moving bed
+                        if moving_bed_tests[n].moving_bed == "Yes":
                             moving_bed.append(True)
                         else:
                             moving_bed.append(False)
-                # If any stationary test shows a moving-bed use all valid stationary test to correct BT discharge
+                # If any stationary test shows a moving-bed use all valid
+                # stationary test to correct BT discharge
                 if any(moving_bed) > 0:
                     for n, test in enumerate(moving_bed_tests):
                         if lidx_valid_stationary[n]:
                             test.use_2_correct = True
 
-            # If the flow speed is too low but there are not valid stationary tests use the last loop test.
+            # If the flow speed is too low but there are not valid stationary
+            # tests use the last loop test.
             elif np.any(lidx_valid_loop):
                 # Select last loop
                 idx_select = np.where(lidx_valid_loop)[0][-1]
                 moving_bed_tests[idx_select].selected = True
-                if moving_bed_tests[idx_select].moving_bed == 'Yes':
+                if moving_bed_tests[idx_select].moving_bed == "Yes":
                     moving_bed_tests[idx_select].use_2_correct = True
 
             # If the navigation reference for discharge computations is set
@@ -1028,11 +1173,11 @@ class MovingBedTests(object):
             # selected test should be used to determine if there is a valid
             # moving-bed and a moving-bed condition.
             if boat_ref is None:
-                ref = 'BT'
+                ref = "BT"
             else:
                 ref = boat_ref
 
-            if ref != 'BT':
+            if ref != "BT":
                 for test in moving_bed_tests:
                     test.use_2_correct = False
         return moving_bed_tests
diff --git a/qrevint_22_06_22/Classes/MultiThread.py b/Classes/MultiThread.py
similarity index 94%
rename from qrevint_22_06_22/Classes/MultiThread.py
rename to Classes/MultiThread.py
index 51d4580b93f88df719e852dd8602b64f92f2443c..c1543ac1c216e5b61dfbd527619dffc3dfaa913d 100644
--- a/qrevint_22_06_22/Classes/MultiThread.py
+++ b/Classes/MultiThread.py
@@ -7,15 +7,14 @@ import threading
 
 
 class MultiThread(threading.Thread):
-    
     def __init__(self, thread_id, function, args=None):
         threading.Thread.__init__(self)
         self.thread_id = thread_id
         self.function = function
         self.args = args
-        
+
     def run(self):
-        
+
         if self.args is not None:
             self.function(**self.args)
         else:
diff --git a/qrevint_22_06_22/Classes/NormData.py b/Classes/NormData.py
similarity index 72%
rename from qrevint_22_06_22/Classes/NormData.py
rename to Classes/NormData.py
index 9a35a845c541819425c626a467a26aaaf921dff8..2ce28e8a864b4aa1ca5a042a9394a54dd12c040b 100644
--- a/qrevint_22_06_22/Classes/NormData.py
+++ b/Classes/NormData.py
@@ -1,8 +1,14 @@
 import warnings
 import numpy as np
 import scipy.stats as sp
-from MiscLibs.common_functions import cart2pol, pol2cart, nan_less, nan_less_equal, nan_greater
-from Classes.QComp import QComp
+from MiscLibs.common_functions import (
+    cart2pol,
+    pol2cart,
+    nan_less,
+    nan_less_equal,
+    nan_greater,
+)
+
 
 class NormData(object):
     """Class creates normalized depth and unit discharge or velocity.
@@ -39,33 +45,44 @@ class NormData(object):
         Index of median values with point count greater than threshold cutoff
     weights: np.array(float)
         Discharge based weights for computing a weighted median
-    use_weights: bool
-        Specifies if discharge weighted medians are to be used in the extrapolation fit
+    use_weighted: bool
+        Specifies if discharge weighted medians are to be used in the
+        extrapolation fit
     sub_from_left: bool
-        Specifies if when subsectioning the subsection should start from left to right.
+        Specifies if when subsectioning the subsection should start from
+        left to right.
     use_q: bool
         Specifies to use the discharge rather than the xprod when subsectioning
     """
-    
+
     def __init__(self):
         """Creates object and initializes instance variables."""
-        self.file_name = None  # Name of transect file
-        self.cell_depth_normalized = None  # Normalized depth of cell
-        self.unit_normalized = None  # Normalized discharge or velocity for all depth cells
-        self.unit_normalized_med = None  # Median of normalized data within 5% partitions
-        self.unit_normalized_no = None  # Number of data points in each median
-        self.unit_normalized_z = None  # Relative depth for each median (5% increments)
-        self.unit_normalized_25 = None  # Value for which 25% of normalized values are smaller
-        self.unit_normalized_75 = None  # Value for which 75% or normalized values are larger
-        self.data_type = 'q'  # Type of data (v, q, V, or Q)
-        self.data_extent = None  # Defines percent of data from start of transect to use, default [0, 100]
-        self.valid_data = np.array([])  # Index of median values with point count greater than threshold cutoff
+        self.file_name = None
+        self.cell_depth_normalized = None
+        self.unit_normalized = None
+        self.unit_normalized_med = None
+        self.unit_normalized_no = None
+        self.unit_normalized_z = None
+        self.unit_normalized_25 = None
+        self.unit_normalized_75 = None
+        self.data_type = "q"
+        self.data_extent = None
+        self.valid_data = np.array([])
         self.weights = np.array([])
         self.use_weighted = True
         self.sub_from_left = False
         self.use_q = False
-        
-    def populate_data(self, transect, data_type, threshold, data_extent=None, use_weighted=True, sub_from_left=True, use_q=True):
+
+    def populate_data(
+        self,
+        transect,
+        data_type,
+        threshold,
+        data_extent=None,
+        use_weighted=True,
+        sub_from_left=True,
+        use_q=True,
+    ):
         """Computes the normalized values for a single transect.
 
         Parameters
@@ -75,9 +92,20 @@ class NormData(object):
         data_type: str
             Type of data (v, q, V, or Q)
         threshold: int
-            Number of data points in an increment for the increment to be valid.
+            Number of data points in an increment for the increment to be
+            valid.
         data_extent: list
-            Defines percent of data from start of transect to use, default [0, 100]
+            Defines percent of data from start of transect to use, default [
+            0, 100]
+        use_weighted: bool
+            Specifies if discharge weighted medians are to be used in the
+            extrapolation fit
+        sub_from_left: bool
+            Specifies if when subsectioning the subsection should start from
+            left to right.
+        use_q: bool
+            Specifies to use the discharge rather than the xprod when
+            subsectioning
         use_weighted: bool
             Specifies if discharge weighted medians are to be used in the extrapolation fit
         sub_from_left: bool
@@ -86,13 +114,14 @@ class NormData(object):
             Specifies to use the discharge rather than the xprod when subsectioning
         """
 
-        # If the data extent is not defined set data_extent to zero to trigger all data to be used
+        # If the data extent is not defined set data_extent to zero to
+        # trigger all data to be used
         if data_extent is None:
             data_extent = [0, 100]
 
         self.sub_from_left = sub_from_left
         self.use_q = use_q
-            
+
         # Get data copies to avoid changing original data
         filename = transect.file_name
         in_transect_idx = transect.in_transect_idx
@@ -100,13 +129,15 @@ class NormData(object):
         depths_selected = getattr(transect.depths, transect.depths.selected)
         cell_depth = np.copy(depths_selected.depth_cell_depth_m[:, in_transect_idx])
         cells_above_sl = transect.w_vel.cells_above_sl[:, in_transect_idx]
-        cell_depth[cells_above_sl == False] = np.nan
+        cell_depth[np.logical_not(cells_above_sl)] = np.nan
         depth_ens = np.copy(depths_selected.depth_processed_m[in_transect_idx])
 
         w_vel_x = np.copy(transect.w_vel.u_processed_mps[:, in_transect_idx])
         w_vel_y = np.copy(transect.w_vel.v_processed_mps[:, in_transect_idx])
 
-        invalid_data = np.logical_not(transect.w_vel.valid_data[0, :, in_transect_idx]).T
+        invalid_data = np.logical_not(
+            transect.w_vel.valid_data[0, :, in_transect_idx]
+        ).T
         w_vel_x[invalid_data] = np.nan
         w_vel_y[invalid_data] = np.nan
 
@@ -115,17 +146,26 @@ class NormData(object):
             bt_vel_x = np.copy(boat_select.u_processed_mps[in_transect_idx])
             bt_vel_y = np.copy(boat_select.v_processed_mps[in_transect_idx])
         else:
-            bt_vel_x = np.tile([np.nan], transect.boat_vel.bt_vel.u_processed_mps[in_transect_idx].shape)
-            bt_vel_y = np.tile([np.nan], transect.boat_vel.bt_vel.u_processed_mps[in_transect_idx].shape)
+            bt_vel_x = np.tile(
+                [np.nan],
+                transect.boat_vel.bt_vel.u_processed_mps[in_transect_idx].shape,
+            )
+            bt_vel_y = np.tile(
+                [np.nan],
+                transect.boat_vel.bt_vel.u_processed_mps[in_transect_idx].shape,
+            )
 
         # Compute discharges
         xprod = np.multiply(w_vel_x, bt_vel_y) - np.multiply(w_vel_y, bt_vel_x)
         cell_size = depths_selected.depth_cell_size_m
         delta_t = transect.date_time.ens_duration_sec[in_transect_idx]
-        q = np.multiply(xprod[:, in_transect_idx] * cell_size[:, in_transect_idx], delta_t)
+        q = np.multiply(
+            xprod[:, in_transect_idx] * cell_size[:, in_transect_idx], delta_t
+        )
         q_ens = np.nansum(q, 0)
 
-        # Ensure all elements of xprod can be used to compute q (have a delta_t), first ensemble has no delta_t
+        # Ensure all elements of xprod can be used to compute q (have a
+        # delta_t), first ensemble has no delta_t
         idx_invalid = np.where(np.isnan(delta_t))[0]
         xprod[:, idx_invalid] = np.nan
 
@@ -143,14 +183,16 @@ class NormData(object):
         norm_cell_depth[nan_less(norm_cell_depth, 0)] = np.nan
 
         # If data type is discharge compute unit discharge for each cell
-        if data_type.lower() == 'q':
+        if data_type.lower() == "q":
             # Compute the cross product for each cell
             unit = xprod
         else:
             w_vel_x = np.copy(transect.w_vel.u_processed_mps[:, in_transect_idx])
             w_vel_y = np.copy(transect.w_vel.v_processed_mps[:, in_transect_idx])
 
-            invalid_data = np.logical_not(transect.w_vel.valid_data[0, :, in_transect_idx]).T
+            invalid_data = np.logical_not(
+                transect.w_vel.valid_data[0, :, in_transect_idx]
+            ).T
             w_vel_x[invalid_data] = np.nan
             w_vel_y[invalid_data] = np.nan
 
@@ -162,12 +204,14 @@ class NormData(object):
             direction, _ = cart2pol(w_vel_mean_1, w_vel_mean_2)
             unit_vec_1, unit_vec_2 = pol2cart(direction, 1)
             unit_vec = np.vstack([unit_vec_1, unit_vec_2])
-            
-            # Compute the velocity magnitude in the direction of the mean velocity of each
-            # ensemble using the dot product and unit vector
+
+            # Compute the velocity magnitude in the direction of the mean
+            # velocity of each ensemble using the dot product and unit vector
             unit = np.tile([np.nan], w_vel_x.shape)
             for i in range(w_vel_x.shape[0]):
-                unit[i, :] = np.sum(np.vstack([w_vel_x[i, :], w_vel_y[i, :]]) * unit_vec, 0)
+                unit[i, :] = np.sum(
+                    np.vstack([w_vel_x[i, :], w_vel_y[i, :]]) * unit_vec, 0
+                )
 
             # Discharge weighting of velocity data is not permitted
             use_weighted = False
@@ -176,7 +220,7 @@ class NormData(object):
         unit_total = np.nansum(np.nansum(unit), 0)
         if unit_total < 0:
             unit *= -1
-            
+
         # Compute normalize unit values
         with warnings.catch_warnings():
             warnings.simplefilter("ignore", category=RuntimeWarning)
@@ -185,8 +229,9 @@ class NormData(object):
         # Apply extents if they have been specified
         if data_extent[0] != 0 or data_extent[1] != 100:
             if use_q:
-                # Adjust cumulative sum direction based on start bank so that cumsum is always from left to right
-                if transect.start_edge == 'Right' and sub_from_left:
+                # Adjust cumulative sum direction based on start bank so
+                # that cumsum is always from left to right
+                if transect.start_edge == "Right" and sub_from_left:
                     q_ens_flipped = np.flip(q_ens)
                     q_cum = np.nancumsum(q_ens_flipped)
                     q_max = q_cum[-1]
@@ -206,33 +251,20 @@ class NormData(object):
             # Apply extents
             unit_left = q_max * data_extent[0] / 100
             unit_right = q_max * data_extent[1] / 100
-            idx_extent = np.where(np.logical_and(np.greater(q_cum, unit_left),
-                                                 np.less(q_cum, unit_right)))[0]
-            # if data_type.lower() == 'v':
-            #     # Unit discharge is computed here because the unit norm could be based on velocity
-            #     unit = np.multiply(w_vel_x, bt_vel_y) - np.multiply(w_vel_y, bt_vel_x)
-            #     unit_ens = np.nansum(unit, 0)
-            #     unit_total = np.nancumsum(unit_ens)
-            #
-            #     # Adjust so total discharge is positive
-            #     if unit_total[-1] < 0:
-            #         unit_total *= -1
-                
-            # # Apply extents
-            # unit_lower = unit_total[-1] * data_extent[0] / 100
-            # unit_upper = unit_total[-1] * data_extent[1] / 100
-            # idx_extent = np.where(np.logical_and(np.greater(unit_total, unit_lower),
-            #                                      np.less(unit_total, unit_upper)))[0]
+            idx_extent = np.where(
+                np.logical_and(np.greater(q_cum, unit_left), np.less(q_cum, unit_right))
+            )[0]
+
             unit_norm = unit_norm[:, idx_extent]
             norm_cell_depth = norm_cell_depth[:, idx_extent]
             weights = weights[:, idx_extent]
-            
+
         # If whole profile is negative make positive
         idx_neg1 = np.tile([np.nan], [unit_norm.shape[1], 1])
         idx_neg2 = np.tile([np.nan], [unit_norm.shape[1], 1])
         for c in range(unit_norm.shape[1]):
             idx_neg1[c] = len(np.where(nan_less(unit_norm[:, c], 0))[0])
-            idx_neg2[c] = len(np.where(np.isnan(unit_norm[:, c]) == False)[0])
+            idx_neg2[c] = len(np.where(np.logical_not(np.isnan(unit_norm[:, c])))[0])
         idx_neg = np.squeeze(idx_neg1) == np.squeeze(idx_neg2)
         unit_norm[:, idx_neg] = unit_norm[:, idx_neg] * -1
 
@@ -248,21 +280,21 @@ class NormData(object):
 
     @staticmethod
     def qrev_mat_in(mat_data):
-        """Processes the Matlab data structure to obtain a list of NormData objects containing transect
-           data from the Matlab data structure.
+        """Processes the Matlab data structure to obtain a list of NormData
+         objects containing transect data from the Matlab data structure.
 
-       Parameters
-       ----------
-       mat_data: mat_struct
-           Matlab data structure obtained from sio.loadmat
+        Parameters
+        ----------
+        mat_data: mat_struct
+            Matlab data structure obtained from sio.loadmat
 
-       Returns
-       -------
-       norm_data: list
-           List of NormData objects
-       """
+        Returns
+        -------
+        norm_data: list
+            List of NormData objects
+        """
         norm_data = []
-        if hasattr(mat_data, 'normData'):
+        if hasattr(mat_data, "normData"):
             for data in mat_data.normData:
                 temp = NormData()
                 temp.populate_from_qrev_mat(data)
@@ -270,7 +302,8 @@ class NormData(object):
         return norm_data
 
     def populate_from_qrev_mat(self, mat_data):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -289,15 +322,15 @@ class NormData(object):
         self.data_type = mat_data.dataType
         self.data_extent = mat_data.dataExtent
         self.valid_data = mat_data.validData - 1
-        if hasattr(mat_data, 'use_weighted'):
+        if hasattr(mat_data, "use_weighted"):
             self.use_weighted = mat_data.use_weighted
             self.weights = mat_data.weights
         else:
             self.use_weighted = False
             self.weights = None
-        if hasattr(mat_data, 'use_q'):
+        if hasattr(mat_data, "use_q"):
             self.use_q = mat_data.use_q
-        if hasattr(mat_data, 'sub_from_left'):
+        if hasattr(mat_data, "sub_from_left"):
             self.sub_from_left = mat_data.sub_from_left
 
     def compute_stats(self, threshold):
@@ -306,11 +339,12 @@ class NormData(object):
         Parameters
         ----------
         threshold: int
-            Number of data points in an increment for the increment to be valid.
+            Number of data points in an increment for the increment to be
+            valid.
         """
 
         # Set averaging interval
-        avg_interval = np.arange(0, 1.05, .05)
+        avg_interval = np.arange(0, 1.05, 0.05)
 
         # Initialize variables to nan
         unit_norm_med = np.tile([np.nan], len(avg_interval) - 1)
@@ -322,26 +356,37 @@ class NormData(object):
         # Process each normalized increment
         for i in range(len(avg_interval) - 1):
             condition_1 = nan_greater(self.cell_depth_normalized, avg_interval[i])
-            condition_2 = nan_less_equal(self.cell_depth_normalized, avg_interval[i + 1])
+            condition_2 = nan_less_equal(
+                self.cell_depth_normalized, avg_interval[i + 1]
+            )
             condition_3 = np.logical_not(np.isnan(self.unit_normalized))
-            condition_all = np.logical_and(np.logical_and(condition_1, condition_2), condition_3)
+            condition_all = np.logical_and(
+                np.logical_and(condition_1, condition_2), condition_3
+            )
             if np.any(condition_all):
-                if self.data_type.lower() == 'q' and self.use_weighted:
-                    results = self.weighted_quantile(self.unit_normalized[condition_all],
-                                                     quantiles=[0.25, 0.5, 0.75],
-                                                     sample_weight=self.weights[condition_all])
+                if self.data_type.lower() == "q" and self.use_weighted:
+                    results = self.weighted_quantile(
+                        self.unit_normalized[condition_all],
+                        quantiles=[0.25, 0.5, 0.75],
+                        sample_weight=self.weights[condition_all],
+                    )
                     unit_25[i] = results[0]
                     unit_norm_med[i] = results[1]
                     unit_75[i] = results[2]
                 else:
-                    unit_25[i], unit_norm_med[i], unit_75[i] = sp.mstats.mquantiles(self.unit_normalized[condition_all],
-                                                                                    alphap=0.5, betap=0.5)
+                    unit_25[i], unit_norm_med[i], unit_75[i] = sp.mstats.mquantiles(
+                        self.unit_normalized[condition_all], alphap=0.5, betap=0.5
+                    )
 
-                unit_norm_med_no[i] = np.sum(np.isnan(self.unit_normalized[condition_all]) == False)
+                unit_norm_med_no[i] = np.sum(
+                    np.logical_not(np.isnan(self.unit_normalized[condition_all]))
+                )
                 avgz[i] = 1 - np.nanmean(self.cell_depth_normalized[condition_all])
 
         # Mark increments invalid if they do not have sufficient data
-        cutoff = np.nanmedian(unit_norm_med_no[nan_greater(unit_norm_med_no, 0)]) * (threshold / 100)
+        cutoff = np.nanmedian(unit_norm_med_no[nan_greater(unit_norm_med_no, 0)]) * (
+            threshold / 100
+        )
         self.valid_data = np.where(nan_greater(unit_norm_med_no, cutoff))[0]
 
         self.unit_normalized_med = unit_norm_med
@@ -352,7 +397,7 @@ class NormData(object):
 
     @staticmethod
     def weighted_quantile(values, quantiles, sample_weight):
-        """ Very close to numpy.percentile, but supports weights.
+        """Very close to numpy.percentile, but supports weights.
         NOTE: quantiles should be in [0, 1]!
 
         Parameters
@@ -394,7 +439,8 @@ class NormData(object):
         norm_data: list
             List of objects of NormData
         threshold: int
-            Number of data points in an increment for the increment to be valid.
+            Number of data points in an increment for the increment to be
+            valid.
         """
 
         # Initialize lists
@@ -415,21 +461,25 @@ class NormData(object):
         self.unit_normalized = np.tile([np.nan], (max_cells, sum_ens[-1]))
         self.cell_depth_normalized = np.tile([np.nan], (max_cells, sum_ens[-1]))
         self.weights = np.tile([np.nan], (max_cells, sum_ens[-1]))
+        self.weights = np.tile([np.nan], (max_cells, sum_ens[-1]))
 
         # Process each transect using data from only the checked transects
         for n in range(len(transects)):
             if transects[n].checked:
-                self.unit_normalized[:n_cells[n], np.arange(sum_ens[n], sum_ens[n + 1])] \
-                    = norm_data[n].unit_normalized
-                self.weights[:n_cells[n], np.arange(sum_ens[n], sum_ens[n + 1])] \
-                    = norm_data[n].weights
-                self.cell_depth_normalized[:n_cells[n], np.arange(sum_ens[n], sum_ens[n + 1])] \
-                    = norm_data[n].cell_depth_normalized
+                self.unit_normalized[
+                    : n_cells[n], np.arange(sum_ens[n], sum_ens[n + 1])
+                ] = norm_data[n].unit_normalized
+                self.weights[
+                    : n_cells[n], np.arange(sum_ens[n], sum_ens[n + 1])
+                ] = norm_data[n].weights
+                self.cell_depth_normalized[
+                    : n_cells[n], np.arange(sum_ens[n], sum_ens[n + 1])
+                ] = norm_data[n].cell_depth_normalized
                 # if self.data_extent is None:
                 self.data_extent = norm_data[n].data_extent
                 self.data_type = norm_data[n].data_type
                 self.use_weighted = norm_data[n].use_weighted
 
         # Store data
-        self.file_name = 'Measurement'
+        self.file_name = "Measurement"
         self.compute_stats(threshold)
diff --git a/qrevint_22_06_22/Classes/Oursin.py b/Classes/Oursin.py
similarity index 51%
rename from qrevint_22_06_22/Classes/Oursin.py
rename to Classes/Oursin.py
index 263ed78502c90c49ffddbf3df36598ce8e23e44d..e98f193fe771de2a5bffb8dbfc11098bdfa356f2 100644
--- a/qrevint_22_06_22/Classes/Oursin.py
+++ b/Classes/Oursin.py
@@ -1,5 +1,3 @@
-import time
-
 import pandas as pd
 import copy
 from Classes.QComp import QComp
@@ -7,7 +5,8 @@ from scipy.stats import t
 import numpy as np
 import math
 import scipy.stats
-from profilehooks import profile
+
+# from profilehooks import profile
 from MiscLibs.common_functions import cosd, sind
 from MiscLibs.bayes_cov_compiled import bayes_cov
 
@@ -20,13 +19,17 @@ class Oursin(object):
     bot_meth: list
         List that contains the method proposed by Extrap for each transect
     exp_95ic_min: list
-        List that contains the min range of 95% interval if power-power method is used for transect
+        List that contains the min range of 95% interval if power-power
+        method is used for transect
     exp_95ic_max: list
-        List that contains the max range of 95% interval if power-power method is used for transect
+        List that contains the max range of 95% interval if power-power
+        method is used for transect
     pp_exp: list
-        List that contains the power-power exponent computed by Extrap for Power-Power transect only
+        List that contains the power-power exponent computed by Extrap for
+        Power-Power transect only
     ns_exp: list
-        List that contains the no-slip exponent computed by Extrap for No-Slip method transect only
+        List that contains the no-slip exponent computed by Extrap for
+        No-Slip method transect only
     exp_pp_min: list
         Minimum power-power exponent used for simulating possible discharge
     exp_pp_max: list
@@ -36,83 +39,120 @@ class Oursin(object):
     exp_ns_max: list
         Maximum no-slip exponent used for simulating possible discharge
     d_right_error_min: list
-        List that contains the minimum right distance (in m) used for simulating the discharge for each transect
+        List that contains the minimum right distance (in m) used for
+        simulating the discharge for each transect
     d_left_error_min: list
-        List that contains the minimum left distance (in m) used for simulating the discharge for each transect
+        List that contains the minimum left distance (in m) used for
+        simulating the discharge for each transect
     d_right_error_max: list
-        List that contains the maximum right distance (in m) used for simulating the discharge for each transect
+        List that contains the maximum right distance (in m) used for
+        simulating the discharge for each transect
     d_left_error_max: list
-        List that contains the maximum left distance (in m) used for simulating the discharge for each transect
+        List that contains the maximum left distance (in m) used for
+        simulating the discharge for each transect
     draft_error_list: list
-        List that contains the draft (in cm) used for simulating the discharge for each transect
+        List that contains the draft (in cm) used for simulating the
+        discharge for each transect
     u_syst_list: list
-        List that contains the computed systematic uncertainty (68%) for each transect
+        List that contains the computed systematic uncertainty (68%) for
+        each transect
     u_compass_list: list
-        List that contains the computed uncertainty (68%) due to compass error for each transect
+        List that contains the computed uncertainty (68%) due to compass
+        error for each transect
     u_meas_list: list
-        List that contains the computed measured area uncertainty (68%) for each transect
+        List that contains the computed measured area uncertainty (68%) for
+        each transect
     u_ens_list: list
-       List that contains the computed uncertainty (68%) due to limited number of ensemble for each transect
+       List that contains the computed uncertainty (68%) due to limited
+       number of ensemble for each transect
     u_movbed_list: list
-       List that contains the estimated uncertainty (68%) due to moving bed for each transect
+       List that contains the estimated uncertainty (68%) due to moving bed
+       for each transect
     u_invalid_water_list: list
-        List that contains the computed uncertainty (68%) due to invalid water velocities for each transect
+        List that contains the computed uncertainty (68%) due to invalid
+        water velocities for each transect
     u_invalid_boat_list: list
-        List that contains the computed uncertainty (68%) due to invalid boat velocities for each transect
+        List that contains the computed uncertainty (68%) due to invalid
+        boat velocities for each transect
     u_invalid_depth_list: list
-       List that contains the computed uncertainty (68%) due to invalid depths for each transect
+       List that contains the computed uncertainty (68%) due to invalid
+       depths for each transect
     u_top_list: list
-       List that contains the computed uncertainty (68%) due to top discharge extrapolation for each transect
+       List that contains the computed uncertainty (68%) due to top
+       discharge extrapolation for each transect
     u_bot_list: list
-       List that contains the computed uncertainty (68%) due to bottom discharge extrapolation for each transect
+       List that contains the computed uncertainty (68%) due to bottom
+       discharge extrapolation for each transect
     u_left_list: list
-       List that contains the computed uncertainty (68%) due to left discharge extrapolation for each transect
+       List that contains the computed uncertainty (68%) due to left
+       discharge extrapolation for each transect
     u_right_list: list
-       List that contains the computed uncertainty (68%) due to right discharge extrapolation for each transect
+       List that contains the computed uncertainty (68%) due to right
+       discharge extrapolation for each transect
     u_syst_mean_user_list: list
-        List that contains the user specified  systematic uncertainty (68%) for each transect
+        List that contains the user specified  systematic uncertainty (68%)
+        for each transect
     u_compass_user_list: list
-        List that contains user specified uncertainty (68%) due to compass error for each transect
+        List that contains user specified uncertainty (68%) due to compass
+        error for each transect
     u_meas_mean_user_list: list
-        List that contains the user specified measured area uncertainty (68%) for each transect
+        List that contains the user specified measured area uncertainty (
+        68%) for each transect
     u_ens_user_list: list
-       List that contains the user specified uncertainty (68%) due to limited number of ensemble for each transect
+       List that contains the user specified uncertainty (68%) due to
+       limited number of ensemble for each transect
     u_movbed_user_list: list
-       List that contains the user specified uncertainty (68%) due to moving bed for each transect
+       List that contains the user specified uncertainty (68%) due to moving
+       bed for each transect
     u_invalid_water_user_list: list
-        List that contains the user specified uncertainty (68%) due to invalid water velocities for each transect
+        List that contains the user specified uncertainty (68%) due to
+        invalid water velocities for each transect
     u_invalid_boat_user_list: list
-        List that contains the user specified uncertainty (68%) due to invalid boat velocities for each transect
+        List that contains the user specified uncertainty (68%) due to
+        invalid boat velocities for each transect
     u_invalid_depth_user_list: list
-       List that contains the user specified uncertainty (68%) due to invalid depths for each transect
+       List that contains the user specified uncertainty (68%) due to
+       invalid depths for each transect
     u_top_mean_user_list: list
-       List that contains the user specified uncertainty (68%) due to top discharge extrapolation for each transect
+       List that contains the user specified uncertainty (68%) due to top
+       discharge extrapolation for each transect
     u_bot_mean_user_list: list
-       List that contains the user specified uncertainty (68%) due to bottom discharge extrapolation for each transect
+       List that contains the user specified uncertainty (68%) due to bottom
+       discharge extrapolation for each transect
     u_left_mean_user_list: list
-       List that contains the user specified uncertainty (68%) due to left discharge extrapolation for each transect
+       List that contains the user specified uncertainty (68%) due to left
+       discharge extrapolation for each transect
     u_right_mean_user_list: list
-       List that contains the user specified uncertainty (68%) due to right discharge extrapolation for each transect
+       List that contains the user specified uncertainty (68%) due to right
+       discharge extrapolation for each transect
     cov_68: float
        Computed uncertainty (68%) due to coefficient of variation
     sim_original: DataFrame
         Discharges (total, and subareas) computed for the processed discharge
     sim_extrap_pp_16: DataFrame
-        Discharges (total, and subareas) computed using power fit with 1/6th exponent
+        Discharges (total, and subareas) computed using power fit with 1/6th
+        exponent
     sim_extrap_pp_min: DataFrame
-        Discharges (total, and subareas) computed using power fit with minimum exponent
+        Discharges (total, and subareas) computed using power fit with
+        minimum exponent
     sim_extrap_pp_max: DataFrame
-        Discharges (total, and subareas) computed using power fit with maximum exponent
+        Discharges (total, and subareas) computed using power fit with
+        maximum exponent
     sim_extrap_cns_16: DataFrame
-        Discharges (total, and subareas) computed using constant no slip with 1/6th exponent
+        Discharges (total, and subareas) computed using constant no slip
+        with 1/6th exponent
     sim_extrap_cns_min: DataFrame
-        Discharges (total, and subareas) computed using constant no slip with minimum exponent
+        Discharges (total, and subareas) computed using constant no slip
+        with minimum exponent
     sim_extrap_cns_max: DataFrame
-        Discharges (total, and subareas) computed using constant no slip with maximum exponent
+        Discharges (total, and subareas) computed using constant no slip
+        with maximum exponent
     sim_extrap_3pns_16: DataFrame
-        Discharges (total, and subareas) computed using 3pt no slip with 1/6the exponent
+        Discharges (total, and subareas) computed using 3pt no slip with
+        1/6the exponent
     sim_extrap_3pns_opt: DataFrame
-        Discharges (total, and subareas) computed using 3pt no slip with optimized exponent
+        Discharges (total, and subareas) computed using 3pt no slip with
+        optimized exponent
     sim_edge_min: DataFrame
         Discharges (total, and subareas) computed using minimum edge q
     sim_edge_max: DataFrame
@@ -122,15 +162,20 @@ class Oursin(object):
     sim_draft_max: DataFrame
         Discharges (total, and subareas) computed using maximum draft
     sim_cells_trdi: DataFrame
-        Discharges (total, and subareas) computed using TRDI method for invalid cells
+        Discharges (total, and subareas) computed using TRDI method for
+        invalid cells
     sim_cells_above: DataFrame
-        Discharges (total, and subareas) computed using cells above for invalid cells
+        Discharges (total, and subareas) computed using cells above for
+        invalid cells
     sim_cells_below: DataFrame
-        Discharges (total, and subareas) computed using cells below for invalid cells
+        Discharges (total, and subareas) computed using cells below for
+        invalid cells
     sim_cells_before: DataFrame
-        Discharges (total, and subareas) computed for using cells before for invalid cells
+        Discharges (total, and subareas) computed for using cells before for
+        invalid cells
     sim_cells_after: DataFrame
-        Discharges (total, and subareas) computed for using cells before for invalid cells
+        Discharges (total, and subareas) computed for using cells before for
+        invalid cells
     nb_transects: float
         Number of transects used
     checked_idx: list
@@ -154,9 +199,11 @@ class Oursin(object):
         left_edge_dist_prct_user: float
             User specified percent error in left edge distance
         gga_boat_user: float
-            User specified standard deviation of boat velocities based on gga in m/s
+            User specified standard deviation of boat velocities based on
+            gga in m/s
         vtg_boat_user: float
-            User specified standard deviation of boat velocities based on vtg in m/s
+            User specified standard deviation of boat velocities based on
+            vtg in m/s
         compass_error_user: float
             User specified compass error in degrees
     default_advanced_settings: dict
@@ -184,97 +231,127 @@ class Oursin(object):
         compass_error: float
             Default compass error in degrees
     user_specified_u: dict
-        Dictionary of user specified uncertainties as standard deviation in percent
+        Dictionary of user specified uncertainties as standard deviation in
+        percent
         u_syst_mean_user: float
             User specified uncertianty (bias) due to the system, in percent
         u_movbed_user: float
-            User specified uncertianty (bias) due to the moving-bed conditions, in percent
+            User specified uncertianty (bias) due to the moving-bed
+            conditions, in percent
         u_compass_user: float
-            User specified uncertianty (bias) due to the compass error, in percent
+            User specified uncertianty (bias) due to the compass error,
+            in percent
         u_ens_user: float
-            User specified uncertianty (bias) due to the number of ensembles collected, in percent
+            User specified uncertianty (bias) due to the number of ensembles
+            collected, in percent
         u_meas_mean_user: float
-            User specified uncertianty (random) of the measured portion of the cross section, in percent
+            User specified uncertianty (random) of the measured portion of
+            the cross section, in percent
         u_top_mean_user: float
-            User specified uncertianty (bias) due to the top extrapolation, in percent
+            User specified uncertianty (bias) due to the top extrapolation,
+            in percent
         u_bot_mean_user: float
-            User specified uncertianty (bias) due to the bottom extrapolation, in percent
+            User specified uncertianty (bias) due to the bottom
+            extrapolation, in percent
         u_right_mean_user: float
-            User specified uncertianty (bias) due to the right edge discharge estimate, in percent
+            User specified uncertianty (bias) due to the right edge
+            discharge estimate, in percent
         u_left_mean_user: float
-            User specified uncertianty (bias) due to the left edge discharge estimate, in percent
+            User specified uncertianty (bias) due to the left edge discharge
+            estimate, in percent
         u_invalid_boat_user: float
-            User specified uncertianty (bias) due to invalid boat velocities, in percent
+            User specified uncertianty (bias) due to invalid boat
+            velocities, in percent
         u_invalid_depth_user
             User specified uncertianty (bias) due to invalid depths, in percent
         u_invalid_water_user: float
-            User specified uncertianty (bias) due to invalid water velocities, in percent
+            User specified uncertianty (bias) due to invalid water
+            velocities, in percent
     u: DataFrame
-        DataFrame containing standard deviations in percent for each transect: u_syst, u_compass, u_movbed, u_ens,
-        u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water, u_cov, total, and total_95
+        DataFrame containing standard deviations in percent for each
+        transect: u_syst, u_compass, u_movbed, u_ens,
+        u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water,
+        u_cov, total, and total_95
      u_contribution_meas: DataFrame
-        DataFrame containing measured discharge uncertainty contribution from: boat, water, depth, and dzi
+        DataFrame containing measured discharge uncertainty contribution
+        from: boat, water, depth, and dzi
     u_measurement: DataFrame
-        DataFrame containing standard deviations in percent for the whole measurement: u_syst, u_compass, u_movbed,
-        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water, u_cov, total, and total_95
+        DataFrame containing standard deviations in percent for the whole
+        measurement: u_syst, u_compass, u_movbed,
+        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+        u_water, u_cov, total, and total_95
     u_contribution_measurement: DataFrame
-        DataFrame containing uncertainty contribution in percent from: u_syst, u_compass, u_movbed,
-        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water, u_cov, and total
+        DataFrame containing uncertainty contribution in percent from:
+        u_syst, u_compass, u_movbed,
+        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+        u_water, u_cov, and total
     u_user: DataFrame
-        DataFrame containing standard deviations in percent for each transect: u_syst, u_compass, u_movbed, u_ens,
-        u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water, u_cov, total, and total_95
+        DataFrame containing standard deviations in percent for each
+        transect: u_syst, u_compass, u_movbed, u_ens,
+        u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water,
+        u_cov, total, and total_95
     u_measurement_user: DataFrame
-        DataFrame containing standard deviations in percent for the whole measurement: u_syst, u_compass, u_movbed,
-        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water, u_cov, total, and total_95
+        DataFrame containing standard deviations in percent for the whole
+        measurement: u_syst, u_compass, u_movbed,
+        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+        u_water, u_cov, total, and total_95
     u_contribution_measurement_user: DataFrame
-        DataFrame containing uncertainty contribution in percent from: u_syst, u_compass, u_movbed,
-        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water, u_cov, and total
+        DataFrame containing uncertainty contribution in percent from:
+        u_syst, u_compass, u_movbed,
+        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+        u_water, u_cov, and total
     """
 
     def __init__(self):
         """Initialize class and instance variables."""
 
         # User provided parameters
-        self.user_advanced_settings = {'exp_pp_min_user': np.nan,
-                                       'exp_pp_max_user': np.nan,
-                                       'exp_ns_min_user': np.nan,
-                                       'exp_ns_max_user': np.nan,
-                                       'draft_error_m_user': np.nan,
-                                       'dzi_prct_user': np.nan,
-                                       'right_edge_dist_prct_user': np.nan,
-                                       'left_edge_dist_prct_user': np.nan,
-                                       'gga_boat_mps_user': np.nan,
-                                       'vtg_boat_mps_user': np.nan,
-                                       'compass_error_deg_user': np.nan,
-                                       'cov_prior_user': np.nan,
-                                       'cov_prior_u_user': np.nan}
-
-        self.default_advanced_settings = {'exp_pp_min': 'computed',
-                                          'exp_pp_max': 'computed',
-                                          'exp_ns_min': 'computed',
-                                          'exp_ns_max': 'computed',
-                                          'draft_error_m': 'computed',
-                                          'dzi_prct': 0.5,
-                                          'right_edge_dist_prct': 20,
-                                          'left_edge_dist_prct': 20,
-                                          'gga_boat_mps': 'computed',
-                                          'vtg_boat_mps': 0.05,
-                                          'compass_error_deg': 1,
-                                          'cov_prior': 0.03,
-                                          'cov_prior_u': 0.20}
-
-        self.user_specified_u = {'u_syst_mean_user': np.nan,
-                                 'u_movbed_user': np.nan,
-                                 'u_compass_user': np.nan,
-                                 'u_ens_user': np.nan,
-                                 'u_meas_mean_user': np.nan,
-                                 'u_top_mean_user': np.nan,
-                                 'u_bot_mean_user': np.nan,
-                                 'u_right_mean_user': np.nan,
-                                 'u_left_mean_user': np.nan,
-                                 'u_invalid_boat_user': np.nan,
-                                 'u_invalid_depth_user': np.nan,
-                                 'u_invalid_water_user': np.nan}
+        self.user_advanced_settings = {
+            "exp_pp_min_user": np.nan,
+            "exp_pp_max_user": np.nan,
+            "exp_ns_min_user": np.nan,
+            "exp_ns_max_user": np.nan,
+            "draft_error_m_user": np.nan,
+            "dzi_prct_user": np.nan,
+            "right_edge_dist_prct_user": np.nan,
+            "left_edge_dist_prct_user": np.nan,
+            "gga_boat_mps_user": np.nan,
+            "vtg_boat_mps_user": np.nan,
+            "compass_error_deg_user": np.nan,
+            "cov_prior_user": np.nan,
+            "cov_prior_u_user": np.nan,
+        }
+
+        self.default_advanced_settings = {
+            "exp_pp_min": "computed",
+            "exp_pp_max": "computed",
+            "exp_ns_min": "computed",
+            "exp_ns_max": "computed",
+            "draft_error_m": "computed",
+            "dzi_prct": 0.5,
+            "right_edge_dist_prct": 20,
+            "left_edge_dist_prct": 20,
+            "gga_boat_mps": "computed",
+            "vtg_boat_mps": 0.05,
+            "compass_error_deg": 1,
+            "cov_prior": 0.03,
+            "cov_prior_u": 0.20,
+        }
+
+        self.user_specified_u = {
+            "u_syst_mean_user": np.nan,
+            "u_movbed_user": np.nan,
+            "u_compass_user": np.nan,
+            "u_ens_user": np.nan,
+            "u_meas_mean_user": np.nan,
+            "u_top_mean_user": np.nan,
+            "u_bot_mean_user": np.nan,
+            "u_right_mean_user": np.nan,
+            "u_left_mean_user": np.nan,
+            "u_invalid_boat_user": np.nan,
+            "u_invalid_depth_user": np.nan,
+            "u_invalid_water_user": np.nan,
+        }
 
         # Extrap results
         self.bot_meth = []
@@ -327,91 +404,223 @@ class Oursin(object):
         self.nb_transects = np.nan
         self.checked_idx = []
 
-        # --- Store results of all simulations in DataFrame
-        self.sim_original = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot', 'q_left', 'q_right', 'q_middle'])
-        self.sim_extrap_pp_16 = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_pp_opt = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_pp_min = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_pp_max = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_cns_16 = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_cns_opt = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_cns_min = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_cns_max = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_3pns_16 = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_3pns_opt = pd.DataFrame(columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_edge_min = pd.DataFrame(columns=['q_total', 'q_left', 'q_right'])
-        self.sim_edge_max = pd.DataFrame(columns=['q_total', 'q_left', 'q_right'])
-        self.sim_draft_min = pd.DataFrame(columns=['q_total', 'q_top', 'q_left', 'q_right'])
-        self.sim_draft_max = pd.DataFrame(columns=['q_total', 'q_top', 'q_left', 'q_right'])
-        self.sim_cells_trdi = pd.DataFrame(columns=['q_total', 'q_middle'])
-        self.sim_cells_above = pd.DataFrame(columns=['q_total', 'q_middle'])
-        self.sim_cells_below = pd.DataFrame(columns=['q_total', 'q_middle'])
-        self.sim_cells_before = pd.DataFrame(columns=['q_total', 'q_middle'])
-        self.sim_cells_after = pd.DataFrame(columns=['q_total', 'q_middle'])
-        self.sim_shallow = pd.DataFrame(columns=['q_total', 'q_middle'])
-        self.sim_depth_hold = pd.DataFrame(columns=['q_total', 'q_middle'])
-        self.sim_depth_next = pd.DataFrame(columns=['q_total', 'q_middle'])
-        self.sim_boat_hold = pd.DataFrame(columns=['q_total', 'q_middle'])
-        self.sim_boat_next = pd.DataFrame(columns=['q_total', 'q_middle'])
-        self.u_contribution_meas = pd.DataFrame(columns=['boat', 'water', 'depth', 'dzi'])
-        self.u = pd.DataFrame(columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top', 'u_bot',
-                                       'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water', 'u_cov', 'total',
-                                       'total_95'])
-        self.u_measurement = pd.DataFrame(columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top',
-                                                   'u_bot', 'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water',
-                                                   'u_cov', 'total', 'total_95'])
-        self.u_contribution = pd.DataFrame(columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top',
-                                                    'u_bot', 'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water',
-                                                    'u_cov', 'total'])
-        self.u_contribution_measurement = pd.DataFrame(columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas',
-                                                                'u_top', 'u_bot', 'u_left', 'u_right', 'u_boat',
-                                                                'u_depth', 'u_water', 'u_cov', 'total'])
-        self.u_user = pd.DataFrame(columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top', 'u_bot',
-                                            'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water', 'u_cov', 'total',
-                                            'total_95'])
-        self.u_measurement_user = pd.DataFrame(columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top',
-                                                        'u_bot', 'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water',
-                                                        'u_cov', 'total', 'total_95'])
-        self.u_contribution_user = pd.DataFrame(columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top',
-                                                         'u_bot', 'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water',
-                                                         'u_cov', 'total'])
-        self.u_contribution_measurement_user = pd.DataFrame(columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens',
-                                                                     'u_meas', 'u_top', 'u_bot', 'u_left', 'u_right',
-                                                                     'u_boat', 'u_depth', 'u_water', 'u_cov', 'total'])
+        # Store results of all simulations in DataFrame
+        self.sim_original = pd.DataFrame(
+            columns=["q_total", "q_top", "q_bot", "q_left", "q_right", "q_middle"]
+        )
+        self.sim_extrap_pp_16 = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_pp_opt = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_pp_min = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_pp_max = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_cns_16 = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_cns_opt = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_cns_min = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_cns_max = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_3pns_16 = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_3pns_opt = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_edge_min = pd.DataFrame(columns=["q_total", "q_left", "q_right"])
+        self.sim_edge_max = pd.DataFrame(columns=["q_total", "q_left", "q_right"])
+        self.sim_draft_min = pd.DataFrame(
+            columns=["q_total", "q_top", "q_left", "q_right"]
+        )
+        self.sim_draft_max = pd.DataFrame(
+            columns=["q_total", "q_top", "q_left", "q_right"]
+        )
+        self.sim_cells_trdi = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_cells_above = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_cells_below = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_cells_before = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_cells_after = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_shallow = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_depth_hold = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_depth_next = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_boat_hold = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_boat_next = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.u_contribution_meas = pd.DataFrame(
+            columns=["boat", "water", "depth", "dzi"]
+        )
+        self.u = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ]
+        )
+        self.u_measurement = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ]
+        )
+        self.u_contribution = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ]
+        )
+        self.u_contribution_measurement = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ]
+        )
+        self.u_user = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ]
+        )
+        self.u_measurement_user = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ]
+        )
+        self.u_contribution_user = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ]
+        )
+        self.u_contribution_measurement_user = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ]
+        )
 
     def populate_from_qrev_mat(self, meas_struct):
 
         # User provided parameters
-        self.user_advanced_settings = {'exp_pp_min_user': meas_struct.oursin.user_advanced_settings.exp_pp_min_user,
-                                       'exp_pp_max_user': meas_struct.oursin.user_advanced_settings.exp_pp_max_user,
-                                       'exp_ns_min_user': meas_struct.oursin.user_advanced_settings.exp_ns_min_user,
-                                       'exp_ns_max_user': meas_struct.oursin.user_advanced_settings.exp_ns_max_user,
-                                       'draft_error_m_user':
-                                           meas_struct.oursin.user_advanced_settings.draft_error_m_user,
-                                       'dzi_prct_user': meas_struct.oursin.user_advanced_settings.dzi_prct_user,
-                                       'right_edge_dist_prct_user':
-                                           meas_struct.oursin.user_advanced_settings.right_edge_dist_prct_user,
-                                       'left_edge_dist_prct_user':
-                                           meas_struct.oursin.user_advanced_settings.left_edge_dist_prct_user,
-                                       'gga_boat_mps_user': meas_struct.oursin.user_advanced_settings.gga_boat_mps_user,
-                                       'vtg_boat_mps_user': meas_struct.oursin.user_advanced_settings.vtg_boat_mps_user,
-                                       'compass_error_deg_user':
-                                           meas_struct.oursin.user_advanced_settings.compass_error_deg_user,
-                                       'cov_prior_user': meas_struct.oursin.user_advanced_settings.cov_prior_user,
-                                       'cov_prior_u_user': meas_struct.oursin.user_advanced_settings.cov_prior_u_user}
-
-        self.user_specified_u = {'u_syst_mean_user': meas_struct.oursin.user_specified_u.u_syst_mean_user,
-                                 'u_movbed_user': meas_struct.oursin.user_specified_u.u_movbed_user,
-                                 'u_compass_user': meas_struct.oursin.user_specified_u.u_compass_user,
-                                 'u_ens_user': meas_struct.oursin.user_specified_u.u_ens_user,
-                                 'u_meas_mean_user': meas_struct.oursin.user_specified_u.u_meas_mean_user,
-                                 'u_top_mean_user': meas_struct.oursin.user_specified_u.u_top_mean_user,
-                                 'u_bot_mean_user': meas_struct.oursin.user_specified_u.u_bot_mean_user,
-                                 'u_right_mean_user': meas_struct.oursin.user_specified_u.u_right_mean_user,
-                                 'u_left_mean_user': meas_struct.oursin.user_specified_u.u_left_mean_user,
-                                 'u_invalid_boat_user': meas_struct.oursin.user_specified_u.u_invalid_boat_user,
-                                 'u_invalid_depth_user': meas_struct.oursin.user_specified_u.u_invalid_depth_user,
-                                 'u_invalid_water_user': meas_struct.oursin.user_specified_u.u_invalid_water_user}
+        self.user_advanced_settings = {
+            "exp_pp_min_user": meas_struct.oursin.user_advanced_settings.exp_pp_min_user,
+            "exp_pp_max_user": meas_struct.oursin.user_advanced_settings.exp_pp_max_user,
+            "exp_ns_min_user": meas_struct.oursin.user_advanced_settings.exp_ns_min_user,
+            "exp_ns_max_user": meas_struct.oursin.user_advanced_settings.exp_ns_max_user,
+            "draft_error_m_user": meas_struct.oursin.user_advanced_settings.draft_error_m_user,
+            "dzi_prct_user": meas_struct.oursin.user_advanced_settings.dzi_prct_user,
+            "right_edge_dist_prct_user": meas_struct.oursin.user_advanced_settings.right_edge_dist_prct_user,
+            "left_edge_dist_prct_user": meas_struct.oursin.user_advanced_settings.left_edge_dist_prct_user,
+            "gga_boat_mps_user": meas_struct.oursin.user_advanced_settings.gga_boat_mps_user,
+            "vtg_boat_mps_user": meas_struct.oursin.user_advanced_settings.vtg_boat_mps_user,
+            "compass_error_deg_user": meas_struct.oursin.user_advanced_settings.compass_error_deg_user,
+            "cov_prior_user": meas_struct.oursin.user_advanced_settings.cov_prior_user,
+            "cov_prior_u_user": meas_struct.oursin.user_advanced_settings.cov_prior_u_user,
+        }
+
+        self.user_specified_u = {
+            "u_syst_mean_user": meas_struct.oursin.user_specified_u.u_syst_mean_user,
+            "u_movbed_user": meas_struct.oursin.user_specified_u.u_movbed_user,
+            "u_compass_user": meas_struct.oursin.user_specified_u.u_compass_user,
+            "u_ens_user": meas_struct.oursin.user_specified_u.u_ens_user,
+            "u_meas_mean_user": meas_struct.oursin.user_specified_u.u_meas_mean_user,
+            "u_top_mean_user": meas_struct.oursin.user_specified_u.u_top_mean_user,
+            "u_bot_mean_user": meas_struct.oursin.user_specified_u.u_bot_mean_user,
+            "u_right_mean_user": meas_struct.oursin.user_specified_u.u_right_mean_user,
+            "u_left_mean_user": meas_struct.oursin.user_specified_u.u_left_mean_user,
+            "u_invalid_boat_user": meas_struct.oursin.user_specified_u.u_invalid_boat_user,
+            "u_invalid_depth_user": meas_struct.oursin.user_specified_u.u_invalid_depth_user,
+            "u_invalid_water_user": meas_struct.oursin.user_specified_u.u_invalid_water_user,
+        }
 
         # Extrap results
         if type(meas_struct.oursin.bot_meth) is str:
@@ -481,9 +690,15 @@ class Oursin(object):
             self.u_top_mean_user_list = [meas_struct.oursin.u_top_mean_user_list]
             self.u_bot_mean_user_list = [meas_struct.oursin.u_bot_mean_user_list]
             self.u_left_mean_user_list = [meas_struct.oursin.u_left_mean_user_list]
-            self.u_invalid_boat_user_list = [meas_struct.oursin.u_invalid_boat_user_list]
-            self.u_invalid_depth_user_list = [meas_struct.oursin.u_invalid_depth_user_list]
-            self.u_invalid_water_user_list = [meas_struct.oursin.u_invalid_water_user_list]
+            self.u_invalid_boat_user_list = [
+                meas_struct.oursin.u_invalid_boat_user_list
+            ]
+            self.u_invalid_depth_user_list = [
+                meas_struct.oursin.u_invalid_depth_user_list
+            ]
+            self.u_invalid_water_user_list = [
+                meas_struct.oursin.u_invalid_water_user_list
+            ]
         else:
             self.u_syst_list = meas_struct.oursin.u_syst_list.tolist()
             self.u_compass_list = meas_struct.oursin.u_compass_list.tolist()
@@ -498,18 +713,32 @@ class Oursin(object):
             self.u_left_list = meas_struct.oursin.u_left_list.tolist()
             self.u_right_list = meas_struct.oursin.u_right_list.tolist()
 
-            self.u_syst_mean_user_list = meas_struct.oursin.u_syst_mean_user_list.tolist()
+            self.u_syst_mean_user_list = (
+                meas_struct.oursin.u_syst_mean_user_list.tolist()
+            )
             self.u_compass_user_list = meas_struct.oursin.u_compass_user_list.tolist()
             self.u_movbed_user_list = meas_struct.oursin.u_movbed_user_list.tolist()
-            self.u_meas_mean_user_list = meas_struct.oursin.u_meas_mean_user_list.tolist()
+            self.u_meas_mean_user_list = (
+                meas_struct.oursin.u_meas_mean_user_list.tolist()
+            )
             self.u_ens_user_list = meas_struct.oursin.u_ens_user_list.tolist()
             self.u_top_mean_user_list = meas_struct.oursin.u_top_mean_user_list.tolist()
             self.u_bot_mean_user_list = meas_struct.oursin.u_bot_mean_user_list.tolist()
-            self.u_left_mean_user_list = meas_struct.oursin.u_left_mean_user_list.tolist()
-            self.u_right_mean_user_list = meas_struct.oursin.u_right_mean_user_list.tolist()
-            self.u_invalid_boat_user_list = meas_struct.oursin.u_invalid_boat_user_list.tolist()
-            self.u_invalid_depth_user_list = meas_struct.oursin.u_invalid_depth_user_list.tolist()
-            self.u_invalid_water_user_list = meas_struct.oursin.u_invalid_water_user_list.tolist()
+            self.u_left_mean_user_list = (
+                meas_struct.oursin.u_left_mean_user_list.tolist()
+            )
+            self.u_right_mean_user_list = (
+                meas_struct.oursin.u_right_mean_user_list.tolist()
+            )
+            self.u_invalid_boat_user_list = (
+                meas_struct.oursin.u_invalid_boat_user_list.tolist()
+            )
+            self.u_invalid_depth_user_list = (
+                meas_struct.oursin.u_invalid_depth_user_list.tolist()
+            )
+            self.u_invalid_water_user_list = (
+                meas_struct.oursin.u_invalid_water_user_list.tolist()
+            )
 
         # COV
         self.cov_68 = meas_struct.oursin.cov_68
@@ -518,91 +747,266 @@ class Oursin(object):
         self.checked_idx = meas_struct.oursin.checked_idx
 
         # Reconstruct data frames from Matlab arrays
-        self.sim_original = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_original),
-                                         columns=['q_total', 'q_top', 'q_bot', 'q_left', 'q_right', 'q_middle'])
-        self.sim_extrap_pp_16 = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_extrap_pp_16),
-                                             columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_pp_opt = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_extrap_pp_opt),
-                                              columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_pp_min = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_extrap_pp_min),
-                                              columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_pp_max = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_extrap_pp_max),
-                                              columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_cns_16 = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_extrap_cns_16),
-                                              columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_cns_opt = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_extrap_cns_opt),
-                                               columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_cns_min = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_extrap_cns_min),
-                                               columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_cns_max = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_extrap_cns_max),
-                                               columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_3pns_16 = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_extrap_3pns_16),
-                                               columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_extrap_3pns_opt = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_extrap_3pns_opt),
-                                                columns=['q_total', 'q_top', 'q_bot'])
-        self.sim_edge_min = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_edge_min),
-                                         columns=['q_total', 'q_left', 'q_right'])
-        self.sim_edge_max = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_edge_max),
-                                         columns=['q_total', 'q_left', 'q_right'])
-        self.sim_draft_min = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_draft_min),
-                                          columns=['q_total', 'q_top', 'q_left', 'q_right'])
-        self.sim_draft_max = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_draft_max),
-                                          columns=['q_total', 'q_top', 'q_left', 'q_right'])
-        self.sim_cells_trdi = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_cells_trdi),
-                                           columns=['q_total', 'q_middle'])
-        self.sim_cells_above = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_cells_above),
-                                            columns=['q_total', 'q_middle'])
-        self.sim_cells_below = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_cells_below),
-                                            columns=['q_total', 'q_middle'])
-        self.sim_cells_before = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_cells_before),
-                                             columns=['q_total', 'q_middle'])
-        self.sim_cells_after = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_cells_after),
-                                            columns=['q_total', 'q_middle'])
-        self.sim_shallow = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_shallow),
-                                        columns=['q_total', 'q_middle'])
-        self.sim_depth_hold = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_depth_hold),
-                                           columns=['q_total', 'q_middle'])
-        self.sim_depth_next = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_depth_next),
-                                           columns=['q_total', 'q_middle'])
-        self.sim_boat_hold = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_boat_hold),
-                                          columns=['q_total', 'q_middle'])
-        self.sim_boat_next = pd.DataFrame(self.checkshape(meas_struct.oursin.sim_boat_next),
-                                          columns=['q_total', 'q_middle'])
-        self.u_contribution_meas = pd.DataFrame(self.checkshape(meas_struct.oursin.u_contribution_meas),
-                                                columns=['boat', 'water', 'dzi'])
-        self.u = pd.DataFrame(self.checkshape(meas_struct.oursin.u),
-                              columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top', 'u_bot',
-                                       'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water', 'u_cov', 'total',
-                                       'total_95'])
-        self.u_measurement = pd.DataFrame(self.checkshape(meas_struct.oursin.u_measurement),
-                                          columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top',
-                                                   'u_bot', 'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water',
-                                                   'u_cov', 'total', 'total_95'])
-        self.u_contribution = pd.DataFrame(self.checkshape(meas_struct.oursin.u_contribution),
-                                           columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top',
-                                                    'u_bot', 'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water',
-                                                    'u_cov', 'total'])
-        self.u_contribution_measurement = pd.DataFrame(self.checkshape(meas_struct.oursin.u_contribution_measurement),
-                                                       columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas',
-                                                                'u_top', 'u_bot', 'u_left', 'u_right', 'u_boat',
-                                                                'u_depth', 'u_water', 'u_cov', 'total'])
-        self.u_user = pd.DataFrame(self.checkshape(meas_struct.oursin.u_user),
-                                   columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top', 'u_bot',
-                                            'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water', 'u_cov', 'total',
-                                            'total_95'])
-        self.u_measurement_user = pd.DataFrame(self.checkshape(meas_struct.oursin.u_measurement_user),
-                                               columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top',
-                                                        'u_bot', 'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water',
-                                                        'u_cov', 'total', 'total_95'])
-        self.u_contribution_user = pd.DataFrame(self.checkshape(meas_struct.oursin.u_contribution_user),
-                                                columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top',
-                                                         'u_bot', 'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water',
-                                                         'u_cov', 'total'])
+        self.sim_original = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_original),
+            columns=["q_total", "q_top", "q_bot", "q_left", "q_right", "q_middle"],
+        )
+        self.sim_extrap_pp_16 = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_pp_16),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_pp_opt = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_pp_opt),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_pp_min = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_pp_min),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_pp_max = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_pp_max),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_cns_16 = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_cns_16),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_cns_opt = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_cns_opt),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_cns_min = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_cns_min),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_cns_max = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_cns_max),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_3pns_16 = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_3pns_16),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_3pns_opt = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_3pns_opt),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_edge_min = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_edge_min),
+            columns=["q_total", "q_left", "q_right"],
+        )
+        self.sim_edge_max = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_edge_max),
+            columns=["q_total", "q_left", "q_right"],
+        )
+        self.sim_draft_min = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_draft_min),
+            columns=["q_total", "q_top", "q_left", "q_right"],
+        )
+        self.sim_draft_max = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_draft_max),
+            columns=["q_total", "q_top", "q_left", "q_right"],
+        )
+        self.sim_cells_trdi = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_trdi),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_cells_above = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_above),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_cells_below = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_below),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_cells_before = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_before),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_cells_after = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_after),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_shallow = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_shallow),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_depth_hold = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_depth_hold),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_depth_next = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_depth_next),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_boat_hold = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_boat_hold),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_boat_next = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_boat_next),
+            columns=["q_total", "q_middle"],
+        )
+        self.u_contribution_meas = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_contribution_meas),
+            columns=["boat", "water", "dzi"],
+        )
+        self.u = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ],
+        )
+        self.u_measurement = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_measurement),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ],
+        )
+        self.u_contribution = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_contribution),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ],
+        )
+        self.u_contribution_measurement = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_contribution_measurement),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ],
+        )
+        self.u_user = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_user),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ],
+        )
+        self.u_measurement_user = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_measurement_user),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ],
+        )
+        self.u_contribution_user = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_contribution_user),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ],
+        )
         self.u_contribution_measurement_user = pd.DataFrame(
             self.checkshape(meas_struct.oursin.u_contribution_measurement_user),
-            columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens',
-                     'u_meas', 'u_top', 'u_bot', 'u_left', 'u_right',
-                     'u_boat', 'u_depth', 'u_water', 'u_cov', 'total'])
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ],
+        )
 
     @staticmethod
     def checkshape(a):
@@ -611,9 +1015,11 @@ class Oursin(object):
         return a
 
     # @profile
-    def compute_oursin(self, meas, user_advanced_settings=None, u_measurement_user=None):
-        """Computes the uncertainty for the components of the discharge measurement
-        using measurement data or user provided values.
+    def compute_oursin(
+        self, meas, user_advanced_settings=None, u_measurement_user=None
+    ):
+        """Computes the uncertainty for the components of the discharge
+        measurement using measurement data or user provided values.
 
         Parameters
         ----------
@@ -622,7 +1028,8 @@ class Oursin(object):
         user_advanced_settings: dict
             Dictionary of user input on advanced settings
         u_measurement_user: dict
-            Dictionary of user estimates of uncertainty, standard deviation in percent, for each component
+            Dictionary of user estimates of uncertainty, standard deviation
+            in percent, for each component
         """
 
         if user_advanced_settings is not None:
@@ -647,7 +1054,7 @@ class Oursin(object):
 
         # Prep data for computations
         self.data_prep(meas)
-        self.compute_measurement_cov(meas=meas, method='Bayes')
+        self.compute_measurement_cov(meas=meas, method="Bayes")
 
         # 1. Systematic terms + correction terms (moving bed)
         self.uncertainty_system()
@@ -661,7 +1068,8 @@ class Oursin(object):
         # 3. Run all the simulations to compute possible discharges
         self.run_simulations(meas)
 
-        # 4. Compute uncertainty terms based on simulations and assuming a rectangular law
+        # 4. Compute uncertainty terms based on simulations and assuming a
+        # rectangular law
         self.uncertainty_top_discharge()
         self.uncertainty_bottom_discharge()
         self.uncertainty_left_discharge()
@@ -671,39 +1079,64 @@ class Oursin(object):
         self.uncertainty_invalid_water_data()
 
         # 6. Compute combined uncertainty
-        self.u, self.u_measurement, self.u_contribution, self.u_contribution_measurement = \
-            self.compute_combined_uncertainty(u_syst=self.u_syst_list,
-                                              u_compass=self.u_compass_list,
-                                              u_movbed=self.u_movbed_list,
-                                              u_meas=self.u_meas_list,
-                                              u_ens=self.u_ens_list,
-                                              u_top=self.u_top_list,
-                                              u_bot=self.u_bot_list,
-                                              u_left=self.u_left_list,
-                                              u_right=self.u_right_list,
-                                              u_boat=self.u_invalid_boat_list,
-                                              u_depth=self.u_invalid_depth_list,
-                                              u_water=self.u_invalid_water_list,
-                                              cov_68=self.cov_68)
-
-        self.u_user, self.u_measurement_user, self.u_contribution_user, self.u_contribution_measurement_user = \
-            self.compute_combined_uncertainty(u_syst=self.u_syst_mean_user_list,
-                                              u_compass=self.u_compass_user_list,
-                                              u_movbed=self.u_movbed_user_list,
-                                              u_meas=self.u_meas_mean_user_list,
-                                              u_ens=self.u_ens_user_list,
-                                              u_top=self.u_top_mean_user_list,
-                                              u_bot=self.u_bot_mean_user_list,
-                                              u_left=self.u_left_mean_user_list,
-                                              u_right=self.u_right_mean_user_list,
-                                              u_boat=self.u_invalid_boat_user_list,
-                                              u_depth=self.u_invalid_depth_user_list,
-                                              u_water=self.u_invalid_water_user_list,
-                                              cov_68=self.cov_68)
+        (
+            self.u,
+            self.u_measurement,
+            self.u_contribution,
+            self.u_contribution_measurement,
+        ) = self.compute_combined_uncertainty(
+            u_syst=self.u_syst_list,
+            u_compass=self.u_compass_list,
+            u_movbed=self.u_movbed_list,
+            u_meas=self.u_meas_list,
+            u_ens=self.u_ens_list,
+            u_top=self.u_top_list,
+            u_bot=self.u_bot_list,
+            u_left=self.u_left_list,
+            u_right=self.u_right_list,
+            u_boat=self.u_invalid_boat_list,
+            u_depth=self.u_invalid_depth_list,
+            u_water=self.u_invalid_water_list,
+            cov_68=self.cov_68,
+        )
+
+        (
+            self.u_user,
+            self.u_measurement_user,
+            self.u_contribution_user,
+            self.u_contribution_measurement_user,
+        ) = self.compute_combined_uncertainty(
+            u_syst=self.u_syst_mean_user_list,
+            u_compass=self.u_compass_user_list,
+            u_movbed=self.u_movbed_user_list,
+            u_meas=self.u_meas_mean_user_list,
+            u_ens=self.u_ens_user_list,
+            u_top=self.u_top_mean_user_list,
+            u_bot=self.u_bot_mean_user_list,
+            u_left=self.u_left_mean_user_list,
+            u_right=self.u_right_mean_user_list,
+            u_boat=self.u_invalid_boat_user_list,
+            u_depth=self.u_invalid_depth_user_list,
+            u_water=self.u_invalid_water_user_list,
+            cov_68=self.cov_68,
+        )
 
     @staticmethod
-    def compute_combined_uncertainty(u_syst, u_compass, u_movbed, u_meas, u_ens, u_top, u_bot, u_left, u_right,
-                                     u_boat, u_depth, u_water, cov_68):
+    def compute_combined_uncertainty(
+        u_syst,
+        u_compass,
+        u_movbed,
+        u_meas,
+        u_ens,
+        u_top,
+        u_bot,
+        u_left,
+        u_right,
+        u_boat,
+        u_depth,
+        u_water,
+        cov_68,
+    ):
         """Combined the uncertainty for each transect and for the measurement
 
         Parameters
@@ -721,11 +1154,14 @@ class Oursin(object):
         u_top: list
             List of uncertainties due to top extrapolation in each transect
         u_bot: list
-            List of uncertainties due to the bottom extrapolation in each transect
+            List of uncertainties due to the bottom extrapolation in each
+            transect
         u_left: list
-            List of uncertainties due to the left edge discharge in each transect
+            List of uncertainties due to the left edge discharge in each
+            transect
         u_right: list
-            List of uncertainties due to the right edge discharge in each transect
+            List of uncertainties due to the right edge discharge in each
+            transect
         u_boat: list
             List of uncertainties due to invalid boat velocities
         u_depth: list
@@ -738,34 +1174,57 @@ class Oursin(object):
         Returns
         -------
         u_contribution_meas: DataFrame
-            DataFrame containing measured discharge uncertainty contribution from: boat, water, depth, and dzi
+            DataFrame containing measured discharge uncertainty contribution
+            from: boat, water, depth, and dzi
         u: DataFrame
-            DataFrame containing standard deviations in percent for each transect: u_syst, u_compass, u_movbed, u_ens,
-            u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water, u_cov, total, and total_95
+            DataFrame containing standard deviations in percent for each
+            transect: u_syst, u_compass, u_movbed, u_ens,
+            u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water,
+            u_cov, total, and total_95
         u_measurement: DataFrame
-            DataFrame containing standard deviations in percent for the whole measurement: u_syst, u_compass, u_movbed,
-            u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water, u_cov, total, and total_95
+            DataFrame containing standard deviations in percent for the
+            whole measurement: u_syst, u_compass, u_movbed,
+            u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+            u_water, u_cov, total, and total_95
         u_contribution_measurement: DataFrame
-            DataFrame containing uncertainty contribution in percent from: u_syst, u_compass, u_movbed,
-            u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water, u_cov, and total
+            DataFrame containing uncertainty contribution in percent from:
+            u_syst, u_compass, u_movbed,
+            u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+            u_water, u_cov, and total
         """
 
-        # Create a Dataframe with all computed uncertainty for each checked transect
-        u = pd.DataFrame(columns=['u_syst', 'u_compass', 'u_movbed', 'u_ens', 'u_meas', 'u_top', 'u_bot',
-                                  'u_left', 'u_right', 'u_boat', 'u_depth', 'u_water', 'u_cov'])
-        u['u_syst'] = u_syst
-        u['u_compass'] = u_compass
-        u['u_movbed'] = u_movbed
-        u['u_meas'] = u_meas
-        u['u_ens'] = u_ens
-        u['u_water'] = u_water
-        u['u_top'] = u_top
-        u['u_bot'] = u_bot
-        u['u_left'] = u_left
-        u['u_right'] = u_right
-        u['u_cov'] = cov_68
-        u['u_boat'] = u_boat
-        u['u_depth'] = u_depth
+        # Create a Dataframe with all computed uncertainty for each checked
+        # transect
+        u = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+            ]
+        )
+        u["u_syst"] = u_syst
+        u["u_compass"] = u_compass
+        u["u_movbed"] = u_movbed
+        u["u_meas"] = u_meas
+        u["u_ens"] = u_ens
+        u["u_water"] = u_water
+        u["u_top"] = u_top
+        u["u_bot"] = u_bot
+        u["u_left"] = u_left
+        u["u_right"] = u_right
+        u["u_cov"] = cov_68
+        u["u_boat"] = u_boat
+        u["u_depth"] = u_depth
 
         n_transects = len(u_ens)
 
@@ -775,45 +1234,56 @@ class Oursin(object):
         u2_measurement = u2.mean(axis=0, skipna=False).to_frame().T
 
         # Combined uncertainty by transect
-        # Sum of variance of each component, then sqrt, then multiply by 100 for percentage
-        # u['total'] = u2.drop(['u_cov'], axis=1).sum(axis=1, skipna=False) ** 0.5
-        u['total'] = (u2.sum(axis=1, skipna=False) ** 0.5)
-        u['total_95'] = u['total'] * 2
+        # Sum of variance of each component, then sqrt, then multiply by 100
+        # for percentage
+        # u['total'] = u2.drop(['u_cov'], axis=1).sum(axis=1, skipna=False)
+        # ** 0.5
+        u["total"] = u2.sum(axis=1, skipna=False) ** 0.5
+        u["total_95"] = u["total"] * 2
         u = u.mul(100)
 
         # Uncertainty for the measurement
-        # The random error is computed as a mean of the random error from the measured portion and the overall
+        # The random error is computed as a mean of the random error from
+        # the measured portion and the overall
         # random error from the COV.
-        u2_random = u2['u_meas'].mean(skipna=False) + u2['u_cov'].mean(skipna=False)
+        u2_random = u2["u_meas"].mean(skipna=False) + u2["u_cov"].mean(skipna=False)
 
-        # All other sources are systematic (mostly due to computation method and values from user)
-        u2_bias = u2_measurement.drop(['u_meas', 'u_cov'], axis=1).sum(axis=1, skipna=False)
+        # All other sources are systematic (mostly due to computation method
+        # and values from user)
+        u2_bias = u2_measurement.drop(["u_meas", "u_cov"], axis=1).sum(
+            axis=1, skipna=False
+        )
 
         # Combined all uncertainty sources
-        u2_measurement['total'] = (1 / n_transects) * u2_random + u2_bias[0]
-        u_measurement = u2_measurement ** 0.5
-        u_measurement['total_95'] = u_measurement['total'] * 2
+        u2_measurement["total"] = (1 / n_transects) * u2_random + u2_bias[0]
+        u_measurement = u2_measurement**0.5
+        u_measurement["total_95"] = u_measurement["total"] * 2
         u_measurement = u_measurement * 100
 
         # Compute relative contributions from each source
         u_contribution_measurement = u2_measurement.copy()
 
-        # Adjust contribution of u_meas and u_cov to account for number of transects
-        u_contribution_measurement['u_meas'] = u2_measurement['u_meas'] / n_transects
-        u_contribution_measurement['u_cov'] = u2_measurement['u_cov'] / n_transects
-        u_contribution_measurement = u_contribution_measurement.div(u_contribution_measurement['total'], axis=0)
+        # Adjust contribution of u_meas and u_cov to account for number of
+        # transects
+        u_contribution_measurement["u_meas"] = u2_measurement["u_meas"] / n_transects
+        u_contribution_measurement["u_cov"] = u2_measurement["u_cov"] / n_transects
+        u_contribution_measurement = u_contribution_measurement.div(
+            u_contribution_measurement["total"], axis=0
+        )
 
-        # Adjust contribution of u_meas and u_cov to account for number of transects
+        # Adjust contribution of u_meas and u_cov to account for number of
+        # transects
         u_contribution = u2.copy()
-        u_contribution['u_meas'] = u2['u_meas'].div(n_transects, axis=0)
-        u_contribution['u_cov'] = u2['u_cov'].div(n_transects, axis=0)
-        u_contribution['total'] = u_contribution.sum(axis=1)
-        u_contribution = u_contribution.div(u_contribution['total'], axis=0)
+        u_contribution["u_meas"] = u2["u_meas"].div(n_transects, axis=0)
+        u_contribution["u_cov"] = u2["u_cov"].div(n_transects, axis=0)
+        u_contribution["total"] = u_contribution.sum(axis=1)
+        u_contribution = u_contribution.div(u_contribution["total"], axis=0)
 
         return u, u_measurement, u_contribution, u_contribution_measurement
 
     def data_prep(self, meas):
-        """Determine checked transects and max and min exponents for power and no slip extrapolation.
+        """Determine checked transects and max and min exponents for power
+        and no slip extrapolation.
 
         Parameters
         ----------
@@ -837,14 +1307,19 @@ class Oursin(object):
                 # Bottom method selected using data from each transect only
                 self.bot_meth.append(meas.extrap_fit.sel_fit[n].bot_method_auto)
 
-                # Store 95 percent bounds on power fit exponent for each transect if power selected
+                # Store 95 percent bounds on power fit exponent for each
+                # transect if power selected
                 if meas.extrap_fit.sel_fit[n].bot_method_auto == "Power":
                     try:
-                        self.exp_95ic_min.append(meas.extrap_fit.sel_fit[n].exponent_95_ci[0])
+                        self.exp_95ic_min.append(
+                            meas.extrap_fit.sel_fit[n].exponent_95_ci[0]
+                        )
                     except TypeError:
                         self.exp_95ic_min.append(np.nan)
                     try:
-                        self.exp_95ic_max.append(meas.extrap_fit.sel_fit[n].exponent_95_ci[1])
+                        self.exp_95ic_max.append(
+                            meas.extrap_fit.sel_fit[n].exponent_95_ci[1]
+                        )
                     except TypeError:
                         self.exp_95ic_max.append(np.nan)
 
@@ -857,7 +1332,8 @@ class Oursin(object):
         self.nb_transects = len(self.checked_idx)
 
     def run_simulations(self, meas):
-        """Compute discharges (top, bot, right, left, total, middle)  based on possible scenarios
+        """Compute discharges (top, bot, right, left, total, middle)  based
+        on possible scenarios
 
         Parameters
         ----------
@@ -866,37 +1342,49 @@ class Oursin(object):
         """
 
         # If list have not be saved recompute q_sensitivity
-        if not hasattr(meas.extrap_fit.q_sensitivity, 'q_pp_list'):
-            meas.extrap_fit.q_sensitivity.populate_data(meas.transects, meas.extrap_fit.sel_fit)
+        if not hasattr(meas.extrap_fit.q_sensitivity, "q_pp_list"):
+            meas.extrap_fit.q_sensitivity.populate_data(
+                meas.transects, meas.extrap_fit.sel_fit
+            )
 
         # Simulation original
         self.sim_orig(meas)
 
         # Simulation power / power default 1/6
-        self.sim_extrap_pp_16['q_total'] = meas.extrap_fit.q_sensitivity.q_pp_list
-        self.sim_extrap_pp_16['q_top'] = meas.extrap_fit.q_sensitivity.q_top_pp_list
-        self.sim_extrap_pp_16['q_bot'] = meas.extrap_fit.q_sensitivity.q_bot_pp_list
+        self.sim_extrap_pp_16["q_total"] = meas.extrap_fit.q_sensitivity.q_pp_list
+        self.sim_extrap_pp_16["q_top"] = meas.extrap_fit.q_sensitivity.q_top_pp_list
+        self.sim_extrap_pp_16["q_bot"] = meas.extrap_fit.q_sensitivity.q_bot_pp_list
 
         # Simulations power / power optimized
         self.sim_pp_min_max_opt(meas=meas)
 
         # Simulation cns default 1/6
-        self.sim_extrap_cns_16['q_total'] = meas.extrap_fit.q_sensitivity.q_cns_list
-        self.sim_extrap_cns_16['q_top'] = meas.extrap_fit.q_sensitivity.q_top_cns_list
-        self.sim_extrap_cns_16['q_bot'] = meas.extrap_fit.q_sensitivity.q_bot_cns_list
+        self.sim_extrap_cns_16["q_total"] = meas.extrap_fit.q_sensitivity.q_cns_list
+        self.sim_extrap_cns_16["q_top"] = meas.extrap_fit.q_sensitivity.q_top_cns_list
+        self.sim_extrap_cns_16["q_bot"] = meas.extrap_fit.q_sensitivity.q_bot_cns_list
 
         # Simulation cns optimized
         self.sim_cns_min_max_opt(meas=meas)
 
         # Simulation 3pt no slip default 1/6
-        self.sim_extrap_3pns_16['q_total'] = meas.extrap_fit.q_sensitivity.q_3p_ns_list
-        self.sim_extrap_3pns_16['q_top'] = meas.extrap_fit.q_sensitivity.q_top_3p_ns_list
-        self.sim_extrap_3pns_16['q_bot'] = meas.extrap_fit.q_sensitivity.q_bot_3p_ns_list
+        self.sim_extrap_3pns_16["q_total"] = meas.extrap_fit.q_sensitivity.q_3p_ns_list
+        self.sim_extrap_3pns_16[
+            "q_top"
+        ] = meas.extrap_fit.q_sensitivity.q_top_3p_ns_list
+        self.sim_extrap_3pns_16[
+            "q_bot"
+        ] = meas.extrap_fit.q_sensitivity.q_bot_3p_ns_list
 
         # Simulation 3pt no slip optimized
-        self.sim_extrap_3pns_opt['q_total'] = meas.extrap_fit.q_sensitivity.q_3p_ns_opt_list
-        self.sim_extrap_3pns_opt['q_top'] = meas.extrap_fit.q_sensitivity.q_top_3p_ns_opt_list
-        self.sim_extrap_3pns_opt['q_bot'] = meas.extrap_fit.q_sensitivity.q_bot_3p_ns_opt_list
+        self.sim_extrap_3pns_opt[
+            "q_total"
+        ] = meas.extrap_fit.q_sensitivity.q_3p_ns_opt_list
+        self.sim_extrap_3pns_opt[
+            "q_top"
+        ] = meas.extrap_fit.q_sensitivity.q_top_3p_ns_opt_list
+        self.sim_extrap_3pns_opt[
+            "q_bot"
+        ] = meas.extrap_fit.q_sensitivity.q_bot_3p_ns_opt_list
 
         # Simulations edge min and max
         self.sim_edge_min_max(meas=meas)
@@ -925,85 +1413,110 @@ class Oursin(object):
             Object of class Measurement
         """
 
-        self.u_contribution_meas = pd.DataFrame(columns=['boat', 'water', 'dzi'])
+        self.u_contribution_meas = pd.DataFrame(columns=["boat", "water", "dzi"])
 
         # Set uncertainty of cell size
-        if np.isnan(self.user_advanced_settings['dzi_prct_user']):
-            u_dzi = self.default_advanced_settings['dzi_prct'] * 0.01
+        if np.isnan(self.user_advanced_settings["dzi_prct_user"]):
+            u_dzi = self.default_advanced_settings["dzi_prct"] * 0.01
         else:
-            u_dzi = self.user_advanced_settings['dzi_prct_user'] * 0.01
+            u_dzi = self.user_advanced_settings["dzi_prct_user"] * 0.01
 
         # Compute the uncertainty due to the measured area
         for transect_id in self.checked_idx:
 
             # Relative standard deviation of error velocity (Water Track)
-            std_ev_wt_ens = self.water_std_by_error_velocity(meas.transects[transect_id])
+            std_ev_wt_ens = self.water_std_by_error_velocity(
+                meas.transects[transect_id]
+            )
 
             u_boat = np.nan
-            if meas.transects[transect_id].boat_vel.selected == 'bt_vel':
+            if meas.transects[transect_id].boat_vel.selected == "bt_vel":
                 # Relative standard deviation of error velocity (Bottom Track)
                 u_boat = self.boat_std_by_error_velocity(meas.transects[transect_id])
 
-            elif meas.transects[transect_id].boat_vel.selected == 'gga_vel':
+            elif meas.transects[transect_id].boat_vel.selected == "gga_vel":
                 boat_std = np.nan
-                if np.isnan(self.user_advanced_settings['gga_boat_mps_user']):
+                if np.isnan(self.user_advanced_settings["gga_boat_mps_user"]):
                     if meas.transects[transect_id].gps.altitude_ens_m is not None:
-                        # Estimate the uncertainty in gga boat velocity as 1/3 of the standard deviation of
-                        # the elevation (estimate of horizontal position uncertainty) divided by time
-                        boat_std = (np.nanstd(meas.transects[transect_id].gps.altitude_ens_m, ddof=1) / 3) / \
-                                   np.nanmean(np.diff(meas.transects[transect_id].gps.gga_serial_time_ens))
+                        # Estimate the uncertainty in gga boat velocity as
+                        # 1/3 of the standard deviation of
+                        # the elevation (estimate of horizontal position
+                        # uncertainty) divided by time
+                        boat_std = (
+                            np.nanstd(
+                                meas.transects[transect_id].gps.altitude_ens_m, ddof=1
+                            )
+                            / 3
+                        ) / np.nanmean(
+                            np.diff(meas.transects[transect_id].gps.gga_serial_time_ens)
+                        )
                 else:
-                    boat_std = self.user_advanced_settings['gga_boat_mps']
+                    boat_std = self.user_advanced_settings["gga_boat_mps"]
                 if meas.transects[transect_id].boat_vel.gga_vel is not None:
                     u = meas.transects[transect_id].boat_vel.gga_vel.u_processed_mps
                     v = meas.transects[transect_id].boat_vel.gga_vel.v_processed_mps
-                    speed = np.sqrt(u ** 2 + v ** 2)
+                    speed = np.sqrt(u**2 + v**2)
                     u_boat = boat_std / speed
 
-            elif meas.transects[transect_id].boat_vel.selected == 'vtg_vel':
-                if np.isnan(self.user_advanced_settings['vtg_boat_mps_user']):
+            elif meas.transects[transect_id].boat_vel.selected == "vtg_vel":
+                if np.isnan(self.user_advanced_settings["vtg_boat_mps_user"]):
                     boat_std = np.nan
                     if meas.transects[transect_id].gps is not None:
-                        boat_std = self.default_advanced_settings['vtg_boat_mps']
+                        boat_std = self.default_advanced_settings["vtg_boat_mps"]
                 else:
-                    boat_std = self.user_advanced_settings['vtg_boat_mps_user']
+                    boat_std = self.user_advanced_settings["vtg_boat_mps_user"]
                 if meas.transects[transect_id].boat_vel.vtg_vel is not None:
                     u = meas.transects[transect_id].boat_vel.vtg_vel.u_processed_mps
                     v = meas.transects[transect_id].boat_vel.vtg_vel.v_processed_mps
-                    speed = np.sqrt(u ** 2 + v ** 2)
+                    speed = np.sqrt(u**2 + v**2)
                     u_boat = boat_std / speed
 
             # Computation of u_meas
             q_2_tran = meas.discharge[transect_id].total ** 2
             q_2_ens = meas.discharge[transect_id].middle_ens ** 2
-            n_cell_ens = meas.transects[transect_id].w_vel.cells_above_sl.sum(axis=0)  # number of cells by ens
+            n_cell_ens = meas.transects[transect_id].w_vel.cells_above_sl.sum(
+                axis=0
+            )  # number of cells by ens
             n_cell_ens = np.where(n_cell_ens == 0, np.nan, n_cell_ens)
 
             # Variance for each ensembles
-            u_2_meas = q_2_ens * (u_boat ** 2 + (1 / n_cell_ens) * (std_ev_wt_ens ** 2 + u_dzi ** 2))
+            u_2_meas = q_2_ens * (
+                u_boat**2 + (1 / n_cell_ens) * (std_ev_wt_ens**2 + u_dzi**2)
+            )
 
             u_2_prct_meas = np.nansum(u_2_meas) / q_2_tran
 
             # Standard deviation
-            u_prct_meas = u_2_prct_meas ** 0.5
+            u_prct_meas = u_2_prct_meas**0.5
             self.u_meas_list.append(u_prct_meas)
 
-            # Compute the contribution of all terms to u_meas (sum of a0 to g0 =1)
-            u_contrib_boat = (np.nan_to_num(q_2_ens * (u_boat ** 2)).sum() / q_2_tran) / u_2_prct_meas
-            u_contrib_water = (np.nan_to_num(q_2_ens * ((1 / n_cell_ens) * (std_ev_wt_ens ** 2))).sum()
-                               / q_2_tran) / u_2_prct_meas
-            u_contrib_dzi = (np.nan_to_num(q_2_ens * ((1 / n_cell_ens) * (u_dzi ** 2))).sum()
-                             / q_2_tran) / u_2_prct_meas
-
-            self.u_contribution_meas.loc[len(self.u_contribution_meas)] = [u_contrib_boat,
-                                                                           u_contrib_water,
-                                                                           u_contrib_dzi]
+            # Compute the contribution of all terms to u_meas (sum of a0 to
+            # g0 =1)
+            u_contrib_boat = (
+                np.nan_to_num(q_2_ens * (u_boat**2)).sum() / q_2_tran
+            ) / u_2_prct_meas
+            u_contrib_water = (
+                np.nan_to_num(q_2_ens * ((1 / n_cell_ens) * (std_ev_wt_ens**2))).sum()
+                / q_2_tran
+            ) / u_2_prct_meas
+            u_contrib_dzi = (
+                np.nan_to_num(q_2_ens * ((1 / n_cell_ens) * (u_dzi**2))).sum()
+                / q_2_tran
+            ) / u_2_prct_meas
+
+            self.u_contribution_meas.loc[len(self.u_contribution_meas)] = [
+                u_contrib_boat,
+                u_contrib_water,
+                u_contrib_dzi,
+            ]
 
         # Apply user specified uncertainty
-        if np.isnan(self.user_specified_u['u_meas_mean_user']):
+        if np.isnan(self.user_specified_u["u_meas_mean_user"]):
             self.u_meas_mean_user_list = self.u_meas_list
         else:
-            self.u_meas_mean_user_list = [0.01 * self.user_specified_u['u_meas_mean_user']] * self.nb_transects
+            self.u_meas_mean_user_list = [
+                0.01 * self.user_specified_u["u_meas_mean_user"]
+            ] * self.nb_transects
 
     def uncertainty_moving_bed(self, meas):
         """Computes the moving-bed uncertainty
@@ -1015,7 +1528,10 @@ class Oursin(object):
         """
 
         # Compute moving-bed uncertainty
-        if len(self.checked_idx) and meas.transects[self.checked_idx[0]].boat_vel.selected == 'bt_vel':
+        if (
+            len(self.checked_idx)
+            and meas.transects[self.checked_idx[0]].boat_vel.selected == "bt_vel"
+        ):
             # Boat velocity based on bottom track, moving-bed possible
             if len(meas.mb_tests) > 0:
                 # Moving_bed tests recorded
@@ -1025,7 +1541,7 @@ class Oursin(object):
                 used = []
                 for test in meas.mb_tests:
                     user_valid.append(test.user_valid)
-                    if test.test_quality == 'Errors':
+                    if test.test_quality == "Errors":
                         quality.append(False)
                     else:
                         quality.append(True)
@@ -1037,11 +1553,13 @@ class Oursin(object):
                     # Check to see if the valid tests indicate a moving bed
                     moving_bed_bool = []
                     for result in moving_bed:
-                        if result == 'Yes':
+                        if result == "Yes":
                             moving_bed_bool.append(True)
                         else:
                             moving_bed_bool.append(False)
-                    valid_moving_bed = np.logical_and(quality, np.asarray(moving_bed_bool))
+                    valid_moving_bed = np.logical_and(
+                        quality, np.asarray(moving_bed_bool)
+                    )
                     if np.any(valid_moving_bed):
                         # Check to see that a correction was used
                         if np.any(np.logical_and(valid_moving_bed, np.asarray(used))):
@@ -1068,26 +1586,30 @@ class Oursin(object):
         self.u_movbed_list = [0.01 * moving_bed_uncertainty / 2] * self.nb_transects
 
         # Apply user specified
-        if np.isnan(self.user_specified_u['u_movbed_user']):
+        if np.isnan(self.user_specified_u["u_movbed_user"]):
             self.u_movbed_user_list = self.u_movbed_list
         else:
-            self.u_movbed_user_list = [self.user_specified_u['u_movbed_user'] * 0.01] * self.nb_transects
+            self.u_movbed_user_list = [
+                self.user_specified_u["u_movbed_user"] * 0.01
+            ] * self.nb_transects
 
     def uncertainty_system(self):
-        """Compute systematic uncertainty
-        """
+        """Compute systematic uncertainty"""
 
         # Assume 1.31% systematic bias at 68%
         self.u_syst_list = [0.01 * 1.31] * self.nb_transects
 
         # Override with user specification if available
-        if np.isnan(self.user_specified_u['u_syst_mean_user']):
+        if np.isnan(self.user_specified_u["u_syst_mean_user"]):
             self.u_syst_mean_user_list = self.u_syst_list
         else:
-            self.u_syst_mean_user_list = [self.user_specified_u['u_syst_mean_user'] * 0.01] * self.nb_transects
+            self.u_syst_mean_user_list = [
+                self.user_specified_u["u_syst_mean_user"] * 0.01
+            ] * self.nb_transects
 
     def uncertainty_number_ensembles(self, meas):
-        """Computes the uncertainty due to the number of ensembles in a transect.
+        """Computes the uncertainty due to the number of ensembles in a
+        transect.
 
         Parameters
         ----------
@@ -1096,16 +1618,22 @@ class Oursin(object):
         """
 
         for trans_id in self.checked_idx:
-            # Compute uncertainty due to limited number of ensembles (ISO 748; Le Coz et al., 2012)
-            self.u_ens_list.append(0.01 * 32 * len(meas.discharge[trans_id].middle_ens) ** (-0.88))
+            # Compute uncertainty due to limited number of ensembles (ISO
+            # 748; Le Coz et al., 2012)
+            self.u_ens_list.append(
+                0.01 * 32 * len(meas.discharge[trans_id].middle_ens) ** (-0.88)
+            )
 
-        if np.isnan(self.user_specified_u['u_ens_user']):
+        if np.isnan(self.user_specified_u["u_ens_user"]):
             self.u_ens_user_list = self.u_ens_list
         else:
-            self.u_ens_user_list = [0.01 * self.user_specified_u['u_ens_user']] * self.nb_transects
+            self.u_ens_user_list = [
+                0.01 * self.user_specified_u["u_ens_user"]
+            ] * self.nb_transects
 
     def uncertainty_compass(self, meas):
-        """Compute the potential bias in the measurement due to dynamic compass errors when using GPS as
+        """Compute the potential bias in the measurement due to dynamic
+        compass errors when using GPS as
         the navigation reference. The method is based on Mueller (2018,
         https://doi.org/10.1016/j.flowmeasinst.2018.10.004, equation 41.
 
@@ -1116,157 +1644,217 @@ class Oursin(object):
         """
 
         # No compass error component for bottom track referenced discharges
-        if meas.transects[self.checked_idx[0]].boat_vel.selected == 'bt_vel':
+        if meas.transects[self.checked_idx[0]].boat_vel.selected == "bt_vel":
             self.u_compass_list = [0] * self.nb_transects
         else:
             # Assume a default compass error unless one is provided by the user
-            if np.isnan(self.user_advanced_settings['compass_error_deg_user']):
-                compass_error = self.default_advanced_settings['compass_error_deg']
+            if np.isnan(self.user_advanced_settings["compass_error_deg_user"]):
+                compass_error = self.default_advanced_settings["compass_error_deg"]
             else:
-                compass_error = self.user_advanced_settings['compass_error_deg_user']
+                compass_error = self.user_advanced_settings["compass_error_deg_user"]
 
             # Compute discharge bias based on compass error and boat speed
             meas_stats = meas.compute_measurement_properties(meas)
-            speed_ratio = meas_stats['avg_boat_speed'][self.checked_idx] / \
-                meas_stats['avg_water_speed'][self.checked_idx]
-            self.u_compass_list = np.abs(1 - (cosd(compass_error) + 0.5 * speed_ratio * sind(compass_error)))
+            speed_ratio = (
+                meas_stats["avg_boat_speed"][self.checked_idx]
+                / meas_stats["avg_water_speed"][self.checked_idx]
+            )
+            self.u_compass_list = np.abs(
+                1 - (cosd(compass_error) + 0.5 * speed_ratio * sind(compass_error))
+            )
 
         # Override if user provides uncertainty due to compass
-        if np.isnan(self.user_specified_u['u_compass_user']):
+        if np.isnan(self.user_specified_u["u_compass_user"]):
             self.u_compass_user_list = self.u_compass_list
         else:
-            self.u_compass_user_list = [self.user_specified_u['u_compass_user'] * 0.01] * self.nb_transects
+            self.u_compass_user_list = [
+                self.user_specified_u["u_compass_user"] * 0.01
+            ] * self.nb_transects
 
     def uncertainty_top_discharge(self):
-        """Computes the uncertainty in the top discharge using simulations and rectangular law.
+        """Computes the uncertainty in the top discharge using simulations
+        and rectangular law.
         """
 
-        self.u_top_list = list(Oursin.apply_u_rect(list_sims=[self.sim_original,
-                                                              self.sim_extrap_pp_opt,
-                                                              self.sim_extrap_pp_min,
-                                                              self.sim_extrap_pp_max,
-                                                              self.sim_extrap_cns_opt,
-                                                              self.sim_extrap_cns_min,
-                                                              self.sim_extrap_cns_max,
-                                                              self.sim_extrap_3pns_opt,
-                                                              self.sim_draft_max,
-                                                              self.sim_draft_min],
-                                                   col_name='q_top')
-                               / np.abs(self.sim_original['q_total']))
-
-        if np.isnan(self.user_specified_u['u_top_mean_user']):
+        self.u_top_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[
+                    self.sim_original,
+                    self.sim_extrap_pp_opt,
+                    self.sim_extrap_pp_min,
+                    self.sim_extrap_pp_max,
+                    self.sim_extrap_cns_opt,
+                    self.sim_extrap_cns_min,
+                    self.sim_extrap_cns_max,
+                    self.sim_extrap_3pns_opt,
+                    self.sim_draft_max,
+                    self.sim_draft_min,
+                ],
+                col_name="q_top",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_top_mean_user"]):
             self.u_top_mean_user_list = self.u_top_list
         else:
-            self.u_top_mean_user_list = [0.01 * self.user_specified_u['u_top_mean_user']] * self.nb_transects
+            self.u_top_mean_user_list = [
+                0.01 * self.user_specified_u["u_top_mean_user"]
+            ] * self.nb_transects
 
     def uncertainty_bottom_discharge(self):
-        """Computes uncertainty of bottom discharge using simulations and rectangular law.
+        """Computes uncertainty of bottom discharge using simulations and
+        rectangular law.
         """
 
-        self.u_bot_list = list(Oursin.apply_u_rect(list_sims=[self.sim_original,
-                                                              self.sim_extrap_pp_opt,
-                                                              self.sim_extrap_pp_min,
-                                                              self.sim_extrap_pp_max,
-                                                              self.sim_extrap_cns_opt,
-                                                              self.sim_extrap_cns_min,
-                                                              self.sim_extrap_cns_max,
-                                                              self.sim_extrap_3pns_opt],
-                                                   col_name='q_bot')
-                               / np.abs(self.sim_original['q_total']))
-
-        if np.isnan(self.user_specified_u['u_bot_mean_user']):
+        self.u_bot_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[
+                    self.sim_original,
+                    self.sim_extrap_pp_opt,
+                    self.sim_extrap_pp_min,
+                    self.sim_extrap_pp_max,
+                    self.sim_extrap_cns_opt,
+                    self.sim_extrap_cns_min,
+                    self.sim_extrap_cns_max,
+                    self.sim_extrap_3pns_opt,
+                ],
+                col_name="q_bot",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_bot_mean_user"]):
             self.u_bot_mean_user_list = self.u_bot_list
         else:
-            self.u_bot_mean_user_list = [0.01 * self.user_specified_u['u_bot_mean_user']] * self.nb_transects
+            self.u_bot_mean_user_list = [
+                0.01 * self.user_specified_u["u_bot_mean_user"]
+            ] * self.nb_transects
 
     def uncertainty_left_discharge(self):
-        """Computes the uncertianty of the left edge discharge using simulations and the rectangular law.
+        """Computes the uncertianty of the left edge discharge using
+        simulations and the rectangular law.
         """
 
-        self.u_left_list = list(Oursin.apply_u_rect(list_sims=[self.sim_original['q_left'],
-                                                               self.sim_edge_min,
-                                                               self.sim_edge_max,
-                                                               self.sim_draft_min,
-                                                               self.sim_draft_max],
-                                                    col_name='q_left')
-                                / np.abs(self.sim_original['q_total']))
-
-        if np.isnan(self.user_specified_u['u_left_mean_user']):
+        self.u_left_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[
+                    self.sim_original["q_left"],
+                    self.sim_edge_min,
+                    self.sim_edge_max,
+                    self.sim_draft_min,
+                    self.sim_draft_max,
+                ],
+                col_name="q_left",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_left_mean_user"]):
             self.u_left_mean_user_list = self.u_left_list
         else:
-            self.u_left_mean_user_list = [0.01 * self.user_specified_u['u_left_mean_user']] * self.nb_transects
+            self.u_left_mean_user_list = [
+                0.01 * self.user_specified_u["u_left_mean_user"]
+            ] * self.nb_transects
 
     def uncertainty_right_discharge(self):
-        """Computes the uncertainty of the right edge discharge using simulations and the rectangular law.
+        """Computes the uncertainty of the right edge discharge using
+        simulations and the rectangular law.
         """
 
-        self.u_right_list = list(Oursin.apply_u_rect(list_sims=[self.sim_original['q_right'],
-                                                                self.sim_edge_min,
-                                                                self.sim_edge_max,
-                                                                self.sim_draft_min,
-                                                                self.sim_draft_max],
-                                                     col_name='q_right')
-                                 / np.abs(self.sim_original['q_total']))
-
-        if np.isnan(self.user_specified_u['u_right_mean_user']):
+        self.u_right_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[
+                    self.sim_original["q_right"],
+                    self.sim_edge_min,
+                    self.sim_edge_max,
+                    self.sim_draft_min,
+                    self.sim_draft_max,
+                ],
+                col_name="q_right",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_right_mean_user"]):
             self.u_right_mean_user_list = self.u_right_list
         else:
-            self.u_right_mean_user_list = [0.01 * self.user_specified_u['u_right_mean_user']] * self.nb_transects
+            self.u_right_mean_user_list = [
+                0.01 * self.user_specified_u["u_right_mean_user"]
+            ] * self.nb_transects
 
     def uncertainty_invalid_depth_data(self):
-        """Computes the uncertainty due to invalid depth data using simulations and the retangular law.
+        """Computes the uncertainty due to invalid depth data using
+        simulations and the rectangular law.
         """
 
-        self.u_invalid_depth_list = list(Oursin.apply_u_rect(list_sims=[self.sim_original,
-                                                                        self.sim_depth_hold,
-                                                                        self.sim_depth_next],
-                                                             col_name='q_total')
-                                         / np.abs(self.sim_original['q_total']))
+        self.u_invalid_depth_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[self.sim_original, self.sim_depth_hold, self.sim_depth_next],
+                col_name="q_total",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
 
-        if np.isnan(self.user_specified_u['u_invalid_depth_user']):
+        if np.isnan(self.user_specified_u["u_invalid_depth_user"]):
             self.u_invalid_depth_user_list = self.u_invalid_depth_list
         else:
-            self.u_invalid_depth_user_list = [0.01 * self.user_specified_u[
-                'u_invalid_depth_user']] * self.nb_transects
+            self.u_invalid_depth_user_list = [
+                0.01 * self.user_specified_u["u_invalid_depth_user"]
+            ] * self.nb_transects
 
     def uncertainty_invalid_boat_data(self):
-        """Computes the uncertainty due to invalid boat data using simulations and the rectangular law.
+        """Computes the uncertainty due to invalid boat data using
+        simulations and the rectangular law.
         """
 
-        self.u_invalid_boat_list = list(Oursin.apply_u_rect(list_sims=[self.sim_original,
-                                                                       self.sim_boat_hold,
-                                                                       self.sim_boat_next],
-                                                            col_name='q_total')
-                                        / np.abs(self.sim_original['q_total']))
+        self.u_invalid_boat_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[self.sim_original, self.sim_boat_hold, self.sim_boat_next],
+                col_name="q_total",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
 
-        if np.isnan(self.user_specified_u['u_invalid_boat_user']):
+        if np.isnan(self.user_specified_u["u_invalid_boat_user"]):
             self.u_invalid_boat_user_list = self.u_invalid_boat_list
         else:
-            self.u_invalid_boat_user_list = [0.01 * self.user_specified_u['u_invalid_boat_user']] * self.nb_transects
+            self.u_invalid_boat_user_list = [
+                0.01 * self.user_specified_u["u_invalid_boat_user"]
+            ] * self.nb_transects
 
     def uncertainty_invalid_water_data(self):
-        """Computes the uncertainty due to invalid water data assuming rectangular law.
+        """Computes the uncertainty due to invalid water data assuming
+        rectangular law.
         """
 
         # Uncertainty due to invalid cells and ensembles
-        self.u_invalid_water_list = list(Oursin.apply_u_rect(list_sims=[self.sim_original,
-                                                                        self.sim_cells_trdi,
-                                                                        self.sim_cells_above,
-                                                                        self.sim_cells_below,
-                                                                        self.sim_cells_before,
-                                                                        self.sim_cells_after,
-                                                                        self.sim_shallow],
-                                                             col_name='q_total')
-                                         / np.abs(self.sim_original['q_total']))
-
-        if np.isnan(self.user_specified_u['u_invalid_water_user']):
+        self.u_invalid_water_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[
+                    self.sim_original,
+                    self.sim_cells_trdi,
+                    self.sim_cells_above,
+                    self.sim_cells_below,
+                    self.sim_cells_before,
+                    self.sim_cells_after,
+                    self.sim_shallow,
+                ],
+                col_name="q_total",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_invalid_water_user"]):
             self.u_invalid_water_user_list = self.u_invalid_water_list
         else:
-            self.u_invalid_water_user_list = [0.01 * self.user_specified_u['u_invalid_water_user']] \
-                                             * self.nb_transects
+            self.u_invalid_water_user_list = [
+                0.01 * self.user_specified_u["u_invalid_water_user"]
+            ] * self.nb_transects
 
-    def compute_measurement_cov(self, meas, method='Bayes'):
-        """Compute the coefficient of variation of the total transect discharges used in the measurement.
+    def compute_measurement_cov(self, meas, method="Bayes"):
+        """Compute the coefficient of variation of the total transect
+        discharges used in the measurement.
 
         Parameters
         ----------
@@ -1278,7 +1866,7 @@ class Oursin(object):
 
         self.cov_68 = np.nan
 
-        if method == 'QRev':
+        if method == "QRev":
 
             # Only compute for multiple transects
             if self.nb_transects > 1:
@@ -1291,26 +1879,32 @@ class Oursin(object):
 
                 # Inflate the cov to the 95% value
                 if len(total_q) == 2:
-                    # Use the approximate method as taught in class to reduce the high coverage factor for 2 transects
-                    # and account for prior knowledge related to 720 second duration analysis
+                    # Use the approximate method as taught in class to
+                    # reduce the high coverage factor for 2 transects
+                    # and account for prior knowledge related to 720 second
+                    # duration analysis
                     cov_95 = cov * 3.3
                     self.cov_68 = cov_95 / 2
                 else:
                     # Use Student's t to inflate COV for n > 2
-                    cov_95 = t.interval(0.95, len(total_q) - 1)[1] * cov / len(total_q) ** 0.5
+                    cov_95 = (
+                        t.interval(0.95, len(total_q) - 1)[1]
+                        * cov
+                        / len(total_q) ** 0.5
+                    )
                     self.cov_68 = cov_95 / 2
-        elif method == 'Bayes':
+        elif method == "Bayes":
 
             # Set prior
-            if np.isnan(meas.oursin.user_advanced_settings['cov_prior_user']):
-                cov_prior = meas.oursin.default_advanced_settings['cov_prior']
+            if np.isnan(meas.oursin.user_advanced_settings["cov_prior_user"]):
+                cov_prior = meas.oursin.default_advanced_settings["cov_prior"]
             else:
-                cov_prior = meas.oursin.user_advanced_settings['cov_prior_user']
+                cov_prior = meas.oursin.user_advanced_settings["cov_prior_user"]
 
-            if np.isnan(meas.oursin.user_advanced_settings['cov_prior_u_user']):
-                cov_prior_u = meas.oursin.default_advanced_settings['cov_prior_u']
+            if np.isnan(meas.oursin.user_advanced_settings["cov_prior_u_user"]):
+                cov_prior_u = meas.oursin.default_advanced_settings["cov_prior_u"]
             else:
-                cov_prior_u = meas.oursin.user_advanced_settings['cov_prior_u_user']
+                cov_prior_u = meas.oursin.user_advanced_settings["cov_prior_u_user"]
 
             # Create list of observations
             transects_total_q = []
@@ -1318,7 +1912,9 @@ class Oursin(object):
                 transects_total_q.append(meas.discharge[idx].total)
 
             # Compute COV
-            self.cov_68 = bayes_cov(np.array(transects_total_q), cov_prior, cov_prior_u, 20000)
+            self.cov_68 = bayes_cov(
+                np.array(transects_total_q), cov_prior, cov_prior_u, 20000
+            )
 
     def sim_orig(self, meas):
         """Stores original measurement results in a data frame
@@ -1331,17 +1927,19 @@ class Oursin(object):
         self.sim_original = self.sim_original.iloc[0:0]
         transect_q = dict()
         for trans_id in self.checked_idx:
-            transect_q['q_total'] = meas.discharge[trans_id].total
-            transect_q['q_top'] = meas.discharge[trans_id].top
-            transect_q['q_bot'] = meas.discharge[trans_id].bottom
-            transect_q['q_right'] = meas.discharge[trans_id].right
-            transect_q['q_left'] = meas.discharge[trans_id].left
-            transect_q['q_middle'] = meas.discharge[trans_id].middle
-            self.sim_original = self.sim_original.append(transect_q, ignore_index=True, sort=False)
+            transect_q["q_total"] = meas.discharge[trans_id].total
+            transect_q["q_top"] = meas.discharge[trans_id].top
+            transect_q["q_bot"] = meas.discharge[trans_id].bottom
+            transect_q["q_right"] = meas.discharge[trans_id].right
+            transect_q["q_left"] = meas.discharge[trans_id].left
+            transect_q["q_middle"] = meas.discharge[trans_id].middle
+            self.sim_original = self.sim_original.append(
+                transect_q, ignore_index=True, sort=False
+            )
 
     def sim_cns_min_max_opt(self, meas):
-        """Computes simulations resulting in the the min and max discharges for a constant no slip extrapolation
-        fit.
+        """Computes simulations resulting in the min and max discharges
+        for a constant no slip extrapolation fit.
 
         Parameters
         ----------
@@ -1350,49 +1948,84 @@ class Oursin(object):
         """
 
         # Compute min-max no slip exponent
-        skip_ns_min_max, self.exp_ns_max, self.exp_ns_min = \
-            self.compute_ns_max_min(meas=meas,
-                                    ns_exp=self.ns_exp,
-                                    exp_ns_min_user=self.user_advanced_settings['exp_ns_min_user'],
-                                    exp_ns_max_user=self.user_advanced_settings['exp_ns_max_user'])
+        skip_ns_min_max, self.exp_ns_max, self.exp_ns_min = self.compute_ns_max_min(
+            meas=meas,
+            ns_exp=self.ns_exp,
+            exp_ns_min_user=self.user_advanced_settings["exp_ns_min_user"],
+            exp_ns_max_user=self.user_advanced_settings["exp_ns_max_user"],
+        )
 
         # Optimized
-        self.sim_extrap_cns_opt['q_total'] = meas.extrap_fit.q_sensitivity.q_cns_opt_list
-        self.sim_extrap_cns_opt['q_top'] = meas.extrap_fit.q_sensitivity.q_top_cns_opt_list
-        self.sim_extrap_cns_opt['q_bot'] = meas.extrap_fit.q_sensitivity.q_bot_cns_opt_list
+        self.sim_extrap_cns_opt[
+            "q_total"
+        ] = meas.extrap_fit.q_sensitivity.q_cns_opt_list
+        self.sim_extrap_cns_opt[
+            "q_top"
+        ] = meas.extrap_fit.q_sensitivity.q_top_cns_opt_list
+        self.sim_extrap_cns_opt[
+            "q_bot"
+        ] = meas.extrap_fit.q_sensitivity.q_bot_cns_opt_list
 
         # Max min
         if skip_ns_min_max:
             # If cns not used both max and min are equal to the optimized value
-            self.sim_extrap_cns_min['q_total'] = meas.extrap_fit.q_sensitivity.q_cns_opt_list
-            self.sim_extrap_cns_min['q_top'] = meas.extrap_fit.q_sensitivity.q_top_cns_opt_list
-            self.sim_extrap_cns_min['q_bot'] = meas.extrap_fit.q_sensitivity.q_bot_cns_opt_list
-            self.sim_extrap_cns_max['q_total'] = meas.extrap_fit.q_sensitivity.q_cns_opt_list
-            self.sim_extrap_cns_max['q_top'] = meas.extrap_fit.q_sensitivity.q_top_cns_opt_list
-            self.sim_extrap_cns_max['q_bot'] = meas.extrap_fit.q_sensitivity.q_bot_cns_opt_list
+            self.sim_extrap_cns_min[
+                "q_total"
+            ] = meas.extrap_fit.q_sensitivity.q_cns_opt_list
+            self.sim_extrap_cns_min[
+                "q_top"
+            ] = meas.extrap_fit.q_sensitivity.q_top_cns_opt_list
+            self.sim_extrap_cns_min[
+                "q_bot"
+            ] = meas.extrap_fit.q_sensitivity.q_bot_cns_opt_list
+            self.sim_extrap_cns_max[
+                "q_total"
+            ] = meas.extrap_fit.q_sensitivity.q_cns_opt_list
+            self.sim_extrap_cns_max[
+                "q_top"
+            ] = meas.extrap_fit.q_sensitivity.q_top_cns_opt_list
+            self.sim_extrap_cns_max[
+                "q_bot"
+            ] = meas.extrap_fit.q_sensitivity.q_bot_cns_opt_list
         else:
             # Compute q for min and max values
             q = QComp()
-            self.sim_extrap_cns_min = pd.DataFrame(columns=self.sim_extrap_cns_min.columns)
-            self.sim_extrap_cns_max = pd.DataFrame(columns=self.sim_extrap_cns_max.columns)
+            self.sim_extrap_cns_min = pd.DataFrame(
+                columns=self.sim_extrap_cns_min.columns
+            )
+            self.sim_extrap_cns_max = pd.DataFrame(
+                columns=self.sim_extrap_cns_max.columns
+            )
 
             for trans_id in self.checked_idx:
                 # Compute min values
-                q.populate_data(data_in=meas.transects[trans_id],
-                                top_method='Constant',
-                                bot_method='No Slip',
-                                exponent=self.exp_ns_min)
-                self.sim_extrap_cns_min.loc[len(self.sim_extrap_cns_min)] = [q.total, q.top, q.bottom]
+                q.populate_data(
+                    data_in=meas.transects[trans_id],
+                    top_method="Constant",
+                    bot_method="No Slip",
+                    exponent=self.exp_ns_min,
+                )
+                self.sim_extrap_cns_min.loc[len(self.sim_extrap_cns_min)] = [
+                    q.total,
+                    q.top,
+                    q.bottom,
+                ]
                 # Compute max values
-                q.populate_data(data_in=meas.transects[trans_id],
-                                top_method='Constant',
-                                bot_method='No Slip',
-                                exponent=self.exp_ns_max)
-                self.sim_extrap_cns_max.loc[len(self.sim_extrap_cns_max)] = [q.total, q.top, q.bottom]
+                q.populate_data(
+                    data_in=meas.transects[trans_id],
+                    top_method="Constant",
+                    bot_method="No Slip",
+                    exponent=self.exp_ns_max,
+                )
+                self.sim_extrap_cns_max.loc[len(self.sim_extrap_cns_max)] = [
+                    q.total,
+                    q.top,
+                    q.bottom,
+                ]
 
     def sim_pp_min_max_opt(self, meas):
-        """Computes simulations resulting in the the min and max discharges for a power power extrapolation
-        fit.
+        """Computes simulations resulting in the the min and max discharges
+        for a power power extrapolation fit.
 
         Parameters
         ----------
@@ -1402,51 +2035,86 @@ class Oursin(object):
 
         # A power fit is not applicable to bi-directional flow
         mean_q = meas.mean_discharges(meas)
-        if np.sign(mean_q['top_mean']) != np.sign(mean_q['bot_mean']):
-            self.sim_extrap_pp_min = self.sim_original[['q_total', 'q_top', 'q_bot']]
-            self.sim_extrap_pp_max = self.sim_original[['q_total', 'q_top', 'q_bot']]
-            self.sim_extrap_pp_opt = self.sim_original[['q_total', 'q_top', 'q_bot']]
+        if np.sign(mean_q["top_mean"]) != np.sign(mean_q["bot_mean"]):
+            self.sim_extrap_pp_min = self.sim_original[["q_total", "q_top", "q_bot"]]
+            self.sim_extrap_pp_max = self.sim_original[["q_total", "q_top", "q_bot"]]
+            self.sim_extrap_pp_opt = self.sim_original[["q_total", "q_top", "q_bot"]]
 
         else:
             # Compute min-max power exponent
-            skip_pp_min_max, self.exp_pp_max, self.exp_pp_min = \
-                self.compute_pp_max_min(meas=meas,
-                                        exp_95ic_min=self.exp_95ic_min,
-                                        exp_95ic_max=self.exp_95ic_max,
-                                        pp_exp=self.pp_exp,
-                                        exp_pp_min_user=self.user_advanced_settings['exp_pp_min_user'],
-                                        exp_pp_max_user=self.user_advanced_settings['exp_pp_max_user'])
+            skip_pp_min_max, self.exp_pp_max, self.exp_pp_min = self.compute_pp_max_min(
+                meas=meas,
+                exp_95ic_min=self.exp_95ic_min,
+                exp_95ic_max=self.exp_95ic_max,
+                pp_exp=self.pp_exp,
+                exp_pp_min_user=self.user_advanced_settings["exp_pp_min_user"],
+                exp_pp_max_user=self.user_advanced_settings["exp_pp_max_user"],
+            )
 
             # Optimized
-            self.sim_extrap_pp_opt['q_total'] = meas.extrap_fit.q_sensitivity.q_pp_opt_list
-            self.sim_extrap_pp_opt['q_top'] = meas.extrap_fit.q_sensitivity.q_top_pp_opt_list
-            self.sim_extrap_pp_opt['q_bot'] = meas.extrap_fit.q_sensitivity.q_bot_pp_opt_list
+            self.sim_extrap_pp_opt[
+                "q_total"
+            ] = meas.extrap_fit.q_sensitivity.q_pp_opt_list
+            self.sim_extrap_pp_opt[
+                "q_top"
+            ] = meas.extrap_fit.q_sensitivity.q_top_pp_opt_list
+            self.sim_extrap_pp_opt[
+                "q_bot"
+            ] = meas.extrap_fit.q_sensitivity.q_bot_pp_opt_list
 
             # Max min
             if skip_pp_min_max:
-                self.sim_extrap_pp_min['q_total'] = meas.extrap_fit.q_sensitivity.q_pp_opt_list
-                self.sim_extrap_pp_min['q_top'] = meas.extrap_fit.q_sensitivity.q_top_pp_opt_list
-                self.sim_extrap_pp_min['q_bot'] = meas.extrap_fit.q_sensitivity.q_bot_pp_opt_list
-                self.sim_extrap_pp_max['q_total'] = meas.extrap_fit.q_sensitivity.q_pp_opt_list
-                self.sim_extrap_pp_max['q_top'] = meas.extrap_fit.q_sensitivity.q_top_pp_opt_list
-                self.sim_extrap_pp_max['q_bot'] = meas.extrap_fit.q_sensitivity.q_bot_pp_opt_list
+                self.sim_extrap_pp_min[
+                    "q_total"
+                ] = meas.extrap_fit.q_sensitivity.q_pp_opt_list
+                self.sim_extrap_pp_min[
+                    "q_top"
+                ] = meas.extrap_fit.q_sensitivity.q_top_pp_opt_list
+                self.sim_extrap_pp_min[
+                    "q_bot"
+                ] = meas.extrap_fit.q_sensitivity.q_bot_pp_opt_list
+                self.sim_extrap_pp_max[
+                    "q_total"
+                ] = meas.extrap_fit.q_sensitivity.q_pp_opt_list
+                self.sim_extrap_pp_max[
+                    "q_top"
+                ] = meas.extrap_fit.q_sensitivity.q_top_pp_opt_list
+                self.sim_extrap_pp_max[
+                    "q_bot"
+                ] = meas.extrap_fit.q_sensitivity.q_bot_pp_opt_list
             else:
                 q = QComp()
-                self.sim_extrap_pp_min = pd.DataFrame(columns=self.sim_extrap_pp_min.columns)
-                self.sim_extrap_pp_max = pd.DataFrame(columns=self.sim_extrap_pp_max.columns)
+                self.sim_extrap_pp_min = pd.DataFrame(
+                    columns=self.sim_extrap_pp_min.columns
+                )
+                self.sim_extrap_pp_max = pd.DataFrame(
+                    columns=self.sim_extrap_pp_max.columns
+                )
 
                 for trans_id in self.checked_idx:
-                    q.populate_data(data_in=meas.transects[trans_id],
-                                    top_method='Power',
-                                    bot_method='Power',
-                                    exponent=self.exp_pp_min)
-                    self.sim_extrap_pp_min.loc[len(self.sim_extrap_pp_min)] = [q.total, q.top, q.bottom]
-
-                    q.populate_data(data_in=meas.transects[trans_id],
-                                    top_method='Power',
-                                    bot_method='Power',
-                                    exponent=self.exp_pp_max)
-                    self.sim_extrap_pp_max.loc[len(self.sim_extrap_pp_max)] = [q.total, q.top, q.bottom]
+                    q.populate_data(
+                        data_in=meas.transects[trans_id],
+                        top_method="Power",
+                        bot_method="Power",
+                        exponent=self.exp_pp_min,
+                    )
+                    self.sim_extrap_pp_min.loc[len(self.sim_extrap_pp_min)] = [
+                        q.total,
+                        q.top,
+                        q.bottom,
+                    ]
+
+                    q.populate_data(
+                        data_in=meas.transects[trans_id],
+                        top_method="Power",
+                        bot_method="Power",
+                        exponent=self.exp_pp_max,
+                    )
+                    self.sim_extrap_pp_max.loc[len(self.sim_extrap_pp_max)] = [
+                        q.total,
+                        q.top,
+                        q.bottom,
+                    ]
 
     def sim_edge_min_max(self, meas):
         """Computes simulations for the maximum and minimum edge discharges.
@@ -1471,39 +2139,53 @@ class Oursin(object):
         # Process each checked transect
         for trans_id in self.checked_idx:
             # Compute max and min edge distances
-            max_left_dist, max_right_dist, min_left_dist, min_right_dist = \
-                self.compute_edge_dist_max_min(transect=meas.transects[trans_id],
-                                               user_settings=self.user_advanced_settings,
-                                               default_settings=self.default_advanced_settings)
+            (
+                max_left_dist,
+                max_right_dist,
+                min_left_dist,
+                min_right_dist,
+            ) = self.compute_edge_dist_max_min(
+                transect=meas.transects[trans_id],
+                user_settings=self.user_advanced_settings,
+                default_settings=self.default_advanced_settings,
+            )
 
             # Compute edge minimum
             self.d_right_error_min.append(min_right_dist)
             self.d_left_error_min.append(min_left_dist)
             meas_temp.transects[trans_id].edges.left.distance_m = min_left_dist
             meas_temp.transects[trans_id].edges.right.distance_m = min_right_dist
-            meas_temp.transects[trans_id].edges.left.type = 'Triangular'
-            meas_temp.transects[trans_id].edges.right.type = 'Triangular'
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_edge_min.loc[len(self.sim_edge_min)] = [meas_temp.discharge[trans_id].total,
-                                                             meas_temp.discharge[trans_id].left,
-                                                             meas_temp.discharge[trans_id].right]
+            meas_temp.transects[trans_id].edges.left.type = "Triangular"
+            meas_temp.transects[trans_id].edges.right.type = "Triangular"
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_edge_min.loc[len(self.sim_edge_min)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].left,
+                meas_temp.discharge[trans_id].right,
+            ]
 
             # Compute edge maximum
             self.d_right_error_max.append(max_right_dist)
             self.d_left_error_max.append(max_left_dist)
             meas_temp.transects[trans_id].edges.left.distance_m = max_left_dist
             meas_temp.transects[trans_id].edges.right.distance_m = max_right_dist
-            meas_temp.transects[trans_id].edges.left.type = 'Rectangular'
-            meas_temp.transects[trans_id].edges.right.type = 'Rectangular'
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_edge_max.loc[len(self.sim_edge_max)] = [meas_temp.discharge[trans_id].total,
-                                                             meas_temp.discharge[trans_id].left,
-                                                             meas_temp.discharge[trans_id].right]
+            meas_temp.transects[trans_id].edges.left.type = "Rectangular"
+            meas_temp.transects[trans_id].edges.right.type = "Rectangular"
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_edge_max.loc[len(self.sim_edge_max)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].left,
+                meas_temp.discharge[trans_id].right,
+            ]
 
     def sim_draft_max_min(self, meas):
-        """Compute the simulations for the max and min draft errror.
+        """Compute the simulations for the max and min draft error.
 
         Parameters
         ----------
@@ -1521,30 +2203,40 @@ class Oursin(object):
 
         for trans_id in self.checked_idx:
             # Compute max and min draft
-            draft_max, draft_min, draft_error = \
-                self.compute_draft_max_min(transect=meas.transects[trans_id],
-                                           draft_error_m_user=self.user_advanced_settings['draft_error_m_user'])
+            draft_max, draft_min, draft_error = self.compute_draft_max_min(
+                transect=meas.transects[trans_id],
+                draft_error_m_user=self.user_advanced_settings["draft_error_m_user"],
+            )
             self.draft_error_list.append(draft_error)
 
             # Compute discharge for draft min
             meas_temp.transects[trans_id].change_draft(draft_min)
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_draft_min.loc[len(self.sim_draft_min)] = [meas_temp.discharge[trans_id].total,
-                                                               meas_temp.discharge[trans_id].top,
-                                                               meas_temp.discharge[trans_id].left,
-                                                               meas_temp.discharge[trans_id].right]
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_draft_min.loc[len(self.sim_draft_min)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].top,
+                meas_temp.discharge[trans_id].left,
+                meas_temp.discharge[trans_id].right,
+            ]
             # Compute discharge for draft max
             meas_temp.transects[trans_id].change_draft(draft_max)
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_draft_max.loc[len(self.sim_draft_max)] = [meas_temp.discharge[trans_id].total,
-                                                               meas_temp.discharge[trans_id].top,
-                                                               meas_temp.discharge[trans_id].left,
-                                                               meas_temp.discharge[trans_id].right]
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_draft_max.loc[len(self.sim_draft_max)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].top,
+                meas_temp.discharge[trans_id].left,
+                meas_temp.discharge[trans_id].right,
+            ]
 
     def sim_invalid_cells(self, meas):
-        """Computes simulations using different methods to interpolate for invalid cells and ensembles.
+        """Computes simulations using different methods to interpolate for
+        invalid cells and ensembles.
 
         Parameters
         ----------
@@ -1563,40 +2255,70 @@ class Oursin(object):
         meas_temp = copy.deepcopy(meas)
         for trans_id in self.checked_idx:
             # TRDI method
-            meas_temp.transects[trans_id].w_vel.interpolate_cells_trdi(meas_temp.transects[trans_id])
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_cells_trdi.loc[len(self.sim_cells_trdi)] = [meas_temp.discharge[trans_id].total,
-                                                                 meas_temp.discharge[trans_id].middle]
+            meas_temp.transects[trans_id].w_vel.interpolate_cells_trdi(
+                meas_temp.transects[trans_id]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_cells_trdi.loc[len(self.sim_cells_trdi)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
 
             # Above only
-            meas_temp.transects[trans_id].w_vel.interpolate_abba(meas_temp.transects[trans_id], search_loc=['above'])
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_cells_above.loc[len(self.sim_cells_above)] = [meas_temp.discharge[trans_id].total,
-                                                                   meas_temp.discharge[trans_id].middle]
+            meas_temp.transects[trans_id].w_vel.interpolate_abba(
+                meas_temp.transects[trans_id], search_loc=["above"]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_cells_above.loc[len(self.sim_cells_above)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
             # Below only
-            meas_temp.transects[trans_id].w_vel.interpolate_abba(meas_temp.transects[trans_id], search_loc=['below'])
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_cells_below.loc[len(self.sim_cells_below)] = [meas_temp.discharge[trans_id].total,
-                                                                   meas_temp.discharge[trans_id].middle]
+            meas_temp.transects[trans_id].w_vel.interpolate_abba(
+                meas_temp.transects[trans_id], search_loc=["below"]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_cells_below.loc[len(self.sim_cells_below)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
             # Before only
-            meas_temp.transects[trans_id].w_vel.interpolate_abba(meas_temp.transects[trans_id], search_loc=['before'])
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_cells_before.loc[len(self.sim_cells_before)] = [meas_temp.discharge[trans_id].total,
-                                                                     meas_temp.discharge[trans_id].middle]
+            meas_temp.transects[trans_id].w_vel.interpolate_abba(
+                meas_temp.transects[trans_id], search_loc=["before"]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_cells_before.loc[len(self.sim_cells_before)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
             # After only
-            meas_temp.transects[trans_id].w_vel.interpolate_abba(meas_temp.transects[trans_id], search_loc=['after'])
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_cells_after.loc[len(self.sim_cells_after)] = [meas_temp.discharge[trans_id].total,
-                                                                   meas_temp.discharge[trans_id].middle]
+            meas_temp.transects[trans_id].w_vel.interpolate_abba(
+                meas_temp.transects[trans_id], search_loc=["after"]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_cells_after.loc[len(self.sim_cells_after)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
 
     def sim_shallow_ens(self, meas):
-        """Computes simulations assuming no interpolation of discharge for ensembles where depths are too shallow
-        for any valid cells.
+        """Computes simulations assuming no interpolation of discharge for
+        ensembles where depths are too shallow for any valid cells.
 
         Parameters
         ----------
@@ -1608,17 +2330,23 @@ class Oursin(object):
         self.sim_shallow = pd.DataFrame(columns=self.sim_shallow.columns)
 
         for trans_id in self.checked_idx:
-            shallow_estimate = np.nansum(meas.discharge[trans_id].middle_ens) \
-                               - np.nansum(np.nansum(meas.discharge[trans_id].middle_cells))
+            shallow_estimate = np.nansum(
+                meas.discharge[trans_id].middle_ens
+            ) - np.nansum(np.nansum(meas.discharge[trans_id].middle_cells))
             if np.abs(shallow_estimate) > 0:
-                self.sim_shallow.loc[len(self.sim_shallow)] = [meas.discharge[trans_id].total - shallow_estimate,
-                                                               meas.discharge[trans_id].middle - shallow_estimate]
+                self.sim_shallow.loc[len(self.sim_shallow)] = [
+                    meas.discharge[trans_id].total - shallow_estimate,
+                    meas.discharge[trans_id].middle - shallow_estimate,
+                ]
             else:
-                self.sim_shallow.loc[len(self.sim_shallow)] = [meas.discharge[trans_id].total,
-                                                               meas.discharge[trans_id].middle]
+                self.sim_shallow.loc[len(self.sim_shallow)] = [
+                    meas.discharge[trans_id].total,
+                    meas.discharge[trans_id].middle,
+                ]
 
     def sim_invalid_depth(self, meas):
-        """Computes simulations using different methods to interpolate for invalid depths.
+        """Computes simulations using different methods to interpolate for
+        invalid depths.
 
         Parameters
         ----------
@@ -1633,24 +2361,40 @@ class Oursin(object):
         # Simulations for invalid depths
         meas_temp = copy.deepcopy(meas)
         for trans_id in self.checked_idx:
-            depths = getattr(meas_temp.transects[trans_id].depths, meas_temp.transects[trans_id].depths.selected)
+            depths = getattr(
+                meas_temp.transects[trans_id].depths,
+                meas_temp.transects[trans_id].depths.selected,
+            )
             # Hold last
             depths.interpolate_hold_last()
-            meas_temp.transects[trans_id].w_vel.adjust_side_lobe(meas_temp.transects[trans_id])
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_depth_hold.loc[len(self.sim_depth_hold)] = [meas_temp.discharge[trans_id].total,
-                                                                 meas_temp.discharge[trans_id].middle]
+            meas_temp.transects[trans_id].w_vel.adjust_side_lobe(
+                meas_temp.transects[trans_id]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_depth_hold.loc[len(self.sim_depth_hold)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
             # Fill with next
             depths.interpolate_next()
-            meas_temp.transects[trans_id].w_vel.adjust_side_lobe(meas_temp.transects[trans_id])
-            meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                        moving_bed_data=meas_temp.mb_tests)
-            self.sim_depth_next.loc[len(self.sim_depth_next)] = [meas_temp.discharge[trans_id].total,
-                                                                 meas_temp.discharge[trans_id].middle]
+            meas_temp.transects[trans_id].w_vel.adjust_side_lobe(
+                meas_temp.transects[trans_id]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_depth_next.loc[len(self.sim_depth_next)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
 
     def sim_invalid_boat_velocity(self, meas):
-        """Computes simulations using different methods to interpolate for invalid boat velocity.
+        """Computes simulations using different methods to interpolate for
+        invalid boat velocity.
 
         Parameters
         ----------
@@ -1666,24 +2410,39 @@ class Oursin(object):
         meas_temp = copy.deepcopy(meas)
         for trans_id in self.checked_idx:
             # Hold last
-            boat_data = getattr(meas_temp.transects[trans_id].boat_vel, meas_temp.transects[trans_id].boat_vel.selected)
+            boat_data = getattr(
+                meas_temp.transects[trans_id].boat_vel,
+                meas_temp.transects[trans_id].boat_vel.selected,
+            )
             if boat_data is not None:
                 boat_data.interpolate_hold_last()
-                meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                            moving_bed_data=meas_temp.mb_tests)
-                self.sim_boat_hold.loc[len(self.sim_boat_hold)] = [meas_temp.discharge[trans_id].total,
-                                                                   meas_temp.discharge[trans_id].middle]
+                meas_temp.discharge[trans_id].populate_data(
+                    data_in=meas_temp.transects[trans_id],
+                    moving_bed_data=meas_temp.mb_tests,
+                )
+                self.sim_boat_hold.loc[len(self.sim_boat_hold)] = [
+                    meas_temp.discharge[trans_id].total,
+                    meas_temp.discharge[trans_id].middle,
+                ]
                 # Fill with next
                 boat_data.interpolate_next()
-                meas_temp.discharge[trans_id].populate_data(data_in=meas_temp.transects[trans_id],
-                                                            moving_bed_data=meas_temp.mb_tests)
-                self.sim_boat_next.loc[len(self.sim_boat_next)] = [meas_temp.discharge[trans_id].total,
-                                                                   meas_temp.discharge[trans_id].middle]
+                meas_temp.discharge[trans_id].populate_data(
+                    data_in=meas_temp.transects[trans_id],
+                    moving_bed_data=meas_temp.mb_tests,
+                )
+                self.sim_boat_next.loc[len(self.sim_boat_next)] = [
+                    meas_temp.discharge[trans_id].total,
+                    meas_temp.discharge[trans_id].middle,
+                ]
             else:
-                self.sim_boat_next.loc[len(self.sim_boat_next)] = [meas.discharge[trans_id].total,
-                                                                   meas_temp.discharge[trans_id].middle]
-                self.sim_boat_hold.loc[len(self.sim_boat_hold)] = [meas.discharge[trans_id].total,
-                                                                   meas_temp.discharge[trans_id].middle]
+                self.sim_boat_next.loc[len(self.sim_boat_next)] = [
+                    meas.discharge[trans_id].total,
+                    meas_temp.discharge[trans_id].middle,
+                ]
+                self.sim_boat_hold.loc[len(self.sim_boat_hold)] = [
+                    meas.discharge[trans_id].total,
+                    meas_temp.discharge[trans_id].middle,
+                ]
 
     @staticmethod
     def compute_draft_max_min(transect, draft_error_m_user=np.nan):
@@ -1728,22 +2487,21 @@ class Oursin(object):
 
     @staticmethod
     def compute_edge_dist_max_min(transect, user_settings, default_settings):
-        """Compute the max and min edge distances.
-        """
+        """Compute the max and min edge distances."""
 
         init_dist_right = transect.edges.right.distance_m
         init_dist_left = transect.edges.left.distance_m
 
         # Select user percentage or default
-        if np.isnan(user_settings['right_edge_dist_prct_user']):
-            d_right_error_prct = default_settings['right_edge_dist_prct']
+        if np.isnan(user_settings["right_edge_dist_prct_user"]):
+            d_right_error_prct = default_settings["right_edge_dist_prct"]
         else:
-            d_right_error_prct = user_settings['right_edge_dist_prct_user']
+            d_right_error_prct = user_settings["right_edge_dist_prct_user"]
 
-        if np.isnan(user_settings['left_edge_dist_prct_user']):
-            d_left_error_prct = default_settings['left_edge_dist_prct']
+        if np.isnan(user_settings["left_edge_dist_prct_user"]):
+            d_left_error_prct = default_settings["left_edge_dist_prct"]
         else:
-            d_left_error_prct = user_settings['left_edge_dist_prct_user']
+            d_left_error_prct = user_settings["left_edge_dist_prct_user"]
 
         # Compute min distance for both edges
         min_left_dist = (1 - d_left_error_prct * 0.01) * init_dist_left
@@ -1761,7 +2519,9 @@ class Oursin(object):
         return max_left_dist, max_right_dist, min_left_dist, min_right_dist
 
     @staticmethod
-    def compute_pp_max_min(meas, exp_95ic_min, exp_95ic_max, pp_exp, exp_pp_min_user, exp_pp_max_user):
+    def compute_pp_max_min(
+        meas, exp_95ic_min, exp_95ic_max, pp_exp, exp_pp_min_user, exp_pp_max_user
+    ):
         """Determine the max and min exponents for power fit.
 
         Parameters
@@ -1769,9 +2529,11 @@ class Oursin(object):
         meas: MeasurementData
             Object of MeasurementData
         exp_95ic_min: list
-            Minimum power fit exponent from the 95% confidence interval for each transect
+            Minimum power fit exponent from the 95% confidence interval for
+            each transect
         exp_95ic_max: list
-            Maximum power fit exponent from the 95% confidence interval for each transect
+            Maximum power fit exponent from the 95% confidence interval for
+            each transect
         pp_exp: list
             Optimized power fit exponent for each transect
         exp_pp_min_user: float
@@ -1799,8 +2561,8 @@ class Oursin(object):
             else:
                 mean_pp = np.nanmean(pp_exp)
 
-            # If all transects have confidence intervals, use the mean of the confidence interval min/max
-            # Otherwise adjust average +/- 0.2
+            # If all transects have confidence intervals, use the mean of
+            # the confidence interval min/max. Otherwise adjust average +/- 0.2
             if np.isnan(exp_95ic_min).any():
                 min_pp = mean_pp - 0.2
             else:
@@ -1837,7 +2599,9 @@ class Oursin(object):
         return skip_pp_min_max, exp_pp_max, exp_pp_min
 
     @staticmethod
-    def compute_ns_max_min(meas, ns_exp, exp_ns_min_user=np.nan, exp_ns_max_user=np.nan):
+    def compute_ns_max_min(
+        meas, ns_exp, exp_ns_min_user=np.nan, exp_ns_max_user=np.nan
+    ):
         """Determine the max and min no slip exponents.
 
         Parameters
@@ -1868,8 +2632,8 @@ class Oursin(object):
         else:
             mean_ns = np.nanmean(ns_exp)
             if len(ns_exp) == 1:
-                min_ns = ns_exp[0]-0.05
-                max_ns = ns_exp[0]+0.05
+                min_ns = ns_exp[0] - 0.05
+                max_ns = ns_exp[0] + 0.05
             else:
                 min_ns = np.nanmin(ns_exp)
                 max_ns = np.nanmax(ns_exp)
@@ -1913,7 +2677,7 @@ class Oursin(object):
         -------
         relative_error_depth: float
             Random depth error by ensemble
-       """
+        """
 
         d_ens = transect.depths.bt_depths.depth_processed_m
         depth_vv = transect.boat_vel.bt_vel.w_mps * transect.date_time.ens_duration_sec
@@ -1923,8 +2687,9 @@ class Oursin(object):
 
     @staticmethod
     def water_std_by_error_velocity(transect):
-        """Compute the relative standard deviation of the water velocity using the fact that the error velocity is
-        scaled so that the standard deviation of the error velocity is the same as the standard deviation
+        """Compute the relative standard deviation of the water velocity
+        using the fact that the error velocity is scaled so that the
+        standard deviation of the error velocity is the same as the standard deviation
         of the horizontal water velocity.
 
         Parameters
@@ -1941,11 +2706,14 @@ class Oursin(object):
         # Computer water speed
         u_water = transect.w_vel.u_processed_mps
         v_water = transect.w_vel.v_processed_mps
-        v_wa_cell_abs = np.sqrt(u_water ** 2 + v_water ** 2)
+        v_wa_cell_abs = np.sqrt(u_water**2 + v_water**2)
+        v_wa_cell_abs[np.round(v_wa_cell_abs, 3) == 0.000] = np.nan
 
         # Use only valid error velocity data
         d_vel_filtered = np.tile([np.nan], transect.w_vel.d_mps.shape)
-        d_vel_filtered[transect.w_vel.valid_data[0]] = transect.w_vel.d_mps[transect.w_vel.valid_data[0]]
+        d_vel_filtered[transect.w_vel.valid_data[0]] = transect.w_vel.d_mps[
+            transect.w_vel.valid_data[0]
+        ]
 
         # Compute relative standard deviation of error velocity
         std_ev_wt = np.nanstd(d_vel_filtered) / np.abs(v_wa_cell_abs)
@@ -1958,9 +2726,10 @@ class Oursin(object):
 
     @staticmethod
     def boat_std_by_error_velocity(transect):
-        """Compute the relative standard deviation of the boat velocity using the fact that the error velocity is
-        scaled so that the standard deviation of the error velocity is the same as the standard deviation
-        of the horizontal boat velocity.
+        """Compute the relative standard deviation of the boat velocity
+        using the fact that the error velocity is scaled so that the
+        standard deviation of the error velocity is the same as the
+        standard deviation of the horizontal boat velocity.
 
         Parameters
         ----------
@@ -1976,12 +2745,14 @@ class Oursin(object):
         # Compute boat speed
         u_boat = transect.boat_vel.bt_vel.u_processed_mps
         v_boat = transect.boat_vel.bt_vel.v_processed_mps
-        speed = np.sqrt(u_boat ** 2 + v_boat ** 2)
+        speed = np.sqrt(u_boat**2 + v_boat**2)
+        speed[np.round(speed, 3) == 0.000] = np.nan
 
         # Use only valid error velocity data
         d_vel_filtered = np.tile([np.nan], transect.boat_vel.bt_vel.d_mps.shape)
-        d_vel_filtered[transect.boat_vel.bt_vel.valid_data[0]] = \
-            transect.boat_vel.bt_vel.d_mps[transect.boat_vel.bt_vel.valid_data[0]]
+        d_vel_filtered[
+            transect.boat_vel.bt_vel.valid_data[0]
+        ] = transect.boat_vel.bt_vel.d_mps[transect.boat_vel.bt_vel.valid_data[0]]
 
         # Compute relative standard deviation of error velocity
         all_std_ev_bt = np.nanstd(d_vel_filtered)
@@ -1994,7 +2765,8 @@ class Oursin(object):
 
     @staticmethod
     def apply_u_rect(list_sims, col_name):
-        """Compute the uncertainty using list of simulated discharges following a ranctangular law
+        """Compute the uncertainty using list of simulated discharges
+        following a ranctangular law
 
         Parameters
         ----------
@@ -2013,8 +2785,10 @@ class Oursin(object):
         vertical_stack = pd.concat(list_sims, axis=0, sort=True)
 
         # Apply rectangular law
-        u_rect = (vertical_stack.groupby(vertical_stack.index)[col_name].max()
-                  - vertical_stack.groupby(vertical_stack.index)[col_name].min()) / (2 * (3 ** 0.5))
+        u_rect = (
+            vertical_stack.groupby(vertical_stack.index)[col_name].max()
+            - vertical_stack.groupby(vertical_stack.index)[col_name].min()
+        ) / (2 * (3**0.5))
 
         return u_rect
 
@@ -2022,15 +2796,16 @@ class Oursin(object):
     # ============
     @staticmethod
     def bayes_cov(transects_total_q, cov_prior=0.03, cov_prior_u=0.2, nsim=20000):
-        """Computes the coefficient of variation using a Bayesian approach and an assumed posterior
-        log-normal distribution.
+        """Computes the coefficient of variation using a Bayesian approach
+        and an assumed posterior log-normal distribution.
 
         Parameters
         ----------
         transects_total_q: list
             List of total discharge for each transect
         cov_prior: float
-            Expected COV (68%) based on prior knowledge. Assumed to be 3% by default.
+            Expected COV (68%) based on prior knowledge. Assumed to be 3% by
+            default.
         cov_prior_u: float
             Uncertainty (68%) of cov_prior. Assumed to be 20%.
         nsim: int
@@ -2042,23 +2817,29 @@ class Oursin(object):
             Coefficient of variation
         """
 
-        sav = Oursin.metropolis(theta0=[np.mean(transects_total_q), cov_prior],
-                                obs_data=transects_total_q,
-                                cov_prior=cov_prior,
-                                cov_prior_u=cov_prior_u,
-                                nsim=nsim,
-                                theta_std=np.abs(np.array([np.mean(transects_total_q), cov_prior]))* cov_prior_u / np.sqrt(len(transects_total_q)))
-
+        sav = Oursin.metropolis(
+            theta0=[np.mean(transects_total_q), cov_prior],
+            obs_data=transects_total_q,
+            cov_prior=cov_prior,
+            cov_prior_u=cov_prior_u,
+            nsim=nsim,
+            theta_std=np.abs(np.array([np.mean(transects_total_q), cov_prior]))
+            * cov_prior_u
+            / np.sqrt(len(transects_total_q)),
+        )
 
         n_burn = int(nsim / 2)
 
-        cov = np.mean(sav['sam'][n_burn:nsim, 1])
+        cov = np.mean(sav["sam"][n_burn:nsim, 1])
 
         return cov
 
     @staticmethod
-    def metropolis(theta0, obs_data, cov_prior, cov_prior_u, nsim=1000, theta_std=np.nan):
-        """Implements the Metropolis_Hastings Markov chain Monte Carlo (MCMC) algorithm for sampling the
+    def metropolis(
+        theta0, obs_data, cov_prior, cov_prior_u, nsim=1000, theta_std=np.nan
+    ):
+        """Implements the Metropolis_Hastings Markov chain Monte Carlo (
+        MCMC) algorithm for sampling the
         posterior distribution, assuming a log-normal posterior distribution.
 
         Parameters
@@ -2074,7 +2855,8 @@ class Oursin(object):
         nsim: int
             Number of simulations.
         theta_std: float
-            Standard deviation for the gaussian Jump distribution. If blank a default value is computed.
+            Standard deviation for the gaussian Jump distribution. If blank
+            a default value is computed.
 
         Returns
         -------
@@ -2083,26 +2865,33 @@ class Oursin(object):
             sam: np.array(float)
                 Matrix containing the MCMC samples
             obj_funk: np.array(float)
-                Vector containing the corresponding values of the objective function 
+                Vector containing the corresponding values of the objective
+                function
                 (i.e. of the unnormalized log-posterior)
         """
-       
+
         # Initialize
         npar = len(theta0)
-        sam = np.zeros((nsim + 1, npar))  
-        obj_funk = np.zeros((nsim + 1, 1))  
+        sam = np.zeros((nsim + 1, npar))
+        obj_funk = np.zeros((nsim + 1, 1))
 
-        # Parameters - used for automatic computation of starting stds of the Gaussian Jump distribution
+        # Parameters - used for automatic computation of starting stds of
+        # the Gaussian Jump distribution
         if np.any(np.isnan(theta_std)):
             std_factor = 0.1
             theta_std = std_factor * np.abs(theta0)
 
         # Check if starting point is feasible - abandon otherwise
-        f_current = Oursin.log_post(param=theta0, measures=obs_data, cov_prior=cov_prior, cov_prior_u=cov_prior_u)
+        f_current = Oursin.log_post(
+            param=theta0,
+            measures=obs_data,
+            cov_prior=cov_prior,
+            cov_prior_u=cov_prior_u,
+        )
 
         if not Oursin.is_feasible(f_current):
-            print('Metropolis:FATAL:unfeasible starting point')
-            w = {'sam': sam, 'obj_funk': obj_funk}
+            print("Metropolis:FATAL:unfeasible starting point")
+            w = {"sam": sam, "obj_funk": obj_funk}
             return w
         else:
             sam[0, :] = list(theta0)
@@ -2117,13 +2906,17 @@ class Oursin(object):
                 # Propose a new candidate
                 candid = np.random.normal(loc=current, scale=theta_std)
                 # Change for use in Numba
-                # candid[0] = np.random.normal(loc=current[0], scale=theta_std[0])
-                # candid[1] = np.random.normal(loc=current[1], scale=theta_std[1])
+                # candid[0] = np.random.normal(loc=current[0],
+                # scale=theta_std[0])
+                # candid[1] = np.random.normal(loc=current[1],
+                # scale=theta_std[1])
                 # Evaluate objective function at candidate
-                f_candid = Oursin.log_post(param=candid,
-                                           measures=obs_data,
-                                           cov_prior=cov_prior,
-                                           cov_prior_u=cov_prior_u)
+                f_candid = Oursin.log_post(
+                    param=candid,
+                    measures=obs_data,
+                    cov_prior=cov_prior,
+                    cov_prior_u=cov_prior_u,
+                )
 
                 if not Oursin.is_feasible(f_candid):
                     sam[i + 1, :] = current
@@ -2135,7 +2928,8 @@ class Oursin(object):
                     # Compute Metropolis acceptance ratio
                     # Changed for use in Numba
                     ratio = math.exp(min(max(-100, f_candid - f_current), 0))
-                    # ratio = np.exp(min(((np.max(np.hstack((float(-100), f_candid - f_current))), float(0)))))
+                    # ratio = np.exp(min(((np.max(np.hstack((float(-100),
+                    # f_candid - f_current))), float(0)))))
 
                     # Apply acceptance rule
                     if u <= ratio:
@@ -2145,32 +2939,35 @@ class Oursin(object):
                         sam[i + 1, :] = current
                         obj_funk[i + 1] = f_current
 
-            w = {'sam': sam, 'obj_funk': obj_funk}
+            w = {"sam": sam, "obj_funk": obj_funk}
             return w
 
     @staticmethod
     def log_post(param, measures, cov_prior, cov_prior_u):
-        """Define function returning the posterior log-pdf using the model measures ~ N(true_value,cov*true_value),
-        with a flat prior on true_value and a log-normal prior for cov (= coefficient of variation)
-        
+        """Define function returning the posterior log-pdf using the model
+        measures ~ N(true_value,cov*true_value),
+        with a flat prior on true_value and a log-normal prior for cov (=
+        coefficient of variation)
+
         Parameters
         ----------
         param: np.array(float)
             Array containing the true value and COV
-        
+
         measures: np.array(float)
             Array of observations
         cov_prior: float
             Expected COV (68%) based on prior knowledge.
         cov_prior_u: float
             Uncertainty (68%) of cov_prior.
-            
+
         Returns
         -------
-        logp: 
+        logp:
         """
         # Check if any parameter is <=0
-        # since  both true_value and cov have to be positive - otherwise sigma = true_value*cov does not make sense
+        # since  both true_value and cov have to be positive - otherwise
+        # sigma = true_value*cov does not make sense
         if any(item <= 0 for item in param):
             return -math.inf
 
@@ -2178,22 +2975,30 @@ class Oursin(object):
         cov = param[1]
         sigma = cov * true_value  # standard deviation
 
-        # Compute log-likelihood under the model: measures ~ N(true_value,sigma)
-        # You can easily change this model (e.g. lognormal for a positive measurand?)
+        # Compute log-likelihood under the model:
+        # measures ~ N(true_value, sigma)
+        # You can easily change this model (e.g. lognormal for a positive
+        # measurand?)
         # OPTION 1 : the model follows a Normal distribution
-        log_likelihood = np.sum(scipy.stats.norm.logpdf(measures, loc=true_value, scale=sigma))
+        log_likelihood = np.sum(
+            scipy.stats.norm.logpdf(measures, loc=true_value, scale=sigma)
+        )
         # Change for Numba
-        # log_likelihood = np.sum(np.log(np.exp(-(((measures - true_value) / sigma) ** 2) / 2)
+        # log_likelihood = np.sum(np.log(np.exp(-(((measures - true_value) /
+        # sigma) ** 2) / 2)
         #                                / (np.sqrt(2 * np.pi) * sigma)))
 
-        # Prior on true_value - flat prior used here but you may change this if you have prior knowledge
+        # Prior on true_value - flat prior used here but you may change this
+        # if you have prior knowledge
         log_prior_1 = 0
 
         # Lognormal prior
         x = cov
         mu = np.log(cov_prior)
         scale = cov_prior_u
-        pdf = np.exp(-(np.log(x) - mu) ** 2 / (2 * scale ** 2)) / (x * scale * np.sqrt(2 * np.pi))
+        pdf = np.exp(-((np.log(x) - mu) ** 2) / (2 * scale**2)) / (
+            x * scale * np.sqrt(2 * np.pi)
+        )
         log_prior_2 = np.log(pdf)
 
         # Joint prior (prior independence)
@@ -2202,17 +3007,18 @@ class Oursin(object):
         # Return (unnormalized) log-posterior
         logp = log_likelihood + log_prior
         if np.isnan(logp):
-            logp = -math.inf  # returns -Inf rather than NaN's (required by the MCMC sampler used subsequently)
+            logp = -math.inf  # returns -Inf rather than NaN's (required by
+            # the MCMC sampler used subsequently)
         return logp
 
     @staticmethod
     def is_feasible(value):
         """Checks that a value is a real value (not infinity or nan)
-        
+
         Parameters
         ----------
         value: float or int
-        
+
         Returns
         -------
         bool
@@ -2226,10 +3032,11 @@ class Oursin(object):
     # ---------------------------------------------------
     @staticmethod
     def hh_random_meas(meas):
-        """Implements the semi-empirical method for computing the random uncertainty of an ADCP discharge transect,
-        as presented in Hening Huang (2018) Estimating uncertainty of streamflow measurements with
-        moving-boat acoustic Doppler current profilers, Hydrological Sciences Journal, 63:3, 353-368,
-        DOI:10.1080/02626667.2018.1433833
+        """Implements the semi-empirical method for computing the random
+        uncertainty of an ADCP discharge transect, as presented in
+        Hening Huang (2018) Estimating uncertainty of streamflow measurements with
+        moving-boat acoustic Doppler current profilers, Hydrological
+        Sciences Journal, 63:3, 353-368, DOI:10.1080/02626667.2018.1433833
 
         Parameters
         ----------
@@ -2252,26 +3059,30 @@ class Oursin(object):
             r1_numerator = []
             r1_denominator = []
             for n in range(len(q_i) - 1):
-                r1_numerator.append((q_i[n] - q_bar) * (q_i[n+1] - q_bar))
-                r1_denominator.append((q_i[n] - q_bar)**2)
-            r1_denominator.append((q_i[-1] - q_bar)**2)
+                r1_numerator.append((q_i[n] - q_bar) * (q_i[n + 1] - q_bar))
+                r1_denominator.append((q_i[n] - q_bar) ** 2)
+            r1_denominator.append((q_i[-1] - q_bar) ** 2)
             r1 = np.nansum(r1_numerator) / np.nansum(r1_denominator)
 
             # Compute g(r1)
-            g_r1 = 0.6 + (0.1 * np.exp(r1)) + (0.01 * (1 - np.exp((r1**0.6)-1)**-0.08))
+            g_r1 = (
+                0.6
+                + (0.1 * np.exp(r1))
+                + (0.01 * (1 - np.exp((r1**0.6) - 1) ** -0.08))
+            )
             if g_r1 < 1:
                 g_r1 = 1.0
 
             # Compute (delta qi)**2
-            alpha = 1. / 3.
+            alpha = 1.0 / 3.0
             c1 = 0.5 * (1 - alpha)
             delta_list = []
             for n in range(1, len(q_i) - 1):
                 q_i_hat = c1 * q_i[n - 1] + alpha * q_i[n] + c1 * q_i[n + 1]
-                delta_list.append((q_i[n] - q_i_hat)**2)
+                delta_list.append((q_i[n] - q_i_hat) ** 2)
 
             # Compute unbiased residual sum of squares
-            urss = ((2. / 3.) * (1 / (1 - alpha))**2) * np.nansum(delta_list)
+            urss = ((2.0 / 3.0) * (1 / (1 - alpha)) ** 2) * np.nansum(delta_list)
 
             # Compute random uncertainty
             random_u.append(g_r1 * np.sqrt(urss) / q_m)
diff --git a/Classes/Oursin_froude.py b/Classes/Oursin_froude.py
new file mode 100644
index 0000000000000000000000000000000000000000..fe8f66d5f24ee4fba6d1cd8f61fc8a6d45c39612
--- /dev/null
+++ b/Classes/Oursin_froude.py
@@ -0,0 +1,3117 @@
+import time
+
+import pandas as pd
+import copy
+from Classes.QComp import QComp
+from scipy.stats import t
+import numpy as np
+import math
+import scipy.stats
+
+# from profilehooks import profile
+from MiscLibs.common_functions import cosd, sind
+from MiscLibs.bayes_cov_compiled import bayes_cov
+
+
+class Oursin(object):
+    """Computes the uncertainty of a measurement using Oursin method.
+
+    Attributes
+    ----------
+    bot_meth: list
+        List that contains the method proposed by Extrap for each transect
+    exp_95ic_min: list
+        List that contains the min range of 95% interval if power-power
+        method is used for transect
+    exp_95ic_max: list
+        List that contains the max range of 95% interval if power-power
+        method is used for transect
+    pp_exp: list
+        List that contains the power-power exponent computed by Extrap for
+        Power-Power transect only
+    ns_exp: list
+        List that contains the no-slip exponent computed by Extrap for
+        No-Slip method transect only
+    exp_pp_min: list
+        Minimum power-power exponent used for simulating possible discharge
+    exp_pp_max: list
+        Maximum power-power exponent used for simulating possible discharge
+    exp_ns_min: list
+        Minimum no-slip exponent used for simulating possible discharge
+    exp_ns_max: list
+        Maximum no-slip exponent used for simulating possible discharge
+    d_right_error_min: list
+        List that contains the minimum right distance (in m) used for
+        simulating the discharge for each transect
+    d_left_error_min: list
+        List that contains the minimum left distance (in m) used for
+        simulating the discharge for each transect
+    d_right_error_max: list
+        List that contains the maximum right distance (in m) used for
+        simulating the discharge for each transect
+    d_left_error_max: list
+        List that contains the maximum left distance (in m) used for
+        simulating the discharge for each transect
+    draft_error_list: list
+        List that contains the draft (in cm) used for simulating the
+        discharge for each transect
+    u_syst_list: list
+        List that contains the computed systematic uncertainty (68%) for
+        each transect
+    u_compass_list: list
+        List that contains the computed uncertainty (68%) due to compass
+        error for each transect
+    u_meas_list: list
+        List that contains the computed measured area uncertainty (68%) for
+        each transect
+    u_ens_list: list
+       List that contains the computed uncertainty (68%) due to limited
+       number of ensemble for each transect
+    u_movbed_list: list
+       List that contains the estimated uncertainty (68%) due to moving bed
+       for each transect
+    u_invalid_water_list: list
+        List that contains the computed uncertainty (68%) due to invalid
+        water velocities for each transect
+    u_invalid_boat_list: list
+        List that contains the computed uncertainty (68%) due to invalid
+        boat velocities for each transect
+    u_invalid_depth_list: list
+       List that contains the computed uncertainty (68%) due to invalid
+       depths for each transect
+    u_top_list: list
+       List that contains the computed uncertainty (68%) due to top
+       discharge extrapolation for each transect
+    u_bot_list: list
+       List that contains the computed uncertainty (68%) due to bottom
+       discharge extrapolation for each transect
+    u_left_list: list
+       List that contains the computed uncertainty (68%) due to left
+       discharge extrapolation for each transect
+    u_right_list: list
+       List that contains the computed uncertainty (68%) due to right
+       discharge extrapolation for each transect
+    u_syst_mean_user_list: list
+        List that contains the user specified  systematic uncertainty (68%)
+        for each transect
+    u_compass_user_list: list
+        List that contains user specified uncertainty (68%) due to compass
+        error for each transect
+    u_meas_mean_user_list: list
+        List that contains the user specified measured area uncertainty (
+        68%) for each transect
+    u_ens_user_list: list
+       List that contains the user specified uncertainty (68%) due to
+       limited number of ensemble for each transect
+    u_movbed_user_list: list
+       List that contains the user specified uncertainty (68%) due to moving
+       bed for each transect
+    u_invalid_water_user_list: list
+        List that contains the user specified uncertainty (68%) due to
+        invalid water velocities for each transect
+    u_invalid_boat_user_list: list
+        List that contains the user specified uncertainty (68%) due to
+        invalid boat velocities for each transect
+    u_invalid_depth_user_list: list
+       List that contains the user specified uncertainty (68%) due to
+       invalid depths for each transect
+    u_top_mean_user_list: list
+       List that contains the user specified uncertainty (68%) due to top
+       discharge extrapolation for each transect
+    u_bot_mean_user_list: list
+       List that contains the user specified uncertainty (68%) due to bottom
+       discharge extrapolation for each transect
+    u_left_mean_user_list: list
+       List that contains the user specified uncertainty (68%) due to left
+       discharge extrapolation for each transect
+    u_right_mean_user_list: list
+       List that contains the user specified uncertainty (68%) due to right
+       discharge extrapolation for each transect
+    cov_68: float
+       Computed uncertainty (68%) due to coefficient of variation
+    sim_original: DataFrame
+        Discharges (total, and subareas) computed for the processed discharge
+    sim_extrap_pp_16: DataFrame
+        Discharges (total, and subareas) computed using power fit with 1/6th
+        exponent
+    sim_extrap_pp_min: DataFrame
+        Discharges (total, and subareas) computed using power fit with
+        minimum exponent
+    sim_extrap_pp_max: DataFrame
+        Discharges (total, and subareas) computed using power fit with
+        maximum exponent
+    sim_extrap_cns_16: DataFrame
+        Discharges (total, and subareas) computed using constant no slip
+        with 1/6th exponent
+    sim_extrap_cns_min: DataFrame
+        Discharges (total, and subareas) computed using constant no slip
+        with minimum exponent
+    sim_extrap_cns_max: DataFrame
+        Discharges (total, and subareas) computed using constant no slip
+        with maximum exponent
+    sim_extrap_3pns_16: DataFrame
+        Discharges (total, and subareas) computed using 3pt no slip with
+        1/6the exponent
+    sim_extrap_3pns_opt: DataFrame
+        Discharges (total, and subareas) computed using 3pt no slip with
+        optimized exponent
+    sim_edge_min: DataFrame
+        Discharges (total, and subareas) computed using minimum edge q
+    sim_edge_max: DataFrame
+        Discharges (total, and subareas) computed using maximum edge q
+    sim_draft_min: DataFrame
+        Discharges (total, and subareas) computed using minimum draft
+    sim_draft_max: DataFrame
+        Discharges (total, and subareas) computed using maximum draft
+    sim_cells_trdi: DataFrame
+        Discharges (total, and subareas) computed using TRDI method for
+        invalid cells
+    sim_cells_froude: DataFrame
+        Discharges (total, and subareas) computed using Froude method for
+        invalid cells
+    sim_cells_above: DataFrame
+        Discharges (total, and subareas) computed using cells above for
+        invalid cells
+    sim_cells_below: DataFrame
+        Discharges (total, and subareas) computed using cells below for
+        invalid cells
+    sim_cells_before: DataFrame
+        Discharges (total, and subareas) computed for using cells before for
+        invalid cells
+    sim_cells_after: DataFrame
+        Discharges (total, and subareas) computed for using cells before for
+        invalid cells
+    nb_transects: float
+        Number of transects used
+    checked_idx: list
+        List of indices of checked transects
+    user_advanced_settings: dict
+        Dictionary of user specified advanced settings
+        exp_pp_min_user: float
+            User specified minimum exponent for power fit
+        exp_pp_max_user: float
+            User specified maximum exponent for power fit
+        exp_ns_min_user: float
+            User specified minimum exponent for no slip fit
+        exp_ns_max_user: float
+            User specified maximum exponent for no slip fit
+        draft_error_user: float
+            User specified draft error in m
+        dzi_prct_user: float
+            User specified percent error in depth cell size
+        right_edge_dist_prct_user: float
+            User specified percent error in right edge distance
+        left_edge_dist_prct_user: float
+            User specified percent error in left edge distance
+        gga_boat_user: float
+            User specified standard deviation of boat velocities based on
+            gga in m/s
+        vtg_boat_user: float
+            User specified standard deviation of boat velocities based on
+            vtg in m/s
+        compass_error_user: float
+            User specified compass error in degrees
+    default_advanced_settings: dict
+        Dictionary of default values for advanced settings
+        exp_pp_min: float
+            Default minimum exponent for power fit
+        exp_pp_max: float
+            Default maximum exponent for power fit
+        exp_ns_min: float
+            Default minimum exponent for no slip fit
+        exp_ns_max: float
+            Default maximum exponent for no slip fit
+        draft_error: float
+            Default draft error in m
+        dzi_prct: float
+            Default percent error in depth cell size
+        right_edge_dist_prct: float
+            Default percent error in right edge distance
+        left_edge_dist_prct: float
+            Default percent error in left edge distance
+        gga_boat: float
+            Default standard deviation of boat velocities based on gga in m/s
+        vtg_boat: float
+            Default standard deviation of boat velocities based on vtg in m/s
+        compass_error: float
+            Default compass error in degrees
+    user_specified_u: dict
+        Dictionary of user specified uncertainties as standard deviation in
+        percent
+        u_syst_mean_user: float
+            User specified uncertianty (bias) due to the system, in percent
+        u_movbed_user: float
+            User specified uncertianty (bias) due to the moving-bed
+            conditions, in percent
+        u_compass_user: float
+            User specified uncertianty (bias) due to the compass error,
+            in percent
+        u_ens_user: float
+            User specified uncertianty (bias) due to the number of ensembles
+            collected, in percent
+        u_meas_mean_user: float
+            User specified uncertianty (random) of the measured portion of
+            the cross section, in percent
+        u_top_mean_user: float
+            User specified uncertianty (bias) due to the top extrapolation,
+            in percent
+        u_bot_mean_user: float
+            User specified uncertianty (bias) due to the bottom
+            extrapolation, in percent
+        u_right_mean_user: float
+            User specified uncertianty (bias) due to the right edge
+            discharge estimate, in percent
+        u_left_mean_user: float
+            User specified uncertianty (bias) due to the left edge discharge
+            estimate, in percent
+        u_invalid_boat_user: float
+            User specified uncertianty (bias) due to invalid boat
+            velocities, in percent
+        u_invalid_depth_user
+            User specified uncertianty (bias) due to invalid depths, in percent
+        u_invalid_water_user: float
+            User specified uncertianty (bias) due to invalid water
+            velocities, in percent
+    u: DataFrame
+        DataFrame containing standard deviations in percent for each
+        transect: u_syst, u_compass, u_movbed, u_ens,
+        u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water,
+        u_cov, total, and total_95
+     u_contribution_meas: DataFrame
+        DataFrame containing measured discharge uncertainty contribution
+        from: boat, water, depth, and dzi
+    u_measurement: DataFrame
+        DataFrame containing standard deviations in percent for the whole
+        measurement: u_syst, u_compass, u_movbed,
+        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+        u_water, u_cov, total, and total_95
+    u_contribution_measurement: DataFrame
+        DataFrame containing uncertainty contribution in percent from:
+        u_syst, u_compass, u_movbed,
+        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+        u_water, u_cov, and total
+    u_user: DataFrame
+        DataFrame containing standard deviations in percent for each
+        transect: u_syst, u_compass, u_movbed, u_ens,
+        u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water,
+        u_cov, total, and total_95
+    u_measurement_user: DataFrame
+        DataFrame containing standard deviations in percent for the whole
+        measurement: u_syst, u_compass, u_movbed,
+        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+        u_water, u_cov, total, and total_95
+    u_contribution_measurement_user: DataFrame
+        DataFrame containing uncertainty contribution in percent from:
+        u_syst, u_compass, u_movbed,
+        u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+        u_water, u_cov, and total
+    """
+
+    def __init__(self):
+        """Initialize class and instance variables."""
+
+        # User provided parameters
+        self.user_advanced_settings = {
+            "exp_pp_min_user": np.nan,
+            "exp_pp_max_user": np.nan,
+            "exp_ns_min_user": np.nan,
+            "exp_ns_max_user": np.nan,
+            "draft_error_m_user": np.nan,
+            "dzi_prct_user": np.nan,
+            "right_edge_dist_prct_user": np.nan,
+            "left_edge_dist_prct_user": np.nan,
+            "gga_boat_mps_user": np.nan,
+            "vtg_boat_mps_user": np.nan,
+            "compass_error_deg_user": np.nan,
+            "cov_prior_user": np.nan,
+            "cov_prior_u_user": np.nan,
+        }
+
+        self.default_advanced_settings = {
+            "exp_pp_min": "computed",
+            "exp_pp_max": "computed",
+            "exp_ns_min": "computed",
+            "exp_ns_max": "computed",
+            "draft_error_m": "computed",
+            "dzi_prct": 0.5,
+            "right_edge_dist_prct": 20,
+            "left_edge_dist_prct": 20,
+            "gga_boat_mps": "computed",
+            "vtg_boat_mps": 0.05,
+            "compass_error_deg": 1,
+            "cov_prior": 0.03,
+            "cov_prior_u": 0.20,
+        }
+
+        self.user_specified_u = {
+            "u_syst_mean_user": np.nan,
+            "u_movbed_user": np.nan,
+            "u_compass_user": np.nan,
+            "u_ens_user": np.nan,
+            "u_meas_mean_user": np.nan,
+            "u_top_mean_user": np.nan,
+            "u_bot_mean_user": np.nan,
+            "u_right_mean_user": np.nan,
+            "u_left_mean_user": np.nan,
+            "u_invalid_boat_user": np.nan,
+            "u_invalid_depth_user": np.nan,
+            "u_invalid_water_user": np.nan,
+        }
+
+        # Extrap results
+        self.bot_meth = []
+        self.exp_95ic_min = []
+        self.exp_95ic_max = []
+        self.pp_exp = []
+        self.ns_exp = []
+
+        # Parameters used for computing the uncertainty
+        self.exp_pp_min = np.nan
+        self.exp_pp_max = np.nan
+        self.exp_ns_min = np.nan
+        self.exp_ns_max = np.nan
+        self.d_right_error_min = []
+        self.d_left_error_min = []
+        self.d_right_error_max = []
+        self.d_left_error_max = []
+        self.draft_error_list = []
+
+        # Terms computed by transect (list at 68% level)
+        self.u_syst_list = []
+        self.u_compass_list = []
+        self.u_meas_list = []
+        self.u_ens_list = []
+        self.u_movbed_list = []
+        self.u_invalid_water_list = []
+        self.u_invalid_boat_list = []
+        self.u_invalid_depth_list = []
+        self.u_top_list = []
+        self.u_bot_list = []
+        self.u_left_list = []
+        self.u_right_list = []
+
+        self.u_syst_mean_user_list = []
+        self.u_compass_user_list = []
+        self.u_movbed_user_list = []
+        self.u_meas_mean_user_list = []
+        self.u_ens_user_list = []
+        self.u_top_mean_user_list = []
+        self.u_bot_mean_user_list = []
+        self.u_left_mean_user_list = []
+        self.u_right_mean_user_list = []
+        self.u_invalid_boat_user_list = []
+        self.u_invalid_depth_user_list = []
+        self.u_invalid_water_user_list = []
+
+        # Term computed for measurement
+        self.cov_68 = np.nan
+
+        self.nb_transects = np.nan
+        self.checked_idx = []
+
+        # Store results of all simulations in DataFrame
+        self.sim_original = pd.DataFrame(
+            columns=["q_total", "q_top", "q_bot", "q_left", "q_right", "q_middle"]
+        )
+        self.sim_extrap_pp_16 = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_pp_opt = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_pp_min = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_pp_max = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_cns_16 = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_cns_opt = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_cns_min = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_cns_max = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_3pns_16 = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_extrap_3pns_opt = pd.DataFrame(columns=["q_total", "q_top", "q_bot"])
+        self.sim_edge_min = pd.DataFrame(columns=["q_total", "q_left", "q_right"])
+        self.sim_edge_max = pd.DataFrame(columns=["q_total", "q_left", "q_right"])
+        self.sim_draft_min = pd.DataFrame(
+            columns=["q_total", "q_top", "q_left", "q_right"]
+        )
+        self.sim_draft_max = pd.DataFrame(
+            columns=["q_total", "q_top", "q_left", "q_right"]
+        )
+        self.sim_cells_trdi = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_cells_froude = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_cells_above = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_cells_below = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_cells_before = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_cells_after = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_shallow = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_depth_hold = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_depth_next = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_boat_hold = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.sim_boat_next = pd.DataFrame(columns=["q_total", "q_middle"])
+        self.u_contribution_meas = pd.DataFrame(
+            columns=["boat", "water", "depth", "dzi"]
+        )
+        self.u = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ]
+        )
+        self.u_measurement = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ]
+        )
+        self.u_contribution = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ]
+        )
+        self.u_contribution_measurement = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ]
+        )
+        self.u_user = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ]
+        )
+        self.u_measurement_user = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ]
+        )
+        self.u_contribution_user = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ]
+        )
+        self.u_contribution_measurement_user = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ]
+        )
+
+    def populate_from_qrev_mat(self, meas_struct):
+
+        # User provided parameters
+        self.user_advanced_settings = {
+            "exp_pp_min_user": meas_struct.oursin.user_advanced_settings.exp_pp_min_user,
+            "exp_pp_max_user": meas_struct.oursin.user_advanced_settings.exp_pp_max_user,
+            "exp_ns_min_user": meas_struct.oursin.user_advanced_settings.exp_ns_min_user,
+            "exp_ns_max_user": meas_struct.oursin.user_advanced_settings.exp_ns_max_user,
+            "draft_error_m_user": meas_struct.oursin.user_advanced_settings.draft_error_m_user,
+            "dzi_prct_user": meas_struct.oursin.user_advanced_settings.dzi_prct_user,
+            "right_edge_dist_prct_user": meas_struct.oursin.user_advanced_settings.right_edge_dist_prct_user,
+            "left_edge_dist_prct_user": meas_struct.oursin.user_advanced_settings.left_edge_dist_prct_user,
+            "gga_boat_mps_user": meas_struct.oursin.user_advanced_settings.gga_boat_mps_user,
+            "vtg_boat_mps_user": meas_struct.oursin.user_advanced_settings.vtg_boat_mps_user,
+            "compass_error_deg_user": meas_struct.oursin.user_advanced_settings.compass_error_deg_user,
+            "cov_prior_user": meas_struct.oursin.user_advanced_settings.cov_prior_user,
+            "cov_prior_u_user": meas_struct.oursin.user_advanced_settings.cov_prior_u_user,
+        }
+
+        self.user_specified_u = {
+            "u_syst_mean_user": meas_struct.oursin.user_specified_u.u_syst_mean_user,
+            "u_movbed_user": meas_struct.oursin.user_specified_u.u_movbed_user,
+            "u_compass_user": meas_struct.oursin.user_specified_u.u_compass_user,
+            "u_ens_user": meas_struct.oursin.user_specified_u.u_ens_user,
+            "u_meas_mean_user": meas_struct.oursin.user_specified_u.u_meas_mean_user,
+            "u_top_mean_user": meas_struct.oursin.user_specified_u.u_top_mean_user,
+            "u_bot_mean_user": meas_struct.oursin.user_specified_u.u_bot_mean_user,
+            "u_right_mean_user": meas_struct.oursin.user_specified_u.u_right_mean_user,
+            "u_left_mean_user": meas_struct.oursin.user_specified_u.u_left_mean_user,
+            "u_invalid_boat_user": meas_struct.oursin.user_specified_u.u_invalid_boat_user,
+            "u_invalid_depth_user": meas_struct.oursin.user_specified_u.u_invalid_depth_user,
+            "u_invalid_water_user": meas_struct.oursin.user_specified_u.u_invalid_water_user,
+        }
+
+        # Extrap results
+        if type(meas_struct.oursin.bot_meth) is str:
+            self.bot_meth = [meas_struct.oursin.bot_meth]
+        else:
+            self.bot_meth = meas_struct.oursin.bot_meth.tolist()
+
+        if type(meas_struct.oursin.exp_95ic_min) is float:
+            self.exp_95ic_min = meas_struct.oursin.exp_95ic_min
+        else:
+            self.exp_95ic_min = meas_struct.oursin.exp_95ic_min.tolist()
+
+        if type(meas_struct.oursin.exp_95ic_max) is float:
+            self.exp_95ic_max = meas_struct.oursin.exp_95ic_max
+        else:
+            self.exp_95ic_max = meas_struct.oursin.exp_95ic_max.tolist()
+
+        if type(meas_struct.oursin.ppExponent) is float:
+            self.pp_exp = meas_struct.oursin.ppExponent
+        else:
+            self.pp_exp = meas_struct.oursin.ppExponent.tolist()
+
+        if type(meas_struct.oursin.nsExponent) is float:
+            self.ns_exp = meas_struct.oursin.nsExponent
+        else:
+            self.ns_exp = meas_struct.oursin.nsExponent.tolist()
+
+        # Parameters used for computing the uncertainty
+        self.exp_pp_min = meas_struct.oursin.exp_pp_min
+        self.exp_pp_max = meas_struct.oursin.exp_pp_max
+        self.exp_ns_min = meas_struct.oursin.exp_ns_min
+        self.exp_ns_max = meas_struct.oursin.exp_ns_max
+
+        if type(meas_struct.oursin.d_right_error_min) is float:
+            self.d_right_error_min = meas_struct.oursin.d_right_error_min
+            self.d_left_error_min = meas_struct.oursin.d_left_error_min
+            self.d_right_error_max = meas_struct.oursin.d_right_error_max
+            self.d_left_error_max = meas_struct.oursin.d_left_error_max
+            self.draft_error_list = meas_struct.oursin.draft_error_list
+        else:
+            self.d_right_error_min = meas_struct.oursin.d_right_error_min.tolist()
+            self.d_left_error_min = meas_struct.oursin.d_left_error_min.tolist()
+            self.d_right_error_max = meas_struct.oursin.d_right_error_max.tolist()
+            self.d_left_error_max = meas_struct.oursin.d_left_error_max.tolist()
+            self.draft_error_list = meas_struct.oursin.draft_error_list.tolist()
+
+        # Terms computed by transect (list at 68% level)
+        if type(meas_struct.oursin.u_syst_mean_user_list) is float:
+            self.u_syst_list = [meas_struct.oursin.u_syst_list]
+            self.u_compass_list = [meas_struct.oursin.u_compass_list]
+            self.u_meas_list = [meas_struct.oursin.u_meas_list]
+            self.u_ens_list = [meas_struct.oursin.u_ens_list]
+            self.u_movbed_list = [meas_struct.oursin.u_movbed_list]
+            self.u_invalid_water_list = [meas_struct.oursin.u_invalid_water_list]
+            self.u_invalid_boat_list = [meas_struct.oursin.u_invalid_boat_list]
+            self.u_invalid_depth_list = [meas_struct.oursin.u_invalid_depth_list]
+            self.u_top_list = [meas_struct.oursin.u_top_list]
+            self.u_bot_list = [meas_struct.oursin.u_bot_list]
+            self.u_left_list = [meas_struct.oursin.u_left_list]
+            self.u_right_list = [meas_struct.oursin.u_right_list]
+
+            self.u_syst_mean_user_list = [meas_struct.oursin.u_syst_mean_user_list]
+            self.u_compass_user_list = [meas_struct.oursin.u_compass_user_list]
+            self.u_movbed_user_list = [meas_struct.oursin.u_movbed_user_list]
+            self.u_meas_mean_user_list = [meas_struct.oursin.u_meas_mean_user_list]
+            self.u_ens_user_list = [meas_struct.oursin.u_ens_user_list]
+            self.u_top_mean_user_list = [meas_struct.oursin.u_top_mean_user_list]
+            self.u_bot_mean_user_list = [meas_struct.oursin.u_bot_mean_user_list]
+            self.u_left_mean_user_list = [meas_struct.oursin.u_left_mean_user_list]
+            self.u_invalid_boat_user_list = [
+                meas_struct.oursin.u_invalid_boat_user_list
+            ]
+            self.u_invalid_depth_user_list = [
+                meas_struct.oursin.u_invalid_depth_user_list
+            ]
+            self.u_invalid_water_user_list = [
+                meas_struct.oursin.u_invalid_water_user_list
+            ]
+        else:
+            self.u_syst_list = meas_struct.oursin.u_syst_list.tolist()
+            self.u_compass_list = meas_struct.oursin.u_compass_list.tolist()
+            self.u_meas_list = meas_struct.oursin.u_meas_list.tolist()
+            self.u_ens_list = meas_struct.oursin.u_ens_list.tolist()
+            self.u_movbed_list = meas_struct.oursin.u_movbed_list.tolist()
+            self.u_invalid_water_list = meas_struct.oursin.u_invalid_water_list.tolist()
+            self.u_invalid_boat_list = meas_struct.oursin.u_invalid_boat_list.tolist()
+            self.u_invalid_depth_list = meas_struct.oursin.u_invalid_depth_list.tolist()
+            self.u_top_list = meas_struct.oursin.u_top_list.tolist()
+            self.u_bot_list = meas_struct.oursin.u_bot_list.tolist()
+            self.u_left_list = meas_struct.oursin.u_left_list.tolist()
+            self.u_right_list = meas_struct.oursin.u_right_list.tolist()
+
+            self.u_syst_mean_user_list = (
+                meas_struct.oursin.u_syst_mean_user_list.tolist()
+            )
+            self.u_compass_user_list = meas_struct.oursin.u_compass_user_list.tolist()
+            self.u_movbed_user_list = meas_struct.oursin.u_movbed_user_list.tolist()
+            self.u_meas_mean_user_list = (
+                meas_struct.oursin.u_meas_mean_user_list.tolist()
+            )
+            self.u_ens_user_list = meas_struct.oursin.u_ens_user_list.tolist()
+            self.u_top_mean_user_list = meas_struct.oursin.u_top_mean_user_list.tolist()
+            self.u_bot_mean_user_list = meas_struct.oursin.u_bot_mean_user_list.tolist()
+            self.u_left_mean_user_list = (
+                meas_struct.oursin.u_left_mean_user_list.tolist()
+            )
+            self.u_right_mean_user_list = (
+                meas_struct.oursin.u_right_mean_user_list.tolist()
+            )
+            self.u_invalid_boat_user_list = (
+                meas_struct.oursin.u_invalid_boat_user_list.tolist()
+            )
+            self.u_invalid_depth_user_list = (
+                meas_struct.oursin.u_invalid_depth_user_list.tolist()
+            )
+            self.u_invalid_water_user_list = (
+                meas_struct.oursin.u_invalid_water_user_list.tolist()
+            )
+
+        # COV
+        self.cov_68 = meas_struct.oursin.cov_68
+
+        self.nb_transects = meas_struct.oursin.nb_transects
+        self.checked_idx = meas_struct.oursin.checked_idx
+
+        # Reconstruct data frames from Matlab arrays
+        self.sim_original = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_original),
+            columns=["q_total", "q_top", "q_bot", "q_left", "q_right", "q_middle"],
+        )
+        self.sim_extrap_pp_16 = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_pp_16),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_pp_opt = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_pp_opt),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_pp_min = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_pp_min),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_pp_max = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_pp_max),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_cns_16 = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_cns_16),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_cns_opt = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_cns_opt),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_cns_min = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_cns_min),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_cns_max = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_cns_max),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_3pns_16 = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_3pns_16),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_extrap_3pns_opt = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_extrap_3pns_opt),
+            columns=["q_total", "q_top", "q_bot"],
+        )
+        self.sim_edge_min = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_edge_min),
+            columns=["q_total", "q_left", "q_right"],
+        )
+        self.sim_edge_max = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_edge_max),
+            columns=["q_total", "q_left", "q_right"],
+        )
+        self.sim_draft_min = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_draft_min),
+            columns=["q_total", "q_top", "q_left", "q_right"],
+        )
+        self.sim_draft_max = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_draft_max),
+            columns=["q_total", "q_top", "q_left", "q_right"],
+        )
+        self.sim_cells_trdi = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_trdi),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_cells_froude = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_froude),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_cells_above = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_above),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_cells_below = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_below),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_cells_before = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_before),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_cells_after = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_cells_after),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_shallow = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_shallow),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_depth_hold = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_depth_hold),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_depth_next = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_depth_next),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_boat_hold = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_boat_hold),
+            columns=["q_total", "q_middle"],
+        )
+        self.sim_boat_next = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.sim_boat_next),
+            columns=["q_total", "q_middle"],
+        )
+        self.u_contribution_meas = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_contribution_meas),
+            columns=["boat", "water", "dzi"],
+        )
+        self.u = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ],
+        )
+        self.u_measurement = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_measurement),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ],
+        )
+        self.u_contribution = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_contribution),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ],
+        )
+        self.u_contribution_measurement = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_contribution_measurement),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ],
+        )
+        self.u_user = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_user),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ],
+        )
+        self.u_measurement_user = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_measurement_user),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+                "total_95",
+            ],
+        )
+        self.u_contribution_user = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_contribution_user),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ],
+        )
+        self.u_contribution_measurement_user = pd.DataFrame(
+            self.checkshape(meas_struct.oursin.u_contribution_measurement_user),
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+                "total",
+            ],
+        )
+
+    @staticmethod
+    def checkshape(a):
+        if len(a.shape) < 2:
+            a = a.reshape(1, -1)
+        return a
+
+    # @profile
+    def compute_oursin(
+        self, meas, user_advanced_settings=None, u_measurement_user=None
+    ):
+        """Computes the uncertainty for the components of the discharge
+        measurement using measurement data or user provided values.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        user_advanced_settings: dict
+            Dictionary of user input on advanced settings
+        u_measurement_user: dict
+            Dictionary of user estimates of uncertainty, standard deviation
+            in percent, for each component
+        """
+
+        if user_advanced_settings is not None:
+            self.user_advanced_settings = user_advanced_settings
+
+        if u_measurement_user is not None:
+            self.u_measurement_user = u_measurement_user
+
+        # Initialize lists
+        self.checked_idx = []
+        self.u_syst_list = []
+        self.u_meas_list = []
+        self.u_ens_list = []
+        self.u_movbed_list = []
+        self.u_invalid_water_list = []
+        self.u_invalid_boat_list = []
+        self.u_invalid_depth_list = []
+        self.u_top_list = []
+        self.u_bot_list = []
+        self.u_left_list = []
+        self.u_right_list = []
+
+        # Prep data for computations
+        self.data_prep(meas)
+        self.compute_measurement_cov(meas=meas, method="Bayes")
+
+        # 1. Systematic terms + correction terms (moving bed)
+        self.uncertainty_system()
+        self.uncertainty_moving_bed(meas=meas)
+        self.uncertainty_compass(meas=meas)
+
+        # 2. Measured uncertainty
+        self.uncertainty_measured_discharge(meas=meas)
+        self.uncertainty_number_ensembles(meas)
+
+        # 3. Run all the simulations to compute possible discharges
+        self.run_simulations(meas)
+
+        # 4. Compute uncertainty terms based on simulations and assuming a
+        # rectangular law
+        self.uncertainty_top_discharge()
+        self.uncertainty_bottom_discharge()
+        self.uncertainty_left_discharge()
+        self.uncertainty_right_discharge()
+        self.uncertainty_invalid_depth_data()
+        self.uncertainty_invalid_boat_data()
+        self.uncertainty_invalid_water_data()
+
+        # 6. Compute combined uncertainty
+        (
+            self.u,
+            self.u_measurement,
+            self.u_contribution,
+            self.u_contribution_measurement,
+        ) = self.compute_combined_uncertainty(
+            u_syst=self.u_syst_list,
+            u_compass=self.u_compass_list,
+            u_movbed=self.u_movbed_list,
+            u_meas=self.u_meas_list,
+            u_ens=self.u_ens_list,
+            u_top=self.u_top_list,
+            u_bot=self.u_bot_list,
+            u_left=self.u_left_list,
+            u_right=self.u_right_list,
+            u_boat=self.u_invalid_boat_list,
+            u_depth=self.u_invalid_depth_list,
+            u_water=self.u_invalid_water_list,
+            cov_68=self.cov_68,
+        )
+
+        (
+            self.u_user,
+            self.u_measurement_user,
+            self.u_contribution_user,
+            self.u_contribution_measurement_user,
+        ) = self.compute_combined_uncertainty(
+            u_syst=self.u_syst_mean_user_list,
+            u_compass=self.u_compass_user_list,
+            u_movbed=self.u_movbed_user_list,
+            u_meas=self.u_meas_mean_user_list,
+            u_ens=self.u_ens_user_list,
+            u_top=self.u_top_mean_user_list,
+            u_bot=self.u_bot_mean_user_list,
+            u_left=self.u_left_mean_user_list,
+            u_right=self.u_right_mean_user_list,
+            u_boat=self.u_invalid_boat_user_list,
+            u_depth=self.u_invalid_depth_user_list,
+            u_water=self.u_invalid_water_user_list,
+            cov_68=self.cov_68,
+        )
+
+    @staticmethod
+    def compute_combined_uncertainty(
+        u_syst,
+        u_compass,
+        u_movbed,
+        u_meas,
+        u_ens,
+        u_top,
+        u_bot,
+        u_left,
+        u_right,
+        u_boat,
+        u_depth,
+        u_water,
+        cov_68,
+    ):
+        """Combined the uncertainty for each transect and for the measurement
+
+        Parameters
+        ----------
+        u_syst: list
+            List of system uncertainties for each transect
+        u_compass: list
+            List of uncertainties due to heading error
+        u_movbed: list
+            List of moving-bed uncertainties for each transect
+        u_meas: list
+            List of uncertainties for the measured portion for each transect
+        u_ens: list
+            List of uncertainties due to number of ensembles in each transect
+        u_top: list
+            List of uncertainties due to top extrapolation in each transect
+        u_bot: list
+            List of uncertainties due to the bottom extrapolation in each
+            transect
+        u_left: list
+            List of uncertainties due to the left edge discharge in each
+            transect
+        u_right: list
+            List of uncertainties due to the right edge discharge in each
+            transect
+        u_boat: list
+            List of uncertainties due to invalid boat velocities
+        u_depth: list
+            List of uncertainties due to invalid depth velocities
+        u_water: list
+            List of uncertainties due to invalid water data in each transect
+        cov_68: float
+            Coefficient of variation for all transects
+
+        Returns
+        -------
+        u_contribution_meas: DataFrame
+            DataFrame containing measured discharge uncertainty contribution
+            from: boat, water, depth, and dzi
+        u: DataFrame
+            DataFrame containing standard deviations in percent for each
+            transect: u_syst, u_compass, u_movbed, u_ens,
+            u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth, u_water,
+            u_cov, total, and total_95
+        u_measurement: DataFrame
+            DataFrame containing standard deviations in percent for the
+            whole measurement: u_syst, u_compass, u_movbed,
+            u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+            u_water, u_cov, total, and total_95
+        u_contribution_measurement: DataFrame
+            DataFrame containing uncertainty contribution in percent from:
+            u_syst, u_compass, u_movbed,
+            u_ens, u_meas, u_top, u_bot, u_left, u_right, u_boat, u_depth,
+            u_water, u_cov, and total
+        """
+
+        # Create a Dataframe with all computed uncertainty for each checked
+        # transect
+        u = pd.DataFrame(
+            columns=[
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+                "u_cov",
+            ]
+        )
+        u["u_syst"] = u_syst
+        u["u_compass"] = u_compass
+        u["u_movbed"] = u_movbed
+        u["u_meas"] = u_meas
+        u["u_ens"] = u_ens
+        u["u_water"] = u_water
+        u["u_top"] = u_top
+        u["u_bot"] = u_bot
+        u["u_left"] = u_left
+        u["u_right"] = u_right
+        u["u_cov"] = cov_68
+        u["u_boat"] = u_boat
+        u["u_depth"] = u_depth
+
+        n_transects = len(u_ens)
+
+        # Convert uncertainty (68% level of confidence) into variance
+        # Note that only variance is additive
+        u2 = u.pow(2)
+        u2_measurement = u2.mean(axis=0, skipna=False).to_frame().T
+
+        # Combined uncertainty by transect
+        # Sum of variance of each component, then sqrt, then multiply by 100
+        # for percentage
+        # u['total'] = u2.drop(['u_cov'], axis=1).sum(axis=1, skipna=False)
+        # ** 0.5
+        u["total"] = u2.sum(axis=1, skipna=False) ** 0.5
+        u["total_95"] = u["total"] * 2
+        u = u.mul(100)
+
+        # Uncertainty for the measurement
+        # The random error is computed as a mean of the random error from
+        # the measured portion and the overall
+        # random error from the COV.
+        u2_random = u2["u_meas"].mean(skipna=False) + u2["u_cov"].mean(skipna=False)
+
+        # All other sources are systematic (mostly due to computation method
+        # and values from user)
+        u2_bias = u2_measurement.drop(["u_meas", "u_cov"], axis=1).sum(
+            axis=1, skipna=False
+        )
+
+        # Combined all uncertainty sources
+        u2_measurement["total"] = (1 / n_transects) * u2_random + u2_bias[0]
+        u_measurement = u2_measurement**0.5
+        u_measurement["total_95"] = u_measurement["total"] * 2
+        u_measurement = u_measurement * 100
+
+        # Compute relative contributions from each source
+        u_contribution_measurement = u2_measurement.copy()
+
+        # Adjust contribution of u_meas and u_cov to account for number of
+        # transects
+        u_contribution_measurement["u_meas"] = u2_measurement["u_meas"] / n_transects
+        u_contribution_measurement["u_cov"] = u2_measurement["u_cov"] / n_transects
+        u_contribution_measurement = u_contribution_measurement.div(
+            u_contribution_measurement["total"], axis=0
+        )
+
+        # Adjust contribution of u_meas and u_cov to account for number of
+        # transects
+        u_contribution = u2.copy()
+        u_contribution["u_meas"] = u2["u_meas"].div(n_transects, axis=0)
+        u_contribution["u_cov"] = u2["u_cov"].div(n_transects, axis=0)
+        u_contribution["total"] = u_contribution.sum(axis=1)
+        u_contribution = u_contribution.div(u_contribution["total"], axis=0)
+
+        return u, u_measurement, u_contribution, u_contribution_measurement
+
+    def data_prep(self, meas):
+        """Determine checked transects and max and min exponents for power
+        and no slip extrapolation.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        """
+
+        # Use only checked transects
+        # Extract data that are used later on (PP and NS exponents)
+        self.checked_idx = []
+        self.bot_meth = []
+        self.exp_95ic_min = []
+        self.exp_95ic_max = []
+        self.pp_exp = []
+        self.ns_exp = []
+
+        for n in range(len(meas.transects)):
+            if meas.transects[n].checked:
+                self.checked_idx.append(n)
+
+                # Bottom method selected using data from each transect only
+                self.bot_meth.append(meas.extrap_fit.sel_fit[n].bot_method_auto)
+
+                # Store 95 percent bounds on power fit exponent for each
+                # transect if power selected
+                if meas.extrap_fit.sel_fit[n].bot_method_auto == "Power":
+                    try:
+                        self.exp_95ic_min.append(
+                            meas.extrap_fit.sel_fit[n].exponent_95_ci[0]
+                        )
+                    except TypeError:
+                        self.exp_95ic_min.append(np.nan)
+                    try:
+                        self.exp_95ic_max.append(
+                            meas.extrap_fit.sel_fit[n].exponent_95_ci[1]
+                        )
+                    except TypeError:
+                        self.exp_95ic_max.append(np.nan)
+
+                    self.pp_exp.append(meas.extrap_fit.sel_fit[n].pp_exponent)
+
+                # Store no slip exponent if no slip selected
+                elif meas.extrap_fit.sel_fit[n].bot_method_auto == "No Slip":
+                    self.ns_exp.append(meas.extrap_fit.sel_fit[n].ns_exponent)
+
+        self.nb_transects = len(self.checked_idx)
+
+    def run_simulations(self, meas):
+        """Compute discharges (top, bot, right, left, total, middle)  based
+        on possible scenarios
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # If list have not be saved recompute q_sensitivity
+        if not hasattr(meas.extrap_fit.q_sensitivity, "q_pp_list"):
+            meas.extrap_fit.q_sensitivity.populate_data(
+                meas.transects, meas.extrap_fit.sel_fit
+            )
+
+        # Simulation original
+        self.sim_orig(meas)
+
+        # Simulation power / power default 1/6
+        self.sim_extrap_pp_16["q_total"] = meas.extrap_fit.q_sensitivity.q_pp_list
+        self.sim_extrap_pp_16["q_top"] = meas.extrap_fit.q_sensitivity.q_top_pp_list
+        self.sim_extrap_pp_16["q_bot"] = meas.extrap_fit.q_sensitivity.q_bot_pp_list
+
+        # Simulations power / power optimized
+        self.sim_pp_min_max_opt(meas=meas)
+
+        # Simulation cns default 1/6
+        self.sim_extrap_cns_16["q_total"] = meas.extrap_fit.q_sensitivity.q_cns_list
+        self.sim_extrap_cns_16["q_top"] = meas.extrap_fit.q_sensitivity.q_top_cns_list
+        self.sim_extrap_cns_16["q_bot"] = meas.extrap_fit.q_sensitivity.q_bot_cns_list
+
+        # Simulation cns optimized
+        self.sim_cns_min_max_opt(meas=meas)
+
+        # Simulation 3pt no slip default 1/6
+        self.sim_extrap_3pns_16["q_total"] = meas.extrap_fit.q_sensitivity.q_3p_ns_list
+        self.sim_extrap_3pns_16[
+            "q_top"
+        ] = meas.extrap_fit.q_sensitivity.q_top_3p_ns_list
+        self.sim_extrap_3pns_16[
+            "q_bot"
+        ] = meas.extrap_fit.q_sensitivity.q_bot_3p_ns_list
+
+        # Simulation 3pt no slip optimized
+        self.sim_extrap_3pns_opt[
+            "q_total"
+        ] = meas.extrap_fit.q_sensitivity.q_3p_ns_opt_list
+        self.sim_extrap_3pns_opt[
+            "q_top"
+        ] = meas.extrap_fit.q_sensitivity.q_top_3p_ns_opt_list
+        self.sim_extrap_3pns_opt[
+            "q_bot"
+        ] = meas.extrap_fit.q_sensitivity.q_bot_3p_ns_opt_list
+
+        # Simulations edge min and max
+        self.sim_edge_min_max(meas=meas)
+
+        # Simulation draft min and max
+        self.sim_draft_max_min(meas=meas)
+
+        # Simulation of invalid cells and ensembles
+        self.sim_invalid_cells(meas=meas)
+
+        # Simulation of shallow no cells
+        self.sim_shallow_ens(meas=meas)
+
+        # Simulation of invalid boat velocity
+        self.sim_invalid_boat_velocity(meas=meas)
+
+        # Simulation of invalid depths
+        self.sim_invalid_depth(meas=meas)
+
+    def uncertainty_measured_discharge(self, meas):
+        """Compute the uncertainty related to the measured area.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.u_contribution_meas = pd.DataFrame(columns=["boat", "water", "dzi"])
+
+        # Set uncertainty of cell size
+        if np.isnan(self.user_advanced_settings["dzi_prct_user"]):
+            u_dzi = self.default_advanced_settings["dzi_prct"] * 0.01
+        else:
+            u_dzi = self.user_advanced_settings["dzi_prct_user"] * 0.01
+
+        # Compute the uncertainty due to the measured area
+        for transect_id in self.checked_idx:
+
+            # Relative standard deviation of error velocity (Water Track)
+            std_ev_wt_ens = self.water_std_by_error_velocity(
+                meas.transects[transect_id]
+            )
+
+            u_boat = np.nan
+            if meas.transects[transect_id].boat_vel.selected == "bt_vel":
+                # Relative standard deviation of error velocity (Bottom Track)
+                u_boat = self.boat_std_by_error_velocity(meas.transects[transect_id])
+
+            elif meas.transects[transect_id].boat_vel.selected == "gga_vel":
+                boat_std = np.nan
+                if np.isnan(self.user_advanced_settings["gga_boat_mps_user"]):
+                    if meas.transects[transect_id].gps.altitude_ens_m is not None:
+                        # Estimate the uncertainty in gga boat velocity as
+                        # 1/3 of the standard deviation of
+                        # the elevation (estimate of horizontal position
+                        # uncertainty) divided by time
+                        boat_std = (
+                            np.nanstd(
+                                meas.transects[transect_id].gps.altitude_ens_m, ddof=1
+                            )
+                            / 3
+                        ) / np.nanmean(
+                            np.diff(meas.transects[transect_id].gps.gga_serial_time_ens)
+                        )
+                else:
+                    boat_std = self.user_advanced_settings["gga_boat_mps"]
+                if meas.transects[transect_id].boat_vel.gga_vel is not None:
+                    u = meas.transects[transect_id].boat_vel.gga_vel.u_processed_mps
+                    v = meas.transects[transect_id].boat_vel.gga_vel.v_processed_mps
+                    speed = np.sqrt(u**2 + v**2)
+                    u_boat = boat_std / speed
+
+            elif meas.transects[transect_id].boat_vel.selected == "vtg_vel":
+                if np.isnan(self.user_advanced_settings["vtg_boat_mps_user"]):
+                    boat_std = np.nan
+                    if meas.transects[transect_id].gps is not None:
+                        boat_std = self.default_advanced_settings["vtg_boat_mps"]
+                else:
+                    boat_std = self.user_advanced_settings["vtg_boat_mps_user"]
+                if meas.transects[transect_id].boat_vel.vtg_vel is not None:
+                    u = meas.transects[transect_id].boat_vel.vtg_vel.u_processed_mps
+                    v = meas.transects[transect_id].boat_vel.vtg_vel.v_processed_mps
+                    speed = np.sqrt(u**2 + v**2)
+                    u_boat = boat_std / speed
+
+            # Computation of u_meas
+            q_2_tran = meas.discharge[transect_id].total ** 2
+            q_2_ens = meas.discharge[transect_id].middle_ens ** 2
+            n_cell_ens = meas.transects[transect_id].w_vel.cells_above_sl.sum(
+                axis=0
+            )  # number of cells by ens
+            n_cell_ens = np.where(n_cell_ens == 0, np.nan, n_cell_ens)
+
+            # Variance for each ensembles
+            u_2_meas = q_2_ens * (
+                u_boat**2 + (1 / n_cell_ens) * (std_ev_wt_ens**2 + u_dzi**2)
+            )
+
+            u_2_prct_meas = np.nansum(u_2_meas) / q_2_tran
+
+            # Standard deviation
+            u_prct_meas = u_2_prct_meas**0.5
+            self.u_meas_list.append(u_prct_meas)
+
+            # Compute the contribution of all terms to u_meas (sum of a0 to
+            # g0 =1)
+            u_contrib_boat = (
+                np.nan_to_num(q_2_ens * (u_boat**2)).sum() / q_2_tran
+            ) / u_2_prct_meas
+            u_contrib_water = (
+                np.nan_to_num(q_2_ens * ((1 / n_cell_ens) * (std_ev_wt_ens**2))).sum()
+                / q_2_tran
+            ) / u_2_prct_meas
+            u_contrib_dzi = (
+                np.nan_to_num(q_2_ens * ((1 / n_cell_ens) * (u_dzi**2))).sum()
+                / q_2_tran
+            ) / u_2_prct_meas
+
+            self.u_contribution_meas.loc[len(self.u_contribution_meas)] = [
+                u_contrib_boat,
+                u_contrib_water,
+                u_contrib_dzi,
+            ]
+
+        # Apply user specified uncertainty
+        if np.isnan(self.user_specified_u["u_meas_mean_user"]):
+            self.u_meas_mean_user_list = self.u_meas_list
+        else:
+            self.u_meas_mean_user_list = [
+                0.01 * self.user_specified_u["u_meas_mean_user"]
+            ] * self.nb_transects
+
+    def uncertainty_moving_bed(self, meas):
+        """Computes the moving-bed uncertainty
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        """
+
+        # Compute moving-bed uncertainty
+        if (
+            len(self.checked_idx)
+            and meas.transects[self.checked_idx[0]].boat_vel.selected == "bt_vel"
+        ):
+            # Boat velocity based on bottom track, moving-bed possible
+            if len(meas.mb_tests) > 0:
+                # Moving_bed tests recorded
+                user_valid = []
+                quality = []
+                moving_bed = []
+                used = []
+                for test in meas.mb_tests:
+                    user_valid.append(test.user_valid)
+                    if test.test_quality == "Errors":
+                        quality.append(False)
+                    else:
+                        quality.append(True)
+                    moving_bed.append(test.moving_bed)
+                    used.append(test.use_2_correct)
+
+                # Check to see if there are any valid tests
+                if np.any(np.logical_and(np.asarray(quality), np.asarray(user_valid))):
+                    # Check to see if the valid tests indicate a moving bed
+                    moving_bed_bool = []
+                    for result in moving_bed:
+                        if result == "Yes":
+                            moving_bed_bool.append(True)
+                        else:
+                            moving_bed_bool.append(False)
+                    valid_moving_bed = np.logical_and(
+                        quality, np.asarray(moving_bed_bool)
+                    )
+                    if np.any(valid_moving_bed):
+                        # Check to see that a correction was used
+                        if np.any(np.logical_and(valid_moving_bed, np.asarray(used))):
+                            # Moving-bed exists and correction applied
+                            moving_bed_uncertainty = 1.5
+                        else:
+                            # Moving-bed exists and no correction applied
+                            moving_bed_uncertainty = 3
+                    else:
+                        # Valid tests indicated no moving bed
+                        moving_bed_uncertainty = 1
+                else:
+                    moving_bed_uncertainty = 3
+            elif meas.observed_no_moving_bed:
+                moving_bed_uncertainty = 1
+            else:
+                # No moving bed tests
+                moving_bed_uncertainty = 3
+        else:
+            # GPS used as boat velocity reference
+            moving_bed_uncertainty = 0
+
+        # Expand to list
+        self.u_movbed_list = [0.01 * moving_bed_uncertainty / 2] * self.nb_transects
+
+        # Apply user specified
+        if np.isnan(self.user_specified_u["u_movbed_user"]):
+            self.u_movbed_user_list = self.u_movbed_list
+        else:
+            self.u_movbed_user_list = [
+                self.user_specified_u["u_movbed_user"] * 0.01
+            ] * self.nb_transects
+
+    def uncertainty_system(self):
+        """Compute systematic uncertainty"""
+
+        # Assume 1.31% systematic bias at 68%
+        self.u_syst_list = [0.01 * 1.31] * self.nb_transects
+
+        # Override with user specification if available
+        if np.isnan(self.user_specified_u["u_syst_mean_user"]):
+            self.u_syst_mean_user_list = self.u_syst_list
+        else:
+            self.u_syst_mean_user_list = [
+                self.user_specified_u["u_syst_mean_user"] * 0.01
+            ] * self.nb_transects
+
+    def uncertainty_number_ensembles(self, meas):
+        """Computes the uncertainty due to the number of ensembles in a
+        transect.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        """
+
+        for trans_id in self.checked_idx:
+            # Compute uncertainty due to limited number of ensembles (ISO
+            # 748; Le Coz et al., 2012)
+            self.u_ens_list.append(
+                0.01 * 32 * len(meas.discharge[trans_id].middle_ens) ** (-0.88)
+            )
+
+        if np.isnan(self.user_specified_u["u_ens_user"]):
+            self.u_ens_user_list = self.u_ens_list
+        else:
+            self.u_ens_user_list = [
+                0.01 * self.user_specified_u["u_ens_user"]
+            ] * self.nb_transects
+
+    def uncertainty_compass(self, meas):
+        """Compute the potential bias in the measurement due to dynamic
+        compass errors when using GPS as
+        the navigation reference. The method is based on Mueller (2018,
+        https://doi.org/10.1016/j.flowmeasinst.2018.10.004, equation 41.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        """
+
+        # No compass error component for bottom track referenced discharges
+        if meas.transects[self.checked_idx[0]].boat_vel.selected == "bt_vel":
+            self.u_compass_list = [0] * self.nb_transects
+        else:
+            # Assume a default compass error unless one is provided by the user
+            if np.isnan(self.user_advanced_settings["compass_error_deg_user"]):
+                compass_error = self.default_advanced_settings["compass_error_deg"]
+            else:
+                compass_error = self.user_advanced_settings["compass_error_deg_user"]
+
+            # Compute discharge bias based on compass error and boat speed
+            meas_stats = meas.compute_measurement_properties(meas)
+            speed_ratio = (
+                meas_stats["avg_boat_speed"][self.checked_idx]
+                / meas_stats["avg_water_speed"][self.checked_idx]
+            )
+            self.u_compass_list = np.abs(
+                1 - (cosd(compass_error) + 0.5 * speed_ratio * sind(compass_error))
+            )
+
+        # Override if user provides uncertainty due to compass
+        if np.isnan(self.user_specified_u["u_compass_user"]):
+            self.u_compass_user_list = self.u_compass_list
+        else:
+            self.u_compass_user_list = [
+                self.user_specified_u["u_compass_user"] * 0.01
+            ] * self.nb_transects
+
+    def uncertainty_top_discharge(self):
+        """Computes the uncertainty in the top discharge using simulations
+        and rectangular law.
+        """
+
+        self.u_top_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[
+                    self.sim_original,
+                    self.sim_extrap_pp_opt,
+                    self.sim_extrap_pp_min,
+                    self.sim_extrap_pp_max,
+                    self.sim_extrap_cns_opt,
+                    self.sim_extrap_cns_min,
+                    self.sim_extrap_cns_max,
+                    self.sim_extrap_3pns_opt,
+                    self.sim_draft_max,
+                    self.sim_draft_min,
+                ],
+                col_name="q_top",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_top_mean_user"]):
+            self.u_top_mean_user_list = self.u_top_list
+        else:
+            self.u_top_mean_user_list = [
+                0.01 * self.user_specified_u["u_top_mean_user"]
+            ] * self.nb_transects
+
+    def uncertainty_bottom_discharge(self):
+        """Computes uncertainty of bottom discharge using simulations and
+        rectangular law.
+        """
+
+        self.u_bot_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[
+                    self.sim_original,
+                    self.sim_extrap_pp_opt,
+                    self.sim_extrap_pp_min,
+                    self.sim_extrap_pp_max,
+                    self.sim_extrap_cns_opt,
+                    self.sim_extrap_cns_min,
+                    self.sim_extrap_cns_max,
+                    self.sim_extrap_3pns_opt,
+                ],
+                col_name="q_bot",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_bot_mean_user"]):
+            self.u_bot_mean_user_list = self.u_bot_list
+        else:
+            self.u_bot_mean_user_list = [
+                0.01 * self.user_specified_u["u_bot_mean_user"]
+            ] * self.nb_transects
+
+    def uncertainty_left_discharge(self):
+        """Computes the uncertianty of the left edge discharge using
+        simulations and the rectangular law.
+        """
+
+        self.u_left_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[
+                    self.sim_original["q_left"],
+                    self.sim_edge_min,
+                    self.sim_edge_max,
+                    self.sim_draft_min,
+                    self.sim_draft_max,
+                ],
+                col_name="q_left",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_left_mean_user"]):
+            self.u_left_mean_user_list = self.u_left_list
+        else:
+            self.u_left_mean_user_list = [
+                0.01 * self.user_specified_u["u_left_mean_user"]
+            ] * self.nb_transects
+
+    def uncertainty_right_discharge(self):
+        """Computes the uncertainty of the right edge discharge using
+        simulations and the rectangular law.
+        """
+
+        self.u_right_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[
+                    self.sim_original["q_right"],
+                    self.sim_edge_min,
+                    self.sim_edge_max,
+                    self.sim_draft_min,
+                    self.sim_draft_max,
+                ],
+                col_name="q_right",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_right_mean_user"]):
+            self.u_right_mean_user_list = self.u_right_list
+        else:
+            self.u_right_mean_user_list = [
+                0.01 * self.user_specified_u["u_right_mean_user"]
+            ] * self.nb_transects
+
+    def uncertainty_invalid_depth_data(self):
+        """Computes the uncertainty due to invalid depth data using
+        simulations and the rectangular law.
+        """
+
+        self.u_invalid_depth_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[self.sim_original, self.sim_depth_hold, self.sim_depth_next],
+                col_name="q_total",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_invalid_depth_user"]):
+            self.u_invalid_depth_user_list = self.u_invalid_depth_list
+        else:
+            self.u_invalid_depth_user_list = [
+                0.01 * self.user_specified_u["u_invalid_depth_user"]
+            ] * self.nb_transects
+
+    def uncertainty_invalid_boat_data(self):
+        """Computes the uncertainty due to invalid boat data using
+        simulations and the rectangular law.
+        """
+
+        self.u_invalid_boat_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[self.sim_original, self.sim_boat_hold, self.sim_boat_next],
+                col_name="q_total",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_invalid_boat_user"]):
+            self.u_invalid_boat_user_list = self.u_invalid_boat_list
+        else:
+            self.u_invalid_boat_user_list = [
+                0.01 * self.user_specified_u["u_invalid_boat_user"]
+            ] * self.nb_transects
+
+    def uncertainty_invalid_water_data(self):
+        """Computes the uncertainty due to invalid water data assuming
+        rectangular law.
+        """
+
+        # Uncertainty due to invalid cells and ensembles
+        self.u_invalid_water_list = list(
+            Oursin.apply_u_rect(
+                list_sims=[
+                    self.sim_original,
+                    self.sim_cells_trdi,
+                    self.sim_cells_froude,
+                    self.sim_cells_above,
+                    self.sim_cells_below,
+                    self.sim_cells_before,
+                    self.sim_cells_after,
+                    self.sim_shallow,
+                ],
+                col_name="q_total",
+            )
+            / np.abs(self.sim_original["q_total"])
+        )
+
+        if np.isnan(self.user_specified_u["u_invalid_water_user"]):
+            self.u_invalid_water_user_list = self.u_invalid_water_list
+        else:
+            self.u_invalid_water_user_list = [
+                0.01 * self.user_specified_u["u_invalid_water_user"]
+            ] * self.nb_transects
+
+    def compute_measurement_cov(self, meas, method="Bayes"):
+        """Compute the coefficient of variation of the total transect
+        discharges used in the measurement.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        method: str
+            Determines method to use (Bayes or QRev)
+        """
+
+        self.cov_68 = np.nan
+
+        if method == "QRev":
+
+            # Only compute for multiple transects
+            if self.nb_transects > 1:
+                total_q = []
+                for trans_id in self.checked_idx:
+                    total_q.append(meas.discharge[trans_id].total)
+
+                # Compute coefficient of variation
+                cov = np.abs(np.nanstd(total_q, ddof=1) / np.nanmean(total_q))
+
+                # Inflate the cov to the 95% value
+                if len(total_q) == 2:
+                    # Use the approximate method as taught in class to
+                    # reduce the high coverage factor for 2 transects
+                    # and account for prior knowledge related to 720 second
+                    # duration analysis
+                    cov_95 = cov * 3.3
+                    self.cov_68 = cov_95 / 2
+                else:
+                    # Use Student's t to inflate COV for n > 2
+                    cov_95 = (
+                        t.interval(0.95, len(total_q) - 1)[1]
+                        * cov
+                        / len(total_q) ** 0.5
+                    )
+                    self.cov_68 = cov_95 / 2
+        elif method == "Bayes":
+
+            # Set prior
+            if np.isnan(meas.oursin.user_advanced_settings["cov_prior_user"]):
+                cov_prior = meas.oursin.default_advanced_settings["cov_prior"]
+            else:
+                cov_prior = meas.oursin.user_advanced_settings["cov_prior_user"]
+
+            if np.isnan(meas.oursin.user_advanced_settings["cov_prior_u_user"]):
+                cov_prior_u = meas.oursin.default_advanced_settings["cov_prior_u"]
+            else:
+                cov_prior_u = meas.oursin.user_advanced_settings["cov_prior_u_user"]
+
+            # Create list of observations
+            transects_total_q = []
+            for idx in meas.checked_transect_idx:
+                transects_total_q.append(meas.discharge[idx].total)
+
+            # Compute COV
+            self.cov_68 = bayes_cov(
+                np.array(transects_total_q), cov_prior, cov_prior_u, 20000
+            )
+
+    def sim_orig(self, meas):
+        """Stores original measurement results in a data frame
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        """
+        self.sim_original = self.sim_original.iloc[0:0]
+        transect_q = dict()
+        for trans_id in self.checked_idx:
+            transect_q["q_total"] = meas.discharge[trans_id].total
+            transect_q["q_top"] = meas.discharge[trans_id].top
+            transect_q["q_bot"] = meas.discharge[trans_id].bottom
+            transect_q["q_right"] = meas.discharge[trans_id].right
+            transect_q["q_left"] = meas.discharge[trans_id].left
+            transect_q["q_middle"] = meas.discharge[trans_id].middle
+            self.sim_original = self.sim_original.append(transect_q, ignore_index=True,
+                sort=False)
+
+    def sim_cns_min_max_opt(self, meas):
+        """Computes simulations resulting in the min and max discharges
+        for a constant no slip extrapolation fit.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        """
+
+        # Compute min-max no slip exponent
+        skip_ns_min_max, self.exp_ns_max, self.exp_ns_min = self.compute_ns_max_min(
+            meas=meas,
+            ns_exp=self.ns_exp,
+            exp_ns_min_user=self.user_advanced_settings["exp_ns_min_user"],
+            exp_ns_max_user=self.user_advanced_settings["exp_ns_max_user"],
+        )
+
+        # Optimized
+        self.sim_extrap_cns_opt[
+            "q_total"
+        ] = meas.extrap_fit.q_sensitivity.q_cns_opt_list
+        self.sim_extrap_cns_opt[
+            "q_top"
+        ] = meas.extrap_fit.q_sensitivity.q_top_cns_opt_list
+        self.sim_extrap_cns_opt[
+            "q_bot"
+        ] = meas.extrap_fit.q_sensitivity.q_bot_cns_opt_list
+
+        # Max min
+        if skip_ns_min_max:
+            # If cns not used both max and min are equal to the optimized value
+            self.sim_extrap_cns_min[
+                "q_total"
+            ] = meas.extrap_fit.q_sensitivity.q_cns_opt_list
+            self.sim_extrap_cns_min[
+                "q_top"
+            ] = meas.extrap_fit.q_sensitivity.q_top_cns_opt_list
+            self.sim_extrap_cns_min[
+                "q_bot"
+            ] = meas.extrap_fit.q_sensitivity.q_bot_cns_opt_list
+            self.sim_extrap_cns_max[
+                "q_total"
+            ] = meas.extrap_fit.q_sensitivity.q_cns_opt_list
+            self.sim_extrap_cns_max[
+                "q_top"
+            ] = meas.extrap_fit.q_sensitivity.q_top_cns_opt_list
+            self.sim_extrap_cns_max[
+                "q_bot"
+            ] = meas.extrap_fit.q_sensitivity.q_bot_cns_opt_list
+        else:
+            # Compute q for min and max values
+            q = QComp()
+            self.sim_extrap_cns_min = pd.DataFrame(
+                columns=self.sim_extrap_cns_min.columns
+            )
+            self.sim_extrap_cns_max = pd.DataFrame(
+                columns=self.sim_extrap_cns_max.columns
+            )
+
+            for trans_id in self.checked_idx:
+                # Compute min values
+                q.populate_data(
+                    data_in=meas.transects[trans_id],
+                    top_method="Constant",
+                    bot_method="No Slip",
+                    exponent=self.exp_ns_min,
+                )
+                self.sim_extrap_cns_min.loc[len(self.sim_extrap_cns_min)] = [
+                    q.total,
+                    q.top,
+                    q.bottom,
+                ]
+                # Compute max values
+                q.populate_data(
+                    data_in=meas.transects[trans_id],
+                    top_method="Constant",
+                    bot_method="No Slip",
+                    exponent=self.exp_ns_max,
+                )
+                self.sim_extrap_cns_max.loc[len(self.sim_extrap_cns_max)] = [
+                    q.total,
+                    q.top,
+                    q.bottom,
+                ]
+
+    def sim_pp_min_max_opt(self, meas):
+        """Computes simulations resulting in the the min and max discharges
+        for a power power extrapolation fit.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        """
+
+        # A power fit is not applicable to bi-directional flow
+        mean_q = meas.mean_discharges(meas)
+        if np.sign(mean_q["top_mean"]) != np.sign(mean_q["bot_mean"]):
+            self.sim_extrap_pp_min = self.sim_original[["q_total", "q_top", "q_bot"]]
+            self.sim_extrap_pp_max = self.sim_original[["q_total", "q_top", "q_bot"]]
+            self.sim_extrap_pp_opt = self.sim_original[["q_total", "q_top", "q_bot"]]
+
+        else:
+            # Compute min-max power exponent
+            skip_pp_min_max, self.exp_pp_max, self.exp_pp_min = self.compute_pp_max_min(
+                meas=meas,
+                exp_95ic_min=self.exp_95ic_min,
+                exp_95ic_max=self.exp_95ic_max,
+                pp_exp=self.pp_exp,
+                exp_pp_min_user=self.user_advanced_settings["exp_pp_min_user"],
+                exp_pp_max_user=self.user_advanced_settings["exp_pp_max_user"],
+            )
+
+            # Optimized
+            self.sim_extrap_pp_opt[
+                "q_total"
+            ] = meas.extrap_fit.q_sensitivity.q_pp_opt_list
+            self.sim_extrap_pp_opt[
+                "q_top"
+            ] = meas.extrap_fit.q_sensitivity.q_top_pp_opt_list
+            self.sim_extrap_pp_opt[
+                "q_bot"
+            ] = meas.extrap_fit.q_sensitivity.q_bot_pp_opt_list
+
+            # Max min
+            if skip_pp_min_max:
+                self.sim_extrap_pp_min[
+                    "q_total"
+                ] = meas.extrap_fit.q_sensitivity.q_pp_opt_list
+                self.sim_extrap_pp_min[
+                    "q_top"
+                ] = meas.extrap_fit.q_sensitivity.q_top_pp_opt_list
+                self.sim_extrap_pp_min[
+                    "q_bot"
+                ] = meas.extrap_fit.q_sensitivity.q_bot_pp_opt_list
+                self.sim_extrap_pp_max[
+                    "q_total"
+                ] = meas.extrap_fit.q_sensitivity.q_pp_opt_list
+                self.sim_extrap_pp_max[
+                    "q_top"
+                ] = meas.extrap_fit.q_sensitivity.q_top_pp_opt_list
+                self.sim_extrap_pp_max[
+                    "q_bot"
+                ] = meas.extrap_fit.q_sensitivity.q_bot_pp_opt_list
+            else:
+                q = QComp()
+                self.sim_extrap_pp_min = pd.DataFrame(
+                    columns=self.sim_extrap_pp_min.columns
+                )
+                self.sim_extrap_pp_max = pd.DataFrame(
+                    columns=self.sim_extrap_pp_max.columns
+                )
+
+                for trans_id in self.checked_idx:
+                    q.populate_data(
+                        data_in=meas.transects[trans_id],
+                        top_method="Power",
+                        bot_method="Power",
+                        exponent=self.exp_pp_min,
+                    )
+                    self.sim_extrap_pp_min.loc[len(self.sim_extrap_pp_min)] = [
+                        q.total,
+                        q.top,
+                        q.bottom,
+                    ]
+
+                    q.populate_data(
+                        data_in=meas.transects[trans_id],
+                        top_method="Power",
+                        bot_method="Power",
+                        exponent=self.exp_pp_max,
+                    )
+                    self.sim_extrap_pp_max.loc[len(self.sim_extrap_pp_max)] = [
+                        q.total,
+                        q.top,
+                        q.bottom,
+                    ]
+
+    def sim_edge_min_max(self, meas):
+        """Computes simulations for the maximum and minimum edge discharges.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of measurement data
+        """
+
+        # Clear variables
+        self.d_right_error_min = []
+        self.d_left_error_min = []
+        self.d_right_error_max = []
+        self.d_left_error_max = []
+        self.sim_edge_min = pd.DataFrame(columns=self.sim_edge_min.columns)
+        self.sim_edge_max = pd.DataFrame(columns=self.sim_edge_max.columns)
+
+        # Create measurement copy to allow changes without affecting original
+        meas_temp = copy.deepcopy(meas)
+
+        # Process each checked transect
+        for trans_id in self.checked_idx:
+            # Compute max and min edge distances
+            (
+                max_left_dist,
+                max_right_dist,
+                min_left_dist,
+                min_right_dist,
+            ) = self.compute_edge_dist_max_min(
+                transect=meas.transects[trans_id],
+                user_settings=self.user_advanced_settings,
+                default_settings=self.default_advanced_settings,
+            )
+
+            # Compute edge minimum
+            self.d_right_error_min.append(min_right_dist)
+            self.d_left_error_min.append(min_left_dist)
+            meas_temp.transects[trans_id].edges.left.distance_m = min_left_dist
+            meas_temp.transects[trans_id].edges.right.distance_m = min_right_dist
+            meas_temp.transects[trans_id].edges.left.type = "Triangular"
+            meas_temp.transects[trans_id].edges.right.type = "Triangular"
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_edge_min.loc[len(self.sim_edge_min)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].left,
+                meas_temp.discharge[trans_id].right,
+            ]
+
+            # Compute edge maximum
+            self.d_right_error_max.append(max_right_dist)
+            self.d_left_error_max.append(max_left_dist)
+            meas_temp.transects[trans_id].edges.left.distance_m = max_left_dist
+            meas_temp.transects[trans_id].edges.right.distance_m = max_right_dist
+            meas_temp.transects[trans_id].edges.left.type = "Rectangular"
+            meas_temp.transects[trans_id].edges.right.type = "Rectangular"
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_edge_max.loc[len(self.sim_edge_max)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].left,
+                meas_temp.discharge[trans_id].right,
+            ]
+
+    def sim_draft_max_min(self, meas):
+        """Compute the simulations for the max and min draft error.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        """
+
+        # Reset variables
+        self.draft_error_list = []
+        self.sim_draft_min = pd.DataFrame(columns=self.sim_draft_min.columns)
+        self.sim_draft_max = pd.DataFrame(columns=self.sim_draft_max.columns)
+
+        # Create copy of meas to avoid changing original
+        meas_temp = copy.deepcopy(meas)
+
+        for trans_id in self.checked_idx:
+            # Compute max and min draft
+            draft_max, draft_min, draft_error = self.compute_draft_max_min(
+                transect=meas.transects[trans_id],
+                draft_error_m_user=self.user_advanced_settings["draft_error_m_user"],
+            )
+            self.draft_error_list.append(draft_error)
+
+            # Compute discharge for draft min
+            meas_temp.transects[trans_id].change_draft(draft_min)
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_draft_min.loc[len(self.sim_draft_min)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].top,
+                meas_temp.discharge[trans_id].left,
+                meas_temp.discharge[trans_id].right,
+            ]
+            # Compute discharge for draft max
+            meas_temp.transects[trans_id].change_draft(draft_max)
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_draft_max.loc[len(self.sim_draft_max)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].top,
+                meas_temp.discharge[trans_id].left,
+                meas_temp.discharge[trans_id].right,
+            ]
+
+    def sim_invalid_cells(self, meas):
+        """Computes simulations using different methods to interpolate for
+        invalid cells and ensembles.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        """
+
+        # Reset data frames
+        self.sim_cells_trdi = pd.DataFrame(columns=self.sim_cells_trdi.columns)
+        self.sim_cells_froude = pd.DataFrame(columns=self.sim_cells_froude.columns)
+        self.sim_cells_above = pd.DataFrame(columns=self.sim_cells_above.columns)
+        self.sim_cells_below = pd.DataFrame(columns=self.sim_cells_below.columns)
+        self.sim_cells_before = pd.DataFrame(columns=self.sim_cells_before.columns)
+        self.sim_cells_after = pd.DataFrame(columns=self.sim_cells_after.columns)
+
+        # Simulations for invalid cells and ensembles
+        meas_temp = copy.deepcopy(meas)
+        for trans_id in self.checked_idx:
+            # TRDI method
+            meas_temp.transects[trans_id].w_vel.interpolate_cells_trdi(
+                meas_temp.transects[trans_id]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_cells_trdi.loc[len(self.sim_cells_trdi)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
+
+            # Froude interpolation
+            meas_temp.transects[trans_id].w_vel.interpolate_cells_froude(
+                meas_temp.transects[trans_id]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+
+            self.sim_cells_froude.loc[len(self.sim_cells_froude)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
+            # q_cells_froude = meas_temp.discharge[trans_id].middle_cells
+            # q_cells = meas.discharge[trans_id].middle_cells
+
+            # Above only
+            meas_temp.transects[trans_id].w_vel.interpolate_abba(
+                meas_temp.transects[trans_id], search_loc=["above"]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_cells_above.loc[len(self.sim_cells_above)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
+            # Below only
+            meas_temp.transects[trans_id].w_vel.interpolate_abba(
+                meas_temp.transects[trans_id], search_loc=["below"]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_cells_below.loc[len(self.sim_cells_below)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
+            # Before only
+            meas_temp.transects[trans_id].w_vel.interpolate_abba(
+                meas_temp.transects[trans_id], search_loc=["before"]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_cells_before.loc[len(self.sim_cells_before)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
+            # After only
+            meas_temp.transects[trans_id].w_vel.interpolate_abba(
+                meas_temp.transects[trans_id], search_loc=["after"]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_cells_after.loc[len(self.sim_cells_after)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
+
+    def sim_shallow_ens(self, meas):
+        """Computes simulations assuming no interpolation of discharge for
+        ensembles where depths are too shallow for any valid cells.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        """
+
+        # Reset data frame
+        self.sim_shallow = pd.DataFrame(columns=self.sim_shallow.columns)
+
+        for trans_id in self.checked_idx:
+            shallow_estimate = np.nansum(
+                meas.discharge[trans_id].middle_ens
+            ) - np.nansum(np.nansum(meas.discharge[trans_id].middle_cells))
+            if np.abs(shallow_estimate) > 0:
+                self.sim_shallow.loc[len(self.sim_shallow)] = [
+                    meas.discharge[trans_id].total - shallow_estimate,
+                    meas.discharge[trans_id].middle - shallow_estimate,
+                ]
+            else:
+                self.sim_shallow.loc[len(self.sim_shallow)] = [
+                    meas.discharge[trans_id].total,
+                    meas.discharge[trans_id].middle,
+                ]
+
+    def sim_invalid_depth(self, meas):
+        """Computes simulations using different methods to interpolate for
+        invalid depths.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+           Object of MeasurementData
+        """
+
+        # Reset dataframes
+        self.sim_depth_hold = pd.DataFrame(columns=self.sim_depth_hold.columns)
+        self.sim_depth_next = pd.DataFrame(columns=self.sim_depth_next.columns)
+
+        # Simulations for invalid depths
+        meas_temp = copy.deepcopy(meas)
+        for trans_id in self.checked_idx:
+            depths = getattr(
+                meas_temp.transects[trans_id].depths,
+                meas_temp.transects[trans_id].depths.selected,
+            )
+            # Hold last
+            depths.interpolate_hold_last()
+            meas_temp.transects[trans_id].w_vel.adjust_side_lobe(
+                meas_temp.transects[trans_id]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_depth_hold.loc[len(self.sim_depth_hold)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
+            # Fill with next
+            depths.interpolate_next()
+            meas_temp.transects[trans_id].w_vel.adjust_side_lobe(
+                meas_temp.transects[trans_id]
+            )
+            meas_temp.discharge[trans_id].populate_data(
+                data_in=meas_temp.transects[trans_id],
+                moving_bed_data=meas_temp.mb_tests,
+            )
+            self.sim_depth_next.loc[len(self.sim_depth_next)] = [
+                meas_temp.discharge[trans_id].total,
+                meas_temp.discharge[trans_id].middle,
+            ]
+
+    def sim_invalid_boat_velocity(self, meas):
+        """Computes simulations using different methods to interpolate for
+        invalid boat velocity.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+           Object of MeasurementData
+        """
+
+        # Reset dataframes
+        self.sim_boat_hold = pd.DataFrame(columns=self.sim_boat_hold.columns)
+        self.sim_boat_next = pd.DataFrame(columns=self.sim_boat_next.columns)
+
+        # Simulations for invalid boat velocity
+        meas_temp = copy.deepcopy(meas)
+        for trans_id in self.checked_idx:
+            # Hold last
+            boat_data = getattr(
+                meas_temp.transects[trans_id].boat_vel,
+                meas_temp.transects[trans_id].boat_vel.selected,
+            )
+            if boat_data is not None:
+                boat_data.interpolate_hold_last()
+                meas_temp.discharge[trans_id].populate_data(
+                    data_in=meas_temp.transects[trans_id],
+                    moving_bed_data=meas_temp.mb_tests,
+                )
+                self.sim_boat_hold.loc[len(self.sim_boat_hold)] = [
+                    meas_temp.discharge[trans_id].total,
+                    meas_temp.discharge[trans_id].middle,
+                ]
+                # Fill with next
+                boat_data.interpolate_next()
+                meas_temp.discharge[trans_id].populate_data(
+                    data_in=meas_temp.transects[trans_id],
+                    moving_bed_data=meas_temp.mb_tests,
+                )
+                self.sim_boat_next.loc[len(self.sim_boat_next)] = [
+                    meas_temp.discharge[trans_id].total,
+                    meas_temp.discharge[trans_id].middle,
+                ]
+            else:
+                self.sim_boat_next.loc[len(self.sim_boat_next)] = [
+                    meas.discharge[trans_id].total,
+                    meas_temp.discharge[trans_id].middle,
+                ]
+                self.sim_boat_hold.loc[len(self.sim_boat_hold)] = [
+                    meas.discharge[trans_id].total,
+                    meas_temp.discharge[trans_id].middle,
+                ]
+
+    @staticmethod
+    def compute_draft_max_min(transect, draft_error_m_user=np.nan):
+        """Determine the max and min values of the ADCP draft.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of transect data
+        draft_error_m_user: float
+            User specified draft error in m
+
+        Returns
+        -------
+        draft_max: float
+            Maximum draft in m for simulations
+        draft_min: float
+            Minimum draft in m for simulations
+        draft_error: float
+            Draft error in m
+        """
+        depths = transect.depths.bt_depths.depth_processed_m  # depth by ens
+        depth_90 = np.quantile(depths, q=0.9)  # quantile 90% to avoid spikes
+
+        # Determine draft error value
+        if np.isnan(draft_error_m_user):
+            if depth_90 < 2.50:
+                draft_error = 0.02
+            else:
+                draft_error = 0.05
+        else:
+            draft_error = draft_error_m_user
+
+        # Compute draft max and min
+        draft_min = transect.depths.bt_depths.draft_orig_m - draft_error
+        draft_max = transect.depths.bt_depths.draft_orig_m + draft_error
+
+        if draft_min <= 0:
+            draft_min = 0.01
+
+        return draft_max, draft_min, draft_error
+
+    @staticmethod
+    def compute_edge_dist_max_min(transect, user_settings, default_settings):
+        """Compute the max and min edge distances."""
+
+        init_dist_right = transect.edges.right.distance_m
+        init_dist_left = transect.edges.left.distance_m
+
+        # Select user percentage or default
+        if np.isnan(user_settings["right_edge_dist_prct_user"]):
+            d_right_error_prct = default_settings["right_edge_dist_prct"]
+        else:
+            d_right_error_prct = user_settings["right_edge_dist_prct_user"]
+
+        if np.isnan(user_settings["left_edge_dist_prct_user"]):
+            d_left_error_prct = default_settings["left_edge_dist_prct"]
+        else:
+            d_left_error_prct = user_settings["left_edge_dist_prct_user"]
+
+        # Compute min distance for both edges
+        min_left_dist = (1 - d_left_error_prct * 0.01) * init_dist_left
+        min_right_dist = (1 - d_right_error_prct * 0.01) * init_dist_right
+
+        if min_left_dist <= 0:
+            min_left_dist = 0.10
+        if min_right_dist <= 0:
+            min_right_dist = 0.10
+
+        # Compute max distance for both edges
+        max_left_dist = (1 + d_left_error_prct * 0.01) * init_dist_left
+        max_right_dist = (1 + d_right_error_prct * 0.01) * init_dist_right
+
+        return max_left_dist, max_right_dist, min_left_dist, min_right_dist
+
+    @staticmethod
+    def compute_pp_max_min(
+        meas, exp_95ic_min, exp_95ic_max, pp_exp, exp_pp_min_user, exp_pp_max_user
+    ):
+        """Determine the max and min exponents for power fit.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        exp_95ic_min: list
+            Minimum power fit exponent from the 95% confidence interval for
+            each transect
+        exp_95ic_max: list
+            Maximum power fit exponent from the 95% confidence interval for
+            each transect
+        pp_exp: list
+            Optimized power fit exponent for each transect
+        exp_pp_min_user: float
+            User supplied minimum power fit exponent
+        exp_pp_max_user: float
+            User supplied maximum power fit exponent
+
+        Returns
+        -------
+        skip_pp_min_max: bool
+            Boolean to identify if power fit simulations should be skipped
+        exp_pp_max: float
+            Maximum power fit exponent to be used in simulations
+        exp_pp_min: float
+            Minimum power fit exponent to be used in simulations
+        """
+        skip_pp_min_max = False
+        if len(pp_exp) == 0:
+            skip_pp_min_max = True
+            min_pp = meas.extrap_fit.q_sensitivity.pp_exp
+            max_pp = meas.extrap_fit.q_sensitivity.pp_exp
+        else:
+            if np.isnan(pp_exp).any():
+                mean_pp = 0.16
+            else:
+                mean_pp = np.nanmean(pp_exp)
+
+            # If all transects have confidence intervals, use the mean of
+            # the confidence interval min/max. Otherwise adjust average +/- 0.2
+            if np.isnan(exp_95ic_min).any():
+                min_pp = mean_pp - 0.2
+            else:
+                min_pp = np.nanmean(exp_95ic_min)
+
+            if np.isnan(exp_95ic_max).any():
+                max_pp = mean_pp + 0.2
+            else:
+                max_pp = np.nanmean(exp_95ic_max)
+
+            # Diff between mean PP exponent and min/max
+            if mean_pp - min_pp > 0.2:
+                min_pp = mean_pp - 0.2
+            if max_pp - mean_pp > 0.2:
+                max_pp = mean_pp + 0.2
+
+            # Check that 0 < exponent < 1
+            if min_pp <= 0:
+                min_pp = 0.01
+            if max_pp >= 1:
+                max_pp = 0.99
+
+        # Set min-max exponents of user override
+        if np.isnan(exp_pp_min_user):
+            exp_pp_min = min_pp
+        else:
+            exp_pp_min = exp_pp_min_user
+
+        if np.isnan(exp_pp_max_user):
+            exp_pp_max = max_pp
+        else:
+            exp_pp_max = exp_pp_max_user
+
+        return skip_pp_min_max, exp_pp_max, exp_pp_min
+
+    @staticmethod
+    def compute_ns_max_min(
+        meas, ns_exp, exp_ns_min_user=np.nan, exp_ns_max_user=np.nan
+    ):
+        """Determine the max and min no slip exponents.
+
+        Parameters
+        ----------
+        meas: MeasurementData
+            Object of MeasurementData
+        ns_exp: list
+            List of maximum and minimum no slip exponents.
+        exp_ns_min_user: float
+            User supplied minimum no slip exponent
+        exp_ns_max_user: float
+            User supplied maximum no slip exponent
+
+        Returns
+        -------
+        skip_ns_min_max: bool
+            Boolean to identify if no slip simulations should be skipped
+        exp_ns_max: float
+            Maximum no slip exponent to be used in simulations
+        exp_ns_min: float
+            Minimum no slip exponent to be used in simulations
+        """
+        skip_ns_min_max = False
+        if len(ns_exp) == 0:
+            skip_ns_min_max = True
+            min_ns = meas.extrap_fit.q_sensitivity.ns_exp
+            max_ns = meas.extrap_fit.q_sensitivity.ns_exp
+        else:
+            mean_ns = np.nanmean(ns_exp)
+            if len(ns_exp) == 1:
+                min_ns = ns_exp[0] - 0.05
+                max_ns = ns_exp[0] + 0.05
+            else:
+                min_ns = np.nanmin(ns_exp)
+                max_ns = np.nanmax(ns_exp)
+
+            # Diff between mean NS exponent and min/max shouldn't be > 0.2
+            if mean_ns - min_ns > 0.2:
+                min_ns = mean_ns - 0.2
+            if max_ns - mean_ns > 0.2:
+                max_ns = mean_ns + 0.2
+
+            # Check that 0 < exponent < 1
+            if min_ns <= 0:
+                min_ns = 0.01
+            if max_ns >= 1:
+                max_ns = 0.99
+
+        # Apply user overides
+        if np.isnan(exp_ns_min_user):
+            exp_ns_min = min_ns
+        else:
+            exp_ns_min = exp_ns_min_user
+
+        if np.isnan(exp_ns_max_user):
+            exp_ns_max = max_ns
+        else:
+            exp_ns_max = exp_ns_max_user
+
+        return skip_ns_min_max, exp_ns_max, exp_ns_min
+
+    @staticmethod
+    def depth_error_boat_motion(transect):
+        """Relative depth error due to vertical velocity of boat
+           the height [m] is vertical velocity times ensemble duration
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+
+        Returns
+        -------
+        relative_error_depth: float
+            Random depth error by ensemble
+        """
+
+        d_ens = transect.depths.bt_depths.depth_processed_m
+        depth_vv = transect.boat_vel.bt_vel.w_mps * transect.date_time.ens_duration_sec
+        relative_error_depth = np.abs(depth_vv) / d_ens
+        relative_error_depth[np.isnan(relative_error_depth)] = 0.00
+        return relative_error_depth
+
+    @staticmethod
+    def water_std_by_error_velocity(transect):
+        """Compute the relative standard deviation of the water velocity
+        using the fact that the error velocity is scaled so that the
+        standard deviation of the error velocity is the same as the standard deviation
+        of the horizontal water velocity.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+
+        Returns
+        -------
+        std_ev_wt_ens: float
+            Standard deviation of water track error velocity for each ensemble
+        """
+
+        # Computer water speed
+        u_water = transect.w_vel.u_processed_mps
+        v_water = transect.w_vel.v_processed_mps
+        v_wa_cell_abs = np.sqrt(u_water**2 + v_water**2)
+        v_wa_cell_abs[np.round(v_wa_cell_abs, 3) == 0.000] = np.nan
+
+        # Use only valid error velocity data
+        d_vel_filtered = np.tile([np.nan], transect.w_vel.d_mps.shape)
+        d_vel_filtered[transect.w_vel.valid_data[0]] = transect.w_vel.d_mps[
+            transect.w_vel.valid_data[0]
+        ]
+
+        # Compute relative standard deviation of error velocity
+        std_ev_wt = np.nanstd(d_vel_filtered) / np.abs(v_wa_cell_abs)
+        std_ev_wt_ens = np.nanmedian(std_ev_wt, axis=0)
+        # TODO consider substituting the overall std for nan rather than 0
+        # all_std_ev_WT = np.nanstd(d_vel_filtered[:])
+        # std_ev_wt_ens[np.isnan(std_ev_wt_ens)] = all_std_ev_WT
+        std_ev_wt_ens[np.isnan(std_ev_wt_ens)] = 0.00
+        return std_ev_wt_ens
+
+    @staticmethod
+    def boat_std_by_error_velocity(transect):
+        """Compute the relative standard deviation of the boat velocity
+        using the fact that the error velocity is scaled so that the
+        standard deviation of the error velocity is the same as the
+        standard deviation of the horizontal boat velocity.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+
+        Returns
+        -------
+        std_ev_bt: float
+            Standard deviation of bottom track error velocity
+        """
+
+        # Compute boat speed
+        u_boat = transect.boat_vel.bt_vel.u_processed_mps
+        v_boat = transect.boat_vel.bt_vel.v_processed_mps
+        speed = np.sqrt(u_boat**2 + v_boat**2)
+        speed[np.round(speed, 3) == 0.000] = np.nan
+
+        # Use only valid error velocity data
+        d_vel_filtered = np.tile([np.nan], transect.boat_vel.bt_vel.d_mps.shape)
+        d_vel_filtered[
+            transect.boat_vel.bt_vel.valid_data[0]
+        ] = transect.boat_vel.bt_vel.d_mps[transect.boat_vel.bt_vel.valid_data[0]]
+
+        # Compute relative standard deviation of error velocity
+        all_std_ev_bt = np.nanstd(d_vel_filtered)
+        std_ev_bt = np.abs(all_std_ev_bt) / speed
+        # TODO Consider substituting the overall std for nan rather than 0
+        # std_ev_bt[np.isnan(std_ev_bt)] = all_std_ev_bt
+        std_ev_bt[np.isnan(std_ev_bt)] = 0.00
+
+        return std_ev_bt
+
+    @staticmethod
+    def apply_u_rect(list_sims, col_name):
+        """Compute the uncertainty using list of simulated discharges
+        following a ranctangular law
+
+        Parameters
+        ----------
+        list_sims: list
+            List of simulation data frames to be used in the computation
+        col_name: str
+            Name of column in the data frames to be used in the computation
+
+        Returns
+        -------
+        u_rect: float
+            Result of rectangular law
+        """
+
+        # Combine data frames
+        vertical_stack = pd.concat(list_sims, axis=0, sort=True)
+
+        # Apply rectangular law
+        u_rect = (
+            vertical_stack.groupby(vertical_stack.index)[col_name].max()
+            - vertical_stack.groupby(vertical_stack.index)[col_name].min()
+        ) / (2 * (3**0.5))
+
+        return u_rect
+
+    # Bayesian COV
+    # ============
+    @staticmethod
+    def bayes_cov(transects_total_q, cov_prior=0.03, cov_prior_u=0.2, nsim=20000):
+        """Computes the coefficient of variation using a Bayesian approach
+        and an assumed posterior log-normal distribution.
+
+        Parameters
+        ----------
+        transects_total_q: list
+            List of total discharge for each transect
+        cov_prior: float
+            Expected COV (68%) based on prior knowledge. Assumed to be 3% by
+            default.
+        cov_prior_u: float
+            Uncertainty (68%) of cov_prior. Assumed to be 20%.
+        nsim: int
+            Number of simulations. 20000 was found to produce stable results.
+
+        Returns
+        -------
+        cov: float
+            Coefficient of variation
+        """
+
+        sav = Oursin.metropolis(
+            theta0=[np.mean(transects_total_q), cov_prior],
+            obs_data=transects_total_q,
+            cov_prior=cov_prior,
+            cov_prior_u=cov_prior_u,
+            nsim=nsim,
+            theta_std=np.abs(np.array([np.mean(transects_total_q), cov_prior]))
+            * cov_prior_u
+            / np.sqrt(len(transects_total_q)),
+        )
+
+        n_burn = int(nsim / 2)
+
+        cov = np.mean(sav["sam"][n_burn:nsim, 1])
+
+        return cov
+
+    @staticmethod
+    def metropolis(
+        theta0, obs_data, cov_prior, cov_prior_u, nsim=1000, theta_std=np.nan
+    ):
+        """Implements the Metropolis_Hastings Markov chain Monte Carlo (
+        MCMC) algorithm for sampling the
+        posterior distribution, assuming a log-normal posterior distribution.
+
+        Parameters
+        ----------
+        theta0: list
+            Starting value of parameters (mean and cov_prior)
+        obs_data: list
+            List of total discharge for each transect
+        cov_prior: float
+            Expected COV (68%) based on prior knowledge.
+        cov_prior_u: float
+            Uncertainty (68%) of cov_prior.
+        nsim: int
+            Number of simulations.
+        theta_std: float
+            Standard deviation for the gaussian Jump distribution. If blank
+            a default value is computed.
+
+        Returns
+        -------
+        w: dict
+            Dictionary containing
+            sam: np.array(float)
+                Matrix containing the MCMC samples
+            obj_funk: np.array(float)
+                Vector containing the corresponding values of the objective
+                function
+                (i.e. of the unnormalized log-posterior)
+        """
+
+        # Initialize
+        npar = len(theta0)
+        sam = np.zeros((nsim + 1, npar))
+        obj_funk = np.zeros((nsim + 1, 1))
+
+        # Parameters - used for automatic computation of starting stds of
+        # the Gaussian Jump distribution
+        if np.any(np.isnan(theta_std)):
+            std_factor = 0.1
+            theta_std = std_factor * np.abs(theta0)
+
+        # Check if starting point is feasible - abandon otherwise
+        f_current = Oursin.log_post(
+            param=theta0,
+            measures=obs_data,
+            cov_prior=cov_prior,
+            cov_prior_u=cov_prior_u,
+        )
+
+        if not Oursin.is_feasible(f_current):
+            print("Metropolis:FATAL:unfeasible starting point")
+            w = {"sam": sam, "obj_funk": obj_funk}
+            return w
+        else:
+            sam[0, :] = list(theta0)
+            obj_funk[0] = f_current
+
+            # MCMC loop
+            # candid = np.array([np.nan, np.nan])
+            np.random.seed(0)
+            for i in range(nsim):
+                current = sam[i, :]
+                f_current = obj_funk[i]
+                # Propose a new candidate
+                candid = np.random.normal(loc=current, scale=theta_std)
+                # Change for use in Numba
+                # candid[0] = np.random.normal(loc=current[0],
+                # scale=theta_std[0])
+                # candid[1] = np.random.normal(loc=current[1],
+                # scale=theta_std[1])
+                # Evaluate objective function at candidate
+                f_candid = Oursin.log_post(
+                    param=candid,
+                    measures=obs_data,
+                    cov_prior=cov_prior,
+                    cov_prior_u=cov_prior_u,
+                )
+
+                if not Oursin.is_feasible(f_candid):
+                    sam[i + 1, :] = current
+                    obj_funk[i + 1] = f_current
+                else:
+                    # Generate deviate ~U[0,1]
+                    u = np.random.uniform(0, 1)
+
+                    # Compute Metropolis acceptance ratio
+                    # Changed for use in Numba
+                    ratio = math.exp(min(max(-100, f_candid - f_current), 0))
+                    # ratio = np.exp(min(((np.max(np.hstack((float(-100),
+                    # f_candid - f_current))), float(0)))))
+
+                    # Apply acceptance rule
+                    if u <= ratio:
+                        sam[i + 1, :] = candid
+                        obj_funk[i + 1] = f_candid
+                    else:
+                        sam[i + 1, :] = current
+                        obj_funk[i + 1] = f_current
+
+            w = {"sam": sam, "obj_funk": obj_funk}
+            return w
+
+    @staticmethod
+    def log_post(param, measures, cov_prior, cov_prior_u):
+        """Define function returning the posterior log-pdf using the model
+        measures ~ N(true_value,cov*true_value),
+        with a flat prior on true_value and a log-normal prior for cov (=
+        coefficient of variation)
+
+        Parameters
+        ----------
+        param: np.array(float)
+            Array containing the true value and COV
+
+        measures: np.array(float)
+            Array of observations
+        cov_prior: float
+            Expected COV (68%) based on prior knowledge.
+        cov_prior_u: float
+            Uncertainty (68%) of cov_prior.
+
+        Returns
+        -------
+        logp:
+        """
+        # Check if any parameter is <=0
+        # since  both true_value and cov have to be positive - otherwise
+        # sigma = true_value*cov does not make sense
+        if any(item <= 0 for item in param):
+            return -math.inf
+
+        true_value = param[0]
+        cov = param[1]
+        sigma = cov * true_value  # standard deviation
+
+        # Compute log-likelihood under the model:
+        # measures ~ N(true_value, sigma)
+        # You can easily change this model (e.g. lognormal for a positive
+        # measurand?)
+        # OPTION 1 : the model follows a Normal distribution
+        log_likelihood = np.sum(
+            scipy.stats.norm.logpdf(measures, loc=true_value, scale=sigma)
+        )
+        # Change for Numba
+        # log_likelihood = np.sum(np.log(np.exp(-(((measures - true_value) /
+        # sigma) ** 2) / 2)
+        #                                / (np.sqrt(2 * np.pi) * sigma)))
+
+        # Prior on true_value - flat prior used here but you may change this
+        # if you have prior knowledge
+        log_prior_1 = 0
+
+        # Lognormal prior
+        x = cov
+        mu = np.log(cov_prior)
+        scale = cov_prior_u
+        pdf = np.exp(-((np.log(x) - mu) ** 2) / (2 * scale**2)) / (
+            x * scale * np.sqrt(2 * np.pi)
+        )
+        log_prior_2 = np.log(pdf)
+
+        # Joint prior (prior independence)
+        log_prior = log_prior_1 + log_prior_2
+
+        # Return (unnormalized) log-posterior
+        logp = log_likelihood + log_prior
+        if np.isnan(logp):
+            logp = -math.inf  # returns -Inf rather than NaN's (required by
+            # the MCMC sampler used subsequently)
+        return logp
+
+    @staticmethod
+    def is_feasible(value):
+        """Checks that a value is a real value (not infinity or nan)
+
+        Parameters
+        ----------
+        value: float or int
+
+        Returns
+        -------
+        bool
+        """
+        if np.isinf(value) or np.isnan(value):
+            return False
+        else:
+            return True
+
+    # Hening Huang proposed method for random uncertainty (not used)
+    # ---------------------------------------------------
+    @staticmethod
+    def hh_random_meas(meas):
+        """Implements the semi-empirical method for computing the random
+        uncertainty of an ADCP discharge transect, as presented in
+        Hening Huang (2018) Estimating uncertainty of streamflow measurements with
+        moving-boat acoustic Doppler current profilers, Hydrological
+        Sciences Journal, 63:3, 353-368, DOI:10.1080/02626667.2018.1433833
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+
+        Returns
+        -------
+            random_u: list
+                List of random uncertainty for each checked transect.
+        """
+        random_u = []
+        for idx in meas.checked_transect_idx:
+            # Get or compute base variables
+            q_m = meas.discharge[idx].middle
+            q_i = meas.discharge[idx].middle_ens
+            q_bar = np.nanmean(q_i[:])
+
+            # Compute r1
+            r1_numerator = []
+            r1_denominator = []
+            for n in range(len(q_i) - 1):
+                r1_numerator.append((q_i[n] - q_bar) * (q_i[n + 1] - q_bar))
+                r1_denominator.append((q_i[n] - q_bar) ** 2)
+            r1_denominator.append((q_i[-1] - q_bar) ** 2)
+            r1 = np.nansum(r1_numerator) / np.nansum(r1_denominator)
+
+            # Compute g(r1)
+            g_r1 = (
+                0.6
+                + (0.1 * np.exp(r1))
+                + (0.01 * (1 - np.exp((r1**0.6) - 1) ** -0.08))
+            )
+            if g_r1 < 1:
+                g_r1 = 1.0
+
+            # Compute (delta qi)**2
+            alpha = 1.0 / 3.0
+            c1 = 0.5 * (1 - alpha)
+            delta_list = []
+            for n in range(1, len(q_i) - 1):
+                q_i_hat = c1 * q_i[n - 1] + alpha * q_i[n] + c1 * q_i[n + 1]
+                delta_list.append((q_i[n] - q_i_hat) ** 2)
+
+            # Compute unbiased residual sum of squares
+            urss = ((2.0 / 3.0) * (1 / (1 - alpha)) ** 2) * np.nansum(delta_list)
+
+            # Compute random uncertainty
+            random_u.append(g_r1 * np.sqrt(urss) / q_m)
+
+        return random_u
diff --git a/qrevint_22_06_22/Classes/Pd0TRDI.py b/Classes/Pd0TRDI.py
similarity index 60%
rename from qrevint_22_06_22/Classes/Pd0TRDI.py
rename to Classes/Pd0TRDI.py
index 05bb1b9e654870e95f1748f48a204f01da8a1633..dd149c0548e1e86e631b1debc991270f9bf20edf 100644
--- a/qrevint_22_06_22/Classes/Pd0TRDI.py
+++ b/Classes/Pd0TRDI.py
@@ -35,7 +35,7 @@ class Pd0TRDI(object):
     Nmea: Nmea
         Object of Nmea to hold Nmea data
     """
-    
+
     def __init__(self, file_name):
         """Constructor initializing instance variables.
 
@@ -44,7 +44,7 @@ class Pd0TRDI(object):
         file_name: str
             Full name including path of pd0 file to be read
         """
-        
+
         self.file_name = file_name
         self.Hdr = None
         self.Inst = None
@@ -57,10 +57,12 @@ class Pd0TRDI(object):
         self.Surface = None
         self.AutoMode = None
         self.Nmea = None
-        
+
         self.pd0_read(file_name)
-        
-    def create_objects(self, n_ensembles, n_types, n_bins, max_surface_bins, n_velocities, wr2=False):
+
+    def create_objects(
+        self, n_ensembles, n_types, n_bins, max_surface_bins, n_velocities, wr2=False
+    ):
         """Create objects for instance variables.
 
         Parameters
@@ -92,7 +94,8 @@ class Pd0TRDI(object):
         self.Nmea = Nmea(n_ensembles)
 
     def pd0_read(self, fullname, wr2=False):
-        """Reads the binary pd0 file and assigns values to object instance variables.
+        """Reads the binary pd0 file and assigns values to object instance
+        variables.
 
         Parameters
         ----------
@@ -112,35 +115,38 @@ class Pd0TRDI(object):
 
             if file_info > 0:
                 # Open file for processing
-                with open(fullname, 'rb') as f:
+                with open(fullname, "rb") as f:
 
                     # Read leader ID
                     leader_id = hex(np.fromfile(f, np.uint16, count=1)[0])
                     # Leader ID 7f7f marks beginning of ensemble
-                    if leader_id != '0x7f7f':
-                        while leader_id != '0x7f7f':
+                    if leader_id != "0x7f7f":
+                        while leader_id != "0x7f7f":
                             f.seek(-1, 1)
                             leader_id = hex(np.fromfile(f, np.uint16, count=1)[0])
 
                     # Read header information
-                    initial_pos = f.tell()-2
+                    initial_pos = f.tell() - 2
                     bytes_per_ens = np.fromfile(f, dtype=np.uint16, count=1)[0]
                     f.seek(1, 1)
                     n_types = np.fromfile(f, np.uint8, count=1)[0]
                     offset = np.fromfile(f, np.uint16, count=1)[0]
-                    f.seek(initial_pos+offset+8, 0)
+                    f.seek(initial_pos + offset + 8, 0)
                     n_beams = np.fromfile(f, np.uint8, count=1)[0]
                     n_bins = np.fromfile(f, np.uint8, count=1)[0]
 
-                    # Determine number of ensembles in the file to allow pre-allocation of arrays
+                    # Determine number of ensembles in the file to allow
+                    # pre-allocation of arrays
                     n_ensembles = Pd0TRDI.number_of_ensembles(f, file_info)
 
                     # Create objects and pre-allocate arrays
-                    self.create_objects(n_ensembles=n_ensembles,
-                                        n_types=n_types,
-                                        n_bins=n_bins,
-                                        max_surface_bins=max_surface_bins,
-                                        n_velocities=n_velocities)
+                    self.create_objects(
+                        n_ensembles=n_ensembles,
+                        n_types=n_types,
+                        n_bins=n_bins,
+                        max_surface_bins=max_surface_bins,
+                        n_velocities=n_velocities,
+                    )
 
                     # Initialize counters and variables
                     i_ens = -1
@@ -161,17 +167,20 @@ class Pd0TRDI(object):
 
                         # Read leader ID
                         leader_id = hex(np.fromfile(f, np.uint16, count=1)[0])
-                        if i_data_types >= n_data_types and leader_id != '0x7f7f':
-                            leader_id = '0x9999'
+                        if i_data_types >= n_data_types and leader_id != "0x7f7f":
+                            leader_id = "0x9999"
 
                         # 7f7f marks the beginning of an ensemble
-                        if leader_id == '0x7f7f':
+                        if leader_id == "0x7f7f":
                             i2022 = 0
                             file_loc = f.tell() - 2
 
                             # Check for last ensemble in file
-                            if file_loc+bytes_per_ens > end_file and i_ens >= n_ensembles:
-                                end_file_check = end_file+1
+                            if (
+                                file_loc + bytes_per_ens > end_file
+                                and i_ens >= n_ensembles
+                            ):
+                                end_file_check = end_file + 1
 
                             else:
                                 # Process ensemble
@@ -181,24 +190,33 @@ class Pd0TRDI(object):
 
                                 # Check check_sum
                                 if self.check_sum(f, file_loc, bytes_per_ens):
-                                    f.seek(file_loc+5, 0)
+                                    f.seek(file_loc + 5, 0)
                                     n_data_types = np.fromfile(f, np.uint8, count=1)[0]
-                                    data_offsets = np.fromfile(f, np.uint16, count=n_data_types)
+                                    data_offsets = np.fromfile(
+                                        f, np.uint16, count=n_data_types
+                                    )
 
                                     # Find variable leader ID
-                                    while i_data_types+1 <= n_data_types and leader_id != '0x80':
-                                        f.seek(data_offsets[i_data_types]+file_loc, 0)
-                                        leader_id = hex(np.fromfile(f, np.uint16, count=1)[0])
+                                    while (
+                                        i_data_types + 1 <= n_data_types
+                                        and leader_id != "0x80"
+                                    ):
+                                        f.seek(data_offsets[i_data_types] + file_loc, 0)
+                                        leader_id = hex(
+                                            np.fromfile(f, np.uint16, count=1)[0]
+                                        )
                                         i_data_types += 1
 
                                     # Check for consecutive ensemble numbers
-                                    if i_ens > -1 and leader_id == '0x80':
+                                    if i_ens > -1 and leader_id == "0x80":
                                         ens_num = np.fromfile(f, np.uint16, count=1)[0]
                                         ens_num_diff = ens_num - self.Sensor.num[i_ens]
                                         if ens_num_diff > 1:
-                                            for nn in range(0, int(ens_num_diff-1)):
+                                            for nn in range(0, int(ens_num_diff - 1)):
                                                 if i_ens < n_ensembles:
-                                                    self.Sensor.num[i_ens] = self.Sensor.num[i_ens-1]+1
+                                                    self.Sensor.num[i_ens] = (
+                                                        self.Sensor.num[i_ens - 1] + 1
+                                                    )
                                                     i_ens += 1
                                         elif ens_num_diff < 1:
                                             i_ens -= 1
@@ -212,38 +230,57 @@ class Pd0TRDI(object):
                                 i_ens += 1
 
                                 # Read bytes in this ensemble
-                                self.Hdr.bytes_per_ens[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
+                                self.Hdr.bytes_per_ens[i_ens] = np.fromfile(
+                                    f, np.uint16, count=1
+                                )[0]
 
                                 # If checksum is valid read header data
-                                if self.check_sum(f, file_loc, int(self.Hdr.bytes_per_ens[i_ens])):
+                                if self.check_sum(
+                                    f, file_loc, int(self.Hdr.bytes_per_ens[i_ens])
+                                ):
 
                                     # Read number of data types
-                                    f.seek(file_loc+5, 0)
-                                    self.Hdr.n_data_types[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
+                                    f.seek(file_loc + 5, 0)
+                                    self.Hdr.n_data_types[i_ens] = np.fromfile(
+                                        f, np.uint8, count=1
+                                    )[0]
 
                                     # Read data offsets
-                                    test = np.fromfile(f, np.uint16, count=int(self.Hdr.n_data_types[i_ens]))
+                                    test = np.fromfile(
+                                        f,
+                                        np.uint16,
+                                        count=int(self.Hdr.n_data_types[i_ens]),
+                                    )
                                     if test.shape[0] > self.Hdr.data_offsets.shape[1]:
-                                        self.Hdr.data_offsets = np.resize(self.Hdr.data_offsets,
-                                                                          (n_ensembles, test.shape[0]))
-                                    self.Hdr.data_offsets[i_ens, 0:int(self.Hdr.n_data_types[i_ens])] = \
-                                        test[0:int(self.Hdr.n_data_types[i_ens])]
+                                        self.Hdr.data_offsets = np.resize(
+                                            self.Hdr.data_offsets,
+                                            (n_ensembles, test.shape[0]),
+                                        )
+                                    self.Hdr.data_offsets[
+                                        i_ens, 0 : int(self.Hdr.n_data_types[i_ens])
+                                    ] = test[0 : int(self.Hdr.n_data_types[i_ens])]
 
                                     # Check for end of data types
-                                    self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                                    self.end_reading(
+                                        f, file_loc, i_data_types, i_ens, bytes_per_ens
+                                    )
                                 else:
                                     self.bad_check_sum(f, file_loc)
                                     i_data_types = -1
 
                         # Read binary fixed leader data
-                        elif leader_id == '0x0':
+                        elif leader_id == "0x0":
                             # Update data types counter
                             i_data_types += 1
 
                             # Read and decode firmware version
-                            self.Inst.firm_ver[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Inst.firm_ver[i_ens] = self.Inst.firm_ver[i_ens] + \
-                                np.fromfile(f, np.uint8, count=1)[0] / 100
+                            self.Inst.firm_ver[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Inst.firm_ver[i_ens] = (
+                                self.Inst.firm_ver[i_ens]
+                                + np.fromfile(f, np.uint8, count=1)[0] / 100
+                            )
 
                             # Read and decode instrument characteristics
                             bitls = np.fromfile(f, np.uint8, count=1)[0]
@@ -267,29 +304,29 @@ class Pd0TRDI(object):
 
                             val = int(bitls[4], 2)
                             if val == 0:
-                                self.Inst.pat[i_ens] = 'Concave'
+                                self.Inst.pat[i_ens] = "Concave"
                             elif val == 1:
-                                self.Inst.pat[i_ens] = 'Convex'
+                                self.Inst.pat[i_ens] = "Convex"
                             else:
-                                self.Inst.pat[i_ens] = 'n/a'
+                                self.Inst.pat[i_ens] = "n/a"
 
                             self.Inst.sensor_CFG[i_ens] = int(bitls[2:3], 2) + 1
 
                             val = int(bitls[1], 2)
                             if val == 0:
-                                self.Inst.xducer[i_ens] = 'Not Attached'
+                                self.Inst.xducer[i_ens] = "Not Attached"
                             elif val == 1:
-                                self.Inst.xducer[i_ens] = 'Attached'
+                                self.Inst.xducer[i_ens] = "Attached"
                             else:
-                                self.Inst.xducer[i_ens] = 'n/a'
+                                self.Inst.xducer[i_ens] = "n/a"
 
                             val = int(bitls[0], 2)
                             if val == 0:
-                                self.Sensor.orient[i_ens] = 'Down'
+                                self.Sensor.orient[i_ens] = "Down"
                             elif val == 1:
-                                self.Sensor.orient[i_ens] = 'Up'
+                                self.Sensor.orient[i_ens] = "Up"
                             else:
-                                self.Sensor.orient[i_ens] = 'n/a'
+                                self.Sensor.orient[i_ens] = "n/a"
 
                             bitms = np.fromfile(f, np.uint8, count=1)[0]
                             bitms = "{0:08b}".format(bitms)
@@ -321,259 +358,425 @@ class Pd0TRDI(object):
 
                             val = np.fromfile(f, np.uint8, count=1)[0]
                             if val == 0:
-                                self.Inst.data_type[i_ens] = 'Real'
+                                self.Inst.data_type[i_ens] = "Real"
                             else:
-                                self.Inst.data_type[i_ens] = 'Simu'
+                                self.Inst.data_type[i_ens] = "Simu"
 
-                            # Position file pointer and read configuration information
+                            # Position file pointer and read configuration
+                            # information
                             f.seek(1, 1)
-                            self.Cfg.n_beams[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
+                            self.Cfg.n_beams[i_ens] = np.fromfile(f, np.uint8, count=1)[
+                                0
+                            ]
                             self.Cfg.wn[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
                             self.Cfg.wp[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Cfg.ws_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Cfg.wf_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
+                            self.Cfg.ws_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[
+                                0
+                            ]
+                            self.Cfg.wf_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[
+                                0
+                            ]
                             self.Cfg.wm[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
                             self.Cfg.wc[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Cfg.code_reps[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Cfg.wg_per[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Cfg.we_mmps[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Cfg.tp_sec[i_ens] = np.sum(np.fromfile(f, np.uint8, count=3) * np.array([60, 1, 0.01]))
+                            self.Cfg.code_reps[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Cfg.wg_per[i_ens] = np.fromfile(f, np.uint8, count=1)[
+                                0
+                            ]
+                            self.Cfg.we_mmps[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.Cfg.tp_sec[i_ens] = np.sum(
+                                np.fromfile(f, np.uint8, count=3)
+                                * np.array([60, 1, 0.01])
+                            )
                             self.Cfg.ex[i_ens] = "{0:08b}".format(ord(f.read(1)))
 
                             val = int(self.Cfg.ex[i_ens][3:5], 2)
                             if val == 0:
-                                self.Cfg.coord_sys[i_ens] = 'Beam'
+                                self.Cfg.coord_sys[i_ens] = "Beam"
                             elif val == 1:
-                                self.Cfg.coord_sys[i_ens] = 'Inst'
+                                self.Cfg.coord_sys[i_ens] = "Inst"
                             elif val == 2:
-                                self.Cfg.coord_sys[i_ens] = 'Ship'
+                                self.Cfg.coord_sys[i_ens] = "Ship"
                             elif val == 3:
-                                self.Cfg.coord_sys[i_ens] = 'Earth'
+                                self.Cfg.coord_sys[i_ens] = "Earth"
                             else:
                                 self.Cfg.coord_sys[i_ens] = "N/a"
 
                             val = int(self.Cfg.ex[i_ens][5], 2)
                             if val == 0:
-                                self.Cfg.use_pr = 'No'
+                                self.Cfg.use_pr = "No"
                             elif val == 1:
-                                self.Cfg.use_pr = 'Yes'
+                                self.Cfg.use_pr = "Yes"
                             else:
-                                self.Cfg.use_pr = 'N/a'
+                                self.Cfg.use_pr = "N/a"
 
                             val = int(self.Cfg.ex[i_ens][6], 2)
                             if val == 0:
-                                self.Cfg.use_3beam = 'No'
+                                self.Cfg.use_3beam = "No"
                             elif val == 1:
-                                self.Cfg.use_3beam = 'Yes'
+                                self.Cfg.use_3beam = "Yes"
                             else:
-                                self.Cfg.use_3beam = 'N/a'
+                                self.Cfg.use_3beam = "N/a"
 
                             val = int(self.Cfg.ex[i_ens][7], 2)
                             if val == 0:
-                                self.Cfg.map_bins = 'No'
+                                self.Cfg.map_bins = "No"
                             elif val == 1:
-                                self.Cfg.map_bins = 'Yes'
+                                self.Cfg.map_bins = "Yes"
                             else:
-                                self.Cfg.map_bins = 'N/a'
-
-                            self.Cfg.ea_deg[i_ens] = np.fromfile(f, np.int16, count=1)[0] * 0.01
-                            self.Cfg.eb_deg[i_ens] = np.fromfile(f, np.uint16, count=1)[0] * 0.01
-                            self.Cfg.ez[i_ens] = "{0:08b}".format(np.fromfile(f, np.uint8, count=1)[0])
+                                self.Cfg.map_bins = "N/a"
+
+                            self.Cfg.ea_deg[i_ens] = (
+                                np.fromfile(f, np.int16, count=1)[0] * 0.01
+                            )
+                            self.Cfg.eb_deg[i_ens] = (
+                                np.fromfile(f, np.uint16, count=1)[0] * 0.01
+                            )
+                            self.Cfg.ez[i_ens] = "{0:08b}".format(
+                                np.fromfile(f, np.uint8, count=1)[0]
+                            )
 
                             val = int(self.Cfg.ez[i_ens][:2], 2)
                             if val == 0:
-                                self.Cfg.sos_src[i_ens] = 'Manual EC'
+                                self.Cfg.sos_src[i_ens] = "Manual EC"
                             elif val == 1:
-                                self.Cfg.sos_src[i_ens] = 'Calculated'
+                                self.Cfg.sos_src[i_ens] = "Calculated"
                             elif val == 3:
-                                self.Cfg.sos_src[i_ens] = 'SVSS Sensor'
+                                self.Cfg.sos_src[i_ens] = "SVSS Sensor"
                             else:
-                                self.Cfg.sos_src[i_ens] = 'N/a'
+                                self.Cfg.sos_src[i_ens] = "N/a"
 
                             val = int(self.Cfg.ez[i_ens][2], 2)
                             if val == 0:
-                                self.Cfg.xdcr_dep_srs[i_ens] = 'Manual ED'
+                                self.Cfg.xdcr_dep_srs[i_ens] = "Manual ED"
                             if val == 1:
-                                self.Cfg.xdcr_dep_srs[i_ens] = 'Sensor'
+                                self.Cfg.xdcr_dep_srs[i_ens] = "Sensor"
                             else:
-                                self.Cfg.xdcr_dep_srs[i_ens] = 'N/a'
+                                self.Cfg.xdcr_dep_srs[i_ens] = "N/a"
 
                             val = int(self.Cfg.ez[i_ens][3], 2)
                             if val == 0:
-                                self.Cfg.head_src[i_ens] = 'Manual EH'
+                                self.Cfg.head_src[i_ens] = "Manual EH"
                             if val == 1:
-                                self.Cfg.head_src[i_ens] = 'Int. Sensor'
+                                self.Cfg.head_src[i_ens] = "Int. Sensor"
                             else:
-                                self.Cfg.head_src[i_ens] = 'N/a'
+                                self.Cfg.head_src[i_ens] = "N/a"
 
                             val = int(self.Cfg.ez[i_ens][4], 2)
                             if val == 0:
-                                self.Cfg.pitch_src[i_ens] = 'Manual EP'
+                                self.Cfg.pitch_src[i_ens] = "Manual EP"
                             if val == 1:
-                                self.Cfg.pitch_src[i_ens] = 'Int. Sensor'
+                                self.Cfg.pitch_src[i_ens] = "Int. Sensor"
                             else:
-                                self.Cfg.pitch_src[i_ens] = 'N/a'
+                                self.Cfg.pitch_src[i_ens] = "N/a"
 
                             val = int(self.Cfg.ez[i_ens][5], 2)
                             if val == 0:
-                                self.Cfg.roll_src[i_ens] = 'Manual ER'
+                                self.Cfg.roll_src[i_ens] = "Manual ER"
                             if val == 1:
-                                self.Cfg.roll_src[i_ens] = 'Int. Sensor'
+                                self.Cfg.roll_src[i_ens] = "Int. Sensor"
                             else:
-                                self.Cfg.roll_src[i_ens] = 'N/a'
+                                self.Cfg.roll_src[i_ens] = "N/a"
 
                             val = int(self.Cfg.ez[i_ens][6], 2)
                             if val == 0:
-                                self.Cfg.xdcr_dep_srs[i_ens] = 'Manual ES'
+                                self.Cfg.xdcr_dep_srs[i_ens] = "Manual ES"
                             if val == 1:
-                                self.Cfg.xdcr_dep_srs[i_ens] = 'Int. Sensor'
+                                self.Cfg.xdcr_dep_srs[i_ens] = "Int. Sensor"
                             else:
-                                self.Cfg.xdcr_dep_srs[i_ens] = 'N/a'
+                                self.Cfg.xdcr_dep_srs[i_ens] = "N/a"
 
                             val = int(self.Cfg.ez[i_ens][7], 2)
                             if val == 0:
-                                self.Cfg.temp_src[i_ens] = 'Manual ET'
+                                self.Cfg.temp_src[i_ens] = "Manual ET"
                             if val == 1:
-                                self.Cfg.temp_src[i_ens] = 'Int. Sensor'
+                                self.Cfg.temp_src[i_ens] = "Int. Sensor"
                             else:
-                                self.Cfg.temp_src[i_ens] = 'N/a'
-
-                            self.Cfg.sensor_avail[i_ens] = "{0:08b}".format(np.fromfile(f, np.uint8, count=1)[0])
-                            self.Cfg.dist_bin1_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Cfg.xmit_pulse_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Cfg.ref_lay_str_cell[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Cfg.ref_lay_end_cell[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
+                                self.Cfg.temp_src[i_ens] = "N/a"
+
+                            self.Cfg.sensor_avail[i_ens] = "{0:08b}".format(
+                                np.fromfile(f, np.uint8, count=1)[0]
+                            )
+                            self.Cfg.dist_bin1_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.Cfg.xmit_pulse_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.Cfg.ref_lay_str_cell[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Cfg.ref_lay_end_cell[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
                             self.Cfg.wa[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
                             self.Cfg.cx[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Cfg.lag_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Cfg.cpu_ser_no[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
+                            self.Cfg.lag_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[
+                                0
+                            ]
+                            self.Cfg.cpu_ser_no[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
                             self.Cfg.wb[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
                             self.Cfg.cq[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
 
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Read variable leader data
-                        elif leader_id == '0x80':
+                        elif leader_id == "0x80":
                             # Update the data types counter
                             i_data_types += 1
 
                             # Read instrument clock and sensor data
-                            self.Sensor.num[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Sensor.date_not_y2k[i_ens, :] = np.fromfile(f, np.uint8, count=3)
-                            self.Sensor.time[i_ens, :] = np.fromfile(f, np.uint8, count=4)
-                            self.Sensor.num_fact[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.num_tot[i_ens] = self.Sensor.num[i_ens] + self.Sensor.num_fact[i_ens]*65535
-                            self.Sensor.bit_test[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Sensor.sos_mps[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Sensor.xdcr_depth_dm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Sensor.heading_deg[i_ens] = np.fromfile(f, np.uint16, count=1)[0] / 100.
-                            self.Sensor.pitch_deg[i_ens] = np.fromfile(f, np.int16, count=1)[0] / 100.
-                            self.Sensor.roll_deg[i_ens] = np.fromfile(f, np.int16, count=1)[0] / 100.
-                            self.Sensor.salinity_ppt[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Sensor.temperature_deg_c[i_ens] = np.fromfile(f, np.int16, count=1)[0] / 100.
-                            self.Sensor.mpt_msc[i_ens, :] = np.fromfile(f, np.uint8, count=3)
-                            self.Sensor.heading_std_dev_deg[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.pitch_std_dev_deg[i_ens] = np.fromfile(f, np.uint8, count=1)[0] / 10.
-                            self.Sensor.roll_std_dev_deg[i_ens] = np.fromfile(f, np.uint8, count=1) / 10.
-                            self.Sensor.xmit_current[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.xmit_voltage[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.ambient_temp[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.pressure_pos[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.pressure_neg[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.attitude_temp[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.attitude[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.contam_sensor[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.error_status_word[i_ens] = ["{0:08b}".format(x)
-                                                                    for x in np.fromfile(f, np.uint8, count=4)]
+                            self.Sensor.num[i_ens] = np.fromfile(f, np.uint16, count=1)[
+                                0
+                            ]
+                            self.Sensor.date_not_y2k[i_ens, :] = np.fromfile(
+                                f, np.uint8, count=3
+                            )
+                            self.Sensor.time[i_ens, :] = np.fromfile(
+                                f, np.uint8, count=4
+                            )
+                            self.Sensor.num_fact[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.num_tot[i_ens] = (
+                                self.Sensor.num[i_ens]
+                                + self.Sensor.num_fact[i_ens] * 65535
+                            )
+                            self.Sensor.bit_test[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.Sensor.sos_mps[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.Sensor.xdcr_depth_dm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.Sensor.heading_deg[i_ens] = (
+                                np.fromfile(f, np.uint16, count=1)[0] / 100.0
+                            )
+                            self.Sensor.pitch_deg[i_ens] = (
+                                np.fromfile(f, np.int16, count=1)[0] / 100.0
+                            )
+                            self.Sensor.roll_deg[i_ens] = (
+                                np.fromfile(f, np.int16, count=1)[0] / 100.0
+                            )
+                            self.Sensor.salinity_ppt[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.Sensor.temperature_deg_c[i_ens] = (
+                                np.fromfile(f, np.int16, count=1)[0] / 100.0
+                            )
+                            self.Sensor.mpt_msc[i_ens, :] = np.fromfile(
+                                f, np.uint8, count=3
+                            )
+                            self.Sensor.heading_std_dev_deg[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.pitch_std_dev_deg[i_ens] = (
+                                np.fromfile(f, np.uint8, count=1)[0] / 10.0
+                            )
+                            self.Sensor.roll_std_dev_deg[i_ens] = (
+                                np.fromfile(f, np.uint8, count=1) / 10.0
+                            )
+                            self.Sensor.xmit_current[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.xmit_voltage[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.ambient_temp[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.pressure_pos[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.pressure_neg[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.attitude_temp[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.attitude[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.contam_sensor[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.error_status_word[i_ens] = [
+                                "{0:08b}".format(x)
+                                for x in np.fromfile(f, np.uint8, count=4)
+                            ]
                             f.seek(2, 1)
-                            self.Sensor.pressure_pascal[i_ens] = np.fromfile(f, np.uint32, count=1)[0]
-                            self.Sensor.pressure_var_pascal[i_ens] = np.fromfile(f, np.uint32, count=1)[0]
+                            self.Sensor.pressure_pascal[i_ens] = np.fromfile(
+                                f, np.uint32, count=1
+                            )[0]
+                            self.Sensor.pressure_var_pascal[i_ens] = np.fromfile(
+                                f, np.uint32, count=1
+                            )[0]
 
                             f.seek(1, 1)
-                            self.Sensor.date_y2k[i_ens, :] = np.fromfile(f, np.uint8, count=4)
-                            self.Sensor.time_y2k[i_ens, :] = np.fromfile(f, np.uint8, count=4)
-                            self.Sensor.date[i_ens, :] = self.Sensor.date_not_y2k[i_ens, :]
-                            self.Sensor.date[i_ens, 0] = self.Sensor.date_y2k[i_ens, 0] * 100 + \
-                                self.Sensor.date_y2k[i_ens, 1]
-                            self.Cfg.lag_near_bottom[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            self.Sensor.date_y2k[i_ens, :] = np.fromfile(
+                                f, np.uint8, count=4
+                            )
+                            self.Sensor.time_y2k[i_ens, :] = np.fromfile(
+                                f, np.uint8, count=4
+                            )
+                            self.Sensor.date[i_ens, :] = self.Sensor.date_not_y2k[
+                                i_ens, :
+                            ]
+                            self.Sensor.date[i_ens, 0] = (
+                                self.Sensor.date_y2k[i_ens, 0] * 100
+                                + self.Sensor.date_y2k[i_ens, 1]
+                            )
+                            self.Cfg.lag_near_bottom[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Read water-tracking velocity data
-                        elif leader_id == '0x100':
+                        elif leader_id == "0x100":
                             # Update the data types counter
                             i_data_types += 1
 
                             if self.Cfg.wn[i_ens] > self.Wt.vel_mps.shape[1]:
-                                append = np.zeros([self.Wt.vel_mps.shape[0],
-                                                   int(self.Cfg.wn[i_ens] - self.Wt.vel_mps.shape[1]),
-                                                   self.Wt.vel_mps.shape[2]])
+                                append = np.zeros(
+                                    [
+                                        self.Wt.vel_mps.shape[0],
+                                        int(
+                                            self.Cfg.wn[i_ens]
+                                            - self.Wt.vel_mps.shape[1]
+                                        ),
+                                        self.Wt.vel_mps.shape[2],
+                                    ]
+                                )
                                 self.Wt.vel_mps = np.hstack([self.Wt.vel_mps, append])
 
-                            dummy = np.fromfile(f, np.int16, count=int(self.Cfg.wn[i_ens]*4))
-                            dummy = np.reshape(dummy, [int(self.Cfg.wn[i_ens]), n_velocities])
-                            self.Wt.vel_mps[:n_velocities, :int(self.Cfg.wn[i_ens]), i_ens] = dummy.T
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            dummy = np.fromfile(
+                                f, np.int16, count=int(self.Cfg.wn[i_ens] * 4)
+                            )
+                            dummy = np.reshape(
+                                dummy, [int(self.Cfg.wn[i_ens]), n_velocities]
+                            )
+                            self.Wt.vel_mps[
+                                :n_velocities, : int(self.Cfg.wn[i_ens]), i_ens
+                            ] = dummy.T
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Read correlation magnitude
-                        elif leader_id == '0x200':
+                        elif leader_id == "0x200":
                             # Update the data types counter
                             i_data_types += 1
 
                             if self.Cfg.wn[i_ens] > self.Wt.corr.shape[1]:
-                                append = np.zeros([self.Wt.corr.shape[0],
-                                                   int(self.Cfg.wn[i_ens] - self.Wt.corr.shape[1]),
-                                                   self.Wt.corr.shape[2]])
+                                append = np.zeros(
+                                    [
+                                        self.Wt.corr.shape[0],
+                                        int(self.Cfg.wn[i_ens] - self.Wt.corr.shape[1]),
+                                        self.Wt.corr.shape[2],
+                                    ]
+                                )
                                 self.Wt.corr = np.hstack([self.Wt.corr, append])
 
-                            dummy = np.fromfile(f, np.uint8, count=int(self.Cfg.wn[i_ens]*4))
-                            dummy = np.reshape(dummy, [int(self.Cfg.wn[i_ens]), n_velocities])
-                            self.Wt.corr[:n_velocities, :int(self.Cfg.wn[i_ens]), i_ens] = dummy.T
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            dummy = np.fromfile(
+                                f, np.uint8, count=int(self.Cfg.wn[i_ens] * 4)
+                            )
+                            dummy = np.reshape(
+                                dummy, [int(self.Cfg.wn[i_ens]), n_velocities]
+                            )
+                            self.Wt.corr[
+                                :n_velocities, : int(self.Cfg.wn[i_ens]), i_ens
+                            ] = dummy.T
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Read echo intensity
-                        elif leader_id == '0x300':
+                        elif leader_id == "0x300":
                             # Update the data types counter
                             i_data_types += 1
 
                             if self.Cfg.wn[i_ens] > self.Wt.rssi.shape[1]:
-                                append = np.zeros([self.Wt.rssi.shape[0],
-                                                   int(self.Cfg.wn[i_ens] - self.Wt.rssi.shape[1]),
-                                                   self.Wt.rssi.shape[2]])
+                                append = np.zeros(
+                                    [
+                                        self.Wt.rssi.shape[0],
+                                        int(self.Cfg.wn[i_ens] - self.Wt.rssi.shape[1]),
+                                        self.Wt.rssi.shape[2],
+                                    ]
+                                )
                                 self.Wt.rssi = np.hstack([self.Wt.rssi, append])
 
-                            dummy = np.fromfile(f, np.uint8, count=int(self.Cfg.wn[i_ens]*4))
-                            dummy = np.reshape(dummy, [int(self.Cfg.wn[i_ens]), n_velocities])
-                            self.Wt.rssi[:n_velocities, :int(self.Cfg.wn[i_ens]), i_ens] = dummy.T
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            dummy = np.fromfile(
+                                f, np.uint8, count=int(self.Cfg.wn[i_ens] * 4)
+                            )
+                            dummy = np.reshape(
+                                dummy, [int(self.Cfg.wn[i_ens]), n_velocities]
+                            )
+                            self.Wt.rssi[
+                                :n_velocities, : int(self.Cfg.wn[i_ens]), i_ens
+                            ] = dummy.T
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Read percent-good data
-                        elif leader_id == '0x400':
+                        elif leader_id == "0x400":
                             # Update the data types counter
                             i_data_types += 1
 
                             if self.Cfg.wn[i_ens] > self.Wt.pergd.shape[1]:
-                                append = np.zeros([self.Wt.pergd.shape[0],
-                                                   int(self.Cfg.wn[i_ens] - self.Wt.pergd.shape[1]),
-                                                   self.Wt.pergd.shape[2]])
+                                append = np.zeros(
+                                    [
+                                        self.Wt.pergd.shape[0],
+                                        int(
+                                            self.Cfg.wn[i_ens] - self.Wt.pergd.shape[1]
+                                        ),
+                                        self.Wt.pergd.shape[2],
+                                    ]
+                                )
                                 self.Wt.pergd = np.hstack([self.Wt.pergd, append])
-                            dummy = np.fromfile(f, np.uint8, count=int(self.Cfg.wn[i_ens]*4))
-                            dummy = np.reshape(dummy, [int(self.Cfg.wn[i_ens]), n_velocities])
-                            self.Wt.pergd[:n_velocities, :int(self.Cfg.wn[i_ens]), i_ens] = dummy.T
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            dummy = np.fromfile(
+                                f, np.uint8, count=int(self.Cfg.wn[i_ens] * 4)
+                            )
+                            dummy = np.reshape(
+                                dummy, [int(self.Cfg.wn[i_ens]), n_velocities]
+                            )
+                            self.Wt.pergd[
+                                :n_velocities, : int(self.Cfg.wn[i_ens]), i_ens
+                            ] = dummy.T
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Read bottom track data
-                        elif leader_id == '0x600':
+                        elif leader_id == "0x600":
                             # Update the data types counter
                             i_data_types += 1
 
@@ -584,10 +787,14 @@ class Pd0TRDI(object):
                             self.Cfg.ba[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
                             self.Cfg.bg[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
                             self.Cfg.bm[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Cfg.be_mmps[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
+                            self.Cfg.be_mmps[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
 
                             # Read winriver 10.06 format GPS data
-                            self.Gps.lat_deg[i_ens] = (np.fromfile(f, np.int32, count=1)[0]/2**31) * 180
+                            self.Gps.lat_deg[i_ens] = (
+                                np.fromfile(f, np.int32, count=1)[0] / 2**31
+                            ) * 180
 
                             # Read the Least Significant Bytes for beam depths
                             dummy = np.fromfile(f, np.uint16, count=4)
@@ -612,16 +819,20 @@ class Pd0TRDI(object):
                             # Read WinRiver 10.06 format GPS data
                             dummy = np.fromfile(f, np.uint16, count=1)[0]
                             if dummy != -32768:
-                                self.Gps.alt_m[i_ens] = (dummy-32768)/10
+                                self.Gps.alt_m[i_ens] = (dummy - 32768) / 10
                             else:
                                 self.Gps.altm[i_ens] = np.nan
 
                             long2 = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Gps.long_deg[i_ens] = ((long1+long2*2**16)/2**31)*180
+                            self.Gps.long_deg[i_ens] = (
+                                (long1 + long2 * 2**16) / 2**31
+                            ) * 180
                             if self.Gps.long_deg[i_ens] > 180:
                                 self.Gps.long_deg[i_ens] -= 360
 
-                            self.Bt.ext_depth_cm[i_ens] = np.fromfile(f, np.int16, count=1)[0]
+                            self.Bt.ext_depth_cm[i_ens] = np.fromfile(
+                                f, np.int16, count=1
+                            )[0]
                             dummy = np.fromfile(f, np.int16, count=1)[0]
                             if dummy != -32768:
                                 self.Gps.gga_vel_e_mps[i_ens] = dummy * -1 / 1000
@@ -657,43 +868,73 @@ class Pd0TRDI(object):
                                 self.Gps.gga_n_stats[i_ens] = dummy
 
                             f.seek(1, 1)
-                            self.Gps.gsa_sat[i_ens, 4] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Gps.gsa_sat[i_ens, 5] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Gps.gga_diff[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
+                            self.Gps.gsa_sat[i_ens, 4] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Gps.gsa_sat[i_ens, 5] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Gps.gga_diff[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
 
                             dummy = np.fromfile(f, np.uint8, count=1)[0]
                             if dummy != 0:
                                 self.Gps.gga_hdop[i_ens] = dummy / 10
 
-                            self.Gps.gsa_sat[i_ens, 0] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Gps.gsa_sat[i_ens, 1] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Gps.gsa_sat[i_ens, 2] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Gps.gsa_sat[i_ens, 3] = np.fromfile(f, np.uint8, count=1)[0]
+                            self.Gps.gsa_sat[i_ens, 0] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Gps.gsa_sat[i_ens, 1] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Gps.gsa_sat[i_ens, 2] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Gps.gsa_sat[i_ens, 3] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
 
                             # Read bx configuration setting
-                            self.Cfg.bx_dm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
+                            self.Cfg.bx_dm[i_ens] = np.fromfile(f, np.uint16, count=1)[
+                                0
+                            ]
 
                             # Read bottom-tracking RSSI
-                            self.Bt.rssi[0, i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Bt.rssi[1, i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Bt.rssi[2, i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Bt.rssi[3, i_ens] = np.fromfile(f, np.uint8, count=1)[0]
+                            self.Bt.rssi[0, i_ens] = np.fromfile(f, np.uint8, count=1)[
+                                0
+                            ]
+                            self.Bt.rssi[1, i_ens] = np.fromfile(f, np.uint8, count=1)[
+                                0
+                            ]
+                            self.Bt.rssi[2, i_ens] = np.fromfile(f, np.uint8, count=1)[
+                                0
+                            ]
+                            self.Bt.rssi[3, i_ens] = np.fromfile(f, np.uint8, count=1)[
+                                0
+                            ]
 
                             # Read wj configuration setting
                             self.Cfg.wj[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
 
-                            # Read most significant byte and compute beam depths
+                            # Read most significant byte and compute beam
+                            # depths
                             dummy = np.fromfile(f, np.uint8, count=1)[0]
                             rr_bt_depth_correction[0:4, i_ens] = dummy.T * 2e16 / 100
 
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Read  General NMEA Structure
-                        # Data type '2022' contains sub data types the identify specfic NMEA
-                        # 0183 data types that will be decoded. There may be multiple values
+                        # Data type '2022' contains sub data types the
+                        # identify specfic NMEA
+                        # 0183 data types that will be decoded. There may be
+                        # multiple values
                         # for a single ensemble.
-                        elif leader_id == '0x2022':
+                        elif leader_id == "0x2022":
                             i2022 += 1
                             # Update the data types counter
                             i_data_types += 1
@@ -705,52 +946,92 @@ class Pd0TRDI(object):
                             # GGA
                             if specific_id == 100:
                                 j100 += 1
-                                # If the number of values exceeds 20 expand arrays
+                                # If the number of values exceeds 20 expand
+                                # arrays
                                 if j100 > self.Gps2.gga_delta_time.shape[1] - 1:
                                     self.Gps2.gga_expand(n_ensembles)
 
                                 self.Gps2.gga_delta_time[i_ens, j100] = delta_time
 
-                                self.Gps2.gga_header[i_ens][j100] = ''.join([chr(x) for x in f.read(10)])
+                                self.Gps2.gga_header[i_ens][j100] = "".join(
+                                    [chr(x) for x in f.read(10)]
+                                )
 
                                 try:
-                                    temp = ''.join([chr(x) for x in f.read(10)])
-                                    self.Gps2.utc[i_ens, j100] = float(re.findall('^\d+\.\d+|\d+', temp)[0])
+                                    temp = "".join([chr(x) for x in f.read(10)])
+                                    self.Gps2.utc[i_ens, j100] = float(
+                                        re.findall("^\d+\.\d+|\d+", temp)[0]
+                                    )
                                 except ValueError:
                                     self.Gps2.utc[i_ens, j100] = np.nan
 
-                                self.Gps2.lat_deg[i_ens, j100] = np.fromfile(f, np.float64, count=1)[0]
+                                self.Gps2.lat_deg[i_ens, j100] = np.fromfile(
+                                    f, np.float64, count=1
+                                )[0]
                                 self.Gps2.lat_ref[i_ens][j100] = chr(f.read(1)[0])
-                                self.Gps2.lon_deg[i_ens, j100] = np.fromfile(f, np.float64, count=1)[0]
+                                self.Gps2.lon_deg[i_ens, j100] = np.fromfile(
+                                    f, np.float64, count=1
+                                )[0]
                                 self.Gps2.lon_ref[i_ens][j100] = chr(f.read(1)[0])
-                                self.Gps2.corr_qual[i_ens, j100] = np.fromfile(f, np.uint8, count=1)[0]
-                                self.Gps2.num_sats[i_ens, j100] = np.fromfile(f, np.uint8, count=1)[0]
-                                self.Gps2.hdop[i_ens, j100] = np.fromfile(f, np.float32, count=1)[0]
-                                self.Gps2.alt[i_ens, j100] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.corr_qual[i_ens, j100] = np.fromfile(
+                                    f, np.uint8, count=1
+                                )[0]
+                                self.Gps2.num_sats[i_ens, j100] = np.fromfile(
+                                    f, np.uint8, count=1
+                                )[0]
+                                self.Gps2.hdop[i_ens, j100] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
+                                self.Gps2.alt[i_ens, j100] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.alt_unit[i_ens][j100] = chr(f.read(1)[0])
-                                self.Gps2.geoid[i_ens, j100] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.geoid[i_ens, j100] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.geoid_unit[i_ens][j100] = chr(f.read(1)[0])
-                                self.Gps2.d_gps_age[i_ens, j100] = np.fromfile(f, np.float32, count=1)[0]
-                                self.Gps2.ref_stat_id[i_ens, j100] = np.fromfile(f, np.int16, count=0)[0]
+                                self.Gps2.d_gps_age[i_ens, j100] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
+                                self.Gps2.ref_stat_id[i_ens, j100] = np.fromfile(
+                                    f, np.int16, count=0
+                                )[0]
 
                             # VTG
                             elif specific_id == 101:
                                 j101 += 1
-                                # If the number of values exceeds 20 expand arrays
+                                # If the number of values exceeds 20 expand
+                                # arrays
                                 if j101 > self.Gps2.vtg_delta_time.shape[1] - 1:
                                     self.Gps2.vtg_expand(n_ensembles)
 
                                 self.Gps2.vtg_delta_time[i_ens, j101] = delta_time
-                                self.Gps2.vtg_header[i_ens][j101] = ''.join([chr(x) for x in f.read(10)])
-                                self.Gps2.course_true[i_ens, j101] = np.fromfile(f, np.float32, count=1)[0]
-                                self.Gps2.true_indicator[i_ens][j101] = chr(f.read(1)[0])
-                                self.Gps2.course_mag[i_ens, j101] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.vtg_header[i_ens][j101] = "".join(
+                                    [chr(x) for x in f.read(10)]
+                                )
+                                self.Gps2.course_true[i_ens, j101] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
+                                self.Gps2.true_indicator[i_ens][j101] = chr(
+                                    f.read(1)[0]
+                                )
+                                self.Gps2.course_mag[i_ens, j101] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.mag_indicator[i_ens][j101] = chr(f.read(1)[0])
-                                self.Gps2.speed_knots[i_ens, j101] = np.fromfile(f, np.float32, count=1)[0]
-                                self.Gps2.knots_indicator[i_ens][j101] = chr(f.read(1)[0])
-                                self.Gps2.speed_kph[i_ens, j101] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.speed_knots[i_ens, j101] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
+                                self.Gps2.knots_indicator[i_ens][j101] = chr(
+                                    f.read(1)[0]
+                                )
+                                self.Gps2.speed_kph[i_ens, j101] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.kph_indicator[i_ens][j101] = chr(f.read(1)[0])
-                                self.Gps2.mode_indicator[i_ens][j101] = chr(f.read(1)[0])
+                                self.Gps2.mode_indicator[i_ens][j101] = chr(
+                                    f.read(1)[0]
+                                )
 
                             # Depth sounder
                             elif specific_id == 102:
@@ -760,13 +1041,23 @@ class Pd0TRDI(object):
                                     self.Gps2.dbt_expand(n_ensembles)
 
                                 self.Gps2.dbt_delta_time[i_ens, j102] = delta_time
-                                self.Gps2.dbt_header[i_ens][j102] = ''.join([chr(x) for x in f.read(10)])
-                                self.Gps2.depth_ft[i_ens, j102] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.dbt_header[i_ens][j102] = "".join(
+                                    [chr(x) for x in f.read(10)]
+                                )
+                                self.Gps2.depth_ft[i_ens, j102] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.ft_indicator[i_ens][j102] = chr(f.read(1)[0])
-                                self.Gps2.depth_m[i_ens, j102] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.depth_m[i_ens, j102] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.m_indicator[i_ens][j102] = chr(f.read(1)[0])
-                                self.Gps2.depth_fath[i_ens, j102] = np.fromfile(f, np.float32, count=1)[0]
-                                self.Gps2.fath_indicator[i_ens][j102] = chr(f.read(1)[0])
+                                self.Gps2.depth_fath[i_ens, j102] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
+                                self.Gps2.fath_indicator[i_ens][j102] = chr(
+                                    f.read(1)[0]
+                                )
 
                             # External heading
                             elif specific_id == 103:
@@ -776,9 +1067,15 @@ class Pd0TRDI(object):
                                     self.Gps2.hdt_expand(n_ensembles)
 
                                 self.Gps2.hdt_delta_time[i_ens, j103] = delta_time
-                                self.Gps2.hdt_header[i_ens][j103] = ''.join([chr(x) for x in f.read(10)])
-                                self.Gps2.heading_deg[i_ens, j103] = np.fromfile(f, np.double, count=1)[0]
-                                self.Gps2.h_true_indicator[i_ens][j103] = chr(f.read(1)[0])
+                                self.Gps2.hdt_header[i_ens][j103] = "".join(
+                                    [chr(x) for x in f.read(10)]
+                                )
+                                self.Gps2.heading_deg[i_ens, j103] = np.fromfile(
+                                    f, np.double, count=1
+                                )[0]
+                                self.Gps2.h_true_indicator[i_ens][j103] = chr(
+                                    f.read(1)[0]
+                                )
 
                             # GGA
                             elif specific_id == 104:
@@ -789,30 +1086,51 @@ class Pd0TRDI(object):
 
                                 self.Gps2.gga_delta_time[i_ens, j100] = delta_time
                                 try:
-                                    self.Gps2.gga_header[i_ens][j100] = ''.join([chr(x) for x in f.read(7)])
+                                    self.Gps2.gga_header[i_ens][j100] = "".join(
+                                        [chr(x) for x in f.read(7)]
+                                    )
                                 except IndexError:
-                                    self.Gps2.gga_header[i_ens][j100] = '       '
+                                    self.Gps2.gga_header[i_ens][j100] = "       "
 
                                 try:
-                                    temp = ''.join([chr(x) for x in f.read(10)])
-                                    self.Gps2.utc[i_ens, j100] = \
-                                        float(re.findall('^\d+\.\d+|\d+', temp)[0])
+                                    temp = "".join([chr(x) for x in f.read(10)])
+                                    self.Gps2.utc[i_ens, j100] = float(
+                                        re.findall("^\d+\.\d+|\d+", temp)[0]
+                                    )
                                 except (ValueError, AttributeError, IndexError):
                                     self.Gps2.utc[i_ens, j100] = np.nan
 
-                                self.Gps2.lat_deg[i_ens, j100] = np.fromfile(f, np.float64, count=1)[0]
+                                self.Gps2.lat_deg[i_ens, j100] = np.fromfile(
+                                    f, np.float64, count=1
+                                )[0]
                                 self.Gps2.lat_ref[i_ens][j100] = chr(f.read(1)[0])
-                                self.Gps2.lon_deg[i_ens, j100] = np.fromfile(f, np.float64, count=1)[0]
+                                self.Gps2.lon_deg[i_ens, j100] = np.fromfile(
+                                    f, np.float64, count=1
+                                )[0]
                                 self.Gps2.lon_ref[i_ens][j100] = chr(f.read(1)[0])
-                                self.Gps2.corr_qual[i_ens, j100] = np.fromfile(f, np.uint8, count=1)[0]
-                                self.Gps2.num_sats[i_ens, j100] = np.fromfile(f, np.uint8, count=1)[0]
-                                self.Gps2.hdop[i_ens, j100] = np.fromfile(f, np.float32, count=1)[0]
-                                self.Gps2.alt[i_ens, j100] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.corr_qual[i_ens, j100] = np.fromfile(
+                                    f, np.uint8, count=1
+                                )[0]
+                                self.Gps2.num_sats[i_ens, j100] = np.fromfile(
+                                    f, np.uint8, count=1
+                                )[0]
+                                self.Gps2.hdop[i_ens, j100] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
+                                self.Gps2.alt[i_ens, j100] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.alt_unit[i_ens][j100] = chr(f.read(1)[0])
-                                self.Gps2.geoid[i_ens, j100] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.geoid[i_ens, j100] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.geoid_unit[i_ens][j100] = chr(f.read(1)[0])
-                                self.Gps2.d_gps_age[i_ens, j100] = np.fromfile(f, np.float32, count=1)[0]
-                                self.Gps2.ref_stat_id[i_ens, j100] = np.fromfile(f, np.int16, count=1)[0]
+                                self.Gps2.d_gps_age[i_ens, j100] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
+                                self.Gps2.ref_stat_id[i_ens, j100] = np.fromfile(
+                                    f, np.int16, count=1
+                                )[0]
 
                             # VTG
                             elif specific_id == 105:
@@ -822,16 +1140,32 @@ class Pd0TRDI(object):
                                     self.Gps2.vtg_expand(n_ensembles)
 
                                 self.Gps2.vtg_delta_time[i_ens, j101] = delta_time
-                                self.Gps2.vtg_header[i_ens][j101] = ''.join([chr(x) for x in f.read(7)])
-                                self.Gps2.course_true[i_ens, j101] = np.fromfile(f, np.float32, count=1)[0]
-                                self.Gps2.true_indicator[i_ens][j101] = chr(f.read(1)[0])
-                                self.Gps2.course_mag[i_ens, j101] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.vtg_header[i_ens][j101] = "".join(
+                                    [chr(x) for x in f.read(7)]
+                                )
+                                self.Gps2.course_true[i_ens, j101] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
+                                self.Gps2.true_indicator[i_ens][j101] = chr(
+                                    f.read(1)[0]
+                                )
+                                self.Gps2.course_mag[i_ens, j101] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.mag_indicator[i_ens][j101] = chr(f.read(1)[0])
-                                self.Gps2.speed_knots[i_ens, j101] = np.fromfile(f, np.float32, count=1)[0]
-                                self.Gps2.knots_indicator[i_ens][j101] = chr(f.read(1)[0])
-                                self.Gps2.speed_kph[i_ens, j101] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.speed_knots[i_ens, j101] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
+                                self.Gps2.knots_indicator[i_ens][j101] = chr(
+                                    f.read(1)[0]
+                                )
+                                self.Gps2.speed_kph[i_ens, j101] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.kph_indicator[i_ens][j101] = chr(f.read(1)[0])
-                                self.Gps2.mode_indicator[i_ens][j101] = chr(f.read(1)[0])
+                                self.Gps2.mode_indicator[i_ens][j101] = chr(
+                                    f.read(1)[0]
+                                )
 
                             # Depth sounder
                             elif specific_id == 106:
@@ -841,13 +1175,23 @@ class Pd0TRDI(object):
                                     self.Gps2.dbt_expand(n_ensembles)
 
                                 self.Gps2.dbt_delta_time[i_ens, j102] = delta_time
-                                self.Gps2.dbt_header[i_ens][j102] = ''.join([chr(x) for x in f.read(7)])
-                                self.Gps2.depth_ft[i_ens, j102] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.dbt_header[i_ens][j102] = "".join(
+                                    [chr(x) for x in f.read(7)]
+                                )
+                                self.Gps2.depth_ft[i_ens, j102] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.ft_indicator[i_ens][j102] = chr(f.read(1)[0])
-                                self.Gps2.depth_m[i_ens, j102] = np.fromfile(f, np.float32, count=1)[0]
+                                self.Gps2.depth_m[i_ens, j102] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
                                 self.Gps2.m_indicator[i_ens][j102] = chr(f.read(1)[0])
-                                self.Gps2.depth_fath[i_ens, j102] = np.fromfile(f, np.float32, count=1)[0]
-                                self.Gps2.fath_indicator[i_ens][j102] = chr(f.read(1)[0])
+                                self.Gps2.depth_fath[i_ens, j102] = np.fromfile(
+                                    f, np.float32, count=1
+                                )[0]
+                                self.Gps2.fath_indicator[i_ens][j102] = chr(
+                                    f.read(1)[0]
+                                )
 
                             # External heading
                             elif specific_id == 107:
@@ -857,9 +1201,15 @@ class Pd0TRDI(object):
                                     self.Gps2.hdt_expand(n_ensembles)
 
                                 self.Gps2.hdt_delta_time[i_ens, j103] = delta_time
-                                self.Gps2.hdt_header[i_ens][j103] = ''.join([chr(x) for x in f.read(7)])
-                                self.Gps2.heading_deg[i_ens, j103] = np.fromfile(f, np.double, count=1)[0]
-                                self.Gps2.h_true_indicator[i_ens][j103] = chr(f.read(1)[0])
+                                self.Gps2.hdt_header[i_ens][j103] = "".join(
+                                    [chr(x) for x in f.read(7)]
+                                )
+                                self.Gps2.heading_deg[i_ens, j103] = np.fromfile(
+                                    f, np.double, count=1
+                                )[0]
+                                self.Gps2.h_true_indicator[i_ens][j103] = chr(
+                                    f.read(1)[0]
+                                )
 
                             # GGA
                             elif specific_id == 204:
@@ -868,10 +1218,10 @@ class Pd0TRDI(object):
                                 if j100 > self.Gps2.gga_delta_time.shape[1] - 1:
                                     self.Gps2.gga_expand(n_ensembles)
 
-                                temp = ''.join([chr(x) for x in f.read(msg_size)])
+                                temp = "".join([chr(x) for x in f.read(msg_size)])
                                 self.Gps2.gga_sentence[i_ens][j100] = temp
-                                temp_array = np.array(temp.split(','))
-                                temp_array[temp_array == '999.9'] = ''
+                                temp_array = np.array(temp.split(","))
+                                temp_array[temp_array == "999.9"] = ""
 
                                 try:
                                     self.Gps2.gga_delta_time[i_ens, j100] = delta_time
@@ -879,25 +1229,36 @@ class Pd0TRDI(object):
                                     self.Gps2.utc[i_ens, j100] = float(temp_array[1])
                                     lat_str = temp_array[2]
                                     lat_deg = float(lat_str[0:2])
-                                    lat_deg = lat_deg+float(lat_str[2:]) / 60
+                                    lat_deg = lat_deg + float(lat_str[2:]) / 60
                                     self.Gps2.lat_deg[i_ens, j100] = lat_deg
                                     self.Gps2.lat_ref[i_ens][j100] = temp_array[3]
                                     lon_str = temp_array[4]
                                     lon_num = float(lon_str)
                                     lon_deg = np.floor(lon_num / 100)
-                                    lon_deg = lon_deg + (((lon_num / 100.) - lon_deg) * 100.) / 60.
+                                    lon_deg = (
+                                        lon_deg
+                                        + (((lon_num / 100.0) - lon_deg) * 100.0) / 60.0
+                                    )
                                     self.Gps2.lon_deg[i_ens, j100] = lon_deg
                                     self.Gps2.lon_ref[i_ens][j100] = temp_array[5]
-                                    self.Gps2.corr_qual[i_ens, j100] = float(temp_array[6])
-                                    self.Gps2.num_sats[i_ens, j100] = float(temp_array[7])
+                                    self.Gps2.corr_qual[i_ens, j100] = float(
+                                        temp_array[6]
+                                    )
+                                    self.Gps2.num_sats[i_ens, j100] = float(
+                                        temp_array[7]
+                                    )
                                     self.Gps2.hdop[i_ens, j100] = float(temp_array[8])
                                     self.Gps2.alt[i_ens, j100] = float(temp_array[9])
                                     self.Gps2.alt_unit[i_ens][j100] = temp_array[10]
                                     self.Gps2.geoid[i_ens, j100] = temp_array[11]
                                     self.Gps2.geoid_unit[i_ens][j100] = temp_array[12]
-                                    self.Gps2.d_gps_age[i_ens, j100] = float(temp_array[13])
-                                    idx_star = temp_array[14].find('*')
-                                    self.Gps2.ref_stat_id[i_ens, j100] = float(temp_array[15][:idx_star])
+                                    self.Gps2.d_gps_age[i_ens, j100] = float(
+                                        temp_array[13]
+                                    )
+                                    idx_star = temp_array[14].find("*")
+                                    self.Gps2.ref_stat_id[i_ens, j100] = float(
+                                        temp_array[15][:idx_star]
+                                    )
 
                                 except (ValueError, EOFError, IndexError):
                                     pass
@@ -909,24 +1270,38 @@ class Pd0TRDI(object):
                                 if j101 > self.Gps2.vtg_delta_time.shape[1] - 1:
                                     self.Gps2.vtg_expand(n_ensembles)
 
-                                temp = ''.join([chr(x) for x in f.read(msg_size)])
+                                temp = "".join([chr(x) for x in f.read(msg_size)])
                                 self.Gps2.vtg_sentence[i_ens][j100] = temp
-                                temp_array = np.array(temp.split(','))
-                                temp_array[temp_array == '999.9'] = ''
+                                temp_array = np.array(temp.split(","))
+                                temp_array[temp_array == "999.9"] = ""
 
                                 try:
                                     self.Gps2.vtg_delta_time[i_ens, j101] = delta_time
                                     self.Gps2.vtg_header[i_ens][j101] = temp_array[0]
-                                    self.Gps2.course_true[i_ens, j101] = valid_number(temp_array[1])
-                                    self.Gps2.true_indicator[i_ens][j101] = temp_array[2]
-                                    self.Gps2.course_mag[i_ens, j101] = valid_number(temp_array[3])
+                                    self.Gps2.course_true[i_ens, j101] = valid_number(
+                                        temp_array[1]
+                                    )
+                                    self.Gps2.true_indicator[i_ens][j101] = temp_array[
+                                        2
+                                    ]
+                                    self.Gps2.course_mag[i_ens, j101] = valid_number(
+                                        temp_array[3]
+                                    )
                                     self.Gps2.mag_indicator[i_ens][j101] = temp_array[4]
-                                    self.Gps2.speed_knots[i_ens, j101] = valid_number(temp_array[5])
-                                    self.Gps2.knots_indicator[i_ens][j101] = temp_array[6]
-                                    self.Gps2.speed_kph[i_ens, j101] = valid_number(temp_array[7])
+                                    self.Gps2.speed_knots[i_ens, j101] = valid_number(
+                                        temp_array[5]
+                                    )
+                                    self.Gps2.knots_indicator[i_ens][j101] = temp_array[
+                                        6
+                                    ]
+                                    self.Gps2.speed_kph[i_ens, j101] = valid_number(
+                                        temp_array[7]
+                                    )
                                     self.Gps2.kph_indicator[i_ens][j101] = temp_array[8]
-                                    idx_star = temp_array[9].find('*')
-                                    self.Gps2.mode_indicator[i_ens][j101] = temp_array[9][:idx_star]
+                                    idx_star = temp_array[9].find("*")
+                                    self.Gps2.mode_indicator[i_ens][j101] = temp_array[
+                                        9
+                                    ][:idx_star]
 
                                 except (ValueError, EOFError, IndexError):
                                     pass
@@ -938,20 +1313,28 @@ class Pd0TRDI(object):
                                 if j102 > self.Gps2.dbt_delta_time.shape[1] - 1:
                                     self.Gps2.dbt_expand(n_ensembles)
 
-                                temp = ''.join([chr(x) for x in f.read(msg_size)])
-                                temp_array = np.array(temp.split(','))
-                                temp_array[temp_array == '999.9'] = ''
+                                temp = "".join([chr(x) for x in f.read(msg_size)])
+                                temp_array = np.array(temp.split(","))
+                                temp_array[temp_array == "999.9"] = ""
 
                                 try:
                                     self.Gps2.dbt_delta_time[i_ens, j102] = delta_time
                                     self.Gps2.dbt_header[i_ens][j102] = temp_array[0]
-                                    self.Gps2.depth_ft[i_ens, j102] = float(temp_array[1])
+                                    self.Gps2.depth_ft[i_ens, j102] = float(
+                                        temp_array[1]
+                                    )
                                     self.Gps2.ft_indicator[i_ens][j102] = temp_array[2]
-                                    self.Gps2.depth_m[i_ens, j102] = float(temp_array[3])
+                                    self.Gps2.depth_m[i_ens, j102] = float(
+                                        temp_array[3]
+                                    )
                                     self.Gps2.m_indicator[i_ens][j102] = temp_array[4]
-                                    self.Gps2.depth_fath[i_ens, j102] = float(temp_array[5])
-                                    idx_star = temp.find('*')
-                                    self.Gps2.fath_indicator[i_ens][j102] = temp_array[6][:idx_star]
+                                    self.Gps2.depth_fath[i_ens, j102] = float(
+                                        temp_array[5]
+                                    )
+                                    idx_star = temp.find("*")
+                                    self.Gps2.fath_indicator[i_ens][j102] = temp_array[
+                                        6
+                                    ][:idx_star]
 
                                 except (ValueError, EOFError, IndexError):
                                     pass
@@ -963,274 +1346,544 @@ class Pd0TRDI(object):
                                 if j103 > self.Gps2.hdt_delta_time.shape[1] - 1:
                                     self.Gps2.hdt_expand(n_ensembles)
 
-                                temp = ''.join([chr(x) for x in f.read(msg_size)])
-                                temp_array = np.array(temp.split(','))
-                                temp_array[temp_array == '999.9'] = ''
+                                temp = "".join([chr(x) for x in f.read(msg_size)])
+                                temp_array = np.array(temp.split(","))
+                                temp_array[temp_array == "999.9"] = ""
 
                                 try:
                                     self.Gps2.hdt_delta_time[i_ens, j103] = delta_time
                                     self.Gps2.hdt_header[i_ens][j103] = temp_array[0]
-                                    self.Gps2.heading_deg[i_ens, j103] = float(temp_array[1])
-                                    idx_star = temp.find('*')
-                                    self.Gps2.h_true_indicator[i_ens][j103] = temp_array[2][:idx_star]
+                                    self.Gps2.heading_deg[i_ens, j103] = float(
+                                        temp_array[1]
+                                    )
+                                    idx_star = temp.find("*")
+                                    self.Gps2.h_true_indicator[i_ens][
+                                        j103
+                                    ] = temp_array[2][:idx_star]
 
                                 except (ValueError, EOFError, IndexError):
                                     pass
 
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Raw NMEA dbt sentence
-                        elif leader_id == '0x2100':
+                        elif leader_id == "0x2100":
 
                             # Update data types counter
                             i_data_types += 1
 
                             # Reposition file pointer
-                            f.seek(int(self.Hdr.data_offsets[i_ens, i_data_types-1])+file_loc+4, 0)
+                            f.seek(
+                                int(self.Hdr.data_offsets[i_ens, i_data_types - 1])
+                                + file_loc
+                                + 4,
+                                0,
+                            )
 
                             # Determine the number of characters to read
                             if i_data_types < self.Hdr.n_data_types[i_ens]:
-                                num_2_read = self.Hdr.data_offsets[i_ens, i_data_types] \
-                                             - self.Hdr.data_offsets[i_ens, i_data_types - 1] - 4
+                                num_2_read = (
+                                    self.Hdr.data_offsets[i_ens, i_data_types]
+                                    - self.Hdr.data_offsets[i_ens, i_data_types - 1]
+                                    - 4
+                                )
                             else:
-                                num_2_read = bytes_per_ens - self.Hdr.data_offsets[i_ens, i_data_types-1] - 6
+                                num_2_read = (
+                                    bytes_per_ens
+                                    - self.Hdr.data_offsets[i_ens, i_data_types - 1]
+                                    - 6
+                                )
 
                             # Read DBT sentence
-                            self.Nmea.dbt[i_ens] = ''.join([chr(x) for x in f.read(int(num_2_read))])
+                            self.Nmea.dbt[i_ens] = "".join(
+                                [chr(x) for x in f.read(int(num_2_read))]
+                            )
 
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Raw NMEA gga sentence
-                        elif leader_id == '0x2101':
+                        elif leader_id == "0x2101":
                             # Update data types counter
                             i_data_types += 1
 
                             # Reposition file pointer
-                            f.seek(int(self.Hdr.data_offsets[i_ens, i_data_types-1])+file_loc+4, 0)
+                            f.seek(
+                                int(self.Hdr.data_offsets[i_ens, i_data_types - 1])
+                                + file_loc
+                                + 4,
+                                0,
+                            )
 
                             # Determine the number of characters to read
                             if i_data_types < self.Hdr.n_data_types[i_ens]:
-                                num_2_read = self.Hdr.data_offsets[i_ens, i_data_types] \
-                                             - self.Hdr.data_offsets[i_ens, i_data_types - 1] - 4
+                                num_2_read = (
+                                    self.Hdr.data_offsets[i_ens, i_data_types]
+                                    - self.Hdr.data_offsets[i_ens, i_data_types - 1]
+                                    - 4
+                                )
                             else:
-                                num_2_read = bytes_per_ens - self.Hdr.data_offsets[i_ens, i_data_types-1] - 6
+                                num_2_read = (
+                                    bytes_per_ens
+                                    - self.Hdr.data_offsets[i_ens, i_data_types - 1]
+                                    - 6
+                                )
 
                             # Read GGA sentence
-                            self.Nmea.gga[i_ens] = ''.join([chr(x) for x in f.read(int(num_2_read))])
+                            self.Nmea.gga[i_ens] = "".join(
+                                [chr(x) for x in f.read(int(num_2_read))]
+                            )
 
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Raw NMEA vtg sentence
-                        elif leader_id == '0x2102':
+                        elif leader_id == "0x2102":
                             # Update data types counter
                             i_data_types += 1
 
                             # Reposition file pointer
-                            f.seek(int(self.Hdr.data_offsets[i_ens, i_data_types-1])+file_loc+4, 0)
+                            f.seek(
+                                int(self.Hdr.data_offsets[i_ens, i_data_types - 1])
+                                + file_loc
+                                + 4,
+                                0,
+                            )
 
                             # Determine the number of characters to read
                             if i_data_types < self.Hdr.n_data_types[i_ens]:
-                                num_2_read = self.Hdr.data_offsets[i_ens, i_data_types] \
-                                             - self.Hdr.data_offsets[i_ens, i_data_types - 1] - 4
+                                num_2_read = (
+                                    self.Hdr.data_offsets[i_ens, i_data_types]
+                                    - self.Hdr.data_offsets[i_ens, i_data_types - 1]
+                                    - 4
+                                )
                             else:
-                                num_2_read = bytes_per_ens - self.Hdr.data_offsets[i_ens, i_data_types-1] - 6
+                                num_2_read = (
+                                    bytes_per_ens
+                                    - self.Hdr.data_offsets[i_ens, i_data_types - 1]
+                                    - 6
+                                )
 
                             # Read VTG sentence
-                            self.Nmea.vtg[i_ens] = ''.join([chr(x) for x in f.read(int(num_2_read))])
+                            self.Nmea.vtg[i_ens] = "".join(
+                                [chr(x) for x in f.read(int(num_2_read))]
+                            )
 
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Raw NMEA gsa sentence
-                        elif leader_id == '0x2103':
+                        elif leader_id == "0x2103":
                             # Update data types counter
                             i_data_types += 1
 
                             # Reposition file pointer
-                            f.seek(int(self.Hdr.data_offsets[i_ens, i_data_types-1])+file_loc+4, 0)
+                            f.seek(
+                                int(self.Hdr.data_offsets[i_ens, i_data_types - 1])
+                                + file_loc
+                                + 4,
+                                0,
+                            )
 
                             # Determine the number of characters to read
                             if i_data_types < self.Hdr.n_data_types[i_ens]:
-                                num_2_read = self.Hdr.data_offsets[i_ens, i_data_types] \
-                                             - self.Hdr.data_offsets[i_ens, i_data_types - 1] - 4
+                                num_2_read = (
+                                    self.Hdr.data_offsets[i_ens, i_data_types]
+                                    - self.Hdr.data_offsets[i_ens, i_data_types - 1]
+                                    - 4
+                                )
                             else:
-                                num_2_read = bytes_per_ens - self.Hdr.data_offsets[i_ens, i_data_types-1] - 6
+                                num_2_read = (
+                                    bytes_per_ens
+                                    - self.Hdr.data_offsets[i_ens, i_data_types - 1]
+                                    - 6
+                                )
 
                             # Read GSA sentence
-                            self.Nmea.gsa[i_ens] = ''.join([chr(x) for x in f.read(int(num_2_read))])
+                            self.Nmea.gsa[i_ens] = "".join(
+                                [chr(x) for x in f.read(int(num_2_read))]
+                            )
 
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Surface cells: cell data
-                        elif leader_id == '0x10':
+                        elif leader_id == "0x10":
                             # Update data types counter
                             i_data_types += 1
 
-                            self.Surface.no_cells[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Surface.cell_size_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.Surface.dist_bin1_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            self.Surface.no_cells[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Surface.cell_size_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.Surface.dist_bin1_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Surface cells: velocity data
-                        elif leader_id == '0x110':
+                        elif leader_id == "0x110":
                             # Update data types counter
                             i_data_types += 1
 
-                            dummy = np.fromfile(f, np.int16, count=int((self.Surface.no_cells[i_ens]*4)))
-                            dummy = np.reshape(dummy, [int(self.Surface.no_cells[i_ens]), n_velocities])
-                            self.Surface.vel_mps[:n_velocities, :int(self.Surface.no_cells[i_ens]), i_ens] = dummy.T
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            dummy = np.fromfile(
+                                f,
+                                np.int16,
+                                count=int((self.Surface.no_cells[i_ens] * 4)),
+                            )
+                            dummy = np.reshape(
+                                dummy, [int(self.Surface.no_cells[i_ens]), n_velocities]
+                            )
+                            self.Surface.vel_mps[
+                                :n_velocities,
+                                : int(self.Surface.no_cells[i_ens]),
+                                i_ens,
+                            ] = dummy.T
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Surface cells: correlation magnitude
-                        elif leader_id == '0x210':
+                        elif leader_id == "0x210":
                             # Update data types counter
                             i_data_types += 1
 
-                            dummy = np.fromfile(f, np.uint8, count=int((self.Surface.no_cells[i_ens]*4)))
-                            dummy = np.reshape(dummy, [int(self.Surface.no_cells[i_ens]), n_velocities])
-                            self.Surface.corr[:n_velocities, :int(self.Surface.no_cells[i_ens]), i_ens] = dummy.T
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            dummy = np.fromfile(
+                                f,
+                                np.uint8,
+                                count=int((self.Surface.no_cells[i_ens] * 4)),
+                            )
+                            dummy = np.reshape(
+                                dummy, [int(self.Surface.no_cells[i_ens]), n_velocities]
+                            )
+                            self.Surface.corr[
+                                :n_velocities,
+                                : int(self.Surface.no_cells[i_ens]),
+                                i_ens,
+                            ] = dummy.T
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Surface cells: echo intensity
-                        elif leader_id == '0x310':
+                        elif leader_id == "0x310":
                             # Update data types counter
                             i_data_types += 1
 
-                            dummy = np.fromfile(f, np.uint8, count=int((self.Surface.no_cells[i_ens]*4)))
-                            dummy = np.reshape(dummy, [int(self.Surface.no_cells[i_ens]), n_velocities])
-                            self.Surface.rssi[:n_velocities, :int(self.Surface.no_cells[i_ens]), i_ens] = dummy.T
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            dummy = np.fromfile(
+                                f,
+                                np.uint8,
+                                count=int((self.Surface.no_cells[i_ens] * 4)),
+                            )
+                            dummy = np.reshape(
+                                dummy, [int(self.Surface.no_cells[i_ens]), n_velocities]
+                            )
+                            self.Surface.rssi[
+                                :n_velocities,
+                                : int(self.Surface.no_cells[i_ens]),
+                                i_ens,
+                            ] = dummy.T
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Surface cells: percent good
-                        elif leader_id == '0x410':
+                        elif leader_id == "0x410":
                             # Update data types counter
                             i_data_types += 1
 
-                            dummy = np.fromfile(f, np.uint8, count=int((self.Surface.no_cells[i_ens]*4)))
-                            dummy = np.reshape(dummy, [int(self.Surface.no_cells[i_ens]), n_velocities])
-                            self.Surface.pergd[:n_velocities, :self.Surface.no_cells[i_ens], i_ens] = dummy.T
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            dummy = np.fromfile(
+                                f,
+                                np.uint8,
+                                count=int((self.Surface.no_cells[i_ens] * 4)),
+                            )
+                            dummy = np.reshape(
+                                dummy, [int(self.Surface.no_cells[i_ens]), n_velocities]
+                            )
+                            self.Surface.pergd[
+                                :n_velocities, : self.Surface.no_cells[i_ens], i_ens
+                            ] = dummy.T
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Undefined data skipped
-                        elif leader_id == '0x510':
+                        elif leader_id == "0x510":
                             # Update data types counter
                             i_data_types += 1
 
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         #  Automatic mode configuration
-                        elif leader_id == '0x4401':
+                        elif leader_id == "0x4401":
                             # Update data types counter
                             i_data_types += 1
 
-                            self.AutoMode.beam_count[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-
-                            self.AutoMode.Beam1.mode[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam1.depth_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam1.ping_count[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam1.ping_type[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam1.cell_count[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam1.cell_size_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam1.cell_mid_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam1.code_repeat[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam1.trans_length_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam1.lag_length_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam1.transmit_bw[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam1.receive_bw[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam1.ping_interval_ms[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-
-                            self.AutoMode.Beam2.mode[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam2.depth_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam2.ping_count[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam2.ping_type[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam2.cell_count[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam2.cell_size_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam2.cell_mid_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam2.code_repeat[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam2.trans_length_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam2.lag_length_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam2.transmit_bw[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam2.receive_bw[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam2.ping_interval_ms[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-
-                            self.AutoMode.Beam3.mode[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam3.depth_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam3.ping_count[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam3.ping_type[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam3.cell_count[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam3.cell_size_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam3.cell_mid_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam3.code_repeat[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam3.trans_length_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam3.lag_length_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam3.transmit_bw[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam3.receive_bw[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam3.ping_interval_ms[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-
-                            self.AutoMode.Beam4.mode[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam4.depth_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam4.ping_count[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam4.ping_type[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam4.cell_count[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam4.cell_size_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam4.cell_mid_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam4.code_repeat[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam4.trans_length_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam4.lag_length_cm[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-                            self.AutoMode.Beam4.transmit_bw[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam4.receive_bw[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.AutoMode.Beam4.ping_interval_ms[i_ens] = np.fromfile(f, np.uint16, count=1)[0]
-
-                            self.AutoMode.Reserved[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            self.AutoMode.beam_count[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+
+                            self.AutoMode.Beam1.mode[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam1.depth_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam1.ping_count[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam1.ping_type[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam1.cell_count[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam1.cell_size_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam1.cell_mid_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam1.code_repeat[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam1.trans_length_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam1.lag_length_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam1.transmit_bw[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam1.receive_bw[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam1.ping_interval_ms[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+
+                            self.AutoMode.Beam2.mode[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam2.depth_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam2.ping_count[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam2.ping_type[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam2.cell_count[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam2.cell_size_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam2.cell_mid_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam2.code_repeat[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam2.trans_length_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam2.lag_length_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam2.transmit_bw[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam2.receive_bw[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam2.ping_interval_ms[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+
+                            self.AutoMode.Beam3.mode[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam3.depth_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam3.ping_count[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam3.ping_type[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam3.cell_count[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam3.cell_size_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam3.cell_mid_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam3.code_repeat[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam3.trans_length_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam3.lag_length_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam3.transmit_bw[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam3.receive_bw[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam3.ping_interval_ms[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+
+                            self.AutoMode.Beam4.mode[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam4.depth_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam4.ping_count[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam4.ping_type[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam4.cell_count[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam4.cell_size_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam4.cell_mid_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam4.code_repeat[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam4.trans_length_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam4.lag_length_cm[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+                            self.AutoMode.Beam4.transmit_bw[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam4.receive_bw[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.AutoMode.Beam4.ping_interval_ms[i_ens] = np.fromfile(
+                                f, np.uint16, count=1
+                            )[0]
+
+                            self.AutoMode.Reserved[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Vertical beam
-                        elif leader_id == '0x4100':
+                        elif leader_id == "0x4100":
                             # Update data types counter
                             i_data_types += 1
 
-                            self.Sensor.vert_beam_eval_amp[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.vert_beam_RSSI_amp[i_ens] = np.fromfile(f, np.uint8, count=1)[0]
-                            self.Sensor.vert_beam_range_m[i_ens] = np.fromfile(f, np.uint32, count=1)[0] / 1000
-                            temp = "{0:08b}".format(np.fromfile(f, np.uint8, count=1)[0])
+                            self.Sensor.vert_beam_eval_amp[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.vert_beam_RSSI_amp[i_ens] = np.fromfile(
+                                f, np.uint8, count=1
+                            )[0]
+                            self.Sensor.vert_beam_range_m[i_ens] = (
+                                np.fromfile(f, np.uint32, count=1)[0] / 1000
+                            )
+                            temp = "{0:08b}".format(
+                                np.fromfile(f, np.uint8, count=1)[0]
+                            )
                             self.Sensor.vert_beam_status[i_ens] = int(temp[6:], 2)
-                            if temp[5] == '0':
-                                self.Sensor.vert_beam_gain[i_ens] = 'L'
+                            if temp[5] == "0":
+                                self.Sensor.vert_beam_gain[i_ens] = "L"
                             else:
-                                self.Sensor.vert_beam_gain[i_ens] = 'H'
+                                self.Sensor.vert_beam_gain[i_ens] = "H"
 
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         # Transformation matrix
-                        elif leader_id == '0x3200':
+                        elif leader_id == "0x3200":
                             # Update data types counter
                             i_data_types += 1
 
-                            self.Inst.t_matrix[0, :] = np.fromfile(f, np.int16, count=4) * .0001
-                            self.Inst.t_matrix[1, :] = np.fromfile(f, np.int16, count=4) * .0001
-                            self.Inst.t_matrix[2, :] = np.fromfile(f, np.int16, count=4) * .0001
-                            self.Inst.t_matrix[3, :] = np.fromfile(f, np.int16, count=4) * .0001
-
-                            # Check if more data types need to be read and position the pointer
-                            self.end_reading(f, file_loc, i_data_types, i_ens, bytes_per_ens)
+                            self.Inst.t_matrix[0, :] = (
+                                np.fromfile(f, np.int16, count=4) * 0.0001
+                            )
+                            self.Inst.t_matrix[1, :] = (
+                                np.fromfile(f, np.int16, count=4) * 0.0001
+                            )
+                            self.Inst.t_matrix[2, :] = (
+                                np.fromfile(f, np.int16, count=4) * 0.0001
+                            )
+                            self.Inst.t_matrix[3, :] = (
+                                np.fromfile(f, np.int16, count=4) * 0.0001
+                            )
+
+                            # Check if more data types need to be read and
+                            # position the pointer
+                            self.end_reading(
+                                f, file_loc, i_data_types, i_ens, bytes_per_ens
+                            )
 
                         else:
 
@@ -1241,33 +1894,51 @@ class Pd0TRDI(object):
                             # Find next leader ID
                             if (i_data_types + 1) <= self.Hdr.n_data_types[i_ens]:
                                 # Reposition file pointer for next data type
-                                f.seek(int(self.Hdr.data_offsets[i_ens, i_data_types])+file_loc, 0)
+                                f.seek(
+                                    int(self.Hdr.data_offsets[i_ens, i_data_types])
+                                    + file_loc,
+                                    0,
+                                )
                             else:
                                 if f.tell() < end_file:
-                                    # Locate next ensemble if no more data types
-                                    if i_data_types + 1 > self.Hdr.n_data_types[i_ens] + 1:
+                                    # Locate next ensemble if no more data
+                                    # types
+                                    if (
+                                        i_data_types + 1
+                                        > self.Hdr.n_data_types[i_ens] + 1
+                                    ):
                                         current_loc = f.tell()
-                                        srch_string = struct.unpack('B'*(end_file-current_loc),
-                                                                    f.read(end_file-current_loc))
-                                        hex_string = ''.join([hex(x) for x in srch_string])
-
-                                        next_ens = hex_string.find('0x7f7f')
+                                        srch_string = struct.unpack(
+                                            "B" * (end_file - current_loc),
+                                            f.read(end_file - current_loc),
+                                        )
+                                        hex_string = "".join(
+                                            [hex(x) for x in srch_string]
+                                        )
+
+                                        next_ens = hex_string.find("0x7f7f")
                                         if next_ens > 0:
                                             next_ens = int((next_ens - 1) / 2)
-                                            f.seek(current_loc+next_ens, 0)
+                                            f.seek(current_loc + next_ens, 0)
                                             i_data_types = 0
                                         else:
                                             end_file_check = end_file + 1
 
                                     else:
-                                        f.seek(file_loc+bytes_per_ens-2, 0)
+                                        f.seek(file_loc + bytes_per_ens - 2, 0)
 
-                        # If all data types have been read, read last two bytes of ensemble
+                        # If all data types have been read, read last two
+                        # bytes of ensemble
                         if i_ens <= len(self.Hdr.n_data_types):
-                            if i_data_types >= self.Hdr.n_data_types[i_ens] and f.tell() <= end_file:
+                            if (
+                                i_data_types >= self.Hdr.n_data_types[i_ens]
+                                and f.tell() <= end_file
+                            ):
 
                                 try:
-                                    self.Inst.res_RDI = np.fromfile(f, np.uint16, count=1)[0]
+                                    self.Inst.res_RDI = np.fromfile(
+                                        f, np.uint16, count=1
+                                    )[0]
                                     # Read checksum but not used
                                     _ = np.fromfile(f, np.uint16, count=1)[0]
                                 except (ValueError, EOFError, IndexError):
@@ -1296,41 +1967,52 @@ class Pd0TRDI(object):
 
                     # Correct Bt.depth_m for RiverRay data
                     if not np.isnan(rr_bt_depth_correction).any():
-                        rr_bt_depth_correction[rr_bt_depth_correction == (-32768 * 2e16) / 100] = np.nan
+                        rr_bt_depth_correction[
+                            rr_bt_depth_correction == (-32768 * 2e16) / 100
+                        ] = np.nan
                         self.Bt.depth_m += rr_bt_depth_correction
 
-                    # Remove bad data from Surface structure (RR), convert where needed
+                    # Remove bad data from Surface structure (RR), convert
+                    # where needed
                     self.Surface.vel_mps[self.Surface.vel_mps == -32768] = np.nan
                     self.Surface.vel_mps = self.Surface.vel_mps / 1000
                     self.Surface.corr[self.Surface.corr == -32768] = np.nan
                     self.Surface.rssi[self.Surface.rssi == -32768] = np.nan
                     self.Surface.pergd[self.Surface.pergd == -32768] = np.nan
 
-                    # If requested compute WR2 compatible GPS-based boat velocities
+                    # If requested compute WR2 compatible GPS-based boat
+                    # velocities
                     if wr2:
 
-                        # If vtg data are available compute north and east components
-                        if self.Gps2.vtg_header[0, 0] == '$':
+                        # If vtg data are available compute north and east
+                        # components
+                        if self.Gps2.vtg_header[0, 0] == "$":
 
-                            # Find minimum of absolute value of delta time from raw data
+                            # Find minimum of absolute value of delta time
+                            # from raw data
                             vtg_delta_time = np.abs(self.Gps2.vtg_delta_time)
                             vtg_min = np.nanmin(vtg_delta_time, 1)
 
                             # Compute the velocity components in m/s
                             for i in range(len(vtg_delta_time)):
                                 idx = np.where(vtg_delta_time == vtg_min)[0][0]
-                                self.Gps2.vtg_velE_mps[i], self.Gps2.vtg_velN_mps[i] = \
-                                    pol2cart((90 - self.Gps2.course_true[i, idx])*np.pi/180,
-                                             self.Gps2.speed_kph[i, idx] * 0.2777778)
+                                (
+                                    self.Gps2.vtg_velE_mps[i],
+                                    self.Gps2.vtg_velN_mps[i],
+                                ) = pol2cart(
+                                    (90 - self.Gps2.course_true[i, idx]) * np.pi / 180,
+                                    self.Gps2.speed_kph[i, idx] * 0.2777778,
+                                )
 
-                        if self.Gps2.gga_header[0, 0] == '$':
+                        if self.Gps2.gga_header[0, 0] == "$":
 
                             # Initialize constants
                             e_radius = 6378137
                             coeff = e_radius * np.pi / 180
                             ellip = 1 / 298.257223563
 
-                            # Find minimum of absolute value of delta time from raw data
+                            # Find minimum of absolute value of delta time
+                            # from raw data
                             gga_delta_time = np.abs(self.Gps2.gga_delta_time)
                             gga_min = np.nanmin(gga_delta_time, axis=1)
 
@@ -1338,15 +2020,35 @@ class Pd0TRDI(object):
                             for i in range(len(gga_delta_time)):
                                 idx = np.where(gga_delta_time[i:] == gga_min)
                                 if idx > 0:
-                                    lat_avg_rad = (self.Gps2.lat_deg[i, idx[i]]
-                                                   + self.Gps2.lat_deg[i - 1, idx[i - 1]]) / 2
+                                    lat_avg_rad = (
+                                        self.Gps2.lat_deg[i, idx[i]]
+                                        + self.Gps2.lat_deg[i - 1, idx[i - 1]]
+                                    ) / 2
                                     sin_lat_avg_rad = np.sin(np.deg2rad(lat_avg_rad))
-                                    r_e = coeff * (1 + ellip * sin_lat_avg_rad * sin_lat_avg_rad)
-                                    rn = coeff * (1 - 2 * ellip + 3 * ellip * sin_lat_avg_rad * sin_lat_avg_rad)
-                                    dx = r_e * (self.Gps2.lon_deg[i, idx[i]] -
-                                                self.Gps2.lon_deg(i-1, idx[i-1])) * np.cos(np.deg2rad(lat_avg_rad))
-                                    dy = rn * (self.Gps2.lat_deg[i, idx[i]] - self.Gps2.lat_deg[i - 1, idx[i - 1]])
-                                    dt = self.Gps2.utc[i, idx[i]] - self.Gps2.utc[i-1, idx[i-1]]
+                                    r_e = coeff * (
+                                        1 + ellip * sin_lat_avg_rad * sin_lat_avg_rad
+                                    )
+                                    rn = coeff * (
+                                        1
+                                        - 2 * ellip
+                                        + 3 * ellip * sin_lat_avg_rad * sin_lat_avg_rad
+                                    )
+                                    dx = (
+                                        r_e
+                                        * (
+                                            self.Gps2.lon_deg[i, idx[i]]
+                                            - self.Gps2.lon_deg(i - 1, idx[i - 1])
+                                        )
+                                        * np.cos(np.deg2rad(lat_avg_rad))
+                                    )
+                                    dy = rn * (
+                                        self.Gps2.lat_deg[i, idx[i]]
+                                        - self.Gps2.lat_deg[i - 1, idx[i - 1]]
+                                    )
+                                    dt = (
+                                        self.Gps2.utc[i, idx[i]]
+                                        - self.Gps2.utc[i - 1, idx[i - 1]]
+                                    )
                                     self.Gps2.gga_velE_mps[i] = dx / dt
                                     self.Gps2.gga_velN_mps[i] = dy / dt
                                 else:
@@ -1371,10 +2073,10 @@ class Pd0TRDI(object):
         """
 
         i = 0
-        leader_id = '0000'
-            
+        leader_id = "0000"
+
         # Find the first ensemble
-        while leader_id != '0x7f7f' and i < f_size:
+        while leader_id != "0x7f7f" and i < f_size:
             f.seek(i, 0)
             i = i + 1
             leader_id = hex(np.fromfile(f, np.uint16, count=1)[0])
@@ -1384,11 +2086,11 @@ class Pd0TRDI(object):
 
         # Find last ensemble
         i = 0
-        leader_id = '0000'
+        leader_id = "0000"
         last_num = -1
-        
+
         while last_num < 0:
-            while leader_id != '0x7f7f' and i < f_size:
+            while leader_id != "0x7f7f" and i < f_size:
                 i = i + 1
                 f.seek(-i, 2)
 
@@ -1400,17 +2102,19 @@ class Pd0TRDI(object):
             last_num = Pd0TRDI.find_ens_no(f)
             if last_num is None or np.isnan(last_num):
                 last_num = -1
-            
-            leader_id = '0000'
-        n_ensembles = last_num-first_num+1
+
+            leader_id = "0000"
+        n_ensembles = last_num - first_num + 1
 
         return n_ensembles
 
     @staticmethod
     def find_ens_no(f):
-        """This function assumes the current position of the file pointer is just
+        """This function assumes the current position of the file pointer is
+        just
             after '7F7F'. The function then reads the ensemble header and
-            works through the data offsets until the 00800 data type is found. The
+            works through the data offsets until the 00800 data type is
+            found. The
             ensemble number is then read.
 
         Parameters
@@ -1431,7 +2135,7 @@ class Pd0TRDI(object):
             if Pd0TRDI.check_sum(f, fileloc):
 
                 # Read header information
-                f.seek(fileloc+5, 0)
+                f.seek(fileloc + 5, 0)
                 n_data_types = np.fromfile(f, np.uint8, count=1)[0]
                 data_offsets = []
                 for x in range(n_data_types):
@@ -1439,17 +2143,16 @@ class Pd0TRDI(object):
 
                 # Initialize variables
                 i = 0
-                leader_id = '0000'
+                leader_id = "0000"
 
                 # Search for 0x80
-                while leader_id != '0x80' and i < n_data_types:
-
-                    f.seek(data_offsets[i]+fileloc, 0)
+                while leader_id != "0x80" and i < n_data_types:
+                    f.seek(data_offsets[i] + fileloc, 0)
                     leader_id = hex(np.fromfile(f, np.uint16, count=1)[0])
                     i = i + 1
-                    
+
                 # Read ensemble number from data type 0x80
-                if leader_id == '0x80':
+                if leader_id == "0x80":
                     ensemble_num = np.fromfile(f, np.uint16, count=1)[0]
 
             else:
@@ -1478,42 +2181,43 @@ class Pd0TRDI(object):
         """
 
         try:
-             
+
             if bytes_per_ens is None:
-                bytes_per_ens = np.fromfile(f, np.uint16, count=1)[0] 
-            # Go to file location from the beginning of file
+                bytes_per_ens = np.fromfile(f, np.uint16, count=1)[0]
+                # Go to file location from the beginning of file
             f.seek(fileloc, 0)
-              
+
             # Read in the values for all of the bytes an get a check sum
             test_b = []
             x = f.read(bytes_per_ens)
             for y in x:
                 test_b.append(y)
-                  
+
             check_sum = sum(test_b)
             check_h = hex(check_sum)[2:]
-              
-            # Check for a hex that is greater than 4 (including L indicator at the end)
+
+            # Check for a hex that is greater than 4 (including L indicator
+            # at the end)
             if len(check_h) > 4:
-                  
+
                 # Seek to location of check sum and compared to computed
-                if check_h[-1] == 'L':
+                if check_h[-1] == "L":
                     check_h = check_h[:-1]
-                      
-                f.seek(fileloc+bytes_per_ens, 0)
-                check_sum = np.fromfile(f, np.uint16, count=1)[0]  
-                if int('0x'+check_h[1:], 16) == check_sum:
+
+                f.seek(fileloc + bytes_per_ens, 0)
+                check_sum = np.fromfile(f, np.uint16, count=1)[0]
+                if int("0x" + check_h[1:], 16) == check_sum:
                     return True
                 else:
                     return False
             elif len(check_h) > 3:
                 # Seek to location of check sum and compared to computed
-                if check_h[-1] == 'L':
+                if check_h[-1] == "L":
                     check_h = check_h[:-1]
-                      
-                f.seek(fileloc+bytes_per_ens, 0)
-                check_sum = np.fromfile(f, np.uint16, count=1)[0]  
-                if int('0x'+check_h, 16) == check_sum:
+
+                f.seek(fileloc + bytes_per_ens, 0)
+                check_sum = np.fromfile(f, np.uint16, count=1)[0]
+                if int("0x" + check_h, 16) == check_sum:
                     return True
                 else:
                     return False
@@ -1534,9 +2238,9 @@ class Pd0TRDI(object):
             Location in file
         """
 
-        search_id = '    '
-        search_loc = file_loc+2
-        while search_id != '0x7f7f':
+        search_id = "    "
+        search_loc = file_loc + 2
+        while search_id != "0x7f7f":
             f.seek(search_loc, 0)
             search_loc += 1
             try:
@@ -1544,7 +2248,7 @@ class Pd0TRDI(object):
             except (ValueError, EOFError):
                 continue
         f.seek(search_loc, 0)
-        
+
     def end_reading(self, f, file_loc, i_data_types, i_ens, bytes_per_ens):
         """Checks if more data types need to be read and position file pointer.
 
@@ -1563,9 +2267,9 @@ class Pd0TRDI(object):
 
         """
         if i_data_types + 1 <= self.Hdr.n_data_types[i_ens]:
-            f.seek(int(self.Hdr.data_offsets[i_ens, i_data_types])+file_loc, 0)
+            f.seek(int(self.Hdr.data_offsets[i_ens, i_data_types]) + file_loc, 0)
         else:
-            f.seek(file_loc+bytes_per_ens-2, 0)
+            f.seek(file_loc + bytes_per_ens - 2, 0)
 
 
 class Hdr(object):
@@ -1599,7 +2303,7 @@ class Hdr(object):
         self.data_offsets = nans([n_ensembles, n_types])
         self.n_data_types = nans(n_ensembles)
         self.data_ok = nans(n_ensembles)
-        self.invalid = [''] * n_ensembles
+        self.invalid = [""] * n_ensembles
 
 
 class Inst(object):
@@ -1641,13 +2345,13 @@ class Inst(object):
         """
         self.beam_ang = nans(n_ensembles)
         self.beams = nans(n_ensembles)
-        self.data_type = [''] * n_ensembles
+        self.data_type = [""] * n_ensembles
         self.firm_ver = nans(n_ensembles)
         self.freq = nans(n_ensembles)
-        self.pat = [''] * n_ensembles
+        self.pat = [""] * n_ensembles
         self.res_RDI = 0
         self.sensor_CFG = nans(n_ensembles)
-        self.xducer = [''] * n_ensembles
+        self.xducer = [""] * n_ensembles
         self.t_matrix = np.tile([np.nan], [4, 4])
         self.demod = nans(n_ensembles)
 
@@ -1900,31 +2604,31 @@ class Cfg(object):
         self.bp = nans(n_ensembles)
         self.bx_dm = nans(n_ensembles)
         self.code_reps = nans(n_ensembles)
-        self.coord_sys = [''] * n_ensembles
+        self.coord_sys = [""] * n_ensembles
         self.cpu_ser_no = nans([n_ensembles, 8])
         self.cq = nans(n_ensembles)
         self.cx = nans(n_ensembles)
         self.dist_bin1_cm = nans(n_ensembles)
         self.ea_deg = nans(n_ensembles)
         self.eb_deg = nans(n_ensembles)
-        self.sensor_avail = [''] * n_ensembles
-        self.ex = [''] * n_ensembles
-        self.ez = [''] * n_ensembles
-        self.head_src = [''] * n_ensembles
+        self.sensor_avail = [""] * n_ensembles
+        self.ex = [""] * n_ensembles
+        self.ez = [""] * n_ensembles
+        self.head_src = [""] * n_ensembles
         self.lag_cm = nans(n_ensembles)
-        self.map_bins = [''] * n_ensembles
+        self.map_bins = [""] * n_ensembles
         self.n_beams = nans(n_ensembles)
-        self.pitch_src = [''] * n_ensembles
+        self.pitch_src = [""] * n_ensembles
         self.ref_lay_end_cell = nans(n_ensembles)
         self.ref_lay_str_cell = nans(n_ensembles)
-        self.roll_src = [''] * n_ensembles
-        self.sal_src = [''] * n_ensembles
+        self.roll_src = [""] * n_ensembles
+        self.sal_src = [""] * n_ensembles
         self.wm = nans(n_ensembles)
-        self.sos_src = [''] * n_ensembles
-        self.temp_src = [''] * n_ensembles
+        self.sos_src = [""] * n_ensembles
+        self.temp_src = [""] * n_ensembles
         self.tp_sec = nans(n_ensembles)
-        self.use_3beam = [''] * n_ensembles
-        self.use_pr = [''] * n_ensembles
+        self.use_3beam = [""] * n_ensembles
+        self.use_pr = [""] * n_ensembles
         self.wa = nans(n_ensembles)
         self.wb = nans(n_ensembles)
         self.wc = nans(n_ensembles)
@@ -1935,7 +2639,7 @@ class Cfg(object):
         self.wn = nans(n_ensembles)
         self.wp = nans(n_ensembles)
         self.ws_cm = nans(n_ensembles)
-        self.xdcr_dep_srs = [''] * n_ensembles
+        self.xdcr_dep_srs = [""] * n_ensembles
         self.xmit_pulse_cm = nans(n_ensembles)
         self.lag_near_bottom = nans(n_ensembles)
 
@@ -2106,46 +2810,46 @@ class Gps2(object):
         """
 
         self.gga_delta_time = np.full([n_ensembles, 20], np.nan)
-        self.gga_header = [x[:] for x in [[''] * 20] * n_ensembles]
-        self.gga_sentence = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.gga_header = [x[:] for x in [[""] * 20] * n_ensembles]
+        self.gga_sentence = [x[:] for x in [[""] * 20] * n_ensembles]
         self.utc = np.full([n_ensembles, 20], np.nan)
         self.lat_deg = np.zeros([n_ensembles, 20])
-        self.lat_ref = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.lat_ref = [x[:] for x in [[""] * 20] * n_ensembles]
         self.lon_deg = np.zeros([n_ensembles, 20])
-        self.lon_ref = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.lon_ref = [x[:] for x in [[""] * 20] * n_ensembles]
         self.corr_qual = np.full([n_ensembles, 20], np.nan)
         self.num_sats = np.full([n_ensembles, 20], np.nan)
         self.hdop = np.full([n_ensembles, 20], np.nan)
         self.alt = np.full([n_ensembles, 20], np.nan)
-        self.alt_unit = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.alt_unit = [x[:] for x in [[""] * 20] * n_ensembles]
         self.geoid = np.full([n_ensembles, 20], np.nan)
-        self.geoid_unit = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.geoid_unit = [x[:] for x in [[""] * 20] * n_ensembles]
         self.d_gps_age = np.full([n_ensembles, 20], np.nan)
         self.ref_stat_id = np.full([n_ensembles, 20], np.nan)
         self.vtg_delta_time = np.full([n_ensembles, 20], np.nan)
-        self.vtg_header = [x[:] for x in [[''] * 20] * n_ensembles]
-        self.vtg_sentence = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.vtg_header = [x[:] for x in [[""] * 20] * n_ensembles]
+        self.vtg_sentence = [x[:] for x in [[""] * 20] * n_ensembles]
         self.course_true = np.full([n_ensembles, 20], np.nan)
-        self.true_indicator = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.true_indicator = [x[:] for x in [[""] * 20] * n_ensembles]
         self.course_mag = np.full([n_ensembles, 20], np.nan)
-        self.mag_indicator = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.mag_indicator = [x[:] for x in [[""] * 20] * n_ensembles]
         self.speed_knots = np.full([n_ensembles, 20], np.nan)
-        self.knots_indicator = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.knots_indicator = [x[:] for x in [[""] * 20] * n_ensembles]
         self.speed_kph = np.zeros([n_ensembles, 20])
-        self.kph_indicator = [x[:] for x in [[''] * 20] * n_ensembles]
-        self.mode_indicator = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.kph_indicator = [x[:] for x in [[""] * 20] * n_ensembles]
+        self.mode_indicator = [x[:] for x in [[""] * 20] * n_ensembles]
         self.dbt_delta_time = np.full([n_ensembles, 20], np.nan)
-        self.dbt_header = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.dbt_header = [x[:] for x in [[""] * 20] * n_ensembles]
         self.depth_ft = np.full([n_ensembles, 20], np.nan)
-        self.ft_indicator = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.ft_indicator = [x[:] for x in [[""] * 20] * n_ensembles]
         self.depth_m = np.zeros([n_ensembles, 20])
-        self.m_indicator = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.m_indicator = [x[:] for x in [[""] * 20] * n_ensembles]
         self.depth_fath = np.full([n_ensembles, 20], np.nan)
-        self.fath_indicator = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.fath_indicator = [x[:] for x in [[""] * 20] * n_ensembles]
         self.hdt_delta_time = np.full([n_ensembles, 20], np.nan)
-        self.hdt_header = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.hdt_header = [x[:] for x in [[""] * 20] * n_ensembles]
         self.heading_deg = np.full([n_ensembles, 20], np.nan)
-        self.h_true_indicator = [x[:] for x in [[''] * 20] * n_ensembles]
+        self.h_true_indicator = [x[:] for x in [[""] * 20] * n_ensembles]
 
         # if wr2:
         self.gga_velE_mps = nans(n_ensembles)
@@ -2155,76 +2859,98 @@ class Gps2(object):
 
     def gga_expand(self, n_ensembles):
         self.gga_delta_time = np.concatenate(
-            (self.gga_delta_time, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.gga_delta_time, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.utc = np.concatenate(
-            (self.utc, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.utc, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.lat_deg = np.concatenate(
-            (self.lat_deg, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.lat_deg, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.lon_deg = np.concatenate(
-            (self.lon_deg, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.lon_deg, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.corr_qual = np.concatenate(
-            (self.corr_qual, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.corr_qual, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.num_sats = np.concatenate(
-            (self.num_sats, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.num_sats, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.hdop = np.concatenate(
-            (self.hdop, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.hdop, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.alt = np.concatenate(
-            (self.alt, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.alt, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.geoid = np.concatenate(
-            (self.geoid, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.geoid, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.d_gps_age = np.concatenate(
-            (self.d_gps_age, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.d_gps_age, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.ref_stat_id = np.concatenate(
-            (self.ref_stat_id, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.ref_stat_id, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         for ens in range(n_ensembles):
-            self.gga_header[ens].append('')
-            self.geoid_unit[ens].append('')
-            self.alt_unit[ens].append('')
-            self.lon_ref[ens].append('')
-            self.lat_ref[ens].append('')
+            self.gga_header[ens].append("")
+            self.geoid_unit[ens].append("")
+            self.alt_unit[ens].append("")
+            self.lon_ref[ens].append("")
+            self.lat_ref[ens].append("")
 
     def vtg_expand(self, n_ensembles):
         self.vtg_delta_time = np.concatenate(
-            (self.vtg_delta_time, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.vtg_delta_time, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.course_true = np.concatenate(
-            (self.course_true, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.course_true, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.course_mag = np.concatenate(
-            (self.course_mag, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.course_mag, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.speed_knots = np.concatenate(
-            (self.speed_knots, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.speed_knots, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.speed_kph = np.concatenate(
-            (self.speed_kph, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.speed_kph, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         for ens in range(n_ensembles):
-            self.kph_indicator[ens].append('')
-            self.mode_indicator[ens].append('')
-            self.vtg_header[ens].append('')
-            self.true_indicator[ens].append('')
-            self.mag_indicator[ens].append('')
-            self.knots_indicator[ens].append('')
+            self.kph_indicator[ens].append("")
+            self.mode_indicator[ens].append("")
+            self.vtg_header[ens].append("")
+            self.true_indicator[ens].append("")
+            self.mag_indicator[ens].append("")
+            self.knots_indicator[ens].append("")
 
     def dbt_expand(self, n_ensembles):
         self.dbt_delta_time = np.concatenate(
-            (self.dbt_delta_time, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.dbt_delta_time, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.depth_ft = np.concatenate(
-            (self.depth_ft, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.depth_ft, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.depth_m = np.concatenate(
-            (self.depth_m, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.depth_m, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.depth_fath = np.concatenate(
-            (self.depth_fath, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.depth_fath, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         for ens in range(n_ensembles):
-            self.fath_indicator[ens].append('')
-            self.dbt_header[ens].append('')
-            self.ft_indicator[ens].append('')
-            self.m_indicator[ens].append('')
+            self.fath_indicator[ens].append("")
+            self.dbt_header[ens].append("")
+            self.ft_indicator[ens].append("")
+            self.m_indicator[ens].append("")
 
     def hdt_expand(self, n_ensembles):
         self.hdt_delta_time = np.concatenate(
-            (self.hdt_delta_time, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.hdt_delta_time, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         self.heading_deg = np.concatenate(
-            (self.heading_deg, np.tile(np.nan, (1, n_ensembles)).T), axis=1)
+            (self.heading_deg, np.tile(np.nan, (1, n_ensembles)).T), axis=1
+        )
         for ens in range(n_ensembles):
-            self.h_true_indicator[ens].append('')
-            self.hdt_header[ens].append('')
+            self.h_true_indicator[ens].append("")
+            self.hdt_header[ens].append("")
 
 
 class Nmea(object):
@@ -2250,11 +2976,11 @@ class Nmea(object):
         n_ensembles: int
             Number of ensembles
         """
-        self.gga = ['']*n_ensembles
-        self.gsa = ['']*n_ensembles
-        self.vtg = ['']*n_ensembles
+        self.gga = [""] * n_ensembles
+        self.gsa = [""] * n_ensembles
+        self.vtg = [""] * n_ensembles
         # self.raw = ['']*n_ensembles DSM: not sure this was used
-        self.dbt = ['']*n_ensembles
+        self.dbt = [""] * n_ensembles
 
 
 class Sensor(object):
@@ -2355,14 +3081,14 @@ class Sensor(object):
         self.date = nans([n_ensembles, 3])
         self.date_y2k = nans([n_ensembles, 4])
         self.date_not_y2k = nans([n_ensembles, 3])
-        self.error_status_word = [''] * n_ensembles
+        self.error_status_word = [""] * n_ensembles
         self.heading_deg = nans(n_ensembles)
         self.heading_std_dev_deg = nans(n_ensembles)
         self.mpt_msc = nans([n_ensembles, 3])
         self.num = nans(n_ensembles)
         self.num_fact = nans(n_ensembles)
         self.num_tot = nans(n_ensembles)
-        self.orient = [''] * n_ensembles
+        self.orient = [""] * n_ensembles
         self.pitch_std_dev_deg = nans(n_ensembles)
         self.pitch_deg = nans(n_ensembles)
         self.pressure_neg = nans(n_ensembles)
@@ -2382,7 +3108,7 @@ class Sensor(object):
         self.vert_beam_eval_amp = nans(n_ensembles)
         self.vert_beam_RSSI_amp = nans(n_ensembles)
         self.vert_beam_range_m = nans(n_ensembles)
-        self.vert_beam_gain = [''] * n_ensembles
+        self.vert_beam_gain = [""] * n_ensembles
         self.vert_beam_status = np.zeros(n_ensembles)
 
 
@@ -2404,7 +3130,8 @@ class Surface(object):
     pergd: np.array(int)
         3D array of percent good for each beam, cell, and ensemble
     rssi: np.array(int)
-        3D array of return signal strength indicator for each beam, cell, and ensemble
+        3D array of return signal strength indicator for each beam, cell,
+        and ensemble
     """
 
     def __init__(self, n_ensembles, n_velocities, max_surface_bins):
@@ -2441,7 +3168,8 @@ class Wt(object):
     pergd: np.array(int)
         3D array of percent good for each beam, cell, and ensemble
     rssi: np.array(int)
-        3D array of return signal strength indicator for each beam, cell, and ensemble
+        3D array of return signal strength indicator for each beam, cell,
+        and ensemble
     """
 
     def __init__(self, n_bins, n_ensembles, n_velocities):
diff --git a/qrevint_22_06_22/Classes/Pd0TRDI_2.py b/Classes/Pd0TRDI_2.py
similarity index 53%
rename from qrevint_22_06_22/Classes/Pd0TRDI_2.py
rename to Classes/Pd0TRDI_2.py
index 6a20448a59b9502b4d3b8f345be9b956319c1911..ff820f41200ac8186064511fca6d8dbf089a1291 100644
--- a/qrevint_22_06_22/Classes/Pd0TRDI_2.py
+++ b/Classes/Pd0TRDI_2.py
@@ -59,49 +59,53 @@ class Pd0TRDI(object):
         self.Nmea = None
 
         self.data_decoders = {
-            0x0000: ('fixed_leader', self.decode_fixed_leader),
-            0x0080: ('variable_leader', self.decode_variable_leader),
-            0x0100: ('velocity', self.decode_velocity),
-            0x0200: ('correlation', self.decode_correlation),
-            0x0300: ('echo_intensity', self.decode_echo_intensity),
-            0x0400: ('percent_good', self.decode_percent_good),
-            0x0500: ('status', self.decode_status),
-            0x0600: ('bottom_track', self.decode_bottom_track),
-            0x2022: ('nmea', self.decode_nmea),
-            0x2100: ('dbt_sentence', self.decode_dbt_sentence),
-            0x2101: ('gga_sentence', self.decode_gga_sentence),
-            0x2102: ('vtg_sentence', self.decode_vtg_sentence),
-            0x2103: ('gsa_sentence', self.decode_gsa_sentence),
-            0x0010: ('surface_leader', self.decode_surface_leader),
-            0x0110: ('surface_velocity', self.decode_surface_velocity),
-            0x0210: ('surface_correlation', self.decode_surface_correlation),
-            0x0310: ('surface_intensity', self.decode_surface_intensity),
-            0x0410: ('surface_percent_good', self.decode_surface_percent_good),
-            0x0510: ('surface_status', self.decode_surface_status),
-            0x4401: ('auto_configuration', self.decode_auto_config),
-            0x4100: ('vertical_beam', self.decode_vertical_beam),
-            0x3200: ('transformation_matrix', self.decode_transformation_matrix)
+            0x0000: ("fixed_leader", self.decode_fixed_leader),
+            0x0080: ("variable_leader", self.decode_variable_leader),
+            0x0100: ("velocity", self.decode_velocity),
+            0x0200: ("correlation", self.decode_correlation),
+            0x0300: ("echo_intensity", self.decode_echo_intensity),
+            0x0400: ("percent_good", self.decode_percent_good),
+            0x0500: ("status", self.decode_status),
+            0x0600: ("bottom_track", self.decode_bottom_track),
+            0x2022: ("nmea", self.decode_nmea),
+            0x2100: ("dbt_sentence", self.decode_dbt_sentence),
+            0x2101: ("gga_sentence", self.decode_gga_sentence),
+            0x2102: ("vtg_sentence", self.decode_vtg_sentence),
+            0x2103: ("gsa_sentence", self.decode_gsa_sentence),
+            0x0010: ("surface_leader", self.decode_surface_leader),
+            0x0110: ("surface_velocity", self.decode_surface_velocity),
+            0x0210: ("surface_correlation", self.decode_surface_correlation),
+            0x0310: ("surface_intensity", self.decode_surface_intensity),
+            0x0410: ("surface_percent_good", self.decode_surface_percent_good),
+            0x0510: ("surface_status", self.decode_surface_status),
+            0x4401: ("auto_configuration", self.decode_auto_config),
+            0x4100: ("vertical_beam", self.decode_vertical_beam),
+            0x3200: ("transformation_matrix", self.decode_transformation_matrix),
         }
 
-        self.nmea_decoders = {100: ('gga', self.decode_gga_100),
-                              101: ('vtg', self.decode_vtg_101),
-                              102: ('ds', self.decode_ds_102),
-                              103: ('ext_heading', self.decode_ext_heading_103),
-                              104: ('gga', self.decode_gga_104),
-                              105: ('vtg', self.decode_vtg_105),
-                              106: ('ds', self.decode_ds_106),
-                              107: ('ext_heading', self.decode_ext_heading_107),
-                              204: ('gga', self.decode_gga_204),
-                              205: ('vtg', self.decode_vtg_205),
-                              206: ('ds', self.decode_ds_206),
-                              207: ('ext_heading', self.decode_ext_heading_207)}
+        self.nmea_decoders = {
+            100: ("gga", self.decode_gga_100),
+            101: ("vtg", self.decode_vtg_101),
+            102: ("ds", self.decode_ds_102),
+            103: ("ext_heading", self.decode_ext_heading_103),
+            104: ("gga", self.decode_gga_104),
+            105: ("vtg", self.decode_vtg_105),
+            106: ("ds", self.decode_ds_106),
+            107: ("ext_heading", self.decode_ext_heading_107),
+            204: ("gga", self.decode_gga_204),
+            205: ("vtg", self.decode_vtg_205),
+            206: ("ds", self.decode_ds_206),
+            207: ("ext_heading", self.decode_ext_heading_207),
+        }
 
         self.n_velocities = 4
         self.max_surface_bins = 5
 
         self.pd0_read(file_name)
 
-    def create_objects(self, n_ensembles, n_types, n_bins, max_surface_bins, n_velocities, wr2=False):
+    def create_objects(
+        self, n_ensembles, n_types, n_bins, max_surface_bins, n_velocities, wr2=False
+    ):
         """Create objects for instance variables.
 
         Parameters
@@ -133,7 +137,8 @@ class Pd0TRDI(object):
         self.Nmea = Nmea(n_ensembles)
 
     def pd0_read(self, fullname, wr2=False):
-        """Reads the binary pd0 file and assigns values to object instance variables.
+        """Reads the binary pd0 file and assigns values to object instance
+        variables.
 
         Parameters
         ----------
@@ -149,13 +154,22 @@ class Pd0TRDI(object):
 
             if file_info > 0:
                 # Open file for processing
-                with open(fullname, 'rb') as f:
+                with open(fullname, "rb") as f:
                     pd0 = f.read()
                 pd0_bytes = bytearray(pd0)
 
                 # Intialize classes and arrays
-                n_ensembles, max_types, max_beams, max_bins = self.number_of_ensembles(self, file_info, pd0_bytes)
-                self.create_objects(n_ensembles, max_types, max_bins, self.max_surface_bins, self.n_velocities, wr2)
+                n_ensembles, max_types, max_beams, max_bins = self.number_of_ensembles(
+                    self, file_info, pd0_bytes
+                )
+                self.create_objects(
+                    n_ensembles,
+                    max_types,
+                    max_bins,
+                    self.max_surface_bins,
+                    self.n_velocities,
+                    wr2,
+                )
                 self.decode_all(pd0_bytes, file_info)
                 self.screen_and_convert(wr2)
 
@@ -188,7 +202,7 @@ class Pd0TRDI(object):
         if wr2:
 
             # If vtg data are available compute north and east components
-            if self.Gps2.vtg_header[0, 0] == '$':
+            if self.Gps2.vtg_header[0, 0] == "$":
 
                 # Find minimum of absolute value of delta time from raw data
                 vtg_delta_time = np.abs(self.Gps2.vtg_delta_time)
@@ -197,11 +211,12 @@ class Pd0TRDI(object):
                 # Compute the velocity components in m/s
                 for i in range(len(vtg_delta_time)):
                     idx = np.where(vtg_delta_time == vtg_min)[0][0]
-                    self.Gps2.vtg_velE_mps[i], self.Gps2.vtg_velN_mps[i] = \
-                        pol2cart((90 - self.Gps2.course_true[i, idx]) * np.pi / 180,
-                                 self.Gps2.speed_kph[i, idx] * 0.2777778)
+                    self.Gps2.vtg_velE_mps[i], self.Gps2.vtg_velN_mps[i] = pol2cart(
+                        (90 - self.Gps2.course_true[i, idx]) * np.pi / 180,
+                        self.Gps2.speed_kph[i, idx] * 0.2777778,
+                    )
 
-            if self.Gps2.gga_header[0, 0] == '$':
+            if self.Gps2.gga_header[0, 0] == "$":
 
                 # Initialize constants
                 e_radius = 6378137
@@ -216,14 +231,29 @@ class Pd0TRDI(object):
                 for i in range(len(gga_delta_time)):
                     idx = np.where(gga_delta_time[i:] == gga_min)
                     if idx > 0:
-                        lat_avg_rad = (self.Gps2.lat_deg[i, idx[i]]
-                                       + self.Gps2.lat_deg[i - 1, idx[i - 1]]) / 2
+                        lat_avg_rad = (
+                            self.Gps2.lat_deg[i, idx[i]]
+                            + self.Gps2.lat_deg[i - 1, idx[i - 1]]
+                        ) / 2
                         sin_lat_avg_rad = np.sin(np.deg2rad(lat_avg_rad))
                         r_e = coeff * (1 + ellip * sin_lat_avg_rad * sin_lat_avg_rad)
-                        rn = coeff * (1 - 2 * ellip + 3 * ellip * sin_lat_avg_rad * sin_lat_avg_rad)
-                        dx = r_e * (self.Gps2.lon_deg[i, idx[i]] -
-                                    self.Gps2.lon_deg(i - 1, idx[i - 1])) * np.cos(np.deg2rad(lat_avg_rad))
-                        dy = rn * (self.Gps2.lat_deg[i, idx[i]] - self.Gps2.lat_deg[i - 1, idx[i - 1]])
+                        rn = coeff * (
+                            1
+                            - 2 * ellip
+                            + 3 * ellip * sin_lat_avg_rad * sin_lat_avg_rad
+                        )
+                        dx = (
+                            r_e
+                            * (
+                                self.Gps2.lon_deg[i, idx[i]]
+                                - self.Gps2.lon_deg(i - 1, idx[i - 1])
+                            )
+                            * np.cos(np.deg2rad(lat_avg_rad))
+                        )
+                        dy = rn * (
+                            self.Gps2.lat_deg[i, idx[i]]
+                            - self.Gps2.lat_deg[i - 1, idx[i - 1]]
+                        )
                         dt = self.Gps2.utc[i, idx[i]] - self.Gps2.utc[i - 1, idx[i - 1]]
                         self.Gps2.gga_velE_mps[i] = dx / dt
                         self.Gps2.gga_velN_mps[i] = dy / dt
@@ -238,10 +268,10 @@ class Pd0TRDI(object):
         ensemble_number = 0
         while start_byte < file_info:
             data = self.decode_pd0_bytearray(self.data_decoders, pd0_bytes[start_byte:])
-            if data['checksum']:
+            if data["checksum"]:
                 # Adjust index for lost ensembles
                 if ensemble_number > 0:
-                    n = n + data['variable_leader']['ensemble_number'] - ensemble_number
+                    n = n + data["variable_leader"]["ensemble_number"] - ensemble_number
                 try:
                     self.Hdr.populate_data(n, data)
                     self.Inst.populate_data(n, data)
@@ -254,14 +284,13 @@ class Pd0TRDI(object):
                     self.Surface.populate_data(n, data, self)
                     self.AutoMode.populate_data(n, data)
                     self.Nmea.populate_data(n, data)
-                    start_byte = start_byte + data['header']['number_of_bytes'] + 2
-                    ensemble_number = data['variable_leader']['ensemble_number']
+                    start_byte = start_byte + data["header"]["number_of_bytes"] + 2
+                    ensemble_number = data["variable_leader"]["ensemble_number"]
                 except ValueError:
                     start_byte = Pd0TRDI.find_next(pd0_bytes, start_byte, file_info)
             else:
                 start_byte = Pd0TRDI.find_next(pd0_bytes, start_byte, file_info)
 
-
     @staticmethod
     def number_of_ensembles(self, file_info, pd0_bytes):
         """Determines the number of ensembles in the data file.
@@ -288,8 +317,10 @@ class Pd0TRDI(object):
         """
 
         # Configure data decoders to be used
-        data_decoders = {0x0000: ('fixed_leader', self.preload_fixed_leader),
-                         0x0080: ('variable_leader', self.preload_variable_leader)}
+        data_decoders = {
+            0x0000: ("fixed_leader", self.preload_fixed_leader),
+            0x0080: ("variable_leader", self.preload_variable_leader),
+        }
 
         # Intitialize variables
         start_byte = 0
@@ -303,20 +334,22 @@ class Pd0TRDI(object):
 
             data = self.decode_pd0_bytearray(data_decoders, pd0_bytes[start_byte:])
             # start_byte = start_byte + data['header']['number_of_bytes'] + 2
-            if data['checksum']:
-                # if 'number_of_bytes' in data['header'] and data['header']['number_of_bytes'] > 0:
-                if 'number_of_bytes' in data['header'] and 'fixed_leader' in data and 'variable_leader' in data:
-                    n_data_types.append(data['header']['number_of_data_types'])
-                    n_beams.append(data['fixed_leader']['number_of_beams'])
-                    n_bins.append(data['fixed_leader']['number_of_cells'])
-                    ens_num.append(data['variable_leader']['ensemble_number'])
-                    start_byte = start_byte + data['header']['number_of_bytes'] + 2
+            if data["checksum"]:
+                if (
+                    "number_of_bytes" in data["header"]
+                    and "fixed_leader" in data
+                    and "variable_leader" in data
+                ):
+                    n_data_types.append(data["header"]["number_of_data_types"])
+                    n_beams.append(data["fixed_leader"]["number_of_beams"])
+                    n_bins.append(data["fixed_leader"]["number_of_cells"])
+                    ens_num.append(data["variable_leader"]["ensemble_number"])
+                    start_byte = start_byte + data["header"]["number_of_bytes"] + 2
                 else:
                     start_byte = Pd0TRDI.find_next(pd0_bytes, start_byte, file_info)
             else:
                 start_byte = Pd0TRDI.find_next(pd0_bytes, start_byte, file_info)
 
-
         # Compute maximums
         max_data_types = np.nanmax(n_data_types)
         max_beams = np.nanmax(n_beams)
@@ -326,12 +359,11 @@ class Pd0TRDI(object):
         return n_ensembles, max_data_types, max_beams, max_bins
 
     @staticmethod
-    def find_next (pd0_bytes, start_byte, file_info):
+    def find_next(pd0_bytes, start_byte, file_info):
 
         try:
             start_byte = start_byte + 1
-            skip_forward = pd0_bytes[start_byte:].index(b'\x7f\x7f')
-            # data['header'] = Pd0TRDI.decode_fixed_header(pd0_bytes[start_byte + skip_forward:])
+            skip_forward = pd0_bytes[start_byte:].index(b"\x7f\x7f")
             start_byte = start_byte + skip_forward
         except ValueError:
             start_byte = file_info
@@ -359,7 +391,7 @@ class Pd0TRDI(object):
             Number of regular cells in ensemble
         """
 
-        fixed_leader_format = (('number_of_beams', 'B', 8), ('number_of_cells', 'B', 9))
+        fixed_leader_format = (("number_of_beams", "B", 8), ("number_of_cells", "B", 9))
 
         return Pd0TRDI.unpack_bytes(pd0_bytes, fixed_leader_format, offset)
 
@@ -383,13 +415,14 @@ class Pd0TRDI(object):
         """
 
         # Define format
-        variable_leader_format = (('ensemble_number', '<H', 2),)
+        variable_leader_format = (("ensemble_number", "<H", 2),)
 
         return Pd0TRDI.unpack_bytes(pd0_bytes, variable_leader_format, offset)
 
     @staticmethod
     def decode_pd0_bytearray(data_decoders, pd0_bytes):
-        """Loops through data and calls appropriate parsing method for each header ID.
+        """Loops through data and calls appropriate parsing method for each
+         header ID.
 
         Parameters
         ----------
@@ -404,42 +437,52 @@ class Pd0TRDI(object):
             Dictionary of decoded data
         """
 
-        data = {}
+        data = {"header": Pd0TRDI.decode_fixed_header(pd0_bytes), "checksum": False}
 
         # Read in header
-        data['header'] = Pd0TRDI.decode_fixed_header(pd0_bytes)
-        data['checksum'] = False
-        if 'number_of_bytes' in data['header'] and data['header']['number_of_bytes'] > 0:
-            if 'number_of_data_types' in data['header']:
-                # If checksum is OK then decode address offsets to the data types
-                if Pd0TRDI.validate_checksum(pd0_bytes, data['header']['number_of_bytes']):
-                    data['checksum'] = True
-                    data['header']['address_offsets'] = Pd0TRDI.decode_address_offsets(pd0_bytes,
-                                                                                       data['header']['number_of_data_types'])
-                    data['header']['invalid'] = []
-                    # Loop to decode all data types for which a data decoder is provided
-                    for offset in data['header']['address_offsets']:
+        if (
+            "number_of_bytes" in data["header"]
+            and data["header"]["number_of_bytes"] > 0
+        ):
+            if "number_of_data_types" in data["header"]:
+                # If checksum is OK then decode address offsets to the data
+                # types
+                if Pd0TRDI.validate_checksum(
+                    pd0_bytes, data["header"]["number_of_bytes"]
+                ):
+                    data["checksum"] = True
+                    data["header"]["address_offsets"] = Pd0TRDI.decode_address_offsets(
+                        pd0_bytes, data["header"]["number_of_data_types"]
+                    )
+                    data["header"]["invalid"] = []
+                    # Loop to decode all data types for which a data
+                    # decoder is provided
+                    for offset in data["header"]["address_offsets"]:
                         if len(pd0_bytes) > offset + 2:
-                            header_id = struct.unpack('<H', pd0_bytes[offset: offset + 2])[0]
+                            header_id = struct.unpack(
+                                "<H", pd0_bytes[offset : offset + 2]
+                            )[0]
                             if header_id in data_decoders:
                                 key = data_decoders[header_id][0]
                                 decoder = data_decoders[header_id][1]
                                 data[key] = decoder(pd0_bytes, offset, data)
                             else:
-                                data['header']['invalid'].append(header_id)
+                                data["header"]["invalid"].append(header_id)
 
         return data
 
     @staticmethod
     def unpack_bytes(pd0_bytes, data_format_tuples, offset=0):
-        """Unpackes the data based on the supplied data format tuples and offset.
+        """Unpackes the data based on the supplied data format tuples and
+        offset.
 
         Parameters
         ----------
         pd0_bytes: bytearray
             Bytearray of all pd0 data
         data_format_tuples: tuple
-            A tuple of tuples providing the data name, format, and byte location
+            A tuple of tuples providing the data name, format, and byte
+            location
         offset: int
             Pointer into pd0_bytes
 
@@ -450,14 +493,17 @@ class Pd0TRDI(object):
         """
         data = {}
 
-        # Decode data for each format specified in the data format tuples and assign to the data dictionary
+        # Decode data for each format specified in the data format tuples and
+        # assign to the data dictionary
         for fmt in data_format_tuples:
             try:
                 struct_offset = offset + fmt[2]
                 size = struct.calcsize(fmt[1])
-                data[fmt[0]] = struct.unpack(fmt[1], pd0_bytes[struct_offset: struct_offset + size])[0]
+                data[fmt[0]] = struct.unpack(
+                    fmt[1], pd0_bytes[struct_offset : struct_offset + size]
+                )[0]
             except:
-                print('Error parsing %s with the arguments ')
+                print("Error parsing %s with the arguments ")
 
         return data
 
@@ -480,7 +526,7 @@ class Pd0TRDI(object):
         """
         if len(pd0_bytes) > offset + 1:
             calc_checksum = sum(pd0_bytes[:offset]) & 0xFFFF
-            given_checksum = struct.unpack('<H', pd0_bytes[offset: offset + 2])[0]
+            given_checksum = struct.unpack("<H", pd0_bytes[offset : offset + 2])[0]
 
             if calc_checksum == given_checksum:
                 return True
@@ -492,9 +538,9 @@ class Pd0TRDI(object):
     def bin2str(bin_in):
 
         try:
-            str_out = bin_in.decode('utf-8')
+            str_out = bin_in.decode("utf-8")
         except:
-            str_out = ''
+            str_out = ""
         return str_out
 
     @staticmethod
@@ -520,7 +566,7 @@ class Pd0TRDI(object):
 
         # Loop through each data type
         for bytes_start in range(offset, offset + (num_data_types * 2), 2):
-            data = struct.unpack_from('<H', pd0_bytes[bytes_start: bytes_start + 2])[0]
+            data = struct.unpack_from("<H", pd0_bytes[bytes_start : bytes_start + 2])[0]
             address_data.append(data)
 
         return address_data
@@ -540,11 +586,13 @@ class Pd0TRDI(object):
             Dictionary of header data
         """
 
-        header_data_format = (('id', 'B', 0),
-                              ('data_source', 'B', 1),
-                              ('number_of_bytes', '<H', 2),
-                              ('spare', 'B', 4),
-                              ('number_of_data_types', 'B', 5))
+        header_data_format = (
+            ("id", "B", 0),
+            ("data_source", "B", 1),
+            ("number_of_bytes", "<H", 2),
+            ("spare", "B", 4),
+            ("number_of_data_types", "B", 5),
+        )
 
         header = Pd0TRDI.unpack_bytes(pd0_bytes, header_data_format)
         return header
@@ -570,44 +618,44 @@ class Pd0TRDI(object):
 
         # Define format
         fixed_leader_format = (
-            ('id', '<H', 0),
-            ('cpu_firmware_version', 'B', 2),
-            ('cpu_firmware_revision', 'B', 3),
-            ('system_configuration_ls', 'B', 4),
-            ('system_configuration_ms', 'B', 5),
-            ('simulation_data_flag', 'B', 6),
-            ('lag_length', 'B', 7),
-            ('number_of_beams', 'B', 8),
-            ('number_of_cells', 'B', 9),
-            ('number_of_water_pings', '<H', 10),
-            ('depth_cell_size', '<H', 12),
-            ('blank_after_transmit', '<H', 14),
-            ('water_mode', 'B', 16),
-            ('low_correlation_threshold', 'B', 17),
-            ('number_of_code_repetitions', 'B', 18),
-            ('minimum_percentage_water_profile_pings', 'B', 19),
-            ('error_velocity_threshold', '<H', 20),
-            ('minutes', 'B', 22),
-            ('seconds', 'B', 23),
-            ('hundredths', 'B', 24),
-            ('coordinate_transformation_process', 'B', 25),
-            ('heading_alignment', '<H', 26),
-            ('heading_bias', '<H', 28),
-            ('sensor_source', 'B', 30),
-            ('sensor_available', 'B', 31),
-            ('bin_1_distance', '<H', 32),
-            ('transmit_pulse_length', '<H', 34),
-            ('starting_depth_cell', 'B', 36),
-            ('ending_depth_cell', 'B', 37),
-            ('false_target_threshold', 'B', 38),
-            ('low_latency_trigger', 'B', 39),
-            ('transmit_lag_distance', '<H', 40),
-            ('cpu_board_serial_number', '<Q', 42),
-            ('system_bandwidth', '<H', 50),
-            ('system_power', 'B', 52),
-            ('spare', 'B', 53),
-            ('serial_number', '<I', 54),
-            ('beam_angle', 'B', 58)
+            ("id", "<H", 0),
+            ("cpu_firmware_version", "B", 2),
+            ("cpu_firmware_revision", "B", 3),
+            ("system_configuration_ls", "B", 4),
+            ("system_configuration_ms", "B", 5),
+            ("simulation_data_flag", "B", 6),
+            ("lag_length", "B", 7),
+            ("number_of_beams", "B", 8),
+            ("number_of_cells", "B", 9),
+            ("number_of_water_pings", "<H", 10),
+            ("depth_cell_size", "<H", 12),
+            ("blank_after_transmit", "<H", 14),
+            ("water_mode", "B", 16),
+            ("low_correlation_threshold", "B", 17),
+            ("number_of_code_repetitions", "B", 18),
+            ("minimum_percentage_water_profile_pings", "B", 19),
+            ("error_velocity_threshold", "<H", 20),
+            ("minutes", "B", 22),
+            ("seconds", "B", 23),
+            ("hundredths", "B", 24),
+            ("coordinate_transformation_process", "B", 25),
+            ("heading_alignment", "<H", 26),
+            ("heading_bias", "<H", 28),
+            ("sensor_source", "B", 30),
+            ("sensor_available", "B", 31),
+            ("bin_1_distance", "<H", 32),
+            ("transmit_pulse_length", "<H", 34),
+            ("starting_depth_cell", "B", 36),
+            ("ending_depth_cell", "B", 37),
+            ("false_target_threshold", "B", 38),
+            ("low_latency_trigger", "B", 39),
+            ("transmit_lag_distance", "<H", 40),
+            ("cpu_board_serial_number", "<Q", 42),
+            ("system_bandwidth", "<H", 50),
+            ("system_power", "B", 52),
+            ("spare", "B", 53),
+            ("serial_number", "<I", 54),
+            ("beam_angle", "B", 58),
         )
 
         return Pd0TRDI.unpack_bytes(pd0_bytes, fixed_leader_format, offset)
@@ -633,60 +681,64 @@ class Pd0TRDI(object):
 
         # Define format
         variable_leader_format = (
-            ('id', '<H', 0),
-            ('ensemble_number', '<H', 2),
-            ('rtc_year', 'B', 4),
-            ('rtc_month', 'B', 5),
-            ('rtc_day', 'B', 6),
-            ('rtc_hour', 'B', 7),
-            ('rtc_minutes', 'B', 8),
-            ('rtc_seconds', 'B', 9),
-            ('rtc_hundredths', 'B', 10),
-            ('ensemble_number_msb', 'B', 11),
-            ('bit_fault', 'B', 12),
-            ('bit_count', 'B', 13),
-            ('speed_of_sound', '<H', 14),
-            ('depth_of_transducer', '<H', 16),
-            ('heading', '<H', 18),
-            ('pitch', '<h', 20),
-            ('roll', '<h', 22),
-            ('salinity', '<H', 24),
-            ('temperature', '<h', 26),
-            ('mpt_minutes', 'B', 28),
-            ('mpt_seconds', 'B', 29),
-            ('mpt_hundredths', 'B', 30),
-            ('heading_standard_deviation', 'B', 31),
-            ('pitch_standard_deviation', 'B', 32),
-            ('roll_standard_deviation', 'B', 33),
-            ('transmit_current', 'B', 34),
-            ('transmit_voltage', 'B', 35),
-            ('ambient_temperature', 'B', 36),
-            ('pressure_positive', 'B', 37),
-            ('pressure_negative', 'B', 38),
-            ('attitude_temperature', 'B', 39),
-            ('attitude', 'B', 40),
-            ('contamination_sensor', 'B', 41),
-            ('error_status_word', '<I', 42),
-            ('reserved', '<H', 46),
-            ('pressure', '<I', 48),
-            ('pressure_variance', '<I', 52),
-            ('spare', 'B', 56),
-            ('rtc_y2k_century', 'B', 57),
-            ('rtc_y2k_year', 'B', 58),
-            ('rtc_y2k_month', 'B', 59),
-            ('rtc_y2k_day', 'B', 60),
-            ('rtc_y2k_hour', 'B', 61),
-            ('rtc_y2k_minutes', 'B', 62),
-            ('rtc_y2k_seconds', 'B', 63),
-            ('rtc_y2k_hundredths', 'B', 64),
-            ('lag_near_bottom', 'B', 65)
+            ("id", "<H", 0),
+            ("ensemble_number", "<H", 2),
+            ("rtc_year", "B", 4),
+            ("rtc_month", "B", 5),
+            ("rtc_day", "B", 6),
+            ("rtc_hour", "B", 7),
+            ("rtc_minutes", "B", 8),
+            ("rtc_seconds", "B", 9),
+            ("rtc_hundredths", "B", 10),
+            ("ensemble_number_msb", "B", 11),
+            ("bit_fault", "B", 12),
+            ("bit_count", "B", 13),
+            ("speed_of_sound", "<H", 14),
+            ("depth_of_transducer", "<H", 16),
+            ("heading", "<H", 18),
+            ("pitch", "<h", 20),
+            ("roll", "<h", 22),
+            ("salinity", "<H", 24),
+            ("temperature", "<h", 26),
+            ("mpt_minutes", "B", 28),
+            ("mpt_seconds", "B", 29),
+            ("mpt_hundredths", "B", 30),
+            ("heading_standard_deviation", "B", 31),
+            ("pitch_standard_deviation", "B", 32),
+            ("roll_standard_deviation", "B", 33),
+            ("transmit_current", "B", 34),
+            ("transmit_voltage", "B", 35),
+            ("ambient_temperature", "B", 36),
+            ("pressure_positive", "B", 37),
+            ("pressure_negative", "B", 38),
+            ("attitude_temperature", "B", 39),
+            ("attitude", "B", 40),
+            ("contamination_sensor", "B", 41),
+            ("error_status_word", "<I", 42),
+            ("reserved", "<H", 46),
+            ("pressure", "<I", 48),
+            ("pressure_variance", "<I", 52),
+            ("spare", "B", 56),
+            ("rtc_y2k_century", "B", 57),
+            ("rtc_y2k_year", "B", 58),
+            ("rtc_y2k_month", "B", 59),
+            ("rtc_y2k_day", "B", 60),
+            ("rtc_y2k_hour", "B", 61),
+            ("rtc_y2k_minutes", "B", 62),
+            ("rtc_y2k_seconds", "B", 63),
+            ("rtc_y2k_hundredths", "B", 64),
+            ("lag_near_bottom", "B", 65),
         )
 
         return Pd0TRDI.unpack_bytes(pd0_bytes, variable_leader_format, offset)
 
-    def decode_per_cell_per_beam(pd0_bytes, offset, number_of_cells, number_of_beams, struct_format):
+    @staticmethod
+    def decode_per_cell_per_beam(
+        pd0_bytes, offset, number_of_cells, number_of_beams, struct_format
+    ):
         """Parses fields that are stored in serial cells and beams structures.
-        Returns an array of cell readings where each reading is an array containing the value at that beam.
+        Returns an array of cell readings where each reading is an array
+        containing the value at that beam.
 
         Parameters
         ----------
@@ -696,7 +748,7 @@ class Pd0TRDI(object):
             Pointer into pd0_bytes
         number_of_cells: int
             Number of cells in data
-        number of beams: int
+        number_of_beams: int
             Number of beams in data
         struct_format: str
             A string identifying the type of data to decode
@@ -716,7 +768,7 @@ class Pd0TRDI(object):
             # Loop through beams in each cell
             for field in range(0, number_of_beams):
                 field_start = cell_start + field * data_size
-                data_bytes = pd0_bytes[field_start: field_start + data_size]
+                data_bytes = pd0_bytes[field_start : field_start + data_size]
                 field_data = struct.unpack(struct_format, data_bytes)[0]
                 cell_data.append(field_data)
             data.append(cell_data)
@@ -743,18 +795,20 @@ class Pd0TRDI(object):
         """
 
         # Define format
-        velocity_format = (('id', '<h', 0),)
+        velocity_format = (("id", "<h", 0),)
 
         # Unpack data
         velocity_data = Pd0TRDI.unpack_bytes(pd0_bytes, velocity_format, offset)
         # Move past id field
         offset += 2
         # Arrange data in list of depth cells and beams or velocity components
-        velocity_data['data'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes,
-                                                                 offset,
-                                                                 data['fixed_leader']['number_of_cells'],
-                                                                 data['fixed_leader']['number_of_beams'],
-                                                                 '<h')
+        velocity_data["data"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes,
+            offset,
+            data["fixed_leader"]["number_of_cells"],
+            data["fixed_leader"]["number_of_beams"],
+            "<h",
+        )
 
         return velocity_data
 
@@ -777,17 +831,19 @@ class Pd0TRDI(object):
             Dictionary of decoded data
         """
 
-        correlation_format = (('id', '<H', 0),)
+        correlation_format = (("id", "<H", 0),)
         # Unpack data
         correlation_data = Pd0TRDI.unpack_bytes(pd0_bytes, correlation_format, offset)
         # Move past id field
         offset += 2
         # Arrange data in list of depth cells and beams
-        correlation_data['data'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes,
-                                                                    offset,
-                                                                    data['fixed_leader']['number_of_cells'],
-                                                                    data['fixed_leader']['number_of_beams'],
-                                                                    'B')
+        correlation_data["data"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes,
+            offset,
+            data["fixed_leader"]["number_of_cells"],
+            data["fixed_leader"]["number_of_beams"],
+            "B",
+        )
 
         return correlation_data
 
@@ -810,17 +866,21 @@ class Pd0TRDI(object):
             Dictionary of decoded data
         """
 
-        echo_intensity_format = (('id', '<H', 0),)
+        echo_intensity_format = (("id", "<H", 0),)
         # Unpack data
-        echo_intensity_data = Pd0TRDI.unpack_bytes(pd0_bytes, echo_intensity_format, offset)
+        echo_intensity_data = Pd0TRDI.unpack_bytes(
+            pd0_bytes, echo_intensity_format, offset
+        )
         # Move past id field
         offset += 2
         # Arrange data in list of depth cells and beams
-        echo_intensity_data['data'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes,
-                                                                       offset,
-                                                                       data['fixed_leader']['number_of_cells'],
-                                                                       data['fixed_leader']['number_of_beams'],
-                                                                       'B')
+        echo_intensity_data["data"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes,
+            offset,
+            data["fixed_leader"]["number_of_cells"],
+            data["fixed_leader"]["number_of_beams"],
+            "B",
+        )
 
         return echo_intensity_data
 
@@ -843,17 +903,19 @@ class Pd0TRDI(object):
             Dictionary of decoded data
         """
 
-        percent_good_format = (('id', '<H', 0),)
+        percent_good_format = (("id", "<H", 0),)
         # Unpack data
         percent_good_data = Pd0TRDI.unpack_bytes(pd0_bytes, percent_good_format, offset)
         # Move past id field
         offset += 2
         # Arrange data in list of depth cells and beams
-        percent_good_data['data'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes,
-                                                                     offset,
-                                                                     data['fixed_leader']['number_of_cells'],
-                                                                     data['fixed_leader']['number_of_beams'],
-                                                                     'B')
+        percent_good_data["data"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes,
+            offset,
+            data["fixed_leader"]["number_of_cells"],
+            data["fixed_leader"]["number_of_beams"],
+            "B",
+        )
 
         return percent_good_data
 
@@ -876,17 +938,19 @@ class Pd0TRDI(object):
             Dictionary of decoded data
         """
 
-        status_format = (('id', '<H', 0),)
+        status_format = (("id", "<H", 0),)
         # Unpack data
         status_data = Pd0TRDI.unpack_bytes(pd0_bytes, status_format, offset)
         # Move past id field
         offset += 2
         # Arrange data in list of depth cells and beams
-        status_data['data'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes,
-                                                               offset,
-                                                               data['fixed_leader']['number_of_cells'],
-                                                               data['fixed_leader']['number_of_beams'],
-                                                               'B')
+        status_data["data"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes,
+            offset,
+            data["fixed_leader"]["number_of_cells"],
+            data["fixed_leader"]["number_of_beams"],
+            "B",
+        )
 
         return status_data
 
@@ -908,23 +972,39 @@ class Pd0TRDI(object):
         bottom_track_data:dict
             Dictionary of decoded data
         """
-        bottom_track_format = (('id', '<H', 0),
-                               ('pings_per_ensemble_bp', '<H', 2),
-                               ('delay_before_reaquire', '<H', 4),
-                               ('correlation_magnitude_minimum_bc', 'B', 6),
-                               ('evaluation_amplitude_minimum_ba', 'B', 7),
-                               ('percent_good_minimum_bg', 'B', 8),
-                               ('bottom_track_mode_bm', 'B', 9),
-                               ('error_velocity_maximum_be', '<H', 10))
+        bottom_track_format = (
+            ("id", "<H", 0),
+            ("pings_per_ensemble_bp", "<H", 2),
+            ("delay_before_reaquire", "<H", 4),
+            ("correlation_magnitude_minimum_bc", "B", 6),
+            ("evaluation_amplitude_minimum_ba", "B", 7),
+            ("percent_good_minimum_bg", "B", 8),
+            ("bottom_track_mode_bm", "B", 9),
+            ("error_velocity_maximum_be", "<H", 10),
+        )
 
         bottom_track_data = Pd0TRDI.unpack_bytes(pd0_bytes, bottom_track_format, offset)
-        bottom_track_data['range_lsb'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 16, 1, 4, '<H')
-        bottom_track_data['velocity'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 24, 1, 4, '<h')
-        bottom_track_data['correlation'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 32, 1, 4, 'B')
-        bottom_track_data['amplitude'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 36, 1, 4, 'B')
-        bottom_track_data['percent_good'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 40, 1, 4, 'B')
-        bottom_track_data['rssi'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 72, 1, 4, 'B')
-        bottom_track_data['range_msb'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 77, 1, 4, 'B')
+        bottom_track_data["range_lsb"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 16, 1, 4, "<H"
+        )
+        bottom_track_data["velocity"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 24, 1, 4, "<h"
+        )
+        bottom_track_data["correlation"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 32, 1, 4, "B"
+        )
+        bottom_track_data["amplitude"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 36, 1, 4, "B"
+        )
+        bottom_track_data["percent_good"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 40, 1, 4, "B"
+        )
+        bottom_track_data["rssi"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 72, 1, 4, "B"
+        )
+        bottom_track_data["range_msb"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 77, 1, 4, "B"
+        )
 
         return bottom_track_data
 
@@ -945,15 +1025,17 @@ class Pd0TRDI(object):
         nmea_data:dict
             Dictionary of decoded data
         """
-        nmea_leader_format = (('id', '<H', 0),
-                              ('msg_id', '<H', 2),
-                              ('msg_size', '<H', 4),
-                              ('delta_time', 'd', 6))
+        nmea_leader_format = (
+            ("id", "<H", 0),
+            ("msg_id", "<H", 2),
+            ("msg_size", "<H", 4),
+            ("delta_time", "d", 6),
+        )
 
         nmea_data = Pd0TRDI.unpack_bytes(pd0_bytes, nmea_leader_format, offset)
-        if nmea_data['msg_id'] in self.nmea_decoders:
-            key = self.nmea_decoders[nmea_data['msg_id']][0]
-            decoder = self.nmea_decoders[nmea_data['msg_id']][1]
+        if nmea_data["msg_id"] in self.nmea_decoders:
+            key = self.nmea_decoders[nmea_data["msg_id"]][0]
+            decoder = self.nmea_decoders[nmea_data["msg_id"]][1]
             if key in data:
                 data[key].append(decoder(pd0_bytes, offset + 14, nmea_data))
             else:
@@ -980,34 +1062,38 @@ class Pd0TRDI(object):
         """
 
         # Define format
-        format = (('header', '10s', 0),
-                  ('utc', '10s', 10),
-                  ('lat_deg', 'd', 20),
-                  ('lat_ref', 'c', 28),
-                  ('lon_deg', 'd', 29),
-                  ('lon_ref', 'c', 37),
-                  ('corr_qual', 'B', 38),
-                  ('num_sats', 'B', 39),
-                  ('hdop', 'f', 40),
-                  ('alt', 'f', 44),
-                  ('alt_unit', 'c', 48),
-                  ('geoid', 'f', 49),
-                  ('geoid_unit', 'c', 53),
-                  ('d_gps_age', 'f', 54),
-                  ('ref_stat_id', '<H', 58))
+        fmt = (
+            ("header", "10s", 0),
+            ("utc", "10s", 10),
+            ("lat_deg", "d", 20),
+            ("lat_ref", "c", 28),
+            ("lon_deg", "d", 29),
+            ("lon_ref", "c", 37),
+            ("corr_qual", "B", 38),
+            ("num_sats", "B", 39),
+            ("hdop", "f", 40),
+            ("alt", "f", 44),
+            ("alt_unit", "c", 48),
+            ("geoid", "f", 49),
+            ("geoid_unit", "c", 53),
+            ("d_gps_age", "f", 54),
+            ("ref_stat_id", "<H", 58),
+        )
 
         # Decode data
-        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, format, offset)
-        decoded_data['header'] = Pd0TRDI.bin2str(decoded_data['header']).rstrip('\x00')
+        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, fmt, offset)
+        decoded_data["header"] = Pd0TRDI.bin2str(decoded_data["header"]).rstrip("\x00")
         try:
-            decoded_data['utc'] = float(re.findall(b'^\d+\.\d+|\d+', decoded_data['utc'])[0])
+            decoded_data["utc"] = float(
+                re.findall(b"^\d+\.\d+|\d+", decoded_data["utc"])[0]
+            )
         except BaseException:
-            decoded_data['utc'] = np.nan
-        decoded_data['lat_ref'] = Pd0TRDI.bin2str(decoded_data['lat_ref'])
-        decoded_data['lon_ref'] = Pd0TRDI.bin2str(decoded_data['lon_ref'])
-        decoded_data['geoid_unit'] = Pd0TRDI.bin2str(decoded_data['geoid_unit'])
-        decoded_data['alt_unit'] = Pd0TRDI.bin2str(decoded_data['alt_unit'])
-        decoded_data['delta_time'] = data['delta_time']
+            decoded_data["utc"] = np.nan
+        decoded_data["lat_ref"] = Pd0TRDI.bin2str(decoded_data["lat_ref"])
+        decoded_data["lon_ref"] = Pd0TRDI.bin2str(decoded_data["lon_ref"])
+        decoded_data["geoid_unit"] = Pd0TRDI.bin2str(decoded_data["geoid_unit"])
+        decoded_data["alt_unit"] = Pd0TRDI.bin2str(decoded_data["alt_unit"])
+        decoded_data["delta_time"] = data["delta_time"]
 
         return decoded_data
 
@@ -1031,25 +1117,29 @@ class Pd0TRDI(object):
         """
 
         # Define format
-        format = (('header', '10s', 0),
-                  ('course_true', 'f', 10),
-                  ('true_indicator', 'c', 14),
-                  ('course_mag', 'f', 15),
-                  ('mag_indicator', 'c', 19),
-                  ('speed_knots', 'f', 20),
-                  ('knots_indicator', 'c', 24),
-                  ('speed_kph', 'f', 25),
-                  ('kph_indicator', 'c', 29),
-                  ('mode_indicator', 'c', 30))
+        fmt = (
+            ("header", "10s", 0),
+            ("course_true", "f", 10),
+            ("true_indicator", "c", 14),
+            ("course_mag", "f", 15),
+            ("mag_indicator", "c", 19),
+            ("speed_knots", "f", 20),
+            ("knots_indicator", "c", 24),
+            ("speed_kph", "f", 25),
+            ("kph_indicator", "c", 29),
+            ("mode_indicator", "c", 30),
+        )
 
         # Decode data
-        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, format, offset)
-        decoded_data['header'] = Pd0TRDI.bin2str(decoded_data['header']).rstrip('\x00')
-        decoded_data['true_indicator'] = Pd0TRDI.bin2str(decoded_data['true_indicator'])
-        decoded_data['mag_indicator'] = Pd0TRDI.bin2str(decoded_data['mag_indicator'])
-        decoded_data['knots_indicator'] = Pd0TRDI.bin2str(decoded_data['knots_indicator'])
-        decoded_data['kph_indicator'] = Pd0TRDI.bin2str(decoded_data['kph_indicator'])
-        decoded_data['delta_time'] = data['delta_time']
+        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, fmt, offset)
+        decoded_data["header"] = Pd0TRDI.bin2str(decoded_data["header"]).rstrip("\x00")
+        decoded_data["true_indicator"] = Pd0TRDI.bin2str(decoded_data["true_indicator"])
+        decoded_data["mag_indicator"] = Pd0TRDI.bin2str(decoded_data["mag_indicator"])
+        decoded_data["knots_indicator"] = Pd0TRDI.bin2str(
+            decoded_data["knots_indicator"]
+        )
+        decoded_data["kph_indicator"] = Pd0TRDI.bin2str(decoded_data["kph_indicator"])
+        decoded_data["delta_time"] = data["delta_time"]
 
         return decoded_data
 
@@ -1073,21 +1163,23 @@ class Pd0TRDI(object):
         """
 
         # Define format
-        format = (('header', '10s', 0),
-                  ('depth_ft', 'f', 10),
-                  ('ft_indicator', 'c', 14),
-                  ('depth_m', 'f', 15),
-                  ('m_indicator', 'c', 19),
-                  ('depth_fath', 'f', 20),
-                  ('fath_indicator', 'c', 24))
+        fmt = (
+            ("header", "10s", 0),
+            ("depth_ft", "f", 10),
+            ("ft_indicator", "c", 14),
+            ("depth_m", "f", 15),
+            ("m_indicator", "c", 19),
+            ("depth_fath", "f", 20),
+            ("fath_indicator", "c", 24),
+        )
 
         # Decode data
-        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, format, offset)
-        decoded_data['header'] = Pd0TRDI.bin2str(decoded_data['header']).rstrip('\x00')
-        decoded_data['ft_indicator'] = Pd0TRDI.bin2str(decoded_data['ft_indicator'])
-        decoded_data['m_indicator'] = Pd0TRDI.bin2str(decoded_data['m_indicator'])
-        decoded_data['fath_indicator'] = Pd0TRDI.bin2str(decoded_data['fath_indicator'])
-        decoded_data['delta_time'] = data['delta_time']
+        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, fmt, offset)
+        decoded_data["header"] = Pd0TRDI.bin2str(decoded_data["header"]).rstrip("\x00")
+        decoded_data["ft_indicator"] = Pd0TRDI.bin2str(decoded_data["ft_indicator"])
+        decoded_data["m_indicator"] = Pd0TRDI.bin2str(decoded_data["m_indicator"])
+        decoded_data["fath_indicator"] = Pd0TRDI.bin2str(decoded_data["fath_indicator"])
+        decoded_data["delta_time"] = data["delta_time"]
 
         return decoded_data
 
@@ -1111,21 +1203,26 @@ class Pd0TRDI(object):
         """
 
         # Define format
-        format = (('header', '10s', 0),
-                  ('heading_deg', 'd', 10),
-                  ('h_true_indicator', 'c', 14))
+        fmt = (
+            ("header", "10s", 0),
+            ("heading_deg", "d", 10),
+            ("h_true_indicator", "c", 14),
+        )
 
         # Decode data
-        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, format, offset)
-        decoded_data['header'] = Pd0TRDI.bin2str(decoded_data['header']).rstrip('\x00')
-        decoded_data['h_true_indicator'] = Pd0TRDI.bin2str(decoded_data['h_true_indicator'])
-        decoded_data['delta_time'] = data['delta_time']
+        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, fmt, offset)
+        decoded_data["header"] = Pd0TRDI.bin2str(decoded_data["header"]).rstrip("\x00")
+        decoded_data["h_true_indicator"] = Pd0TRDI.bin2str(
+            decoded_data["h_true_indicator"]
+        )
+        decoded_data["delta_time"] = data["delta_time"]
 
         return decoded_data
 
     @staticmethod
     def decode_gga_104(pd0_bytes, offset, data):
-        """Decodes gga data for WinRiver 2.00 and greater with ADCP's without integrated NMEA data
+        """Decodes gga data for WinRiver 2.00 and greater with ADCP's without
+        integrated NMEA data
 
         Parameters
         ----------
@@ -1143,40 +1240,45 @@ class Pd0TRDI(object):
         """
 
         # Define format
-        format = (('header', '7s', 0),
-                  ('utc', '10s', 7),
-                  ('lat_deg', 'd', 17),
-                  ('lat_ref', 'c', 25),
-                  ('lon_deg', 'd', 26),
-                  ('lon_ref', 'c', 34),
-                  ('corr_qual', 'B', 35),
-                  ('num_sats', 'B', 36),
-                  ('hdop', 'f', 37),
-                  ('alt', 'f', 41),
-                  ('alt_unit', 'c', 45),
-                  ('geoid', 'f', 46),
-                  ('geoid_unit', 'c', 50),
-                  ('d_gps_age', 'f', 51),
-                  ('ref_stat_id', '<H', 55))
+        fmt = (
+            ("header", "7s", 0),
+            ("utc", "10s", 7),
+            ("lat_deg", "d", 17),
+            ("lat_ref", "c", 25),
+            ("lon_deg", "d", 26),
+            ("lon_ref", "c", 34),
+            ("corr_qual", "B", 35),
+            ("num_sats", "B", 36),
+            ("hdop", "f", 37),
+            ("alt", "f", 41),
+            ("alt_unit", "c", 45),
+            ("geoid", "f", 46),
+            ("geoid_unit", "c", 50),
+            ("d_gps_age", "f", 51),
+            ("ref_stat_id", "<H", 55),
+        )
 
         # Decode data
-        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, format, offset)
-        decoded_data['header'] = Pd0TRDI.bin2str(decoded_data['header']).rstrip('\x00')
+        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, fmt, offset)
+        decoded_data["header"] = Pd0TRDI.bin2str(decoded_data["header"]).rstrip("\x00")
         try:
-            decoded_data['utc'] = float(re.findall(b'^\d+\.\d+|\d+', decoded_data['utc'])[0])
+            decoded_data["utc"] = float(
+                re.findall(b"^\d+\.\d+|\d+", decoded_data["utc"])[0]
+            )
         except BaseException:
-            decoded_data['utc'] = np.nan
-        decoded_data['lat_ref'] = Pd0TRDI.bin2str(decoded_data['lat_ref'])
-        decoded_data['lon_ref'] = Pd0TRDI.bin2str(decoded_data['lon_ref'])
-        decoded_data['geoid_unit'] = Pd0TRDI.bin2str(decoded_data['geoid_unit'])
-        decoded_data['alt_unit'] = Pd0TRDI.bin2str(decoded_data['alt_unit'])
-        decoded_data['delta_time'] = data['delta_time']
+            decoded_data["utc"] = np.nan
+        decoded_data["lat_ref"] = Pd0TRDI.bin2str(decoded_data["lat_ref"])
+        decoded_data["lon_ref"] = Pd0TRDI.bin2str(decoded_data["lon_ref"])
+        decoded_data["geoid_unit"] = Pd0TRDI.bin2str(decoded_data["geoid_unit"])
+        decoded_data["alt_unit"] = Pd0TRDI.bin2str(decoded_data["alt_unit"])
+        decoded_data["delta_time"] = data["delta_time"]
 
         return decoded_data
 
     @staticmethod
     def decode_vtg_105(pd0_bytes, offset, data):
-        """Decodes vtg data for WinRiver 2.00 and greater with ADCP's without integrated NMEA data
+        """Decodes vtg data for WinRiver 2.00 and greater with ADCP's without
+        integrated NMEA data
 
         Parameters
         ----------
@@ -1194,31 +1296,36 @@ class Pd0TRDI(object):
         """
 
         # Define format
-        format = (('header', '7s', 0),
-                  ('course_true', 'f', 7),
-                  ('true_indicator', 'c', 11),
-                  ('course_mag', 'f', 12),
-                  ('mag_indicator', 'c', 16),
-                  ('speed_knots', 'f', 17),
-                  ('knots_indicator', 'c', 21),
-                  ('speed_kph', 'f', 22),
-                  ('kph_indicator', 'c', 26),
-                  ('mode_indicator', 'c', 27))
+        fmt = (
+            ("header", "7s", 0),
+            ("course_true", "f", 7),
+            ("true_indicator", "c", 11),
+            ("course_mag", "f", 12),
+            ("mag_indicator", "c", 16),
+            ("speed_knots", "f", 17),
+            ("knots_indicator", "c", 21),
+            ("speed_kph", "f", 22),
+            ("kph_indicator", "c", 26),
+            ("mode_indicator", "c", 27),
+        )
 
         # Decode data
-        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, format, offset)
-        decoded_data['header'] = Pd0TRDI.bin2str(decoded_data['header']).rstrip('\x00')
-        decoded_data['true_indicator'] = Pd0TRDI.bin2str(decoded_data['true_indicator'])
-        decoded_data['mag_indicator'] = Pd0TRDI.bin2str(decoded_data['mag_indicator'])
-        decoded_data['knots_indicator'] = Pd0TRDI.bin2str(decoded_data['knots_indicator'])
-        decoded_data['kph_indicator'] = Pd0TRDI.bin2str(decoded_data['kph_indicator'])
-        decoded_data['delta_time'] = data['delta_time']
+        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, fmt, offset)
+        decoded_data["header"] = Pd0TRDI.bin2str(decoded_data["header"]).rstrip("\x00")
+        decoded_data["true_indicator"] = Pd0TRDI.bin2str(decoded_data["true_indicator"])
+        decoded_data["mag_indicator"] = Pd0TRDI.bin2str(decoded_data["mag_indicator"])
+        decoded_data["knots_indicator"] = Pd0TRDI.bin2str(
+            decoded_data["knots_indicator"]
+        )
+        decoded_data["kph_indicator"] = Pd0TRDI.bin2str(decoded_data["kph_indicator"])
+        decoded_data["delta_time"] = data["delta_time"]
 
         return decoded_data
 
     @staticmethod
     def decode_ds_106(pd0_bytes, offset, data):
-        """Decodes depth sounder for WinRiver 2.00 and greater with ADCP's without integrated NMEA data
+        """Decodes depth sounder for WinRiver 2.00 and greater with ADCP's
+        without integrated NMEA data
 
         Parameters
         ----------
@@ -1236,27 +1343,30 @@ class Pd0TRDI(object):
         """
 
         # Define format
-        format = (('header', '7s', 0),
-                  ('depth_ft', 'f', 7),
-                  ('ft_indicator', 'c', 11),
-                  ('depth_m', 'f', 12),
-                  ('m_indicator', 'c', 16),
-                  ('depth_fath', 'f', 17),
-                  ('fath_indicator', 'c', 21))
+        fmt = (
+            ("header", "7s", 0),
+            ("depth_ft", "f", 7),
+            ("ft_indicator", "c", 11),
+            ("depth_m", "f", 12),
+            ("m_indicator", "c", 16),
+            ("depth_fath", "f", 17),
+            ("fath_indicator", "c", 21),
+        )
 
         # Decode data
-        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, format, offset)
-        decoded_data['header'] = Pd0TRDI.bin2str(decoded_data['header']).rstrip('\x00')
-        decoded_data['ft_indicator'] = Pd0TRDI.bin2str(decoded_data['ft_indicator'])
-        decoded_data['m_indicator'] = Pd0TRDI.bin2str(decoded_data['m_indicator'])
-        decoded_data['fath_indicator'] = Pd0TRDI.bin2str(decoded_data['fath_indicator'])
-        decoded_data['delta_time'] = data['delta_time']
+        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, fmt, offset)
+        decoded_data["header"] = Pd0TRDI.bin2str(decoded_data["header"]).rstrip("\x00")
+        decoded_data["ft_indicator"] = Pd0TRDI.bin2str(decoded_data["ft_indicator"])
+        decoded_data["m_indicator"] = Pd0TRDI.bin2str(decoded_data["m_indicator"])
+        decoded_data["fath_indicator"] = Pd0TRDI.bin2str(decoded_data["fath_indicator"])
+        decoded_data["delta_time"] = data["delta_time"]
 
         return decoded_data
 
     @staticmethod
     def decode_ext_heading_107(pd0_bytes, offset, data):
-        """Decodes external heading for WinRiver 2.00 and greater with ADCP's without integrated NMEA data
+        """Decodes external heading for WinRiver 2.00 and greater with
+        ADCP's without integrated NMEA data
 
         Parameters
         ----------
@@ -1274,22 +1384,26 @@ class Pd0TRDI(object):
         """
 
         # Define format
-        format = (('header', '7s', 0),
-                  ('heading_deg', 'd', 7),
-                  ('h_true_indicator', 'c', 15))
+        fmt = (
+            ("header", "7s", 0),
+            ("heading_deg", "d", 7),
+            ("h_true_indicator", "c", 15),
+        )
 
         # Decode data
-        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, format, offset)
-        decoded_data['header'] = Pd0TRDI.bin2str(decoded_data['header']).rstrip('\x00')
-        if abs(decoded_data['heading_deg']) < 360:
+        decoded_data = Pd0TRDI.unpack_bytes(pd0_bytes, fmt, offset)
+        decoded_data["header"] = Pd0TRDI.bin2str(decoded_data["header"]).rstrip("\x00")
+        if abs(decoded_data["heading_deg"]) < 360:
             try:
-                decoded_data['h_true_indicator'] = Pd0TRDI.bin2str(decoded_data['h_true_indicator'])
+                decoded_data["h_true_indicator"] = Pd0TRDI.bin2str(
+                    decoded_data["h_true_indicator"]
+                )
             except:
-                decoded_data['h_true_indicator'] = ''
+                decoded_data["h_true_indicator"] = ""
         else:
-            decoded_data['heading_deg'] = np.nan
-            decoded_data['h_true_indicator'] = ''
-        decoded_data['delta_time'] = data['delta_time']
+            decoded_data["heading_deg"] = np.nan
+            decoded_data["h_true_indicator"] = ""
+        decoded_data["delta_time"] = data["delta_time"]
 
         return decoded_data
 
@@ -1313,54 +1427,61 @@ class Pd0TRDI(object):
         """
 
         # Initialize dictionary
-        decoded_data = {}
-        decoded_data['header'] = ''
-        decoded_data['utc'] = np.nan
-        decoded_data['lat_deg'] = np.nan
-        decoded_data['lat_ref'] = ''
-        decoded_data['lon_deg'] = np.nan
-        decoded_data['lon_ref'] = ''
-        decoded_data['corr_qual'] = np.nan
-        decoded_data['num_sats'] = np.nan
-        decoded_data['hdop'] = np.nan
-        decoded_data['alt'] = np.nan
-        decoded_data['alt_unit'] = ''
-        decoded_data['geoid'] = ''
-        decoded_data['geoid_unit'] = ''
-        decoded_data['d_gps_age'] = np.nan
-        decoded_data['ref_stat_id'] = np.nan
-        decoded_data['delta_time'] = np.nan
+        decoded_data = {
+            "header": "",
+            "utc": np.nan,
+            "lat_deg": np.nan,
+            "lat_ref": "",
+            "lon_deg": np.nan,
+            "lon_ref": "",
+            "corr_qual": np.nan,
+            "num_sats": np.nan,
+            "hdop": np.nan,
+            "alt": np.nan,
+            "alt_unit": "",
+            "geoid": "",
+            "geoid_unit": "",
+            "d_gps_age": np.nan,
+            "ref_stat_id": np.nan,
+            "delta_time": np.nan,
+        }
 
         # Decode NMEA sentence and split into an array
-        format = str(data['msg_size']) + 'c'
-        sentence = Pd0TRDI.bin2str(b''.join(list(struct.unpack(format, pd0_bytes[offset: offset + data['msg_size']]))))
-        temp_array = np.array(sentence.split(','))
-        temp_array[temp_array == '999.9'] = ''
+        fmt = str(data["msg_size"]) + "c"
+        sentence = Pd0TRDI.bin2str(
+            b"".join(
+                list(struct.unpack(fmt, pd0_bytes[offset : offset + data["msg_size"]]))
+            )
+        )
+        temp_array = np.array(sentence.split(","))
+        temp_array[temp_array == "999.9"] = ""
 
         # Assign parts of array to dictionary
         try:
-            decoded_data['delta_time'] = data['delta_time']
-            decoded_data['header'] = temp_array[0]
-            decoded_data['utc'] = valid_number(temp_array[1])
+            decoded_data["delta_time"] = data["delta_time"]
+            decoded_data["header"] = temp_array[0]
+            decoded_data["utc"] = valid_number(temp_array[1])
             lat_str = temp_array[2]
             lat_deg = valid_number(lat_str[0:2])
-            decoded_data['lat_deg'] = lat_deg + valid_number(lat_str[2:]) / 60
-            decoded_data['lat_ref'] = temp_array[3]
+            decoded_data["lat_deg"] = lat_deg + valid_number(lat_str[2:]) / 60
+            decoded_data["lat_ref"] = temp_array[3]
             lon_str = temp_array[4]
             lon_num = valid_number(lon_str)
-            lon_deg = np.floor(lon_num / 100.)
-            decoded_data['lon_deg'] = lon_deg + (((lon_num / 100.) - lon_deg) * 100.) / 60.
-            decoded_data['lon_ref'] = temp_array[5]
-            decoded_data['corr_qual'] = valid_number(temp_array[6])
-            decoded_data['num_sats'] = valid_number(temp_array[7])
-            decoded_data['hdop'] = valid_number(temp_array[8])
-            decoded_data['alt'] = valid_number(temp_array[9])
-            decoded_data['alt_unit'] = temp_array[10]
-            decoded_data['geoid'] = temp_array[11]
-            decoded_data['geoid_unit'] = temp_array[12]
-            decoded_data['d_gps_age'] = valid_number(temp_array[13])
-            idx_star = temp_array[14].find('*')
-            decoded_data['ref_stat_id'] = valid_number(temp_array[15][:idx_star])
+            lon_deg = np.floor(lon_num / 100.0)
+            decoded_data["lon_deg"] = (
+                lon_deg + (((lon_num / 100.0) - lon_deg) * 100.0) / 60.0
+            )
+            decoded_data["lon_ref"] = temp_array[5]
+            decoded_data["corr_qual"] = valid_number(temp_array[6])
+            decoded_data["num_sats"] = valid_number(temp_array[7])
+            decoded_data["hdop"] = valid_number(temp_array[8])
+            decoded_data["alt"] = valid_number(temp_array[9])
+            decoded_data["alt_unit"] = temp_array[10]
+            decoded_data["geoid"] = temp_array[11]
+            decoded_data["geoid_unit"] = temp_array[12]
+            decoded_data["d_gps_age"] = valid_number(temp_array[13])
+            idx_star = temp_array[14].find("*")
+            decoded_data["ref_stat_id"] = valid_number(temp_array[15][:idx_star])
 
         except (ValueError, EOFError, IndexError):
             pass
@@ -1387,39 +1508,44 @@ class Pd0TRDI(object):
         """
 
         # Initialize dictionary
-        decoded_data = {}
-        decoded_data['header'] = ''
-        decoded_data['course_true'] = np.nan
-        decoded_data['true_indicator'] = ''
-        decoded_data['course_mag'] = np.nan
-        decoded_data['mag_indicator'] = ''
-        decoded_data['speed_knots'] = np.nan
-        decoded_data['knots_indicator'] = ''
-        decoded_data['speed_kph'] = np.nan
-        decoded_data['kph_indicator'] = ''
-        decoded_data['mode_indicator'] = ''
-        decoded_data['delta_time'] = np.nan
+        decoded_data = {
+            "header": "",
+            "course_true": np.nan,
+            "true_indicator": "",
+            "course_mag": np.nan,
+            "mag_indicator": "",
+            "speed_knots": np.nan,
+            "knots_indicator": "",
+            "speed_kph": np.nan,
+            "kph_indicator": "",
+            "mode_indicator": "",
+            "delta_time": np.nan,
+        }
 
         # Decode NMEA sentence and split into an array
-        format = str(data['msg_size']) + 'c'
-        sentence = Pd0TRDI.bin2str(b''.join(list(struct.unpack(format, pd0_bytes[offset: offset + data['msg_size']]))))
-        temp_array = np.array(sentence.split(','))
-        temp_array[temp_array == '999.9'] = ''
+        fmt = str(data["msg_size"]) + "c"
+        sentence = Pd0TRDI.bin2str(
+            b"".join(
+                list(struct.unpack(fmt, pd0_bytes[offset : offset + data["msg_size"]]))
+            )
+        )
+        temp_array = np.array(sentence.split(","))
+        temp_array[temp_array == "999.9"] = ""
 
         # Assign parts of array to dictionary
         try:
-            decoded_data['vtg_header'] = temp_array[0]
-            decoded_data['course_true'] = valid_number(temp_array[1])
-            decoded_data['true_indicator'] = temp_array[2]
-            decoded_data['course_mag'] = valid_number(temp_array[3])
-            decoded_data['mag_indicator'] = temp_array[4]
-            decoded_data['speed_knots'] = valid_number(temp_array[5])
-            decoded_data['knots_indicator'] = temp_array[6]
-            decoded_data['speed_kph'] = valid_number(temp_array[7])
-            decoded_data['kph_indicator'] = temp_array[8]
-            idx_star = temp_array[9].find('*')
-            decoded_data['mode_indicator'] = temp_array[9][:idx_star]
-            decoded_data['delta_time'] = data['delta_time']
+            decoded_data["vtg_header"] = temp_array[0]
+            decoded_data["course_true"] = valid_number(temp_array[1])
+            decoded_data["true_indicator"] = temp_array[2]
+            decoded_data["course_mag"] = valid_number(temp_array[3])
+            decoded_data["mag_indicator"] = temp_array[4]
+            decoded_data["speed_knots"] = valid_number(temp_array[5])
+            decoded_data["knots_indicator"] = temp_array[6]
+            decoded_data["speed_kph"] = valid_number(temp_array[7])
+            decoded_data["kph_indicator"] = temp_array[8]
+            idx_star = temp_array[9].find("*")
+            decoded_data["mode_indicator"] = temp_array[9][:idx_star]
+            decoded_data["delta_time"] = data["delta_time"]
 
         except (ValueError, EOFError, IndexError):
             pass
@@ -1446,33 +1572,38 @@ class Pd0TRDI(object):
         """
 
         # Initialize dictionary
-        decoded_data = {}
-        decoded_data['header'] = ''
-        decoded_data['depth_ft'] = np.nan
-        decoded_data['ft_indicator'] = ''
-        decoded_data['depth_m'] = np.nan
-        decoded_data['m_indicator'] = ''
-        decoded_data['depth_fath'] = np.nan
-        decoded_data['fath_indicator'] = ''
-        decoded_data['delta_time'] = np.nan
+        decoded_data = {
+            "header": "",
+            "depth_ft": np.nan,
+            "ft_indicator": "",
+            "depth_m": np.nan,
+            "m_indicator": "",
+            "depth_fath": np.nan,
+            "fath_indicator": "",
+            "delta_time": np.nan,
+        }
 
         # Decode NMEA sentence and split into an array
-        format = str(data['msg_size']) + 'c'
-        sentence = Pd0TRDI.bin2str(b''.join(list(struct.unpack(format, pd0_bytes[offset: offset + data['msg_size']]))))
-        temp_array = np.array(sentence.split(','))
-        temp_array[temp_array == '999.9'] = ''
+        fmt = str(data["msg_size"]) + "c"
+        sentence = Pd0TRDI.bin2str(
+            b"".join(
+                list(struct.unpack(fmt, pd0_bytes[offset : offset + data["msg_size"]]))
+            )
+        )
+        temp_array = np.array(sentence.split(","))
+        temp_array[temp_array == "999.9"] = ""
 
         # Assign parts of array to dictionary
         try:
-            decoded_data['dbt_header'] = temp_array[0]
-            decoded_data['depth_ft'] = valid_number(temp_array[1])
-            decoded_data['ft_indicator'] = temp_array[2]
-            decoded_data['depth_m'] = valid_number(temp_array[3])
-            decoded_data['m_indicator'] = temp_array[4]
-            decoded_data['depth_fath'] = valid_number(temp_array[5])
-            idx_star = temp_array[6].find('*')
-            decoded_data['fath_indicator'] = temp_array[6][:idx_star]
-            decoded_data['delta_time'] = data['delta_time']
+            decoded_data["dbt_header"] = temp_array[0]
+            decoded_data["depth_ft"] = valid_number(temp_array[1])
+            decoded_data["ft_indicator"] = temp_array[2]
+            decoded_data["depth_m"] = valid_number(temp_array[3])
+            decoded_data["m_indicator"] = temp_array[4]
+            decoded_data["depth_fath"] = valid_number(temp_array[5])
+            idx_star = temp_array[6].find("*")
+            decoded_data["fath_indicator"] = temp_array[6][:idx_star]
+            decoded_data["delta_time"] = data["delta_time"]
 
         except (ValueError, EOFError, IndexError):
             pass
@@ -1499,25 +1630,30 @@ class Pd0TRDI(object):
         """
 
         # Initialize dictionary
-        decoded_data = {}
-        decoded_data['header'] = ''
-        decoded_data['heading_deg'] = np.nan
-        decoded_data['h_true_indicator'] = ''
-        decoded_data['delta_time'] = np.nan
+        decoded_data = {
+            "header": "",
+            "heading_deg": np.nan,
+            "h_true_indicator": "",
+            "delta_time": np.nan,
+        }
 
         # Decode NMEA sentence and split into an array
-        format = str(data['msg_size']) + 'c'
-        sentence = Pd0TRDI.bin2str(b''.join(list(struct.unpack(format, pd0_bytes[offset: offset + data['msg_size']]))))
-        temp_array = np.array(sentence.split(','))
-        temp_array[temp_array == '999.9'] = ''
+        fmt = str(data["msg_size"]) + "c"
+        sentence = Pd0TRDI.bin2str(
+            b"".join(
+                list(struct.unpack(fmt, pd0_bytes[offset : offset + data["msg_size"]]))
+            )
+        )
+        temp_array = np.array(sentence.split(","))
+        temp_array[temp_array == "999.9"] = ""
 
         # Assign parts of array to dictionary
         try:
-            decoded_data['header'] = temp_array[0]
-            decoded_data['heading_deg'] = valid_number(temp_array[1])
-            idx_star = temp_array[2].find('*')
-            decoded_data['h_true_indicator'] = temp_array[2][:idx_star]
-            decoded_data['delta_time'] = data['delta_time']
+            decoded_data["header"] = temp_array[0]
+            decoded_data["heading_deg"] = valid_number(temp_array[1])
+            idx_star = temp_array[2].find("*")
+            decoded_data["h_true_indicator"] = temp_array[2][:idx_star]
+            decoded_data["delta_time"] = data["delta_time"]
 
         except (ValueError, EOFError, IndexError):
             pass
@@ -1543,7 +1679,7 @@ class Pd0TRDI(object):
             Dictionary of decoded data
         """
 
-        return Pd0TRDI.decode_nmea_sentence(pd0_bytes, offset, data, 'dbt_sentence')
+        return Pd0TRDI.decode_nmea_sentence(pd0_bytes, offset, data, "dbt_sentence")
 
     @staticmethod
     def decode_gga_sentence(pd0_bytes, offset, data):
@@ -1564,7 +1700,7 @@ class Pd0TRDI(object):
             Dictionary of decoded data
         """
 
-        return Pd0TRDI.decode_nmea_sentence(pd0_bytes, offset, data, 'gga_sentence')
+        return Pd0TRDI.decode_nmea_sentence(pd0_bytes, offset, data, "gga_sentence")
 
     @staticmethod
     def decode_vtg_sentence(pd0_bytes, offset, data):
@@ -1585,7 +1721,7 @@ class Pd0TRDI(object):
             Dictionary of decoded data
         """
 
-        return Pd0TRDI.decode_nmea_sentence(pd0_bytes, offset, data, 'vtg_sentence')
+        return Pd0TRDI.decode_nmea_sentence(pd0_bytes, offset, data, "vtg_sentence")
 
     @staticmethod
     def decode_gsa_sentence(pd0_bytes, offset, data):
@@ -1606,7 +1742,7 @@ class Pd0TRDI(object):
             Dictionary of decoded data
         """
 
-        return Pd0TRDI.decode_nmea_sentence(pd0_bytes, offset, data, 'gsa_sentence')
+        return Pd0TRDI.decode_nmea_sentence(pd0_bytes, offset, data, "gsa_sentence")
 
     @staticmethod
     def decode_nmea_sentence(pd0_bytes, offset, data, target):
@@ -1630,25 +1766,28 @@ class Pd0TRDI(object):
         """
 
         # Compute number of characters in the sentence
-        offset_idx = data['header']['address_offsets'].index(offset)
+        offset_idx = data["header"]["address_offsets"].index(offset)
 
-        if offset_idx + 1 == data['header']['number_of_data_types']:
-            end_offset = data['header']['number_of_bytes']
+        if offset_idx + 1 == data["header"]["number_of_data_types"]:
+            end_offset = data["header"]["number_of_bytes"]
         else:
-            end_offset = data['header']['address_offsets'][offset_idx + 1]
-        number_of_characters = end_offset - data['header']['address_offsets'][offset_idx]
+            end_offset = data["header"]["address_offsets"][offset_idx + 1]
+        number_of_characters = (
+            end_offset - data["header"]["address_offsets"][offset_idx]
+        )
 
         # Generate format string
-        format_str = str(number_of_characters - 4) + 'c'
-        format = (('sentence', format_str, 0))
-        offset = data['header']['address_offsets'][offset_idx]
+        format_str = str(number_of_characters - 4) + "c"
+        offset = data["header"]["address_offsets"][offset_idx]
         # Decode data
-        sentence = struct.unpack(format_str, pd0_bytes[offset + 4: offset + number_of_characters ])
+        sentence = struct.unpack(
+            format_str, pd0_bytes[offset + 4 : offset + number_of_characters]
+        )
         try:
-            end_of_sentence = sentence.index(b'\n') + 1
-            sentence = b''.join(sentence[0:end_of_sentence]).decode('utf-8')
+            end_of_sentence = sentence.index(b"\n") + 1
+            sentence = b"".join(sentence[0:end_of_sentence]).decode("utf-8")
         except ValueError:
-            sentence = ''
+            sentence = ""
         # Create or add to list of target sentences
         if target in data:
             decoded_data = data[target]
@@ -1676,12 +1815,16 @@ class Pd0TRDI(object):
         surface_leader_data:dict
             Dictionary of decoded data
         """
-        surface_leader_format = (('id', '<H', 0),
-                                 ('cell_count', 'B', 2),
-                                 ('cell_size', '<H', 3),
-                                 ('range_cell_1', '<H', 5))
+        surface_leader_format = (
+            ("id", "<H", 0),
+            ("cell_count", "B", 2),
+            ("cell_size", "<H", 3),
+            ("range_cell_1", "<H", 5),
+        )
 
-        surface_leader_data = Pd0TRDI.unpack_bytes(pd0_bytes, surface_leader_format, offset)
+        surface_leader_data = Pd0TRDI.unpack_bytes(
+            pd0_bytes, surface_leader_format, offset
+        )
         return surface_leader_data
 
     @staticmethod
@@ -1702,12 +1845,14 @@ class Pd0TRDI(object):
         surface_velocity_data:dict
             Dictionary of decoded data
         """
-        surface_velocity_format = (('id', '<H', 0),)
+        surface_velocity_format = (("id", "<H", 0),)
 
-        surface_velocity_data = Pd0TRDI.unpack_bytes(pd0_bytes, surface_velocity_format, offset)
-        surface_velocity_data['velocity'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 2,
-                                                                             data['surface_leader']['cell_count'],
-                                                                             4, '<h')
+        surface_velocity_data = Pd0TRDI.unpack_bytes(
+            pd0_bytes, surface_velocity_format, offset
+        )
+        surface_velocity_data["velocity"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 2, data["surface_leader"]["cell_count"], 4, "<h"
+        )
         return surface_velocity_data
 
     @staticmethod
@@ -1728,12 +1873,14 @@ class Pd0TRDI(object):
         surface_velocity_data:dict
             Dictionary of decoded data
         """
-        surface_correlation_format = (('id', '<H', 0),)
+        surface_correlation_format = (("id", "<H", 0),)
 
-        surface_correlation_data = Pd0TRDI.unpack_bytes(pd0_bytes, surface_correlation_format, offset)
-        surface_correlation_data['correlation'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 2,
-                                                                                   data['surface_leader']['cell_count'],
-                                                                                   4, 'B')
+        surface_correlation_data = Pd0TRDI.unpack_bytes(
+            pd0_bytes, surface_correlation_format, offset
+        )
+        surface_correlation_data["correlation"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 2, data["surface_leader"]["cell_count"], 4, "B"
+        )
         return surface_correlation_data
 
     @staticmethod
@@ -1754,12 +1901,12 @@ class Pd0TRDI(object):
         surface_rssi_data:dict
             Dictionary of decoded data
         """
-        surface_rssi_format = (('id', '<H', 0),)
+        surface_rssi_format = (("id", "<H", 0),)
 
         surface_rssi_data = Pd0TRDI.unpack_bytes(pd0_bytes, surface_rssi_format, offset)
-        surface_rssi_data['rssi'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 2,
-                                                                     data['surface_leader']['cell_count'],
-                                                                     4, 'B')
+        surface_rssi_data["rssi"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 2, data["surface_leader"]["cell_count"], 4, "B"
+        )
         return surface_rssi_data
 
     @staticmethod
@@ -1780,12 +1927,14 @@ class Pd0TRDI(object):
         surface_per_good_data:dict
             Dictionary of decoded data
         """
-        surface_per_good_format = (('id', '<H', 0),)
+        surface_per_good_format = (("id", "<H", 0),)
 
-        surface_per_good_data = Pd0TRDI.unpack_bytes(pd0_bytes, surface_per_good_format, offset)
-        surface_per_good_data['percent_good'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 2,
-                                                                                 data['surface_leader']['cell_count'],
-                                                                                 4, 'B')
+        surface_per_good_data = Pd0TRDI.unpack_bytes(
+            pd0_bytes, surface_per_good_format, offset
+        )
+        surface_per_good_data["percent_good"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 2, data["surface_leader"]["cell_count"], 4, "B"
+        )
         return surface_per_good_data
 
     @staticmethod
@@ -1806,12 +1955,14 @@ class Pd0TRDI(object):
         surface_statusdata:dict
             Dictionary of decoded data
         """
-        surface_status_format = (('id', '<H', 0),)
+        surface_status_format = (("id", "<H", 0),)
 
-        surface_status_data = Pd0TRDI.unpack_bytes(pd0_bytes, surface_status_format, offset)
-        surface_status_data['percent_good'] = Pd0TRDI.decode_per_cell_per_beam(pd0_bytes, offset + 2,
-                                                                               data['surface_leader']['cell_count'],
-                                                                               4, 'B')
+        surface_status_data = Pd0TRDI.unpack_bytes(
+            pd0_bytes, surface_status_format, offset
+        )
+        surface_status_data["percent_good"] = Pd0TRDI.decode_per_cell_per_beam(
+            pd0_bytes, offset + 2, data["surface_leader"]["cell_count"], 4, "B"
+        )
         return surface_status_data
 
     @staticmethod
@@ -1832,27 +1983,32 @@ class Pd0TRDI(object):
         auto_config_data:dict
             Dictionary of decoded data
         """
-        auto_config_leader_format = (('id', '<H', 0), ('beam_count', 'B', 2))
-        auto_config_beam_format = (('setup', 'B', 0),
-                                   ('depth', '<H', 1),
-                                   ('ping_count', 'B', 3),
-                                   ('ping_type', 'B', 4),
-                                   ('cell_count', '<H', 5),
-                                   ('cell_size', '<H', 7),
-                                   ('bin_1_mid', '<H', 9),
-                                   ('code_reps', 'B', 11),
-                                   ('transmit_length', '<H', 12),
-                                   ('lag_length', '<H', 15),
-                                   ('transmit_bandwidth', 'B', 16),
-                                   ('receive_bandwidth', 'B', 17),
-                                   ('min_ping_interval', '<H', 18))
-        auto_config_data = {}
-        auto_config_data['leader'] = Pd0TRDI.unpack_bytes(pd0_bytes, auto_config_leader_format, offset)
-
-        for n in range(1, auto_config_data['leader']['beam_count'] + 1):
-            label = 'beam_' + str(n)
+        auto_config_leader_format = (("id", "<H", 0), ("beam_count", "B", 2))
+        auto_config_beam_format = (
+            ("setup", "B", 0),
+            ("depth", "<H", 1),
+            ("ping_count", "B", 3),
+            ("ping_type", "B", 4),
+            ("cell_count", "<H", 5),
+            ("cell_size", "<H", 7),
+            ("bin_1_mid", "<H", 9),
+            ("code_reps", "B", 11),
+            ("transmit_length", "<H", 12),
+            ("lag_length", "<H", 15),
+            ("transmit_bandwidth", "B", 16),
+            ("receive_bandwidth", "B", 17),
+            ("min_ping_interval", "<H", 18),
+        )
+        auto_config_data = {
+            "leader": Pd0TRDI.unpack_bytes(pd0_bytes, auto_config_leader_format, offset)
+        }
+
+        for n in range(1, auto_config_data["leader"]["beam_count"] + 1):
+            label = "beam_" + str(n)
             beam_offset = offset + 3 + (20 * (n - 1))
-            auto_config_data[label] = Pd0TRDI.unpack_bytes(pd0_bytes, auto_config_beam_format, beam_offset)
+            auto_config_data[label] = Pd0TRDI.unpack_bytes(
+                pd0_bytes, auto_config_beam_format, beam_offset
+            )
 
         return auto_config_data
 
@@ -1874,13 +2030,17 @@ class Pd0TRDI(object):
         vertical_beam_data:dict
             Dictionary of decoded data
         """
-        vertical_beam_format = (('id', '<H', 0),
-                                ('eval_amp', 'B', 2),
-                                ('rssi', 'B', 3),
-                                ('range', 'L', 4),
-                                ('status', 'B', 8))
+        vertical_beam_format = (
+            ("id", "<H", 0),
+            ("eval_amp", "B", 2),
+            ("rssi", "B", 3),
+            ("range", "L", 4),
+            ("status", "B", 8),
+        )
 
-        vertical_beam_data = Pd0TRDI.unpack_bytes(pd0_bytes, vertical_beam_format, offset)
+        vertical_beam_data = Pd0TRDI.unpack_bytes(
+            pd0_bytes, vertical_beam_format, offset
+        )
         return vertical_beam_data
 
     @staticmethod
@@ -1901,8 +2061,8 @@ class Pd0TRDI(object):
         matrix_data:dict
             Dictionary of decoded data
         """
-        matrix_id_format = (('id', '<H', 0),)
-        matrix_data_format = (('element', '<h', 0),)
+        matrix_id_format = (("id", "<H", 0),)
+        matrix_data_format = (("element", "<h", 0),)
 
         matrix_data = Pd0TRDI.unpack_bytes(pd0_bytes, matrix_id_format, offset)
         matrix = []
@@ -1910,10 +2070,13 @@ class Pd0TRDI(object):
             row_list = []
             for col in range(4):
                 offset = offset + 2
-                # row.append(struct.unpack('<H', pd0_bytes[offset: offset + 2])[0])
-                row_list.append(Pd0TRDI.unpack_bytes(pd0_bytes, matrix_data_format, offset)['element'])
+                row_list.append(
+                    Pd0TRDI.unpack_bytes(pd0_bytes, matrix_data_format, offset)[
+                        "element"
+                    ]
+                )
             matrix.append(row_list)
-        matrix_data['matrix'] = matrix
+        matrix_data["matrix"] = matrix
 
         return matrix_data
 
@@ -1945,29 +2108,30 @@ class Hdr(object):
         n_types: int
             Number of data types
         """
-        self.bytes_per_ens = nans(n_ensembles)
-        self.data_offsets = nans([n_ensembles, n_types])
-        self.n_data_types = nans(n_ensembles)
-        self.data_ok = nans(n_ensembles)
-        self.invalid = [''] * n_ensembles
+        self.bytes_per_ens = nans((n_ensembles,))
+        self.data_offsets = nans((n_ensembles, n_types))
+        self.n_data_types = nans((n_ensembles,))
+        self.data_ok = nans((n_ensembles,))
+        self.invalid = [""] * n_ensembles
 
     def populate_data(self, n_ens, data):
         """Populates the class with data for an ensemble.
 
         Parameters
         ----------
-        i_ens: int
+        n_ens: int
             Ensemble index
         data: dict
             Dictionary of all data for this ensemble
         """
 
-        if 'header' in data:
-            self.bytes_per_ens[n_ens] = data['header']['number_of_bytes']
-            self.data_offsets[n_ens, :len(data['header']['address_offsets'])] = \
-                np.array(data['header']['address_offsets'])
-            self.n_data_types[n_ens] = data['header']['number_of_data_types']
-            self.invalid[n_ens] = data['header']['invalid']
+        if "header" in data:
+            self.bytes_per_ens[n_ens] = data["header"]["number_of_bytes"]
+            self.data_offsets[
+                n_ens, : len(data["header"]["address_offsets"])
+            ] = np.array(data["header"]["address_offsets"])
+            self.n_data_types[n_ens] = data["header"]["number_of_data_types"]
+            self.invalid[n_ens] = data["header"]["invalid"]
 
 
 class Inst(object):
@@ -2010,18 +2174,18 @@ class Inst(object):
             Number of ensembles
         """
 
-        #TODO change n_ensembles to (ensembles,)
-        self.beam_ang = nans(n_ensembles)
-        self.beams = nans(n_ensembles)
-        self.data_type = [''] * n_ensembles
-        self.firm_ver = nans(n_ensembles)
-        self.freq = nans(n_ensembles)
-        self.pat = [''] * n_ensembles
+        # TODO change n_ensembles to (ensembles,)
+        self.beam_ang = nans((n_ensembles,))
+        self.beams = nans((n_ensembles,))
+        self.data_type = [""] * n_ensembles
+        self.firm_ver = nans((n_ensembles,))
+        self.freq = nans((n_ensembles,))
+        self.pat = [""] * n_ensembles
         self.res_RDI = 0
-        self.sensor_CFG = nans(n_ensembles)
-        self.xducer = [''] * n_ensembles
+        self.sensor_CFG = nans((n_ensembles,))
+        self.xducer = [""] * n_ensembles
         self.t_matrix = np.tile([np.nan], [4, 4])
-        self.demod = nans(n_ensembles)
+        self.demod = nans((n_ensembles,))
         self.serial_number = np.nan
 
     def populate_data(self, i_ens, data):
@@ -2035,13 +2199,13 @@ class Inst(object):
             Dictionary of all data for this ensemble
         """
 
-
-        if 'fixed_leader' in data:
-            self.firm_ver[i_ens] = data['fixed_leader']['cpu_firmware_version'] + \
-                            (data['fixed_leader']['cpu_firmware_revision']  / 100)
+        if "fixed_leader" in data:
+            self.firm_ver[i_ens] = data["fixed_leader"]["cpu_firmware_version"] + (
+                data["fixed_leader"]["cpu_firmware_revision"] / 100
+            )
 
             # Convert system_configuration_ls to individual bits
-            bitls = "{0:08b}".format(data['fixed_leader']['system_configuration_ls'])
+            bitls = "{0:08b}".format(data["fixed_leader"]["system_configuration_ls"])
             val = int(bitls[5:], 2)
             if val == 0:
                 self.freq[i_ens] = 75
@@ -2060,24 +2224,24 @@ class Inst(object):
 
             val = int(bitls[4], 2)
             if val == 0:
-                self.pat[i_ens] = 'Concave'
+                self.pat[i_ens] = "Concave"
             elif val == 1:
-                self.pat[i_ens] = 'Convex'
+                self.pat[i_ens] = "Convex"
             else:
-                self.pat[i_ens] = 'n/a'
+                self.pat[i_ens] = "n/a"
 
             self.sensor_CFG[i_ens] = int(bitls[2:3], 2) + 1
 
             val = int(bitls[1], 2)
             if val == 0:
-                self.xducer[i_ens] = 'Not Attached'
+                self.xducer[i_ens] = "Not Attached"
             elif val == 1:
-                self.xducer[i_ens] = 'Attached'
+                self.xducer[i_ens] = "Attached"
             else:
-                self.xducer[i_ens] = 'n/a'
+                self.xducer[i_ens] = "n/a"
 
             # Convert system_configuration_ms to individual bits
-            bitms = "{0:08b}".format(data['fixed_leader']['system_configuration_ms'])
+            bitms = "{0:08b}".format(data["fixed_leader"]["system_configuration_ms"])
 
             val = int(bitms[6:], 2)
             if val == 0:
@@ -2104,17 +2268,17 @@ class Inst(object):
                 self.beams[i_ens] = np.nan
                 self.demod[i_ens] = np.nan
 
-            if data['fixed_leader']['simulation_data_flag'] == 0:
-                self.data_type[i_ens] = 'Real'
+            if data["fixed_leader"]["simulation_data_flag"] == 0:
+                self.data_type[i_ens] = "Real"
             else:
-                self.data_type[i_ens] = 'Simu'
+                self.data_type[i_ens] = "Simu"
 
-            self.serial_number = data['fixed_leader']['serial_number']
+            self.serial_number = data["fixed_leader"]["serial_number"]
 
-        if 'transformation_matrix' in data:
+        if "transformation_matrix" in data:
             self.res_RDI = 0
             # Scale transformation matrix
-            self.t_matrix = np.array(data['transformation_matrix']['matrix']) / 10000
+            self.t_matrix = np.array(data["transformation_matrix"]["matrix"]) / 10000
 
 
 class AutoMode(object):
@@ -2143,12 +2307,12 @@ class AutoMode(object):
         n_ensembles: int
             Number of ensembles
         """
-        self.beam_count = nans(n_ensembles)
+        self.beam_count = nans((n_ensembles,))
         self.Beam1 = Beam(n_ensembles)
         self.Beam2 = Beam(n_ensembles)
         self.Beam3 = Beam(n_ensembles)
         self.Beam4 = Beam(n_ensembles)
-        self.Reserved = nans(n_ensembles)
+        self.Reserved = nans((n_ensembles,))
 
     def populate_data(self, i_ens, data):
         """Populates the class with data for an ensemble.
@@ -2161,12 +2325,12 @@ class AutoMode(object):
             Dictionary of all data for this ensemble
         """
 
-        if 'auto_configuration' in data:
-            self.beam_count[i_ens] = data['auto_configuration']['leader']['beam_count']
-            self.Beam1.populate_data(i_ens, data['auto_configuration']['beam_1'])
-            self.Beam2.populate_data(i_ens, data['auto_configuration']['beam_2'])
-            self.Beam3.populate_data(i_ens, data['auto_configuration']['beam_3'])
-            self.Beam4.populate_data(i_ens, data['auto_configuration']['beam_4'])
+        if "auto_configuration" in data:
+            self.beam_count[i_ens] = data["auto_configuration"]["leader"]["beam_count"]
+            self.Beam1.populate_data(i_ens, data["auto_configuration"]["beam_1"])
+            self.Beam2.populate_data(i_ens, data["auto_configuration"]["beam_2"])
+            self.Beam3.populate_data(i_ens, data["auto_configuration"]["beam_3"])
+            self.Beam4.populate_data(i_ens, data["auto_configuration"]["beam_4"])
 
 
 class Beam(object):
@@ -2211,19 +2375,19 @@ class Beam(object):
             Number of ensembles
         """
 
-        self.mode = nans(n_ensembles)
-        self.depth_cm = nans(n_ensembles)
-        self.ping_count = nans(n_ensembles)
-        self.ping_type = nans(n_ensembles)
-        self.cell_count = nans(n_ensembles)
-        self.cell_size_cm = nans(n_ensembles)
-        self.cell_mid_cm = nans(n_ensembles)
-        self.code_repeat = nans(n_ensembles)
-        self.trans_length_cm = nans(n_ensembles)
-        self.lag_length_cm = nans(n_ensembles)
-        self.transmit_bw = nans(n_ensembles)
-        self.receive_bw = nans(n_ensembles)
-        self.ping_interval_ms = nans(n_ensembles)
+        self.mode = nans((n_ensembles,))
+        self.depth_cm = nans((n_ensembles,))
+        self.ping_count = nans((n_ensembles,))
+        self.ping_type = nans((n_ensembles,))
+        self.cell_count = nans((n_ensembles,))
+        self.cell_size_cm = nans((n_ensembles,))
+        self.cell_mid_cm = nans((n_ensembles,))
+        self.code_repeat = nans((n_ensembles,))
+        self.trans_length_cm = nans((n_ensembles,))
+        self.lag_length_cm = nans((n_ensembles,))
+        self.transmit_bw = nans((n_ensembles,))
+        self.receive_bw = nans((n_ensembles,))
+        self.ping_interval_ms = nans((n_ensembles,))
 
     def populate_data(self, i_ens, beam_data):
         """Populates the class with data for an ensemble.
@@ -2232,23 +2396,23 @@ class Beam(object):
         ----------
         i_ens: int
             Ensemble index
-        data: dict
+        beam_data: dict
             Dictionary of all data for this ensemble
         """
 
-        self.mode = beam_data['setup']
-        self.depth_cm = beam_data['depth']
-        self.ping_count = beam_data['ping_count']
-        self.ping_type = beam_data['ping_type']
-        self.cell_count = beam_data['cell_count']
-        self.cell_size_cm = beam_data['cell_size']
-        self.cell_mid_cm = beam_data['bin_1_mid']
-        self.code_repeat = beam_data['code_reps']
-        self.trans_length_cm = beam_data['transmit_length']
-        self.lag_length_cm = beam_data['lag_length']
-        self.transmit_bw = beam_data['transmit_bandwidth']
-        self.receive_bw = beam_data['receive_bandwidth']
-        self.ping_interval_ms = beam_data['min_ping_interval']
+        self.mode = beam_data["setup"]
+        self.depth_cm = beam_data["depth"]
+        self.ping_count = beam_data["ping_count"]
+        self.ping_type = beam_data["ping_type"]
+        self.cell_count = beam_data["cell_count"]
+        self.cell_size_cm = beam_data["cell_size"]
+        self.cell_mid_cm = beam_data["bin_1_mid"]
+        self.code_repeat = beam_data["code_reps"]
+        self.trans_length_cm = beam_data["transmit_length"]
+        self.lag_length_cm = beam_data["lag_length"]
+        self.transmit_bw = beam_data["transmit_bandwidth"]
+        self.receive_bw = beam_data["receive_bandwidth"]
+        self.ping_interval_ms = beam_data["min_ping_interval"]
 
 
 class Bt(object):
@@ -2283,13 +2447,13 @@ class Bt(object):
             Number of velocity beams
         """
 
-        self.corr = nans([n_velocities, n_ensembles])
-        self.depth_m = nans([n_velocities, n_ensembles])
-        self.eval_amp = nans([n_velocities, n_ensembles])
-        self.ext_depth_cm = nans(n_ensembles)
-        self.pergd = nans([n_velocities, n_ensembles])
-        self.rssi = nans([n_velocities, n_ensembles])
-        self.vel_mps = nans([n_velocities, n_ensembles])
+        self.corr = nans((n_velocities, n_ensembles))
+        self.depth_m = nans((n_velocities, n_ensembles))
+        self.eval_amp = nans((n_velocities, n_ensembles))
+        self.ext_depth_cm = nans((n_ensembles,))
+        self.pergd = nans((n_velocities, n_ensembles))
+        self.rssi = nans((n_velocities, n_ensembles))
+        self.vel_mps = nans((n_velocities, n_ensembles))
 
     def populate_data(self, i_ens, data):
         """Populates the class with data for an ensemble.
@@ -2302,15 +2466,25 @@ class Bt(object):
             Dictionary of all data for this ensemble
         """
 
-        if 'bottom_track' in data:
+        if "bottom_track" in data:
             # Combine bytes to compute depth
-            self.depth_m[0:4, i_ens] = np.squeeze(np.array(data['bottom_track']['range_lsb']).T) + \
-                                       np.squeeze(np.array(data['bottom_track']['range_msb']).T) * 2e16 / 100
-            self.vel_mps[0:4, i_ens] = np.squeeze(np.array(data['bottom_track']['velocity']).T)
-            self.corr[0:4, i_ens] = np.squeeze(np.array(data['bottom_track']['correlation']).T)
-            self.eval_amp[0:4, i_ens] = np.squeeze(np.array(data['bottom_track']['amplitude']).T)
-            self.pergd[0:4, i_ens] = np.squeeze(np.array(data['bottom_track']['percent_good']).T)
-            self.rssi[0:4, i_ens] = np.squeeze(np.array(data['bottom_track']['rssi']).T)
+            self.depth_m[0:4, i_ens] = (
+                np.squeeze(np.array(data["bottom_track"]["range_lsb"]).T)
+                + np.squeeze(np.array(data["bottom_track"]["range_msb"]).T) * 2e16 / 100
+            )
+            self.vel_mps[0:4, i_ens] = np.squeeze(
+                np.array(data["bottom_track"]["velocity"]).T
+            )
+            self.corr[0:4, i_ens] = np.squeeze(
+                np.array(data["bottom_track"]["correlation"]).T
+            )
+            self.eval_amp[0:4, i_ens] = np.squeeze(
+                np.array(data["bottom_track"]["amplitude"]).T
+            )
+            self.pergd[0:4, i_ens] = np.squeeze(
+                np.array(data["bottom_track"]["percent_good"]).T
+            )
+            self.rssi[0:4, i_ens] = np.squeeze(np.array(data["bottom_track"]["rssi"]).T)
 
 
 class Cfg(object):
@@ -2421,54 +2595,54 @@ class Cfg(object):
             Number of ensembles
         """
 
-        self.ba = nans(n_ensembles)
-        self.bc = nans(n_ensembles)
-        self.be_mmps = nans(n_ensembles)
-        self.bg = nans(n_ensembles)
-        self.bm = nans(n_ensembles)
-        self.bp = nans(n_ensembles)
-        self.bx_dm = nans(n_ensembles)
-        self.code_reps = nans(n_ensembles)
-        self.coord_sys = [''] * n_ensembles
-        self.cpu_ser_no = nans([n_ensembles, 8])
-        self.cq = nans(n_ensembles)
-        self.cx = nans(n_ensembles)
-        self.dist_bin1_cm = nans(n_ensembles)
-        self.ea_deg = nans(n_ensembles)
-        self.eb_deg = nans(n_ensembles)
-        self.sensor_avail = [''] * n_ensembles
-        self.ex = [''] * n_ensembles
-        self.ez = [''] * n_ensembles
-        self.head_src = [''] * n_ensembles
-        self.lag_cm = nans(n_ensembles)
-        self.map_bins = [''] * n_ensembles
-        self.n_beams = nans(n_ensembles)
-        self.pitch_src = [''] * n_ensembles
-        self.ref_lay_end_cell = nans(n_ensembles)
-        self.ref_lay_str_cell = nans(n_ensembles)
-        self.roll_src = [''] * n_ensembles
-        self.sal_src = [''] * n_ensembles
-        self.wm = nans(n_ensembles)
-        self.sos_src = [''] * n_ensembles
-        self.temp_src = [''] * n_ensembles
-        self.tp_sec = nans(n_ensembles)
-        self.use_3beam = [''] * n_ensembles
-        self.use_pr = [''] * n_ensembles
-        self.wa = nans(n_ensembles)
-        self.wb = nans(n_ensembles)
-        self.wc = nans(n_ensembles)
-        self.we_mmps = nans(n_ensembles)
-        self.wf_cm = nans(n_ensembles)
-        self.wg_per = nans(n_ensembles)
-        self.wj = nans(n_ensembles)
-        self.wn = nans(n_ensembles)
-        self.wp = nans(n_ensembles)
-        self.ws_cm = nans(n_ensembles)
-        self.xdcr_dep_srs = [''] * n_ensembles
-        self.xmit_pulse_cm = nans(n_ensembles)
-        self.lag_near_bottom = nans(n_ensembles)
-
-    def populate_data (self, i_ens, data):
+        self.ba = nans((n_ensembles,))
+        self.bc = nans((n_ensembles,))
+        self.be_mmps = nans((n_ensembles,))
+        self.bg = nans((n_ensembles,))
+        self.bm = nans((n_ensembles,))
+        self.bp = nans((n_ensembles,))
+        self.bx_dm = nans((n_ensembles,))
+        self.code_reps = nans((n_ensembles,))
+        self.coord_sys = [""] * n_ensembles
+        self.cpu_ser_no = nans((n_ensembles, 8))
+        self.cq = nans((n_ensembles,))
+        self.cx = nans((n_ensembles,))
+        self.dist_bin1_cm = nans((n_ensembles,))
+        self.ea_deg = nans((n_ensembles,))
+        self.eb_deg = nans((n_ensembles,))
+        self.sensor_avail = [""] * n_ensembles
+        self.ex = [""] * n_ensembles
+        self.ez = [""] * n_ensembles
+        self.head_src = [""] * n_ensembles
+        self.lag_cm = nans((n_ensembles,))
+        self.map_bins = [""] * n_ensembles
+        self.n_beams = nans((n_ensembles,))
+        self.pitch_src = [""] * n_ensembles
+        self.ref_lay_end_cell = nans((n_ensembles,))
+        self.ref_lay_str_cell = nans((n_ensembles,))
+        self.roll_src = [""] * n_ensembles
+        self.sal_src = [""] * n_ensembles
+        self.wm = nans((n_ensembles,))
+        self.sos_src = [""] * n_ensembles
+        self.temp_src = [""] * n_ensembles
+        self.tp_sec = nans((n_ensembles,))
+        self.use_3beam = [""] * n_ensembles
+        self.use_pr = [""] * n_ensembles
+        self.wa = nans((n_ensembles,))
+        self.wb = nans((n_ensembles,))
+        self.wc = nans((n_ensembles,))
+        self.we_mmps = nans((n_ensembles,))
+        self.wf_cm = nans((n_ensembles,))
+        self.wg_per = nans((n_ensembles,))
+        self.wj = nans((n_ensembles,))
+        self.wn = nans((n_ensembles,))
+        self.wp = nans((n_ensembles,))
+        self.ws_cm = nans((n_ensembles,))
+        self.xdcr_dep_srs = [""] * n_ensembles
+        self.xmit_pulse_cm = nans((n_ensembles,))
+        self.lag_near_bottom = nans((n_ensembles,))
+
+    def populate_data(self, i_ens, data):
         """Populates the class with data for an ensemble.
 
         Parameters
@@ -2479,146 +2653,154 @@ class Cfg(object):
             Dictionary of all data for this ensemble
         """
 
-        if 'fixed_leader' in data:
-            self.n_beams[i_ens] = data['fixed_leader']['number_of_beams']
-            self.wn[i_ens] = data['fixed_leader']['number_of_cells']
-            self.wp[i_ens] = data['fixed_leader']['number_of_water_pings']
-            self.ws_cm[i_ens] = data['fixed_leader']['depth_cell_size']
-            self.wf_cm[i_ens] = data['fixed_leader']['blank_after_transmit']
-            self.wm[i_ens] = data['fixed_leader']['water_mode']
-            self.wc[i_ens] = data['fixed_leader']['low_correlation_threshold']
-            self.code_reps[i_ens] = data['fixed_leader']['number_of_code_repetitions']
-            self.wg_per[i_ens] = data['fixed_leader']['minimum_percentage_water_profile_pings']
-            self.we_mmps[i_ens] = data['fixed_leader']['error_velocity_threshold']
-            self.tp_sec[i_ens] = data['fixed_leader']['minutes'] * 60. + \
-                                     data['fixed_leader']['seconds'] + \
-                                     data['fixed_leader']['hundredths'] * 0.01
+        if "fixed_leader" in data:
+            self.n_beams[i_ens] = data["fixed_leader"]["number_of_beams"]
+            self.wn[i_ens] = data["fixed_leader"]["number_of_cells"]
+            self.wp[i_ens] = data["fixed_leader"]["number_of_water_pings"]
+            self.ws_cm[i_ens] = data["fixed_leader"]["depth_cell_size"]
+            self.wf_cm[i_ens] = data["fixed_leader"]["blank_after_transmit"]
+            self.wm[i_ens] = data["fixed_leader"]["water_mode"]
+            self.wc[i_ens] = data["fixed_leader"]["low_correlation_threshold"]
+            self.code_reps[i_ens] = data["fixed_leader"]["number_of_code_repetitions"]
+            self.wg_per[i_ens] = data["fixed_leader"][
+                "minimum_percentage_water_profile_pings"
+            ]
+            self.we_mmps[i_ens] = data["fixed_leader"]["error_velocity_threshold"]
+            self.tp_sec[i_ens] = (
+                data["fixed_leader"]["minutes"] * 60.0
+                + data["fixed_leader"]["seconds"]
+                + data["fixed_leader"]["hundredths"] * 0.01
+            )
 
             # Convert coordinate_transformation_process to individual bits
-            self.ex[i_ens] = "{0:08b}".format(data['fixed_leader']['coordinate_transformation_process'])
+            self.ex[i_ens] = "{0:08b}".format(
+                data["fixed_leader"]["coordinate_transformation_process"]
+            )
 
             val = int(self.ex[i_ens][3:5], 2)
             if val == 0:
-                self.coord_sys[i_ens] = 'Beam'
+                self.coord_sys[i_ens] = "Beam"
             elif val == 1:
-                self.coord_sys[i_ens] = 'Inst'
+                self.coord_sys[i_ens] = "Inst"
             elif val == 2:
-                self.coord_sys[i_ens] = 'Ship'
+                self.coord_sys[i_ens] = "Ship"
             elif val == 3:
-                self.coord_sys[i_ens] = 'Earth'
+                self.coord_sys[i_ens] = "Earth"
             else:
                 self.coord_sys[i_ens] = "N/a"
 
             val = int(self.ex[i_ens][5], 2)
             if val == 0:
-                self.use_pr = 'No'
+                self.use_pr = "No"
             elif val == 1:
-                self.use_pr = 'Yes'
+                self.use_pr = "Yes"
             else:
-                self.use_pr = 'N/a'
+                self.use_pr = "N/a"
 
             val = int(self.ex[i_ens][6], 2)
             if val == 0:
-                self.use_3beam = 'No'
+                self.use_3beam = "No"
             elif val == 1:
-                self.use_3beam = 'Yes'
+                self.use_3beam = "Yes"
             else:
-                self.use_3beam = 'N/a'
+                self.use_3beam = "N/a"
 
             val = int(self.ex[i_ens][7], 2)
             if val == 0:
-                self.map_bins = 'No'
+                self.map_bins = "No"
             elif val == 1:
-                self.map_bins = 'Yes'
+                self.map_bins = "Yes"
             else:
-                self.map_bins = 'N/a'
+                self.map_bins = "N/a"
 
-            self.ea_deg[i_ens] = data['fixed_leader']['heading_alignment'] * 0.01
-            self.eb_deg[i_ens] = data['fixed_leader']['heading_bias'] * 0.01
+            self.ea_deg[i_ens] = data["fixed_leader"]["heading_alignment"] * 0.01
+            self.eb_deg[i_ens] = data["fixed_leader"]["heading_bias"] * 0.01
 
             # Convert sensour_source to individual bits
-            self.ez[i_ens] = "{0:08b}".format(data['fixed_leader']['sensor_source'])
+            self.ez[i_ens] = "{0:08b}".format(data["fixed_leader"]["sensor_source"])
 
             val = int(self.ez[i_ens][:2], 2)
             if val == 0:
-                self.sos_src[i_ens] = 'Manual EC'
+                self.sos_src[i_ens] = "Manual EC"
             elif val == 1:
-                self.sos_src[i_ens] = 'Calculated'
+                self.sos_src[i_ens] = "Calculated"
             elif val == 3:
-                self.sos_src[i_ens] = 'SVSS Sensor'
+                self.sos_src[i_ens] = "SVSS Sensor"
             else:
-                self.sos_src[i_ens] = 'N/a'
+                self.sos_src[i_ens] = "N/a"
 
             val = int(self.ez[i_ens][2], 2)
             if val == 0:
-                self.xdcr_dep_srs[i_ens] = 'Manual ED'
+                self.xdcr_dep_srs[i_ens] = "Manual ED"
             if val == 1:
-                self.xdcr_dep_srs[i_ens] = 'Sensor'
+                self.xdcr_dep_srs[i_ens] = "Sensor"
             else:
-                self.xdcr_dep_srs[i_ens] = 'N/a'
+                self.xdcr_dep_srs[i_ens] = "N/a"
 
             val = int(self.ez[i_ens][3], 2)
             if val == 0:
-                self.head_src[i_ens] = 'Manual EH'
+                self.head_src[i_ens] = "Manual EH"
             if val == 1:
-                self.head_src[i_ens] = 'Int. Sensor'
+                self.head_src[i_ens] = "Int. Sensor"
             else:
-                self.head_src[i_ens] = 'N/a'
+                self.head_src[i_ens] = "N/a"
 
             val = int(self.ez[i_ens][4], 2)
             if val == 0:
-                self.pitch_src[i_ens] = 'Manual EP'
+                self.pitch_src[i_ens] = "Manual EP"
             if val == 1:
-                self.pitch_src[i_ens] = 'Int. Sensor'
+                self.pitch_src[i_ens] = "Int. Sensor"
             else:
-                self.pitch_src[i_ens] = 'N/a'
+                self.pitch_src[i_ens] = "N/a"
 
             val = int(self.ez[i_ens][5], 2)
             if val == 0:
-                self.roll_src[i_ens] = 'Manual ER'
+                self.roll_src[i_ens] = "Manual ER"
             if val == 1:
-                self.roll_src[i_ens] = 'Int. Sensor'
+                self.roll_src[i_ens] = "Int. Sensor"
             else:
-                self.roll_src[i_ens] = 'N/a'
+                self.roll_src[i_ens] = "N/a"
 
             val = int(self.ez[i_ens][6], 2)
             if val == 0:
-                self.xdcr_dep_srs[i_ens] = 'Manual ES'
+                self.xdcr_dep_srs[i_ens] = "Manual ES"
             if val == 1:
-                self.xdcr_dep_srs[i_ens] = 'Int. Sensor'
+                self.xdcr_dep_srs[i_ens] = "Int. Sensor"
             else:
-                self.xdcr_dep_srs[i_ens] = 'N/a'
+                self.xdcr_dep_srs[i_ens] = "N/a"
 
             val = int(self.ez[i_ens][7], 2)
             if val == 0:
-                self.temp_src[i_ens] = 'Manual ET'
+                self.temp_src[i_ens] = "Manual ET"
             if val == 1:
-                self.temp_src[i_ens] = 'Int. Sensor'
+                self.temp_src[i_ens] = "Int. Sensor"
             else:
-                self.temp_src[i_ens] = 'N/a'
-
-            self.sensor_avail[i_ens] = "{0:08b}".format(data['fixed_leader']['sensor_available'])
-            self.dist_bin1_cm[i_ens] = data['fixed_leader']['bin_1_distance']
-            self.xmit_pulse_cm[i_ens] = data['fixed_leader']['transmit_pulse_length']
-            self.ref_lay_str_cell[i_ens] = data['fixed_leader']['starting_depth_cell']
-            self.ref_lay_end_cell[i_ens] = data['fixed_leader']['ending_depth_cell']
-            self.wa[i_ens] = data['fixed_leader']['false_target_threshold']
-            self.cx[i_ens] = data['fixed_leader']['low_latency_trigger']
-            self.lag_cm[i_ens] = data['fixed_leader']['transmit_lag_distance']
-            self.cpu_ser_no[i_ens] = data['fixed_leader']['cpu_board_serial_number']
-            self.wb[i_ens] = data['fixed_leader']['system_bandwidth']
-            self.cq[i_ens] = data['fixed_leader']['system_power']
-
-        if 'variable_leader' in data:
-            self.lag_near_bottom[i_ens] = data['variable_leader']['lag_near_bottom']
-
-        if 'bottom_track' in data:
-            self.bp[i_ens] = data['bottom_track']['pings_per_ensemble_bp']
-            self.bc[i_ens] = data['bottom_track']['correlation_magnitude_minimum_bc']
-            self.ba[i_ens] = data['bottom_track']['evaluation_amplitude_minimum_ba']
-            self.bg[i_ens] = data['bottom_track']['percent_good_minimum_bg']
-            self.bm[i_ens] = data['bottom_track']['bottom_track_mode_bm']
-            self.be_mmps[i_ens] = data['bottom_track']['error_velocity_maximum_be']
+                self.temp_src[i_ens] = "N/a"
+
+            self.sensor_avail[i_ens] = "{0:08b}".format(
+                data["fixed_leader"]["sensor_available"]
+            )
+            self.dist_bin1_cm[i_ens] = data["fixed_leader"]["bin_1_distance"]
+            self.xmit_pulse_cm[i_ens] = data["fixed_leader"]["transmit_pulse_length"]
+            self.ref_lay_str_cell[i_ens] = data["fixed_leader"]["starting_depth_cell"]
+            self.ref_lay_end_cell[i_ens] = data["fixed_leader"]["ending_depth_cell"]
+            self.wa[i_ens] = data["fixed_leader"]["false_target_threshold"]
+            self.cx[i_ens] = data["fixed_leader"]["low_latency_trigger"]
+            self.lag_cm[i_ens] = data["fixed_leader"]["transmit_lag_distance"]
+            self.cpu_ser_no[i_ens] = data["fixed_leader"]["cpu_board_serial_number"]
+            self.wb[i_ens] = data["fixed_leader"]["system_bandwidth"]
+            self.cq[i_ens] = data["fixed_leader"]["system_power"]
+
+        if "variable_leader" in data:
+            self.lag_near_bottom[i_ens] = data["variable_leader"]["lag_near_bottom"]
+
+        if "bottom_track" in data:
+            self.bp[i_ens] = data["bottom_track"]["pings_per_ensemble_bp"]
+            self.bc[i_ens] = data["bottom_track"]["correlation_magnitude_minimum_bc"]
+            self.ba[i_ens] = data["bottom_track"]["evaluation_amplitude_minimum_ba"]
+            self.bg[i_ens] = data["bottom_track"]["percent_good_minimum_bg"]
+            self.bm[i_ens] = data["bottom_track"]["bottom_track_mode_bm"]
+            self.be_mmps[i_ens] = data["bottom_track"]["error_velocity_maximum_be"]
 
 
 class Gps(object):
@@ -2663,19 +2845,19 @@ class Gps(object):
             Number of ensembles
         """
 
-        self.alt_m = nans(n_ensembles)
-        self.gga_diff = nans(n_ensembles)
-        self.gga_hdop = nans(n_ensembles)
-        self.gga_n_stats = nans(n_ensembles)
-        self.gga_vel_e_mps = nans(n_ensembles)
-        self.gga_vel_n_mps = nans(n_ensembles)
-        self.gsa_p_dop = nans(n_ensembles)
-        self.gsa_sat = nans([n_ensembles, 6])
-        self.gsa_v_dop = nans(n_ensembles)
-        self.lat_deg = nans(n_ensembles)
-        self.long_deg = nans(n_ensembles)
-        self.vtg_vel_e_mps = nans(n_ensembles)
-        self.vtg_vel_n_mps = nans(n_ensembles)
+        self.alt_m = nans((n_ensembles,))
+        self.gga_diff = nans((n_ensembles,))
+        self.gga_hdop = nans((n_ensembles,))
+        self.gga_n_stats = nans((n_ensembles,))
+        self.gga_vel_e_mps = nans((n_ensembles,))
+        self.gga_vel_n_mps = nans((n_ensembles,))
+        self.gsa_p_dop = nans((n_ensembles,))
+        self.gsa_sat = nans((n_ensembles, 6))
+        self.gsa_v_dop = nans((n_ensembles,))
+        self.lat_deg = nans((n_ensembles,))
+        self.long_deg = nans((n_ensembles,))
+        self.vtg_vel_e_mps = nans((n_ensembles,))
+        self.vtg_vel_n_mps = nans((n_ensembles,))
 
 
 class Gps2(object):
@@ -2787,52 +2969,52 @@ class Gps2(object):
         """
 
         self.gga_delta_time = np.full([n_ensembles, 20], np.nan)
-        self.gga_header = np.full([n_ensembles, 20], '      ')
-        self.gga_sentence = np.full([n_ensembles, 20], '')
+        self.gga_header = np.tile("      ", [n_ensembles, 20])
+        self.gga_sentence = np.tile("", [n_ensembles, 20])
         self.utc = np.full([n_ensembles, 20], np.nan)
         self.lat_deg = np.zeros([n_ensembles, 20])
-        self.lat_ref = np.full([n_ensembles, 20], '')
+        self.lat_ref = np.tile("", [n_ensembles, 20])
         self.lon_deg = np.zeros([n_ensembles, 20])
-        self.lon_ref = np.full([n_ensembles, 20], '')
+        self.lon_ref = np.tile("", [n_ensembles, 20])
         self.corr_qual = np.full([n_ensembles, 20], np.nan)
         self.num_sats = np.full([n_ensembles, 20], np.nan)
         self.hdop = np.full([n_ensembles, 20], np.nan)
         self.alt = np.full([n_ensembles, 20], np.nan)
-        self.alt_unit = np.full([n_ensembles, 20], '')
+        self.alt_unit = np.tile("", [n_ensembles, 20])
         self.geoid = np.full([n_ensembles, 20], np.nan)
-        self.geoid_unit = np.full([n_ensembles, 20], '')
+        self.geoid_unit = np.tile("", [n_ensembles, 20])
         self.d_gps_age = np.full([n_ensembles, 20], np.nan)
         self.ref_stat_id = np.full([n_ensembles, 20], np.nan)
         self.vtg_delta_time = np.full([n_ensembles, 20], np.nan)
-        self.vtg_header = np.full([n_ensembles, 20], '      ')
-        self.vtg_sentence = np.full([n_ensembles, 20], '')
+        self.vtg_header = np.tile("      ", [n_ensembles, 20])
+        self.vtg_sentence = np.tile("", [n_ensembles, 20])
         self.course_true = np.full([n_ensembles, 20], np.nan)
-        self.true_indicator = np.full([n_ensembles, 20], '')
+        self.true_indicator = np.tile("", [n_ensembles, 20])
         self.course_mag = np.full([n_ensembles, 20], np.nan)
-        self.mag_indicator = np.full([n_ensembles, 20], '')
+        self.mag_indicator = np.tile("", [n_ensembles, 20])
         self.speed_knots = np.full([n_ensembles, 20], np.nan)
-        self.knots_indicator = np.full([n_ensembles, 20], '')
+        self.knots_indicator = np.tile("", [n_ensembles, 20])
         self.speed_kph = np.zeros([n_ensembles, 20])
-        self.kph_indicator = np.full([n_ensembles, 20], '')
-        self.mode_indicator = np.full([n_ensembles, 20], '')
+        self.kph_indicator = np.tile("", [n_ensembles, 20])
+        self.mode_indicator = np.tile("", [n_ensembles, 20])
         self.dbt_delta_time = np.full([n_ensembles, 20], np.nan)
-        self.dbt_header = np.full([n_ensembles, 20], '      ')
+        self.dbt_header = np.tile("      ", [n_ensembles, 20])
         self.depth_ft = np.full([n_ensembles, 20], np.nan)
-        self.ft_indicator = np.full([n_ensembles, 20], '')
+        self.ft_indicator = np.tile("", [n_ensembles, 20])
         self.depth_m = np.zeros([n_ensembles, 20])
-        self.m_indicator = np.full([n_ensembles, 20], '')
+        self.m_indicator = np.tile("", [n_ensembles, 20])
         self.depth_fath = np.full([n_ensembles, 20], np.nan)
-        self.fath_indicator = np.full([n_ensembles, 20], '')
+        self.fath_indicator = np.tile("", [n_ensembles, 20])
         self.hdt_delta_time = np.full([n_ensembles, 20], np.nan)
-        self.hdt_header = np.full([n_ensembles, 20], '      ')
+        self.hdt_header = np.tile("      ", [n_ensembles, 20])
         self.heading_deg = np.full([n_ensembles, 20], np.nan)
-        self.h_true_indicator = np.full([n_ensembles, 20], '')
+        self.h_true_indicator = np.tile("", [n_ensembles, 20])
 
         # if wr2:
-        self.gga_velE_mps = nans(n_ensembles)
-        self.gga_velN_mps = nans(n_ensembles)
-        self.vtg_velE_mps = nans(n_ensembles)
-        self.vtg_velN_mps = nans(n_ensembles)
+        self.gga_velE_mps = nans((n_ensembles,))
+        self.gga_velN_mps = nans((n_ensembles,))
+        self.vtg_velE_mps = nans((n_ensembles,))
+        self.vtg_velN_mps = nans((n_ensembles,))
 
     def populate_data(self, i_ens, data):
         """Populates the class with data for an ensemble.
@@ -2845,94 +3027,98 @@ class Gps2(object):
             Dictionary of all data for this ensemble
         """
 
-        if 'gga' in data:
+        if "gga" in data:
 
             # Check size and expand if needed
-            if len(data['gga']) > self.gga_delta_time.shape[1]:
-                self.gga_expand(len(data['gga']))
+            if len(data["gga"]) > self.gga_delta_time.shape[1]:
+                self.gga_expand(len(data["gga"]))
 
-            for n, gga_data in enumerate(data['gga']):
+            for n, gga_data in enumerate(data["gga"]):
                 # Try implemented because of occasional garbage in data stream.
-                # This prevents a crash and data after garbage are not used, but any data before garbage is saved
+                # This prevents a crash and data after garbage are not used,
+                # but any data before garbage is saved
                 try:
-                    self.gga_delta_time[i_ens, n] = gga_data['delta_time']
-                    self.gga_header[i_ens, n] = gga_data['header']
-                    self.utc[i_ens, n] = gga_data['utc']
-                    self.lat_deg[i_ens, n] = gga_data['lat_deg']
-                    self.lat_ref[i_ens, n] = gga_data['lat_ref']
-                    self.lon_deg[i_ens, n] = gga_data['lon_deg']
-                    self.lon_ref[i_ens, n] = gga_data['lon_ref']
-                    self.corr_qual[i_ens, n] = gga_data['corr_qual']
-                    self.num_sats[i_ens, n] = gga_data['num_sats']
-                    self.hdop[i_ens, n] = gga_data['hdop']
-                    self.alt[i_ens, n] = gga_data['alt']
-                    self.alt_unit[i_ens, n] = gga_data['alt_unit']
-                    self.geoid[i_ens, n] = gga_data['geoid']
-                    self.geoid_unit[i_ens, n] = gga_data['geoid_unit']
-                    self.d_gps_age[i_ens, n] = gga_data['d_gps_age']
-                    self.ref_stat_id[i_ens, n] = gga_data['ref_stat_id']
+                    self.gga_delta_time[i_ens, n] = gga_data["delta_time"]
+                    self.gga_header[i_ens, n] = gga_data["header"]
+                    self.utc[i_ens, n] = gga_data["utc"]
+                    self.lat_deg[i_ens, n] = gga_data["lat_deg"]
+                    self.lat_ref[i_ens, n] = gga_data["lat_ref"]
+                    self.lon_deg[i_ens, n] = gga_data["lon_deg"]
+                    self.lon_ref[i_ens, n] = gga_data["lon_ref"]
+                    self.corr_qual[i_ens, n] = gga_data["corr_qual"]
+                    self.num_sats[i_ens, n] = gga_data["num_sats"]
+                    self.hdop[i_ens, n] = gga_data["hdop"]
+                    self.alt[i_ens, n] = gga_data["alt"]
+                    self.alt_unit[i_ens, n] = gga_data["alt_unit"]
+                    self.geoid[i_ens, n] = gga_data["geoid"]
+                    self.geoid_unit[i_ens, n] = gga_data["geoid_unit"]
+                    self.d_gps_age[i_ens, n] = gga_data["d_gps_age"]
+                    self.ref_stat_id[i_ens, n] = gga_data["ref_stat_id"]
                 except:
                     pass
 
-        if 'vtg' in data:
+        if "vtg" in data:
 
             # Check size and expand if needed
-            if len(data['vtg']) > self.vtg_delta_time.shape[1]:
-                self.vtg_expand(len(data['vtg']))
+            if len(data["vtg"]) > self.vtg_delta_time.shape[1]:
+                self.vtg_expand(len(data["vtg"]))
 
-            for n, vtg_data in enumerate(data['vtg']):
+            for n, vtg_data in enumerate(data["vtg"]):
                 # Try implemented because of occasional garbage in data stream.
-                # This prevents a crash and data after garbage are not used, but any data before garbage is saved
+                # This prevents a crash and data after garbage are not used,
+                # but any data before garbage is saved
                 try:
-                    self.vtg_delta_time[i_ens, n] = vtg_data['delta_time']
-                    self.vtg_header[i_ens, n] = vtg_data['header']
-                    self.course_true[i_ens, n] = vtg_data['course_true']
-                    self.true_indicator[i_ens, n] = vtg_data['true_indicator']
-                    self.course_mag[i_ens, n] = vtg_data['course_mag']
-                    self.mag_indicator[i_ens, n] = vtg_data['mag_indicator']
-                    self.speed_knots[i_ens, n] = vtg_data['speed_knots']
-                    self.knots_indicator[i_ens, n] = vtg_data['knots_indicator']
-                    self.speed_kph[i_ens, n] = vtg_data['speed_kph']
-                    self.kph_indicator[i_ens, n] = vtg_data['kph_indicator']
-                    self.mode_indicator[i_ens, n] = vtg_data['mode_indicator']
+                    self.vtg_delta_time[i_ens, n] = vtg_data["delta_time"]
+                    self.vtg_header[i_ens, n] = vtg_data["header"]
+                    self.course_true[i_ens, n] = vtg_data["course_true"]
+                    self.true_indicator[i_ens, n] = vtg_data["true_indicator"]
+                    self.course_mag[i_ens, n] = vtg_data["course_mag"]
+                    self.mag_indicator[i_ens, n] = vtg_data["mag_indicator"]
+                    self.speed_knots[i_ens, n] = vtg_data["speed_knots"]
+                    self.knots_indicator[i_ens, n] = vtg_data["knots_indicator"]
+                    self.speed_kph[i_ens, n] = vtg_data["speed_kph"]
+                    self.kph_indicator[i_ens, n] = vtg_data["kph_indicator"]
+                    self.mode_indicator[i_ens, n] = vtg_data["mode_indicator"]
                 except:
                     pass
 
-        if 'ds' in data:
+        if "ds" in data:
 
             # Check size and expand if needed
-            if len(data['ds']) > self.dbt_delta_time.shape[1]:
-                self.dbt_expand(len(data['ds']))
+            if len(data["ds"]) > self.dbt_delta_time.shape[1]:
+                self.dbt_expand(len(data["ds"]))
 
-            for n, dbt_data in enumerate(data['ds']):
+            for n, dbt_data in enumerate(data["ds"]):
                 # Try implemented because of occasional garbage in data stream.
-                # This prevents a crash and data after garbage are not used, but any data before garbage is saved
+                # This prevents a crash and data after garbage are not used,
+                # but any data before garbage is saved
                 try:
-                    self.dbt_delta_time[i_ens, n] = dbt_data['delta_time']
-                    self.dbt_header[i_ens, n] = dbt_data['header']
-                    self.depth_ft[i_ens, n] = dbt_data['depth_ft']
-                    self.ft_indicator[i_ens, n] = dbt_data['ft_indicator']
-                    self.depth_m[i_ens, n] = dbt_data['depth_m']
-                    self.m_indicator[i_ens, n] = dbt_data['m_indicator']
-                    self.depth_fath[i_ens, n] = dbt_data['depth_fath']
-                    self.fath_indicator[i_ens, n] = dbt_data['fath_indicator']
+                    self.dbt_delta_time[i_ens, n] = dbt_data["delta_time"]
+                    self.dbt_header[i_ens, n] = dbt_data["header"]
+                    self.depth_ft[i_ens, n] = dbt_data["depth_ft"]
+                    self.ft_indicator[i_ens, n] = dbt_data["ft_indicator"]
+                    self.depth_m[i_ens, n] = dbt_data["depth_m"]
+                    self.m_indicator[i_ens, n] = dbt_data["m_indicator"]
+                    self.depth_fath[i_ens, n] = dbt_data["depth_fath"]
+                    self.fath_indicator[i_ens, n] = dbt_data["fath_indicator"]
                 except:
                     pass
 
-        if 'ext_heading' in data:
+        if "ext_heading" in data:
 
             # Check size and expand if needed
-            if len(data['ext_heading']) > self.hdt_delta_time.shape[1]:
-                self.hdt_expand(len(data['ext_heading']))
+            if len(data["ext_heading"]) > self.hdt_delta_time.shape[1]:
+                self.hdt_expand(len(data["ext_heading"]))
 
-            for n, hdt_data in enumerate(data['ext_heading']):
+            for n, hdt_data in enumerate(data["ext_heading"]):
                 # Try implemented because of occasional garbage in data stream.
-                # This prevents a crash and data after garbage are not used, but any data before garbage is saved
+                # This prevents a crash and data after garbage are not used,
+                # but any data before garbage is saved
                 try:
-                    self.hdt_delta_time[i_ens, n] = hdt_data['delta_time']
-                    self.hdt_header[i_ens, n] = hdt_data['header']
-                    self.heading_deg[i_ens, n] = hdt_data['heading_deg']
-                    self.h_true_indicator[i_ens, n] = hdt_data['h_true_indicator']
+                    self.hdt_delta_time[i_ens, n] = hdt_data["delta_time"]
+                    self.hdt_header[i_ens, n] = hdt_data["header"]
+                    self.heading_deg[i_ens, n] = hdt_data["heading_deg"]
+                    self.h_true_indicator[i_ens, n] = hdt_data["h_true_indicator"]
                 except:
                     pass
 
@@ -2951,38 +3137,54 @@ class Gps2(object):
 
         # Expand arrays
         self.gga_delta_time = np.concatenate(
-            (self.gga_delta_time, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.gga_delta_time, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.utc = np.concatenate(
-            (self.utc, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.utc, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.lat_deg = np.concatenate(
-            (self.lat_deg, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.lat_deg, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.lon_deg = np.concatenate(
-            (self.lon_deg, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.lon_deg, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.corr_qual = np.concatenate(
-            (self.corr_qual, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.corr_qual, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.num_sats = np.concatenate(
-            (self.num_sats, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.num_sats, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.hdop = np.concatenate(
-            (self.hdop, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.hdop, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.alt = np.concatenate(
-            (self.alt, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.alt, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.geoid = np.concatenate(
-            (self.geoid, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.geoid, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.d_gps_age = np.concatenate(
-            (self.d_gps_age, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.d_gps_age, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.ref_stat_id = np.concatenate(
-            (self.ref_stat_id, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.ref_stat_id, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
 
         self.gga_header = np.concatenate(
-            (self.gga_header, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.gga_header, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
         self.geoid_unit = np.concatenate(
-            (self.geoid_unit, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.geoid_unit, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
         self.alt_unit = np.concatenate(
-            (self.alt_unit, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.alt_unit, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
         self.lon_ref = np.concatenate(
-            (self.lon_ref, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.lon_ref, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
         self.lat_ref = np.concatenate(
-            (self.lat_ref, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.lat_ref, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
 
     def vtg_expand(self, n_samples):
         """Expand arrays.
@@ -2999,28 +3201,39 @@ class Gps2(object):
 
         # Expand arrays
         self.vtg_delta_time = np.concatenate(
-            (self.vtg_delta_time, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.vtg_delta_time, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.course_true = np.concatenate(
-            (self.course_true, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.course_true, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.course_mag = np.concatenate(
-            (self.course_mag, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.course_mag, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.speed_knots = np.concatenate(
-            (self.speed_knots, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.speed_knots, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.speed_kph = np.concatenate(
-            (self.speed_kph, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.speed_kph, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
 
         self.kph_indicator = np.concatenate(
-            (self.kph_indicator, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.kph_indicator, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
         self.mode_indicator = np.concatenate(
-            (self.mode_indicator, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.mode_indicator, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
         self.vtg_header = np.concatenate(
-            (self.vtg_header, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.vtg_header, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
         self.true_indicator = np.concatenate(
-            (self.true_indicator, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.true_indicator, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
         self.mag_indicator = np.concatenate(
-            (self.mag_indicator, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.mag_indicator, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
         self.knots_indicator = np.concatenate(
-            (self.knots_indicator, np.tile('', (n_ensembles, n_expansion))), axis=1)
+            (self.knots_indicator, np.tile("", (n_ensembles, n_expansion))), axis=1
+        )
 
     def dbt_expand(self, n_samples):
         """Expand arrays.
@@ -3037,22 +3250,30 @@ class Gps2(object):
 
         # Expand arrays
         self.dbt_delta_time = np.concatenate(
-            (self.dbt_delta_time, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.dbt_delta_time, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.depth_ft = np.concatenate(
-            (self.depth_ft, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.depth_ft, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.depth_m = np.concatenate(
-            (self.depth_m, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.depth_m, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.depth_fath = np.concatenate(
-            (self.depth_fath, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.depth_fath, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
 
         self.fath_indicator = np.concatenate(
-            (self.fath_indicator, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.fath_indicator, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.dbt_header = np.concatenate(
-            (self.dbt_header, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.dbt_header, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.ft_indicator = np.concatenate(
-            (self.ft_indicator, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.ft_indicator, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.m_indicator = np.concatenate(
-            (self.m_indicator, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.m_indicator, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
 
     def hdt_expand(self, n_samples):
         """Expand arrays.
@@ -3069,13 +3290,17 @@ class Gps2(object):
 
         # Expand the arrays
         self.hdt_delta_time = np.concatenate(
-            (self.hdt_delta_time, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.hdt_delta_time, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.heading_deg = np.concatenate(
-            (self.heading_deg, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.heading_deg, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.h_true_indicator = np.concatenate(
-            (self.h_true_indicator, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.h_true_indicator, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
         self.hdt_header = np.concatenate(
-            (self.hdt_header, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1)
+            (self.hdt_header, np.tile(np.nan, (n_ensembles, n_expansion))), axis=1
+        )
 
 
 class Nmea(object):
@@ -3101,11 +3326,11 @@ class Nmea(object):
         n_ensembles: int
             Number of ensembles
         """
-        self.gga = [''] * n_ensembles
-        self.gsa = [''] * n_ensembles
-        self.vtg = [''] * n_ensembles
+        self.gga = [""] * n_ensembles
+        self.gsa = [""] * n_ensembles
+        self.vtg = [""] * n_ensembles
         # self.raw = ['']*n_ensembles DSM: not sure this was used
-        self.dbt = [''] * n_ensembles
+        self.dbt = [""] * n_ensembles
 
     def populate_data(self, i_ens, data):
         """Populates the class with data for an ensemble.
@@ -3118,17 +3343,17 @@ class Nmea(object):
             Dictionary of all data for this ensemble
         """
 
-        if 'gga_sentence' in data:
-            self.gga[i_ens] = data['gga_sentence']
+        if "gga_sentence" in data:
+            self.gga[i_ens] = data["gga_sentence"]
 
-        if 'vtg_sentence' in data:
-            self.vtg[i_ens] = data['vtg_sentence']
+        if "vtg_sentence" in data:
+            self.vtg[i_ens] = data["vtg_sentence"]
 
-        if 'gsa_sentence' in data:
-            self.gsa[i_ens] = data['gsa_sentence']
+        if "gsa_sentence" in data:
+            self.gsa[i_ens] = data["gsa_sentence"]
 
-        if 'dbt_sentence' in data:
-            self.dbt[i_ens] = data['dbt_sentence']
+        if "dbt_sentence" in data:
+            self.dbt[i_ens] = data["dbt_sentence"]
 
 
 class Sensor(object):
@@ -3200,7 +3425,7 @@ class Sensor(object):
         Transducer depth in decimeters
     xmit_current: np.array(int)
         Transmit current
-    self.xmit_voltage = nans(n_ensembles)
+    self.xmit_voltage = nans((n_ensembles,))
         Transmit voltage
     self.vert_beam_eval_amp: np.array(int)
         Vertical beam amplitude
@@ -3223,43 +3448,43 @@ class Sensor(object):
             Number of ensembles
         """
 
-        self.ambient_temp = nans(n_ensembles)
-        self.attitude_temp = nans(n_ensembles)
-        self.attitude = nans(n_ensembles)
-        self.bit_test = nans(n_ensembles)
-        self.bit_test_count = nans(n_ensembles)
-        self.contam_sensor = nans(n_ensembles)
-        self.date = nans([n_ensembles, 3])
-        self.date_y2k = nans([n_ensembles, 4])
-        self.date_not_y2k = nans([n_ensembles, 3])
-        self.error_status_word = [''] * n_ensembles
-        self.heading_deg = nans(n_ensembles)
-        self.heading_std_dev_deg = nans(n_ensembles)
-        self.mpt_msc = nans([n_ensembles, 3])
-        self.num = nans(n_ensembles)
-        self.num_fact = nans(n_ensembles)
-        self.num_tot = nans(n_ensembles)
-        self.orient = [''] * n_ensembles
-        self.pitch_std_dev_deg = nans(n_ensembles)
-        self.pitch_deg = nans(n_ensembles)
-        self.pressure_neg = nans(n_ensembles)
-        self.pressure_pos = nans(n_ensembles)
-        self.pressure_pascal = nans(n_ensembles)
-        self.pressure_var_pascal = nans(n_ensembles)
-        self.roll_std_dev_deg = nans(n_ensembles)
-        self.roll_deg = nans(n_ensembles)
-        self.salinity_ppt = nans(n_ensembles)
-        self.sos_mps = nans(n_ensembles)
-        self.temperature_deg_c = nans(n_ensembles)
-        self.time = nans([n_ensembles, 4])
-        self.time_y2k = nans([n_ensembles, 4])
-        self.xdcr_depth_dm = nans(n_ensembles)
-        self.xmit_current = nans(n_ensembles)
-        self.xmit_voltage = nans(n_ensembles)
-        self.vert_beam_eval_amp = nans(n_ensembles)
-        self.vert_beam_RSSI_amp = nans(n_ensembles)
-        self.vert_beam_range_m = nans(n_ensembles)
-        self.vert_beam_gain = [''] * n_ensembles
+        self.ambient_temp = nans((n_ensembles,))
+        self.attitude_temp = nans((n_ensembles,))
+        self.attitude = nans((n_ensembles,))
+        self.bit_test = nans((n_ensembles,))
+        self.bit_test_count = nans((n_ensembles,))
+        self.contam_sensor = nans((n_ensembles,))
+        self.date = nans((n_ensembles, 3))
+        self.date_y2k = nans((n_ensembles, 4))
+        self.date_not_y2k = nans((n_ensembles, 3))
+        self.error_status_word = [""] * n_ensembles
+        self.heading_deg = nans((n_ensembles,))
+        self.heading_std_dev_deg = nans((n_ensembles,))
+        self.mpt_msc = nans((n_ensembles, 3))
+        self.num = nans((n_ensembles,))
+        self.num_fact = nans((n_ensembles,))
+        self.num_tot = nans((n_ensembles,))
+        self.orient = [""] * n_ensembles
+        self.pitch_std_dev_deg = nans((n_ensembles,))
+        self.pitch_deg = nans((n_ensembles,))
+        self.pressure_neg = nans((n_ensembles,))
+        self.pressure_pos = nans((n_ensembles,))
+        self.pressure_pascal = nans((n_ensembles,))
+        self.pressure_var_pascal = nans((n_ensembles,))
+        self.roll_std_dev_deg = nans((n_ensembles,))
+        self.roll_deg = nans((n_ensembles,))
+        self.salinity_ppt = nans((n_ensembles,))
+        self.sos_mps = nans((n_ensembles,))
+        self.temperature_deg_c = nans((n_ensembles,))
+        self.time = nans((n_ensembles, 4))
+        self.time_y2k = nans((n_ensembles, 4))
+        self.xdcr_depth_dm = nans((n_ensembles,))
+        self.xmit_current = nans((n_ensembles,))
+        self.xmit_voltage = nans((n_ensembles,))
+        self.vert_beam_eval_amp = nans((n_ensembles,))
+        self.vert_beam_RSSI_amp = nans((n_ensembles,))
+        self.vert_beam_range_m = nans((n_ensembles,))
+        self.vert_beam_gain = [""] * n_ensembles
         self.vert_beam_status = np.zeros(n_ensembles)
 
     def populate_data(self, i_ens, data):
@@ -3273,84 +3498,108 @@ class Sensor(object):
             Dictionary of all data for this ensemble
         """
 
-        if 'fixed_leader' in data and 'variable_leader' in data:
+        if "fixed_leader" in data and "variable_leader" in data:
             # Convert system_configuration_ls to 1s and 0s
-            bitls = "{0:08b}".format(data['fixed_leader']['system_configuration_ls'])
+            bitls = "{0:08b}".format(data["fixed_leader"]["system_configuration_ls"])
 
             # Convert first two bits to integer
             val = int(bitls[0], 2)
             if val == 0:
-                self.orient[i_ens] = 'Down'
+                self.orient[i_ens] = "Down"
             elif val == 1:
-                self.orient[i_ens] = 'Up'
+                self.orient[i_ens] = "Up"
             else:
-                self.orient[i_ens] = 'n/a'
+                self.orient[i_ens] = "n/a"
 
-            self.num[i_ens] = data['variable_leader']['ensemble_number']
+            self.num[i_ens] = data["variable_leader"]["ensemble_number"]
 
             # Store data and time as list
-            self.date_not_y2k[i_ens, :] = [data['variable_leader']['rtc_year'],
-                                                  data['variable_leader']['rtc_month'],
-                                                  data['variable_leader']['rtc_day']]
-            self.time[i_ens, :] = [data['variable_leader']['rtc_hour'],
-                                          data['variable_leader']['rtc_minutes'],
-                                          data['variable_leader']['rtc_seconds'],
-                                          data['variable_leader']['rtc_hundredths']]
-
-            self.num_fact[i_ens] = data['variable_leader']['ensemble_number_msb']
+            self.date_not_y2k[i_ens, :] = [
+                data["variable_leader"]["rtc_year"],
+                data["variable_leader"]["rtc_month"],
+                data["variable_leader"]["rtc_day"],
+            ]
+            self.time[i_ens, :] = [
+                data["variable_leader"]["rtc_hour"],
+                data["variable_leader"]["rtc_minutes"],
+                data["variable_leader"]["rtc_seconds"],
+                data["variable_leader"]["rtc_hundredths"],
+            ]
+
+            self.num_fact[i_ens] = data["variable_leader"]["ensemble_number_msb"]
             self.num_tot[i_ens] = self.num[i_ens] + self.num_fact[i_ens] * 65535
-            self.bit_test[i_ens] = data['variable_leader']['bit_fault']
-            self.bit_test_count[i_ens] = data['variable_leader']['bit_count']
-            self.sos_mps[i_ens] = data['variable_leader']['speed_of_sound']
-            self.xdcr_depth_dm[i_ens] = data['variable_leader']['depth_of_transducer']
-            self.heading_deg[i_ens] = data['variable_leader']['heading'] / 100.
-            self.pitch_deg[i_ens] = data['variable_leader']['pitch'] / 100.
-            self.roll_deg[i_ens] = data['variable_leader']['roll'] / 100.
-            self.salinity_ppt[i_ens] = data['variable_leader']['salinity']
-            self.temperature_deg_c[i_ens] = data['variable_leader']['temperature'] / 100.
-            self.mpt_msc[i_ens, :] = [data['variable_leader']['mpt_minutes'],
-                                             data['variable_leader']['mpt_seconds'],
-                                             data['variable_leader']['mpt_hundredths']]
-            self.heading_std_dev_deg[i_ens] = data['variable_leader']['heading_standard_deviation']
-            self.pitch_std_dev_deg[i_ens] = data['variable_leader']['pitch_standard_deviation'] / 10.
-            self.roll_std_dev_deg[i_ens] = data['variable_leader']['roll_standard_deviation'] / 10.
-            self.xmit_current[i_ens] = data['variable_leader']['transmit_current']
-            self.xmit_voltage[i_ens] = data['variable_leader']['transmit_voltage']
-            self.ambient_temp[i_ens] = data['variable_leader']['ambient_temperature']
-            self.pressure_pos[i_ens] = data['variable_leader']['pressure_positive']
-            self.pressure_neg[i_ens] = data['variable_leader']['pressure_negative']
-            self.attitude_temp[i_ens] = data['variable_leader']['attitude_temperature']
-            self.attitude[i_ens] = data['variable_leader']['attitude']
-            self.contam_sensor[i_ens] = data['variable_leader']['contamination_sensor']
-            self.error_status_word[i_ens] = "{0:032b}".format(data['variable_leader']['error_status_word'])
-            self.pressure_pascal[i_ens] = data['variable_leader']['pressure']
-            self.pressure_var_pascal[i_ens] = data['variable_leader']['pressure_variance']
+            self.bit_test[i_ens] = data["variable_leader"]["bit_fault"]
+            self.bit_test_count[i_ens] = data["variable_leader"]["bit_count"]
+            self.sos_mps[i_ens] = data["variable_leader"]["speed_of_sound"]
+            self.xdcr_depth_dm[i_ens] = data["variable_leader"]["depth_of_transducer"]
+            self.heading_deg[i_ens] = data["variable_leader"]["heading"] / 100.0
+            self.pitch_deg[i_ens] = data["variable_leader"]["pitch"] / 100.0
+            self.roll_deg[i_ens] = data["variable_leader"]["roll"] / 100.0
+            self.salinity_ppt[i_ens] = data["variable_leader"]["salinity"]
+            self.temperature_deg_c[i_ens] = (
+                data["variable_leader"]["temperature"] / 100.0
+            )
+            self.mpt_msc[i_ens, :] = [
+                data["variable_leader"]["mpt_minutes"],
+                data["variable_leader"]["mpt_seconds"],
+                data["variable_leader"]["mpt_hundredths"],
+            ]
+            self.heading_std_dev_deg[i_ens] = data["variable_leader"][
+                "heading_standard_deviation"
+            ]
+            self.pitch_std_dev_deg[i_ens] = (
+                data["variable_leader"]["pitch_standard_deviation"] / 10.0
+            )
+            self.roll_std_dev_deg[i_ens] = (
+                data["variable_leader"]["roll_standard_deviation"] / 10.0
+            )
+            self.xmit_current[i_ens] = data["variable_leader"]["transmit_current"]
+            self.xmit_voltage[i_ens] = data["variable_leader"]["transmit_voltage"]
+            self.ambient_temp[i_ens] = data["variable_leader"]["ambient_temperature"]
+            self.pressure_pos[i_ens] = data["variable_leader"]["pressure_positive"]
+            self.pressure_neg[i_ens] = data["variable_leader"]["pressure_negative"]
+            self.attitude_temp[i_ens] = data["variable_leader"]["attitude_temperature"]
+            self.attitude[i_ens] = data["variable_leader"]["attitude"]
+            self.contam_sensor[i_ens] = data["variable_leader"]["contamination_sensor"]
+            self.error_status_word[i_ens] = "{0:032b}".format(
+                data["variable_leader"]["error_status_word"]
+            )
+            self.pressure_pascal[i_ens] = data["variable_leader"]["pressure"]
+            self.pressure_var_pascal[i_ens] = data["variable_leader"][
+                "pressure_variance"
+            ]
 
             # Store Y2K date and time as list
-            self.date_y2k[i_ens, :] = [data['variable_leader']['rtc_y2k_century'],
-                                              data['variable_leader']['rtc_y2k_year'],
-                                              data['variable_leader']['rtc_y2k_month'],
-                                              data['variable_leader']['rtc_y2k_day']]
-            self.time_y2k[i_ens, :] = [data['variable_leader']['rtc_y2k_hour'],
-                                              data['variable_leader']['rtc_y2k_minutes'],
-                                              data['variable_leader']['rtc_y2k_seconds'],
-                                              data['variable_leader']['rtc_y2k_hundredths']]
+            self.date_y2k[i_ens, :] = [
+                data["variable_leader"]["rtc_y2k_century"],
+                data["variable_leader"]["rtc_y2k_year"],
+                data["variable_leader"]["rtc_y2k_month"],
+                data["variable_leader"]["rtc_y2k_day"],
+            ]
+            self.time_y2k[i_ens, :] = [
+                data["variable_leader"]["rtc_y2k_hour"],
+                data["variable_leader"]["rtc_y2k_minutes"],
+                data["variable_leader"]["rtc_y2k_seconds"],
+                data["variable_leader"]["rtc_y2k_hundredths"],
+            ]
             self.date[i_ens, :] = self.date_not_y2k[i_ens, :]
-            self.date[i_ens, 0] = self.date_y2k[i_ens, 0] * 100 + \
-                                         self.date_y2k[i_ens, 1]
-
-            if 'vertical_beam' in data:
-                self.vert_beam_eval_amp[i_ens] = data['vertical_beam']['eval_amp']
-                self.vert_beam_RSSI_amp[i_ens] = data['vertical_beam']['rssi']
-                self.vert_beam_range_m[i_ens] = data['vertical_beam']['range'] / 1000
-
-                # Use first 8 bits of status and the 6 the bit to determine the gain
-                temp = "{0:08b}".format(data['vertical_beam']['status'])
+            self.date[i_ens, 0] = (
+                self.date_y2k[i_ens, 0] * 100 + self.date_y2k[i_ens, 1]
+            )
+
+            if "vertical_beam" in data:
+                self.vert_beam_eval_amp[i_ens] = data["vertical_beam"]["eval_amp"]
+                self.vert_beam_RSSI_amp[i_ens] = data["vertical_beam"]["rssi"]
+                self.vert_beam_range_m[i_ens] = data["vertical_beam"]["range"] / 1000
+
+                # Use first 8 bits of status and the 6 the bit to determine
+                # the gain
+                temp = "{0:08b}".format(data["vertical_beam"]["status"])
                 self.vert_beam_status[i_ens] = int(temp[6:], 2)
-                if temp[5] == '0':
-                    self.vert_beam_gain[i_ens] = 'L'
+                if temp[5] == "0":
+                    self.vert_beam_gain[i_ens] = "L"
                 else:
-                    self.vert_beam_gain[i_ens] = 'H'
+                    self.vert_beam_gain[i_ens] = "H"
 
 
 class Surface(object):
@@ -3371,7 +3620,8 @@ class Surface(object):
     pergd: np.array(int)
         3D array of percent good for each beam, cell, and ensemble
     rssi: np.array(int)
-        3D array of return signal strength indicator for each beam, cell, and ensemble
+        3D array of return signal strength indicator for each beam, cell,
+        and ensemble
     """
 
     def __init__(self, n_ensembles, n_velocities, max_surface_bins):
@@ -3388,12 +3638,12 @@ class Surface(object):
         """
 
         self.no_cells = np.zeros(n_ensembles)
-        self.cell_size_cm = nans(n_ensembles)
-        self.dist_bin1_cm = nans(n_ensembles)
+        self.cell_size_cm = nans((n_ensembles,))
+        self.dist_bin1_cm = nans((n_ensembles,))
         self.vel_mps = np.tile([np.nan], [n_velocities, max_surface_bins, n_ensembles])
-        self.corr = nans([n_velocities, max_surface_bins, n_ensembles])
-        self.pergd = nans([n_velocities, max_surface_bins, n_ensembles])
-        self.rssi = nans([n_velocities, max_surface_bins, n_ensembles])
+        self.corr = nans((n_velocities, max_surface_bins, n_ensembles))
+        self.pergd = nans((n_velocities, max_surface_bins, n_ensembles))
+        self.rssi = nans((n_velocities, max_surface_bins, n_ensembles))
 
     def populate_data(self, i_ens, data, main_data):
         """Populates the class with data for an ensemble.
@@ -3408,26 +3658,38 @@ class Surface(object):
             Object of PD0TRDI
         """
 
-        if 'surface_leader' in data:
-            self.no_cells[i_ens] = data['surface_leader']['cell_count']
-            self.cell_size_cm[i_ens] = data['surface_leader']['cell_size']
-            self.dist_bin1_cm[i_ens] = data['surface_leader']['range_cell_1']
-
-        if 'surface_velocity' in data:
-            self.vel_mps[:main_data.n_velocities, :len(data['surface_velocity']['velocity']), i_ens] = \
-                np.array(data['surface_velocity']['velocity']).T
-
-        if 'surface_correlation' in data:
-            self.corr[:main_data.n_velocities, :len(data['surface_correlation']['correlation']), i_ens] = \
-                np.array(data['surface_correlation']['correlation']).T
-
-        if 'surface_intensity' in data:
-            self.rssi[:main_data.n_velocities, :len(data['surface_intensity']['rssi']), i_ens] = \
-                np.array(data['surface_intensity']['rssi']).T
-
-        if 'surface_percent_good' in data:
-            self.pergd[:main_data.n_velocities, :len(data['surface_percent_good']['percent_good']), i_ens] = \
-                np.array(data['surface_percent_good']['percent_good']).T
+        if "surface_leader" in data:
+            self.no_cells[i_ens] = data["surface_leader"]["cell_count"]
+            self.cell_size_cm[i_ens] = data["surface_leader"]["cell_size"]
+            self.dist_bin1_cm[i_ens] = data["surface_leader"]["range_cell_1"]
+
+        if "surface_velocity" in data:
+            self.vel_mps[
+                : main_data.n_velocities,
+                : len(data["surface_velocity"]["velocity"]),
+                i_ens,
+            ] = np.array(data["surface_velocity"]["velocity"]).T
+
+        if "surface_correlation" in data:
+            self.corr[
+                : main_data.n_velocities,
+                : len(data["surface_correlation"]["correlation"]),
+                i_ens,
+            ] = np.array(data["surface_correlation"]["correlation"]).T
+
+        if "surface_intensity" in data:
+            self.rssi[
+                : main_data.n_velocities,
+                : len(data["surface_intensity"]["rssi"]),
+                i_ens,
+            ] = np.array(data["surface_intensity"]["rssi"]).T
+
+        if "surface_percent_good" in data:
+            self.pergd[
+                : main_data.n_velocities,
+                : len(data["surface_percent_good"]["percent_good"]),
+                i_ens,
+            ] = np.array(data["surface_percent_good"]["percent_good"]).T
 
 
 class Wt(object):
@@ -3442,7 +3704,8 @@ class Wt(object):
     pergd: np.array(int)
         3D array of percent good for each beam, cell, and ensemble
     rssi: np.array(int)
-        3D array of return signal strength indicator for each beam, cell, and ensemble
+        3D array of return signal strength indicator for each beam, cell,
+        and ensemble
     """
 
     def __init__(self, n_bins, n_ensembles, n_velocities):
@@ -3458,10 +3721,10 @@ class Wt(object):
             Maximum number of bins in an ensemble in the transect
         """
 
-        self.corr = nans([n_velocities, n_bins, n_ensembles])
-        self.pergd = nans([n_velocities, n_bins, n_ensembles])
-        self.rssi = nans([n_velocities, n_bins, n_ensembles])
-        self.vel_mps = nans([n_velocities, n_bins, n_ensembles])
+        self.corr = nans((n_velocities, n_bins, n_ensembles))
+        self.pergd = nans((n_velocities, n_bins, n_ensembles))
+        self.rssi = nans((n_velocities, n_bins, n_ensembles))
+        self.vel_mps = nans((n_velocities, n_bins, n_ensembles))
 
     def populate_data(self, i_ens, data, main_data):
         """Populates the class with data for an ensemble.
@@ -3476,28 +3739,35 @@ class Wt(object):
             Object of PD0TRDI
         """
 
-
-        if 'velocity' in data:
+        if "velocity" in data:
             # Check size in case array needs to be expanded
             if main_data.Cfg.wn[i_ens] > self.vel_mps.shape[1]:
-                append = np.zeros([self.vel_mps.shape[0],
-                                   int(main_data.Cfg.wn[i_ens] - self.vel_mps.shape[1]),
-                                   self.vel_mps.shape[2]])
+                append = np.zeros(
+                    [
+                        self.vel_mps.shape[0],
+                        int(main_data.Cfg.wn[i_ens] - self.vel_mps.shape[1]),
+                        self.vel_mps.shape[2],
+                    ]
+                )
                 self.vel_mps = np.hstack([self.vel_mps, append])
                 self.corr = np.hstack([self.corr, append])
                 self.rssi = np.hstack([self.rssi, append])
                 self.pergd = np.hstack([self.pergd, append])
 
             # Reformat and assign data
-            if 'velocity' in data:
-                self.vel_mps[:main_data.n_velocities, :int(main_data.Cfg.wn[i_ens]), i_ens] = \
-                    np.array(data['velocity']['data']).T
-            if 'correlation' in data:
-                self.corr[:main_data.n_velocities, :int(main_data.Cfg.wn[i_ens]), i_ens] = \
-                    np.array(data['correlation']['data']).T
-            if 'echo_intensity' in data:
-                self.rssi[:main_data.n_velocities, :int(main_data.Cfg.wn[i_ens]), i_ens] = \
-                    np.array(data['echo_intensity']['data']).T
-            if 'percent_good' in data:
-                self.pergd[:main_data.n_velocities, :int(main_data.Cfg.wn[i_ens]), i_ens] = \
-                    np.array(data['percent_good']['data']).T
+            if "velocity" in data:
+                self.vel_mps[
+                    : main_data.n_velocities, : int(main_data.Cfg.wn[i_ens]), i_ens
+                ] = np.array(data["velocity"]["data"]).T
+            if "correlation" in data:
+                self.corr[
+                    : main_data.n_velocities, : int(main_data.Cfg.wn[i_ens]), i_ens
+                ] = np.array(data["correlation"]["data"]).T
+            if "echo_intensity" in data:
+                self.rssi[
+                    : main_data.n_velocities, : int(main_data.Cfg.wn[i_ens]), i_ens
+                ] = np.array(data["echo_intensity"]["data"]).T
+            if "percent_good" in data:
+                self.pergd[
+                    : main_data.n_velocities, : int(main_data.Cfg.wn[i_ens]), i_ens
+                ] = np.array(data["percent_good"]["data"]).T
diff --git a/Classes/PreMeasurement.py b/Classes/PreMeasurement.py
new file mode 100644
index 0000000000000000000000000000000000000000..cbb09a63641332664d05ac8c72ddc57a0bf8a450
--- /dev/null
+++ b/Classes/PreMeasurement.py
@@ -0,0 +1,624 @@
+import re
+import copy
+import numpy as np
+
+
+class PreMeasurement(object):
+    """Stores tests, calibrations, and evaluations conducted prior ot
+    measurement.
+
+    Attributes
+    ----------
+    time_stamp: str
+        Time and date of test
+    data: str
+        Raw data from test
+    result: dict
+        Dictionary of test results. Varies by test.
+    """
+
+    def __init__(self):
+        """Initialize instance variables."""
+
+        self.time_stamp = None
+        self.data = None
+        self.result = {}
+
+    def populate_data(self, time_stamp, data_in, data_type):
+        """Coordinates storing of test, calibration, and evaluation data.
+
+        Parameters
+        ----------
+        time_stamp: str
+            Time and date text.
+        data_in: str
+            Raw data from test
+        data_type: str
+            Type of data, C-compass, TST-TRDI test, SST-SonTek test
+        """
+
+        # Store time stamp and data
+        self.time_stamp = time_stamp
+        self.data = data_in
+
+        # Process data depending on data type and store result
+        if data_type[1] == "C":
+            self.compass_read()
+        elif data_type == "TST":
+            self.sys_test_read()
+            self.pt3_data()
+        elif data_type == "SST":
+            self.sys_test_read()
+
+    def compass_read(self):
+        """Method for getting compass evaluation data"""
+
+        # Match regex for compass evaluation error:
+        splits = re.split(
+            "(Total error:|Double Cycle Errors:|Error from calibration:)", self.data
+        )
+        if len(splits) > 1:
+            error = float(re.search("\d+\.*\d*", splits[-1])[0])
+        else:
+            error = "N/A"
+        self.result["compass"] = {"error": error}
+
+    @staticmethod
+    def cc_qrev_mat_in(meas_struct):
+        """Processes the Matlab data structure to obtain a list of
+        Premeasurement objects containing compass calibration
+        data from the Matlab data structure.
+
+        Parameters
+        ----------
+        meas_struct: mat_struct
+            Matlab data structure obtained from sio.loadmat
+
+        Returns
+        -------
+        cc: list
+            List of Premeasurement data objects
+        """
+        cc = []
+        if hasattr(meas_struct, "compassCal"):
+            if type(meas_struct.compassCal) is np.ndarray:
+                for cal in meas_struct.compassCal:
+                    pm = PreMeasurement()
+                    pm.compass_populate_from_qrev_mat(cal)
+                    cc.append(pm)
+            elif len(meas_struct.compassCal.data) > 0:
+                pm = PreMeasurement()
+                pm.compass_populate_from_qrev_mat(meas_struct.compassCal)
+                cc.append(pm)
+
+        return cc
+
+    @staticmethod
+    def ce_qrev_mat_in(meas_struct):
+        """Processes the Matlab data structure to obtain a list of
+        Premeasurement objects containing compass evaluation
+        data from the Matlab data structure.
+
+        Parameters
+        ----------
+        meas_struct: mat_struct
+            Matlab data structure obtained from sio.loadmat
+
+        Returns
+        -------
+        ce: list
+            List of Premeasurement data objects
+        """
+        ce = []
+        if hasattr(meas_struct, "compassEval"):
+            if type(meas_struct.compassEval) is np.ndarray:
+                for comp_eval in meas_struct.compassEval:
+                    pm = PreMeasurement()
+                    pm.compass_populate_from_qrev_mat(comp_eval)
+                    ce.append(pm)
+            elif len(meas_struct.compassEval.data) > 0:
+                pm = PreMeasurement()
+                pm.compass_populate_from_qrev_mat(meas_struct.compassEval)
+                ce.append(pm)
+        return ce
+
+    def compass_populate_from_qrev_mat(self, data_in):
+        """Populated Premeasurement instance variables with data from QRev
+        Matlab file.
+
+        Parameters
+        ----------
+        data_in: mat_struct
+            mat_struct_object containing compass cal/eval data
+        """
+        self.data = data_in.data
+        self.time_stamp = data_in.timeStamp
+        if hasattr(data_in, "result"):
+            self.result = {"compass": {"error": data_in.result.compass.error}}
+        else:
+            # Match regex for compass evaluation error:
+            splits = re.split(
+                "(Total error:|Double Cycle Errors:|Error from calibration:)", self.data
+            )
+            if len(splits) > 1:
+                error = float(re.search("\d+\.*\d*", splits[-1])[0])
+            else:
+                error = "N/A"
+            self.result["compass"] = {"error": error}
+
+    def sys_test_read(self):
+        """Method for reading the system test data"""
+        if self.data is not None:
+            # Match regex for number of tests and number of failures
+            num_tests = re.findall(
+                "(Fail|FAIL|F A I L|Pass|PASS|NOT DETECTED|P A S S)", self.data
+            )
+            num_fails = re.findall("(Fail|FAIL|F A I L)", self.data)
+
+            # Store results
+            self.result = {"sysTest": {"n_tests": len(num_tests)}}
+            self.result["sysTest"]["n_failed"] = len(num_fails)
+        else:
+            self.result = {"sysTest": {"n_tests": None}}
+            self.result["sysTest"]["n_failed"] = None
+
+    @staticmethod
+    def sys_test_qrev_mat_in(meas_struct):
+        """Processes the Matlab data structure to obtain a list of
+        Premeasurement objects containing system test data
+        from the Matlab data structure.
+
+           Parameters
+           ----------
+           meas_struct: mat_struct
+               Matlab data structure obtained from sio.loadmat
+
+           Returns
+           -------
+           system_tst: list
+               List of Premeasurement data objects
+        """
+        system_tst = []
+        if hasattr(meas_struct, "sysTest"):
+            try:
+                if type(meas_struct.sysTest) == np.ndarray:
+                    for test in meas_struct.sysTest:
+                        tst = PreMeasurement()
+                        tst.sys_tst_populate_from_qrev_mat(test)
+                        system_tst.append(tst)
+                elif len(meas_struct.sysTest.data) > 0:
+                    tst = PreMeasurement()
+                    tst.sys_tst_populate_from_qrev_mat(meas_struct.sysTest)
+                    system_tst.append(tst)
+            except AttributeError:
+                pass
+        return system_tst
+
+    def sys_tst_populate_from_qrev_mat(self, test_in):
+        """Populated Premeasurement instance variables with data from QRev
+        Matlab file.
+
+        Parameters
+        ----------
+        test_in: mat_struct
+            mat_struct_object containing system test data
+        """
+        try:
+            self.data = test_in.data
+            self.time_stamp = test_in.timeStamp
+            self.result = {"sysTest": {"n_failed": test_in.result.sysTest.nFailed}}
+            self.result["sysTest"]["n_tests"] = test_in.result.sysTest.nTests
+
+            if hasattr(test_in.result, "pt3"):
+                data_types = {
+                    "corr_table": np.array([]),
+                    "sdc": np.array([]),
+                    "cdc": np.array([]),
+                    "noise_floor": np.array([]),
+                }
+                test_types = {
+                    "high_wide": data_types.copy(),
+                    "high_narrow": data_types.copy(),
+                    "low_wide": data_types.copy(),
+                    "low_narrow": data_types.copy(),
+                }
+                pt3 = {
+                    "hard_limit": copy.deepcopy(test_types),
+                    "linear": copy.deepcopy(test_types),
+                }
+                if hasattr(test_in.result.pt3, "hardLimit"):
+                    if hasattr(test_in.result.pt3.hardLimit, "hw"):
+                        pt3["hard_limit"]["high_wide"][
+                            "corr_table"
+                        ] = test_in.result.pt3.hardLimit.hw.corrTable
+                        pt3["hard_limit"]["high_wide"][
+                            "sdc"
+                        ] = test_in.result.pt3.hardLimit.hw.sdc
+                        pt3["hard_limit"]["high_wide"][
+                            "cdc"
+                        ] = test_in.result.pt3.hardLimit.hw.cdc
+                        pt3["hard_limit"]["high_wide"][
+                            "noise_floor"
+                        ] = test_in.result.pt3.hardLimit.hw.noiseFloor
+                    if hasattr(test_in.result.pt3.hardLimit, "lw"):
+                        pt3["hard_limit"]["low_wide"][
+                            "corr_table"
+                        ] = test_in.result.pt3.hardLimit.lw.corrTable
+                        pt3["hard_limit"]["low_wide"][
+                            "sdc"
+                        ] = test_in.result.pt3.hardLimit.lw.sdc
+                        pt3["hard_limit"]["low_wide"][
+                            "cdc"
+                        ] = test_in.result.pt3.hardLimit.lw.cdc
+                        pt3["hard_limit"]["low_wide"][
+                            "noise_floor"
+                        ] = test_in.result.pt3.hardLimit.lw.noiseFloor
+                    if hasattr(test_in.result.pt3.hardLimit, "hn"):
+                        pt3["hard_limit"]["high_narrow"][
+                            "corr_table"
+                        ] = test_in.result.pt3.hardLimit.hn.corrTable
+                        pt3["hard_limit"]["high_narrow"][
+                            "sdc"
+                        ] = test_in.result.pt3.hardLimit.hn.sdc
+                        pt3["hard_limit"]["high_narrow"][
+                            "cdc"
+                        ] = test_in.result.pt3.hardLimit.hn.cdc
+                        pt3["hard_limit"]["high_narrow"][
+                            "noise_floor"
+                        ] = test_in.result.pt3.hardLimit.hn.noiseFloor
+                    if hasattr(test_in.result.pt3.hardLimit, "ln"):
+                        pt3["hard_limit"]["low_narrow"][
+                            "corr_table"
+                        ] = test_in.result.pt3.hardLimit.ln.corrTable
+                        pt3["hard_limit"]["low_narrow"][
+                            "sdc"
+                        ] = test_in.result.pt3.hardLimit.ln.sdc
+                        pt3["hard_limit"]["low_narrow"][
+                            "cdc"
+                        ] = test_in.result.pt3.hardLimit.ln.cdc
+                        pt3["hard_limit"]["low_narrow"][
+                            "noise_floor"
+                        ] = test_in.result.pt3.hardLimit.ln.noiseFloor
+                if hasattr(test_in.result.pt3, "linear"):
+                    if hasattr(test_in.result.pt3.linear, "hw"):
+                        pt3["linear"]["high_wide"][
+                            "corr_table"
+                        ] = test_in.result.pt3.linear.hw.corrTable
+                        pt3["linear"]["high_wide"][
+                            "noise_floor"
+                        ] = test_in.result.pt3.linear.hw.noiseFloor
+                    if hasattr(test_in.result.pt3.linear, "lw"):
+                        pt3["linear"]["low_wide"][
+                            "corr_table"
+                        ] = test_in.result.pt3.linear.lw.corrTable
+                        pt3["linear"]["low_wide"][
+                            "noise_floor"
+                        ] = test_in.result.pt3.linear.lw.noiseFloor
+                    if hasattr(test_in.result.pt3.linear, "hn"):
+                        pt3["linear"]["high_narrow"][
+                            "corr_table"
+                        ] = test_in.result.pt3.linear.hn.corrTable
+                        pt3["linear"]["high_narrow"][
+                            "noise_floor"
+                        ] = test_in.result.pt3.linear.hn.noiseFloor
+                    if hasattr(test_in.result.pt3.linear, "ln"):
+                        pt3["linear"]["low_narrow"][
+                            "corr_table"
+                        ] = test_in.result.pt3.linear.ln.corrTable
+                        pt3["linear"]["low_narrow"][
+                            "noise_floor"
+                        ] = test_in.result.pt3.linear.ln.noiseFloor
+
+                self.result["pt3"] = pt3
+        except AttributeError:
+            # Match regex for number of tests and number of failures
+            num_tests = re.findall(
+                "(Fail|FAIL|F A I L|Pass|PASS|NOT DETECTED|P A S S)", test_in.data
+            )
+            num_fails = re.findall("(Fail|FAIL|F A I L)", test_in.data)
+
+            # Store results
+            self.result = {"sysTest": {"n_tests": len(num_tests)}}
+            self.result["sysTest"]["n_failed"] = len(num_fails)
+
+    def pt3_data(self):
+        """Method for processing the data in the correlation matrices."""
+        try:
+            data_types = {
+                "corr_table": np.array([]),
+                "sdc": np.array([]),
+                "cdc": np.array([]),
+                "noise_floor": np.array([]),
+            }
+            test_types = {
+                "high_wide": data_types.copy(),
+                "high_narrow": data_types.copy(),
+                "low_wide": data_types.copy(),
+                "low_narrow": data_types.copy(),
+            }
+            pt3 = {
+                "hard_limit": copy.deepcopy(test_types),
+                "linear": copy.deepcopy(test_types),
+            }
+
+            # Match regex for correlation tables
+            matches = re.findall("Lag.*?0", self.data, re.DOTALL)
+
+            # Count the number or correlation tables to process
+            correl_count = 0
+            for match in matches:
+                bm1_matches = re.findall("Bm1", match)
+                correl_count += len(bm1_matches)
+
+            # Correlation table match
+            lag_matches = re.findall("Lag.*?^\s*$", self.data, re.MULTILINE | re.DOTALL)
+
+            # Sin match
+            sin_match = re.findall(
+                "((Sin|SIN).*?^\s*$)", self.data, re.MULTILINE | re.DOTALL
+            )[0][0]
+            sin_array = np.array(re.findall("\d+\.*\d*", sin_match), dtype=int)
+
+            # Cos match
+            cos_match = re.findall(
+                "((Cos|COS).*?^\s*$)", self.data, re.MULTILINE | re.DOTALL
+            )[0][0]
+            cos_array = np.array(re.findall("\d+\.*\d*", cos_match), dtype=int)
+
+            # RSSI match
+            rssi_array = np.array([])
+            rssi_matches = re.findall(
+                "RSSI.*?^\s*$", self.data, re.MULTILINE | re.DOTALL
+            )
+            for rssi_match in rssi_matches:
+                rssi_array = np.hstack(
+                    (
+                        rssi_array,
+                        np.array(re.findall("\d+\.*\d*", rssi_match), dtype=int),
+                    )
+                )
+
+            # Process each set of correlation tables
+            for n, lag_match in enumerate(lag_matches):
+
+                # Count the Bm1 string to know how many tables to read
+                bm_count = len(re.findall("Bm1", lag_match))
+
+                # Extract the table into list
+                numbers = re.findall("\d+\.*\d*", lag_match)
+
+                # Create array from data in table
+                corr_data = np.array(
+                    numbers[(bm_count * 4) : (bm_count * 44)], dtype=int
+                ).reshape([8, (bm_count * 4) + 1])[:, 1::]
+
+                # Only one pt3 test. Typical of Rio Grande and Streampro
+                if bm_count == 1:
+
+                    # Assign matrix slices to corresponding variables
+                    # corr_hlimit_hgain_wband = corr_data
+                    pt3["hard_limit"]["high_wide"]["corr_table"] = corr_data
+                    pt3["hard_limit"]["high_wide"]["sdc"] = sin_array[0:4]
+                    pt3["hard_limit"]["high_wide"]["cdc"] = cos_array[0:4]
+                    pt3["hard_limit"]["high_wide"]["noise_floor"] = rssi_array[0:4]
+
+                # 4 tests arranged in groups of 2. All data are hard limited.
+                elif bm_count == 2 and correl_count == 4:
+
+                    # Hard limited wide bandwidth (n=0)
+                    if n == 0:
+
+                        pt3["hard_limit"]["high_wide"]["corr_table"] = corr_data[:, 0:4]
+                        pt3["hard_limit"]["high_wide"]["sdc"] = sin_array[
+                            n * 4 : (n + 1) * 4
+                        ]
+                        pt3["hard_limit"]["high_wide"]["cdc"] = cos_array[
+                            n * 4 : (n + 1) * 4
+                        ]
+                        pt3["hard_limit"]["high_wide"]["noise_floor"] = rssi_array[
+                            n * 4 : (n + 1) * 4
+                        ]
+
+                        pt3["hard_limit"]["low_wide"]["corr_table"] = corr_data[:, 4::]
+                        pt3["hard_limit"]["low_wide"]["sdc"] = sin_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+                        pt3["hard_limit"]["low_wide"]["cdc"] = cos_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+                        pt3["hard_limit"]["low_wide"]["noise_floor"] = rssi_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+
+                    # Hard limited narrow bandwidth (n=1)
+                    elif n == 1:
+
+                        pt3["hard_limit"]["high_narrow"]["corr_table"] = corr_data[
+                            :, 0:4
+                        ]
+                        pt3["hard_limit"]["high_narrow"]["sdc"] = sin_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+                        pt3["hard_limit"]["high_narrow"]["cdc"] = cos_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+                        pt3["hard_limit"]["high_narrow"]["noise_floor"] = rssi_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+
+                        pt3["hard_limit"]["low_narrow"]["corr_table"] = corr_data[
+                            :, 4::
+                        ]
+                        pt3["hard_limit"]["low_narrow"]["sdc"] = sin_array[
+                            (n + 2) * 4 : (n + 3) * 4
+                        ]
+                        pt3["hard_limit"]["low_narrow"]["cdc"] = cos_array[
+                            (n + 2) * 4 : (n + 3) * 4
+                        ]
+                        pt3["hard_limit"]["low_narrow"]["noise_floor"] = rssi_array[
+                            (n + 2) * 4 : (n + 3) * 4
+                        ]
+
+                # 8 tests arranged in sets of 2. The linear is 1st followed
+                # by the hard limit.
+                elif bm_count == 2 and correl_count == 8:
+
+                    # Hard limit bandwidth (n=0)
+                    if n == 0:
+
+                        pt3["hard_limit"]["high_wide"]["corr_table"] = corr_data[:, 0:4]
+                        pt3["hard_limit"]["high_wide"]["sdc"] = sin_array[
+                            n * 4 : (n + 1) * 4
+                        ]
+                        pt3["hard_limit"]["high_wide"]["cdc"] = cos_array[
+                            n * 4 : (n + 1) * 4
+                        ]
+                        pt3["hard_limit"]["high_wide"]["noise_floor"] = rssi_array[
+                            n * 4 : (n + 1) * 4
+                        ]
+
+                        pt3["hard_limit"]["low_wide"]["corr_table"] = corr_data[:, 4::]
+                        pt3["hard_limit"]["low_wide"]["sdc"] = sin_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+                        pt3["hard_limit"]["low_wide"]["cdc"] = cos_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+                        pt3["hard_limit"]["low_wide"]["noise_floor"] = rssi_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+
+                    # Hard limit narrow bandwidth (n=1)
+                    elif n == 1:
+
+                        pt3["hard_limit"]["high_narrow"]["corr_table"] = corr_data[
+                            :, 0:4
+                        ]
+                        pt3["hard_limit"]["high_narrow"]["sdc"] = sin_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+                        pt3["hard_limit"]["high_narrow"]["cdc"] = cos_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+                        pt3["hard_limit"]["high_narrow"]["noise_floor"] = rssi_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+
+                        pt3["hard_limit"]["low_narrow"]["corr_table"] = corr_data[
+                            :, 4::
+                        ]
+                        pt3["hard_limit"]["low_narrow"]["sdc"] = sin_array[
+                            (n + 2) * 4 : (n + 3) * 4
+                        ]
+                        pt3["hard_limit"]["low_narrow"]["cdc"] = cos_array[
+                            (n + 2) * 4 : (n + 3) * 4
+                        ]
+                        pt3["hard_limit"]["low_narrow"]["noise_floor"] = rssi_array[
+                            (n + 2) * 4 : (n + 3) * 4
+                        ]
+
+                    # Linear wide bandwidth (n=2)
+                    elif n == 2:
+
+                        pt3["linear"]["high_wide"]["corr_table"] = corr_data[:, 0:4]
+                        pt3["linear"]["high_wide"]["noise_floor"] = rssi_array[
+                            (n + 2) * 4 : (n + 3) * 4
+                        ]
+
+                        pt3["linear"]["low_wide"]["corr_table"] = corr_data[:, 4::]
+                        pt3["linear"]["low_wide"]["noise_floor"] = rssi_array[
+                            (n + 3) * 4 : (n + 4) * 4
+                        ]
+
+                    # Linear narrow bandwidth (n=3)
+                    elif n == 3:
+
+                        pt3["linear"]["high_narrow"]["corr_table"] = corr_data[:, 0:4]
+                        pt3["linear"]["high_narrow"]["noise_floor"] = rssi_array[
+                            (n + 3) * 4 : (n + 4) * 4
+                        ]
+
+                        pt3["linear"]["low_narrow"]["corr_table"] = corr_data[:, 4::]
+                        pt3["linear"]["low_narrow"]["noise_floor"] = rssi_array[
+                            (n + 4) * 4 : (n + 5) * 4
+                        ]
+
+                # 8 tests in groups of 4. Hard limit is the first group then
+                # the linear.
+                elif bm_count == 4:
+
+                    # Hard limit data (n=0)
+                    if n == 0:
+
+                        pt3["hard_limit"]["high_wide"]["corr_table"] = corr_data[:, 0:4]
+                        pt3["hard_limit"]["high_wide"]["sdc"] = sin_array[
+                            n * 4 : (n + 1) * 4
+                        ]
+                        pt3["hard_limit"]["high_wide"]["cdc"] = cos_array[
+                            n * 4 : (n + 1) * 4
+                        ]
+                        pt3["hard_limit"]["high_wide"]["noise_floor"] = rssi_array[
+                            n * 4 : (n + 1) * 4
+                        ]
+
+                        pt3["hard_limit"]["low_wide"]["corr_table"] = corr_data[:, 4:8]
+                        pt3["hard_limit"]["low_wide"]["sdc"] = sin_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+                        pt3["hard_limit"]["low_wide"]["cdc"] = cos_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+                        pt3["hard_limit"]["low_wide"]["noise_floor"] = rssi_array[
+                            (n + 1) * 4 : (n + 2) * 4
+                        ]
+
+                        pt3["hard_limit"]["high_narrow"]["corr_table"] = corr_data[
+                            :, 8:12
+                        ]
+                        pt3["hard_limit"]["high_narrow"]["sdc"] = sin_array[
+                            (n + 2) * 4 : (n + 3) * 4
+                        ]
+                        pt3["hard_limit"]["high_narrow"]["cdc"] = cos_array[
+                            (n + 2) * 4 : (n + 3) * 4
+                        ]
+                        pt3["hard_limit"]["high_narrow"]["noise_floor"] = rssi_array[
+                            (n + 2) * 4 : (n + 3) * 4
+                        ]
+
+                        pt3["hard_limit"]["low_narrow"]["corr_table"] = corr_data[
+                            :, 12::
+                        ]
+                        pt3["hard_limit"]["low_narrow"]["sdc"] = sin_array[
+                            (n + 3) * 4 : (n + 4) * 4
+                        ]
+                        pt3["hard_limit"]["low_narrow"]["cdc"] = cos_array[
+                            (n + 3) * 4 : (n + 4) * 4
+                        ]
+                        pt3["hard_limit"]["low_narrow"]["noise_floor"] = rssi_array[
+                            (n + 3) * 4 : (n + 4) * 4
+                        ]
+
+                    # Linear data (n=1)
+                    else:
+                        pt3["linear"]["high_wide"]["corr_table"] = corr_data[:, 0:4]
+                        pt3["linear"]["high_wide"]["noise_floor"] = rssi_array[
+                            (n + 3) * 4 : (n + 4) * 4
+                        ]
+
+                        pt3["linear"]["low_wide"]["corr_table"] = corr_data[:, 4:8]
+                        pt3["linear"]["low_wide"]["noise_floor"] = rssi_array[
+                            (n + 4) * 4 : (n + 5) * 4
+                        ]
+
+                        pt3["linear"]["high_narrow"]["corr_table"] = corr_data[:, 8:12]
+                        pt3["linear"]["high_narrow"]["noise_floor"] = rssi_array[
+                            (n + 5) * 4 : (n + 6) * 4
+                        ]
+
+                        pt3["linear"]["low_narrow"]["corr_table"] = corr_data[:, 12::]
+                        pt3["linear"]["low_narrow"]["noise_floor"] = rssi_array[
+                            (n + 6) * 4 : (n + 7) * 4
+                        ]
+            self.result["pt3"] = pt3
+        except Exception:
+            pass
diff --git a/Classes/Python2Matlab.py b/Classes/Python2Matlab.py
new file mode 100644
index 0000000000000000000000000000000000000000..e36cbd63f4e42b5c1ebae0dad5813a1090fb3509
--- /dev/null
+++ b/Classes/Python2Matlab.py
@@ -0,0 +1,781 @@
+import numpy as np
+import pandas as pd
+import scipy.io as sio
+import copy as copy
+from Classes.PreMeasurement import PreMeasurement
+
+
+class Python2Matlab(object):
+    """Converts python meas class to QRev for Matlab structure.
+
+    Attributes
+    ----------
+    matlab_dict: dict
+        Dictionary of Matlab structures
+    """
+
+    def __init__(self, meas, checked):
+        """Initialize dictionaries and convert Python data to Matlab
+        structures.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # Create Python to Matlab variable name conversion dictionary
+        py_2_mat_dict = self.create_py_2_mat_dict()
+
+        # Initialize Matlab dictionary
+        self.matlab_dict = dict()
+
+        # Apply conversion of Python data to be compatible with Matlab
+        # conventions
+        meas_mat = self.data2matlab(meas)
+
+        checked_idx = np.array(checked)
+        checked_idx_meas = np.copy(checked_idx)
+        np.append(checked_idx_meas, len(meas_mat.extrap_fit.sel_fit) - 1)
+
+        # Convert Python data structure to Matlab
+        self.matlab_dict["stationName"] = meas_mat.station_name
+        if self.matlab_dict["stationName"] is None:
+            self.matlab_dict["stationName"] = ""
+        self.matlab_dict["stationNumber"] = meas_mat.station_number
+        if self.matlab_dict["stationNumber"] is None:
+            self.matlab_dict["stationNumber"] = ""
+        self.matlab_dict["persons"] = meas_mat.persons
+        self.matlab_dict["meas_number"] = meas_mat.meas_number
+        self.matlab_dict["stage_start_m"] = meas_mat.stage_start_m
+        self.matlab_dict["stage_end_m"] = meas_mat.stage_end_m
+        self.matlab_dict["stage_meas_m"] = meas_mat.stage_meas_m
+        self.matlab_dict["processing"] = meas_mat.processing
+        self.matlab_dict["extTempChk"] = meas_mat.ext_temp_chk
+        self.matlab_dict["userRating"] = meas_mat.user_rating
+        self.matlab_dict["initialSettings"] = meas_mat.initial_settings
+        self.matlab_dict["comments"] = self.comment2struct(meas_mat.comments)
+        self.matlab_dict["compassCal"] = self.listobj2struct(
+            meas_mat.compass_cal, py_2_mat_dict
+        )
+        self.matlab_dict["compassEval"] = self.listobj2struct(
+            meas_mat.compass_eval, py_2_mat_dict
+        )
+        self.matlab_dict["sysTest"] = self.listobj2struct(
+            meas_mat.system_tst, py_2_mat_dict
+        )
+        discharge = np.copy(meas_mat.discharge)
+        discharge_sel = [discharge[i] for i in checked_idx]
+        self.matlab_dict["discharge"] = self.listobj2struct(
+            discharge_sel, py_2_mat_dict
+        )
+        transects = np.copy(meas_mat.transects)
+        transects_sel = [transects[i] for i in checked_idx]
+        self.matlab_dict["transects"] = self.listobj2struct(
+            transects_sel, py_2_mat_dict
+        )
+        extrap = copy.deepcopy(meas_mat.extrap_fit)
+        self.matlab_dict["extrapFit"] = self.listobj2struct([extrap], py_2_mat_dict)
+        # Check for multiple moving-bed tests
+        if type(meas_mat.mb_tests) == list:
+            mb_tests = self.listobj2struct(meas_mat.mb_tests, py_2_mat_dict)
+        else:
+            mb_tests = self.obj2dict(meas_mat.mb_tests, py_2_mat_dict)
+        if len(mb_tests) == 0:
+            mb_tests = np.array([])
+
+        self.matlab_dict["mbTests"] = mb_tests
+
+        self.matlab_dict["observed_no_moving_bed"] = meas_mat.observed_no_moving_bed
+
+        self.matlab_dict["uncertainty"] = self.listobj2struct(
+            [meas_mat.uncertainty], py_2_mat_dict
+        )
+        self.matlab_dict["qa"] = self.listobj2struct([meas_mat.qa], py_2_mat_dict)
+        self.matlab_dict["run_oursin"] = meas_mat.run_oursin
+        if meas_mat.oursin is not None:
+            self.matlab_dict["oursin"] = self.listobj2struct(
+                [meas_mat.oursin], py_2_mat_dict
+            )
+
+    @staticmethod
+    def listobj2struct(list_in, new_key_dict=None):
+        """Converts a list of objects to a structured array.
+
+        Parameters
+        ----------
+        list_in: list
+            List of objects
+        new_key_dict: dict
+            Dictionary to translate python variable names to Matlab variable
+            names
+
+        Returns
+        -------
+        struct: np.array
+            Structured array
+        """
+
+        # Verify that list_in exists
+        if list_in:
+
+            # Create data type for each variable in object
+            keys = list(vars(list_in[0]).keys())
+            data_type = []
+            for key in keys:
+                if new_key_dict is not None and key in new_key_dict:
+                    if new_key_dict[key] is None:
+                        data_type.append((np.nan, list))
+                    else:
+                        data_type.append((new_key_dict[key], list))
+                else:
+                    data_type.append((key, list))
+
+            # Create structured array based on data type and length of list
+            dt = np.dtype(data_type)
+            struct = np.zeros((len(list_in),), dt)
+
+            # Populate the structure with data from the objects
+            for n, item in enumerate(list_in):
+
+                if type(item) is list:
+                    # If item is a list apply recursion
+                    struct = Python2Matlab.listobj2struct(item, new_key_dict)
+                else:
+                    # If item is not a list convert it to a dictionary
+                    new_dict = Python2Matlab.obj2dict(item, new_key_dict)
+                    # Change name for consistency with Matlab is necessary
+                    for key in new_dict:
+                        if new_key_dict is not None and key in new_key_dict:
+                            struct[new_key_dict[key]][n] = new_dict[key]
+                        else:
+                            struct[key][n] = new_dict[key]
+        else:
+            struct = np.array([np.nan])
+
+        return struct
+
+    @staticmethod
+    def change_dict_keys(dict_in, new_key_dict):
+        """Recursively changes the name of dictionary keys and checks for str
+        data types and converts them to arrays.
+
+        Parameters
+        ----------
+        dict_in: dict
+            Dictionary with keys that need a name change
+        new_key_dict: dict
+            Dictionary to cross reference existing key to new key names
+        """
+
+        dict_out = dict()
+
+        for key in dict_in:
+            # Iterate on nested dictionaries
+            if type(dict_in[key]) is dict:
+                dict_in[key] = Python2Matlab.change_dict_keys(
+                    dict_in[key], new_key_dict
+                )
+
+            # If a list contains a str variable, such as messages, convert
+            # the string to an array
+            if type(dict_in[key]) is list:
+                for line in range(len(dict_in[key])):
+                    if type(line) == str:
+                        for col in range(len(dict_in[key][line])):
+                            if type(dict_in[key][line][col]) is str:
+                                dict_in[key][line][col] = np.array(
+                                    [list(dict_in[key][line][col])]
+                                )
+
+            # Change key if needed
+            if new_key_dict is not None and key in new_key_dict:
+                dict_out[new_key_dict[key]] = dict_in[key]
+            else:
+                dict_out[key] = dict_in[key]
+
+        return dict_out
+
+    @staticmethod
+    def obj2dict(obj, new_key_dict=None):
+        """Converts object variables to dictionaries. Works recursively to all
+         levels of objects.
+
+        Parameters
+        ----------
+        obj: object
+            Object of some class
+        new_key_dict: dict
+            Dictionary to translate python variable names to Matlab variable
+            names
+
+        Returns
+        -------
+        obj_dict: dict
+            Dictionary of all object variables
+        """
+        obj_dict = vars(obj)
+        new_dict = dict()
+        for key in obj_dict:
+
+            # If variable is another object convert to dictionary recursively
+            if str(type(obj_dict[key]))[8:13] == "Class":
+                obj_dict[key] = Python2Matlab.obj2dict(obj_dict[key], new_key_dict)
+
+            # If variable is a list of objects convert to dictionary
+            elif (
+                type(obj_dict[key]) is list
+                and len(obj_dict[key]) > 0
+                and str(type(obj_dict[key][0]))[8:13] == "Class"
+            ):
+                obj_dict[key] = Python2Matlab.listobj2struct(
+                    obj_dict[key], new_key_dict
+                )
+
+            elif type(obj_dict[key]) is dict:
+                obj_dict[key] = Python2Matlab.change_dict_keys(
+                    obj_dict[key], new_key_dict
+                )
+
+            elif type(obj_dict[key]) is pd.DataFrame:
+                obj_dict[key] = obj_dict[key].to_numpy()
+
+            # If variable is None rename as necessary and convert None to
+            # empty list
+            if obj_dict[key] is None:
+                if new_key_dict is not None and key in new_key_dict:
+                    new_dict[new_key_dict[key]] = []
+                else:
+                    new_dict[key] = []
+            # If variable is not None rename as necessary
+            elif new_key_dict is not None and key in new_key_dict:
+                new_dict[new_key_dict[key]] = obj_dict[key]
+            else:
+                new_dict[key] = obj_dict[key]
+
+        return new_dict
+
+    @staticmethod
+    def comment2struct(comments):
+        """Convert comments to a structure.
+
+        Parameters
+        ----------
+        comments: list
+            List of comments
+
+        Returns
+        -------
+        struct: np.ndarray
+            Array of comments
+
+        """
+        struct = np.zeros((len(comments),), dtype=np.object)
+        cell = np.zeros((1,), dtype=np.object)
+        for n, line in enumerate(comments):
+            cell[0] = line
+            struct[n] = np.copy(cell)
+        return struct
+
+    @staticmethod
+    def listobj2dict(list_in, new_key_dict=None):
+        """Converts list of objects to list of dictionaries. Works recursively
+        to all levels of objects.
+
+        Parameters
+        ----------
+        list_in: list
+            List of objects of some class
+        new_key_dict: dict
+            Dictionary to translate python variable names to Matlab variable
+            names
+
+        Returns
+        -------
+        new_list: list
+            List of dictionaries
+        """
+        new_list = []
+        for obj in list_in:
+            new_list.append(Python2Matlab.obj2dict(obj, new_key_dict))
+        return new_list
+
+    @staticmethod
+    def create_py_2_mat_dict():
+        """Creates a dictionary to cross reference Python names with Matlab
+        names
+
+        Returns
+        -------
+        py_2_mat_dict: dict
+            Dictionary of python key to Matlab variable
+        """
+
+        py_2_mat_dict = {
+            "Python": "Matlab",
+            "align_correction_deg": "alignCorrection_deg",
+            "altitude_ens_m": "altitudeEns_m",
+            "avg_method": "avgMethod",
+            "beam_angle_deg": "beamAngle_deg",
+            "beam_filter": "beamFilter",
+            "beam_pattern": "beamPattern",
+            "blanking_distance_m": "blankingDistance_m",
+            "boat_vel": "boatVel",
+            "bot_diff": "botdiff",
+            "bot_method": "botMethod",
+            "bot_method_auto": "botMethodAuto",
+            "bot_method_orig": "botMethodOrig",
+            "bot_r2": "botrsqr",
+            "bottom_ens": "bottomEns",
+            "bottom_mode": "bottomMode",
+            "bt_depths": "btDepths",
+            "bt_vel": "btVel",
+            "cell_depth_normalized": "cellDepthNormalized",
+            "cells_above_sl": "cellsAboveSL",
+            "cells_above_sl_bt": "cellsAboveSLbt",
+            "compass_cal": "compassCal",
+            "compass_diff_deg": "compassDiff_deg",
+            "compass_eval": "compassEval",
+            "configuration_commands": "configurationCommands",
+            "coord_sys": "coordSys",
+            "corr_table": "corrTable",
+            "correction_factor": "correctionFactor",
+            "cov_95": "cov95",
+            "cov_95_user": "cov95User",
+            "cust_coef": "custCoef",
+            "d_filter": "dFilter",
+            "d_filter_thresholds": "dFilterThreshold",
+            "data_extent": "dataExtent",
+            "data_orig": "dataOrig",
+            "data_type": "dataType",
+            "date_time": "dateTime",
+            "depth_beams_m": "depthBeams_m",
+            "depth_cell_depth_m": "depthCellDepth_m",
+            "depth_cell_depth_orig_m": "depthCellDepthOrig_m",
+            "depth_cell_size_m": "depthCellSize_m",
+            "depth_cell_size_orig_m": "depthCellSizeOrig_m",
+            "depth_depth_m": "depthCellDepth_m",
+            "depth_source_ens": "depthSourceEns",
+            "depth_freq_kHz": "depthFreq_Hz",
+            "depth_invalid_index": "depthInvalidIndex",
+            "depth_orig_m": "depthOrig_m",
+            "depth_processed_m": "depthProcessed_m",
+            "depth_source": "depthSource",
+            "depths": "depths",
+            "diff_qual_ens": "diffQualEns",
+            "dist_us_m": "distUS_m",
+            "distance_m": "dist_m",
+            "draft_orig_m": "draftOrig_m",
+            "draft_use_m": "draftUse_m",
+            "ds_depths": "dsDepths",
+            "edges_95": "edges95",
+            "edges_95_user": "edges95User",
+            "end_serial_time": "endSerialTime",
+            "ens_duration_sec": "ensDuration_sec",
+            "excluded_dist_m": "excludedDist",
+            "exp_method": "expMethod",
+            "exponent_95_ci": "exponent95confint",
+            "exponent_auto": "exponentAuto",
+            "exponent_orig": "exponentOrig",
+            "ext_gga_altitude_m": "extGGAAltitude_m",
+            "ext_gga_differential": "extGGADifferential",
+            "ext_gga_hdop": "extGGAHDOP",
+            "ext_gga_lat_deg": "extGGALat_deg",
+            "ext_gga_lon_deg": "extGGALon_deg",
+            "ext_gga_num_sats": "extGGANumSats",
+            "ext_gga_serial_time": "extGGASerialTime",
+            "ext_gga_utc": "extGGAUTC",
+            "ext_temp_chk": "extTempChk",
+            "ext_vtg_course_deg": "extVTGCourse_deg",
+            "ext_vtg_speed_mps": "extVTGSpeed_mps",
+            "extrap_fit": "extrapFit",
+            "extrapolation_95": "extrapolation95",
+            "extrapolation_95_user": "extrapolation95User",
+            "file_name": "fileName",
+            "filter_type": "filterType",
+            "fit_method": "fitMethod",
+            "fit_r2": "fitrsqr",
+            "flow_dir_deg": "flowDir_deg",
+            "flow_dir": "flowDir_deg",
+            "flow_spd_mps": "flowSpd_mps",
+            "frequency_khz": "frequency_hz",
+            "gga_lat_ens_deg": "ggaLatEns_deg",
+            "gga_lon_ens_deg": "ggaLonEns_deg",
+            "gga_position_method": "ggaPositionMethod",
+            "gga_serial_time_ens": "ggaSerialTimeEns",
+            "gga_vel": "ggaVel",
+            "gga_velocity_ens_mps": "ggaVelocityEns_mps",
+            "gga_velocity_method": "ggaVelocityMethod",
+            "gps_HDOP_filter": "gpsHDOPFilter",
+            "gps_HDOP_filter_change": "gpsHDOPFilterChange",
+            "gps_HDOP_filter_max": "gpsHDOPFilterMax",
+            "gps_altitude_filter": "gpsAltitudeFilter",
+            "gps_altitude_filter_change": "gpsAltitudeFilterChange",
+            "gps_diff_qual_filter": "gpsDiffQualFilter",
+            "hard_limit": "hardLimit",
+            "hdop_ens": "hdopEns",
+            "high_narrow": "hn",
+            "high_wide": "hw",
+            "in_transect_idx": "inTransectIdx",
+            "initial_settings": "initialSettings",
+            "int_cells": "intCells",
+            "int_ens": "intEns",
+            "interp_type": "interpType",
+            "interpolate_cells": "interpolateCells",
+            "interpolate_ens": "interpolateEns",
+            "invalid_95": "invalid95",
+            "invalid_index": "invalidIndex",
+            "invalid_95_user": "invalid95User",
+            "left_idx": "leftidx",
+            "low_narrow": "ln",
+            "low_wide": "lw",
+            "mag_error": "magError",
+            "mag_var_orig_deg": "magVarOrig_deg",
+            "mag_var_deg": "magVar_deg",
+            "man_bot": "manBot",
+            "man_exp": "manExp",
+            "man_top": "manTop",
+            "mb_dir": "mbDir_deg",
+            "mb_spd_mps": "mbSpd_mps",
+            "mb_tests": "mbTests",
+            "meas": "meas_struct",
+            "middle_cells": "middleCells",
+            "middle_ens": "middleEns",
+            "moving_bed": "movingBed",
+            "moving_bed_95": "movingBed95",
+            "moving_bed_95_user": "movingBed95User",
+            "n_failed": "nFailed",
+            "n_tests": "nTests",
+            "nav_ref": "navRef",
+            "near_bed_speed_mps": "nearBedSpeed_mps",
+            "noise_floor": "noiseFloor",
+            "norm_data": "normData",
+            "ns_exp": "nsExponent",
+            "ns_exponent": "nsexponent",
+            "num_invalid": "numInvalid",
+            "num_sats_ens": "numSatsEns",
+            "number_ensembles": "numEns2Avg",
+            "orig_coord_sys": "origCoordSys",
+            "orig_ref": "origNavRef",
+            "orig_nav_ref": "origNavRef",
+            "orig_sys": "origCoordSys",
+            "original_data": "originalData",
+            "per_good_ens": "perGoodEns",
+            "percent_invalid_bt": "percentInvalidBT",
+            "percent_mb": "percentMB",
+            "pitch_limit": "pitchLimit",
+            "pp_exp": "ppExponent",
+            "pp_exponent": "ppexponent",
+            "processed_source": "processedSource",
+            "q_cns_mean": "qCNSmean",
+            "q_cns_opt_mean": "qCNSoptmean",
+            "q_cns_opt_per_diff": "qCNSoptperdiff",
+            "q_cns_per_diff": "qCNSperdiff",
+            "q_man_mean": "qManmean",
+            "q_man_per_diff": "qManperdiff",
+            "q_3p_ns_mean": "q3pNSmean",
+            "q_3p_ns_opt_mean": "q3pNSoptmean",
+            "q_3p_ns_opt_per_diff": "q3pNSoptperdiff",
+            "q_3p_ns_per_diff": "q3pNSperdiff",
+            "q_pp_mean": "qPPmean",
+            "q_pp_opt_mean": "qPPoptmean",
+            "q_pp_opt_per_diff": "qPPoptperdiff",
+            "q_pp_per_diff": "qPPperdiff",
+            "q_run_threshold_caution": "qRunThresholdCaution",
+            "q_run_threshold_warning": "qRunThresholdWarning",
+            "q_sensitivity": "qSensitivity",
+            "q_total_threshold_caution": "qTotalThresholdWarning",
+            "q_total_threshold_warning": "qTotalThresholdCaution",
+            "raw_gga_altitude_m": "rawGGAAltitude_m",
+            "raw_gga_delta_time": "rawGGADeltaTime",
+            "raw_gga_differential": "rawGGADifferential",
+            "raw_gga_hdop": "rawGGAHDOP",
+            "raw_gga_lat_deg": "rawGGALat_deg",
+            "raw_gga_lon_deg": "rawGGALon_deg",
+            "raw_gga_serial_time": "rawGGASerialTime",
+            "raw_gga_utc": "rawGGAUTC",
+            "raw_gga_num_sats": "rawGGANumSats",
+            "raw_vel_mps": "rawVel_mps",
+            "raw_vtg_course_deg": "rawVTGCourse_deg",
+            "raw_vtg_delta_time": "rawVTGDeltaTime",
+            "raw_vtg_mode_indicator": "rawVTGModeIndicator",
+            "raw_vtg_speed_mps": "rawVTGSpeed_mps",
+            "rec_edge_method": "recEdgeMethod",
+            "right_idx": "rightidx",
+            "roll_limit": "rollLimit",
+            "rssi_units": "rssiUnits",
+            "sel_fit": "selFit",
+            "serial_num": "serialNum",
+            "sl_lag_effect_m": "slLagEffect_m",
+            "sl_cutoff_number": "slCutoffNum",
+            "sl_cutoff_percent": "slCutoffPer",
+            "sl_cutoff_type": "slCutoffType",
+            "sl_cutoff_m": "slCutoff_m",
+            "smooth_depth": "smoothDepth",
+            "smooth_filter": "smoothFilter",
+            "smooth_lower_limit": "smoothLowerLimit",
+            "smooth_speed": "smoothSpeed",
+            "smooth_upper_limit": "smoothUpperLimit",
+            "snr_filter": "snrFilter",
+            "speed_of_sound_mps": "speedOfSound_mps",
+            "snr_rng": "snrRng",
+            "start_edge": "startEdge",
+            "start_serial_time": "startSerialTime",
+            "station_name": "stationName",
+            "station_number": "stationNumber",
+            "stationary_cs_track": "stationaryCSTrack",
+            "stationary_mb_vel": "stationaryMBVel",
+            "stationary_us_track": "stationaryUSTrack",
+            "system_test": "sysTest",
+            "system_tst": "systemTest",
+            "systematic_user": "systematicUser",
+            "t_matrix": "tMatrix",
+            "temperature": "temperature",
+            "temperature_deg_c": "temperature_degC",
+            "test_quality": "testQuality",
+            "time_stamp": "timeStamp",
+            "top_ens": "topEns",
+            "top_fit_r2": "topfitr2",
+            "top_max_diff": "topmaxdiff",
+            "top_method": "topMethod",
+            "top_method_auto": "topMethodAuto",
+            "top_method_orig": "topMethodOrig",
+            "top_r2": "topr2",
+            "total_95": "total95",
+            "total_uncorrected": "totalUncorrected",
+            "total_95_user": "total95User",
+            "transect_duration_sec": "transectDuration_sec",
+            "u_auto": "uAuto",
+            "u_processed_mps": "uProcessed_mps",
+            "u_earth_no_ref_mps": "uEarthNoRef_mps",
+            "unit_normalized_z": "unitNormalizedz",
+            "unit_normalized": "unitNormalized",
+            "unit_normalized_25": "unitNormalized25",
+            "unit_normalized_75": "unitNormalized75",
+            "unit_normalized_med": "unitNormalizedMed",
+            "unit_normalized_no": "unitNormalizedNo",
+            "use_2_correct": "use2Correct",
+            "user_discharge_cms": "userQ_cms",
+            "user_rating": "userRating",
+            "user_valid": "userValid",
+            "utm_ens_m": "UTMEns_m",
+            "v_processed_mps": "vProcessed_mps",
+            "v_earth_no_ref_mps": "vEarthNoRef_mps",
+            "valid_beams": "validBeams",
+            "valid_data": "validData",
+            "valid_data_method": "validDataMethod",
+            "vb_depths": "vbDepths",
+            "vel_method": "velMethod",
+            "vtg_vel": "vtgVel",
+            "vtg_velocity_ens_mps": "vtgVelocityEns_mps",
+            "vtg_velocity_method": "vtgVelocityMethod",
+            "w_filter": "wFilter",
+            "w_filter_thresholds": "wFilterThreshold",
+            "w_vel": "wVel",
+            "water_mode": "waterMode",
+            "wt_depth_filter": "wtDepthFilter",
+            "z_auto": "zAuto",
+            "all_invalid": "allInvalid",
+            "q_max_run": "qMaxRun",
+            "q_max_run_caution": "qRunCaution",
+            "q_max_run_warning": "qRunWarning",
+            "q_total": "qTotal",
+            "q_total_caution": "qTotalCaution",
+            "q_total_warning": "qTotalWarning",
+            "sta_name": "staName",
+            "sta_number": "staNumber",
+            "left_q": "leftQ",
+            "left_q_idx": "leftQIdx",
+            "right_q": "rightQ",
+            "right_q_idx": "rightQIdx",
+            "left_sign": "leftSign",
+            "right_sign": "rightSign",
+            "right_dist_moved_idx": "rightDistMovedIdx",
+            "left_dist_moved_idx": "leftDistMovedIdx",
+            "left_zero": "leftzero",
+            "left_zero_idx": "leftZeroIdx",
+            "right_zero": "rightzero",
+            "right_zero_idx": "rightZeroIdx",
+            "left_type": "leftType",
+            "right_type": "rightType",
+            "pitch_mean_warning_idx": "pitchMeanWarningIdx",
+            "pitch_mean_caution_idx": "pitchMeanCautionIdx",
+            "pitch_std_caution_idx": "pitchStdCautionIdx",
+            "roll_mean_warning_idx": "rollMeanWarningIdx",
+            "roll_mean_caution_idx": "rollMeanCautionIdx",
+            "roll_std_caution_idx": "rollStdCautionIdx",
+            "magvar_idx": "magvarIdx",
+            "mag_error_idx": "magErrorIdx",
+            "invalid_transect_left_idx": "invalidTransLeftIdx",
+            "invalid_transect_right_idx": "invalidTransRightIdx",
+        }
+        return py_2_mat_dict
+
+    @staticmethod
+    def save_matlab_file(meas, file_name, version, checked=None):
+        """Saves the measurement class and all data into a Matlab file using
+        the variable names and structure
+        from the QRev Matlab version.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        file_name: str
+            File name of saved Matlab file
+        version: str
+            QRev version
+        checked: list
+            Identifies which transects should be saved.
+        """
+
+        if checked is None:
+            checked = list(range(len(meas.transects)))
+
+        # Convert Python objects to Matlab structure
+        mat_struct = {
+            "meas_struct": Python2Matlab(meas, checked).matlab_dict,
+            "version": version,
+        }
+        sio.savemat(
+            file_name=file_name,
+            mdict=mat_struct,
+            appendmat=True,
+            format="5",
+            long_field_names=True,
+            do_compression=True,
+            oned_as="row",
+        )
+
+    @staticmethod
+    def data2matlab(meas):
+        """Apply changes to the Python data to replicate QRev for Matlab
+        conventions.
+
+        Parameters
+        ----------
+        meas: Measurement
+            object of class Measurement
+
+        Returns
+        -------
+        meas_mat: Measurement
+            Deepcopy of meas with changes to replicate QRev for Matlab
+            conventions
+        """
+
+        # Make copy to prevent changing Python meas data
+        meas_mat = copy.deepcopy(meas)
+
+        # Process changes for each transect
+        for transect in meas_mat.transects:
+            transect = Python2Matlab.reconfigure_transect(transect)
+
+        # Process changes for each moving-bed test transect
+        if len(meas.mb_tests) > 0:
+            for test in meas_mat.mb_tests:
+                test.transect = Python2Matlab.reconfigure_transect(test.transect)
+
+        # Adjust 1-D array to be row based
+        for fit in meas_mat.extrap_fit.sel_fit:
+            if fit.u is None:
+                fit.u = np.nan
+                fit.z = np.nan
+            else:
+                fit.u = fit.u.reshape(-1, 1)
+                fit.u_auto = fit.u_auto.reshape(-1, 1)
+                fit.z = fit.z.reshape(-1, 1)
+                fit.z_auto = fit.z_auto.reshape(-1, 1)
+
+        # Adjust norm_data indices from 0 base to 1 base
+        for dat in meas_mat.extrap_fit.norm_data:
+            dat.valid_data = dat.valid_data + 1
+
+        # If system tests, compass calibrations, or compass evaluations don't
+        # exist create empty objects
+        if len(meas_mat.system_tst) == 0:
+            meas_mat.system_tst = [PreMeasurement()]
+        if len(meas_mat.compass_eval) == 0:
+            meas_mat.compass_eval = [PreMeasurement()]
+        if len(meas_mat.compass_cal) == 0:
+            meas_mat.compass_cal = [PreMeasurement()]
+
+        # If only one moving-bed test change from list to MovingBedTest object
+        if len(meas_mat.mb_tests) == 1:
+            meas_mat.mb_tests = meas_mat.mb_tests[0]
+            # Convert message to cell array for Matlab
+            if len(meas_mat.mb_tests.messages) > 0:
+                meas_mat.mb_tests.messages = np.array(
+                    meas_mat.mb_tests.messages
+                ).astype(np.object)
+
+        # Fix user and adcp temperature for QRev Matlab
+        if np.isnan(meas_mat.ext_temp_chk["user"]):
+            meas_mat.ext_temp_chk["user"] = ""
+        if np.isnan(meas_mat.ext_temp_chk["adcp"]):
+            meas_mat.ext_temp_chk["adcp"] = ""
+
+        return meas_mat
+
+    @staticmethod
+    def reconfigure_transect(transect):
+        """Changes variable names, rearranges arrays, and adjusts time for
+        consistency with original QRev Matlab output.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+
+        Returns
+        -------
+        transect: TransectData
+            Revised object of TransectData
+        """
+
+        # Change selected boat velocity identification
+        if transect.boat_vel.selected == "bt_vel":
+            transect.boat_vel.selected = "btVel"
+        elif transect.boat_vel.selected == "gga_vel":
+            transect.boat_vel.selected = "ggaVel"
+        elif transect.boat_vel.selected == "vtg_vel":
+            transect.boat_vel.selected = "vtgVel"
+
+        # Change selected depth identification
+        if transect.depths.selected == "bt_depths":
+            transect.depths.selected = "btDepths"
+        elif transect.depths.selected == "vb_depths":
+            transect.depths.selected = "vbDepths"
+        elif transect.depths.selected == "ds_depths":
+            transect.depths.selected = "dsDepths"
+
+        # Adjust in transect number for 1 base rather than 0 base
+        transect.in_transect_idx = transect.in_transect_idx + 1
+
+        # Adjust arrangement of 3-D arrays for consistency with Matlab
+        transect.w_vel.raw_vel_mps = np.moveaxis(transect.w_vel.raw_vel_mps, 0, 2)
+        transect.w_vel.corr = np.moveaxis(transect.w_vel.corr, 0, 2)
+        transect.w_vel.rssi = np.moveaxis(transect.w_vel.rssi, 0, 2)
+        transect.w_vel.valid_data = np.moveaxis(transect.w_vel.valid_data, 0, 2)
+        if len(transect.adcp.t_matrix.matrix.shape) == 3:
+            transect.adcp.t_matrix.matrix = np.moveaxis(
+                transect.adcp.t_matrix.matrix, 2, 0
+            )
+
+        # Adjust 2-D array to be row based
+        if transect.adcp.configuration_commands is not None:
+            transect.adcp.configuration_commands = (
+                transect.adcp.configuration_commands.reshape(-1, 1)
+            )
+
+        # Adjust serial time to Matlab convention
+        seconds_day = 86400
+        time_correction = 719529.0000000003
+        transect.date_time.start_serial_time = (
+            transect.date_time.start_serial_time / seconds_day
+        ) + time_correction
+        transect.date_time.end_serial_time = (
+            transect.date_time.end_serial_time / seconds_day
+        ) + time_correction
+
+        return transect
diff --git a/Classes/QAData.py b/Classes/QAData.py
new file mode 100644
index 0000000000000000000000000000000000000000..6a6cd738e39ea734e1ebe7c7a72bc135f7e0f4e8
--- /dev/null
+++ b/Classes/QAData.py
@@ -0,0 +1,4049 @@
+import copy
+import numpy as np
+from Classes.Uncertainty import Uncertainty
+from Classes.QComp import QComp
+from Classes.MovingBedTests import MovingBedTests
+from Classes.TransectData import TransectData
+
+
+class QAData(object):
+    """Evaluates and stores quality assurance characteristics and messages.
+
+    Attributes
+    ----------
+    q_run_threshold_caution: int
+        Caution threshold for interpolated discharge for a run of invalid
+        ensembles, in percent.
+    q_run_threshold_warning: int
+        Warning threshold for interpolated discharge for a run of invalid
+        ensembles, in percent.
+    q_total_threshold_caution: int
+        Caution threshold for total interpolated discharge for invalid
+        ensembles, in percent.
+    q_total_threshold_warning: int
+        Warning threshold for total interpolated discharge for invalid
+        ensembles, in percent.
+    transects: dict
+        Dictionary of quality assurance checks for transects
+    system_tst: dict
+        Dictionary of quality assurance checks on the system test(s)
+    compass: dict
+        Dictionary of quality assurance checks on compass calibration and
+        evaluations
+    temperature: dict
+        Dictionary of quality assurance checks on temperature comparions and
+        variation
+    movingbed: dict
+        Dictionary of quality assurance checks on moving-bed tests
+    user: dict
+        Dictionary of quality assurance checks on user input data
+    boat: dict
+        Dictionary of quality assurance checks on boat velocities
+    bt_vel: dict
+        Dictionary of quality assurance checks on bottom track velocities
+    gga_vel: dict
+        Dictionary of quality assurance checks on gga boat velocities
+    vtg_vel: dict
+        Dictionary of quality assurance checks on vtg boat velocities
+    w_vel: dict
+        Dictionary of quality assurance checks on water track velocities
+    extrapolation: dict
+        Dictionary of quality assurance checks on extrapolations
+    edges: dict
+        Dictionary of quality assurance checks on edges
+    """
+
+    def __init__(self, meas, mat_struct=None, compute=True):
+        """Checks the measurement for all quality assurance issues.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # Set default thresholds
+        self.q_run_threshold_caution = 3
+        self.q_run_threshold_warning = 5
+        self.q_total_threshold_caution = 10
+        self.q_total_threshold_warning = 25
+
+        # Initialize instance variables
+        self.transects = dict()
+        self.system_tst = dict()
+        self.compass = dict()
+        self.temperature = dict()
+        self.movingbed = dict()
+        self.user = dict()
+        self.depths = dict()
+        self.boat = dict()
+        self.bt_vel = dict()
+        self.gga_vel = dict()
+        self.vtg_vel = dict()
+        self.w_vel = dict()
+        self.extrapolation = dict()
+        self.edges = dict()
+        self.settings_dict = dict()
+        self.settings_dict["tab_compass"] = "Default"
+        self.settings_dict["tab_tempsal"] = "Default"
+        self.settings_dict["tab_mbt"] = "Default"
+        self.settings_dict["tab_bt"] = "Default"
+        self.settings_dict["tab_gps"] = "Default"
+        self.settings_dict["tab_depth"] = "Default"
+        self.settings_dict["tab_wt"] = "Default"
+        self.settings_dict["tab_extrap"] = "Default"
+        self.settings_dict["tab_edges"] = "Default"
+
+        if compute:
+            # Apply QA checks
+            self.transects_qa(meas)
+            self.system_tst_qa(meas)
+            self.compass_qa(meas)
+            self.temperature_qa(meas)
+            self.moving_bed_qa(meas)
+            self.user_qa(meas)
+            self.depths_qa(meas)
+            self.boat_qa(meas)
+            self.water_qa(meas)
+            self.extrapolation_qa(meas)
+            self.edges_qa(meas)
+            self.check_bt_setting(meas)
+            self.check_wt_settings(meas)
+            self.check_depth_settings(meas)
+            self.check_gps_settings(meas)
+            self.check_edge_settings(meas)
+            self.check_extrap_settings(meas)
+            self.check_tempsal_settings(meas)
+            self.check_mbt_settings(meas)
+            self.check_compass_settings(meas)
+            if meas.oursin is not None:
+                self.check_oursin(meas)
+        else:
+            self.populate_from_qrev_mat(meas, mat_struct)
+
+    def populate_from_qrev_mat(self, meas, meas_struct):
+        """Populates the object using data from previously saved QRev Matlab
+        file.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of Measurement
+        meas_struct: mat_struct
+           Matlab data structure obtained from sio.loadmat
+        """
+
+        # Generate a new QA object using the measurement data and the
+        # current QA code. When QA checks from the current QA are not
+        # available from old QRev files, these
+        # checks will be included to supplement the old QRev file data.
+        new_qa = QAData(meas)
+        if hasattr(meas_struct, "qa"):
+            # Set default thresholds
+            self.q_run_threshold_caution = meas_struct.qa.qRunThresholdCaution
+            self.q_run_threshold_warning = meas_struct.qa.qRunThresholdWarning
+            if hasattr(meas_struct.qa, "qTotalThresholdCaution"):
+                self.q_total_threshold_caution = meas_struct.qa.qTotalThresholdCaution
+            else:
+                self.q_total_threshold_caution = 10
+            self.q_total_threshold_warning = meas_struct.qa.qTotalThresholdWarning
+
+            # Initialize instance variables
+            self.transects = dict()
+            self.transects["duration"] = meas_struct.qa.transects.duration
+            self.transects["messages"] = self.make_list(
+                meas_struct.qa.transects.messages
+            )
+            self.transects["number"] = meas_struct.qa.transects.number
+            self.transects["recip"] = meas_struct.qa.transects.recip
+            self.transects["sign"] = meas_struct.qa.transects.sign
+            self.transects["status"] = meas_struct.qa.transects.status
+            self.transects["uncertainty"] = meas_struct.qa.transects.uncertainty
+            self.system_tst = dict()
+            self.system_tst["messages"] = self.make_list(
+                meas_struct.qa.systemTest.messages
+            )
+            self.system_tst["status"] = meas_struct.qa.systemTest.status
+            self.compass = dict()
+            self.compass["messages"] = self.make_list(meas_struct.qa.compass.messages)
+            self.compass["status"] = meas_struct.qa.compass.status
+            if hasattr(meas_struct.qa.compass, "status1"):
+                self.compass["status1"] = meas_struct.qa.compass.status1
+                self.compass["status2"] = meas_struct.qa.compass.status2
+            else:
+                self.compass["status1"] = "good"
+                self.compass["status2"] = "good"
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.compass, "magvar"):
+                self.compass["magvar"] = meas_struct.qa.compass.magvar
+            else:
+                self.compass["magvar"] = new_qa.compass["magvar"]
+                self.compass["status"] = new_qa.compass["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.compass, "magvarIdx"):
+                self.compass["magvar_idx"] = self.make_array(
+                    meas_struct.qa.compass.magvarIdx
+                )
+            else:
+                self.compass["magvar_idx"] = new_qa.compass["magvar_idx"]
+                self.compass["status"] = new_qa.compass["status"]
+
+            # Changed mag_error_idx from bool to int array in QRevPy
+            self.compass["mag_error_idx"] = new_qa.compass["mag_error_idx"]
+            self.compass["status"] = new_qa.compass["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.compass, "pitchMeanWarningIdx"):
+                self.compass["pitch_mean_warning_idx"] = self.make_array(
+                    meas_struct.qa.compass.pitchMeanWarningIdx
+                )
+            else:
+                self.compass["pitch_mean_warning_idx"] = new_qa.compass[
+                    "pitch_mean_warning_idx"
+                ]
+                self.compass["status"] = new_qa.compass["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.compass, "rollMeanWarningIdx"):
+                self.compass["roll_mean_warning_idx"] = self.make_array(
+                    meas_struct.qa.compass.rollMeanWarningIdx
+                )
+            else:
+                self.compass["roll_mean_warning_idx"] = new_qa.compass[
+                    "roll_mean_warning_idx"
+                ]
+                self.compass["status"] = new_qa.compass["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.compass, "pitchMeanCautionIdx"):
+                self.compass["pitch_mean_caution_idx"] = self.make_array(
+                    meas_struct.qa.compass.pitchMeanCautionIdx
+                )
+            else:
+                self.compass["pitch_mean_caution_idx"] = new_qa.compass[
+                    "pitch_mean_caution_idx"
+                ]
+                self.compass["status"] = new_qa.compass["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.compass, "rollMeanCautionIdx"):
+                self.compass["roll_mean_caution_idx"] = self.make_array(
+                    meas_struct.qa.compass.rollMeanCautionIdx
+                )
+            else:
+                self.compass["roll_mean_caution_idx"] = new_qa.compass[
+                    "roll_mean_caution_idx"
+                ]
+                self.compass["status"] = new_qa.compass["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.compass, "pitchStdCautionIdx"):
+                self.compass["pitch_std_caution_idx"] = self.make_array(
+                    meas_struct.qa.compass.pitchStdCautionIdx
+                )
+            else:
+                self.compass["pitch_std_caution_idx"] = new_qa.compass[
+                    "pitch_std_caution_idx"
+                ]
+                self.compass["status"] = new_qa.compass["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.compass, "rollStdCautionIdx"):
+                self.compass["roll_std_caution_idx"] = self.make_array(
+                    meas_struct.qa.compass.rollStdCautionIdx
+                )
+            else:
+                self.compass["roll_std_caution_idx"] = new_qa.compass[
+                    "roll_std_caution_idx"
+                ]
+                self.compass["status"] = new_qa.compass["status"]
+
+            self.temperature = dict()
+            self.temperature["messages"] = self.make_list(
+                meas_struct.qa.temperature.messages
+            )
+            self.temperature["status"] = meas_struct.qa.temperature.status
+            self.movingbed = dict()
+            self.movingbed["messages"] = self.make_list(
+                meas_struct.qa.movingbed.messages
+            )
+            self.movingbed["status"] = meas_struct.qa.movingbed.status
+            self.movingbed["code"] = meas_struct.qa.movingbed.code
+            self.user = dict()
+            self.user["messages"] = self.make_list(meas_struct.qa.user.messages)
+            self.user["sta_name"] = bool(meas_struct.qa.user.staName)
+            self.user["sta_number"] = bool(meas_struct.qa.user.staNumber)
+            self.user["status"] = meas_struct.qa.user.status
+
+            # If QA check not available, get check from new QA
+            self.depths = self.create_qa_dict(self, meas_struct.qa.depths)
+            if "draft" not in self.depths:
+                self.depths["draft"] = new_qa.depths["draft"]
+                self.depths["status"] = new_qa.depths["status"]
+
+            if "all_invalid" not in self.depths:
+                self.depths["all_invalid"] = new_qa.depths["all_invalid"]
+                self.depths["status"] = new_qa.depths["status"]
+
+            # If QA check not available, get check from new QA
+            self.bt_vel = self.create_qa_dict(self, meas_struct.qa.btVel, ndim=2)
+            if "all_invalid" not in self.bt_vel:
+                self.bt_vel["all_invalid"] = new_qa.bt_vel["all_invalid"]
+                self.bt_vel["status"] = new_qa.bt_vel["status"]
+
+            # If QA check not available, get check from new QA
+            self.gga_vel = self.create_qa_dict(self, meas_struct.qa.ggaVel, ndim=2)
+            if "all_invalid" not in self.gga_vel:
+                self.gga_vel["all_invalid"] = new_qa.gga_vel["all_invalid"]
+            if "lag_status" not in self.gga_vel:
+                self.gga_vel["lag_status"] = new_qa.gga_vel["lag_status"]
+                self.gga_vel["status"] = new_qa.gga_vel["status"]
+
+            # If QA check not available, get check from new QA
+            self.vtg_vel = self.create_qa_dict(self, meas_struct.qa.vtgVel, ndim=2)
+            if "all_invalid" not in self.vtg_vel:
+                self.vtg_vel["all_invalid"] = new_qa.vtg_vel["all_invalid"]
+            if "lag_status" not in self.vtg_vel:
+                self.vtg_vel["lag_status"] = new_qa.vtg_vel["lag_status"]
+                self.vtg_vel["status"] = new_qa.vtg_vel["status"]
+
+            # If QA check not available, get check from new QA
+            self.w_vel = self.create_qa_dict(self, meas_struct.qa.wVel, ndim=2)
+            if "all_invalid" not in self.w_vel:
+                self.w_vel["all_invalid"] = new_qa.w_vel["all_invalid"]
+                self.w_vel["status"] = new_qa.w_vel["status"]
+
+            self.extrapolation = dict()
+            self.extrapolation["messages"] = self.make_list(
+                meas_struct.qa.extrapolation.messages
+            )
+            self.extrapolation["status"] = meas_struct.qa.extrapolation.status
+            self.edges = dict()
+            self.edges["messages"] = self.make_list(meas_struct.qa.edges.messages)
+            self.edges["status"] = meas_struct.qa.edges.status
+            self.edges["left_q"] = meas_struct.qa.edges.leftQ
+            self.edges["right_q"] = meas_struct.qa.edges.rightQ
+            self.edges["left_sign"] = meas_struct.qa.edges.leftSign
+            self.edges["right_sign"] = meas_struct.qa.edges.rightSign
+            self.edges["left_zero"] = meas_struct.qa.edges.leftzero
+            self.edges["right_zero"] = meas_struct.qa.edges.rightzero
+            self.edges["left_type"] = meas_struct.qa.edges.leftType
+            self.edges["right_type"] = meas_struct.qa.edges.rightType
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.edges, "rightDistMovedIdx"):
+                self.edges["right_dist_moved_idx"] = self.make_array(
+                    meas_struct.qa.edges.rightDistMovedIdx
+                )
+            else:
+                self.edges["right_dist_moved_idx"] = new_qa.edges[
+                    "right_dist_moved_idx"
+                ]
+                self.edges["status"] = new_qa.edges["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.edges, "leftDistMovedIdx"):
+                self.edges["left_dist_moved_idx"] = self.make_array(
+                    meas_struct.qa.edges.leftDistMovedIdx
+                )
+            else:
+                self.edges["left_dist_moved_idx"] = new_qa.edges["left_dist_moved_idx"]
+                self.edges["status"] = new_qa.edges["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.edges, "leftQIdx"):
+                self.edges["left_q_idx"] = self.make_array(
+                    meas_struct.qa.edges.leftQIdx
+                )
+            else:
+                self.edges["left_q_idx"] = new_qa.edges["left_q_idx"]
+                self.edges["status"] = new_qa.edges["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.edges, "rightQIdx"):
+                self.edges["right_q_idx"] = self.make_array(
+                    meas_struct.qa.edges.rightQIdx
+                )
+            else:
+                self.edges["right_q_idx"] = new_qa.edges["right_q_idx"]
+                self.edges["status"] = new_qa.edges["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.edges, "leftZeroIdx"):
+                self.edges["left_zero_idx"] = self.make_array(
+                    meas_struct.qa.edges.leftZeroIdx
+                )
+            else:
+                self.edges["left_zero_idx"] = new_qa.edges["left_zero_idx"]
+                self.edges["status"] = new_qa.edges["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.edges, "rightZeroIdx"):
+                self.edges["right_zero_idx"] = self.make_array(
+                    meas_struct.qa.edges.rightZeroIdx
+                )
+            else:
+                self.edges["right_zero_idx"] = new_qa.edges["right_zero_idx"]
+                self.edges["status"] = new_qa.edges["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.edges, "invalid_transect_left_idx"):
+                self.edges["invalid_transect_left_idx"] = self.make_array(
+                    meas_struct.qa.edges.invalid_transect_left_idx
+                )
+            elif hasattr(meas_struct.qa.edges, "invalidTransLeftIdx"):
+                self.edges["invalid_transect_left_idx"] = self.make_array(
+                    meas_struct.qa.edges.invalidTransLeftIdx
+                )
+            else:
+                self.edges["invalid_transect_left_idx"] = new_qa.edges[
+                    "invalid_transect_left_idx"
+                ]
+                self.edges["status"] = new_qa.edges["status"]
+
+            # If QA check not available, get check from new QA
+            if hasattr(meas_struct.qa.edges, "invalid_transect_right_idx"):
+                self.edges["invalid_transect_right_idx"] = self.make_array(
+                    meas_struct.qa.edges.invalid_transect_right_idx
+                )
+            elif hasattr(meas_struct.qa, "invalidTransRightIdx"):
+                self.edges["invalid_transect_right_idx"] = self.make_array(
+                    meas_struct.qa.edges.invalidTransRightIdx
+                )
+            else:
+                self.edges["invalid_transect_right_idx"] = new_qa.edges[
+                    "invalid_transect_right_idx"
+                ]
+                self.edges["status"] = new_qa.edges["status"]
+
+            if hasattr(meas_struct.qa, "settings_dict"):
+                self.settings_dict = dict()
+                try:
+                    self.settings_dict[
+                        "tab_compass"
+                    ] = meas_struct.qa.settings_dict.tab_compass
+                except AttributeError:
+                    self.settings_dict["tab_compass"] = new_qa.settings_dict[
+                        "tab_compass"
+                    ]
+
+                try:
+                    self.settings_dict[
+                        "tab_tempsal"
+                    ] = meas_struct.qa.settings_dict.tab_tempsal
+                except AttributeError:
+                    self.settings_dict["tab_tempsal"] = new_qa.settings_dict[
+                        "tab_tempsal"
+                    ]
+
+                try:
+                    self.settings_dict["tab_mbt"] = meas_struct.qa.settings_dict.tab_mbt
+                except AttributeError:
+                    self.settings_dict["tab_mbt"] = new_qa.settings_dict["tab_mbt"]
+
+                try:
+                    self.settings_dict["tab_bt"] = meas_struct.qa.settings_dict.tab_bt
+                except AttributeError:
+                    self.settings_dict["tab_bt"] = new_qa.settings_dict["tab_bt"]
+
+                try:
+                    self.settings_dict["tab_gps"] = meas_struct.qa.settings_dict.tab_gps
+                except AttributeError:
+                    self.settings_dict["tab_gps"] = new_qa.settings_dict["tab_gps"]
+
+                try:
+                    self.settings_dict[
+                        "tab_depth"
+                    ] = meas_struct.qa.settings_dict.tab_depth
+                except AttributeError:
+                    self.settings_dict["tab_depth"] = new_qa.settings_dict["tab_depth"]
+
+                try:
+                    self.settings_dict["tab_wt"] = meas_struct.qa.settings_dict.tab_wt
+                except AttributeError:
+                    self.settings_dict["tab_wt"] = new_qa.settings_dict["tab_wt"]
+
+                try:
+                    self.settings_dict[
+                        "tab_extrap"
+                    ] = meas_struct.qa.settings_dict.tab_extrap
+                except AttributeError:
+                    self.settings_dict["tab_extrap"] = new_qa.settings_dict[
+                        "tab_extrap"
+                    ]
+
+                try:
+                    self.settings_dict[
+                        "tab_edges"
+                    ] = meas_struct.qa.settings_dict.tab_edges
+                except AttributeError:
+                    self.settings_dict["tab_edges"] = new_qa.settings_dict["tab_edges"]
+
+    @staticmethod
+    def create_qa_dict(self, mat_data, ndim=1):
+        """Creates the dictionary used to store QA checks associated with
+        the percent of discharge estimated by interpolation. This dictionary
+        is used by BT, GPS, Depth, and WT.
+
+        Parameters
+        ----------
+        self: QAData
+            Object of QAData
+        mat_data: mat_struct
+            Matlab data from QRev file
+        ndim: int
+            Number of dimensions in data
+        """
+
+        # Initialize dictionary
+        qa_dict = dict()
+
+        # Populate dictionary from Matlab data
+        qa_dict["messages"] = QAData.make_list(mat_data.messages)
+
+        # allInvalid not available in older QRev data
+        if hasattr(mat_data, "allInvalid"):
+            qa_dict["all_invalid"] = self.make_array(mat_data.allInvalid, 1).astype(
+                bool
+            )
+
+        qa_dict["q_max_run_caution"] = self.make_array(
+            mat_data.qRunCaution, ndim
+        ).astype(bool)
+        qa_dict["q_max_run_warning"] = self.make_array(
+            mat_data.qRunWarning, ndim
+        ).astype(bool)
+        if hasattr(mat_data, "qTotalCaution"):
+            qa_dict["q_total_caution"] = self.make_array(
+                mat_data.qTotalCaution, ndim
+            ).astype(bool)
+        else:
+            qa_dict["q_total_caution"] = self.make_array(
+                mat_data.qTotalWarning, ndim
+            ).astype(bool)
+        qa_dict["q_total_warning"] = self.make_array(
+            mat_data.qTotalWarning, ndim
+        ).astype(bool)
+        qa_dict["status"] = mat_data.status
+
+        # q_max_run and q_total not available in older QRev data
+        try:
+            qa_dict["q_max_run"] = self.make_array(mat_data.qMaxRun, ndim)
+            qa_dict["q_total"] = self.make_array(mat_data.qTotal, ndim)
+        except AttributeError:
+            qa_dict["q_max_run"] = np.tile(np.nan, (len(mat_data.qRunCaution), 6))
+            qa_dict["q_total"] = np.tile(np.nan, (len(mat_data.qRunCaution), 6))
+        return qa_dict
+
+    @staticmethod
+    def make_array(num_in, ndim=1):
+        """Ensures that num_in is an array and if not makes it an array.
+
+        num_in: any
+            Any value or array
+        """
+
+        if type(num_in) is np.ndarray:
+            if len(num_in.shape) < 2 and ndim > 1:
+                num_in = np.reshape(num_in, (1, num_in.shape[0]))
+                return num_in
+            else:
+                return num_in
+        else:
+            return np.array([num_in])
+
+    @staticmethod
+    def make_list(array_in):
+        """Converts a string or array to a list.
+
+        Parameters
+        ----------
+        array_in: any
+            Data to be converted to list.
+
+        Returns
+        -------
+        list_out: list
+            List of array_in data
+        """
+
+        list_out = []
+        # Convert string to list
+        if type(array_in) is str:
+            list_out = [array_in]
+        else:
+            # Empty array
+            if array_in.size == 0:
+                list_out = []
+            # Single message with integer codes at end
+            elif array_in.size == 3:
+                if not type(array_in[1]) is np.ndarray:
+                    if type(array_in[1]) is int or len(array_in[1].strip()) == 1:
+                        temp = array_in.tolist()
+                        if len(temp) > 0:
+                            internal_list = []
+                            for item in temp:
+                                internal_list.append(item)
+                            list_out = [internal_list]
+                    else:
+                        list_out = array_in.tolist()
+                else:
+                    list_out = array_in.tolist()
+            # Either multiple messages with or without integer codes
+            else:
+                list_out = array_in.tolist()
+
+        return list_out
+
+    def transects_qa(self, meas):
+        """Apply quality checks to transects
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # Assume good results
+        self.transects["status"] = "good"
+
+        # Initialize keys
+        self.transects["messages"] = []
+        self.transects["recip"] = 0
+        self.transects["sign"] = 0
+        self.transects["duration"] = 0
+        self.transects["number"] = 0
+        self.transects["uncertainty"] = 0
+        self.transects["batt_voltage"] = []
+        # Battery voltage
+        batt_threshold = 10.5
+
+        # Initialize lists
+        checked = []
+        discharges = []
+        start_edge = []
+
+        # Populate lists
+        for n in range(len(meas.transects)):
+            checked.append(meas.transects[n].checked)
+            if meas.transects[n].checked:
+                discharges.append(meas.discharge[n])
+                start_edge.append(meas.transects[n].start_edge)
+
+        num_checked = np.nansum(np.asarray(checked))
+
+        # Check duration
+        total_duration = 0
+        if num_checked >= 1:
+            for transect in meas.transects:
+                if transect.checked:
+                    total_duration += transect.date_time.transect_duration_sec
+
+        # Check duration against policy
+        if total_duration < meas.min_duration:
+            self.transects["status"] = "caution"
+            text = (
+                "Transects: Duration of selected transects is less than "
+                + str(meas.min_duration)
+                + " seconds;"
+            )
+            self.transects["messages"].append([text, 2, 0])
+            self.transects["duration"] = 1
+
+        # Check transects for missing ensembles
+        left_invalid_exceeded = False
+        right_invalid_exceeded = False
+        for transect in meas.transects:
+            if transect.checked:
+
+                # Determine number of missing ensembles
+                if transect.adcp.manufacturer == "SonTek":
+                    # Determine number of missing ensembles for SonTek data
+                    idx_missing = np.where(transect.date_time.ens_duration_sec > 1.5)[0]
+                    if len(idx_missing) > 0:
+                        average_ensemble_duration = (
+                            np.nansum(transect.date_time.ens_duration_sec)
+                            - np.nansum(
+                                transect.date_time.ens_duration_sec[idx_missing]
+                            )
+                        ) / (
+                            len(transect.date_time.ens_duration_sec) - len(idx_missing)
+                        )
+                        num_missing = np.round(
+                            np.nansum(transect.date_time.ens_duration_sec[idx_missing])
+                            / average_ensemble_duration
+                        ) - len(idx_missing)
+                    else:
+                        num_missing = 0
+                else:
+                    # Determine number of lost ensembles for TRDI data
+                    idx_missing = np.where(
+                        np.isnan(transect.date_time.ens_duration_sec)
+                    )[0]
+                    num_missing = len(idx_missing) - 1
+
+                # Save caution message
+                if num_missing > 0:
+                    self.transects["messages"].append(
+                        [
+                            "Transects: "
+                            + str(transect.file_name)
+                            + " is missing "
+                            + str(int(num_missing))
+                            + " ensembles;",
+                            2,
+                            0,
+                        ]
+                    )
+                    self.transects["status"] = "caution"
+
+                # Invalid ensembles at left and/or right edge
+                boat_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
+                valid_bt = boat_selected.valid_data[0, :]
+                valid_wt = np.any(transect.w_vel.valid_data[0, :, :], axis=0)
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+                valid_depth = depth_selected.valid_data
+                valid_all = np.vstack([valid_bt, valid_wt, valid_depth])
+                valid = np.all(valid_all, axis=0)
+
+                threshold = np.floor(0.05 * valid.shape[0])
+                if transect.start_edge == "Left":
+                    idx = np.where(np.logical_not(valid))
+                    if idx[0].size > threshold:
+                        left_invalid_exceeded = True
+                    idx = np.where(np.logical_not(np.flip(valid)))
+                    if idx[0].size > threshold:
+                        right_invalid_exceeded = True
+                else:
+                    idx = np.where(np.logical_not(valid))
+                    if idx[0].size > threshold:
+                        right_invalid_exceeded = True
+                    idx = np.where(np.logical_not(np.flip(valid)))
+                    if idx[0].size > threshold:
+                        left_invalid_exceeded = True
+
+                if transect.sensors is not None:
+                    if hasattr(transect.sensors, "battery_voltage"):
+                        if transect.sensors.battery_voltage.internal is not None:
+                            if transect.adcp.model == "RS5":
+                                batt_threshold = 3.3
+
+                            if (
+                                np.nanmin(
+                                    transect.sensors.battery_voltage.internal.data
+                                )
+                                < batt_threshold
+                            ):
+                                self.transects["batt_voltage"].append(
+                                    transect.file_name[:-4]
+                                )
+
+        # Message for invalid ensembles at left or right
+        if left_invalid_exceeded:
+            self.transects["messages"].append(
+                [
+                    "Transects: "
+                    + " The number of invalid ensembles at the left"
+                    + " edge exceeds 5 percent;",
+                    2,
+                    0,
+                ]
+            )
+            self.transects["status"] = "caution"
+        if right_invalid_exceeded:
+            self.transects["messages"].append(
+                [
+                    "Transects: "
+                    + " The number of invalid ensembles at the right"
+                    + " edge exceeds 5 percent;",
+                    2,
+                    0,
+                ]
+            )
+            self.transects["status"] = "caution"
+
+        # Message for low battery
+        if len(self.transects["batt_voltage"]) > 0:
+            self.transects["status"] = "caution"
+            text = (
+                "Transects: "
+                + str(self.transects["batt_voltage"])
+                + " have battery voltage less than "
+                + str(batt_threshold)
+            )
+            self.transects["messages"].append([text, 2, 0])
+
+        # Check number of transects checked
+        if num_checked == 0:
+            # No transects selected
+            self.transects["status"] = "warning"
+            self.transects["messages"].append(
+                ["TRANSECTS: No transects selected;", 1, 0]
+            )
+            self.transects["number"] = 2
+        elif num_checked == 1:
+            # Only one transect selected
+            self.transects["status"] = "caution"
+            self.transects["messages"].append(
+                ["Transects: Only one transect selected;", 2, 0]
+            )
+            self.transects["number"] = 2
+        else:
+            self.transects["number"] = num_checked
+            if num_checked == 2:
+                # Only 2 transects selected
+                cov, _ = Uncertainty.uncertainty_q_random(discharges, "total")
+                # Check uncertainty
+                if cov > 2:
+                    self.transects["status"] = "caution"
+                    self.transects["messages"].append(
+                        [
+                            "Transects: Uncertainty would be reduced by "
+                            "additional transects;",
+                            2,
+                            0,
+                        ]
+                    )
+
+            if num_checked < meas.min_transects:
+                self.transects["status"] = "caution"
+                text = (
+                    "Transects: Number of transects is below the "
+                    "required minimum of " + str(meas.min_transects) + ";"
+                )
+                self.transects["messages"].append([text, 2, 0])
+
+            # Check for consistent sign
+            q_positive = []
+            for q in discharges:
+                if q.total >= 0:
+                    q_positive.append(True)
+                else:
+                    q_positive.append(False)
+            if len(np.unique(q_positive)) > 1:
+                self.transects["status"] = "warning"
+                self.transects["messages"].append(
+                    [
+                        "TRANSECTS: Sign of total Q is not consistent. One "
+                        "or more start banks may be incorrect;",
+                        1,
+                        0,
+                    ]
+                )
+
+            # Check for reciprocal transects
+            num_left = start_edge.count("Left")
+            num_right = start_edge.count("Right")
+
+            if not num_left == num_right:
+                self.transects["status"] = "warning"
+                self.transects["messages"].append(
+                    [
+                        "TRANSECTS: Transects "
+                        "selected are not "
+                        "reciprocal transects;",
+                        1,
+                        0,
+                    ]
+                )
+
+        # Check for zero discharge transects
+        q_zero = False
+        for q in discharges:
+            if q.total == 0:
+                q_zero = True
+        if q_zero:
+            self.transects["status"] = "warning"
+            self.transects["messages"].append(
+                ["TRANSECTS: One or more transects have zero Q;", 1, 0]
+            )
+
+    def system_tst_qa(self, meas):
+        """Apply QA checks to system test.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.system_tst["messages"] = []
+        self.system_tst["status"] = "good"
+
+        # Determine if a system test was recorded
+        if not meas.system_tst:
+            # No system test data recorded
+            self.system_tst["status"] = "warning"
+            self.system_tst["messages"].append(["SYSTEM TEST: No system test;", 1, 3])
+        else:
+
+            pt3_fail = False
+            num_tests_with_failure = 0
+
+            for test in meas.system_tst:
+                if hasattr(test, "result"):
+
+                    # Check for presence of pt3 test
+                    if "pt3" in test.result and test.result["pt3"] is not None:
+
+                        # Check hard_limit, high gain, wide bandwidth
+                        if "hard_limit" in test.result["pt3"]:
+                            if "high_wide" in test.result["pt3"]["hard_limit"]:
+                                corr_table = test.result["pt3"]["hard_limit"][
+                                    "high_wide"
+                                ]["corr_table"]
+                                if len(corr_table) > 0:
+                                    # All lags past lag 2 should be less
+                                    # than 50% of lag 0
+                                    qa_threshold = corr_table[0, :] * 0.5
+                                    all_lag_check = np.greater(
+                                        corr_table[3::, :], qa_threshold
+                                    )
+
+                                    # Lag 7 should be less than 25% of lag 0
+                                    lag_7_check = np.greater(
+                                        corr_table[7, :], corr_table[0, :] * 0.25
+                                    )
+
+                                    # If either condition is met for any
+                                    # beam the test fails
+                                    if (
+                                        np.sum(np.sum(all_lag_check))
+                                        + np.sum(lag_7_check)
+                                        > 1
+                                    ):
+                                        pt3_fail = True
+
+                    if (
+                        test.result["sysTest"]["n_failed"] is not None
+                        and test.result["sysTest"]["n_failed"] > 0
+                    ):
+                        num_tests_with_failure += 1
+
+            # pt3 test failure message
+            if pt3_fail:
+                self.system_tst["status"] = "caution"
+                self.system_tst["messages"].append(
+                    [
+                        "System Test: One or more PT3 tests in the system "
+                        "test indicate potential EMI;",
+                        2,
+                        3,
+                    ]
+                )
+
+            # Check for failed tests
+            if num_tests_with_failure == len(meas.system_tst):
+                # All tests had a failure
+                self.system_tst["status"] = "warning"
+                self.system_tst["messages"].append(
+                    [
+                        "SYSTEM TEST: All system test sets have at least one "
+                        "test that failed;",
+                        1,
+                        3,
+                    ]
+                )
+            elif num_tests_with_failure > 0:
+                self.system_tst["status"] = "caution"
+                self.system_tst["messages"].append(
+                    [
+                        "System Test: One or more system test sets have at "
+                        "least one test that failed;",
+                        2,
+                        3,
+                    ]
+                )
+
+        # Check for a custom transformation matrix
+        for transect in meas.transects:
+            if transect.checked:
+                if transect.adcp.t_matrix.source == "Nominal":
+                    # This secondary check is necessary due to an earlier QRev bug
+                    # that indicated the source as Nominal even though it was a
+                    # custom matrix obtained from the ADCP. Thus loading a measurement
+                    # saved from a earlier version could create a false alert.
+                    # RiverRay matrices are always a standard matrix based on 30 degree
+                    # beams, but other TRDI ADCPs should be different from their
+                    # standard matrix based on 20 degree beams.
+                    # This secondary check is not necessary for Sontek ADCPs.
+                    if (
+                        transect.adcp.model != "RiverRay"
+                        and transect.adcp.manufacturer == "TRDI"
+                    ):
+                        nominal_matrix = [
+                            [1.4619, -1.4619, 0, 0],
+                            [0, 0, -1.4619, 1.4619],
+                            [0.2661, 0.2661, 0.2661, 0.2661],
+                            [1.0337, 1.0337, -1.0337, -1.0337],
+                        ]
+                        if np.allclose(nominal_matrix, transect.adcp.t_matrix.matrix):
+                            self.system_tst["status"] = "caution"
+                            self.system_tst["messages"].append(
+                                [
+                                    "System Test: ADCP is using a nominal matrix rather "
+                                    "than a custom matrix;",
+                                    2,
+                                    3,
+                                ]
+                            )
+                            break
+
+    def compass_qa(self, meas):
+        """Apply QA checks to compass calibration and evaluation.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.compass["messages"] = []
+
+        checked = []
+        for transect in meas.transects:
+            checked.append(transect.checked)
+
+        if np.any(checked):
+            heading = np.unique(
+                meas.transects[checked.index(1)].sensors.heading_deg.internal.data
+            )
+        else:
+            heading = np.array([0])
+
+        # Initialize variable as if ADCP has no compass
+        self.compass["status"] = "inactive"
+        self.compass["status1"] = "good"
+        self.compass["status2"] = "good"
+        self.compass["magvar"] = 0
+        self.compass["magvar_idx"] = []
+        self.compass["mag_error_idx"] = []
+        self.compass["pitch_mean_warning_idx"] = []
+        self.compass["pitch_mean_caution_idx"] = []
+        self.compass["pitch_std_caution_idx"] = []
+        self.compass["roll_mean_warning_idx"] = []
+        self.compass["roll_mean_caution_idx"] = []
+        self.compass["roll_std_caution_idx"] = []
+
+        if len(heading) > 1 and np.any(np.not_equal(heading, 0)):
+            # ADCP has a compass
+            # A compass calibration is required if a loop test or GPS are used
+
+            # Check for loop test
+            loop = False
+            for test in meas.mb_tests:
+                if test.type == "Loop":
+                    loop = True
+
+            # Check for GPS data
+            gps = False
+            if (
+                meas.transects[checked.index(True)].boat_vel.gga_vel is not None
+                or meas.transects[checked.index(True)].boat_vel.vtg_vel is not None
+            ):
+                gps = True
+
+            if gps or loop:
+                # Compass calibration is required
+
+                # Determine the ADCP manufacturer
+                if meas.transects[checked.index(True)].adcp.manufacturer == "SonTek":
+                    # SonTek ADCP
+                    if len(meas.compass_cal) == 0:
+                        # No compass calibration
+                        self.compass["status1"] = "warning"
+                        self.compass["messages"].append(
+                            ["COMPASS: No compass calibration;", 1, 4]
+                        )
+                    elif meas.compass_cal[-1].result["compass"]["error"] == "N/A":
+                        # If the error cannot be decoded from the
+                        # calibration assume the calibration is good
+                        self.compass["status1"] = "good"
+                    else:
+                        if meas.compass_cal[-1].result["compass"]["error"] <= 0.2:
+                            self.compass["status1"] = "good"
+                        else:
+                            self.compass["status1"] = "caution"
+                            self.compass["messages"].append(
+                                ["Compass: Calibration result > 0.2 deg;", 2, 4]
+                            )
+
+                elif meas.transects[checked.index(True)].adcp.manufacturer == "TRDI":
+                    # TRDI ADCP
+                    if len(meas.compass_cal) == 0:
+                        # No compass calibration
+                        if len(meas.compass_eval) == 0:
+                            # No calibration or evaluation
+                            self.compass["status1"] = "warning"
+                            self.compass["messages"].append(
+                                [
+                                    "COMPASS: No "
+                                    "compass "
+                                    "calibration "
+                                    "or "
+                                    "evaluation;",
+                                    1,
+                                    4,
+                                ]
+                            )
+
+                        else:
+                            # No calibration but an evaluation was completed
+                            self.compass["status1"] = "caution"
+                            self.compass["messages"].append(
+                                ["Compass: No compass calibration;", 2, 4]
+                            )
+                    else:
+                        # Compass was calibrated
+                        if len(meas.compass_eval) == 0:
+                            # No compass evaluation
+                            self.compass["status1"] = "caution"
+                            self.compass["messages"].append(
+                                ["Compass: No compass evaluation;", 2, 4]
+                            )
+                        else:
+                            # Check results of evaluation
+                            try:
+                                if (
+                                    float(
+                                        meas.compass_eval[-1].result["compass"]["error"]
+                                    )
+                                    <= 1
+                                ):
+                                    self.compass["status1"] = "good"
+                                else:
+                                    self.compass["status1"] = "caution"
+                                    self.compass["messages"].append(
+                                        ["Compass: Evaluation result > 1 deg;", 2, 4]
+                                    )
+                            except ValueError:
+                                self.compass["status1"] = "good"
+            else:
+                # Compass not required
+                if len(meas.compass_cal) == 0 and len(meas.compass_eval) == 0:
+                    # No compass calibration or evaluation
+                    self.compass["status1"] = "default"
+                else:
+                    # Compass was calibrated and evaluated
+                    self.compass["status1"] = "good"
+
+            # Check for consistent magvar and pitch and roll mean and variation
+            magvar = []
+            align = []
+            mag_error_exceeded = []
+            pitch_mean = []
+            pitch_std = []
+            pitch_exceeded = []
+            roll_mean = []
+            roll_std = []
+            roll_exceeded = []
+            transect_idx = []
+            for n, transect in enumerate(meas.transects):
+                if transect.checked:
+                    transect_idx.append(n)
+                    heading_source_selected = getattr(
+                        transect.sensors.heading_deg,
+                        transect.sensors.heading_deg.selected,
+                    )
+                    pitch_source_selected = getattr(
+                        transect.sensors.pitch_deg, transect.sensors.pitch_deg.selected
+                    )
+                    roll_source_selected = getattr(
+                        transect.sensors.roll_deg, transect.sensors.roll_deg.selected
+                    )
+
+                    magvar.append(transect.sensors.heading_deg.internal.mag_var_deg)
+                    if transect.sensors.heading_deg.external is not None:
+                        align.append(
+                            transect.sensors.heading_deg.external.align_correction_deg
+                        )
+
+                    pitch_mean.append(np.nanmean(pitch_source_selected.data))
+                    pitch_std.append(np.nanstd(pitch_source_selected.data, ddof=1))
+                    roll_mean.append(np.nanmean(roll_source_selected.data))
+                    roll_std.append(np.nanstd(roll_source_selected.data, ddof=1))
+
+                    # SonTek G3 compass provides pitch, roll, and magnetic
+                    # error parameters that can be checked
+                    if transect.adcp.manufacturer == "SonTek":
+                        if heading_source_selected.pitch_limit is not None:
+                            # Check for bug in SonTek data where pitch and
+                            # roll was n x 3 use n x 1
+                            if len(pitch_source_selected.data.shape) == 1:
+                                pitch_data = pitch_source_selected.data
+                            else:
+                                pitch_data = pitch_source_selected.data[:, 0]
+                            idx_max = np.where(
+                                pitch_data > heading_source_selected.pitch_limit[0]
+                            )[0]
+                            idx_min = np.where(
+                                pitch_data < heading_source_selected.pitch_limit[1]
+                            )[0]
+                            if len(idx_max) > 0 or len(idx_min) > 0:
+                                pitch_exceeded.append(True)
+                            else:
+                                pitch_exceeded.append(False)
+
+                        if heading_source_selected.roll_limit is not None:
+                            if len(roll_source_selected.data.shape) == 1:
+                                roll_data = roll_source_selected.data
+                            else:
+                                roll_data = roll_source_selected.data[:, 0]
+                            idx_max = np.where(
+                                roll_data > heading_source_selected.pitch_limit[0]
+                            )[0]
+                            idx_min = np.where(
+                                roll_data < heading_source_selected.pitch_limit[1]
+                            )[0]
+                            if len(idx_max) > 0 or len(idx_min) > 0:
+                                roll_exceeded.append(True)
+                            else:
+                                roll_exceeded.append(False)
+
+                        if heading_source_selected.mag_error is not None:
+                            idx_max = np.where(heading_source_selected.mag_error > 2)[0]
+                            if len(idx_max) > 0:
+                                mag_error_exceeded.append(n)
+            # Check magvar consistency
+            if len(np.unique(magvar)) > 1:
+                self.compass["status2"] = "caution"
+                self.compass["messages"].append(
+                    [
+                        "Compass: Magnetic variation is not consistent among "
+                        "transects;",
+                        2,
+                        4,
+                    ]
+                )
+                self.compass["magvar"] = 1
+
+            # Check magvar consistency
+            if len(np.unique(align)) > 1:
+                self.compass["status2"] = "caution"
+                self.compass["messages"].append(
+                    [
+                        "Compass: Heading offset is not consistent among " "transects;",
+                        2,
+                        4,
+                    ]
+                )
+                self.compass["align"] = 1
+
+            # Check that magvar was set if GPS data are available
+            if gps:
+                if 0 in magvar:
+                    self.compass["status2"] = "warning"
+                    self.compass["messages"].append(
+                        [
+                            "COMPASS: Magnetic variation is 0 and GPS data "
+                            "are present;",
+                            1,
+                            4,
+                        ]
+                    )
+                    self.compass["magvar"] = 2
+                    self.compass["magvar_idx"] = np.where(np.array(magvar) == 0)[
+                        0
+                    ].tolist()
+
+            # Check pitch mean
+            if np.any(np.asarray(np.abs(pitch_mean)) > 8):
+                self.compass["status2"] = "warning"
+                self.compass["messages"].append(
+                    ["PITCH: One or more transects have a mean pitch > 8 deg;", 1, 4]
+                )
+                temp = np.where(np.abs(pitch_mean) > 8)[0]
+                if len(temp) > 0:
+                    self.compass["pitch_mean_warning_idx"] = np.array(transect_idx)[
+                        temp
+                    ]
+                else:
+                    self.compass["pitch_mean_warning_idx"] = []
+
+            elif np.any(np.asarray(np.abs(pitch_mean)) > 4):
+                if self.compass["status2"] == "good":
+                    self.compass["status2"] = "caution"
+                self.compass["messages"].append(
+                    ["Pitch: One or more transects have a mean pitch > 4 deg;", 2, 4]
+                )
+                temp = np.where(np.abs(pitch_mean) > 4)[0]
+                if len(temp) > 0:
+                    self.compass["pitch_mean_caution_idx"] = np.array(transect_idx)[
+                        temp
+                    ]
+                else:
+                    self.compass["pitch_mean_caution_idx"] = []
+
+            # Check roll mean
+            if np.any(np.asarray(np.abs(roll_mean)) > 8):
+                self.compass["status2"] = "warning"
+                self.compass["messages"].append(
+                    ["ROLL: One or more transects have a mean roll > 8 deg;", 1, 4]
+                )
+                temp = np.where(np.abs(roll_mean) > 8)[0]
+                if len(temp) > 0:
+                    self.compass["roll_mean_warning_idx"] = np.array(transect_idx)[temp]
+                else:
+                    self.compass["roll_mean_warning_idx"] = []
+
+            elif np.any(np.asarray(np.abs(roll_mean)) > 4):
+                if self.compass["status2"] == "good":
+                    self.compass["status2"] = "caution"
+                self.compass["messages"].append(
+                    ["Roll: One or more transects have a mean roll > 4 deg;", 2, 4]
+                )
+                temp = np.where(np.abs(roll_mean) > 4)[0]
+                if len(temp) > 0:
+                    self.compass["roll_mean_caution_idx"] = np.array(transect_idx)[temp]
+                else:
+                    self.compass["roll_mean_caution_idx"] = []
+
+            # Check pitch standard deviation
+            if np.any(np.asarray(pitch_std) > 5):
+                if self.compass["status2"] == "good":
+                    self.compass["status2"] = "caution"
+                self.compass["messages"].append(
+                    [
+                        "Pitch: One or more "
+                        "transects have a pitch "
+                        "std dev > 5 deg;",
+                        2,
+                        4,
+                    ]
+                )
+
+                temp = np.where(np.abs(pitch_std) > 5)[0]
+                if len(temp) > 0:
+                    self.compass["pitch_std_caution_idx"] = np.array(transect_idx)[temp]
+                else:
+                    self.compass["pitch_std_caution_idx"] = []
+
+            # Check roll standard deviation
+            if np.any(np.asarray(roll_std) > 5):
+                if self.compass["status2"] == "good":
+                    self.compass["status2"] = "caution"
+                self.compass["messages"].append(
+                    [
+                        "Roll: One or more "
+                        "transects have a roll "
+                        "std dev > 5 deg;",
+                        2,
+                        4,
+                    ]
+                )
+
+                temp = np.where(np.abs(roll_std) > 5)[0]
+                if len(temp) > 0:
+                    self.compass["roll_std_caution_idx"] = np.array(transect_idx)[temp]
+                else:
+                    self.compass["roll_std_caution_idx"] = []
+
+            # Additional checks for SonTek G3 compass
+            if meas.transects[checked.index(True)].adcp.manufacturer == "SonTek":
+                # Check if pitch limits were exceeded
+                if any(pitch_exceeded):
+                    if self.compass["status2"] == "good":
+                        self.compass["status2"] = "caution"
+                    self.compass["messages"].append(
+                        [
+                            "Compass: One or more transects have pitch "
+                            "exceeding calibration limits;",
+                            2,
+                            4,
+                        ]
+                    )
+
+                # Check if roll limits were exceeded
+                if any(roll_exceeded):
+                    if self.compass["status2"] == "good":
+                        self.compass["status2"] = "caution"
+                    self.compass["messages"].append(
+                        [
+                            "Compass: One or more transects have roll "
+                            "exceeding calibration limits;",
+                            2,
+                            4,
+                        ]
+                    )
+
+                # Check if magnetic error was exceeded
+                self.compass["mag_error_idx"] = []
+                if len(mag_error_exceeded) > 0:
+                    self.compass["mag_error_idx"] = np.array(mag_error_exceeded)
+                    if self.compass["status2"] == "good":
+                        self.compass["status2"] = "caution"
+                    self.compass["messages"].append(
+                        [
+                            "Compass: One or more transects have a change in "
+                            "mag field exceeding 2%;",
+                            2,
+                            4,
+                        ]
+                    )
+
+            if (
+                self.compass["status1"] == "warning"
+                or self.compass["status2"] == "warning"
+            ):
+                self.compass["status"] = "warning"
+            elif (
+                self.compass["status1"] == "caution"
+                or self.compass["status2"] == "caution"
+            ):
+                self.compass["status"] = "caution"
+            else:
+                self.compass["status"] = "good"
+
+    def temperature_qa(self, meas):
+        """Apply QA checks to temperature.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.temperature["messages"] = []
+        check = [0, 0]
+
+        # Create array of all temperatures
+        temp = np.array([])
+        checked = []
+        for transect in meas.transects:
+            if transect.checked:
+                checked.append(transect.checked)
+                temp_selected = getattr(
+                    transect.sensors.temperature_deg_c,
+                    transect.sensors.temperature_deg_c.selected,
+                )
+                if len(temp) == 0:
+                    temp = temp_selected.data
+                else:
+                    temp = np.hstack((temp, temp_selected.data))
+
+        # Check temperature range
+        if np.any(checked):
+            temp_range = np.nanmax(temp) - np.nanmin(temp)
+        else:
+            temp_range = 0
+
+        if temp_range > 2:
+            check[0] = 3
+            self.temperature["messages"].append(
+                [
+                    "TEMPERATURE: Temperature range is "
+                    + "{:3.1f}".format(temp_range)
+                    + " degrees C which is greater than 2 degrees;",
+                    1,
+                    5,
+                ]
+            )
+        elif temp_range > 1:
+            check[0] = 2
+            self.temperature["messages"].append(
+                [
+                    "Temperature: Temperature range is "
+                    + "{:3.1f}".format(temp_range)
+                    + " degrees C which is greater than 1 degree;",
+                    2,
+                    5,
+                ]
+            )
+        else:
+            check[0] = 1
+
+        # Check for independent temperature reading
+        if "user" in meas.ext_temp_chk:
+            try:
+                user = float(meas.ext_temp_chk["user"])
+            except (ValueError, TypeError):
+                user = None
+            if user is None or np.isnan(user):
+                # No independent temperature reading
+                check[1] = 2
+                self.temperature["messages"].append(
+                    ["Temperature: No independent temperature reading;", 2, 5]
+                )
+            elif not np.isnan(meas.ext_temp_chk["adcp"]):
+                # Compare user to manually entered ADCP temperature
+                diff = np.abs(user - meas.ext_temp_chk["adcp"])
+                if diff < 2:
+                    check[1] = 1
+                else:
+                    check[1] = 3
+                    self.temperature["messages"].append(
+                        [
+                            "TEMPERATURE: The difference between ADCP and "
+                            "reference is > 2:  " + "{:3.1f}".format(diff) + " C;",
+                            1,
+                            5,
+                        ]
+                    )
+            else:
+                # Compare user to mean of all temperature data
+                diff = np.abs(user - np.nanmean(temp))
+                if diff < 2:
+                    check[1] = 1
+                else:
+                    check[1] = 3
+                    self.temperature["messages"].append(
+                        [
+                            "TEMPERATURE: The difference between ADCP and "
+                            "reference is > 2:  " + "{:3.1f}".format(diff) + " C;",
+                            1,
+                            5,
+                        ]
+                    )
+
+        # Assign temperature status
+        max_check = max(check)
+        if max_check == 1:
+            self.temperature["status"] = "good"
+        elif max_check == 2:
+            self.temperature["status"] = "caution"
+        elif max_check == 3:
+            self.temperature["status"] = "warning"
+
+    def moving_bed_qa(self, meas):
+        """Applies quality checks to moving-bed tests.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.movingbed["messages"] = []
+        self.movingbed["code"] = 0
+
+        # Are there moving-bed tests?
+        if len(meas.mb_tests) < 1:
+            if meas.observed_no_moving_bed:
+                self.movingbed["messages"].append(
+                    ["Moving-Bed Test: Visually observed no moving bed;", 2, 6]
+                )
+                self.movingbed["status"] = "caution"
+                self.movingbed["code"] = 2
+            else:
+                # No moving-bed test
+                self.movingbed["messages"].append(
+                    ["MOVING-BED TEST: No moving bed test;", 1, 6]
+                )
+                self.movingbed["status"] = "warning"
+                self.movingbed["code"] = 3
+
+        else:
+            # Moving-bed tests available
+            mb_data = meas.mb_tests
+
+            user_valid_test = []
+            file_names = []
+            idx_selected = []
+            test_quality = []
+            mb_tests = []
+            mb = []
+            mb_test_type = []
+            loop = []
+            use_2_correct = []
+            gps_diff1 = False
+            gps_diff2 = False
+
+            for n, test in enumerate(mb_data):
+                # Are tests valid according to the user
+                if test.user_valid:
+                    user_valid_test.append(True)
+                    file_names.append(test.transect.file_name)
+                    if test.type == "Loop" and not test.test_quality == "Errors":
+                        loop.append(test.moving_bed)
+
+                    if not np.isnan(test.gps_percent_mb):
+                        if np.abs(test.bt_percent_mb - test.gps_percent_mb) > 2:
+                            gps_diff2 = True
+                        if np.logical_xor(
+                            test.bt_percent_mb >= 1, test.gps_percent_mb >= 1
+                        ):
+                            gps_diff1 = True
+                    # Selected test
+                    if test.selected:
+                        idx_selected.append(n)
+                        test_quality.append(test.test_quality)
+                        mb_tests.append(test)
+                        mb.append(test.moving_bed)
+                        mb_test_type.append(test.type)
+                        use_2_correct.append(test.use_2_correct)
+                else:
+                    user_valid_test.append(False)
+
+            if not any(user_valid_test):
+                # No valid test according to user
+                self.movingbed["messages"].append(
+                    [
+                        "MOVING-BED TEST: No "
+                        "valid moving-bed test "
+                        "based on user input;",
+                        1,
+                        6,
+                    ]
+                )
+
+                self.movingbed["status"] = "warning"
+                self.movingbed["code"] = 3
+            else:
+                # Check for duplicate valid moving-bed tests
+                if len(np.unique(file_names)) < len(file_names):
+                    self.movingbed["messages"].append(
+                        [
+                            "MOVING-BED TEST: Duplicate moving-bed test files "
+                            "marked valid;",
+                            1,
+                            6,
+                        ]
+                    )
+                    self.movingbed["status"] = "warning"
+                    self.movingbed["code"] = 3
+
+            if self.movingbed["code"] == 0:
+                # Check test quality
+                if len(test_quality) > 0 and sum(np.array(test_quality) == "Good") > 0:
+                    self.movingbed["status"] = "good"
+                    self.movingbed["code"] = 1
+
+                    # Check if there is a moving-bed
+                    if "Yes" in mb:
+
+                        # Moving-bed present
+                        self.movingbed["messages"].append(
+                            ["Moving-Bed Test: A moving-bed is present.", 2, 6]
+                        )
+                        self.movingbed["code"] = 2
+                        self.movingbed["status"] = "caution"
+                        if (
+                            meas.transects[
+                                meas.checked_transect_idx[0]
+                            ].boat_vel.composite
+                            == "On"
+                        ):
+                            self.movingbed["messages"].append(
+                                [
+                                    "Moving-Bed: Use of composite tracks "
+                                    "could cause inaccurate results.",
+                                    2,
+                                    6,
+                                ]
+                            )
+
+                        if (
+                            meas.transects[
+                                meas.checked_transect_idx[0]
+                            ].boat_vel.selected
+                            == "bt_vel"
+                        ):
+                            if any(use_2_correct):
+                                self.movingbed["messages"].append(
+                                    [
+                                        "Moving-Bed: BT based moving-bed "
+                                        "correction applied.",
+                                        2,
+                                        6,
+                                    ]
+                                )
+                            else:
+                                self.movingbed["messages"].append(
+                                    [
+                                        "MOVING-BED: Moving-bed present and "
+                                        "BT used, but no correction applied.",
+                                        1,
+                                        6,
+                                    ]
+                                )
+                                self.movingbed["code"] = 3
+                                self.movingbed["status"] = "warning"
+                        elif (
+                            meas.transects[
+                                meas.checked_transect_idx[0]
+                            ].boat_vel.selected
+                            == "gga_vel"
+                        ):
+                            self.movingbed["messages"].append(
+                                ["Moving-Bed: GGA used.", 2, 6]
+                            )
+                        elif (
+                            meas.transects[
+                                meas.checked_transect_idx[0]
+                            ].boat_vel.selected
+                            == "vtg_vel"
+                        ):
+                            self.movingbed["messages"].append(
+                                ["Moving-Bed: VTG used.", 2, 6]
+                            )
+
+                        # Check for test type
+                        if sum(np.array(mb_test_type) == "Stationary"):
+                            # Check for GPS or 3 stationary tests
+                            if len(mb_tests) < 3:
+                                gps = []
+                                for transect in meas.transects:
+                                    if transect.checked:
+                                        if transect.gps is None:
+                                            gps.append(False)
+                                        else:
+                                            gps.append(True)
+                                if not all(gps):
+                                    # GPS not available for all selected
+                                    # transects
+                                    self.movingbed["messages"].append(
+                                        [
+                                            "Moving-Bed Test: "
+                                            + "Less than 3 stationary tests "
+                                            "available for moving-bed "
+                                            "correction;",
+                                            2,
+                                            6,
+                                        ]
+                                    )
+
+                elif (
+                    len(test_quality) > 0
+                    and sum(np.array(test_quality) == "Warnings") > 0
+                ):
+                    # Quality check has warnings
+                    self.movingbed["messages"].append(
+                        [
+                            "Moving-Bed Test: "
+                            "The moving-bed "
+                            "test(s) has "
+                            "warnings, " + "please review "
+                            "tests to "
+                            "determine "
+                            "validity;",
+                            2,
+                            6,
+                        ]
+                    )
+
+                    self.movingbed["status"] = "caution"
+                    self.movingbed["code"] = 2
+
+                elif (
+                    len(test_quality) > 0
+                    and sum(np.array(test_quality) == "Manual") > 0
+                ):
+                    # Manual override used
+                    self.movingbed["messages"].append(
+                        [
+                            "MOVING-BED TEST: " + "The user has "
+                            "manually forced "
+                            "the use of some "
+                            "tests;",
+                            1,
+                            6,
+                        ]
+                    )
+                    self.movingbed["status"] = "warning"
+                    self.movingbed["code"] = 3
+
+                else:
+                    # Test has critical errors
+                    self.movingbed["messages"].append(
+                        [
+                            "MOVING-BED TEST: "
+                            "The moving-bed "
+                            "test(s) have "
+                            "critical errors " + "and will not be "
+                            "used;",
+                            1,
+                            6,
+                        ]
+                    )
+
+                    self.movingbed["status"] = "warning"
+                    self.movingbed["code"] = 3
+
+                # Check multiple loops for consistency
+                if len(np.unique(loop)) > 1:
+                    self.movingbed["messages"].append(
+                        [
+                            "Moving-Bed Test: "
+                            "Results of valid "
+                            "loops are not "
+                            "consistent, " + "review "
+                            "moving-bed "
+                            "tests;",
+                            2,
+                            6,
+                        ]
+                    )
+                    if self.movingbed["code"] < 3:
+                        self.movingbed["code"] = 2
+                        self.movingbed["status"] = "caution"
+
+                # Notify of differences in results of test between BT and GPS
+                if gps_diff2:
+                    self.movingbed["messages"].append(
+                        [
+                            "Moving-Bed Test: Bottom track and "
+                            "GPS results differ by more than 2%.",
+                            2,
+                            6,
+                        ]
+                    )
+                    if self.movingbed["code"] < 3:
+                        self.movingbed["code"] = 2
+                        self.movingbed["status"] = "caution"
+
+                if gps_diff1:
+                    self.movingbed["messages"].append(
+                        [
+                            "Moving-Bed Test: "
+                            "Bottom track and "
+                            "GPS results do "
+                            "not agree.",
+                            2,
+                            6,
+                        ]
+                    )
+                    if self.movingbed["code"] < 3:
+                        self.movingbed["code"] = 2
+                        self.movingbed["status"] = "caution"
+
+            if len(loop) > 0:
+                if self.compass["status1"] != "good":
+                    self.movingbed["messages"].append(
+                        "Moving-Bed Test: Loop test used but compass calibration is "
+                        + self.compass["status1"]
+                    )
+                    if self.movingbed["code"] < 3:
+                        self.movingbed["code"] = 2
+                        self.movingbed["status"] = "caution"
+
+        self.check_mbt_settings(meas)
+
+    def user_qa(self, meas):
+        """Apply quality checks to user input data.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.user["messages"] = []
+        self.user["status"] = "good"
+
+        # Check for Station Name
+        self.user["sta_name"] = False
+        if meas.station_name is None or len(meas.station_name.strip()) < 1:
+            self.user["messages"].append(["Site Info: Station name not entered;", 2, 2])
+            self.user["status"] = "caution"
+            self.user["sta_name"] = True
+
+        # Check for Station Number
+        self.user["sta_number"] = False
+        try:
+            if meas.station_number is None or len(meas.station_number.strip()) < 1:
+                self.user["messages"].append(
+                    ["Site Info: Station number not entered;", 2, 2]
+                )
+                self.user["status"] = "caution"
+                self.user["sta_number"] = True
+        except AttributeError:
+            self.user["messages"].append(
+                ["Site Info: Station number not entered;", 2, 2]
+            )
+            self.user["status"] = "caution"
+            self.user["sta_number"] = True
+
+    def depths_qa(self, meas):
+        """Apply quality checks to depth data.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # Initialize variables
+        n_transects = len(meas.transects)
+        self.depths["q_total"] = np.tile(np.nan, n_transects)
+        self.depths["q_max_run"] = np.tile(np.nan, n_transects)
+        self.depths["q_total_caution"] = np.tile(False, n_transects)
+        self.depths["q_max_run_caution"] = np.tile(False, n_transects)
+        self.depths["q_total_warning"] = np.tile(False, n_transects)
+        self.depths["q_max_run_warning"] = np.tile(False, n_transects)
+        self.depths["all_invalid"] = np.tile(False, n_transects)
+        self.depths["messages"] = []
+        self.depths["status"] = "good"
+        self.depths["draft"] = 0
+        checked = []
+        drafts = []
+        for n, transect in enumerate(meas.transects):
+            checked.append(transect.checked)
+            if transect.checked:
+                in_transect_idx = transect.in_transect_idx
+
+                depths_selected = getattr(transect.depths, transect.depths.selected)
+                drafts.append(depths_selected.draft_use_m)
+
+                # Determine valid measured depths
+                if transect.depths.composite:
+                    depth_na = depths_selected.depth_source_ens[in_transect_idx] != "NA"
+                    depth_in = depths_selected.depth_source_ens[in_transect_idx] != "IN"
+                    depth_valid = np.all(np.vstack((depth_na, depth_in)), 0)
+                else:
+                    depth_valid_temp = depths_selected.valid_data[in_transect_idx]
+                    depth_nan = (
+                        depths_selected.depth_processed_m[in_transect_idx] != np.nan
+                    )
+                    depth_valid = np.all(np.vstack((depth_nan, depth_valid_temp)), 0)
+
+                if not np.any(depth_valid):
+                    self.depths["all_invalid"][n] = True
+
+                # Compute QA characteristics
+                q_total, q_max_run, number_invalid_ensembles = QAData.invalid_qa(
+                    depth_valid, meas.discharge[n]
+                )
+                self.depths["q_total"][n] = q_total
+                self.depths["q_max_run"][n] = q_max_run
+
+                # Compute percentage compared to total
+                if meas.discharge[n].total == 0.0:
+                    q_total_percent = np.nan
+                    q_max_run_percent = np.nan
+                else:
+                    q_total_percent = np.abs((q_total / meas.discharge[n].total) * 100)
+                    q_max_run_percent = np.abs(
+                        (q_max_run / meas.discharge[n].total) * 100
+                    )
+
+                # Apply total interpolated discharge threshold
+                if q_total_percent > self.q_total_threshold_warning:
+                    self.depths["q_total_warning"][n] = True
+                elif q_total_percent > self.q_total_threshold_caution:
+                    self.depths["q_total_caution"][n] = True
+
+                # Apply interpolated discharge run thresholds
+                if q_max_run_percent > self.q_run_threshold_warning:
+                    self.depths["q_max_run_warning"][n] = True
+                elif q_max_run_percent > self.q_run_threshold_caution:
+                    self.depths["q_max_run_caution"][n] = True
+
+        if checked:
+
+            # Create array of all unique draft values
+            draft_check = np.unique(np.round(drafts, 2))
+
+            # Check draft consistency
+            if len(draft_check) > 1:
+                self.depths["status"] = "caution"
+                self.depths["draft"] = 1
+                self.depths["messages"].append(
+                    [
+                        "Depth: Transducer depth "
+                        "is not consistent among "
+                        "transects;",
+                        2,
+                        10,
+                    ]
+                )
+
+            # Check for zero draft
+            if np.any(np.less(draft_check, 0.01)):
+                self.depths["status"] = "warning"
+                self.depths["draft"] = 2
+                self.depths["messages"].append(
+                    ["DEPTH: Transducer depth is too shallow, likely 0;", 1, 10]
+                )
+
+            # Check interpolated discharge criteria
+            if np.any(self.depths["q_max_run_warning"]):
+                self.depths["messages"].append(
+                    [
+                        "DEPTH: Int. Q for consecutive invalid ensembles exceeds "
+                        + "%2.0f" % self.q_run_threshold_warning
+                        + "%;",
+                        1,
+                        10,
+                    ]
+                )
+                self.depths["status"] = "warning"
+
+            elif np.any(self.depths["q_total_warning"]):
+                self.depths["messages"].append(
+                    [
+                        "DEPTH: Int. Q for invalid ensembles in a "
+                        "transect exceeds "
+                        + "%2.0f" % self.q_total_threshold_warning
+                        + "%;",
+                        1,
+                        10,
+                    ]
+                )
+                self.depths["status"] = "warning"
+            elif np.any(self.depths["q_max_run_caution"]):
+                self.depths["messages"].append(
+                    [
+                        "Depth: Int. Q for consecutive invalid ensembles exceeds "
+                        + "%2.0f" % self.q_run_threshold_caution
+                        + "%;",
+                        2,
+                        10,
+                    ]
+                )
+                self.depths["status"] = "caution"
+            elif np.any(self.depths["q_total_caution"]):
+                self.depths["messages"].append(
+                    [
+                        "Depth: Int. Q for "
+                        "invalid ensembles in a "
+                        "transect exceeds "
+                        + "%2.0f" % self.q_total_threshold_caution
+                        + "%;",
+                        2,
+                        10,
+                    ]
+                )
+                self.depths["status"] = "caution"
+
+            # Check if all depths are invalid
+            if np.any(self.depths["all_invalid"]):
+                self.depths["messages"].append(
+                    [
+                        "DEPTH: There are no "
+                        "valid depths for one or "
+                        "more transects.",
+                        2,
+                        10,
+                    ]
+                )
+                self.depths["status"] = "warning"
+
+        else:
+            self.depths["status"] = "inactive"
+
+    def boat_qa1(self, meas):
+        """Apply quality checks to boat data.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # Initialize variables
+        n_transects = len(meas.transects)
+        data_type = {
+            "BT": {
+                "class": "bt_vel",
+                "warning": "BT-",
+                "caution": "bt-",
+                "filter": [
+                    ("All: ", 0),
+                    ("Original: ", 1),
+                    ("ErrorVel: ", 2),
+                    ("VertVel: ", 3),
+                    ("Other: ", 4),
+                    ("3Beams: ", 5),
+                ],
+            },
+            "GGA": {
+                "class": "gga_vel",
+                "warning": "GGA-",
+                "caution": "gga-",
+                "filter": [
+                    ("All: ", 0),
+                    ("Original: ", 1),
+                    ("DGPS: ", 2),
+                    ("Altitude: ", 3),
+                    ("Other: ", 4),
+                    ("HDOP: ", 5),
+                ],
+            },
+            "VTG": {
+                "class": "vtg_vel",
+                "warning": "VTG-",
+                "caution": "vtg-",
+                "filter": [
+                    ("All: ", 0),
+                    ("Original: ", 1),
+                    ("Other: ", 4),
+                    ("HDOP: ", 5),
+                ],
+            },
+        }
+        self.boat["messages"] = []
+
+        for dt_key, dt_value in data_type.items():
+            boat = getattr(self, dt_value["class"])
+
+            # Initialize dictionaries for each data type
+            boat["q_total_caution"] = np.tile(False, (n_transects, 6))
+            boat["q_max_run_caution"] = np.tile(False, (n_transects, 6))
+            boat["q_total_warning"] = np.tile(False, (n_transects, 6))
+            boat["q_max_run_warning"] = np.tile(False, (n_transects, 6))
+            boat["all_invalid"] = np.tile(False, n_transects)
+            boat["q_total"] = np.tile(np.nan, (n_transects, 6))
+            boat["q_max_run"] = np.tile(np.nan, (n_transects, 6))
+            boat["messages"] = []
+            status_switch = 0
+            avg_speed_check = 0
+
+            # Check the results of each filter
+            for dt_filter in dt_value["filter"]:
+                boat["status"] = "inactive"
+
+                # Quality check each transect
+                for n, transect in enumerate(meas.transects):
+
+                    # Evaluate on transects used in the discharge computation
+                    if transect.checked:
+
+                        in_transect_idx = transect.in_transect_idx
+
+                        # Check to see if data are available for the data_type
+                        if getattr(transect.boat_vel, dt_value["class"]) is not None:
+                            boat["status"] = "good"
+
+                            # Compute quality characteristics
+                            valid = getattr(
+                                transect.boat_vel, dt_value["class"]
+                            ).valid_data[dt_filter[1], in_transect_idx]
+                            q_total, q_max_run, number_invalid_ens = QAData.invalid_qa(
+                                valid, meas.discharge[n]
+                            )
+                            boat["q_total"][n, dt_filter[1]] = q_total
+                            boat["q_max_run"][n, dt_filter[1]] = q_max_run
+
+                            # Compute percentage compared to total
+                            if meas.discharge[n].total == 0.0:
+                                q_total_percent = np.nan
+                                q_max_run_percent = np.nan
+                            else:
+                                q_total_percent = np.abs(
+                                    (q_total / meas.discharge[n].total) * 100
+                                )
+                                q_max_run_percent = np.abs(
+                                    (q_max_run / meas.discharge[n].total) * 100
+                                )
+
+                            # Check if all invalid
+                            if dt_filter[1] == 0 and not np.any(valid):
+                                boat["all_invalid"][n] = True
+
+                            # Apply total interpolated discharge threshold
+                            if q_total_percent > self.q_total_threshold_warning:
+                                boat["q_total_warning"][n, dt_filter[1]] = True
+                            elif q_total_percent > self.q_total_threshold_caution:
+                                boat["q_total_caution"][n, dt_filter[1]] = True
+
+                            # Apply interpolated discharge run thresholds
+                            if q_max_run_percent > self.q_run_threshold_warning:
+                                boat["q_max_run_warning"][n, dt_filter[1]] = True
+                            elif q_max_run_percent > self.q_run_threshold_caution:
+                                boat["q_max_run_caution"][n, dt_filter[1]] = True
+
+                            # Check boat velocity for vtg data
+                            if (
+                                dt_key == "VTG"
+                                and transect.boat_vel.selected == "vtg_vel"
+                                and avg_speed_check == 0
+                            ):
+                                if transect.boat_vel.vtg_vel.u_mps is not None:
+                                    avg_speed = np.nanmean(
+                                        (
+                                            transect.boat_vel.vtg_vel.u_mps**2
+                                            + transect.boat_vel.vtg_vel.v_mps**2
+                                        )
+                                        ** 0.5
+                                    )
+                                    if avg_speed < 0.24:
+                                        boat["q_total_caution"][n, 2] = True
+                                        if status_switch < 1:
+                                            status_switch = 1
+                                        boat["messages"].append(
+                                            [
+                                                "vtg-AvgSpeed: VTG data may "
+                                                "not be accurate for average "
+                                                "boat speed "
+                                                "less than" + "0.24 m/s (0.8 "
+                                                "ft/s);",
+                                                2,
+                                                8,
+                                            ]
+                                        )
+                                        avg_speed_check = 1
+
+                # Create message for consecutive invalid discharge
+                if boat["q_max_run_warning"][:, dt_filter[1]].any():
+                    if dt_key == "BT":
+                        module_code = 7
+                    else:
+                        module_code = 8
+                    boat["messages"].append(
+                        [
+                            dt_value["warning"]
+                            + dt_filter[0]
+                            + "Int. Q for consecutive invalid ensembles exceeds "
+                            + "%3.1f" % self.q_run_threshold_warning
+                            + "%;",
+                            1,
+                            module_code,
+                        ]
+                    )
+                    status_switch = 2
+                elif boat["q_max_run_caution"][:, dt_filter[1]].any():
+                    if dt_key == "BT":
+                        module_code = 7
+                    else:
+                        module_code = 8
+                    boat["messages"].append(
+                        [
+                            dt_value["caution"]
+                            + dt_filter[0]
+                            + "Int. Q for consecutive invalid ensembles exceeds "
+                            + "%3.1f" % self.q_run_threshold_caution
+                            + "%;",
+                            2,
+                            module_code,
+                        ]
+                    )
+                    if status_switch < 1:
+                        status_switch = 1
+
+                # Create message for total invalid discharge
+                if boat["q_total_warning"][:, dt_filter[1]].any():
+                    if dt_key == "BT":
+                        module_code = 7
+                    else:
+                        module_code = 8
+                    boat["messages"].append(
+                        [
+                            dt_value["warning"]
+                            + dt_filter[0]
+                            + "Int. Q for invalid ensembles in a transect exceeds"
+                            " " + "%3.1f" % self.q_total_threshold_warning + "%;",
+                            1,
+                            module_code,
+                        ]
+                    )
+                    status_switch = 2
+                elif boat["q_total_caution"][:, dt_filter[1]].any():
+                    if dt_key == "BT":
+                        module_code = 7
+                    else:
+                        module_code = 8
+                    boat["messages"].append(
+                        [
+                            dt_value["caution"]
+                            + dt_filter[0]
+                            + "Int. Q for invalid ensembles in a transect exceeds "
+                            "" + "%3.1f" % self.q_total_threshold_caution + "%;",
+                            2,
+                            module_code,
+                        ]
+                    )
+                    if status_switch < 1:
+                        status_switch = 1
+
+            # Create message for all data invalid
+            if boat["all_invalid"].any():
+                boat["status"] = "warning"
+                if dt_key == "BT":
+                    module_code = 7
+                else:
+                    module_code = 8
+                boat["messages"].append(
+                    [
+                        dt_value["warning"]
+                        + dt_value["filter"][0][0]
+                        + "There are no valid data for one or more transects.;",
+                        1,
+                        module_code,
+                    ]
+                )
+
+            # Set status
+            if status_switch == 2:
+                boat["status"] = "warning"
+            elif status_switch == 1:
+                boat["status"] = "caution"
+
+            setattr(self, dt_value["class"], boat)
+
+        lag_gga = []
+        lag_vtg = []
+        self.gga_vel["lag_status"] = "good"
+        self.vtg_vel["lag_status"] = "good"
+        for transect in meas.transects:
+            gga, vtg = TransectData.compute_gps_lag(transect)
+            if gga is not None:
+                lag_gga.append(gga)
+            if vtg is not None:
+                lag_vtg.append(vtg)
+        if len(lag_gga) > 0:
+            if np.mean(np.abs(lag_gga)) > 10:
+                self.gga_vel["messages"].append(
+                    ["GGA: BT and GGA do not appear to be sychronized", 1, 8]
+                )
+                if self.gga_vel["status"] != "warning":
+                    self.gga_vel["status"] = "warning"
+                    self.gga_vel["lag_status"] = "warning"
+            elif np.mean(np.abs(lag_gga)) > 2:
+                self.gga_vel["messages"].append(
+                    ["gga: Lag between BT and GGA > 2 sec", 2, 8]
+                )
+                if self.gga_vel["status"] != "warning":
+                    self.gga_vel["status"] = "caution"
+                    self.gga_vel["lag_status"] = "caution"
+        if len(lag_vtg) > 0:
+            if np.mean(np.abs(lag_vtg)) > 10:
+                self.vtg_vel["messages"].append(
+                    ["VTG: BT and VTG do not appear to be sychronized", 1, 8]
+                )
+                if self.vtg_vel["status"] != "warning":
+                    self.vtg_vel["status"] = "warning"
+                    self.vtg_vel["lag status"] = "warning"
+            elif np.mean(np.abs(lag_vtg)) > 2:
+                self.vtg_vel["messages"].append(
+                    ["vtg: Lag between BT and VTG > 2 sec", 2, 8]
+                )
+                if self.vtg_vel["status"] != "warning":
+                    self.vtg_vel["status"] = "caution"
+                    self.vtg_vel["lag_status"] = "caution"
+
+    def boat_qa(self, meas):
+        """Apply quality checks to boat data.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # Initialize variables
+        n_transects = len(meas.transects)
+        data_type = {
+            "BT": {
+                "class": "bt_vel",
+                "warning": "BT-",
+                "caution": "bt-",
+                "filter": [
+                    ("All: ", 0),
+                    ("Original: ", 1),
+                    ("ErrorVel: ", 2),
+                    ("VertVel: ", 3),
+                    ("Other: ", 4),
+                    ("3Beams: ", 5),
+                ],
+            },
+            "GGA": {
+                "class": "gga_vel",
+                "warning": "GGA-",
+                "caution": "gga-",
+                "filter": [
+                    ("All: ", 0),
+                    ("Original: ", 1),
+                    ("DGPS: ", 2),
+                    ("Altitude: ", 3),
+                    ("Other: ", 4),
+                    ("HDOP: ", 5),
+                ],
+            },
+            "VTG": {
+                "class": "vtg_vel",
+                "warning": "VTG-",
+                "caution": "vtg-",
+                "filter": [
+                    ("All: ", 0),
+                    ("Original: ", 1),
+                    ("Other: ", 4),
+                    ("HDOP: ", 5),
+                ],
+            },
+        }
+        self.boat["messages"] = []
+
+        for dt_key, dt_value in data_type.items():
+            boat = getattr(self, dt_value["class"])
+
+            # Initialize dictionaries for each data type
+            boat["q_total_caution"] = np.tile(False, (n_transects, 6))
+            boat["q_max_run_caution"] = np.tile(False, (n_transects, 6))
+            boat["q_total_warning"] = np.tile(False, (n_transects, 6))
+            boat["q_max_run_warning"] = np.tile(False, (n_transects, 6))
+            boat["all_invalid"] = np.tile(False, n_transects)
+            boat["q_total"] = np.tile(np.nan, (n_transects, 6))
+            boat["q_max_run"] = np.tile(np.nan, (n_transects, 6))
+            boat["messages"] = []
+            status_switch = 0
+            avg_speed_check = 0
+
+            # Check the results of each filter
+            for dt_filter in dt_value["filter"]:
+                boat["status"] = "inactive"
+
+                # Quality check each transect
+                for n, transect in enumerate(meas.transects):
+
+                    # Evaluate on transects used in the discharge computation
+                    if transect.checked:
+
+                        in_transect_idx = transect.in_transect_idx
+
+                        # Check to see if data are available for the data_type
+                        if getattr(transect.boat_vel, dt_value["class"]) is not None:
+                            boat["status"] = "good"
+
+                            # Compute quality characteristics
+                            valid = getattr(
+                                transect.boat_vel, dt_value["class"]
+                            ).valid_data[dt_filter[1], in_transect_idx]
+
+                            # Check if all invalid
+                            if dt_filter[1] == 0 and not np.any(valid):
+                                boat["all_invalid"][n] = True
+
+                            else:
+                                (
+                                    q_total,
+                                    q_max_run,
+                                    number_invalid_ens,
+                                ) = QAData.invalid_qa(valid, meas.discharge[n])
+                                boat["q_total"][n, dt_filter[1]] = q_total
+                                boat["q_max_run"][n, dt_filter[1]] = q_max_run
+
+                                # Compute percentage compared to total
+                                if meas.discharge[n].total == 0.0:
+                                    q_total_percent = np.nan
+                                    q_max_run_percent = np.nan
+                                else:
+                                    q_total_percent = np.abs(
+                                        (q_total / meas.discharge[n].total) * 100
+                                    )
+                                    q_max_run_percent = np.abs(
+                                        (q_max_run / meas.discharge[n].total) * 100
+                                    )
+
+                                # Apply total interpolated discharge threshold
+                                if q_total_percent > self.q_total_threshold_warning:
+                                    boat["q_total_warning"][n, dt_filter[1]] = True
+                                elif q_total_percent > self.q_total_threshold_caution:
+                                    boat["q_total_caution"][n, dt_filter[1]] = True
+
+                                # Apply interpolated discharge run thresholds
+                                if q_max_run_percent > self.q_run_threshold_warning:
+                                    boat["q_max_run_warning"][n, dt_filter[1]] = True
+                                elif q_max_run_percent > self.q_run_threshold_caution:
+                                    boat["q_max_run_caution"][n, dt_filter[1]] = True
+
+                                # Check boat velocity for vtg data
+                                if (
+                                    dt_key == "VTG"
+                                    and transect.boat_vel.selected == "vtg_vel"
+                                    and avg_speed_check == 0
+                                ):
+                                    if transect.boat_vel.vtg_vel.u_mps is not None:
+                                        avg_speed = np.nanmean(
+                                            (
+                                                transect.boat_vel.vtg_vel.u_mps**2
+                                                + transect.boat_vel.vtg_vel.v_mps**2
+                                            )
+                                            ** 0.5
+                                        )
+                                        if avg_speed < 0.24:
+                                            boat["q_total_caution"][n, 2] = True
+                                            if status_switch < 1:
+                                                status_switch = 1
+                                            boat["messages"].append(
+                                                [
+                                                    "vtg-AvgSpeed: VTG data may "
+                                                    "not be accurate for average "
+                                                    "boat speed "
+                                                    "less than" + "0.24 m/s (0.8 "
+                                                    "ft/s);",
+                                                    2,
+                                                    8,
+                                                ]
+                                            )
+                                            avg_speed_check = 1
+
+            # Create message for consecutive invalid discharge
+            if boat["q_max_run_warning"].any():
+                if dt_key == "BT":
+                    module_code = 7
+                else:
+                    module_code = 8
+                boat["messages"].append(
+                    [
+                        dt_value["warning"]
+                        + "Int. Q for consecutive invalid ensembles exceeds "
+                        + "%3.1f" % self.q_run_threshold_warning
+                        + "%;",
+                        1,
+                        module_code,
+                    ]
+                )
+                status_switch = 2
+            elif boat["q_total_warning"].any():
+                if dt_key == "BT":
+                    module_code = 7
+                else:
+                    module_code = 8
+                boat["messages"].append(
+                    [
+                        dt_value["warning"]
+                        + "Int. Q for invalid ensembles in a transect exceeds"
+                        " " + "%3.1f" % self.q_total_threshold_warning + "%;",
+                        1,
+                        module_code,
+                    ]
+                )
+                status_switch = 2
+            elif boat["q_max_run_caution"].any():
+                if dt_key == "BT":
+                    module_code = 7
+                else:
+                    module_code = 8
+                boat["messages"].append(
+                    [
+                        dt_value["caution"]
+                        + "Int. Q for consecutive invalid ensembles exceeds "
+                        + "%3.1f" % self.q_run_threshold_caution
+                        + "%;",
+                        2,
+                        module_code,
+                    ]
+                )
+                if status_switch < 1:
+                    status_switch = 1
+
+            elif boat["q_total_caution"].any():
+                if dt_key == "BT":
+                    module_code = 7
+                else:
+                    module_code = 8
+                boat["messages"].append(
+                    [
+                        dt_value["caution"]
+                        + "Int. Q for invalid ensembles in a transect exceeds "
+                        "" + "%3.1f" % self.q_total_threshold_caution + "%;",
+                        2,
+                        module_code,
+                    ]
+                )
+                if status_switch < 1:
+                    status_switch = 1
+
+            # Create message for all data invalid
+            if boat["all_invalid"].any():
+                boat["status"] = "warning"
+                if dt_key == "BT":
+                    module_code = 7
+                else:
+                    module_code = 8
+                boat["messages"].append(
+                    [
+                        dt_value["warning"]
+                        + dt_value["filter"][0][0]
+                        + "There are no valid data for one or more transects.;",
+                        1,
+                        module_code,
+                    ]
+                )
+
+            # Set status
+            if status_switch == 2:
+                boat["status"] = "warning"
+            elif status_switch == 1:
+                boat["status"] = "caution"
+
+            setattr(self, dt_value["class"], boat)
+
+        lag_gga = []
+        lag_vtg = []
+        self.gga_vel["lag_status"] = "good"
+        self.vtg_vel["lag_status"] = "good"
+        for transect in meas.transects:
+            gga, vtg = TransectData.compute_gps_lag(transect)
+            if gga is not None:
+                lag_gga.append(gga)
+            if vtg is not None:
+                lag_vtg.append(vtg)
+        if len(lag_gga) > 0:
+            if np.mean(np.abs(lag_gga)) > 10:
+                self.gga_vel["messages"].append(
+                    ["GGA: BT and GGA do not appear to be sychronized", 1, 8]
+                )
+                if self.gga_vel["status"] != "warning":
+                    self.gga_vel["status"] = "warning"
+                    self.gga_vel["lag_status"] = "warning"
+            elif np.mean(np.abs(lag_gga)) > 2:
+                self.gga_vel["messages"].append(
+                    ["gga: Lag between BT and GGA > 2 sec", 2, 8]
+                )
+                if self.gga_vel["status"] != "warning":
+                    self.gga_vel["status"] = "caution"
+                    self.gga_vel["lag_status"] = "caution"
+        if len(lag_vtg) > 0:
+            if np.mean(np.abs(lag_vtg)) > 10:
+                self.vtg_vel["messages"].append(
+                    ["VTG: BT and VTG do not appear to be sychronized", 1, 8]
+                )
+                if self.vtg_vel["status"] != "warning":
+                    self.vtg_vel["status"] = "warning"
+                    self.vtg_vel["lag status"] = "warning"
+            elif np.mean(np.abs(lag_vtg)) > 2:
+                self.vtg_vel["messages"].append(
+                    ["vtg: Lag between BT and VTG > 2 sec", 2, 8]
+                )
+                if self.vtg_vel["status"] != "warning":
+                    self.vtg_vel["status"] = "caution"
+                    self.vtg_vel["lag_status"] = "caution"
+
+    def water_qa(self, meas):
+        """Apply quality checks to water data.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # Initialize filter labels and indices
+        if meas.transects[0].adcp.manufacturer == "TRDI":
+            filter_index = [0, 1, 2, 3, 4, 5]
+        else:
+            filter_index = [0, 1, 2, 3, 4, 5, 7]
+
+        n_transects = len(meas.transects)
+        n_filters = len(filter_index) + 1
+        # Initialize dictionaries for each data type
+        self.w_vel["q_total_caution"] = np.tile(False, (n_transects, n_filters))
+        self.w_vel["q_max_run_caution"] = np.tile(False, (n_transects, n_filters))
+        self.w_vel["q_total_warning"] = np.tile(False, (n_transects, n_filters))
+        self.w_vel["q_max_run_warning"] = np.tile(False, (n_transects, n_filters))
+        self.w_vel["all_invalid"] = np.tile(False, n_transects)
+        self.w_vel["q_total"] = np.tile(np.nan, (n_transects, n_filters))
+        self.w_vel["q_max_run"] = np.tile(np.nan, (n_transects, n_filters))
+        self.w_vel["messages"] = []
+        status_switch = 0
+
+        # TODO if meas had a property checked as list it would save creating
+        #  that list multiple times
+        checked = []
+        for transect in meas.transects:
+            checked.append(transect.checked)
+
+        # At least one transect is being used to compute discharge
+        if any(checked):
+            # Loop through filters
+            for prefix_idx, filter_idx in enumerate(filter_index):
+                # Loop through transects
+                for n, transect in enumerate(meas.transects):
+                    if transect.checked:
+                        valid_original = np.any(
+                            transect.w_vel.valid_data[1, :, transect.in_transect_idx].T,
+                            0,
+                        )
+
+                        # Determine what data each filter have marked
+                        # invalid. Original invalid data are excluded
+                        valid = np.any(
+                            transect.w_vel.valid_data[
+                                filter_idx, :, transect.in_transect_idx
+                            ].T,
+                            0,
+                        )
+                        if filter_idx > 1:
+                            valid_int = valid.astype(int) - valid_original.astype(int)
+                            valid = valid_int != -1
+
+                        # Check if all data are invalid
+                        if filter_idx == 0:
+                            if np.nansum(valid.astype(int)) < 1:
+                                self.w_vel["all_invalid"][n] = True
+                        # TODO seems like the rest of this should be under
+                        #  else of all invalid or multiple messages generated.
+
+                        # Compute characteristics
+                        q_total, q_max_run, number_invalid_ens = QAData.invalid_qa(
+                            valid, meas.discharge[n]
+                        )
+                        self.w_vel["q_total"][n, filter_idx] = q_total
+                        self.w_vel["q_max_run"][n, filter_idx] = q_max_run
+
+                        # Compute percentage compared to total
+                        if meas.discharge[n].total == 0.0:
+                            q_total_percent = np.nan
+                            q_max_run_percent = np.nan
+                        else:
+                            q_total_percent = np.abs(
+                                (q_total / meas.discharge[n].total) * 100
+                            )
+                            q_max_run_percent = np.abs(
+                                (q_max_run / meas.discharge[n].total) * 100
+                            )
+
+                        # Check total invalid discharge in ensembles for
+                        # warning
+                        if q_total_percent > self.q_total_threshold_warning:
+                            self.w_vel["q_total_warning"][n, filter_idx] = True
+
+                        # Apply run or cluster thresholds
+                        if q_max_run_percent > self.q_run_threshold_warning:
+                            self.w_vel["q_max_run_warning"][n, filter_idx] = True
+                        elif q_max_run_percent > self.q_run_threshold_caution:
+                            self.w_vel["q_max_run_caution"][n, filter_idx] = True
+
+                        # Compute percent discharge interpolated for both
+                        # cells and ensembles
+                        # This approach doesn't exclude original data
+                        valid_cells = transect.w_vel.valid_data[
+                            filter_idx, :, transect.in_transect_idx
+                        ].T
+                        q_invalid_total = (
+                            np.nansum(
+                                meas.discharge[n].middle_cells[
+                                    np.logical_not(valid_cells)
+                                ]
+                            )
+                            + np.nansum(
+                                meas.discharge[n].top_ens[np.logical_not(valid)]
+                            )
+                            + np.nansum(
+                                meas.discharge[n].bottom_ens[np.logical_not(valid)]
+                            )
+                        )
+                        q_invalid_total_percent = (
+                            q_invalid_total / meas.discharge[n].total
+                        ) * 100
+
+                        if q_invalid_total_percent > self.q_total_threshold_caution:
+                            self.w_vel["q_total_caution"][n, filter_idx] = True
+
+            # Generate messages for ensemble run or clusters
+            if np.any(self.w_vel["q_max_run_warning"]):
+                self.w_vel["messages"].append(
+                    [
+                        "WT-" + "Int. Q for consecutive "
+                        "invalid ensembles "
+                        "exceeds " + "%3.0f" % self.q_run_threshold_warning + "%;",
+                        1,
+                        11,
+                    ]
+                )
+                status_switch = 2
+
+            elif np.any(self.w_vel["q_total_warning"]):
+                self.w_vel["messages"].append(
+                    [
+                        "WT-" + "Int. Q for invalid "
+                        "cells and ensembles in "
+                        "a transect exceeds "
+                        + "%3.0f" % self.q_total_threshold_warning
+                        + "%;",
+                        1,
+                        11,
+                    ]
+                )
+                status_switch = 2
+
+            elif np.any(self.w_vel["q_max_run_caution"]):
+                self.w_vel["messages"].append(
+                    [
+                        "wt-" + "Int. Q for consecutive "
+                        "invalid ensembles "
+                        "exceeds " + "%3.0f" % self.q_run_threshold_caution + "%;",
+                        2,
+                        11,
+                    ]
+                )
+                if status_switch < 1:
+                    status_switch = 1
+
+            elif np.any(self.w_vel["q_total_caution"]):
+                self.w_vel["messages"].append(
+                    [
+                        "wt-" + "Int. Q for invalid "
+                        "cells and ensembles in "
+                        "a transect exceeds "
+                        + "%3.0f" % self.q_total_threshold_caution
+                        + "%;",
+                        2,
+                        11,
+                    ]
+                )
+                if status_switch < 1:
+                    status_switch = 1
+
+            # Generate message for all invalid
+            if np.any(self.w_vel["all_invalid"]):
+                self.w_vel["messages"].append(
+                    [
+                        "WT-" + "There are no valid data for one or more transects.",
+                        1,
+                        11,
+                    ]
+                )
+                status_switch = 2
+
+            # Set status
+            self.w_vel["status"] = "good"
+            if status_switch == 2:
+                self.w_vel["status"] = "warning"
+            elif status_switch == 1:
+                self.w_vel["status"] = "caution"
+        else:
+            self.w_vel["status"] = "inactive"
+
+    def extrapolation_qa(self, meas):
+        """Apply quality checks to extrapolation methods
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.extrapolation["messages"] = []
+
+        checked = []
+        discharges = []
+        for n, transect in enumerate(meas.transects):
+            checked.append(transect.checked)
+            if transect.checked:
+                discharges.append(meas.discharge[n])
+
+        if any(checked):
+            self.extrapolation["status"] = "good"
+            extrap_uncertainty = Uncertainty.uncertainty_extrapolation(meas, discharges)
+
+            if np.abs(extrap_uncertainty) > 2:
+                self.extrapolation["messages"].append(
+                    [
+                        "Extrapolation: "
+                        "The extrapolation "
+                        "uncertainty is "
+                        "more than " + "2 percent;",
+                        2,
+                        12,
+                    ]
+                )
+                self.extrapolation["messages"].append(
+                    ["    Carefully review the extrapolation;", 2, 12]
+                )
+                self.extrapolation["status"] = "caution"
+        else:
+            self.extrapolation["status"] = "inactive"
+
+    def edges_qa1(self, meas):
+        """Apply quality checks to edge estimates
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # Initialize variables
+        self.edges["messages"] = []
+        checked = []
+        left_q = []
+        right_q = []
+        total_q = []
+        edge_dist_left = []
+        edge_dist_right = []
+        dist_moved_left = []
+        dist_moved_right = []
+        dist_made_good = []
+        left_type = []
+        right_type = []
+        transect_idx = []
+
+        for n, transect in enumerate(meas.transects):
+            checked.append(transect.checked)
+
+            if transect.checked:
+                left_q.append(meas.discharge[n].left)
+                right_q.append(meas.discharge[n].right)
+                total_q.append(meas.discharge[n].total)
+                dmr, dml, dmg = QAData.edge_distance_moved(transect)
+                dist_moved_right.append(dmr)
+                dist_moved_left.append(dml)
+                dist_made_good.append(dmg)
+                edge_dist_left.append(transect.edges.left.distance_m)
+                edge_dist_right.append(transect.edges.right.distance_m)
+                left_type.append(transect.edges.left.type)
+                right_type.append(transect.edges.right.type)
+                transect_idx.append(n)
+
+        if any(checked):
+            # Set default status to good
+            self.edges["status"] = "good"
+
+            mean_total_q = np.nanmean(total_q)
+
+            # Check left edge q > 5%
+            self.edges["left_q"] = 0
+
+            left_q_percent = (np.nanmean(left_q) / mean_total_q) * 100
+            temp_idx = np.where(left_q / mean_total_q > 0.05)[0]
+            if len(temp_idx) > 0:
+                self.edges["left_q_idx"] = np.array(transect_idx)[temp_idx]
+            else:
+                self.edges["left_q_idx"] = []
+            if np.abs(left_q_percent) > 5:
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    ["Edges: Left edge Q is greater than 5%;", 1, 13]
+                )
+                self.edges["left_q"] = 1
+            elif len(self.edges["left_q_idx"]) > 0:
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    [
+                        "Edges: One or more transects have a left edge Q "
+                        "greater than 5%;",
+                        1,
+                        13,
+                    ]
+                )
+                self.edges["left_q"] = 1
+
+            # Check right edge q > 5%
+            self.edges["right_q"] = 0
+            right_q_percent = (np.nanmean(right_q) / mean_total_q) * 100
+            temp_idx = np.where(right_q / mean_total_q > 0.05)[0]
+            if len(temp_idx) > 0:
+                self.edges["right_q_idx"] = np.array(transect_idx)[temp_idx]
+            else:
+                self.edges["right_q_idx"] = []
+            if np.abs(right_q_percent) > 5:
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    ["Edges: Right edge Q is greater than 5%;", 1, 13]
+                )
+                self.edges["right_q"] = 1
+            elif len(self.edges["right_q_idx"]) > 0:
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    [
+                        "Edges: One or more transects have a right edge Q "
+                        "greater than 5%;",
+                        1,
+                        13,
+                    ]
+                )
+                self.edges["right_q"] = 1
+
+            # Check for consistent sign
+            q_positive = []
+            self.edges["left_sign"] = 0
+            for q in left_q:
+                if q >= 0:
+                    q_positive.append(True)
+                else:
+                    q_positive.append(False)
+            if len(np.unique(q_positive)) > 1 and left_q_percent > 0.5:
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    ["Edges: Sign of left edge Q is not consistent;", 2, 13]
+                )
+                self.edges["left_sign"] = 1
+
+            q_positive = []
+            self.edges["right_sign"] = 0
+            for q in right_q:
+                if q >= 0:
+                    q_positive.append(True)
+                else:
+                    q_positive.append(False)
+            if len(np.unique(q_positive)) > 1 and right_q_percent > 0.5:
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    ["Edges: Sign of right edge Q is not consistent;", 2, 13]
+                )
+                self.edges["right_sign"] = 1
+
+            # Check distance moved
+            dmg_5_percent = 0.05 * np.nanmean(dist_made_good)
+            avg_right_edge_dist = np.nanmean(edge_dist_right)
+            right_threshold = np.nanmin([dmg_5_percent, avg_right_edge_dist])
+            temp_idx = np.where(dist_moved_right > right_threshold)[0]
+            if len(temp_idx) > 0:
+                self.edges["right_dist_moved_idx"] = np.array(transect_idx)[temp_idx]
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    ["Edges: Excessive boat movement in right edge ensembles;", 2, 13]
+                )
+            else:
+                self.edges["right_dist_moved_idx"] = []
+
+            avg_left_edge_dist = np.nanmean(edge_dist_left)
+            left_threshold = np.nanmin([dmg_5_percent, avg_left_edge_dist])
+            temp_idx = np.where(dist_moved_left > left_threshold)[0]
+            if len(temp_idx) > 0:
+                self.edges["left_dist_moved_idx"] = np.array(transect_idx)[temp_idx]
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    ["Edges: Excessive boat movement in left edge ensembles;", 2, 13]
+                )
+            else:
+                self.edges["left_dist_moved_idx"] = []
+
+            # Check for edge ensembles marked invalid due to excluded distance
+            self.edges["invalid_transect_left_idx"] = []
+            self.edges["invalid_transect_right_idx"] = []
+            for n, transect in enumerate(meas.transects):
+                if transect.checked:
+                    ens_invalid = np.nansum(transect.w_vel.valid_data[0, :, :], 0) > 0
+                    ens_cells_above_sl = np.nansum(transect.w_vel.cells_above_sl, 0) > 0
+                    ens_invalid = np.logical_not(
+                        np.logical_and(ens_invalid, ens_cells_above_sl)
+                    )
+                    if np.any(ens_invalid):
+                        if transect.start_edge == "Left":
+                            invalid_left = ens_invalid[
+                                0 : int(transect.edges.left.number_ensembles)
+                            ]
+                            invalid_right = ens_invalid[
+                                -int(transect.edges.right.number_ensembles) :
+                            ]
+                        else:
+                            invalid_right = ens_invalid[
+                                0 : int(transect.edges.right.number_ensembles)
+                            ]
+                            invalid_left = ens_invalid[
+                                -int(transect.edges.left.number_ensembles) :
+                            ]
+                        if len(invalid_left) > 0:
+                            left_invalid_percent = sum(invalid_left) / len(invalid_left)
+                        else:
+                            left_invalid_percent = 0
+                        if len(invalid_right) > 0:
+                            right_invalid_percent = sum(invalid_right) / len(
+                                invalid_right
+                            )
+                        else:
+                            right_invalid_percent = 0
+                        max_invalid_percent = (
+                            max([left_invalid_percent, right_invalid_percent]) * 100
+                        )
+                        if max_invalid_percent > 25:
+                            self.edges["status"] = "caution"
+                            if np.any(invalid_left):
+                                self.edges["invalid_transect_left_idx"].append(n)
+                            if np.any(invalid_right):
+                                self.edges["invalid_transect_right_idx"].append(n)
+
+            if (
+                len(self.edges["invalid_transect_left_idx"]) > 0
+                or len(self.edges["invalid_transect_right_idx"]) > 0
+            ):
+                self.edges["messages"].append(
+                    [
+                        "Edges: The percent of invalid ensembles exceeds 25% in"
+                        + " one or more transects.",
+                        2,
+                        13,
+                    ]
+                )
+
+            # Check edges for zero discharge
+            self.edges["left_zero"] = 0
+            temp_idx = np.where(np.round(left_q, 4) == 0)[0]
+            if len(temp_idx) > 0:
+                self.edges["left_zero_idx"] = np.array(transect_idx)[temp_idx]
+                self.edges["status"] = "warning"
+                self.edges["messages"].append(["EDGES: Left edge has zero Q;", 1, 13])
+                self.edges["left_zero"] = 2
+            else:
+                self.edges["left_zero_idx"] = []
+
+            self.edges["right_zero"] = 0
+            temp_idx = np.where(np.round(right_q, 4) == 0)[0]
+            if len(temp_idx) > 0:
+                self.edges["right_zero_idx"] = np.array(transect_idx)[temp_idx]
+                self.edges["status"] = "warning"
+                self.edges["messages"].append(["EDGES: Right edge has zero Q;", 1, 13])
+                self.edges["right_zero"] = 2
+            else:
+                self.edges["right_zero_idx"] = []
+
+            # Check consistent edge type
+            self.edges["left_type"] = 0
+            if len(np.unique(left_type)) > 1:
+                self.edges["status"] = "warning"
+                self.edges["messages"].append(
+                    ["EDGES: Left edge type is not consistent;", 1, 13]
+                )
+                self.edges["left_type"] = 2
+
+            self.edges["right_type"] = 0
+            if len(np.unique(right_type)) > 1:
+                self.edges["status"] = "warning"
+                self.edges["messages"].append(
+                    ["EDGES: Right edge type is not consistent;", 1, 13]
+                )
+                self.edges["right_type"] = 2
+        else:
+            self.edges["status"] = "inactive"
+
+    def edges_qa(self, meas):
+        """Apply quality checks to edge estimates
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # Initialize variables
+        self.edges["messages"] = []
+        checked = []
+        left_q = []
+        right_q = []
+        total_q = []
+        edge_dist_left = []
+        edge_dist_right = []
+        dist_moved_left = []
+        dist_moved_right = []
+        dist_made_good = []
+        left_type = []
+        right_type = []
+        transect_idx = []
+
+        for n, transect in enumerate(meas.transects):
+            checked.append(transect.checked)
+
+            if transect.checked:
+                left_q.append(meas.discharge[n].left)
+                right_q.append(meas.discharge[n].right)
+                total_q.append(meas.discharge[n].total)
+                dmr, dml, dmg = QAData.edge_distance_moved(transect)
+                dist_moved_right.append(dmr)
+                dist_moved_left.append(dml)
+                dist_made_good.append(dmg)
+                edge_dist_left.append(transect.edges.left.distance_m)
+                edge_dist_right.append(transect.edges.right.distance_m)
+                left_type.append(transect.edges.left.type)
+                right_type.append(transect.edges.right.type)
+                transect_idx.append(n)
+
+        if any(checked):
+            # Set default status to good
+            self.edges["status"] = "good"
+
+            mean_total_q = np.nanmean(total_q)
+
+            # Check left edge q > 5%
+            self.edges["left_q"] = 0
+
+            left_q_percent = (np.nanmean(left_q) / mean_total_q) * 100
+            temp_idx = np.where(left_q / mean_total_q > 0.05)[0]
+
+            if len(temp_idx) > 0:
+                self.edges["left_q_idx"] = np.array(transect_idx)[temp_idx]
+            else:
+                self.edges["left_q_idx"] = []
+
+            if np.abs(left_q_percent) > 5:
+                self.edges["left_q"] = 1
+            elif len(self.edges["left_q_idx"]) > 0:
+                self.edges["left_q"] = 1
+
+            # Check right edge q > 5%
+            self.edges["right_q"] = 0
+            right_q_percent = (np.nanmean(right_q) / mean_total_q) * 100
+            temp_idx = np.where(right_q / mean_total_q > 0.05)[0]
+            if len(temp_idx) > 0:
+                self.edges["right_q_idx"] = np.array(transect_idx)[temp_idx]
+            else:
+                self.edges["right_q_idx"] = []
+            if np.abs(right_q_percent) > 5:
+                self.edges["right_q"] = 1
+            elif len(self.edges["right_q_idx"]) > 0:
+                self.edges["right_q"] = 1
+
+            # Edge Q message
+            if np.abs(right_q_percent) > 5 or np.abs(left_q_percent) > 5:
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    ["Edges: Edge Q is greater than 5%;", 1, 13]
+                )
+            elif (
+                len(self.edges["right_q_idx"]) > 0 or len(self.edges["left_q_idx"]) > 0
+            ):
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    [
+                        "Edges: One or more transects have an edge edge Q "
+                        "greater than 5%;",
+                        1,
+                        13,
+                    ]
+                )
+
+            # Check for consistent sign
+            q_positive = []
+            self.edges["left_sign"] = 0
+            for q in left_q:
+                if q >= 0:
+                    q_positive.append(True)
+                else:
+                    q_positive.append(False)
+            if len(np.unique(q_positive)) > 1 and left_q_percent > 0.5:
+                self.edges["left_sign"] = 1
+
+            q_positive = []
+            self.edges["right_sign"] = 0
+            for q in right_q:
+                if q >= 0:
+                    q_positive.append(True)
+                else:
+                    q_positive.append(False)
+            if len(np.unique(q_positive)) > 1 and right_q_percent > 0.5:
+                self.edges["right_sign"] = 1
+
+            if self.edges["right_sign"] or self.edges["left_sign"]:
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    ["Edges: Sign of edge Q is not consistent;", 2, 13]
+                )
+
+            # Check distance moved
+            dmg_5_percent = 0.05 * np.nanmean(dist_made_good)
+            avg_right_edge_dist = np.nanmean(edge_dist_right)
+            right_threshold = np.nanmin([dmg_5_percent, avg_right_edge_dist])
+            temp_idx = np.where(dist_moved_right > right_threshold)[0]
+            if len(temp_idx) > 0:
+                self.edges["right_dist_moved_idx"] = np.array(transect_idx)[temp_idx]
+            else:
+                self.edges["right_dist_moved_idx"] = []
+
+            avg_left_edge_dist = np.nanmean(edge_dist_left)
+            left_threshold = np.nanmin([dmg_5_percent, avg_left_edge_dist])
+            temp_idx = np.where(dist_moved_left > left_threshold)[0]
+            if len(temp_idx) > 0:
+                self.edges["left_dist_moved_idx"] = np.array(transect_idx)[temp_idx]
+            else:
+                self.edges["left_dist_moved_idx"] = []
+
+            # Excessive movement message
+            if (
+                len(self.edges["right_dist_moved_idx"]) > 0
+                or len(self.edges["left_dist_moved_idx"]) > 0
+            ):
+                self.edges["status"] = "caution"
+                self.edges["messages"].append(
+                    ["Edges: Excessive boat movement in edge ensembles;", 2, 13]
+                )
+
+            # Check for edge ensembles marked invalid due to excluded distance
+            self.edges["invalid_transect_left_idx"] = []
+            self.edges["invalid_transect_right_idx"] = []
+            for n, transect in enumerate(meas.transects):
+                if transect.checked:
+                    ens_invalid = np.nansum(transect.w_vel.valid_data[0, :, :], 0) > 0
+                    ens_cells_above_sl = np.nansum(transect.w_vel.cells_above_sl, 0) > 0
+                    ens_invalid = np.logical_not(
+                        np.logical_and(ens_invalid, ens_cells_above_sl)
+                    )
+                    if np.any(ens_invalid):
+                        if transect.start_edge == "Left":
+                            invalid_left = ens_invalid[
+                                0 : int(transect.edges.left.number_ensembles)
+                            ]
+                            invalid_right = ens_invalid[
+                                -int(transect.edges.right.number_ensembles) :
+                            ]
+                        else:
+                            invalid_right = ens_invalid[
+                                0 : int(transect.edges.right.number_ensembles)
+                            ]
+                            invalid_left = ens_invalid[
+                                -int(transect.edges.left.number_ensembles) :
+                            ]
+                        if len(invalid_left) > 0:
+                            left_invalid_percent = sum(invalid_left) / len(invalid_left)
+                        else:
+                            left_invalid_percent = 0
+                        if len(invalid_right) > 0:
+                            right_invalid_percent = sum(invalid_right) / len(
+                                invalid_right
+                            )
+                        else:
+                            right_invalid_percent = 0
+                        max_invalid_percent = (
+                            max([left_invalid_percent, right_invalid_percent]) * 100
+                        )
+                        if max_invalid_percent > 25:
+                            self.edges["status"] = "caution"
+                            if np.any(invalid_left):
+                                self.edges["invalid_transect_left_idx"].append(n)
+                            if np.any(invalid_right):
+                                self.edges["invalid_transect_right_idx"].append(n)
+
+            if (
+                len(self.edges["invalid_transect_left_idx"]) > 0
+                or len(self.edges["invalid_transect_right_idx"]) > 0
+            ):
+                self.edges["messages"].append(
+                    [
+                        "Edges: The percent of invalid ensembles exceeds 25% in"
+                        + " one or more transects.",
+                        2,
+                        13,
+                    ]
+                )
+
+            # Check edges for zero discharge
+            self.edges["left_zero"] = 0
+            temp_idx = np.where(np.round(left_q, 4) == 0)[0]
+            if len(temp_idx) > 0:
+                self.edges["left_zero_idx"] = np.array(transect_idx)[temp_idx]
+                self.edges["left_zero"] = 2
+            else:
+                self.edges["left_zero_idx"] = []
+
+            self.edges["right_zero"] = 0
+            temp_idx = np.where(np.round(right_q, 4) == 0)[0]
+            if len(temp_idx) > 0:
+                self.edges["right_zero_idx"] = np.array(transect_idx)[temp_idx]
+                self.edges["right_zero"] = 2
+            else:
+                self.edges["right_zero_idx"] = []
+
+            # Zero Q Message
+            if self.edges["right_zero"] == 2 or self.edges["left_zero"] == 2:
+                self.edges["status"] = "warning"
+                self.edges["messages"].append(["EDGES: Edge has zero Q;", 1, 13])
+
+            # Check consistent edge type
+            self.edges["left_type"] = 0
+            if len(np.unique(left_type)) > 1:
+                self.edges["left_type"] = 2
+
+            self.edges["right_type"] = 0
+            if len(np.unique(right_type)) > 1:
+                self.edges["right_type"] = 2
+
+            # Inconsistent type message
+            if self.edges["right_type"] == 2 or self.edges["left_type"] == 2:
+                self.edges["status"] = "warning"
+                self.edges["messages"].append(
+                    ["EDGES: An edge has an inconsistent edge type;", 1, 13]
+                )
+
+        else:
+            self.edges["status"] = "inactive"
+
+    @staticmethod
+    def invalid_qa(valid, discharge):
+        """Computes the total invalid discharge in ensembles that have
+        invalid data. The function also computes the maximum run or cluster
+        of ensembles with the maximum interpolated discharge.
+
+        Parameters
+        ----------
+        valid: np.array(bool)
+            Array identifying valid and invalid ensembles.
+        discharge: QComp
+            Object of class QComp
+
+        Returns
+        -------
+        q_invalid_total: float
+            Total interpolated discharge in invalid ensembles
+        q_invalid_max_run: float
+            Maximum interpolated discharge in a run or cluster of invalid
+            ensembles
+        ens_invalid: int
+            Total number of invalid ensembles
+        """
+
+        # Create bool for invalid data
+        invalid = np.logical_not(valid)
+        q_invalid_total = (
+            np.nansum(discharge.middle_ens[invalid])
+            + np.nansum(discharge.top_ens[invalid])
+            + np.nansum(discharge.bottom_ens[invalid])
+        )
+
+        # Compute total number of invalid ensembles
+        ens_invalid = np.sum(invalid)
+
+        # Compute the indices of where changes occur
+        valid_int = np.insert(valid.astype(int), 0, -1)
+        valid_int = np.append(valid_int, -1)
+        valid_run = np.where(np.diff(valid_int) != 0)[0]
+        run_length = np.diff(valid_run)
+        run_length0 = run_length[(valid[0] == 1) :: 2]
+
+        n_runs = len(run_length0)
+
+        if valid[0]:
+            n_start = 1
+        else:
+            n_start = 0
+
+        n_end = len(valid_run) - 1
+
+        if n_runs > 1:
+            m = 0
+            q_invalid_run = []
+            for n in range(n_start, n_end, 2):
+                m += 1
+                idx_start = valid_run[n]
+                idx_end = valid_run[n + 1]
+                q_invalid_run.append(
+                    np.nansum(discharge.middle_ens[idx_start:idx_end])
+                    + np.nansum(discharge.top_ens[idx_start:idx_end])
+                    + np.nansum(discharge.bottom_ens[idx_start:idx_end])
+                )
+
+            # Determine the maximum discharge in a single run
+            q_invalid_max_run = np.nanmax(np.abs(q_invalid_run))
+
+        else:
+            q_invalid_max_run = 0.0
+
+        return q_invalid_total, q_invalid_max_run, ens_invalid
+
+    @staticmethod
+    def edge_distance_moved(transect):
+        """Computes the boat movement during edge ensemble collection.
+
+        Parameters
+        ----------
+        transect: Transect
+            Object of class Transect
+
+        Returns
+        -------
+        right_dist_moved: float
+            Distance in m moved during collection of right edge samples
+        left_dist_moved: float
+            Distance in m moved during collection of left edge samples
+        dmg: float
+            Distance made good for the entire transect
+        """
+
+        boat_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
+        ens_duration = transect.date_time.ens_duration_sec
+
+        # Get boat velocities
+        if boat_selected is not None:
+            u_processed = boat_selected.u_processed_mps
+            v_processed = boat_selected.v_processed_mps
+        else:
+            u_processed = np.tile(
+                np.nan, transect.boat_vel.bt_vel.u_processed_mps.shape
+            )
+            v_processed = np.tile(
+                np.nan, transect.boat_vel.bt_vel.v_processed_mps.shape
+            )
+
+        # Compute boat coordinates
+        x_processed = np.nancumsum(u_processed * ens_duration)
+        y_processed = np.nancumsum(v_processed * ens_duration)
+        dmg = (x_processed[-1] ** 2 + y_processed[-1] ** 2) ** 0.5
+
+        # Compute left distance moved
+        # TODO should be a dist moved function
+        left_edge_idx = QComp.edge_ensembles("left", transect)
+        if len(left_edge_idx) > 0:
+            boat_x = x_processed[left_edge_idx[-1]] - x_processed[left_edge_idx[0]]
+            boat_y = y_processed[left_edge_idx[-1]] - y_processed[left_edge_idx[0]]
+            left_dist_moved = (boat_x**2 + boat_y**2) ** 0.5
+        else:
+            left_dist_moved = np.nan
+
+        # Compute right distance moved
+        right_edge_idx = QComp.edge_ensembles("right", transect)
+        if len(right_edge_idx) > 0:
+            boat_x = x_processed[right_edge_idx[-1]] - x_processed[right_edge_idx[0]]
+            boat_y = y_processed[right_edge_idx[-1]] - y_processed[right_edge_idx[0]]
+            right_dist_moved = (boat_x**2 + boat_y**2) ** 0.5
+        else:
+            right_dist_moved = np.nan
+
+        return right_dist_moved, left_dist_moved, dmg
+
+    # check for user changes
+    def check_bt_setting(self, meas):
+        """Checks the bt settings to see if they are still on the default
+        settings.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.settings_dict["tab_bt"] = "Default"
+
+        s = meas.current_settings()
+        d = meas.qrev_default_settings()
+
+        if s["BTbeamFilter"] != d["BTbeamFilter"]:
+            self.bt_vel["messages"].append(
+                ["BT: User modified default beam setting.", 3, 8]
+            )
+            self.settings_dict["tab_bt"] = "Custom"
+
+        if s["BTdFilter"] != d["BTdFilter"]:
+            self.bt_vel["messages"].append(
+                ["BT: User modified default error velocity filter.", 3, 8]
+            )
+            self.settings_dict["tab_bt"] = "Custom"
+
+        if s["BTwFilter"] != d["BTwFilter"]:
+            self.bt_vel["messages"].append(
+                ["BT: User modified default vertical velocity filter.", 3, 8]
+            )
+            self.settings_dict["tab_bt"] = "Custom"
+
+        if s["BTsmoothFilter"] != d["BTsmoothFilter"]:
+            self.bt_vel["messages"].append(
+                ["BT: User modified default smooth filter.", 3, 8]
+            )
+            self.settings_dict["tab_bt"] = "Custom"
+
+    def check_wt_settings(self, meas):
+        """Checks the wt settings to see if they are still on the default
+        settings.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.settings_dict["tab_wt"] = "Default"
+
+        s = meas.current_settings()
+        d = meas.qrev_default_settings()
+
+        if round(s["WTExcludedDistance"], 2) != round(d["WTExcludedDistance"], 2):
+            self.w_vel["messages"].append(
+                ["WT: User modified excluded distance.", 3, 11]
+            )
+            self.settings_dict["tab_wt"] = "Custom"
+
+        if s["WTbeamFilter"] != d["WTbeamFilter"]:
+            self.w_vel["messages"].append(
+                ["WT: User modified default beam setting.", 3, 11]
+            )
+            self.settings_dict["tab_wt"] = "Custom"
+
+        if s["WTdFilter"] != d["WTdFilter"]:
+            self.w_vel["messages"].append(
+                ["WT: User modified default error velocity filter.", 3, 11]
+            )
+            self.settings_dict["tab_wt"] = "Custom"
+
+        if s["WTwFilter"] != d["WTwFilter"]:
+            self.w_vel["messages"].append(
+                ["WT: User modified default vertical velocity filter.", 3, 11]
+            )
+            self.settings_dict["tab_wt"] = "Custom"
+
+        if s["WTsnrFilter"] != d["WTsnrFilter"]:
+            self.w_vel["messages"].append(
+                ["WT: User modified default SNR filter.", 3, 11]
+            )
+            self.settings_dict["tab_wt"] = "Custom"
+
+    def check_extrap_settings(self, meas):
+        """Checks the extrap to see if they are still on the default
+        settings.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.settings_dict["tab_extrap"] = "Default"
+
+        # Check fit parameters
+        if meas.extrap_fit.sel_fit[0].fit_method != "Automatic":
+            self.settings_dict["tab_extrap"] = "Custom"
+            self.extrapolation["messages"].append(
+                ["Extrapolation: User modified default automatic setting.", 3, 12]
+            )
+
+        # Check data parameters
+        if meas.extrap_fit.sel_fit[-1].data_type.lower() != "q":
+            self.settings_dict["tab_extrap"] = "Custom"
+            self.extrapolation["messages"].append(
+                ["Extrapolation: User modified data type ", 3, 12]
+            )
+
+        if meas.extrap_fit.threshold != 20:
+            self.settings_dict["tab_extrap"] = "Custom"
+            self.extrapolation["messages"].append(
+                ["Extrapolation: User modified default threshold.", 3, 12]
+            )
+
+        if meas.extrap_fit.subsection[0] != 0 or meas.extrap_fit.subsection[1] != 100:
+            self.settings_dict["tab_extrap"] = "Custom"
+            self.extrapolation["messages"].append(
+                ["Extrapolation: User modified subsectioning", 3, 12]
+            )
+
+    def check_tempsal_settings(self, meas):
+        """Checks the temp and salinity settings to see if they are still on
+        the default settings.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.settings_dict["tab_tempsal"] = "Default"
+
+        t_source_change = False
+        salinity_change = False
+        s_sound_change = False
+        t_user_change = False
+        t_adcp_change = False
+
+        if not all(
+            np.isnan([meas.ext_temp_chk["user"], meas.ext_temp_chk["user_orig"]])
+        ):
+            if meas.ext_temp_chk["user"] != meas.ext_temp_chk["user_orig"]:
+                t_user_change = True
+
+        if not all(
+            np.isnan([meas.ext_temp_chk["adcp"], meas.ext_temp_chk["adcp_orig"]])
+        ):
+            if meas.ext_temp_chk["adcp"] != meas.ext_temp_chk["adcp_orig"]:
+                t_adcp_change = True
+
+        # Check each checked transect
+        for idx in meas.checked_transect_idx:
+            transect = meas.transects[idx]
+
+            # Temperature source
+            if transect.sensors.temperature_deg_c.selected != "internal":
+                t_source_change = True
+
+            if transect.sensors.salinity_ppt.selected != "internal":
+                sal = getattr(
+                    transect.sensors.salinity_ppt,
+                    transect.sensors.salinity_ppt.selected,
+                )
+                if transect.sensors.salinity_ppt.internal is not None:
+                    if np.all(
+                        np.equal(sal.data, transect.sensors.salinity_ppt.internal.data)
+                    ):
+                        salinity_change = False
+                    else:
+                        salinity_change = True
+
+            # Speed of Sound
+            if transect.sensors.speed_of_sound_mps.selected != "internal":
+                s_sound_change = True
+
+        # Report condition and messages
+        if any(
+            [
+                t_source_change,
+                salinity_change,
+                s_sound_change,
+                t_adcp_change,
+                t_user_change,
+            ]
+        ):
+            self.settings_dict["tab_tempsal"] = "Custom"
+
+            if t_source_change:
+                self.temperature["messages"].append(
+                    ["Temperature: User modified temperature source.", 3, 5]
+                )
+
+            if s_sound_change:
+                self.temperature["messages"].append(
+                    ["Temperature: User modified speed of sound source.", 3, 5]
+                )
+
+            if t_user_change:
+                self.temperature["messages"].append(
+                    ["Temperature: User modified independent temperature.", 3, 5]
+                )
+
+            if t_adcp_change:
+                self.temperature["messages"].append(
+                    ["Temperature: User modified ADCP temperature.", 3, 5]
+                )
+
+    def check_gps_settings(self, meas):
+        """Checks the gps settings to see if they are still on the default
+        settings.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        gps = False
+        self.settings_dict["tab_gps"] = "Default"
+
+        # Check for transects with gga or vtg data
+        for idx in meas.checked_transect_idx:
+            transect = meas.transects[idx]
+            if (
+                transect.boat_vel.gga_vel is not None
+                or transect.boat_vel.gga_vel is not None
+            ):
+                gps = True
+                break
+
+        # If gga or vtg data exist check settings
+        if gps:
+
+            s = meas.current_settings()
+            d = meas.qrev_default_settings()
+
+            if s["ggaDiffQualFilter"] != d["ggaDiffQualFilter"]:
+                self.gga_vel["messages"].append(
+                    ["GPS: User modified default quality setting.", 3, 8]
+                )
+                self.settings_dict["tab_gps"] = "Custom"
+
+            if s["ggaAltitudeFilter"] != d["ggaAltitudeFilter"]:
+                self.gga_vel["messages"].append(
+                    ["GPS: User modified default altitude filter.", 3, 8]
+                )
+                self.settings_dict["tab_gps"] = "Custom"
+
+            if s["GPSHDOPFilter"] != d["GPSHDOPFilter"]:
+                self.gga_vel["messages"].append(
+                    ["GPS: User modified default HDOP filter.", 3, 8]
+                )
+                self.settings_dict["tab_gps"] = "Custom"
+
+            if s["GPSSmoothFilter"] != d["GPSSmoothFilter"]:
+                self.gga_vel["messages"].append(
+                    ["GPS: User modified default smooth filter.", 3, 8]
+                )
+                self.settings_dict["tab_gps"] = "Custom"
+
+    def check_depth_settings(self, meas):
+        """Checks the depth settings to see if they are still on the default
+        settings.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.settings_dict["tab_depth"] = "Default"
+
+        s = meas.current_settings()
+        d = meas.qrev_default_settings()
+
+        if s["depthReference"] != d["depthReference"]:
+            self.depths["messages"].append(
+                ["Depths: User modified " "depth reference.", 3, 10]
+            )
+            self.settings_dict["tab_depth"] = "Custom"
+
+        if s["depthComposite"] != d["depthComposite"]:
+            self.depths["messages"].append(
+                ["Depths: User modified " "depth reference.", 3, 10]
+            )
+            self.settings_dict["tab_depth"] = "Custom"
+
+        if s["depthAvgMethod"] != d["depthAvgMethod"]:
+            self.depths["messages"].append(
+                ["Depths: User modified " "averaging method.", 3, 10]
+            )
+            self.settings_dict["tab_depth"] = "Custom"
+
+        if s["depthFilterType"] != d["depthFilterType"]:
+            self.depths["messages"].append(
+                ["Depths: User modified " "filter type.", 3, 10]
+            )
+            self.settings_dict["tab_depth"] = "Custom"
+
+        for idx in meas.checked_transect_idx:
+            transect = meas.transects[idx]
+            if (
+                transect.depths.bt_depths.draft_orig_m
+                != transect.depths.bt_depths.draft_use_m
+            ):
+                self.depths["messages"].append(
+                    ["Depths: User modified " "draft.", 3, 10]
+                )
+                self.settings_dict["tab_depth"] = "Custom"
+                break
+
+    def check_edge_settings(self, meas):
+        """Checks the edge settings to see if they are still on the original
+        ettings.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        start_edge_change = False
+        left_edge_type_change = False
+        left_edge_dist_change = False
+        left_edge_ens_change = False
+        left_edge_q_change = False
+        left_edge_coef_change = False
+        right_edge_type_change = False
+        right_edge_dist_change = False
+        right_edge_ens_change = False
+        right_edge_q_change = False
+        right_edge_coef_change = False
+
+        for idx in meas.checked_transect_idx:
+            transect = meas.transects[idx]
+
+            if transect.start_edge != transect.orig_start_edge:
+                start_edge_change = True
+
+            if transect.edges.left.type != transect.edges.left.orig_type:
+                left_edge_type_change = True
+
+            if transect.edges.left.distance_m != transect.edges.left.orig_distance_m:
+                left_edge_dist_change = True
+
+            if (
+                transect.edges.left.number_ensembles
+                != transect.edges.left.orig_number_ensembles
+            ):
+                left_edge_ens_change = True
+
+            if (
+                transect.edges.left.user_discharge_cms
+                != transect.edges.left.orig_user_discharge_cms
+            ):
+                left_edge_q_change = True
+
+            if transect.edges.left.cust_coef != transect.edges.left.orig_cust_coef:
+                left_edge_coef_change = True
+
+            if transect.edges.right.type != transect.edges.right.orig_type:
+                right_edge_type_change = True
+
+            if transect.edges.right.distance_m != transect.edges.right.orig_distance_m:
+                right_edge_dist_change = True
+
+            if (
+                transect.edges.right.number_ensembles
+                != transect.edges.right.orig_number_ensembles
+            ):
+                right_edge_ens_change = True
+
+            if (
+                transect.edges.right.user_discharge_cms
+                != transect.edges.right.orig_user_discharge_cms
+            ):
+                right_edge_q_change = True
+
+            if transect.edges.right.cust_coef != transect.edges.right.orig_cust_coef:
+                right_edge_coef_change = True
+
+        if any(
+            [
+                start_edge_change,
+                left_edge_type_change,
+                left_edge_dist_change,
+                left_edge_ens_change,
+                left_edge_q_change,
+                left_edge_coef_change,
+                right_edge_type_change,
+                right_edge_dist_change,
+                right_edge_ens_change,
+                right_edge_q_change,
+                right_edge_coef_change,
+            ]
+        ):
+            self.settings_dict["tab_edges"] = "Custom"
+
+            if start_edge_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified start edge.", 3, 10]
+                )
+            if left_edge_type_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified left edge type.", 3, 10]
+                )
+            if left_edge_dist_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified left edge distance.", 3, 10]
+                )
+            if left_edge_ens_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified left number of ensembles.", 3, 10]
+                )
+            if left_edge_q_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified left user discharge.", 3, 10]
+                )
+            if left_edge_coef_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified left custom coefficient.", 3, 10]
+                )
+            if right_edge_type_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified right edge type.", 3, 10]
+                )
+            if right_edge_dist_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified right edge distance.", 3, 10]
+                )
+            if right_edge_ens_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified right number of ensembles.", 3, 10]
+                )
+            if right_edge_q_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified right user discharge.", 3, 10]
+                )
+            if right_edge_coef_change:
+                self.edges["messages"].append(
+                    ["Edges: User modified right custom coefficient.", 3, 10]
+                )
+        else:
+            self.settings_dict["tab_edges"] = "Default"
+
+    def check_mbt_settings(self, meas):
+        """Checks the mbt settings to see if they are still on the original
+        settings.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        # if there are mb tests check for user changes
+        if len(meas.mb_tests) >= 1:
+            mbt = meas.mb_tests
+
+            mb_user_valid = []
+            mb_used = []
+
+            auto = copy.deepcopy(mbt)
+            auto = MovingBedTests.auto_use_2_correct(auto)
+
+            for n in range(len(mbt)):
+
+                if mbt[n].user_valid:
+                    mb_user_valid.append(False)
+                else:
+                    mb_user_valid.append(True)
+
+                if (
+                    mbt[n].use_2_correct != auto[n].use_2_correct
+                    and meas.transects[meas.checked_transect_idx[0]].boat_vel.selected
+                    == "bt_vel"
+                ):
+                    mb_used.append(True)
+                else:
+                    mb_used.append(False)
+
+            self.settings_dict["tab_mbt"] = "Default"
+            if any(mb_user_valid):
+                self.settings_dict["tab_mbt"] = "Custom"
+                self.movingbed["messages"].append(
+                    ["Moving-Bed Test: " "User modified " "valid test settings.", 3, 6]
+                )
+            if any(mb_used):
+                self.settings_dict["tab_mbt"] = "Custom"
+                self.movingbed["messages"].append(
+                    [
+                        "Moving-Bed Test: " "User modified " "use to correct settings.",
+                        3,
+                        6,
+                    ]
+                )
+
+        if meas.observed_no_moving_bed:
+            self.settings_dict["tab_mbt"] = "Custom"
+
+        if meas.observed_no_moving_bed:
+            self.settings_dict["tab_mbt"] = "Custom"
+
+    def check_compass_settings(self, meas):
+        """Checks the compass settings for changes.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.settings_dict["tab_compass"] = "Default"
+
+        magvar_change = False
+        align_change = False
+
+        # Check each checked transect
+        for idx in meas.checked_transect_idx:
+            transect = meas.transects[idx]
+
+            # Magvar
+            if (
+                transect.sensors.heading_deg.internal.mag_var_deg
+                != transect.sensors.heading_deg.internal.mag_var_orig_deg
+            ):
+                magvar_change = True
+
+            # Heading offset
+            if transect.sensors.heading_deg.external is not None:
+                if (
+                    transect.sensors.heading_deg.external.align_correction_deg
+                    != transect.sensors.heading_deg.external.align_correction_orig_deg
+                ):
+                    align_change = True
+
+        # Report condition and messages
+        if any([magvar_change, align_change]):
+            self.settings_dict["tab_compass"] = "Custom"
+
+            if magvar_change:
+                self.compass["messages"].append(
+                    ["Compass: User modified magnetic variation.", 3, 4]
+                )
+
+            if align_change:
+                self.compass["messages"].append(
+                    ["Compass: User modified heading offset.", 3, 4]
+                )
+
+    def check_oursin(self, meas):
+        """Checks the compass settings for changes.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+
+        self.settings_dict["tab_uncertainty_2_advanced"] = "Default"
+        self.settings_dict["tab_uncertainty"] = "Default"
+
+        for key in meas.oursin.user_advanced_settings.keys():
+            if not np.isnan(meas.oursin.user_advanced_settings[key]):
+                self.settings_dict["tab_uncertainty_2_advanced"] = "Custom"
+                self.settings_dict["tab_uncertainty"] = "Custom"
+                break
+
+        for key in meas.oursin.user_specified_u.keys():
+            if not np.isnan(meas.oursin.user_specified_u[key]):
+                self.settings_dict["tab_uncertainty"] = "Custom"
+                break
diff --git a/qrevint_22_06_22/Classes/QComp.py b/Classes/QComp.py
similarity index 53%
rename from qrevint_22_06_22/Classes/QComp.py
rename to Classes/QComp.py
index f227e5e1bc2073ade6272a0ea7a3877d350dd214..eacdcce3794efdfbea2b38e2b79874c12da80177 100644
--- a/qrevint_22_06_22/Classes/QComp.py
+++ b/Classes/QComp.py
@@ -1,7 +1,9 @@
 import numpy as np
 from Classes.TransectData import TransectData
 from Classes.BoatStructure import BoatStructure
-from MiscLibs.common_functions import cart2pol, pol2cart, nan_less, nan_greater
+from MiscLibs.common_functions import cart2pol, pol2cart
+from MiscLibs.compute_edge_cd import compute_edge_cd
+
 # from profilehooks import profile
 from DischargeFunctions.top_discharge_extrapolation import extrapolate_top
 from DischargeFunctions.bottom_discharge_extrapolation import extrapolate_bot
@@ -41,38 +43,52 @@ class QComp(object):
     correction_factor: float
         Moving-bed correction factor, if required
     int_cells: float
-        Total discharge computed for invalid depth cells excluding invalid ensembles
+        Total discharge computed for invalid depth cells excluding invalid
+        ensembles
     int_ens: float
         Total discharge computed for invalid ensembles
     """
-    
+
     def __init__(self):
         """Initialize class and instance variables."""
 
-        self.top = None  # Transect total extrapolated top discharge
-        self.middle = None  # Transect toal measured middle discharge including interpolations
-        self.bottom = None  # ETransect total extrapolated bottom discharge
-        self.top_ens = None  # Extrapolated top discharge by ensemble
-        self.middle_cells = None  # Measured middle discharge including interpolation by cell
-        self.middle_ens = None  # Measured middle discharge including interpolation by ensemble
-        self.bottom_ens = None  # Extrapolate bottom discharge by ensemble
-        self.left = None  # Left edge discharge
-        self.left_idx = []  # Ensembles used for left edge
-        self.right = None  # Right edge discharge
-        self.right_idx = []  # Ensembles used for right edge
-        self.total_uncorrected = None  # Total discharge for transect uncorrected for moving-bed, if required
-        self.total = None  # Total discharge with moving-bed correction applied if necessary
-        self.correction_factor = 1  # Moving-bed correction factor, if required
-        self.int_cells = None  # Total discharge computed for invalid depth cells excluding invalid ensembles
-        self.int_ens = None  # Total discharge computed for invalid ensembles
+        self.top = None
+        self.middle = None
+        self.bottom = None
+        self.top_ens = None
+        self.middle_cells = None
+        self.middle_ens = None
+        self.bottom_ens = None
+        self.left = None
+        self.left_idx = []
+        self.right = None
+        self.right_idx = []
+        self.total_uncorrected = None
+        self.total = None
+        self.correction_factor = 1
+        self.int_cells = None
+        self.int_ens = None
+        self.top_speed = np.nan
+        self.bottom_speed = np.nan
+        self.left_edge_speed = np.nan
+        self.right_edge_speed = np.nan
 
     # @profile
-    def populate_data(self, data_in, moving_bed_data=None, top_method=None, bot_method=None, exponent=None):
+    def populate_data(
+        self,
+        data_in,
+        moving_bed_data=None,
+        top_method=None,
+        bot_method=None,
+        exponent=None,
+    ):
         """Discharge is computed using the data provided to the method.
-        Water data provided are assumed to be corrected for the navigation reference.
-        If a moving-bed correction is to be applied it is computed and applied.
-        The TRDI method using expanded delta time is applied if the processing method is WR2.
-        
+        Water data provided are assumed to be corrected for the navigation
+        reference.
+        If a moving-bed correction is to be applied, it is computed and applied.
+        The TRDI method using expanded delta time is applied if the
+        processing method is WR2.
+
         Parameters
         ----------
         data_in: TransectData
@@ -87,32 +103,35 @@ class QComp(object):
             Extrapolation exponent
         """
 
-        # Use bottom track interpolation settings to determine the appropriate algorithms to apply
-        if data_in.boat_vel.bt_vel.interpolate == 'None':
-            processing = 'WR2'
-        elif data_in.boat_vel.bt_vel.interpolate == 'Linear':
-            processing = 'QRev'
+        # Use bottom track interpolation settings to determine the
+        # appropriate algorithms to apply
+        if data_in.boat_vel.bt_vel.interpolate == "None":
+            processing = "WR2"
+        elif data_in.boat_vel.bt_vel.interpolate == "Linear":
+            processing = "QRev"
         else:
-            processing = 'RSL'
+            processing = "RSL"
 
         # Compute cross product
         x_prod = QComp.cross_product(data_in)
-        
+
         # Get index of ensembles in moving-boat portion of transect
         in_transect_idx = data_in.in_transect_idx
-        
-        if processing == 'WR2':
-            # TRDI uses expanded delta time to handle invalid ensembles which can be caused by invalid BT
-            # WT, or depth.  QRev by default handles this invalid data through linear interpolation of the
-            # invalid data through linear interpolation of the invalid data type.  This if statement and
-            # associated code is required to maintain compatibility with WinRiver II discharge computations.
-            
+
+        if processing == "WR2":
+            # TRDI uses expanded delta time to handle invalid ensembles
+            # which can be caused by invalid BT WT, or depth.  QRev by default
+            # handles this invalid data through linear interpolation of the
+            # invalid data through linear interpolation of the invalid data
+            # type.  This if statement and associated code is required to
+            # maintain compatibility with WinRiver II discharge computations.
+
             # Determine valid ensembles
             valid_ens = np.any(np.logical_not(np.isnan(x_prod)))
             valid_ens = valid_ens[in_transect_idx]
-            
-            # Compute the ensemble duration using TRDI approach of expanding delta time to compensate
-            # for invalid ensembles
+
+            # Compute the ensemble duration using TRDI approach of expanding
+            # delta time to compensate for invalid ensembles
             n_ens = len(valid_ens)
             ens_dur = data_in.date_time.ens_duration_sec[in_transect_idx]
             delta_t = np.tile([np.nan], n_ens)
@@ -123,67 +142,114 @@ class QComp(object):
                 if valid_ens[j]:
                     delta_t[j] = cum_dur
                     cum_dur = 0
-                    
+
         else:
             # For non-WR2 processing use actual ensemble duration
             delta_t = data_in.date_time.ens_duration_sec[in_transect_idx]
-            
+
         # Compute measured or middle discharge
         self.middle_cells = QComp.discharge_middle_cells(x_prod, data_in, delta_t)
         self.middle_ens = np.nansum(self.middle_cells, 0)
         self.middle = np.nansum(self.middle_ens)
-        
+
         # Compute the top discharge
         trans_select = getattr(data_in.depths, data_in.depths.selected)
-        num_top_method = {'Power': 0, 'Constant': 1, '3-Point': 2, None: -1}
-        self.top_ens = extrapolate_top(x_prod, data_in.w_vel.valid_data[0, :, :],
-                                       num_top_method[data_in.extrap.top_method],
-                                       data_in.extrap.exponent, data_in.in_transect_idx, trans_select.depth_cell_size_m,
-                                       trans_select.depth_cell_depth_m, trans_select.depth_processed_m, delta_t,
-                                       num_top_method[top_method], exponent)
+        num_top_method = {"Power": 0, "Constant": 1, "3-Point": 2, None: -1}
+        try:
+            self.top_ens = extrapolate_top(
+                x_prod,
+                data_in.w_vel.valid_data[0, :, :],
+                num_top_method[data_in.extrap.top_method],
+                data_in.extrap.exponent,
+                data_in.in_transect_idx,
+                trans_select.depth_cell_size_m,
+                trans_select.depth_cell_depth_m,
+                trans_select.depth_processed_m,
+                delta_t,
+                num_top_method[top_method],
+                exponent,
+            )
+        except SystemError:
+            self.top_ens = QComp.extrapolate_top(
+                x_prod,
+                data_in.w_vel.valid_data[0, :, :],
+                num_top_method[data_in.extrap.top_method],
+                data_in.extrap.exponent,
+                data_in.in_transect_idx,
+                trans_select.depth_cell_size_m,
+                trans_select.depth_cell_depth_m,
+                trans_select.depth_processed_m,
+                delta_t,
+                num_top_method[top_method],
+                exponent,
+            )
         self.top = np.nansum(self.top_ens)
 
         # Compute the bottom discharge
-        num_bot_method = {'Power': 0, 'No Slip': 1, None: -1}
-        self.bottom_ens = extrapolate_bot(x_prod,
-                                          data_in.w_vel.valid_data[0, :, :],
-                                          num_bot_method[data_in.extrap.bot_method],
-                                          data_in.extrap.exponent,
-                                          data_in.in_transect_idx,
-                                          trans_select.depth_cell_size_m,
-                                          trans_select.depth_cell_depth_m,
-                                          trans_select.depth_processed_m, delta_t,
-                                          num_bot_method[bot_method],
-                                          exponent)
+        num_bot_method = {"Power": 0, "No Slip": 1, None: -1}
+        try:
+            self.bottom_ens = extrapolate_bot(
+                x_prod,
+                data_in.w_vel.valid_data[0, :, :],
+                num_bot_method[data_in.extrap.bot_method],
+                data_in.extrap.exponent,
+                data_in.in_transect_idx,
+                trans_select.depth_cell_size_m,
+                trans_select.depth_cell_depth_m,
+                trans_select.depth_processed_m,
+                delta_t,
+                num_bot_method[bot_method],
+                exponent,
+            )
+        except SystemError:
+            self.bottom_ens = QComp.extrapolate_bot(
+                x_prod,
+                data_in.w_vel.valid_data[0, :, :],
+                num_bot_method[data_in.extrap.bot_method],
+                data_in.extrap.exponent,
+                data_in.in_transect_idx,
+                trans_select.depth_cell_size_m,
+                trans_select.depth_cell_depth_m,
+                trans_select.depth_processed_m,
+                delta_t,
+                num_bot_method[bot_method],
+                exponent,
+            )
         self.bottom = np.nansum(self.bottom_ens)
 
         # Compute interpolated cell and ensemble discharge from computed
         # measured discharge
         self.interpolate_no_cells(data_in)
         self.middle = np.nansum(self.middle_ens)
-        self.int_cells, self.int_ens = QComp.discharge_interpolated(self.top_ens, self.middle_cells,
-                                                                    self.bottom_ens, data_in)
-        
+        self.int_cells, self.int_ens = QComp.discharge_interpolated(
+            self.top_ens, self.middle_cells, self.bottom_ens, data_in
+        )
+
         # Compute right edge discharge
-        if data_in.edges.right.type != 'User Q':
-            self.right, self.right_idx = QComp.discharge_edge('right', data_in, top_method, bot_method, exponent)
+        if data_in.edges.right.type != "User Q":
+            self.right, self.right_idx = QComp.discharge_edge(
+                "right", data_in, top_method, bot_method, exponent
+            )
         else:
             self.right = data_in.edges.right.user_discharge_cms
             self.right_idx = []
 
         # Compute left edge discharge
-        if data_in.edges.left.type != 'User Q':
-            self.left, self.left_idx = QComp.discharge_edge('left', data_in, top_method, bot_method, exponent)
+        if data_in.edges.left.type != "User Q":
+            self.left, self.left_idx = QComp.discharge_edge(
+                "left", data_in, top_method, bot_method, exponent
+            )
         else:
             self.left = data_in.edges.left.user_discharge_cms
             self.left_idx = []
-            
-        # Compute moving-bed correction, if applicable.  Two checks are used to account for the
-        # way the meas object is created.
 
-        # Moving-bed corrections are only applied to bottom track referenced computations
+        # Compute moving-bed correction, if applicable.  Two checks are used
+        # to account for the way the meas object is created.
+
+        # Moving-bed corrections are only applied to bottom track referenced
+        # computations
         mb_type = None
-        if data_in.boat_vel.selected == 'bt_vel':
+        if data_in.boat_vel.selected == "bt_vel":
             if moving_bed_data is not None:
 
                 # Determine if a moving-bed test is to be used for correction
@@ -196,31 +262,52 @@ class QComp(object):
                 if any(use_2_correct):
 
                     # Make sure composite tracks are turned off
-                    if data_in.boat_vel.composite == 'Off':
+                    if data_in.boat_vel.composite == "Off":
                         # Apply appropriate moving-bed test correction method
-                        if mb_type == 'Stationary':
-                            self.correction_factor = self.stationary_correction_factor(self.top, self.middle,
-                                                                                       self.bottom, data_in,
-                                                                                       moving_bed_data, delta_t)
+                        if mb_type == "Stationary":
+                            self.correction_factor = self.stationary_correction_factor(
+                                self.top,
+                                self.middle,
+                                self.bottom,
+                                data_in,
+                                moving_bed_data,
+                                delta_t,
+                            )
                         else:
-                            self.correction_factor = \
-                                self.loop_correction_factor(self.top, self.middle,
-                                                            self.bottom, data_in,
-                                                            moving_bed_data[use_2_correct.index(True)],
-                                                            delta_t)
-
-        self.total_uncorrected = self.left + self.right + self.middle + self.bottom + self.top
+                            self.correction_factor = self.loop_correction_factor(
+                                self.top,
+                                self.middle,
+                                self.bottom,
+                                data_in,
+                                moving_bed_data[use_2_correct.index(True)],
+                                delta_t,
+                            )
+
+        self.total_uncorrected = (
+            self.left + self.right + self.middle + self.bottom + self.top
+        )
 
         # Compute final discharge using correction if applicable
-        if self.correction_factor is None or self.correction_factor == 1 or np.isnan(self.correction_factor):
+        if (
+            self.correction_factor is None
+            or self.correction_factor == 1
+            or np.isnan(self.correction_factor)
+        ):
             self.total = self.total_uncorrected
         else:
-            self.total = self.left + self.right + (self.middle + self.bottom + self.top) * self.correction_factor
+            self.total = (
+                self.left
+                + self.right
+                + (self.middle + self.bottom + self.top) * self.correction_factor
+            )
+
+        self.compute_topbot_speed(transect=data_in)
+        self.compute_edge_speed(transect=data_in)
 
     @staticmethod
     def qrev_mat_in(meas_struct):
-        """Processes the Matlab data structure to obtain a list of QComp objects containing the discharge data from the
-        Matlab data structure.
+        """Processes the Matlab data structure to obtain a list of QComp
+        objects containing the discharge data from the Matlab data structure.
 
         Parameters
         ----------
@@ -234,7 +321,7 @@ class QComp(object):
         """
 
         discharge = []
-        if hasattr(meas_struct.discharge, 'bottom'):
+        if hasattr(meas_struct.discharge, "bottom"):
             # Measurement has discharge data from only one transect
             q = QComp()
             q.populate_from_qrev_mat(meas_struct.discharge)
@@ -279,15 +366,18 @@ class QComp(object):
                 # One ensemble, multiple cells
                 self.middle_cells = self.middle_cells[:, np.newaxis]
 
-        # If only one value, it will be read in as int but needs to be an array of len 1
+        # If only one value, it will be read in as int but needs to be an
+        # array of len 1
         self.left = q_in.left
-        # If only one value, it will be read in as int but needs to be an array of len 1
+        # If only one value, it will be read in as int but needs to be an
+        # array of len 1
         if type(q_in.leftidx) is int:
             self.left_idx = np.array([q_in.leftidx])
         else:
             self.left_idx = q_in.leftidx
         self.right = q_in.right
-        # If only one value, it will be read in as int but needs to be an array of len 1
+        # If only one value, it will be read in as int but needs to be an
+        # array of len 1
         if type(q_in.rightidx) is int:
             self.right_idx = np.array([q_in.rightidx])
         else:
@@ -305,19 +395,19 @@ class QComp(object):
 
     def interpolate_no_cells(self, transect_data):
         """Computes discharge for ensembles where the depth is too
-           shallow for any valid depth cells. The computation is done
-           using interpolation of unit discharge defined as the ensemble
-           discharge divided by the depth of the ensemble and the
-           duration of the ensemble. The independent variable for the
-           interpolation is the track distance. After interpolation the
-           discharge for the interpolated ensembles is computed by
-           multiplying the interpolated value by the depth and duration
-           of those ensembles to achieve discharge for those ensembles.
-
-           Parameters
-           ----------
-           transect_data: TransectData
-                Object of TransectData
+        shallow for any valid depth cells. The computation is done
+        using interpolation of unit discharge defined as the ensemble
+        discharge divided by the depth of the ensemble and the
+        duration of the ensemble. The independent variable for the
+        interpolation is the track distance. After interpolation the
+        discharge for the interpolated ensembles is computed by
+        multiplying the interpolated value by the depth and duration
+        of those ensembles to achieve discharge for those ensembles.
+
+        Parameters
+        ----------
+        transect_data: TransectData
+             Object of TransectData
         """
 
         # Compute the discharge in each ensemble
@@ -329,16 +419,24 @@ class QComp(object):
             if len(idx) > 0:
 
                 # Compute the unit discharge by depth for each ensemble
-                depth_selected = getattr(transect_data.depths, transect_data.depths.selected)
-                unit_q_depth = (q_ensemble / depth_selected.depth_processed_m[transect_data.in_transect_idx]) \
-                    / transect_data.date_time.ens_duration_sec[transect_data.in_transect_idx]
+                depth_selected = getattr(
+                    transect_data.depths, transect_data.depths.selected
+                )
+                unit_q_depth = (
+                    q_ensemble
+                    / depth_selected.depth_processed_m[transect_data.in_transect_idx]
+                ) / transect_data.date_time.ens_duration_sec[
+                    transect_data.in_transect_idx
+                ]
 
                 # Compute boat track
-                boat_track = BoatStructure.compute_boat_track(transect_data, transect_data.boat_vel.selected)
+                boat_track = BoatStructure.compute_boat_track(
+                    transect_data, transect_data.boat_vel.selected
+                )
 
                 # Create strict monotonic vector for 1-D interpolation
                 q_mono = unit_q_depth
-                x_mono = boat_track['distance_m'][transect_data.in_transect_idx]
+                x_mono = boat_track["distance_m"][transect_data.in_transect_idx]
 
                 # Identify duplicate values, and replace with an average
                 dups = self.group_consecutives(x_mono)
@@ -355,20 +453,30 @@ class QComp(object):
 
                 # Interpolate unit q
                 if np.any(valid):
-                    unit_q_int = np.interp(boat_track['distance_m'][transect_data.in_transect_idx], x_mono[valid],
-                                           q_mono[valid], left=np.nan, right=np.nan)
+                    unit_q_int = np.interp(
+                        boat_track["distance_m"][transect_data.in_transect_idx],
+                        x_mono[valid],
+                        q_mono[valid],
+                        left=np.nan,
+                        right=np.nan,
+                    )
                 else:
                     unit_q_int = 0
 
-                # Compute the discharge in each ensemble based on interpolated data
-                q_int = unit_q_int * depth_selected.depth_processed_m[transect_data.in_transect_idx] \
-                    * transect_data.date_time.ens_duration_sec[transect_data.in_transect_idx]
+                # Compute the discharge in each ensemble based on
+                # interpolated data
+                q_int = (
+                    unit_q_int
+                    * depth_selected.depth_processed_m[transect_data.in_transect_idx]
+                    * transect_data.date_time.ens_duration_sec[
+                        transect_data.in_transect_idx
+                    ]
+                )
                 self.middle_ens[idx] = q_int[idx]
 
     @staticmethod
     def group_consecutives(vals):
-        """Return list of consecutive lists of numbers from vals (number list).
-        """
+        """Return list of consecutive lists of numbers from vals (number list)."""
 
         run = []
         result = []
@@ -380,7 +488,7 @@ class QComp(object):
                 if j > 1:
                     run.append(n)
                 elif j > 0:
-                    run.append(n-1)
+                    run.append(n - 1)
                     run.append(n)
             elif j > 0:
                 result.append(run)
@@ -390,10 +498,18 @@ class QComp(object):
         return result
 
     @staticmethod
-    def cross_product(transect=None, w_vel_x=None, w_vel_y=None, b_vel_x=None, b_vel_y=None, start_edge=None):
+    def cross_product(
+        transect=None,
+        w_vel_x=None,
+        w_vel_y=None,
+        b_vel_x=None,
+        b_vel_y=None,
+        start_edge=None,
+    ):
         """Computes the cross product of the water and boat velocity.
 
-        Input data can be a transect or component vectors for the water and boat velocities with the start edge.
+        Input data can be a transect or component vectors for the water and
+        boat velocities with the start edge.
 
         Parameters
         ----------
@@ -429,8 +545,12 @@ class QComp(object):
                 b_vel_x = trans_select.u_processed_mps
                 b_vel_y = trans_select.v_processed_mps
             else:
-                b_vel_x = np.tile([np.nan], transect.boat_vel.bt_vel.u_processed_mps.shape)
-                b_vel_y = np.tile([np.nan], transect.boat_vel.bt_vel.v_processed_mps.shape)
+                b_vel_x = np.tile(
+                    [np.nan], transect.boat_vel.bt_vel.u_processed_mps.shape
+                )
+                b_vel_y = np.tile(
+                    [np.nan], transect.boat_vel.bt_vel.v_processed_mps.shape
+                )
 
             start_edge = transect.start_edge
 
@@ -438,7 +558,7 @@ class QComp(object):
         xprod = np.multiply(w_vel_x, b_vel_y) - np.multiply(w_vel_y, b_vel_x)
 
         # Correct the sign of the cross product based on the start edge
-        if start_edge == 'Right':
+        if start_edge == "Right":
             direction = 1
         else:
             direction = -1
@@ -448,7 +568,8 @@ class QComp(object):
 
     @staticmethod
     def discharge_middle_cells(xprod, transect, delta_t):
-        """Computes the discharge in the measured or middle portion of the cross section.
+        """Computes the discharge in the measured or middle portion of the
+        cross section.
 
         Parameters
         ----------
@@ -471,12 +592,16 @@ class QComp(object):
         cell_size = trans_select.depth_cell_size_m
 
         # Determine is xprod contains edge data and process appropriately
-        q_mid_cells = np.multiply(xprod[:, in_transect_idx] * cell_size[:, in_transect_idx], delta_t)
+        q_mid_cells = np.multiply(
+            xprod[:, in_transect_idx] * cell_size[:, in_transect_idx], delta_t
+        )
 
         return q_mid_cells
 
     @staticmethod
-    def discharge_edge(edge_loc, transect, top_method=None, bot_method=None, exponent=None):
+    def discharge_edge(
+        edge_loc, transect, top_method=None, bot_method=None, exponent=None
+    ):
         """Computes edge discharge.
 
         Parameters
@@ -514,7 +639,9 @@ class QComp(object):
         edge_dist = edge_selected.distance_m
 
         # Compute edge velocity and sign
-        edge_vel_sign, edge_vel_mag = QComp.edge_velocity(edge_idx, transect, top_method, bot_method, exponent)
+        edge_vel_sign, edge_vel_mag = QComp.edge_velocity(
+            edge_idx, transect, top_method, bot_method, exponent
+        )
 
         # Compute edge coefficient
         coef = QComp.edge_coef(edge_loc, transect)
@@ -528,10 +655,13 @@ class QComp(object):
 
     @staticmethod
     def edge_ensembles(edge_loc, transect):
-        """This function computes the starting and ending ensemble numbers for an edge.
+        """This function computes the starting and ending ensemble numbers
+        for an edge.
 
-         This method uses either the method used by TRDI which used the specified number of valid ensembles or SonTek
-        which uses the specified number of ensembles prior to screening for valid data
+         This method uses either the method used by TRDI which used the
+         specified number of valid ensembles or SonTek
+        which uses the specified number of ensembles prior to screening for
+        valid data
 
         Parameters
         ----------
@@ -551,10 +681,9 @@ class QComp(object):
         num_edge_ens = int(edge_select.number_ensembles)
 
         # TRDI method
-        if transect.adcp.manufacturer == 'TRDI':
+        if transect.adcp.manufacturer == "TRDI":
             # Determine the indices of the edge ensembles which contain
-            # the specified number of valid ensembles
-            # noinspection PyTypeChecker
+            # the specified number of valid ensembles noinspection PyTypeChecker
             valid_ens = QComp.valid_edge_ens(transect)
             if num_edge_ens > len(valid_ens):
                 num_edge_ens = len(valid_ens)
@@ -565,7 +694,8 @@ class QComp(object):
 
         # Sontek Method
         else:
-            # Determine the indices of the edge ensembles as collected by RiverSurveyor.  There
+            # Determine the indices of the edge ensembles as collected by
+            # RiverSurveyor.  There
             # is no check as to whether the ensembles contain valid data
             trans_select = getattr(transect.depths, transect.depths.selected)
             n_ensembles = len(trans_select.depth_processed_m)
@@ -579,7 +709,9 @@ class QComp(object):
         return edge_idx
 
     @staticmethod
-    def edge_velocity(edge_idx, transect, top_method=None, bot_method=None, exponent=None):
+    def edge_velocity(
+        edge_idx, transect, top_method=None, bot_method=None, exponent=None
+    ):
         """Computes the edge velocity.
 
         Different methods may be used depending on settings in transect.
@@ -614,17 +746,22 @@ class QComp(object):
 
             # Compute edge velocity using specified method
             # Used by TRDI
-            if transect.edges.vel_method == 'MeasMag':
-                edge_vel_mag, edge_vel_sign = QComp.edge_velocity_trdi(edge_idx, transect)
+            if transect.edges.vel_method == "MeasMag":
+                edge_vel_mag, edge_vel_sign = QComp.edge_velocity_trdi(
+                    edge_idx, transect
+                )
 
             # Used by Sontek
-            elif transect.edges.vel_method == 'VectorProf':
-                edge_val_mag, edge_vel_sign = QComp.edge_velocity_sontek(edge_idx, transect, top_method,
-                                                                         bot_method, exponent)
+            elif transect.edges.vel_method == "VectorProf":
+                edge_val_mag, edge_vel_sign = QComp.edge_velocity_sontek(
+                    edge_idx, transect, top_method, bot_method, exponent
+                )
 
             # USGS proposed method
-            elif transect.edges.vel_method == 'Profile':
-                edge_vel_mag, edge_vel_sign = QComp.edge_velocity_profile(edge_idx, transect)
+            elif transect.edges.vel_method == "Profile":
+                edge_vel_mag, edge_vel_sign = QComp.edge_velocity_profile(
+                    edge_idx, transect
+                )
 
         return edge_vel_sign, edge_vel_mag
 
@@ -667,7 +804,7 @@ class QComp(object):
 
         # Compute unit vector to help determine sign
         unit_water_x, unit_water_y = pol2cart(edge_dir, 1)
-        if transect.start_edge == 'Right':
+        if transect.start_edge == "Right":
             dir_sign = 1
         else:
             dir_sign = -1
@@ -683,22 +820,30 @@ class QComp(object):
             b_vel_x = np.tile([np.nan], transect.boat_vel.bt_vel.u_processed_mps.shape)
             b_vel_y = np.tile([np.nan], transect.boat_vel.bt_vel.v_processed_mps.shape)
 
-        track_x = np.nancumsum(b_vel_x[in_transect_idx] * ens_delta_time[in_transect_idx])
-        track_y = np.nancumsum(b_vel_y[in_transect_idx] * ens_delta_time[in_transect_idx])
+        track_x = np.nancumsum(
+            b_vel_x[in_transect_idx] * ens_delta_time[in_transect_idx]
+        )
+        track_y = np.nancumsum(
+            b_vel_y[in_transect_idx] * ens_delta_time[in_transect_idx]
+        )
         boat_dir, boat_mag = cart2pol(track_x[-1], track_y[-1])
         unit_track_x, unit_track_y = pol2cart(boat_dir, 1)
-        unit_x_prod = (unit_water_x * unit_track_y - unit_water_y * unit_track_x) * dir_sign
+        unit_x_prod = (
+            unit_water_x * unit_track_y - unit_water_y * unit_track_x
+        ) * dir_sign
         edge_vel_sign = np.sign(unit_x_prod)
 
         return edge_vel_mag, edge_vel_sign
 
     @staticmethod
-    def edge_velocity_sontek(edge_idx, transect, top_method=None, bot_method=None, exponent=None):
+    def edge_velocity_sontek(
+        edge_idx, transect, top_method=None, bot_method=None, exponent=None
+    ):
         """Computes the edge velocity using SonTek's method.
 
-        SonTek's method uses the profile extrapolation to estimate the velocities in the
-        unmeasured top and bottom and then projects the velocity perpendicular to the
-        course made good.
+        SonTek's method uses the profile extrapolation to estimate the
+        velocities in the unmeasured top and bottom and then projects the velocity
+        perpendicular to the course made good.
 
         Parameters
         ----------
@@ -740,8 +885,12 @@ class QComp(object):
             b_vel_x = np.tile([np.nan], transect.boat_vel.u_processed_mps.shape)
             b_vel_y = np.tile([np.nan], transect.boat_vel.v_processed_mps.shape)
 
-        track_x = np.nancumsum(b_vel_x[in_transect_idx] * ens_delta_time[in_transect_idx])
-        track_y = np.nancumsum(b_vel_y[in_transect_idx] * ens_delta_time[in_transect_idx])
+        track_x = np.nancumsum(
+            b_vel_x[in_transect_idx] * ens_delta_time[in_transect_idx]
+        )
+        track_y = np.nancumsum(
+            b_vel_y[in_transect_idx] * ens_delta_time[in_transect_idx]
+        )
 
         # Compute the unit vector for the boat track
         boat_dir, boat_mag = cart2pol(track_x[-1], track_y[-1])
@@ -789,14 +938,17 @@ class QComp(object):
                 cell_depth[:, np.logical_not(valid)] = np.nan
                 cell_depth_edge = np.nanmean(cell_size, 1)
 
-                # SonTek cuts off the mean profile based on the side lobe cutoff of
-                # the mean of the shallowest beams in the edge ensembles.
+                # SonTek cuts off the mean profile based on the side lobe
+                # cutoff of the mean of the shallowest beams in
+                # the edge ensembles.
 
                 # Determine valid original beam and cell depths
                 depth_bt_beam_orig = transect.depths.bt_depths.depth_orig_m[:, edge_idx]
                 depth_bt_beam_orig[:, np.logical_not(valid)] = np.nan
                 draft_bt_beam_orig = transect.depths.bt_depths.draft_orig_m
-                depth_cell_depth_orig = transect.depths.bt_depths.depth_cell_depth_orig_m[:, edge_idx]
+                depth_cell_depth_orig = (
+                    transect.depths.bt_depths.depth_cell_depth_orig_m[:, edge_idx]
+                )
                 depth_cell_depth_orig[:, np.logical_not(valid)] = np.nan
 
                 # Compute minimum mean depth
@@ -804,25 +956,33 @@ class QComp(object):
                 min_depth = np.nanmin(min_raw_depths)
                 min_depth = min_depth - draft_bt_beam_orig
 
-                # Compute last valid cell by computing the side lobe cutoff based
-                # on the mean of the minimum beam depths of the valid edge
-                # ensembles
-                if transect.w_vel.sl_cutoff_type == 'Percent':
-                    sl_depth = min_depth - ((transect.w_vel.sl_cutoff_percent / 100.) * min_depth)
+                # Compute last valid cell by computing the side lobe cutoff
+                # based on the mean of the minimum beam depths
+                # of the valid edge ensembles
+                if transect.w_vel.sl_cutoff_type == "Percent":
+                    sl_depth = min_depth - (
+                        (transect.w_vel.sl_cutoff_percent / 100.0) * min_depth
+                    )
                 else:
-                    sl_depth = min_depth - ((transect.w_vel.sl_cutoff_percent / 100.) * min_depth) \
+                    sl_depth = (
+                        min_depth
+                        - ((transect.w_vel.sl_cutoff_percent / 100.0) * min_depth)
                         - (transect.w_vel.sl_cutoff_number * cell_size[0, 0])
+                    )
 
                 # Adjust side lobe depth for draft
                 sl_depth = sl_depth + draft_bt_beam_orig
                 above_sl = cell_depth < (sl_depth + np.nanmax(cell_size))
                 above_sl_profile = np.nansum(above_sl, 1)
                 # TODO this line doesn't make sense to me
-                valid_idx = np.logical_and(np.less(above_sl_profile, np.nanmax(above_sl_profile)+1),
-                                           np.greater(above_sl_profile, 0))
+                valid_idx = np.logical_and(
+                    np.less(above_sl_profile, np.nanmax(above_sl_profile) + 1),
+                    np.greater(above_sl_profile, 0),
+                )
 
                 # Compute the number of cells above the side lobe cutoff
-                # remaining_depth = sl_depth - cell_depth_edge[idx_first_valid_cell]
+                # remaining_depth = sl_depth - cell_depth_edge[
+                # idx_first_valid_cell]
                 idx = np.where(np.logical_not(np.isnan(cell_size)))[0]
                 # TODO this is not consistent with Matlab code
                 n_cells = 0
@@ -837,15 +997,20 @@ class QComp(object):
                     x_profile[not valid_idx] = np.nan
                     y_profile[not valid_idx] = np.nan
                 else:
-                    idx_last_valid_cell = np.where(np.logical_not(np.isnan(x_profile[:idx_last_valid_cell])))[0][0]
+                    idx_last_valid_cell = np.where(
+                        np.logical_not(np.isnan(x_profile[:idx_last_valid_cell]))
+                    )[0][0]
                     # Mark the cells in the profile below the sidelobe invalid
-                    x_profile[(idx_last_valid_cell+1):] = np.nan
-                    y_profile[(idx_last_valid_cell + 1):] = np.nan
+                    x_profile[(idx_last_valid_cell + 1) :] = np.nan
+                    y_profile[(idx_last_valid_cell + 1) :] = np.nan
 
                 # Find the top most 3 valid cells
-                idx_first_3_valid_cells = np.where(np.logical_not(np.isnan(x_profile)))[0][:3]
+                idx_first_3_valid_cells = np.where(np.logical_not(np.isnan(x_profile)))[
+                    0
+                ][:3]
 
-                # Compute the mean measured velocity components for the edge profile
+                # Compute the mean measured velocity components for the edge
+                # profile
                 x_profile_mean = np.nanmean(x_profile)
                 y_profile_mean = np.nanmean(y_profile)
 
@@ -855,85 +1020,108 @@ class QComp(object):
                 depth_avg = np.nanmean(depth_ens)
 
                 # Determine top, mid, bottom range for the profile
-                top_rng_edge = cell_depth_edge[idx_first_valid_cell] - 0.5 * ref_cell_size
+                top_rng_edge = (
+                    cell_depth_edge[idx_first_valid_cell] - 0.5 * ref_cell_size
+                )
                 if idx_last_valid_cell > len(x_profile):
                     mid_rng_edge = np.nansum(cell_size_edge[valid_idx])
                 else:
-                    mid_rng_edge = np.nansum(cell_size_edge[idx_first_valid_cell:idx_last_valid_cell+1])
+                    mid_rng_edge = np.nansum(
+                        cell_size_edge[idx_first_valid_cell : idx_last_valid_cell + 1]
+                    )
 
                 # Compute z
                 z_edge = depth_avg - cell_depth_edge
-                z_edge[idx_last_valid_cell+1:] = np.nan
+                z_edge[idx_last_valid_cell + 1 :] = np.nan
                 z_edge[z_edge > 0] = np.nan
                 idx_last_valid_cell = np.where(np.logical_not(np.isnan(z_edge)))[0][-1]
-                bot_rng_edge = depth_avg - cell_depth_edge[idx_last_valid_cell] - 0.5 * \
-                    cell_size_edge[idx_last_valid_cell]
+                bot_rng_edge = (
+                    depth_avg
+                    - cell_depth_edge[idx_last_valid_cell]
+                    - 0.5 * cell_size_edge[idx_last_valid_cell]
+                )
 
                 # Compute the top extrapolation for x-component
-                top_vel_x = QComp.discharge_top(top_method=top_method,
-                                                exponent=exponent,
-                                                idx_top=idx_first_valid_cell,
-                                                idx_top_3=idx_first_3_valid_cells,
-                                                top_rng=top_rng_edge,
-                                                component=x_profile,
-                                                cell_size=cell_size_edge,
-                                                cell_depth=cell_depth_edge,
-                                                depth_ens=depth_avg,
-                                                delta_t=1,
-                                                z=z_edge)
+                top_vel_x = QComp.discharge_top(
+                    top_method=top_method,
+                    exponent=exponent,
+                    idx_top=idx_first_valid_cell,
+                    idx_top_3=idx_first_3_valid_cells,
+                    top_rng=top_rng_edge,
+                    component=x_profile,
+                    cell_size=cell_size_edge,
+                    cell_depth=cell_depth_edge,
+                    depth_ens=depth_avg,
+                    delta_t=1,
+                    z=z_edge,
+                )
                 top_vel_x = top_vel_x / top_rng_edge
 
                 # Compute the bottom extrapolation for x-component
-                bot_vel_x = QComp.discharge_bot(bot_method=bot_method,
-                                                exponent=exponent,
-                                                idx_bot=idx_last_valid_cell,
-                                                bot_rng=bot_rng_edge,
-                                                component=x_profile,
-                                                cell_size=cell_size_edge,
-                                                cell_depth=cell_depth_edge,
-                                                depth_ens=depth_avg,
-                                                delta_t=1,
-                                                z=z_edge)
+                bot_vel_x = QComp.discharge_bot(
+                    bot_method=bot_method,
+                    exponent=exponent,
+                    bot_rng=bot_rng_edge,
+                    component=x_profile,
+                    cell_size=cell_size_edge,
+                    cell_depth=cell_depth_edge,
+                    depth_ens=depth_avg,
+                    delta_t=1,
+                    z=z_edge,
+                )
                 bot_vel_x = bot_vel_x / bot_rng_edge
 
                 # Compute the top extrapolation for the y-component
-                top_vel_y = QComp.discharge_top(top_method=top_method,
-                                                exponent=exponent,
-                                                idx_top=idx_first_valid_cell,
-                                                idx_top_3=idx_first_3_valid_cells,
-                                                top_rng=top_rng_edge,
-                                                component=y_profile,
-                                                cell_size=cell_size_edge,
-                                                cell_depth=cell_depth_edge,
-                                                depth_ens=depth_avg,
-                                                delta_t=1,
-                                                z=z_edge)
+                top_vel_y = QComp.discharge_top(
+                    top_method=top_method,
+                    exponent=exponent,
+                    idx_top=idx_first_valid_cell,
+                    idx_top_3=idx_first_3_valid_cells,
+                    top_rng=top_rng_edge,
+                    component=y_profile,
+                    cell_size=cell_size_edge,
+                    cell_depth=cell_depth_edge,
+                    depth_ens=depth_avg,
+                    delta_t=1,
+                    z=z_edge,
+                )
                 top_vel_y = top_vel_y / top_rng_edge
 
                 # Compute the bottom extrapolation for y-component
-                bot_vel_y = QComp.discharge_bot(bot_method=bot_method,
-                                                exponent=exponent,
-                                                idx_bot=idx_last_valid_cell,
-                                                bot_rng=bot_rng_edge,
-                                                component=y_profile,
-                                                cell_size=cell_size_edge,
-                                                cell_depth=cell_depth_edge,
-                                                depth_ens=depth_avg,
-                                                delta_t=1,
-                                                z=z_edge)
+                bot_vel_y = QComp.discharge_bot(
+                    bot_method=bot_method,
+                    exponent=exponent,
+                    bot_rng=bot_rng_edge,
+                    component=y_profile,
+                    cell_size=cell_size_edge,
+                    cell_depth=cell_depth_edge,
+                    depth_ens=depth_avg,
+                    delta_t=1,
+                    z=z_edge,
+                )
                 bot_vel_y = bot_vel_y / bot_rng_edge
 
-                # Compute edge velocity vector including extrapolated velocities
-                v_edge_x = ((top_vel_x * top_rng_edge) + (x_profile_mean * mid_rng_edge) + (bot_vel_x * bot_rng_edge)
-                            / depth_avg)
-                v_edge_y = ((top_vel_y * top_rng_edge) + (y_profile_mean * mid_rng_edge) + (bot_vel_y * bot_rng_edge)
-                            / depth_avg)
-
-                # Compute magnitude of edge velocity perpendicular to course made good
-                edge_vel_mag = (v_edge_x * -1 * unit_track_y) + (v_edge_y * unit_track_x)
+                # Compute edge velocity vector including extrapolated
+                # velocities
+                v_edge_x = (
+                    (top_vel_x * top_rng_edge)
+                    + (x_profile_mean * mid_rng_edge)
+                    + (bot_vel_x * bot_rng_edge) / depth_avg
+                )
+                v_edge_y = (
+                    (top_vel_y * top_rng_edge)
+                    + (y_profile_mean * mid_rng_edge)
+                    + (bot_vel_y * bot_rng_edge) / depth_avg
+                )
+
+                # Compute magnitude of edge velocity perpendicular to course
+                # made good
+                edge_vel_mag = (v_edge_x * -1 * unit_track_y) + (
+                    v_edge_y * unit_track_x
+                )
 
                 # Determine edge sign
-                if transect.start_edge == 'Right':
+                if transect.start_edge == "Right":
                     edge_vel_sign = -1
                 else:
                     edge_vel_sign = 1
@@ -948,7 +1136,8 @@ class QComp(object):
 
     @staticmethod
     def edge_velocity_profile(edge_idx, transect):
-        """Compute edge velocity magnitude using the mean velocity of each ensemble.
+        """Compute edge velocity magnitude using the mean velocity of each
+        ensemble.
 
         The mean velocity of each ensemble is computed by first
         computing the mean direction of the velocities in the ensemble,
@@ -1005,9 +1194,15 @@ class QComp(object):
                 # Setup variables
                 v_x = x_vel[:, n]
                 v_y = y_vel[:, n]
-                depth_cell_size = transect.depths.bt_depths.depth_cell_size_m[:, selected_ensemble]
-                depth_cell_depth = transect.depths.bt_depths.depth_cell_depth_m[:, selected_ensemble]
-                depth = transect.depths.bt_depths.depth_processed_m[:, selected_ensemble]
+                depth_cell_size = transect.depths.bt_depths.depth_cell_size_m[
+                    :, selected_ensemble
+                ]
+                depth_cell_depth = transect.depths.bt_depths.depth_cell_depth_m[
+                    :, selected_ensemble
+                ]
+                depth = transect.depths.bt_depths.depth_processed_m[
+                    :, selected_ensemble
+                ]
                 depth_cell_size[np.isnan(v_x)] = np.nan
                 depth_cell_depth[np.isnan(v_x)] = np.nan
 
@@ -1016,22 +1211,31 @@ class QComp(object):
                 v_y_avg = np.nansum(v_y * depth_cell_size) / np.nansum(depth_cell_size)
                 ens_dir, _ = cart2pol(v_x_avg, v_y_avg)
                 v_unit[0], v_unit[1] = pol2cart(ens_dir, 1)
-                v_projected_mag = np.dot(np.hstack([v_x, v_y]), np.tile(v_unit, v_x.shape))
+                v_projected_mag = np.dot(
+                    np.hstack([v_x, v_y]), np.tile(v_unit, v_x.shape)
+                )
 
                 # Compute z value for each cell
-                z = (depth - depth_cell_depth)
+                z = depth - depth_cell_depth
                 z[np.isnan(v_projected_mag)] = np.nan
 
                 # Compute coefficient for 1/6th power curve
                 b = 1.0 / 6.0
-                a = (b + 1) * (np.nansum((v_projected_mag * depth_cell_size))
-                               / (np.nansum(((z + 0.5 * depth_cell_size)**(b + 1))
-                                  - ((z - 0.5 * depth_cell_size)**(b + 1)))))
+                a = (b + 1) * (
+                    np.nansum((v_projected_mag * depth_cell_size))
+                    / (
+                        np.nansum(
+                            ((z + 0.5 * depth_cell_size) ** (b + 1))
+                            - ((z - 0.5 * depth_cell_size) ** (b + 1))
+                        )
+                    )
+                )
 
                 # Compute mean water speed by integrating power curve
-                vel_ensembles[n] = ((a / (b + 1)) * (depth**(b + 1))) / depth
+                vel_ensembles[n] = ((a / (b + 1)) * (depth ** (b + 1))) / depth
 
-                # Compute the mean velocity components from the mean water speed and direction
+                # Compute the mean velocity components from the mean water
+                # speed and direction
                 u[n], v[n] = pol2cart(ens_dir, vel_ensembles)
 
             else:
@@ -1041,7 +1245,8 @@ class QComp(object):
                 u[n] = np.nan
                 v[n] = np.nan
 
-        # Compute the mean velocity components of the edge velocity as the mean of the mean ensemble components
+        # Compute the mean velocity components of the edge velocity as the
+        # mean of the mean ensemble components
         u_avg = np.nanmean(u)
         v_avg = np.nanmean(v)
 
@@ -1053,7 +1258,7 @@ class QComp(object):
         unit_water_x, unit_water_y = pol2cart(edge_vel_dir, 1)
 
         # Account for direction of boat travel
-        if transect.start_edge == 'Right':
+        if transect.start_edge == "Right":
             dir_sign = 1
         else:
             dir_sign = -1
@@ -1069,13 +1274,19 @@ class QComp(object):
             b_vel_x = np.tile([np.nan], transect.boat_vel.u_processed_mps.shape)
             b_vel_y = np.tile([np.nan], transect.boat_vel.v_processed_mps.shape)
 
-        track_x = np.nancumsum(b_vel_x[in_transect_idx] * ens_delta_time[in_transect_idx])
-        track_y = np.nancumsum(b_vel_y[in_transect_idx] * ens_delta_time[in_transect_idx])
+        track_x = np.nancumsum(
+            b_vel_x[in_transect_idx] * ens_delta_time[in_transect_idx]
+        )
+        track_y = np.nancumsum(
+            b_vel_y[in_transect_idx] * ens_delta_time[in_transect_idx]
+        )
         boat_dir, boat_mag = cart2pol(track_x[-1], track_y[-1])
         unit_track_x, unit_track_y = pol2cart(boat_dir, 1)
 
         # Compute cross product from unit vectors
-        unit_x_prod = (unit_water_x * unit_track_y - unit_water_y * unit_track_x) * dir_sign
+        unit_x_prod = (
+            unit_water_x * unit_track_y - unit_water_y * unit_track_x
+        ) * dir_sign
 
         # Determine sign
         edge_vel_sign = np.sign(unit_x_prod)
@@ -1084,7 +1295,8 @@ class QComp(object):
 
     @staticmethod
     def edge_coef(edge_loc, transect):
-        """Returns the edge coefficient based on the edge settings and transect object.
+        """Returns the edge coefficient based on the edge settings and
+        transect object.
 
         Parameters
         ----------
@@ -1096,20 +1308,21 @@ class QComp(object):
         Returns
         -------
         coef: float
-            Edge coefficient for accounting for velocity distribution and edge shape
+            Edge coefficient for accounting for velocity distribution and
+            edge shape
         """
 
         # Process appropriate edge type
         edge_select = getattr(transect.edges, edge_loc)
-        if edge_select.type == 'Triangular':
+        if edge_select.type == "Triangular":
             coef = 0.3535
 
-        elif edge_select.type == 'Rectangular':
+        elif edge_select.type == "Rectangular":
             # Rectangular edge coefficient depends on the rec_edge_method.
             # 'Fixed' is compatible with the method used by TRDI.
             # 'Variable is compatible with the method used by SonTek
 
-            if transect.edges.rec_edge_method == 'Fixed':
+            if transect.edges.rec_edge_method == "Fixed":
                 # Fixed Method
                 coef = 0.91
 
@@ -1125,11 +1338,18 @@ class QComp(object):
                 trans_select = getattr(transect.depths, transect.depths.selected)
                 depth_edge = np.nanmean(trans_select.depth_processed_m[edge_idx])
 
-                # Compute coefficient using equation 34 from Principle of River Discharge Measurement, SonTek, 2003
-                coef = (1 - ((0.35 / 4) * (depth_edge / dist) * (1 - np.exp(-4 * (dist / depth_edge))))) / \
-                    (1 - 0.35 * np.exp(-4 * (dist / depth_edge)))
-
-        elif edge_select.type == 'Custom':
+                # Compute coefficient using equation 34 from Principle of
+                # River Discharge Measurement, SonTek, 2003
+                coef = (
+                    1
+                    - (
+                        (0.35 / 4)
+                        * (depth_edge / dist)
+                        * (1 - np.exp(-4 * (dist / depth_edge)))
+                    )
+                ) / (1 - 0.35 * np.exp(-4 * (dist / depth_edge)))
+
+        elif edge_select.type == "Custom":
             # Custom user supplied coefficient
             coef = edge_select.cust_coef
 
@@ -1160,7 +1380,8 @@ class QComp(object):
         Returns
         -------
         correction_factor: float
-            Correction factor to be applied to the discharge to correct for moving-bed effects
+            Correction factor to be applied to the discharge to correct for
+            moving-bed effects
         """
 
         # Assign object properties to local variables
@@ -1180,7 +1401,9 @@ class QComp(object):
 
         if q_orig != 0:
             # Compute near-bed velocities
-            nb_u, nb_v, unit_nb_u, unit_nb_v = QComp.near_bed_velocity(u, v, depth, depth_cell_depth)
+            nb_u, nb_v, unit_nb_u, unit_nb_v = QComp.near_bed_velocity(
+                u, v, depth, depth_cell_depth
+            )
             nb_speed = np.sqrt(nb_u**2 + nb_v**2)
             nb_u_mean = np.nanmean(nb_u)
             nb_v_mean = np.nanmean(nb_v)
@@ -1198,31 +1421,53 @@ class QComp(object):
 
             # Compute corrected cross product
             xprod = QComp.cross_product(transect=trans_data)
-            xprod_in = QComp.cross_product(w_vel_x=u_adj,
-                                           w_vel_y=v_adj,
-                                           b_vel_x=bt_u_adj,
-                                           b_vel_y=bt_v_adj,
-                                           start_edge=trans_data.start_edge)
+            xprod_in = QComp.cross_product(
+                w_vel_x=u_adj,
+                w_vel_y=v_adj,
+                b_vel_x=bt_u_adj,
+                b_vel_y=bt_v_adj,
+                start_edge=trans_data.start_edge,
+            )
             xprod[:, in_transect_idx] = xprod_in
 
             # Compute corrected discharges
-            q_middle_cells = QComp.discharge_middle_cells(xprod=xprod, transect=trans_data, delta_t=delta_t)
+            q_middle_cells = QComp.discharge_middle_cells(
+                xprod=xprod, transect=trans_data, delta_t=delta_t
+            )
             trans_select = getattr(trans_data.depths, trans_data.depths.selected)
-            num_top_method = {'Power': 0, 'Constant': 1, '3-Point': 2, None: -1}
-            q_top = extrapolate_top(xprod, trans_data.w_vel.valid_data[0, :, :],
-                                    num_top_method[trans_data.extrap.top_method],
-                                    trans_data.extrap.exponent, trans_data.in_transect_idx,
-                                    trans_select.depth_cell_size_m,
-                                    trans_select.depth_cell_depth_m, trans_select.depth_processed_m, delta_t,
-                                    -1, 0.1667)
-            num_bot_method = {'Power': 0, 'No Slip': 1, None: -1}
-            q_bot = extrapolate_bot(xprod, trans_data.w_vel.valid_data[0, :, :],
-                                    num_bot_method[trans_data.extrap.bot_method],
-                                    trans_data.extrap.exponent, trans_data.in_transect_idx,
-                                    trans_select.depth_cell_size_m,
-                                    trans_select.depth_cell_depth_m, trans_select.depth_processed_m, delta_t,
-                                    -1, 0.1667)
-            q_adj = np.nansum(np.nansum(q_middle_cells)) + np.nansum(q_top) + np.nansum(q_bot)
+            num_top_method = {"Power": 0, "Constant": 1, "3-Point": 2, None: -1}
+            q_top = extrapolate_top(
+                xprod,
+                trans_data.w_vel.valid_data[0, :, :],
+                num_top_method[trans_data.extrap.top_method],
+                trans_data.extrap.exponent,
+                trans_data.in_transect_idx,
+                trans_select.depth_cell_size_m,
+                trans_select.depth_cell_depth_m,
+                trans_select.depth_processed_m,
+                delta_t,
+                -1,
+                0.1667,
+            )
+            num_bot_method = {"Power": 0, "No Slip": 1, None: -1}
+            q_bot = extrapolate_bot(
+                xprod,
+                trans_data.w_vel.valid_data[0, :, :],
+                num_bot_method[trans_data.extrap.bot_method],
+                trans_data.extrap.exponent,
+                trans_data.in_transect_idx,
+                trans_select.depth_cell_size_m,
+                trans_select.depth_cell_depth_m,
+                trans_select.depth_processed_m,
+                delta_t,
+                -1,
+                0.1667,
+            )
+            q_adj = (
+                np.nansum(np.nansum(q_middle_cells))
+                + np.nansum(q_top)
+                + np.nansum(q_bot)
+            )
 
             # Compute correction factor
             correction_factor = q_adj / q_orig
@@ -1230,10 +1475,13 @@ class QComp(object):
             correction_factor = 1.0
 
         return correction_factor
-        
+
     @staticmethod
-    def stationary_correction_factor(top_q, middle_q, bottom_q, trans_data, mb_data, delta_t):
-        """Computes the discharge correction factor from stationary moving-bed tests.
+    def stationary_correction_factor(
+        top_q, middle_q, bottom_q, trans_data, mb_data, delta_t
+    ):
+        """Computes the discharge correction factor from stationary
+        moving-bed tests.
 
         Parameters
         ----------
@@ -1253,23 +1501,26 @@ class QComp(object):
         Returns
         -------
         correction_factor: float
-            Correction factor to be applied to the discharge to correct for moving-bed effects
+            Correction factor to be applied to the discharge to correct for
+            moving-bed effects
         """
-                
+
         n_mb_tests = len(mb_data)
         n_sta_tests = 0
         mb_speed = np.array([0])
         near_bed_speed = np.array([0])
         for n in range(n_mb_tests):
-            if (mb_data[n].type == 'Stationary') and mb_data[n].use_2_correct:
+            if (mb_data[n].type == "Stationary") and mb_data[n].use_2_correct:
                 n_sta_tests += 1
                 mb_speed = np.append(mb_speed, mb_data[n].mb_spd_mps)
-                near_bed_speed = np.append(near_bed_speed, mb_data[n].near_bed_speed_mps)
+                near_bed_speed = np.append(
+                    near_bed_speed, mb_data[n].near_bed_speed_mps
+                )
 
         if n_sta_tests > 0:
 
-            # Compute linear regression coefficient forcing through zero to relate
-            # near-bed velocity to moving-bed velocity
+            # Compute linear regression coefficient forcing through zero to
+            # relate near-bed velocity to moving-bed velocity
             x = np.vstack(near_bed_speed)
             corr_coef = np.linalg.lstsq(x, mb_speed, rcond=None)[0]
 
@@ -1285,7 +1536,9 @@ class QComp(object):
             bt_v = trans_data.boat_vel.bt_vel.v_processed_mps[in_transect_idx]
 
             # Compute near-bed velocities
-            nb_u, nb_v, unit_nb_u, unit_nb_v = QComp.near_bed_velocity(u, v, depth, depth_cell_depth)
+            nb_u, nb_v, unit_nb_u, unit_nb_v = QComp.near_bed_velocity(
+                u, v, depth, depth_cell_depth
+            )
 
             # Compute moving-bed vector for each ensemble
             mb_u = corr_coef * nb_u
@@ -1300,36 +1553,55 @@ class QComp(object):
             # Compute uncorrected discharge excluding the edges
             q_orig = top_q + middle_q + bottom_q
             if q_orig != 0:
-                # Compute corrected discharge excluding edges
                 # Compute corrected cross product
                 xprod = QComp.cross_product(transect=trans_data)
-                xprod_in = QComp.cross_product(w_vel_x=u_adj,
-                                               w_vel_y=v_adj,
-                                               b_vel_x=bt_u_adj,
-                                               b_vel_y=bt_v_adj,
-                                               start_edge=trans_data.start_edge)
+                xprod_in = QComp.cross_product(
+                    w_vel_x=u_adj,
+                    w_vel_y=v_adj,
+                    b_vel_x=bt_u_adj,
+                    b_vel_y=bt_v_adj,
+                    start_edge=trans_data.start_edge,
+                )
                 xprod[:, in_transect_idx] = xprod_in
 
                 # Compute corrected discharges
-                q_middle_cells = QComp.discharge_middle_cells(xprod=xprod, transect=trans_data, delta_t=delta_t)
+                q_middle_cells = QComp.discharge_middle_cells(
+                    xprod=xprod, transect=trans_data, delta_t=delta_t
+                )
                 trans_select = getattr(trans_data.depths, trans_data.depths.selected)
-                num_top_method = {'Power': 0, 'Constant': 1, '3-Point': 2, None: -1}
-                q_top = extrapolate_top(xprod,
-                                        trans_data.w_vel.valid_data[0, :, :],
-                                        num_top_method[trans_data.extrap.top_method],
-                                        trans_data.extrap.exponent, trans_data.in_transect_idx,
-                                        trans_select.depth_cell_size_m,
-                                        trans_select.depth_cell_depth_m, trans_select.depth_processed_m, delta_t,
-                                        -1, 0.1667)
-                num_bot_method = {'Power': 0, 'No Slip': 1, None: -1}
-                q_bot = extrapolate_bot(xprod,
-                                        trans_data.w_vel.valid_data[0, :, :],
-                                        num_bot_method[trans_data.extrap.bot_method],
-                                        trans_data.extrap.exponent, trans_data.in_transect_idx,
-                                        trans_select.depth_cell_size_m,
-                                        trans_select.depth_cell_depth_m, trans_select.depth_processed_m, delta_t,
-                                        -1, 0.1667)
-                q_adj = np.nansum(np.nansum(q_middle_cells)) + np.nansum(q_top) + np.nansum(q_bot)
+                num_top_method = {"Power": 0, "Constant": 1, "3-Point": 2, None: -1}
+                q_top = extrapolate_top(
+                    xprod,
+                    trans_data.w_vel.valid_data[0, :, :],
+                    num_top_method[trans_data.extrap.top_method],
+                    trans_data.extrap.exponent,
+                    trans_data.in_transect_idx,
+                    trans_select.depth_cell_size_m,
+                    trans_select.depth_cell_depth_m,
+                    trans_select.depth_processed_m,
+                    delta_t,
+                    -1,
+                    0.1667,
+                )
+                num_bot_method = {"Power": 0, "No Slip": 1, None: -1}
+                q_bot = extrapolate_bot(
+                    xprod,
+                    trans_data.w_vel.valid_data[0, :, :],
+                    num_bot_method[trans_data.extrap.bot_method],
+                    trans_data.extrap.exponent,
+                    trans_data.in_transect_idx,
+                    trans_select.depth_cell_size_m,
+                    trans_select.depth_cell_depth_m,
+                    trans_select.depth_processed_m,
+                    delta_t,
+                    -1,
+                    0.1667,
+                )
+                q_adj = (
+                    np.nansum(np.nansum(q_middle_cells))
+                    + np.nansum(q_top)
+                    + np.nansum(q_bot)
+                )
 
                 # Compute correction factor
                 correction_factor = q_adj / q_orig
@@ -1387,8 +1659,12 @@ class QComp(object):
                 z_depth[n] = depth[n] - np.nanmean(bin_depth[idx, n], 0)
                 u_mean[n] = np.nanmean(u[idx, n], 0)
                 v_mean[n] = np.nanmean(v[idx, n], 0)
-                nb_u[n] = (u_mean[n] / z_depth[n] ** (1. / 6.)) * (z_near_bed[n] ** (1. / 6.))
-                nb_v[n] = (v_mean[n] / z_depth[n] ** (1. / 6.)) * (z_near_bed[n] ** (1. / 6.))
+                nb_u[n] = (u_mean[n] / z_depth[n] ** (1.0 / 6.0)) * (
+                    z_near_bed[n] ** (1.0 / 6.0)
+                )
+                nb_v[n] = (v_mean[n] / z_depth[n] ** (1.0 / 6.0)) * (
+                    z_near_bed[n] ** (1.0 / 6.0)
+                )
                 speed_near_bed[n] = np.sqrt(nb_u[n] ** 2 + nb_v[n] ** 2)
                 unit_nbu[n] = nb_u[n] / speed_near_bed[n]
                 unit_nbv[n] = nb_v[n] / speed_near_bed[n]
@@ -1397,16 +1673,17 @@ class QComp(object):
 
     @staticmethod
     def valid_edge_ens(trans_data):
-        """Determines which ensembles contain sufficient valid data to allow computation of discharge.
-        
+        """Determines which ensembles contain sufficient valid data to allow
+        computation of discharge.
+
         Allows interpolated depth and boat velocity but requires valid
         non-interpolated water velocity.
-        
+
         Parameters
         ----------
         trans_data: TransectData
             Object of TransectData
-        
+
         Returns
         -------
         validEns: np.array(bool)
@@ -1420,16 +1697,20 @@ class QComp(object):
 
         boat_vel_selected = getattr(trans_data.boat_vel, trans_data.boat_vel.selected)
 
-        # Depending on type of interpolation determine the valid navigation ensembles
+        # Depending on type of interpolation determine the valid navigation
+        # ensembles
         if boat_vel_selected is not None and len(boat_vel_selected.u_processed_mps) > 0:
-            if boat_vel_selected.interpolate == 'TRDI':
+            if boat_vel_selected.interpolate == "TRDI":
                 nav_valid = boat_vel_selected.valid_data[0, in_transect_idx]
             else:
-                nav_valid = np.logical_not(np.isnan(boat_vel_selected.u_processed_mps[in_transect_idx]))
+                nav_valid = np.logical_not(
+                    np.isnan(boat_vel_selected.u_processed_mps[in_transect_idx])
+                )
         else:
             nav_valid = np.tile(False, len(in_transect_idx))
 
-        # Depending on type of interpolation determine the valid water track ensembles
+        # Depending on type of interpolation determine the valid water track
+        # ensembles
         if len(in_transect_idx) > 1:
             water_valid = np.any(trans_data.w_vel.valid_data[0, :, in_transect_idx], 1)
         else:
@@ -1438,9 +1719,12 @@ class QComp(object):
         # Determine the ensembles with valid depth
         depths_select = getattr(trans_data.depths, trans_data.depths.selected)
         if depths_select is not None:
-            depth_valid = np.logical_not(np.isnan(depths_select.depth_processed_m[in_transect_idx]))
+            depth_valid = np.logical_not(
+                np.isnan(depths_select.depth_processed_m[in_transect_idx])
+            )
 
-            # Determine the ensembles with valid depth, navigation, and water data
+            # Determine the ensembles with valid depth, navigation,
+            # and water data
             valid_ens = np.all(np.vstack((nav_valid, water_valid, depth_valid)), 0)
         else:
             valid_ens = []
@@ -1449,7 +1733,8 @@ class QComp(object):
 
     @staticmethod
     def discharge_interpolated(q_top_ens, q_mid_cells, q_bot_ens, transect):
-        """Determines the amount of discharge in interpolated cells and ensembles.
+        """Determines the amount of discharge in interpolated cells and
+        ensembles.
 
         Parameters
         ----------
@@ -1477,8 +1762,9 @@ class QComp(object):
         #  Method to compute invalid ensemble discharge depends on if
         # navigation data are interpolated (QRev) or if expanded delta
         # time is used to compute discharge for invalid ensembles(TRDI)
-        if transect.boat_vel.bt_vel.interpolate == 'None':
-            # Compute discharge in invalid ensembles for expanded delta time situation
+        if transect.boat_vel.bt_vel.interpolate == "None":
+            # Compute discharge in invalid ensembles for expanded delta time
+            # situation
             # Find index of invalid ensembles followed by a valid ensemble
             idx_next_valid = np.where(np.diff(np.hstack((-2, valid_ens))) == 1)[0]
             if len(idx_next_valid) == 0:
@@ -1488,30 +1774,42 @@ class QComp(object):
                 idx_next_valid += 1
 
                 # Sum discharge in valid ensembles following invalid ensemble
-                q_int_ens = np.nansum(q_mid_cells[:, idx_next_valid]) \
-                    + q_bot_ens[idx_next_valid] + q_top_ens[idx_next_valid]
-
-                # Determine number of invalid ensembles preceding valid ensemble
+                q_int_ens = (
+                    np.nansum(q_mid_cells[:, idx_next_valid])
+                    + q_bot_ens[idx_next_valid]
+                    + q_top_ens[idx_next_valid]
+                )
+
+                # Determine number of invalid ensembles preceding valid
+                # ensemble
                 run_length_false, _ = QComp.compute_run_length(valid_ens)
 
-                # Adjust run_length_false for situation where the transect ends with invalid ensembles
+                # Adjust run_length_false for situation where the transect
+                # ends with invalid ensembles
                 if len(run_length_false) > len(q_int_ens):
                     run_length_false = run_length_false[:-1]
 
-                # Adjust discharge to remove the discharge that would have been measured in the valid ensemble
-                q_int_ens = np.nansum(q_int_ens * (run_length_false / (run_length_false+1)))
+                # Adjust discharge to remove the discharge that would have
+                # been measured in the valid ensemble
+                q_int_ens = np.nansum(
+                    q_int_ens * (run_length_false / (run_length_false + 1))
+                )
 
         else:
-            # Compute discharge in invalid ensembles where all data were interpolated
-            q_int_ens = np.nansum(np.nansum(q_mid_cells[:, np.logical_not(valid_ens)])) \
-                        + np.nansum(q_top_ens[np.logical_not(valid_ens)]) \
-                        + np.nansum(q_bot_ens[np.logical_not(valid_ens)])
+            # Compute discharge in invalid ensembles where all data were
+            # interpolated
+            q_int_ens = (
+                np.nansum(np.nansum(q_mid_cells[:, np.logical_not(valid_ens)]))
+                + np.nansum(q_top_ens[np.logical_not(valid_ens)])
+                + np.nansum(q_bot_ens[np.logical_not(valid_ens)])
+            )
 
         return q_int_cells, q_int_ens
 
     @staticmethod
     def compute_run_length(bool_vector):
-        """Compute how many false or true consecutive values are in every run of true or false in the
+        """Compute how many false or true consecutive values are in every
+        run of true or false in the
         provided boolean vector.
 
         Parameters
@@ -1539,32 +1837,286 @@ class QComp(object):
         else:
             true_start = 1
             false_start = 0
-        run_length_false = run_length[bool_vector[false_start]::2]
-        run_length_true = run_length[bool_vector[true_start]::2]
+        run_length_false = run_length[bool_vector[false_start] :: 2]
+        run_length_true = run_length[bool_vector[true_start] :: 2]
 
         return run_length_false, run_length_true
 
-    # ============================================================================================
+    def compute_topbot_speed(self, transect):
+        """Compute top and bottom extrapolated speed.
+
+        Parameters
+        ----------
+        transect: TransectData
+        """
+
+        delta_t = np.tile(1.0, transect.w_vel.u_processed_mps.shape[1])
+
+        # Compute extrapolated cell size and depth
+        n_ensembles = transect.w_vel.u_processed_mps.shape[1]
+        depth_selected = getattr(transect.depths, transect.depths.selected)
+        top_cell_size = np.repeat(np.nan, n_ensembles)
+        top_cell_depth = np.repeat(np.nan, n_ensembles)
+        bottom_cell_size = np.repeat(np.nan, n_ensembles)
+        bottom_cell_depth = np.repeat(np.nan, n_ensembles)
+        for n in range(n_ensembles):
+            # Identify topmost 1 and 3 valid cells
+            idx_temp = np.where(
+                np.logical_not(np.isnan(transect.w_vel.u_processed_mps[:, n]))
+            )[0]
+            if len(idx_temp) > 0:
+                # Compute top
+                top_cell_size[n] = (
+                    depth_selected.depth_cell_depth_m[idx_temp[0], n]
+                    - 0.5 * depth_selected.depth_cell_size_m[idx_temp[0], n]
+                )
+                top_cell_depth[n] = top_cell_size[n] / 2
+                # Compute bottom
+                bottom_cell_size[n] = depth_selected.depth_processed_m[n] - (
+                    depth_selected.depth_cell_depth_m[idx_temp[-1], n]
+                    + 0.5 * depth_selected.depth_cell_size_m[idx_temp[-1], n]
+                )
+                bottom_cell_depth[n] = (
+                    depth_selected.depth_processed_m[n] - 0.5 * bottom_cell_size[n]
+                )
+            else:
+                top_cell_size[n] = 0
+                top_cell_depth[n] = 0
+                bottom_cell_size[n] = 0
+                bottom_cell_depth[n] = 0
+        # Compute top speed
+        u = (
+            self.compute_top_component(
+                transect=transect,
+                component=transect.w_vel.u_processed_mps,
+                delta_t=delta_t,
+            )
+            / top_cell_size
+        )
+        v = (
+            self.compute_top_component(
+                transect=transect,
+                component=transect.w_vel.v_processed_mps,
+                delta_t=delta_t,
+            )
+            / top_cell_size
+        )
+        self.top_speed = np.sqrt(u**2 + v**2)
+
+        # Compute bottom speed
+        u = (
+            self.compute_bottom_component(
+                transect=transect,
+                component=transect.w_vel.u_processed_mps,
+                delta_t=delta_t,
+            )
+            / bottom_cell_size
+        )
+        v = (
+            self.compute_bottom_component(
+                transect=transect,
+                component=transect.w_vel.v_processed_mps,
+                delta_t=delta_t,
+            )
+            / bottom_cell_size
+        )
+        self.bottom_speed = np.sqrt(u**2 + v**2)
+
+    @staticmethod
+    def compute_top_component(transect, component, delta_t):
+        """Compute the extrapolated top value for the specified component.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        component: np.array(float)
+            Component to be extrapolated
+        delta_t: np.array(float)
+            Duration of each ensemble computed from QComp
+
+        Returns
+        -------
+        top_component: np.array(float)
+            Top extrapolated values
+        """
+
+        depth_selected = getattr(transect.depths, transect.depths.selected)
+        num_top_method = {"Power": 0, "Constant": 1, "3-Point": 2, None: -1}
+        try:
+            # Top extrapolated speed
+            top_component = extrapolate_top(
+                component,
+                transect.w_vel.valid_data[0, :, :],
+                num_top_method[transect.extrap.top_method],
+                transect.extrap.exponent,
+                transect.in_transect_idx,
+                depth_selected.depth_cell_size_m,
+                depth_selected.depth_cell_depth_m,
+                depth_selected.depth_processed_m,
+                delta_t,
+                -1,
+                0.1667,
+            )
+        except SystemError:
+            top_component = QComp.extrapolate_top(
+                xprod=component,
+                w_valid_data=transect.w_vel.valid_data[0, :, :],
+                transect_top_method=num_top_method[transect.extrap.top_method],
+                transect_exponent=transect.extrap.exponent,
+                in_transect_idx=transect.in_transect_idx,
+                depth_cell_size_m=depth_selected.depth_cell_size_m,
+                depth_cell_depth_m=depth_selected.depth_cell_depth_m,
+                depth_processed_m=depth_selected.depth_processed_m,
+                delta_t=delta_t,
+            )
+        return top_component
+
+    @staticmethod
+    def compute_bottom_component(transect, component, delta_t):
+        """Compute the extrapolated bottom value for the specified component.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        component: np.array(float)
+            Component to be extrapolated
+        delta_t: np.array(float)
+            Duration of each ensemble computed from QComp
+
+        Returns
+        -------
+        bottom_component: np.array(float)
+            Bottom extrapolated values
+        """
+
+        depth_selected = getattr(transect.depths, transect.depths.selected)
+        num_bot_method = {"Power": 0, "No Slip": 1, None: -1}
+        try:
+            bottom_component = extrapolate_bot(
+                component,
+                transect.w_vel.valid_data[0, :, :],
+                num_bot_method[transect.extrap.bot_method],
+                transect.extrap.exponent,
+                transect.in_transect_idx,
+                depth_selected.depth_cell_size_m,
+                depth_selected.depth_cell_depth_m,
+                depth_selected.depth_processed_m,
+                delta_t,
+                -1,
+                0.1667,
+            )
+        except SystemError:
+            bottom_component = QComp.extrapolate_bot(
+                xprod=component,
+                w_valid_data=transect.w_vel.valid_data[0, :, :],
+                transect_bot_method=num_bot_method[transect.extrap.bot_method],
+                transect_exponent=transect.extrap.exponent,
+                in_transect_idx=transect.in_transect_idx,
+                depth_cell_size_m=depth_selected.depth_cell_size_m,
+                depth_cell_depth_m=depth_selected.depth_cell_depth_m,
+                depth_processed_m=depth_selected.depth_processed_m,
+                delta_t=delta_t,
+            )
+        return bottom_component
+
+    def compute_edge_speed(self, transect):
+
+        # Left edge
+
+        # Determine what ensembles to use for edge computation.
+        # The method of determining varies by manufacturer
+        edge_idx = QComp.edge_ensembles("left", transect)
+
+        # Average depth for the edge ensembles
+        depth_selected = getattr(transect.depths, transect.depths.selected)
+        depth = depth_selected.depth_processed_m[edge_idx]
+        depth_avg = np.nanmean(depth)
+
+        # Compute area
+        if transect.edges.left.type == "Triangular":
+            a = 0.5 * transect.edges.left.distance_m * depth_avg
+        elif transect.edges.left.type == "Rectangular":
+            a = transect.edges.left.distance_m * depth_avg
+        else:
+            cd = compute_edge_cd(transect.edges.left)
+            a = (
+                transect.edges.left.distance_m * depth_avg * cd
+                + 0.5 * transect.edges.left.distance_m * depth_avg * (1 - cd)
+            )
+        self.left_edge_speed = np.abs(self.left / a)
+
+        # Right edge
+
+        # Determine what ensembles to use for edge computation.
+        # The method of determining varies by manufacturer
+        edge_idx = QComp.edge_ensembles("right", transect)
+
+        # Average depth for the edge ensembles
+        depth_selected = getattr(transect.depths, transect.depths.selected)
+        depth = depth_selected.depth_processed_m[edge_idx]
+        depth_avg = np.nanmean(depth)
+
+        # Compute area
+        if transect.edges.right.type == "Triangular":
+            a = 0.5 * transect.edges.right.distance_m * depth_avg
+        elif transect.edges.right.type == "Rectangular":
+            a = transect.edges.right.distance_m * depth_avg
+        else:
+            cd = compute_edge_cd(transect.edges.right)
+            a = (
+                transect.edges.right.distance_m * depth_avg * cd
+                + 0.5 * transect.edges.right.distance_m * depth_avg * (1 - cd)
+            )
+        self.right_edge_speed = np.abs(self.right / a)
+
+    # ========================================================================
     # The methods below are not being used in the discharge computations.
-    # The methods for extrapolating the top and bottom discharge have been moved to separate files
-    # and compiled using Numba AOT. The methods below are included here for historical purposes
-    # and may provide an easier approach to adding new features/algorithms prior to recoding
-    # them in a manner that can be compiled using Numba AOT.
-    # =============================================================================================
+    # The methods for extrapolating the top and bottom discharge have been
+    # moved to separate files and compiled using Numba AOT. The methods below
+    # are included here forhistorical purposes and may provide an easier approach
+    # to adding new features/algorithms prior to recoding them in a manner that
+    # can be compiled using Numba AOT.
+    # ========================================================================
 
     @staticmethod
-    def extrapolate_top(xprod, transect, delta_t, top_method=None, exponent=None):
+    def extrapolate_top(
+        xprod,
+        w_valid_data,
+        transect_top_method,
+        transect_exponent,
+        in_transect_idx,
+        depth_cell_size_m,
+        depth_cell_depth_m,
+        depth_processed_m,
+        delta_t,
+        top_method=-1,
+        exponent=0.1667,
+    ):
         """Computes the extrapolated top discharge.
 
         Parameters
         ----------
         xprod: np.array(float)
             Cross product computed from the cross product method
-        transect: TransectData
-            Object of TransectData
+        w_valid_data: np.array(bool)
+            Valid water data
+        transect_top_method: int
+            Stored top method (power = 0, constant = 1, 3-point = 2)
+        transect_exponent: float
+            Exponent for power fit
+        in_transect_idx: np.array(int)
+            Indices of ensembles in transect to be used for discharge
+        depth_cell_size_m: np.array(float)
+            Size of each depth cell in m
+        depth_cell_depth_m: np.array(float)
+            Depth of each depth cell in m
+        depth_processed_m: np.array(float)
+            Depth for each ensemble in m
         delta_t: np.array(float)
             Duration of each ensemble computed from QComp
-        top_method: str
+        top_method: int
             Specifies method to use for top extrapolation
         exponent: float
             Exponent to use for power extrapolation
@@ -1575,62 +2127,84 @@ class QComp(object):
             Top extrapolated discharge for each ensemble
         """
 
-        if top_method is None:
-            top_method = transect.extrap.top_method
-            exponent = transect.extrap.exponent
-
-        # Get index for ensembles in moving-boat portion of transect
-        in_transect_idx = transect.in_transect_idx
+        if top_method == -1:
+            top_method = transect_top_method
+            exponent = transect_exponent
 
         # Compute top variables
-        idx_top, idx_top3, top_rng = QComp.top_variables(xprod, transect)
+        idx_top, idx_top3, top_rng = QComp.top_variables(
+            xprod, w_valid_data, depth_cell_size_m, depth_cell_depth_m
+        )
         idx_top = idx_top[in_transect_idx]
         idx_top3 = idx_top3[:, in_transect_idx]
         top_rng = top_rng[in_transect_idx]
 
         # Get data from transect object
-        trans_select = getattr(transect.depths, transect.depths.selected)
-        cell_size = trans_select.depth_cell_size_m[:, in_transect_idx]
-        cell_depth = trans_select.depth_cell_depth_m[:, in_transect_idx]
-        depth_ens = trans_select.depth_processed_m[in_transect_idx]
+        cell_size = depth_cell_size_m[:, in_transect_idx]
+        cell_depth = depth_cell_depth_m[:, in_transect_idx]
+        depth_ens = depth_processed_m[in_transect_idx]
 
         # Compute z
         z = np.subtract(depth_ens, cell_depth)
 
         # Use only valid data
         valid_data = np.logical_not(np.isnan(xprod[:, in_transect_idx]))
-        z[np.logical_not(valid_data)] = np.nan
-        cell_size[np.logical_not(valid_data)] = np.nan
-        cell_depth[np.logical_not(valid_data)] = np.nan
+        for row in range(valid_data.shape[0]):
+            for col in range(valid_data.shape[1]):
+                if not valid_data[row, col]:
+                    z[row, col] = np.nan
+                    cell_size[row, col] = np.nan
+                    cell_depth[row, col] = np.nan
 
         # Compute top discharge
-        q_top = QComp.discharge_top(top_method, exponent, idx_top, idx_top3, top_rng,
-                                    xprod[:, in_transect_idx], cell_size, cell_depth,
-                                    depth_ens, delta_t, z)
+        q_top = QComp.discharge_top(
+            top_method,
+            exponent,
+            idx_top,
+            idx_top3,
+            top_rng,
+            xprod[:, in_transect_idx],
+            cell_size,
+            cell_depth,
+            depth_ens,
+            delta_t,
+            z,
+        )
 
         return q_top
 
     @staticmethod
-    def discharge_top(top_method, exponent, idx_top, idx_top_3, top_rng, component, cell_size, cell_depth,
-                      depth_ens, delta_t, z):
+    def discharge_top(
+        top_method,
+        exponent,
+        idx_top,
+        idx_top_3,
+        top_rng,
+        component,
+        cell_size,
+        cell_depth,
+        depth_ens,
+        delta_t,
+        z,
+    ):
         """Computes the top extrapolated value of the provided component.
 
         Parameters
         ----------
-        top_method: str
-            Top extrapolation method (Power, Constant, 3-Point)
+        top_method: int
+            Top extrapolation method (Power = 0, Constant = 1, 3-Point = 2)
         exponent: float
             Exponent for the power extrapolation method
-        idx_top:
+        idx_top: np.array(int)
             Index to the topmost valid depth cell in each ensemble
-        idx_top_3:
+        idx_top_3: np.array(int)
             Index to the top 3 valid depth cells in each ensemble
         top_rng: np.array(float)
             Range from the water surface to the top of the topmost cell
         component: np.array(float)
             The variable to be extrapolated (xprod, u-velocity, v-velocity)
         cell_size: np.array(float)
-            Array of cellsizes (n cells x n ensembles)
+            Array of cell sizes (n cells x n ensembles)
         cell_depth: np.array(float)
             Depth of each cell (n cells x n ensembles)
         depth_ens: np.array(float)
@@ -1638,65 +2212,121 @@ class QComp(object):
         delta_t: np.array(float)
             Duration of each ensemble compute by QComp
         z: np.array(float)
-            Relative depth from the bottom of each depth cell computed in discharge top method
+            Relative depth from the bottom of each depth cell computed in
+            discharge top method
 
         Returns
         -------
-        top_value: total for the specified component integrated over the top range
+        top_value: np.array(float)
+            total for the specified component integrated over the top range
         """
 
         # Initialize return
-        top_value = 0
+        top_value = np.array([0.0])
 
         # Top power extrapolation
-        if top_method == 'Power':
-            numerator = ((exponent + 1) * np.nansum(component * cell_size, 0))
-            denominator = np.nansum(((z + 0.5 * cell_size)**(exponent+1)) - ((z - 0.5 * cell_size)**(exponent+1)), 0)
-            coef = np.divide(numerator, denominator, where=denominator != 0)
-            coef[denominator == 0] = np.nan
-            top_value = delta_t * (coef / (exponent + 1)) * \
-                (depth_ens**(exponent + 1) - (depth_ens-top_rng)**(exponent + 1))
+        if top_method == 0:
+            coef = np.repeat(np.nan, int(component.shape[1]))
+
+            # Compute the coefficient for each ensemble
+            # Loops are used for Numba compile purposes
+
+            # Loop through ensembles
+            for col in range(component.shape[1]):
+                # Initialize variables
+                numerator = 0.0
+                numerator_valid = False
+                denominator_valid = False
+                denominator = 0.0
+
+                # Loop through depth cells in an ensemble
+                for row in range(component.shape[0]):
+
+                    # Compute the numerator
+                    numerator_temp = component[row, col] * cell_size[row, col]
+                    if np.logical_not(np.isnan(numerator_temp)):
+                        numerator_valid = True
+                        numerator = numerator + numerator_temp
+
+                    # Compute the denominator
+                    denominator_temp = (
+                        (z[row, col] + 0.5 * cell_size[row, col]) ** (exponent + 1)
+                    ) - ((z[row, col] - 0.5 * cell_size[row, col]) ** (exponent + 1))
+                    if (
+                        np.logical_not(np.isnan(denominator_temp))
+                        and denominator_temp != 0
+                    ):
+                        denominator_valid = True
+                        denominator = denominator + denominator_temp
+
+                # If both numerator and denominator are valid compute the coefficient
+                if numerator_valid and denominator_valid:
+                    coef[col] = (numerator * (1 + exponent)) / denominator
+
+            # Compute the top discharge for each ensemble
+            top_value = (
+                delta_t
+                * (coef / (exponent + 1))
+                * (
+                    depth_ens ** (exponent + 1)
+                    - (depth_ens - top_rng) ** (exponent + 1)
+                )
+            )
 
         # Top constant extrapolation
-        elif top_method == 'Constant':
+        elif top_method == 1:
             n_ensembles = len(delta_t)
-            top_value = np.tile([np.nan], n_ensembles)
+            top_value = np.repeat(np.nan, n_ensembles)
             for j in range(n_ensembles):
                 if idx_top[j] >= 0:
                     top_value[j] = delta_t[j] * component[idx_top[j], j] * top_rng[j]
 
         # Top 3-point extrapolation
-        elif top_method == '3-Point':
+        elif top_method == 2:
             # Determine number of bins available in each profile
             valid_data = np.logical_not(np.isnan(component))
-            n_bins = np.nansum(valid_data, 0)
+            n_bins = np.sum(valid_data, axis=0)
             # Determine number of ensembles
             n_ensembles = len(delta_t)
             # Preallocate qtop vector
-            top_value = np.tile([np.nan], n_ensembles)
+            top_value = np.repeat(np.nan, n_ensembles)
 
+            # Loop through ensembles
             for j in range(n_ensembles):
 
+                # Set default to constant
                 if (n_bins[j] < 6) and (n_bins[j] > 0) and (idx_top[j] >= 0):
                     top_value[j] = delta_t[j] * component[idx_top[j], j] * top_rng[j]
 
                 # If 6 or more bins use 3-pt at top
                 if n_bins[j] > 5:
-                    sumd = np.nansum(cell_depth[idx_top_3[0:3, j], j])
-                    sumd2 = np.nansum(cell_depth[idx_top_3[0:3, j], j]**2)
-                    sumq = np.nansum(component[idx_top_3[0:3, j], j])
-                    sumqd = np.nansum(component[idx_top_3[0:3, j], j] * cell_depth[idx_top_3[0:3, j], j])
+                    sumd = 0.0
+                    sumd2 = 0.0
+                    sumq = 0.0
+                    sumqd = 0.0
+
+                    # Use loop to sum data from top 3 cells
+                    for k in range(3):
+                        if not np.isnan(cell_depth[idx_top_3[k, j], j]):
+                            sumd = sumd + cell_depth[idx_top_3[k, j], j]
+                            sumd2 = sumd2 + cell_depth[idx_top_3[k, j], j] ** 2
+                            sumq = sumq + component[idx_top_3[k, j], j]
+                            sumqd = sumqd + (
+                                component[idx_top_3[k, j], j]
+                                * cell_depth[idx_top_3[k, j], j]
+                            )
                     delta = 3 * sumd2 - sumd**2
                     a = (3 * sumqd - sumq * sumd) / delta
                     b = (sumq * sumd2 - sumqd * sumd) / delta
+
                     # Compute discharge for 3-pt fit
-                    qo = (a * top_rng[j]**2) / 2 + b * top_rng[j]
+                    qo = (a * top_rng[j] ** 2) / 2 + b * top_rng[j]
                     top_value[j] = delta_t[j] * qo
 
         return top_value
 
     @staticmethod
-    def top_variables(xprod, transect):
+    def top_variables(xprod, w_valid_data, depth_cell_size_m, depth_cell_depth_m):
         """Computes the index to the top and top three valid cells in each ensemble and
         the range from the water surface to the top of the topmost cell.
 
@@ -1704,32 +2334,35 @@ class QComp(object):
         ----------
         xprod: np.array(float)
             Cross product computed from the cross product method
-        transect: TransectData
-            Object of TransectData
+        w_valid_data: np.array(bool)
+            Valid water data
+        depth_cell_size_m: np.array(float)
+            Size of each depth cell in m
+        depth_cell_depth_m: np.array(float)
+            Depth of each depth cell in m
 
         Returns
         -------
-        idx_top: np.array
+        idx_top: np.array(int)
             Index to the topmost valid depth cell in each ensemble
-        idx_top_3: np.array
+        idx_top_3: np.array(int)
             Index to the top 3 valid depth cell in each ensemble
         top_rng: np.array(float)
             Range from the water surface to the top of the topmost cell
         """
 
         # Get data from transect object
-        valid_data1 = np.copy(transect.w_vel.valid_data[0, :, :])
+        valid_data1 = np.copy(w_valid_data)
         valid_data2 = np.logical_not(np.isnan(xprod))
-        valid_data = valid_data1 * valid_data2
-        trans_select = getattr(transect.depths, transect.depths.selected)
-        cell_size = trans_select.depth_cell_size_m
-        cell_depth = trans_select.depth_cell_depth_m
+        valid_data = np.logical_and(valid_data1, valid_data2)
 
         # Preallocate variables
-        n_ensembles = valid_data.shape[1]
-        idx_top = np.tile(-1, valid_data.shape[1]).astype(int)
-        idx_top_3 = np.tile(-1, (3, valid_data.shape[1])).astype(int)
-        top_rng = np.tile([np.nan], n_ensembles)
+        # NOTE: Numba does not support np.tile
+        n_ensembles = int(valid_data.shape[1])
+        idx_top = np.repeat(-1, int(valid_data.shape[1]))
+        idx_top_3 = np.ones((3, int(valid_data.shape[1])), dtype=np.int32)
+        idx_top_3[:] = int(-1)
+        top_rng = np.repeat(np.nan, n_ensembles)
 
         # Loop through ensembles
         for n in range(n_ensembles):
@@ -1738,9 +2371,13 @@ class QComp(object):
             if len(idx_temp) > 0:
                 idx_top[n] = idx_temp[0]
                 if len(idx_temp) > 2:
-                    idx_top_3[:, n] = idx_temp[0:3]
+                    for k in range(3):
+                        idx_top_3[k, n] = idx_temp[k]
                 # Compute top range
-                top_rng[n] = cell_depth[idx_top[n], n] - 0.5 * cell_size[idx_top[n], n]
+                top_rng[n] = (
+                    depth_cell_depth_m[idx_top[n], n]
+                    - 0.5 * depth_cell_size_m[idx_top[n], n]
+                )
             else:
                 top_rng[n] = 0
                 idx_top[n] = 0
@@ -1748,21 +2385,45 @@ class QComp(object):
         return idx_top, idx_top_3, top_rng
 
     @staticmethod
-    def extrapolate_bot(xprod, transect, delta_t, bot_method=None, exponent=None):
+    def extrapolate_bot(
+        xprod,
+        w_valid_data,
+        transect_bot_method,
+        transect_exponent,
+        in_transect_idx,
+        depth_cell_size_m,
+        depth_cell_depth_m,
+        depth_processed_m,
+        delta_t,
+        bot_method=-1,
+        exponent=0.1667,
+    ):
         """Computes the extrapolated bottom discharge
 
         Parameters
         ----------
         xprod: np.array(float)
-            Cross product of the water and boat velocities
-        transect: TransectData
-            Object of TransectData
+            Cross product computed from the cross product method
+        w_valid_data: np.array(bool)
+            Valid water data
+        transect_bot_method: int
+            Stored bottom method (power = 0, no slip = 1)
+        transect_exponent: float
+            Exponent for power fit
+        in_transect_idx: np.array(int)
+            Indices of ensembles in transect to be used for discharge
+        depth_cell_size_m: np.array(float)
+            Size of each depth cell in m
+        depth_cell_depth_m: np.array(float)
+            Depth of each depth cell in m
+        depth_processed_m: np.array(float)
+            Depth for each ensemble in m
         delta_t: np.array(float)
-            Duration of each ensemble
-        bot_method: str
-            Bottom extrapolation method
+            Duration of each ensemble computed from QComp
+        bot_method: int
+            Specifies method to use for top extrapolation
         exponent: float
-            Bottom extrapolation exponent
+            Exponent to use for power extrapolation
 
         Returns
         -------
@@ -1771,49 +2432,70 @@ class QComp(object):
         """
 
         # Determine extrapolation methods and exponent
-        if bot_method is None:
-            bot_method = transect.extrap.bot_method
-            exponent = transect.extrap.exponent
+        if bot_method == -1:
+            bot_method = transect_bot_method
+            exponent = transect_exponent
 
-        # Get index for ensembles in moving-boat portion of transect
-        in_transect_idx = transect.in_transect_idx
+        # Use only data in transect
+        w_valid_data = w_valid_data[:, in_transect_idx]
         xprod = xprod[:, in_transect_idx]
+        cell_size = depth_cell_size_m[:, in_transect_idx]
+        cell_depth = depth_cell_depth_m[:, in_transect_idx]
+        depth_ens = depth_processed_m[in_transect_idx]
+        delta_t = delta_t[in_transect_idx]
 
         # Compute bottom variables
-        idx_bot, bot_rng = QComp.bot_variables(xprod, transect)
-
-        # Get data from transect properties
-        trans_select = getattr(transect.depths, transect.depths.selected)
-        cell_size = trans_select.depth_cell_size_m[:, in_transect_idx]
-        cell_depth = trans_select.depth_cell_depth_m[:, in_transect_idx]
-        depth_ens = trans_select.depth_processed_m[in_transect_idx]
+        bot_rng = QComp.bot_variables(
+            xprod, w_valid_data, cell_size, cell_depth, depth_ens
+        )
 
         # Compute z
         z = np.subtract(depth_ens, cell_depth)
+
+        # Use only valid data
         valid_data = np.logical_not(np.isnan(xprod))
-        z[np.logical_not(valid_data)] = np.nan
-        z[nan_less(z, 0)] = np.nan
-        cell_size[np.logical_not(valid_data)] = np.nan
-        cell_depth[np.logical_not(valid_data)] = np.nan
+        for row in range(valid_data.shape[0]):
+            for col in range(valid_data.shape[1]):
+                if not valid_data[row, col]:
+                    z[row, col] = np.nan
+                    cell_size[row, col] = np.nan
+                    cell_depth[row, col] = np.nan
+
         # Compute bottom discharge
-        q_bot = QComp.discharge_bot(bot_method, exponent, idx_bot, bot_rng, xprod,
-                                    cell_size, cell_depth, depth_ens, delta_t, z)
+        q_bot = QComp.discharge_bot(
+            bot_method,
+            exponent,
+            bot_rng,
+            xprod,
+            cell_size,
+            cell_depth,
+            depth_ens,
+            delta_t,
+            z,
+        )
 
         return q_bot
 
     @staticmethod
-    def discharge_bot(bot_method, exponent, idx_bot, bot_rng, component,
-                      cell_size, cell_depth, depth_ens, delta_t, z):
+    def discharge_bot(
+        bot_method,
+        exponent,
+        bot_rng,
+        component,
+        cell_size,
+        cell_depth,
+        depth_ens,
+        delta_t,
+        z,
+    ):
         """Computes the bottom extrapolated value of the provided component.
 
         Parameters
         ----------
-        bot_method: str
+        bot_method: int
             Bottom extrapolation method (Power, No Slip)
         exponent: float
             Exponent for power and no slip
-        idx_bot:
-            Index to the bottom most valid depth cell in each ensemble
         bot_rng: np.array(float)
             Range from the streambed to the bottom of the bottom most cell
         component: np.array(float)
@@ -1832,94 +2514,183 @@ class QComp(object):
         Returns
         -------
         bot_value: np.array(float)
-            Total for the specified component integrated over the bottom range for each ensemble
+            Total for the specified component integrated over the bottom range
+            for each ensemble
         """
 
         # Initialize
-        coef = 0
+        coef = np.repeat(np.nan, int(component.shape[1]))
 
         # Bottom power extrapolation
-        if bot_method == 'Power':
-            numerator = ((exponent+1) * np.nansum(component * cell_size, 0))
-            denominator = np.nansum(((z + 0.5 * cell_size)**(exponent + 1)) - (z - 0.5 * cell_size)**(exponent + 1), 0)
-            coef = np.divide(numerator, denominator, where=denominator != 0)
-            coef[denominator == 0] = np.nan
+        if bot_method == 0:
+            # Compute the coefficient for each ensemble
+            # Loops are used for Numba compile purposes
+
+            # Loop through ensembles
+            for col in range(component.shape[1]):
+                numerator = 0.0
+                numerator_valid = False
+                denominator_valid = False
+                denominator = 0.0
+
+                # Loop through depth cells in an ensemble
+                for row in range(component.shape[0]):
+
+                    # Compute the numerator
+                    numerator_temp = component[row, col] * cell_size[row, col]
+                    if np.logical_not(np.isnan(numerator_temp)):
+                        numerator_valid = True
+                        numerator = numerator + numerator_temp
+
+                    # Compute the denominator
+                    denominator_temp = (
+                        (z[row, col] + 0.5 * cell_size[row, col]) ** (exponent + 1)
+                    ) - ((z[row, col] - 0.5 * cell_size[row, col]) ** (exponent + 1))
+                    if (
+                        np.logical_not(np.isnan(denominator_temp))
+                        and denominator_temp != 0
+                    ):
+                        denominator_valid = True
+                        denominator = denominator + denominator_temp
+
+                # If both numerator and denominator are valid compute the coefficient
+                if numerator_valid and denominator_valid:
+                    coef[col] = (numerator * (1 + exponent)) / denominator
 
         # Bottom no slip extrapolation
-        elif bot_method == 'No Slip':
+        elif bot_method == 1:
             # Valid data in the lower 20% of the water column or
             # the last valid depth cell are used to compute the no slip power fit
             cutoff_depth = 0.8 * depth_ens
-            depth_ok = (nan_greater(cell_depth, np.tile(cutoff_depth, (cell_depth.shape[0], 1))))
-            component_ok = np.logical_not(np.isnan(component))
-            use_ns = depth_ok * component_ok
-            for j in range(len(delta_t)):
-                if idx_bot[j] >= 0:
-                    use_ns[idx_bot[j], j] = 1
-
-            # Create cross product and z arrays for the data to be used in
-            # no slip computations
-            component_ns = np.copy(component)
-            component_ns[np.logical_not(use_ns)] = np.nan
-            z_ns = np.copy(z)
-            z_ns[np.logical_not(use_ns)] = np.nan
-            numerator = ((exponent + 1) * np.nansum(component_ns * cell_size, 0))
-            denominator = np.nansum(((z_ns + 0.5 * cell_size) ** (exponent + 1))
-                                    - ((z_ns - 0.5 * cell_size) ** (exponent + 1)), 0)
-            coef = np.divide(numerator, denominator, where=denominator != 0)
-            coef[denominator == 0] = np.nan
+
+            # Loop through the ensembles
+            for col in range(cell_depth.shape[1]):
+                numerator = 0.0
+                denominator = 0.0
+                numerator_valid = False
+                denominator_valid = False
+                cells_below_cutoff = False
+                last_cell_depth = np.nan
+                last_cell_size = np.nan
+                last_z = np.nan
+                last_component = np.nan
+
+                # Verify there are valid depth cutoffs
+                if np.any(np.logical_not(np.isnan(cutoff_depth))):
+
+                    # Loop through depth cells
+                    for row in range(cell_depth.shape[0]):
+
+                        # Identify last valid cell by end of loop
+                        if np.logical_not(np.isnan(cell_depth[row, col])):
+                            last_cell_depth = cell_depth[row, col]
+                            last_cell_size = cell_size[row, col]
+                            last_z = z[row, col]
+                            last_component = component[row, col]
+
+                            # Use all depth cells below the cutoff (1 per loop)
+                            if (cell_depth[row, col] - cutoff_depth[col]) >= 0:
+                                cells_below_cutoff = True
+
+                                # Compute numerator
+                                numerator_temp = (
+                                    component[row, col] * cell_size[row, col]
+                                )
+                                if np.logical_not(np.isnan(numerator_temp)):
+                                    numerator_valid = True
+                                    numerator = numerator + numerator_temp
+
+                                    # If numerator computed, compute denominator
+                                    denominator_temp = (
+                                        (z[row, col] + 0.5 * cell_size[row, col])
+                                        ** (exponent + 1)
+                                    ) - (
+                                        (z[row, col] - 0.5 * cell_size[row, col])
+                                        ** (exponent + 1)
+                                    )
+                                    if (
+                                        np.logical_not(np.isnan(denominator_temp))
+                                        and denominator_temp != 0
+                                    ):
+                                        denominator_valid = True
+                                        denominator = denominator + denominator_temp
+
+                    # If there are not cells below the cutoff, use the last valid depth cell
+                    if np.logical_not(cells_below_cutoff):
+                        if np.logical_not(np.isnan(last_cell_depth)):
+                            # Compute numerator
+                            numerator_temp = last_component * last_cell_size
+                            if np.logical_not(np.isnan(numerator_temp)):
+                                numerator_valid = True
+                                numerator = numerator + numerator_temp
+
+                                # If numerator computed, compute denominator
+                                denominator_temp = (
+                                    (last_z + 0.5 * last_cell_size) ** (exponent + 1)
+                                ) - ((last_z - 0.5 * last_cell_size) ** (exponent + 1))
+                                if (
+                                    np.logical_not(np.isnan(denominator_temp))
+                                    and denominator_temp != 0
+                                ):
+                                    denominator_valid = True
+                                    denominator = denominator + denominator_temp
+
+                    # If both numerator and denominator are valid compute the coefficient
+                    if numerator_valid and denominator_valid:
+                        coef[col] = (numerator * (1 + exponent)) / denominator
 
         # Compute the bottom discharge of each profile
-        bot_value = delta_t * (coef / (exponent + 1)) * (bot_rng**(exponent + 1))
+        bot_value = delta_t * (coef / (exponent + 1)) * (bot_rng ** (exponent + 1))
 
         return bot_value
 
     @staticmethod
-    def bot_variables(x_prod, transect):
-        """Computes the index to the bottom most valid cell in each ensemble and the range from
-        the bottom to the bottom of the bottom most cell.
+    def bot_variables(x_prod, w_valid_data, cell_size, cell_depth, depth_ens):
+        """Computes the index to the bottom most valid cell in each ensemble
+        and the range from the bottom to the bottom of the bottom most cell.
 
         Parameters
         ----------
         x_prod: np.array(float)
             Cross product computed from the cross product method
-        transect: TransectData
-            Object of TransectData
+        w_valid_data: np.array(bool)
+            Valid water data
+        cell_size: np.array(float)
+            Size of each depth cell in m
+        cell_depth: np.array(float)
+            Depth of each depth cell in m
+        depth_ens: np.array(float)
+            Processed depth for each ensemble
 
         Returns
         -------
-        idx_bot: np.array
+        idx_bot: np.array(int)
             Index to the bottom most valid depth cell in each ensemble
         bot_rng: np.array(float)
             Range from the streambed to the bottom of the bottom most cell
         """
 
         # Identify valid data
-        in_transect_idx = transect.in_transect_idx
-        valid_data1 = np.copy(transect.w_vel.valid_data[0, :, in_transect_idx].T)
+        valid_data1 = np.copy(w_valid_data)
         valid_data2 = np.logical_not(np.isnan(x_prod))
-        valid_data = valid_data1 * valid_data2
-
-        # Assign transect properties to local variables
-        trans_selected = getattr(transect.depths, transect.depths.selected)
-        cell_size = trans_selected.depth_cell_size_m[:, in_transect_idx]
-        cell_depth = trans_selected.depth_cell_depth_m[:, in_transect_idx]
-        depth_ens = trans_selected.depth_processed_m[in_transect_idx]
+        valid_data = np.logical_and(valid_data1, valid_data2)
 
         # Preallocate variables
-        n_ensembles = valid_data.shape[1]
-        idx_bot = np.tile(-1, (valid_data.shape[1])).astype(int)
-        bot_rng = np.tile([np.nan], n_ensembles)
+        n_ensembles = int(valid_data.shape[1])
+        bot_rng = np.repeat(np.nan, n_ensembles)
 
+        # Loop through each ensemble
         for n in range(n_ensembles):
+
             # Identifying bottom most valid cell
             idx_temp = np.where(np.logical_not(np.isnan(x_prod[:, n])))[0]
             if len(idx_temp) > 0:
-                idx_temp = idx_temp[-1]
-                idx_bot[n] = idx_temp
+                idx_bot = idx_temp[-1]
                 # Compute bottom range
-                bot_rng[n] = depth_ens[n] - cell_depth[idx_bot[n], n] - 0.5 * cell_size[idx_bot[n], n]
+                bot_rng[n] = (
+                    depth_ens[n] - cell_depth[idx_bot, n] - 0.5 * cell_size[idx_bot, n]
+                )
             else:
                 bot_rng[n] = 0
 
-        return idx_bot, bot_rng
+        return bot_rng
diff --git a/qrevint_22_06_22/Classes/SelectFit.py b/Classes/SelectFit.py
similarity index 63%
rename from qrevint_22_06_22/Classes/SelectFit.py
rename to Classes/SelectFit.py
index bb771a06e2eaefb92119177e739f2d2a5c934b63..c65d53bd13bf80cd43960d980be3438f86abab4f 100644
--- a/qrevint_22_06_22/Classes/SelectFit.py
+++ b/Classes/SelectFit.py
@@ -60,12 +60,13 @@ class SelectFit(object):
     """
 
     def __init__(self):
-        """Intialize object and instance variables."""
+        """Initialize object and instance variables."""
 
-        self.fit_method = 'Automatic'  # User selected method Automatic or Manual
-        self.top_method = 'Power'
-        self.bot_method = 'Power'
-        self.exponent = '0.1667'
+        # User selected method Automatic or Manual
+        self.fit_method = "Automatic"
+        self.top_method = "Power"
+        self.bot_method = "Power"
+        self.exponent = "0.1667"
         self.exp_method = None
         self.u = None
         self.u_auto = None
@@ -73,20 +74,20 @@ class SelectFit(object):
         self.z_auto = None
         self.residuals = np.array([])
         self.coef = 0
-        self.bot_method_auto = 'Power'  # Selected extrapolation for top
-        self.top_method_auto = 'Power'  # Selected extrapolation for bottom
-        self.exponent_auto = 0.1667  # Selected exponent
-        self.top_fit_r2 = 0  # Top fit custom r^2
-        self.top_max_diff = 0  # Maximum difference between power and 3-pt at top
-        self.bot_diff = 0  # Difference between power and no slop at z = 0.1
-        self.bot_r2 = 0  # Bottom fit r^2
-        self.fit_r2 = 0  # Selected fit of selected power/no slip fit
-        self.ns_exponent = 0.1667  # No slip optimized exponent
-        self.pp_exponent = 0.1667  # Power Power optimized exponent
+        self.bot_method_auto = "Power"
+        self.top_method_auto = "Power"
+        self.exponent_auto = 0.1667
+        self.top_fit_r2 = 0
+        self.top_max_diff = 0
+        self.bot_diff = 0
+        self.bot_r2 = 0
+        self.fit_r2 = 0
+        self.ns_exponent = 0.1667
+        self.pp_exponent = 0.1667
         self.top_r2 = 0
         self.rsqr = 0
         self.exponent_95_ci = 0
-        self.data_type = 'q'
+        self.data_type = "q"
 
     def populate_data(self, normalized, fit_method, top=None, bot=None, exponent=None):
         """Determine selected fit.
@@ -113,14 +114,13 @@ class SelectFit(object):
 
         update_fd = FitData()
 
-        if fit_method == 'Automatic':
-            # Compute power fit with optimized exponent as reference to determine
-            # if constant no slip will be more appropriate
+        if fit_method == "Automatic":
+            # Compute power fit with optimized exponent as reference to
+            # determine if constant no slip will be more appropriate
             ppobj = FitData()
-            ppobj.populate_data(norm_data=normalized,
-                                top='Power',
-                                bot='Power',
-                                method='optimize')
+            ppobj.populate_data(
+                norm_data=normalized, top="Power", bot="Power", method="optimize"
+            )
 
             # Store results in object
             self.pp_exponent = ppobj.exponent
@@ -130,75 +130,103 @@ class SelectFit(object):
 
             # Begin automatic fit
 
-            # More than 6 cells are required to compute an optimized fit.  For fewer
-            # than 7 cells the default power/power fit is selected due to lack of sufficient
-            # data for a good analysis
+            # More than 6 cells are required to compute an optimized fit.
+            # For fewer than 7 cells the default power/power fit is selected
+            # due to lack of sufficient data for a good analysis
             if len(self.residuals) > 6:
-                # DSM (6/4/2021) the top and bottom were mislabeled (even in Matlab). I corrected. The computations
-                # are unaffected as the top2 and bot2 are only used in the c_shape_condition equation
-                # c_shape_condition = (np.sign(bot2) * np.sign(top2) == np.sign(mid2) and np.abs(bot2 + top2) > 0.1)
-                # Compute the difference between the bottom two cells of data and the optimized power fit
-                bot2 = np.nansum(normalized.unit_normalized_med[valid_data[-2:]]
-                                 - ppobj.coef * normalized.unit_normalized_z[valid_data[-2:]] ** ppobj.exponent)
-
-                # Compute the difference between the top two cells of data and the optimized power fit
-                top2 = np.nansum(normalized.unit_normalized_med[valid_data[:2]]
-                                 - ppobj.coef * normalized.unit_normalized_z[valid_data[:2]] ** ppobj.exponent)
-
-                # Compute the difference between the middle two cells of data and the optimized power fit
+                # DSM (6/4/2021) the top and bottom were mislabeled
+                # (even in Matlab). I corrected. The computations
+                # are unaffected as the top2 and bot2 are only used in the
+                # c_shape_condition equation
+                # c_shape_condition = (np.sign(bot2) * np.sign(top2) ==
+                # np.sign(mid2) and np.abs(bot2 + top2) > 0.1)
+                # Compute the difference between the bottom two cells of
+                # data and the optimized power fit
+                bot2 = np.nansum(
+                    normalized.unit_normalized_med[valid_data[-2:]]
+                    - ppobj.coef
+                    * normalized.unit_normalized_z[valid_data[-2:]] ** ppobj.exponent
+                )
+
+                # Compute the difference between the top two cells of data and
+                # the optimized power fit
+                top2 = np.nansum(
+                    normalized.unit_normalized_med[valid_data[:2]]
+                    - ppobj.coef
+                    * normalized.unit_normalized_z[valid_data[:2]] ** ppobj.exponent
+                )
+
+                # Compute the difference between the middle two cells of data
+                # and the optimized power fit
                 mid1 = int(np.floor(len(np.isnan(valid_data) == False) / 2)) - 1
 
-                mid2 = np.nansum(normalized.unit_normalized_med[valid_data[mid1:mid1 + 2]]
-                                 - ppobj.coef * normalized.unit_normalized_z[valid_data[mid1:mid1 + 2]]
-                                 ** ppobj.exponent)
+                mid2 = np.nansum(
+                    normalized.unit_normalized_med[valid_data[mid1 : mid1 + 2]]
+                    - ppobj.coef
+                    * normalized.unit_normalized_z[valid_data[mid1 : mid1 + 2]]
+                    ** ppobj.exponent
+                )
 
-                self.top_method_auto = 'Power'
-                self.bot_method_auto = 'Power'
+                self.top_method_auto = "Power"
+                self.bot_method_auto = "Power"
 
-                # Evaluate difference in data and power fit at water surface using a linear fit through the top 4
+                # Evaluate difference in data and power fit at water surface
+                # using a linear fit through the top 4
                 # median cells and save results
                 y = normalized.unit_normalized_med[valid_data[:4]]
                 x = normalized.unit_normalized_z[valid_data[:4]]
 
                 coeffs = np.polyfit(x, y, 1)
-                resid = y - (coeffs[0]*x + coeffs[1])
+                resid = y - (coeffs[0] * x + coeffs[1])
                 corr = np.corrcoef(x, y)[0, 1]
-                self.top_fit_r2 = 1 - (np.sum(resid ** 2) / np.mean(np.abs(resid)))
+                self.top_fit_r2 = 1 - (np.sum(resid**2) / np.mean(np.abs(resid)))
                 self.top_r2 = corr**2
 
                 # Evaluate overall fit
-                # If the optimized power fit does not have an r^2 better than 0.8 or if the optimized
-                # exponent if 0.1667 falls within the 95% confidence interval of the optimized fit,
-                # there is insufficient justification to change the exponent from 0.1667
-                if (ppobj.r_squared < 0.8) or ((0.1667 > self.exponent_95_ci[0]) and (0.1667 < self.exponent_95_ci[1])):
-                    # If an optimized exponent cannot be justified the linear fit is used to determine if a constant
-                    # fit at the top is a better alternative than a power fit.  If the power fit is the better
-                    # alternative the exponent is set to the default 0.1667 and the data is refit
+                # If the optimized power fit does not have an r^2 better than
+                # 0.8 or if the optimized exponent if 0.1667 falls within the
+                # 95% confidence interval of the optimized fit,
+                # there is insufficient justification to change the exponent
+                # from 0.1667
+                if (ppobj.r_squared < 0.8) or (
+                    (0.1667 > self.exponent_95_ci[0])
+                    and (0.1667 < self.exponent_95_ci[1])
+                ):
+                    # If an optimized exponent cannot be justified the linear
+                    # fit is used to determine if a constant
+                    # fit at the top is a better alternative than a power fit.
+                    # If the power fit is the better alternative the exponent is
+                    # set to the default 0.1667 and the data is refit
                     if np.abs(self.top_fit_r2 < 0.8 or self.top_r2 < 0.9):
                         ppobj = FitData()
-                        ppobj.populate_data(norm_data=normalized,
-                                            top='Power',
-                                            bot='Power',
-                                            method='Manual',
-                                            exponent=0.1667)
+                        ppobj.populate_data(
+                            norm_data=normalized,
+                            top="Power",
+                            bot="Power",
+                            method="Manual",
+                            exponent=0.1667,
+                        )
 
                 # Evaluate fit of top and bottom portions of the profile
                 # Set save selected exponent and associated fit statistics
                 self.exponent_auto = ppobj.exponent
                 self.fit_r2 = ppobj.r_squared
 
-                # Compute the difference at the water surface between a linear fit of the top 4 measured cells
-                # and the best selected power fit of the whole profile
+                # Compute the difference at the water surface between a linear
+                # fit of the top 4 measured cells and the best selected
+                # power fit of the whole profile
                 self.top_max_diff = ppobj.u[-1] - np.sum(coeffs)
 
-                # Evaluate the difference at the bottom between power using the whole profile and power using
-                # only the bottom third
+                # Evaluate the difference at the bottom between power using
+                # the whole profile and power using only the bottom third
                 ns_fd = FitData()
-                ns_fd.populate_data(normalized, 'Constant', 'No Slip', 'Optimize')
+                ns_fd.populate_data(normalized, "Constant", "No Slip", "Optimize")
                 self.ns_exponent = ns_fd.exponent
                 self.bot_r2 = ns_fd.r_squared
-                self.bot_diff = ppobj.u[np.round(ppobj.z, 2) == 0.1][0] \
+                self.bot_diff = (
+                    ppobj.u[np.round(ppobj.z, 2) == 0.1][0]
                     - ns_fd.u[np.round(ns_fd.z, 2) == 0.1][0]
+                )
 
                 # Begin automatic selection logic
                 # -----------------------------------
@@ -212,8 +240,13 @@ class SelectFit(object):
                 # (b) the difference is either positive or the difference
                 # of the top measured cell differs from the best
                 # selected power fit by more than 5%.
-                top_condition = (np.abs(self.top_max_diff) > 0.1 and ((self.top_max_diff > 0)
-                                 or np.abs(normalized.unit_normalized_med[valid_data[0]] - ppobj.u[-1]) > 0.05))
+                top_condition = np.abs(self.top_max_diff) > 0.1 and (
+                    (self.top_max_diff > 0)
+                    or np.abs(
+                        normalized.unit_normalized_med[valid_data[0]] - ppobj.u[-1]
+                    )
+                    > 0.05
+                )
 
                 # OR
 
@@ -223,15 +256,16 @@ class SelectFit(object):
                 # and the selected best power fit of the whole profile
                 # is greater than 10% and (b) the optimized on slip fit has
                 # an r^2 greater than 0.6.
-                bottom_condition = ((np.abs(self.bot_diff) > 0.1) and self.bot_r2 > 0.6)
+                bottom_condition = (np.abs(self.bot_diff) > 0.1) and self.bot_r2 > 0.6
 
                 # OR
 
                 # 3) Flow is bidirectional. The sign of the top of the
                 # profile is different from the sign of the bottom of
                 # the profile.
-                bidirectional_condition = (np.sign(normalized.unit_normalized_med[valid_data[0]])
-                                           != np.sign(normalized.unit_normalized_med[valid_data[-1]]))
+                bidirectional_condition = np.sign(
+                    normalized.unit_normalized_med[valid_data[0]]
+                ) != np.sign(normalized.unit_normalized_med[valid_data[-1]])
                 # OR
 
                 # 4) The profile is C-shaped. This is determined by
@@ -241,14 +275,23 @@ class SelectFit(object):
                 # power fit and (b) the combined difference of the top
                 # and bottom difference from the best selected power
                 # fit being greater than 10%.
-                c_shape_condition = (np.sign(bot2) * np.sign(top2) == np.sign(mid2) and np.abs(bot2 + top2) > 0.1)
-
-                if top_condition or bottom_condition or bidirectional_condition or c_shape_condition:
+                c_shape_condition = (
+                    np.sign(bot2) * np.sign(top2) == np.sign(mid2)
+                    and np.abs(bot2 + top2) > 0.1
+                )
+
+                if (
+                    top_condition
+                    or bottom_condition
+                    or bidirectional_condition
+                    or c_shape_condition
+                ):
 
                     # Set the bottom to no slip
-                    self.bot_method_auto = 'No Slip'
-                    # If the no slip fit with an optimized exponent does not have r^2 better than 0.8 use
-                    # the default 0.1667 for the no slip exponent
+                    self.bot_method_auto = "No Slip"
+                    # If the no slip fit with an optimized exponent does not
+                    # have r^2 better than 0.8 use the default 0.1667 for
+                    # the no slip exponent
                     if ns_fd.r_squared > 0.8:
                         self.exponent_auto = ns_fd.exponent
                         self.fit_r2 = ns_fd.r_squared
@@ -256,9 +299,11 @@ class SelectFit(object):
                         self.exponent_auto = 0.1667
                         self.fit_r2 = np.nan
 
-                    # Use the no slip 95% confidence intervals if they are available
+                    # Use the no slip 95% confidence intervals if they are
+                    # available
                     if ns_fd.exponent_95_ci is not None and np.all(
-                            np.isnan(ns_fd.exponent_95_ci) == False):
+                        np.isnan(ns_fd.exponent_95_ci) == False
+                    ):
                         self.exponent_95_ci[0] = ns_fd.exponent_95_ci[0]
                         self.exponent_95_ci[1] = ns_fd.exponent_95_ci[1]
                     else:
@@ -266,34 +311,37 @@ class SelectFit(object):
                         self.exponent_95_ci[1] = np.nan
 
                     # Set the top method to constant
-                    self.top_method_auto = 'Constant'
+                    self.top_method_auto = "Constant"
 
                 else:
 
-                    # Leave fit power/power and set the best selected optimized exponent as the automatic fit exponent
+                    # Leave fit power/power and set the best selected
+                    # optimized exponent as the automatic fit exponent
                     self.exponent_auto = ppobj.exponent
 
             else:
 
-                # If the data are insufficient for a valid analysis use the power/power fit
-                # with the default 0.1667 exponent
-                self.top_method_auto = 'Power'
-                self.bot_method_auto = 'Power'
+                # If the data are insufficient for a valid analysis use the
+                # power/power fit with the default 0.1667 exponent
+                self.top_method_auto = "Power"
+                self.bot_method_auto = "Power"
                 self.exponent_auto = 0.1667
                 self.ns_exponent = 0.1667
 
             # Update the fit using the automatically selected methods
-            update_fd.populate_data(norm_data=normalized,
-                                    top=self.top_method_auto,
-                                    bot=self.bot_method_auto,
-                                    method='Manual',
-                                    exponent=self.exponent_auto)
+            update_fd.populate_data(
+                norm_data=normalized,
+                top=self.top_method_auto,
+                bot=self.bot_method_auto,
+                method="Manual",
+                exponent=self.exponent_auto,
+            )
             self.u = update_fd.u
             self.u_auto = update_fd.u
             self.z_auto = update_fd.z
             self.z = update_fd.z
 
-        elif fit_method == 'Manual':
+        elif fit_method == "Manual":
 
             # Identify changes in fit settings
             if top is None:
@@ -304,11 +352,13 @@ class SelectFit(object):
                 exponent = self.exponent
 
             # Update fit with manual settings
-            update_fd.populate_data(norm_data=normalized,
-                                    top=top,
-                                    bot=bot,
-                                    method=fit_method,
-                                    exponent=exponent)
+            update_fd.populate_data(
+                norm_data=normalized,
+                top=top,
+                bot=bot,
+                method=fit_method,
+                exponent=exponent,
+            )
             self.u = update_fd.u
             self.z = update_fd.z
 
@@ -322,21 +372,21 @@ class SelectFit(object):
 
     @staticmethod
     def qrev_mat_in(mat_data):
-        """Processes the Matlab data structure to obtain a list of NormData objects containing transect
-           data from the Matlab data structure.
+        """Processes the Matlab data structure to obtain a list of NormData
+         objects containing transect data from the Matlab data structure.
 
-       Parameters
-       ----------
-       mat_data: mat_struct
-           Matlab data structure obtained from sio.loadmat
+        Parameters
+        ----------
+        mat_data: mat_struct
+            Matlab data structure obtained from sio.loadmat
 
-       Returns
-       -------
-       norm_data: list
-           List of NormData objects
-       """
+        Returns
+        -------
+        norm_data: list
+            List of NormData objects
+        """
         fit_data = []
-        if hasattr(mat_data, 'selFit'):
+        if hasattr(mat_data, "selFit"):
             for n, data in enumerate(mat_data.selFit):
                 temp = SelectFit()
                 temp.populate_from_qrev_mat(data, mat_data.normData[n])
@@ -344,7 +394,8 @@ class SelectFit(object):
         return fit_data
 
     def populate_from_qrev_mat(self, mat_data, norm_data):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
diff --git a/qrevint_22_06_22/Classes/SensorData.py b/Classes/SensorData.py
similarity index 96%
rename from qrevint_22_06_22/Classes/SensorData.py
rename to Classes/SensorData.py
index 0c8f8697729f6370e319613fe9919e2f29ad3903..70298c671ddb3572734e4ebcb18ae5176eb2a6a1 100644
--- a/qrevint_22_06_22/Classes/SensorData.py
+++ b/Classes/SensorData.py
@@ -2,7 +2,8 @@ import numpy as np
 
 
 class SensorData(object):
-    """Class stores data for pitch, roll, temperature, salinity, and speed of sound and its source/
+    """Class stores data for pitch, roll, temperature, salinity, and speed of
+    sound and its source/
 
     Attributes
     ----------
@@ -13,14 +14,14 @@ class SensorData(object):
     source: str
         Source of data, examples Int. Sensor, Ext. Sensor, User
     """
-    
+
     def __init__(self):
         """Initializes class and variables."""
 
         self.data = None
         self.data_orig = None
         self.source = None
-        
+
     def populate_data(self, data_in, source_in):
         """Store data in class.
 
@@ -37,7 +38,8 @@ class SensorData(object):
         self.source = source_in
 
     def populate_from_qrev_mat(self, mat_data):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -60,7 +62,7 @@ class SensorData(object):
             else:
                 self.data_orig = np.array([float(mat_data.dataOrig)])
         self.source = mat_data.source
-        
+
     def change_data(self, data_in):
         """Change data to be applied in computations.
 
@@ -70,7 +72,7 @@ class SensorData(object):
         """
 
         self.data = data_in
-        
+
     def set_source(self, source_in):
         """Change source of data.
 
diff --git a/qrevint_22_06_22/Classes/SensorStructure.py b/Classes/SensorStructure.py
similarity index 88%
rename from qrevint_22_06_22/Classes/SensorStructure.py
rename to Classes/SensorStructure.py
index 20a7cf79557c05e5704997b1e28df4425bf83547..11ac78a4fb0eb6cc0ade2a8a99c559f969bff2d7 100644
--- a/qrevint_22_06_22/Classes/SensorStructure.py
+++ b/Classes/SensorStructure.py
@@ -17,14 +17,14 @@ class SensorStructure(object):
     self.user: SensorData
         Contains user supplied value, object of SensorData
     """
-    
+
     def __init__(self):
         """Initialize class and set variable to None."""
 
-        self.selected = None  # The selected sensor reference name ('internal', 'external', 'user')
-        self.internal = None  # Contains the data from the internal sensor
-        self.external = None  # Contains the data from an external sensor
-        self.user = None  # Contains user supplied value
+        self.selected = None
+        self.internal = None
+        self.external = None
+        self.user = None
 
     def populate_from_qrev_mat(self, mat_data, heading=False):
         """Populates the object using data from previously saved QRev Matlab file.
@@ -61,7 +61,7 @@ class SensorStructure(object):
                 self.user = HeadingData()
                 self.user.populate_from_qrev_mat(mat_data.user)
             self.selected = mat_data.selected
-        
+
     def set_selected(self, selected_name):
         """Set the selected source for the specified object
 
diff --git a/qrevint_22_06_22/Classes/Sensors.py b/Classes/Sensors.py
similarity index 51%
rename from qrevint_22_06_22/Classes/Sensors.py
rename to Classes/Sensors.py
index 5734ff7b06795946870e5668ab877ed6b0768d24..fc0c1ff56be7d3fe782f5e0fe754ff5164b25236 100644
--- a/qrevint_22_06_22/Classes/Sensors.py
+++ b/Classes/Sensors.py
@@ -7,6 +7,8 @@ class Sensors(object):
 
     Attributes
     ----------
+    battery_voltage: SensorStructure
+        Battery voltage suppling power to ADCP
     heading_deg: HeadingData
         Object of HeadingData.
     pitch_deg: SensorStructure
@@ -24,12 +26,13 @@ class Sensors(object):
     def __init__(self):
         """Initialize class and create variable objects"""
 
-        self.heading_deg = SensorStructure()  # Object of HeadingData
-        self.pitch_deg = SensorStructure()  # Pitch data, object of SensorStructure
-        self.roll_deg = SensorStructure()  # Roll data, object of SensorStructure
-        self.temperature_deg_c = SensorStructure()  # Temperature data, object of SensorStructure
-        self.salinity_ppt = SensorStructure()  # Salinity data, object of SensorStructure
-        self.speed_of_sound_mps = SensorStructure()  # Speed of sound, object of SensorStructure
+        self.heading_deg = SensorStructure()
+        self.pitch_deg = SensorStructure()
+        self.roll_deg = SensorStructure()
+        self.temperature_deg_c = SensorStructure()
+        self.salinity_ppt = SensorStructure()
+        self.speed_of_sound_mps = SensorStructure()
+        self.battery_voltage = SensorStructure()
 
     def populate_from_qrev_mat(self, transect):
         """Populates the object using data from previously saved QRev Matlab file.
@@ -39,19 +42,25 @@ class Sensors(object):
         transect: mat_struct
            Matlab data structure obtained from sio.loadmat
         """
-        if hasattr(transect, 'sensors'):
-            if hasattr(transect.sensors, 'heading_deg'):
-                self.heading_deg.populate_from_qrev_mat(transect.sensors.heading_deg, heading=True)
-            if hasattr(transect.sensors, 'pitch_deg'):
+        if hasattr(transect, "sensors"):
+            if hasattr(transect.sensors, "heading_deg"):
+                self.heading_deg.populate_from_qrev_mat(
+                    transect.sensors.heading_deg, heading=True
+                )
+            if hasattr(transect.sensors, "pitch_deg"):
                 self.pitch_deg.populate_from_qrev_mat(transect.sensors.pitch_deg)
-            if hasattr(transect.sensors, 'roll_deg'):
+            if hasattr(transect.sensors, "roll_deg"):
                 self.roll_deg.populate_from_qrev_mat(transect.sensors.roll_deg)
-            if hasattr(transect.sensors, 'salinity_ppt'):
+            if hasattr(transect.sensors, "salinity_ppt"):
                 self.salinity_ppt.populate_from_qrev_mat(transect.sensors.salinity_ppt)
-            if hasattr(transect.sensors, 'speedOfSound_mps'):
-                self.speed_of_sound_mps.populate_from_qrev_mat(transect.sensors.speedOfSound_mps)
-            if hasattr(transect.sensors, 'temperature_degC'):
-                self.temperature_deg_c.populate_from_qrev_mat(transect.sensors.temperature_degC)
+            if hasattr(transect.sensors, "speedOfSound_mps"):
+                self.speed_of_sound_mps.populate_from_qrev_mat(
+                    transect.sensors.speedOfSound_mps
+                )
+            if hasattr(transect.sensors, "temperature_degC"):
+                self.temperature_deg_c.populate_from_qrev_mat(
+                    transect.sensors.temperature_degC
+                )
 
     @staticmethod
     def speed_of_sound(temperature, salinity):
@@ -65,10 +74,15 @@ class Sensors(object):
             Water salinity at transducer face, in ppt.
         """
 
-        # Not provided in RS Matlab file computed from equation used in TRDI BBSS, from Urick (1983)
-        # May not be the same equation as used by SonTek
-        sos = 1449.2 + 4.6 * temperature - 0.055 * temperature**2 + 0.00029 * temperature**3 \
+        # Not provided in RS Matlab file computed from equation used in
+        # TRDI BBSS
+        sos = (
+            1449.2
+            + 4.6 * temperature
+            - 0.055 * temperature**2
+            + 0.00029 * temperature**3
             + (1.34 - 0.01 * temperature) * (salinity - 35.0)
+        )
 
         return sos
 
@@ -79,25 +93,34 @@ class Sensors(object):
         sr = np.sqrt(np.abs(s))
 
         # S ** 2 TERM
-        d = 1.727E-3 - 7.9836E-6 * p
+        d = 1.727e-3 - 7.9836e-6 * p
 
         # S ** 3 / 2  TERM
-        b1 = 7.3637E-5 + 1.7945E-7 * t
-        b0 = -1.922E-2 - 4.42E-5 * t
+        b1 = 7.3637e-5 + 1.7945e-7 * t
+        b0 = -1.922e-2 - 4.42e-5 * t
         b = b0 + b1 * p
 
         # S ** 1 TERM
-        a3 = (-3.389E-13 * t + 6.649E-12) * t + 1.100E-10
-        a2 = ((7.988E-12 * t - 1.6002E-10) * t + 9.1041E-9) * t - 3.9064E-7
-        a1 = (((-2.0122E-10 * t + 1.0507E-8) * t - 6.4885E-8) * t - 1.2580E-5) * t + 9.4742E-5
-        a0 = (((-3.21E-8 * t + 2.006E-6) * t + 7.164E-5) * t - 1.262E-2) * t + 1.389
+        a3 = (-3.389e-13 * t + 6.649e-12) * t + 1.100e-10
+        a2 = ((7.988e-12 * t - 1.6002e-10) * t + 9.1041e-9) * t - 3.9064e-7
+        a1 = (
+            ((-2.0122e-10 * t + 1.0507e-8) * t - 6.4885e-8) * t - 1.2580e-5
+        ) * t + 9.4742e-5
+        a0 = (((-3.21e-8 * t + 2.006e-6) * t + 7.164e-5) * t - 1.262e-2) * t + 1.389
         a = ((a3 * p + a2) * p + a1) * p + a0
 
         # S ** 0 TERM
-        c3 = (-2.3643E-12 * t + 3.8504E-10) * t - 9.7729E-9
-        c2 = (((1.0405E-12 * t - 2.5335E-10) * t + 2.5974E-8) * t - 1.7107E-6) * t + 3.1260E-5
-        c1 = (((-6.1185E-10 * t + 1.3621E-7) * t - 8.1788E-6) * t + 6.8982E-4) * t + 0.153563
-        c0 = ((((3.1464E-9 * t - 1.47800E-6) * t + 3.3420E-4) * t - 5.80852E-2) * t + 5.03711) * t + 1402.388
+        c3 = (-2.3643e-12 * t + 3.8504e-10) * t - 9.7729e-9
+        c2 = (
+            ((1.0405e-12 * t - 2.5335e-10) * t + 2.5974e-8) * t - 1.7107e-6
+        ) * t + 3.1260e-5
+        c1 = (
+            ((-6.1185e-10 * t + 1.3621e-7) * t - 8.1788e-6) * t + 6.8982e-4
+        ) * t + 0.153563
+        c0 = (
+            (((3.1464e-9 * t - 1.47800e-6) * t + 3.3420e-4) * t - 5.80852e-2) * t
+            + 5.03711
+        ) * t + 1402.388
         c = ((c3 * p + c2) * p + c1) * p + c0
 
         # SOUND  SPEED
@@ -118,5 +141,7 @@ class Sensors(object):
         temps = np.array([])
         for transect in transects:
             if transect.checked:
-                temps = np.append(temps, transect.sensors.temperature_deg_c.internal.data)
+                temps = np.append(
+                    temps, transect.sensors.temperature_deg_c.internal.data
+                )
         return np.nanmean(temps)
diff --git a/qrevint_22_06_22/Classes/TransectData.py b/Classes/TransectData.py
similarity index 51%
rename from qrevint_22_06_22/Classes/TransectData.py
rename to Classes/TransectData.py
index 1d7a2ee5073c03b839b482cb1ea98a93603df53e..8c3f8241d7ea7a88973bcd01aa179ece9a214c67 100644
--- a/qrevint_22_06_22/Classes/TransectData.py
+++ b/Classes/TransectData.py
@@ -1,12 +1,10 @@
 import os
-import time
 import warnings
-import concurrent.futures
 import numpy as np
 from datetime import datetime
 from datetime import timezone
 from scipy import signal, fftpack
-# from Classes.Pd0TRDI import Pd0TRDI
+
 from Classes.Pd0TRDI_2 import Pd0TRDI
 from Classes.DepthStructure import DepthStructure
 from Classes.WaterData import WaterData
@@ -19,9 +17,17 @@ from Classes.SensorData import SensorData
 from Classes.HeadingData import HeadingData
 from Classes.DateTime import DateTime
 from Classes.InstrumentData import InstrumentData
-from Classes.MultiThread import MultiThread
 from Classes.CoordError import CoordError
-from MiscLibs.common_functions import nandiff, cosd, arctand, tand, nans, cart2pol, rad2azdeg, nan_less
+from MiscLibs.common_functions import (
+    nandiff,
+    cosd,
+    arctand,
+    tand,
+    nans,
+    cart2pol,
+    rad2azdeg,
+    nan_less,
+)
 
 
 class TransectData(object):
@@ -36,13 +42,15 @@ class TransectData(object):
     w_vel: WaterData
         Object of WaterData
     boat_vel: BoatStructure
-        Object of BoatStructure containing objects of BoatData for BT, GGA, and VTG
+        Object of BoatStructure containing objects of BoatData for BT, GGA,
+        and VTG
     gps: GPSData
         Object of GPSData
     sensors: SensorData
         Object of SensorData
     depths: DepthStructure
-        Object of DepthStructure containing objects of Depth data for bt_depths, vb_depths, ds_depths)
+        Object of DepthStructure containing objects of Depth data for
+        bt_depths, vb_depths, ds_depths)
     edges: Edges
         Object of Edges (left and right object of clsEdgeData)
     extrap: ExtrapData
@@ -54,26 +62,28 @@ class TransectData(object):
     date_time: DateTime
         Object of DateTime
     checked: bool
-        Setting for if transect was checked for use in mmt file assumed checked for SonTek
+        Setting for if transect was checked for use in mmt file assumed
+        checked for SonTek
     in_transect_idx: np.array(int)
-        Index of ensemble data associated with the moving-boat portion of the transect
+        Index of ensemble data associated with the moving-boat portion of the
+         transect
     """
 
     def __init__(self):
-        self.adcp = None  # object of clsInstrument
-        self.file_name = None  # filename of transect data file
-        self.w_vel = None  # object of clsWaterData
-        self.boat_vel = None  # class for various boat velocity references (btVel, ggaVel, vtgVel)
-        self.gps = None  # object of clsGPSData
-        self.sensors = None  # object of clsSensorData
-        self.depths = None  # object of clsDepthStructure for depth data including cell depths & ref depths
-        self.edges = None  # object of clsEdges(left and right object of clsEdgeData)
-        self.extrap = None  # object of clsExtrapData
-        self.start_edge = None  # starting edge of transect looking downstream (Left or Right)
+        self.adcp = None
+        self.file_name = None
+        self.w_vel = None
+        self.boat_vel = None
+        self.gps = None
+        self.sensors = None
+        self.depths = None
+        self.edges = None
+        self.extrap = None
+        self.start_edge = None
         self.orig_start_edge = None
-        self.date_time = None  # object of DateTime
-        self.checked = None  # transect was checked for use in mmt file assumed checked for SonTek
-        self.in_transect_idx = None  # index of ensemble data associated with the moving-boat portion of the transect
+        self.date_time = None
+        self.checked = None
+        self.in_transect_idx = None
 
     def trdi(self, mmt_transect, pd0_data, mmt):
         """Create object, lists, and instance variables for TRDI data.
@@ -88,25 +98,28 @@ class TransectData(object):
             Object of MMT_TRDI
         """
 
-        # Get file name of pd0 file which is first file in list of file associated with the transect
+        # Get file name of pd0 file which is first file in list of file
+        # associated with the transect
         self.file_name = mmt_transect.Files[0]
 
         # Get the active configuration data for the transect
-        mmt_config = getattr(mmt_transect, 'active_config')
+        mmt_config = getattr(mmt_transect, "active_config")
 
         # If the pd0 file has water track data process all of the data
         if pd0_data.Wt is not None:
 
             # Ensemble times
             # Compute time for each ensemble in seconds
-            ens_time_sec = pd0_data.Sensor.time[:, 0] * 3600 \
-                           + pd0_data.Sensor.time[:, 1] * 60 \
-                           + pd0_data.Sensor.time[:, 2] \
-                           + pd0_data.Sensor.time[:, 3] / 100
+            ens_time_sec = (
+                pd0_data.Sensor.time[:, 0] * 3600
+                + pd0_data.Sensor.time[:, 1] * 60
+                + pd0_data.Sensor.time[:, 2]
+                + pd0_data.Sensor.time[:, 3] / 100
+            )
 
             # Compute the duration of each ensemble in seconds adjusting for lost data
             ens_delta_time = np.tile([np.nan], ens_time_sec.shape)
-            idx_time = np.where(np.isnan(ens_time_sec) == False)[0]
+            idx_time = np.where(np.logical_not(np.isnan(ens_time_sec)))[0]
             ens_delta_time[idx_time[1:]] = nandiff(ens_time_sec[idx_time])
 
             # Adjust for transects tha last past midnight
@@ -115,56 +128,102 @@ class TransectData(object):
             ens_delta_time = ens_delta_time.T
 
             # Start date and time
-            idx = np.where(np.isnan(pd0_data.Sensor.time[:, 0]) == False)[0][0]
+            idx = np.where(np.logical_not(np.isnan(pd0_data.Sensor.time[:, 0])))[0][0]
             start_year = int(pd0_data.Sensor.date[idx, 0])
 
-            # StreamPro doesn't include y2k dates
-            if start_year < 100:
+            # Handle data that is not Y2K compliant
+            if pd0_data.Sensor.date_not_y2k[idx, 0] > 80:
+                start_year = 1900 + int(pd0_data.Sensor.date_not_y2k[idx, 0])
+            elif pd0_data.Sensor.date_not_y2k[idx, 1] < 81:
                 start_year = 2000 + int(pd0_data.Sensor.date_not_y2k[idx, 0])
 
             start_month = int(pd0_data.Sensor.date[idx, 1])
             start_day = int(pd0_data.Sensor.date[idx, 2])
             start_hour = int(pd0_data.Sensor.time[idx, 0])
             start_min = int(pd0_data.Sensor.time[idx, 1])
-            start_sec = int(pd0_data.Sensor.time[idx, 2] + pd0_data.Sensor.time[idx, 3] / 100)
+            start_sec = int(
+                pd0_data.Sensor.time[idx, 2] + pd0_data.Sensor.time[idx, 3] / 100
+            )
             start_micro = int(
-                ((pd0_data.Sensor.time[idx, 2] + pd0_data.Sensor.time[idx, 3] / 100) - start_sec) * 10 ** 6)
-
-            start_dt = datetime(start_year, start_month, start_day, start_hour, start_min, start_sec, start_micro,
-                                tzinfo=timezone.utc)
+                (
+                    (pd0_data.Sensor.time[idx, 2] + pd0_data.Sensor.time[idx, 3] / 100)
+                    - start_sec
+                )
+                * 10**6
+            )
+
+            start_dt = datetime(
+                start_year,
+                start_month,
+                start_day,
+                start_hour,
+                start_min,
+                start_sec,
+                start_micro,
+                tzinfo=timezone.utc,
+            )
             start_serial_time = start_dt.timestamp()
-            start_date = datetime.strftime(datetime.utcfromtimestamp(start_serial_time), '%m/%d/%Y')
+            start_date = datetime.strftime(
+                datetime.utcfromtimestamp(start_serial_time), "%m/%d/%Y"
+            )
 
             # End data and time
-            idx = np.where(np.isnan(pd0_data.Sensor.time[:, 0]) == False)[0][-1]
+            idx = np.where(np.logical_not(np.isnan(pd0_data.Sensor.time[:, 0])))[0][-1]
             end_year = int(pd0_data.Sensor.date[idx, 0])
-            # StreamPro does not include Y@K dates
-            if end_year < 100:
+
+            # Handle data that is not Y2K compliant
+            if pd0_data.Sensor.date_not_y2k[idx, 0] > 80:
+                end_year = 1900 + int(pd0_data.Sensor.date_not_y2k[idx, 0])
+            elif pd0_data.Sensor.date_not_y2k[idx, 1] < 81:
                 end_year = 2000 + int(pd0_data.Sensor.date_not_y2k[idx, 0])
 
             end_month = int(pd0_data.Sensor.date[idx, 1])
             end_day = int(pd0_data.Sensor.date[idx, 2])
             end_hour = int(pd0_data.Sensor.time[idx, 0])
             end_min = int(pd0_data.Sensor.time[idx, 1])
-            end_sec = int(pd0_data.Sensor.time[idx, 2] + pd0_data.Sensor.time[idx, 3] / 100)
-            end_micro = int(((pd0_data.Sensor.time[idx, 2] + pd0_data.Sensor.time[idx, 3] / 100) - end_sec) * 10 ** 6)
-
-            end_dt = datetime(end_year, end_month, end_day, end_hour, end_min, end_sec, end_micro, tzinfo=timezone.utc)
+            end_sec = int(
+                pd0_data.Sensor.time[idx, 2] + pd0_data.Sensor.time[idx, 3] / 100
+            )
+            end_micro = int(
+                (
+                    (pd0_data.Sensor.time[idx, 2] + pd0_data.Sensor.time[idx, 3] / 100)
+                    - end_sec
+                )
+                * 10**6
+            )
+
+            end_dt = datetime(
+                end_year,
+                end_month,
+                end_day,
+                end_hour,
+                end_min,
+                end_sec,
+                end_micro,
+                tzinfo=timezone.utc,
+            )
             end_serial_time = end_dt.timestamp()
 
             # Create date/time object
             self.date_time = DateTime()
-            self.date_time.populate_data(date_in=start_date,
-                                         start_in=start_serial_time,
-                                         end_in=end_serial_time,
-                                         ens_dur_in=ens_delta_time)
+            self.date_time.populate_data(
+                date_in=start_date,
+                start_in=start_serial_time,
+                end_in=end_serial_time,
+                ens_dur_in=ens_delta_time,
+            )
 
             # Transect checked for use in discharge computation
             self.checked = mmt_transect.Checked
 
             # Create class for adcp information
             self.adcp = InstrumentData()
-            self.adcp.populate_data(manufacturer='TRDI', raw_data=pd0_data, mmt_transect=mmt_transect, mmt=mmt)
+            self.adcp.populate_data(
+                manufacturer="TRDI",
+                raw_data=pd0_data,
+                mmt_transect=mmt_transect,
+                mmt=mmt,
+            )
 
             # Create valid frequency time series
             freq_ts = self.valid_frequencies(pd0_data.Inst.freq)
@@ -172,21 +231,23 @@ class TransectData(object):
             # Initialize boat vel
             self.boat_vel = BoatStructure()
             # Apply 3-beam setting from mmt file
-            if mmt_config['Proc_Use_3_Beam_BT'] < 0.5:
+            if mmt_config["Proc_Use_3_Beam_BT"] < 0.5:
                 min_beams = 4
             else:
                 min_beams = 3
-            self.boat_vel.add_boat_object(source='TRDI',
-                                          vel_in=pd0_data.Bt.vel_mps,
-                                          freq_in=freq_ts,
-                                          coord_sys_in=pd0_data.Cfg.coord_sys[0],
-                                          nav_ref_in='BT',
-                                          min_beams=min_beams,
-                                          bottom_mode=pd0_data.Cfg.bm[0],
-                                          corr_in=pd0_data.Bt.corr,
-                                          rssi_in=pd0_data.Bt.rssi)
-
-            self.boat_vel.set_nav_reference('BT')
+            self.boat_vel.add_boat_object(
+                source="TRDI",
+                vel_in=pd0_data.Bt.vel_mps,
+                freq_in=freq_ts,
+                coord_sys_in=pd0_data.Cfg.coord_sys[0],
+                nav_ref_in="BT",
+                min_beams=min_beams,
+                bottom_mode=pd0_data.Cfg.bm[0],
+                corr_in=pd0_data.Bt.corr,
+                rssi_in=pd0_data.Bt.rssi,
+            )
+
+            self.boat_vel.set_nav_reference("BT")
 
             # Compute velocities from GPS Data
             # ------------------------------------
@@ -197,12 +258,12 @@ class TransectData(object):
 
             # Determine correct sign for latitude
             for n, lat_ref in enumerate(pd0_data.Gps2.lat_ref):
-                idx = np.nonzero(np.array(lat_ref) == 'S')
+                idx = np.nonzero(np.array(lat_ref) == "S")
                 raw_gga_lat[n, idx] = raw_gga_lat[n, idx] * -1
 
             # Determine correct sign for longitude
             for n, lon_ref in enumerate(pd0_data.Gps2.lon_ref):
-                idx = np.nonzero(np.array(lon_ref) == 'W')
+                idx = np.nonzero(np.array(lon_ref) == "W")
                 raw_gga_lon[n, idx] = raw_gga_lon[n, idx] * -1
 
             # Assign data to local variables
@@ -228,54 +289,61 @@ class TransectData(object):
             ext_vtg_speed = []
 
             # QRev methods GPS processing methods
-            gga_p_method = 'Mindt'
-            gga_v_method = 'Mindt'
-            vtg_method = 'Mindt'
+            gga_p_method = "Mindt"
+            gga_v_method = "Mindt"
+            vtg_method = "Mindt"
 
             # If valid gps data exist, process the data
-            if (np.nansum(np.nansum(np.abs(raw_gga_lat))) > 0) \
-                    or (np.nansum(np.nansum(np.abs(raw_vtg_speed))) > 0):
+            if (np.nansum(np.nansum(np.abs(raw_gga_lat))) > 0) or (
+                np.nansum(np.nansum(np.abs(raw_vtg_speed))) > 0
+            ):
 
                 # Process raw GPS data
                 self.gps = GPSData()
-                self.gps.populate_data(raw_gga_utc=raw_gga_utc,
-                                       raw_gga_lat=raw_gga_lat,
-                                       raw_gga_lon=raw_gga_lon,
-                                       raw_gga_alt=raw_gga_alt,
-                                       raw_gga_diff=raw_gga_diff,
-                                       raw_gga_hdop=raw_gga_hdop,
-                                       raw_gga_num_sats=raw_gga_num_sats,
-                                       raw_gga_delta_time=raw_gga_delta_time,
-                                       raw_vtg_course=raw_vtg_course,
-                                       raw_vtg_speed=raw_vtg_speed,
-                                       raw_vtg_delta_time=raw_vtg_delta_time,
-                                       raw_vtg_mode_indicator=raw_vtg_mode_indicator,
-                                       ext_gga_utc=ext_gga_utc,
-                                       ext_gga_lat=ext_gga_lat,
-                                       ext_gga_lon=ext_gga_lon,
-                                       ext_gga_alt=ext_gga_alt,
-                                       ext_gga_diff=ext_gga_diff,
-                                       ext_gga_hdop=ext_gga_hdop,
-                                       ext_gga_num_sats=ext_gga_num_sats,
-                                       ext_vtg_course=ext_vtg_course,
-                                       ext_vtg_speed=ext_vtg_speed,
-                                       gga_p_method=gga_p_method,
-                                       gga_v_method=gga_v_method,
-                                       vtg_method=vtg_method)
+                self.gps.populate_data(
+                    raw_gga_utc=raw_gga_utc,
+                    raw_gga_lat=raw_gga_lat,
+                    raw_gga_lon=raw_gga_lon,
+                    raw_gga_alt=raw_gga_alt,
+                    raw_gga_diff=raw_gga_diff,
+                    raw_gga_hdop=raw_gga_hdop,
+                    raw_gga_num_sats=raw_gga_num_sats,
+                    raw_gga_delta_time=raw_gga_delta_time,
+                    raw_vtg_course=raw_vtg_course,
+                    raw_vtg_speed=raw_vtg_speed,
+                    raw_vtg_delta_time=raw_vtg_delta_time,
+                    raw_vtg_mode_indicator=raw_vtg_mode_indicator,
+                    ext_gga_utc=ext_gga_utc,
+                    ext_gga_lat=ext_gga_lat,
+                    ext_gga_lon=ext_gga_lon,
+                    ext_gga_alt=ext_gga_alt,
+                    ext_gga_diff=ext_gga_diff,
+                    ext_gga_hdop=ext_gga_hdop,
+                    ext_gga_num_sats=ext_gga_num_sats,
+                    ext_vtg_course=ext_vtg_course,
+                    ext_vtg_speed=ext_vtg_speed,
+                    gga_p_method=gga_p_method,
+                    gga_v_method=gga_v_method,
+                    vtg_method=vtg_method,
+                )
 
                 # If valid gga data exists create gga boat velocity object
                 if np.nansum(np.nansum(np.abs(raw_gga_lat))) > 0:
-                    self.boat_vel.add_boat_object(source='TRDI',
-                                                  vel_in=self.gps.gga_velocity_ens_mps,
-                                                  coord_sys_in='Earth',
-                                                  nav_ref_in='GGA')
+                    self.boat_vel.add_boat_object(
+                        source="TRDI",
+                        vel_in=self.gps.gga_velocity_ens_mps,
+                        coord_sys_in="Earth",
+                        nav_ref_in="GGA",
+                    )
 
                 # If valid vtg data exist create vtg boat velocity object
                 if np.nansum(np.nansum(np.abs(raw_vtg_speed))) > 0:
-                    self.boat_vel.add_boat_object(source='TRDI',
-                                                  vel_in=self.gps.vtg_velocity_ens_mps,
-                                                  coord_sys_in='Earth',
-                                                  nav_ref_in='VTG')
+                    self.boat_vel.add_boat_object(
+                        source="TRDI",
+                        vel_in=self.gps.vtg_velocity_ens_mps,
+                        coord_sys_in="Earth",
+                        nav_ref_in="VTG",
+                    )
 
             # Get and compute ensemble beam depths
             temp_depth_bt = np.array(pd0_data.Bt.depth_m)
@@ -284,32 +352,39 @@ class TransectData(object):
             temp_depth_bt[temp_depth_bt < 0.01] = np.nan
 
             # Add draft
-            temp_depth_bt += mmt_config['Offsets_Transducer_Depth']
+            temp_depth_bt += mmt_config["Offsets_Transducer_Depth"]
 
             # Get instrument cell data
-            cell_size_all_m, cell_depth_m, sl_cutoff_per, sl_lag_effect_m = \
-                TransectData.compute_cell_data(pd0_data)
+            (
+                cell_size_all_m,
+                cell_depth_m,
+                sl_cutoff_per,
+                sl_lag_effect_m,
+            ) = TransectData.compute_cell_data(pd0_data)
 
             # Adjust cell depth of draft
-            cell_depth_m = np.add(mmt_config['Offsets_Transducer_Depth'], cell_depth_m)
+            cell_depth_m = np.add(mmt_config["Offsets_Transducer_Depth"], cell_depth_m)
 
             # Create depth data object for BT
             self.depths = DepthStructure()
-            self.depths.add_depth_object(depth_in=temp_depth_bt,
-                                         source_in='BT',
-                                         freq_in=freq_ts,
-                                         draft_in=mmt_config['Offsets_Transducer_Depth'],
-                                         cell_depth_in=cell_depth_m,
-                                         cell_size_in=cell_size_all_m)
+            self.depths.add_depth_object(
+                depth_in=temp_depth_bt,
+                source_in="BT",
+                freq_in=freq_ts,
+                draft_in=mmt_config["Offsets_Transducer_Depth"],
+                cell_depth_in=cell_depth_m,
+                cell_size_in=cell_size_all_m,
+            )
 
             # Compute cells above side lobe
-            cells_above_sl, sl_cutoff_m = \
-                TransectData.side_lobe_cutoff(depths=self.depths.bt_depths.depth_orig_m,
-                                              draft=self.depths.bt_depths.draft_orig_m,
-                                              cell_depth=self.depths.bt_depths.depth_cell_depth_m,
-                                              sl_lag_effect=sl_lag_effect_m,
-                                              slc_type='Percent',
-                                              value=1 - sl_cutoff_per / 100)
+            cells_above_sl, sl_cutoff_m = TransectData.side_lobe_cutoff(
+                depths=self.depths.bt_depths.depth_orig_m,
+                draft=self.depths.bt_depths.draft_orig_m,
+                cell_depth=self.depths.bt_depths.depth_cell_depth_m,
+                sl_lag_effect=sl_lag_effect_m,
+                slc_type="Percent",
+                value=1 - sl_cutoff_per / 100,
+            )
 
             # Check for the presence of vertical beam data
             if np.nanmax(np.nanmax(pd0_data.Sensor.vert_beam_status)) > 0:
@@ -320,15 +395,17 @@ class TransectData(object):
                 temp_depth_vb[temp_depth_vb < 0.01] = np.nan
 
                 # Add draft
-                temp_depth_vb = temp_depth_vb + mmt_config['Offsets_Transducer_Depth']
+                temp_depth_vb = temp_depth_vb + mmt_config["Offsets_Transducer_Depth"]
 
                 # Create depth data object for vertical beam
-                self.depths.add_depth_object(depth_in=temp_depth_vb,
-                                             source_in='VB',
-                                             freq_in=freq_ts,
-                                             draft_in=mmt_config['Offsets_Transducer_Depth'],
-                                             cell_depth_in=cell_depth_m,
-                                             cell_size_in=cell_size_all_m)
+                self.depths.add_depth_object(
+                    depth_in=temp_depth_vb,
+                    source_in="VB",
+                    freq_in=freq_ts,
+                    draft_in=mmt_config["Offsets_Transducer_Depth"],
+                    cell_depth_in=cell_depth_m,
+                    cell_size_in=cell_size_all_m,
+                )
 
             # Check for the presence of depth sounder
             if np.nansum(np.nansum(pd0_data.Gps2.depth_m)) > 1e-5:
@@ -338,87 +415,98 @@ class TransectData(object):
                 temp_depth_ds[temp_depth_ds < 0.01] = np.nan
 
                 # Use the last valid depth for each ensemble
-                last_depth_col_idx = np.sum(np.isnan(temp_depth_ds) == False, axis=1) - 1
+                last_depth_col_idx = (
+                    np.sum(np.logical_not(np.isnan(temp_depth_ds)), axis=1) - 1
+                )
                 last_depth_col_idx[last_depth_col_idx == -1] = 0
                 row_index = np.arange(len(temp_depth_ds))
                 last_depth = nans(row_index.size)
                 for row in row_index:
                     last_depth[row] = temp_depth_ds[row, last_depth_col_idx[row]]
 
-                # Determine if mmt file has a scale factor and offset for the depth sounder
-                if mmt_config['DS_Cor_Spd_Sound'] == 0:
-                    scale_factor = mmt_config['DS_Scale_Factor']
+                # Determine if mmt file has a scale factor and offset for the
+                # depth sounder
+                if mmt_config["DS_Cor_Spd_Sound"] == 0:
+                    scale_factor = mmt_config["DS_Scale_Factor"]
                 else:
-                    scale_factor = pd0_data.Sensor.sos_mps / 1500.
+                    scale_factor = pd0_data.Sensor.sos_mps / 1500.0
 
                 # Apply scale factor, offset, and draft
                 # Note: Only the ADCP draft is stored.  The transducer
-                # draft or scaling for depth sounder data cannot be changed in QRev
+                # draft or scaling for depth sounder data cannot be changed in
+                # QRev
                 ds_depth = np.tile(np.nan, (1, cell_depth_m.shape[1]))
-                ds_depth[0, :] = (last_depth * scale_factor) \
-                                 + mmt_config['DS_Transducer_Depth'] \
-                                 + mmt_config['DS_Transducer_Offset']
-
-                self.depths.add_depth_object(depth_in=ds_depth,
-                                             source_in='DS',
-                                             freq_in=np.tile(np.nan, pd0_data.Inst.freq.shape),
-                                             draft_in=mmt_config['Offsets_Transducer_Depth'],
-                                             cell_depth_in=cell_depth_m,
-                                             cell_size_in=cell_size_all_m)
+                ds_depth[0, :] = (
+                    (last_depth * scale_factor)
+                    + mmt_config["DS_Transducer_Depth"]
+                    + mmt_config["DS_Transducer_Offset"]
+                )
+
+                self.depths.add_depth_object(
+                    depth_in=ds_depth,
+                    source_in="DS",
+                    freq_in=np.tile(np.nan, pd0_data.Inst.freq.shape),
+                    draft_in=mmt_config["Offsets_Transducer_Depth"],
+                    cell_depth_in=cell_depth_m,
+                    cell_size_in=cell_size_all_m,
+                )
 
             # Set depth reference to value from mmt file
-            if 'Proc_River_Depth_Source' in mmt_config:
-                if mmt_config['Proc_River_Depth_Source'] == 0:
-                    self.depths.selected = 'bt_depths'
-                    self.depths.composite_depths(transect=self, setting='Off')
+            if "Proc_River_Depth_Source" in mmt_config:
+                if mmt_config["Proc_River_Depth_Source"] == 0:
+                    self.depths.selected = "bt_depths"
+                    self.depths.composite_depths(transect=self, setting="Off")
 
-                elif mmt_config['Proc_River_Depth_Source'] == 1:
+                elif mmt_config["Proc_River_Depth_Source"] == 1:
                     if self.depths.ds_depths is not None:
-                        self.depths.selected = 'ds_depths'
+                        self.depths.selected = "ds_depths"
                     else:
-                        self.depths.selected = 'bt_depths'
-                    self.depths.composite_depths(transect=self, setting='Off')
+                        self.depths.selected = "bt_depths"
+                    self.depths.composite_depths(transect=self, setting="Off")
 
-                elif mmt_config['Proc_River_Depth_Source'] == 2:
+                elif mmt_config["Proc_River_Depth_Source"] == 2:
                     if self.depths.vb_depths is not None:
-                        self.depths.selected = 'vb_depths'
+                        self.depths.selected = "vb_depths"
                     else:
-                        self.depths.selected = 'bt_depths'
-                    self.depths.composite_depths(transect=self, setting='Off')
+                        self.depths.selected = "bt_depths"
+                    self.depths.composite_depths(transect=self, setting="Off")
 
-                elif mmt_config['Proc_River_Depth_Source'] == 3:
+                elif mmt_config["Proc_River_Depth_Source"] == 3:
                     if self.depths.vb_depths is None:
-                        self.depths.selected = 'bt_depths'
-                        self.depths.composite_depths(transect=self, setting='Off')
+                        self.depths.selected = "bt_depths"
+                        self.depths.composite_depths(transect=self, setting="Off")
                     else:
-                        self.depths.selected = 'vb_depths'
-                        self.depths.composite_depths(transect=self, setting='On')
+                        self.depths.selected = "vb_depths"
+                        self.depths.composite_depths(transect=self, setting="On")
 
-                elif mmt_config['Proc_River_Depth_Source'] == 4:
+                elif mmt_config["Proc_River_Depth_Source"] == 4:
                     if self.depths.bt_depths is not None:
-                        self.depths.selected = 'bt_depths'
-                        if self.depths.vb_depths is not None or self.depths.ds_depths is not None:
-                            self.depths.composite_depths(transect=self, setting='On')
+                        self.depths.selected = "bt_depths"
+                        if (
+                            self.depths.vb_depths is not None
+                            or self.depths.ds_depths is not None
+                        ):
+                            self.depths.composite_depths(transect=self, setting="On")
                         else:
-                            self.depths.composite_depths(transect=self, setting='Off')
+                            self.depths.composite_depths(transect=self, setting="Off")
                     elif self.depths.vb_depths is not None:
-                        self.depths.selected = 'vb_depths'
-                        self.depths.composite_depths(transect=self, setting='On')
+                        self.depths.selected = "vb_depths"
+                        self.depths.composite_depths(transect=self, setting="On")
                     elif self.depths.ds_depths is not None:
-                        self.depths.selected = 'ds_depths'
-                        self.depths.composite_depths(transect=self, setting='On')
+                        self.depths.selected = "ds_depths"
+                        self.depths.composite_depths(transect=self, setting="On")
                 else:
-                    self.depths.selected = 'bt_depths'
-                    self.depths.composite_depths(transect=self, setting='Off')
+                    self.depths.selected = "bt_depths"
+                    self.depths.composite_depths(transect=self, setting="Off")
             else:
-                if mmt_config['DS_Use_Process'] > 0:
+                if mmt_config["DS_Use_Process"] > 0:
                     if self.depths.ds_depths is not None:
-                        self.depths.selected = 'ds_depths'
+                        self.depths.selected = "ds_depths"
                     else:
-                        self.depths.selected = 'bt_depths'
+                        self.depths.selected = "bt_depths"
                 else:
-                    self.depths.selected = 'bt_depths'
-                self.depths.composite_depths(transect=self, setting='Off')
+                    self.depths.selected = "bt_depths"
+                self.depths.composite_depths(transect=self, setting="Off")
 
             # Create water_data object
             # ------------------------
@@ -428,166 +516,197 @@ class TransectData(object):
             # Check for RiverRay and RiverPro data
             firmware = str(pd0_data.Inst.firm_ver[0])
             excluded_dist = 0
-            if (firmware[:2] == '56') and (np.nanmax(pd0_data.Sensor.vert_beam_status) < 0.9):
+            if (firmware[:2] == "56") and (
+                np.nanmax(pd0_data.Sensor.vert_beam_status) < 0.9
+            ):
                 excluded_dist = 0.25
 
-            if (firmware[:2] == '44') or (firmware[:2] == '56'):
+            if (firmware[:2] == "44") or (firmware[:2] == "56"):
                 # Process water velocities for RiverRay and RiverPro
                 self.w_vel = WaterData()
-                self.w_vel.populate_data(vel_in=pd0_data.Wt.vel_mps,
-                                         freq_in=freq_ts,
-                                         coord_sys_in=pd0_data.Cfg.coord_sys,
-                                         nav_ref_in='None',
-                                         rssi_in=pd0_data.Wt.rssi,
-                                         rssi_units_in='Counts',
-                                         excluded_dist_in=excluded_dist,
-                                         cells_above_sl_in=cells_above_sl,
-                                         sl_cutoff_per_in=sl_cutoff_per,
-                                         sl_cutoff_num_in=0,
-                                         sl_cutoff_type_in='Percent',
-                                         sl_lag_effect_in=sl_lag_effect_m,
-                                         sl_cutoff_m=sl_cutoff_m,
-                                         wm_in=pd0_data.Cfg.wm[0],
-                                         blank_in=pd0_data.Cfg.wf_cm[0] / 100,
-                                         corr_in=pd0_data.Wt.corr,
-                                         surface_vel_in=pd0_data.Surface.vel_mps,
-                                         surface_rssi_in=pd0_data.Surface.rssi,
-                                         surface_corr_in=pd0_data.Surface.corr,
-                                         surface_num_cells_in=pd0_data.Surface.no_cells,
-                                         ping_type=ensemble_ping_type)
+                self.w_vel.populate_data(
+                    vel_in=pd0_data.Wt.vel_mps,
+                    freq_in=freq_ts,
+                    coord_sys_in=pd0_data.Cfg.coord_sys,
+                    nav_ref_in="None",
+                    rssi_in=pd0_data.Wt.rssi,
+                    rssi_units_in="Counts",
+                    excluded_dist_in=excluded_dist,
+                    cells_above_sl_in=cells_above_sl,
+                    sl_cutoff_per_in=sl_cutoff_per,
+                    sl_cutoff_num_in=0,
+                    sl_cutoff_type_in="Percent",
+                    sl_lag_effect_in=sl_lag_effect_m,
+                    sl_cutoff_m=sl_cutoff_m,
+                    wm_in=pd0_data.Cfg.wm[0],
+                    blank_in=pd0_data.Cfg.wf_cm[0] / 100,
+                    corr_in=pd0_data.Wt.corr,
+                    surface_vel_in=pd0_data.Surface.vel_mps,
+                    surface_rssi_in=pd0_data.Surface.rssi,
+                    surface_corr_in=pd0_data.Surface.corr,
+                    surface_num_cells_in=pd0_data.Surface.no_cells,
+                    ping_type=ensemble_ping_type,
+                )
 
             else:
                 # Process water velocities for non-RiverRay ADCPs
                 self.w_vel = WaterData()
-                self.w_vel.populate_data(vel_in=pd0_data.Wt.vel_mps,
-                                         freq_in=freq_ts,
-                                         coord_sys_in=pd0_data.Cfg.coord_sys[0],
-                                         nav_ref_in='None',
-                                         rssi_in=pd0_data.Wt.rssi,
-                                         rssi_units_in='Counts',
-                                         excluded_dist_in=excluded_dist,
-                                         cells_above_sl_in=cells_above_sl,
-                                         sl_cutoff_per_in=sl_cutoff_per,
-                                         sl_cutoff_num_in=0,
-                                         sl_cutoff_type_in='Percent',
-                                         sl_lag_effect_in=sl_lag_effect_m,
-                                         sl_cutoff_m=sl_cutoff_m,
-                                         wm_in=pd0_data.Cfg.wm[0],
-                                         blank_in=pd0_data.Cfg.wf_cm[0] / 100,
-                                         corr_in=pd0_data.Wt.corr,
-                                         ping_type=ensemble_ping_type)
+                self.w_vel.populate_data(
+                    vel_in=pd0_data.Wt.vel_mps,
+                    freq_in=freq_ts,
+                    coord_sys_in=pd0_data.Cfg.coord_sys[0],
+                    nav_ref_in="None",
+                    rssi_in=pd0_data.Wt.rssi,
+                    rssi_units_in="Counts",
+                    excluded_dist_in=excluded_dist,
+                    cells_above_sl_in=cells_above_sl,
+                    sl_cutoff_per_in=sl_cutoff_per,
+                    sl_cutoff_num_in=0,
+                    sl_cutoff_type_in="Percent",
+                    sl_lag_effect_in=sl_lag_effect_m,
+                    sl_cutoff_m=sl_cutoff_m,
+                    wm_in=pd0_data.Cfg.wm[0],
+                    blank_in=pd0_data.Cfg.wf_cm[0] / 100,
+                    corr_in=pd0_data.Wt.corr,
+                    ping_type=ensemble_ping_type,
+                )
 
             # Create Edges Object
             self.edges = Edges()
-            self.edges.populate_data(rec_edge_method='Fixed', vel_method='MeasMag')
+            self.edges.populate_data(rec_edge_method="Fixed", vel_method="MeasMag")
 
             # Determine number of ensembles to average
-            n_ens_left = mmt_config['Q_Shore_Pings_Avg']
+            n_ens_left = mmt_config["Q_Shore_Pings_Avg"]
             # TRDI uses same number on left and right edges
             n_ens_right = n_ens_left
 
-            # Set indices for ensembles in the moving-boat portion of the transect
+            # Set indices for ensembles in the moving-boat portion of the
+            # transect
             self.in_transect_idx = np.arange(0, pd0_data.Bt.vel_mps.shape[1])
 
             # Determine left and right edge distances
-            if mmt_config['Edge_Begin_Left_Bank']:
-                dist_left = float(mmt_config['Edge_Begin_Shore_Distance'])
-                dist_right = float(mmt_config['Edge_End_Shore_Distance'])
-                if 'Edge_End_Manual_Discharge' in mmt_config:
-                    user_discharge_left = float(mmt_config['Edge_Begin_Manual_Discharge'])
-                    user_discharge_right = float(mmt_config['Edge_End_Manual_Discharge'])
-                    edge_method_left = mmt_config['Edge_Begin_Method_Distance']
-                    edge_method_right = mmt_config['Edge_End_Method_Distance']
+            if mmt_config["Edge_Begin_Left_Bank"]:
+                dist_left = float(mmt_config["Edge_Begin_Shore_Distance"])
+                dist_right = float(mmt_config["Edge_End_Shore_Distance"])
+                if "Edge_End_Manual_Discharge" in mmt_config:
+                    user_discharge_left = float(
+                        mmt_config["Edge_Begin_Manual_Discharge"]
+                    )
+                    user_discharge_right = float(
+                        mmt_config["Edge_End_Manual_Discharge"]
+                    )
+                    edge_method_left = mmt_config["Edge_Begin_Method_Distance"]
+                    edge_method_right = mmt_config["Edge_End_Method_Distance"]
                 else:
                     user_discharge_left = None
                     user_discharge_right = None
-                    edge_method_left = 'Yes'
-                    edge_method_right = 'Yes'
-                self.start_edge = 'Left'
-                self.orig_start_edge = 'Left'
+                    edge_method_left = "Yes"
+                    edge_method_right = "Yes"
+                self.start_edge = "Left"
+                self.orig_start_edge = "Left"
             else:
-                dist_left = float(mmt_config['Edge_End_Shore_Distance'])
-                dist_right = float(mmt_config['Edge_Begin_Shore_Distance'])
-                if 'Edge_End_Manual_Discharge' in mmt_config:
-                    user_discharge_left = float(mmt_config['Edge_End_Manual_Discharge'])
-                    user_discharge_right = float(mmt_config['Edge_Begin_Manual_Discharge'])
-                    edge_method_left = mmt_config['Edge_End_Method_Distance']
-                    edge_method_right = mmt_config['Edge_Begin_Method_Distance']
+                dist_left = float(mmt_config["Edge_End_Shore_Distance"])
+                dist_right = float(mmt_config["Edge_Begin_Shore_Distance"])
+                if "Edge_End_Manual_Discharge" in mmt_config:
+                    user_discharge_left = float(mmt_config["Edge_End_Manual_Discharge"])
+                    user_discharge_right = float(
+                        mmt_config["Edge_Begin_Manual_Discharge"]
+                    )
+                    edge_method_left = mmt_config["Edge_End_Method_Distance"]
+                    edge_method_right = mmt_config["Edge_Begin_Method_Distance"]
                 else:
                     user_discharge_left = None
                     user_discharge_right = None
-                    edge_method_left = 'Yes'
-                    edge_method_right = 'Yes'
-                self.start_edge = 'Right'
-                self.orig_start_edge = 'Right'
+                    edge_method_left = "Yes"
+                    edge_method_right = "Yes"
+                self.start_edge = "Right"
+                self.orig_start_edge = "Right"
 
             # Create left edge
-            if edge_method_left == 'NO':
-                self.edges.left.populate_data(edge_type='User Q',
-                                              distance=dist_left,
-                                              number_ensembles=n_ens_left,
-                                              user_discharge=user_discharge_left)
-
-            elif mmt_config['Q_Left_Edge_Type'] == 0:
-                self.edges.left.populate_data(edge_type='Triangular',
-                                              distance=dist_left,
-                                              number_ensembles=n_ens_left,
-                                              user_discharge=user_discharge_left)
-
-            elif mmt_config['Q_Left_Edge_Type'] == 1:
-                self.edges.left.populate_data(edge_type='Rectangular',
-                                              distance=dist_left,
-                                              number_ensembles=n_ens_left,
-                                              user_discharge=user_discharge_left)
-
-            elif mmt_config['Q_Left_Edge_Type'] == 2:
-                self.edges.left.populate_data(edge_type='Custom',
-                                              distance=dist_left,
-                                              number_ensembles=n_ens_left,
-                                              coefficient=mmt_config['Q_Left_Edge_Coeff'],
-                                              user_discharge=user_discharge_left)
+            if edge_method_left == "NO":
+                self.edges.left.populate_data(
+                    edge_type="User Q",
+                    distance=dist_left,
+                    number_ensembles=n_ens_left,
+                    user_discharge=user_discharge_left,
+                )
+
+            elif mmt_config["Q_Left_Edge_Type"] == 0:
+                self.edges.left.populate_data(
+                    edge_type="Triangular",
+                    distance=dist_left,
+                    number_ensembles=n_ens_left,
+                    user_discharge=user_discharge_left,
+                )
+
+            elif mmt_config["Q_Left_Edge_Type"] == 1:
+                self.edges.left.populate_data(
+                    edge_type="Rectangular",
+                    distance=dist_left,
+                    number_ensembles=n_ens_left,
+                    user_discharge=user_discharge_left,
+                )
+
+            elif mmt_config["Q_Left_Edge_Type"] == 2:
+                self.edges.left.populate_data(
+                    edge_type="Custom",
+                    distance=dist_left,
+                    number_ensembles=n_ens_left,
+                    coefficient=mmt_config["Q_Left_Edge_Coeff"],
+                    user_discharge=user_discharge_left,
+                )
 
             # Create right edge
-            if edge_method_right == 'NO':
-                self.edges.right.populate_data(edge_type='User Q',
-                                               distance=dist_right,
-                                               number_ensembles=n_ens_right,
-                                               user_discharge=user_discharge_right)
-            elif mmt_config['Q_Right_Edge_Type'] == 0:
-                self.edges.right.populate_data(edge_type='Triangular',
-                                               distance=dist_right,
-                                               number_ensembles=n_ens_right,
-                                               user_discharge=user_discharge_right)
-
-            elif mmt_config['Q_Right_Edge_Type'] == 1:
-                self.edges.right.populate_data(edge_type='Rectangular',
-                                               distance=dist_right,
-                                               number_ensembles=n_ens_right,
-                                               user_discharge=user_discharge_right)
-
-            elif mmt_config['Q_Right_Edge_Type'] == 2:
-                self.edges.right.populate_data(edge_type='Custom',
-                                               distance=dist_right,
-                                               number_ensembles=n_ens_right,
-                                               coefficient=mmt_config['Q_Right_Edge_Coeff'],
-                                               user_discharge=user_discharge_right)
+            if edge_method_right == "NO":
+                self.edges.right.populate_data(
+                    edge_type="User Q",
+                    distance=dist_right,
+                    number_ensembles=n_ens_right,
+                    user_discharge=user_discharge_right,
+                )
+            elif mmt_config["Q_Right_Edge_Type"] == 0:
+                self.edges.right.populate_data(
+                    edge_type="Triangular",
+                    distance=dist_right,
+                    number_ensembles=n_ens_right,
+                    user_discharge=user_discharge_right,
+                )
+
+            elif mmt_config["Q_Right_Edge_Type"] == 1:
+                self.edges.right.populate_data(
+                    edge_type="Rectangular",
+                    distance=dist_right,
+                    number_ensembles=n_ens_right,
+                    user_discharge=user_discharge_right,
+                )
+
+            elif mmt_config["Q_Right_Edge_Type"] == 2:
+                self.edges.right.populate_data(
+                    edge_type="Custom",
+                    distance=dist_right,
+                    number_ensembles=n_ens_right,
+                    coefficient=mmt_config["Q_Right_Edge_Coeff"],
+                    user_discharge=user_discharge_right,
+                )
 
             # Create extrap object
             # --------------------
             # Determine top method
-            top = 'Power'
-            if mmt_config['Q_Top_Method'] == 1:
-                top = 'Constant'
-            elif mmt_config['Q_Top_Method'] == 2:
-                top = '3-Point'
+            top = "Power"
+            if mmt_config["Q_Top_Method"] == 1:
+                top = "Constant"
+            elif mmt_config["Q_Top_Method"] == 2:
+                top = "3-Point"
 
             # Determine bottom method
-            bot = 'Power'
-            if mmt_config['Q_Bottom_Method'] == 2:
-                bot = 'No Slip'
+            bot = "Power"
+            if mmt_config["Q_Bottom_Method"] == 2:
+                bot = "No Slip"
 
             self.extrap = ExtrapData()
-            self.extrap.populate_data(top=top, bot=bot, exp=mmt_config['Q_Power_Curve_Coeff'])
+            self.extrap.populate_data(
+                top=top, bot=bot, exp=mmt_config["Q_Power_Curve_Coeff"]
+            )
 
             # Sensor Data
             self.sensors = Sensors()
@@ -596,15 +715,19 @@ class TransectData(object):
 
             # Internal Heading
             self.sensors.heading_deg.internal = HeadingData()
-            self.sensors.heading_deg.internal.populate_data(data_in=pd0_data.Sensor.heading_deg.T,
-                                                            source_in='internal',
-                                                            magvar=mmt_config['Offsets_Magnetic_Variation'],
-                                                            align=mmt_config['Ext_Heading_Offset'])
+            self.sensors.heading_deg.internal.populate_data(
+                data_in=pd0_data.Sensor.heading_deg.T,
+                source_in="internal",
+                magvar=mmt_config["Offsets_Magnetic_Variation"],
+                align=mmt_config["Ext_Heading_Offset"],
+            )
 
             # External Heading
-            ext_heading_check = np.where(np.isnan(pd0_data.Gps2.heading_deg) == False)
+            ext_heading_check = np.where(
+                np.logical_not(np.isnan(pd0_data.Gps2.heading_deg))
+            )
             if len(ext_heading_check[0]) <= 0:
-                self.sensors.heading_deg.selected = 'internal'
+                self.sensors.heading_deg.selected = "internal"
             else:
                 # Determine external heading for each ensemble
                 # Using the minimum time difference
@@ -623,26 +746,32 @@ class TransectData(object):
 
                 # Create external heading sensor
                 self.sensors.heading_deg.external = HeadingData()
-                self.sensors.heading_deg.external.populate_data(data_in=ext_heading_deg,
-                                                                source_in='external',
-                                                                magvar=mmt_config['Offsets_Magnetic_Variation'],
-                                                                align=mmt_config['Ext_Heading_Offset'])
+                self.sensors.heading_deg.external.populate_data(
+                    data_in=ext_heading_deg,
+                    source_in="external",
+                    magvar=mmt_config["Offsets_Magnetic_Variation"],
+                    align=mmt_config["Ext_Heading_Offset"],
+                )
 
                 # Determine heading source to use from mmt setting
-                source_used = mmt_config['Ext_Heading_Use']
+                source_used = mmt_config["Ext_Heading_Use"]
                 if source_used:
-                    self.sensors.heading_deg.selected = 'external'
+                    self.sensors.heading_deg.selected = "external"
                 else:
-                    self.sensors.heading_deg.selected = 'internal'
+                    self.sensors.heading_deg.selected = "internal"
 
             # Pitch
-            pitch = arctand(tand(pd0_data.Sensor.pitch_deg) * cosd(pd0_data.Sensor.roll_deg))
+            pitch = arctand(
+                tand(pd0_data.Sensor.pitch_deg) * cosd(pd0_data.Sensor.roll_deg)
+            )
             pitch_src = pd0_data.Cfg.pitch_src[0]
 
             # Create pitch sensor
             self.sensors.pitch_deg.internal = SensorData()
-            self.sensors.pitch_deg.internal.populate_data(data_in=pitch, source_in=pitch_src)
-            self.sensors.pitch_deg.selected = 'internal'
+            self.sensors.pitch_deg.internal.populate_data(
+                data_in=pitch, source_in=pitch_src
+            )
+            self.sensors.pitch_deg.selected = "internal"
 
             # Roll
             roll = pd0_data.Sensor.roll_deg.T
@@ -650,8 +779,10 @@ class TransectData(object):
 
             # Create Roll sensor
             self.sensors.roll_deg.internal = SensorData()
-            self.sensors.roll_deg.internal.populate_data(data_in=roll, source_in=roll_src)
-            self.sensors.roll_deg.selected = 'internal'
+            self.sensors.roll_deg.internal.populate_data(
+                data_in=roll, source_in=roll_src
+            )
+            self.sensors.roll_deg.selected = "internal"
 
             # Temperature
             temperature = pd0_data.Sensor.temperature_deg_c.T
@@ -659,8 +790,10 @@ class TransectData(object):
 
             # Create temperature sensor
             self.sensors.temperature_deg_c.internal = SensorData()
-            self.sensors.temperature_deg_c.internal.populate_data(data_in=temperature, source_in=temperature_src)
-            self.sensors.temperature_deg_c.selected = 'internal'
+            self.sensors.temperature_deg_c.internal.populate_data(
+                data_in=temperature, source_in=temperature_src
+            )
+            self.sensors.temperature_deg_c.selected = "internal"
 
             # Salinity
             pd0_salinity = pd0_data.Sensor.salinity_ppt.T
@@ -668,30 +801,54 @@ class TransectData(object):
 
             # Create salinity sensor from pd0 data
             self.sensors.salinity_ppt.internal = SensorData()
-            self.sensors.salinity_ppt.internal.populate_data(data_in=pd0_salinity, source_in=pd0_salinity_src)
+            self.sensors.salinity_ppt.internal.populate_data(
+                data_in=pd0_salinity, source_in=pd0_salinity_src
+            )
 
             # Create salinity sensor from mmt data
-            mmt_salinity = mmt_config['Proc_Salinity']
+            mmt_salinity = mmt_config["Proc_Salinity"]
             mmt_salinity = np.tile(mmt_salinity, pd0_salinity.shape)
             self.sensors.salinity_ppt.user = SensorData()
-            self.sensors.salinity_ppt.user.populate_data(data_in=mmt_salinity, source_in='mmt')
+            self.sensors.salinity_ppt.user.populate_data(
+                data_in=mmt_salinity, source_in="mmt"
+            )
 
             # Set selected salinity
-            self.sensors.salinity_ppt.selected = 'internal'
+            self.sensors.salinity_ppt.selected = "internal"
 
             # Speed of Sound
             speed_of_sound = pd0_data.Sensor.sos_mps.T
             speed_of_sound_src = pd0_data.Cfg.sos_src[0]
             self.sensors.speed_of_sound_mps.internal = SensorData()
-            self.sensors.speed_of_sound_mps.internal.populate_data(data_in=speed_of_sound, source_in=speed_of_sound_src)
+            self.sensors.speed_of_sound_mps.internal.populate_data(
+                data_in=speed_of_sound, source_in=speed_of_sound_src
+            )
 
             # The raw data are referenced to the internal SOS
-            self.sensors.speed_of_sound_mps.selected = 'internal'
+            self.sensors.speed_of_sound_mps.selected = "internal"
+
+            # Battery voltage
+            self.sensors.battery_voltage.internal = SensorData()
+
+            # Determine TRDI model
+            num = float(pd0_data.Inst.firm_ver[0])
+            model_switch = np.floor(num)
+
+            # Rio Grande voltage does not represent battery voltage and is set to nan
+            if model_switch == 10:
+                scale_factor = np.nan
+            else:
+                scale_factor = 0.1
+
+            self.sensors.battery_voltage.internal.populate_data(
+                data_in=pd0_data.Sensor.xmit_voltage * scale_factor,
+                source_in="internal",
+            )
 
     @staticmethod
     def trdi_ping_type(pd0_data):
-        """Determines if the ping is coherent on incoherent based on the lag near bottom. A coherent ping will have
-        the lag near the bottom.
+        """Determines if the ping is coherent on incoherent based on the lag near bottom.
+        A coherent ping will have the lag near the bottom.
 
         Parameters
         ----------
@@ -707,36 +864,37 @@ class TransectData(object):
 
         firmware = str(pd0_data.Inst.firm_ver[0])
         # RiverRay, RiverPro, and RioPro
-        if (firmware[:2] == '44') or (firmware[:2] == '56'):
-            if hasattr(pd0_data.Cfg, 'lag_near_bottom'):
+        if (firmware[:2] == "44") or (firmware[:2] == "56"):
+            if hasattr(pd0_data.Cfg, "lag_near_bottom"):
                 ping_temp = pd0_data.Cfg.lag_near_bottom > 0
-                ping_type = np.tile(['U'], ping_temp.shape)
-                ping_type[ping_temp == 0] = 'I'
-                ping_type[ping_temp == 1] = 'C'
+                ping_type = np.tile(["U"], ping_temp.shape)
+                ping_type[ping_temp == 0] = "I"
+                ping_type[ping_temp == 1] = "C"
 
         # StreamPro
-        elif firmware[:2] == '31':
+        elif firmware[:2] == "31":
             if pd0_data.Cfg.wm[0] == 12:
-                ping_type = np.tile(['I'], pd0_data.Wt.vel_mps.shape[2])
+                ping_type = np.tile(["I"], pd0_data.Wt.vel_mps.shape[2])
             elif pd0_data.Cfg.wm[0] == 13:
-                ping_type = np.tile(['C'], pd0_data.Wt.vel_mps.shape[2])
+                ping_type = np.tile(["C"], pd0_data.Wt.vel_mps.shape[2])
             else:
-                ping_type = np.tile(['U'], pd0_data.Wt.vel_mps.shape[2])
+                ping_type = np.tile(["U"], pd0_data.Wt.vel_mps.shape[2])
 
         # Rio Grande
-        elif firmware[:2] == '10':
+        elif firmware[:2] == "10":
             if pd0_data.Cfg.wm[0] == 1 or pd0_data.Cfg.wm[0] == 12:
-                ping_type = np.tile(['I'], pd0_data.Wt.vel_mps.shape[2])
+                ping_type = np.tile(["I"], pd0_data.Wt.vel_mps.shape[2])
             elif pd0_data.Cfg.wm[0] == 5 or pd0_data.Cfg.wm[0] == 8:
-                ping_type = np.tile(['C'], pd0_data.Wt.vel_mps.shape[2])
+                ping_type = np.tile(["C"], pd0_data.Wt.vel_mps.shape[2])
             else:
-                ping_type = np.tile(['U'], pd0_data.Wt.vel_mps.shape[2])
+                ping_type = np.tile(["U"], pd0_data.Wt.vel_mps.shape[2])
         else:
-            ping_type = np.tile(['U'], pd0_data.Wt.vel_mps.shape[2])
+            ping_type = np.tile(["U"], pd0_data.Wt.vel_mps.shape[2])
         return ping_type
 
-    def sontek(self, rsdata, file_name):
-        """Reads Matlab file produced by RiverSurveyor Live and populates the transect instance variables.
+    def sontek(self, rsdata, file_name, snr_3beam_comp):
+        """Reads Matlab file produced by RiverSurveyor Live and populates the
+         transect instance variables.
 
         Parameters
         ----------
@@ -744,6 +902,8 @@ class TransectData(object):
             Object of Matlab data from SonTek Matlab files
         file_name: str
             Name of SonTek Matlab file not including path.
+        snr_3beam_comp: bool
+            Indicates the use of 3-beam velocity computations when invalid SNR is found
         """
 
         self.file_name = os.path.basename(file_name)
@@ -751,28 +911,28 @@ class TransectData(object):
         # ADCP instrument information
         # ---------------------------
         self.adcp = InstrumentData()
-        if hasattr(rsdata.System, 'InstrumentModel'):
-            self.adcp.populate_data(manufacturer='Nortek', raw_data=rsdata)
+        if hasattr(rsdata.System, "InstrumentModel"):
+            self.adcp.populate_data(manufacturer="Nortek", raw_data=rsdata)
         else:
-            self.adcp.populate_data(manufacturer='SonTek', raw_data=rsdata)
+            self.adcp.populate_data(manufacturer="SonTek", raw_data=rsdata)
 
         # Ensemble times
         ensemble_delta_time = np.append([0], np.diff(rsdata.System.Time))
-        # TODO potentially add popup message when there are missing ensembles. Matlab did that.
-
-        # idx_missing = np.where(ensemble_delta_time > 1.5)
-        # if len(idx_missing[0]) > 0:
-        #     number_missing = np.sum(ensemble_delta_time[idx_missing]) - len(idx_missing)
-        #     error_str = self.file_name + ' is missing ' + str(number_missing) + ' samples'
+        # TODO potentially add popup message when there are missing ensembles.
+        #  Matlab did that.
 
         start_serial_time = rsdata.System.Time[0] + ((30 * 365) + 7) * 24 * 60 * 60
         end_serial_time = rsdata.System.Time[-1] + ((30 * 365) + 7) * 24 * 60 * 60
-        meas_date = datetime.strftime(datetime.fromtimestamp(start_serial_time), '%m/%d/%Y')
+        meas_date = datetime.strftime(
+            datetime.fromtimestamp(start_serial_time), "%m/%d/%Y"
+        )
         self.date_time = DateTime()
-        self.date_time.populate_data(date_in=meas_date,
-                                     start_in=start_serial_time,
-                                     end_in=end_serial_time,
-                                     ens_dur_in=ensemble_delta_time)
+        self.date_time.populate_data(
+            date_in=meas_date,
+            start_in=start_serial_time,
+            end_in=end_serial_time,
+            ens_dur_in=ensemble_delta_time,
+        )
 
         # Transect checked for use in discharge computations
         self.checked = True
@@ -780,61 +940,75 @@ class TransectData(object):
         # Coordinate system
         ref_coord = None
 
-        # The initial coordinate system must be set to earth for early versions of RiverSurveyor firmware.
-        # This implementation forces all versions to use the earth coordinate system.
+        # The initial coordinate system must be set to earth for early versions
+        # of RiverSurveyor firmware. This implementation forces all versions to use
+        # the earth coordinate system.
         if rsdata.Setup.coordinateSystem == 0:
-            # ref_coord = 'Beam'
-            raise CoordError('Beam Coordinates are not supported for all RiverSuveyor firmware releases, ' +
-                             'use Earth coordinates.')
+            # ref_coord = "Beam"
+            raise CoordError(
+                "Beam Coordinates are not supported for all "
+                "RiverSuveyor firmware releases, " + "use Earth coordinates."
+            )
         elif rsdata.Setup.coordinateSystem == 1:
-            # ref_coord = 'Inst'
-            raise CoordError('Instrument Coordinates are not supported for all RiverSuveyor firmware releases, ' +
-                             'use Earth coordinates.')
+            # ref_coord = "Inst"
+            raise CoordError(
+                "Instrument Coordinates are not supported for all"
+                " RiverSuveyor firmware releases, " + "use Earth coordinates."
+            )
         elif rsdata.Setup.coordinateSystem == 2:
-            ref_coord = 'Earth'
+            ref_coord = "Earth"
 
         # Speed of Sound Parameters
         # -------------------------
-        # In SonTek's Matlab file the BT velocity, VB Depth, and WT Velocity are not reported as raw data but rather
-        # are reported as processed values based on manual settings of temperature, salinity, and speed of sound.
+        # In SonTek's Matlab file the BT velocity, VB Depth, and WT Velocity
+        # are not reported as raw data but rather are reported as processed values
+        # based on manual settings of temperature, salinity, and speed of sound.
         # Note: the 4 beam depths are raw data and are not adjusted.
-        # QRev expects raw data to be independent of user settings. Therefore, manual settings must be identified
-        # and the Matlab data adjusted to reflect the raw data before creating the data classes in QRev.
+        # QRev expects raw data to be independent of user settings. Therefore,
+        # manual settings must be identified and the Matlab data adjusted to reflect
+        # the raw data before creating the data classes in QRev.
         # The manual values will then be applied during processing.
 
         self.sensors = Sensors()
 
         # Temperature
-        if rsdata.System.Units.Temperature.find('C') >= 0:
+        if rsdata.System.Units.Temperature.find("C") >= 0:
             temperature = rsdata.System.Temperature
         else:
-            temperature = (5. / 9.) * (rsdata.System.Temperature - 32)
+            temperature = (5.0 / 9.0) * (rsdata.System.Temperature - 32)
         self.sensors.temperature_deg_c.internal = SensorData()
-        self.sensors.temperature_deg_c.internal.populate_data(data_in=temperature, source_in='internal')
-        self.sensors.temperature_deg_c.selected = 'internal'
+        self.sensors.temperature_deg_c.internal.populate_data(
+            data_in=temperature, source_in="internal"
+        )
+        self.sensors.temperature_deg_c.selected = "internal"
 
-        if hasattr(rsdata.Setup, 'userTemperature'):
+        if hasattr(rsdata.Setup, "userTemperature"):
             if rsdata.Setup.useMeasuredTemperature == 0:
-                if rsdata.Setup.Units.userTemperature.find('C') >= 0:
+                if rsdata.Setup.Units.userTemperature.find("C") >= 0:
                     temperature = rsdata.Setup.userTemperature
                 else:
-                    temperature = (5. / 9.) * (rsdata.Setup.userTemperature - 32)
+                    temperature = (5.0 / 9.0) * (rsdata.Setup.userTemperature - 32)
                 self.sensors.temperature_deg_c.user = SensorData()
-                self.sensors.temperature_deg_c.user.populate_data(data_in=temperature, source_in='Manual')
-                self.sensors.temperature_deg_c.selected = 'user'
+                self.sensors.temperature_deg_c.user.populate_data(
+                    data_in=temperature, source_in="Manual"
+                )
+                self.sensors.temperature_deg_c.selected = "user"
 
         # Salinity
-        # Create internal salinity using a zero value since salinity can only be applied in RSL and not in the raw data
+        # Create internal salinity using a zero value since salinity can only
+        # be applied in RSL and not in the raw data
         self.sensors.salinity_ppt.internal = SensorData()
-        self.sensors.salinity_ppt.internal.populate_data(data_in=0, source_in='QRev')
+        self.sensors.salinity_ppt.internal.populate_data(data_in=0, source_in="QRev")
         self.sensors.salinity_ppt.user = SensorData()
-        self.sensors.salinity_ppt.user.populate_data(data_in=rsdata.Setup.userSalinity, source_in='Manual')
+        self.sensors.salinity_ppt.user.populate_data(
+            data_in=rsdata.Setup.userSalinity, source_in="Manual"
+        )
 
         # Set salinity source
         if rsdata.Setup.userSalinity > 0:
-            self.sensors.salinity_ppt.selected = 'user'
+            self.sensors.salinity_ppt.selected = "user"
         else:
-            self.sensors.salinity_ppt.selected = 'internal'
+            self.sensors.salinity_ppt.selected = "internal"
 
         # Speed of sound
         # Internal sos provided in SonTek data but is computed from equation.
@@ -842,30 +1016,43 @@ class TransectData(object):
         salinity = self.sensors.salinity_ppt.internal.data
         speed_of_sound = Sensors.unesco_speed_of_sound(t=temperature, s=salinity)
         self.sensors.speed_of_sound_mps.internal = SensorData()
-        self.sensors.speed_of_sound_mps.internal.populate_data(data_in=speed_of_sound, source_in='QRev')
-        self.sensors.speed_of_sound_mps.selected = 'internal'
+        self.sensors.speed_of_sound_mps.internal.populate_data(
+            data_in=speed_of_sound, source_in="QRev"
+        )
+        self.sensors.speed_of_sound_mps.selected = "internal"
 
-        if hasattr(rsdata.Setup, 'useFixedSoundSpeed'):
+        if hasattr(rsdata.Setup, "useFixedSoundSpeed"):
             if rsdata.Setup.useFixedSoundSpeed > 0:
                 self.sensors.speed_of_sound_mps.user = SensorData()
                 user_sos = rsdata.Setup.fixedSoundSpeed
-                self.sensors.speed_of_sound_mps.user.populate_data(data_in=user_sos, source_in='Manual')
-                self.sensors.speed_of_sound_mps.selected = 'user'
+                self.sensors.speed_of_sound_mps.user.populate_data(
+                    data_in=user_sos, source_in="Manual"
+                )
+                self.sensors.speed_of_sound_mps.selected = "user"
 
         # Speed of sound correction to obtain raw data
         sos_correction = None
-        if self.sensors.speed_of_sound_mps.selected == 'user':
-            sos_correction = self.sensors.speed_of_sound_mps.internal.data / self.sensors.speed_of_sound_mps.user.data
-
-        elif self.sensors.salinity_ppt.selected == 'user' or self.sensors.temperature_deg_c.selected == 'user':
-            selected_temperature = getattr(self.sensors.temperature_deg_c, self.sensors.temperature_deg_c.selected)
+        if self.sensors.speed_of_sound_mps.selected == "user":
+            sos_correction = (
+                self.sensors.speed_of_sound_mps.internal.data
+                / self.sensors.speed_of_sound_mps.user.data
+            )
+
+        elif (
+            self.sensors.salinity_ppt.selected == "user"
+            or self.sensors.temperature_deg_c.selected == "user"
+        ):
+            selected_temperature = getattr(
+                self.sensors.temperature_deg_c, self.sensors.temperature_deg_c.selected
+            )
             temperature = selected_temperature.data
-            selected_salinity = getattr(self.sensors.salinity_ppt, self.sensors.salinity_ppt.selected)
+            selected_salinity = getattr(
+                self.sensors.salinity_ppt, self.sensors.salinity_ppt.selected
+            )
             salinity = selected_salinity.data
             sos_user = Sensors.unesco_speed_of_sound(t=temperature, s=salinity)
             sos_correction = self.sensors.speed_of_sound_mps.internal.data / sos_user
 
-
         # Bottom Track
         # ------------
 
@@ -880,6 +1067,13 @@ class TransectData(object):
         # Create valid frequency time series
         freq_ts = self.valid_frequencies(freq)
 
+        # Add ping types
+        if hasattr(rsdata.BottomTrack, "BT_PingType_Text"):
+            # RS5
+            ping_ts = self.rs5_bt_ping_type(rsdata.BottomTrack.BT_PingType_Text)
+        else:
+            ping_ts = None
+
         bt_vel = np.swapaxes(rsdata.BottomTrack.BT_Vel, 1, 0)
 
         # Apply correction for manual sos parameters to obtain raw values
@@ -887,11 +1081,14 @@ class TransectData(object):
             bt_vel = np.around(bt_vel * sos_correction, 3)
 
         self.boat_vel = BoatStructure()
-        self.boat_vel.add_boat_object(source='SonTek',
-                                      vel_in=bt_vel,
-                                      freq_in=freq_ts,
-                                      coord_sys_in=ref_coord,
-                                      nav_ref_in='BT')
+        self.boat_vel.add_boat_object(
+            source="SonTek",
+            vel_in=bt_vel,
+            freq_in=freq_ts,
+            coord_sys_in=ref_coord,
+            nav_ref_in="BT",
+            ping_type=ping_ts,
+        )
 
         # GPS Data
         # --------
@@ -900,80 +1097,97 @@ class TransectData(object):
 
             if len(rsdata.RawGPSData.GgaLatitude.shape) > 1:
 
-                self.gps.populate_data(raw_gga_utc=rsdata.RawGPSData.GgaUTC,
-                                       raw_gga_lat=rsdata.RawGPSData.GgaLatitude,
-                                       raw_gga_lon=rsdata.RawGPSData.GgaLongitude,
-                                       raw_gga_alt=rsdata.RawGPSData.GgaAltitude,
-                                       raw_gga_diff=rsdata.RawGPSData.GgaQuality,
-                                       raw_gga_hdop=np.swapaxes(np.tile(rsdata.GPS.HDOP,
-                                                                        (rsdata.RawGPSData.GgaLatitude.shape[1],
-                                                                         1)), 1, 0),
-                                       raw_gga_num_sats=np.swapaxes(np.tile(rsdata.GPS.Satellites,
-                                                                            (rsdata.RawGPSData.GgaLatitude.shape[1],
-                                                                             1)), 1, 0),
-                                       raw_gga_delta_time=None,
-                                       raw_vtg_course=rsdata.RawGPSData.VtgTmgTrue,
-                                       raw_vtg_speed=rsdata.RawGPSData.VtgSogMPS,
-                                       raw_vtg_delta_time=None,
-                                       raw_vtg_mode_indicator=rsdata.RawGPSData.VtgMode,
-                                       ext_gga_utc=rsdata.GPS.Utc,
-                                       ext_gga_lat=rsdata.GPS.Latitude,
-                                       ext_gga_lon=rsdata.GPS.Longitude,
-                                       ext_gga_alt=rsdata.GPS.Altitude,
-                                       ext_gga_diff=rsdata.GPS.GPS_Quality,
-                                       ext_gga_hdop=rsdata.GPS.HDOP,
-                                       ext_gga_num_sats=rsdata.GPS.Satellites,
-                                       ext_vtg_course=np.tile(np.nan, rsdata.GPS.Latitude.shape),
-                                       ext_vtg_speed=np.tile(np.nan, rsdata.GPS.Latitude.shape),
-                                       gga_p_method='End',
-                                       gga_v_method='End',
-                                       vtg_method='Average')
+                self.gps.populate_data(
+                    raw_gga_utc=rsdata.RawGPSData.GgaUTC,
+                    raw_gga_lat=rsdata.RawGPSData.GgaLatitude,
+                    raw_gga_lon=rsdata.RawGPSData.GgaLongitude,
+                    raw_gga_alt=rsdata.RawGPSData.GgaAltitude,
+                    raw_gga_diff=rsdata.RawGPSData.GgaQuality,
+                    raw_gga_hdop=np.swapaxes(
+                        np.tile(
+                            rsdata.GPS.HDOP, (rsdata.RawGPSData.GgaLatitude.shape[1], 1)
+                        ),
+                        1,
+                        0,
+                    ),
+                    raw_gga_num_sats=np.swapaxes(
+                        np.tile(
+                            rsdata.GPS.Satellites,
+                            (rsdata.RawGPSData.GgaLatitude.shape[1], 1),
+                        ),
+                        1,
+                        0,
+                    ),
+                    raw_gga_delta_time=None,
+                    raw_vtg_course=rsdata.RawGPSData.VtgTmgTrue,
+                    raw_vtg_speed=rsdata.RawGPSData.VtgSogMPS,
+                    raw_vtg_delta_time=None,
+                    raw_vtg_mode_indicator=rsdata.RawGPSData.VtgMode,
+                    ext_gga_utc=rsdata.GPS.Utc,
+                    ext_gga_lat=rsdata.GPS.Latitude,
+                    ext_gga_lon=rsdata.GPS.Longitude,
+                    ext_gga_alt=rsdata.GPS.Altitude,
+                    ext_gga_diff=rsdata.GPS.GPS_Quality,
+                    ext_gga_hdop=rsdata.GPS.HDOP,
+                    ext_gga_num_sats=rsdata.GPS.Satellites,
+                    ext_vtg_course=np.tile(np.nan, rsdata.GPS.Latitude.shape),
+                    ext_vtg_speed=np.tile(np.nan, rsdata.GPS.Latitude.shape),
+                    gga_p_method="End",
+                    gga_v_method="End",
+                    vtg_method="Average",
+                )
             else:
                 # Nortek data
                 rows = rsdata.RawGPSData.GgaLatitude.shape[0]
-                self.gps.populate_data(raw_gga_utc=rsdata.GPS.Utc.reshape(rows, 1),
-                                       raw_gga_lat=rsdata.GPS.Latitude.reshape(rows, 1),
-                                       raw_gga_lon=rsdata.GPS.Longitude.reshape(rows, 1),
-                                       raw_gga_alt=rsdata.GPS.Altitude.reshape(rows, 1),
-                                       raw_gga_diff=rsdata.GPS.GPS_Quality.reshape(rows, 1),
-                                       raw_gga_hdop=rsdata.GPS.HDOP.reshape(rows, 1),
-                                       raw_gga_num_sats=rsdata.GPS.Satellites.reshape(rows, 1),
-                                       raw_gga_delta_time=None,
-                                       raw_vtg_course=rsdata.RawGPSData.VtgTmgTrue.reshape(rows, 1),
-                                       raw_vtg_speed=rsdata.RawGPSData.VtgSogMPS.reshape(rows, 1),
-                                       raw_vtg_delta_time=None,
-                                       raw_vtg_mode_indicator=rsdata.RawGPSData.VtgMode.reshape(rows, 1),
-                                       ext_gga_utc=rsdata.GPS.Utc,
-                                       ext_gga_lat=rsdata.GPS.Latitude,
-                                       ext_gga_lon=rsdata.GPS.Longitude,
-                                       ext_gga_alt=rsdata.GPS.Altitude,
-                                       ext_gga_diff=rsdata.GPS.GPS_Quality,
-                                       ext_gga_hdop=rsdata.GPS.HDOP,
-                                       ext_gga_num_sats=rsdata.GPS.Satellites,
-                                       ext_vtg_course=np.tile(np.nan, rsdata.GPS.Latitude.shape),
-                                       ext_vtg_speed=np.tile(np.nan, rsdata.GPS.Latitude.shape),
-                                       gga_p_method='End',
-                                       gga_v_method='End',
-                                       vtg_method='Average')
-
-            self.boat_vel.add_boat_object(source='SonTek',
-                                          vel_in=self.gps.gga_velocity_ens_mps,
-                                          freq_in=None,
-                                          coord_sys_in='Earth',
-                                          nav_ref_in='GGA')
-
-            self.boat_vel.add_boat_object(source='SonTek',
-                                          vel_in=self.gps.vtg_velocity_ens_mps,
-                                          freq_in=None,
-                                          coord_sys_in='Earth',
-                                          nav_ref_in='VTG')
-        ref = 'BT'
+                self.gps.populate_data(
+                    raw_gga_utc=rsdata.GPS.Utc.reshape(rows, 1),
+                    raw_gga_lat=rsdata.GPS.Latitude.reshape(rows, 1),
+                    raw_gga_lon=rsdata.GPS.Longitude.reshape(rows, 1),
+                    raw_gga_alt=rsdata.GPS.Altitude.reshape(rows, 1),
+                    raw_gga_diff=rsdata.GPS.GPS_Quality.reshape(rows, 1),
+                    raw_gga_hdop=rsdata.GPS.HDOP.reshape(rows, 1),
+                    raw_gga_num_sats=rsdata.GPS.Satellites.reshape(rows, 1),
+                    raw_gga_delta_time=None,
+                    raw_vtg_course=rsdata.RawGPSData.VtgTmgTrue.reshape(rows, 1),
+                    raw_vtg_speed=rsdata.RawGPSData.VtgSogMPS.reshape(rows, 1),
+                    raw_vtg_delta_time=None,
+                    raw_vtg_mode_indicator=rsdata.RawGPSData.VtgMode.reshape(rows, 1),
+                    ext_gga_utc=rsdata.GPS.Utc,
+                    ext_gga_lat=rsdata.GPS.Latitude,
+                    ext_gga_lon=rsdata.GPS.Longitude,
+                    ext_gga_alt=rsdata.GPS.Altitude,
+                    ext_gga_diff=rsdata.GPS.GPS_Quality,
+                    ext_gga_hdop=rsdata.GPS.HDOP,
+                    ext_gga_num_sats=rsdata.GPS.Satellites,
+                    ext_vtg_course=np.tile(np.nan, rsdata.GPS.Latitude.shape),
+                    ext_vtg_speed=np.tile(np.nan, rsdata.GPS.Latitude.shape),
+                    gga_p_method="End",
+                    gga_v_method="End",
+                    vtg_method="Average",
+                )
+
+            self.boat_vel.add_boat_object(
+                source="SonTek",
+                vel_in=self.gps.gga_velocity_ens_mps,
+                freq_in=None,
+                coord_sys_in="Earth",
+                nav_ref_in="GGA",
+            )
+
+            self.boat_vel.add_boat_object(
+                source="SonTek",
+                vel_in=self.gps.vtg_velocity_ens_mps,
+                freq_in=None,
+                coord_sys_in="Earth",
+                nav_ref_in="VTG",
+            )
+        ref = "BT"
         if rsdata.Setup.trackReference == 1:
-            ref = 'BT'
+            ref = "BT"
         elif rsdata.Setup.trackReference == 2:
-            ref = 'GGA'
+            ref = "GGA"
         elif rsdata.Setup.trackReference == 3:
-            ref = 'VTG'
+            ref = "VTG"
         self.boat_vel.set_nav_reference(ref)
 
         # Depth
@@ -990,32 +1204,38 @@ class TransectData(object):
         cell_size = rsdata.System.Cell_Size.reshape(1, num_ens)
         cell_size_all = np.tile(cell_size, (max_cells, 1))
         top_of_cells = rsdata.System.Cell_Start.reshape(1, num_ens)
-        cell_depth = ((np.tile(np.arange(1, max_cells + 1, 1).reshape(max_cells, 1), (1, num_ens)) - 0.5)
-                      * cell_size_all) + np.tile(top_of_cells, (max_cells, 1))
+        cell_depth = (
+            (
+                np.tile(
+                    np.arange(1, max_cells + 1, 1).reshape(max_cells, 1), (1, num_ens)
+                )
+                - 0.5
+            )
+            * cell_size_all
+        ) + np.tile(top_of_cells, (max_cells, 1))
 
         # Adjust cell size and depth for user supplied temp, sal, or sos
         if sos_correction is not None:
             cell_size_all = np.around(cell_size_all * sos_correction, 6)
-            cell_depth = \
-                np.around(((cell_depth - rsdata.Setup.sensorDepth) * sos_correction) + rsdata.Setup.sensorDepth, 6)
+            cell_depth = np.around(
+                ((cell_depth - rsdata.Setup.sensorDepth) * sos_correction)
+                + rsdata.Setup.sensorDepth,
+                6,
+            )
 
         # Prepare bottom track depth variable
         depth = rsdata.BottomTrack.BT_Beam_Depth.T
         depth[depth == 0] = np.nan
 
-        # Convert frequency to kHz
-        if np.nanmean(rsdata.BottomTrack.BT_Frequency) > 10000:
-            freq = rsdata.BottomTrack.BT_Frequency / 1000
-        else:
-            freq = rsdata.BottomTrack.BT_Frequency
-
         # Create depth object for bottom track beams
-        self.depths.add_depth_object(depth_in=depth,
-                                     source_in='BT',
-                                     freq_in=freq_ts,
-                                     draft_in=rsdata.Setup.sensorDepth,
-                                     cell_depth_in=cell_depth,
-                                     cell_size_in=cell_size_all)
+        self.depths.add_depth_object(
+            depth_in=depth,
+            source_in="BT",
+            freq_in=freq_ts,
+            draft_in=rsdata.Setup.sensorDepth,
+            cell_depth_in=cell_depth,
+            cell_size_in=cell_size_all,
+        )
 
         # Prepare vertical beam depth variable
         depth_vb = np.tile(np.nan, (1, cell_depth.shape[1]))
@@ -1024,21 +1244,29 @@ class TransectData(object):
 
         # Apply correction for manual sos parameters to obtain raw values
         if sos_correction is not None:
-            depth_vb = np.around(((depth_vb - rsdata.Setup.sensorDepth) * sos_correction) + rsdata.Setup.sensorDepth, 5)
+            depth_vb = np.around(
+                ((depth_vb - rsdata.Setup.sensorDepth) * sos_correction)
+                + rsdata.Setup.sensorDepth,
+                5,
+            )
 
         # Create depth object for vertical beam
-        self.depths.add_depth_object(depth_in=depth_vb,
-                                     source_in='VB',
-                                     freq_in=np.array([rsdata.Transformation_Matrices.Frequency[1]] * depth.shape[-1]),
-                                     draft_in=rsdata.Setup.sensorDepth,
-                                     cell_depth_in=cell_depth,
-                                     cell_size_in=cell_size_all)
+        self.depths.add_depth_object(
+            depth_in=depth_vb,
+            source_in="VB",
+            freq_in=np.array(
+                [rsdata.Transformation_Matrices.Frequency[1]] * depth.shape[-1]
+            ),
+            draft_in=rsdata.Setup.sensorDepth,
+            cell_depth_in=cell_depth,
+            cell_size_in=cell_size_all,
+        )
 
         # Set depth reference
         if rsdata.Setup.depthReference < 0.5:
-            self.depths.selected = 'vb_depths'
+            self.depths.selected = "vb_depths"
         else:
-            self.depths.selected = 'bt_depths'
+            self.depths.selected = "bt_depths"
 
         # Water Velocity
         # --------------
@@ -1059,170 +1287,189 @@ class TransectData(object):
         if sos_correction is not None:
             vel = np.around(vel * sos_correction, 3)
         snr = np.swapaxes(rsdata.System.SNR, 1, 0)
-        if hasattr(rsdata.WaterTrack, 'Correlation'):
+        if hasattr(rsdata.WaterTrack, "Correlation"):
             corr = np.swapaxes(rsdata.WaterTrack.Correlation, 1, 0)
         else:
             corr = np.array([])
 
-        # Correct SonTek difference velocity for error in earlier transformation matrices.
+        # Correct SonTek difference velocity for error in earlier
+        # transformation matrices.
         if abs(rsdata.Transformation_Matrices.Matrix[3, 0, 0]) < 0.5:
             vel[3, :, :] = vel[3, :, :] * 2
 
-        # Apply TRDI scaling to SonTek difference velocity to convert to a TRDI compatible error velocity
-        vel[3, :, :] = vel[3, :, :] / ((2 ** 0.5) * np.tan(np.deg2rad(25)))
+        # Apply TRDI scaling to SonTek difference velocity to convert to a
+        # TRDI compatible error velocity
+        vel[3, :, :] = vel[3, :, :] / ((2**0.5) * np.tan(np.deg2rad(25)))
 
-        # Convert velocity reference from what was used in RiverSurveyor Live to None by adding the boat velocity
-        # to the reported water velocity
+        # Convert velocity reference from what was used in RiverSurveyor Live
+        # to None by adding the boat velocity to the reported water velocity
         boat_vel = np.swapaxes(rsdata.Summary.Boat_Vel, 1, 0)
         vel[0, :, :] = vel[0, :, :] + boat_vel[0, :]
         vel[1, :, :] = vel[1, :, :] + boat_vel[1, :]
 
-        ref_water = 'None'
+        ref_water = "None"
 
-        # Compute side lobe cutoff using Transmit Length information if availalbe, if not it is assumed to be equal
-        # to 1/2 depth_cell_size_m. The percent method is use for the side lobe cutoff computation.
+        # Compute side lobe cutoff using Transmit Length information if
+        # availalbe, if not it is assumed to be equal
+        # to 1/2 depth_cell_size_m. The percent method is use for the side
+        # lobe cutoff computation.
         sl_cutoff_percent = rsdata.Setup.extrapolation_dDiscardPercent
         sl_cutoff_number = rsdata.Setup.extrapolation_nDiscardCells
-        if hasattr(rsdata.Summary, 'Transmit_Length'):
-            sl_lag_effect_m = (rsdata.Summary.Transmit_Length
-                               + self.depths.bt_depths.depth_cell_size_m[0, :]) / 2.0
+        if hasattr(rsdata.Summary, "Transmit_Length"):
+            sl_lag_effect_m = (
+                rsdata.Summary.Transmit_Length
+                + self.depths.bt_depths.depth_cell_size_m[0, :]
+            ) / 2.0
         else:
             sl_lag_effect_m = np.copy(self.depths.bt_depths.depth_cell_size_m[0, :])
-        sl_cutoff_type = 'Percent'
-        cells_above_sl, sl_cutoff_m = TransectData.side_lobe_cutoff(depths=self.depths.bt_depths.depth_orig_m,
-                                                                    draft=self.depths.bt_depths.draft_orig_m,
-                                                                    cell_depth=self.depths.bt_depths.depth_cell_depth_m,
-                                                                    sl_lag_effect=sl_lag_effect_m,
-                                                                    slc_type=sl_cutoff_type,
-                                                                    value=1 - sl_cutoff_percent / 100)
+        sl_cutoff_type = "Percent"
+        cells_above_sl, sl_cutoff_m = TransectData.side_lobe_cutoff(
+            depths=self.depths.bt_depths.depth_orig_m,
+            draft=self.depths.bt_depths.draft_orig_m,
+            cell_depth=self.depths.bt_depths.depth_cell_depth_m,
+            sl_lag_effect=sl_lag_effect_m,
+            slc_type=sl_cutoff_type,
+            value=1 - sl_cutoff_percent / 100,
+        )
         # Determine water mode
         if len(corr) > 0:
             corr_nan = np.isnan(corr)
             number_of_nan = np.count_nonzero(corr_nan)
             if number_of_nan == 0:
-                wm = 'HD'
+                wm = "HD"
             elif corr_nan.size == number_of_nan:
-                wm = 'IC'
+                wm = "IC"
             else:
-                wm = 'Variable'
+                wm = "Variable"
         else:
-            wm = 'Unknown'
+            wm = "Unknown"
 
         # Determine excluded distance (Similar to SonTek's screening distance)
         excluded_distance = rsdata.Setup.screeningDistance - rsdata.Setup.sensorDepth
         if excluded_distance < 0:
             excluded_distance = 0
 
-        if hasattr(rsdata.WaterTrack, 'Vel_Expected_StdDev'):
+        if hasattr(rsdata.WaterTrack, "Vel_Expected_StdDev"):
             # RS5
-            ping_type = self.sontek_ping_type(corr=corr, freq=rsdata.WaterTrack.WT_Frequency,
-                                              expected_std=rsdata.WaterTrack.Vel_Expected_StdDev)
+            ping_type = self.sontek_ping_type(
+                corr=corr,
+                freq=rsdata.WaterTrack.WT_Frequency,
+                expected_std=rsdata.WaterTrack.Vel_Expected_StdDev,
+            )
         else:
             # M9 or S5
-            ping_type = self.sontek_ping_type(corr=corr, freq=rsdata.WaterTrack.WT_Frequency)
+            ping_type = self.sontek_ping_type(
+                corr=corr, freq=rsdata.WaterTrack.WT_Frequency
+            )
 
         # Create water velocity object
         self.w_vel = WaterData()
-        self.w_vel.populate_data(vel_in=vel,
-                                 freq_in=freq_ts,
-                                 coord_sys_in=ref_coord,
-                                 nav_ref_in=ref_water,
-                                 rssi_in=snr,
-                                 rssi_units_in='SNR',
-                                 excluded_dist_in=excluded_distance,
-                                 cells_above_sl_in=cells_above_sl,
-                                 sl_cutoff_per_in=sl_cutoff_percent,
-                                 sl_cutoff_num_in=sl_cutoff_number,
-                                 sl_cutoff_type_in=sl_cutoff_type,
-                                 sl_lag_effect_in=sl_lag_effect_m,
-                                 sl_cutoff_m=sl_cutoff_m,
-                                 wm_in=wm,
-                                 blank_in=excluded_distance,
-                                 corr_in=corr,
-                                 ping_type=ping_type)
+        self.w_vel.populate_data(
+            vel_in=vel,
+            freq_in=freq_ts,
+            coord_sys_in=ref_coord,
+            nav_ref_in=ref_water,
+            rssi_in=snr,
+            rssi_units_in="SNR",
+            excluded_dist_in=excluded_distance,
+            cells_above_sl_in=cells_above_sl,
+            sl_cutoff_per_in=sl_cutoff_percent,
+            sl_cutoff_num_in=sl_cutoff_number,
+            sl_cutoff_type_in=sl_cutoff_type,
+            sl_lag_effect_in=sl_lag_effect_m,
+            sl_cutoff_m=sl_cutoff_m,
+            wm_in=wm,
+            blank_in=excluded_distance,
+            corr_in=corr,
+            ping_type=ping_type,
+            snr_3beam_comp=snr_3beam_comp,
+        )
 
         # Edges
         # -----
         # Create edge object
         self.edges = Edges()
-        self.edges.populate_data(rec_edge_method='Variable',
-                                 vel_method='VectorProf')
+        self.edges.populate_data(rec_edge_method="Variable", vel_method="VectorProf")
 
         # Determine number of ensembles for each edge
         if rsdata.Setup.startEdge > 0.1:
             ensembles_right = np.nansum(rsdata.System.Step == 2)
             ensembles_left = np.nansum(rsdata.System.Step == 4)
-            self.start_edge = 'Right'
-            self.orig_start_edge = 'Right'
+            self.start_edge = "Right"
+            self.orig_start_edge = "Right"
         else:
             ensembles_right = np.nansum(rsdata.System.Step == 4)
             ensembles_left = np.nansum(rsdata.System.Step == 2)
-            self.start_edge = 'Left'
-            self.orig_start_edge = 'Left'
+            self.start_edge = "Left"
+            self.orig_start_edge = "Left"
         self.in_transect_idx = np.where(rsdata.System.Step == 3)[0]
 
         # Create left edge object
         edge_type = None
         if rsdata.Setup.Edges_0__Method == 2:
-            edge_type = 'Triangular'
+            edge_type = "Triangular"
         elif rsdata.Setup.Edges_0__Method == 1:
-            edge_type = 'Rectangular'
+            edge_type = "Rectangular"
         elif rsdata.Setup.Edges_0__Method == 0:
-            edge_type = 'User Q'
+            edge_type = "User Q"
         if np.isnan(rsdata.Setup.Edges_0__EstimatedQ):
             user_discharge = None
         else:
             user_discharge = rsdata.Setup.Edges_0__EstimatedQ
-        self.edges.left.populate_data(edge_type=edge_type,
-                                      distance=rsdata.Setup.Edges_0__DistanceToBank,
-                                      number_ensembles=ensembles_left,
-                                      coefficient=None,
-                                      user_discharge=user_discharge)
+        self.edges.left.populate_data(
+            edge_type=edge_type,
+            distance=rsdata.Setup.Edges_0__DistanceToBank,
+            number_ensembles=ensembles_left,
+            coefficient=None,
+            user_discharge=user_discharge,
+        )
 
         # Create right edge object
         if rsdata.Setup.Edges_1__Method == 2:
-            edge_type = 'Triangular'
+            edge_type = "Triangular"
         elif rsdata.Setup.Edges_1__Method == 1:
-            edge_type = 'Rectangular'
+            edge_type = "Rectangular"
         elif rsdata.Setup.Edges_1__Method == 0:
-            edge_type = 'User Q'
+            edge_type = "User Q"
         if np.isnan(rsdata.Setup.Edges_1__EstimatedQ):
             user_discharge = None
         else:
             user_discharge = rsdata.Setup.Edges_1__EstimatedQ
-        self.edges.right.populate_data(edge_type=edge_type,
-                                       distance=rsdata.Setup.Edges_1__DistanceToBank,
-                                       number_ensembles=ensembles_right,
-                                       coefficient=None,
-                                       user_discharge=user_discharge)
+        self.edges.right.populate_data(
+            edge_type=edge_type,
+            distance=rsdata.Setup.Edges_1__DistanceToBank,
+            number_ensembles=ensembles_right,
+            coefficient=None,
+            user_discharge=user_discharge,
+        )
 
         # Extrapolation
         # -------------
-        top = ''
-        bottom = ''
+        top = ""
+        bottom = ""
 
         # Top extrapolation
         if rsdata.Setup.extrapolation_Top_nFitType == 0:
-            top = 'Constant'
+            top = "Constant"
         elif rsdata.Setup.extrapolation_Top_nFitType == 1:
-            top = 'Power'
+            top = "Power"
         elif rsdata.Setup.extrapolation_Top_nFitType == 2:
-            top = '3-Point'
+            top = "3-Point"
 
         # Bottom extrapolation
         if rsdata.Setup.extrapolation_Bottom_nFitType == 0:
-            bottom = 'Constant'
+            bottom = "Constant"
         elif rsdata.Setup.extrapolation_Bottom_nFitType == 1:
             if rsdata.Setup.extrapolation_Bottom_nEntirePro > 1.1:
-                bottom = 'No Slip'
+                bottom = "No Slip"
             else:
-                bottom = 'Power'
+                bottom = "Power"
 
         # Create extrapolation object
         self.extrap = ExtrapData()
-        self.extrap.populate_data(top=top,
-                                  bot=bottom,
-                                  exp=rsdata.Setup.extrapolation_Bottom_dExponent)
+        self.extrap.populate_data(
+            top=top, bot=bottom, exp=rsdata.Setup.extrapolation_Bottom_dExponent
+        )
 
         # Sensor data
         # -----------
@@ -1231,74 +1478,127 @@ class TransectData(object):
         self.sensors.heading_deg.internal = HeadingData()
 
         # Check for firmware supporting G3 compass and associated data
-        if hasattr(rsdata, 'Compass'):
-            # TODO need to find older file that had 3 columns in Magnetic error to test and modify code
+        if hasattr(rsdata, "Compass"):
+            # TODO need to find older file that had 3 columns in Magnetic
+            #  error to test and modify code
             mag_error = rsdata.Compass.Magnetic_error
-            pitch_limit = np.array((rsdata.Compass.Maximum_Pitch, rsdata.Compass.Minimum_Pitch)).T
-            roll_limit = np.array((rsdata.Compass.Maximum_Roll, rsdata.Compass.Minimum_Roll)).T
-            if np.any(np.greater_equal(np.abs(pitch_limit), 90)) or np.any(np.greater_equal(np.abs(roll_limit), 90)):
+            pitch_limit = np.array(
+                (rsdata.Compass.Maximum_Pitch, rsdata.Compass.Minimum_Pitch)
+            ).T
+            roll_limit = np.array(
+                (rsdata.Compass.Maximum_Roll, rsdata.Compass.Minimum_Roll)
+            ).T
+            if np.any(np.greater_equal(np.abs(pitch_limit), 90)) or np.any(
+                np.greater_equal(np.abs(roll_limit), 90)
+            ):
                 pitch_limit = None
                 roll_limit = None
         else:
             mag_error = None
             pitch_limit = None
             roll_limit = None
-        self.sensors.heading_deg.internal.populate_data(data_in=rsdata.System.Heading,
-                                                        source_in='internal',
-                                                        magvar=rsdata.Setup.magneticDeclination,
-                                                        mag_error=mag_error,
-                                                        pitch_limit=pitch_limit,
-                                                        roll_limit=roll_limit)
+        self.sensors.heading_deg.internal.populate_data(
+            data_in=rsdata.System.Heading,
+            source_in="internal",
+            magvar=rsdata.Setup.magneticDeclination,
+            mag_error=mag_error,
+            pitch_limit=pitch_limit,
+            roll_limit=roll_limit,
+        )
 
         # External heading
         ext_heading = rsdata.System.GPS_Compass_Heading
         if np.nansum(np.abs(np.diff(ext_heading))) > 0:
             self.sensors.heading_deg.external = HeadingData()
-            self.sensors.heading_deg.external.populate_data(data_in=ext_heading,
-                                                            source_in='external',
-                                                            magvar=rsdata.Setup.magneticDeclination,
-                                                            align=rsdata.Setup.hdtHeadingCorrection)
+            self.sensors.heading_deg.external.populate_data(
+                data_in=ext_heading,
+                source_in="external",
+                magvar=rsdata.Setup.magneticDeclination,
+                align=rsdata.Setup.hdtHeadingCorrection,
+            )
 
         # Set selected reference
         if rsdata.Setup.headingSource > 1.1:
-            self.sensors.heading_deg.selected = 'external'
+            self.sensors.heading_deg.selected = "external"
         else:
-            self.sensors.heading_deg.selected = 'internal'
+            self.sensors.heading_deg.selected = "internal"
 
         # Pitch and roll
         pitch = None
         roll = None
-        if hasattr(rsdata, 'Compass'):
+        if hasattr(rsdata, "Compass"):
             pitch = rsdata.Compass.Pitch
             roll = rsdata.Compass.Roll
-        elif hasattr(rsdata.System, 'Pitch'):
+        elif hasattr(rsdata.System, "Pitch"):
             pitch = rsdata.System.Pitch
             roll = rsdata.System.Roll
+        if len(pitch.shape) > 1:
+            pitch = np.squeeze(pitch[:, 0])
+            roll = np.squeeze(roll[:, 0])
+
         self.sensors.pitch_deg.internal = SensorData()
-        self.sensors.pitch_deg.internal.populate_data(data_in=pitch, source_in='internal')
-        self.sensors.pitch_deg.selected = 'internal'
+        self.sensors.pitch_deg.internal.populate_data(
+            data_in=pitch, source_in="internal"
+        )
+        self.sensors.pitch_deg.selected = "internal"
         self.sensors.roll_deg.internal = SensorData()
-        self.sensors.roll_deg.internal.populate_data(data_in=roll, source_in='internal')
-        self.sensors.roll_deg.selected = 'internal'
-
+        self.sensors.roll_deg.internal.populate_data(data_in=roll, source_in="internal")
+        self.sensors.roll_deg.selected = "internal"
+
+        # Battery voltage
+        self.sensors.battery_voltage.internal = SensorData()
+        if hasattr(rsdata.System, "Voltage"):
+            self.sensors.battery_voltage.internal.populate_data(
+                data_in=rsdata.System.Voltage,
+                source_in="internal",
+            )
+        elif hasattr(rsdata.System, "Battery_Voltage"):
+            self.sensors.battery_voltage.internal.populate_data(
+                data_in=rsdata.System.Battery_Voltage,
+                source_in="internal",
+            )
         # Set composite depths as this is the only option in RiverSurveyor Live
         self.depths.composite_depths(transect=self, setting="On")
 
+    @staticmethod
+    def rs5_bt_ping_type(mat_data):
+        """Pulls ping type from mat_strut object
+
+        Parameters
+        ---------
+        mat_data: mat_strut
+            BottomTrack.BT_PingType_Text"""
+
+        pt = []
+        for data in mat_data:
+            for item in data._fieldnames:
+                ping = data.__dict__[item]
+                pt.append(ping)
+
+        pt = np.array(pt)
+        pt[pt == "1"] = "U"
+
+        return pt
+
     @staticmethod
     def sontek_ping_type(corr, freq, expected_std=None):
-        """Determines ping type based on the fact that HD has correlation but incoherent does not.
+        """Determines ping type based on the fact that HD has correlation but
+         incoherent does not.
 
         Parameters
         ----------
-        corr: np.ndarray(int)
+        corr: np.array(int)
             Water track correlation
         freq:
             Frequency of ping in Hz
+        expected_std: np.array(float)
+            Expected standard deviation
 
         Returns
         -------
         ping_type: np.array(int)
-            Ping_type for each ensemble, 3 - 1 MHz Incoherent, 4 - 1 MHz HD, 5 - 3 MHz Incoherent, 6 - 3 MHz HD
+            Ping_type for each ensemble, 3 - 1 MHz Incoherent, 4 - 1 MHz HD,
+            5 - 3 MHz Incoherent, 6 - 3 MHz HD
         """
         # Determine ping type
 
@@ -1313,14 +1613,14 @@ class TransectData(object):
             for n in range(len(coherent)):
                 if coherent[n]:
                     if freq[n] == 3000:
-                        ping_type.append('3C')
+                        ping_type.append("3C")
                     else:
-                        ping_type.append('1C')
+                        ping_type.append("1C")
                 else:
                     if freq[n] == 3000:
-                        ping_type.append('3I')
+                        ping_type.append("3I")
                     else:
-                        ping_type.append('1I')
+                        ping_type.append("1I")
             ping_type = np.array(ping_type)
         else:
             # RS5
@@ -1332,31 +1632,33 @@ class TransectData(object):
 
             ves_avg = np.nanmean(ves, axis=0)
 
-            ping_type = np.tile(['PC/BB'], ves_avg.size)
-            ping_type[ves_avg < 0.01] = 'PC'
-            ping_type[ves_avg > 0.025] = 'BB'
+            ping_type = np.tile(["PC/BB"], ves_avg.size)
+            ping_type[ves_avg < 0.01] = "PC"
+            ping_type[ves_avg > 0.025] = "BB"
 
         return ping_type
 
     @staticmethod
     def qrev_mat_in(meas_struct):
-        """Processes the Matlab data structure to obtain a list of TransectData objects containing transect
-           data from the Matlab data structure.
+        """Processes the Matlab data structure to obtain a list of
+         TransectData objects containing transect
+            data from the Matlab data structure.
 
-       Parameters
-       ----------
-       meas_struct: mat_struct
-           Matlab data structure obtained from sio.loadmat
+        Parameters
+        ----------
+        meas_struct: mat_struct
+            Matlab data structure obtained from sio.loadmat
 
-       Returns
-       -------
-       transects: list
-           List of TransectData objects
-       """
+        Returns
+        -------
+        transects: list
+            List of TransectData objects
+        """
 
         transects = []
-        if hasattr(meas_struct, 'transects'):
-            # If only one transect the data are not a list or array of transects
+        if hasattr(meas_struct, "transects"):
+            # If only one transect the data are not a list or array of
+            # transects
             try:
                 if len(meas_struct.transects) > 0:
                     for transect in meas_struct.transects:
@@ -1371,7 +1673,8 @@ class TransectData(object):
         return transects
 
     def populate_from_qrev_mat(self, transect):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
@@ -1397,7 +1700,7 @@ class TransectData(object):
         self.extrap = ExtrapData()
         self.extrap.populate_from_qrev_mat(transect)
         self.start_edge = transect.startEdge
-        if hasattr(transect, 'orig_start_edge'):
+        if hasattr(transect, "orig_start_edge"):
             self.orig_start_edge = transect.orig_start_edge
         else:
             self.orig_start_edge = transect.startEdge
@@ -1411,7 +1714,8 @@ class TransectData(object):
 
     @staticmethod
     def valid_frequencies(frequency_in):
-        """Create frequency time series for BT and WT with all valid frequencies.
+        """Create frequency time series for BT and WT with all valid
+        frequencies.
 
         Parameters
         ----------
@@ -1432,7 +1736,8 @@ class TransectData(object):
         if np.any(invalid_freq):
             # Identify the first valid frequency
             valid = frequency_in[np.logical_not(invalid_freq)][0]
-            # Forward fill for invalid frequencies beyond first valid, backfill until 1st valid
+            # Forward fill for invalid frequencies beyond first valid, backfill
+            # until 1st valid
             for n in range(frequency_in.size):
                 if invalid_freq[n]:
                     frequency_out[n] = valid
@@ -1453,8 +1758,8 @@ class TransectData(object):
         dist_cell_1_m = pd0.Cfg.dist_bin1_cm / 100
         num_reg_cells = pd0.Wt.vel_mps.shape[1]
 
-        # Surf data are to accommodate RiverRay and RiverPro.  pd0_read sets these
-        # values to nan when reading Rio Grande or StreamPro data
+        # Surf data are to accommodate RiverRay and RiverPro.  pd0_read sets
+        # these values to nan when reading Rio Grande or StreamPro data
         no_surf_cells = pd0.Surface.no_cells
         no_surf_cells[np.isnan(no_surf_cells)] = 0
         max_surf_cells = np.nanmax(no_surf_cells)
@@ -1478,19 +1783,32 @@ class TransectData(object):
 
             # Compute cell depth
             if no_surf_cells[i] > 1e-5:
-                cell_depth[:int(no_surf_cells[i]), i] = surf_cell_dist[i] + \
-                                                        np.arange(0, (no_surf_cells[i] - 1) * surf_cell_size[i] + 0.001,
-                                                                  surf_cell_size[i])
-                cell_depth[int(no_surf_cells[i]):, i] = cell_depth[int(no_surf_cells[i] - 1), i] \
-                                                        + (.5 * surf_cell_size[i] + 0.5 * reg_cell_size[i]) \
-                                                        + np.arange(0, (num_reg_cells - 1) * reg_cell_size[i] + 0.001,
-                                                                    reg_cell_size[i])
-                cell_size_all[0:int(no_surf_cells[i]), i] = np.repeat(surf_cell_size[i], int(no_surf_cells[i]))
-                cell_size_all[int(no_surf_cells[i]):, i] = np.repeat(reg_cell_size[i], int(num_reg_cells))
+                cell_depth[: int(no_surf_cells[i]), i] = surf_cell_dist[i] + np.arange(
+                    0,
+                    (no_surf_cells[i] - 1) * surf_cell_size[i] + 0.001,
+                    surf_cell_size[i],
+                )
+                cell_depth[int(no_surf_cells[i]) :, i] = (
+                    cell_depth[int(no_surf_cells[i] - 1), i]
+                    + (0.5 * surf_cell_size[i] + 0.5 * reg_cell_size[i])
+                    + np.arange(
+                        0,
+                        (num_reg_cells - 1) * reg_cell_size[i] + 0.001,
+                        reg_cell_size[i],
+                    )
+                )
+                cell_size_all[0 : int(no_surf_cells[i]), i] = np.repeat(
+                    surf_cell_size[i], int(no_surf_cells[i])
+                )
+                cell_size_all[int(no_surf_cells[i]) :, i] = np.repeat(
+                    reg_cell_size[i], int(num_reg_cells)
+                )
             else:
-                cell_depth[:int(num_reg_cells), i] = dist_cell_1_m[i] + \
-                                                     np.linspace(0, int(num_reg_cells) - 1,
-                                                                 int(num_reg_cells)) * reg_cell_size[i]
+                cell_depth[: int(num_reg_cells), i] = (
+                    dist_cell_1_m[i]
+                    + np.linspace(0, int(num_reg_cells) - 1, int(num_reg_cells))
+                    * reg_cell_size[i]
+                )
                 cell_size_all[:, i] = np.repeat(reg_cell_size[i], num_reg_cells)
 
         # Firmware is used to ID RiverRay data with variable modes and lags
@@ -1498,7 +1816,7 @@ class TransectData(object):
 
         # Compute sl_lag_effect
         lag = pd0.Cfg.lag_cm / 100
-        if firmware[0:2] == '44' or firmware[0:2] == '56':
+        if firmware[0:2] == "44" or firmware[0:2] == "56":
             lag_near_bottom = np.array(pd0.Cfg.lag_near_bottom)
             lag_near_bottom[lag_near_bottom == np.nan] = 0
             lag[lag_near_bottom != 0] = 0
@@ -1510,8 +1828,8 @@ class TransectData(object):
         return cell_size_all, cell_depth, sl_cutoff_per, sl_lag_effect_m
 
     def change_q_ensembles(self, proc_method):
-        """Sets in_transect_idx to all ensembles, except in the case of SonTek data
-        where RSL processing is applied.
+        """Sets in_transect_idx to all ensembles, except in the case of SonTek
+        data where RSL processing is applied.
 
         Parameters
         ----------
@@ -1519,22 +1837,29 @@ class TransectData(object):
             Processing method (WR2, RSL, QRev)
         """
 
-        if proc_method == 'RSL':
+        if proc_method == "RSL":
             num_ens = self.boat_vel.bt_vel.u_processed_mps.shape[1]
             # Determine number of ensembles for each edge
-            if self.start_edge == 'Right':
-                self.in_transect_idx = np.arange(self.edges.right.num_ens_2_avg,
-                                                 num_ens - self.edges.left.num_ens_2_avg)
+            if self.start_edge == "Right":
+                self.in_transect_idx = np.arange(
+                    self.edges.right.num_ens_2_avg,
+                    num_ens - self.edges.left.num_ens_2_avg,
+                )
             else:
-                self.in_transect_idx = np.arange(self.edges.left.num_ens_2_avg,
-                                                 num_ens - self.edges.right.num_ens_2_avg)
+                self.in_transect_idx = np.arange(
+                    self.edges.left.num_ens_2_avg,
+                    num_ens - self.edges.right.num_ens_2_avg,
+                )
         else:
-            self.in_transect_idx = np.arange(0, self.boat_vel.bt_vel.u_processed_mps.shape[0])
+            self.in_transect_idx = np.arange(
+                0, self.boat_vel.bt_vel.u_processed_mps.shape[0]
+            )
 
     def change_coord_sys(self, new_coord_sys):
         """Changes the coordinate system of the water and boat data.
 
-        Current implementation only allows changes for original to higher order coordinate
+        Current implementation only allows changes for original to higher
+        order coordinate
         systems: Beam - Inst - Ship - Earth.
 
         Parameters
@@ -1572,31 +1897,32 @@ class TransectData(object):
 
         # Update object
         if self.sensors.heading_deg.external is not None:
-            self.sensors.heading_deg.external.set_mag_var(magvar, 'external')
+            self.sensors.heading_deg.external.set_mag_var(magvar, "external")
 
-        if self.sensors.heading_deg.selected == 'internal':
-            heading_selected = getattr(self.sensors.heading_deg, self.sensors.heading_deg.selected)
+        if self.sensors.heading_deg.selected == "internal":
+            heading_selected = getattr(
+                self.sensors.heading_deg, self.sensors.heading_deg.selected
+            )
             old_magvar = heading_selected.mag_var_deg
             magvar_change = magvar - old_magvar
-            heading_selected.set_mag_var(magvar, 'internal')
+            heading_selected.set_mag_var(magvar, "internal")
             self.boat_vel.bt_vel.change_heading(magvar_change)
             self.w_vel.change_heading(self.boat_vel, magvar_change)
         else:
-            self.sensors.heading_deg.internal.set_mag_var(magvar, 'internal')
-
-        # self.update_water()
+            self.sensors.heading_deg.internal.set_mag_var(magvar, "internal")
 
     def change_offset(self, h_offset):
-        """Change the heading offset (alignment correction). Only affects external heading.
+        """Change the heading offset (alignment correction). Only affects
+        external heading.
 
         Parameters
         ----------
         h_offset: float
             Heading offset in degrees
         """
-        self.sensors.heading_deg.internal.set_align_correction(h_offset, 'internal')
+        self.sensors.heading_deg.internal.set_align_correction(h_offset, "internal")
 
-        if self.sensors.heading_deg.selected == 'external':
+        if self.sensors.heading_deg.selected == "external":
             old = getattr(self.sensors.heading_deg, self.sensors.heading_deg.selected)
             old_offset = old.align_correction_deg
             offset_change = h_offset - old_offset
@@ -1604,7 +1930,7 @@ class TransectData(object):
             self.w_vel.change_heading(self.boat_vel, offset_change)
 
         if self.sensors.heading_deg.external is not None:
-            self.sensors.heading_deg.external.set_align_correction(h_offset, 'external')
+            self.sensors.heading_deg.external.set_align_correction(h_offset, "external")
 
         self.update_water()
 
@@ -1618,21 +1944,24 @@ class TransectData(object):
         """
 
         # If source is user, check to see if it was created, if not create it
-        if h_source == 'user':
+        if h_source == "user":
             if self.sensors.heading_deg.user is None:
                 self.sensors.heading_deg.user = HeadingData()
-                self.sensors.heading_deg.user.populate_data(data_in=np.zeros(
-                    self.boat_vel.bt_vel.u_processed_mps.shape),
-                    source_in='user',
+                self.sensors.heading_deg.user.populate_data(
+                    data_in=np.zeros(self.boat_vel.bt_vel.u_processed_mps.shape),
+                    source_in="user",
                     magvar=0,
-                    align=0)
+                    align=0,
+                )
 
         # Get new heading object
         new_heading_selection = getattr(self.sensors.heading_deg, h_source)
 
         # Change source to that requested
         if h_source is not None:
-            old_heading_selection = getattr(self.sensors.heading_deg, self.sensors.heading_deg.selected)
+            old_heading_selection = getattr(
+                self.sensors.heading_deg, self.sensors.heading_deg.selected
+            )
             old_heading = old_heading_selection.data
             new_heading = new_heading_selection.data
             heading_change = new_heading - old_heading
@@ -1643,7 +1972,8 @@ class TransectData(object):
         self.update_water()
 
     def update_water(self):
-        """Method called from set_nav_reference, boat_interpolation and boat filters
+        """Method called from set_nav_reference, boat_interpolation and boat
+        filters
         to ensure that changes in boatvel are reflected in the water data"""
 
         self.w_vel.set_nav_reference(self.boat_vel)
@@ -1657,7 +1987,9 @@ class TransectData(object):
         self.w_vel.apply_interpolation(transect=self)
 
     @staticmethod
-    def side_lobe_cutoff(depths, draft, cell_depth, sl_lag_effect, slc_type='Percent', value=None):
+    def side_lobe_cutoff(
+        depths, draft, cell_depth, sl_lag_effect, slc_type="Percent", value=None
+    ):
         """Computes side lobe cutoff.
 
         The side lobe cutoff is based on the beam angle and is computed to
@@ -1667,17 +1999,20 @@ class TransectData(object):
         Parameters
         ----------
         depths: np.array
-            Bottom track (all 4 beams) and vertical beam depths for each ensemble, in m.
+            Bottom track (all 4 beams) and vertical beam depths for each
+            ensemble, in m.
         draft: float
             Draft of transducers, in m.
         cell_depth: np.array
             Depth to the centerline of each depth cell, in m.
         sl_lag_effect: np.array
-            The extra depth below the last depth cell that must be above the side lobe cutoff, in m.
+            The extra depth below the last depth cell that must be above the
+            side lobe cutoff, in m.
         slc_type: str
             Method used for side lobe cutoff computation.
         value: float
-            Value used in specified method to use for side lobe cutoff computation.
+            Value used in specified method to use for side lobe cutoff
+            computation.
         """
 
         # Compute minimum depths for each ensemble
@@ -1690,9 +2025,9 @@ class TransectData(object):
 
         # Adjust for transducer angle
         coeff = None
-        if slc_type == 'Percent':
+        if slc_type == "Percent":
             coeff = value
-        elif slc_type == 'Angle':
+        elif slc_type == "Angle":
             coeff = np.cos(np.deg2rad(value))
 
         # Compute sidelobe cutoff to centerline
@@ -1716,18 +2051,24 @@ class TransectData(object):
         """
 
         # Interpolate bottom track data
-        if target == 'BT':
-            self.boat_vel.bt_vel.apply_interpolation(transect=self, interpolation_method=method)
+        if target == "BT":
+            self.boat_vel.bt_vel.apply_interpolation(
+                transect=self, interpolation_method=method
+            )
 
-        if target == 'GPS':
+        if target == "GPS":
             # Interpolate GGA data
-            vel = getattr(self.boat_vel, 'gga_vel')
+            vel = getattr(self.boat_vel, "gga_vel")
             if vel is not None:
-                self.boat_vel.gga_vel.apply_interpolation(transect=self, interpolation_method=method)
+                self.boat_vel.gga_vel.apply_interpolation(
+                    transect=self, interpolation_method=method
+                )
             # Interpolate VTG data
-            vel = getattr(self.boat_vel, 'vtg_vel')
+            vel = getattr(self.boat_vel, "vtg_vel")
             if vel is not None:
-                self.boat_vel.vtg_vel.apply_interpolation(transect=self, interpolation_method=method)
+                self.boat_vel.vtg_vel.apply_interpolation(
+                    transect=self, interpolation_method=method
+                )
 
         # Apply composite tracks setting
         self.composite_tracks(update=False)
@@ -1784,7 +2125,7 @@ class TransectData(object):
         # Apply filter to transect
         self.boat_vel.bt_vel.apply_filter(self, **kwargs)
 
-        if self.boat_vel.selected == 'bt_vel' and update:
+        if self.boat_vel.selected == "bt_vel" and update:
             self.update_water()
 
     def gps_filters(self, update, **kwargs):
@@ -1816,7 +2157,9 @@ class TransectData(object):
         if self.boat_vel.vtg_vel is not None:
             self.boat_vel.vtg_vel.apply_gps_filter(self, **kwargs)
 
-        if (self.boat_vel.selected == 'VTG' or self.boat_vel.selected == 'GGA') and update == True:
+        if (
+            self.boat_vel.selected == "VTG" or self.boat_vel.selected == "GGA"
+        ) and update:
             self.update_water()
 
     def set_depth_reference(self, update, setting):
@@ -1837,8 +2180,9 @@ class TransectData(object):
             self.w_vel.adjust_side_lobe(self)
 
     def apply_averaging_method(self, setting):
-        """Method to apply the selected averaging method to the BT team depths to achieve a single
-        average depth.  It is only applicable to the multiple beams used for BT, not VB or DS.
+        """Method to apply the selected averaging method to the BT team depths
+        to achieve a single average depth.  It is only applicable to the
+        multiple beams used for BT, not VB or DS.
 
         Input:
         setting: averaging method (IDW, Simple)
@@ -1848,10 +2192,18 @@ class TransectData(object):
 
         self.process_depths(update=False)
 
-    def process_depths(self, update=False, filter_method=None, interpolation_method=None, composite_setting=None,
-                       avg_method=None, valid_method=None):
-        """Method applies filter, composite, and interpolation settings to  depth objects
-        so that all are updated using the same filter and interpolation settings.
+    def process_depths(
+        self,
+        update=False,
+        filter_method=None,
+        interpolation_method=None,
+        composite_setting=None,
+        avg_method=None,
+        valid_method=None,
+    ):
+        """Method applies filter, composite, and interpolation settings to
+        depth objects so that all are updated using the same filter and interpolation
+        settings.
 
         Parameters
         ----------
@@ -1864,7 +2216,8 @@ class TransectData(object):
         composite_setting: str
             Specifies use of composite depths ("On" or "Off").
         avg_method: str
-            Defines averaging method: "Simple", "IDW", only applicable to bottom track.
+            Defines averaging method: "Simple", "IDW", only applicable
+            to bottom track.
         valid_method:
             Defines method to determine if depth is valid (QRev or TRDI).
         """
@@ -1910,67 +2263,75 @@ class TransectData(object):
         if self.depths.bt_depths is not None:
             self.depths.bt_depths.change_draft(draft_in)
 
-    def change_sos(self, parameter=None, salinity=None, temperature=None, selected=None, speed=None):
+    def change_sos(
+        self, parameter=None, salinity=None, temperature=None, selected=None, speed=None
+    ):
         """Coordinates changing the speed of sound.
 
         Parameters
         ----------
         parameter: str
-            Speed of sound parameter to be changed ('temperatureSrc', 'temperature', 'salinity', 'sosSrc')
+            Speed of sound parameter to be changed ('temperatureSrc',
+            'temperature', 'salinity', 'sosSrc')
         salinity: float
             Salinity in ppt
         temperature: float
             Temperature in deg C
         selected: str
-            Selected speed of sound ('internal', 'computed', 'user') or temperature ('internal', 'user')
+            Selected speed of sound ('internal', 'computed', 'user') or
+            temperature ('internal', 'user')
         speed: float
             Manually supplied speed of sound for 'user' source
         """
 
-        if parameter == 'temperatureSrc':
+        if parameter == "temperatureSrc":
 
-            temperature_internal = getattr(self.sensors.temperature_deg_c, 'internal')
-            if selected == 'user':
+            temperature_internal = getattr(self.sensors.temperature_deg_c, "internal")
+            if selected == "user":
                 if self.sensors.temperature_deg_c.user is None:
                     self.sensors.temperature_deg_c.user = SensorData()
                 ens_temperature = np.tile(temperature, temperature_internal.data.shape)
 
                 self.sensors.temperature_deg_c.user.change_data(data_in=ens_temperature)
-                self.sensors.temperature_deg_c.user.set_source(source_in='Manual Input')
+                self.sensors.temperature_deg_c.user.set_source(source_in="Manual Input")
 
             # Set the temperature data to the selected source
             self.sensors.temperature_deg_c.set_selected(selected_name=selected)
             # Update the speed of sound
             self.update_sos()
 
-        elif parameter == 'temperature':
+        elif parameter == "temperature":
             adcp_temp = self.sensors.temperature_deg_c.internal.data
             new_user_temperature = np.tile(temperature, adcp_temp.shape)
-            self.sensors.temperature_deg_c.user.change_data(data_in=new_user_temperature)
-            self.sensors.temperature_deg_c.user.set_source(source_in='Manual Input')
+            self.sensors.temperature_deg_c.user.change_data(
+                data_in=new_user_temperature
+            )
+            self.sensors.temperature_deg_c.user.set_source(source_in="Manual Input")
             # Set the temperature data to the selected source
-            self.sensors.temperature_deg_c.set_selected(selected_name='user')
+            self.sensors.temperature_deg_c.set_selected(selected_name="user")
             # Update the speed of sound
             self.update_sos()
 
-        elif parameter == 'salinity':
+        elif parameter == "salinity":
             if salinity is not None:
                 self.sensors.salinity_ppt.user.change_data(data_in=salinity)
                 if type(self.sensors.salinity_ppt.internal.data) is float:
                     salinity_internal = self.sensors.salinity_ppt.internal.data
                 else:
                     salinity_internal = self.sensors.salinity_ppt.internal.data
-                if np.all(np.equal(self.sensors.salinity_ppt.user.data, salinity_internal)):
-                    self.sensors.salinity_ppt.set_selected(selected_name='internal')
+                if np.all(
+                    np.equal(self.sensors.salinity_ppt.user.data, salinity_internal)
+                ):
+                    self.sensors.salinity_ppt.set_selected(selected_name="internal")
                 else:
-                    self.sensors.salinity_ppt.set_selected(selected_name='user')
+                    self.sensors.salinity_ppt.set_selected(selected_name="user")
                 self.update_sos()
 
-        elif parameter == 'sosSrc':
-            if selected == 'internal':
+        elif parameter == "sosSrc":
+            if selected == "internal":
                 self.update_sos()
-            elif selected == 'user':
-                self.update_sos(speed=speed, selected='user', source='Manual Input')
+            elif selected == "user":
+                self.update_sos(speed=speed, selected="user", source="Manual Input")
 
     def update_sos(self, selected=None, source=None, speed=None):
         """Sets a new specified speed of sound.
@@ -1988,54 +2349,69 @@ class TransectData(object):
         """
 
         # Get current speed of sound
-        sos_selected = getattr(self.sensors.speed_of_sound_mps, self.sensors.speed_of_sound_mps.selected)
+        sos_selected = getattr(
+            self.sensors.speed_of_sound_mps, self.sensors.speed_of_sound_mps.selected
+        )
         old_sos = sos_selected.data
         new_sos = None
 
         # Manual input for speed of sound
-        if selected == 'user' and source == 'Manual Input':
+        if selected == "user" and source == "Manual Input":
             self.sensors.speed_of_sound_mps.set_selected(selected_name=selected)
             self.sensors.speed_of_sound_mps.user = SensorData()
             self.sensors.speed_of_sound_mps.user.populate_data(speed, source)
 
-        # If called with no input set source to internal and determine whether computed or calculated based on
-        # availability of user supplied temperature or salinity
+        # If called with no input set source to internal and determine whether
+        # computed or calculated based on availability of user supplied
+        # temperature or salinity
         elif selected is None and source is None:
-            self.sensors.speed_of_sound_mps.set_selected('internal')
-            # If temperature or salinity is set by the user the speed of sound is computed otherwise it is consider
-            # calculated by the ADCP.
-            if (self.sensors.temperature_deg_c.selected == 'user') or (self.sensors.salinity_ppt.selected == 'user'):
-                self.sensors.speed_of_sound_mps.internal.set_source('Computed')
+            self.sensors.speed_of_sound_mps.set_selected("internal")
+            # If temperature or salinity is set by the user the speed of
+            # sound is computed otherwise it is consider calculated by the ADCP.
+            if (self.sensors.temperature_deg_c.selected == "user") or (
+                self.sensors.salinity_ppt.selected == "user"
+            ):
+                self.sensors.speed_of_sound_mps.internal.set_source("Computed")
             else:
-                self.sensors.speed_of_sound_mps.internal.set_source('Calculated')
+                self.sensors.speed_of_sound_mps.internal.set_source("Calculated")
 
         # Determine new speed of sound
-        if self.sensors.speed_of_sound_mps.selected == 'internal':
+        if self.sensors.speed_of_sound_mps.selected == "internal":
 
-            if self.sensors.speed_of_sound_mps.internal.source == 'Calculated':
+            if self.sensors.speed_of_sound_mps.internal.source == "Calculated":
                 # Internal: Calculated
                 new_sos = self.sensors.speed_of_sound_mps.internal.data_orig
                 self.sensors.speed_of_sound_mps.internal.change_data(data_in=new_sos)
                 # Change temperature and salinity selected to internal
-                self.sensors.temperature_deg_c.set_selected(selected_name='internal')
-                self.sensors.salinity_ppt.set_selected(selected_name='internal')
+                self.sensors.temperature_deg_c.set_selected(selected_name="internal")
+                self.sensors.salinity_ppt.set_selected(selected_name="internal")
             else:
                 # Internal: Computed
-                temperature_selected = getattr(self.sensors.temperature_deg_c, self.sensors.temperature_deg_c.selected)
+                temperature_selected = getattr(
+                    self.sensors.temperature_deg_c,
+                    self.sensors.temperature_deg_c.selected,
+                )
                 temperature = temperature_selected.data
-                salinity_selected = getattr(self.sensors.salinity_ppt, self.sensors.salinity_ppt.selected)
+                salinity_selected = getattr(
+                    self.sensors.salinity_ppt, self.sensors.salinity_ppt.selected
+                )
                 salinity = salinity_selected.data
-                new_sos = Sensors.speed_of_sound(temperature=temperature, salinity=salinity)
+                new_sos = Sensors.speed_of_sound(
+                    temperature=temperature, salinity=salinity
+                )
                 self.sensors.speed_of_sound_mps.internal.change_data(data_in=new_sos)
         else:
             if speed is not None:
-                new_sos = np.tile(speed, len(self.sensors.speed_of_sound_mps.internal.data_orig))
+                new_sos = np.tile(
+                    speed, len(self.sensors.speed_of_sound_mps.internal.data_orig)
+                )
                 self.sensors.speed_of_sound_mps.user.change_data(data_in=new_sos)
 
         self.apply_sos_change(old_sos=old_sos, new_sos=new_sos)
 
     def apply_sos_change(self, old_sos, new_sos):
-        """Computes the ratio and calls methods in WaterData and BoatData to apply change.
+        """Computes the ratio and calls methods in WaterData and BoatData to
+        apply change.
 
         Parameters
         ----------
@@ -2047,8 +2423,9 @@ class TransectData(object):
 
         ratio = new_sos / old_sos
 
-        # RiverRay horizontal velocities are not affected by changes in speed of sound
-        if self.adcp.model != 'RiverRay':
+        # RiverRay horizontal velocities are not affected by changes in
+        # speed of sound
+        if self.adcp.model != "RiverRay":
             # Apply speed of sound change to water and boat data
             self.w_vel.sos_correction(ratio=ratio)
             self.boat_vel.bt_vel.sos_correction(ratio=ratio)
@@ -2057,12 +2434,14 @@ class TransectData(object):
 
     @staticmethod
     def raw_valid_data(transect):
-        """Determines ensembles and cells with no interpolated water or boat data.
+        """Determines ensembles and cells with no interpolated water or
+        boat data.
 
         For valid water track cells both non-interpolated valid water data and
         boat velocity data must be available. Interpolated depths are allowed.
 
-        For valid ensembles water, boat, and depth data must all be non-interpolated.
+        For valid ensembles water, boat, and depth data must all be
+        non-interpolated.
 
         Parameters
         ----------
@@ -2079,9 +2458,13 @@ class TransectData(object):
 
         in_transect_idx = transect.in_transect_idx
 
-        # Determine valid water track ensembles based on water track and navigation data.
+        # Determine valid water track ensembles based on water track and
+        # navigation data.
         boat_vel_select = getattr(transect.boat_vel, transect.boat_vel.selected)
-        if boat_vel_select is not None and np.nansum(np.logical_not(np.isnan(boat_vel_select.u_processed_mps))) > 0:
+        if (
+            boat_vel_select is not None
+            and np.nansum(np.logical_not(np.isnan(boat_vel_select.u_processed_mps))) > 0
+        ):
             valid_nav = boat_vel_select.valid_data[0, in_transect_idx]
         else:
             valid_nav = np.tile(False, in_transect_idx.shape[0])
@@ -2093,15 +2476,21 @@ class TransectData(object):
         depths_select = getattr(transect.depths, transect.depths.selected)
         if transect.depths.composite:
             valid_depth = np.tile(True, (depths_select.depth_source_ens.shape[0]))
-            idx_na = np.where(depths_select.depth_source_ens[in_transect_idx] == 'NA')[0]
+            idx_na = np.where(depths_select.depth_source_ens[in_transect_idx] == "NA")[
+                0
+            ]
             if len(idx_na) > 0:
                 valid_depth[idx_na] = False
-            interpolated_depth_idx = np.where(depths_select.depth_source_ens[in_transect_idx] == 'IN')[0]
+            interpolated_depth_idx = np.where(
+                depths_select.depth_source_ens[in_transect_idx] == "IN"
+            )[0]
             if len(interpolated_depth_idx) > 0:
                 valid_depth[interpolated_depth_idx] = False
         else:
             valid_depth = depths_select.valid_data[in_transect_idx]
-            idx = np.where(np.isnan(depths_select.depth_processed_m[in_transect_idx]))[0]
+            idx = np.where(np.isnan(depths_select.depth_processed_m[in_transect_idx]))[
+                0
+            ]
             if len(idx) > 0:
                 valid_depth[idx] = False
 
@@ -2112,7 +2501,8 @@ class TransectData(object):
 
     @staticmethod
     def compute_gps_lag(transect):
-        """Computes the lag between bottom track and GGA and/or VTG using an autocorrelation method.
+        """Computes the lag between bottom track and GGA and/or VTG using an
+        autocorrelation method.
 
         Parameters
         ----------
@@ -2131,36 +2521,56 @@ class TransectData(object):
         lag_gga = None
         lag_vtg = None
 
-        bt_speed = np.sqrt(transect.boat_vel.bt_vel.u_processed_mps ** 2
-                           + transect.boat_vel.bt_vel.v_processed_mps ** 2)
+        bt_speed = np.sqrt(
+            transect.boat_vel.bt_vel.u_processed_mps**2
+            + transect.boat_vel.bt_vel.v_processed_mps**2
+        )
 
         avg_ens_dur = np.nanmean(transect.date_time.ens_duration_sec)
 
         # Compute lag for gga, if available
         if transect.boat_vel.gga_vel is not None:
-            gga_speed = np.sqrt(transect.boat_vel.gga_vel.u_processed_mps ** 2
-                                + transect.boat_vel.gga_vel.v_processed_mps ** 2)
+            gga_speed = np.sqrt(
+                transect.boat_vel.gga_vel.u_processed_mps**2
+                + transect.boat_vel.gga_vel.v_processed_mps**2
+            )
 
             # Compute lag if both bottom track and gga have valid data
-            valid_data = np.all(np.logical_not(np.isnan(np.vstack((bt_speed, gga_speed)))), axis=0)
+            valid_data = np.all(
+                np.logical_not(np.isnan(np.vstack((bt_speed, gga_speed)))), axis=0
+            )
             if np.sometrue(valid_data):
                 # Compute lag
-                lag_gga = (np.count_nonzero(valid_data)
-                           - np.argmax(signal.correlate(bt_speed[valid_data], gga_speed[valid_data])) - 1) * avg_ens_dur
+                lag_gga = (
+                    np.count_nonzero(valid_data)
+                    - np.argmax(
+                        signal.correlate(bt_speed[valid_data], gga_speed[valid_data])
+                    )
+                    - 1
+                ) * avg_ens_dur
             else:
                 lag_gga = None
 
         # Compute lag for vtg, if available
         if transect.boat_vel.vtg_vel is not None:
-            vtg_speed = np.sqrt(transect.boat_vel.vtg_vel.u_processed_mps ** 2
-                                + transect.boat_vel.vtg_vel.v_processed_mps ** 2)
+            vtg_speed = np.sqrt(
+                transect.boat_vel.vtg_vel.u_processed_mps**2
+                + transect.boat_vel.vtg_vel.v_processed_mps**2
+            )
 
             # Compute lag if both bottom track and gga have valid data
-            valid_data = np.all(np.logical_not(np.isnan(np.vstack((bt_speed, vtg_speed)))), axis=0)
+            valid_data = np.all(
+                np.logical_not(np.isnan(np.vstack((bt_speed, vtg_speed)))), axis=0
+            )
             if np.sometrue(valid_data):
                 # Compute lag
-                lag_vtg = (np.count_nonzero(valid_data)
-                           - np.argmax(signal.correlate(bt_speed[valid_data], vtg_speed[valid_data])) - 1) * avg_ens_dur
+                lag_vtg = (
+                    np.count_nonzero(valid_data)
+                    - np.argmax(
+                        signal.correlate(bt_speed[valid_data], vtg_speed[valid_data])
+                    )
+                    - 1
+                ) * avg_ens_dur
             else:
                 lag_vtg = None
 
@@ -2168,7 +2578,8 @@ class TransectData(object):
 
     @staticmethod
     def compute_gps_lag_fft(transect):
-        """Computes the lag between bottom track and GGA and/or VTG using fft method.
+        """Computes the lag between bottom track and GGA and/or VTG using fft
+         method.
 
         Parameters
         ----------
@@ -2185,23 +2596,32 @@ class TransectData(object):
         lag_gga = None
         lag_vtg = None
 
-        bt_speed = np.sqrt(transect.boat_vel.bt_vel.u_processed_mps ** 2
-                           + transect.boat_vel.bt_vel.v_processed_mps ** 2)
+        bt_speed = np.sqrt(
+            transect.boat_vel.bt_vel.u_processed_mps**2
+            + transect.boat_vel.bt_vel.v_processed_mps**2
+        )
 
-        avg_ens_dur = np.nanmean(transect.date_time.ens_duration_sec)
         if transect.boat_vel.gga_vel is not None:
-            gga_speed = np.sqrt(transect.boat_vel.gga_vel.u_processed_mps ** 2
-                                + transect.boat_vel.gga_vel.v_processed_mps ** 2)
-            valid_data = np.all(np.logical_not(np.isnan(np.vstack((bt_speed, gga_speed)))), axis=0)
+            gga_speed = np.sqrt(
+                transect.boat_vel.gga_vel.u_processed_mps**2
+                + transect.boat_vel.gga_vel.v_processed_mps**2
+            )
+            valid_data = np.all(
+                np.logical_not(np.isnan(np.vstack((bt_speed, gga_speed)))), axis=0
+            )
             b = fftpack.fft(bt_speed[valid_data])
             g = fftpack.fft(gga_speed[valid_data])
             br = -b.conjugat()
             lag_gga = np.argmax(np.abs(fftpack.ifft(br * g)))
 
         if transect.boat_vel.vtg_vel is not None:
-            vtg_speed = np.sqrt(transect.boat_vel.vtg_vel.u_processed_mps ** 2
-                                + transect.boat_vel.vtg_vel.v_processed_mps ** 2)
-            valid_data = np.all(np.logical_not(np.isnan(np.vstack((bt_speed, vtg_speed)))), axis=0)
+            vtg_speed = np.sqrt(
+                transect.boat_vel.vtg_vel.u_processed_mps**2
+                + transect.boat_vel.vtg_vel.v_processed_mps**2
+            )
+            valid_data = np.all(
+                np.logical_not(np.isnan(np.vstack((bt_speed, vtg_speed)))), axis=0
+            )
             b = fftpack.fft(bt_speed[valid_data])
             g = fftpack.fft(vtg_speed[valid_data])
             br = -b.conjugat()
@@ -2210,8 +2630,9 @@ class TransectData(object):
         return lag_gga, lag_vtg
 
     @staticmethod
-    def compute_gps_bt(transect, gps_ref='gga_vel'):
-        """Computes properties describing the difference between bottom track and the specified GPS reference.
+    def compute_gps_bt(transect, gps_ref="gga_vel"):
+        """Computes properties describing the difference between bottom track
+        and the specified GPS reference.
 
         Parameters
         ----------
@@ -2226,239 +2647,75 @@ class TransectData(object):
             course: float
                 Difference in course computed from gps and bt, in degrees
             ratio: float
-                Ratio of final distance made good for bt and gps (bt dmg / gps dmg)
+                Ratio of final distance made good for bt and gps
+                (bt dmg / gps dmg)
             dir: float
-                Direction of vector from end of GPS track to end of bottom track
+                Direction of vector from end of GPS track to end of bottom
+                track
             mag: float
                 Length of vector from end of GPS track to end of bottom track
         """
 
         gps_bt = dict()
         gps_vel = getattr(transect.boat_vel, gps_ref)
-        if gps_vel is not None and \
-                1 < np.sum(np.logical_not(np.isnan(gps_vel.u_processed_mps))) and \
-                1 < np.sum(np.logical_not(np.isnan(transect.boat_vel.bt_vel.u_processed_mps))):
+        if (
+            gps_vel is not None
+            and 1 < np.sum(np.logical_not(np.isnan(gps_vel.u_processed_mps)))
+            and 1
+            < np.sum(np.logical_not(np.isnan(transect.boat_vel.bt_vel.u_processed_mps)))
+        ):
             # Data prep
-            bt_track = BoatStructure.compute_boat_track(transect, ref='bt_vel')
+            bt_track = BoatStructure.compute_boat_track(transect, ref="bt_vel")
 
             try:
-                bt_course, _ = cart2pol(bt_track['track_x_m'][-1], bt_track['track_y_m'][-1])
+                bt_course, _ = cart2pol(
+                    bt_track["track_x_m"][-1], bt_track["track_y_m"][-1]
+                )
                 bt_course = rad2azdeg(bt_course)
             except TypeError:
                 bt_course = np.nan
 
             gps_track = BoatStructure.compute_boat_track(transect, ref=gps_ref)
-            gps_course, _ = cart2pol(gps_track['track_x_m'][-1], gps_track['track_y_m'][-1])
+            gps_course, _ = cart2pol(
+                gps_track["track_x_m"][-1], gps_track["track_y_m"][-1]
+            )
             gps_course = rad2azdeg(gps_course)
 
             # Compute course
-            gps_bt['course'] = gps_course - bt_course
-            if gps_bt['course'] < 0:
-                gps_bt['course'] = gps_bt['course'] + 360
+            gps_bt["course"] = gps_course - bt_course
+            if gps_bt["course"] < 0:
+                gps_bt["course"] = gps_bt["course"] + 360
 
             # Compute ratio
             try:
-                gps_bt['ratio'] = bt_track['dmg_m'][-1] / gps_track['dmg_m'][-1]
+                gps_bt["ratio"] = bt_track["dmg_m"][-1] / gps_track["dmg_m"][-1]
             except TypeError:
-                gps_bt['ratio'] = np.nan
+                gps_bt["ratio"] = np.nan
 
             # Compute closure vector
             try:
-                x_diff = bt_track['track_x_m'][-1] - gps_track['track_x_m'][-1]
+                x_diff = bt_track["track_x_m"][-1] - gps_track["track_x_m"][-1]
             except TypeError:
                 x_diff = np.nan
 
             try:
-                y_diff = bt_track['track_y_m'][-1] - gps_track['track_y_m'][-1]
+                y_diff = bt_track["track_y_m"][-1] - gps_track["track_y_m"][-1]
             except TypeError:
                 y_diff = np.nan
 
             try:
-                gps_bt['dir'], gps_bt['mag'] = cart2pol(x_diff, y_diff)
-                gps_bt['dir'] = rad2azdeg(gps_bt['dir'])
+                gps_bt["dir"], gps_bt["mag"] = cart2pol(x_diff, y_diff)
+                gps_bt["dir"] = rad2azdeg(gps_bt["dir"])
             except TypeError:
-                gps_bt['dir'] = np.nan
-                gps_bt['mag'] = np.nan
+                gps_bt["dir"] = np.nan
+                gps_bt["mag"] = np.nan
 
         return gps_bt
 
 
-# ========================================================================
-# Begin multithread function included in module but not TransectData class
-# Currently this is coded only for TRDI data
-# ========================================================================
-
-
-# DSM changed 1/23/2018 def allocate_transects(source, mmt, kargs)
-# TODO This needs a complete rewrite from what Greg did. However it works with no multi-threading for now
-
-# def add_transect(mmt, filename, index, type):
-#     pd0_data = Pd0TRDI(filename)
-#
-#     if type == 'MB':
-#         mmt_transect = mmt.mbt_transects[index]
-#     else:
-#         mmt_transect = mmt.transects[index]
-#
-#     transect = TransectData()
-#     transect.trdi(mmt=mmt,
-#                   mmt_transect=mmt_transect,
-#                   pd0_data=pd0_data)
-#     return transect
-#
-#
-# def allocate_transects(mmt, transect_type='Q', checked=False):
-#     """Method to load transect data. Changed from Matlab approach by Greg to allow possibility
-#     of multi-thread approach.
-#
-#     Parameters
-#     ----------
-#     mmt: MMT_TRDI
-#         Object of MMT_TRDI
-#     transect_type: str
-#         Type of transect (Q: discharge or MB: moving-bed test)
-#     checked: bool
-#         Determines if all files are loaded (False) or only checked files (True)
-#     """
-#
-#     # DEBUG, set threaded to false to get manual serial commands
-#     multi_threaded = False
-#
-#     file_names = []
-#     file_idx = []
-#
-#     # Setup processing for discharge or moving-bed transects
-#     if transect_type == 'Q':
-#         # Identify discharge transect files to load
-#         if checked:
-#             for idx, transect in enumerate(mmt.transects):
-#                 if transect.Checked == 1:
-#                     file_names.append(transect.Files[0])
-#                     file_idx.append(idx)
-#             # file_names = [transect.Files[0] for transect in mmt.transects if transect.Checked == 1]
-#         else:
-#             file_names = [transect.Files[0] for transect in mmt.transects]
-#             file_idx = list(range(0, len(file_names)))
-#     elif transect_type == 'MB':
-#         file_names = [transect.Files[0] for transect in mmt.mbt_transects]
-#         file_idx = list(range(0, len(file_names)))
-#
-#     # Determine if any files are missing
-#     valid_files = []
-#     valid_indices = []
-#     for index, name in enumerate(file_names):
-#         fullname = os.path.join(mmt.path, name)
-#         if os.path.exists(fullname):
-#             valid_files.append(fullname)
-#             valid_indices.append(file_idx[index])
-#
-#
-#     start = time.perf_counter()
-#     transects = []
-#     num = len(valid_indices)
-#     # num = 1
-#     multi_process = True
-#     if multi_process:
-#         with concurrent.futures.ProcessPoolExecutor() as executor:
-#             results = [executor.submit(add_transect, mmt, valid_files[k], valid_indices[k], transect_type) for k in range(num)]
-#
-#         for f in concurrent.futures.as_completed(results):
-#             transects.append(f.result())
-#     else:
-#         for k in range(num):
-#             transects.append(add_transect(mmt, valid_files[k], valid_indices[k], transect_type))
-#
-#     # # Multi-thread for Pd0 files
-#     # # -------------------------
-#     # # Seems like this section belongs in Pd0TRDI.py
-#     # # Initialize thread variables
-#     # pd0_data = []
-#     # pd0_threads = []
-#     # thread_id = 0
-#     #
-#     # # DSM 1/24/2018 could this be moved to Pd0TRDI.py as a method
-#     # def add_pd0(file_name):
-#     #     pd0_data.append(Pd0TRDI(file_name))
-#     #
-#     # if multi_threaded:
-#     #     # TODO this belongs in the pd0 class
-#     #     for file in valid_files:
-#     #         pd0_thread = MultiThread(thread_id=thread_id, function=add_pd0, args={'file_name': file})
-#     #         thread_id += 1
-#     #         pd0_thread.start()
-#     #         pd0_threads.append(pd0_thread)
-#     # else:
-#     #     for file in valid_files:
-#     #         pd0_data.append(Pd0TRDI(file))
-#     #
-#     # for thrd in pd0_threads:
-#     #     thrd.join()
-#     #
-#     # # Multi-thread for transect data
-#     #
-#     # # Initialize thread variables
-#     # processed_transects = []
-#     # transect_threads = []
-#     # thread_id = 0
-#     #
-#     # # DSM 1/24/2018 couldn't this be added to the TransectData class
-#     # def add_transect(transect_data, mmt_transect, mt_pd0_data, mt_mmt):
-#     #     transect_data.trdi(mmt=mt_mmt,
-#     #                        mmt_transect=mmt_transect,
-#     #                        pd0_data=mt_pd0_data)
-#     #     processed_transects.append(transect_data)
-#     #
-#     # # Process each transect
-#     # for k in range(len(pd0_data)):
-#     #     transect = TransectData()
-#     #     if pd0_data[k].Wt is not None:
-#     #         if transect_type == 'MB':
-#     #             # Process moving-bed transect
-#     #             if multi_threaded:
-#     #                 t_thread = MultiThread(thread_id=thread_id,
-#     #                                        function=add_transect,
-#     #                                        args={'transect': transect,
-#     #                                              'mmt_transect': mmt.mbt_transects[valid_indices[k]],
-#     #                                              'mt_pd0_data': pd0_data[k],
-#     #                                              'mt_mmt': mmt})
-#     #                 t_thread.start()
-#     #                 transect_threads.append(t_thread)
-#     #
-#     #             else:
-#     #                 transect = TransectData()
-#     #                 add_transect(transect_data=transect,
-#     #                              mmt_transect=mmt.mbt_transects[valid_indices[k]],
-#     #                              mt_pd0_data=pd0_data[k],
-#     #                              mt_mmt=mmt)
-#     #
-#     #         else:
-#     #             # Process discharge transects
-#     #             if multi_threaded:
-#     #                 t_thread = MultiThread(thread_id=thread_id,
-#     #                                        function=add_transect,
-#     #                                        args={'transect': transect,
-#     #                                              'mmt_transect': mmt.transects[valid_indices[k]],
-#     #                                              'mt_pd0_data': pd0_data[k],
-#     #                                              'mt_mmt': mmt})
-#     #                 t_thread.start()
-#     #                 transect_threads.append(t_thread)
-#     #
-#     #             else:
-#     #                 add_transect(transect_data=transect,
-#     #                              mmt_transect=mmt.transects[valid_indices[k]],
-#     #                              mt_pd0_data=pd0_data[k],
-#     #                              mt_mmt=mmt)
-#     #
-#     # if multi_threaded:
-#     #     for x in transect_threads:
-#     #         x.join()
-#     finish = time.perf_counter()
-#     print(f'Finished in {finish - start}')
-#     return processed_transects
-
-
 def adjusted_ensemble_duration(transect, trans_type=None):
-    """Applies the TRDI method of expanding the ensemble time when data are invalid.
+    """Applies the TRDI method of expanding the ensemble time when data are
+    invalid.
 
     Parameters
     ----------
@@ -2473,14 +2730,16 @@ def adjusted_ensemble_duration(transect, trans_type=None):
         Array of delta time in seconds for each ensemble.
     """
 
-    if transect.adcp.manufacturer == 'TRDI':
+    if transect.adcp.manufacturer == "TRDI":
         if trans_type is None:
             # Determine valid data from water track
-            valid = np.isnan(transect.w_vel.u_processed_mps) == False
+            valid = np.logical_not(np.isnan(transect.w_vel.u_processed_mps))
             valid_sum = np.sum(valid)
         else:
             # Determine valid data from bottom track
-            valid_sum = np.isnan(transect.boat_vel.bt_vel.u_processed_mps) == False
+            valid_sum = np.logical_not(
+                np.isnan(transect.boat_vel.bt_vel.u_processed_mps)
+            )
 
         valid_ens = valid_sum > 0
         n_ens = len(valid_ens)
diff --git a/qrevint_22_06_22/Classes/TransformationMatrix.py b/Classes/TransformationMatrix.py
similarity index 61%
rename from qrevint_22_06_22/Classes/TransformationMatrix.py
rename to Classes/TransformationMatrix.py
index 4bd3986a95a9d528e6f47c3eca9e5fcfd584e889..36933a6d76a1be230dd81a2301c5d3f6ef8bfe41 100644
--- a/qrevint_22_06_22/Classes/TransformationMatrix.py
+++ b/Classes/TransformationMatrix.py
@@ -2,7 +2,8 @@ import numpy as np
 
 
 class TransformationMatrix(object):
-    """Determines the transformation matrix and source for the specified ADCP model from the data provided.
+    """Determines the transformation matrix and source for the specified ADCP
+     model from the data provided.
 
     Attributes
     ----------
@@ -10,15 +11,16 @@ class TransformationMatrix(object):
         Source of transformation matrix, either Nominal or ADCP
     matrix: np.array
         One or more 4x4 transformation matrices.
-     """
+    """
 
     def __init__(self):
         """Constructor initializes variable to None"""
         self.source = None
         self.matrix = None
-        
+
     def populate_data(self, manufacturer, model=None, data_in=None):
-        """Uses the manufacturer and model to determine how to parse the transformation matrix.
+        """Uses the manufacturer and model to determine how to parse the
+        transformation matrix.
 
         Parameters
         ----------
@@ -29,54 +31,61 @@ class TransformationMatrix(object):
         data_in:
             System test data or 'Nominal'
         """
-        
-        if manufacturer == 'TRDI':
+
+        if manufacturer == "TRDI":
             self.trdi(model, data_in)
-        elif manufacturer == 'SonTek':
+        elif manufacturer == "SonTek":
             self.sontek(data_in)
 
     def trdi(self, model=None, data_in=None):
-        """Processes the data to store the transformation matrix for TRDI ADCPs.
-        If no transformation matrix information is available a nominal transformation
-        matrix for that model is assumed.
+        """Processes the data to store the transformation matrix for
+        TRDI ADCPs. If no transformation matrix information is available a nominal
+        transformation matrix for that model is assumed.
 
         Parameters
         ----------
         model: str
             Model of ADCP
-        data_in:
+        data_in: np.array(float)
             System test data or 'Nominal'
         """
 
         adcp_model = model
         # Set nominal matrix based on model
-        self.matrix = [[1.4619, -1.4619, 0, 0],
-                       [0, 0, -1.4619, 1.4619],
-                       [0.2661, 0.2661, 0.2661, 0.2661],
-                       [1.0337, 1.0337, -1.0337, -1.0337]]
-
-        if adcp_model == 'RiverRay':
-            self.matrix = [[1, -1, 0, 0],
-                           [0, 0, -1, 1],
-                           [0.2887, 0.2887, 0.2887, 0.2887],
-                           [0.7071, 0.7071, -0.7071, -0.7071]]
-
-        # Overwrite nominal transformation matrix with custom matrix from test data, if available
-        self.source = 'Nominal'
-        if data_in == 'Nominal':
-            self.source = 'Nominal'
-        elif adcp_model == 'Rio Grande':
+        self.matrix = [
+            [1.4619, -1.4619, 0, 0],
+            [0, 0, -1.4619, 1.4619],
+            [0.2661, 0.2661, 0.2661, 0.2661],
+            [1.0337, 1.0337, -1.0337, -1.0337],
+        ]
+        self.source = "Nominal"
+
+        if adcp_model == "RiverRay":
+            self.matrix = [
+                [1, -1, 0, 0],
+                [0, 0, -1, 1],
+                [0.2887, 0.2887, 0.2887, 0.2887],
+                [0.7071, 0.7071, -0.7071, -0.7071],
+            ]
+
+        # Overwrite nominal transformation matrix with custom matrix from
+        # test data, if available
+
+        if data_in == "Nominal":
+            self.source = "Nominal"
+        elif adcp_model == "Rio Grande":
             self.riogrande(data_in)
-        elif adcp_model == 'StreamPro':
+        elif adcp_model == "StreamPro":
             self.streampro(data_in)
-        elif adcp_model == 'RiverRay':
+        elif adcp_model == "RiverRay":
             self.riverray(data_in)
-        elif adcp_model == 'RiverPro':
+        elif adcp_model == "RiverPro":
             self.riverpro(data_in)
-        elif adcp_model == 'RioPro':
+        elif adcp_model == "RioPro":
             self.riopro(data_in)
-        elif adcp_model == 'pd0':
+        elif adcp_model == "pd0":
             self.matrix = data_in.Inst.t_matrix
+            self.source = "ADCP"
 
         if np.array(self.matrix).size < 16:
             self.trdi(model=model, data_in=None)
@@ -93,13 +102,15 @@ class TransformationMatrix(object):
             System test data
         """
         if data_in is not None:
-            idx = data_in.find('Instrument Transformation Matrix (Down):')
+            idx = data_in.find("Instrument Transformation Matrix (Down):")
             if idx != -1:
-                cell_matrix = np.fromstring(data_in[idx + 50:idx + 356], dtype=np.float64, sep=' ')
+                cell_matrix = np.fromstring(
+                    data_in[idx + 50 : idx + 356], dtype=np.float64, sep=" "
+                )
                 try:
                     self.matrix = np.reshape(cell_matrix, (-1, 8))[:, 0:4]
 
-                    self.source = 'ADCP'
+                    self.source = "ADCP"
                 except ValueError:
                     pass
 
@@ -113,15 +124,15 @@ class TransformationMatrix(object):
         """
 
         if data_in is not None:
-            idx = data_in.find('>PS3')
+            idx = data_in.find(">PS3")
             if idx != -1:
-                temp_str = data_in[idx + 5:idx + 138]
-                temp_str = temp_str.replace('-', ' -')
-                temp_str = temp_str[:temp_str.find('>')]
-                cell_matrix = np.fromstring(temp_str, dtype=np.float64, sep=' ')
+                temp_str = data_in[idx + 5 : idx + 138]
+                temp_str = temp_str.replace("-", " -")
+                temp_str = temp_str[: temp_str.find(">")]
+                cell_matrix = np.fromstring(temp_str, dtype=np.float64, sep=" ")
                 try:
                     self.matrix = cell_matrix.reshape(4, 4)
-                    self.source = 'ADCP'
+                    self.source = "ADCP"
                 except ValueError:
                     pass
 
@@ -134,16 +145,19 @@ class TransformationMatrix(object):
             System test data
         """
         if data_in is not None:
-            idx = data_in.find('Instrument Transformation Matrix')
+            idx = data_in.find("Instrument Transformation Matrix")
             if idx != -1:
-                idx2 = data_in[idx:].find(':')
-                idx3 = idx + idx2
+                idx2 = data_in[idx:].find(":")
+                idx3 = idx + idx2 + 1
                 if idx2 != -1:
-                    idx4 = data_in[idx3:].find('>')
+                    idx4 = data_in[idx3:].find(">")
                     idx5 = idx3 + idx4 - 2
                     if idx4 != -1:
-                        self.matrix = float(data_in[idx3:idx5])
-                        self.source = 'ADCP'
+                        cell_matrix = np.fromstring(
+                            data_in[idx3:idx5], dtype=np.float64, sep=" "
+                        )
+                        self.matrix = cell_matrix.reshape(4, 4)
+                        self.source = "ADCP"
 
     def riverpro(self, data_in):
         """Process RiverPro test data for transformation matrix.
@@ -154,16 +168,16 @@ class TransformationMatrix(object):
             System test data
         """
         if data_in is not None:
-            idx = data_in.find('Instrument Transformation Matrix')
+            idx = data_in.find("Instrument Transformation Matrix")
             if idx != -1:
-                idx2 = data_in[idx:].find(':')
+                idx2 = data_in[idx:].find(":")
                 idx3 = idx + idx2
                 if idx2 != -1:
-                    idx4 = data_in[idx3:].find('Has V-Beam')
+                    idx4 = data_in[idx3:].find("Has V-Beam")
                     idx5 = idx3 + idx4 - 2
                     if idx4 != -1:
                         self.matrix = float(data_in[idx3:idx5])
-                        self.source = 'ADCP'
+                        self.source = "ADCP"
 
     def riopro(self, data_in):
         """Process RioPro test data for transformation matrix.
@@ -175,16 +189,16 @@ class TransformationMatrix(object):
         """
 
         if data_in is not None:
-            idx = data_in.find('Instrument Transformation Matrix')
+            idx = data_in.find("Instrument Transformation Matrix")
             if idx != -1:
-                idx2 = data_in[idx:].find(':')
+                idx2 = data_in[idx:].find(":")
                 idx3 = idx + idx2
                 if idx2 != -1:
-                    idx4 = data_in[idx3:].find('Has V-Beam')
+                    idx4 = data_in[idx3:].find("Has V-Beam")
                     idx5 = idx3 + idx4 - 2
                     if idx4 != -1:
                         self.matrix = float(data_in[idx3:idx5])
-                        self.source = 'ADCP'
+                        self.source = "ADCP"
 
     def sontek(self, data_in):
         """Store SonTek transformation matrix data.
@@ -196,7 +210,7 @@ class TransformationMatrix(object):
         """
 
         if data_in is not None:
-            self.source = 'ADCP'
+            self.source = "ADCP"
             # Note: for M9 this is a 4x4x3 matrix (300,500,1000)
             # Note: for S5 this is a 4x4x2 matrix (3000,1000)
             self.matrix = data_in
diff --git a/qrevint_22_06_22/Classes/Uncertainty.py b/Classes/Uncertainty.py
similarity index 79%
rename from qrevint_22_06_22/Classes/Uncertainty.py
rename to Classes/Uncertainty.py
index 0af2deb425b8770d17689fda23aa1f402dd37be9..5e260b86b3c4b246d4ba6ac52009f5bce4d814a7 100644
--- a/qrevint_22_06_22/Classes/Uncertainty.py
+++ b/Classes/Uncertainty.py
@@ -8,15 +8,16 @@ class Uncertainty(object):
     Attributes
     ----------
     cov: float
-        Coefficient of variation for all transects used in dicharge computation
+        Coefficient of variation for all transects used in discharge computation
     cov_95: float
         Coefficient of variation inflated to the 95% percent coverage
     invalid_95: float
-        Estimated 95% uncertainty for dicharge in invalid bins and ensembles
+        Estimated 95% uncertainty for discharge in invalid bins and ensembles
     edges_95: float
         Estimated 95% uncertainty for the computed edge discharges
     extrapolation_95: float
-        Estimated 95% uncertainty in discharge due to top and bottom extrapolations
+        Estimated 95% uncertainty in discharge due to top and bottom
+        extrapolations
     moving_bed_95: float
         Estimated 95% uncertainty due to moving-bed tests and conditions
     systematic: float
@@ -24,19 +25,25 @@ class Uncertainty(object):
     total_95: float
         Estimated 95% uncertainty in discharge using automated values
     cov_95_user: float
-        User provided estimate of coefficient of variation inflated to the 95% percent coverage
+        User provided estimate of coefficient of variation inflated to the
+        95% percent coverage
     invalid_95_user: float
-        User provided estimate of95% uncertainty for discharge in invalid bins and ensembles
+        User provided estimate of95% uncertainty for discharge in invalid
+        bins and ensembles
     edges_95_user: float
-        User provided estimate of 95% uncertainty for the computed edge discharges
+        User provided estimate of 95% uncertainty for the computed edge
+        discharges
     extrapolation_95_user: float
-        User provided estimate of 95% uncertainty in discharge due to top and bottom extrapolations
+        User provided estimate of 95% uncertainty in discharge due to top
+        and bottom extrapolations
     moving_bed_95_user: float
-        User provided estimate of 95% uncertainty due to moving-bed tests and conditions
+        User provided estimate of 95% uncertainty due to moving-bed tests
+        and conditions
     systematic_user: float
         User provided estimate of systematic error estimated at 1.5% at 1 sigma
     total_95_user: float
-        Estimated 95% uncertainty in discharge using user provide values to override automated values
+        Estimated 95% uncertainty in discharge using user provide values to
+        override automated values
     """
 
     def __init__(self):
@@ -57,9 +64,18 @@ class Uncertainty(object):
         self.systematic_user = None
         self.total_95_user = None
 
-    def compute_uncertainty(self, meas, cov_95_user=None, invalid_95_user=None, edges_95_user=None,
-                            extrapolation_95_user=None, moving_bed_95_user=None, systematic_user=None):
-        """Computes the uncertainty for the components of the discharge measurement
+    def compute_uncertainty(
+        self,
+        meas,
+        cov_95_user=None,
+        invalid_95_user=None,
+        edges_95_user=None,
+        extrapolation_95_user=None,
+        moving_bed_95_user=None,
+        systematic_user=None,
+    ):
+        """Computes the uncertainty for the components of the discharge
+        measurement
         using measurement data or user provided values.
 
         Parameters
@@ -67,17 +83,23 @@ class Uncertainty(object):
         meas: Measurement
             Object of class Measurement
         cov_95_user: float
-            User provided estimate of coefficient of variation inflated to the 95% percent coverage
+            User provided estimate of coefficient of variation inflated to
+             the 95% percent coverage
         invalid_95_user: float
-            User provided estimate of95% uncertainty for discharge in invalid bins and ensembles
+            User provided estimate of95% uncertainty for discharge in invalid
+             bins and ensembles
         edges_95_user: float
-            User provided estimate of 95% uncertainty for the computed edge discharges
+            User provided estimate of 95% uncertainty for the computed edge
+             discharges
         extrapolation_95_user: float
-            User provided estimate of 95% uncertainty in discharge due to top and bottom extrapolations
+            User provided estimate of 95% uncertainty in discharge due to top
+            and bottom extrapolations
         moving_bed_95_user: float
-            User provided estimate of 95% uncertainty due to moving-bed tests and conditions
+            User provided estimate of 95% uncertainty due to moving-bed tests
+             and conditions
         systematic_user: float
-            User provided estimate of systematic error estimated at 1.5% at 1 sigma
+            User provided estimate of systematic error estimated at 1.5% at 1
+            sigma
         """
 
         # Use only checked discharges
@@ -89,7 +111,7 @@ class Uncertainty(object):
                 discharges.append(meas.discharge[n])
 
         # Compute uncertainties from the data
-        self.cov, self.cov_95 = self.uncertainty_q_random(discharges, 'total')
+        self.cov, self.cov_95 = self.uncertainty_q_random(discharges, "total")
         self.invalid_95 = self.uncertainty_invalid_data(discharges)
         self.edges_95 = self.uncertainty_edges(discharges)
         self.extrapolation_95 = self.uncertainty_extrapolation(meas, discharges)
@@ -108,14 +130,15 @@ class Uncertainty(object):
         self.estimate_total_uncertainty()
 
     def populate_from_qrev_mat(self, meas_struct):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+        file.
 
         Parameters
         ----------
         meas_struct: mat_struct
            Matlab data structure obtained from sio.loadmat
         """
-        if hasattr(meas_struct, 'uncertainty'):
+        if hasattr(meas_struct, "uncertainty"):
             self.cov = meas_struct.uncertainty.cov
             self.cov_95 = meas_struct.uncertainty.cov95
             self.invalid_95 = meas_struct.uncertainty.invalid95
@@ -139,17 +162,23 @@ class Uncertainty(object):
             self.total_95_user = meas_struct.uncertainty.total95User
 
     def estimate_total_uncertainty(self):
-        """Compute the uncertainty of the measurement using the automatically computed uncertainties and
+        """Compute the uncertainty of the measurement using the automatically
+        computed uncertainties and
         user overrides.
         """
 
-        self.total_95 = 2.0 * ((self.cov_95 / 2)**2
-                               + (self.invalid_95 / 2)**2
-                               + (self.edges_95 / 2)**2
-                               + (self.extrapolation_95 / 2)**2
-                               + (self.moving_bed_95 / 2)**2
-                               + self.systematic**2
-                               )**0.5
+        self.total_95 = (
+            2.0
+            * (
+                (self.cov_95 / 2) ** 2
+                + (self.invalid_95 / 2) ** 2
+                + (self.edges_95 / 2) ** 2
+                + (self.extrapolation_95 / 2) ** 2
+                + (self.moving_bed_95 / 2) ** 2
+                + self.systematic**2
+            )
+            ** 0.5
+        )
 
         if self.cov_95_user is None:
             cov_95_user = self.cov_95
@@ -169,7 +198,7 @@ class Uncertainty(object):
         if self.extrapolation_95_user is None:
             extrapolation_95_user = self.extrapolation_95
         else:
-            extrapolation_95_user = self. extrapolation_95_user
+            extrapolation_95_user = self.extrapolation_95_user
 
         if self.moving_bed_95_user is None:
             moving_bed_95_user = self.moving_bed_95
@@ -181,17 +210,23 @@ class Uncertainty(object):
         else:
             systematic_user = self.systematic_user
 
-        self.total_95_user = 2.0 * ((cov_95_user / 2)**2
-                                    + (invalid_95_user / 2)**2
-                                    + (edges_95_user / 2)**2
-                                    + (extrapolation_95_user / 2)**2
-                                    + (moving_bed_95_user / 2)**2
-                                    + systematic_user**2
-                                    )**0.5
+        self.total_95_user = (
+            2.0
+            * (
+                (cov_95_user / 2) ** 2
+                + (invalid_95_user / 2) ** 2
+                + (edges_95_user / 2) ** 2
+                + (extrapolation_95_user / 2) ** 2
+                + (moving_bed_95_user / 2) ** 2
+                + systematic_user**2
+            )
+            ** 0.5
+        )
 
     @staticmethod
     def get_array_attr(list_in, prop):
-        """Create an array of the requested attribute from a list of objects containing the requested attribute.
+        """Create an array of the requested attribute from a list of objects
+        containing the requested attribute.
 
         Parameters
         ----------
@@ -242,12 +277,13 @@ class Uncertainty(object):
 
             # Inflate the cov to the 95% value
             if n_max == 2:
-                # Use the approximate method as taught in class to reduce the high coverage factor for 2 transects
-                # and account for prior knowledge related to 720 second duration analysis
+                # Use the approximate method as taught in class to reduce the
+                # high coverage factor for 2 transects and account for prior
+                # knowledge related to 720 second duration analysis
                 cov_95 = cov * 3.3
             else:
                 # Use Student's t to inflate COV for n > 2
-                cov_95 = t.interval(0.95, n_max-1)[1] * cov / n_max**0.5
+                cov_95 = t.interval(0.95, n_max - 1)[1] * cov / n_max**0.5
         else:
             cov = np.nan
             cov_95 = np.nan
@@ -256,7 +292,8 @@ class Uncertainty(object):
 
     @staticmethod
     def uncertainty_edges(discharges):
-        """Compute uncertainty of edge discharge. Currently assuming random plus bias
+        """Compute uncertainty of edge discharge. Currently assuming random
+        plus bias
         is within 30% of actual value.
 
         Parameters
@@ -271,9 +308,9 @@ class Uncertainty(object):
         """
 
         # Compute mean discharge values for total, left, and right
-        mean_q = np.nanmean(Uncertainty.get_array_attr(discharges, 'total'))
-        mean_left = np.nanmean(Uncertainty.get_array_attr(discharges, 'left'))
-        mean_right = np.nanmean(Uncertainty.get_array_attr(discharges, 'right'))
+        mean_q = np.nanmean(Uncertainty.get_array_attr(discharges, "total"))
+        mean_left = np.nanmean(Uncertainty.get_array_attr(discharges, "left"))
+        mean_right = np.nanmean(Uncertainty.get_array_attr(discharges, "right"))
 
         # Compute combined edge uncertainty
         percent_edge = ((np.abs(mean_left) + np.abs(mean_right)) / mean_q) * 100
@@ -299,15 +336,21 @@ class Uncertainty(object):
         """
 
         # Compute mean total uncorrected discharge
-        q_selected = np.nanmean(Uncertainty.get_array_attr(discharges, 'total_uncorrected'))
+        q_selected = np.nanmean(
+            Uncertainty.get_array_attr(discharges, "total_uncorrected")
+        )
 
         # Create array of discharges from the various extrapolation methods
-        q_possible = np.array([meas.extrap_fit.q_sensitivity.q_pp_mean,
-                               meas.extrap_fit.q_sensitivity.q_pp_opt_mean,
-                               meas.extrap_fit.q_sensitivity.q_cns_mean,
-                               meas.extrap_fit.q_sensitivity.q_cns_opt_mean,
-                               meas.extrap_fit.q_sensitivity.q_3p_ns_mean,
-                               meas.extrap_fit.q_sensitivity.q_3p_ns_opt_mean])
+        q_possible = np.array(
+            [
+                meas.extrap_fit.q_sensitivity.q_pp_mean,
+                meas.extrap_fit.q_sensitivity.q_pp_opt_mean,
+                meas.extrap_fit.q_sensitivity.q_cns_mean,
+                meas.extrap_fit.q_sensitivity.q_cns_opt_mean,
+                meas.extrap_fit.q_sensitivity.q_3p_ns_mean,
+                meas.extrap_fit.q_sensitivity.q_3p_ns_opt_mean,
+            ]
+        )
 
         # Compute difference in discharges from the selected method
         q_diff = np.abs(q_possible - q_selected)
@@ -322,7 +365,8 @@ class Uncertainty(object):
 
     @staticmethod
     def uncertainty_invalid_data(discharges):
-        """Computes an estimate of the uncertainty for the discharge computed for invalid bins and ensembles.
+        """Computes an estimate of the uncertainty for the discharge computed
+        for invalid bins and ensembles.
 
         Parameters
         ----------
@@ -336,22 +380,25 @@ class Uncertainty(object):
         """
 
         # Compute mean discharges
-        q_mean = np.nanmean(Uncertainty.get_array_attr(discharges, 'total'))
-        q_cells = np.nanmean(Uncertainty.get_array_attr(discharges, 'int_cells'))
-        q_ensembles = np.nanmean(Uncertainty.get_array_attr(discharges, 'int_ens'))
+        q_mean = np.nanmean(Uncertainty.get_array_attr(discharges, "total"))
+        q_cells = np.nanmean(Uncertainty.get_array_attr(discharges, "int_cells"))
+        q_ensembles = np.nanmean(Uncertainty.get_array_attr(discharges, "int_ens"))
 
         # Compute percentages
         percent_cells = (q_cells / q_mean) * 100
         percent_ensembles = (q_ensembles / q_mean) * 100
 
         # Compute uncertainty for combined invalid cells and ensembles
-        invalid_data_uncertainty = (np.abs(percent_cells) + np.abs(percent_ensembles)) * 0.2
+        invalid_data_uncertainty = (
+            np.abs(percent_cells) + np.abs(percent_ensembles)
+        ) * 0.2
 
         return invalid_data_uncertainty
 
     @staticmethod
     def uncertainty_moving_bed(meas, checked):
-        """Estimates the 95% uncertainty of the discharge due to a moving-bed and navigation reference.
+        """Estimates the 95% uncertainty of the discharge due to a
+        moving-bed and navigation reference.
 
         Parameters
         ----------
@@ -366,7 +413,10 @@ class Uncertainty(object):
             95% uncertainty associated with moving-bed conditions
         """
 
-        if np.any(checked) and meas.transects[checked.index(1)].boat_vel.selected == 'bt_vel':
+        if (
+            np.any(checked)
+            and meas.transects[checked.index(1)].boat_vel.selected == "bt_vel"
+        ):
             # Boat velocity based on bottom track, moving-bed possible
             if len(meas.mb_tests) > 0:
                 # Moving_bed tests recorded
@@ -376,7 +426,7 @@ class Uncertainty(object):
                 used = []
                 for test in meas.mb_tests:
                     user_valid.append(test.user_valid)
-                    if test.test_quality == 'Errors':
+                    if test.test_quality == "Errors":
                         quality.append(False)
                     else:
                         quality.append(True)
@@ -388,11 +438,13 @@ class Uncertainty(object):
                     # Check to see if the valid tests indicate a moving bed
                     moving_bed_bool = []
                     for result in moving_bed:
-                        if result == 'Yes':
+                        if result == "Yes":
                             moving_bed_bool.append(True)
                         else:
                             moving_bed_bool.append(False)
-                    valid_moving_bed = np.logical_and(quality, np.asarray(moving_bed_bool))
+                    valid_moving_bed = np.logical_and(
+                        quality, np.asarray(moving_bed_bool)
+                    )
                     if np.any(valid_moving_bed):
                         # Check to see that a correction was used
                         if np.any(np.logical_and(valid_moving_bed, np.asarray(used))):
diff --git a/qrevint_22_06_22/Classes/WaterData.py b/Classes/WaterData - Copie.py
similarity index 67%
rename from qrevint_22_06_22/Classes/WaterData.py
rename to Classes/WaterData - Copie.py
index 56e1b68df3d76968b197f29ad7f0cdac26ca2a36..0b990058ad524ecc0a056f27e4568218f5ed31f3 100644
--- a/qrevint_22_06_22/Classes/WaterData.py
+++ b/Classes/WaterData - Copie.py	
@@ -15,14 +15,16 @@ class WaterData(object):
     ----------
     Original data provided to the class:
         raw_vel_mps: np.array(float)
-            Contains the raw unfiltered velocity in m/s.  1st index 1-4 are beams 1,2,3,4 if beam or
-            u,v,w,d if otherwise.
+            Contains the raw unfiltered velocity in m/s.  1st index 1-4 are
+            beams 1,2,3,4 if beam or u,v,w,d if otherwise.
         frequency: np.array(float)
             Defines ADCP frequency used for velocity measurement, in kHz.
         orig_coord_sys: str
-            Defines the original raw velocity coordinate system "Beam", "Inst", "Ship", "Earth".
+            Defines the original raw velocity coordinate system "Beam",
+            "Inst", "Ship", "Earth".
         orig_nav_ref: str
-            Defines the original taw data naviagation reference: "None", "BT", "GGA", "VTG".
+            Defines the original taw data naviagation reference: "None", "BT",
+             "GGA", "VTG".
         corr: np.array(float)
             Correlation values for WT, if available.
         rssi: np.array(float)
@@ -32,9 +34,11 @@ class WaterData(object):
         water_mode: str
             WaterMode for TRDI or 'Variable' for SonTek.
         blanking_distance_m: float
-            Distance below transducer where data are marked invalid due to potential ringing.
+            Distance below transducer where data are marked invalid due to
+             potential ringing.
         cells_above_sl: np.array(bool)
-            Logical array of depth cells above sidelobe cutoff based on selected depth reference.
+            Logical array of depth cells above sidelobe cutoff based on
+            selected depth reference.
         cells_above_sl_bt: np.array(bool)
             Logical array of depth cells above the sidelobe cutoff based on BT
         sl_lag_effect_m: np.array(float)
@@ -42,25 +46,33 @@ class WaterData(object):
 
     Data computed in this class:
         u_earth_no_ref_mps: np.array(float)
-            Horizontal velocity in x-direction with no boat reference applied, in m/s.
+            Horizontal velocity in x-direction with no boat reference applied,
+            in m/s.
         v_earth_no_ref_mps: np.array(float)
-            Horizontal velocity in y-direction with no boat reference applied, in m/s.
+            Horizontal velocity in y-direction with no boat reference applied,
+            in m/s.
         u_mps: np.array(float)
-            Horizontal velocity in x-direction, earth coord, nav referenced, in m/s.
+            Horizontal velocity in x-direction, earth coord, nav referenced,
+            in m/s.
         v_mps: np.array(float)
-            Horizontal velocity in y-direction, earth coord, nav referenced, in m/s.
+            Horizontal velocity in y-direction, earth coord, nav referenced,
+            in m/s.
         u_processed_mps: np.array(float)
-            Horizontal velocity in x-direction, earth coord, nav ref, filtered, and interpolated.
+            Horizontal velocity in x-direction, earth coord, nav ref,
+            filtered, and interpolated.
         v_processed_mps: np.array(float)
-            Horizontal veloctiy in y-direction, earth coord, nav ref, filtered, and interpolated.
+            Horizontal veloctiy in y-direction, earth coord, nav ref,
+            filtered, and interpolated.
         w_mps: np.array(float)
             Vertical velocity (+ up), in m/s.
         d_mps: np.array(float)
-            Difference in vertical velocities compute from opposing beam pairs, in m/s.
+            Difference in vertical velocities compute from opposing beam
+            pairs, in m/s.
         invalid_index: np.array(bool)
             Index of ensembles with no valid raw velocity data.
         num_invalid: float
-            Estimated number of depth cells in ensembles with no valid raw velocity data.
+            Estimated number of depth cells in ensembles with no valid raw
+            velocity data.
         valid_data: np.array(float)
             3-D logical array of valid data
                 Dim1 0 - composite
@@ -85,9 +97,11 @@ class WaterData(object):
         w_filter_thresholds: float, dict, tuple
             Threshold(s) for vertical velocity filter.
         excluded_dist_m: float
-            Distance below transucer for which data are excluded or marked invalid, in m.
+            Distance below transucer for which data are excluded or marked
+            invalid, in m.
         orig_excluded_dist_m: float
-            Original distance below transucer for which data are excluded or marked invalid, in m.
+            Original distance below transucer for which data are excluded or
+            marked invalid, in m.
         smooth_filter: str
             Set filter based on smoothing function "On", "Off".
         smooth_speed: np.array(float)
@@ -100,6 +114,8 @@ class WaterData(object):
             Set SNR filter for SonTek data "On", "Off".
         snr_rng: np.array(float)
             Range of beam averaged SNR
+        snr_3beam_comp: bool
+            Indicates the use of 3-beam velocity computations when invalid SNR is found
         wt_depth_filter: np.array(bool)
             WT in ensembles with invalid depths are marked invalid.
         interpolate_ens: str
@@ -107,29 +123,33 @@ class WaterData(object):
         interpolate_cells: str
             Type of cell interpolation: "None", "TRDI", "Linear", 'abba'
         coord_sys: str
-            Defines the velocity coordinate system "Beam", "Inst", "Ship", "Earth"
+            Defines the velocity coordinate system "Beam", "Inst", "Ship",
+            "Earth"
         nav_ref: str
             Defines the navigation reference: "None", "BT", "GGA", "VTG"
         sl_cutoff_percent: float
             Percent cutoff defined by cos(angle)
         sl_cutoff_number: float
-            User specified number of cells to cutoff from SonTek, not implemented, undefined
+            User specified number of cells to cutoff from SonTek, not
+            implemented, undefined
         sl_cutoff_type: str
             Type of cutoff method "Percent" or "Number".
         ping_type: np.array(int)
-            Indicates type of ping for each cell: 0-incoherent, 1-coherent, 2-surface
+            Indicates type of ping for each cell: 0-incoherent, 1-coherent,
+            2-surface
         d_meas_thresholds: list
-            Dictionary of difference velocity thresholds computed using the whole measurement by ping type
+            Dictionary of difference velocity thresholds computed using the
+            whole measurement by ping type
         w_meas_thresholds: list
-            Dictionary of vertical velocity thresholds computed using the whole measurement by ping type
+            Dictionary of vertical velocity thresholds computed using the
+            whole measurement by ping type
         use_measurement_thresholds: bool
             Indicates if the measurement based thresholds should be used
 
     """
 
     def __init__(self):
-        """Initialize instance variables.
-        """
+        """Initialize instance variables."""
 
         # Data input to this class
         self.raw_vel_mps = None
@@ -144,7 +164,7 @@ class WaterData(object):
         self.cells_above_sl = None
         self.cells_above_sl_bt = None
         self.sl_lag_effect_m = None
-        
+
         # Data computed in this class
         self.u_earth_no_ref_mps = None
         self.v_earth_no_ref_mps = None
@@ -157,7 +177,7 @@ class WaterData(object):
         self.invalid_index = None
         self.num_invalid = []
         self.valid_data = None
-                                
+
         # Settings
         self.beam_filter = None
         self.d_filter = None
@@ -170,8 +190,10 @@ class WaterData(object):
         self.smooth_speed = None
         self.smooth_upper_limit = None
         self.smooth_lower_limit = None
-        self.snr_filter = 'Off'
+        self.snr_filter = "Off"
         self.snr_rng = []
+        self.snr_beam_velocities = None
+        self.snr_3beam_comp = False
         self.wt_depth_filter = True
         self.interpolate_ens = None
         self.interpolate_cells = None
@@ -189,12 +211,33 @@ class WaterData(object):
 
         self.use_measurement_thresholds = False
 
-    def populate_data(self, vel_in, freq_in, coord_sys_in, nav_ref_in, rssi_in, rssi_units_in,
-                      excluded_dist_in, cells_above_sl_in, sl_cutoff_per_in, sl_cutoff_num_in,
-                      sl_cutoff_type_in, sl_lag_effect_in, wm_in, blank_in, corr_in=None,
-                      surface_vel_in=None, surface_rssi_in=None, surface_corr_in=None, sl_cutoff_m=None,
-                      surface_num_cells_in=0, ping_type='U', use_measurement_thresholds=False):
-        
+    def populate_data(
+            self,
+            vel_in,
+            freq_in,
+            coord_sys_in,
+            nav_ref_in,
+            rssi_in,
+            rssi_units_in,
+            excluded_dist_in,
+            cells_above_sl_in,
+            sl_cutoff_per_in,
+            sl_cutoff_num_in,
+            sl_cutoff_type_in,
+            sl_lag_effect_in,
+            wm_in,
+            blank_in,
+            corr_in=None,
+            surface_vel_in=None,
+            surface_rssi_in=None,
+            surface_corr_in=None,
+            sl_cutoff_m=None,
+            surface_num_cells_in=0,
+            ping_type="U",
+            use_measurement_thresholds=False,
+            snr_3beam_comp=False,
+    ):
+
         """Populates the variables with input, computed, or default values.
 
         Parameters
@@ -205,17 +248,21 @@ class WaterData(object):
         freq_in: np.array(float)
             Defines ADCP frequency used for velocity measurement.
         coord_sys_in: str
-            Defines the original raw  velocity coordinate system "Beam", "Inst", "Ship", "Earth".
+            Defines the original raw  velocity coordinate system "Beam",
+            "Inst", "Ship", "Earth".
         nav_ref_in: str
-            Defines the original raw data navigation reference: "None", "BT", "GGA", "VTG".
+            Defines the original raw data navigation reference: "None", "BT",
+             "GGA", "VTG".
         rssi_in: np.array(float)
             Returned acoustic signal strength.
         rssi_units_in: str
             Units for returned acoustic signal strength: "Counts", "dB", "SNR".
         excluded_dist_in: float
-            Distance below transducer for which data are excluded or marked invalid.
+            Distance below transducer for which data are excluded or marked
+            invalid.
         cells_above_sl_in: np.array(bool)
-            Bool array of depth cells above the sidelobe cutoff based on selected depth reference.
+            Bool array of depth cells above the sidelobe cutoff based on
+             selected depth reference.
         sl_cutoff_per_in: float
             Percent cutoff defined by cos(angle).
         sl_cutoff_num_in: float
@@ -224,6 +271,8 @@ class WaterData(object):
             Method used to compute cutoff "Percent" or "Number".
         sl_lag_effect_in: np.array(float)
             Lag effect for each ensemble, in m.
+        snr_3beam_comp: bool
+            Indicates the use of 3-beam velocity computations when invalid SNR is found
         wm_in: str
             Watermode for TRDI or 'Variable' for SonTek.
         blank_in: float
@@ -233,19 +282,28 @@ class WaterData(object):
         surface_vel_in: np.array(float)
             Surface velocity data for RiverRay, RiverPro, RioPro. Optional.
         surface_rssi_in: np.array(float)
-            Returned acoust signal strength for RiverRay, RiverPro, RioPro. Optional.
+            Returned acoust signal strength for RiverRay, RiverPro, RioPro.
+            Optional.
         surface_corr_in: np.array(float)
-            Surface velocity correlations for RiverRay, RiverPro, RioPro. Optional.
+            Surface velocity correlations for RiverRay, RiverPro, RioPro.
+            Optional.
         surface_num_cells_in: np.array(float)
-            Number of surface cells in each ensemble for RiverRay, RiverPro, RioPro. Optional.
+            Number of surface cells in each ensemble for RiverRay, RiverPro,
+            RioPro. Optional.
         sl_cutoff_m: np.array(float)
             Depth in meters of side lobe cutoff to center of cells.
         ping_type: np.array(str)
             Indicates type of ping used for water tracking
+        use_measurement_thresholds: bool
+            Indicates if thresholds should be computed using entire measurement
         """
 
         # Set object properties from input data standard for all ADCPs
-        self.frequency = freq_in
+        if np.nanmean(freq_in) < 10:
+            self.frequency = freq_in * 1000
+        else:
+            self.frequency = freq_in
+
         self.orig_coord_sys = coord_sys_in
         self.coord_sys = coord_sys_in
         self.orig_nav_ref = nav_ref_in
@@ -256,8 +314,11 @@ class WaterData(object):
         max_cells = cells_above_sl_in.shape[0]
         self.ping_type = np.tile(np.array([ping_type]), (max_cells, 1))
         self.use_measurement_thresholds = use_measurement_thresholds
+        self.snr_beam_velocities = None
+        self.snr_3beam_comp = snr_3beam_comp
 
-        # Set object properties that depend on the presence or absence of surface cells
+        # Set object properties that depend on the presence or absence of
+        # surface cells
         if np.sum(surface_num_cells_in) > 0:
             surface_num_cells_in[np.isnan(surface_num_cells_in)] = 0
 
@@ -265,27 +326,43 @@ class WaterData(object):
             num_reg_cells = vel_in.shape[1]
             max_surf_cells = max_cells - num_reg_cells
 
-            # Combine surface velocity bins and regular velocity bins into one matrix
+            # Combine surface velocity bins and regular velocity bins into
+            # one matrix
             self.raw_vel_mps = np.tile([np.nan], [4, max_cells, num_ens])
             self.rssi = np.tile([np.nan], [4, max_cells, num_ens])
             self.corr = np.tile([np.nan], [4, max_cells, num_ens])
 
             if max_surf_cells > 0:
-                self.raw_vel_mps[:, :max_surf_cells, :] = surface_vel_in[:, :max_surf_cells, :]
-                self.rssi[:, :max_surf_cells, :] = surface_rssi_in[:, :max_surf_cells, :]
-                self.corr[:, :max_surf_cells, :] = surface_corr_in[:, :max_surf_cells, :]
+                self.raw_vel_mps[:, :max_surf_cells, :] = surface_vel_in[
+                                                          :, :max_surf_cells, :
+                                                          ]
+                self.rssi[:, :max_surf_cells, :] = surface_rssi_in[
+                                                   :, :max_surf_cells, :
+                                                   ]
+                self.corr[:, :max_surf_cells, :] = surface_corr_in[
+                                                   :, :max_surf_cells, :
+                                                   ]
 
             for i_ens in range(num_ens):
-                self.raw_vel_mps[:,
-                                 int(surface_num_cells_in[i_ens]):int(surface_num_cells_in[i_ens])
-                                 + num_reg_cells, i_ens] = vel_in[:, :num_reg_cells, i_ens]
-                self.rssi[:,
-                          int(surface_num_cells_in[i_ens]):int(surface_num_cells_in[i_ens])
-                          + num_reg_cells, i_ens] = rssi_in[:, :num_reg_cells, i_ens]
-                self.corr[:,
-                          int(surface_num_cells_in[i_ens]):int(surface_num_cells_in[i_ens])
-                          + num_reg_cells, i_ens] = corr_in[:, :num_reg_cells, i_ens]
-                self.ping_type[:int(surface_num_cells_in[i_ens]), i_ens] = 'S'
+                self.raw_vel_mps[
+                :,
+                int(surface_num_cells_in[i_ens]): int(surface_num_cells_in[i_ens])
+                                                  + num_reg_cells,
+                i_ens,
+                ] = vel_in[:, :num_reg_cells, i_ens]
+                self.rssi[
+                :,
+                int(surface_num_cells_in[i_ens]): int(surface_num_cells_in[i_ens])
+                                                  + num_reg_cells,
+                i_ens,
+                ] = rssi_in[:, :num_reg_cells, i_ens]
+                self.corr[
+                :,
+                int(surface_num_cells_in[i_ens]): int(surface_num_cells_in[i_ens])
+                                                  + num_reg_cells,
+                i_ens,
+                ] = corr_in[:, :num_reg_cells, i_ens]
+                self.ping_type[: int(surface_num_cells_in[i_ens]), i_ens] = "S"
         else:
             # No surface cells
             self.raw_vel_mps = vel_in
@@ -296,7 +373,8 @@ class WaterData(object):
                 # No correlations input
                 self.corr = np.tile(np.nan, rssi_in.shape)
 
-        #TODO This doesn't seem correct. If raw data in beam coordinates this is not correct.
+        # TODO This doesn't seem correct. If raw data in beam coordinates
+        #  this is not correct.
         self.u_mps = np.copy(self.raw_vel_mps)[0, :, :]
         self.v_mps = np.copy(self.raw_vel_mps)[1, :, :]
         self.w_mps = np.copy(self.raw_vel_mps)[2, :, :]
@@ -306,13 +384,14 @@ class WaterData(object):
         self.excluded_dist_m = excluded_dist_in
         self.orig_excluded_dist_m = excluded_dist_in
 
-        # In some rare situations the blank is empty so it is set to the excluded_dist_in
+        # In some rare situations the blank is empty so it is set to the
+        # excluded_dist_in
         try:
             blank_in = float(blank_in)
             self.blanking_distance_m = blank_in
         except ValueError:
             self.blanking_distance_m = excluded_dist_in
-            
+
         self.cells_above_sl = cells_above_sl_in
         self.cells_above_sl_bt = cells_above_sl_in
         self.sl_cutoff_percent = sl_cutoff_per_in
@@ -320,37 +399,37 @@ class WaterData(object):
         self.sl_cutoff_type = sl_cutoff_type_in
         self.sl_lag_effect_m = sl_lag_effect_in
         self.sl_cutoff_m = sl_cutoff_m
-        
+
         # Set filter defaults to no filtering and no interruption
         self.beam_filter = 3
-        self.d_filter = 'Off'
+        self.d_filter = "Off"
         self.d_filter_thresholds = {}
-        self.w_filter = 'Off'
+        self.w_filter = "Off"
         self.w_filter_thresholds = {}
         self.smooth_filter = False
-        self.interpolate_ens = 'None'
-        self.interpolate_cells = 'None'
-        
+        self.interpolate_ens = "None"
+        self.interpolate_cells = "None"
+
         # Determine original valid
 
         # Initialize valid data property
         self.valid_data = np.tile(self.cells_above_sl, [9, 1, 1])
-        
+
         # Find invalid raw data
         valid_vel = np.tile(self.cells_above_sl, [4, 1, 1])
         valid_vel[np.isnan(self.raw_vel_mps)] = False
-            
+
         # Identify invalid velocity data (less than 3 valid beams)
         valid_vel_sum = np.sum(valid_vel, axis=0)
         valid_data2 = np.copy(self.cells_above_sl)
         valid_data2[valid_vel_sum < 3] = False
-        
+
         # Set valid_data property for original data
         self.valid_data[1, :, :] = valid_data2
-        
+
         # Combine all filter data to composite valid data
         self.all_valid_data()
-        
+
         # Estimate the number of cells in invalid ensembles using
         # Adjacent valid ensembles
         valid_data_2_sum = np.nansum(self.valid_data[1], 0)
@@ -358,34 +437,37 @@ class WaterData(object):
         n_invalid = len(self.invalid_index)
         for n in range(n_invalid):
             # Find first valid ensemble
-            idx1 = np.where(valid_data_2_sum[:self.invalid_index[n]] > 0)[0]
+            idx1 = np.where(valid_data_2_sum[: self.invalid_index[n]] > 0)[0]
             if len(idx1) > 0:
                 idx1 = idx1[0]
             else:
                 idx1 = self.invalid_index[n]
-                
+
             # Find next valid ensemble
-            idx2 = np.where(valid_data_2_sum[:self.invalid_index[n]] > 0)[0]
+            idx2 = np.where(valid_data_2_sum[: self.invalid_index[n]] > 0)[0]
             if len(idx2) > 0:
                 idx2 = idx2[-1]
             else:
                 idx2 = self.invalid_index[n]
-                
+
             # Estimate number of cells in invalid ensemble
-            self.num_invalid.append(np.floor((valid_data_2_sum[idx1]+valid_data_2_sum[idx2]) / 2))
-            
+            self.num_invalid.append(
+                np.floor((valid_data_2_sum[idx1] + valid_data_2_sum[idx2]) / 2)
+            )
+
         # Set processed data to non-interpolated valid data
         self.u_processed_mps = np.copy(self.u_mps)
         self.v_processed_mps = np.copy(self.v_mps)
-        self.u_processed_mps[self.valid_data[0] == False] = np.nan
-        self.v_processed_mps[self.valid_data[0] == False] = np.nan
-        
+        self.u_processed_mps[np.logical_not(self.valid_data[0])] = np.nan
+        self.v_processed_mps[np.logical_not(self.valid_data[0])] = np.nan
+
         # Compute SNR range if SNR data is provided
-        if rssi_units_in == 'SNR':
+        if rssi_units_in == "SNR":
             self.compute_snr_rng()
 
     def populate_from_qrev_mat(self, transect):
-        """Populates the object using data from previously saved QRev Matlab file.
+        """Populates the object using data from previously saved QRev Matlab
+         file.
 
         Parameters
         ----------
@@ -398,105 +480,164 @@ class WaterData(object):
             if len(transect.boatVel.btVel.rawVel_mps.shape) > 1:
                 # Multiple ensembles with one cell
                 self.raw_vel_mps = np.moveaxis(transect.wVel.rawVel_mps, 1, 0)
-                self.raw_vel_mps = self.raw_vel_mps.reshape(self.raw_vel_mps.shape[0], 1, self.raw_vel_mps.shape[1])
+                self.raw_vel_mps = self.raw_vel_mps.reshape(
+                    (self.raw_vel_mps.shape[0], 1, self.raw_vel_mps.shape[1])
+                )
                 self.corr = np.moveaxis(transect.wVel.corr, 1, 0)
-                self.corr = self.corr.reshape(self.corr.shape[0], 1, self.corr.shape[1])
+                self.corr = self.corr.reshape(
+                    (self.corr.shape[0], 1, self.corr.shape[1])
+                )
                 self.rssi = np.moveaxis(transect.wVel.rssi, 1, 0)
-                self.rssi = self.rssi.reshape(self.rssi.shape[0], 1, self.rssi.shape[1])
+                self.rssi = self.rssi.reshape(
+                    (self.rssi.shape[0], 1, self.rssi.shape[1])
+                )
                 self.valid_data = np.moveaxis(transect.wVel.validData, 1, 0)
-                self.valid_data = self.valid_data.reshape(self.valid_data.shape[0], 1, self.valid_data.shape[1])
+                self.valid_data = self.valid_data.reshape(
+                    (self.valid_data.shape[0], 1, self.valid_data.shape[1])
+                )
                 self.u_earth_no_ref_mps = transect.wVel.uEarthNoRef_mps
-                self.u_earth_no_ref_mps = self.u_earth_no_ref_mps.reshape(1, self.u_earth_no_ref_mps.shape[0])
+                self.u_earth_no_ref_mps = self.u_earth_no_ref_mps.reshape(
+                    (1, self.u_earth_no_ref_mps.shape[0])
+                )
                 self.v_earth_no_ref_mps = transect.wVel.vEarthNoRef_mps
-                self.v_earth_no_ref_mps = self.v_earth_no_ref_mps.reshape(1, self.v_earth_no_ref_mps.shape[0])
+                self.v_earth_no_ref_mps = self.v_earth_no_ref_mps.reshape(
+                    (1, self.v_earth_no_ref_mps.shape[0])
+                )
                 self.u_mps = transect.wVel.u_mps
-                self.u_mps = self.u_mps.reshape(1, self.u_mps.shape[0])
+                self.u_mps = self.u_mps.reshape((1, self.u_mps.shape[0]))
                 self.v_mps = transect.wVel.v_mps
-                self.v_mps = self.v_mps.reshape(1, self.v_mps.shape[0])
+                self.v_mps = self.v_mps.reshape((1, self.v_mps.shape[0]))
                 self.u_processed_mps = transect.wVel.uProcessed_mps
-                self.u_processed_mps = self.u_processed_mps.reshape(1, self.u_processed_mps.shape[0])
+                self.u_processed_mps = self.u_processed_mps.reshape(
+                    (1, self.u_processed_mps.shape[0])
+                )
                 self.v_processed_mps = transect.wVel.vProcessed_mps
-                self.v_processed_mps = self.v_processed_mps.reshape(1, self.v_processed_mps.shape[0])
+                self.v_processed_mps = self.v_processed_mps.reshape(
+                    1, self.v_processed_mps.shape[0]
+                )
                 self.w_mps = transect.wVel.w_mps
-                self.w_mps = self.w_mps.reshape(1, self.w_mps.shape[0])
+                self.w_mps = self.w_mps.reshape((1, self.w_mps.shape[0]))
                 self.d_mps = transect.wVel.d_mps
-                self.d_mps = self.d_mps.reshape(1, self.d_mps.shape[0])
-                self.snr_rng = transect.wVel.snrRng
-                self.snr_rng = self.snr_rng.reshape(1, self.snr_rng.shape[0])
+                self.d_mps = self.d_mps.reshape((1, self.d_mps.shape[0]))
+                # self.snr_rng = transect.wVel.snrRng
+                # self.snr_rng = self.snr_rng.reshape(1, self.snr_rng.shape[0])
                 self.cells_above_sl = transect.wVel.cellsAboveSL.astype(bool)
-                self.cells_above_sl = self.cells_above_sl.reshape(1, self.cells_above_sl.shape[0])
+                self.cells_above_sl = self.cells_above_sl.reshape(
+                    1, self.cells_above_sl.shape[0]
+                )
                 self.cells_above_sl_bt = transect.wVel.cellsAboveSLbt.astype(bool)
-                self.cells_above_sl_bt = self.cells_above_sl_bt.reshape(1, self.cells_above_sl_bt.shape[0])
+                self.cells_above_sl_bt = self.cells_above_sl_bt.reshape(
+                    1, self.cells_above_sl_bt.shape[0]
+                )
                 self.sl_lag_effect_m = np.array([transect.wVel.slLagEffect_m])
                 # Ping type
-                if hasattr(transect.wVel, 'ping_type'):
+                if hasattr(transect.wVel, "ping_type"):
                     if type(transect.wVel.ping_type) == str:
-                        self.ping_type = np.tile(transect.wVel.ping_type, self.d_mps.shape)
+                        self.ping_type = np.tile(
+                            transect.wVel.ping_type, self.d_mps.shape
+                        )
                     else:
                         self.ping_type = transect.wVel.ping_type[np.newaxis, :]
+
+                    self.ping_type = np.char.strip(self.ping_type)
                 else:
-                    self.ping_type = np.tile('U', self.d_mps.shape)
+                    self.ping_type = np.tile("U", self.d_mps.shape)
             else:
                 # One ensemble with multiple cells
                 self.raw_vel_mps = np.moveaxis(transect.wVel.rawVel_mps, 1, 0)
-                self.raw_vel_mps = self.raw_vel_mps.reshape(self.raw_vel_mps.shape[0], self.raw_vel_mps.shape[1], 1)
+                self.raw_vel_mps = self.raw_vel_mps.reshape(
+                    (self.raw_vel_mps.shape[0], self.raw_vel_mps.shape[1], 1)
+                )
                 self.corr = np.moveaxis(transect.wVel.corr, 1, 0)
-                self.corr = self.corr.reshape(self.corr.shape[0], self.corr.shape[1], 1)
+                self.corr = self.corr.reshape(
+                    (self.corr.shape[0], self.corr.shape[1], 1)
+                )
                 self.rssi = np.moveaxis(transect.wVel.rssi, 1, 0)
-                self.rssi = self.rssi.reshape(self.rssi.shape[0], self.rssi.shape[1], 1)
+                self.rssi = self.rssi.reshape(
+                    (self.rssi.shape[0], self.rssi.shape[1], 1)
+                )
                 self.valid_data = np.moveaxis(transect.wVel.validData, 1, 0)
-                self.valid_data = self.valid_data.reshape(self.valid_data.shape[0], self.valid_data.shape[1], 1)
+                self.valid_data = self.valid_data.reshape(
+                    (self.valid_data.shape[0], self.valid_data.shape[1], 1)
+                )
                 self.u_earth_no_ref_mps = transect.wVel.uEarthNoRef_mps
-                self.u_earth_no_ref_mps = self.u_earth_no_ref_mps.reshape(self.u_earth_no_ref_mps.shape[0], 1)
+                self.u_earth_no_ref_mps = self.u_earth_no_ref_mps.reshape(
+                    self.u_earth_no_ref_mps.shape[0], 1
+                )
                 self.v_earth_no_ref_mps = transect.wVel.vEarthNoRef_mps
-                self.v_earth_no_ref_mps = self.v_earth_no_ref_mps.reshape(self.v_earth_no_ref_mps.shape[0], 1)
+                self.v_earth_no_ref_mps = self.v_earth_no_ref_mps.reshape(
+                    self.v_earth_no_ref_mps.shape[0], 1
+                )
                 self.u_mps = transect.wVel.u_mps
                 self.u_mps = self.u_mps.reshape(self.u_mps.shape[0], 1)
                 self.v_mps = transect.wVel.v_mps
                 self.v_mps = self.v_mps.reshape(self.v_mps.shape[0], 1)
                 self.u_processed_mps = transect.wVel.uProcessed_mps
-                self.u_processed_mps = self.u_processed_mps.reshape(self.u_processed_mps.shape[0], 1)
+                self.u_processed_mps = self.u_processed_mps.reshape(
+                    self.u_processed_mps.shape[0], 1
+                )
                 self.v_processed_mps = transect.wVel.vProcessed_mps
-                self.v_processed_mps = self.v_processed_mps.reshape(self.v_processed_mps.shape[0], 1)
+                self.v_processed_mps = self.v_processed_mps.reshape(
+                    self.v_processed_mps.shape[0], 1
+                )
                 self.w_mps = transect.wVel.w_mps
                 self.w_mps = self.w_mps.reshape(self.w_mps.shape[0], 1)
                 self.d_mps = transect.wVel.d_mps
                 self.d_mps = self.d_mps.reshape(self.d_mps.shape[0], 1)
-                self.snr_rng = transect.wVel.snrRng
-                self.snr_rng = self.snr_rng.reshape(self.snr_rng.shape[0], 1)
+                # self.snr_rng = transect.wVel.snrRng
+                # self.snr_rng = self.snr_rng.reshape(self.snr_rng.shape[0], 1)
                 self.cells_above_sl = transect.wVel.cellsAboveSL.astype(bool)
-                self.cells_above_sl = self.cells_above_sl.reshape(self.cells_above_sl.shape[0], 1)
+                self.cells_above_sl = self.cells_above_sl.reshape(
+                    self.cells_above_sl.shape[0], 1
+                )
                 self.cells_above_sl_bt = transect.wVel.cellsAboveSLbt.astype(bool)
-                self.cells_above_sl_bt = self.cells_above_sl_bt.reshape(self.cells_above_sl_bt.shape[0], 1)
+                self.cells_above_sl_bt = self.cells_above_sl_bt.reshape(
+                    self.cells_above_sl_bt.shape[0], 1
+                )
                 self.sl_lag_effect_m = np.array([transect.wVel.slLagEffect_m])
                 # Ping type
-                if hasattr(transect.wVel, 'ping_type'):
+                if hasattr(transect.wVel, "ping_type"):
                     if type(transect.wVel.ping_type) == str:
-                        self.ping_type = np.tile(transect.wVel.ping_type, self.d_mps.shape)
+                        self.ping_type = np.tile(
+                            transect.wVel.ping_type, self.d_mps.shape
+                        )
                     else:
                         self.ping_type = transect.wVel.ping_type[:, np.newaxis]
+                    self.ping_type = np.char.strip(self.ping_type)
                 else:
-                    self.ping_type = np.tile('U', self.d_mps.shape)
+                    self.ping_type = np.tile("U", self.d_mps.shape)
 
         else:
             n_ensembles = transect.wVel.u_mps.shape[1]
             n_cells = transect.wVel.u_mps.shape[0]
-            if transect.wVel.rawVel_mps.shape[2] != n_ensembles or transect.wVel.rawVel_mps.shape[1] != n_cells:
+            if (
+                    transect.wVel.rawVel_mps.shape[2] != n_ensembles
+                    or transect.wVel.rawVel_mps.shape[1] != n_cells
+            ):
                 self.raw_vel_mps = np.moveaxis(transect.wVel.rawVel_mps, 2, 0)
             else:
                 self.raw_vel_mps = transect.wVel.rawVel_mps
 
-            if transect.wVel.corr.shape[2] != n_ensembles or transect.wVel.corr.shape[1] != n_cells:
+            if (
+                    transect.wVel.corr.shape[2] != n_ensembles
+                    or transect.wVel.corr.shape[1] != n_cells
+            ):
                 self.corr = np.moveaxis(transect.wVel.corr, 2, 0)
             else:
                 self.corr = transect.wVel.corr
 
-            if transect.wVel.rssi.shape[2] != n_ensembles or transect.wVel.rssi.shape[1] != n_cells:
+            if (
+                    transect.wVel.rssi.shape[2] != n_ensembles
+                    or transect.wVel.rssi.shape[1] != n_cells
+            ):
                 self.rssi = np.moveaxis(transect.wVel.rssi, 2, 0)
             else:
                 self.rssi = transect.wVel.rssi
 
-            if transect.wVel.validData.shape[2] != n_ensembles or transect.wVel.validData.shape[1] != n_cells:
+            if (
+                    transect.wVel.validData.shape[2] != n_ensembles
+                    or transect.wVel.validData.shape[1] != n_cells
+            ):
                 self.valid_data = np.moveaxis(transect.wVel.validData, 2, 0)
             else:
                 self.valid_data = transect.wVel.validData
@@ -508,26 +649,21 @@ class WaterData(object):
             self.v_processed_mps = transect.wVel.vProcessed_mps
             self.w_mps = transect.wVel.w_mps
             self.d_mps = transect.wVel.d_mps
-            self.snr_rng = transect.wVel.snrRng
+            # self.snr_rng = transect.wVel.snrRng
             self.cells_above_sl = transect.wVel.cellsAboveSL.astype(bool)
             self.cells_above_sl_bt = transect.wVel.cellsAboveSLbt.astype(bool)
             self.sl_lag_effect_m = transect.wVel.slLagEffect_m
             # Ping type
-            if hasattr(transect.wVel, 'ping_type'):
+            if hasattr(transect.wVel, "ping_type"):
                 if type(transect.wVel.ping_type) == str:
                     self.ping_type = np.tile(transect.wVel.ping_type, self.d_mps.shape)
                 else:
                     self.ping_type = transect.wVel.ping_type
+                self.ping_type = np.char.strip(self.ping_type)
             else:
-                self.ping_type = np.tile('U', self.d_mps.shape)
+                self.ping_type = np.tile("U", self.d_mps.shape)
 
         self.valid_data = self.valid_data.astype(bool)
-        # Fix for moving-bed transects that did not have 3D array indices adjusted properly when saved
-        # if self.valid_data.shape[0] == self.u_processed_mps.shape[1]:
-        #     self.valid_data = np.moveaxis(self.valid_data, 0, 2)
-        #     self.raw_vel_mps = np.moveaxis(self.raw_vel_mps, 0, 2)
-        #     self.corr = np.moveaxis(self.corr, 0, 2)
-        #     self.rssi = np.moveaxis(self.rssi, 0, 2)
         self.frequency = transect.wVel.frequency
         self.orig_coord_sys = transect.wVel.origCoordSys
         self.orig_nav_ref = transect.wVel.origNavRef
@@ -547,7 +683,7 @@ class WaterData(object):
         self.w_filter = transect.wVel.wFilter
         self.w_filter_thresholds = self.struct_to_dict(transect.wVel.wFilterThreshold)
         self.excluded_dist_m = transect.wVel.excludedDist
-        if hasattr(transect.wVel, 'orig_excludedDist'):
+        if hasattr(transect.wVel, "orig_excludedDist"):
             self.orig_excluded_dist_m = transect.wVel.orig_excludedDist
         else:
             self.orig_excluded_dist_m = transect.wVel.excludedDist
@@ -566,10 +702,16 @@ class WaterData(object):
         self.sl_cutoff_type = transect.wVel.slCutoffType
 
         # Use measurement for filter
-        if hasattr(transect.wVel, 'use_measurement_thresholds'):
-            self.use_measurement_thresholds = self.struct_to_dict(transect.wVel.use_measurement_thresholds)
-            self.d_meas_thresholds = self.struct_to_dict(transect.wVel.d_meas_thresholds)
-            self.w_meas_thresholds = self.struct_to_dict(transect.wVel.w_meas_thresholds)
+        if hasattr(transect.wVel, "use_measurement_thresholds"):
+            self.use_measurement_thresholds = self.struct_to_dict(
+                transect.wVel.use_measurement_thresholds
+            )
+            self.d_meas_thresholds = self.struct_to_dict(
+                transect.wVel.d_meas_thresholds
+            )
+            self.w_meas_thresholds = self.struct_to_dict(
+                transect.wVel.w_meas_thresholds
+            )
         else:
             self.use_measurement_thresholds = False
             self.d_meas_thresholds = {}
@@ -614,16 +756,23 @@ class WaterData(object):
         adcp: InstrumentData
             Object of instrument data
         """
+
         if type(self.orig_coord_sys) is list or type(self.orig_coord_sys) is np.ndarray:
             o_coord_sys = self.orig_coord_sys[0].strip()
         else:
             o_coord_sys = self.orig_coord_sys.strip()
 
+        if self.snr_beam_velocities is None:
+            data = self.raw_vel_mps
+        else:
+            data = self.snr_beam_velocities
+            o_coord_sys = "Beam"
+
         orig_sys = None
         new_sys = None
 
         if o_coord_sys != new_coord_sys:
-            
+
             # Assign the transformation matrix and retrieve the sensor data
             t_matrix = copy.deepcopy(adcp.t_matrix.matrix)
             t_matrix_freq = copy.deepcopy(adcp.frequency_khz)
@@ -631,36 +780,36 @@ class WaterData(object):
             p = getattr(sensors.pitch_deg, sensors.pitch_deg.selected).data
             r = getattr(sensors.roll_deg, sensors.roll_deg.selected).data
             h = getattr(sensors.heading_deg, sensors.heading_deg.selected).data
-            
+
             # Modify the transformation matrix and heading, pitch
             # and roll values based on the original coordinate
             # system so that only the needed values ar used in
             # computing the new coordinate system.
-            if o_coord_sys.strip() == 'Beam':
+            if o_coord_sys.strip() == "Beam":
                 orig_sys = 1
-            elif o_coord_sys.strip() == 'Inst':
+            elif o_coord_sys.strip() == "Inst":
                 orig_sys = 2
-            elif o_coord_sys.strip() == 'Ship':
+            elif o_coord_sys.strip() == "Ship":
                 orig_sys = 3
                 p = np.zeros(h.shape)
                 r = np.zeros(h.shape)
-                t_matrix = np.eye(len(t_matrix))
-            elif o_coord_sys.strip() == 'Earth':
+            elif o_coord_sys.strip() == "Earth":
                 orig_sys = 4
 
             # Assign a value to the new coordinate system
-            if new_coord_sys.strip() == 'Beam':
+            if new_coord_sys.strip() == "Beam":
                 new_sys = 1
-            elif new_coord_sys.strip() == 'Inst':
+            elif new_coord_sys.strip() == "Inst":
                 new_sys = 2
-            elif new_coord_sys.strip() == 'Ship':
+            elif new_coord_sys.strip() == "Ship":
                 new_sys = 3
-            elif new_coord_sys.strip() == 'Earth':
+            elif new_coord_sys.strip() == "Earth":
                 new_sys = 4
-                
-            # Check to ensure the new coordinate system is a higher order than the original system
+
+            # Check to ensure the new coordinate system is a higher order than
+            # the original system
             if new_sys - orig_sys > 0:
-                
+
                 # Compute trig function for heaing, pitch and roll
                 ch = np.cos(np.deg2rad(h))
                 sh = np.sin(np.deg2rad(h))
@@ -670,73 +819,80 @@ class WaterData(object):
                 sr = np.sin(np.deg2rad(r))
 
                 n_ens = self.raw_vel_mps.shape[2]
-                
+
                 for ii in range(n_ens):
-                    
+
                     # Compute matrix for heading, pitch, and roll
-                    hpr_matrix = np.array([[((ch[ii] * cr[ii]) + (sh[ii]*sp[ii] * sr[ii])),
-                                            (sh[ii] * cp[ii]),
-                                            ((ch[ii] * sr[ii]) - sh[ii]*sp[ii] * cr[ii])],
-                                           [(-1 * sh[ii] * cr[ii]) + (ch[ii] * sp[ii] * sr[ii]),
-                                            ch[ii] * cp[ii],
-                                            (-1 * sh[ii] * sr[ii])-(ch[ii] * sp[ii] * cr[ii])],
-                                           [(-1.*cp[ii] * sr[ii]),
-                                            sp[ii],
-                                            cp[ii] * cr[ii]]])
-                    
+                    hpr_matrix = np.array(
+                        [
+                            [
+                                ((ch[ii] * cr[ii]) + (sh[ii] * sp[ii] * sr[ii])),
+                                (sh[ii] * cp[ii]),
+                                ((ch[ii] * sr[ii]) - sh[ii] * sp[ii] * cr[ii]),
+                            ],
+                            [
+                                (-1 * sh[ii] * cr[ii]) + (ch[ii] * sp[ii] * sr[ii]),
+                                ch[ii] * cp[ii],
+                                (-1 * sh[ii] * sr[ii]) - (ch[ii] * sp[ii] * cr[ii]),
+                            ],
+                            [(-1.0 * cp[ii] * sr[ii]), sp[ii], cp[ii] * cr[ii]],
+                        ]
+                    )
+
                     # Transform beam coordinates
-                    if o_coord_sys == 'Beam':
-                        
+                    if o_coord_sys == "Beam":
+
                         # Determine frequency index for transformation
                         if len(t_matrix.shape) > 2:
                             idx_freq = np.where(t_matrix_freq == self.frequency[ii])
-                            t_mult = np.copy(t_matrix[:, :, idx_freq])
+                            t_mult = np.copy(np.squeeze(t_matrix[:, :, idx_freq[0][0]]))
                         else:
                             t_mult = np.copy(t_matrix)
-                            
+
                         # Get velocity data
-                        vel_beams = np.copy(self.raw_vel_mps[:, :, ii])
-                        
+                        vel_beams = np.copy(data[:, :, ii])
+
                         # Apply transformation matrix for 4 beam solutions
                         temp_t = t_mult.dot(vel_beams)
-                        
+
                         # Apply hpr_matrix
                         temp_thpr = hpr_matrix.dot(temp_t[:3])
                         temp_thpr = np.vstack([temp_thpr, temp_t[3]])
-                        
+
                         # Check for invalid beams
                         invalid_idx = np.isnan(vel_beams)
-                        
+
                         # Identify rows requiring 3 beam solutions
                         n_invalid_col = np.sum(invalid_idx, axis=0)
                         col_idx = np.where(n_invalid_col == 1)[0]
-                        
+
                         # Compute 3 beam solution, if necessary
                         if len(col_idx) > 0:
                             for i3 in range(len(col_idx)):
-                                
                                 # Id invalid beam
                                 vel_3_beam = vel_beams[:, col_idx[i3]]
                                 idx_3_beam = np.where(np.isnan(vel_3_beam))[0]
-                        
+
                                 # 3 beam solution for non-RiverRay
                                 vel_3_beam_zero = vel_3_beam
                                 vel_3_beam_zero[np.isnan(vel_3_beam)] = 0
                                 vel_error = t_mult[3, :].dot(vel_3_beam_zero)
-                                vel_3_beam[idx_3_beam] = -1 * vel_error / t_mult[3, idx_3_beam]
+                                vel_3_beam[idx_3_beam] = (
+                                        -1 * vel_error / t_mult[3, idx_3_beam]
+                                )
                                 temp_t = t_mult.dot(vel_3_beam)
-                                
+
                                 # Apply transformation matrix for 3
                                 # beam solutions
                                 temp_thpr[0:3, col_idx[i3]] = hpr_matrix.dot(temp_t[:3])
                                 temp_thpr[3, col_idx[i3]] = np.nan
-                            
+
                     else:
                         # Get velocity data
                         vel_raw = np.copy(np.squeeze(self.raw_vel_mps[:, :, ii]))
                         temp_thpr = np.array(hpr_matrix).dot(vel_raw[:3, :])
                         temp_thpr = np.vstack([temp_thpr, vel_raw[3, :]])
-                        
+
                     # Update object
                     temp_thpr = temp_thpr.T
                     self.u_mps[:, ii] = temp_thpr[:, 0]
@@ -744,63 +900,157 @@ class WaterData(object):
                     self.w_mps[:, ii] = temp_thpr[:, 2]
                     self.d_mps[:, ii] = temp_thpr[:, 3]
 
-                # Because of padded arrays with zeros and RR has a variable number of bins,
-                # the raw data may be padded with zeros.  The next 4 statements changes
-                # those to nan
-                self.u_mps[self.u_mps == 0] = np.nan
-                self.v_mps[self.v_mps == 0] = np.nan
-                self.w_mps[self.w_mps == 0] = np.nan
-                self.d_mps[self.d_mps == 0] = np.nan
-                
+                # Because of padded arrays with zeros and RR has a variable
+                # number of bins, the raw data may be padded with zeros.  The next 4
+                # statements changes those to nan
+                find_padded = (
+                        np.abs(self.u_mps)
+                        + np.abs(self.v_mps)
+                        + np.abs(self.w_mps)
+                        + np.abs(self.d_mps)
+                )
+                self.u_mps[find_padded == 0] = np.nan
+                self.v_mps[find_padded == 0] = np.nan
+                self.w_mps[find_padded == 0] = np.nan
+                self.d_mps[find_padded == 0] = np.nan
+
                 # Assign processed object properties
                 self.u_processed_mps = np.copy(self.u_mps)
                 self.v_processed_mps = np.copy(self.v_mps)
-                
+
                 # Assign coordinate system and reference properties
                 self.coord_sys = new_coord_sys
                 self.nav_ref = self.orig_nav_ref
-                    
+
             else:
-                
+
                 # Reset velocity properties to raw values
                 self.u_mps = np.copy(self.raw_vel_mps[0])
                 self.v_mps = np.copy(self.raw_vel_mps[1])
                 self.w_mps = np.copy(self.raw_vel_mps[2])
                 self.d_mps = np.copy(self.raw_vel_mps[3])
-                
-                if adcp.manufacturer == 'TRDI':
-                    self.u_mps[self.u_mps == 0] = np.nan
-                    self.v_mps[self.v_mps == 0] = np.nan
-                    self.w_mps[self.w_mps == 0] = np.nan
-                    self.d_mps[self.d_mps == 0] = np.nan
-                    
+
+                if adcp.manufacturer == "TRDI":
+                    find_padded = (
+                            np.abs(self.u_mps)
+                            + np.abs(self.v_mps)
+                            + np.abs(self.w_mps)
+                            + np.abs(self.d_mps)
+                    )
+                    self.u_mps[find_padded == 0] = np.nan
+                    self.v_mps[find_padded == 0] = np.nan
+                    self.w_mps[find_padded == 0] = np.nan
+                    self.d_mps[find_padded == 0] = np.nan
+
                 # Assign processed properties
                 self.u_processed_mps = np.copy(self.u_mps)
                 self.v_processed_mps = np.copy(self.v_mps)
-                
+
         else:
-            
+
             # Reset velocity properties to raw values
             self.u_mps = np.copy(self.raw_vel_mps[0])
             self.v_mps = np.copy(self.raw_vel_mps[1])
             self.w_mps = np.copy(self.raw_vel_mps[2])
             self.d_mps = np.copy(self.raw_vel_mps[3])
-            
-            if adcp.manufacturer == 'TRDI':
-                self.u_mps[self.u_mps == 0] = np.nan
-                self.v_mps[self.v_mps == 0] = np.nan
-                self.w_mps[self.w_mps == 0] = np.nan
-                self.d_mps[self.d_mps == 0] = np.nan
-                
+
+            if adcp.manufacturer == "TRDI":
+                find_padded = (
+                        np.abs(self.u_mps)
+                        + np.abs(self.v_mps)
+                        + np.abs(self.w_mps)
+                        + np.abs(self.d_mps)
+                )
+                self.u_mps[find_padded == 0] = np.nan
+                self.v_mps[find_padded == 0] = np.nan
+                self.w_mps[find_padded == 0] = np.nan
+                self.d_mps[find_padded == 0] = np.nan
+
             # Assign processed properties
             self.u_processed_mps = np.copy(self.u_mps)
             self.v_processed_mps = np.copy(self.v_mps)
-            
-        if new_coord_sys == 'Earth':
+
+        if new_coord_sys == "Earth":
             self.u_earth_no_ref_mps = np.copy(self.u_mps)
             self.v_earth_no_ref_mps = np.copy(self.v_mps)
-                
-    def set_nav_reference(self, boat_vel):           
+
+    def earth_to_beam(self, sensors, adcp):
+        """Converts earth coordinates to beam coordinates.
+
+        Parameters
+        ----------
+        sensors: Sensors
+            Object of class Sensors
+        adcp: InstrumentData
+            Object of class InstrumentData
+        """
+
+        # Create matrix to store results
+        vel_beam = np.tile(np.nan, self.raw_vel_mps.shape)
+
+        # Assign the transformation matrix retrieve the sensor data
+        t_matrix = copy.deepcopy(adcp.t_matrix.matrix)
+        t_matrix_freq = copy.deepcopy(adcp.frequency_khz)
+
+        # Retrieve the sensor data
+        p = getattr(sensors.pitch_deg, sensors.pitch_deg.selected).data
+        r = getattr(sensors.roll_deg, sensors.roll_deg.selected).data
+        h = getattr(sensors.heading_deg, sensors.heading_deg.selected).data
+
+        # Compute trig function for heading, pitch and roll
+        ch = np.cos(np.deg2rad(h))
+        sh = np.sin(np.deg2rad(h))
+        cp = np.cos(np.deg2rad(p))
+        sp = np.sin(np.deg2rad(p))
+        cr = np.cos(np.deg2rad(r))
+        sr = np.sin(np.deg2rad(r))
+
+        # Process each ensemble
+        n_ens = self.raw_vel_mps.shape[2]
+        for ii in range(n_ens):
+
+            # Compute matrix for heading, pitch, and roll
+            hpr_matrix = np.array(
+                [
+                    [
+                        ((ch[ii] * cr[ii]) + (sh[ii] * sp[ii] * sr[ii])),
+                        (sh[ii] * cp[ii]),
+                        ((ch[ii] * sr[ii]) - sh[ii] * sp[ii] * cr[ii]),
+                    ],
+                    [
+                        (-1 * sh[ii] * cr[ii]) + (ch[ii] * sp[ii] * sr[ii]),
+                        ch[ii] * cp[ii],
+                        (-1 * sh[ii] * sr[ii]) - (ch[ii] * sp[ii] * cr[ii]),
+                    ],
+                    [(-1.0 * cp[ii] * sr[ii]), sp[ii], cp[ii] * cr[ii]],
+                ]
+            )
+
+            # Determine frequency index for transformation
+            if len(t_matrix.shape) > 2:
+                idx_freq = np.where(t_matrix_freq == self.frequency[ii])
+                t_mult = np.copy(np.squeeze(t_matrix[:, :, idx_freq[0][0]]))
+            else:
+                t_mult = np.copy(t_matrix)
+
+            # Construct earth velocity matrix for ensemble
+            vel_enu = np.vstack(
+                [
+                    self.u_earth_no_ref_mps[:, ii],
+                    self.v_earth_no_ref_mps[:, ii],
+                    self.w_mps[:, ii],
+                    self.d_mps[:, ii],
+                ]
+            )
+
+            # Compute beam velocities
+            vel_xyz = np.copy(vel_enu)
+            vel_xyz[0:3, :] = np.matmul(np.linalg.inv(hpr_matrix), vel_enu[:3])
+            vel_beam[:, :, ii] = np.matmul(np.linalg.inv(t_mult), vel_xyz)
+
+        return vel_beam
+
+    def set_nav_reference(self, boat_vel):
         """This function sets the navigation reference.
 
         The current reference is first removed from the velocity and then the
@@ -811,7 +1061,7 @@ class WaterData(object):
         boat_vel: BoatStructure
             Object of BoatStructure
         """
-        
+
         # Apply selected navigation reference
         boat_select = getattr(boat_vel, boat_vel.selected)
         if boat_select is not None:
@@ -819,29 +1069,33 @@ class WaterData(object):
             self.v_mps = np.add(self.v_earth_no_ref_mps, boat_select.v_processed_mps)
             self.nav_ref = boat_select.nav_ref
         else:
-            self.u_mps = repmat([np.nan],
-                                self.u_earth_no_ref_mps.shape[0],
-                                self.u_earth_no_ref_mps.shape[1])
-            self.v_mps = repmat([np.nan],
-                                self.v_earth_no_ref_mps.shape[0],
-                                self.v_earth_no_ref_mps.shape[1])
-            if boat_vel.selected == 'bt_vel':
-                self.nav_ref = 'BT'
-            elif boat_vel.selected == 'gga_vel':
-                self.nav_ref = 'GGA'
-            elif boat_vel.selected == 'vtg_vel':
-                self.nav_ref = 'VTG'
-        
+            self.u_mps = repmat(
+                [np.nan],
+                self.u_earth_no_ref_mps.shape[0],
+                self.u_earth_no_ref_mps.shape[1],
+            )
+            self.v_mps = repmat(
+                [np.nan],
+                self.v_earth_no_ref_mps.shape[0],
+                self.v_earth_no_ref_mps.shape[1],
+            )
+            if boat_vel.selected == "bt_vel":
+                self.nav_ref = "BT"
+            elif boat_vel.selected == "gga_vel":
+                self.nav_ref = "GGA"
+            elif boat_vel.selected == "vtg_vel":
+                self.nav_ref = "VTG"
+
         valid_data2 = np.copy(self.cells_above_sl)
         valid_data2[np.isnan(self.u_mps)] = False
         self.valid_data[1] = valid_data2
-        
+
         # Duplicate original to other filters that have yet to be applied
         self.valid_data[2:] = np.tile(self.valid_data[1], [7, 1, 1])
-        
+
         # Combine all filter data and update processed properties
         self.all_valid_data()
-        
+
     def change_heading(self, boat_vel, heading_chng):
         """Adjusts the velocity vectors for a change in heading due change in
         magnetic variation or heading offset.
@@ -862,11 +1116,13 @@ class WaterData(object):
 
         # Reprocess water data to get navigation reference corrected velocities
         self.set_nav_reference(boat_vel)
-        
+
     def change_heading_source(self, boat_vel, heading):
-        """Applies changes to water velocity when the heading source is changed.
+        """Applies changes to water velocity when the heading source is
+        changed.
 
-        Typically called when the heading source is changed between external and internal.
+        Typically called when the heading source is changed between external
+        and internal.
 
         Parameters
         ----------
@@ -878,14 +1134,15 @@ class WaterData(object):
         u_nr = self.u_earth_no_ref_mps
         v_nr = self.v_earth_no_ref_mps
         direction, mag = cart2pol(u_nr, v_nr)
-        u_nr_rotated, v_nr_rotated = pol2cart(direction
-                                              - np.deg2rad(repmat(heading, len(mag), 1)), mag)
+        u_nr_rotated, v_nr_rotated = pol2cart(
+            direction - np.deg2rad(repmat(heading, len(mag), 1)), mag
+        )
         self.u_earth_no_ref_mps = u_nr_rotated
         self.v_earth_no_ref_mps = v_nr_rotated
 
         self.set_nav_reference(boat_vel)
-            
-    def apply_interpolation(self, transect, ens_interp='None', cells_interp='None'):
+
+    def apply_interpolation(self, transect, ens_interp="None", cells_interp="None"):
         """Coordinates the application of water velocity interpolation.
 
         Parameters
@@ -902,59 +1159,74 @@ class WaterData(object):
         self.v_processed_mps = np.tile([np.nan], self.v_mps.shape)
         self.u_processed_mps[self.valid_data[0]] = self.u_mps[self.valid_data[0]]
         self.v_processed_mps[self.valid_data[0]] = self.v_mps[self.valid_data[0]]
-        
+
         # Determine interpolation methods to apply
-        if ens_interp == 'None':
+        if ens_interp == "None":
             ens_interp = self.interpolate_ens
         else:
             self.interpolate_ens = ens_interp
 
-        if cells_interp == 'None':
+        if cells_interp == "None":
             cells_interp = self.interpolate_cells
         else:
             self.interpolate_cells = cells_interp
 
-        if ens_interp == 'abba' or cells_interp == 'abba':
-            self.interpolate_ens = 'abba'
-            self.interpolate_cells = 'abba'
+        if ens_interp == "abba" or cells_interp == "abba":
+            self.interpolate_ens = "abba"
+            self.interpolate_cells = "abba"
             self.interpolate_abba(transect)
         else:
-            if ens_interp == 'None':
+            if ens_interp == "None":
                 # Sets invalid data to nan with no interpolation
                 self.interpolate_ens_none()
-            elif ens_interp == 'ExpandedT':
-                # Sets interpolate to None as the interpolation is done in class QComp
+            elif ens_interp == "ExpandedT":
+                # Sets interpolate to None as the interpolation is done in
+                # class QComp
                 self.interpolate_ens_next()
-            elif ens_interp == 'Hold9':
-                # Interpolates using SonTek's method of holding last valid for up to 9 samples
+            elif ens_interp == "Hold9":
+                # Interpolates using SonTek's method of holding last valid
+                # for up to 9 samples
                 self.interpolate_ens_hold_last_9()
-            elif ens_interp == 'Hold':
+            elif ens_interp == "Hold":
                 # Interpolates by holding last valid indefinitely
                 self.interpolate_ens_hold_last()
-            elif ens_interp == 'Linear':
+            elif ens_interp == "Linear":
                 # Interpolates using linear interpolation
                 self.interpolate_ens_linear(transect)
-            elif ens_interp == 'TRDI':
+            elif ens_interp == "TRDI":
                 # TRDI is applied in discharge
                 self.interpolate_ens_none()
                 self.interpolate_ens = ens_interp
 
             # Apply specified cell interpolation method
-            if cells_interp == 'None':
+            if cells_interp == "None":
                 # Sets invalid data to nan with no interpolation
                 self.interpolate_cells_none()
-            elif cells_interp == 'TRDI':
+            elif cells_interp == "TRDI":
                 # Use TRDI method to interpolate invalid interior cells
                 self.interpolate_cells_trdi(transect)
-            elif cells_interp == 'Linear':
+            elif cells_interp == "Linear":
                 # Uses linear interpolation to interpolate velocity for all
                 # invalid bins including those in invalid ensembles
                 # up to 9 samples
                 self.interpolate_cells_linear(transect)
-        
-    def apply_filter(self, transect, beam=None, difference=None, difference_threshold=None, vertical=None,
-                     vertical_threshold=None, other=None, excluded=None, snr=None, wt_depth=None):
-        """Coordinates application of specified filters and subsequent interpolation.
+
+    def apply_filter(
+            self,
+            transect,
+            beam=None,
+            difference=None,
+            difference_threshold=None,
+            vertical=None,
+            vertical_threshold=None,
+            other=None,
+            excluded=None,
+            snr=None,
+            wt_depth=None,
+    ):
+        """Coordinates application of specified filters and subsequent
+        interpolation.
+
         Parameters
         ----------
         transect: TransectData
@@ -980,16 +1252,36 @@ class WaterData(object):
         """
 
         # Determine filters to apply
-        if len({beam, difference, difference_threshold, vertical, vertical_threshold, other, excluded, snr,
-                wt_depth}) > 1:
-
+        if (
+                len(
+                    {
+                        beam,
+                        difference,
+                        difference_threshold,
+                        vertical,
+                        vertical_threshold,
+                        other,
+                        excluded,
+                        snr,
+                        wt_depth,
+                    }
+                )
+                > 1
+        ):
+
+            # Because the snr filter may apply 3-beam solutions the result
+            # could affect other filters, thus it should be run first
+            if snr is not None:
+                self.filter_snr(transect=transect, setting=snr)
             if difference is not None:
-                if difference == 'Manual':
-                    self.filter_diff_vel(setting=difference, threshold=difference_threshold)
+                if difference == "Manual":
+                    self.filter_diff_vel(
+                        setting=difference, threshold=difference_threshold
+                    )
                 else:
                     self.filter_diff_vel(setting=difference)
             if vertical is not None:
-                if vertical == 'Manual':
+                if vertical == "Manual":
                     self.filter_vert_vel(setting=vertical, threshold=vertical_threshold)
                 else:
                     self.filter_vert_vel(setting=vertical)
@@ -997,23 +1289,22 @@ class WaterData(object):
                 self.filter_smooth(transect=transect, setting=other)
             if excluded is not None:
                 self.filter_excluded(transect=transect, setting=excluded)
-            if snr is not None:
-                self.filter_snr(setting=snr)
             if wt_depth is not None:
                 self.filter_wt_depth(transect=transect, setting=wt_depth)
             if beam is not None:
                 self.filter_beam(setting=beam, transect=transect)
         else:
-            self.filter_diff_vel(setting=self.d_filter, threshold=self.d_filter_thresholds)
-            self.filter_vert_vel(setting=self.w_filter, threshold=self.w_filter_thresholds)
+            self.filter_snr(transect=transect, setting=self.snr_filter)
+            self.filter_diff_vel(
+                setting=self.d_filter, threshold=self.d_filter_thresholds
+            )
+            self.filter_vert_vel(
+                setting=self.w_filter, threshold=self.w_filter_thresholds
+            )
             self.filter_smooth(transect=transect, setting=self.smooth_filter)
             self.filter_excluded(transect=transect, setting=self.excluded_dist_m)
-            self.filter_snr(setting=self.snr_filter)
             self.filter_beam(setting=self.beam_filter, transect=transect)
 
-        # After filters have been applied, interpolate to estimate values for invalid data.
-        # self.apply_interpolation(transect=transect)
-        
     def sos_correction(self, ratio):
         """Corrects water velocities for a change in speed of sound.
 
@@ -1031,7 +1322,8 @@ class WaterData(object):
         self.v_earth_no_ref_mps = self.v_earth_no_ref_mps * ratio
 
     def adjust_side_lobe(self, transect):
-        """Adjust the side lobe cutoff for vertical beam and interpolated depths.
+        """Adjust the side lobe cutoff for vertical beam and interpolated
+        depths.
 
         Parameters
         ----------
@@ -1042,21 +1334,28 @@ class WaterData(object):
         selected = transect.depths.selected
         depth_selected = getattr(transect.depths, transect.depths.selected)
         cells_above_slbt = np.copy(self.cells_above_sl_bt)
-        
+
         # Compute cutoff for vertical beam depths
-        if selected == 'vb_depths':
-            sl_cutoff_vb = (depth_selected.depth_processed_m - depth_selected.draft_use_m) \
-                 * np.cos(np.deg2rad(transect.adcp.beam_angle_deg)) \
-                - self.sl_lag_effect_m + depth_selected.draft_use_m
-            cells_above_slvb = np.round(depth_selected.depth_cell_depth_m, 2) < np.round(sl_cutoff_vb, 2)
-            idx = np.where(transect.depths.bt_depths.valid_data == False)
+        if selected == "vb_depths":
+            sl_cutoff_vb = (
+                    (depth_selected.depth_processed_m - depth_selected.draft_use_m)
+                    * np.cos(np.deg2rad(transect.adcp.beam_angle_deg))
+                    - self.sl_lag_effect_m
+                    + depth_selected.draft_use_m
+            )
+            cells_above_slvb = np.round(
+                depth_selected.depth_cell_depth_m, 2
+            ) < np.round(sl_cutoff_vb, 2)
+            idx = np.where(np.logical_not(transect.depths.bt_depths.valid_data))
             cells_above_slbt[:, idx] = cells_above_slvb[:, idx]
             cells_above_sl = np.logical_and(cells_above_slbt, cells_above_slvb)
         else:
             cells_above_sl = cells_above_slbt
 
         # Compute cutoff from interpolated depths
-        n_valid_beams = np.nansum(depth_selected.valid_beams, 0)
+        valid_beams = depth_selected.depth_beams_m > 0
+        n_valid_beams = np.nansum(valid_beams, 0)
+        # n_valid_beams = np.nansum(depth_selected.valid_beams, 0)
 
         # Find ensembles with no valid beam depths
         idx = np.where(n_valid_beams == 0)[0]
@@ -1067,62 +1366,79 @@ class WaterData(object):
                 sl_lag_effect_m = self.sl_lag_effect_m[idx]
             else:
                 sl_lag_effect_m = self.sl_lag_effect_m
-                
-            sl_cutoff_int = (depth_selected.depth_processed_m[idx] - depth_selected.draft_use_m) \
-                * np.cos(np.deg2rad(transect.adcp.beam_angle_deg)) - sl_lag_effect_m + \
-                depth_selected.draft_use_m
+
+            sl_cutoff_int = (
+                    (depth_selected.depth_processed_m[idx] - depth_selected.draft_use_m)
+                    * np.cos(np.deg2rad(transect.adcp.beam_angle_deg))
+                    - sl_lag_effect_m
+                    + depth_selected.draft_use_m
+            )
             for i in range(len(idx)):
-                cells_above_sl[:, idx[i]] = np.less(depth_selected.depth_cell_depth_m[:, idx[i]], sl_cutoff_int[i])
-            
-        # Find ensembles with at least 1 invalid beam depth
+                cells_above_sl[:, idx[i]] = np.less(
+                    depth_selected.depth_cell_depth_m[:, idx[i]], sl_cutoff_int[i]
+                )
 
+        # Find ensembles with at least 1 invalid beam depth
         idx = np.where(np.logical_and(n_valid_beams < 4, n_valid_beams > 0))[0]
         if len(idx) > 0:
             if len(self.sl_lag_effect_m) > 1:
                 sl_lag_effect_m = self.sl_lag_effect_m[idx]
             else:
                 sl_lag_effect_m = self.sl_lag_effect_m
-                
-            sl_cutoff_int = (depth_selected.depth_processed_m[idx] - depth_selected.draft_use_m)\
-                * np.cos(np.deg2rad(transect.adcp.beam_angle_deg)) \
-                - sl_lag_effect_m + depth_selected.draft_use_m
+
+            sl_cutoff_int = (
+                    (depth_selected.depth_processed_m[idx] - depth_selected.draft_use_m)
+                    * np.cos(np.deg2rad(transect.adcp.beam_angle_deg))
+                    - sl_lag_effect_m
+                    + depth_selected.draft_use_m
+            )
             cells_above_sl_int = np.tile(True, cells_above_sl.shape)
 
             for i in range(len(idx)):
-                cells_above_sl_int[:, idx[i]] = np.less(depth_selected.depth_cell_depth_m[:, idx[i]], sl_cutoff_int[i])
-            
+                cells_above_sl_int[:, idx[i]] = np.less(
+                    depth_selected.depth_cell_depth_m[:, idx[i]], sl_cutoff_int[i]
+                )
+
             cells_above_sl[cells_above_sl_int == 0] = 0
-        
+
         self.cells_above_sl = np.copy(cells_above_sl)
         valid_vel = np.logical_not(np.isnan(self.u_mps))
         self.valid_data[1, :, :] = self.cells_above_sl * valid_vel
         self.all_valid_data()
         self.compute_snr_rng()
         self.apply_filter(transect)
-        # self.apply_interpolation(transect)
 
     def all_valid_data(self):
-        """Combines the results of all filters to determine a final set of valid data"""
+        """Combines the results of all filters to determine a final set of
+        valid data"""
 
         n_filters = len(self.valid_data[1:, 0, 0])
-        sum_filters = np.nansum(self.valid_data[1:, :, :], 0) / n_filters
+
+        # Since invalid SNR are replaced with 3-beam solutions
+        # set these values to true as they will not need interpolation
+        valid_data = np.copy(self.valid_data)
+        if self.snr_3beam_comp:
+            valid_data[7, :, :] = True
+
+        sum_filters = np.nansum(valid_data[1:, :, :], 0) / n_filters
         valid = np.tile([True], self.cells_above_sl.shape)
         valid[sum_filters < 1] = False
         self.valid_data[0] = valid
-        
+
     def filter_beam(self, setting, transect=None):
         """Applies beam filter to water velocity data.
 
-        The determination of invalid data depends on whether
-        3-beam or 4-beam solutions are acceptable.  This function can be applied by
+        The determination of invalid data depends on whether 3-beam or
+        4-beam solutions are acceptable.  This function can be applied by
         specifying 3 or 4 beam solutions and setting self.beam_filter to -1
-        which will trigger an automatic mode.  The automatic mode will find all 3 beam
-        solutions and them compare the velocity of the 3 beam solutions to nearest 4
-        beam solutions.  If the 3 beam solution is within 50% of the average of the
-        neighboring 4 beam solutions the data are deemed valid, if not they are marked
-        invalid.  Thus in automatic mode only those data from 3 beam solutions
-        that are sufficiently different from  the 4 beam solutions are marked invalid.
-        If the number of beams is specified manually, it is applied
+        which will trigger an automatic mode.  The automatic mode will find
+        all 3 beam solutions and them compare the velocity of the 3 beam
+        solutions to nearest 4 beam solutions.  If the 3 beam solution is
+        within 50% of the average of the neighboring 4 beam solutions the
+        data are deemed valid, if not they are marked invalid.  Thus in
+        automatic mode only those data from 3 beam solutions that are
+        sufficiently different from  the 4 beam solutions are marked
+        invalid. If the number of beams is specified manually, it is applied
         uniformly for the whole transect.
 
         Parameters
@@ -1132,23 +1448,29 @@ class WaterData(object):
         transect: TransectData
             Object of TransectData
         """
-        
+
         self.beam_filter = setting
-        
-        # In manual mode (3 or 4) determine number of raw invalid and number of 2 beam solutions
+
+        # In manual mode (3 or 4) determine number of raw invalid and number
+        # of 2 beam solutions
         if self.beam_filter > 0:
-            
+
             # Find invalid raw data
             valid_vel = np.array([self.cells_above_sl] * 4)
-            valid_vel[np.isnan(self.raw_vel_mps)] = 0
-            
+            if self.snr_beam_velocities is None:
+                valid_vel[np.isnan(self.raw_vel_mps)] = 0
+            else:
+                valid_vel[np.isnan(self.snr_beam_velocities)] = 0
             # Determine how many beams or transformed coordinates are valid
             valid_vel_sum = np.sum(valid_vel, 0)
             valid = copy.deepcopy(self.cells_above_sl)
-            
-            # Compare number of valid beams or velocity coordinates to filter value
-            valid[np.logical_and((valid_vel_sum < self.beam_filter), (valid_vel_sum > 2))] = False
-            
+
+            # Compare number of valid beams or velocity coordinates to
+            # filter value
+            valid[
+                np.logical_and((valid_vel_sum < self.beam_filter), (valid_vel_sum > 2))
+            ] = False
+
             # Save logical of valid data to object
             self.valid_data[5, :, :] = valid
 
@@ -1161,7 +1483,8 @@ class WaterData(object):
             self.automatic_beam_filter_abba_interpolation(transect)
 
     def automatic_beam_filter_abba_interpolation(self, transect):
-        """Applies abba interpolation to allow comparison of interpolated and 3-beam solutions.
+        """Applies abba interpolation to allow comparison of interpolated and
+        3-beam solutions.
 
         Parameters
         ----------
@@ -1169,12 +1492,14 @@ class WaterData(object):
             Object of TransectData
         """
 
-        # Create array indicating which cells do not have 4-beam solutions and all cells below side lobe are nan
+        # Create array indicating which cells do not have 4-beam solutions
+        # and all cells below side lobe are nan
         temp = copy.deepcopy(self)
         temp.filter_beam(4)
         valid_bool = temp.valid_data[5, :, :]
         valid = valid_bool.astype(float)
-        valid[temp.cells_above_sl == False] = np.nan
+        valid[np.logical_not(temp.cells_above_sl)] = 0
+        valid[np.logical_not(temp.valid_data[1, :, :])] = 0
 
         # Initialize processed velocity data variables
         temp.u_processed_mps = copy.deepcopy(temp.u_mps)
@@ -1196,18 +1521,31 @@ class WaterData(object):
             u = u[:, transect.in_transect_idx]
             v = v[:, transect.in_transect_idx]
 
-            u[np.logical_not(temp.valid_data[5, :, :])] = np.nan
-            v[np.logical_not(temp.valid_data[5, :, :])] = np.nan
-            interpolated_data = self.compute_abba_interpolation(wt_data=temp,
-                                                                data_list=[u, v],
-                                                                valid=temp.valid_data[5, :, :],
-                                                                transect=transect)
+            u[
+                np.logical_not(temp.valid_data[5, :, transect.in_transect_idx].T)
+            ] = np.nan
+            v[
+                np.logical_not(temp.valid_data[5, :, transect.in_transect_idx].T)
+            ] = np.nan
+            interpolated_data = self.compute_abba_interpolation(
+                wt_data=temp,
+                data_list=[u, v],
+                valid=valid,
+                transect=transect,
+            )
 
             if interpolated_data is not None:
-                # Compute interpolated to measured ratios and apply filter criteria
+                # Compute interpolated to measured ratios and apply filter
+                # criteria
                 for n in range(len(interpolated_data[0])):
-                    u_ratio = (temp.u_mps[interpolated_data[0][n][0]] / interpolated_data[0][n][1]) - 1
-                    v_ratio = (temp.v_mps[interpolated_data[1][n][0]] / interpolated_data[1][n][1]) - 1
+                    u_ratio = (
+                                      temp.u_mps[interpolated_data[0][n][0]]
+                                      / interpolated_data[0][n][1]
+                              ) - 1
+                    v_ratio = (
+                                      temp.v_mps[interpolated_data[1][n][0]]
+                                      / interpolated_data[1][n][1]
+                              ) - 1
                     if np.abs(u_ratio) < 0.5 and np.abs(v_ratio) < 0.5:
                         valid_bool[interpolated_data[0][n][0]] = True
                     else:
@@ -1228,18 +1566,19 @@ class WaterData(object):
         """Applies filter to difference velocity.
 
         Applies either manual or automatic filtering of the difference (error)
-        velocity.  The automatic mode is based on the following:  This filter is
-        based on the assumption that the water error velocity should follow a gaussian
-        distribution.  Therefore, 5 standard deviations should encompass all of the
-        valid data.  The standard deviation and limits (multiplier*std dev) are computed
-        in an iterative process until filtering out additional data does not change the
-        computed standard deviation.
+        velocity.  The automatic mode is based on the following:
+        This filter is based on the assumption that the water error velocity
+        should follow a gaussian distribution.  Therefore, 5 standard
+        deviations should encompass all of the valid data.
+        The standard deviation and limits (multiplier*std dev) are computed
+        in an iterative process until filtering out additional data does not
+        change the computed standard deviation.
 
         Parameters
         ----------
         setting: str
             Filter setting (Auto, Off, Manual)
-        threshold: float
+        threshold: float, dict
             Threshold value for Manual setting.
         """
 
@@ -1251,41 +1590,49 @@ class WaterData(object):
         # Get difference data from object
         d_vel = copy.deepcopy(self.d_mps)
 
-        # NOTE: Versions prior to 1.01 did not apply this step to remove data below the side lobe cutoff
+        # NOTE: Versions prior to 1.01 did not apply this step to remove data
+        # below the side lobe cutoff
         d_vel[np.logical_not(self.cells_above_sl)] = np.nan
 
-        d_vel_min_ref = None
-        d_vel_max_ref = None
-
         bad_idx_rows = np.array([]).astype(int)
         bad_idx_cols = np.array([]).astype(int)
 
         # Apply selected method
-        if self.d_filter == 'Manual':
+        if self.d_filter == "Manual":
             d_vel_max_ref = np.abs(self.d_filter_thresholds)
             d_vel_min_ref = -1 * d_vel_max_ref
             # Set valid data row 2 for difference velocity filter results
-            bad_idx_rows, bad_idx_cols = np.where(np.logical_or(nan_greater(d_vel, d_vel_max_ref),
-                                                                nan_less(d_vel, d_vel_min_ref)))
-        elif self.d_filter == 'Off':
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(d_vel, d_vel_max_ref), nan_less(d_vel, d_vel_min_ref)
+                )
+            )
+        elif self.d_filter == "Off":
             d_vel_max_ref = np.nanmax(np.nanmax(d_vel)) + 1
             d_vel_min_ref = np.nanmin(np.nanmin(d_vel)) - 1
             # Set valid data row 2 for difference velocity filter results
-            bad_idx_rows, bad_idx_cols = np.where(np.logical_or(nan_greater(d_vel, d_vel_max_ref),
-                                                                nan_less(d_vel, d_vel_min_ref)))
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(d_vel, d_vel_max_ref), nan_less(d_vel, d_vel_min_ref)
+                )
+            )
             self.d_filter_thresholds = d_vel_max_ref
 
-        elif self.d_filter == 'Auto':
-            # Apply threshold from entire measurement processing to each transect
+        elif self.d_filter == "Auto":
+            # Apply threshold from entire measurement processing to each
+            # transect
             if self.use_measurement_thresholds:
                 self.d_filter_thresholds = self.d_meas_thresholds
                 for p_type in self.d_meas_thresholds.keys():
                     data_max_ref = self.d_meas_thresholds[p_type][0]
                     data_min_ref = self.d_meas_thresholds[p_type][1]
                     data = np.copy(self.d_mps)
-                    data[self.ping_type!=p_type] = np.nan
-                    idx_invalid_rows, idx_invalid_cols = np.where(np.logical_or(np.greater(data, data_max_ref),
-                                                                                np.less(data, data_min_ref)))
+                    data[self.ping_type != p_type] = np.nan
+                    idx_invalid_rows, idx_invalid_cols = np.where(
+                        np.logical_or(
+                            np.greater(data, data_max_ref), np.less(data, data_min_ref)
+                        )
+                    )
                     if len(idx_invalid_rows) > 0:
                         if len(bad_idx_rows) > 0:
                             bad_idx_rows = np.hstack((bad_idx_rows, idx_invalid_rows))
@@ -1307,9 +1654,11 @@ class WaterData(object):
                     # Copy of difference velocities
                     vel_2_filter = copy.deepcopy(d_vel)
                     # Remove data not associated with the specified ping type
-                    vel_2_filter[self.ping_type!=p_type] = np.nan
+                    vel_2_filter[self.ping_type != p_type] = np.nan
                     # Apply filter to data of a single ping type
-                    idx_invalid_rows, idx_invalid_cols, threshold = self.iqr_filter(vel_2_filter)
+                    idx_invalid_rows, idx_invalid_cols, threshold = self.iqr_filter(
+                        vel_2_filter
+                    )
                     # Combine indices of invalid data for all ping types
                     if len(idx_invalid_rows) > 0:
                         if len(bad_idx_rows) > 0:
@@ -1321,17 +1670,20 @@ class WaterData(object):
                     thresholds[p_type] = threshold
                 self.d_filter_thresholds = thresholds
 
-            # Compute unique threshold for each transect when no ping types are available
+            # Compute unique threshold for each transect when no ping types
+            # are available
             else:
-                self.ping_type = np.array(['U'])
+                self.ping_type = np.array(["U"])
                 bad_idx_rows, bad_idx_cols, threshold = self.iqr_filter(d_vel)
-                self.d_filter_thresholds = {'U': threshold}
+                self.d_filter_thresholds = {"U": threshold}
 
         valid = copy.deepcopy(self.cells_above_sl)
         if len(bad_idx_rows) > 0:
             valid[bad_idx_rows, bad_idx_cols] = False
-        # TODO Seems like if the difference velocity doesn't exist due to a 3-beam solution it shouldn't be
-        #  flagged as invalid however this is the way it was in Matlab. May change this in future.
+        # TODO Seems like if the difference velocity doesn't exist due to a
+        #  3-beam solution it shouldn't be
+        #  flagged as invalid however this is the way it was in Matlab.
+        #  May change this in future.
         # valid[np.isnan(self.d_mps)] = True
         self.valid_data[2, :, :] = valid
 
@@ -1382,8 +1734,11 @@ class WaterData(object):
                 data_min_ref = np.nanmedian(data) - multiplier * data_iqr
 
                 # Identify valid and invalid data
-                data_bad_rows, data_bad_cols = np.where(np.logical_or(nan_greater(data, data_max_ref),
-                                                                      nan_less(data, data_min_ref)))
+                data_bad_rows, data_bad_cols = np.where(
+                    np.logical_or(
+                        nan_greater(data, data_max_ref), nan_less(data, data_min_ref)
+                    )
+                )
                 # Update filtered data array
                 data[data_bad_rows, data_bad_cols] = np.nan
 
@@ -1395,13 +1750,18 @@ class WaterData(object):
                     iqr_diff = 0
 
             # Determine row and column index of invalid cells with invalid data
-            bad_idx_rows, bad_idx_cols = np.where(np.logical_or(nan_greater(data_orig, data_max_ref),
-                                                                nan_less(data_orig, data_min_ref)))
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(data_orig, data_max_ref),
+                    nan_less(data_orig, data_min_ref),
+                )
+            )
         else:
             # All data are invalid
             # Determine row and column index of invalid cells with invalid data
-            bad_idx_rows, bad_idx_cols = np.where(np.logical_or(np.greater(data, -1),
-                                                                np.less(data, 1)))
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(np.greater(data, -1), np.less(data, 1))
+            )
 
         threshold = [data_max_ref, data_min_ref]
 
@@ -1444,8 +1804,11 @@ class WaterData(object):
                 data_min_ref = np.nanmedian(data) - multiplier * data_iqr
 
                 # Identify valid and invalid data
-                bad_idx = np.where(np.logical_or(nan_greater(data, data_max_ref),
-                                                                      nan_less(data, data_min_ref)))
+                bad_idx = np.where(
+                    np.logical_or(
+                        nan_greater(data, data_max_ref), nan_less(data, data_min_ref)
+                    )
+                )
                 # Update filtered data array
                 data[bad_idx] = np.nan
 
@@ -1463,20 +1826,23 @@ class WaterData(object):
     def filter_vert_vel(self, setting, threshold=None):
         """Applies filter to vertical velocity.
 
-        Applies either manual or automatic filter of the difference (error) velocity.  The automatic
-        mode is based on the following: This filter is based on the assumption that the water error
-        velocity should follow a gaussian distribution.  Therefore, 4 standard deviations should
-        encompass all of the valid data.  The standard deviation and limits (multplier * standard deviation)
-        are computed in an iterative process until filtering out additional data does not change
-        the computed standard deviation.
+        Applies either manual or automatic filter of the difference (error)
+        velocity.  The automatic mode is based on the following: This filter
+        is based on the assumption that the water error velocity should follow a
+        gaussian distribution.  Therefore, 4 standard deviations should
+        encompass all of the valid data.  The standard deviation and limits
+        (multplier * standard deviation) are computed in an iterative process
+        until filtering out additional data does not change the
+        computed standard deviation.
 
         Parameters
         ---------
         setting: str
             Filter setting (Auto, Off, Manual)
-        threshold: float
-            Threshold value for Manual setting."""
-        
+        threshold: float, dict
+            Threshold value for Manual setting.
+        """
+
         # Set vertical velocity filter properties
         self.w_filter = setting
         if threshold is not None:
@@ -1485,32 +1851,39 @@ class WaterData(object):
         # Get difference data from object
         w_vel = copy.deepcopy(self.w_mps)
 
-        # NOTE: Versions prior to 1.01 did not apply this step to remove data below the side lobe cutoff
+        # NOTE: Versions prior to 1.01 did not apply this step to remove data
+        # below the side lobe cutoff
         w_vel[np.logical_not(self.cells_above_sl)] = np.nan
 
-        w_vel_min_ref = None
         w_vel_max_ref = None
 
         bad_idx_rows = np.array([]).astype(int)
         bad_idx_cols = np.array([]).astype(int)
 
         # Apply selected method
-        if self.w_filter == 'Manual':
+        if self.w_filter == "Manual":
             w_vel_max_ref = np.abs(self.w_filter_thresholds)
             w_vel_min_ref = -1 * w_vel_max_ref
             # Identify valid and invalid data
-            bad_idx_rows, bad_idx_cols = np.where(np.logical_or(nan_greater(w_vel, w_vel_max_ref),
-                                                                    nan_less(w_vel, w_vel_min_ref)))
-        elif self.w_filter == 'Off':
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(w_vel, w_vel_max_ref), nan_less(w_vel, w_vel_min_ref)
+                )
+            )
+        elif self.w_filter == "Off":
             w_vel_max_ref = np.nanmax(np.nanmax(w_vel)) + 1
             w_vel_min_ref = np.nanmin(np.nanmin(w_vel)) - 1
             # Identify valid and invalid data
-            bad_idx_rows, bad_idx_cols = np.where(np.logical_or(nan_greater(w_vel, w_vel_max_ref),
-                                                                    nan_less(w_vel, w_vel_min_ref)))
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(w_vel, w_vel_max_ref), nan_less(w_vel, w_vel_min_ref)
+                )
+            )
             self.w_filter_thresholds = w_vel_max_ref
 
-        elif self.w_filter == 'Auto':
-            # Apply threshold from entire measurement processing to each transect
+        elif self.w_filter == "Auto":
+            # Apply threshold from entire measurement processing to each
+            # transect
             if self.use_measurement_thresholds:
                 self.w_filter_thresholds = self.w_meas_thresholds
                 for p_type in self.w_meas_thresholds.keys():
@@ -1518,8 +1891,11 @@ class WaterData(object):
                     data_min_ref = self.w_meas_thresholds[p_type][1]
                     data = np.copy(self.w_mps)
                     data[self.ping_type != p_type] = np.nan
-                    idx_invalid_rows, idx_invalid_cols = np.where(np.logical_or(np.greater(data, data_max_ref),
-                                                                                np.less(data, data_min_ref)))
+                    idx_invalid_rows, idx_invalid_cols = np.where(
+                        np.logical_or(
+                            np.greater(data, data_max_ref), np.less(data, data_min_ref)
+                        )
+                    )
                     if len(idx_invalid_rows) > 0:
                         if len(bad_idx_rows) > 0:
                             bad_idx_rows = np.hstack((bad_idx_rows, idx_invalid_rows))
@@ -1543,7 +1919,9 @@ class WaterData(object):
                     # Remove data not associated with the specified ping type
                     vel_2_filter[self.ping_type != p_type] = np.nan
                     # Apply filter to data of a single ping type
-                    idx_invalid_rows, idx_invalid_cols, threshold = self.iqr_filter(vel_2_filter)
+                    idx_invalid_rows, idx_invalid_cols, threshold = self.iqr_filter(
+                        vel_2_filter
+                    )
                     # Combine indices of invalid data for all ping types
                     if len(idx_invalid_rows) > 0:
                         if len(bad_idx_rows) > 0:
@@ -1554,11 +1932,12 @@ class WaterData(object):
                             bad_idx_cols = idx_invalid_cols
                     thresholds[p_type] = threshold
                 self.w_filter_thresholds = thresholds
-            # Compute unique threshold for each transect when no ping types are available
+            # Compute unique threshold for each transect when no ping types
+            # are available
             else:
-                self.ping_type = np.array(['U'])
+                self.ping_type = np.array(["U"])
                 bad_idx_rows, bad_idx_cols, threshold = self.iqr_filter(w_vel)
-                self.w_filter_thresholds = {'U': threshold}
+                self.w_filter_thresholds = {"U": threshold}
 
         valid = copy.deepcopy(self.cells_above_sl)
         if len(bad_idx_rows) > 0:
@@ -1571,7 +1950,7 @@ class WaterData(object):
 
         # Combine all filter data and update processed properties
         self.all_valid_data()
-                
+
     def filter_smooth(self, transect, setting):
         """Filter water speed using a smooth filter.
 
@@ -1582,13 +1961,14 @@ class WaterData(object):
         the raw data and the smoothed line are computed. The trimmed standard
         eviation is computed by selecting the number of residuals specified by
         "halfwidth" before the target point and after the target point, but not
-        including the target point. These values are then sorted, and the points
-        with the highest and lowest values are removed from the subset, and the
-        standard deviation of the trimmed subset is computed. The filter
-        criteria are determined by multiplying the standard deviation by a user
-        specified multiplier. This criteria defines a maximum and minimum
-        acceptable residual. Data falling outside the criteria are set to nan.
-          
+        including the target point. These values are then sorted, and the
+        points with the highest and lowest values are removed from the subset,
+        and the standard deviation of the trimmed subset is computed.
+        The filter criteria are determined by multiplying the standard
+        deviation by a user specified multiplier. This criteria defines a
+        maximum and minimum acceptable residual. Data falling outside the
+        criteria are set to nan.
+
         Recommended filter settings are:
         filter_width = 10
         half_width = 10
@@ -1601,22 +1981,22 @@ class WaterData(object):
         setting: str
             Set filter (Auto, Off)
         """
-        
+
         self.smooth_filter = setting
         upper_limit = None
         lower_limit = None
         wt_bad_idx = None
-        
+
         # Compute ens_time
         ens_time = np.nancumsum(transect.date_time.ens_duration_sec)
-        
+
         # Determine if smooth filter should be applied
-        if self.smooth_filter == 'Auto':
-            
+        if self.smooth_filter == "Auto":
+
             # Boat velocity components
             w_vele = self.u_mps
             w_veln = self.v_mps
-            
+
             # Set filter parameters
             filter_width = 10
             half_width = 10
@@ -1627,72 +2007,107 @@ class WaterData(object):
             w_vele_avg = np.nanmean(w_vele, 0)
             w_veln_avg = np.nanmean(w_veln, 0)
             _, speed = cart2pol(w_vele_avg, w_veln_avg)
-            
+
             # Compute residuals from a robust Loess smooth
             speed_smooth = rloess(ens_time, speed, filter_width)
             speed_res = speed - speed_smooth
-            
+
             # Apply a trimmed standard deviation filter multiple times
             for i in range(cycles):
                 fill_array = BoatData.run_std_trim(half_width, speed_res.T)
-                
+
                 # Compute filter bounds
                 upper_limit = speed_smooth + multiplier * fill_array
                 lower_limit = speed_smooth - multiplier * fill_array
-                
+
                 # Apply filter to residuals
                 wt_bad_idx = np.where((speed > upper_limit) or (speed < lower_limit))[0]
                 speed_res[wt_bad_idx] = np.nan
-            
+
             valid = np.copy(self.cells_above_sl)
-            
+
             valid[:, wt_bad_idx] = False
             self.valid_data[4, :, :] = valid
             self.smooth_upper_limit = upper_limit
             self.smooth_lower_limit = lower_limit
             self.smooth_speed = speed_smooth
-        
+
         else:
             # No filter applied
             self.valid_data[4, :, :] = np.copy(self.cells_above_sl)
             self.smooth_upper_limit = np.nan
             self.smooth_lower_limit = np.nan
             self.smooth_speed = np.nan
-            
+
         self.all_valid_data()
-     
-    def filter_snr(self, setting):
+
+    def filter_snr(self, transect, setting):
         """Filters SonTek data based on SNR.
 
-        Computes the average SNR for all cells above the side lobe cutoff for each beam in
-        each ensemble. If the range in average SNR in an ensemble is greater than 12 dB the
-        water velocity in that ensemble is considered invalid.
+        Computes the average SNR for all cells above the side lobe cutoff for
+        each beam in each ensemble. If the range in average SNR in an ensemble is greater
+        than 12 dB the water velocity in that ensemble is considered invalid.
 
         Parameters
         ----------
+        transect: TransectData
+            Object of TransectData
         setting: str
             Setting for filter (Auto, Off)
         """
 
-        self.snr_filter = setting  
-        
-        if setting == 'Auto':
-            if self.snr_rng is not None:
+        self.snr_filter = setting
+
+        if setting == "Auto":
+
+            # Determines if invalid data should use 3-beam computations
+            if self.snr_3beam_comp and self.d_filter != 3:
+
+                cells_above_sl = np.copy(self.cells_above_sl.astype(float))
+                cells_above_sl[cells_above_sl < 0.5] = np.nan
+                snr_adjusted = self.rssi * cells_above_sl
+                snr_average = np.nanmean(snr_adjusted, 1)
+
+                # Find invalid beams
+                snr_beam_invalid = (np.max(snr_average, axis=0) - snr_average) > 12
+
+                ens_bad_snr = np.any(snr_beam_invalid, axis=0)
+                valid = np.copy(self.cells_above_sl)
+
+                bad_snr_array = np.tile(ens_bad_snr, (valid.shape[0], 1))
+                valid[bad_snr_array] = False
+                w_vel_copy = copy.deepcopy(self)
+                beam_velocities = w_vel_copy.earth_to_beam(
+                    sensors=transect.sensors, adcp=transect.adcp
+                )
+                invalid_beam_value = np.tile(np.nan, valid.shape[0])
+
+                invalid_snr_idx = np.where(snr_beam_invalid)
+
+                beam_velocities[
+                invalid_snr_idx[0], :, invalid_snr_idx[1]
+                ] = invalid_beam_value
+                self.snr_beam_velocities = beam_velocities
+
+            else:
                 bad_snr_idx = np.greater(self.snr_rng, 12)
                 valid = np.copy(self.cells_above_sl)
-                
+
                 bad_snr_array = np.tile(bad_snr_idx, (valid.shape[0], 1))
                 valid[bad_snr_array] = False
-                self.valid_data[7, :, :] = valid
 
-                # Combine all filter data and update processed properties
-                self.all_valid_data()
-        else:
+            self.valid_data[7, :, :] = valid
+
+            # Combine all filter data and update processed properties
+            self.all_valid_data()
+        elif transect.adcp.manufacturer == "SonTek":
+            self.snr_beam_velocities = None
             self.valid_data[7, :, :] = np.copy(self.cells_above_sl)
             self.all_valid_data()
-        
+
     def filter_wt_depth(self, transect, setting):
-        """Marks water velocity data invalid if there is no valid or interpolated average depth.
+        """Marks water velocity data invalid if there is no valid or
+        interpolated average depth.
 
         Parameters
         ----------
@@ -1703,16 +2118,17 @@ class WaterData(object):
         """
         self.wt_depth_filter = setting
         valid = np.copy(self.cells_above_sl)
-        
+
         if setting:
             trans_select = getattr(transect.depths, transect.depths.selected)
             valid[:, np.isnan(trans_select.depth_processed_m)] = False
         self.valid_data[8, :, :] = valid
-        
+
         self.all_valid_data()
-        
+
     def filter_excluded(self, transect, setting):
-        """Marks all data invalid that are closer to the transducer than the setting.
+        """Marks all data invalid that are closer to the transducer than the
+         setting.
 
         Parameters
         ----------
@@ -1728,31 +2144,36 @@ class WaterData(object):
         cell_size = trans_select.depth_cell_size_m
         draft = trans_select.draft_use_m
         top_cell_depth = cell_depth - 0.5 * cell_size
-        threshold = np.round((setting+draft), 3)
+        threshold = np.round((setting + draft), 3)
 
         # Apply filter
         exclude = np.round(top_cell_depth, 3) <= threshold
         valid = np.copy(self.cells_above_sl)
         valid[exclude] = False
         self.valid_data[6, :, :] = valid
-        
+
         # Set threshold property
         self.excluded_dist_m = setting
-        
+
         self.all_valid_data()
 
-    def interpolate_abba(self, transect, search_loc=['above', 'below', 'before', 'after']):
-        """" Interpolates all data marked invalid using the abba interpolation algorithm.
+    def interpolate_abba(
+            self, transect, search_loc=("above", "below", "before", "after")
+    ):
+        """ " Interpolates all data marked invalid using the abba interpolation
+        algorithm.
 
         Parameters
         ----------
         transect: TransectData
             Object of TransectData
+        search_loc: tuple
+            Locations to search for abba interpolation
         """
 
         # Set properties
-        self.interpolate_cells = 'abba'
-        self.interpolate_ens = 'abba'
+        self.interpolate_cells = "abba"
+        self.interpolate_ens = "abba"
 
         # Get valid data based on all filters applied
         valid = self.valid_data[0, :, :]
@@ -1769,11 +2190,13 @@ class WaterData(object):
         u[np.logical_not(valid)] = np.nan
         v[np.logical_not(valid)] = np.nan
 
-        interpolated_data = self.compute_abba_interpolation(wt_data=self,
-                                                            data_list=[u, v],
-                                                            valid=valid,
-                                                            transect=transect,
-                                                            search_loc=search_loc)
+        interpolated_data = self.compute_abba_interpolation(
+            wt_data=self,
+            data_list=[u, v],
+            valid=valid,
+            transect=transect,
+            search_loc=search_loc,
+        )
 
         if interpolated_data is not None:
             # Incorporate interpolated values
@@ -1781,16 +2204,23 @@ class WaterData(object):
                 u[interpolated_data[0][n][0]] = interpolated_data[0][n][1]
                 v[interpolated_data[1][n][0]] = interpolated_data[1][n][1]
 
-        # Save interpolated data, while retaining of the ensembles including those that are not
-        # in the in_transect_idx array
+        # Save interpolated data, while retaining of the ensembles including
+        # those that are not in the in_transect_idx array
         self.u_processed_mps[:, :] = np.nan
         self.v_processed_mps[:, :] = np.nan
         self.u_processed_mps[:, transect.in_transect_idx] = u
         self.v_processed_mps[:, transect.in_transect_idx] = v
 
     @staticmethod
-    def compute_abba_interpolation(wt_data, data_list, valid, transect, search_loc=['above', 'below', 'before', 'after']):
-        """Computes the interpolated values for invalid cells using the abba method.
+    def compute_abba_interpolation(
+            wt_data,
+            data_list,
+            valid,
+            transect,
+            search_loc=("above", "below", "before", "after"),
+    ):
+        """Computes the interpolated values for invalid cells using the abba
+        method.
 
         Parameters
         ----------
@@ -1802,6 +2232,8 @@ class WaterData(object):
             Array indicating valid to be used for interpolation
         transect: TransectData
             Object of TransectData
+        search_loc: tuple
+            Locations to search for abba interpolation
 
         Returns
         -------
@@ -1818,33 +2250,40 @@ class WaterData(object):
 
         if not np.all(valid_cells) and np.nansum(boat_valid) > 1:
             # Compute distance along shiptrack to be used in interpolation
-            distance_along_shiptrack = transect.boat_vel.compute_boat_track(transect)['distance_m']
+            distance_along_shiptrack = transect.boat_vel.compute_boat_track(transect)[
+                "distance_m"
+            ]
 
-            # Where there is invalid boat speed at beginning or end of transect mark the distance nan to avoid
+            # Where there is invalid boat speed at beginning or end of
+            # transect mark the distance nan to avoid
             # interpolating velocities that won't be used for discharge
             if type(distance_along_shiptrack) is np.ndarray:
-                distance_along_shiptrack[0:np.argmax(boat_valid == True)] = np.nan
-                end_nan = np.argmax(np.flip(boat_valid) == True)
+                distance_along_shiptrack[0: np.argmax(boat_valid)] = np.nan
+                end_nan = np.argmax(np.flip(boat_valid))
                 if end_nan > 0:
                     distance_along_shiptrack[-1 * end_nan:] = np.nan
-            # if type(distance_along_shiptrack) is np.ndarray:
+                # if type(distance_along_shiptrack) is np.ndarray:
                 depth_selected = getattr(transect.depths, transect.depths.selected)
                 cells_above_sl = wt_data.valid_data[6, :, :]
                 cells_above_sl = cells_above_sl[:, transect.in_transect_idx]
 
-                # Interpolate values for  invalid cells with from neighboring data
-                interpolated_data = abba_idw_interpolation(data_list=data_list,
-                                                           valid_data=valid,
-                                                           cells_above_sl=cells_above_sl,
-                                                           y_centers=
-                                                           depth_selected.depth_cell_depth_m[:, transect.in_transect_idx],
-                                                           y_cell_size=
-                                                           depth_selected.depth_cell_size_m[:, transect.in_transect_idx],
-                                                           y_depth=
-                                                           depth_selected.depth_processed_m[transect.in_transect_idx],
-                                                           x_shiptrack=distance_along_shiptrack,
-                                                           search_loc=search_loc,
-                                                           normalize=True)
+                # Interpolate values for  invalid cells with from neighboring
+                # data
+                interpolated_data = abba_idw_interpolation(
+                    data_list=data_list,
+                    valid_data=valid,
+                    cells_above_sl=cells_above_sl,
+                    y_centers=depth_selected.depth_cell_depth_m[
+                              :, transect.in_transect_idx
+                              ],
+                    y_cell_size=depth_selected.depth_cell_size_m[
+                                :, transect.in_transect_idx
+                                ],
+                    y_depth=depth_selected.depth_processed_m[transect.in_transect_idx],
+                    x_shiptrack=distance_along_shiptrack,
+                    search_loc=search_loc,
+                    normalize=True,
+                )
                 return interpolated_data
             else:
                 return None
@@ -1852,57 +2291,58 @@ class WaterData(object):
             return None
 
     def interpolate_ens_next(self):
-        """Applies data from the next valid ensemble for ensembles with invalid water velocities.
+        """Applies data from the next valid ensemble for ensembles with
+        invalid water velocities.
         """
 
         # Set interpolation property for ensembles
-        self.interpolate_ens = 'ExpandedT'
-        
+        self.interpolate_ens = "ExpandedT"
+
         # Set processed data to nan for all invalid data
         valid = self.valid_data[0]
         self.u_processed_mps = np.copy(self.u_mps)
         self.v_processed_mps = np.copy(self.v_mps)
-        self.u_processed_mps[valid == False] = np.nan
-        self.v_processed_mps[valid == False] = np.nan
-        
+        self.u_processed_mps[np.logical_not(valid)] = np.nan
+        self.v_processed_mps[np.logical_not(valid)] = np.nan
+
         # Identifying ensembles with no valid data
         valid_ens = np.any(valid, axis=0)
         n_ens = len(valid_ens)
-        
+
         # Set the invalid ensembles to the data in the next valid ensemble
-        for n in np.arange(0, n_ens-1)[::-1]:
+        for n in np.arange(0, n_ens - 1)[::-1]:
             if not valid_ens[n]:
-                self.u_processed_mps[:, n] = self.u_processed_mps[:, n+1]
-                self.v_processed_mps[:, n] = self.v_processed_mps[:, n+1]
-                
+                self.u_processed_mps[:, n] = self.u_processed_mps[:, n + 1]
+                self.v_processed_mps[:, n] = self.v_processed_mps[:, n + 1]
+
     def interpolate_ens_hold_last(self):
         """Interpolates velocity data for invalid ensembles by repeating the
         the last valid data until new valid data is found
         """
-        
-        self.interpolate_ens = 'HoldLast'
-        
+
+        self.interpolate_ens = "HoldLast"
+
         valid = self.valid_data[0]
-        
+
         # Initialize processed velocity data variables
         self.u_processed_mps = np.copy(self.u_mps)
         self.v_processed_mps = np.copy(self.v_mps)
-        
+
         # Set invalid data to nan in processed velocity data variables
-        self.u_processed_mps[valid == False] = np.nan
-        self.v_processed_mps[valid == False] = np.nan
-        
+        self.u_processed_mps[np.logical_not(valid)] = np.nan
+        self.v_processed_mps[np.logical_not(valid)] = np.nan
+
         # Determine ensembles with valid data
         valid_ens = np.any(valid, axis=0)
-        
+
         # Process each ensemble beginning with the second ensemble
         n_ens = len(valid_ens)
-        
+
         for n in np.arange(1, n_ens):
             # If ensemble is invalid fill in with previous ensemble
             if not valid_ens[n]:
-                self.u_processed_mps[:, n] = self.u_processed_mps[:, n-1]
-                self.v_processed_mps[:, n] = self.v_processed_mps[:, n-1]
+                self.u_processed_mps[:, n] = self.u_processed_mps[:, n - 1]
+                self.v_processed_mps[:, n] = self.v_processed_mps[:, n - 1]
 
     def interpolate_ens_hold_last_9(self):
         """Apply SonTek's approach to invalid data.
@@ -1913,56 +2353,56 @@ class WaterData(object):
         ensembles beyond the 9th remain invalid. This is for
         compatibility with SonTek RiverSurveyor Live.
         """
-        
-        self.interpolate_ens = 'Hold9'
-        
+
+        self.interpolate_ens = "Hold9"
+
         valid = self.valid_data[0]
-        
+
         # Initialize processed velocity data variables
         self.u_processed_mps = np.copy(self.u_mps)
         self.v_processed_mps = np.copy(self.v_mps)
-        
+
         # Set invalid data to nan in processed velocity data variables
-        self.u_processed_mps[valid == False] = np.nan
-        self.v_processed_mps[valid == False] = np.nan
-        
+        self.u_processed_mps[np.logical_not(valid)] = np.nan
+        self.v_processed_mps[np.logical_not(valid)] = np.nan
+
         # Determine ensembles with valid data
         valid_ens = np.any(valid, axis=0)
-        
+
         # Process each ensemble beginning with the second ensemble
         n_ens = len(valid_ens)
         n_invalid = 0
-        
+
         for n in np.arange(1, n_ens):
             # If ensemble is invalid fill in with previous ensemble
-            if valid_ens[n] == False and n_invalid < 10:
+            if not valid_ens[n] and n_invalid < 10:
                 n_invalid += 1
-                self.u_processed_mps[:, n] = self.u_processed_mps[:, n-1]
-                self.v_processed_mps[:, n] = self.v_processed_mps[:, n-1]
+                self.u_processed_mps[:, n] = self.u_processed_mps[:, n - 1]
+                self.v_processed_mps[:, n] = self.v_processed_mps[:, n - 1]
             else:
                 n_invalid = 0
 
     def interpolate_ens_none(self):
         """Applies no interpolation for invalid ensembles."""
-        
-        self.interpolate_ens = 'None'
-        
+
+        self.interpolate_ens = "None"
+
         valid = self.valid_data[0]
-        
+
         # Initialize processed velocity data variables
         self.u_processed_mps = np.copy(self.u_mps)
         self.v_processed_mps = np.copy(self.v_mps)
-        
+
         # Set invalid data to nan in processed velocity data variables
-        self.u_processed_mps[valid == False] = np.nan
-        self.v_processed_mps[valid == False] = np.nan
+        self.u_processed_mps[np.logical_not(valid)] = np.nan
+        self.v_processed_mps[np.logical_not(valid)] = np.nan
 
     def interpolate_cells_none(self):
         """Applies no interpolation for invalid cells that are not part of
         an invalid ensemble."""
 
-        self.interpolate_cells = 'None'
-        
+        self.interpolate_cells = "None"
+
         valid = self.valid_data[0]
 
         # Determine ensembles with valid data
@@ -1974,21 +2414,21 @@ class WaterData(object):
         # Initialize processed velocity data variables
         self.u_processed_mps = np.copy(self.u_mps)
         self.v_processed_mps = np.copy(self.v_mps)
-        
+
         for n in range(n_ens):
             # If ensemble is invalid fill in with previous ensemble
             if valid_ens[n]:
                 invalid_cells = np.logical_not(valid[:, n])
-                self.u_processed_mps[invalid_cells,
-                                     n] = np.nan
-                self.v_processed_mps[invalid_cells,
-                                     n] = np.nan
-        
+                self.u_processed_mps[invalid_cells, n] = np.nan
+                self.v_processed_mps[invalid_cells, n] = np.nan
+
     def interpolate_ens_linear(self, transect):
-        """Uses 2D linear interpolation to estimate values for invalid ensembles.
+        """Uses 2D linear interpolation to estimate values for invalid
+        ensembles.
 
         Use linear interpolation as computed by scipy's interpolation
-        function to interpolated velocity data for ensembles with no valid velocities.
+        function to interpolated velocity data for ensembles with no valid
+        velocities.
 
         Parameters
         ----------
@@ -1996,8 +2436,8 @@ class WaterData(object):
             Object of TransectData
         """
 
-        self.interpolate_ens = 'Linear'
-         
+        self.interpolate_ens = "Linear"
+
         valid = self.valid_data[0, :, :]
 
         # Initialize processed velocity data variables
@@ -2006,16 +2446,17 @@ class WaterData(object):
 
         # Determine ensembles with valid data
         valid_ens = np.any(valid, 0)
-        
+
         if np.sum(valid_ens) > 1:
-            # Determine the number of ensembles
-            # n_ens = len(valid_ens)
-            
             trans_select = getattr(transect.depths, transect.depths.selected)
             # Compute z
-            z = np.divide(np.subtract(trans_select.depth_processed_m, trans_select.depth_cell_depth_m),
-                          trans_select.depth_processed_m)
-            
+            z = np.divide(
+                np.subtract(
+                    trans_select.depth_processed_m, trans_select.depth_cell_depth_m
+                ),
+                trans_select.depth_processed_m,
+            )
+
             # Create position array
             boat_select = getattr(transect.boat_vel, transect.boat_vel.selected)
             if boat_select is not None:
@@ -2024,32 +2465,43 @@ class WaterData(object):
                     boat_vel_y = boat_select.v_processed_mps
                     track_x = boat_vel_x * transect.date_time.ens_duration_sec
                     track_y = boat_vel_y * transect.date_time.ens_duration_sec
-                    track = np.nancumsum(np.sqrt(track_x**2 + track_y**2))
+                    track = np.nancumsum(np.sqrt(track_x ** 2 + track_y ** 2))
                     track_array = np.tile(track, (self.u_processed_mps.shape[0], 1))
-                    
+
                     # Determine index of all valid data
-                    valid_z = np.isnan(z) == False
+                    valid_z = np.logical_not(np.isnan(z))
                     valid_combined = np.logical_and(valid, valid_z)
 
-                    u = interpolate.griddata(np.vstack((z[valid_combined], track_array[valid_combined])).T,
-                                             self.u_processed_mps[valid_combined],
-                                             (z, track_array))
-                    
-                    v = interpolate.griddata(np.vstack((z[valid_combined], track_array[valid_combined])).T,
-                                             self.v_processed_mps[valid_combined],
-                                             (z, track_array))
+                    u = interpolate.griddata(
+                        np.vstack((z[valid_combined], track_array[valid_combined])).T,
+                        self.u_processed_mps[valid_combined],
+                        (z, track_array),
+                    )
+
+                    v = interpolate.griddata(
+                        np.vstack((z[valid_combined], track_array[valid_combined])).T,
+                        self.v_processed_mps[valid_combined],
+                        (z, track_array),
+                    )
 
                     self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
                     self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
-                    processed_valid_cells = self.estimate_processed_valid_cells(transect)
-                    self.u_processed_mps[processed_valid_cells] = u[processed_valid_cells]
-                    self.v_processed_mps[processed_valid_cells] = v[processed_valid_cells]
+                    processed_valid_cells = self.estimate_processed_valid_cells(
+                        transect
+                    )
+                    self.u_processed_mps[processed_valid_cells] = u[
+                        processed_valid_cells
+                    ]
+                    self.v_processed_mps[processed_valid_cells] = v[
+                        processed_valid_cells
+                    ]
 
     def interpolate_cells_linear(self, transect):
         """Uses 2D linear interpolation to estimate values for invalid cells.
 
         Use linear interpolation as computed by scipy's interpolation
-        function to interpolated velocity data for cells with no valid velocities.
+        function to interpolated velocity data for cells with no valid
+        velocities.
 
         Parameters
         ----------
@@ -2057,7 +2509,7 @@ class WaterData(object):
             Object of TransectData
         """
 
-        self.interpolate_ens = 'Linear'
+        self.interpolate_ens = "Linear"
 
         valid = self.valid_data[0, :, :]
 
@@ -2068,8 +2520,12 @@ class WaterData(object):
         trans_select = getattr(transect.depths, transect.depths.selected)
 
         # Compute z
-        z = np.divide(np.subtract(trans_select.depth_processed_m, trans_select.depth_cell_depth_m),
-                      trans_select.depth_processed_m)
+        z = np.divide(
+            np.subtract(
+                trans_select.depth_processed_m, trans_select.depth_cell_depth_m
+            ),
+            trans_select.depth_processed_m,
+        )
 
         # Create position array
         boat_select = getattr(transect.boat_vel, transect.boat_vel.selected)
@@ -2083,18 +2539,24 @@ class WaterData(object):
                 track_array = np.tile(track, (self.u_processed_mps.shape[0], 1))
 
                 # Determine index of all valid data
-                valid_z = np.isnan(z) == False
+                valid_z = np.logical_not(np.isnan(z))
                 valid_combined = np.logical_and(valid, valid_z)
 
-                u = interpolate.griddata(np.array([z[valid_combined].ravel(),
-                                                   track_array[valid_combined].ravel()]).T,
-                                         self.u_processed_mps[valid_combined].ravel(),
-                                         (z, track_array))
-
-                v = interpolate.griddata(np.array([z[valid_combined].ravel(),
-                                                   track_array[valid_combined].ravel()]).T,
-                                         self.v_processed_mps[valid_combined].ravel(),
-                                         (z, track_array))
+                u = interpolate.griddata(
+                    np.array(
+                        [z[valid_combined].ravel(), track_array[valid_combined].ravel()]
+                    ).T,
+                    self.u_processed_mps[valid_combined].ravel(),
+                    (z, track_array),
+                )
+
+                v = interpolate.griddata(
+                    np.array(
+                        [z[valid_combined].ravel(), track_array[valid_combined].ravel()]
+                    ).T,
+                    self.v_processed_mps[valid_combined].ravel(),
+                    (z, track_array),
+                )
 
                 self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
                 self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
@@ -2103,7 +2565,8 @@ class WaterData(object):
                 self.v_processed_mps[processed_valid_cells] = v[processed_valid_cells]
 
     def interpolate_cells_trdi(self, transect):
-        """Interpolates values for invalid cells using methods similar to WinRiver II.
+        """Interpolates values for invalid cells using methods similar to
+        WinRiver II.
 
         This function computes the velocity for the invalid cells using
         the methods in WinRiver II, but applied to velocity components.
@@ -2111,7 +2574,8 @@ class WaterData(object):
         more correct, mathematically applying to discharge or velocity
         components is identical. By applying to velocity components the
         user can see the velocity data interpolated.
-        Power fit uses the power fit equation and no slip uses linear interpolation.
+        Power fit uses the power fit equation and no slip uses linear
+        interpolation.
 
         Parameters
         ----------
@@ -2120,7 +2584,7 @@ class WaterData(object):
         """
 
         # Set property
-        self.interpolate_cells = 'TRDI'
+        self.interpolate_cells = "TRDI"
 
         # Construct variables
         depths = getattr(transect.depths, transect.depths.selected)
@@ -2138,41 +2602,59 @@ class WaterData(object):
         for n in range(n_ens):
 
             # Identify first and last valid depth cell
-            idx = np.where(valid[:, n] == True)[0]
+            idx = np.where(valid[:, n])[0]
             if len(idx) > 0:
                 idx_first = idx[0]
                 idx_last = idx[-1]
-                idx_middle = np.where(valid[idx_first:idx_last + 1, n] == False)[0]
+                idx_middle = np.where(
+                    np.logical_not(valid[idx_first: idx_last + 1, n])
+                )[0]
 
-                # For invalid middle depth cells perform interpolation based on bottom method
+                # For invalid middle depth cells perform interpolation based
+                # on bottom method
                 if len(idx_middle) > 0:
                     idx_middle = idx_middle + idx_first
                     z_adj[idx_middle, n] = z_all[idx_middle, n]
 
                     # Interpolate velocities using power fit
-                    if bot_method == 'Power':
+                    if bot_method == "Power":
                         # Compute interpolated u-velocities
                         z2 = z[:, n] - (0.5 * cell_size[:, n])
                         z2[nan_less(z2, 0)] = np.nan
-                        coef = ((exponent + 1) * np.nansum(self.u_processed_mps[:, n] * cell_size[:, n], 0)) / \
-                            np.nansum(((z[:, n] + 0.5 * cell_size[:, n]) ** (exponent + 1)) - (z2 ** (exponent + 1)), 0)
+                        coef = (
+                                       (exponent + 1)
+                                       * np.nansum(self.u_processed_mps[:, n] * cell_size[:, n], 0)
+                               ) / np.nansum(
+                            ((z[:, n] + 0.5 * cell_size[:, n]) ** (exponent + 1))
+                            - (z2 ** (exponent + 1)),
+                            0,
+                        )
 
                         temp = coef * z_adj[:, n] ** exponent
                         self.u_processed_mps[idx_middle, n] = temp[idx_middle]
                         # Compute interpolated v-Velocities
-                        coef = ((exponent + 1) * np.nansum(self.v_processed_mps[:, n] * cell_size[:, n])) / \
-                            np.nansum(((z[:, n] + 0.5 * cell_size[:, n]) ** (exponent + 1)) - (z2 ** (exponent + 1)))
+                        coef = (
+                                       (exponent + 1)
+                                       * np.nansum(self.v_processed_mps[:, n] * cell_size[:, n])
+                               ) / np.nansum(
+                            ((z[:, n] + 0.5 * cell_size[:, n]) ** (exponent + 1))
+                            - (z2 ** (exponent + 1))
+                        )
                         temp = coef * z_adj[:, n] ** exponent
                         self.v_processed_mps[idx_middle, n] = temp[idx_middle]
 
                     # Interpolate velocities using linear interpolation
-                    elif bot_method == 'No Slip':
-                        self.u_processed_mps[idx_middle, n] = np.interp(x=cell_depth[idx_middle, n],
-                                                                        xp=cell_depth[valid[:, n], n],
-                                                                        fp=self.u_processed_mps[valid[:, n], n])
-                        self.v_processed_mps[idx_middle, n] = np.interp(x=cell_depth[idx_middle, n],
-                                                                        xp=cell_depth[valid[:, n], n],
-                                                                        fp=self.v_processed_mps[valid[:, n], n])
+                    elif bot_method == "No Slip":
+                        self.u_processed_mps[idx_middle, n] = np.interp(
+                            x=cell_depth[idx_middle, n],
+                            xp=cell_depth[valid[:, n], n],
+                            fp=self.u_processed_mps[valid[:, n], n],
+                        )
+                        self.v_processed_mps[idx_middle, n] = np.interp(
+                            x=cell_depth[idx_middle, n],
+                            xp=cell_depth[valid[:, n], n],
+                            fp=self.v_processed_mps[valid[:, n], n],
+                        )
 
     def estimate_processed_valid_cells(self, transect):
         """Estimate the number of valid cells for invalid ensembles.
@@ -2196,11 +2678,11 @@ class WaterData(object):
         for n in range(n_invalid):
 
             # Find nearest valid ensembles on either side of invalid ensemble
-            idx1 = np.where(valid_data_sum[:invalid_ens_idx[n]] > 0)[0]
+            idx1 = np.where(valid_data_sum[: invalid_ens_idx[n]] > 0)[0]
             if len(idx1) > 0:
                 idx1 = idx1[-1]
                 # Find the last cell in the neighboring valid ensembles
-                idx1_cell = np.where(processed_valid_cells[:, idx1] == True)[0][-1]
+                idx1_cell = np.where(processed_valid_cells[:, idx1])[0][-1]
                 # Determine valid cells for invalid ensemble
                 idx1_cell_depth = depth_cell_depth[idx1_cell, idx1]
             else:
@@ -2211,14 +2693,16 @@ class WaterData(object):
                 idx2 = idx2[0]
                 idx2 = invalid_ens_idx[n] + idx2
                 # Find the last cell in the neighboring valid ensembles
-                idx2_cell = np.where(processed_valid_cells[:, idx2] == True)[0][-1]
+                idx2_cell = np.where(processed_valid_cells[:, idx2])[0][-1]
                 # Determine valid cells for invalid ensemble
                 idx2_cell_depth = depth_cell_depth[idx2_cell, idx2]
             else:
                 idx2_cell_depth = 0
 
             cutoff = np.nanmax([idx1_cell_depth, idx2_cell_depth])
-            processed_valid_cells[depth_cell_depth[:, invalid_ens_idx[n]] < cutoff, invalid_ens_idx[n]] = True
+            processed_valid_cells[
+                depth_cell_depth[:, invalid_ens_idx[n]] < cutoff, invalid_ens_idx[n]
+            ] = True
 
             # Apply excluded distance
             processed_valid_cells = processed_valid_cells * self.valid_data[6, :, :]
@@ -2229,7 +2713,7 @@ class WaterData(object):
         """Computes the range between the average snr for all beams.
         The average is computed using only data above the side lobe cutoff.
         """
-        if self.rssi_units == 'SNR':
+        if self.rssi_units == "SNR":
             cells_above_sl = np.copy(self.cells_above_sl.astype(float))
             cells_above_sl[cells_above_sl < 0.5] = np.nan
             snr_adjusted = self.rssi * cells_above_sl
@@ -2237,15 +2721,15 @@ class WaterData(object):
             self.snr_rng = np.nanmax(snr_average, 0) - np.nanmin(snr_average, 0)
 
     def automated_beam_filter_old(self):
-        """Older version of automatic beam filter. Not currently used.
-        """
+        """Older version of automatic beam filter. Not currently used."""
 
-        # Create array indicating which cells do not have 4-beam solutions and all cells below side lobe are nan
+        # Create array indicating which cells do not have 4-beam solutions
+        # and all cells below side lobe are nan
         temp = copy.deepcopy(self)
         temp.filter_beam(4)
         valid_bool = temp.valid_data[5, :, :]
         valid = valid_bool.astype(float)
-        valid[temp.cells_above_sl == False] = np.nan
+        valid[np.logical_not(temp.cells_above_sl)] = np.nan
 
         # Find cells with 3 beams solutions
         rows_3b, cols_3b = np.where(np.abs(valid) == 0)
@@ -2257,24 +2741,36 @@ class WaterData(object):
             valid_v = temp.v_mps[valid == 1]
             # Use interpolate water velocity of cells with 3 beam solutions
 
-            # The following code duplicates Matlab scatteredInterpolant which seems to only estimate along columns
-            # as long as there is data in the ensemble above and below the value being estimated.
+            # The following code duplicates Matlab scatteredInterpolant which
+            # seems to only estimate along columns as long as there is data in
+            # the ensemble above and below the value being estimated.
             row_numbers = np.linspace(0, valid.shape[0] - 1, valid.shape[0])
             n = 0
             for col in cols_3b:
-                # If the cell has valid data above and below it linearly interpolate using data in that ensemble.
+                # If the cell has valid data above and below it linearly
+                # interpolate using data in that ensemble.
                 # If not, use other means of interpolation.
-                if np.any(valid_bool[rows_3b[n] + 1::, col]) and np.any(valid_bool[0:rows_3b[n], col]):
-                    est_u = np.interp(x=rows_3b[n],
-                                      xp=row_numbers[valid_bool[:, col]],
-                                      fp=temp.u_mps[valid_bool[:, col], col])
-
-                    est_v = np.interp(x=rows_3b[n],
-                                      xp=row_numbers[valid_bool[:, col]],
-                                      fp=temp.v_mps[valid_bool[:, col], col])
+                if np.any(valid_bool[rows_3b[n] + 1::, col]) and np.any(
+                        valid_bool[0: rows_3b[n], col]
+                ):
+                    est_u = np.interp(
+                        x=rows_3b[n],
+                        xp=row_numbers[valid_bool[:, col]],
+                        fp=temp.u_mps[valid_bool[:, col], col],
+                    )
+
+                    est_v = np.interp(
+                        x=rows_3b[n],
+                        xp=row_numbers[valid_bool[:, col]],
+                        fp=temp.v_mps[valid_bool[:, col], col],
+                    )
                 else:
-                    est_u = interpolate.griddata(np.array((valid_rows, valid_cols)).T, valid_u, (col, rows_3b[n]))
-                    est_v = interpolate.griddata(np.array((valid_cols, valid_rows)).T, valid_v, (col, rows_3b[n]))
+                    est_u = interpolate.griddata(
+                        np.array((valid_rows, valid_cols)).T, valid_u, (col, rows_3b[n])
+                    )
+                    est_v = interpolate.griddata(
+                        np.array((valid_cols, valid_rows)).T, valid_v, (col, rows_3b[n])
+                    )
 
                 u_ratio = (temp.u_mps[rows_3b[n], col] / est_u) - 1
                 v_ratio = (temp.v_mps[rows_3b[n], col] / est_v) - 1
@@ -2290,156 +2786,3 @@ class WaterData(object):
         # Combine all filter data and update processed properties
 
         self.all_valid_data()
-
-# Code from Aurelien
-    def interpolate_cells_above(self, transect):
-        """Interpolates values for invalid cells using below valid cell
-        Written by Aurelien Despax
-        Modified by dsm
-
-        Parameters
-        ----------
-        transect: TransectData
-            Object of TransectData
-        """
-
-        # Set property
-        self.interpolate_cells = 'Above'
-
-        # Construct variables
-
-        valid = self.valid_data[0]
-        n_cells, n_ens = self.u_processed_mps.shape
-
-        for n in range(n_ens):
-
-            # Identify first and last valid depth cell
-            idx = np.where(valid[:, n] == True)[0]
-            if len(idx) > 0:
-                idx_first = idx[0]
-                idx_last = idx[-1]
-                idx_middle = np.where(valid[idx_first:idx_last + 1, n] == False)[0]
-
-                # For invalid middle depth cells assign value of shallower valid depth cell
-                # TODO this assigns the value of the shallowest depth cell not the next valid depth cell
-                if len(idx_middle) > 0:
-                    idx_middle = idx_middle + idx_first
-                    self.u_processed_mps[idx_middle, n] = self.u_processed_mps[idx_first, n]
-                    self.v_processed_mps[idx_middle, n] = self.v_processed_mps[idx_first, n]
-
-    def interpolate_cells_below(self, transect):
-        """Interpolates values for invalid cells using above valid cell
-        Written by Aurelien Despax
-        Modified by dsm
-
-        Parameters
-        ----------
-        transect: TransectData
-            Object of TransectData
-        """
-
-        # Set property
-        self.interpolate_cells = 'Below'
-
-        # Construct variables
-        valid = self.valid_data[0]
-        n_cells, n_ens = self.u_processed_mps.shape
-
-        for n in range(n_ens):
-
-            # Identify first and last valid depth cell
-            idx = np.where(valid[:, n] == True)[0]
-            if len(idx) > 0:
-                idx_first = idx[0]
-                idx_last = idx[-1]
-                idx_middle = np.where(valid[idx_first:idx_last + 1, n] == False)[0]
-
-                # For invalid middle depth cells assign the value of the next deeper valid depth cells
-                # TODO this assigns the value of the shallowest depth cell not the next valid depth cell
-                if len(idx_middle) > 0:
-                    idx_middle = idx_middle + idx_first
-                    self.u_processed_mps[idx_middle, n] = self.u_processed_mps[idx_last, n]
-                    self.v_processed_mps[idx_middle, n] = self.v_processed_mps[idx_last, n]
-
-    def interpolate_cells_before(self, transect):
-        """Interpolates values for invalid cells using above valid cell
-        Written by Aurelien Despax
-
-        Parameters
-        ----------
-        transect: TransectData
-            Object of TransectData
-        """
-
-        # Set property
-        self.interpolate_cells = 'Before'
-
-        # Construct variables
-        depths = getattr(transect.depths, transect.depths.selected)
-        valid = self.valid_data[0]
-        cell_depth = depths.depth_cell_depth_m
-        z_all = np.subtract(depths.depth_processed_m, cell_depth)
-        z = np.copy(z_all)
-        z[np.isnan(self.u_processed_mps)] = np.nan
-        z_adj = np.tile(np.nan, z.shape)
-        n_cells, n_ens = self.u_processed_mps.shape
-
-        for n in range(n_ens):
-
-            # Identify first and last valid depth cell
-            idx = np.where(valid[:, n] == True)[0]
-            if len(idx) > 0:
-                idx_first = idx[0]
-                idx_last = idx[-1]
-                idx_middle = np.where(valid[idx_first:idx_last + 1, n] == False)[0]
-
-                # For invalid middle depth cells perform interpolation based on bottom method
-                if len(idx_middle) > 0:
-                    idx_middle = idx_middle + idx_first
-                    z_adj[idx_middle, n] = z_all[idx_middle, n]
-
-                    # Interpolate velocities using linear interpolation
-                    self.u_processed_mps[idx_middle, n] = self.u_processed_mps[idx_middle, n - 1]
-                    self.v_processed_mps[idx_middle, n] = self.v_processed_mps[idx_middle, n - 1]
-
-    def interpolate_cells_after(self, transect):
-        """Interpolates values for invalid cells using above valid cell
-        Written by Aurelien Despax
-
-        Parameters
-        ----------
-        transect: TransectData
-            Object of TransectData
-        """
-
-        # Set property
-        self.interpolate_cells = 'After'
-
-        # Construct variables
-        depths = getattr(transect.depths, transect.depths.selected)
-        valid = self.valid_data[0]
-        cell_depth = depths.depth_cell_depth_m
-        z_all = np.subtract(depths.depth_processed_m, cell_depth)
-        z = np.copy(z_all)
-        z[np.isnan(self.u_processed_mps)] = np.nan
-        z_adj = np.tile(np.nan, z.shape)
-        n_cells, n_ens = self.u_processed_mps.shape
-
-        for n in list(reversed(list(range(n_ens)))):
-
-            # Identify first and last valid depth cell
-            idx = np.where(valid[:, n] == True)[0]
-            if len(idx) > 0:
-                idx_first = idx[0]
-                idx_last = idx[-1]
-                idx_middle = np.where(valid[idx_first:idx_last + 1, n] == False)[0]
-
-                # For invalid middle depth cells perform interpolation based on bottom method
-                if len(idx_middle) > 0:
-                    idx_middle = idx_middle + idx_first
-                    z_adj[idx_middle, n] = z_all[idx_middle, n]
-
-                    # Interpolate velocities using linear interpolation
-                    if (n_ens > (n + 1)):
-                        self.u_processed_mps[idx_middle, n] = self.u_processed_mps[idx_middle, n + 1]
-                        self.v_processed_mps[idx_middle, n] = self.v_processed_mps[idx_middle, n + 1]
\ No newline at end of file
diff --git a/Classes/WaterData Froude.py b/Classes/WaterData Froude.py
new file mode 100644
index 0000000000000000000000000000000000000000..e3665a15c97ab65df7ee88ae62eea7553f22aec0
--- /dev/null
+++ b/Classes/WaterData Froude.py	
@@ -0,0 +1,3075 @@
+import copy
+import numpy as np
+from numpy.matlib import repmat
+from scipy import interpolate
+from Classes.BoatData import BoatData
+from MiscLibs.common_functions import cart2pol, pol2cart, iqr, nan_greater, nan_less
+from MiscLibs.robust_loess import rloess
+from MiscLibs.abba_2d_interpolation import abba_idw_interpolation
+
+
+class WaterData(object):
+    """Class to process and store water velocity data.
+
+    Attributes
+    ----------
+    Original data provided to the class:
+        raw_vel_mps: np.array(float)
+            Contains the raw unfiltered velocity in m/s.  1st index 1-4 are
+            beams 1,2,3,4 if beam or u,v,w,d if otherwise.
+        frequency: np.array(float)
+            Defines ADCP frequency used for velocity measurement, in kHz.
+        orig_coord_sys: str
+            Defines the original raw velocity coordinate system "Beam",
+            "Inst", "Ship", "Earth".
+        orig_nav_ref: str
+            Defines the original taw data naviagation reference: "None", "BT",
+             "GGA", "VTG".
+        corr: np.array(float)
+            Correlation values for WT, if available.
+        rssi: np.array(float)
+            Returned acoustic signal strength.
+        rssi_units: str
+            Units for returned acoustic signal strength: "Counts" "dB", "SNR".
+        water_mode: str
+            WaterMode for TRDI or 'Variable' for SonTek.
+        blanking_distance_m: float
+            Distance below transducer where data are marked invalid due to
+             potential ringing.
+        cells_above_sl: np.array(bool)
+            Logical array of depth cells above sidelobe cutoff based on
+            selected depth reference.
+        cells_above_sl_bt: np.array(bool)
+            Logical array of depth cells above the sidelobe cutoff based on BT
+        sl_lag_effect_m: np.array(float)
+            Side lobe distance due to lag and transmit length
+
+    Data computed in this class:
+        u_earth_no_ref_mps: np.array(float)
+            Horizontal velocity in x-direction with no boat reference applied,
+            in m/s.
+        v_earth_no_ref_mps: np.array(float)
+            Horizontal velocity in y-direction with no boat reference applied,
+            in m/s.
+        u_mps: np.array(float)
+            Horizontal velocity in x-direction, earth coord, nav referenced,
+            in m/s.
+        v_mps: np.array(float)
+            Horizontal velocity in y-direction, earth coord, nav referenced,
+            in m/s.
+        u_processed_mps: np.array(float)
+            Horizontal velocity in x-direction, earth coord, nav ref,
+            filtered, and interpolated.
+        v_processed_mps: np.array(float)
+            Horizontal veloctiy in y-direction, earth coord, nav ref,
+            filtered, and interpolated.
+        w_mps: np.array(float)
+            Vertical velocity (+ up), in m/s.
+        d_mps: np.array(float)
+            Difference in vertical velocities compute from opposing beam
+            pairs, in m/s.
+        invalid_index: np.array(bool)
+            Index of ensembles with no valid raw velocity data.
+        num_invalid: float
+            Estimated number of depth cells in ensembles with no valid raw
+            velocity data.
+        valid_data: np.array(float)
+            3-D logical array of valid data
+                Dim1 0 - composite
+                Dim1 1 - original, cells above side lobe
+                Dim1 2 - dfilter
+                Dim1 3 - wfilter
+                Dim1 4 - smoothFilter
+                Dim1 5 - beamFilter
+                Dim1 6 - excluded
+                Dim1 7 - snrFilter
+                Dim1 8 - validDepthFilter
+
+    Processing settings:
+        beam_filter: int
+            Set 3 for 3-beam solutions, 4 for 4-beam solutions.
+        d_filter: str
+            Set difference velocity filter "On", "Off".
+        d_filter_thresholds: float, dict, tuple
+            Threshold(s) for difference velocity filter.
+        w_filter: str
+            Set vertical velocity filter "On", "Off".
+        w_filter_thresholds: float, dict, tuple
+            Threshold(s) for vertical velocity filter.
+        excluded_dist_m: float
+            Distance below transucer for which data are excluded or marked
+            invalid, in m.
+        orig_excluded_dist_m: float
+            Original distance below transucer for which data are excluded or
+            marked invalid, in m.
+        smooth_filter: str
+            Set filter based on smoothing function "On", "Off".
+        smooth_speed: np.array(float)
+            Smoothed mean water speed, in m/s.
+        smooth_upper_limit: np.array(float)
+            Smooth function upper limit of window, in m/s.
+        smooth_lower_limit: np.array(float)
+            Smooth funciton lower limit of window, in m/s.
+        snr_filter: str
+            Set SNR filter for SonTek data "On", "Off".
+        snr_rng: np.array(float)
+            Range of beam averaged SNR
+        snr_3beam_comp: bool
+            Indicates the use of 3-beam velocity computations when invalid SNR is found
+        wt_depth_filter: np.array(bool)
+            WT in ensembles with invalid depths are marked invalid.
+        interpolate_ens: str
+            Type of interpolation: "None", "TRDI", "Linear", 'abba'.
+        interpolate_cells: str
+            Type of cell interpolation: "None", "TRDI", "Linear", 'abba'
+        coord_sys: str
+            Defines the velocity coordinate system "Beam", "Inst", "Ship",
+            "Earth"
+        nav_ref: str
+            Defines the navigation reference: "None", "BT", "GGA", "VTG"
+        sl_cutoff_percent: float
+            Percent cutoff defined by cos(angle)
+        sl_cutoff_number: float
+            User specified number of cells to cutoff from SonTek, not
+            implemented, undefined
+        sl_cutoff_type: str
+            Type of cutoff method "Percent" or "Number".
+        ping_type: np.array(int)
+            Indicates type of ping for each cell: 0-incoherent, 1-coherent,
+            2-surface
+        d_meas_thresholds: list
+            Dictionary of difference velocity thresholds computed using the
+            whole measurement by ping type
+        w_meas_thresholds: list
+            Dictionary of vertical velocity thresholds computed using the
+            whole measurement by ping type
+        use_measurement_thresholds: bool
+            Indicates if the measurement based thresholds should be used
+
+    """
+
+    def __init__(self):
+        """Initialize instance variables."""
+
+        # Data input to this class
+        self.raw_vel_mps = None
+        self.frequency = None
+        self.orig_coord_sys = None
+        self.orig_nav_ref = None
+        self.corr = None
+        self.rssi = None
+        self.rssi_units = None
+        self.water_mode = None
+        self.blanking_distance_m = None
+        self.cells_above_sl = None
+        self.cells_above_sl_bt = None
+        self.sl_lag_effect_m = None
+
+        # Data computed in this class
+        self.u_earth_no_ref_mps = None
+        self.v_earth_no_ref_mps = None
+        self.u_mps = None
+        self.v_mps = None
+        self.u_processed_mps = None
+        self.v_processed_mps = None
+        self.w_mps = None
+        self.d_mps = None
+        self.invalid_index = None
+        self.num_invalid = []
+        self.valid_data = None
+
+        # Settings
+        self.beam_filter = None
+        self.d_filter = None
+        self.d_filter_thresholds = {}
+        self.w_filter = None
+        self.w_filter_thresholds = {}
+        self.excluded_dist_m = None
+        self.orig_excluded_dist_m = None
+        self.smooth_filter = None
+        self.smooth_speed = None
+        self.smooth_upper_limit = None
+        self.smooth_lower_limit = None
+        self.snr_filter = "Off"
+        self.snr_rng = []
+        self.snr_beam_velocities = None
+        self.snr_3beam_comp = False
+        self.wt_depth_filter = True
+        self.interpolate_ens = None
+        self.interpolate_cells = None
+        self.coord_sys = None
+        self.nav_ref = None
+        self.sl_cutoff_percent = None
+        self.sl_cutoff_number = None
+        self.sl_cutoff_type = None
+        self.sl_cutoff_m = None
+        self.ping_type = np.array([])
+
+        # Filter settings populated from Measurement.create_filter_composites
+        self.d_meas_thresholds = {}
+        self.w_meas_thresholds = {}
+
+        self.use_measurement_thresholds = False
+
+    def populate_data(
+        self,
+        vel_in,
+        freq_in,
+        coord_sys_in,
+        nav_ref_in,
+        rssi_in,
+        rssi_units_in,
+        excluded_dist_in,
+        cells_above_sl_in,
+        sl_cutoff_per_in,
+        sl_cutoff_num_in,
+        sl_cutoff_type_in,
+        sl_lag_effect_in,
+        wm_in,
+        blank_in,
+        corr_in=None,
+        surface_vel_in=None,
+        surface_rssi_in=None,
+        surface_corr_in=None,
+        sl_cutoff_m=None,
+        surface_num_cells_in=0,
+        ping_type="U",
+        use_measurement_thresholds=False,
+        snr_3beam_comp=False
+    ):
+
+        """Populates the variables with input, computed, or default values.
+
+        Parameters
+        ----------
+        vel_in: np.array(float)
+            Contains the raw unfiltered velocity data in m/s.
+            Rows 1-4 are beams 1,2,3,4 if beam or u,v,w,d if otherwise.
+        freq_in: np.array(float)
+            Defines ADCP frequency used for velocity measurement.
+        coord_sys_in: str
+            Defines the original raw  velocity coordinate system "Beam",
+            "Inst", "Ship", "Earth".
+        nav_ref_in: str
+            Defines the original raw data navigation reference: "None", "BT",
+             "GGA", "VTG".
+        rssi_in: np.array(float)
+            Returned acoustic signal strength.
+        rssi_units_in: str
+            Units for returned acoustic signal strength: "Counts", "dB", "SNR".
+        excluded_dist_in: float
+            Distance below transducer for which data are excluded or marked
+            invalid.
+        cells_above_sl_in: np.array(bool)
+            Bool array of depth cells above the sidelobe cutoff based on
+             selected depth reference.
+        sl_cutoff_per_in: float
+            Percent cutoff defined by cos(angle).
+        sl_cutoff_num_in: float
+            User specified number of cells to cutoff above sl_cutoff.
+        sl_cutoff_type_in: str
+            Method used to compute cutoff "Percent" or "Number".
+        sl_lag_effect_in: np.array(float)
+            Lag effect for each ensemble, in m.
+        snr_3beam_comp: bool
+            Indicates the use of 3-beam velocity computations when invalid SNR is found
+        wm_in: str
+            Watermode for TRDI or 'Variable' for SonTek.
+        blank_in: float
+            Blanking distance, in m.
+        corr_in: np.array(float)
+            Correlation values for water track. Optional.
+        surface_vel_in: np.array(float)
+            Surface velocity data for RiverRay, RiverPro, RioPro. Optional.
+        surface_rssi_in: np.array(float)
+            Returned acoust signal strength for RiverRay, RiverPro, RioPro.
+            Optional.
+        surface_corr_in: np.array(float)
+            Surface velocity correlations for RiverRay, RiverPro, RioPro.
+            Optional.
+        surface_num_cells_in: np.array(float)
+            Number of surface cells in each ensemble for RiverRay, RiverPro,
+            RioPro. Optional.
+        sl_cutoff_m: np.array(float)
+            Depth in meters of side lobe cutoff to center of cells.
+        ping_type: np.array(str)
+            Indicates type of ping used for water tracking
+        """
+
+        # Set object properties from input data standard for all ADCPs
+        if np.nanmean(freq_in) < 10:
+            self.frequency = freq_in * 1000
+        else:
+            self.frequency = freq_in
+
+        self.orig_coord_sys = coord_sys_in
+        self.coord_sys = coord_sys_in
+        self.orig_nav_ref = nav_ref_in
+        self.nav_ref = nav_ref_in
+        self.water_mode = wm_in
+        self.excluded_dist_m = excluded_dist_in
+        self.rssi_units = rssi_units_in
+        max_cells = cells_above_sl_in.shape[0]
+        self.ping_type = np.tile(np.array([ping_type]), (max_cells, 1))
+        self.use_measurement_thresholds = use_measurement_thresholds
+        self.snr_beam_velocities = None
+        self.snr_3beam_comp = snr_3beam_comp
+
+        # Set object properties that depend on the presence or absence of
+        # surface cells
+        if np.sum(surface_num_cells_in) > 0:
+            surface_num_cells_in[np.isnan(surface_num_cells_in)] = 0
+
+            num_ens = cells_above_sl_in.shape[1]
+            num_reg_cells = vel_in.shape[1]
+            max_surf_cells = max_cells - num_reg_cells
+
+            # Combine surface velocity bins and regular velocity bins into
+            # one matrix
+            self.raw_vel_mps = np.tile([np.nan], [4, max_cells, num_ens])
+            self.rssi = np.tile([np.nan], [4, max_cells, num_ens])
+            self.corr = np.tile([np.nan], [4, max_cells, num_ens])
+
+            if max_surf_cells > 0:
+                self.raw_vel_mps[:, :max_surf_cells, :] = surface_vel_in[
+                    :, :max_surf_cells, :
+                ]
+                self.rssi[:, :max_surf_cells, :] = surface_rssi_in[
+                    :, :max_surf_cells, :
+                ]
+                self.corr[:, :max_surf_cells, :] = surface_corr_in[
+                    :, :max_surf_cells, :
+                ]
+
+            for i_ens in range(num_ens):
+                self.raw_vel_mps[
+                    :,
+                    int(surface_num_cells_in[i_ens]) : int(surface_num_cells_in[i_ens])
+                    + num_reg_cells,
+                    i_ens,
+                ] = vel_in[:, :num_reg_cells, i_ens]
+                self.rssi[
+                    :,
+                    int(surface_num_cells_in[i_ens]) : int(surface_num_cells_in[i_ens])
+                    + num_reg_cells,
+                    i_ens,
+                ] = rssi_in[:, :num_reg_cells, i_ens]
+                self.corr[
+                    :,
+                    int(surface_num_cells_in[i_ens]) : int(surface_num_cells_in[i_ens])
+                    + num_reg_cells,
+                    i_ens,
+                ] = corr_in[:, :num_reg_cells, i_ens]
+                self.ping_type[: int(surface_num_cells_in[i_ens]), i_ens] = "S"
+        else:
+            # No surface cells
+            self.raw_vel_mps = vel_in
+            self.rssi = rssi_in
+            if corr_in.any():
+                self.corr = corr_in
+            else:
+                # No correlations input
+                self.corr = np.tile(np.nan, rssi_in.shape)
+
+        # TODO This doesn't seem correct. If raw data in beam coordinates
+        #  this is not correct.
+        self.u_mps = np.copy(self.raw_vel_mps)[0, :, :]
+        self.v_mps = np.copy(self.raw_vel_mps)[1, :, :]
+        self.w_mps = np.copy(self.raw_vel_mps)[2, :, :]
+        self.d_mps = np.copy(self.raw_vel_mps)[3, :, :]
+
+        self.water_mode = wm_in
+        self.excluded_dist_m = excluded_dist_in
+        self.orig_excluded_dist_m = excluded_dist_in
+
+        # In some rare situations the blank is empty so it is set to the
+        # excluded_dist_in
+        try:
+            blank_in = float(blank_in)
+            self.blanking_distance_m = blank_in
+        except ValueError:
+            self.blanking_distance_m = excluded_dist_in
+
+        self.cells_above_sl = cells_above_sl_in
+        self.cells_above_sl_bt = cells_above_sl_in
+        self.sl_cutoff_percent = sl_cutoff_per_in
+        self.sl_cutoff_number = sl_cutoff_num_in
+        self.sl_cutoff_type = sl_cutoff_type_in
+        self.sl_lag_effect_m = sl_lag_effect_in
+        self.sl_cutoff_m = sl_cutoff_m
+
+        # Set filter defaults to no filtering and no interruption
+        self.beam_filter = 3
+        self.d_filter = "Off"
+        self.d_filter_thresholds = {}
+        self.w_filter = "Off"
+        self.w_filter_thresholds = {}
+        self.smooth_filter = False
+        self.interpolate_ens = "None"
+        self.interpolate_cells = "None"
+
+        # Determine original valid
+
+        # Initialize valid data property
+        self.valid_data = np.tile(self.cells_above_sl, [9, 1, 1])
+
+        # Find invalid raw data
+        valid_vel = np.tile(self.cells_above_sl, [4, 1, 1])
+        valid_vel[np.isnan(self.raw_vel_mps)] = False
+
+        # Identify invalid velocity data (less than 3 valid beams)
+        valid_vel_sum = np.sum(valid_vel, axis=0)
+        valid_data2 = np.copy(self.cells_above_sl)
+        valid_data2[valid_vel_sum < 3] = False
+
+        # Set valid_data property for original data
+        self.valid_data[1, :, :] = valid_data2
+
+        # Combine all filter data to composite valid data
+        self.all_valid_data()
+
+        # Estimate the number of cells in invalid ensembles using
+        # Adjacent valid ensembles
+        valid_data_2_sum = np.nansum(self.valid_data[1], 0)
+        self.invalid_index = np.where(valid_data_2_sum == 0)[0]
+        n_invalid = len(self.invalid_index)
+        for n in range(n_invalid):
+            # Find first valid ensemble
+            idx1 = np.where(valid_data_2_sum[: self.invalid_index[n]] > 0)[0]
+            if len(idx1) > 0:
+                idx1 = idx1[0]
+            else:
+                idx1 = self.invalid_index[n]
+
+            # Find next valid ensemble
+            idx2 = np.where(valid_data_2_sum[: self.invalid_index[n]] > 0)[0]
+            if len(idx2) > 0:
+                idx2 = idx2[-1]
+            else:
+                idx2 = self.invalid_index[n]
+
+            # Estimate number of cells in invalid ensemble
+            self.num_invalid.append(
+                np.floor((valid_data_2_sum[idx1] + valid_data_2_sum[idx2]) / 2)
+            )
+
+        # Set processed data to non-interpolated valid data
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+        self.u_processed_mps[self.valid_data[0] == False] = np.nan
+        self.v_processed_mps[self.valid_data[0] == False] = np.nan
+
+        # Compute SNR range if SNR data is provided
+        if rssi_units_in == "SNR":
+            self.compute_snr_rng()
+
+    def populate_from_qrev_mat(self, transect):
+        """Populates the object using data from previously saved QRev Matlab
+         file.
+
+        Parameters
+        ----------
+        transect: mat_struct
+            Matlab data structure obtained from sio.loadmat
+        """
+
+        # Data requiring manipulation (special case for 1 ensemble or 1 cell)
+        if len(transect.wVel.rawVel_mps.shape) == 2:
+            if len(transect.boatVel.btVel.rawVel_mps.shape) > 1:
+                # Multiple ensembles with one cell
+                self.raw_vel_mps = np.moveaxis(transect.wVel.rawVel_mps, 1, 0)
+                self.raw_vel_mps = self.raw_vel_mps.reshape(
+                    self.raw_vel_mps.shape[0], 1, self.raw_vel_mps.shape[1]
+                )
+                self.corr = np.moveaxis(transect.wVel.corr, 1, 0)
+                self.corr = self.corr.reshape(self.corr.shape[0], 1, self.corr.shape[1])
+                self.rssi = np.moveaxis(transect.wVel.rssi, 1, 0)
+                self.rssi = self.rssi.reshape(self.rssi.shape[0], 1, self.rssi.shape[1])
+                self.valid_data = np.moveaxis(transect.wVel.validData, 1, 0)
+                self.valid_data = self.valid_data.reshape(
+                    self.valid_data.shape[0], 1, self.valid_data.shape[1]
+                )
+                self.u_earth_no_ref_mps = transect.wVel.uEarthNoRef_mps
+                self.u_earth_no_ref_mps = self.u_earth_no_ref_mps.reshape(
+                    1, self.u_earth_no_ref_mps.shape[0]
+                )
+                self.v_earth_no_ref_mps = transect.wVel.vEarthNoRef_mps
+                self.v_earth_no_ref_mps = self.v_earth_no_ref_mps.reshape(
+                    1, self.v_earth_no_ref_mps.shape[0]
+                )
+                self.u_mps = transect.wVel.u_mps
+                self.u_mps = self.u_mps.reshape(1, self.u_mps.shape[0])
+                self.v_mps = transect.wVel.v_mps
+                self.v_mps = self.v_mps.reshape(1, self.v_mps.shape[0])
+                self.u_processed_mps = transect.wVel.uProcessed_mps
+                self.u_processed_mps = self.u_processed_mps.reshape(
+                    1, self.u_processed_mps.shape[0]
+                )
+                self.v_processed_mps = transect.wVel.vProcessed_mps
+                self.v_processed_mps = self.v_processed_mps.reshape(
+                    1, self.v_processed_mps.shape[0]
+                )
+                self.w_mps = transect.wVel.w_mps
+                self.w_mps = self.w_mps.reshape(1, self.w_mps.shape[0])
+                self.d_mps = transect.wVel.d_mps
+                self.d_mps = self.d_mps.reshape(1, self.d_mps.shape[0])
+                # self.snr_rng = transect.wVel.snrRng
+                # self.snr_rng = self.snr_rng.reshape(1, self.snr_rng.shape[0])
+                self.cells_above_sl = transect.wVel.cellsAboveSL.astype(bool)
+                self.cells_above_sl = self.cells_above_sl.reshape(
+                    1, self.cells_above_sl.shape[0]
+                )
+                self.cells_above_sl_bt = transect.wVel.cellsAboveSLbt.astype(bool)
+                self.cells_above_sl_bt = self.cells_above_sl_bt.reshape(
+                    1, self.cells_above_sl_bt.shape[0]
+                )
+                self.sl_lag_effect_m = np.array([transect.wVel.slLagEffect_m])
+                # Ping type
+                if hasattr(transect.wVel, "ping_type"):
+                    if type(transect.wVel.ping_type) == str:
+                        self.ping_type = np.tile(
+                            transect.wVel.ping_type, self.d_mps.shape
+                        )
+                    else:
+                        self.ping_type = transect.wVel.ping_type[np.newaxis, :]
+
+                    self.ping_type = np.char.strip(self.ping_type)
+                else:
+                    self.ping_type = np.tile("U", self.d_mps.shape)
+            else:
+                # One ensemble with multiple cells
+                self.raw_vel_mps = np.moveaxis(transect.wVel.rawVel_mps, 1, 0)
+                self.raw_vel_mps = self.raw_vel_mps.reshape(
+                    self.raw_vel_mps.shape[0], self.raw_vel_mps.shape[1], 1
+                )
+                self.corr = np.moveaxis(transect.wVel.corr, 1, 0)
+                self.corr = self.corr.reshape(self.corr.shape[0], self.corr.shape[1], 1)
+                self.rssi = np.moveaxis(transect.wVel.rssi, 1, 0)
+                self.rssi = self.rssi.reshape(self.rssi.shape[0], self.rssi.shape[1], 1)
+                self.valid_data = np.moveaxis(transect.wVel.validData, 1, 0)
+                self.valid_data = self.valid_data.reshape(
+                    self.valid_data.shape[0], self.valid_data.shape[1], 1
+                )
+                self.u_earth_no_ref_mps = transect.wVel.uEarthNoRef_mps
+                self.u_earth_no_ref_mps = self.u_earth_no_ref_mps.reshape(
+                    self.u_earth_no_ref_mps.shape[0], 1
+                )
+                self.v_earth_no_ref_mps = transect.wVel.vEarthNoRef_mps
+                self.v_earth_no_ref_mps = self.v_earth_no_ref_mps.reshape(
+                    self.v_earth_no_ref_mps.shape[0], 1
+                )
+                self.u_mps = transect.wVel.u_mps
+                self.u_mps = self.u_mps.reshape(self.u_mps.shape[0], 1)
+                self.v_mps = transect.wVel.v_mps
+                self.v_mps = self.v_mps.reshape(self.v_mps.shape[0], 1)
+                self.u_processed_mps = transect.wVel.uProcessed_mps
+                self.u_processed_mps = self.u_processed_mps.reshape(
+                    self.u_processed_mps.shape[0], 1
+                )
+                self.v_processed_mps = transect.wVel.vProcessed_mps
+                self.v_processed_mps = self.v_processed_mps.reshape(
+                    self.v_processed_mps.shape[0], 1
+                )
+                self.w_mps = transect.wVel.w_mps
+                self.w_mps = self.w_mps.reshape(self.w_mps.shape[0], 1)
+                self.d_mps = transect.wVel.d_mps
+                self.d_mps = self.d_mps.reshape(self.d_mps.shape[0], 1)
+                # self.snr_rng = transect.wVel.snrRng
+                # self.snr_rng = self.snr_rng.reshape(self.snr_rng.shape[0], 1)
+                self.cells_above_sl = transect.wVel.cellsAboveSL.astype(bool)
+                self.cells_above_sl = self.cells_above_sl.reshape(
+                    self.cells_above_sl.shape[0], 1
+                )
+                self.cells_above_sl_bt = transect.wVel.cellsAboveSLbt.astype(bool)
+                self.cells_above_sl_bt = self.cells_above_sl_bt.reshape(
+                    self.cells_above_sl_bt.shape[0], 1
+                )
+                self.sl_lag_effect_m = np.array([transect.wVel.slLagEffect_m])
+                # Ping type
+                if hasattr(transect.wVel, "ping_type"):
+                    if type(transect.wVel.ping_type) == str:
+                        self.ping_type = np.tile(
+                            transect.wVel.ping_type, self.d_mps.shape
+                        )
+                    else:
+                        self.ping_type = transect.wVel.ping_type[:, np.newaxis]
+                    self.ping_type = np.char.strip(self.ping_type)
+                else:
+                    self.ping_type = np.tile("U", self.d_mps.shape)
+
+        else:
+            n_ensembles = transect.wVel.u_mps.shape[1]
+            n_cells = transect.wVel.u_mps.shape[0]
+            if (
+                transect.wVel.rawVel_mps.shape[2] != n_ensembles
+                or transect.wVel.rawVel_mps.shape[1] != n_cells
+            ):
+                self.raw_vel_mps = np.moveaxis(transect.wVel.rawVel_mps, 2, 0)
+            else:
+                self.raw_vel_mps = transect.wVel.rawVel_mps
+
+            if (
+                transect.wVel.corr.shape[2] != n_ensembles
+                or transect.wVel.corr.shape[1] != n_cells
+            ):
+                self.corr = np.moveaxis(transect.wVel.corr, 2, 0)
+            else:
+                self.corr = transect.wVel.corr
+
+            if (
+                transect.wVel.rssi.shape[2] != n_ensembles
+                or transect.wVel.rssi.shape[1] != n_cells
+            ):
+                self.rssi = np.moveaxis(transect.wVel.rssi, 2, 0)
+            else:
+                self.rssi = transect.wVel.rssi
+
+            if (
+                transect.wVel.validData.shape[2] != n_ensembles
+                or transect.wVel.validData.shape[1] != n_cells
+            ):
+                self.valid_data = np.moveaxis(transect.wVel.validData, 2, 0)
+            else:
+                self.valid_data = transect.wVel.validData
+            self.u_earth_no_ref_mps = transect.wVel.uEarthNoRef_mps
+            self.v_earth_no_ref_mps = transect.wVel.vEarthNoRef_mps
+            self.u_mps = transect.wVel.u_mps
+            self.v_mps = transect.wVel.v_mps
+            self.u_processed_mps = transect.wVel.uProcessed_mps
+            self.v_processed_mps = transect.wVel.vProcessed_mps
+            self.w_mps = transect.wVel.w_mps
+            self.d_mps = transect.wVel.d_mps
+            # self.snr_rng = transect.wVel.snrRng
+            self.cells_above_sl = transect.wVel.cellsAboveSL.astype(bool)
+            self.cells_above_sl_bt = transect.wVel.cellsAboveSLbt.astype(bool)
+            self.sl_lag_effect_m = transect.wVel.slLagEffect_m
+            # Ping type
+            if hasattr(transect.wVel, "ping_type"):
+                if type(transect.wVel.ping_type) == str:
+                    self.ping_type = np.tile(transect.wVel.ping_type, self.d_mps.shape)
+                else:
+                    self.ping_type = transect.wVel.ping_type
+                self.ping_type = np.char.strip(self.ping_type)
+            else:
+                self.ping_type = np.tile("U", self.d_mps.shape)
+
+        self.valid_data = self.valid_data.astype(bool)
+        self.frequency = transect.wVel.frequency
+        self.orig_coord_sys = transect.wVel.origCoordSys
+        self.orig_nav_ref = transect.wVel.origNavRef
+        self.rssi_units = transect.wVel.rssiUnits
+        self.water_mode = transect.wVel.waterMode
+        self.blanking_distance_m = transect.wVel.blankingDistance_m
+        self.invalid_index = transect.wVel.invalidIndex
+        if type(transect.wVel.numInvalid) is np.ndarray:
+            self.num_invalid = transect.wVel.numInvalid.tolist()
+        else:
+            self.num_invalid = transect.wVel.numInvalid
+
+        # Settings
+        self.beam_filter = transect.wVel.beamFilter
+        self.d_filter = transect.wVel.dFilter
+        self.d_filter_thresholds = self.struct_to_dict(transect.wVel.dFilterThreshold)
+        self.w_filter = transect.wVel.wFilter
+        self.w_filter_thresholds = self.struct_to_dict(transect.wVel.wFilterThreshold)
+        self.excluded_dist_m = transect.wVel.excludedDist
+        if hasattr(transect.wVel, "orig_excludedDist"):
+            self.orig_excluded_dist_m = transect.wVel.orig_excludedDist
+        else:
+            self.orig_excluded_dist_m = transect.wVel.excludedDist
+        self.smooth_filter = transect.wVel.smoothFilter
+        self.smooth_speed = transect.wVel.smoothSpeed
+        self.smooth_upper_limit = transect.wVel.smoothUpperLimit
+        self.smooth_lower_limit = transect.wVel.smoothLowerLimit
+        self.snr_filter = transect.wVel.snrFilter
+        self.wt_depth_filter = transect.wVel.wtDepthFilter
+        self.interpolate_ens = transect.wVel.interpolateEns
+        self.interpolate_cells = transect.wVel.interpolateCells
+        self.coord_sys = transect.wVel.coordSys
+        self.nav_ref = transect.wVel.navRef
+        self.sl_cutoff_percent = transect.wVel.slCutoffPer
+        self.sl_cutoff_number = transect.wVel.slCutoffNum
+        self.sl_cutoff_type = transect.wVel.slCutoffType
+
+        # Use measurement for filter
+        if hasattr(transect.wVel, "use_measurement_thresholds"):
+            self.use_measurement_thresholds = self.struct_to_dict(
+                transect.wVel.use_measurement_thresholds
+            )
+            self.d_meas_thresholds = self.struct_to_dict(
+                transect.wVel.d_meas_thresholds
+            )
+            self.w_meas_thresholds = self.struct_to_dict(
+                transect.wVel.w_meas_thresholds
+            )
+        else:
+            self.use_measurement_thresholds = False
+            self.d_meas_thresholds = {}
+            self.w_meas_thresholds = {}
+
+    @staticmethod
+    def struct_to_dict(struct):
+        """If input is a mat structure it converts it into a dictionary.
+
+        Parameters
+        ----------
+        struct: mat.struct or other
+            Data to be converted
+
+        Returns
+        -------
+        result: dict or other
+            Result of conversion
+        """
+
+        try:
+            keys = struct._fieldnames
+            result = {}
+            for key in keys:
+                result[key] = struct.__dict__[key]
+        except AttributeError:
+            result = struct
+        return result
+
+    def change_coord_sys(self, new_coord_sys, sensors, adcp):
+        """This function allows the coordinate system to be changed.
+
+        Current implementation is only to allow a change to a higher order
+        coordinate system Beam - Inst - Ship - Earth
+
+        Parameters
+        ----------
+        new_coord_sys: str
+            New coordinate system (Beam, Inst, Ship, Earth)
+        sensors: Sensors
+            Object of Sensors
+        adcp: InstrumentData
+            Object of instrument data
+        """
+
+        if type(self.orig_coord_sys) is list or type(self.orig_coord_sys) is np.ndarray:
+            o_coord_sys = self.orig_coord_sys[0].strip()
+        else:
+            o_coord_sys = self.orig_coord_sys.strip()
+
+        if self.snr_beam_velocities is None:
+            data = self.raw_vel_mps
+        else:
+            data = self.snr_beam_velocities
+            o_coord_sys = "Beam"
+
+        orig_sys = None
+        new_sys = None
+
+        if o_coord_sys != new_coord_sys:
+
+            # Assign the transformation matrix and retrieve the sensor data
+            t_matrix = copy.deepcopy(adcp.t_matrix.matrix)
+            t_matrix_freq = copy.deepcopy(adcp.frequency_khz)
+
+            p = getattr(sensors.pitch_deg, sensors.pitch_deg.selected).data
+            r = getattr(sensors.roll_deg, sensors.roll_deg.selected).data
+            h = getattr(sensors.heading_deg, sensors.heading_deg.selected).data
+
+            # Modify the transformation matrix and heading, pitch
+            # and roll values based on the original coordinate
+            # system so that only the needed values ar used in
+            # computing the new coordinate system.
+            if o_coord_sys.strip() == "Beam":
+                orig_sys = 1
+            elif o_coord_sys.strip() == "Inst":
+                orig_sys = 2
+            elif o_coord_sys.strip() == "Ship":
+                orig_sys = 3
+                p = np.zeros(h.shape)
+                r = np.zeros(h.shape)
+            elif o_coord_sys.strip() == "Earth":
+                orig_sys = 4
+
+            # Assign a value to the new coordinate system
+            if new_coord_sys.strip() == "Beam":
+                new_sys = 1
+            elif new_coord_sys.strip() == "Inst":
+                new_sys = 2
+            elif new_coord_sys.strip() == "Ship":
+                new_sys = 3
+            elif new_coord_sys.strip() == "Earth":
+                new_sys = 4
+
+            # Check to ensure the new coordinate system is a higher order than
+            # the original system
+            if new_sys - orig_sys > 0:
+
+                # Compute trig function for heaing, pitch and roll
+                ch = np.cos(np.deg2rad(h))
+                sh = np.sin(np.deg2rad(h))
+                cp = np.cos(np.deg2rad(p))
+                sp = np.sin(np.deg2rad(p))
+                cr = np.cos(np.deg2rad(r))
+                sr = np.sin(np.deg2rad(r))
+
+                n_ens = self.raw_vel_mps.shape[2]
+
+                for ii in range(n_ens):
+
+                    # Compute matrix for heading, pitch, and roll
+                    hpr_matrix = np.array(
+                        [
+                            [
+                                ((ch[ii] * cr[ii]) + (sh[ii] * sp[ii] * sr[ii])),
+                                (sh[ii] * cp[ii]),
+                                ((ch[ii] * sr[ii]) - sh[ii] * sp[ii] * cr[ii]),
+                            ],
+                            [
+                                (-1 * sh[ii] * cr[ii]) + (ch[ii] * sp[ii] * sr[ii]),
+                                ch[ii] * cp[ii],
+                                (-1 * sh[ii] * sr[ii]) - (ch[ii] * sp[ii] * cr[ii]),
+                            ],
+                            [(-1.0 * cp[ii] * sr[ii]), sp[ii], cp[ii] * cr[ii]],
+                        ]
+                    )
+
+                    # Transform beam coordinates
+                    if o_coord_sys == "Beam":
+
+                        # Determine frequency index for transformation
+                        if len(t_matrix.shape) > 2:
+                            idx_freq = np.where(t_matrix_freq == self.frequency[ii])
+                            t_mult = np.copy(np.squeeze(t_matrix[:, :, idx_freq[0][0]]))
+                        else:
+                            t_mult = np.copy(t_matrix)
+
+                        # Get velocity data
+                        vel_beams = np.copy(data[:, :, ii])
+
+                        # Apply transformation matrix for 4 beam solutions
+                        temp_t = t_mult.dot(vel_beams)
+
+                        # Apply hpr_matrix
+                        temp_thpr = hpr_matrix.dot(temp_t[:3])
+                        temp_thpr = np.vstack([temp_thpr, temp_t[3]])
+
+                        # Check for invalid beams
+                        invalid_idx = np.isnan(vel_beams)
+
+                        # Identify rows requiring 3 beam solutions
+                        n_invalid_col = np.sum(invalid_idx, axis=0)
+                        col_idx = np.where(n_invalid_col == 1)[0]
+
+                        # Compute 3 beam solution, if necessary
+                        if len(col_idx) > 0:
+                            for i3 in range(len(col_idx)):
+                                # Id invalid beam
+                                vel_3_beam = vel_beams[:, col_idx[i3]]
+                                idx_3_beam = np.where(np.isnan(vel_3_beam))[0]
+
+                                # 3 beam solution for non-RiverRay
+                                vel_3_beam_zero = vel_3_beam
+                                vel_3_beam_zero[np.isnan(vel_3_beam)] = 0
+                                vel_error = t_mult[3, :].dot(vel_3_beam_zero)
+                                vel_3_beam[idx_3_beam] = (
+                                    -1 * vel_error / t_mult[3, idx_3_beam]
+                                )
+                                temp_t = t_mult.dot(vel_3_beam)
+
+                                # Apply transformation matrix for 3
+                                # beam solutions
+                                temp_thpr[0:3, col_idx[i3]] = hpr_matrix.dot(temp_t[:3])
+                                temp_thpr[3, col_idx[i3]] = np.nan
+
+                    else:
+                        # Get velocity data
+                        vel_raw = np.copy(np.squeeze(self.raw_vel_mps[:, :, ii]))
+                        temp_thpr = np.array(hpr_matrix).dot(vel_raw[:3, :])
+                        temp_thpr = np.vstack([temp_thpr, vel_raw[3, :]])
+
+                    # Update object
+                    temp_thpr = temp_thpr.T
+                    self.u_mps[:, ii] = temp_thpr[:, 0]
+                    self.v_mps[:, ii] = temp_thpr[:, 1]
+                    self.w_mps[:, ii] = temp_thpr[:, 2]
+                    self.d_mps[:, ii] = temp_thpr[:, 3]
+
+                # Because of padded arrays with zeros and RR has a variable
+                # number of bins, the raw data may be padded with zeros.  The next 4
+                # statements changes those to nan
+                find_padded = (
+                    np.abs(self.u_mps)
+                    + np.abs(self.v_mps)
+                    + np.abs(self.w_mps)
+                    + np.abs(self.d_mps)
+                )
+                self.u_mps[find_padded == 0] = np.nan
+                self.v_mps[find_padded == 0] = np.nan
+                self.w_mps[find_padded == 0] = np.nan
+                self.d_mps[find_padded == 0] = np.nan
+
+                # Assign processed object properties
+                self.u_processed_mps = np.copy(self.u_mps)
+                self.v_processed_mps = np.copy(self.v_mps)
+
+                # Assign coordinate system and reference properties
+                self.coord_sys = new_coord_sys
+                self.nav_ref = self.orig_nav_ref
+
+            else:
+
+                # Reset velocity properties to raw values
+                self.u_mps = np.copy(self.raw_vel_mps[0])
+                self.v_mps = np.copy(self.raw_vel_mps[1])
+                self.w_mps = np.copy(self.raw_vel_mps[2])
+                self.d_mps = np.copy(self.raw_vel_mps[3])
+
+                if adcp.manufacturer == "TRDI":
+                    find_padded = (
+                        np.abs(self.u_mps)
+                        + np.abs(self.v_mps)
+                        + np.abs(self.w_mps)
+                        + np.abs(self.d_mps)
+                    )
+                    self.u_mps[find_padded == 0] = np.nan
+                    self.v_mps[find_padded == 0] = np.nan
+                    self.w_mps[find_padded == 0] = np.nan
+                    self.d_mps[find_padded == 0] = np.nan
+
+                # Assign processed properties
+                self.u_processed_mps = np.copy(self.u_mps)
+                self.v_processed_mps = np.copy(self.v_mps)
+
+        else:
+
+            # Reset velocity properties to raw values
+            self.u_mps = np.copy(self.raw_vel_mps[0])
+            self.v_mps = np.copy(self.raw_vel_mps[1])
+            self.w_mps = np.copy(self.raw_vel_mps[2])
+            self.d_mps = np.copy(self.raw_vel_mps[3])
+
+            if adcp.manufacturer == "TRDI":
+                find_padded = (
+                    np.abs(self.u_mps)
+                    + np.abs(self.v_mps)
+                    + np.abs(self.w_mps)
+                    + np.abs(self.d_mps)
+                )
+                self.u_mps[find_padded == 0] = np.nan
+                self.v_mps[find_padded == 0] = np.nan
+                self.w_mps[find_padded == 0] = np.nan
+                self.d_mps[find_padded == 0] = np.nan
+
+            # Assign processed properties
+            self.u_processed_mps = np.copy(self.u_mps)
+            self.v_processed_mps = np.copy(self.v_mps)
+
+        if new_coord_sys == "Earth":
+            self.u_earth_no_ref_mps = np.copy(self.u_mps)
+            self.v_earth_no_ref_mps = np.copy(self.v_mps)
+
+    @staticmethod
+    def earth_to_beam(w_vel, sensors, adcp):
+
+        # Create matrix to store results
+        vel_beam = np.tile(np.nan, w_vel.raw_vel_mps.shape)
+
+        # Assign the transformation matrix retrieve the sensor data
+        t_matrix = copy.deepcopy(adcp.t_matrix.matrix)
+        t_matrix_freq = copy.deepcopy(adcp.frequency_khz)
+
+        # Retrieve the sensor data
+        p = getattr(sensors.pitch_deg, sensors.pitch_deg.selected).data
+        r = getattr(sensors.roll_deg, sensors.roll_deg.selected).data
+        h = getattr(sensors.heading_deg, sensors.heading_deg.selected).data
+
+        # Compute trig function for heading, pitch and roll
+        ch = np.cos(np.deg2rad(h))
+        sh = np.sin(np.deg2rad(h))
+        cp = np.cos(np.deg2rad(p))
+        sp = np.sin(np.deg2rad(p))
+        cr = np.cos(np.deg2rad(r))
+        sr = np.sin(np.deg2rad(r))
+
+        # Process each ensemble
+        n_ens = w_vel.raw_vel_mps.shape[2]
+        for ii in range(n_ens):
+
+            # Compute matrix for heading, pitch, and roll
+            hpr_matrix = np.array([
+                [((ch[ii] * cr[ii]) + (sh[ii] * sp[ii] * sr[ii])), (sh[ii] * cp[ii]),
+                    ((ch[ii] * sr[ii]) - sh[ii] * sp[ii] * cr[ii]), ],
+                [(-1 * sh[ii] * cr[ii]) + (ch[ii] * sp[ii] * sr[ii]), ch[ii] * cp[ii],
+                 (-1 * sh[ii] * sr[ii]) - (ch[ii] * sp[ii] * cr[ii]), ],
+                [(-1.0 * cp[ii] * sr[ii]), sp[ii], cp[ii] * cr[ii]], ])
+
+            # Determine frequency index for transformation
+            if len(t_matrix.shape) > 2:
+                idx_freq = np.where(t_matrix_freq == w_vel.frequency[ii])
+                t_mult = np.copy(np.squeeze(t_matrix[:, :, idx_freq[0][0]]))
+            else:
+                t_mult = np.copy(t_matrix)
+
+            # Construct earth velocity matrix for ensemble
+            vel_enu = np.vstack([w_vel.u_earth_no_ref_mps[:, ii],
+                                 w_vel.v_earth_no_ref_mps[:, ii],
+                                 w_vel.w_mps[:, ii],
+                                 w_vel.d_mps[:, ii]])
+
+            # Compute beam velocities
+            vel_xyz = np.copy(vel_enu)
+            vel_xyz[0:3, :] = np.matmul(np.linalg.inv(hpr_matrix), vel_enu[:3])
+            vel_beam[:, :, ii] = np.matmul(np.linalg.inv(t_mult), vel_xyz)
+
+        return vel_beam
+
+    def set_nav_reference(self, boat_vel):
+        """This function sets the navigation reference.
+
+        The current reference is first removed from the velocity and then the
+        selected reference is applied.
+
+        Parameters
+        ----------
+        boat_vel: BoatStructure
+            Object of BoatStructure
+        """
+
+        # Apply selected navigation reference
+        boat_select = getattr(boat_vel, boat_vel.selected)
+        if boat_select is not None:
+            self.u_mps = np.add(self.u_earth_no_ref_mps, boat_select.u_processed_mps)
+            self.v_mps = np.add(self.v_earth_no_ref_mps, boat_select.v_processed_mps)
+            self.nav_ref = boat_select.nav_ref
+        else:
+            self.u_mps = repmat(
+                [np.nan],
+                self.u_earth_no_ref_mps.shape[0],
+                self.u_earth_no_ref_mps.shape[1],
+            )
+            self.v_mps = repmat(
+                [np.nan],
+                self.v_earth_no_ref_mps.shape[0],
+                self.v_earth_no_ref_mps.shape[1],
+            )
+            if boat_vel.selected == "bt_vel":
+                self.nav_ref = "BT"
+            elif boat_vel.selected == "gga_vel":
+                self.nav_ref = "GGA"
+            elif boat_vel.selected == "vtg_vel":
+                self.nav_ref = "VTG"
+
+        valid_data2 = np.copy(self.cells_above_sl)
+        valid_data2[np.isnan(self.u_mps)] = False
+        self.valid_data[1] = valid_data2
+
+        # Duplicate original to other filters that have yet to be applied
+        self.valid_data[2:] = np.tile(self.valid_data[1], [7, 1, 1])
+
+        # Combine all filter data and update processed properties
+        self.all_valid_data()
+
+    def change_heading(self, boat_vel, heading_chng):
+        """Adjusts the velocity vectors for a change in heading due change in
+        magnetic variation or heading offset.
+
+        Parameters
+        ----------
+        boat_vel: BoatData
+            Object of BoatData
+        heading_chng: float
+            Heading change due to change in magvar or offset, in degrees.
+        """
+        u_nr = self.u_earth_no_ref_mps
+        v_nr = self.v_earth_no_ref_mps
+        direction, mag = cart2pol(u_nr, v_nr)
+        u_nr_rotated, v_nr_rotated = pol2cart(direction - np.deg2rad(heading_chng), mag)
+        self.u_earth_no_ref_mps = u_nr_rotated
+        self.v_earth_no_ref_mps = v_nr_rotated
+
+        # Reprocess water data to get navigation reference corrected velocities
+        self.set_nav_reference(boat_vel)
+
+    def change_heading_source(self, boat_vel, heading):
+        """Applies changes to water velocity when the heading source is
+        changed.
+
+        Typically called when the heading source is changed between external
+        and internal.
+
+        Parameters
+        ----------
+        boat_vel: BoatData
+            Object of BoatData
+        heading: np.array(float)
+            New heading data, in degrees
+        """
+        u_nr = self.u_earth_no_ref_mps
+        v_nr = self.v_earth_no_ref_mps
+        direction, mag = cart2pol(u_nr, v_nr)
+        u_nr_rotated, v_nr_rotated = pol2cart(
+            direction - np.deg2rad(repmat(heading, len(mag), 1)), mag
+        )
+        self.u_earth_no_ref_mps = u_nr_rotated
+        self.v_earth_no_ref_mps = v_nr_rotated
+
+        self.set_nav_reference(boat_vel)
+
+    def apply_interpolation(self, transect, ens_interp="None", cells_interp="None"):
+        """Coordinates the application of water velocity interpolation.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        ens_interp: str
+            Specifies type of interpolation for ensembles
+        cells_interp: str
+            Specifies type of interpolation for cells
+        """
+
+        self.u_processed_mps = np.tile([np.nan], self.u_mps.shape)
+        self.v_processed_mps = np.tile([np.nan], self.v_mps.shape)
+        self.u_processed_mps[self.valid_data[0]] = self.u_mps[self.valid_data[0]]
+        self.v_processed_mps[self.valid_data[0]] = self.v_mps[self.valid_data[0]]
+
+        # Determine interpolation methods to apply
+        if ens_interp == "None":
+            ens_interp = self.interpolate_ens
+        else:
+            self.interpolate_ens = ens_interp
+
+        if cells_interp == "None":
+            cells_interp = self.interpolate_cells
+        else:
+            self.interpolate_cells = cells_interp
+
+        if ens_interp == "abba" or cells_interp == "abba":
+            self.interpolate_ens = "abba"
+            self.interpolate_cells = "abba"
+            self.interpolate_abba(transect)
+        else:
+            if ens_interp == "None":
+                # Sets invalid data to nan with no interpolation
+                self.interpolate_ens_none()
+            elif ens_interp == "ExpandedT":
+                # Sets interpolate to None as the interpolation is done in
+                # class QComp
+                self.interpolate_ens_next()
+            elif ens_interp == "Hold9":
+                # Interpolates using SonTek's method of holding last valid
+                # for up to 9 samples
+                self.interpolate_ens_hold_last_9()
+            elif ens_interp == "Hold":
+                # Interpolates by holding last valid indefinitely
+                self.interpolate_ens_hold_last()
+            elif ens_interp == "Linear":
+                # Interpolates using linear interpolation
+                self.interpolate_ens_linear(transect)
+            elif ens_interp == "TRDI":
+                # TRDI is applied in discharge
+                self.interpolate_ens_none()
+                self.interpolate_ens = ens_interp
+
+            # Apply specified cell interpolation method
+            if cells_interp == "None":
+                # Sets invalid data to nan with no interpolation
+                self.interpolate_cells_none()
+            elif cells_interp == "TRDI":
+                # Use TRDI method to interpolate invalid interior cells
+                self.interpolate_cells_trdi(transect)
+            elif cells_interp == "Linear":
+                # Uses linear interpolation to interpolate velocity for all
+                # invalid bins including those in invalid ensembles
+                # up to 9 samples
+                self.interpolate_cells_linear(transect)
+
+    def apply_filter(
+        self,
+        transect,
+        beam=None,
+        difference=None,
+        difference_threshold=None,
+        vertical=None,
+        vertical_threshold=None,
+        other=None,
+        excluded=None,
+        snr=None,
+        wt_depth=None,
+    ):
+        """Coordinates application of specified filters and subsequent
+        interpolation.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        beam: int
+            Setting for beam filter (3, 4, or -1)
+        difference: str
+            Setting for difference filter (Auto, Off, Manual)
+        difference_threshold: float
+            Threshold value for Manual setting.
+        vertical: str
+            Setting for vertical filter (Auto, Off, Manual)
+        vertical_threshold: float
+            Threshold value for Manual setting.
+        other:
+            Setting for other filters (Off, Auto)
+        excluded:
+            Excluded distance below the transducer, in m
+        snr: str
+            SNR filter setting (Auto, Off)
+        wt_depth: bool
+            Setting for marking water data invalid if no available depth
+        """
+
+        # Determine filters to apply
+        if (
+            len(
+                {
+                    beam,
+                    difference,
+                    difference_threshold,
+                    vertical,
+                    vertical_threshold,
+                    other,
+                    excluded,
+                    snr,
+                    wt_depth,
+                }
+            )
+            > 1
+        ):
+
+            # Because the snr filter may apply 3-beam solutions the result
+            # could affect other filters, thus it should be run first
+            if snr is not None:
+                self.filter_snr(transect=transect, setting=snr)
+            if difference is not None:
+                if difference == "Manual":
+                    self.filter_diff_vel(
+                        setting=difference, threshold=difference_threshold
+                    )
+                else:
+                    self.filter_diff_vel(setting=difference)
+            if vertical is not None:
+                if vertical == "Manual":
+                    self.filter_vert_vel(setting=vertical, threshold=vertical_threshold)
+                else:
+                    self.filter_vert_vel(setting=vertical)
+            if other is not None:
+                self.filter_smooth(transect=transect, setting=other)
+            if excluded is not None:
+                self.filter_excluded(transect=transect, setting=excluded)
+            if wt_depth is not None:
+                self.filter_wt_depth(transect=transect, setting=wt_depth)
+            if beam is not None:
+                self.filter_beam(setting=beam, transect=transect)
+        else:
+            self.filter_snr(transect=transect, setting=self.snr_filter)
+            self.filter_diff_vel(
+                setting=self.d_filter, threshold=self.d_filter_thresholds
+            )
+            self.filter_vert_vel(
+                setting=self.w_filter, threshold=self.w_filter_thresholds
+            )
+            self.filter_smooth(transect=transect, setting=self.smooth_filter)
+            self.filter_excluded(transect=transect, setting=self.excluded_dist_m)
+            self.filter_beam(setting=self.beam_filter, transect=transect)
+
+    def sos_correction(self, ratio):
+        """Corrects water velocities for a change in speed of sound.
+
+        Parameters
+        ----------
+        ratio: float
+            Ratio of new speed of sound to old speed of sound
+        """
+
+        # Correct water velocities
+        self.u_mps = self.u_mps * ratio
+        self.v_mps = self.v_mps * ratio
+        self.w_mps = self.w_mps * ratio
+        self.u_earth_no_ref_mps = self.u_earth_no_ref_mps * ratio
+        self.v_earth_no_ref_mps = self.v_earth_no_ref_mps * ratio
+
+    def adjust_side_lobe(self, transect):
+        """Adjust the side lobe cutoff for vertical beam and interpolated
+        depths.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        selected = transect.depths.selected
+        depth_selected = getattr(transect.depths, transect.depths.selected)
+        cells_above_slbt = np.copy(self.cells_above_sl_bt)
+
+        # Compute cutoff for vertical beam depths
+        if selected == "vb_depths":
+            sl_cutoff_vb = (
+                (depth_selected.depth_processed_m - depth_selected.draft_use_m)
+                * np.cos(np.deg2rad(transect.adcp.beam_angle_deg))
+                - self.sl_lag_effect_m
+                + depth_selected.draft_use_m
+            )
+            cells_above_slvb = np.round(
+                depth_selected.depth_cell_depth_m, 2
+            ) < np.round(sl_cutoff_vb, 2)
+            idx = np.where(transect.depths.bt_depths.valid_data == False)
+            cells_above_slbt[:, idx] = cells_above_slvb[:, idx]
+            cells_above_sl = np.logical_and(cells_above_slbt, cells_above_slvb)
+        else:
+            cells_above_sl = cells_above_slbt
+
+        # Compute cutoff from interpolated depths
+        valid_beams = depth_selected.depth_beams_m > 0
+        n_valid_beams = np.nansum(valid_beams, 0)
+        # n_valid_beams = np.nansum(depth_selected.valid_beams, 0)
+
+        # Find ensembles with no valid beam depths
+        idx = np.where(n_valid_beams == 0)[0]
+
+        # Determine side lobe cutoff for ensembles with no valid beam depths
+        if len(idx) > 0:
+            if len(self.sl_lag_effect_m) > 1:
+                sl_lag_effect_m = self.sl_lag_effect_m[idx]
+            else:
+                sl_lag_effect_m = self.sl_lag_effect_m
+
+            sl_cutoff_int = (
+                (depth_selected.depth_processed_m[idx] - depth_selected.draft_use_m)
+                * np.cos(np.deg2rad(transect.adcp.beam_angle_deg))
+                - sl_lag_effect_m
+                + depth_selected.draft_use_m
+            )
+            for i in range(len(idx)):
+                cells_above_sl[:, idx[i]] = np.less(
+                    depth_selected.depth_cell_depth_m[:, idx[i]], sl_cutoff_int[i]
+                )
+
+        # Find ensembles with at least 1 invalid beam depth
+        idx = np.where(np.logical_and(n_valid_beams < 4, n_valid_beams > 0))[0]
+        if len(idx) > 0:
+            if len(self.sl_lag_effect_m) > 1:
+                sl_lag_effect_m = self.sl_lag_effect_m[idx]
+            else:
+                sl_lag_effect_m = self.sl_lag_effect_m
+
+            sl_cutoff_int = (
+                (depth_selected.depth_processed_m[idx] - depth_selected.draft_use_m)
+                * np.cos(np.deg2rad(transect.adcp.beam_angle_deg))
+                - sl_lag_effect_m
+                + depth_selected.draft_use_m
+            )
+            cells_above_sl_int = np.tile(True, cells_above_sl.shape)
+
+            for i in range(len(idx)):
+                cells_above_sl_int[:, idx[i]] = np.less(
+                    depth_selected.depth_cell_depth_m[:, idx[i]], sl_cutoff_int[i]
+                )
+
+            cells_above_sl[cells_above_sl_int == 0] = 0
+
+        self.cells_above_sl = np.copy(cells_above_sl)
+        valid_vel = np.logical_not(np.isnan(self.u_mps))
+        self.valid_data[1, :, :] = self.cells_above_sl * valid_vel
+        self.all_valid_data()
+        self.compute_snr_rng()
+        self.apply_filter(transect)
+
+    def all_valid_data(self):
+        """Combines the results of all filters to determine a final set of
+        valid data"""
+
+        n_filters = len(self.valid_data[1:, 0, 0])
+
+        # Since invalid SNR are replaced with 3-beam solutions
+        # set these values to true as they will not need interpolation
+        valid_data = np.copy(self.valid_data)
+        if self.snr_3beam_comp:
+            valid_data[7, :, :] = True
+
+        sum_filters = np.nansum(valid_data[1:, :, :], 0) / n_filters
+        valid = np.tile([True], self.cells_above_sl.shape)
+        valid[sum_filters < 1] = False
+        self.valid_data[0] = valid
+
+    def filter_beam(self, setting, transect=None):
+        """Applies beam filter to water velocity data.
+
+        The determination of invalid data depends on whether 3-beam or
+        4-beam solutions are acceptable.  This function can be applied by
+        specifying 3 or 4 beam solutions and setting self.beam_filter to -1
+        which will trigger an automatic mode.  The automatic mode will find
+        all 3 beam solutions and them compare the velocity of the 3 beam
+        solutions to nearest 4 beam solutions.  If the 3 beam solution is
+        within 50% of the average of the neighboring 4 beam solutions the
+        data are deemed valid, if not they are marked invalid.  Thus in
+        automatic mode only those data from 3 beam solutions that are
+        sufficiently different from  the 4 beam solutions are marked
+        invalid. If the number of beams is specified manually, it is applied
+        uniformly for the whole transect.
+
+        Parameters
+        ----------
+        setting: int
+            Setting for beam filter (3, 4, or -1)
+        transect: TransectData
+            Object of TransectData
+        """
+
+        self.beam_filter = setting
+
+        # In manual mode (3 or 4) determine number of raw invalid and number
+        # of 2 beam solutions
+        if self.beam_filter > 0:
+
+            # Find invalid raw data
+            valid_vel = np.array([self.cells_above_sl] * 4)
+            if self.snr_beam_velocities is None:
+                valid_vel[np.isnan(self.raw_vel_mps)] = 0
+            else:
+                valid_vel[np.isnan(self.snr_beam_velocities)] = 0
+            # Determine how many beams or transformed coordinates are valid
+            valid_vel_sum = np.sum(valid_vel, 0)
+            valid = copy.deepcopy(self.cells_above_sl)
+
+            # Compare number of valid beams or velocity coordinates to
+            # filter value
+            valid[
+                np.logical_and((valid_vel_sum < self.beam_filter), (valid_vel_sum > 2))
+            ] = False
+
+            # Save logical of valid data to object
+            self.valid_data[5, :, :] = valid
+
+            # Combine all filter data and update processed properties
+            self.all_valid_data()
+
+        else:
+
+            # Apply automatic filter
+            self.automatic_beam_filter_abba_interpolation(transect)
+
+    def automatic_beam_filter_abba_interpolation(self, transect):
+        """Applies abba interpolation to allow comparison of interpolated and
+        3-beam solutions.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        # Create array indicating which cells do not have 4-beam solutions
+        # and all cells below side lobe are nan
+        temp = copy.deepcopy(self)
+        temp.filter_beam(4)
+        valid_bool = temp.valid_data[5, :, :]
+        valid = valid_bool.astype(float)
+        valid[np.logical_not(temp.cells_above_sl)] = 0
+        valid[np.logical_not(temp.valid_data[1, :, :])] = 0
+
+        # Initialize processed velocity data variables
+        temp.u_processed_mps = copy.deepcopy(temp.u_mps)
+        temp.v_processed_mps = copy.deepcopy(temp.v_mps)
+
+        # Set invalid data to nan in processed velocity data variables
+        temp.u_processed_mps[np.logical_not(valid)] = np.nan
+        temp.v_processed_mps[np.logical_not(valid)] = np.nan
+
+        # Find indices of cells with 3 beams solutions
+        rows_3b, cols_3b = np.where(np.abs(valid) == 0)
+
+        # Check for presence of 3-beam solutions
+        if len(rows_3b) > 0:
+            # Initialize velocity data variables
+            u = copy.deepcopy(self.u_mps)
+            v = copy.deepcopy(self.v_mps)
+
+            u = u[:, transect.in_transect_idx]
+            v = v[:, transect.in_transect_idx]
+
+            u[np.logical_not(temp.valid_data[5, :, :])] = np.nan
+            v[np.logical_not(temp.valid_data[5, :, :])] = np.nan
+            interpolated_data = self.compute_abba_interpolation(
+                wt_data=temp,
+                data_list=[u, v],
+                valid=valid,
+                transect=transect,
+            )
+
+            if interpolated_data is not None:
+                # Compute interpolated to measured ratios and apply filter
+                # criteria
+                for n in range(len(interpolated_data[0])):
+                    u_ratio = (
+                        temp.u_mps[interpolated_data[0][n][0]]
+                        / interpolated_data[0][n][1]
+                    ) - 1
+                    v_ratio = (
+                        temp.v_mps[interpolated_data[1][n][0]]
+                        / interpolated_data[1][n][1]
+                    ) - 1
+                    if np.abs(u_ratio) < 0.5 and np.abs(v_ratio) < 0.5:
+                        valid_bool[interpolated_data[0][n][0]] = True
+                    else:
+                        valid_bool[interpolated_data[0][n][0]] = False
+                    # n += 1
+
+                # Update object with filter results
+                self.valid_data[5, :, :] = valid_bool
+            else:
+                self.valid_data[5, :, :] = temp.valid_data[5, :, :]
+        else:
+            self.valid_data[5, :, :] = temp.valid_data[5, :, :]
+
+        # Combine all filter data and update processed properties
+        self.all_valid_data()
+
+    def filter_diff_vel(self, setting, threshold=None):
+        """Applies filter to difference velocity.
+
+        Applies either manual or automatic filtering of the difference (error)
+        velocity.  The automatic mode is based on the following:
+        This filter is based on the assumption that the water error velocity
+        should follow a gaussian distribution.  Therefore, 5 standard
+        deviations should encompass all of the valid data.
+        The standard deviation and limits (multiplier*std dev) are computed
+        in an iterative process until filtering out additional data does not
+        change the computed standard deviation.
+
+        Parameters
+        ----------
+        setting: str
+            Filter setting (Auto, Off, Manual)
+        threshold: float
+            Threshold value for Manual setting.
+        """
+
+        # Set difference filter properties
+        self.d_filter = setting
+        if threshold is not None:
+            self.d_filter_thresholds = threshold
+
+        # Get difference data from object
+        d_vel = copy.deepcopy(self.d_mps)
+
+        # NOTE: Versions prior to 1.01 did not apply this step to remove data
+        # below the side lobe cutoff
+        d_vel[np.logical_not(self.cells_above_sl)] = np.nan
+
+        d_vel_min_ref = None
+        d_vel_max_ref = None
+
+        bad_idx_rows = np.array([]).astype(int)
+        bad_idx_cols = np.array([]).astype(int)
+
+        # Apply selected method
+        if self.d_filter == "Manual":
+            d_vel_max_ref = np.abs(self.d_filter_thresholds)
+            d_vel_min_ref = -1 * d_vel_max_ref
+            # Set valid data row 2 for difference velocity filter results
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(d_vel, d_vel_max_ref), nan_less(d_vel, d_vel_min_ref)
+                )
+            )
+        elif self.d_filter == "Off":
+            d_vel_max_ref = np.nanmax(np.nanmax(d_vel)) + 1
+            d_vel_min_ref = np.nanmin(np.nanmin(d_vel)) - 1
+            # Set valid data row 2 for difference velocity filter results
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(d_vel, d_vel_max_ref), nan_less(d_vel, d_vel_min_ref)
+                )
+            )
+            self.d_filter_thresholds = d_vel_max_ref
+
+        elif self.d_filter == "Auto":
+            # Apply threshold from entire measurement processing to each
+            # transect
+            if self.use_measurement_thresholds:
+                self.d_filter_thresholds = self.d_meas_thresholds
+                for p_type in self.d_meas_thresholds.keys():
+                    data_max_ref = self.d_meas_thresholds[p_type][0]
+                    data_min_ref = self.d_meas_thresholds[p_type][1]
+                    data = np.copy(self.d_mps)
+                    data[self.ping_type != p_type] = np.nan
+                    idx_invalid_rows, idx_invalid_cols = np.where(
+                        np.logical_or(
+                            np.greater(data, data_max_ref), np.less(data, data_min_ref)
+                        )
+                    )
+                    if len(idx_invalid_rows) > 0:
+                        if len(bad_idx_rows) > 0:
+                            bad_idx_rows = np.hstack((bad_idx_rows, idx_invalid_rows))
+                            bad_idx_cols = np.hstack((bad_idx_cols, idx_invalid_cols))
+                        else:
+                            bad_idx_rows = idx_invalid_rows
+                            bad_idx_cols = idx_invalid_cols
+
+            # Compute unique threshold for each transect using ping types
+            elif self.ping_type.size > 1:
+
+                # Identify the ping types used in the transect
+                p_types = np.unique(self.ping_type)
+
+                thresholds = {}
+
+                # Apply the filter to each ping type
+                for p_type in p_types:
+                    # Copy of difference velocities
+                    vel_2_filter = copy.deepcopy(d_vel)
+                    # Remove data not associated with the specified ping type
+                    vel_2_filter[self.ping_type != p_type] = np.nan
+                    # Apply filter to data of a single ping type
+                    idx_invalid_rows, idx_invalid_cols, threshold = self.iqr_filter(
+                        vel_2_filter
+                    )
+                    # Combine indices of invalid data for all ping types
+                    if len(idx_invalid_rows) > 0:
+                        if len(bad_idx_rows) > 0:
+                            bad_idx_rows = np.hstack((bad_idx_rows, idx_invalid_rows))
+                            bad_idx_cols = np.hstack((bad_idx_cols, idx_invalid_cols))
+                        else:
+                            bad_idx_rows = idx_invalid_rows
+                            bad_idx_cols = idx_invalid_cols
+                    thresholds[p_type] = threshold
+                self.d_filter_thresholds = thresholds
+
+            # Compute unique threshold for each transect when no ping types
+            # are available
+            else:
+                self.ping_type = np.array(["U"])
+                bad_idx_rows, bad_idx_cols, threshold = self.iqr_filter(d_vel)
+                self.d_filter_thresholds = {"U": threshold}
+
+        valid = copy.deepcopy(self.cells_above_sl)
+        if len(bad_idx_rows) > 0:
+            valid[bad_idx_rows, bad_idx_cols] = False
+        # TODO Seems like if the difference velocity doesn't exist due to a
+        #  3-beam solution it shouldn't be
+        #  flagged as invalid however this is the way it was in Matlab.
+        #  May change this in future.
+        # valid[np.isnan(self.d_mps)] = True
+        self.valid_data[2, :, :] = valid
+
+        # Combine all filter data and update processed properties
+        self.all_valid_data()
+
+    @staticmethod
+    def iqr_filter(data, multiplier=5):
+        """Apply the iqr filter to wt data.
+
+        Parameters
+        ----------
+        data: np.ndarray(float)
+            Array of difference or vertical velocity data
+        multiplier: int
+            Number of IQR's to use to set the threshold
+
+        Returns
+        -------
+        bad_idx_rows: np.ndarray(int)
+            Row indices of invalid data
+        bad_idx_cols: np.ndarray(int)
+            Column indices of invalid data
+        threshold: float
+            Maximum threshold
+        """
+
+        data_max_ref = np.nan
+        data_min_ref = np.nan
+
+        # Check to make sure there are data to process
+        if data.size > 0 and np.any(np.logical_not(np.isnan(data))):
+
+            # Initialize variables
+            data_orig = np.copy(data)
+
+            iqr_diff = 1
+            i = -1
+            # Loop until no additional data are removed
+            while iqr_diff != 0 and i < 1000:
+                i = i + 1
+
+                # Compute standard deviation
+                data_iqr = iqr(data)
+
+                # Compute maximum and minimum thresholds
+                data_max_ref = np.nanmedian(data) + multiplier * data_iqr
+                data_min_ref = np.nanmedian(data) - multiplier * data_iqr
+
+                # Identify valid and invalid data
+                data_bad_rows, data_bad_cols = np.where(
+                    np.logical_or(
+                        nan_greater(data, data_max_ref), nan_less(data, data_min_ref)
+                    )
+                )
+                # Update filtered data array
+                data[data_bad_rows, data_bad_cols] = np.nan
+
+                # Determine differences due to last filter iteration
+                if len(data) > 0:
+                    data_iqr2 = iqr(data)
+                    iqr_diff = data_iqr2 - data_iqr
+                else:
+                    iqr_diff = 0
+
+            # Determine row and column index of invalid cells with invalid data
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(data_orig, data_max_ref),
+                    nan_less(data_orig, data_min_ref),
+                )
+            )
+        else:
+            # All data are invalid
+            # Determine row and column index of invalid cells with invalid data
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(np.greater(data, -1), np.less(data, 1))
+            )
+
+        threshold = [data_max_ref, data_min_ref]
+
+        return bad_idx_rows, bad_idx_cols, threshold
+
+    @staticmethod
+    def meas_iqr_filter(data, multiplier=5):
+        """Apply the iqr filter to wt data.
+
+        Parameters
+        ----------
+        data: np.ndarray(float)
+            Array of difference or vertical velocity data
+        multiplier: int
+            Number of IQR's to use to set the threshold
+
+        Returns
+        -------
+        thresholds: tuple
+            Maximum and minimum thresholds for filter
+        """
+
+        # Initialize variables
+        data_max_ref = np.nan
+        data_min_ref = np.nan
+
+        # Check to make sure there are data to process
+        if data.size > 0 and np.any(np.logical_not(np.isnan(data))):
+            iqr_diff = 1
+            i = -1
+            # Loop until no additional data are removed
+            while iqr_diff != 0 and i < 1000:
+                i = i + 1
+
+                # Compute standard deviation
+                data_iqr = iqr(data)
+
+                # Compute maximum and minimum thresholds
+                data_max_ref = np.nanmedian(data) + multiplier * data_iqr
+                data_min_ref = np.nanmedian(data) - multiplier * data_iqr
+
+                # Identify valid and invalid data
+                bad_idx = np.where(
+                    np.logical_or(
+                        nan_greater(data, data_max_ref), nan_less(data, data_min_ref)
+                    )
+                )
+                # Update filtered data array
+                data[bad_idx] = np.nan
+
+                # Determine differences due to last filter iteration
+                if len(data) > 0:
+                    data_iqr2 = iqr(data)
+                    iqr_diff = data_iqr2 - data_iqr
+                else:
+                    iqr_diff = 0
+
+        thresholds = [data_max_ref, data_min_ref]
+
+        return thresholds
+
+    def filter_vert_vel(self, setting, threshold=None):
+        """Applies filter to vertical velocity.
+
+        Applies either manual or automatic filter of the difference (error)
+        velocity.  The automatic mode is based on the following: This filter
+        is based on the assumption that the water error velocity should follow a
+        gaussian distribution.  Therefore, 4 standard deviations should
+        encompass all of the valid data.  The standard deviation and limits
+        (multplier * standard deviation) are computed in an iterative process
+        until filtering out additional data does not change the
+        computed standard deviation.
+
+        Parameters
+        ---------
+        setting: str
+            Filter setting (Auto, Off, Manual)
+        threshold: float
+            Threshold value for Manual setting.
+        """
+
+        # Set vertical velocity filter properties
+        self.w_filter = setting
+        if threshold is not None:
+            self.w_filter_thresholds = threshold
+
+        # Get difference data from object
+        w_vel = copy.deepcopy(self.w_mps)
+
+        # NOTE: Versions prior to 1.01 did not apply this step to remove data
+        # below the side lobe cutoff
+        w_vel[np.logical_not(self.cells_above_sl)] = np.nan
+
+        w_vel_min_ref = None
+        w_vel_max_ref = None
+
+        bad_idx_rows = np.array([]).astype(int)
+        bad_idx_cols = np.array([]).astype(int)
+
+        # Apply selected method
+        if self.w_filter == "Manual":
+            w_vel_max_ref = np.abs(self.w_filter_thresholds)
+            w_vel_min_ref = -1 * w_vel_max_ref
+            # Identify valid and invalid data
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(w_vel, w_vel_max_ref), nan_less(w_vel, w_vel_min_ref)
+                )
+            )
+        elif self.w_filter == "Off":
+            w_vel_max_ref = np.nanmax(np.nanmax(w_vel)) + 1
+            w_vel_min_ref = np.nanmin(np.nanmin(w_vel)) - 1
+            # Identify valid and invalid data
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(w_vel, w_vel_max_ref), nan_less(w_vel, w_vel_min_ref)
+                )
+            )
+            self.w_filter_thresholds = w_vel_max_ref
+
+        elif self.w_filter == "Auto":
+            # Apply threshold from entire measurement processing to each
+            # transect
+            if self.use_measurement_thresholds:
+                self.w_filter_thresholds = self.w_meas_thresholds
+                for p_type in self.w_meas_thresholds.keys():
+                    data_max_ref = self.w_meas_thresholds[p_type][0]
+                    data_min_ref = self.w_meas_thresholds[p_type][1]
+                    data = np.copy(self.w_mps)
+                    data[self.ping_type != p_type] = np.nan
+                    idx_invalid_rows, idx_invalid_cols = np.where(
+                        np.logical_or(
+                            np.greater(data, data_max_ref), np.less(data, data_min_ref)
+                        )
+                    )
+                    if len(idx_invalid_rows) > 0:
+                        if len(bad_idx_rows) > 0:
+                            bad_idx_rows = np.hstack((bad_idx_rows, idx_invalid_rows))
+                            bad_idx_cols = np.hstack((bad_idx_cols, idx_invalid_cols))
+                        else:
+                            bad_idx_rows = idx_invalid_rows
+                            bad_idx_cols = idx_invalid_cols
+
+            # Compute unique threshold for each transect using ping types
+            elif self.ping_type.size > 1:
+                # Initialize variables
+                # Identify the ping types used in the transect
+                p_types = np.unique(self.ping_type)
+
+                thresholds = {}
+
+                # Apply the filter to each ping type
+                for p_type in p_types:
+                    # Copy of vertical velocities
+                    vel_2_filter = copy.deepcopy(w_vel)
+                    # Remove data not associated with the specified ping type
+                    vel_2_filter[self.ping_type != p_type] = np.nan
+                    # Apply filter to data of a single ping type
+                    idx_invalid_rows, idx_invalid_cols, threshold = self.iqr_filter(
+                        vel_2_filter
+                    )
+                    # Combine indices of invalid data for all ping types
+                    if len(idx_invalid_rows) > 0:
+                        if len(bad_idx_rows) > 0:
+                            bad_idx_rows = np.hstack((bad_idx_rows, idx_invalid_rows))
+                            bad_idx_cols = np.hstack((bad_idx_cols, idx_invalid_cols))
+                        else:
+                            bad_idx_rows = idx_invalid_rows
+                            bad_idx_cols = idx_invalid_cols
+                    thresholds[p_type] = threshold
+                self.w_filter_thresholds = thresholds
+            # Compute unique threshold for each transect when no ping types
+            # are available
+            else:
+                self.ping_type = np.array(["U"])
+                bad_idx_rows, bad_idx_cols, threshold = self.iqr_filter(w_vel)
+                self.w_filter_thresholds = {"U": threshold}
+
+        valid = copy.deepcopy(self.cells_above_sl)
+        if len(bad_idx_rows) > 0:
+            valid[bad_idx_rows, bad_idx_cols] = False
+        self.valid_data[3, :, :] = valid
+
+        # Set threshold property
+        if np.ma.is_masked(w_vel_max_ref):
+            self.w_filter_thresholds = np.nan
+
+        # Combine all filter data and update processed properties
+        self.all_valid_data()
+
+    def filter_smooth(self, transect, setting):
+        """Filter water speed using a smooth filter.
+
+        Running Standard Deviation filter for water speed
+        This filter employs a running trimmed standard deviation filter to
+        identify and mark spikes in the water speed. First a robust Loess
+        smooth is fitted to the water speed time series and residuals between
+        the raw data and the smoothed line are computed. The trimmed standard
+        eviation is computed by selecting the number of residuals specified by
+        "halfwidth" before the target point and after the target point, but not
+        including the target point. These values are then sorted, and the
+        points with the highest and lowest values are removed from the subset,
+        and the standard deviation of the trimmed subset is computed.
+        The filter criteria are determined by multiplying the standard
+        deviation by a user specified multiplier. This criteria defines a
+        maximum and minimum acceptable residual. Data falling outside the
+        criteria are set to nan.
+
+        Recommended filter settings are:
+        filter_width = 10
+        half_width = 10
+        multiplier = 9
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        setting: str
+            Set filter (Auto, Off)
+        """
+
+        self.smooth_filter = setting
+        upper_limit = None
+        lower_limit = None
+        wt_bad_idx = None
+
+        # Compute ens_time
+        ens_time = np.nancumsum(transect.date_time.ens_duration_sec)
+
+        # Determine if smooth filter should be applied
+        if self.smooth_filter == "Auto":
+
+            # Boat velocity components
+            w_vele = self.u_mps
+            w_veln = self.v_mps
+
+            # Set filter parameters
+            filter_width = 10
+            half_width = 10
+            multiplier = 9
+            cycles = 3
+
+            # Compute mean speed and direction of water
+            w_vele_avg = np.nanmean(w_vele, 0)
+            w_veln_avg = np.nanmean(w_veln, 0)
+            _, speed = cart2pol(w_vele_avg, w_veln_avg)
+
+            # Compute residuals from a robust Loess smooth
+            speed_smooth = rloess(ens_time, speed, filter_width)
+            speed_res = speed - speed_smooth
+
+            # Apply a trimmed standard deviation filter multiple times
+            for i in range(cycles):
+                fill_array = BoatData.run_std_trim(half_width, speed_res.T)
+
+                # Compute filter bounds
+                upper_limit = speed_smooth + multiplier * fill_array
+                lower_limit = speed_smooth - multiplier * fill_array
+
+                # Apply filter to residuals
+                wt_bad_idx = np.where((speed > upper_limit) or (speed < lower_limit))[0]
+                speed_res[wt_bad_idx] = np.nan
+
+            valid = np.copy(self.cells_above_sl)
+
+            valid[:, wt_bad_idx] = False
+            self.valid_data[4, :, :] = valid
+            self.smooth_upper_limit = upper_limit
+            self.smooth_lower_limit = lower_limit
+            self.smooth_speed = speed_smooth
+
+        else:
+            # No filter applied
+            self.valid_data[4, :, :] = np.copy(self.cells_above_sl)
+            self.smooth_upper_limit = np.nan
+            self.smooth_lower_limit = np.nan
+            self.smooth_speed = np.nan
+
+        self.all_valid_data()
+
+    def filter_snr(self, transect, setting):
+        """Filters SonTek data based on SNR.
+
+        Computes the average SNR for all cells above the side lobe cutoff for
+        each beam in each ensemble. If the range in average SNR in an ensemble is greater
+        than 12 dB the water velocity in that ensemble is considered invalid.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        setting: str
+            Setting for filter (Auto, Off)
+        """
+
+        self.snr_filter = setting
+
+        if setting == "Auto":
+
+            # Determines if invalid data should use 3-beam computations
+            if self.snr_3beam_comp:
+
+                cells_above_sl = np.copy(self.cells_above_sl.astype(float))
+                cells_above_sl[cells_above_sl < 0.5] = np.nan
+                snr_adjusted = self.rssi * cells_above_sl
+                snr_average = np.nanmean(snr_adjusted, 1)
+
+                # Find invalid beams
+                snr_beam_invalid = (np.max(snr_average, axis=0) - snr_average) > 12
+
+                ens_bad_snr =np.any(snr_beam_invalid, axis=0)
+                valid = np.copy(self.cells_above_sl)
+
+                bad_snr_array = np.tile(ens_bad_snr, (valid.shape[0], 1))
+                valid[bad_snr_array] = False
+
+                beam_velocities = self.earth_to_beam(w_vel=self,
+                                                     sensors=transect.sensors,
+                                                     adcp=transect.adcp)
+                invalid_beam_value = np.tile(np.nan, valid.shape[0])
+
+                invalid_snr_idx = np.where(snr_beam_invalid)
+
+                beam_velocities[invalid_snr_idx[0], :, invalid_snr_idx[1]] = invalid_beam_value
+                self.snr_beam_velocities = beam_velocities
+                self.orig_coord_sys = 'Beam'
+                self.change_coord_sys(new_coord_sys='Earth',
+                                      sensors=transect.sensors,
+                                      adcp=transect.adcp)
+                self.orig_coord_sys = 'Earth'
+
+                self.set_nav_reference(transect.boat_vel)
+            else:
+                bad_snr_idx = np.greater(self.snr_rng, 12)
+                valid = np.copy(self.cells_above_sl)
+
+                bad_snr_array = np.tile(bad_snr_idx, (valid.shape[0], 1))
+                valid[bad_snr_array] = False
+
+            self.valid_data[7, :, :] = valid
+
+            # Combine all filter data and update processed properties
+            self.all_valid_data()
+        elif transect.adcp.manufacturer == "SonTek":
+            self.snr_beam_velocities = None
+            self.change_coord_sys(new_coord_sys='Earth', sensors=transect.sensors,
+                                  adcp=transect.adcp)
+            self.orig_coord_sys = 'Earth'
+
+            self.set_nav_reference(transect.boat_vel)
+            self.valid_data[7, :, :] = np.copy(self.cells_above_sl)
+            self.all_valid_data()
+
+    def filter_wt_depth(self, transect, setting):
+        """Marks water velocity data invalid if there is no valid or
+        interpolated average depth.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        setting: bool
+            Setting for filter (True, False)
+        """
+        self.wt_depth_filter = setting
+        valid = np.copy(self.cells_above_sl)
+
+        if setting:
+            trans_select = getattr(transect.depths, transect.depths.selected)
+            valid[:, np.isnan(trans_select.depth_processed_m)] = False
+        self.valid_data[8, :, :] = valid
+
+        self.all_valid_data()
+
+    def filter_excluded(self, transect, setting):
+        """Marks all data invalid that are closer to the transducer than the
+         setting.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        setting: float
+            Range from the transducer, in m
+        """
+
+        # Initialize variables
+        trans_select = getattr(transect.depths, transect.depths.selected)
+        cell_depth = trans_select.depth_cell_depth_m
+        cell_size = trans_select.depth_cell_size_m
+        draft = trans_select.draft_use_m
+        top_cell_depth = cell_depth - 0.5 * cell_size
+        threshold = np.round((setting + draft), 3)
+
+        # Apply filter
+        exclude = np.round(top_cell_depth, 3) <= threshold
+        valid = np.copy(self.cells_above_sl)
+        valid[exclude] = False
+        self.valid_data[6, :, :] = valid
+
+        # Set threshold property
+        self.excluded_dist_m = setting
+
+        self.all_valid_data()
+
+    def interpolate_abba(
+        self, transect, search_loc=["above", "below", "before", "after"]
+    ):
+        """ Interpolates all data marked invalid using the abba interpolation
+        algorithm.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        # Set properties
+        self.interpolate_cells = "abba"
+        self.interpolate_ens = "abba"
+
+        # Get valid data based on all filters applied
+        valid = self.valid_data[0, :, :]
+        valid = valid[:, transect.in_transect_idx]
+
+        # Initialize velocity data variables
+        u = copy.deepcopy(self.u_mps)
+        v = copy.deepcopy(self.v_mps)
+
+        u = u[:, transect.in_transect_idx]
+        v = v[:, transect.in_transect_idx]
+
+        # Set invalid data to nan in processed velocity data variables
+        u[np.logical_not(valid)] = np.nan
+        v[np.logical_not(valid)] = np.nan
+
+        interpolated_data = self.compute_abba_interpolation(
+            wt_data=self,
+            data_list=[u, v],
+            valid=valid,
+            transect=transect,
+            search_loc=search_loc,
+        )
+
+        if interpolated_data is not None:
+            # Incorporate interpolated values
+            for n in range(len(interpolated_data[0])):
+                u[interpolated_data[0][n][0]] = interpolated_data[0][n][1]
+                v[interpolated_data[1][n][0]] = interpolated_data[1][n][1]
+
+        # Save interpolated data, while retaining of the ensembles including
+        # those that are not in the in_transect_idx array
+        self.u_processed_mps[:, :] = np.nan
+        self.v_processed_mps[:, :] = np.nan
+        self.u_processed_mps[:, transect.in_transect_idx] = u
+        self.v_processed_mps[:, transect.in_transect_idx] = v
+
+    @staticmethod
+    def compute_abba_interpolation(
+        wt_data,
+        data_list,
+        valid,
+        transect,
+        search_loc=["above", "below", "before", "after"],
+    ):
+        """Computes the interpolated values for invalid cells using the abba
+        method.
+
+        Parameters
+        ----------
+        wt_data: WaterData
+            Object of WaterData
+        data_list: list
+            List of np.array(float) data to used for interpolation
+        valid: np.ndarray(bool)
+            Array indicating valid to be used for interpolation
+        transect: TransectData
+            Object of TransectData
+
+        Returns
+        -------
+        interpolated_data: np.ndarray(float)
+            Array of interpolated data
+        """
+        # Find cells with invalid data
+        valid_cells = wt_data.valid_data[0, :, transect.in_transect_idx]
+        boat_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
+        if boat_selected is not None:
+            boat_valid = boat_selected.valid_data[0, transect.in_transect_idx]
+        else:
+            boat_valid = 0
+
+        if not np.all(valid_cells) and np.nansum(boat_valid) > 1:
+            # Compute distance along shiptrack to be used in interpolation
+            distance_along_shiptrack = transect.boat_vel.compute_boat_track(transect)[
+                "distance_m"
+            ]
+
+            # Where there is invalid boat speed at beginning or end of
+            # transect mark the distance nan to avoid
+            # interpolating velocities that won't be used for discharge
+            if type(distance_along_shiptrack) is np.ndarray:
+                distance_along_shiptrack[0 : np.argmax(boat_valid == True)] = np.nan
+                end_nan = np.argmax(np.flip(boat_valid) == True)
+                if end_nan > 0:
+                    distance_along_shiptrack[-1 * end_nan :] = np.nan
+                # if type(distance_along_shiptrack) is np.ndarray:
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+                cells_above_sl = wt_data.valid_data[6, :, :]
+                cells_above_sl = cells_above_sl[:, transect.in_transect_idx]
+
+                # Interpolate values for  invalid cells with from neighboring
+                # data
+                interpolated_data = abba_idw_interpolation(
+                    data_list=data_list,
+                    valid_data=valid,
+                    cells_above_sl=cells_above_sl,
+                    y_centers=depth_selected.depth_cell_depth_m[
+                        :, transect.in_transect_idx
+                    ],
+                    y_cell_size=depth_selected.depth_cell_size_m[
+                        :, transect.in_transect_idx
+                    ],
+                    y_depth=depth_selected.depth_processed_m[transect.in_transect_idx],
+                    x_shiptrack=distance_along_shiptrack,
+                    search_loc=search_loc,
+                    normalize=True,
+                )
+                return interpolated_data
+            else:
+                return None
+        else:
+            return None
+
+    def interpolate_ens_next(self):
+        """Applies data from the next valid ensemble for ensembles with
+        invalid water velocities.
+        """
+
+        # Set interpolation property for ensembles
+        self.interpolate_ens = "ExpandedT"
+
+        # Set processed data to nan for all invalid data
+        valid = self.valid_data[0]
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+        self.u_processed_mps[valid == False] = np.nan
+        self.v_processed_mps[valid == False] = np.nan
+
+        # Identifying ensembles with no valid data
+        valid_ens = np.any(valid, axis=0)
+        n_ens = len(valid_ens)
+
+        # Set the invalid ensembles to the data in the next valid ensemble
+        for n in np.arange(0, n_ens - 1)[::-1]:
+            if not valid_ens[n]:
+                self.u_processed_mps[:, n] = self.u_processed_mps[:, n + 1]
+                self.v_processed_mps[:, n] = self.v_processed_mps[:, n + 1]
+
+    def interpolate_ens_hold_last(self):
+        """Interpolates velocity data for invalid ensembles by repeating the
+        the last valid data until new valid data is found
+        """
+
+        self.interpolate_ens = "HoldLast"
+
+        valid = self.valid_data[0]
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        # Set invalid data to nan in processed velocity data variables
+        self.u_processed_mps[valid == False] = np.nan
+        self.v_processed_mps[valid == False] = np.nan
+
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, axis=0)
+
+        # Process each ensemble beginning with the second ensemble
+        n_ens = len(valid_ens)
+
+        for n in np.arange(1, n_ens):
+            # If ensemble is invalid fill in with previous ensemble
+            if not valid_ens[n]:
+                self.u_processed_mps[:, n] = self.u_processed_mps[:, n - 1]
+                self.v_processed_mps[:, n] = self.v_processed_mps[:, n - 1]
+
+    def interpolate_ens_hold_last_9(self):
+        """Apply SonTek's approach to invalid data.
+
+        Interpolates velocity data for invalid ensembles by repeating the
+        last valid data for up to 9 ensembles or until new valid data is
+        found. If more the 9 consecutive ensembles are invalid the
+        ensembles beyond the 9th remain invalid. This is for
+        compatibility with SonTek RiverSurveyor Live.
+        """
+
+        self.interpolate_ens = "Hold9"
+
+        valid = self.valid_data[0]
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        # Set invalid data to nan in processed velocity data variables
+        self.u_processed_mps[valid == False] = np.nan
+        self.v_processed_mps[valid == False] = np.nan
+
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, axis=0)
+
+        # Process each ensemble beginning with the second ensemble
+        n_ens = len(valid_ens)
+        n_invalid = 0
+
+        for n in np.arange(1, n_ens):
+            # If ensemble is invalid fill in with previous ensemble
+            if valid_ens[n] == False and n_invalid < 10:
+                n_invalid += 1
+                self.u_processed_mps[:, n] = self.u_processed_mps[:, n - 1]
+                self.v_processed_mps[:, n] = self.v_processed_mps[:, n - 1]
+            else:
+                n_invalid = 0
+
+    def interpolate_ens_none(self):
+        """Applies no interpolation for invalid ensembles."""
+
+        self.interpolate_ens = "None"
+
+        valid = self.valid_data[0]
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        # Set invalid data to nan in processed velocity data variables
+        self.u_processed_mps[valid == False] = np.nan
+        self.v_processed_mps[valid == False] = np.nan
+
+    def interpolate_cells_none(self):
+        """Applies no interpolation for invalid cells that are not part of
+        an invalid ensemble."""
+
+        self.interpolate_cells = "None"
+
+        valid = self.valid_data[0]
+
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, axis=0)
+
+        # Process each ensemble beginning with the second ensemble
+        n_ens = len(valid_ens)
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        for n in range(n_ens):
+            # If ensemble is invalid fill in with previous ensemble
+            if valid_ens[n]:
+                invalid_cells = np.logical_not(valid[:, n])
+                self.u_processed_mps[invalid_cells, n] = np.nan
+                self.v_processed_mps[invalid_cells, n] = np.nan
+
+    def interpolate_ens_linear(self, transect):
+        """Uses 2D linear interpolation to estimate values for invalid
+        ensembles.
+
+        Use linear interpolation as computed by scipy's interpolation
+        function to interpolated velocity data for ensembles with no valid
+        velocities.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        self.interpolate_ens = "Linear"
+
+        valid = self.valid_data[0, :, :]
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, 0)
+
+        if np.sum(valid_ens) > 1:
+            trans_select = getattr(transect.depths, transect.depths.selected)
+            # Compute z
+            z = np.divide(
+                np.subtract(
+                    trans_select.depth_processed_m, trans_select.depth_cell_depth_m
+                ),
+                trans_select.depth_processed_m,
+            )
+
+            # Create position array
+            boat_select = getattr(transect.boat_vel, transect.boat_vel.selected)
+            if boat_select is not None:
+                if np.nansum(boat_select.valid_data[0]) > 0:
+                    boat_vel_x = boat_select.u_processed_mps
+                    boat_vel_y = boat_select.v_processed_mps
+                    track_x = boat_vel_x * transect.date_time.ens_duration_sec
+                    track_y = boat_vel_y * transect.date_time.ens_duration_sec
+                    track = np.nancumsum(np.sqrt(track_x**2 + track_y**2))
+                    track_array = np.tile(track, (self.u_processed_mps.shape[0], 1))
+
+                    # Determine index of all valid data
+                    valid_z = np.isnan(z) == False
+                    valid_combined = np.logical_and(valid, valid_z)
+
+                    u = interpolate.griddata(
+                        np.vstack((z[valid_combined], track_array[valid_combined])).T,
+                        self.u_processed_mps[valid_combined],
+                        (z, track_array),
+                    )
+
+                    v = interpolate.griddata(
+                        np.vstack((z[valid_combined], track_array[valid_combined])).T,
+                        self.v_processed_mps[valid_combined],
+                        (z, track_array),
+                    )
+
+                    self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
+                    self.v_processed_mps = np.tile(np.nan, self.u_mps.shape)
+                    processed_valid_cells = self.estimate_processed_valid_cells(
+                        transect
+                    )
+                    self.u_processed_mps[processed_valid_cells] = u[
+                        processed_valid_cells
+                    ]
+                    self.v_processed_mps[processed_valid_cells] = v[
+                        processed_valid_cells
+                    ]
+
+    def interpolate_cells_linear(self, transect):
+        """Uses 2D linear interpolation to estimate values for invalid cells.
+
+        Use linear interpolation as computed by scipy's interpolation
+        function to interpolated velocity data for cells with no valid
+        velocities.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        self.interpolate_ens = "Linear"
+
+        valid = self.valid_data[0, :, :]
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        trans_select = getattr(transect.depths, transect.depths.selected)
+
+        # Compute z
+        z = np.divide(
+            np.subtract(
+                trans_select.depth_processed_m, trans_select.depth_cell_depth_m
+            ),
+            trans_select.depth_processed_m,
+        )
+
+        # Create position array
+        boat_select = getattr(transect.boat_vel, transect.boat_vel.selected)
+        if boat_select is not None:
+            if np.nansum(boat_select.valid_data[0]) > 0:
+                boat_vel_x = boat_select.u_processed_mps
+                boat_vel_y = boat_select.v_processed_mps
+                track_x = boat_vel_x * transect.date_time.ens_duration_sec
+                track_y = boat_vel_y * transect.date_time.ens_duration_sec
+                track = np.nancumsum(np.sqrt(track_x**2 + track_y**2))
+                track_array = np.tile(track, (self.u_processed_mps.shape[0], 1))
+
+                # Determine index of all valid data
+                valid_z = np.isnan(z) == False
+                valid_combined = np.logical_and(valid, valid_z)
+
+                u = interpolate.griddata(
+                    np.array(
+                        [z[valid_combined].ravel(), track_array[valid_combined].ravel()]
+                    ).T,
+                    self.u_processed_mps[valid_combined].ravel(),
+                    (z, track_array),
+                )
+
+                v = interpolate.griddata(
+                    np.array(
+                        [z[valid_combined].ravel(), track_array[valid_combined].ravel()]
+                    ).T,
+                    self.v_processed_mps[valid_combined].ravel(),
+                    (z, track_array),
+                )
+
+                self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
+                self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
+                processed_valid_cells = self.estimate_processed_valid_cells(transect)
+                self.u_processed_mps[processed_valid_cells] = u[processed_valid_cells]
+                self.v_processed_mps[processed_valid_cells] = v[processed_valid_cells]
+
+    def interpolate_cells_trdi(self, transect):
+        """Interpolates values for invalid cells using methods similar to
+        WinRiver II.
+
+        This function computes the velocity for the invalid cells using
+        the methods in WinRiver II, but applied to velocity components.
+        Although WinRiver II applies to discharge which theoretically is
+        more correct, mathematically applying to discharge or velocity
+        components is identical. By applying to velocity components the
+        user can see the velocity data interpolated.
+        Power fit uses the power fit equation and no slip uses linear
+        interpolation.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        # Set property
+        self.interpolate_cells = "TRDI"
+
+        # Construct variables
+        depths = getattr(transect.depths, transect.depths.selected)
+        valid = self.valid_data[0]
+        cell_depth = depths.depth_cell_depth_m
+        z_all = np.subtract(depths.depth_processed_m, cell_depth)
+        z = np.copy(z_all)
+        z[np.isnan(self.u_processed_mps)] = np.nan
+        z_adj = np.tile(np.nan, z.shape)
+        n_cells, n_ens = self.u_processed_mps.shape
+        cell_size = depths.depth_cell_size_m
+        exponent = transect.extrap.exponent
+        bot_method = transect.extrap.bot_method
+
+        for n in range(n_ens):
+
+            # Identify first and last valid depth cell
+            idx = np.where(valid[:, n] == True)[0]
+            if len(idx) > 0:
+                idx_first = idx[0]
+                idx_last = idx[-1]
+                idx_middle = np.where(valid[idx_first : idx_last + 1, n] == False)[0]
+
+                # For invalid middle depth cells perform interpolation based
+                # on bottom method
+                if len(idx_middle) > 0:
+                    idx_middle = idx_middle + idx_first
+                    z_adj[idx_middle, n] = z_all[idx_middle, n]
+
+                    # Interpolate velocities using power fit
+                    if bot_method == "Power":
+                        # Compute interpolated u-velocities
+                        z2 = z[:, n] - (0.5 * cell_size[:, n])
+                        z2[nan_less(z2, 0)] = np.nan
+                        coef = (
+                            (exponent + 1)
+                            * np.nansum(self.u_processed_mps[:, n] * cell_size[:, n], 0)
+                        ) / np.nansum(
+                            ((z[:, n] + 0.5 * cell_size[:, n]) ** (exponent + 1))
+                            - (z2 ** (exponent + 1)),
+                            0,
+                        )
+
+                        temp = coef * z_adj[:, n] ** exponent
+                        self.u_processed_mps[idx_middle, n] = temp[idx_middle]
+                        # Compute interpolated v-Velocities
+                        coef = (
+                            (exponent + 1)
+                            * np.nansum(self.v_processed_mps[:, n] * cell_size[:, n])
+                        ) / np.nansum(
+                            ((z[:, n] + 0.5 * cell_size[:, n]) ** (exponent + 1))
+                            - (z2 ** (exponent + 1))
+                        )
+                        temp = coef * z_adj[:, n] ** exponent
+                        self.v_processed_mps[idx_middle, n] = temp[idx_middle]
+
+                    # Interpolate velocities using linear interpolation
+                    elif bot_method == "No Slip":
+                        self.u_processed_mps[idx_middle, n] = np.interp(
+                            x=cell_depth[idx_middle, n],
+                            xp=cell_depth[valid[:, n], n],
+                            fp=self.u_processed_mps[valid[:, n], n],
+                        )
+                        self.v_processed_mps[idx_middle, n] = np.interp(
+                            x=cell_depth[idx_middle, n],
+                            xp=cell_depth[valid[:, n], n],
+                            fp=self.v_processed_mps[valid[:, n], n],
+                        )
+
+    def estimate_processed_valid_cells(self, transect):
+        """Estimate the number of valid cells for invalid ensembles.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+
+        Returns
+        -------
+        processed_valid_cells: np.ndarray(bool)
+           Estimated valid cells
+        """
+
+        processed_valid_cells = np.copy(self.valid_data[0])
+        valid_data_sum = np.nansum(processed_valid_cells, 0)
+        invalid_ens_idx = np.where(valid_data_sum == 0)[0]
+        n_invalid = len(invalid_ens_idx)
+        depth_cell_depth = transect.depths.bt_depths.depth_cell_depth_m
+        for n in range(n_invalid):
+
+            # Find nearest valid ensembles on either side of invalid ensemble
+            idx1 = np.where(valid_data_sum[: invalid_ens_idx[n]] > 0)[0]
+            if len(idx1) > 0:
+                idx1 = idx1[-1]
+                # Find the last cell in the neighboring valid ensembles
+                idx1_cell = np.where(processed_valid_cells[:, idx1] == True)[0][-1]
+                # Determine valid cells for invalid ensemble
+                idx1_cell_depth = depth_cell_depth[idx1_cell, idx1]
+            else:
+                idx1_cell_depth = 0
+
+            idx2 = np.where(valid_data_sum[invalid_ens_idx[n] :] > 0)[0]
+            if len(idx2) > 0:
+                idx2 = idx2[0]
+                idx2 = invalid_ens_idx[n] + idx2
+                # Find the last cell in the neighboring valid ensembles
+                idx2_cell = np.where(processed_valid_cells[:, idx2] == True)[0][-1]
+                # Determine valid cells for invalid ensemble
+                idx2_cell_depth = depth_cell_depth[idx2_cell, idx2]
+            else:
+                idx2_cell_depth = 0
+
+            cutoff = np.nanmax([idx1_cell_depth, idx2_cell_depth])
+            processed_valid_cells[
+                depth_cell_depth[:, invalid_ens_idx[n]] < cutoff, invalid_ens_idx[n]
+            ] = True
+
+            # Apply excluded distance
+            processed_valid_cells = processed_valid_cells * self.valid_data[6, :, :]
+
+        return processed_valid_cells
+
+    def compute_snr_rng(self):
+        """Computes the range between the average snr for all beams.
+        The average is computed using only data above the side lobe cutoff.
+        """
+        if self.rssi_units == "SNR":
+            cells_above_sl = np.copy(self.cells_above_sl.astype(float))
+            cells_above_sl[cells_above_sl < 0.5] = np.nan
+            snr_adjusted = self.rssi * cells_above_sl
+            snr_average = np.nanmean(snr_adjusted, 1)
+            self.snr_rng = np.nanmax(snr_average, 0) - np.nanmin(snr_average, 0)
+
+    def automated_beam_filter_old(self):
+        """Older version of automatic beam filter. Not currently used."""
+
+        # Create array indicating which cells do not have 4-beam solutions
+        # and all cells below side lobe are nan
+        temp = copy.deepcopy(self)
+        temp.filter_beam(4)
+        valid_bool = temp.valid_data[5, :, :]
+        valid = valid_bool.astype(float)
+        valid[temp.cells_above_sl == False] = np.nan
+
+        # Find cells with 3 beams solutions
+        rows_3b, cols_3b = np.where(np.abs(valid) == 0)
+        if len(rows_3b) > 0:
+            # Find cells with 4 beams solutions
+            valid_rows, valid_cols = np.where(valid == 1)
+
+            valid_u = temp.u_mps[valid == 1]
+            valid_v = temp.v_mps[valid == 1]
+            # Use interpolate water velocity of cells with 3 beam solutions
+
+            # The following code duplicates Matlab scatteredInterpolant which
+            # seems to only estimate along columns as long as there is data in
+            # the ensemble above and below the value being estimated.
+            row_numbers = np.linspace(0, valid.shape[0] - 1, valid.shape[0])
+            n = 0
+            for col in cols_3b:
+                # If the cell has valid data above and below it linearly
+                # interpolate using data in that ensemble.
+                # If not, use other means of interpolation.
+                if np.any(valid_bool[rows_3b[n] + 1 : :, col]) and np.any(
+                    valid_bool[0 : rows_3b[n], col]
+                ):
+                    est_u = np.interp(
+                        x=rows_3b[n],
+                        xp=row_numbers[valid_bool[:, col]],
+                        fp=temp.u_mps[valid_bool[:, col], col],
+                    )
+
+                    est_v = np.interp(
+                        x=rows_3b[n],
+                        xp=row_numbers[valid_bool[:, col]],
+                        fp=temp.v_mps[valid_bool[:, col], col],
+                    )
+                else:
+                    est_u = interpolate.griddata(
+                        np.array((valid_rows, valid_cols)).T, valid_u, (col, rows_3b[n])
+                    )
+                    est_v = interpolate.griddata(
+                        np.array((valid_cols, valid_rows)).T, valid_v, (col, rows_3b[n])
+                    )
+
+                u_ratio = (temp.u_mps[rows_3b[n], col] / est_u) - 1
+                v_ratio = (temp.v_mps[rows_3b[n], col] / est_v) - 1
+                if np.abs(u_ratio) < 0.5 or np.abs(v_ratio) < 0.5:
+                    valid_bool[rows_3b[n], col] = True
+                else:
+                    valid_bool[rows_3b[n], col] = False
+                n += 1
+            self.valid_data[5, :, :] = valid_bool
+        else:
+            self.valid_data[5, :, :] = temp.valid_data[5, :, :]
+
+        # Combine all filter data and update processed properties
+
+        self.all_valid_data()
+
+    # Code from Aurelien
+    def interpolate_cells_above(self, transect):
+        """Interpolates values for invalid cells using below valid cell
+        Written by Aurelien Despax
+        Modified by dsm
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        # Set property
+        self.interpolate_cells = "Above"
+
+        # Construct variables
+
+        valid = self.valid_data[0]
+        n_cells, n_ens = self.u_processed_mps.shape
+
+        for n in range(n_ens):
+
+            # Identify first and last valid depth cell
+            idx = np.where(valid[:, n] == True)[0]
+            if len(idx) > 0:
+                idx_first = idx[0]
+                idx_last = idx[-1]
+                idx_middle = np.where(valid[idx_first : idx_last + 1, n] == False)[0]
+
+                # For invalid middle depth cells assign value of shallower
+                # valid depth cell
+                # TODO this assigns the value of the shallowest depth cell
+                #  not the next valid depth cell
+                if len(idx_middle) > 0:
+                    idx_middle = idx_middle + idx_first
+                    self.u_processed_mps[idx_middle, n] = self.u_processed_mps[
+                        idx_first, n
+                    ]
+                    self.v_processed_mps[idx_middle, n] = self.v_processed_mps[
+                        idx_first, n
+                    ]
+
+    def interpolate_cells_below(self, transect):
+        """Interpolates values for invalid cells using above valid cell
+        Written by Aurelien Despax
+        Modified by dsm
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        # Set property
+        self.interpolate_cells = "Below"
+
+        # Construct variables
+        valid = self.valid_data[0]
+        n_cells, n_ens = self.u_processed_mps.shape
+
+        for n in range(n_ens):
+
+            # Identify first and last valid depth cell
+            idx = np.where(valid[:, n] == True)[0]
+            if len(idx) > 0:
+                idx_first = idx[0]
+                idx_last = idx[-1]
+                idx_middle = np.where(valid[idx_first : idx_last + 1, n] == False)[0]
+
+                # For invalid middle depth cells assign the value of the next
+                # deeper valid depth cells
+                # TODO this assigns the value of the shallowest depth cell
+                #  not the next valid depth cell
+                if len(idx_middle) > 0:
+                    idx_middle = idx_middle + idx_first
+                    self.u_processed_mps[idx_middle, n] = self.u_processed_mps[
+                        idx_last, n
+                    ]
+                    self.v_processed_mps[idx_middle, n] = self.v_processed_mps[
+                        idx_last, n
+                    ]
+
+    def interpolate_cells_before(self, transect):
+        """Interpolates values for invalid cells using above valid cell
+        Written by Aurelien Despax
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        # Set property
+        self.interpolate_cells = "Before"
+
+        # Construct variables
+        depths = getattr(transect.depths, transect.depths.selected)
+        valid = self.valid_data[0]
+        cell_depth = depths.depth_cell_depth_m
+        z_all = np.subtract(depths.depth_processed_m, cell_depth)
+        z = np.copy(z_all)
+        z[np.isnan(self.u_processed_mps)] = np.nan
+        z_adj = np.tile(np.nan, z.shape)
+        n_cells, n_ens = self.u_processed_mps.shape
+
+        for n in range(n_ens):
+
+            # Identify first and last valid depth cell
+            idx = np.where(valid[:, n] == True)[0]
+            if len(idx) > 0:
+                idx_first = idx[0]
+                idx_last = idx[-1]
+                idx_middle = np.where(valid[idx_first : idx_last + 1, n] == False)[0]
+
+                # For invalid middle depth cells perform interpolation based
+                # on bottom method
+                if len(idx_middle) > 0:
+                    idx_middle = idx_middle + idx_first
+                    z_adj[idx_middle, n] = z_all[idx_middle, n]
+
+                    # Interpolate velocities using linear interpolation
+                    self.u_processed_mps[idx_middle, n] = self.u_processed_mps[
+                        idx_middle, n - 1
+                    ]
+                    self.v_processed_mps[idx_middle, n] = self.v_processed_mps[
+                        idx_middle, n - 1
+                    ]
+
+    def interpolate_cells_after(self, transect):
+        """Interpolates values for invalid cells using above valid cell
+        Written by Aurelien Despax
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        # Set property
+        self.interpolate_cells = "After"
+
+        # Construct variables
+        depths = getattr(transect.depths, transect.depths.selected)
+        valid = self.valid_data[0]
+        cell_depth = depths.depth_cell_depth_m
+        z_all = np.subtract(depths.depth_processed_m, cell_depth)
+        z = np.copy(z_all)
+        z[np.isnan(self.u_processed_mps)] = np.nan
+        z_adj = np.tile(np.nan, z.shape)
+        n_cells, n_ens = self.u_processed_mps.shape
+
+        for n in list(reversed(list(range(n_ens)))):
+
+            # Identify first and last valid depth cell
+            idx = np.where(valid[:, n] == True)[0]
+            if len(idx) > 0:
+                idx_first = idx[0]
+                idx_last = idx[-1]
+                idx_middle = np.where(valid[idx_first : idx_last + 1, n] == False)[0]
+
+                # For invalid middle depth cells perform interpolation based
+                # on bottom method
+                if len(idx_middle) > 0:
+                    idx_middle = idx_middle + idx_first
+                    z_adj[idx_middle, n] = z_all[idx_middle, n]
+
+                    # Interpolate velocities using linear interpolation
+                    if n_ens > (n + 1):
+                        self.u_processed_mps[idx_middle, n] = self.u_processed_mps[
+                            idx_middle, n + 1
+                        ]
+                        self.v_processed_mps[idx_middle, n] = self.v_processed_mps[
+                            idx_middle, n + 1
+                        ]
+
+    def interpolate_cells_froude(self, transect):
+        """ Interpolates values for invalid cells using Froude interpolation
+
+            Parameters
+            ----------
+            transect: TransectData
+                Object of TransectData
+        """
+
+        # Construct variables
+        g = 9.80665
+
+        valid = self.valid_data[0, :, :]
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, 0)
+
+        # Get water velocity components
+        water_u = np.copy(self.u_mps[:, transect.in_transect_idx])
+        water_v = np.copy(self.v_mps[:, transect.in_transect_idx])
+
+        # # Initialize velocity data variables
+        # u = copy.deepcopy(self.u_mps)
+        # v = copy.deepcopy(self.v_mps)
+        #
+        # u = u[:, transect.in_transect_idx]
+        # v = v[:, transect.in_transect_idx]
+        #
+        # # Set invalid data to nan in processed velocity data variables
+        # u[np.logical_not(valid)] = np.nan
+        # v[np.logical_not(valid)] = np.nan
+
+        # Compute mean velocity components in each ensemble
+        w_vel_mean_1 = np.nanmean(water_u, 0)
+        w_vel_mean_2 = np.nanmean(water_v, 0)
+
+        # Compute a unit vector
+        direction, _ = cart2pol(w_vel_mean_1, w_vel_mean_2)
+        unit_vec_1, unit_vec_2 = pol2cart(direction, 1)
+        unit_vec = np.vstack([unit_vec_1, unit_vec_2])
+
+        # Compute the velocity magnitude in the direction of the mean velocity of each
+        # ensemble using the dot product and unit vector
+        w_vel_prim = np.tile([np.nan], water_u.shape)
+        w_vel_sec = np.tile([np.nan], water_u.shape)
+        for i in range(water_u.shape[0]):
+            w_vel_prim[i, :] = np.sum(
+                np.vstack([water_u[i, :], water_v[i, :]]) * unit_vec, 0
+            )
+            w_vel_sec[i, :] = (
+                    unit_vec_2 * water_u[i, :] - unit_vec_1 * water_v[i, :]
+            )
+
+        # w_vel_prim[np.logical_not(transect.w_vel.valid_data[0, :, :])] = np.nan
+        # w_vel_sec[np.logical_not(transect.w_vel.valid_data[0, :, :])] = np.nan
+
+        if np.sum(valid_ens) > 1:
+            trans_select = getattr(transect.depths, transect.depths.selected)
+            # Compute z
+            z = np.divide(
+                np.subtract(
+                    trans_select.depth_processed_m, trans_select.depth_cell_depth_m
+                ),
+                trans_select.depth_processed_m,
+            )
+            # Create position array
+            boat_select = getattr(transect.boat_vel, transect.boat_vel.selected)
+            if boat_select is not None:
+                if np.nansum(boat_select.valid_data[0]) > 0:
+                    boat_vel_x = boat_select.u_processed_mps
+                    boat_vel_y = boat_select.v_processed_mps
+                    track_x = boat_vel_x * transect.date_time.ens_duration_sec
+                    track_y = boat_vel_y * transect.date_time.ens_duration_sec
+                    track = np.nancumsum(np.sqrt(track_x ** 2 + track_y ** 2))
+                    track_array = np.tile(track, (self.u_processed_mps.shape[0], 1))
+
+                    # Compute Froude
+                    depth_transect = trans_select.depth_processed_m
+                    froude = np.divide(np.nanmean(w_vel_prim, axis=0),
+                                       np.sqrt(np.multiply(g, depth_transect)))
+                    froude_array = np.tile(froude, (self.u_processed_mps.shape[0], 1))
+
+                    # Determine index of all valid data
+                    valid_z = np.isnan(z) == False
+                    valid_combined = np.logical_and(valid, valid_z)
+
+                    # Interpolate Froude for invalid ens
+                    fr = interpolate.griddata(
+                        np.vstack((z[valid_combined], track_array[valid_combined])).T,
+                        froude_array[valid_combined],
+                        (z, track_array),
+                    )
+                    prim = np.multiply(fr, np.sqrt(np.multiply(g, depth_transect)))
+
+                    dir = interpolate.griddata(
+                        track[~np.isnan(direction)],
+                        direction[~np.isnan(direction)],
+                        track,
+                    )
+                    unit_vec_1, unit_vec_2 = pol2cart(dir, 1)
+
+                    sec = interpolate.griddata(
+                        np.vstack((z[valid_combined], track_array[valid_combined])).T,
+                        w_vel_sec[valid_combined],
+                        (z, track_array),
+                    )
+
+                    prim[valid_combined] = w_vel_prim[valid_combined]
+                    sec[valid_combined] = w_vel_sec[valid_combined]
+
+                    u = (sec + prim * unit_vec_1 / unit_vec_2) / (
+                            unit_vec_2 + (unit_vec_1 ** 2) / unit_vec_2)
+
+                    v = (prim - u * unit_vec[0, 1]) / unit_vec[1, 1]
+
+                    # Save interpolated data
+                    self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
+                    self.v_processed_mps = np.tile(np.nan, self.u_mps.shape)
+                    processed_valid_cells = self.estimate_processed_valid_cells(
+                        transect
+                    )
+                    self.u_processed_mps[processed_valid_cells] = u[
+                        processed_valid_cells
+                    ]
+                    self.v_processed_mps[processed_valid_cells] = v[
+                        processed_valid_cells
+                    ]
+
+        valid = self.valid_data[0]
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, axis=0)
+
+        # Process each ensemble beginning with the second ensemble
+        n_ens = len(valid_ens)
+
+        for n in np.arange(1, n_ens):
+            # If ensemble is invalid fill in with previous ensemble
+            if not valid_ens[n]:
+                self.u_processed_mps[:, n] = self.u_processed_mps[:, n - 1]
+                self.v_processed_mps[:, n] = self.v_processed_mps[:, n - 1]
diff --git a/Classes/WaterData.py b/Classes/WaterData.py
new file mode 100644
index 0000000000000000000000000000000000000000..8d3f0975a4f470d4b8439296273c7c539c9a1d06
--- /dev/null
+++ b/Classes/WaterData.py
@@ -0,0 +1,2911 @@
+import copy
+import numpy as np
+from numpy.matlib import repmat
+from scipy import interpolate
+from Classes.BoatData import BoatData
+from MiscLibs.common_functions import cart2pol, pol2cart, iqr, nan_greater, nan_less
+from MiscLibs.robust_loess import rloess
+from MiscLibs.abba_2d_interpolation import abba_idw_interpolation
+
+
+class WaterData(object):
+    """Class to process and store water velocity data.
+
+    Attributes
+    ----------
+    Original data provided to the class:
+        raw_vel_mps: np.array(float)
+            Contains the raw unfiltered velocity in m/s.  1st index 1-4 are
+            beams 1,2,3,4 if beam or u,v,w,d if otherwise.
+        frequency: np.array(float)
+            Defines ADCP frequency used for velocity measurement, in kHz.
+        orig_coord_sys: str
+            Defines the original raw velocity coordinate system "Beam",
+            "Inst", "Ship", "Earth".
+        orig_nav_ref: str
+            Defines the original taw data naviagation reference: "None", "BT",
+             "GGA", "VTG".
+        corr: np.array(float)
+            Correlation values for WT, if available.
+        rssi: np.array(float)
+            Returned acoustic signal strength.
+        rssi_units: str
+            Units for returned acoustic signal strength: "Counts" "dB", "SNR".
+        water_mode: str
+            WaterMode for TRDI or 'Variable' for SonTek.
+        blanking_distance_m: float
+            Distance below transducer where data are marked invalid due to
+             potential ringing.
+        cells_above_sl: np.array(bool)
+            Logical array of depth cells above sidelobe cutoff based on
+            selected depth reference.
+        cells_above_sl_bt: np.array(bool)
+            Logical array of depth cells above the sidelobe cutoff based on BT
+        sl_lag_effect_m: np.array(float)
+            Side lobe distance due to lag and transmit length
+
+    Data computed in this class:
+        u_earth_no_ref_mps: np.array(float)
+            Horizontal velocity in x-direction with no boat reference applied,
+            in m/s.
+        v_earth_no_ref_mps: np.array(float)
+            Horizontal velocity in y-direction with no boat reference applied,
+            in m/s.
+        u_mps: np.array(float)
+            Horizontal velocity in x-direction, earth coord, nav referenced,
+            in m/s.
+        v_mps: np.array(float)
+            Horizontal velocity in y-direction, earth coord, nav referenced,
+            in m/s.
+        u_processed_mps: np.array(float)
+            Horizontal velocity in x-direction, earth coord, nav ref,
+            filtered, and interpolated.
+        v_processed_mps: np.array(float)
+            Horizontal veloctiy in y-direction, earth coord, nav ref,
+            filtered, and interpolated.
+        w_mps: np.array(float)
+            Vertical velocity (+ up), in m/s.
+        d_mps: np.array(float)
+            Difference in vertical velocities compute from opposing beam
+            pairs, in m/s.
+        invalid_index: np.array(bool)
+            Index of ensembles with no valid raw velocity data.
+        num_invalid: float
+            Estimated number of depth cells in ensembles with no valid raw
+            velocity data.
+        valid_data: np.array(float)
+            3-D logical array of valid data
+                Dim1 0 - composite
+                Dim1 1 - original, cells above side lobe
+                Dim1 2 - dfilter
+                Dim1 3 - wfilter
+                Dim1 4 - smoothFilter
+                Dim1 5 - beamFilter
+                Dim1 6 - excluded
+                Dim1 7 - snrFilter
+                Dim1 8 - validDepthFilter
+
+    Processing settings:
+        beam_filter: int
+            Set 3 for 3-beam solutions, 4 for 4-beam solutions.
+        d_filter: str
+            Set difference velocity filter "On", "Off".
+        d_filter_thresholds: float, dict, tuple
+            Threshold(s) for difference velocity filter.
+        w_filter: str
+            Set vertical velocity filter "On", "Off".
+        w_filter_thresholds: float, dict, tuple
+            Threshold(s) for vertical velocity filter.
+        excluded_dist_m: float
+            Distance below transucer for which data are excluded or marked
+            invalid, in m.
+        orig_excluded_dist_m: float
+            Original distance below transucer for which data are excluded or
+            marked invalid, in m.
+        smooth_filter: str
+            Set filter based on smoothing function "On", "Off".
+        smooth_speed: np.array(float)
+            Smoothed mean water speed, in m/s.
+        smooth_upper_limit: np.array(float)
+            Smooth function upper limit of window, in m/s.
+        smooth_lower_limit: np.array(float)
+            Smooth funciton lower limit of window, in m/s.
+        snr_filter: str
+            Set SNR filter for SonTek data "On", "Off".
+        snr_rng: np.array(float)
+            Range of beam averaged SNR
+        snr_3beam_comp: bool
+            Indicates the use of 3-beam velocity computations when invalid SNR is found
+        wt_depth_filter: np.array(bool)
+            WT in ensembles with invalid depths are marked invalid.
+        interpolate_ens: str
+            Type of interpolation: "None", "TRDI", "Linear", 'abba'.
+        interpolate_cells: str
+            Type of cell interpolation: "None", "TRDI", "Linear", 'abba'
+        coord_sys: str
+            Defines the velocity coordinate system "Beam", "Inst", "Ship",
+            "Earth"
+        nav_ref: str
+            Defines the navigation reference: "None", "BT", "GGA", "VTG"
+        sl_cutoff_percent: float
+            Percent cutoff defined by cos(angle)
+        sl_cutoff_number: float
+            User specified number of cells to cutoff from SonTek, not
+            implemented, undefined
+        sl_cutoff_type: str
+            Type of cutoff method "Percent" or "Number".
+        ping_type: np.array(int)
+            Indicates type of ping for each cell: 0-incoherent, 1-coherent,
+            2-surface
+        d_meas_thresholds: list
+            Dictionary of difference velocity thresholds computed using the
+            whole measurement by ping type
+        w_meas_thresholds: list
+            Dictionary of vertical velocity thresholds computed using the
+            whole measurement by ping type
+        use_measurement_thresholds: bool
+            Indicates if the measurement based thresholds should be used
+
+    """
+
+    def __init__(self):
+        """Initialize instance variables."""
+
+        # Data input to this class
+        self.raw_vel_mps = None
+        self.frequency = None
+        self.orig_coord_sys = None
+        self.orig_nav_ref = None
+        self.corr = None
+        self.rssi = None
+        self.rssi_units = None
+        self.water_mode = None
+        self.blanking_distance_m = None
+        self.cells_above_sl = None
+        self.cells_above_sl_bt = None
+        self.sl_lag_effect_m = None
+
+        # Data computed in this class
+        self.u_earth_no_ref_mps = None
+        self.v_earth_no_ref_mps = None
+        self.u_mps = None
+        self.v_mps = None
+        self.u_processed_mps = None
+        self.v_processed_mps = None
+        self.w_mps = None
+        self.d_mps = None
+        self.invalid_index = None
+        self.num_invalid = []
+        self.valid_data = None
+
+        # Settings
+        self.beam_filter = None
+        self.d_filter = None
+        self.d_filter_thresholds = {}
+        self.w_filter = None
+        self.w_filter_thresholds = {}
+        self.excluded_dist_m = None
+        self.orig_excluded_dist_m = None
+        self.smooth_filter = None
+        self.smooth_speed = None
+        self.smooth_upper_limit = None
+        self.smooth_lower_limit = None
+        self.snr_filter = "Off"
+        self.snr_rng = []
+        self.snr_beam_velocities = None
+        self.snr_3beam_comp = False
+        self.wt_depth_filter = True
+        self.interpolate_ens = None
+        self.interpolate_cells = None
+        self.coord_sys = None
+        self.nav_ref = None
+        self.sl_cutoff_percent = None
+        self.sl_cutoff_number = None
+        self.sl_cutoff_type = None
+        self.sl_cutoff_m = None
+        self.ping_type = np.array([])
+
+        # Filter settings populated from Measurement.create_filter_composites
+        self.d_meas_thresholds = {}
+        self.w_meas_thresholds = {}
+
+        self.use_measurement_thresholds = False
+
+    def populate_data(
+            self,
+            vel_in,
+            freq_in,
+            coord_sys_in,
+            nav_ref_in,
+            rssi_in,
+            rssi_units_in,
+            excluded_dist_in,
+            cells_above_sl_in,
+            sl_cutoff_per_in,
+            sl_cutoff_num_in,
+            sl_cutoff_type_in,
+            sl_lag_effect_in,
+            wm_in,
+            blank_in,
+            corr_in=None,
+            surface_vel_in=None,
+            surface_rssi_in=None,
+            surface_corr_in=None,
+            sl_cutoff_m=None,
+            surface_num_cells_in=0,
+            ping_type="U",
+            use_measurement_thresholds=False,
+            snr_3beam_comp=False,
+    ):
+
+        """Populates the variables with input, computed, or default values.
+
+        Parameters
+        ----------
+        vel_in: np.array(float)
+            Contains the raw unfiltered velocity data in m/s.
+            Rows 1-4 are beams 1,2,3,4 if beam or u,v,w,d if otherwise.
+        freq_in: np.array(float)
+            Defines ADCP frequency used for velocity measurement.
+        coord_sys_in: str
+            Defines the original raw  velocity coordinate system "Beam",
+            "Inst", "Ship", "Earth".
+        nav_ref_in: str
+            Defines the original raw data navigation reference: "None", "BT",
+             "GGA", "VTG".
+        rssi_in: np.array(float)
+            Returned acoustic signal strength.
+        rssi_units_in: str
+            Units for returned acoustic signal strength: "Counts", "dB", "SNR".
+        excluded_dist_in: float
+            Distance below transducer for which data are excluded or marked
+            invalid.
+        cells_above_sl_in: np.array(bool)
+            Bool array of depth cells above the sidelobe cutoff based on
+             selected depth reference.
+        sl_cutoff_per_in: float
+            Percent cutoff defined by cos(angle).
+        sl_cutoff_num_in: float
+            User specified number of cells to cutoff above sl_cutoff.
+        sl_cutoff_type_in: str
+            Method used to compute cutoff "Percent" or "Number".
+        sl_lag_effect_in: np.array(float)
+            Lag effect for each ensemble, in m.
+        snr_3beam_comp: bool
+            Indicates the use of 3-beam velocity computations when invalid SNR is found
+        wm_in: str
+            Watermode for TRDI or 'Variable' for SonTek.
+        blank_in: float
+            Blanking distance, in m.
+        corr_in: np.array(float)
+            Correlation values for water track. Optional.
+        surface_vel_in: np.array(float)
+            Surface velocity data for RiverRay, RiverPro, RioPro. Optional.
+        surface_rssi_in: np.array(float)
+            Returned acoust signal strength for RiverRay, RiverPro, RioPro.
+            Optional.
+        surface_corr_in: np.array(float)
+            Surface velocity correlations for RiverRay, RiverPro, RioPro.
+            Optional.
+        surface_num_cells_in: np.array(float)
+            Number of surface cells in each ensemble for RiverRay, RiverPro,
+            RioPro. Optional.
+        sl_cutoff_m: np.array(float)
+            Depth in meters of side lobe cutoff to center of cells.
+        ping_type: np.array(str)
+            Indicates type of ping used for water tracking
+        use_measurement_thresholds: bool
+            Indicates if thresholds should be computed using entire measurement
+        """
+
+        # Set object properties from input data standard for all ADCPs
+        if np.nanmean(freq_in) < 10:
+            self.frequency = freq_in * 1000
+        else:
+            self.frequency = freq_in
+
+        self.orig_coord_sys = coord_sys_in
+        self.coord_sys = coord_sys_in
+        self.orig_nav_ref = nav_ref_in
+        self.nav_ref = nav_ref_in
+        self.water_mode = wm_in
+        self.excluded_dist_m = excluded_dist_in
+        self.rssi_units = rssi_units_in
+        max_cells = cells_above_sl_in.shape[0]
+        self.ping_type = np.tile(np.array([ping_type]), (max_cells, 1))
+        self.use_measurement_thresholds = use_measurement_thresholds
+        self.snr_beam_velocities = None
+        self.snr_3beam_comp = snr_3beam_comp
+
+        # Set object properties that depend on the presence or absence of
+        # surface cells
+        if np.sum(surface_num_cells_in) > 0:
+            surface_num_cells_in[np.isnan(surface_num_cells_in)] = 0
+
+            num_ens = cells_above_sl_in.shape[1]
+            num_reg_cells = vel_in.shape[1]
+            max_surf_cells = max_cells - num_reg_cells
+
+            # Combine surface velocity bins and regular velocity bins into
+            # one matrix
+            self.raw_vel_mps = np.tile([np.nan], [4, max_cells, num_ens])
+            self.rssi = np.tile([np.nan], [4, max_cells, num_ens])
+            self.corr = np.tile([np.nan], [4, max_cells, num_ens])
+
+            if max_surf_cells > 0:
+                self.raw_vel_mps[:, :max_surf_cells, :] = surface_vel_in[
+                                                          :, :max_surf_cells, :
+                                                          ]
+                self.rssi[:, :max_surf_cells, :] = surface_rssi_in[
+                                                   :, :max_surf_cells, :
+                                                   ]
+                self.corr[:, :max_surf_cells, :] = surface_corr_in[
+                                                   :, :max_surf_cells, :
+                                                   ]
+
+            for i_ens in range(num_ens):
+                self.raw_vel_mps[
+                :,
+                int(surface_num_cells_in[i_ens]): int(surface_num_cells_in[i_ens])
+                                                  + num_reg_cells,
+                i_ens,
+                ] = vel_in[:, :num_reg_cells, i_ens]
+                self.rssi[
+                :,
+                int(surface_num_cells_in[i_ens]): int(surface_num_cells_in[i_ens])
+                                                  + num_reg_cells,
+                i_ens,
+                ] = rssi_in[:, :num_reg_cells, i_ens]
+                self.corr[
+                :,
+                int(surface_num_cells_in[i_ens]): int(surface_num_cells_in[i_ens])
+                                                  + num_reg_cells,
+                i_ens,
+                ] = corr_in[:, :num_reg_cells, i_ens]
+                self.ping_type[: int(surface_num_cells_in[i_ens]), i_ens] = "S"
+        else:
+            # No surface cells
+            self.raw_vel_mps = vel_in
+            self.rssi = rssi_in
+            if corr_in.any():
+                self.corr = corr_in
+            else:
+                # No correlations input
+                self.corr = np.tile(np.nan, rssi_in.shape)
+
+        # TODO This doesn't seem correct. If raw data in beam coordinates
+        #  this is not correct.
+        self.u_mps = np.copy(self.raw_vel_mps)[0, :, :]
+        self.v_mps = np.copy(self.raw_vel_mps)[1, :, :]
+        self.w_mps = np.copy(self.raw_vel_mps)[2, :, :]
+        self.d_mps = np.copy(self.raw_vel_mps)[3, :, :]
+
+        self.water_mode = wm_in
+        self.excluded_dist_m = excluded_dist_in
+        self.orig_excluded_dist_m = excluded_dist_in
+
+        # In some rare situations the blank is empty so it is set to the
+        # excluded_dist_in
+        try:
+            blank_in = float(blank_in)
+            self.blanking_distance_m = blank_in
+        except ValueError:
+            self.blanking_distance_m = excluded_dist_in
+
+        self.cells_above_sl = cells_above_sl_in
+        self.cells_above_sl_bt = cells_above_sl_in
+        self.sl_cutoff_percent = sl_cutoff_per_in
+        self.sl_cutoff_number = sl_cutoff_num_in
+        self.sl_cutoff_type = sl_cutoff_type_in
+        self.sl_lag_effect_m = sl_lag_effect_in
+        self.sl_cutoff_m = sl_cutoff_m
+
+        # Set filter defaults to no filtering and no interruption
+        self.beam_filter = 3
+        self.d_filter = "Off"
+        self.d_filter_thresholds = {}
+        self.w_filter = "Off"
+        self.w_filter_thresholds = {}
+        self.smooth_filter = False
+        self.interpolate_ens = "None"
+        self.interpolate_cells = "None"
+
+        # Determine original valid
+
+        # Initialize valid data property
+        self.valid_data = np.tile(self.cells_above_sl, [9, 1, 1])
+
+        # Find invalid raw data
+        valid_vel = np.tile(self.cells_above_sl, [4, 1, 1])
+        valid_vel[np.isnan(self.raw_vel_mps)] = False
+
+        # Identify invalid velocity data (less than 3 valid beams)
+        valid_vel_sum = np.sum(valid_vel, axis=0)
+        valid_data2 = np.copy(self.cells_above_sl)
+        valid_data2[valid_vel_sum < 3] = False
+
+        # Set valid_data property for original data
+        self.valid_data[1, :, :] = valid_data2
+
+        # Combine all filter data to composite valid data
+        self.all_valid_data()
+
+        # Estimate the number of cells in invalid ensembles using
+        # Adjacent valid ensembles
+        valid_data_2_sum = np.nansum(self.valid_data[1], 0)
+        self.invalid_index = np.where(valid_data_2_sum == 0)[0]
+        n_invalid = len(self.invalid_index)
+        for n in range(n_invalid):
+            # Find first valid ensemble
+            idx1 = np.where(valid_data_2_sum[: self.invalid_index[n]] > 0)[0]
+            if len(idx1) > 0:
+                idx1 = idx1[0]
+            else:
+                idx1 = self.invalid_index[n]
+
+            # Find next valid ensemble
+            idx2 = np.where(valid_data_2_sum[: self.invalid_index[n]] > 0)[0]
+            if len(idx2) > 0:
+                idx2 = idx2[-1]
+            else:
+                idx2 = self.invalid_index[n]
+
+            # Estimate number of cells in invalid ensemble
+            self.num_invalid.append(
+                np.floor((valid_data_2_sum[idx1] + valid_data_2_sum[idx2]) / 2)
+            )
+
+        # Set processed data to non-interpolated valid data
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+        self.u_processed_mps[np.logical_not(self.valid_data[0])] = np.nan
+        self.v_processed_mps[np.logical_not(self.valid_data[0])] = np.nan
+
+        # Compute SNR range if SNR data is provided
+        if rssi_units_in == "SNR":
+            self.compute_snr_rng()
+
+    def populate_from_qrev_mat(self, transect):
+        """Populates the object using data from previously saved QRev Matlab
+         file.
+
+        Parameters
+        ----------
+        transect: mat_struct
+            Matlab data structure obtained from sio.loadmat
+        """
+
+        # Data requiring manipulation (special case for 1 ensemble or 1 cell)
+        if len(transect.wVel.rawVel_mps.shape) == 2:
+            if len(transect.boatVel.btVel.rawVel_mps.shape) > 1:
+                # Multiple ensembles with one cell
+                self.raw_vel_mps = np.moveaxis(transect.wVel.rawVel_mps, 1, 0)
+                self.raw_vel_mps = self.raw_vel_mps.reshape(
+                    (self.raw_vel_mps.shape[0], 1, self.raw_vel_mps.shape[1])
+                )
+                self.corr = np.moveaxis(transect.wVel.corr, 1, 0)
+                self.corr = self.corr.reshape(
+                    (self.corr.shape[0], 1, self.corr.shape[1])
+                )
+                self.rssi = np.moveaxis(transect.wVel.rssi, 1, 0)
+                self.rssi = self.rssi.reshape(
+                    (self.rssi.shape[0], 1, self.rssi.shape[1])
+                )
+                self.valid_data = np.moveaxis(transect.wVel.validData, 1, 0)
+                self.valid_data = self.valid_data.reshape(
+                    (self.valid_data.shape[0], 1, self.valid_data.shape[1])
+                )
+                self.u_earth_no_ref_mps = transect.wVel.uEarthNoRef_mps
+                self.u_earth_no_ref_mps = self.u_earth_no_ref_mps.reshape(
+                    (1, self.u_earth_no_ref_mps.shape[0])
+                )
+                self.v_earth_no_ref_mps = transect.wVel.vEarthNoRef_mps
+                self.v_earth_no_ref_mps = self.v_earth_no_ref_mps.reshape(
+                    (1, self.v_earth_no_ref_mps.shape[0])
+                )
+                self.u_mps = transect.wVel.u_mps
+                self.u_mps = self.u_mps.reshape((1, self.u_mps.shape[0]))
+                self.v_mps = transect.wVel.v_mps
+                self.v_mps = self.v_mps.reshape((1, self.v_mps.shape[0]))
+                self.u_processed_mps = transect.wVel.uProcessed_mps
+                self.u_processed_mps = self.u_processed_mps.reshape(
+                    (1, self.u_processed_mps.shape[0])
+                )
+                self.v_processed_mps = transect.wVel.vProcessed_mps
+                self.v_processed_mps = self.v_processed_mps.reshape(
+                    1, self.v_processed_mps.shape[0]
+                )
+                self.w_mps = transect.wVel.w_mps
+                self.w_mps = self.w_mps.reshape((1, self.w_mps.shape[0]))
+                self.d_mps = transect.wVel.d_mps
+                self.d_mps = self.d_mps.reshape((1, self.d_mps.shape[0]))
+                # self.snr_rng = transect.wVel.snrRng
+                # self.snr_rng = self.snr_rng.reshape(1, self.snr_rng.shape[0])
+                self.cells_above_sl = transect.wVel.cellsAboveSL.astype(bool)
+                self.cells_above_sl = self.cells_above_sl.reshape(
+                    1, self.cells_above_sl.shape[0]
+                )
+                self.cells_above_sl_bt = transect.wVel.cellsAboveSLbt.astype(bool)
+                self.cells_above_sl_bt = self.cells_above_sl_bt.reshape(
+                    1, self.cells_above_sl_bt.shape[0]
+                )
+                self.sl_lag_effect_m = np.array([transect.wVel.slLagEffect_m])
+                # Ping type
+                if hasattr(transect.wVel, "ping_type"):
+                    if type(transect.wVel.ping_type) == str:
+                        self.ping_type = np.tile(
+                            transect.wVel.ping_type, self.d_mps.shape
+                        )
+                    else:
+                        self.ping_type = transect.wVel.ping_type[np.newaxis, :]
+
+                    self.ping_type = np.char.strip(self.ping_type)
+                else:
+                    self.ping_type = np.tile("U", self.d_mps.shape)
+            else:
+                # One ensemble with multiple cells
+                self.raw_vel_mps = np.moveaxis(transect.wVel.rawVel_mps, 1, 0)
+                self.raw_vel_mps = self.raw_vel_mps.reshape(
+                    (self.raw_vel_mps.shape[0], self.raw_vel_mps.shape[1], 1)
+                )
+                self.corr = np.moveaxis(transect.wVel.corr, 1, 0)
+                self.corr = self.corr.reshape(
+                    (self.corr.shape[0], self.corr.shape[1], 1)
+                )
+                self.rssi = np.moveaxis(transect.wVel.rssi, 1, 0)
+                self.rssi = self.rssi.reshape(
+                    (self.rssi.shape[0], self.rssi.shape[1], 1)
+                )
+                self.valid_data = np.moveaxis(transect.wVel.validData, 1, 0)
+                self.valid_data = self.valid_data.reshape(
+                    (self.valid_data.shape[0], self.valid_data.shape[1], 1)
+                )
+                self.u_earth_no_ref_mps = transect.wVel.uEarthNoRef_mps
+                self.u_earth_no_ref_mps = self.u_earth_no_ref_mps.reshape(
+                    self.u_earth_no_ref_mps.shape[0], 1
+                )
+                self.v_earth_no_ref_mps = transect.wVel.vEarthNoRef_mps
+                self.v_earth_no_ref_mps = self.v_earth_no_ref_mps.reshape(
+                    self.v_earth_no_ref_mps.shape[0], 1
+                )
+                self.u_mps = transect.wVel.u_mps
+                self.u_mps = self.u_mps.reshape(self.u_mps.shape[0], 1)
+                self.v_mps = transect.wVel.v_mps
+                self.v_mps = self.v_mps.reshape(self.v_mps.shape[0], 1)
+                self.u_processed_mps = transect.wVel.uProcessed_mps
+                self.u_processed_mps = self.u_processed_mps.reshape(
+                    self.u_processed_mps.shape[0], 1
+                )
+                self.v_processed_mps = transect.wVel.vProcessed_mps
+                self.v_processed_mps = self.v_processed_mps.reshape(
+                    self.v_processed_mps.shape[0], 1
+                )
+                self.w_mps = transect.wVel.w_mps
+                self.w_mps = self.w_mps.reshape(self.w_mps.shape[0], 1)
+                self.d_mps = transect.wVel.d_mps
+                self.d_mps = self.d_mps.reshape(self.d_mps.shape[0], 1)
+                # self.snr_rng = transect.wVel.snrRng
+                # self.snr_rng = self.snr_rng.reshape(self.snr_rng.shape[0], 1)
+                self.cells_above_sl = transect.wVel.cellsAboveSL.astype(bool)
+                self.cells_above_sl = self.cells_above_sl.reshape(
+                    self.cells_above_sl.shape[0], 1
+                )
+                self.cells_above_sl_bt = transect.wVel.cellsAboveSLbt.astype(bool)
+                self.cells_above_sl_bt = self.cells_above_sl_bt.reshape(
+                    self.cells_above_sl_bt.shape[0], 1
+                )
+                self.sl_lag_effect_m = np.array([transect.wVel.slLagEffect_m])
+                # Ping type
+                if hasattr(transect.wVel, "ping_type"):
+                    if type(transect.wVel.ping_type) == str:
+                        self.ping_type = np.tile(
+                            transect.wVel.ping_type, self.d_mps.shape
+                        )
+                    else:
+                        self.ping_type = transect.wVel.ping_type[:, np.newaxis]
+                    self.ping_type = np.char.strip(self.ping_type)
+                else:
+                    self.ping_type = np.tile("U", self.d_mps.shape)
+
+        else:
+            n_ensembles = transect.wVel.u_mps.shape[1]
+            n_cells = transect.wVel.u_mps.shape[0]
+            if (
+                    transect.wVel.rawVel_mps.shape[2] != n_ensembles
+                    or transect.wVel.rawVel_mps.shape[1] != n_cells
+            ):
+                self.raw_vel_mps = np.moveaxis(transect.wVel.rawVel_mps, 2, 0)
+            else:
+                self.raw_vel_mps = transect.wVel.rawVel_mps
+
+            if (
+                    transect.wVel.corr.shape[2] != n_ensembles
+                    or transect.wVel.corr.shape[1] != n_cells
+            ):
+                self.corr = np.moveaxis(transect.wVel.corr, 2, 0)
+            else:
+                self.corr = transect.wVel.corr
+
+            if (
+                    transect.wVel.rssi.shape[2] != n_ensembles
+                    or transect.wVel.rssi.shape[1] != n_cells
+            ):
+                self.rssi = np.moveaxis(transect.wVel.rssi, 2, 0)
+            else:
+                self.rssi = transect.wVel.rssi
+
+            if (
+                    transect.wVel.validData.shape[2] != n_ensembles
+                    or transect.wVel.validData.shape[1] != n_cells
+            ):
+                self.valid_data = np.moveaxis(transect.wVel.validData, 2, 0)
+            else:
+                self.valid_data = transect.wVel.validData
+            self.u_earth_no_ref_mps = transect.wVel.uEarthNoRef_mps
+            self.v_earth_no_ref_mps = transect.wVel.vEarthNoRef_mps
+            self.u_mps = transect.wVel.u_mps
+            self.v_mps = transect.wVel.v_mps
+            self.u_processed_mps = transect.wVel.uProcessed_mps
+            self.v_processed_mps = transect.wVel.vProcessed_mps
+            self.w_mps = transect.wVel.w_mps
+            self.d_mps = transect.wVel.d_mps
+            # self.snr_rng = transect.wVel.snrRng
+            self.cells_above_sl = transect.wVel.cellsAboveSL.astype(bool)
+            self.cells_above_sl_bt = transect.wVel.cellsAboveSLbt.astype(bool)
+            self.sl_lag_effect_m = transect.wVel.slLagEffect_m
+            # Ping type
+            if hasattr(transect.wVel, "ping_type"):
+                if type(transect.wVel.ping_type) == str:
+                    self.ping_type = np.tile(transect.wVel.ping_type, self.d_mps.shape)
+                else:
+                    self.ping_type = transect.wVel.ping_type
+                self.ping_type = np.char.strip(self.ping_type)
+            else:
+                self.ping_type = np.tile("U", self.d_mps.shape)
+
+        self.valid_data = self.valid_data.astype(bool)
+        self.frequency = transect.wVel.frequency
+        self.orig_coord_sys = transect.wVel.origCoordSys
+        self.orig_nav_ref = transect.wVel.origNavRef
+        self.rssi_units = transect.wVel.rssiUnits
+        self.water_mode = transect.wVel.waterMode
+        self.blanking_distance_m = transect.wVel.blankingDistance_m
+        self.invalid_index = transect.wVel.invalidIndex
+        if type(transect.wVel.numInvalid) is np.ndarray:
+            self.num_invalid = transect.wVel.numInvalid.tolist()
+        else:
+            self.num_invalid = transect.wVel.numInvalid
+
+        # Settings
+        self.beam_filter = transect.wVel.beamFilter
+        self.d_filter = transect.wVel.dFilter
+        self.d_filter_thresholds = self.struct_to_dict(transect.wVel.dFilterThreshold)
+        self.w_filter = transect.wVel.wFilter
+        self.w_filter_thresholds = self.struct_to_dict(transect.wVel.wFilterThreshold)
+        self.excluded_dist_m = transect.wVel.excludedDist
+        if hasattr(transect.wVel, "orig_excludedDist"):
+            self.orig_excluded_dist_m = transect.wVel.orig_excludedDist
+        else:
+            self.orig_excluded_dist_m = transect.wVel.excludedDist
+        self.smooth_filter = transect.wVel.smoothFilter
+        self.smooth_speed = transect.wVel.smoothSpeed
+        self.smooth_upper_limit = transect.wVel.smoothUpperLimit
+        self.smooth_lower_limit = transect.wVel.smoothLowerLimit
+        self.snr_filter = transect.wVel.snrFilter
+        self.wt_depth_filter = transect.wVel.wtDepthFilter
+        self.interpolate_ens = transect.wVel.interpolateEns
+        self.interpolate_cells = transect.wVel.interpolateCells
+        self.coord_sys = transect.wVel.coordSys
+        self.nav_ref = transect.wVel.navRef
+        self.sl_cutoff_percent = transect.wVel.slCutoffPer
+        self.sl_cutoff_number = transect.wVel.slCutoffNum
+        self.sl_cutoff_type = transect.wVel.slCutoffType
+
+        # Use measurement for filter
+        if hasattr(transect.wVel, "use_measurement_thresholds"):
+            self.use_measurement_thresholds = self.struct_to_dict(
+                transect.wVel.use_measurement_thresholds
+            )
+            self.d_meas_thresholds = self.struct_to_dict(
+                transect.wVel.d_meas_thresholds
+            )
+            self.w_meas_thresholds = self.struct_to_dict(
+                transect.wVel.w_meas_thresholds
+            )
+        else:
+            self.use_measurement_thresholds = False
+            self.d_meas_thresholds = {}
+            self.w_meas_thresholds = {}
+
+    @staticmethod
+    def struct_to_dict(struct):
+        """If input is a mat structure it converts it into a dictionary.
+
+        Parameters
+        ----------
+        struct: mat.struct or other
+            Data to be converted
+
+        Returns
+        -------
+        result: dict or other
+            Result of conversion
+        """
+
+        try:
+            keys = struct._fieldnames
+            result = {}
+            for key in keys:
+                result[key] = struct.__dict__[key]
+        except AttributeError:
+            result = struct
+        return result
+
+    def change_coord_sys(self, new_coord_sys, sensors, adcp):
+        """This function allows the coordinate system to be changed.
+
+        Current implementation is only to allow a change to a higher order
+        coordinate system Beam - Inst - Ship - Earth
+
+        Parameters
+        ----------
+        new_coord_sys: str
+            New coordinate system (Beam, Inst, Ship, Earth)
+        sensors: Sensors
+            Object of Sensors
+        adcp: InstrumentData
+            Object of instrument data
+        """
+
+        if type(self.orig_coord_sys) is list or type(self.orig_coord_sys) is np.ndarray:
+            o_coord_sys = self.orig_coord_sys[0].strip()
+        else:
+            o_coord_sys = self.orig_coord_sys.strip()
+
+        if self.snr_beam_velocities is None:
+            data = self.raw_vel_mps
+        else:
+            data = self.snr_beam_velocities
+            o_coord_sys = "Beam"
+
+        orig_sys = None
+        new_sys = None
+
+        if o_coord_sys != new_coord_sys:
+
+            # Assign the transformation matrix and retrieve the sensor data
+            t_matrix = copy.deepcopy(adcp.t_matrix.matrix)
+            t_matrix_freq = copy.deepcopy(adcp.frequency_khz)
+
+            p = getattr(sensors.pitch_deg, sensors.pitch_deg.selected).data
+            r = getattr(sensors.roll_deg, sensors.roll_deg.selected).data
+            h = getattr(sensors.heading_deg, sensors.heading_deg.selected).data
+
+            # Modify the transformation matrix and heading, pitch
+            # and roll values based on the original coordinate
+            # system so that only the needed values ar used in
+            # computing the new coordinate system.
+            if o_coord_sys.strip() == "Beam":
+                orig_sys = 1
+            elif o_coord_sys.strip() == "Inst":
+                orig_sys = 2
+            elif o_coord_sys.strip() == "Ship":
+                orig_sys = 3
+                p = np.zeros(h.shape)
+                r = np.zeros(h.shape)
+            elif o_coord_sys.strip() == "Earth":
+                orig_sys = 4
+
+            # Assign a value to the new coordinate system
+            if new_coord_sys.strip() == "Beam":
+                new_sys = 1
+            elif new_coord_sys.strip() == "Inst":
+                new_sys = 2
+            elif new_coord_sys.strip() == "Ship":
+                new_sys = 3
+            elif new_coord_sys.strip() == "Earth":
+                new_sys = 4
+
+            # Check to ensure the new coordinate system is a higher order than
+            # the original system
+            if new_sys - orig_sys > 0:
+
+                # Compute trig function for heaing, pitch and roll
+                ch = np.cos(np.deg2rad(h))
+                sh = np.sin(np.deg2rad(h))
+                cp = np.cos(np.deg2rad(p))
+                sp = np.sin(np.deg2rad(p))
+                cr = np.cos(np.deg2rad(r))
+                sr = np.sin(np.deg2rad(r))
+
+                n_ens = self.raw_vel_mps.shape[2]
+
+                for ii in range(n_ens):
+
+                    # Compute matrix for heading, pitch, and roll
+                    hpr_matrix = np.array(
+                        [
+                            [
+                                ((ch[ii] * cr[ii]) + (sh[ii] * sp[ii] * sr[ii])),
+                                (sh[ii] * cp[ii]),
+                                ((ch[ii] * sr[ii]) - sh[ii] * sp[ii] * cr[ii]),
+                            ],
+                            [
+                                (-1 * sh[ii] * cr[ii]) + (ch[ii] * sp[ii] * sr[ii]),
+                                ch[ii] * cp[ii],
+                                (-1 * sh[ii] * sr[ii]) - (ch[ii] * sp[ii] * cr[ii]),
+                            ],
+                            [(-1.0 * cp[ii] * sr[ii]), sp[ii], cp[ii] * cr[ii]],
+                        ]
+                    )
+
+                    # Transform beam coordinates
+                    if o_coord_sys == "Beam":
+
+                        # Determine frequency index for transformation
+                        if len(t_matrix.shape) > 2:
+                            idx_freq = np.where(t_matrix_freq == self.frequency[ii])
+                            t_mult = np.copy(np.squeeze(t_matrix[:, :, idx_freq[0][0]]))
+                        else:
+                            t_mult = np.copy(t_matrix)
+
+                        # Get velocity data
+                        vel_beams = np.copy(data[:, :, ii])
+
+                        # Apply transformation matrix for 4 beam solutions
+                        temp_t = t_mult.dot(vel_beams)
+
+                        # Apply hpr_matrix
+                        temp_thpr = hpr_matrix.dot(temp_t[:3])
+                        temp_thpr = np.vstack([temp_thpr, temp_t[3]])
+
+                        # Check for invalid beams
+                        invalid_idx = np.isnan(vel_beams)
+
+                        # Identify rows requiring 3 beam solutions
+                        n_invalid_col = np.sum(invalid_idx, axis=0)
+                        col_idx = np.where(n_invalid_col == 1)[0]
+
+                        # Compute 3 beam solution, if necessary
+                        if len(col_idx) > 0:
+                            for i3 in range(len(col_idx)):
+                                # Id invalid beam
+                                vel_3_beam = vel_beams[:, col_idx[i3]]
+                                idx_3_beam = np.where(np.isnan(vel_3_beam))[0]
+
+                                # 3 beam solution for non-RiverRay
+                                vel_3_beam_zero = vel_3_beam
+                                vel_3_beam_zero[np.isnan(vel_3_beam)] = 0
+                                vel_error = t_mult[3, :].dot(vel_3_beam_zero)
+                                vel_3_beam[idx_3_beam] = (
+                                        -1 * vel_error / t_mult[3, idx_3_beam]
+                                )
+                                temp_t = t_mult.dot(vel_3_beam)
+
+                                # Apply transformation matrix for 3
+                                # beam solutions
+                                temp_thpr[0:3, col_idx[i3]] = hpr_matrix.dot(temp_t[:3])
+                                temp_thpr[3, col_idx[i3]] = np.nan
+
+                    else:
+                        # Get velocity data
+                        vel_raw = np.copy(np.squeeze(self.raw_vel_mps[:, :, ii]))
+                        temp_thpr = np.array(hpr_matrix).dot(vel_raw[:3, :])
+                        temp_thpr = np.vstack([temp_thpr, vel_raw[3, :]])
+
+                    # Update object
+                    temp_thpr = temp_thpr.T
+                    self.u_mps[:, ii] = temp_thpr[:, 0]
+                    self.v_mps[:, ii] = temp_thpr[:, 1]
+                    self.w_mps[:, ii] = temp_thpr[:, 2]
+                    self.d_mps[:, ii] = temp_thpr[:, 3]
+
+                # Because of padded arrays with zeros and RR has a variable
+                # number of bins, the raw data may be padded with zeros.  The next 4
+                # statements changes those to nan
+                find_padded = (
+                        np.abs(self.u_mps)
+                        + np.abs(self.v_mps)
+                        + np.abs(self.w_mps)
+                        + np.abs(self.d_mps)
+                )
+                self.u_mps[find_padded == 0] = np.nan
+                self.v_mps[find_padded == 0] = np.nan
+                self.w_mps[find_padded == 0] = np.nan
+                self.d_mps[find_padded == 0] = np.nan
+
+                # Assign processed object properties
+                self.u_processed_mps = np.copy(self.u_mps)
+                self.v_processed_mps = np.copy(self.v_mps)
+
+                # Assign coordinate system and reference properties
+                self.coord_sys = new_coord_sys
+                self.nav_ref = self.orig_nav_ref
+
+            else:
+
+                # Reset velocity properties to raw values
+                self.u_mps = np.copy(self.raw_vel_mps[0])
+                self.v_mps = np.copy(self.raw_vel_mps[1])
+                self.w_mps = np.copy(self.raw_vel_mps[2])
+                self.d_mps = np.copy(self.raw_vel_mps[3])
+
+                if adcp.manufacturer == "TRDI":
+                    find_padded = (
+                            np.abs(self.u_mps)
+                            + np.abs(self.v_mps)
+                            + np.abs(self.w_mps)
+                            + np.abs(self.d_mps)
+                    )
+                    self.u_mps[find_padded == 0] = np.nan
+                    self.v_mps[find_padded == 0] = np.nan
+                    self.w_mps[find_padded == 0] = np.nan
+                    self.d_mps[find_padded == 0] = np.nan
+
+                # Assign processed properties
+                self.u_processed_mps = np.copy(self.u_mps)
+                self.v_processed_mps = np.copy(self.v_mps)
+
+        else:
+
+            # Reset velocity properties to raw values
+            self.u_mps = np.copy(self.raw_vel_mps[0])
+            self.v_mps = np.copy(self.raw_vel_mps[1])
+            self.w_mps = np.copy(self.raw_vel_mps[2])
+            self.d_mps = np.copy(self.raw_vel_mps[3])
+
+            if adcp.manufacturer == "TRDI":
+                find_padded = (
+                        np.abs(self.u_mps)
+                        + np.abs(self.v_mps)
+                        + np.abs(self.w_mps)
+                        + np.abs(self.d_mps)
+                )
+                self.u_mps[find_padded == 0] = np.nan
+                self.v_mps[find_padded == 0] = np.nan
+                self.w_mps[find_padded == 0] = np.nan
+                self.d_mps[find_padded == 0] = np.nan
+
+            # Assign processed properties
+            self.u_processed_mps = np.copy(self.u_mps)
+            self.v_processed_mps = np.copy(self.v_mps)
+
+        if new_coord_sys == "Earth":
+            self.u_earth_no_ref_mps = np.copy(self.u_mps)
+            self.v_earth_no_ref_mps = np.copy(self.v_mps)
+
+    def earth_to_beam(self, sensors, adcp):
+        """Converts earth coordinates to beam coordinates.
+
+        Parameters
+        ----------
+        sensors: Sensors
+            Object of class Sensors
+        adcp: InstrumentData
+            Object of class InstrumentData
+        """
+
+        # Create matrix to store results
+        vel_beam = np.tile(np.nan, self.raw_vel_mps.shape)
+
+        # Assign the transformation matrix retrieve the sensor data
+        t_matrix = copy.deepcopy(adcp.t_matrix.matrix)
+        t_matrix_freq = copy.deepcopy(adcp.frequency_khz)
+
+        # Retrieve the sensor data
+        p = getattr(sensors.pitch_deg, sensors.pitch_deg.selected).data
+        r = getattr(sensors.roll_deg, sensors.roll_deg.selected).data
+        h = getattr(sensors.heading_deg, sensors.heading_deg.selected).data
+
+        # Compute trig function for heading, pitch and roll
+        ch = np.cos(np.deg2rad(h))
+        sh = np.sin(np.deg2rad(h))
+        cp = np.cos(np.deg2rad(p))
+        sp = np.sin(np.deg2rad(p))
+        cr = np.cos(np.deg2rad(r))
+        sr = np.sin(np.deg2rad(r))
+
+        # Process each ensemble
+        n_ens = self.raw_vel_mps.shape[2]
+        for ii in range(n_ens):
+
+            # Compute matrix for heading, pitch, and roll
+            hpr_matrix = np.array(
+                [
+                    [
+                        ((ch[ii] * cr[ii]) + (sh[ii] * sp[ii] * sr[ii])),
+                        (sh[ii] * cp[ii]),
+                        ((ch[ii] * sr[ii]) - sh[ii] * sp[ii] * cr[ii]),
+                    ],
+                    [
+                        (-1 * sh[ii] * cr[ii]) + (ch[ii] * sp[ii] * sr[ii]),
+                        ch[ii] * cp[ii],
+                        (-1 * sh[ii] * sr[ii]) - (ch[ii] * sp[ii] * cr[ii]),
+                    ],
+                    [(-1.0 * cp[ii] * sr[ii]), sp[ii], cp[ii] * cr[ii]],
+                ]
+            )
+
+            # Determine frequency index for transformation
+            if len(t_matrix.shape) > 2:
+                idx_freq = np.where(t_matrix_freq == self.frequency[ii])
+                t_mult = np.copy(np.squeeze(t_matrix[:, :, idx_freq[0][0]]))
+            else:
+                t_mult = np.copy(t_matrix)
+
+            # Construct earth velocity matrix for ensemble
+            vel_enu = np.vstack(
+                [
+                    self.u_earth_no_ref_mps[:, ii],
+                    self.v_earth_no_ref_mps[:, ii],
+                    self.w_mps[:, ii],
+                    self.d_mps[:, ii],
+                ]
+            )
+
+            # Compute beam velocities
+            vel_xyz = np.copy(vel_enu)
+            vel_xyz[0:3, :] = np.matmul(np.linalg.inv(hpr_matrix), vel_enu[:3])
+            vel_beam[:, :, ii] = np.matmul(np.linalg.inv(t_mult), vel_xyz)
+
+        return vel_beam
+
+    def set_nav_reference(self, boat_vel):
+        """This function sets the navigation reference.
+
+        The current reference is first removed from the velocity and then the
+        selected reference is applied.
+
+        Parameters
+        ----------
+        boat_vel: BoatStructure
+            Object of BoatStructure
+        """
+
+        # Apply selected navigation reference
+        boat_select = getattr(boat_vel, boat_vel.selected)
+        if boat_select is not None:
+            self.u_mps = np.add(self.u_earth_no_ref_mps, boat_select.u_processed_mps)
+            self.v_mps = np.add(self.v_earth_no_ref_mps, boat_select.v_processed_mps)
+            self.nav_ref = boat_select.nav_ref
+        else:
+            self.u_mps = repmat(
+                [np.nan],
+                self.u_earth_no_ref_mps.shape[0],
+                self.u_earth_no_ref_mps.shape[1],
+            )
+            self.v_mps = repmat(
+                [np.nan],
+                self.v_earth_no_ref_mps.shape[0],
+                self.v_earth_no_ref_mps.shape[1],
+            )
+            if boat_vel.selected == "bt_vel":
+                self.nav_ref = "BT"
+            elif boat_vel.selected == "gga_vel":
+                self.nav_ref = "GGA"
+            elif boat_vel.selected == "vtg_vel":
+                self.nav_ref = "VTG"
+
+        valid_data2 = np.copy(self.cells_above_sl)
+        valid_data2[np.isnan(self.u_mps)] = False
+        self.valid_data[1] = valid_data2
+
+        # Duplicate original to other filters that have yet to be applied
+        self.valid_data[2:] = np.tile(self.valid_data[1], [7, 1, 1])
+
+        # Combine all filter data and update processed properties
+        self.all_valid_data()
+
+    def change_heading(self, boat_vel, heading_chng):
+        """Adjusts the velocity vectors for a change in heading due change in
+        magnetic variation or heading offset.
+
+        Parameters
+        ----------
+        boat_vel: BoatData
+            Object of BoatData
+        heading_chng: float
+            Heading change due to change in magvar or offset, in degrees.
+        """
+        u_nr = self.u_earth_no_ref_mps
+        v_nr = self.v_earth_no_ref_mps
+        direction, mag = cart2pol(u_nr, v_nr)
+        u_nr_rotated, v_nr_rotated = pol2cart(direction - np.deg2rad(heading_chng), mag)
+        self.u_earth_no_ref_mps = u_nr_rotated
+        self.v_earth_no_ref_mps = v_nr_rotated
+
+        # Reprocess water data to get navigation reference corrected velocities
+        self.set_nav_reference(boat_vel)
+
+    def change_heading_source(self, boat_vel, heading):
+        """Applies changes to water velocity when the heading source is
+        changed.
+
+        Typically called when the heading source is changed between external
+        and internal.
+
+        Parameters
+        ----------
+        boat_vel: BoatData
+            Object of BoatData
+        heading: np.array(float)
+            New heading data, in degrees
+        """
+        u_nr = self.u_earth_no_ref_mps
+        v_nr = self.v_earth_no_ref_mps
+        direction, mag = cart2pol(u_nr, v_nr)
+        u_nr_rotated, v_nr_rotated = pol2cart(
+            direction - np.deg2rad(repmat(heading, len(mag), 1)), mag
+        )
+        self.u_earth_no_ref_mps = u_nr_rotated
+        self.v_earth_no_ref_mps = v_nr_rotated
+
+        self.set_nav_reference(boat_vel)
+
+    def apply_interpolation(self, transect, ens_interp="None", cells_interp="None"):
+        """Coordinates the application of water velocity interpolation.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        ens_interp: str
+            Specifies type of interpolation for ensembles
+        cells_interp: str
+            Specifies type of interpolation for cells
+        """
+
+        self.u_processed_mps = np.tile([np.nan], self.u_mps.shape)
+        self.v_processed_mps = np.tile([np.nan], self.v_mps.shape)
+        self.u_processed_mps[self.valid_data[0]] = self.u_mps[self.valid_data[0]]
+        self.v_processed_mps[self.valid_data[0]] = self.v_mps[self.valid_data[0]]
+
+        # Determine interpolation methods to apply
+        if ens_interp == "None":
+            ens_interp = self.interpolate_ens
+        else:
+            self.interpolate_ens = ens_interp
+
+        if cells_interp == "None":
+            cells_interp = self.interpolate_cells
+        else:
+            self.interpolate_cells = cells_interp
+
+        if ens_interp == "abba" or cells_interp == "abba":
+            self.interpolate_ens = "abba"
+            self.interpolate_cells = "abba"
+            self.interpolate_abba(transect)
+        else:
+            if ens_interp == "None":
+                # Sets invalid data to nan with no interpolation
+                self.interpolate_ens_none()
+            elif ens_interp == "ExpandedT":
+                # Sets interpolate to None as the interpolation is done in
+                # class QComp
+                self.interpolate_ens_next()
+            elif ens_interp == "Hold9":
+                # Interpolates using SonTek's method of holding last valid
+                # for up to 9 samples
+                self.interpolate_ens_hold_last_9()
+            elif ens_interp == "Hold":
+                # Interpolates by holding last valid indefinitely
+                self.interpolate_ens_hold_last()
+            elif ens_interp == "Linear":
+                # Interpolates using linear interpolation
+                self.interpolate_ens_linear(transect)
+            elif ens_interp == "TRDI":
+                # TRDI is applied in discharge
+                self.interpolate_ens_none()
+                self.interpolate_ens = ens_interp
+
+            # Apply specified cell interpolation method
+            if cells_interp == "None":
+                # Sets invalid data to nan with no interpolation
+                self.interpolate_cells_none()
+            elif cells_interp == "TRDI":
+                # Use TRDI method to interpolate invalid interior cells
+                self.interpolate_cells_trdi(transect)
+            elif cells_interp == "Linear":
+                # Uses linear interpolation to interpolate velocity for all
+                # invalid bins including those in invalid ensembles
+                # up to 9 samples
+                self.interpolate_cells_linear(transect)
+            elif cells_interp == "Froude":
+                self.interpolate_cells_froude()
+
+    def apply_filter(
+            self,
+            transect,
+            beam=None,
+            difference=None,
+            difference_threshold=None,
+            vertical=None,
+            vertical_threshold=None,
+            other=None,
+            excluded=None,
+            snr=None,
+            wt_depth=None,
+    ):
+        """Coordinates application of specified filters and subsequent
+        interpolation.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        beam: int
+            Setting for beam filter (3, 4, or -1)
+        difference: str
+            Setting for difference filter (Auto, Off, Manual)
+        difference_threshold: float
+            Threshold value for Manual setting.
+        vertical: str
+            Setting for vertical filter (Auto, Off, Manual)
+        vertical_threshold: float
+            Threshold value for Manual setting.
+        other:
+            Setting for other filters (Off, Auto)
+        excluded:
+            Excluded distance below the transducer, in m
+        snr: str
+            SNR filter setting (Auto, Off)
+        wt_depth: bool
+            Setting for marking water data invalid if no available depth
+        """
+
+        # Determine filters to apply
+        if (
+                len(
+                    {
+                        beam,
+                        difference,
+                        difference_threshold,
+                        vertical,
+                        vertical_threshold,
+                        other,
+                        excluded,
+                        snr,
+                        wt_depth,
+                    }
+                )
+                > 1
+        ):
+
+            # Because the snr filter may apply 3-beam solutions the result
+            # could affect other filters, thus it should be run first
+            if snr is not None:
+                self.filter_snr(transect=transect, setting=snr)
+            if difference is not None:
+                if difference == "Manual":
+                    self.filter_diff_vel(
+                        setting=difference, threshold=difference_threshold
+                    )
+                else:
+                    self.filter_diff_vel(setting=difference)
+            if vertical is not None:
+                if vertical == "Manual":
+                    self.filter_vert_vel(setting=vertical, threshold=vertical_threshold)
+                else:
+                    self.filter_vert_vel(setting=vertical)
+            if other is not None:
+                self.filter_smooth(transect=transect, setting=other)
+            if excluded is not None:
+                self.filter_excluded(transect=transect, setting=excluded)
+            if wt_depth is not None:
+                self.filter_wt_depth(transect=transect, setting=wt_depth)
+            if beam is not None:
+                self.filter_beam(setting=beam, transect=transect)
+        else:
+            self.filter_snr(transect=transect, setting=self.snr_filter)
+            self.filter_diff_vel(
+                setting=self.d_filter, threshold=self.d_filter_thresholds
+            )
+            self.filter_vert_vel(
+                setting=self.w_filter, threshold=self.w_filter_thresholds
+            )
+            self.filter_smooth(transect=transect, setting=self.smooth_filter)
+            self.filter_excluded(transect=transect, setting=self.excluded_dist_m)
+            self.filter_beam(setting=self.beam_filter, transect=transect)
+
+    def sos_correction(self, ratio):
+        """Corrects water velocities for a change in speed of sound.
+
+        Parameters
+        ----------
+        ratio: float
+            Ratio of new speed of sound to old speed of sound
+        """
+
+        # Correct water velocities
+        self.u_mps = self.u_mps * ratio
+        self.v_mps = self.v_mps * ratio
+        self.w_mps = self.w_mps * ratio
+        self.u_earth_no_ref_mps = self.u_earth_no_ref_mps * ratio
+        self.v_earth_no_ref_mps = self.v_earth_no_ref_mps * ratio
+
+    def adjust_side_lobe(self, transect):
+        """Adjust the side lobe cutoff for vertical beam and interpolated
+        depths.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        selected = transect.depths.selected
+        depth_selected = getattr(transect.depths, transect.depths.selected)
+        cells_above_slbt = np.copy(self.cells_above_sl_bt)
+
+        # Compute cutoff for vertical beam depths
+        if selected == "vb_depths":
+            sl_cutoff_vb = (
+                    (depth_selected.depth_processed_m - depth_selected.draft_use_m)
+                    * np.cos(np.deg2rad(transect.adcp.beam_angle_deg))
+                    - self.sl_lag_effect_m
+                    + depth_selected.draft_use_m
+            )
+            cells_above_slvb = np.round(
+                depth_selected.depth_cell_depth_m, 2
+            ) < np.round(sl_cutoff_vb, 2)
+            idx = np.where(np.logical_not(transect.depths.bt_depths.valid_data))
+            cells_above_slbt[:, idx] = cells_above_slvb[:, idx]
+            cells_above_sl = np.logical_and(cells_above_slbt, cells_above_slvb)
+        else:
+            cells_above_sl = cells_above_slbt
+
+        # Compute cutoff from interpolated depths
+        valid_beams = depth_selected.depth_beams_m > 0
+        n_valid_beams = np.nansum(valid_beams, 0)
+        # n_valid_beams = np.nansum(depth_selected.valid_beams, 0)
+
+        # Find ensembles with no valid beam depths
+        idx = np.where(n_valid_beams == 0)[0]
+
+        # Determine side lobe cutoff for ensembles with no valid beam depths
+        if len(idx) > 0:
+            if len(self.sl_lag_effect_m) > 1:
+                sl_lag_effect_m = self.sl_lag_effect_m[idx]
+            else:
+                sl_lag_effect_m = self.sl_lag_effect_m
+
+            sl_cutoff_int = (
+                    (depth_selected.depth_processed_m[idx] - depth_selected.draft_use_m)
+                    * np.cos(np.deg2rad(transect.adcp.beam_angle_deg))
+                    - sl_lag_effect_m
+                    + depth_selected.draft_use_m
+            )
+            for i in range(len(idx)):
+                cells_above_sl[:, idx[i]] = np.less(
+                    depth_selected.depth_cell_depth_m[:, idx[i]], sl_cutoff_int[i]
+                )
+
+        # Find ensembles with at least 1 invalid beam depth
+        idx = np.where(np.logical_and(n_valid_beams < 4, n_valid_beams > 0))[0]
+        if len(idx) > 0:
+            if len(self.sl_lag_effect_m) > 1:
+                sl_lag_effect_m = self.sl_lag_effect_m[idx]
+            else:
+                sl_lag_effect_m = self.sl_lag_effect_m
+
+            sl_cutoff_int = (
+                    (depth_selected.depth_processed_m[idx] - depth_selected.draft_use_m)
+                    * np.cos(np.deg2rad(transect.adcp.beam_angle_deg))
+                    - sl_lag_effect_m
+                    + depth_selected.draft_use_m
+            )
+            cells_above_sl_int = np.tile(True, cells_above_sl.shape)
+
+            for i in range(len(idx)):
+                cells_above_sl_int[:, idx[i]] = np.less(
+                    depth_selected.depth_cell_depth_m[:, idx[i]], sl_cutoff_int[i]
+                )
+
+            cells_above_sl[cells_above_sl_int == 0] = 0
+
+        self.cells_above_sl = np.copy(cells_above_sl)
+        valid_vel = np.logical_not(np.isnan(self.u_mps))
+        self.valid_data[1, :, :] = self.cells_above_sl * valid_vel
+        self.all_valid_data()
+        self.compute_snr_rng()
+        self.apply_filter(transect)
+
+    def all_valid_data(self):
+        """Combines the results of all filters to determine a final set of
+        valid data"""
+
+        n_filters = len(self.valid_data[1:, 0, 0])
+
+        # Since invalid SNR are replaced with 3-beam solutions
+        # set these values to true as they will not need interpolation
+        valid_data = np.copy(self.valid_data)
+        if self.snr_3beam_comp:
+            valid_data[7, :, :] = True
+
+        sum_filters = np.nansum(valid_data[1:, :, :], 0) / n_filters
+        valid = np.tile([True], self.cells_above_sl.shape)
+        valid[sum_filters < 1] = False
+        self.valid_data[0] = valid
+
+    def filter_beam(self, setting, transect=None):
+        """Applies beam filter to water velocity data.
+
+        The determination of invalid data depends on whether 3-beam or
+        4-beam solutions are acceptable.  This function can be applied by
+        specifying 3 or 4 beam solutions and setting self.beam_filter to -1
+        which will trigger an automatic mode.  The automatic mode will find
+        all 3 beam solutions and them compare the velocity of the 3 beam
+        solutions to nearest 4 beam solutions.  If the 3 beam solution is
+        within 50% of the average of the neighboring 4 beam solutions the
+        data are deemed valid, if not they are marked invalid.  Thus in
+        automatic mode only those data from 3 beam solutions that are
+        sufficiently different from  the 4 beam solutions are marked
+        invalid. If the number of beams is specified manually, it is applied
+        uniformly for the whole transect.
+
+        Parameters
+        ----------
+        setting: int
+            Setting for beam filter (3, 4, or -1)
+        transect: TransectData
+            Object of TransectData
+        """
+
+        self.beam_filter = setting
+
+        # In manual mode (3 or 4) determine number of raw invalid and number
+        # of 2 beam solutions
+        if self.beam_filter > 0:
+
+            # Find invalid raw data
+            valid_vel = np.array([self.cells_above_sl] * 4)
+            if self.snr_beam_velocities is None:
+                valid_vel[np.isnan(self.raw_vel_mps)] = 0
+            else:
+                valid_vel[np.isnan(self.snr_beam_velocities)] = 0
+            # Determine how many beams or transformed coordinates are valid
+            valid_vel_sum = np.sum(valid_vel, 0)
+            valid = copy.deepcopy(self.cells_above_sl)
+
+            # Compare number of valid beams or velocity coordinates to
+            # filter value
+            valid[
+                np.logical_and((valid_vel_sum < self.beam_filter), (valid_vel_sum > 2))
+            ] = False
+
+            # Save logical of valid data to object
+            self.valid_data[5, :, :] = valid
+
+            # Combine all filter data and update processed properties
+            self.all_valid_data()
+
+        else:
+
+            # Apply automatic filter
+            self.automatic_beam_filter_abba_interpolation(transect)
+
+    def automatic_beam_filter_abba_interpolation(self, transect):
+        """Applies abba interpolation to allow comparison of interpolated and
+        3-beam solutions.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        # Create array indicating which cells do not have 4-beam solutions
+        # and all cells below side lobe are nan
+        temp = copy.deepcopy(self)
+        temp.filter_beam(4)
+        valid_bool = temp.valid_data[5, :, :]
+        valid = valid_bool.astype(float)
+        valid[np.logical_not(temp.cells_above_sl)] = 0
+        valid[np.logical_not(temp.valid_data[1, :, :])] = 0
+
+        # Initialize processed velocity data variables
+        temp.u_processed_mps = copy.deepcopy(temp.u_mps)
+        temp.v_processed_mps = copy.deepcopy(temp.v_mps)
+
+        # Set invalid data to nan in processed velocity data variables
+        temp.u_processed_mps[np.logical_not(valid)] = np.nan
+        temp.v_processed_mps[np.logical_not(valid)] = np.nan
+
+        # Find indices of cells with 3 beams solutions
+        rows_3b, cols_3b = np.where(np.abs(valid) == 0)
+
+        # Check for presence of 3-beam solutions
+        if len(rows_3b) > 0:
+            # Initialize velocity data variables
+            u = copy.deepcopy(self.u_mps)
+            v = copy.deepcopy(self.v_mps)
+
+            u = u[:, transect.in_transect_idx]
+            v = v[:, transect.in_transect_idx]
+
+            u[
+                np.logical_not(temp.valid_data[5, :, transect.in_transect_idx].T)
+            ] = np.nan
+            v[
+                np.logical_not(temp.valid_data[5, :, transect.in_transect_idx].T)
+            ] = np.nan
+            interpolated_data = self.compute_abba_interpolation(
+                wt_data=temp,
+                data_list=[u, v],
+                valid=valid,
+                transect=transect,
+            )
+
+            if interpolated_data is not None:
+                # Compute interpolated to measured ratios and apply filter
+                # criteria
+                for n in range(len(interpolated_data[0])):
+                    u_ratio = (
+                                      temp.u_mps[interpolated_data[0][n][0]]
+                                      / interpolated_data[0][n][1]
+                              ) - 1
+                    v_ratio = (
+                                      temp.v_mps[interpolated_data[1][n][0]]
+                                      / interpolated_data[1][n][1]
+                              ) - 1
+                    if np.abs(u_ratio) < 0.5 and np.abs(v_ratio) < 0.5:
+                        valid_bool[interpolated_data[0][n][0]] = True
+                    else:
+                        valid_bool[interpolated_data[0][n][0]] = False
+                    # n += 1
+
+                # Update object with filter results
+                self.valid_data[5, :, :] = valid_bool
+            else:
+                self.valid_data[5, :, :] = temp.valid_data[5, :, :]
+        else:
+            self.valid_data[5, :, :] = temp.valid_data[5, :, :]
+
+        # Combine all filter data and update processed properties
+        self.all_valid_data()
+
+    def filter_diff_vel(self, setting, threshold=None):
+        """Applies filter to difference velocity.
+
+        Applies either manual or automatic filtering of the difference (error)
+        velocity.  The automatic mode is based on the following:
+        This filter is based on the assumption that the water error velocity
+        should follow a gaussian distribution.  Therefore, 5 standard
+        deviations should encompass all of the valid data.
+        The standard deviation and limits (multiplier*std dev) are computed
+        in an iterative process until filtering out additional data does not
+        change the computed standard deviation.
+
+        Parameters
+        ----------
+        setting: str
+            Filter setting (Auto, Off, Manual)
+        threshold: float, dict
+            Threshold value for Manual setting.
+        """
+
+        # Set difference filter properties
+        self.d_filter = setting
+        if threshold is not None:
+            self.d_filter_thresholds = threshold
+
+        # Get difference data from object
+        d_vel = copy.deepcopy(self.d_mps)
+
+        # NOTE: Versions prior to 1.01 did not apply this step to remove data
+        # below the side lobe cutoff
+        d_vel[np.logical_not(self.cells_above_sl)] = np.nan
+
+        bad_idx_rows = np.array([]).astype(int)
+        bad_idx_cols = np.array([]).astype(int)
+
+        # Apply selected method
+        if self.d_filter == "Manual":
+            d_vel_max_ref = np.abs(self.d_filter_thresholds)
+            d_vel_min_ref = -1 * d_vel_max_ref
+            # Set valid data row 2 for difference velocity filter results
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(d_vel, d_vel_max_ref), nan_less(d_vel, d_vel_min_ref)
+                )
+            )
+        elif self.d_filter == "Off":
+            d_vel_max_ref = np.nanmax(np.nanmax(d_vel)) + 1
+            d_vel_min_ref = np.nanmin(np.nanmin(d_vel)) - 1
+            # Set valid data row 2 for difference velocity filter results
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(d_vel, d_vel_max_ref), nan_less(d_vel, d_vel_min_ref)
+                )
+            )
+            self.d_filter_thresholds = d_vel_max_ref
+
+        elif self.d_filter == "Auto":
+            # Apply threshold from entire measurement processing to each
+            # transect
+            if self.use_measurement_thresholds:
+                self.d_filter_thresholds = self.d_meas_thresholds
+                for p_type in self.d_meas_thresholds.keys():
+                    data_max_ref = self.d_meas_thresholds[p_type][0]
+                    data_min_ref = self.d_meas_thresholds[p_type][1]
+                    data = np.copy(self.d_mps)
+                    data[self.ping_type != p_type] = np.nan
+                    idx_invalid_rows, idx_invalid_cols = np.where(
+                        np.logical_or(
+                            np.greater(data, data_max_ref), np.less(data, data_min_ref)
+                        )
+                    )
+                    if len(idx_invalid_rows) > 0:
+                        if len(bad_idx_rows) > 0:
+                            bad_idx_rows = np.hstack((bad_idx_rows, idx_invalid_rows))
+                            bad_idx_cols = np.hstack((bad_idx_cols, idx_invalid_cols))
+                        else:
+                            bad_idx_rows = idx_invalid_rows
+                            bad_idx_cols = idx_invalid_cols
+
+            # Compute unique threshold for each transect using ping types
+            elif self.ping_type.size > 1:
+
+                # Identify the ping types used in the transect
+                p_types = np.unique(self.ping_type)
+
+                thresholds = {}
+
+                # Apply the filter to each ping type
+                for p_type in p_types:
+                    # Copy of difference velocities
+                    vel_2_filter = copy.deepcopy(d_vel)
+                    # Remove data not associated with the specified ping type
+                    vel_2_filter[self.ping_type != p_type] = np.nan
+                    # Apply filter to data of a single ping type
+                    idx_invalid_rows, idx_invalid_cols, threshold = self.iqr_filter(
+                        vel_2_filter
+                    )
+                    # Combine indices of invalid data for all ping types
+                    if len(idx_invalid_rows) > 0:
+                        if len(bad_idx_rows) > 0:
+                            bad_idx_rows = np.hstack((bad_idx_rows, idx_invalid_rows))
+                            bad_idx_cols = np.hstack((bad_idx_cols, idx_invalid_cols))
+                        else:
+                            bad_idx_rows = idx_invalid_rows
+                            bad_idx_cols = idx_invalid_cols
+                    thresholds[p_type] = threshold
+                self.d_filter_thresholds = thresholds
+
+            # Compute unique threshold for each transect when no ping types
+            # are available
+            else:
+                self.ping_type = np.array(["U"])
+                bad_idx_rows, bad_idx_cols, threshold = self.iqr_filter(d_vel)
+                self.d_filter_thresholds = {"U": threshold}
+
+        valid = copy.deepcopy(self.cells_above_sl)
+        if len(bad_idx_rows) > 0:
+            valid[bad_idx_rows, bad_idx_cols] = False
+        # TODO Seems like if the difference velocity doesn't exist due to a
+        #  3-beam solution it shouldn't be
+        #  flagged as invalid however this is the way it was in Matlab.
+        #  May change this in future.
+        # valid[np.isnan(self.d_mps)] = True
+        self.valid_data[2, :, :] = valid
+
+        # Combine all filter data and update processed properties
+        self.all_valid_data()
+
+    @staticmethod
+    def iqr_filter(data, multiplier=5):
+        """Apply the iqr filter to wt data.
+
+        Parameters
+        ----------
+        data: np.ndarray(float)
+            Array of difference or vertical velocity data
+        multiplier: int
+            Number of IQR's to use to set the threshold
+
+        Returns
+        -------
+        bad_idx_rows: np.ndarray(int)
+            Row indices of invalid data
+        bad_idx_cols: np.ndarray(int)
+            Column indices of invalid data
+        threshold: float
+            Maximum threshold
+        """
+
+        data_max_ref = np.nan
+        data_min_ref = np.nan
+
+        # Check to make sure there are data to process
+        if data.size > 0 and np.any(np.logical_not(np.isnan(data))):
+
+            # Initialize variables
+            data_orig = np.copy(data)
+
+            iqr_diff = 1
+            i = -1
+            # Loop until no additional data are removed
+            while iqr_diff != 0 and i < 1000:
+                i = i + 1
+
+                # Compute standard deviation
+                data_iqr = iqr(data)
+
+                # Compute maximum and minimum thresholds
+                data_max_ref = np.nanmedian(data) + multiplier * data_iqr
+                data_min_ref = np.nanmedian(data) - multiplier * data_iqr
+
+                # Identify valid and invalid data
+                data_bad_rows, data_bad_cols = np.where(
+                    np.logical_or(
+                        nan_greater(data, data_max_ref), nan_less(data, data_min_ref)
+                    )
+                )
+                # Update filtered data array
+                data[data_bad_rows, data_bad_cols] = np.nan
+
+                # Determine differences due to last filter iteration
+                if len(data) > 0:
+                    data_iqr2 = iqr(data)
+                    iqr_diff = data_iqr2 - data_iqr
+                else:
+                    iqr_diff = 0
+
+            # Determine row and column index of invalid cells with invalid data
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(data_orig, data_max_ref),
+                    nan_less(data_orig, data_min_ref),
+                )
+            )
+        else:
+            # All data are invalid
+            # Determine row and column index of invalid cells with invalid data
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(np.greater(data, -1), np.less(data, 1))
+            )
+
+        threshold = [data_max_ref, data_min_ref]
+
+        return bad_idx_rows, bad_idx_cols, threshold
+
+    @staticmethod
+    def meas_iqr_filter(data, multiplier=5):
+        """Apply the iqr filter to wt data.
+
+        Parameters
+        ----------
+        data: np.ndarray(float)
+            Array of difference or vertical velocity data
+        multiplier: int
+            Number of IQR's to use to set the threshold
+
+        Returns
+        -------
+        thresholds: tuple
+            Maximum and minimum thresholds for filter
+        """
+
+        # Initialize variables
+        data_max_ref = np.nan
+        data_min_ref = np.nan
+
+        # Check to make sure there are data to process
+        if data.size > 0 and np.any(np.logical_not(np.isnan(data))):
+            iqr_diff = 1
+            i = -1
+            # Loop until no additional data are removed
+            while iqr_diff != 0 and i < 1000:
+                i = i + 1
+
+                # Compute standard deviation
+                data_iqr = iqr(data)
+
+                # Compute maximum and minimum thresholds
+                data_max_ref = np.nanmedian(data) + multiplier * data_iqr
+                data_min_ref = np.nanmedian(data) - multiplier * data_iqr
+
+                # Identify valid and invalid data
+                bad_idx = np.where(
+                    np.logical_or(
+                        nan_greater(data, data_max_ref), nan_less(data, data_min_ref)
+                    )
+                )
+                # Update filtered data array
+                data[bad_idx] = np.nan
+
+                # Determine differences due to last filter iteration
+                if len(data) > 0:
+                    data_iqr2 = iqr(data)
+                    iqr_diff = data_iqr2 - data_iqr
+                else:
+                    iqr_diff = 0
+
+        thresholds = [data_max_ref, data_min_ref]
+
+        return thresholds
+
+    def filter_vert_vel(self, setting, threshold=None):
+        """Applies filter to vertical velocity.
+
+        Applies either manual or automatic filter of the difference (error)
+        velocity.  The automatic mode is based on the following: This filter
+        is based on the assumption that the water error velocity should follow a
+        gaussian distribution.  Therefore, 4 standard deviations should
+        encompass all of the valid data.  The standard deviation and limits
+        (multplier * standard deviation) are computed in an iterative process
+        until filtering out additional data does not change the
+        computed standard deviation.
+
+        Parameters
+        ---------
+        setting: str
+            Filter setting (Auto, Off, Manual)
+        threshold: float, dict
+            Threshold value for Manual setting.
+        """
+
+        # Set vertical velocity filter properties
+        self.w_filter = setting
+        if threshold is not None:
+            self.w_filter_thresholds = threshold
+
+        # Get difference data from object
+        w_vel = copy.deepcopy(self.w_mps)
+
+        # NOTE: Versions prior to 1.01 did not apply this step to remove data
+        # below the side lobe cutoff
+        w_vel[np.logical_not(self.cells_above_sl)] = np.nan
+
+        w_vel_max_ref = None
+
+        bad_idx_rows = np.array([]).astype(int)
+        bad_idx_cols = np.array([]).astype(int)
+
+        # Apply selected method
+        if self.w_filter == "Manual":
+            w_vel_max_ref = np.abs(self.w_filter_thresholds)
+            w_vel_min_ref = -1 * w_vel_max_ref
+            # Identify valid and invalid data
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(w_vel, w_vel_max_ref), nan_less(w_vel, w_vel_min_ref)
+                )
+            )
+        elif self.w_filter == "Off":
+            w_vel_max_ref = np.nanmax(np.nanmax(w_vel)) + 1
+            w_vel_min_ref = np.nanmin(np.nanmin(w_vel)) - 1
+            # Identify valid and invalid data
+            bad_idx_rows, bad_idx_cols = np.where(
+                np.logical_or(
+                    nan_greater(w_vel, w_vel_max_ref), nan_less(w_vel, w_vel_min_ref)
+                )
+            )
+            self.w_filter_thresholds = w_vel_max_ref
+
+        elif self.w_filter == "Auto":
+            # Apply threshold from entire measurement processing to each
+            # transect
+            if self.use_measurement_thresholds:
+                self.w_filter_thresholds = self.w_meas_thresholds
+                for p_type in self.w_meas_thresholds.keys():
+                    data_max_ref = self.w_meas_thresholds[p_type][0]
+                    data_min_ref = self.w_meas_thresholds[p_type][1]
+                    data = np.copy(self.w_mps)
+                    data[self.ping_type != p_type] = np.nan
+                    idx_invalid_rows, idx_invalid_cols = np.where(
+                        np.logical_or(
+                            np.greater(data, data_max_ref), np.less(data, data_min_ref)
+                        )
+                    )
+                    if len(idx_invalid_rows) > 0:
+                        if len(bad_idx_rows) > 0:
+                            bad_idx_rows = np.hstack((bad_idx_rows, idx_invalid_rows))
+                            bad_idx_cols = np.hstack((bad_idx_cols, idx_invalid_cols))
+                        else:
+                            bad_idx_rows = idx_invalid_rows
+                            bad_idx_cols = idx_invalid_cols
+
+            # Compute unique threshold for each transect using ping types
+            elif self.ping_type.size > 1:
+                # Initialize variables
+                # Identify the ping types used in the transect
+                p_types = np.unique(self.ping_type)
+
+                thresholds = {}
+
+                # Apply the filter to each ping type
+                for p_type in p_types:
+                    # Copy of vertical velocities
+                    vel_2_filter = copy.deepcopy(w_vel)
+                    # Remove data not associated with the specified ping type
+                    vel_2_filter[self.ping_type != p_type] = np.nan
+                    # Apply filter to data of a single ping type
+                    idx_invalid_rows, idx_invalid_cols, threshold = self.iqr_filter(
+                        vel_2_filter
+                    )
+                    # Combine indices of invalid data for all ping types
+                    if len(idx_invalid_rows) > 0:
+                        if len(bad_idx_rows) > 0:
+                            bad_idx_rows = np.hstack((bad_idx_rows, idx_invalid_rows))
+                            bad_idx_cols = np.hstack((bad_idx_cols, idx_invalid_cols))
+                        else:
+                            bad_idx_rows = idx_invalid_rows
+                            bad_idx_cols = idx_invalid_cols
+                    thresholds[p_type] = threshold
+                self.w_filter_thresholds = thresholds
+            # Compute unique threshold for each transect when no ping types
+            # are available
+            else:
+                self.ping_type = np.array(["U"])
+                bad_idx_rows, bad_idx_cols, threshold = self.iqr_filter(w_vel)
+                self.w_filter_thresholds = {"U": threshold}
+
+        valid = copy.deepcopy(self.cells_above_sl)
+        if len(bad_idx_rows) > 0:
+            valid[bad_idx_rows, bad_idx_cols] = False
+        self.valid_data[3, :, :] = valid
+
+        # Set threshold property
+        if np.ma.is_masked(w_vel_max_ref):
+            self.w_filter_thresholds = np.nan
+
+        # Combine all filter data and update processed properties
+        self.all_valid_data()
+
+    def filter_smooth(self, transect, setting):
+        """Filter water speed using a smooth filter.
+
+        Running Standard Deviation filter for water speed
+        This filter employs a running trimmed standard deviation filter to
+        identify and mark spikes in the water speed. First a robust Loess
+        smooth is fitted to the water speed time series and residuals between
+        the raw data and the smoothed line are computed. The trimmed standard
+        eviation is computed by selecting the number of residuals specified by
+        "halfwidth" before the target point and after the target point, but not
+        including the target point. These values are then sorted, and the
+        points with the highest and lowest values are removed from the subset,
+        and the standard deviation of the trimmed subset is computed.
+        The filter criteria are determined by multiplying the standard
+        deviation by a user specified multiplier. This criteria defines a
+        maximum and minimum acceptable residual. Data falling outside the
+        criteria are set to nan.
+
+        Recommended filter settings are:
+        filter_width = 10
+        half_width = 10
+        multiplier = 9
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        setting: str
+            Set filter (Auto, Off)
+        """
+
+        self.smooth_filter = setting
+        upper_limit = None
+        lower_limit = None
+        wt_bad_idx = None
+
+        # Compute ens_time
+        ens_time = np.nancumsum(transect.date_time.ens_duration_sec)
+
+        # Determine if smooth filter should be applied
+        if self.smooth_filter == "Auto":
+
+            # Boat velocity components
+            w_vele = self.u_mps
+            w_veln = self.v_mps
+
+            # Set filter parameters
+            filter_width = 10
+            half_width = 10
+            multiplier = 9
+            cycles = 3
+
+            # Compute mean speed and direction of water
+            w_vele_avg = np.nanmean(w_vele, 0)
+            w_veln_avg = np.nanmean(w_veln, 0)
+            _, speed = cart2pol(w_vele_avg, w_veln_avg)
+
+            # Compute residuals from a robust Loess smooth
+            speed_smooth = rloess(ens_time, speed, filter_width)
+            speed_res = speed - speed_smooth
+
+            # Apply a trimmed standard deviation filter multiple times
+            for i in range(cycles):
+                fill_array = BoatData.run_std_trim(half_width, speed_res.T)
+
+                # Compute filter bounds
+                upper_limit = speed_smooth + multiplier * fill_array
+                lower_limit = speed_smooth - multiplier * fill_array
+
+                # Apply filter to residuals
+                wt_bad_idx = np.where((speed > upper_limit) or (speed < lower_limit))[0]
+                speed_res[wt_bad_idx] = np.nan
+
+            valid = np.copy(self.cells_above_sl)
+
+            valid[:, wt_bad_idx] = False
+            self.valid_data[4, :, :] = valid
+            self.smooth_upper_limit = upper_limit
+            self.smooth_lower_limit = lower_limit
+            self.smooth_speed = speed_smooth
+
+        else:
+            # No filter applied
+            self.valid_data[4, :, :] = np.copy(self.cells_above_sl)
+            self.smooth_upper_limit = np.nan
+            self.smooth_lower_limit = np.nan
+            self.smooth_speed = np.nan
+
+        self.all_valid_data()
+
+    def filter_snr(self, transect, setting):
+        """Filters SonTek data based on SNR.
+
+        Computes the average SNR for all cells above the side lobe cutoff for
+        each beam in each ensemble. If the range in average SNR in an ensemble is greater
+        than 12 dB the water velocity in that ensemble is considered invalid.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        setting: str
+            Setting for filter (Auto, Off)
+        """
+
+        self.snr_filter = setting
+
+        if setting == "Auto":
+
+            # Determines if invalid data should use 3-beam computations
+            if self.snr_3beam_comp and self.d_filter != 3:
+
+                cells_above_sl = np.copy(self.cells_above_sl.astype(float))
+                cells_above_sl[cells_above_sl < 0.5] = np.nan
+                snr_adjusted = self.rssi * cells_above_sl
+                snr_average = np.nanmean(snr_adjusted, 1)
+
+                # Find invalid beams
+                snr_beam_invalid = (np.max(snr_average, axis=0) - snr_average) > 12
+
+                ens_bad_snr = np.any(snr_beam_invalid, axis=0)
+                valid = np.copy(self.cells_above_sl)
+
+                bad_snr_array = np.tile(ens_bad_snr, (valid.shape[0], 1))
+                valid[bad_snr_array] = False
+                w_vel_copy = copy.deepcopy(self)
+                beam_velocities = w_vel_copy.earth_to_beam(
+                    sensors=transect.sensors, adcp=transect.adcp
+                )
+                invalid_beam_value = np.tile(np.nan, valid.shape[0])
+
+                invalid_snr_idx = np.where(snr_beam_invalid)
+
+                beam_velocities[
+                invalid_snr_idx[0], :, invalid_snr_idx[1]
+                ] = invalid_beam_value
+                self.snr_beam_velocities = beam_velocities
+
+            else:
+                bad_snr_idx = np.greater(self.snr_rng, 12)
+                valid = np.copy(self.cells_above_sl)
+
+                bad_snr_array = np.tile(bad_snr_idx, (valid.shape[0], 1))
+                valid[bad_snr_array] = False
+
+            self.valid_data[7, :, :] = valid
+
+            # Combine all filter data and update processed properties
+            self.all_valid_data()
+        elif transect.adcp.manufacturer == "SonTek":
+            self.snr_beam_velocities = None
+            self.valid_data[7, :, :] = np.copy(self.cells_above_sl)
+            self.all_valid_data()
+
+    def filter_wt_depth(self, transect, setting):
+        """Marks water velocity data invalid if there is no valid or
+        interpolated average depth.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        setting: bool
+            Setting for filter (True, False)
+        """
+        self.wt_depth_filter = setting
+        valid = np.copy(self.cells_above_sl)
+
+        if setting:
+            trans_select = getattr(transect.depths, transect.depths.selected)
+            valid[:, np.isnan(trans_select.depth_processed_m)] = False
+        self.valid_data[8, :, :] = valid
+
+        self.all_valid_data()
+
+    def filter_excluded(self, transect, setting):
+        """Marks all data invalid that are closer to the transducer than the
+         setting.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        setting: float
+            Range from the transducer, in m
+        """
+
+        # Initialize variables
+        trans_select = getattr(transect.depths, transect.depths.selected)
+        cell_depth = trans_select.depth_cell_depth_m
+        cell_size = trans_select.depth_cell_size_m
+        draft = trans_select.draft_use_m
+        top_cell_depth = cell_depth - 0.5 * cell_size
+        threshold = np.round((setting + draft), 3)
+
+        # Apply filter
+        exclude = np.round(top_cell_depth, 3) <= threshold
+        valid = np.copy(self.cells_above_sl)
+        valid[exclude] = False
+        self.valid_data[6, :, :] = valid
+
+        # Set threshold property
+        self.excluded_dist_m = setting
+
+        self.all_valid_data()
+
+    def interpolate_abba(
+            self, transect, search_loc=("above", "below", "before", "after")
+    ):
+        """ " Interpolates all data marked invalid using the abba interpolation
+        algorithm.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        search_loc: tuple
+            Locations to search for abba interpolation
+        """
+
+        # Set properties
+        self.interpolate_cells = "abba"
+        self.interpolate_ens = "abba"
+
+        # Get valid data based on all filters applied
+        valid = self.valid_data[0, :, :]
+        valid = valid[:, transect.in_transect_idx]
+
+        # Initialize velocity data variables
+        u = copy.deepcopy(self.u_mps)
+        v = copy.deepcopy(self.v_mps)
+
+        u = u[:, transect.in_transect_idx]
+        v = v[:, transect.in_transect_idx]
+
+        # Set invalid data to nan in processed velocity data variables
+        u[np.logical_not(valid)] = np.nan
+        v[np.logical_not(valid)] = np.nan
+
+        interpolated_data = self.compute_abba_interpolation(
+            wt_data=self,
+            data_list=[u, v],
+            valid=valid,
+            transect=transect,
+            search_loc=search_loc,
+        )
+
+        if interpolated_data is not None:
+            # Incorporate interpolated values
+            for n in range(len(interpolated_data[0])):
+                u[interpolated_data[0][n][0]] = interpolated_data[0][n][1]
+                v[interpolated_data[1][n][0]] = interpolated_data[1][n][1]
+
+        # Save interpolated data, while retaining of the ensembles including
+        # those that are not in the in_transect_idx array
+        self.u_processed_mps[:, :] = np.nan
+        self.v_processed_mps[:, :] = np.nan
+        self.u_processed_mps[:, transect.in_transect_idx] = u
+        self.v_processed_mps[:, transect.in_transect_idx] = v
+
+    @staticmethod
+    def compute_abba_interpolation(
+            wt_data,
+            data_list,
+            valid,
+            transect,
+            search_loc=("above", "below", "before", "after"),
+    ):
+        """Computes the interpolated values for invalid cells using the abba
+        method.
+
+        Parameters
+        ----------
+        wt_data: WaterData
+            Object of WaterData
+        data_list: list
+            List of np.array(float) data to used for interpolation
+        valid: np.ndarray(bool)
+            Array indicating valid to be used for interpolation
+        transect: TransectData
+            Object of TransectData
+        search_loc: tuple
+            Locations to search for abba interpolation
+
+        Returns
+        -------
+        interpolated_data: np.ndarray(float)
+            Array of interpolated data
+        """
+        # Find cells with invalid data
+        valid_cells = wt_data.valid_data[0, :, transect.in_transect_idx]
+        boat_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
+        if boat_selected is not None:
+            boat_valid = boat_selected.valid_data[0, transect.in_transect_idx]
+        else:
+            boat_valid = 0
+
+        if not np.all(valid_cells) and np.nansum(boat_valid) > 1:
+            # Compute distance along shiptrack to be used in interpolation
+            distance_along_shiptrack = transect.boat_vel.compute_boat_track(transect)[
+                "distance_m"
+            ]
+
+            # Where there is invalid boat speed at beginning or end of
+            # transect mark the distance nan to avoid
+            # interpolating velocities that won't be used for discharge
+            if type(distance_along_shiptrack) is np.ndarray:
+                distance_along_shiptrack[0: np.argmax(boat_valid)] = np.nan
+                end_nan = np.argmax(np.flip(boat_valid))
+                if end_nan > 0:
+                    distance_along_shiptrack[-1 * end_nan:] = np.nan
+                # if type(distance_along_shiptrack) is np.ndarray:
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+                cells_above_sl = wt_data.valid_data[6, :, :]
+                cells_above_sl = cells_above_sl[:, transect.in_transect_idx]
+
+                # Interpolate values for  invalid cells with from neighboring
+                # data
+                interpolated_data = abba_idw_interpolation(
+                    data_list=data_list,
+                    valid_data=valid,
+                    cells_above_sl=cells_above_sl,
+                    y_centers=depth_selected.depth_cell_depth_m[
+                              :, transect.in_transect_idx
+                              ],
+                    y_cell_size=depth_selected.depth_cell_size_m[
+                                :, transect.in_transect_idx
+                                ],
+                    y_depth=depth_selected.depth_processed_m[transect.in_transect_idx],
+                    x_shiptrack=distance_along_shiptrack,
+                    search_loc=search_loc,
+                    normalize=True,
+                )
+                return interpolated_data
+            else:
+                return None
+        else:
+            return None
+
+    def interpolate_ens_next(self):
+        """Applies data from the next valid ensemble for ensembles with
+        invalid water velocities.
+        """
+
+        # Set interpolation property for ensembles
+        self.interpolate_ens = "ExpandedT"
+
+        # Set processed data to nan for all invalid data
+        valid = self.valid_data[0]
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+        self.u_processed_mps[np.logical_not(valid)] = np.nan
+        self.v_processed_mps[np.logical_not(valid)] = np.nan
+
+        # Identifying ensembles with no valid data
+        valid_ens = np.any(valid, axis=0)
+        n_ens = len(valid_ens)
+
+        # Set the invalid ensembles to the data in the next valid ensemble
+        for n in np.arange(0, n_ens - 1)[::-1]:
+            if not valid_ens[n]:
+                self.u_processed_mps[:, n] = self.u_processed_mps[:, n + 1]
+                self.v_processed_mps[:, n] = self.v_processed_mps[:, n + 1]
+
+    def interpolate_ens_hold_last(self):
+        """Interpolates velocity data for invalid ensembles by repeating the
+        the last valid data until new valid data is found
+        """
+
+        self.interpolate_ens = "HoldLast"
+
+        valid = self.valid_data[0]
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        # Set invalid data to nan in processed velocity data variables
+        self.u_processed_mps[np.logical_not(valid)] = np.nan
+        self.v_processed_mps[np.logical_not(valid)] = np.nan
+
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, axis=0)
+
+        # Process each ensemble beginning with the second ensemble
+        n_ens = len(valid_ens)
+
+        for n in np.arange(1, n_ens):
+            # If ensemble is invalid fill in with previous ensemble
+            if not valid_ens[n]:
+                self.u_processed_mps[:, n] = self.u_processed_mps[:, n - 1]
+                self.v_processed_mps[:, n] = self.v_processed_mps[:, n - 1]
+
+    def interpolate_ens_hold_last_9(self):
+        """Apply SonTek's approach to invalid data.
+
+        Interpolates velocity data for invalid ensembles by repeating the
+        last valid data for up to 9 ensembles or until new valid data is
+        found. If more the 9 consecutive ensembles are invalid the
+        ensembles beyond the 9th remain invalid. This is for
+        compatibility with SonTek RiverSurveyor Live.
+        """
+
+        self.interpolate_ens = "Hold9"
+
+        valid = self.valid_data[0]
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        # Set invalid data to nan in processed velocity data variables
+        self.u_processed_mps[np.logical_not(valid)] = np.nan
+        self.v_processed_mps[np.logical_not(valid)] = np.nan
+
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, axis=0)
+
+        # Process each ensemble beginning with the second ensemble
+        n_ens = len(valid_ens)
+        n_invalid = 0
+
+        for n in np.arange(1, n_ens):
+            # If ensemble is invalid fill in with previous ensemble
+            if not valid_ens[n] and n_invalid < 10:
+                n_invalid += 1
+                self.u_processed_mps[:, n] = self.u_processed_mps[:, n - 1]
+                self.v_processed_mps[:, n] = self.v_processed_mps[:, n - 1]
+            else:
+                n_invalid = 0
+
+    def interpolate_ens_none(self):
+        """Applies no interpolation for invalid ensembles."""
+
+        self.interpolate_ens = "None"
+
+        valid = self.valid_data[0]
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        # Set invalid data to nan in processed velocity data variables
+        self.u_processed_mps[np.logical_not(valid)] = np.nan
+        self.v_processed_mps[np.logical_not(valid)] = np.nan
+
+    def interpolate_cells_none(self):
+        """Applies no interpolation for invalid cells that are not part of
+        an invalid ensemble."""
+
+        self.interpolate_cells = "None"
+
+        valid = self.valid_data[0]
+
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, axis=0)
+
+        # Process each ensemble beginning with the second ensemble
+        n_ens = len(valid_ens)
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        for n in range(n_ens):
+            # If ensemble is invalid fill in with previous ensemble
+            if valid_ens[n]:
+                invalid_cells = np.logical_not(valid[:, n])
+                self.u_processed_mps[invalid_cells, n] = np.nan
+                self.v_processed_mps[invalid_cells, n] = np.nan
+
+    def interpolate_ens_linear(self, transect):
+        """Uses 2D linear interpolation to estimate values for invalid
+        ensembles.
+
+        Use linear interpolation as computed by scipy's interpolation
+        function to interpolated velocity data for ensembles with no valid
+        velocities.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        self.interpolate_ens = "Linear"
+
+        valid = self.valid_data[0, :, :]
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, 0)
+
+        if np.sum(valid_ens) > 1:
+            trans_select = getattr(transect.depths, transect.depths.selected)
+            # Compute z
+            z = np.divide(
+                np.subtract(
+                    trans_select.depth_processed_m, trans_select.depth_cell_depth_m
+                ),
+                trans_select.depth_processed_m,
+            )
+
+            # Create position array
+            boat_select = getattr(transect.boat_vel, transect.boat_vel.selected)
+            if boat_select is not None:
+                if np.nansum(boat_select.valid_data[0]) > 0:
+                    boat_vel_x = boat_select.u_processed_mps
+                    boat_vel_y = boat_select.v_processed_mps
+                    track_x = boat_vel_x * transect.date_time.ens_duration_sec
+                    track_y = boat_vel_y * transect.date_time.ens_duration_sec
+                    track = np.nancumsum(np.sqrt(track_x ** 2 + track_y ** 2))
+                    track_array = np.tile(track, (self.u_processed_mps.shape[0], 1))
+
+                    # Determine index of all valid data
+                    valid_z = np.logical_not(np.isnan(z))
+                    valid_combined = np.logical_and(valid, valid_z)
+
+                    u = interpolate.griddata(
+                        np.vstack((z[valid_combined], track_array[valid_combined])).T,
+                        self.u_processed_mps[valid_combined],
+                        (z, track_array),
+                    )
+
+                    v = interpolate.griddata(
+                        np.vstack((z[valid_combined], track_array[valid_combined])).T,
+                        self.v_processed_mps[valid_combined],
+                        (z, track_array),
+                    )
+
+                    self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
+                    self.v_processed_mps = np.tile(np.nan, self.u_mps.shape)
+                    processed_valid_cells = self.estimate_processed_valid_cells(
+                        transect
+                    )
+                    self.u_processed_mps[processed_valid_cells] = u[
+                        processed_valid_cells
+                    ]
+                    self.v_processed_mps[processed_valid_cells] = v[
+                        processed_valid_cells
+                    ]
+
+    def interpolate_cells_linear(self, transect):
+        """Uses 2D linear interpolation to estimate values for invalid cells.
+
+        Use linear interpolation as computed by scipy's interpolation
+        function to interpolated velocity data for cells with no valid
+        velocities.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        self.interpolate_ens = "Linear"
+
+        valid = self.valid_data[0, :, :]
+
+        # Initialize processed velocity data variables
+        self.u_processed_mps = np.copy(self.u_mps)
+        self.v_processed_mps = np.copy(self.v_mps)
+
+        trans_select = getattr(transect.depths, transect.depths.selected)
+
+        # Compute z
+        z = np.divide(
+            np.subtract(
+                trans_select.depth_processed_m, trans_select.depth_cell_depth_m
+            ),
+            trans_select.depth_processed_m,
+        )
+
+        # Create position array
+        boat_select = getattr(transect.boat_vel, transect.boat_vel.selected)
+        if boat_select is not None:
+            if np.nansum(boat_select.valid_data[0]) > 0:
+                boat_vel_x = boat_select.u_processed_mps
+                boat_vel_y = boat_select.v_processed_mps
+                track_x = boat_vel_x * transect.date_time.ens_duration_sec
+                track_y = boat_vel_y * transect.date_time.ens_duration_sec
+                track = np.nancumsum(np.sqrt(track_x ** 2 + track_y ** 2))
+                track_array = np.tile(track, (self.u_processed_mps.shape[0], 1))
+
+                # Determine index of all valid data
+                valid_z = np.logical_not(np.isnan(z))
+                valid_combined = np.logical_and(valid, valid_z)
+
+                u = interpolate.griddata(
+                    np.array(
+                        [z[valid_combined].ravel(), track_array[valid_combined].ravel()]
+                    ).T,
+                    self.u_processed_mps[valid_combined].ravel(),
+                    (z, track_array),
+                )
+
+                v = interpolate.griddata(
+                    np.array(
+                        [z[valid_combined].ravel(), track_array[valid_combined].ravel()]
+                    ).T,
+                    self.v_processed_mps[valid_combined].ravel(),
+                    (z, track_array),
+                )
+
+                self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
+                self.u_processed_mps = np.tile(np.nan, self.u_mps.shape)
+                processed_valid_cells = self.estimate_processed_valid_cells(transect)
+                self.u_processed_mps[processed_valid_cells] = u[processed_valid_cells]
+                self.v_processed_mps[processed_valid_cells] = v[processed_valid_cells]
+
+    def interpolate_cells_trdi(self, transect):
+        """Interpolates values for invalid cells using methods similar to
+        WinRiver II.
+
+        This function computes the velocity for the invalid cells using
+        the methods in WinRiver II, but applied to velocity components.
+        Although WinRiver II applies to discharge which theoretically is
+        more correct, mathematically applying to discharge or velocity
+        components is identical. By applying to velocity components the
+        user can see the velocity data interpolated.
+        Power fit uses the power fit equation and no slip uses linear
+        interpolation.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        # Set property
+        self.interpolate_cells = "TRDI"
+
+        # Construct variables
+        depths = getattr(transect.depths, transect.depths.selected)
+        valid = self.valid_data[0]
+        cell_depth = depths.depth_cell_depth_m
+        z_all = np.subtract(depths.depth_processed_m, cell_depth)
+        z = np.copy(z_all)
+        z[np.isnan(self.u_processed_mps)] = np.nan
+        z_adj = np.tile(np.nan, z.shape)
+        n_cells, n_ens = self.u_processed_mps.shape
+        cell_size = depths.depth_cell_size_m
+        exponent = transect.extrap.exponent
+        bot_method = transect.extrap.bot_method
+
+        for n in range(n_ens):
+
+            # Identify first and last valid depth cell
+            idx = np.where(valid[:, n])[0]
+            if len(idx) > 0:
+                idx_first = idx[0]
+                idx_last = idx[-1]
+                idx_middle = np.where(
+                    np.logical_not(valid[idx_first: idx_last + 1, n])
+                )[0]
+
+                # For invalid middle depth cells perform interpolation based
+                # on bottom method
+                if len(idx_middle) > 0:
+                    idx_middle = idx_middle + idx_first
+                    z_adj[idx_middle, n] = z_all[idx_middle, n]
+
+                    # Interpolate velocities using power fit
+                    if bot_method == "Power":
+                        # Compute interpolated u-velocities
+                        z2 = z[:, n] - (0.5 * cell_size[:, n])
+                        z2[nan_less(z2, 0)] = np.nan
+                        coef = (
+                                       (exponent + 1)
+                                       * np.nansum(self.u_processed_mps[:, n] * cell_size[:, n], 0)
+                               ) / np.nansum(
+                            ((z[:, n] + 0.5 * cell_size[:, n]) ** (exponent + 1))
+                            - (z2 ** (exponent + 1)),
+                            0,
+                        )
+
+                        temp = coef * z_adj[:, n] ** exponent
+                        self.u_processed_mps[idx_middle, n] = temp[idx_middle]
+                        # Compute interpolated v-Velocities
+                        coef = (
+                                       (exponent + 1)
+                                       * np.nansum(self.v_processed_mps[:, n] * cell_size[:, n])
+                               ) / np.nansum(
+                            ((z[:, n] + 0.5 * cell_size[:, n]) ** (exponent + 1))
+                            - (z2 ** (exponent + 1))
+                        )
+                        temp = coef * z_adj[:, n] ** exponent
+                        self.v_processed_mps[idx_middle, n] = temp[idx_middle]
+
+                    # Interpolate velocities using linear interpolation
+                    elif bot_method == "No Slip":
+                        self.u_processed_mps[idx_middle, n] = np.interp(
+                            x=cell_depth[idx_middle, n],
+                            xp=cell_depth[valid[:, n], n],
+                            fp=self.u_processed_mps[valid[:, n], n],
+                        )
+                        self.v_processed_mps[idx_middle, n] = np.interp(
+                            x=cell_depth[idx_middle, n],
+                            xp=cell_depth[valid[:, n], n],
+                            fp=self.v_processed_mps[valid[:, n], n],
+                        )
+
+    def estimate_processed_valid_cells(self, transect):
+        """Estimate the number of valid cells for invalid ensembles.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+
+        Returns
+        -------
+        processed_valid_cells: np.ndarray(bool)
+           Estimated valid cells
+        """
+
+        processed_valid_cells = np.copy(self.valid_data[0])
+        valid_data_sum = np.nansum(processed_valid_cells, 0)
+        invalid_ens_idx = np.where(valid_data_sum == 0)[0]
+        n_invalid = len(invalid_ens_idx)
+        depth_cell_depth = transect.depths.bt_depths.depth_cell_depth_m
+        for n in range(n_invalid):
+
+            # Find nearest valid ensembles on either side of invalid ensemble
+            idx1 = np.where(valid_data_sum[: invalid_ens_idx[n]] > 0)[0]
+            if len(idx1) > 0:
+                idx1 = idx1[-1]
+                # Find the last cell in the neighboring valid ensembles
+                idx1_cell = np.where(processed_valid_cells[:, idx1])[0][-1]
+                # Determine valid cells for invalid ensemble
+                idx1_cell_depth = depth_cell_depth[idx1_cell, idx1]
+            else:
+                idx1_cell_depth = 0
+
+            idx2 = np.where(valid_data_sum[invalid_ens_idx[n]:] > 0)[0]
+            if len(idx2) > 0:
+                idx2 = idx2[0]
+                idx2 = invalid_ens_idx[n] + idx2
+                # Find the last cell in the neighboring valid ensembles
+                idx2_cell = np.where(processed_valid_cells[:, idx2])[0][-1]
+                # Determine valid cells for invalid ensemble
+                idx2_cell_depth = depth_cell_depth[idx2_cell, idx2]
+            else:
+                idx2_cell_depth = 0
+
+            cutoff = np.nanmax([idx1_cell_depth, idx2_cell_depth])
+            processed_valid_cells[
+                depth_cell_depth[:, invalid_ens_idx[n]] < cutoff, invalid_ens_idx[n]
+            ] = True
+
+            # Apply excluded distance
+            processed_valid_cells = processed_valid_cells * self.valid_data[6, :, :]
+
+        return processed_valid_cells
+
+    def compute_snr_rng(self):
+        """Computes the range between the average snr for all beams.
+        The average is computed using only data above the side lobe cutoff.
+        """
+        if self.rssi_units == "SNR":
+            cells_above_sl = np.copy(self.cells_above_sl.astype(float))
+            cells_above_sl[cells_above_sl < 0.5] = np.nan
+            snr_adjusted = self.rssi * cells_above_sl
+            snr_average = np.nanmean(snr_adjusted, 1)
+            self.snr_rng = np.nanmax(snr_average, 0) - np.nanmin(snr_average, 0)
+
+    def automated_beam_filter_old(self):
+        """Older version of automatic beam filter. Not currently used."""
+
+        # Create array indicating which cells do not have 4-beam solutions
+        # and all cells below side lobe are nan
+        temp = copy.deepcopy(self)
+        temp.filter_beam(4)
+        valid_bool = temp.valid_data[5, :, :]
+        valid = valid_bool.astype(float)
+        valid[np.logical_not(temp.cells_above_sl)] = np.nan
+
+        # Find cells with 3 beams solutions
+        rows_3b, cols_3b = np.where(np.abs(valid) == 0)
+        if len(rows_3b) > 0:
+            # Find cells with 4 beams solutions
+            valid_rows, valid_cols = np.where(valid == 1)
+
+            valid_u = temp.u_mps[valid == 1]
+            valid_v = temp.v_mps[valid == 1]
+            # Use interpolate water velocity of cells with 3 beam solutions
+
+            # The following code duplicates Matlab scatteredInterpolant which
+            # seems to only estimate along columns as long as there is data in
+            # the ensemble above and below the value being estimated.
+            row_numbers = np.linspace(0, valid.shape[0] - 1, valid.shape[0])
+            n = 0
+            for col in cols_3b:
+                # If the cell has valid data above and below it linearly
+                # interpolate using data in that ensemble.
+                # If not, use other means of interpolation.
+                if np.any(valid_bool[rows_3b[n] + 1::, col]) and np.any(
+                        valid_bool[0: rows_3b[n], col]
+                ):
+                    est_u = np.interp(
+                        x=rows_3b[n],
+                        xp=row_numbers[valid_bool[:, col]],
+                        fp=temp.u_mps[valid_bool[:, col], col],
+                    )
+
+                    est_v = np.interp(
+                        x=rows_3b[n],
+                        xp=row_numbers[valid_bool[:, col]],
+                        fp=temp.v_mps[valid_bool[:, col], col],
+                    )
+                else:
+                    est_u = interpolate.griddata(
+                        np.array((valid_rows, valid_cols)).T, valid_u, (col, rows_3b[n])
+                    )
+                    est_v = interpolate.griddata(
+                        np.array((valid_cols, valid_rows)).T, valid_v, (col, rows_3b[n])
+                    )
+
+                u_ratio = (temp.u_mps[rows_3b[n], col] / est_u) - 1
+                v_ratio = (temp.v_mps[rows_3b[n], col] / est_v) - 1
+                if np.abs(u_ratio) < 0.5 or np.abs(v_ratio) < 0.5:
+                    valid_bool[rows_3b[n], col] = True
+                else:
+                    valid_bool[rows_3b[n], col] = False
+                n += 1
+            self.valid_data[5, :, :] = valid_bool
+        else:
+            self.valid_data[5, :, :] = temp.valid_data[5, :, :]
+
+        # Combine all filter data and update processed properties
+
+        self.all_valid_data()
+
+    def interpolate_cells_froude(self, transect):
+        """Uses Froude interpolation to estimate values for invalid
+        cells.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        self.interpolate_ens = "Froude"
+
+        # Construct variables
+        g = 9.80665
+
+        valid = self.valid_data[0, :, :]
+
+        # Initialize processed velocity data variables
+        u = np.copy(self.u_mps)
+        v = np.copy(self.v_mps)
+
+        # Compute mean velocity components in each ensemble
+        w_vel_mean_u = np.nanmean(u, 0)
+        w_vel_mean_v = np.nanmean(v, 0)
+
+        # Compute a unit vector
+        direction, _ = cart2pol(w_vel_mean_u, w_vel_mean_v)
+        unit_vec_1, unit_vec_2 = pol2cart(direction, 1)
+        unit_vec = np.vstack([unit_vec_1, unit_vec_2])
+
+        # Compute the velocity magnitude in the direction of the mean velocity of each
+        # ensemble using the dot product and unit vector
+        w_vel_prim = np.tile([np.nan], u.shape)
+        w_vel_sec = np.tile([np.nan], u.shape)
+        for i in range(u.shape[0]):
+            w_vel_prim[i, :] = np.sum(
+                np.vstack([u[i, :], v[i, :]]) * unit_vec, 0
+            )
+            w_vel_sec[i, :] = (
+                    unit_vec_2 * u[i, :] - unit_vec_1 * v[i, :]
+            )
+
+        w_vel_mean_prim = np.nanmean(w_vel_prim, axis=0)
+
+        # Determine ensembles with valid data
+        valid_ens = np.any(valid, 0)
+
+        if np.sum(valid_ens) > 1:
+            trans_select = getattr(transect.depths, transect.depths.selected)
+            # Compute z
+            z = np.divide(
+                np.subtract(
+                    trans_select.depth_processed_m, trans_select.depth_cell_depth_m
+                ),
+                trans_select.depth_processed_m,
+            )
+
+            # Create position array
+            boat_select = getattr(transect.boat_vel, transect.boat_vel.selected)
+            if boat_select is not None:
+                if np.nansum(boat_select.valid_data[0]) > 0:
+                    boat_vel_x = boat_select.u_processed_mps
+                    boat_vel_y = boat_select.v_processed_mps
+                    track_x = boat_vel_x * transect.date_time.ens_duration_sec
+                    track_y = boat_vel_y * transect.date_time.ens_duration_sec
+                    track = np.nancumsum(np.sqrt(track_x ** 2 + track_y ** 2))
+                    track_array = np.tile(track, (self.u_processed_mps.shape[0], 1))
+
+                    # Determine index of all valid data
+                    valid_z = np.logical_not(np.isnan(z))
+                    valid_combined = np.logical_and(valid, valid_z)
+
+                    # Compute Froude
+                    depth_transect = trans_select.depth_processed_m
+                    froude = np.divide(w_vel_mean_prim,
+                                       np.sqrt(np.multiply(g, depth_transect)))
+                    froude[np.logical_not(valid_ens)] = np.nan
+
+                    # Interpolate Froude values
+                    interp_froude = interpolate.griddata(track[valid_ens],
+                                                         froude[valid_ens],
+                                                         track)
+
+                    # Compute mean primary velocity
+                    interp_mean_ens_prim = np.multiply(
+                        interp_froude,
+                        np.sqrt(np.multiply(g, depth_transect))
+                    )
+                    # TODO find a better way to extand Froude to velocity
+                    interp_w_vel_prim = np.tile(interp_mean_ens_prim,
+                                                (self.u_processed_mps.shape[0], 1))
+
+                    # Linear interpolation for secondary velocity
+                    interp_w_vel_sec = interpolate.griddata(
+                        np.vstack((z[valid_combined], track_array[valid_combined])).T,
+                        w_vel_sec[valid_combined],
+                        (z, track_array),
+                    )
+
+                    # Define interpolated cells
+                    processed_valid_cells = self.estimate_processed_valid_cells(
+                        transect
+                    )
+                    interp_cells = np.logical_xor(processed_valid_cells, valid_combined)
+
+                    # Change to interpolate values
+                    w_vel_prim[interp_cells] = interp_w_vel_prim[interp_cells]
+                    w_vel_sec[interp_cells] = interp_w_vel_sec[interp_cells]
+
+                    # Initialize processed velocity data variables
+                    self.u_processed_mps = np.copy(self.u_mps)
+                    self.v_processed_mps = np.copy(self.v_mps)
+
+                    for i in range(u.shape[0]):
+                        self.u_processed_mps[i, :] = np.sum(
+                            np.vstack([w_vel_prim[i, :], w_vel_sec[i, :]]) * unit_vec, 0
+                        )
+                        self.v_processed_mps[i, :] = (
+                                unit_vec_2 * w_vel_prim[i, :] - unit_vec_1 * w_vel_sec[i, :]
+                        )
diff --git a/qrevint_22_06_22/Classes/__init__.py b/Classes/__init__.py
similarity index 100%
rename from qrevint_22_06_22/Classes/__init__.py
rename to Classes/__init__.py
diff --git a/Classes/createconfig.py b/Classes/createconfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..b3682e25b802242e28c0d0653fd485f100af99c2
--- /dev/null
+++ b/Classes/createconfig.py
@@ -0,0 +1,40 @@
+import json
+import os
+
+
+class Config:
+    """Creates default config file in json format.
+
+    Attributes
+    ----------
+    config: dict
+        Default config view and processing options.
+    """
+
+    def __init__(self):
+        """Initiate attributes"""
+
+        self.config = {
+            "Units": {"show": True, "default": "SI"},
+            "ColorMap": {"show": True, "default": "viridis"},
+            "RatingPrompt": {"show": True, "default": "false"},
+            "SaveStyleSheet": {"show": True, "default": "false"},
+            "ExtrapWeighting": {"show": True, "default": True},
+            "FilterUsingMeasurement": {"show": True, "default": False},
+            "Uncertainty": {"show": False, "default": "QRev Original"},
+            "MovingBedObservation": {"show": False, "default": False},
+            "ExportCrossSection": {"show": True, "default": True},
+            "MAP": {"show": False},
+            "AutonomousGPS": {"allow": False},
+            "QDigits": {"method": "sigfig", "digits": 3},
+            "SNR": {"Use3Beam": False},
+            "ExtrapolatedSpeed": {"ShowIcon": False},
+            "QA": {"MinTransects": 2, "MinDuration": 720},
+        }
+
+    def export_config(self):
+
+        path = os.path.join(os.getcwd(), "QRev.cfg")
+
+        with open(path, "w") as file:
+            json.dump(self.config, file)
diff --git a/qrevint_22_06_22/Classes/stickysettings.py b/Classes/stickysettings.py
similarity index 68%
rename from qrevint_22_06_22/Classes/stickysettings.py
rename to Classes/stickysettings.py
index 890046731ce998c908abfac9071371adc6148351..6888ac02b3c5985f662afc39a74884fc0beba814 100644
--- a/qrevint_22_06_22/Classes/stickysettings.py
+++ b/Classes/stickysettings.py
@@ -3,14 +3,17 @@ import json
 
 
 class StickySettings(object):
-    """Provides methods to quickly store and retrieve settings to and from disk.
+    """Provides methods to quickly store and retrieve settings to and from
+    disk.
 
-    This class is intended to be used to store simple settings that need to be retained between session of the subject
-    application, such as, last folder opened, or units setting. Any setting that the application needs to know
+    This class is intended to be used to store simple settings that need to be
+    retained between session of the subject application, such as, last folder
+    opened, or units setting. Any setting that the application needs to know
     when it is run again can be stored using the methods in this class.
 
-    Data are stored a dictionary which is then written to a json file having the filename provided by the user and
-    stored in the folder defined by the APPDATA environment variable.
+    Data are stored a dictionary which is then written to a json file having
+    the filename provided by the user and stored in the folder defined by the
+    APPDATA environment variable.
 
     Note
     ----
@@ -28,32 +31,35 @@ class StickySettings(object):
     def __init__(self, arg):
         """Constructor method which establishes the json file.
 
-        If the filename (arg) provided by the user cannot be found a new file is created. If the filename (arg)
-        provided by the user is found the file is opened and all keys and values are read and stored in settings for
-        quick modification by the calling application.
+        If the filename (arg) provided by the user cannont be found a new file
+        is created. If the filename (arg)  provided by the user is found
+        the file is opened and all keys and values are read and stored
+        in settings for  quick modification by the calling application.
 
         Parameters
         ----------
         arg : str
-            User supplied filename excluding the suffix. Example 'myFile' but not 'myFile.json'
+            User supplied filename excluding the suffix. Example 'myFile' but
+            not 'myFile.json'
 
         """
         # Construct filename from user input.
-        self.settings_file = os.path.join(os.getenv('APPDATA'), arg + '.json')
+        self.settings_file = os.path.join(os.getenv("APPDATA"), arg + ".json")
         if os.path.isfile(self.settings_file):
             # Read json into dictionary
-            with open(self.settings_file, 'r') as f:
+            with open(self.settings_file, "r") as f:
                 self.settings = json.load(f)
         else:
             # Create json file with default dictionary
             self.settings = {}
-            with open(self.settings_file, 'w') as f:
+            with open(self.settings_file, "w") as f:
                 json.dump(self.settings, f)
 
     def new(self, key, value):
         """Create new key value pair in settings.
 
-        Method checks to see if key exists. If it exists an error is raised. If the key does not exist it is created.
+        Method checks to see if key exists. If it exists an error is raised.
+        If the key does not exist it is created.
 
         Paramenters
         -----------
@@ -69,16 +75,17 @@ class StickySettings(object):
         """
 
         if key in self.settings:
-            raise KeyError('Key already exists in settings')
+            raise KeyError("Key already exists in settings")
         else:
             self.settings[key] = value
-            with open(self.settings_file, 'w') as f:
+            with open(self.settings_file, "w") as f:
                 json.dump(self.settings, f)
 
     def set(self, key, value):
         """Set value of existing key.
 
-        Method checks to ensure the key exists and sets the value of the key to value. If the key does not exist an
+        Method checks to ensure the key exists and sets the value of the key
+        to value. If the key does not exist an
         error is raised.
 
         Parameters
@@ -95,10 +102,10 @@ class StickySettings(object):
         """
         if key in self.settings:
             self.settings[key] = value
-            with open(self.settings_file, 'w') as f:
+            with open(self.settings_file, "w") as f:
                 json.dump(self.settings, f)
         else:
-            raise KeyError('Key does not exist in settings')
+            raise KeyError("Key does not exist in settings")
 
     def get(self, item):
         """Get value of item for settings.
@@ -117,7 +124,7 @@ class StickySettings(object):
 
         """
 
-        with open(self.settings_file, 'r') as f:
+        with open(self.settings_file, "r") as f:
             self.settings = json.load(f)
 
         return self.settings[item]
diff --git a/qrevint_22_06_22/Classes/test_stickysettings.py b/Classes/test_stickysettings.py
similarity index 63%
rename from qrevint_22_06_22/Classes/test_stickysettings.py
rename to Classes/test_stickysettings.py
index 2c3b6ec7565fee4f4534dc4fed186390cc280f75..ff6c1ec6de6fca8e662d57765e90e04f38cc87d8 100644
--- a/qrevint_22_06_22/Classes/test_stickysettings.py
+++ b/Classes/test_stickysettings.py
@@ -3,16 +3,18 @@ import os
 import sys
 from Classes.stickysettings import StickySettings as ss
 
+# Todo Move this to the test package...
+
 
 def create_filename():
     """Create filename to use in testing"""
     file_exists = True
     n = 0
-    testfile = ''
+    testfile = ""
     while file_exists:
         n += 1
-        testfile = os.path.join(os.getenv('APPDATA'), 'xyz123')
-        if os.path.join(os.getenv('APPDATA'), 'xyz123'):
+        testfile = os.path.join(os.getenv("APPDATA"), "xyz123")
+        if os.path.join(os.getenv("APPDATA"), "xyz123"):
             testfile = testfile + str(n)
         else:
             file_exists = False
@@ -25,44 +27,44 @@ def test_file_creation():
     """Test initialization of StickySettings and file creation"""
     testfile = create_filename()
     _ = ss(testfile)
-    assert os.path.isfile(testfile + '.json')
-    os.remove(testfile + '.json')
+    assert os.path.isfile(testfile + ".json")
+    os.remove(testfile + ".json")
 
 
 def test_store_value():
     """Test creating a file and key value pair and getting the value"""
     testfile = create_filename()
     test_user = ss(testfile)
-    test_user.new('test', True)
-    assert test_user.get('test')
-    os.remove(testfile + '.json')
+    test_user.new("test", True)
+    assert test_user.get("test")
+    os.remove(testfile + ".json")
 
 
 def test_set_value():
     """Test setting a value of an existing key"""
     testfile = create_filename()
     test_user = ss(testfile)
-    test_user.new('test', False)
-    test_user.set('test', True)
-    assert test_user.get('test')
-    os.remove(testfile + '.json')
+    test_user.new("test", False)
+    test_user.set("test", True)
+    assert test_user.get("test")
+    os.remove(testfile + ".json")
 
 
 def test_set_value_failure():
     """Test failure when setting a value for a key that does not exist"""
     testfile = create_filename()
     test_user = ss(testfile)
-    test_user.new('test', True)
+    test_user.new("test", True)
     with pytest.raises(KeyError):
-        test_user.set('Folder', 'AnyFolder')
-    os.remove(testfile + '.json')
+        test_user.set("Folder", "AnyFolder")
+    os.remove(testfile + ".json")
 
 
 def test_get_value_failure():
     """Test failure when requesting a value for a key that does not exist"""
     testfile = create_filename()
     test_user = ss(testfile)
-    test_user.new('test', True)
+    test_user.new("test", True)
     with pytest.raises(KeyError):
-        test_user.get('Folder')
-    os.remove(testfile + '.json')
+        test_user.get("Folder")
+    os.remove(testfile + ".json")
diff --git a/qrevint_22_06_22/MiscLibs/__init__.py b/DischargeFunctions/__init__.py
similarity index 100%
rename from qrevint_22_06_22/MiscLibs/__init__.py
rename to DischargeFunctions/__init__.py
diff --git a/DischargeFunctions/bottom_discharge_extrapolation.cp36-win_amd64.pyd b/DischargeFunctions/bottom_discharge_extrapolation.cp36-win_amd64.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..bc0e099dbfdddfde7686504b2f994ba02a9b8d3c
Binary files /dev/null and b/DischargeFunctions/bottom_discharge_extrapolation.cp36-win_amd64.pyd differ
diff --git a/qrevint_22_06_22/DischargeFunctions/bottom_discharge_extrapolation.py b/DischargeFunctions/bottom_discharge_extrapolation.py
similarity index 75%
rename from qrevint_22_06_22/DischargeFunctions/bottom_discharge_extrapolation.py
rename to DischargeFunctions/bottom_discharge_extrapolation.py
index 71e5a5b1e136088a1ba9939e8666f4537f0a4d80..d1dca08b368e1e4f904888757f16ba9db9e4d1b7 100644
--- a/qrevint_22_06_22/DischargeFunctions/bottom_discharge_extrapolation.py
+++ b/DischargeFunctions/bottom_discharge_extrapolation.py
@@ -1,6 +1,6 @@
 """bottom_discharge_extrapolation
-Computes the extrapolated discharge in the bottom unmeasured portion of an ADCP transect. Methods are consistent with
-equations used by TRDI and SonTek.
+Computes the extrapolated discharge in the bottom unmeasured portion of an ADCP transect.
+Methods are consistent with equations used by TRDI and SonTek.
 
 Example
 -------
@@ -9,10 +9,15 @@ from DischargeFunctions.bottom_discharge_extrapolation import
 
     trans_select = getattr(data_in.depths, data_in.depths.selected)
     num_top_method = {'Power': 0, 'Constant': 1, '3-Point': 2, None: -1}
-    self.top_ens =  extrapolate_top(x_prod, data_in.w_vel.valid_data[0, :, :],
+    self.top_ens =  extrapolate_top(x_prod,
+                                    data_in.w_vel.valid_data[0, :, :],
                                     num_top_method[data_in.extrap.top_method],
-                                    data_in.extrap.exponent, data_in.in_transect_idx, trans_select.depth_cell_size_m,
-                                    trans_select.depth_cell_depth_m, trans_select.depth_processed_m, delta_t,
+                                    data_in.extrap.exponent,
+                                    data_in.in_transect_idx,
+                                    trans_select.depth_cell_size_m,
+                                    trans_select.depth_cell_depth_m,
+                                    trans_select.depth_processed_m,
+                                    delta_t,
                                     num_top_method[top_method], exponent)
 """
 
@@ -20,24 +25,29 @@ import numpy as np
 from numba.pycc import CC
 from numba import njit
 
-cc = CC('bottom_discharge_extrapolation')
+cc = CC("bottom_discharge_extrapolation")
 
 
 # Bottom Discharge Extrapolation with Numba
 # =========================================
-@cc.export('extrapolate_bot', 'f8[:](f8[:, :], b1[:, :], i8, f8, i4[:], f8[:, :], f8[:, :], f8[:], f8[:], '
-                              'optional(i8), optional(f8))')
-def extrapolate_bot(xprod,
-                    w_valid_data,
-                    transect_bot_method,
-                    transect_exponent,
-                    in_transect_idx,
-                    depth_cell_size_m,
-                    depth_cell_depth_m,
-                    depth_processed_m,
-                    delta_t,
-                    bot_method=-1,
-                    exponent=0.1667):
+@cc.export(
+    "extrapolate_bot",
+    "f8[:](f8[:, :], b1[:, :], i8, f8, i4[:], f8[:, :], f8[:, :], f8[:], f8[:], "
+    "optional(i8), optional(f8))",
+)
+def extrapolate_bot(
+    xprod,
+    w_valid_data,
+    transect_bot_method,
+    transect_exponent,
+    in_transect_idx,
+    depth_cell_size_m,
+    depth_cell_depth_m,
+    depth_processed_m,
+    delta_t,
+    bot_method=-1,
+    exponent=0.1667,
+):
     """Computes the extrapolated bottom discharge
 
     Parameters
@@ -100,16 +110,37 @@ def extrapolate_bot(xprod,
                 cell_depth[row, col] = np.nan
 
     # Compute bottom discharge
-    q_bot = discharge_bot(bot_method, exponent, bot_rng, xprod,
-                          cell_size, cell_depth, depth_ens, delta_t, z)
+    q_bot = discharge_bot(
+        bot_method,
+        exponent,
+        bot_rng,
+        xprod,
+        cell_size,
+        cell_depth,
+        depth_ens,
+        delta_t,
+        z,
+    )
 
     return q_bot
 
 
 @njit
-@cc.export('discharge_top', 'f8[:](i8, f8, f8[:], f8[:, :], f8[:, :], f8[:, :], f8[:], f8[:], f8[:, :])')
-def discharge_bot(bot_method, exponent, bot_rng, component,
-                  cell_size, cell_depth, depth_ens, delta_t, z):
+@cc.export(
+    "discharge_top",
+    "f8[:](i8, f8, f8[:], f8[:, :], f8[:, :], f8[:, :], f8[:], f8[:], f8[:, :])",
+)
+def discharge_bot(
+    bot_method,
+    exponent,
+    bot_rng,
+    component,
+    cell_size,
+    cell_depth,
+    depth_ens,
+    delta_t,
+    z,
+):
     """Computes the bottom extrapolated value of the provided component.
 
     Parameters
@@ -136,7 +167,8 @@ def discharge_bot(bot_method, exponent, bot_rng, component,
     Returns
     -------
     bot_value: np.array(float)
-        Total for the specified component integrated over the bottom range for each ensemble
+        Total for the specified component integrated over the bottom range
+        for each ensemble
     """
 
     # Initialize
@@ -164,8 +196,9 @@ def discharge_bot(bot_method, exponent, bot_rng, component,
                     numerator = numerator + numerator_temp
 
                 # Compute the denominator
-                denominator_temp = ((z[row, col] + 0.5 * cell_size[row, col]) ** (exponent + 1)) \
-                                   - ((z[row, col] - 0.5 * cell_size[row, col]) ** (exponent + 1))
+                denominator_temp = (
+                    (z[row, col] + 0.5 * cell_size[row, col]) ** (exponent + 1)
+                ) - ((z[row, col] - 0.5 * cell_size[row, col]) ** (exponent + 1))
                 if np.logical_not(np.isnan(denominator_temp)) and denominator_temp != 0:
                     denominator_valid = True
                     denominator = denominator + denominator_temp
@@ -216,9 +249,17 @@ def discharge_bot(bot_method, exponent, bot_rng, component,
                                 numerator = numerator + numerator_temp
 
                                 # If numerator computed, compute denominator
-                                denominator_temp = ((z[row, col] + 0.5 * cell_size[row, col]) ** (exponent + 1)) \
-                                                   - ((z[row, col] - 0.5 * cell_size[row, col]) ** (exponent + 1))
-                                if np.logical_not(np.isnan(denominator_temp)) and denominator_temp != 0:
+                                denominator_temp = (
+                                    (z[row, col] + 0.5 * cell_size[row, col])
+                                    ** (exponent + 1)
+                                ) - (
+                                    (z[row, col] - 0.5 * cell_size[row, col])
+                                    ** (exponent + 1)
+                                )
+                                if (
+                                    np.logical_not(np.isnan(denominator_temp))
+                                    and denominator_temp != 0
+                                ):
                                     denominator_valid = True
                                     denominator = denominator + denominator_temp
 
@@ -232,9 +273,13 @@ def discharge_bot(bot_method, exponent, bot_rng, component,
                             numerator = numerator + numerator_temp
 
                             # If numerator computed, compute denominator
-                            denominator_temp = ((last_z + 0.5 * last_cell_size) ** (exponent + 1)) \
-                                               - ((last_z - 0.5 * last_cell_size) ** (exponent + 1))
-                            if np.logical_not(np.isnan(denominator_temp)) and denominator_temp != 0:
+                            denominator_temp = (
+                                (last_z + 0.5 * last_cell_size) ** (exponent + 1)
+                            ) - ((last_z - 0.5 * last_cell_size) ** (exponent + 1))
+                            if (
+                                np.logical_not(np.isnan(denominator_temp))
+                                and denominator_temp != 0
+                            ):
                                 denominator_valid = True
                                 denominator = denominator + denominator_temp
 
@@ -243,16 +288,16 @@ def discharge_bot(bot_method, exponent, bot_rng, component,
                     coef[col] = (numerator * (1 + exponent)) / denominator
 
     # Compute the bottom discharge of each profile
-    bot_value = delta_t * (coef / (exponent + 1)) * (bot_rng**(exponent + 1))
+    bot_value = delta_t * (coef / (exponent + 1)) * (bot_rng ** (exponent + 1))
 
     return bot_value
 
 
 @njit
-@cc.export('top_variables', 'f8[:](f8[:, :], b1[:, :], f8[:, :], f8[:, :], f8[:])')
+@cc.export("top_variables", "f8[:](f8[:, :], b1[:, :], f8[:, :], f8[:, :], f8[:])")
 def bot_variables(x_prod, w_valid_data, cell_size, cell_depth, depth_ens):
-    """Computes the index to the bottom most valid cell in each ensemble and the range from
-    the bottom to the bottom of the bottom most cell.
+    """Computes the index to the bottom most valid cell in each ensemble
+    and the range from the bottom to the bottom of the bottom most cell.
 
     Parameters
     ----------
@@ -292,13 +337,15 @@ def bot_variables(x_prod, w_valid_data, cell_size, cell_depth, depth_ens):
         if len(idx_temp) > 0:
             idx_bot = idx_temp[-1]
             # Compute bottom range
-            bot_rng[n] = depth_ens[n] - cell_depth[idx_bot, n] - 0.5 * cell_size[idx_bot, n]
+            bot_rng[n] = (
+                depth_ens[n] - cell_depth[idx_bot, n] - 0.5 * cell_size[idx_bot, n]
+            )
         else:
             bot_rng[n] = 0
 
     return bot_rng
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     # Used to compile code
-    cc.compile()
\ No newline at end of file
+    cc.compile()
diff --git a/DischargeFunctions/top_discharge_extrapolation.cp36-win_amd64.pyd b/DischargeFunctions/top_discharge_extrapolation.cp36-win_amd64.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..da465c5ee89a8c96de613ec1f3f03edaac168e61
Binary files /dev/null and b/DischargeFunctions/top_discharge_extrapolation.cp36-win_amd64.pyd differ
diff --git a/qrevint_22_06_22/DischargeFunctions/top_discharge_extrapolation.py b/DischargeFunctions/top_discharge_extrapolation.py
similarity index 78%
rename from qrevint_22_06_22/DischargeFunctions/top_discharge_extrapolation.py
rename to DischargeFunctions/top_discharge_extrapolation.py
index e6b19ad57295ee38f39b7f7c92293eb374e64117..e494fad7176a3d0df9887fc0be38c817e7143b28 100644
--- a/qrevint_22_06_22/DischargeFunctions/top_discharge_extrapolation.py
+++ b/DischargeFunctions/top_discharge_extrapolation.py
@@ -9,10 +9,15 @@ from DischargeFunctions.top_discharge_extrapolation import
 
     trans_select = getattr(data_in.depths, data_in.depths.selected)
     num_top_method = {'Power': 0, 'Constant': 1, '3-Point': 2, None: -1}
-    self.top_ens =  extrapolate_top(x_prod, data_in.w_vel.valid_data[0, :, :],
+    self.top_ens =  extrapolate_top(x_prod,
+                                    data_in.w_vel.valid_data[0, :, :],
                                     num_top_method[data_in.extrap.top_method],
-                                    data_in.extrap.exponent, data_in.in_transect_idx, trans_select.depth_cell_size_m,
-                                    trans_select.depth_cell_depth_m, trans_select.depth_processed_m, delta_t,
+                                    data_in.extrap.exponent,
+                                    data_in.in_transect_idx,
+                                    trans_select.depth_cell_size_m,
+                                    trans_select.depth_cell_depth_m,
+                                    trans_select.depth_processed_m,
+                                    delta_t,
                                     num_top_method[top_method], exponent)
 """
 
@@ -20,24 +25,29 @@ import numpy as np
 from numba.pycc import CC
 from numba import njit
 
-cc = CC('top_discharge_extrapolation')
+cc = CC("top_discharge_extrapolation")
 
 
 # Top Discharge Extrapolation with Numba
 # ======================================
-@cc.export('extrapolate_top', 'f8[:](f8[:, :], b1[:, :], i8, f8, i4[:], f8[:, :], f8[:, :], f8[:], f8[:], '
-                              'optional(i8), optional(f8))')
-def extrapolate_top(xprod,
-                    w_valid_data,
-                    transect_top_method,
-                    transect_exponent,
-                    in_transect_idx,
-                    depth_cell_size_m,
-                    depth_cell_depth_m,
-                    depth_processed_m,
-                    delta_t,
-                    top_method=-1,
-                    exponent=0.1667):
+@cc.export(
+    "extrapolate_top",
+    "f8[:](f8[:, :], b1[:, :], i8, f8, i4[:], f8[:, :], f8[:, :], f8[:], f8[:], "
+    "optional(i8), optional(f8))",
+)
+def extrapolate_top(
+    xprod,
+    w_valid_data,
+    transect_top_method,
+    transect_exponent,
+    in_transect_idx,
+    depth_cell_size_m,
+    depth_cell_depth_m,
+    depth_processed_m,
+    delta_t,
+    top_method=-1,
+    exponent=0.1667,
+):
     """Computes the extrapolated top discharge.
 
     Parameters
@@ -76,7 +86,9 @@ def extrapolate_top(xprod,
         exponent = transect_exponent
 
     # Compute top variables
-    idx_top, idx_top3, top_rng = top_variables(xprod, w_valid_data, depth_cell_size_m, depth_cell_depth_m)
+    idx_top, idx_top3, top_rng = top_variables(
+        xprod, w_valid_data, depth_cell_size_m, depth_cell_depth_m
+    )
     idx_top = idx_top[in_transect_idx]
     idx_top3 = idx_top3[:, in_transect_idx]
     top_rng = top_rng[in_transect_idx]
@@ -99,18 +111,42 @@ def extrapolate_top(xprod,
                 cell_depth[row, col] = np.nan
 
     # Compute top discharge
-    q_top = discharge_top(top_method, exponent, idx_top, idx_top3, top_rng,
-                          xprod[:, in_transect_idx], cell_size, cell_depth,
-                          depth_ens, delta_t, z)
+    q_top = discharge_top(
+        top_method,
+        exponent,
+        idx_top,
+        idx_top3,
+        top_rng,
+        xprod[:, in_transect_idx],
+        cell_size,
+        cell_depth,
+        depth_ens,
+        delta_t,
+        z,
+    )
 
     return q_top
 
 
 @njit
-@cc.export('discharge_top', 'f8[:](i8, f8, i4[:], i4[:, :], f8[:], f8[:, :], f8[:, :], f8[:, :], f8[:], '
-                            'f8[:], f8[:, :])')
-def discharge_top(top_method, exponent, idx_top, idx_top_3, top_rng, component, cell_size, cell_depth,
-                  depth_ens, delta_t, z):
+@cc.export(
+    "discharge_top",
+    "f8[:](i8, f8, i4[:], i4[:, :], f8[:], f8[:, :], f8[:, :], f8[:, :], f8[:], "
+    "f8[:], f8[:, :])",
+)
+def discharge_top(
+    top_method,
+    exponent,
+    idx_top,
+    idx_top_3,
+    top_rng,
+    component,
+    cell_size,
+    cell_depth,
+    depth_ens,
+    delta_t,
+    z,
+):
     """Computes the top extrapolated value of the provided component.
 
     Parameters
@@ -136,7 +172,8 @@ def discharge_top(top_method, exponent, idx_top, idx_top_3, top_rng, component,
     delta_t: np.array(float)
         Duration of each ensemble compute by QComp
     z: np.array(float)
-        Relative depth from the bottom of each depth cell computed in discharge top method
+        Relative depth from the bottom of each depth cell computed in
+        discharge top method
 
     Returns
     -------
@@ -172,8 +209,9 @@ def discharge_top(top_method, exponent, idx_top, idx_top_3, top_rng, component,
                     numerator = numerator + numerator_temp
 
                 # Compute the denominator
-                denominator_temp = ((z[row, col] + 0.5 * cell_size[row, col]) ** (exponent + 1)) \
-                                   - ((z[row, col] - 0.5 * cell_size[row, col]) ** (exponent + 1))
+                denominator_temp = (
+                    (z[row, col] + 0.5 * cell_size[row, col]) ** (exponent + 1)
+                ) - ((z[row, col] - 0.5 * cell_size[row, col]) ** (exponent + 1))
                 if np.logical_not(np.isnan(denominator_temp)) and denominator_temp != 0:
                     denominator_valid = True
                     denominator = denominator + denominator_temp
@@ -183,8 +221,11 @@ def discharge_top(top_method, exponent, idx_top, idx_top_3, top_rng, component,
                 coef[col] = (numerator * (1 + exponent)) / denominator
 
         # Compute the top discharge for each ensemble
-        top_value = delta_t * (coef / (exponent + 1)) * \
-            (depth_ens**(exponent + 1) - (depth_ens-top_rng)**(exponent + 1))
+        top_value = (
+            delta_t
+            * (coef / (exponent + 1))
+            * (depth_ens ** (exponent + 1) - (depth_ens - top_rng) ** (exponent + 1))
+        )
 
     # Top constant extrapolation
     elif top_method == 1:
@@ -222,22 +263,25 @@ def discharge_top(top_method, exponent, idx_top, idx_top_3, top_rng, component,
                 for k in range(3):
                     if np.isnan(cell_depth[idx_top_3[k, j], j]) == False:
                         sumd = sumd + cell_depth[idx_top_3[k, j], j]
-                        sumd2 = sumd2 + cell_depth[idx_top_3[k, j], j]**2
+                        sumd2 = sumd2 + cell_depth[idx_top_3[k, j], j] ** 2
                         sumq = sumq + component[idx_top_3[k, j], j]
-                        sumqd = sumqd + (component[idx_top_3[k, j], j] * cell_depth[idx_top_3[k, j], j])
+                        sumqd = sumqd + (
+                            component[idx_top_3[k, j], j]
+                            * cell_depth[idx_top_3[k, j], j]
+                        )
                 delta = 3 * sumd2 - sumd**2
                 a = (3 * sumqd - sumq * sumd) / delta
                 b = (sumq * sumd2 - sumqd * sumd) / delta
 
                 # Compute discharge for 3-pt fit
-                qo = (a * top_rng[j]**2) / 2 + b * top_rng[j]
+                qo = (a * top_rng[j] ** 2) / 2 + b * top_rng[j]
                 top_value[j] = delta_t[j] * qo
 
     return top_value
 
 
 @njit
-@cc.export('top_variables', '(f8[:, :], b1[:, :], f8[:, :], f8[:, :])')
+@cc.export("top_variables", "(f8[:, :], b1[:, :], f8[:, :], f8[:, :])")
 def top_variables(xprod, w_valid_data, depth_cell_size_m, depth_cell_depth_m):
     """Computes the index to the top and top three valid cells in each ensemble and
     the range from the water surface to the top of the topmost cell.
@@ -286,7 +330,10 @@ def top_variables(xprod, w_valid_data, depth_cell_size_m, depth_cell_depth_m):
                 for k in range(3):
                     idx_top_3[k, n] = idx_temp[k]
             # Compute top range
-            top_rng[n] = depth_cell_depth_m[idx_top[n], n] - 0.5 * depth_cell_size_m[idx_top[n], n]
+            top_rng[n] = (
+                depth_cell_depth_m[idx_top[n], n]
+                - 0.5 * depth_cell_size_m[idx_top[n], n]
+            )
         else:
             top_rng[n] = 0
             idx_top[n] = 0
@@ -294,6 +341,6 @@ def top_variables(xprod, w_valid_data, depth_cell_size_m, depth_cell_depth_m):
     return idx_top, idx_top_3, top_rng
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     # Used to compile code
     cc.compile()
diff --git a/MAP_class.py b/MAP_class.py
deleted file mode 100644
index bedaad9843a59b7f2dbb7129c16df88dd87ff71e..0000000000000000000000000000000000000000
--- a/MAP_class.py
+++ /dev/null
@@ -1,1603 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Created on Tue Feb  1 17:12:55 2022
-
-@author: blais
-"""
-
-# ========================================
-# External imports
-# ========================================
-import copy
-import numpy as np
-import scipy as sc
-import pandas as pd
-import matplotlib.pyplot as plt
-from scipy.optimize.minpack import curve_fit
-from sklearn.linear_model import LinearRegression
-
-# ========================================
-# Internal imports
-# ========================================
-
-from MiscLibs.common_functions import cart2pol, pol2cart, nan_greater
-from UI.MplCanvas import MplCanvas
-import matplotlib.cm as cm
-from common_functions import show_figure, interpolation, round_it
-
-class MAP:
-    """Multitransect Averaged Profile (MAP) generates an average profile of selected transects.
-
-    Attributes
-    ----------
-    primary_velocity: np.array(float)
-        MAP primary velocity of each middle cell without extrapolation
-    secondary_velocity: np.array(float)
-        MAP secondary velocity of each middle cell without extrapolation
-    vertical_velocity: np.array(float)
-        MAP primary velocity of each middle cell without extrapolation
-    depths: np.array(float) 1D
-        MAP depths
-    extrap_primary_velocity: np.array(float)
-        MAP primary velocity with extrpolation on bottom/top part
-    extrap_secondary_velocity: np.array(float)
-        MAP secondary velocity with extrpolation on bottom/top part
-    extrap_vertical_velocity: np.array(float)
-        MAP vertical velocity with extrpolation on bottom/top part
-    depth_cells_border: np.array(float)
-        Depth borders of each MAP cell, last one of each vertical equal to vertical depth
-    depth_cells_center: np.array(float)
-        Depth center of each MAP cell
-    borders_ens: np.array(float) 1D
-        Borders of each MAP vertical
-       
-    left_distance/right_distance: float
-        MAP edge distance from edge computation
-    left_borders/right_borders: np.array(float) 1D
-        Borders of each MAP vertical from edge computation
-    left_coef/right_coef: float
-        Shape coefficient of MAP edge
-    left_primary_velocity/right_primary_velocity: np.array(float)
-        MAP primary velocity for edge cells
-    left_secondary_velocity/right_secondary_velocity: np.array(float)
-        MAP secondary velocity for edge cells
-    left_vertical_velocity/right_vertical_velocity: np.array(float)
-        MAP vertical velocity for edge cells
-    left_cells_discharge/right_cells_discharge: np.array(float)
-        MAP edge cells discharge
-    left_discharge/right_discharge: float
-        MAP edge total discharge
-        
-    total_discharge: float
-        MAP total discharge with current parameters
-    middle_cells_discharge: np.array(float)
-        MAP discharge of each middle cell (with top/bottom extrapolation if selected)
-    middle_discharge: float
-        MAP middle discharge with top/bottom extrapolation (if selected)
-    """
-
-    def __init__(self):
-        """Initialize class and instance variables."""
-
-        self.primary_velocity = None  # MAP primary velocity of each middle cell without extrapolation
-        self.secondary_velocity = None  # MAP secondary velocity of each middle cell without extrapolation
-        self.vertical_velocity = None  # MAP primary velocity of each middle cell without extrapolation
-        self.depths = None  # MAP depths
-        self.extrap_primary_velocity = None  # MAP primary velocity with extrpolation on bottom/top part
-        self.extrap_secondary_velocity = None  # MAP secondary velocity with extrpolation on bottom/top part
-        self.extrap_vertical_velocity = None  # MAP vertical velocity with extrpolation on bottom/top part
-        self.depth_cells_border = None  # Depth borders of each MAP cell, last one of each vertical equal to vertical depth
-        self.depth_cells_center = None  # Depth center of each MAP cell
-        self.borders_ens = None  # Borders of each MAP vertical
-        self.borders_depth = None
-
-        self.left_distance = None  # MAP edge distance from edge computation
-        self.left_borders = None  # Borders of each MAP vertical from edge computation
-        self.left_coef = None  # Shape coefficient of MAP edge
-        self.left_primary_velocity = None  # MAP primary velocity for edge cells
-        self.left_secondary_velocity = None  # MAP secondary velocity for edge cells
-        self.left_vertical_velocity = None  # MAP vertical velocity for edge cells
-        self.left_cells_discharge = None  # MAP edge cells discharge
-        self.left_discharge = None  # MAP edge total discharge
-        self.right_distance = None  # MAP edge distance from edge computation
-        self.right_borders = None  # Borders of each MAP vertical from edge computation
-        self.right_coef = None  # Shape coefficient of MAP edge
-        self.right_primary_velocity = None  # MAP primary velocity for edge cells
-        self.right_secondary_velocity = None  # MAP secondary velocity for edge cells
-        self.right_vertical_velocity = None  # MAP vertical velocity for edge cells
-        self.right_cells_discharge = None  # MAP edge cells discharge
-        self.right_discharge = None  # MAP edge total discharge
-
-        self.total_discharge = None  # MAP total discharge with current parameters
-        self.middle_cells_discharge = None  # MAP discharge of each middle cell (with top/bottom extrapolation if selected)
-        self.middle_discharge = None  # MAP middle discharge with top/bottom extrapolation (if selected)
-
-    def populate_data(self, meas, node_horizontal_user, node_vertical_user,
-                      edge_constant=False, extrap_option=True, interp_option=True,
-                      track_section=True, plot=False, name_meas='unknown', path_results=''):
-        """Parameters
-        ----------
-        meas: Measurement
-            Object of Measurement class
-        node_horizontal_user: float
-            Length of MAP cells, if None automatical value is selected
-        node_vertical_user: float
-            Depth of MAP cells, if None automatical value is selected
-        edge_constant: bool
-            Indicates if edge cells should all be the same size
-        extrap_option: bool
-            Indicates if top/bottom/edges extrapolation should be applied
-        interp_option: bool
-            Indicates if velocities interpolation should be applied
-        track_section: bool
-            Indicates if average cross-section should be computed on boat track (True) or 
-            on mean velocities direction (False)
-        plot: bool
-            Indicates if graphics should be plotted and saved
-        name_meas: str
-            Indicates graphics name for save
-        path_results: str
-            Indicates the path to save graphics
-        """
-        # Get meas current parameters
-        settings = meas.current_settings()
-        navigation_reference = settings['NavRef']
-        checked_transect_idx = meas.checked_transect_idx
-        if all(deg == 0 for deg in meas.transects[checked_transect_idx[0]].sensors.heading_deg.internal.data):
-            print("MAP failed : No compass available")
-        else:
-            if not extrap_option:
-                self.extrap_option = extrap_option
-                transect = meas.transects[checked_transect_idx[0]]
-                top_cell = transect.depths.bt_depths.depth_cell_depth_m[0, 0] - \
-                           transect.depths.bt_depths.depth_cell_size_m[0, 0] / 2
-            else:
-                self.extrap_option = extrap_option
-                top_cell = 0
-            # Get main data from selected transects
-            x_raw_coordinates, y_raw_coordinates, w_vel_x, w_vel_y, w_vel_z, \
-            depth_data, q_cells, orig_start_edge, invalid_data, cell_depth, \
-            left_geometry, right_geometry, dmg = MAP.collect_data(meas, navigation_reference, checked_transect_idx,
-                                                                  interp_option)
-
-            # Compute coefficients of the average cross-section
-            alpha, beta, direction_meas, q_ens = MAP.compute_coef(x_raw_coordinates, y_raw_coordinates,
-                                                                  w_vel_x, w_vel_y, q_cells, track_section)
-
-            # Project raw coordinates on average cross-section
-            x_projected, y_projected, acs_distance_raw = MAP.project_transect(alpha, beta, x_raw_coordinates,
-                                                                              y_raw_coordinates)
-
-            # Compare bathymetry and translate transects on average cross-section if needed
-            acs_distance = MAP.translated_transects(acs_distance_raw, depth_data)
-
-            # Define horizontal and vertical mesh
-            borders_ens_raw, nodes_depth_raw = MAP.compute_node_size(cell_depth, acs_distance,
-                                                                     depth_data, node_horizontal_user,
-                                                                     node_vertical_user, top_cell)
-            self.borders_depth = nodes_depth_raw
-            # Compute transect median velocity on each mesh (North, East and vertical velocities) and depth on each vertical
-            transects_node_x_velocity, transects_node_y_velocity, transects_node_vertical_velocity, \
-            transects_node_depth, transects_nodes = MAP.compute_nodes_velocity(navigation_reference,
-                                                                               checked_transect_idx, w_vel_x, w_vel_y,
-                                                                               w_vel_z,
-                                                                               cell_depth, depth_data, acs_distance,
-                                                                               borders_ens_raw, nodes_depth_raw,
-                                                                               orig_start_edge)
-
-            # Compute mesh mean value of selected transects
-            MAP_x_velocity, MAP_y_velocity = self.compute_mean(transects_nodes, transects_node_x_velocity,
-                                                               transects_node_y_velocity,
-                                                               transects_node_vertical_velocity,
-                                                               transects_node_depth, borders_ens_raw, nodes_depth_raw)
-
-            # Compute primary and secondary velocity according Rozovskii projection
-            mid_direction = self.compute_rozovskii(MAP_x_velocity, MAP_y_velocity)
-
-            # Compute edges parameters
-            if extrap_option:
-                self.left_distance, self.left_coef = [x for x in left_geometry]
-                self.right_distance, self.right_coef = [x for x in right_geometry]
-            else:
-                self.left_distance = 0
-                self.right_distance = 0
-
-            # Compute top/bottom extrapolation according QRevInt velocity exponent
-            self.compute_extrap_velocity(nodes_depth_raw, settings, extrap_option)
-
-            # Compute edge extrapolation
-            left_direction, right_direction, left_area, right_area, left_mid_cells_x, right_mid_cells_x, \
-            left_mid_cells_y, right_mid_cells_y = self.compute_edges(borders_ens_raw, mid_direction, settings,
-                                                                     edge_constant)
-
-            # Compute discharge
-            self.compute_discharge(direction_meas, mid_direction, extrap_option, left_direction, right_direction,
-                                   left_area, right_area)
-            if plot:
-                self.plot_projected_data(alpha, beta, x_raw_coordinates, y_raw_coordinates, x_projected, y_projected,
-                                         path_results, name_meas, q_ens)
-                self.plot_profile(borders_ens_raw, nodes_depth_raw, left_mid_cells_x, right_mid_cells_x,
-                                  left_mid_cells_y, right_mid_cells_y, path_results, name_meas, top_cell)
-
-    @staticmethod
-    def collect_data(meas, navigation_reference, checked_transect_idx, interp_option):
-        """ Collect data of valid position and depth for each selected transect
-        
-        Parameters
-        ----------
-        meas: Measurement
-            Object of Measurement class
-        navigation_reference: str
-            Indicated selected navigation reference 'bt_vel' (Bottom trakc) or 'gga_vel' (GGA)
-        checked_transect_idx: list
-            List of selected transects
-        interp_option: bool
-            Indicates if interpolated velocities should be used
-            
-        Returns
-        -------
-        x_raw_coordinates: list(np.array(float))
-            List of 1D arrays of East boat coordinates from selected transects
-        y_raw_coordinates: list(np.array(float))
-            List of 1D arrays of North boat coordinates from selected transects
-        w_vel_x: list(np.array(float))
-            List of arrays of cells East velocity from selected transects
-        w_vel_y: list(np.array(float))
-            List of arrays of cells North velocity from selected transects
-        w_vel_z: list(np.array(float))
-            List of arrays of cells vertical velocity from selected transects
-        depth_data: list(np.array(float))
-            List of 1D arrays of depth from selected transects
-        q_cells: list(np.array(float))
-            List of arrays of cells discharge from selected transects
-        orig_start_edge: list(str)
-            List of original starting edge of transect looking downstream (Left or Right) from selected transects
-        invalid_data: list(np.array(bool))
-            List of arrays of invalid cells
-        cell_depth: list(np.array(float))
-            Depth to centerline of depth cells in meters
-        left_geometry/right_geometry: np.array(float)
-            Array returning values of edge distance and shape coefficient
-        """
-        # Create empty lists to iterate
-        depth_data = []
-        x_raw_coordinates = []
-        y_raw_coordinates = []
-        w_vel_x = []
-        w_vel_y = []
-        w_vel_z = []
-        q_cells = []
-        dmg = []
-        orig_start_edge = []
-        invalid_data = []
-        cell_depth = []
-
-        left_param = np.tile([np.nan], (len(checked_transect_idx), 2))
-        right_param = np.tile([np.nan], (len(checked_transect_idx), 2))
-
-        for id_transect in checked_transect_idx:
-            transect = meas.transects[id_transect]
-            index_transect = checked_transect_idx.index(id_transect)
-            in_transect_idx = transect.in_transect_idx
-
-            if navigation_reference == 'bt_vel':
-                ship_data = transect.boat_vel.compute_boat_track(transect, ref='bt_vel')
-            else:
-                ship_data = transect.boat_vel.compute_boat_track(transect, ref='gga_vel')
-
-            if transect.orig_start_edge == 'Right':
-                # Reverse transects in ordred to start at 0 on left edge
-                valid = transect.depths.bt_depths.valid_data[::-1]
-                dmg_ind = np.where(abs(ship_data['dmg_m']) == max(abs(ship_data['dmg_m'])))[0][0]
-                x_track = ship_data['track_x_m'] - ship_data['track_x_m'][dmg_ind]
-                y_track = ship_data['track_y_m'] - ship_data['track_y_m'][dmg_ind]
-                x_transect = x_track[::-1]
-                y_transect = y_track[::-1]
-                depth_transect = transect.depths.bt_depths.depth_processed_m[::-1]
-                dmg_transect = ship_data['dmg_m'][::-1]
-                q_cell_transect = meas.discharge[id_transect].middle_cells[:, ::-1]
-            else:
-                valid = transect.depths.bt_depths.valid_data
-                x_transect = ship_data['track_x_m']
-                y_transect = ship_data['track_y_m']
-                depth_transect = transect.depths.bt_depths.depth_processed_m
-                dmg_transect = ship_data['dmg_m']
-                q_cell_transect = meas.discharge[id_transect].middle_cells
-
-            q_cells.append(q_cell_transect[:, valid])
-            x_transect = x_transect[valid]
-            y_transect = y_transect[valid]
-            depth_data.append(depth_transect[valid])
-            x_raw_coordinates.append(x_transect)
-            y_raw_coordinates.append(y_transect)
-            dmg.append(dmg_transect[valid])
-
-            # else:  
-            #     valid = ~np.isinf(transect.gps.gga_lon_ens_deg)*~np.isnan(transect.gps.gga_lon_ens_deg)
-            #     x_raw_coordinates.append(transect.gps.gga_lon_ens_deg[valid])
-            #     y_raw_coordinates.append(transect.gps.gga_lat_ens_deg[valid])
-            #     depth_data.append(transect.depths.bt_depths.depth_processed_m[valid])
-            #     ship_data = transect.boat_vel.compute_boat_track(transect, ref='bt_vel')
-            #     dmg.append(ship_data['dmg_m'][valid])
-            #     q_cells.append(meas.discharge[id_transect].middle_cells[:,valid])
-
-            # Edges parameters 
-            left_param[index_transect, :] = [meas.transects[id_transect].edges.left.distance_m,
-                                             meas.discharge[id_transect].edge_coef('left', meas.transects[id_transect])]
-            right_param[index_transect, :] = [meas.transects[id_transect].edges.right.distance_m,
-                                              meas.discharge[id_transect].edge_coef('right',
-                                                                                    meas.transects[id_transect])]
-            left_geometry = np.nanmedian(left_param, axis=0)
-            right_geometry = np.nanmedian(right_param, axis=0)
-
-            invalid = np.logical_not(transect.w_vel.valid_data[0, :, in_transect_idx]).T
-            vel_x = np.copy(transect.w_vel.u_processed_mps)
-            vel_y = np.copy(transect.w_vel.v_processed_mps)
-            vel_z = np.copy(transect.w_vel.w_mps[:, in_transect_idx])
-
-            if not interp_option:
-                vel_x[invalid] = np.nan
-                vel_y[invalid] = np.nan
-                vel_z[invalid] = np.nan
-
-            w_vel_x.append(vel_x[:, valid])
-            w_vel_y.append(vel_y[:, valid])
-            w_vel_z.append(vel_z[:, valid])
-            invalid_data.append(invalid[:, valid])
-
-            orig_start_edge.append(transect.orig_start_edge)
-            cell_depth.append(transect.depths.bt_depths.depth_cell_depth_m[:, valid])
-
-        return x_raw_coordinates, y_raw_coordinates, w_vel_x, w_vel_y, w_vel_z, \
-               depth_data, q_cells, orig_start_edge, invalid_data, cell_depth, left_geometry, \
-               right_geometry, dmg
-
-    @staticmethod
-    def compute_coef(x_raw_coordinates, y_raw_coordinates, w_vel_x, w_vel_y, q_cells, track_section):
-        """ Compute average cross-section
-        
-        Parameters
-        ----------
-        x_raw_coordinates: list(np.array(float))
-            List of 1D arrays of East boat coordinates from selected transects
-        y_raw_coordinates: list(np.array(float))
-            List of 1D arrays of North boat coordinates from selected transects
-        w_vel_x: list(np.array(float))
-            List of arrays of cells East velocity from selected transects
-        w_vel_y: list(np.array(float))
-            List of arrays of cells North velocity from selected transects
-        q_cells: list(np.array(float))
-            List of arrays of cells discharge from selected transects
-        track_section: bool
-            Indicates if average cross-section should be computed on boat track (True) or mean velocity (False)
-        
-        Returns
-        -------
-        alpha: float
-            Slope of the line which define the average cross_section
-        beta: float
-            y-intercept of the line which define the average cross_section
-        direction_meas: float
-            Direction normal to the average cross-section
-        """
-
-        func = {'velocity': lambda x, b: x + b,
-                'track': lambda x, a, b: a * x + b}
-        q_ens = [abs(np.nansum(l, axis=0) / np.nanmean(l)) for l in q_cells]
-
-    #     from sklearn.decomposition import PCA
-    #     from sklearn.metrics import r2_score
-    #     pca_list = []
-    #     rg_list = []
-    #     rgw_list = []
-    #     for i in range(len(x_raw_coordinates)):
-    #         x = x_raw_coordinates[i].reshape(-1, 1)
-    #         y = y_raw_coordinates[i].reshape(-1, 1)
-    #         coordinates = np.column_stack((x, y))
-    #         # coordinates = np.array([[10, 6], [11,4], [8, 5], [3, 3], [2, 2.8], [1, 1]])
-    #         # coordinates = np.array([[0, 0], [1, 1], [2, 3], [4, 5], [5, 6], [6, 7]])
-    #         # coordinates = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
-    #
-    #         # PCA
-    #         X = coordinates - np.mean(coordinates, axis=0)
-    #         pca = PCA(n_components=2).fit(X)
-    #         coef = pca.components_[0][1] / pca.components_[0][0]
-    #         # print(coef)
-    #         # Reg lin
-    #         WLS = LinearRegression()
-    #         WLS.fit(np.array([n[0] for n in X]).reshape(-1, 1),
-    #                 np.array([n[1] for n in X]).reshape(-1, 1))
-    #         # print('linear :', [WLS.coef_, WLS.intercept_])
-    #         # Weighted Reg Lin
-    #         WLSw = LinearRegression()
-    #         WLSw.fit(x.reshape(-1, 1), y.reshape(-1, 1), sample_weight=np.abs(q_ens[i]))
-    #
-    #         print(f'R² PCA : {r2_score(y_true=y, y_pred=X[:, 0]*coef)}')
-    #         print(f'R² RL : {r2_score(y_true=y, y_pred=X[:, 0] * float(WLS.coef_))}')
-    #         print(f'R² RLw : {r2_score(y_true=y, y_pred=X[:, 0] * float(WLSw.coef_))}')
-    #
-    #         pca_list.append(coef)
-    #         rg_list.append(float(WLS.coef_))
-    #         rgw_list.append(float(WLSw.coef_))
-    #
-    #
-    #         # Plot
-    #         plt.scatter(X[:, 0], X[:, 1], alpha=0.3, label="samples", color='lightgrey')
-    #
-    #         plt.plot(X[:, 0], X[:, 0]*coef, label=f"Component {1}", linewidth=2,
-    #             color=f"C{3}", linestyle='--')
-    #
-    #         plt.plot(X[:, 0], X[:, 0] * float(WLS.coef_), label=f"Reg. Lin {i}", linewidth=2,
-    #                  color=f"C{2}", linestyle='--')
-    #
-    #         plt.plot(X[:, 0], X[:, 0] * float(WLSw.coef_), label=f"Reg. Lin Weig {i}", linewidth=2,
-    #                  color=f"C{1}", linestyle='--')
-    #
-    #     plt.gca().set(
-    #         aspect="equal",
-    #         xlabel="first feature",
-    #         ylabel="second feature",
-    #     )
-    #     plt.legend()
-    #     plt.show()
-    #
-    #     plt.close()
-    #
-    #     pca_coef = np.median(pca_list)
-    #     rg_coef = np.median(rg_list)
-    #     rgw_coef = np.median(rgw_list)
-    #     x_min = 0
-    #     x_max = 0
-    #
-    #     for i in range(len(x_raw_coordinates)):
-    #         x = x_raw_coordinates[i].reshape(-1, 1)
-    #         y = y_raw_coordinates[i].reshape(-1, 1)
-    #         coordinates = np.column_stack((x, y))
-    #         X = coordinates - np.mean(coordinates, axis=0)
-    #         plt.scatter(X[:, 0], X[:, 1], alpha=0.3, label="samples", color='lightgrey')
-    #         if np.nanmin(X[:, 0]) < x_min:
-    #             x_min = np.nanmin(X[:, 0])
-    #         if np.nanmax(X[:, 0]) > x_max:
-    #             x_max = np.nanmax(X[:, 0])
-    #
-    #     x_plt = [x_min, x_max]
-    #     plt.plot(x_plt, [j * pca_coef for j in x_plt], label=f"PCA", linewidth=2,
-    #              color=f"C{3}", linestyle='--')
-    #     plt.plot(x_plt, [j * rg_coef for j in x_plt], label=f"Reg. Lin.", linewidth=2,
-    #              color=f"C{2}", linestyle='--')
-    #     plt.plot(x_plt, [j * rgw_coef for j in x_plt], label=f"Reg. Lin. w.", linewidth=2,
-    #              color=f"C{1}", linestyle='--')
-    #     plt.legend()
-    #     plt.show()
-    #
-    #     # SUR L'ENSEMBLE DES POINTS = A NE SURTOUT PAS FAIRE
-    #     x_list = []
-    #     y_list = []
-    #     for i in range(len(x_raw_coordinates)):
-    #         x_list += [j for j in x_raw_coordinates[i]]
-    #         y_list += [j for j in y_raw_coordinates[i]]
-    #
-    #     coordinates = np.column_stack((x_list, y_list))
-    #     # PCA
-    #     X = coordinates - np.mean(coordinates, axis=0)
-    #     pca = PCA(n_components=2).fit(X)
-    #     coef = pca.components_[0][1] / pca.components_[0][0]
-    #     # print(coef)
-    #     # Reg lin
-    #     WLS = LinearRegression()
-    #     WLS.fit(np.array([n[0] for n in X]).reshape(-1, 1),
-    #             np.array([n[1] for n in X]).reshape(-1, 1))
-    #     # print('linear :', [WLS.coef_, WLS.intercept_])
-    #     # Weighted Reg Lin
-    #     WLSw = LinearRegression()
-    #     WLSw.fit(x.reshape(-1, 1), y.reshape(-1, 1), sample_weight=np.abs(q_ens[i]))
-    #
-    #     plt.scatter(X[:, 0], X[:, 1], alpha=0.3, label="samples", color='lightgrey')
-    #
-    #     plt.plot(X[:, 0], X[:, 0] * coef, label=f"Component {1}", linewidth=2,
-    #              color=f"C{3}", linestyle='--')
-    #
-    #     plt.plot(X[:, 0], X[:, 0] * float(WLS.coef_), label=f"Reg. Lin", linewidth=2,
-    #              color=f"C{2}", linestyle='--')
-    #
-    #     plt.plot(X[:, 0], X[:, 0] * float(WLSw.coef_), label=f"Reg. Lin Weig", linewidth=2,
-    #              color=f"C{1}", linestyle='--')
-    #
-    # plt.gca().set(
-    #     aspect="equal",
-    #     xlabel="North distance",
-    #     ylabel="East distance",
-    # )
-    # plt.legend()
-    # plt.show()
-    #
-
-
-        # Compute average cross-section on boat track by linear regression
-        if track_section:
-            coef_meas = np.tile(np.nan, (len(x_raw_coordinates), 2))
-            for i in range(len(x_raw_coordinates)):
-                WLS = LinearRegression()
-                WLS.fit(x_raw_coordinates[i].reshape(-1, 1), y_raw_coordinates[i].reshape(-1, 1),
-                        sample_weight=np.abs(q_ens[i]))
-                coef_meas[i, :] = [WLS.coef_, WLS.intercept_]
-
-            alpha = np.nanmedian(coef_meas[:, 0])
-            beta = np.nanmedian(coef_meas[:, 1])
-
-            direction_meas = np.arctan2(-1, alpha)
-
-        # Compute average cross-section on mean velocity direction
-        else:
-            mean_x = list()
-            mean_y = list()
-            for i in range(len(w_vel_x)):
-                mean_x.append(np.nansum(w_vel_x[i] * q_cells[i]) / np.nansum(q_cells[i]))
-                mean_y.append(np.nansum(w_vel_y[i] * q_cells[i]) / np.nansum(q_cells[i]))
-            v_x = np.nanmedian(mean_x)
-            v_y = np.nanmedian(mean_y)
-            direction_meas, _ = cart2pol(v_x, v_y)
-            alpha = -1 / np.tan(direction_meas)
-            coef_meas = list()
-            for i in range(len(w_vel_x)):
-                coef_meas.append(curve_fit(func['velocity'], alpha * x_raw_coordinates[i], y_raw_coordinates[i])[0])
-            beta = np.nanmean(coef_meas)
-
-        return alpha, beta, direction_meas, q_ens
-
-    @staticmethod
-    def project_transect(alpha, beta, x_raw_coordinates, y_raw_coordinates):
-        """ Project transects on the average cross-section
-        
-        Parameters
-        ----------
-        alpha: float
-            Slope of the line which define the average cross_section
-        beta: float
-            y-intercept of the line which define the average cross_section
-        meas: Measurement
-            Object of Measurement class
-        x_raw_coordinates: list(np.array(float))
-            List of 1D arrays of East boat coordinates from selected transects
-        y_raw_coordinates: list(np.array(float))
-            List of 1D arrays of North boat coordinates from selected transects
-        navigation_reference: str
-            Indicated selected navigation reference 'bt_vel' (Bottom trakc) or 'gga_vel' (GGA)
-            
-        Returns
-        -------
-        x_projected: list(np.array(float))
-            List of 1D arrays of the projection on the average cross-section of the East coordinates
-        y_projected: list(np.array(float))
-            List of 1D arrays of the projection on the average cross-section of the North coordinates
-        acs_distance: list(np.array(float))
-            List of 1D arrays to the left_most point distance on the average cross-section
-        """
-        x_projected = list()
-        y_projected = list()
-        # distance_transect = list()
-        x_left = list()
-        y_left = list()
-
-        # Project transect
-        for i in range(len(x_raw_coordinates)):
-            # Project x and y coordinates on the cross-section
-            x_projected.append((x_raw_coordinates[i] - alpha * beta + alpha * y_raw_coordinates[i]) / (alpha ** 2 + 1))
-            y_projected.append(
-                (beta + alpha * x_raw_coordinates[i] + alpha ** 2 * y_raw_coordinates[i]) / (alpha ** 2 + 1))
-
-            # Determine where is the left side
-            # if navigation_reference == 'gga_vel' and meas.transects[i].orig_start_edge == 'Right':
-            #     x_left.append(x_projected[i][-1])
-            #     y_left.append(y_projected[i][-1])
-
-            # else:
-            #     x_left.append(x_projected[i][0])
-            #     y_left.append(y_projected[i][0])
-
-            x_left.append(x_projected[i][0])
-            y_left.append(y_projected[i][0])
-
-            # Boundaries on x and y coordinates for the selected transects
-            x_boundaries = [min([min(l) for l in x_projected]), max([max(l) for l in x_projected])]
-            y_boundaries = [min([min(l) for l in y_projected]), max([max(l) for l in y_projected])]
-
-            x_start = min(x_boundaries, key=lambda x: abs(x - np.nanmedian(x_left)))
-            y_start = min(y_boundaries, key=lambda x: abs(x - np.nanmedian(y_left)))
-
-        # Compute distance on the average cross-section
-        acs_distance = list()
-        # if navigation_reference == 'gga_vel':
-        #     for j in range(len(x_projected)):
-        #         distance_transect = np.tile(np.nan, len(x_projected[j]))
-        #         for i in range(len(x_projected[j])):
-        #             distance_transect[i] = haversine((y_projected[j][i], x_projected[j][i]), (y_start, x_start))
-        #         acs_distance.append(distance_transect)
-        # elif navigation_reference == 'bt_vel':
-        #     x_distance= x_projected - min(x_boundaries, key=abs)
-        #     y_distance= y_projected - min(y_boundaries, key=abs)
-        #     for i in range(len(x_projected)):
-        #         acs_distance.append(np.sqrt(x_distance[i]**2 + y_distance[i]**2))
-
-        x_distance = x_projected - min(x_boundaries, key=abs)
-        y_distance = y_projected - min(y_boundaries, key=abs)
-        for i in range(len(x_projected)):
-            acs_distance.append(np.sqrt(x_distance[i] ** 2 + y_distance[i] ** 2))
-
-        return x_projected, y_projected, acs_distance
-
-    @staticmethod
-    def translated_transects(acs_distance_raw, depth_data):
-        """ Compare bathymetry and translate transects on average cross-section if needed
-        
-        Parameters
-        ----------
-        acs_distance_raw: list(np.array(float))
-            List of 1D arrays of the distance on the average cross-section
-        depth_data: list(np.array(float))
-            List of 1D arrays of bathymetry from selected transects
-       
-        Returns
-        -------
-        acs_translated: list(np.array(float))
-            List of 1D arrays of the corrected distance depending on the bathymetry
-        """
-        acs_translated = list()
-        # Use the first transect as reference and define an homogeneous x grid across measurement
-        acs_translated.append(copy.deepcopy(acs_distance_raw[0]))
-        max_acs = max([max(l) for l in acs_distance_raw])
-        min_acs = min([min(l) for l in acs_distance_raw])
-        grid_acs = np.arange(min_acs, max_acs, (max_acs - min_acs) / 100)
-        acs_depth_ref = sc.interpolate.griddata(acs_distance_raw[0], depth_data[0], grid_acs)
-
-        for i in range(1, len(acs_distance_raw)):
-            # Interpolate depth on x grid
-            acs_depth = sc.interpolate.griddata(acs_distance_raw[i], depth_data[i], grid_acs)
-            if not np.all(np.isnan(acs_depth)):
-                first_valid_acs = int(np.argwhere(~np.isnan(acs_depth))[0])
-                last_valid_acs = int(np.argwhere(~np.isnan(acs_depth))[-1])
-                valid_acs_depth = last_valid_acs - first_valid_acs + 1
-                acs_depth_valid = acs_depth[first_valid_acs:last_valid_acs + 1]
-
-                # Find the best position to minimize median of sum square
-                default_acs_ssd = np.nanmean((acs_depth_ref[:valid_acs_depth] - acs_depth_valid) ** 2)
-                lag_acs_idx = 0
-                for j in range(1, len(acs_depth_ref) - valid_acs_depth + 1):
-                    acs_ssd = np.nanmean((acs_depth_ref[j:j + valid_acs_depth] - acs_depth_valid) ** 2)
-                    if (acs_ssd < default_acs_ssd or np.isnan(default_acs_ssd)) and \
-                            np.count_nonzero(np.isnan(acs_depth_ref[j:j + valid_acs_depth])) < 0.5 * valid_acs_depth:
-                        default_acs_ssd = acs_ssd
-                        lag_acs_idx = j
-                # Correct average cross-section distance by translation
-                acs_corrected = acs_distance_raw[i] - (grid_acs[first_valid_acs] - grid_acs[lag_acs_idx])
-                acs_translated.append(acs_corrected)
-            else:
-                acs_translated.append(acs_distance_raw[i])
-
-        # Start from 0
-        min_dist = min([min(l) for l in acs_translated])
-        for i in range(len(acs_translated)):
-            acs_translated[i] -= min_dist
-
-        return acs_translated
-
-    @staticmethod
-    def compute_node_size(cell_depth, acs_distance, depth_data, node_horizontal_user,
-                          node_vertical_user, top_cell):
-        """ Define horizontal and vertical mesh
-        
-        Parameters
-        ----------
-        cell_depth: list(np.array(float))
-            Depth to centerline of depth cells in meters
-        acs_distance: list(np.array(float))
-            List of 1D arrays of the corrected distance on the average cross-section
-        depth_data: list(np.array(float))
-            List of 1D arrays of bathymetry from selected transects
-        node_horizontal_user: float
-            Horizontal size of the mesh define by the user
-        node_vertical_user: float
-            Vertical size of the mesh define by the user
-            
-        Returns
-        -------
-        borders_ens: list(float)
-            Horizontal grid length on the average cross-section
-        nodes_depth: list(float)
-            Vertical grid depth from the free-surface
-        """
-        # Define number of meshs on the average cross-section
-        acs_total = max([max(l) for l in acs_distance]) - min([min(l) for l in acs_distance])
-        if node_horizontal_user == None:
-            # all_acs_distance = np.array([item for subarray in acs_distance for item in subarray])
-            # all_acs_distance.sort()
-            # acs_diff = abs(all_acs_distance[1:] - all_acs_distance[:-1])
-            # node_horz = np.nanmax([acs_total/50, np.max(acs_diff)+np.std(acs_diff)])
-            node_horz = np.nanmedian([np.quantile(l[1:] - l[:-1], 0.95) for l in acs_distance])
-        else:
-            node_horz = node_horizontal_user
-
-        # Divise total length in same size meshs
-        # TODO see logspace
-        nb_horz = int(acs_total / node_horz)
-        borders_ens = np.linspace(min([min(l) for l in acs_distance]),
-                                  max([max(l) for l in acs_distance]) + 10 ** -5,
-                                  nb_horz)
-
-        # Define mesh vertical size
-        all_depth = np.array([item for subarray in depth_data for item in subarray])
-        if node_vertical_user:
-            nodes_depth = np.round(np.arange(top_cell, np.nanmax(all_depth) + 2 * node_vertical_user,
-                                             node_vertical_user).tolist(), 3)
-        else:
-            lag = np.nanmax([0.1, 2 * (cell_depth[0][1, 0] - cell_depth[0][0, 0])])
-            nodes_depth = np.arange(top_cell, np.nanmax(all_depth) + lag, lag)
-
-        return borders_ens, nodes_depth
-
-    @staticmethod
-    def compute_nodes_velocity(navigation_reference, checked_transect_idx, w_vel_x, w_vel_y, w_vel_z,
-                               cell_depth, depth_data, acs_distance, borders_ens_raw,
-                               nodes_depth_raw, orig_start_edge):
-        """ Compute transect median velocity on each mesh (North, East and vertical velocities) 
-        and depth on each vertical
-        
-        Parameters
-        ----------
-        navigation_reference: str
-            Object TransectData
-        checked_transect_idx: list(int)
-            List of selected transects
-        w_vel_x: list(np.array(float))
-            List of arrays of cells East velocity from selected transects
-        w_vel_y: list(np.array(float))
-            List of arrays of cells North velocity from selected transects
-        w_vel_z: list(np.array(float))
-            List of arrays of cells vertical velocity from selected transects
-        cell_depth:
-            
-        depth_data: list(np.array(float))
-            List of 1D arrays of bathymetry from selected transects
-        acs_distance: list(np.array(float))
-            List of 1D arrays of the corrected distance on the average cross-section
-        borders_ens_raw: list(float)
-            Horizontal grid length on the average cross-section
-        nodes_depth_raw: list(float)
-            Vertical grid depth from the free-surface
-        orig_start_edge: list(str)
-            List of original starting edge of transect looking downstream (Left or Right) from 
-            selected transects
-            
-        Returns
-        -------
-        borders_ens: list(float)
-            Horizontal grid length on the average cross-section
-        nodes_depth: list(float)
-            Vertical grid depth from the free-surface
-        """
-
-        node_mid = (borders_ens_raw[1:] + borders_ens_raw[:-1]) / 2
-        # Create list to save transects interpolated on mesh grid
-        transects_nodes = list()
-        transects_node_x_velocity = np.tile(np.nan,
-                                            (len(checked_transect_idx), len(nodes_depth_raw) - 1, len(node_mid)))
-        transects_node_y_velocity = np.tile(np.nan,
-                                            (len(checked_transect_idx), len(nodes_depth_raw) - 1, len(node_mid)))
-        transects_node_vertical_velocity = np.tile(np.nan,
-                                                   (len(checked_transect_idx), len(nodes_depth_raw) - 1, len(node_mid)))
-        transects_node_depth = np.tile(np.nan, (len(checked_transect_idx), len(node_mid)))
-
-        for id_transect in checked_transect_idx:
-            index_transect = checked_transect_idx.index(id_transect)
-            print('===== Transect ' + str(index_transect) + ' of ' + str(len(checked_transect_idx) - 1) + ' =====')
-            w_vel_x_tr = w_vel_x[index_transect]
-            w_vel_y_tr = w_vel_y[index_transect]
-            w_vel_z_tr = w_vel_z[index_transect]
-            cell_depth_tr = cell_depth[index_transect]
-            depth_ens_tr = depth_data[index_transect]
-            if orig_start_edge[index_transect] == 'Right':
-                cell_depth_tr = np.flip(cell_depth_tr, axis=1)
-                w_vel_x_tr = np.flip(w_vel_x_tr, axis=1)
-                w_vel_y_tr = np.flip(w_vel_y_tr, axis=1)
-                w_vel_z_tr = np.flip(w_vel_z_tr, axis=1)
-
-            # Find the representative mesh of each transect's vertical
-            lag_distance = borders_ens_raw[1] - borders_ens_raw[0]
-
-            data = {'Index_ensemble': np.arange(len(acs_distance[index_transect])),
-                    'Index_Node': [int(i) for i in acs_distance[index_transect] / lag_distance],
-                    'Distance_ensemble': acs_distance[index_transect]}
-            df = pd.DataFrame(data)
-            # for i in range(len(acs_distance[index_transect])):
-            #         df.loc[[i], ['Index_Node_orig', 'Distance_node']] = next(x for x in enumerate(borders_ens_raw[1:]) 
-            #                                                             if x[1] >= df.loc[i]['Distance_ensemble'])   
-
-            # Transect's nodes
-            id_proj = list(np.unique(df['Index_Node']))
-            transects_nodes.append(id_proj)
-
-            # Run through nodes to determine each parameters
-            for node in id_proj:
-                index_node = np.array(df[df['Index_Node'] == node]['Index_ensemble'])
-                w_vel_x_node = w_vel_x_tr[:, index_node]
-                w_vel_y_node = w_vel_y_tr[:, index_node]
-                w_vel_z_node = w_vel_z_tr[:, index_node]
-                mid_cell_node = cell_depth_tr[:, index_node]
-                depth_node = depth_ens_tr[index_node]
-
-                transects_node_depth[index_transect, node] = np.nanmedian(depth_node)
-                # Determine every transect's cells in the mesh
-                for id_vert in range(len(nodes_depth_raw) - 1):
-                    (id_x, id_y) = np.where(np.logical_and(mid_cell_node >= nodes_depth_raw[id_vert], \
-                                                           mid_cell_node < nodes_depth_raw[id_vert + 1]))
-                    w_vel_x_loc = w_vel_x_node[id_x, id_y]
-                    w_vel_y_loc = w_vel_y_node[id_x, id_y]
-                    w_vel_z_loc = w_vel_z_node[id_x, id_y]
-
-                    transects_node_x_velocity[index_transect, id_vert, node] = np.nanmean(w_vel_x_loc)
-                    transects_node_y_velocity[index_transect, id_vert, node] = np.nanmean(w_vel_y_loc)
-                    transects_node_vertical_velocity[index_transect, id_vert, node] = np.nanmedian(w_vel_z_loc)
-
-        return transects_node_x_velocity, transects_node_y_velocity, transects_node_vertical_velocity, \
-               transects_node_depth, transects_nodes
-
-    def compute_mean(self, transects_nodes, transects_node_x_velocity, transects_node_y_velocity,
-                     transects_node_vertical_velocity, transects_node_depth, borders_ens_raw,
-                     nodes_depth_raw):
-        """ Compute mesh mean value of selected transects
-        
-        Parameters
-        ----------
-        transects_nodes: np.array(np.array(flot))
-            Array of 1D arrays of nodes detected by each transect
-        transects_node_x_velocity: np.array(np.array(flot))
-            Median East velocity on each mesh of each transect
-        transects_node_y_velocity: np.array(np.array(flot))
-            Median North velocity on each mesh of each transect
-        transects_node_vertical_velocity: np.array(np.array(flot))
-            Median vertical velocity on each mesh of each transect
-       transects_node_depth: np.array(np.array(float))
-            Array of 1D arrays of depth values on each vertical for each transects
-        borders_ens_raw: list(float)
-            Horizontal length values on the average cross-section
-        nodes_depth_raw: list(float)
-            Vertical depth values from the free-surface
-            
-        Returns
-        -------
-        MAP_x_velocity: np.array
-            East velocity on each cell of the MAP section
-        MAP_y_velocity: np.array
-            North velocity on each cell of the MAP section
-        """
-        # Define meshs detected by enough transects
-        unique_node = list(np.unique([x for l in transects_nodes for x in l]))
-        node_selected = copy.deepcopy(unique_node)
-        valid_cell = max(int(len(transects_nodes) / 3), 1)
-        for node in unique_node:
-            if sum(x.count(node) for x in transects_nodes) < valid_cell or \
-                    np.isnan(transects_node_depth[:, node]).all():
-                node_selected.remove(node)
-
-        node_min = np.nanmin(node_selected)
-        node_max = np.nanmax(node_selected)
-        node_range = list(range(node_min, node_max + 1))
-        node_range_border = list(range(node_min, node_max + 2))
-
-        borders_ens = borders_ens_raw[node_range_border]
-        borders_ens -= min(borders_ens)
-
-        MAP_depth_cells_border = np.tile(np.nan, (len(nodes_depth_raw), len(node_range)))
-        for i in range(len(node_range)):
-            MAP_depth_cells_border[:, i] = nodes_depth_raw
-
-        MAP_x_velocity = np.tile(np.nan, (len(nodes_depth_raw) - 1, len(node_range)))
-        MAP_y_velocity = np.tile(np.nan, (len(nodes_depth_raw) - 1, len(node_range)))
-        MAP_vertical_velocity = np.tile(np.nan, (len(nodes_depth_raw) - 1, len(node_range)))
-        MAP_depth = np.tile(np.nan, len(node_range))
-
-        for node in node_selected:
-            index_node = node_range.index(node)
-            row = np.array([j for (j, sub) in enumerate(transects_nodes) if node in sub])
-
-            x_map_cell = transects_node_x_velocity[row, :, node]
-            y_map_cell = transects_node_y_velocity[row, :, node]
-            vertical_map_cell = transects_node_vertical_velocity[row, :, node]
-            depth_map_cell = transects_node_depth[row, node]
-
-            MAP_depth[index_node] = np.nanmean(depth_map_cell)
-
-            # Cut values under streambed    
-            if np.isnan(MAP_depth[index_node]):
-                depth_limit = 0
-            else:
-                depth_limit = next(x[0] for x in enumerate(nodes_depth_raw) if x[1] > MAP_depth[index_node])
-
-            x_map_cell[:, depth_limit:] = np.nan
-            y_map_cell[:, depth_limit:] = np.nan
-            vertical_map_cell[:, depth_limit:] = np.nan
-
-            # Cut value if not detected by enough transects
-            # MAP_x_velocity[np.count_nonzero(~np.isnan(x_map_cell), axis = 0) > valid_cell,index_node] = np.nanmedian(x_map_cell[:, 
-            #                 np.count_nonzero(~np.isnan(x_map_cell), axis = 0) > valid_cell], axis = 0)
-            # MAP_y_velocity[np.count_nonzero(~np.isnan(y_map_cell), axis = 0) > valid_cell,index_node] = np.nanmedian(y_map_cell[:,
-            #                 np.count_nonzero(~np.isnan(y_map_cell), axis = 0) > valid_cell], axis = 0)
-            # MAP_vertical_velocity[np.count_nonzero(~np.isnan(vertical_map_cell), axis = 0) > valid_cell,index_node] = np.nanmedian(vertical_map_cell[:, 
-            #                 np.count_nonzero(~np.isnan(vertical_map_cell), axis = 0) > valid_cell], axis = 0)
-
-            MAP_x_velocity[:, index_node] = np.nanmean(x_map_cell, axis=0)
-            MAP_y_velocity[:, index_node] = np.nanmean(y_map_cell, axis=0)
-            MAP_vertical_velocity[:, index_node] = np.nanmean(vertical_map_cell, axis=0)
-            MAP_depth_cells_border[depth_limit, index_node] = MAP_depth[index_node]
-            MAP_depth_cells_border[depth_limit + 1:, index_node] = np.nan
-
-        self.vertical_velocity = MAP_vertical_velocity
-        self.depths = MAP_depth
-        self.depth_cells_border = MAP_depth_cells_border
-        self.borders_ens = borders_ens
-
-        return MAP_x_velocity, MAP_y_velocity
-
-    def compute_rozovskii(self, x_velocity, y_velocity):
-        """ Compute primary and secondary velocity according Rozovskii projection
-        
-        Parameters
-        ----------
-        x_velocity: np.array
-            East velocity on each cell of the MAP section
-        y_velocity: np.array
-            North velocity on each cell of the MAP section
-            
-        Returns
-        -------
-        direction: np.array
-            1D array of mean velocity direction of each MAP vertical
-        """
-        # Compute mean velocity components in each ensemble
-        w_vel_mean_1 = np.nanmean(x_velocity, 0)
-        w_vel_mean_2 = np.nanmean(y_velocity, 0)
-
-        # Compute a unit vector
-        direction, _ = cart2pol(w_vel_mean_1, w_vel_mean_2)
-        unit_vec_1, unit_vec_2 = pol2cart(direction, 1)
-        unit_vec = np.vstack([unit_vec_1, unit_vec_2])
-
-        # Compute the velocity magnitude in the direction of the mean velocity of each
-        # ensemble using the dot product and unit vector
-        w_vel_prim = np.tile([np.nan], x_velocity.shape)
-        w_vel_sec = np.tile([np.nan], x_velocity.shape)
-        for i in range(x_velocity.shape[0]):
-            w_vel_prim[i, :] = np.sum(np.vstack([x_velocity[i, :], y_velocity[i, :]]) * unit_vec, 0)
-            w_vel_sec[i, :] = unit_vec_2 * x_velocity[i, :] - unit_vec_1 * y_velocity[i, :]
-
-        self.primary_velocity = w_vel_prim
-        self.secondary_velocity = w_vel_sec
-
-        return direction
-
-    def compute_extrap_velocity(self, nodes_depth_raw, settings, extrap_option):
-        """ Compute top/bottom extrapolation according QRevInt velocity exponent
-        
-        Parameters
-        ----------
-        nodes_depth_raw: list(float)
-            Vertical grid depth from the free-surface
-        settings: dict
-            Measurement current settings
-        extrap_option: bool
-            Option to define if extrapolation should be applied
-        Returns
-        -------
-        idx_bot: np.array(int)
-            Index to the bottom most valid depth cell in each ensemble
-        idx_top: np.array(int)
-            Index to the top most valid depth cell in each ensemble
-        """
-        # Parameter to return nan in extrap value if extrapolation is not selected
-        if extrap_option:
-            units = 1
-        else:
-            units = np.nan
-
-        depths = self.depths
-        depth_cells_border = self.depth_cells_border
-        w_vel_prim_extrap = np.copy(self.primary_velocity)
-        w_vel_sec_extrap = np.copy(self.secondary_velocity)
-        w_vel_z_extrap = np.copy(self.vertical_velocity)
-
-        MAP_depth_cells_border = np.tile(np.nan, depth_cells_border.shape)
-        for i in range(depth_cells_border.shape[1]):
-            MAP_depth_cells_border[:, i] = nodes_depth_raw
-
-        MAP_depth_cells_center = (MAP_depth_cells_border[1:, :] + MAP_depth_cells_border[:-1, :]) / 2
-
-        # Blanking on the bottom
-        blanking_depth = depths * 0.9
-        for i in range(MAP_depth_cells_center.shape[1]):
-            invalid = MAP_depth_cells_center[:, i] > blanking_depth[i]
-            w_vel_prim_extrap[invalid, i] = np.nan
-            w_vel_sec_extrap[invalid, i] = np.nan
-            w_vel_z_extrap[invalid, i] = np.nan
-
-        # Identify valid data      
-        valid_data = np.logical_not(np.isnan(w_vel_prim_extrap))
-        # Preallocate variables
-        n_ensembles = valid_data.shape[1]
-        idx_bot = np.tile(-1, (valid_data.shape[1])).astype(int)
-        idx_top = np.tile(-1, valid_data.shape[1]).astype(int)
-
-        for n in range(n_ensembles):
-            # Identifying bottom most valid cell
-            idx_temp = np.where(np.logical_not(np.isnan(w_vel_prim_extrap[:, n])))[0]
-            if len(idx_temp) > 0:
-                idx_top[n] = idx_temp[0]
-                idx_bot[n] = idx_temp[-1]
-            else:
-                idx_top[n] = 0
-
-        # QRevInt extrapolation method
-        idx_bed = copy.deepcopy(idx_bot)
-        bot_method = settings['extrapBot']
-        top_method = settings['extrapTop']
-        exponent = settings['extrapExp']
-
-        depth_cells_center = (depth_cells_border[1:] + depth_cells_border[:-1]) / 2
-        mid_bed_cells = depths - depth_cells_center
-
-        if bot_method == 'Power':
-            coef_primary_bot = np.nanmean(w_vel_prim_extrap, 0)
-        elif bot_method == 'No Slip':
-            cutoff_depth = 0.8 * depths
-            depth_ok = (nan_greater(depth_cells_center, np.tile(cutoff_depth, (depth_cells_center.shape[0], 1))))
-            component_ok = np.logical_not(np.isnan(w_vel_prim_extrap))
-            use_ns = depth_ok * component_ok
-            for j in range(len(idx_bot)):
-                if idx_bot[j] >= 0:
-                    use_ns[idx_bot[j], j] = 1
-            component_ns = np.copy(w_vel_prim_extrap)
-            component_ns[np.logical_not(use_ns)] = np.nan
-
-            coef_primary_bot = np.nanmean(component_ns, 0)
-
-        # Extrapolation Bot velocity
-        for n in range(len(idx_bed)):
-            if idx_bed[n] > -1:
-                while idx_bed[n] < len(depth_cells_center[:, n]) and depth_cells_border[idx_bed[n] + 1, n] <= depths[n]:
-                    idx_bed[n] += 1
-                # Shape of bottom cells
-                bot_depth = mid_bed_cells[idx_bot[n] + 1:(idx_bed[n]), n]
-
-                # Extrapolation for Primary velocity
-                bot_prim_value = coef_primary_bot[n] * ((1 + 1 / exponent) / (1 / exponent)) * (
-                            (bot_depth / depths[n]) ** exponent)
-                w_vel_prim_extrap[(idx_bot[n] + 1):(idx_bed[n]), n] = bot_prim_value * units
-
-                # Constant extrapolation for Secondary velocity
-                w_vel_sec_extrap[(idx_bot[n] + 1):(idx_bed[n]), n] = w_vel_sec_extrap[idx_bot[n], n] * units
-                # Linear extrapolation to 0 at streambed for Vertical velocity
-                try:
-                    w_vel_z_extrap[(idx_bot[n] + 1):(idx_bed[n]), n] = units * sc.interpolate.griddata(
-                        np.append(mid_bed_cells[idx_bot[n], n], 0), np.append(self.vertical_velocity[idx_bot[n], n], 0),
-                        mid_bed_cells[(idx_bot[n] + 1):(idx_bed[n]), n])
-                except Exception:
-                    pass
-
-        # Top power extrapolation (primary)
-        if top_method == 'Power':
-            coef_primary_top = np.nanmean(w_vel_prim_extrap, 0)
-            for n in range(len(idx_top)):
-                top_depth = mid_bed_cells[:idx_top[n], n]
-                top_prim_value = coef_primary_top[n] * ((1 + 1 / exponent) / (1 / exponent)) * (
-                            (top_depth / depths[n]) ** exponent)
-                w_vel_prim_extrap[:idx_top[n], n] = top_prim_value * units
-
-        # Top constant extrapolation (primary)
-        elif top_method == 'Constant':
-            n_ensembles = len(idx_top)
-            top_prim_value = np.tile([np.nan], n_ensembles)
-            for n in range(n_ensembles):
-                if idx_top[n] >= 0:
-                    w_vel_prim_extrap[:idx_top[n], n] = w_vel_prim_extrap[idx_top[n], n] * units
-
-        # Extrap top for second and vertical velocities
-        for n in range(len(idx_top)):
-            if idx_top[n] >= 0:
-                w_vel_sec_extrap[:idx_top[n], n] = w_vel_sec_extrap[idx_top[n], n] * units
-                try:
-                    top_z_value = sc.interpolate.griddata(np.append(mid_bed_cells[idx_top[n], n], self.depths[n]),
-                                                          np.append(w_vel_z_extrap[idx_top[n], n], 0),
-                                                          mid_bed_cells[:idx_top[n], n])
-                    w_vel_z_extrap[:idx_top[n], n] = top_z_value * units
-                except Exception:
-                    pass
-
-        self.depth_cells_center = depth_cells_center
-        self.extrap_primary_velocity = w_vel_prim_extrap
-        self.extrap_secondary_velocity = w_vel_sec_extrap
-        self.extrap_vertical_velocity = w_vel_z_extrap
-
-
-    def compute_edges(self, borders_ens_raw, mid_direction, settings, edge_constant):
-        """ Compute edge extrapolation
-        
-        Parameters
-        ----------
-        borders_ens_raw: list(float)
-            Horizontal grid length on the average cross-section
-        mid_direction: np.array
-            1D array of mean velocity direction of each MAP vertical
-        settings: dict
-            Measurement current settings
-        edge_constant: bool
-            Option to define if edge's meshs should share the exact same length or if they should be
-            the same length as those in the middle (except the last vertical which is shorter)
-        
-        Returns
-        -------
-        left_direction/right_direction: np.array
-            Direction of the first/last ensemble applied to edge
-        left_area/right_area: np.array
-            Area of edge's cells
-        left_mid_cells_x/right_mid_cells_x: np.array
-            Longitudinal position of the middle of each cell
-        left_mid_cells_y/right_mid_cells_y: np.array
-            Depth position of the middle of each cell
-        """
-        extrap_exp = 1 / settings['extrapExp']
-        self.left_primary_velocity, self.left_secondary_velocity, self.left_vertical_velocity, \
-        self.left_borders, left_direction, left_mid_cells_x, left_mid_cells_y, \
-        left_area = self.edge_velocity(self.left_distance, self.left_coef, 'left', borders_ens_raw, mid_direction,
-                                       extrap_exp, edge_constant)
-
-        self.right_primary_velocity, self.right_secondary_velocity, self.right_vertical_velocity, \
-        self.right_borders, right_direction, right_mid_cells_x, right_mid_cells_y, \
-        right_area = self.edge_velocity(self.right_distance, self.right_coef, 'right', borders_ens_raw, mid_direction,
-                                        extrap_exp, edge_constant)
-
-        return left_direction, right_direction, left_area, right_area, left_mid_cells_x, \
-               right_mid_cells_x, left_mid_cells_y, right_mid_cells_y
-
-    def edge_velocity(self, edge_distance, edge_coef, edge, borders_ens_raw, mid_direction,
-                      extrap_exp, edge_constant):
-        """ Compute edge extrapolation
-        
-        Parameters
-        ----------
-        edge_distance: float
-            Edge distance
-        edge_coef: float
-            Shape coefficient of the edge
-        edge: str
-            'left' or 'right'
-        borders_ens_raw: list(float)
-            Horizontal grid length on the average cross-section
-        mid_direction: np.array
-            1D array of mean velocity direction of each MAP vertical
-        extrap_exp: float
-            QRevInt exponent power law value
-        edge_constant: bool
-            Option to define if edge's meshs should share the exact same length or if they should be
-            the same length as those in the middle (except the last vertical which is shorter)
-        
-        Returns
-        -------
-        edge_primary_velocity: np.array
-            Primary velocity of cells in edge
-        edge_secondary_velocity: np.array
-            Secondary velocity of cells in edge
-        edge_vertical_velocity: np.array
-            Vertical velocity of cells in edge
-        nodes: np.array
-            Length borders posiotion of ensemble
-        edge_direction: np.array
-            Direction of the first/last ensemble applied to edge
-        mid_cells_x: np.array
-            Longitudinal position of the middle of each cell
-        mid_cells_y: np.array
-            Depth position of the middle of each cell
-        area: np.array
-            Area of edge's cells
-        """
-        if edge == 'left':
-            id_edge = 0
-            node_size = abs(borders_ens_raw[1] - borders_ens_raw[0])
-        elif edge == 'right':
-            id_edge = -1
-            node_size = abs(borders_ens_raw[-1] - borders_ens_raw[-2])
-
-        if edge_constant:
-            # Découpage de la berge
-            nb_nodes = int(np.round(0.5 + edge_distance / node_size))
-            nodes = np.linspace(0, edge_distance, nb_nodes + 1)  # Découpage x (bords)
-        else:
-            nodes = edge_distance - np.arange(0, edge_distance, node_size)[::-1]
-            nodes = np.insert(nodes, 0, 0)
-            nb_nodes = len(nodes) - 1
-
-        nodes_mid = (nodes[1:] + nodes[:-1]) / 2  # Decoupage x
-        edge_size_raw = self.depth_cells_border[:, id_edge]  # Decoupage y
-
-        if edge_coef == 0.3535 and edge_distance > 0:
-            # Depth arrays 
-            border_depths = np.multiply(nodes, self.depths[
-                id_edge] / edge_distance)  # Profondeur sur les bords de chaque verticale
-            cells_borders_depths_1 = np.transpose(
-                [edge_size_raw] * (len(border_depths) - 1))  # Position en profondeur des bords de chaque cellule
-            cells_borders_depths_2 = np.transpose([edge_size_raw] * (len(border_depths)))
-
-            for i in range(len(border_depths) - 1):
-                sub_index = next(x[0] for x in enumerate(cells_borders_depths_1[:, i]) if
-                                 x[1] >= int(1000 * border_depths[i + 1]) / 1000)
-                cells_borders_depths_1[sub_index, i] = border_depths[i + 1]
-                cells_borders_depths_1[sub_index + 1:, i] = np.nan
-                cells_borders_depths_2[sub_index - 1, i + 1] = border_depths[i + 1]
-                cells_borders_depths_2[sub_index:, i] = np.nan
-
-            # Distance arrays
-            cut_x = edge_distance * edge_size_raw[edge_size_raw <= self.depths[id_edge]] / self.depths[
-                id_edge]  # Position couche coupe fond
-            x_left = np.tile(nodes, (cells_borders_depths_1.shape[0], 1))
-
-            for j in range(np.count_nonzero(~np.isnan(cut_x)) - 1):
-                col, _ = next(x for x in enumerate(nodes) if x[1] > cut_x[j])
-                row = np.where(edge_size_raw == edge_size_raw[j])[0][0]
-                x_left[row, col - 1] = cut_x[j]
-                x_left[row + 1:, col - 1] = nodes[col]
-
-            # Cells serparate in 2 rectangles and 1 triangle 
-            area_rec2 = (x_left[:-1, 1:] - x_left[1:, :-1]) * (
-                        cells_borders_depths_1[1:, :] - cells_borders_depths_1[:-1, :])
-            area_rec1 = (x_left[1:, :-1] - x_left[:-1, :-1]) * (
-                        cells_borders_depths_2[:-1, :-1] - cells_borders_depths_1[:-1, :])
-            area_tri1 = (x_left[1:, :-1] - x_left[:-1, :-1]) * (
-                        cells_borders_depths_1[1:, :] - cells_borders_depths_2[:-1, :-1]) / 2
-            area_tra1 = area_rec1 + area_tri1
-            area = area_tra1 + area_rec2
-
-            # Compute mid of every shape
-            mid_rec2_x = (x_left[:-1, 1:] + x_left[1:, :-1]) / 2
-            mid_rec2_y = (cells_borders_depths_1[:-1, :] + cells_borders_depths_1[1:, :]) / 2
-
-            mid_rec1_x = (x_left[:-1, :-1] + x_left[1:, :-1]) / 2
-            mid_rec1_y = (cells_borders_depths_1[:-1, :] + cells_borders_depths_2[:-1, :-1]) / 2
-
-            mid_tri1_x = (x_left[:-1, :-1] + 2 * x_left[1:, :-1]) / 3
-            mid_tri1_y = (2 * cells_borders_depths_2[:-1, :-1] + cells_borders_depths_1[1:, :]) / 3
-
-            mid_tra1_x = (area_rec1 * mid_rec1_x + area_tri1 * mid_tri1_x) / (area_tra1)
-            mid_tra1_y = (area_rec1 * mid_rec1_y + area_tri1 * mid_tri1_y) / (area_tra1)
-            mid_tra1_x[area_tra1 == 0] = 0
-            mid_tra1_y[area_tra1 == 0] = 0
-
-            # Compute cell's mid
-            mid_cells_x = (area_rec2 * mid_rec2_x + area_tra1 * mid_tra1_x) / area
-            mid_cells_y = (area_rec2 * mid_rec2_y + area_tra1 * mid_tra1_y) / area
-            edge_exp = 2.41
-
-            bed_distance = mid_cells_y * edge_distance / self.depths[id_edge]
-            vertical_depth = mid_cells_x * self.depths[id_edge] / edge_distance
-
-            is_edge = True
-
-        elif edge_coef == 0.91 and edge_distance > 0:
-            mid_cells_x = np.tile([nodes_mid], (len(edge_size_raw) - 1, 1))
-            mid_cells_y = np.transpose([self.depth_cells_center[:, id_edge]] * nb_nodes)
-
-            size_x = np.tile([nodes[1:] - nodes[:-1]], (len(edge_size_raw) - 1, 1))
-            size_y = np.transpose([edge_size_raw[1:] - edge_size_raw[:-1]] * nb_nodes)
-            area = size_x * size_y
-            bed_distance = np.tile(0, area.shape)
-            # border_depths = np.tile([self.depths[id_edge]], nb_nodes+1)
-            vertical_depth = np.tile([self.depths[id_edge]], area.shape)
-            edge_exp = 10
-
-            is_edge = True
-
-        else:
-            mid_cells_x = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-            mid_cells_y = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-
-            # size_x = np.tile([nodes[1:]-nodes[:-1]], (len(edge_size_raw)-1,1))
-            # size_y = np.transpose([edge_size_raw[1:]-edge_size_raw[:-1]]*nb_nodes)
-            area = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-            bed_distance = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-            # border_depths = np.tile([np.nan], (nb_nodes+1))
-            vertical_depth = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-            edge_exp = np.nan
-
-            edge_primary_velocity = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-            edge_secondary_velocity = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-            edge_vertical_velocity = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-
-            is_edge = False
-
-        if np.all(np.isnan(self.primary_velocity[:, id_edge])) or not is_edge:
-            edge_primary_velocity = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-            edge_secondary_velocity = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-            edge_vertical_velocity = np.tile([np.nan], (len(edge_size_raw) - 1, nb_nodes))
-
-        else:
-            ## Primary velocity : Power_power extrapolation from first ensemble
-            # Mean velocity on the first valid ensemble
-            primary_mean_valid = np.nanmean(self.extrap_primary_velocity[:, id_edge])
-            # Compute mean velocity according power law at middle_distance position
-            vp_mean = primary_mean_valid * (mid_cells_x / (edge_distance)) ** (1 / edge_exp)
-            # Compute velocity according power law on the chosen vertical
-            edge_primary_velocity = vp_mean * ((extrap_exp + 1) / extrap_exp) * (
-                        (vertical_depth - mid_cells_y) / vertical_depth) ** (1 / extrap_exp)
-
-            ### Vertical velocity : linear extrapolation from first ensemble vertical distribution
-            vertical_vel_first = np.insert(self.extrap_vertical_velocity[:, id_edge], 0, 0)
-            vertical_vel_first = np.append(vertical_vel_first, 0)
-            norm_depth_first = np.insert(self.depth_cells_center[:, id_edge] / self.depths[id_edge], 0, 0)
-            norm_depth_first = np.append(norm_depth_first, 1)
-            norm_depth_edge = mid_cells_y / vertical_depth
-            edge_vertical_velocity = sc.interpolate.griddata(norm_depth_first, vertical_vel_first, norm_depth_edge)
-
-            ## Secondary velocity : linear interpolation to 0 at edge
-            secondary_vel_first = np.insert(self.extrap_secondary_velocity[:, id_edge], 0,
-                                            self.secondary_velocity[0, id_edge])
-            secondary_vel_first = np.append(secondary_vel_first,
-                                            secondary_vel_first[np.where(~np.isnan(secondary_vel_first))[-1][-1]])
-            depth_first = np.insert(self.depth_cells_center[:, id_edge], 0, 0)
-            depth_first = np.append(depth_first, self.depths[id_edge])
-            edge_secondary_vel_interp = sc.interpolate.griddata(depth_first, secondary_vel_first, mid_cells_y)
-
-            edge_secondary_velocity = np.tile(np.nan, edge_primary_velocity.shape)
-
-            for j in range(edge_primary_velocity.shape[1]):
-                for i in range(np.count_nonzero(~np.isnan(edge_secondary_vel_interp[:, j]))):
-                    edge_secondary_velocity[i, j] = interpolation(np.array([bed_distance[i, j], edge_distance]),
-                                                                  np.array([0, edge_secondary_vel_interp[i, j]]),
-                                                                  mid_cells_x[i, j])
-
-        if edge == 'right':
-            edge_primary_velocity = edge_primary_velocity[:, ::-1]
-            edge_secondary_velocity = edge_secondary_velocity[:, ::-1]
-            edge_vertical_velocity = edge_vertical_velocity[:, ::-1]
-            mid_cells_x = abs(edge_distance - mid_cells_x[:, ::-1])
-            mid_cells_y = mid_cells_y[:, ::-1]
-            area = area[:, ::-1]
-            nodes = abs(edge_distance - nodes[::-1])
-
-        edge_direction = np.tile(mid_direction[id_edge], edge_primary_velocity.shape[1])
-
-        return edge_primary_velocity, edge_secondary_velocity, edge_vertical_velocity, nodes, \
-               edge_direction, mid_cells_x, mid_cells_y, area
-
-    def compute_discharge(self, direction_meas, mid_direction, extrap_option, left_direction=0, right_direction=0,
-                          left_area=0, right_area=0):
-        """ Compute discharge
-        
-        Parameters
-        ----------
-        direction_meas: float
-            Direction normal to the average cross-section
-        mid_direction: np.array
-            1D array of mean velocity direction of each MAP vertical
-        extrap_option: bool
-            Option to define if extrapolation should be applied
-        left_direction: str
-            Direction of the first ensemble applied to edge
-        right_direction: list(float)
-            Direction of the last ensemble applied to edge
-        left_area: np.array
-            Left area of edge's cells
-        right_area: float
-            Right area of edge's cells
-        """
-
-        distance = (self.borders_ens[1:] - self.borders_ens[:-1])
-        depth = self.depth_cells_border[1:, :] - self.depth_cells_border[:-1, :]
-
-        mid_area = distance * depth
-
-        if extrap_option:
-            downstream_velocity_mid = self.extrap_primary_velocity * np.cos(mid_direction - direction_meas) + \
-                                      self.extrap_secondary_velocity * np.sin(mid_direction - direction_meas)
-
-            downstream_velocity_left = self.left_primary_velocity * np.cos(left_direction - direction_meas) + \
-                                       self.left_secondary_velocity * np.sin(left_direction - direction_meas)
-
-            downstream_velocity_right = self.right_primary_velocity * np.cos(right_direction - direction_meas) + \
-                                        self.right_secondary_velocity * np.sin(right_direction - direction_meas)
-
-            middle_cells_discharge = mid_area * downstream_velocity_mid
-            middle_discharge = np.nansum(middle_cells_discharge)
-
-            if middle_discharge < 0:
-                unit = -1
-            else:
-                unit = 1
-
-            self.middle_cells_discharge = middle_cells_discharge * unit
-            self.middle_discharge = middle_discharge * unit
-
-            self.left_cells_discharge = downstream_velocity_left * left_area * unit
-            self.right_cells_discharge = downstream_velocity_right * right_area * unit
-
-            self.left_discharge = np.nansum(self.left_cells_discharge)
-            self.right_discharge = np.nansum(self.right_cells_discharge)
-
-            self.total_discharge = self.left_discharge + self.middle_discharge + self.right_discharge
-
-        else:
-            downstream_velocity_mid = self.primary_velocity * np.cos(mid_direction - direction_meas) + \
-                                      self.secondary_velocity * np.sin(mid_direction - direction_meas)
-
-            middle_cells_discharge = mid_area * downstream_velocity_mid
-            middle_discharge = np.nansum(middle_cells_discharge)
-
-            if middle_discharge < 0:
-                unit = -1
-            else:
-                unit = 1
-
-            self.middle_cells_discharge = middle_cells_discharge * unit
-            self.middle_discharge = middle_discharge * unit
-            self.total_discharge = middle_discharge * unit
-
-    # =============================================================================
-    #     PLOT
-    # =============================================================================
-
-    def plot_projected_data(self, alpha, beta, x_raw_coordinates, y_raw_coordinates, x_projected, y_projected,
-                            path_results,
-                            name_meas, q_ens):
-        x_boundaries0 = [min([min(l) for l in x_projected]), max([max(l) for l in x_projected])]
-        x_boundaries1 = [min([min(l) for l in x_raw_coordinates]), max([max(l) for l in x_raw_coordinates])]
-        x_boundaries = [min([x_boundaries0[0], x_boundaries1[0]]), max([x_boundaries0[1], x_boundaries1[1]])]
-        y_boundaries0 = [min([min(l) for l in y_projected]), max([max(l) for l in y_projected])]
-        y_boundaries1 = [min([min(l) for l in y_raw_coordinates]), max([max(l) for l in y_raw_coordinates])]
-        y_boundaries = [min([y_boundaries0[0], y_boundaries1[0]]), max([y_boundaries0[1], y_boundaries1[1]])]
-        x_mean = np.nanmean(x_boundaries)
-        y_mean = np.nanmean(y_boundaries)
-        x2 = abs(x_boundaries[1] - x_boundaries[0]) / 2
-        y2 = abs(y_boundaries[1] - y_boundaries[0]) / 2
-        dist = np.nanmax([x2, y2])
-        fig = plt.figure(figsize=(8, 6))
-        plt.plot(x_boundaries, [alpha * l + beta for l in x_boundaries], color='firebrick', linewidth=2,
-                 label='Average cross-section', zorder=2)
-        for i in range(len(x_raw_coordinates)):
-            # plt.scatter(x_raw_coordinates[i], y_raw_coordinates[i], s=q_ens[i], color='grey', linewidth=1)
-            plt.plot(x_raw_coordinates[i], y_raw_coordinates[i], color='grey', linewidth=1)
-        plt.plot(np.nan, np.nan, color='grey', linewidth=1, label='Transect boat track')
-        plt.xlabel('Distance East (m)')
-        plt.ylabel('Distance North (m)')
-        plt.ylim(y_mean - dist - 0.5, y_mean + dist + 0.5)
-        plt.xlim(x_mean - dist - 0.5, x_mean + dist + 0.5)
-        plt.gca().set_aspect('equal', adjustable='box')
-        plt.legend(loc='upper left')
-        fig.savefig(path_results + '\\MAP_Average_cross_section_' + name_meas + '.png', dpi=240, bbox_inches='tight')
-        fig.clear
-
-    def plot_profile(self, borders_ens_raw, nodes_depth_raw, left_mid_cells_x, right_mid_cells_x,
-                     left_mid_cells_y, right_mid_cells_y, path_results, name_meas, top_cell):
-
-        left_distance = self.left_distance
-        left_coef = self.left_coef
-        right_coef = self.right_coef
-        borders_ens = self.borders_ens
-
-        # Define attributs
-        plot_data = np.c_[self.left_primary_velocity, self.extrap_primary_velocity, self.right_primary_velocity]
-        distance = left_distance + (borders_ens[1:] + borders_ens[:-1]) / 2
-        x_axis = np.copy(distance)
-        vertical_nodes = nodes_depth_raw
-        # plot_data = np.c_[average_profile.left_primary_velocity, average_profile.extrap_primary_velocity, average_profile.right_primary_velocity]
-        # vertical_nodes = average_profile.borders_depth
-        depths_plt = np.copy(self.depths)
-        if left_coef == 0.3535:
-            depths_plt = np.insert(depths_plt, 0, [top_cell, self.depths[0]])
-            x_axis = np.insert(x_axis, 0, self.left_borders[[0, -1]])
-        elif left_coef == 0.91:
-            depths_plt = np.insert(depths_plt, 0, [top_cell, self.depths[0], self.depths[0]])
-            x_axis = np.insert(x_axis, 0, self.left_borders[[0, 0, -1]])
-        # else:
-        #     depths_plt = np.insert(depths_plt, 0, [self.depths[0]])
-        #     x_axis = np.insert(x_axis, 0, 0)
-
-        if right_coef == 0.3535:
-            depths_plt = np.append(depths_plt, [self.depths[-1], top_cell])
-            x_axis = np.append(x_axis, self.left_distance + borders_ens[-1] + self.right_borders[[0, -1]])
-        elif right_coef == 0.91:
-            depths_plt = np.append(depths_plt, [self.depths[-1], self.depths[-1], top_cell])
-            x_axis = np.append(x_axis, self.left_distance + borders_ens[-1] + self.right_borders[[0, -1, -1]])
-        # else:
-        #     depths_plt = np.append(depths_plt, self.depths[-1])
-        #     x_axis = np.append(x_axis, distance[-1] + (distance[-1] - distance[-2]) / 2)
-
-        # x_axis = np.append(np.insert(distance, 0, self.left_borders),
-        #                     self.right_borders+borders_ens[-1]+self.left_distance)
-        depth_cells_border = self.depth_cells_border
-        middle_cells = np.c_[left_mid_cells_y, (depth_cells_border[1:] + depth_cells_border[:-1]) / 2,
-                             right_mid_cells_y]
-
-        v = np.c_[self.left_secondary_velocity, np.c_[self.extrap_secondary_velocity, self.right_secondary_velocity]]
-        w = np.c_[self.left_vertical_velocity, np.c_[self.extrap_vertical_velocity, self.right_vertical_velocity]]
-
-        quiver_distance = np.tile([distance], (plot_data.shape[0], 1))
-        quiver_distance = np.c_[left_mid_cells_x, quiver_distance, \
-                                left_distance + borders_ens[-1] + right_mid_cells_x]
-
-        quiver_scale = np.nanmax([0.05, np.nanquantile(np.sqrt(v ** 2 + w ** 2), 0.95)])
-        quiver_scale = round_it(quiver_scale, 2)
-
-        mid_dist = np.append(np.insert(borders_ens[1:] + left_distance, 0, self.left_borders), self.right_borders[1:] +
-                             borders_ens[-1] + left_distance)
-
-        max_limit = 0
-
-        x_plt = np.tile(np.nan, (2 * plot_data.shape[0], 2 * (plot_data.shape[1])))
-        x_pand = np.array([val for val in mid_dist for _ in (0, 1)][1:-1])
-        for n in range(len(x_pand)):
-            x_plt[:, n] = x_pand[n]
-
-        cell_plt = np.tile(np.nan, (2 * plot_data.shape[0], 2 * (plot_data.shape[1])))
-        cell_pand = np.array([val for val in vertical_nodes for _ in (0, 1)][1:-1])
-        for p in range(cell_pand.shape[0]):
-            cell_plt[p, :] = cell_pand[p]
-
-        speed_xpand = np.tile(np.nan, (plot_data.shape[0], 2 * (plot_data.shape[1])))
-
-        for j in range(plot_data.shape[1]):
-            speed_xpand[:, 2 * j] = plot_data[:, j]
-            speed_xpand[:, 2 * j + 1] = plot_data[:, j]
-
-        speed_plt = np.repeat(speed_xpand, 2, axis=0)
-
-        # extrap_limit = self.vertical_nodes[self.idx_bot+1]
-        min_limit = np.nanmin(speed_plt)
-        if max_limit == 0:
-            if np.sum(speed_plt[speed_plt > -900]) > 0:
-                max_limit = np.percentile(speed_plt[speed_plt > -900], 99)
-            else:
-                max_limit = 1
-        x_fill = np.insert(x_axis, 0, mid_dist[0] - 0.6)
-        x_fill = np.append(x_fill, mid_dist[-1] + 0.6)
-        depth_fill = np.insert(depths_plt, 0, depths_plt[0])
-        depth_fill = np.append(depth_fill, depths_plt[-1])
-
-        # Main parameters
-        plt.rcParams.update({'font.size': 14})
-        # %%
-        ## Canvas
-        main_wt_contour_canvas = MplCanvas(width=15, height=3, dpi=240)
-
-        canvas = main_wt_contour_canvas
-        fig = canvas.fig
-        # Configure axis
-        fig.ax = fig.add_subplot(1, 1, 1)
-        fig.subplots_adjust(left=0.08, bottom=0.2, right=1, top=0.97, wspace=0.1, hspace=0)
-        # Create color map
-        cmap = cm.get_cmap('viridis')
-        cmap.set_under('white')
-        # Generate color contour
-        c = fig.ax.pcolormesh(x_plt, cell_plt, speed_plt, cmap=cmap, vmin=min_limit,
-                              vmax=max_limit)
-        # Add color bar and axis labels
-        cb = fig.colorbar(c, pad=0.02)
-        cb.ax.set_ylabel(canvas.tr('Primary Water Velocity (m/s)'))
-        cb.ax.yaxis.label.set_fontsize(12)
-        cb.ax.tick_params(labelsize=12)
-        fig.ax.invert_yaxis()
-        fig.ax.fill_between(x_fill, np.nanmax(depths_plt) + 2, depth_fill, color='w')
-        fig.ax.plot(x_axis, depths_plt, color='k', linewidth=1.5)
-        q = fig.ax.quiver(quiver_distance, middle_cells, v, w, units='xy',
-                          scale=quiver_scale)  # ,width=quiver_width)
-        fig.ax.quiverkey(q, X=1, Y=-0.12, U=np.round(quiver_scale, 2), label=str(quiver_scale) + 'm/s',
-                         labelpos='E', coordinates='axes', fontproperties={'size': 12})
-        fig.ax.set_xlabel(canvas.tr('Distance (m)'))
-        fig.ax.set_ylabel(canvas.tr('Depth (m)'))
-        fig.ax.xaxis.label.set_fontsize(12)
-        fig.ax.yaxis.label.set_fontsize(12)
-        fig.ax.tick_params(axis='both', direction='in', bottom=True, top=True, left=True, right=True)
-        fig.ax.set_ylim(top=0, bottom=np.nanmax(depths_plt) * 1.02)
-        # fig.ax.set_ylim(top=3.25, bottom=3.32)
-        lower_limit = mid_dist[0] - 0.5
-        upper_limit = mid_dist[-1] + 0.5
-
-        fig.ax.set_xlim(left=lower_limit, right=upper_limit)
-        canvas.draw()
-        show_figure(fig)
-        fig.savefig(path_results + '\\MAP_Profile_' + name_meas + '.png', dpi=300, bbox_inches='tight')
diff --git a/MiscLibs/__init__.py b/MiscLibs/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/qrevint_22_06_22/MiscLibs/abba_2d_interpolation.py b/MiscLibs/abba_2d_interpolation.py
similarity index 67%
rename from qrevint_22_06_22/MiscLibs/abba_2d_interpolation.py
rename to MiscLibs/abba_2d_interpolation.py
index 296806d4598c5489768eb2abe2c513896783a9eb..83e8b3ad73f652c920098a10b697b155ac77f833 100644
--- a/qrevint_22_06_22/MiscLibs/abba_2d_interpolation.py
+++ b/MiscLibs/abba_2d_interpolation.py
@@ -1,19 +1,24 @@
 """abba_2d_interpolation
 
-This module performs 2-D interpolation on data that is assumed to be arranged in row-column format rather
-than in a random pattern. The rows represent vertical location or y-coordinate of each cell
-in the data array. The columns represent a horizontal location or x-coordinate of the data.
-The cell size and thus the y-coordinate of a cell can change from cell to cell or ensemble to ensemble.
-The interpolation algorithm searches for the all valid cells above, below, before, and after
-that touch the cell to be interpolated. Bathymetry is honored by checking to see if the depth of the streambed
-of the cell before or after is greater than the bottom of the target cell. When searching before or after, if the
-streambed is encountered before a valid cell then no valid cell is used in that direction.
-
-The methods provide the flexibility to determine neighbors based on either a raw vertical location
-or a normalized location. To use a normalized location set normalize to True.
-
-For efficiency the data_list can contain multiple types of data that lie on the same x-y locations.
-This allows multiple interpolations without having to recompute neighbors and distances.
+This module performs 2-D interpolation on data that is assumed to be arranged
+in row-column format rather than in a random pattern. The rows represent vertical
+location or y-coordinate of each cell in the data array. The columns represent a
+horizontal location or x-coordinate of the data. The cell size and thus the
+y-coordinate of a cell can change from cell to cell or ensemble to ensemble.
+The interpolation algorithm searches for the all valid cells above, below,
+before, and after that touch the cell to be interpolated. Bathymetry is honored
+by checking to see if the depth of the streambed of the cell before or after is
+greater than the bottom of the target cell. When searching before or after,
+if thestreambed is encountered before a valid cell then no valid cell is used
+in that direction.
+
+The methods provide the flexibility to determine neighbors based on either
+a raw vertical location or a normalized location. To use a normalized location
+set normalize to True.
+
+For efficiency the data_list can contain multiple types of data that lie on
+the same x-y locations. This allows multiple interpolations without having to
+recompute neighbors and distances.
 
 Example
 -------
@@ -36,9 +41,17 @@ interpolated_v_values = interpolated_data[1]
 import numpy as np
 
 
-def find_neighbors(valid_data, cells_above_sl, y_cell_centers, y_cell_size, y_depth, search_loc, normalize=False):
-    """ Finds the nearest valid cells above, below, before, and after each invalid cell. The before and after
-    Cells must have data in the same y range as the invalid cell.
+def find_neighbors(
+    valid_data,
+    cells_above_sl,
+    y_cell_centers,
+    y_cell_size,
+    y_depth,
+    search_loc,
+    normalize=False,
+):
+    """Finds the nearest valid cells above, below, before, and after each invalid cell.
+    The before and after cells must have data in the same y range as the invalid cell.
 
     Parameters
     ----------
@@ -51,8 +64,8 @@ def find_neighbors(valid_data, cells_above_sl, y_cell_centers, y_cell_size, y_de
     y_cell_size: np.array(float)
         Size of each cell in the y-direction
     y_depth: np.array(float)
-        1-D array containing values that will be used to normalize the data and specifying the lower boundary for
-        identifying neighbors
+        1-D array containing values that will be used to normalize the data and
+        specifying the lower boundary for identifying neighbors
     search_loc: list
         Identifies location to search (above, below, before, after)
     normalize: bool
@@ -61,7 +74,8 @@ def find_neighbors(valid_data, cells_above_sl, y_cell_centers, y_cell_size, y_de
     Returns
     -------
     neighbors: list
-        List of dictionaries providing the indices of the above, below, before, and after valid cells.
+        List of dictionaries providing the indices of the above, below,
+        before, and after valid cells.
     """
 
     # Compute cell extents
@@ -86,40 +100,40 @@ def find_neighbors(valid_data, cells_above_sl, y_cell_centers, y_cell_size, y_de
         points = []
         target = (cell, ens)
 
-        if 'above' in search_loc:
+        if "above" in search_loc:
             # Identify indices of cells above and below target
             above = find_above(target, valid_data)
             if above is not None:
                 points.append(above)
 
-        if 'below' in search_loc:
+        if "below" in search_loc:
             below = find_below(target, valid_data)
             if below is not None:
                 points.append(below)
 
-        # Find all cells in ensembles before or after the target ensemble that overlap the target cell
-        # This is a change implemented on 2/27/2020 - dsm
-        y_match = np.logical_and(y_top[target] <= y_bottom, y_bottom[target] >= y_top)
+        # Find all cells in ensembles before or after the target ensemble
+        # that overlap the target cell.
+        y_match = np.logical_and(y_top[target] < y_bottom, y_bottom[target] > y_top)
         y_match = np.logical_and(y_match, valid_data)
 
-        if 'before' in search_loc:
+        if "before" in search_loc:
             # Identify indices of cells before and after target
             before = find_before(target, y_match, y_depth, y_bottom_actual)
             if before:
                 points = points + before
 
-        if 'after' in search_loc:
+        if "after" in search_loc:
             after = find_after(target, y_match, y_depth, y_bottom_actual)
             if after:
                 points = points + after
 
-        neighbors.append({'target': target, 'neighbors': points})
+        neighbors.append({"target": target, "neighbors": points})
 
     return neighbors
 
 
 def find_above(target, valid_data):
-    """ Finds the nearest valid cell above the target.
+    """Finds the nearest valid cell above the target.
 
     Parameters
     ----------
@@ -148,7 +162,7 @@ def find_above(target, valid_data):
 
 
 def find_below(target, valid_data):
-    """ Finds the nearest valid cell below the target.
+    """Finds the nearest valid cell below the target.
 
     Parameters
     ----------
@@ -166,7 +180,7 @@ def find_below(target, valid_data):
     below_idx = target[0] + 1
 
     # Determine cell row index limit
-    n_cells = len(valid_data[:, target[1]])-1
+    n_cells = len(valid_data[:, target[1]]) - 1
 
     # Find nearest valid cell below target
     while below_idx <= n_cells and not valid_data[below_idx, target[1]]:
@@ -180,7 +194,8 @@ def find_below(target, valid_data):
 
 
 def find_before(target, y_match, y_depth, y_bottom):
-    """ Finds the nearest ensemble before the target that has valid cells within the vertical range of the target
+    """Finds the nearest ensemble before the target that has valid cells within the
+    vertical range of the target
 
     Parameters
     ----------
@@ -189,28 +204,29 @@ def find_before(target, y_match, y_depth, y_bottom):
     y_match: np.array(logical)
         2-D array of all cells that are within the vertical range of the target cell
     y_depth: np.array(float)
-        1-D array containing values that will be used to normalize the data and specifying the lower boundary for
-        identifying neighbors
+        1-D array containing values that will be used to normalize the data and
+        specifying the lower boundary for identifying neighbors
     y_bottom: np.array(float)
         Bottom depth of each cell
 
     Returns
     -------
     before_idx: list
-        List of tuples of indices of all cells in the nearest ensemble before that target that are within
-        the vertical range of the target cell
+        List of tuples of indices of all cells in the nearest ensemble before
+        that target that are within the vertical range of the target cell
     """
 
     # Initialize ensemble counter
     before_ens = target[1] - 1
 
-    # Loop until an ensemble is found that has valid data within the vertical range of the target while honoring
-    # the bathymetry. If the streambed is encountered while searching for a previously valid ensemble then
-    # it is determined that there is no available valid data before the target that can be used.
+    # Loop until an ensemble is found that has valid data within the vertical range
+    # of the target while honoring the bathymetry. If the streambed is encountered
+    # while searching for a previously valid ensemble then it is determined that
+    # there is no available valid data before the target that can be used.
     found = False
 
     while (before_ens >= 0) and not found:
-        if y_bottom[target] < y_depth[before_ens] and np.any(y_match[:, before_ens]):
+        if y_bottom[target] <= y_depth[before_ens] and np.any(y_match[:, before_ens]):
             found = True
         elif y_bottom[target] > y_depth[before_ens]:
             before_ens = -999
@@ -232,7 +248,8 @@ def find_before(target, y_match, y_depth, y_bottom):
 
 
 def find_after(target, y_match, y_depth, y_bottom):
-    """ Finds the nearest ensemble after the target that has valid cells within the vertical range of the target
+    """Finds the nearest ensemble after the target that has valid cells within the
+    vertical range of the target
 
     Parameters
     ----------
@@ -241,27 +258,28 @@ def find_after(target, y_match, y_depth, y_bottom):
     y_match: np.array(logical)
         2-D array of all cells that are within the vertical range of the target cell
     y_depth: np.array(float)
-        1-D array containing values that will be used to normalize the data and specifying the lower boundary for
-        identifying neighbors
+        1-D array containing values that will be used to normalize the data and
+        specifying the lower boundary for identifying neighbors
     y_bottom: np.array(float)
         Bottom depth of each cell
     Returns
     -------
     after_idx: list
-        List of tuples of indices of all cells in the nearest ensemble after that target that are within
-        the vertical range of the target cell
+        List of tuples of indices of all cells in the nearest ensemble after
+        that target that are within the vertical range of the target cell
     """
 
     # Initialize ensemble counter
     after_ens = target[1] + 1
 
-    # Loop until an ensemble is found that has valid data within the vertical range of the target while honoring
-    # the bathymetry. If the streambed is encountered while searching for a next valid ensemble then
-    # it is determined that there is no available valid data after the target that can be used.
+    # Loop until an ensemble is found that has valid data within the vertical range
+    # of the target while honoring the bathymetry. If the streambed is encountered
+    # while searching for a next valid ensemble then it is determined that there is
+    # no available valid data after the target that can be used.
     found = False
 
     while (after_ens <= y_match.shape[1] - 1) and not found:
-        if (y_bottom[target] < y_depth[after_ens]) and np.any(y_match[:, after_ens]):
+        if (y_bottom[target] <= y_depth[after_ens]) and np.any(y_match[:, after_ens]):
             found = True
         elif y_bottom[target] > y_depth[after_ens]:
             after_ens = -999
@@ -271,7 +289,7 @@ def find_after(target, y_match, y_depth, y_bottom):
 
     # Find and store the indices all cells from the identified ensemble
     # that are within the vertical range of the target
-    if (after_ens <= y_match.shape[1]-1) and (after_ens > 0):
+    if (after_ens <= y_match.shape[1] - 1) and (after_ens > 0):
         rows = np.where(y_match[:, after_ens])[0]
         after_idx = []
         for row in rows:
@@ -283,7 +301,7 @@ def find_after(target, y_match, y_depth, y_bottom):
 
 
 def compute_distances(target, neighbors, x, y):
-    """ Computes distances between the target and neighbors.
+    """Computes distances between the target and neighbors.
 
     Parameters
     ----------
@@ -309,13 +327,15 @@ def compute_distances(target, neighbors, x, y):
     # Compute distance from target cell to each neighbor
     distances = []
     for neighbor in neighbors:
-        distances.append(np.sqrt((y[neighbor] - target_y) ** 2 + (x[neighbor[1]] - target_x) ** 2))
+        distances.append(
+            np.sqrt((y[neighbor] - target_y) ** 2 + (x[neighbor[1]] - target_x) ** 2)
+        )
 
     return distances
 
 
 def idw_interpolation(data, neighbor_indices, distances):
-    """ Interpolate value using neighbors and inverse distance weighting.
+    """Interpolate value using neighbors and inverse distance weighting.
 
     Parameters
     ----------
@@ -336,8 +356,9 @@ def idw_interpolation(data, neighbor_indices, distances):
     sum_of_weights = 0
     weighted_sum = 0
     for n, index in enumerate(neighbor_indices):
-        sum_of_weights = sum_of_weights + (1/distances[n])
-        weighted_sum = weighted_sum + data[index] * (1/distances[n])
+        if distances[n] > 0:
+            sum_of_weights = sum_of_weights + (1 / distances[n])
+            weighted_sum = weighted_sum + data[index] * (1 / distances[n])
 
     # Compute interpolated value
     if sum_of_weights > 0:
@@ -348,10 +369,19 @@ def idw_interpolation(data, neighbor_indices, distances):
     return interpolated_value
 
 
-def abba_idw_interpolation(data_list, valid_data, cells_above_sl, y_centers, y_cell_size, y_depth,
-                           x_shiptrack, normalize, search_loc=('above', 'below', 'before', 'after')):
-    """ Interpolates values for invalid cells using the neighboring cells above, below, before, and after and
-    and inverse distance averaging.
+def abba_idw_interpolation(
+    data_list,
+    valid_data,
+    cells_above_sl,
+    y_centers,
+    y_cell_size,
+    y_depth,
+    x_shiptrack,
+    normalize,
+    search_loc=("above", "below", "before", "after"),
+):
+    """Interpolates values for invalid cells using the neighboring cells above,
+    below, before, and after and and inverse distance averaging.
 
     Parameters
     ----------
@@ -366,8 +396,8 @@ def abba_idw_interpolation(data_list, valid_data, cells_above_sl, y_centers, y_c
     y_cell_size: np.array(float)
         Size of each cell in the y-direction
     y_depth: np.array(float)
-        1-D array containing values that will be used to normalize the data and specifying the lower boundary for
-        identifying neighbors
+        1-D array containing values that will be used to normalize the data and
+        specifying the lower boundary for identifying neighbors
     x_shiptrack: np.array(float)
         X coordinate of cumulative shiptrack
     normalize: bool
@@ -387,27 +417,31 @@ def abba_idw_interpolation(data_list, valid_data, cells_above_sl, y_centers, y_c
     valid_cells = np.logical_and(cells_above_sl, valid_data)
     if not np.all(valid_cells):
         # Find neighbors associated with each target
-        interpolation_points = find_neighbors(valid_data=valid_data,
-                                              cells_above_sl=cells_above_sl,
-                                              y_cell_centers=y_centers,
-                                              y_cell_size=y_cell_size,
-                                              y_depth=y_depth,
-                                              search_loc=search_loc,
-                                              normalize=normalize)
-
+        interpolation_points = find_neighbors(
+            valid_data=valid_data,
+            cells_above_sl=cells_above_sl,
+            y_cell_centers=y_centers,
+            y_cell_size=y_cell_size,
+            y_depth=y_depth,
+            search_loc=search_loc,
+            normalize=normalize,
+        )
+        dist = []
         # Process each target
         for point in interpolation_points:
             # Compute distance from target to neighbors
-            distances = compute_distances(target=point['target'],
-                                          neighbors=point['neighbors'],
-                                          x=x_shiptrack,
-                                          y=y_centers)
-
+            distances = compute_distances(
+                target=point["target"],
+                neighbors=point["neighbors"],
+                x=x_shiptrack,
+                y=y_centers,
+            )
+            dist.append(dist)
             # Interpolate target for each data set in data_list
             for n, data in enumerate(data_list):
-                interpolated_value = idw_interpolation(data=data,
-                                                       neighbor_indices=point['neighbors'],
-                                                       distances=distances)
-                interpolated_data[n].append([point['target'], interpolated_value])
+                interpolated_value = idw_interpolation(
+                    data=data, neighbor_indices=point["neighbors"], distances=distances
+                )
+                interpolated_data[n].append([point["target"], interpolated_value])
 
     return interpolated_data
diff --git a/MiscLibs/bayes_cov_compiled.cp36-win_amd64.pyd b/MiscLibs/bayes_cov_compiled.cp36-win_amd64.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..7f5f4c3cef5587bf372a087c9911d6064d1820e3
Binary files /dev/null and b/MiscLibs/bayes_cov_compiled.cp36-win_amd64.pyd differ
diff --git a/qrevint_22_06_22/MiscLibs/bayes_cov_compiled.py b/MiscLibs/bayes_cov_compiled.py
similarity index 67%
rename from qrevint_22_06_22/MiscLibs/bayes_cov_compiled.py
rename to MiscLibs/bayes_cov_compiled.py
index 9f627e89eee6bc5172fc274ba95708f8b0bcc4a0..913d17316f1206b6fe2d28c8016028877c44cdd9 100644
--- a/qrevint_22_06_22/MiscLibs/bayes_cov_compiled.py
+++ b/MiscLibs/bayes_cov_compiled.py
@@ -14,15 +14,15 @@ import numpy as np
 from numba.pycc import CC
 from numba import njit
 
-cc = CC('bayes_cov_compiled')
+cc = CC("bayes_cov_compiled")
 
 
 # Bayesian COV
 # ============
-@cc.export('bayes_cov', 'f8(f8[::1], f8, f8, i4)')
+@cc.export("bayes_cov", "f8(f8[::1], f8, f8, i4)")
 def bayes_cov(transects_total_q, cov_prior=0.03, cov_prior_u=0.2, nsim=20000):
-    """Computes the coefficient of variation using a Bayesian approach and an assumed posterior
-    log-normal distribution.
+    """Computes the coefficient of variation using a Bayesian approach and
+    an assumed posterior log-normal distribution.
 
     Parameters
     ----------
@@ -41,16 +41,21 @@ def bayes_cov(transects_total_q, cov_prior=0.03, cov_prior_u=0.2, nsim=20000):
         Coefficient of variation
     """
 
-    theta_std = np.abs(np.array([np.mean(transects_total_q), cov_prior])) * cov_prior_u \
+    theta_std = (
+        np.abs(np.array([np.mean(transects_total_q), cov_prior]))
+        * cov_prior_u
         / np.sqrt(len(transects_total_q))
+    )
 
     # Modified for compatibility with Numba
-    sam, obj_funk = metropolis(theta0=np.array([np.mean(transects_total_q), cov_prior]),
-                               obs_data=transects_total_q,
-                               cov_prior=cov_prior,
-                               cov_prior_u=cov_prior_u,
-                               nsim=nsim,
-                               theta_std=theta_std)
+    sam, obj_funk = metropolis(
+        theta0=np.array([np.mean(transects_total_q), cov_prior]),
+        obs_data=transects_total_q,
+        cov_prior=cov_prior,
+        cov_prior_u=cov_prior_u,
+        nsim=nsim,
+        theta_std=theta_std,
+    )
 
     n_burn = int(nsim / 2)
 
@@ -60,10 +65,11 @@ def bayes_cov(transects_total_q, cov_prior=0.03, cov_prior_u=0.2, nsim=20000):
 
 
 @njit
-@cc.export('metropolis', '(f8[:], f8[:], f8, f8, i4, f8[:])')
+@cc.export("metropolis", "(f8[:], f8[:], f8, f8, i4, f8[:])")
 def metropolis(theta0, obs_data, cov_prior, cov_prior_u, nsim, theta_std):
-    """Implements the Metropolis_Hastings Markov chain Monte Carlo (MCMC) algorithm for sampling the
-    posterior distribution, assuming a log-normal posterior distribution.
+    """Implements the Metropolis_Hastings Markov chain Monte Carlo (MCMC)
+    algorithm for sampling the posterior distribution, assuming a
+    log-normal posterior distribution.
 
     Parameters
     ----------
@@ -78,7 +84,8 @@ def metropolis(theta0, obs_data, cov_prior, cov_prior_u, nsim, theta_std):
     nsim: int
         Number of simulations.
     theta_std: np.array(float)
-        Standard deviation for the gaussian Jump distribution. If blank a default value is computed.
+        Standard deviation for the gaussian Jump distribution.
+        If blank a default value is computed.
 
     Returns
     -------
@@ -94,16 +101,19 @@ def metropolis(theta0, obs_data, cov_prior, cov_prior_u, nsim, theta_std):
     sam = np.zeros((nsim + 1, npar))
     obj_funk = np.zeros((nsim + 1, 1))
 
-    # Parameters - used for automatic computation of starting stds of the Gaussian Jump distribution
+    # Parameters - used for automatic computation of starting stds of the
+    # Gaussian Jump distribution
     if np.any(np.isnan(theta_std)):
         std_factor = 0.1
         theta_std = std_factor * np.abs(theta0)
 
     # Check if starting point is feasible - abandon otherwise
-    f_current = log_post(param=theta0, measures=obs_data, cov_prior=cov_prior, cov_prior_u=cov_prior_u)
+    f_current = log_post(
+        param=theta0, measures=obs_data, cov_prior=cov_prior, cov_prior_u=cov_prior_u
+    )
 
     if not is_feasible(f_current):
-        print('Metropolis:FATAL:unfeasible starting point')
+        print("Metropolis:FATAL:unfeasible starting point")
         return sam, obj_funk
     else:
         sam[0, :] = list(theta0)
@@ -122,10 +132,12 @@ def metropolis(theta0, obs_data, cov_prior, cov_prior_u, nsim, theta_std):
             candid[1] = np.random.normal(loc=current[1], scale=theta_std[1])
 
             # Evaluate objective function at candidate
-            f_candid = log_post(param=candid,
-                                measures=obs_data,
-                                cov_prior=cov_prior,
-                                cov_prior_u=cov_prior_u)
+            f_candid = log_post(
+                param=candid,
+                measures=obs_data,
+                cov_prior=cov_prior,
+                cov_prior_u=cov_prior_u,
+            )
 
             if not is_feasible(f_candid):
                 sam[i + 1, :] = current
@@ -135,7 +147,18 @@ def metropolis(theta0, obs_data, cov_prior, cov_prior_u, nsim, theta_std):
                 u = np.random.uniform(0, 1)
 
                 # Compute Metropolis acceptance ratio
-                ratio = np.exp(min((np.max(np.hstack((np.array([float(-100)]), f_candid - f_current))), float(0))))
+                ratio = np.exp(
+                    min(
+                        (
+                            np.max(
+                                np.hstack(
+                                    (np.array([float(-100)]), f_candid - f_current)
+                                )
+                            ),
+                            float(0),
+                        )
+                    )
+                )
 
                 # Apply acceptance rule
                 if u <= ratio:
@@ -150,10 +173,11 @@ def metropolis(theta0, obs_data, cov_prior, cov_prior_u, nsim, theta_std):
 
 
 @njit
-@cc.export('log_post', 'f8(f8[:], f8[:], f8, f8)')
+@cc.export("log_post", "f8(f8[:], f8[:], f8, f8)")
 def log_post(param, measures, cov_prior, cov_prior_u):
-    """Define function returning the posterior log-pdf using the model measures ~ N(true_value,cov*true_value),
-    with a flat prior on true_value and a log-normal prior for cov (= coefficient of variation)
+    """Define function returning the posterior log-pdf using the model measures
+    ~ N(true_value,cov*true_value), with a flat prior on true_value and a log-normal
+    prior for cov (= coefficient of variation)
 
     Parameters
     ----------
@@ -173,9 +197,9 @@ def log_post(param, measures, cov_prior, cov_prior_u):
         Unnormalized log-posterior
     """
     # Check if any parameter is <=0
-    # since  both true_value and cov have to be positive - otherwise sigma = true_value*cov does not make sense
-    # if any(item <= 0 for item in param):
-    #     return -math.inf
+    # since both true_value and cov have to be positive -
+    # otherwise sigma = true_value*cov does not make sense
+
     # Changed for compatibility with Numba
     if np.any(np.less_equal(param, 0)):
         return np.NINF
@@ -187,18 +211,26 @@ def log_post(param, measures, cov_prior, cov_prior_u):
     # Compute log-likelihood under the model: measures ~ N(true_value,sigma)
     # You can easily change this model (e.g. lognormal for a positive measurand?)
     # OPTION 1 : the model follows a Normal distribution
-    # This equation is used for compatibility with Numba, instead of call to scipy.stats.norm.logpdf
-    log_likelihood = np.sum(np.log(np.exp(-(((measures - true_value) / sigma) ** 2) / 2)
-                                   / (np.sqrt(2 * np.pi) * sigma)))
-
-    # Prior on true_value - flat prior used here but you may change this if you have prior knowledge
+    # This equation is used for compatibility with Numba,
+    # instead of call to scipy.stats.norm.logpdf
+    log_likelihood = np.sum(
+        np.log(
+            np.exp(-(((measures - true_value) / sigma) ** 2) / 2)
+            / (np.sqrt(2 * np.pi) * sigma)
+        )
+    )
+
+    # Prior on true_value - flat prior used here but you may change this
+    # if you have prior knowledge
     log_prior_1 = 0
 
     # Lognormal prior
     x = cov
     mu = np.log(cov_prior)
     scale = cov_prior_u
-    pdf = np.exp(-(np.log(x) - mu) ** 2 / (2 * scale ** 2)) / (x * scale * np.sqrt(2 * np.pi))
+    pdf = np.exp(-((np.log(x) - mu) ** 2) / (2 * scale**2)) / (
+        x * scale * np.sqrt(2 * np.pi)
+    )
     log_prior_2 = np.log(pdf)
 
     # Joint prior (prior independence)
@@ -208,12 +240,14 @@ def log_post(param, measures, cov_prior, cov_prior_u):
     logp = log_likelihood + log_prior
     if np.isnan(logp):
         # Used np to eliminate the need for math package
-        logp = np.NINF  # returns -Inf rather than NaN's (required by the MCMC sampler used subsequently)
+        logp = np.NINF
+        # returns -Inf rather than NaN's
+        # (required by the MCMC sampler used subsequently)
     return logp
 
 
 @njit
-@cc.export('is_feasible', 'b1(f8)')
+@cc.export("is_feasible", "b1(f8)")
 def is_feasible(value):
     """Checks that a value is a real value (not infinity or nan)
 
@@ -231,6 +265,6 @@ def is_feasible(value):
         return True
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     # Used to compile code
     cc.compile()
diff --git a/qrevint_22_06_22/MiscLibs/common_functions.py b/MiscLibs/common_functions.py
similarity index 69%
rename from qrevint_22_06_22/MiscLibs/common_functions.py
rename to MiscLibs/common_functions.py
index 8a3393fc957f66d2c20a0040d6e839cb0ccff6cb..57622491ba336998041bfc98e4cec1e9b4c79f9f 100644
--- a/qrevint_22_06_22/MiscLibs/common_functions.py
+++ b/MiscLibs/common_functions.py
@@ -1,5 +1,7 @@
 import numpy as np
 import scipy.stats as sp
+# from decimal import Decimal
+from sigfig import round as sigfig_round
 
 
 def cosd(angle):
@@ -10,44 +12,44 @@ def cosd(angle):
     angle: float
         Angle in degrees
     """
-    
-    return np.cos(np.pi * angle/180)
+
+    return np.cos(np.pi * angle / 180)
 
 
 def sind(angle):
     """Compute sine of angle in degrees.
 
-        Parameters
-        ----------
-        angle: float
-            Angle in degrees
-        """
-    
-    return np.sin(np.pi * angle/180)
+    Parameters
+    ----------
+    angle: float
+        Angle in degrees
+    """
+
+    return np.sin(np.pi * angle / 180)
 
 
 def tand(angle):
     """Compute tangent of angle in degrees.
 
-        Parameters
-        ----------
-        angle: float
-            Angle in degrees
-        """
-    
-    return np.tan(np.pi * angle/180)
+    Parameters
+    ----------
+    angle: float
+        Angle in degrees
+    """
+
+    return np.tan(np.pi * angle / 180)
 
 
 def arctand(angle):
     """Compute arctangent of angle in degrees.
 
-        Parameters
-        ----------
-        angle: float
-            Angle in degrees
-        """
-    
-    return np.arctan(angle) * 180/np.pi
+    Parameters
+    ----------
+    angle: float
+        Angle in degrees
+    """
+
+    return np.arctan(angle) * 180 / np.pi
 
 
 def cart2pol(x, y):
@@ -62,40 +64,40 @@ def cart2pol(x, y):
 
     Returns
     -------
-    phi: float
+    phi: np.array(float)
         Angle in radians
-    rho: float
+    rho: np.array(float)
         Magnitude
     """
-    
+
     rho = np.sqrt(x**2 + y**2)
     phi = np.arctan2(y, x)
-    
+
     return phi, rho
 
 
 def pol2cart(phi, rho):
     """Convert polar coordinates to cartesian coordinates.
 
-        Parameters
-        ----------
-        phi: np.array(float)
-            Angle in radians
-        rho: np.array(float)
-            Magnitude
-
-        Returns
-        -------
-        x: float
-            x coordinate
-        y: float
-            y coordinate
-
-        """
-    
+    Parameters
+    ----------
+    phi: np.array(float)
+        Angle in radians
+    rho: np.array(float)
+        Magnitude
+
+    Returns
+    -------
+    x: float
+        x coordinate
+    y: float
+        y coordinate
+
+    """
+
     x = rho * np.cos(phi)
     y = rho * np.sin(phi)
-    
+
     return x, y
 
 
@@ -157,7 +159,7 @@ def iqr_2d(data):
     return sp_iqr
 
 
-def azdeg2rad(angle) -> float:
+def azdeg2rad(angle):
     """Converts an azimuth angle in degrees to radians.
 
     Parameters
@@ -172,7 +174,7 @@ def azdeg2rad(angle) -> float:
     """
 
     # Convert to radians
-    direction = np.deg2rad(90-angle)
+    direction = np.deg2rad(90 - angle)
 
     # Create postive angle
     idx = np.where(direction < 0)[0]
@@ -180,11 +182,11 @@ def azdeg2rad(angle) -> float:
         direction[idx] = direction[idx] + 2 * np.pi
     else:
         direction = direction + 2 * np.pi
-        
+
     return direction
 
 
-def rad2azdeg(angle) -> float:
+def rad2azdeg(angle):
     """Converts an angle in radians to an azimuth in degrees.
 
     Parameters
@@ -203,7 +205,7 @@ def rad2azdeg(angle) -> float:
         deg = 90 - deg
         if deg < 0:
             deg += 360
-            
+
         return deg
     else:
         # Multiple values
@@ -211,7 +213,7 @@ def rad2azdeg(angle) -> float:
         deg = 90 - deg
         sub_zero = np.where(nan_less(deg, 0))
         deg[sub_zero] = deg[sub_zero] + 360
-        
+
         return deg
 
 
@@ -228,7 +230,7 @@ def nandiff(values):
     final_values: np.ndarray()
         1-D array of differences of consecutive non nan numbers
     """
-    
+
     final_values = []
     for n in range(len(values) - 1):
         # Check for nan and add nan to final values
@@ -239,9 +241,9 @@ def nandiff(values):
             i = n + 1
             while np.isnan(values[i]) and i < len(values) - 1:
                 i += 1
-            
+
             final_values.append(values[i] - values[n])
-        
+
     return np.array(final_values)
 
 
@@ -308,7 +310,7 @@ def checked_idx(transects):
     return checked
 
 
-def units_conversion(units_id='SI'):
+def units_conversion(units_id="SI"):
     """Computes the units conversion from SI units used internally to the
     desired display units.
 
@@ -323,27 +325,31 @@ def units_conversion(units_id='SI'):
         dictionary of unit conversion and labels
     """
 
-    if units_id == 'SI':
-        units = {'L': 1,
-                 'Q': 1,
-                 'A': 1,
-                 'V': 1,
-                 'label_L': '(m)',
-                 'label_Q': '(m3/s)',
-                 'label_A': '(m2)',
-                 'label_V': '(m/s)',
-                 'ID': 'SI'}
+    if units_id == "SI":
+        units = {
+            "L": 1,
+            "Q": 1,
+            "A": 1,
+            "V": 1,
+            "label_L": "(m)",
+            "label_Q": "(m3/s)",
+            "label_A": "(m2)",
+            "label_V": "(m/s)",
+            "ID": "SI",
+        }
 
     else:
-        units = {'L': 1.0 / 0.3048,
-                 'Q': (1.0 / 0.3048)**3,
-                 'A': (1.0 / 0.3048)**2,
-                 'V': 1.0 / 0.3048,
-                 'label_L': '(ft)',
-                 'label_Q': '(ft3/s)',
-                 'label_A': '(ft2)',
-                 'label_V': '(ft/s)',
-                 'ID': 'English'}
+        units = {
+            "L": 1.0 / 0.3048,
+            "Q": (1.0 / 0.3048) ** 3,
+            "A": (1.0 / 0.3048) ** 2,
+            "V": 1.0 / 0.3048,
+            "label_L": "(ft)",
+            "label_Q": "(ft3/s)",
+            "label_A": "(ft2)",
+            "label_V": "(ft/s)",
+            "ID": "English",
+        }
 
     return units
 
@@ -367,17 +373,17 @@ def convert_temperature(temp_in, units_in, units_out) -> float:
     """
 
     temp_out = None
-    if units_in == 'F':
-        if units_out == 'C':
-            temp_out = (temp_in - 32) * (5./9.)
+    if units_in == "F":
+        if units_out == "C":
+            temp_out = (temp_in - 32) * (5.0 / 9.0)
         else:
             temp_out = temp_in
 
-    elif units_in == 'C':
-        if units_out == 'C':
+    elif units_in == "C":
+        if units_out == "C":
             temp_out = temp_in
         else:
-            temp_out = (temp_in * (9./5.)) + 32
+            temp_out = (temp_in * (9.0 / 5.0)) + 32
 
     return temp_out
 
@@ -399,7 +405,7 @@ def nan_less_equal(data1, data2) -> bool:
     """
 
     d3 = data2 - data1
-    d3[np.isnan(d3)] = -999.
+    d3[np.isnan(d3)] = -999.0
     return d3 >= 0
 
 
@@ -415,12 +421,12 @@ def nan_less(data1, data2) -> bool:
 
     Returns
     -------
-    :bool
+    :np.array(bool)
         Result of comparison.
     """
 
     d3 = data2 - data1
-    d3[np.isnan(d3)] = -999.
+    d3[np.isnan(d3)] = -999.0
     return d3 > 0
 
 
@@ -436,12 +442,12 @@ def nan_greater_equal(data1, data2) -> bool:
 
     Returns
     -------
-    :bool
+    :np.array(bool)
         Result of comparison.
     """
 
     d3 = data1 - data2
-    d3[np.isnan(d3)] = -999.
+    d3[np.isnan(d3)] = -999.0
     return d3 >= 0
 
 
@@ -462,5 +468,63 @@ def nan_greater(data1, data2) -> bool:
     """
 
     d3 = data1 - data2
-    d3[np.isnan(d3)] = -999.
+    d3[np.isnan(d3)] = -999.0
     return d3 > 0
+
+
+def ari2geodeg(ari_ang):
+
+    """Ported from matlab VMT.
+    ARI2GEODEG converts arithmetic angles to geographic angles.
+
+    Parameters
+    ==========
+    ari_ang: np.array
+        temperature in units_in
+
+    Returns
+    =======
+    geo_ang : np.array
+        angles converted to geographic headings
+    """
+
+    geo_ang = (360 - ari_ang + 90) % 360
+
+    return geo_ang
+
+
+def sfrnd(n, sig: int = 3):
+    # """Return scientific notation
+    #
+    #     Parameters
+    #     ----------
+    #     n: float or int
+    #         Value to convert in scientific notation
+    #     sig: int
+    #         Number of significant digits
+    #     """
+    # n_str = str(n)
+    # b = '%.'+str(sig-1)+'E'
+    # a = b % Decimal(n_str)
+    # [val, exp] = a.split('E')
+    # exp = int(exp)
+    # # if exp < 0:
+    # #     n_sn = a
+    # # elif exp == 0:
+    # #     if float(val) == 0:
+    # #         n_sn = '0.'+'0'*(sig-1)
+    # #     else:
+    # #         n_sn = val
+    # # else:
+    # n_sn_temp = np.round(float(val) * 10**exp, 3)
+    # if abs(n_sn_temp) > 10**(sig-1):
+    #     n_sn = str(n_sn_temp).split('.')[0]
+    # else:
+    #     n_sn = str(n_sn_temp)
+    return sigfig_round(n, sig)
+
+
+def rotate_coordinates(x, y, angle_d):
+    xr = x * cosd(angle_d) + y * sind(angle_d)
+    yr = -x * sind(angle_d) + y * cosd(angle_d)
+    return xr, yr
diff --git a/MiscLibs/compute_edge_cd.py b/MiscLibs/compute_edge_cd.py
new file mode 100644
index 0000000000000000000000000000000000000000..ac6863bebc5016220487a16ffc5d6a6b045fb81d
--- /dev/null
+++ b/MiscLibs/compute_edge_cd.py
@@ -0,0 +1,21 @@
+def compute_edge_cd(edge_data):
+    """Computes the edge shape coefficient used to determine the visual shape of
+    the edge if other than rectangular or triangular.
+
+    Parameters
+    ----------
+    edge_data: EdgeData
+        Object of EdgeData
+
+    Returns
+    -------
+    cd: float
+        Edge shape coefficient
+    """
+
+    if edge_data.type == "User Q":
+        cd = 0.5
+    else:
+        ca = (((edge_data.cust_coef - 0.3535) / (0.92 - 0.3535)) * (1 - 0.5)) + 0.5
+        cd = (ca - 0.5) * 2
+    return cd
\ No newline at end of file
diff --git a/qrevint_22_06_22/MiscLibs/non_uniform_savgol.py b/MiscLibs/non_uniform_savgol.py
similarity index 92%
rename from qrevint_22_06_22/MiscLibs/non_uniform_savgol.py
rename to MiscLibs/non_uniform_savgol.py
index 5f52b8abf357b284ee086c88b8e683a2769e24bf..c151ae2e239b59fc148298dd62e3cfaf505dabdd 100644
--- a/qrevint_22_06_22/MiscLibs/non_uniform_savgol.py
+++ b/MiscLibs/non_uniform_savgol.py
@@ -6,7 +6,8 @@ def non_uniform_savgol(x, y, window, polynom):
     Applies a Savitzky-Golay filter to y with non-uniform spacing
     as defined in x
 
-    This is based on https://dsp.stackexchange.com/questions/1676/savitzky-golay-smoothing-filter-for-not-equally-spaced-data
+    This is based on https://dsp.stackexchange.com/questions/1676
+    /savitzky-golay-smoothing-filter-for-not-equally-spaced-data
     The borders are interpolated like scipy.signal.savgol_filter would do
 
     Parameters
@@ -30,7 +31,7 @@ def non_uniform_savgol(x, y, window, polynom):
         raise ValueError('"x" and "y" must be of the same size')
 
     if len(x) < window:
-        raise ValueError('The data size must be larger than the window size')
+        raise ValueError("The data size must be larger than the window size")
 
     if type(window) is not int:
         raise TypeError('"window" must be an integer')
@@ -48,9 +49,9 @@ def non_uniform_savgol(x, y, window, polynom):
     polynom += 1
 
     # Initialize variables
-    A = np.empty((window, polynom))     # Matrix
-    tA = np.empty((polynom, window))    # Transposed matrix
-    t = np.empty(window)                # Local x variables
+    A = np.empty((window, polynom))  # Matrix
+    tA = np.empty((polynom, window))  # Transposed matrix
+    t = np.empty(window)  # Local x variables
     y_smoothed = np.full(len(y), np.nan)
 
     # Start smoothing
diff --git a/qrevint_22_06_22/MiscLibs/robust_loess.py b/MiscLibs/robust_loess.py
similarity index 80%
rename from qrevint_22_06_22/MiscLibs/robust_loess.py
rename to MiscLibs/robust_loess.py
index 805a8482802f19b2516f974929f6785ca70f14bf..d201c283608455292183b6bf305c09944e10ffb0 100644
--- a/qrevint_22_06_22/MiscLibs/robust_loess.py
+++ b/MiscLibs/robust_loess.py
@@ -15,7 +15,7 @@ import numpy as np
 from numba import jit, njit
 
 # Set constants used in multiple functions
-eps = np.finfo('float').eps
+eps = np.finfo("float").eps
 seps = np.sqrt(eps)
 
 # @jit(cache=True, nopython=True)
@@ -50,19 +50,22 @@ def nearest_neighbors(num_neighbors, idx, x, valid_x):
         distance_sorted = np.sort(distance[valid_x])
         distance_neighbors = distance_sorted[num_neighbors - 1]
 
-        # Find all points that are as close as or closer than the num_neighbors closest points
-        # close = np.array(distance <= distance_neighbors)
+        # Find all points that are as close as or closer than the num_neighbors
+        # closest points close = np.array(distance <= distance_neighbors)
         close = np.less_equal(distance, distance_neighbors)
 
         # Find the indices of x that are both close and valid
-        neighbors_idx = np.where(np.equal(np.logical_and(close, valid_x), np.repeat(True, len(valid_x))))[0]
+        neighbors_idx = np.where(
+            np.equal(np.logical_and(close, valid_x), np.repeat(True, len(valid_x)))
+        )[0]
 
     return neighbors_idx
 
+
 # @jit(cache=True, nopython=True)
 @njit
 def tricube_weights(distance):
-    """ Convert distances into weights using tri-cubic weight function.
+    """Convert distances into weights using tri-cubic weight function.
     Note for Matlab: This function returns the square-root of the weights.
 
     Parameters
@@ -79,13 +82,15 @@ def tricube_weights(distance):
     max_distance = np.max(distance)
     if max_distance > 0:
         distance = distance / max_distance
-    weights = (1 - distance ** 3) ** 1.5
+    weights = (1 - distance**3) ** 1.5
     return weights
 
+
 # @jit(cache=True, nopython=True)
 @njit
 def bisquare(data):
-    """Bisqure weight function which for values greater than are equal to 1 are set to zero.
+    """Bisqure weight function which for values greater than are equal
+    to 1 are set to zero.
 
     Parameters
     ----------
@@ -100,12 +105,13 @@ def bisquare(data):
     """
     weights = np.zeros(data.shape)
     d3 = 1 - np.abs(data)
-    d3[np.isnan(d3)] = -999.
+    d3[np.isnan(d3)] = -999.0
     idx = d3 > 0
     # idx = nan_less(np.abs(data), 1)
     weights[idx] = np.abs(1 - data[idx] ** 2)
     return weights
 
+
 # @jit(cache=True, nopython=True)
 @njit
 def robust_weights(residuals, max_eps):
@@ -133,10 +139,12 @@ def robust_weights(residuals, max_eps):
 
     return weights
 
+
 # @jit(cache=True, nopython=True)
 @njit
 def compute_loess(x, y, neighbors_idx, idx, r_weights=None):
-    """Computes the loess smooth for the specified point x[i]. If robust weights are specified the computed weights
+    """Computes the loess smooth for the specified point x[i].
+    If robust weights are specified the computed weights
     are adjusted by the robust weights.
 
     Parameters
@@ -174,23 +182,23 @@ def compute_loess(x, y, neighbors_idx, idx, r_weights=None):
             weights = weights * r_weights[neighbors_idx]
 
         weighted_x_matrix = np.vstack((np.ones(distances.shape), distances))
-        weighted_x_matrix = np.vstack((weighted_x_matrix, np.expand_dims(distances * distances, axis=0)))
-        weighted_x_matrix = weights.repeat(weighted_x_matrix.shape[0]).reshape(-1, 3).T * weighted_x_matrix
+        weighted_x_matrix = np.vstack(
+            (weighted_x_matrix, np.expand_dims(distances * distances, axis=0))
+        )
+        weighted_x_matrix = (
+            weights.repeat(weighted_x_matrix.shape[0]).reshape(-1, 3).T
+            * weighted_x_matrix
+        )
         neighbors_y = weights * neighbors_y
 
         # Solve using least squares
-        # try:
-        #     mask = ~np.isnan(weighted_x_matrix.T) & ~np.isnan(neighbors_y.T)
-        #     smoothed_values, _, _, _ = np.linalg.lstsq(weighted_x_matrix.T[mask],
-        #                                                neighbors_y.T[mask], rcond=None)
-        # except (IndexError, ValueError):
-        smoothed_values, _, _, _ = np.linalg.lstsq(weighted_x_matrix.T,
-                                                   neighbors_y.T)
+        smoothed_values, _, _, _ = np.linalg.lstsq(weighted_x_matrix.T, neighbors_y.T)
         smoothed_value = smoothed_values[0]
     else:
         smoothed_value = np.nan
     return smoothed_value
 
+
 # @jit(cache=True, nopython=True)
 @njit
 def rloess(x, y, span):
@@ -236,9 +244,9 @@ def rloess(x, y, span):
             # if x[i] and x[i-1] are equal just use previous fit
             if the_diffs[n] == 0:
 
-                smoothed_values[n] = smoothed_values[n-1]
-                lower_bound[n] = int(lower_bound[n-1])
-                upper_bound[n] = int(upper_bound[n-1])
+                smoothed_values[n] = smoothed_values[n - 1]
+                lower_bound[n] = int(lower_bound[n - 1])
+                upper_bound[n] = int(upper_bound[n - 1])
 
             else:
 
@@ -264,17 +272,25 @@ def rloess(x, y, span):
 
             # Find new value for each point
             for n in range(n_points):
-                if n > 0 and x[n] == x[n-1]:
-                    smoothed_values[n] = smoothed_values[n-1]
+                if n > 0 and x[n] == x[n - 1]:
+                    smoothed_values[n] = smoothed_values[n - 1]
                 else:
                     if not np.isnan(smoothed_values[n]):
-                        neighbors_idx = np.array(list(range(lower_bound[n], upper_bound[n] + 1)))
+                        neighbors_idx = np.array(
+                            list(range(lower_bound[n], upper_bound[n] + 1))
+                        )
 
                         if any_nans:
-                            neighbors_idx = neighbors_idx[np.logical_not(y_nan[neighbors_idx])]
+                            neighbors_idx = neighbors_idx[
+                                np.logical_not(y_nan[neighbors_idx])
+                            ]
 
                         if np.any(r_weights[neighbors_idx] <= 0):
-                            neighbors_idx = nearest_neighbors(span, n, x, (r_weights > 0))
+                            neighbors_idx = nearest_neighbors(
+                                span, n, x, (r_weights > 0)
+                            )
 
-                        smoothed_values[n] = compute_loess(x, y, neighbors_idx, n, r_weights)
+                        smoothed_values[n] = compute_loess(
+                            x, y, neighbors_idx, n, r_weights
+                        )
     return smoothed_values
diff --git a/MiscLibs/robust_loess_compiled.cp36-win_amd64.pyd b/MiscLibs/robust_loess_compiled.cp36-win_amd64.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..d02527ef0d7c9bc7d4547fa9149f7259519af64f
Binary files /dev/null and b/MiscLibs/robust_loess_compiled.cp36-win_amd64.pyd differ
diff --git a/qrevint_22_06_22/MiscLibs/robust_loess_compiled.py b/MiscLibs/robust_loess_compiled.py
similarity index 78%
rename from qrevint_22_06_22/MiscLibs/robust_loess_compiled.py
rename to MiscLibs/robust_loess_compiled.py
index 55e24056c5e9f5331c357599cf8a5ab4d1ff102e..91a01fc4f420d54fbded9f8c3cb6f9fb81f2ac49 100644
--- a/qrevint_22_06_22/MiscLibs/robust_loess_compiled.py
+++ b/MiscLibs/robust_loess_compiled.py
@@ -15,14 +15,15 @@ import numpy as np
 from numba.pycc import CC
 from numba import njit
 
-cc = CC('robust_loess_compiled')
+cc = CC("robust_loess_compiled")
 
 # Set constants
-eps = np.finfo('float').eps
+eps = np.finfo("float").eps
 seps = np.sqrt(eps)
 
+
 @njit
-@cc.export('nearest_neighbors', 'i8[:](i4, i4, f8[:], b1[:])')
+@cc.export("nearest_neighbors", "i8[:](i4, i4, f8[:], b1[:])")
 def nearest_neighbors(num_neighbors, idx, x, valid_x):
     """Find the nearest k neighbors to x[i] that are not nan.
 
@@ -53,18 +54,22 @@ def nearest_neighbors(num_neighbors, idx, x, valid_x):
         distance_sorted = np.sort(distance[valid_x])
         distance_neighbors = distance_sorted[num_neighbors - 1]
 
-        # Find all points that are as close as or closer than the num_neighbors closest points
+        # Find all points that are as close as or closer than the num_neighbors
+        # closest points
         close = np.less_equal(distance, distance_neighbors)
 
         # Find the indices of x that are both close and valid
-        neighbors_idx = np.where(np.equal(np.logical_and(close, valid_x), np.repeat(True, len(valid_x))))[0]
+        neighbors_idx = np.where(
+            np.equal(np.logical_and(close, valid_x), np.repeat(True, len(valid_x)))
+        )[0]
 
     return neighbors_idx
 
+
 @njit
-@cc.export('tricube_weights', 'f8[:](f8[:])')
+@cc.export("tricube_weights", "f8[:](f8[:])")
 def tricube_weights(distance):
-    """ Convert distances into weights using tri-cubic weight function.
+    """Convert distances into weights using tri-cubic weight function.
     Note for Matlab: This function returns the square-root of the weights.
 
     Parameters
@@ -81,13 +86,15 @@ def tricube_weights(distance):
     max_distance = np.max(distance)
     if max_distance > 0:
         distance = distance / max_distance
-    weights = (1 - distance ** 3) ** 1.5
+    weights = (1 - distance**3) ** 1.5
     return weights
 
+
 @njit
-@cc.export('bisquare', 'f8[:](f8[:])')
+@cc.export("bisquare", "f8[:](f8[:])")
 def bisquare(data):
-    """Bisqure weight function which for values greater than are equal to 1 are set to zero.
+    """Bisqure weight function which for values greater than are equal
+    to 1 are set to zero.
 
     Parameters
     ----------
@@ -104,14 +111,15 @@ def bisquare(data):
 
     # Code to compute less than with nan's and no runtime warnings
     d3 = 1 - np.abs(data)
-    d3[np.isnan(d3)] = -999.
+    d3[np.isnan(d3)] = -999.0
     idx = d3 > 0
 
     weights[idx] = np.abs(1 - data[idx] ** 2)
     return weights
 
+
 @njit
-@cc.export('robust_weights', 'f8[:](f8[:], f8)')
+@cc.export("robust_weights", "f8[:](f8[:], f8)")
 def robust_weights(residuals, max_eps):
     """Compute robust weights using residuals.
 
@@ -137,8 +145,9 @@ def robust_weights(residuals, max_eps):
 
     return weights
 
+
 @njit
-@cc.export('compute_loess', 'f8(f8[:], f8[:], i8[:], i4, optional(f8[:]))')
+@cc.export("compute_loess", "f8(f8[:], f8[:], i8[:], i4, optional(f8[:]))")
 def compute_loess(x, y, neighbors_idx, idx, r_weights=None):
     """Computes the loess smooth for the specified point x[i]. If robust weights are specified the computed weights
     are adjusted by the robust weights.
@@ -178,24 +187,24 @@ def compute_loess(x, y, neighbors_idx, idx, r_weights=None):
             weights = weights * r_weights[neighbors_idx]
 
         weighted_x_matrix = np.vstack((np.ones(distances.shape), distances))
-        weighted_x_matrix = np.vstack((weighted_x_matrix, np.expand_dims(distances * distances, axis=0)))
-        weighted_x_matrix = weights.repeat(weighted_x_matrix.shape[0]).reshape(-1, 3).T * weighted_x_matrix
+        weighted_x_matrix = np.vstack(
+            (weighted_x_matrix, np.expand_dims(distances * distances, axis=0))
+        )
+        weighted_x_matrix = (
+            weights.repeat(weighted_x_matrix.shape[0]).reshape(-1, 3).T
+            * weighted_x_matrix
+        )
         neighbors_y = weights * neighbors_y
 
         # Solve using least squares
-        # try:
-        #     mask = ~np.isnan(weighted_x_matrix.T) & ~np.isnan(neighbors_y.T)
-        #     smoothed_values, _, _, _ = np.linalg.lstsq(weighted_x_matrix.T[mask],
-        #                                                neighbors_y.T[mask], rcond=None)
-        # except (IndexError, ValueError):
-        smoothed_values, _, _, _ = np.linalg.lstsq(weighted_x_matrix.T,
-                                                   neighbors_y.T)
+        smoothed_values, _, _, _ = np.linalg.lstsq(weighted_x_matrix.T, neighbors_y.T)
         smoothed_value = smoothed_values[0]
     else:
         smoothed_value = np.nan
     return smoothed_value
 
-@cc.export('rloess', 'f8[:](f8[::1], f8[::1], i4)')
+
+@cc.export("rloess", "f8[:](f8[::1], f8[::1], i4)")
 def rloess(x, y, span):
     """This function computes a robust loess smooth using a quadratic model as defined by
     W.S.Cleveland, (1979) "Robust Locally Weighted Regression and Smoothing Scatterplots",
@@ -237,9 +246,9 @@ def rloess(x, y, span):
             # if x[i] and x[i-1] are equal just use previous fit
             if the_diffs[n] == 0:
 
-                smoothed_values[n] = smoothed_values[n-1]
-                lower_bound[n] = int(lower_bound[n-1])
-                upper_bound[n] = int(upper_bound[n-1])
+                smoothed_values[n] = smoothed_values[n - 1]
+                lower_bound[n] = int(lower_bound[n - 1])
+                upper_bound[n] = int(upper_bound[n - 1])
 
             else:
 
@@ -265,20 +274,29 @@ def rloess(x, y, span):
 
             # Find new value for each point
             for n in range(n_points):
-                if n > 0 and x[n] == x[n-1]:
-                    smoothed_values[n] = smoothed_values[n-1]
+                if n > 0 and x[n] == x[n - 1]:
+                    smoothed_values[n] = smoothed_values[n - 1]
                 else:
                     if not np.isnan(smoothed_values[n]):
-                        neighbors_idx = np.array(list(range(lower_bound[n], upper_bound[n] + 1)))
+                        neighbors_idx = np.array(
+                            list(range(lower_bound[n], upper_bound[n] + 1))
+                        )
 
                         if any_nans:
-                            neighbors_idx = neighbors_idx[np.logical_not(y_nan[neighbors_idx])]
+                            neighbors_idx = neighbors_idx[
+                                np.logical_not(y_nan[neighbors_idx])
+                            ]
 
                         if np.any(r_weights[neighbors_idx] <= 0):
-                            neighbors_idx = nearest_neighbors(span, n, x, (r_weights > 0))
+                            neighbors_idx = nearest_neighbors(
+                                span, n, x, (r_weights > 0)
+                            )
 
-                        smoothed_values[n] = compute_loess(x, y, neighbors_idx, n, r_weights)
+                        smoothed_values[n] = compute_loess(
+                            x, y, neighbors_idx, n, r_weights
+                        )
     return smoothed_values
 
-if __name__ == '__main__':
-    cc.compile()
\ No newline at end of file
+
+if __name__ == "__main__":
+    cc.compile()
diff --git a/MiscLibs/run_iqr.cp36-win_amd64.pyd b/MiscLibs/run_iqr.cp36-win_amd64.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..52f3c4c2211354c13457dd8f0e23dae6448a2dbd
Binary files /dev/null and b/MiscLibs/run_iqr.cp36-win_amd64.pyd differ
diff --git a/qrevint_22_06_22/MiscLibs/run_iqr.py b/MiscLibs/run_iqr.py
similarity index 79%
rename from qrevint_22_06_22/MiscLibs/run_iqr.py
rename to MiscLibs/run_iqr.py
index 541d9a8005c62a7b51ff2073a998587fbfc66bf3..d84ed28a6edfbcb36ac583b568d219b03eed4f43 100644
--- a/qrevint_22_06_22/MiscLibs/run_iqr.py
+++ b/MiscLibs/run_iqr.py
@@ -2,9 +2,10 @@ import numpy as np
 from numba.pycc import CC
 from numba import njit
 
-cc = CC('run_iqr')
+cc = CC("run_iqr")
 
-@cc.export('run_iqr', 'f8[:](i4, f8[::1])')
+
+@cc.export("run_iqr", "f8[:](i4, f8[::1])")
 def run_iqr(half_width, data):
     """Computes a running Innerquartile Range
     The routine accepts a column vector as input.  "halfWidth" number of data
@@ -18,7 +19,8 @@ def run_iqr(half_width, data):
     Parameters
     ----------
     half_width: int
-        Number of ensembles before and after current ensemble which are used to compute the IQR
+        Number of ensembles before and after current ensemble which are used
+        to compute the IQR
     data: np.array(float)
         Data for which the IQR is computed
     """
@@ -35,26 +37,29 @@ def run_iqr(half_width, data):
 
         # Sample selection for 1st point
         if n == 0:
-            sample = data[1:1 + half_width]
+            sample = data[1 : 1 + half_width]
 
         # Sample selection a end of data set
         elif n + half_width > npts:
-            sample = np.hstack((data[n - half_width - 1:n - 1], data[n:npts]))
+            sample = np.hstack((data[n - half_width - 1 : n - 1], data[n:npts]))
 
         # Sample selection at beginning of data set
         elif half_width >= n + 1:
-            sample = np.hstack((data[0:n], data[n + 1:n + half_width + 1]))
+            sample = np.hstack((data[0:n], data[n + 1 : n + half_width + 1]))
 
         # Sample selection in body of data set
         else:
-            sample = np.hstack((data[n - half_width:n], data[n + 1:n + half_width + 1]))
+            sample = np.hstack(
+                (data[n - half_width : n], data[n + 1 : n + half_width + 1])
+            )
 
         iqr_array.append(iqr(sample))
 
     return np.array(iqr_array)
 
+
 @njit
-@cc.export('iqr', 'f8(f8[::1])')
+@cc.export("iqr", "f8(f8[::1])")
 def iqr(data_1d):
     """This function computes the iqr consistent with Matlab
 
@@ -83,8 +88,9 @@ def iqr(data_1d):
 
     return sp_iqr
 
+
 @njit
-@cc.export('compute_quantile', 'f8(f8[::1], f8)')
+@cc.export("compute_quantile", "f8(f8[::1], f8)")
 def compute_quantile(data_1d, q):
 
     sorted_data = np.sort(data_1d)
@@ -93,10 +99,13 @@ def compute_quantile(data_1d, q):
     x1 = int(np.floor(sample_idx))
     x2 = int(np.ceil(sample_idx))
     if x1 != x2:
-        result = (sample_idx - x1) * (sorted_data[x2] - sorted_data[x1]) + sorted_data[x1]
+        result = (sample_idx - x1) * (sorted_data[x2] - sorted_data[x1]) + sorted_data[
+            x1
+        ]
     else:
         result = sorted_data[x1]
     return result
 
-if __name__ == '__main__':
-    cc.compile()
\ No newline at end of file
+
+if __name__ == "__main__":
+    cc.compile()
diff --git a/UI/24x24/3d bar chart.png b/UI/24x24/3d bar chart.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e6b516536711f8445ed5c12142da4a8ddce96ac
Binary files /dev/null and b/UI/24x24/3d bar chart.png differ
diff --git a/UI/24x24/Abort.png b/UI/24x24/Abort.png
new file mode 100644
index 0000000000000000000000000000000000000000..90c0dd278e72778be8b6f70eb03a1a21ce89ce25
Binary files /dev/null and b/UI/24x24/Abort.png differ
diff --git a/UI/24x24/About.png b/UI/24x24/About.png
new file mode 100644
index 0000000000000000000000000000000000000000..fabc1fcb13579e87fe45a786ca9256167f3d03cd
Binary files /dev/null and b/UI/24x24/About.png differ
diff --git a/UI/24x24/Accounting.png b/UI/24x24/Accounting.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7add864807ee8d2350afd4335d82d51c7f2d352
Binary files /dev/null and b/UI/24x24/Accounting.png differ
diff --git a/UI/24x24/Add.png b/UI/24x24/Add.png
new file mode 100644
index 0000000000000000000000000000000000000000..654a9b8d2ebe5a3774532b965e0a28ef43650563
Binary files /dev/null and b/UI/24x24/Add.png differ
diff --git a/UI/24x24/Address book.png b/UI/24x24/Address book.png
new file mode 100644
index 0000000000000000000000000000000000000000..fbd182f61d0b84c3004f75909ee7bf39ba401d2c
Binary files /dev/null and b/UI/24x24/Address book.png differ
diff --git a/UI/24x24/Alarm clock.png b/UI/24x24/Alarm clock.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5287e6c066184f83d48c5a23d5308df00c84f9a
Binary files /dev/null and b/UI/24x24/Alarm clock.png differ
diff --git a/UI/24x24/Alarm.png b/UI/24x24/Alarm.png
new file mode 100644
index 0000000000000000000000000000000000000000..42c8befd7735021f53b0852352c0420d73ec0c21
Binary files /dev/null and b/UI/24x24/Alarm.png differ
diff --git a/UI/24x24/Alert.png b/UI/24x24/Alert.png
new file mode 100644
index 0000000000000000000000000000000000000000..65b2f0360a712776d76d2702e76b97c14d284b17
Binary files /dev/null and b/UI/24x24/Alert.png differ
diff --git a/UI/24x24/Alien.png b/UI/24x24/Alien.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a9836842c73941020b3453786ce748adae41e00
Binary files /dev/null and b/UI/24x24/Alien.png differ
diff --git a/UI/24x24/Anchor.png b/UI/24x24/Anchor.png
new file mode 100644
index 0000000000000000000000000000000000000000..c20f8a7b5ecdeae4a3ec658dc3a01cefd6759a43
Binary files /dev/null and b/UI/24x24/Anchor.png differ
diff --git a/UI/24x24/Application.png b/UI/24x24/Application.png
new file mode 100644
index 0000000000000000000000000000000000000000..851b687afd03487b6cdc8bea685560f7455b530a
Binary files /dev/null and b/UI/24x24/Application.png differ
diff --git a/UI/24x24/Apply.png b/UI/24x24/Apply.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff71e24df1add08545fec537f7551c199dc2b812
Binary files /dev/null and b/UI/24x24/Apply.png differ
diff --git a/UI/24x24/Back.png b/UI/24x24/Back.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb4151166146ececc79989ad6ad193eeef49afd7
Binary files /dev/null and b/UI/24x24/Back.png differ
diff --git a/UI/24x24/Bad mark.png b/UI/24x24/Bad mark.png
new file mode 100644
index 0000000000000000000000000000000000000000..55c74fd9643f3f4020014faf38d59c628b574289
Binary files /dev/null and b/UI/24x24/Bad mark.png differ
diff --git a/UI/24x24/Bee.png b/UI/24x24/Bee.png
new file mode 100644
index 0000000000000000000000000000000000000000..d12569530c682f1f44f41c2574241a604fc6a18f
Binary files /dev/null and b/UI/24x24/Bee.png differ
diff --git a/UI/24x24/Black bookmark.png b/UI/24x24/Black bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d9f6fcfbd956f60972bd20b7c5a9a505a5604d9
Binary files /dev/null and b/UI/24x24/Black bookmark.png differ
diff --git a/UI/24x24/Black pin.png b/UI/24x24/Black pin.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5e1d94bfc61292a0753bbad06378e0333430eff
Binary files /dev/null and b/UI/24x24/Black pin.png differ
diff --git a/UI/24x24/Black tag.png b/UI/24x24/Black tag.png
new file mode 100644
index 0000000000000000000000000000000000000000..265fba627347efda9782f8f76ba8974902b0cdd3
Binary files /dev/null and b/UI/24x24/Black tag.png differ
diff --git a/UI/24x24/Blog.png b/UI/24x24/Blog.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d94bd18529ed27680fc821dd8e842c478a0792d
Binary files /dev/null and b/UI/24x24/Blog.png differ
diff --git a/UI/24x24/Blue bookmark.png b/UI/24x24/Blue bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..78e852dccc34b8aa450fef0fbc7b2b026d56d6ed
Binary files /dev/null and b/UI/24x24/Blue bookmark.png differ
diff --git a/UI/24x24/Blue key.png b/UI/24x24/Blue key.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2dd2ed2d8e93665ac3f6c12805ae56d62267382
Binary files /dev/null and b/UI/24x24/Blue key.png differ
diff --git a/UI/24x24/Blue pin.png b/UI/24x24/Blue pin.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4e49b119732de9c1a58df4e678644311560b101
Binary files /dev/null and b/UI/24x24/Blue pin.png differ
diff --git a/UI/24x24/Blue tag.png b/UI/24x24/Blue tag.png
new file mode 100644
index 0000000000000000000000000000000000000000..366f10ba0b3736e98d480553dc8584af16fa6c2b
Binary files /dev/null and b/UI/24x24/Blue tag.png differ
diff --git a/UI/24x24/Bomb.png b/UI/24x24/Bomb.png
new file mode 100644
index 0000000000000000000000000000000000000000..b861437fd81fccbfa45b7985d6a7451281da6fd9
Binary files /dev/null and b/UI/24x24/Bomb.png differ
diff --git a/UI/24x24/Bookmark.png b/UI/24x24/Bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..e493a4bc0fea913d328d0aa50be57d0df63c0fe9
Binary files /dev/null and b/UI/24x24/Bookmark.png differ
diff --git a/UI/24x24/Boss.png b/UI/24x24/Boss.png
new file mode 100644
index 0000000000000000000000000000000000000000..6be3e99da2b70929a9be913645ae1b73781c0eae
Binary files /dev/null and b/UI/24x24/Boss.png differ
diff --git a/UI/24x24/Bottom.png b/UI/24x24/Bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a0d119b96f610ef1249b8240d754b42a893b450
Binary files /dev/null and b/UI/24x24/Bottom.png differ
diff --git a/UI/24x24/Briefcase.png b/UI/24x24/Briefcase.png
new file mode 100644
index 0000000000000000000000000000000000000000..588524896138182b6199d3896518a0c6f7807ad6
Binary files /dev/null and b/UI/24x24/Briefcase.png differ
diff --git a/UI/24x24/Brush.png b/UI/24x24/Brush.png
new file mode 100644
index 0000000000000000000000000000000000000000..6980bf999c06c6d671559df0eb7cf7a4d86bc842
Binary files /dev/null and b/UI/24x24/Brush.png differ
diff --git a/UI/24x24/Bubble.png b/UI/24x24/Bubble.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe0468c806ebe3838cba911726077781d1f5edeb
Binary files /dev/null and b/UI/24x24/Bubble.png differ
diff --git a/UI/24x24/Buy.png b/UI/24x24/Buy.png
new file mode 100644
index 0000000000000000000000000000000000000000..88b3cda77798cf16551c29eef906f0b7dd20989e
Binary files /dev/null and b/UI/24x24/Buy.png differ
diff --git a/UI/24x24/CD.png b/UI/24x24/CD.png
new file mode 100644
index 0000000000000000000000000000000000000000..2baea4deb7b3d06081d457849fba89ddb57b5e24
Binary files /dev/null and b/UI/24x24/CD.png differ
diff --git a/UI/24x24/Calculator.png b/UI/24x24/Calculator.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8e9631b6d179e3ea1be99e0b11e48c059d84a8e
Binary files /dev/null and b/UI/24x24/Calculator.png differ
diff --git a/UI/24x24/Calendar.png b/UI/24x24/Calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..67ae02910caf28af97a4d162037c48a51f329b3f
Binary files /dev/null and b/UI/24x24/Calendar.png differ
diff --git a/UI/24x24/Car key.png b/UI/24x24/Car key.png
new file mode 100644
index 0000000000000000000000000000000000000000..da7f9d7483731418f615fb806ad8623eeaa5d417
Binary files /dev/null and b/UI/24x24/Car key.png differ
diff --git a/UI/24x24/Clipboard.png b/UI/24x24/Clipboard.png
new file mode 100644
index 0000000000000000000000000000000000000000..94938aece520d6684d8bb5500da8f4ddc7013c5e
Binary files /dev/null and b/UI/24x24/Clipboard.png differ
diff --git a/UI/24x24/Clock.png b/UI/24x24/Clock.png
new file mode 100644
index 0000000000000000000000000000000000000000..b555b18491d5eea15be28e3c01a6c4baeafad1c6
Binary files /dev/null and b/UI/24x24/Clock.png differ
diff --git a/UI/24x24/Close.png b/UI/24x24/Close.png
new file mode 100644
index 0000000000000000000000000000000000000000..939a102c9461f4bfad75e01606ab0cab4f36bc3f
Binary files /dev/null and b/UI/24x24/Close.png differ
diff --git a/UI/24x24/Coin.png b/UI/24x24/Coin.png
new file mode 100644
index 0000000000000000000000000000000000000000..4208e9645e67449b448f4a119956a2edd727e230
Binary files /dev/null and b/UI/24x24/Coin.png differ
diff --git a/UI/24x24/Comment.png b/UI/24x24/Comment.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad270b77614c16426b2e739d71d070a082a4b86f
Binary files /dev/null and b/UI/24x24/Comment.png differ
diff --git a/UI/24x24/Company.png b/UI/24x24/Company.png
new file mode 100644
index 0000000000000000000000000000000000000000..a90378032309fc9af8fc9c9c55a6dc7948fe4bb2
Binary files /dev/null and b/UI/24x24/Company.png differ
diff --git a/UI/24x24/Compass.png b/UI/24x24/Compass.png
new file mode 100644
index 0000000000000000000000000000000000000000..5518619c3968f1dc6e6f0c6527daf98c3b8b7b39
Binary files /dev/null and b/UI/24x24/Compass.png differ
diff --git a/UI/24x24/Component.png b/UI/24x24/Component.png
new file mode 100644
index 0000000000000000000000000000000000000000..a499ffe13e49a174a03f6b4163defcd1a0ecde01
Binary files /dev/null and b/UI/24x24/Component.png differ
diff --git a/UI/24x24/Computer.png b/UI/24x24/Computer.png
new file mode 100644
index 0000000000000000000000000000000000000000..61926e11bc358df035b0d30b154a9ba31f29b128
Binary files /dev/null and b/UI/24x24/Computer.png differ
diff --git a/UI/24x24/Copy.png b/UI/24x24/Copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ce11583bdeed9803c7deb5279b5fbd0e541a2cc
Binary files /dev/null and b/UI/24x24/Copy.png differ
diff --git a/UI/24x24/Create.png b/UI/24x24/Create.png
new file mode 100644
index 0000000000000000000000000000000000000000..cfd608fa37426250d8bd62694c40d7657ce83bdf
Binary files /dev/null and b/UI/24x24/Create.png differ
diff --git a/UI/24x24/Cut.png b/UI/24x24/Cut.png
new file mode 100644
index 0000000000000000000000000000000000000000..23e1387de6c29489deafec2f0a7ab970224ce02f
Binary files /dev/null and b/UI/24x24/Cut.png differ
diff --git a/UI/24x24/Danger.png b/UI/24x24/Danger.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c1f570972c559045c2a42753561558547a976c6
Binary files /dev/null and b/UI/24x24/Danger.png differ
diff --git a/UI/24x24/Database.png b/UI/24x24/Database.png
new file mode 100644
index 0000000000000000000000000000000000000000..290c64f305bfc3415cd4a3a5f926a69690893b87
Binary files /dev/null and b/UI/24x24/Database.png differ
diff --git a/UI/24x24/Delete.png b/UI/24x24/Delete.png
new file mode 100644
index 0000000000000000000000000000000000000000..80f3770dbe95c8f7648d97ed94fa449feb3c9dab
Binary files /dev/null and b/UI/24x24/Delete.png differ
diff --git a/UI/24x24/Delivery.png b/UI/24x24/Delivery.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a83d065502db3130c95174ef7fe63007fa29252
Binary files /dev/null and b/UI/24x24/Delivery.png differ
diff --git a/UI/24x24/Diagram.png b/UI/24x24/Diagram.png
new file mode 100644
index 0000000000000000000000000000000000000000..f94bab8323486920f16dec1543074a14f14e1be5
Binary files /dev/null and b/UI/24x24/Diagram.png differ
diff --git a/UI/24x24/Dial.png b/UI/24x24/Dial.png
new file mode 100644
index 0000000000000000000000000000000000000000..f618bdaa86ef7d0ea6bd679be9f3c506fe0bcac8
Binary files /dev/null and b/UI/24x24/Dial.png differ
diff --git a/UI/24x24/Disaster.png b/UI/24x24/Disaster.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ab4e3556281cf5a6b7f566f603d576eb3254f47
Binary files /dev/null and b/UI/24x24/Disaster.png differ
diff --git a/UI/24x24/Display.png b/UI/24x24/Display.png
new file mode 100644
index 0000000000000000000000000000000000000000..11fce4a4fa0d40e99d5dfac2d97327ba40a486b8
Binary files /dev/null and b/UI/24x24/Display.png differ
diff --git a/UI/24x24/Dollar.png b/UI/24x24/Dollar.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7b443b90e674176f983566db26c8d0145f10c6c
Binary files /dev/null and b/UI/24x24/Dollar.png differ
diff --git a/UI/24x24/Door.png b/UI/24x24/Door.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d6e29933cd2aee90778b35db843efaf01276f28
Binary files /dev/null and b/UI/24x24/Door.png differ
diff --git a/UI/24x24/Down.png b/UI/24x24/Down.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7446a043f01fd1ae993449355622dcf5e8de025
Binary files /dev/null and b/UI/24x24/Down.png differ
diff --git a/UI/24x24/Download.png b/UI/24x24/Download.png
new file mode 100644
index 0000000000000000000000000000000000000000..058e51b0916d66e132bcf985dedd75247ac44d51
Binary files /dev/null and b/UI/24x24/Download.png differ
diff --git a/UI/24x24/Downloads folder.png b/UI/24x24/Downloads folder.png
new file mode 100644
index 0000000000000000000000000000000000000000..2602b6aa3b2f4d34ceeb5cb7a6e9c17972e9ca4a
Binary files /dev/null and b/UI/24x24/Downloads folder.png differ
diff --git a/UI/24x24/E-mail.png b/UI/24x24/E-mail.png
new file mode 100644
index 0000000000000000000000000000000000000000..325e56d1bf7ba883088e7007e9214f8f3b3285ef
Binary files /dev/null and b/UI/24x24/E-mail.png differ
diff --git a/UI/24x24/Earth.png b/UI/24x24/Earth.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3a96b32d7afb393538c73ed565828c8d34285b0
Binary files /dev/null and b/UI/24x24/Earth.png differ
diff --git a/UI/24x24/Eject.png b/UI/24x24/Eject.png
new file mode 100644
index 0000000000000000000000000000000000000000..e04a86b37f373b57411aab9a1caa2c55d101d84d
Binary files /dev/null and b/UI/24x24/Eject.png differ
diff --git a/UI/24x24/Equipment.png b/UI/24x24/Equipment.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb7b3ab65023a97fd6170e127691741c556b8ce8
Binary files /dev/null and b/UI/24x24/Equipment.png differ
diff --git a/UI/24x24/Erase.png b/UI/24x24/Erase.png
new file mode 100644
index 0000000000000000000000000000000000000000..34089f85d495b4759376330ff2b519eea8bf153e
Binary files /dev/null and b/UI/24x24/Erase.png differ
diff --git a/UI/24x24/Error.png b/UI/24x24/Error.png
new file mode 100644
index 0000000000000000000000000000000000000000..0cf424ecba8b3f89d01dad5eb42d0003b12585af
Binary files /dev/null and b/UI/24x24/Error.png differ
diff --git a/UI/24x24/Euro.png b/UI/24x24/Euro.png
new file mode 100644
index 0000000000000000000000000000000000000000..c7c664314d7231ed084d36bc2afe42f9f3ebd146
Binary files /dev/null and b/UI/24x24/Euro.png differ
diff --git a/UI/24x24/Exit.png b/UI/24x24/Exit.png
new file mode 100644
index 0000000000000000000000000000000000000000..02ab8454b2c8fe6f321e14b40195003ea0d6580a
Binary files /dev/null and b/UI/24x24/Exit.png differ
diff --git a/UI/24x24/Expand.png b/UI/24x24/Expand.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb7f22d860caa24f875544b7e411349ad31500b1
Binary files /dev/null and b/UI/24x24/Expand.png differ
diff --git a/UI/24x24/Eye.png b/UI/24x24/Eye.png
new file mode 100644
index 0000000000000000000000000000000000000000..facaf573ebded64a27a70a955a1dc44c9f459862
Binary files /dev/null and b/UI/24x24/Eye.png differ
diff --git a/UI/24x24/Fall.png b/UI/24x24/Fall.png
new file mode 100644
index 0000000000000000000000000000000000000000..c136f3da03551a5ac8b17404ec1cf096960e721c
Binary files /dev/null and b/UI/24x24/Fall.png differ
diff --git a/UI/24x24/Fast-forward.png b/UI/24x24/Fast-forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..770959c2ef6df91ccd802c586dbd37f2507c1baf
Binary files /dev/null and b/UI/24x24/Fast-forward.png differ
diff --git a/UI/24x24/Favourites.png b/UI/24x24/Favourites.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb1b91be32fcdc14c7c024fc441eca55007580e0
Binary files /dev/null and b/UI/24x24/Favourites.png differ
diff --git a/UI/24x24/Female symbol.png b/UI/24x24/Female symbol.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb086da36b580c3da05d13f6d7d7db64701c7217
Binary files /dev/null and b/UI/24x24/Female symbol.png differ
diff --git a/UI/24x24/Female.png b/UI/24x24/Female.png
new file mode 100644
index 0000000000000000000000000000000000000000..c359fc3cb1d48587b5baac3f822a53b60cf4b020
Binary files /dev/null and b/UI/24x24/Female.png differ
diff --git a/UI/24x24/Film.png b/UI/24x24/Film.png
new file mode 100644
index 0000000000000000000000000000000000000000..06479865960d0517cc902b0e8da0664933970743
Binary files /dev/null and b/UI/24x24/Film.png differ
diff --git a/UI/24x24/Filter.png b/UI/24x24/Filter.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c21c52e1588a32c5607a9eeff724f126fc7cd7a
Binary files /dev/null and b/UI/24x24/Filter.png differ
diff --git a/UI/24x24/Find.png b/UI/24x24/Find.png
new file mode 100644
index 0000000000000000000000000000000000000000..009010842df35d776e4fc4e6c689ebea1ebd4183
Binary files /dev/null and b/UI/24x24/Find.png differ
diff --git a/UI/24x24/First record.png b/UI/24x24/First record.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab6f53bb613be58ed6a8629559fe20e3d19b9a49
Binary files /dev/null and b/UI/24x24/First record.png differ
diff --git a/UI/24x24/First.png b/UI/24x24/First.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d9c1465e184a6515fe93323f35ec5a1667a4977
Binary files /dev/null and b/UI/24x24/First.png differ
diff --git a/UI/24x24/Flag.png b/UI/24x24/Flag.png
new file mode 100644
index 0000000000000000000000000000000000000000..f06a67642dd50858c051dd16d260833d3f6705c0
Binary files /dev/null and b/UI/24x24/Flag.png differ
diff --git a/UI/24x24/Flash drive.png b/UI/24x24/Flash drive.png
new file mode 100644
index 0000000000000000000000000000000000000000..07ef58018b6f6939851280f0517107157726db05
Binary files /dev/null and b/UI/24x24/Flash drive.png differ
diff --git a/UI/24x24/Folder.png b/UI/24x24/Folder.png
new file mode 100644
index 0000000000000000000000000000000000000000..87b3bdbf06377fffe1214da63eb56f3f74dfcb16
Binary files /dev/null and b/UI/24x24/Folder.png differ
diff --git a/UI/24x24/Forbidden.png b/UI/24x24/Forbidden.png
new file mode 100644
index 0000000000000000000000000000000000000000..9380fe757414b6551ce18257f6692c921a8cbdf2
Binary files /dev/null and b/UI/24x24/Forbidden.png differ
diff --git a/UI/24x24/Forward.png b/UI/24x24/Forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..aee3c01af673eea5cc2ca0ee426d75070fcb021d
Binary files /dev/null and b/UI/24x24/Forward.png differ
diff --git a/UI/24x24/Free bsd.png b/UI/24x24/Free bsd.png
new file mode 100644
index 0000000000000000000000000000000000000000..71bb70a14f2a111b997c98dd863e9b9991ab9c5d
Binary files /dev/null and b/UI/24x24/Free bsd.png differ
diff --git a/UI/24x24/Gift.png b/UI/24x24/Gift.png
new file mode 100644
index 0000000000000000000000000000000000000000..874f135f3501ba5abcd6a0e670d7e7cd6a583143
Binary files /dev/null and b/UI/24x24/Gift.png differ
diff --git a/UI/24x24/Globe.png b/UI/24x24/Globe.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e4d11fbb83e4b60895e4c56ed941cd3745df6c5
Binary files /dev/null and b/UI/24x24/Globe.png differ
diff --git a/UI/24x24/Go back.png b/UI/24x24/Go back.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2346c121313b8e0982415b1e828fbec07b25a6d
Binary files /dev/null and b/UI/24x24/Go back.png differ
diff --git a/UI/24x24/Go forward.png b/UI/24x24/Go forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..056f4e5d07fa10d07cef3060782f76c93e805041
Binary files /dev/null and b/UI/24x24/Go forward.png differ
diff --git a/UI/24x24/Go.png b/UI/24x24/Go.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea56c3822d4ae8f3bce0064405b07ce780130e4b
Binary files /dev/null and b/UI/24x24/Go.png differ
diff --git a/UI/24x24/Good mark.png b/UI/24x24/Good mark.png
new file mode 100644
index 0000000000000000000000000000000000000000..9148aee7ccc4e4ea6eafe089297a54d4edc239f0
Binary files /dev/null and b/UI/24x24/Good mark.png differ
diff --git a/UI/24x24/Green bookmark.png b/UI/24x24/Green bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..46b405186a9b551542f098c0afe698015235d851
Binary files /dev/null and b/UI/24x24/Green bookmark.png differ
diff --git a/UI/24x24/Green pin.png b/UI/24x24/Green pin.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f56f372a8ee3ae11dfb3b81b74c32301092fc45
Binary files /dev/null and b/UI/24x24/Green pin.png differ
diff --git a/UI/24x24/Green tag.png b/UI/24x24/Green tag.png
new file mode 100644
index 0000000000000000000000000000000000000000..83665a966532f37c47c0ae3ded631cc1ac7d22c1
Binary files /dev/null and b/UI/24x24/Green tag.png differ
diff --git a/UI/24x24/Hard disk.png b/UI/24x24/Hard disk.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ee2b0b3ffd3342f5896af7414db5e3a06fb3dc0
Binary files /dev/null and b/UI/24x24/Hard disk.png differ
diff --git a/UI/24x24/Heart.png b/UI/24x24/Heart.png
new file mode 100644
index 0000000000000000000000000000000000000000..73ae372ad820411a745e520e52ee6825b3e19476
Binary files /dev/null and b/UI/24x24/Heart.png differ
diff --git a/UI/24x24/Help book 3d.png b/UI/24x24/Help book 3d.png
new file mode 100644
index 0000000000000000000000000000000000000000..604dbd423be8aeb783b4f29b86250d406cfe495d
Binary files /dev/null and b/UI/24x24/Help book 3d.png differ
diff --git a/UI/24x24/Help book.png b/UI/24x24/Help book.png
new file mode 100644
index 0000000000000000000000000000000000000000..37e498d9ffdb75bd0e6d55d291f8ed06b015c56d
Binary files /dev/null and b/UI/24x24/Help book.png differ
diff --git a/UI/24x24/Help.png b/UI/24x24/Help.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ff8548c21288e80fc45a849ce73142b1e339fc6
Binary files /dev/null and b/UI/24x24/Help.png differ
diff --git a/UI/24x24/Hint.png b/UI/24x24/Hint.png
new file mode 100644
index 0000000000000000000000000000000000000000..face71a553e469ad818ee38cbd5d6ca9d6e06a3f
Binary files /dev/null and b/UI/24x24/Hint.png differ
diff --git a/UI/24x24/History.png b/UI/24x24/History.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3ba19ce3b84be7d74d9317293e2c47889cd927e
Binary files /dev/null and b/UI/24x24/History.png differ
diff --git a/UI/24x24/Home.png b/UI/24x24/Home.png
new file mode 100644
index 0000000000000000000000000000000000000000..1660baf90d2d3eac8943d99dba63297a294f1c18
Binary files /dev/null and b/UI/24x24/Home.png differ
diff --git a/UI/24x24/Hourglass.png b/UI/24x24/Hourglass.png
new file mode 100644
index 0000000000000000000000000000000000000000..c28ccb64db259e853054673024f3c59dfc4b90bc
Binary files /dev/null and b/UI/24x24/Hourglass.png differ
diff --git a/UI/24x24/How-to.png b/UI/24x24/How-to.png
new file mode 100644
index 0000000000000000000000000000000000000000..cebe737acf70bc60d7e6fbccb684854244584277
Binary files /dev/null and b/UI/24x24/How-to.png differ
diff --git a/UI/24x24/Hungup.png b/UI/24x24/Hungup.png
new file mode 100644
index 0000000000000000000000000000000000000000..a95e045b4e04ad20587f036ea6bf5851db350d8d
Binary files /dev/null and b/UI/24x24/Hungup.png differ
diff --git a/UI/24x24/In-yang.png b/UI/24x24/In-yang.png
new file mode 100644
index 0000000000000000000000000000000000000000..f26361f205899ca85f9500e78bbae97cae3ced86
Binary files /dev/null and b/UI/24x24/In-yang.png differ
diff --git a/UI/24x24/Info.png b/UI/24x24/Info.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9b7bdc15bccff06ee37b74324a139813bf1177b
Binary files /dev/null and b/UI/24x24/Info.png differ
diff --git a/UI/24x24/Iphone.png b/UI/24x24/Iphone.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da9a13be62b1c6e8683ed0aeda64c8ca295d28d
Binary files /dev/null and b/UI/24x24/Iphone.png differ
diff --git a/UI/24x24/Key.png b/UI/24x24/Key.png
new file mode 100644
index 0000000000000000000000000000000000000000..69f9fb9b4db7fb284a0c60e7888438d781638fbd
Binary files /dev/null and b/UI/24x24/Key.png differ
diff --git a/UI/24x24/Last recor.png b/UI/24x24/Last recor.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d0be39e8edf48b4cadc014439bda5974acedecf
Binary files /dev/null and b/UI/24x24/Last recor.png differ
diff --git a/UI/24x24/Last.png b/UI/24x24/Last.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f5db1294a8a39078bd84e9d5e55aee1ad9abac3
Binary files /dev/null and b/UI/24x24/Last.png differ
diff --git a/UI/24x24/Left-right.png b/UI/24x24/Left-right.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5149aba6a85531de5db7af8c64d47c47ed6780b
Binary files /dev/null and b/UI/24x24/Left-right.png differ
diff --git a/UI/24x24/Letter.png b/UI/24x24/Letter.png
new file mode 100644
index 0000000000000000000000000000000000000000..70d1562f5f62068688db563d708129f2aacd853f
Binary files /dev/null and b/UI/24x24/Letter.png differ
diff --git a/UI/24x24/Lightning.png b/UI/24x24/Lightning.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae26b20446a15a727282e89cc5c51cbbd8dcba66
Binary files /dev/null and b/UI/24x24/Lightning.png differ
diff --git a/UI/24x24/Liner.png b/UI/24x24/Liner.png
new file mode 100644
index 0000000000000000000000000000000000000000..338f895251de231d71128b835f3bcde9c273a367
Binary files /dev/null and b/UI/24x24/Liner.png differ
diff --git a/UI/24x24/Linux.png b/UI/24x24/Linux.png
new file mode 100644
index 0000000000000000000000000000000000000000..7451bbf5edac88fb26e4601157b5800384349529
Binary files /dev/null and b/UI/24x24/Linux.png differ
diff --git a/UI/24x24/List.png b/UI/24x24/List.png
new file mode 100644
index 0000000000000000000000000000000000000000..869befbe2edbbc302e5a4500b5202a1b7dd3a473
Binary files /dev/null and b/UI/24x24/List.png differ
diff --git a/UI/24x24/Load.png b/UI/24x24/Load.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa71885b3a445952525cf86fe5351a3acdf14ead
Binary files /dev/null and b/UI/24x24/Load.png differ
diff --git a/UI/24x24/Lock.png b/UI/24x24/Lock.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb5c8dd65f6b202b97fb9b94cf9dcdbbf4499eb7
Binary files /dev/null and b/UI/24x24/Lock.png differ
diff --git a/UI/24x24/Low rating.png b/UI/24x24/Low rating.png
new file mode 100644
index 0000000000000000000000000000000000000000..a13eaeff5df6a0d4fdd5343f9ef37895742bb42d
Binary files /dev/null and b/UI/24x24/Low rating.png differ
diff --git a/UI/24x24/Magic wand.png b/UI/24x24/Magic wand.png
new file mode 100644
index 0000000000000000000000000000000000000000..6dd192622f5f6f764041f4d283c490ac988a3bb9
Binary files /dev/null and b/UI/24x24/Magic wand.png differ
diff --git a/UI/24x24/Mail.png b/UI/24x24/Mail.png
new file mode 100644
index 0000000000000000000000000000000000000000..c636e2ada0d73415b2547e02f1bb24630df86e87
Binary files /dev/null and b/UI/24x24/Mail.png differ
diff --git a/UI/24x24/Male symbol.png b/UI/24x24/Male symbol.png
new file mode 100644
index 0000000000000000000000000000000000000000..41df5ac7624304e266031ad888a1acab0b686c6c
Binary files /dev/null and b/UI/24x24/Male symbol.png differ
diff --git a/UI/24x24/Male.png b/UI/24x24/Male.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7459a3683620d638b3a477bcf96c1e8786291d1
Binary files /dev/null and b/UI/24x24/Male.png differ
diff --git a/UI/24x24/Medium rating.png b/UI/24x24/Medium rating.png
new file mode 100644
index 0000000000000000000000000000000000000000..e670e830d9cc810a32d57cb2ec15f6af487782d6
Binary files /dev/null and b/UI/24x24/Medium rating.png differ
diff --git a/UI/24x24/Message.png b/UI/24x24/Message.png
new file mode 100644
index 0000000000000000000000000000000000000000..9849de7a2c160bbdc7e83800bab57ee6893400bb
Binary files /dev/null and b/UI/24x24/Message.png differ
diff --git a/UI/24x24/Mobile-phone.png b/UI/24x24/Mobile-phone.png
new file mode 100644
index 0000000000000000000000000000000000000000..c491e407476298c68e469ba288d8c6c308471bb6
Binary files /dev/null and b/UI/24x24/Mobile-phone.png differ
diff --git a/UI/24x24/Modify.png b/UI/24x24/Modify.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad93f105ecb0f41cdcdd43e69f3048abcb3541a3
Binary files /dev/null and b/UI/24x24/Modify.png differ
diff --git a/UI/24x24/Move.png b/UI/24x24/Move.png
new file mode 100644
index 0000000000000000000000000000000000000000..764765e4eb78ec3a4bd0f9a59bae747493f27dbf
Binary files /dev/null and b/UI/24x24/Move.png differ
diff --git a/UI/24x24/Movie.png b/UI/24x24/Movie.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8f773ec42624001ddb82bd118a52178038caeee
Binary files /dev/null and b/UI/24x24/Movie.png differ
diff --git a/UI/24x24/Music.png b/UI/24x24/Music.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba8e5fdfb662efc5841ec22dc6296649ef36f83e
Binary files /dev/null and b/UI/24x24/Music.png differ
diff --git a/UI/24x24/Mute.png b/UI/24x24/Mute.png
new file mode 100644
index 0000000000000000000000000000000000000000..51e68fb9e149e11200c16c88b1176139c13277cc
Binary files /dev/null and b/UI/24x24/Mute.png differ
diff --git a/UI/24x24/Network connection.png b/UI/24x24/Network connection.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ee75476131bc55c052b15b966f7d14d763fd716
Binary files /dev/null and b/UI/24x24/Network connection.png differ
diff --git a/UI/24x24/New document.png b/UI/24x24/New document.png
new file mode 100644
index 0000000000000000000000000000000000000000..2913d69623b922f210b3910313ceb2fe97a706f0
Binary files /dev/null and b/UI/24x24/New document.png differ
diff --git a/UI/24x24/New.png b/UI/24x24/New.png
new file mode 100644
index 0000000000000000000000000000000000000000..214c4c488526a0fed26457485f3fa38d1e4ebddf
Binary files /dev/null and b/UI/24x24/New.png differ
diff --git a/UI/24x24/Next track.png b/UI/24x24/Next track.png
new file mode 100644
index 0000000000000000000000000000000000000000..30c3a86e2f780a9a450445ef6b6a1329f1552c97
Binary files /dev/null and b/UI/24x24/Next track.png differ
diff --git a/UI/24x24/Next.png b/UI/24x24/Next.png
new file mode 100644
index 0000000000000000000000000000000000000000..a08610290b7e4004bab81b258eea3b0976ee5091
Binary files /dev/null and b/UI/24x24/Next.png differ
diff --git a/UI/24x24/No-entry.png b/UI/24x24/No-entry.png
new file mode 100644
index 0000000000000000000000000000000000000000..548e391543992010fde58b510efa56722c813eb3
Binary files /dev/null and b/UI/24x24/No-entry.png differ
diff --git a/UI/24x24/No.png b/UI/24x24/No.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3179b38f5234346500e8279b393c3c0cdf77860
Binary files /dev/null and b/UI/24x24/No.png differ
diff --git a/UI/24x24/Notes.png b/UI/24x24/Notes.png
new file mode 100644
index 0000000000000000000000000000000000000000..b44da480fdc69b51c1300007d1037ff65061b065
Binary files /dev/null and b/UI/24x24/Notes.png differ
diff --git a/UI/24x24/OK.png b/UI/24x24/OK.png
new file mode 100644
index 0000000000000000000000000000000000000000..38383191e56e1fc110325e8d95e8ca3d7f353513
Binary files /dev/null and b/UI/24x24/OK.png differ
diff --git a/UI/24x24/Paste.png b/UI/24x24/Paste.png
new file mode 100644
index 0000000000000000000000000000000000000000..1fccb4bfc4f30ce2752213083234624320c93135
Binary files /dev/null and b/UI/24x24/Paste.png differ
diff --git a/UI/24x24/Pause.png b/UI/24x24/Pause.png
new file mode 100644
index 0000000000000000000000000000000000000000..758b0b080d9dcc3c166ebf4dad071fe3f8e7a0c3
Binary files /dev/null and b/UI/24x24/Pause.png differ
diff --git a/UI/24x24/People.png b/UI/24x24/People.png
new file mode 100644
index 0000000000000000000000000000000000000000..05c3d71bf1e9dc4505c25c99d60504731ff4989f
Binary files /dev/null and b/UI/24x24/People.png differ
diff --git a/UI/24x24/Percent.png b/UI/24x24/Percent.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b8f5570ca21bcefdb0fe42021aeeb57b81b7cc5
Binary files /dev/null and b/UI/24x24/Percent.png differ
diff --git a/UI/24x24/Person.png b/UI/24x24/Person.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7297c77fc791e69283263d1209d8d621266a274
Binary files /dev/null and b/UI/24x24/Person.png differ
diff --git a/UI/24x24/Phone number.png b/UI/24x24/Phone number.png
new file mode 100644
index 0000000000000000000000000000000000000000..c55d56ec4cb22d01cb41bf4fde18c744ae613359
Binary files /dev/null and b/UI/24x24/Phone number.png differ
diff --git a/UI/24x24/Phone.png b/UI/24x24/Phone.png
new file mode 100644
index 0000000000000000000000000000000000000000..0465349ca36da28d32a785fbbba48fd38f1f90d8
Binary files /dev/null and b/UI/24x24/Phone.png differ
diff --git a/UI/24x24/Picture.png b/UI/24x24/Picture.png
new file mode 100644
index 0000000000000000000000000000000000000000..d613eb67effc41cb19fbeda5400f849f9ebb817d
Binary files /dev/null and b/UI/24x24/Picture.png differ
diff --git a/UI/24x24/Pie chart.png b/UI/24x24/Pie chart.png
new file mode 100644
index 0000000000000000000000000000000000000000..4063530cdc89bdfc6610c555836ce18dfaa89a6f
Binary files /dev/null and b/UI/24x24/Pie chart.png differ
diff --git a/UI/24x24/Pinion.png b/UI/24x24/Pinion.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae821ef2589eacaebc73ae4b759c709be06b50c5
Binary files /dev/null and b/UI/24x24/Pinion.png differ
diff --git a/UI/24x24/Play-music.png b/UI/24x24/Play-music.png
new file mode 100644
index 0000000000000000000000000000000000000000..12647f1813fbd3a9ee3bea37021ab317a6789d3d
Binary files /dev/null and b/UI/24x24/Play-music.png differ
diff --git a/UI/24x24/Play.png b/UI/24x24/Play.png
new file mode 100644
index 0000000000000000000000000000000000000000..6066a425b270ae1b37788fd76da447652a569eaf
Binary files /dev/null and b/UI/24x24/Play.png differ
diff --git a/UI/24x24/Playback.png b/UI/24x24/Playback.png
new file mode 100644
index 0000000000000000000000000000000000000000..022a63dbd16f0eaa4f068f625ef4595db2d008bf
Binary files /dev/null and b/UI/24x24/Playback.png differ
diff --git a/UI/24x24/Previous record.png b/UI/24x24/Previous record.png
new file mode 100644
index 0000000000000000000000000000000000000000..da497948b4e53211b9708e38c56b86126d524363
Binary files /dev/null and b/UI/24x24/Previous record.png differ
diff --git a/UI/24x24/Previous.png b/UI/24x24/Previous.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3fcd738289455c1a11adb4231771ac42af09e76
Binary files /dev/null and b/UI/24x24/Previous.png differ
diff --git a/UI/24x24/Print.png b/UI/24x24/Print.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a6e37ae8efde664263b3fec9dd903807db536e5
Binary files /dev/null and b/UI/24x24/Print.png differ
diff --git a/UI/24x24/Problem.png b/UI/24x24/Problem.png
new file mode 100644
index 0000000000000000000000000000000000000000..997957250cc8201b99245ad33432a45b195ac802
Binary files /dev/null and b/UI/24x24/Problem.png differ
diff --git a/UI/24x24/Question.png b/UI/24x24/Question.png
new file mode 100644
index 0000000000000000000000000000000000000000..95008cb8394918f1ed770e2e4bf609e3af7fc431
Binary files /dev/null and b/UI/24x24/Question.png differ
diff --git a/UI/24x24/Radiation.png b/UI/24x24/Radiation.png
new file mode 100644
index 0000000000000000000000000000000000000000..88ae974c1296e43910a39e3134d2d219cb08110a
Binary files /dev/null and b/UI/24x24/Radiation.png differ
diff --git a/UI/24x24/Raise.png b/UI/24x24/Raise.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef7431edfae70ab8e2e5b099385845ddf3740b29
Binary files /dev/null and b/UI/24x24/Raise.png differ
diff --git a/UI/24x24/Record.png b/UI/24x24/Record.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ca45b054dff277e2e43c562ba256f53a3074404
Binary files /dev/null and b/UI/24x24/Record.png differ
diff --git a/UI/24x24/Red bookmark.png b/UI/24x24/Red bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..35284ca4cbe5c3ab1b99ca8c335bc425931b0d0f
Binary files /dev/null and b/UI/24x24/Red bookmark.png differ
diff --git a/UI/24x24/Red mark.png b/UI/24x24/Red mark.png
new file mode 100644
index 0000000000000000000000000000000000000000..21033bf6bd6fc36797cea8c361f6fe7068597813
Binary files /dev/null and b/UI/24x24/Red mark.png differ
diff --git a/UI/24x24/Red pin.png b/UI/24x24/Red pin.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f99fa756cfb58196f84f1383d1f03d618a5284d
Binary files /dev/null and b/UI/24x24/Red pin.png differ
diff --git a/UI/24x24/Red star.png b/UI/24x24/Red star.png
new file mode 100644
index 0000000000000000000000000000000000000000..baebc1275990102dbc1ef1f61b37f488a7085001
Binary files /dev/null and b/UI/24x24/Red star.png differ
diff --git a/UI/24x24/Red tag.png b/UI/24x24/Red tag.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd4fdcb7dd0908470198ab749975804df3a5cc79
Binary files /dev/null and b/UI/24x24/Red tag.png differ
diff --git a/UI/24x24/Redo.png b/UI/24x24/Redo.png
new file mode 100644
index 0000000000000000000000000000000000000000..749456d177fab459f33037e6f6ca08f86c8ccb79
Binary files /dev/null and b/UI/24x24/Redo.png differ
diff --git a/UI/24x24/Refresh.png b/UI/24x24/Refresh.png
new file mode 100644
index 0000000000000000000000000000000000000000..99fba115c03262f4a8a0fa7a5fef9776f1ab771e
Binary files /dev/null and b/UI/24x24/Refresh.png differ
diff --git a/UI/24x24/Remove.png b/UI/24x24/Remove.png
new file mode 100644
index 0000000000000000000000000000000000000000..70b48ea0bfdc5dea849a7bb01a808783a32e8e80
Binary files /dev/null and b/UI/24x24/Remove.png differ
diff --git a/UI/24x24/Repair.png b/UI/24x24/Repair.png
new file mode 100644
index 0000000000000000000000000000000000000000..3328cd607eb7529c406d55ba333d0bd37a2a7339
Binary files /dev/null and b/UI/24x24/Repair.png differ
diff --git a/UI/24x24/Report.png b/UI/24x24/Report.png
new file mode 100644
index 0000000000000000000000000000000000000000..43c96bbc111f3bc5f86b1f8600bb6fcf8655f4d5
Binary files /dev/null and b/UI/24x24/Report.png differ
diff --git a/UI/24x24/Retort.png b/UI/24x24/Retort.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0e7e0f145ae4ef55f0a9d68bf9ef2e434f0744a
Binary files /dev/null and b/UI/24x24/Retort.png differ
diff --git a/UI/24x24/Rewind.png b/UI/24x24/Rewind.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1f04e73ea727b45e9cdea1882ed95394c72bbec
Binary files /dev/null and b/UI/24x24/Rewind.png differ
diff --git a/UI/24x24/Sad.png b/UI/24x24/Sad.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9b07f701e9745476153e24ce864287f31ea94bf
Binary files /dev/null and b/UI/24x24/Sad.png differ
diff --git a/UI/24x24/Save.png b/UI/24x24/Save.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d39a4d1ec1fbef4d5008d8c1825b4439c4aea5c
Binary files /dev/null and b/UI/24x24/Save.png differ
diff --git a/UI/24x24/Schedule.png b/UI/24x24/Schedule.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf70d2dd8cb4d7f1d984676c2da44ab6f0ee6e8a
Binary files /dev/null and b/UI/24x24/Schedule.png differ
diff --git a/UI/24x24/Script.png b/UI/24x24/Script.png
new file mode 100644
index 0000000000000000000000000000000000000000..56c066844bfc2cbe6cbb07b4665b173669bb3892
Binary files /dev/null and b/UI/24x24/Script.png differ
diff --git a/UI/24x24/Search.png b/UI/24x24/Search.png
new file mode 100644
index 0000000000000000000000000000000000000000..d05139b9809598a9d98473da75bdbf2b435c4a62
Binary files /dev/null and b/UI/24x24/Search.png differ
diff --git a/UI/24x24/Shield.png b/UI/24x24/Shield.png
new file mode 100644
index 0000000000000000000000000000000000000000..600fdd62779e94c9c4c367eda6395f8abc1a8b60
Binary files /dev/null and b/UI/24x24/Shield.png differ
diff --git a/UI/24x24/Shopping cart.png b/UI/24x24/Shopping cart.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5136d3cea63e66faabdb58f4d900d133c027455
Binary files /dev/null and b/UI/24x24/Shopping cart.png differ
diff --git a/UI/24x24/Silence.png b/UI/24x24/Silence.png
new file mode 100644
index 0000000000000000000000000000000000000000..b386b73dfd7b5b729ba4842a0a59b620ccebbcce
Binary files /dev/null and b/UI/24x24/Silence.png differ
diff --git a/UI/24x24/Smile.png b/UI/24x24/Smile.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3dae8768754b98ca205f09471da9eac0d7cb252
Binary files /dev/null and b/UI/24x24/Smile.png differ
diff --git a/UI/24x24/Sound.png b/UI/24x24/Sound.png
new file mode 100644
index 0000000000000000000000000000000000000000..f236b1ad3ada8f808e457af2a79d1af0c54d9422
Binary files /dev/null and b/UI/24x24/Sound.png differ
diff --git a/UI/24x24/Stock graph.png b/UI/24x24/Stock graph.png
new file mode 100644
index 0000000000000000000000000000000000000000..77f88be2f6660e0a909102b01f3a8e9811dafcbe
Binary files /dev/null and b/UI/24x24/Stock graph.png differ
diff --git a/UI/24x24/Stop sign.png b/UI/24x24/Stop sign.png
new file mode 100644
index 0000000000000000000000000000000000000000..51146c2022c0d27778273f5e3d73a8eef6723827
Binary files /dev/null and b/UI/24x24/Stop sign.png differ
diff --git a/UI/24x24/Stop.png b/UI/24x24/Stop.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea2ade44dd4c1dd57e7b0ebf3cc2f23f7a98ed86
Binary files /dev/null and b/UI/24x24/Stop.png differ
diff --git a/UI/24x24/Stopwatch.png b/UI/24x24/Stopwatch.png
new file mode 100644
index 0000000000000000000000000000000000000000..63cd9cdd79418f6d4f09e0c4b9b984f8e664cd67
Binary files /dev/null and b/UI/24x24/Stopwatch.png differ
diff --git a/UI/24x24/Sum.png b/UI/24x24/Sum.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8bd4e6cc5ced5109a657b1db51e4ffec4b97fc8
Binary files /dev/null and b/UI/24x24/Sum.png differ
diff --git a/UI/24x24/Sync.png b/UI/24x24/Sync.png
new file mode 100644
index 0000000000000000000000000000000000000000..12cc06dbba18761f9d8b55de1dbd02867c7d767b
Binary files /dev/null and b/UI/24x24/Sync.png differ
diff --git a/UI/24x24/Table.png b/UI/24x24/Table.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc829d7837aab82edb0f50a660f0a7cebd907c1d
Binary files /dev/null and b/UI/24x24/Table.png differ
diff --git a/UI/24x24/Target.png b/UI/24x24/Target.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d398bbeb45da6c982894257d6ea909f0e71d24b
Binary files /dev/null and b/UI/24x24/Target.png differ
diff --git a/UI/24x24/Taxi.png b/UI/24x24/Taxi.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f30420fb887623ec6c45ba7e031ab5ece87143c
Binary files /dev/null and b/UI/24x24/Taxi.png differ
diff --git a/UI/24x24/Terminate.png b/UI/24x24/Terminate.png
new file mode 100644
index 0000000000000000000000000000000000000000..951efdfb6ad1335eb890066345a0763cba357500
Binary files /dev/null and b/UI/24x24/Terminate.png differ
diff --git a/UI/24x24/Text preview.png b/UI/24x24/Text preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..467a83a11e9a8b85be7ed790348e335215935fef
Binary files /dev/null and b/UI/24x24/Text preview.png differ
diff --git a/UI/24x24/Text.png b/UI/24x24/Text.png
new file mode 100644
index 0000000000000000000000000000000000000000..134f359c489ae2e0c43ceabd8bbbad60978d07a1
Binary files /dev/null and b/UI/24x24/Text.png differ
diff --git a/UI/24x24/Thumbs down.png b/UI/24x24/Thumbs down.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc5f63d6b65654a99b8b99ddeee7ca5f62cdcfe6
Binary files /dev/null and b/UI/24x24/Thumbs down.png differ
diff --git a/UI/24x24/Thumbs up.png b/UI/24x24/Thumbs up.png
new file mode 100644
index 0000000000000000000000000000000000000000..b43c7e476d57e6f9b4d2aeff3cac3c190f0a9e04
Binary files /dev/null and b/UI/24x24/Thumbs up.png differ
diff --git a/UI/24x24/Toolbox.png b/UI/24x24/Toolbox.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab5ba0eb815572f1dd389af1190d2d61f19215de
Binary files /dev/null and b/UI/24x24/Toolbox.png differ
diff --git a/UI/24x24/Top.png b/UI/24x24/Top.png
new file mode 100644
index 0000000000000000000000000000000000000000..879d408544f5a13cbced1b9d0fb0a18162d58f3d
Binary files /dev/null and b/UI/24x24/Top.png differ
diff --git a/UI/24x24/Trackback.png b/UI/24x24/Trackback.png
new file mode 100644
index 0000000000000000000000000000000000000000..23a01f5afe80f2e71e78bbdc93351d3a6fcf2469
Binary files /dev/null and b/UI/24x24/Trackback.png differ
diff --git a/UI/24x24/Trash.png b/UI/24x24/Trash.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b123913a2c67dedc7a34c731b4d9e7fe4ed0f51
Binary files /dev/null and b/UI/24x24/Trash.png differ
diff --git a/UI/24x24/Tune.png b/UI/24x24/Tune.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa8c19fffba280e37f30a8b67f9089032f950029
Binary files /dev/null and b/UI/24x24/Tune.png differ
diff --git a/UI/24x24/Turn off.png b/UI/24x24/Turn off.png
new file mode 100644
index 0000000000000000000000000000000000000000..50dca64ccf71b42b5494bd9afdffe3305ea07e53
Binary files /dev/null and b/UI/24x24/Turn off.png differ
diff --git a/UI/24x24/Twitter.png b/UI/24x24/Twitter.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5783f662ae9e70261bb82974d39a925515e1876
Binary files /dev/null and b/UI/24x24/Twitter.png differ
diff --git a/UI/24x24/Undo.png b/UI/24x24/Undo.png
new file mode 100644
index 0000000000000000000000000000000000000000..79d3e5cee43a9d645a71116efaafbd61482c11aa
Binary files /dev/null and b/UI/24x24/Undo.png differ
diff --git a/UI/24x24/Unlock.png b/UI/24x24/Unlock.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2f884f5fd95a75590e8ebdebaa209b1aa8cf35b
Binary files /dev/null and b/UI/24x24/Unlock.png differ
diff --git a/UI/24x24/Up-down.png b/UI/24x24/Up-down.png
new file mode 100644
index 0000000000000000000000000000000000000000..f460f68f4a93792f09d166af5b8de8c88e9dfaa3
Binary files /dev/null and b/UI/24x24/Up-down.png differ
diff --git a/UI/24x24/Up.png b/UI/24x24/Up.png
new file mode 100644
index 0000000000000000000000000000000000000000..24cc8667afa3e3ecdb2ab157b30584d1f46589cf
Binary files /dev/null and b/UI/24x24/Up.png differ
diff --git a/UI/24x24/Update.png b/UI/24x24/Update.png
new file mode 100644
index 0000000000000000000000000000000000000000..3bfaea2915edebdded13757e62f43d1e40f5bbdd
Binary files /dev/null and b/UI/24x24/Update.png differ
diff --git a/UI/24x24/Upload.png b/UI/24x24/Upload.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b2d2bf4c253e69021a18752a56ebf5e93a77a26
Binary files /dev/null and b/UI/24x24/Upload.png differ
diff --git a/UI/24x24/User group.png b/UI/24x24/User group.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d5eab80a5ca7b7a68acaa603e2c493e16e9ce50
Binary files /dev/null and b/UI/24x24/User group.png differ
diff --git a/UI/24x24/View.png b/UI/24x24/View.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c098b785dfb8f9e0d7a4761bf64a0a1083919c1
Binary files /dev/null and b/UI/24x24/View.png differ
diff --git a/UI/24x24/Volume.png b/UI/24x24/Volume.png
new file mode 100644
index 0000000000000000000000000000000000000000..998e3de2e99fdfa401579e1567c0e3750e553480
Binary files /dev/null and b/UI/24x24/Volume.png differ
diff --git a/UI/24x24/Wallet.png b/UI/24x24/Wallet.png
new file mode 100644
index 0000000000000000000000000000000000000000..2240c680145114e4985f4b926f6747930a24a61e
Binary files /dev/null and b/UI/24x24/Wallet.png differ
diff --git a/UI/24x24/Warning.png b/UI/24x24/Warning.png
new file mode 100644
index 0000000000000000000000000000000000000000..cfc9ae1ecad56469789a80eced7c1b5fdf288d10
Binary files /dev/null and b/UI/24x24/Warning.png differ
diff --git a/UI/24x24/Wrench.png b/UI/24x24/Wrench.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b5eac776217ef73a4e46a8ee2e7dbaf55d0d270
Binary files /dev/null and b/UI/24x24/Wrench.png differ
diff --git a/UI/24x24/Yellow bookmark.png b/UI/24x24/Yellow bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..a540fe3dd9725ce0abb4f79a612992a170ee454a
Binary files /dev/null and b/UI/24x24/Yellow bookmark.png differ
diff --git a/UI/24x24/Yellow pin.png b/UI/24x24/Yellow pin.png
new file mode 100644
index 0000000000000000000000000000000000000000..d70eed56957c52627acf6acaeebbb2b9a0f104fe
Binary files /dev/null and b/UI/24x24/Yellow pin.png differ
diff --git a/UI/24x24/Yellow tag.png b/UI/24x24/Yellow tag.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ef468de18e5e73145b33895086f2514fc2296a9
Binary files /dev/null and b/UI/24x24/Yellow tag.png differ
diff --git a/UI/24x24/Yes.png b/UI/24x24/Yes.png
new file mode 100644
index 0000000000000000000000000000000000000000..328e7d1e25bc7a5a2ca7487f0530589c42d8eb4d
Binary files /dev/null and b/UI/24x24/Yes.png differ
diff --git a/UI/24x24/Zoom.png b/UI/24x24/Zoom.png
new file mode 100644
index 0000000000000000000000000000000000000000..03d73d1463c2709afeae81ca33dc7032fc70ae62
Binary files /dev/null and b/UI/24x24/Zoom.png differ
diff --git a/UI/AdvGraphs.py b/UI/AdvGraphs.py
new file mode 100644
index 0000000000000000000000000000000000000000..be731609983c742c03d10cf4e862b00c01df1247
--- /dev/null
+++ b/UI/AdvGraphs.py
@@ -0,0 +1,4237 @@
+import numpy as np
+import copy
+from matplotlib import gridspec
+import matplotlib.cm as cm
+from matplotlib.dates import DateFormatter, num2date
+from matplotlib.patches import Polygon
+from PyQt5 import QtWidgets, QtCore
+from contextlib import contextmanager
+from datetime import datetime, timedelta
+from MiscLibs.common_functions import sind, cosd
+from MiscLibs.compute_edge_cd import compute_edge_cd
+
+
+class AdvGraphs(object):
+    """Class to generate the color contour plot of water speed data.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+            Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    x_axis_type: str
+        Identifies x-axis type (L-lenght, E-ensemble, T-time)
+    fig_no: int
+        Figure number indicating location within subplots
+    color_map: str
+        Name of color map for color contour plots
+    x: np.ndarray()
+        Array of values for the x-axis
+    x_timestamp: np.ndarray()
+        Array of timestamps used for x-axis if time is selected
+    ax: list
+        List of subplots
+    flow_direction: float
+        Flow direction in degrees
+    n_subplots: int
+        Number of subplots
+    transect: TransectData
+        Transect for which data are to be plotted
+    discharge: QComp
+        Discharge data
+    data_plotted: list
+        List of dictionaries containing the type of plot an values of data
+        plotted (x, y, z)
+    gs: gridspec
+        Grid specification for subplots
+    wt_advanced_type_methods: dict
+        Dictionary connecting to the plot type to the method to create the plot
+    ping_name: dict
+        Name of ping type for labeling colorbar and data cursor
+    show_below_sl: bool
+        Indicates if correlation or intensity data below the side lobe should
+        be shown
+    ping_type_long_name: dict
+        Dictionary linking ping type to long name for labeling
+    p_type_color: dict
+        Dictionary specifying the plot color for each ping type
+    p_type_marker: dict
+        Dictionary specifying the plot marker for each ping type
+    wt_legend_dict: dict
+        Dictionary of legend text for wt ping type
+    bt_legend_dict:
+        Dictionary of legend text for bt ping type
+    freq_color: dict
+        Dictionary for bt frequency color
+    freq_marker: dict
+        Dictionary for bt frequency marker
+    expanded_x: np.array(float)
+        Values of x-axis for length including edge shape and distance
+    show_unmeasured: bool
+        Indicates if unmeasured data should be plotted in final wt contour
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.hover_connection = None
+        self.annot = None
+        self.x_axis_type = "E"
+        self.fig_no = 0
+        self.color_map = "viridis"
+        self.x = None
+        self.x_timestamp = None
+        self.ax = None
+        self.flow_direction = None
+        self.n_subplots = 0
+        self.transect = None
+        self.discharge = None
+        self.ax = []
+        self.annot = []
+        self.data_plotted = []
+        self.gs = None
+        self.ping_name = None
+        self.show_below_sl = False
+        self.show_unmeasured = False
+        self.expanded_x = None
+        self.ping_type_long_name = {
+            "I": "Incoherent",
+            "C": "Coherent",
+            "S": "Surface",
+            "1I": "1 MHz Inc",
+            "1C": "1 MHz Coh",
+            "3I": "3 MHz Inc",
+            "3C": "3 MHz Coh",
+            "BB": "BB",
+            "PC": "PC",
+            "PC/BB": "PC/BB",
+            "PCBB": "PC/BB",
+            "U": "N/A",
+            "1": "N/A",
+            "Other": "N/A",
+        }
+        self.p_type_color = {
+            "I": "b",
+            "C": "#009933",
+            "S": "#ffbf00",
+            "1I": "b",
+            "1C": "#009933",
+            "3I": "#ffbf00",
+            "3C": "#ff33cc",
+            "BB": "b",
+            "PC": "#009933",
+            "PC/BB": "#ffbf00",
+            "PCBB": "#ffbf00",
+            "U": "b",
+            "1": "b",
+            "Other": "b",
+        }
+        self.p_type_marker = {
+            "I": ".",
+            "C": "+",
+            "S": "x",
+            "1I": ".",
+            "1C": "*",
+            "3I": "+",
+            "3C": "x",
+            "BB": ".",
+            "PC": "+",
+            "PC/BB": "x",
+            "PCBB": "x",
+            "U": ".",
+            "1": ".",
+            "Other": ".",
+        }
+        self.wt_legend_dict = {
+            "I": "Incoherent",
+            "C": "Coherent",
+            "S": "Surface Cell",
+            "1I": "1MHz Incoherent",
+            "1C": "1 MHz HD",
+            "3I": "3 MHz Incoherent",
+            "3C": "3 MHz HD",
+            "BB": "BB",
+            "PC": "PC",
+            "PC/BB": "PC/BB",
+            "PCBB": "PC/BB",
+            "U": "N/A",
+        }
+        self.bt_legend_dict = {
+            "600": "600 kHz",
+            "1200": "1200 kHz",
+            "1000": "1 MHz",
+            "2000": "2 MHz",
+            "2400": "2.4 MHz",
+            "3000": "3 MHz",
+            "0": "N/U",
+            "BB": "BB",
+            "PC": "PC",
+            "PC/BB": "PC/BB",
+            "U": "U",
+            "PCBB": "PC/BB",
+            "1": "U",
+            "Other": "U",
+        }
+        self.freq_color = {
+            "0": "b",
+            "600": "b",
+            "1200": "b",
+            "1000": "b",
+            "2000": "b",
+            "2400": "b",
+            "3000": "#009933",
+        }
+        self.freq_marker = {
+            "0": ".",
+            "600": ".",
+            "1200": ".",
+            "1000": ".",
+            "2000": ".",
+            "2400": ".",
+            "3000": "+",
+        }
+        self.wt_advanced_type_methods = {
+            "cb_speed_filtered_cc": self.wt_speed_filtered_contour,
+            "cb_speed_final_cc": self.wt_speed_final_contour,
+            "cb_projected_cc": self.wt_projected_contour,
+            "cb_vertical_cc": self.wt_vertical_contour,
+            "cb_error_cc": self.wt_error_contour,
+            "cb_direction_cc": self.wt_direction_contour,
+            "cb_avg_corr_cc": self.wt_avg_corr_contour,
+            "cb_corr_beam_cc": self.wt_corr_beam_contour,
+            "cb_avg_rssi_cc": self.wt_avg_rssi_contour,
+            "cb_rssi_beam_cc": self.wt_rssi_beam_contour,
+            "cb_ping_type_cc": self.wt_ping_type,
+            "cb_discharge_ts": self.discharge_ts,
+            "cb_discharge_percent_ts": self.discharge_percent_ts,
+            "cb_avg_speed_ts": self.wt_avg_speed_ts,
+            "cb_projected_speed_ts": self.wt_projected_speed_ts,
+            "cb_wt_beams_ts": self.wt_3beam_ts,
+            "cb_wt_error_ts": self.wt_error_ts,
+            "cb_wt_vert_ts": self.wt_vertical_ts,
+            "cb_wt_snr_ts": self.wt_snr_ts,
+            "cb_bt_boat_speed_ts": self.bt_speed_ts,
+            "cb_bt_3beam_ts": self.bt_3beam_ts,
+            "cb_bt_error_ts": self.bt_error_ts,
+            "cb_bt_vertical_ts": self.bt_vertical_ts,
+            "cb_bt_source_ts": self.bt_source_ts,
+            "cb_bt_corr_ts": self.bt_corr_ts,
+            "cb_bt_rssi_ts": self.bt_rssi_ts,
+            "cb_gga_boat_speed_ts": self.gga_speed_ts,
+            "cb_vtg_boat_speed_ts": self.vtg_speed_ts,
+            "cb_gga_quality_ts": self.gga_quality_ts,
+            "cb_gga_hdop_ts": self.gga_hdop_ts,
+            "cb_gga_altitude_ts": self.gga_altitude_ts,
+            "cb_gga_sats_ts": self.gga_sats_ts,
+            "cb_gga_source_ts": self.gga_source_ts,
+            "cb_vtg_source_ts": self.vtg_source_ts,
+            "cb_adcp_heading_ts": self.heading_adcp_ts,
+            "cb_ext_heading_ts": self.heading_external_ts,
+            "cb_mag_error_ts": self.heading_mag_error_ts,
+            "cb_pitch_ts": self.pitch_ts,
+            "cb_roll_ts": self.roll_ts,
+            "cb_beam_depths_ts": self.depths_beam_ts,
+            "cb_final_depths_ts": self.depths_final_ts,
+            "cb_depths_source_ts": self.depths_source_ts,
+            "cb_battery_voltage_ts": self.battery_voltage_ts,
+        }
+
+    def create(
+        self,
+        transect,
+        discharge,
+        units,
+        selected_types,
+        flow_direction=0,
+        color_map="viridis",
+        x_axis_type=None,
+        show_below_sl=False,
+        show_unmeasured=False,
+    ):
+        """Create selected plots for the specified transect.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Transect for which plots are created
+        discharge: QComp
+            Discharge data
+        units: dict
+            Units selected
+        selected_types: list
+            List of selected plot types
+        flow_direction: float
+            Flow direction to be used for projected speed plots
+        color_map: str
+            Name of color map to be used for color contour plots
+        show_below_sl: bool
+            Indicates if data should be shown below sidelobe cutoff
+        x_axis_type: str
+            Specifies what variable (ensemble, length or time) to be used for
+            the x-axis
+        show_unmeasured: bool
+            Indicates if unmeasured data should be plotted in final wt contour
+        """
+
+        # Make sure a selection was made
+        if len(selected_types) > 0:
+
+            with self.wait_cursor():
+                # Initialize data sources
+                self.flow_direction = flow_direction
+                self.transect = transect
+                self.discharge = discharge
+
+                self.show_below_sl = show_below_sl
+                self.show_unmeasured = show_unmeasured
+
+                # Set default axis
+                if x_axis_type is None:
+                    x_axis_type = "E"
+                self.x_axis_type = x_axis_type
+
+                # Set color map and units
+                self.color_map = color_map
+                self.units = units
+
+                # Clear the plot
+                self.fig.clear()
+
+                # Determine number of subplots
+                self.n_subplots = len(selected_types)
+                if "cb_corr_beam_cc" in selected_types:
+                    self.n_subplots += 3
+                if "cb_rssi_beam_cc" in selected_types:
+                    self.n_subplots += 3
+
+                # Compute x-axis variable
+                self.compute_x_axis()
+
+                # Initialize variable for subplots
+                self.ax = []
+                self.annot = []
+                self.data_plotted = []
+                share_y = False
+
+                # Create grid specification
+                # Note: the second column of the grid is for the color bar.
+                # It is blank but present even for time series
+                # plots to allow the sharing of the x-axis between all plots
+                self.gs = gridspec.GridSpec(self.n_subplots, 2, width_ratios=[50, 1])
+
+                # Create first subplot
+                self.ax.append(self.fig.add_subplot(self.gs[self.fig_no]))
+                self.wt_advanced_type_methods[selected_types[0]]()
+                # Share the y-axis between color contour plots
+                if selected_types[0][-3:] == "_cc":
+                    share_y = True
+
+                # Create additional subplots as specified, sharing x axis for
+                # all plots and  y axis for contour plots
+                if len(selected_types) > 1:
+                    for n in range(1, len(selected_types)):
+                        # Figure number increased by two to account for the
+                        # second column in the grid space
+                        # for the colorbar
+                        self.fig_no += 2
+                        if share_y and selected_types[n][-3:] == "_cc":
+                            self.ax.append(
+                                self.fig.add_subplot(
+                                    self.gs[self.fig_no],
+                                    sharex=self.ax[0],
+                                    sharey=self.ax[0],
+                                )
+                            )
+                        else:
+                            self.ax.append(
+                                self.fig.add_subplot(
+                                    self.gs[self.fig_no], sharex=self.ax[0]
+                                )
+                            )
+
+                        # Call method based on link in dictionary
+                        self.wt_advanced_type_methods[selected_types[n]]()
+
+                # Adjust the spacing of the subplots
+                self.fig.subplots_adjust(
+                    left=0.05,
+                    bottom=0.05,
+                    right=0.92,
+                    top=0.95,
+                    wspace=0.02,
+                    hspace=0.08,
+                )
+
+                # Apply the x-axis label to the bottom x-axis
+                if selected_types[-1][-3:] == "_cc":
+                    idx = -2
+                else:
+                    idx = -1
+
+                self.ax[idx].xaxis.label.set_fontsize(12)
+
+                self.set_x_axis(idx)
+
+        else:
+            # Clear the plot
+            self.fig.clear()
+
+        self.canvas.draw()
+
+    def create_main_contour(
+        self, transect, units, x_axis_type="E", color_map="viridis", discharge=None
+    ):
+
+        # Initialize data sources
+        self.transect = transect
+        self.discharge = discharge
+
+        if discharge is not None:
+            self.show_unmeasured = True
+        else:
+            self.show_unmeasured = False
+
+        # Set axis type and units
+        self.x_axis_type = x_axis_type
+        self.units = units
+        self.color_map = color_map
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Determine number of subplots
+        self.n_subplots = 1
+
+        # Compute x-axis variable, this applies units
+        self.compute_x_axis()
+
+        # Initialize variable for subplots
+        self.ax = []
+        self.annot = []
+        self.data_plotted = []
+
+        # Create grid specification
+        # Note: the second column of the grid is for the color bar. It is
+        # blank but present even for time series plots to allow the sharing
+        # of the x-axis between all plots
+        self.gs = gridspec.GridSpec(self.n_subplots, 2, width_ratios=[50, 1])
+
+        self.ax.append(self.fig.add_subplot(self.gs[self.fig_no]))
+        self.wt_speed_final_contour()
+
+        # Adjust the spacing of the subplots
+        self.fig.subplots_adjust(
+            left=0.08, bottom=0.2, right=0.92, top=0.97, wspace=0.02, hspace=0
+        )
+
+        # Apply the x-axis label to the bottom x-axis
+        idx = -2
+        self.ax[idx].xaxis.label.set_fontsize(12)
+        self.set_x_axis(idx)
+
+        self.canvas.draw()
+
+    def create_depth_tab_graphs(
+        self,
+        transect,
+        units,
+        b1=True,
+        b2=True,
+        b3=True,
+        b4=True,
+        vb=False,
+        ds=False,
+        avg4_final=False,
+        vb_final=False,
+        ds_final=False,
+        final=True,
+        x_axis_type="E",
+    ):
+        """Creates the plots for the depth tab. This approach allows zoom and
+        pan to work together for both plots.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Transect to plot
+        units: dict
+            Units selected
+        b1: bool
+            Indicates if beam 1 is plotted
+        b2: bool
+            Indicates if beam 2 is plotted
+        b3: bool
+            Indicates if beam 3 is plotted
+        b4: bool
+            Indicates if beam 4 is plotted
+        vb: bool
+            Indicates if the vertical beam is plotted
+        ds: bool
+            Indicates if the depth sounder is plotted
+        avg4_final: bool
+            Indicates if the 4-beam average cross section is plotted
+        vb_final: bool
+            Indicates if the vertical beam cross section is plotted
+        ds_final: bool
+            Indicates if the depth sounder cross section is plotted
+        final: bool
+            Indicates if the selected method for determing the cross section
+            is plotted
+        x_axis_type: str
+            Specifies what variable (ensemble, length or time) to be used for
+            the x-axis
+        """
+        with self.wait_cursor():
+
+            # Initialize data sources
+            self.transect = transect
+
+            # Set default axis type and units
+            self.x_axis_type = x_axis_type
+            self.units = units
+
+            # Clear the plot
+            self.fig.clear()
+
+            # Determine number of subplots
+            self.n_subplots = 2
+
+            # Compute x-axis variable
+            self.compute_x_axis()
+
+            # Initialize variable for subplots
+            self.ax = []
+            self.annot = []
+            self.data_plotted = []
+
+            # Create grid specification
+            # Note: the second column of the grid is for the color bar. It
+            # is blank but present even for time series
+            # plots to allow the sharing of the x-axis between all plots
+            self.gs = gridspec.GridSpec(self.n_subplots, 2, width_ratios=[50, 1])
+
+            # Create first subplot
+            self.ax.append(self.fig.add_subplot(self.gs[self.fig_no]))
+            self.depths_beam_ts(b1, b2, b3, b4, vb, ds, leg=False)
+
+            self.fig_no += 2
+            # Create additional subplots as specified, sharing x axis y axis
+            self.ax.append(
+                self.fig.add_subplot(
+                    self.gs[self.fig_no], sharex=self.ax[0], sharey=self.ax[0]
+                )
+            )
+            self.depths_final_ts(
+                avg4_final=avg4_final, vb_final=vb_final, ds_final=ds_final, final=final
+            )
+
+            # Adjust the spacing of the subplots
+            self.fig.subplots_adjust(
+                left=0.05, bottom=0.07, right=0.99, top=0.95, wspace=0.02, hspace=0.08
+            )
+
+            # Apply the x-axis label to the bottom x-axis
+            idx = -1
+            self.ax[idx].xaxis.label.set_fontsize(12)
+            self.set_x_axis(idx)
+
+        self.canvas.draw()
+
+    def create_bt_tab_graphs(
+        self,
+        transect,
+        units,
+        beam=True,
+        error=False,
+        vert=False,
+        other=False,
+        source=False,
+        bt=True,
+        gga=False,
+        vtg=False,
+        x_axis_type="E",
+    ):
+        """Creates the plots for the bottom track tab.
+        This approach allows zoom and pan to work together for both plots.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Transect to plot
+        units: dict
+            Units selected
+        beam: bool
+            Indicates if number of beams is plotted
+        error: bool
+            Indicates if error velocity is plotted
+        vert: bool
+            Indicates if vertical velocity is plotted
+        other: bool
+            Indicates if other filter is plotted
+        source: bool
+            Indicates if the boat speed source is plotted
+        bt: bool
+            Indicates if the bottom track is plotted in shiptrack
+        gga: bool
+            Indicates if the gga track is plotted in the shiptrack
+        vtg: bool
+            Indicates if the vtg track is plotted in the shiptrack
+        x_axis_type: str
+            Specifies what variable (ensemble, length or time) to be used for
+             the x-axis
+        """
+        with self.wait_cursor():
+            # Initialize data sources
+            self.transect = transect
+
+            # Set x axis type and units
+            self.x_axis_type = x_axis_type
+            self.units = units
+
+            # Clear the plot
+            self.fig.clear()
+
+            # Determine number of subplots
+            self.n_subplots = 2
+
+            # Compute x-axis variable
+            self.compute_x_axis()
+
+            # Initialize variable for subplots
+            self.ax = []
+            self.annot = []
+            self.data_plotted = []
+
+            # Create grid specification
+            # Note: the second column of the grid is for the color bar.
+            # It is blank but present even for time series
+            # plots to allow the sharing of the x-axis between all plots
+            self.gs = gridspec.GridSpec(self.n_subplots, 2, width_ratios=[50, 1])
+
+            # Create first subplot
+            self.ax.append(self.fig.add_subplot(self.gs[self.fig_no]))
+            if beam:
+                self.bt_3beam_ts()
+            elif error:
+                self.bt_error_ts()
+            elif vert:
+                self.bt_vertical_ts()
+            elif other:
+                self.other_ts(data=self.transect.boat_vel.bt_vel, data_color="r-")
+            elif source:
+                ref = getattr(self.transect.boat_vel, self.transect.boat_vel.selected)
+                self.source_ts(ref, "Boat Source")
+
+            self.fig_no += 2
+            # Create boat speed subplots as specified, sharing x axis for
+            # all plots
+            self.ax.append(
+                self.fig.add_subplot(self.gs[self.fig_no], sharex=self.ax[0])
+            )
+            if bt:
+                self.bt_speed_ts(lbl="Boat speed")
+            if gga:
+                self.gga_speed_ts(lbl="Boat speed")
+            if vtg:
+                self.vtg_speed_ts(lbl="Boat speed")
+
+            # Adjust the spacing of the subplots
+            self.fig.subplots_adjust(
+                left=0.05, bottom=0.07, right=0.99, top=0.95, wspace=0.02, hspace=0.08
+            )
+
+            # Apply the x-axis label to the bottom x-axis
+            idx = -1
+            self.ax[idx].xaxis.label.set_fontsize(12)
+            self.set_x_axis(idx)
+
+        self.canvas.draw()
+
+    def create_gps_tab_graphs(
+        self,
+        transect,
+        units,
+        quality=True,
+        altitude=False,
+        hdop=False,
+        n_sats=False,
+        other=False,
+        source=False,
+        bt=True,
+        gga=False,
+        vtg=False,
+        x_axis_type="E",
+    ):
+        """Creates the plots for the bottom track tab.
+        This approach allows zoom and pan to work together for both plots.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Transect to plot
+        units: dict
+            Units selected
+        quality: bool
+            Indicates if gga quality is plotted
+        altitude: bool
+            Indicates if gga altitude is plotted
+        hdop: bool
+            Indicates if gga HDOP is plotted
+        n_sats: bool
+            Indicates if gga number of satellites is plotted
+        other: bool
+            Indicates if other filter is plotted
+        source: bool
+            Indicates if the boat speed source is plotted
+        bt: bool
+            Indicates if the bottom track is plotted in shiptrack
+        gga: bool
+            Indicates if the gga track is plotted in the shiptrack
+        vtg: bool
+            Indicates if the vtg track is plotted in the shiptrack
+        x_axis_type: str
+            Specifies what variable (ensemble, length or time) to be used
+            for the x-axis
+        """
+        with self.wait_cursor():
+
+            # Initialize data sources
+            self.transect = transect
+
+            # Set x axis type and units
+            self.x_axis_type = x_axis_type
+            self.units = units
+
+            # Clear the plot
+            self.fig.clear()
+
+            # Determine number of subplots
+            self.n_subplots = 2
+
+            # Compute x-axis variable
+            self.compute_x_axis()
+
+            # Initialize variable for subplots
+            self.ax = []
+            self.annot = []
+            self.data_plotted = []
+
+            # Create grid specification
+            # Note: the second column of the grid is for the color bar. It is
+            # blank but present even for time series plots to allow the sharing of
+            # the x-axis between all plots
+            self.gs = gridspec.GridSpec(self.n_subplots, 2, width_ratios=[50, 1])
+
+            # Create first subplot
+            self.ax.append(self.fig.add_subplot(self.gs[self.fig_no]))
+            if quality:
+                self.gga_quality_ts()
+            elif altitude:
+                self.gga_altitude_ts()
+            elif hdop:
+                self.gga_hdop_ts()
+            elif n_sats:
+                self.gga_sats_ts()
+            elif other:
+                # Select an object to use for the smooth
+                if self.transect.boat_vel.selected == "gga_vel":
+                    boat_gps = transect.boat_vel.gga_vel
+                    data_color = "b-"
+                elif self.transect.boat_vel.selected == "vtg_vel":
+                    boat_gps = transect.boat_vel.vtg_vel
+                    data_color = "g-"
+                elif self.transect.boat_vel.vtg_vel is not None:
+                    boat_gps = transect.boat_vel.vtg_vel
+                    data_color = "g-"
+                else:
+                    boat_gps = self.transect.boat_vel.gga_vel
+                    data_color = "b-"
+                self.other_ts(data=boat_gps, data_color=data_color)
+            elif source:
+                ref = getattr(self.transect.boat_vel, self.transect.boat_vel.selected)
+                self.source_ts(ref, "Boat Source")
+
+            self.fig_no += 2
+            # Create boat speed subplot as specified, sharing x axis
+            self.ax.append(
+                self.fig.add_subplot(self.gs[self.fig_no], sharex=self.ax[0])
+            )
+            if bt:
+                self.bt_speed_ts(lbl="Boat speed")
+            if gga:
+                self.gga_speed_ts(lbl="Boat speed")
+            if vtg:
+                self.vtg_speed_ts(lbl="Boat speed")
+
+            # Adjust the spacing of the subplots
+            self.fig.subplots_adjust(
+                left=0.05, bottom=0.07, right=0.99, top=0.95, wspace=0.02, hspace=0.08
+            )
+
+            # Apply the x-axis label to the bottom x-axis
+            idx = -1
+            self.ax[idx].xaxis.label.set_fontsize(12)
+            self.set_x_axis(idx)
+
+        self.canvas.draw()
+
+    def create_wt_tab_graphs(
+        self,
+        transect,
+        units,
+        contour=True,
+        beam=False,
+        error=False,
+        vert=False,
+        snr=False,
+        speed=False,
+        x_axis_type="E",
+        color_map="viridis",
+        discharge=None,
+    ):
+        """Creates the plots for the bottom track tab.
+        This approach allows zoom and pan to work together for both plots.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Transect to plot
+        units: dict
+            Units selected
+        contour: bool
+            Indicates if filtered contour is plotted
+        beam: bool
+            Indicates if number of beams is plotted
+        error: bool
+            Indicates if error velocity is plotted
+        vert: bool
+            Indicates if vertical velocity is plotted
+        snr: bool
+            Indicates if SNR is plotted
+        speed: bool
+            Indicates if the average water speed source is plotted
+        x_axis_type: str
+            Specifies what variable (ensemble, length or time) to be used for
+            the x-axis
+        color_map: str
+            Name of color map to be used for color contour plots
+        discharge: QComp
+            Object of QComp
+        """
+        with self.wait_cursor():
+
+            # Initialize data sources
+            self.transect = transect
+            self.discharge = discharge
+
+            if discharge is not None:
+                self.show_unmeasured = True
+            else:
+                self.show_unmeasured = False
+
+            # Set axis type and units
+            self.x_axis_type = x_axis_type
+            self.units = units
+            self.color_map = color_map
+
+            # Clear the plot
+            self.fig.clear()
+
+            # Determine number of subplots
+            self.n_subplots = 2
+
+            # Compute x-axis variable
+            self.compute_x_axis()
+
+            # Initialize variable for subplots
+            self.ax = []
+            self.annot = []
+            self.data_plotted = []
+
+            # Create grid specification
+            # Note: the second column of the grid is for the color bar. It is
+            # blank but present even for time series plots to allow the sharing
+            # of the x-axis between all plots
+            self.gs = gridspec.GridSpec(self.n_subplots, 2, width_ratios=[50, 1])
+
+            # Create first subplot
+            self.ax.append(self.fig.add_subplot(self.gs[self.fig_no]))
+            if contour:
+                self.wt_speed_filtered_contour()
+            elif beam:
+                self.wt_3beam_ts()
+            elif error:
+                self.wt_error_ts()
+            elif vert:
+                self.wt_vertical_ts()
+            elif snr:
+                self.wt_snr_ts()
+            elif speed:
+                self.wt_avg_speed_ts()
+
+            self.fig_no += 2
+            # Create additional subplots as specified, sharing x axis for all
+            # plots and also y axis for contour plots
+            if contour:
+                self.ax.append(
+                    self.fig.add_subplot(
+                        self.gs[self.fig_no], sharex=self.ax[0], sharey=self.ax[0]
+                    )
+                )
+            else:
+                self.ax.append(
+                    self.fig.add_subplot(self.gs[self.fig_no], sharex=self.ax[0])
+                )
+            self.wt_speed_final_contour()
+
+            # Adjust the spacing of the subplots
+            self.fig.subplots_adjust(
+                left=0.05, bottom=0.07, right=0.92, top=0.95, wspace=0.02, hspace=0.08
+            )
+
+            # Apply the x-axis label to the bottom x-axis
+            idx = -2
+            self.ax[idx].xaxis.label.set_fontsize(12)
+            self.set_x_axis(idx)
+
+        self.canvas.draw()
+
+    def create_edge_contour(
+        self, transect, units, x_axis_type, color_map, n_ensembles, edge
+    ):
+        """Create edge contour plots.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        units: dict
+            Dictionary of units labels and conversions
+        x_axis_type: str
+            Indicates type of x-axis (E, L, T)
+        color_map: str
+            Indicates colormap to use (viridis or jet)
+        n_ensembles: int
+            Number of ensembles in the edge
+        edge: str
+            Edge, Left or Right
+        """
+
+        with self.wait_cursor():
+
+            # Initialize data sources
+            self.transect = transect
+
+            # Set axis type and units
+            self.x_axis_type = x_axis_type
+            self.units = units
+            self.color_map = color_map
+
+            # Clear the plot
+            self.fig.clear()
+
+            # Determine number of subplots
+            self.n_subplots = 1
+
+            # Compute x-axis variable
+            self.compute_x_axis()
+
+            # Initialize variable for subplots
+            self.ax = []
+            self.annot = []
+            self.data_plotted = []
+
+            # Create grid specification
+            # Note: the second column of the grid is for the color bar. It is
+            # blank but present even for time series plots to allow the sharing
+            # of the x-axis between all plots
+            self.gs = gridspec.GridSpec(self.n_subplots, 2, width_ratios=[50, 1])
+
+            # Create first subplot
+            self.ax.append(self.fig.add_subplot(self.gs[self.fig_no]))
+
+            # Compute water speed for each cell
+            water_u = self.transect.w_vel.u_processed_mps[
+                :, self.transect.in_transect_idx
+            ]
+            water_v = self.transect.w_vel.v_processed_mps[
+                :, self.transect.in_transect_idx
+            ]
+            water_speed = np.sqrt(water_u**2 + water_v**2)
+            water_speed[
+                np.logical_not(self.transect.w_vel.valid_data[0, :, :])
+            ] = np.nan
+
+            # Set the 1-dimensional x-axis data based on selected x-axis type.
+            # Timestamp must be used for time
+            if self.x_axis_type == "T":
+                x_1d = np.copy(self.x_timestamp)
+            else:
+                x_1d = np.copy(self.x)
+
+            # Compute data for contour plot
+            (
+                x_plt,
+                cell_plt,
+                data_plt,
+                ensembles,
+                depth,
+                self.x,
+            ) = self.contour_data_prep(
+                transect=self.transect,
+                data=water_speed,
+                x_1d=x_1d,
+                n_ensembles=n_ensembles,
+                edge=edge,
+            )
+
+            # Plot data
+            self.plt_contour(
+                x_plt_in=x_plt,
+                cell_plt_in=cell_plt,
+                data_plt_in=data_plt,
+                x=self.x,
+                depth=depth,
+                data_units=(
+                    self.units["V"],
+                    "Filtered \n Speed " + self.units["label_V"],
+                ),
+                n_ensembles=n_ensembles,
+                edge=edge,
+            )
+
+            # Apply the x-axis label to the bottom x-axis
+            idx = -2
+            self.ax[idx].xaxis.label.set_fontsize(12)
+
+            self.set_x_axis(idx)
+
+            self.canvas.draw()
+
+    def set_x_axis(self, idx):
+        """Configures the x-axis.
+
+        Parameters
+        ----------
+        idx = int
+            Axis number to apply x-axis configuration to.
+        """
+
+        # x-axis is length
+        if self.x_axis_type == "L":
+            if self.expanded_x is not None:
+                x = self.expanded_x
+            else:
+                x = self.x
+
+            x_max = np.nanmax(x) * self.units["L"]
+            x_min = np.nanmin(x) * self.units["L"]
+
+            axis_buffer = x_max - x_min
+            if self.transect.start_edge == "Right":
+                self.ax[idx].invert_xaxis()
+                self.ax[idx].set_xlim(
+                    right=x_min - axis_buffer * 0.02,
+                    left=x_max + axis_buffer * 0.02,
+                )
+            else:
+                self.ax[idx].set_xlim(
+                    left=x_min - axis_buffer * 0.02,
+                    right=x_max + axis_buffer * 0.02,
+                )
+            self.ax[idx].set_xlabel(self.canvas.tr("Length " + self.units["label_L"]))
+
+        # x-axis is ensembles
+        elif self.x_axis_type == "E":
+            e_rng = np.nanmax(self.x) - np.nanmin(self.x)
+            e_max = np.nanmax([np.nanmax(self.x) + 1, np.nanmax(self.x) + e_rng * 0.02])
+            e_min = np.nanmin([np.nanmin(self.x) - 1, np.nanmin(self.x) - e_rng * 0.02])
+            if self.transect.start_edge == "Right":
+                self.ax[idx].invert_xaxis()
+                self.ax[idx].set_xlim(right=e_min, left=e_max)
+            else:
+                self.ax[idx].set_xlim(left=e_min, right=e_max)
+            self.ax[idx].set_xlabel(self.canvas.tr("Ensembles"))
+
+        # x-axis is time
+        elif self.x_axis_type == "T":
+            axis_buffer = (self.x_timestamp[-1] - self.x_timestamp[0]) * 0.02
+            if self.transect.start_edge == "Right":
+                self.ax[idx].invert_xaxis()
+                self.ax[idx].set_xlim(
+                    right=datetime.utcfromtimestamp(self.x_timestamp[0] - axis_buffer),
+                    left=datetime.utcfromtimestamp(self.x_timestamp[-1] + axis_buffer),
+                )
+            else:
+                self.ax[idx].set_xlim(
+                    left=datetime.utcfromtimestamp(self.x_timestamp[0] - axis_buffer),
+                    right=datetime.utcfromtimestamp(self.x_timestamp[-1] + axis_buffer),
+                )
+            date_form = DateFormatter("%H:%M:%S")
+            self.ax[idx].xaxis.set_major_formatter(date_form)
+            self.ax[idx].set_xlabel(self.canvas.tr("Time"))
+
+    def wt_avg_corr_contour(self):
+        """Creates average correlation contour plot."""
+
+        # Compute average of correlation data for each cel
+        data = np.nanmean(self.transect.w_vel.corr, axis=0)
+        if not self.show_below_sl:
+            data[np.logical_not(self.transect.w_vel.cells_above_sl)] = np.nan
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        # Compute data for contour plot
+        x_plt, cell_plt, data_plt, ensembles, depth, self.x = self.contour_data_prep(
+            self.transect, data, x_1d=x_1d
+        )
+
+        # Plot the data
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(1, "Correlation \n (counts)"),
+        )
+
+    def wt_avg_rssi_contour(self):
+        """Creates average return signal strength or SNR contour plot."""
+
+        # Compute mean signal strength for each cell
+        data = np.nanmean(self.transect.w_vel.rssi, axis=0)
+        if not self.show_below_sl:
+            data[np.logical_not(self.transect.w_vel.cells_above_sl)] = np.nan
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        # Compute data for contour plot
+        x_plt, cell_plt, data_plt, ensembles, depth, self.x = self.contour_data_prep(
+            self.transect, data, x_1d=x_1d
+        )
+
+        # Create label based on manufacturer
+        if self.transect.adcp.manufacturer == "TRDI":
+            data_label = "Intensity \n (counts)"
+        elif self.transect.adcp.manufacturer == "SonTek":
+            data_label = "SNR (dB)"
+        else:
+            data_label = "Intensity"
+
+        # Plot data
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(1, data_label),
+        )
+
+    def wt_avg_speed_ts(self):
+        """Create average water speed time series plot."""
+
+        # Compute mean water speed for each ensemble using a weighted
+        # average based on depth cell size
+        water_u = self.transect.w_vel.u_processed_mps[:, self.transect.in_transect_idx]
+        water_v = self.transect.w_vel.v_processed_mps[:, self.transect.in_transect_idx]
+        depth_selected = getattr(self.transect.depths, self.transect.depths.selected)
+
+        weight = depth_selected.depth_cell_size_m[:, self.transect.in_transect_idx]
+        weight[np.isnan(water_u)] = np.nan
+
+        mean_u = np.nansum(water_u * weight, axis=0) / np.nansum(weight, axis=0)
+        mean_v = np.nansum(water_v * weight, axis=0) / np.nansum(weight, axis=0)
+        avg_speed = np.sqrt(mean_u**2 + mean_v**2)
+
+        # Plot data
+        data_units = (self.units["V"], "Water speed " + self.units["label_V"])
+        self.plt_timeseries(data=avg_speed, data_units=data_units, ax=self.ax[-1])
+
+    def wt_corr_beam_contour(self):
+        """Create contour plots of the correlation in each beam."""
+
+        # Create data to be plotted
+        data_all = np.copy(self.transect.w_vel.corr)
+        if not self.show_below_sl:
+            for n in range(data_all.shape[0]):
+                data_all[n, np.logical_not(self.transect.w_vel.cells_above_sl)] = np.nan
+
+        # Compute the minimum and maximum limits based on all the correlations
+        # so each beam has the same color scale
+        data_limits = [np.nanmin(data_all), np.nanmax(data_all)]
+
+        # Get data for beam 1
+        data = data_all[0, :, :]
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        # Compute data for contour plot
+        x_plt, cell_plt, data_plt, ensembles, depth, self.x = self.contour_data_prep(
+            self.transect, data, x_1d=x_1d
+        )
+
+        # Plot data
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(1, "Beam 1 Corr. \n (counts)"),
+            data_limits=data_limits,
+        )
+
+        # Prepare and plot beams 2-4
+        for n in range(1, 4):
+            # Figure number increases by 2 to account for 2nd column in
+            # gridspec used for color bar
+            self.fig_no += 2
+
+            # Add subplot
+            self.ax.append(
+                self.fig.add_subplot(
+                    self.gs[self.fig_no], sharex=self.ax[0], sharey=self.ax[0]
+                )
+            )
+
+            # Get data for beam n+1
+            data = data_all[n, :, :]
+
+            # Compute data for contour plot
+            (
+                x_plt,
+                cell_plt,
+                data_plt,
+                ensembles,
+                depth,
+                self.x,
+            ) = self.contour_data_prep(self.transect, data, x_1d=x_1d)
+
+            # Plot data
+            self.plt_contour(
+                x_plt_in=x_plt,
+                cell_plt_in=cell_plt,
+                data_plt_in=data_plt,
+                x=self.x,
+                depth=depth,
+                data_units=(1, "Beam " + str(n + 1) + " Corr. \n (counts)"),
+                data_limits=data_limits,
+            )
+
+    def wt_direction_contour(self):
+        """Create flow direction contour plot."""
+
+        # Compute flow direction using discharge weighting
+        u_water = self.transect.w_vel.u_processed_mps[:, self.transect.in_transect_idx]
+        v_water = self.transect.w_vel.v_processed_mps[:, self.transect.in_transect_idx]
+        water_dir = np.arctan2(u_water, v_water) * 180 / np.pi
+        water_dir[water_dir < 0] = water_dir[water_dir < 0] + 360
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        # Compute data for contour plot
+        x_plt, cell_plt, data_plt, ensembles, depth, self.x = self.contour_data_prep(
+            self.transect, water_dir, x_1d=x_1d
+        )
+
+        # Plot data
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(1, "Water Direction \n (deg)"),
+        )
+
+    def discharge_ts(self):
+        """Create cumulative discharge time series by ensemble."""
+
+        # Prepare data so that data will plot from left bank to right bank
+        if self.transect.start_edge == "Right":
+            q_ts = (
+                self.discharge.top_ens
+                + self.discharge.middle_ens
+                + self.discharge.bottom_ens
+            )
+            q_ts = np.nancumsum(q_ts)
+            q_ts[0] = q_ts[0] + self.discharge.right
+            q_ts[-1] = q_ts[-1] + self.discharge.left
+        else:
+            q_ts = (
+                self.discharge.top_ens
+                + self.discharge.middle_ens
+                + self.discharge.bottom_ens
+            )
+            q_ts = np.nancumsum(q_ts)
+            q_ts[0] = q_ts[0] + self.discharge.left
+            q_ts[-1] = q_ts[-1] + self.discharge.right
+
+        # Plot data
+        data_units = (self.units["Q"], "Discharge " + self.units["label_Q"])
+        self.plt_timeseries(data=q_ts, data_units=data_units, ax=self.ax[-1])
+
+    def discharge_percent_ts(self):
+        """Create plot of cumulative percent discharge by ensemble."""
+
+        # Prepare data so that data will plot from left bank to right bank
+        if self.transect.start_edge == "Right":
+            q_ts = (
+                self.discharge.top_ens
+                + self.discharge.middle_ens
+                + self.discharge.bottom_ens
+            )
+            q_ts = np.nancumsum(q_ts)
+            q_ts[0] = q_ts[0] + self.discharge.right
+            q_ts[-1] = q_ts[-1] + self.discharge.left
+        else:
+            q_ts = (
+                self.discharge.top_ens
+                + self.discharge.middle_ens
+                + self.discharge.bottom_ens
+            )
+            q_ts = np.nancumsum(q_ts)
+            q_ts[0] = q_ts[0] + self.discharge.left
+            q_ts[-1] = q_ts[-1] + self.discharge.right
+
+        # Compute percent of total
+        q_ts_per = (q_ts / self.discharge.total) * 100
+
+        # Plot data
+        data_units = (1, "Discharge (%)")
+        self.plt_timeseries(data=q_ts_per, data_units=data_units, ax=self.ax[-1])
+
+    def wt_error_contour(self):
+        """Create contour plot of error velocities."""
+
+        # Get data
+        data = self.transect.w_vel.d_mps
+        data[np.logical_not(self.transect.w_vel.cells_above_sl)] = np.nan
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        # Compute data for contour plot
+        x_plt, cell_plt, data_plt, ensembles, depth, self.x = self.contour_data_prep(
+            self.transect, data, x_1d=x_1d
+        )
+
+        # Plot data
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(self.units["V"], "Error Velocity \n" + self.units["label_V"]),
+        )
+
+    def wt_projected_contour(self):
+        """Create contour plot of water speed projected in flow direction."""
+
+        # Compute projected water speed
+        unit_vector = np.array(
+            [[sind(self.flow_direction)], [cosd(self.flow_direction)]]
+        )
+        water_u = self.transect.w_vel.u_processed_mps[:, self.transect.in_transect_idx]
+        water_v = self.transect.w_vel.v_processed_mps[:, self.transect.in_transect_idx]
+        projected_speed = unit_vector[0] * water_u + unit_vector[1] * water_v
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        # Compute data for contour plot
+        x_plt, cell_plt, data_plt, ensembles, depth, self.x = self.contour_data_prep(
+            self.transect, projected_speed, x_1d=x_1d
+        )
+
+        # Plot data
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(self.units["V"], "Projected \n Speed" + self.units["label_V"]),
+        )
+
+    def wt_projected_speed_ts(self):
+        """Create time series plot of projected water speed."""
+
+        # Compute projected water speed for each cell
+        unit_vector = np.array(
+            [[sind(self.flow_direction)], [cosd(self.flow_direction)]]
+        )
+        water_u = self.transect.w_vel.u_processed_mps[:, self.transect.in_transect_idx]
+        water_v = self.transect.w_vel.v_processed_mps[:, self.transect.in_transect_idx]
+        projected_speed = unit_vector[0] * water_u + unit_vector[1] * water_v
+
+        # Compute the mean projected speed in each ensemble using depth cell
+        # size weighting
+        depth_selected = getattr(self.transect.depths, self.transect.depths.selected)
+        weight = depth_selected.depth_cell_size_m[:, self.transect.in_transect_idx]
+        weight[np.isnan(projected_speed)] = np.nan
+        avg_speed = np.nansum(projected_speed * weight, axis=0) / np.nansum(
+            weight, axis=0
+        )
+
+        # Plot data
+        data_units = (self.units["V"], "Projected Speed " + self.units["label_V"])
+        self.plt_timeseries(data=avg_speed, data_units=data_units, ax=self.ax[-1])
+
+    def wt_rssi_beam_contour(self):
+        """Create contour plot of the signal intensity for each beam."""
+
+        # Set label and units based on data available by manufacturer
+        if self.transect.adcp.manufacturer == "TRDI":
+            data_label = "\n RSSI (counts)"
+        elif self.transect.adcp.manufacturer == "SonTek":
+            data_label = "\n SNR (dB)"
+        else:
+            data_label = "\n Intensity"
+
+        # Create data to be plotted
+        data_all = np.copy(self.transect.w_vel.rssi)
+        if not self.show_below_sl:
+            for n in range(data_all.shape[0]):
+                data_all[n, np.logical_not(self.transect.w_vel.cells_above_sl)] = np.nan
+
+        # Determine limits for all data so a common scale can be used for all
+        # 4 plots
+        data_limits = [np.nanmin(data_all), np.nanmax(data_all)]
+
+        # Get data for beam 1
+        data = data_all[0, :, :]
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        # Compute data for contour plot
+        x_plt, cell_plt, data_plt, ensembles, depth, self.x = self.contour_data_prep(
+            self.transect, data, x_1d=x_1d
+        )
+
+        # Plot data
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(1, "Beam 1" + data_label),
+            data_limits=data_limits,
+        )
+
+        # Prepare and plot data for beams 2-4
+        for n in range(1, 4):
+            self.fig_no += 2
+            self.ax.append(
+                self.fig.add_subplot(
+                    self.gs[self.fig_no], sharex=self.ax[0], sharey=self.ax[0]
+                )
+            )
+            data = data_all[n, :, :]
+            (
+                x_plt,
+                cell_plt,
+                data_plt,
+                ensembles,
+                depth,
+                self.x,
+            ) = self.contour_data_prep(self.transect, data, x_1d=x_1d)
+            self.plt_contour(
+                x_plt_in=x_plt,
+                cell_plt_in=cell_plt,
+                data_plt_in=data_plt,
+                x=self.x,
+                depth=depth,
+                data_units=(1, "Beam " + str(n + 1) + data_label),
+                data_limits=data_limits,
+            )
+
+    def wt_speed_filtered_contour(self):
+        """Create contour of water speed with no interpolation for invalid
+        water data.
+        """
+
+        # Compute water speed for each cell
+        water_u = self.transect.w_vel.u_processed_mps[:, self.transect.in_transect_idx]
+        water_v = self.transect.w_vel.v_processed_mps[:, self.transect.in_transect_idx]
+        water_speed = np.sqrt(water_u**2 + water_v**2)
+        water_speed[np.logical_not(self.transect.w_vel.valid_data[0, :, :])] = np.nan
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        # Compute data for contour plot
+        x_plt, cell_plt, data_plt, ensembles, depth, self.x = self.contour_data_prep(
+            self.transect, water_speed, x_1d=x_1d
+        )
+
+        # Plot data
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(self.units["V"], "Filtered \n Speed " + self.units["label_V"]),
+        )
+
+    def wt_speed_final_contour(self):
+        """Contour plot of water speed with interpolation for invalid data."""
+
+        # Compute water speed for each cell
+        water_u = self.transect.w_vel.u_processed_mps[:, self.transect.in_transect_idx]
+        water_v = self.transect.w_vel.v_processed_mps[:, self.transect.in_transect_idx]
+        water_speed = np.sqrt(water_u**2 + water_v**2)
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        # If discharge data are provided, expanded data with extrapolated values
+        if self.show_unmeasured and self.x_axis_type == "L":
+            (
+                expanded_cell_size,
+                expanded_cell_depth,
+                expanded_water_speed,
+            ) = self.add_extrapolated_topbot(water_speed)
+            # Compute data for contour plot
+            (
+                x_plt,
+                cell_plt,
+                data_plt,
+                ensembles,
+                depth,
+                self.x,
+            ) = self.contour_data_prep(
+                self.transect,
+                expanded_water_speed,
+                x_1d=x_1d,
+                cell_depth=expanded_cell_depth,
+                cell_size=expanded_cell_size,
+            )
+        else:
+            # Compute data for contour plot
+            (
+                x_plt,
+                cell_plt,
+                data_plt,
+                ensembles,
+                depth,
+                self.x,
+            ) = self.contour_data_prep(self.transect, water_speed, x_1d=x_1d)
+
+        # Plot data
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(
+                self.units["V"],
+                "Interpolated \n Speed " + self.units["label_V"],
+            ),
+            show_edge_speed=self.show_unmeasured,
+        )
+
+    def wt_vertical_contour(self):
+        """Create contour plot of vertical velocities."""
+
+        # Get data
+        data = np.copy(self.transect.w_vel.w_mps)
+        data[np.logical_not(self.transect.w_vel.cells_above_sl)] = np.nan
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        # Compute data for contour plot
+        x_plt, cell_plt, data_plt, ensembles, depth, self.x = self.contour_data_prep(
+            self.transect, data, x_1d=x_1d
+        )
+
+        # Plot data
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(
+                self.units["V"],
+                "Vertical \n Velocity" + self.units["label_V"],
+            ),
+        )
+
+    def wt_ping_type(self):
+        """Create plot showing ping type."""
+
+        # Get data
+        data = np.copy(self.transect.w_vel.w_mps)
+        data[np.logical_not(self.transect.w_vel.cells_above_sl)] = np.nan
+
+        # Set the 1-dimensional x-axis data based on selected x-axis type.
+        # Timestamp must be used for time
+        if self.x_axis_type == "T":
+            x_1d = np.copy(self.x_timestamp)
+        else:
+            x_1d = np.copy(self.x)
+
+        ping_type = self.transect.w_vel.ping_type
+        p_types = np.unique(ping_type)
+        ping_name = {}
+        n = 0
+        for p_type in p_types:
+            ping_name[n] = self.ping_type_long_name[p_type]
+            data[ping_type == p_type] = n
+            n = n + 1
+
+        data[np.logical_not(self.transect.w_vel.cells_above_sl)] = np.nan
+
+        # Compute data for contour plot
+        x_plt, cell_plt, data_plt, ensembles, depth, self.x = self.contour_data_prep(
+            self.transect, data, x_1d=x_1d
+        )
+
+        # Plot data
+        cmap = self.color_map
+        self.ping_name = ping_name
+        self.plt_contour(
+            x_plt_in=x_plt,
+            cell_plt_in=cell_plt,
+            data_plt_in=data_plt,
+            x=self.x,
+            depth=depth,
+            data_units=(1, "WT Ping Type"),
+            cmap_in=cmap,
+            ping_name=ping_name,
+            n_names=len(p_types),
+        )
+
+        self.data_plotted[-2]["type"] = "ping type"
+
+    def wt_3beam_ts(self):
+        """Create time series plot of WT beams used."""
+
+        # Determine number of beams for each ensemble
+        wt_temp = copy.deepcopy(self.transect.w_vel)
+        wt_temp.filter_beam(4)
+        valid_4beam = wt_temp.valid_data[5, :, :].astype(int)
+        beam_data = np.copy(valid_4beam).astype(int)
+        beam_data[valid_4beam == 1] = 4
+        beam_data[wt_temp.valid_data[6, :, :]] = 4
+        beam_data[valid_4beam == 0] = 3
+        beam_data[np.logical_not(self.transect.w_vel.valid_data[1, :, :])] = -999
+
+        # Configure plot settings
+        hold_x = np.copy(self.x)
+        self.x = np.tile(self.x, (self.transect.w_vel.valid_data[0, :, :].shape[0], 1))
+        invalid = np.logical_and(
+            np.logical_not(self.transect.w_vel.valid_data[5, :, :]),
+            self.transect.w_vel.cells_above_sl,
+        )
+        fmt = [
+            {"color": "b", "linestyle": "", "marker": "."},
+            {"color": "r", "linestyle": "", "marker": "o", "markerfacecolor": "none"},
+        ]
+        data_units = (1, "WT Number of Beams ")
+        data_mask = [[], invalid]
+
+        # Plot data
+        self.plt_timeseries(
+            data=beam_data,
+            data_units=data_units,
+            ax=self.ax[-1],
+            data_2=beam_data,
+            data_mask=data_mask,
+            fmt=fmt,
+        )
+        self.x = hold_x
+
+        # Format axis
+        self.ax[-1].set_ylim(top=4.5, bottom=-0.5)
+
+    def wt_error_ts(self):
+        """Create time series plot of WT error velocity."""
+
+        # Plot error velocity
+        invalid = np.logical_and(
+            np.logical_not(self.transect.w_vel.valid_data[2, :, :]),
+            self.transect.w_vel.cells_above_sl,
+        )
+
+        # Data to plot
+        hold_x = np.copy(self.x)
+        self.x = np.tile(self.x, (self.transect.w_vel.valid_data[0, :, :].shape[0], 1))
+        self.x = self.x[self.transect.w_vel.cells_above_sl]
+        y_data = self.transect.w_vel.d_mps[self.transect.w_vel.cells_above_sl]
+
+        data_units = (self.units["V"], "WT Error Vel " + self.units["label_V"])
+
+        # Setup ping type
+        if self.transect.w_vel.ping_type.size > 1:
+            ping_type = self.transect.w_vel.ping_type[
+                self.transect.w_vel.cells_above_sl
+            ]
+            ping_type_used = np.unique(ping_type)
+
+            p_types = np.unique(ping_type)
+
+            data_mask = []
+            fmt = []
+            for pt in ping_type_used:
+                data_mask.append(ping_type == pt)
+                fmt.append(
+                    {
+                        "marker": self.p_type_marker[pt],
+                        "linestyle": "",
+                        "mfc": self.p_type_color[pt],
+                        "mec": self.p_type_color[pt],
+                    }
+                )
+
+            data_mask.append(invalid[self.transect.w_vel.cells_above_sl])
+            fmt.append(
+                {"marker": "o", "color": "r", "ms": 8, "linestyle": "", "mfc": "none"}
+            )
+
+            # Plot
+            self.plt_timeseries(
+                data=None,
+                data_units=data_units,
+                ax=self.ax[-1],
+                data_2=y_data,
+                data_mask=data_mask,
+                fmt=fmt,
+            )
+
+        else:
+            fmt = [
+                {
+                    "marker": ".",
+                    "color": "b",
+                    "ms": 8,
+                    "linestyle": "",
+                    "mfc": "b",
+                    "mec": "b",
+                },
+                {"marker": "o", "color": "r", "ms": 8, "linestyle": "", "mfc": "none"},
+            ]
+            p_types = ["U"]
+            data_mask = [[], invalid]
+
+            # Plot first ping type
+            self.plt_timeseries(
+                data=y_data,
+                data_units=data_units,
+                ax=self.ax[-1],
+                data_2=y_data,
+                data_mask=data_mask,
+                fmt=fmt,
+            )
+        self.x = hold_x
+
+        # Create legend
+        legend_txt = []
+        for p_type in p_types:
+            legend_txt.append(self.wt_legend_dict[p_type])
+
+        clean_legend = []
+        for item in legend_txt:
+            if item not in clean_legend:
+                clean_legend.append(item)
+
+        self.ax[-1].legend(clean_legend)
+
+    def wt_vertical_ts(self):
+        """Create time series plot of WT vertical velocity."""
+
+        # Plot vertical velocity
+        invalid = np.logical_and(
+            np.logical_not(self.transect.w_vel.valid_data[3, :, :]),
+            self.transect.w_vel.cells_above_sl,
+        )
+
+        # Data to plot
+        hold_x = np.copy(self.x)
+        self.x = np.tile(self.x, (self.transect.w_vel.valid_data[0, :, :].shape[0], 1))
+        self.x = self.x[self.transect.w_vel.cells_above_sl]
+        y_data = (
+            self.transect.w_vel.w_mps[self.transect.w_vel.cells_above_sl]
+        )
+
+        data_units = (self.units["V"], "WT Vert. Vel " + self.units["label_V"])
+
+        # Setup ping type
+        if self.transect.w_vel.ping_type.size > 1:
+            ping_type = self.transect.w_vel.ping_type[
+                self.transect.w_vel.cells_above_sl
+            ]
+            ping_type_used = np.unique(ping_type)
+
+            p_types = np.unique(ping_type)
+
+            data_mask = []
+            fmt = []
+            for pt in ping_type_used:
+                data_mask.append(ping_type == pt)
+                fmt.append(
+                    {
+                        "marker": self.p_type_marker[pt],
+                        "linestyle": "",
+                        "mfc": self.p_type_color[pt],
+                        "mec": self.p_type_color[pt],
+                    }
+                )
+
+            data_mask.append(invalid[self.transect.w_vel.cells_above_sl])
+            fmt.append(
+                {"marker": "o", "color": "r", "ms": 8, "linestyle": "", "mfc": "none"}
+            )
+
+            # Plot
+            self.plt_timeseries(
+                data=None,
+                data_units=data_units,
+                ax=self.ax[-1],
+                data_2=y_data,
+                data_mask=data_mask,
+                fmt=fmt,
+            )
+
+        else:
+            fmt = [
+                {
+                    "marker": ".",
+                    "color": "b",
+                    "ms": 8,
+                    "linestyle": "",
+                    "mfc": "b",
+                    "mec": "b",
+                },
+                {"marker": "o", "color": "r", "ms": 8, "linestyle": "", "mfc": "none"},
+            ]
+            p_types = ["U"]
+            data_mask = [[], invalid]
+
+            # Plot first ping type
+            self.plt_timeseries(
+                data=y_data,
+                data_units=data_units,
+                ax=self.ax[-1],
+                data_2=y_data,
+                data_mask=data_mask,
+                fmt=fmt,
+            )
+        self.x = hold_x
+
+        # Create legend
+        legend_txt = []
+        for p_type in p_types:
+            legend_txt.append(self.wt_legend_dict[p_type])
+
+        clean_legend = []
+        for item in legend_txt:
+            if item not in clean_legend:
+                clean_legend.append(item)
+
+        self.ax[-1].legend(clean_legend)
+
+    def wt_snr_ts(self):
+        """Create time series plot of WT SNR range."""
+
+        # Plot vertical velocity
+        invalid = np.logical_and(
+            np.logical_not(self.transect.w_vel.valid_data[7, :, :]),
+            self.transect.w_vel.cells_above_sl,
+        )[0, :]
+
+        # Data to plot
+        y_data = self.transect.w_vel.snr_rng
+        data_units = (1, "WT SNR Range (dB)")
+
+        # Setup ping type
+        if self.transect.w_vel.ping_type.size > 1:
+            ping_type = self.transect.w_vel.ping_type[0, :]
+            ping_type_used = np.unique(ping_type)
+
+            p_types = np.unique(ping_type)
+
+            data_mask = []
+            fmt = []
+            for pt in ping_type_used:
+                data_mask.append(ping_type == pt)
+                fmt.append(
+                    {
+                        "marker": self.p_type_marker[pt],
+                        "linestyle": "",
+                        "mfc": self.p_type_color[pt],
+                        "mec": self.p_type_color[pt],
+                    }
+                )
+
+            data_mask.append(invalid)
+            fmt.append(
+                {"marker": "o", "color": "r", "ms": 8, "linestyle": "", "mfc": "none"}
+            )
+
+            # Plot
+            self.plt_timeseries(
+                data=None,
+                data_units=data_units,
+                ax=self.ax[-1],
+                data_2=y_data,
+                data_mask=data_mask,
+                fmt=fmt,
+            )
+
+        else:
+            fmt = [
+                {
+                    "marker": ".",
+                    "color": "b",
+                    "ms": 8,
+                    "linestyle": "",
+                    "mfc": "b",
+                    "mec": "b",
+                },
+                {"marker": "o", "color": "r", "ms": 8, "linestyle": "", "mfc": "none"},
+            ]
+            p_types = ["U"]
+            data_mask = [[], invalid]
+
+            # Plot first ping type
+            self.plt_timeseries(
+                data=y_data,
+                data_units=data_units,
+                ax=self.ax[-1],
+                data_2=y_data,
+                data_mask=data_mask,
+                fmt=fmt,
+            )
+
+        # Create legend
+        legend_txt = []
+        for p_type in p_types:
+            legend_txt.append(self.wt_legend_dict[p_type])
+
+        clean_legend = []
+        for item in legend_txt:
+            if item not in clean_legend:
+                clean_legend.append(item)
+
+        self.ax[-1].legend(clean_legend)
+
+    def bt_speed_ts(self, lbl="BT Speed"):
+        """Create time series plot of BT speed."""
+
+        # Prepare data
+        data = np.sqrt(
+            self.transect.boat_vel.bt_vel.u_processed_mps**2
+            + self.transect.boat_vel.bt_vel.v_processed_mps**2
+        )
+        invalid = np.logical_not(self.transect.boat_vel.bt_vel.valid_data)
+        data_invalid = np.sqrt(
+            self.transect.boat_vel.bt_vel.u_mps**2
+            + self.transect.boat_vel.bt_vel.v_mps**2
+        )
+        data_invalid[np.isnan(data_invalid)] = 0
+
+        # Specify format
+        fmt = [
+            {"color": "r", "linestyle": "-"},
+            {"color": "k", "linestyle": "", "marker": "$O$"},
+            {"color": "k", "linestyle": "", "marker": "$E$"},
+            {"color": "k", "linestyle": "", "marker": "$V$"},
+            {"color": "k", "linestyle": "", "marker": "$S$"},
+            {"color": "k", "linestyle": "", "marker": "$B$"},
+        ]
+
+        data_units = (self.units["V"], lbl + " " + self.units["label_V"])
+        self.plt_timeseries(
+            data=data,
+            data_units=data_units,
+            ax=self.ax[-1],
+            data_2=data_invalid,
+            data_mask=invalid,
+            fmt=fmt,
+        )
+
+    def bt_3beam_ts(self):
+        """Create time series plot of BT number of beams."""
+
+        # Determine number of beams for each ensemble
+        bt_temp = copy.deepcopy(self.transect.boat_vel.bt_vel)
+        bt_temp.filter_beam(4)
+        valid_4beam = bt_temp.valid_data[5, :].astype(int)
+        data = np.copy(valid_4beam).astype(int)
+        data[valid_4beam == 1] = 4
+        data[valid_4beam == 0] = 3
+        data[np.logical_not(self.transect.boat_vel.bt_vel.valid_data[1, :])] = 0
+
+        # Configure plot settings
+        invalid = np.logical_not(
+            self.transect.boat_vel.bt_vel.valid_data[5, :]
+        ).tolist()
+        fmt = [
+            {"color": "b", "linestyle": "", "marker": "."},
+            {"color": "r", "linestyle": "", "marker": "o", "markerfacecolor": "none"},
+        ]
+        data_units = (1, "Number of Beams ")
+        data_mask = [[], invalid]
+
+        # Plot data
+        self.plt_timeseries(
+            data=data,
+            data_units=data_units,
+            ax=self.ax[-1],
+            data_2=data,
+            data_mask=data_mask,
+            fmt=fmt,
+        )
+        self.ax[-1].set_ylim(top=4.5, bottom=-0.5)
+
+    def bt_error_ts(self):
+        """Create time series plot of BT error velocity."""
+
+        # Plot error velocity
+        y_data = self.transect.boat_vel.bt_vel.d_mps
+        invalid = np.logical_not(
+            self.transect.boat_vel.bt_vel.valid_data[2, :]
+        ).tolist()
+        data_units = (self.units["V"], "BT Error Vel " + self.units["label_V"])
+
+        # Specify format
+        if self.transect.boat_vel.bt_vel.ping_type is None:
+            freq_used = (
+                np.unique(self.transect.boat_vel.bt_vel.frequency_khz)
+                .astype(int)
+                .astype(str)
+            )
+            freq_ensembles = self.transect.boat_vel.bt_vel.frequency_khz.astype(
+                int
+            ).astype(str)
+            marker_dict = self.freq_marker
+            color_dict = self.freq_color
+        else:
+            freq_used = np.unique(self.transect.boat_vel.bt_vel.ping_type)
+
+            freq_ensembles = self.transect.boat_vel.bt_vel.ping_type
+            marker_dict = self.p_type_marker
+            color_dict = self.p_type_color
+
+        # Create data mask
+        data_mask = []
+        fmt = []
+        for freq in freq_used:
+
+            data_mask.append(freq_ensembles == freq)
+            fmt.append(
+                {
+                    "marker": marker_dict[freq],
+                    "linestyle": "",
+                    "mfc": color_dict[freq],
+                    "mec": color_dict[freq],
+                }
+            )
+        data_mask.append(invalid)
+        fmt.append(
+            {"marker": "o", "color": "r", "ms": 8, "linestyle": "", "mfc": "none"}
+        )
+
+        self.plt_timeseries(
+            data=None,
+            data_units=data_units,
+            ax=self.ax[-1],
+            data_2=y_data,
+            data_mask=data_mask,
+            fmt=fmt,
+        )
+
+        # Create legend
+        legend_txt = []
+        for freq in freq_used:
+            legend_txt.append(self.bt_legend_dict[freq])
+
+        clean_legend = []
+        for item in legend_txt:
+            if item not in clean_legend:
+                clean_legend.append(item)
+
+        self.ax[-1].legend(clean_legend)
+
+    def bt_vertical_ts(self):
+        """Create time series plot of BT vertical velocity."""
+
+        # Get data
+        y_data = self.transect.boat_vel.bt_vel.w_mps
+        invalid = np.logical_not(
+            self.transect.boat_vel.bt_vel.valid_data[3, :]
+        ).tolist()
+        data_units = (self.units["V"], "BT Vertical Vel " + self.units["label_V"])
+
+        # Assign ping type if available
+        if self.transect.boat_vel.bt_vel.ping_type is None:
+            freq_used = (
+                np.unique(self.transect.boat_vel.bt_vel.frequency_khz)
+                .astype(int)
+                .astype(str)
+            )
+            freq_ensembles = self.transect.boat_vel.bt_vel.frequency_khz.astype(
+                int
+            ).astype(str)
+            marker_dict = self.freq_marker
+            color_dict = self.freq_color
+        else:
+            freq_used = np.unique(self.transect.boat_vel.bt_vel.ping_type)
+            freq_ensembles = self.transect.boat_vel.bt_vel.ping_type
+            marker_dict = self.p_type_marker
+            color_dict = self.p_type_color
+
+        # Construct data formats
+        data_mask = []
+        fmt = []
+        for freq in freq_used:
+            data_mask.append(freq_ensembles == freq)
+            fmt.append(
+                {
+                    "marker": marker_dict[freq],
+                    "linestyle": "",
+                    "mfc": color_dict[freq],
+                    "mec": color_dict[freq],
+                }
+            )
+        data_mask.append(invalid)
+        fmt.append(
+            {"marker": "o", "color": "r", "ms": 8, "linestyle": "", "mfc": "none"}
+        )
+
+        # Plot data
+        self.plt_timeseries(
+            data=None,
+            data_units=data_units,
+            ax=self.ax[-1],
+            data_2=y_data,
+            data_mask=data_mask,
+            fmt=fmt,
+        )
+
+        # Create legend
+        legend_txt = []
+        for freq in freq_used:
+            legend_txt.append(self.bt_legend_dict[freq])
+        clean_legend = []
+        for item in legend_txt:
+            if item not in clean_legend:
+                clean_legend.append(item)
+
+        self.ax[-1].legend(clean_legend)
+
+    def bt_source_ts(self):
+        """Create time series plot of BT source."""
+        self.source_ts(self.transect.boat_vel.bt_vel, "BT Source")
+
+    def bt_corr_ts(self):
+        """Plot bottom track correlation."""
+
+        data = self.transect.boat_vel.bt_vel.corr
+        data_units = (1, "Corr. (cnts)")
+
+        # Compute max and min
+        max_data = np.nanmax(np.nanmax(data))
+        if np.isnan(max_data):
+            max_data = 255
+        min_data = np.nanmin(np.nanmin(data))
+        if np.isnan(min_data):
+            min_data = 0
+
+        # Plot beam 1 using mask to identify invalid data
+        fmt = [
+            {
+                "color": "k",
+                "linestyle": "-",
+                "marker": "o",
+                "markersize": 4,
+                "label": "B1",
+            }
+        ]
+        self.plt_timeseries(
+            data=data[0, :],
+            data_units=data_units,
+            ax=self.ax[-1],
+            fmt=fmt,
+            set_annot=True,
+        )
+
+        # Plot beam 2 using mask to identify invalid data
+        fmt = [
+            {
+                "color": "#005500",
+                "linestyle": "-",
+                "marker": "o",
+                "markersize": 4,
+                "label": "B2",
+            }
+        ]
+        self.plt_timeseries(
+            data=data[1, :],
+            data_units=data_units,
+            ax=self.ax[-1],
+            fmt=fmt,
+            set_annot=False,
+        )
+
+        # Plot beam 3 using mask to identify invalid data
+        fmt = [
+            {
+                "color": "b",
+                "linestyle": "-",
+                "marker": "o",
+                "markersize": 4,
+                "label": "B3",
+            }
+        ]
+        self.plt_timeseries(
+            data=data[2, :],
+            data_units=data_units,
+            ax=self.ax[-1],
+            fmt=fmt,
+            set_annot=False,
+        )
+
+        # Plot beam 4 using mask to identify invalid data
+        fmt = [
+            {
+                "color": "#aa5500",
+                "linestyle": "-",
+                "marker": "o",
+                "markersize": 4,
+                "label": "B4",
+            }
+        ]
+        self.plt_timeseries(
+            data=data[3, :],
+            data_units=data_units,
+            ax=self.ax[-1],
+            fmt=fmt,
+            set_annot=False,
+        )
+
+        # Show legend
+        self.ax[-1].legend()
+
+        # Configure y axis
+        self.ax[-1].set_ylim(
+            top=np.ceil(max_data * 1.02), bottom=np.floor(min_data * 1.02)
+        )
+
+    def bt_rssi_ts(self):
+        """Plot bottom track intensity."""
+
+        data = self.transect.boat_vel.bt_vel.rssi
+        data_units = (1, "RSSI (cnts)")
+
+        # Compute max and min
+        max_data = np.nanmax(np.nanmax(data))
+        if np.isnan(max_data):
+            max_data = 255
+        min_data = np.nanmin(np.nanmin(data))
+        if np.isnan(min_data):
+            min_data = 0
+
+        # Plot beam 1 using mask to identify invalid data
+        fmt = [
+            {
+                "color": "k",
+                "linestyle": "-",
+                "marker": "o",
+                "markersize": 4,
+                "label": "B1",
+            }
+        ]
+        self.plt_timeseries(
+            data=data[0, :],
+            data_units=data_units,
+            ax=self.ax[-1],
+            fmt=fmt,
+            set_annot=True,
+        )
+
+        # Plot beam 2 using mask to identify invalid data
+        fmt = [
+            {
+                "color": "#005500",
+                "linestyle": "-",
+                "marker": "o",
+                "markersize": 4,
+                "label": "B2",
+            }
+        ]
+        self.plt_timeseries(
+            data=data[1, :],
+            data_units=data_units,
+            ax=self.ax[-1],
+            fmt=fmt,
+            set_annot=False,
+        )
+
+        # Plot beam 3 using mask to identify invalid data
+        fmt = [
+            {
+                "color": "b",
+                "linestyle": "-",
+                "marker": "o",
+                "markersize": 4,
+                "label": "B3",
+            }
+        ]
+        self.plt_timeseries(
+            data=data[2, :],
+            data_units=data_units,
+            ax=self.ax[-1],
+            fmt=fmt,
+            set_annot=False,
+        )
+
+        # Plot beam 4 using mask to identify invalid data
+        fmt = [
+            {
+                "color": "#aa5500",
+                "linestyle": "-",
+                "marker": "o",
+                "markersize": 4,
+                "label": "B4",
+            }
+        ]
+        self.plt_timeseries(
+            data=data[3, :],
+            data_units=data_units,
+            ax=self.ax[-1],
+            fmt=fmt,
+            set_annot=False,
+        )
+
+        # Show legend
+        self.ax[-1].legend()
+
+        # Configure y axis
+        self.ax[-1].set_ylim(
+            top=np.ceil(max_data * 1.02), bottom=np.floor(min_data * 1.02)
+        )
+
+    def other_ts(self, data, data_color="r-"):
+        """Create plot of other smooth filter.
+
+        Parameters
+        ----------
+        data: BoatData
+            Object of boat data to be plotted
+        data_color: str
+            Color of line containing original data
+        """
+
+        if data is not None and data.u_mps is not None:
+            # Plot smooth
+            speed = np.sqrt(data.u_mps**2 + data.v_mps**2)
+            invalid_other_vel = np.logical_not(data.valid_data[4, :])
+            if data.smooth_filter == "On":
+                self.ax[-1].plot(
+                    self.x, data.smooth_lower_limit * self.units["V"], color="#d5dce6"
+                )
+                self.ax[-1].plot(
+                    self.x, data.smooth_upper_limit * self.units["V"], color="#d5dce6"
+                )
+                self.ax[-1].fill_between(
+                    self.x,
+                    data.smooth_lower_limit * self.units["V"],
+                    data.smooth_upper_limit * self.units["V"],
+                    facecolor="#d5dce6",
+                )
+
+                self.ax[-1].plot(self.x, speed * self.units["V"], data_color)
+                self.ax[-1].plot(self.x, data.smooth_speed * self.units["V"])
+                self.ax[-1].plot(
+                    self.x[invalid_other_vel],
+                    speed[invalid_other_vel] * self.units["V"],
+                    "ko",
+                    linestyle="",
+                )
+            else:
+                self.ax[-1].plot(self.x, speed * self.units["V"], data_color)
+            self.ax[-1].set_ylabel(self.canvas.tr("Speed " + self.units["label_V"]))
+
+    def gga_source_ts(self):
+        """Plot source for GGA data."""
+
+        self.source_ts(self.transect.boat_vel.gga_vel, "GGA Source")
+
+    def vtg_source_ts(self):
+        """Plot source for VTG data."""
+
+        self.source_ts(self.transect.boat_vel.vtg_vel, "VTG Source")
+
+    def source_ts(self, selected, axis_label):
+        """Plot source of data.
+
+        Parameters
+        ----------
+        selected: BoatData
+            Boat velocity reference data
+        axis_label: str
+            Label for y axis
+        """
+
+        # Handle situation where transect does not contain the selected source
+        if selected is None:
+            source = np.tile("INV", len(self.x))
+            source = source.astype(object)
+        else:
+            source = selected.processed_source
+
+        # Plot dummy data to establish consistent order of y axis
+        temp_hold = np.copy(self.x)
+        if isinstance(temp_hold[0], datetime):
+            dummy_time = temp_hold[0] - timedelta(days=1)
+            self.x = [dummy_time, dummy_time, dummy_time, dummy_time, dummy_time]
+        else:
+            self.x = [-10, -10, -10, -10, -10]
+        data = ["INV", "INT", "BT", "GGA", "VTG"]
+        fmt = [{"color": "w", "linestyle": "-"}]
+        data_units = (1, "")
+        self.plt_timeseries(data=data, data_units=data_units, ax=self.ax[-1], fmt=fmt)
+
+        # Plot data
+        self.x = np.copy(temp_hold)
+        data_units = (1, axis_label)
+        fmt = [{"color": "b", "linestyle": "", "marker": "."}]
+        self.plt_timeseries(data=source, data_units=data_units, ax=self.ax[-1], fmt=fmt)
+
+        # Format y axis
+        self.ax[-1].set_yticks(["INV", "INT", "BT", "GGA", "VTG"])
+
+    def gga_quality_ts(self):
+        """Plots GPS differential quality reported in GGA sentence."""
+
+        # Check to make sure there is data to plot
+        if (
+            self.transect.boat_vel.gga_vel is not None
+            and self.transect.boat_vel.gga_vel.u_mps is not None
+            and np.any(np.logical_not(np.isnan(self.transect.gps.diff_qual_ens)))
+        ):
+
+            # Get data
+            data = self.transect.gps.diff_qual_ens
+
+            # Set initial format
+            fmt = [{"color": "b", "linestyle": "", "marker": "."}]
+            data_units = (1, "GGA Quality")
+
+            # Create data mask and formats for invalid data
+            invalid = np.logical_not(
+                self.transect.boat_vel.gga_vel.valid_data[2, :]
+            ).tolist()
+            data_mask = [[], invalid]
+            fmt.append({"color": "r", "marker": "o", "linestyle": "", "mfc": "none"})
+
+            # Plot data
+            self.plt_timeseries(
+                data=data,
+                data_units=data_units,
+                data_mask=data_mask,
+                ax=self.ax[-1],
+                fmt=fmt,
+            )
+            # Format y axis
+            yint = range(
+                0, int(np.ceil(np.nanmax(self.transect.gps.diff_qual_ens)) + 1)
+            )
+            self.ax[-1].set_ylim(
+                top=np.nanmax(yint) + 0.5, bottom=np.nanmin(yint) - 0.5
+            )
+            self.ax[-1].set_yticks(yint)
+
+    def gga_hdop_ts(self):
+        """Plots HDOP reported in GGA sentence."""
+
+        # Check to make sure there is data to plot
+        if (
+            self.transect.boat_vel.gga_vel is not None
+            and self.transect.boat_vel.gga_vel.u_mps is not None
+            and np.any(np.logical_not(np.isnan(self.transect.gps.hdop_ens)))
+        ):
+
+            # Get data
+            data = self.transect.gps.hdop_ens
+
+            # Set initial format
+            fmt = [{"color": "b", "linestyle": "", "marker": "."}]
+            data_units = (1, "GGA HDOP")
+
+            # Create data mask and formats for invalid data
+            invalid = np.logical_not(
+                self.transect.boat_vel.gga_vel.valid_data[5, :]
+            ).tolist()
+            data_mask = [[], invalid]
+            fmt.append({"color": "r", "marker": "o", "linestyle": "", "mfc": "none"})
+
+            # Plot data
+            self.plt_timeseries(
+                data=data,
+                data_units=data_units,
+                data_mask=data_mask,
+                ax=self.ax[-1],
+                fmt=fmt,
+            )
+
+            # Set y axis properties
+            max_y = np.nanmax(self.transect.gps.hdop_ens) + 0.5
+            min_y = np.nanmin(self.transect.gps.hdop_ens) - 0.5
+            self.ax[-1].set_ylim(top=max_y, bottom=min_y)
+
+    def gga_altitude_ts(self):
+        """Plots altitude reported in GGA sentence."""
+
+        # Check to make sure there is data to plot
+        if (
+            self.transect.boat_vel.gga_vel is not None
+            and self.transect.boat_vel.gga_vel.u_mps is not None
+            and np.any(np.logical_not(np.isnan(self.transect.gps.altitude_ens_m)))
+        ):
+            # Get data
+            data = self.transect.gps.altitude_ens_m
+
+            # Set initial format
+            fmt = [{"color": "b", "linestyle": "", "marker": "."}]
+            data_units = (self.units["L"], "GGA Altitude " + self.units["label_L"])
+
+            # Create data mask and formats for invalid data
+            invalid = np.logical_not(
+                self.transect.boat_vel.gga_vel.valid_data[3, :]
+            ).tolist()
+            data_mask = [[], invalid]
+            fmt.append({"color": "r", "marker": "o", "linestyle": "", "mfc": "none"})
+
+            # Plot data
+            self.plt_timeseries(
+                data=data,
+                data_units=data_units,
+                data_mask=data_mask,
+                ax=self.ax[-1],
+                fmt=fmt,
+            )
+
+    def gga_sats_ts(self):
+        """Plots number of satellites reported in GGA sentence."""
+
+        # Check to make sure there is data to plot
+        if (
+            self.transect.boat_vel.gga_vel is not None
+            and self.transect.boat_vel.gga_vel.u_mps is not None
+            and np.any(np.logical_not(np.isnan(self.transect.gps.num_sats_ens)))
+        ):
+
+            # Get data
+            data = self.transect.gps.num_sats_ens
+
+            # Set format
+            fmt = [{"color": "b", "linestyle": "", "marker": "."}]
+            data_units = (1, "No. of Sats")
+
+            # Plot data
+            self.plt_timeseries(
+                data=data, data_units=data_units, ax=self.ax[-1], fmt=fmt
+            )
+            try:
+                max_y = np.nanmax(self.transect.gps.num_sats_ens) + 0.5
+                min_y = np.nanmin(self.transect.gps.num_sats_ens) - 0.5
+                self.ax[-1].set_ylim(top=max_y, bottom=min_y)
+                yint = range(int(min_y), int(max_y) + 1)
+                self.ax[-1].set_yticks(yint)
+            except ValueError:
+                pass
+
+    def gga_speed_ts(self, lbl="GGA Speed"):
+        """Plot boat speed using GGA reference."""
+
+        if (
+            self.transect.boat_vel.gga_vel is not None
+            and self.transect.boat_vel.gga_vel.u_mps is not None
+        ):
+            # Compute speed from processed GGA data
+            data = np.sqrt(
+                self.transect.boat_vel.gga_vel.u_processed_mps**2
+                + self.transect.boat_vel.gga_vel.v_processed_mps**2
+            )
+
+            # Create data mask for invalid GGA data
+            invalid = np.logical_not(self.transect.boat_vel.gga_vel.valid_data)
+            data_invalid = np.sqrt(
+                self.transect.boat_vel.gga_vel.u_mps**2
+                + self.transect.boat_vel.gga_vel.v_mps**2
+            )
+            data_invalid[np.isnan(data_invalid)] = 0
+
+            # Format for data and invalid identification
+            fmt = [
+                {"color": "b", "linestyle": "-"},
+                {"color": "k", "linestyle": "", "marker": "$O$"},
+                {"color": "k", "linestyle": "", "marker": "$Q$"},
+                {"color": "k", "linestyle": "", "marker": "$A$"},
+                {"color": "k", "linestyle": "", "marker": "$S$"},
+                {"color": "k", "linestyle": "", "marker": "$H$"},
+            ]
+
+            data_units = (self.units["V"], lbl + " " + self.units["label_V"])
+
+            # Plot data
+            self.plt_timeseries(
+                data=data,
+                data_units=data_units,
+                ax=self.ax[-1],
+                data_2=data_invalid,
+                data_mask=invalid,
+                fmt=fmt,
+            )
+
+    def vtg_speed_ts(self, lbl="VTG Speed"):
+        """Plot boat speed using VTG reference."""
+
+        if (
+            self.transect.boat_vel.vtg_vel is not None
+            and self.transect.boat_vel.vtg_vel.u_mps is not None
+        ):
+            # Compute speed from processed VTG data
+            data = np.sqrt(
+                self.transect.boat_vel.vtg_vel.u_processed_mps**2
+                + self.transect.boat_vel.vtg_vel.v_processed_mps**2
+            )
+
+            # Create data mask for invalid VTG data
+            invalid = np.logical_not(self.transect.boat_vel.vtg_vel.valid_data)
+            data_mask = [[], invalid[1], invalid[4], invalid[5]]
+
+            # Use original unprocessed speed to plot invalid symbols
+            data_invalid = np.sqrt(
+                self.transect.boat_vel.vtg_vel.u_mps**2
+                + self.transect.boat_vel.vtg_vel.v_mps**2
+            )
+
+            # Format for data and invalid identification
+            fmt = [
+                {"color": "g", "linestyle": "-"},
+                {"color": "k", "linestyle": "", "marker": "$O$"},
+                {"color": "k", "linestyle": "", "marker": "$S$"},
+                {"color": "k", "linestyle": "", "marker": "$H$"},
+            ]
+            data_units = (self.units["V"], lbl + " " + self.units["label_V"])
+
+            # Plot data
+            self.plt_timeseries(
+                data=data,
+                data_units=data_units,
+                ax=self.ax[-1],
+                data_2=data_invalid,
+                data_mask=data_mask,
+                fmt=fmt,
+            )
+
+    def heading_adcp_ts(self):
+        """Plot heading from ADCP internal compass."""
+
+        data = self.transect.sensors.heading_deg.internal.data
+        fmt = [{"color": "b", "linestyle": "-"}]
+        data_units = (1, "ADCP Heading (deg)")
+        self.plt_timeseries(data=data, data_units=data_units, ax=self.ax[-1], fmt=fmt)
+
+    def heading_external_ts(self):
+        """Plot external heading."""
+
+        data = self.transect.sensors.heading_deg.external.data
+        fmt = [{"color": "b", "linestyle": "-"}]
+        data_units = (1, "Ext. Heading (deg)")
+        self.plt_timeseries(data=data, data_units=data_units, ax=self.ax[-1], fmt=fmt)
+
+    def heading_mag_error_ts(self):
+        """Plot magnetic error."""
+
+        data = self.transect.sensors.heading_deg.internal.mag_error
+        fmt = [{"color": "b", "linestyle": "-"}]
+        data_units = (1, "Mag Error")
+        self.plt_timeseries(data=data, data_units=data_units, ax=self.ax[-1], fmt=fmt)
+
+    def pitch_ts(self):
+        """Plot pitch data."""
+
+        data = self.transect.sensors.pitch_deg.internal.data
+        fmt = [{"color": "b", "linestyle": "-"}]
+        data_units = (1, "Pitch (deg)")
+        self.plt_timeseries(data=data, data_units=data_units, ax=self.ax[-1], fmt=fmt)
+
+    def roll_ts(self):
+        """Plot roll data."""
+
+        data = self.transect.sensors.roll_deg.internal.data
+        fmt = [{"color": "b", "linestyle": "-"}]
+        data_units = (1, "Roll (deg)")
+        self.plt_timeseries(data=data, data_units=data_units, ax=self.ax[-1], fmt=fmt)
+
+    def battery_voltage_ts(self):
+        """Plot roll data."""
+
+        data = self.transect.sensors.battery_voltage.internal.data
+        fmt = [{"color": "b", "linestyle": "-"}]
+        data_units = (1, "Battery (Volts DC)")
+        self.plt_timeseries(data=data, data_units=data_units, ax=self.ax[-1], fmt=fmt)
+
+    def depths_beam_ts(
+        self, b1=True, b2=True, b3=True, b4=True, vb=True, ds=True, leg=True
+    ):
+        """Plot available beam depths including depth sounder on single plot.
+
+        Parameters
+        ----------
+        b1: bool
+            Indicates if beam 1 depths are plotted
+        b2: bool
+            Indicates if beam 2 depths are plotted
+        b3: bool
+            Indicates if beam 3 depths are plotted
+        b4: bool
+            Indicates if beam 4 depths are plotted
+        vb: bool
+            Indicates if vertical beam depths are plotted
+        ds: bool
+            Indicates if depth sounder depths are plotted
+        leg: bool
+            Indicates is a legend should be shown
+        """
+
+        # Slant beams
+        invalid_beams = np.logical_not(
+            self.transect.depths.bt_depths.valid_beams
+        ).tolist()
+        beam_depths = self.transect.depths.bt_depths.depth_beams_m
+
+        # Compute max depth from slant beams
+        max_depth = [np.nanmax(np.nanmax(beam_depths))]
+
+        # Plot beam 1 using mask to identify invalid data
+        if b1:
+            data_mask = [[], invalid_beams[0]]
+            data_units = (self.units["L"], "Depth " + self.units["label_L"])
+            fmt = [
+                {
+                    "color": "k",
+                    "linestyle": "-",
+                    "marker": "o",
+                    "markersize": 4,
+                    "label": "B1",
+                },
+                {
+                    "color": "r",
+                    "linestyle": "",
+                    "marker": "o",
+                    "markersize": 8,
+                    "markerfacecolor": "none",
+                    "label": None,
+                },
+            ]
+            self.plt_timeseries(
+                data=beam_depths[0, :],
+                data_units=data_units,
+                data_mask=data_mask,
+                ax=self.ax[-1],
+                fmt=fmt,
+                set_annot=True,
+            )
+
+        # Plot beam 2 using mask to identify invalid data
+        if b2:
+            data_mask = [[], invalid_beams[1]]
+            data_units = (self.units["L"], "Depth " + self.units["label_L"])
+            fmt = [
+                {
+                    "color": "#005500",
+                    "linestyle": "-",
+                    "marker": "o",
+                    "markersize": 4,
+                    "label": "B2",
+                },
+                {
+                    "color": "r",
+                    "linestyle": "",
+                    "marker": "o",
+                    "markersize": 8,
+                    "markerfacecolor": "none",
+                    "label": None,
+                },
+            ]
+            self.plt_timeseries(
+                data=beam_depths[1, :],
+                data_units=data_units,
+                data_mask=data_mask,
+                ax=self.ax[-1],
+                fmt=fmt,
+                set_annot=False,
+            )
+
+        # Plot beam 3 using mask to identify invalid data
+        if b3:
+            data_mask = [[], invalid_beams[2]]
+            data_units = (self.units["L"], "Depth " + self.units["label_L"])
+            fmt = [
+                {
+                    "color": "b",
+                    "linestyle": "-",
+                    "marker": "o",
+                    "markersize": 4,
+                    "label": "B3",
+                },
+                {
+                    "color": "r",
+                    "linestyle": "",
+                    "marker": "o",
+                    "markersize": 8,
+                    "markerfacecolor": "none",
+                    "label": None,
+                },
+            ]
+            self.plt_timeseries(
+                data=beam_depths[2, :],
+                data_units=data_units,
+                data_mask=data_mask,
+                ax=self.ax[-1],
+                fmt=fmt,
+                set_annot=False,
+            )
+
+        # Plot beam 4 using mask to identify invalid data
+        if b4:
+            data_mask = [[], invalid_beams[3]]
+            data_units = (self.units["L"], "Depth " + self.units["label_L"])
+            fmt = [
+                {
+                    "color": "#aa5500",
+                    "linestyle": "-",
+                    "marker": "o",
+                    "markersize": 4,
+                    "label": "B4",
+                },
+                {
+                    "color": "r",
+                    "linestyle": "",
+                    "marker": "o",
+                    "markersize": 8,
+                    "markerfacecolor": "none",
+                    "label": None,
+                },
+            ]
+            self.plt_timeseries(
+                data=beam_depths[3, :],
+                data_units=data_units,
+                data_mask=data_mask,
+                ax=self.ax[-1],
+                fmt=fmt,
+                set_annot=False,
+            )
+
+        # Plot vertical beam, if available
+        if vb:
+            if self.transect.depths.vb_depths is not None:
+                invalid_beams = np.logical_not(
+                    self.transect.depths.vb_depths.valid_beams[0, :]
+                ).tolist()
+                beam_depths = self.transect.depths.vb_depths.depth_beams_m[0, :]
+                data_mask = [[], invalid_beams]
+                data_units = (self.units["L"], "Depth " + self.units["label_L"])
+                fmt = [
+                    {
+                        "color": "#aa00ff",
+                        "linestyle": "-",
+                        "marker": "o",
+                        "markersize": 4,
+                        "label": "VB",
+                    },
+                    {
+                        "color": "r",
+                        "linestyle": "",
+                        "marker": "o",
+                        "markersize": 8,
+                        "markerfacecolor": "none",
+                        "label": None,
+                    },
+                ]
+                self.plt_timeseries(
+                    data=beam_depths,
+                    data_units=data_units,
+                    data_mask=data_mask,
+                    ax=self.ax[-1],
+                    fmt=fmt,
+                    set_annot=False,
+                )
+                # Add max depth from vertical beam to list
+                max_depth.append(np.nanmax(beam_depths))
+
+        # Plot depth sounder data, if available
+        if ds:
+            if self.transect.depths.ds_depths is not None:
+                invalid_beams = np.logical_not(
+                    self.transect.depths.ds_depths.valid_beams[0, :]
+                )
+                beam_depths = self.transect.depths.ds_depths.depth_beams_m[0, :]
+                data_mask = [[], invalid_beams]
+                data_units = (self.units["L"], "Depth " + self.units["label_L"])
+                fmt = [
+                    {
+                        "color": "#00aaff",
+                        "linestyle": "-",
+                        "marker": "o",
+                        "markersize": 4,
+                        "label": "DS",
+                    },
+                    {
+                        "color": "r",
+                        "linestyle": "",
+                        "marker": "o",
+                        "markersize": 8,
+                        "markerfacecolor": "none",
+                        "label": None,
+                    },
+                ]
+                self.plt_timeseries(
+                    data=beam_depths,
+                    data_units=data_units,
+                    data_mask=data_mask,
+                    ax=self.ax[-1],
+                    fmt=fmt,
+                    set_annot=False,
+                )
+                # Add max depth from depth sounder to list
+                max_depth.append(np.nanmax(beam_depths))
+
+        if leg:
+            # Show legend
+            self.ax[-1].legend()
+
+        # Configure y axis
+        self.ax[-1].invert_yaxis()
+        self.ax[-1].set_ylim(
+            bottom=np.ceil(np.nanmax(max_depth) * 1.02 * self.units["L"]), top=0
+        )
+
+    def depths_final_ts(
+        self, avg4_final=False, vb_final=False, ds_final=False, final=True
+    ):
+        """Plot final cross section used to compute discharge.
+
+        Parameters
+        ----------
+        avg4_final: bool
+            Indicates if 4 beam avg cross section should be plotted
+        vb_final: bool
+            Indicates if vertical beam cross section should be plotted
+        ds_final: bool
+            Indicates if depth sounder cross section should be plotted
+        final: bool
+            Indicates if the selected cross section should be plotted
+        """
+
+        beam_depths = np.array([])
+        data_units = (self.units["L"], "Depth " + self.units["label_L"])
+
+        # Selected cross section
+        if final:
+            # Get selected depth
+            depth_selected = getattr(
+                self.transect.depths, self.transect.depths.selected
+            )
+            beam_depths = depth_selected.depth_processed_m
+            old_x = np.copy(self.x)
+            self.x, beam_depths = self.add_edge_bathymetry(self.x, beam_depths)
+            # Plot processed depth
+            fmt = [{"color": "k", "linestyle": "-", "marker": "o", "markersize": 4}]
+            self.plt_timeseries(
+                data=beam_depths, data_units=data_units, ax=self.ax[-1], fmt=fmt
+            )
+            self.x = old_x
+
+        # 4 beam avg cross section
+        if avg4_final:
+            beam_depths = self.transect.depths.bt_depths.depth_processed_m
+            old_x = np.copy(self.x)
+            # Include edge bathymetry
+            self.x, beam_depths = self.add_edge_bathymetry(self.x, beam_depths)
+            fmt = [{"color": "r", "linestyle": "-", "marker": "o", "markersize": 4}]
+            self.plt_timeseries(
+                data=beam_depths, data_units=data_units, ax=self.ax[-1], fmt=fmt
+            )
+            self.x = old_x
+
+        # Vertical beam cross section
+        if vb_final:
+            beam_depths = self.transect.depths.vb_depths.depth_processed_m
+            old_x = np.copy(self.x)
+            # Include edge bathymetry
+            self.x, beam_depths = self.add_edge_bathymetry(self.x, beam_depths)
+            fmt = [
+                {"color": "#aa00ff", "linestyle": "-", "marker": "o", "markersize": 4}
+            ]
+            self.plt_timeseries(
+                data=beam_depths, data_units=data_units, ax=self.ax[-1], fmt=fmt
+            )
+            self.x = old_x
+        # Depth sounder cross section
+        if ds_final:
+            beam_depths = self.transect.depths.ds_depths.depth_processed_m
+            old_x = np.copy(self.x)
+            # Include edge bathymetry
+            self.x, beam_depths = self.add_edge_bathymetry(self.x, beam_depths)
+            fmt = [
+                {"color": "#00aaff", "linestyle": "-", "marker": "o", "markersize": 4}
+            ]
+            self.plt_timeseries(
+                data=beam_depths, data_units=data_units, ax=self.ax[-1], fmt=fmt
+            )
+            self.x = old_x
+
+        # Format y axis
+        self.ax[-1].invert_yaxis()
+        try:
+            self.ax[-1].set_ylim(
+                bottom=np.ceil(np.nanmax(beam_depths) * 1.02 * self.units["L"]), top=0
+            )
+        except ValueError:
+            pass
+
+    def depths_source_ts(self):
+        """Plot source of depth for final cross section."""
+
+        # Use selected depth source
+        depth_selected = getattr(self.transect.depths, self.transect.depths.selected)
+        source = depth_selected.depth_source_ens
+
+        # Plot dummy data to establish consistent order of y axis
+        # self.x is passed through reference to self so it must be temporarily
+        # changed for the dummy data
+        temp_hold = np.copy(self.x)
+        if isinstance(temp_hold[0], datetime):
+            dummy_time = temp_hold[0] - timedelta(days=1)
+            self.x = [dummy_time, dummy_time, dummy_time, dummy_time, dummy_time]
+        else:
+            self.x = [-10, -10, -10, -10, -10]
+        data = ["INV", "INT", "BT", "VB", "DS"]
+        fmt = [{"color": "w", "linestyle": "-"}]
+        data_units = (1, "")
+        self.plt_timeseries(data=data, data_units=data_units, ax=self.ax[-1], fmt=fmt)
+
+        # Plot source data
+        # Restore self.x to original values
+        self.x = np.copy(temp_hold)
+        data_units = (1, "Depth Source")
+        fmt = [{"color": "b", "linestyle": "", "marker": "."}]
+        self.plt_timeseries(data=source, data_units=data_units, ax=self.ax[-1], fmt=fmt)
+        self.ax[-1].set_yticks(["INV", "INT", "BT", "VB", "DS"])
+
+    def compute_x_axis(self):
+        """Compute x axis data."""
+
+        # Initialize x
+        x = None
+
+        # x axis is length
+        if self.x_axis_type == "L":
+            boat_track = self.transect.boat_vel.compute_boat_track(
+                transect=self.transect
+            )
+            if not np.alltrue(np.isnan(boat_track["track_x_m"])):
+                x = boat_track["distance_m"]
+            self.x = x[self.transect.in_transect_idx]
+
+            # Shift data to account for edge distance
+            if self.transect.start_edge == "Left":
+                self.x = self.x + self.transect.edges.left.distance_m
+            else:
+                self.x = self.x + self.transect.edges.right.distance_m
+
+        # x axis is ensembles
+        elif self.x_axis_type == "E":
+            x = np.arange(1, len(self.transect.depths.bt_depths.depth_processed_m) + 1)
+            self.x = x[self.transect.in_transect_idx]
+
+        # x axis is time
+        elif self.x_axis_type == "T":
+            timestamp = (
+                np.nancumsum(self.transect.date_time.ens_duration_sec)
+                + self.transect.date_time.start_serial_time
+            )
+            x = np.copy(timestamp)
+            # Timestamp is needed to create contour plots and  setting axis
+            # limits
+            self.x_timestamp = x[self.transect.in_transect_idx]
+            x = []
+            # datetime is needed to plot timeseries and x-axis labels
+            for stamp in timestamp:
+                x.append(datetime.utcfromtimestamp(stamp))
+            x = np.array(x)
+            self.x = x[self.transect.in_transect_idx]
+
+    @staticmethod
+    def contour_data_prep(
+        transect,
+        data,
+        x_1d=None,
+        n_ensembles=None,
+        edge=None,
+        cell_size=None,
+        cell_depth=None,
+    ):
+        """Modifies the selected data from transect into arrays matching the
+        meshgrid format for creating contour or color plots.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData containing data to be plotted
+        data: np.ndarray()
+            Contour data
+        x_1d: np.array
+            Array of x-coordinates for each ensemble
+        n_ensembles: int
+            Used to specify number of ensembles for an edge plot
+        edge: str
+            Specifies edge (Left or Right)
+        cell_size: np.array(float)
+            Array of cell sizes, used when extrapolated values are included in plot
+        cell_depth: np.array(float)
+            Array of cell depths, used when extrapolated values are included in plot
+
+        Returns
+        -------
+        x_plt: np.array
+            Data in meshgrid format used for the contour x variable
+        cell_plt: np.array
+            Data in meshgrid format used for the contour y variable
+        data_plt: np.array
+            Data in meshgrid format used to determine colors in plot
+        ensembles: np.array
+            Ensemble numbers used as the x variable to plot the cross section
+             bottom
+        depth: np.array
+            Depth data used to plot the cross section bottom
+        """
+
+        in_transect_idx = transect.in_transect_idx
+
+        # Set x_1d if not specified
+        if x_1d is None:
+            x_1d = in_transect_idx
+
+        data_2_plot = np.copy(data)
+
+        if n_ensembles is None:
+            # Get data from transect
+            depth_selected = getattr(transect.depths, transect.depths.selected)
+            depth = depth_selected.depth_processed_m[in_transect_idx]
+            if cell_depth is None:
+                cell_depth = depth_selected.depth_cell_depth_m[:, in_transect_idx]
+                cell_size = depth_selected.depth_cell_size_m[:, in_transect_idx]
+
+            x_data = x_1d
+            ensembles = in_transect_idx
+
+        else:
+            # Use only edge ensembles from transect
+            n_ensembles = int(n_ensembles)
+            if transect.start_edge == edge:
+                # Start on left bank
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+                depth = depth_selected.depth_processed_m[:n_ensembles]
+                if cell_depth is None:
+                    cell_depth = depth_selected.depth_cell_depth_m[:, :n_ensembles]
+                    cell_size = depth_selected.depth_cell_size_m[:, :n_ensembles]
+                data_2_plot = data_2_plot[:, :n_ensembles]
+                ensembles = in_transect_idx[:n_ensembles]
+                x_data = x_1d[:n_ensembles]
+
+            else:
+
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+                depth = depth_selected.depth_processed_m[-n_ensembles:]
+                if cell_depth is None:
+                    cell_depth = depth_selected.depth_cell_depth_m[:, -n_ensembles:]
+                    cell_size = depth_selected.depth_cell_size_m[:, -n_ensembles:]
+                data_2_plot = data_2_plot[:, -n_ensembles:]
+                ensembles = in_transect_idx[-n_ensembles:]
+                x_data = x_1d[-n_ensembles:]
+
+        # Prep water speed to use -999 instead of nans
+        data_2_plot[np.isnan(data_2_plot)] = -999
+
+        # Create x for contour plot
+        x = np.tile(x_data, (cell_size.shape[0], 1))
+        n_ensembles = x.shape[1]
+
+        # Prep data in x direction
+        j = -1
+        x_xpand = np.tile(np.nan, (cell_size.shape[0], 2 * cell_size.shape[1]))
+        cell_depth_xpand = np.tile(np.nan, (cell_size.shape[0], 2 * cell_size.shape[1]))
+        cell_size_xpand = np.tile(np.nan, (cell_size.shape[0], 2 * cell_size.shape[1]))
+        data_xpand = np.tile(np.nan, (cell_size.shape[0], 2 * cell_size.shape[1]))
+        depth_xpand = np.array([np.nan] * (2 * cell_size.shape[1]))
+
+        # Center ensembles in grid
+        for n in range(n_ensembles):
+            if n == 0:
+                try:
+                    half_back = np.abs(0.5 * (x[:, n + 1] - x[:, n]))
+                    half_forward = half_back
+                except IndexError:
+                    half_back = x[:, 0] - 0.5
+                    half_forward = x[:, 0] + 0.5
+            elif n == n_ensembles - 1:
+                half_forward = np.abs(0.5 * (x[:, n] - x[:, n - 1]))
+                half_back = half_forward
+            else:
+                half_back = np.abs(0.5 * (x[:, n] - x[:, n - 1]))
+                half_forward = np.abs(0.5 * (x[:, n + 1] - x[:, n]))
+            j += 1
+            x_xpand[:, j] = x[:, n] - half_back
+            cell_depth_xpand[:, j] = cell_depth[:, n]
+            data_xpand[:, j] = data_2_plot[:, n]
+            cell_size_xpand[:, j] = cell_size[:, n]
+            depth_xpand[j] = depth[n]
+            j += 1
+            x_xpand[:, j] = x[:, n] + half_forward
+            cell_depth_xpand[:, j] = cell_depth[:, n]
+            data_xpand[:, j] = data_2_plot[:, n]
+            cell_size_xpand[:, j] = cell_size[:, n]
+            depth_xpand[j] = depth[n]
+
+        # Create plotting mesh grid
+        n_cells = x.shape[0]
+        j = -1
+        x_plt = np.tile(np.nan, (2 * cell_size.shape[0], 2 * cell_size.shape[1]))
+        data_plt = np.tile(np.nan, (2 * cell_size.shape[0], 2 * cell_size.shape[1]))
+        cell_plt = np.tile(np.nan, (2 * cell_size.shape[0], 2 * cell_size.shape[1]))
+        for n in range(n_cells):
+            j += 1
+            x_plt[j, :] = x_xpand[n, :]
+            cell_plt[j, :] = cell_depth_xpand[n, :] - 0.5 * cell_size_xpand[n, :]
+            data_plt[j, :] = data_xpand[n, :]
+            j += 1
+            x_plt[j, :] = x_xpand[n, :]
+            cell_plt[j, :] = cell_depth_xpand[n, :] + 0.5 * cell_size_xpand[n, :]
+            data_plt[j, :] = data_xpand[n, :]
+
+        cell_plt[np.isnan(cell_plt)] = 0
+        data_plt[np.isnan(data_plt)] = -999
+        x_plt[np.isnan(x_plt)] = 0
+        data_plt = data_plt[:-1, :-1]
+
+        return x_plt, cell_plt, data_plt, ensembles, depth, x_data
+
+    def plt_contour(
+        self,
+        x_plt_in,
+        cell_plt_in,
+        data_plt_in,
+        x,
+        depth,
+        data_units,
+        data_limits=None,
+        cmap_in=None,
+        ping_name=None,
+        n_names=None,
+        n_ensembles=None,
+        edge=None,
+        show_edge_speed=False,
+    ):
+        """Create contour plot.
+
+        Parameters
+        ----------
+        x_plt_in: np.ndarray()
+            x data used for contour plot
+        cell_plt_in: np.ndarray()
+            Cell depth data
+        data_plt_in: np.ndarray()
+            Primary data to plot
+        x: np.ndarray()
+            x data used for depth plot
+        depth: np.ndarray()
+            Depth data
+        data_units: tuple
+            Tuple of data multiplier and label
+        data_limits: list
+            Optional list of min max data limits
+        cmap_in: str
+            Name of color map to use
+        ping_name: dict
+            Dictionary of ping names
+        n_names: int
+            Number of names
+        n_ensembles: int
+            Number of ensembles for edge data
+        edge: str
+            Specifies edge (Left or Right)
+        show_edge_speed: bool
+            Indicates if edge speed should be plotted
+        """
+
+        # Use last subplot
+        ax = self.ax[-1]
+
+        # Create plot variables for input
+        if self.x_axis_type == "T":
+            # If x axis is time, create x_plt
+            x_plt = np.zeros(x_plt_in.shape, dtype="object")
+            for r in range(x_plt_in.shape[0]):
+                for c in range(x_plt_in.shape[1]):
+                    x_plt[r, c] = datetime.utcfromtimestamp(x_plt_in[r, c])
+        else:
+            x_plt = x_plt_in
+
+        if self.x_axis_type == "L":
+            x_plt = x_plt * self.units["L"]
+
+        cell_plt = cell_plt_in * self.units["L"]
+        data_plt = data_plt_in * data_units[0]
+
+        # Determine limits for color map
+        if data_limits is not None:
+            max_limit = data_limits[1]
+            min_limit = data_limits[0]
+        elif np.sum(np.abs(data_plt_in[data_plt_in > -900])) > 0:
+            max_limit = np.percentile(
+                data_plt_in[data_plt_in > -900] * data_units[0], 99
+            )
+            min_limit = np.min(data_plt_in[data_plt_in > -900] * data_units[0])
+            if 0 < min_limit < 0.1:
+                min_limit = 0
+        else:
+            max_limit = 1
+            min_limit = 0
+
+        # Create color map
+        if cmap_in is None:
+            cmap = cm.get_cmap(self.color_map)
+        else:
+            cmap = cm.get_cmap(cmap_in)
+
+        cmap.set_under("white")
+
+        # Generate color contour
+        c = ax.pcolormesh(
+            x_plt, cell_plt, data_plt, cmap=cmap, vmin=min_limit, vmax=max_limit
+        )
+
+        # Create data plotted for annotation use
+        self.data_plotted.append(
+            {"type": "contour", "x": x_plt, "y": cell_plt, "z": data_plt}
+        )
+
+        # Initialize annotation for data cursor
+        self.annot.append(
+            ax.annotate(
+                "",
+                xy=(0, 0),
+                xytext=(-20, 20),
+                textcoords="offset points",
+                bbox=dict(boxstyle="round", fc="w"),
+                arrowprops=dict(arrowstyle="->"),
+            )
+        )
+
+        self.annot[-1].set_visible(False)
+
+        # Add color bar and axis labels in separate subplot
+        self.ax.append(self.fig.add_subplot(self.gs[self.fig_no + 1]))
+        self.data_plotted.append({"type": "colorbar"})
+        self.annot.append("")
+        cb = self.fig.colorbar(c, self.ax[-1])
+        cb.ax.set_ylabel(self.canvas.tr(data_units[1]))
+        cb.ax.yaxis.label.set_fontsize(12)
+        cb.ax.tick_params(labelsize=12)
+        cb.ax.set_ylim([min_limit, max_limit])
+        ax.invert_yaxis()
+        if ping_name is not None:
+            tick_list = list(range(n_names))
+            label_list = []
+            for tick in tick_list:
+                label_list.append(ping_name[tick])
+            cb.set_ticks(tick_list)
+            cb.ax.set_yticklabels(label_list, rotation=90, verticalalignment="center")
+
+        # Plot depth
+        if self.x_axis_type == "L":
+            # Add edge bathymetry
+            self.expanded_x, depth = self.add_edge_bathymetry(x, depth, edge)
+            ax.plot(self.expanded_x * self.units["L"], depth * self.units["L"], color="k")
+        else:
+            self.expanded_x = x
+            ax.plot(x * self.units["L"], depth * self.units["L"], color="k")
+
+        depth_obj = getattr(self.transect.depths, self.transect.depths.selected)
+
+        # Side lobe cutoff if available
+        if self.transect.w_vel.sl_cutoff_m is not None:
+            last_valid_cell = np.nansum(self.transect.w_vel.cells_above_sl, axis=0) - 1
+            last_depth_cell_size = depth_obj.depth_cell_size_m[
+                last_valid_cell, np.arange(depth_obj.depth_cell_size_m.shape[1])
+            ]
+            y_plt_sl = (
+                self.transect.w_vel.sl_cutoff_m + (last_depth_cell_size * 0.5)
+            )
+            if edge is not None:
+                if self.transect.start_edge == edge:
+                    y_plt_sl = y_plt_sl[: int(n_ensembles)]
+                else:
+                    y_plt_sl = y_plt_sl[-int(n_ensembles) :]
+            if self.x_axis_type == "L":
+                ax.plot(x * self.units["L"], y_plt_sl * self.units["L"], color="r", linewidth=0.5)
+            else:
+                ax.plot(x, y_plt_sl * self.units["L"], color="r", linewidth=0.5)
+
+        # Upper bound of measured depth cells
+        y_plt_top = (
+            depth_obj.depth_cell_depth_m[0, :]
+            - (depth_obj.depth_cell_size_m[0, :] * 0.5)
+        )
+        if edge is not None:
+            if self.transect.start_edge == edge:
+                y_plt_top = y_plt_top[: int(n_ensembles)]
+            else:
+                y_plt_top = y_plt_top[-int(n_ensembles) :]
+        if self.x_axis_type == "L":
+            ax.plot(x * self.units["L"], y_plt_top * self.units["L"], color="r", linewidth=0.5)
+        else:
+            ax.plot(x, y_plt_top * self.units["L"], color="r", linewidth=0.5)
+
+        # Extrapolated data plotting additions
+        if show_edge_speed and self.x_axis_type == "L":
+            top_valid = []
+            bottom_valid = []
+
+            for n in range(data_plt.shape[1]):
+                idx = np.where(data_plt[2:-1, n] > -999)[0]
+                if len(idx) > 0:
+                    top_valid.append(cell_plt[idx[0] + 2, n])
+                    bottom_valid.append(cell_plt[idx[-1] + 2, n])
+                else:
+                    top_valid.append(0)
+                    bottom_valid.append(0)
+
+            top_valid.append(top_valid[-1])
+            bottom_valid.append(bottom_valid[-1])
+            top_valid = np.array(top_valid)
+            bottom_valid = np.array(bottom_valid)
+            # Plot extrapolated boundaries
+            ax.plot(
+                x_plt[-2, :],
+                bottom_valid,
+                linewidth=3,
+                color="w",
+                linestyle="dotted",
+            )
+            ax.plot(
+                x_plt[2, :],
+                top_valid,
+                linewidth=3,
+                color="w",
+                linestyle="dotted",
+            )
+            ax.plot(
+                [x_plt[-2, 0], x_plt[2, 0]],
+                [cell_plt[-2, 0], cell_plt[2, 0]],
+                linewidth=3,
+                color="w",
+                linestyle="dotted",
+            )
+            ax.plot(
+                [x_plt[-2, -1], x_plt[2, -1]],
+                [cell_plt[-2, -1], cell_plt[2, -1]],
+                linewidth=3,
+                color="w",
+                linestyle="dotted",
+            )
+            # Plot edge contours
+            self.add_edge_contours(min_limit, max_limit, cmap, ax, depth)
+
+        # Label and limits for y axis
+        ax.set_ylabel(self.canvas.tr("Depth ") + self.units["label_L"])
+        ax.yaxis.label.set_fontsize(12)
+        ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+        ax.set_ylim(top=0, bottom=(np.nanmax(depth * self.units["L"]) * 1.02))
+
+    def add_edge_bathymetry(self, x, depth, edge=None):
+        """Computes a new cross section profile including edge shapes.
+        The edge shape is based on the type of edge.
+
+        Parameters
+        ----------
+        x: np.array(float)
+            Array of lengths along transect in m
+        depth: np.array(float)
+            Array of depths along transect in m
+        edge: strt
+            Specifies the edge (Left or Right)
+
+        Returns
+        -------
+        x: np.array(float)
+            Array of lengths along transect with edges in m
+        d: np.array(float)
+            Array of depths along transect with edge shapes in m
+        """
+
+        # Left edge
+        if self.transect.start_edge == "Left":
+            if self.transect.edges.left.type == "Rectangular":
+                start_x = np.array([0, 0])
+                start_d = np.array([0, depth[0]])
+            elif self.transect.edges.left.type == "Triangular":
+                start_x = np.array([0])
+                start_d = np.array([0])
+            else:
+                cd = compute_edge_cd(self.transect.edges.left)
+                start_x = np.array([0, 0, self.transect.edges.left.distance_m])
+                start_d = np.array([0, depth[0] * cd, depth[0]])
+            if self.transect.edges.right.type == "Rectangular":
+                end_x = np.array(2 * [x[-1] + self.transect.edges.right.distance_m])
+                end_d = np.array([depth[-1], 0])
+            elif self.transect.edges.right.type == "Triangular":
+                end_x = np.array([x[-1] + self.transect.edges.right.distance_m])
+                end_d = np.array([0])
+            else:
+                cd = compute_edge_cd(self.transect.edges.right)
+                end_x = np.array(
+                    [
+                        x[-1],
+                        x[-1] + self.transect.edges.right.distance_m,
+                        x[-1] + self.transect.edges.right.distance_m,
+                    ]
+                )
+                end_d = np.array([depth[-1], depth[-1] * cd, 0])
+
+        # Right edge
+        else:
+            if self.transect.edges.right.type == "Rectangular":
+                start_x = np.array([0, 0])
+                start_d = np.array([0, depth[0]])
+            elif self.transect.edges.right.type == "Triangular":
+                start_x = np.array([0])
+                start_d = np.array([0])
+            else:
+                cd = compute_edge_cd(self.transect.edges.right)
+                start_x = np.array([0, 0, self.transect.edges.right.distance_m])
+                start_d = np.array([0, depth[0] * cd, depth[0]])
+
+            if self.transect.edges.left.type == "Rectangular":
+                end_x = np.array(2 * [x[-1] + self.transect.edges.left.distance_m])
+                end_d = np.array([depth[-1], 0])
+            elif self.transect.edges.left.type == "Triangular":
+                end_x = np.array([x[-1] + self.transect.edges.left.distance_m])
+                end_d = np.array([0])
+            else:
+                cd = compute_edge_cd(self.transect.edges.left)
+                end_x = np.array(
+                    [
+                        x[-1],
+                        x[-1] + self.transect.edges.left.distance_m,
+                        x[-1] + self.transect.edges.left.distance_m,
+                    ]
+                )
+                end_d = np.array([depth[-1], depth[-1] * cd, 0])
+
+        # Combine edges with transect data
+        if edge is None:
+            x = np.hstack([start_x, x, end_x])
+            d = np.hstack([start_d, depth, end_d])
+        elif self.transect.start_edge == edge:
+            x = np.hstack([start_x, x])
+            d = np.hstack([start_d, depth])
+        else:
+            x = np.hstack([x, end_x])
+            d = np.hstack([depth, end_d])
+
+        return x, d
+
+    def add_extrapolated_topbot(self, water_speed):
+        """Computes the speed in the top and bottom extrapolated areas and expands
+        the water_speed data to include these extrapolated data.
+
+        Parameters
+        ----------
+        water_speed: np.array(float)
+            Water speed from processed u and v components
+
+        Returns
+        -------
+        expanded_cell_size: np.array(float)
+            Cell size data including extrapolated values
+        expanded_cell_depth: np.array(float)
+            Cell depth data including extrapolated values
+        expanded_water_speed: np.array(float)
+            Water speed data including extrapolated values
+        """
+
+        # Compute extrapolated cell size and depth
+        n_ensembles = water_speed.shape[1]
+        depth_selected = getattr(self.transect.depths, self.transect.depths.selected)
+        top_cell_size = np.repeat(np.nan, n_ensembles)
+        top_cell_depth = np.repeat(np.nan, n_ensembles)
+        bottom_cell_size = np.repeat(np.nan, n_ensembles)
+        bottom_cell_depth = np.repeat(np.nan, n_ensembles)
+        for n in range(n_ensembles):
+            # Identify topmost valid cells
+            idx_temp = np.where(np.logical_not(np.isnan(water_speed[:, n])))[0]
+            if len(idx_temp) > 0:
+                # Compute top
+                top_cell_size[n] = (
+                    depth_selected.depth_cell_depth_m[idx_temp[0], n]
+                    - 0.5 * depth_selected.depth_cell_size_m[idx_temp[0], n]
+                )
+                top_cell_depth[n] = top_cell_size[n] / 2
+                # Compute bottom
+                bottom_cell_size[n] = depth_selected.depth_processed_m[n] - (
+                    depth_selected.depth_cell_depth_m[idx_temp[-1], n]
+                    + 0.5 * depth_selected.depth_cell_size_m[idx_temp[-1], n]
+                )
+                bottom_cell_depth[n] = (
+                    depth_selected.depth_processed_m[n] - 0.5 * bottom_cell_size[n]
+                )
+            else:
+                top_cell_size[n] = 0
+                top_cell_depth[n] = 0
+                bottom_cell_size[n] = 0
+                bottom_cell_depth[n] = 0
+
+        # Expanded arrays to include extrapolated cell size and depth
+        expanded_cell_size = np.vstack(
+            [top_cell_size, depth_selected.depth_cell_size_m, bottom_cell_size]
+        )
+        expanded_cell_depth = np.vstack(
+            [top_cell_depth, depth_selected.depth_cell_depth_m, bottom_cell_depth]
+        )
+
+        # Expand array to include extrapolated top and bottom speeds
+        expanded_water_speed = np.vstack(
+            [self.discharge.top_speed, water_speed, self.discharge.bottom_speed]
+        )
+
+        # Fix expanded_water_speed for excluded depth cells
+        for n in range(expanded_water_speed.shape[1]):
+            idx = np.where(self.transect.w_vel.valid_data[6, :, n])
+            if len(idx[0]) > 0 and idx[0][0] > 0:
+                for row in range(idx[0][0]):
+                    expanded_water_speed[row + 1, n] = expanded_water_speed[row, n]
+
+        return expanded_cell_size, expanded_cell_depth, expanded_water_speed
+
+    def add_edge_contours(self, min_limit, max_limit, cmap, ax, depth):
+        """Adds color patches representing the average speed in each edge to the
+        color contour plot.
+
+        Parameters
+        ----------
+        min_limit: float
+            Minimum limit for colorbar
+        max_limit: float
+            Maximum limit for colorbar
+        cmap: color_map
+            Color map
+        ax: subplot
+            Axis of contour plot
+        depth: np.array(float)
+            Array of measured transect depths in m
+        """
+
+        # Left edge
+        if self.transect.start_edge == "Left":
+            if self.transect.edges.left.type == "Triangular":
+                x_left = np.array(
+                    [
+                        self.expanded_x[0],
+                        self.expanded_x[1],
+                        self.expanded_x[1],
+                        self.expanded_x[0],
+                    ]
+                )
+                y_left = np.array([depth[0], depth[1], depth[0], depth[0]])
+
+            else:
+                x_left = np.array(
+                    [
+                        self.expanded_x[0],
+                        self.expanded_x[1],
+                        self.expanded_x[2],
+                        self.expanded_x[2],
+                        self.expanded_x[0],
+                    ]
+                )
+                y_left = np.array([depth[0], depth[1], depth[2], depth[0], depth[0]])
+
+        else:
+            if self.transect.edges.left.type == "Triangular":
+                x_left = np.array(
+                    [
+                        self.expanded_x[-1],
+                        self.expanded_x[-2],
+                        self.expanded_x[-2],
+                        self.expanded_x[-1],
+                    ]
+                )
+                y_left = np.array([depth[-1], depth[-2], depth[-1], depth[-1]])
+
+            else:
+                x_left = np.array(
+                    [
+                        self.expanded_x[-1],
+                        self.expanded_x[-2],
+                        self.expanded_x[-3],
+                        self.expanded_x[-3],
+                        self.expanded_x[-1],
+                    ]
+                )
+                y_left = np.array([depth[-1], depth[-2], depth[-3], depth[-1], depth[-1]])
+
+        left_coords = np.vstack([x_left, y_left]).T
+        v_left = self.discharge.left_edge_speed
+        # Determine color for left edge based on colormap and edge velocity
+        left_c = cmap((v_left * self.units['V'] - min_limit) / (max_limit - min_limit))
+
+        # Right edge
+        if self.transect.start_edge == "Right":
+            if self.transect.edges.right.type == "Triangular":
+                x_right = np.array(
+                    [
+                        self.expanded_x[0],
+                        self.expanded_x[1],
+                        self.expanded_x[1],
+                        self.expanded_x[0],
+                    ]
+                )
+                y_right = np.array([depth[0], depth[1], depth[0], depth[0]])
+
+            else:
+                x_right = np.array(
+                    [
+                        self.expanded_x[0],
+                        self.expanded_x[1],
+                        self.expanded_x[2],
+                        self.expanded_x[2],
+                        self.expanded_x[0],
+                    ]
+                )
+                y_right = np.array([depth[0], depth[1], depth[2], depth[0], depth[0]])
+
+        else:
+            if self.transect.edges.right.type == "Triangular":
+                x_right = np.array(
+                    [
+                        self.expanded_x[-1],
+                        self.expanded_x[-2],
+                        self.expanded_x[-2],
+                        self.expanded_x[-1],
+                    ]
+                )
+                y_right = np.array([depth[-1], depth[-2], depth[-1], depth[-1]])
+
+            else:
+                x_right = np.array(
+                    [
+                        self.expanded_x[-1],
+                        self.expanded_x[-2],
+                        self.expanded_x[-3],
+                        self.expanded_x[-3],
+                        self.expanded_x[-1],
+                    ]
+                )
+                y_right = np.array([depth[-1], depth[-2], depth[-3], depth[-1], depth[-1]])
+
+        right_coords = np.vstack([x_right, y_right]).T
+        v_right = self.discharge.right_edge_speed
+        # Determine color for right edge based on colormap and edge velocity
+        right_c = cmap((v_right * self.units['V'] - min_limit) / (max_limit - min_limit))
+
+        # Plot patches
+        ax.add_patch(Polygon(left_coords * self.units["L"], edgecolor=left_c, facecolor=left_c))
+
+        ax.add_patch(Polygon(right_coords * self.units["L"], edgecolor=right_c, facecolor=right_c))
+
+        # Create data plotted for annotation use
+        self.data_plotted[-2]["edge_x"] = np.array([x_left, x_right]) * self.units["L"]
+        self.data_plotted[-2]["edge_y"] = np.array([y_left, y_right]) * self.units["L"]
+        self.data_plotted[-2]["edge_z"] = np.array([v_left, v_right]) * self.units["V"]
+
+    def plt_timeseries(
+        self,
+        data,
+        data_units,
+        ax=None,
+        data_2=None,
+        data_mask=None,
+        fmt=None,
+        set_annot=True,
+    ):
+        """Create timeseries plot.
+
+        Parameters
+        ----------
+        data: np.ndarray()
+            1-D array of data to be plotted
+        data_units: tuple
+            Tuple of data multiplier and label
+        ax: subplot
+            Optional subplot
+        data_2: np.ndarray()
+            Optional data that can be masked
+        data_mask: list
+            List of bool indicating what data should be plotted
+        fmt: list
+            List of dictionary providing plot format properties
+        set_annot: bool
+            Indicates if annotation should be associated.
+        """
+
+        # Use last subplot if not defined
+        if ax is None:
+            ax = self.ax[-1]
+
+        # Setup plot
+        ax.set_ylabel(self.canvas.tr(data_units[1]))
+        ax.grid(True)
+        ax.yaxis.label.set_fontsize(12)
+        ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+
+        # Get format for first call to plot
+        if fmt is not None:
+            kwargs = fmt[0]
+        else:
+            kwargs = {"linestyle": "-", "color": "b"}
+
+        # Compute x coordinates in selected units
+        if self.x_axis_type == "L":
+            x_coords = self.x * self.units["L"]
+        else:
+            x_coords = self.x
+
+        # First call to plot uses masked data if there is no primary data
+        if data is not None:
+            ax.plot(x_coords, data * data_units[0], **kwargs)
+        else:
+            ax.plot(
+                x_coords[data_mask[0]], data_2[data_mask[0]] * data_units[0], **kwargs
+            )
+
+        # Compile all data from primary and masked data sets
+        all_data = data
+        if data_mask is not None:
+            if data_2 is None:
+                data_2 = data
+                all_data = data
+            elif data is None:
+                all_data = data_2
+            else:
+                all_data = np.concatenate([data, data_2])
+
+            # Plot calls for other masked data
+            for n in range(1, len(fmt)):
+                if fmt is None:
+                    kwargs = {
+                        "color": "r",
+                        "marker": "o",
+                        "ms": 8,
+                        "markerfacecolor": "none",
+                    }
+                else:
+                    kwargs = fmt[n]
+
+                ax.plot(
+                    x_coords[data_mask[n]], data_2[data_mask[n]] * data_units[0], **kwargs
+                )
+
+        # Create dictionary of data for use by annotation
+        self.data_plotted.append({"type": "ts", "x": x_coords, "y": all_data * data_units[0]})
+
+        # Set axis limits
+        try:
+            max_y = (
+                np.nanmax(all_data) + np.abs(np.nanmax(all_data) * 0.02)
+            ) * data_units[0]
+            min_y = (
+                np.nanmin(all_data) - np.abs(np.nanmin(all_data)) * 0.02
+            ) * data_units[0]
+            if min_y == 0:
+                min_y = max_y * -0.02
+            ax.set_ylim(top=max_y, bottom=min_y)
+        except (TypeError, ValueError):
+            pass
+
+        # Initialize annotation for data cursor. Annotation should only be
+        # associated with one call to plt_timeseries if figure makes multiple
+        # calls to create multiple lines on the same graph.
+        if set_annot:
+            self.annot.append(
+                ax.annotate(
+                    "",
+                    xy=(0, 0),
+                    xytext=(-20, 20),
+                    textcoords="offset points",
+                    bbox=dict(boxstyle="round", fc="w"),
+                    arrowprops=dict(arrowstyle="->"),
+                )
+            )
+
+            self.annot[-1].set_visible(False)
+
+        self.canvas.draw()
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the
+        annotation. If the location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        cont_fig = False
+        value = None
+        n = 0
+        x_plt = np.nan
+        y_plt = np.nan
+        z_plt = np.nan
+        for n, item in enumerate(self.fig.axes):
+            if event.inaxes == item:
+
+                # Verify that location is associated with plotted data
+
+                if item is not None:
+                    # cont_fig, ind_fig = self.fig.contains(event)
+                    # for ax in self.ax:
+                    for line in item.lines:
+                        cont_fig, ind_fig = line.contains(event)
+                        if cont_fig:
+                            break
+                    if cont_fig:
+                        break
+                    else:
+                        data = self.data_plotted[n]
+                        if data["type"] == "contour":
+                            if (
+                                np.nanmax(data["x"])
+                                >= event.xdata
+                                >= np.nanmin(data["x"])
+                            ):
+                                cont_fig = True
+                                x_plt = self.data_plotted[n]["x"]
+                                y_plt = self.data_plotted[n]["y"]
+                                z_plt = self.data_plotted[n]["z"]
+                                break
+                            # Check for edge speed
+                            elif "edge_x" in data:
+                                if (
+                                    np.nanmax(data["edge_x"][0])
+                                    >= event.xdata
+                                    >= np.nanmin(data["edge_x"][0])
+                                ) and (
+                                    np.nanmax(data["edge_y"][0])
+                                    >= event.ydata
+                                    >= np.nanmin(data["edge_y"][0])
+                                ):
+                                    cont_fig = True
+                                    value = data["edge_z"][0]
+                                    break
+
+                                elif (
+                                    np.nanmax(data["edge_x"][1])
+                                    >= event.xdata
+                                    >= np.nanmin(data["edge_x"][1])
+                                ) and (
+                                    np.nanmax(data["edge_y"][1])
+                                    >= event.ydata
+                                    >= np.nanmin(data["edge_y"][1])
+                                ):
+                                    cont_fig = True
+                                    value = data["edge_z"][1]
+                                    break
+
+                        elif data["type"] == "ping type":
+                            if (
+                                np.nanmax(data["x"])
+                                >= event.xdata
+                                >= np.nanmin(data["x"])
+                            ):
+                                cont_fig = True
+                                x_plt = self.data_plotted[n]["x"]
+                                y_plt = self.data_plotted[n]["y"]
+                                z_plt = self.data_plotted[n]["z"]
+                                break
+
+        if cont_fig and self.fig.get_visible():
+            # Annotation for contour plot
+            if (
+                self.data_plotted[n]["type"] == "contour"
+                or self.data_plotted[n]["type"] == "ping type"
+            ):
+                if value is None:
+                    # Determine data column index
+                    if self.x_axis_type == "T":
+                        col_idx = np.where(
+                            x_plt[0, :] < num2date(event.xdata).replace(tzinfo=None)
+                        )[0][-1]
+                    elif self.x_axis_type == "L":
+                        # if edge speed x_plt only has 1 dimension
+                        if len(x_plt.shape) < 2:
+                            col_idx = np.where(x_plt < event.xdata)[0][-1]
+                        else:
+                            col_idx = np.where(x_plt[0, :] < event.xdata)[0][-1]
+                    else:
+                        col_idx = (int(round(abs(event.xdata - x_plt[0, 0]))) * 2) - 1
+
+                    # Determine row index. Edge data has no row index
+                    if not np.all(np.isnan(y_plt)):
+                        row_idx = np.where(y_plt[:, col_idx] > event.ydata)[0]
+                        if z_plt[row_idx[0] - 1, col_idx - 1] == -999:
+                            row_idx = row_idx[-1] - 1
+                        else:
+                            row_idx = row_idx[0] - 1
+                        value = z_plt[row_idx, col_idx]
+                    else:
+                        value = z_plt[col_idx]
+
+                if self.data_plotted[n]["type"] == "contour":
+                    # Create annotation
+                    self.update_annot(
+                        ax_idx=n,
+                        x=event.xdata,
+                        y=event.ydata,
+                        v=value,
+                    )
+                else:
+                    # Create annotation
+                    self.update_annot(
+                        ax_idx=n,
+                        x=event.xdata,
+                        y=event.ydata,
+                        v=value,
+                        v_dict=self.ping_name,
+                    )
+
+            # Annotation for time series data
+            elif self.data_plotted[n]["type"] == "ts":
+                self.update_annot(ax_idx=n, x=event.xdata, y=event.ydata, v=value)
+
+            self.annot[n].set_visible(True)
+            self.canvas.draw_idle()
+        else:
+            # If the cursor location is not associated with the plotted
+            # data hide the annotation.
+            if self.fig.get_visible():
+                if type(self.annot[n]) != str:
+                    self.annot[n].set_visible(False)
+                self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            for item in self.annot:
+                if type(item) != str:
+                    item.set_visible(False)
+            self.canvas.draw_idle()
+
+    def update_annot(self, ax_idx, x, y, v=None, v_dict=None):
+        """Updates the location and text and makes visible the previously
+        initialized and hidden annotation.
+
+        Parameters
+        ----------
+        ax_idx: int
+            Index of axis
+        x: float
+            x coordinate for annotation, ensemble
+        y: float
+            y coordinate for annotation, depth
+        v: float or None
+            Speed for annotation
+        v_dict: dict
+            Ping type name for value
+        """
+
+        # Set local variables
+        pos = [x, y]
+        plt_ref = self.fig.axes[ax_idx]
+        annot_ref = self.annot[ax_idx]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if plt_ref.viewLim.intervalx[0] < plt_ref.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (plt_ref.viewLim.intervalx[0] + plt_ref.viewLim.intervalx[1]) / 2
+            ):
+                annot_ref._x = -20
+            else:
+                annot_ref._x = -80
+        else:
+            if (
+                pos[0]
+                < (plt_ref.viewLim.intervalx[0] + plt_ref.viewLim.intervalx[1]) / 2
+            ):
+                annot_ref._x = -80
+            else:
+                annot_ref._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.viewLim.intervaly[0] < plt_ref.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (plt_ref.viewLim.intervaly[0] + plt_ref.viewLim.intervaly[1]) / 2
+            ):
+                annot_ref._y = -40
+            else:
+                annot_ref._y = 20
+        else:
+            if (
+                pos[1]
+                > (plt_ref.viewLim.intervaly[0] + plt_ref.viewLim.intervaly[1]) / 2
+            ):
+                annot_ref._y = 20
+            else:
+                annot_ref._y = -40
+        annot_ref.xy = pos
+        text = ""
+
+        # Annotation of contour plot
+        if v is not None and v > -999:
+            # Format for time axis
+            if self.x_axis_type == "T":
+                x_label = num2date(pos[0]).strftime("%H:%M:%S.%f")[:-4]
+                if v_dict is None:
+                    text = "x: {}, y: {:.2f}, \n v: {:.1f}".format(x_label, y, v)
+                else:
+                    text = "x: {}, y: {:.2f}, \n {}".format(x_label, y, v_dict[v])
+            # Format for ensemble axis
+            elif self.x_axis_type == "E":
+                if v_dict is None:
+                    text = "x: {:.2f}, y: {:.2f}, \n v: {:.2f}".format(
+                        int(round(x)), y, v
+                    )
+                else:
+                    text = "x: {}, y: {:.2f}, \n {}".format(int(round(x)), y, v_dict[v])
+            # Format for length axis
+            elif self.x_axis_type == "L":
+                if v_dict is None:
+                    text = "x: {:.2f}, y: {:.2f}, \n v: {:.2f}".format(x, y, v)
+                else:
+                    text = "x: {:.2f}, y: {:.2f}, \n {}".format(x, y, v_dict[v])
+        # Annotation for time series
+        else:
+            # Format for time axis
+            if self.x_axis_type == "T":
+                x_label = num2date(pos[0]).strftime("%H:%M:%S.%f")[:-4]
+                text = "x: {}, y: {:.2f}".format(x_label, y)
+            # Format for ensemble axis
+            elif self.x_axis_type == "E":
+                text = "x: {:.0f}, y: {:.2f}".format(int(round(x)), y)
+            # Format for length axis
+            elif self.x_axis_type == "L":
+                text = "x: {:.2f}, y: {:.2f}".format(x, y)
+
+        annot_ref.set_text(text)
+
+    @contextmanager
+    def wait_cursor(self):
+        """Provide a busy cursor to the user while the code is processing."""
+        try:
+            QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+            yield
+        finally:
+            QtWidgets.QApplication.restoreOverrideCursor()
diff --git a/UI/AxesScale.py b/UI/AxesScale.py
new file mode 100644
index 0000000000000000000000000000000000000000..da2763868bfdec35ed2f43c99482e8accd3f31d3
--- /dev/null
+++ b/UI/AxesScale.py
@@ -0,0 +1,16 @@
+from PyQt5 import QtWidgets
+from UI import Axes_Scale
+
+
+class AxesScale(QtWidgets.QDialog, Axes_Scale.Ui_Axes_Scale):
+    """Dialog to allow users to change heading offset.
+
+    Parameters
+    ----------
+    Axes_Scale.Ui_Axes_Scale : QDialog
+        Dialog window to allow users to change axes scaline
+    """
+
+    def __init__(self, parent=None):
+        super(AxesScale, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/Axes_Scale.py b/UI/Axes_Scale.py
new file mode 100644
index 0000000000000000000000000000000000000000..57bccaa64da9e63a7bab2f00b08da5e91982314e
--- /dev/null
+++ b/UI/Axes_Scale.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'Axes_Scale.ui'
+#
+# Created by: PyQt5 UI code generator 5.13.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_Axes_Scale(object):
+    def setupUi(self, Axes_Scale):
+        Axes_Scale.setObjectName("Axes_Scale")
+        Axes_Scale.resize(347, 283)
+        self.buttonBox = QtWidgets.QDialogButtonBox(Axes_Scale)
+        self.buttonBox.setGeometry(QtCore.QRect(120, 240, 211, 32))
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.line = QtWidgets.QFrame(Axes_Scale)
+        self.line.setGeometry(QtCore.QRect(107, 181, 221, 16))
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.line.setFont(font)
+        self.line.setLineWidth(1)
+        self.line.setMidLineWidth(3)
+        self.line.setFrameShape(QtWidgets.QFrame.HLine)
+        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
+        self.line.setObjectName("line")
+        self.line_2 = QtWidgets.QFrame(Axes_Scale)
+        self.line_2.setGeometry(QtCore.QRect(99, 38, 20, 150))
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.line_2.setFont(font)
+        self.line_2.setLineWidth(1)
+        self.line_2.setMidLineWidth(3)
+        self.line_2.setFrameShape(QtWidgets.QFrame.VLine)
+        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
+        self.line_2.setObjectName("line_2")
+        self.ed_y_top = QtWidgets.QLineEdit(Axes_Scale)
+        self.ed_y_top.setGeometry(QtCore.QRect(40, 40, 60, 22))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_y_top.setFont(font)
+        self.ed_y_top.setObjectName("ed_y_top")
+        self.ed_y_bottom = QtWidgets.QLineEdit(Axes_Scale)
+        self.ed_y_bottom.setGeometry(QtCore.QRect(40, 170, 60, 22))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_y_bottom.setFont(font)
+        self.ed_y_bottom.setObjectName("ed_y_bottom")
+        self.ed_x_left = QtWidgets.QLineEdit(Axes_Scale)
+        self.ed_x_left.setGeometry(QtCore.QRect(110, 200, 60, 22))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_x_left.setFont(font)
+        self.ed_x_left.setObjectName("ed_x_left")
+        self.ed_x_right = QtWidgets.QLineEdit(Axes_Scale)
+        self.ed_x_right.setGeometry(QtCore.QRect(270, 200, 60, 22))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_x_right.setFont(font)
+        self.ed_x_right.setObjectName("ed_x_right")
+        self.cb_axes_auto = QtWidgets.QCheckBox(Axes_Scale)
+        self.cb_axes_auto.setGeometry(QtCore.QRect(170, 100, 151, 20))
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.cb_axes_auto.setFont(font)
+        self.cb_axes_auto.setObjectName("cb_axes_auto")
+        self.label = QtWidgets.QLabel(Axes_Scale)
+        self.label.setGeometry(QtCore.QRect(50, 110, 55, 16))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label.setFont(font)
+        self.label.setObjectName("label")
+        self.label_2 = QtWidgets.QLabel(Axes_Scale)
+        self.label_2.setGeometry(QtCore.QRect(200, 200, 55, 16))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_2.setFont(font)
+        self.label_2.setObjectName("label_2")
+
+        self.retranslateUi(Axes_Scale)
+        self.buttonBox.accepted.connect(Axes_Scale.accept)
+        self.buttonBox.rejected.connect(Axes_Scale.reject)
+        QtCore.QMetaObject.connectSlotsByName(Axes_Scale)
+
+    def retranslateUi(self, Axes_Scale):
+        _translate = QtCore.QCoreApplication.translate
+        Axes_Scale.setWindowTitle(_translate("Axes_Scale", "Axes Scaling"))
+        self.cb_axes_auto.setText(_translate("Axes_Scale", "Automatic"))
+        self.label.setText(_translate("Axes_Scale", "Y-Axis"))
+        self.label_2.setText(_translate("Axes_Scale", "X-Axis"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    Axes_Scale = QtWidgets.QDialog()
+    ui = Ui_Axes_Scale()
+    ui.setupUi(Axes_Scale)
+    Axes_Scale.show()
+    sys.exit(app.exec_())
diff --git a/UI/Axes_Scale.ui b/UI/Axes_Scale.ui
new file mode 100644
index 0000000000000000000000000000000000000000..a875834d8067e8a4d08b021a057be583deeb521d
--- /dev/null
+++ b/UI/Axes_Scale.ui
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Axes_Scale</class>
+ <widget class="QDialog" name="Axes_Scale">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>347</width>
+    <height>283</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Axes Scaling</string>
+  </property>
+  <widget class="QDialogButtonBox" name="buttonBox">
+   <property name="geometry">
+    <rect>
+     <x>120</x>
+     <y>240</y>
+     <width>211</width>
+     <height>32</height>
+    </rect>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Horizontal</enum>
+   </property>
+   <property name="standardButtons">
+    <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+   </property>
+  </widget>
+  <widget class="Line" name="line">
+   <property name="geometry">
+    <rect>
+     <x>107</x>
+     <y>181</y>
+     <width>221</width>
+     <height>16</height>
+    </rect>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+   <property name="lineWidth">
+    <number>1</number>
+   </property>
+   <property name="midLineWidth">
+    <number>3</number>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Horizontal</enum>
+   </property>
+  </widget>
+  <widget class="Line" name="line_2">
+   <property name="geometry">
+    <rect>
+     <x>99</x>
+     <y>38</y>
+     <width>20</width>
+     <height>150</height>
+    </rect>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+     <weight>50</weight>
+     <bold>false</bold>
+    </font>
+   </property>
+   <property name="lineWidth">
+    <number>1</number>
+   </property>
+   <property name="midLineWidth">
+    <number>3</number>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Vertical</enum>
+   </property>
+  </widget>
+  <widget class="QLineEdit" name="ed_y_top">
+   <property name="geometry">
+    <rect>
+     <x>40</x>
+     <y>40</y>
+     <width>60</width>
+     <height>22</height>
+    </rect>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>10</pointsize>
+    </font>
+   </property>
+  </widget>
+  <widget class="QLineEdit" name="ed_y_bottom">
+   <property name="geometry">
+    <rect>
+     <x>40</x>
+     <y>170</y>
+     <width>60</width>
+     <height>22</height>
+    </rect>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>10</pointsize>
+    </font>
+   </property>
+  </widget>
+  <widget class="QLineEdit" name="ed_x_left">
+   <property name="geometry">
+    <rect>
+     <x>110</x>
+     <y>200</y>
+     <width>60</width>
+     <height>22</height>
+    </rect>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>10</pointsize>
+    </font>
+   </property>
+  </widget>
+  <widget class="QLineEdit" name="ed_x_right">
+   <property name="geometry">
+    <rect>
+     <x>270</x>
+     <y>200</y>
+     <width>60</width>
+     <height>22</height>
+    </rect>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>10</pointsize>
+    </font>
+   </property>
+  </widget>
+  <widget class="QCheckBox" name="cb_axes_auto">
+   <property name="geometry">
+    <rect>
+     <x>170</x>
+     <y>100</y>
+     <width>151</width>
+     <height>20</height>
+    </rect>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+   <property name="text">
+    <string>Automatic</string>
+   </property>
+  </widget>
+  <widget class="QLabel" name="label">
+   <property name="geometry">
+    <rect>
+     <x>50</x>
+     <y>110</y>
+     <width>55</width>
+     <height>16</height>
+    </rect>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>10</pointsize>
+     <weight>75</weight>
+     <bold>true</bold>
+    </font>
+   </property>
+   <property name="text">
+    <string>Y-Axis</string>
+   </property>
+  </widget>
+  <widget class="QLabel" name="label_2">
+   <property name="geometry">
+    <rect>
+     <x>200</x>
+     <y>200</y>
+     <width>55</width>
+     <height>16</height>
+    </rect>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>10</pointsize>
+     <weight>75</weight>
+     <bold>true</bold>
+    </font>
+   </property>
+   <property name="text">
+    <string>X-Axis</string>
+   </property>
+  </widget>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Axes_Scale</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Axes_Scale</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/BTFilters.py b/UI/BTFilters.py
new file mode 100644
index 0000000000000000000000000000000000000000..c9ce9b77577f11804164b2fb6843881c4e405232
--- /dev/null
+++ b/UI/BTFilters.py
@@ -0,0 +1,635 @@
+import copy
+import numpy as np
+from matplotlib.dates import DateFormatter, num2date
+from datetime import datetime
+
+
+class BTFilters(object):
+    """Class to generate time series plots of the selected filter data.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    beam: object
+        Axis of figure for number of beams
+    error: object
+        Axis of figure for error velocity
+    vert: object
+        Axis of figure for vertical velocity
+    other: object
+        Axis of figure for other filters
+    source: object
+        Axis of figure for navigation reference source
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    x_axis_type: str
+        Identifies x-axis type (L-lenght, E-ensemble, T-time)
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.beam = None
+        self.error = None
+        self.vert = None
+        self.other = None
+        self.source = None
+        self.hover_connection = None
+        self.annot = None
+        self.x_axis_type = "E"
+
+    def create(self, transect, units, selected, x_axis_type=None):
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData containing boat speeds to be plotted
+        units: dict
+            Dictionary of units conversions
+        selected: str
+            String identifying the type of plot
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        """
+
+        # Set default axis
+        if x_axis_type is None:
+            x_axis_type = "E"
+        self.x_axis_type = x_axis_type
+
+        # Assign and save parameters
+        self.units = units
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.07, bottom=0.2, right=0.99, top=0.98, wspace=0.1, hspace=0
+        )
+        self.fig.ax.grid()
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+
+        # Compute x axis data
+        x = None
+        if x_axis_type == "L":
+            boat_track = transect.boat_vel.compute_boat_track(transect=transect)
+            if not np.alltrue(np.isnan(boat_track["track_x_m"])):
+                x = boat_track["distance_m"] * units["L"]
+        elif x_axis_type == "E":
+            x = np.arange(1, len(transect.depths.bt_depths.depth_processed_m) + 1)
+        elif x_axis_type == "T":
+            timestamp = (
+                np.nancumsum(transect.date_time.ens_duration_sec)
+                + transect.date_time.start_serial_time
+            )
+            x = []
+            for stamp in timestamp:
+                x.append(datetime.utcfromtimestamp(stamp))
+            x = np.array(x)
+
+        if selected == "beam":
+            # Plot beams
+            # Determine number of beams for each ensemble
+            bt_temp = copy.deepcopy(transect.boat_vel.bt_vel)
+            bt_temp.filter_beam(4)
+            valid_4beam = bt_temp.valid_data[5, :].astype(int)
+            y_data = np.copy(valid_4beam).astype(int)
+            y_data[valid_4beam == 1] = 4
+            y_data[valid_4beam == 0] = 3
+            y_data[np.logical_not(transect.boat_vel.bt_vel.valid_data[1, :])] = 0
+
+            # Plot all data
+            self.beam = self.fig.ax.plot(x, y_data, "b.")
+
+            # Circle invalid data
+            invalid_beam = np.logical_not(transect.boat_vel.bt_vel.valid_data[5, :])
+            self.beam.append(
+                self.fig.ax.plot(
+                    x[invalid_beam], y_data[invalid_beam], "ro", markerfacecolor="none"
+                )[0]
+            )
+
+            # Format axis
+            self.fig.ax.set_ylim(top=4.5, bottom=-0.5)
+            self.fig.ax.set_ylabel(self.canvas.tr("Number of Beams"))
+
+        elif selected == "error":
+            # Plot error velocity
+            x_data = x
+            y_data = transect.boat_vel.bt_vel.d_mps * units["V"]
+            max_y = np.nanmax(y_data) * 1.1
+            min_y = np.nanmin(y_data) * 1.1
+            invalid_error_vel = np.logical_not(
+                transect.boat_vel.bt_vel.valid_data[2, :]
+            )
+
+            if not transect.boat_vel.bt_vel.d_meas_thresholds:
+                self.error = self.fig.ax.plot(x_data, y_data, ".", mfc="b", mec="b")
+                # Mark invalid data
+                self.error.append(
+                    self.fig.ax.plot(
+                        x_data[invalid_error_vel],
+                        y_data[invalid_error_vel],
+                        "ro",
+                        ms=8,
+                        markerfacecolor="none",
+                    )[0]
+                )
+            else:
+                freq_used = (
+                    np.unique(transect.boat_vel.bt_vel.frequency_khz)
+                    .astype(int)
+                    .astype(str)
+                )
+                freq_color = {
+                    "0": "b",
+                    "600": "b",
+                    "1200": "b",
+                    "1000": "b",
+                    "2000": "b",
+                    "2400": "b",
+                    "3000": "#009933",
+                }
+                freq_marker = {
+                    "0": ".",
+                    "600": ".",
+                    "1200": ".",
+                    "1000": ".",
+                    "2000": ".",
+                    "2400": ".",
+                    "3000": "+",
+                }
+
+                freq_ensembles = transect.boat_vel.bt_vel.frequency_khz.astype(
+                    int
+                ).astype(str)
+                # Plot first ping type
+                self.error = self.fig.ax.plot(
+                    x_data[freq_ensembles == freq_used[0]],
+                    y_data[freq_ensembles == freq_used[0]],
+                    freq_marker[freq_used[0]],
+                    mfc=freq_color[freq_used[0]],
+                    mec=freq_color[freq_used[0]],
+                )
+
+                # Plot remaining frequencies
+                if freq_used.size > 1:
+                    for freq in freq_used[1:]:
+                        self.error.append(
+                            self.fig.ax.plot(
+                                x_data[freq_ensembles == freq],
+                                y_data[freq_ensembles == freq],
+                                freq_marker[freq],
+                                mfc=freq_color[freq],
+                                mec=freq_color[freq],
+                            )[0]
+                        )
+
+                # Mark invalid data
+                self.error.append(
+                    self.fig.ax.plot(
+                        x_data[invalid_error_vel],
+                        y_data[invalid_error_vel],
+                        "ro",
+                        ms=8,
+                        markerfacecolor="none",
+                    )[0]
+                )
+                # Create legend
+                legend_dict = {
+                    "600": "600 kHz",
+                    "1200": "1200 kHz",
+                    "1000": "1 MHz",
+                    "2000": "2 MHz",
+                    "2400": "2.4 MHz",
+                    "3000": "3 MHz",
+                    "0": "N/U",
+                }
+                legend_txt = []
+                for freq in freq_used:
+                    legend_txt.append(legend_dict[freq])
+                self.fig.ax.legend(legend_txt)
+
+            if not np.isnan(max_y):
+                self.fig.ax.set_ylim(top=max_y, bottom=min_y)
+            self.fig.ax.set_ylabel(
+                self.canvas.tr("Error Velocity" + self.units["label_V"])
+            )
+
+        elif selected == "vert":
+            # Plot vertical velocity
+            x_data = x
+            y_data = transect.boat_vel.bt_vel.w_mps * units["V"]
+            max_y = np.nanmax(y_data) * 1.1
+            min_y = np.nanmin(y_data) * 1.1
+            invalid_vert_vel = np.logical_not(transect.boat_vel.bt_vel.valid_data[3, :])
+            if not transect.boat_vel.bt_vel.w_meas_thresholds:
+                self.error = self.fig.ax.plot(x_data, y_data, ".", mfc="b", mec="b")
+                # Mark invalid data
+                self.error.append(
+                    self.fig.ax.plot(
+                        x_data[invalid_vert_vel],
+                        y_data[invalid_vert_vel],
+                        "ro",
+                        ms=8,
+                        markerfacecolor="none",
+                    )[0]
+                )
+            else:
+                freq_used = (
+                    np.unique(transect.boat_vel.bt_vel.frequency_khz)
+                    .astype(int)
+                    .astype(str)
+                )
+                freq_color = {
+                    "0": "b",
+                    "600": "b",
+                    "1200": "b",
+                    "1000": "b",
+                    "2000": "b",
+                    "2400": "b",
+                    "3000": "#009933",
+                }
+                freq_marker = {
+                    "0": ".",
+                    "600": ".",
+                    "1200": ".",
+                    "1000": ".",
+                    "2000": ".",
+                    "2400": ".",
+                    "3000": "+",
+                }
+                freq_ensembles = transect.boat_vel.bt_vel.frequency_khz.astype(
+                    int
+                ).astype(str)
+                # Plot first ping type
+                self.vert = self.fig.ax.plot(
+                    x_data[freq_ensembles == freq_used[0]],
+                    y_data[freq_ensembles == freq_used[0]],
+                    freq_marker[freq_used[0]],
+                    mfc=freq_color[freq_used[0]],
+                    mec=freq_color[freq_used[0]],
+                )
+
+                # Plot remaining frequencies
+                if freq_used.size > 1:
+                    for freq in freq_used[1:]:
+                        self.vert.append(
+                            self.fig.ax.plot(
+                                x_data[freq_ensembles == freq],
+                                y_data[freq_ensembles == freq],
+                                freq_marker[freq],
+                                mfc=freq_color[freq],
+                                mec=freq_color[freq],
+                            )[0]
+                        )
+
+                # Mark invalid data
+                self.vert.append(
+                    self.fig.ax.plot(
+                        x_data[invalid_vert_vel],
+                        y_data[invalid_vert_vel],
+                        "ro",
+                        ms=8,
+                        markerfacecolor="none",
+                    )[0]
+                )
+                # Create legend
+                legend_dict = {
+                    "600": "600 kHz",
+                    "1200": "1200 kHz",
+                    "1000": "1 MHz",
+                    "2000": "2 MHz",
+                    "2400": "2.4 MHz",
+                    "3000": "3 MHz",
+                    "0": "N/U",
+                }
+                legend_txt = []
+                for freq in freq_used:
+                    legend_txt.append(legend_dict[freq])
+                self.fig.ax.legend(legend_txt)
+            if not np.isnan(max_y):
+                self.fig.ax.set_ylim(top=max_y, bottom=min_y)
+            self.fig.ax.set_ylabel(
+                self.canvas.tr("Vert. Velocity" + self.units["label_V"])
+            )
+
+        elif selected == "other":
+            # Plot smooth
+            speed = np.sqrt(
+                transect.boat_vel.bt_vel.u_mps**2
+                + transect.boat_vel.bt_vel.v_mps**2
+            )
+            invalid_other_vel = np.logical_not(
+                transect.boat_vel.bt_vel.valid_data[4, :]
+            )
+            if transect.boat_vel.bt_vel.smooth_filter == "On":
+                self.other = self.fig.ax.plot(
+                    x,
+                    transect.boat_vel.bt_vel.smooth_lower_limit * self.units["V"],
+                    color="#d5dce6",
+                )
+                self.other.append(
+                    self.fig.ax.plot(
+                        x,
+                        transect.boat_vel.bt_vel.smooth_upper_limit * self.units["V"],
+                        color="#d5dce6",
+                    )[0]
+                )
+                self.other.append(
+                    self.fig.ax.fill_between(
+                        x,
+                        transect.boat_vel.bt_vel.smooth_lower_limit * self.units["V"],
+                        transect.boat_vel.bt_vel.smooth_upper_limit * self.units["V"],
+                        facecolor="#d5dce6",
+                    )
+                )
+
+                self.other.append(self.fig.ax.plot(x, speed * units["V"], "r-")[0])
+                self.other.append(
+                    self.fig.ax.plot(
+                        x, transect.boat_vel.bt_vel.smooth_speed * self.units["V"]
+                    )[0]
+                )
+                self.other.append(
+                    self.fig.ax.plot(
+                        x[invalid_other_vel],
+                        speed[invalid_other_vel] * units["V"],
+                        "ko",
+                        linestyle="",
+                    )[0]
+                )
+            else:
+                self.other = self.fig.ax.plot(x, speed * units["V"], "r-")
+            self.fig.ax.set_ylabel(self.canvas.tr("Speed" + self.units["label_V"]))
+
+        elif selected == "source":
+            # Plot boat velocity source
+            if transect.boat_vel.selected == "gga_vel":
+                boat_selected = transect.boat_vel.gga_vel
+            elif transect.boat_vel.selected == "vtg_vel":
+                boat_selected = transect.boat_vel.gga_vel
+            else:
+                boat_selected = transect.boat_vel.bt_vel
+
+            # Handle situation where transect does not contain the selected source
+            if boat_selected is None:
+                source = np.tile("INV", len(x))
+            else:
+                source = boat_selected.processed_source
+
+            # Plot dummy data to establish consistent order of y axis
+            self.source = self.fig.ax.plot(
+                [-10, -10, -10, -10, -10], ["INV", "INT", "BT", "GGA", "VTG"], "w-"
+            )
+            self.source = self.fig.ax.plot(x, source, "b.")
+            self.fig.ax.set_ylabel(self.canvas.tr("Boat Velocity Source"))
+            self.fig.ax.set_yticks(["INV", "INT", "BT", "GGA", "VTG"])
+
+        if x_axis_type == "L":
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(
+                    right=-1 * x[-1] * 0.02 * units["L"], left=x[-1] * 1.02 * units["L"]
+                )
+            else:
+                self.fig.ax.set_xlim(
+                    left=-1 * x[-1] * 0.02 * units["L"], right=x[-1] * 1.02 * units["L"]
+                )
+            self.fig.ax.set_xlabel(self.canvas.tr("Length" + units["label_L"]))
+        elif x_axis_type == "E":
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(right=0, left=x[-1] + 1)
+            else:
+                self.fig.ax.set_xlim(left=0, right=x[-1] + 1)
+            self.fig.ax.set_xlabel(self.canvas.tr("Ensembles"))
+        elif x_axis_type == "T":
+            axis_buffer = (timestamp[-1] - timestamp[0]) * 0.02
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(
+                    right=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                    left=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                )
+            else:
+                self.fig.ax.set_xlim(
+                    left=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                    right=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                )
+            date_form = DateFormatter("%H:%M:%S")
+            self.fig.ax.xaxis.set_major_formatter(date_form)
+            self.fig.ax.set_xlabel(self.canvas.tr("Time"))
+
+        # Initialize annotation for data cursor
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    def update_annot(self, ind, plt_ref):
+        """Updates the location and text and makes visible the previously initialized
+        and hidden annotation.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        """
+
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+
+        self.annot.xy = pos
+
+        # Format and display text
+        if self.x_axis_type == "T":
+            x_label = num2date(pos[0]).strftime("%H:%M:%S.%f")[:-4]
+            if self.source is not None:
+                y_label = ["INV", "INT", "BT", "GGA", "VTG"]
+                text = "x: {}, y: {}".format(x_label, y_label[pos[1].astype("int")])
+            else:
+                text = "x: {}, y: {:.2f}".format(x_label, pos[1])
+        else:
+            if self.source is not None:
+                y_label = ["INV", "INT", "BT", "GGA", "VTG"]
+                text = "x: {:.2f}, y: {}".format(pos[0], y_label[pos[1].astype("int")])
+            else:
+                text = "x: {:.2f}, y: {:.2f}".format(pos[0], pos[1])
+
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the annotation. If the
+        location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and update
+        # the annotation.
+        if event.inaxes == self.fig.ax:
+            cont_beam = False
+            cont_error = False
+            cont_vert = False
+            cont_other = False
+            cont_source = False
+            ind_beam = None
+            ind_error = None
+            ind_vert = None
+            ind_other = None
+            ind_source = None
+
+            if self.beam is not None:
+                cont_beam, ind_beam = self.beam[0].contains(event)
+            elif self.error is not None:
+                cont_error, ind_error = self.error[0].contains(event)
+            elif self.vert is not None:
+                cont_vert, ind_vert = self.vert[0].contains(event)
+            elif self.other is not None:
+                cont_other, ind_other = self.other[0].contains(event)
+            elif self.source is not None:
+                cont_source, ind_source = self.source[0].contains(event)
+
+            if cont_beam:
+                self.update_annot(ind_beam, self.beam[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_error:
+                self.update_annot(ind_error, self.error[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_vert:
+                self.update_annot(ind_vert, self.vert[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_other:
+                self.update_annot(ind_other, self.other[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_source:
+                self.update_annot(ind_source, self.source[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted data
+                # hide the annotation.
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/BeamDepths.py b/UI/BeamDepths.py
new file mode 100644
index 0000000000000000000000000000000000000000..907537742a2025f9c236d87cb8c2f736292ab41f
--- /dev/null
+++ b/UI/BeamDepths.py
@@ -0,0 +1,633 @@
+import numpy as np
+from PyQt5 import QtCore
+from matplotlib.dates import DateFormatter, num2date
+from datetime import datetime
+
+
+class BeamDepths(object):
+    """Class to generate cross section using the depths of each beam available.
+    What beams are plotted are controlled by the user through checkboxes.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    cb_beam1: QCheckBox
+        Checkbox to plot beam 1
+    cb_beam2: QCheckBox
+        Checkbox to plot beam 2
+    cb_beam3: QCheckBox
+        Checkbox to plot beam 3
+    cb_beam4: QCheckBox
+        Checkbox to plot beam 4
+    cb_vert: QCheckBox
+        Checkbox to plot vertical beam
+    cb_ds: QCheckBox
+        Checkbox to plot depth sounder
+    beam1: list
+        Plot reference for beam 1
+    beam2: list
+        Plot reference for beam 2
+    beam3: list
+        Plot reference for beam 3
+    beam4: list
+        Plot reference for beam 4
+    vb: list
+        Plot reference for vertical beam
+    ds: list
+        Plot reference for depth sounder
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation for data cursor
+    x_axis_type: str
+        Identifies x-axis type (L-lenght, E-ensemble, T-time)
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.cb_beam1 = None
+        self.cb_beam2 = None
+        self.cb_beam3 = None
+        self.cb_beam4 = None
+        self.cb_vert = None
+        self.cb_ds = None
+        self.beam1 = None
+        self.beam2 = None
+        self.beam3 = None
+        self.beam4 = None
+        self.vb = None
+        self.ds = None
+        self.hover_connection = None
+        self.annot = None
+        self.x_axis_type = "L"
+
+    def create(
+        self,
+        transect,
+        units,
+        cb_beam1=None,
+        cb_beam2=None,
+        cb_beam3=None,
+        cb_beam4=None,
+        cb_vert=None,
+        cb_ds=None,
+        x_axis_type=None,
+    ):
+
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData containing boat speeds to be plotted
+        units: dict
+            Dictionary of units conversions
+        cb_beam1: QCheckBox
+            Checkbox to plot beam 1
+        cb_beam2: QCheckBox
+            Checkbox to plot beam 2
+        cb_beam3: QCheckBox
+            Checkbox to plot beam 3
+        cb_beam4: QCheckBox
+            Checkbox to plot beam 4
+        cb_vert: QCheckBox
+            Checkbox to plot vertical beam
+        cb_ds: QCheckBox
+            Checkbox to plot depth sounder
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        """
+
+        # Set default axis
+        if x_axis_type is None:
+            x_axis_type = "L"
+        self.x_axis_type = x_axis_type
+
+        # Assign and save parameters
+        self.cb_beam1 = cb_beam1
+        self.cb_beam2 = cb_beam2
+        self.cb_beam3 = cb_beam3
+        self.cb_beam4 = cb_beam4
+        self.cb_vert = cb_vert
+        self.cb_ds = cb_ds
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.08, bottom=0.2, right=0.98, top=0.98, wspace=0.1, hspace=0
+        )
+
+        # Configure axes
+        self.fig.ax.set_ylabel(self.canvas.tr("Depth" + units["label_L"]))
+        self.fig.ax.grid()
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+
+        # Initialize max trackers
+        max_vert = np.nan
+        max_ds = np.nan
+
+        # Compute x axis data
+        x = None
+        if x_axis_type == "L":
+            boat_track = transect.boat_vel.compute_boat_track(transect=transect)
+            if not np.alltrue(np.isnan(boat_track["track_x_m"])):
+                x = boat_track["distance_m"] * units["L"]
+        elif x_axis_type == "E":
+            x = np.arange(1, len(transect.depths.bt_depths.depth_processed_m) + 1)
+        elif x_axis_type == "T":
+            timestamp = (
+                np.nancumsum(transect.date_time.ens_duration_sec)
+                + transect.date_time.start_serial_time
+            )
+            x = []
+            for stamp in timestamp:
+                x.append(datetime.utcfromtimestamp(stamp))
+            x = np.array(x)
+
+        # Check to make sure there is valid boat track data
+        if x is not None:
+            invalid_beams = np.logical_not(transect.depths.bt_depths.valid_beams)
+            beam_depths = transect.depths.bt_depths.depth_beams_m
+
+            # Plot beams
+            self.beam1 = self.fig.ax.plot(
+                x,
+                beam_depths[0, :] * units["L"],
+                linestyle="-",
+                marker="o",
+                color="k",
+                markersize=4,
+            )
+            self.beam1.append(
+                self.fig.ax.plot(
+                    x[invalid_beams[0, :]],
+                    beam_depths[0, invalid_beams[0, :]] * units["L"],
+                    "r",
+                    linestyle="",
+                    marker="o",
+                    markersize=8,
+                    markerfacecolor="none",
+                )[0]
+            )
+
+            self.beam2 = self.fig.ax.plot(
+                x,
+                beam_depths[1, :] * units["L"],
+                color="#005500",
+                linestyle="-",
+                marker="o",
+                markersize=4,
+            )
+            self.beam2.append(
+                self.fig.ax.plot(
+                    x[invalid_beams[1, :]],
+                    beam_depths[1, invalid_beams[1, :]] * units["L"],
+                    color="r",
+                    linestyle="",
+                    marker="o",
+                    markersize=8,
+                    markerfacecolor="none",
+                )[0]
+            )
+
+            self.beam3 = self.fig.ax.plot(
+                x,
+                beam_depths[2, :] * units["L"],
+                linestyle="-",
+                marker="o",
+                color="b",
+                markersize=4,
+            )
+            self.beam3.append(
+                self.fig.ax.plot(
+                    x[invalid_beams[2, :]],
+                    beam_depths[2, invalid_beams[2, :]] * units["L"],
+                    "r",
+                    linestyle="",
+                    marker="o",
+                    markersize=8,
+                    markerfacecolor="none",
+                )[0]
+            )
+
+            self.beam4 = self.fig.ax.plot(
+                x,
+                beam_depths[3, :] * units["L"],
+                color="#aa5500",
+                linestyle="-",
+                marker="o",
+                markersize=4,
+            )
+            self.beam4.append(
+                self.fig.ax.plot(
+                    x[invalid_beams[3, :]],
+                    beam_depths[3, invalid_beams[3, :]] * units["L"],
+                    color="r",
+                    linestyle="",
+                    marker="o",
+                    markersize=8,
+                    markerfacecolor="none",
+                )[0]
+            )
+            # Compute max depth from beams
+            max_beams = np.nanmax(np.nanmax(transect.depths.bt_depths.depth_beams_m))
+
+            # Based on checkbox control make beams visible
+            if cb_beam1.checkState() == QtCore.Qt.Checked:
+                for item in self.beam1:
+                    item.set_visible(True)
+            else:
+                for item in self.beam1:
+                    item.set_visible(False)
+
+            if cb_beam2.checkState() == QtCore.Qt.Checked:
+                for item in self.beam2:
+                    item.set_visible(True)
+            else:
+                for item in self.beam2:
+                    item.set_visible(False)
+
+            if cb_beam3.checkState() == QtCore.Qt.Checked:
+                for item in self.beam3:
+                    item.set_visible(True)
+            else:
+                for item in self.beam3:
+                    item.set_visible(False)
+
+            if cb_beam4.checkState() == QtCore.Qt.Checked:
+                for item in self.beam4:
+                    item.set_visible(True)
+            else:
+                for item in self.beam4:
+                    item.set_visible(False)
+
+            # Plot vertical beam
+            if transect.depths.vb_depths is not None:
+                invalid_beams = np.logical_not(
+                    transect.depths.vb_depths.valid_beams[0, :]
+                )
+                beam_depths = transect.depths.vb_depths.depth_beams_m[0, :]
+                self.vb = self.fig.ax.plot(
+                    x,
+                    beam_depths * units["L"],
+                    color="#aa00ff",
+                    linestyle="-",
+                    marker="o",
+                    markersize=4,
+                )
+                self.vb.append(
+                    self.fig.ax.plot(
+                        x[invalid_beams],
+                        beam_depths[invalid_beams] * units["L"],
+                        color="r",
+                        linestyle="",
+                        marker="o",
+                        markersize=8,
+                        markerfacecolor="none",
+                    )[0]
+                )
+
+                if cb_vert.checkState() == QtCore.Qt.Checked:
+                    for item in self.vb:
+                        item.set_visible(True)
+                else:
+                    for item in self.vb:
+                        item.set_visible(False)
+
+                max_vert = np.nanmax(beam_depths)
+
+            # Plot depth sounder
+            if transect.depths.ds_depths is not None:
+                invalid_beams = np.logical_not(
+                    transect.depths.ds_depths.valid_beams[0, :]
+                )
+                beam_depths = transect.depths.ds_depths.depth_beams_m[0, :]
+                self.ds = self.fig.ax.plot(
+                    x,
+                    beam_depths * units["L"],
+                    color="#00aaff",
+                    linestyle="-",
+                    marker="o",
+                )
+                self.ds.append(
+                    self.fig.ax.plot(
+                        x[invalid_beams] * units["L"],
+                        beam_depths[invalid_beams] * units["L"],
+                        color="r",
+                        linestyle="",
+                        marker="x",
+                    )[0]
+                )
+
+                if cb_ds.checkState() == QtCore.Qt.Checked:
+                    for item in self.ds:
+                        item.set_visible(True)
+                else:
+                    for item in self.ds:
+                        item.set_visible(False)
+
+                max_ds = np.nanmax(beam_depths)
+
+            # Set axis limits
+            max_y = np.nanmax([max_beams, max_vert, max_ds]) * 1.1
+            self.fig.ax.invert_yaxis()
+            self.fig.ax.set_ylim(bottom=np.ceil(max_y * units["L"]), top=0)
+
+            if x_axis_type == "L":
+                if transect.start_edge == "Right":
+                    self.fig.ax.invert_xaxis()
+                    self.fig.ax.set_xlim(
+                        right=-1 * x[-1] * 0.02 * units["L"],
+                        left=x[-1] * 1.02 * units["L"],
+                    )
+                else:
+                    self.fig.ax.set_xlim(
+                        left=-1 * x[-1] * 0.02 * units["L"],
+                        right=x[-1] * 1.02 * units["L"],
+                    )
+                self.fig.ax.set_xlabel(self.canvas.tr("Length" + units["label_L"]))
+            elif x_axis_type == "E":
+                if transect.start_edge == "Right":
+                    self.fig.ax.invert_xaxis()
+                    self.fig.ax.set_xlim(right=0, left=x[-1] + 1)
+                else:
+                    self.fig.ax.set_xlim(left=0, right=x[-1] + 1)
+                self.fig.ax.set_xlabel(self.canvas.tr("Ensembles"))
+            elif x_axis_type == "T":
+                axis_buffer = (timestamp[-1] - timestamp[0]) * 0.02
+                if transect.start_edge == "Right":
+                    self.fig.ax.invert_xaxis()
+                    self.fig.ax.set_xlim(
+                        right=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                        left=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                    )
+                else:
+                    self.fig.ax.set_xlim(
+                        left=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                        right=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                    )
+                date_form = DateFormatter("%H:%M:%S")
+                self.fig.ax.xaxis.set_major_formatter(date_form)
+                self.fig.autofmt_xdate()
+                self.fig.ax.set_xlabel(self.canvas.tr("Time"))
+
+            self.annot = self.fig.ax.annotate(
+                "",
+                xy=(0, 0),
+                xytext=(-20, 20),
+                textcoords="offset points",
+                bbox=dict(boxstyle="round", fc="w"),
+                arrowprops=dict(arrowstyle="->"),
+            )
+
+            self.annot.set_visible(False)
+
+            self.canvas.draw()
+
+    def change(self):
+        """Changes the visibility of the available beams based on user
+        input via checkboxes."""
+
+        # Set visibility of beams based on user input
+        if self.cb_beam1.checkState() == QtCore.Qt.Checked:
+            for item in self.beam1:
+                item.set_visible(True)
+        else:
+            for item in self.beam1:
+                item.set_visible(False)
+
+        if self.cb_beam2.checkState() == QtCore.Qt.Checked:
+            for item in self.beam2:
+                item.set_visible(True)
+        else:
+            for item in self.beam2:
+                item.set_visible(False)
+
+        if self.cb_beam3.checkState() == QtCore.Qt.Checked:
+            for item in self.beam3:
+                item.set_visible(True)
+        else:
+            for item in self.beam3:
+                item.set_visible(False)
+
+        if self.cb_beam4.checkState() == QtCore.Qt.Checked:
+            for item in self.beam4:
+                item.set_visible(True)
+        else:
+            for item in self.beam4:
+                item.set_visible(False)
+
+        if self.cb_vert.isEnabled():
+            if self.cb_vert.checkState() == QtCore.Qt.Checked:
+                for item in self.vb:
+                    item.set_visible(True)
+            else:
+                for item in self.vb:
+                    item.set_visible(False)
+
+        if self.cb_ds.isEnabled():
+            if self.cb_ds.checkState() == QtCore.Qt.Checked:
+                for item in self.ds:
+                    item.set_visible(True)
+            else:
+                for item in self.ds:
+                    item.set_visible(False)
+
+        # Draw canvas
+        self.canvas.draw()
+
+    def update_annot(self, ind, plt_ref, ref_label):
+        """Creates annotation for data cursor event.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains array of position data from mouse click.
+        plt_ref: Line2D
+            Line on graph that was clicked
+        ref_label: str
+            Label for line that was clicked
+
+        """
+
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the axis
+        # the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+
+        # Create annotation box
+        self.annot.xy = pos
+
+        if self.x_axis_type == "T":
+            x_label = num2date(pos[0]).strftime("%H:%M:%S.%f")[:-4]
+            text = "x: {}, {}: {:.2f}".format(x_label, ref_label, pos[1])
+        else:
+            text = "x: {:.2f}, {}: {:.2f}".format(pos[0], ref_label, pos[1])
+
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Handles data cursor events.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Results of mouse click
+        """
+
+        vis = self.annot.get_visible()
+
+        # Check to see if event is associated with the figure
+        if event.inaxes == self.fig.ax:
+            # Intialize variables
+            cont_beam1 = False
+            cont_beam2 = False
+            cont_beam3 = False
+            cont_beam4 = False
+            cont_vb = False
+            cont_ds = False
+            ind_beam1 = None
+            ind_beam2 = None
+            ind_beam3 = None
+            ind_beam4 = None
+            ind_vb = None
+            ind_ds = None
+
+            # Identify beam selected
+            if self.beam1 is not None:
+                cont_beam1, ind_beam1 = self.beam1[0].contains(event)
+            if self.beam2 is not None:
+                cont_beam2, ind_beam2 = self.beam2[0].contains(event)
+            if self.beam3 is not None:
+                cont_beam3, ind_beam3 = self.beam3[0].contains(event)
+            if self.beam4 is not None:
+                cont_beam4, ind_beam4 = self.beam4[0].contains(event)
+            if self.vb is not None:
+                cont_vb, ind_vb = self.vb[0].contains(event)
+            if self.ds is not None:
+                cont_ds, ind_ds = self.ds[0].contains(event)
+
+            # Display result
+            if cont_beam1 and self.beam1[0].get_visible():
+                self.update_annot(ind_beam1, self.beam1[0], "B1")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_beam2 and self.beam2[0].get_visible():
+                self.update_annot(ind_beam2, self.beam2[0], "B2")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_beam3 and self.beam3[0].get_visible():
+                self.update_annot(ind_beam3, self.beam3[0], "B3")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            if cont_beam4 and self.beam4[0].get_visible():
+                self.update_annot(ind_beam4, self.beam4[0], "B4")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_vb and self.vb[0].get_visible():
+                self.update_annot(ind_vb, self.vb[0], "VB")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_ds and self.ds[0].get_visible():
+                self.update_annot(ind_ds, self.ds[0], "VTG")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Provides connection between data cursor and canvas.
+
+        Parameters
+        ----------
+        setting: bool
+            Identifies if the data cursor is selected.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/BoatSpeed.py b/UI/BoatSpeed.py
new file mode 100644
index 0000000000000000000000000000000000000000..a47fb6691cc5b6fe12452ea5003a8e549e5accb0
--- /dev/null
+++ b/UI/BoatSpeed.py
@@ -0,0 +1,637 @@
+import numpy as np
+from PyQt5 import QtCore
+from matplotlib.dates import DateFormatter, num2date
+from datetime import datetime
+
+
+class BoatSpeed(object):
+    """Class to generate boat speed time series plot. If checkboxes for the
+    boat speed reference (BT, GGA, VTG) are available they can be used to
+    control what references are plotted.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    cb: bool
+        Boolean to determine if checkboxes to control the boat speed reference
+        are to be used
+    cb_bt: QCheckBox
+        Name of QCheckBox for bottom track
+    cb_gga: QCheckBox
+        Name of QCheckBox for GGA
+    cb_vtg: QCheckBox
+        Name of QCheckBox for VTG
+    bt: list
+        Plot reference for bottom track
+    gga: list
+        Plot reference for GGA
+    vtg: list
+        Plot reference for VTG
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    x_axis_type: str
+        Identifies x-axis type (L-lenght, E-ensemble, T-time)
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.cb = None
+        self.cb_bt = None
+        self.cb_gga = None
+        self.cb_vtg = None
+        self.bt = None
+        self.gga = None
+        self.vtg = None
+        self.hover_connection = None
+        self.annot = None
+        self.x_axis_type = "E"
+
+    def create(
+        self,
+        transect,
+        units,
+        cb=False,
+        cb_bt=None,
+        cb_gga=None,
+        cb_vtg=None,
+        x_axis_type=None,
+    ):
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData containing boat speeds to be plotted
+        units: dict
+            Dictionary of units conversions
+        cb: bool
+            Boolean to determine if checkboxes to control the boat speed
+            reference are to be used
+        cb_bt: QCheckBox
+            Name of QCheckBox for bottom track
+        cb_gga: QCheckBox
+            Name of QCheckBox for GGA
+        cb_vtg: QCheckBox
+            Name of QCheckBox for VTG
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        """
+
+        # Set default axis
+        if x_axis_type is None:
+            x_axis_type = "E"
+        self.x_axis_type = x_axis_type
+
+        # Assign and save parameters
+        self.units = units
+        self.cb = cb
+        self.cb_bt = cb_bt
+        self.cb_gga = cb_gga
+        self.cb_vtg = cb_vtg
+
+        # Check the checkbox to determine what should be shown in the plot
+        control = self.checkbox_control(transect)
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.08, bottom=0.2, right=0.98, top=0.98, wspace=0.1, hspace=0
+        )
+        self.fig.ax.set_ylabel(self.canvas.tr("Boat speed" + units["label_V"]))
+        self.fig.ax.grid()
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+
+        # Initialize max trackers
+        max_gga = np.nan
+        max_vtg = np.nan
+
+        # Compute x axis data
+        x = None
+        if x_axis_type == "L":
+            boat_track = transect.boat_vel.compute_boat_track(transect=transect)
+            if not np.alltrue(np.isnan(boat_track["track_x_m"])):
+                x = boat_track["distance_m"] * units["L"]
+        elif x_axis_type == "E":
+            x = np.arange(1, len(transect.depths.bt_depths.depth_processed_m) + 1)
+        elif x_axis_type == "T":
+            timestamp = (
+                np.nancumsum(transect.date_time.ens_duration_sec)
+                + transect.date_time.start_serial_time
+            )
+            x = []
+            for stamp in timestamp:
+                x.append(datetime.utcfromtimestamp(stamp))
+            x = np.array(x)
+
+        # Plot bottom track boat speed
+        speed = np.sqrt(
+            transect.boat_vel.bt_vel.u_processed_mps[transect.in_transect_idx] ** 2
+            + transect.boat_vel.bt_vel.v_processed_mps[transect.in_transect_idx] ** 2
+        )
+        self.bt = self.fig.ax.plot(x, speed * units["V"], "r-")
+
+        # Plot invalid data points using a symbol to represent what caused the
+        # data to be invalid
+        invalid_bt = np.logical_not(
+            transect.boat_vel.bt_vel.valid_data[:, transect.in_transect_idx]
+        )
+        if invalid_bt is not None:
+            speed = np.sqrt(
+                transect.boat_vel.bt_vel.u_mps[transect.in_transect_idx] ** 2
+                + transect.boat_vel.bt_vel.v_mps[transect.in_transect_idx] ** 2
+            )
+            speed[np.isnan(speed)] = 0
+            self.bt.append(
+                self.fig.ax.plot(
+                    x[invalid_bt[1]],
+                    speed[invalid_bt[1]] * units["V"],
+                    "k",
+                    linestyle="",
+                    marker="$O$",
+                )[0]
+            )
+            self.bt.append(
+                self.fig.ax.plot(
+                    x[invalid_bt[2]],
+                    speed[invalid_bt[2]] * units["V"],
+                    "k",
+                    linestyle="",
+                    marker="$E$",
+                )[0]
+            )
+            self.bt.append(
+                self.fig.ax.plot(
+                    x[invalid_bt[3]],
+                    speed[invalid_bt[3]] * units["V"],
+                    "k",
+                    linestyle="",
+                    marker="$V$",
+                )[0]
+            )
+            self.bt.append(
+                self.fig.ax.plot(
+                    x[invalid_bt[4]],
+                    speed[invalid_bt[4]] * units["V"],
+                    "k",
+                    linestyle="",
+                    marker="$S$",
+                )[0]
+            )
+            self.bt.append(
+                self.fig.ax.plot(
+                    x[invalid_bt[5]],
+                    speed[invalid_bt[5]] * units["V"],
+                    "k",
+                    linestyle="",
+                    marker="$B$",
+                )[0]
+            )
+
+        max_bt = np.nanmax(speed)
+
+        # Based on checkbox control make bt visible or not
+        if control["bt"]:
+            for item in self.bt:
+                item.set_visible(True)
+        else:
+            for item in self.bt:
+                item.set_visible(False)
+
+        # Plot VTG boat speed
+        if transect.boat_vel.vtg_vel is not None:
+            speed = np.sqrt(
+                transect.boat_vel.vtg_vel.u_processed_mps[transect.in_transect_idx] ** 2
+                + transect.boat_vel.vtg_vel.v_processed_mps[transect.in_transect_idx]
+                ** 2
+            )
+            self.vtg = self.fig.ax.plot(x, speed * units["V"], "g-")
+
+            # Plot invalid data points using a symbol to represent what
+            # caused the data to be invalid
+            invalid_gps = np.logical_not(
+                transect.boat_vel.vtg_vel.valid_data[:, transect.in_transect_idx]
+            )
+
+            if 0 < np.sum(invalid_gps[0, :]) < invalid_gps.shape[1]:
+                speed = np.sqrt(
+                    transect.boat_vel.vtg_vel.u_mps[transect.in_transect_idx] ** 2
+                    + transect.boat_vel.vtg_vel.v_mps[transect.in_transect_idx] ** 2
+                )
+                speed[np.isnan(speed)] = 0
+                self.vtg.append(
+                    self.fig.ax.plot(
+                        x[invalid_gps[1]],
+                        speed[invalid_gps[1]] * units["V"],
+                        "k",
+                        linestyle="",
+                        marker="$O$",
+                    )[0]
+                )
+                self.vtg.append(
+                    self.fig.ax.plot(
+                        x[invalid_gps[5]],
+                        speed[invalid_gps[5]] * units["V"],
+                        "k",
+                        linestyle="",
+                        marker="$H$",
+                    )[0]
+                )
+                self.vtg.append(
+                    self.fig.ax.plot(
+                        x[invalid_gps[4]],
+                        speed[invalid_gps[4]] * units["V"],
+                        "k",
+                        linestyle="",
+                        marker="$S$",
+                    )[0]
+                )
+
+            max_vtg = np.nanmax(speed)
+            if control["vtg"]:
+                for item in self.vtg:
+                    item.set_visible(True)
+            else:
+                for item in self.vtg:
+                    item.set_visible(False)
+
+        # Plot GGA boat speed
+        if transect.boat_vel.gga_vel is not None:
+            speed = np.sqrt(
+                transect.boat_vel.gga_vel.u_processed_mps[transect.in_transect_idx] ** 2
+                + transect.boat_vel.gga_vel.v_processed_mps[transect.in_transect_idx]
+                ** 2
+            )
+            self.gga = self.fig.ax.plot(x, speed * units["V"], "b-")
+
+            # Plot invalid data points using a symbol to represent what caused
+            # the data to be invalid
+            invalid_gps = np.logical_not(
+                transect.boat_vel.gga_vel.valid_data[:, transect.in_transect_idx]
+            )
+            if 0 < np.sum(invalid_gps[0, :]) < invalid_gps.shape[1]:
+                speed = np.sqrt(
+                    transect.boat_vel.gga_vel.u_mps[transect.in_transect_idx] ** 2
+                    + transect.boat_vel.gga_vel.v_mps[transect.in_transect_idx] ** 2
+                )
+                speed[np.isnan(speed)] = 0
+                self.gga.append(
+                    self.fig.ax.plot(
+                        x[invalid_gps[1]],
+                        speed[invalid_gps[1]] * units["V"],
+                        "k",
+                        linestyle="",
+                        marker="$O$",
+                    )[0]
+                )
+                self.gga.append(
+                    self.fig.ax.plot(
+                        x[invalid_gps[2]],
+                        speed[invalid_gps[2]] * units["V"],
+                        "k",
+                        linestyle="",
+                        marker="$Q$",
+                    )[0]
+                )
+                self.gga.append(
+                    self.fig.ax.plot(
+                        x[invalid_gps[3]],
+                        speed[invalid_gps[3]] * units["V"],
+                        "k",
+                        linestyle="",
+                        marker="$A$",
+                    )[0]
+                )
+                self.gga.append(
+                    self.fig.ax.plot(
+                        x[invalid_gps[5]],
+                        speed[invalid_gps[5]] * units["V"],
+                        "k",
+                        linestyle="",
+                        marker="$H$",
+                    )[0]
+                )
+                self.gga.append(
+                    self.fig.ax.plot(
+                        x[invalid_gps[4]],
+                        speed[invalid_gps[4]] * units["V"],
+                        "k",
+                        linestyle="",
+                        marker="$S$",
+                    )[0]
+                )
+
+            max_gga = np.nanmax(speed)
+            if control["gga"]:
+                for item in self.gga:
+                    item.set_visible(True)
+            else:
+                for item in self.gga:
+                    item.set_visible(False)
+
+        # Set axis limits
+        max_y = np.nanmax([max_bt, max_gga, max_vtg]) * 1.1
+        self.fig.ax.set_ylim(top=np.ceil(max_y * units["L"]), bottom=-0.5)
+        x = x[transect.in_transect_idx - transect.in_transect_idx[0]]
+        if x_axis_type == "L":
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(
+                    right=-1 * x[-1] * 0.02 * units["L"], left=x[-1] * 1.02 * units["L"]
+                )
+            else:
+                self.fig.ax.set_xlim(
+                    left=-1 * x[-1] * 0.02 * units["L"], right=x[-1] * 1.02 * units["L"]
+                )
+            self.fig.ax.set_xlabel(self.canvas.tr("Length" + units["label_L"]))
+        elif x_axis_type == "E":
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(right=0, left=x[-1] + 1)
+            else:
+                self.fig.ax.set_xlim(left=0, right=x[-1] + 1)
+            self.fig.ax.set_xlabel(self.canvas.tr("Ensembles"))
+        elif x_axis_type == "T":
+            axis_buffer = (timestamp[-1] - timestamp[0]) * 0.02
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(
+                    right=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                    left=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                )
+            else:
+                self.fig.ax.set_xlim(
+                    left=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                    right=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                )
+            date_form = DateFormatter("%H:%M:%S")
+            self.fig.ax.xaxis.set_major_formatter(date_form)
+            self.fig.ax.set_xlabel(self.canvas.tr("Time"))
+
+        # Initialize annotation for data cursor
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    def checkbox_control(self, transect):
+        """Controls the visibility and checks the status of checkboxes.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData with boat speeds to be plotted.
+        """
+
+        # Initialize control dictionary
+        control = {"bt": True, "gga": True, "vtg": True, "vectors": True}
+
+        # If checkboxes are available, enable the checkboxes if transect
+        # contains that type of data
+        if self.cb:
+            # Enable check boxes as data is available
+            if transect.boat_vel.gga_vel is not None:
+                self.cb_gga.setEnabled(True)
+            else:
+                self.cb_gga.setCheckState(QtCore.Qt.Unchecked)
+                self.cb_gga.setEnabled(False)
+
+            if transect.boat_vel.vtg_vel is not None:
+                self.cb_vtg.setEnabled(True)
+            else:
+                self.cb_vtg.setCheckState(QtCore.Qt.Unchecked)
+                self.cb_vtg.setEnabled(False)
+
+            # Get checkbox status
+            # BT
+            if self.cb_bt.checkState() == QtCore.Qt.Checked:
+                control["bt"] = True
+            else:
+                control["bt"] = False
+            # GGA
+            if self.cb_gga.checkState() == QtCore.Qt.Checked:
+                control["gga"] = True
+            else:
+                control["gga"] = False
+            # VTG
+            if self.cb_vtg.checkState() == QtCore.Qt.Checked:
+                control["vtg"] = True
+            else:
+                control["vtg"] = False
+        return control
+
+    def change(self):
+        """Changes the visibility of the various boat speed references based
+        on user input via checkboxes.
+        """
+
+        # If checkboxes are available, check status and set boat speed
+        # reference line visibility accordingly.
+        if self.cb:
+            if self.cb_bt.checkState() == QtCore.Qt.Checked:
+                for item in self.bt:
+                    item.set_visible(True)
+            else:
+                for item in self.bt:
+                    item.set_visible(False)
+            # GGA
+            if self.cb_gga.checkState() == QtCore.Qt.Checked:
+                for item in self.gga:
+                    item.set_visible(True)
+            elif self.gga is not None:
+                for item in self.gga:
+                    item.set_visible(False)
+            # VTG
+            if self.cb_vtg.checkState() == QtCore.Qt.Checked:
+                for item in self.vtg:
+                    item.set_visible(True)
+            elif self.vtg is not None:
+                for item in self.vtg:
+                    item.set_visible(False)
+
+            # Draw canvas
+            self.canvas.draw()
+
+    def update_annot(self, ind, plt_ref, ref_label):
+        """Updates the location and text and makes visible the previously
+        initialized and hidden annotation.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        ref_label: str
+            Label used to ID data type in annotation
+        """
+
+        # Get selected data coordinates
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+
+        self.annot.xy = pos
+
+        # Format and display text
+        if self.x_axis_type == "T":
+            x_label = num2date(pos[0]).strftime("%H:%M:%S.%f")[:-4]
+            text = "x: {}, {}: {:.2f}".format(x_label, ref_label, pos[1])
+        else:
+            text = "x: {:.2f}, {}: {:.2f}".format(pos[0], ref_label, pos[1])
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the
+        annotation. If the location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            cont_bt = False
+            cont_gga = False
+            cont_vtg = False
+            ind_bt = None
+            ind_gga = None
+            ind_vtg = None
+
+            if self.bt is not None:
+                cont_bt, ind_bt = self.bt[0].contains(event)
+            if self.gga is not None:
+                cont_gga, ind_gga = self.gga[0].contains(event)
+            if self.vtg is not None:
+                cont_vtg, ind_vtg = self.vtg[0].contains(event)
+            if cont_bt and self.bt[0].get_visible():
+                self.update_annot(ind_bt, self.bt[0], "BT")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_gga and self.gga[0].get_visible():
+                self.update_annot(ind_gga, self.gga[0], "GGA")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_vtg and self.vtg[0].get_visible():
+                self.update_annot(ind_vtg, self.vtg[0], "VTG")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted
+                # data hide the annotation.
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/Comment.py b/UI/Comment.py
new file mode 100644
index 0000000000000000000000000000000000000000..4ea9d4bed4754a84e2b73a722cbcf17eb0a4d161
--- /dev/null
+++ b/UI/Comment.py
@@ -0,0 +1,40 @@
+import getpass
+from datetime import datetime
+from PyQt5 import QtWidgets, QtGui
+from UI import wComment
+
+
+class Comment(QtWidgets.QDialog, wComment.Ui_Comment):
+    """Dialog to allow users to enter comments.
+
+    Parameters
+    ----------
+    wComment.Ui_Comment : QDialog
+        Dialog window with options for users
+
+    Attributes
+    ----------
+    text: str
+        Text in text edit box
+    """
+
+    def __init__(self, tab_name=None, parent=None):
+        super(Comment, self).__init__(parent)
+        self.setupUi(self)
+
+        # Set font
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.text_edit_comment.setFont(font)
+
+        # Create and add default information
+        time_stamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+        user_name = getpass.getuser()
+        if tab_name is not None:
+            self.text = "[" + tab_name + ", " + time_stamp + ", " + user_name + "]:  "
+        else:
+            self.text = "[" + time_stamp + ", " + user_name + "]:  "
+        self.text_edit_comment.setPlainText(self.text)
+
+        self.text_edit_comment.setFocus()
+        self.text_edit_comment.moveCursor(QtGui.QTextCursor.End)
diff --git a/UI/CrossSection.py b/UI/CrossSection.py
new file mode 100644
index 0000000000000000000000000000000000000000..c2ed54d962e837713556db1b953a0ea71ef91967
--- /dev/null
+++ b/UI/CrossSection.py
@@ -0,0 +1,478 @@
+import numpy as np
+from PyQt5 import QtCore
+from matplotlib.dates import DateFormatter, num2date
+from datetime import datetime
+
+
+class CrossSection(object):
+    """Class to generate final cross sections using the user settings.
+    What cross sections are plotted are controlled by the user through checkboxes.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    cb_beam_cs: QCheckBox
+        Checkbox to plot cross section based on 4 beam average
+    cb_vert_cs: QCheckBox
+        Checkbox to plot cross section based on vertical beam
+    cb_ds_cs: QCheckBox
+        Checkbox to plot cross section based on depth sounder
+    cb_final_cs: QCheckBox
+        Checkbox to plot final cross section based on user selections
+    beam_cs: list
+        Plot reference for 4 beam average cross section
+    vb_cs: list
+        Plot reference for vertical beam cross section
+    ds_cs: list
+        Plot reference for depth sounder cross section
+    final_cs: list
+        Plot reference for final cross section
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    x_axis_type: str
+        Identifies x-axis type (L-length, E-ensemble, T-time)
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.cb_beam_cs = None
+        self.cb_vert_cs = None
+        self.cb_ds_cs = None
+        self.cb_final_cs = None
+        self.beam_cs = None
+        self.vb_cs = None
+        self.ds_cs = None
+        self.final_cs = None
+        self.hover_connection = None
+        self.annot = None
+        self.x_axis_type = "L"
+
+    def create(
+        self,
+        transect,
+        units,
+        cb_beam_cs=None,
+        cb_vert_cs=None,
+        cb_ds_cs=None,
+        cb_final_cs=None,
+        x_axis_type=None,
+    ):
+
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData containing boat speeds to be plotted
+        units: dict
+            Dictionary of units conversions
+        cb_beam_cs: QCheckBox
+            Checkbox to plot cross section based on 4 beam average
+        cb_vert_cs: QCheckBox
+            Checkbox to plot cross section based on vertical beam
+        cb_ds_cs: QCheckBox
+            Checkbox to plot cross section based on depth sounder
+        cb_final_cs: QCheckBox
+            Checkbox to plot final cross section based on user selections
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        """
+
+        # Set default axis
+        if x_axis_type is None:
+            x_axis_type = "L"
+        self.x_axis_type = x_axis_type
+
+        # Assign and save parameters
+        self.cb_beam_cs = cb_beam_cs
+        self.cb_vert_cs = cb_vert_cs
+        self.cb_ds_cs = cb_ds_cs
+        self.cb_final_cs = cb_final_cs
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.08, bottom=0.2, right=0.98, top=0.98, wspace=0.1, hspace=0
+        )
+        self.fig.ax.set_ylabel(self.canvas.tr("Depth" + units["label_L"]))
+        self.fig.ax.grid()
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+
+        # Initialize max trackers
+        max_vb = np.nan
+        max_ds = np.nan
+
+        # Compute x axis data
+        x = None
+        if x_axis_type == "L":
+            boat_track = transect.boat_vel.compute_boat_track(transect=transect)
+            if not np.alltrue(np.isnan(boat_track["track_x_m"])):
+                x = boat_track["distance_m"] * units["L"]
+        elif x_axis_type == "E":
+            x = np.arange(1, len(transect.depths.bt_depths.depth_processed_m) + 1)
+        elif x_axis_type == "T":
+            timestamp = (
+                np.nancumsum(transect.date_time.ens_duration_sec)
+                + transect.date_time.start_serial_time
+            )
+            x = []
+            for stamp in timestamp:
+                x.append(datetime.utcfromtimestamp(stamp))
+            x = np.array(x)
+
+        # Check to make sure there is valid boat track data
+        if x is not None:
+            depth_selected = getattr(transect.depths, transect.depths.selected)
+            beam_depths = depth_selected.depth_processed_m
+
+            # Plot Final
+            self.final_cs = self.fig.ax.plot(
+                x,
+                beam_depths * units["L"],
+                linestyle="-",
+                marker="o",
+                color="k",
+                markersize=4,
+            )
+            max_final = np.nanmax(beam_depths)
+
+            # Plot 4 beam average
+            beam_depths = transect.depths.bt_depths.depth_processed_m
+            self.beam_cs = self.fig.ax.plot(
+                x,
+                beam_depths * units["L"],
+                linestyle="-",
+                marker="o",
+                color="r",
+                markersize=4,
+            )
+
+            max_beam = np.nanmax(beam_depths)
+
+            # Plot vertical beam
+            if transect.depths.vb_depths is not None:
+                beam_depths = transect.depths.vb_depths.depth_processed_m
+                self.vb_cs = self.fig.ax.plot(
+                    x,
+                    beam_depths * units["L"],
+                    color="#aa00ff",
+                    linestyle="-",
+                    marker="o",
+                    markersize=4,
+                )
+                max_vb = np.nanmax(beam_depths)
+
+            # Plot depth sounder
+            if transect.depths.ds_depths is not None:
+                beam_depths = transect.depths.ds_depths.depth_processed_m
+                self.ds_cs = self.fig.ax.plot(
+                    x,
+                    beam_depths * units["L"],
+                    color="#00aaff",
+                    linestyle="-",
+                    marker="o",
+                    markersize=4,
+                )
+                max_ds = np.nanmax(beam_depths)
+
+            # Based on checkbox control make cross sections visible or not
+            if cb_beam_cs.checkState() == QtCore.Qt.Checked:
+                for item in self.beam_cs:
+                    item.set_visible(True)
+            else:
+                for item in self.beam_cs:
+                    item.set_visible(False)
+
+            if cb_vert_cs.isEnabled():
+                if cb_vert_cs.checkState() == QtCore.Qt.Checked:
+                    for item in self.vb_cs:
+                        item.set_visible(True)
+                elif self.vb_cs is not None:
+                    for item in self.vb_cs:
+                        item.set_visible(False)
+
+            if cb_ds_cs.isEnabled():
+                if cb_ds_cs.checkState() == QtCore.Qt.Checked:
+                    for item in self.ds_cs:
+                        item.set_visible(True)
+                elif self.ds_cs is not None:
+                    for item in self.ds_cs:
+                        item.set_visible(False)
+
+            # Set axis limits
+            max_y = np.nanmax([max_beam, max_vb, max_ds, max_final]) * 1.1
+            self.fig.ax.invert_yaxis()
+            self.fig.ax.set_ylim(bottom=np.ceil(max_y * units["L"]), top=0)
+
+            if x_axis_type == "L":
+                if transect.start_edge == "Right":
+                    self.fig.ax.invert_xaxis()
+                    self.fig.ax.set_xlim(
+                        right=-1 * x[-1] * 0.02 * units["L"],
+                        left=x[-1] * 1.02 * units["L"],
+                    )
+                else:
+                    self.fig.ax.set_xlim(
+                        left=-1 * x[-1] * 0.02 * units["L"],
+                        right=x[-1] * 1.02 * units["L"],
+                    )
+                self.fig.ax.set_xlabel(self.canvas.tr("Length" + units["label_L"]))
+            elif x_axis_type == "E":
+                if transect.start_edge == "Right":
+                    self.fig.ax.invert_xaxis()
+                    self.fig.ax.set_xlim(right=0, left=x[-1] + 1)
+                else:
+                    self.fig.ax.set_xlim(left=0, right=x[-1] + 1)
+                self.fig.ax.set_xlabel(self.canvas.tr("Ensembles"))
+            elif x_axis_type == "T":
+                axis_buffer = (timestamp[-1] - timestamp[0]) * 0.02
+                if transect.start_edge == "Right":
+                    self.fig.ax.invert_xaxis()
+                    self.fig.ax.set_xlim(
+                        right=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                        left=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                    )
+                else:
+                    self.fig.ax.set_xlim(
+                        left=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                        right=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                    )
+                date_form = DateFormatter("%H:%M:%S")
+                self.fig.ax.xaxis.set_major_formatter(date_form)
+                self.fig.ax.set_xlabel(self.canvas.tr("Time"))
+
+            # Initialize annotation for data cursor
+            self.annot = self.fig.ax.annotate(
+                "",
+                xy=(0, 0),
+                xytext=(-20, 20),
+                textcoords="offset points",
+                bbox=dict(boxstyle="round", fc="w"),
+                arrowprops=dict(arrowstyle="->"),
+            )
+
+            self.annot.set_visible(False)
+
+            self.canvas.draw()
+
+    def change(self):
+        """Changes the visibility of the available beams based on user input
+        via checkboxes."""
+
+        # Set visibility of beams based on user input
+        if self.cb_beam_cs.checkState() == QtCore.Qt.Checked:
+            for item in self.beam_cs:
+                item.set_visible(True)
+        else:
+            for item in self.beam_cs:
+                item.set_visible(False)
+
+        if self.cb_vert_cs.isEnabled():
+            if self.cb_vert_cs.checkState() == QtCore.Qt.Checked:
+                for item in self.vb_cs:
+                    item.set_visible(True)
+            else:
+                for item in self.vb_cs:
+                    item.set_visible(False)
+
+        if self.cb_ds_cs.isEnabled():
+            if self.cb_ds_cs.checkState() == QtCore.Qt.Checked:
+                for item in self.ds_cs:
+                    item.set_visible(True)
+            else:
+                for item in self.ds_cs:
+                    item.set_visible(False)
+
+        if self.cb_final_cs.checkState() == QtCore.Qt.Checked:
+            for item in self.final_cs:
+                item.set_visible(True)
+        else:
+            for item in self.final_cs:
+                item.set_visible(False)
+
+        # Draw canvas
+        self.canvas.draw()
+
+    def update_annot(self, ind, plt_ref, ref_label):
+        """Updates the location and text and makes visible the previously initialized
+        and hidden annotation.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        ref_label: str
+            Label used to ID data type in annotation
+        """
+
+        # Get selected data coordinates
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the axis
+        # the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+        self.annot.xy = pos
+
+        # Format and display text
+        if self.x_axis_type == "T":
+            x_label = num2date(pos[0]).strftime("%H:%M:%S.%f")[:-4]
+            text = "x: {}, {}: {:.2f}".format(x_label, ref_label, pos[1])
+        else:
+            text = "x: {:.2f}, {}: {:.2f}".format(pos[0], ref_label, pos[1])
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the annotation. If the
+        location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            cont_final = False
+            cont_vb = False
+            cont_ds = False
+            cont_4b = False
+            ind_final = None
+            ind_vb = None
+            ind_ds = None
+            ind_4b = None
+
+            if self.final_cs is not None:
+                cont_final, ind_final = self.final_cs[0].contains(event)
+            if self.vb_cs is not None:
+                cont_vb, ind_vb = self.vb_cs[0].contains(event)
+            if self.ds_cs is not None:
+                cont_ds, ind_ds = self.ds_cs[0].contains(event)
+            if self.beam_cs is not None:
+                cont_4b, ind_4b = self.beam_cs[0].contains(event)
+
+            if cont_final and self.final_cs[0].get_visible():
+                self.update_annot(ind_final, self.final_cs[0], "Final")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_vb and self.vb_cs[0].get_visible():
+                self.update_annot(ind_vb, self.vb_cs[0], "VB")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_ds and self.ds_cs[0].get_visible():
+                self.update_annot(ind_ds, self.ds_cs[0], "DS")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_4b and self.beam_cs[0].get_visible():
+                self.update_annot(ind_4b, self.beam_cs[0], "DS")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted data
+                # hide the annotation.
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/DischargeTS.py b/UI/DischargeTS.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb1bcd6a09fb7154a74b061fd30345241c7c1498
--- /dev/null
+++ b/UI/DischargeTS.py
@@ -0,0 +1,258 @@
+import numpy as np
+from datetime import datetime
+import matplotlib.dates as mdates
+
+
+class DischargeTS(object):
+    """Class to generate discharge time series plot.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.hover_connection = None
+        self.annot = None
+
+    def create(self, meas, checked, transect_idx, units):
+        """Generates the discharge plot.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        checked: list
+            Indices of transects used for discharge
+        units: dict
+            Dictionary of units conversion factors
+        """
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        self.fig.ax.clear()
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.2, bottom=0.15, right=0.98, top=0.98, wspace=0.1, hspace=0
+        )
+
+        save_y = []
+        save_x = []
+        # Plot each transects discharge as a horizontal line from start time to end time
+        for idx in checked:
+            x = []
+            y = []
+            x.append(
+                datetime.utcfromtimestamp(
+                    meas.transects[idx].date_time.start_serial_time
+                )
+            )
+            x.append(
+                datetime.utcfromtimestamp(meas.transects[idx].date_time.end_serial_time)
+            )
+            y.append(meas.discharge[idx].total * units["Q"])
+            y.append(meas.discharge[idx].total * units["Q"])
+            self.fig.ax.plot(np.array(x), np.array(y), color="black")
+            save_y.append(y)
+            save_x.append(x)
+
+        avg_y = []
+        for n in range(len(save_y)):
+            if n < len(save_y):
+                avg_y.append(
+                    [np.nanmean(save_y[0 : n + 1]), np.nanmean(save_y[0 : n + 1])]
+                )
+        avg_y = np.array(avg_y).flatten()
+        y_upper = np.array(avg_y) * 1.05
+        y_lower = np.array(avg_y) * 0.95
+        x_flat = np.array(save_x).flatten()
+        self.fig.ax.fill_between(x_flat, y_upper, y_lower, color="aliceblue")
+        self.fig.ax.plot(x_flat, y_upper, color="cornflowerblue")
+        self.fig.ax.plot(x_flat, y_lower, color="cornflowerblue")
+        self.fig.ax.plot(x_flat, avg_y, color="blue")
+        self.fig.ax.plot(
+            save_x[transect_idx], save_y[transect_idx], color="black", linewidth=5
+        )
+
+        # Customize axis
+        time_fmt = mdates.DateFormatter("%H:%M:%S")
+        self.fig.ax.xaxis.set_major_formatter(time_fmt)
+        self.fig.autofmt_xdate()
+        self.fig.ax.set_xlabel(self.canvas.tr("Time "))
+        self.fig.ax.set_ylabel(self.canvas.tr("Discharge ") + units["label_Q"])
+        self.fig.ax.xaxis.label.set_fontsize(10)
+        self.fig.ax.yaxis.label.set_fontsize(10)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+        self.fig.ax.grid()
+
+        # Initialize annotation for data cursor
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    def update_annot(self, ind, plt_ref):
+        """Updates the location and text and makes visible the previously initialized
+        and hidden annotation.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        """
+
+        # Get selected data coordinates
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the axis
+        # the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+        self.annot.xy = pos
+
+        # Format and display text
+        text = "x: {}, y: {:.2f}".format(
+            plt_ref._xorig[ind["ind"][0]].strftime("%H:%M:%S"), pos[1]
+        )
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with temperature data and makes
+        annotation visible and calls method to update the text of the annotation. If the
+        location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            cont = False
+            ind = None
+            plotted_line = None
+
+            # Find the transect(line) that contains the mouse click
+            for plotted_line in self.fig.ax.lines:
+                cont, ind = plotted_line.contains(event)
+                if cont:
+                    break
+            if cont:
+                self.update_annot(ind, plotted_line)
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted data
+                # hide the annotation.
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/Disclaimer.py b/UI/Disclaimer.py
new file mode 100644
index 0000000000000000000000000000000000000000..9ba19a1fd0aa44de4d8d3ad993818d34a6cb6b30
--- /dev/null
+++ b/UI/Disclaimer.py
@@ -0,0 +1,11 @@
+from PyQt5 import QtWidgets
+from UI import wDisclaimer
+
+
+class Disclaimer(QtWidgets.QDialog, wDisclaimer.Ui_Disclaimer):
+    """Dialog to force users to accept the disclaimer and license the
+    first time the run the code."""
+
+    def __init__(self, parent=None):
+        super(Disclaimer, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/Draft.py b/UI/Draft.py
new file mode 100644
index 0000000000000000000000000000000000000000..de417c80c1f5155c9a066afa7865f3f1c82f1fa4
--- /dev/null
+++ b/UI/Draft.py
@@ -0,0 +1,16 @@
+from PyQt5 import QtWidgets
+from UI import wDraft
+
+
+class Draft(QtWidgets.QDialog, wDraft.Ui_draft):
+    """Dialog to allow users to change draft.
+
+    Parameters
+    ----------
+    wDraft.Ui_draft : QDialog
+        Dialog window to allow users to change draft
+    """
+
+    def __init__(self, parent=None):
+        super(Draft, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/EdgeDist.py b/UI/EdgeDist.py
new file mode 100644
index 0000000000000000000000000000000000000000..c293a8614bfcb3d8a87fe180739d154b5853b5f1
--- /dev/null
+++ b/UI/EdgeDist.py
@@ -0,0 +1,16 @@
+from PyQt5 import QtWidgets
+from UI import wEdgeDist
+
+
+class EdgeDist(QtWidgets.QDialog, wEdgeDist.Ui_edge_dist):
+    """Dialog to allow users to change temperature source.
+
+    Parameters
+    ----------
+    wEdgeDist.Ui_edge_dist : QDialog
+        Dialog window to allow users to change the edge distance
+    """
+
+    def __init__(self, parent=None):
+        super(EdgeDist, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/EdgeEns.py b/UI/EdgeEns.py
new file mode 100644
index 0000000000000000000000000000000000000000..0c887f19b57796b0f891d1d8808dc7a54701bad5
--- /dev/null
+++ b/UI/EdgeEns.py
@@ -0,0 +1,16 @@
+from PyQt5 import QtWidgets
+from UI import wEdgeEns
+
+
+class EdgeEns(QtWidgets.QDialog, wEdgeEns.Ui_edge_ens):
+    """Dialog to allow users to change temperature source.
+
+    Parameters
+    ----------
+    wEdgeEns.Ui_edge_ens : QDialog
+        Dialog window to allow users to change the number of ensembles in an edge
+    """
+
+    def __init__(self, parent=None):
+        super(EdgeEns, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/EdgeType.py b/UI/EdgeType.py
new file mode 100644
index 0000000000000000000000000000000000000000..b07d1f303f5b2d44ea523f543cb16169fe08e3cb
--- /dev/null
+++ b/UI/EdgeType.py
@@ -0,0 +1,16 @@
+from PyQt5 import QtWidgets
+from UI import wEdgeType
+
+
+class EdgeType(QtWidgets.QDialog, wEdgeType.Ui_edge_type):
+    """Dialog to allow users to change temperature source.
+
+    Parameters
+    ----------
+    wEdgeType.Ui_edge_type : QDialog
+        Dialog window to allow users to change edge type
+    """
+
+    def __init__(self, parent=None):
+        super(EdgeType, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/ExtrapPlot.py b/UI/ExtrapPlot.py
new file mode 100644
index 0000000000000000000000000000000000000000..a870dbd7c6322529d275d517d4a36180d5dd6b30
--- /dev/null
+++ b/UI/ExtrapPlot.py
@@ -0,0 +1,560 @@
+import numpy as np
+import matplotlib.cm as cm
+
+
+class ExtrapPlot(object):
+    """Generates graphics of extrapolation.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas
+    fig: Object
+        Figure object of the canvas
+    meas: Measurement
+        Object of class Measurement
+    checked: list
+        List of transect indices of transects used to compute discharge
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.meas = None
+        self.checked = None
+        self.hover_connection = None
+        self.annot = None
+
+    def create(
+        self,
+        meas,
+        checked,
+        idx=-1,
+        data_type="Discharge",
+        cb_data=True,
+        cb_surface=False,
+        cb_trans_medians=False,
+        cb_trans_fit=False,
+        cb_meas_medians=True,
+        cb_meas_fit=True,
+        auto=False,
+    ):
+        """Creates figure for extrapolation plot and calls associated methods to
+        added data to the axes.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        checked: list
+            List of indices of transects used to compute discharge
+        idx: int
+            Index of data to plot
+        data_type: str
+            Type of data (Discharge or Velocity)
+        cb_data: bool
+            Plot depth cell data (True or False)
+        cb_surface: bool
+            Highlight surface cell data (True or False)
+        cb_trans_medians: bool
+            Plot medians of transects (True or False)
+        cb_trans_fit: bool
+            Plot extrapolation fit for each transect (True or False)
+        cb_meas_medians: bool
+            Plot medians for entire measurement (True or False)
+        cb_meas_fit: bool
+            Plot extrapolation fit for entire measurement (True or False)
+        auto: bool
+            Indicator that the auto fit should be shown in addition to the selected fit.
+        """
+
+        # Initialize variables
+        self.meas = meas
+        self.checked = checked
+        extrap_fit = meas.extrap_fit
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(111)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.13, bottom=0.1, right=0.98, top=0.98, wspace=0.1, hspace=0
+        )
+
+        # If valid data exist create graph
+        if np.any(np.logical_not(np.isnan(extrap_fit.norm_data[-1].unit_normalized))):
+
+            # Show all normalized data
+            if cb_data:
+                self.extrap_plot_data(extrap_fit.norm_data[idx])
+
+            # Highlight surface cells
+            if cb_surface:
+                self.extrap_plot_surface(extrap_fit.norm_data[idx])
+
+            # Show fit for individual transect(s)
+            if cb_trans_fit:
+                if idx == len(extrap_fit.norm_data) - 1:
+                    self.extrap_plot_fit(extrap_fit.sel_fit[0:-1])
+                else:
+                    self.extrap_plot_fit(extrap_fit.sel_fit[idx], idx)
+
+            # Show median for individual transect(s)
+            if cb_trans_medians:
+                if idx == len(extrap_fit.norm_data) - 1:
+                    self.extrap_plot_med(extrap_fit.norm_data[0:-1])
+                else:
+                    self.extrap_plot_med(extrap_fit.norm_data[idx], idx)
+
+            # Show median values with error bars for measurement
+            if cb_meas_medians:
+                self.extrap_plot_med(extrap_fit.norm_data[-1], -1)
+
+            # Show measurement fit
+            if cb_meas_fit:
+                self.extrap_plot_fit(extrap_fit.sel_fit[-1], -1, auto)
+
+            # Configure axes
+            if data_type == "Discharge":
+                self.fig.ax.set_xlabel(self.canvas.tr("Normalized Unit Q "))
+            else:
+                self.fig.ax.set_xlabel(self.canvas.tr("Normalized Velocity"))
+            self.fig.ax.set_ylabel(self.canvas.tr("Normalized Z "))
+            self.fig.ax.xaxis.label.set_fontsize(10)
+            self.fig.ax.yaxis.label.set_fontsize(10)
+            self.fig.ax.tick_params(
+                axis="both",
+                direction="in",
+                bottom=True,
+                top=True,
+                left=True,
+                right=True,
+            )
+            self.fig.ax.grid()
+            for label in self.fig.ax.get_xticklabels() + self.fig.ax.get_yticklabels():
+                label.set_fontsize(10)
+
+            # Display the use weighted setting on the figure
+            if meas.extrap_fit.norm_data[-1].use_weighted:
+                self.fig.ax.text(0.1, 0.95, "Q Weighted = True", fontweight="bold")
+            else:
+                self.fig.ax.text(0.1, 0.95, "Q Weighted = False", fontweight="bold")
+
+            # Scale axes
+            if np.any(
+                np.logical_not(np.isnan(extrap_fit.norm_data[idx].unit_normalized))
+            ):
+                min_avg = np.nanmin(
+                    extrap_fit.norm_data[idx].unit_normalized_25[
+                        extrap_fit.norm_data[idx].valid_data
+                    ]
+                )
+                max_avg = np.nanmax(
+                    extrap_fit.norm_data[idx].unit_normalized_75[
+                        extrap_fit.norm_data[idx].valid_data
+                    ]
+                )
+            else:
+                min_avg = np.nan
+                max_avg = np.nan
+
+            if min_avg > 0 and max_avg > 0:
+                min_avg = 0
+                lower = 0
+            elif np.isnan(min_avg):
+                lower = 0
+            else:
+                lower = min_avg * 1.2
+
+            if max_avg < 0 and min_avg < 0:
+                upper = 0
+            elif np.isnan(max_avg):
+                upper = 0
+            else:
+                upper = max_avg * 1.2
+
+            self.fig.ax.set_ylim(top=1, bottom=0)
+            self.fig.ax.set_xlim(left=lower, right=upper)
+
+            # Initialize annotation for data cursor
+            self.annot = self.fig.ax.annotate(
+                "",
+                xy=(0, 0),
+                xytext=(-20, 20),
+                textcoords="offset points",
+                bbox=dict(boxstyle="round", fc="w"),
+                arrowprops=dict(arrowstyle="->"),
+            )
+
+            self.annot.set_visible(False)
+
+            self.canvas.draw()
+
+    def extrap_plot_med(self, norm_data, idx=None):
+        """Plots median values and associated error bars.
+
+        Parameters
+        ----------
+        norm_data: list or NormData
+            List of or single object of class NormData
+        idx: int
+            Index to data to be plotted
+        """
+
+        # If norm_data is a list is contains data from multiple transects
+        if type(norm_data) is list:
+
+            # Plot all transects
+            for idx in self.checked:
+
+                # All median values in red
+                self.fig.ax.plot(
+                    norm_data[idx].unit_normalized_med,
+                    norm_data[idx].unit_normalized_z,
+                    "rs",
+                    markerfacecolor="red",
+                    linestyle="None",
+                )
+
+                # All error bars in red
+                for n in range(len(norm_data[idx].unit_normalized_25)):
+                    self.fig.ax.plot(
+                        [
+                            norm_data[idx].unit_normalized_25[n],
+                            norm_data[idx].unit_normalized_75[n],
+                        ],
+                        [
+                            norm_data[idx].unit_normalized_z[n],
+                            norm_data[idx].unit_normalized_z[n],
+                        ],
+                        "-r",
+                    )
+
+                # Color valid transect data by start bank
+                if self.meas.transects[idx].start_edge == "Left":
+                    line_color = "#ff00ff"
+                else:
+                    line_color = "b"
+
+                # Valid median values
+                self.fig.ax.plot(
+                    norm_data[idx].unit_normalized_med[norm_data[idx].valid_data],
+                    norm_data[idx].unit_normalized_z[norm_data[idx].valid_data],
+                    marker="s",
+                    color=line_color,
+                    markerfacecolor=line_color,
+                    linestyle="None",
+                )
+
+                # Valid error bars
+                for n in norm_data[idx].valid_data:
+                    self.fig.ax.plot(
+                        [
+                            norm_data[idx].unit_normalized_25[n],
+                            norm_data[idx].unit_normalized_75[n],
+                        ],
+                        [
+                            norm_data[idx].unit_normalized_z[n],
+                            norm_data[idx].unit_normalized_z[n],
+                        ],
+                        color=line_color,
+                    )
+
+        # Data for only 1 transect of the composite measurement
+        else:
+
+            # If composite measurement the color is black otherwise use start bank
+            if idx == -1:
+                line_color = "k"
+            elif self.meas.transects[idx].start_edge == "Left":
+                line_color = "#ff00ff"
+            else:
+                line_color = "b"
+
+            # All median values in red
+            self.fig.ax.plot(
+                norm_data.unit_normalized_med,
+                norm_data.unit_normalized_z,
+                "rs",
+                markerfacecolor="red",
+                linestyle="None",
+            )
+
+            # All error bars in red
+            for n in range(len(norm_data.unit_normalized_25)):
+                self.fig.ax.plot(
+                    [norm_data.unit_normalized_25[n], norm_data.unit_normalized_75[n]],
+                    [norm_data.unit_normalized_z[n], norm_data.unit_normalized_z[n]],
+                    "r-",
+                )
+
+            # Valid median values
+            self.fig.ax.plot(
+                norm_data.unit_normalized_med[norm_data.valid_data],
+                norm_data.unit_normalized_z[norm_data.valid_data],
+                marker="s",
+                color=line_color,
+                markerfacecolor=line_color,
+                linestyle="None",
+            )
+
+            # Valid error bars
+            for idx in norm_data.valid_data:
+                self.fig.ax.plot(
+                    [
+                        norm_data.unit_normalized_25[idx],
+                        norm_data.unit_normalized_75[idx],
+                    ],
+                    [
+                        norm_data.unit_normalized_z[idx],
+                        norm_data.unit_normalized_z[idx],
+                    ],
+                    color=line_color,
+                )
+
+    def extrap_plot_fit(self, sel_fit, idx=None, auto=False):
+        """Plots the automatic and/or selected fit.
+
+        Parameters
+        ----------
+        sel_fit: list or SelectFit
+            List of or single object of class SelectFit
+        idx: int
+            Index of data to be plotted
+        auto: bool
+            Indicator that the auto fit should be shown in addition to the selected fit.
+        """
+
+        # If sel_fit is a list plot data from all checked transects
+        if type(sel_fit) is list:
+            for idx in self.checked:
+                if self.meas.transects[idx].start_edge == "Left":
+                    line_color = "#ff00ff"
+                else:
+                    line_color = "b"
+
+                self.fig.ax.plot(
+                    sel_fit[idx].u, sel_fit[idx].z, color=line_color, linewidth=2
+                )
+
+        # If sel_fit is a single data set
+        else:
+            # If the data set is a composite for the measurement plot in black
+            # otherwise use start bank
+            if idx == -1:
+                line_color = "k"
+            elif self.meas.transects[idx].start_edge == "Left":
+                line_color = "#ff00ff"
+            else:
+                line_color = "b"
+
+            # Used by main tab to show both Auto and Selected.
+            if auto:
+                self.fig.ax.plot(sel_fit.u_auto, sel_fit.z_auto, "-g", linewidth=3)
+            self.fig.ax.plot(sel_fit.u, sel_fit.z, color=line_color, linewidth=2)
+
+    def extrap_plot_data(self, norm_data):
+        """Plot normalized data for each depth cell. These data will be either for a
+        single transect or for the composite for the whole measurement.
+
+        Parameters
+        ----------
+        norm_data: NormData
+            Object of class NormData
+
+        """
+
+        if norm_data.weights is not None and norm_data.weights.size > 0:
+            cmap = cm.get_cmap("Blues")
+            idx = np.argsort(np.abs(np.nan_to_num(norm_data.weights)), axis=None)
+            self.fig.ax.scatter(
+                norm_data.unit_normalized.flat[idx],
+                1 - norm_data.cell_depth_normalized.flat[idx],
+                marker="o",
+                s=10,
+                c=norm_data.weights.flat[idx],
+                cmap=cmap,
+            )
+        else:
+            self.fig.ax.plot(
+                norm_data.unit_normalized,
+                1 - norm_data.cell_depth_normalized,
+                marker="o",
+                color="#cecece",
+                markerfacecolor="#cecece",
+                linestyle="None",
+                markersize=2,
+            )
+
+    def extrap_plot_surface(self, norm_data):
+        """Highlights the depth cell data representing the topmost depth cell.
+        These data will be either for a single transect or for the composite
+        for the whole measurement.
+
+        Parameters
+        ----------
+        norm_data: NormData
+            Object of class NormData
+        """
+
+        # Indentify indices for topmost depth cell
+        surface_idx = np.argmax(np.logical_not(np.isnan(norm_data.unit_normalized)), 0)
+        idx = (surface_idx, range(len(surface_idx)))
+
+        # Plot data
+        self.fig.ax.scatter(
+            norm_data.unit_normalized[idx],
+            1 - norm_data.cell_depth_normalized[idx],
+            marker="o",
+            s=10,
+            c="#00ffff",
+        )
+
+    def extrap_plot_med_compare(self, norm_data):
+        """Plots median values and associated error bars.
+
+        Parameters
+        ----------
+        norm_data: list or NormData
+            List of or single object of class NormData
+        """
+
+        # If composite measurement the color is black otherwise use start bank
+        line_color = "#ff8000"
+
+        # Valid median values
+        self.fig.ax.plot(
+            norm_data.unit_normalized_med[norm_data.valid_data],
+            norm_data.unit_normalized_z[norm_data.valid_data],
+            marker="s",
+            color=line_color,
+            markerfacecolor=line_color,
+            linestyle="None",
+        )
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the annotation. If the
+        location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            cont_fig = False
+            if self.fig is not None:
+                cont_fig, ind_fig = self.fig.contains(event)
+
+            if cont_fig and self.fig.get_visible():
+                self.update_annot(event.xdata, event.ydata)
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
+
+    def update_annot(self, x, y):
+        """Updates the location and text and makes visible the previously initialized
+        and hidden annotation.
+
+        Parameters
+        ----------
+        x: int
+            x coordinate for annotation
+        y: int
+            y coordinate for annotation
+        """
+
+        plt_ref = self.fig
+        pos = [x, y]
+        # Shift annotation box left or right depending on which half of the axis
+        # the pos x is located and the direction of x increasing.
+        if plt_ref.ax.viewLim.intervalx[0] < plt_ref.ax.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (plt_ref.ax.viewLim.intervalx[0] + plt_ref.ax.viewLim.intervalx[1])
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (plt_ref.ax.viewLim.intervalx[0] + plt_ref.ax.viewLim.intervalx[1])
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.ax.viewLim.intervaly[0] < plt_ref.ax.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (plt_ref.ax.viewLim.intervaly[0] + plt_ref.ax.viewLim.intervaly[1])
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (plt_ref.ax.viewLim.intervaly[0] + plt_ref.ax.viewLim.intervaly[1])
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+        self.annot.xy = pos
+
+        text = "x: {:.2f}, y: {:.2f}".format(x, y)
+
+        self.annot.set_text(text)
diff --git a/UI/GPSFilters.py b/UI/GPSFilters.py
new file mode 100644
index 0000000000000000000000000000000000000000..76a94a33a9612d93a3ed9a3ee43dfd742b15eef3
--- /dev/null
+++ b/UI/GPSFilters.py
@@ -0,0 +1,516 @@
+import numpy as np
+from matplotlib.dates import DateFormatter, num2date
+from datetime import datetime
+
+
+class GPSFilters(object):
+    """Class to generate time series plots of the selected filter data.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    qual: object
+        Axis of figure for number of beams
+    alt: object
+        Axis of figure for error velocity
+    hdop: object
+        Axis of figure for vertical velocity
+    other: object
+        Axis of figure for other filters
+    sats: object
+        Axis of figure for number of satellites
+    source: object
+        Axis of figure for navigation reference source
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    x_axis_type: str
+        Identifies x-axis type (L-lenght, E-ensemble, T-time)
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.qual = None
+        self.alt = None
+        self.hdop = None
+        self.other = None
+        self.sats = None
+        self.source = None
+        self.hover_connection = None
+        self.annot = None
+        self.x_axis_type = "E"
+
+    def create(self, transect, units, selected, x_axis_type=None):
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData containing boat speeds to be plotted
+        units: dict
+            Dictionary of units conversions
+        selected: str
+            String identifying the type of plot
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        """
+
+        # Set default axis
+        if x_axis_type is None:
+            x_axis_type = "E"
+        self.x_axis_type = x_axis_type
+
+        # Assign and save parameters
+        self.units = units
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.1, bottom=0.2, right=0.98, top=0.98, wspace=0.1, hspace=0
+        )
+        self.fig.ax.grid()
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+
+        # Compute x axis data
+        x = None
+        if x_axis_type == "L":
+            boat_track = transect.boat_vel.compute_boat_track(transect=transect)
+            if not np.alltrue(np.isnan(boat_track["track_x_m"])):
+                x = boat_track["distance_m"] * units["L"]
+        elif x_axis_type == "E":
+            x = np.arange(1, len(transect.depths.bt_depths.depth_processed_m) + 1)
+        elif x_axis_type == "T":
+            timestamp = (
+                np.nancumsum(transect.date_time.ens_duration_sec)
+                + transect.date_time.start_serial_time
+            )
+            x = []
+            for stamp in timestamp:
+                x.append(datetime.utcfromtimestamp(stamp))
+            x = np.array(x)
+
+        if (
+            selected == "quality"
+            and transect.boat_vel.gga_vel is not None
+            and np.any(np.logical_not(np.isnan(transect.gps.diff_qual_ens)))
+        ):
+            # GPS Quality
+            self.qual = self.fig.ax.plot(x, transect.gps.diff_qual_ens, "b.")
+
+            # Circle invalid data
+            invalid_gps = np.logical_not(transect.boat_vel.gga_vel.valid_data[2, :])
+            self.qual.append(
+                self.fig.ax.plot(
+                    x[invalid_gps],
+                    transect.gps.diff_qual_ens[invalid_gps],
+                    "ro",
+                    markerfacecolor="none",
+                )[0]
+            )
+
+            # Format axis
+            self.fig.ax.set_ylabel(self.canvas.tr("GPS Quality"))
+            yint = range(0, int(np.ceil(np.nanmax(transect.gps.diff_qual_ens)) + 1))
+            self.fig.ax.set_ylim(
+                top=np.nanmax(yint) + 0.5, bottom=np.nanmin(yint) - 0.5
+            )
+            self.fig.ax.set_yticks(yint)
+
+        elif (
+            selected == "altitude"
+            and transect.boat_vel.gga_vel is not None
+            and np.any(np.logical_not(np.isnan(transect.gps.altitude_ens_m)))
+        ):
+            # Plot altitude
+            invalid_altitude = np.logical_not(
+                transect.boat_vel.gga_vel.valid_data[3, :]
+            )
+            self.alt = self.fig.ax.plot(
+                x, transect.gps.altitude_ens_m * units["L"], "b."
+            )
+            self.alt.append(
+                self.fig.ax.plot(
+                    x[invalid_altitude],
+                    transect.gps.altitude_ens_m[invalid_altitude] * units["L"],
+                    "ro",
+                    markerfacecolor="none",
+                )[0]
+            )
+            self.fig.ax.set_ylabel(self.canvas.tr("Altitude" + self.units["label_L"]))
+
+        elif (
+            selected == "hdop"
+            and transect.boat_vel.gga_vel is not None
+            and np.any(np.logical_not(np.isnan(transect.gps.hdop_ens)))
+        ):
+            # Plot HDOP
+            max_y = np.nanmax(transect.gps.hdop_ens) + 0.5
+            min_y = np.nanmin(transect.gps.hdop_ens) - 0.5
+            invalid_hdop = np.logical_not(transect.boat_vel.gga_vel.valid_data[5, :])
+            self.hdop = self.fig.ax.plot(x, transect.gps.hdop_ens, "b.")
+            self.hdop.append(
+                self.fig.ax.plot(
+                    x[invalid_hdop],
+                    transect.gps.hdop_ens[invalid_hdop],
+                    "ro",
+                    markerfacecolor="none",
+                )[0]
+            )
+            self.fig.ax.set_ylim(top=max_y, bottom=min_y)
+            self.fig.ax.set_ylabel(self.canvas.tr("HDOP"))
+
+        elif (
+            selected == "sats"
+            and transect.boat_vel.gga_vel is not None
+            and np.any(np.logical_not(np.isnan(transect.gps.num_sats_ens)))
+        ):
+            # Plot number of satellites
+            max_y = np.nanmax(transect.gps.num_sats_ens) + 0.5
+            min_y = np.nanmin(transect.gps.num_sats_ens) - 0.5
+            self.sats = self.fig.ax.plot(x, transect.gps.num_sats_ens, "b.")
+            try:
+                self.fig.ax.set_ylim(top=max_y, bottom=min_y)
+                yint = range(int(min_y), int(max_y) + 1)
+                self.fig.ax.set_yticks(yint)
+            except ValueError:
+                pass
+            self.fig.ax.set_ylabel(self.canvas.tr("Number of Satellites"))
+
+        elif selected == "other":
+
+            # Select an object to use for the smooth
+            if transect.boat_vel.selected == "gga_vel":
+                boat_gps = transect.boat_vel.gga_vel
+                data_color = ["b-", "b."]
+            elif transect.boat_vel.selected == "vtg_vel":
+                boat_gps = transect.boat_vel.vtg_vel
+                data_color = ["g-", "g."]
+            elif transect.boat_vel.vtg_vel is not None:
+                boat_gps = transect.boat_vel.vtg_vel
+                data_color = ["g-", "g."]
+            else:
+                boat_gps = transect.boat_vel.gga_vel
+                data_color = ["b-", "b."]
+
+            if boat_gps is not None:
+                # Plot smooth
+                speed = np.sqrt(boat_gps.u_mps**2 + boat_gps.v_mps**2)
+
+                if boat_gps.smooth_filter == "On":
+                    invalid_other_vel = np.logical_not(boat_gps.valid_data[4, :])
+                    self.other = self.fig.ax.plot(
+                        x,
+                        boat_gps.smooth_lower_limit * self.units["V"],
+                        color="#d5dce6",
+                    )
+                    self.other.append(
+                        self.fig.ax.plot(
+                            x,
+                            boat_gps.smooth_upper_limit * self.units["V"],
+                            color="#d5dce6",
+                        )[0]
+                    )
+                    self.other.append(
+                        self.fig.ax.fill_between(
+                            x,
+                            boat_gps.smooth_lower_limit * self.units["V"],
+                            boat_gps.smooth_upper_limit * self.units["V"],
+                            facecolor="#d5dce6",
+                        )
+                    )
+
+                    self.other.append(
+                        self.fig.ax.plot(x, speed * units["V"], data_color[0])[0]
+                    )
+                    self.other.append(
+                        self.fig.ax.plot(x, boat_gps.smooth_speed * self.units["V"])[0]
+                    )
+                    self.other.append(
+                        self.fig.ax.plot(
+                            x[invalid_other_vel],
+                            speed[invalid_other_vel] * units["V"],
+                            "ko",
+                            linestyle="",
+                        )[0]
+                    )
+                else:
+                    self.other = self.fig.ax.plot(x, speed * units["V"], data_color[1])
+                self.fig.ax.set_ylabel(self.canvas.tr("Speed" + units["label_V"]))
+
+        elif selected == "source":
+            # Plot boat velocity source
+            if transect.boat_vel.selected == "gga_vel":
+                boat_selected = transect.boat_vel.gga_vel
+            elif transect.boat_vel.selected == "vtg_vel":
+                boat_selected = transect.boat_vel.vtg_vel
+            else:
+                boat_selected = transect.boat_vel.bt_vel
+
+            # Handle situation where transect does not contain the selected source
+            if boat_selected is None:
+                source = np.tile("INV", len(x))
+            else:
+                source = boat_selected.processed_source
+
+            # Plot dummy data to establish consistent order of y axis
+            self.source = self.fig.ax.plot(
+                [-10, -10, -10, -10, -10], ["INV", "INT", "BT", "GGA", "VTG"], "w-"
+            )
+            self.source = self.fig.ax.plot(x, source, "b.")
+            self.fig.ax.set_ylabel(self.canvas.tr("Boat Velocity Source"))
+            self.fig.ax.set_yticks(["INV", "INT", "BT", "GGA", "VTG"])
+
+        if x_axis_type == "L":
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(
+                    right=-1 * x[-1] * 0.02 * units["L"], left=x[-1] * 1.02 * units["L"]
+                )
+            else:
+                self.fig.ax.set_xlim(
+                    left=-1 * x[-1] * 0.02 * units["L"], right=x[-1] * 1.02 * units["L"]
+                )
+            self.fig.ax.set_xlabel(self.canvas.tr("Length" + units["label_L"]))
+        elif x_axis_type == "E":
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(right=0, left=x[-1] + 1)
+            else:
+                self.fig.ax.set_xlim(left=0, right=x[-1] + 1)
+            self.fig.ax.set_xlabel(self.canvas.tr("Ensembles"))
+        elif x_axis_type == "T":
+            axis_buffer = (timestamp[-1] - timestamp[0]) * 0.02
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(
+                    right=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                    left=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                )
+            else:
+                self.fig.ax.set_xlim(
+                    left=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                    right=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                )
+            date_form = DateFormatter("%H:%M:%S")
+            self.fig.ax.xaxis.set_major_formatter(date_form)
+            self.fig.ax.set_xlabel(self.canvas.tr("Time"))
+
+        # Initialize annotation for data cursor
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    def update_annot(self, ind, plt_ref):
+        """Updates the location and text and makes visible the previously initialized
+        and hidden annotation.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        """
+
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the axis
+        # the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+
+        self.annot.xy = pos
+
+        # Format and display text
+        if self.x_axis_type == "T":
+            x_label = num2date(pos[0]).strftime("%H:%M:%S.%f")[:-4]
+            if self.source is not None:
+                y_label = ["INV", "INT", "BT", "GGA", "VTG"]
+                text = "x: {}, y: {}".format(x_label, y_label[pos[1].astype("int")])
+            else:
+                text = "x: {}, y: {:.2f}".format(x_label, pos[1])
+        else:
+            if self.source is not None:
+                y_label = ["INV", "INT", "BT", "GGA", "VTG"]
+                text = "x: {:.2f}, y: {}".format(pos[0], y_label[pos[1].astype("int")])
+            else:
+                text = "x: {:.2f}, y: {:.2f}".format(pos[0], pos[1])
+
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the annotation. If the
+        location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            cont_qual = False
+            cont_hdop = False
+            cont_alt = False
+            cont_sats = False
+            cont_other = False
+            cont_source = False
+            ind_qual = None
+            ind_hdop = None
+            ind_alt = None
+            ind_sats = None
+            ind_other = None
+            ind_source = None
+            if self.qual is not None:
+                cont_qual, ind_qual = self.qual[0].contains(event)
+            elif self.hdop is not None:
+                cont_hdop, ind_hdop = self.hdop[0].contains(event)
+            elif self.alt is not None:
+                cont_alt, ind_alt = self.alt[0].contains(event)
+            elif self.sats is not None:
+                cont_sats, ind_sats = self.sats[0].contains(event)
+            elif self.other is not None:
+                cont_other, ind_other = self.other[0].contains(event)
+            elif self.source is not None:
+                cont_source, ind_source = self.source[0].contains(event)
+
+            if cont_qual:
+                self.update_annot(ind_qual, self.qual[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_hdop:
+                self.update_annot(ind_hdop, self.hdop[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_alt:
+                self.update_annot(ind_alt, self.alt[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_sats:
+                self.update_annot(ind_sats, self.sats[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_other:
+                self.update_annot(ind_other, self.other[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_source:
+                self.update_annot(ind_source, self.source[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted data
+                # hide the annotation.
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/HOffset.py b/UI/HOffset.py
new file mode 100644
index 0000000000000000000000000000000000000000..8bb7f2704c227648bc9b69b6560c957ca5fadeb5
--- /dev/null
+++ b/UI/HOffset.py
@@ -0,0 +1,16 @@
+from PyQt5 import QtWidgets
+from UI import wHOffset
+
+
+class HOffset(QtWidgets.QDialog, wHOffset.Ui_hoffset):
+    """Dialog to allow users to change heading offset.
+
+    Parameters
+    ----------
+    wHOffset.Ui_hoffset : QDialog
+        Dialog window to allow users to change heading offset
+    """
+
+    def __init__(self, parent=None):
+        super(HOffset, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/HSource.py b/UI/HSource.py
new file mode 100644
index 0000000000000000000000000000000000000000..a208ebd3da186957c4da67366ae5af2a8c7eb8e5
--- /dev/null
+++ b/UI/HSource.py
@@ -0,0 +1,16 @@
+from PyQt5 import QtWidgets
+from UI import wHSource
+
+
+class HSource(QtWidgets.QDialog, wHSource.Ui_h_source):
+    """Dialog to allow users to change heading source.
+
+    Parameters
+    ----------
+    wHSource.Ui_h_source : QDialog
+        Dialog window with options for users
+    """
+
+    def __init__(self, parent=None):
+        super(HSource, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/HeadingTS.py b/UI/HeadingTS.py
new file mode 100644
index 0000000000000000000000000000000000000000..7d1c041a902b90272177e765e9a15150608e8f87
--- /dev/null
+++ b/UI/HeadingTS.py
@@ -0,0 +1,456 @@
+import numpy as np
+from PyQt5 import QtCore
+
+
+class HeadingTS(object):
+    """Class to generate at time series of heading data.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    internal: list
+        Reference to internal compass time series plot
+    external: list
+        Reference to internal compass time series plot
+    merror: list
+        Reference to magnetic error time series plot
+    row_index: list
+        List of rows from the table that are plotted
+    hover_connection: bool
+        Switch to allow user to use the data cursor
+    annot: Annotation
+        Annotation object for heading
+    annot2: Annotation
+        Annotation object for percent change in magnetic field
+    x_axis_type: str
+        Identifies x-axis type (L-lenght, E-ensemble, T-time)
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.internal = None
+        self.external = None
+        self.merror = None
+        self.row_index = []
+        self.hover_connection = None
+        self.annot = None
+        self.annot2 = None
+        self.x_axis_type = "E"
+
+    def create(
+        self,
+        meas,
+        checked,
+        tbl,
+        cb_internal,
+        cb_external,
+        cb_merror,
+        units,
+        x_axis_type=None,
+    ):
+        """Creates heading time series graph.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of Measurement class
+        checked: list
+            List of bool indicating which transects are included in the
+            discharge computation
+        tbl: QTableWidget
+            Heading, pitch, and roll table
+        cb_internal: QCheckBox
+            Indicates if the internal heading data is visible
+        cb_external: QCheckBox
+            Inidcates if the external heading data is visible
+        cb_merror: QCheckBox
+            Indicates if the percent change in magnetic field is visible
+        units: dict
+            Dictionary of units conversions
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        """
+
+        # Set default axis
+        if x_axis_type is None:
+            x_axis_type = "E"
+        self.x_axis_type = x_axis_type
+
+        # Clear the plot
+        self.fig.clear()
+        self.row_index = []
+
+        # Configure axis
+        self.fig.axh = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.1, bottom=0.15, right=0.95, top=0.98, wspace=0.1, hspace=0
+        )
+        self.fig.axh.set_ylabel(self.canvas.tr("Heading (deg)"))
+        self.fig.axh.xaxis.label.set_fontsize(10)
+        self.fig.axh.yaxis.label.set_fontsize(10)
+        self.fig.axh.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+        self.fig.axh.set_yticks([0, 90, 180, 270, 360])
+
+        if cb_merror.isChecked():
+            # Plot magnetic field change
+            self.fig.axm = self.fig.axh.twinx()
+            self.fig.axm.set_ylabel(self.canvas.tr("Magnetic Change (%)"))
+            self.fig.axm.yaxis.label.set_fontsize(10)
+            self.fig.axm.tick_params(
+                axis="both",
+                direction="in",
+                bottom=True,
+                top=True,
+                left=True,
+                right=True,
+            )
+
+        self.internal = []
+        self.external = []
+        self.merror = []
+        x = np.nan
+        for row in range(len(checked)):
+            if tbl.item(row, 0).checkState() == QtCore.Qt.Checked:
+                self.row_index.append(row)
+                if cb_internal.isChecked():
+                    # Get ADCP heading
+                    if (
+                        meas.transects[checked[row]].sensors.heading_deg.selected
+                        == "user"
+                    ):
+                        heading = np.copy(
+                            meas.transects[checked[row]].sensors.heading_deg.user.data
+                        )
+                    else:
+                        heading = np.copy(
+                            meas.transects[
+                                checked[row]
+                            ].sensors.heading_deg.internal.data
+                        )
+                    # Arrange data left to right
+                    flip = False
+                    if meas.transects[checked[row]].start_edge == "Right":
+                        heading = np.flip(heading)
+                        flip = True
+                    # Compute x-axis
+                    x = self.set_x_axis(
+                        x_axis_type=x_axis_type,
+                        transect=meas.transects[checked[row]],
+                        units=units,
+                        flip=flip,
+                    )
+                    self.internal.append(self.fig.axh.plot(x, heading, "r-")[0])
+                else:
+                    self.internal = None
+
+                if cb_external.isChecked():
+                    # Get External Heading
+                    heading = np.copy(
+                        meas.transects[checked[row]].sensors.heading_deg.external.data
+                    )
+
+                    # Arrange data left to right
+                    flip = False
+                    if meas.transects[checked[row]].start_edge == "Right":
+                        heading = np.flip(heading)
+                        flip = True
+                    # Compute x-axis
+                    x = self.set_x_axis(
+                        x_axis_type=x_axis_type,
+                        transect=meas.transects[checked[row]],
+                        units=units,
+                        flip=flip,
+                    )
+                    self.external.append(self.fig.axh.plot(x, heading, "b-")[0])
+                else:
+                    self.external = None
+
+                if cb_merror.isChecked():
+                    # Get magnetic field change
+                    mag_chng = np.copy(
+                        meas.transects[
+                            checked[row]
+                        ].sensors.heading_deg.internal.mag_error
+                    )
+
+                    # Arrange data left to right
+                    flip = False
+                    if meas.transects[checked[row]].start_edge == "Right":
+                        mag_chng = np.flip(mag_chng)
+                        flip = True
+                    # Compute x-axis
+                    x = self.set_x_axis(
+                        x_axis_type=x_axis_type,
+                        transect=meas.transects[checked[row]],
+                        units=units,
+                        flip=flip,
+                    )
+                    self.merror.append(self.fig.axm.plot(x, mag_chng, "k-")[0])
+                    self.merror.append(
+                        self.fig.axm.plot([x[0], x[-1]], [2, 2], "k--")[0]
+                    )
+                else:
+                    self.merror = None
+
+        # Label axis
+        if x_axis_type == "L":
+            self.fig.axh.set_xlim(
+                left=-1 * np.nanmax(x) * 0.02,
+                right=np.nanmax(x) * 1.02,
+            )
+            self.fig.axh.set_xlabel(
+                self.canvas.tr("Length Left to Right" + units["label_L"])
+            )
+        elif x_axis_type == "E":
+            self.fig.axh.set_xlim(
+                left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+            )
+            self.fig.axh.set_xlabel(self.canvas.tr("Ensembles Left to Right"))
+        elif x_axis_type == "T":
+            self.fig.axh.set_xlim(
+                left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+            )
+            self.fig.axh.set_xlabel(
+                self.canvas.tr("Duration Left to Right " "(seconds)")
+            )
+
+        # Configure annotations for magnetic error
+        if cb_merror.isChecked():
+            self.annot2 = self.fig.axm.annotate(
+                "",
+                xy=(0, 0),
+                xytext=(-20, 20),
+                textcoords="offset points",
+                bbox=dict(boxstyle="round", fc="w"),
+                arrowprops=dict(arrowstyle="->"),
+            )
+
+            self.annot2.set_visible(False)
+
+        # Initialize annotation for data cursor
+        self.annot = self.fig.axh.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+        self.fig.axh.set_yticks([0, 90, 180, 270, 360])
+        self.canvas.draw()
+
+    @staticmethod
+    def set_x_axis(x_axis_type, transect, units, flip=False):
+        """Computes values for the x-axis based on specified x-axis type.
+
+        Parameters
+        ----------
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        transect: TransectData
+            Object of TransectData
+        units: dict
+            Dictionary of units conversions
+        flip: bool
+            Need to flip data so it is left to right
+        """
+
+        # Compute x axis data
+        x = None
+        if x_axis_type == "L":
+            boat_track = transect.boat_vel.compute_boat_track(transect=transect)
+            if not np.alltrue(np.isnan(boat_track["track_x_m"])):
+                x = boat_track["distance_m"] * units["L"]
+        elif x_axis_type == "E":
+            x = np.arange(1, len(transect.depths.bt_depths.depth_processed_m) + 1)
+        elif x_axis_type == "T":
+            x = np.nancumsum(transect.date_time.ens_duration_sec)
+
+        if flip:
+            x = x[-1] - x
+
+        return x
+
+    def update_annot(self, annot, ind, plt_ref, row):
+        """Updates the location and text and makes visible the previously
+        initialized and hidden annotation.
+
+        Parameters
+        ----------
+        annot: Annotation
+            Annotation for data cursor
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        row: int
+            Index of row in table from to which the plotted data are associated
+        """
+
+        # Get selected data coordinates
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                annot._x = -20
+            else:
+                annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                annot._x = -80
+            else:
+                annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                annot._y = -40
+            else:
+                annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                annot._y = 20
+            else:
+                annot._y = -40
+
+        annot.xy = pos
+
+        # Format and display text
+        text = "row: {:.0f}, x: {:.2f}, y: {:.2f}".format(row, pos[0], pos[1])
+
+        annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the
+        annotation. If the location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        cont = False
+        ind = None
+        item = None
+        n = None
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.axh or event.inaxes == self.fig.axm:
+            if self.internal is not None:
+                for n, item in enumerate(self.internal):
+                    cont, ind = item.contains(event)
+                    if cont:
+                        break
+            if not cont and self.external is not None:
+                for n, item in enumerate(self.external):
+                    cont, ind = item.contains(event)
+                    if cont:
+                        break
+            if cont:
+                self.update_annot(
+                    annot=self.annot, ind=ind, plt_ref=item, row=self.row_index[n] + 1
+                )
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+                if self.merror is not None:
+                    self.annot2.set_visible(False)
+
+            else:
+                self.annot.set_visible(False)
+                if self.merror is not None:
+                    for n, item in enumerate(self.merror):
+                        cont, ind = item.contains(event)
+                        if cont:
+                            break
+                if cont:
+                    self.update_annot(
+                        annot=self.annot2,
+                        ind=ind,
+                        plt_ref=item,
+                        row=self.row_index[n] + 1,
+                    )
+                    self.annot2.set_visible(True)
+                    self.canvas.draw_idle()
+                else:
+                    self.annot2.set_visible(False)
+        else:
+            # If the cursor location is not associated with the plotted data
+            # hide the annotation.
+            if vis:
+                self.annot.set_visible(False)
+                if self.merror is not None:
+                    self.annot2.set_visible(False)
+                self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/Help/QRev_About.docx b/UI/Help/QRev_About.docx
new file mode 100644
index 0000000000000000000000000000000000000000..d873117d7a8a65664208c45b23a2833eb92790dd
Binary files /dev/null and b/UI/Help/QRev_About.docx differ
diff --git a/UI/Help/QRev_About.pdf b/UI/Help/QRev_About.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..20b23a182beca8baa7437ccc16cb944f070cdcb0
Binary files /dev/null and b/UI/Help/QRev_About.pdf differ
diff --git a/UI/Help/QRev_Change_Log.docx b/UI/Help/QRev_Change_Log.docx
new file mode 100644
index 0000000000000000000000000000000000000000..ff6d3ede6e19b1b816979c486eaa3e260fce2d55
Binary files /dev/null and b/UI/Help/QRev_Change_Log.docx differ
diff --git a/UI/Help/QRev_Change_Log.pdf b/UI/Help/QRev_Change_Log.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..3893f2e8bf8673d7c9b4a47c3b136f602c4bfcea
Binary files /dev/null and b/UI/Help/QRev_Change_Log.pdf differ
diff --git a/UI/Help/QRev_Tech.docx b/UI/Help/QRev_Tech.docx
new file mode 100644
index 0000000000000000000000000000000000000000..063fccaaf114e96a0dac230e7389b19426c04f6b
Binary files /dev/null and b/UI/Help/QRev_Tech.docx differ
diff --git a/UI/Help/QRev_Tech.pdf b/UI/Help/QRev_Tech.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..c5325c76516c97030c08af3c04277430a68a79c4
Binary files /dev/null and b/UI/Help/QRev_Tech.pdf differ
diff --git a/UI/Help/QRev_Users.docx b/UI/Help/QRev_Users.docx
new file mode 100644
index 0000000000000000000000000000000000000000..d72a8c1f5a8a5f8dbdb457c05ecfc2cfedcf6f9e
Binary files /dev/null and b/UI/Help/QRev_Users.docx differ
diff --git a/UI/Help/QRev_Users.pdf b/UI/Help/QRev_Users.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f8b8878a626dcf2ba558b5ae64f3948f26265aef
Binary files /dev/null and b/UI/Help/QRev_Users.pdf differ
diff --git a/UI/MagVar.py b/UI/MagVar.py
new file mode 100644
index 0000000000000000000000000000000000000000..b7912e1b73acb3133244ca14087901a9b0a70b03
--- /dev/null
+++ b/UI/MagVar.py
@@ -0,0 +1,16 @@
+from PyQt5 import QtWidgets
+from UI import wMagVar
+
+
+class MagVar(QtWidgets.QDialog, wMagVar.Ui_mag_var):
+    """Dialog to allow users to change magvar.
+
+    Parameters
+    ----------
+    wMagVar.Ui_mag_var : QDialog
+        Dialog window to allow users to change magvar
+    """
+
+    def __init__(self, parent=None):
+        super(MagVar, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/MapTrack.py b/UI/MapTrack.py
new file mode 100644
index 0000000000000000000000000000000000000000..e3c9d3881c6ad7d8f887c4b6097b15d83270c853
--- /dev/null
+++ b/UI/MapTrack.py
@@ -0,0 +1,277 @@
+import numpy as np
+import copy
+
+class Maptrack(object):
+    """Class to generate shiptrack plot from MAP profile.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.acs = None
+        self.hover_connection = None
+        self.annot = None
+        self.vectors = None
+
+    def create(self, map_data, units, nav_ref):
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        map_data: MAP
+            Object of MAP from Measurement
+        units: dict
+            Dictionary of units conversions.
+        nav_ref: str
+            Navigation reference (bt_vel, gga_vel, vtg_vel)
+        """
+
+        # Assign and save parameters
+        self.units = units
+        self.acs = None
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.15, bottom=0.1, right=0.98, top=0.95, wspace=0.1, hspace=0
+        )
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+
+        direction_section = np.arctan2(map_data.slope, 1)
+
+        if map_data.streamwise_velocity is not None:
+            u = map_data.streamwise_velocity * np.sin(direction_section) + \
+                map_data.transverse_velocity * np.cos(direction_section)
+            v = map_data.transverse_velocity * np.sin(direction_section) - \
+                map_data.streamwise_velocity * np.cos(direction_section)
+
+            u = u * -1 * map_data._unit
+            v = v * -1 * map_data._unit
+
+            u_mean = np.nanmean(u, axis=0)
+            v_mean = np.nanmean(v, axis=0)
+
+            x_plt = (map_data.x[1:] + map_data.x[:-1]) / 2
+            y_plt = (map_data.y[1:] + map_data.y[:-1]) / 2
+
+            speed = np.sqrt(u_mean ** 2 + v_mean ** 2) * units["V"]
+            if len(speed) > 0:
+                max_speed = np.nanmax(speed)
+            else:
+                max_speed = 0
+
+            self.vectors = self.fig.ax.quiver(
+                x_plt,
+                y_plt,
+                u_mean * units["V"],
+                v_mean * units["V"],
+                units="dots",
+                width=1,
+                scale_units="width",
+                scale=4 * max_speed,
+            )
+
+            self.acs = self.fig.ax.plot(
+                map_data.x,
+                map_data.y,
+                color="firebrick",
+                linewidth=2,
+                label="MAP Average course",
+                zorder=1,
+            )
+        for i in range(len(map_data.x_raw_coordinates)):
+            self.fig.ax.plot(
+                map_data.x_raw_coordinates[i],
+                map_data.y_raw_coordinates[i],
+                color="grey",
+                linewidth=1,
+                zorder=0,
+            )
+
+        # Customize axes
+        if nav_ref == "gga_vel":
+            self.fig.ax.set_xlabel(
+                self.canvas.tr("UTM East coordinates ") + units["label_L"]
+            )
+            self.fig.ax.set_ylabel(
+                self.canvas.tr("UTM North coordinates ") + units["label_L"]
+            )
+        else:
+            self.fig.ax.set_xlabel(self.canvas.tr("Distance East ") + units["label_L"])
+            self.fig.ax.set_ylabel(self.canvas.tr("Distance North ") + units["label_L"])
+
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+        self.fig.ax.grid()
+        self.fig.ax.axis("equal")
+        for label in self.fig.ax.get_xticklabels() + self.fig.ax.get_yticklabels():
+            label.set_fontsize(10)
+
+        # Initialize annotation for data cursor
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    def hover(self, event):
+        """Determines if the user has selected a location with temperature data and makes
+        annotation visible and calls method to update the text of the annotation. If the
+        location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and update the annotation.
+        if event.inaxes == self.fig.ax and event.button != 3:
+            cont = False
+            ind = None
+            plotted_line = None
+
+            # Find the transect(line) that contains the mouse click
+            for plotted_line in self.fig.ax.lines:
+                cont, ind = plotted_line.contains(event)
+                if cont:
+                    break
+            if cont:
+                self.update_annot(ind, plotted_line)
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted data hide the annotation.
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def update_annot(self, ind, plt_ref):
+        """Updates the location and text and makes visible the previously initialized and hidden annotation.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        """
+
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the axis the pos x is located and the
+        # direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis the pos y is located and the
+        # direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+        self.annot.xy = pos
+
+        text = "x: {:.2f}, y: {:.2f}".format(pos[0], pos[1])
+        self.annot.set_text(text)
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/Mockup.pdf b/UI/Mockup.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..094985cfdeb64a55160983f41fe4b22c8dbf16f1
Binary files /dev/null and b/UI/Mockup.pdf differ
diff --git a/UI/Mockup.pptx b/UI/Mockup.pptx
new file mode 100644
index 0000000000000000000000000000000000000000..e397deec1c36c4d18a847b9f15537f009efe552e
Binary files /dev/null and b/UI/Mockup.pptx differ
diff --git a/UI/Mockup.xlsx b/UI/Mockup.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..5f7913b2a553ab129ad6202506771adc25e37537
Binary files /dev/null and b/UI/Mockup.xlsx differ
diff --git a/qrevint_22_06_22/UI/MplCanvas.py b/UI/MplCanvas.py
similarity index 85%
rename from qrevint_22_06_22/UI/MplCanvas.py
rename to UI/MplCanvas.py
index bcd322fce9ce7b8a508bb37e179e45bde94c947b..26dda0477b0fa3b70197f018b4839bd5eff9cb46 100644
--- a/qrevint_22_06_22/UI/MplCanvas.py
+++ b/UI/MplCanvas.py
@@ -34,7 +34,7 @@ class MplCanvas(FigureCanvas):
         FigureCanvas.__init__(self, self.fig)
         self.setParent(parent)
 
-        FigureCanvas.setSizePolicy(self,
-                                   QtWidgets.QSizePolicy.Expanding,
-                                   QtWidgets.QSizePolicy.Expanding)
+        FigureCanvas.setSizePolicy(
+            self, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
+        )
         FigureCanvas.updateGeometry(self)
diff --git a/UI/OpenMeasurementDialog.py b/UI/OpenMeasurementDialog.py
new file mode 100644
index 0000000000000000000000000000000000000000..1f655a989bc805d7ed02944306d00b38c0d06014
--- /dev/null
+++ b/UI/OpenMeasurementDialog.py
@@ -0,0 +1,189 @@
+import os
+import scipy.io as sio
+from PyQt5 import QtWidgets
+from Classes.stickysettings import StickySettings as SSet
+
+
+class OpenMeasurementDialog(QtWidgets.QDialog):
+    """Dialog to allow users to select measurement files for processing.
+
+    Attributes
+    ----------
+    settings: dict
+        Dictionary used to store user defined settings.
+    fullName: list
+        Full name of files including path.
+    fileName: list
+        List of one or more fileNames to be processed.
+    pathName: str
+        Path to folder containing files.
+    type: str
+        Type of file (SonTek, TRDI, QRev).
+    checked: bool
+        Switch for TRDI files (True: load only checked, False: load all).
+    """
+
+    def __init__(self, parent=None):
+
+        super(OpenMeasurementDialog, self).__init__(parent)
+
+        # Create settings object which contains the default folder
+        self.settings = SSet(parent.settingsFile)
+
+        # Initialize parameters
+        self.fullName = []
+        self.fileName = []
+        self.pathName = []
+        self.type = ""
+        self.checked = False
+        self.get_files()
+
+    def get_files(self):
+        """Get filenames and pathname for file(s) to be processed
+
+        Allows the user to select one *.mmt or one *_QRev.mat or one or more
+        SonTek *.mat files for processing. The selected folder becomes the
+        default folder for subsequent selectFile requests.
+        """
+
+        # Get the current folder setting.
+        folder = self.default_folder()
+
+        # Get the full names (path + file) of the selected files
+        self.fullName = QtWidgets.QFileDialog.getOpenFileNames(
+            self,
+            self.tr("Open File"),
+            folder,
+            self.tr(
+                "All (*.mat *.mmt);;SonTek Matlab File (*.mat);;"
+                "TRDI mmt File (*.mmt);;"
+                "QRev File (*_QRev.mat)"
+            ),
+        )[0]
+
+        # Initialize parameters
+        self.type = ""
+        self.checked = False
+
+        # Process fullName if selection was made
+        if self.fullName:
+            self.process_names()
+        self.close()
+
+    def process_names(self):
+        """Parses fullnames into filenames and pathnames, sets default folder,
+        determines the type of files selected, checks that the files selected
+        are consistent with the type of files.
+        """
+        # Parse filenames and pathname from fullName
+        if isinstance(self.fullName, str):
+            self.pathName, self.fileName = os.path.split(self.fullName)
+        else:
+            self.fileName = []
+            for file in self.fullName:
+                self.pathName, fileTemp = os.path.split(file)
+                self.fileName.append(fileTemp)
+
+        # Update the folder setting
+        self.settings.set("Folder", self.pathName)
+
+        # Determine file type
+        if len(self.fileName) == 1:
+            file_name, file_extension = os.path.splitext(self.fileName[0])
+
+            # TRDI file
+            if file_extension == ".mmt":
+                self.type = "TRDI"
+                checked_transect_dialog = QtWidgets.QMessageBox()
+                checked_transect_dialog.setIcon(QtWidgets.QMessageBox.Question)
+                checked_transect_dialog.setWindowTitle("Checked Transects?")
+                checked_transect_dialog.setText(
+                    "Do you want to load ONLY checked transects?"
+                )
+                checked_transect_dialog.setStandardButtons(
+                    QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No
+                )
+                checked_transect_dialog.setDefaultButton(QtWidgets.QMessageBox.No)
+                checked_transect_dialog = checked_transect_dialog.exec()
+
+                if checked_transect_dialog == QtWidgets.QMessageBox.Yes:
+                    self.checked = True
+
+            # SonTek, Nortek, or QRev file
+            else:
+
+                if os.path.getsize(self.fullName[0]) > 0:
+                    mat_data = sio.loadmat(
+                        self.fullName[0], struct_as_record=False, squeeze_me=True
+                    )
+
+                    if "version" in mat_data:
+                        self.type = "QRev"
+                    elif hasattr(mat_data["System"], "InstrumentModel"):
+                        self.type = "Nortek"
+                    else:
+                        self.type = "SonTek"
+                        if "BottomTrack" not in mat_data:
+                            self.popup_message("Selected file is incomplete.")
+                else:
+                    self.popup_message("Selected file is empty.")
+
+        else:
+            # If multiple files are selected they must all be SonTek or
+            # Nortek files
+            for name in self.fileName:
+                file_name, file_extension = os.path.splitext(name)
+                if file_extension == ".mmt":
+                    self.popup_message(
+                        "Selected files contain an mmt file. "
+                        "An mmt file must be loaded separately"
+                    )
+                    break
+                elif file_extension == ".mat" or file_extension == ".MAT":
+                    mat_data = sio.loadmat(
+                        self.fullName[0], struct_as_record=False, squeeze_me=True
+                    )
+                    if "version" in mat_data:
+                        self.popup_message(
+                            "Selected files contain a QRev "
+                            "file. A QRev file must be opened "
+                            "separately"
+                        )
+                        break
+                    elif hasattr(mat_data["System"], "InstrumentModel"):
+                        self.type = "Nortek"
+                        break
+                    else:
+                        self.type = "SonTek"
+                        break
+
+    def default_folder(self):
+        """Returns default folder.
+
+        Returns the folder stored in settings or if no folder is stored,
+        then the current working folder is returned.
+        """
+        try:
+            folder = self.settings.get("Folder")
+            if not folder:
+                folder = os.getcwd()
+        except KeyError:
+            self.settings.new("Folder", os.getcwd())
+            folder = self.settings.get("Folder")
+        return folder
+
+    @staticmethod
+    def popup_message(text):
+        """Display a message box with messages specified in text.
+
+        Parameters
+        ----------
+        text: str
+            Message to be displayed.
+        """
+        msg = QtWidgets.QMessageBox()
+        msg.setIcon(QtWidgets.QMessageBox.Critical)
+        msg.setText("Error")
+        msg.setInformativeText(text)
+        msg.setWindowTitle("Error")
+        msg.exec_()
diff --git a/UI/Options.py b/UI/Options.py
new file mode 100644
index 0000000000000000000000000000000000000000..b231405e0c4759267215ca96fe6e34ce193d7f8f
--- /dev/null
+++ b/UI/Options.py
@@ -0,0 +1,28 @@
+from PyQt5 import QtWidgets, QtGui
+from UI import wOptions
+
+
+class Options(QtWidgets.QDialog, wOptions.Ui_Options):
+    """Dialog to allow users to change QRev options.
+
+    Parameters
+    ----------
+    wOptions.Ui_Options : QDialog
+        Dialog window with options for users
+    """
+
+    def __init__(self, parent=None):
+        """Initialize options dialog."""
+        super(Options, self).__init__(parent)
+        self.setupUi(self)
+
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+
+        self.rb_All.setFont(font)
+        self.rb_checked.setFont(font)
+        self.rb_english.setFont(font)
+        self.rb_si.setFont(font)
+        self.cb_stylesheet.setFont(font)
diff --git a/UI/PRTS.py b/UI/PRTS.py
new file mode 100644
index 0000000000000000000000000000000000000000..13287f7b58a7f3fcf762b531ebd55bb58b18ca78
--- /dev/null
+++ b/UI/PRTS.py
@@ -0,0 +1,389 @@
+import numpy as np
+from PyQt5 import QtCore
+
+
+class PRTS(object):
+    """Class to generate at time series of heading data.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    pitch: list
+        Reference to pitch time series plot
+    roll: list
+        Reference to roll time series plot
+    row_index: list
+        List of rows from the table that are plotted
+    hover_connection: bool
+        Switch to allow user to use the data cursor
+    annot: Annotation
+        Annotation for data cursor
+    x_axis_type: str
+        Identifies x-axis type (L-lenght, E-ensemble, T-time)
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.pitch = None
+        self.roll = None
+        self.row_index = []
+        self.hover_connection = None
+        self.annot = None
+        self.x_axis_type = "E"
+
+    def create(self, meas, checked, tbl, cb_pitch, cb_roll, units, x_axis_type=None):
+        """Generates the pitch and roll plot.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        checked: list
+            List of transect indices to be included in discharge computation
+        tbl: QTableWidget
+            Table containing heading, pitch, and roll information
+        cb_pitch: QCheckBox
+            Checkbox indicating if the pitch is displayed
+        cb_roll: QCheckBox
+            Checkbox indication if the roll is displayed
+        units: dict
+            Dictionary of units conversions
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        """
+
+        # Set default axis
+        if x_axis_type is None:
+            x_axis_type = "E"
+        self.x_axis_type = x_axis_type
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.1, bottom=0.15, right=0.95, top=0.98, wspace=0.1, hspace=0
+        )
+        self.fig.ax.set_ylabel(self.canvas.tr("Pitch or Roll (deg)"))
+        self.fig.ax.xaxis.label.set_fontsize(10)
+        self.fig.ax.yaxis.label.set_fontsize(10)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+        self.pitch = []
+        self.roll = []
+        self.row_index = []
+        x = np.nan
+
+        # Plot all selected transects
+        for row in range(len(checked)):
+            if tbl.item(row, 0).checkState() == QtCore.Qt.Checked:
+                self.row_index.append(row)
+                if cb_pitch.isChecked():
+                    # Get pitch data
+                    pitch = np.copy(
+                        meas.transects[checked[row]].sensors.pitch_deg.internal.data
+                    )
+
+                    # Arrange data from left to right
+                    flip = False
+                    if meas.transects[checked[row]].start_edge == "Right":
+                        pitch = np.flip(pitch)
+                        flip = True
+                    # Compute x-axis
+                    x = self.set_x_axis(
+                        x_axis_type=x_axis_type,
+                        transect=meas.transects[checked[row]],
+                        units=units,
+                        flip=flip,
+                    )
+                    self.pitch.append(self.fig.ax.plot(x, pitch, "r-")[0])
+                else:
+                    self.pitch = None
+
+                if cb_roll.isChecked():
+                    # Get roll data
+                    roll = np.copy(
+                        meas.transects[checked[row]].sensors.roll_deg.internal.data
+                    )
+
+                    # Arrange data from left to right
+                    flip = False
+                    if meas.transects[checked[row]].start_edge == "Right":
+                        roll = np.flip(roll)
+                    # Compute x-axis
+                    x = self.set_x_axis(
+                        x_axis_type=x_axis_type,
+                        transect=meas.transects[checked[row]],
+                        units=units,
+                        flip=flip,
+                    )
+                    self.roll.append(self.fig.ax.plot(x, roll, "b-")[0])
+                else:
+                    self.roll = None
+        if cb_pitch.isChecked() or cb_roll.isChecked():
+            # Label axis
+            if x_axis_type == "L":
+                self.fig.ax.set_xlim(
+                    left=-1 * np.nanmax(x) * 0.02,
+                    right=np.nanmax(x) * 1.02,
+                )
+                self.fig.ax.set_xlabel(
+                    self.canvas.tr("Length Left to Right" + units["label_L"])
+                )
+            elif x_axis_type == "E":
+                self.fig.ax.set_xlim(
+                    left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+                )
+                self.fig.ax.set_xlabel(self.canvas.tr("Ensembles Left to Right"))
+            elif x_axis_type == "T":
+                self.fig.ax.set_xlim(
+                    left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+                )
+                self.fig.ax.set_xlabel(
+                    self.canvas.tr("Duration Left to Right (seconds)")
+                )
+
+                # Label axis
+                if x_axis_type == "L":
+                    self.fig.ax.set_xlim(
+                        left=-1 * np.nanmax(x) * 0.02,
+                        right=np.nanmax(x) * 1.02,
+                    )
+                    self.fig.ax.set_xlabel(
+                        self.canvas.tr("Length Left to Right" + units["label_L"])
+                    )
+                elif x_axis_type == "E":
+                    self.fig.ax.set_xlim(
+                        left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+                    )
+                    self.fig.ax.set_xlabel(self.canvas.tr("Ensembles Left to Right"))
+                elif x_axis_type == "T":
+                    self.fig.ax.set_xlim(
+                        left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+                    )
+                    self.fig.ax.set_xlabel(
+                        self.canvas.tr("Duration Left to Right (seconds)")
+                    )
+
+        # Label axis
+        if x_axis_type == "L":
+            self.fig.ax.set_xlim(
+                left=-1 * np.nanmax(x) * 0.02,
+                right=np.nanmax(x) * 1.02,
+            )
+            self.fig.ax.set_xlabel(
+                self.canvas.tr("Length Left to Right" + units["label_L"])
+            )
+        elif x_axis_type == "E":
+            self.fig.ax.set_xlim(
+                left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+            )
+            self.fig.ax.set_xlabel(self.canvas.tr("Ensembles Left to Right"))
+        elif x_axis_type == "T":
+            self.fig.ax.set_xlim(
+                left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+            )
+            self.fig.ax.set_xlabel(self.canvas.tr("Duration Left to Right (seconds)"))
+
+        # Initialize annotation for data cursor
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    @staticmethod
+    def set_x_axis(x_axis_type, transect, units, flip=False):
+        """Computes values for the x-axis based on specified x-axis type.
+
+        Parameters
+        ----------
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        transect: TransectData
+            Object of TransectData
+        units: dict
+            Dictionary of units conversions
+        flip: bool
+            Need to flip data so it is left to right
+        """
+
+        # Compute x axis data
+        x = None
+        if x_axis_type == "L":
+            boat_track = transect.boat_vel.compute_boat_track(transect=transect)
+            if not np.alltrue(np.isnan(boat_track["track_x_m"])):
+                x = boat_track["distance_m"] * units["L"]
+        elif x_axis_type == "E":
+            x = np.arange(1, len(transect.depths.bt_depths.depth_processed_m) + 1)
+        elif x_axis_type == "T":
+            x = np.nancumsum(transect.date_time.ens_duration_sec)
+
+        if flip:
+            x = x[-1] - x
+
+        return x
+
+    def update_annot(self, ind, plt_ref, row):
+        """Updates the location and text and makes visible the previously
+        initialized and hidden annotation.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        row: int
+            Index to row from which the data selected by the data cursor is
+            associated
+        """
+
+        # Get selected data coordinates
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the
+        # direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+
+        self.annot.xy = pos
+
+        # Format and display text
+        text = "row: {:.0f}, x: {:.2f}, y: {:.2f}".format(row, pos[0], pos[1])
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the
+        annotation.If the location is not valid the existing annotation is
+        hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            cont = False
+            ind = None
+            item = None
+            n = None
+            if self.pitch is not None:
+                for n, item in enumerate(self.pitch):
+                    cont, ind = item.contains(event)
+                    if cont:
+                        break
+            if not cont and self.roll is not None:
+                for n, item in enumerate(self.roll):
+                    cont, ind = item.contains(event)
+                    if cont:
+                        break
+            if cont:
+                self.update_annot(ind, plt_ref=item, row=self.row_index[n] + 1)
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted
+                # data hide the annotation.
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/QRev.cfg b/UI/QRev.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..451328719856ad836fb75f3588964db53d993377
--- /dev/null
+++ b/UI/QRev.cfg
@@ -0,0 +1,58 @@
+{	"Units": {
+		"show": true,
+		"default": "SI"
+		},
+	"ColorMap": {
+		"show": true,
+		"default": "viridis"
+		},
+	"RatingPrompt": {
+		"show": true,
+		"default": false
+		},
+	"SaveStyleSheet": {
+		"show": true,
+		"default": false
+		},
+	"ExtrapWeighting": {
+		"show": true,
+		"default": true
+		},
+	"FilterUsingMeasurement": {
+		"show": true,
+		"default": false
+		},
+	"Uncertainty": {
+		"show": true,
+		"default": "Oursin"
+		},
+	"MovingBedObservation": {
+		"show": true,
+		"default": false
+		},
+    "ExportCrossSection": {
+		"show": false,
+		"default": false
+		},
+    "MAP": {
+		"show": true
+		},
+    "AutonomousGPS": {
+        "allow": true
+        },
+	"QDigits": {
+	    "method": "sigfig",
+	    "digits": 3
+	    },
+	"SNR": {
+	    "Use3Beam": true
+	    },
+	"ExtrapolatedSpeed": {
+	    "ShowIcon": true
+	    },
+	"QA": {
+		"MinTransects": 2,
+		"MinDuration": 720
+		}
+}
+	
\ No newline at end of file
diff --git a/UI/QRev.ico b/UI/QRev.ico
new file mode 100644
index 0000000000000000000000000000000000000000..c957add570b04667f423f573b4f57472bca124ed
Binary files /dev/null and b/UI/QRev.ico differ
diff --git a/UI/QRev.py b/UI/QRev.py
new file mode 100644
index 0000000000000000000000000000000000000000..198fa2863fba577ed17ad844c25f7d2ea445e095
--- /dev/null
+++ b/UI/QRev.py
@@ -0,0 +1,16638 @@
+import shutil
+import copy
+import os
+import sys
+import webbrowser
+import utm
+import multiprocessing as mp
+import getpass
+import json
+import simplekml
+from contextlib import contextmanager
+from datetime import datetime
+import numpy as np
+import pandas as pd
+import scipy.io as sio
+import UI.QRev_gui as QRev_gui
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtCore import QRegExp, pyqtSignal
+from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
+from matplotlib.ticker import AutoLocator
+from Classes.createconfig import Config
+from Classes.stickysettings import StickySettings as SSet
+from Classes.Measurement import Measurement
+from Classes.TransectData import TransectData
+from Classes.Python2Matlab import Python2Matlab
+from Classes.Sensors import Sensors
+from Classes.MovingBedTests import MovingBedTests
+from Classes.CoordError import CoordError
+from Classes.Oursin import Oursin
+from MiscLibs.common_functions import (
+    convert_temperature,
+    units_conversion,
+    sfrnd,
+)
+from UI.selectFile import SaveDialog
+from UI.OpenMeasurementDialog import OpenMeasurementDialog
+from UI.Comment import Comment
+from UI.Transects2Use import Transects2Use
+from UI.Options import Options
+from UI.MagVar import MagVar
+from UI.HOffset import HOffset
+from UI.HSource import HSource
+from UI.SOSSource import SOSSource
+from UI.TempSource import TempSource
+from UI.Salinity import Salinity
+from UI.ShipTrack import Shiptrack
+
+# from UI.MapWTContour import MapWTContour
+from UI.MapTrack import Maptrack
+from UI.BoatSpeed import BoatSpeed
+from UI.Draft import Draft
+from UI.TemperatureTS import TemperatureTS
+from UI.HeadingTS import HeadingTS
+from UI.PRTS import PRTS
+from UI.DischargeTS import DischargeTS
+from UI.StationaryGraphs import StationaryGraphs
+from UI.WTContour import WTContour
+from UI.Rating import Rating
+from UI.ExtrapPlot import ExtrapPlot
+from UI.StartEdge import StartEdge
+from UI.EdgeType import EdgeType
+from UI.EdgeDist import EdgeDist
+from UI.EdgeEns import EdgeEns
+from UI.UMeasurement import UMeasurement
+from UI.UMeasQ import UMeasQ
+from UI.MplCanvas import MplCanvas
+from UI.Disclaimer import Disclaimer
+from UI.AdvGraphs import AdvGraphs
+from UI.ULollipopPlot import ULollipopPlot
+from UI.AxesScale import AxesScale
+
+# if there is a splash screen close it
+# if getattr(sys, 'frozen', False):
+#     try:
+#         import pyi_splash
+#
+#         pyi_splash.close()
+#     except:
+#         pass
+
+
+class QRev(QtWidgets.QMainWindow, QRev_gui.Ui_MainWindow):
+    """This the primary class controlling the user interface which then
+     controls the computational code.
+
+    Attributes
+    ----------
+    meas: Measurement
+        Object of Measurement class
+    checked_transects_idx: list
+        List of transect indices to be used in the discharge computation
+    h_external_valid: bool
+        Indicates if external heading is included in data
+    main_initialized: bool
+        Indicates if tab UI have been initialized
+    systest_initialized: bool
+        Indicates if tab UI have been initialized
+    compass_pr_initialized: bool
+        Indicates if tab UI have been initialized
+    tempsal_initialized: bool
+        Indicates if tab UI have been initialized
+    mb_initialized: bool
+        Indicates if tab UI have been initialized
+    bt_initialized: bool
+        Indicates if tab UI have been initialized
+    gps_initialized: bool
+        Indicates if tab UI have been initialized
+    depth_initialized: bool
+        Indicates if tab UI have been initialized
+    wt_initialized: bool
+        Indicates if tab UI have been initialized
+    extrap_initialized: bool
+        Indicates if tab UI have been initialized
+    edges_initialized: bool
+        Indicates if tab UI have been initialized
+    adv_graph_initialized: bool
+        Indicates if tab UI have been initialized
+    transect_row: int
+        Index of row currently selected for display
+    change: bool
+        Indicates data has changed and the main tab will need to be updated
+    settingsFile: str
+        Filename for settings that carryover between sessions
+    sticky_settings: SSet
+        Object of StickySettings class
+    units: dict
+        Dictionary containing units coversions and labels for length, area,
+        velocity, and discharge
+    save_stylesheet: bool
+        Indicates whether to save a stylesheet with the measurement
+    icon_caution: QtGui.QIcon
+        Caution icon
+    icon_warning: QtGui.QIcon
+        Warning icon
+    icon_good: QtGui.QIcon
+        Good icon
+    icon_allChecked: QtGui.QIcon
+        Checked icon
+    icon_unChecked: QtGui.QIcon
+        Unchecked icon
+    save_all: bool
+        Indicates if all transects should be save (True) or only the checked
+        transects (False)
+    QRev_version: str
+        QRev version number
+    current_tab: str
+        Name of currently viewed tab
+    transect_row: int
+        Row index of selected transect
+    figs: list
+        List of figure objects
+    canvases: list
+        List of canvas objects
+    toolbars: list
+        List of toolbar objects
+    font_bold: QtGui.QFont
+        Bold font
+    font_normal: QtGui.QFont
+        Normal font
+    mb_row_selected: int
+        Moving-bed test index to selected
+    mb_row: int
+        Moving-bed test to plot
+    transect: TransectData
+        Temporary storage to pass selected transect
+    invalid_bt: np.array(bool)
+        Array to facilitate sharing of invalid bottom track among some methods
+    invalid_gps: np.array(bool)
+        Array to facilitate sharing of invalid gps data among some methods
+    invalid_wt: np.array(bool)
+        Array to facilitate sharing of invalid water track data among some
+         methods
+    wt_max_limit: float
+        Maximum water speed to allow consistent scaling of color contour graphs
+         on same tab
+    extrap_meas: Measurement
+        Copy of measurement to allow resetting of changes made on the extrap
+        tab
+    start_bank: str
+        Start bank for selected transect used in graphics methods
+    idx: int
+        Index of selected transect or measurement used in extrap tab
+    edi_results: dict
+        Dictionary of edi computed data
+    groupings: list
+        List of transect groupings used with interface with RIVRS
+    group_idx: int
+        Index to grouping being processed
+    main_shiptrack_canvas: MplCanvas
+        Shiptrack canvas for main tab
+    main_shiptrack_toolbar: NavigationToolbar
+        Shiptrack toolbar for main tab
+    main_shiptrack_fig: ShipTrack
+        Shiptrack figure for main tab
+    main_wt_contour_canvas: MplCanvas
+        Color contour canvas for main tab
+    main_wt_contour_fig: WTContour
+        Color contour figure for main tab
+    main_wt_contour_toolbar: NavigationToolbar
+        Color contour toolbar for main tab
+    main_extrap_canvas: MplCanvas
+        Extrapolation canvas for main tab
+    main_extrap_toolbar: NavigationToolbar
+        Extrapolation toolbar for main tab
+    main_extrap_fig: ExtrapPlot
+        Extrapolation figure for main tab
+    main_discharge_canvas: MplCanvas
+        Discharge time series canvas for main tab
+    main_discharge_toolbar: NavigationToolbar
+        Discharge time series toolbar for main tab
+    main_discharge_fig: DischargeTS
+        Discharge time series figure for main tab
+    heading_canvas: MplCanvas
+        Heading time series canvas
+    heading_toolbar: NavigationToolbar
+        Heading time series toolbar
+    heading_fig: HeadingTS
+        Heading time series figure
+    pr_canvas: MplCanvas
+        Pitch and roll time series canvas
+    pr_toolbar: NavigationToolbar
+        Pitch and roll time series toolbar
+    pr_fig: PRTS
+        Pitch and roll time series figure
+    tts_canvas: MplCanvas
+        Temperature time series canvas
+    tts_toolbar: NavigationToolbar
+        Temperature time seriex toolbar
+    tts_fig: TemperatureTS
+        Temperature time series figure
+    mb_shiptrack_canvas: MplCanvas
+        Moving-bed test shiptrack canvas
+    mb_shiptrack_toolbar: NavigationToolbar
+        Moving-bed test shiptrack toolbar
+    mb_shiptrack_fig: ShipTrack
+        Moving-bed test shiptrack figure
+    mb_ts_canvas: MplCanvas
+        Moving-bed time series canvas
+    mb_ts_toolbar: NavigationToolbar
+        Moving-bed time seris toolbar
+    mb_ts_fig: BoatSpeed, StationaryGraphs
+        Moving-bed time series for loop and stationary tests
+    bt_shiptrack_canvas: MplCanvas
+        Bottom track shiptrack canvas
+    bt_shiptrack_toolbar: NavigationToolbar
+        Bottom track shiptrack toolbar
+    bt_shiptrack_fig: ShipTrack
+        Bottom track shiptrack figure
+    bt_ts_canvas: MplCanvas
+        Bottom track filter time series canvas
+    bt_ts_toolbar: NavigationToolbar
+        Bottom track filter time series toolbar
+    bt_ts_fig: AdvGraphs
+        Bottom track filters time series figure
+    gps_shiptrack_canvas: MplCanvas
+        GPS shiptrack canvas
+    gps_shiptrack_toolbar: NavigationToolbar
+        GPS shiptrack toolbar
+    gps_shiptrack_fig: ShipTrack
+        GPS shiptrack figure
+    gps_ts_canvas: MplCanvas
+        GPS filters time series canvases
+    gps_ts_toolbar: NavigationToolbar
+        GPS filters time series toolbar
+    gps_ts_fig: AdvGraphs
+        GPS filters times series figure
+    gps_bt_shiptrack_canvas: MplCanvas
+        GPS - BT shiptrack canvas
+    gps_bt_shiptrack_toolbar: NavigationToolbar
+        GPS - BT shiptrack toolbar
+    gps_bt_shiptrack_fig: ShipTrack
+        GPS - BT shiptrack figure
+    gps_bt_speed_canvas: MplCanvas
+        GPS - BT time series speed canvas
+    gps_bt_speed_toolbar: NavigationToolbar
+        GPS - BT time series speed toolbar
+    gps_bt_speed_fig: ShipTrack
+        GPS - BT time series speed figure
+    depth_canvas: MplCanvas
+        Depth final cross section canvas
+    depth_toolbar: NavigationToolbar
+        Depth final cross section toolbar
+    depth_fig: AdvGraphs
+        Depth final cross section figure
+    wt_shiptrack_canvas: MplCanvas
+        Water track shiptrack canvas
+    wt_shiptrack_toolbar: NavigationToolbar
+        Water track shiptrack toolbar
+    wt_shiptrack_fig: ShipTrack
+        Water track shiptrack figure
+    wt_filter_canvas: MplCanvas
+        Water track filters graph canvas
+    wt_filter_toolbar: NavigationToolbar
+        Water track filters graphs toolbar
+    wt_filter_fig: AdvGraphs
+        Water track filters graph figure
+    extrap_canvas: MplCanvas
+        Extrapolation canvas
+    extrap_toolbar: NavigationToolbar
+        Extrapolation toolbar
+    extrap_fig: ExtrapPlot
+        Extrapolation figure
+    left_edge_contour_canvas: MplCanvas
+        Left edge color contour canvas
+    left_edge_contour_toolbar: NavigationToolbar
+        Left edge color contour toolbar
+    left_edge_contour_fig: WTContour
+        Left edge color contour figure
+    right_edge_contour_canvas: MplCanvas
+        Right edge color contour canvas
+    right_edge_contour_toolbar: NavigationToolbar
+        Right edge color contour toolbar
+    right_edge_contour_fig: WTContour
+        Right edge color contour figure
+    left_edge_st_canvas: MplCanvas
+        Left edge shiptrack canvas
+    left_edge_st_toolbar: NavigationToolbar
+        Left edge shiptrack toolbar
+    left_edge_st_fig: ShipTrack
+        Left edge shiptrack figure
+    right_edge_st_canvas: MplCanvas
+        Right edge shiptrack canvas
+    right_edge_st_toolbar: NavigationToolbar
+        Right edge shiptrack toolbar
+    right_edge_st_fig: ShipTrack
+        Right edge shiptrack figure
+    uncertainty_meas_q_canvas: MplCanvas
+        Uncertainty measured discharge canvas
+    uncertainty_meas_q_fig: UMeasQ
+        Uncertainty measured discharge figure
+    uncertainty_meas_q_toolbar: NavigationToolbar
+        Uncertainty measured discharge toolbar
+    uncertainty_measurement_canvas: MplCanvas
+        Uncertainty measurement canvas
+    uncertainty_measurement_fig: UMeasurement
+        Uncertainty measurement figure
+    uncertainty_measurement_toolbar: NavigationToolbar
+        Uncertainty measurement toolbar
+    adv_graph_canvas: MplCanvas
+        Advanced graphics canvas
+    adv_graph_fig: AdvGraphs
+        Advanced graphics figure
+    adv_graph_toolbar: NavigationToolbar
+        Advanced graphics toolbar
+    rating_prompt: bool
+        Indicates that the user should be prompted to rate the measurement
+        when saving
+    use_weighted: bool
+        Indicates if the discharge weighted medians should be used to determine
+         the extrapolation
+    agreement: bool
+        Indicates that the user has agreed to the disclaimer and license
+    show_below_sl: bool
+        Advanced plots show data below sidelobe cutoff if available.
+    adv_graph_types: list
+        List of available graphs
+    sc_bt: QtWidgets.QShortcut
+        Shortcut to set BT reference
+    sc_weighted: QtWidgets.QShortcut
+        Shortcut to toggle discharge weighted extrapolation
+    sc_options: QtWidgets.QShortcut
+        Shortcut to open Options dialog
+    sc_comment: QtWidgets.QShortcut
+        Shortcut to open Comments dialog
+    sc_select_transects: QtWidgets.QShortcut
+        Shortcut to open select transects dialog
+    sc_save: QtWidgets.QShortcut
+        Shortcut to save file
+    sc_x_time: QtWidgets.QShortcut
+        Shortcut to change x-axis to time
+    sc_x_length: QtWidgets.QShortcut
+        Shortcut to change x-axis to length
+    sc_x_ensembles: QtWidgets.QShortcut
+        Shortcut to change x-asix to ensembles
+    sc_advanced: QtWidgets.QShortcut
+        Shortcut to show data below sidelobe
+    sc_gga: QtWidgets.QShortcut
+        Shortcut to set gga reference
+    sc_vtg: QtWidgets.QShortcut
+        Shortcut to set vtg reference
+    path: str
+        Path to loaded data file(s)
+    xs_export: bool
+        Indicates that the mean cross-section should be computed and included
+        the XML when saving
+    show_map: bool
+        Indicates if the MAP tab should be shown and the MAP computed
+    gps_quality_threshold: int
+        Sets the threshold for which the GPS quality must equal to or greater than
+    """
+
+    handle_args_trigger = pyqtSignal()
+    gui_initialized = False
+    command_arg = ""
+
+    def __init__(self, parent=None, groupings=None, data=None, caller=None):
+        """Initializes the QRev class and sets up the user interface.
+
+        Parameters
+        ----------
+        parent: QWidget
+            Parent object
+        groupings: list
+            List of lists containing the transect indices that make up
+            individual measurements
+        data: Measurement
+            Object of Measurement class
+        caller: object
+            Calling object, could be RIVRS
+        """
+        super(QRev, self).__init__(parent)
+        self.setupUi(self)
+
+        # Set version of QRev
+        self.QRev_version = "QRevInt 1.23"
+        self.setWindowTitle(self.QRev_version)
+        self.setWindowIcon(QtGui.QIcon("QRevInt.ico"))
+        show_disclaimer = True
+
+        # Disable ability to hide toolbar
+        self.toolBar.toggleViewAction().setEnabled(False)
+
+        # Get agency optional settings
+        options_file = os.path.join(os.getcwd(), "QRev.cfg")
+
+        if os.path.exists(options_file) is False:
+            config = Config()
+            config.export_config()
+
+            self.popup_message(
+                self.tr(
+                    "QRev.cfg was not found so a default configuration "
+                    "file was created."
+                )
+            )
+
+        # Read json into dictionary
+        try:
+            with open(options_file, "r") as f:
+                self.agency_options = json.load(f)
+        except json.decoder.JSONDecodeError:
+            self.popup_message(
+                self.tr(
+                    "QRev.cfg could not be read due a formatting error. "
+                    "QRev cannot continue."
+                )
+            )
+            sys.exit()
+
+        # Setting file for settings to carry over from one session to the next
+        self.settingsFile = "QRev_Settings"
+        # Create settings object which contains the default values from
+        # previous use
+        self.sticky_settings = SSet(self.settingsFile)
+
+        if "XAxis" in self.sticky_settings.settings:
+            self.x_axis_type = self.sticky_settings.get("XAxis")
+        else:
+            self.x_axis_type = "E"
+            self.sticky_settings.new("XAxis", "E")
+
+        # Set units based on previous session or default to English
+        if "Units" not in self.agency_options.keys():
+            self.popup_message(self.tr("QRev.cfg: Units parameter not found."))
+            sys.exit()
+        if "show" not in self.agency_options["Units"].keys():
+            self.popup_message(self.tr("QRev.cfg Units: show parameter not " "found."))
+            sys.exit()
+        if "default" not in self.agency_options["Units"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg Units: default parameter not " "found.")
+            )
+            sys.exit()
+        try:
+            if self.agency_options["Units"]["show"]:
+                units_id = self.sticky_settings.get("UnitsID")
+            else:
+                units_id = self.agency_options["Units"]["default"]
+            if not units_id:
+                self.sticky_settings.set(
+                    "UnitsID", self.agency_options["Units"]["default"]
+                )
+        except KeyError:
+            self.sticky_settings.new("UnitsID", self.agency_options["Units"]["default"])
+        self.units = units_conversion(units_id=self.sticky_settings.get("UnitsID"))
+
+        # Save all transects by default
+        self.save_all = True
+
+        # Use unweighted medians for extrapolation by default
+        if "ExtrapWeighting" not in self.agency_options.keys():
+            self.popup_message(
+                self.tr("QRev.cfg: ExtrapWeighting parameter not found.")
+            )
+            sys.exit()
+        if "show" not in self.agency_options["ExtrapWeighting"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg ExtrapWeighting: show parameter not found.")
+            )
+            sys.exit()
+        if "default" not in self.agency_options["ExtrapWeighting"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg ExtrapWeighting: default parameter not found.")
+            )
+            sys.exit()
+        try:
+            if self.agency_options["ExtrapWeighting"]["show"]:
+                wght = self.sticky_settings.get("UseWeighted")
+            else:
+                wght = self.agency_options["ExtrapWeighting"]["default"]
+            self.use_weighted = wght
+        except KeyError:
+            self.sticky_settings.new(
+                "UseWeighted", self.agency_options["ExtrapWeighting"]["default"]
+            )
+            self.use_weighted = self.agency_options["ExtrapWeighting"]["default"]
+
+        # Use whole measurement or transects for error and vertical velocity
+        # filters
+        if "FilterUsingMeasurement" not in self.agency_options.keys():
+            self.popup_message(
+                self.tr("QRev.cfg: FilterUsingMeasurement parameter not found.")
+            )
+            sys.exit()
+        if "show" not in self.agency_options["FilterUsingMeasurement"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg FilterUsingMeasurement: show parameter not found.")
+            )
+            sys.exit()
+        if "default" not in self.agency_options["FilterUsingMeasurement"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg FilterUsingMeasurement: default parameter not found.")
+            )
+            sys.exit()
+        try:
+            if self.agency_options["FilterUsingMeasurement"]["show"]:
+                use_meas = self.sticky_settings.get("UseMeasurementThresholds")
+            else:
+                use_meas = self.agency_options["FilterUsingMeasurement"]["default"]
+            self.use_measurement_thresholds = use_meas
+        except KeyError:
+            self.sticky_settings.new(
+                "UseMeasurementThresholds",
+                self.agency_options["FilterUsingMeasurement"]["default"],
+            )
+            self.use_measurement_thresholds = self.agency_options[
+                "FilterUsingMeasurement"
+            ]["default"]
+
+        # Stylesheet setting
+        if "SaveStyleSheet" not in self.agency_options.keys():
+            self.popup_message(self.tr("QRev.cfg: SaveStyleSheet parameter not found."))
+            sys.exit()
+        if "show" not in self.agency_options["SaveStyleSheet"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg SaveStyleSheet: show parameter not found.")
+            )
+            sys.exit()
+        if "default" not in self.agency_options["SaveStyleSheet"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg SaveStyleSheet: default parameter not found.")
+            )
+            sys.exit()
+        try:
+            if self.agency_options["SaveStyleSheet"]["show"]:
+                ss = self.sticky_settings.get("StyleSheet")
+                self.save_stylesheet = ss
+            else:
+                self.save_stylesheet = self.agency_options["SaveStyleSheet"]["default"]
+        except KeyError:
+            self.sticky_settings.new(
+                "StyleSheet", self.agency_options["SaveStyleSheet"]["default"]
+            )
+            self.save_stylesheet = self.agency_options["SaveStyleSheet"]["default"]
+
+        # Prompt for user rating
+        if "RatingPrompt" not in self.agency_options.keys():
+            self.popup_message(self.tr("QRev.cfg: RatingPrompt parameter not found."))
+            sys.exit()
+        if "show" not in self.agency_options["RatingPrompt"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg RatingPrompt: show parameter not found.")
+            )
+            sys.exit()
+        if "default" not in self.agency_options["RatingPrompt"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg RatingPrompt: default parameter not found.")
+            )
+            sys.exit()
+        try:
+            if self.agency_options["RatingPrompt"]["show"]:
+                ss = self.sticky_settings.get("UserRating")
+                self.rating_prompt = ss
+            else:
+                self.rating_prompt = self.agency_options["RatingPrompt"]["default"]
+        except KeyError:
+            self.sticky_settings.new(
+                "UserRating", self.agency_options["RatingPrompt"]["default"]
+            )
+            self.rating_prompt = self.agency_options["RatingPrompt"]["default"]
+
+        # check xs export setting
+        if "ExportCrossSection" not in self.agency_options.keys():
+            self.popup_message(
+                self.tr("QRev.cfg: ExportCrossSection parameter not found.")
+            )
+            sys.exit()
+        if "show" not in self.agency_options["RatingPrompt"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg ExportCrossSection: show parameter not found.")
+            )
+            sys.exit()
+        if "default" not in self.agency_options["RatingPrompt"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg ExportCrossSection: default parameter not found.")
+            )
+            sys.exit()
+        try:
+            if self.agency_options["ExportCrossSection"]["show"]:
+                ss = self.sticky_settings.get("XsExport")
+                self.xs_export = ss
+            else:
+                self.xs_export = self.agency_options["ExportCrossSection"]["default"]
+        except KeyError:
+            self.sticky_settings.new(
+                "XsExport", self.agency_options["ExportCrossSection"]["default"]
+            )
+            self.xs_export = self.agency_options["ExportCrossSection"]["default"]
+
+        # MAP
+        if "MAP" not in self.agency_options.keys():
+            self.popup_message(self.tr("QRev.cfg: MAP parameter not found."))
+            sys.exit()
+        if "show" not in self.agency_options["MAP"].keys():
+            self.popup_message(self.tr("QRev.cfg MAP: show parameter not found."))
+            sys.exit()
+        if self.agency_options["MAP"]["show"]:
+            self.show_map = True
+        else:
+            self.show_map = False
+            self.tab_all.removeTab(
+                self.tab_all.indexOf(
+                    self.tab_all.findChild(QtWidgets.QWidget, "tab_map")
+                )
+            )
+
+        # Autonomous GPS
+        if "AutonomousGPS" not in self.agency_options.keys():
+            self.popup_message(self.tr("QRev.cfg: AutonomousGPS parameter not found."))
+            sys.exit()
+        if "allow" not in self.agency_options["AutonomousGPS"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg AutonomousGPS: allow parameter not found.")
+            )
+            sys.exit()
+        if self.agency_options["AutonomousGPS"]["allow"]:
+            self.gps_quality_threshold = 1
+        else:
+            self.gps_quality_threshold = 2
+
+        # Color map
+        if "ColorMap" not in self.agency_options.keys():
+            self.popup_message(self.tr("QRev.cfg: ColorMap " "parameter not found."))
+            sys.exit()
+        if "show" not in self.agency_options["ColorMap"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg ColorMap: " "show parameter not found.")
+            )
+            sys.exit()
+        if "default" not in self.agency_options["ColorMap"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg ColorMap: " "default parameter not found.")
+            )
+            sys.exit()
+        try:
+            if self.agency_options["ColorMap"]["show"]:
+                ss = self.sticky_settings.get("ColorMap")
+                self.color_map = ss
+            else:
+                self.color_map = self.agency_options["ColorMap"]["default"]
+        except KeyError:
+            self.sticky_settings.new(
+                "ColorMap", self.agency_options["ColorMap"]["default"]
+            )
+            self.color_map = self.agency_options["ColorMap"]["default"]
+
+        # Uncertainty model
+        if "Uncertainty" not in self.agency_options.keys():
+            self.popup_message(self.tr("QRev.cfg: Uncertainty " "parameter not found."))
+            sys.exit()
+        if "show" not in self.agency_options["Uncertainty"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg Uncertainty: " "show parameter not found.")
+            )
+            sys.exit()
+        if "default" not in self.agency_options["Uncertainty"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg Uncertainty: " "default parameter not found.")
+            )
+            sys.exit()
+        try:
+            if self.agency_options["Uncertainty"]["show"]:
+                ss = self.sticky_settings.get("Oursin")
+                self.run_oursin = ss
+            elif self.agency_options["Uncertainty"]["default"] == "Oursin":
+                self.run_oursin = True
+            else:
+                self.run_oursin = False
+
+        except KeyError:
+            if self.agency_options["Uncertainty"]["default"] == "Oursin":
+                self.run_oursin = True
+            else:
+                self.run_oursin = False
+            self.sticky_settings.new("Oursin", self.run_oursin)
+
+        if self.run_oursin:
+            self.tab_all.addTab(self.tab_uncertainty, "Uncertainty")
+        else:
+            self.tab_all.removeTab(
+                self.tab_all.indexOf(
+                    self.tab_all.findChild(QtWidgets.QWidget, "tab_uncertainty")
+                )
+            )
+
+        # Observed no moving-bed
+        if "MovingBedObservation" not in self.agency_options.keys():
+            self.popup_message(
+                self.tr("QRev.cfg: MovingBedObservation parameter not found.")
+            )
+            sys.exit()
+        if "show" not in self.agency_options["MovingBedObservation"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg: MovingBedObservation: show parameter not found.")
+            )
+            sys.exit()
+        if "default" not in self.agency_options["MovingBedObservation"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg MovingBedObservation: default parameter not found.")
+            )
+            sys.exit()
+
+        try:
+            if self.agency_options["MovingBedObservation"]["show"]:
+                ss = self.sticky_settings.get("AllowNoMB")
+                self.allow_observed_no_moving_bed = ss
+            else:
+                self.allow_observed_no_moving_bed = self.agency_options[
+                    "MovingBedObservation"
+                ]["default"]
+        except KeyError:
+            self.sticky_settings.new(
+                "AllowNoMB", self.agency_options["MovingBedObservation"]["default"]
+            )
+            self.allow_observed_no_moving_bed = self.agency_options[
+                "MovingBedObservation"
+            ]["default"]
+
+        # Check for QA Settings
+        if "QA" not in self.agency_options.keys():
+            self.popup_message(self.tr("QRev.cfg: QA parameter not found."))
+            sys.exit()
+        if "MinTransects" not in self.agency_options["QA"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg: QA MinTransects parameter " "not found.")
+            )
+            sys.exit()
+        if "MinDuration" not in self.agency_options["QA"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg QA MinDuration parameter " "not found.")
+            )
+            sys.exit()
+
+        # SNR 3-beam computations setting
+        if "SNR" not in self.agency_options.keys():
+            self.popup_message(self.tr("QRev.cfg: SNR parameter not found."))
+            sys.exit()
+        if "Use3Beam" not in self.agency_options["SNR"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg: SNR Use3Beam parameter " "not found.")
+            )
+            sys.exit()
+
+        # Extrapolated speed display option
+        if "ExtrapolatedSpeed" not in self.agency_options.keys():
+            self.popup_message(
+                self.tr("QRev.cfg: ExtrapolatedSpeed parameter not found.")
+            )
+            sys.exit()
+        if "ShowIcon" not in self.agency_options["ExtrapolatedSpeed"].keys():
+            self.popup_message(
+                self.tr("QRev.cfg: ExtrapolatedSpeed ShowIcon parameter " "not found.")
+            )
+            sys.exit()
+
+        self.manual_computational_settings = {
+            "run_oursin": self.run_oursin,
+            "use_measurement_thresholds": self.use_measurement_thresholds,
+            "use_weighted": self.use_weighted,
+        }
+
+        # Set initial change switch to false
+        self.change = False
+
+        # Set the initial tab to the main tab
+        self.current_tab = "Main"
+        self.transect_row = 0
+
+        # Initialize emtpy tab setting dict
+        self.tab_settings = {
+            "tab_bt": "Default",
+            "tab_wt": "Default",
+            "tab_depth": "Default",
+            "tab_extrap": "Default",
+            "tab_tempsal": "Default",
+            "tab_gps": "Default",
+        }
+
+        # Connect toolbar button to methods
+        self.actionOpen.triggered.connect(self.select_measurement)
+        self.actionComment.triggered.connect(self.add_comment)
+        self.actionCheck.triggered.connect(self.select_q_transects)
+        self.actionBT.triggered.connect(self.set_ref_bt)
+        self.actionGGA.triggered.connect(self.set_ref_gga)
+        self.actionVTG.triggered.connect(self.set_ref_vtg)
+        self.actionOFF.triggered.connect(self.comp_tracks_off)
+        self.actionON.triggered.connect(self.comp_tracks_on)
+        self.actionOptions.triggered.connect(self.qrev_options)
+        self.actionData_Cursor.triggered.connect(self.data_cursor)
+        self.actionHome.triggered.connect(self.home)
+        self.actionZoom.triggered.connect(self.zoom)
+        self.actionPan.triggered.connect(self.pan)
+        self.actionGoogle_Earth.triggered.connect(self.plot_google_earth)
+        self.actionHelp.triggered.connect(self.help)
+        self.actionShow_Extrapolated.triggered.connect(self.show_extrapolated)
+
+        # Initialize lists for figure, canvas, and toolbar references
+        self.figs = []
+        self.canvases = []
+        self.toolbars = []
+        self.ui_parents = []
+        self.fig_calls = []
+        self.map_settings = None
+        self.map_current_settings = None
+        self.current_axis = None
+
+        # Save figure menu with Right click
+        self.figsMenu = QtWidgets.QMenu(self)
+        self.figsMenu.addAction("Save figure", self.save_fig)
+        self.figsMenu.addAction("Set Axes Limits", self.set_axes)
+
+        # Connect a change in selected tab to the tab manager
+        self.tab_all.currentChanged.connect(self.tab_manager)
+
+        # Disable all tabs until data are loaded
+        self.tab_all.setEnabled(False)
+
+        # Set tooltips for toolbar icons
+        self.actionOpen.setToolTip(self.tr("Open measurement [CNTL-F]"))
+        self.actionComment.setToolTip(self.tr("Add comment [CNTL-N]"))
+        self.actionCheck.setToolTip(self.tr("Select transects [CNTL-Q]"))
+        self.actionBT.setToolTip(self.tr("Set BT as reference [CNTL-B]"))
+        self.actionGGA.setToolTip(self.tr("Set GGA as reference [CNTL-G]"))
+        self.actionVTG.setToolTip(self.tr("Set VGT as reference [CNTL-V]"))
+        self.actionOFF.setToolTip(self.tr("Composite tracks off"))
+        self.actionON.setToolTip(self.tr("Composite tracks on"))
+        self.actionOptions.setToolTip(self.tr("Options [CNTL-O]"))
+        self.actionData_Cursor.setToolTip(self.tr("Data cursor"))
+        self.actionHome.setToolTip(self.tr("Reset graphs"))
+        self.actionZoom.setToolTip(
+            self.tr("Zoom Window (In: Left click, Out: Right click ")
+        )
+        self.actionPan.setToolTip(self.tr("Pan"))
+        self.actionGoogle_Earth.setToolTip(self.tr("Plot transects in Google Earth"))
+        self.actionHelp.setToolTip(self.tr("Open help documents."))
+        self.actionShow_Extrapolated.setToolTip(self.tr("Show extrapolated speeds"))
+
+        # Disable toolbar icons until data are loaded
+        self.actionSave.setDisabled(True)
+        self.actionComment.setDisabled(True)
+        self.actionCheck.setDisabled(True)
+        self.actionBT.setDisabled(True)
+        self.actionGGA.setDisabled(True)
+        self.actionVTG.setDisabled(True)
+        self.actionOFF.setDisabled(True)
+        self.actionON.setDisabled(True)
+        self.actionOptions.setEnabled(True)
+        self.actionGoogle_Earth.setDisabled(True)
+
+        # Configure bold and normal fonts
+        self.font_bold = QtGui.QFont()
+        self.font_bold.setBold(True)
+        self.font_normal = QtGui.QFont()
+        self.font_normal.setBold(False)
+        self.message_font = QtGui.QFont()
+        self.message_font.setPointSize(12)
+
+        # Setup indicator icons
+        self.icon_caution = QtGui.QIcon()
+        self.icon_caution.addPixmap(
+            QtGui.QPixmap(":/images/24x24/Warning.png"),
+            QtGui.QIcon.Normal,
+            QtGui.QIcon.Off,
+        )
+
+        self.icon_warning = QtGui.QIcon()
+        self.icon_warning.addPixmap(
+            QtGui.QPixmap(":/images/24x24/Alert.png"),
+            QtGui.QIcon.Normal,
+            QtGui.QIcon.Off,
+        )
+
+        self.icon_good = QtGui.QIcon()
+        self.icon_good.addPixmap(
+            QtGui.QPixmap(":/images/24x24/Yes.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off
+        )
+
+        self.icon_allChecked = QtGui.QIcon()
+        self.icon_allChecked.addPixmap(
+            QtGui.QPixmap(":/images/24x24/check-mark-green.png"),
+            QtGui.QIcon.Normal,
+            QtGui.QIcon.Off,
+        )
+
+        self.icon_unChecked = QtGui.QIcon()
+        self.icon_unChecked.addPixmap(
+            QtGui.QPixmap(":/images/24x24/check-mark-orange.png"),
+            QtGui.QIcon.Normal,
+            QtGui.QIcon.Off,
+        )
+
+        # Intialize attributes
+        self.path = ""
+        self.checked_transects_idx = []
+        self.meas = None
+        self.h_external_valid = False
+        self.mb_row_selected = 0
+        self.transect = None
+        self.invalid_bt = None
+        self.invalid_gps = None
+        self.invalid_wt = None
+        self.wt_max_limit = None
+        self.extrap_meas = None
+        self.start_bank = None
+        self.idx = None
+        self.edi_results = None
+        self.groupings = None
+        self.group_idx = None
+        self.main_shiptrack_canvas = None
+        self.main_shiptrack_toolbar = None
+        self.main_shiptrack_fig = None
+        self.main_wt_contour_canvas = None
+        self.main_wt_contour_fig = None
+        self.main_wt_contour_toolbar = None
+        self.main_extrap_canvas = None
+        self.main_extrap_toolbar = None
+        self.main_extrap_fig = None
+        self.main_discharge_canvas = None
+        self.main_discharge_toolbar = None
+        self.main_discharge_fig = None
+        self.heading_canvas = None
+        self.heading_toolbar = None
+        self.heading_fig = None
+        self.pr_canvas = None
+        self.pr_toolbar = None
+        self.pr_fig = None
+        self.tts_canvas = None
+        self.tts_toolbar = None
+        self.tts_fig = None
+        self.mb_shiptrack_canvas = None
+        self.mb_shiptrack_toolbar = None
+        self.mb_shiptrack_fig = None
+        self.mb_ts_canvas = None
+        self.mb_ts_toolbar = None
+        self.mb_ts_fig = None
+        self.bt_shiptrack_canvas = None
+        self.bt_shiptrack_toolbar = None
+        self.bt_shiptrack_fig = None
+        self.bt_ts_canvas = None
+        self.bt_ts_toolbar = None
+        self.bt_ts_fig = None
+        self.gps_shiptrack_canvas = None
+        self.gps_shiptrack_toolbar = None
+        self.gps_shiptrack_fig = None
+        self.gps_ts_canvas = None
+        self.gps_ts_toolbar = None
+        self.gps_ts_fig = None
+        self.gps_bt_shiptrack_canvas = None
+        self.gps_bt_shiptrack_toolbar = None
+        self.gps_bt_shiptrack_fig = None
+        self.gps_bt_speed_canvas = None
+        self.gps_bt_speed_toolbar = None
+        self.gps_bt_speed_fig = None
+        self.depth_canvas = None
+        self.depth_toolbar = None
+        self.depth_fig = None
+        self.wt_shiptrack_canvas = None
+        self.wt_shiptrack_toolbar = None
+        self.wt_shiptrack_fig = None
+        self.wt_filter_canvas = None
+        self.wt_filter_toolbar = None
+        self.wt_filter_fig = None
+        self.wt_advanced_canvas = None
+        self.wt_advanced_toolbar = None
+        self.wt_advanced_fig = None
+        self.extrap_canvas = None
+        self.extrap_toolbar = None
+        self.extrap_fig = None
+        self.left_edge_contour_canvas = None
+        self.left_edge_contour_toolbar = None
+        self.left_edge_contour_fig = None
+        self.right_edge_contour_canvas = None
+        self.right_edge_contour_toolbar = None
+        self.right_edge_contour_fig = None
+        self.left_edge_st_canvas = None
+        self.left_edge_st_toolbar = None
+        self.left_edge_st_fig = None
+        self.right_edge_st_canvas = None
+        self.right_edge_st_toolbar = None
+        self.right_edge_st_fig = None
+        self.uncertainty_meas_q_canvas = None
+        self.uncertainty_meas_q_fig = None
+        self.uncertainty_meas_q_toolbar = None
+        self.uncertainty_measurement_canvas = None
+        self.uncertainty_measurement_fig = None
+        self.uncertainty_measurement_toolbar = None
+        self.uncertainty_lollipop_canvas = None
+        self.uncertainty_lollipop_fig = None
+        self.uncertainty_lollipop_toolbar = None
+        self.adv_graph_canvas = None
+        self.adv_graph_fig = None
+        self.adv_graph_toolbar = None
+        self.adv_graph_types = []
+        self.map_shiptrack_canvas = None
+        self.map_shiptrack_toolbar = None
+        self.map_shiptrack_fig = None
+        self.map_wt_contour_canvas = None
+        self.map_wt_contour_toolbar = None
+        self.map_wt_contour_fig = None
+        self.current_fig = None
+        self.edges_axis_type = "E"
+        self.mb_row = 0
+        self.show_below_sl = False
+        self.plot_extrapolated = False
+
+        # Tab initialization tracking setup
+        self.main_initialized = False
+        self.systest_initialized = False
+        self.compass_pr_initialized = False
+        self.tempsal_initialized = False
+        self.mb_initialized = False
+        self.bt_initialized = False
+        self.gps_initialized = False
+        self.depth_initialized = False
+        self.wt_initialized = False
+        self.extrap_initialized = False
+        self.edges_initialized = False
+        self.edi_initialized = False
+        self.gps_bt_initialized = False
+        self.adv_graph_initialized = False
+        self.map_initialized = False
+
+        self.setMouseTracking(True)
+
+        # Special commands to ensure proper operation on Windows 10
+        if QtCore.QSysInfo.windowsVersion() == QtCore.QSysInfo.WV_WINDOWS10:
+            self.setStyleSheet(
+                "QHeaderView::section{"
+                "border-top: 0px solid #D8D8D8;"
+                "border-left: 0px solid #D8D8D8;"
+                "border-right: 1px solid #D8D8D8;"
+                "border-bottom: 1px solid #D8D8D8;"
+                "background-color: white;"
+                "padding:4px;"
+                "}"
+                "QTableCornerButton::section{"
+                "border-top: 0px solid #D8D8D8;"
+                "border-left: 0px solid #D8D8D8;"
+                "border-right: 1px solid #D8D8D8;"
+                "border-bottom: 1px solid #D8D8D8;"
+                "background-color: white;"
+                "}"
+            )
+
+        # Used for command line interface
+        self.gui_initialized = True
+
+        # If called by RIVRS setup QRev for automated group processing
+        if caller is not None:
+            self.caller = caller
+            self.split_initialization(groupings=groupings, data=data)
+            self.actionSave.triggered.connect(self.split_save)
+            self.config_gui()
+            self.change = True
+            self.tab_manager(tab_idx=0)
+            self.set_tab_color()
+            self.processed_data = []
+            self.processed_transects = []
+        else:
+            self.caller = None
+            self.actionSave.triggered.connect(self.save_measurement)
+            self.sc_open = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+F"), self)
+            self.sc_open.activated.connect(self.select_measurement)
+
+        # Setup shortcuts
+        self.sc_bt = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+B"), self)
+        self.sc_bt.activated.connect(self.set_ref_bt)
+        self.sc_weighted = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+W"), self)
+        self.sc_weighted.activated.connect(self.set_use_weighted)
+        self.sc_options = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+O"), self)
+        self.sc_options.activated.connect(self.qrev_options)
+        self.sc_comment = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+N"), self)
+        self.sc_comment.activated.connect(self.add_comment)
+        self.sc_select_transects = QtWidgets.QShortcut(
+            QtGui.QKeySequence("Ctrl+Q"), self
+        )
+        self.sc_select_transects.activated.connect(self.select_q_transects)
+        self.sc_save = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+S"), self)
+        self.sc_save.activated.connect(self.save_measurement)
+        self.sc_x_time = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+T"), self)
+        self.sc_x_time.activated.connect(self.x_axis_time)
+        self.sc_x_length = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+L"), self)
+        self.sc_x_length.activated.connect(self.x_axis_length)
+        self.sc_x_ensembles = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+E"), self)
+        self.sc_x_ensembles.activated.connect(self.x_axis_ensemble)
+        self.sc_advanced = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+A"), self)
+        self.sc_advanced.activated.connect(self.set_show_below_sl)
+        self.sc_unmeasured = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+U"), self)
+        self.sc_unmeasured.activated.connect(self.show_extrapolated)
+        self.sc_gga = None
+        self.sc_vtg = None
+
+        # Show QRev maximized on the display
+        self.showMaximized()
+
+        # Disclaimer is for QRevInt
+        if show_disclaimer:
+            try:
+                self.agreement = self.sticky_settings.get("Agreement")
+                if not self.agreement:
+                    self.close()
+            except KeyError:
+                # Open disclaimer and license
+                disclaimer = Disclaimer(self)
+                disclaimer_exec = disclaimer.exec_()
+                if disclaimer_exec:
+                    self.sticky_settings.new("Agreement", True)
+                    self.agreement = True
+                else:
+                    self.agreement = False
+                    self.close()
+        else:
+            self.agreement = True
+
+    # Toolbar functions
+    # =================
+    def select_measurement(self):
+        """Opens a dialog to allow the user to load measurement file(s) for
+        viewing or processing.
+        """
+
+        # Open dialog
+        select = OpenMeasurementDialog(parent=self)
+
+        # Update sticky_settings
+        self.sticky_settings = SSet(self.settingsFile)
+        self.path = self.sticky_settings.get("Folder")
+
+        # If a selection is made begin loading
+        if len(select.type) > 0:
+            self.tab_all.setEnabled(False)
+            # Tab initialization tracking setup
+            self.main_initialized = False
+            self.systest_initialized = False
+            self.compass_pr_initialized = False
+            self.tempsal_initialized = False
+            self.mb_initialized = False
+            self.bt_initialized = False
+            self.gps_initialized = False
+            self.depth_initialized = False
+            self.wt_initialized = False
+            self.extrap_initialized = False
+            self.edges_initialized = False
+            self.edi_initialized = False
+            self.gps_bt_initialized = False
+            self.adv_graph_initialized = False
+            self.map_initialized = False
+
+            # Reset computational settings
+            self.run_oursin = self.manual_computational_settings["run_oursin"]
+            self.use_measurement_thresholds = self.manual_computational_settings[
+                "use_measurement_thresholds"
+            ]
+            self.use_weighted = self.manual_computational_settings["use_weighted"]
+
+            # Load and process Sontek data
+            if select.type == "SonTek":
+                with self.wait_cursor():
+                    # Show folder name in GUI header
+                    self.setWindowTitle(self.QRev_version + ": " + select.pathName)
+
+                    # Create measurement object
+                    try:
+                        self.meas = Measurement(
+                            in_file=select.fullName,
+                            source="SonTek",
+                            proc_type="QRev",
+                            run_oursin=self.run_oursin,
+                            use_weighted=self.use_weighted,
+                            use_measurement_thresholds=self.use_measurement_thresholds,
+                            min_transects=self.agency_options["QA"]["MinTransects"],
+                            min_duration=self.agency_options["QA"]["MinDuration"],
+                            export_xs=self.xs_export,
+                            run_map=self.show_map,
+                            gps_quality_threshold=self.gps_quality_threshold,
+                            snr_3beam_comp=self.agency_options["SNR"]["Use3Beam"],
+                        )
+                    except CoordError as error:
+                        self.popup_message(error.text)
+
+            # Load and process Sontek data
+            if select.type == "Nortek":
+                with self.wait_cursor():
+                    # Show folder name in GUI header
+                    self.setWindowTitle(self.QRev_version + ": " + select.pathName)
+                    # Create measurement object
+                    self.meas = Measurement(
+                        in_file=select.fullName,
+                        source="Nortek",
+                        proc_type="QRev",
+                        run_oursin=self.run_oursin,
+                        use_weighted=self.use_weighted,
+                        use_measurement_thresholds=self.use_measurement_thresholds,
+                        min_transects=self.agency_options["QA"]["MinTransects"],
+                        min_duration=self.agency_options["QA"]["MinDuration"],
+                        export_xs=self.xs_export,
+                        run_map=self.show_map,
+                        gps_quality_threshold=self.gps_quality_threshold,
+                    )
+
+            # Load and process TRDI data
+            elif select.type == "TRDI":
+                with self.wait_cursor():
+                    # Show mmt filename in GUI header
+                    self.setWindowTitle(self.QRev_version + ": " + select.fullName[0])
+                    # Create measurement object
+                    self.meas = Measurement(
+                        in_file=select.fullName[0],
+                        source="TRDI",
+                        proc_type="QRev",
+                        checked=select.checked,
+                        run_oursin=self.run_oursin,
+                        use_weighted=self.use_weighted,
+                        use_measurement_thresholds=self.use_measurement_thresholds,
+                        min_transects=self.agency_options["QA"]["MinTransects"],
+                        min_duration=self.agency_options["QA"]["MinDuration"],
+                        export_xs=self.xs_export,
+                        run_map=self.show_map,
+                        gps_quality_threshold=self.gps_quality_threshold,
+                    )
+
+            # Load QRev data
+            elif select.type == "QRev":
+                # Show QRev filename in GUI header
+                self.setWindowTitle(self.QRev_version + ": " + select.fullName[0])
+                mat_data = sio.loadmat(
+                    select.fullName[0], struct_as_record=False, squeeze_me=True
+                )
+
+                message = (
+                    "Would you like to: <br><br>"
+                    + "<b>View</b> the measurement as saved <br>"
+                    + "<I>New quality checks will be "
+                    "applied. </I><br><br>" + "<b>Reprocess</b> the measurement "
+                    "using all the <br>"
+                    + "current settings (extrapolation, filters,<br>"
+                    + "uncertianty model, and the latest "
+                    "algorithms).<br><br>" + "NOTE: Any changes will reprocess "
+                    "the file  <br> " + "using the latest QRev algorithms, "
+                    "however,  <br>" + "identifying ping type from older "
+                    "QRev files  <br>"
+                    + "cannot be done for TRDI ADCPs. <br>"
+                    + "<I>To identify the ping type for TRDI "
+                    "data you <br> " + "must load the raw data files.</I><<br><br>"
+                )
+                message = self.tr(message)
+                msg_box = QtWidgets.QMessageBox()
+                msg_box.setIcon(QtWidgets.QMessageBox.Question)
+                msg_box.setWindowTitle("View or Reprocess")
+                msg_box.setFont(self.message_font)
+                msg_box.setText(message)
+                view_btn = msg_box.addButton(
+                    self.tr("View"), QtWidgets.QMessageBox.NoRole
+                )
+                reprocess_btn = msg_box.addButton(
+                    self.tr("Reprocess"), QtWidgets.QMessageBox.YesRole
+                )
+
+                msg_box.exec_()
+                # Process QRev data
+                with self.wait_cursor():
+                    if msg_box.clickedButton() == view_btn:
+                        self.meas = Measurement(
+                            in_file=mat_data,
+                            source="QRev",
+                            proc_type="None",
+                            export_xs=self.xs_export,
+                            run_map=self.show_map,
+                            gps_quality_threshold=self.gps_quality_threshold,
+                        )
+                    elif msg_box.clickedButton() == reprocess_btn:
+                        self.meas = Measurement(
+                            in_file=mat_data,
+                            source="QRev",
+                            proc_type="QRev",
+                            run_oursin=self.run_oursin,
+                            use_weighted=self.use_weighted,
+                            use_measurement_thresholds=self.use_measurement_thresholds,
+                            min_transects=self.agency_options["QA"]["MinTransects"],
+                            min_duration=self.agency_options["QA"]["MinDuration"],
+                            export_xs=self.xs_export,
+                            run_map=self.show_map,
+                            gps_quality_threshold=self.gps_quality_threshold,
+                        )
+
+                # Settings based on measurement settings
+                self.use_weighted = self.meas.use_weighted
+                self.run_oursin = self.meas.run_oursin
+                self.use_measurement_thresholds = self.meas.use_measurement_thresholds
+
+                # Oursin uncertainty model
+                if self.run_oursin:
+                    self.tab_all.addTab(self.tab_uncertainty, "Uncertainty")
+                else:
+                    self.tab_all.removeTab(
+                        self.tab_all.indexOf(
+                            self.tab_all.findChild(QtWidgets.QWidget, "tab_uncertainty")
+                        )
+                    )
+
+            if self.meas is not None:
+
+                # Identify transects to be used in discharge computation
+                self.checked_transects_idx = Measurement.checked_transects(self.meas)
+                if len(self.checked_transects_idx) > 0:
+                    with self.wait_cursor():
+
+                        # Determine if external heading is included in the data
+                        self.h_external_valid = Measurement.h_external_valid(self.meas)
+
+                        # Initialize GUI
+                        self.tab_settings = {
+                            "tab_bt": "Default",
+                            "tab_wt": "Default",
+                            "tab_depth": "Default",
+                            "tab_extrap": "Default",
+                            "tab_tempsal": "Default",
+                            "tab_gps": "Default",
+                        }
+                        self.transect_row = 0
+                        self.config_gui()
+                        self.change = True
+                        self.tab_manager(tab_idx=0, subtab_idx=0)
+                        # self.set_tab_color()
+                else:
+                    self.transect_row = 0
+                    self.config_gui()
+                    self.change = True
+                    self.tab_manager(tab_idx=0, subtab_idx=0)
+
+    def save_measurement(self):
+        """Save measurement in Matlab format."""
+
+        if len(self.checked_transects_idx) > 0:
+            if self.rating_prompt:
+                # Intialize dialog
+                rating_dialog = Rating(self)
+                if self.run_oursin:
+                    uncertainty = self.meas.oursin.u_measurement_user["total_95"][0]
+                else:
+                    uncertainty = self.meas.uncertainty.total_95_user
+
+                if np.isnan(uncertainty):
+                    rating_dialog.uncertainty_value.setText("N/A")
+                else:
+                    rating_dialog.uncertainty_value.setText(
+                        "{:4.1f}".format(uncertainty)
+                    )
+
+                if self.meas.user_rating in ["Not Rated", ""]:
+                    if uncertainty < 3:
+                        rating_dialog.rb_excellent.setChecked(True)
+                    elif uncertainty < 5.01:
+                        rating_dialog.rb_good.setChecked(True)
+                    elif uncertainty < 8.01:
+                        rating_dialog.rb_fair.setChecked(True)
+                    else:
+                        rating_dialog.rb_poor.setChecked(True)
+
+                elif "Excellent" in self.meas.user_rating:
+                    rating_dialog.rb_excellent.setChecked(True)
+                elif "Good" in self.meas.user_rating:
+                    rating_dialog.rb_good.setChecked(True)
+                elif "Fair" in self.meas.user_rating:
+                    rating_dialog.rb_fair.setChecked(True)
+                elif "Poor" in self.meas.user_rating:
+                    rating_dialog.rb_poor.setChecked(True)
+
+                rating_entered = rating_dialog.exec_()
+
+                # If data entered.
+                with self.wait_cursor():
+                    if rating_entered:
+                        if rating_dialog.rb_excellent.isChecked():
+                            rating = self.tr("Excellent")
+                        elif rating_dialog.rb_good.isChecked():
+                            rating = self.tr("Good")
+                        elif rating_dialog.rb_fair.isChecked():
+                            rating = self.tr("Fair")
+                        else:
+                            rating = self.tr("Poor")
+
+                # Create default file name
+                if rating_entered:
+                    self.meas.user_rating = rating
+                    self.set_user_rating()
+
+            save_file = SaveDialog(parent=self)
+
+            if len(save_file.full_Name) > 0:
+                # Add comment when saving file
+                time_stamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+                user_name = getpass.getuser()
+                discharge = Measurement.mean_discharges(self.meas)
+                text = (
+                    "["
+                    + time_stamp
+                    + ", "
+                    + user_name
+                    + "]: File Saved Q = "
+                    + "{:8.2f}".format(discharge["total_mean"] * self.units["Q"])
+                    + " "
+                    + self.units["label_Q"][1:-1]
+                    + " (Uncertainty: "
+                    + "{:4.1f}".format(self.meas.uncertainty.total_95_user)
+                    + "%)"
+                )
+                self.meas.comments.append(text)
+                self.comments_tab()
+
+                # Save data in Matlab format
+                if self.save_all:
+                    Python2Matlab.save_matlab_file(
+                        self.meas, save_file.full_Name, self.QRev_version
+                    )
+                else:
+                    Python2Matlab.save_matlab_file(
+                        self.meas,
+                        save_file.full_Name,
+                        self.QRev_version,
+                        checked=self.checked_transects_idx,
+                    )
+
+                # Save xml file
+                self.meas.xml_output(
+                    self.QRev_version, save_file.full_Name[:-4] + ".xml"
+                )
+
+                # Save stylesheet in measurement folder
+                if self.save_stylesheet:
+                    if self.units["ID"] == "SI":
+                        stylesheet = "QRevStylesheet_si.xsl"
+                    else:
+                        stylesheet = "QRevStylesheet_english.xsl"
+
+                    stylesheet_file = os.path.join(os.getcwd(), stylesheet)
+                    meas_folder, _ = os.path.split(save_file.full_Name)
+                    dest = os.path.join(meas_folder, "QRevStylesheet.xsl")
+                    shutil.copy2(stylesheet_file, dest)
+
+                # Notify user save is complete
+                QtWidgets.QMessageBox.about(
+                    self,
+                    self.tr("Save"),
+                    self.tr("Files (*_QRev.mat and " "*_QRev.xml) have been " "saved."),
+                )
+
+                self.uncertainty_table()
+        else:
+            # Notify user save is complete
+            QtWidgets.QMessageBox.warning(
+                self,
+                self.tr("Save"),
+                self.tr("No transects are selected." " Save cancelled."),
+            )
+
+    def add_comment(self):
+        """Add comment triggered by actionComment"""
+
+        if self.meas is not None:
+            # Initialize comment dialog
+            tab_name = self.tab_all.tabText(self.tab_all.currentIndex())
+            comment = Comment(tab_name)
+            comment_entered = comment.exec_()
+
+            # If comment entered and measurement open, save comment,
+            # and update comments tab.
+            if comment_entered:
+
+                if self.meas is not None:
+                    self.meas.comments.append(comment.text_edit_comment.toPlainText())
+                self.change = True
+                self.update_comments()
+
+    def select_q_transects(self):
+        """Initializes a dialog to allow user to select or deselect
+        transects to include in the measurement.
+        """
+
+        if self.meas is not None:
+            # Open dialog
+            transects_2_use = Transects2Use(self)
+            transects_selected = transects_2_use.exec_()
+            selected_transects = []
+
+            # Identify currently selected transects
+            if transects_selected:
+                with self.wait_cursor():
+                    for row in range(transects_2_use.tableSelect.rowCount()):
+                        if (
+                            transects_2_use.tableSelect.item(row, 0).checkState()
+                            == QtCore.Qt.Checked
+                        ):
+                            selected_transects.append(row)
+
+                    # Store selected transect indices
+                    self.checked_transects_idx = selected_transects
+                    if len(self.checked_transects_idx) > 0:
+                        # Update measurement based on the currently selected
+                        # transects
+                        Measurement.selected_transects_changed(
+                            self.meas, self.checked_transects_idx
+                        )
+
+                        # Update the transect select icon on the toolbar
+                        self.update_toolbar_trans_select()
+
+                        # Update display
+                        self.transect_row = 0
+                        self.config_gui()
+                        self.change = True
+                        self.tab_manager()
+
+                if len(self.checked_transects_idx) == 0:
+                    # Notify user
+                    QtWidgets.QMessageBox.warning(
+                        self, "Select", "No transects are " "selected. "
+                    )
+                    self.update_toolbar_trans_select()
+
+    def set_ref_bt(self):
+        """Changes the navigation reference to Bottom Track"""
+
+        if self.meas is not None:
+            with self.wait_cursor():
+                # Get all current settings
+                settings = Measurement.current_settings(self.meas)
+                old_discharge = self.meas.discharge
+                # Change NavRef setting to selected value
+                settings["NavRef"] = "BT"
+                # Update the measurement and GUI
+                Measurement.apply_settings(self.meas, settings)
+                self.update_toolbar_nav_ref()
+                self.change = True
+                self.tab_manager(old_discharge=old_discharge)
+
+    def set_ref_gga(self):
+        """Changes the navigation reference to GPS GGA"""
+
+        if self.meas is not None:
+            # Get all current settings
+            settings = Measurement.current_settings(self.meas)
+            invalid_gga_idx = []
+            # Check if gga quality is fine
+            for idx in self.checked_transects_idx:
+                if self.meas.transects[idx].boat_vel.gga_vel is not None:
+                    if np.all(
+                        self.meas.transects[idx].gps.diff_qual_ens[
+                            ~np.isnan(self.meas.transects[idx].gps.diff_qual_ens)
+                        ]
+                        < settings["ggaDiffQualFilter"]
+                    ):
+                        invalid_gga_idx.append(idx)
+            if len(invalid_gga_idx) > 0:
+                error_gga = QtWidgets.QMessageBox()
+                error_gga.setIcon(QtWidgets.QMessageBox.Warning)
+                error_gga.setWindowTitle(self.tr("GGA Error"))
+                error_gga.setText(
+                    self.tr(
+                        f"GGA quality is too low for transects {', '.join(map(str, invalid_gga_idx))}. "
+                        f"\nPlease change settings or selected transects."
+                    )
+                )
+                error_gga.setStandardButtons(QtWidgets.QMessageBox.Ok)
+                error_gga.exec()
+            else:
+                with self.wait_cursor():
+                    old_discharge = self.meas.discharge
+                    # Change NavRef to selected setting
+                    settings["NavRef"] = "GGA"
+                    # Update measurement and GUI
+                    Measurement.apply_settings(self.meas, settings)
+                    self.update_toolbar_nav_ref()
+                    self.change = True
+                    self.tab_manager(old_discharge=old_discharge)
+
+    def set_ref_vtg(self):
+        """Changes the navigation reference to GPS VTG"""
+
+        if self.meas is not None:
+            with self.wait_cursor():
+                # Get all current settings
+                settings = Measurement.current_settings(self.meas)
+                old_discharge = self.meas.discharge
+                # Set NavRef to selected setting
+                settings["NavRef"] = "VTG"
+                # Update measurement and GUI
+                Measurement.apply_settings(self.meas, settings)
+                self.update_toolbar_nav_ref()
+                self.change = True
+                self.tab_manager(old_discharge=old_discharge)
+
+    def comp_tracks_on(self):
+        """Change composite tracks setting to On and update measurement and
+        display.
+        """
+
+        with self.wait_cursor():
+            composite = True
+            # Check to see if discharge is being corrected by a moving bed
+            # test, if so composite tracks will not be used
+            if len(self.meas.mb_tests) > 0:
+                for test in self.meas.mb_tests:
+                    if test.selected:
+                        if (
+                            test.moving_bed == "Yes"
+                            and self.meas.transects[
+                                self.checked_transects_idx[0]
+                            ].w_vel.nav_ref
+                            == "BT"
+                        ):
+                            QtWidgets.QMessageBox.about(
+                                self,
+                                "Composite Tracks " "Message",
+                                "A moving-bed "
+                                "condition exists "
+                                "and BT is the "
+                                "current reference,"
+                                "composite tracks "
+                                "cannot be used in "
+                                "this situation.",
+                            )
+                            composite = False
+            if composite:
+                # Get all current settings
+                settings = Measurement.current_settings(self.meas)
+                old_discharge = self.meas.discharge
+                # Change CompTracks to selected setting
+                settings["CompTracks"] = "On"
+                # Update measurement and GUI
+                Measurement.apply_settings(self.meas, settings)
+                self.update_toolbar_composite_tracks()
+                self.change = True
+                self.tab_manager(old_discharge=old_discharge)
+
+    def comp_tracks_off(self):
+        """Change composite tracks setting to Off and update measurement and
+        display.
+        """
+
+        with self.wait_cursor():
+            # Get all current settings
+            settings = Measurement.current_settings(self.meas)
+            # Change CompTracks to selected setting
+            settings["CompTracks"] = "Off"
+            old_discharge = self.meas.discharge
+            # Update measurement and GUI
+            Measurement.apply_settings(self.meas, settings)
+            self.update_toolbar_composite_tracks()
+            self.change = True
+            self.tab_manager(old_discharge=old_discharge)
+
+    def qrev_options(self):
+        """Change options triggered by actionOptions"""
+
+        # Initialize options dialog
+        options = Options()
+
+        # Set dialog to current settings
+        if not self.agency_options["Units"]["show"]:
+            options.gb_units.hide()
+        if self.units["ID"] == "SI":
+            options.rb_si.setChecked(True)
+        else:
+            options.rb_english.setChecked(True)
+
+        if self.save_all:
+            options.rb_All.setChecked(True)
+        else:
+            options.rb_checked.setChecked(True)
+
+        if not self.agency_options["SaveStyleSheet"]["show"]:
+            options.cb_stylesheet.hide()
+        if self.save_stylesheet:
+            options.cb_stylesheet.setChecked(True)
+        else:
+            options.cb_stylesheet.setChecked(False)
+
+        if not self.agency_options["ExportCrossSection"]["show"]:
+            options.cb_xs_export.hide()
+        if self.xs_export:
+            options.cb_xs_export.setChecked(True)
+        else:
+            options.cb_xs_export.setChecked(True)
+
+        if not self.agency_options["ExtrapWeighting"]["show"]:
+            options.gb_extrap_weighted.hide()
+        if self.use_weighted:
+            options.cb_weighted_extrap.setChecked(True)
+        else:
+            options.cb_weighted_extrap.setChecked(False)
+
+        if not self.agency_options["RatingPrompt"]["show"]:
+            options.cb_rating.hide()
+        if self.rating_prompt:
+            options.cb_rating.setChecked(True)
+        else:
+            options.cb_rating.setChecked(False)
+
+        if not self.agency_options["Uncertainty"]["show"]:
+            options.gb_uncertainty.hide()
+
+        if self.run_oursin:
+            options.rb_oursin_u.setChecked(True)
+        else:
+            options.rb_qrev_u.setChecked(True)
+
+        if self.meas is not None:
+            self.use_measurement_thresholds = self.meas.transects[
+                self.meas.checked_transect_idx[0]
+            ].boat_vel.bt_vel.use_measurement_thresholds
+
+        if not self.agency_options["FilterUsingMeasurement"]["show"]:
+            options.gb_filters.hide()
+        if self.use_measurement_thresholds:
+            options.rb_filter_meas.setChecked(True)
+        else:
+            options.rb_filter_transect.setChecked(True)
+
+        if not self.agency_options["ColorMap"]["show"]:
+            options.gb_color_map.hide()
+        if self.color_map == "viridis":
+            options.rb_viridis.setChecked(True)
+        else:
+            options.rb_jet.setChecked(True)
+
+        if self.x_axis_type == "E":
+            options.rb_opt_ensembles.setChecked(True)
+        elif self.x_axis_type == "L":
+            options.rb_opt_length.setChecked(True)
+        elif self.x_axis_type == "T":
+            options.rb_opt_time.setChecked(True)
+
+        if not self.agency_options["MovingBedObservation"]["show"]:
+            options.gb_moving_bed_option.hide()
+        if self.allow_observed_no_moving_bed:
+            options.cb_allow_manual_no_mb.setChecked(True)
+        else:
+            options.cb_allow_manual_no_mb.setChecked(False)
+
+        if self.xs_export:
+            options.cb_xs_export.setChecked(True)
+        else:
+            options.cb_xs_export.setChecked(False)
+
+        # Execute the options window
+        rsp = options.exec_()
+        old_discharge = None
+
+        with self.wait_cursor():
+            # Apply settings from options window
+            if rsp == QtWidgets.QDialog.Accepted:
+                self.change = False
+                # Units options
+                if options.rb_english.isChecked():
+                    if self.units["ID"] == "SI":
+                        self.units = units_conversion(units_id="English")
+                        self.sticky_settings.set("UnitsID", "English")
+                        if self.meas is not None:
+                            self.update_main()
+                            self.change = True
+                else:
+                    if self.units["ID"] == "English":
+                        self.units = units_conversion(units_id="SI")
+                        self.sticky_settings.set("UnitsID", "SI")
+                        if self.meas is not None:
+                            self.update_main()
+                            self.change = True
+
+                # X Axis
+                if options.rb_opt_ensembles.isChecked():
+                    self.x_axis_type = "E"
+                    self.sticky_settings.set("XAxis", "E")
+                    if self.meas is not None:
+                        self.update_main()
+                        self.change = True
+                elif options.rb_opt_length.isChecked():
+                    self.x_axis_type = "L"
+                    self.sticky_settings.set("XAxis", "L")
+                    if self.meas is not None:
+                        self.update_main()
+                        self.change = True
+                elif options.rb_opt_time.isChecked():
+                    self.x_axis_type = "T"
+                    self.sticky_settings.set("XAxis", "T")
+                    if self.meas is not None:
+                        self.update_main()
+                        self.change = True
+                # Color map
+                if options.rb_viridis.isChecked():
+                    if self.color_map != "viridis":
+                        self.color_map = "viridis"
+                        self.sticky_settings.set("ColorMap", "viridis")
+                        if self.meas is not None:
+                            self.update_main()
+                            self.change = True
+                else:
+                    if self.color_map != "jet":
+                        self.color_map = "jet"
+                        self.sticky_settings.set("ColorMap", "jet")
+                        if self.meas is not None:
+                            self.update_main()
+                            self.change = True
+
+                # Save options
+                if options.rb_All.isChecked():
+                    self.save_all = True
+                else:
+                    self.save_all = False
+
+                # Stylesheet option
+                if options.cb_stylesheet.isChecked():
+                    self.save_stylesheet = True
+                    self.sticky_settings.set("StyleSheet", True)
+                else:
+                    self.save_stylesheet = False
+                    self.sticky_settings.set("StyleSheet", False)
+
+                # Prompt for user rating
+                if options.cb_rating.isChecked():
+                    self.rating_prompt = True
+                    self.sticky_settings.set("UserRating", True)
+                else:
+                    self.rating_prompt = False
+                    self.sticky_settings.set("UserRating", False)
+
+                # Use of weighted medians for extrapolation fit
+                if options.cb_weighted_extrap.isChecked():
+                    use_weighted = True
+                else:
+                    use_weighted = False
+
+                # Check for change in extraplation weighting
+                if self.use_weighted != use_weighted:
+                    self.change = True
+                    # If change made with measurement loaded recompute
+                    # measurement
+                    if self.meas is not None:
+                        old_discharge = self.meas.discharge
+                        settings = self.meas.current_settings()
+                        settings["UseWeighted"] = use_weighted
+                        self.meas.apply_settings(settings)
+                        self.sticky_settings.set("UseWeighted", use_weighted)
+                        self.use_weighted = use_weighted
+
+                    # If change made before measurement loaded, set value
+                    else:
+                        self.use_weighted = use_weighted
+                        self.sticky_settings.set("UseWeighted", use_weighted)
+
+                # Filter measurement
+                if options.rb_filter_meas.isChecked():
+                    filter_meas = True
+                else:
+                    filter_meas = False
+
+                # Check for change in filter measurement
+                if self.use_measurement_thresholds != filter_meas:
+                    self.change = True
+                    # If change made with measurement loaded recompute
+                    # measurement
+                    if self.meas is not None:
+                        old_discharge = self.meas.discharge
+                        settings = self.meas.current_settings()
+                        settings["UseMeasurementThresholds"] = filter_meas
+                        self.meas.apply_settings(settings)
+                        self.sticky_settings.set(
+                            "UseMeasurementThresholds", filter_meas
+                        )
+                        self.use_measurement_thresholds = filter_meas
+
+                    # If change made before measurement loaded, set value
+                    else:
+                        self.sticky_settings.set(
+                            "UseMeasurementThresholds", filter_meas
+                        )
+                        self.use_measurement_thresholds = filter_meas
+
+                # Units options
+                if options.rb_oursin_u.isChecked():
+                    use_oursin = True
+                else:
+                    use_oursin = False
+
+                # Check for change in uncertainty model
+                if self.run_oursin != use_oursin:
+                    self.run_oursin = use_oursin
+
+                    try:
+                        self.sticky_settings.set("Oursin", use_oursin)
+                    except KeyError:
+                        self.sticky_settings.new("Oursin", use_oursin)
+
+                    if self.meas is not None:
+                        if self.run_oursin:
+                            # Uncertainty based on Oursin
+                            self.meas.run_oursin = True
+                            self.meas.oursin = Oursin()
+                            self.meas.oursin.compute_oursin(self.meas)
+                            self.tab_all.addTab(self.tab_uncertainty, "Uncertainty")
+                        else:
+                            # Uncertainty based on original QRev
+                            self.tab_all.removeTab(
+                                self.tab_all.indexOf(
+                                    self.tab_all.findChild(
+                                        QtWidgets.QWidget, "tab_uncertainty"
+                                    )
+                                )
+                            )
+                            self.meas.run_oursin = False
+                            self.meas.oursin = None
+
+                        # Change display of uncertainty on main tab depending
+                        # on selection
+                        self.update_main_uncertainty()
+
+                    # If change made before measurement loaded, set value
+                    else:
+                        self.sticky_settings.set("Oursin", use_oursin)
+                        self.run_oursin = use_oursin
+
+                self.manual_computational_settings = {
+                    "run_oursin": self.run_oursin,
+                    "use_measurement_thresholds": self.use_measurement_thresholds,
+                    "use_weighted": self.use_weighted,
+                }
+                # Allow observed no moving-bed
+                if options.cb_allow_manual_no_mb.isChecked():
+                    self.allow_observed_no_moving_bed = True
+                    try:
+                        self.sticky_settings.set("AllowNoMB", True)
+                    except KeyError:
+                        self.sticky_settings.new("AllowNoMB", True)
+                else:
+                    self.allow_observed_no_moving_bed = False
+                    try:
+                        self.sticky_settings.set("AllowNoMB", False)
+                    except KeyError:
+                        self.sticky_settings.new("AllowNoMB", False)
+
+                # Export mean XS
+                if options.cb_xs_export.isChecked():
+                    self.xs_export = True
+                    if self.meas is not None:
+                        self.meas.export_xs = True
+                    try:
+                        self.sticky_settings.set("XsExport", True)
+                    except KeyError:
+                        self.sticky_settings.new("XsExport", True)
+                else:
+                    self.xs_export = False
+                    if self.meas is not None:
+                        self.meas.export_xs = False
+                    try:
+                        self.sticky_settings.set("XsExport", False)
+                    except KeyError:
+                        self.sticky_settings.new("XsExport", False)
+
+                # Update tabs
+                if self.meas is not None:
+                    if old_discharge is None:
+                        self.tab_manager()
+                    else:
+                        self.tab_manager(old_discharge=old_discharge)
+
+    def plot_google_earth(self):
+        """Creates line plots of transects in Google Earth using GGA
+        coordinates.
+        """
+
+        kml = simplekml.Kml(open=1)
+        # Create a shiptrack for each checked transect
+        for transect_idx in self.checked_transects_idx:
+            lon = self.meas.transects[transect_idx].gps.gga_lon_ens_deg
+            lon = lon[np.logical_not(np.isnan(lon))]
+            lat = self.meas.transects[transect_idx].gps.gga_lat_ens_deg
+            lat = lat[np.logical_not(np.isnan(lat))]
+            line_name = self.meas.transects[transect_idx].file_name[:-4]
+            lon_lat = tuple(zip(lon, lat))
+            _ = kml.newlinestring(name=line_name, coords=lon_lat)
+
+        fullname = os.path.join(
+            self.sticky_settings.get("Folder"),
+            datetime.today().strftime("%Y%m%d_%H%M%S_QRev.kml"),
+        )
+        kml.save(fullname)
+        try:
+            os.startfile(fullname)
+        except os.error:
+            self.popup_message(
+                text="Google Earth is not installed or is not associated "
+                "with kml files."
+            )
+
+    def help(self):
+        """Opens pdf help file user's default pdf viewer."""
+
+        msg = QtWidgets.QMessageBox()
+        msg.setIcon(QtWidgets.QMessageBox.Question)
+        msg.addButton(self.tr("Users Manual"), msg.ActionRole)
+        msg.addButton(self.tr("Technical Manual"), msg.ActionRole)
+        if self.QRev_version[0:5] == "QRev ":
+            msg.addButton(
+                self.tr("Submit Bug or Feature Request \n " "(Internet Required)"),
+                msg.ActionRole,
+            )
+        msg.addButton(self.tr("About"), msg.ActionRole)
+        msg.addButton(self.tr("Cancel"), msg.ActionRole)
+        # msg.setInformativeText('Select option:')
+        msg.setWindowTitle("Help")
+        msg.setWindowIcon(QtGui.QIcon("QRevInt.ico"))
+        msg.exec_()
+
+        help_file = os.path.join(os.getcwd(), "Help")
+        if msg.clickedButton().text() == "Users Manual":
+            help_file = os.path.join(help_file, "QRev_Users.pdf")
+            webbrowser.open("file:///" + help_file, new=2, autoraise=True)
+        elif msg.clickedButton().text() == "Technical Manual":
+            help_file = os.path.join(help_file, "QRev_Tech.pdf")
+            webbrowser.open("file:///" + help_file, new=2, autoraise=True)
+        elif msg.clickedButton().text() == "About":
+            help_file = os.path.join(help_file, "QRev_About.pdf")
+            webbrowser.open("file:///" + help_file, new=2, autoraise=True)
+        elif (
+            msg.clickedButton().text() == "Submit Bug or Feature Request "
+            "\n (Internet Required)"
+        ):
+            webbrowser.open(
+                "https://forms.office.com/Pages/ResponsePage.aspx"
+                "?id=urWTBhhLe02TQfMvQApUlAlv4jGjsJhOstclxasDPuZUO"
+                "E1UWkZIV0JKWVY0NDdHVVlDVkxNNkFKNiQlQCN0PWcu",
+                new=2,
+                autoraise=True,
+            )
+
+    def set_use_weighted(self):
+        """Called by shortcut key cntrl+w toggle between use weighted and
+        unweighted cells for extrapolation.
+        """
+
+        with self.wait_cursor():
+            if self.use_weighted:
+                self.use_weighted = False
+            elif not self.use_weighted:
+                self.use_weighted = True
+
+            # If change made with measurement loaded recompute measurement
+            if self.meas is not None:
+                old_discharge = self.meas.discharge
+                settings = self.meas.current_settings()
+                settings["UseWeighted"] = self.use_weighted
+                self.meas.apply_settings(settings)
+                self.sticky_settings.set("UseWeighted", self.use_weighted)
+                self.change = True
+                self.tab_manager(old_discharge=old_discharge)
+
+    # Main tab
+    # ========
+    def update_main(self):
+        """Update Gui"""
+
+        if len(self.checked_transects_idx) > 0:
+            with self.wait_cursor():
+
+                # If this is the first time this tab is used setup interface
+                # connections
+                if not self.main_initialized:
+                    self.main_table_summary.cellClicked.connect(self.select_transect)
+                    self.main_table_details.cellClicked.connect(self.select_transect)
+                    self.ed_site_name.editingFinished.connect(self.update_site_name)
+                    self.ed_site_number.editingFinished.connect(self.update_site_number)
+                    self.ed_persons.editingFinished.connect(self.update_persons)
+                    self.ed_meas_num.editingFinished.connect(self.update_meas_number)
+                    self.ed_stage_start.editingFinished.connect(self.update_stage_start)
+                    self.ed_stage_end.editingFinished.connect(self.update_stage_end)
+                    self.ed_stage_meas.editingFinished.connect(self.update_stage_meas)
+                    self.table_settings.cellClicked.connect(
+                        self.settings_table_row_adjust
+                    )
+                    self.table_adcp.cellClicked.connect(self.refocus)
+                    self.table_premeas.cellClicked.connect(self.refocus)
+                    self.cb_user_rating.currentIndexChanged.connect(self.rating_change)
+
+                    # Main tab has been initialized
+                    self.main_initialized = True
+
+                # Update the transect select icon on the toolbar
+                self.update_toolbar_trans_select()
+
+                # Set toolbar navigation reference
+                self.update_toolbar_nav_ref()
+
+                # Set toolbar composite tracks indicator
+                self.update_toolbar_composite_tracks()
+
+                # Setup and populate tables
+                self.main_summary_table()
+                self.uncertainty_table()
+                self.qa_table()
+                self.main_details_table()
+                self.main_premeasurement_table()
+                self.main_settings_table()
+                self.main_adcp_table()
+                self.messages_tab()
+                self.comments_tab()
+
+                # Setup and create graphs
+                if len(self.checked_transects_idx) > 0:
+                    self.contour_shiptrack(
+                        self.checked_transects_idx[self.transect_row]
+                    )
+                    self.main_extrap_plot()
+                    self.discharge_plot()
+                    self.main_uncertainty_plot()
+                    self.figs = []
+
+                # If graphics have been created, update them
+                else:
+                    if self.main_extrap_canvas is not None:
+                        self.main_extrap_fig.fig.clear()
+                        self.main_extrap_canvas.draw()
+                    if self.main_wt_contour_canvas is not None:
+                        self.main_wt_contour_fig.fig.clear()
+                        self.main_wt_contour_canvas.draw()
+                    if self.main_discharge_canvas is not None:
+                        self.main_discharge_fig.fig.clear()
+                        self.main_discharge_canvas.draw()
+                    if self.main_shiptrack_canvas is not None:
+                        self.main_shiptrack_fig.fig.clear()
+                        self.main_shiptrack_canvas.draw()
+
+                self.update_main_uncertainty()
+                self.map_tab()
+                self.set_user_rating()
+                self.update_fig_list()
+
+                # Toggles changes indicating the main has been updated
+                self.change = False
+                self.tab_all.setFocus()
+                print("complete")
+        else:
+            # Notify user
+            QtWidgets.QMessageBox.warning(
+                self, "Measurement", "No transects are selected."
+            )
+            self.update_toolbar_trans_select()
+
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+    def update_fig_list(self):
+
+        if self.current_tab == "Main":
+            # Setup list for use by graphics controls
+            if self.run_oursin:
+                self.canvases = [
+                    self.main_shiptrack_canvas,
+                    self.main_wt_contour_canvas,
+                    self.main_extrap_canvas,
+                    self.main_discharge_canvas,
+                    self.uncertainty_lollipop_canvas,
+                ]
+                self.figs = [
+                    self.main_shiptrack_fig,
+                    self.main_wt_contour_fig,
+                    self.main_extrap_fig,
+                    self.main_discharge_fig,
+                    self.uncertainty_lollipop_fig,
+                ]
+                self.fig_calls = [
+                    self.main_shiptrack,
+                    self.main_wt_contour,
+                    self.main_extrap_plot,
+                    self.discharge_plot,
+                    self.main_uncertainty_plot,
+                ]
+                self.toolbars = [
+                    self.main_shiptrack_toolbar,
+                    self.main_wt_contour_toolbar,
+                    self.main_extrap_toolbar,
+                    self.main_discharge_toolbar,
+                    self.uncertainty_lollipop_toolbar,
+                ]
+            else:
+                self.canvases = [
+                    self.main_shiptrack_canvas,
+                    self.main_wt_contour_canvas,
+                    self.main_extrap_canvas,
+                    self.main_discharge_canvas,
+                ]
+                self.figs = [
+                    self.main_shiptrack_fig,
+                    self.main_wt_contour_fig,
+                    self.main_extrap_fig,
+                    self.main_discharge_fig,
+                ]
+                self.fig_calls = [
+                    self.main_shiptrack,
+                    self.main_wt_contour,
+                    self.main_extrap_plot,
+                    self.discharge_plot,
+                ]
+                self.toolbars = [
+                    self.main_shiptrack_toolbar,
+                    self.main_wt_contour_toolbar,
+                    self.main_extrap_toolbar,
+                    self.main_discharge_toolbar,
+                ]
+
+    def refocus(self):
+        self.tab_all.setFocus()
+
+    def update_toolbar_trans_select(self):
+        """Updates the icon for the select transects on the toolbar."""
+
+        if self.meas is not None:
+            if len(self.checked_transects_idx) == len(self.meas.transects):
+                self.actionCheck.setIcon(self.icon_allChecked)
+            elif len(self.checked_transects_idx) > 0:
+                self.actionCheck.setIcon(self.icon_unChecked)
+            else:
+                self.actionCheck.setIcon(self.icon_warning)
+                self.tab_all.setEnabled(False)
+
+    def update_toolbar_composite_tracks(self):
+        """Updates the toolbar to reflect the current setting for composite
+        tracks.
+        """
+
+        # Set toolbar composite tracks indicator fonts
+        font_bold = QtGui.QFont()
+        font_bold.setBold(True)
+        font_bold.setPointSize(11)
+
+        font_normal = QtGui.QFont()
+        font_normal.setBold(False)
+        font_normal.setPointSize(11)
+
+        # Set selection to bold
+        if len(self.checked_transects_idx) > 0:
+            if (
+                self.meas.transects[self.checked_transects_idx[0]].boat_vel.composite
+                == "On"
+            ):
+                self.actionON.setFont(font_bold)
+                self.actionOFF.setFont(font_normal)
+            else:
+                self.actionON.setFont(font_normal)
+                self.actionOFF.setFont(font_bold)
+
+    def update_toolbar_nav_ref(self):
+        """Update the display of the navigation reference on the toolbar."""
+
+        # Get setting
+        if len(self.checked_transects_idx) > 0:
+            selected = self.meas.transects[
+                self.checked_transects_idx[0]
+            ].boat_vel.selected
+
+            # Set toolbar navigation indicator fonts
+            font_bold = QtGui.QFont()
+            font_bold.setBold(True)
+            font_bold.setPointSize(11)
+
+            font_normal = QtGui.QFont()
+            font_normal.setBold(False)
+            font_normal.setPointSize(11)
+
+            # Bold the selected reference only
+            if selected == "bt_vel":
+                self.actionBT.setFont(font_bold)
+                self.actionGGA.setFont(font_normal)
+                self.actionVTG.setFont(font_normal)
+            elif selected == "gga_vel":
+                self.actionBT.setFont(font_normal)
+                self.actionGGA.setFont(font_bold)
+                self.actionVTG.setFont(font_normal)
+            elif selected == "vtg_vel":
+                self.actionBT.setFont(font_normal)
+                self.actionGGA.setFont(font_normal)
+                self.actionVTG.setFont(font_bold)
+
+    def uncertainty_table(self):
+        """Create and populate uncertainty table."""
+
+        # Setup table
+        tbl = self.table_uncertainty
+        tbl.clear()
+
+        col_header = [self.tr("Uncertainty"), self.tr("Auto"), self.tr("  User  ")]
+        ncols = len(col_header)
+        nrows = 7
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(col_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.itemChanged.connect(self.recompute_uncertainty)
+        tbl.itemChanged.disconnect()
+
+        if self.meas.uncertainty is None:
+            # Add labels and data
+            row = 0
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Random 95%"))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(""))
+
+            row = row + 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Invalid Data 95%")))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(""))
+
+            row = row + 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Edge Q 95%")))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(""))
+
+            row = row + 1
+            tbl.setItem(
+                row, 0, QtWidgets.QTableWidgetItem(self.tr("Extrapolation 95%"))
+            )
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(""))
+
+            row = row + 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Moving-Bed 95%")))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(""))
+
+            row = row + 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Systematic 68%")))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(""))
+
+            row = row + 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Estimated 95%")))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(row, 0).setFont(self.font_bold)
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(row, 1).setFont(self.font_bold)
+            tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(row, 2).setFont(self.font_bold)
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+        else:
+            # Add labels and data
+            row = 0
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Random 95%"))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            if self.meas.uncertainty is None:
+                tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+            else:
+                tbl.setItem(
+                    row,
+                    1,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8.1f}".format(self.meas.uncertainty.cov_95)
+                    ),
+                )
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            if self.meas.uncertainty.cov_95_user is not None:
+                tbl.setItem(
+                    row,
+                    2,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8.1f}".format(self.meas.uncertainty.cov_95_user)
+                    ),
+                )
+
+            row = row + 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Invalid Data 95%")))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.1f}".format(self.meas.uncertainty.invalid_95)
+                ),
+            )
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            if self.meas.uncertainty.cov_95_user is not None:
+                tbl.setItem(
+                    row,
+                    2,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8.1f}".format(self.meas.uncertainty.invalid_95_user)
+                    ),
+                )
+
+            row = row + 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Edge Q 95%")))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.1f}".format(self.meas.uncertainty.edges_95)
+                ),
+            )
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            if self.meas.uncertainty.cov_95_user is not None:
+                tbl.setItem(
+                    row,
+                    2,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8.1f}".format(self.meas.uncertainty.edges_95_user)
+                    ),
+                )
+
+            row = row + 1
+            tbl.setItem(
+                row, 0, QtWidgets.QTableWidgetItem(self.tr("Extrapolation 95%"))
+            )
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.1f}".format(self.meas.uncertainty.extrapolation_95)
+                ),
+            )
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            if self.meas.uncertainty.cov_95_user is not None:
+                tbl.setItem(
+                    row,
+                    2,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8.1f}".format(self.meas.uncertainty.extrapolation_95_user)
+                    ),
+                )
+
+            row = row + 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Moving-Bed 95%")))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.1f}".format(self.meas.uncertainty.moving_bed_95)
+                ),
+            )
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            if self.meas.uncertainty.cov_95_user is not None:
+                tbl.setItem(
+                    row,
+                    2,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8.1f}".format(self.meas.uncertainty.moving_bed_95_user)
+                    ),
+                )
+
+            row = row + 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Systematic 68%")))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.1f}".format(self.meas.uncertainty.systematic)
+                ),
+            )
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            if self.meas.uncertainty.cov_95_user is not None:
+                tbl.setItem(
+                    row,
+                    2,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8.1f}".format(self.meas.uncertainty.systematic_user)
+                    ),
+                )
+
+            row = row + 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Estimated 95%")))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(row, 0).setFont(self.font_bold)
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.1f}".format(self.meas.uncertainty.total_95)
+                ),
+            )
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(row, 1).setFont(self.font_bold)
+            tbl.setItem(
+                row,
+                2,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.1f}".format(self.meas.uncertainty.total_95_user)
+                ),
+            )
+            tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(row, 2).setFont(self.font_bold)
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+
+        tbl.itemChanged.connect(self.recompute_uncertainty)
+
+    def recompute_uncertainty(self):
+        """Recomputes the uncertainty based on user input."""
+
+        # Get edited value from table
+        with self.wait_cursor():
+            new_value = self.table_uncertainty.selectedItems()[0].text()
+            if new_value == "":
+                new_value = None
+            else:
+                new_value = float(new_value)
+
+            # Identify uncertainty variable that was edited.
+            row_index = self.table_uncertainty.selectedItems()[0].row()
+            if row_index == 0:
+                self.meas.uncertainty.cov_95_user = new_value
+            elif row_index == 1:
+                self.meas.uncertainty.invalid_95_user = new_value
+            elif row_index == 2:
+                self.meas.uncertainty.edges_95_user = new_value
+            elif row_index == 3:
+                self.meas.uncertainty.extrapolation_95_user = new_value
+            elif row_index == 4:
+                self.meas.uncertainty.moving_bed_95_user = new_value
+            elif row_index == 5:
+                self.meas.uncertainty.systematic_user = new_value
+
+            # Compute new uncertainty values
+            self.meas.uncertainty.estimate_total_uncertainty()
+
+            # Update table
+            if new_value is not None:
+                self.table_uncertainty.item(row_index, 2).setText(
+                    "{:8.1f}".format(new_value)
+                )
+            self.table_uncertainty.item(6, 2).setText(
+                "{:8.1f}".format(self.meas.uncertainty.total_95_user)
+            )
+
+    def rating_change(self):
+        """Stores the user selected rating."""
+
+        self.meas.user_rating = self.cb_user_rating.currentText()
+
+    def set_user_rating(self):
+        """Sets the user rating from stored data."""
+
+        rating = {
+            "Excellent": self.tr("Excellent (<3%)"),
+            "Good": self.tr("Good (3-5%)"),
+            "Fair": self.tr("Fair (5-8%)"),
+            "Poor": self.tr("Poor (>8%)"),
+            "Not Rated": self.tr("Not Rated"),
+            "": self.tr("Not Rated"),
+            "Not ": self.tr("Not Rated"),
+            "Exce": self.tr("Excellent (<3%)"),
+        }
+        if type(self.meas.user_rating) is np.ndarray:
+            if len(self.meas.user_rating) > 0:
+                item = rating[self.meas.user_rating[0:4]]
+            else:
+                item = self.tr("Not Rated")
+        else:
+            item = rating[self.meas.user_rating.split("(")[0].strip()]
+        self.cb_user_rating.setCurrentText(item)
+
+    def qa_table(self):
+        """Create and populate quality assurance table."""
+
+        # Setup table
+        tbl = self.table_qa
+        header = ["", self.tr("COV %"), "", self.tr("% Q")]
+        ncols = len(header)
+        nrows = 3
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        # Compute measurement properties
+        trans_prop = self.meas.compute_measurement_properties(self.meas)
+        discharge = self.meas.mean_discharges(self.meas)
+
+        # Populate table
+        row = 0
+
+        # Discharge COV
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Q:")))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.item(row, 0).setFont(self.font_bold)
+        if self.meas.uncertainty is None or np.isnan(self.meas.uncertainty.cov):
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem("N/A"))
+        else:
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem("{:5.2f}".format(self.meas.uncertainty.cov)),
+            )
+        tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        # Left and right edge % Q
+        tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(self.tr("L/R Edge:")))
+        tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.item(row, 2).setFont(self.font_bold)
+        left = (discharge["left_mean"] / discharge["total_mean"]) * 100
+        right = (discharge["right_mean"] / discharge["total_mean"]) * 100
+        if np.isnan(left) or np.isnan(right):
+            tbl.setItem(row, 3, QtWidgets.QTableWidgetItem("N/A"))
+        else:
+            tbl.setItem(
+                row,
+                3,
+                QtWidgets.QTableWidgetItem("{:5.2f} / {:5.2f}".format(left, right)),
+            )
+        tbl.item(row, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        row = row + 1
+        # Width COV
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Width:")))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.item(row, 0).setFont(self.font_bold)
+        if np.isnan(trans_prop["width_cov"][-1]):
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem("N/A"))
+        else:
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(trans_prop["width_cov"][-1])
+                ),
+            )
+        tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        # Invalid cells
+        tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(self.tr("Invalid Cells:")))
+        tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.item(row, 2).setFont(self.font_bold)
+        value = (discharge["int_cells_mean"] / discharge["total_mean"]) * 100
+        if np.isnan(value):
+            tbl.setItem(row, 3, QtWidgets.QTableWidgetItem("N/A"))
+        else:
+            tbl.setItem(row, 3, QtWidgets.QTableWidgetItem("{:5.2f}".format(value)))
+        tbl.item(row, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        row = row + 1
+        # Area COV
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(self.tr("Area:")))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.item(row, 0).setFont(self.font_bold)
+        if np.isnan(trans_prop["area_cov"][-1]):
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem("N/A"))
+        else:
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(trans_prop["area_cov"][-1])
+                ),
+            )
+        tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        # Invalid ensembles
+        tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(self.tr("Invalid Ens:")))
+        tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.item(row, 2).setFont(self.font_bold)
+        value = (discharge["int_ensembles_mean"] / discharge["total_mean"]) * 100
+        if np.isnan(value):
+            tbl.setItem(row, 3, QtWidgets.QTableWidgetItem("N/A"))
+        else:
+            tbl.setItem(row, 3, QtWidgets.QTableWidgetItem("{:5.2f}".format(value)))
+        tbl.item(row, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+    def select_transect(self, row, column):
+        """Update contour and shiptrack plots based on transect selected in
+        main_summary_table.
+
+        Parameters
+        ----------
+        row: int
+            Row number selected.
+        column: int
+            Column number selected.
+        """
+
+        # Transect column was selected
+        if column == 0 and row > 0:
+            with self.wait_cursor():
+
+                # Set all files to normal font
+                nrows = len(self.checked_transects_idx)
+                for nrow in range(1, nrows + 1):
+                    self.main_table_summary.item(nrow, 0).setFont(self.font_normal)
+                    self.main_table_details.item(nrow, 0).setFont(self.font_normal)
+                    self.table_settings.item(nrow + 2, 0).setFont(self.font_normal)
+
+                # Set selected file to bold font
+                self.main_table_summary.item(row, 0).setFont(self.font_bold)
+                self.main_table_details.item(row, 0).setFont(self.font_bold)
+                self.table_settings.item(row + 2, 0).setFont(self.font_bold)
+                self.transect_row = row - 1
+
+                # Determine transect selected
+                transect_id = self.checked_transects_idx[row - 1]
+                self.clear_zphd()
+
+                # Update contour and shiptrack plot
+                self.contour_shiptrack(transect_id=transect_id)
+                self.discharge_plot()
+
+        self.tab_all.setFocus()
+
+    def contour_shiptrack(self, transect_id=0):
+        """Generates the color contour and shiptrack plot for the main tab.
+
+        Parameters
+        ----------
+        transect_id: int
+            Index to check transects to identify the transect to be plotted
+        """
+
+        # Get transect data to be plotted
+        transect = self.meas.transects[transect_id]
+
+        # Generate graphs
+        self.main_shiptrack(transect=transect)
+        self.main_wt_contour(transect_id=transect_id)
+
+    def main_shiptrack(self, transect):
+        """Creates shiptrack plot for data in transect.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData
+        """
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.main_shiptrack_canvas is None:
+            # Create the canvas
+            self.main_shiptrack_canvas = MplCanvas(
+                parent=self.graphics_shiptrack, width=4, height=3, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graphics_shiptrack)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.main_shiptrack_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.main_shiptrack_toolbar = NavigationToolbar(
+                self.main_shiptrack_canvas, self
+            )
+            self.main_shiptrack_toolbar.hide()
+
+        # Initialize the shiptrack figure and assign to the canvas
+        self.main_shiptrack_fig = Shiptrack(canvas=self.main_shiptrack_canvas)
+        # Create the figure with the specified data
+        self.main_shiptrack_fig.create(transect=transect, units=self.units, cb=False)
+        # Draw canvas
+        self.main_shiptrack_canvas.draw()
+
+    def main_wt_contour(self, transect_id):
+        """Creates boat speed plot for data in transect.
+
+        Parameters
+        ----------
+        transect_id: int
+            Index of selected transect
+        """
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.main_wt_contour_canvas is None:
+            # Create the canvas
+            self.main_wt_contour_canvas = MplCanvas(
+                parent=self.graphics_wt_contour, width=12, height=2, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graphics_wt_contour)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.main_wt_contour_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.main_wt_contour_toolbar = NavigationToolbar(
+                self.main_wt_contour_canvas, self
+            )
+            self.main_wt_contour_toolbar.hide()
+
+        # Initialize the boat speed figure and assign to the canvas
+        self.main_wt_contour_fig = AdvGraphs(canvas=self.main_wt_contour_canvas)
+        # Create the figure with the specified data
+        if self.plot_extrapolated:
+            self.main_wt_contour_fig.create_main_contour(
+                transect=self.meas.transects[transect_id],
+                units=self.units,
+                color_map=self.color_map,
+                x_axis_type=self.x_axis_type,
+                discharge=self.meas.discharge[transect_id],
+            )
+        else:
+            self.main_wt_contour_fig.create_main_contour(
+                transect=self.meas.transects[transect_id],
+                units=self.units,
+                color_map=self.color_map,
+                x_axis_type=self.x_axis_type,
+            )
+        self.main_wt_contour_fig.fig.subplots_adjust(
+            left=0.05, bottom=0.2, right=0.92, top=0.97, wspace=0.02, hspace=0
+        )
+        # self.figs = [self.main_wt_contour_fig]
+        # self.fig_calls = [self.main_wt_contour]
+        # Draw canvas
+        self.main_wt_contour_canvas.draw()
+        self.update_fig_list()
+
+    def main_extrap_plot(self):
+        """Creates extrapolation plot."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.main_extrap_canvas is None:
+            # Create the canvas
+            self.main_extrap_canvas = MplCanvas(
+                parent=self.graphics_main_extrap, width=1, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graphics_main_extrap)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.main_extrap_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.main_extrap_toolbar = NavigationToolbar(self.main_extrap_canvas, self)
+            self.main_extrap_toolbar.hide()
+
+        # Initialize the figure and assign to the canvas
+        self.main_extrap_fig = ExtrapPlot(canvas=self.main_extrap_canvas)
+        # Create the figure with the specified data
+        self.main_extrap_fig.create(
+            meas=self.meas, checked=self.checked_transects_idx, auto=True
+        )
+
+        self.main_extrap_canvas.draw()
+
+    def main_uncertainty_plot(self):
+        """Creates a lollipop plot for the Oursin uncertainty model."""
+
+        # If the canvas has not been previously created, create the canvas and
+        # add the widget.
+        if self.uncertainty_lollipop_canvas is None:
+            # Create the canvas
+            self.uncertainty_lollipop_canvas = MplCanvas(
+                parent=self.uncertainty_lollipop, width=1, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.uncertainty_lollipop)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.uncertainty_lollipop_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.uncertainty_lollipop_toolbar = NavigationToolbar(
+                self.uncertainty_lollipop_canvas, self
+            )
+            self.uncertainty_lollipop_toolbar.hide()
+
+        # Initialize the figure and assign to the canvas
+        self.uncertainty_lollipop_fig = ULollipopPlot(
+            canvas=self.uncertainty_lollipop_canvas
+        )
+        # Create the figure with the specified data
+        self.uncertainty_lollipop_fig.create(meas=self.meas)
+
+        self.uncertainty_lollipop_canvas.draw()
+
+    def update_main_uncertainty(self):
+        """Updates the main tab to show the appropriate display based on the
+        uncertainty model selected.
+        """
+
+        if self.run_oursin:
+            self.main_uncertainty_plot()
+            self.uncertainty_lollipop.show()
+            self.table_uncertainty.hide()
+            self.verticalLayout_right.setStretch(1, 45)
+            self.verticalLayout_right.setStretch(2, 0)
+
+        else:
+            self.uncertainty_lollipop.hide()
+            self.table_uncertainty.show()
+            self.verticalLayout_right.setStretch(1, 0)
+            self.verticalLayout_right.setStretch(2, 45)
+
+    def discharge_plot(self):
+        """Generates discharge time series plot for the main tab."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.main_discharge_canvas is None:
+            # Create the canvas
+            self.main_discharge_canvas = MplCanvas(
+                parent=self.graphics_main_timeseries, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graphics_main_timeseries)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.main_discharge_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.main_discharge_toolbar = NavigationToolbar(
+                self.main_discharge_canvas, self
+            )
+            self.main_discharge_toolbar.hide()
+
+        # Initialize the figure and assign to the canvas
+        self.main_discharge_fig = DischargeTS(canvas=self.main_discharge_canvas)
+        # Create the figure with the specified data
+        self.main_discharge_fig.create(
+            meas=self.meas,
+            checked=self.checked_transects_idx,
+            transect_idx=self.transect_row,
+            units=self.units,
+        )
+        self.main_discharge_canvas.draw()
+
+    def messages_tab(self):
+        """Update messages tab."""
+
+        # Initialize local variables
+        qa = self.meas.qa
+        tbl = self.main_message_table
+        tbl.clear()
+        qa_check_keys = [
+            "bt_vel",
+            "compass",
+            "depths",
+            "edges",
+            "extrapolation",
+            "gga_vel",
+            "movingbed",
+            "system_tst",
+            "temperature",
+            "transects",
+            "user",
+            "vtg_vel",
+            "w_vel",
+        ]
+
+        # For each qa check retrieve messages and set tab icon based on the
+        # status
+        messages = []
+        for key in qa_check_keys:
+            qa_type = getattr(qa, key)
+            if qa_type["messages"]:
+                for message in qa_type["messages"]:
+                    if type(message) is str:
+                        if message[:3].isupper():
+                            messages.append([message, 1])
+                        else:
+                            messages.append([message, 2])
+                    else:
+                        if type(message[1]) is str:
+                            message[1] = int(message[1])
+                        messages.append(message)
+            self.set_icon(key, qa_type["status"])
+
+        # Sort messages with warning at top
+        messages.sort(key=lambda x: x[1])
+
+        # Setup table
+        tbl = self.main_message_table
+        main_message_header = [self.tr("Status"), self.tr("Message")]
+        ncols = len(main_message_header)
+        nrows = len(messages)
+        tbl.setRowCount(nrows + 1)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(main_message_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        # Populate table
+        for row, message in enumerate(messages):
+            # Handle messages from old QRev that did not have integer codes
+            if type(message) is str:
+                warn = message[:3].isupper()
+                tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(message))
+            # Handle newer style messages
+            else:
+                warn = int(message[1]) == 1
+                tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(message[0]))
+            if warn:
+                tbl.item(row, 1).setFont(self.font_bold)
+                item_warning = QtWidgets.QTableWidgetItem(self.icon_warning, "")
+                tbl.setItem(row, 0, item_warning)
+            else:
+                item_caution = QtWidgets.QTableWidgetItem(self.icon_caution, "")
+                tbl.setItem(row, 0, item_caution)
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+    def update_tab_icons(self):
+        """Update tab icons base on results of QA analysis."""
+
+        qa = self.meas.qa
+        qa_check_keys = [
+            "bt_vel",
+            "compass",
+            "depths",
+            "edges",
+            "extrapolation",
+            "gga_vel",
+            "movingbed",
+            "system_tst",
+            "temperature",
+            "transects",
+            "user",
+            "vtg_vel",
+            "w_vel",
+        ]
+        for key in qa_check_keys:
+            qa_type = getattr(qa, key)
+            self.set_icon(key, qa_type["status"])
+            self.set_tab_color()
+
+        gga = getattr(qa, "gga_vel")
+        vtg = getattr(qa, "vtg_vel")
+        if gga["lag_status"] == "caution" or vtg["lag_status"] == "caution":
+            self.set_icon("gps_bt", "caution")
+            self.set_tab_color()
+        if gga["lag_status"] == "warning" or vtg["lag_status"] == "warning":
+            self.set_icon("gps_bt", "warning")
+            self.set_tab_color()
+
+    def set_icon(self, key, status):
+        """Set tab icon based on qa check status.
+
+        Parameters
+        ----------
+        key: str
+            Identifies target tab
+        status: str
+            Quality status for data in that tab
+        """
+
+        tab_base = self.tab_all
+        tab = ""
+        # Identify tab name based on key
+        if key == "bt_vel":
+            tab = "tab_bt"
+        elif key == "compass":
+            tab = "tab_compass"
+        elif key == "depths":
+            tab = "tab_depth"
+        elif key == "edges":
+            tab = "tab_edges"
+        elif key == "extrapolation":
+            tab = "tab_extrap"
+        elif key == "gga_vel" or key == "vtg_vel":
+            gga_status = self.meas.qa.gga_vel["status"]
+            vtg_status = self.meas.qa.vtg_vel["status"]
+            status = "good"
+            if gga_status == "caution" or vtg_status == "caution":
+                status = "caution"
+            elif gga_status == "inactive" and vtg_status == "inactive":
+                status = "inactive"
+            elif gga_status == "warning" or vtg_status == "warning":
+                status = "warning"
+            elif gga_status == "default" or vtg_status == "default":
+                status = "default"
+            tab = "tab_gps"
+        elif key == "movingbed":
+            tab = "tab_mbt"
+        elif key == "system_tst":
+            tab = "tab_systest"
+        elif key == "temperature":
+            tab = "tab_tempsal"
+        elif key == "transects":  # or key == 'user':
+            tab = "tab_main"
+            transects_status = self.meas.qa.transects["status"]
+            user_status = self.meas.qa.user["status"]
+            status = "good"
+            if transects_status == "caution" or user_status == "caution":
+                status = "caution"
+            if transects_status == "warning" or user_status == "warning":
+                status = "warning"
+        elif key == "w_vel":
+            tab = "tab_wt"
+        elif key == "user":
+            tab = "tab_summary_premeasurement"
+            tab_base = self.tab_summary
+        elif key == "gps_bt":
+            tab_base = self.tab_gps_2
+            tab = "tab_gps_2_gpsbt"
+
+        self.set_tab_icon(tab, status, tab_base=tab_base)
+
+    def set_tab_icon(self, tab, status, tab_base=None):
+        """Sets the text color and icon for the tab based on the quality
+        status.
+
+            Parameters
+            ----------
+            tab: str
+                Tab identifier
+            status: str
+                Quality status
+            tab_base: object
+                Object of tab interface
+        """
+
+        if tab_base is None:
+            tab_base = self.tab_all
+
+        tab_base.tabBar().setTabTextColor(
+            tab_base.indexOf(tab_base.findChild(QtWidgets.QWidget, tab)),
+            QtGui.QColor(140, 140, 140),
+        )
+        tab_base.setTabIcon(
+            tab_base.indexOf(tab_base.findChild(QtWidgets.QWidget, tab)), QtGui.QIcon()
+        )
+        # Set appropriate icon
+        if status == "good":
+            tab_base.setTabIcon(
+                tab_base.indexOf(tab_base.findChild(QtWidgets.QWidget, tab)),
+                self.icon_good,
+            )
+            tab_base.tabBar().setTabTextColor(
+                tab_base.indexOf(tab_base.findChild(QtWidgets.QWidget, tab)),
+                QtGui.QColor(0, 153, 0),
+            )
+        elif status == "caution":
+            tab_base.setTabIcon(
+                tab_base.indexOf(tab_base.findChild(QtWidgets.QWidget, tab)),
+                self.icon_caution,
+            )
+            tab_base.tabBar().setTabTextColor(
+                tab_base.indexOf(tab_base.findChild(QtWidgets.QWidget, tab)),
+                QtGui.QColor(230, 138, 0),
+            )
+        elif status == "warning":
+            tab_base.setTabIcon(
+                tab_base.indexOf(tab_base.findChild(QtWidgets.QWidget, tab)),
+                self.icon_warning,
+            )
+            tab_base.tabBar().setTabTextColor(
+                tab_base.indexOf(tab_base.findChild(QtWidgets.QWidget, tab)),
+                QtGui.QColor(255, 77, 77),
+            )
+        tab_base.setIconSize(QtCore.QSize(15, 15))
+
+    def set_tab_color(self):
+        """Updates tab font to Blue if a setting was changed from the
+        default settings."""
+
+        if self.meas.qa is not None:
+            for tab in self.meas.qa.settings_dict:
+
+                if tab != "tab_gps":
+
+                    if self.meas.qa.settings_dict[tab] == "Custom":
+
+                        self.tab_all.tabBar().setTabTextColor(
+                            self.tab_all.indexOf(
+                                self.tab_all.findChild(QtWidgets.QWidget, tab)
+                            ),
+                            QtGui.QColor(0, 0, 255),
+                        )
+                        if tab == "tab_uncertainty_2_advanced":
+                            self.tab_uncertainty_2.tabBar().setTabTextColor(
+                                self.tab_uncertainty_2.indexOf(
+                                    self.tab_uncertainty_2.findChild(
+                                        QtWidgets.QWidget, tab
+                                    )
+                                ),
+                                QtGui.QColor(0, 0, 255),
+                            )
+
+                    elif tab == "tab_uncertainty":
+                        self.tab_all.tabBar().setTabTextColor(
+                            self.tab_all.indexOf(
+                                self.tab_all.findChild(QtWidgets.QWidget, tab)
+                            ),
+                            QtGui.QColor(0, 0, 0),
+                        )
+
+                    elif tab == "tab_uncertainty_2_advanced":
+                        self.tab_uncertainty_2.tabBar().setTabTextColor(
+                            self.tab_uncertainty_2.indexOf(
+                                self.tab_uncertainty_2.findChild(QtWidgets.QWidget, tab)
+                            ),
+                            QtGui.QColor(0, 0, 0),
+                        )
+
+                else:
+                    if self.tab_all.isTabEnabled(6) is True:
+                        if self.meas.qa.settings_dict[tab] == "Custom":
+
+                            self.tab_all.tabBar().setTabTextColor(
+                                self.tab_all.indexOf(
+                                    self.tab_all.findChild(QtWidgets.QWidget, tab)
+                                ),
+                                QtGui.QColor(0, 0, 255),
+                            )
+
+    def comments_tab(self):
+        """Display comments in comments tab."""
+
+        self.display_comments.clear()
+        if self.meas is not None:
+            self.display_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                # Display each comment on a new line
+                self.display_comments.textCursor().insertText(comment)
+                self.display_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_comments.textCursor().insertBlock()
+
+    # Main summary tabs
+    # =================
+    def main_summary_table(self):
+        """Create and populate main summary table."""
+
+        # Setup table
+        tbl = self.main_table_summary
+        summary_header = [
+            self.tr("Transect"),
+            self.tr("Start"),
+            self.tr("Bank"),
+            self.tr("End"),
+            self.tr("Duration") + " " + self.tr("(sec)"),
+            self.tr("Total Q") + " " + self.tr(self.units["label_Q"]),
+            self.tr("Top Q") + " " + self.tr(self.units["label_Q"]),
+            self.tr("Meas Q") + " " + self.tr(self.units["label_Q"]),
+            self.tr("Bottom Q") + " " + self.tr(self.units["label_Q"]),
+            self.tr("Left Q") + " " + self.tr(self.units["label_Q"]),
+            self.tr("Right Q") + " " + self.tr(self.units["label_Q"]),
+            self.tr("Delta Q (%)"),
+        ]
+        ncols = len(summary_header)
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows + 1)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(summary_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        if len(self.checked_transects_idx) > 0:
+            # Add transect data
+            for row in range(nrows):
+                col = 0
+                transect_id = self.checked_transects_idx[row]
+
+                # File/transect name
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].file_name[:-4]
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect start time
+                col += 1
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        datetime.strftime(
+                            datetime.utcfromtimestamp(
+                                self.meas.transects[
+                                    transect_id
+                                ].date_time.start_serial_time
+                            ),
+                            "%H:%M:%S",
+                        )
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect start edge
+                col += 1
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].start_edge[0]
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect end time
+                col += 1
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        datetime.strftime(
+                            datetime.utcfromtimestamp(
+                                self.meas.transects[
+                                    transect_id
+                                ].date_time.end_serial_time
+                            ),
+                            "%H:%M:%S",
+                        )
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect duration
+                col += 1
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.1f}".format(
+                            self.meas.transects[
+                                transect_id
+                            ].date_time.transect_duration_sec
+                        )
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect total discharge
+                col += 1
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                self.meas.discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect top discharge
+                col += 1
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:7}".format(
+                            self.q_digits(
+                                self.meas.discharge[transect_id].top * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect middle discharge
+                col += 1
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:7}".format(
+                            self.q_digits(
+                                self.meas.discharge[transect_id].middle
+                                * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect bottom discharge
+                col += 1
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:7}".format(
+                            self.q_digits(
+                                self.meas.discharge[transect_id].bottom
+                                * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect left discharge
+                col += 1
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:7}".format(
+                            self.q_digits(
+                                self.meas.discharge[transect_id].left * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect right discharge
+                col += 1
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:7}".format(
+                            self.q_digits(
+                                self.meas.discharge[transect_id].right * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent difference from measurement mean
+                discharge = Measurement.mean_discharges(self.meas)
+                per_diff = (
+                    (self.meas.discharge[transect_id].total - discharge["total_mean"])
+                    / discharge["total_mean"]
+                ) * 100
+                col += 1
+                if np.isnan(per_diff):
+                    tbl.setItem(row + 1, col, QtWidgets.QTableWidgetItem("N/A"))
+                else:
+                    tbl.setItem(
+                        row + 1,
+                        col,
+                        QtWidgets.QTableWidgetItem("{:7.3f}".format(per_diff)),
+                    )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Add measurement summaries
+
+            # Row label
+            col = 0
+            mdy = self.meas.transects[
+                self.checked_transects_idx[0]
+            ].date_time.date.split("/")
+            meas_date = mdy[-1] + "." + mdy[0] + "." + mdy[1]
+            item = self.tr("Measurement") + " (" + meas_date + ")"
+            tbl.setItem(0, col, QtWidgets.QTableWidgetItem(item))
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Measurement start time
+            col += 1
+            tbl.setItem(0, col, QtWidgets.QTableWidgetItem(tbl.item(1, col).text()))
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Skip start bank
+            col += 1
+            tbl.setItem(0, col, QtWidgets.QTableWidgetItem(""))
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Measurement end time
+            col += 1
+            tbl.setItem(0, col, QtWidgets.QTableWidgetItem(tbl.item(nrows, col).text()))
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Measurement duration
+            col += 1
+            tbl.setItem(
+                0,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.1f}".format(Measurement.measurement_duration(self.meas))
+                ),
+            )
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Mean total discharge
+            discharge = Measurement.mean_discharges(self.meas)
+            col += 1
+            tbl.setItem(
+                0,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:8}".format(
+                        self.q_digits(discharge["total_mean"] * self.units["Q"])
+                    )
+                ),
+            )
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Mean top discharge
+            col += 1
+            tbl.setItem(
+                0,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7}".format(
+                        self.q_digits(discharge["top_mean"] * self.units["Q"])
+                    )
+                ),
+            )
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Mean middle discharge
+            col += 1
+            tbl.setItem(
+                0,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7}".format(
+                        self.q_digits(discharge["mid_mean"] * self.units["Q"])
+                    )
+                ),
+            )
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Mean bottom discharge
+            col += 1
+            tbl.setItem(
+                0,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7}".format(
+                        self.q_digits(discharge["bot_mean"] * self.units["Q"])
+                    )
+                ),
+            )
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Mean left discharge
+            col += 1
+            tbl.setItem(
+                0,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7}".format(
+                        self.q_digits(discharge["left_mean"] * self.units["Q"])
+                    )
+                ),
+            )
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Mean right discharge
+            col += 1
+            tbl.setItem(
+                0,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7}".format(
+                        self.q_digits(discharge["right_mean"] * self.units["Q"])
+                    )
+                ),
+            )
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Bold Measurement row
+            for col in range(ncols - 1):
+                tbl.item(0, col).setFont(self.font_bold)
+
+            tbl.item(self.transect_row + 1, 0).setFont(self.font_bold)
+            tbl.scrollToItem(tbl.item(self.transect_row + 1, 0))
+
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+        else:
+            tbl.setRowCount(0)
+
+    def main_details_table(self):
+        """Initialize and populate the details table."""
+
+        # Setup table
+        tbl = self.main_table_details
+        summary_header = [
+            self.tr("Transect"),
+            self.tr("Width" + "\n " + self.units["label_L"]),
+            self.tr("Area" + "\n " + self.units["label_A"]),
+            self.tr("Avg Boat \n Speed" + " " + self.units["label_V"]),
+            self.tr("Course Made \n Good" + " (deg)"),
+            self.tr("Q/A" + " " + self.units["label_V"]),
+            self.tr("Avg Water \n Direction" + " (deg)"),
+        ]
+        ncols = len(summary_header)
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows + 1)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(summary_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        if len(self.checked_transects_idx) > 0:
+            trans_prop = Measurement.compute_measurement_properties(self.meas)
+
+            # Add transect data
+            for row in range(nrows):
+                col = 0
+                transect_id = self.checked_transects_idx[row]
+
+                # File/transect name
+                tbl.setItem(
+                    row + 1,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].file_name[:-4]
+                    ),
+                )
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect width
+                col += 1
+                item = "{:10.2f}".format(
+                    trans_prop["width"][transect_id] * self.units["L"]
+                )
+                tbl.setItem(row + 1, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect area
+                col += 1
+                item = "{:10.2f}".format(
+                    trans_prop["area"][transect_id] * self.units["A"]
+                )
+                tbl.setItem(row + 1, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect average boat speed
+                col += 1
+                item = "{:6.2f}".format(
+                    trans_prop["avg_boat_speed"][transect_id] * self.units["V"]
+                )
+                tbl.setItem(row + 1, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect average boat course
+                col += 1
+                item = "{:6.2f}".format(trans_prop["avg_boat_course"][transect_id])
+                tbl.setItem(row + 1, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect average water speed
+                col += 1
+                item = "{:6.2f}".format(
+                    trans_prop["avg_water_speed"][transect_id] * self.units["V"]
+                )
+                tbl.setItem(row + 1, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Transect average water direction
+                col += 1
+                item = "{:6.2f}".format(trans_prop["avg_water_dir"][transect_id])
+                tbl.setItem(row + 1, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row + 1, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Add measurement summaries
+            n_transects = len(self.meas.transects)
+            col = 0
+
+            # Row label
+            tbl.setItem(0, col, QtWidgets.QTableWidgetItem(self.tr("Average")))
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Average width
+            col += 1
+            item = "{:10.2f}".format(trans_prop["width"][n_transects] * self.units["L"])
+            tbl.setItem(0, col, QtWidgets.QTableWidgetItem(item))
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Average area
+            col += 1
+            item = "{:10.2f}".format(trans_prop["area"][n_transects] * self.units["A"])
+            tbl.setItem(0, col, QtWidgets.QTableWidgetItem(item))
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Average boat speed
+            col += 1
+            item = "{:6.2f}".format(
+                trans_prop["avg_boat_speed"][n_transects] * self.units["V"]
+            )
+            tbl.setItem(0, col, QtWidgets.QTableWidgetItem(item))
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Skip average boat course
+            col += 1
+
+            # Average water speed
+            col += 1
+            item = "{:6.2f}".format(
+                trans_prop["avg_water_speed"][n_transects] * self.units["V"]
+            )
+            tbl.setItem(0, col, QtWidgets.QTableWidgetItem(item))
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Average water direction
+            col += 1
+            item = "{:6.2f}".format(trans_prop["avg_water_dir"][n_transects])
+            tbl.setItem(0, col, QtWidgets.QTableWidgetItem(item))
+            tbl.item(0, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Set average row font to bold
+            for col in range(ncols):
+                if col != 4:
+                    tbl.item(0, col).setFont(self.font_bold)
+
+            tbl.item(self.transect_row + 1, 0).setFont(self.font_bold)
+            tbl.scrollToItem(tbl.item(self.transect_row + 1, 0))
+
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+
+    def main_premeasurement_table(self):
+        """Initialize and populate the premeasurement table."""
+
+        # Initialize and connect the station name and number fields
+        font = self.label_site_name.font()
+        font.setPointSize(13)
+        self.label_site_name.setFont(font)
+        self.label_site_number.setFont(font)
+        self.ed_site_name.setText(self.meas.station_name)
+        if self.meas.qa.user["sta_name"]:
+            self.label_site_name.setStyleSheet("background: #ffcc00")
+            self.label_site_name.setStyleSheet("QToolTip{font: 12pt}")
+            self.label_site_name.setToolTip(self.tr("Missing site name."))
+        else:
+            self.label_site_name.setStyleSheet("background: white")
+            self.label_site_name.setToolTip("")
+        try:
+            self.ed_site_number.setText(self.meas.station_number)
+        except TypeError:
+            self.ed_site_number.setText("")
+        if self.meas.qa.user["sta_number"]:
+            self.label_site_number.setStyleSheet("background: #ffcc00")
+            self.label_site_number.setStyleSheet("QToolTip{font: 12pt}")
+            self.label_site_number.setToolTip(self.tr("Missing site name."))
+        else:
+            self.label_site_number.setStyleSheet("background: white")
+            self.label_site_number.setToolTip("")
+
+        self.ed_persons.setText(self.meas.persons)
+        self.ed_meas_num.setText(self.meas.meas_number)
+
+        self.label_stage_start.setText("Stage start " + self.units["label_L"] + ":")
+        self.ed_stage_start.setText(
+            "{:3.4f}".format(self.meas.stage_start_m * self.units["L"])
+        )
+        self.label_stage_end.setText("Stage end " + self.units["label_L"] + ":")
+        self.ed_stage_end.setText(
+            "{:3.4f}".format(self.meas.stage_end_m * self.units["L"])
+        )
+        self.label_stage_meas.setText("Stage meas " + self.units["label_L"] + ":")
+        self.ed_stage_meas.setText(
+            "{:3.4f}".format(self.meas.stage_meas_m * self.units["L"])
+        )
+
+        # Setup table
+        tbl = self.table_premeas
+        ncols = 4
+        nrows = 5
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.horizontalHeader().hide()
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        if len(self.checked_transects_idx) > 0:
+
+            # ADCP Test
+            tbl.setItem(0, 0, QtWidgets.QTableWidgetItem(self.tr("ADCP Test: ")))
+            tbl.item(0, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(0, 0).setFont(self.font_bold)
+            # Determine is a system test was recorded
+            if not self.meas.system_tst:
+                tbl.setItem(0, 1, QtWidgets.QTableWidgetItem(self.tr("No")))
+            else:
+                tbl.setItem(0, 1, QtWidgets.QTableWidgetItem(self.tr("Yes")))
+            tbl.item(0, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Report test fails
+            tbl.setItem(0, 2, QtWidgets.QTableWidgetItem(self.tr("ADCP Test Fails: ")))
+            tbl.item(0, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(0, 2).setFont(self.font_bold)
+            num_tests_with_failure = 0
+            for test in self.meas.system_tst:
+                if hasattr(test, "result"):
+                    if (
+                        test.result["sysTest"]["n_failed"] is not None
+                        and test.result["sysTest"]["n_failed"] > 0
+                    ):
+                        num_tests_with_failure += 1
+            tbl.setItem(
+                0,
+                3,
+                QtWidgets.QTableWidgetItem("{:2.0f}".format(num_tests_with_failure)),
+            )
+            tbl.item(0, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Compass Calibration
+            tbl.setItem(
+                1, 0, QtWidgets.QTableWidgetItem(self.tr("Compass Calibration: "))
+            )
+            tbl.item(1, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(1, 0).setFont(self.font_bold)
+            if len(self.meas.compass_cal) == 0:
+                tbl.setItem(1, 1, QtWidgets.QTableWidgetItem(self.tr("No")))
+            else:
+                tbl.setItem(1, 1, QtWidgets.QTableWidgetItem(self.tr("Yes")))
+            tbl.item(1, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Compass Evaluation
+            tbl.setItem(
+                1, 2, QtWidgets.QTableWidgetItem(self.tr("Compass Evaluation: "))
+            )
+            tbl.item(1, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(1, 2).setFont(self.font_bold)
+            if len(self.meas.compass_eval) == 0:
+                tbl.setItem(1, 3, QtWidgets.QTableWidgetItem(self.tr("No")))
+            else:
+                if self.meas.compass_eval[-1].result["compass"]["error"] != "N/A":
+                    tbl.setItem(
+                        1,
+                        3,
+                        QtWidgets.QTableWidgetItem(
+                            "{:3.1f}".format(
+                                self.meas.compass_eval[-1].result["compass"]["error"]
+                            )
+                        ),
+                    )
+                else:
+                    tbl.setItem(
+                        1,
+                        3,
+                        QtWidgets.QTableWidgetItem(
+                            str(self.meas.compass_eval[-1].result["compass"]["error"])
+                        ),
+                    )
+            tbl.item(1, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Moving-Bed Test
+            tbl.setItem(2, 0, QtWidgets.QTableWidgetItem(self.tr("Moving-Bed Test: ")))
+            tbl.item(2, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(2, 0).setFont(self.font_bold)
+            if len(self.meas.mb_tests) < 1:
+                tbl.setItem(2, 1, QtWidgets.QTableWidgetItem(self.tr("No")))
+            else:
+                tbl.setItem(2, 1, QtWidgets.QTableWidgetItem(self.tr("Yes")))
+            tbl.item(2, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Report if the test indicated a moving bed
+            tbl.setItem(2, 2, QtWidgets.QTableWidgetItem(self.tr("Moving-Bed?: ")))
+            tbl.item(2, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(2, 2).setFont(self.font_bold)
+            if len(self.meas.mb_tests) < 1:
+                tbl.setItem(2, 3, QtWidgets.QTableWidgetItem(self.tr("Unknown")))
+            else:
+                moving_bed = "No"
+                for test in self.meas.mb_tests:
+                    if test.selected:
+                        if test.moving_bed == "Yes":
+                            moving_bed = self.tr("Yes")
+                tbl.setItem(2, 3, QtWidgets.QTableWidgetItem(moving_bed))
+            tbl.item(2, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Independent Temperature
+            tbl.setItem(
+                3,
+                0,
+                QtWidgets.QTableWidgetItem(self.tr("Independent Temperature (C): ")),
+            )
+            tbl.item(3, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(3, 0).setFont(self.font_bold)
+            if type(self.meas.ext_temp_chk["user"]) != float or np.isnan(
+                self.meas.ext_temp_chk["user"]
+            ):
+                tbl.setItem(3, 1, QtWidgets.QTableWidgetItem(self.tr("N/A")))
+            else:
+                tbl.setItem(
+                    3,
+                    1,
+                    QtWidgets.QTableWidgetItem(
+                        "{:4.1f}".format(self.meas.ext_temp_chk["user"])
+                    ),
+                )
+            tbl.item(3, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # ADCP temperature
+            tbl.setItem(
+                3, 2, QtWidgets.QTableWidgetItem(self.tr("ADCP Temperature (C): "))
+            )
+            tbl.item(3, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(3, 2).setFont(self.font_bold)
+            if type(self.meas.ext_temp_chk["adcp"]) != float or np.isnan(
+                self.meas.ext_temp_chk["adcp"]
+            ):
+                avg_temp = Sensors.avg_temperature(self.meas.transects)
+                tbl.setItem(
+                    3, 3, QtWidgets.QTableWidgetItem("{:4.1f}".format(avg_temp))
+                )
+            else:
+                tbl.setItem(
+                    3,
+                    3,
+                    QtWidgets.QTableWidgetItem(
+                        "{:4.1f}".format(self.meas.ext_temp_chk["adcp"])
+                    ),
+                )
+            tbl.item(3, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Magnetic variation
+            tbl.setItem(
+                4, 0, QtWidgets.QTableWidgetItem(self.tr("Magnetic Variation: "))
+            )
+            tbl.item(4, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(4, 0).setFont(self.font_bold)
+            magvar = []
+            for transect in self.meas.transects:
+                if transect.checked:
+                    magvar.append(transect.sensors.heading_deg.internal.mag_var_deg)
+            if len(np.unique(magvar)) > 1:
+                tbl.setItem(4, 1, QtWidgets.QTableWidgetItem(self.tr("Varies")))
+            else:
+                tbl.setItem(
+                    4, 1, QtWidgets.QTableWidgetItem("{:4.1f}".format(magvar[0]))
+                )
+            tbl.item(4, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Heading offset
+            tbl.setItem(4, 2, QtWidgets.QTableWidgetItem(self.tr("Heading Offset: ")))
+            tbl.item(4, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(4, 2).setFont(self.font_bold)
+            hoffset = []
+            for transect in self.meas.transects:
+                if transect.sensors.heading_deg.external is None:
+                    tbl.setItem(4, 3, QtWidgets.QTableWidgetItem(self.tr("N/A")))
+                if transect.checked:
+                    hoffset.append(
+                        transect.sensors.heading_deg.internal.align_correction_deg
+                    )
+            if len(np.unique(hoffset)) > 1:
+                tbl.setItem(4, 3, QtWidgets.QTableWidgetItem(self.tr("Varies")))
+            else:
+                tbl.setItem(
+                    4, 3, QtWidgets.QTableWidgetItem("{:4.1f}".format(hoffset[0]))
+                )
+            tbl.item(4, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+
+    def update_site_name(self):
+        """Sets the station name to the name entered by the user."""
+
+        self.meas.station_name = self.ed_site_name.text()
+        if len(self.meas.station_name) > 0:
+            self.label_site_name.setStyleSheet("background: white")
+        self.meas.qa.user_qa(self.meas)
+        self.messages_tab()
+        self.main_premeasurement_table()
+
+    def update_site_number(self):
+        """Sets the station number to the number entered by the user."""
+
+        self.meas.station_number = self.ed_site_number.text()
+        if len(self.meas.station_number) > 0:
+            self.label_site_number.setStyleSheet("background: white")
+        self.meas.qa.user_qa(self.meas)
+        self.messages_tab()
+        self.main_premeasurement_table()
+
+    def update_persons(self):
+        """Sets the person(s) to the information entered by the user."""
+
+        self.meas.persons = self.ed_persons.text()
+        self.main_premeasurement_table()
+
+    def update_meas_number(self):
+        """Sets the measurement number to the information entered by the user."""
+
+        self.meas.meas_number = self.ed_meas_num.text()
+        self.main_premeasurement_table()
+
+    def update_stage_start(self):
+        """Sets the measurement number to the information entered by the user."""
+
+        stage = self.check_numeric_input(self.ed_stage_start)
+        if stage is not None:
+            self.meas.stage_start_m = stage / self.units["L"]
+            self.meas.stage_meas_m = (
+                self.meas.stage_start_m + self.meas.stage_end_m
+            ) / 2.0
+        self.main_premeasurement_table()
+
+    def update_stage_end(self):
+        """Sets the measurement number to the information entered by the user."""
+
+        stage = self.check_numeric_input(self.ed_stage_end)
+        if stage is not None:
+            self.meas.stage_end_m = stage / self.units["L"]
+            self.meas.stage_meas_m = (
+                self.meas.stage_start_m + self.meas.stage_end_m
+            ) / 2.0
+        self.main_premeasurement_table()
+
+    def update_stage_meas(self):
+        """Sets the measurement number to the information entered by the user."""
+
+        stage = self.check_numeric_input(self.ed_stage_meas)
+        if stage is not None:
+            self.meas.stage_meas_m = stage / self.units["L"]
+        self.main_premeasurement_table()
+
+    def main_settings_table(self):
+        """Create and populate settings table."""
+
+        # Setup table
+        tbl = self.table_settings
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows + 3)
+        tbl.setColumnCount(14)
+        tbl.horizontalHeader().hide()
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        if len(self.checked_transects_idx) > 0:
+            # Build column labels using custom_header to create appropriate
+            # spans
+            self.custom_header(tbl, 0, 0, 3, 1, self.tr("Transect"))
+            self.custom_header(tbl, 0, 1, 1, 4, self.tr("Edge"))
+            tbl.item(0, 1).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(
+                tbl, 1, 1, 1, 2, self.tr("Distance " + self.units["label_L"])
+            )
+            tbl.item(1, 1).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 2, 1, 1, 1, self.tr("Left"))
+            tbl.item(2, 1).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 2, 2, 1, 1, self.tr("Right"))
+            tbl.item(2, 2).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 1, 3, 1, 2, self.tr("Type"))
+            tbl.item(1, 3).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 2, 3, 1, 1, self.tr("Left"))
+            self.custom_header(tbl, 2, 4, 1, 1, self.tr("Right"))
+            self.custom_header(
+                tbl, 0, 5, 3, 1, self.tr("Draft " + self.units["label_L"])
+            )
+            self.custom_header(
+                tbl,
+                0,
+                6,
+                3,
+                1,
+                self.tr("Excluded \n Distance " + self.units["label_L"]),
+            )
+            self.custom_header(tbl, 0, 7, 2, 2, self.tr("Depth"))
+            tbl.item(0, 7).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 2, 7, 1, 1, self.tr("Ref"))
+            self.custom_header(tbl, 2, 8, 1, 1, self.tr("Comp"))
+            self.custom_header(tbl, 0, 9, 2, 2, self.tr("Navigation"))
+            tbl.item(0, 9).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 2, 9, 1, 1, self.tr("Ref"))
+            self.custom_header(tbl, 2, 10, 1, 1, self.tr("Comp"))
+            self.custom_header(tbl, 0, 11, 3, 1, self.tr("Top \n Method"))
+            tbl.item(0, 11).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 0, 12, 3, 1, self.tr("Bottom \n Method"))
+            tbl.item(0, 12).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 0, 13, 3, 1, self.tr("Exp"))
+            tbl.item(0, 13).setTextAlignment(QtCore.Qt.AlignCenter)
+
+            # Add transect data
+            for row in range(nrows):
+                col = 0
+                transect_id = self.checked_transects_idx[row]
+
+                # File/transect name
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].file_name[:-4]
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Left edge distance
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.3f}".format(
+                            self.meas.transects[transect_id].edges.left.distance_m
+                            * self.units["L"]
+                        )
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Right edge distance
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.3f}".format(
+                            self.meas.transects[transect_id].edges.right.distance_m
+                            * self.units["L"]
+                        )
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Left edge type
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].edges.left.type[0:3]
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Right edge type
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].edges.right.type[0:3]
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Draft or transducer depth
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.3f}".format(
+                            self.meas.transects[
+                                transect_id
+                            ].depths.bt_depths.draft_use_m
+                            * self.units["L"]
+                        )
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Excluded distance below transducer
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:4.2f}".format(
+                            self.meas.transects[transect_id].w_vel.excluded_dist_m
+                            * self.units["L"]
+                        )
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Selected depth reference
+                col += 1
+                if self.meas.transects[transect_id].depths.selected == "bt_depths":
+                    item = "BT"
+                elif self.meas.transects[transect_id].depths.selected == "ds_depths":
+                    item = "DS"
+                elif self.meas.transects[transect_id].depths.selected == "vb_depths":
+                    item = "VB"
+                else:
+                    item = "?"
+                tbl.setItem(row + 3, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Use of composite depths
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].depths.composite
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Navigation or velocity reference
+                col += 1
+                if self.meas.transects[transect_id].boat_vel.selected == "bt_vel":
+                    item = "BT"
+                elif self.meas.transects[transect_id].boat_vel.selected == "gga_vel":
+                    item = "GGA"
+                elif self.meas.transects[transect_id].boat_vel.selected == "vtg_vel":
+                    item = "VTG"
+                else:
+                    item = "?"
+                tbl.setItem(row + 3, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Composite tracks setting
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].boat_vel.composite
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Extrapolation top method
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].extrap.top_method
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Extrapolation bottom method
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].extrap.bot_method
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Extrapolation exponent
+                col += 1
+                tbl.setItem(
+                    row + 3,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.4f}".format(
+                            self.meas.transects[transect_id].extrap.exponent
+                        )
+                    ),
+                )
+                tbl.item(row + 3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                col += 1
+
+                tbl.resizeColumnsToContents()
+                tbl.resizeRowsToContents()
+
+                tbl.item(self.transect_row + 3, 0).setFont(self.font_bold)
+                tbl.scrollToItem(tbl.item(self.transect_row + 3, 0))
+
+    def settings_table_row_adjust(self, row, col):
+        """Allows proper selection of transect to display from the settings
+        table which has custom header rows.
+
+            Parameter
+            =========
+            row: int
+                row selected
+            col: int
+                column selected
+        """
+        row = row - 2
+        self.select_transect(row, col)
+
+    def main_adcp_table(self):
+        """Display ADCP table."""
+
+        # Setup table
+        tbl = self.table_adcp
+        tbl.setRowCount(4)
+        tbl.setColumnCount(4)
+        tbl.horizontalHeader().hide()
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        if len(self.checked_transects_idx) > 0:
+
+            # Serial number
+            tbl.setItem(0, 0, QtWidgets.QTableWidgetItem(self.tr("Serial Number: ")))
+            tbl.item(0, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(0, 0).setFont(self.font_bold)
+            # Get serial number from 1st checked transect
+            tbl.setItem(
+                0,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    self.meas.transects[self.checked_transects_idx[0]].adcp.serial_num
+                ),
+            )
+            tbl.item(0, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Manufacturer
+            tbl.setItem(0, 2, QtWidgets.QTableWidgetItem(self.tr("Manufacturer: ")))
+            tbl.item(0, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(0, 2).setFont(self.font_bold)
+            tbl.setItem(
+                0,
+                3,
+                QtWidgets.QTableWidgetItem(
+                    self.meas.transects[self.checked_transects_idx[0]].adcp.manufacturer
+                ),
+            )
+            tbl.item(0, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Model
+            tbl.setItem(1, 0, QtWidgets.QTableWidgetItem(self.tr("Model: ")))
+            tbl.item(1, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(1, 0).setFont(self.font_bold)
+            tbl.setItem(
+                1,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    self.meas.transects[self.checked_transects_idx[0]].adcp.model
+                ),
+            )
+            tbl.item(1, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Firmware
+            tbl.setItem(1, 2, QtWidgets.QTableWidgetItem(self.tr("Firmware: ")))
+            tbl.item(1, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(1, 2).setFont(self.font_bold)
+            if (
+                type(self.meas.transects[self.checked_transects_idx[0]].adcp.firmware)
+                == str
+            ):
+                firmware = self.meas.transects[
+                    self.checked_transects_idx[0]
+                ].adcp.firmware
+            else:
+                firmware = str(
+                    self.meas.transects[self.checked_transects_idx[0]].adcp.firmware
+                )
+            tbl.setItem(1, 3, QtWidgets.QTableWidgetItem(firmware))
+            tbl.item(1, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Frequency
+            tbl.setItem(2, 0, QtWidgets.QTableWidgetItem(self.tr("Frequency (kHz): ")))
+            tbl.item(2, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(2, 0).setFont(self.font_bold)
+            if (
+                self.meas.transects[self.checked_transects_idx[0]].adcp.manufacturer
+                == "SonTek"
+            ):
+                if (
+                    self.meas.transects[self.checked_transects_idx[0]].adcp.model
+                    == "RS5"
+                ):
+                    item = "{:4.0f}".format(
+                        self.meas.transects[
+                            self.checked_transects_idx[0]
+                        ].adcp.frequency_khz[0]
+                    )
+                else:
+                    item = "Variable"
+            elif (
+                self.meas.transects[self.checked_transects_idx[0]].adcp.manufacturer
+                == "Nortek"
+            ):
+                item = "{:4.0f}".format(
+                    self.meas.transects[
+                        self.checked_transects_idx[0]
+                    ].adcp.frequency_khz[0]
+                )
+            else:
+                item = "{:4.0f}".format(
+                    self.meas.transects[
+                        self.checked_transects_idx[0]
+                    ].adcp.frequency_khz
+                )
+            tbl.setItem(2, 1, QtWidgets.QTableWidgetItem(item))
+            tbl.item(2, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Depth cell size
+            tbl.setItem(
+                2, 2, QtWidgets.QTableWidgetItem(self.tr("Depth Cell Size (cm): "))
+            )
+            tbl.item(2, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(2, 2).setFont(self.font_bold)
+            # Check for and handle multiple cell sizes
+            cell_sizes = np.array([])
+            for n in range(len(self.checked_transects_idx)):
+                transect = self.meas.transects[self.checked_transects_idx[n]]
+                cell_sizes = np.append(
+                    cell_sizes,
+                    np.unique(transect.depths.bt_depths.depth_cell_size_m)[:],
+                )
+            max_cell_size = np.nanmax(cell_sizes) * 100
+            min_cell_size = np.nanmin(cell_sizes) * 100
+            if max_cell_size - min_cell_size < 1:
+                size = "{:3.0f}".format(max_cell_size)
+            else:
+                size = "{:3.0f} - {:3.0f}".format(min_cell_size, max_cell_size)
+            tbl.setItem(2, 3, QtWidgets.QTableWidgetItem(size))
+            tbl.item(2, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Water mode
+            tbl.setItem(3, 0, QtWidgets.QTableWidgetItem(self.tr("Water Mode: ")))
+            tbl.item(3, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(3, 0).setFont(self.font_bold)
+            if (
+                self.meas.transects[self.checked_transects_idx[0]].adcp.manufacturer
+                == "SonTek"
+            ):
+                item = "Variable"
+            elif (
+                self.meas.transects[self.checked_transects_idx[0]].adcp.manufacturer
+                == "Nortek"
+            ):
+                item = "Variable"
+            else:
+                item = "{:2.0f}".format(
+                    self.meas.transects[self.checked_transects_idx[0]].w_vel.water_mode
+                )
+            tbl.setItem(3, 1, QtWidgets.QTableWidgetItem(item))
+            tbl.item(3, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Bottom mode
+            tbl.setItem(3, 2, QtWidgets.QTableWidgetItem(self.tr("Bottom Mode: ")))
+            tbl.item(3, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(3, 2).setFont(self.font_bold)
+            if (
+                self.meas.transects[self.checked_transects_idx[0]].adcp.manufacturer
+                == "SonTek"
+            ):
+                item = "Variable"
+            elif (
+                self.meas.transects[self.checked_transects_idx[0]].adcp.manufacturer
+                == "Nortek"
+            ):
+                item = "Variable"
+            else:
+                item = "{:2.0f}".format(
+                    self.meas.transects[
+                        self.checked_transects_idx[0]
+                    ].boat_vel.bt_vel.bottom_mode
+                )
+            tbl.setItem(3, 3, QtWidgets.QTableWidgetItem(item))
+            tbl.item(3, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+
+    def custom_header(self, tbl, row, col, row_span, col_span, text):
+        """Creates custom header than can span multiple rows and columns.
+
+        Parameters
+        ----------
+        tbl: QTableWidget
+            Reference to table
+        row: int
+            Initial row
+        col: int
+            Initial column
+        row_span: int
+            Number of rows to span
+        col_span:
+            Number of columns to span
+        text: str
+            Header text"""
+        tbl.setItem(row, col, QtWidgets.QTableWidgetItem(text))
+        tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.item(row, col).setFont(self.font_bold)
+        if row_span != 1 or col_span != 1:
+            tbl.setSpan(row, col, row_span, col_span)
+        tbl.setWordWrap(True)
+
+    # System test tab
+    # ===============
+    def system_tab(self, idx_systest=0):
+        """Initialize and display data in the systems tab.
+
+        Parameters
+        ----------
+        idx_systest: int
+            Identifies the system test to display in the text box.
+        """
+
+        # Setup table
+        tbl = self.table_systest
+        nrows = len(self.meas.system_tst)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(4)
+        header_text = [
+            self.tr("Date/Time"),
+            self.tr("No. Tests"),
+            self.tr("No. Failed"),
+            self.tr("PT3"),
+        ]
+        tbl.setHorizontalHeaderLabels(header_text)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        tbl.setStyleSheet("QToolTip{font: 12pt}")
+        self.display_systest.clear()
+
+        # Add system tests
+        if nrows > 0:
+            for row, test in enumerate(self.meas.system_tst):
+
+                # Test identifier
+                col = 0
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(test.time_stamp))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Number of subtests run
+                col += 1
+                if test.result["sysTest"]["n_tests"] is None:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                else:
+                    tbl.setItem(
+                        row,
+                        col,
+                        QtWidgets.QTableWidgetItem(
+                            "{:2.0f}".format(test.result["sysTest"]["n_tests"])
+                        ),
+                    )
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Number of subtests failed
+                col += 1
+                if test.result["sysTest"]["n_failed"] is None:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+                    tbl.item(row, col).setToolTip(self.tr("No system test."))
+                else:
+                    tbl.setItem(
+                        row,
+                        col,
+                        QtWidgets.QTableWidgetItem(
+                            "{:2.0f}".format(test.result["sysTest"]["n_failed"])
+                        ),
+                    )
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                    if test.result["sysTest"]["n_failed"] > 0:
+                        tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                        tbl.item(row, col).setToolTip(
+                            self.tr(
+                                "One or more system test sets have at least "
+                                "one test that failed"
+                            )
+                        )
+
+                # Status of PT3 tests
+                col += 1
+                if "pt3" in test.result:
+                    if "hard_limit" in test.result["pt3"]:
+                        if "high_wide" in test.result["pt3"]["hard_limit"]:
+                            if (
+                                "corr_table"
+                                in test.result["pt3"]["hard_limit"]["high_wide"]
+                            ):
+                                corr_table = test.result["pt3"]["hard_limit"][
+                                    "high_wide"
+                                ]["corr_table"]
+                                if len(corr_table) > 0:
+                                    # All lags past lag 2 should be less
+                                    # than 50% of lag 0
+                                    qa_threshold = corr_table[0, :] * 0.5
+                                    all_lag_check = np.greater(
+                                        corr_table[3::, :], qa_threshold
+                                    )
+
+                                    # Lag 7 should be less than 25% of lag 0
+                                    lag_7_check = np.greater(
+                                        corr_table[7, :], corr_table[0, :] * 0.25
+                                    )
+
+                                    # If either condition is met for any
+                                    # beam the test fails
+                                    if (
+                                        np.sum(np.sum(all_lag_check))
+                                        + np.sum(lag_7_check)
+                                        > 1
+                                    ):
+                                        tbl.setItem(
+                                            row,
+                                            col,
+                                            QtWidgets.QTableWidgetItem("Failed"),
+                                        )
+                                        tbl.item(row, col).setBackground(
+                                            QtGui.QColor(255, 204, 0)
+                                        )
+                                        tbl.item(row, col).setToolTip(
+                                            self.tr(
+                                                "One or more PT3 tests in "
+                                                "the system test indicate "
+                                                "potential EMI"
+                                            )
+                                        )
+                                    else:
+                                        tbl.setItem(
+                                            row, col, QtWidgets.QTableWidgetItem("Pass")
+                                        )
+                                        tbl.item(row, col).setBackground(
+                                            QtGui.QColor(255, 255, 255)
+                                        )
+
+                else:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Display selected test
+            tbl.item(idx_systest, 0).setFont(self.font_bold)
+            self.display_systest.clear()
+            self.display_systest.textCursor().insertText(
+                self.meas.system_tst[idx_systest].data
+            )
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+        if not self.systest_initialized:
+            tbl.cellClicked.connect(self.select_systest)
+            self.systest_initialized = True
+
+        self.systest_comments_messages()
+
+    def systest_comments_messages(self):
+        """Display system test comments and messages in system tab."""
+
+        # Clear current contents
+        self.display_systest_comments.clear()
+        self.display_systest_messages.clear()
+        if self.meas is not None:
+
+            # Comments
+            self.display_systest_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                # Display each comment on a new line
+                self.display_systest_comments.textCursor().insertText(comment)
+                self.display_systest_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_systest_comments.textCursor().insertBlock()
+
+            # Messages
+            self.display_systest_messages.moveCursor(QtGui.QTextCursor.Start)
+            for message in self.meas.qa.system_tst["messages"]:
+                # Display each comment on a new line
+                if type(message) is str:
+                    self.display_systest_messages.textCursor().insertText(message)
+                else:
+                    self.display_systest_messages.textCursor().insertText(message[0])
+                self.display_systest_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_systest_messages.textCursor().insertBlock()
+
+            self.update_tab_icons()
+
+    def select_systest(self, row, column):
+        """Displays selected system test in text box.
+
+        Parameters
+        ==========
+        row: int
+            row in table clicked by user
+        column: int
+            column in table clicked by user
+        """
+
+        if column == 0:
+            with self.wait_cursor():
+                # Set all files to normal font
+                nrows = len(self.meas.system_tst)
+                for nrow in range(nrows):
+                    self.table_systest.item(nrow, 0).setFont(self.font_normal)
+
+                # Set selected file to bold font
+                self.table_systest.item(row, 0).setFont(self.font_bold)
+
+                # Update contour and shiptrack plot
+                self.system_tab(idx_systest=row)
+
+    # Compass tab
+    # ===========
+    def compass_tab(self, old_discharge=None):
+        """Initialize, setup settings, and display initial data in compass
+        tabs.
+
+        Parameters
+        ----------
+        old_discharge: list
+            Discharges computed prior to change made while tab is
+            displayed.
+        """
+
+        # Setup data table
+        tbl = self.table_compass_pr
+        tbl.clear()
+        table_header = [
+            self.tr("Plot / Transect"),
+            self.tr("Magnetic \n Variation (deg)"),
+            self.tr("Heading \n Offset (deg)"),
+            self.tr("Heading \n Source"),
+            self.tr("Pitch \n Mean (deg)"),
+            self.tr("Pitch \n Std. Dev. (deg)"),
+            self.tr("Roll \n Mean (deg)"),
+            self.tr("Roll \n Std. Dev. (deg)"),
+            self.tr("Discharge \n Previous \n" + self.units["label_Q"]),
+            self.tr("Discharge \n Now \n" + self.units["label_Q"]),
+            self.tr("Discharge \n % Change"),
+        ]
+        ncols = len(table_header)
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(table_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        tbl.setStyleSheet("QToolTip{font: 12pt}")
+
+        if not self.compass_pr_initialized:
+            # Connect table
+            tbl.cellClicked.connect(self.compass_table_clicked)
+            tbl.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
+            tbl.customContextMenuRequested.connect(self.compass_table_right_click)
+            # Connect plot variable checkboxes
+            self.cb_adcp_compass.stateChanged.connect(self.compass_plot)
+            self.cb_ext_compass.stateChanged.connect(self.compass_plot)
+            self.cb_mag_field.stateChanged.connect(self.compass_plot)
+            self.cb_pitch.stateChanged.connect(self.pr_plot)
+            self.cb_roll.stateChanged.connect(self.pr_plot)
+            self.compass_pr_initialized = True
+
+        # Configure mag field error
+        self.cb_mag_field.blockSignals(True)
+        self.cb_mag_field.setEnabled(False)
+        self.cb_mag_field.setChecked(False)
+        for transect_idx in self.checked_transects_idx:
+            if self.meas.transects[
+                transect_idx
+            ].sensors.heading_deg.internal.mag_error is not None and np.logical_not(
+                np.all(
+                    np.isnan(
+                        self.meas.transects[
+                            transect_idx
+                        ].sensors.heading_deg.internal.mag_error
+                    )
+                )
+            ):
+                self.cb_mag_field.setEnabled(True)
+                self.cb_mag_field.setChecked(True)
+                break
+        self.cb_mag_field.blockSignals(False)
+
+        # Configure external heading
+        self.cb_ext_compass.blockSignals(True)
+        self.cb_ext_compass.setEnabled(False)
+        self.cb_ext_compass.setChecked(False)
+        for transect_idx in self.checked_transects_idx:
+            if (
+                self.meas.transects[transect_idx].sensors.heading_deg.external
+                is not None
+            ):
+                self.cb_ext_compass.setEnabled(True)
+                break
+        self.cb_ext_compass.blockSignals(False)
+
+        # Update table, graphs, messages, and comments
+        if old_discharge is None:
+            old_discharge = self.meas.discharge
+
+        self.update_compass_tab(
+            tbl=tbl,
+            old_discharge=old_discharge,
+            new_discharge=self.meas.discharge,
+            initial=self.transect_row,
+        )
+
+        # Setup list for use by graphics controls
+        self.canvases = [self.heading_canvas, self.pr_canvas]
+        self.figs = [self.heading_fig, self.pr_fig]
+        self.fig_calls = [self.compass_plot, self.pr_plot]
+        self.toolbars = [self.heading_toolbar, self.pr_toolbar]
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+        # Initialize the calibration/evaluation tab
+        self.compass_cal_eval(idx_eval=0)
+
+    def compass_cal_eval(self, idx_cal=None, idx_eval=None):
+        """Displays data in the calibration / evaluation tab.
+
+        Parameters
+        ----------
+        idx_cal: int
+            Index of calibration to display in text box
+        idx_eval: int
+            Index of evaluation to display in text box
+        """
+
+        # Setup calibration table
+        tblc = self.table_compass_cal
+        nrows = len(self.meas.compass_cal)
+        tblc.setRowCount(nrows)
+        tblc.setColumnCount(1)
+        header_text = [self.tr("Date/Time")]
+        tblc.setHorizontalHeaderLabels(header_text)
+        tblc.horizontalHeader().setFont(self.font_bold)
+        tblc.verticalHeader().hide()
+        tblc.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        tblc.cellClicked.connect(self.select_calibration)
+
+        # Add calibrations
+        if nrows > 0:
+            for row, test in enumerate(self.meas.compass_cal):
+                col = 0
+                tblc.setItem(row, col, QtWidgets.QTableWidgetItem(test.time_stamp))
+                tblc.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Display selected calibration in text box
+            if idx_cal is not None:
+                self.display_compass_result.clear()
+                tblc.item(idx_cal, 0).setFont(self.font_bold)
+                self.display_compass_result.textCursor().insertText(
+                    self.meas.compass_cal[idx_cal].data
+                )
+
+            tblc.resizeColumnsToContents()
+            tblc.resizeRowsToContents()
+
+        # Setup evaluation table
+        tble = self.table_compass_eval
+
+        # SonTek has no independent evaluation. Evaluation results are
+        # reported with the calibration.
+        if (
+            self.meas.transects[self.checked_transects_idx[0]].adcp.manufacturer
+            == "SonTek"
+        ):
+            evals = self.meas.compass_cal
+        else:
+            evals = self.meas.compass_eval
+        nrows = len(evals)
+        tble.setRowCount(nrows)
+        tble.setColumnCount(2)
+        header_text = [self.tr("Date/Time"), self.tr("Error")]
+        tble.setHorizontalHeaderLabels(header_text)
+        tble.horizontalHeader().setFont(self.font_bold)
+        tble.verticalHeader().hide()
+        tble.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        tble.cellClicked.connect(self.select_evaluation)
+
+        # Add evaluations
+        if nrows > 0:
+            for row, test in enumerate(evals):
+                col = 0
+                tble.setItem(row, col, QtWidgets.QTableWidgetItem(test.time_stamp))
+                tble.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                col = 1
+                if type(test.result["compass"]["error"]) == str:
+                    item = test.result["compass"]["error"]
+                else:
+                    item = "{:2.2f}".format(test.result["compass"]["error"])
+                tble.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tble.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            if self.meas.qa.compass["status1"] == "warning":
+                tble.item(nrows - 1, 1).setBackground(QtGui.QColor(255, 77, 77))
+            elif self.meas.qa.compass["status1"] == "caution":
+                tble.item(nrows - 1, 1).setBackground(QtGui.QColor(255, 204, 0))
+            else:
+                tble.item(nrows - 1, 1).setBackground(QtGui.QColor(255, 255, 255))
+
+            # Display selected evaluation in text box
+            if idx_eval is not None:
+                self.display_compass_result.clear()
+                tble.item(idx_eval, 0).setFont(self.font_bold)
+                self.display_compass_result.textCursor().insertText(
+                    evals[idx_eval].data
+                )
+
+            tble.resizeColumnsToContents()
+            tble.resizeRowsToContents()
+
+        if tble.rowCount() == 0 and tblc.rowCount() == 0:
+            self.display_compass_result.clear()
+
+    def compass_comments_messages(self):
+        """Displays the messages associated with the compass, pitch,
+        and roll and any comments provided by the user.
+        """
+
+        # Clear current content
+        self.display_compass_comments.clear()
+        self.display_compass_messages.clear()
+        if self.meas is not None:
+
+            # Comments
+            self.display_compass_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                # Display each comment on a new line
+                self.display_compass_comments.textCursor().insertText(comment)
+                self.display_compass_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_compass_comments.textCursor().insertBlock()
+
+            # Messages
+            self.display_compass_messages.moveCursor(QtGui.QTextCursor.Start)
+            for message in self.meas.qa.compass["messages"]:
+                # Display each comment on a new line
+                if type(message) is str:
+                    self.display_compass_messages.textCursor().insertText(message)
+                else:
+                    self.display_compass_messages.textCursor().insertText(message[0])
+                self.display_compass_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_compass_messages.textCursor().insertBlock()
+
+            self.update_tab_icons()
+            if self.meas.qa.compass["status1"] != "default":
+                self.set_tab_icon(
+                    "tab_compass_2_cal",
+                    self.meas.qa.compass["status1"],
+                    tab_base=self.tab_compass_2,
+                )
+
+    def update_compass_tab(self, tbl, old_discharge, new_discharge, initial=None):
+        """Populates the table and draws the graphs with the current data.
+
+        Parameters
+        ----------
+        tbl: QTableWidget
+            Reference to the QTableWidget
+        old_discharge: list
+            List of class QComp with discharge from previous settings,
+            same as new if not changes
+        new_discharge: list
+            List of class QComp with discharge from current settings
+        initial: int
+            Identifies row that should be checked and displayed in the
+            graphs. Used for initial display of data.
+        """
+
+        with self.wait_cursor():
+
+            # Populate each row
+            for row in range(tbl.rowCount()):
+                transect_id = self.checked_transects_idx[row]
+
+                # File/Transect name
+                col = 0
+                checked = QtWidgets.QTableWidgetItem(
+                    self.meas.transects[transect_id].file_name[:-4]
+                )
+                checked.setFlags(
+                    QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(checked))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if transect_id in self.meas.qa.compass["mag_error_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("Change in mag field exceeds 2%")
+                    )
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Magnetic variation
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:3.2f}".format(
+                            self.meas.transects[
+                                transect_id
+                            ].sensors.heading_deg.internal.mag_var_deg
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                # Inconsistent magvar
+                if self.meas.qa.compass["magvar"] == 1:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(
+                        self.tr(
+                            "Magnetic variation is not consistent among " "transects"
+                        )
+                    )
+
+                # Magvar is zero
+                elif self.meas.qa.compass["magvar"] == 2:
+                    if transect_id in self.meas.qa.compass["magvar_idx"]:
+                        tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+                        tbl.item(row, col).setToolTip(
+                            self.tr(
+                                "Magnetic variation is 0 and GPS data are " "present"
+                            )
+                        )
+                        tbl.item(row, col).setToolTip(
+                            self.tr("Magnetic variation is 0 and GPS data are present")
+                        )
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Heading offset
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:3.2f}".format(
+                            self.meas.transects[
+                                transect_id
+                            ].sensors.heading_deg.internal.align_correction_deg
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Heading source
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].sensors.heading_deg.selected
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Mean pitch
+                col += 1
+                pitch = getattr(
+                    self.meas.transects[transect_id].sensors.pitch_deg,
+                    self.meas.transects[transect_id].sensors.pitch_deg.selected,
+                )
+                item = np.nanmean(pitch.data)
+                if np.isnan(item):
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                else:
+                    tbl.setItem(
+                        row, col, QtWidgets.QTableWidgetItem("{:3.1f}".format(item))
+                    )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if transect_id in self.meas.qa.compass["pitch_mean_warning_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("Mean pitch is greater than 8 deg")
+                    )
+                elif transect_id in self.meas.qa.compass["pitch_mean_caution_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("Mean pitch is greater than 4 deg")
+                    )
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Pitch standard deviation
+                col += 1
+                item = np.nanstd(pitch.data, ddof=1)
+                if np.isnan(item):
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                else:
+                    tbl.setItem(
+                        row, col, QtWidgets.QTableWidgetItem("{:3.1f}".format(item))
+                    )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if transect_id in self.meas.qa.compass["pitch_std_caution_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("Pitch standard deviation is greater than 5 deg")
+                    )
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Mean roll
+                col += 1
+                roll = getattr(
+                    self.meas.transects[transect_id].sensors.roll_deg,
+                    self.meas.transects[transect_id].sensors.roll_deg.selected,
+                )
+                item = np.nanmean(roll.data)
+                if np.isnan(item):
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                else:
+                    tbl.setItem(
+                        row, col, QtWidgets.QTableWidgetItem("{:3.1f}".format(item))
+                    )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if transect_id in self.meas.qa.compass["roll_mean_warning_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("Mean roll is greater than 8 deg")
+                    )
+                elif transect_id in self.meas.qa.compass["roll_mean_caution_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("Mean roll is greater than 4 deg")
+                    )
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Roll standard deviation
+                col += 1
+                item = np.nanstd(roll.data, ddof=1)
+                if np.isnan(item):
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                else:
+                    tbl.setItem(
+                        row, col, QtWidgets.QTableWidgetItem("{:3.1f}".format(item))
+                    )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if transect_id in self.meas.qa.compass["roll_std_caution_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("Roll standard deviation is greater than 5 deg")
+                    )
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Discharge from previous settings
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                old_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Discharge from new/current settings
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                new_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent difference in old and new discharges
+                col += 1
+                if np.abs(old_discharge[transect_id].total) > 0:
+                    per_change = (
+                        (
+                            new_discharge[transect_id].total
+                            - old_discharge[transect_id].total
+                        )
+                        / old_discharge[transect_id].total
+                    ) * 100
+                    tbl.setItem(
+                        row,
+                        col,
+                        QtWidgets.QTableWidgetItem("{:3.1f}".format(per_change)),
+                    )
+                else:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # If initial is specified uncheck all rows
+                if initial is not None:
+                    tbl.item(row, 0).setCheckState(QtCore.Qt.Unchecked)
+
+            # Check the row specified by initial
+            if initial is None:
+                tbl.item(0, 0).setCheckState(QtCore.Qt.Checked)
+            else:
+                tbl.item(initial, 0).setCheckState(QtCore.Qt.Checked)
+
+            # Automatically resize rows and columns
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+
+            # Update graphics, comments, and messages
+            self.compass_plot()
+            self.pr_plot()
+            self.compass_comments_messages()
+
+    def change_table_data(self, tbl, old_discharge, new_discharge):
+        """Populates the table and draws the graphs with the current data.
+
+        Parameters
+        ----------
+        tbl: QTableWidget
+            Reference to the QTableWidget
+        old_discharge: list
+            List class QComp with discharge from previous settings,
+            same as new if not changes
+        new_discharge: list
+            List of class QComp with discharge from current settings
+        """
+
+        with self.wait_cursor():
+            # Populate each row
+            for row in range(tbl.rowCount()):
+                transect_id = self.checked_transects_idx[row]
+
+                # File/Transect name
+                col = 0
+                # Magnetic variation
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:3.2f}".format(
+                            self.meas.transects[
+                                transect_id
+                            ].sensors.heading_deg.internal.mag_var_deg
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Heading offset
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:3.2f}".format(
+                            self.meas.transects[
+                                transect_id
+                            ].sensors.heading_deg.internal.align_correction_deg
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Heading source
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].sensors.heading_deg.selected
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Mean pitch
+                col += 1
+
+                # Pitch standard deviation
+                col += 1
+
+                # Mean roll
+                col += 1
+
+                # Roll standard deviation
+                col += 1
+
+                # Discharge from previous settings
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                old_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Discharge from new/current settings
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                new_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent difference in old and new discharges
+                col += 1
+                if np.abs(old_discharge[transect_id].total) > 0:
+                    per_change = (
+                        (
+                            new_discharge[transect_id].total
+                            - old_discharge[transect_id].total
+                        )
+                        / old_discharge[transect_id].total
+                    ) * 100
+                    tbl.setItem(
+                        row,
+                        col,
+                        QtWidgets.QTableWidgetItem("{:3.1f}".format(per_change)),
+                    )
+                else:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Update graphics, comments, and messages
+            self.compass_plot()
+            self.pr_plot()
+            self.compass_comments_messages()
+
+    @QtCore.pyqtSlot(QtCore.QPoint)
+    def compass_table_right_click(self, pos):
+        """Manages actions caused by the user right clicking in selected
+        columns of the table.
+
+        Parameters
+        ----------
+        pos: QPoint
+            A location in the table
+        """
+
+        tbl = self.table_compass_pr
+        cell = tbl.itemAt(pos)
+        column = cell.column()
+        row = cell.row()
+
+        # Change transects plotted
+        if column == 0:
+            if tbl.item(row, 0).checkState() == QtCore.Qt.Checked:
+                tbl.item(row, 0).setCheckState(QtCore.Qt.Unchecked)
+            else:
+                tbl.item(row, 0).setCheckState(QtCore.Qt.Checked)
+            self.compass_plot()
+            self.pr_plot()
+            self.figs = [self.heading_fig, self.pr_fig]
+            self.fig_calls = [self.compass_plot, self.pr_plot]
+
+    @QtCore.pyqtSlot(int, int)
+    def compass_table_clicked(self, row, column):
+        """Manages actions caused by the user clicking in selected columns
+        of the table.
+
+        Parameters
+        ----------
+        row: int
+            row in table clicked by user
+        column: int
+            column in table clicked by user
+        """
+
+        tbl = self.table_compass_pr
+        # Change transects plotted
+        if column == 0:
+            for nrow in range(tbl.rowCount()):
+                tbl.item(nrow, 0).setCheckState(QtCore.Qt.Unchecked)
+            self.transect_row = row
+            tbl.item(row, 0).setCheckState(QtCore.Qt.Checked)
+            tbl.scrollToItem(tbl.item(self.transect_row, 0))
+
+            self.compass_plot()
+            self.pr_plot()
+            self.figs = [self.heading_fig, self.pr_fig]
+            self.fig_calls = [self.compass_plot, self.pr_plot]
+            self.change = True
+
+        # Magnetic variation
+        if column == 1:
+            # Initialize dialog
+            magvar_dialog = MagVar(self)
+            rsp = magvar_dialog.exec_()
+            # Data entered.
+            with self.wait_cursor():
+                if rsp == QtWidgets.QDialog.Accepted:
+                    old_discharge = copy.deepcopy(self.meas.discharge)
+                    magvar = self.check_numeric_input(magvar_dialog.ed_magvar)
+                    if magvar is not None:
+                        # Apply change to selected or all transects
+                        if magvar_dialog.rb_all.isChecked():
+                            self.meas.change_magvar(magvar=magvar)
+                        else:
+                            self.meas.change_magvar(
+                                magvar=magvar,
+                                transect_idx=self.checked_transects_idx[row],
+                            )
+
+                        # Update compass tab
+                        self.change_table_data(
+                            tbl=tbl,
+                            old_discharge=old_discharge,
+                            new_discharge=self.meas.discharge,
+                        )
+                        self.change = True
+
+        # Heading Offset
+        elif column == 2:
+            if self.h_external_valid:
+                # Initialize dialog
+                h_offset_dialog = HOffset(self)
+                h_offset_entered = h_offset_dialog.exec_()
+                # If data entered.
+                with self.wait_cursor():
+                    if h_offset_entered:
+                        old_discharge = copy.deepcopy(self.meas.discharge)
+                        h_offset = self.check_numeric_input(h_offset_dialog.ed_hoffset)
+                        if h_offset is not None:
+
+                            # Apply change to selected or all transects
+                            if h_offset_dialog.rb_all.isChecked():
+                                self.meas.change_h_offset(h_offset=h_offset)
+                            else:
+                                self.meas.change_h_offset(
+                                    h_offset=h_offset,
+                                    transect_idx=self.checked_transects_idx[row],
+                                )
+
+                            # Update compass tab
+                            self.update_compass_tab(
+                                tbl=tbl,
+                                old_discharge=old_discharge,
+                                new_discharge=self.meas.discharge,
+                            )
+                            self.change = True
+
+        # Heading Source
+        elif column == 3:
+            # if self.h_external_valid:
+            # Initialize dialog
+            h_source_dialog = HSource(self)
+            if not self.h_external_valid:
+                h_source_dialog.rb_external.setEnabled(False)
+            else:
+                h_source_dialog.rb_external.setEnabled(True)
+
+            current = tbl.item(row, column).text()
+            if current == "internal":
+                h_source_dialog.rb_internal.setChecked(True)
+            elif current == "external":
+                h_source_dialog.rb_external.setChecked(True)
+            elif current == "user":
+                h_source_dialog.rb_no_compass.setChecked(True)
+
+            h_source_entered = h_source_dialog.exec_()
+            # If data entered.
+            with self.wait_cursor():
+                if h_source_entered:
+                    old_discharge = copy.deepcopy(self.meas.discharge)
+                    if h_source_dialog.rb_internal.isChecked():
+                        h_source = "internal"
+                    elif h_source_dialog.rb_external.isChecked():
+                        h_source = "external"
+                    elif h_source_dialog.rb_no_compass.isChecked():
+                        h_source = "user"
+
+                    # Apply change to selected or all transects
+                    if h_source_dialog.rb_all.isChecked():
+                        self.meas.change_h_source(h_source=h_source)
+                    else:
+                        self.meas.change_h_source(
+                            h_source=h_source,
+                            transect_idx=self.checked_transects_idx[row],
+                        )
+
+                    # Update compass tab
+                    self.update_compass_tab(
+                        tbl=tbl,
+                        old_discharge=old_discharge,
+                        new_discharge=self.meas.discharge,
+                    )
+                    self.change = True
+        self.tab_compass_2_data.setFocus()
+
+    def select_calibration(self, row, column):
+        """Displays selected compass calibration.
+
+        Parameters
+        ----------
+        row: int
+            row in table clicked by user
+        column: int
+            column in table clicked by user
+        """
+
+        if column == 0:
+            with self.wait_cursor():
+                # Set all files to normal font
+                for nrow in range(self.table_compass_cal.rowCount()):
+                    self.table_compass_cal.item(nrow, 0).setFont(self.font_normal)
+                for nrow in range(self.table_compass_eval.rowCount()):
+                    self.table_compass_eval.item(nrow, 0).setFont(self.font_normal)
+
+                # Set selected file to bold font
+                self.table_compass_cal.item(row, 0).setFont(self.font_bold)
+
+                # Update
+                self.display_compass_result.clear()
+                self.display_compass_result.textCursor().insertText(
+                    self.meas.compass_cal[row].data
+                )
+
+    def select_evaluation(self, row, column):
+        """Displays selected compass evaluation.
+
+        Parameters
+        ----------
+        row: int
+            row in table clicked by user
+        column: int
+            column in table clicked by user
+        """
+
+        if column == 0:
+            with self.wait_cursor():
+                # Set all files to normal font
+                for nrow in range(self.table_compass_cal.rowCount()):
+                    self.table_compass_cal.item(nrow, 0).setFont(self.font_normal)
+                for nrow in range(self.table_compass_eval.rowCount()):
+                    self.table_compass_eval.item(nrow, 0).setFont(self.font_normal)
+
+                # Set selected file to bold font
+                self.table_compass_eval.item(row, 0).setFont(self.font_bold)
+
+                # Update
+                self.display_compass_result.clear()
+                # SonTek has no separate evalutations so the calibration is
+                # displayed
+                if (
+                    self.meas.transects[self.checked_transects_idx[0]].adcp.manufacturer
+                    == "SonTek"
+                ):
+                    self.display_compass_result.textCursor().insertText(
+                        self.meas.compass_cal[row].data
+                    )
+                else:
+                    self.display_compass_result.textCursor().insertText(
+                        self.meas.compass_eval[row].data
+                    )
+
+    def compass_plot(self):
+        """Generates the graph of heading and magnetic change."""
+
+        if self.heading_canvas is None:
+            # Create the canvas
+            self.heading_canvas = MplCanvas(
+                self.graph_heading, width=6, height=2, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_heading)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.heading_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.heading_toolbar = NavigationToolbar(self.heading_canvas, self)
+            self.heading_toolbar.hide()
+
+            # Initialize the temperature figure and assign to the canvas
+        self.heading_fig = HeadingTS(canvas=self.heading_canvas)
+        # Create the figure with the specified data
+        self.heading_fig.create(
+            meas=self.meas,
+            checked=self.checked_transects_idx,
+            tbl=self.table_compass_pr,
+            cb_internal=self.cb_adcp_compass,
+            cb_external=self.cb_ext_compass,
+            cb_merror=self.cb_mag_field,
+            units=self.units,
+            x_axis_type=self.x_axis_type,
+        )
+        if len(self.figs) > 0:
+            self.figs[0] = self.heading_fig
+
+        self.clear_zphd()
+
+        # Draw canvas
+        self.heading_canvas.draw()
+
+        self.tab_compass_2_data.setFocus()
+
+    def pr_plot(self):
+        """Generates the graph of heading and magnetic change."""
+
+        if self.pr_canvas is None:
+            # Create the canvas
+            self.pr_canvas = MplCanvas(self.graph_pr, width=6, height=2, dpi=80)
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_pr)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.pr_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.pr_toolbar = NavigationToolbar(self.pr_canvas, self)
+            self.pr_toolbar.hide()
+
+            # Initialize the temperature figure and assign to the canvas
+        self.pr_fig = PRTS(canvas=self.pr_canvas)
+        # Create the figure with the specified data
+        self.pr_fig.create(
+            meas=self.meas,
+            checked=self.checked_transects_idx,
+            tbl=self.table_compass_pr,
+            cb_pitch=self.cb_pitch,
+            cb_roll=self.cb_roll,
+            units=self.units,
+            x_axis_type=self.x_axis_type,
+        )
+
+        self.clear_zphd()
+
+        # Draw canvas
+        self.pr_canvas.draw()
+
+        self.tab_compass_2_data.setFocus()
+
+    # Temperature & Salinity Tab
+    # ==========================
+    def tempsal_tab(self, old_discharge=None):
+        """Initialize tempsal tab and associated settings.
+
+        Parameters
+        ----------
+        old_discharge: list
+            List of objects of QComp before changes are made
+        """
+
+        # Setup data table
+        tbl = self.table_tempsal
+        table_header = [
+            self.tr("Transect"),
+            self.tr("Temperature \n Source"),
+            self.tr("Average \n Temperature"),
+            self.tr("Average \n Salinity (ppt)"),
+            self.tr("Speed of \n Sound Source"),
+            self.tr("Speed of \n Sound" + self.units["label_V"]),
+            self.tr("Discharge \n Previous \n" + self.units["label_Q"]),
+            self.tr("Discharge \n Now \n" + self.units["label_Q"]),
+            self.tr("Discharge \n % Change"),
+        ]
+        ncols = len(table_header)
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(table_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        # Update the table, independent, and user temperatures
+        if old_discharge is None:
+            old_discharge = self.meas.discharge
+        self.update_tempsal_tab(
+            tbl=tbl, old_discharge=old_discharge, new_discharge=self.meas.discharge
+        )
+
+        # Display the times series plot of ADCP temperatures
+        self.plot_temperature()
+
+        if not self.tempsal_initialized:
+            tbl.cellClicked.connect(self.tempsal_table_clicked)
+
+            # Connect temperature units radio buttons
+            self.rb_c.toggled.connect(self.change_temp_units)
+            self.rb_f.toggled.connect(self.change_temp_units)
+
+            # Setup input validator for independent and adcp user temperature
+            reg_ex = QRegExp("^[0-9]*(\.\d*)")
+            input_validator = QtGui.QRegExpValidator(reg_ex, self)
+
+            # Connect independent and adcp input option
+            self.ed_user_temp.setValidator(input_validator)
+            self.ed_adcp_temp.setValidator(input_validator)
+            self.pb_ind_temp_apply.clicked.connect(self.apply_user_temp)
+            self.pb_adcp_temp_apply.clicked.connect(self.apply_adcp_temp)
+            self.ed_user_temp.textChanged.connect(self.user_temp_changed)
+            self.ed_adcp_temp.textChanged.connect(self.adcp_temp_changed)
+            self.tempsal_initialized = True
+
+        self.canvases = [self.tts_canvas]
+        self.toolbars = [self.tts_toolbar]
+        self.figs = [self.tts_fig]
+        self.fig_calls = [self.plot_temperature]
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+    def update_tempsal_tab(self, tbl, old_discharge, new_discharge):
+        """Updates all data displayed on the tempsal tab.
+
+        Parameters
+        ----------
+        tbl: QWidget
+            Reference to QTableWidget
+        old_discharge: list
+            List of objects of QComp with previous settings
+        new_discharge: list
+            List of objects of QComp  after change applied
+        """
+
+        # Initialize array to accumalate all temperature data
+        temp_all = np.array([])
+
+        for row in range(tbl.rowCount()):
+            # Identify transect associated with the row
+            transect_id = self.checked_transects_idx[row]
+
+            # File/transect name
+            col = 0
+            item = QtWidgets.QTableWidgetItem(
+                self.meas.transects[transect_id].file_name[:-4]
+            )
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Temperature source
+            col += 1
+            item = self.tr("Internal (ADCP)")
+            if (
+                self.meas.transects[transect_id].sensors.temperature_deg_c.selected
+                == "user"
+            ):
+                item = "User"
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Average temperature for transect
+            col += 1
+            temp = getattr(
+                self.meas.transects[transect_id].sensors.temperature_deg_c,
+                self.meas.transects[transect_id].sensors.temperature_deg_c.selected,
+            )
+            temp_converted = temp.data
+            if self.rb_f.isChecked():
+                temp_converted = convert_temperature(
+                    temp_in=temp.data, units_in="C", units_out="F"
+                )
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:3.1f}".format(np.nanmean(temp_converted))
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Salinity for transect
+            col += 1
+            sal = getattr(
+                self.meas.transects[transect_id].sensors.salinity_ppt,
+                self.meas.transects[transect_id].sensors.salinity_ppt.selected,
+            )
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem("{:3.1f}".format(np.nanmean(sal.data))),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Speed of sound source
+            col += 1
+            item = self.tr("User")
+            if (
+                self.meas.transects[transect_id].sensors.speed_of_sound_mps.selected
+                == "internal"
+            ):
+                if (
+                    self.meas.transects[
+                        transect_id
+                    ].sensors.speed_of_sound_mps.internal.source.strip()
+                    == "Calculated"
+                ):
+                    item = self.tr("Internal (ADCP)")
+                else:
+                    item = self.tr("Computed")
+
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Average speed of sound
+            col += 1
+            sos = getattr(
+                self.meas.transects[transect_id].sensors.speed_of_sound_mps,
+                self.meas.transects[transect_id].sensors.speed_of_sound_mps.selected,
+            )
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:3.1f}".format(np.nanmean(sos.data) * self.units["V"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Discharge before changes
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:8}".format(
+                        self.q_digits(
+                            old_discharge[transect_id].total * self.units["Q"]
+                        )
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Discharge after changes
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:8}".format(
+                        self.q_digits(
+                            new_discharge[transect_id].total * self.units["Q"]
+                        )
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Percent change in discharge
+            col += 1
+            if np.abs(old_discharge[transect_id].total) > 0:
+                per_change = (
+                    (
+                        new_discharge[transect_id].total
+                        - old_discharge[transect_id].total
+                    )
+                    / old_discharge[transect_id].total
+                ) * 100
+                tbl.setItem(
+                    row, col, QtWidgets.QTableWidgetItem("{:3.1f}".format(per_change))
+                )
+            else:
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Accumulate all temperature data in a single array used to compute
+            # mean temperature
+            temp_all = np.append(
+                temp_all,
+                self.meas.transects[
+                    transect_id
+                ].sensors.temperature_deg_c.internal.data,
+            )
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+        # Display independent temperature reading, if available
+        try:
+            if np.isnan(self.meas.ext_temp_chk["user"]):
+                self.ed_user_temp.setText("")
+                self.pb_ind_temp_apply.setEnabled(False)
+                self.label_independent.setStyleSheet(
+                    "background: #ffcc00; "
+                    "font: 12pt MS Shell Dlg"
+                    " 2;QToolTip{font: 12pt}"
+                )
+                self.label_independent.setToolTip(
+                    self.tr("No user supplied " "temperature.")
+                )
+            else:
+                temp = float(self.meas.ext_temp_chk["user"])
+                if self.rb_f.isChecked():
+                    temp = convert_temperature(
+                        self.meas.ext_temp_chk["user"], units_in="C", units_out="F"
+                    )
+                self.ed_user_temp.setText("{:3.1f}".format(temp))
+                self.pb_ind_temp_apply.setEnabled(False)
+                self.label_independent.setStyleSheet(
+                    "background: white; font:" " 12pt MS Shell Dlg 2"
+                )
+        except (ValueError, TypeError):
+            self.ed_user_temp.setText("")
+            self.pb_ind_temp_apply.setEnabled(False)
+
+        # Display user provided adcp temperature reading if available
+        if np.isnan(self.meas.ext_temp_chk["adcp"]):
+            self.ed_adcp_temp.setText("")
+            self.pb_adcp_temp_apply.setEnabled(False)
+        else:
+            try:
+                temp = float(self.meas.ext_temp_chk["adcp"])
+                if self.rb_f.isChecked():
+                    temp = convert_temperature(
+                        self.meas.ext_temp_chk["adcp"], units_in="C", units_out="F"
+                    )
+                self.ed_adcp_temp.setText("{:3.1f}".format(temp))
+                self.pb_adcp_temp_apply.setEnabled(False)
+            except (ValueError, TypeError):
+                self.ed_adcp_temp.setText("")
+                self.pb_adcp_temp_apply.setEnabled(False)
+
+        # Display mean temperature measured by ADCP
+        temp = np.nanmean(temp_all)
+        if self.rb_f.isChecked():
+            temp = convert_temperature(temp, units_in="C", units_out="F")
+        self.txt_adcp_avg.setText("{:3.1f}".format(temp))
+
+        # Display comments and messages in messages tab
+        self.tempsal_comments_messages()
+
+    @QtCore.pyqtSlot(int, int)
+    def tempsal_table_clicked(self, row, column):
+        """Coordinates changes to the temperature, salinity, and speed of
+        sound settings based on the column in the table clicked by the user.
+
+        Parameters
+        ----------
+        row: int
+            row clicked by user
+        column: int
+            column clicked by user
+        """
+
+        tbl = self.table_tempsal
+        transect_id = self.checked_transects_idx[row]
+        tbl.blockSignals(True)
+
+        # Change temperature
+        if column == 1:
+            user_temp = None
+
+            # Intialize dialog for user input
+            t_source_dialog = TempSource(self)
+            if (
+                self.meas.transects[transect_id].sensors.temperature_deg_c.selected
+                == "internal"
+            ):
+                t_source_dialog.rb_internal.setChecked(True)
+            else:
+                t_source_dialog.rb_user.setChecked(True)
+
+            if self.rb_f.isChecked():
+                t_source_dialog.rb_user.setText(self.tr("User (F)"))
+                if (
+                    self.meas.transects[transect_id].sensors.temperature_deg_c.user
+                    is not None
+                ):
+                    display_temp = convert_temperature(
+                        self.meas.transects[
+                            transect_id
+                        ].sensors.temperature_deg_c.user.data[0],
+                        units_in="C",
+                        units_out="F",
+                    )
+                else:
+                    display_temp = ""
+            else:
+                t_source_dialog.rb_user.setText(self.tr("User (C)"))
+                if (
+                    self.meas.transects[transect_id].sensors.temperature_deg_c.user
+                    is not None
+                ):
+                    display_temp = self.meas.transects[
+                        transect_id
+                    ].sensors.temperature_deg_c.user.data[0]
+                else:
+                    display_temp = ""
+            if type(display_temp) is str:
+                t_source_dialog.ed_user_temp.setText(display_temp)
+            else:
+                t_source_dialog.ed_user_temp.setText("{:3.1f}".format(display_temp))
+            t_source_entered = t_source_dialog.exec_()
+
+            if t_source_entered:
+                with self.wait_cursor():
+                    # Assign data based on change made by user
+                    old_discharge = copy.deepcopy(self.meas.discharge)
+                    if t_source_dialog.rb_internal.isChecked():
+                        t_source = "internal"
+                    elif t_source_dialog.rb_user.isChecked():
+                        t_source = "user"
+                        try:
+                            user_temp = float(t_source_dialog.ed_user_temp.text())
+                            if self.rb_f.isChecked():
+                                user_temp = convert_temperature(
+                                    user_temp, units_in="F", units_out="C"
+                                )
+                        except ValueError:
+                            t_source = "internal"
+
+                    # Apply change to all or only selected transect based on
+                    # user input
+                    if t_source_dialog.rb_all.isChecked():
+                        self.meas.change_sos(
+                            parameter="temperatureSrc",
+                            temperature=user_temp,
+                            selected=t_source,
+                        )
+                    else:
+                        self.meas.change_sos(
+                            transect_idx=self.checked_transects_idx[row],
+                            parameter="temperatureSrc",
+                            temperature=user_temp,
+                            selected=t_source,
+                        )
+
+                    # Update the tempsal tab
+                    self.meas.qa.check_tempsal_settings(self.meas)
+                    self.update_tempsal_tab(
+                        tbl=tbl,
+                        old_discharge=old_discharge,
+                        new_discharge=self.meas.discharge,
+                    )
+                    self.change = True
+
+        # Change salinity
+        elif column == 3:
+
+            # Intialize dialog for user input
+            salinity_dialog = Salinity(self)
+            salinity_entered = salinity_dialog.exec_()
+
+            if salinity_entered:
+                with self.wait_cursor():
+                    # Assign data based on change made by user
+                    old_discharge = copy.deepcopy(self.meas.discharge)
+                    try:
+                        salinity = float(salinity_dialog.ed_salinity.text())
+
+                        # Apply change to all or only selected transect based on user input
+                        if salinity_dialog.rb_all.isChecked():
+                            self.meas.change_sos(
+                                parameter="salinity", salinity=salinity
+                            )
+                        else:
+                            self.meas.change_sos(
+                                transect_idx=self.checked_transects_idx[row],
+                                parameter="salinity",
+                                salinity=salinity,
+                            )
+                        # Update the tempsal tab
+                        self.meas.qa.check_tempsal_settings(self.meas)
+                        self.update_tempsal_tab(
+                            tbl=tbl,
+                            old_discharge=old_discharge,
+                            new_discharge=self.meas.discharge,
+                        )
+                        self.change = True
+                    except ValueError:
+                        pass
+
+        # Change speed of sound
+        elif column == 4:
+            user_sos = None
+
+            # Initialize dialog for user input
+            sos_setting = self.meas.transects[
+                transect_id
+            ].sensors.speed_of_sound_mps.selected
+            sos = None
+            if sos_setting == "user":
+                sos = getattr(
+                    self.meas.transects[transect_id].sensors.speed_of_sound_mps,
+                    self.meas.transects[
+                        transect_id
+                    ].sensors.speed_of_sound_mps.selected,
+                ).data[0]
+
+            sos_source_dialog = SOSSource(self.units, setting=sos_setting, sos=sos)
+            sos_source_entered = sos_source_dialog.exec_()
+
+            if sos_source_entered:
+                with self.wait_cursor():
+                    # Assign data based on change made by user
+                    old_discharge = copy.deepcopy(self.meas.discharge)
+                    if sos_source_dialog.rb_internal.isChecked():
+                        sos_source = "internal"
+                    elif sos_source_dialog.rb_user.isChecked():
+                        sos_source = "user"
+                        try:
+                            user_sos = (
+                                float(sos_source_dialog.ed_sos_user.text())
+                                / self.units["V"]
+                            )
+                        except ValueError:
+                            sos_source = "internal"
+
+                    # Apply change to all or only selected transect based on
+                    # user input
+                    if sos_source_dialog.rb_all.isChecked():
+                        self.meas.change_sos(
+                            parameter="sosSrc", speed=user_sos, selected=sos_source
+                        )
+                    else:
+                        self.meas.change_sos(
+                            transect_idx=self.checked_transects_idx[row],
+                            parameter="sosSrc",
+                            speed=user_sos,
+                            selected=sos_source,
+                        )
+
+                    # Update the tempsal tab
+                    self.meas.qa.check_tempsal_settings(self.meas)
+                    self.update_tempsal_tab(
+                        tbl=tbl,
+                        old_discharge=old_discharge,
+                        new_discharge=self.meas.discharge,
+                    )
+                    self.change = True
+
+        tbl.blockSignals(False)
+
+    def tempsal_comments_messages(self):
+        """Displays comments and messages associated with temperature,
+        salinity, and speed of sound in Messages tab.
+        """
+
+        # Clear comments and messages
+        self.display_tempsal_comments.clear()
+        self.display_tempsal_messages.clear()
+
+        if self.meas is not None:
+            # Display each comment on a new line
+            self.display_tempsal_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                self.display_tempsal_comments.textCursor().insertText(comment)
+                self.display_tempsal_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_tempsal_comments.textCursor().insertBlock()
+
+            # Display each message on a new line
+            self.display_tempsal_messages.moveCursor(QtGui.QTextCursor.Start)
+            for message in self.meas.qa.temperature["messages"]:
+                if type(message) is str:
+                    self.display_tempsal_messages.textCursor().insertText(message)
+                else:
+                    self.display_tempsal_messages.textCursor().insertText(message[0])
+                self.display_tempsal_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_tempsal_messages.textCursor().insertBlock()
+            self.update_tab_icons()
+
+    def plot_temperature(self):
+        """Generates the graph of temperature."""
+
+        if self.tts_canvas is None:
+            # Create the canvas
+            self.tts_canvas = MplCanvas(
+                self.graph_temperature, width=4, height=2, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_temperature)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.tts_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.tts_toolbar = NavigationToolbar(self.tts_canvas, self)
+            self.tts_toolbar.hide()
+
+        # Initialize the temperature figure and assign to the canvas
+        self.tts_fig = TemperatureTS(canvas=self.tts_canvas)
+        # Create the figure with the specified data
+        self.tts_fig.create(meas=self.meas, rb_f=self.rb_f)
+
+        # Draw canvas
+        self.tts_canvas.draw()
+
+    def change_temp_units(self):
+        """Updates the display when the user changes the temperature units.
+        Note: changing the units does not change the actual data only the units
+        used to display the data.
+        """
+
+        self.update_tempsal_tab(
+            tbl=self.table_tempsal,
+            old_discharge=self.meas.discharge,
+            new_discharge=self.meas.discharge,
+        )
+
+        self.plot_temperature()
+
+    def apply_user_temp(self):
+        """Applies a user entered value for the independent temperature.
+        This change does not affect the measured discharge but could change
+        the automatic QA/QC messages.
+        """
+
+        # Set cursor focus onto the table to avoid multiple calls the the
+        # adcp_temp_changed function
+        self.table_tempsal.setFocus()
+
+        # If data has been entered, convert the data to Celsius if necessary
+        if len(self.ed_user_temp.text()) > 0:
+            temp = float(self.ed_user_temp.text())
+            if self.rb_f.isChecked():
+                temp = convert_temperature(temp, "F", "C")
+            self.label_independent.setStyleSheet(
+                "background: white; font: 12pt MS Shell Dlg 2"
+            )
+        else:
+            temp = np.nan
+
+        # Update the measurement with the new ADCP temperature
+        self.meas.ext_temp_chk["user"] = temp
+
+        # Apply qa checks
+        self.meas.qa.temperature_qa(self.meas)
+        self.meas.qa.check_tempsal_settings(self.meas)
+
+        # Update GUI
+        try:
+            if np.isnan(self.meas.ext_temp_chk["user"]):
+                self.ed_user_temp.setText("")
+                self.pb_ind_temp_apply.setEnabled(False)
+                self.label_independent.setStyleSheet(
+                    "background: #ffcc00; font: 12pt MS Shell Dlg "
+                    "2;QToolTip{font: 12pt}"
+                )
+                self.label_independent.setToolTip(
+                    self.tr("No user supplied temperature.")
+                )
+            else:
+                temp = float(self.meas.ext_temp_chk["user"])
+                if self.rb_f.isChecked():
+                    temp = convert_temperature(
+                        self.meas.ext_temp_chk["user"], units_in="C", units_out="F"
+                    )
+                self.ed_user_temp.setText("{:3.1f}".format(temp))
+                self.pb_ind_temp_apply.setEnabled(False)
+                self.label_independent.setStyleSheet(
+                    "background: white; font: 12pt MS Shell Dlg 2"
+                )
+        except (ValueError, TypeError):
+            self.ed_user_temp.setText("")
+            self.pb_ind_temp_apply.setEnabled(False)
+        self.tempsal_comments_messages()
+        self.pb_ind_temp_apply.setEnabled(False)
+        self.change = True
+
+    def apply_adcp_temp(self):
+        """Applies a user entered value for the ADCP temperature. This
+        change does not affect the measured discharge but could change the
+        automatic QA/QC messages.
+        """
+
+        # Set cursor focus onto the table to avoid multiple calls the the
+        # adcp_temp_changed funtion
+        self.table_tempsal.setFocus()
+
+        # If data has been entered, convert the data to Celsius if necessary
+        if len(self.ed_adcp_temp.text()) > 0:
+            temp = float(self.ed_adcp_temp.text())
+            if self.rb_f.isChecked():
+                temp = convert_temperature(temp, "F", "C")
+        else:
+            temp = np.nan
+
+        # Update the measurement with the new ADCP temperature
+        self.meas.ext_temp_chk["adcp"] = temp
+
+        # Apply qa checks
+        self.meas.qa.temperature_qa(self.meas)
+        self.meas.qa.check_tempsal_settings(self.meas)
+
+        # Update GUI
+        self.tempsal_comments_messages()
+        self.pb_adcp_temp_apply.setEnabled(False)
+        self.change = True
+
+    def user_temp_changed(self):
+        """Enables the apply button if the user enters a valid value in the
+        independent temp box.
+        """
+
+        self.pb_ind_temp_apply.setEnabled(True)
+
+    def adcp_temp_changed(self):
+        """Enables the apply button if the user enters a valid value in the
+        ADCP temp box.
+        """
+
+        self.pb_adcp_temp_apply.setEnabled(True)
+
+    # Moving-Bed Test Tab
+    # ===================
+    def movbedtst_tab(self):
+        """Initialize, setup settings, and display initial data in
+        moving-bed test tab.
+        """
+
+        # Setup data table
+        tbl = self.table_moving_bed
+        table_header = [
+            self.tr("User \n Valid"),
+            self.tr("Used for \n Correction"),
+            self.tr("Use GPS \n for Test"),
+            self.tr("Filename"),
+            self.tr("Type"),
+            self.tr("Duration \n (s)"),
+            self.tr("Distance \n Upstream" + self.units["label_L"]),
+            self.tr("Moving-Bed \n Speed" + self.units["label_V"]),
+            self.tr("Moving-Bed \n Direction (deg)"),
+            self.tr("Flow \n Speed" + self.units["label_V"]),
+            self.tr("Flow \n Direction (deg)"),
+            self.tr("% Invalid \n BT"),
+            self.tr("Compass \n Error (deg"),
+            self.tr("% Moving \n Bed"),
+            self.tr("Moving \n Bed"),
+            self.tr("Quality"),
+        ]
+
+        ncols = len(table_header)
+        nrows = len(self.meas.mb_tests)
+
+        # Display option to manually certify there is no moving bed, if the
+        # option is available or if the loaded data used that option.
+        if nrows == 0 and (
+            self.allow_observed_no_moving_bed or self.meas.observed_no_moving_bed
+        ):
+            self.cb_mb_observed_no.show()
+            self.cb_mb_observed_no.setChecked(self.meas.observed_no_moving_bed)
+        else:
+            self.cb_mb_observed_no.hide()
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(table_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        # Automatically resize rows and columns
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+        # Display content
+        self.update_mb_table()
+        self.mb_comments_messages()
+
+        if not self.mb_initialized:
+            tbl.cellClicked.connect(self.mb_table_clicked)
+
+            # Initialize checkbox settings
+            self.cb_mb_bt.setCheckState(QtCore.Qt.Checked)
+            self.cb_mb_gga.setCheckState(QtCore.Qt.Unchecked)
+            self.cb_mb_vtg.setCheckState(QtCore.Qt.Unchecked)
+            self.cb_mb_vectors.setCheckState(QtCore.Qt.Checked)
+
+            # Connect plot variable checkboxes
+            self.cb_mb_bt.stateChanged.connect(self.mb_plot_change)
+            self.cb_mb_gga.stateChanged.connect(self.mb_plot_change)
+            self.cb_mb_vtg.stateChanged.connect(self.mb_plot_change)
+            self.cb_mb_vectors.stateChanged.connect(self.mb_plot_change)
+            self.cb_mb_observed_no.stateChanged.connect(self.mb_observed_change)
+
+            self.mb_initialized = True
+        self.mb_row = self.mb_row_selected
+        self.mb_plots(idx=self.mb_row_selected)
+
+    def update_mb_table(self):
+        """Populates the moving-bed table with the current settings and data."""
+
+        with self.wait_cursor():
+
+            tbl = self.table_moving_bed
+            tbl.blockSignals(True)
+            self.mb_row_selected = 0
+            has_gps = []
+            # Hide GPS column unless GPS data are used
+            tbl.setColumnHidden(2, True)
+            # Populate each row
+            for row in range(tbl.rowCount()):
+
+                # User Valid
+                col = 0
+                checked = QtWidgets.QTableWidgetItem("")
+                checked.setFlags(
+                    QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(checked))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if self.meas.mb_tests[row].user_valid:
+                    tbl.item(row, col).setCheckState(QtCore.Qt.Checked)
+                else:
+                    tbl.item(row, col).setCheckState(QtCore.Qt.Unchecked)
+
+                # Use for Correction
+                col += 1
+                checked2 = QtWidgets.QTableWidgetItem("")
+                checked2.setFlags(
+                    QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(checked2))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                tbl.item(row, col).setCheckState(QtCore.Qt.Unchecked)
+                if self.meas.mb_tests[row].use_2_correct:
+                    if self.meas.mb_tests[row].selected:
+                        tbl.item(row, col).setCheckState(QtCore.Qt.Checked)
+
+                # Use GPS for test
+                col += 1
+                checked3 = QtWidgets.QTableWidgetItem("")
+                checked3.setFlags(
+                    QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(checked3))
+                tbl.item(row, col).setCheckState(QtCore.Qt.Unchecked)
+                if self.meas.mb_tests[row].ref == "GPS":
+                    tbl.item(row, col).setCheckState(QtCore.Qt.Checked)
+                has_gps.append(
+                    np.logical_not(np.isnan(self.meas.mb_tests[row].gps_percent_mb))
+                )
+
+                # Filename
+                col += 1
+                item = os.path.basename(self.meas.mb_tests[row].transect.file_name)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item[:-4]))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if self.meas.mb_tests[row].selected:
+                    tbl.item(row, col).setFont(self.font_bold)
+                    self.mb_row_selected = row
+
+                # Type
+                col += 1
+                tbl.setItem(
+                    row, col, QtWidgets.QTableWidgetItem(self.meas.mb_tests[row].type)
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Duration
+                col += 1
+                item = "{:4.1f}".format(self.meas.mb_tests[row].duration_sec)
+                if "nan" in item:
+                    item = ""
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Distance Upstream
+                col += 1
+                item = "{:4.1f}".format(
+                    self.meas.mb_tests[row].dist_us_m * self.units["L"]
+                )
+                if "nan" in item:
+                    item = ""
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Moving-Bed Speed
+                col += 1
+                item = "{:3.2f}".format(
+                    self.meas.mb_tests[row].mb_spd_mps * self.units["V"]
+                )
+                if "nan" in item:
+                    item = ""
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Moving-Bed Direction
+                col += 1
+                # Don't show direction for BT stationary
+                if np.isnan(self.meas.mb_tests[row].mb_dir):
+                    item = ""
+                else:
+                    item = "{:3.1f}".format(self.meas.mb_tests[row].mb_dir)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Flow Speed
+                col += 1
+                item = "{:3.1f}".format(
+                    self.meas.mb_tests[row].flow_spd_mps * self.units["V"]
+                )
+                if "nan" in item:
+                    item = ""
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Flow Direction
+                col += 1
+                if np.isnan(self.meas.mb_tests[row].flow_dir):
+                    item = ""
+                else:
+                    item = "{:3.1f}".format(self.meas.mb_tests[row].flow_dir)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent Invalid BT
+                col += 1
+                item = "{:3.1f}".format(self.meas.mb_tests[row].percent_invalid_bt)
+                if "nan" in item:
+                    item = ""
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Compass Error
+                col += 1
+                if type(self.meas.mb_tests[row].compass_diff_deg) is not list:
+                    item = "{:3.1f}".format(self.meas.mb_tests[row].compass_diff_deg)
+                    if "nan" in item:
+                        item = ""
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent Moving Bed
+                col += 1
+                item = "{:3.1f}".format(self.meas.mb_tests[row].percent_mb)
+                if "nan" in item:
+                    item = ""
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Moving Bed
+                col += 1
+                item = self.meas.mb_tests[row].moving_bed
+                if "nan" in item:
+                    item = ""
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Quality
+                col += 1
+                item = self.meas.mb_tests[row].test_quality
+                if "nan" in item:
+                    item = ""
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Automatically resize rows and columns
+                tbl.resizeColumnsToContents()
+                tbl.resizeRowsToContents()
+                tbl.blockSignals(False)
+
+            # If GPS data are used in any test, show GPS column
+            if any(has_gps):
+                tbl.setColumnHidden(2, False)
+
+    def mb_table_clicked(self, row, column):
+        """Manages actions caused by the user clicking in selected columns of the table.
+
+        Parameters
+        ----------
+        row: int
+            row in table clicked by user
+        column: int
+            column in table clicked by user
+        """
+
+        tbl = self.table_moving_bed
+        reprocess_measurement = True
+        tbl.blockSignals(True)
+
+        # User valid
+        if column == 0:
+            if tbl.item(row, 0).checkState() == QtCore.Qt.Checked:
+                self.meas.mb_tests[row].user_valid = False
+                self.add_comment()
+            else:
+                self.meas.mb_tests[row].user_valid = True
+                self.add_comment()
+
+            self.meas.mb_tests = MovingBedTests.auto_use_2_correct(
+                moving_bed_tests=self.meas.mb_tests,
+                boat_ref=self.meas.transects[
+                    self.checked_transects_idx[0]
+                ].w_vel.nav_ref,
+            )
+
+        # Use to correct, manual override
+        if column == 1:
+            if self.meas.transects[self.checked_transects_idx[0]].w_vel.nav_ref == "BT":
+                quality = tbl.item(row, 15).text()
+                # Identify a moving-bed condition
+                moving_bed_idx = []
+                for n, test in enumerate(self.meas.mb_tests):
+                    if test.selected:
+                        if test.moving_bed == "Yes":
+                            moving_bed_idx.append(n)
+
+                if quality == "Manual":
+                    # Cancel Manual
+                    self.meas.mb_tests[row].use_2_correct = False
+                    self.meas.mb_tests[row].moving_bed = "Unknown"
+                    self.meas.mb_tests[row].selected = False
+                    self.meas.mb_tests[row].test_quality = "Errors"
+                    self.meas.mb_tests = MovingBedTests.auto_use_2_correct(
+                        moving_bed_tests=self.meas.mb_tests,
+                        boat_ref=self.meas.transects[
+                            self.checked_transects_idx[0]
+                        ].w_vel.nav_ref,
+                    )
+
+                elif quality == "Errors":
+                    # Manual override
+                    # Warn user and force acknowledgement before proceeding
+                    user_warning = QtWidgets.QMessageBox.question(
+                        self,
+                        self.tr("Moving-Bed Test Manual Override"),
+                        self.tr(
+                            "QRev has determined this moving-bed test has"
+                            " critical errors and does not recommend "
+                            "using it for correction. If you choose to "
+                            "use the test anyway you will be required to "
+                            "justify its use."
+                        ),
+                        QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel,
+                        QtWidgets.QMessageBox.Cancel,
+                    )
+                    if user_warning == QtWidgets.QMessageBox.Ok:
+                        # Apply manual override
+                        self.add_comment()
+                        self.meas.mb_tests[row].use_2_correct = True
+                        self.meas.mb_tests[row].moving_bed = "Yes"
+                        self.meas.mb_tests[row].selected = True
+                        self.meas.mb_tests[row].test_quality = "Manual"
+                    else:
+                        reprocess_measurement = False
+
+                elif len(moving_bed_idx) > 0:
+                    if row in moving_bed_idx:
+                        if tbl.item(row, 1).checkState() == QtCore.Qt.Checked:
+                            self.meas.mb_tests[row].use_2_correct = False
+                            self.add_comment()
+                        else:
+                            # Apply setting
+                            self.meas.mb_tests[row].use_2_correct = True
+
+                            # Check to make sure the selected test are of the same type
+                            test_type = []
+                            test_quality = []
+                            for test in self.meas.mb_tests:
+                                if test.selected:
+                                    test_type.append(test.type)
+                                    test_quality = test.test_quality
+                            unique_types = set(test_type)
+                            if len(unique_types) == 1:
+
+                                # Check for errors
+                                if "Errors" not in test_quality:
+
+                                    # Multiple loops not allowed
+                                    if test_type == "Loop" and len(test_type) > 1:
+                                        self.meas.mb_tests[row].use_2_correct = False
+                                        reprocess_measurement = False
+                                        self.popup_message(
+                                            self.tr(
+                                                "Only one loop can be applied. "
+                                                "Select the best loop."
+                                            )
+                                        )
+
+                            else:
+                                # Mixing of stationary and loop tests are not allowed
+                                self.meas.mb_tests[row].use_2_correct = False
+                                reprocess_measurement = False
+                                self.popup_message(
+                                    self.tr(
+                                        "Application of mixed moving-bed test types is "
+                                        "not allowed.S elect only one loop or one or more"
+                                        "stationary tests."
+                                    )
+                                )
+                    else:
+                        self.popup_message(
+                            self.tr(
+                                "This moving-bed test is not being used. "
+                                "Only those tests with Bold file names can be used."
+                            )
+                        )
+
+                else:
+                    # No moving-bed, so no moving-bed correction is applied
+                    reprocess_measurement = False
+                    self.popup_message(
+                        self.tr("There is no moving-bed. Correction cannot be applied.")
+                    )
+            else:
+                self.popup_message(
+                    self.tr(
+                        "Bottom track is not the selected reference. "
+                        "A moving-bed correction cannot be applied."
+                    )
+                )
+
+        # Use GPS for Test
+        elif column == 2:
+            # Determine if selected test has been processed using GPS
+            if np.isnan(self.meas.mb_tests[row].gps_percent_mb):
+                tbl.item(row, column).setCheckState(QtCore.Qt.Unchecked)
+                reprocess_measurement = False
+                self.change = False
+            else:
+                if tbl.item(row, column).checkState() == QtCore.Qt.Checked:
+                    self.meas.mb_tests[row].change_ref(ref="GPS")
+                else:
+                    self.meas.mb_tests[row].change_ref(ref="BT")
+                self.meas.mb_tests = MovingBedTests.auto_use_2_correct(
+                    moving_bed_tests=self.meas.mb_tests,
+                    boat_ref=self.meas.transects[
+                        self.checked_transects_idx[0]
+                    ].w_vel.nav_ref,
+                )
+
+        # Data to plot
+        elif column == 3:
+            self.mb_plots(idx=row)
+            self.mb_row = row
+            reprocess_measurement = False
+            self.change = False
+
+        # If changes were made reprocess the measurement
+        if reprocess_measurement:
+            with self.wait_cursor():
+                self.meas.compute_discharge()
+                self.meas.compute_uncertainty()
+                self.meas.qa.moving_bed_qa(self.meas)
+                self.change = True
+
+        self.update_mb_table()
+        self.mb_comments_messages()
+
+        tbl.blockSignals(False)
+        self.tab_mbt_2_data.setFocus()
+
+    def mb_plots(self, idx=0):
+        """Creates graphics specific to the type of moving-bed test.
+
+        Parameters
+        ----------
+        idx: int
+            Index of the test to be plotted.
+        """
+        self.cb_mb_bt.blockSignals(True)
+        self.cb_mb_gga.blockSignals(True)
+        self.cb_mb_vtg.blockSignals(True)
+        self.cb_mb_vectors.blockSignals(True)
+
+        if self.mb_shiptrack_fig is not None:
+            self.mb_shiptrack_fig.fig.clear()
+            self.mb_ts_fig.fig.clear()
+            self.mb_shiptrack_canvas.draw()
+            self.mb_ts_canvas.draw()
+
+        if len(self.meas.mb_tests) > 0:
+            # Show name of test plotted
+            try:
+                item = os.path.basename(self.meas.mb_tests[idx].transect.file_name)
+            except IndexError:
+                item = self.meas.mb_tests[idx].transect.file_name
+            self.txt_mb_plotted.setText(item[:-4])
+
+            # Always show the shiptrack plot
+            self.mb_shiptrack(transect=self.meas.mb_tests[idx].transect)
+
+            # Determine what plots to display based on test type
+            if self.meas.mb_tests[idx].type == "Loop":
+                self.mb_boat_speed(transect=self.meas.mb_tests[idx].transect)
+            else:
+                self.stationary(mb_test=self.meas.mb_tests[idx])
+
+            # Setup list for use by graphics controls
+            self.canvases = [self.mb_shiptrack_canvas, self.mb_ts_canvas]
+            self.figs = [self.mb_shiptrack_fig, self.mb_ts_fig]
+            self.fig_calls = [self.mb_shiptrack, self.mb_plots]
+            self.toolbars = [self.mb_shiptrack_toolbar, self.mb_ts_toolbar]
+            self.ui_parents = [i.parent() for i in self.canvases]
+            self.figs_menu_connection()
+
+            # Reset data cursor to work with new figure
+            if self.actionData_Cursor.isChecked():
+                self.data_cursor()
+        else:
+            # Disable user checkboxes if no tests are available
+            self.cb_mb_bt.setEnabled(False)
+            self.cb_mb_gga.setEnabled(False)
+            self.cb_mb_vtg.setEnabled(False)
+            self.cb_mb_vectors.setEnabled(False)
+            self.txt_mb_plotted.setText("")
+
+        self.cb_mb_bt.blockSignals(False)
+        self.cb_mb_gga.blockSignals(False)
+        self.cb_mb_vtg.blockSignals(False)
+        self.cb_mb_vectors.blockSignals(False)
+
+    def mb_shiptrack(self, transect):
+        """Creates shiptrack plot for data in transect.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData with data to be plotted.
+        """
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.mb_shiptrack_canvas is None:
+            # Create the canvas
+            self.mb_shiptrack_canvas = MplCanvas(
+                parent=self.graph_mb_st, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_mb_st)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.mb_shiptrack_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.mb_shiptrack_toolbar = NavigationToolbar(
+                self.mb_shiptrack_canvas, self
+            )
+            self.mb_shiptrack_toolbar.hide()
+
+        # Initialize the shiptrack figure and assign to the canvas
+        self.mb_shiptrack_fig = Shiptrack(canvas=self.mb_shiptrack_canvas)
+        # Create the figure with the specified data
+        self.mb_shiptrack_fig.create(
+            transect=transect,
+            units=self.units,
+            cb=True,
+            cb_bt=self.cb_mb_bt,
+            cb_gga=self.cb_mb_gga,
+            cb_vtg=self.cb_mb_vtg,
+            cb_vectors=self.cb_mb_vectors,
+            edge_start=True,
+        )
+
+        # Draw canvas
+        self.mb_shiptrack_canvas.draw()
+
+    def mb_boat_speed(self, transect):
+        """Creates boat speed plot for data in transect.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData with data to be plotted.
+        """
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.mb_ts_canvas is None:
+            # Create the canvas
+            self.mb_ts_canvas = MplCanvas(
+                parent=self.graph_mb_ts, width=8, height=2, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_mb_ts)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.mb_ts_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.mb_ts_toolbar = NavigationToolbar(self.mb_ts_canvas, self)
+            self.mb_ts_toolbar.hide()
+
+        # Initialize the boat speed figure and assign to the canvas
+        self.mb_ts_fig = BoatSpeed(canvas=self.mb_ts_canvas)
+        # Create the figure with the specified data
+        self.mb_ts_fig.create(
+            transect=transect,
+            units=self.units,
+            cb=True,
+            cb_bt=self.cb_mb_bt,
+            cb_gga=self.cb_mb_gga,
+            cb_vtg=self.cb_mb_vtg,
+            x_axis_type=self.x_axis_type,
+        )
+
+        # Draw canvas
+        self.mb_ts_canvas.draw()
+
+    def stationary(self, mb_test):
+        """Creates the plots for analyzing stationary moving-bed tests.
+
+        Parameters
+        ----------
+        mb_test: MovingBedTests
+            Object of MovingBedTests with data to be plotted.
+        """
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.mb_ts_canvas is None:
+            # Create the canvas
+            self.mb_ts_canvas = MplCanvas(
+                parent=self.graph_mb_ts, width=8, height=2, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_mb_ts)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add canvas
+            layout.addWidget(self.mb_ts_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.mb_ts_toolbar = NavigationToolbar(self.mb_ts_canvas, self)
+            self.mb_ts_toolbar.hide()
+
+        # Initialize the stationary figure and assign to the canvas
+        self.mb_ts_fig = StationaryGraphs(canvas=self.mb_ts_canvas)
+        # Create the figure with the specified data
+        self.mb_ts_fig.create(
+            mb_test=mb_test, units=self.units, x_axis_type=self.x_axis_type
+        )
+        # Draw canvas
+        self.mb_ts_canvas.draw()
+
+    def mb_plot_change(self):
+        """Coordinates changes in what references should be displayed in the
+        boat speed and shiptrack plots.
+        """
+
+        # Shiptrack
+        self.mb_shiptrack_fig.change()
+
+        # Boat speed
+        # Note if mb_ts_fig is set to stationary the StationaryGraphs class
+        # has a change method with does nothing, to maintain compatibility.
+        self.mb_ts_fig.change()
+        self.tab_mbt_2_data.setFocus()
+
+    def mb_observed_change(self):
+        """Sets observation of no moving bed."""
+
+        with self.wait_cursor():
+            if self.cb_mb_observed_no.isChecked():
+                self.meas.observed_no_moving_bed = True
+            else:
+                self.meas.observed_no_moving_bed = False
+
+            self.meas.compute_discharge()
+            self.meas.compute_uncertainty()
+            self.meas.qa.moving_bed_qa(self.meas)
+            self.update_tab_icons()
+            self.change = True
+
+    def mb_comments_messages(self):
+        """Displays comments and messages associated with moving-bed tests
+        in Messages tab.
+        """
+
+        # Clear comments and messages
+        self.display_mb_comments.clear()
+        self.display_mb_messages.clear()
+
+        if self.meas is not None:
+            # Display each comment on a new line
+            self.display_mb_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                self.display_mb_comments.textCursor().insertText(comment)
+                self.display_mb_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_mb_comments.textCursor().insertBlock()
+
+            # Display each message on a new line
+            self.display_mb_messages.moveCursor(QtGui.QTextCursor.Start)
+            for message in self.meas.qa.movingbed["messages"]:
+                if type(message) is str:
+                    self.display_mb_messages.textCursor().insertText(message)
+                else:
+                    self.display_mb_messages.textCursor().insertText(message[0])
+                self.display_mb_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_mb_messages.textCursor().insertBlock()
+
+            for test in self.meas.mb_tests:
+                test_file = test.transect.file_name[:-4]
+                if len(test.messages) > 0:
+                    self.display_mb_messages.textCursor().insertText(" ")
+                    self.display_mb_messages.moveCursor(QtGui.QTextCursor.End)
+                    self.display_mb_messages.textCursor().insertBlock()
+                    self.display_mb_messages.textCursor().insertText(test_file)
+                    self.display_mb_messages.moveCursor(QtGui.QTextCursor.End)
+                    self.display_mb_messages.textCursor().insertBlock()
+                    for message in test.messages:
+                        self.display_mb_messages.textCursor().insertText(message)
+                        self.display_mb_messages.moveCursor(QtGui.QTextCursor.End)
+                        self.display_mb_messages.textCursor().insertBlock()
+
+            self.update_tab_icons()
+
+    # Bottom track tab
+    # ================
+    def bt_tab(self, old_discharge=None):
+        """Initialize, setup settings, and display initial data in bottom
+        track tab.
+
+        Parameters
+        ----------
+        old_discharge: list
+            List of objects of QComp with previous settings
+        """
+
+        # Setup data table
+        tbl = self.table_bt
+        table_header = [
+            self.tr("Filename"),
+            self.tr("Number or \n Ensembles"),
+            self.tr("Beam \n % <4"),
+            self.tr("Total \n % Invalid"),
+            self.tr("Orig Data \n % Invalid"),
+            self.tr("<4 Beam \n % Invalid"),
+            self.tr("Error Vel \n % Invalid"),
+            self.tr("Vert Vel \n % Invalid"),
+            self.tr("Other \n % Invalid"),
+            self.tr("Discharge \n Previous \n" + self.units["label_Q"]),
+            self.tr("Discharge \n Now \n" + self.units["label_Q"]),
+            self.tr("Discharge \n % Change"),
+        ]
+        ncols = len(table_header)
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(table_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        tbl.setStyleSheet("QToolTip{font: 12pt}")
+
+        # Automatically resize rows and columns
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+        # Intialize connections
+        if not self.bt_initialized:
+            tbl.cellClicked.connect(self.bt_table_clicked)
+
+            # Connect plot variable checkboxes
+            self.cb_bt_bt.stateChanged.connect(self.bt_plot_change)
+            self.cb_bt_gga.stateChanged.connect(self.bt_plot_change)
+            self.cb_bt_vtg.stateChanged.connect(self.bt_plot_change)
+            self.cb_bt_vectors.stateChanged.connect(self.bt_plot_change)
+
+            # Connect radio buttons
+            self.rb_bt_beam.toggled.connect(self.bt_radiobutton_control)
+            self.rb_bt_error.toggled.connect(self.bt_radiobutton_control)
+            self.rb_bt_vert.toggled.connect(self.bt_radiobutton_control)
+            self.rb_bt_other.toggled.connect(self.bt_radiobutton_control)
+            self.rb_bt_source.toggled.connect(self.bt_radiobutton_control)
+
+            # Connect manual entry
+            self.ed_bt_error_vel_threshold.editingFinished.connect(
+                self.change_error_vel_threshold
+            )
+            self.ed_bt_vert_vel_threshold.editingFinished.connect(
+                self.change_vert_vel_threshold
+            )
+
+            # Connect filters
+            self.combo_bt_3beam.currentIndexChanged[str].connect(self.change_bt_beam)
+            self.combo_bt_error_velocity.activated[str].connect(self.change_bt_error)
+            self.combo_bt_vert_velocity.currentIndexChanged[str].connect(
+                self.change_bt_vertical
+            )
+            self.combo_bt_other.currentIndexChanged[str].connect(self.change_bt_other)
+
+            self.bt_initialized = True
+
+        selected = self.meas.transects[self.checked_transects_idx[0]].boat_vel.selected
+
+        # Turn signals off
+        self.cb_bt_bt.blockSignals(True)
+        self.cb_bt_gga.blockSignals(True)
+        self.cb_bt_vtg.blockSignals(True)
+        self.cb_bt_vectors.blockSignals(True)
+        self.combo_bt_3beam.blockSignals(True)
+        self.combo_bt_error_velocity.blockSignals(True)
+        self.combo_bt_vert_velocity.blockSignals(True)
+        self.combo_bt_other.blockSignals(True)
+
+        if selected == "gga_vel":
+            self.cb_bt_gga.setChecked(True)
+        elif selected == "vtg_vel":
+            self.cb_bt_vtg.setChecked(True)
+
+        self.cb_bt_vectors.setChecked(True)
+
+        # Transect selected for display
+        self.transect = self.meas.transects[
+            self.checked_transects_idx[self.transect_row]
+        ]
+
+        # Set beam filter from transect data
+        if self.transect.boat_vel.bt_vel.beam_filter < 0:
+            self.combo_bt_3beam.setCurrentIndex(0)
+        elif self.transect.boat_vel.bt_vel.beam_filter == 3:
+            self.combo_bt_3beam.setCurrentIndex(1)
+        elif self.transect.boat_vel.bt_vel.beam_filter == 4:
+            self.combo_bt_3beam.setCurrentIndex(2)
+        else:
+            self.combo_bt_3beam.setCurrentIndex(0)
+
+        # Set error velocity filter from transect data
+        index = self.combo_bt_error_velocity.findText(
+            self.transect.boat_vel.bt_vel.d_filter, QtCore.Qt.MatchFixedString
+        )
+        self.combo_bt_error_velocity.setCurrentIndex(index)
+
+        s = self.meas.current_settings()
+
+        if self.transect.boat_vel.bt_vel.d_filter == "Manual":
+            threshold = "{:3.2f}".format(s["BTdFilterThreshold"] * self.units["V"])
+            self.ed_bt_error_vel_threshold.setText(threshold)
+            self.ed_bt_error_vel_threshold.setEnabled(True)
+
+        # Set vertical velocity filter from transect data
+        index = self.combo_bt_vert_velocity.findText(
+            self.transect.boat_vel.bt_vel.w_filter, QtCore.Qt.MatchFixedString
+        )
+        self.combo_bt_vert_velocity.setCurrentIndex(index)
+
+        if self.transect.boat_vel.bt_vel.w_filter == "Manual":
+            threshold = "{:3.2f}".format(s["BTwFilterThreshold"] * self.units["V"])
+            self.ed_bt_vert_vel_threshold.setText(threshold)
+            self.ed_bt_vert_vel_threshold.setText(threshold)
+            self.ed_bt_vert_vel_threshold.setEnabled(True)
+
+        # Set smooth filter from transect data
+        if self.transect.boat_vel.bt_vel.smooth_filter == "Off":
+            self.combo_bt_other.setCurrentIndex(0)
+        elif self.transect.boat_vel.bt_vel.smooth_filter == "On":
+            self.combo_bt_other.setCurrentIndex(1)
+
+        # Display content
+        if old_discharge is None:
+            old_discharge = self.meas.discharge
+        self.update_bt_table(
+            old_discharge=old_discharge, new_discharge=self.meas.discharge
+        )
+        self.bt_plots()
+        self.bt_comments_messages()
+
+        # Setup lists for use by graphics controls
+        self.canvases = [self.bt_shiptrack_canvas, self.bt_ts_canvas]
+        self.figs = [self.bt_shiptrack_fig, self.bt_ts_fig]
+        self.fig_calls = [self.bt_shiptrack, self.bt_ts_plots]
+        self.toolbars = [self.bt_shiptrack_toolbar, self.bt_ts_toolbar]
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+        # Turn signals on
+        self.cb_bt_bt.blockSignals(False)
+        self.cb_bt_gga.blockSignals(False)
+        self.cb_bt_vtg.blockSignals(False)
+        self.cb_bt_vectors.blockSignals(False)
+        self.combo_bt_3beam.blockSignals(False)
+        self.combo_bt_error_velocity.blockSignals(False)
+        self.combo_bt_vert_velocity.blockSignals(False)
+        self.combo_bt_other.blockSignals(False)
+
+    def update_bt_table(self, old_discharge, new_discharge):
+        """Updates the bottom track table with new or reprocessed data.
+
+        Parameters
+        ----------
+        old_discharge: list
+            List of objects of QComp with previous settings
+        new_discharge: list
+            List of objects of QComp with new settings
+        """
+
+        with self.wait_cursor():
+            # Set tbl variable
+            tbl = self.table_bt
+
+            # Populate each row
+            for row in range(tbl.rowCount()):
+                # Identify transect associated with the row
+                transect_id = self.checked_transects_idx[row]
+                transect = self.meas.transects[transect_id]
+                valid_data = transect.boat_vel.bt_vel.valid_data
+                num_ensembles = len(valid_data[0, :])
+                not_4beam = np.nansum(np.isnan(transect.boat_vel.bt_vel.d_mps))
+                num_invalid = np.nansum(np.logical_not(valid_data[0, :]))
+                num_orig_invalid = np.nansum(np.logical_not(valid_data[1, :]))
+                num_beam_invalid = np.nansum(np.logical_not(valid_data[5, :]))
+                num_error_invalid = np.nansum(np.logical_not(valid_data[2, :]))
+                num_vert_invalid = np.nansum(np.logical_not(valid_data[3, :]))
+                num_other_invalid = np.nansum(np.logical_not(valid_data[4, :]))
+
+                # File/transect name
+                col = 0
+                item = QtWidgets.QTableWidgetItem(transect.file_name[:-4])
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                tbl.item(row, 0).setFont(self.font_normal)
+                if (
+                    self.meas.qa.bt_vel["q_total_warning"][transect_id, 0]
+                    or self.meas.qa.bt_vel["q_max_run_warning"][transect_id, 0]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.bt_vel["q_total_caution"][transect_id, 0]
+                    or self.meas.qa.bt_vel["q_max_run_caution"][transect_id, 0]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                tbl.item(row, col).setToolTip(
+                    self.tr(self.bt_create_tooltip(self, row, col))
+                )
+
+                # Total number of ensembles
+                col += 1
+                item = "{:5d}".format(num_ensembles)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Less than 4 beams
+                col += 1
+                item = "{:3.2f}".format((not_4beam / num_ensembles) * 100.0)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Invalid total
+                col += 1
+                item = "{:3.2f}".format((num_invalid / num_ensembles) * 100.0)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if self.meas.qa.bt_vel["all_invalid"][transect_id]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                tbl.item(row, col).setToolTip(
+                    self.tr(self.bt_create_tooltip(self, row, col))
+                )
+
+                # Invalid original data
+                col += 1
+                percent_invalid = (num_orig_invalid / num_ensembles) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.bt_vel["q_total_warning"][transect_id, 1]
+                    or self.meas.qa.bt_vel["q_max_run_warning"][transect_id, 1]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.bt_vel["q_total_caution"][transect_id, 1]
+                    or self.meas.qa.bt_vel["q_max_run_caution"][transect_id, 1]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.bt_create_tooltip(self, row, col))
+                    )
+
+                # Invalid 3 beam
+                col += 1
+                percent_invalid = (num_beam_invalid / num_ensembles) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.bt_vel["q_total_warning"][transect_id, 5]
+                    or self.meas.qa.bt_vel["q_max_run_warning"][transect_id, 5]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.bt_vel["q_total_caution"][transect_id, 5]
+                    or self.meas.qa.bt_vel["q_max_run_caution"][transect_id, 5]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.bt_create_tooltip(self, row, col))
+                    )
+
+                # Error velocity invalid
+                col += 1
+                percent_invalid = (num_error_invalid / num_ensembles) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.bt_vel["q_total_warning"][transect_id, 2]
+                    or self.meas.qa.bt_vel["q_max_run_warning"][transect_id, 2]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.bt_vel["q_total_caution"][transect_id, 2]
+                    or self.meas.qa.bt_vel["q_max_run_caution"][transect_id, 2]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.bt_create_tooltip(self, row, col))
+                    )
+
+                # Vertical velocity invalid
+                col += 1
+                percent_invalid = (num_vert_invalid / num_ensembles) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.bt_vel["q_total_warning"][transect_id, 3]
+                    or self.meas.qa.bt_vel["q_max_run_warning"][transect_id, 3]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.bt_vel["q_total_caution"][transect_id, 3]
+                    or self.meas.qa.bt_vel["q_max_run_caution"][transect_id, 3]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.bt_create_tooltip(self, row, col))
+                    )
+
+                # Other
+                col += 1
+                percent_invalid = (num_other_invalid / num_ensembles) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.bt_vel["q_total_warning"][transect_id, 4]
+                    or self.meas.qa.bt_vel["q_max_run_warning"][transect_id, 4]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.bt_vel["q_total_caution"][transect_id, 4]
+                    or self.meas.qa.bt_vel["q_max_run_caution"][transect_id, 4]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.bt_create_tooltip(self, row, col))
+                    )
+
+                # Discharge before changes
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                old_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Discharge after changes
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                new_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent change in discharge
+                col += 1
+                if np.abs(old_discharge[transect_id].total) > 0:
+                    per_change = (
+                        (
+                            new_discharge[transect_id].total
+                            - old_discharge[transect_id].total
+                        )
+                        / old_discharge[transect_id].total
+                    ) * 100
+                    tbl.setItem(
+                        row,
+                        col,
+                        QtWidgets.QTableWidgetItem("{:3.1f}".format(per_change)),
+                    )
+                else:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Set selected file to bold font
+            tbl.item(self.transect_row, 0).setFont(self.font_bold)
+            tbl.scrollToItem(tbl.item(self.transect_row, 0))
+
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+
+            self.bt_comments_messages()
+
+    @staticmethod
+    def bt_create_tooltip(self, row, column):
+        """Create bottom track tooltips."""
+
+        # Identify transect associated with the row
+        transect_id = self.checked_transects_idx[row]
+
+        cat_idx = None
+        tt = ""
+
+        if column == 0:
+            cat_idx = 0
+        elif column == 3:
+            cat_idx = 0
+        elif column == 4:
+            cat_idx = 1
+        elif column == 5:
+            cat_idx = 5
+        elif column == 6:
+            cat_idx = 2
+        elif column == 7:
+            cat_idx = 3
+        elif column == 8:
+            cat_idx = 4
+
+        if cat_idx is not None:
+            tt = "".join(
+                self.q_qa_message(
+                    qa_data=self.meas.qa.bt_vel,
+                    cat_idx=cat_idx,
+                    transect_id=transect_id,
+                    total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                    total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                    run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                    run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                )
+            )
+        return tt
+
+    def bt_plots(self):
+        """Creates graphics for BT tab."""
+
+        with self.wait_cursor():
+            # Set all filenames to normal font
+            nrows = len(self.checked_transects_idx)
+            for nrow in range(nrows):
+                self.table_bt.item(nrow, 0).setFont(self.font_normal)
+
+            # Set selected file to bold font
+            self.table_bt.item(self.transect_row, 0).setFont(self.font_bold)
+
+            # Determine transect selected
+            transect_id = self.checked_transects_idx[self.transect_row]
+            self.transect = self.meas.transects[transect_id]
+
+            # Update plots
+            self.bt_shiptrack()
+            self.bt_ts_plots()
+
+            # Update list of figs
+            self.figs = [self.bt_shiptrack_fig, self.bt_ts_fig]
+            self.fig_calls = [self.bt_shiptrack, self.bt_ts_plots]
+
+            # Reset data cursor to work with new figure
+            if self.actionData_Cursor.isChecked():
+                self.data_cursor()
+
+    def bt_shiptrack(self):
+        """Creates shiptrack plot for data in transect."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.bt_shiptrack_canvas is None:
+            # Create the canvas
+            self.bt_shiptrack_canvas = MplCanvas(
+                parent=self.graph_bt_st, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_bt_st)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.bt_shiptrack_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.bt_shiptrack_toolbar = NavigationToolbar(
+                self.bt_shiptrack_canvas, self
+            )
+            self.bt_shiptrack_toolbar.hide()
+
+        # Initialize the shiptrack figure and assign to the canvas
+        self.bt_shiptrack_fig = Shiptrack(canvas=self.bt_shiptrack_canvas)
+        # Create the figure with the specified data
+        self.bt_shiptrack_fig.create(
+            transect=self.transect,
+            units=self.units,
+            cb=True,
+            cb_bt=self.cb_bt_bt,
+            cb_gga=self.cb_bt_gga,
+            cb_vtg=self.cb_bt_vtg,
+            cb_vectors=self.cb_bt_vectors,
+        )
+
+        # Draw canvas
+        self.bt_shiptrack_canvas.draw()
+
+    def bt_ts_plots(self):
+        """Creates plots of filter characteristics."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.bt_ts_canvas is None:
+            # Create the canvas
+            self.bt_ts_canvas = MplCanvas(
+                parent=self.graph_bt_ts, width=8, height=2, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_bt_ts)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(0, 0, 0, 0)
+            # Add the canvas
+            layout.addWidget(self.bt_ts_canvas)
+            self.bt_ts_toolbar = NavigationToolbar(self.bt_ts_canvas, self)
+            self.bt_ts_toolbar.hide()
+
+        # Initialize the boat speed figure and assign to the canvas
+        self.bt_ts_fig = AdvGraphs(canvas=self.bt_ts_canvas)
+
+        # Create the figure with the specified data
+
+        self.bt_ts_fig.create_bt_tab_graphs(
+            transect=self.transect,
+            units=self.units,
+            beam=self.rb_bt_beam.isChecked(),
+            error=self.rb_bt_error.isChecked(),
+            vert=self.rb_bt_vert.isChecked(),
+            other=self.rb_bt_other.isChecked(),
+            source=self.rb_bt_source.isChecked(),
+            bt=self.cb_bt_bt.isChecked(),
+            gga=self.cb_bt_gga.isChecked(),
+            vtg=self.cb_bt_vtg.isChecked(),
+            x_axis_type=self.x_axis_type,
+        )
+
+        # Update list of figs
+        self.figs = [self.bt_shiptrack_fig, self.bt_ts_fig]
+        self.fig_calls = [self.bt_shiptrack, self.bt_ts_plots]
+
+        # Reset data cursor to work with new figure
+        if self.actionData_Cursor.isChecked():
+            self.data_cursor()
+        # Draw canvas
+        self.bt_ts_canvas.draw()
+
+    @QtCore.pyqtSlot()
+    def bt_radiobutton_control(self):
+        """Identifies a change in radio buttons and calls the plot routine
+        to update the graph.
+        """
+
+        with self.wait_cursor():
+            if self.sender().isChecked():
+                self.bt_plots()
+
+    def bt_table_clicked(self, row, column):
+        """Changes plotted data to the transect of the transect clicked.
+
+        Parameters
+        ----------
+        row: int
+            Row clicked by user
+        column: int
+            Column clicked by user
+        """
+
+        if column == 0:
+            self.transect_row = row
+            self.bt_plots()
+            self.change = True
+        self.tab_bt_2_data.setFocus()
+
+    @QtCore.pyqtSlot()
+    def bt_plot_change(self):
+        """Coordinates changes in what references should be displayed in the
+        boat speed and shiptrack plots.
+        """
+
+        with self.wait_cursor():
+            self.bt_plots()
+            self.tab_bt_2_data.setFocus()
+
+    def update_bt_tab(self, s):
+        """Updates the measurement and bottom track tab (table and graphics)
+        after a change to settings has been made.
+
+        Parameters
+        ----------
+        s: dict
+            Dictionary of all process settings for the
+            measurement
+        """
+
+        # Save discharge from previous settings
+        old_discharge = copy.deepcopy(self.meas.discharge)
+
+        # Apply new settings
+        self.meas.apply_settings(settings=s)
+
+        # Update table
+        self.update_bt_table(
+            old_discharge=old_discharge, new_discharge=self.meas.discharge
+        )
+        self.bt_comments_messages()
+
+        # Update plots
+        self.bt_plots()
+
+        self.tab_bt_2_data.setFocus()
+
+    @QtCore.pyqtSlot(str)
+    def change_bt_beam(self, text):
+        """Coordinates user initiated change to the beam settings.
+
+        Parameters
+        ----------
+        text: str
+            User selection from combo box
+        """
+
+        with self.wait_cursor():
+            self.combo_bt_3beam.blockSignals(True)
+            # Get current settings
+            s = self.meas.current_settings()
+
+            if text == "Auto":
+                s["BTbeamFilter"] = -1
+            elif text == "Allow":
+                s["BTbeamFilter"] = 3
+            elif text == "4-Beam Only":
+                s["BTbeamFilter"] = 4
+
+            # Update measurement and display
+            self.update_bt_tab(s)
+            self.change = True
+            self.combo_bt_3beam.blockSignals(False)
+
+    @QtCore.pyqtSlot(str)
+    def change_bt_error(self, text):
+        """Coordinates user initiated change to the error velocity settings.
+
+        Parameters
+        ----------
+        text: str
+            User selection from combo box
+        """
+
+        with self.wait_cursor():
+            self.combo_bt_error_velocity.blockSignals(True)
+
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change setting based on combo box selection
+            s["BTdFilter"] = text
+            if text == "Manual":
+                # If Manual enable the line edit box for user input. Updates
+                # are not applied until the user has entered a value in the line edit box.
+                self.ed_bt_error_vel_threshold.setEnabled(True)
+            else:
+                # If manual is not selected the line edit box is cleared and
+                # disabled and the updates applied.
+                self.ed_bt_error_vel_threshold.setEnabled(False)
+                self.ed_bt_error_vel_threshold.setText("")
+                self.update_bt_tab(s)
+            self.change = True
+            self.combo_bt_error_velocity.blockSignals(False)
+
+    @QtCore.pyqtSlot(str)
+    def change_bt_vertical(self, text):
+        """Coordinates user initiated change to the vertical velocity settings.
+
+        Parameters
+        ----------
+        text: str
+         User selection from combo box
+        """
+
+        with self.wait_cursor():
+            self.combo_bt_vert_velocity.blockSignals(True)
+
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change setting based on combo box selection
+            s["BTwFilter"] = text
+
+            if text == "Manual":
+                # If Manual enable the line edit box for user input. Updates
+                # are not applied until the user has entered a value in the line edit box.
+                self.ed_bt_vert_vel_threshold.setEnabled(True)
+            else:
+                # If manual is not selected the line edit box is cleared and
+                # disabled and the updates applied.
+                self.ed_bt_vert_vel_threshold.setEnabled(False)
+                self.ed_bt_vert_vel_threshold.setText("")
+                self.update_bt_tab(s)
+                self.change = True
+            self.combo_bt_vert_velocity.blockSignals(False)
+
+    @QtCore.pyqtSlot(str)
+    def change_bt_other(self, text):
+        """Coordinates user initiated change to the vertical velocity settings.
+
+        Parameters
+        ----------
+        text: str
+         User selection from combo box
+        """
+
+        with self.wait_cursor():
+            self.combo_bt_other.blockSignals(True)
+
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change setting based on combo box selection
+            if text == "Off":
+                s["BTsmoothFilter"] = "Off"
+            elif text == "Smooth":
+                s["BTsmoothFilter"] = "On"
+
+            # Update measurement and display
+            self.update_bt_tab(s)
+            self.change = True
+            self.combo_bt_other.blockSignals(False)
+
+    @QtCore.pyqtSlot()
+    def change_error_vel_threshold(self):
+        """Coordinates application of a user specified error velocity
+        threshold.
+        """
+
+        self.ed_bt_error_vel_threshold.blockSignals(True)
+        with self.wait_cursor():
+
+            # Get threshold and convert to SI units
+            threshold = self.check_numeric_input(self.ed_bt_error_vel_threshold)
+            if threshold is not None:
+                threshold = threshold / self.units["V"]
+
+                # Get current settings
+                s = self.meas.current_settings()
+                # Because editingFinished is used if return is pressed and
+                # later focus is changed the method could get twice.
+                # This line checks to see if there was and actual change.
+                compute = False
+                if type(s["BTdFilterThreshold"]) is dict:
+                    compute = True
+                else:
+                    if np.abs(threshold - s["BTdFilterThreshold"]) > 0.0001:
+                        compute = True
+                if compute:
+                    # Change settings to manual and the associated threshold
+                    s["BTdFilter"] = "Manual"
+                    s["BTdFilterThreshold"] = threshold
+
+                    # Update measurement and display
+                    self.update_bt_tab(s)
+                    self.change = True
+
+        self.ed_bt_error_vel_threshold.blockSignals(False)
+
+    @QtCore.pyqtSlot()
+    def change_vert_vel_threshold(self):
+        """Coordinates application of a user specified vertical velocity threshold."""
+
+        self.ed_bt_vert_vel_threshold.blockSignals(True)
+        with self.wait_cursor():
+
+            # Get threshold and convert to SI units
+            threshold = self.check_numeric_input(self.ed_bt_vert_vel_threshold)
+            if threshold is not None:
+                threshold = threshold / self.units["V"]
+
+                # Get current settings
+                s = self.meas.current_settings()
+                # Because editingFinished is used if return is pressed and
+                # later focus is changed the method could get twice. This line checks
+                # to see if there was and actual change.
+                compute = False
+                if type(s["BTwFilterThreshold"]) is dict:
+                    compute = True
+                else:
+                    if np.abs(threshold - s["BTwFilterThreshold"]) > 0.0001:
+                        compute = True
+                if compute:
+                    # Change settings to manual and the associated threshold
+                    s["BTwFilter"] = "Manual"
+                    s["BTwFilterThreshold"] = threshold
+
+                    # Update measurement and display
+                    self.update_bt_tab(s)
+                    self.change = True
+        self.ed_bt_vert_vel_threshold.blockSignals(False)
+
+    def bt_comments_messages(self):
+        """Displays comments and messages associated with bottom track
+        filters in Messages tab.
+        """
+
+        # Clear comments and messages
+        self.display_bt_comments.clear()
+        self.display_bt_messages.clear()
+
+        if self.meas is not None:
+            # Display each comment on a new line
+            self.display_bt_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                self.display_bt_comments.textCursor().insertText(comment)
+                self.display_bt_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_bt_comments.textCursor().insertBlock()
+
+            # Display each message on a new line
+            self.display_bt_messages.moveCursor(QtGui.QTextCursor.Start)
+            for message in self.meas.qa.bt_vel["messages"]:
+                if type(message) is str:
+                    self.display_bt_messages.textCursor().insertText(message)
+                else:
+                    self.display_bt_messages.textCursor().insertText(message[0])
+                self.display_bt_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_bt_messages.textCursor().insertBlock()
+
+            self.update_tab_icons()
+
+    # GPS tab
+    # =======
+    def gps_tab(self, old_discharge=None):
+        """Initialize, setup settings, and display initial data in gps tab.
+
+        Parameters
+        ----------
+        old_discharge: list
+            List of objects of QComp with previous settings
+        """
+
+        # Setup data table
+        tbl = self.table_gps
+        table_header = [
+            self.tr("Filename"),
+            self.tr("Number or \n Ensembles"),
+            self.tr("GGA \n % Invalid"),
+            self.tr("VTG \n % Invalid"),
+            self.tr("Diff. Qual. \n % Invalid"),
+            self.tr("Alt. Change \n % Invalid"),
+            self.tr("HDOP \n % Invalid"),
+            self.tr("Sat Change \n % "),
+            self.tr("Other \n % Invalid"),
+            self.tr("Discharge \n Previous \n" + self.units["label_Q"]),
+            self.tr("Discharge \n Now \n" + self.units["label_Q"]),
+            self.tr("Discharge \n % Change"),
+        ]
+        ncols = len(table_header)
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(table_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        tbl.setStyleSheet("QToolTip{font: 12pt}")
+
+        # Automatically resize rows and columns
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+        # Turn signals off
+        self.cb_gps_bt.blockSignals(True)
+        self.cb_gps_gga.blockSignals(True)
+        self.cb_gps_vtg.blockSignals(True)
+        self.cb_gps_vectors.blockSignals(True)
+        self.combo_gps_qual.blockSignals(True)
+        self.combo_gps_altitude.blockSignals(True)
+        self.combo_gps_hdop.blockSignals(True)
+        self.combo_gps_other.blockSignals(True)
+
+        # Initialize checkbox settings for boat reference
+        self.cb_gps_bt.setCheckState(QtCore.Qt.Checked)
+        if (
+            self.meas.transects[self.checked_transects_idx[0]].boat_vel.gga_vel
+            is not None
+        ):
+            self.cb_gps_gga.setCheckState(QtCore.Qt.Checked)
+        if (
+            self.meas.transects[self.checked_transects_idx[0]].boat_vel.vtg_vel
+            is not None
+        ):
+            self.cb_gps_vtg.setCheckState(QtCore.Qt.Checked)
+
+        self.cb_gps_vectors.setCheckState(QtCore.Qt.Checked)
+
+        # Transect selected for display
+        self.transect = self.meas.transects[
+            self.checked_transects_idx[self.transect_row]
+        ]
+
+        # Check for presence of gga data
+        gga_transect = None
+        for idx in self.checked_transects_idx:
+            if self.meas.transects[idx].boat_vel.gga_vel is not None:
+                gga_transect = self.meas.transects[idx]
+                break
+
+        if gga_transect is not None:
+            # Set gps quality filter
+            if gga_transect.boat_vel.gga_vel.gps_diff_qual_filter == 1:
+                self.combo_gps_qual.setCurrentIndex(0)
+            elif gga_transect.boat_vel.gga_vel.gps_diff_qual_filter == 2:
+                self.combo_gps_qual.setCurrentIndex(1)
+            elif gga_transect.boat_vel.gga_vel.gps_diff_qual_filter == 4:
+                self.combo_gps_qual.setCurrentIndex(2)
+            else:
+                self.combo_gps_qual.setCurrentIndex(0)
+
+            # Set altitude filter from transect data
+            index = self.combo_gps_altitude.findText(
+                gga_transect.boat_vel.gga_vel.gps_altitude_filter,
+                QtCore.Qt.MatchFixedString,
+            )
+            self.combo_gps_altitude.setCurrentIndex(index)
+
+            s = self.meas.current_settings()
+
+            if s["ggaAltitudeFilter"] == "Manual":
+                self.ed_gps_altitude_threshold.setEnabled(True)
+                threshold = "{:3.2f}".format(
+                    s["ggaAltitudeFilterChange"] * self.units["L"]
+                )
+                self.ed_gps_altitude_threshold.setText(threshold)
+
+            # Set hdop filter from transect data
+            index = self.combo_gps_hdop.findText(
+                gga_transect.boat_vel.gga_vel.gps_HDOP_filter,
+                QtCore.Qt.MatchFixedString,
+            )
+            self.combo_gps_hdop.setCurrentIndex(index)
+
+            if s["GPSHDOPFilter"] == "Manual":
+                self.ed_gps_hdop_threshold.setEnabled(True)
+                threshold = "{:3.2f}".format(s["GPSHDOPFilterChange"])
+                self.ed_gps_hdop_threshold.setText(threshold)
+            if s["ggaAltitudeFilter"] == "Manual":
+                self.ed_gps_altitude_threshold.setEnabled(True)
+                threshold = "{:3.2f}".format(
+                    s["ggaAltitudeFilterChange"] * self.units["L"]
+                )
+                self.ed_gps_altitude_threshold.setText(threshold)
+            # Set smooth filter from transect data
+            if gga_transect.boat_vel.gga_vel.smooth_filter == "Off":
+                self.combo_gps_other.setCurrentIndex(0)
+            elif gga_transect.boat_vel.gga_vel.smooth_filter == "On":
+                self.combo_gps_other.setCurrentIndex(1)
+
+            # Set hdop filter from transect data
+            index = self.combo_gps_hdop.findText(
+                gga_transect.boat_vel.gga_vel.gps_HDOP_filter,
+                QtCore.Qt.MatchFixedString,
+            )
+            self.combo_gps_hdop.setCurrentIndex(index)
+
+        # Check for presence of vtg data
+        vtg_transect = None
+        for idx in self.checked_transects_idx:
+            if self.meas.transects[idx].boat_vel.vtg_vel is not None:
+                vtg_transect = self.meas.transects[idx]
+                break
+
+        if vtg_transect is not None:
+            # Set smooth filter from transect data
+            if vtg_transect.boat_vel.vtg_vel.smooth_filter == "Off":
+                self.combo_gps_other.setCurrentIndex(0)
+            elif vtg_transect.boat_vel.vtg_vel.smooth_filter == "On":
+                self.combo_gps_other.setCurrentIndex(1)
+
+        # Turn signals on
+        self.cb_gps_bt.blockSignals(False)
+        self.cb_gps_gga.blockSignals(False)
+        self.cb_gps_vtg.blockSignals(False)
+        self.cb_gps_vectors.blockSignals(False)
+        self.combo_gps_qual.blockSignals(False)
+        self.combo_gps_altitude.blockSignals(False)
+        self.combo_gps_hdop.blockSignals(False)
+        self.combo_gps_other.blockSignals(False)
+
+        # Display content
+        if old_discharge is None:
+            old_discharge = self.meas.discharge
+        self.update_gps_table(
+            old_discharge=old_discharge, new_discharge=self.meas.discharge
+        )
+        self.gps_plots()
+        self.gps_comments_messages()
+        self.gps_bt()
+
+        # Setup lists for use by graphics controls
+        self.canvases = [self.gps_shiptrack_canvas, self.gps_ts_canvas]
+        self.figs = [self.gps_shiptrack_fig, self.gps_ts_fig]
+        self.fig_calls = [self.gps_shiptrack, self.gps_ts_plots]
+        self.toolbars = [self.gps_shiptrack_toolbar, self.gps_ts_toolbar]
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+        if not self.gps_initialized:
+            tbl.cellClicked.connect(self.gps_table_clicked)
+            # Connect plot variable checkboxes
+            self.cb_gps_bt.stateChanged.connect(self.gps_plot_change)
+            self.cb_gps_gga.stateChanged.connect(self.gps_plot_change)
+            self.cb_gps_vtg.stateChanged.connect(self.gps_plot_change)
+            self.cb_gps_vectors.stateChanged.connect(self.gps_plot_change)
+
+            # Connect radio buttons
+            self.rb_gps_quality.toggled.connect(self.gps_radiobutton_control)
+            self.rb_gps_altitude.toggled.connect(self.gps_radiobutton_control)
+            self.rb_gps_hdop.toggled.connect(self.gps_radiobutton_control)
+            self.rb_gps_sats.toggled.connect(self.gps_radiobutton_control)
+            self.rb_gps_other.toggled.connect(self.gps_radiobutton_control)
+            self.rb_gps_source.toggled.connect(self.gps_radiobutton_control)
+
+            # Connect manual entry
+            self.ed_gps_altitude_threshold.editingFinished.connect(
+                self.change_altitude_threshold
+            )
+            self.ed_gps_hdop_threshold.editingFinished.connect(
+                self.change_hdop_threshold
+            )
+
+            # Connect filters
+            self.combo_gps_qual.currentIndexChanged[str].connect(self.change_quality)
+            self.combo_gps_altitude.currentIndexChanged[str].connect(
+                self.change_altitude
+            )
+            self.combo_gps_hdop.currentIndexChanged[str].connect(self.change_hdop)
+            self.combo_gps_other.currentIndexChanged[str].connect(self.change_gps_other)
+
+            self.gps_initialized = True
+
+    def update_gps_table(self, old_discharge, new_discharge):
+        """Updates the gps table with new or reprocessed data.
+
+        Parameters
+        ----------
+        old_discharge: list
+            List of objects of QComp with previous settings
+        new_discharge: list
+            List of objects of QComp with new settings
+        """
+
+        with self.wait_cursor():
+            # Set tbl variable
+            tbl = self.table_gps
+
+            # Populate each row
+            for row in range(tbl.rowCount()):
+                # Identify transect associated with the row
+                transect_id = self.checked_transects_idx[row]
+                transect = self.meas.transects[transect_id]
+                num_ensembles = len(transect.boat_vel.bt_vel.u_processed_mps)
+                # Determine GPS characteristics for gga
+                if (
+                    transect.boat_vel.gga_vel is not None
+                    and transect.boat_vel.gga_vel.u_mps is not None
+                ):
+                    valid_data = transect.boat_vel.gga_vel.valid_data
+                    num_other_invalid = np.nansum(np.logical_not(valid_data[4, :]))
+                    num_invalid_gga = np.nansum(np.logical_not(valid_data[0, :]))
+                    num_altitude_invalid = np.nansum(np.logical_not(valid_data[3, :]))
+                    num_quality_invalid = np.nansum(np.logical_not(valid_data[2, :]))
+                    num_hdop_invalid = np.nansum(np.logical_not(valid_data[5, :]))
+                    sats = np.copy(transect.gps.num_sats_ens)
+                    if np.nansum(sats) == 0:
+                        num_sat_changes = -1
+                    else:
+                        sats = sats[np.logical_not(np.isnan(sats))]
+                        diff_sats = np.diff(sats)
+                        num_sat_changes = np.nansum(np.logical_not(diff_sats == 0))
+                else:
+                    num_invalid_gga = -1
+                    num_altitude_invalid = -1
+                    num_quality_invalid = -1
+                    num_hdop_invalid = -1
+                    num_sat_changes = -1
+                    num_other_invalid = -1
+
+                # Determine characteristics for vtg
+                if (
+                    transect.boat_vel.vtg_vel is not None
+                    and transect.boat_vel.vtg_vel.u_mps is not None
+                ):
+                    num_invalid_vtg = np.nansum(
+                        np.logical_not(transect.boat_vel.vtg_vel.valid_data[0, :])
+                    )
+                else:
+                    num_invalid_vtg = -1
+
+                # File/transect name
+                col = 0
+                item = QtWidgets.QTableWidgetItem(transect.file_name[:-4])
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Total number of ensembles
+                col += 1
+                item = "{:5d}".format(num_ensembles)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent of ensembles with invalid gga
+                col += 1
+                if num_invalid_gga > 0:
+                    item = "{:3.2f}".format((num_invalid_gga / num_ensembles) * 100.0)
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                if (
+                    self.meas.qa.gga_vel["q_total_warning"][transect_id, 1]
+                    or self.meas.qa.gga_vel["q_max_run_warning"][transect_id, 1]
+                    or self.meas.qa.gga_vel["all_invalid"][transect_id]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.gga_vel["q_total_caution"][transect_id, 1]
+                    or self.meas.qa.gga_vel["q_max_run_caution"][transect_id, 1]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                tbl.item(row, col).setToolTip(self.gps_create_tooltip(self, row, col))
+
+                # Percent of ensembles with invalid vtg
+                col += 1
+                if num_invalid_vtg >= 0:
+                    item = "{:3.2f}".format((num_invalid_vtg / num_ensembles) * 100.0)
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.vtg_vel["q_total_warning"][transect_id, 1]
+                    or self.meas.qa.vtg_vel["q_max_run_warning"][transect_id, 1]
+                    or self.meas.qa.vtg_vel["all_invalid"][transect_id]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.vtg_vel["q_total_caution"][transect_id, 1]
+                    or self.meas.qa.vtg_vel["q_max_run_caution"][transect_id, 1]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                tbl.item(row, col).setToolTip(self.gps_create_tooltip(self, row, col))
+
+                # Percent of ensembles with invalid quality
+                col += 1
+                percent_invalid = 0
+                if num_quality_invalid >= 0:
+                    percent_invalid = (num_quality_invalid / num_ensembles) * 100.0
+                    item = "{:3.2f}".format(percent_invalid)
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.gga_vel["q_total_warning"][transect_id, 2]
+                    or self.meas.qa.gga_vel["q_max_run_warning"][transect_id, 2]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.gga_vel["q_total_caution"][transect_id, 2]
+                    or self.meas.qa.gga_vel["q_max_run_caution"][transect_id, 2]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.gps_create_tooltip(self, row, col))
+                    )
+
+                # Percent ensembles with invalid altitude
+                col += 1
+                percent_invalid = 0
+                if num_altitude_invalid >= 0:
+                    percent_invalid = (num_altitude_invalid / num_ensembles) * 100.0
+                    item = "{:3.2f}".format(percent_invalid)
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.gga_vel["q_total_warning"][transect_id, 3]
+                    or self.meas.qa.gga_vel["q_max_run_warning"][transect_id, 3]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.gga_vel["q_total_caution"][transect_id, 3]
+                    or self.meas.qa.gga_vel["q_max_run_caution"][transect_id, 3]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.gps_create_tooltip(self, row, col))
+                    )
+
+                # Percent ensembles with invalid HDOP
+                col += 1
+                percent_invalid = 0
+                if num_hdop_invalid >= 0:
+                    percent_invalid = (num_hdop_invalid / num_ensembles) * 100.0
+                    item = "{:3.2f}".format(percent_invalid)
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.gga_vel["q_total_warning"][transect_id, 5]
+                    or self.meas.qa.gga_vel["q_max_run_warning"][transect_id, 5]
+                    or self.meas.qa.vtg_vel["q_total_warning"][transect_id, 5]
+                    or self.meas.qa.vtg_vel["q_max_run_warning"][transect_id, 5]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.gga_vel["q_total_caution"][transect_id, 5]
+                    or self.meas.qa.gga_vel["q_max_run_caution"][transect_id, 5]
+                    or self.meas.qa.vtg_vel["q_total_caution"][transect_id, 5]
+                    or self.meas.qa.vtg_vel["q_max_run_caution"][transect_id, 5]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.gps_create_tooltip(self, row, col))
+                    )
+
+                # Percent of ensembles with satellite changes
+                col += 1
+                if num_sat_changes >= 0:
+                    item = "{:3.2f}".format((num_sat_changes / num_ensembles) * 100.0)
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent other filter
+                col += 1
+                percent_invalid = 0
+                if num_other_invalid >= 0:
+                    percent_invalid = (num_other_invalid / num_ensembles) * 100.0
+                    item = "{:3.2f}".format(percent_invalid)
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.gga_vel["q_total_warning"][transect_id, 4]
+                    or self.meas.qa.gga_vel["q_max_run_warning"][transect_id, 4]
+                    or self.meas.qa.vtg_vel["q_total_warning"][transect_id, 4]
+                    or self.meas.qa.vtg_vel["q_max_run_warning"][transect_id, 4]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.gga_vel["q_total_caution"][transect_id, 4]
+                    or self.meas.qa.gga_vel["q_max_run_caution"][transect_id, 4]
+                    or self.meas.qa.vtg_vel["q_total_caution"][transect_id, 4]
+                    or self.meas.qa.vtg_vel["q_max_run_caution"][transect_id, 4]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.gps_create_tooltip(self, row, col))
+                    )
+
+                # Discharge before changes
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                old_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Discharge after changes
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                new_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent change in discharge
+                col += 1
+                if np.abs(old_discharge[transect_id].total) > 0:
+                    per_change = (
+                        (
+                            new_discharge[transect_id].total
+                            - old_discharge[transect_id].total
+                        )
+                        / old_discharge[transect_id].total
+                    ) * 100
+                    tbl.setItem(
+                        row,
+                        col,
+                        QtWidgets.QTableWidgetItem("{:3.1f}".format(per_change)),
+                    )
+                else:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                self.table_gps.item(row, 0).setFont(self.font_normal)
+
+            # Set selected file to bold font
+            self.table_gps.item(self.transect_row, 0).setFont(self.font_bold)
+
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+            tbl.scrollToItem(tbl.item(self.transect_row, 0))
+
+            self.gps_comments_messages()
+
+    @staticmethod
+    def gps_create_tooltip(self, row, column):
+
+        # Identify transect associated with the row
+        transect_id = self.checked_transects_idx[row]
+
+        tt = ""
+        qa_data = None
+
+        if column == 2:
+            cat_idx = 1
+            qa_data = self.meas.qa.gga_vel
+            tt = tt.join(
+                self.q_qa_message(
+                    qa_data=qa_data,
+                    cat_idx=cat_idx,
+                    transect_id=transect_id,
+                    total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                    total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                    run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                    run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                )
+            )
+            cat_idx = 0
+            tt = tt.join(
+                self.q_qa_message(
+                    qa_data=qa_data,
+                    cat_idx=cat_idx,
+                    transect_id=transect_id,
+                    total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                    total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                    run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                    run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                )
+            )
+        elif column == 3:
+            cat_idx = 1
+            qa_data = self.meas.qa.vtg_vel
+            tt = tt.join(
+                self.q_qa_message(
+                    qa_data=qa_data,
+                    cat_idx=cat_idx,
+                    transect_id=transect_id,
+                    total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                    total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                    run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                    run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                )
+            )
+            cat_idx = 0
+            tt = tt.join(
+                self.q_qa_message(
+                    qa_data=qa_data,
+                    cat_idx=cat_idx,
+                    transect_id=transect_id,
+                    total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                    total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                    run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                    run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                )
+            )
+
+        elif column == 4:
+            cat_idx = 2
+            qa_data = self.meas.qa.gga_vel
+            tt = tt.join(
+                self.q_qa_message(
+                    qa_data=qa_data,
+                    cat_idx=cat_idx,
+                    transect_id=transect_id,
+                    total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                    total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                    run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                    run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                )
+            )
+
+        elif column == 5:
+            cat_idx = 3
+            qa_data = self.meas.qa.gga_vel
+            tt = tt.join(
+                self.q_qa_message(
+                    qa_data=qa_data,
+                    cat_idx=cat_idx,
+                    transect_id=transect_id,
+                    total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                    total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                    run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                    run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                )
+            )
+
+        elif column == 6:
+            cat_idx = 5
+            if (
+                self.meas.transects[
+                    self.meas.checked_transect_idx[row]
+                ].boat_vel.gga_vel
+                is not None
+            ):
+                qa_data = self.meas.qa.gga_vel
+            elif (
+                self.meas.transects[
+                    self.meas.checked_transect_idx[row]
+                ].boat_vel.vtg_vel
+                is not None
+            ):
+                qa_data = self.meas.qa.vtg_vel
+            if qa_data is not None:
+                tt = tt.join(
+                    self.q_qa_message(
+                        qa_data=qa_data,
+                        cat_idx=cat_idx,
+                        transect_id=transect_id,
+                        total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                        total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                        run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                        run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                    )
+                )
+
+        elif column == 8:
+            cat_idx = 4
+            if (
+                self.meas.transects[
+                    self.meas.checked_transect_idx[row]
+                ].boat_vel.gga_vel
+                is not None
+            ):
+                qa_data = self.meas.qa.gga_vel
+                tt = tt.join(
+                    self.q_qa_message(
+                        qa_data=qa_data,
+                        cat_idx=cat_idx,
+                        transect_id=transect_id,
+                        total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                        total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                        run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                        run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                    )
+                )
+            if (
+                self.meas.transects[
+                    self.meas.checked_transect_idx[row]
+                ].boat_vel.vtg_vel
+                is not None
+            ):
+                qa_data = self.meas.qa.vtg_vel
+                tt = tt.join(
+                    self.q_qa_message(
+                        qa_data=qa_data,
+                        cat_idx=cat_idx,
+                        transect_id=transect_id,
+                        total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                        total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                        run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                        run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                    )
+                )
+        return tt
+
+    def gps_plots(self):
+        """Creates graphics for GPS tab."""
+
+        with self.wait_cursor():
+            # Set all filenames to normal font
+            nrows = len(self.checked_transects_idx)
+
+            # Determine transect selected
+            transect_id = self.checked_transects_idx[self.transect_row]
+            self.transect = self.meas.transects[transect_id]
+
+            # Identify transect to be plotted in table
+            for row in range(nrows):
+                self.table_gps.item(row, 0).setFont(self.font_normal)
+            # Set selected file to bold font
+            self.table_gps.item(self.transect_row, 0).setFont(self.font_bold)
+
+            # Update plots
+            self.gps_shiptrack()
+            self.gps_ts_plots()
+
+            # Update list of figs
+            self.figs = [self.gps_shiptrack_fig, self.gps_ts_fig]
+            self.fig_calls = [self.gps_shiptrack, self.gps_ts_plots]
+
+            # Reset data cursor to work with new data plot
+            if self.actionData_Cursor.isChecked():
+                self.data_cursor()
+
+        self.tab_gps_2_data.setFocus()
+
+    def gps_shiptrack(self):
+        """Creates shiptrack plot for data in transect."""
+
+        self.cb_gps_bt.blockSignals(True)
+        self.cb_gps_gga.blockSignals(True)
+        self.cb_gps_vtg.blockSignals(True)
+        self.cb_gps_vectors.blockSignals(True)
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.gps_shiptrack_canvas is None:
+            # Create the canvas
+            self.gps_shiptrack_canvas = MplCanvas(
+                parent=self.graph_gps_st, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_gps_st)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.gps_shiptrack_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.gps_shiptrack_toolbar = NavigationToolbar(
+                self.gps_shiptrack_canvas, self
+            )
+            self.gps_shiptrack_toolbar.hide()
+
+        # Initialize the shiptrack figure and assign to the canvas
+        self.gps_shiptrack_fig = Shiptrack(canvas=self.gps_shiptrack_canvas)
+        # Create the figure with the specified data
+        self.gps_shiptrack_fig.create(
+            transect=self.transect,
+            units=self.units,
+            cb=True,
+            cb_bt=self.cb_gps_bt,
+            cb_gga=self.cb_gps_gga,
+            cb_vtg=self.cb_gps_vtg,
+            cb_vectors=self.cb_gps_vectors,
+        )
+
+        # Draw canvas
+        self.gps_shiptrack_canvas.draw()
+
+        self.cb_gps_bt.blockSignals(False)
+        self.cb_gps_gga.blockSignals(False)
+        self.cb_gps_vtg.blockSignals(False)
+        self.cb_gps_vectors.blockSignals(False)
+
+    @QtCore.pyqtSlot()
+    def gps_radiobutton_control(self):
+        """Identifies a change in radio buttons and calls the plot routine
+        to update the graph.
+        """
+
+        with self.wait_cursor():
+            if self.sender().isChecked():
+                self.gps_ts_plots()
+
+    def gps_ts_plots(self):
+        """Creates plots of filter characteristics."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.gps_ts_canvas is None:
+            # Create the canvas
+            self.gps_ts_canvas = MplCanvas(
+                parent=self.graph_gps_ts, width=8, height=2, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_gps_ts)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(0, 0, 0, 0)
+            # Add the canvas
+            layout.addWidget(self.gps_ts_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.gps_ts_toolbar = NavigationToolbar(self.gps_ts_canvas, self)
+            self.gps_ts_toolbar.hide()
+
+        # Initialize the boat speed figure and assign to the canvas
+        self.gps_ts_fig = AdvGraphs(canvas=self.gps_ts_canvas)
+        self.gps_ts_fig.create_gps_tab_graphs(
+            transect=self.transect,
+            units=self.units,
+            quality=self.rb_gps_quality.isChecked(),
+            altitude=self.rb_gps_altitude.isChecked(),
+            hdop=self.rb_gps_hdop.isChecked(),
+            n_sats=self.rb_gps_sats.isChecked(),
+            other=self.rb_gps_other.isChecked(),
+            source=self.rb_gps_source.isChecked(),
+            bt=self.cb_gps_bt.isChecked(),
+            gga=self.cb_gps_gga.isChecked(),
+            vtg=self.cb_gps_vtg.isChecked(),
+            x_axis_type=self.x_axis_type,
+        )
+
+        # Update list of figs
+        self.figs = [self.gps_shiptrack_fig, self.gps_ts_fig]
+        self.fig_calls = [self.gps_shiptrack, self.gps_ts_plots]
+
+        # Reset data cursor to work with new data plot
+        if self.actionData_Cursor.isChecked():
+            self.data_cursor()
+
+        # Draw canvas
+        self.gps_ts_canvas.draw()
+
+    def gps_table_clicked(self, row, column, caller=None):
+        """Changes plotted data to the transect of the transect clicked.
+
+        Parameters
+        ----------
+        row: int
+            Row clicked by user
+        column: int
+            Column clicked by user
+        caller: str
+            Identifies the tab from which the method is called
+        """
+
+        if column == 0:
+            self.transect_row = row
+            self.gps_plots()
+            self.change = True
+        if caller is None:
+            self.gps_bt_table_clicked(row + 2, column, caller="gps")
+        self.tab_gps_2_data.setFocus()
+
+    @QtCore.pyqtSlot()
+    def gps_plot_change(self):
+        """Coordinates changes in what references should be displayed in the
+        boat speed and shiptrack plots.
+        """
+
+        with self.wait_cursor():
+            self.gps_plots()
+            self.tab_gps_2_data.setFocus()
+
+    def update_gps_tab(self, s):
+        """Updates the measurement and bottom track tab (table and graphics)
+        after a change to settings has been made.
+
+        Parameters
+        ----------
+        s: dict
+            Dictionary of all process settings for the
+            measurement
+        """
+
+        # Save discharge from previous settings
+        old_discharge = copy.deepcopy(self.meas.discharge)
+
+        # Apply new settings
+        self.meas.apply_settings(settings=s)
+
+        # Update table
+        self.update_gps_table(
+            old_discharge=old_discharge, new_discharge=self.meas.discharge
+        )
+        self.gps_bt()
+
+        # Update plots
+        self.gps_plots()
+        self.tab_gps_2_data.setFocus()
+
+    @QtCore.pyqtSlot(str)
+    def change_quality(self, text):
+        """Coordinates user initiated change to the minumum GPS quality.
+
+        Parameters
+        ----------
+        text: str
+            User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change settings based on combo box selection
+            if text == "1-Autonomous":
+                s["ggaDiffQualFilter"] = 1
+            elif text == "2-Differential":
+                s["ggaDiffQualFilter"] = 2
+            elif text == "4+-RTK":
+                s["ggaDiffQualFilter"] = 4
+
+            # Update measurement and display
+            self.update_gps_tab(s)
+            self.change = True
+
+    @QtCore.pyqtSlot(str)
+    def change_altitude(self, text):
+        """Coordinates user initiated change to the error velocity settings.
+
+        Parameters
+        ----------
+        text: str
+            User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change setting based on combo box selection
+            s["ggaAltitudeFilter"] = text
+
+            if text == "Manual":
+                # If Manual enable the line edit box for user input. Updates
+                # are not applied until the user has entered
+                # a value in the line edit box.
+                self.ed_gps_altitude_threshold.setEnabled(True)
+
+            else:
+                # If manual is not selected the line edit box is cleared and
+                # disabled and the updates applied.
+                self.ed_gps_altitude_threshold.setEnabled(False)
+                self.ed_gps_altitude_threshold.setText("")
+                self.update_gps_tab(s)
+            self.change = True
+
+    @QtCore.pyqtSlot(str)
+    def change_hdop(self, text):
+        """Coordinates user initiated change to the vertical velocity settings.
+
+        Parameters
+        ----------
+        text: str
+         User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change setting based on combo box selection
+            s["GPSHDOPFilter"] = text
+
+            if text == "Manual":
+                # If Manual enable the line edit box for user input. Updates
+                # are not applied until the user has entered
+                # a value in the line edit box.
+                self.ed_gps_hdop_threshold.setEnabled(True)
+
+            else:
+                # If manual is not selected the line edit box is cleared and
+                # disabled and the updates applied.
+                self.ed_gps_hdop_threshold.setEnabled(False)
+                self.ed_gps_hdop_threshold.setText("")
+                self.update_gps_tab(s)
+            self.change = True
+
+    @QtCore.pyqtSlot(str)
+    def change_gps_other(self, text):
+        """Coordinates user initiated change to the vertical velocity settings.
+
+        Parameters
+        ----------
+        text: str
+         User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change setting based on combo box selection
+            if text == "Off":
+                s["GPSSmoothFilter"] = "Off"
+            elif text == "Smooth":
+                s["GPSSmoothFilter"] = "On"
+
+            # Update measurement and display
+            self.update_gps_tab(s)
+            self.change = True
+
+    @QtCore.pyqtSlot()
+    def change_altitude_threshold(self):
+        """Coordinates application of a user specified error velocity
+        threshold.
+        """
+
+        self.ed_gps_altitude_threshold.blockSignals(True)
+        with self.wait_cursor():
+            # Get threshold and convert to SI units
+            threshold = self.check_numeric_input(self.ed_gps_altitude_threshold)
+            if threshold is not None:
+                threshold = threshold / self.units["L"]
+
+                # Get current settings
+                s = self.meas.current_settings()
+                # Because editingFinished is used if return is pressed and
+                # later focus is changed the method could get
+                # twice. This line checks to see if there was and actual
+                # change.
+                if np.abs(threshold - s["ggaAltitudeFilterChange"]) > 0.0001:
+                    # Change settings to manual and the associated threshold
+                    s["ggaAltitudeFilter"] = "Manual"
+                    s["ggaAltitudeFilterChange"] = threshold
+
+                    # Update measurement and display
+                    self.update_gps_tab(s)
+                    self.change = True
+
+        self.ed_gps_altitude_threshold.blockSignals(False)
+
+    @QtCore.pyqtSlot()
+    def change_hdop_threshold(self):
+        """Coordinates application of a user specified vertical velocity
+        threshold.
+        """
+
+        self.ed_gps_hdop_threshold.blockSignals(True)
+        with self.wait_cursor():
+            # Get threshold and convert to SI units
+            threshold = self.check_numeric_input(self.ed_gps_hdop_threshold)
+            if threshold is not None:
+
+                # Get current settings
+                s = self.meas.current_settings()
+                # Because editingFinished is used if return is pressed and
+                # later focus is changed the method could get
+                # twice. This line checks to see if there was and actual
+                # change.
+                if np.abs(threshold - s["GPSHDOPFilterMax"]) > 0.0001:
+                    # Change settings to manual and the associated threshold
+                    s["GPSHDOPFilter"] = "Manual"
+                    s["GPSHDOPFilterMax"] = threshold
+
+                    # Update measurement and display
+                    self.update_gps_tab(s)
+                    self.change = True
+
+        self.ed_gps_hdop_threshold.blockSignals(False)
+
+    def gps_bt(self):
+        """Displays the comparison of bottom track to GPS characteristics."""
+
+        # Setup table
+        tbl = self.table_gps_bt
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows + 2)
+        tbl.setColumnCount(11)
+        tbl.horizontalHeader().hide()
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        tbl.setStyleSheet("QToolTip{font: 12pt}")
+
+        if len(self.checked_transects_idx) > 0:
+            # Build column labels using custom_header to create appropriate
+            # spans
+            self.custom_header(tbl, 0, 0, 2, 1, self.tr("Transect"))
+            self.custom_header(tbl, 0, 1, 1, 5, self.tr("GGA"))
+            tbl.item(0, 1).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 1, 1, 1, 1, self.tr(" Lag \n(sec)"))
+            tbl.item(1, 1).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(
+                tbl, 1, 2, 1, 1, self.tr("BMG-GMG\nmag " + self.units["label_L"])
+            )
+            tbl.item(1, 2).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 1, 3, 1, 1, self.tr("BMG-GMG\ndir (deg)"))
+            tbl.item(1, 3).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 1, 4, 1, 1, self.tr("GC-BC\n(deg)"))
+            tbl.item(1, 4).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 1, 5, 1, 1, self.tr("BC/GC"))
+            tbl.item(1, 5).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 0, 6, 1, 5, self.tr("VTG"))
+            tbl.item(0, 6).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 1, 6, 1, 1, self.tr(" Lag \n(sec)"))
+            tbl.item(1, 6).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(
+                tbl, 1, 7, 1, 1, self.tr("BMG-GMG\nmag " + self.units["label_L"])
+            )
+            tbl.item(1, 7).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 1, 8, 1, 1, self.tr("BMG-GMG\ndir (deg)"))
+            tbl.item(1, 8).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 1, 9, 1, 1, self.tr("GC-BC\n(deg)"))
+            tbl.item(1, 9).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 1, 10, 1, 1, self.tr("BC/GC"))
+            tbl.item(1, 10).setTextAlignment(QtCore.Qt.AlignCenter)
+
+            # Add transect data
+            for row in range(nrows):
+                col = 0
+                transect_id = self.checked_transects_idx[row]
+
+                # File/transect name
+                tbl.setItem(
+                    row + 2,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].file_name[:-4]
+                    ),
+                )
+                tbl.item(row + 2, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                gga_lag, vtg_lag = TransectData.compute_gps_lag(
+                    self.meas.transects[transect_id]
+                )
+
+                # GGA lag
+                if gga_lag is not None:
+                    col = 1
+                    tbl.setItem(
+                        row + 2,
+                        col,
+                        QtWidgets.QTableWidgetItem("{:10.1f}".format(gga_lag)),
+                    )
+                    if self.meas.qa.gga_vel["lag_status"] == "warning":
+
+                        tbl.item(row + 2, col).setBackground(QtGui.QColor(255, 77, 77))
+                        tbl.item(row + 2, col).setToolTip(
+                            "GGA: BT and GGA do not appear to be sychronized"
+                        )
+
+                    elif self.meas.qa.gga_vel["lag_status"] == "caution":
+
+                        tbl.item(row + 2, col).setBackground(QtGui.QColor(255, 204, 0))
+                        tbl.item(row + 2, col).setToolTip(
+                            "gga: BT and GGA do not appear to be sychronized"
+                        )
+
+                    else:
+                        tbl.item(row + 2, col).setBackground(
+                            QtGui.QColor(255, 255, 255)
+                        )
+
+                if self.meas.transects[transect_id].boat_vel.gga_vel is not None:
+                    gga_bt = TransectData.compute_gps_bt(
+                        self.meas.transects[transect_id], gps_ref="gga_vel"
+                    )
+
+                    if len(gga_bt) > 0:
+                        # GGA BMG-GMG mag
+                        col = 2
+                        tbl.setItem(
+                            row + 2,
+                            col,
+                            QtWidgets.QTableWidgetItem(
+                                "{:10.3f}".format(gga_bt["mag"] * self.units["L"])
+                            ),
+                        )
+                        tbl.item(row + 2, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                        # GGA BMG-GMG dir
+                        col = 3
+                        tbl.setItem(
+                            row + 2,
+                            col,
+                            QtWidgets.QTableWidgetItem(
+                                "{:10.2f}".format(gga_bt["dir"])
+                            ),
+                        )
+                        tbl.item(row + 2, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                        # GGA GC-BC
+                        col = 4
+                        tbl.setItem(
+                            row + 2,
+                            col,
+                            QtWidgets.QTableWidgetItem(
+                                "{:10.2f}".format(gga_bt["course"])
+                            ),
+                        )
+                        tbl.item(row + 2, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                        # GGA BC/GC
+                        col = 5
+                        tbl.setItem(
+                            row + 2,
+                            col,
+                            QtWidgets.QTableWidgetItem(
+                                "{:10.4f}".format(gga_bt["ratio"])
+                            ),
+                        )
+                        tbl.item(row + 2, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # VTG lag
+                if vtg_lag is not None:
+                    col = 6
+                    tbl.setItem(
+                        row + 2,
+                        col,
+                        QtWidgets.QTableWidgetItem("{:10.1f}".format(vtg_lag)),
+                    )
+                    tbl.item(row + 2, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                    if self.meas.qa.vtg_vel["lag_status"] == "warning":
+
+                        tbl.item(row + 2, col).setBackground(QtGui.QColor(255, 77, 77))
+                        tbl.item(row + 2, col).setToolTip(
+                            "VTG: BT and VTG do not appear to be sychronized"
+                        )
+
+                    elif self.meas.qa.vtg_vel["lag_status"] == "caution":
+
+                        tbl.item(row + 2, col).setBackground(QtGui.QColor(255, 204, 0))
+                        tbl.item(row + 2, col).setToolTip(
+                            "vtg: BT and VTG do not appear to be sychronized"
+                        )
+
+                    else:
+                        tbl.item(row + 2, col).setBackground(
+                            QtGui.QColor(255, 255, 255)
+                        )
+
+                if self.meas.transects[transect_id].boat_vel.vtg_vel is not None:
+                    vtg_bt = TransectData.compute_gps_bt(
+                        self.meas.transects[transect_id], gps_ref="vtg_vel"
+                    )
+
+                    if len(vtg_bt) > 0:
+                        # VTG BMG-GMG mag
+                        col = 7
+                        tbl.setItem(
+                            row + 2,
+                            col,
+                            QtWidgets.QTableWidgetItem(
+                                "{:10.3f}".format(vtg_bt["mag"] * self.units["L"])
+                            ),
+                        )
+                        tbl.item(row + 2, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                        # VTG BMG-GMG dir
+                        col = 8
+                        tbl.setItem(
+                            row + 2,
+                            col,
+                            QtWidgets.QTableWidgetItem(
+                                "{:10.2f}".format(vtg_bt["dir"])
+                            ),
+                        )
+                        tbl.item(row + 2, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                        # VTG GC-BC
+                        col = 9
+                        tbl.setItem(
+                            row + 2,
+                            col,
+                            QtWidgets.QTableWidgetItem(
+                                "{:10.2f}".format(vtg_bt["course"])
+                            ),
+                        )
+                        tbl.item(row + 2, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                        # VTG BC/GC
+                        col = 10
+                        tbl.setItem(
+                            row + 2,
+                            col,
+                            QtWidgets.QTableWidgetItem(
+                                "{:10.4f}".format(vtg_bt["ratio"])
+                            ),
+                        )
+                        tbl.item(row + 2, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+        tbl.item(self.transect_row + 2, 0).setFont(self.font_bold)
+        tbl.scrollToItem(tbl.item(self.transect_row + 2, 0))
+
+        # Turn signals off
+        self.cb_gps_bt_2.blockSignals(True)
+        self.cb_gps_gga_2.blockSignals(True)
+        self.cb_gps_vtg_2.blockSignals(True)
+        self.cb_gps_vectors_2.blockSignals(True)
+
+        # Initialize checkbox settings for boat reference
+        self.cb_gps_bt_2.setCheckState(QtCore.Qt.Checked)
+        if (
+            self.meas.transects[self.checked_transects_idx[0]].boat_vel.gga_vel
+            is not None
+        ):
+            self.cb_gps_gga_2.setCheckState(QtCore.Qt.Checked)
+        if (
+            self.meas.transects[self.checked_transects_idx[0]].boat_vel.vtg_vel
+            is not None
+        ):
+            self.cb_gps_vtg_2.setCheckState(QtCore.Qt.Checked)
+
+        self.cb_gps_vectors_2.setCheckState(QtCore.Qt.Checked)
+
+        # Turn signals on
+        self.cb_gps_bt_2.blockSignals(False)
+        self.cb_gps_gga_2.blockSignals(False)
+        self.cb_gps_vtg_2.blockSignals(False)
+        self.cb_gps_vectors_2.blockSignals(False)
+
+        self.gps_bt_plots()
+
+        if not self.gps_initialized:
+            tbl.cellClicked.connect(self.gps_bt_table_clicked)
+            # Connect plot variable checkboxes
+            self.cb_gps_bt_2.stateChanged.connect(self.gps_bt_plot_change)
+            self.cb_gps_gga_2.stateChanged.connect(self.gps_bt_plot_change)
+            self.cb_gps_vtg_2.stateChanged.connect(self.gps_bt_plot_change)
+            self.cb_gps_vectors_2.stateChanged.connect(self.gps_bt_plot_change)
+
+            self.gps_bt_initialized = True
+
+    def gps_bt_table_clicked(self, row, column, caller=None):
+        """Changes plotted data to the transect of the transect clicked.
+
+        Parameters
+        ----------
+        row: int
+            Row clicked by user
+        column: int
+            Column clicked by user
+        caller: str
+            Identifies tab from which the method is called
+        """
+
+        if column == 0:
+            self.transect_row = row - 2
+            self.gps_bt_plots()
+            self.change = True
+        if caller is None:
+            self.gps_table_clicked(row - 2, column, caller="gps_bt")
+        self.tab_gps_2_gpsbt.setFocus()
+
+    def gps_bt_plots(self):
+        """Creates graphic for GPS BT tab."""
+
+        with self.wait_cursor():
+            # Set all filenames to normal font
+            nrows = len(self.checked_transects_idx)
+
+            # Determine transect selected
+            transect_id = self.checked_transects_idx[self.transect_row]
+            self.transect = self.meas.transects[transect_id]
+
+            # Identify transect to be plotted in table
+            for row in range(nrows):
+                self.table_gps_bt.item(row + 2, 0).setFont(self.font_normal)
+            # Set selected file to bold font
+            self.table_gps_bt.item(self.transect_row + 2, 0).setFont(self.font_bold)
+
+            # Update plots
+            self.gps_bt_shiptrack()
+            self.gps_bt_boat_speed()
+
+            # Update list of figs
+            self.figs = [self.gps_shiptrack_fig, self.gps_ts_fig]
+            self.fig_calls = [self.gps_bt_shiptrack, self.gps_bt_boat_speed]
+
+            # Reset data cursor to work with new data plot
+            if self.actionData_Cursor.isChecked():
+                self.data_cursor()
+
+        self.tab_gps_2_gpsbt.setFocus()
+
+    def gps_bt_shiptrack(self):
+        """Creates shiptrack plot for data in transect."""
+
+        self.cb_gps_bt_2.blockSignals(True)
+        self.cb_gps_gga_2.blockSignals(True)
+        self.cb_gps_vtg_2.blockSignals(True)
+        self.cb_gps_vectors_2.blockSignals(True)
+        self.cb_gps_bt_2.blockSignals(True)
+        self.cb_gps_gga_2.blockSignals(True)
+        self.cb_gps_vtg_2.blockSignals(True)
+        self.cb_gps_vectors_2.blockSignals(True)
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.gps_bt_shiptrack_canvas is None:
+            # Create the canvas
+            self.gps_bt_shiptrack_canvas = MplCanvas(
+                parent=self.graph_gps_st_2, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_gps_st_2)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.gps_bt_shiptrack_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.gps_bt_shiptrack_toolbar = NavigationToolbar(
+                self.gps_bt_shiptrack_canvas, self
+            )
+            self.gps_bt_shiptrack_toolbar.hide()
+
+        # Initialize the shiptrack figure and assign to the canvas
+        self.gps_bt_shiptrack_fig = Shiptrack(canvas=self.gps_bt_shiptrack_canvas)
+        # Create the figure with the specified data
+        self.gps_bt_shiptrack_fig.create(
+            transect=self.transect,
+            units=self.units,
+            cb=True,
+            cb_bt=self.cb_gps_bt_2,
+            cb_gga=self.cb_gps_gga_2,
+            cb_vtg=self.cb_gps_vtg_2,
+            cb_vectors=self.cb_gps_vectors_2,
+        )
+
+        # Draw canvas
+        self.gps_bt_shiptrack_canvas.draw()
+
+        self.cb_gps_bt_2.blockSignals(False)
+        self.cb_gps_gga_2.blockSignals(False)
+        self.cb_gps_vtg_2.blockSignals(False)
+        self.cb_gps_vectors_2.blockSignals(False)
+
+    def gps_bt_boat_speed(self):
+        """Creates boat speed plot for data in transect."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.gps_bt_speed_canvas is None:
+            # Create the canvas
+            self.gps_bt_speed_canvas = MplCanvas(
+                parent=self.graph_gps_bt_ts, width=8, height=2, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_gps_bt_ts)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.gps_bt_speed_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.gps_bt_speed_toolbar = NavigationToolbar(
+                self.gps_bt_speed_canvas, self
+            )
+            self.gps_bt_speed_toolbar.hide()
+
+        # Initialize the boat speed figure and assign to the canvas
+        self.gps_bt_speed_fig = BoatSpeed(canvas=self.gps_bt_speed_canvas)
+        # Create the figure with the specified data
+        self.gps_bt_speed_fig.create(
+            transect=self.transect,
+            units=self.units,
+            cb=True,
+            cb_bt=self.cb_gps_bt_2,
+            cb_gga=self.cb_gps_gga_2,
+            cb_vtg=self.cb_gps_vtg_2,
+        )
+
+        # Draw canvas
+        self.gps_bt_speed_canvas.draw()
+
+    @QtCore.pyqtSlot()
+    def gps_bt_plot_change(self):
+        """Coordinates changes in what references should be displayed in the
+        boat speed and shiptrack plots.
+        """
+
+        with self.wait_cursor():
+            # Shiptrack
+            self.gps_bt_shiptrack_fig.change()
+            self.gps_bt_shiptrack_canvas.draw()
+
+            # Boat speed
+            self.gps_bt_speed_fig.change()
+            self.gps_bt_speed_canvas.draw()
+
+            self.tab_gps_2_gpsbt.setFocus()
+
+    def gps_comments_messages(self):
+        """Displays comments and messages associated with gps filters in
+        Messages tab.
+        """
+
+        # Clear comments and messages
+        self.display_gps_comments.clear()
+        self.display_gps_messages.clear()
+
+        if self.meas is not None:
+            # Display each comment on a new line
+            self.display_gps_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                self.display_gps_comments.textCursor().insertText(comment)
+                self.display_gps_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_gps_comments.textCursor().insertBlock()
+
+            # Display each message on a new line
+            self.display_gps_messages.moveCursor(QtGui.QTextCursor.Start)
+            for message in self.meas.qa.gga_vel["messages"]:
+                if type(message) is str:
+                    self.display_gps_messages.textCursor().insertText(message)
+                else:
+                    self.display_gps_messages.textCursor().insertText(message[0])
+                self.display_gps_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_gps_messages.textCursor().insertBlock()
+            for message in self.meas.qa.vtg_vel["messages"]:
+                if type(message) is str:
+                    self.display_gps_messages.textCursor().insertText(message)
+                else:
+                    self.display_gps_messages.textCursor().insertText(message[0])
+                self.display_gps_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_gps_messages.textCursor().insertBlock()
+
+            self.update_tab_icons()
+
+    # Depth tab
+    # =======
+    def depth_tab(self, old_discharge=None):
+        """Initialize, setup settings, and display initial data in depth tab.
+
+        Parameters
+        ----------
+        old_discharge: list
+            List of objects of QComp with previous settings
+        """
+
+        # Setup data table
+        tbl = self.table_depth
+        table_header = [
+            self.tr("Filename"),
+            self.tr("Draft \n" + self.units["label_L"]),
+            self.tr("Number or \n Ensembles"),
+            self.tr("Beam 1 \n % Invalid"),
+            self.tr("Beam 2 \n % Invalid"),
+            self.tr("Beam 3 \n % Invalid"),
+            self.tr("Beam 4 \n % Invalid"),
+            self.tr("Vertical \n % Invalid"),
+            self.tr("Depth Sounder \n % Invalid"),
+            self.tr("Discharge \n Previous \n" + self.units["label_Q"]),
+            self.tr("Discharge \n Now \n" + self.units["label_Q"]),
+            self.tr("Discharge \n % Change"),
+        ]
+        ncols = len(table_header)
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(table_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        tbl.setStyleSheet("QToolTip{font: 12pt}")
+
+        # Automatically resize rows and columns
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+        if not self.depth_initialized:
+            tbl.cellClicked.connect(self.depth_table_clicked)
+
+            # Initialize checkbox settings top plot and build depth ref
+            # combobox options
+            self.cb_depth_beam1.setCheckState(QtCore.Qt.Checked)
+            self.cb_depth_beam2.setCheckState(QtCore.Qt.Checked)
+            self.cb_depth_beam3.setCheckState(QtCore.Qt.Checked)
+            self.cb_depth_beam4.setCheckState(QtCore.Qt.Checked)
+
+            # Initialize checkbox settings bottom plot
+            self.cb_depth_4beam_cs.setCheckState(QtCore.Qt.Unchecked)
+            self.cb_depth_final_cs.setCheckState(QtCore.Qt.Checked)
+            self.cb_depth_vert_cs.setCheckState(QtCore.Qt.Unchecked)
+            self.cb_depth_ds_cs.setCheckState(QtCore.Qt.Unchecked)
+
+            # Initialize checkbox settings top plot and build depth ref
+            # combobox options
+            self.cb_depth_beam1.setCheckState(QtCore.Qt.Checked)
+            self.cb_depth_beam2.setCheckState(QtCore.Qt.Checked)
+            self.cb_depth_beam3.setCheckState(QtCore.Qt.Checked)
+            self.cb_depth_beam4.setCheckState(QtCore.Qt.Checked)
+
+            # Connect top plot variable checkboxes
+            self.cb_depth_beam1.stateChanged.connect(self.depth_top_plot_change)
+            self.cb_depth_beam2.stateChanged.connect(self.depth_top_plot_change)
+            self.cb_depth_beam3.stateChanged.connect(self.depth_top_plot_change)
+            self.cb_depth_beam4.stateChanged.connect(self.depth_top_plot_change)
+            self.cb_depth_vert.stateChanged.connect(self.depth_top_plot_change)
+            self.cb_depth_ds.stateChanged.connect(self.depth_top_plot_change)
+
+            # Connect bottom plot variable checkboxes
+            self.cb_depth_4beam_cs.stateChanged.connect(self.depth_bottom_plot_change)
+            self.cb_depth_final_cs.stateChanged.connect(self.depth_bottom_plot_change)
+            self.cb_depth_vert_cs.stateChanged.connect(self.depth_bottom_plot_change)
+            self.cb_depth_ds_cs.stateChanged.connect(self.depth_bottom_plot_change)
+
+            # Connect options
+            self.combo_depth_ref.currentIndexChanged[str].connect(self.change_ref)
+            self.combo_depth_avg.currentIndexChanged[str].connect(
+                self.change_avg_method
+            )
+            self.combo_depth_filter.currentIndexChanged[str].connect(self.change_filter)
+
+            self.depth_initialized = True
+
+        self.combo_depth_ref.blockSignals(True)
+        depth_ref_options = [self.tr("4-Beam Avg")]
+
+        # Setup depth reference combo box for vertical beam
+        if (
+            self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].depths.vb_depths
+            is not None
+        ):
+            self.cb_depth_vert.blockSignals(True)
+            self.cb_depth_vert.setCheckState(QtCore.Qt.Checked)
+            self.cb_depth_vert.blockSignals(False)
+            depth_ref_options.append(self.tr("Comp 4-Beam Preferred"))
+            depth_ref_options.append(self.tr("Vertical"))
+            depth_ref_options.append(self.tr("Comp Vertical Preferred"))
+            self.cb_depth_vert.setEnabled(True)
+            self.cb_depth_vert_cs.setEnabled(True)
+        else:
+            self.cb_depth_vert.setEnabled(False)
+            self.cb_depth_vert_cs.setEnabled(False)
+
+        # Setup depth reference combo box for depth sounder
+        if (
+            self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].depths.ds_depths
+            is not None
+        ):
+            self.cb_depth_ds.blockSignals(True)
+            self.cb_depth_ds.setCheckState(QtCore.Qt.Checked)
+            self.cb_depth_ds.blockSignals(False)
+            depth_ref_options.append(self.tr("Comp 4-Beam Preferred"))
+            depth_ref_options.append(self.tr("Depth Sounder"))
+            depth_ref_options.append(self.tr("Comp DS Preferred"))
+            self.cb_depth_ds.setEnabled(True)
+            self.cb_depth_ds_cs.setEnabled(True)
+        else:
+            self.cb_depth_ds.setEnabled(False)
+            self.cb_depth_ds_cs.setEnabled(False)
+
+        self.combo_depth_ref.clear()
+        self.combo_depth_ref.addItems(depth_ref_options)
+
+        # Transect selected for display
+        self.transect = self.meas.transects[
+            self.checked_transects_idx[self.transect_row]
+        ]
+        depth_ref_selected = self.transect.depths.selected
+        depth_composite = self.transect.depths.composite
+
+        # Turn signals off
+        self.combo_depth_avg.blockSignals(True)
+        self.combo_depth_filter.blockSignals(True)
+
+        # Set depth reference
+        self.combo_depth_ref.blockSignals(True)
+        if depth_ref_selected == "bt_depths":
+            if depth_composite == "On":
+                self.combo_depth_ref.setCurrentIndex(1)
+            else:
+                self.combo_depth_ref.setCurrentIndex(0)
+        elif depth_ref_selected == "vb_depths":
+            if depth_composite == "On":
+                self.combo_depth_ref.setCurrentIndex(3)
+            else:
+                self.combo_depth_ref.setCurrentIndex(2)
+        elif depth_ref_selected == "ds_depths":
+            if depth_composite == "On":
+                self.combo_depth_ref.setCurrentIndex(5)
+            else:
+                self.combo_depth_ref.setCurrentIndex(4)
+        self.combo_depth_ref.blockSignals(False)
+
+        # Set depth average method
+        depths_selected = getattr(
+            self.meas.transects[self.checked_transects_idx[self.transect_row]].depths,
+            depth_ref_selected,
+        )
+        self.combo_depth_avg.blockSignals(True)
+        if depths_selected.avg_method == "IDW":
+            self.combo_depth_avg.setCurrentIndex(0)
+        else:
+            self.combo_depth_avg.setCurrentIndex(1)
+        self.combo_depth_avg.blockSignals(False)
+
+        # Set depth filter method
+        self.combo_depth_filter.blockSignals(True)
+        if depths_selected.filter_type == "Smooth":
+            self.combo_depth_filter.setCurrentIndex(1)
+        elif depths_selected.filter_type == "TRDI":
+            self.combo_depth_filter.setCurrentIndex(2)
+        else:
+            self.combo_depth_filter.setCurrentIndex(0)
+        self.combo_depth_filter.blockSignals(False)
+
+        # Turn signals on
+        self.combo_depth_ref.blockSignals(False)
+        self.combo_depth_avg.blockSignals(False)
+        self.combo_depth_filter.blockSignals(False)
+
+        # Display content
+        if old_discharge is None:
+            old_discharge = self.meas.discharge
+        self.update_depth_table(
+            old_discharge=old_discharge, new_discharge=self.meas.discharge
+        )
+        self.depth_plots()
+        self.depth_comments_messages()
+
+        # Setup list for use by graphics controls
+        self.canvases = [self.depth_canvas]
+        self.figs = [self.depth_fig]
+        self.fig_calls = [self.depth_plots]
+        self.toolbars = [self.depth_toolbar]
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+    def update_depth_table(self, old_discharge, new_discharge):
+        """Updates the depth table with new or reprocessed data.
+
+        Parameters
+        ----------
+        old_discharge: list
+            List of objects of QComp with previous settings
+        new_discharge: list
+            List of objects of QComp with new settings
+        """
+
+        with self.wait_cursor():
+            # Set tbl variable
+            tbl = self.table_depth
+
+            # Populate each row
+            for row in range(tbl.rowCount()):
+                # Identify transect associated with the row
+                transect_id = self.checked_transects_idx[row]
+                transect = self.meas.transects[transect_id]
+                valid_beam_data = transect.depths.bt_depths.valid_beams
+                if transect.depths.vb_depths is not None:
+                    valid_vert_beam = transect.depths.vb_depths.valid_beams
+                else:
+                    valid_vert_beam = None
+                if transect.depths.ds_depths is not None:
+                    valid_ds_beam = transect.depths.ds_depths.valid_beams
+                else:
+                    valid_ds_beam = None
+
+                num_ensembles = len(valid_beam_data[0, :])
+
+                # File/transect name
+                col = 0
+                item = QtWidgets.QTableWidgetItem(transect.file_name[:-4])
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.depths["q_total_warning"][transect_id]
+                    or self.meas.qa.depths["q_max_run_warning"][transect_id]
+                    or self.meas.qa.depths["all_invalid"][transect_id]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.depths["q_total_caution"][transect_id]
+                    or self.meas.qa.depths["q_max_run_caution"][transect_id]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                tbl.item(row, col).setToolTip(self.depth_create_tooltip(self, row, col))
+
+                # Draft
+                col += 1
+                item = "{:5.2f}".format(
+                    transect.depths.bt_depths.draft_use_m * self.units["L"]
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if self.meas.qa.depths["draft"] == 2:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+                elif self.meas.qa.depths["draft"] == 1:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                tbl.item(row, col).setToolTip(self.depth_create_tooltip(self, row, col))
+
+                # Total number of ensembles
+                col += 1
+                item = "{:5d}".format(num_ensembles)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent of invalid depths in beam 1
+                col += 1
+                item = "{:3.2f}".format(
+                    ((num_ensembles - np.nansum(valid_beam_data[0, :])) / num_ensembles)
+                    * 100.0
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent of invalid depths in beam 2
+                col += 1
+                item = "{:3.2f}".format(
+                    ((num_ensembles - np.nansum(valid_beam_data[1, :])) / num_ensembles)
+                    * 100.0
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent of invalid depths in beam 3
+                col += 1
+                item = "{:3.2f}".format(
+                    ((num_ensembles - np.nansum(valid_beam_data[2, :])) / num_ensembles)
+                    * 100.0
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent of invalid depths in beam 4
+                col += 1
+                item = "{:3.2f}".format(
+                    ((num_ensembles - np.nansum(valid_beam_data[3, :])) / num_ensembles)
+                    * 100.0
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent of invalid depths in vertical beam
+                col += 1
+                if valid_vert_beam is not None:
+                    item = "{:3.2f}".format(
+                        ((num_ensembles - np.nansum(valid_vert_beam)) / num_ensembles)
+                        * 100.0
+                    )
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent of invalid depths in depth sounder
+                col += 1
+                if valid_ds_beam is not None:
+                    item = "{:3.2f}".format(
+                        ((num_ensembles - np.nansum(valid_ds_beam)) / num_ensembles)
+                        * 100.0
+                    )
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Discharge before changes
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                old_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Discharge after changes
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                new_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent change in discharge
+                col += 1
+                if np.abs(old_discharge[transect_id].total) > 0:
+                    per_change = (
+                        (
+                            new_discharge[transect_id].total
+                            - old_discharge[transect_id].total
+                        )
+                        / old_discharge[transect_id].total
+                    ) * 100
+                    tbl.setItem(
+                        row,
+                        col,
+                        QtWidgets.QTableWidgetItem("{:3.1f}".format(per_change)),
+                    )
+                else:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                tbl.item(row, 0).setFont(self.font_normal)
+
+            # Set selected file to bold font
+            tbl.item(self.transect_row, 0).setFont(self.font_bold)
+            tbl.scrollToItem(tbl.item(self.transect_row, 0))
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+
+    @staticmethod
+    def depth_create_tooltip(self, row, column):
+        """Create tooltips for depth table."""
+
+        # Identify transect associated with the row
+        transect_id = self.checked_transects_idx[row]
+        tt = ""
+        if column == 0:
+            cat_idx = 0
+            tt = "".join(
+                self.q_qa_message(
+                    qa_data=self.meas.qa.depths,
+                    cat_idx=cat_idx,
+                    transect_id=transect_id,
+                    total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                    total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                    run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                    run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                )
+            )
+            tt = "".join(tt)
+
+        elif column == 1:
+            if self.meas.qa.depths["draft"] == 1:
+                tt = self.tr("Transducer depth is not consistent among transects.")
+            elif self.meas.qa.depths["draft"] == 2:
+                tt = self.tr("Transducer depth is too shallow, likely 0.")
+        return tt
+
+    def depth_plots(self):
+        """Creates graphics for depth tab."""
+
+        with self.wait_cursor():
+            # Set all filenames to normal font
+            nrows = len(self.checked_transects_idx)
+
+            # Determine transect selected
+            transect_id = self.checked_transects_idx[self.transect_row]
+            self.transect = self.meas.transects[transect_id]
+
+            for row in range(nrows):
+                self.table_depth.item(row, 0).setFont(self.font_normal)
+
+            # Set selected file to bold font
+            self.table_depth.item(self.transect_row, 0).setFont(self.font_bold)
+
+            # If the canvas has not been previously created, create the
+            # canvas and add the widget.
+            if self.depth_canvas is None:
+                # Create the canvas
+                self.depth_canvas = MplCanvas(
+                    parent=self.graph_depth, width=8, height=2, dpi=80
+                )
+                # Assign layout to widget to allow auto scaling
+                layout = QtWidgets.QVBoxLayout(self.graph_depth)
+                # Adjust margins of layout to maximize graphic area
+                layout.setContentsMargins(0, 0, 0, 0)
+                # Add the canvas
+                layout.addWidget(self.depth_canvas)
+                # Initialize hidden toolbar for use by graphics controls
+                self.depth_toolbar = NavigationToolbar(self.depth_canvas, self)
+                self.depth_toolbar.hide()
+
+            # Initialize the top figure and assign to the canvas
+            self.depth_fig = AdvGraphs(canvas=self.depth_canvas)
+            # Create the figure with the specified data
+            self.depth_fig.create_depth_tab_graphs(
+                transect=self.transect,
+                units=self.units,
+                b1=self.cb_depth_beam1.isChecked(),
+                b2=self.cb_depth_beam2.isChecked(),
+                b3=self.cb_depth_beam3.isChecked(),
+                b4=self.cb_depth_beam4.isChecked(),
+                vb=self.cb_depth_vert.isChecked(),
+                ds=self.cb_depth_ds.isChecked(),
+                avg4_final=self.cb_depth_4beam_cs.isChecked(),
+                vb_final=self.cb_depth_vert_cs.isChecked(),
+                ds_final=self.cb_depth_ds_cs.isChecked(),
+                final=self.cb_depth_final_cs.isChecked(),
+                x_axis_type=self.x_axis_type,
+            )
+
+            # Draw canvas
+            self.depth_canvas.draw()
+
+            # Update list of figs
+            self.figs = [self.depth_fig]
+            self.fig_calls = [self.depth_plots]
+            self.toolbars = [self.depth_toolbar]
+
+            # Reset data cursor to work with new figure
+            if self.actionData_Cursor.isChecked():
+                self.data_cursor()
+            self.tab_depth_2_data.setFocus()
+
+    @QtCore.pyqtSlot(int, int)
+    def depth_table_clicked(self, row, column):
+        """Changes plotted data to the transect of the transect clicked or
+        allows changing of the draft.
+
+        Parameters
+        ----------
+        row: int
+            Row clicked by user
+        column: int
+            Column clicked by user
+        """
+
+        self.table_depth.blockSignals(True)
+        # Change transect plotted
+        if column == 0:
+            self.transect_row = row
+            self.depth_plots()
+            self.change = True
+
+        # Change draft
+        if column == 1:
+            # Intialize dialog
+            draft_dialog = Draft(self)
+            draft_dialog.draft_units.setText(self.units["label_L"])
+            draft_entered = draft_dialog.exec_()
+            # If data entered.
+            with self.wait_cursor():
+                # Save discharge from previous settings
+                old_discharge = copy.deepcopy(self.meas.discharge)
+                if draft_entered:
+                    draft = self.check_numeric_input(draft_dialog.ed_draft)
+                    if draft is not None:
+                        draft = draft / self.units["L"]
+                        # Apply change to selected or all transects
+                        if draft_dialog.rb_all.isChecked():
+                            self.meas.change_draft(draft=draft)
+                        else:
+                            self.meas.change_draft(
+                                draft=draft,
+                                transect_idx=self.checked_transects_idx[row],
+                            )
+
+                        # Update table
+                        self.update_depth_table(
+                            old_discharge=old_discharge,
+                            new_discharge=self.meas.discharge,
+                        )
+
+                        # Update plots
+                        self.depth_plots()
+
+                        self.depth_comments_messages()
+                        self.change = True
+        self.table_depth.blockSignals(False)
+        self.tab_depth_2_data.setFocus()
+
+    def update_depth_tab(self, s):
+        """Updates the depth tab (table and graphics) after a change to
+        settings has been made.
+
+        Parameters
+        ----------
+        s: dict
+            Dictionary of all process settings for the
+            measurement
+        """
+
+        # Save discharge from previous settings
+        old_discharge = copy.deepcopy(self.meas.discharge)
+
+        # Apply new settings
+        self.meas.apply_settings(settings=s)
+
+        # Update table
+        self.update_depth_table(
+            old_discharge=old_discharge, new_discharge=self.meas.discharge
+        )
+
+        # Update plots
+        self.depth_plots()
+
+        self.depth_comments_messages()
+        self.tab_depth_2_data.setFocus()
+
+    @QtCore.pyqtSlot()
+    def depth_top_plot_change(self):
+        """Coordinates changes in user selected data to be displayed in the
+        top plot.
+        """
+
+        self.depth_plots()
+
+    @QtCore.pyqtSlot()
+    def depth_bottom_plot_change(self):
+        """Coordinates changes in user selected data to be displayed in
+        the bottom plot."""
+
+        self.depth_plots()
+
+    @QtCore.pyqtSlot(str)
+    def change_ref(self, text):
+        """Coordinates user initiated change to depth reference.
+
+        Parameters
+        ----------
+        text: str
+            User selection from combo box
+        """
+
+        with self.wait_cursor():
+            self.combo_depth_ref.blockSignals(True)
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change settings based on combo box selection
+            if text == "4-Beam Avg":
+                s["depthReference"] = "bt_depths"
+                s["depthComposite"] = "Off"
+            elif text == "Comp 4-Beam Preferred":
+                s["depthReference"] = "bt_depths"
+                s["depthComposite"] = "On"
+            elif text == "Vertical":
+                s["depthReference"] = "vb_depths"
+                s["depthComposite"] = "Off"
+            elif text == "Comp Vertical Preferred":
+                s["depthReference"] = "vb_depths"
+                s["depthComposite"] = "On"
+            elif text == "Depth Sounder":
+                s["depthReference"] = "ds_depths"
+                s["depthComposite"] = "Off"
+            elif text == "Comp DS Preferred":
+                s["depthReference"] = "ds_depths"
+                s["depthComposite"] = "On"
+
+            # Update measurement and display
+            self.update_depth_tab(s)
+            self.change = True
+            self.combo_depth_ref.blockSignals(False)
+
+    @QtCore.pyqtSlot(str)
+    def change_filter(self, text):
+        """Coordinates user initiated change to the depth filter.
+
+        Parameters
+        ----------
+        text: str
+            User selection from combo box
+        """
+
+        with self.wait_cursor():
+            self.combo_depth_filter.blockSignals(True)
+            # Get current settings
+            s = self.meas.current_settings()
+            s["depthFilterType"] = text
+
+            # Update measurement and display
+            self.update_depth_tab(s)
+            self.change = True
+            self.combo_depth_filter.blockSignals(False)
+
+    @QtCore.pyqtSlot(str)
+    def change_avg_method(self, text):
+        """Coordinates user initiated change to the averaging method.
+
+        Parameters
+        ----------
+        text: str
+            User selection from combo box
+        """
+
+        with self.wait_cursor():
+            self.combo_depth_avg.blockSignals(True)
+
+            # Get current settings
+            s = self.meas.current_settings()
+            s["depthAvgMethod"] = text
+
+            # Update measurement and display
+            self.update_depth_tab(s)
+            self.change = True
+            self.combo_depth_avg.blockSignals(False)
+
+    def depth_comments_messages(self):
+        """Displays comments and messages associated with depth filters in
+        Messages tab.
+        """
+
+        # Clear comments and messages
+        self.display_depth_comments.clear()
+        self.display_depth_messages.clear()
+
+        if self.meas is not None:
+            # Display each comment on a new line
+            self.display_depth_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                self.display_depth_comments.textCursor().insertText(comment)
+                self.display_depth_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_depth_comments.textCursor().insertBlock()
+
+            # Display each message on a new line
+            self.display_depth_messages.moveCursor(QtGui.QTextCursor.Start)
+            for message in self.meas.qa.depths["messages"]:
+                if type(message) is str:
+                    self.display_depth_messages.textCursor().insertText(message)
+                else:
+                    self.display_depth_messages.textCursor().insertText(message[0])
+                self.display_depth_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_depth_messages.textCursor().insertBlock()
+
+            self.update_tab_icons()
+
+    # WT tab
+    # ======
+    def wt_tab(self, old_discharge=None):
+        """Initialize, setup settings, and display initial data in water
+        track tab.
+
+        Parameters
+        ----------
+        old_discharge: list
+            List of objects of QComp with previous settings
+        """
+
+        # Setup data table
+        tbl = self.table_wt
+        table_header = [
+            self.tr("Filename"),
+            self.tr("Number of \n Depth Cells"),
+            self.tr("Beam \n % <4"),
+            self.tr("Total \n % Invalid"),
+            self.tr("Orig Data \n % Invalid"),
+            self.tr("<4 Beam \n % Invalid"),
+            self.tr("Error Vel \n % Invalid"),
+            self.tr("Vert Vel \n % Invalid"),
+            self.tr("Other \n % Invalid"),
+            self.tr("SNR \n % Invalid"),
+            self.tr("Discharge \n Previous " + self.units["label_Q"]),
+            self.tr("Discharge \n Now " + self.units["label_Q"]),
+            self.tr("Discharge \n % Change"),
+        ]
+        ncols = len(table_header)
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(table_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        tbl.setStyleSheet("QToolTip{font: 12pt}")
+
+        # Automatically resize rows and columns
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+        # Turn signals off
+        self.cb_wt_bt.blockSignals(True)
+        self.cb_wt_gga.blockSignals(True)
+        self.cb_wt_vtg.blockSignals(True)
+        self.cb_wt_vectors.blockSignals(True)
+        self.combo_wt_3beam.blockSignals(True)
+        self.combo_wt_error_velocity.blockSignals(True)
+        self.combo_wt_vert_velocity.blockSignals(True)
+        self.combo_wt_snr.blockSignals(True)
+
+        # Initialize checkbox settings for boat reference
+        self.cb_wt_bt.setCheckState(QtCore.Qt.Checked)
+        self.cb_wt_gga.setCheckState(QtCore.Qt.Unchecked)
+        self.cb_wt_vtg.setCheckState(QtCore.Qt.Unchecked)
+        selected = self.meas.transects[
+            self.checked_transects_idx[self.transect_row]
+        ].boat_vel.selected
+        if selected == "gga_vel":
+            self.cb_wt_gga.setCheckState(QtCore.Qt.Checked)
+        elif selected == "vtg_vel":
+            self.cb_wt_vtg.setCheckState(QtCore.Qt.Checked)
+
+        self.cb_wt_vectors.setCheckState(QtCore.Qt.Checked)
+
+        # Connect plot variable checkboxes
+        self.cb_wt_bt.stateChanged.connect(self.wt_plot_change)
+        self.cb_wt_gga.stateChanged.connect(self.wt_plot_change)
+        self.cb_wt_vtg.stateChanged.connect(self.wt_plot_change)
+        self.cb_wt_vectors.stateChanged.connect(self.wt_plot_change)
+
+        # Setup SNR option for SonTek
+        if (
+            self.meas.transects[self.checked_transects_idx[0]].adcp.manufacturer
+            == "SonTek"
+        ):
+            self.rb_wt_snr.setEnabled(True)
+            self.combo_wt_snr.setEnabled(True)
+            self.rb_wt_snr.toggled.connect(self.wt_radiobutton_control)
+        else:
+            self.rb_wt_snr.setEnabled(False)
+            self.combo_wt_snr.setEnabled(False)
+
+        # Turn signals on
+        self.cb_wt_bt.blockSignals(False)
+        self.cb_wt_gga.blockSignals(False)
+        self.cb_wt_vtg.blockSignals(False)
+        self.cb_wt_vectors.blockSignals(False)
+        self.combo_wt_3beam.blockSignals(False)
+        self.combo_wt_error_velocity.blockSignals(False)
+        self.combo_wt_vert_velocity.blockSignals(False)
+        self.combo_wt_snr.blockSignals(False)
+
+        # Initialize connections
+        if not self.wt_initialized:
+            tbl.cellClicked.connect(self.wt_table_clicked)
+            # Connect radio buttons
+            self.rb_wt_beam.toggled.connect(self.wt_radiobutton_control)
+            self.rb_wt_error.toggled.connect(self.wt_radiobutton_control)
+            self.rb_wt_vert.toggled.connect(self.wt_radiobutton_control)
+            self.rb_wt_speed.toggled.connect(self.wt_radiobutton_control)
+            self.rb_wt_contour.toggled.connect(self.wt_radiobutton_control)
+
+            # Connect manual entry
+            self.ed_wt_error_vel_threshold.editingFinished.connect(
+                self.change_wt_error_vel_threshold
+            )
+            self.ed_wt_vert_vel_threshold.editingFinished.connect(
+                self.change_wt_vert_vel_threshold
+            )
+
+            # Connect filters
+            self.ed_wt_excluded_dist.editingFinished.connect(
+                self.change_wt_excluded_dist
+            )
+            self.combo_wt_3beam.currentIndexChanged[str].connect(self.change_wt_beam)
+            self.combo_wt_error_velocity.currentIndexChanged[str].connect(
+                self.change_wt_error
+            )
+            self.combo_wt_vert_velocity.currentIndexChanged[str].connect(
+                self.change_wt_vertical
+            )
+            self.combo_wt_snr.currentIndexChanged[str].connect(self.change_wt_snr)
+
+            self.wt_initialized = True
+
+        # Transect selected for display
+        self.transect = self.meas.transects[
+            self.checked_transects_idx[self.transect_row]
+        ]
+        if old_discharge is None:
+            old_discharge = self.meas.discharge
+        self.update_wt_table(
+            old_discharge=old_discharge, new_discharge=self.meas.discharge
+        )
+
+        # Set beam filter from transect data
+        if self.transect.w_vel.beam_filter < 0:
+            self.combo_wt_3beam.setCurrentIndex(0)
+        elif self.transect.w_vel.beam_filter == 3:
+            self.combo_wt_3beam.setCurrentIndex(1)
+        elif self.transect.w_vel.beam_filter == 4:
+            self.combo_wt_3beam.setCurrentIndex(2)
+        else:
+            self.combo_wt_3beam.setCurrentIndex(0)
+
+        # Set excluded distance from transect data
+        ex_dist = (
+            self.meas.transects[self.checked_transects_idx[0]].w_vel.excluded_dist_m
+            * self.units["L"]
+        )
+        self.ed_wt_excluded_dist.setText("{:2.2f}".format(ex_dist))
+
+        # Set error velocity filter from transect data
+        index = self.combo_wt_error_velocity.findText(
+            self.transect.w_vel.d_filter, QtCore.Qt.MatchFixedString
+        )
+        self.combo_wt_error_velocity.setCurrentIndex(index)
+        s = self.meas.current_settings()
+
+        if self.transect.w_vel.d_filter == "Manual":
+            threshold = "{:3.2f}".format(s["WTdFilterThreshold"] * self.units["V"])
+            self.ed_wt_error_vel_threshold.setText(threshold)
+
+        # Set vertical velocity filter from transect data
+        index = self.combo_wt_vert_velocity.findText(
+            self.transect.w_vel.w_filter, QtCore.Qt.MatchFixedString
+        )
+        self.combo_wt_vert_velocity.setCurrentIndex(index)
+
+        if self.transect.w_vel.w_filter == "Manual":
+            threshold = "{:3.2f}".format(s["WTwFilterThreshold"] * self.units["V"])
+            self.ed_wt_vert_vel_threshold.setText(threshold)
+
+        # Set smooth filter from transect data
+        self.combo_wt_snr.blockSignals(True)
+        if self.transect.w_vel.snr_filter == "Auto":
+            self.combo_wt_snr.setCurrentIndex(0)
+        elif self.transect.w_vel.snr_filter == "Off":
+            self.combo_wt_snr.setCurrentIndex(1)
+        self.combo_wt_snr.blockSignals(False)
+
+        # Display content
+        self.wt_plots()
+        self.wt_comments_messages()
+
+        # Setup list for use by graphics controls
+        self.canvases = [self.wt_shiptrack_canvas, self.wt_filter_canvas]
+        self.figs = [self.wt_shiptrack_fig, self.wt_filter_fig]
+        self.fig_calls = [self.wt_shiptrack, self.wt_filter_plots]
+        self.toolbars = [self.wt_shiptrack_toolbar, self.wt_filter_toolbar]
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+    def update_wt_table(self, old_discharge, new_discharge):
+        """Updates the bottom track table with new or reprocessed data.
+
+        Parameters
+        ----------
+        old_discharge: list
+            List of objects of QComp with previous settings
+        new_discharge: list
+            List of objects of QComp with new settings
+        """
+
+        with self.wait_cursor():
+            # Set tbl variable
+            tbl = self.table_wt
+
+            # Populate each row
+            for row in range(tbl.rowCount()):
+                # Identify transect associated with the row
+                transect_id = self.checked_transects_idx[row]
+                transect = self.meas.transects[transect_id]
+
+                # Prep data for table
+                valid_data = transect.w_vel.valid_data
+                useable_cells = transect.w_vel.valid_data[6, :, :]
+                num_useable_cells = np.nansum(np.nansum(useable_cells.astype(int)))
+                wt_temp = copy.deepcopy(transect.w_vel)
+                wt_temp.filter_beam(4)
+                not_4beam = np.nansum(
+                    np.nansum(
+                        np.logical_not(wt_temp.valid_data[5, :, :][useable_cells])
+                    )
+                )
+                num_invalid = np.nansum(
+                    np.nansum(np.logical_not(valid_data[0, :, :][useable_cells]))
+                )
+                num_orig_invalid = np.nansum(
+                    np.nansum(np.logical_not(valid_data[1, :, :][useable_cells]))
+                )
+                num_beam_invalid = np.nansum(
+                    np.nansum(np.logical_not(valid_data[5, :, :][useable_cells]))
+                )
+                num_error_invalid = np.nansum(
+                    np.nansum(np.logical_not(valid_data[2, :, :][useable_cells]))
+                )
+                num_vert_invalid = np.nansum(
+                    np.nansum(np.logical_not(valid_data[3, :, :][useable_cells]))
+                )
+                num_other_invalid = np.nansum(
+                    np.nansum(np.logical_not(valid_data[4, :, :][useable_cells]))
+                )
+                num_snr_invalid = np.nansum(
+                    np.nansum(np.logical_not(valid_data[7, :, :][useable_cells]))
+                )
+
+                # File/transect name
+                col = 0
+                item = QtWidgets.QTableWidgetItem(transect.file_name[:-4])
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                tbl.item(row, 0).setFont(self.font_normal)
+
+                # Total number of depth cells
+                col += 1
+                item = "{:7d}".format(num_useable_cells)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Less than 4 beams
+                col += 1
+                item = "{:3.2f}".format((not_4beam / num_useable_cells) * 100.0)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Invalid total
+                col += 1
+                item = "{:3.2f}".format((num_invalid / num_useable_cells) * 100.0)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.w_vel["all_invalid"][transect_id]
+                    or self.meas.qa.w_vel["q_total_warning"][transect_id, 0]
+                    or self.meas.qa.w_vel["q_max_run_warning"][transect_id, 0]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.w_vel["q_total_caution"][transect_id, 0]
+                    or self.meas.qa.w_vel["q_max_run_caution"][transect_id, 0]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                tbl.item(row, col).setToolTip(
+                    self.tr(self.wt_create_tooltip(self, row, col))
+                )
+
+                # Invalid original data
+                col += 1
+                percent_invalid = (num_orig_invalid / num_useable_cells) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.w_vel["q_total_warning"][transect_id, 1]
+                    or self.meas.qa.w_vel["q_max_run_warning"][transect_id, 1]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.w_vel["q_total_caution"][transect_id, 1]
+                    or self.meas.qa.w_vel["q_max_run_caution"][transect_id, 1]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.wt_create_tooltip(self, row, col))
+                    )
+
+                # Invalid 3 beam
+                col += 1
+                percent_invalid = (num_beam_invalid / num_useable_cells) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.w_vel["q_total_warning"][transect_id, 5]
+                    or self.meas.qa.w_vel["q_max_run_warning"][transect_id, 5]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.w_vel["q_total_caution"][transect_id, 5]
+                    or self.meas.qa.w_vel["q_max_run_caution"][transect_id, 5]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.wt_create_tooltip(self, row, col))
+                    )
+
+                # Error velocity invalid
+                col += 1
+                percent_invalid = (num_error_invalid / num_useable_cells) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.w_vel["q_total_warning"][transect_id, 2]
+                    or self.meas.qa.w_vel["q_max_run_warning"][transect_id, 2]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.w_vel["q_total_caution"][transect_id, 2]
+                    or self.meas.qa.w_vel["q_max_run_caution"][transect_id, 2]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.wt_create_tooltip(self, row, col))
+                    )
+
+                # Vertical velocity invalid
+                col += 1
+                percent_invalid = (num_vert_invalid / num_useable_cells) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.w_vel["q_total_warning"][transect_id, 3]
+                    or self.meas.qa.w_vel["q_max_run_warning"][transect_id, 3]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.w_vel["q_total_caution"][transect_id, 3]
+                    or self.meas.qa.w_vel["q_max_run_caution"][transect_id, 3]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.wt_create_tooltip(self, row, col))
+                    )
+
+                # Other
+                col += 1
+                percent_invalid = (num_other_invalid / num_useable_cells) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if (
+                    self.meas.qa.w_vel["q_total_warning"][transect_id, 4]
+                    or self.meas.qa.w_vel["q_max_run_warning"][transect_id, 4]
+                    or percent_invalid == 100
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                elif (
+                    self.meas.qa.w_vel["q_total_caution"][transect_id, 4]
+                    or self.meas.qa.w_vel["q_max_run_caution"][transect_id, 4]
+                ):
+
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                if percent_invalid == 100:
+                    tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                else:
+                    tbl.item(row, col).setToolTip(
+                        self.tr(self.wt_create_tooltip(self, row, col))
+                    )
+
+                # SNR
+                col += 1
+                percent_invalid = (num_snr_invalid / num_useable_cells) * 100.0
+                item = "{:3.2f}".format(percent_invalid)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if self.meas.qa.w_vel["q_total_warning"].shape[1] > 7:
+                    if (
+                        self.meas.qa.w_vel["q_total_warning"][transect_id, 7]
+                        or self.meas.qa.w_vel["q_max_run_warning"][transect_id, 7]
+                        or percent_invalid == 100
+                    ):
+
+                        tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+
+                    elif (
+                        self.meas.qa.w_vel["q_total_caution"][transect_id, 7]
+                        or self.meas.qa.w_vel["q_max_run_caution"][transect_id, 7]
+                    ):
+
+                        tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+
+                    else:
+                        tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                    if percent_invalid == 100:
+                        tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                    else:
+                        tbl.item(row, col).setToolTip(
+                            self.tr(self.wt_create_tooltip(self, row, col))
+                        )
+
+                    if percent_invalid == 100:
+                        tbl.item(row, col).setToolTip(self.tr("All data are invalid."))
+                    else:
+                        tbl.item(row, col).setToolTip(
+                            self.tr(self.wt_create_tooltip(self, row, col))
+                        )
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Discharge before changes
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                old_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Discharge after changes
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(
+                            self.q_digits(
+                                new_discharge[transect_id].total * self.units["Q"]
+                            )
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Percent change in discharge
+                col += 1
+                if np.abs(old_discharge[transect_id].total) > 0:
+                    per_change = (
+                        (
+                            new_discharge[transect_id].total
+                            - old_discharge[transect_id].total
+                        )
+                        / old_discharge[transect_id].total
+                    ) * 100
+                    tbl.setItem(
+                        row,
+                        col,
+                        QtWidgets.QTableWidgetItem("{:3.1f}".format(per_change)),
+                    )
+                else:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Set selected file to bold font
+
+            tbl.item(self.transect_row, 0).setFont(self.font_bold)
+            tbl.scrollToItem(tbl.item(self.transect_row, 0))
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+
+            self.wt_comments_messages()
+            self.tab_wt_2_data.setFocus()
+
+    def wt_plots(self):
+        """Creates graphics for WT tab."""
+
+        with self.wait_cursor():
+            self.cb_wt_bt.blockSignals(True)
+            self.cb_wt_gga.blockSignals(True)
+            self.cb_wt_vtg.blockSignals(True)
+            self.cb_wt_vectors.blockSignals(True)
+            # Set all filenames to normal font
+            nrows = len(self.checked_transects_idx)
+            for nrow in range(nrows):
+                self.table_wt.item(nrow, 0).setFont(self.font_normal)
+
+            # Set selected file to bold font
+            self.table_wt.item(self.transect_row, 0).setFont(self.font_bold)
+
+            # Determine transect selected
+            transect_id = self.checked_transects_idx[self.transect_row]
+            self.transect = self.meas.transects[transect_id]
+            self.invalid_wt = np.logical_not(self.transect.w_vel.valid_data)
+
+            # Update plots
+            self.wt_shiptrack()
+            self.wt_filter_plots()
+
+            # Update list of figs
+            self.figs = [self.wt_shiptrack_fig, self.wt_filter_fig]
+            self.fig_calls = [self.wt_shiptrack, self.wt_filter_plots]
+
+            # Reset data cursor to work with new figure
+            if self.actionData_Cursor.isChecked():
+                self.data_cursor()
+
+            self.cb_wt_bt.blockSignals(False)
+            self.cb_wt_gga.blockSignals(False)
+            self.cb_wt_vtg.blockSignals(False)
+            self.cb_wt_vectors.blockSignals(False)
+
+    def wt_shiptrack(self):
+        """Creates shiptrack plot for data in transect."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.wt_shiptrack_canvas is None:
+            # Create the canvas
+            self.wt_shiptrack_canvas = MplCanvas(
+                parent=self.graph_wt_st, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_wt_st)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.wt_shiptrack_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.wt_shiptrack_toolbar = NavigationToolbar(
+                self.wt_shiptrack_canvas, self
+            )
+            self.wt_shiptrack_toolbar.hide()
+
+        # Initialize the shiptrack figure and assign to the canvas
+        self.wt_shiptrack_fig = Shiptrack(canvas=self.wt_shiptrack_canvas)
+        # Create the figure with the specified data
+        self.wt_shiptrack_fig.create(
+            transect=self.transect,
+            units=self.units,
+            cb=True,
+            cb_bt=self.cb_wt_bt,
+            cb_gga=self.cb_wt_gga,
+            cb_vtg=self.cb_wt_vtg,
+            cb_vectors=self.cb_wt_vectors,
+        )
+
+        # Draw canvas
+        self.wt_shiptrack_canvas.draw()
+
+    @QtCore.pyqtSlot()
+    def wt_radiobutton_control(self):
+        """Identifies a change in radio buttons and calls the plot routine
+        to update the graph.
+        """
+
+        with self.wait_cursor():
+            if self.sender().isChecked():
+                self.wt_filter_plots()
+
+    def wt_filter_plots(self):
+        """Creates plots of filter characteristics."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.wt_filter_canvas is None:
+            # Create the canvas
+            self.wt_filter_canvas = MplCanvas(
+                parent=self.graph_wt, width=10, height=2, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_wt)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(0, 0, 0, 0)
+            # Add the canvas
+            layout.addWidget(self.wt_filter_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.wt_filter_toolbar = NavigationToolbar(self.wt_filter_canvas, self)
+            self.wt_filter_toolbar.hide()
+
+        # Initialize the water filters figure and assign to the canvas
+        self.wt_filter_fig = AdvGraphs(canvas=self.wt_filter_canvas)
+        if self.plot_extrapolated:
+            self.wt_filter_fig.create_wt_tab_graphs(
+                transect=self.transect,
+                units=self.units,
+                contour=self.rb_wt_contour.isChecked(),
+                beam=self.rb_wt_beam.isChecked(),
+                error=self.rb_wt_error.isChecked(),
+                vert=self.rb_wt_vert.isChecked(),
+                snr=self.rb_wt_snr.isChecked(),
+                speed=self.rb_wt_speed.isChecked(),
+                x_axis_type=self.x_axis_type,
+                color_map=self.color_map,
+                discharge=self.meas.discharge[
+                    self.checked_transects_idx[self.transect_row]
+                ],
+            )
+        else:
+            self.wt_filter_fig.create_wt_tab_graphs(
+                transect=self.transect,
+                units=self.units,
+                contour=self.rb_wt_contour.isChecked(),
+                beam=self.rb_wt_beam.isChecked(),
+                error=self.rb_wt_error.isChecked(),
+                vert=self.rb_wt_vert.isChecked(),
+                snr=self.rb_wt_snr.isChecked(),
+                speed=self.rb_wt_speed.isChecked(),
+                x_axis_type=self.x_axis_type,
+                color_map=self.color_map,
+            )
+
+        # Draw canvas
+        self.wt_filter_canvas.draw()
+
+        # Update list of figs
+        self.figs = [self.wt_shiptrack_fig, self.wt_filter_fig]
+        self.fig_calls = [self.wt_shiptrack, self.wt_filter_plots]
+
+        # Reset data cursor to work with new figure
+        if self.actionData_Cursor.isChecked():
+            self.data_cursor()
+        self.tab_wt_2_data.setFocus()
+
+    def wt_table_clicked(self, row, column):
+        """Changes plotted data to the transect of the transect clicked.
+
+        Parameters
+        ----------
+        row: int
+            Row clicked by user
+        column: int
+            Column clicked by user
+        """
+
+        if column == 0:
+            self.transect_row = row
+            self.wt_plots()
+            self.change = True
+        self.tab_wt_2_data.setFocus()
+
+    @staticmethod
+    def wt_create_tooltip(self, row, column):
+        """Create tooltips for WT table."""
+
+        # Identify transect associated with the row
+        transect_id = self.checked_transects_idx[row]
+
+        cat_idx = None
+        tt = ""
+
+        if column == 3:
+            cat_idx = 0
+        elif column == 4:
+            cat_idx = 1
+        elif column == 5:
+            cat_idx = 5
+        elif column == 6:
+            cat_idx = 2
+        elif column == 7:
+            cat_idx = 3
+        elif column == 8:
+            cat_idx = 4
+        elif column == 9:
+            cat_idx = 7
+
+        if cat_idx is not None:
+            tt = "".join(
+                self.q_qa_message(
+                    qa_data=self.meas.qa.w_vel,
+                    cat_idx=cat_idx,
+                    transect_id=transect_id,
+                    total_threshold_warning=self.meas.qa.q_total_threshold_warning,
+                    total_threshold_caution=self.meas.qa.q_total_threshold_caution,
+                    run_threshold_warning=self.meas.qa.q_run_threshold_warning,
+                    run_threshold_caution=self.meas.qa.q_run_threshold_caution,
+                )
+            )
+        return tt
+
+    @QtCore.pyqtSlot()
+    def wt_plot_change(self):
+        """Coordinates changes in what references should be displayed in the
+        shiptrack plots.
+        """
+
+        with self.wait_cursor():
+            # Shiptrack
+            self.wt_shiptrack_fig.change()
+            self.wt_shiptrack_canvas.draw()
+            self.tab_wt_2_data.setFocus()
+
+    def update_wt_tab(self, s):
+        """Updates the measurement and water track tab (table and graphics)
+        after a change to settings has been made.
+
+        Parameters
+        ----------
+        s: dict
+            Dictionary of all process settings for the
+            measurement
+        """
+
+        # Save discharge from previous settings
+        old_discharge = copy.deepcopy(self.meas.discharge)
+
+        # Apply new settings
+        self.meas.apply_settings(settings=s)
+
+        # Update table
+        self.update_wt_table(
+            old_discharge=old_discharge, new_discharge=self.meas.discharge
+        )
+        self.wt_comments_messages()
+
+        # Update plots
+        self.wt_plots()
+        self.tab_wt_2_data.setFocus()
+
+    @QtCore.pyqtSlot(str)
+    def change_wt_beam(self, text):
+        """Coordinates user initiated change to the beam settings.
+
+        Parameters
+        ----------
+        text: str
+            User selection from combo box
+        """
+
+        with self.wait_cursor():
+
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change beam filter setting
+            if text == "Auto":
+                s["WTbeamFilter"] = -1
+            elif text == "Allow":
+                s["WTbeamFilter"] = 3
+            elif text == "4-Beam Only":
+                s["WTbeamFilter"] = 4
+
+            # Update measurement and display
+            self.update_wt_tab(s)
+            self.change = True
+
+    @QtCore.pyqtSlot(str)
+    def change_wt_error(self, text):
+        """Coordinates user initiated change to the error velocity settings.
+
+        Parameters
+        ----------
+        text: str
+            User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change setting based on combo box selection
+            s["WTdFilter"] = text
+
+            if text == "Manual":
+                # If Manual enable the line edit box for user input. Updates
+                # are not applied until the user has entered
+                # a value in the line edit box.
+                self.ed_wt_error_vel_threshold.setEnabled(True)
+            else:
+                # If manual is not selected the line edit box is cleared and
+                # disabled and the updates applied.
+                self.ed_wt_error_vel_threshold.setEnabled(False)
+                self.ed_wt_error_vel_threshold.setText("")
+                self.update_wt_tab(s)
+
+            self.change = True
+
+    @QtCore.pyqtSlot(str)
+    def change_wt_vertical(self, text):
+        """Coordinates user initiated change to the vertical velocity settings.
+
+        Parameters
+        ----------
+        text: str
+            User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change setting based on combo box selection
+            s["WTwFilter"] = text
+
+            if text == "Manual":
+                # If Manual enable the line edit box for user input. Updates
+                # are not applied until the user has entered
+                # a value in the line edit box.
+                self.ed_wt_vert_vel_threshold.setEnabled(True)
+            else:
+                # If manual is not selected the line edit box is cleared and
+                # disabled and the updates applied.
+                self.ed_wt_vert_vel_threshold.setEnabled(False)
+                self.ed_wt_vert_vel_threshold.setText("")
+                self.update_wt_tab(s)
+            self.change = True
+
+    @QtCore.pyqtSlot(str)
+    def change_wt_snr(self, text):
+        """Coordinates user initiated change to the vertical velocity settings.
+
+        Parameters
+        ----------
+        text: str
+         User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Get current settings
+            s = self.meas.current_settings()
+
+            # Change setting based on combo box selection
+            if text == "Off":
+                s["WTsnrFilter"] = "Off"
+            elif text == "Auto":
+                s["WTsnrFilter"] = "Auto"
+
+            # Update measurement and display
+            self.update_wt_tab(s)
+            self.change = True
+
+    @QtCore.pyqtSlot()
+    def change_wt_error_vel_threshold(self):
+        """Coordinates application of a user specified error velocity
+        threshold.
+        """
+
+        self.ed_wt_error_vel_threshold.blockSignals(True)
+        with self.wait_cursor():
+            # Get threshold and convert to SI units
+            threshold = self.check_numeric_input(self.ed_wt_error_vel_threshold)
+            if threshold is not None:
+                threshold = threshold / self.units["V"]
+                # Get current settings
+                s = self.meas.current_settings()
+                # Because editingFinished is used if return is pressed and
+                # later focus is changed the method could get
+                # twice. This checks to see if there was and actual change.
+                compute = False
+                if type(s["WTdFilterThreshold"]) is dict:
+                    compute = True
+                else:
+                    if np.abs(threshold - s["WTdFilterThreshold"]) > 0.0001:
+                        compute = True
+                if compute:
+                    # Change settings to manual and the associated threshold
+                    s["WTdFilter"] = "Manual"
+                    s["WTdFilterThreshold"] = threshold
+
+                    # Update measurement and display
+                    self.update_wt_tab(s)
+                    self.change = True
+
+        self.ed_wt_error_vel_threshold.blockSignals(False)
+
+    @QtCore.pyqtSlot()
+    def change_wt_vert_vel_threshold(self):
+        """Coordinates application of a user specified vertical velocity
+        threshold.
+        """
+
+        self.ed_wt_vert_vel_threshold.blockSignals(True)
+        with self.wait_cursor():
+            # Get threshold and convert to SI units
+            threshold = self.check_numeric_input(self.ed_wt_vert_vel_threshold)
+            if threshold is not None:
+                threshold = threshold / self.units["V"]
+
+                # Get current settings
+                s = self.meas.current_settings()
+                # Because editingFinished is used if return is pressed and
+                # later focus is changed the method could get twice. This checks
+                # to see if there was and actual change.
+                compute = False
+                if type(s["WTwFilterThreshold"]) is dict:
+                    compute = True
+                else:
+                    if np.abs(threshold - s["WTwFilterThreshold"]) > 0.0001:
+                        compute = True
+                if compute:
+                    # Change settings to manual and the associated threshold
+                    s["WTwFilter"] = "Manual"
+                    s["WTwFilterThreshold"] = threshold
+
+                    # Update measurement and display
+                    self.update_wt_tab(s)
+                    self.change = True
+
+        self.ed_wt_vert_vel_threshold.blockSignals(False)
+
+    @QtCore.pyqtSlot()
+    def change_wt_excluded_dist(self):
+        """Coordinates application of a user specified excluded distance."""
+
+        self.ed_wt_excluded_dist.blockSignals(True)
+        with self.wait_cursor():
+            # Get threshold and convert to SI units
+            threshold = self.check_numeric_input(self.ed_wt_excluded_dist)
+            if threshold is not None:
+                threshold = threshold / self.units["L"]
+
+                # Get current settings
+                s = self.meas.current_settings()
+                # Because editingFinished is used if return is pressed and
+                # later focus is changed the method could get twice. This line
+                # checks to see if there was and actual change.
+                if np.abs(threshold - s["WTExcludedDistance"]) > 0.0001:
+                    # Change settings
+                    s["WTExcludedDistance"] = threshold
+
+                    # Update measurement and display
+                    self.update_wt_tab(s)
+                    self.change = True
+
+        self.ed_wt_excluded_dist.blockSignals(False)
+
+    def wt_comments_messages(self):
+        """Displays comments and messages associated with bottom track
+        filters in Messages tab.
+        """
+
+        # Clear comments and messages
+        self.display_wt_comments.clear()
+        self.display_wt_messages.clear()
+
+        if self.meas is not None:
+            # Display each comment on a new line
+            self.display_wt_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                self.display_wt_comments.textCursor().insertText(comment)
+                self.display_wt_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_wt_comments.textCursor().insertBlock()
+
+            # Display each message on a new line
+            self.display_wt_messages.moveCursor(QtGui.QTextCursor.Start)
+            for message in self.meas.qa.w_vel["messages"]:
+
+                if type(message) is str:
+                    self.display_wt_messages.textCursor().insertText(message)
+                else:
+                    self.display_wt_messages.textCursor().insertText(message[0])
+                self.display_wt_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_wt_messages.textCursor().insertBlock()
+
+            self.update_tab_icons()
+
+    # Extrap Tab
+    # ==========
+    def extrap_tab(self):
+        """Initializes all of the features on the extrap_tab."""
+
+        # Make copy to allow resting to original if changes are made
+        self.extrap_meas = copy.deepcopy(self.meas)
+
+        self.extrap_index(len(self.checked_transects_idx))
+        self.start_bank = None
+
+        # ID Weighted Method
+        if self.meas.extrap_fit.norm_data[-1].use_weighted:
+            self.gb_fit.setTitle(self.tr("Fit Parameters (Weighted)"))
+        else:
+            self.gb_fit.setTitle(self.tr("Fit Parameters"))
+
+        # Subsectioning
+        if self.meas.extrap_fit.sub_from_left:
+            self.txt_extrap_subsection.setText(self.tr("Subsection (% L to R, x:x):"))
+        else:
+            self.txt_extrap_subsection.setText(self.tr("Subsection (st%:end%)"))
+
+        # Setup number of points data table
+        tbl = self.table_extrap_n_points
+        table_header = [self.tr("Z"), self.tr("No. Pts.")]
+        ncols = len(table_header)
+        nrows = len(self.meas.extrap_fit.norm_data[-1].unit_normalized_z)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(table_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        self.n_points_table()
+
+        # Setup discharge sensitivity table
+        tbl = self.table_extrap_qsen
+        table_header = [
+            self.tr("Top"),
+            self.tr("Bottom"),
+            self.tr("Exponent"),
+            self.tr("% Diff"),
+        ]
+        ncols = len(table_header)
+        nrows = 6
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(table_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        self.q_sensitivity_table()
+
+        # Setup transect / measurement list table
+        tbl = self.table_extrap_fit
+        ncols = 1
+        nrows = len(self.checked_transects_idx) + 1
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.verticalHeader().hide()
+        tbl.horizontalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        self.fit_list_table()
+
+        self.display_current_fit()
+        self.set_fit_options()
+
+        self.extrap_set_data()
+        self.extrap_plot()
+
+        self.extrap_comments_messages()
+
+        # Initialize connections
+        if not self.extrap_initialized:
+            self.table_extrap_qsen.cellClicked.connect(self.sensitivity_change_fit)
+            self.table_extrap_fit.cellClicked.connect(self.fit_list_table_clicked)
+            # Connect fit options
+            self.combo_extrap_fit.currentIndexChanged[str].connect(
+                self.change_fit_method
+            )
+            self.combo_extrap_top.currentIndexChanged[str].connect(
+                self.change_top_method
+            )
+            self.combo_extrap_bottom.currentIndexChanged[str].connect(
+                self.change_bottom_method
+            )
+            self.ed_extrap_exponent.editingFinished.connect(self.change_exponent)
+
+            # Connect display settings
+            self.cb_extrap_data.stateChanged.connect(self.extrap_plot)
+            self.cb_extrap_surface.stateChanged.connect(self.extrap_plot)
+            self.cb_extrap_meas_medians.stateChanged.connect(self.extrap_plot)
+            self.cb_extrap_meas_fit.stateChanged.connect(self.extrap_plot)
+            self.cb_extrap_trans_medians.stateChanged.connect(self.extrap_plot)
+            self.cb_extrap_trans_fit.stateChanged.connect(self.extrap_plot)
+
+            # Connect data settings
+            self.combo_extrap_data.currentIndexChanged[str].connect(self.change_data)
+            self.ed_extrap_threshold.editingFinished.connect(self.change_threshold)
+            self.ed_extrap_subsection.editingFinished.connect(self.change_subsection)
+            self.combo_extrap_type.currentIndexChanged[str].connect(
+                self.change_data_type
+            )
+
+            # Cancel and apply buttons
+            self.pb_extrap_cancel.clicked.connect(self.cancel_extrap)
+
+            self.extrap_initialized = True
+
+        # Setup list for use by graphics controls
+        self.canvases = [self.extrap_canvas]
+        self.figs = [self.extrap_fig]
+        self.fig_calls = [self.extrap_plot]
+        self.toolbars = [self.extrap_toolbar]
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+    def extrap_update(self):
+        """Update the extrapolation tab."""
+
+        # If change was to the measurement apply changes and update
+        # sensitivity and messages
+        if self.idx == len(self.meas.extrap_fit.sel_fit) - 1:
+            s = self.meas.current_settings()
+            self.meas.apply_settings(s)
+            self.q_sensitivity_table()
+            self.extrap_comments_messages()
+            self.change = True
+        else:
+            # Run qa to update messages for user data setting changes if
+            # other than Measurement selected
+            self.meas.update_qa()
+
+        # ID Weighted Method
+        if self.meas.extrap_fit.norm_data[-1].use_weighted:
+            self.gb_fit.setTitle(self.tr("Fit Parameters (Weighted)"))
+        else:
+            self.gb_fit.setTitle(self.tr("Fit Parameters"))
+
+        # Subsectioning
+        if self.meas.extrap_fit.sub_from_left:
+            self.txt_extrap_subsection.setText(self.tr("Subsection (% L to R, x:x):"))
+        else:
+            self.txt_extrap_subsection.setText(self.tr("Subsection (st%:end%)"))
+
+        # Update tab
+        self.n_points_table()
+        self.set_fit_options()
+        self.extrap_plot()
+        self.extrap_comments_messages()
+
+    def extrap_index(self, row):
+        """Converts the row value to a transect index.
+
+        Parameters
+        ----------
+        row: int
+            Row selected from the fit list table
+        """
+
+        if row > len(self.checked_transects_idx) - 1:
+            self.idx = len(self.meas.transects)
+        else:
+            self.idx = self.checked_transects_idx[row]
+
+    def display_current_fit(self):
+        """Displays the extrapolation methods currently used to compute
+        discharge.
+        """
+
+        # Display Previous settings
+        self.txt_extrap_p_fit.setText(self.meas.extrap_fit.sel_fit[-1].fit_method)
+        self.txt_extrap_p_top.setText(self.meas.extrap_fit.sel_fit[-1].top_method)
+        self.txt_extrap_p_bottom.setText(self.meas.extrap_fit.sel_fit[-1].bot_method)
+        self.txt_extrap_p_exponent.setText(
+            "{:6.4f}".format(self.meas.extrap_fit.sel_fit[-1].exponent)
+        )
+
+    def set_fit_options(self):
+        """Sets the fit options for the currently selected transect or
+        measurement.
+        """
+
+        # Setup fit method
+        self.combo_extrap_fit.blockSignals(True)
+        if self.meas.extrap_fit.sel_fit[self.idx].fit_method == "Automatic":
+            self.combo_extrap_fit.setCurrentIndex(0)
+            self.combo_extrap_top.setEnabled(False)
+            self.combo_extrap_bottom.setEnabled(False)
+            self.ed_extrap_exponent.setEnabled(False)
+        else:
+            self.combo_extrap_fit.setCurrentIndex(1)
+            self.combo_extrap_top.setEnabled(True)
+            self.combo_extrap_bottom.setEnabled(True)
+            self.ed_extrap_exponent.setEnabled(True)
+        self.combo_extrap_fit.blockSignals(False)
+
+        # Set top method
+        self.combo_extrap_top.blockSignals(True)
+        if self.meas.extrap_fit.sel_fit[self.idx].top_method == "Power":
+            self.combo_extrap_top.setCurrentIndex(0)
+        elif self.meas.extrap_fit.sel_fit[self.idx].top_method == "Constant":
+            self.combo_extrap_top.setCurrentIndex(1)
+        else:
+            self.combo_extrap_top.setCurrentIndex(2)
+        self.combo_extrap_top.blockSignals(False)
+
+        # Set bottom method
+        self.combo_extrap_bottom.blockSignals(True)
+        if self.meas.extrap_fit.sel_fit[self.idx].bot_method == "Power":
+            self.combo_extrap_bottom.setCurrentIndex(0)
+        else:
+            self.combo_extrap_bottom.setCurrentIndex(1)
+        self.combo_extrap_bottom.blockSignals(False)
+
+        # Set exponent
+        self.ed_extrap_exponent.blockSignals(True)
+        self.ed_extrap_exponent.setText(
+            "{:6.4f}".format(self.meas.extrap_fit.sel_fit[self.idx].exponent)
+        )
+        self.ed_extrap_exponent.blockSignals(False)
+
+    def n_points_table(self):
+        """Populates the table showing the normalized depth of each layer
+        and how many data points are in each layer.
+        """
+
+        # Set table variable
+        tbl = self.table_extrap_n_points
+
+        # Get normalized data for transect or measurement selected
+        norm_data = self.meas.extrap_fit.norm_data[self.idx]
+
+        # Populate the table row by row substituting standard values if no
+        # data exist.
+        for row in range(len(norm_data.unit_normalized_z)):
+            # Column 0 is normalized depth
+            col = 0
+            if np.isnan(norm_data.unit_normalized_z[row]):
+                value = 1 - row / 20.0
+            else:
+                value = norm_data.unit_normalized_z[row]
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem("{:6.4f}".format(value)))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Column 1 is number of points
+            col = 1
+            if np.isnan(norm_data.unit_normalized_no[row]):
+                value = 0
+            else:
+                value = norm_data.unit_normalized_no[row]
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem("{:8.0f}".format(value)))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+
+    def q_sensitivity_table(self):
+        """Populates the discharge sensitivity table."""
+
+        # Set table reference
+        tbl = self.table_extrap_qsen
+
+        # Get sensitivity data
+        q_sen = self.meas.extrap_fit.q_sensitivity
+
+        # Power / Power / 1/6
+        row = 0
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Power"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.setItem(row, 1, QtWidgets.QTableWidgetItem("Power"))
+        tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.4f}".format(0.1667)
+        tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.2f}".format(q_sen.q_pp_per_diff)
+        tbl.setItem(row, 3, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        # Power / Power / Optimize
+        row = 1
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Power"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.setItem(row, 1, QtWidgets.QTableWidgetItem("Power"))
+        tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.4f}".format(q_sen.pp_exp)
+        tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.2f}".format(q_sen.q_pp_opt_per_diff)
+        tbl.setItem(row, 3, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        # Constant / No Slip / 1/6
+        row = 2
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Constant"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.setItem(row, 1, QtWidgets.QTableWidgetItem("No Slip"))
+        tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.4f}".format(0.1667)
+        tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.2f}".format(q_sen.q_cns_per_diff)
+        tbl.setItem(row, 3, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        # Constant / No Slip / Optimize
+        row = 3
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Constant"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.setItem(row, 1, QtWidgets.QTableWidgetItem("No Slip"))
+        tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.4f}".format(q_sen.ns_exp)
+        tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.2f}".format(q_sen.q_cns_opt_per_diff)
+        tbl.setItem(row, 3, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        # 3-Point / No Slip / 1/6
+        row = 4
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("3-Point"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.setItem(row, 1, QtWidgets.QTableWidgetItem("No Slip"))
+        tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.4f}".format(0.1667)
+        tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.2f}".format(q_sen.q_3p_ns_per_diff)
+        tbl.setItem(row, 3, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        # 3-Point / No Slip / Optimize
+        row = 5
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("3-Point"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        tbl.setItem(row, 1, QtWidgets.QTableWidgetItem("No Slip"))
+        tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.4f}".format(q_sen.ns_exp)
+        tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+        item = "{:6.2f}".format(q_sen.q_3p_ns_opt_per_diff)
+        tbl.setItem(row, 3, QtWidgets.QTableWidgetItem(item))
+        tbl.item(row, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        # Manually set fit method
+        if q_sen.q_man_mean is not None:
+            row = tbl.rowCount()
+            if row == 6:
+                tbl.insertRow(row)
+            else:
+                row = row - 1
+            tbl.setItem(row, 0, QtWidgets.QTableWidgetItem(q_sen.man_top))
+            tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(q_sen.man_bot))
+            tbl.item(row, 1).setFlags(QtCore.Qt.ItemIsEnabled)
+            item = "{:6.4f}".format(q_sen.man_exp)
+            tbl.setItem(row, 2, QtWidgets.QTableWidgetItem(item))
+            tbl.item(row, 2).setFlags(QtCore.Qt.ItemIsEnabled)
+            item = "{:6.2f}".format(q_sen.q_man_per_diff)
+            tbl.setItem(row, 3, QtWidgets.QTableWidgetItem(item))
+            tbl.item(row, 3).setFlags(QtCore.Qt.ItemIsEnabled)
+        elif tbl.rowCount() == 7:
+            tbl.removeRow(6)
+
+        # Set reference
+        if q_sen.q_man_mean is not None:
+            self.set_extrap_reference(6)
+        elif np.abs(q_sen.q_pp_per_diff) < 0.00000001:
+            self.set_extrap_reference(0)
+        elif np.abs(q_sen.q_pp_opt_per_diff) < 0.00000001:
+            self.set_extrap_reference(1)
+        elif np.abs(q_sen.q_cns_per_diff) < 0.00000001:
+            self.set_extrap_reference(2)
+        elif np.abs(q_sen.q_cns_opt_per_diff) < 0.00000001:
+            self.set_extrap_reference(3)
+        elif np.abs(q_sen.q_3p_ns_per_diff) < 0.00000001:
+            self.set_extrap_reference(4)
+        elif np.abs(q_sen.q_3p_ns_opt_per_diff) < 0.00000001:
+            self.set_extrap_reference(5)
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+    def set_extrap_reference(self, reference_row):
+        """Sets the discharge sensitivity table to show the selected method
+        as the reference.
+
+        Parameters
+        ----------
+        reference_row: int
+            Integer of the row in sensitivity table for the
+            selected fit parameters
+        """
+
+        # Get table reference
+        tbl = self.table_extrap_qsen
+
+        # Set all data to normal font
+        for row in range(tbl.rowCount()):
+            for col in range(tbl.columnCount()):
+                tbl.item(row, col).setFont(self.font_normal)
+
+        # Set selected file to bold font
+        for col in range(tbl.columnCount()):
+            tbl.item(reference_row, col).setFont(self.font_bold)
+
+    def fit_list_table(self):
+        """Populates the fit list table to show all the checked transects
+        and the composite measurement.
+        """
+
+        # Get table reference
+        tbl = self.table_extrap_fit
+
+        # Add transects and Measurement to table
+        for n in range(len(self.checked_transects_idx)):
+            item = self.meas.transects[self.checked_transects_idx[n]].file_name[:-4]
+            tbl.setItem(n, 0, QtWidgets.QTableWidgetItem(item))
+            tbl.item(n, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(n, 0).setFont(self.font_normal)
+        tbl.setItem(
+            len(self.checked_transects_idx),
+            0,
+            QtWidgets.QTableWidgetItem("Measurement"),
+        )
+        tbl.item(len(self.checked_transects_idx), 0).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        # Show the Measurement as the initial selection
+        tbl.item(len(self.checked_transects_idx), 0).setFont(self.font_bold)
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+    @QtCore.pyqtSlot(int)
+    def fit_list_table_clicked(self, selected_row):
+        """Selects data to display and fit from list of transects and
+        composite measurements.
+
+        Parameters
+        ----------
+        selected_row: int
+            Index to selected transect/measurement from list.
+        """
+
+        with self.wait_cursor():
+            # Set all filenames to normal font
+            nrows = len(self.checked_transects_idx) + 1
+
+            for row in range(nrows):
+                self.table_extrap_fit.item(row, 0).setFont(self.font_normal)
+
+            # Set selected file to bold font
+            self.table_extrap_fit.item(selected_row, 0).setFont(self.font_bold)
+
+            self.extrap_index(selected_row)
+            self.n_points_table()
+            self.set_fit_options()
+            self.extrap_plot()
+
+    def extrap_plot(self):
+        """Creates extrapolation plot."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.extrap_canvas is None:
+            # Create the canvas
+            self.extrap_canvas = MplCanvas(
+                parent=self.graph_extrap, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_extrap)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.extrap_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.extrap_toolbar = NavigationToolbar(self.extrap_canvas, self)
+            self.extrap_toolbar.hide()
+
+        # Initialize the figure and assign to the canvas
+        self.extrap_fig = ExtrapPlot(canvas=self.extrap_canvas)
+        # Create the figure with the specified data
+        self.extrap_fig.create(
+            meas=self.meas,
+            checked=self.checked_transects_idx,
+            idx=self.idx,
+            data_type=self.combo_extrap_type.currentText(),
+            cb_data=self.cb_extrap_data.isChecked(),
+            cb_surface=self.cb_extrap_surface.isChecked(),
+            cb_trans_medians=self.cb_extrap_trans_medians.isChecked(),
+            cb_trans_fit=self.cb_extrap_trans_fit.isChecked(),
+            cb_meas_medians=self.cb_extrap_meas_medians.isChecked(),
+            cb_meas_fit=self.cb_extrap_meas_fit.isChecked(),
+        )
+
+        # Update list of figs
+        self.figs = [self.extrap_fig]
+        self.fig_calls = [self.extrap_plot]
+
+        # Reset data cursor to work with new figure
+        if self.actionData_Cursor.isChecked():
+            self.data_cursor()
+
+        self.extrap_canvas.draw()
+
+    def extrap_set_data(self):
+        """Sets UI for data panel"""
+
+        if self.meas.extrap_fit.sel_fit[-1].data_type.lower() != "q":
+            self.extrap_set_data_manual()
+        elif self.meas.extrap_fit.threshold != 20:
+            self.extrap_set_data_manual()
+        elif (
+            self.meas.extrap_fit.subsection[0] != 0
+            or self.meas.extrap_fit.subsection[1] != 100
+        ):
+            self.extrap_set_data_manual()
+        else:
+            self.extrap_set_data_auto()
+
+    def extrap_set_data_manual(self):
+        """Updates the UI when the user changes the data setting to manual."""
+
+        if self.combo_extrap_data.currentIndex() == 0:
+            self.combo_extrap_data.setCurrentIndex(1)
+        self.ed_extrap_threshold.setEnabled(True)
+        self.ed_extrap_subsection.setEnabled(True)
+        self.combo_extrap_type.setEnabled(True)
+        self.ed_extrap_threshold.setText(
+            "{:3.0f}".format(self.meas.extrap_fit.threshold)
+        )
+        self.ed_extrap_subsection.setText(
+            "{:.0f}:{:.0f}".format(
+                self.meas.extrap_fit.subsection[0], self.meas.extrap_fit.subsection[1]
+            )
+        )
+
+        if self.meas.extrap_fit.sel_fit[-1].data_type.lower() == "q":
+            self.combo_extrap_type.setCurrentIndex(0)
+        else:
+            self.combo_extrap_type.setCurrentIndex(1)
+
+    def extrap_set_data_auto(self):
+        """Updates the UI when the user changes the data setting to automatic."""
+
+        if self.combo_extrap_data.currentIndex() == 1:
+            self.combo_extrap_data.setCurrentIndex(0)
+        self.ed_extrap_threshold.setEnabled(False)
+        self.ed_extrap_subsection.setEnabled(False)
+        self.combo_extrap_type.setEnabled(False)
+        self.ed_extrap_threshold.setText("20")
+        self.ed_extrap_subsection.setText("0:100")
+        self.combo_extrap_type.setCurrentIndex(0)
+
+    @QtCore.pyqtSlot(str)
+    def change_data(self, text):
+        """Coordinates user initiated change to the data from automatic to
+        manual.
+
+        Parameters
+        ----------
+        text: str
+         User selection from combo box
+        """
+
+        with self.wait_cursor():
+            if text == "Manual":
+                self.ed_extrap_threshold.setEnabled(True)
+                self.ed_extrap_subsection.setEnabled(True)
+                self.combo_extrap_type.setEnabled(True)
+            else:
+                self.ed_extrap_threshold.setEnabled(False)
+                self.ed_extrap_subsection.setEnabled(False)
+                self.combo_extrap_type.setEnabled(False)
+                self.ed_extrap_threshold.setText("20")
+                self.ed_extrap_subsection.setText("0:100")
+                self.combo_extrap_type.setCurrentIndex(0)
+                self.meas.extrap_fit.change_data_auto(self.meas.transects)
+                self.extrap_update()
+
+    @QtCore.pyqtSlot()
+    def change_threshold(self):
+        """Allows the user to change the threshold and then updates the data
+        and display.
+        """
+
+        self.ed_extrap_threshold.blockSignals(True)
+
+        # If data entered.
+        with self.wait_cursor():
+            threshold = self.check_numeric_input(self.ed_extrap_threshold)
+            if threshold is not None:
+                # Because editingFinished is used if return is pressed and
+                # later focus is changed the method could get
+                # twice. This line checks to see if there was and actual
+                # change.
+                if np.abs(threshold - self.meas.extrap_fit.threshold) > 0.0001:
+                    if 0 <= threshold <= 100:
+                        self.meas.extrap_fit.change_threshold(
+                            transects=self.meas.transects,
+                            data_type=self.meas.extrap_fit.sel_fit[0].data_type,
+                            threshold=threshold,
+                        )
+                        self.extrap_update()
+                    else:
+                        self.ed_extrap_threshold.setText(
+                            "{:3.0f}".format(self.meas.extrap_fit.threshold)
+                        )
+            else:
+                self.ed_extrap_threshold.setText(
+                    "{:3.0f}".format(self.meas.extrap_fit.threshold)
+                )
+
+        self.ed_extrap_threshold.blockSignals(False)
+
+    @QtCore.pyqtSlot()
+    def change_subsection(self):
+        """Allows the user to change the subsectioning and then updates the
+        data and display.
+        """
+
+        self.ed_extrap_subsection.editingFinished.disconnect(self.change_subsection)
+
+        # If data entered.
+        with self.wait_cursor():
+            try:
+
+                use_q = True
+                sub_from_left = True
+                self.txt_extrap_subsection.setText("Subsection (% L to R, x:x):")
+
+                sub_list = self.ed_extrap_subsection.text().split(":")
+                subsection = [float(sub_list[0]), float(sub_list[1])]
+                # Because editingFinished is used if return is pressed and
+                # later focus is changed the method could get twice. This line
+                # checks to see if there was and actual change.
+                if (
+                    np.abs(subsection[0] - self.meas.extrap_fit.subsection[0]) > 0.0001
+                    or np.abs(subsection[1] - self.meas.extrap_fit.subsection[1])
+                    > 0.0001
+                    or self.meas.extrap_fit.sub_from_left != sub_from_left
+                ):
+                    if (
+                        0 <= subsection[0] <= 100
+                        and subsection[0] < subsection[1] <= 100
+                    ):
+                        self.meas.extrap_fit.change_extents(
+                            transects=self.meas.transects,
+                            data_type=self.meas.extrap_fit.sel_fit[-1].data_type,
+                            extents=subsection,
+                            use_q=use_q,
+                            sub_from_left=sub_from_left,
+                        )
+                        self.extrap_update()
+                    else:
+                        self.ed_extrap_subsection.setText(
+                            "{:3.0f}:{:3.0f}".format(
+                                self.meas.extrap_fit.subsection[0],
+                                self.meas.extrap_fit.subsection[1],
+                            )
+                        )
+            except (IndexError, TypeError):
+                # If the user input is not valid, display message
+                self.popup_message(
+                    self.tr(
+                        "Subsectioning requires data entry as two numbers "
+                        "separated by a colon (example: 10:90) where the "
+                        "first number is larger than the second"
+                    )
+                )
+
+        self.ed_extrap_subsection.editingFinished.connect(self.change_subsection)
+
+    @QtCore.pyqtSlot(str)
+    def change_data_type(self, text):
+        """Coordinates user initiated change to the data type.
+
+        Parameters
+        ----------
+        text: str
+         User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Change setting based on combo box selection
+            data_type = "q"
+            if text == "Velocity":
+                data_type = "v"
+
+            self.meas.extrap_fit.change_data_type(
+                transects=self.meas.transects, data_type=data_type
+            )
+
+            self.extrap_update()
+
+    @QtCore.pyqtSlot(str)
+    def change_fit_method(self, text):
+        """Coordinates user initiated changing the fit type.
+
+        Parameters
+        ----------
+        text: str
+         User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Change setting based on combo box selection
+            self.meas.extrap_fit.change_fit_method(
+                transects=self.meas.transects, new_fit_method=text, idx=self.idx
+            )
+
+            self.extrap_update()
+
+    @QtCore.pyqtSlot(str)
+    def change_top_method(self, text):
+        """Coordinates user initiated changing the top method.
+
+        Parameters
+        ----------
+        text: str
+         User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Change setting based on combo box selection
+            self.meas.extrap_fit.change_fit_method(
+                transects=self.meas.transects,
+                new_fit_method="Manual",
+                idx=self.idx,
+                top=text,
+            )
+
+            self.extrap_update()
+
+    @QtCore.pyqtSlot(str)
+    def change_bottom_method(self, text):
+        """Coordinates user initiated changing the bottom method.
+
+        Parameters
+        ----------
+        text: str
+         User selection from combo box
+        """
+
+        with self.wait_cursor():
+            # Change setting based on combo box selection
+            self.meas.extrap_fit.change_fit_method(
+                transects=self.meas.transects,
+                new_fit_method="Manual",
+                idx=self.idx,
+                bot=text,
+            )
+
+            self.extrap_update()
+
+    @QtCore.pyqtSlot()
+    def change_exponent(self):
+        """Coordinates user initiated changing the bottom method."""
+
+        self.ed_extrap_exponent.blockSignals(True)
+
+        with self.wait_cursor():
+            exponent = self.check_numeric_input(self.ed_extrap_exponent)
+            if exponent is not None and 0 < exponent < 1.01:
+                # Because editingFinished is used if return is pressed and
+                # later focus is changed the method could get twice. This line
+                # checks to see if there was and actual change.
+                if (
+                    np.abs(exponent - self.meas.extrap_fit.sel_fit[self.idx].exponent)
+                    > 0.00001
+                ):
+                    # Change based on user input
+                    self.meas.extrap_fit.change_fit_method(
+                        transects=self.meas.transects,
+                        new_fit_method="Manual",
+                        idx=self.idx,
+                        exponent=exponent,
+                    )
+
+                    self.extrap_update()
+            else:
+                self.ed_extrap_exponent.setText(
+                    "{:6.4f}".format(self.meas.extrap_fit.sel_fit[self.idx].exponent)
+                )
+
+        self.ed_extrap_exponent.blockSignals(False)
+
+    @QtCore.pyqtSlot(int)
+    def sensitivity_change_fit(self, row):
+        """Changes the fit based on the row in the discharge sensitivity
+        table selected by the user.
+
+        Parameters
+        ----------
+        row: int
+            Index to selected fit combination from
+            sensitivity table.
+        """
+
+        with self.wait_cursor():
+            # Get fit settings from table
+            top = self.table_extrap_qsen.item(row, 0).text()
+            bot = self.table_extrap_qsen.item(row, 1).text()
+            exponent = float(self.table_extrap_qsen.item(row, 2).text())
+
+            # Change based on user selection
+            self.meas.extrap_fit.change_fit_method(
+                transects=self.meas.transects,
+                new_fit_method="Manual",
+                idx=self.idx,
+                top=top,
+                bot=bot,
+                exponent=exponent,
+            )
+
+            self.extrap_update()
+
+    def compare_medians(self):
+        """This method computes and displays the median values for the
+        measurement using an alternative method to allow comparison. If weighted
+        is used the unweighted are computed and display. If the unweighted are used
+        the method computes and displays the weighted. This method does not affect
+        the computed discharge only the extrapolation display."""
+
+        if self.meas.extrap_fit.norm_data[-1].data_type.lower() == "q":
+            # Create a copy of the normalized values of the entire measurement
+            compare_norm = copy.deepcopy(self.meas.extrap_fit.norm_data[-1])
+            if self.meas.extrap_fit.use_weighted:
+                # Compute unweighted medians
+                compare_norm.use_weighted = False
+                compare_norm.compute_stats(self.meas.extrap_fit.threshold)
+            else:
+                # Compute weighted medians
+                compare_norm.use_weighted = True
+                compare_norm.compute_stats(self.meas.extrap_fit.threshold)
+
+            # Display data on extrapolation figure
+            self.extrap_fig.extrap_plot_med_compare(compare_norm)
+            self.extrap_canvas.draw()
+
+    def cancel_extrap(self):
+        """Rest extrapolation to settings that were inplace when the tab was
+        opened.
+        """
+
+        self.meas = copy.deepcopy(self.extrap_meas)
+        self.extrap_tab()
+        self.change = False
+
+    def extrap_comments_messages(self):
+        """Displays comments and messages associated with bottom track
+        filters in Messages tab.
+        """
+
+        # Clear comments and messages
+        self.display_extrap_comments.clear()
+        self.display_extrap_messages.clear()
+
+        if self.meas is not None:
+            # Display each comment on a new line
+            self.display_extrap_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                self.display_extrap_comments.textCursor().insertText(comment)
+                self.display_extrap_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_extrap_comments.textCursor().insertBlock()
+
+            # Display each message on a new line
+            self.display_extrap_messages.moveCursor(QtGui.QTextCursor.Start)
+            for message in self.meas.qa.extrapolation["messages"]:
+                if type(message) is str:
+                    self.display_extrap_messages.textCursor().insertText(message)
+                else:
+                    self.display_extrap_messages.textCursor().insertText(message[0])
+                self.display_extrap_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_extrap_messages.textCursor().insertBlock()
+
+            self.update_tab_icons()
+
+    # Edges tab
+    # =========
+    def edges_tab(self):
+        """Initializes all of the features of the edges tab."""
+
+        # Setup data table
+        tbl = self.table_edges
+        table_header = [
+            self.tr("Filename"),
+            self.tr("Start \n Edge"),
+            self.tr("Left \n Type"),
+            self.tr("Left \n Coef."),
+            self.tr("Left \n Dist. \n" + self.units["label_L"]),
+            self.tr("Left \n # Ens."),
+            self.tr("Left \n # Valid"),
+            self.tr("Left \n Discharge \n" + self.units["label_Q"]),
+            self.tr("Left \n % Q"),
+            self.tr("Right \n Type"),
+            self.tr("Right \n Coef."),
+            self.tr("Right \n Dist. \n" + self.units["label_L"]),
+            self.tr("Right \n # Ens."),
+            self.tr("Right \n # Valid"),
+            self.tr("Right \n Discharge \n" + self.units["label_Q"]),
+            self.tr("Right \n % Q"),
+        ]
+
+        ncols = len(table_header)
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(table_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+        tbl.setStyleSheet("QToolTip{font: 12pt}")
+
+        # Automatically resize rows and columns
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+        if not self.edges_initialized:
+            tbl.cellClicked.connect(self.edges_table_clicked)
+            self.edges_initialized = True
+
+        self.update_edges_table()
+
+        self.edges_graphics()
+
+        # Setup list for use by graphics controls
+        self.canvases = [
+            self.left_edge_contour_canvas,
+            self.right_edge_contour_canvas,
+            self.left_edge_st_canvas,
+            self.right_edge_st_canvas,
+        ]
+        self.figs = [
+            self.left_edge_contour_fig,
+            self.right_edge_contour_fig,
+            self.left_edge_st_fig,
+            self.right_edge_st_fig,
+        ]
+        self.fig_calls = [
+            self.edges_contour_plots,
+            self.edges_contour_plots,
+            self.edges_shiptrack_plots,
+            self.edges_shiptrack_plots,
+        ]
+        self.toolbars = [
+            self.left_edge_contour_toolbar,
+            self.right_edge_contour_toolbar,
+            self.left_edge_st_toolbar,
+            self.right_edge_st_toolbar,
+        ]
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+    def update_edges_table(self):
+        """Populates the edges table with the latest data and also updates
+        the messages tab.
+        """
+
+        with self.wait_cursor():
+            # Set tbl variable
+            tbl = self.table_edges
+
+            # Populate each row
+            for row in range(tbl.rowCount()):
+                # Identify transect associated with the row
+                transect_id = self.checked_transects_idx[row]
+                transect = self.meas.transects[transect_id]
+
+                # File/transect name
+                col = 0
+                item = QtWidgets.QTableWidgetItem(transect.file_name[:-4])
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                tbl.item(row, 0).setFont(self.font_normal)
+
+                # Start Edge
+                col += 1
+                item = transect.start_edge
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Left edge type
+                col += 1
+                item = transect.edges.left.type
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                # Format cell
+                if self.meas.qa.edges["left_type"] == 2:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+                    tbl.item(row, col).setToolTip(self.tr("Type is not consistent."))
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Left edge coefficient
+                col += 1
+                if transect.edges.left.type == "Triangular":
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("0.3535"))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                elif transect.edges.left.type == "Rectangular":
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("0.91"))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                elif transect.edges.left.type == "Custom":
+                    item = "{:1.4f}".format(transect.edges.left.cust_coef)
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                else:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem(""))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Left edge dist
+                col += 1
+                item = "{:4.2f}".format(
+                    transect.edges.left.distance_m * self.units["L"]
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                # Format cell
+                if transect_id in self.meas.qa.edges["left_dist_moved_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(self.tr("Excessive boat movement."))
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Left edge # ens
+                col += 1
+                # This allows the number of edge ensembles to be increased
+                # to obtain total number of ensembles including invalid ensembles
+                # for TRDI and report the specified number of ensembles
+                # (even if all invalid) for SonTek
+                left_idx = self.meas.discharge[transect_id].left_idx
+                if len(left_idx) > 0:
+                    if self.meas.transects[transect_id].start_edge == "Left":
+                        n_ensembles = left_idx[-1] + 1
+                    else:
+                        n_ensembles = (
+                            len(self.meas.transects[transect_id].in_transect_idx)
+                            - left_idx[0]
+                        )
+                else:
+                    n_ensembles = transect.edges.left.number_ensembles
+                item = "{:4.0f}".format(n_ensembles)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Left edge # valid ens
+                col += 1
+                valid_ens = (
+                    np.nansum(
+                        self.meas.transects[transect_id].w_vel.valid_data[
+                            0, :, self.meas.discharge[transect_id].left_idx
+                        ],
+                        1,
+                    )
+                    > 0
+                )
+
+                item = "{:4.0f}".format(np.nansum(valid_ens))
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                if transect_id in self.meas.qa.edges["invalid_transect_left_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("The percent of invalid ensembles exceeds 25%.")
+                    )
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Left edge discharge
+                col += 1
+                item = "{:6}".format(
+                    self.q_digits(
+                        self.meas.discharge[transect_id].left * self.units["Q"]
+                    )
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                # Format cell
+                if transect_id in self.meas.qa.edges["left_zero_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+                    tbl.item(row, col).setToolTip(self.tr("Edge has zero Q."))
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Left edge discharge %
+                col += 1
+                if np.abs(self.meas.discharge[transect_id].total) > 0:
+                    item = "{:2.2f}".format(
+                        (
+                            self.meas.discharge[transect_id].left
+                            / self.meas.discharge[transect_id].total
+                        )
+                        * 100
+                    )
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if transect_id in self.meas.qa.edges["left_q_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("Edge Q is greater than 5% of the mean discharge.")
+                    )
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Right edge type
+                col += 1
+                item = transect.edges.right.type
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                # Format cell
+                if self.meas.qa.edges["right_type"] == 2:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+                    tbl.item(row, col).setToolTip(self.tr("Type is not consistent."))
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Right edge coefficient
+                col += 1
+                if transect.edges.right.type == "Triangular":
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("0.3535"))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                elif transect.edges.right.type == "Rectangular":
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem("0.91"))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                elif transect.edges.right.type == "Custom":
+                    item = "{:1.4f}".format(transect.edges.right.cust_coef)
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                else:
+                    tbl.setItem(row, col, QtWidgets.QTableWidgetItem(""))
+                    tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Right edge dist
+                col += 1
+                item = "{:4.2f}".format(
+                    transect.edges.right.distance_m * self.units["L"]
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                # Format cell
+                if transect_id in self.meas.qa.edges["right_dist_moved_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(self.tr("Excessive boat movement."))
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Right edge # ens
+                col += 1
+                # This allows the number of edge ensembles to be increased
+                # to obtain total number of ensembles including invalid ensembles
+                # for TRDI and report the specified number of ensembles
+                # (even if all invalid) for SonTek
+                right_idx = self.meas.discharge[transect_id].right_idx
+                if len(right_idx) > 0:
+                    if self.meas.transects[transect_id].start_edge == "Right":
+                        n_ensembles = right_idx[-1] + 1
+                    else:
+                        n_ensembles = (
+                            len(self.meas.transects[transect_id].in_transect_idx)
+                            - right_idx[0]
+                        )
+                else:
+                    n_ensembles = transect.edges.right.number_ensembles
+                item = "{:4.0f}".format(n_ensembles)
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Right edge # valid ens
+                col += 1
+                valid_ens = (
+                    np.nansum(
+                        self.meas.transects[transect_id].w_vel.valid_data[
+                            0, :, self.meas.discharge[transect_id].right_idx
+                        ],
+                        1,
+                    )
+                    > 0
+                )
+
+                item = "{:4.0f}".format(np.nansum(valid_ens))
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                if transect_id in self.meas.qa.edges["invalid_transect_right_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("The percent of invalid ensembles exceeds 25%.")
+                    )
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Right edge discharge
+                col += 1
+                item = "{:6}".format(
+                    self.q_digits(
+                        self.meas.discharge[transect_id].right * self.units["Q"]
+                    )
+                )
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if transect_id in self.meas.qa.edges["right_zero_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 77, 77))
+                    tbl.item(row, col).setToolTip(self.tr("Edge has zero Q."))
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+                # Right edge discharge %
+                col += 1
+                if np.abs(self.meas.discharge[transect_id].total) > 0:
+                    item = "{:2.2f}".format(
+                        (
+                            self.meas.discharge[transect_id].right
+                            / self.meas.discharge[transect_id].total
+                        )
+                        * 100
+                    )
+                else:
+                    item = "N/A"
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                if transect_id in self.meas.qa.edges["right_q_idx"]:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 204, 0))
+                    tbl.item(row, col).setToolTip(
+                        self.tr("Edge Q is greater than 5% of the mean discharge.")
+                    )
+                else:
+                    tbl.item(row, col).setBackground(QtGui.QColor(255, 255, 255))
+
+            tbl.item(self.transect_row, 0).setFont(self.font_bold)
+            tbl.scrollToItem(tbl.item(self.transect_row, 0))
+
+            # Automatically resize rows and columns
+            tbl.resizeColumnsToContents()
+            tbl.resizeRowsToContents()
+        self.edges_comments_messages()
+
+    @QtCore.pyqtSlot(int, int)
+    def edges_table_clicked(self, row, col):
+        """Coordinates user changes to edge settings.
+
+        Parameters
+        ----------
+        row: int
+            Row in table clicked
+        col: int
+            Column in table clicked
+        """
+
+        tbl = self.table_edges
+        tbl.blockSignals(True)
+        self.change = True
+
+        # Show transect
+        if col == 0:
+            with self.wait_cursor():
+                self.transect_row = row
+                for r in range(tbl.rowCount()):
+                    tbl.item(r, 0).setFont(self.font_normal)
+                tbl.item(self.transect_row, 0).setFont(self.font_bold)
+
+                self.edges_graphics()
+                self.change = True
+
+        # Start edge
+        if col == 1:
+            # Initialize dialog
+            start_dialog = StartEdge()
+            if (
+                self.meas.transects[self.checked_transects_idx[row]].start_edge
+                == "Left"
+            ):
+                start_dialog.rb_left.setChecked(True)
+                start_dialog.rb_right.setChecked(False)
+            else:
+                start_dialog.rb_left.setChecked(False)
+                start_dialog.rb_right.setChecked(True)
+
+            rsp = start_dialog.exec_()
+            # Data entered.
+            with self.wait_cursor():
+                if rsp == QtWidgets.QDialog.Accepted:
+                    # Apply change
+                    if start_dialog.rb_left.isChecked():
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].start_edge = "Left"
+                    else:
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].start_edge = "Right"
+                    # Reprocess measurement
+                    s = self.meas.current_settings()
+                    self.meas.apply_settings(s)
+                    self.update_edges_table()
+                    self.edges_graphics()
+                    self.change = True
+                    QtWidgets.QMessageBox.about(
+                        self,
+                        self.tr("Start Edge Change"),
+                        self.tr(
+                            "You changed the start "
+                            "edge, verify that the "
+                            "left and right "
+                            "distances and edge types "
+                            "are correct."
+                        ),
+                    )
+
+        # Left edge type and coefficient
+        elif col == 2 or col == 3 or col == 7:
+            # Initialize dialog
+            type_dialog = EdgeType()
+            type_dialog.rb_transect.setChecked(True)
+            if (
+                self.meas.transects[self.checked_transects_idx[row]].edges.left.type
+                == "Triangular"
+            ):
+                type_dialog.rb_triangular.setChecked(True)
+            elif (
+                self.meas.transects[self.checked_transects_idx[row]].edges.left.type
+                == "Rectangular"
+            ):
+                type_dialog.rb_rectangular.setChecked(True)
+            elif (
+                self.meas.transects[self.checked_transects_idx[row]].edges.left.type
+                == "Custom"
+            ):
+                type_dialog.rb_custom.setChecked(True)
+                type_dialog.ed_custom.setText(
+                    "{:1.4f}".format(
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].edges.left.cust_coef
+                    )
+                )
+            elif (
+                self.meas.transects[self.checked_transects_idx[row]].edges.left.type
+                == "User Q"
+            ):
+                type_dialog.rb_user.setChecked(True)
+                type_dialog.ed_q_user.setText(
+                    "{:6.2f}".format(
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].edges.left.user_discharge_cms
+                        * self.units["Q"]
+                    )
+                )
+            rsp = type_dialog.exec_()
+
+            # Data entered.
+            with self.wait_cursor():
+                if rsp == QtWidgets.QDialog.Accepted:
+                    if type_dialog.rb_triangular.isChecked():
+                        edge_type = "Triangular"
+                        cust_coef = None
+                        user_discharge_cms = None
+                    elif type_dialog.rb_rectangular.isChecked():
+                        edge_type = "Rectangular"
+                        cust_coef = None
+                        user_discharge_cms = None
+                    elif type_dialog.rb_custom.isChecked():
+                        edge_type = "Custom"
+                        cust_coef = self.check_numeric_input(type_dialog.ed_custom)
+                        if cust_coef is None:
+                            cust_coef = 0
+                        user_discharge_cms = None
+                    elif type_dialog.rb_user.isChecked():
+                        edge_type = "User Q"
+                        cust_coef = None
+                        user_discharge_cms = self.check_numeric_input(
+                            type_dialog.ed_q_user
+                        )
+                        if user_discharge_cms is not None:
+                            user_discharge_cms = user_discharge_cms / self.units["Q"]
+                        else:
+                            user_discharge_cms = 0
+                    # Determine where to apply change and apply change
+                    if type_dialog.rb_all.isChecked():
+                        for idx in self.checked_transects_idx:
+                            transect = self.meas.transects[idx]
+                            transect.edges.left.type = edge_type
+                            transect.edges.left.cust_coef = cust_coef
+                            transect.edges.left.user_discharge_cms = user_discharge_cms
+                    else:
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].edges.left.type = edge_type
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].edges.left.cust_coef = cust_coef
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].edges.left.user_discharge_cms = user_discharge_cms
+
+                    # Reprocess measurement
+                    s = self.meas.current_settings()
+                    self.meas.apply_settings(s)
+                    self.update_edges_table()
+                    self.edges_graphics()
+
+        # Left edge distance
+        elif col == 4:
+            # Initialize dialog
+            dist_dialog = EdgeDist()
+            dist_dialog.rb_transect.setChecked(True)
+            dist_dialog.ed_edge_dist.setText(
+                "{:5.2f}".format(
+                    self.meas.transects[
+                        self.checked_transects_idx[row]
+                    ].edges.left.distance_m
+                    * self.units["L"]
+                )
+            )
+            rsp = dist_dialog.exec_()
+
+            # Data entered.
+            with self.wait_cursor():
+                if rsp == QtWidgets.QDialog.Accepted:
+                    dist = self.check_numeric_input(dist_dialog.ed_edge_dist)
+                    if dist is not None:
+                        dist = dist / self.units["L"]
+                        # Determine where to apply change and apply change
+                        if dist_dialog.rb_all.isChecked():
+                            for idx in self.checked_transects_idx:
+                                self.meas.transects[idx].edges.left.distance_m = dist
+                        else:
+                            self.meas.transects[
+                                self.checked_transects_idx[row]
+                            ].edges.left.distance_m = dist
+
+                        # Reprocess measurement
+                        s = self.meas.current_settings()
+                        self.meas.apply_settings(s)
+                        self.update_edges_table()
+                        self.edges_graphics()
+
+        # Left number of ensembles
+        elif col == 6:
+            # Initialize dialog
+            ens_dialog = EdgeEns()
+            ens_dialog.rb_transect.setChecked(True)
+            ens_dialog.ed_edge_ens.setText(
+                "{:4.0f}".format(
+                    self.meas.transects[
+                        self.checked_transects_idx[row]
+                    ].edges.left.number_ensembles
+                )
+            )
+            rsp = ens_dialog.exec_()
+
+            # Data entered.
+            with self.wait_cursor():
+                if rsp == QtWidgets.QDialog.Accepted:
+                    num_ens = self.check_numeric_input(ens_dialog.ed_edge_ens)
+                    if num_ens is not None:
+                        # Determine where to apply change and apply change
+                        if ens_dialog.rb_all.isChecked():
+                            for idx in self.checked_transects_idx:
+                                self.meas.transects[
+                                    idx
+                                ].edges.left.number_ensembles = num_ens
+                        else:
+                            self.meas.transects[
+                                self.checked_transects_idx[row]
+                            ].edges.left.number_ensembles = num_ens
+
+                        # Reprocess measurement
+                        s = self.meas.current_settings()
+                        self.meas.apply_settings(s)
+                        self.update_edges_table()
+                        self.edges_graphics()
+
+        # Right edge type and coefficient
+        elif col == 9 or col == 10 or col == 14:
+            # Initialize dialog
+            type_dialog = EdgeType()
+            type_dialog.rb_transect.setChecked(True)
+            if (
+                self.meas.transects[self.checked_transects_idx[row]].edges.right.type
+                == "Triangular"
+            ):
+                type_dialog.rb_triangular.setChecked(True)
+            elif (
+                self.meas.transects[self.checked_transects_idx[row]].edges.right.type
+                == "Rectangular"
+            ):
+                type_dialog.rb_rectangular.setChecked(True)
+            elif (
+                self.meas.transects[self.checked_transects_idx[row]].edges.right.type
+                == "Custom"
+            ):
+                type_dialog.rb_custom.setChecked(True)
+                type_dialog.ed_custom.setText(
+                    "{:1.4f}".format(
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].edges.right.cust_coef
+                    )
+                )
+            elif (
+                self.meas.transects[self.checked_transects_idx[row]].edges.right.type
+                == "User Q"
+            ):
+                type_dialog.rb_user.setChecked(True)
+                type_dialog.ed_q_user.setText(
+                    "{:6.2f}".format(
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].edges.right.user_discharge_cms
+                        * self.units["Q"]
+                    )
+                )
+            rsp = type_dialog.exec_()
+
+            # Data entered.
+            with self.wait_cursor():
+                if rsp == QtWidgets.QDialog.Accepted:
+                    if type_dialog.rb_triangular.isChecked():
+                        edge_type = "Triangular"
+                        cust_coef = None
+                        user_discharge_cms = None
+                    elif type_dialog.rb_rectangular.isChecked():
+                        edge_type = "Rectangular"
+                        cust_coef = None
+                        user_discharge_cms = None
+                    elif type_dialog.rb_custom.isChecked():
+                        edge_type = "Custom"
+                        cust_coef = self.check_numeric_input(type_dialog.ed_custom)
+                        if cust_coef is None:
+                            cust_coef = 0
+                        user_discharge_cms = None
+                    elif type_dialog.rb_user.isChecked():
+                        edge_type = "User Q"
+                        cust_coef = None
+                        user_discharge_cms = self.check_numeric_input(
+                            type_dialog.ed_q_user
+                        )
+                        if user_discharge_cms is not None:
+                            user_discharge_cms = user_discharge_cms / self.units["Q"]
+                        else:
+                            user_discharge_cms = 0
+                    # Determine where to apply change and apply
+                    if type_dialog.rb_all.isChecked():
+                        for idx in self.checked_transects_idx:
+                            transect = self.meas.transects[idx]
+                            transect.edges.right.type = edge_type
+                            transect.edges.right.cust_coef = cust_coef
+                            transect.edges.right.user_discharge_cms = user_discharge_cms
+                    else:
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].edges.right.type = edge_type
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].edges.right.cust_coef = cust_coef
+                        self.meas.transects[
+                            self.checked_transects_idx[row]
+                        ].edges.right.user_discharge_cms = user_discharge_cms
+
+                    # Reprocess measurement
+                    s = self.meas.current_settings()
+                    self.meas.apply_settings(s)
+                    self.update_edges_table()
+                    self.edges_graphics()
+
+        # Right edge distance
+        elif col == 11:
+            # Initialize dialog
+            dist_dialog = EdgeDist()
+            dist_dialog.rb_transect.setChecked(True)
+            dist_dialog.ed_edge_dist.setText(
+                "{:5.2f}".format(
+                    self.meas.transects[
+                        self.checked_transects_idx[row]
+                    ].edges.right.distance_m
+                    * self.units["L"]
+                )
+            )
+            rsp = dist_dialog.exec_()
+            # Data entered.
+            with self.wait_cursor():
+                if rsp == QtWidgets.QDialog.Accepted:
+                    dist = self.check_numeric_input(dist_dialog.ed_edge_dist)
+                    if dist is not None:
+                        dist = dist / self.units["L"]
+                        # Determine where to apply change and apply change
+                        if dist_dialog.rb_all.isChecked():
+                            for idx in self.checked_transects_idx:
+                                self.meas.transects[idx].edges.right.distance_m = dist
+                        else:
+                            self.meas.transects[
+                                self.checked_transects_idx[row]
+                            ].edges.right.distance_m = dist
+
+                        # Reprocess measurement
+                        s = self.meas.current_settings()
+                        self.meas.apply_settings(s)
+                        self.update_edges_table()
+                        self.edges_graphics()
+
+        # Right number of ensembles
+        elif col == 13:
+            # Initialize dialog
+            ens_dialog = EdgeEns()
+            ens_dialog.rb_transect.setChecked(True)
+            ens_dialog.ed_edge_ens.setText(
+                "{:4.0f}".format(
+                    self.meas.transects[
+                        self.checked_transects_idx[row]
+                    ].edges.right.number_ensembles
+                )
+            )
+            rsp = ens_dialog.exec_()
+
+            # Data entered.
+            with self.wait_cursor():
+                if rsp == QtWidgets.QDialog.Accepted:
+                    num_ens = self.check_numeric_input(ens_dialog.ed_edge_ens)
+                    if num_ens is not None:
+                        # Determine where to apply change and apply change
+                        if ens_dialog.rb_all.isChecked():
+                            for idx in self.checked_transects_idx:
+                                self.meas.transects[
+                                    idx
+                                ].edges.right.number_ensembles = num_ens
+                        else:
+                            self.meas.transects[
+                                self.checked_transects_idx[row]
+                            ].edges.right.number_ensembles = num_ens
+
+                        # Reprocess measurement
+                        s = self.meas.current_settings()
+                        self.meas.apply_settings(s)
+                        self.update_edges_table()
+                        self.edges_graphics()
+
+        self.tab_edges_2_data.setFocus()
+        tbl.blockSignals(False)
+
+    def edges_graphics(self):
+        """Generate graphs for edges tab."""
+
+        self.edges_shiptrack_plots()
+        self.edges_contour_plots()
+
+        self.figs = [
+            self.left_edge_contour_fig,
+            self.right_edge_contour_fig,
+            self.left_edge_st_fig,
+            self.right_edge_st_fig,
+        ]
+        self.fig_calls = [
+            self.edges_contour_plots,
+            self.edges_contour_plots,
+            self.edges_shiptrack_plots,
+            self.edges_shiptrack_plots,
+        ]
+
+    def edges_contour_plots(self):
+        """Create or update color contour plot for edges."""
+
+        transect = self.meas.transects[self.checked_transects_idx[self.transect_row]]
+        tbl = self.table_edges
+        # Left edge
+        n_ensembles = int(tbl.item(self.transect_row, 5).text())
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.left_edge_contour_canvas is None:
+            # Create the canvas
+            self.left_edge_contour_canvas = MplCanvas(
+                parent=self.graph_left_contour, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_left_contour)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.left_edge_contour_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.left_edge_contour_toolbar = NavigationToolbar(
+                self.left_edge_contour_canvas, self
+            )
+            self.left_edge_contour_toolbar.hide()
+
+        # Initialize the contour figure and assign to the canvas
+        self.left_edge_contour_fig = AdvGraphs(canvas=self.left_edge_contour_canvas)
+        # Create the figure with the specified data
+        self.left_edge_contour_fig.create_edge_contour(
+            transect=transect,
+            units=self.units,
+            x_axis_type=self.edges_axis_type,
+            color_map=self.color_map,
+            n_ensembles=n_ensembles,
+            edge="Left",
+        )
+
+        # Set margins and padding for figure
+        self.left_edge_contour_canvas.fig.subplots_adjust(
+            left=0.15, bottom=0.1, right=0.90, top=0.98, wspace=0.1, hspace=0
+        )
+
+        # Draw canvas
+        self.left_edge_contour_canvas.draw()
+
+        # Right edge
+        n_ensembles = int(tbl.item(self.transect_row, 12).text())
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.right_edge_contour_canvas is None:
+            # Create the canvas
+            self.right_edge_contour_canvas = MplCanvas(
+                parent=self.graph_right_contour, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_right_contour)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.right_edge_contour_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.right_edge_contour_toolbar = NavigationToolbar(
+                self.right_edge_contour_canvas, self
+            )
+            self.right_edge_contour_toolbar.hide()
+
+        # Initialize the contour figure and assign to the canvas
+        self.right_edge_contour_fig = AdvGraphs(canvas=self.right_edge_contour_canvas)
+        # Create the figure with the specified data
+        self.right_edge_contour_fig.create_edge_contour(
+            transect=transect,
+            units=self.units,
+            x_axis_type=self.edges_axis_type,
+            color_map=self.color_map,
+            n_ensembles=n_ensembles,
+            edge="Right",
+        )
+
+        # Set margins and padding for figure
+        self.right_edge_contour_canvas.fig.subplots_adjust(
+            left=0.15, bottom=0.1, right=0.90, top=0.98, wspace=0.1, hspace=0
+        )
+
+        # Draw canvas
+        self.right_edge_contour_canvas.draw()
+
+    def edges_shiptrack_plots(self):
+        """Create or update the shiptrack graphs for the edges tab."""
+
+        transect = self.meas.transects[self.checked_transects_idx[self.transect_row]]
+
+        # Left edge
+        tbl = self.table_edges
+        n_ensembles = int(tbl.item(self.transect_row, 5).text())
+        if transect.start_edge == "Left":
+            edge_start = True
+        else:
+            edge_start = False
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.left_edge_st_canvas is None:
+            # Create the canvas
+            self.left_edge_st_canvas = MplCanvas(
+                parent=self.graph_left_st, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_left_st)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.left_edge_st_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.left_edge_st_toolbar = NavigationToolbar(
+                self.left_edge_st_canvas, self
+            )
+            self.left_edge_st_toolbar.hide()
+
+        # Initialize the shiptrack figure and assign to the canvas
+        self.left_edge_st_fig = Shiptrack(canvas=self.left_edge_st_canvas)
+        # Create the figure with the specified data
+        self.left_edge_st_fig.create(
+            transect=transect,
+            units=self.units,
+            cb=False,
+            cb_bt=self.cb_wt_bt,
+            cb_gga=self.cb_wt_gga,
+            cb_vtg=self.cb_wt_vtg,
+            cb_vectors=self.cb_wt_vectors,
+            n_ensembles=n_ensembles,
+            edge_start=edge_start,
+        )
+
+        if transect.w_vel.nav_ref == "BT":
+            for item in self.left_edge_st_fig.bt:
+                item.set_visible(True)
+        else:
+            for item in self.left_edge_st_fig.bt:
+                item.set_visible(False)
+        # GGA
+        if transect.w_vel.nav_ref == "GGA":
+            if self.left_edge_st_fig.gga is not None:
+                for item in self.left_edge_st_fig.gga:
+                    item.set_visible(True)
+        elif transect.boat_vel.gga_vel is not None:
+            if self.left_edge_st_fig.gga is not None:
+                for item in self.left_edge_st_fig.gga:
+                    item.set_visible(False)
+        # VTG
+        if transect.w_vel.nav_ref == "VTG":
+            if self.left_edge_st_fig.vtg is not None:
+                for item in self.left_edge_st_fig.vtg:
+                    item.set_visible(True)
+        elif transect.boat_vel.vtg_vel is not None:
+            if self.left_edge_st_fig.vtg is not None:
+                for item in self.left_edge_st_fig.vtg:
+                    item.set_visible(False)
+
+        self.left_edge_st_canvas.draw()
+
+        # Right edge
+        n_ensembles = int(tbl.item(self.transect_row, 12).text())
+        if transect.start_edge == "Left":
+            edge_start = False
+        else:
+            edge_start = True
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.right_edge_st_canvas is None:
+            # Create the canvas
+            self.right_edge_st_canvas = MplCanvas(
+                parent=self.graph_right_st, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_right_st)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.right_edge_st_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.right_edge_st_toolbar = NavigationToolbar(
+                self.right_edge_st_canvas, self
+            )
+            self.right_edge_st_toolbar.hide()
+
+        # Initialize the shiptrack figure and assign to the canvas
+        self.right_edge_st_fig = Shiptrack(canvas=self.right_edge_st_canvas)
+        # Create the figure with the specified data
+        self.right_edge_st_fig.create(
+            transect=transect,
+            units=self.units,
+            cb=False,
+            cb_bt=self.cb_wt_bt,
+            cb_gga=self.cb_wt_gga,
+            cb_vtg=self.cb_wt_vtg,
+            cb_vectors=self.cb_wt_vectors,
+            n_ensembles=n_ensembles,
+            edge_start=edge_start,
+        )
+
+        if transect.w_vel.nav_ref == "BT":
+            for item in self.right_edge_st_fig.bt:
+                item.set_visible(True)
+        else:
+            for item in self.right_edge_st_fig.bt:
+                item.set_visible(False)
+        # GGA
+        if transect.w_vel.nav_ref == "GGA":
+            if self.right_edge_st_fig.gga is not None:
+                for item in self.right_edge_st_fig.gga:
+                    item.set_visible(True)
+        elif transect.boat_vel.gga_vel is not None:
+            if self.right_edge_st_fig.gga is not None:
+                for item in self.right_edge_st_fig.gga:
+                    item.set_visible(False)
+        # VTG
+        if transect.w_vel.nav_ref == "VTG":
+            if self.right_edge_st_fig.vtg is not None:
+                for item in self.right_edge_st_fig.vtg:
+                    item.set_visible(True)
+        elif transect.boat_vel.vtg_vel is not None:
+            if self.right_edge_st_fig.vtg is not None:
+                for item in self.right_edge_st_fig.vtg:
+                    item.set_visible(False)
+
+        self.right_edge_st_canvas.draw()
+
+    def edges_comments_messages(self):
+        """Displays comments and messages associated with edge filters in
+        Messages tab.
+        """
+
+        # Clear comments and messages
+        self.display_edges_comments.clear()
+        self.display_edges_messages.clear()
+
+        if self.meas is not None:
+            # Display each comment on a new line
+            self.display_edges_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                self.display_edges_comments.textCursor().insertText(comment)
+                self.display_edges_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_edges_comments.textCursor().insertBlock()
+
+            # Display each message on a new line
+            self.display_edges_messages.moveCursor(QtGui.QTextCursor.Start)
+            for message in self.meas.qa.edges["messages"]:
+                if type(message) is str:
+                    self.display_edges_messages.textCursor().insertText(message)
+                else:
+                    self.display_edges_messages.textCursor().insertText(message[0])
+                self.display_edges_messages.moveCursor(QtGui.QTextCursor.End)
+                self.display_edges_messages.textCursor().insertBlock()
+
+            self.update_tab_icons()
+
+    # Uncertainty tab
+    # ===============
+    def uncertainty_tab(self):
+        """Initializes and configures Oursin uncertainty tab."""
+
+        self.uncertainty_results_table()
+        self.advanced_settings_table()
+        self.uncertainty_meas_q_plot()
+        self.uncertainty_measurement_plot()
+        self.uncertainty_comments_messages()
+
+        # Setup list for use by graphics controls
+        self.canvases = [
+            self.uncertainty_meas_q_canvas,
+            self.uncertainty_measurement_canvas,
+        ]
+        self.figs = [self.uncertainty_meas_q_fig, self.uncertainty_measurement_fig]
+        self.fig_calls = [
+            self.uncertainty_meas_q_plot,
+            self.uncertainty_measurement_plot,
+        ]
+        self.toolbars = [
+            self.uncertainty_meas_q_toolbar,
+            self.uncertainty_measurement_toolbar,
+        ]
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+    def uncertainty_results_table(self):
+        """Create and populate uncertainty results table."""
+
+        # Setup table
+        tbl = self.table_uncertainty_results
+        tbl.setRowCount(0)
+        n_transects = len(self.checked_transects_idx)
+
+        tbl.setRowCount(n_transects + 5)
+        tbl.setColumnCount(16)
+        tbl.horizontalHeader().hide()
+        tbl.verticalHeader().hide()
+        tbl.itemChanged.connect(self.user_uncertainty_change)
+        tbl.itemChanged.disconnect()
+
+        if len(self.checked_transects_idx) > 0:
+            # Build column labels using custom_header to create appropriate
+            # spans
+            self.custom_header(tbl, 0, 0, 3, 1, self.tr("Transect"))
+            self.custom_header(
+                tbl, 0, 1, 1, 12, self.tr("Uncertainty (Standard Deviation in Percent)")
+            )
+            tbl.item(0, 1).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 1, 1, 2, 1, self.tr("System"))
+            self.custom_header(tbl, 1, 2, 2, 1, self.tr("Compass"))
+            self.custom_header(tbl, 1, 3, 2, 1, self.tr("Moving-bed"))
+            self.custom_header(tbl, 1, 4, 2, 1, self.tr("# Ensembles"))
+            self.custom_header(tbl, 1, 5, 2, 1, self.tr("Meas. Q"))
+            self.custom_header(tbl, 1, 6, 2, 1, self.tr("Top Q"))
+            self.custom_header(tbl, 1, 7, 2, 1, self.tr("Bottom Q"))
+            self.custom_header(tbl, 1, 8, 2, 1, self.tr("Left Q"))
+            self.custom_header(tbl, 1, 9, 2, 1, self.tr("Right Q"))
+            self.custom_header(tbl, 1, 10, 1, 3, self.tr("Invalid Data"))
+            tbl.item(1, 10).setTextAlignment(QtCore.Qt.AlignCenter)
+            self.custom_header(tbl, 2, 10, 1, 1, self.tr("Boat"))
+            self.custom_header(tbl, 2, 11, 1, 1, self.tr("Depth"))
+            self.custom_header(tbl, 2, 12, 1, 1, self.tr("Water"))
+            self.custom_header(
+                tbl,
+                0,
+                13,
+                3,
+                1,
+                self.tr(" Bayesian \n Coefficient \n of Variation \n (percent)"),
+            )
+            self.custom_header(
+                tbl, 0, 14, 3, 1, self.tr(" Automatic \n Total 95% \n Uncertainty")
+            )
+            self.custom_header(
+                tbl, 0, 15, 3, 1, self.tr(" User \n Total 95% \n Uncertainty")
+            )
+
+            # Add data
+            for trans_row in range(n_transects):
+                row = trans_row + 5
+                col = 0
+                transect_id = self.checked_transects_idx[trans_row]
+
+                # File/transect name
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        self.meas.transects[transect_id].file_name[:-4]
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # System
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_syst"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Compass
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.u.iloc[trans_row]["u_compass"]
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Moving-bed
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_movbed"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Ensembles
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_ens"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Measured Q
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_meas"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Left Q
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_top"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Right Q
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_bot"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Top Q
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_left"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Bottom Q
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_right"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Boat
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_boat"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Depth
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_depth"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Water
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_water"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # COV
+                col += 1
+                # tbl.setItem(row, col, QtWidgets.QTableWidgetItem(''))
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["u_cov"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # Auto 95
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(self.meas.oursin.u.iloc[trans_row]["total_95"])
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+                # User 95
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.u_user.iloc[trans_row]["total_95"]
+                        )
+                    ),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            row = 4
+            row_user = 3
+            col = 0
+
+            # File/transect name
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem("Measurement"))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # System
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_syst"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_syst_mean_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_syst_mean_user"]
+                        )
+                    ),
+                )
+
+            # Compass
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.u_measurement.iloc[0]["u_compass"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_compass_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_compass_user"]
+                        )
+                    ),
+                )
+
+            # Moving-bed
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_movbed"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_movbed_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_movbed_user"]
+                        )
+                    ),
+                )
+
+            # Ensembles
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_ens"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_ens_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_ens_user"]
+                        )
+                    ),
+                )
+
+            # Measured Q
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_meas"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_meas_mean_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_meas_mean_user"]
+                        )
+                    ),
+                )
+
+            # Left Q
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_top"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_top_mean_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_top_mean_user"]
+                        )
+                    ),
+                )
+
+            # Right Q
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_bot"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_bot_mean_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_bot_mean_user"]
+                        )
+                    ),
+                )
+
+            # Top Q
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_left"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_left_mean_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_left_mean_user"]
+                        )
+                    ),
+                )
+
+            # Bottom Q
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_right"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_right_mean_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_right_mean_user"]
+                        )
+                    ),
+                )
+
+            # Boat
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_boat"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_invalid_boat_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_invalid_boat_user"]
+                        )
+                    ),
+                )
+
+            # Depth
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_depth"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_invalid_depth_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_invalid_depth_user"]
+                        )
+                    ),
+                )
+
+            # Water
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_water"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            if not np.isnan(self.meas.oursin.user_specified_u["u_invalid_water_user"]):
+                tbl.setItem(
+                    row_user,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:5.2f}".format(
+                            self.meas.oursin.user_specified_u["u_invalid_water_user"]
+                        )
+                    ),
+                )
+
+            # COV
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["u_cov"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Auto 95
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(self.meas.oursin.u_measurement.iloc[0]["total_95"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # User 95
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.u_measurement_user.iloc[0]["total_95"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Bold Measurement row
+            for col in range(tbl.columnCount()):
+                tbl.item(4, col).setFont(self.font_bold)
+
+            # User specified
+            col = 0
+            tbl.setItem(3, col, QtWidgets.QTableWidgetItem("User Specified"))
+            tbl.item(3, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.item(3, col).setFont(self.font_bold)
+            tbl.setItem(3, 13, QtWidgets.QTableWidgetItem(""))
+            tbl.item(3, 13).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(3, 14, QtWidgets.QTableWidgetItem(""))
+            tbl.item(3, 14).setFlags(QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(3, 15, QtWidgets.QTableWidgetItem(""))
+            tbl.item(3, 15).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            tbl.item(3, 13).setBackground(QtGui.QColor(150, 150, 150))
+            tbl.item(3, 14).setBackground(QtGui.QColor(150, 150, 150))
+            tbl.item(3, 15).setBackground(QtGui.QColor(150, 150, 150))
+
+            tbl.resizeColumnsToContents()
+
+            tbl.setRowHeight(0, 40)
+            tbl.setRowHeight(1, 40)
+            tbl.setRowHeight(2, 40)
+
+            for col in range(1, 15):
+                tbl.setColumnWidth(col, 76)
+
+        tbl.itemChanged.connect(self.user_uncertainty_change)
+
+    def advanced_settings_table(self):
+        """Create and populate uncertainty results table."""
+
+        # Setup table
+        tbl = self.table_uncertainty_settings
+        tbl.setRowCount(13)
+        tbl.setColumnCount(2)
+        v_header = [
+            self.tr("Draft (m)"),
+            self.tr("Left edge distance (%)"),
+            self.tr("Right edge distance (%)"),
+            self.tr("Depth cell size (%)"),
+            self.tr("Extrap: power exponent minimum"),
+            self.tr("Extrap: power exponent maximum"),
+            self.tr("Extrap: no slip exponent minimum"),
+            self.tr("Extrap: no slip exponent maximum"),
+            self.tr("GGA boat speed (m/s)"),
+            self.tr("VTG boat speed (m/s)"),
+            self.tr("Compass error (deg)"),
+            self.tr("Bayesian COV Prior"),
+            self.tr("Bayesian COV Prior Uncertainty"),
+        ]
+        tbl.setHorizontalHeaderLabels([self.tr("Default"), self.tr("User")])
+        tbl.setVerticalHeaderLabels(v_header)
+        tbl.horizontalHeader().setFont(self.font_bold)
+        tbl.verticalHeader().setFont(self.font_bold)
+        tbl.itemChanged.connect(self.user_advanced_settings_change)
+        tbl.itemChanged.disconnect()
+
+        # Draft
+        row = 0
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Computed"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(self.meas.oursin.user_advanced_settings["draft_error_m_user"]):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings["draft_error_m_user"]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # Left edge
+        row += 1
+        tbl.setItem(
+            row,
+            0,
+            QtWidgets.QTableWidgetItem(
+                "{:5.2f}".format(
+                    self.meas.oursin.default_advanced_settings["left_edge_dist_prct"]
+                )
+            ),
+        )
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(
+            self.meas.oursin.user_advanced_settings["left_edge_dist_prct_user"]
+        ):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings[
+                            "left_edge_dist_prct_user"
+                        ]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # Right edge
+        row += 1
+        tbl.setItem(
+            row,
+            0,
+            QtWidgets.QTableWidgetItem(
+                "{:5.2f}".format(
+                    self.meas.oursin.default_advanced_settings["right_edge_dist_prct"]
+                )
+            ),
+        )
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(
+            self.meas.oursin.user_advanced_settings["right_edge_dist_prct_user"]
+        ):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings[
+                            "right_edge_dist_prct_user"
+                        ]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # Depth cell size
+        row += 1
+        tbl.setItem(
+            row,
+            0,
+            QtWidgets.QTableWidgetItem(
+                "{:5.2f}".format(self.meas.oursin.default_advanced_settings["dzi_prct"])
+            ),
+        )
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(self.meas.oursin.user_advanced_settings["dzi_prct_user"]):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings["dzi_prct_user"]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # Power minimum
+        row += 1
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Computed"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(self.meas.oursin.user_advanced_settings["exp_pp_min_user"]):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings["exp_pp_min_user"]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # Power maximum
+        row += 1
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Computed"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(self.meas.oursin.user_advanced_settings["exp_pp_max_user"]):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings["exp_pp_max_user"]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # No slip minimum
+        row += 1
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Computed"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(self.meas.oursin.user_advanced_settings["exp_ns_min_user"]):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings["exp_ns_min_user"]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # No slip maximum
+        row += 1
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Computed"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(self.meas.oursin.user_advanced_settings["exp_ns_max_user"]):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings["exp_ns_max_user"]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # GGA
+        row += 1
+        tbl.setItem(row, 0, QtWidgets.QTableWidgetItem("Computed"))
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(self.meas.oursin.user_advanced_settings["gga_boat_mps_user"]):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings["gga_boat_mps_user"]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # VTG
+        row += 1
+        tbl.setItem(
+            row,
+            0,
+            QtWidgets.QTableWidgetItem(
+                "{:5.2f}".format(
+                    self.meas.oursin.default_advanced_settings["vtg_boat_mps"]
+                )
+            ),
+        )
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(self.meas.oursin.user_advanced_settings["vtg_boat_mps_user"]):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings["vtg_boat_mps_user"]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # Compass
+        row += 1
+        tbl.setItem(
+            row,
+            0,
+            QtWidgets.QTableWidgetItem(
+                "{:5.2f}".format(
+                    self.meas.oursin.default_advanced_settings["compass_error_deg"]
+                )
+            ),
+        )
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(
+            self.meas.oursin.user_advanced_settings["compass_error_deg_user"]
+        ):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings[
+                            "compass_error_deg_user"
+                        ]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # Bayesian COV Prior
+        row += 1
+        tbl.setItem(
+            row,
+            0,
+            QtWidgets.QTableWidgetItem(
+                "{:5.2f}".format(
+                    self.meas.oursin.default_advanced_settings["cov_prior"]
+                )
+            ),
+        )
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(self.meas.oursin.user_advanced_settings["cov_prior_user"]):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings["cov_prior_user"]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        # Bayesian COV Prior Uncertainty
+        row += 1
+        tbl.setItem(
+            row,
+            0,
+            QtWidgets.QTableWidgetItem(
+                "{:5.2f}".format(
+                    self.meas.oursin.default_advanced_settings["cov_prior_u"]
+                )
+            ),
+        )
+        tbl.item(row, 0).setFlags(QtCore.Qt.ItemIsEnabled)
+        if not np.isnan(self.meas.oursin.user_advanced_settings["cov_prior_u_user"]):
+            tbl.setItem(
+                row,
+                1,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.2f}".format(
+                        self.meas.oursin.user_advanced_settings["cov_prior_u_user"]
+                    )
+                ),
+            )
+        else:
+            tbl.setItem(row, 1, QtWidgets.QTableWidgetItem(""))
+
+        tbl.itemChanged.connect(self.user_advanced_settings_change)
+
+    def user_uncertainty_change(self):
+        """Recomputes the uncertainty based on user input."""
+
+        # Get edited value from table
+        with self.wait_cursor():
+            new_value = self.check_numeric_input(
+                obj=self.table_uncertainty_results.selectedItems()[0], block=False
+            )
+            if new_value is None:
+                new_value = np.nan
+
+            # Identify uncertainty variable that was edited.
+            col_index = self.table_uncertainty_results.selectedItems()[0].column()
+            if col_index == 1:
+                self.meas.oursin.user_specified_u["u_syst_mean_user"] = new_value
+            elif col_index == 2:
+                self.meas.oursin.user_specified_u["u_compass_user"] = new_value
+            elif col_index == 3:
+                self.meas.oursin.user_specified_u["u_movbed_user"] = new_value
+            elif col_index == 4:
+                self.meas.oursin.user_specified_u["u_ens_user"] = new_value
+            elif col_index == 5:
+                self.meas.oursin.user_specified_u["u_meas_mean_user"] = new_value
+            elif col_index == 6:
+                self.meas.oursin.user_specified_u["u_top_mean_user"] = new_value
+            elif col_index == 7:
+                self.meas.oursin.user_specified_u["u_bot_mean_user"] = new_value
+            elif col_index == 8:
+                self.meas.oursin.user_specified_u["u_left_mean_user"] = new_value
+            elif col_index == 9:
+                self.meas.oursin.user_specified_u["u_right_mean_user"] = new_value
+            elif col_index == 10:
+                self.meas.oursin.user_specified_u["u_invalid_boat_user"] = new_value
+            elif col_index == 11:
+                self.meas.oursin.user_specified_u["u_invalid_depth_user"] = new_value
+            elif col_index == 12:
+                self.meas.oursin.user_specified_u["u_invalid_water_user"] = new_value
+
+            # Compute new uncertainty values
+            self.meas.oursin.compute_oursin(meas=self.meas)
+
+            # Update
+            self.uncertainty_results_table()
+            self.uncertainty_meas_q_plot()
+            self.uncertainty_measurement_plot()
+            self.uncertainty_comments_messages()
+            self.change = True
+
+    def user_advanced_settings_change(self):
+        """User advanced settings have changed, update settings and
+        recompute uncertainty.
+        """
+
+        # Get edited value from table
+        with self.wait_cursor():
+            new_value = self.check_numeric_input(
+                obj=self.table_uncertainty_settings.selectedItems()[0], block=False
+            )
+            if new_value is None:
+                new_value = np.nan
+
+            # Identify uncertainty variable that was edited.
+            row_index = self.table_uncertainty_settings.selectedItems()[0].row()
+            if row_index == 0:
+                self.meas.oursin.user_advanced_settings[
+                    "draft_error_m_user"
+                ] = new_value
+            elif row_index == 1:
+                self.meas.oursin.user_advanced_settings[
+                    "left_edge_dist_prct_user"
+                ] = new_value
+            elif row_index == 2:
+                self.meas.oursin.user_advanced_settings[
+                    "right_edge_dist_prct_user"
+                ] = new_value
+            elif row_index == 3:
+                self.meas.oursin.user_advanced_settings["dzi_prct_user"] = new_value
+            elif row_index == 4:
+                self.meas.oursin.user_advanced_settings["exp_pp_min_user"] = new_value
+            elif row_index == 5:
+                self.meas.oursin.user_advanced_settings["exp_pp_max_user"] = new_value
+            elif row_index == 6:
+                self.meas.oursin.user_advanced_settings["exp_ns_min_user"] = new_value
+            elif row_index == 7:
+                self.meas.oursin.user_advanced_settings["exp_ns_max_user"] = new_value
+            elif row_index == 8:
+                self.meas.oursin.user_advanced_settings["gga_boat_mps_user"] = new_value
+            elif row_index == 9:
+                self.meas.oursin.user_advanced_settings["vtg_boat_mps_user"] = new_value
+            elif row_index == 10:
+                self.meas.oursin.user_advanced_settings[
+                    "compass_error_deg_user"
+                ] = new_value
+            elif row_index == 11:
+                self.meas.oursin.user_advanced_settings["cov_prior_user"] = new_value
+            elif row_index == 12:
+                self.meas.oursin.user_advanced_settings["cov_prior_u_user"] = new_value
+
+            # Compute new uncertainty values
+            self.meas.oursin.compute_oursin(meas=self.meas)
+
+            # Update
+            self.uncertainty_results_table()
+            self.advanced_settings_table()
+            self.uncertainty_meas_q_plot()
+            self.uncertainty_measurement_plot()
+            self.uncertainty_comments_messages()
+
+    def uncertainty_measurement_plot(self):
+        """Create or update measurement uncertainty plot."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.uncertainty_measurement_canvas is None:
+            # Create the canvas
+            self.uncertainty_measurement_canvas = MplCanvas(
+                parent=self.graph_u_measurement, width=20, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_u_measurement)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.uncertainty_measurement_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.uncertainty_measurement_toolbar = NavigationToolbar(
+                self.uncertainty_measurement_canvas, self
+            )
+            self.uncertainty_measurement_toolbar.hide()
+
+        # Initialize the contour figure and assign to the canvas
+        self.uncertainty_measurement_fig = UMeasurement(
+            canvas=self.uncertainty_measurement_canvas
+        )
+        # Create the figure with the specified data
+        self.uncertainty_measurement_fig.create(self.meas.oursin)
+
+        # Set margins and padding for figure
+        self.uncertainty_measurement_canvas.fig.subplots_adjust(
+            left=0.05, bottom=0.1, right=0.88, top=0.98, wspace=0, hspace=0
+        )
+        # Draw canvas
+        self.uncertainty_measurement_canvas.draw()
+
+    def uncertainty_meas_q_plot(self):
+        """Create or update measured discharge uncertainty plot."""
+
+        # If the canvas has not been previously created, create the canvas
+        # and add the widget.
+        if self.uncertainty_meas_q_canvas is None:
+            # Create the canvas
+            self.uncertainty_meas_q_canvas = MplCanvas(
+                parent=self.graph_u_meas, width=4, height=4, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_u_meas)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.uncertainty_meas_q_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.uncertainty_meas_q_toolbar = NavigationToolbar(
+                self.uncertainty_meas_q_canvas, self
+            )
+            self.uncertainty_meas_q_toolbar.hide()
+
+        # Initialize the contour figure and assign to the canvas
+        self.uncertainty_meas_q_fig = UMeasQ(canvas=self.uncertainty_meas_q_canvas)
+        # Create the figure with the specified data
+        self.uncertainty_meas_q_fig.create(self.meas.oursin)
+
+        # Set margins and padding for figure
+        self.uncertainty_meas_q_canvas.fig.subplots_adjust(
+            left=0.12, bottom=0.1, right=0.77, top=0.98, wspace=0.1, hspace=0
+        )
+        # Draw canvas
+        self.uncertainty_meas_q_canvas.draw()
+
+    def uncertainty_comments_messages(self):
+        """Displays comments and messages associated with uncertainty in
+        Messages tab.
+        """
+
+        # Clear comments and messages
+        self.display_uncertainty_comments.clear()
+        self.display_uncertainty_messages.clear()
+
+        if self.meas is not None:
+            # Display each comment on a new line
+            self.display_uncertainty_comments.moveCursor(QtGui.QTextCursor.Start)
+            for comment in self.meas.comments:
+                self.display_uncertainty_comments.textCursor().insertText(comment)
+                self.display_uncertainty_comments.moveCursor(QtGui.QTextCursor.End)
+                self.display_uncertainty_comments.textCursor().insertBlock()
+
+            self.meas.qa.check_oursin(self.meas)
+            self.update_tab_icons()
+
+    # EDI tab
+    # =======
+    def edi_tab(self):
+        """Initializes the EDI tab."""
+
+        # Setup transect selection table
+        tbl = self.tbl_edi_transect
+        units = self.units
+        summary_header = [
+            self.tr("Select Transect"),
+            self.tr("Start"),
+            self.tr("Bank"),
+            self.tr("End"),
+            self.tr("Duration (sec)"),
+            self.tr("Total Q" + self.units["label_Q"]),
+            self.tr("Top Q" + self.units["label_Q"]),
+            self.tr("Meas Q" + self.units["label_Q"]),
+            self.tr("Bottom Q" + self.units["label_Q"]),
+            self.tr("Left Q" + self.units["label_Q"]),
+            self.tr("Right Q" + self.units["label_Q"]),
+        ]
+        ncols = len(summary_header)
+        nrows = len(self.checked_transects_idx)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(summary_header)
+        header_font = QtGui.QFont()
+        header_font.setBold(True)
+        header_font.setPointSize(14)
+        tbl.horizontalHeader().setFont(header_font)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        # Add transect data
+        for row in range(nrows):
+            col = 0
+            transect_id = self.checked_transects_idx[row]
+
+            checked = QtWidgets.QTableWidgetItem(
+                self.meas.transects[transect_id].file_name[:-4]
+            )
+            checked.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
+            checked.setCheckState(QtCore.Qt.Unchecked)
+            tbl.setItem(row, col, checked)
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    datetime.strftime(
+                        datetime.utcfromtimestamp(
+                            self.meas.transects[transect_id].date_time.start_serial_time
+                        ),
+                        "%H:%M:%S",
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    self.meas.transects[transect_id].start_edge[0]
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    datetime.strftime(
+                        datetime.utcfromtimestamp(
+                            self.meas.transects[transect_id].date_time.end_serial_time
+                        ),
+                        "%H:%M:%S",
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.1f}".format(
+                        self.meas.transects[transect_id].date_time.transect_duration_sec
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:8}".format(
+                        self.q_digits(
+                            self.meas.discharge[transect_id].total * units["Q"]
+                        )
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7}".format(
+                        self.q_digits(self.meas.discharge[transect_id].top * units["Q"])
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7}".format(
+                        self.q_digits(
+                            self.meas.discharge[transect_id].middle * units["Q"]
+                        )
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7}".format(
+                        self.q_digits(
+                            self.meas.discharge[transect_id].bottom * units["Q"]
+                        )
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7}".format(
+                        self.q_digits(
+                            self.meas.discharge[transect_id].left * units["Q"]
+                        )
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7}".format(
+                        self.q_digits(
+                            self.meas.discharge[transect_id].right * units["Q"]
+                        )
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+        # Setup EDI table
+        tbl_edi = self.tbl_edi_results
+        self.txt_edi_offset.setText(
+            self.tr("Zero Distance Offset" + self.units["label_L"])
+        )
+        edi_header = [
+            self.tr("Percent Q"),
+            self.tr("Target Q " + self.units["label_Q"]),
+            self.tr("Actual Q " + self.units["label_Q"]),
+            self.tr("Distance " + self.units["label_L"]),
+            self.tr("Depth " + self.units["label_L"]),
+            self.tr("Velocity " + self.units["label_L"]),
+            self.tr("Latitude (D M.M)"),
+            self.tr("Longitude (D M.M)"),
+        ]
+        ncols = len(edi_header)
+        nrows = 5
+        tbl_edi.setRowCount(nrows)
+        tbl_edi.setColumnCount(ncols)
+        tbl_edi.setHorizontalHeaderLabels(edi_header)
+        header_font = QtGui.QFont()
+        header_font.setBold(True)
+        header_font.setPointSize(14)
+        tbl_edi.horizontalHeader().setFont(header_font)
+        tbl_edi.verticalHeader().hide()
+
+        # Initialize values in results table
+        tbl_edi.setItem(0, 0, QtWidgets.QTableWidgetItem("10"))
+        tbl_edi.setItem(1, 0, QtWidgets.QTableWidgetItem("30"))
+        tbl_edi.setItem(2, 0, QtWidgets.QTableWidgetItem("50"))
+        tbl_edi.setItem(3, 0, QtWidgets.QTableWidgetItem("70"))
+        tbl_edi.setItem(4, 0, QtWidgets.QTableWidgetItem("90"))
+
+        # Configure table so first column is the only editable column
+        for row in range(tbl_edi.rowCount()):
+            for col in range(1, 8):
+                tbl_edi.setItem(row, col, QtWidgets.QTableWidgetItem(" "))
+                tbl_edi.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        tbl_edi.resizeColumnsToContents()
+        tbl_edi.resizeRowsToContents()
+
+        self.pb_edi_compute.setEnabled(False)
+
+        # Setup connections to other methods
+        if not self.edi_initialized:
+            tbl.cellClicked.connect(self.edi_select_transect)
+            self.pb_edi_add_row.clicked.connect(self.edi_add_row)
+            self.pb_edi_compute.clicked.connect(self.edi_compute)
+            self.edi_initialized = True
+
+    def edi_select_transect(self, row, col):
+        """Handles checkbox so only one box can be checked.
+        Updates the GUI to reflect the start bank of the transect selected
+
+        Parameters
+        ----------
+        row: int
+            Row clicked by user
+        col: int
+            Column clicked by user
+        """
+
+        # Checkbox control
+        if col == 0:
+            # Ensures only one box can be checked
+            for r in range(self.tbl_edi_transect.rowCount()):
+                if r == row:
+                    self.tbl_edi_transect.item(r, col).setCheckState(QtCore.Qt.Checked)
+                else:
+                    self.tbl_edi_transect.item(r, col).setCheckState(
+                        QtCore.Qt.Unchecked
+                    )
+
+            # Update the GUI to reflect the start bank of the selected transect
+            if (
+                self.meas.transects[self.checked_transects_idx[row]].start_edge[0]
+                == "R"
+            ):
+                self.txt_edi_bank.setText(self.tr("From Right Bank"))
+            else:
+                self.txt_edi_bank.setText(self.tr("From Left Bank"))
+
+            # After a transect is selected enable the compute button in the GUI
+            self.pb_edi_compute.setEnabled(True)
+
+    def edi_add_row(self):
+        """Allows the user to add a row to the results table so that more
+        than 5 verticals can be defined."""
+
+        # Insert row at bottom
+        row_position = self.tbl_edi_results.rowCount()
+        self.tbl_edi_results.insertRow(row_position)
+
+        # Allow editing of first column only
+        for col in range(1, 7):
+            self.tbl_edi_results.setItem(
+                row_position, col, QtWidgets.QTableWidgetItem(" ")
+            )
+            self.tbl_edi_results.item(row_position, col).setFlags(
+                QtCore.Qt.ItemIsEnabled
+            )
+
+    def edi_update_table(self):
+        """Updates the results table with the computed data."""
+
+        tbl = self.tbl_edi_results
+
+        # Add data to table
+        for row in range(len(self.edi_results["percent"])):
+            col = 0
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:2.0f}".format(self.edi_results["percent"][row])
+                ),
+            )
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:6.2f}".format(
+                        self.edi_results["target_q"][row] * self.units["Q"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:6.2f}".format(
+                        self.edi_results["actual_q"][row] * self.units["Q"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            # Code to handle either blank or user supplied data
+            try:
+                offset = float(self.edi_offset.text())
+            except ValueError:
+                offset = 0
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:6.1f}".format(
+                        (self.edi_results["distance"][row] * self.units["L"]) + offset
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.1f}".format(self.edi_results["depth"][row] * self.units["L"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:4.1f}".format(
+                        self.edi_results["velocity"][row] * self.units["L"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Convert lat and lon for decimal degrees to degrees and decimal
+            # minutes
+            try:
+                latd = int(self.edi_results["lat"][row])
+                latm = np.abs((self.edi_results["lat"][row] - latd) * 60)
+                lond = int(self.edi_results["lon"][row])
+                lonm = np.abs((self.edi_results["lon"][row] - lond) * 60)
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem("{:3.0f} {:3.7f}".format(latd, latm)),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                col += 1
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem("{:3.0f} {:3.7f}".format(lond, lonm)),
+                )
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            except ValueError:
+
+                col += 1
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(""))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+                col += 1
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem(""))
+                tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+    def edi_compute(self):
+        """Coordinates the computation of the EDI results."""
+
+        selected_idx = 0
+
+        # Find selected transect index
+        for row in range(self.tbl_edi_transect.rowCount()):
+            if self.tbl_edi_transect.item(row, 0).checkState() == QtCore.Qt.Checked:
+                selected_idx = self.checked_transects_idx[row]
+                break
+
+        # Find specified percentages
+        percents = []
+        for row in range(self.tbl_edi_results.rowCount()):
+            try:
+                percent = float(self.tbl_edi_results.item(row, 0).text())
+                percents.append(percent)
+            except AttributeError:
+                pass
+
+        # If the selected transect has computed discharge compute EDI results
+        if np.abs(self.meas.discharge[selected_idx].total) > 0:
+            # Compute EDI results
+            self.edi_results = Measurement.compute_edi(
+                self.meas, selected_idx, percents
+            )
+            # Update EDI results table
+            self.edi_update_table()
+            # Create topoquad file is requested
+            if self.cb_edi_topoquad.checkState() == QtCore.Qt.Checked:
+                self.create_topoquad_file()
+        else:
+            # Display message to user
+            self.popup_message(self.tr("The selected transect has no discharge"))
+
+    def create_topoquad_file(self):
+        """Create an ASCII file that can be loaded into TopoQuads to mark
+        the EDI locations with a yellow dot.
+        """
+
+        # Get user defined filename
+        text, ok_pressed = QtWidgets.QInputDialog.getText(
+            self,
+            self.tr("TopoQuad File"),
+            self.tr("Enter " "filename (no " "suffix)for " "TopoQuad " "file:"),
+            QtWidgets.QLineEdit.Normal,
+            "edi_topoquad",
+        )
+        # Create and save file to folder containing measurement data
+        if ok_pressed and text != "":
+            filename = text + ".txt"
+            fullname = os.path.join(self.sticky_settings.get("Folder"), filename)
+            with open(fullname, "w") as outfile:
+                outfile.write("BEGIN SYMBOL \n")
+                for n in range(len(self.edi_results["lat"])):
+                    outfile.write(
+                        "{:15.10f}, {:15.10f}, Yellow Dot\n".format(
+                            self.edi_results["lat"][n], self.edi_results["lon"][n]
+                        )
+                    )
+                outfile.write("END")
+        else:
+            # Report error to user
+            error_dialog = QtWidgets.QErrorMessage()
+            error_dialog.showMessage(
+                self.tr("Invalid output filename. TopoQuad file not created.")
+            )
+
+    # Adv. Graph tab
+    # ==============
+    def adv_graph_tab(self):
+        """Initializes all of the features of the advanced graphics tab."""
+
+        if not self.adv_graph_initialized:
+            # Advanced tab setup
+            self.pb_adv_graph_create_plots.clicked.connect(self.adv_graph_plots)
+            self.pb_adv_graph_controls.clicked.connect(self.adv_graph_show_hide)
+            self.combo_adv_graph_transect.currentIndexChanged.connect(
+                self.adv_graph_transect_select
+            )
+            self.rb_adv_graph_ensemble.toggled.connect(self.x_axis_ensemble)
+            self.rb_adv_graph_length.toggled.connect(self.x_axis_length)
+            self.rb_adv_graph_time.toggled.connect(self.x_axis_time)
+            self.pb_adv_graph_auto_flow_direction.clicked.connect(
+                self.adv_graph_auto_flow_direction
+            )
+
+            # Configure dictionary of plot options
+            self.adv_graph_types = [
+                ("cb_speed_filtered_cc", self.cb_adv_graph_speed_filtered),
+                ("cb_speed_final_cc", self.cb_adv_graph_speed_final),
+                ("cb_projected_cc", self.cb_adv_graph_projected),
+                ("cb_vertical_cc", self.cb_adv_graph_vertical),
+                ("cb_error_cc", self.cb_adv_graph_error),
+                ("cb_direction_cc", self.cb_adv_graph_direction),
+                ("cb_avg_corr_cc", self.cb_adv_graph_avg_corr),
+                ("cb_corr_beam_cc", self.cb_adv_graph_corr_beam),
+                ("cb_avg_rssi_cc", self.cb_adv_graph_avg_rssi),
+                ("cb_rssi_beam_cc", self.cb_adv_graph_rssi_beam),
+                ("cb_ping_type_cc", self.cb_adv_graph_ping_type),
+                ("cb_discharge_ts", self.cb_adv_graph_discharge),
+                ("cb_discharge_percent_ts", self.cb_adv_graph_discharge_percent),
+                ("cb_avg_speed_ts", self.cb_adv_graph_avg_speed),
+                ("cb_projected_speed_ts", self.cb_adv_graph_projected_speed_ts),
+                ("cb_wt_beams_ts", self.cb_adv_graph_wt_beams_ts),
+                ("cb_wt_error_ts", self.cb_adv_graph_wt_error_ts),
+                ("cb_wt_vert_ts", self.cb_adv_graph_wt_vert_ts),
+                ("cb_wt_snr_ts", self.cb_adv_graph_wt_snr_ts),
+                ("cb_bt_boat_speed_ts", self.cb_adv_graph_bt_boat_speed),
+                ("cb_bt_3beam_ts", self.cb_adv_graph_bt_3beam),
+                ("cb_bt_error_ts", self.cb_adv_graph_bt_error),
+                ("cb_bt_vertical_ts", self.cb_adv_graph_bt_vertical),
+                ("cb_bt_source_ts", self.cb_adv_graph_bt_source),
+                ("cb_bt_corr_ts", self.cb_adv_graph_bt_correlation),
+                ("cb_bt_rssi_ts", self.cb_adv_graph_bt_rssi),
+                ("cb_gga_boat_speed_ts", self.cb_adv_graph_gga_boat_speed),
+                ("cb_vtg_boat_speed_ts", self.cb_adv_graph_vtg_boat_speed),
+                ("cb_gga_quality_ts", self.cb_adv_graph_gga_quality),
+                ("cb_gga_hdop_ts", self.cb_adv_graph_gga_hdop),
+                ("cb_gga_altitude_ts", self.cb_adv_graph_gga_altitude),
+                ("cb_gga_sats_ts", self.cb_adv_graph_gga_satellites),
+                ("cb_gga_source_ts", self.cb_adv_graph_gga_source),
+                ("cb_vtg_source_ts", self.cb_adv_graph_vtg_source),
+                ("cb_adcp_heading_ts", self.cb_adv_graph_adcp_heading),
+                ("cb_ext_heading_ts", self.cb_adv_graph_ext_heading),
+                ("cb_mag_error_ts", self.cb_adv_graph_mag_error),
+                ("cb_pitch_ts", self.cb_adv_graph_pitch),
+                ("cb_roll_ts", self.cb_adv_graph_roll),
+                ("cb_beam_depths_ts", self.cb_adv_graph_beam_depths),
+                ("cb_final_depths_ts", self.cb_adv_graph_final_depths),
+                ("cb_depths_source_ts", self.cb_adv_graph_depth_source),
+                ("cb_battery_voltage_ts", self.cb_adv_graph_battery_voltage),
+            ]
+
+            trans_prop = Measurement.compute_measurement_properties(self.meas)
+            direction = trans_prop["avg_water_dir"][
+                self.checked_transects_idx[self.transect_row]
+            ]
+            self.ed_adv_graph_flow_dir.setText("{:6.2f}".format(direction))
+
+            self.adv_graph_initialized = True
+
+        # Populate combo box
+        self.combo_adv_graph_transect.blockSignals(True)
+        self.combo_adv_graph_transect.clear()
+        for idx in self.checked_transects_idx:
+            self.combo_adv_graph_transect.addItem(self.meas.transects[idx].file_name)
+
+        # Set selected
+        self.combo_adv_graph_transect.setCurrentIndex(self.transect_row)
+        self.combo_adv_graph_transect.blockSignals(False)
+
+        # Set x-axis radio button
+        self.rb_adv_graph_ensemble.blockSignals(True)
+        self.rb_adv_graph_length.blockSignals(True)
+        self.rb_adv_graph_time.blockSignals(True)
+        if self.x_axis_type == "E":
+            self.rb_adv_graph_ensemble.setChecked(True)
+        elif self.x_axis_type == "L":
+            self.rb_adv_graph_length.setChecked(True)
+        elif self.x_axis_type == "T":
+            self.rb_adv_graph_time.setChecked(True)
+        self.rb_adv_graph_ensemble.blockSignals(False)
+        self.rb_adv_graph_length.blockSignals(False)
+        self.rb_adv_graph_time.blockSignals(False)
+
+        self.available_plot_types()
+
+        self.adv_graph_plots()
+
+        # Setup list for use by graphics controls
+        self.canvases = [self.adv_graph_canvas]
+        self.figs = [self.adv_graph_fig]
+        self.fig_calls = [self.adv_graph_plots]
+        self.toolbars = [self.adv_graph_toolbar]
+        self.ui_parents = [i.parent() for i in self.canvases]
+        self.figs_menu_connection()
+
+    def adv_graph_transect_select(self):
+        """Updates advanced graphics with newly selected transect."""
+
+        self.transect_row = self.combo_adv_graph_transect.currentIndex()
+        self.available_plot_types()
+        self.adv_graph_plots()
+
+    def adv_graph_auto_flow_direction(self):
+        """Computes the mean flow direction and populates the flow direction
+        edit box.
+        """
+
+        trans_prop = Measurement.compute_measurement_properties(self.meas)
+        direction = trans_prop["avg_water_dir"][
+            self.checked_transects_idx[self.transect_row]
+        ]
+        self.ed_adv_graph_flow_dir.setText("{:6.2f}".format(direction))
+
+    def available_plot_types(self):
+        """Enable / disable plot types"""
+
+        # Mag Error
+        if self.meas.transects[
+            self.checked_transects_idx[self.transect_row]
+        ].sensors.heading_deg.internal.mag_error is not None and np.logical_not(
+            np.all(
+                np.isnan(
+                    self.meas.transects[
+                        self.checked_transects_idx[self.transect_row]
+                    ].sensors.heading_deg.internal.mag_error
+                )
+            )
+        ):
+            self.cb_adv_graph_mag_error.setEnabled(True)
+        else:
+            self.cb_adv_graph_mag_error.setEnabled(False)
+            self.cb_adv_graph_mag_error.setChecked(False)
+
+        # External Compass
+        if (
+            self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].sensors.heading_deg.external
+            is not None
+        ):
+            self.cb_adv_graph_ext_heading.setEnabled(True)
+        else:
+            self.cb_adv_graph_ext_heading.setEnabled(False)
+            self.cb_adv_graph_ext_heading.setChecked(False)
+
+        # GGA data
+        if (
+            self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].boat_vel.gga_vel
+            is not None
+            and self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].boat_vel.gga_vel.u_mps
+            is not None
+        ):
+            self.cb_adv_graph_gga_boat_speed.setEnabled(True)
+            self.cb_adv_graph_gga_quality.setEnabled(True)
+            self.cb_adv_graph_gga_hdop.setEnabled(True)
+            self.cb_adv_graph_gga_altitude.setEnabled(True)
+            self.cb_adv_graph_gga_satellites.setEnabled(True)
+            self.cb_adv_graph_gga_source.setEnabled(True)
+        else:
+            self.cb_adv_graph_gga_boat_speed.setEnabled(False)
+            self.cb_adv_graph_gga_quality.setEnabled(False)
+            self.cb_adv_graph_gga_hdop.setEnabled(False)
+            self.cb_adv_graph_gga_altitude.setEnabled(False)
+            self.cb_adv_graph_gga_satellites.setEnabled(False)
+            self.cb_adv_graph_gga_source.setEnabled(False)
+            self.cb_adv_graph_gga_boat_speed.setChecked(False)
+            self.cb_adv_graph_gga_quality.setChecked(False)
+            self.cb_adv_graph_gga_hdop.setChecked(False)
+            self.cb_adv_graph_gga_altitude.setChecked(False)
+            self.cb_adv_graph_gga_satellites.setChecked(False)
+            self.cb_adv_graph_gga_source.setChecked(False)
+
+        if (
+            self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].boat_vel.vtg_vel
+            is not None
+            and self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].boat_vel.vtg_vel.u_mps
+            is not None
+        ):
+            self.cb_adv_graph_vtg_boat_speed.setEnabled(True)
+            self.cb_adv_graph_vtg_source.setEnabled(True)
+        else:
+            self.cb_adv_graph_vtg_boat_speed.setEnabled(False)
+            self.cb_adv_graph_vtg_boat_speed.setChecked(False)
+            self.cb_adv_graph_vtg_source.setEnabled(False)
+            self.cb_adv_graph_vtg_source.setChecked(False)
+
+        # BT data
+        if (
+            self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].boat_vel.bt_vel.corr.size
+            > 0
+        ):
+            self.cb_adv_graph_bt_correlation.setEnabled(True)
+        else:
+            self.cb_adv_graph_bt_correlation.setEnabled(False)
+            self.cb_adv_graph_bt_correlation.setChecked(False)
+
+        if (
+            self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].boat_vel.bt_vel.rssi.size
+            > 0
+        ):
+            self.cb_adv_graph_bt_rssi.setEnabled(True)
+        else:
+            self.cb_adv_graph_bt_rssi.setEnabled(False)
+            self.cb_adv_graph_bt_rssi.setChecked(False)
+
+        # WT Data
+        if (
+            self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].adcp.manufacturer
+            == "SonTek"
+        ):
+            self.cb_adv_graph_wt_snr_ts.setEnabled(True)
+        else:
+            self.cb_adv_graph_wt_snr_ts.setEnabled(False)
+            self.cb_adv_graph_wt_snr_ts.setChecked(False)
+
+        # Battery voltage
+        if (
+            self.meas.transects[
+                self.checked_transects_idx[self.transect_row]
+            ].sensors.battery_voltage.internal
+            is None
+        ):
+            self.cb_adv_graph_battery_voltage.setEnabled(False)
+        else:
+            self.cb_adv_graph_battery_voltage.setEnabled(True)
+
+    def adv_graph_plots(self):
+        """Creates advanced plots for data in transect."""
+
+        # Determine which plot types the user has selected
+        selected_types = []
+        for item in self.adv_graph_types:
+            if item[1].isChecked():
+                selected_types.append(item[0])
+
+        # Get flow direction
+        flow_direction = float(self.ed_adv_graph_flow_dir.text())
+
+        # Determine transect to plot
+        idx = self.checked_transects_idx[self.combo_adv_graph_transect.currentIndex()]
+
+        # If the canvas has not been previously created, create the canvas and
+        # add the widget.
+        if self.adv_graph_canvas is None:
+            # Create the canvas
+            self.adv_graph_canvas = MplCanvas(
+                parent=self.graph_adv_graph, width=10, height=8, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graph_adv_graph)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(0, 0, 0, 0)
+            # Add the canvas
+            layout.addWidget(self.adv_graph_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.adv_graph_toolbar = NavigationToolbar(self.adv_graph_canvas, self)
+            self.adv_graph_toolbar.hide()
+
+        # Initialize the advanced figure and assign to the canvas
+        self.adv_graph_fig = AdvGraphs(canvas=self.adv_graph_canvas)
+        # Create the figure with the specified data
+        self.adv_graph_fig.create(
+            transect=self.meas.transects[idx],
+            discharge=self.meas.discharge[idx],
+            units=self.units,
+            selected_types=selected_types,
+            color_map=self.color_map,
+            x_axis_type=self.x_axis_type,
+            flow_direction=flow_direction,
+            show_below_sl=self.show_below_sl,
+            show_unmeasured=self.plot_extrapolated,
+        )
+
+        # Draw canvas
+        self.adv_graph_canvas.draw()
+
+        # Update list of figs
+        self.figs = [self.adv_graph_fig]
+        self.fig_calls = [self.adv_graph_plots]
+        self.toolbars = [self.adv_graph_toolbar]
+
+        # Reset data cursor to work with new figure
+        if self.actionData_Cursor.isChecked():
+            self.data_cursor()
+        self.tab_adv_graph.setFocus()
+
+    def adv_graph_show_hide(self):
+        """Controls the visibility of the plot controls and expands and
+        contracts the layout holding the plots and plot controls.
+        """
+
+        # Hide control and expand plots
+        if self.gb_adv_graph_controls.isVisible():
+            self.gb_adv_graph_controls.hide()
+            self.adv_graph_layout.setStretch(0, 10)
+            self.adv_graph_layout.setStretch(1, 0)
+            self.pb_adv_graph_controls.setText("Show Plot Controls")
+
+        # Show control and reduce plot area
+        else:
+            self.gb_adv_graph_controls.show()
+            self.adv_graph_layout.setStretch(0, 7)
+            self.adv_graph_layout.setStretch(1, 3)
+            self.pb_adv_graph_controls.setText("Hide Plot Controls")
+
+    # MAP tab (Multi-transects Average Profile)
+    # ==============
+    def map_tab(self):
+        """Initializes and configures MAP tab."""
+        if self.meas.map is not None:
+            if self.change:
+                # Reset settings if change
+                self.cb_map_interpolation.setChecked(False)
+                self.cb_map_top_bottom.setChecked(True)
+                self.cb_map_edges.setChecked(True)
+                self.cb_map_bed_profiles.setChecked(False)
+                self.ed_map_cell_width.setText("")
+                self.ed_map_cell_height.setText("")
+                self.ed_map_secondary_velocity.setText("")
+                self.combo_map_data.setCurrentIndex(0)
+                self.map_current_settings = {
+                    "cb_map_interpolation": self.cb_map_interpolation.isChecked(),
+                    "ed_map_cell_width": self.check_numeric_input(
+                        self.ed_map_cell_width
+                    ),
+                    "ed_map_cell_height": self.check_numeric_input(
+                        self.ed_map_cell_height
+                    ),
+                    "cb_map_top_bottom": self.cb_map_top_bottom.isChecked(),
+                    "cb_map_edges": self.cb_map_edges.isChecked(),
+                    "ed_map_secondary_velocity": self.check_numeric_input(
+                        self.ed_map_secondary_velocity
+                    ),
+                    "cb_map_bed_profiles": self.cb_map_bed_profiles.isChecked(),
+                    "combo_map_data": self.combo_map_data.currentText(),
+                }
+
+            # Disable MAP open Earth button if not GGA
+            settings = Measurement.current_settings(self.meas)
+            if settings["NavRef"] == "gga_vel":
+                self.pb_map_open_earth.setEnabled(True)
+            else:
+                self.pb_map_open_earth.setEnabled(False)
+
+            # Save MAP parameters as dic
+            self.map_settings = {
+                "cb_map_interpolation": self.cb_map_interpolation.isChecked(),
+                "ed_map_cell_width": self.check_numeric_input(self.ed_map_cell_width),
+                "ed_map_cell_height": self.check_numeric_input(self.ed_map_cell_height),
+                "cb_map_top_bottom": self.cb_map_top_bottom.isChecked(),
+                "cb_map_edges": self.cb_map_edges.isChecked(),
+                "ed_map_secondary_velocity": self.check_numeric_input(
+                    self.ed_map_secondary_velocity
+                ),
+                "cb_map_bed_profiles": self.cb_map_bed_profiles.isChecked(),
+                "combo_map_data": self.combo_map_data.currentText(),
+            }
+
+            # MAP table
+            self.map_table()
+
+            # MAP figures
+            self.map_shiptrack()
+            self.map_wt_contour()
+
+            self.canvases = [self.map_shiptrack_canvas, self.map_wt_contour_canvas]
+            self.figs = [self.map_shiptrack_fig, self.map_wt_contour_fig]
+            self.fig_calls = [self.map_shiptrack, self.map_wt_contour]
+            self.toolbars = [self.map_shiptrack_toolbar, self.map_wt_contour_toolbar]
+            self.ui_parents = [i.parent() for i in self.canvases]
+            self.figs_menu_connection()
+
+            if not self.map_initialized:
+                # Configure dictionary of plot options
+                self.map_current_settings = self.map_settings
+                self.pb_map_apply.clicked.connect(self.update_map)
+                self.pb_map_save.clicked.connect(self.map_save_data)
+                self.pb_map_open_earth.clicked.connect(self.plot_map_google_earth)
+                self.map_initialized = True
+
+    def update_map(self):
+        """Updates MAP with user's parameters."""
+
+        # Load MAP parameters and check if there is any change
+        with self.wait_cursor():
+            change_data = False
+            change_plot = False
+            self.map_settings = {
+                "cb_map_interpolation": self.cb_map_interpolation.isChecked(),
+                "ed_map_cell_width": self.check_numeric_input(self.ed_map_cell_width),
+                "ed_map_cell_height": self.check_numeric_input(self.ed_map_cell_height),
+                "cb_map_top_bottom": self.cb_map_top_bottom.isChecked(),
+                "cb_map_edges": self.cb_map_edges.isChecked(),
+                "ed_map_secondary_velocity": self.check_numeric_input(
+                    self.ed_map_secondary_velocity
+                ),
+                "cb_map_bed_profiles": self.cb_map_bed_profiles.isChecked(),
+                "combo_map_data": self.combo_map_data.currentText(),
+            }
+            for key in self.map_settings:
+                if self.map_settings[key] != self.map_current_settings[key]:
+                    if key in [
+                        "cb_map_interpolation",
+                        "ed_map_cell_width",
+                        "ed_map_cell_height",
+                        "cb_map_top_bottom",
+                        "cb_map_edges",
+                    ]:
+                        change_data = True
+                        change_plot = True
+                        break
+                    else:
+                        change_plot = True
+
+            # Save current parameters
+            self.map_current_settings = self.map_settings
+
+            # Apply changes
+            if change_data or change_plot:
+                if change_data:
+                    self.meas.compute_map(
+                        node_horizontal_user=self.map_settings["ed_map_cell_width"],
+                        node_vertical_user=self.map_settings["ed_map_cell_height"],
+                        extrap_option=self.map_settings["cb_map_top_bottom"],
+                        edges_option=self.map_settings["cb_map_edges"],
+                        interp_option=self.map_settings["cb_map_interpolation"],
+                    )
+                self.map_table(update=True)
+                self.map_wt_contour()
+                self.map_shiptrack()
+
+                self.figs = [self.map_shiptrack_fig, self.map_wt_contour_fig]
+                self.fig_calls = [self.map_shiptrack, self.map_wt_contour]
+
+                # Reset data cursor to work with new figure
+                if self.actionData_Cursor.isChecked():
+                    self.data_cursor()
+
+    def map_table(self, update=False):
+        """Create and populate MAP results table."""
+        # Setup table
+        n_transects = len(self.meas.transects)
+        tbl = self.table_map_results
+        if not update:
+            map_header = [self.tr("MAP"), self.tr("Meas."), self.tr("Delta (%)")]
+            map_rows = [
+                self.tr("Total Q ") + self.tr(self.units["label_Q"]),
+                self.tr("Q/A ") + self.tr(self.units["label_V"]),
+                self.tr("Mean depth ") + self.tr(self.units["label_L"]),
+                self.tr("Width ") + self.tr(self.units["label_L"]),
+            ]
+            tbl.setRowCount(0)
+            ncols = len(map_header)
+            nrows = len(map_rows)
+            tbl.setRowCount(nrows)
+            tbl.setColumnCount(ncols)
+
+            # tbl.horizontalHeader().hide()
+            tbl.setHorizontalHeaderLabels(map_header)
+            tbl.horizontalHeader().setFont(self.font_bold)
+            tbl.setVerticalHeaderLabels(map_rows)
+            tbl.verticalHeader().setFont(self.font_bold)
+
+            header = tbl.horizontalHeader()
+            header.setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
+            col_header = tbl.verticalHeader()
+            col_header.setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
+
+        if len(self.checked_transects_idx) > 0 and \
+                self.meas.map.total_discharge is not None:
+            trans_prop = Measurement.compute_measurement_properties(self.meas)
+
+            row = 0
+            # MAP Q
+            col = 0
+            map_q = self.meas.map.total_discharge
+            if np.isnan(map_q):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(self.q_digits(map_q * self.units["Q"]))
+                    ),
+                )
+            # Meas Q
+            col += 1
+            discharge = Measurement.mean_discharges(self.meas)
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:8}".format(
+                        self.q_digits(discharge["total_mean"] * self.units["Q"])
+                    )
+                ),
+            )
+            # Delta Q
+            col += 1
+            if discharge["total_mean"] != 0:
+                per_diff = (
+                    100 * (map_q - discharge["total_mean"]) / discharge["total_mean"]
+                )
+            else:
+                per_diff = np.nan
+            if np.isnan(per_diff):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row, col, QtWidgets.QTableWidgetItem("{:7.1f}".format(per_diff))
+                )
+
+            row += 1
+            # MAP mean v
+            col = 0
+            map_area = np.nansum(self.meas.map.cells_area)
+            map_v = map_q / map_area * self.units["V"]
+            if np.isnan(map_v):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem("{:8}".format(self.q_digits(map_v))),
+                )
+            # Meas. mean v
+            col += 1
+            meas_v = trans_prop["avg_water_speed"][n_transects] * self.units["V"]
+            if np.isnan(meas_v):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem("{:8}".format(self.q_digits(meas_v))),
+                )
+            # Delta v
+            col += 1
+            if meas_v != 0:
+                per_diff = 100 * (map_v - meas_v) / meas_v
+            else:
+                per_diff = np.nan
+            if np.isnan(per_diff):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row, col, QtWidgets.QTableWidgetItem("{:7.1f}".format(per_diff))
+                )
+
+            row += 1
+            # MAP mean depth
+            col = 0
+            map_d = np.nanmean(self.meas.map.depths)
+            if np.isnan(map_d):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(self.q_digits(map_d * self.units["L"]))
+                    ),
+                )
+            # Meas. mean depth
+            col += 1
+            depth_meas = []
+            for id_transect in self.checked_transects_idx:
+                transect = self.meas.transects[id_transect]
+                depth_meas.append(transect.depths.bt_depths.depth_processed_m)
+            every_depth = np.array(
+                [item for subarray in depth_meas for item in subarray]
+            )
+            meas_d = np.nanmean(every_depth)
+            if np.isnan(meas_d):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(self.q_digits(meas_d * self.units["L"]))
+                    ),
+                )
+            # Delta mean depth
+            col += 1
+            if meas_d != 0:
+                per_diff = 100 * (map_d - meas_d) / meas_d
+            else:
+                per_diff = np.nan
+            if np.isnan(per_diff):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row, col, QtWidgets.QTableWidgetItem("{:7.1f}".format(per_diff))
+                )
+
+            row += 1
+            # MAP width
+            col = 0
+            map_width = self.meas.map.borders_ens[-1]
+            if np.isnan(map_width):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem("{:8}".format(self.q_digits(map_width))),
+                )
+            # Meas. width
+            col += 1
+            meas_width = trans_prop["width"][n_transects] * self.units["L"]
+            if np.isnan(meas_width):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row,
+                    col,
+                    QtWidgets.QTableWidgetItem(
+                        "{:8}".format(self.q_digits(meas_width))
+                    ),
+                )
+            # Delta mean depth
+            col += 1
+            if meas_width != 0:
+                per_diff = 100 * (map_width - meas_width) / meas_width
+            else:
+                per_diff = np.nan
+            if np.isnan(per_diff):
+                tbl.setItem(row, col, QtWidgets.QTableWidgetItem("N/A"))
+            else:
+                tbl.setItem(
+                    row, col, QtWidgets.QTableWidgetItem("{:7.1f}".format(per_diff))
+                )
+
+            tbl.item(0, 0).setFont(self.font_bold)
+            tbl.item(1, 0).setFont(self.font_bold)
+            tbl.item(2, 0).setFont(self.font_bold)
+            tbl.item(3, 0).setFont(self.font_bold)
+
+    def map_wt_contour(self):
+        """Creates water track profile on MAP data."""
+
+        # If the canvas has not been previously created, create the canvas and add the widget.
+        if self.map_wt_contour_canvas is None:
+            # Create the canvas
+            self.map_wt_contour_canvas = MplCanvas(
+                parent=self.graphics_map_wt_contour, width=12, height=6, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graphics_map_wt_contour)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.map_wt_contour_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.map_wt_contour_toolbar = NavigationToolbar(
+                self.map_wt_contour_canvas, self
+            )
+            self.map_wt_contour_toolbar.hide()
+
+        # Initialize the boat speed figure and assign to the canvas
+        self.map_wt_contour_fig = WTContour(canvas=self.map_wt_contour_canvas)
+
+        # Quiver parameters
+        if self.map_settings["combo_map_data"] == "Primary velocity":
+            vy = self.meas.map.secondary_velocity
+            quiver_label = "Secondary velocity"
+        else:
+            vy = self.meas.map.transverse_velocity
+            quiver_label = "Transverse velocity"
+        data_quiver = {
+            "x": self.meas.map.distance_cells_center,
+            "z": self.meas.map.depth_cells_center,
+            "vy": vy,
+            "vz": self.meas.map.vertical_velocity,
+            "scale": self.map_settings["ed_map_secondary_velocity"],
+            "label": quiver_label,
+        }
+
+        # Bed profiles of transects
+        if self.map_settings["cb_map_bed_profiles"]:
+            bed_profiles = {
+                "x": self.meas.map.acs_distance,
+                "depth": self.meas.map.depth_by_transect,
+            }
+        else:
+            bed_profiles = None
+
+        self.map_wt_contour_fig.create(
+            transect=self.meas.map,
+            units=self.units,
+            data_type=self.map_settings["combo_map_data"],
+            data_quiver=data_quiver,
+            bed_profiles=bed_profiles,
+            color_map=self.color_map,
+            x_axis_type="MAP",
+        )
+        self.map_wt_contour_fig.fig.subplots_adjust(
+            left=0.08, bottom=0.1, right=1.05, top=0.97, wspace=0.02, hspace=0
+        )
+        # Draw canvas
+        self.map_wt_contour_canvas.draw()
+
+    def map_shiptrack(self):
+        """Creates shiptrack plot for MAP cross-section and transects' track."""
+
+        # If the canvas has not been previously created, create the canvas and add the widget.
+        if self.map_shiptrack_canvas is None:
+            # Create the canvas
+            self.map_shiptrack_canvas = MplCanvas(
+                parent=self.graphics_map_track, width=4, height=3, dpi=80
+            )
+            # Assign layout to widget to allow auto scaling
+            layout = QtWidgets.QVBoxLayout(self.graphics_map_track)
+            # Adjust margins of layout to maximize graphic area
+            layout.setContentsMargins(1, 1, 1, 1)
+            # Add the canvas
+            layout.addWidget(self.map_shiptrack_canvas)
+            # Initialize hidden toolbar for use by graphics controls
+            self.map_shiptrack_toolbar = NavigationToolbar(
+                self.map_shiptrack_canvas, self
+            )
+            self.map_shiptrack_toolbar.hide()
+
+        # Initialize the shiptrack figure and assign to the canvas
+        self.map_shiptrack_fig = Maptrack(canvas=self.map_shiptrack_canvas)
+        # Create the figure with the specified data
+        settings = Measurement.current_settings(self.meas)
+        self.map_shiptrack_fig.create(
+            map_data=self.meas.map, units=self.units, nav_ref=settings["NavRef"]
+        )
+
+        # Draw canvas
+        self.map_shiptrack_canvas.draw()
+
+    def map_save_data(self):
+        """Save MAP data as csv or txt."""
+        map_data = self.meas.map
+        if map_data is not None and map_data.total_discharge is not None:
+            row, col = map_data.primary_velocity.shape
+            ens_mid = (map_data.borders_ens[1:] + map_data.borders_ens[:-1]) * 0.5
+            data = {
+                "Distance (Left bank) "
+                + self.units["label_L"]: np.repeat(ens_mid, row) * self.units["L"],
+                "Primary velocity "
+                + self.units["label_V"]: map_data.primary_velocity.ravel(order="F")
+                * self.units["V"],
+                "Secondary velocity "
+                + self.units["label_V"]: map_data.secondary_velocity.ravel(order="F")
+                * self.units["V"],
+                "Streamwise velocity "
+                + self.units["label_V"]: map_data.streamwise_velocity.ravel(order="F")
+                * self.units["V"],
+                "Transverse velocity (Left to Right) "
+                + self.units["label_V"]: map_data.transverse_velocity.ravel(order="F")
+                * self.units["V"],
+                "Vertical velocity "
+                + self.units["label_V"]: map_data.primary_velocity.ravel(order="F")
+                * self.units["V"],
+                "Depth "
+                + self.units["label_L"]: np.repeat(map_data.depths, row)
+                * self.units["L"],
+                "Cells discharge "
+                + self.units["label_Q"]: map_data.cells_discharge.ravel(order="F")
+                * self.units["Q"],
+                "Cells area "
+                + self.units["label_A"]: map_data.cells_area.ravel(order="F")
+                * self.units["A"],
+                "Distance cells center "
+                + self.units["label_L"]: map_data.distance_cells_center.ravel(order="F")
+                * self.units["L"],
+                "Depth cells center "
+                + self.units["label_L"]: map_data.depth_cells_center.ravel(order="F")
+                * self.units["L"],
+            }
+
+            df = pd.DataFrame(data)
+            df = df[df["Cells discharge " + self.units["label_Q"]].notna()]
+            save_map = SaveDialog(parent=self, save_type="MAP")
+            if len(save_map.full_Name) > 0:
+                try:
+                    if save_map.file_extension == ".csv":
+                        df.to_csv(save_map.full_Name, sep=";", index=False, header=True)
+                    elif save_map.file_extension == ".txt":
+                        df.to_csv(save_map.full_Name, sep=" ", index=False, header=True)
+                except Exception:
+                    self.popup_message(self.tr("Impossible to save MAP data."))
+
+    def plot_map_google_earth(self):
+        """Creates line plots of transects in Google Earth using GGA coordinates and MAP average ship track."""
+        kml = simplekml.Kml(open=1)
+        # Create a shiptrack for each checked transect
+        lat = np.nan
+        lon = np.nan
+        for transect_idx in self.checked_transects_idx:
+            lon = self.meas.transects[transect_idx].gps.gga_lon_ens_deg
+            lon = lon[np.logical_not(np.isnan(lon))]
+            lat = self.meas.transects[transect_idx].gps.gga_lat_ens_deg
+            lat = lat[np.logical_not(np.isnan(lat))]
+            line_name = self.meas.transects[transect_idx].file_name[:-4]
+            lon_lat = tuple(zip(lon, lat))
+            _ = kml.newlinestring(name=line_name, coords=lon_lat)
+
+        # Get utm zone
+        _, _, zone_number, zone_letter = utm.from_latlon(lat, lon)
+        # Define average ship track
+        left_x = np.nanmedian([item[0] for item in self.meas.map.x_raw_coordinates])
+        x_boundaries = [
+            min([min(x) for x in self.meas.map.x_projected]),
+            max([max(x) for x in self.meas.map.x_projected]),
+        ]
+
+        x_utm = np.array(
+            [
+                min(x_boundaries, key=lambda x: abs(x - left_x)),
+                max(x_boundaries, key=lambda x: abs(x - left_x)),
+            ]
+        )
+        y_utm = np.array(
+            [i * self.meas.map.slope + self.meas.map.intercept for i in x_utm]
+        )
+
+        lat, lon = utm.to_latlon(x_utm, y_utm, zone_number, zone_letter)
+        line_name = "MAP average ship track"
+        lon_lat = tuple(zip(lon, lat))
+        lin = kml.newlinestring(name=line_name, coords=lon_lat)
+        lin.style.linestyle.color = "ff0000ff"
+
+        fullname = os.path.join(
+            self.sticky_settings.get("Folder"),
+            datetime.today().strftime("MAP_%Y%m%d_%H%M%S_QRev.kml"),
+        )
+        kml.save(fullname)
+        try:
+            os.startfile(fullname)
+        except os.error:
+            self.popup_message(
+                text=self.tr(
+                    "Google Earth is not installed or is not associated with kml files."
+                )
+            )
+
+    # Graphics save
+    # =================
+    def figs_menu_connection(self):
+        """Connect ui to event filter for current figures."""
+        for fig in self.figs:
+            fig.canvas.parent().installEventFilter(self)
+
+    def eventFilter(self, source, event):
+        """Load events."""
+
+        if event.type() == QtCore.QEvent.ContextMenu:
+            if source in self.ui_parents:
+                self.current_fig = self.figs[self.ui_parents.index(source)]
+
+                # Determine axes of graph in which the click occured and save
+                # for use by change axes limits
+                extents = []
+                for ax in self.current_fig.fig.axes:
+                    extents.append(ax.bbox.extents)
+                extents = np.array(extents)
+                y_max = np.nanmax(extents[:, -1])
+                y_adjusted = y_max - event.y()
+                ax = np.where(
+                    np.logical_and(
+                        np.greater(event.x(), extents[:, 0]),
+                        np.less(y_adjusted, extents[:, 3]),
+                    )
+                )[0]
+                if len(ax) > 0:
+                    self.current_axis = self.current_fig.fig.axes[ax[-1]]
+
+                # Context menu
+                self.figsMenu.exec_(event.globalPos())
+                return True
+        return super().eventFilter(source, event)
+
+    def save_fig(self):
+        """Save selected figure."""
+        if self.current_fig is not None:
+            # Get the current folder setting.
+            save_fig = SaveDialog(parent=self, save_type="fig")
+            # Save figure in user format
+            if len(save_fig.full_Name) > 0:
+                self.current_fig.fig.savefig(
+                    save_fig.full_Name, dpi=300, bbox_inches="tight"
+                )
+
+    # Graphics controls
+    # =================
+    def clear_zphd(self):
+        """Clears the graphics user controls."""
+
+        try:
+            self.actionData_Cursor.setChecked(False)
+            for fig in self.figs:
+                fig.set_hover_connection(False)
+            if self.actionPan.isChecked():
+                self.actionPan.trigger()
+            if self.actionZoom.isChecked():
+                self.actionZoom.trigger()
+        except (AttributeError, SystemError):
+            pass
+
+    def data_cursor(self):
+        """Apply the data cursor."""
+
+        if self.actionData_Cursor.isChecked():
+            for fig in self.figs:
+                if self.actionPan.isChecked():
+                    self.actionPan.trigger()
+                if self.actionZoom.isChecked():
+                    self.actionZoom.trigger()
+                self.actionData_Cursor.setChecked(True)
+                if fig is not None:
+                    fig.set_hover_connection(True)
+        else:
+            for fig in self.figs:
+                fig.set_hover_connection(False)
+
+    def home(self):
+        """Reset graphics to default."""
+
+        for tb in self.toolbars:
+            tb.home()
+
+    def zoom(self):
+        """Zoom graphics using window."""
+
+        for tb in self.toolbars:
+            tb.zoom()
+        self.actionPan.setChecked(False)
+        self.actionData_Cursor.setChecked(False)
+        self.data_cursor()
+
+    def pan(self):
+        """Pan graph."""
+
+        for tb in self.toolbars:
+            tb.pan()
+        self.actionZoom.setChecked(False)
+        self.actionData_Cursor.setChecked(False)
+        self.data_cursor()
+
+    def change_x_axis(self):
+        """Manages the changing of the x axis type."""
+
+        with self.wait_cursor():
+            # Clear zoom, pan, home, data_cursor
+            self.clear_zphd()
+
+            # Determine the selected tab
+            tab_idx = self.current_tab
+
+            # Main tab
+            if tab_idx == "Main":
+                self.contour_shiptrack(self.checked_transects_idx[self.transect_row])
+
+            # Compass/PR tab
+            elif tab_idx == "Compass/P/R":
+                self.compass_plot()
+                self.pr_plot()
+
+            # Moving-bed test tab
+            elif tab_idx == "MovBedTst":
+                self.mb_plots(idx=self.mb_row)
+
+            # Bottom track tab
+            elif tab_idx == "BT":
+                self.bt_plots()
+
+            # GPS tab
+            elif tab_idx == "GPS":
+                self.gps_plots()
+
+            # Depth tab
+            elif tab_idx == "Depth":
+                self.depth_plots()
+
+            # Water track tab
+            elif tab_idx == "WT":
+                self.wt_plots()
+
+            # Edges tab
+            elif tab_idx == "Edges":
+                self.edges_graphics()
+
+            # Adv. Graph
+            elif tab_idx == "Adv. Graph":
+                self.adv_graph_tab()
+
+    def set_axes(self):
+        """Scales the selected graph to either user specifications of automatics
+        scaling.
+        """
+
+        scale = AxesScale()
+
+        # Get current axes limits
+        x_limits = self.current_axis.get_xlim()
+        y_limits = self.current_axis.get_ylim()
+
+        # Show limits in dialog
+        scale.ed_x_left.setText("%.2f" % x_limits[0])
+        scale.ed_x_right.setText("%.2f" % x_limits[1])
+        scale.ed_y_bottom.setText("%.2f" % y_limits[0])
+        scale.ed_y_top.setText("%.2f" % y_limits[1])
+
+        rsp = scale.exec_()
+
+        with self.wait_cursor():
+            # Apply settings from options window
+            if rsp == QtWidgets.QDialog.Accepted:
+                if scale.cb_axes_auto.isChecked():
+                    # If automatic is selected the original method that created the graph
+                    # is identified and called. However, if that method cannot be
+                    # identified or it requires extra arguments then the plot is
+                    # rescaled using the data available from the plot axes. The
+                    # reason the original plot method has priority is that for some
+                    # graphs the tick scaling is customized.
+                    try:
+                        self.fig_calls[self.figs.index(self.current_fig)]()
+                    except:
+                        # Rescale the plot using data from the plot
+                        ydata = np.array([])
+                        xdata = np.array([])
+                        for line in self.current_axis.lines:
+                            ydata = np.hstack((ydata, line.get_ydata()))
+                            xdata = np.hstack((xdata, line.get_xdata()))
+                        ydata_max = np.nanmax(ydata) * 1.02
+                        ydata_min = 0 - np.nanmax(ydata) * 0.02
+                        xdata_max = np.nanmax(xdata) * 1.02
+                        xdata_min = 0 - np.nanmax(xdata) * 0.02
+
+                        if np.isnan(ydata_max):
+                            ydata_max = 1
+                            ydata_min = 0
+                        if np.isnan(xdata_max):
+                            xdata_max = 1
+                            xdata_min = 0
+
+                        if x_limits[0] < x_limits[1]:
+                            new_x_limits = [xdata_min, xdata_max]
+                        else:
+                            new_x_limits = [xdata_max, xdata_min]
+
+                        if y_limits[0] < y_limits[1]:
+                            new_y_limits = [ydata_min, ydata_max]
+                        else:
+                            new_y_limits = [ydata_max, ydata_min]
+                else:
+                    x_left = self.check_numeric_input(scale.ed_x_left, block=False)
+                    x_right = self.check_numeric_input(scale.ed_x_right, block=False)
+                    y_bottom = self.check_numeric_input(scale.ed_y_bottom, block=False)
+                    y_top = self.check_numeric_input(scale.ed_y_top, block=False)
+                    new_x_limits = [x_left, x_right]
+                    new_y_limits = [y_bottom, y_top]
+
+                # Set new limits
+                if not any(new_x_limits) is None and not any(new_y_limits) is None:
+                    self.current_axis.set_xlim(left=x_left, right=x_right)
+                    self.current_axis.set_ylim(bottom=y_bottom, top=y_top)
+                    self.current_axis.yaxis.set_major_locator(AutoLocator())
+                    self.current_fig.canvas.draw()
+
+    def x_axis_time(self):
+        """Changes the x-axis type to time"""
+        if self.current_tab == "Edges":
+            self.edges_axis_type = "T"
+        self.x_axis_type = "T"
+        self.change_x_axis()
+
+    def x_axis_ensemble(self):
+        """Changes the x-axis type to ensembles"""
+        if self.current_tab == "Edges":
+            self.edges_axis_type = "E"
+        self.x_axis_type = "E"
+        self.change_x_axis()
+
+    def x_axis_length(self):
+        """Changes the x-axis type to length"""
+
+        if self.current_tab == "Edges":
+            self.edges_axis_type = "L"
+        self.x_axis_type = "L"
+        self.change_x_axis()
+
+    def set_show_below_sl(self):
+        """Sets toggle to allow data below the side lobe to be shown."""
+
+        if self.show_below_sl:
+            self.show_below_sl = False
+        else:
+            self.show_below_sl = True
+
+        self.adv_graph_plots()
+
+    def show_extrapolated(self):
+
+        if not self.plot_extrapolated:
+            self.plot_extrapolated = True
+            self.actionShow_Extrapolated.setChecked(True)
+        else:
+            self.plot_extrapolated = False
+            self.actionShow_Extrapolated.setChecked(False)
+
+        with self.wait_cursor():
+            # Clear zoom, pan, home, data_cursor
+            self.clear_zphd()
+
+            # Determine the selected tab
+            tab_idx = self.current_tab
+
+            # Main tab
+            if tab_idx == "Main":
+                self.main_wt_contour(
+                    transect_id=self.checked_transects_idx[self.transect_row]
+                )
+            elif tab_idx == "WT":
+                self.wt_plots()
+            elif tab_idx == "Adv. Graph":
+                self.adv_graph_tab()
+
+    # Split functions
+    # ==============
+    def split_initialization(self, groupings=None, data=None):
+        """Sets the GUI components to support semi-automatic processing of pairings
+        that split a single measurement into multiple measurements.
+        Loads the first pairing.
+
+        Parameters
+        ==========
+        groupings: list
+            This a list of lists of transect indices splitting a single measurement
+            into multiple measurements Example groupings = [[0, 1], [2, 3, 4, 5], [8, 9]]
+        data: Measurement
+            Object of class Measurement which contains all of the transects to be
+            grouped into multiple measurements
+        """
+
+        if groupings is not None:
+            # GUI settings to allow processing to split measurement into
+            # multiple measurements
+            self.save_all = False
+            self.actionOpen.setEnabled(False)
+            self.actionCheck.setEnabled(False)
+            self.actionSave.setEnabled(True)
+            self.actionComment.setEnabled(True)
+            self.actionBT.setDisabled(True)
+            self.actionGGA.setDisabled(True)
+            self.actionVTG.setDisabled(True)
+            self.actionOFF.setDisabled(True)
+            self.actionON.setDisabled(True)
+            self.actionOptions.setDisabled(True)
+            self.actionGoogle_Earth.setDisabled(True)
+            self.actionShow_Extrapolated.setEnabled(True)
+
+            # Data settings
+            self.meas = data
+            self.groupings = groupings
+            self.checked_transects_idx = Measurement.checked_transects(self.meas)
+            self.h_external_valid = Measurement.h_external_valid(self.meas)
+            self.transect_row = 0
+
+            # Process first pairing
+            self.group_idx = 0
+            self.checked_transects_idx = self.groupings[self.group_idx]
+            self.split_processing(self.checked_transects_idx)
+
+    def split_processing(self, group):
+        """Creates the measurement based on the transect indices defined in
+        group and updates the main tab with this new measurement data.
+
+        Parameters
+        ==========
+        group: list
+            List of transect indices that comprise a single measurement.
+        """
+
+        Measurement.selected_transects_changed(self.meas, selected_transects_idx=group)
+
+        if self.group_idx > 0:
+            # Activate main, Summary, and Messages tabs
+            self.tab_all.setCurrentIndex(0)
+            self.tab_summary.setCurrentIndex(0)
+            self.tab_mc.setCurrentIndex(0)
+            self.transect_row = 0
+
+            # Set the change status to True for the main window update
+            self.change = True
+
+        self.update_main()
+
+    def split_save(self):
+        """Saves the current measurement and automatically loads the next
+        measurement based on the pairings. When the last pairing has been completed,
+        returns control to the function initiating QRev.
+        """
+
+        # Initialize dialog
+        rating_dialog = Rating(self)
+        rating_dialog.uncertainty_value.setText(
+            "{:4.1f}".format(self.meas.uncertainty.total_95_user)
+        )
+        if self.meas.uncertainty.total_95_user < 3:
+            rating_dialog.rb_excellent.setChecked(True)
+        elif self.meas.uncertainty.total_95_user < 5.01:
+            rating_dialog.rb_good.setChecked(True)
+        elif self.meas.uncertainty.total_95_user < 8.01:
+            rating_dialog.rb_fair.setChecked(True)
+        else:
+            rating_dialog.rb_poor.setChecked(True)
+        rating_entered = rating_dialog.exec_()
+
+        # If data entered.
+        with self.wait_cursor():
+            if rating_entered:
+                if rating_dialog.rb_excellent.isChecked():
+                    rating = "Excellent"
+                elif rating_dialog.rb_good.isChecked():
+                    rating = "Good"
+                elif rating_dialog.rb_fair.isChecked():
+                    rating = "Fair"
+                else:
+                    rating = "Poor"
+
+        # Create default file name
+        if rating_entered:
+            self.meas.user_rating = rating
+
+            group = str(self.group_idx + 1)
+
+            save_file = SaveDialog(group=group, parent=self)
+
+            if len(save_file.full_Name) > 0:
+
+                # Save data in Matlab format
+                if self.save_all:
+                    Python2Matlab.save_matlab_file(
+                        self.meas, save_file.full_Name, self.QRev_version
+                    )
+                else:
+                    Python2Matlab.save_matlab_file(
+                        self.meas,
+                        save_file.full_Name,
+                        self.QRev_version,
+                        checked=self.groupings[self.group_idx],
+                    )
+
+                # Save xml file
+                self.meas.xml_output(
+                    self.QRev_version, save_file.full_Name[:-4] + ".xml"
+                )
+
+                # Notify user when save complete
+                QtWidgets.QMessageBox.about(
+                    self,
+                    "Save",
+                    "Group "
+                    + group
+                    + " of "
+                    + str(len(self.groupings))
+                    + "\n Files (*_QRev.mat and "
+                    "*_QRev.xml) have been saved.",
+                )
+
+                # Create a summary of the processed discharges
+                discharge = Measurement.mean_discharges(self.meas)
+                q = {
+                    "group": self.groupings[self.group_idx],
+                    "start_serial_time": self.meas.transects[
+                        self.groupings[self.group_idx][0]
+                    ].date_time.start_serial_time,
+                    "end_serial_time": self.meas.transects[
+                        self.groupings[self.group_idx][-1]
+                    ].date_time.end_serial_time,
+                    "processed_discharge": discharge["total_mean"],
+                    "rating": rating,
+                    "xml_file": save_file.full_Name[:-4] + ".xml",
+                }
+                self.processed_data.append(q)
+
+                # Create summary of all processed transects
+                for idx in self.groupings[self.group_idx]:
+                    q_trans = {
+                        "transect_id": idx,
+                        "transect_file": self.meas.transects[idx].file_name[:-4],
+                        "start_serial_time": self.meas.transects[
+                            idx
+                        ].date_time.start_serial_time,
+                        "end_serial_time": self.meas.transects[
+                            idx
+                        ].date_time.end_serial_time,
+                        "duration": self.meas.transects[
+                            idx
+                        ].date_time.transect_duration_sec,
+                        "processed_discharge": self.meas.discharge[idx].total,
+                    }
+                    self.processed_transects.append(q_trans)
+
+                # Load next pairing
+                self.group_idx += 1
+
+                # If all pairings have been processed return control to the
+                # function initiating QRev.
+                if self.group_idx > len(self.groupings) - 1:
+                    self.caller.processed_meas = self.processed_data
+                    self.caller.processed_transects = self.processed_transects
+                    self.caller.Show_RIVRS()
+                    self.close()
+
+                else:
+                    self.checked_transects_idx = self.groupings[self.group_idx]
+                    self.split_processing(self.checked_transects_idx)
+
+    # Support functions
+    # =================
+    def q_qa_message(
+        self,
+        qa_data,
+        cat_idx,
+        transect_id,
+        total_threshold_warning,
+        total_threshold_caution,
+        run_threshold_warning,
+        run_threshold_caution,
+    ):
+        """Creates QA message for tooltips."""
+
+        text = []
+        if cat_idx == 0:
+            if qa_data["all_invalid"][transect_id]:
+                text.append("No valid data. \n")
+
+        try:
+            qa_check = qa_data["q_total_warning"][transect_id, cat_idx]
+        except IndexError:
+            qa_check = qa_data["q_total_warning"][transect_id]
+
+        if qa_check:
+            text.append(
+                self.tr(
+                    "Interpolated Q for invalid cells and ensembles in a transect exceeds "
+                )
+                + "%3.0f" % total_threshold_warning
+                + "%;\n"
+            )
+
+        try:
+            qa_check = qa_data["q_max_run_warning"][transect_id, cat_idx]
+        except IndexError:
+            qa_check = qa_data["q_max_run_warning"][transect_id]
+
+        if qa_check:
+            text.append(
+                self.tr("Interpolated Q for consecutive invalid ensembles exceeds ")
+                + "%3.0f" % run_threshold_warning
+                + "%;\n"
+            )
+
+        try:
+            qa_check = qa_data["q_total_caution"][transect_id, cat_idx]
+        except IndexError:
+            qa_check = qa_data["q_total_caution"][transect_id]
+
+        if qa_check:
+            text.append(
+                self.tr(
+                    "Interpolated Q for invalid cells and ensembles in a transect exceeds "
+                )
+                + "%3.0f" % total_threshold_caution
+                + "%;\n"
+            )
+
+        try:
+            qa_check = qa_data["q_max_run_caution"][transect_id, cat_idx]
+        except IndexError:
+            qa_check = qa_data["q_max_run_caution"][transect_id]
+
+        if qa_check:
+            text.append(
+                self.tr("Interpolated Q for consecutive invalid ensembles exceeds ")
+                + "%3.0f" % run_threshold_caution
+                + "%;\n"
+            )
+        return text
+
+    @staticmethod
+    def popup_message(text):
+        """Display a message box with messages specified in text.
+
+        Parameters
+        ----------
+        text: str
+            Message to be displayed.
+        """
+
+        msg = QtWidgets.QMessageBox()
+        msg.setIcon(QtWidgets.QMessageBox.Critical)
+        msg.setText("Error")
+        msg.setInformativeText(text)
+        msg.setWindowTitle("Error")
+        msg.exec_()
+        return
+
+    def keyPressEvent(self, e):
+        """Implements shortcut keys.
+
+        Parameters
+        ----------
+        e: event
+            Event generated by key pressed by user
+        """
+
+        # Help
+        if e.key() == QtCore.Qt.Key_F1:
+            self.help()
+
+        # Change displayed transect
+        if self.current_tab != "MovBedTst" and self.current_tab != "SysTest":
+
+            # Select transect above in table or wrap to bottom
+            if e.key() == QtCore.Qt.Key_Up:
+                if self.transect_row - 1 < 0:
+                    self.transect_row = len(self.checked_transects_idx) - 1
+                else:
+                    self.transect_row -= 1
+                self.change = True
+                self.change_selected_transect()
+
+            # Select transect below in table or wrap to top
+            elif e.key() == QtCore.Qt.Key_Down:
+                if self.transect_row + 1 > len(self.checked_transects_idx) - 1:
+                    self.transect_row = 0
+                else:
+                    self.transect_row += 1
+                self.change = True
+                self.change_selected_transect()
+
+        # Change displayed moving-bed test
+        elif self.current_tab == "MovBedTst":
+            # Select transect above in table or wrap to bottom
+            if e.key() == QtCore.Qt.Key_Up:
+                if self.mb_row - 1 < 0:
+                    self.mb_row = len(self.meas.mb_tests) - 1
+                else:
+                    self.mb_row -= 1
+
+            # Select transect below in table or wrap to top
+            elif e.key() == QtCore.Qt.Key_Down:
+                if self.mb_row + 1 > len(self.meas.mb_tests) - 1:
+                    self.mb_row = 0
+                else:
+                    self.mb_row += 1
+
+            self.mb_table_clicked(self.mb_row, 3)
+
+        # Turn on or off display of alternate method medians to allow comparison
+        if self.current_tab == "Extrap":
+            # Turn on comparison medians
+            if e.key() == QtCore.Qt.Key_F8:
+                self.compare_medians()
+            # Turn off comparison medians
+            if e.key() == QtCore.Qt.Key_F9:
+                self.extrap_plot()
+
+    def change_selected_transect(self):
+        """Coordinates changing the displayed transect when changing
+        transects with the up/down arrow keys.
+        """
+
+        tab_idx = self.tab_all.tabText(self.tab_all.currentIndex())
+        col = 0
+
+        # Main tab
+        if tab_idx == "Main":
+            self.select_transect(self.transect_row + 1, col)
+
+        # Compass/PR tab
+        elif tab_idx == "Compass/P/R":
+            self.compass_table_clicked(self.transect_row, col)
+
+        # Bottom track tab
+        elif tab_idx == "BT":
+            self.bt_table_clicked(self.transect_row, col)
+
+        # GPS tab
+        elif tab_idx == "GPS":
+            self.gps_table_clicked(self.transect_row, col)
+
+        # Depth tab
+        elif tab_idx == "Depth":
+            self.depth_table_clicked(self.transect_row, col)
+
+        # Water track tab
+        elif tab_idx == "WT":
+            self.wt_table_clicked(self.transect_row, col)
+
+        # Edges tab
+        elif tab_idx == "Edges":
+            self.edges_table_clicked(self.transect_row, col)
+
+    @staticmethod
+    def check_numeric_input(obj, block=True):
+        """Check if input is a numeric object.
+
+        Parameters
+        ----------
+        obj: QtWidget
+            QtWidget user edit box.
+        block: bool
+            Block signals
+
+        Returns
+        -------
+        out: float
+            obj converted to float if possible
+
+        """
+        if block:
+            obj.blockSignals(True)
+        out = None
+        if len(obj.text()) > 0:
+            # Try to convert obj to a float
+            try:
+                text = obj.text()
+                out = float(text)
+            # If conversion is not successful warn user that the input is
+            # invalid.
+            except ValueError:
+                obj.setText("")
+                msg = QtWidgets.QMessageBox()
+                msg.setIcon(QtWidgets.QMessageBox.Critical)
+                msg.setText("Error")
+                msg.setInformativeText(
+                    "You have entered non-numeric text. Enter a numeric " "value."
+                )
+                msg.setWindowTitle("Error")
+                msg.exec_()
+        if block:
+            obj.blockSignals(False)
+        return out
+
+    @contextmanager
+    def wait_cursor(self):
+        """Provide a busy cursor to the user while the code is processing."""
+
+        try:
+            QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+            yield
+        finally:
+            QtWidgets.QApplication.restoreOverrideCursor()
+
+    def tab_manager(self, tab_idx=None, old_discharge=None, subtab_idx=None):
+        """Manages the initialization of content for each tab and updates that
+         information as necessary.
+
+        Parameters
+        ----------
+        tab_idx: int
+            Index of tab clicked by user
+        old_discharge: list
+            List of QComp objects contain the discharge prior to most recent
+            change
+        subtab_idx: int
+            Index of subtab of tab_summary, used to force tab_idx to main,
+            discharge
+        subtab_idx: int
+            Index of subtab of tab_summary, used to force tab_idx to main, discharge
+        """
+
+        # Clear zoom, pan, home, data_cursor
+        self.clear_zphd()
+
+        # Determine the selected tab
+        if tab_idx is None:
+            tab_idx = self.current_tab
+        else:
+            tab_idx = self.tab_all.tabText(tab_idx)
+
+        self.current_tab = tab_idx
+
+        # Main tab
+        if tab_idx == "Main":
+
+            if subtab_idx is not None:
+                self.tab_summary.setCurrentIndex(0)
+
+            if self.change:
+                # If data has changed update main tab display
+                self.update_main()
+            else:
+                # Setup list for use by graphics controls
+                if self.run_oursin:
+                    self.canvases = [
+                        self.main_shiptrack_canvas,
+                        self.main_wt_contour_canvas,
+                        self.main_extrap_canvas,
+                        self.main_discharge_canvas,
+                        self.uncertainty_lollipop_canvas,
+                    ]
+                    self.figs = [
+                        self.main_shiptrack_fig,
+                        self.main_wt_contour_fig,
+                        self.main_extrap_fig,
+                        self.main_discharge_fig,
+                        self.uncertainty_lollipop_fig,
+                    ]
+                    self.fig_calls = [
+                        self.main_shiptrack,
+                        self.main_wt_contour,
+                        self.main_extrap_plot,
+                        self.discharge_plot,
+                        self.main_uncertainty_plot,
+                    ]
+                    self.toolbars = [
+                        self.main_shiptrack_toolbar,
+                        self.main_wt_contour_toolbar,
+                        self.main_extrap_toolbar,
+                        self.main_discharge_toolbar,
+                        self.uncertainty_lollipop_toolbar,
+                    ]
+                else:
+                    self.canvases = [
+                        self.main_shiptrack_canvas,
+                        self.main_wt_contour_canvas,
+                        self.main_extrap_canvas,
+                        self.main_discharge_canvas,
+                    ]
+                    self.figs = [
+                        self.main_shiptrack_fig,
+                        self.main_wt_contour_fig,
+                        self.main_extrap_fig,
+                        self.main_discharge_fig,
+                    ]
+                    self.fig_calls = [
+                        self.main_shiptrack,
+                        self.main_wt_contour,
+                        self.main_extrap_plot,
+                        self.discharge_plot,
+                    ]
+                    self.toolbars = [
+                        self.main_shiptrack_toolbar,
+                        self.main_wt_contour_toolbar,
+                        self.main_extrap_toolbar,
+                        self.main_discharge_toolbar,
+                    ]
+                self.ui_parents = [i.parent() for i in self.canvases]
+                self.tab_main.show()
+
+        # System tab
+        elif tab_idx == "SysTest":
+            self.system_tab()
+
+        # Compass/PR tab
+        elif tab_idx == "Compass/P/R":
+            self.compass_tab(old_discharge=old_discharge)
+
+        # Temp/Sal tab
+        elif tab_idx == "Temp/Sal":
+            self.tempsal_tab(old_discharge=old_discharge)
+
+        # Moving-bed test tab
+        elif tab_idx == "MovBedTst":
+            self.movbedtst_tab()
+
+        # Bottom track tab
+        elif tab_idx == "BT":
+            self.bt_tab(old_discharge=old_discharge)
+
+        # GPS tab
+        elif tab_idx == "GPS":
+            self.gps_tab(old_discharge=old_discharge)
+
+        # Depth tab
+        elif tab_idx == "Depth":
+            self.depth_tab(old_discharge=old_discharge)
+
+        # Water track tab
+        elif tab_idx == "WT":
+            self.wt_tab(old_discharge=old_discharge)
+
+        # Extrapolation tab
+        elif tab_idx == "Extrap":
+            self.extrap_tab()
+
+        # Edges tab
+        elif tab_idx == "Edges":
+            self.edges_axis_type = "E"
+            self.edges_tab()
+
+        # Uncertainty tab
+        elif tab_idx == "Uncertainty":
+            self.uncertainty_tab()
+
+        # EDI tab
+        elif tab_idx == "EDI":
+            self.edi_tab()
+
+        # Adv. Graph tab
+        elif tab_idx == "Adv. Graph":
+            self.adv_graph_tab()
+
+        # MAP tab
+        elif tab_idx == "MAP":
+            self.map_tab()
+
+        self.set_tab_color()
+
+        # Toggle window to fix sizing when BT or WT tabs are chosen to prevent
+        # full screen window from going behind the taskbar.
+        # if self.isMaximized() or self.isFullScreen():
+        #     self.showNormal()
+        #     self.showMaximized()
+
+    def update_comments(self, tab_idx=None):
+        """Manages the initialization of content for each tab and updates that
+        information as necessary.
+
+        Parameters
+        ----------
+        tab_idx: int
+            Index of tab clicked by user
+        """
+
+        # Determine selected tab
+        if tab_idx is None:
+            tab_idx = self.current_tab
+        else:
+            self.current_tab = tab_idx
+
+        # Main
+        if tab_idx == "Main":
+            self.comments_tab()
+
+        # System Test
+        elif tab_idx == "SysTest":
+            self.systest_comments_messages()
+
+        # Compass/PR
+        elif tab_idx == "Compass/P/R":
+            self.compass_comments_messages()
+
+        # Temp/Sal
+        elif tab_idx == "Temp/Sal":
+            self.tempsal_comments_messages()
+
+        # Moving-bed test
+        elif tab_idx == "MovBedTst":
+            self.mb_comments_messages()
+
+        # Bottom track
+        elif tab_idx == "BT":
+            self.bt_comments_messages()
+
+        # GPS
+        elif tab_idx == "GPS":
+            self.gps_comments_messages()
+
+        # Depth
+        elif tab_idx == "Depth":
+            self.depth_comments_messages()
+
+        # WT
+        elif tab_idx == "WT":
+            self.wt_comments_messages()
+
+        # Extrapolation
+        elif tab_idx == "Extrap":
+            self.extrap_comments_messages()
+
+        # Edges
+        elif tab_idx == "Edges":
+            self.edges_comments_messages()
+
+        # Uncertainty
+        elif tab_idx == "Uncertainty":
+            self.uncertainty_comments_messages()
+
+    def config_gui(self):
+        """Configure the user interface based on the available data."""
+
+        # After data is loaded enable GUI and buttons on toolbar
+        self.tab_all.setEnabled(True)
+        self.actionSave.setEnabled(True)
+        self.actionComment.setEnabled(True)
+        if self.groupings is not None:
+            self.actionCheck.setEnabled(False)
+        else:
+            self.actionCheck.setEnabled(True)
+        self.actionBT.setEnabled(True)
+        self.actionOptions.setEnabled(True)
+        self.actionGGA.setDisabled(True)
+        self.actionVTG.setDisabled(True)
+        self.actionOFF.setDisabled(True)
+        self.actionON.setDisabled(True)
+
+        if self.agency_options["ExtrapolatedSpeed"]["ShowIcon"]:
+            self.actionShow_Extrapolated.setVisible(True)
+        else:
+            self.actionShow_Extrapolated.setVisible(False)
+
+        # Set tab text and icons to default
+        for tab_idx in range(self.tab_all.count() - 4):
+            self.tab_all.setTabIcon(tab_idx, QtGui.QIcon())
+            self.tab_all.tabBar().setTabTextColor(tab_idx, QtGui.QColor(191, 191, 191))
+
+        # Configure tabs and toolbar for the presence or absence of GPS data
+        self.tab_all.setTabEnabled(6, False)
+        self.actionGGA.setEnabled(False)
+        self.actionVTG.setEnabled(False)
+        self.actionON.setEnabled(False)
+        self.actionOFF.setEnabled(False)
+        self.actionGoogle_Earth.setEnabled(False)
+        for idx in self.checked_transects_idx:
+            if self.meas.transects[idx].boat_vel.gga_vel is not None:
+                self.tab_all.setTabEnabled(6, True)
+                self.actionGGA.setEnabled(True)
+                self.actionON.setEnabled(True)
+                self.actionOFF.setEnabled(True)
+                self.actionGoogle_Earth.setEnabled(True)
+                if not hasattr(self, "sc_gga"):
+                    self.sc_gga = QtWidgets.QShortcut(
+                        QtGui.QKeySequence("Ctrl+G"), self
+                    )
+                    self.sc_gga.activated.connect(self.set_ref_gga)
+            if self.meas.transects[idx].boat_vel.vtg_vel is not None:
+                self.tab_all.setTabEnabled(6, True)
+                self.actionVTG.setEnabled(True)
+                self.actionON.setEnabled(True)
+                self.actionOFF.setEnabled(True)
+                if not hasattr(self, "sc_vtg"):
+                    self.sc_vtg = QtWidgets.QShortcut(
+                        QtGui.QKeySequence("Ctrl+V"), self
+                    )
+                    self.sc_vtg.activated.connect(self.set_ref_vtg)
+
+            if self.actionVTG.isEnabled() and self.actionGGA.isEnabled():
+                break
+
+        if self.actionVTG.isEnabled() and self.actionGGA.isEnabled():
+            self.update_toolbar_composite_tracks()
+
+        # Configure tabs for the presence or absence of a compass
+        if len(self.checked_transects_idx) > 0:
+            heading = np.unique(
+                self.meas.transects[
+                    self.checked_transects_idx[0]
+                ].sensors.heading_deg.internal.data
+            )
+        else:
+            heading = np.array([0])
+
+        if len(heading) > 1 and np.any(np.not_equal(heading, 0)):
+            self.tab_all.setTabEnabled(2, True)
+            self.tab_all.setTabEnabled(13, True)
+        else:
+            self.tab_all.setTabEnabled(2, False)
+            self.tab_all.setTabEnabled(13, False)
+
+        self.tab_all.setCurrentIndex(0)
+
+    def q_digits(self, q):
+        if self.agency_options["QDigits"]["method"] == "sigfig":
+            return sfrnd(q, self.agency_options["QDigits"]["digits"])
+        else:
+            return np.round(q, self.agency_options["QDigits"]["digits"])
+
+    def closeEvent(self, event):
+        """Warns user when closing QRev.
+
+        Parameters
+        ----------
+        event: QCloseEvent
+            Object of QCloseEvent
+        """
+        if event:
+            if self.groupings is None and self.meas is not None:
+                close = QtWidgets.QMessageBox()
+                close.setIcon(QtWidgets.QMessageBox.Warning)
+                close.setWindowTitle("Close")
+                close.setText(
+                    self.tr(
+                        "If you haven't saved your data, "
+                        "changes will be lost. \n Are you sure you want to Close? "
+                    )
+                )
+                close.setStandardButtons(
+                    QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.Cancel
+                )
+                close = close.exec()
+
+                if close == QtWidgets.QMessageBox.Yes:
+                    if self.caller is not None:
+                        self.caller.Show_RIVRS()
+                    event.accept()
+                else:
+                    event.ignore()
+            else:
+                event.accept()
+        else:
+            event.accept()
+
+
+# Main
+# ====
+if __name__ == "__main__":
+    mp.freeze_support()
+    app = QtWidgets.QApplication(sys.argv)
+    # splash_pix = QtGui.QPixmap('QRevInt_Splash.png')
+    # splash = QtWidgets.QSplashScreen(splash_pix)
+    # splash.show
+    window = QRev()
+    if window.agreement:
+        window.show()
+        app.exec_()
+        # splash.finish(None)
+    else:
+        app.closeAllWindows()
diff --git a/UI/QRev.spec b/UI/QRev.spec
new file mode 100644
index 0000000000000000000000000000000000000000..fce82fe7f68e05a6c471fcb337c03f06bceee261
--- /dev/null
+++ b/UI/QRev.spec
@@ -0,0 +1,50 @@
+# -*- mode: python ; coding: utf-8 -*-
+
+
+block_cipher = None
+
+
+a = Analysis(
+    ['QRev.py'],
+    pathex=[],
+    binaries=[],
+    datas=[],
+    hiddenimports=[],
+    hookspath=[],
+    hooksconfig={},
+    runtime_hooks=[],
+    excludes=[],
+    win_no_prefer_redirects=False,
+    win_private_assemblies=False,
+    cipher=block_cipher,
+    noarchive=False,
+)
+pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
+
+exe = EXE(
+    pyz,
+    a.scripts,
+    [],
+    exclude_binaries=True,
+    name='QRevInt',
+    debug=False,
+    bootloader_ignore_signals=False,
+    strip=False,
+    upx=True,
+    console=True,
+    disable_windowed_traceback=False,
+    argv_emulation=False,
+    target_arch=None,
+    codesign_identity=None,
+    entitlements_file=None,
+)
+coll = COLLECT(
+    exe,
+    a.binaries,
+    a.zipfiles,
+    a.datas,
+    strip=False,
+    upx=True,
+    upx_exclude=[],
+    name='QRev',
+)
diff --git a/UI/QRevInt.ico b/UI/QRevInt.ico
new file mode 100644
index 0000000000000000000000000000000000000000..23d203fecdf6438a4d1100576c5c65de8d2e3b35
Binary files /dev/null and b/UI/QRevInt.ico differ
diff --git a/UI/QRevInt36.spec b/UI/QRevInt36.spec
new file mode 100644
index 0000000000000000000000000000000000000000..9df989760d334d1d0fee72c2608bd53a13815e5e
--- /dev/null
+++ b/UI/QRevInt36.spec
@@ -0,0 +1,39 @@
+# -*- mode: python ; coding: utf-8 -*-
+
+block_cipher = None
+
+
+a = Analysis(['QRev.py'],
+             pathex=['C:\\Users\\dave\\Documents\\QRevInt_Project\\QRevInt\\UI\\', 'C:\\Users\\dave\\Documents\\QRevInt_Project\\QRevInt\\UI'],
+             binaries=[('C:\\Users\\dave\\Documents\\QRevInt_Project\\QRevInt\\venv_qrevint\\Lib\\site-packages\\sklearn\.libs\\vcomp140.dll', '.\\sklearn\\.libs'),
+             ('C:\\Users\\dave\\Documents\\QRevInt_Project\\QRevInt\\venv_qrevint\\Lib\\site-packages\\sklearn\.libs\\vcruntime140_1.dll', '.\\sklearn\\.libs'),
+			 ('C:\\Users\\dave\\Documents\\QRevInt_Project\\QRevInt\\UI\\Images\\extrap_contour.png', '.\\Images')],
+             datas=[],
+             hiddenimports=['sklearn', 'sklearn.neighbors.typedefs', 'sklearn.utils._cython_blas', 'sklearn.utils._weight_vector'],
+             hookspath=[],
+             runtime_hooks=[],
+             excludes=[('C:\\Users\\dave\\Documents\\QRevInt_Project\\QRevInt\\venv_qrevint\\Lib\\site-packages\\numpy\\distutils\\ccompiler')],
+             win_no_prefer_redirects=False,
+             win_private_assemblies=False,
+             cipher=block_cipher,
+             noarchive=False)
+
+pyz = PYZ(a.pure, a.zipped_data,
+             cipher=block_cipher)
+
+exe = EXE(pyz,
+          a.scripts,
+          a.binaries,
+          a.zipfiles,
+          a.datas,
+          [],
+          name='QRevInt',
+          debug=False,
+          bootloader_ignore_signals=False,
+          strip=False,
+          upx=True,
+          upx_exclude=[],
+          runtime_tmpdir=None,
+          console=False ,
+          version='file_version_info.txt',
+          icon='QRevInt.ico')
diff --git a/UI/QRevStylesheet_english.xsl b/UI/QRevStylesheet_english.xsl
new file mode 100644
index 0000000000000000000000000000000000000000..ee39542cf8eed04490dd51fa5b96348f5e9f3b07
--- /dev/null
+++ b/UI/QRevStylesheet_english.xsl
@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<!--*********This stylesheet is an example of displaying data from the QRev .xml file ********-->
+<xsl:variable name="UnitConvert" select="1 div 0.3048" /> <!-- Use for conversion from metric to english units -->
+<!--xsl:variable name="UnitConvert" select="1 div 1" /--> <!-- Use for metric units -->
+<xsl:template match="/">
+<html>
+<head>
+<style>
+table {
+	width:100%;
+	border-collapse: collapse;
+}	
+
+table, td {
+	padding: 1px;
+	bgcolor:#9acd32;
+	font-size:1em;
+	font-family: Verdana, sans-serif;
+	vertical-align: top;
+}
+th {
+    font-size:1.1em;
+	text-align: center;
+	vertical-align: center;
+	background-color:#9acd32;
+	height:25px;
+}
+td {
+	text-align: left;.
+	border: 1px solid black;
+	
+}	
+tr:hover{background-color:#f5f5f5}
+
+body {font-family: Verdana, sans-serif; font-size:0.75em;}
+header, nav, section, article, footer
+{border:0px solid grey; margin:5px; padding:8px;}
+nav ul {margin:0; padding:0;}
+nav ul li {display:inline; margin:5px;}
+
+</style>
+</head>
+  <body>
+  <header>
+  <table style="border:0px">
+	<tr style="border:0px">
+		<td style="border:0px"><h3>Station Number: <xsl:value-of select="Channel/SiteInformation/SiteID"/></h3>
+		</td>
+		<td style="border:0px"><h4 align="right">Date (mm/dd/yyyy): <xsl:value-of select="substring(Channel/Transect/StartDateTime, 1, string-length(substring-before(Channel/Transect/StartDateTime, ' ')))"/></h4>
+		</td>
+	</tr>
+	<tr style="border:0px">
+		<td colspan="2" style="border:0px"><h3>Station Name: <xsl:value-of select="Channel/SiteInformation/StationName"/></h3>
+		</td>
+	</tr>
+  </table>
+ </header>
+ <section>
+  <article name="Measurement Summary and Setup">
+<table>
+<td style="width: 50%;border:0px">  
+<table name="Measurement Summary">
+  <tr>
+	<th colspan="2">Measurement Summary</th>
+  </tr>
+  <tr>
+	<td style="width:50%">Discharge (ft<sup>3</sup>/s)</td>
+	<td><xsl:value-of select="round(Channel/ChannelSummary/Discharge/Total * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+  </tr>
+  <tr>
+	<td>Mean Velocity (ft/s)</td>
+	<td><xsl:value-of select="round(Channel/ChannelSummary/Other/MeanQoverA * $UnitConvert *10000) div 10000"/></td>
+  </tr>
+  <tr>
+	<td>Area (ft<sup>2</sup>)</td>
+	<td><xsl:value-of select="round(Channel/ChannelSummary/Other/MeanArea* $UnitConvert * $UnitConvert *100) div 100"/></td>
+  </tr>
+  <tr>
+	<td>Width (ft)</td>
+	<td><xsl:value-of select="round(Channel/ChannelSummary/Other/MeanWidth * $UnitConvert *100) div 100"/></td>
+  </tr>
+  	  <tr>
+		<td>Navigation Reference</td>
+		<td><xsl:value-of select="Channel/Processing/Navigation/Reference"/></td>
+	  </tr>
+  <tr>
+	<td>Extrapolation Method (Top/Bottom Exponent):</td>
+	<td><xsl:value-of select="Channel/Processing/Extrapolation/TopMethod"/>/<xsl:value-of select="Channel/Processing/Extrapolation/BottomMethod"/> Exp:<xsl:value-of select="Channel/Processing/Extrapolation/Exponent"/></td>
+  </tr>  
+ </table>
+ </td>
+<td style="width: 50%;border:0px">
+<table name="ADCP Info">
+      <tr>
+        <th colspan="2">ADCP Info/Settings</th>
+	  </tr>
+
+	  <tr>
+	  <td style="width:50%">ADCP Model</td>
+	  <td><xsl:value-of select="Channel/Instrument/Model"/></td>
+	  </tr>
+	  <tr>
+	  <td>Frequency</td>
+	  <td><xsl:value-of select="Channel/Instrument/Frequency"/></td>
+	  </tr>
+	  <tr>
+	  <td>Serial Number</td>
+	  <td><xsl:value-of select="Channel/Instrument/SerialNumber"/></td>
+	  </tr>
+	  <tr>
+	  <td>Firmware</td>
+	  <td><xsl:value-of select="Channel/Instrument/FirmwareVersion"/></td>
+	  </tr>
+	  <tr>
+	  <td>Configuration</td>
+	  <td><xsl:value-of select="Channel/Instrument/InstrumentConfiguration"/></td>
+	  </tr>
+	  <tr>
+		  <td>Software</td>
+	  <td><xsl:value-of select="Channel/Processing/SoftwareVersion"/></td>
+	  </tr>
+	</table>
+
+      </td>
+	  </table>
+
+<table>
+<td style="width: 50%;border:0px">	  
+<table name="Statistics">
+<tr>
+	<th colspan="2">Measurement Statistics</th>
+  </tr>
+    <tr>
+  <td style="width:50%">Total Duration (s)</td>
+  <td><xsl:value-of select="Channel/ChannelSummary/Other/Duration"/></td>
+  </tr>
+<tr>
+<td>Measured Q (%)</td>
+<td>
+<xsl:value-of select="round((Channel/ChannelSummary/Discharge/Middle * $UnitConvert * $UnitConvert * $UnitConvert) div (Channel/ChannelSummary/Discharge/Total * $UnitConvert * $UnitConvert * $UnitConvert) * 100) div 100 * 100"/>
+</td>
+</tr>
+<tr>
+<td>Left Edge Q (%)</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Other/LeftQPer"/></td>
+</tr>
+<tr>
+<td>Right Edge Q (%)</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Other/RightQPer"/></td>
+</tr>
+<tr>
+<td>Mean Boat Speed (ft/s)</td>
+<td><xsl:value-of select="round(Channel/ChannelSummary/Other/MeanBoatSpeed * $UnitConvert * 10000) div 10000"/></td>
+</tr>
+<tr>
+<td>Invalid Bins (%)</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Other/InvalidCellsQPer"/></td>
+</tr>
+<tr>
+<td>Invalid Ensembles (%)</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Other/InvalidEnsQPer"/></td>
+</tr>
+<tr>
+<td>Uncertainty - COV</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Uncertainty/COV"/></td>
+</tr>
+<tr>
+<td><b>Uncertainty - Total %</b></td>
+<td><b><xsl:value-of select="Channel/ChannelSummary/Uncertainty/Total"/></b></td>
+</tr>		
+<tr>
+<td><b>Uncertainty - User Rating %</b></td>
+<td><b><xsl:value-of select="Channel/ChannelSummary/Other/UserRating"/></b>
+  <xsl:if test="contains(Channel/ChannelSummary/Uncertainty/Total, '*')">
+   * Uncertainty based upon user entered values.
+</xsl:if></td>
+</tr>		
+</table>
+</td>
+<td style="width: 50%;border:0px">
+<table name="Measurement Setup">
+
+  <tr>
+	<th colspan="2">Measurement Setup / Tests</th>
+  </tr>
+  <tr>
+	<td style="width:50%">Diagnostic Test Results</td>
+	<td><xsl:value-of select="Channel/QA/DiagnosticTestResult"/></td>
+	</tr>
+		  <tr>
+	  <td>Compass Calibration Results</td>
+	  <td><xsl:value-of select="Channel/QA/CompassCalibrationResult"/></td>
+	  </tr>
+	  <tr>
+	  <td>Magnetic Variation (<sup>o</sup>)</td>
+	  <td><xsl:value-of select="Channel/Processing/Navigation/MagneticVariation"/></td>
+	  </tr>
+	  		  <tr>
+	  <td>Moving Bed Test Type</td>
+	  <td><xsl:value-of select="Channel/QA/MovingBedTestType"/></td>
+	  </tr>
+	  		  <tr>
+	  <td>Moving Bed Condition</td>
+	  <td><xsl:value-of select="Channel/QA/MovingBedTestResult"/></td>
+	  </tr>
+	  <tr>
+		<td>Moving Bed Test Duration (s)</td>
+		<td><xsl:value-of select="Channel/QA/MovingBedTest/Duration"/></td>
+	  </tr>
+	  	  <tr>
+	  <td>Moving Bed Percent (%)</td>
+	  <td><xsl:value-of select="Channel/QA/MovingBedTest/PercentMovingBed"/></td>
+	  </tr>
+	  
+	  <tr>
+	  <td>Moving Bed Correction for Discharge (%)</td>
+	  <td><xsl:if test="Channel/ChannelSummary/Discharge/MovingBedPercentCorrection>0"><xsl:value-of select="round(Channel/ChannelSummary/Discharge/MovingBedPercentCorrection*10) div 10"/>  
+		</xsl:if></td>
+	  </tr>
+	  <tr>
+	  <td>Moving Bed Message</td>
+	  <td><xsl:value-of select="Channel/QA/MovingBedTest/Message"/></td>
+	  </tr>
+</table>
+		
+</td>
+</table>	
+</article>
+
+<article name="Messages">
+<h4>Messages</h4>
+<p><xsl:value-of select="Channel/UserComment"/></p>
+<p><xsl:value-of select="Channel/QA/QRev_Message"/></p>
+</article>
+<article name="Transect Discharge Summary">
+  <h4>Transect Discharge Summary</h4>
+   <table>
+      <!-- <caption style="text-align:left">Transect Discharge</caption> -->
+	  
+	  <tr>
+        <th>File Name</th>
+		<th>Start Edge</th>
+		<th>Left Dist</th>
+		<th>Right Dist</th>
+        <th>Start Time</th>
+		<th>End Time</th>
+		<th>Top</th>
+		<th>Middle</th>
+		<th>Bottom</th>
+		<th>Left</th>
+		<th>Right</th>
+		<th>Total Q</th>
+      </tr>
+   <xsl:for-each select="Channel/Transect">
+      <tr>
+        <td><xsl:value-of select="Filename"/></td>
+		<td><xsl:value-of select="Edge/StartEdge"/></td>
+		<td><xsl:value-of select="round(Edge/LeftDistance *$UnitConvert * 100) div 100"/></td>
+		<td><xsl:value-of select="round(Edge/RightDistance  *$UnitConvert * 100) div 100"/></td>
+		<!--<td><xsl:value-of select="StartDateTime"/></td>-->
+		<!--<td><xsl:value-of select="EndDateTime"/></td>-->
+        <td><xsl:value-of select="substring(StartDateTime, 11, string-length(substring-before(StartDateTime, ' ')))"/></td>
+		<td><xsl:value-of select="substring(EndDateTime, 11, string-length(substring-before(EndDateTime, ' ')))"/></td>
+		<td><xsl:value-of select="round(Discharge/Top * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Discharge/Middle * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Discharge/Bottom * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Discharge/Left * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Discharge/Right * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Discharge/Total * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+      </tr>
+    </xsl:for-each>
+	
+    </table>  
+	</article>
+<article name="Transect Supplementary Data">
+<h4>Transect Supplementary Data</h4>
+	 <table>
+      <tr>
+        <th>File Name</th>
+		<th>L E Type</th>
+        <th>L E Coeff</th>
+		<th>R E Type</th>
+		<th>R E Coeff</th>
+		<th>Width (ft)</th>
+        <th>Duration (s)</th>
+		<th>Invalid Depth Cells (%)</th>
+		<th>Invalid Ens (%)</th>
+      </tr>
+      <xsl:for-each select="Channel/Transect">
+      <tr>
+        <td><xsl:value-of select="Filename"/></td>
+        <td><xsl:value-of select="Edge/LeftType"/></td>
+		<td><xsl:value-of select="Edge/LeftEdgeCoefficient"/></td>
+		<td><xsl:value-of select="Edge/RightType"/></td>
+		<td><xsl:value-of select="Edge/RightEdgeCoefficient"/></td>
+		<td><xsl:value-of select="round(Other/Width * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Other/Duration)"/></td>
+		<td><xsl:value-of select="round(Other/PercentInvalidBins * 10) div 10"/></td>
+		<td><xsl:value-of select="round(Other/PercentInvalidEns * 10) div 10"/></td>
+		
+		
+      </tr>
+      </xsl:for-each>
+    </table>
+</article>
+
+</section>	
+<footer>
+<p align = "center">QRev Summary File: <xsl:value-of select="Channel/@QRevFilename"/> || QRev Stylesheet Version: WSC v2.1 2021-06-01</p>
+ <h3 align="center">QRev Measurement Review</h3>
+</footer>
+  </body>
+  </html>
+</xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/UI/QRevStylesheet_si.xsl b/UI/QRevStylesheet_si.xsl
new file mode 100644
index 0000000000000000000000000000000000000000..ff2b277accab76ba8545b27e80e7855efedc7f09
--- /dev/null
+++ b/UI/QRevStylesheet_si.xsl
@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<!--*********This stylesheet is an example of displaying data from the QRev .xml file ********-->
+<!--xsl:variable name="UnitConvert" select="1 div 0.3048" /--> <!-- Use for conversion from metric to english units -->
+<xsl:variable name="UnitConvert" select="1 div 1" /> <!-- Use for metric units -->
+<xsl:template match="/">
+<html>
+<head>
+<style>
+table {
+	width:100%;
+	border-collapse: collapse;
+}	
+
+table, td {
+	padding: 1px;
+	bgcolor:#9acd32;
+	font-size:1em;
+	font-family: Verdana, sans-serif;
+	vertical-align: top;
+}
+th {
+    font-size:1.1em;
+	text-align: center;
+	vertical-align: center;
+	background-color:#9acd32;
+	height:25px;
+}
+td {
+	text-align: left;.
+	border: 1px solid black;
+	
+}	
+tr:hover{background-color:#f5f5f5}
+
+body {font-family: Verdana, sans-serif; font-size:0.75em;}
+header, nav, section, article, footer
+{border:0px solid grey; margin:5px; padding:8px;}
+nav ul {margin:0; padding:0;}
+nav ul li {display:inline; margin:5px;}
+
+</style>
+</head>
+  <body>
+  <header>
+  <table style="border:0px">
+	<tr style="border:0px">
+		<td style="border:0px"><h3>Station Number: <xsl:value-of select="Channel/SiteInformation/SiteID"/></h3>
+		</td>
+		<td style="border:0px"><h4 align="right">Date (mm/dd/yyyy): <xsl:value-of select="substring(Channel/Transect/StartDateTime, 1, string-length(substring-before(Channel/Transect/StartDateTime, ' ')))"/></h4>
+		</td>
+	</tr>
+	<tr style="border:0px">
+		<td colspan="2" style="border:0px"><h3>Station Name: <xsl:value-of select="Channel/SiteInformation/StationName"/></h3>
+		</td>
+	</tr>
+  </table>
+ </header>
+ <section>
+  <article name="Measurement Summary and Setup">
+<table>
+<td style="width: 50%;border:0px">  
+<table name="Measurement Summary">
+  <tr>
+	<th colspan="2">Measurement Summary</th>
+  </tr>
+  <tr>
+	<td style="width:50%">Discharge (m<sup>3</sup>/s)</td>
+	<td><xsl:value-of select="round(Channel/ChannelSummary/Discharge/Total * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+  </tr>
+  <tr>
+	<td>Mean Velocity (m/s)</td>
+	<td><xsl:value-of select="round(Channel/ChannelSummary/Other/MeanQoverA*10000) div 10000"/></td>
+  </tr>
+  <tr>
+	<td>Area (m<sup>2</sup>)</td>
+	<td><xsl:value-of select="round(Channel/ChannelSummary/Other/MeanArea*100) div 100"/></td>
+  </tr>
+  <tr>
+	<td>Width (m)</td>
+	<td><xsl:value-of select="round(Channel/ChannelSummary/Other/MeanWidth*100) div 100"/></td>
+  </tr>
+  	  <tr>
+		<td>Navigation Reference</td>
+		<td><xsl:value-of select="Channel/Processing/Navigation/Reference"/></td>
+	  </tr>
+  <tr>
+	<td>Extrapolation Method (Top/Bottom Exponent):</td>
+	<td><xsl:value-of select="Channel/Processing/Extrapolation/TopMethod"/>/<xsl:value-of select="Channel/Processing/Extrapolation/BottomMethod"/> Exp:<xsl:value-of select="Channel/Processing/Extrapolation/Exponent"/></td>
+  </tr>  
+ </table>
+ </td>
+<td style="width: 50%;border:0px">
+<table name="ADCP Info">
+      <tr>
+        <th colspan="2">ADCP Info/Settings</th>
+	  </tr>
+
+	  <tr>
+	  <td style="width:50%">ADCP Model</td>
+	  <td><xsl:value-of select="Channel/Instrument/Model"/></td>
+	  </tr>
+	  <tr>
+	  <td>Frequency</td>
+	  <td><xsl:value-of select="Channel/Instrument/Frequency"/></td>
+	  </tr>
+	  <tr>
+	  <td>Serial Number</td>
+	  <td><xsl:value-of select="Channel/Instrument/SerialNumber"/></td>
+	  </tr>
+	  <tr>
+	  <td>Firmware</td>
+	  <td><xsl:value-of select="Channel/Instrument/FirmwareVersion"/></td>
+	  </tr>
+	  <tr>
+	  <td>Configuration</td>
+	  <td><xsl:value-of select="Channel/Instrument/InstrumentConfiguration"/></td>
+	  </tr>
+	  <tr>
+		  <td>Software</td>
+	  <td><xsl:value-of select="Channel/Processing/SoftwareVersion"/></td>
+	  </tr>
+	</table>
+
+      </td>
+	  </table>
+
+<table>
+<td style="width: 50%;border:0px">	  
+<table name="Statistics">
+<tr>
+	<th colspan="2">Measurement Statistics</th>
+  </tr>
+    <tr>
+  <td style="width:50%">Total Duration (s)</td>
+  <td><xsl:value-of select="Channel/ChannelSummary/Other/Duration"/></td>
+  </tr>
+<tr>
+<td>Measured Q (%)</td>
+<td>
+<xsl:value-of select="round((Channel/ChannelSummary/Discharge/Middle * $UnitConvert * $UnitConvert * $UnitConvert) div (Channel/ChannelSummary/Discharge/Total * $UnitConvert * $UnitConvert * $UnitConvert) * 100) div 100 * 100"/>
+</td>
+</tr>
+<tr>
+<td>Left Edge Q (%)</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Other/LeftQPer"/></td>
+</tr>
+<tr>
+<td>Right Edge Q (%)</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Other/RightQPer"/></td>
+</tr>
+<tr>
+<td>Mean Boat Speed (m/s)</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Other/MeanBoatSpeed"/></td>
+</tr>
+<tr>
+<td>Invalid Bins (%)</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Other/InvalidCellsQPer"/></td>
+</tr>
+<tr>
+<td>Invalid Ensembles (%)</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Other/InvalidEnsQPer"/></td>
+</tr>
+<tr>
+<td>Uncertainty - COV</td>
+<td><xsl:value-of select="Channel/ChannelSummary/Uncertainty/COV"/></td>
+</tr>
+<tr>
+<td><b>Uncertainty - Total %</b></td>
+<td><b><xsl:value-of select="Channel/ChannelSummary/Uncertainty/Total"/></b></td>
+</tr>		
+<tr>
+<td><b>Uncertainty - User Rating %</b></td>
+<td><b><xsl:value-of select="Channel/ChannelSummary/Other/UserRating"/></b>
+  <xsl:if test="contains(Channel/ChannelSummary/Uncertainty/Total, '*')">
+   * Uncertainty based upon user entered values.
+</xsl:if></td>
+</tr>		
+</table>
+</td>
+<td style="width: 50%;border:0px">
+<table name="Measurement Setup">
+
+  <tr>
+	<th colspan="2">Measurement Setup / Tests</th>
+  </tr>
+  <tr>
+	<td style="width:50%">Diagnostic Test Results</td>
+	<td><xsl:value-of select="Channel/QA/DiagnosticTestResult"/></td>
+	</tr>
+		  <tr>
+	  <td>Compass Calibration Results</td>
+	  <td><xsl:value-of select="Channel/QA/CompassCalibrationResult"/></td>
+	  </tr>
+	  <tr>
+	  <td>Magnetic Variation (<sup>o</sup>)</td>
+	  <td><xsl:value-of select="Channel/Processing/Navigation/MagneticVariation"/></td>
+	  </tr>
+	  		  <tr>
+	  <td>Moving Bed Test Type</td>
+	  <td><xsl:value-of select="Channel/QA/MovingBedTestType"/></td>
+	  </tr>
+	  		  <tr>
+	  <td>Moving Bed Condition</td>
+	  <td><xsl:value-of select="Channel/QA/MovingBedTestResult"/></td>
+	  </tr>
+	  <tr>
+		<td>Moving Bed Test Duration (s)</td>
+		<td><xsl:value-of select="Channel/QA/MovingBedTest/Duration"/></td>
+	  </tr>
+	  	  <tr>
+	  <td>Moving Bed Percent (%)</td>
+	  <td><xsl:value-of select="Channel/QA/MovingBedTest/PercentMovingBed"/></td>
+	  </tr>
+	  
+	  <tr>
+	  <td>Moving Bed Correction for Discharge (%)</td>
+	  <td><xsl:if test="Channel/ChannelSummary/Discharge/MovingBedPercentCorrection>0"><xsl:value-of select="round(Channel/ChannelSummary/Discharge/MovingBedPercentCorrection*10) div 10"/>  
+		</xsl:if></td>
+	  </tr>
+	  <tr>
+	  <td>Moving Bed Message</td>
+	  <td><xsl:value-of select="Channel/QA/MovingBedTest/Message"/></td>
+	  </tr>
+</table>
+		
+</td>
+</table>	
+</article>
+
+<article name="Messages">
+<h4>Messages</h4>
+<p><xsl:value-of select="Channel/UserComment"/></p>
+<p><xsl:value-of select="Channel/QA/QRev_Message"/></p>
+</article>
+<article name="Transect Discharge Summary">
+  <h4>Transect Discharge Summary</h4>
+   <table>
+      <!-- <caption style="text-align:left">Transect Discharge</caption> -->
+	  
+	  <tr>
+        <th>File Name</th>
+		<th>Start Edge</th>
+		<th>Left Dist</th>
+		<th>Right Dist</th>
+        <th>Start Time</th>
+		<th>End Time</th>
+		<th>Top</th>
+		<th>Middle</th>
+		<th>Bottom</th>
+		<th>Left</th>
+		<th>Right</th>
+		<th>Total Q</th>
+      </tr>
+   <xsl:for-each select="Channel/Transect">
+      <tr>
+        <td><xsl:value-of select="Filename"/></td>
+		<td><xsl:value-of select="Edge/StartEdge"/></td>
+		<td><xsl:value-of select="Edge/LeftDistance"/></td>
+		<td><xsl:value-of select="Edge/RightDistance"/></td>
+		<!--<td><xsl:value-of select="StartDateTime"/></td>-->
+		<!--<td><xsl:value-of select="EndDateTime"/></td>-->
+        <td><xsl:value-of select="substring(StartDateTime, 11, string-length(substring-before(StartDateTime, ' ')))"/></td>
+		<td><xsl:value-of select="substring(EndDateTime, 11, string-length(substring-before(EndDateTime, ' ')))"/></td>
+		<td><xsl:value-of select="round(Discharge/Top * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Discharge/Middle * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Discharge/Bottom * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Discharge/Left * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Discharge/Right * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Discharge/Total * $UnitConvert * $UnitConvert * $UnitConvert * 1000) div 1000"/></td>
+      </tr>
+    </xsl:for-each>
+	
+    </table>  
+	</article>
+<article name="Transect Supplementary Data">
+<h4>Transect Supplementary Data</h4>
+	 <table>
+      <tr>
+        <th>File Name</th>
+		<th>L E Type</th>
+        <th>L E Coeff</th>
+		<th>R E Type</th>
+		<th>R E Coeff</th>
+		<th>Width (m)</th>
+        <th>Duration (s)</th>
+		<th>Invalid Depth Cells (%)</th>
+		<th>Invalid Ens (%)</th>
+      </tr>
+      <xsl:for-each select="Channel/Transect">
+      <tr>
+        <td><xsl:value-of select="Filename"/></td>
+        <td><xsl:value-of select="Edge/LeftType"/></td>
+		<td><xsl:value-of select="Edge/LeftEdgeCoefficient"/></td>
+		<td><xsl:value-of select="Edge/RightType"/></td>
+		<td><xsl:value-of select="Edge/RightEdgeCoefficient"/></td>
+		<td><xsl:value-of select="round(Other/Width * $UnitConvert * 1000) div 1000"/></td>
+		<td><xsl:value-of select="round(Other/Duration)"/></td>
+		<td><xsl:value-of select="round(Other/PercentInvalidBins * 10) div 10"/></td>
+		<td><xsl:value-of select="round(Other/PercentInvalidEns * 10) div 10"/></td>
+		
+		
+      </tr>
+      </xsl:for-each>
+    </table>
+</article>
+
+</section>	
+<footer>
+<p align = "center">QRev Summary File: <xsl:value-of select="Channel/@QRevFilename"/> || QRev Stylesheet Version: WSC v2.0 2017-02-14</p>
+ <h3 align="center">QRev Measurement Review</h3>
+</footer>
+  </body>
+  </html>
+</xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/UI/QRev_gui.py b/UI/QRev_gui.py
new file mode 100644
index 0000000000000000000000000000000000000000..e4f3b281debb0e1bf4f5834071cb2ae1b5689105
--- /dev/null
+++ b/UI/QRev_gui.py
@@ -0,0 +1,4821 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'QRev_gui.ui'
+#
+# Created by: PyQt5 UI code generator 5.13.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+    def setupUi(self, MainWindow):
+        MainWindow.setObjectName("MainWindow")
+        MainWindow.resize(1925, 1055)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
+        MainWindow.setSizePolicy(sizePolicy)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 175))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 175))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 175))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 175))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 175))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 175))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 175))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 175))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 175))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
+        MainWindow.setPalette(palette)
+        icon = QtGui.QIcon.fromTheme("QRevInt.ico")
+        MainWindow.setWindowIcon(icon)
+        MainWindow.setLayoutDirection(QtCore.Qt.LeftToRight)
+        MainWindow.setStyleSheet("QMainWindow{background: solid rgb(0, 0, 175);}")
+        MainWindow.setDockOptions(QtWidgets.QMainWindow.AllowTabbedDocks|QtWidgets.QMainWindow.AnimatedDocks|QtWidgets.QMainWindow.VerticalTabs)
+        self.centralwidget = QtWidgets.QWidget(MainWindow)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
+        self.centralwidget.setSizePolicy(sizePolicy)
+        self.centralwidget.setObjectName("centralwidget")
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.centralwidget)
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        self.tab_all = QtWidgets.QTabWidget(self.centralwidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tab_all.sizePolicy().hasHeightForWidth())
+        self.tab_all.setSizePolicy(sizePolicy)
+        self.tab_all.setSizeIncrement(QtCore.QSize(0, 0))
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
+        self.tab_all.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_all.setFont(font)
+        self.tab_all.setAutoFillBackground(False)
+        self.tab_all.setTabPosition(QtWidgets.QTabWidget.North)
+        self.tab_all.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_all.setIconSize(QtCore.QSize(40, 24))
+        self.tab_all.setObjectName("tab_all")
+        self.tab_main = QtWidgets.QWidget()
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tab_main.sizePolicy().hasHeightForWidth())
+        self.tab_main.setSizePolicy(sizePolicy)
+        self.tab_main.setObjectName("tab_main")
+        self.gridLayout_49 = QtWidgets.QGridLayout(self.tab_main)
+        self.gridLayout_49.setObjectName("gridLayout_49")
+        self.horizontalLayout_76 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_76.setObjectName("horizontalLayout_76")
+        self.splitter = QtWidgets.QSplitter(self.tab_main)
+        self.splitter.setOrientation(QtCore.Qt.Vertical)
+        self.splitter.setObjectName("splitter")
+        self.tab_summary = QtWidgets.QTabWidget(self.splitter)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.tab_summary.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_summary.setFont(font)
+        self.tab_summary.setLayoutDirection(QtCore.Qt.LeftToRight)
+        self.tab_summary.setTabPosition(QtWidgets.QTabWidget.North)
+        self.tab_summary.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_summary.setObjectName("tab_summary")
+        self.tab_summary_discharge = QtWidgets.QWidget()
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tab_summary_discharge.sizePolicy().hasHeightForWidth())
+        self.tab_summary_discharge.setSizePolicy(sizePolicy)
+        self.tab_summary_discharge.setObjectName("tab_summary_discharge")
+        self.gridLayout_2 = QtWidgets.QGridLayout(self.tab_summary_discharge)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.main_table_summary = QtWidgets.QTableWidget(self.tab_summary_discharge)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.main_table_summary.setFont(font)
+        self.main_table_summary.setAutoFillBackground(False)
+        self.main_table_summary.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
+        self.main_table_summary.setObjectName("main_table_summary")
+        self.main_table_summary.setColumnCount(0)
+        self.main_table_summary.setRowCount(0)
+        self.gridLayout_2.addWidget(self.main_table_summary, 0, 0, 1, 1)
+        self.tab_summary.addTab(self.tab_summary_discharge, "")
+        self.tab_summary_details = QtWidgets.QWidget()
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tab_summary_details.sizePolicy().hasHeightForWidth())
+        self.tab_summary_details.setSizePolicy(sizePolicy)
+        self.tab_summary_details.setObjectName("tab_summary_details")
+        self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_summary_details)
+        self.gridLayout_4.setObjectName("gridLayout_4")
+        self.main_table_details = QtWidgets.QTableWidget(self.tab_summary_details)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.main_table_details.setFont(font)
+        self.main_table_details.setObjectName("main_table_details")
+        self.main_table_details.setColumnCount(0)
+        self.main_table_details.setRowCount(0)
+        self.gridLayout_4.addWidget(self.main_table_details, 0, 0, 1, 1)
+        self.tab_summary.addTab(self.tab_summary_details, "")
+        self.tab_summary_premeasurement = QtWidgets.QWidget()
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tab_summary_premeasurement.sizePolicy().hasHeightForWidth())
+        self.tab_summary_premeasurement.setSizePolicy(sizePolicy)
+        self.tab_summary_premeasurement.setObjectName("tab_summary_premeasurement")
+        self.gridLayout_7 = QtWidgets.QGridLayout(self.tab_summary_premeasurement)
+        self.gridLayout_7.setObjectName("gridLayout_7")
+        self.txt_site_name = QtWidgets.QLabel(self.tab_summary_premeasurement)
+        self.txt_site_name.setText("")
+        self.txt_site_name.setObjectName("txt_site_name")
+        self.gridLayout_7.addWidget(self.txt_site_name, 0, 1, 1, 1)
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.horizontalLayout_79 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_79.setObjectName("horizontalLayout_79")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.label_site_name = QtWidgets.QLabel(self.tab_summary_premeasurement)
+        self.label_site_name.setFrameShape(QtWidgets.QFrame.NoFrame)
+        self.label_site_name.setObjectName("label_site_name")
+        self.horizontalLayout_3.addWidget(self.label_site_name)
+        self.ed_site_name = QtWidgets.QLineEdit(self.tab_summary_premeasurement)
+        self.ed_site_name.setObjectName("ed_site_name")
+        self.horizontalLayout_3.addWidget(self.ed_site_name)
+        self.horizontalLayout_79.addLayout(self.horizontalLayout_3)
+        self.horizontalLayout_78 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_78.setObjectName("horizontalLayout_78")
+        self.label_site_number = QtWidgets.QLabel(self.tab_summary_premeasurement)
+        self.label_site_number.setObjectName("label_site_number")
+        self.horizontalLayout_78.addWidget(self.label_site_number)
+        self.ed_site_number = QtWidgets.QLineEdit(self.tab_summary_premeasurement)
+        self.ed_site_number.setObjectName("ed_site_number")
+        self.horizontalLayout_78.addWidget(self.ed_site_number)
+        self.horizontalLayout_79.addLayout(self.horizontalLayout_78)
+        self.horizontalLayout_79.setStretch(0, 6)
+        self.horizontalLayout_79.setStretch(1, 3)
+        self.verticalLayout.addLayout(self.horizontalLayout_79)
+        self.horizontalLayout_77 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_77.setObjectName("horizontalLayout_77")
+        self.horizontalLayout_75 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_75.setObjectName("horizontalLayout_75")
+        self.label_person = QtWidgets.QLabel(self.tab_summary_premeasurement)
+        self.label_person.setObjectName("label_person")
+        self.horizontalLayout_75.addWidget(self.label_person)
+        self.ed_persons = QtWidgets.QLineEdit(self.tab_summary_premeasurement)
+        self.ed_persons.setObjectName("ed_persons")
+        self.horizontalLayout_75.addWidget(self.ed_persons)
+        self.horizontalLayout_77.addLayout(self.horizontalLayout_75)
+        self.horizontalLayout_74 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_74.setObjectName("horizontalLayout_74")
+        self.label_measnum = QtWidgets.QLabel(self.tab_summary_premeasurement)
+        self.label_measnum.setObjectName("label_measnum")
+        self.horizontalLayout_74.addWidget(self.label_measnum)
+        self.ed_meas_num = QtWidgets.QLineEdit(self.tab_summary_premeasurement)
+        self.ed_meas_num.setObjectName("ed_meas_num")
+        self.horizontalLayout_74.addWidget(self.ed_meas_num)
+        self.horizontalLayout_77.addLayout(self.horizontalLayout_74)
+        self.horizontalLayout_77.setStretch(0, 6)
+        self.horizontalLayout_77.setStretch(1, 3)
+        self.verticalLayout.addLayout(self.horizontalLayout_77)
+        self.gridLayout_7.addLayout(self.verticalLayout, 1, 0, 1, 1)
+        self.horizontalLayout_84 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_84.setObjectName("horizontalLayout_84")
+        self.horizontalLayout_81 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_81.setObjectName("horizontalLayout_81")
+        self.label_stage_start = QtWidgets.QLabel(self.tab_summary_premeasurement)
+        self.label_stage_start.setObjectName("label_stage_start")
+        self.horizontalLayout_81.addWidget(self.label_stage_start)
+        self.ed_stage_start = QtWidgets.QLineEdit(self.tab_summary_premeasurement)
+        self.ed_stage_start.setObjectName("ed_stage_start")
+        self.horizontalLayout_81.addWidget(self.ed_stage_start)
+        self.horizontalLayout_84.addLayout(self.horizontalLayout_81)
+        self.horizontalLayout_83 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_83.setObjectName("horizontalLayout_83")
+        self.label_stage_end = QtWidgets.QLabel(self.tab_summary_premeasurement)
+        self.label_stage_end.setObjectName("label_stage_end")
+        self.horizontalLayout_83.addWidget(self.label_stage_end)
+        self.ed_stage_end = QtWidgets.QLineEdit(self.tab_summary_premeasurement)
+        self.ed_stage_end.setObjectName("ed_stage_end")
+        self.horizontalLayout_83.addWidget(self.ed_stage_end)
+        self.horizontalLayout_84.addLayout(self.horizontalLayout_83)
+        self.horizontalLayout_82 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_82.setObjectName("horizontalLayout_82")
+        self.label_stage_meas = QtWidgets.QLabel(self.tab_summary_premeasurement)
+        self.label_stage_meas.setObjectName("label_stage_meas")
+        self.horizontalLayout_82.addWidget(self.label_stage_meas)
+        self.ed_stage_meas = QtWidgets.QLineEdit(self.tab_summary_premeasurement)
+        self.ed_stage_meas.setObjectName("ed_stage_meas")
+        self.horizontalLayout_82.addWidget(self.ed_stage_meas)
+        self.horizontalLayout_84.addLayout(self.horizontalLayout_82)
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_84.addItem(spacerItem)
+        self.horizontalLayout_84.setStretch(3, 4)
+        self.gridLayout_7.addLayout(self.horizontalLayout_84, 2, 0, 1, 1)
+        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
+        self.table_premeas = QtWidgets.QTableWidget(self.tab_summary_premeasurement)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.table_premeas.setFont(font)
+        self.table_premeas.setObjectName("table_premeas")
+        self.table_premeas.setColumnCount(0)
+        self.table_premeas.setRowCount(0)
+        self.horizontalLayout_5.addWidget(self.table_premeas)
+        self.horizontalLayout_5.setStretch(0, 3)
+        self.gridLayout_7.addLayout(self.horizontalLayout_5, 3, 0, 1, 1)
+        self.tab_summary.addTab(self.tab_summary_premeasurement, "")
+        self.tab_summary_settings = QtWidgets.QWidget()
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tab_summary_settings.sizePolicy().hasHeightForWidth())
+        self.tab_summary_settings.setSizePolicy(sizePolicy)
+        self.tab_summary_settings.setObjectName("tab_summary_settings")
+        self.gridLayout_5 = QtWidgets.QGridLayout(self.tab_summary_settings)
+        self.gridLayout_5.setObjectName("gridLayout_5")
+        self.table_settings = QtWidgets.QTableWidget(self.tab_summary_settings)
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        self.table_settings.setFont(font)
+        self.table_settings.setObjectName("table_settings")
+        self.table_settings.setColumnCount(0)
+        self.table_settings.setRowCount(0)
+        self.gridLayout_5.addWidget(self.table_settings, 0, 0, 1, 1)
+        self.tab_summary.addTab(self.tab_summary_settings, "")
+        self.tab_summary_adcp = QtWidgets.QWidget()
+        self.tab_summary_adcp.setObjectName("tab_summary_adcp")
+        self.gridLayout_6 = QtWidgets.QGridLayout(self.tab_summary_adcp)
+        self.gridLayout_6.setObjectName("gridLayout_6")
+        self.table_adcp = QtWidgets.QTableWidget(self.tab_summary_adcp)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.table_adcp.setFont(font)
+        self.table_adcp.setObjectName("table_adcp")
+        self.table_adcp.setColumnCount(0)
+        self.table_adcp.setRowCount(0)
+        self.gridLayout_6.addWidget(self.table_adcp, 0, 0, 1, 1)
+        self.tab_summary.addTab(self.tab_summary_adcp, "")
+        self.layoutWidget = QtWidgets.QWidget(self.splitter)
+        self.layoutWidget.setObjectName("layoutWidget")
+        self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget)
+        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout.setSpacing(2)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.graphics_wt_contour = QtWidgets.QWidget(self.layoutWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.graphics_wt_contour.sizePolicy().hasHeightForWidth())
+        self.graphics_wt_contour.setSizePolicy(sizePolicy)
+        self.graphics_wt_contour.setMinimumSize(QtCore.QSize(500, 200))
+        self.graphics_wt_contour.setAutoFillBackground(True)
+        self.graphics_wt_contour.setObjectName("graphics_wt_contour")
+        self.horizontalLayout.addWidget(self.graphics_wt_contour)
+        self.graphics_shiptrack = QtWidgets.QWidget(self.layoutWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.graphics_shiptrack.sizePolicy().hasHeightForWidth())
+        self.graphics_shiptrack.setSizePolicy(sizePolicy)
+        self.graphics_shiptrack.setAutoFillBackground(True)
+        self.graphics_shiptrack.setObjectName("graphics_shiptrack")
+        self.horizontalLayout.addWidget(self.graphics_shiptrack)
+        self.horizontalLayout.setStretch(0, 4)
+        self.horizontalLayout.setStretch(1, 2)
+        self.layoutWidget1 = QtWidgets.QWidget(self.splitter)
+        self.layoutWidget1.setObjectName("layoutWidget1")
+        self.horizontalLayout_bottom = QtWidgets.QHBoxLayout(self.layoutWidget1)
+        self.horizontalLayout_bottom.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout_bottom.setObjectName("horizontalLayout_bottom")
+        self.tab_mc = QtWidgets.QTabWidget(self.layoutWidget1)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_mc.setFont(font)
+        self.tab_mc.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_mc.setObjectName("tab_mc")
+        self.tab_mc_messages = QtWidgets.QWidget()
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tab_mc_messages.sizePolicy().hasHeightForWidth())
+        self.tab_mc_messages.setSizePolicy(sizePolicy)
+        self.tab_mc_messages.setObjectName("tab_mc_messages")
+        self.gridLayout_3 = QtWidgets.QGridLayout(self.tab_mc_messages)
+        self.gridLayout_3.setObjectName("gridLayout_3")
+        self.main_message_table = QtWidgets.QTableWidget(self.tab_mc_messages)
+        self.main_message_table.setObjectName("main_message_table")
+        self.main_message_table.setColumnCount(0)
+        self.main_message_table.setRowCount(0)
+        self.gridLayout_3.addWidget(self.main_message_table, 0, 0, 1, 1)
+        self.tab_mc.addTab(self.tab_mc_messages, "")
+        self.tab_mc_comments = QtWidgets.QWidget()
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tab_mc_comments.sizePolicy().hasHeightForWidth())
+        self.tab_mc_comments.setSizePolicy(sizePolicy)
+        self.tab_mc_comments.setObjectName("tab_mc_comments")
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.tab_mc_comments)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.display_comments = QtWidgets.QPlainTextEdit(self.tab_mc_comments)
+        self.display_comments.setReadOnly(True)
+        self.display_comments.setObjectName("display_comments")
+        self.horizontalLayout_2.addWidget(self.display_comments)
+        self.tab_mc.addTab(self.tab_mc_comments, "")
+        self.horizontalLayout_bottom.addWidget(self.tab_mc)
+        self.graphics_main_timeseries = QtWidgets.QWidget(self.layoutWidget1)
+        self.graphics_main_timeseries.setAutoFillBackground(True)
+        self.graphics_main_timeseries.setObjectName("graphics_main_timeseries")
+        self.horizontalLayout_bottom.addWidget(self.graphics_main_timeseries)
+        self.horizontalLayout_bottom.setStretch(0, 4)
+        self.horizontalLayout_bottom.setStretch(1, 2)
+        self.horizontalLayout_76.addWidget(self.splitter)
+        self.verticalLayout_right = QtWidgets.QVBoxLayout()
+        self.verticalLayout_right.setObjectName("verticalLayout_right")
+        self.table_qa = QtWidgets.QTableWidget(self.tab_main)
+        self.table_qa.setObjectName("table_qa")
+        self.table_qa.setColumnCount(0)
+        self.table_qa.setRowCount(0)
+        self.verticalLayout_right.addWidget(self.table_qa)
+        self.uncertainty_lollipop = QtWidgets.QWidget(self.tab_main)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.uncertainty_lollipop.sizePolicy().hasHeightForWidth())
+        self.uncertainty_lollipop.setSizePolicy(sizePolicy)
+        self.uncertainty_lollipop.setObjectName("uncertainty_lollipop")
+        self.verticalLayout_right.addWidget(self.uncertainty_lollipop)
+        self.table_uncertainty = QtWidgets.QTableWidget(self.tab_main)
+        self.table_uncertainty.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
+        self.table_uncertainty.setObjectName("table_uncertainty")
+        self.table_uncertainty.setColumnCount(0)
+        self.table_uncertainty.setRowCount(0)
+        self.table_uncertainty.horizontalHeader().setMinimumSectionSize(49)
+        self.verticalLayout_right.addWidget(self.table_uncertainty)
+        self.horizontalLayout_64 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_64.setObjectName("horizontalLayout_64")
+        self.label_5 = QtWidgets.QLabel(self.tab_main)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_5.setFont(font)
+        self.label_5.setObjectName("label_5")
+        self.horizontalLayout_64.addWidget(self.label_5)
+        self.cb_user_rating = QtWidgets.QComboBox(self.tab_main)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_user_rating.setFont(font)
+        self.cb_user_rating.setObjectName("cb_user_rating")
+        self.cb_user_rating.addItem("")
+        self.cb_user_rating.addItem("")
+        self.cb_user_rating.addItem("")
+        self.cb_user_rating.addItem("")
+        self.cb_user_rating.addItem("")
+        self.horizontalLayout_64.addWidget(self.cb_user_rating)
+        self.verticalLayout_right.addLayout(self.horizontalLayout_64)
+        self.graphics_main_extrap = QtWidgets.QWidget(self.tab_main)
+        self.graphics_main_extrap.setAutoFillBackground(True)
+        self.graphics_main_extrap.setObjectName("graphics_main_extrap")
+        self.verticalLayout_right.addWidget(self.graphics_main_extrap)
+        self.verticalLayout_right.setStretch(0, 15)
+        self.verticalLayout_right.setStretch(2, 45)
+        self.verticalLayout_right.setStretch(4, 40)
+        self.horizontalLayout_76.addLayout(self.verticalLayout_right)
+        self.horizontalLayout_76.setStretch(0, 8)
+        self.horizontalLayout_76.setStretch(1, 2)
+        self.gridLayout_49.addLayout(self.horizontalLayout_76, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_main, "")
+        self.tab_systest = QtWidgets.QWidget()
+        self.tab_systest.setObjectName("tab_systest")
+        self.gridLayout_10 = QtWidgets.QGridLayout(self.tab_systest)
+        self.gridLayout_10.setObjectName("gridLayout_10")
+        self.tab_systest_2 = QtWidgets.QTabWidget(self.tab_systest)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_systest_2.setFont(font)
+        self.tab_systest_2.setTabPosition(QtWidgets.QTabWidget.North)
+        self.tab_systest_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_systest_2.setObjectName("tab_systest_2")
+        self.tab_systest_2_results = QtWidgets.QWidget()
+        self.tab_systest_2_results.setObjectName("tab_systest_2_results")
+        self.gridLayout_8 = QtWidgets.QGridLayout(self.tab_systest_2_results)
+        self.gridLayout_8.setObjectName("gridLayout_8")
+        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
+        self.table_systest = QtWidgets.QTableWidget(self.tab_systest_2_results)
+        self.table_systest.setObjectName("table_systest")
+        self.table_systest.setColumnCount(0)
+        self.table_systest.setRowCount(0)
+        self.horizontalLayout_6.addWidget(self.table_systest)
+        self.display_systest = QtWidgets.QPlainTextEdit(self.tab_systest_2_results)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.display_systest.setFont(font)
+        self.display_systest.setObjectName("display_systest")
+        self.horizontalLayout_6.addWidget(self.display_systest)
+        self.horizontalLayout_6.setStretch(0, 2)
+        self.horizontalLayout_6.setStretch(1, 3)
+        self.gridLayout_8.addLayout(self.horizontalLayout_6, 0, 0, 1, 1)
+        self.tab_systest_2.addTab(self.tab_systest_2_results, "")
+        self.tab_systest_2_messages = QtWidgets.QWidget()
+        self.tab_systest_2_messages.setObjectName("tab_systest_2_messages")
+        self.gridLayout_9 = QtWidgets.QGridLayout(self.tab_systest_2_messages)
+        self.gridLayout_9.setObjectName("gridLayout_9")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.box_systest_messages = QtWidgets.QGroupBox(self.tab_systest_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_systest_messages.setFont(font)
+        self.box_systest_messages.setObjectName("box_systest_messages")
+        self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.box_systest_messages)
+        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
+        self.display_systest_messages = QtWidgets.QPlainTextEdit(self.box_systest_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_systest_messages.setFont(font)
+        self.display_systest_messages.setReadOnly(True)
+        self.display_systest_messages.setObjectName("display_systest_messages")
+        self.horizontalLayout_7.addWidget(self.display_systest_messages)
+        self.verticalLayout_3.addWidget(self.box_systest_messages)
+        self.box_systest_comments = QtWidgets.QGroupBox(self.tab_systest_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_systest_comments.setFont(font)
+        self.box_systest_comments.setObjectName("box_systest_comments")
+        self.horizontalLayout_8 = QtWidgets.QHBoxLayout(self.box_systest_comments)
+        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
+        self.display_systest_comments = QtWidgets.QPlainTextEdit(self.box_systest_comments)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_systest_comments.setFont(font)
+        self.display_systest_comments.setReadOnly(True)
+        self.display_systest_comments.setObjectName("display_systest_comments")
+        self.horizontalLayout_8.addWidget(self.display_systest_comments)
+        self.verticalLayout_3.addWidget(self.box_systest_comments)
+        self.gridLayout_9.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
+        self.tab_systest_2.addTab(self.tab_systest_2_messages, "")
+        self.gridLayout_10.addWidget(self.tab_systest_2, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_systest, "")
+        self.tab_compass = QtWidgets.QWidget()
+        self.tab_compass.setObjectName("tab_compass")
+        self.gridLayout_28 = QtWidgets.QGridLayout(self.tab_compass)
+        self.gridLayout_28.setObjectName("gridLayout_28")
+        self.tab_compass_2 = QtWidgets.QTabWidget(self.tab_compass)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_compass_2.setFont(font)
+        self.tab_compass_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_compass_2.setObjectName("tab_compass_2")
+        self.tab_compass_2_data = QtWidgets.QWidget()
+        self.tab_compass_2_data.setObjectName("tab_compass_2_data")
+        self.gridLayout_11 = QtWidgets.QGridLayout(self.tab_compass_2_data)
+        self.gridLayout_11.setObjectName("gridLayout_11")
+        self.verticalLayout_6 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_6.setObjectName("verticalLayout_6")
+        self.table_compass_pr = QtWidgets.QTableWidget(self.tab_compass_2_data)
+        self.table_compass_pr.setObjectName("table_compass_pr")
+        self.table_compass_pr.setColumnCount(0)
+        self.table_compass_pr.setRowCount(0)
+        self.verticalLayout_6.addWidget(self.table_compass_pr)
+        self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_10.setObjectName("horizontalLayout_10")
+        self.graph_heading = QtWidgets.QWidget(self.tab_compass_2_data)
+        self.graph_heading.setObjectName("graph_heading")
+        self.horizontalLayout_10.addWidget(self.graph_heading)
+        self.verticalLayout_4 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_4.setObjectName("verticalLayout_4")
+        self.cb_adcp_compass = QtWidgets.QCheckBox(self.tab_compass_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
+        self.cb_adcp_compass.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.cb_adcp_compass.setFont(font)
+        self.cb_adcp_compass.setChecked(True)
+        self.cb_adcp_compass.setObjectName("cb_adcp_compass")
+        self.verticalLayout_4.addWidget(self.cb_adcp_compass)
+        self.cb_ext_compass = QtWidgets.QCheckBox(self.tab_compass_2_data)
+        self.cb_ext_compass.setEnabled(False)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_ext_compass.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.cb_ext_compass.setFont(font)
+        self.cb_ext_compass.setObjectName("cb_ext_compass")
+        self.verticalLayout_4.addWidget(self.cb_ext_compass)
+        self.cb_mag_field = QtWidgets.QCheckBox(self.tab_compass_2_data)
+        self.cb_mag_field.setEnabled(False)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.cb_mag_field.setFont(font)
+        self.cb_mag_field.setObjectName("cb_mag_field")
+        self.verticalLayout_4.addWidget(self.cb_mag_field)
+        self.horizontalLayout_10.addLayout(self.verticalLayout_4)
+        self.horizontalLayout_10.setStretch(0, 10)
+        self.horizontalLayout_10.setStretch(1, 2)
+        self.verticalLayout_6.addLayout(self.horizontalLayout_10)
+        self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_9.setObjectName("horizontalLayout_9")
+        self.graph_pr = QtWidgets.QWidget(self.tab_compass_2_data)
+        self.graph_pr.setObjectName("graph_pr")
+        self.horizontalLayout_9.addWidget(self.graph_pr)
+        self.verticalLayout_5 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_5.setObjectName("verticalLayout_5")
+        self.cb_pitch = QtWidgets.QCheckBox(self.tab_compass_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_pitch.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.cb_pitch.setFont(font)
+        self.cb_pitch.setChecked(True)
+        self.cb_pitch.setObjectName("cb_pitch")
+        self.verticalLayout_5.addWidget(self.cb_pitch)
+        self.cb_roll = QtWidgets.QCheckBox(self.tab_compass_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_roll.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.cb_roll.setFont(font)
+        self.cb_roll.setChecked(True)
+        self.cb_roll.setObjectName("cb_roll")
+        self.verticalLayout_5.addWidget(self.cb_roll)
+        self.verticalLayout_5.setStretch(0, 9)
+        self.verticalLayout_5.setStretch(1, 1)
+        self.horizontalLayout_9.addLayout(self.verticalLayout_5)
+        self.horizontalLayout_9.setStretch(0, 10)
+        self.horizontalLayout_9.setStretch(1, 2)
+        self.verticalLayout_6.addLayout(self.horizontalLayout_9)
+        self.verticalLayout_6.setStretch(0, 3)
+        self.verticalLayout_6.setStretch(1, 4)
+        self.verticalLayout_6.setStretch(2, 4)
+        self.gridLayout_11.addLayout(self.verticalLayout_6, 0, 0, 1, 1)
+        self.tab_compass_2.addTab(self.tab_compass_2_data, "")
+        self.tab_compass_2_cal = QtWidgets.QWidget()
+        self.tab_compass_2_cal.setObjectName("tab_compass_2_cal")
+        self.gridLayout_14 = QtWidgets.QGridLayout(self.tab_compass_2_cal)
+        self.gridLayout_14.setObjectName("gridLayout_14")
+        self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_11.setObjectName("horizontalLayout_11")
+        self.verticalLayout_7 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_7.setObjectName("verticalLayout_7")
+        self.groupBox_cal = QtWidgets.QGroupBox(self.tab_compass_2_cal)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.groupBox_cal.setFont(font)
+        self.groupBox_cal.setObjectName("groupBox_cal")
+        self.gridLayout_12 = QtWidgets.QGridLayout(self.groupBox_cal)
+        self.gridLayout_12.setObjectName("gridLayout_12")
+        self.table_compass_cal = QtWidgets.QTableWidget(self.groupBox_cal)
+        self.table_compass_cal.setObjectName("table_compass_cal")
+        self.table_compass_cal.setColumnCount(0)
+        self.table_compass_cal.setRowCount(0)
+        self.gridLayout_12.addWidget(self.table_compass_cal, 0, 0, 1, 1)
+        self.verticalLayout_7.addWidget(self.groupBox_cal)
+        self.groupBox_eval = QtWidgets.QGroupBox(self.tab_compass_2_cal)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.groupBox_eval.setFont(font)
+        self.groupBox_eval.setObjectName("groupBox_eval")
+        self.gridLayout_13 = QtWidgets.QGridLayout(self.groupBox_eval)
+        self.gridLayout_13.setObjectName("gridLayout_13")
+        self.table_compass_eval = QtWidgets.QTableWidget(self.groupBox_eval)
+        self.table_compass_eval.setObjectName("table_compass_eval")
+        self.table_compass_eval.setColumnCount(0)
+        self.table_compass_eval.setRowCount(0)
+        self.gridLayout_13.addWidget(self.table_compass_eval, 0, 0, 1, 1)
+        self.verticalLayout_7.addWidget(self.groupBox_eval)
+        self.horizontalLayout_11.addLayout(self.verticalLayout_7)
+        self.display_compass_result = QtWidgets.QTextEdit(self.tab_compass_2_cal)
+        self.display_compass_result.setObjectName("display_compass_result")
+        self.horizontalLayout_11.addWidget(self.display_compass_result)
+        self.horizontalLayout_11.setStretch(0, 1)
+        self.horizontalLayout_11.setStretch(1, 2)
+        self.gridLayout_14.addLayout(self.horizontalLayout_11, 0, 0, 1, 1)
+        self.tab_compass_2.addTab(self.tab_compass_2_cal, "")
+        self.tab_compass_2_messages = QtWidgets.QWidget()
+        self.tab_compass_2_messages.setObjectName("tab_compass_2_messages")
+        self.gridLayout_15 = QtWidgets.QGridLayout(self.tab_compass_2_messages)
+        self.gridLayout_15.setObjectName("gridLayout_15")
+        self.verticalLayout_8 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_8.setObjectName("verticalLayout_8")
+        self.box_compass_messages = QtWidgets.QGroupBox(self.tab_compass_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_compass_messages.setFont(font)
+        self.box_compass_messages.setObjectName("box_compass_messages")
+        self.horizontalLayout_12 = QtWidgets.QHBoxLayout(self.box_compass_messages)
+        self.horizontalLayout_12.setObjectName("horizontalLayout_12")
+        self.display_compass_messages = QtWidgets.QPlainTextEdit(self.box_compass_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_compass_messages.setFont(font)
+        self.display_compass_messages.setReadOnly(True)
+        self.display_compass_messages.setObjectName("display_compass_messages")
+        self.horizontalLayout_12.addWidget(self.display_compass_messages)
+        self.verticalLayout_8.addWidget(self.box_compass_messages)
+        self.box_compass_comments = QtWidgets.QGroupBox(self.tab_compass_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_compass_comments.setFont(font)
+        self.box_compass_comments.setObjectName("box_compass_comments")
+        self.horizontalLayout_13 = QtWidgets.QHBoxLayout(self.box_compass_comments)
+        self.horizontalLayout_13.setObjectName("horizontalLayout_13")
+        self.display_compass_comments = QtWidgets.QPlainTextEdit(self.box_compass_comments)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_compass_comments.setFont(font)
+        self.display_compass_comments.setReadOnly(True)
+        self.display_compass_comments.setObjectName("display_compass_comments")
+        self.horizontalLayout_13.addWidget(self.display_compass_comments)
+        self.verticalLayout_8.addWidget(self.box_compass_comments)
+        self.gridLayout_15.addLayout(self.verticalLayout_8, 0, 0, 1, 1)
+        self.tab_compass_2.addTab(self.tab_compass_2_messages, "")
+        self.gridLayout_28.addWidget(self.tab_compass_2, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_compass, "")
+        self.tab_tempsal = QtWidgets.QWidget()
+        self.tab_tempsal.setObjectName("tab_tempsal")
+        self.gridLayout_18 = QtWidgets.QGridLayout(self.tab_tempsal)
+        self.gridLayout_18.setObjectName("gridLayout_18")
+        self.tab_tempsal_2 = QtWidgets.QTabWidget(self.tab_tempsal)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_tempsal_2.setFont(font)
+        self.tab_tempsal_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_tempsal_2.setObjectName("tab_tempsal_2")
+        self.tab_tempsal_2_data = QtWidgets.QWidget()
+        self.tab_tempsal_2_data.setObjectName("tab_tempsal_2_data")
+        self.gridLayout_19 = QtWidgets.QGridLayout(self.tab_tempsal_2_data)
+        self.gridLayout_19.setObjectName("gridLayout_19")
+        self.verticalLayout_11 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_11.setObjectName("verticalLayout_11")
+        self.table_tempsal = QtWidgets.QTableWidget(self.tab_tempsal_2_data)
+        self.table_tempsal.setObjectName("table_tempsal")
+        self.table_tempsal.setColumnCount(0)
+        self.table_tempsal.setRowCount(0)
+        self.verticalLayout_11.addWidget(self.table_tempsal)
+        self.gb_temp = QtWidgets.QGroupBox(self.tab_tempsal_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_temp.setFont(font)
+        self.gb_temp.setObjectName("gb_temp")
+        self.gridLayout_17 = QtWidgets.QGridLayout(self.gb_temp)
+        self.gridLayout_17.setObjectName("gridLayout_17")
+        self.horizontalLayout_14 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_14.setObjectName("horizontalLayout_14")
+        self.verticalLayout_10 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_10.setObjectName("verticalLayout_10")
+        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_10.addItem(spacerItem1)
+        self.gridLayout_16 = QtWidgets.QGridLayout()
+        self.gridLayout_16.setObjectName("gridLayout_16")
+        self.label_independent = QtWidgets.QLabel(self.gb_temp)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_independent.setFont(font)
+        self.label_independent.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+        self.label_independent.setObjectName("label_independent")
+        self.gridLayout_16.addWidget(self.label_independent, 0, 0, 1, 1)
+        self.ed_user_temp = QtWidgets.QLineEdit(self.gb_temp)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_user_temp.setFont(font)
+        self.ed_user_temp.setObjectName("ed_user_temp")
+        self.gridLayout_16.addWidget(self.ed_user_temp, 0, 1, 1, 1)
+        self.pb_ind_temp_apply = QtWidgets.QPushButton(self.gb_temp)
+        self.pb_ind_temp_apply.setEnabled(False)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.pb_ind_temp_apply.setFont(font)
+        self.pb_ind_temp_apply.setObjectName("pb_ind_temp_apply")
+        self.gridLayout_16.addWidget(self.pb_ind_temp_apply, 0, 2, 1, 1)
+        self.label_adcp = QtWidgets.QLabel(self.gb_temp)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_adcp.setFont(font)
+        self.label_adcp.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+        self.label_adcp.setObjectName("label_adcp")
+        self.gridLayout_16.addWidget(self.label_adcp, 1, 0, 1, 1)
+        self.ed_adcp_temp = QtWidgets.QLineEdit(self.gb_temp)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_adcp_temp.setFont(font)
+        self.ed_adcp_temp.setObjectName("ed_adcp_temp")
+        self.gridLayout_16.addWidget(self.ed_adcp_temp, 1, 1, 1, 1)
+        self.pb_adcp_temp_apply = QtWidgets.QPushButton(self.gb_temp)
+        self.pb_adcp_temp_apply.setEnabled(False)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.pb_adcp_temp_apply.setFont(font)
+        self.pb_adcp_temp_apply.setObjectName("pb_adcp_temp_apply")
+        self.gridLayout_16.addWidget(self.pb_adcp_temp_apply, 1, 2, 1, 1)
+        self.label_adcp_avg = QtWidgets.QLabel(self.gb_temp)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_adcp_avg.setFont(font)
+        self.label_adcp_avg.setObjectName("label_adcp_avg")
+        self.gridLayout_16.addWidget(self.label_adcp_avg, 2, 0, 1, 1)
+        self.txt_adcp_avg = QtWidgets.QLabel(self.gb_temp)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_adcp_avg.setFont(font)
+        self.txt_adcp_avg.setObjectName("txt_adcp_avg")
+        self.gridLayout_16.addWidget(self.txt_adcp_avg, 2, 1, 1, 1)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout_16.addItem(spacerItem2, 2, 2, 1, 1)
+        self.gridLayout_16.setColumnMinimumWidth(0, 2)
+        self.gridLayout_16.setColumnMinimumWidth(1, 1)
+        self.gridLayout_16.setColumnMinimumWidth(2, 1)
+        self.verticalLayout_10.addLayout(self.gridLayout_16)
+        self.verticalLayout_9 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_9.setObjectName("verticalLayout_9")
+        self.rb_f = QtWidgets.QRadioButton(self.gb_temp)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_f.setFont(font)
+        self.rb_f.setObjectName("rb_f")
+        self.verticalLayout_9.addWidget(self.rb_f)
+        self.rb_c = QtWidgets.QRadioButton(self.gb_temp)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_c.setFont(font)
+        self.rb_c.setChecked(True)
+        self.rb_c.setObjectName("rb_c")
+        self.verticalLayout_9.addWidget(self.rb_c)
+        self.verticalLayout_10.addLayout(self.verticalLayout_9)
+        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_10.addItem(spacerItem3)
+        self.horizontalLayout_14.addLayout(self.verticalLayout_10)
+        self.graph_temperature = QtWidgets.QWidget(self.gb_temp)
+        self.graph_temperature.setObjectName("graph_temperature")
+        self.horizontalLayout_14.addWidget(self.graph_temperature)
+        self.horizontalLayout_14.setStretch(0, 1)
+        self.horizontalLayout_14.setStretch(1, 4)
+        self.gridLayout_17.addLayout(self.horizontalLayout_14, 0, 0, 1, 1)
+        self.verticalLayout_11.addWidget(self.gb_temp)
+        self.verticalLayout_11.setStretch(0, 3)
+        self.verticalLayout_11.setStretch(1, 5)
+        self.gridLayout_19.addLayout(self.verticalLayout_11, 0, 0, 1, 1)
+        self.tab_tempsal_2.addTab(self.tab_tempsal_2_data, "")
+        self.tab_tempsal_2_messages = QtWidgets.QWidget()
+        self.tab_tempsal_2_messages.setObjectName("tab_tempsal_2_messages")
+        self.gridLayout_20 = QtWidgets.QGridLayout(self.tab_tempsal_2_messages)
+        self.gridLayout_20.setObjectName("gridLayout_20")
+        self.verticalLayout_12 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_12.setObjectName("verticalLayout_12")
+        self.box_compass_messages_2 = QtWidgets.QGroupBox(self.tab_tempsal_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_compass_messages_2.setFont(font)
+        self.box_compass_messages_2.setObjectName("box_compass_messages_2")
+        self.horizontalLayout_15 = QtWidgets.QHBoxLayout(self.box_compass_messages_2)
+        self.horizontalLayout_15.setObjectName("horizontalLayout_15")
+        self.display_tempsal_messages = QtWidgets.QPlainTextEdit(self.box_compass_messages_2)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_tempsal_messages.setFont(font)
+        self.display_tempsal_messages.setReadOnly(True)
+        self.display_tempsal_messages.setObjectName("display_tempsal_messages")
+        self.horizontalLayout_15.addWidget(self.display_tempsal_messages)
+        self.verticalLayout_12.addWidget(self.box_compass_messages_2)
+        self.box_compass_comments_2 = QtWidgets.QGroupBox(self.tab_tempsal_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_compass_comments_2.setFont(font)
+        self.box_compass_comments_2.setObjectName("box_compass_comments_2")
+        self.horizontalLayout_16 = QtWidgets.QHBoxLayout(self.box_compass_comments_2)
+        self.horizontalLayout_16.setObjectName("horizontalLayout_16")
+        self.display_tempsal_comments = QtWidgets.QPlainTextEdit(self.box_compass_comments_2)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_tempsal_comments.setFont(font)
+        self.display_tempsal_comments.setReadOnly(True)
+        self.display_tempsal_comments.setObjectName("display_tempsal_comments")
+        self.horizontalLayout_16.addWidget(self.display_tempsal_comments)
+        self.verticalLayout_12.addWidget(self.box_compass_comments_2)
+        self.gridLayout_20.addLayout(self.verticalLayout_12, 0, 0, 1, 1)
+        self.tab_tempsal_2.addTab(self.tab_tempsal_2_messages, "")
+        self.gridLayout_18.addWidget(self.tab_tempsal_2, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_tempsal, "")
+        self.tab_mbt = QtWidgets.QWidget()
+        self.tab_mbt.setObjectName("tab_mbt")
+        self.gridLayout_23 = QtWidgets.QGridLayout(self.tab_mbt)
+        self.gridLayout_23.setObjectName("gridLayout_23")
+        self.tab_mtb_2 = QtWidgets.QTabWidget(self.tab_mbt)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_mtb_2.setFont(font)
+        self.tab_mtb_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_mtb_2.setObjectName("tab_mtb_2")
+        self.tab_mbt_2_data = QtWidgets.QWidget()
+        self.tab_mbt_2_data.setObjectName("tab_mbt_2_data")
+        self.gridLayout_22 = QtWidgets.QGridLayout(self.tab_mbt_2_data)
+        self.gridLayout_22.setObjectName("gridLayout_22")
+        self.verticalLayout_14 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_14.setObjectName("verticalLayout_14")
+        self.table_moving_bed = QtWidgets.QTableWidget(self.tab_mbt_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.table_moving_bed.setFont(font)
+        self.table_moving_bed.setObjectName("table_moving_bed")
+        self.table_moving_bed.setColumnCount(0)
+        self.table_moving_bed.setRowCount(0)
+        self.verticalLayout_14.addWidget(self.table_moving_bed)
+        self.cb_mb_observed_no = QtWidgets.QCheckBox(self.tab_mbt_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.cb_mb_observed_no.setFont(font)
+        self.cb_mb_observed_no.setObjectName("cb_mb_observed_no")
+        self.verticalLayout_14.addWidget(self.cb_mb_observed_no)
+        self.txt_mb_plotted = QtWidgets.QLabel(self.tab_mbt_2_data)
+        self.txt_mb_plotted.setText("")
+        self.txt_mb_plotted.setAlignment(QtCore.Qt.AlignCenter)
+        self.txt_mb_plotted.setObjectName("txt_mb_plotted")
+        self.verticalLayout_14.addWidget(self.txt_mb_plotted)
+        self.horizontalLayout_18 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_18.setObjectName("horizontalLayout_18")
+        self.graph_mb_ts = QtWidgets.QWidget(self.tab_mbt_2_data)
+        self.graph_mb_ts.setObjectName("graph_mb_ts")
+        self.horizontalLayout_18.addWidget(self.graph_mb_ts)
+        self.gb_mb_st = QtWidgets.QGroupBox(self.tab_mbt_2_data)
+        self.gb_mb_st.setTitle("")
+        self.gb_mb_st.setObjectName("gb_mb_st")
+        self.gridLayout_21 = QtWidgets.QGridLayout(self.gb_mb_st)
+        self.gridLayout_21.setObjectName("gridLayout_21")
+        self.verticalLayout_13 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_13.setObjectName("verticalLayout_13")
+        self.horizontalLayout_17 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_17.setObjectName("horizontalLayout_17")
+        self.cb_mb_bt = QtWidgets.QCheckBox(self.gb_mb_st)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
+        self.cb_mb_bt.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_mb_bt.setFont(font)
+        self.cb_mb_bt.setChecked(True)
+        self.cb_mb_bt.setObjectName("cb_mb_bt")
+        self.horizontalLayout_17.addWidget(self.cb_mb_bt)
+        self.cb_mb_gga = QtWidgets.QCheckBox(self.gb_mb_st)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_mb_gga.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_mb_gga.setFont(font)
+        self.cb_mb_gga.setObjectName("cb_mb_gga")
+        self.horizontalLayout_17.addWidget(self.cb_mb_gga)
+        self.cb_mb_vtg = QtWidgets.QCheckBox(self.gb_mb_st)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_mb_vtg.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_mb_vtg.setFont(font)
+        self.cb_mb_vtg.setObjectName("cb_mb_vtg")
+        self.horizontalLayout_17.addWidget(self.cb_mb_vtg)
+        self.cb_mb_vectors = QtWidgets.QCheckBox(self.gb_mb_st)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_mb_vectors.setFont(font)
+        self.cb_mb_vectors.setChecked(True)
+        self.cb_mb_vectors.setObjectName("cb_mb_vectors")
+        self.horizontalLayout_17.addWidget(self.cb_mb_vectors)
+        self.verticalLayout_13.addLayout(self.horizontalLayout_17)
+        self.graph_mb_st = QtWidgets.QWidget(self.gb_mb_st)
+        self.graph_mb_st.setObjectName("graph_mb_st")
+        self.verticalLayout_13.addWidget(self.graph_mb_st)
+        self.verticalLayout_13.setStretch(0, 1)
+        self.verticalLayout_13.setStretch(1, 8)
+        self.gridLayout_21.addLayout(self.verticalLayout_13, 0, 0, 1, 1)
+        self.horizontalLayout_18.addWidget(self.gb_mb_st)
+        self.horizontalLayout_18.setStretch(0, 4)
+        self.horizontalLayout_18.setStretch(1, 2)
+        self.verticalLayout_14.addLayout(self.horizontalLayout_18)
+        self.verticalLayout_14.setStretch(0, 1)
+        self.verticalLayout_14.setStretch(3, 2)
+        self.gridLayout_22.addLayout(self.verticalLayout_14, 0, 0, 1, 1)
+        self.tab_mtb_2.addTab(self.tab_mbt_2_data, "")
+        self.tab_mbt_2_messages = QtWidgets.QWidget()
+        self.tab_mbt_2_messages.setObjectName("tab_mbt_2_messages")
+        self.gridLayout_24 = QtWidgets.QGridLayout(self.tab_mbt_2_messages)
+        self.gridLayout_24.setObjectName("gridLayout_24")
+        self.box_mb_messages = QtWidgets.QGroupBox(self.tab_mbt_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_mb_messages.setFont(font)
+        self.box_mb_messages.setObjectName("box_mb_messages")
+        self.horizontalLayout_20 = QtWidgets.QHBoxLayout(self.box_mb_messages)
+        self.horizontalLayout_20.setObjectName("horizontalLayout_20")
+        self.display_mb_messages = QtWidgets.QPlainTextEdit(self.box_mb_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_mb_messages.setFont(font)
+        self.display_mb_messages.setReadOnly(True)
+        self.display_mb_messages.setObjectName("display_mb_messages")
+        self.horizontalLayout_20.addWidget(self.display_mb_messages)
+        self.gridLayout_24.addWidget(self.box_mb_messages, 0, 0, 1, 1)
+        self.box_mb_comments = QtWidgets.QGroupBox(self.tab_mbt_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_mb_comments.setFont(font)
+        self.box_mb_comments.setObjectName("box_mb_comments")
+        self.horizontalLayout_19 = QtWidgets.QHBoxLayout(self.box_mb_comments)
+        self.horizontalLayout_19.setObjectName("horizontalLayout_19")
+        self.display_mb_comments = QtWidgets.QPlainTextEdit(self.box_mb_comments)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_mb_comments.setFont(font)
+        self.display_mb_comments.setReadOnly(True)
+        self.display_mb_comments.setObjectName("display_mb_comments")
+        self.horizontalLayout_19.addWidget(self.display_mb_comments)
+        self.gridLayout_24.addWidget(self.box_mb_comments, 1, 0, 1, 1)
+        self.tab_mtb_2.addTab(self.tab_mbt_2_messages, "")
+        self.gridLayout_23.addWidget(self.tab_mtb_2, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_mbt, "")
+        self.tab_bt = QtWidgets.QWidget()
+        self.tab_bt.setObjectName("tab_bt")
+        self.gridLayout_33 = QtWidgets.QGridLayout(self.tab_bt)
+        self.gridLayout_33.setObjectName("gridLayout_33")
+        self.tab_bt_2 = QtWidgets.QTabWidget(self.tab_bt)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_bt_2.setFont(font)
+        self.tab_bt_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_bt_2.setObjectName("tab_bt_2")
+        self.tab_bt_2_data = QtWidgets.QWidget()
+        self.tab_bt_2_data.setObjectName("tab_bt_2_data")
+        self.gridLayout_26 = QtWidgets.QGridLayout(self.tab_bt_2_data)
+        self.gridLayout_26.setObjectName("gridLayout_26")
+        self.verticalLayout_18 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_18.setObjectName("verticalLayout_18")
+        self.table_bt = QtWidgets.QTableWidget(self.tab_bt_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.table_bt.setFont(font)
+        self.table_bt.setObjectName("table_bt")
+        self.table_bt.setColumnCount(0)
+        self.table_bt.setRowCount(0)
+        self.verticalLayout_18.addWidget(self.table_bt)
+        self.horizontalLayout_22 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_22.setObjectName("horizontalLayout_22")
+        self.verticalLayout_17 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_17.setObjectName("verticalLayout_17")
+        self.gb_bt_radio = QtWidgets.QGroupBox(self.tab_bt_2_data)
+        self.gb_bt_radio.setTitle("")
+        self.gb_bt_radio.setObjectName("gb_bt_radio")
+        self.verticalLayout_16 = QtWidgets.QVBoxLayout(self.gb_bt_radio)
+        self.verticalLayout_16.setObjectName("verticalLayout_16")
+        self.horizontalLayout_21 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_21.setObjectName("horizontalLayout_21")
+        self.rb_bt_beam = QtWidgets.QRadioButton(self.gb_bt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_bt_beam.setFont(font)
+        self.rb_bt_beam.setChecked(True)
+        self.rb_bt_beam.setObjectName("rb_bt_beam")
+        self.horizontalLayout_21.addWidget(self.rb_bt_beam)
+        self.rb_bt_error = QtWidgets.QRadioButton(self.gb_bt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_bt_error.setFont(font)
+        self.rb_bt_error.setObjectName("rb_bt_error")
+        self.horizontalLayout_21.addWidget(self.rb_bt_error)
+        self.rb_bt_vert = QtWidgets.QRadioButton(self.gb_bt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_bt_vert.setFont(font)
+        self.rb_bt_vert.setObjectName("rb_bt_vert")
+        self.horizontalLayout_21.addWidget(self.rb_bt_vert)
+        self.rb_bt_other = QtWidgets.QRadioButton(self.gb_bt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_bt_other.setFont(font)
+        self.rb_bt_other.setObjectName("rb_bt_other")
+        self.horizontalLayout_21.addWidget(self.rb_bt_other)
+        self.rb_bt_source = QtWidgets.QRadioButton(self.gb_bt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_bt_source.setFont(font)
+        self.rb_bt_source.setObjectName("rb_bt_source")
+        self.horizontalLayout_21.addWidget(self.rb_bt_source)
+        self.verticalLayout_16.addLayout(self.horizontalLayout_21)
+        self.graph_bt_ts = QtWidgets.QWidget(self.gb_bt_radio)
+        self.graph_bt_ts.setObjectName("graph_bt_ts")
+        self.verticalLayout_16.addWidget(self.graph_bt_ts)
+        self.verticalLayout_16.setStretch(0, 1)
+        self.verticalLayout_16.setStretch(1, 4)
+        self.verticalLayout_17.addWidget(self.gb_bt_radio)
+        self.verticalLayout_17.setStretch(0, 4)
+        self.horizontalLayout_22.addLayout(self.verticalLayout_17)
+        self.verticalLayout_20 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_20.setObjectName("verticalLayout_20")
+        self.horizontalLayout_30 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_30.setObjectName("horizontalLayout_30")
+        self.cb_bt_bt = QtWidgets.QCheckBox(self.tab_bt_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
+        self.cb_bt_bt.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_bt_bt.setFont(font)
+        self.cb_bt_bt.setChecked(True)
+        self.cb_bt_bt.setObjectName("cb_bt_bt")
+        self.horizontalLayout_30.addWidget(self.cb_bt_bt)
+        self.cb_bt_gga = QtWidgets.QCheckBox(self.tab_bt_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_bt_gga.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_bt_gga.setFont(font)
+        self.cb_bt_gga.setObjectName("cb_bt_gga")
+        self.horizontalLayout_30.addWidget(self.cb_bt_gga)
+        self.cb_bt_vtg = QtWidgets.QCheckBox(self.tab_bt_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_bt_vtg.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_bt_vtg.setFont(font)
+        self.cb_bt_vtg.setObjectName("cb_bt_vtg")
+        self.horizontalLayout_30.addWidget(self.cb_bt_vtg)
+        self.cb_bt_vectors = QtWidgets.QCheckBox(self.tab_bt_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_bt_vectors.setFont(font)
+        self.cb_bt_vectors.setChecked(True)
+        self.cb_bt_vectors.setObjectName("cb_bt_vectors")
+        self.horizontalLayout_30.addWidget(self.cb_bt_vectors)
+        self.verticalLayout_20.addLayout(self.horizontalLayout_30)
+        self.graph_bt_st = QtWidgets.QWidget(self.tab_bt_2_data)
+        self.graph_bt_st.setObjectName("graph_bt_st")
+        self.verticalLayout_20.addWidget(self.graph_bt_st)
+        self.verticalLayout_20.setStretch(0, 1)
+        self.verticalLayout_20.setStretch(1, 8)
+        self.horizontalLayout_22.addLayout(self.verticalLayout_20)
+        self.gb_bt_filters = QtWidgets.QGroupBox(self.tab_bt_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_bt_filters.setFont(font)
+        self.gb_bt_filters.setObjectName("gb_bt_filters")
+        self.verticalLayout_15 = QtWidgets.QVBoxLayout(self.gb_bt_filters)
+        self.verticalLayout_15.setObjectName("verticalLayout_15")
+        self.gb_bt_3beam = QtWidgets.QGroupBox(self.gb_bt_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_bt_3beam.setFont(font)
+        self.gb_bt_3beam.setObjectName("gb_bt_3beam")
+        self.verticalLayout_21 = QtWidgets.QVBoxLayout(self.gb_bt_3beam)
+        self.verticalLayout_21.setObjectName("verticalLayout_21")
+        self.combo_bt_3beam = QtWidgets.QComboBox(self.gb_bt_3beam)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_bt_3beam.setFont(font)
+        self.combo_bt_3beam.setObjectName("combo_bt_3beam")
+        self.combo_bt_3beam.addItem("")
+        self.combo_bt_3beam.addItem("")
+        self.combo_bt_3beam.addItem("")
+        self.verticalLayout_21.addWidget(self.combo_bt_3beam)
+        self.verticalLayout_15.addWidget(self.gb_bt_3beam)
+        self.gb_bt_error_velocity = QtWidgets.QGroupBox(self.gb_bt_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_bt_error_velocity.setFont(font)
+        self.gb_bt_error_velocity.setObjectName("gb_bt_error_velocity")
+        self.verticalLayout_22 = QtWidgets.QVBoxLayout(self.gb_bt_error_velocity)
+        self.verticalLayout_22.setObjectName("verticalLayout_22")
+        self.combo_bt_error_velocity = QtWidgets.QComboBox(self.gb_bt_error_velocity)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_bt_error_velocity.setFont(font)
+        self.combo_bt_error_velocity.setObjectName("combo_bt_error_velocity")
+        self.combo_bt_error_velocity.addItem("")
+        self.combo_bt_error_velocity.addItem("")
+        self.combo_bt_error_velocity.addItem("")
+        self.verticalLayout_22.addWidget(self.combo_bt_error_velocity)
+        self.horizontalLayout_29 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_29.setObjectName("horizontalLayout_29")
+        self.txt_bt_error_velocity = QtWidgets.QLabel(self.gb_bt_error_velocity)
+        self.txt_bt_error_velocity.setMaximumSize(QtCore.QSize(16777215, 20))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_bt_error_velocity.setFont(font)
+        self.txt_bt_error_velocity.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.txt_bt_error_velocity.setObjectName("txt_bt_error_velocity")
+        self.horizontalLayout_29.addWidget(self.txt_bt_error_velocity)
+        self.ed_bt_error_vel_threshold = QtWidgets.QLineEdit(self.gb_bt_error_velocity)
+        self.ed_bt_error_vel_threshold.setEnabled(False)
+        self.ed_bt_error_vel_threshold.setObjectName("ed_bt_error_vel_threshold")
+        self.horizontalLayout_29.addWidget(self.ed_bt_error_vel_threshold)
+        self.horizontalLayout_29.setStretch(0, 2)
+        self.verticalLayout_22.addLayout(self.horizontalLayout_29)
+        self.verticalLayout_15.addWidget(self.gb_bt_error_velocity)
+        self.gb_bt_vertical_velocity = QtWidgets.QGroupBox(self.gb_bt_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_bt_vertical_velocity.setFont(font)
+        self.gb_bt_vertical_velocity.setObjectName("gb_bt_vertical_velocity")
+        self.verticalLayout_23 = QtWidgets.QVBoxLayout(self.gb_bt_vertical_velocity)
+        self.verticalLayout_23.setObjectName("verticalLayout_23")
+        self.combo_bt_vert_velocity = QtWidgets.QComboBox(self.gb_bt_vertical_velocity)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_bt_vert_velocity.setFont(font)
+        self.combo_bt_vert_velocity.setObjectName("combo_bt_vert_velocity")
+        self.combo_bt_vert_velocity.addItem("")
+        self.combo_bt_vert_velocity.addItem("")
+        self.combo_bt_vert_velocity.addItem("")
+        self.verticalLayout_23.addWidget(self.combo_bt_vert_velocity)
+        self.horizontalLayout_31 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_31.setObjectName("horizontalLayout_31")
+        self.txt_bt_vert_velocity = QtWidgets.QLabel(self.gb_bt_vertical_velocity)
+        self.txt_bt_vert_velocity.setMaximumSize(QtCore.QSize(16777215, 20))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_bt_vert_velocity.setFont(font)
+        self.txt_bt_vert_velocity.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.txt_bt_vert_velocity.setObjectName("txt_bt_vert_velocity")
+        self.horizontalLayout_31.addWidget(self.txt_bt_vert_velocity)
+        self.ed_bt_vert_vel_threshold = QtWidgets.QLineEdit(self.gb_bt_vertical_velocity)
+        self.ed_bt_vert_vel_threshold.setEnabled(False)
+        self.ed_bt_vert_vel_threshold.setObjectName("ed_bt_vert_vel_threshold")
+        self.horizontalLayout_31.addWidget(self.ed_bt_vert_vel_threshold)
+        self.horizontalLayout_31.setStretch(0, 2)
+        self.verticalLayout_23.addLayout(self.horizontalLayout_31)
+        self.verticalLayout_15.addWidget(self.gb_bt_vertical_velocity)
+        self.gb_bt_other = QtWidgets.QGroupBox(self.gb_bt_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_bt_other.setFont(font)
+        self.gb_bt_other.setObjectName("gb_bt_other")
+        self.verticalLayout_24 = QtWidgets.QVBoxLayout(self.gb_bt_other)
+        self.verticalLayout_24.setObjectName("verticalLayout_24")
+        self.combo_bt_other = QtWidgets.QComboBox(self.gb_bt_other)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_bt_other.setFont(font)
+        self.combo_bt_other.setObjectName("combo_bt_other")
+        self.combo_bt_other.addItem("")
+        self.combo_bt_other.addItem("")
+        self.verticalLayout_24.addWidget(self.combo_bt_other)
+        self.verticalLayout_15.addWidget(self.gb_bt_other)
+        self.horizontalLayout_22.addWidget(self.gb_bt_filters)
+        self.horizontalLayout_22.setStretch(0, 6)
+        self.horizontalLayout_22.setStretch(1, 3)
+        self.horizontalLayout_22.setStretch(2, 1)
+        self.verticalLayout_18.addLayout(self.horizontalLayout_22)
+        self.verticalLayout_18.setStretch(0, 2)
+        self.verticalLayout_18.setStretch(1, 4)
+        self.gridLayout_26.addLayout(self.verticalLayout_18, 0, 0, 1, 1)
+        self.tab_bt_2.addTab(self.tab_bt_2_data, "")
+        self.tab_bt_2_messages = QtWidgets.QWidget()
+        self.tab_bt_2_messages.setObjectName("tab_bt_2_messages")
+        self.verticalLayout_19 = QtWidgets.QVBoxLayout(self.tab_bt_2_messages)
+        self.verticalLayout_19.setObjectName("verticalLayout_19")
+        self.box_bt_messages = QtWidgets.QGroupBox(self.tab_bt_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_bt_messages.setFont(font)
+        self.box_bt_messages.setObjectName("box_bt_messages")
+        self.horizontalLayout_23 = QtWidgets.QHBoxLayout(self.box_bt_messages)
+        self.horizontalLayout_23.setObjectName("horizontalLayout_23")
+        self.display_bt_messages = QtWidgets.QPlainTextEdit(self.box_bt_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_bt_messages.setFont(font)
+        self.display_bt_messages.setReadOnly(True)
+        self.display_bt_messages.setObjectName("display_bt_messages")
+        self.horizontalLayout_23.addWidget(self.display_bt_messages)
+        self.verticalLayout_19.addWidget(self.box_bt_messages)
+        self.box_bt_comments = QtWidgets.QGroupBox(self.tab_bt_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_bt_comments.setFont(font)
+        self.box_bt_comments.setObjectName("box_bt_comments")
+        self.horizontalLayout_24 = QtWidgets.QHBoxLayout(self.box_bt_comments)
+        self.horizontalLayout_24.setObjectName("horizontalLayout_24")
+        self.display_bt_comments = QtWidgets.QPlainTextEdit(self.box_bt_comments)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_bt_comments.setFont(font)
+        self.display_bt_comments.setReadOnly(True)
+        self.display_bt_comments.setObjectName("display_bt_comments")
+        self.horizontalLayout_24.addWidget(self.display_bt_comments)
+        self.verticalLayout_19.addWidget(self.box_bt_comments)
+        self.tab_bt_2.addTab(self.tab_bt_2_messages, "")
+        self.gridLayout_33.addWidget(self.tab_bt_2, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_bt, "")
+        self.tab_gps = QtWidgets.QWidget()
+        self.tab_gps.setObjectName("tab_gps")
+        self.gridLayout_27 = QtWidgets.QGridLayout(self.tab_gps)
+        self.gridLayout_27.setObjectName("gridLayout_27")
+        self.tab_gps_2 = QtWidgets.QTabWidget(self.tab_gps)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_gps_2.setFont(font)
+        self.tab_gps_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_gps_2.setObjectName("tab_gps_2")
+        self.tab_gps_2_data = QtWidgets.QWidget()
+        self.tab_gps_2_data.setObjectName("tab_gps_2_data")
+        self.gridLayout_25 = QtWidgets.QGridLayout(self.tab_gps_2_data)
+        self.gridLayout_25.setObjectName("gridLayout_25")
+        self.verticalLayout_34 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_34.setObjectName("verticalLayout_34")
+        self.table_gps = QtWidgets.QTableWidget(self.tab_gps_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.table_gps.setFont(font)
+        self.table_gps.setObjectName("table_gps")
+        self.table_gps.setColumnCount(0)
+        self.table_gps.setRowCount(0)
+        self.verticalLayout_34.addWidget(self.table_gps)
+        self.horizontalLayout_27 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_27.setObjectName("horizontalLayout_27")
+        self.verticalLayout_35 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_35.setObjectName("verticalLayout_35")
+        self.gb_gps_radio = QtWidgets.QGroupBox(self.tab_gps_2_data)
+        self.gb_gps_radio.setTitle("")
+        self.gb_gps_radio.setObjectName("gb_gps_radio")
+        self.verticalLayout_36 = QtWidgets.QVBoxLayout(self.gb_gps_radio)
+        self.verticalLayout_36.setObjectName("verticalLayout_36")
+        self.horizontalLayout_28 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_28.setObjectName("horizontalLayout_28")
+        self.rb_gps_quality = QtWidgets.QRadioButton(self.gb_gps_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_gps_quality.setFont(font)
+        self.rb_gps_quality.setChecked(True)
+        self.rb_gps_quality.setObjectName("rb_gps_quality")
+        self.horizontalLayout_28.addWidget(self.rb_gps_quality)
+        self.rb_gps_altitude = QtWidgets.QRadioButton(self.gb_gps_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_gps_altitude.setFont(font)
+        self.rb_gps_altitude.setObjectName("rb_gps_altitude")
+        self.horizontalLayout_28.addWidget(self.rb_gps_altitude)
+        self.rb_gps_hdop = QtWidgets.QRadioButton(self.gb_gps_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_gps_hdop.setFont(font)
+        self.rb_gps_hdop.setObjectName("rb_gps_hdop")
+        self.horizontalLayout_28.addWidget(self.rb_gps_hdop)
+        self.rb_gps_sats = QtWidgets.QRadioButton(self.gb_gps_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_gps_sats.setFont(font)
+        self.rb_gps_sats.setObjectName("rb_gps_sats")
+        self.horizontalLayout_28.addWidget(self.rb_gps_sats)
+        self.rb_gps_other = QtWidgets.QRadioButton(self.gb_gps_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_gps_other.setFont(font)
+        self.rb_gps_other.setObjectName("rb_gps_other")
+        self.horizontalLayout_28.addWidget(self.rb_gps_other)
+        self.rb_gps_source = QtWidgets.QRadioButton(self.gb_gps_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_gps_source.setFont(font)
+        self.rb_gps_source.setObjectName("rb_gps_source")
+        self.horizontalLayout_28.addWidget(self.rb_gps_source)
+        self.verticalLayout_36.addLayout(self.horizontalLayout_28)
+        self.graph_gps_ts = QtWidgets.QWidget(self.gb_gps_radio)
+        self.graph_gps_ts.setObjectName("graph_gps_ts")
+        self.verticalLayout_36.addWidget(self.graph_gps_ts)
+        self.verticalLayout_36.setStretch(0, 1)
+        self.verticalLayout_36.setStretch(1, 4)
+        self.verticalLayout_35.addWidget(self.gb_gps_radio)
+        self.verticalLayout_35.setStretch(0, 4)
+        self.horizontalLayout_27.addLayout(self.verticalLayout_35)
+        self.verticalLayout_37 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_37.setObjectName("verticalLayout_37")
+        self.horizontalLayout_35 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_35.setObjectName("horizontalLayout_35")
+        self.cb_gps_bt = QtWidgets.QCheckBox(self.tab_gps_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
+        self.cb_gps_bt.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_gps_bt.setFont(font)
+        self.cb_gps_bt.setChecked(True)
+        self.cb_gps_bt.setObjectName("cb_gps_bt")
+        self.horizontalLayout_35.addWidget(self.cb_gps_bt)
+        self.cb_gps_gga = QtWidgets.QCheckBox(self.tab_gps_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_gps_gga.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_gps_gga.setFont(font)
+        self.cb_gps_gga.setObjectName("cb_gps_gga")
+        self.horizontalLayout_35.addWidget(self.cb_gps_gga)
+        self.cb_gps_vtg = QtWidgets.QCheckBox(self.tab_gps_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_gps_vtg.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_gps_vtg.setFont(font)
+        self.cb_gps_vtg.setObjectName("cb_gps_vtg")
+        self.horizontalLayout_35.addWidget(self.cb_gps_vtg)
+        self.cb_gps_vectors = QtWidgets.QCheckBox(self.tab_gps_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_gps_vectors.setFont(font)
+        self.cb_gps_vectors.setChecked(True)
+        self.cb_gps_vectors.setObjectName("cb_gps_vectors")
+        self.horizontalLayout_35.addWidget(self.cb_gps_vectors)
+        self.verticalLayout_37.addLayout(self.horizontalLayout_35)
+        self.graph_gps_st = QtWidgets.QWidget(self.tab_gps_2_data)
+        self.graph_gps_st.setObjectName("graph_gps_st")
+        self.verticalLayout_37.addWidget(self.graph_gps_st)
+        self.verticalLayout_37.setStretch(0, 1)
+        self.verticalLayout_37.setStretch(1, 8)
+        self.horizontalLayout_27.addLayout(self.verticalLayout_37)
+        self.gb_gps_filters = QtWidgets.QGroupBox(self.tab_gps_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_gps_filters.setFont(font)
+        self.gb_gps_filters.setObjectName("gb_gps_filters")
+        self.verticalLayout_38 = QtWidgets.QVBoxLayout(self.gb_gps_filters)
+        self.verticalLayout_38.setObjectName("verticalLayout_38")
+        self.gb_gps_qual = QtWidgets.QGroupBox(self.gb_gps_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_gps_qual.setFont(font)
+        self.gb_gps_qual.setObjectName("gb_gps_qual")
+        self.verticalLayout_39 = QtWidgets.QVBoxLayout(self.gb_gps_qual)
+        self.verticalLayout_39.setObjectName("verticalLayout_39")
+        self.combo_gps_qual = QtWidgets.QComboBox(self.gb_gps_qual)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_gps_qual.setFont(font)
+        self.combo_gps_qual.setObjectName("combo_gps_qual")
+        self.combo_gps_qual.addItem("")
+        self.combo_gps_qual.addItem("")
+        self.combo_gps_qual.addItem("")
+        self.verticalLayout_39.addWidget(self.combo_gps_qual)
+        self.verticalLayout_38.addWidget(self.gb_gps_qual)
+        self.gb_gps_altitude = QtWidgets.QGroupBox(self.gb_gps_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_gps_altitude.setFont(font)
+        self.gb_gps_altitude.setObjectName("gb_gps_altitude")
+        self.verticalLayout_40 = QtWidgets.QVBoxLayout(self.gb_gps_altitude)
+        self.verticalLayout_40.setObjectName("verticalLayout_40")
+        self.combo_gps_altitude = QtWidgets.QComboBox(self.gb_gps_altitude)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_gps_altitude.setFont(font)
+        self.combo_gps_altitude.setObjectName("combo_gps_altitude")
+        self.combo_gps_altitude.addItem("")
+        self.combo_gps_altitude.addItem("")
+        self.combo_gps_altitude.addItem("")
+        self.verticalLayout_40.addWidget(self.combo_gps_altitude)
+        self.horizontalLayout_36 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_36.setObjectName("horizontalLayout_36")
+        self.txt_gps_altitude = QtWidgets.QLabel(self.gb_gps_altitude)
+        self.txt_gps_altitude.setMaximumSize(QtCore.QSize(16777215, 20))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_gps_altitude.setFont(font)
+        self.txt_gps_altitude.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.txt_gps_altitude.setObjectName("txt_gps_altitude")
+        self.horizontalLayout_36.addWidget(self.txt_gps_altitude)
+        self.ed_gps_altitude_threshold = QtWidgets.QLineEdit(self.gb_gps_altitude)
+        self.ed_gps_altitude_threshold.setEnabled(False)
+        self.ed_gps_altitude_threshold.setObjectName("ed_gps_altitude_threshold")
+        self.horizontalLayout_36.addWidget(self.ed_gps_altitude_threshold)
+        self.horizontalLayout_36.setStretch(0, 2)
+        self.verticalLayout_40.addLayout(self.horizontalLayout_36)
+        self.verticalLayout_38.addWidget(self.gb_gps_altitude)
+        self.gb_gps_hdop = QtWidgets.QGroupBox(self.gb_gps_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_gps_hdop.setFont(font)
+        self.gb_gps_hdop.setObjectName("gb_gps_hdop")
+        self.verticalLayout_41 = QtWidgets.QVBoxLayout(self.gb_gps_hdop)
+        self.verticalLayout_41.setObjectName("verticalLayout_41")
+        self.combo_gps_hdop = QtWidgets.QComboBox(self.gb_gps_hdop)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_gps_hdop.setFont(font)
+        self.combo_gps_hdop.setObjectName("combo_gps_hdop")
+        self.combo_gps_hdop.addItem("")
+        self.combo_gps_hdop.addItem("")
+        self.combo_gps_hdop.addItem("")
+        self.verticalLayout_41.addWidget(self.combo_gps_hdop)
+        self.horizontalLayout_37 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_37.setObjectName("horizontalLayout_37")
+        self.txt_gps_hdop = QtWidgets.QLabel(self.gb_gps_hdop)
+        self.txt_gps_hdop.setMaximumSize(QtCore.QSize(16777215, 20))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_gps_hdop.setFont(font)
+        self.txt_gps_hdop.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.txt_gps_hdop.setObjectName("txt_gps_hdop")
+        self.horizontalLayout_37.addWidget(self.txt_gps_hdop)
+        self.ed_gps_hdop_threshold = QtWidgets.QLineEdit(self.gb_gps_hdop)
+        self.ed_gps_hdop_threshold.setEnabled(False)
+        self.ed_gps_hdop_threshold.setObjectName("ed_gps_hdop_threshold")
+        self.horizontalLayout_37.addWidget(self.ed_gps_hdop_threshold)
+        self.horizontalLayout_37.setStretch(0, 2)
+        self.verticalLayout_41.addLayout(self.horizontalLayout_37)
+        self.verticalLayout_38.addWidget(self.gb_gps_hdop)
+        self.gb_gps_other = QtWidgets.QGroupBox(self.gb_gps_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_gps_other.setFont(font)
+        self.gb_gps_other.setObjectName("gb_gps_other")
+        self.verticalLayout_42 = QtWidgets.QVBoxLayout(self.gb_gps_other)
+        self.verticalLayout_42.setObjectName("verticalLayout_42")
+        self.combo_gps_other = QtWidgets.QComboBox(self.gb_gps_other)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_gps_other.setFont(font)
+        self.combo_gps_other.setObjectName("combo_gps_other")
+        self.combo_gps_other.addItem("")
+        self.combo_gps_other.addItem("")
+        self.verticalLayout_42.addWidget(self.combo_gps_other)
+        self.verticalLayout_38.addWidget(self.gb_gps_other)
+        self.horizontalLayout_27.addWidget(self.gb_gps_filters)
+        self.horizontalLayout_27.setStretch(0, 6)
+        self.horizontalLayout_27.setStretch(1, 3)
+        self.horizontalLayout_27.setStretch(2, 1)
+        self.verticalLayout_34.addLayout(self.horizontalLayout_27)
+        self.verticalLayout_34.setStretch(0, 2)
+        self.verticalLayout_34.setStretch(1, 4)
+        self.gridLayout_25.addLayout(self.verticalLayout_34, 0, 0, 1, 1)
+        self.tab_gps_2.addTab(self.tab_gps_2_data, "")
+        self.tab_gps_2_gpsbt = QtWidgets.QWidget()
+        self.tab_gps_2_gpsbt.setObjectName("tab_gps_2_gpsbt")
+        self.gridLayout_46 = QtWidgets.QGridLayout(self.tab_gps_2_gpsbt)
+        self.gridLayout_46.setObjectName("gridLayout_46")
+        self.horizontalLayout_73 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_73.setObjectName("horizontalLayout_73")
+        self.verticalLayout_68 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_68.setObjectName("verticalLayout_68")
+        self.table_gps_bt = QtWidgets.QTableWidget(self.tab_gps_2_gpsbt)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.table_gps_bt.setFont(font)
+        self.table_gps_bt.setObjectName("table_gps_bt")
+        self.table_gps_bt.setColumnCount(0)
+        self.table_gps_bt.setRowCount(0)
+        self.verticalLayout_68.addWidget(self.table_gps_bt)
+        self.graph_gps_bt_ts = QtWidgets.QWidget(self.tab_gps_2_gpsbt)
+        self.graph_gps_bt_ts.setObjectName("graph_gps_bt_ts")
+        self.verticalLayout_68.addWidget(self.graph_gps_bt_ts)
+        self.verticalLayout_68.setStretch(0, 5)
+        self.verticalLayout_68.setStretch(1, 5)
+        self.horizontalLayout_73.addLayout(self.verticalLayout_68)
+        self.verticalLayout_67 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_67.setObjectName("verticalLayout_67")
+        self.horizontalLayout_72 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_72.setObjectName("horizontalLayout_72")
+        self.cb_gps_bt_2 = QtWidgets.QCheckBox(self.tab_gps_2_gpsbt)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
+        self.cb_gps_bt_2.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_gps_bt_2.setFont(font)
+        self.cb_gps_bt_2.setChecked(True)
+        self.cb_gps_bt_2.setObjectName("cb_gps_bt_2")
+        self.horizontalLayout_72.addWidget(self.cb_gps_bt_2)
+        self.cb_gps_gga_2 = QtWidgets.QCheckBox(self.tab_gps_2_gpsbt)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_gps_gga_2.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_gps_gga_2.setFont(font)
+        self.cb_gps_gga_2.setObjectName("cb_gps_gga_2")
+        self.horizontalLayout_72.addWidget(self.cb_gps_gga_2)
+        self.cb_gps_vtg_2 = QtWidgets.QCheckBox(self.tab_gps_2_gpsbt)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_gps_vtg_2.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_gps_vtg_2.setFont(font)
+        self.cb_gps_vtg_2.setObjectName("cb_gps_vtg_2")
+        self.horizontalLayout_72.addWidget(self.cb_gps_vtg_2)
+        self.cb_gps_vectors_2 = QtWidgets.QCheckBox(self.tab_gps_2_gpsbt)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_gps_vectors_2.setFont(font)
+        self.cb_gps_vectors_2.setChecked(True)
+        self.cb_gps_vectors_2.setObjectName("cb_gps_vectors_2")
+        self.horizontalLayout_72.addWidget(self.cb_gps_vectors_2)
+        self.verticalLayout_67.addLayout(self.horizontalLayout_72)
+        self.graph_gps_st_2 = QtWidgets.QWidget(self.tab_gps_2_gpsbt)
+        self.graph_gps_st_2.setObjectName("graph_gps_st_2")
+        self.verticalLayout_67.addWidget(self.graph_gps_st_2)
+        self.verticalLayout_67.setStretch(0, 1)
+        self.verticalLayout_67.setStretch(1, 9)
+        self.horizontalLayout_73.addLayout(self.verticalLayout_67)
+        self.horizontalLayout_73.setStretch(0, 6)
+        self.horizontalLayout_73.setStretch(1, 4)
+        self.gridLayout_46.addLayout(self.horizontalLayout_73, 0, 0, 1, 1)
+        self.tab_gps_2.addTab(self.tab_gps_2_gpsbt, "")
+        self.tab_gps_2_messages = QtWidgets.QWidget()
+        self.tab_gps_2_messages.setObjectName("tab_gps_2_messages")
+        self.gridLayout_29 = QtWidgets.QGridLayout(self.tab_gps_2_messages)
+        self.gridLayout_29.setObjectName("gridLayout_29")
+        self.box_gps_messages = QtWidgets.QGroupBox(self.tab_gps_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_gps_messages.setFont(font)
+        self.box_gps_messages.setObjectName("box_gps_messages")
+        self.horizontalLayout_47 = QtWidgets.QHBoxLayout(self.box_gps_messages)
+        self.horizontalLayout_47.setObjectName("horizontalLayout_47")
+        self.display_gps_messages = QtWidgets.QPlainTextEdit(self.box_gps_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_gps_messages.setFont(font)
+        self.display_gps_messages.setReadOnly(True)
+        self.display_gps_messages.setObjectName("display_gps_messages")
+        self.horizontalLayout_47.addWidget(self.display_gps_messages)
+        self.gridLayout_29.addWidget(self.box_gps_messages, 0, 0, 1, 1)
+        self.box_gps_comments = QtWidgets.QGroupBox(self.tab_gps_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_gps_comments.setFont(font)
+        self.box_gps_comments.setObjectName("box_gps_comments")
+        self.horizontalLayout_46 = QtWidgets.QHBoxLayout(self.box_gps_comments)
+        self.horizontalLayout_46.setObjectName("horizontalLayout_46")
+        self.display_gps_comments = QtWidgets.QPlainTextEdit(self.box_gps_comments)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_gps_comments.setFont(font)
+        self.display_gps_comments.setReadOnly(True)
+        self.display_gps_comments.setObjectName("display_gps_comments")
+        self.horizontalLayout_46.addWidget(self.display_gps_comments)
+        self.gridLayout_29.addWidget(self.box_gps_comments, 1, 0, 1, 1)
+        self.tab_gps_2.addTab(self.tab_gps_2_messages, "")
+        self.gridLayout_27.addWidget(self.tab_gps_2, 1, 0, 1, 1)
+        self.tab_all.addTab(self.tab_gps, "")
+        self.tab_depth = QtWidgets.QWidget()
+        self.tab_depth.setObjectName("tab_depth")
+        self.gridLayout_30 = QtWidgets.QGridLayout(self.tab_depth)
+        self.gridLayout_30.setObjectName("gridLayout_30")
+        self.tab_depth_2 = QtWidgets.QTabWidget(self.tab_depth)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.tab_depth_2.setFont(font)
+        self.tab_depth_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_depth_2.setObjectName("tab_depth_2")
+        self.tab_depth_2_data = QtWidgets.QWidget()
+        self.tab_depth_2_data.setObjectName("tab_depth_2_data")
+        self.gridLayout_31 = QtWidgets.QGridLayout(self.tab_depth_2_data)
+        self.gridLayout_31.setObjectName("gridLayout_31")
+        self.horizontalLayout_80 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_80.setObjectName("horizontalLayout_80")
+        self.verticalLayout_27 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_27.setObjectName("verticalLayout_27")
+        self.table_depth = QtWidgets.QTableWidget(self.tab_depth_2_data)
+        self.table_depth.setObjectName("table_depth")
+        self.table_depth.setColumnCount(0)
+        self.table_depth.setRowCount(0)
+        self.verticalLayout_27.addWidget(self.table_depth)
+        self.horizontalLayout_25 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_25.setObjectName("horizontalLayout_25")
+        self.graph_depth = QtWidgets.QWidget(self.tab_depth_2_data)
+        self.graph_depth.setObjectName("graph_depth")
+        self.horizontalLayout_25.addWidget(self.graph_depth)
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.gb_depth_beams = QtWidgets.QGroupBox(self.tab_depth_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.gb_depth_beams.setFont(font)
+        self.gb_depth_beams.setObjectName("gb_depth_beams")
+        self.horizontalLayout_32 = QtWidgets.QHBoxLayout(self.gb_depth_beams)
+        self.horizontalLayout_32.setObjectName("horizontalLayout_32")
+        self.verticalLayout_25 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_25.setObjectName("verticalLayout_25")
+        self.cb_depth_beam1 = QtWidgets.QCheckBox(self.gb_depth_beams)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_depth_beam1.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_depth_beam1.setFont(font)
+        self.cb_depth_beam1.setObjectName("cb_depth_beam1")
+        self.verticalLayout_25.addWidget(self.cb_depth_beam1)
+        self.cb_depth_beam2 = QtWidgets.QCheckBox(self.gb_depth_beams)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 85, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 85, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_depth_beam2.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_depth_beam2.setFont(font)
+        self.cb_depth_beam2.setObjectName("cb_depth_beam2")
+        self.verticalLayout_25.addWidget(self.cb_depth_beam2)
+        self.cb_depth_beam3 = QtWidgets.QCheckBox(self.gb_depth_beams)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_depth_beam3.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_depth_beam3.setFont(font)
+        self.cb_depth_beam3.setObjectName("cb_depth_beam3")
+        self.verticalLayout_25.addWidget(self.cb_depth_beam3)
+        self.cb_depth_beam4 = QtWidgets.QCheckBox(self.gb_depth_beams)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(170, 85, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(170, 85, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_depth_beam4.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_depth_beam4.setFont(font)
+        self.cb_depth_beam4.setObjectName("cb_depth_beam4")
+        self.verticalLayout_25.addWidget(self.cb_depth_beam4)
+        self.cb_depth_vert = QtWidgets.QCheckBox(self.gb_depth_beams)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(170, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(170, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_depth_vert.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_depth_vert.setFont(font)
+        self.cb_depth_vert.setObjectName("cb_depth_vert")
+        self.verticalLayout_25.addWidget(self.cb_depth_vert)
+        self.cb_depth_ds = QtWidgets.QCheckBox(self.gb_depth_beams)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_depth_ds.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_depth_ds.setFont(font)
+        self.cb_depth_ds.setObjectName("cb_depth_ds")
+        self.verticalLayout_25.addWidget(self.cb_depth_ds)
+        self.horizontalLayout_32.addLayout(self.verticalLayout_25)
+        self.horizontalLayout_32.setStretch(0, 1)
+        self.verticalLayout_2.addWidget(self.gb_depth_beams)
+        self.gb_depth_cs = QtWidgets.QGroupBox(self.tab_depth_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.gb_depth_cs.setFont(font)
+        self.gb_depth_cs.setObjectName("gb_depth_cs")
+        self.horizontalLayout_33 = QtWidgets.QHBoxLayout(self.gb_depth_cs)
+        self.horizontalLayout_33.setObjectName("horizontalLayout_33")
+        self.verticalLayout_26 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_26.setObjectName("verticalLayout_26")
+        self.cb_depth_4beam_cs = QtWidgets.QCheckBox(self.gb_depth_cs)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_depth_4beam_cs.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_depth_4beam_cs.setFont(font)
+        self.cb_depth_4beam_cs.setObjectName("cb_depth_4beam_cs")
+        self.verticalLayout_26.addWidget(self.cb_depth_4beam_cs)
+        self.cb_depth_vert_cs = QtWidgets.QCheckBox(self.gb_depth_cs)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(170, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(170, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_depth_vert_cs.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_depth_vert_cs.setFont(font)
+        self.cb_depth_vert_cs.setObjectName("cb_depth_vert_cs")
+        self.verticalLayout_26.addWidget(self.cb_depth_vert_cs)
+        self.cb_depth_ds_cs = QtWidgets.QCheckBox(self.gb_depth_cs)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_depth_ds_cs.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_depth_ds_cs.setFont(font)
+        self.cb_depth_ds_cs.setObjectName("cb_depth_ds_cs")
+        self.verticalLayout_26.addWidget(self.cb_depth_ds_cs)
+        self.cb_depth_final_cs = QtWidgets.QCheckBox(self.gb_depth_cs)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_depth_final_cs.setFont(font)
+        self.cb_depth_final_cs.setObjectName("cb_depth_final_cs")
+        self.verticalLayout_26.addWidget(self.cb_depth_final_cs)
+        self.horizontalLayout_33.addLayout(self.verticalLayout_26)
+        self.horizontalLayout_33.setStretch(0, 1)
+        self.verticalLayout_2.addWidget(self.gb_depth_cs)
+        self.horizontalLayout_25.addLayout(self.verticalLayout_2)
+        self.horizontalLayout_25.setStretch(0, 9)
+        self.horizontalLayout_25.setStretch(1, 1)
+        self.verticalLayout_27.addLayout(self.horizontalLayout_25)
+        self.verticalLayout_27.setStretch(0, 3)
+        self.verticalLayout_27.setStretch(1, 7)
+        self.horizontalLayout_80.addLayout(self.verticalLayout_27)
+        self.verticalLayout_28 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_28.setObjectName("verticalLayout_28")
+        spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_28.addItem(spacerItem4)
+        self.gb_depth_settings = QtWidgets.QGroupBox(self.tab_depth_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.gb_depth_settings.setFont(font)
+        self.gb_depth_settings.setObjectName("gb_depth_settings")
+        self.verticalLayout_29 = QtWidgets.QVBoxLayout(self.gb_depth_settings)
+        self.verticalLayout_29.setObjectName("verticalLayout_29")
+        self.gb_depth_ref = QtWidgets.QGroupBox(self.gb_depth_settings)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.gb_depth_ref.setFont(font)
+        self.gb_depth_ref.setObjectName("gb_depth_ref")
+        self.verticalLayout_30 = QtWidgets.QVBoxLayout(self.gb_depth_ref)
+        self.verticalLayout_30.setObjectName("verticalLayout_30")
+        self.combo_depth_ref = QtWidgets.QComboBox(self.gb_depth_ref)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_depth_ref.setFont(font)
+        self.combo_depth_ref.setObjectName("combo_depth_ref")
+        self.verticalLayout_30.addWidget(self.combo_depth_ref)
+        self.verticalLayout_29.addWidget(self.gb_depth_ref)
+        self.gb_depth_averaging = QtWidgets.QGroupBox(self.gb_depth_settings)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.gb_depth_averaging.setFont(font)
+        self.gb_depth_averaging.setObjectName("gb_depth_averaging")
+        self.verticalLayout_31 = QtWidgets.QVBoxLayout(self.gb_depth_averaging)
+        self.verticalLayout_31.setObjectName("verticalLayout_31")
+        self.combo_depth_avg = QtWidgets.QComboBox(self.gb_depth_averaging)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_depth_avg.setFont(font)
+        self.combo_depth_avg.setObjectName("combo_depth_avg")
+        self.combo_depth_avg.addItem("")
+        self.combo_depth_avg.addItem("")
+        self.verticalLayout_31.addWidget(self.combo_depth_avg)
+        self.verticalLayout_29.addWidget(self.gb_depth_averaging)
+        self.gb_depth_filter = QtWidgets.QGroupBox(self.gb_depth_settings)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.gb_depth_filter.setFont(font)
+        self.gb_depth_filter.setObjectName("gb_depth_filter")
+        self.verticalLayout_32 = QtWidgets.QVBoxLayout(self.gb_depth_filter)
+        self.verticalLayout_32.setObjectName("verticalLayout_32")
+        self.combo_depth_filter = QtWidgets.QComboBox(self.gb_depth_filter)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_depth_filter.setFont(font)
+        self.combo_depth_filter.setObjectName("combo_depth_filter")
+        self.combo_depth_filter.addItem("")
+        self.combo_depth_filter.addItem("")
+        self.combo_depth_filter.addItem("")
+        self.verticalLayout_32.addWidget(self.combo_depth_filter)
+        self.verticalLayout_29.addWidget(self.gb_depth_filter)
+        self.verticalLayout_28.addWidget(self.gb_depth_settings)
+        spacerItem5 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_28.addItem(spacerItem5)
+        self.verticalLayout_28.setStretch(0, 1)
+        self.verticalLayout_28.setStretch(1, 3)
+        self.verticalLayout_28.setStretch(2, 1)
+        self.horizontalLayout_80.addLayout(self.verticalLayout_28)
+        self.gridLayout_31.addLayout(self.horizontalLayout_80, 0, 0, 1, 1)
+        self.tab_depth_2.addTab(self.tab_depth_2_data, "")
+        self.tab_gps_2_messages_3 = QtWidgets.QWidget()
+        self.tab_gps_2_messages_3.setObjectName("tab_gps_2_messages_3")
+        self.gridLayout_35 = QtWidgets.QGridLayout(self.tab_gps_2_messages_3)
+        self.gridLayout_35.setObjectName("gridLayout_35")
+        self.box_depth_messages = QtWidgets.QGroupBox(self.tab_gps_2_messages_3)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_depth_messages.setFont(font)
+        self.box_depth_messages.setObjectName("box_depth_messages")
+        self.horizontalLayout_49 = QtWidgets.QHBoxLayout(self.box_depth_messages)
+        self.horizontalLayout_49.setObjectName("horizontalLayout_49")
+        self.display_depth_messages = QtWidgets.QPlainTextEdit(self.box_depth_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_depth_messages.setFont(font)
+        self.display_depth_messages.setReadOnly(True)
+        self.display_depth_messages.setObjectName("display_depth_messages")
+        self.horizontalLayout_49.addWidget(self.display_depth_messages)
+        self.gridLayout_35.addWidget(self.box_depth_messages, 0, 0, 1, 1)
+        self.box_depth_comments = QtWidgets.QGroupBox(self.tab_gps_2_messages_3)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_depth_comments.setFont(font)
+        self.box_depth_comments.setObjectName("box_depth_comments")
+        self.horizontalLayout_48 = QtWidgets.QHBoxLayout(self.box_depth_comments)
+        self.horizontalLayout_48.setObjectName("horizontalLayout_48")
+        self.display_depth_comments = QtWidgets.QPlainTextEdit(self.box_depth_comments)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_depth_comments.setFont(font)
+        self.display_depth_comments.setReadOnly(True)
+        self.display_depth_comments.setObjectName("display_depth_comments")
+        self.horizontalLayout_48.addWidget(self.display_depth_comments)
+        self.gridLayout_35.addWidget(self.box_depth_comments, 1, 0, 1, 1)
+        self.tab_depth_2.addTab(self.tab_gps_2_messages_3, "")
+        self.gridLayout_30.addWidget(self.tab_depth_2, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_depth, "")
+        self.tab_wt = QtWidgets.QWidget()
+        self.tab_wt.setObjectName("tab_wt")
+        self.gridLayout_38 = QtWidgets.QGridLayout(self.tab_wt)
+        self.gridLayout_38.setObjectName("gridLayout_38")
+        self.tab_wt_2 = QtWidgets.QTabWidget(self.tab_wt)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_wt_2.setFont(font)
+        self.tab_wt_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_wt_2.setObjectName("tab_wt_2")
+        self.tab_wt_2_data = QtWidgets.QWidget()
+        self.tab_wt_2_data.setObjectName("tab_wt_2_data")
+        self.gridLayout_37 = QtWidgets.QGridLayout(self.tab_wt_2_data)
+        self.gridLayout_37.setObjectName("gridLayout_37")
+        self.verticalLayout_48 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_48.setObjectName("verticalLayout_48")
+        self.table_wt = QtWidgets.QTableWidget(self.tab_wt_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.table_wt.setFont(font)
+        self.table_wt.setObjectName("table_wt")
+        self.table_wt.setColumnCount(0)
+        self.table_wt.setRowCount(0)
+        self.verticalLayout_48.addWidget(self.table_wt)
+        self.horizontalLayout_42 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_42.setObjectName("horizontalLayout_42")
+        self.verticalLayout_49 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_49.setObjectName("verticalLayout_49")
+        self.gb_wt_radio = QtWidgets.QGroupBox(self.tab_wt_2_data)
+        self.gb_wt_radio.setTitle("")
+        self.gb_wt_radio.setObjectName("gb_wt_radio")
+        self.verticalLayout_50 = QtWidgets.QVBoxLayout(self.gb_wt_radio)
+        self.verticalLayout_50.setObjectName("verticalLayout_50")
+        self.horizontalLayout_43 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_43.setObjectName("horizontalLayout_43")
+        self.rb_wt_contour = QtWidgets.QRadioButton(self.gb_wt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_wt_contour.setFont(font)
+        self.rb_wt_contour.setChecked(True)
+        self.rb_wt_contour.setObjectName("rb_wt_contour")
+        self.horizontalLayout_43.addWidget(self.rb_wt_contour)
+        self.rb_wt_beam = QtWidgets.QRadioButton(self.gb_wt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_wt_beam.setFont(font)
+        self.rb_wt_beam.setChecked(False)
+        self.rb_wt_beam.setObjectName("rb_wt_beam")
+        self.horizontalLayout_43.addWidget(self.rb_wt_beam)
+        self.rb_wt_error = QtWidgets.QRadioButton(self.gb_wt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_wt_error.setFont(font)
+        self.rb_wt_error.setObjectName("rb_wt_error")
+        self.horizontalLayout_43.addWidget(self.rb_wt_error)
+        self.rb_wt_vert = QtWidgets.QRadioButton(self.gb_wt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_wt_vert.setFont(font)
+        self.rb_wt_vert.setObjectName("rb_wt_vert")
+        self.horizontalLayout_43.addWidget(self.rb_wt_vert)
+        self.rb_wt_snr = QtWidgets.QRadioButton(self.gb_wt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_wt_snr.setFont(font)
+        self.rb_wt_snr.setObjectName("rb_wt_snr")
+        self.horizontalLayout_43.addWidget(self.rb_wt_snr)
+        self.rb_wt_speed = QtWidgets.QRadioButton(self.gb_wt_radio)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_wt_speed.setFont(font)
+        self.rb_wt_speed.setObjectName("rb_wt_speed")
+        self.horizontalLayout_43.addWidget(self.rb_wt_speed)
+        self.verticalLayout_50.addLayout(self.horizontalLayout_43)
+        self.graph_wt = QtWidgets.QWidget(self.gb_wt_radio)
+        self.graph_wt.setObjectName("graph_wt")
+        self.verticalLayout_50.addWidget(self.graph_wt)
+        self.verticalLayout_50.setStretch(0, 1)
+        self.verticalLayout_50.setStretch(1, 4)
+        self.verticalLayout_49.addWidget(self.gb_wt_radio)
+        self.verticalLayout_49.setStretch(0, 5)
+        self.horizontalLayout_42.addLayout(self.verticalLayout_49)
+        self.verticalLayout_51 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_51.setObjectName("verticalLayout_51")
+        self.horizontalLayout_44 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_44.setObjectName("horizontalLayout_44")
+        self.cb_wt_bt = QtWidgets.QCheckBox(self.tab_wt_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 0, 128))
+        brush.setStyle(QtCore.Qt.NoBrush)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
+        self.cb_wt_bt.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_wt_bt.setFont(font)
+        self.cb_wt_bt.setChecked(True)
+        self.cb_wt_bt.setObjectName("cb_wt_bt")
+        self.horizontalLayout_44.addWidget(self.cb_wt_bt)
+        self.cb_wt_gga = QtWidgets.QCheckBox(self.tab_wt_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_wt_gga.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_wt_gga.setFont(font)
+        self.cb_wt_gga.setObjectName("cb_wt_gga")
+        self.horizontalLayout_44.addWidget(self.cb_wt_gga)
+        self.cb_wt_vtg = QtWidgets.QCheckBox(self.tab_wt_2_data)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 170, 0))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.cb_wt_vtg.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_wt_vtg.setFont(font)
+        self.cb_wt_vtg.setObjectName("cb_wt_vtg")
+        self.horizontalLayout_44.addWidget(self.cb_wt_vtg)
+        self.cb_wt_vectors = QtWidgets.QCheckBox(self.tab_wt_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_wt_vectors.setFont(font)
+        self.cb_wt_vectors.setChecked(True)
+        self.cb_wt_vectors.setObjectName("cb_wt_vectors")
+        self.horizontalLayout_44.addWidget(self.cb_wt_vectors)
+        self.verticalLayout_51.addLayout(self.horizontalLayout_44)
+        self.graph_wt_st = QtWidgets.QWidget(self.tab_wt_2_data)
+        self.graph_wt_st.setObjectName("graph_wt_st")
+        self.verticalLayout_51.addWidget(self.graph_wt_st)
+        self.verticalLayout_51.setStretch(0, 1)
+        self.verticalLayout_51.setStretch(1, 8)
+        self.horizontalLayout_42.addLayout(self.verticalLayout_51)
+        self.gb_wt_filters = QtWidgets.QGroupBox(self.tab_wt_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_wt_filters.setFont(font)
+        self.gb_wt_filters.setObjectName("gb_wt_filters")
+        self.verticalLayout_52 = QtWidgets.QVBoxLayout(self.gb_wt_filters)
+        self.verticalLayout_52.setObjectName("verticalLayout_52")
+        self.gb_wt_excluded = QtWidgets.QGroupBox(self.gb_wt_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_wt_excluded.setFont(font)
+        self.gb_wt_excluded.setObjectName("gb_wt_excluded")
+        self.verticalLayout_56 = QtWidgets.QVBoxLayout(self.gb_wt_excluded)
+        self.verticalLayout_56.setObjectName("verticalLayout_56")
+        self.horizontalLayout_51 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_51.setObjectName("horizontalLayout_51")
+        self.txt_wt_excluded = QtWidgets.QLabel(self.gb_wt_excluded)
+        self.txt_wt_excluded.setMaximumSize(QtCore.QSize(16777215, 20))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_wt_excluded.setFont(font)
+        self.txt_wt_excluded.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.txt_wt_excluded.setObjectName("txt_wt_excluded")
+        self.horizontalLayout_51.addWidget(self.txt_wt_excluded)
+        self.ed_wt_excluded_dist = QtWidgets.QLineEdit(self.gb_wt_excluded)
+        self.ed_wt_excluded_dist.setEnabled(True)
+        self.ed_wt_excluded_dist.setObjectName("ed_wt_excluded_dist")
+        self.horizontalLayout_51.addWidget(self.ed_wt_excluded_dist)
+        self.horizontalLayout_51.setStretch(0, 2)
+        self.verticalLayout_56.addLayout(self.horizontalLayout_51)
+        self.verticalLayout_52.addWidget(self.gb_wt_excluded)
+        self.gb_wt_3beam = QtWidgets.QGroupBox(self.gb_wt_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_wt_3beam.setFont(font)
+        self.gb_wt_3beam.setObjectName("gb_wt_3beam")
+        self.verticalLayout_53 = QtWidgets.QVBoxLayout(self.gb_wt_3beam)
+        self.verticalLayout_53.setObjectName("verticalLayout_53")
+        self.combo_wt_3beam = QtWidgets.QComboBox(self.gb_wt_3beam)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_wt_3beam.setFont(font)
+        self.combo_wt_3beam.setObjectName("combo_wt_3beam")
+        self.combo_wt_3beam.addItem("")
+        self.combo_wt_3beam.addItem("")
+        self.combo_wt_3beam.addItem("")
+        self.verticalLayout_53.addWidget(self.combo_wt_3beam)
+        self.verticalLayout_52.addWidget(self.gb_wt_3beam)
+        self.gb_wt_error_velocity = QtWidgets.QGroupBox(self.gb_wt_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_wt_error_velocity.setFont(font)
+        self.gb_wt_error_velocity.setObjectName("gb_wt_error_velocity")
+        self.verticalLayout_54 = QtWidgets.QVBoxLayout(self.gb_wt_error_velocity)
+        self.verticalLayout_54.setObjectName("verticalLayout_54")
+        self.combo_wt_error_velocity = QtWidgets.QComboBox(self.gb_wt_error_velocity)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_wt_error_velocity.setFont(font)
+        self.combo_wt_error_velocity.setObjectName("combo_wt_error_velocity")
+        self.combo_wt_error_velocity.addItem("")
+        self.combo_wt_error_velocity.addItem("")
+        self.combo_wt_error_velocity.addItem("")
+        self.verticalLayout_54.addWidget(self.combo_wt_error_velocity)
+        self.horizontalLayout_45 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_45.setObjectName("horizontalLayout_45")
+        self.txt_wt_error_velocity = QtWidgets.QLabel(self.gb_wt_error_velocity)
+        self.txt_wt_error_velocity.setMaximumSize(QtCore.QSize(16777215, 20))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_wt_error_velocity.setFont(font)
+        self.txt_wt_error_velocity.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.txt_wt_error_velocity.setObjectName("txt_wt_error_velocity")
+        self.horizontalLayout_45.addWidget(self.txt_wt_error_velocity)
+        self.ed_wt_error_vel_threshold = QtWidgets.QLineEdit(self.gb_wt_error_velocity)
+        self.ed_wt_error_vel_threshold.setEnabled(False)
+        self.ed_wt_error_vel_threshold.setObjectName("ed_wt_error_vel_threshold")
+        self.horizontalLayout_45.addWidget(self.ed_wt_error_vel_threshold)
+        self.horizontalLayout_45.setStretch(0, 2)
+        self.verticalLayout_54.addLayout(self.horizontalLayout_45)
+        self.verticalLayout_52.addWidget(self.gb_wt_error_velocity)
+        self.gb_wt_vertical_velocity = QtWidgets.QGroupBox(self.gb_wt_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_wt_vertical_velocity.setFont(font)
+        self.gb_wt_vertical_velocity.setObjectName("gb_wt_vertical_velocity")
+        self.verticalLayout_55 = QtWidgets.QVBoxLayout(self.gb_wt_vertical_velocity)
+        self.verticalLayout_55.setObjectName("verticalLayout_55")
+        self.combo_wt_vert_velocity = QtWidgets.QComboBox(self.gb_wt_vertical_velocity)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_wt_vert_velocity.setFont(font)
+        self.combo_wt_vert_velocity.setObjectName("combo_wt_vert_velocity")
+        self.combo_wt_vert_velocity.addItem("")
+        self.combo_wt_vert_velocity.addItem("")
+        self.combo_wt_vert_velocity.addItem("")
+        self.verticalLayout_55.addWidget(self.combo_wt_vert_velocity)
+        self.horizontalLayout_50 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_50.setObjectName("horizontalLayout_50")
+        self.txt_wt_vert_velocity = QtWidgets.QLabel(self.gb_wt_vertical_velocity)
+        self.txt_wt_vert_velocity.setMaximumSize(QtCore.QSize(16777215, 20))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_wt_vert_velocity.setFont(font)
+        self.txt_wt_vert_velocity.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.txt_wt_vert_velocity.setObjectName("txt_wt_vert_velocity")
+        self.horizontalLayout_50.addWidget(self.txt_wt_vert_velocity)
+        self.ed_wt_vert_vel_threshold = QtWidgets.QLineEdit(self.gb_wt_vertical_velocity)
+        self.ed_wt_vert_vel_threshold.setEnabled(False)
+        self.ed_wt_vert_vel_threshold.setObjectName("ed_wt_vert_vel_threshold")
+        self.horizontalLayout_50.addWidget(self.ed_wt_vert_vel_threshold)
+        self.horizontalLayout_50.setStretch(0, 2)
+        self.verticalLayout_55.addLayout(self.horizontalLayout_50)
+        self.verticalLayout_52.addWidget(self.gb_wt_vertical_velocity)
+        self.gb_snr = QtWidgets.QGroupBox(self.gb_wt_filters)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_snr.setFont(font)
+        self.gb_snr.setObjectName("gb_snr")
+        self.verticalLayout_59 = QtWidgets.QVBoxLayout(self.gb_snr)
+        self.verticalLayout_59.setObjectName("verticalLayout_59")
+        self.combo_wt_snr = QtWidgets.QComboBox(self.gb_snr)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_wt_snr.setFont(font)
+        self.combo_wt_snr.setObjectName("combo_wt_snr")
+        self.combo_wt_snr.addItem("")
+        self.combo_wt_snr.addItem("")
+        self.verticalLayout_59.addWidget(self.combo_wt_snr)
+        self.verticalLayout_52.addWidget(self.gb_snr)
+        spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_52.addItem(spacerItem6)
+        self.horizontalLayout_42.addWidget(self.gb_wt_filters)
+        self.horizontalLayout_42.setStretch(0, 6)
+        self.horizontalLayout_42.setStretch(1, 3)
+        self.horizontalLayout_42.setStretch(2, 1)
+        self.verticalLayout_48.addLayout(self.horizontalLayout_42)
+        self.verticalLayout_48.setStretch(0, 2)
+        self.verticalLayout_48.setStretch(1, 4)
+        self.gridLayout_37.addLayout(self.verticalLayout_48, 0, 0, 1, 1)
+        self.tab_wt_2.addTab(self.tab_wt_2_data, "")
+        self.tab_wt_2_messages = QtWidgets.QWidget()
+        self.tab_wt_2_messages.setObjectName("tab_wt_2_messages")
+        self.gridLayout_39 = QtWidgets.QGridLayout(self.tab_wt_2_messages)
+        self.gridLayout_39.setObjectName("gridLayout_39")
+        self.box_wt_messages = QtWidgets.QGroupBox(self.tab_wt_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_wt_messages.setFont(font)
+        self.box_wt_messages.setObjectName("box_wt_messages")
+        self.horizontalLayout_53 = QtWidgets.QHBoxLayout(self.box_wt_messages)
+        self.horizontalLayout_53.setObjectName("horizontalLayout_53")
+        self.display_wt_messages = QtWidgets.QPlainTextEdit(self.box_wt_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_wt_messages.setFont(font)
+        self.display_wt_messages.setReadOnly(True)
+        self.display_wt_messages.setObjectName("display_wt_messages")
+        self.horizontalLayout_53.addWidget(self.display_wt_messages)
+        self.gridLayout_39.addWidget(self.box_wt_messages, 0, 0, 1, 1)
+        self.box_wt_comments = QtWidgets.QGroupBox(self.tab_wt_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_wt_comments.setFont(font)
+        self.box_wt_comments.setObjectName("box_wt_comments")
+        self.horizontalLayout_52 = QtWidgets.QHBoxLayout(self.box_wt_comments)
+        self.horizontalLayout_52.setObjectName("horizontalLayout_52")
+        self.display_wt_comments = QtWidgets.QPlainTextEdit(self.box_wt_comments)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_wt_comments.setFont(font)
+        self.display_wt_comments.setReadOnly(True)
+        self.display_wt_comments.setObjectName("display_wt_comments")
+        self.horizontalLayout_52.addWidget(self.display_wt_comments)
+        self.gridLayout_39.addWidget(self.box_wt_comments, 1, 0, 1, 1)
+        self.tab_wt_2.addTab(self.tab_wt_2_messages, "")
+        self.gridLayout_38.addWidget(self.tab_wt_2, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_wt, "")
+        self.tab_extrap = QtWidgets.QWidget()
+        self.tab_extrap.setObjectName("tab_extrap")
+        self.gridLayout_34 = QtWidgets.QGridLayout(self.tab_extrap)
+        self.gridLayout_34.setObjectName("gridLayout_34")
+        self.tab_extrap_2 = QtWidgets.QTabWidget(self.tab_extrap)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.tab_extrap_2.setFont(font)
+        self.tab_extrap_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_extrap_2.setObjectName("tab_extrap_2")
+        self.tab_extrap_2_data = QtWidgets.QWidget()
+        self.tab_extrap_2_data.setObjectName("tab_extrap_2_data")
+        self.horizontalLayout_26 = QtWidgets.QHBoxLayout(self.tab_extrap_2_data)
+        self.horizontalLayout_26.setObjectName("horizontalLayout_26")
+        self.gp_points = QtWidgets.QGroupBox(self.tab_extrap_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gp_points.setFont(font)
+        self.gp_points.setObjectName("gp_points")
+        self.verticalLayout_44 = QtWidgets.QVBoxLayout(self.gp_points)
+        self.verticalLayout_44.setObjectName("verticalLayout_44")
+        self.table_extrap_n_points = QtWidgets.QTableWidget(self.gp_points)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.table_extrap_n_points.setFont(font)
+        self.table_extrap_n_points.setObjectName("table_extrap_n_points")
+        self.table_extrap_n_points.setColumnCount(0)
+        self.table_extrap_n_points.setRowCount(0)
+        self.verticalLayout_44.addWidget(self.table_extrap_n_points)
+        self.horizontalLayout_26.addWidget(self.gp_points)
+        self.gb_profile = QtWidgets.QGroupBox(self.tab_extrap_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_profile.setFont(font)
+        self.gb_profile.setObjectName("gb_profile")
+        self.verticalLayout_57 = QtWidgets.QVBoxLayout(self.gb_profile)
+        self.verticalLayout_57.setObjectName("verticalLayout_57")
+        self.graph_extrap = QtWidgets.QWidget(self.gb_profile)
+        self.graph_extrap.setObjectName("graph_extrap")
+        self.verticalLayout_57.addWidget(self.graph_extrap)
+        self.horizontalLayout_56 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_56.setObjectName("horizontalLayout_56")
+        self.gb_depth_cell = QtWidgets.QGroupBox(self.gb_profile)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_depth_cell.setFont(font)
+        self.gb_depth_cell.setObjectName("gb_depth_cell")
+        self.verticalLayout_45 = QtWidgets.QVBoxLayout(self.gb_depth_cell)
+        self.verticalLayout_45.setObjectName("verticalLayout_45")
+        self.cb_extrap_data = QtWidgets.QCheckBox(self.gb_depth_cell)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_extrap_data.setFont(font)
+        self.cb_extrap_data.setChecked(True)
+        self.cb_extrap_data.setObjectName("cb_extrap_data")
+        self.verticalLayout_45.addWidget(self.cb_extrap_data)
+        self.cb_extrap_surface = QtWidgets.QCheckBox(self.gb_depth_cell)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_extrap_surface.setFont(font)
+        self.cb_extrap_surface.setObjectName("cb_extrap_surface")
+        self.verticalLayout_45.addWidget(self.cb_extrap_surface)
+        self.horizontalLayout_56.addWidget(self.gb_depth_cell)
+        self.gb_transects = QtWidgets.QGroupBox(self.gb_profile)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_transects.setFont(font)
+        self.gb_transects.setObjectName("gb_transects")
+        self.verticalLayout_46 = QtWidgets.QVBoxLayout(self.gb_transects)
+        self.verticalLayout_46.setObjectName("verticalLayout_46")
+        self.cb_extrap_trans_medians = QtWidgets.QCheckBox(self.gb_transects)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_extrap_trans_medians.setFont(font)
+        self.cb_extrap_trans_medians.setObjectName("cb_extrap_trans_medians")
+        self.verticalLayout_46.addWidget(self.cb_extrap_trans_medians)
+        self.cb_extrap_trans_fit = QtWidgets.QCheckBox(self.gb_transects)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_extrap_trans_fit.setFont(font)
+        self.cb_extrap_trans_fit.setObjectName("cb_extrap_trans_fit")
+        self.verticalLayout_46.addWidget(self.cb_extrap_trans_fit)
+        self.horizontalLayout_56.addWidget(self.gb_transects)
+        self.gb_measurement = QtWidgets.QGroupBox(self.gb_profile)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.gb_measurement.setFont(font)
+        self.gb_measurement.setObjectName("gb_measurement")
+        self.verticalLayout_47 = QtWidgets.QVBoxLayout(self.gb_measurement)
+        self.verticalLayout_47.setObjectName("verticalLayout_47")
+        self.cb_extrap_meas_medians = QtWidgets.QCheckBox(self.gb_measurement)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_extrap_meas_medians.setFont(font)
+        self.cb_extrap_meas_medians.setChecked(True)
+        self.cb_extrap_meas_medians.setObjectName("cb_extrap_meas_medians")
+        self.verticalLayout_47.addWidget(self.cb_extrap_meas_medians)
+        self.cb_extrap_meas_fit = QtWidgets.QCheckBox(self.gb_measurement)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_extrap_meas_fit.setFont(font)
+        self.cb_extrap_meas_fit.setChecked(True)
+        self.cb_extrap_meas_fit.setObjectName("cb_extrap_meas_fit")
+        self.verticalLayout_47.addWidget(self.cb_extrap_meas_fit)
+        self.horizontalLayout_56.addWidget(self.gb_measurement)
+        self.verticalLayout_57.addLayout(self.horizontalLayout_56)
+        self.horizontalLayout_57 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_57.setObjectName("horizontalLayout_57")
+        spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_57.addItem(spacerItem7)
+        self.txt_start = QtWidgets.QLabel(self.gb_profile)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.txt_start.setFont(font)
+        self.txt_start.setObjectName("txt_start")
+        self.horizontalLayout_57.addWidget(self.txt_start)
+        self.txt_left = QtWidgets.QLabel(self.gb_profile)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(255, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.txt_left.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.txt_left.setFont(font)
+        self.txt_left.setObjectName("txt_left")
+        self.horizontalLayout_57.addWidget(self.txt_left)
+        self.txt_right = QtWidgets.QLabel(self.gb_profile)
+        palette = QtGui.QPalette()
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(0, 0, 255))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
+        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
+        brush.setStyle(QtCore.Qt.SolidPattern)
+        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
+        self.txt_right.setPalette(palette)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.txt_right.setFont(font)
+        self.txt_right.setObjectName("txt_right")
+        self.horizontalLayout_57.addWidget(self.txt_right)
+        spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_57.addItem(spacerItem8)
+        self.verticalLayout_57.addLayout(self.horizontalLayout_57)
+        self.verticalLayout_57.setStretch(0, 10)
+        self.verticalLayout_57.setStretch(1, 2)
+        self.verticalLayout_57.setStretch(2, 1)
+        self.horizontalLayout_26.addWidget(self.gb_profile)
+        self.verticalLayout_64 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_64.setObjectName("verticalLayout_64")
+        self.gb_fit = QtWidgets.QGroupBox(self.tab_extrap_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_fit.setFont(font)
+        self.gb_fit.setObjectName("gb_fit")
+        self.verticalLayout_43 = QtWidgets.QVBoxLayout(self.gb_fit)
+        self.verticalLayout_43.setObjectName("verticalLayout_43")
+        self.table_extrap_fit = QtWidgets.QTableWidget(self.gb_fit)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.table_extrap_fit.setFont(font)
+        self.table_extrap_fit.setObjectName("table_extrap_fit")
+        self.table_extrap_fit.setColumnCount(0)
+        self.table_extrap_fit.setRowCount(0)
+        self.verticalLayout_43.addWidget(self.table_extrap_fit)
+        self.combo_extrap_fit = QtWidgets.QComboBox(self.gb_fit)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.combo_extrap_fit.setFont(font)
+        self.combo_extrap_fit.setObjectName("combo_extrap_fit")
+        self.combo_extrap_fit.addItem("")
+        self.combo_extrap_fit.addItem("")
+        self.verticalLayout_43.addWidget(self.combo_extrap_fit)
+        self.horizontalLayout_38 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_38.setObjectName("horizontalLayout_38")
+        self.txt_top = QtWidgets.QLabel(self.gb_fit)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_top.setFont(font)
+        self.txt_top.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.txt_top.setObjectName("txt_top")
+        self.horizontalLayout_38.addWidget(self.txt_top)
+        self.combo_extrap_top = QtWidgets.QComboBox(self.gb_fit)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.combo_extrap_top.setFont(font)
+        self.combo_extrap_top.setObjectName("combo_extrap_top")
+        self.combo_extrap_top.addItem("")
+        self.combo_extrap_top.addItem("")
+        self.combo_extrap_top.addItem("")
+        self.horizontalLayout_38.addWidget(self.combo_extrap_top)
+        spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_38.addItem(spacerItem9)
+        self.horizontalLayout_38.setStretch(0, 4)
+        self.horizontalLayout_38.setStretch(1, 4)
+        self.horizontalLayout_38.setStretch(2, 6)
+        self.verticalLayout_43.addLayout(self.horizontalLayout_38)
+        self.horizontalLayout_39 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_39.setObjectName("horizontalLayout_39")
+        self.txt_bottom = QtWidgets.QLabel(self.gb_fit)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_bottom.setFont(font)
+        self.txt_bottom.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.txt_bottom.setObjectName("txt_bottom")
+        self.horizontalLayout_39.addWidget(self.txt_bottom)
+        self.combo_extrap_bottom = QtWidgets.QComboBox(self.gb_fit)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.combo_extrap_bottom.setFont(font)
+        self.combo_extrap_bottom.setObjectName("combo_extrap_bottom")
+        self.combo_extrap_bottom.addItem("")
+        self.combo_extrap_bottom.addItem("")
+        self.horizontalLayout_39.addWidget(self.combo_extrap_bottom)
+        spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_39.addItem(spacerItem10)
+        self.horizontalLayout_39.setStretch(0, 4)
+        self.horizontalLayout_39.setStretch(1, 5)
+        self.horizontalLayout_39.setStretch(2, 6)
+        self.verticalLayout_43.addLayout(self.horizontalLayout_39)
+        self.horizontalLayout_40 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_40.setObjectName("horizontalLayout_40")
+        self.txt_exponent = QtWidgets.QLabel(self.gb_fit)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_exponent.setFont(font)
+        self.txt_exponent.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+        self.txt_exponent.setObjectName("txt_exponent")
+        self.horizontalLayout_40.addWidget(self.txt_exponent)
+        self.ed_extrap_exponent = QtWidgets.QLineEdit(self.gb_fit)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_extrap_exponent.setFont(font)
+        self.ed_extrap_exponent.setObjectName("ed_extrap_exponent")
+        self.horizontalLayout_40.addWidget(self.ed_extrap_exponent)
+        spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_40.addItem(spacerItem11)
+        self.horizontalLayout_40.setStretch(1, 5)
+        self.horizontalLayout_40.setStretch(2, 6)
+        self.verticalLayout_43.addLayout(self.horizontalLayout_40)
+        self.verticalLayout_64.addWidget(self.gb_fit)
+        self.gb_data = QtWidgets.QGroupBox(self.tab_extrap_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_data.setFont(font)
+        self.gb_data.setObjectName("gb_data")
+        self.verticalLayout_63 = QtWidgets.QVBoxLayout(self.gb_data)
+        self.verticalLayout_63.setObjectName("verticalLayout_63")
+        self.combo_extrap_data = QtWidgets.QComboBox(self.gb_data)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.combo_extrap_data.setFont(font)
+        self.combo_extrap_data.setObjectName("combo_extrap_data")
+        self.combo_extrap_data.addItem("")
+        self.combo_extrap_data.addItem("")
+        self.verticalLayout_63.addWidget(self.combo_extrap_data)
+        self.horizontalLayout_55 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_55.setObjectName("horizontalLayout_55")
+        self.label_3 = QtWidgets.QLabel(self.gb_data)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_3.setFont(font)
+        self.label_3.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.label_3.setObjectName("label_3")
+        self.horizontalLayout_55.addWidget(self.label_3)
+        self.combo_extrap_type = QtWidgets.QComboBox(self.gb_data)
+        self.combo_extrap_type.setEnabled(False)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.combo_extrap_type.setFont(font)
+        self.combo_extrap_type.setObjectName("combo_extrap_type")
+        self.combo_extrap_type.addItem("")
+        self.combo_extrap_type.addItem("")
+        self.horizontalLayout_55.addWidget(self.combo_extrap_type)
+        spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_55.addItem(spacerItem12)
+        self.horizontalLayout_55.setStretch(0, 3)
+        self.horizontalLayout_55.setStretch(1, 3)
+        self.horizontalLayout_55.setStretch(2, 6)
+        self.verticalLayout_63.addLayout(self.horizontalLayout_55)
+        self.horizontalLayout_54 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_54.setObjectName("horizontalLayout_54")
+        self.txt_extrap_subsection = QtWidgets.QLabel(self.gb_data)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_extrap_subsection.setFont(font)
+        self.txt_extrap_subsection.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+        self.txt_extrap_subsection.setObjectName("txt_extrap_subsection")
+        self.horizontalLayout_54.addWidget(self.txt_extrap_subsection)
+        self.ed_extrap_subsection = QtWidgets.QLineEdit(self.gb_data)
+        self.ed_extrap_subsection.setEnabled(False)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_extrap_subsection.setFont(font)
+        self.ed_extrap_subsection.setObjectName("ed_extrap_subsection")
+        self.horizontalLayout_54.addWidget(self.ed_extrap_subsection)
+        self.horizontalLayout_54.setStretch(0, 2)
+        self.horizontalLayout_54.setStretch(1, 1)
+        self.verticalLayout_63.addLayout(self.horizontalLayout_54)
+        self.horizontalLayout_41 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_41.setObjectName("horizontalLayout_41")
+        self.text_extrap_threshold = QtWidgets.QLabel(self.gb_data)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.text_extrap_threshold.setFont(font)
+        self.text_extrap_threshold.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+        self.text_extrap_threshold.setObjectName("text_extrap_threshold")
+        self.horizontalLayout_41.addWidget(self.text_extrap_threshold)
+        self.ed_extrap_threshold = QtWidgets.QLineEdit(self.gb_data)
+        self.ed_extrap_threshold.setEnabled(False)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_extrap_threshold.setFont(font)
+        self.ed_extrap_threshold.setObjectName("ed_extrap_threshold")
+        self.horizontalLayout_41.addWidget(self.ed_extrap_threshold)
+        spacerItem13 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_41.addItem(spacerItem13)
+        self.horizontalLayout_41.setStretch(0, 5)
+        self.horizontalLayout_41.setStretch(1, 4)
+        self.horizontalLayout_41.setStretch(2, 7)
+        self.verticalLayout_63.addLayout(self.horizontalLayout_41)
+        self.verticalLayout_64.addWidget(self.gb_data)
+        self.verticalLayout_64.setStretch(0, 3)
+        self.verticalLayout_64.setStretch(1, 1)
+        self.horizontalLayout_26.addLayout(self.verticalLayout_64)
+        self.verticalLayout_33 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_33.setObjectName("verticalLayout_33")
+        self.gb_previous = QtWidgets.QGroupBox(self.tab_extrap_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_previous.setFont(font)
+        self.gb_previous.setObjectName("gb_previous")
+        self.verticalLayout_61 = QtWidgets.QVBoxLayout(self.gb_previous)
+        self.verticalLayout_61.setObjectName("verticalLayout_61")
+        self.gridLayout_32 = QtWidgets.QGridLayout()
+        self.gridLayout_32.setObjectName("gridLayout_32")
+        self.txt_p_fit = QtWidgets.QLabel(self.gb_previous)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_p_fit.setFont(font)
+        self.txt_p_fit.setObjectName("txt_p_fit")
+        self.gridLayout_32.addWidget(self.txt_p_fit, 0, 0, 1, 1)
+        self.txt_extrap_p_fit = QtWidgets.QLabel(self.gb_previous)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_extrap_p_fit.setFont(font)
+        self.txt_extrap_p_fit.setObjectName("txt_extrap_p_fit")
+        self.gridLayout_32.addWidget(self.txt_extrap_p_fit, 0, 1, 1, 1)
+        self.txt_p_top = QtWidgets.QLabel(self.gb_previous)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_p_top.setFont(font)
+        self.txt_p_top.setObjectName("txt_p_top")
+        self.gridLayout_32.addWidget(self.txt_p_top, 1, 0, 1, 1)
+        self.txt_extrap_p_top = QtWidgets.QLabel(self.gb_previous)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_extrap_p_top.setFont(font)
+        self.txt_extrap_p_top.setObjectName("txt_extrap_p_top")
+        self.gridLayout_32.addWidget(self.txt_extrap_p_top, 1, 1, 1, 1)
+        self.txt_p_bottom = QtWidgets.QLabel(self.gb_previous)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_p_bottom.setFont(font)
+        self.txt_p_bottom.setObjectName("txt_p_bottom")
+        self.gridLayout_32.addWidget(self.txt_p_bottom, 2, 0, 1, 1)
+        self.txt_extrap_p_bottom = QtWidgets.QLabel(self.gb_previous)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_extrap_p_bottom.setFont(font)
+        self.txt_extrap_p_bottom.setObjectName("txt_extrap_p_bottom")
+        self.gridLayout_32.addWidget(self.txt_extrap_p_bottom, 2, 1, 1, 1)
+        self.txt_p_exponent = QtWidgets.QLabel(self.gb_previous)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_p_exponent.setFont(font)
+        self.txt_p_exponent.setObjectName("txt_p_exponent")
+        self.gridLayout_32.addWidget(self.txt_p_exponent, 3, 0, 1, 1)
+        self.txt_extrap_p_exponent = QtWidgets.QLabel(self.gb_previous)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_extrap_p_exponent.setFont(font)
+        self.txt_extrap_p_exponent.setObjectName("txt_extrap_p_exponent")
+        self.gridLayout_32.addWidget(self.txt_extrap_p_exponent, 3, 1, 1, 1)
+        self.verticalLayout_61.addLayout(self.gridLayout_32)
+        self.pb_extrap_cancel = QtWidgets.QPushButton(self.gb_previous)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.pb_extrap_cancel.setFont(font)
+        self.pb_extrap_cancel.setObjectName("pb_extrap_cancel")
+        self.verticalLayout_61.addWidget(self.pb_extrap_cancel)
+        self.verticalLayout_33.addWidget(self.gb_previous)
+        self.gb_q = QtWidgets.QGroupBox(self.tab_extrap_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_q.setFont(font)
+        self.gb_q.setObjectName("gb_q")
+        self.verticalLayout_60 = QtWidgets.QVBoxLayout(self.gb_q)
+        self.verticalLayout_60.setObjectName("verticalLayout_60")
+        self.table_extrap_qsen = QtWidgets.QTableWidget(self.gb_q)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.table_extrap_qsen.setFont(font)
+        self.table_extrap_qsen.setObjectName("table_extrap_qsen")
+        self.table_extrap_qsen.setColumnCount(0)
+        self.table_extrap_qsen.setRowCount(0)
+        self.verticalLayout_60.addWidget(self.table_extrap_qsen)
+        self.verticalLayout_33.addWidget(self.gb_q)
+        self.verticalLayout_33.setStretch(0, 2)
+        self.verticalLayout_33.setStretch(1, 4)
+        self.horizontalLayout_26.addLayout(self.verticalLayout_33)
+        self.horizontalLayout_26.setStretch(0, 3)
+        self.horizontalLayout_26.setStretch(1, 6)
+        self.horizontalLayout_26.setStretch(2, 2)
+        self.horizontalLayout_26.setStretch(3, 5)
+        self.tab_extrap_2.addTab(self.tab_extrap_2_data, "")
+        self.tab_extrap_messages = QtWidgets.QWidget()
+        self.tab_extrap_messages.setObjectName("tab_extrap_messages")
+        self.verticalLayout_58 = QtWidgets.QVBoxLayout(self.tab_extrap_messages)
+        self.verticalLayout_58.setObjectName("verticalLayout_58")
+        self.box_extrap_messages = QtWidgets.QGroupBox(self.tab_extrap_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_extrap_messages.setFont(font)
+        self.box_extrap_messages.setObjectName("box_extrap_messages")
+        self.horizontalLayout_59 = QtWidgets.QHBoxLayout(self.box_extrap_messages)
+        self.horizontalLayout_59.setObjectName("horizontalLayout_59")
+        self.display_extrap_messages = QtWidgets.QPlainTextEdit(self.box_extrap_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_extrap_messages.setFont(font)
+        self.display_extrap_messages.setReadOnly(True)
+        self.display_extrap_messages.setObjectName("display_extrap_messages")
+        self.horizontalLayout_59.addWidget(self.display_extrap_messages)
+        self.verticalLayout_58.addWidget(self.box_extrap_messages)
+        self.box_extrap_comments = QtWidgets.QGroupBox(self.tab_extrap_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_extrap_comments.setFont(font)
+        self.box_extrap_comments.setObjectName("box_extrap_comments")
+        self.horizontalLayout_60 = QtWidgets.QHBoxLayout(self.box_extrap_comments)
+        self.horizontalLayout_60.setObjectName("horizontalLayout_60")
+        self.display_extrap_comments = QtWidgets.QPlainTextEdit(self.box_extrap_comments)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_extrap_comments.setFont(font)
+        self.display_extrap_comments.setReadOnly(True)
+        self.display_extrap_comments.setObjectName("display_extrap_comments")
+        self.horizontalLayout_60.addWidget(self.display_extrap_comments)
+        self.verticalLayout_58.addWidget(self.box_extrap_comments)
+        self.tab_extrap_2.addTab(self.tab_extrap_messages, "")
+        self.gridLayout_34.addWidget(self.tab_extrap_2, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_extrap, "")
+        self.tab_edges = QtWidgets.QWidget()
+        self.tab_edges.setObjectName("tab_edges")
+        self.gridLayout_42 = QtWidgets.QGridLayout(self.tab_edges)
+        self.gridLayout_42.setObjectName("gridLayout_42")
+        self.tab_edges_2 = QtWidgets.QTabWidget(self.tab_edges)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.tab_edges_2.setFont(font)
+        self.tab_edges_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_edges_2.setObjectName("tab_edges_2")
+        self.tab_edges_2_data = QtWidgets.QWidget()
+        self.tab_edges_2_data.setObjectName("tab_edges_2_data")
+        self.gridLayout_41 = QtWidgets.QGridLayout(self.tab_edges_2_data)
+        self.gridLayout_41.setObjectName("gridLayout_41")
+        self.verticalLayout_62 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_62.setObjectName("verticalLayout_62")
+        self.table_edges = QtWidgets.QTableWidget(self.tab_edges_2_data)
+        self.table_edges.setObjectName("table_edges")
+        self.table_edges.setColumnCount(0)
+        self.table_edges.setRowCount(0)
+        self.verticalLayout_62.addWidget(self.table_edges)
+        self.horizontalLayout_61 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_61.setObjectName("horizontalLayout_61")
+        self.gb_left = QtWidgets.QGroupBox(self.tab_edges_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.gb_left.setFont(font)
+        self.gb_left.setObjectName("gb_left")
+        self.gridLayout_36 = QtWidgets.QGridLayout(self.gb_left)
+        self.gridLayout_36.setObjectName("gridLayout_36")
+        self.horizontalLayout_34 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_34.setObjectName("horizontalLayout_34")
+        self.graph_left_contour = QtWidgets.QWidget(self.gb_left)
+        self.graph_left_contour.setObjectName("graph_left_contour")
+        self.horizontalLayout_34.addWidget(self.graph_left_contour)
+        self.graph_left_st = QtWidgets.QWidget(self.gb_left)
+        self.graph_left_st.setObjectName("graph_left_st")
+        self.horizontalLayout_34.addWidget(self.graph_left_st)
+        self.gridLayout_36.addLayout(self.horizontalLayout_34, 0, 0, 1, 1)
+        self.horizontalLayout_61.addWidget(self.gb_left)
+        self.gb_right = QtWidgets.QGroupBox(self.tab_edges_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.gb_right.setFont(font)
+        self.gb_right.setObjectName("gb_right")
+        self.gridLayout_40 = QtWidgets.QGridLayout(self.gb_right)
+        self.gridLayout_40.setObjectName("gridLayout_40")
+        self.horizontalLayout_58 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_58.setObjectName("horizontalLayout_58")
+        self.graph_right_contour = QtWidgets.QWidget(self.gb_right)
+        self.graph_right_contour.setObjectName("graph_right_contour")
+        self.horizontalLayout_58.addWidget(self.graph_right_contour)
+        self.graph_right_st = QtWidgets.QWidget(self.gb_right)
+        self.graph_right_st.setObjectName("graph_right_st")
+        self.horizontalLayout_58.addWidget(self.graph_right_st)
+        self.gridLayout_40.addLayout(self.horizontalLayout_58, 0, 0, 1, 1)
+        self.horizontalLayout_61.addWidget(self.gb_right)
+        self.verticalLayout_62.addLayout(self.horizontalLayout_61)
+        self.verticalLayout_62.setStretch(0, 4)
+        self.verticalLayout_62.setStretch(1, 7)
+        self.gridLayout_41.addLayout(self.verticalLayout_62, 0, 0, 1, 1)
+        self.tab_edges_2.addTab(self.tab_edges_2_data, "")
+        self.tab_wt_2_messages_3 = QtWidgets.QWidget()
+        self.tab_wt_2_messages_3.setObjectName("tab_wt_2_messages_3")
+        self.gridLayout_43 = QtWidgets.QGridLayout(self.tab_wt_2_messages_3)
+        self.gridLayout_43.setObjectName("gridLayout_43")
+        self.box_extrap_messages_2 = QtWidgets.QGroupBox(self.tab_wt_2_messages_3)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_extrap_messages_2.setFont(font)
+        self.box_extrap_messages_2.setObjectName("box_extrap_messages_2")
+        self.horizontalLayout_63 = QtWidgets.QHBoxLayout(self.box_extrap_messages_2)
+        self.horizontalLayout_63.setObjectName("horizontalLayout_63")
+        self.display_edges_messages = QtWidgets.QPlainTextEdit(self.box_extrap_messages_2)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_edges_messages.setFont(font)
+        self.display_edges_messages.setReadOnly(True)
+        self.display_edges_messages.setObjectName("display_edges_messages")
+        self.horizontalLayout_63.addWidget(self.display_edges_messages)
+        self.gridLayout_43.addWidget(self.box_extrap_messages_2, 0, 0, 1, 1)
+        self.box_extrap_comments_2 = QtWidgets.QGroupBox(self.tab_wt_2_messages_3)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_extrap_comments_2.setFont(font)
+        self.box_extrap_comments_2.setObjectName("box_extrap_comments_2")
+        self.horizontalLayout_62 = QtWidgets.QHBoxLayout(self.box_extrap_comments_2)
+        self.horizontalLayout_62.setObjectName("horizontalLayout_62")
+        self.display_edges_comments = QtWidgets.QPlainTextEdit(self.box_extrap_comments_2)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_edges_comments.setFont(font)
+        self.display_edges_comments.setReadOnly(True)
+        self.display_edges_comments.setObjectName("display_edges_comments")
+        self.horizontalLayout_62.addWidget(self.display_edges_comments)
+        self.gridLayout_43.addWidget(self.box_extrap_comments_2, 1, 0, 1, 1)
+        self.tab_edges_2.addTab(self.tab_wt_2_messages_3, "")
+        self.gridLayout_42.addWidget(self.tab_edges_2, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_edges, "")
+        self.tab_edi = QtWidgets.QWidget()
+        self.tab_edi.setObjectName("tab_edi")
+        self.gridLayout_44 = QtWidgets.QGridLayout(self.tab_edi)
+        self.gridLayout_44.setObjectName("gridLayout_44")
+        self.verticalLayout_65 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_65.setObjectName("verticalLayout_65")
+        self.gb_edi_transect = QtWidgets.QGroupBox(self.tab_edi)
+        font = QtGui.QFont()
+        font.setPointSize(14)
+        self.gb_edi_transect.setFont(font)
+        self.gb_edi_transect.setObjectName("gb_edi_transect")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_edi_transect)
+        self.gridLayout.setObjectName("gridLayout")
+        self.tbl_edi_transect = QtWidgets.QTableWidget(self.gb_edi_transect)
+        font = QtGui.QFont()
+        font.setPointSize(14)
+        self.tbl_edi_transect.setFont(font)
+        self.tbl_edi_transect.setObjectName("tbl_edi_transect")
+        self.tbl_edi_transect.setColumnCount(0)
+        self.tbl_edi_transect.setRowCount(0)
+        self.gridLayout.addWidget(self.tbl_edi_transect, 0, 0, 1, 1)
+        self.verticalLayout_65.addWidget(self.gb_edi_transect)
+        self.horizontalLayout_66 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_66.setObjectName("horizontalLayout_66")
+        self.txt_edi_offset = QtWidgets.QLabel(self.tab_edi)
+        font = QtGui.QFont()
+        font.setPointSize(14)
+        self.txt_edi_offset.setFont(font)
+        self.txt_edi_offset.setObjectName("txt_edi_offset")
+        self.horizontalLayout_66.addWidget(self.txt_edi_offset)
+        self.edi_offset = QtWidgets.QLineEdit(self.tab_edi)
+        font = QtGui.QFont()
+        font.setPointSize(14)
+        self.edi_offset.setFont(font)
+        self.edi_offset.setInputMethodHints(QtCore.Qt.ImhDigitsOnly)
+        self.edi_offset.setObjectName("edi_offset")
+        self.horizontalLayout_66.addWidget(self.edi_offset)
+        self.txt_edi_bank = QtWidgets.QLabel(self.tab_edi)
+        font = QtGui.QFont()
+        font.setPointSize(14)
+        self.txt_edi_bank.setFont(font)
+        self.txt_edi_bank.setObjectName("txt_edi_bank")
+        self.horizontalLayout_66.addWidget(self.txt_edi_bank)
+        spacerItem14 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_66.addItem(spacerItem14)
+        self.cb_edi_topoquad = QtWidgets.QCheckBox(self.tab_edi)
+        font = QtGui.QFont()
+        font.setPointSize(14)
+        self.cb_edi_topoquad.setFont(font)
+        self.cb_edi_topoquad.setObjectName("cb_edi_topoquad")
+        self.horizontalLayout_66.addWidget(self.cb_edi_topoquad)
+        self.horizontalLayout_66.setStretch(0, 1)
+        self.horizontalLayout_66.setStretch(1, 1)
+        self.horizontalLayout_66.setStretch(2, 1)
+        self.horizontalLayout_66.setStretch(3, 6)
+        self.horizontalLayout_66.setStretch(4, 1)
+        self.verticalLayout_65.addLayout(self.horizontalLayout_66)
+        self.tbl_edi_results = QtWidgets.QTableWidget(self.tab_edi)
+        font = QtGui.QFont()
+        font.setPointSize(14)
+        self.tbl_edi_results.setFont(font)
+        self.tbl_edi_results.setInputMethodHints(QtCore.Qt.ImhDigitsOnly)
+        self.tbl_edi_results.setRowCount(0)
+        self.tbl_edi_results.setColumnCount(0)
+        self.tbl_edi_results.setObjectName("tbl_edi_results")
+        self.verticalLayout_65.addWidget(self.tbl_edi_results)
+        self.horizontalLayout_67 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_67.setObjectName("horizontalLayout_67")
+        self.pb_edi_add_row = QtWidgets.QPushButton(self.tab_edi)
+        font = QtGui.QFont()
+        font.setPointSize(14)
+        self.pb_edi_add_row.setFont(font)
+        self.pb_edi_add_row.setObjectName("pb_edi_add_row")
+        self.horizontalLayout_67.addWidget(self.pb_edi_add_row)
+        spacerItem15 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_67.addItem(spacerItem15)
+        self.pb_edi_compute = QtWidgets.QPushButton(self.tab_edi)
+        font = QtGui.QFont()
+        font.setPointSize(14)
+        self.pb_edi_compute.setFont(font)
+        self.pb_edi_compute.setObjectName("pb_edi_compute")
+        self.horizontalLayout_67.addWidget(self.pb_edi_compute)
+        spacerItem16 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_67.addItem(spacerItem16)
+        self.verticalLayout_65.addLayout(self.horizontalLayout_67)
+        self.verticalLayout_65.setStretch(0, 3)
+        self.verticalLayout_65.setStretch(1, 1)
+        self.verticalLayout_65.setStretch(2, 5)
+        self.verticalLayout_65.setStretch(3, 1)
+        self.gridLayout_44.addLayout(self.verticalLayout_65, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_edi, "")
+        self.tab_uncertainty = QtWidgets.QWidget()
+        self.tab_uncertainty.setObjectName("tab_uncertainty")
+        self.gridLayout_45 = QtWidgets.QGridLayout(self.tab_uncertainty)
+        self.gridLayout_45.setObjectName("gridLayout_45")
+        self.tab_uncertainty_2 = QtWidgets.QTabWidget(self.tab_uncertainty)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.tab_uncertainty_2.setFont(font)
+        self.tab_uncertainty_2.setTabShape(QtWidgets.QTabWidget.Triangular)
+        self.tab_uncertainty_2.setObjectName("tab_uncertainty_2")
+        self.tab_uncertainty_2_data = QtWidgets.QWidget()
+        self.tab_uncertainty_2_data.setObjectName("tab_uncertainty_2_data")
+        self.gridLayout_50 = QtWidgets.QGridLayout(self.tab_uncertainty_2_data)
+        self.gridLayout_50.setObjectName("gridLayout_50")
+        self.verticalLayout_66 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_66.setObjectName("verticalLayout_66")
+        self.table_uncertainty_results = QtWidgets.QTableWidget(self.tab_uncertainty_2_data)
+        self.table_uncertainty_results.setObjectName("table_uncertainty_results")
+        self.table_uncertainty_results.setColumnCount(0)
+        self.table_uncertainty_results.setRowCount(0)
+        self.verticalLayout_66.addWidget(self.table_uncertainty_results)
+        self.horizontalLayout_69 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_69.setObjectName("horizontalLayout_69")
+        self.qb_contrib_meas_area = QtWidgets.QGroupBox(self.tab_uncertainty_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.qb_contrib_meas_area.setFont(font)
+        self.qb_contrib_meas_area.setObjectName("qb_contrib_meas_area")
+        self.horizontalLayout_71 = QtWidgets.QHBoxLayout(self.qb_contrib_meas_area)
+        self.horizontalLayout_71.setObjectName("horizontalLayout_71")
+        self.graph_u_meas = QtWidgets.QWidget(self.qb_contrib_meas_area)
+        self.graph_u_meas.setObjectName("graph_u_meas")
+        self.horizontalLayout_71.addWidget(self.graph_u_meas)
+        self.horizontalLayout_69.addWidget(self.qb_contrib_meas_area)
+        self.gb_contrib_measurement = QtWidgets.QGroupBox(self.tab_uncertainty_2_data)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.gb_contrib_measurement.setFont(font)
+        self.gb_contrib_measurement.setObjectName("gb_contrib_measurement")
+        self.horizontalLayout_70 = QtWidgets.QHBoxLayout(self.gb_contrib_measurement)
+        self.horizontalLayout_70.setObjectName("horizontalLayout_70")
+        self.graph_u_measurement = QtWidgets.QWidget(self.gb_contrib_measurement)
+        self.graph_u_measurement.setObjectName("graph_u_measurement")
+        self.horizontalLayout_70.addWidget(self.graph_u_measurement)
+        self.horizontalLayout_69.addWidget(self.gb_contrib_measurement)
+        self.horizontalLayout_69.setStretch(0, 3)
+        self.horizontalLayout_69.setStretch(1, 7)
+        self.verticalLayout_66.addLayout(self.horizontalLayout_69)
+        self.verticalLayout_66.setStretch(0, 5)
+        self.verticalLayout_66.setStretch(1, 5)
+        self.gridLayout_50.addLayout(self.verticalLayout_66, 0, 0, 1, 1)
+        self.tab_uncertainty_2.addTab(self.tab_uncertainty_2_data, "")
+        self.tab_uncertainty_2_advanced = QtWidgets.QWidget()
+        self.tab_uncertainty_2_advanced.setObjectName("tab_uncertainty_2_advanced")
+        self.gridLayout_47 = QtWidgets.QGridLayout(self.tab_uncertainty_2_advanced)
+        self.gridLayout_47.setObjectName("gridLayout_47")
+        self.table_uncertainty_settings = QtWidgets.QTableWidget(self.tab_uncertainty_2_advanced)
+        self.table_uncertainty_settings.setObjectName("table_uncertainty_settings")
+        self.table_uncertainty_settings.setColumnCount(0)
+        self.table_uncertainty_settings.setRowCount(0)
+        self.gridLayout_47.addWidget(self.table_uncertainty_settings, 0, 0, 1, 1)
+        self.tab_uncertainty_2.addTab(self.tab_uncertainty_2_advanced, "")
+        self.tab_uncertainty_2_messages = QtWidgets.QWidget()
+        self.tab_uncertainty_2_messages.setObjectName("tab_uncertainty_2_messages")
+        self.gridLayout_48 = QtWidgets.QGridLayout(self.tab_uncertainty_2_messages)
+        self.gridLayout_48.setObjectName("gridLayout_48")
+        self.box_uncertainty_messages = QtWidgets.QGroupBox(self.tab_uncertainty_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_uncertainty_messages.setFont(font)
+        self.box_uncertainty_messages.setObjectName("box_uncertainty_messages")
+        self.horizontalLayout_65 = QtWidgets.QHBoxLayout(self.box_uncertainty_messages)
+        self.horizontalLayout_65.setObjectName("horizontalLayout_65")
+        self.display_uncertainty_messages = QtWidgets.QPlainTextEdit(self.box_uncertainty_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_uncertainty_messages.setFont(font)
+        self.display_uncertainty_messages.setReadOnly(True)
+        self.display_uncertainty_messages.setObjectName("display_uncertainty_messages")
+        self.horizontalLayout_65.addWidget(self.display_uncertainty_messages)
+        self.gridLayout_48.addWidget(self.box_uncertainty_messages, 0, 0, 1, 1)
+        self.box_uncertainty_comments = QtWidgets.QGroupBox(self.tab_uncertainty_2_messages)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.box_uncertainty_comments.setFont(font)
+        self.box_uncertainty_comments.setObjectName("box_uncertainty_comments")
+        self.horizontalLayout_68 = QtWidgets.QHBoxLayout(self.box_uncertainty_comments)
+        self.horizontalLayout_68.setObjectName("horizontalLayout_68")
+        self.display_uncertainty_comments = QtWidgets.QPlainTextEdit(self.box_uncertainty_comments)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.display_uncertainty_comments.setFont(font)
+        self.display_uncertainty_comments.setReadOnly(True)
+        self.display_uncertainty_comments.setObjectName("display_uncertainty_comments")
+        self.horizontalLayout_68.addWidget(self.display_uncertainty_comments)
+        self.gridLayout_48.addWidget(self.box_uncertainty_comments, 1, 0, 1, 1)
+        self.tab_uncertainty_2.addTab(self.tab_uncertainty_2_messages, "")
+        self.gridLayout_45.addWidget(self.tab_uncertainty_2, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_uncertainty, "")
+        self.tab_adv_graph = QtWidgets.QWidget()
+        self.tab_adv_graph.setObjectName("tab_adv_graph")
+        self.gridLayout_57 = QtWidgets.QGridLayout(self.tab_adv_graph)
+        self.gridLayout_57.setObjectName("gridLayout_57")
+        self.adv_graph_layout = QtWidgets.QHBoxLayout()
+        self.adv_graph_layout.setObjectName("adv_graph_layout")
+        self.verticalLayout_86 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_86.setObjectName("verticalLayout_86")
+        self.horizontalLayout_86 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_86.setObjectName("horizontalLayout_86")
+        self.combo_adv_graph_transect = QtWidgets.QComboBox(self.tab_adv_graph)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.combo_adv_graph_transect.setFont(font)
+        self.combo_adv_graph_transect.setObjectName("combo_adv_graph_transect")
+        self.horizontalLayout_86.addWidget(self.combo_adv_graph_transect)
+        self.pb_adv_graph_controls = QtWidgets.QPushButton(self.tab_adv_graph)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.pb_adv_graph_controls.sizePolicy().hasHeightForWidth())
+        self.pb_adv_graph_controls.setSizePolicy(sizePolicy)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.pb_adv_graph_controls.setFont(font)
+        self.pb_adv_graph_controls.setObjectName("pb_adv_graph_controls")
+        self.horizontalLayout_86.addWidget(self.pb_adv_graph_controls)
+        self.verticalLayout_86.addLayout(self.horizontalLayout_86)
+        self.graph_adv_graph = QtWidgets.QWidget(self.tab_adv_graph)
+        self.graph_adv_graph.setObjectName("graph_adv_graph")
+        self.verticalLayout_86.addWidget(self.graph_adv_graph)
+        self.verticalLayout_86.setStretch(0, 1)
+        self.verticalLayout_86.setStretch(1, 20)
+        self.adv_graph_layout.addLayout(self.verticalLayout_86)
+        self.verticalLayout_99 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_99.setObjectName("verticalLayout_99")
+        self.gb_adv_graph_controls = QtWidgets.QGroupBox(self.tab_adv_graph)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_adv_graph_controls.setFont(font)
+        self.gb_adv_graph_controls.setObjectName("gb_adv_graph_controls")
+        self.gridLayout_55 = QtWidgets.QGridLayout(self.gb_adv_graph_controls)
+        self.gridLayout_55.setObjectName("gridLayout_55")
+        self.verticalLayout_98 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_98.setObjectName("verticalLayout_98")
+        self.groupBox_2 = QtWidgets.QGroupBox(self.gb_adv_graph_controls)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.groupBox_2.setFont(font)
+        self.groupBox_2.setObjectName("groupBox_2")
+        self.verticalLayout_94 = QtWidgets.QVBoxLayout(self.groupBox_2)
+        self.verticalLayout_94.setObjectName("verticalLayout_94")
+        self.cb_adv_graph_bt_boat_speed = QtWidgets.QCheckBox(self.groupBox_2)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_bt_boat_speed.setFont(font)
+        self.cb_adv_graph_bt_boat_speed.setObjectName("cb_adv_graph_bt_boat_speed")
+        self.verticalLayout_94.addWidget(self.cb_adv_graph_bt_boat_speed)
+        self.cb_adv_graph_bt_3beam = QtWidgets.QCheckBox(self.groupBox_2)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_bt_3beam.setFont(font)
+        self.cb_adv_graph_bt_3beam.setObjectName("cb_adv_graph_bt_3beam")
+        self.verticalLayout_94.addWidget(self.cb_adv_graph_bt_3beam)
+        self.cb_adv_graph_bt_error = QtWidgets.QCheckBox(self.groupBox_2)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_bt_error.setFont(font)
+        self.cb_adv_graph_bt_error.setObjectName("cb_adv_graph_bt_error")
+        self.verticalLayout_94.addWidget(self.cb_adv_graph_bt_error)
+        self.cb_adv_graph_bt_vertical = QtWidgets.QCheckBox(self.groupBox_2)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_bt_vertical.setFont(font)
+        self.cb_adv_graph_bt_vertical.setObjectName("cb_adv_graph_bt_vertical")
+        self.verticalLayout_94.addWidget(self.cb_adv_graph_bt_vertical)
+        self.cb_adv_graph_bt_source = QtWidgets.QCheckBox(self.groupBox_2)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_bt_source.setFont(font)
+        self.cb_adv_graph_bt_source.setObjectName("cb_adv_graph_bt_source")
+        self.verticalLayout_94.addWidget(self.cb_adv_graph_bt_source)
+        self.cb_adv_graph_bt_correlation = QtWidgets.QCheckBox(self.groupBox_2)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_bt_correlation.setFont(font)
+        self.cb_adv_graph_bt_correlation.setObjectName("cb_adv_graph_bt_correlation")
+        self.verticalLayout_94.addWidget(self.cb_adv_graph_bt_correlation)
+        self.cb_adv_graph_bt_rssi = QtWidgets.QCheckBox(self.groupBox_2)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_bt_rssi.setFont(font)
+        self.cb_adv_graph_bt_rssi.setObjectName("cb_adv_graph_bt_rssi")
+        self.verticalLayout_94.addWidget(self.cb_adv_graph_bt_rssi)
+        self.verticalLayout_98.addWidget(self.groupBox_2)
+        self.groupBox_3 = QtWidgets.QGroupBox(self.gb_adv_graph_controls)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.groupBox_3.setFont(font)
+        self.groupBox_3.setObjectName("groupBox_3")
+        self.verticalLayout_92 = QtWidgets.QVBoxLayout(self.groupBox_3)
+        self.verticalLayout_92.setObjectName("verticalLayout_92")
+        self.cb_adv_graph_gga_boat_speed = QtWidgets.QCheckBox(self.groupBox_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_gga_boat_speed.setFont(font)
+        self.cb_adv_graph_gga_boat_speed.setObjectName("cb_adv_graph_gga_boat_speed")
+        self.verticalLayout_92.addWidget(self.cb_adv_graph_gga_boat_speed)
+        self.cb_adv_graph_vtg_boat_speed = QtWidgets.QCheckBox(self.groupBox_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_vtg_boat_speed.setFont(font)
+        self.cb_adv_graph_vtg_boat_speed.setObjectName("cb_adv_graph_vtg_boat_speed")
+        self.verticalLayout_92.addWidget(self.cb_adv_graph_vtg_boat_speed)
+        self.cb_adv_graph_gga_quality = QtWidgets.QCheckBox(self.groupBox_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_gga_quality.setFont(font)
+        self.cb_adv_graph_gga_quality.setObjectName("cb_adv_graph_gga_quality")
+        self.verticalLayout_92.addWidget(self.cb_adv_graph_gga_quality)
+        self.cb_adv_graph_gga_hdop = QtWidgets.QCheckBox(self.groupBox_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_gga_hdop.setFont(font)
+        self.cb_adv_graph_gga_hdop.setObjectName("cb_adv_graph_gga_hdop")
+        self.verticalLayout_92.addWidget(self.cb_adv_graph_gga_hdop)
+        self.cb_adv_graph_gga_altitude = QtWidgets.QCheckBox(self.groupBox_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_gga_altitude.setFont(font)
+        self.cb_adv_graph_gga_altitude.setObjectName("cb_adv_graph_gga_altitude")
+        self.verticalLayout_92.addWidget(self.cb_adv_graph_gga_altitude)
+        self.cb_adv_graph_gga_satellites = QtWidgets.QCheckBox(self.groupBox_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_gga_satellites.setFont(font)
+        self.cb_adv_graph_gga_satellites.setObjectName("cb_adv_graph_gga_satellites")
+        self.verticalLayout_92.addWidget(self.cb_adv_graph_gga_satellites)
+        self.cb_adv_graph_gga_source = QtWidgets.QCheckBox(self.groupBox_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_gga_source.setFont(font)
+        self.cb_adv_graph_gga_source.setObjectName("cb_adv_graph_gga_source")
+        self.verticalLayout_92.addWidget(self.cb_adv_graph_gga_source)
+        self.cb_adv_graph_vtg_source = QtWidgets.QCheckBox(self.groupBox_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_vtg_source.setFont(font)
+        self.cb_adv_graph_vtg_source.setObjectName("cb_adv_graph_vtg_source")
+        self.verticalLayout_92.addWidget(self.cb_adv_graph_vtg_source)
+        self.verticalLayout_98.addWidget(self.groupBox_3)
+        spacerItem17 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_98.addItem(spacerItem17)
+        self.gridLayout_55.addLayout(self.verticalLayout_98, 0, 1, 1, 1)
+        self.pb_adv_graph_create_plots = QtWidgets.QPushButton(self.gb_adv_graph_controls)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(True)
+        font.setWeight(75)
+        self.pb_adv_graph_create_plots.setFont(font)
+        self.pb_adv_graph_create_plots.setObjectName("pb_adv_graph_create_plots")
+        self.gridLayout_55.addWidget(self.pb_adv_graph_create_plots, 3, 0, 1, 3)
+        self.verticalLayout_97 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_97.setObjectName("verticalLayout_97")
+        self.groupBox_6 = QtWidgets.QGroupBox(self.gb_adv_graph_controls)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.groupBox_6.setFont(font)
+        self.groupBox_6.setObjectName("groupBox_6")
+        self.verticalLayout_93 = QtWidgets.QVBoxLayout(self.groupBox_6)
+        self.verticalLayout_93.setObjectName("verticalLayout_93")
+        self.cb_adv_graph_discharge = QtWidgets.QCheckBox(self.groupBox_6)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_discharge.setFont(font)
+        self.cb_adv_graph_discharge.setObjectName("cb_adv_graph_discharge")
+        self.verticalLayout_93.addWidget(self.cb_adv_graph_discharge)
+        self.cb_adv_graph_discharge_percent = QtWidgets.QCheckBox(self.groupBox_6)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_discharge_percent.setFont(font)
+        self.cb_adv_graph_discharge_percent.setObjectName("cb_adv_graph_discharge_percent")
+        self.verticalLayout_93.addWidget(self.cb_adv_graph_discharge_percent)
+        self.verticalLayout_97.addWidget(self.groupBox_6)
+        self.groupBox_5 = QtWidgets.QGroupBox(self.gb_adv_graph_controls)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.groupBox_5.setFont(font)
+        self.groupBox_5.setObjectName("groupBox_5")
+        self.verticalLayout_90 = QtWidgets.QVBoxLayout(self.groupBox_5)
+        self.verticalLayout_90.setObjectName("verticalLayout_90")
+        self.cb_adv_graph_adcp_heading = QtWidgets.QCheckBox(self.groupBox_5)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_adcp_heading.setFont(font)
+        self.cb_adv_graph_adcp_heading.setObjectName("cb_adv_graph_adcp_heading")
+        self.verticalLayout_90.addWidget(self.cb_adv_graph_adcp_heading)
+        self.cb_adv_graph_ext_heading = QtWidgets.QCheckBox(self.groupBox_5)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_ext_heading.setFont(font)
+        self.cb_adv_graph_ext_heading.setObjectName("cb_adv_graph_ext_heading")
+        self.verticalLayout_90.addWidget(self.cb_adv_graph_ext_heading)
+        self.cb_adv_graph_mag_error = QtWidgets.QCheckBox(self.groupBox_5)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_mag_error.setFont(font)
+        self.cb_adv_graph_mag_error.setObjectName("cb_adv_graph_mag_error")
+        self.verticalLayout_90.addWidget(self.cb_adv_graph_mag_error)
+        self.cb_adv_graph_pitch = QtWidgets.QCheckBox(self.groupBox_5)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_pitch.setFont(font)
+        self.cb_adv_graph_pitch.setObjectName("cb_adv_graph_pitch")
+        self.verticalLayout_90.addWidget(self.cb_adv_graph_pitch)
+        self.cb_adv_graph_roll = QtWidgets.QCheckBox(self.groupBox_5)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_roll.setFont(font)
+        self.cb_adv_graph_roll.setObjectName("cb_adv_graph_roll")
+        self.verticalLayout_90.addWidget(self.cb_adv_graph_roll)
+        self.verticalLayout_97.addWidget(self.groupBox_5)
+        self.groupBox_4 = QtWidgets.QGroupBox(self.gb_adv_graph_controls)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.groupBox_4.setFont(font)
+        self.groupBox_4.setObjectName("groupBox_4")
+        self.verticalLayout_91 = QtWidgets.QVBoxLayout(self.groupBox_4)
+        self.verticalLayout_91.setObjectName("verticalLayout_91")
+        self.cb_adv_graph_beam_depths = QtWidgets.QCheckBox(self.groupBox_4)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_beam_depths.setFont(font)
+        self.cb_adv_graph_beam_depths.setObjectName("cb_adv_graph_beam_depths")
+        self.verticalLayout_91.addWidget(self.cb_adv_graph_beam_depths)
+        self.cb_adv_graph_final_depths = QtWidgets.QCheckBox(self.groupBox_4)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_final_depths.setFont(font)
+        self.cb_adv_graph_final_depths.setObjectName("cb_adv_graph_final_depths")
+        self.verticalLayout_91.addWidget(self.cb_adv_graph_final_depths)
+        self.cb_adv_graph_depth_source = QtWidgets.QCheckBox(self.groupBox_4)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_depth_source.setFont(font)
+        self.cb_adv_graph_depth_source.setObjectName("cb_adv_graph_depth_source")
+        self.verticalLayout_91.addWidget(self.cb_adv_graph_depth_source)
+        self.verticalLayout_97.addWidget(self.groupBox_4)
+        self.gb_sensors = QtWidgets.QGroupBox(self.gb_adv_graph_controls)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_sensors.setFont(font)
+        self.gb_sensors.setObjectName("gb_sensors")
+        self.verticalLayout_75 = QtWidgets.QVBoxLayout(self.gb_sensors)
+        self.verticalLayout_75.setObjectName("verticalLayout_75")
+        self.cb_adv_graph_battery_voltage = QtWidgets.QCheckBox(self.gb_sensors)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_battery_voltage.setFont(font)
+        self.cb_adv_graph_battery_voltage.setObjectName("cb_adv_graph_battery_voltage")
+        self.verticalLayout_75.addWidget(self.cb_adv_graph_battery_voltage)
+        self.verticalLayout_97.addWidget(self.gb_sensors)
+        spacerItem18 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_97.addItem(spacerItem18)
+        self.gridLayout_55.addLayout(self.verticalLayout_97, 0, 2, 1, 1)
+        self.verticalLayout_96 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_96.setObjectName("verticalLayout_96")
+        self.gb_plot_type_3 = QtWidgets.QGroupBox(self.gb_adv_graph_controls)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_plot_type_3.setFont(font)
+        self.gb_plot_type_3.setObjectName("gb_plot_type_3")
+        self.verticalLayout_87 = QtWidgets.QVBoxLayout(self.gb_plot_type_3)
+        self.verticalLayout_87.setObjectName("verticalLayout_87")
+        self.label_8 = QtWidgets.QLabel(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setUnderline(True)
+        font.setWeight(75)
+        self.label_8.setFont(font)
+        self.label_8.setObjectName("label_8")
+        self.verticalLayout_87.addWidget(self.label_8)
+        self.cb_adv_graph_speed_filtered = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_speed_filtered.setFont(font)
+        self.cb_adv_graph_speed_filtered.setObjectName("cb_adv_graph_speed_filtered")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_speed_filtered)
+        self.cb_adv_graph_speed_final = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_speed_final.setFont(font)
+        self.cb_adv_graph_speed_final.setObjectName("cb_adv_graph_speed_final")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_speed_final)
+        self.cb_adv_graph_projected = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_projected.setFont(font)
+        self.cb_adv_graph_projected.setObjectName("cb_adv_graph_projected")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_projected)
+        self.cb_adv_graph_vertical = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_vertical.setFont(font)
+        self.cb_adv_graph_vertical.setObjectName("cb_adv_graph_vertical")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_vertical)
+        self.cb_adv_graph_error = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_error.setFont(font)
+        self.cb_adv_graph_error.setObjectName("cb_adv_graph_error")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_error)
+        self.cb_adv_graph_direction = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_direction.setFont(font)
+        self.cb_adv_graph_direction.setObjectName("cb_adv_graph_direction")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_direction)
+        self.cb_adv_graph_avg_corr = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_avg_corr.setFont(font)
+        self.cb_adv_graph_avg_corr.setObjectName("cb_adv_graph_avg_corr")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_avg_corr)
+        self.cb_adv_graph_corr_beam = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_corr_beam.setFont(font)
+        self.cb_adv_graph_corr_beam.setObjectName("cb_adv_graph_corr_beam")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_corr_beam)
+        self.cb_adv_graph_avg_rssi = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_avg_rssi.setFont(font)
+        self.cb_adv_graph_avg_rssi.setObjectName("cb_adv_graph_avg_rssi")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_avg_rssi)
+        self.cb_adv_graph_rssi_beam = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_rssi_beam.setFont(font)
+        self.cb_adv_graph_rssi_beam.setObjectName("cb_adv_graph_rssi_beam")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_rssi_beam)
+        self.cb_adv_graph_ping_type = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_ping_type.setFont(font)
+        self.cb_adv_graph_ping_type.setObjectName("cb_adv_graph_ping_type")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_ping_type)
+        self.label_9 = QtWidgets.QLabel(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setUnderline(True)
+        font.setWeight(75)
+        self.label_9.setFont(font)
+        self.label_9.setObjectName("label_9")
+        self.verticalLayout_87.addWidget(self.label_9)
+        self.cb_adv_graph_avg_speed = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_avg_speed.setFont(font)
+        self.cb_adv_graph_avg_speed.setObjectName("cb_adv_graph_avg_speed")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_avg_speed)
+        self.cb_adv_graph_projected_speed_ts = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_projected_speed_ts.setFont(font)
+        self.cb_adv_graph_projected_speed_ts.setObjectName("cb_adv_graph_projected_speed_ts")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_projected_speed_ts)
+        self.cb_adv_graph_wt_error_ts = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_wt_error_ts.setFont(font)
+        self.cb_adv_graph_wt_error_ts.setObjectName("cb_adv_graph_wt_error_ts")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_wt_error_ts)
+        self.cb_adv_graph_wt_vert_ts = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_wt_vert_ts.setFont(font)
+        self.cb_adv_graph_wt_vert_ts.setObjectName("cb_adv_graph_wt_vert_ts")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_wt_vert_ts)
+        self.cb_adv_graph_wt_snr_ts = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_wt_snr_ts.setFont(font)
+        self.cb_adv_graph_wt_snr_ts.setObjectName("cb_adv_graph_wt_snr_ts")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_wt_snr_ts)
+        self.cb_adv_graph_wt_beams_ts = QtWidgets.QCheckBox(self.gb_plot_type_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.cb_adv_graph_wt_beams_ts.setFont(font)
+        self.cb_adv_graph_wt_beams_ts.setObjectName("cb_adv_graph_wt_beams_ts")
+        self.verticalLayout_87.addWidget(self.cb_adv_graph_wt_beams_ts)
+        self.verticalLayout_96.addWidget(self.gb_plot_type_3)
+        spacerItem19 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_96.addItem(spacerItem19)
+        self.verticalLayout_96.setStretch(0, 15)
+        self.verticalLayout_96.setStretch(1, 1)
+        self.gridLayout_55.addLayout(self.verticalLayout_96, 0, 0, 1, 1)
+        self.groupBox = QtWidgets.QGroupBox(self.gb_adv_graph_controls)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.groupBox.setFont(font)
+        self.groupBox.setObjectName("groupBox")
+        self.horizontalLayout_88 = QtWidgets.QHBoxLayout(self.groupBox)
+        self.horizontalLayout_88.setObjectName("horizontalLayout_88")
+        self.ed_adv_graph_flow_dir = QtWidgets.QLineEdit(self.groupBox)
+        self.ed_adv_graph_flow_dir.setMaximumSize(QtCore.QSize(100, 16777215))
+        self.ed_adv_graph_flow_dir.setObjectName("ed_adv_graph_flow_dir")
+        self.horizontalLayout_88.addWidget(self.ed_adv_graph_flow_dir)
+        self.pb_adv_graph_auto_flow_direction = QtWidgets.QPushButton(self.groupBox)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.pb_adv_graph_auto_flow_direction.sizePolicy().hasHeightForWidth())
+        self.pb_adv_graph_auto_flow_direction.setSizePolicy(sizePolicy)
+        self.pb_adv_graph_auto_flow_direction.setMaximumSize(QtCore.QSize(50, 16777215))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.pb_adv_graph_auto_flow_direction.setFont(font)
+        self.pb_adv_graph_auto_flow_direction.setObjectName("pb_adv_graph_auto_flow_direction")
+        self.horizontalLayout_88.addWidget(self.pb_adv_graph_auto_flow_direction)
+        self.gridLayout_55.addWidget(self.groupBox, 1, 0, 1, 1)
+        self.gb_x_axis_3 = QtWidgets.QGroupBox(self.gb_adv_graph_controls)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_x_axis_3.setFont(font)
+        self.gb_x_axis_3.setObjectName("gb_x_axis_3")
+        self.verticalLayout_89 = QtWidgets.QVBoxLayout(self.gb_x_axis_3)
+        self.verticalLayout_89.setObjectName("verticalLayout_89")
+        self.rb_adv_graph_ensemble = QtWidgets.QRadioButton(self.gb_x_axis_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_adv_graph_ensemble.setFont(font)
+        self.rb_adv_graph_ensemble.setObjectName("rb_adv_graph_ensemble")
+        self.verticalLayout_89.addWidget(self.rb_adv_graph_ensemble)
+        self.rb_adv_graph_time = QtWidgets.QRadioButton(self.gb_x_axis_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_adv_graph_time.setFont(font)
+        self.rb_adv_graph_time.setObjectName("rb_adv_graph_time")
+        self.verticalLayout_89.addWidget(self.rb_adv_graph_time)
+        self.rb_adv_graph_length = QtWidgets.QRadioButton(self.gb_x_axis_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.rb_adv_graph_length.setFont(font)
+        self.rb_adv_graph_length.setObjectName("rb_adv_graph_length")
+        self.verticalLayout_89.addWidget(self.rb_adv_graph_length)
+        self.gridLayout_55.addWidget(self.gb_x_axis_3, 1, 1, 1, 1)
+        self.verticalLayout_99.addWidget(self.gb_adv_graph_controls)
+        spacerItem20 = QtWidgets.QSpacerItem(20, 130, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_99.addItem(spacerItem20)
+        self.adv_graph_layout.addLayout(self.verticalLayout_99)
+        self.adv_graph_layout.setStretch(0, 7)
+        self.adv_graph_layout.setStretch(1, 3)
+        self.gridLayout_57.addLayout(self.adv_graph_layout, 0, 0, 1, 1)
+        self.tab_all.addTab(self.tab_adv_graph, "")
+        self.tab_map = QtWidgets.QWidget()
+        self.tab_map.setObjectName("tab_map")
+        self.horizontalLayout_101 = QtWidgets.QHBoxLayout(self.tab_map)
+        self.horizontalLayout_101.setObjectName("horizontalLayout_101")
+        self.horizontalLayout_100 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_100.setObjectName("horizontalLayout_100")
+        self.verticalLayout_71 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_71.setObjectName("verticalLayout_71")
+        self.horizontalLayout_90 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_90.setObjectName("horizontalLayout_90")
+        self.gb_previous_2 = QtWidgets.QGroupBox(self.tab_map)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_previous_2.setFont(font)
+        self.gb_previous_2.setObjectName("gb_previous_2")
+        self.verticalLayout_70 = QtWidgets.QVBoxLayout(self.gb_previous_2)
+        self.verticalLayout_70.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
+        self.verticalLayout_70.setObjectName("verticalLayout_70")
+        self.gridLayout_51 = QtWidgets.QGridLayout()
+        self.gridLayout_51.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
+        self.gridLayout_51.setObjectName("gridLayout_51")
+        self.horizontalLayout_87 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_87.setObjectName("horizontalLayout_87")
+        self.txt_map_data = QtWidgets.QLabel(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.txt_map_data.setFont(font)
+        self.txt_map_data.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.txt_map_data.setObjectName("txt_map_data")
+        self.horizontalLayout_87.addWidget(self.txt_map_data, 0, QtCore.Qt.AlignLeft)
+        self.combo_map_data = QtWidgets.QComboBox(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.combo_map_data.setFont(font)
+        self.combo_map_data.setObjectName("combo_map_data")
+        self.combo_map_data.addItem("")
+        self.combo_map_data.addItem("")
+        self.horizontalLayout_87.addWidget(self.combo_map_data)
+        spacerItem21 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_87.addItem(spacerItem21)
+        self.gridLayout_51.addLayout(self.horizontalLayout_87, 2, 0, 1, 1)
+        self.horizontalLayout_93 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_93.setObjectName("horizontalLayout_93")
+        self.cb_map_bed_profiles = QtWidgets.QCheckBox(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_map_bed_profiles.setFont(font)
+        self.cb_map_bed_profiles.setChecked(False)
+        self.cb_map_bed_profiles.setObjectName("cb_map_bed_profiles")
+        self.horizontalLayout_93.addWidget(self.cb_map_bed_profiles)
+        self.gridLayout_51.addLayout(self.horizontalLayout_93, 1, 1, 1, 1)
+        self.horizontalLayout_92 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_92.setObjectName("horizontalLayout_92")
+        self.label_6 = QtWidgets.QLabel(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_6.setFont(font)
+        self.label_6.setObjectName("label_6")
+        self.horizontalLayout_92.addWidget(self.label_6)
+        self.ed_map_secondary_velocity = QtWidgets.QLineEdit(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_map_secondary_velocity.setFont(font)
+        self.ed_map_secondary_velocity.setText("")
+        self.ed_map_secondary_velocity.setObjectName("ed_map_secondary_velocity")
+        self.horizontalLayout_92.addWidget(self.ed_map_secondary_velocity)
+        self.gridLayout_51.addLayout(self.horizontalLayout_92, 2, 1, 1, 1)
+        self.horizontalLayout_89 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_89.setObjectName("horizontalLayout_89")
+        self.label = QtWidgets.QLabel(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label.setFont(font)
+        self.label.setObjectName("label")
+        self.horizontalLayout_89.addWidget(self.label)
+        self.ed_map_cell_width = QtWidgets.QLineEdit(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_map_cell_width.setFont(font)
+        self.ed_map_cell_width.setObjectName("ed_map_cell_width")
+        self.horizontalLayout_89.addWidget(self.ed_map_cell_width)
+        self.label_2 = QtWidgets.QLabel(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_2.setFont(font)
+        self.label_2.setObjectName("label_2")
+        self.horizontalLayout_89.addWidget(self.label_2)
+        self.gridLayout_51.addLayout(self.horizontalLayout_89, 0, 0, 1, 1)
+        self.horizontalLayout_96 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_96.setObjectName("horizontalLayout_96")
+        self.ed_map_cell_height = QtWidgets.QLineEdit(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_map_cell_height.setFont(font)
+        self.ed_map_cell_height.setObjectName("ed_map_cell_height")
+        self.horizontalLayout_96.addWidget(self.ed_map_cell_height)
+        self.gridLayout_51.addLayout(self.horizontalLayout_96, 0, 1, 1, 1)
+        self.horizontalLayout_91 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_91.setObjectName("horizontalLayout_91")
+        self.cb_map_top_bottom = QtWidgets.QCheckBox(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_map_top_bottom.setFont(font)
+        self.cb_map_top_bottom.setChecked(True)
+        self.cb_map_top_bottom.setObjectName("cb_map_top_bottom")
+        self.horizontalLayout_91.addWidget(self.cb_map_top_bottom)
+        self.cb_map_edges = QtWidgets.QCheckBox(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_map_edges.setFont(font)
+        self.cb_map_edges.setChecked(True)
+        self.cb_map_edges.setObjectName("cb_map_edges")
+        self.horizontalLayout_91.addWidget(self.cb_map_edges)
+        self.cb_map_interpolation = QtWidgets.QCheckBox(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_map_interpolation.setFont(font)
+        self.cb_map_interpolation.setChecked(False)
+        self.cb_map_interpolation.setObjectName("cb_map_interpolation")
+        self.horizontalLayout_91.addWidget(self.cb_map_interpolation)
+        self.gridLayout_51.addLayout(self.horizontalLayout_91, 1, 0, 1, 1)
+        self.gridLayout_51.setColumnStretch(0, 1)
+        self.gridLayout_51.setRowStretch(0, 2)
+        self.verticalLayout_70.addLayout(self.gridLayout_51)
+        self.verticalLayout_69 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_69.setObjectName("verticalLayout_69")
+        self.horizontalLayout_99 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_99.setContentsMargins(-1, 0, -1, 0)
+        self.horizontalLayout_99.setObjectName("horizontalLayout_99")
+        spacerItem22 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_99.addItem(spacerItem22)
+        self.pb_map_apply = QtWidgets.QPushButton(self.gb_previous_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(True)
+        font.setWeight(75)
+        self.pb_map_apply.setFont(font)
+        self.pb_map_apply.setAutoDefault(False)
+        self.pb_map_apply.setDefault(False)
+        self.pb_map_apply.setObjectName("pb_map_apply")
+        self.horizontalLayout_99.addWidget(self.pb_map_apply)
+        self.horizontalLayout_99.setStretch(0, 2)
+        self.horizontalLayout_99.setStretch(1, 1)
+        self.verticalLayout_69.addLayout(self.horizontalLayout_99)
+        self.verticalLayout_69.setStretch(0, 1)
+        self.verticalLayout_70.addLayout(self.verticalLayout_69)
+        self.verticalLayout_70.setStretch(1, 1)
+        self.horizontalLayout_90.addWidget(self.gb_previous_2)
+        self.horizontalLayout_85 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_85.setObjectName("horizontalLayout_85")
+        spacerItem23 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_85.addItem(spacerItem23)
+        self.horizontalLayout_90.addLayout(self.horizontalLayout_85)
+        self.verticalLayout_71.addLayout(self.horizontalLayout_90)
+        self.verticalLayout_74 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_74.setObjectName("verticalLayout_74")
+        self.graphics_map_wt_contour = QtWidgets.QWidget(self.tab_map)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.graphics_map_wt_contour.sizePolicy().hasHeightForWidth())
+        self.graphics_map_wt_contour.setSizePolicy(sizePolicy)
+        self.graphics_map_wt_contour.setMinimumSize(QtCore.QSize(500, 200))
+        self.graphics_map_wt_contour.setAutoFillBackground(True)
+        self.graphics_map_wt_contour.setObjectName("graphics_map_wt_contour")
+        self.verticalLayout_74.addWidget(self.graphics_map_wt_contour)
+        self.horizontalLayout_94 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_94.setObjectName("horizontalLayout_94")
+        spacerItem24 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_94.addItem(spacerItem24)
+        self.pb_map_save = QtWidgets.QPushButton(self.tab_map)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(True)
+        font.setWeight(75)
+        self.pb_map_save.setFont(font)
+        self.pb_map_save.setObjectName("pb_map_save")
+        self.horizontalLayout_94.addWidget(self.pb_map_save)
+        spacerItem25 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_94.addItem(spacerItem25)
+        self.horizontalLayout_94.setStretch(0, 3)
+        self.horizontalLayout_94.setStretch(1, 1)
+        self.verticalLayout_74.addLayout(self.horizontalLayout_94)
+        self.verticalLayout_74.setStretch(0, 9)
+        self.verticalLayout_74.setStretch(1, 1)
+        self.verticalLayout_71.addLayout(self.verticalLayout_74)
+        self.verticalLayout_71.setStretch(0, 1)
+        self.verticalLayout_71.setStretch(1, 3)
+        self.horizontalLayout_100.addLayout(self.verticalLayout_71)
+        self.verticalLayout_73 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_73.setObjectName("verticalLayout_73")
+        self.gb_previous_3 = QtWidgets.QGroupBox(self.tab_map)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_previous_3.setFont(font)
+        self.gb_previous_3.setObjectName("gb_previous_3")
+        self.verticalLayout_72 = QtWidgets.QVBoxLayout(self.gb_previous_3)
+        self.verticalLayout_72.setObjectName("verticalLayout_72")
+        self.table_map_results = QtWidgets.QTableWidget(self.gb_previous_3)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.table_map_results.setFont(font)
+        self.table_map_results.setStyleSheet("")
+        self.table_map_results.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
+        self.table_map_results.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.table_map_results.setTextElideMode(QtCore.Qt.ElideNone)
+        self.table_map_results.setObjectName("table_map_results")
+        self.table_map_results.setColumnCount(0)
+        self.table_map_results.setRowCount(0)
+        self.verticalLayout_72.addWidget(self.table_map_results)
+        self.verticalLayout_73.addWidget(self.gb_previous_3)
+        self.graphics_map_track = QtWidgets.QWidget(self.tab_map)
+        self.graphics_map_track.setAutoFillBackground(True)
+        self.graphics_map_track.setObjectName("graphics_map_track")
+        self.verticalLayout_73.addWidget(self.graphics_map_track)
+        self.pb_map_open_earth = QtWidgets.QPushButton(self.tab_map)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.pb_map_open_earth.setFont(font)
+        self.pb_map_open_earth.setObjectName("pb_map_open_earth")
+        self.verticalLayout_73.addWidget(self.pb_map_open_earth)
+        self.verticalLayout_73.setStretch(0, 1)
+        self.verticalLayout_73.setStretch(1, 1)
+        self.verticalLayout_73.setStretch(2, 1)
+        self.horizontalLayout_100.addLayout(self.verticalLayout_73)
+        self.horizontalLayout_100.setStretch(0, 8)
+        self.horizontalLayout_100.setStretch(1, 2)
+        self.horizontalLayout_101.addLayout(self.horizontalLayout_100)
+        self.tab_all.addTab(self.tab_map, "")
+        self.horizontalLayout_4.addWidget(self.tab_all)
+        MainWindow.setCentralWidget(self.centralwidget)
+        self.statusbar = QtWidgets.QStatusBar(MainWindow)
+        self.statusbar.setObjectName("statusbar")
+        MainWindow.setStatusBar(self.statusbar)
+        self.toolBar = QtWidgets.QToolBar(MainWindow)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.toolBar.sizePolicy().hasHeightForWidth())
+        self.toolBar.setSizePolicy(sizePolicy)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setItalic(False)
+        font.setWeight(50)
+        self.toolBar.setFont(font)
+        self.toolBar.setLayoutDirection(QtCore.Qt.LeftToRight)
+        self.toolBar.setStyleSheet("QToolBar{background: solid rgb(240, 240, 240); font: 12pt}\n"
+"font: 12pt \"MS Shell Dlg 2\";")
+        self.toolBar.setMovable(False)
+        self.toolBar.setAllowedAreas(QtCore.Qt.AllToolBarAreas)
+        self.toolBar.setOrientation(QtCore.Qt.Horizontal)
+        self.toolBar.setIconSize(QtCore.QSize(70, 40))
+        self.toolBar.setFloatable(False)
+        self.toolBar.setObjectName("toolBar")
+        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
+        self.actionOpen = QtWidgets.QAction(MainWindow)
+        icon = QtGui.QIcon()
+        icon.addPixmap(QtGui.QPixmap(":/images/images/52.png"), QtGui.QIcon.Normal, QtGui.QIcon.On)
+        self.actionOpen.setIcon(icon)
+        self.actionOpen.setObjectName("actionOpen")
+        self.actionOptions = QtWidgets.QAction(MainWindow)
+        icon1 = QtGui.QIcon()
+        icon1.addPixmap(QtGui.QPixmap(":/images/24x24/Application.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon1.addPixmap(QtGui.QPixmap(":/images/24x24/Application.png"), QtGui.QIcon.Normal, QtGui.QIcon.On)
+        self.actionOptions.setIcon(icon1)
+        self.actionOptions.setObjectName("actionOptions")
+        self.actionSave = QtWidgets.QAction(MainWindow)
+        icon2 = QtGui.QIcon()
+        icon2.addPixmap(QtGui.QPixmap(":/images/images/22.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.actionSave.setIcon(icon2)
+        self.actionSave.setObjectName("actionSave")
+        self.actionComment = QtWidgets.QAction(MainWindow)
+        icon3 = QtGui.QIcon()
+        icon3.addPixmap(QtGui.QPixmap(":/images/24x24/Notes.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon3.addPixmap(QtGui.QPixmap(":/images/24x24/Notes.png"), QtGui.QIcon.Normal, QtGui.QIcon.On)
+        self.actionComment.setIcon(icon3)
+        self.actionComment.setObjectName("actionComment")
+        self.actionHelp = QtWidgets.QAction(MainWindow)
+        icon4 = QtGui.QIcon()
+        icon4.addPixmap(QtGui.QPixmap(":/images/24x24/Help book 3d.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.actionHelp.setIcon(icon4)
+        self.actionHelp.setObjectName("actionHelp")
+        self.actionCheck = QtWidgets.QAction(MainWindow)
+        icon5 = QtGui.QIcon()
+        icon5.addPixmap(QtGui.QPixmap(":/images/24x24/check-mark-green.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.actionCheck.setIcon(icon5)
+        self.actionCheck.setObjectName("actionCheck")
+        self.actionBT = QtWidgets.QAction(MainWindow)
+        self.actionBT.setCheckable(False)
+        self.actionBT.setChecked(False)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(True)
+        font.setWeight(75)
+        self.actionBT.setFont(font)
+        self.actionBT.setObjectName("actionBT")
+        self.actionGGA = QtWidgets.QAction(MainWindow)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.actionGGA.setFont(font)
+        self.actionGGA.setObjectName("actionGGA")
+        self.actionVTG = QtWidgets.QAction(MainWindow)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.actionVTG.setFont(font)
+        self.actionVTG.setObjectName("actionVTG")
+        self.actionNav_Reference = QtWidgets.QAction(MainWindow)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.actionNav_Reference.setFont(font)
+        self.actionNav_Reference.setObjectName("actionNav_Reference")
+        self.actionComp_Tracks = QtWidgets.QAction(MainWindow)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.actionComp_Tracks.setFont(font)
+        self.actionComp_Tracks.setObjectName("actionComp_Tracks")
+        self.actionON = QtWidgets.QAction(MainWindow)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        self.actionON.setFont(font)
+        self.actionON.setObjectName("actionON")
+        self.actionOFF = QtWidgets.QAction(MainWindow)
+        self.actionOFF.setCheckable(False)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(True)
+        font.setWeight(75)
+        self.actionOFF.setFont(font)
+        self.actionOFF.setObjectName("actionOFF")
+        self.actionHome = QtWidgets.QAction(MainWindow)
+        self.actionHome.setCheckable(False)
+        icon6 = QtGui.QIcon()
+        icon6.addPixmap(QtGui.QPixmap(":/images/24x24/Home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.actionHome.setIcon(icon6)
+        self.actionHome.setObjectName("actionHome")
+        self.actionZoom = QtWidgets.QAction(MainWindow)
+        self.actionZoom.setCheckable(True)
+        icon7 = QtGui.QIcon()
+        icon7.addPixmap(QtGui.QPixmap(":/images/images/83.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.actionZoom.setIcon(icon7)
+        self.actionZoom.setObjectName("actionZoom")
+        self.actionPan = QtWidgets.QAction(MainWindow)
+        self.actionPan.setCheckable(True)
+        icon8 = QtGui.QIcon()
+        icon8.addPixmap(QtGui.QPixmap(":/images/24x24/Move.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.actionPan.setIcon(icon8)
+        self.actionPan.setObjectName("actionPan")
+        self.actionData_Cursor = QtWidgets.QAction(MainWindow)
+        self.actionData_Cursor.setCheckable(True)
+        icon9 = QtGui.QIcon()
+        icon9.addPixmap(QtGui.QPixmap(":/images/24x24/Info.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.actionData_Cursor.setIcon(icon9)
+        self.actionData_Cursor.setObjectName("actionData_Cursor")
+        self.actionGoogle_Earth = QtWidgets.QAction(MainWindow)
+        icon10 = QtGui.QIcon()
+        icon10.addPixmap(QtGui.QPixmap(":/images/24x24/Globe.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.actionGoogle_Earth.setIcon(icon10)
+        self.actionGoogle_Earth.setObjectName("actionGoogle_Earth")
+        self.actionShow_Extrapolated = QtWidgets.QAction(MainWindow)
+        self.actionShow_Extrapolated.setCheckable(True)
+        icon11 = QtGui.QIcon()
+        icon11.addPixmap(QtGui.QPixmap(":/images/images/60.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.actionShow_Extrapolated.setIcon(icon11)
+        self.actionShow_Extrapolated.setObjectName("actionShow_Extrapolated")
+        self.toolBar.addAction(self.actionOpen)
+        self.toolBar.addSeparator()
+        self.toolBar.addAction(self.actionSave)
+        self.toolBar.addSeparator()
+        self.toolBar.addAction(self.actionOptions)
+        self.toolBar.addSeparator()
+        self.toolBar.addAction(self.actionComment)
+        self.toolBar.addSeparator()
+        self.toolBar.addAction(self.actionCheck)
+        self.toolBar.addSeparator()
+        self.toolBar.addAction(self.actionNav_Reference)
+        self.toolBar.addAction(self.actionBT)
+        self.toolBar.addAction(self.actionGGA)
+        self.toolBar.addAction(self.actionVTG)
+        self.toolBar.addSeparator()
+        self.toolBar.addAction(self.actionComp_Tracks)
+        self.toolBar.addAction(self.actionON)
+        self.toolBar.addAction(self.actionOFF)
+        self.toolBar.addSeparator()
+        self.toolBar.addAction(self.actionHome)
+        self.toolBar.addAction(self.actionZoom)
+        self.toolBar.addAction(self.actionPan)
+        self.toolBar.addAction(self.actionData_Cursor)
+        self.toolBar.addSeparator()
+        self.toolBar.addAction(self.actionShow_Extrapolated)
+        self.toolBar.addSeparator()
+        self.toolBar.addAction(self.actionGoogle_Earth)
+        self.toolBar.addSeparator()
+        self.toolBar.addAction(self.actionHelp)
+        self.toolBar.addSeparator()
+
+        self.retranslateUi(MainWindow)
+        self.tab_all.setCurrentIndex(0)
+        self.tab_summary.setCurrentIndex(0)
+        self.tab_mc.setCurrentIndex(0)
+        self.tab_systest_2.setCurrentIndex(1)
+        self.tab_compass_2.setCurrentIndex(0)
+        self.tab_tempsal_2.setCurrentIndex(0)
+        self.tab_mtb_2.setCurrentIndex(0)
+        self.tab_bt_2.setCurrentIndex(0)
+        self.tab_gps_2.setCurrentIndex(0)
+        self.combo_gps_qual.setCurrentIndex(1)
+        self.tab_depth_2.setCurrentIndex(0)
+        self.tab_wt_2.setCurrentIndex(0)
+        self.tab_extrap_2.setCurrentIndex(0)
+        self.tab_edges_2.setCurrentIndex(0)
+        self.tab_uncertainty_2.setCurrentIndex(0)
+        QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+    def retranslateUi(self, MainWindow):
+        _translate = QtCore.QCoreApplication.translate
+        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+        self.tab_summary.setTabText(self.tab_summary.indexOf(self.tab_summary_discharge), _translate("MainWindow", "Summary"))
+        self.tab_summary.setTabText(self.tab_summary.indexOf(self.tab_summary_details), _translate("MainWindow", "Details"))
+        self.label_site_name.setText(_translate("MainWindow", "Site Name: "))
+        self.label_site_number.setText(_translate("MainWindow", "Site Number:"))
+        self.label_person.setText(_translate("MainWindow", "Person(s):"))
+        self.label_measnum.setText(_translate("MainWindow", "Measurement Number:"))
+        self.label_stage_start.setText(_translate("MainWindow", "Stage Start:"))
+        self.label_stage_end.setText(_translate("MainWindow", "Stage End:"))
+        self.label_stage_meas.setText(_translate("MainWindow", "Measurement Stage:"))
+        self.tab_summary.setTabText(self.tab_summary.indexOf(self.tab_summary_premeasurement), _translate("MainWindow", "Premeasurement"))
+        self.tab_summary.setTabText(self.tab_summary.indexOf(self.tab_summary_settings), _translate("MainWindow", "Settings"))
+        self.tab_summary.setTabText(self.tab_summary.indexOf(self.tab_summary_adcp), _translate("MainWindow", "ADCP"))
+        self.tab_mc.setTabText(self.tab_mc.indexOf(self.tab_mc_messages), _translate("MainWindow", "Messages"))
+        self.tab_mc.setTabText(self.tab_mc.indexOf(self.tab_mc_comments), _translate("MainWindow", "Comments"))
+        self.label_5.setText(_translate("MainWindow", "User Rating:"))
+        self.cb_user_rating.setItemText(0, _translate("MainWindow", "Not Rated"))
+        self.cb_user_rating.setItemText(1, _translate("MainWindow", "Excellent (<3%)"))
+        self.cb_user_rating.setItemText(2, _translate("MainWindow", "Good (3-5%)"))
+        self.cb_user_rating.setItemText(3, _translate("MainWindow", "Fair (5-8%)"))
+        self.cb_user_rating.setItemText(4, _translate("MainWindow", "Poor (>8%)"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_main), _translate("MainWindow", "Main"))
+        self.tab_systest_2.setTabText(self.tab_systest_2.indexOf(self.tab_systest_2_results), _translate("MainWindow", "Results"))
+        self.box_systest_messages.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_systest_comments.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_systest_2.setTabText(self.tab_systest_2.indexOf(self.tab_systest_2_messages), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_systest), _translate("MainWindow", "SysTest"))
+        self.cb_adcp_compass.setText(_translate("MainWindow", "ADCP Compass"))
+        self.cb_ext_compass.setText(_translate("MainWindow", "Ext. Compass"))
+        self.cb_mag_field.setText(_translate("MainWindow", "Mag. Field"))
+        self.cb_pitch.setText(_translate("MainWindow", "Pitch"))
+        self.cb_roll.setText(_translate("MainWindow", "Roll"))
+        self.tab_compass_2.setTabText(self.tab_compass_2.indexOf(self.tab_compass_2_data), _translate("MainWindow", "Data"))
+        self.groupBox_cal.setTitle(_translate("MainWindow", "Compass Calibration"))
+        self.groupBox_eval.setTitle(_translate("MainWindow", "Compass Evaluation"))
+        self.tab_compass_2.setTabText(self.tab_compass_2.indexOf(self.tab_compass_2_cal), _translate("MainWindow", "Calibration / Evaluation"))
+        self.box_compass_messages.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_compass_comments.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_compass_2.setTabText(self.tab_compass_2.indexOf(self.tab_compass_2_messages), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_compass), _translate("MainWindow", "Compass/P/R"))
+        self.gb_temp.setTitle(_translate("MainWindow", "Water Temperature"))
+        self.label_independent.setText(_translate("MainWindow", "Independent:"))
+        self.pb_ind_temp_apply.setText(_translate("MainWindow", "Apply"))
+        self.label_adcp.setText(_translate("MainWindow", "ADCP:"))
+        self.pb_adcp_temp_apply.setText(_translate("MainWindow", "Apply"))
+        self.label_adcp_avg.setText(_translate("MainWindow", "ADCP Average:"))
+        self.txt_adcp_avg.setText(_translate("MainWindow", "0"))
+        self.rb_f.setText(_translate("MainWindow", "Fahrenheit"))
+        self.rb_c.setText(_translate("MainWindow", "Celsius"))
+        self.tab_tempsal_2.setTabText(self.tab_tempsal_2.indexOf(self.tab_tempsal_2_data), _translate("MainWindow", "Data"))
+        self.box_compass_messages_2.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_compass_comments_2.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_tempsal_2.setTabText(self.tab_tempsal_2.indexOf(self.tab_tempsal_2_messages), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_tempsal), _translate("MainWindow", "Temp/Sal"))
+        self.cb_mb_observed_no.setText(_translate("MainWindow", "User certifies that they have visually observed the streambed and that there is no moving-bed condition."))
+        self.cb_mb_bt.setText(_translate("MainWindow", "BT"))
+        self.cb_mb_gga.setText(_translate("MainWindow", "GGA"))
+        self.cb_mb_vtg.setText(_translate("MainWindow", "VTG"))
+        self.cb_mb_vectors.setText(_translate("MainWindow", "Vectors"))
+        self.tab_mtb_2.setTabText(self.tab_mtb_2.indexOf(self.tab_mbt_2_data), _translate("MainWindow", "Data"))
+        self.box_mb_messages.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_mb_comments.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_mtb_2.setTabText(self.tab_mtb_2.indexOf(self.tab_mbt_2_messages), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_mbt), _translate("MainWindow", "MovBedTst"))
+        self.rb_bt_beam.setText(_translate("MainWindow", "3 Beam Solutions"))
+        self.rb_bt_error.setText(_translate("MainWindow", "Error Velocity"))
+        self.rb_bt_vert.setText(_translate("MainWindow", "Vertical Velocity"))
+        self.rb_bt_other.setText(_translate("MainWindow", "Other"))
+        self.rb_bt_source.setText(_translate("MainWindow", "Source"))
+        self.cb_bt_bt.setText(_translate("MainWindow", "BT"))
+        self.cb_bt_gga.setText(_translate("MainWindow", "GGA"))
+        self.cb_bt_vtg.setText(_translate("MainWindow", "VTG"))
+        self.cb_bt_vectors.setText(_translate("MainWindow", "Vectors"))
+        self.gb_bt_filters.setTitle(_translate("MainWindow", "Filters"))
+        self.gb_bt_3beam.setTitle(_translate("MainWindow", "3 Beam Solutions"))
+        self.combo_bt_3beam.setItemText(0, _translate("MainWindow", "Auto"))
+        self.combo_bt_3beam.setItemText(1, _translate("MainWindow", "Allow"))
+        self.combo_bt_3beam.setItemText(2, _translate("MainWindow", "4-Beam Only"))
+        self.gb_bt_error_velocity.setTitle(_translate("MainWindow", "Error Velocity"))
+        self.combo_bt_error_velocity.setItemText(0, _translate("MainWindow", "Auto"))
+        self.combo_bt_error_velocity.setItemText(1, _translate("MainWindow", "Manual"))
+        self.combo_bt_error_velocity.setItemText(2, _translate("MainWindow", "Off"))
+        self.txt_bt_error_velocity.setText(_translate("MainWindow", "Threshold (+/-):"))
+        self.gb_bt_vertical_velocity.setTitle(_translate("MainWindow", "Vertical Velocity"))
+        self.combo_bt_vert_velocity.setItemText(0, _translate("MainWindow", "Auto"))
+        self.combo_bt_vert_velocity.setItemText(1, _translate("MainWindow", "Manual"))
+        self.combo_bt_vert_velocity.setItemText(2, _translate("MainWindow", "Off"))
+        self.txt_bt_vert_velocity.setText(_translate("MainWindow", "Threshold (+/-):"))
+        self.gb_bt_other.setTitle(_translate("MainWindow", "Other"))
+        self.combo_bt_other.setItemText(0, _translate("MainWindow", "Off"))
+        self.combo_bt_other.setItemText(1, _translate("MainWindow", "Smooth"))
+        self.tab_bt_2.setTabText(self.tab_bt_2.indexOf(self.tab_bt_2_data), _translate("MainWindow", "Data"))
+        self.box_bt_messages.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_bt_comments.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_bt_2.setTabText(self.tab_bt_2.indexOf(self.tab_bt_2_messages), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_bt), _translate("MainWindow", "BT"))
+        self.rb_gps_quality.setText(_translate("MainWindow", "Quality"))
+        self.rb_gps_altitude.setText(_translate("MainWindow", "Altitude"))
+        self.rb_gps_hdop.setText(_translate("MainWindow", "HDOP"))
+        self.rb_gps_sats.setText(_translate("MainWindow", "# Sats"))
+        self.rb_gps_other.setText(_translate("MainWindow", "Other"))
+        self.rb_gps_source.setText(_translate("MainWindow", "Source"))
+        self.cb_gps_bt.setText(_translate("MainWindow", "BT"))
+        self.cb_gps_gga.setText(_translate("MainWindow", "GGA"))
+        self.cb_gps_vtg.setText(_translate("MainWindow", "VTG"))
+        self.cb_gps_vectors.setText(_translate("MainWindow", "Vectors"))
+        self.gb_gps_filters.setTitle(_translate("MainWindow", "Filters"))
+        self.gb_gps_qual.setTitle(_translate("MainWindow", "Minimum Quality (GGA)"))
+        self.combo_gps_qual.setItemText(0, _translate("MainWindow", "1-Autonomous"))
+        self.combo_gps_qual.setItemText(1, _translate("MainWindow", "2-Differential"))
+        self.combo_gps_qual.setItemText(2, _translate("MainWindow", "4+-RTK"))
+        self.gb_gps_altitude.setTitle(_translate("MainWindow", "Altitude Change (GGA)"))
+        self.combo_gps_altitude.setItemText(0, _translate("MainWindow", "Auto"))
+        self.combo_gps_altitude.setItemText(1, _translate("MainWindow", "Manual"))
+        self.combo_gps_altitude.setItemText(2, _translate("MainWindow", "Off"))
+        self.txt_gps_altitude.setText(_translate("MainWindow", "Threshold (+/-):"))
+        self.gb_gps_hdop.setTitle(_translate("MainWindow", "HDOP"))
+        self.combo_gps_hdop.setItemText(0, _translate("MainWindow", "Auto"))
+        self.combo_gps_hdop.setItemText(1, _translate("MainWindow", "Manual"))
+        self.combo_gps_hdop.setItemText(2, _translate("MainWindow", "Off"))
+        self.txt_gps_hdop.setText(_translate("MainWindow", "Threshold (+/-):"))
+        self.gb_gps_other.setTitle(_translate("MainWindow", "Other"))
+        self.combo_gps_other.setItemText(0, _translate("MainWindow", "Off"))
+        self.combo_gps_other.setItemText(1, _translate("MainWindow", "Smooth"))
+        self.tab_gps_2.setTabText(self.tab_gps_2.indexOf(self.tab_gps_2_data), _translate("MainWindow", "Data"))
+        self.cb_gps_bt_2.setText(_translate("MainWindow", "BT"))
+        self.cb_gps_gga_2.setText(_translate("MainWindow", "GGA"))
+        self.cb_gps_vtg_2.setText(_translate("MainWindow", "VTG"))
+        self.cb_gps_vectors_2.setText(_translate("MainWindow", "Vectors"))
+        self.tab_gps_2.setTabText(self.tab_gps_2.indexOf(self.tab_gps_2_gpsbt), _translate("MainWindow", "GPS - BT"))
+        self.box_gps_messages.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_gps_comments.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_gps_2.setTabText(self.tab_gps_2.indexOf(self.tab_gps_2_messages), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_gps), _translate("MainWindow", "GPS"))
+        self.gb_depth_beams.setTitle(_translate("MainWindow", "Individual Beams"))
+        self.cb_depth_beam1.setText(_translate("MainWindow", "Beam 1"))
+        self.cb_depth_beam2.setText(_translate("MainWindow", "Beam 2"))
+        self.cb_depth_beam3.setText(_translate("MainWindow", "Beam 3"))
+        self.cb_depth_beam4.setText(_translate("MainWindow", "Beam 4"))
+        self.cb_depth_vert.setText(_translate("MainWindow", "Vertical"))
+        self.cb_depth_ds.setText(_translate("MainWindow", "Depth Sounder"))
+        self.gb_depth_cs.setTitle(_translate("MainWindow", "Cross Section"))
+        self.cb_depth_4beam_cs.setText(_translate("MainWindow", "4 Beam Avg"))
+        self.cb_depth_vert_cs.setText(_translate("MainWindow", "Vertical"))
+        self.cb_depth_ds_cs.setText(_translate("MainWindow", "Depth Sounder"))
+        self.cb_depth_final_cs.setText(_translate("MainWindow", "Final"))
+        self.gb_depth_settings.setTitle(_translate("MainWindow", "Settings"))
+        self.gb_depth_ref.setTitle(_translate("MainWindow", "Depth Reference"))
+        self.gb_depth_averaging.setTitle(_translate("MainWindow", "BT Averaging Method"))
+        self.combo_depth_avg.setItemText(0, _translate("MainWindow", "IDW"))
+        self.combo_depth_avg.setItemText(1, _translate("MainWindow", "Simple"))
+        self.gb_depth_filter.setTitle(_translate("MainWindow", "Filter"))
+        self.combo_depth_filter.setCurrentText(_translate("MainWindow", "Off"))
+        self.combo_depth_filter.setItemText(0, _translate("MainWindow", "Off"))
+        self.combo_depth_filter.setItemText(1, _translate("MainWindow", "Smooth"))
+        self.combo_depth_filter.setItemText(2, _translate("MainWindow", "TRDI"))
+        self.tab_depth_2.setTabText(self.tab_depth_2.indexOf(self.tab_depth_2_data), _translate("MainWindow", "Data"))
+        self.box_depth_messages.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_depth_comments.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_depth_2.setTabText(self.tab_depth_2.indexOf(self.tab_gps_2_messages_3), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_depth), _translate("MainWindow", "Depth"))
+        self.rb_wt_contour.setText(_translate("MainWindow", " Contour No Interp"))
+        self.rb_wt_beam.setText(_translate("MainWindow", "Beams Used"))
+        self.rb_wt_error.setText(_translate("MainWindow", "Error Vel."))
+        self.rb_wt_vert.setText(_translate("MainWindow", "Vertical Vel."))
+        self.rb_wt_snr.setText(_translate("MainWindow", "SNR"))
+        self.rb_wt_speed.setText(_translate("MainWindow", "Speed"))
+        self.cb_wt_bt.setText(_translate("MainWindow", "BT"))
+        self.cb_wt_gga.setText(_translate("MainWindow", "GGA"))
+        self.cb_wt_vtg.setText(_translate("MainWindow", "VTG"))
+        self.cb_wt_vectors.setText(_translate("MainWindow", "Vectors"))
+        self.gb_wt_filters.setTitle(_translate("MainWindow", "Filters"))
+        self.gb_wt_excluded.setTitle(_translate("MainWindow", "Excluded Distance"))
+        self.txt_wt_excluded.setText(_translate("MainWindow", "Below Xducer: "))
+        self.gb_wt_3beam.setTitle(_translate("MainWindow", "3 Beam Solutions"))
+        self.combo_wt_3beam.setItemText(0, _translate("MainWindow", "Auto"))
+        self.combo_wt_3beam.setItemText(1, _translate("MainWindow", "Allow"))
+        self.combo_wt_3beam.setItemText(2, _translate("MainWindow", "4-Beam Only"))
+        self.gb_wt_error_velocity.setTitle(_translate("MainWindow", "Error Velocity"))
+        self.combo_wt_error_velocity.setItemText(0, _translate("MainWindow", "Auto"))
+        self.combo_wt_error_velocity.setItemText(1, _translate("MainWindow", "Manual"))
+        self.combo_wt_error_velocity.setItemText(2, _translate("MainWindow", "Off"))
+        self.txt_wt_error_velocity.setText(_translate("MainWindow", "Threshold (+/-):"))
+        self.gb_wt_vertical_velocity.setTitle(_translate("MainWindow", "Vertical Velocity"))
+        self.combo_wt_vert_velocity.setItemText(0, _translate("MainWindow", "Auto"))
+        self.combo_wt_vert_velocity.setItemText(1, _translate("MainWindow", "Manual"))
+        self.combo_wt_vert_velocity.setItemText(2, _translate("MainWindow", "Off"))
+        self.txt_wt_vert_velocity.setText(_translate("MainWindow", "Threshold (+/-):"))
+        self.gb_snr.setTitle(_translate("MainWindow", "SNR"))
+        self.combo_wt_snr.setItemText(0, _translate("MainWindow", "Auto"))
+        self.combo_wt_snr.setItemText(1, _translate("MainWindow", "Off"))
+        self.tab_wt_2.setTabText(self.tab_wt_2.indexOf(self.tab_wt_2_data), _translate("MainWindow", "Data"))
+        self.box_wt_messages.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_wt_comments.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_wt_2.setTabText(self.tab_wt_2.indexOf(self.tab_wt_2_messages), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_wt), _translate("MainWindow", "WT"))
+        self.gp_points.setTitle(_translate("MainWindow", "Points"))
+        self.gb_profile.setTitle(_translate("MainWindow", "Profile"))
+        self.gb_depth_cell.setTitle(_translate("MainWindow", "Depth Cell"))
+        self.cb_extrap_data.setText(_translate("MainWindow", "Data"))
+        self.cb_extrap_surface.setText(_translate("MainWindow", "Surface Cells"))
+        self.gb_transects.setTitle(_translate("MainWindow", "Transects"))
+        self.cb_extrap_trans_medians.setText(_translate("MainWindow", "Medians"))
+        self.cb_extrap_trans_fit.setText(_translate("MainWindow", "Fit"))
+        self.gb_measurement.setTitle(_translate("MainWindow", "Measurement"))
+        self.cb_extrap_meas_medians.setText(_translate("MainWindow", "Medians"))
+        self.cb_extrap_meas_fit.setText(_translate("MainWindow", "Fit"))
+        self.txt_start.setText(_translate("MainWindow", "Start Edge: "))
+        self.txt_left.setText(_translate("MainWindow", "Left"))
+        self.txt_right.setText(_translate("MainWindow", "Right"))
+        self.gb_fit.setTitle(_translate("MainWindow", "Fit Parameters"))
+        self.combo_extrap_fit.setItemText(0, _translate("MainWindow", "Automatic"))
+        self.combo_extrap_fit.setItemText(1, _translate("MainWindow", "Manual"))
+        self.txt_top.setText(_translate("MainWindow", " Top:  "))
+        self.combo_extrap_top.setItemText(0, _translate("MainWindow", "Power"))
+        self.combo_extrap_top.setItemText(1, _translate("MainWindow", "Constant"))
+        self.combo_extrap_top.setItemText(2, _translate("MainWindow", "3-Point"))
+        self.txt_bottom.setText(_translate("MainWindow", "Bottom:  "))
+        self.combo_extrap_bottom.setItemText(0, _translate("MainWindow", "Power"))
+        self.combo_extrap_bottom.setItemText(1, _translate("MainWindow", "No Slip"))
+        self.txt_exponent.setText(_translate("MainWindow", "Exponent:  "))
+        self.gb_data.setTitle(_translate("MainWindow", "Data Used for Extrap Fitting"))
+        self.combo_extrap_data.setItemText(0, _translate("MainWindow", "Automatic"))
+        self.combo_extrap_data.setItemText(1, _translate("MainWindow", "Manual"))
+        self.label_3.setText(_translate("MainWindow", "Type: "))
+        self.combo_extrap_type.setItemText(0, _translate("MainWindow", "Discharge"))
+        self.combo_extrap_type.setItemText(1, _translate("MainWindow", "Velocity"))
+        self.txt_extrap_subsection.setText(_translate("MainWindow", "Subsection (% L to R, x:x):"))
+        self.text_extrap_threshold.setText(_translate("MainWindow", "Threshold (%): "))
+        self.gb_previous.setTitle(_translate("MainWindow", "Fit Settings When Tab Opened"))
+        self.txt_p_fit.setText(_translate("MainWindow", "Fit Method"))
+        self.txt_extrap_p_fit.setText(_translate("MainWindow", "TextLabel"))
+        self.txt_p_top.setText(_translate("MainWindow", "Top:"))
+        self.txt_extrap_p_top.setText(_translate("MainWindow", "TextLabel"))
+        self.txt_p_bottom.setText(_translate("MainWindow", "Bottom:"))
+        self.txt_extrap_p_bottom.setText(_translate("MainWindow", "TextLabel"))
+        self.txt_p_exponent.setText(_translate("MainWindow", "Exponent:"))
+        self.txt_extrap_p_exponent.setText(_translate("MainWindow", "TextLabel"))
+        self.pb_extrap_cancel.setText(_translate("MainWindow", "Reset to These Settings"))
+        self.gb_q.setTitle(_translate("MainWindow", "Discharge Sensitivity"))
+        self.tab_extrap_2.setTabText(self.tab_extrap_2.indexOf(self.tab_extrap_2_data), _translate("MainWindow", "Data"))
+        self.box_extrap_messages.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_extrap_comments.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_extrap_2.setTabText(self.tab_extrap_2.indexOf(self.tab_extrap_messages), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_extrap), _translate("MainWindow", "Extrap"))
+        self.gb_left.setTitle(_translate("MainWindow", "Left"))
+        self.gb_right.setTitle(_translate("MainWindow", "Right"))
+        self.tab_edges_2.setTabText(self.tab_edges_2.indexOf(self.tab_edges_2_data), _translate("MainWindow", "Data"))
+        self.box_extrap_messages_2.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_extrap_comments_2.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_edges_2.setTabText(self.tab_edges_2.indexOf(self.tab_wt_2_messages_3), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_edges), _translate("MainWindow", "Edges"))
+        self.gb_edi_transect.setTitle(_translate("MainWindow", "Select Transect"))
+        self.txt_edi_offset.setText(_translate("MainWindow", "Zero Distance Offset (ft):"))
+        self.txt_edi_bank.setText(_translate("MainWindow", " From Right Bank"))
+        self.cb_edi_topoquad.setText(_translate("MainWindow", "Create TopoQuad File"))
+        self.pb_edi_add_row.setText(_translate("MainWindow", "Add Row"))
+        self.pb_edi_compute.setText(_translate("MainWindow", "Compute Stations"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_edi), _translate("MainWindow", "EDI"))
+        self.qb_contrib_meas_area.setTitle(_translate("MainWindow", "Contributions to Meas. Q Uncertainty"))
+        self.gb_contrib_measurement.setTitle(_translate("MainWindow", "Contributions to Measurement Uncertainty"))
+        self.tab_uncertainty_2.setTabText(self.tab_uncertainty_2.indexOf(self.tab_uncertainty_2_data), _translate("MainWindow", "Data"))
+        self.tab_uncertainty_2.setTabText(self.tab_uncertainty_2.indexOf(self.tab_uncertainty_2_advanced), _translate("MainWindow", "Advanced Settings"))
+        self.box_uncertainty_messages.setTitle(_translate("MainWindow", "Quality Check Messages"))
+        self.box_uncertainty_comments.setTitle(_translate("MainWindow", "Comments"))
+        self.tab_uncertainty_2.setTabText(self.tab_uncertainty_2.indexOf(self.tab_uncertainty_2_messages), _translate("MainWindow", "Messages"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_uncertainty), _translate("MainWindow", "Uncertainty"))
+        self.pb_adv_graph_controls.setText(_translate("MainWindow", "Hide Plot Controls"))
+        self.gb_adv_graph_controls.setTitle(_translate("MainWindow", "Plot Controls"))
+        self.groupBox_2.setTitle(_translate("MainWindow", "Bottom Track"))
+        self.cb_adv_graph_bt_boat_speed.setText(_translate("MainWindow", "Boat Speed (BT)"))
+        self.cb_adv_graph_bt_3beam.setText(_translate("MainWindow", "3 Beam Solutions"))
+        self.cb_adv_graph_bt_error.setText(_translate("MainWindow", "Error Velocity"))
+        self.cb_adv_graph_bt_vertical.setText(_translate("MainWindow", "Vertical Velocity"))
+        self.cb_adv_graph_bt_source.setText(_translate("MainWindow", "Source"))
+        self.cb_adv_graph_bt_correlation.setText(_translate("MainWindow", "Correlation"))
+        self.cb_adv_graph_bt_rssi.setText(_translate("MainWindow", "RSSI"))
+        self.groupBox_3.setTitle(_translate("MainWindow", "GPS"))
+        self.cb_adv_graph_gga_boat_speed.setText(_translate("MainWindow", "Boat Speed (GGA)"))
+        self.cb_adv_graph_vtg_boat_speed.setText(_translate("MainWindow", "Boat Speed (VTG)"))
+        self.cb_adv_graph_gga_quality.setText(_translate("MainWindow", "Quality"))
+        self.cb_adv_graph_gga_hdop.setText(_translate("MainWindow", "HDOP"))
+        self.cb_adv_graph_gga_altitude.setText(_translate("MainWindow", "Altitude"))
+        self.cb_adv_graph_gga_satellites.setText(_translate("MainWindow", "No. Satellites"))
+        self.cb_adv_graph_gga_source.setText(_translate("MainWindow", "Source (GGA)"))
+        self.cb_adv_graph_vtg_source.setText(_translate("MainWindow", "Source (VTG)"))
+        self.pb_adv_graph_create_plots.setText(_translate("MainWindow", "Create Plot"))
+        self.groupBox_6.setTitle(_translate("MainWindow", "Discharge"))
+        self.cb_adv_graph_discharge.setText(_translate("MainWindow", "Discharge Time Series"))
+        self.cb_adv_graph_discharge_percent.setText(_translate("MainWindow", "Discharge % of Total"))
+        self.groupBox_5.setTitle(_translate("MainWindow", "Compass/P/R"))
+        self.cb_adv_graph_adcp_heading.setText(_translate("MainWindow", "Heading (ADCP)"))
+        self.cb_adv_graph_ext_heading.setText(_translate("MainWindow", "Heading (External)"))
+        self.cb_adv_graph_mag_error.setText(_translate("MainWindow", "Magnetic Error"))
+        self.cb_adv_graph_pitch.setText(_translate("MainWindow", "Pitch"))
+        self.cb_adv_graph_roll.setText(_translate("MainWindow", "Roll"))
+        self.groupBox_4.setTitle(_translate("MainWindow", "Depth"))
+        self.cb_adv_graph_beam_depths.setText(_translate("MainWindow", "Beam Depths"))
+        self.cb_adv_graph_final_depths.setText(_translate("MainWindow", "Final Depths"))
+        self.cb_adv_graph_depth_source.setText(_translate("MainWindow", "Depth Source"))
+        self.gb_sensors.setTitle(_translate("MainWindow", "Sensors"))
+        self.cb_adv_graph_battery_voltage.setText(_translate("MainWindow", "Battery Voltage"))
+        self.gb_plot_type_3.setTitle(_translate("MainWindow", "Water Track"))
+        self.label_8.setText(_translate("MainWindow", "Contour Plots"))
+        self.cb_adv_graph_speed_filtered.setText(_translate("MainWindow", "Speed - Filtered"))
+        self.cb_adv_graph_speed_final.setText(_translate("MainWindow", "Speed - Final"))
+        self.cb_adv_graph_projected.setText(_translate("MainWindow", "Speed Projected"))
+        self.cb_adv_graph_vertical.setText(_translate("MainWindow", "Vertical Velocity"))
+        self.cb_adv_graph_error.setText(_translate("MainWindow", "Error Velocity"))
+        self.cb_adv_graph_direction.setText(_translate("MainWindow", "Direction"))
+        self.cb_adv_graph_avg_corr.setText(_translate("MainWindow", "Average Correlation"))
+        self.cb_adv_graph_corr_beam.setText(_translate("MainWindow", "Correlation by Beam"))
+        self.cb_adv_graph_avg_rssi.setText(_translate("MainWindow", "Average RSSI or SNR"))
+        self.cb_adv_graph_rssi_beam.setText(_translate("MainWindow", "RSSI or SNR by Beam"))
+        self.cb_adv_graph_ping_type.setText(_translate("MainWindow", "Ping Type"))
+        self.label_9.setText(_translate("MainWindow", "Time Series"))
+        self.cb_adv_graph_avg_speed.setText(_translate("MainWindow", "Average Speed"))
+        self.cb_adv_graph_projected_speed_ts.setText(_translate("MainWindow", "Projected Speed"))
+        self.cb_adv_graph_wt_error_ts.setText(_translate("MainWindow", "Error Velocity"))
+        self.cb_adv_graph_wt_vert_ts.setText(_translate("MainWindow", "Vertical Velocity"))
+        self.cb_adv_graph_wt_snr_ts.setText(_translate("MainWindow", "SNR"))
+        self.cb_adv_graph_wt_beams_ts.setText(_translate("MainWindow", "Beams Used"))
+        self.groupBox.setTitle(_translate("MainWindow", "Projection Angle"))
+        self.pb_adv_graph_auto_flow_direction.setText(_translate("MainWindow", "Auto"))
+        self.gb_x_axis_3.setTitle(_translate("MainWindow", "Select X-Axis"))
+        self.rb_adv_graph_ensemble.setText(_translate("MainWindow", "Ensemble"))
+        self.rb_adv_graph_time.setText(_translate("MainWindow", "Time"))
+        self.rb_adv_graph_length.setText(_translate("MainWindow", "Length"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_adv_graph), _translate("MainWindow", "Adv. Graph"))
+        self.gb_previous_2.setTitle(_translate("MainWindow", "MAP Properties"))
+        self.txt_map_data.setText(_translate("MainWindow", "Data to plot:"))
+        self.combo_map_data.setItemText(0, _translate("MainWindow", "Primary velocity"))
+        self.combo_map_data.setItemText(1, _translate("MainWindow", "Streamwise velocity"))
+        self.cb_map_bed_profiles.setText(_translate("MainWindow", "Individual bed profiles"))
+        self.label_6.setText(_translate("MainWindow", "Quiver scale:"))
+        self.label.setText(_translate("MainWindow", "Cell width (m)"))
+        self.label_2.setText(_translate("MainWindow", "Cell height (m)"))
+        self.cb_map_top_bottom.setText(_translate("MainWindow", "Top/bottom extrap"))
+        self.cb_map_edges.setText(_translate("MainWindow", "Edges extrap"))
+        self.cb_map_interpolation.setText(_translate("MainWindow", "Interpolation"))
+        self.pb_map_apply.setText(_translate("MainWindow", "Apply"))
+        self.pb_map_save.setText(_translate("MainWindow", "Save MAP data"))
+        self.gb_previous_3.setTitle(_translate("MainWindow", "MAP Results"))
+        self.pb_map_open_earth.setText(_translate("MainWindow", "Open MAP in Google Earth"))
+        self.tab_all.setTabText(self.tab_all.indexOf(self.tab_map), _translate("MainWindow", "MAP"))
+        self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
+        self.actionOpen.setText(_translate("MainWindow", "Open"))
+        self.actionOpen.setToolTip(_translate("MainWindow", "Opens measurement data file(s)"))
+        self.actionOptions.setText(_translate("MainWindow", "options"))
+        self.actionOptions.setToolTip(_translate("MainWindow", "Optional Settings"))
+        self.actionSave.setText(_translate("MainWindow", "Save"))
+        self.actionComment.setText(_translate("MainWindow", "Comment"))
+        self.actionHelp.setText(_translate("MainWindow", "Help"))
+        self.actionCheck.setText(_translate("MainWindow", "Check/Uncheck"))
+        self.actionBT.setText(_translate("MainWindow", "BT"))
+        self.actionBT.setToolTip(_translate("MainWindow", "BT"))
+        self.actionGGA.setText(_translate("MainWindow", "GGA"))
+        self.actionGGA.setToolTip(_translate("MainWindow", "GGA"))
+        self.actionVTG.setText(_translate("MainWindow", "VTG"))
+        self.actionVTG.setToolTip(_translate("MainWindow", "VTG"))
+        self.actionNav_Reference.setText(_translate("MainWindow", "Nav Reference:"))
+        self.actionNav_Reference.setToolTip(_translate("MainWindow", "Nav Reference:"))
+        self.actionComp_Tracks.setText(_translate("MainWindow", "Comp Tracks:"))
+        self.actionON.setText(_translate("MainWindow", "ON"))
+        self.actionOFF.setText(_translate("MainWindow", "OFF"))
+        self.actionHome.setText(_translate("MainWindow", "Home"))
+        self.actionHome.setToolTip(_translate("MainWindow", "Reset zoom / pan"))
+        self.actionZoom.setText(_translate("MainWindow", "Zoom"))
+        self.actionZoom.setToolTip(_translate("MainWindow", "Zoom rectangle"))
+        self.actionPan.setText(_translate("MainWindow", "Pan"))
+        self.actionPan.setToolTip(_translate("MainWindow", "Pan"))
+        self.actionData_Cursor.setText(_translate("MainWindow", "Data Cursor"))
+        self.actionData_Cursor.setToolTip(_translate("MainWindow", "Data Cursor"))
+        self.actionGoogle_Earth.setText(_translate("MainWindow", "Google Earth"))
+        self.actionGoogle_Earth.setToolTip(_translate("MainWindow", "Plot to Google Earth"))
+        self.actionShow_Extrapolated.setText(_translate("MainWindow", "Show_Extrapolated"))
+        self.actionShow_Extrapolated.setToolTip(_translate("MainWindow", "Show extrapolated speeds"))
+import dsm_rc
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    MainWindow = QtWidgets.QMainWindow()
+    ui = Ui_MainWindow()
+    ui.setupUi(MainWindow)
+    MainWindow.show()
+    sys.exit(app.exec_())
diff --git a/UI/QRev_gui.ui b/UI/QRev_gui.ui
new file mode 100644
index 0000000000000000000000000000000000000000..414ee2dd5a6174cd842d5d17f8b85e4eedca32a3
--- /dev/null
+++ b/UI/QRev_gui.ui
@@ -0,0 +1,8352 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>1925</width>
+    <height>1055</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="palette">
+   <palette>
+    <active>
+     <colorrole role="Button">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>175</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Text">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Base">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>175</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Window">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>175</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="PlaceholderText">
+      <brush brushstyle="NoBrush">
+       <color alpha="128">
+        <red>0</red>
+        <green>0</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+    </active>
+    <inactive>
+     <colorrole role="Button">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>175</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Text">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Base">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>175</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Window">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>175</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="PlaceholderText">
+      <brush brushstyle="NoBrush">
+       <color alpha="128">
+        <red>0</red>
+        <green>0</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+    </inactive>
+    <disabled>
+     <colorrole role="Button">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>175</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Text">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>120</red>
+        <green>120</green>
+        <blue>120</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Base">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>175</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Window">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>175</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="PlaceholderText">
+      <brush brushstyle="NoBrush">
+       <color alpha="128">
+        <red>0</red>
+        <green>0</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+    </disabled>
+   </palette>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <property name="windowIcon">
+   <iconset theme="QRevInt.ico">
+    <normaloff>../../../../../.designer/backup</normaloff>../../../../../.designer/backup</iconset>
+  </property>
+  <property name="layoutDirection">
+   <enum>Qt::LeftToRight</enum>
+  </property>
+  <property name="styleSheet">
+   <string notr="true">QMainWindow{background: solid rgb(0, 0, 175);}</string>
+  </property>
+  <property name="dockOptions">
+   <set>QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks|QMainWindow::VerticalTabs</set>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <property name="sizePolicy">
+    <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+   </property>
+   <layout class="QHBoxLayout" name="horizontalLayout_4" stretch="0">
+    <item>
+     <widget class="QTabWidget" name="tab_all">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
+      <property name="sizeIncrement">
+       <size>
+        <width>0</width>
+        <height>0</height>
+       </size>
+      </property>
+      <property name="palette">
+       <palette>
+        <active>
+         <colorrole role="Text">
+          <brush brushstyle="SolidPattern">
+           <color alpha="255">
+            <red>0</red>
+            <green>0</green>
+            <blue>0</blue>
+           </color>
+          </brush>
+         </colorrole>
+         <colorrole role="PlaceholderText">
+          <brush brushstyle="NoBrush">
+           <color alpha="128">
+            <red>0</red>
+            <green>0</green>
+            <blue>0</blue>
+           </color>
+          </brush>
+         </colorrole>
+        </active>
+        <inactive>
+         <colorrole role="Text">
+          <brush brushstyle="SolidPattern">
+           <color alpha="255">
+            <red>0</red>
+            <green>0</green>
+            <blue>0</blue>
+           </color>
+          </brush>
+         </colorrole>
+         <colorrole role="PlaceholderText">
+          <brush brushstyle="NoBrush">
+           <color alpha="128">
+            <red>0</red>
+            <green>0</green>
+            <blue>0</blue>
+           </color>
+          </brush>
+         </colorrole>
+        </inactive>
+        <disabled>
+         <colorrole role="Text">
+          <brush brushstyle="SolidPattern">
+           <color alpha="255">
+            <red>120</red>
+            <green>120</green>
+            <blue>120</blue>
+           </color>
+          </brush>
+         </colorrole>
+         <colorrole role="PlaceholderText">
+          <brush brushstyle="NoBrush">
+           <color alpha="128">
+            <red>0</red>
+            <green>0</green>
+            <blue>0</blue>
+           </color>
+          </brush>
+         </colorrole>
+        </disabled>
+       </palette>
+      </property>
+      <property name="font">
+       <font>
+        <pointsize>12</pointsize>
+       </font>
+      </property>
+      <property name="autoFillBackground">
+       <bool>false</bool>
+      </property>
+      <property name="tabPosition">
+       <enum>QTabWidget::North</enum>
+      </property>
+      <property name="tabShape">
+       <enum>QTabWidget::Triangular</enum>
+      </property>
+      <property name="currentIndex">
+       <number>0</number>
+      </property>
+      <property name="iconSize">
+       <size>
+        <width>40</width>
+        <height>24</height>
+       </size>
+      </property>
+      <widget class="QWidget" name="tab_main">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <attribute name="title">
+        <string>Main</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_49">
+        <item row="0" column="0">
+         <layout class="QHBoxLayout" name="horizontalLayout_76" stretch="8,2">
+          <item>
+           <widget class="QSplitter" name="splitter">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <widget class="QTabWidget" name="tab_summary">
+             <property name="palette">
+              <palette>
+               <active>
+                <colorrole role="WindowText">
+                 <brush brushstyle="SolidPattern">
+                  <color alpha="255">
+                   <red>0</red>
+                   <green>0</green>
+                   <blue>0</blue>
+                  </color>
+                 </brush>
+                </colorrole>
+               </active>
+               <inactive>
+                <colorrole role="WindowText">
+                 <brush brushstyle="SolidPattern">
+                  <color alpha="255">
+                   <red>0</red>
+                   <green>0</green>
+                   <blue>0</blue>
+                  </color>
+                 </brush>
+                </colorrole>
+               </inactive>
+               <disabled>
+                <colorrole role="WindowText">
+                 <brush brushstyle="SolidPattern">
+                  <color alpha="255">
+                   <red>120</red>
+                   <green>120</green>
+                   <blue>120</blue>
+                  </color>
+                 </brush>
+                </colorrole>
+               </disabled>
+              </palette>
+             </property>
+             <property name="font">
+              <font>
+               <pointsize>12</pointsize>
+              </font>
+             </property>
+             <property name="layoutDirection">
+              <enum>Qt::LeftToRight</enum>
+             </property>
+             <property name="tabPosition">
+              <enum>QTabWidget::North</enum>
+             </property>
+             <property name="tabShape">
+              <enum>QTabWidget::Triangular</enum>
+             </property>
+             <property name="currentIndex">
+              <number>0</number>
+             </property>
+             <widget class="QWidget" name="tab_summary_discharge">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <attribute name="title">
+               <string>Summary</string>
+              </attribute>
+              <layout class="QGridLayout" name="gridLayout_2">
+               <item row="0" column="0">
+                <widget class="QTableWidget" name="main_table_summary">
+                 <property name="font">
+                  <font>
+                   <pointsize>10</pointsize>
+                  </font>
+                 </property>
+                 <property name="autoFillBackground">
+                  <bool>false</bool>
+                 </property>
+                 <property name="sizeAdjustPolicy">
+                  <enum>QAbstractScrollArea::AdjustIgnored</enum>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+             <widget class="QWidget" name="tab_summary_details">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <attribute name="title">
+               <string>Details</string>
+              </attribute>
+              <layout class="QGridLayout" name="gridLayout_4">
+               <item row="0" column="0">
+                <widget class="QTableWidget" name="main_table_details">
+                 <property name="font">
+                  <font>
+                   <pointsize>10</pointsize>
+                  </font>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+             <widget class="QWidget" name="tab_summary_premeasurement">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <attribute name="title">
+               <string>Premeasurement</string>
+              </attribute>
+              <layout class="QGridLayout" name="gridLayout_7">
+               <item row="0" column="1">
+                <widget class="QLabel" name="txt_site_name">
+                 <property name="text">
+                  <string/>
+                 </property>
+                </widget>
+               </item>
+               <item row="1" column="0">
+                <layout class="QVBoxLayout" name="verticalLayout">
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_79" stretch="6,3">
+                   <item>
+                    <layout class="QHBoxLayout" name="horizontalLayout_3">
+                     <item>
+                      <widget class="QLabel" name="label_site_name">
+                       <property name="frameShape">
+                        <enum>QFrame::NoFrame</enum>
+                       </property>
+                       <property name="text">
+                        <string>Site Name: </string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QLineEdit" name="ed_site_name"/>
+                     </item>
+                    </layout>
+                   </item>
+                   <item>
+                    <layout class="QHBoxLayout" name="horizontalLayout_78">
+                     <item>
+                      <widget class="QLabel" name="label_site_number">
+                       <property name="text">
+                        <string>Site Number:</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QLineEdit" name="ed_site_number"/>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_77" stretch="6,3">
+                   <item>
+                    <layout class="QHBoxLayout" name="horizontalLayout_75">
+                     <item>
+                      <widget class="QLabel" name="label_person">
+                       <property name="text">
+                        <string>Person(s):</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QLineEdit" name="ed_persons"/>
+                     </item>
+                    </layout>
+                   </item>
+                   <item>
+                    <layout class="QHBoxLayout" name="horizontalLayout_74">
+                     <item>
+                      <widget class="QLabel" name="label_measnum">
+                       <property name="text">
+                        <string>Measurement Number:</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QLineEdit" name="ed_meas_num"/>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
+               </item>
+               <item row="2" column="0">
+                <layout class="QHBoxLayout" name="horizontalLayout_84" stretch="0,0,0,4">
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_81">
+                   <item>
+                    <widget class="QLabel" name="label_stage_start">
+                     <property name="text">
+                      <string>Stage Start:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_stage_start"/>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_83">
+                   <item>
+                    <widget class="QLabel" name="label_stage_end">
+                     <property name="text">
+                      <string>Stage End:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_stage_end"/>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_82">
+                   <item>
+                    <widget class="QLabel" name="label_stage_meas">
+                     <property name="text">
+                      <string>Measurement Stage:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_stage_meas"/>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <spacer name="horizontalSpacer">
+                   <property name="orientation">
+                    <enum>Qt::Horizontal</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>40</width>
+                     <height>20</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                </layout>
+               </item>
+               <item row="3" column="0">
+                <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="3">
+                 <item>
+                  <widget class="QTableWidget" name="table_premeas">
+                   <property name="font">
+                    <font>
+                     <pointsize>10</pointsize>
+                    </font>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </item>
+              </layout>
+             </widget>
+             <widget class="QWidget" name="tab_summary_settings">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <attribute name="title">
+               <string>Settings</string>
+              </attribute>
+              <layout class="QGridLayout" name="gridLayout_5">
+               <item row="0" column="0">
+                <widget class="QTableWidget" name="table_settings">
+                 <property name="font">
+                  <font>
+                   <pointsize>9</pointsize>
+                  </font>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+             <widget class="QWidget" name="tab_summary_adcp">
+              <attribute name="title">
+               <string>ADCP</string>
+              </attribute>
+              <layout class="QGridLayout" name="gridLayout_6">
+               <item row="0" column="0">
+                <widget class="QTableWidget" name="table_adcp">
+                 <property name="font">
+                  <font>
+                   <pointsize>10</pointsize>
+                  </font>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </widget>
+            <widget class="QWidget" name="layoutWidget">
+             <layout class="QHBoxLayout" name="horizontalLayout" stretch="4,2">
+              <property name="spacing">
+               <number>2</number>
+              </property>
+              <item>
+               <widget class="QWidget" name="graphics_wt_contour" native="true">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="minimumSize">
+                 <size>
+                  <width>500</width>
+                  <height>200</height>
+                 </size>
+                </property>
+                <property name="autoFillBackground">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QWidget" name="graphics_shiptrack" native="true">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="autoFillBackground">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+            <widget class="QWidget" name="layoutWidget">
+             <layout class="QHBoxLayout" name="horizontalLayout_bottom" stretch="4,2">
+              <item>
+               <widget class="QTabWidget" name="tab_mc">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                 </font>
+                </property>
+                <property name="tabShape">
+                 <enum>QTabWidget::Triangular</enum>
+                </property>
+                <property name="currentIndex">
+                 <number>0</number>
+                </property>
+                <widget class="QWidget" name="tab_mc_messages">
+                 <property name="sizePolicy">
+                  <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                   <horstretch>0</horstretch>
+                   <verstretch>0</verstretch>
+                  </sizepolicy>
+                 </property>
+                 <attribute name="title">
+                  <string>Messages</string>
+                 </attribute>
+                 <layout class="QGridLayout" name="gridLayout_3">
+                  <item row="0" column="0">
+                   <widget class="QTableWidget" name="main_message_table"/>
+                  </item>
+                 </layout>
+                </widget>
+                <widget class="QWidget" name="tab_mc_comments">
+                 <property name="sizePolicy">
+                  <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                   <horstretch>0</horstretch>
+                   <verstretch>0</verstretch>
+                  </sizepolicy>
+                 </property>
+                 <attribute name="title">
+                  <string>Comments</string>
+                 </attribute>
+                 <layout class="QHBoxLayout" name="horizontalLayout_2">
+                  <item>
+                   <widget class="QPlainTextEdit" name="display_comments">
+                    <property name="readOnly">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </widget>
+               </widget>
+              </item>
+              <item>
+               <widget class="QWidget" name="graphics_main_timeseries" native="true">
+                <property name="autoFillBackground">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+           </widget>
+          </item>
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_right" stretch="15,0,45,0,40">
+            <item>
+             <widget class="QTableWidget" name="table_qa"/>
+            </item>
+            <item>
+             <widget class="QWidget" name="uncertainty_lollipop" native="true">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QTableWidget" name="table_uncertainty">
+              <property name="sizeAdjustPolicy">
+               <enum>QAbstractScrollArea::AdjustIgnored</enum>
+              </property>
+              <attribute name="horizontalHeaderMinimumSectionSize">
+               <number>49</number>
+              </attribute>
+             </widget>
+            </item>
+            <item>
+             <layout class="QHBoxLayout" name="horizontalLayout_64">
+              <item>
+               <widget class="QLabel" name="label_5">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>User Rating:</string>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QComboBox" name="cb_user_rating">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+                <item>
+                 <property name="text">
+                  <string>Not Rated</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>Excellent (&lt;3%)</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>Good (3-5%)</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>Fair (5-8%)</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>Poor (&gt;8%)</string>
+                 </property>
+                </item>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <widget class="QWidget" name="graphics_main_extrap" native="true">
+              <property name="autoFillBackground">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_systest">
+       <attribute name="title">
+        <string>SysTest</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_10">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_systest_2">
+          <property name="font">
+           <font>
+            <pointsize>12</pointsize>
+           </font>
+          </property>
+          <property name="tabPosition">
+           <enum>QTabWidget::North</enum>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>1</number>
+          </property>
+          <widget class="QWidget" name="tab_systest_2_results">
+           <attribute name="title">
+            <string>Results</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_8">
+            <item row="0" column="0">
+             <layout class="QHBoxLayout" name="horizontalLayout_6" stretch="2,3">
+              <item>
+               <widget class="QTableWidget" name="table_systest"/>
+              </item>
+              <item>
+               <widget class="QPlainTextEdit" name="display_systest">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_systest_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_9">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_3">
+              <item>
+               <widget class="QGroupBox" name="box_systest_messages">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Quality Check Messages</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_7">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_systest_messages">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="box_systest_comments">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Comments</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_8">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_systest_comments">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_compass">
+       <attribute name="title">
+        <string>Compass/P/R</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_28">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_compass_2">
+          <property name="font">
+           <font>
+            <pointsize>12</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_compass_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_11">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_6" stretch="3,4,4">
+              <item>
+               <widget class="QTableWidget" name="table_compass_pr"/>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_10" stretch="10,2">
+                <item>
+                 <widget class="QWidget" name="graph_heading" native="true"/>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_4">
+                  <item>
+                   <widget class="QCheckBox" name="cb_adcp_compass">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="PlaceholderText">
+                        <brush brushstyle="NoBrush">
+                         <color alpha="128">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="PlaceholderText">
+                        <brush brushstyle="NoBrush">
+                         <color alpha="128">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="PlaceholderText">
+                        <brush brushstyle="NoBrush">
+                         <color alpha="128">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>11</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>ADCP Compass</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_ext_compass">
+                    <property name="enabled">
+                     <bool>false</bool>
+                    </property>
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>11</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Ext. Compass</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_mag_field">
+                    <property name="enabled">
+                     <bool>false</bool>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>11</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Mag. Field</string>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_9" stretch="10,2">
+                <item>
+                 <widget class="QWidget" name="graph_pr" native="true"/>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_5" stretch="9,1">
+                  <item>
+                   <widget class="QCheckBox" name="cb_pitch">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>11</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Pitch</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_roll">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>11</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Roll</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_compass_2_cal">
+           <attribute name="title">
+            <string>Calibration / Evaluation</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_14">
+            <item row="0" column="0">
+             <layout class="QHBoxLayout" name="horizontalLayout_11" stretch="1,2">
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_7">
+                <item>
+                 <widget class="QGroupBox" name="groupBox_cal">
+                  <property name="font">
+                   <font>
+                    <pointsize>11</pointsize>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Compass Calibration</string>
+                  </property>
+                  <layout class="QGridLayout" name="gridLayout_12">
+                   <item row="0" column="0">
+                    <widget class="QTableWidget" name="table_compass_cal"/>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="groupBox_eval">
+                  <property name="font">
+                   <font>
+                    <pointsize>11</pointsize>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Compass Evaluation</string>
+                  </property>
+                  <layout class="QGridLayout" name="gridLayout_13">
+                   <item row="0" column="0">
+                    <widget class="QTableWidget" name="table_compass_eval"/>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <widget class="QTextEdit" name="display_compass_result"/>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_compass_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_15">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_8">
+              <item>
+               <widget class="QGroupBox" name="box_compass_messages">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Quality Check Messages</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_12">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_compass_messages">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="box_compass_comments">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Comments</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_13">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_compass_comments">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_tempsal">
+       <attribute name="title">
+        <string>Temp/Sal</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_18">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_tempsal_2">
+          <property name="font">
+           <font>
+            <pointsize>12</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_tempsal_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_19">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_11" stretch="3,5">
+              <item>
+               <widget class="QTableWidget" name="table_tempsal"/>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="gb_temp">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Water Temperature</string>
+                </property>
+                <layout class="QGridLayout" name="gridLayout_17">
+                 <item row="0" column="0">
+                  <layout class="QHBoxLayout" name="horizontalLayout_14" stretch="1,4">
+                   <item>
+                    <layout class="QVBoxLayout" name="verticalLayout_10">
+                     <item>
+                      <spacer name="verticalSpacer_2">
+                       <property name="orientation">
+                        <enum>Qt::Vertical</enum>
+                       </property>
+                       <property name="sizeHint" stdset="0">
+                        <size>
+                         <width>20</width>
+                         <height>40</height>
+                        </size>
+                       </property>
+                      </spacer>
+                     </item>
+                     <item>
+                      <layout class="QGridLayout" name="gridLayout_16" columnminimumwidth="2,1,1">
+                       <item row="0" column="0">
+                        <widget class="QLabel" name="label_independent">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Independent:</string>
+                         </property>
+                         <property name="alignment">
+                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="0" column="1">
+                        <widget class="QLineEdit" name="ed_user_temp">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="0" column="2">
+                        <widget class="QPushButton" name="pb_ind_temp_apply">
+                         <property name="enabled">
+                          <bool>false</bool>
+                         </property>
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Apply</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="1" column="0">
+                        <widget class="QLabel" name="label_adcp">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>ADCP:</string>
+                         </property>
+                         <property name="alignment">
+                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="1" column="1">
+                        <widget class="QLineEdit" name="ed_adcp_temp">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="1" column="2">
+                        <widget class="QPushButton" name="pb_adcp_temp_apply">
+                         <property name="enabled">
+                          <bool>false</bool>
+                         </property>
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Apply</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="2" column="0">
+                        <widget class="QLabel" name="label_adcp_avg">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>ADCP Average:</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="2" column="1">
+                        <widget class="QLabel" name="txt_adcp_avg">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>0</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="2" column="2">
+                        <spacer name="horizontalSpacer_3">
+                         <property name="orientation">
+                          <enum>Qt::Horizontal</enum>
+                         </property>
+                         <property name="sizeHint" stdset="0">
+                          <size>
+                           <width>40</width>
+                           <height>20</height>
+                          </size>
+                         </property>
+                        </spacer>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <layout class="QVBoxLayout" name="verticalLayout_9">
+                       <item>
+                        <widget class="QRadioButton" name="rb_f">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Fahrenheit</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_c">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Celsius</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <spacer name="verticalSpacer">
+                       <property name="orientation">
+                        <enum>Qt::Vertical</enum>
+                       </property>
+                       <property name="sizeHint" stdset="0">
+                        <size>
+                         <width>20</width>
+                         <height>40</height>
+                        </size>
+                       </property>
+                      </spacer>
+                     </item>
+                    </layout>
+                   </item>
+                   <item>
+                    <widget class="QWidget" name="graph_temperature" native="true"/>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_tempsal_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_20">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_12">
+              <item>
+               <widget class="QGroupBox" name="box_compass_messages_2">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Quality Check Messages</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_15">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_tempsal_messages">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="box_compass_comments_2">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Comments</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_16">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_tempsal_comments">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_mbt">
+       <attribute name="title">
+        <string>MovBedTst</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_23">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_mtb_2">
+          <property name="font">
+           <font>
+            <pointsize>12</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_mbt_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_22">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_14" stretch="1,0,0,2">
+              <item>
+               <widget class="QTableWidget" name="table_moving_bed">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QCheckBox" name="cb_mb_observed_no">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>User certifies that they have visually observed the streambed and that there is no moving-bed condition.</string>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLabel" name="txt_mb_plotted">
+                <property name="text">
+                 <string/>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignCenter</set>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_18" stretch="4,2">
+                <item>
+                 <widget class="QWidget" name="graph_mb_ts" native="true"/>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_mb_st">
+                  <property name="title">
+                   <string/>
+                  </property>
+                  <layout class="QGridLayout" name="gridLayout_21">
+                   <item row="0" column="0">
+                    <layout class="QVBoxLayout" name="verticalLayout_13" stretch="1,8">
+                     <item>
+                      <layout class="QHBoxLayout" name="horizontalLayout_17">
+                       <item>
+                        <widget class="QCheckBox" name="cb_mb_bt">
+                         <property name="palette">
+                          <palette>
+                           <active>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                            <colorrole role="Text">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                            <colorrole role="PlaceholderText">
+                             <brush brushstyle="NoBrush">
+                              <color alpha="128">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </active>
+                           <inactive>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                            <colorrole role="Text">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                            <colorrole role="PlaceholderText">
+                             <brush brushstyle="NoBrush">
+                              <color alpha="128">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </inactive>
+                           <disabled>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>120</red>
+                               <green>120</green>
+                               <blue>120</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                            <colorrole role="Text">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>120</red>
+                               <green>120</green>
+                               <blue>120</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                            <colorrole role="PlaceholderText">
+                             <brush brushstyle="NoBrush">
+                              <color alpha="128">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </disabled>
+                          </palette>
+                         </property>
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>BT</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QCheckBox" name="cb_mb_gga">
+                         <property name="palette">
+                          <palette>
+                           <active>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>0</red>
+                               <green>0</green>
+                               <blue>255</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </active>
+                           <inactive>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>0</red>
+                               <green>0</green>
+                               <blue>255</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </inactive>
+                           <disabled>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>120</red>
+                               <green>120</green>
+                               <blue>120</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </disabled>
+                          </palette>
+                         </property>
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>GGA</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QCheckBox" name="cb_mb_vtg">
+                         <property name="palette">
+                          <palette>
+                           <active>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>0</red>
+                               <green>170</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </active>
+                           <inactive>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>0</red>
+                               <green>170</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </inactive>
+                           <disabled>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>120</red>
+                               <green>120</green>
+                               <blue>120</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </disabled>
+                          </palette>
+                         </property>
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>VTG</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QCheckBox" name="cb_mb_vectors">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Vectors</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_mb_st" native="true"/>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_mbt_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_24">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_mb_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_20">
+               <item>
+                <widget class="QPlainTextEdit" name="display_mb_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_mb_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_19">
+               <item>
+                <widget class="QPlainTextEdit" name="display_mb_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_bt">
+       <attribute name="title">
+        <string>BT</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_33">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_bt_2">
+          <property name="font">
+           <font>
+            <pointsize>12</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_bt_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_26">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_18" stretch="2,4">
+              <item>
+               <widget class="QTableWidget" name="table_bt">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_22" stretch="6,3,1">
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_17" stretch="4">
+                  <item>
+                   <widget class="QGroupBox" name="gb_bt_radio">
+                    <property name="title">
+                     <string/>
+                    </property>
+                    <layout class="QVBoxLayout" name="verticalLayout_16" stretch="1,4">
+                     <item>
+                      <layout class="QHBoxLayout" name="horizontalLayout_21">
+                       <item>
+                        <widget class="QRadioButton" name="rb_bt_beam">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>3 Beam Solutions</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_bt_error">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Error Velocity</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_bt_vert">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Vertical Velocity</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_bt_other">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Other</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_bt_source">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Source</string>
+                         </property>
+                        </widget>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_bt_ts" native="true"/>
+                     </item>
+                    </layout>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_20" stretch="1,8">
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_30">
+                    <item>
+                     <widget class="QCheckBox" name="cb_bt_bt">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="PlaceholderText">
+                          <brush brushstyle="NoBrush">
+                           <color alpha="128">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="PlaceholderText">
+                          <brush brushstyle="NoBrush">
+                           <color alpha="128">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="PlaceholderText">
+                          <brush brushstyle="NoBrush">
+                           <color alpha="128">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>BT</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_bt_gga">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>GGA</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_bt_vtg">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>VTG</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_bt_vectors">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vectors</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </item>
+                  <item>
+                   <widget class="QWidget" name="graph_bt_st" native="true"/>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_bt_filters">
+                  <property name="font">
+                   <font>
+                    <pointsize>10</pointsize>
+                    <weight>75</weight>
+                    <bold>true</bold>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Filters</string>
+                  </property>
+                  <layout class="QVBoxLayout" name="verticalLayout_15" stretch="0,0,0,0">
+                   <item>
+                    <widget class="QGroupBox" name="gb_bt_3beam">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>3 Beam Solutions</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_21">
+                      <item>
+                       <widget class="QComboBox" name="combo_bt_3beam">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Allow</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>4-Beam Only</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_bt_error_velocity">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Error Velocity</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_22">
+                      <item>
+                       <widget class="QComboBox" name="combo_bt_error_velocity">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_29" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_bt_error_velocity">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_bt_error_vel_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_bt_vertical_velocity">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Vertical Velocity</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_23">
+                      <item>
+                       <widget class="QComboBox" name="combo_bt_vert_velocity">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_31" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_bt_vert_velocity">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_bt_vert_vel_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_bt_other">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Other</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_24">
+                      <item>
+                       <widget class="QComboBox" name="combo_bt_other">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Smooth</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_bt_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QVBoxLayout" name="verticalLayout_19">
+            <item>
+             <widget class="QGroupBox" name="box_bt_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_23">
+               <item>
+                <widget class="QPlainTextEdit" name="display_bt_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <widget class="QGroupBox" name="box_bt_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_24">
+               <item>
+                <widget class="QPlainTextEdit" name="display_bt_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_gps">
+       <attribute name="title">
+        <string>GPS</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_27">
+        <item row="1" column="0">
+         <widget class="QTabWidget" name="tab_gps_2">
+          <property name="font">
+           <font>
+            <pointsize>12</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_gps_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_25">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_34" stretch="2,4">
+              <item>
+               <widget class="QTableWidget" name="table_gps">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_27" stretch="6,3,1">
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_35" stretch="4">
+                  <item>
+                   <widget class="QGroupBox" name="gb_gps_radio">
+                    <property name="title">
+                     <string/>
+                    </property>
+                    <layout class="QVBoxLayout" name="verticalLayout_36" stretch="1,4">
+                     <item>
+                      <layout class="QHBoxLayout" name="horizontalLayout_28">
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_quality">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Quality</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_altitude">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Altitude</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_hdop">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>HDOP</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_sats">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string># Sats</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_other">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Other</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_source">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Source</string>
+                         </property>
+                        </widget>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_gps_ts" native="true"/>
+                     </item>
+                    </layout>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_37" stretch="1,8">
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_35">
+                    <item>
+                     <widget class="QCheckBox" name="cb_gps_bt">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="PlaceholderText">
+                          <brush brushstyle="NoBrush">
+                           <color alpha="128">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="PlaceholderText">
+                          <brush brushstyle="NoBrush">
+                           <color alpha="128">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="PlaceholderText">
+                          <brush brushstyle="NoBrush">
+                           <color alpha="128">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>BT</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_gps_gga">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>GGA</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_gps_vtg">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>VTG</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_gps_vectors">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vectors</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </item>
+                  <item>
+                   <widget class="QWidget" name="graph_gps_st" native="true"/>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_gps_filters">
+                  <property name="font">
+                   <font>
+                    <pointsize>10</pointsize>
+                    <weight>75</weight>
+                    <bold>true</bold>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Filters</string>
+                  </property>
+                  <layout class="QVBoxLayout" name="verticalLayout_38" stretch="0,0,0,0">
+                   <item>
+                    <widget class="QGroupBox" name="gb_gps_qual">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Minimum Quality (GGA)</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_39">
+                      <item>
+                       <widget class="QComboBox" name="combo_gps_qual">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <property name="currentIndex">
+                         <number>1</number>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>1-Autonomous</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>2-Differential</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>4+-RTK</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_gps_altitude">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Altitude Change (GGA)</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_40">
+                      <item>
+                       <widget class="QComboBox" name="combo_gps_altitude">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_36" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_gps_altitude">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_gps_altitude_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_gps_hdop">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>HDOP</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_41">
+                      <item>
+                       <widget class="QComboBox" name="combo_gps_hdop">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_37" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_gps_hdop">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_gps_hdop_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_gps_other">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Other</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_42">
+                      <item>
+                       <widget class="QComboBox" name="combo_gps_other">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Smooth</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_gps_2_gpsbt">
+           <attribute name="title">
+            <string>GPS - BT</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_46">
+            <item row="0" column="0">
+             <layout class="QHBoxLayout" name="horizontalLayout_73" stretch="6,4">
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_68" stretch="5,5">
+                <item>
+                 <widget class="QTableWidget" name="table_gps_bt">
+                  <property name="font">
+                   <font>
+                    <pointsize>10</pointsize>
+                   </font>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QWidget" name="graph_gps_bt_ts" native="true"/>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_67" stretch="1,9">
+                <item>
+                 <layout class="QHBoxLayout" name="horizontalLayout_72">
+                  <item>
+                   <widget class="QCheckBox" name="cb_gps_bt_2">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="PlaceholderText">
+                        <brush brushstyle="NoBrush">
+                         <color alpha="128">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="PlaceholderText">
+                        <brush brushstyle="NoBrush">
+                         <color alpha="128">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="PlaceholderText">
+                        <brush brushstyle="NoBrush">
+                         <color alpha="128">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>BT</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_gps_gga_2">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>GGA</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_gps_vtg_2">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>170</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>170</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>VTG</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_gps_vectors_2">
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Vectors</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <widget class="QWidget" name="graph_gps_st_2" native="true"/>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_gps_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_29">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_gps_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_47">
+               <item>
+                <widget class="QPlainTextEdit" name="display_gps_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_gps_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_46">
+               <item>
+                <widget class="QPlainTextEdit" name="display_gps_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_depth">
+       <attribute name="title">
+        <string>Depth</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_30">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_depth_2">
+          <property name="font">
+           <font>
+            <pointsize>11</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_depth_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_31">
+            <item row="0" column="0">
+             <layout class="QHBoxLayout" name="horizontalLayout_80">
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_27" stretch="3,7">
+                <item>
+                 <widget class="QTableWidget" name="table_depth"/>
+                </item>
+                <item>
+                 <layout class="QHBoxLayout" name="horizontalLayout_25" stretch="9,1">
+                  <item>
+                   <widget class="QWidget" name="graph_depth" native="true"/>
+                  </item>
+                  <item>
+                   <layout class="QVBoxLayout" name="verticalLayout_2">
+                    <item>
+                     <widget class="QGroupBox" name="gb_depth_beams">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                       </font>
+                      </property>
+                      <property name="title">
+                       <string>Individual Beams</string>
+                      </property>
+                      <layout class="QHBoxLayout" name="horizontalLayout_32" stretch="1">
+                       <item>
+                        <layout class="QVBoxLayout" name="verticalLayout_25">
+                         <item>
+                          <widget class="QCheckBox" name="cb_depth_beam1">
+                           <property name="palette">
+                            <palette>
+                             <active>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>0</red>
+                                 <green>0</green>
+                                 <blue>0</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </active>
+                             <inactive>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>0</red>
+                                 <green>0</green>
+                                 <blue>0</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </inactive>
+                             <disabled>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>120</red>
+                                 <green>120</green>
+                                 <blue>120</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </disabled>
+                            </palette>
+                           </property>
+                           <property name="font">
+                            <font>
+                             <pointsize>10</pointsize>
+                            </font>
+                           </property>
+                           <property name="text">
+                            <string>Beam 1</string>
+                           </property>
+                          </widget>
+                         </item>
+                         <item>
+                          <widget class="QCheckBox" name="cb_depth_beam2">
+                           <property name="palette">
+                            <palette>
+                             <active>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>0</red>
+                                 <green>85</green>
+                                 <blue>0</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </active>
+                             <inactive>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>0</red>
+                                 <green>85</green>
+                                 <blue>0</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </inactive>
+                             <disabled>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>120</red>
+                                 <green>120</green>
+                                 <blue>120</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </disabled>
+                            </palette>
+                           </property>
+                           <property name="font">
+                            <font>
+                             <pointsize>10</pointsize>
+                            </font>
+                           </property>
+                           <property name="text">
+                            <string>Beam 2</string>
+                           </property>
+                          </widget>
+                         </item>
+                         <item>
+                          <widget class="QCheckBox" name="cb_depth_beam3">
+                           <property name="palette">
+                            <palette>
+                             <active>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>0</red>
+                                 <green>0</green>
+                                 <blue>255</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </active>
+                             <inactive>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>0</red>
+                                 <green>0</green>
+                                 <blue>255</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </inactive>
+                             <disabled>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>120</red>
+                                 <green>120</green>
+                                 <blue>120</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </disabled>
+                            </palette>
+                           </property>
+                           <property name="font">
+                            <font>
+                             <pointsize>10</pointsize>
+                            </font>
+                           </property>
+                           <property name="text">
+                            <string>Beam 3</string>
+                           </property>
+                          </widget>
+                         </item>
+                         <item>
+                          <widget class="QCheckBox" name="cb_depth_beam4">
+                           <property name="palette">
+                            <palette>
+                             <active>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>170</red>
+                                 <green>85</green>
+                                 <blue>0</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </active>
+                             <inactive>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>170</red>
+                                 <green>85</green>
+                                 <blue>0</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </inactive>
+                             <disabled>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>120</red>
+                                 <green>120</green>
+                                 <blue>120</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </disabled>
+                            </palette>
+                           </property>
+                           <property name="font">
+                            <font>
+                             <pointsize>10</pointsize>
+                            </font>
+                           </property>
+                           <property name="text">
+                            <string>Beam 4</string>
+                           </property>
+                          </widget>
+                         </item>
+                         <item>
+                          <widget class="QCheckBox" name="cb_depth_vert">
+                           <property name="palette">
+                            <palette>
+                             <active>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>170</red>
+                                 <green>0</green>
+                                 <blue>255</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </active>
+                             <inactive>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>170</red>
+                                 <green>0</green>
+                                 <blue>255</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </inactive>
+                             <disabled>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>120</red>
+                                 <green>120</green>
+                                 <blue>120</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </disabled>
+                            </palette>
+                           </property>
+                           <property name="font">
+                            <font>
+                             <pointsize>10</pointsize>
+                            </font>
+                           </property>
+                           <property name="text">
+                            <string>Vertical</string>
+                           </property>
+                          </widget>
+                         </item>
+                         <item>
+                          <widget class="QCheckBox" name="cb_depth_ds">
+                           <property name="palette">
+                            <palette>
+                             <active>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>0</red>
+                                 <green>170</green>
+                                 <blue>255</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </active>
+                             <inactive>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>0</red>
+                                 <green>170</green>
+                                 <blue>255</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </inactive>
+                             <disabled>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>120</red>
+                                 <green>120</green>
+                                 <blue>120</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </disabled>
+                            </palette>
+                           </property>
+                           <property name="font">
+                            <font>
+                             <pointsize>10</pointsize>
+                            </font>
+                           </property>
+                           <property name="text">
+                            <string>Depth Sounder</string>
+                           </property>
+                          </widget>
+                         </item>
+                        </layout>
+                       </item>
+                      </layout>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QGroupBox" name="gb_depth_cs">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                       </font>
+                      </property>
+                      <property name="title">
+                       <string>Cross Section</string>
+                      </property>
+                      <layout class="QHBoxLayout" name="horizontalLayout_33" stretch="1">
+                       <item>
+                        <layout class="QVBoxLayout" name="verticalLayout_26">
+                         <item>
+                          <widget class="QCheckBox" name="cb_depth_4beam_cs">
+                           <property name="palette">
+                            <palette>
+                             <active>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>255</red>
+                                 <green>0</green>
+                                 <blue>0</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </active>
+                             <inactive>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>255</red>
+                                 <green>0</green>
+                                 <blue>0</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </inactive>
+                             <disabled>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>120</red>
+                                 <green>120</green>
+                                 <blue>120</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </disabled>
+                            </palette>
+                           </property>
+                           <property name="font">
+                            <font>
+                             <pointsize>10</pointsize>
+                            </font>
+                           </property>
+                           <property name="text">
+                            <string>4 Beam Avg</string>
+                           </property>
+                          </widget>
+                         </item>
+                         <item>
+                          <widget class="QCheckBox" name="cb_depth_vert_cs">
+                           <property name="palette">
+                            <palette>
+                             <active>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>170</red>
+                                 <green>0</green>
+                                 <blue>255</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </active>
+                             <inactive>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>170</red>
+                                 <green>0</green>
+                                 <blue>255</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </inactive>
+                             <disabled>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>120</red>
+                                 <green>120</green>
+                                 <blue>120</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </disabled>
+                            </palette>
+                           </property>
+                           <property name="font">
+                            <font>
+                             <pointsize>10</pointsize>
+                            </font>
+                           </property>
+                           <property name="text">
+                            <string>Vertical</string>
+                           </property>
+                          </widget>
+                         </item>
+                         <item>
+                          <widget class="QCheckBox" name="cb_depth_ds_cs">
+                           <property name="palette">
+                            <palette>
+                             <active>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>0</red>
+                                 <green>170</green>
+                                 <blue>255</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </active>
+                             <inactive>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>0</red>
+                                 <green>170</green>
+                                 <blue>255</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </inactive>
+                             <disabled>
+                              <colorrole role="WindowText">
+                               <brush brushstyle="SolidPattern">
+                                <color alpha="255">
+                                 <red>120</red>
+                                 <green>120</green>
+                                 <blue>120</blue>
+                                </color>
+                               </brush>
+                              </colorrole>
+                             </disabled>
+                            </palette>
+                           </property>
+                           <property name="font">
+                            <font>
+                             <pointsize>10</pointsize>
+                            </font>
+                           </property>
+                           <property name="text">
+                            <string>Depth Sounder</string>
+                           </property>
+                          </widget>
+                         </item>
+                         <item>
+                          <widget class="QCheckBox" name="cb_depth_final_cs">
+                           <property name="font">
+                            <font>
+                             <pointsize>10</pointsize>
+                            </font>
+                           </property>
+                           <property name="text">
+                            <string>Final</string>
+                           </property>
+                          </widget>
+                         </item>
+                        </layout>
+                       </item>
+                      </layout>
+                     </widget>
+                    </item>
+                   </layout>
+                  </item>
+                 </layout>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_28" stretch="1,3,1">
+                <item>
+                 <spacer name="verticalSpacer_3">
+                  <property name="orientation">
+                   <enum>Qt::Vertical</enum>
+                  </property>
+                  <property name="sizeHint" stdset="0">
+                   <size>
+                    <width>20</width>
+                    <height>40</height>
+                   </size>
+                  </property>
+                 </spacer>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_depth_settings">
+                  <property name="font">
+                   <font>
+                    <pointsize>10</pointsize>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Settings</string>
+                  </property>
+                  <layout class="QVBoxLayout" name="verticalLayout_29">
+                   <item>
+                    <widget class="QGroupBox" name="gb_depth_ref">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Depth Reference</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_30">
+                      <item>
+                       <widget class="QComboBox" name="combo_depth_ref">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_depth_averaging">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>BT Averaging Method</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_31">
+                      <item>
+                       <widget class="QComboBox" name="combo_depth_avg">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>IDW</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Simple</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_depth_filter">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Filter</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_32">
+                      <item>
+                       <widget class="QComboBox" name="combo_depth_filter">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <property name="currentText">
+                         <string>Off</string>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Smooth</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>TRDI</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+                <item>
+                 <spacer name="verticalSpacer_4">
+                  <property name="orientation">
+                   <enum>Qt::Vertical</enum>
+                  </property>
+                  <property name="sizeHint" stdset="0">
+                   <size>
+                    <width>20</width>
+                    <height>40</height>
+                   </size>
+                  </property>
+                 </spacer>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_gps_2_messages_3">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_35">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_depth_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_49">
+               <item>
+                <widget class="QPlainTextEdit" name="display_depth_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_depth_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_48">
+               <item>
+                <widget class="QPlainTextEdit" name="display_depth_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_wt">
+       <attribute name="title">
+        <string>WT</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_38">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_wt_2">
+          <property name="font">
+           <font>
+            <pointsize>12</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_wt_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_37">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_48" stretch="2,4">
+              <item>
+               <widget class="QTableWidget" name="table_wt">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_42" stretch="6,3,1">
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_49" stretch="5">
+                  <item>
+                   <widget class="QGroupBox" name="gb_wt_radio">
+                    <property name="title">
+                     <string/>
+                    </property>
+                    <layout class="QVBoxLayout" name="verticalLayout_50" stretch="1,4">
+                     <item>
+                      <layout class="QHBoxLayout" name="horizontalLayout_43">
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_contour">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string> Contour No Interp</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_beam">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Beams Used</string>
+                         </property>
+                         <property name="checked">
+                          <bool>false</bool>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_error">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Error Vel.</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_vert">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Vertical Vel.</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_snr">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>SNR</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_speed">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Speed</string>
+                         </property>
+                        </widget>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_wt" native="true"/>
+                     </item>
+                    </layout>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_51" stretch="1,8">
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_44">
+                    <item>
+                     <widget class="QCheckBox" name="cb_wt_bt">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="PlaceholderText">
+                          <brush brushstyle="NoBrush">
+                           <color alpha="128">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="PlaceholderText">
+                          <brush brushstyle="NoBrush">
+                           <color alpha="128">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="PlaceholderText">
+                          <brush brushstyle="NoBrush">
+                           <color alpha="128">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>BT</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_wt_gga">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>GGA</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_wt_vtg">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>VTG</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_wt_vectors">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vectors</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </item>
+                  <item>
+                   <widget class="QWidget" name="graph_wt_st" native="true"/>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_wt_filters">
+                  <property name="font">
+                   <font>
+                    <pointsize>10</pointsize>
+                    <weight>75</weight>
+                    <bold>true</bold>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Filters</string>
+                  </property>
+                  <layout class="QVBoxLayout" name="verticalLayout_52" stretch="0,0,0,0,0,0">
+                   <item>
+                    <widget class="QGroupBox" name="gb_wt_excluded">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Excluded Distance</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_56">
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_51" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_wt_excluded">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Below Xducer: </string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_wt_excluded_dist">
+                          <property name="enabled">
+                           <bool>true</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_wt_3beam">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>3 Beam Solutions</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_53">
+                      <item>
+                       <widget class="QComboBox" name="combo_wt_3beam">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Allow</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>4-Beam Only</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_wt_error_velocity">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Error Velocity</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_54">
+                      <item>
+                       <widget class="QComboBox" name="combo_wt_error_velocity">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_45" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_wt_error_velocity">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_wt_error_vel_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_wt_vertical_velocity">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Vertical Velocity</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_55">
+                      <item>
+                       <widget class="QComboBox" name="combo_wt_vert_velocity">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_50" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_wt_vert_velocity">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_wt_vert_vel_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_snr">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>SNR</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_59">
+                      <item>
+                       <widget class="QComboBox" name="combo_wt_snr">
+                        <property name="font">
+                         <font>
+                          <pointsize>10</pointsize>
+                         </font>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="verticalSpacer_6">
+                     <property name="orientation">
+                      <enum>Qt::Vertical</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>20</width>
+                       <height>40</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_wt_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_39">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_wt_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_53">
+               <item>
+                <widget class="QPlainTextEdit" name="display_wt_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_wt_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_52">
+               <item>
+                <widget class="QPlainTextEdit" name="display_wt_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_extrap">
+       <attribute name="title">
+        <string>Extrap</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_34">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_extrap_2">
+          <property name="font">
+           <font>
+            <pointsize>11</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_extrap_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QHBoxLayout" name="horizontalLayout_26" stretch="3,6,2,5">
+            <item>
+             <widget class="QGroupBox" name="gp_points">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Points</string>
+              </property>
+              <layout class="QVBoxLayout" name="verticalLayout_44">
+               <item>
+                <widget class="QTableWidget" name="table_extrap_n_points">
+                 <property name="font">
+                  <font>
+                   <pointsize>10</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <widget class="QGroupBox" name="gb_profile">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Profile</string>
+              </property>
+              <layout class="QVBoxLayout" name="verticalLayout_57" stretch="10,2,1">
+               <item>
+                <widget class="QWidget" name="graph_extrap" native="true"/>
+               </item>
+               <item>
+                <layout class="QHBoxLayout" name="horizontalLayout_56">
+                 <item>
+                  <widget class="QGroupBox" name="gb_depth_cell">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Depth Cell</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_45">
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_data">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Data</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_surface">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Surface Cells</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="gb_transects">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Transects</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_46">
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_trans_medians">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Medians</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_trans_fit">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Fit</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="gb_measurement">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Measurement</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_47">
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_meas_medians">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Medians</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_meas_fit">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Fit</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                </layout>
+               </item>
+               <item>
+                <layout class="QHBoxLayout" name="horizontalLayout_57">
+                 <item>
+                  <spacer name="horizontalSpacer_16">
+                   <property name="orientation">
+                    <enum>Qt::Horizontal</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>40</width>
+                     <height>20</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                 <item>
+                  <widget class="QLabel" name="txt_start">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                    </font>
+                   </property>
+                   <property name="text">
+                    <string>Start Edge: </string>
+                   </property>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QLabel" name="txt_left">
+                   <property name="palette">
+                    <palette>
+                     <active>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>255</red>
+                         <green>0</green>
+                         <blue>255</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </active>
+                     <inactive>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>255</red>
+                         <green>0</green>
+                         <blue>255</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </inactive>
+                     <disabled>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>120</red>
+                         <green>120</green>
+                         <blue>120</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </disabled>
+                    </palette>
+                   </property>
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                    </font>
+                   </property>
+                   <property name="text">
+                    <string>Left</string>
+                   </property>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QLabel" name="txt_right">
+                   <property name="palette">
+                    <palette>
+                     <active>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>0</red>
+                         <green>0</green>
+                         <blue>255</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </active>
+                     <inactive>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>0</red>
+                         <green>0</green>
+                         <blue>255</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </inactive>
+                     <disabled>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>120</red>
+                         <green>120</green>
+                         <blue>120</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </disabled>
+                    </palette>
+                   </property>
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                    </font>
+                   </property>
+                   <property name="text">
+                    <string>Right</string>
+                   </property>
+                  </widget>
+                 </item>
+                 <item>
+                  <spacer name="horizontalSpacer_17">
+                   <property name="orientation">
+                    <enum>Qt::Horizontal</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>40</width>
+                     <height>20</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                </layout>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <layout class="QVBoxLayout" name="verticalLayout_64" stretch="3,1">
+              <item>
+               <widget class="QGroupBox" name="gb_fit">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Fit Parameters</string>
+                </property>
+                <layout class="QVBoxLayout" name="verticalLayout_43">
+                 <item>
+                  <widget class="QTableWidget" name="table_extrap_fit">
+                   <property name="font">
+                    <font>
+                     <pointsize>10</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QComboBox" name="combo_extrap_fit">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <item>
+                    <property name="text">
+                     <string>Automatic</string>
+                    </property>
+                   </item>
+                   <item>
+                    <property name="text">
+                     <string>Manual</string>
+                    </property>
+                   </item>
+                  </widget>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_38" stretch="4,4,6">
+                   <item>
+                    <widget class="QLabel" name="txt_top">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string> Top:  </string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QComboBox" name="combo_extrap_top">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <item>
+                      <property name="text">
+                       <string>Power</string>
+                      </property>
+                     </item>
+                     <item>
+                      <property name="text">
+                       <string>Constant</string>
+                      </property>
+                     </item>
+                     <item>
+                      <property name="text">
+                       <string>3-Point</string>
+                      </property>
+                     </item>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_7">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_39" stretch="4,5,6">
+                   <item>
+                    <widget class="QLabel" name="txt_bottom">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Bottom:  </string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QComboBox" name="combo_extrap_bottom">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <item>
+                      <property name="text">
+                       <string>Power</string>
+                      </property>
+                     </item>
+                     <item>
+                      <property name="text">
+                       <string>No Slip</string>
+                      </property>
+                     </item>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_8">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_40" stretch="0,5,6">
+                   <item>
+                    <widget class="QLabel" name="txt_exponent">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Exponent:  </string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_extrap_exponent">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_9">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="gb_data">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Data Used for Extrap Fitting</string>
+                </property>
+                <layout class="QVBoxLayout" name="verticalLayout_63">
+                 <item>
+                  <widget class="QComboBox" name="combo_extrap_data">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <item>
+                    <property name="text">
+                     <string>Automatic</string>
+                    </property>
+                   </item>
+                   <item>
+                    <property name="text">
+                     <string>Manual</string>
+                    </property>
+                   </item>
+                  </widget>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_55" stretch="3,3,6">
+                   <item>
+                    <widget class="QLabel" name="label_3">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Type: </string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QComboBox" name="combo_extrap_type">
+                     <property name="enabled">
+                      <bool>false</bool>
+                     </property>
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <item>
+                      <property name="text">
+                       <string>Discharge</string>
+                      </property>
+                     </item>
+                     <item>
+                      <property name="text">
+                       <string>Velocity</string>
+                      </property>
+                     </item>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_15">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_54" stretch="2,1">
+                   <item>
+                    <widget class="QLabel" name="txt_extrap_subsection">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Subsection (% L to R, x:x):</string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_extrap_subsection">
+                     <property name="enabled">
+                      <bool>false</bool>
+                     </property>
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                    </widget>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_41" stretch="5,4,7">
+                   <item>
+                    <widget class="QLabel" name="text_extrap_threshold">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Threshold (%): </string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_extrap_threshold">
+                     <property name="enabled">
+                      <bool>false</bool>
+                     </property>
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_11">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <layout class="QVBoxLayout" name="verticalLayout_33" stretch="2,4">
+              <item>
+               <widget class="QGroupBox" name="gb_previous">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Fit Settings When Tab Opened</string>
+                </property>
+                <layout class="QVBoxLayout" name="verticalLayout_61">
+                 <item>
+                  <layout class="QGridLayout" name="gridLayout_32">
+                   <item row="0" column="0">
+                    <widget class="QLabel" name="txt_p_fit">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Fit Method</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="0" column="1">
+                    <widget class="QLabel" name="txt_extrap_p_fit">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>TextLabel</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="1" column="0">
+                    <widget class="QLabel" name="txt_p_top">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Top:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="1" column="1">
+                    <widget class="QLabel" name="txt_extrap_p_top">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>TextLabel</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="2" column="0">
+                    <widget class="QLabel" name="txt_p_bottom">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Bottom:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="2" column="1">
+                    <widget class="QLabel" name="txt_extrap_p_bottom">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>TextLabel</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="3" column="0">
+                    <widget class="QLabel" name="txt_p_exponent">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Exponent:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="3" column="1">
+                    <widget class="QLabel" name="txt_extrap_p_exponent">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>TextLabel</string>
+                     </property>
+                    </widget>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <widget class="QPushButton" name="pb_extrap_cancel">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                    </font>
+                   </property>
+                   <property name="text">
+                    <string>Reset to These Settings</string>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="gb_q">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Discharge Sensitivity</string>
+                </property>
+                <layout class="QVBoxLayout" name="verticalLayout_60">
+                 <item>
+                  <widget class="QTableWidget" name="table_extrap_qsen">
+                   <property name="font">
+                    <font>
+                     <pointsize>10</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_extrap_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QVBoxLayout" name="verticalLayout_58">
+            <item>
+             <widget class="QGroupBox" name="box_extrap_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_59">
+               <item>
+                <widget class="QPlainTextEdit" name="display_extrap_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <widget class="QGroupBox" name="box_extrap_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_60">
+               <item>
+                <widget class="QPlainTextEdit" name="display_extrap_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_edges">
+       <attribute name="title">
+        <string>Edges</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_42">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_edges_2">
+          <property name="font">
+           <font>
+            <pointsize>11</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_edges_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_41">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_62" stretch="4,7">
+              <item>
+               <widget class="QTableWidget" name="table_edges"/>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_61">
+                <item>
+                 <widget class="QGroupBox" name="gb_left">
+                  <property name="font">
+                   <font>
+                    <pointsize>11</pointsize>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Left</string>
+                  </property>
+                  <layout class="QGridLayout" name="gridLayout_36">
+                   <item row="0" column="0">
+                    <layout class="QHBoxLayout" name="horizontalLayout_34">
+                     <item>
+                      <widget class="QWidget" name="graph_left_contour" native="true"/>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_left_st" native="true"/>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_right">
+                  <property name="font">
+                   <font>
+                    <pointsize>11</pointsize>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Right</string>
+                  </property>
+                  <layout class="QGridLayout" name="gridLayout_40">
+                   <item row="0" column="0">
+                    <layout class="QHBoxLayout" name="horizontalLayout_58">
+                     <item>
+                      <widget class="QWidget" name="graph_right_contour" native="true"/>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_right_st" native="true"/>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_wt_2_messages_3">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_43">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_extrap_messages_2">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_63">
+               <item>
+                <widget class="QPlainTextEdit" name="display_edges_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_extrap_comments_2">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_62">
+               <item>
+                <widget class="QPlainTextEdit" name="display_edges_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_edi">
+       <attribute name="title">
+        <string>EDI</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_44">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout_65" stretch="3,1,5,1">
+          <item>
+           <widget class="QGroupBox" name="gb_edi_transect">
+            <property name="font">
+             <font>
+              <pointsize>14</pointsize>
+             </font>
+            </property>
+            <property name="title">
+             <string>Select Transect</string>
+            </property>
+            <layout class="QGridLayout" name="gridLayout">
+             <item row="0" column="0">
+              <widget class="QTableWidget" name="tbl_edi_transect">
+               <property name="font">
+                <font>
+                 <pointsize>14</pointsize>
+                </font>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_66" stretch="1,1,1,6,1">
+            <item>
+             <widget class="QLabel" name="txt_edi_offset">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string>Zero Distance Offset (ft):</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLineEdit" name="edi_offset">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="inputMethodHints">
+               <set>Qt::ImhDigitsOnly</set>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="txt_edi_bank">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string> From Right Bank</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_5">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="cb_edi_topoquad">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string>Create TopoQuad File</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <widget class="QTableWidget" name="tbl_edi_results">
+            <property name="font">
+             <font>
+              <pointsize>14</pointsize>
+             </font>
+            </property>
+            <property name="inputMethodHints">
+             <set>Qt::ImhDigitsOnly</set>
+            </property>
+            <property name="rowCount">
+             <number>0</number>
+            </property>
+            <property name="columnCount">
+             <number>0</number>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_67">
+            <item>
+             <widget class="QPushButton" name="pb_edi_add_row">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string>Add Row</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_2">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+            <item>
+             <widget class="QPushButton" name="pb_edi_compute">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string>Compute Stations</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_4">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_uncertainty">
+       <attribute name="title">
+        <string>Uncertainty</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_45">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_uncertainty_2">
+          <property name="font">
+           <font>
+            <pointsize>12</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_uncertainty_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_50">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_66" stretch="5,5">
+              <item>
+               <widget class="QTableWidget" name="table_uncertainty_results"/>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_69" stretch="3,7">
+                <item>
+                 <widget class="QGroupBox" name="qb_contrib_meas_area">
+                  <property name="font">
+                   <font>
+                    <pointsize>11</pointsize>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Contributions to Meas. Q Uncertainty</string>
+                  </property>
+                  <layout class="QHBoxLayout" name="horizontalLayout_71">
+                   <item>
+                    <widget class="QWidget" name="graph_u_meas" native="true"/>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_contrib_measurement">
+                  <property name="font">
+                   <font>
+                    <pointsize>11</pointsize>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Contributions to Measurement Uncertainty</string>
+                  </property>
+                  <layout class="QHBoxLayout" name="horizontalLayout_70">
+                   <item>
+                    <widget class="QWidget" name="graph_u_measurement" native="true"/>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_uncertainty_2_advanced">
+           <attribute name="title">
+            <string>Advanced Settings</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_47">
+            <item row="0" column="0">
+             <widget class="QTableWidget" name="table_uncertainty_settings"/>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_uncertainty_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_48">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_uncertainty_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_65">
+               <item>
+                <widget class="QPlainTextEdit" name="display_uncertainty_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_uncertainty_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_68">
+               <item>
+                <widget class="QPlainTextEdit" name="display_uncertainty_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_adv_graph">
+       <attribute name="title">
+        <string>Adv. Graph</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_57">
+        <item row="0" column="0">
+         <layout class="QHBoxLayout" name="adv_graph_layout" stretch="7,3">
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_86" stretch="1,20">
+            <item>
+             <layout class="QHBoxLayout" name="horizontalLayout_86">
+              <item>
+               <widget class="QComboBox" name="combo_adv_graph_transect">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QPushButton" name="pb_adv_graph_controls">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Hide Plot Controls</string>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <widget class="QWidget" name="graph_adv_graph" native="true"/>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_99">
+            <item>
+             <widget class="QGroupBox" name="gb_adv_graph_controls">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Plot Controls</string>
+              </property>
+              <layout class="QGridLayout" name="gridLayout_55" rowstretch="0,0,0,0">
+               <item row="0" column="1">
+                <layout class="QVBoxLayout" name="verticalLayout_98">
+                 <item>
+                  <widget class="QGroupBox" name="groupBox_2">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Bottom Track</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_94">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_boat_speed">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Boat Speed (BT)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_3beam">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>3 Beam Solutions</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_error">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Error Velocity</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_vertical">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vertical Velocity</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_source">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Source</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_correlation">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Correlation</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_rssi">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>RSSI</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="groupBox_3">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>GPS</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_92">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_boat_speed">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Boat Speed (GGA)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_vtg_boat_speed">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Boat Speed (VTG)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_quality">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Quality</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_hdop">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>HDOP</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_altitude">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Altitude</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_satellites">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>No. Satellites</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_source">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Source (GGA)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_vtg_source">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Source (VTG)</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <spacer name="verticalSpacer_8">
+                   <property name="orientation">
+                    <enum>Qt::Vertical</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>20</width>
+                     <height>40</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                </layout>
+               </item>
+               <item row="3" column="0" colspan="3">
+                <widget class="QPushButton" name="pb_adv_graph_create_plots">
+                 <property name="font">
+                  <font>
+                   <pointsize>11</pointsize>
+                   <weight>75</weight>
+                   <bold>true</bold>
+                  </font>
+                 </property>
+                 <property name="text">
+                  <string>Create Plot</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="2">
+                <layout class="QVBoxLayout" name="verticalLayout_97">
+                 <item>
+                  <widget class="QGroupBox" name="groupBox_6">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Discharge</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_93">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_discharge">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Discharge Time Series</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_discharge_percent">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Discharge % of Total</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="groupBox_5">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Compass/P/R</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_90">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_adcp_heading">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Heading (ADCP)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_ext_heading">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Heading (External)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_mag_error">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Magnetic Error</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_pitch">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Pitch</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_roll">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Roll</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="groupBox_4">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Depth</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_91">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_beam_depths">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Beam Depths</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_final_depths">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Final Depths</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_depth_source">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Depth Source</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="gb_sensors">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Sensors</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_75">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_battery_voltage">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Battery Voltage</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <spacer name="verticalSpacer_5">
+                   <property name="orientation">
+                    <enum>Qt::Vertical</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>20</width>
+                     <height>40</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                </layout>
+               </item>
+               <item row="0" column="0">
+                <layout class="QVBoxLayout" name="verticalLayout_96" stretch="15,1">
+                 <item>
+                  <widget class="QGroupBox" name="gb_plot_type_3">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Water Track</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_87">
+                    <item>
+                     <widget class="QLabel" name="label_8">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                        <weight>75</weight>
+                        <bold>true</bold>
+                        <underline>true</underline>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Contour Plots</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_speed_filtered">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Speed - Filtered</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_speed_final">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Speed - Final</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_projected">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Speed Projected</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_vertical">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vertical Velocity</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_error">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Error Velocity</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_direction">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Direction</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_avg_corr">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Average Correlation</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_corr_beam">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Correlation by Beam</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_avg_rssi">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Average RSSI or SNR</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_rssi_beam">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>RSSI or SNR by Beam</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_ping_type">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Ping Type</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QLabel" name="label_9">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                        <weight>75</weight>
+                        <bold>true</bold>
+                        <underline>true</underline>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Time Series</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_avg_speed">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Average Speed</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_projected_speed_ts">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Projected Speed</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_wt_error_ts">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Error Velocity</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_wt_vert_ts">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vertical Velocity</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_wt_snr_ts">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>SNR</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_wt_beams_ts">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Beams Used</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <spacer name="verticalSpacer_9">
+                   <property name="orientation">
+                    <enum>Qt::Vertical</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>20</width>
+                     <height>40</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                </layout>
+               </item>
+               <item row="1" column="0">
+                <widget class="QGroupBox" name="groupBox">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>75</weight>
+                   <bold>true</bold>
+                  </font>
+                 </property>
+                 <property name="title">
+                  <string>Projection Angle</string>
+                 </property>
+                 <layout class="QHBoxLayout" name="horizontalLayout_88">
+                  <item>
+                   <widget class="QLineEdit" name="ed_adv_graph_flow_dir">
+                    <property name="maximumSize">
+                     <size>
+                      <width>100</width>
+                      <height>16777215</height>
+                     </size>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QPushButton" name="pb_adv_graph_auto_flow_direction">
+                    <property name="sizePolicy">
+                     <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                      <horstretch>0</horstretch>
+                      <verstretch>0</verstretch>
+                     </sizepolicy>
+                    </property>
+                    <property name="maximumSize">
+                     <size>
+                      <width>50</width>
+                      <height>16777215</height>
+                     </size>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Auto</string>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </widget>
+               </item>
+               <item row="1" column="1">
+                <widget class="QGroupBox" name="gb_x_axis_3">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>75</weight>
+                   <bold>true</bold>
+                  </font>
+                 </property>
+                 <property name="title">
+                  <string>Select X-Axis</string>
+                 </property>
+                 <layout class="QVBoxLayout" name="verticalLayout_89">
+                  <item>
+                   <widget class="QRadioButton" name="rb_adv_graph_ensemble">
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Ensemble</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QRadioButton" name="rb_adv_graph_time">
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Time</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QRadioButton" name="rb_adv_graph_length">
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Length</string>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <spacer name="verticalSpacer_10">
+              <property name="orientation">
+               <enum>Qt::Vertical</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>20</width>
+                <height>130</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_map">
+       <attribute name="title">
+        <string>MAP</string>
+       </attribute>
+       <layout class="QHBoxLayout" name="horizontalLayout_101">
+        <item>
+         <layout class="QHBoxLayout" name="horizontalLayout_100" stretch="8,2">
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_71" stretch="1,3">
+            <item>
+             <layout class="QHBoxLayout" name="horizontalLayout_90">
+              <item>
+               <widget class="QGroupBox" name="gb_previous_2">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>MAP Properties</string>
+                </property>
+                <layout class="QVBoxLayout" name="verticalLayout_70" stretch="0,1">
+                 <property name="sizeConstraint">
+                  <enum>QLayout::SetDefaultConstraint</enum>
+                 </property>
+                 <item>
+                  <layout class="QGridLayout" name="gridLayout_51" rowstretch="2,0,0" columnstretch="1,0">
+                   <property name="sizeConstraint">
+                    <enum>QLayout::SetDefaultConstraint</enum>
+                   </property>
+                   <item row="2" column="0">
+                    <layout class="QHBoxLayout" name="horizontalLayout_87" stretch="0,0,0">
+                     <item alignment="Qt::AlignLeft">
+                      <widget class="QLabel" name="txt_map_data">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>50</weight>
+                         <bold>false</bold>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Data to plot:</string>
+                       </property>
+                       <property name="alignment">
+                        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QComboBox" name="combo_map_data">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>50</weight>
+                         <bold>false</bold>
+                        </font>
+                       </property>
+                       <item>
+                        <property name="text">
+                         <string>Primary velocity</string>
+                        </property>
+                       </item>
+                       <item>
+                        <property name="text">
+                         <string>Streamwise velocity</string>
+                        </property>
+                       </item>
+                      </widget>
+                     </item>
+                     <item>
+                      <spacer name="horizontalSpacer_6">
+                       <property name="orientation">
+                        <enum>Qt::Horizontal</enum>
+                       </property>
+                       <property name="sizeHint" stdset="0">
+                        <size>
+                         <width>40</width>
+                         <height>20</height>
+                        </size>
+                       </property>
+                      </spacer>
+                     </item>
+                    </layout>
+                   </item>
+                   <item row="1" column="1">
+                    <layout class="QHBoxLayout" name="horizontalLayout_93">
+                     <item>
+                      <widget class="QCheckBox" name="cb_map_bed_profiles">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>50</weight>
+                         <bold>false</bold>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Individual bed profiles</string>
+                       </property>
+                       <property name="checked">
+                        <bool>false</bool>
+                       </property>
+                      </widget>
+                     </item>
+                    </layout>
+                   </item>
+                   <item row="2" column="1">
+                    <layout class="QHBoxLayout" name="horizontalLayout_92">
+                     <item>
+                      <widget class="QLabel" name="label_6">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>50</weight>
+                         <bold>false</bold>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Quiver scale:</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QLineEdit" name="ed_map_secondary_velocity">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>50</weight>
+                         <bold>false</bold>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string/>
+                       </property>
+                      </widget>
+                     </item>
+                    </layout>
+                   </item>
+                   <item row="0" column="0">
+                    <layout class="QHBoxLayout" name="horizontalLayout_89">
+                     <item>
+                      <widget class="QLabel" name="label">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>75</weight>
+                         <bold>true</bold>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Cell width (m)</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QLineEdit" name="ed_map_cell_width">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>50</weight>
+                         <bold>false</bold>
+                        </font>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QLabel" name="label_2">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>75</weight>
+                         <bold>true</bold>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Cell height (m)</string>
+                       </property>
+                      </widget>
+                     </item>
+                    </layout>
+                   </item>
+                   <item row="0" column="1">
+                    <layout class="QHBoxLayout" name="horizontalLayout_96">
+                     <item>
+                      <widget class="QLineEdit" name="ed_map_cell_height">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>50</weight>
+                         <bold>false</bold>
+                        </font>
+                       </property>
+                      </widget>
+                     </item>
+                    </layout>
+                   </item>
+                   <item row="1" column="0">
+                    <layout class="QHBoxLayout" name="horizontalLayout_91">
+                     <item>
+                      <widget class="QCheckBox" name="cb_map_top_bottom">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>50</weight>
+                         <bold>false</bold>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Top/bottom extrap</string>
+                       </property>
+                       <property name="checked">
+                        <bool>true</bool>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QCheckBox" name="cb_map_edges">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>50</weight>
+                         <bold>false</bold>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Edges extrap</string>
+                       </property>
+                       <property name="checked">
+                        <bool>true</bool>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QCheckBox" name="cb_map_interpolation">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>50</weight>
+                         <bold>false</bold>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Interpolation</string>
+                       </property>
+                       <property name="checked">
+                        <bool>false</bool>
+                       </property>
+                      </widget>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QVBoxLayout" name="verticalLayout_69" stretch="1">
+                   <item>
+                    <layout class="QHBoxLayout" name="horizontalLayout_99" stretch="2,1">
+                     <property name="topMargin">
+                      <number>0</number>
+                     </property>
+                     <property name="bottomMargin">
+                      <number>0</number>
+                     </property>
+                     <item>
+                      <spacer name="horizontalSpacer_12">
+                       <property name="orientation">
+                        <enum>Qt::Horizontal</enum>
+                       </property>
+                       <property name="sizeHint" stdset="0">
+                        <size>
+                         <width>40</width>
+                         <height>20</height>
+                        </size>
+                       </property>
+                      </spacer>
+                     </item>
+                     <item>
+                      <widget class="QPushButton" name="pb_map_apply">
+                       <property name="font">
+                        <font>
+                         <pointsize>11</pointsize>
+                         <weight>75</weight>
+                         <bold>true</bold>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Apply</string>
+                       </property>
+                       <property name="autoDefault">
+                        <bool>false</bool>
+                       </property>
+                       <property name="default">
+                        <bool>false</bool>
+                       </property>
+                      </widget>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_85">
+                <item>
+                 <spacer name="horizontalSpacer_10">
+                  <property name="orientation">
+                   <enum>Qt::Horizontal</enum>
+                  </property>
+                  <property name="sizeHint" stdset="0">
+                   <size>
+                    <width>40</width>
+                    <height>20</height>
+                   </size>
+                  </property>
+                 </spacer>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <layout class="QVBoxLayout" name="verticalLayout_74" stretch="9,1">
+              <item>
+               <widget class="QWidget" name="graphics_map_wt_contour" native="true">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="minimumSize">
+                 <size>
+                  <width>500</width>
+                  <height>200</height>
+                 </size>
+                </property>
+                <property name="autoFillBackground">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_94" stretch="3,1,0">
+                <item>
+                 <spacer name="horizontalSpacer_14">
+                  <property name="orientation">
+                   <enum>Qt::Horizontal</enum>
+                  </property>
+                  <property name="sizeHint" stdset="0">
+                   <size>
+                    <width>40</width>
+                    <height>20</height>
+                   </size>
+                  </property>
+                 </spacer>
+                </item>
+                <item>
+                 <widget class="QPushButton" name="pb_map_save">
+                  <property name="font">
+                   <font>
+                    <pointsize>11</pointsize>
+                    <weight>75</weight>
+                    <bold>true</bold>
+                   </font>
+                  </property>
+                  <property name="text">
+                   <string>Save MAP data</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <spacer name="horizontalSpacer_13">
+                  <property name="orientation">
+                   <enum>Qt::Horizontal</enum>
+                  </property>
+                  <property name="sizeHint" stdset="0">
+                   <size>
+                    <width>40</width>
+                    <height>20</height>
+                   </size>
+                  </property>
+                 </spacer>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_73" stretch="1,1,1">
+            <item>
+             <widget class="QGroupBox" name="gb_previous_3">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>MAP Results</string>
+              </property>
+              <layout class="QVBoxLayout" name="verticalLayout_72">
+               <item>
+                <widget class="QTableWidget" name="table_map_results">
+                 <property name="font">
+                  <font>
+                   <pointsize>10</pointsize>
+                  </font>
+                 </property>
+                 <property name="styleSheet">
+                  <string notr="true"/>
+                 </property>
+                 <property name="sizeAdjustPolicy">
+                  <enum>QAbstractScrollArea::AdjustIgnored</enum>
+                 </property>
+                 <property name="editTriggers">
+                  <set>QAbstractItemView::NoEditTriggers</set>
+                 </property>
+                 <property name="textElideMode">
+                  <enum>Qt::ElideNone</enum>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <widget class="QWidget" name="graphics_map_track" native="true">
+              <property name="autoFillBackground">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QPushButton" name="pb_map_open_earth">
+              <property name="font">
+               <font>
+                <pointsize>11</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string>Open MAP in Google Earth</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+  <widget class="QToolBar" name="toolBar">
+   <property name="sizePolicy">
+    <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>12</pointsize>
+     <weight>50</weight>
+     <italic>false</italic>
+     <bold>false</bold>
+    </font>
+   </property>
+   <property name="windowTitle">
+    <string>toolBar</string>
+   </property>
+   <property name="layoutDirection">
+    <enum>Qt::LeftToRight</enum>
+   </property>
+   <property name="styleSheet">
+    <string notr="true">QToolBar{background: solid rgb(240, 240, 240); font: 12pt}
+font: 12pt &quot;MS Shell Dlg 2&quot;;</string>
+   </property>
+   <property name="movable">
+    <bool>false</bool>
+   </property>
+   <property name="allowedAreas">
+    <set>Qt::AllToolBarAreas</set>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Horizontal</enum>
+   </property>
+   <property name="iconSize">
+    <size>
+     <width>70</width>
+     <height>40</height>
+    </size>
+   </property>
+   <property name="floatable">
+    <bool>false</bool>
+   </property>
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+   <addaction name="actionOpen"/>
+   <addaction name="separator"/>
+   <addaction name="actionSave"/>
+   <addaction name="separator"/>
+   <addaction name="actionOptions"/>
+   <addaction name="separator"/>
+   <addaction name="actionComment"/>
+   <addaction name="separator"/>
+   <addaction name="actionCheck"/>
+   <addaction name="separator"/>
+   <addaction name="actionNav_Reference"/>
+   <addaction name="actionBT"/>
+   <addaction name="actionGGA"/>
+   <addaction name="actionVTG"/>
+   <addaction name="separator"/>
+   <addaction name="actionComp_Tracks"/>
+   <addaction name="actionON"/>
+   <addaction name="actionOFF"/>
+   <addaction name="separator"/>
+   <addaction name="actionHome"/>
+   <addaction name="actionZoom"/>
+   <addaction name="actionPan"/>
+   <addaction name="actionData_Cursor"/>
+   <addaction name="separator"/>
+   <addaction name="actionShow_Extrapolated"/>
+   <addaction name="separator"/>
+   <addaction name="actionGoogle_Earth"/>
+   <addaction name="separator"/>
+   <addaction name="actionHelp"/>
+   <addaction name="separator"/>
+  </widget>
+  <action name="actionOpen">
+   <property name="icon">
+    <iconset>
+     <normalon>:/images/images/52.png</normalon>
+    </iconset>
+   </property>
+   <property name="text">
+    <string>Open</string>
+   </property>
+   <property name="toolTip">
+    <string>Opens measurement data file(s)</string>
+   </property>
+  </action>
+  <action name="actionOptions">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Application.png</normaloff>
+     <normalon>:/images/24x24/Application.png</normalon>:/images/24x24/Application.png</iconset>
+   </property>
+   <property name="text">
+    <string>options</string>
+   </property>
+   <property name="toolTip">
+    <string>Optional Settings</string>
+   </property>
+  </action>
+  <action name="actionSave">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/images/22.png</normaloff>:/images/images/22.png</iconset>
+   </property>
+   <property name="text">
+    <string>Save</string>
+   </property>
+  </action>
+  <action name="actionComment">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Notes.png</normaloff>
+     <normalon>:/images/24x24/Notes.png</normalon>:/images/24x24/Notes.png</iconset>
+   </property>
+   <property name="text">
+    <string>Comment</string>
+   </property>
+  </action>
+  <action name="actionHelp">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Help book 3d.png</normaloff>:/images/24x24/Help book 3d.png</iconset>
+   </property>
+   <property name="text">
+    <string>Help</string>
+   </property>
+  </action>
+  <action name="actionCheck">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/check-mark-green.png</normaloff>:/images/24x24/check-mark-green.png</iconset>
+   </property>
+   <property name="text">
+    <string>Check/Uncheck</string>
+   </property>
+  </action>
+  <action name="actionBT">
+   <property name="checkable">
+    <bool>false</bool>
+   </property>
+   <property name="checked">
+    <bool>false</bool>
+   </property>
+   <property name="text">
+    <string>BT</string>
+   </property>
+   <property name="toolTip">
+    <string>BT</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+     <weight>75</weight>
+     <bold>true</bold>
+    </font>
+   </property>
+  </action>
+  <action name="actionGGA">
+   <property name="text">
+    <string>GGA</string>
+   </property>
+   <property name="toolTip">
+    <string>GGA</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+  </action>
+  <action name="actionVTG">
+   <property name="text">
+    <string>VTG</string>
+   </property>
+   <property name="toolTip">
+    <string>VTG</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+  </action>
+  <action name="actionNav_Reference">
+   <property name="text">
+    <string>Nav Reference:</string>
+   </property>
+   <property name="toolTip">
+    <string>Nav Reference:</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+  </action>
+  <action name="actionComp_Tracks">
+   <property name="text">
+    <string>Comp Tracks:</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+  </action>
+  <action name="actionON">
+   <property name="text">
+    <string>ON</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+  </action>
+  <action name="actionOFF">
+   <property name="checkable">
+    <bool>false</bool>
+   </property>
+   <property name="text">
+    <string>OFF</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+     <weight>75</weight>
+     <bold>true</bold>
+    </font>
+   </property>
+  </action>
+  <action name="actionHome">
+   <property name="checkable">
+    <bool>false</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Home.png</normaloff>:/images/24x24/Home.png</iconset>
+   </property>
+   <property name="text">
+    <string>Home</string>
+   </property>
+   <property name="toolTip">
+    <string>Reset zoom / pan</string>
+   </property>
+  </action>
+  <action name="actionZoom">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/images/83.png</normaloff>:/images/images/83.png</iconset>
+   </property>
+   <property name="text">
+    <string>Zoom</string>
+   </property>
+   <property name="toolTip">
+    <string>Zoom rectangle</string>
+   </property>
+  </action>
+  <action name="actionPan">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Move.png</normaloff>:/images/24x24/Move.png</iconset>
+   </property>
+   <property name="text">
+    <string>Pan</string>
+   </property>
+   <property name="toolTip">
+    <string>Pan</string>
+   </property>
+  </action>
+  <action name="actionData_Cursor">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Info.png</normaloff>:/images/24x24/Info.png</iconset>
+   </property>
+   <property name="text">
+    <string>Data Cursor</string>
+   </property>
+   <property name="toolTip">
+    <string>Data Cursor</string>
+   </property>
+  </action>
+  <action name="actionGoogle_Earth">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Globe.png</normaloff>:/images/24x24/Globe.png</iconset>
+   </property>
+   <property name="text">
+    <string>Google Earth</string>
+   </property>
+   <property name="toolTip">
+    <string>Plot to Google Earth</string>
+   </property>
+  </action>
+  <action name="actionShow_Extrapolated">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/images/60.png</normaloff>:/images/images/60.png</iconset>
+   </property>
+   <property name="text">
+    <string>Show_Extrapolated</string>
+   </property>
+   <property name="toolTip">
+    <string>Show extrapolated speeds</string>
+   </property>
+  </action>
+ </widget>
+ <resources>
+  <include location="dsm.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/UI/QRev_gui_2_py.bat b/UI/QRev_gui_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..6afaacc7f02292aa96e1fe5742e8e6506c1ebc0c
--- /dev/null
+++ b/UI/QRev_gui_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x QRev_gui.ui -o QRev_gui.py
diff --git a/UI/QRev_gui_usgs.ui b/UI/QRev_gui_usgs.ui
new file mode 100644
index 0000000000000000000000000000000000000000..c1a9ce39315022735e2f153cd6affbcb36698f78
--- /dev/null
+++ b/UI/QRev_gui_usgs.ui
@@ -0,0 +1,7088 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>1465</width>
+    <height>869</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <property name="windowIcon">
+   <iconset>
+    <normaloff>QRev.ico</normaloff>QRev.ico</iconset>
+  </property>
+  <property name="layoutDirection">
+   <enum>Qt::LeftToRight</enum>
+  </property>
+  <property name="styleSheet">
+   <string notr="true"/>
+  </property>
+  <property name="dockOptions">
+   <set>QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks|QMainWindow::VerticalTabs</set>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <property name="sizePolicy">
+    <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+   </property>
+   <property name="styleSheet">
+    <string notr="true"/>
+   </property>
+   <layout class="QHBoxLayout" name="horizontalLayout_4" stretch="0">
+    <item>
+     <widget class="QTabWidget" name="tab_all">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
+      <property name="sizeIncrement">
+       <size>
+        <width>0</width>
+        <height>0</height>
+       </size>
+      </property>
+      <property name="palette">
+       <palette>
+        <active>
+         <colorrole role="Text">
+          <brush brushstyle="SolidPattern">
+           <color alpha="255">
+            <red>0</red>
+            <green>0</green>
+            <blue>0</blue>
+           </color>
+          </brush>
+         </colorrole>
+        </active>
+        <inactive>
+         <colorrole role="Text">
+          <brush brushstyle="SolidPattern">
+           <color alpha="255">
+            <red>0</red>
+            <green>0</green>
+            <blue>0</blue>
+           </color>
+          </brush>
+         </colorrole>
+        </inactive>
+        <disabled>
+         <colorrole role="Text">
+          <brush brushstyle="SolidPattern">
+           <color alpha="255">
+            <red>120</red>
+            <green>120</green>
+            <blue>120</blue>
+           </color>
+          </brush>
+         </colorrole>
+        </disabled>
+       </palette>
+      </property>
+      <property name="font">
+       <font>
+        <pointsize>12</pointsize>
+       </font>
+      </property>
+      <property name="autoFillBackground">
+       <bool>false</bool>
+      </property>
+      <property name="styleSheet">
+       <string notr="true"/>
+      </property>
+      <property name="tabPosition">
+       <enum>QTabWidget::North</enum>
+      </property>
+      <property name="tabShape">
+       <enum>QTabWidget::Triangular</enum>
+      </property>
+      <property name="currentIndex">
+       <number>0</number>
+      </property>
+      <property name="iconSize">
+       <size>
+        <width>40</width>
+        <height>24</height>
+       </size>
+      </property>
+      <widget class="QWidget" name="tab_main">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <attribute name="title">
+        <string>Main</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_49">
+        <item row="0" column="0">
+         <layout class="QHBoxLayout" name="horizontalLayout_64" stretch="8,2">
+          <item>
+           <widget class="QSplitter" name="splitter">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <widget class="QTabWidget" name="tab_summary">
+             <property name="palette">
+              <palette>
+               <active>
+                <colorrole role="WindowText">
+                 <brush brushstyle="SolidPattern">
+                  <color alpha="255">
+                   <red>0</red>
+                   <green>0</green>
+                   <blue>0</blue>
+                  </color>
+                 </brush>
+                </colorrole>
+               </active>
+               <inactive>
+                <colorrole role="WindowText">
+                 <brush brushstyle="SolidPattern">
+                  <color alpha="255">
+                   <red>0</red>
+                   <green>0</green>
+                   <blue>0</blue>
+                  </color>
+                 </brush>
+                </colorrole>
+               </inactive>
+               <disabled>
+                <colorrole role="WindowText">
+                 <brush brushstyle="SolidPattern">
+                  <color alpha="255">
+                   <red>120</red>
+                   <green>120</green>
+                   <blue>120</blue>
+                  </color>
+                 </brush>
+                </colorrole>
+               </disabled>
+              </palette>
+             </property>
+             <property name="font">
+              <font>
+               <pointsize>12</pointsize>
+              </font>
+             </property>
+             <property name="layoutDirection">
+              <enum>Qt::LeftToRight</enum>
+             </property>
+             <property name="tabPosition">
+              <enum>QTabWidget::North</enum>
+             </property>
+             <property name="tabShape">
+              <enum>QTabWidget::Triangular</enum>
+             </property>
+             <property name="currentIndex">
+              <number>0</number>
+             </property>
+             <widget class="QWidget" name="tab_summary_discharge">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <attribute name="title">
+               <string>Summary</string>
+              </attribute>
+              <layout class="QGridLayout" name="gridLayout_2">
+               <item row="0" column="0">
+                <widget class="QTableWidget" name="main_table_summary">
+                 <property name="font">
+                  <font>
+                   <pointsize>10</pointsize>
+                  </font>
+                 </property>
+                 <property name="autoFillBackground">
+                  <bool>false</bool>
+                 </property>
+                 <property name="sizeAdjustPolicy">
+                  <enum>QAbstractScrollArea::AdjustIgnored</enum>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+             <widget class="QWidget" name="tab_summary_details">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <attribute name="title">
+               <string>Details</string>
+              </attribute>
+              <layout class="QGridLayout" name="gridLayout_4">
+               <item row="0" column="0">
+                <widget class="QTableWidget" name="main_table_details">
+                 <property name="font">
+                  <font>
+                   <pointsize>10</pointsize>
+                  </font>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+             <widget class="QWidget" name="tab_summary_premeasurement">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <attribute name="title">
+               <string>Premeasurement</string>
+              </attribute>
+              <layout class="QGridLayout" name="gridLayout_7">
+               <item row="0" column="0">
+                <layout class="QVBoxLayout" name="verticalLayout_2">
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_3" stretch="1,5,1,2">
+                   <item>
+                    <widget class="QLabel" name="label_site_name">
+                     <property name="frameShape">
+                      <enum>QFrame::NoFrame</enum>
+                     </property>
+                     <property name="text">
+                      <string>Site Name: </string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_site_name"/>
+                   </item>
+                   <item>
+                    <widget class="QLabel" name="label_site_number">
+                     <property name="text">
+                      <string>Site Number:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_site_number"/>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="3">
+                   <item>
+                    <widget class="QTableWidget" name="table_premeas">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                      </font>
+                     </property>
+                    </widget>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
+               </item>
+               <item row="0" column="1">
+                <widget class="QLabel" name="txt_site_name">
+                 <property name="text">
+                  <string/>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+             <widget class="QWidget" name="tab_summary_settings">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <attribute name="title">
+               <string>Settings</string>
+              </attribute>
+              <layout class="QGridLayout" name="gridLayout_5">
+               <item row="0" column="0">
+                <widget class="QTableWidget" name="table_settings">
+                 <property name="font">
+                  <font>
+                   <pointsize>9</pointsize>
+                  </font>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+             <widget class="QWidget" name="tab_summary_adcp">
+              <attribute name="title">
+               <string>ADCP</string>
+              </attribute>
+              <layout class="QGridLayout" name="gridLayout_6">
+               <item row="0" column="0">
+                <widget class="QTableWidget" name="table_adcp">
+                 <property name="font">
+                  <font>
+                   <pointsize>10</pointsize>
+                  </font>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </widget>
+            <widget class="QWidget" name="layoutWidget">
+             <layout class="QHBoxLayout" name="horizontalLayout" stretch="4,2">
+              <property name="spacing">
+               <number>2</number>
+              </property>
+              <item>
+               <widget class="QWidget" name="graphics_wt_contour" native="true">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="minimumSize">
+                 <size>
+                  <width>500</width>
+                  <height>200</height>
+                 </size>
+                </property>
+                <property name="autoFillBackground">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QWidget" name="graphics_shiptrack" native="true">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="autoFillBackground">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+            <widget class="QWidget" name="layoutWidget">
+             <layout class="QHBoxLayout" name="horizontalLayout_bottom" stretch="4,2">
+              <item>
+               <widget class="QTabWidget" name="tab_mc">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                 </font>
+                </property>
+                <property name="tabShape">
+                 <enum>QTabWidget::Triangular</enum>
+                </property>
+                <property name="currentIndex">
+                 <number>0</number>
+                </property>
+                <widget class="QWidget" name="tab_mc_messages">
+                 <property name="sizePolicy">
+                  <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                   <horstretch>0</horstretch>
+                   <verstretch>0</verstretch>
+                  </sizepolicy>
+                 </property>
+                 <attribute name="title">
+                  <string>Messages</string>
+                 </attribute>
+                 <layout class="QGridLayout" name="gridLayout_3">
+                  <item row="0" column="0">
+                   <widget class="QTableWidget" name="main_message_table"/>
+                  </item>
+                 </layout>
+                </widget>
+                <widget class="QWidget" name="tab_mc_comments">
+                 <property name="sizePolicy">
+                  <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                   <horstretch>0</horstretch>
+                   <verstretch>0</verstretch>
+                  </sizepolicy>
+                 </property>
+                 <attribute name="title">
+                  <string>Comments</string>
+                 </attribute>
+                 <layout class="QHBoxLayout" name="horizontalLayout_2">
+                  <item>
+                   <widget class="QPlainTextEdit" name="display_comments">
+                    <property name="readOnly">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </widget>
+               </widget>
+              </item>
+              <item>
+               <widget class="QWidget" name="graphics_main_timeseries" native="true">
+                <property name="autoFillBackground">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+           </widget>
+          </item>
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_right" stretch="20,0,40,0,40">
+            <item>
+             <widget class="QTableWidget" name="table_qa"/>
+            </item>
+            <item>
+             <widget class="QWidget" name="uncertainty_lollipop" native="true">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QTableWidget" name="table_uncertainty"/>
+            </item>
+            <item>
+             <layout class="QHBoxLayout" name="horizontalLayout_74">
+              <item>
+               <widget class="QLabel" name="label_5">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>User Rating:</string>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLineEdit" name="le_user_rating">
+                <property name="enabled">
+                 <bool>true</bool>
+                </property>
+                <property name="readOnly">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <widget class="QWidget" name="graphics_main_extrap" native="true">
+              <property name="autoFillBackground">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_systest">
+       <attribute name="title">
+        <string>SysTest</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_10">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_systest_2">
+          <property name="tabPosition">
+           <enum>QTabWidget::North</enum>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_systest_2_results">
+           <attribute name="title">
+            <string>Results</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_8">
+            <item row="0" column="0">
+             <layout class="QHBoxLayout" name="horizontalLayout_6" stretch="2,3">
+              <item>
+               <widget class="QTableWidget" name="table_systest"/>
+              </item>
+              <item>
+               <widget class="QPlainTextEdit" name="display_systest">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_systest_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_9">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_3">
+              <item>
+               <widget class="QGroupBox" name="box_systest_messages">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Quality Check Messages</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_7">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_systest_messages">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="box_systest_comments">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Comments</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_8">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_systest_comments">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_compass">
+       <attribute name="title">
+        <string>Compass/P/R</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_28">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_compass_2">
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_compass_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_11">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_6" stretch="3,4,4">
+              <item>
+               <widget class="QTableWidget" name="table_compass_pr"/>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_10" stretch="10,2">
+                <item>
+                 <widget class="QWidget" name="graph_heading" native="true"/>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_4">
+                  <item>
+                   <widget class="QCheckBox" name="cb_adcp_compass">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="text">
+                     <string>ADCP Compass</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_ext_compass">
+                    <property name="enabled">
+                     <bool>false</bool>
+                    </property>
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="text">
+                     <string>Ext. Compass</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_mag_field">
+                    <property name="enabled">
+                     <bool>false</bool>
+                    </property>
+                    <property name="text">
+                     <string>Mag. Field</string>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_9" stretch="10,2">
+                <item>
+                 <widget class="QWidget" name="graph_pr" native="true"/>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_5" stretch="9,1">
+                  <item>
+                   <widget class="QCheckBox" name="cb_pitch">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="text">
+                     <string>Pitch</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_roll">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="text">
+                     <string>Roll</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_compass_2_cal">
+           <attribute name="title">
+            <string>Calibration / Evaluation</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_14">
+            <item row="0" column="0">
+             <layout class="QHBoxLayout" name="horizontalLayout_11" stretch="1,2">
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_7">
+                <item>
+                 <widget class="QGroupBox" name="groupBox_cal">
+                  <property name="title">
+                   <string>Compass Calibration</string>
+                  </property>
+                  <layout class="QGridLayout" name="gridLayout_12">
+                   <item row="0" column="0">
+                    <widget class="QTableWidget" name="table_compass_cal"/>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="groupBox_eval">
+                  <property name="title">
+                   <string>Compass Evaluation</string>
+                  </property>
+                  <layout class="QGridLayout" name="gridLayout_13">
+                   <item row="0" column="0">
+                    <widget class="QTableWidget" name="table_compass_eval"/>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <widget class="QTextEdit" name="display_compass_result"/>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_compass_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_15">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_8">
+              <item>
+               <widget class="QGroupBox" name="box_compass_messages">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Quality Check Messages</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_12">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_compass_messages">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="box_compass_comments">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Comments</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_13">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_compass_comments">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_tempsal">
+       <attribute name="title">
+        <string>Temp/Sal</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_18">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_tempsal_2">
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_tempsal_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_19">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_11" stretch="3,5">
+              <item>
+               <widget class="QTableWidget" name="table_tempsal"/>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="gb_temp">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Water Temperature</string>
+                </property>
+                <layout class="QGridLayout" name="gridLayout_17">
+                 <item row="0" column="0">
+                  <layout class="QHBoxLayout" name="horizontalLayout_14" stretch="1,4">
+                   <item>
+                    <layout class="QVBoxLayout" name="verticalLayout_10">
+                     <item>
+                      <spacer name="verticalSpacer_2">
+                       <property name="orientation">
+                        <enum>Qt::Vertical</enum>
+                       </property>
+                       <property name="sizeHint" stdset="0">
+                        <size>
+                         <width>20</width>
+                         <height>40</height>
+                        </size>
+                       </property>
+                      </spacer>
+                     </item>
+                     <item>
+                      <layout class="QGridLayout" name="gridLayout_16" columnminimumwidth="2,1,1">
+                       <item row="0" column="0">
+                        <widget class="QLabel" name="label_independent">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Independent:</string>
+                         </property>
+                         <property name="alignment">
+                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="0" column="1">
+                        <widget class="QLineEdit" name="ed_user_temp">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="0" column="2">
+                        <widget class="QPushButton" name="pb_ind_temp_apply">
+                         <property name="enabled">
+                          <bool>false</bool>
+                         </property>
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Apply</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="1" column="0">
+                        <widget class="QLabel" name="label_adcp">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>ADCP:</string>
+                         </property>
+                         <property name="alignment">
+                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="1" column="1">
+                        <widget class="QLineEdit" name="ed_adcp_temp">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="1" column="2">
+                        <widget class="QPushButton" name="pb_adcp_temp_apply">
+                         <property name="enabled">
+                          <bool>false</bool>
+                         </property>
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Apply</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="2" column="0">
+                        <widget class="QLabel" name="label_adcp_avg">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>ADCP Average:</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="2" column="1">
+                        <widget class="QLabel" name="txt_adcp_avg">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>0</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item row="2" column="2">
+                        <spacer name="horizontalSpacer_3">
+                         <property name="orientation">
+                          <enum>Qt::Horizontal</enum>
+                         </property>
+                         <property name="sizeHint" stdset="0">
+                          <size>
+                           <width>40</width>
+                           <height>20</height>
+                          </size>
+                         </property>
+                        </spacer>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <layout class="QVBoxLayout" name="verticalLayout_9">
+                       <item>
+                        <widget class="QRadioButton" name="rb_f">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Fahrenheit</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_c">
+                         <property name="font">
+                          <font>
+                           <pointsize>12</pointsize>
+                           <weight>50</weight>
+                           <bold>false</bold>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Celsius</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <spacer name="verticalSpacer">
+                       <property name="orientation">
+                        <enum>Qt::Vertical</enum>
+                       </property>
+                       <property name="sizeHint" stdset="0">
+                        <size>
+                         <width>20</width>
+                         <height>40</height>
+                        </size>
+                       </property>
+                      </spacer>
+                     </item>
+                    </layout>
+                   </item>
+                   <item>
+                    <widget class="QWidget" name="graph_temperature" native="true"/>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_tempsal_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_20">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_12">
+              <item>
+               <widget class="QGroupBox" name="box_compass_messages_2">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Quality Check Messages</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_15">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_tempsal_messages">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="box_compass_comments_2">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Comments</string>
+                </property>
+                <layout class="QHBoxLayout" name="horizontalLayout_16">
+                 <item>
+                  <widget class="QPlainTextEdit" name="display_tempsal_comments">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="readOnly">
+                    <bool>true</bool>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_mbt">
+       <attribute name="title">
+        <string>MovBedTst</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_23">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_mtb_2">
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_mbt_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_22">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_14" stretch="1,0,2">
+              <item>
+               <widget class="QTableWidget" name="table_moving_bed">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLabel" name="txt_mb_plotted">
+                <property name="text">
+                 <string/>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignCenter</set>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_18" stretch="4,2">
+                <item>
+                 <widget class="QWidget" name="graph_mb_ts" native="true"/>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_mb_st">
+                  <property name="title">
+                   <string/>
+                  </property>
+                  <layout class="QGridLayout" name="gridLayout_21">
+                   <item row="0" column="0">
+                    <layout class="QVBoxLayout" name="verticalLayout_13" stretch="1,8">
+                     <item>
+                      <layout class="QHBoxLayout" name="horizontalLayout_17">
+                       <item>
+                        <widget class="QCheckBox" name="cb_mb_bt">
+                         <property name="palette">
+                          <palette>
+                           <active>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                            <colorrole role="Text">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </active>
+                           <inactive>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                            <colorrole role="Text">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>255</red>
+                               <green>0</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </inactive>
+                           <disabled>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>120</red>
+                               <green>120</green>
+                               <blue>120</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                            <colorrole role="Text">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>120</red>
+                               <green>120</green>
+                               <blue>120</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </disabled>
+                          </palette>
+                         </property>
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>BT</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QCheckBox" name="cb_mb_gga">
+                         <property name="palette">
+                          <palette>
+                           <active>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>0</red>
+                               <green>0</green>
+                               <blue>255</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </active>
+                           <inactive>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>0</red>
+                               <green>0</green>
+                               <blue>255</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </inactive>
+                           <disabled>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>120</red>
+                               <green>120</green>
+                               <blue>120</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </disabled>
+                          </palette>
+                         </property>
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>GGA</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QCheckBox" name="cb_mb_vtg">
+                         <property name="palette">
+                          <palette>
+                           <active>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>0</red>
+                               <green>170</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </active>
+                           <inactive>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>0</red>
+                               <green>170</green>
+                               <blue>0</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </inactive>
+                           <disabled>
+                            <colorrole role="WindowText">
+                             <brush brushstyle="SolidPattern">
+                              <color alpha="255">
+                               <red>120</red>
+                               <green>120</green>
+                               <blue>120</blue>
+                              </color>
+                             </brush>
+                            </colorrole>
+                           </disabled>
+                          </palette>
+                         </property>
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>VTG</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QCheckBox" name="cb_mb_vectors">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Vectors</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_mb_st" native="true"/>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_mbt_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_24">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_mb_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_20">
+               <item>
+                <widget class="QPlainTextEdit" name="display_mb_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_mb_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_19">
+               <item>
+                <widget class="QPlainTextEdit" name="display_mb_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_bt">
+       <attribute name="title">
+        <string>BT</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_33">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_bt_2">
+          <property name="font">
+           <font>
+            <pointsize>12</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_bt_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_26">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_18" stretch="2,4">
+              <item>
+               <widget class="QTableWidget" name="table_bt">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_22" stretch="6,3,1">
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_17" stretch="4,3">
+                  <item>
+                   <widget class="QGroupBox" name="gb_bt_radio">
+                    <property name="title">
+                     <string/>
+                    </property>
+                    <layout class="QVBoxLayout" name="verticalLayout_16" stretch="1,4">
+                     <item>
+                      <layout class="QHBoxLayout" name="horizontalLayout_21">
+                       <item>
+                        <widget class="QRadioButton" name="rb_bt_beam">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>3 Beam Solutions</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_bt_error">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Error Velocity</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_bt_vert">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Vertical Velocity</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_bt_other">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Other</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_bt_source">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Source</string>
+                         </property>
+                        </widget>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_bt_top" native="true"/>
+                     </item>
+                    </layout>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QWidget" name="graph_bt_bottom" native="true"/>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_20" stretch="1,8">
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_30">
+                    <item>
+                     <widget class="QCheckBox" name="cb_bt_bt">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>BT</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_bt_gga">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>GGA</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_bt_vtg">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>VTG</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_bt_vectors">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vectors</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </item>
+                  <item>
+                   <widget class="QWidget" name="graph_bt_st" native="true"/>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_bt_filters">
+                  <property name="font">
+                   <font>
+                    <pointsize>10</pointsize>
+                    <weight>75</weight>
+                    <bold>true</bold>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Filters</string>
+                  </property>
+                  <layout class="QVBoxLayout" name="verticalLayout_15" stretch="0,0,0,0">
+                   <item>
+                    <widget class="QGroupBox" name="gb_bt_3beam">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>3 Beam Solutions</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_21">
+                      <item>
+                       <widget class="QComboBox" name="combo_bt_3beam">
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Allow</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>4-Beam Only</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_bt_error_velocity">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Error Velocity</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_22">
+                      <item>
+                       <widget class="QComboBox" name="combo_bt_error_velocity">
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_29" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_bt_error_velocity">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_bt_error_vel_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_bt_vertical_velocity">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Vertical Velocity</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_23">
+                      <item>
+                       <widget class="QComboBox" name="combo_bt_vert_velocity">
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_31" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_bt_vert_velocity">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_bt_vert_vel_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_bt_other">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Other</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_24">
+                      <item>
+                       <widget class="QComboBox" name="combo_bt_other">
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Smooth</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_bt_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QVBoxLayout" name="verticalLayout_19">
+            <item>
+             <widget class="QGroupBox" name="box_bt_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_23">
+               <item>
+                <widget class="QPlainTextEdit" name="display_bt_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <widget class="QGroupBox" name="box_bt_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_24">
+               <item>
+                <widget class="QPlainTextEdit" name="display_bt_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_gps">
+       <attribute name="title">
+        <string>GPS</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_27">
+        <item row="1" column="0">
+         <widget class="QTabWidget" name="tab_gps_2">
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_gps_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_25">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_34" stretch="2,4">
+              <item>
+               <widget class="QTableWidget" name="table_gps">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_27" stretch="6,3,1">
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_35" stretch="4,3">
+                  <item>
+                   <widget class="QGroupBox" name="gb_gps_radio">
+                    <property name="title">
+                     <string/>
+                    </property>
+                    <layout class="QVBoxLayout" name="verticalLayout_36" stretch="1,4">
+                     <item>
+                      <layout class="QHBoxLayout" name="horizontalLayout_28">
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_quality">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Quality</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_altitude">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Altitude</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_hdop">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>HDOP</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_sats">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string># Sats</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_other">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Other</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_gps_source">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Source</string>
+                         </property>
+                        </widget>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_gps_top" native="true"/>
+                     </item>
+                    </layout>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QWidget" name="graph_gps_bottom" native="true"/>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_37" stretch="1,8">
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_35">
+                    <item>
+                     <widget class="QCheckBox" name="cb_gps_bt">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>BT</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_gps_gga">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>GGA</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_gps_vtg">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>VTG</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_gps_vectors">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vectors</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </item>
+                  <item>
+                   <widget class="QWidget" name="graph_gps_st" native="true"/>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_gps_filters">
+                  <property name="font">
+                   <font>
+                    <pointsize>10</pointsize>
+                    <weight>75</weight>
+                    <bold>true</bold>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Filters</string>
+                  </property>
+                  <layout class="QVBoxLayout" name="verticalLayout_38" stretch="0,0,0,0">
+                   <item>
+                    <widget class="QGroupBox" name="gb_gps_qual">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Minimum Quality (GGA)</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_39">
+                      <item>
+                       <widget class="QComboBox" name="combo_gps_qual">
+                        <property name="currentIndex">
+                         <number>1</number>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>1-Autonomous</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>2-Differential</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>4+-RTK</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_gps_altitude">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Altitude Change (GGA)</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_40">
+                      <item>
+                       <widget class="QComboBox" name="combo_gps_altitude">
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_36" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_gps_altitude">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_gps_altitude_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_gps_hdop">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>HDOP</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_41">
+                      <item>
+                       <widget class="QComboBox" name="combo_gps_hdop">
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_37" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_gps_hdop">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_gps_hdop_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_gps_other">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Other</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_42">
+                      <item>
+                       <widget class="QComboBox" name="combo_gps_other">
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Smooth</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_gps_2_gpsbt">
+           <attribute name="title">
+            <string>GPS - BT</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_46">
+            <item row="0" column="0">
+             <layout class="QHBoxLayout" name="horizontalLayout_73" stretch="6,4">
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_68" stretch="5,5">
+                <item>
+                 <widget class="QTableWidget" name="table_gps_bt">
+                  <property name="font">
+                   <font>
+                    <pointsize>10</pointsize>
+                   </font>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QWidget" name="graph_gps_bt_ts" native="true"/>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_67" stretch="1,9">
+                <item>
+                 <layout class="QHBoxLayout" name="horizontalLayout_72">
+                  <item>
+                   <widget class="QCheckBox" name="cb_gps_bt_2">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>255</red>
+                          <green>0</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                       <colorrole role="Text">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>BT</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_gps_gga_2">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>0</green>
+                          <blue>255</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>GGA</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_gps_vtg_2">
+                    <property name="palette">
+                     <palette>
+                      <active>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>170</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </active>
+                      <inactive>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>0</red>
+                          <green>170</green>
+                          <blue>0</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </inactive>
+                      <disabled>
+                       <colorrole role="WindowText">
+                        <brush brushstyle="SolidPattern">
+                         <color alpha="255">
+                          <red>120</red>
+                          <green>120</green>
+                          <blue>120</blue>
+                         </color>
+                        </brush>
+                       </colorrole>
+                      </disabled>
+                     </palette>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>VTG</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QCheckBox" name="cb_gps_vectors_2">
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Vectors</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <widget class="QWidget" name="graph_gps_st_2" native="true"/>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_gps_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_29">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_gps_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_47">
+               <item>
+                <widget class="QPlainTextEdit" name="display_gps_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_gps_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_46">
+               <item>
+                <widget class="QPlainTextEdit" name="display_gps_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_depth">
+       <attribute name="title">
+        <string>Depth</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_30">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_depth_2">
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_depth_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_31">
+            <item row="0" column="0">
+             <layout class="QHBoxLayout" name="horizontalLayout_25" stretch="8,2">
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_27" stretch="0,2,2">
+                <item>
+                 <widget class="QTableWidget" name="table_depth"/>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_depth_beams">
+                  <property name="title">
+                   <string>Individual Beams</string>
+                  </property>
+                  <layout class="QHBoxLayout" name="horizontalLayout_32" stretch="6,1">
+                   <item>
+                    <widget class="QWidget" name="graph_depth_beams" native="true"/>
+                   </item>
+                   <item>
+                    <layout class="QVBoxLayout" name="verticalLayout_25">
+                     <item>
+                      <widget class="QCheckBox" name="cb_depth_beam1">
+                       <property name="palette">
+                        <palette>
+                         <active>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>255</red>
+                             <green>0</green>
+                             <blue>0</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </active>
+                         <inactive>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>255</red>
+                             <green>0</green>
+                             <blue>0</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </inactive>
+                         <disabled>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>120</red>
+                             <green>120</green>
+                             <blue>120</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </disabled>
+                        </palette>
+                       </property>
+                       <property name="font">
+                        <font>
+                         <pointsize>10</pointsize>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Beam 1</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QCheckBox" name="cb_depth_beam2">
+                       <property name="palette">
+                        <palette>
+                         <active>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>0</red>
+                             <green>85</green>
+                             <blue>0</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </active>
+                         <inactive>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>0</red>
+                             <green>85</green>
+                             <blue>0</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </inactive>
+                         <disabled>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>120</red>
+                             <green>120</green>
+                             <blue>120</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </disabled>
+                        </palette>
+                       </property>
+                       <property name="font">
+                        <font>
+                         <pointsize>10</pointsize>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Beam 2</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QCheckBox" name="cb_depth_beam3">
+                       <property name="palette">
+                        <palette>
+                         <active>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>0</red>
+                             <green>0</green>
+                             <blue>255</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </active>
+                         <inactive>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>0</red>
+                             <green>0</green>
+                             <blue>255</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </inactive>
+                         <disabled>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>120</red>
+                             <green>120</green>
+                             <blue>120</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </disabled>
+                        </palette>
+                       </property>
+                       <property name="font">
+                        <font>
+                         <pointsize>10</pointsize>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Beam 3</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QCheckBox" name="cb_depth_beam4">
+                       <property name="palette">
+                        <palette>
+                         <active>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>170</red>
+                             <green>85</green>
+                             <blue>0</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </active>
+                         <inactive>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>170</red>
+                             <green>85</green>
+                             <blue>0</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </inactive>
+                         <disabled>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>120</red>
+                             <green>120</green>
+                             <blue>120</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </disabled>
+                        </palette>
+                       </property>
+                       <property name="font">
+                        <font>
+                         <pointsize>10</pointsize>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Beam 4</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QCheckBox" name="cb_depth_vert">
+                       <property name="palette">
+                        <palette>
+                         <active>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>170</red>
+                             <green>0</green>
+                             <blue>255</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </active>
+                         <inactive>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>170</red>
+                             <green>0</green>
+                             <blue>255</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </inactive>
+                         <disabled>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>120</red>
+                             <green>120</green>
+                             <blue>120</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </disabled>
+                        </palette>
+                       </property>
+                       <property name="font">
+                        <font>
+                         <pointsize>10</pointsize>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Vertical</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QCheckBox" name="cb_depth_ds">
+                       <property name="palette">
+                        <palette>
+                         <active>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>0</red>
+                             <green>170</green>
+                             <blue>255</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </active>
+                         <inactive>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>0</red>
+                             <green>170</green>
+                             <blue>255</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </inactive>
+                         <disabled>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>120</red>
+                             <green>120</green>
+                             <blue>120</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </disabled>
+                        </palette>
+                       </property>
+                       <property name="font">
+                        <font>
+                         <pointsize>10</pointsize>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Depth Sounder</string>
+                       </property>
+                      </widget>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_depth_cs">
+                  <property name="title">
+                   <string>Cross Section</string>
+                  </property>
+                  <layout class="QHBoxLayout" name="horizontalLayout_33" stretch="6,1">
+                   <item>
+                    <widget class="QWidget" name="graph_depth_cs" native="true"/>
+                   </item>
+                   <item>
+                    <layout class="QVBoxLayout" name="verticalLayout_26">
+                     <item>
+                      <widget class="QCheckBox" name="cb_depth_4beam_cs">
+                       <property name="palette">
+                        <palette>
+                         <active>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>255</red>
+                             <green>0</green>
+                             <blue>0</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </active>
+                         <inactive>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>255</red>
+                             <green>0</green>
+                             <blue>0</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </inactive>
+                         <disabled>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>120</red>
+                             <green>120</green>
+                             <blue>120</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </disabled>
+                        </palette>
+                       </property>
+                       <property name="font">
+                        <font>
+                         <pointsize>10</pointsize>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>4 Beam Avg</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QCheckBox" name="cb_depth_vert_cs">
+                       <property name="palette">
+                        <palette>
+                         <active>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>170</red>
+                             <green>0</green>
+                             <blue>255</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </active>
+                         <inactive>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>170</red>
+                             <green>0</green>
+                             <blue>255</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </inactive>
+                         <disabled>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>120</red>
+                             <green>120</green>
+                             <blue>120</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </disabled>
+                        </palette>
+                       </property>
+                       <property name="font">
+                        <font>
+                         <pointsize>10</pointsize>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Vertical</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QCheckBox" name="cb_depth_ds_cs">
+                       <property name="palette">
+                        <palette>
+                         <active>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>0</red>
+                             <green>170</green>
+                             <blue>255</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </active>
+                         <inactive>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>0</red>
+                             <green>170</green>
+                             <blue>255</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </inactive>
+                         <disabled>
+                          <colorrole role="WindowText">
+                           <brush brushstyle="SolidPattern">
+                            <color alpha="255">
+                             <red>120</red>
+                             <green>120</green>
+                             <blue>120</blue>
+                            </color>
+                           </brush>
+                          </colorrole>
+                         </disabled>
+                        </palette>
+                       </property>
+                       <property name="font">
+                        <font>
+                         <pointsize>10</pointsize>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Depth Sounder</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QCheckBox" name="cb_depth_final_cs">
+                       <property name="font">
+                        <font>
+                         <pointsize>10</pointsize>
+                        </font>
+                       </property>
+                       <property name="text">
+                        <string>Final</string>
+                       </property>
+                      </widget>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_28" stretch="1,3,1">
+                <item>
+                 <spacer name="verticalSpacer_3">
+                  <property name="orientation">
+                   <enum>Qt::Vertical</enum>
+                  </property>
+                  <property name="sizeHint" stdset="0">
+                   <size>
+                    <width>20</width>
+                    <height>40</height>
+                   </size>
+                  </property>
+                 </spacer>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_depth_settings">
+                  <property name="font">
+                   <font>
+                    <pointsize>10</pointsize>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Settings</string>
+                  </property>
+                  <layout class="QVBoxLayout" name="verticalLayout_29">
+                   <item>
+                    <widget class="QGroupBox" name="gb_depth_ref">
+                     <property name="title">
+                      <string>Depth Reference</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_30">
+                      <item>
+                       <widget class="QComboBox" name="combo_depth_ref"/>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_depth_averaging">
+                     <property name="title">
+                      <string>BT Averaging Method</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_31">
+                      <item>
+                       <widget class="QComboBox" name="combo_depth_avg">
+                        <item>
+                         <property name="text">
+                          <string>IDW</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Simple</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_depth_filter">
+                     <property name="title">
+                      <string>Filter</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_32">
+                      <item>
+                       <widget class="QComboBox" name="combo_depth_filter">
+                        <property name="currentText">
+                         <string>Off</string>
+                        </property>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Smooth</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>TRDI</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+                <item>
+                 <spacer name="verticalSpacer_4">
+                  <property name="orientation">
+                   <enum>Qt::Vertical</enum>
+                  </property>
+                  <property name="sizeHint" stdset="0">
+                   <size>
+                    <width>20</width>
+                    <height>40</height>
+                   </size>
+                  </property>
+                 </spacer>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_gps_2_messages_3">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_35">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_depth_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_49">
+               <item>
+                <widget class="QPlainTextEdit" name="display_depth_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_depth_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_48">
+               <item>
+                <widget class="QPlainTextEdit" name="display_depth_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_wt">
+       <attribute name="title">
+        <string>WT</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_38">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_wt_2">
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_wt_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_37">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_48" stretch="2,4">
+              <item>
+               <widget class="QTableWidget" name="table_wt">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_42" stretch="6,3,1">
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_49" stretch="5,4">
+                  <item>
+                   <widget class="QGroupBox" name="gb_wt_radio">
+                    <property name="title">
+                     <string/>
+                    </property>
+                    <layout class="QVBoxLayout" name="verticalLayout_50" stretch="1,4">
+                     <item>
+                      <layout class="QHBoxLayout" name="horizontalLayout_43">
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_contour">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string> Contour No Interp</string>
+                         </property>
+                         <property name="checked">
+                          <bool>true</bool>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_beam">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Beams Used</string>
+                         </property>
+                         <property name="checked">
+                          <bool>false</bool>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_error">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Error Vel.</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_vert">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Vertical Vel.</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_snr">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>SNR</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QRadioButton" name="rb_wt_speed">
+                         <property name="font">
+                          <font>
+                           <pointsize>10</pointsize>
+                          </font>
+                         </property>
+                         <property name="text">
+                          <string>Speed</string>
+                         </property>
+                        </widget>
+                       </item>
+                      </layout>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_wt_top" native="true"/>
+                     </item>
+                    </layout>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QWidget" name="graph_wt_bottom" native="true"/>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_51" stretch="1,8">
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_44">
+                    <item>
+                     <widget class="QCheckBox" name="cb_wt_bt">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>255</red>
+                            <green>0</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                         <colorrole role="Text">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>BT</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_wt_gga">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>0</green>
+                            <blue>255</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>GGA</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_wt_vtg">
+                      <property name="palette">
+                       <palette>
+                        <active>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </active>
+                        <inactive>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>0</red>
+                            <green>170</green>
+                            <blue>0</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </inactive>
+                        <disabled>
+                         <colorrole role="WindowText">
+                          <brush brushstyle="SolidPattern">
+                           <color alpha="255">
+                            <red>120</red>
+                            <green>120</green>
+                            <blue>120</blue>
+                           </color>
+                          </brush>
+                         </colorrole>
+                        </disabled>
+                       </palette>
+                      </property>
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>VTG</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_wt_vectors">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vectors</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </item>
+                  <item>
+                   <widget class="QWidget" name="graph_wt_st" native="true"/>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_wt_filters">
+                  <property name="font">
+                   <font>
+                    <pointsize>10</pointsize>
+                    <weight>75</weight>
+                    <bold>true</bold>
+                   </font>
+                  </property>
+                  <property name="title">
+                   <string>Filters</string>
+                  </property>
+                  <layout class="QVBoxLayout" name="verticalLayout_52" stretch="0,0,0,0,0,0">
+                   <item>
+                    <widget class="QGroupBox" name="gb_wt_excluded">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Excluded Distance</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_56">
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_51" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_wt_excluded">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Below Xducer: </string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_wt_excluded_dist">
+                          <property name="enabled">
+                           <bool>true</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_wt_3beam">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>3 Beam Solutions</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_53">
+                      <item>
+                       <widget class="QComboBox" name="combo_wt_3beam">
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Allow</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>4-Beam Only</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_wt_error_velocity">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Error Velocity</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_54">
+                      <item>
+                       <widget class="QComboBox" name="combo_wt_error_velocity">
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_45" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_wt_error_velocity">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_wt_error_vel_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_wt_vertical_velocity">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>Vertical Velocity</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_55">
+                      <item>
+                       <widget class="QComboBox" name="combo_wt_vert_velocity">
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Manual</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_50" stretch="2,0">
+                        <item>
+                         <widget class="QLabel" name="txt_wt_vert_velocity">
+                          <property name="maximumSize">
+                           <size>
+                            <width>16777215</width>
+                            <height>20</height>
+                           </size>
+                          </property>
+                          <property name="font">
+                           <font>
+                            <pointsize>10</pointsize>
+                            <weight>50</weight>
+                            <bold>false</bold>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Threshold (+/-):</string>
+                          </property>
+                          <property name="alignment">
+                           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLineEdit" name="ed_wt_vert_vel_threshold">
+                          <property name="enabled">
+                           <bool>false</bool>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QGroupBox" name="gb_snr">
+                     <property name="font">
+                      <font>
+                       <pointsize>10</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="title">
+                      <string>SNR</string>
+                     </property>
+                     <layout class="QVBoxLayout" name="verticalLayout_59">
+                      <item>
+                       <widget class="QComboBox" name="combo_wt_snr">
+                        <item>
+                         <property name="text">
+                          <string>Auto</string>
+                         </property>
+                        </item>
+                        <item>
+                         <property name="text">
+                          <string>Off</string>
+                         </property>
+                        </item>
+                       </widget>
+                      </item>
+                     </layout>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="verticalSpacer_6">
+                     <property name="orientation">
+                      <enum>Qt::Vertical</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>20</width>
+                       <height>40</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_wt_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_39">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_wt_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_53">
+               <item>
+                <widget class="QPlainTextEdit" name="display_wt_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_wt_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_52">
+               <item>
+                <widget class="QPlainTextEdit" name="display_wt_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_extrap">
+       <attribute name="title">
+        <string>Extrap</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_34">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_extrap_2">
+          <property name="font">
+           <font>
+            <pointsize>11</pointsize>
+           </font>
+          </property>
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_extrap_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QHBoxLayout" name="horizontalLayout_26" stretch="3,6,2,5">
+            <item>
+             <widget class="QGroupBox" name="gp_points">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Points</string>
+              </property>
+              <layout class="QVBoxLayout" name="verticalLayout_44">
+               <item>
+                <widget class="QTableWidget" name="table_extrap_n_points">
+                 <property name="font">
+                  <font>
+                   <pointsize>10</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <widget class="QGroupBox" name="gb_profile">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Profile</string>
+              </property>
+              <layout class="QVBoxLayout" name="verticalLayout_57" stretch="10,2,1">
+               <item>
+                <widget class="QWidget" name="graph_extrap" native="true"/>
+               </item>
+               <item>
+                <layout class="QHBoxLayout" name="horizontalLayout_56">
+                 <item>
+                  <widget class="QGroupBox" name="gb_depth_cell">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Depth Cell</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_45">
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_data">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Data</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_surface">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Surface Cells</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="gb_transects">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Transects</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_46">
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_trans_medians">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Medians</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_trans_fit">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Fit</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="gb_measurement">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Measurement</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_47">
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_meas_medians">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Medians</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_extrap_meas_fit">
+                      <property name="font">
+                       <font>
+                        <pointsize>11</pointsize>
+                        <weight>50</weight>
+                        <bold>false</bold>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Fit</string>
+                      </property>
+                      <property name="checked">
+                       <bool>true</bool>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                </layout>
+               </item>
+               <item>
+                <layout class="QHBoxLayout" name="horizontalLayout_57">
+                 <item>
+                  <spacer name="horizontalSpacer_16">
+                   <property name="orientation">
+                    <enum>Qt::Horizontal</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>40</width>
+                     <height>20</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                 <item>
+                  <widget class="QLabel" name="txt_start">
+                   <property name="text">
+                    <string>Start Edge: </string>
+                   </property>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QLabel" name="txt_left">
+                   <property name="palette">
+                    <palette>
+                     <active>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>255</red>
+                         <green>0</green>
+                         <blue>255</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </active>
+                     <inactive>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>255</red>
+                         <green>0</green>
+                         <blue>255</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </inactive>
+                     <disabled>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>120</red>
+                         <green>120</green>
+                         <blue>120</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </disabled>
+                    </palette>
+                   </property>
+                   <property name="text">
+                    <string>Left</string>
+                   </property>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QLabel" name="txt_right">
+                   <property name="palette">
+                    <palette>
+                     <active>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>0</red>
+                         <green>0</green>
+                         <blue>255</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </active>
+                     <inactive>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>0</red>
+                         <green>0</green>
+                         <blue>255</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </inactive>
+                     <disabled>
+                      <colorrole role="WindowText">
+                       <brush brushstyle="SolidPattern">
+                        <color alpha="255">
+                         <red>120</red>
+                         <green>120</green>
+                         <blue>120</blue>
+                        </color>
+                       </brush>
+                      </colorrole>
+                     </disabled>
+                    </palette>
+                   </property>
+                   <property name="text">
+                    <string>Right</string>
+                   </property>
+                  </widget>
+                 </item>
+                 <item>
+                  <spacer name="horizontalSpacer_17">
+                   <property name="orientation">
+                    <enum>Qt::Horizontal</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>40</width>
+                     <height>20</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                </layout>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <layout class="QVBoxLayout" name="verticalLayout_64" stretch="3,1">
+              <item>
+               <widget class="QGroupBox" name="gb_fit">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Fit Parameters</string>
+                </property>
+                <layout class="QVBoxLayout" name="verticalLayout_43">
+                 <item>
+                  <widget class="QTableWidget" name="table_extrap_fit">
+                   <property name="font">
+                    <font>
+                     <pointsize>10</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QComboBox" name="combo_extrap_fit">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <item>
+                    <property name="text">
+                     <string>Automatic</string>
+                    </property>
+                   </item>
+                   <item>
+                    <property name="text">
+                     <string>Manual</string>
+                    </property>
+                   </item>
+                  </widget>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_38" stretch="4,4,6">
+                   <item>
+                    <widget class="QLabel" name="txt_top">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string> Top:  </string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QComboBox" name="combo_extrap_top">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <item>
+                      <property name="text">
+                       <string>Power</string>
+                      </property>
+                     </item>
+                     <item>
+                      <property name="text">
+                       <string>Constant</string>
+                      </property>
+                     </item>
+                     <item>
+                      <property name="text">
+                       <string>3-Point</string>
+                      </property>
+                     </item>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_7">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_39" stretch="4,5,6">
+                   <item>
+                    <widget class="QLabel" name="txt_bottom">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Bottom:  </string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QComboBox" name="combo_extrap_bottom">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <item>
+                      <property name="text">
+                       <string>Power</string>
+                      </property>
+                     </item>
+                     <item>
+                      <property name="text">
+                       <string>No Slip</string>
+                      </property>
+                     </item>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_8">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_40" stretch="4,5,6">
+                   <item>
+                    <widget class="QLabel" name="txt_exponent">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Exponent:  </string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_extrap_exponent">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_9">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="gb_data">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Data Used for Extrap Fitting</string>
+                </property>
+                <layout class="QVBoxLayout" name="verticalLayout_63">
+                 <item>
+                  <widget class="QComboBox" name="combo_extrap_data">
+                   <property name="font">
+                    <font>
+                     <pointsize>11</pointsize>
+                     <weight>50</weight>
+                     <bold>false</bold>
+                    </font>
+                   </property>
+                   <item>
+                    <property name="text">
+                     <string>Automatic</string>
+                    </property>
+                   </item>
+                   <item>
+                    <property name="text">
+                     <string>Manual</string>
+                    </property>
+                   </item>
+                  </widget>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_55" stretch="3,3,6">
+                   <item>
+                    <widget class="QLabel" name="label_3">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Type: </string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QComboBox" name="combo_extrap_type">
+                     <property name="enabled">
+                      <bool>false</bool>
+                     </property>
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <item>
+                      <property name="text">
+                       <string>Discharge</string>
+                      </property>
+                     </item>
+                     <item>
+                      <property name="text">
+                       <string>Velocity</string>
+                      </property>
+                     </item>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_15">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_54" stretch="2,1">
+                   <item>
+                    <widget class="QLabel" name="txt_extrap_subsection">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Subsection (% L to R, x:x):</string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_extrap_subsection">
+                     <property name="enabled">
+                      <bool>false</bool>
+                     </property>
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                    </widget>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_41" stretch="5,4,7">
+                   <item>
+                    <widget class="QLabel" name="text_extrap_threshold">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Threshold (%): </string>
+                     </property>
+                     <property name="alignment">
+                      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="ed_extrap_threshold">
+                     <property name="enabled">
+                      <bool>false</bool>
+                     </property>
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_11">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <layout class="QVBoxLayout" name="verticalLayout_33" stretch="2,4">
+              <item>
+               <widget class="QGroupBox" name="gb_previous">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Fit Settings When Tab Opened</string>
+                </property>
+                <layout class="QVBoxLayout" name="verticalLayout_61">
+                 <item>
+                  <layout class="QGridLayout" name="gridLayout_32">
+                   <item row="0" column="0">
+                    <widget class="QLabel" name="txt_p_fit">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Fit Method</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="0" column="1">
+                    <widget class="QLabel" name="txt_extrap_p_fit">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>TextLabel</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="1" column="0">
+                    <widget class="QLabel" name="txt_p_top">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Top:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="1" column="1">
+                    <widget class="QLabel" name="txt_extrap_p_top">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>TextLabel</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="2" column="0">
+                    <widget class="QLabel" name="txt_p_bottom">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Bottom:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="2" column="1">
+                    <widget class="QLabel" name="txt_extrap_p_bottom">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>TextLabel</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="3" column="0">
+                    <widget class="QLabel" name="txt_p_exponent">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>Exponent:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="3" column="1">
+                    <widget class="QLabel" name="txt_extrap_p_exponent">
+                     <property name="font">
+                      <font>
+                       <pointsize>11</pointsize>
+                       <weight>50</weight>
+                       <bold>false</bold>
+                      </font>
+                     </property>
+                     <property name="text">
+                      <string>TextLabel</string>
+                     </property>
+                    </widget>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <widget class="QPushButton" name="pb_extrap_cancel">
+                   <property name="text">
+                    <string>Reset to These Settings</string>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+              <item>
+               <widget class="QGroupBox" name="gb_q">
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="title">
+                 <string>Discharge Sensitivity</string>
+                </property>
+                <layout class="QVBoxLayout" name="verticalLayout_60">
+                 <item>
+                  <widget class="QTableWidget" name="table_extrap_qsen">
+                   <property name="font">
+                    <font>
+                     <pointsize>10</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_extrap_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QVBoxLayout" name="verticalLayout_58">
+            <item>
+             <widget class="QGroupBox" name="box_extrap_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_59">
+               <item>
+                <widget class="QPlainTextEdit" name="display_extrap_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <widget class="QGroupBox" name="box_extrap_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_60">
+               <item>
+                <widget class="QPlainTextEdit" name="display_extrap_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_edges">
+       <attribute name="title">
+        <string>Edges</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_42">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_edges_2">
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_edges_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_41">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_62" stretch="4,7">
+              <item>
+               <widget class="QTableWidget" name="table_edges"/>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_61">
+                <item>
+                 <widget class="QGroupBox" name="gb_left">
+                  <property name="title">
+                   <string>Left</string>
+                  </property>
+                  <layout class="QGridLayout" name="gridLayout_36">
+                   <item row="0" column="0">
+                    <layout class="QHBoxLayout" name="horizontalLayout_34">
+                     <item>
+                      <widget class="QWidget" name="graph_left_contour" native="true"/>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_left_st" native="true"/>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_right">
+                  <property name="title">
+                   <string>Right</string>
+                  </property>
+                  <layout class="QGridLayout" name="gridLayout_40">
+                   <item row="0" column="0">
+                    <layout class="QHBoxLayout" name="horizontalLayout_58">
+                     <item>
+                      <widget class="QWidget" name="graph_right_contour" native="true"/>
+                     </item>
+                     <item>
+                      <widget class="QWidget" name="graph_right_st" native="true"/>
+                     </item>
+                    </layout>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_wt_2_messages_3">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_43">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_extrap_messages_2">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_63">
+               <item>
+                <widget class="QPlainTextEdit" name="display_edges_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_extrap_comments_2">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_62">
+               <item>
+                <widget class="QPlainTextEdit" name="display_edges_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_edi">
+       <attribute name="title">
+        <string>EDI</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_44">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout_65" stretch="3,1,5,1">
+          <item>
+           <widget class="QGroupBox" name="gb_edi_transect">
+            <property name="font">
+             <font>
+              <pointsize>14</pointsize>
+             </font>
+            </property>
+            <property name="title">
+             <string>Select Transect</string>
+            </property>
+            <layout class="QGridLayout" name="gridLayout">
+             <item row="0" column="0">
+              <widget class="QTableWidget" name="tbl_edi_transect">
+               <property name="font">
+                <font>
+                 <pointsize>14</pointsize>
+                </font>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_66" stretch="1,1,1,6,1">
+            <item>
+             <widget class="QLabel" name="txt_edi_offset">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string>Zero Distance Offset (ft):</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLineEdit" name="edi_offset">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="inputMethodHints">
+               <set>Qt::ImhDigitsOnly</set>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="txt_edi_bank">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string> From Right Bank</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_5">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="cb_edi_topoquad">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string>Create TopoQuad File</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <widget class="QTableWidget" name="tbl_edi_results">
+            <property name="font">
+             <font>
+              <pointsize>14</pointsize>
+             </font>
+            </property>
+            <property name="inputMethodHints">
+             <set>Qt::ImhDigitsOnly</set>
+            </property>
+            <property name="rowCount">
+             <number>0</number>
+            </property>
+            <property name="columnCount">
+             <number>0</number>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_67">
+            <item>
+             <widget class="QPushButton" name="pb_edi_add_row">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string>Add Row</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_2">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+            <item>
+             <widget class="QPushButton" name="pb_edi_compute">
+              <property name="font">
+               <font>
+                <pointsize>14</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string>Compute Stations</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_4">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_uncertainty">
+       <attribute name="title">
+        <string>Uncertainty</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_45">
+        <item row="0" column="0">
+         <widget class="QTabWidget" name="tab_uncertainty_2">
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_uncertainty_2_data">
+           <attribute name="title">
+            <string>Data</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_50">
+            <item row="0" column="0">
+             <layout class="QVBoxLayout" name="verticalLayout_66" stretch="5,5">
+              <item>
+               <widget class="QTableWidget" name="table_uncertainty_results"/>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_69" stretch="3,7">
+                <item>
+                 <widget class="QGroupBox" name="qb_contrib_meas_area">
+                  <property name="title">
+                   <string>Contributions to Meas. Q Uncertainty</string>
+                  </property>
+                  <layout class="QHBoxLayout" name="horizontalLayout_71">
+                   <item>
+                    <widget class="QWidget" name="graph_u_meas" native="true"/>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="gb_contrib_measurement">
+                  <property name="title">
+                   <string>Contributions to Measurement Uncertainty</string>
+                  </property>
+                  <layout class="QHBoxLayout" name="horizontalLayout_70">
+                   <item>
+                    <widget class="QWidget" name="graph_u_measurement" native="true"/>
+                   </item>
+                  </layout>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_uncertainty_2_advanced">
+           <attribute name="title">
+            <string>Advanced Settings</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_47">
+            <item row="0" column="0">
+             <widget class="QTableWidget" name="table_uncertainty_settings"/>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_uncertainty_2_messages">
+           <attribute name="title">
+            <string>Messages</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_48">
+            <item row="0" column="0">
+             <widget class="QGroupBox" name="box_uncertainty_messages">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Quality Check Messages</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_65">
+               <item>
+                <widget class="QPlainTextEdit" name="display_uncertainty_messages">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QGroupBox" name="box_uncertainty_comments">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Comments</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_68">
+               <item>
+                <widget class="QPlainTextEdit" name="display_uncertainty_comments">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>50</weight>
+                   <bold>false</bold>
+                  </font>
+                 </property>
+                 <property name="readOnly">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_adv_graph">
+       <attribute name="title">
+        <string>Adv. Graph</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_51">
+        <item row="0" column="0">
+         <layout class="QHBoxLayout" name="adv_graph_layout" stretch="7,3">
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_86" stretch="1,20">
+            <item>
+             <layout class="QHBoxLayout" name="horizontalLayout_86">
+              <item>
+               <widget class="QComboBox" name="combo_adv_graph_transect">
+                <property name="font">
+                 <font>
+                  <pointsize>10</pointsize>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QPushButton" name="pb_adv_graph_controls">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="font">
+                 <font>
+                  <pointsize>12</pointsize>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Hide Plot Controls</string>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <widget class="QWidget" name="graph_adv_graph" native="true"/>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_99">
+            <item>
+             <widget class="QGroupBox" name="gb_adv_graph_controls">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="title">
+               <string>Plot Controls</string>
+              </property>
+              <layout class="QGridLayout" name="gridLayout_55" rowstretch="0,0,0,0">
+               <item row="0" column="1">
+                <layout class="QVBoxLayout" name="verticalLayout_98">
+                 <item>
+                  <widget class="QGroupBox" name="groupBox_2">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Bottom Track</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_94">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_boat_speed">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Boat Speed (BT)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_3beam">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>3 Beam Solutions</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_error">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Error Velocity</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_vertical">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vertical Velocity</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_source">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Source</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_correlation">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Correlation</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_bt_rssi">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>RSSI</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="groupBox_3">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>GPS</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_92">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_boat_speed">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Boat Speed (GGA)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_vtg_boat_speed">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Boat Speed (VTG)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_quality">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Quality</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_hdop">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>HDOP</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_altitude">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Altitude</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_satellites">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>No. Satellites</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_gga_source">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Source (GGA)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_vtg_source">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Source (VTG)</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <spacer name="verticalSpacer_8">
+                   <property name="orientation">
+                    <enum>Qt::Vertical</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>20</width>
+                     <height>40</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                </layout>
+               </item>
+               <item row="3" column="0" colspan="3">
+                <widget class="QPushButton" name="pb_adv_graph_create_plots">
+                 <property name="font">
+                  <font>
+                   <pointsize>11</pointsize>
+                   <weight>75</weight>
+                   <bold>true</bold>
+                  </font>
+                 </property>
+                 <property name="text">
+                  <string>Create Plot</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="2">
+                <layout class="QVBoxLayout" name="verticalLayout_97">
+                 <item>
+                  <widget class="QGroupBox" name="groupBox_6">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Discharge</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_93">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_discharge">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Discharge Time Series</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_discharge_percent">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Discharge % of Total</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="groupBox_5">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Compass/P/R</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_90">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_adcp_heading">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Heading (ADCP)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_ext_heading">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Heading (External)</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_mag_error">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Magnetic Error</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_pitch">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Pitch</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_roll">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Roll</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QGroupBox" name="groupBox_4">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Depth</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_91">
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_beam_depths">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Beam Depths</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_final_depths">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Final Depths</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_depth_source">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Depth Source</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <spacer name="verticalSpacer_5">
+                   <property name="orientation">
+                    <enum>Qt::Vertical</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>20</width>
+                     <height>40</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                </layout>
+               </item>
+               <item row="2" column="0" colspan="3">
+                <widget class="QGroupBox" name="gb_x_axis_3">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>75</weight>
+                   <bold>true</bold>
+                  </font>
+                 </property>
+                 <property name="title">
+                  <string>Select X-Axis</string>
+                 </property>
+                 <layout class="QVBoxLayout" name="verticalLayout_89">
+                  <item>
+                   <widget class="QRadioButton" name="rb_adv_graph_ensemble">
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Ensemble</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QRadioButton" name="rb_adv_graph_time">
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Time</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QRadioButton" name="rb_adv_graph_length">
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Length</string>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </widget>
+               </item>
+               <item row="0" column="0">
+                <layout class="QVBoxLayout" name="verticalLayout_96" stretch="15,1">
+                 <item>
+                  <widget class="QGroupBox" name="gb_plot_type_3">
+                   <property name="font">
+                    <font>
+                     <pointsize>12</pointsize>
+                     <weight>75</weight>
+                     <bold>true</bold>
+                    </font>
+                   </property>
+                   <property name="title">
+                    <string>Water Track</string>
+                   </property>
+                   <layout class="QVBoxLayout" name="verticalLayout_87">
+                    <item>
+                     <widget class="QLabel" name="label_8">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                        <weight>75</weight>
+                        <bold>true</bold>
+                        <underline>true</underline>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Contour Plots</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_speed_filtered">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Speed - Filtered</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_speed_final">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Speed - Final</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_projected">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Speed Projected</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_vertical">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Vertical Velocity</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_error">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Error Velocity</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_direction">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Direction</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_avg_corr">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Average Correlation</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_corr_beam">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Correlation by Beam</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_avg_rssi">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Average RSSI or SNR</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_rssi_beam">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>RSSI or SNR by Beam</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QLabel" name="label_9">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                        <weight>75</weight>
+                        <bold>true</bold>
+                        <underline>true</underline>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Time Series</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_avg_speed">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Average Speed</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="cb_adv_graph_projected_speed_ts">
+                      <property name="font">
+                       <font>
+                        <pointsize>10</pointsize>
+                       </font>
+                      </property>
+                      <property name="text">
+                       <string>Projected Speed</string>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                 </item>
+                 <item>
+                  <spacer name="verticalSpacer_9">
+                   <property name="orientation">
+                    <enum>Qt::Vertical</enum>
+                   </property>
+                   <property name="sizeHint" stdset="0">
+                    <size>
+                     <width>20</width>
+                     <height>40</height>
+                    </size>
+                   </property>
+                  </spacer>
+                 </item>
+                </layout>
+               </item>
+               <item row="1" column="0">
+                <widget class="QGroupBox" name="groupBox">
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>75</weight>
+                   <bold>true</bold>
+                  </font>
+                 </property>
+                 <property name="title">
+                  <string>Projection Angle</string>
+                 </property>
+                 <layout class="QHBoxLayout" name="horizontalLayout_88">
+                  <item>
+                   <widget class="QLineEdit" name="ed_adv_graph_flow_dir">
+                    <property name="maximumSize">
+                     <size>
+                      <width>100</width>
+                      <height>16777215</height>
+                     </size>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QPushButton" name="pb_adv_graph_auto_flow_direction">
+                    <property name="sizePolicy">
+                     <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                      <horstretch>0</horstretch>
+                      <verstretch>0</verstretch>
+                     </sizepolicy>
+                    </property>
+                    <property name="maximumSize">
+                     <size>
+                      <width>50</width>
+                      <height>16777215</height>
+                     </size>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>10</pointsize>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Auto</string>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </item>
+            <item>
+             <spacer name="verticalSpacer_10">
+              <property name="orientation">
+               <enum>Qt::Vertical</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>20</width>
+                <height>130</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+  <widget class="QToolBar" name="toolBar">
+   <property name="sizePolicy">
+    <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+   </property>
+   <property name="windowTitle">
+    <string>toolBar</string>
+   </property>
+   <property name="layoutDirection">
+    <enum>Qt::LeftToRight</enum>
+   </property>
+   <property name="styleSheet">
+    <string notr="true"/>
+   </property>
+   <property name="movable">
+    <bool>false</bool>
+   </property>
+   <property name="allowedAreas">
+    <set>Qt::AllToolBarAreas</set>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Horizontal</enum>
+   </property>
+   <property name="iconSize">
+    <size>
+     <width>70</width>
+     <height>40</height>
+    </size>
+   </property>
+   <property name="floatable">
+    <bool>false</bool>
+   </property>
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+   <addaction name="actionOpen"/>
+   <addaction name="separator"/>
+   <addaction name="actionSave"/>
+   <addaction name="separator"/>
+   <addaction name="actionOptions"/>
+   <addaction name="separator"/>
+   <addaction name="actionComment"/>
+   <addaction name="separator"/>
+   <addaction name="actionCheck"/>
+   <addaction name="separator"/>
+   <addaction name="actionNav_Reference"/>
+   <addaction name="actionBT"/>
+   <addaction name="actionGGA"/>
+   <addaction name="actionVTG"/>
+   <addaction name="separator"/>
+   <addaction name="actionComp_Tracks"/>
+   <addaction name="actionON"/>
+   <addaction name="actionOFF"/>
+   <addaction name="separator"/>
+   <addaction name="actionHome"/>
+   <addaction name="actionZoom"/>
+   <addaction name="actionPan"/>
+   <addaction name="actionData_Cursor"/>
+   <addaction name="separator"/>
+   <addaction name="actionGoogle_Earth"/>
+   <addaction name="separator"/>
+   <addaction name="actionHelp"/>
+   <addaction name="separator"/>
+  </widget>
+  <action name="actionOpen">
+   <property name="icon">
+    <iconset>
+     <normalon>:/images/images/52.png</normalon>
+    </iconset>
+   </property>
+   <property name="text">
+    <string>Open</string>
+   </property>
+   <property name="toolTip">
+    <string>Opens measurement data file(s)</string>
+   </property>
+  </action>
+  <action name="actionOptions">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Application.png</normaloff>
+     <normalon>:/images/24x24/Application.png</normalon>:/images/24x24/Application.png</iconset>
+   </property>
+   <property name="text">
+    <string>options</string>
+   </property>
+   <property name="toolTip">
+    <string>Optional Settings</string>
+   </property>
+  </action>
+  <action name="actionSave">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/images/22.png</normaloff>:/images/images/22.png</iconset>
+   </property>
+   <property name="text">
+    <string>Save</string>
+   </property>
+  </action>
+  <action name="actionComment">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Notes.png</normaloff>
+     <normalon>:/images/24x24/Notes.png</normalon>:/images/24x24/Notes.png</iconset>
+   </property>
+   <property name="text">
+    <string>Comment</string>
+   </property>
+  </action>
+  <action name="actionHelp">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Help book 3d.png</normaloff>:/images/24x24/Help book 3d.png</iconset>
+   </property>
+   <property name="text">
+    <string>Help</string>
+   </property>
+  </action>
+  <action name="actionCheck">
+   <property name="icon">
+    <iconset>
+     <normaloff>:/images/24x24/check-mark-green.png</normaloff>:/images/24x24/check-mark-green.png</iconset>
+   </property>
+   <property name="text">
+    <string>Check/Uncheck</string>
+   </property>
+  </action>
+  <action name="actionBT">
+   <property name="checkable">
+    <bool>false</bool>
+   </property>
+   <property name="checked">
+    <bool>false</bool>
+   </property>
+   <property name="text">
+    <string>BT</string>
+   </property>
+   <property name="toolTip">
+    <string>BT</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+     <weight>75</weight>
+     <bold>true</bold>
+    </font>
+   </property>
+  </action>
+  <action name="actionGGA">
+   <property name="text">
+    <string>GGA</string>
+   </property>
+   <property name="toolTip">
+    <string>GGA</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+  </action>
+  <action name="actionVTG">
+   <property name="text">
+    <string>VTG</string>
+   </property>
+   <property name="toolTip">
+    <string>VTG</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+  </action>
+  <action name="actionNav_Reference">
+   <property name="text">
+    <string>Nav Reference:</string>
+   </property>
+   <property name="toolTip">
+    <string>Nav Reference:</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+  </action>
+  <action name="actionComp_Tracks">
+   <property name="text">
+    <string>Comp Tracks:</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+  </action>
+  <action name="actionON">
+   <property name="text">
+    <string>ON</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+    </font>
+   </property>
+  </action>
+  <action name="actionOFF">
+   <property name="checkable">
+    <bool>false</bool>
+   </property>
+   <property name="text">
+    <string>OFF</string>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>11</pointsize>
+     <weight>75</weight>
+     <bold>true</bold>
+    </font>
+   </property>
+  </action>
+  <action name="actionHome">
+   <property name="checkable">
+    <bool>false</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Home.png</normaloff>:/images/24x24/Home.png</iconset>
+   </property>
+   <property name="text">
+    <string>Home</string>
+   </property>
+   <property name="toolTip">
+    <string>Reset zoom / pan</string>
+   </property>
+  </action>
+  <action name="actionZoom">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/images/83.png</normaloff>:/images/images/83.png</iconset>
+   </property>
+   <property name="text">
+    <string>Zoom</string>
+   </property>
+   <property name="toolTip">
+    <string>Zoom rectangle</string>
+   </property>
+  </action>
+  <action name="actionPan">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Move.png</normaloff>:/images/24x24/Move.png</iconset>
+   </property>
+   <property name="text">
+    <string>Pan</string>
+   </property>
+   <property name="toolTip">
+    <string>Pan</string>
+   </property>
+  </action>
+  <action name="actionData_Cursor">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Info.png</normaloff>:/images/24x24/Info.png</iconset>
+   </property>
+   <property name="text">
+    <string>Data Cursor</string>
+   </property>
+   <property name="toolTip">
+    <string>Data Cursor</string>
+   </property>
+  </action>
+  <action name="actionGoogle_Earth">
+   <property name="icon">
+    <iconset resource="dsm.qrc">
+     <normaloff>:/images/24x24/Globe.png</normaloff>:/images/24x24/Globe.png</iconset>
+   </property>
+   <property name="text">
+    <string>Google Earth</string>
+   </property>
+   <property name="toolTip">
+    <string>Plot to Google Earth</string>
+   </property>
+  </action>
+ </widget>
+ <resources>
+  <include location="dsm.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/UI/QRev_qrc_2_py.bat b/UI/QRev_qrc_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..61fb5aa39caa8196d1026c2abe6655a481646a5b
--- /dev/null
+++ b/UI/QRev_qrc_2_py.bat
@@ -0,0 +1 @@
+pyrcc5 dsm.qrc -o dsm_rc.py
\ No newline at end of file
diff --git a/UI/RIVRS_Controller.py b/UI/RIVRS_Controller.py
new file mode 100644
index 0000000000000000000000000000000000000000..14f9d20f86483bc4010671808efd2e366282f114
--- /dev/null
+++ b/UI/RIVRS_Controller.py
@@ -0,0 +1,69 @@
+import sys
+from PyQt5 import QtWidgets
+from UI.RIVRS_Demo import RIVRS_Demo
+from UI.QRev import QRev
+
+
+class RIVRS_Controller:
+    """This class serves as the central controller to allow two QMainWindows:
+    RIVRS and QRev to work together. When the controller is run RIVRS, represented
+    here as RIVRS_Demo, is opened first to allow the user to perform work in RIVRS.
+    RIVRS will have the capability to load a measurement file and run the automatic
+    processing of the transects using the Measurement class from QRev. Once the
+    user has group the transects into the desired groups the user can click a button
+    which will call the Show_QRev function in this class which will open QRev.
+    Once all the processing is complete QRev will populate the processed_meas
+    attribute and call Show_RIVRS to return control back to RIVRS and close QRev.
+
+    Attributes
+    ----------
+    processed_meas: list
+        List of dictionaries for each group containing 'group', 'start_serial_time',
+        'end_serial_time', and 'processed_discharge'
+    RIVRS_Window: RIVRS
+        Instance of the RIVRS QMainWindow
+    QRev_Window: QRev
+        Instance of the QRev QMainWindow
+    """
+
+    def __init__(self):
+        # Initialize attributes
+        self.processed_meas = None
+        self.processed_transects = None
+        RIVRS_Window = None
+        QRev_Window = None
+
+    def Show_RIVRS(self):
+        """Controls the display of the RIVRS GUI."""
+
+        if self.processed_meas is None:
+            # If processed_meas is None then the RIVRS GUI is opened as if it were run
+            # independent of the controller
+            self.RIVRS_Window = RIVRS_Demo(caller=self)
+            self.RIVRS_Window.show()
+
+        else:
+            # If processed_meas contains data this means that QRev has be run and
+            # a function in RIVRS, demoed here with processed_data_table can be called
+            # and the processed_meas data passed to RIVRS
+            self.RIVRS_Window.processed_data_table(data=self.processed_meas)
+            self.RIVRS_Window.processed_transect_table(data=self.processed_transects)
+            self.RIVRS_Window.show()
+            # The QRev GUI is closed automatically
+            self.QRev_Window.close()
+
+    def Show_QRev(self):
+        """Controls the display of the QRev GUI."""
+        self.QRev_Window = QRev(
+            groupings=self.RIVRS_Window.groupings,
+            data=self.RIVRS_Window.meas,
+            caller=self,
+        )
+        self.QRev_Window.show()
+
+
+if __name__ == "__main__":
+    app = QtWidgets.QApplication(sys.argv)
+    Controller = RIVRS_Controller()
+    Controller.Show_RIVRS()
+    sys.exit(app.exec_())
diff --git a/UI/RIVRS_Demo.py b/UI/RIVRS_Demo.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa072519bb9169e22748edef83ef2e68b4f3772b
--- /dev/null
+++ b/UI/RIVRS_Demo.py
@@ -0,0 +1,416 @@
+from PyQt5 import QtWidgets, QtCore
+import UI.wRIVRS_Demo as wRIVRS_Demo
+import sys
+from Classes.Measurement import Measurement
+from UI.selectFile import OpenMeasurementDialog
+from datetime import datetime
+
+
+class RIVRS_Demo(QtWidgets.QMainWindow, wRIVRS_Demo.Ui_RIVRS_Demo):
+    """This is a class used as a substitute of the real RIVRS QMainWindow class to
+    demonstrate how to integrate RIVRS and QRev through the use of a controller
+    class (RIVRS_Controller).
+    """
+
+    def __init__(self, parent=None, caller=None):
+        """Initializes settings and connections.
+
+        Parameters
+        ----------
+        caller: Object
+            Identifies calling object.
+        """
+        super(RIVRS_Demo, self).__init__(parent)
+        self.setupUi(self)
+
+        # File used to store settings like the last folder opened
+        self.settingsFile = "QRev_Settings"
+
+        # Create connections for buttons
+        self.pb_load.clicked.connect(self.load_files)
+        if caller is not None:
+            # If the caller is identified then the grouping is complete and
+            # the button to open QRev is connected to the caller's(RIVRS_Controller)
+            # Show_QRev function
+            self.pb_qrev.clicked.connect(caller.Show_QRev)
+
+    def load_files(self):
+        """Opens a file open dialog to allow the user to select the measurement file(s)
+        for processing. The measurement is processed using the automatic settings
+        in QRev."""
+
+        # Disable QRev button until the groupings list is created
+        self.pb_qrev.setEnabled(False)
+
+        # Open file selection dialog
+        select = OpenMeasurementDialog(self)
+        select.exec_()
+
+        # Process selected measurement based on manufacturer
+        if select.type == "SonTek":
+            # Create measurement object
+            self.meas = Measurement(
+                in_file=select.fullName, source="SonTek", proc_type="QRev"
+            )
+
+        elif select.type == "TRDI":
+            # Create measurement object
+            self.meas = Measurement(
+                in_file=select.fullName[0],
+                source="TRDI",
+                proc_type="QRev",
+                checked=select.checked,
+            )
+
+        elif select.type == "QRev":
+            # NOTE: Loading QRev files is currently not supported in QRev
+            self.meas = Measurement(in_file=select.fullName[0], source="QRev")
+
+        # groupings would be determined by the user using the RIVRS interface.
+        # These are provided as a demo test.
+        self.groupings = [[0, 1], [2, 3], [4, 5]]
+
+        # This is to show the processed transects are available to RIVRS.
+        # Demo purposes only.
+        self.raw_data_table()
+
+        # Enable QRev button
+        self.pb_qrev.setEnabled(True)
+
+    def raw_data_table(self):
+        """Creates a table to demonstrate the results of the initial processing
+        of the measurement transects prior to grouping.
+        """
+
+        # Setup table
+        tbl = self.table_original
+        summary_header = [
+            self.tr("Transect"),
+            self.tr("Start"),
+            self.tr("Bank"),
+            self.tr("End"),
+            self.tr("Duration"),
+            self.tr("Total Q"),
+            self.tr("Top Q"),
+            self.tr("Meas Q"),
+            self.tr("Bottom Q"),
+            self.tr("Left Q"),
+            self.tr("Right Q"),
+        ]
+        ncols = len(summary_header)
+        nrows = len(self.meas.transects)
+        tbl.setRowCount(nrows + 1)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(summary_header)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        # Add transect data
+        for row in range(nrows):
+            col = 0
+            transect_id = row
+
+            # File/transect name
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    self.meas.transects[transect_id].file_name[:-4]
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect start time
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    datetime.strftime(
+                        datetime.utcfromtimestamp(
+                            self.meas.transects[transect_id].date_time.start_serial_time
+                        ),
+                        "%H:%M:%S",
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect start edge
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    self.meas.transects[transect_id].start_edge[0]
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect end time
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    datetime.strftime(
+                        datetime.utcfromtimestamp(
+                            self.meas.transects[transect_id].date_time.end_serial_time
+                        ),
+                        "%H:%M:%S",
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect duration
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.1f}".format(
+                        self.meas.transects[transect_id].date_time.transect_duration_sec
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect total discharge
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.2f}".format(self.meas.discharge[transect_id].total)
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect top discharge
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7.2f}".format(self.meas.discharge[transect_id].top)
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect middle discharge
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7.2f}".format(self.meas.discharge[transect_id].middle)
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect bottom discharge
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7.2f}".format(self.meas.discharge[transect_id].bottom)
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect left discharge
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7.2f}".format(self.meas.discharge[transect_id].left)
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect right discharge
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7.2f}".format(self.meas.discharge[transect_id].right)
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+    def processed_transect_table(self, data):
+        """Creates a table to demonstrate the results of the initial processing of
+        the measurement transects prior to grouping.
+        """
+
+        # Setup table
+        tbl = self.table_original
+
+        # Add transect data
+        for row, transect in enumerate(data):
+            col = 0
+            # File/transect name
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(transect["transect_file"]))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect start time
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    datetime.strftime(
+                        datetime.utcfromtimestamp(transect["start_serial_time"]),
+                        "%H:%M:%S",
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect start edge
+            col += 1
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect end time
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    datetime.strftime(
+                        datetime.utcfromtimestamp(transect["end_serial_time"]),
+                        "%H:%M:%S",
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect duration
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem("{:5.1f}".format(transect["duration"])),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect total discharge
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.2f}".format(transect["processed_discharge"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect top discharge
+            col += 1
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect middle discharge
+            col += 1
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect bottom discharge
+            col += 1
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect left discharge
+            col += 1
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect right discharge
+            col += 1
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(""))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
+
+    def processed_data_table(self, data):
+        """Creates a table to demonstrate the grouped and processed data passed back to QRev"""
+
+        # Setup table
+        tbl = self.table_processed
+        summary_header = [
+            self.tr("Transect Idx"),
+            self.tr("Start"),
+            self.tr("End"),
+            self.tr("Total Q"),
+        ]
+        ncols = len(summary_header)
+        nrows = len(data)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(summary_header)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        # Add transect data
+        for row in range(nrows):
+            col = 0
+
+            # File/transect idx
+            item = ", ".join(str(e) for e in data[row]["group"])
+            tbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect start time
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    datetime.strftime(
+                        datetime.utcfromtimestamp(data[row]["start_serial_time"]),
+                        "%H:%M:%S",
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect end time
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    datetime.strftime(
+                        datetime.utcfromtimestamp(data[row]["end_serial_time"]),
+                        "%H:%M:%S",
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            # Transect total discharge
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.2f}".format(data[row]["processed_discharge"])
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+
+if __name__ == "__main__":
+    app = QtWidgets.QApplication(sys.argv)
+    window = RIVRS_Demo()
+    window.show()
+    app.exec_()
diff --git a/UI/Rating.py b/UI/Rating.py
new file mode 100644
index 0000000000000000000000000000000000000000..eac468581fe6b1e88ebd47614e1b44c0f85f9eda
--- /dev/null
+++ b/UI/Rating.py
@@ -0,0 +1,16 @@
+from PyQt5 import QtWidgets
+from UI import wRating
+
+
+class Rating(QtWidgets.QDialog, wRating.Ui_rating):
+    """Dialog to allow users to set a user rating.
+
+    Parameters
+    ----------
+    wDraft.Ui_draft : QDialog
+        Dialog window to allow users to change draft
+    """
+
+    def __init__(self, parent=None):
+        super(Rating, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/SOSSource.py b/UI/SOSSource.py
new file mode 100644
index 0000000000000000000000000000000000000000..abe1744bc2efaad9cd50867e1f716ce66ca9ab59
--- /dev/null
+++ b/UI/SOSSource.py
@@ -0,0 +1,48 @@
+from PyQt5 import QtWidgets, QtCore
+from UI import wSOSSource
+
+
+class SOSSource(QtWidgets.QDialog, wSOSSource.Ui_sos_source):
+    """Dialog to allow users to change speed of sound source.
+
+    Parameters
+    ----------
+    wSOSSource.Ui_sos_source : QDialog
+        Dialog window to allow users to change speed of sound
+    """
+
+    def __init__(self, units, setting="internal", sos=None, parent=None):
+        """Initialize speed of sound dialog.
+
+        Parameters
+        ----------
+        setting: str
+            Speed of sound source setting
+        sos: float
+            Speed of sound in m/s
+        """
+        super(SOSSource, self).__init__(parent)
+        self.setupUi(self)
+        self.rb_user.setText("User " + units["label_V"])
+        if setting == "internal":
+            self.ed_sos_user.setEnabled(False)
+            self.rb_internal.setChecked(True)
+        else:
+            self.rb_user.setChecked(True)
+            self.ed_sos_user.setText("{:6.1f}".format(sos * units["V"]))
+        self.rb_user.toggled.connect(self.user)
+        self.rb_internal.toggled.connect(self.internal)
+
+    @QtCore.pyqtSlot()
+    def user(self):
+        """Enables edit box for speed of sound if User is selected."""
+
+        if self.rb_user.isChecked():
+            self.ed_sos_user.setEnabled(True)
+
+    @QtCore.pyqtSlot()
+    def internal(self):
+        """Disables edit box for speed of sound if Internal is selected."""
+
+        if self.rb_internal.isChecked():
+            self.ed_sos_user.setEnabled(False)
diff --git a/UI/Salinity.py b/UI/Salinity.py
new file mode 100644
index 0000000000000000000000000000000000000000..8c2a7960c5813a77cd4418bd992692c275e88b68
--- /dev/null
+++ b/UI/Salinity.py
@@ -0,0 +1,21 @@
+from PyQt5 import QtWidgets, QtGui, QtCore
+from UI import wSalinity
+
+
+class Salinity(QtWidgets.QDialog, wSalinity.Ui_salinity):
+    """Dialog to allow users to change salinity.
+
+    Parameters
+    ----------
+    wSalinity.Ui_salinity : QDialog
+        Dialog window to allow users to change salinity
+    """
+
+    def __init__(self, parent=None):
+        super(Salinity, self).__init__(parent)
+        self.setupUi(self)
+
+        # set qlineedit to numbers only, 2 decimals, and 0 to 69.99 ppt
+        rx = QtCore.QRegExp("^([0-9]|[1-6][0-9])(\.\d{1,2})$")
+        validator = QtGui.QRegExpValidator(rx, self)
+        self.ed_salinity.setValidator(validator)
diff --git a/UI/ShipTrack.py b/UI/ShipTrack.py
new file mode 100644
index 0000000000000000000000000000000000000000..87a27042b1f141a11cd8a65573b86dd46655cce3
--- /dev/null
+++ b/UI/ShipTrack.py
@@ -0,0 +1,874 @@
+import warnings
+import numpy as np
+from PyQt5 import QtCore
+
+
+class Shiptrack(object):
+    """Class to generate shiptrack plot. If checkboxes for the boat reference
+    (BT, GGA, VTG) are available they can be used to control what
+    references are plotted.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    cb: bool
+        Boolean to determine if checkboxes to control the boat speed
+         reference are to be used
+    cb_bt: QCheckBox
+        Name of QCheckBox for bottom track
+    cb_gga: QCheckBox
+        Name of QCheckBox for GGA
+    cb_vtg: QCheckBox
+        Name of QCheckBox for VTG
+    cb_vectors: QCheckBox
+        Name of QCheckBox for vectors
+    bt: list
+        Plot reference for bottom track
+    gga: list
+        Plot reference for GGA
+    vtg: list
+        Plot reference for VTG
+    vectors: list
+        Plot reference for vectors
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.cb = None
+        self.cb_bt = None
+        self.cb_gga = None
+        self.cb_vtg = None
+        self.cb_vectors = None
+        self.bt = None
+        self.gga = None
+        self.vtg = None
+        self.vectors = None
+        self.vector_ref = None
+        self.hover_connection = None
+        self.annot = None
+
+    def create(
+        self,
+        transect,
+        units,
+        cb=False,
+        cb_bt=None,
+        cb_gga=None,
+        cb_vtg=None,
+        cb_vectors=None,
+        n_ensembles=None,
+        edge_start=None,
+    ):
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData containing boat speeds to be plotted
+        units: dict
+            Dictionary of units conversions
+        cb: bool
+            Boolean to determine if checkboxes to control the boat speed
+            reference are to be used
+        cb_bt: QCheckBox
+            Name of QCheckBox for bottom track
+        cb_gga: QCheckBox
+            Name of QCheckBox for GGA
+        cb_vtg: QCheckBox
+            Name of QCheckBox for VTG
+        cb_vectors: QCheckBox
+            Name of QCheckBox for vectors
+        n_ensembles: int
+            Number of ensembles to plot. Used in edges tab.
+        edge_start: int
+            Ensemble to start plotting. Used in edges tab.
+        """
+
+        # Assign and save parameters
+        self.units = units
+        self.cb = cb
+        self.cb_bt = cb_bt
+        self.cb_gga = cb_gga
+        self.cb_vtg = cb_vtg
+        self.cb_vectors = cb_vectors
+
+        # Check the checkbox to determine what should be shown in the plot
+        control = self.checkbox_control(transect)
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.18, bottom=0.18, right=0.98, top=0.98, wspace=0.1, hspace=0
+        )
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+
+        # Initialize max/min trackers
+        max_x_bt = np.nan
+        max_y_bt = np.nan
+        min_x_bt = np.nan
+        min_y_bt = np.nan
+        max_x_vtg = np.nan
+        max_y_vtg = np.nan
+        min_x_vtg = np.nan
+        min_y_vtg = np.nan
+        max_x_gga = np.nan
+        max_y_gga = np.nan
+        min_x_gga = np.nan
+        min_y_gga = np.nan
+
+        # Plot shiptrack based on bottom track
+        invalid_bt = np.logical_not(transect.boat_vel.bt_vel.valid_data)
+        invalid_bt = invalid_bt[:, transect.in_transect_idx]
+        ship_data_bt = transect.boat_vel.compute_boat_track(transect, ref="bt_vel")
+        if edge_start is not None and n_ensembles is not None:
+            ship_data_bt["track_x_m"] = self.subsection(
+                ship_data_bt["track_x_m"], n_ensembles, edge_start
+            )
+            ship_data_bt["track_y_m"] = self.subsection(
+                ship_data_bt["track_y_m"], n_ensembles, edge_start
+            )
+            invalid_bt = self.subsection_2d(invalid_bt, n_ensembles, edge_start)
+        else:
+            # Edge start set to one to plot black box at start of transect
+            edge_start = 1
+
+        self.bt = self.fig.ax.plot(
+            ship_data_bt["track_x_m"] * units["L"],
+            ship_data_bt["track_y_m"] * units["L"],
+            color="r",
+            label="BT",
+        )
+
+        if (
+            not np.alltrue(np.isnan(ship_data_bt["track_x_m"]))
+            and len(ship_data_bt["track_x_m"]) > 0
+        ):
+            if edge_start:
+                self.bt.append(
+                    self.fig.ax.plot(
+                        ship_data_bt["track_x_m"][0] * units["L"],
+                        ship_data_bt["track_y_m"][0] * units["L"],
+                        "sk",
+                    )[0]
+                )
+            else:
+                self.bt.append(
+                    self.fig.ax.plot(
+                        ship_data_bt["track_x_m"][-1] * units["L"],
+                        ship_data_bt["track_y_m"][-1] * units["L"],
+                        "sk",
+                    )[0]
+                )
+
+        # Plot invalid data points using a symbol to represent what caused the
+        # data to be invalid
+
+        if (
+            invalid_bt is not None
+            and not np.alltrue(np.isnan(ship_data_bt["track_x_m"]))
+            and len(ship_data_bt["track_x_m"]) > 0
+        ):
+            self.bt.append(
+                self.fig.ax.plot(
+                    ship_data_bt["track_x_m"][invalid_bt[1]] * units["L"],
+                    ship_data_bt["track_y_m"][invalid_bt[1]] * units["L"],
+                    "k",
+                    linestyle="",
+                    marker="$O$",
+                )[0]
+            )
+            self.bt.append(
+                self.fig.ax.plot(
+                    ship_data_bt["track_x_m"][invalid_bt[2]] * units["L"],
+                    ship_data_bt["track_y_m"][invalid_bt[2]] * units["L"],
+                    "k",
+                    linestyle="",
+                    marker="$E$",
+                )[0]
+            )
+            self.bt.append(
+                self.fig.ax.plot(
+                    ship_data_bt["track_x_m"][invalid_bt[3]] * units["L"],
+                    ship_data_bt["track_y_m"][invalid_bt[3]] * units["L"],
+                    "k",
+                    linestyle="",
+                    marker="$V$",
+                )[0]
+            )
+            self.bt.append(
+                self.fig.ax.plot(
+                    ship_data_bt["track_x_m"][invalid_bt[4]] * units["L"],
+                    ship_data_bt["track_y_m"][invalid_bt[4]] * units["L"],
+                    "k",
+                    linestyle="",
+                    marker="$S$",
+                )[0]
+            )
+            self.bt.append(
+                self.fig.ax.plot(
+                    ship_data_bt["track_x_m"][invalid_bt[5]] * units["L"],
+                    ship_data_bt["track_y_m"][invalid_bt[5]] * units["L"],
+                    "k",
+                    linestyle="",
+                    marker="$B$",
+                )[0]
+            )
+
+        ship_data = ship_data_bt
+
+        if not np.alltrue(np.isnan(ship_data_bt["track_x_m"])):
+            max_x_bt = np.nanmax(ship_data_bt["track_x_m"])
+            max_y_bt = np.nanmax(ship_data_bt["track_y_m"])
+            min_x_bt = np.nanmin(ship_data_bt["track_x_m"])
+            min_y_bt = np.nanmin(ship_data_bt["track_y_m"])
+
+        # Based on checkbox control make bt visible or not
+        if control["bt"]:
+            for item in self.bt:
+                item.set_visible(True)
+        else:
+            for item in self.bt:
+                item.set_visible(False)
+
+        # Plot shiptrack based on vtg, if available
+        if transect.boat_vel.vtg_vel is not None:
+            ship_data_vtg = transect.boat_vel.compute_boat_track(
+                transect, ref="vtg_vel"
+            )
+            invalid_gps = np.logical_not(transect.boat_vel.vtg_vel.valid_data)
+            invalid_gps = invalid_gps[:, transect.in_transect_idx]
+            if not np.alltrue(np.isnan(ship_data_vtg["track_x_m"])):
+                if edge_start is not None and n_ensembles is not None:
+                    ship_data_vtg["track_x_m"] = self.subsection(
+                        ship_data_vtg["track_x_m"], n_ensembles, edge_start
+                    )
+                    ship_data_vtg["track_y_m"] = self.subsection(
+                        ship_data_vtg["track_y_m"], n_ensembles, edge_start
+                    )
+                    invalid_gps = self.subsection_2d(
+                        invalid_gps, n_ensembles, edge_start
+                    )
+                self.vtg = self.fig.ax.plot(
+                    ship_data_vtg["track_x_m"] * units["L"],
+                    ship_data_vtg["track_y_m"] * units["L"],
+                    color="g",
+                    label="VTG",
+                )
+
+                # if len(ship_data_vtg['track_x_m']) > 0:
+                if not np.alltrue(np.isnan(ship_data_vtg["track_x_m"])):
+                    if edge_start is not None:
+                        if edge_start:
+                            self.vtg.append(
+                                self.fig.ax.plot(
+                                    ship_data_vtg["track_x_m"][0] * units["L"],
+                                    ship_data_vtg["track_y_m"][0] * units["L"],
+                                    "sk",
+                                )[0]
+                            )
+                        else:
+                            self.vtg.append(
+                                self.fig.ax.plot(
+                                    ship_data_vtg["track_x_m"][-1] * units["L"],
+                                    ship_data_vtg["track_y_m"][-1] * units["L"],
+                                    "sk",
+                                )[0]
+                            )
+
+                    # Plot invalid data points using a symbol to represent
+                    # what caused the data to be invalid
+                    if invalid_gps is not None and not np.alltrue(
+                        np.isnan(ship_data_vtg["track_x_m"])
+                    ):
+                        self.vtg.append(
+                            self.fig.ax.plot(
+                                ship_data_vtg["track_x_m"][invalid_gps[1]] * units["L"],
+                                ship_data_vtg["track_y_m"][invalid_gps[1]] * units["L"],
+                                "k",
+                                linestyle="",
+                                marker="$O$",
+                            )[0]
+                        )
+                        self.vtg.append(
+                            self.fig.ax.plot(
+                                ship_data_vtg["track_x_m"][invalid_gps[4]] * units["L"],
+                                ship_data_vtg["track_y_m"][invalid_gps[4]] * units["L"],
+                                "k",
+                                linestyle="",
+                                marker="$S$",
+                            )[0]
+                        )
+                        self.vtg.append(
+                            self.fig.ax.plot(
+                                ship_data_vtg["track_x_m"][invalid_gps[5]] * units["L"],
+                                ship_data_vtg["track_y_m"][invalid_gps[5]] * units["L"],
+                                "k",
+                                linestyle="",
+                                marker="$H$",
+                            )[0]
+                        )
+
+                    if transect.boat_vel.selected == "vtg_vel":
+                        ship_data = ship_data_vtg
+
+                    if control["vtg"]:
+                        for item in self.vtg:
+                            item.set_visible(True)
+                    else:
+                        for item in self.vtg:
+                            item.set_visible(False)
+
+                    max_x_vtg = np.nanmax(ship_data_vtg["track_x_m"])
+                    max_y_vtg = np.nanmax(ship_data_vtg["track_y_m"])
+                    min_x_vtg = np.nanmin(ship_data_vtg["track_x_m"])
+                    min_y_vtg = np.nanmin(ship_data_vtg["track_y_m"])
+
+        # Plot shiptrack based on gga, if available
+        if transect.boat_vel.gga_vel is not None:
+            ship_data_gga = transect.boat_vel.compute_boat_track(
+                transect, ref="gga_vel"
+            )
+            invalid_gps = np.logical_not(transect.boat_vel.gga_vel.valid_data)
+            invalid_gps = invalid_gps[:, transect.in_transect_idx]
+            if not np.alltrue(np.isnan(ship_data_gga["track_x_m"])):
+                if edge_start is not None and n_ensembles is not None:
+                    ship_data_gga["track_x_m"] = self.subsection(
+                        ship_data_gga["track_x_m"], n_ensembles, edge_start
+                    )
+                    ship_data_gga["track_y_m"] = self.subsection(
+                        ship_data_gga["track_y_m"], n_ensembles, edge_start
+                    )
+                    invalid_gps = self.subsection_2d(
+                        invalid_gps, n_ensembles, edge_start
+                    )
+                self.gga = self.fig.ax.plot(
+                    ship_data_gga["track_x_m"] * units["L"],
+                    ship_data_gga["track_y_m"] * units["L"],
+                    color="b",
+                    label="GGA",
+                )
+
+                # if len(ship_data_gga['track_x_m']) > 0:
+                if not np.alltrue(np.isnan(ship_data_gga["track_x_m"])):
+                    if edge_start is not None:
+                        try:
+                            if edge_start:
+                                self.gga.append(
+                                    self.fig.ax.plot(
+                                        ship_data_gga["track_x_m"][0] * units["L"],
+                                        ship_data_gga["track_y_m"][0] * units["L"],
+                                        "sk",
+                                    )[0]
+                                )
+                            else:
+                                self.gga.append(
+                                    self.fig.ax.plot(
+                                        ship_data_gga["track_x_m"][-1] * units["L"],
+                                        ship_data_gga["track_y_m"][-1] * units["L"],
+                                        "sk",
+                                    )[0]
+                                )
+                        except TypeError:
+                            pass
+
+                    # Plot invalid data points using a symbol to represent
+                    # what caused the data to be invalid
+                    if invalid_gps is not None and not np.alltrue(
+                        np.isnan(ship_data_gga["track_x_m"])
+                    ):
+                        self.gga.append(
+                            self.fig.ax.plot(
+                                ship_data_gga["track_x_m"][invalid_gps[1]] * units["L"],
+                                ship_data_gga["track_y_m"][invalid_gps[1]] * units["L"],
+                                "k",
+                                linestyle="",
+                                marker="$O$",
+                            )[0]
+                        )
+                        self.gga.append(
+                            self.fig.ax.plot(
+                                ship_data_gga["track_x_m"][invalid_gps[2]] * units["L"],
+                                ship_data_gga["track_y_m"][invalid_gps[2]] * units["L"],
+                                "k",
+                                linestyle="",
+                                marker="$Q$",
+                            )[0]
+                        )
+                        self.gga.append(
+                            self.fig.ax.plot(
+                                ship_data_gga["track_x_m"][invalid_gps[3]] * units["L"],
+                                ship_data_gga["track_y_m"][invalid_gps[3]] * units["L"],
+                                "k",
+                                linestyle="",
+                                marker="$A$",
+                            )[0]
+                        )
+                        self.gga.append(
+                            self.fig.ax.plot(
+                                ship_data_gga["track_x_m"][invalid_gps[4]] * units["L"],
+                                ship_data_gga["track_y_m"][invalid_gps[4]] * units["L"],
+                                "k",
+                                linestyle="",
+                                marker="$S$",
+                            )[0]
+                        )
+                        self.gga.append(
+                            self.fig.ax.plot(
+                                ship_data_gga["track_x_m"][invalid_gps[5]] * units["L"],
+                                ship_data_gga["track_y_m"][invalid_gps[5]] * units["L"],
+                                "k",
+                                linestyle="",
+                                marker="$H$",
+                            )[0]
+                        )
+
+                    if transect.boat_vel.selected == "gga_vel":
+                        ship_data = ship_data_gga
+
+                    if control["gga"]:
+                        for item in self.gga:
+                            item.set_visible(True)
+                    else:
+                        for item in self.gga:
+                            item.set_visible(False)
+
+                    max_x_gga = np.nanmax(ship_data_gga["track_x_m"])
+                    max_y_gga = np.nanmax(ship_data_gga["track_y_m"])
+                    min_x_gga = np.nanmin(ship_data_gga["track_x_m"])
+                    min_y_gga = np.nanmin(ship_data_gga["track_y_m"])
+
+        # Customize axes
+        self.fig.ax.set_xlabel(self.canvas.tr("Distance East ") + units["label_L"])
+        self.fig.ax.set_ylabel(self.canvas.tr("Distance North ") + units["label_L"])
+
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+        self.fig.ax.grid()
+        self.fig.ax.axis("equal")
+        for label in self.fig.ax.get_xticklabels() + self.fig.ax.get_yticklabels():
+            label.set_fontsize(10)
+
+        max_x = np.nanmax([max_x_bt, max_x_gga, max_x_vtg])
+        min_x = np.nanmin([min_x_bt, min_x_gga, min_x_vtg])
+        max_x = max_x + (max_x - min_x) * 0.1
+        min_x = min_x - (max_x - min_x) * 0.1
+        max_y = np.nanmax([max_y_bt, max_y_gga, max_y_vtg])
+        min_y = np.nanmin([min_y_bt, min_y_gga, min_y_vtg])
+        max_y = max_y + (max_y - min_y) * 0.1
+        min_y = min_y - (max_y - min_y) * 0.1
+
+        if n_ensembles is not None:
+            if transect.w_vel.nav_ref == "BT":
+                max_x = max_x_bt
+                min_x = min_x_bt
+                max_y = max_y_bt
+                min_y = min_y_bt
+            elif transect.w_vel.nav_ref == "GGA":
+                max_x = max_x_gga
+                min_x = min_x_gga
+                max_y = max_y_gga
+                min_y = min_y_gga
+            elif transect.w_vel.nav_ref == "VTG":
+                max_x = max_x_vtg
+                min_x = min_x_vtg
+                max_y = max_y_vtg
+                min_y = min_y_vtg
+            max_x = max_x + (max_x - min_x) * 0.1
+            min_x = min_x - (max_x - min_x) * 0.1
+            max_y = max_y + (max_y - min_y) * 0.1
+            min_y = min_y - (max_y - min_y) * 0.1
+
+            if np.logical_not(np.any(np.isnan(np.array([max_x, min_x, max_y, min_y])))):
+
+                self.fig.ax.set_ylim(top=max_y * units["L"], bottom=min_y * units["L"])
+                self.fig.ax.set_xlim(left=min_x * units["L"], right=max_x * units["L"])
+        else:
+            if np.logical_not(np.any(np.isnan(np.array([max_x, min_x, max_y, min_y])))):
+                self.fig.ax.set_ylim(
+                    top=np.ceil(np.abs(max_y) * units["L"]) * np.sign(max_y),
+                    bottom=np.ceil(np.abs(min_y) * units["L"]) * np.sign(min_y),
+                )
+                self.fig.ax.set_xlim(
+                    left=np.ceil(np.abs(min_x) * units["L"]) * np.sign(min_x),
+                    right=np.ceil(np.abs(max_x) * units["L"]) * np.sign(max_x),
+                )
+
+        # Compute mean water velocity for each ensemble
+        u = np.copy(transect.w_vel.u_processed_mps)
+        v = np.copy(transect.w_vel.v_processed_mps)
+        self.vector_ref = transect.w_vel.nav_ref
+
+        u = u[:, transect.in_transect_idx]
+        v = v[:, transect.in_transect_idx]
+
+        if edge_start is not None and n_ensembles is not None:
+            valid_data = transect.w_vel.valid_data[0, :, :]
+            valid_data = valid_data[:, transect.in_transect_idx]
+            u[np.logical_not(valid_data)] = np.nan
+            v[np.logical_not(valid_data)] = np.nan
+            depth_selected = getattr(transect.depths, transect.depths.selected)
+            weight = depth_selected.depth_cell_size_m[:, transect.in_transect_idx]
+            weight[np.isnan(u)] = np.nan
+            u_mean = np.nansum(u * weight, axis=0) / np.nansum(weight, axis=0)
+            v_mean = np.nansum(v * weight, axis=0) / np.nansum(weight, axis=0)
+            u_mean = self.subsection(u_mean, n_ensembles, edge_start)
+            v_mean = self.subsection(v_mean, n_ensembles, edge_start)
+
+        else:
+            with warnings.catch_warnings():
+                warnings.simplefilter("ignore", category=RuntimeWarning)
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+
+                weight = depth_selected.depth_cell_size_m[:, transect.in_transect_idx]
+                weight[np.isnan(u)] = np.nan
+                u_mean = np.nansum(u * weight, axis=0) / np.nansum(weight, axis=0)
+                v_mean = np.nansum(v * weight, axis=0) / np.nansum(weight, axis=0)
+
+        speed = np.sqrt(u_mean**2 + v_mean**2) * units["V"]
+        if len(speed) > 0:
+            max_speed = np.nanmax(speed)
+        else:
+            max_speed = 0
+        # Plot water vectors
+        # if len(ship_data['track_x_m']) > 0:
+        if not np.alltrue(np.isnan(ship_data["track_x_m"])):
+            self.vectors = self.fig.ax.quiver(
+                ship_data["track_x_m"] * units["L"],
+                ship_data["track_y_m"] * units["L"],
+                u_mean * units["V"],
+                v_mean * units["V"],
+                units="dots",
+                width=1,
+                scale_units="width",
+                scale=4 * max_speed,
+            )
+            if control["vectors"]:
+                self.vectors.set_visible(True)
+            else:
+                self.vectors.set_visible(False)
+
+        # Initialize annotation for data cursor
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    def change(self):
+        """Updates what boat reference tracks are displayed based on the
+        checkboxes.
+        """
+
+        if self.cb:
+            if self.cb_bt.checkState() == QtCore.Qt.Checked:
+                for item in self.bt:
+                    item.set_visible(True)
+            else:
+                for item in self.bt:
+                    item.set_visible(False)
+            # GGA
+            if self.cb_gga.checkState() == QtCore.Qt.Checked and self.gga is not None:
+                for item in self.gga:
+                    item.set_visible(True)
+            elif self.gga is not None:
+                for item in self.gga:
+                    item.set_visible(False)
+            # VTG
+            if self.cb_vtg.checkState() == QtCore.Qt.Checked and self.vtg is not None:
+                for item in self.vtg:
+                    item.set_visible(True)
+            elif self.vtg is not None:
+                for item in self.vtg:
+                    item.set_visible(False)
+            # Vectors
+            if self.cb_vectors.checkState() == QtCore.Qt.Checked:
+                self.vectors.set_visible(True)
+            else:
+                self.vectors.set_visible(False)
+
+        self.canvas.draw()
+
+    @staticmethod
+    def subsection(data, n_ensembles, edge_start):
+        """Subsections data for shiptrack of edge ensembles.
+
+        Parameters
+        ----------
+        data: np.ndarray(float)
+            Shiptrack coordinate
+        n_ensembles: int
+            Number of ensembles in subsection
+        edge_start: int
+            Identifies start bank
+        """
+
+        if n_ensembles > 0:
+            if data is not np.nan and len(data) > int(n_ensembles):
+                if edge_start:
+                    data_out = data[: int(n_ensembles)]
+                else:
+                    data_out = data[-int(n_ensembles) :]
+            else:
+                data_out = data
+        else:
+            data_out = np.array([])
+        return data_out
+
+    @staticmethod
+    def subsection_2d(data, n_ensembles, edge_start):
+        """Subsections data for shiptrack of edge ensembles.
+
+        Parameters
+        ----------
+        data: np.ndarray(float)
+            Shiptrack coordinate
+        n_ensembles: int
+            Number of ensembles in subsection
+        edge_start: int
+            Identifies start bank
+        """
+        if data.shape[1] > int(n_ensembles):
+            if edge_start:
+                data_out = data[:, : int(n_ensembles)]
+            else:
+                data_out = data[:, -int(n_ensembles) :]
+        else:
+            data_out = data
+        return data_out
+
+    def checkbox_control(self, transect):
+        """Controls the visibility and checks the status of checkboxes.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData with boat speeds to be plotted.
+        """
+
+        # Initialize control dictionary
+        control = {"bt": True, "gga": True, "vtg": True, "vectors": True}
+
+        # If checkboxes are available, enable the checkboxes if transect
+        # contains that type of data
+        if self.cb:
+            # Enable check boxes as data is available
+            if transect.boat_vel.gga_vel is not None:
+                self.cb_gga.setEnabled(True)
+            else:
+                self.cb_gga.setCheckState(QtCore.Qt.Unchecked)
+                self.cb_gga.setEnabled(False)
+
+            if transect.boat_vel.vtg_vel is not None:
+                self.cb_vtg.setEnabled(True)
+            else:
+                self.cb_vtg.setCheckState(QtCore.Qt.Unchecked)
+                self.cb_vtg.setEnabled(False)
+
+            # Get checkbox status
+            # BT
+            if self.cb_bt.checkState():
+                control["bt"] = True
+            else:
+                control["bt"] = False
+            # GGA
+            if self.cb_gga.checkState():
+                control["gga"] = True
+            else:
+                control["gga"] = False
+            # VTG
+            if self.cb_vtg.checkState():
+                control["vtg"] = True
+            else:
+                control["vtg"] = False
+            if self.cb_vectors.checkState() == QtCore.Qt.Checked:
+                control["vectors"] = True
+            else:
+                control["vectors"] = False
+
+        return control
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the
+        annotation. If the location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            cont_bt = False
+            cont_gga = False
+            cont_vtg = False
+            ind_bt = None
+            ind_gga = None
+            ind_vtg = None
+            if self.bt is not None:
+                cont_bt, ind_bt = self.bt[0].contains(event)
+            if self.gga is not None:
+                cont_gga, ind_gga = self.gga[0].contains(event)
+            if self.vtg is not None:
+                cont_vtg, ind_vtg = self.vtg[0].contains(event)
+
+            if cont_bt and self.bt[0].get_visible():
+                self.update_annot(ind_bt, self.bt[0], self.vectors, "BT")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_gga and self.gga[0].get_visible():
+                self.update_annot(ind_gga, self.gga[0], self.vectors, "GGA")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_vtg and self.vtg[0].get_visible():
+                self.update_annot(ind_vtg, self.vtg[0], self.vectors, "VTG")
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted
+                # data hide the annotation.
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+             active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
+
+    def update_annot(self, ind, plt_ref, vector_ref, ref_label):
+        """Updates the location and text and makes visible the previously
+        initialized and hidden annotation.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        vector_ref: Quiver
+            Refernece containing plotted data
+        ref_label: str
+            Label used to ID data type in annotation
+        """
+
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the
+        # axis the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+        self.annot.xy = pos
+        if self.vector_ref == ref_label:
+            v = np.sqrt(
+                vector_ref.U[ind["ind"][0]] ** 2 + vector_ref.V[ind["ind"][0]] ** 2
+            )
+            text = "{} x: {:.2f}, y: {:.2f}, \n v: {:.1f}".format(
+                ref_label, pos[0], pos[1], v
+            )
+        else:
+            text = "{} x: {:.2f}, y: {:.2f}".format(ref_label, pos[0], pos[1])
+        self.annot.set_text(text)
diff --git a/UI/StartEdge.py b/UI/StartEdge.py
new file mode 100644
index 0000000000000000000000000000000000000000..8764eb0304c958e8038ba9a83105254b33060b6c
--- /dev/null
+++ b/UI/StartEdge.py
@@ -0,0 +1,18 @@
+from PyQt5 import QtWidgets
+from UI import wStartEdge
+
+
+class StartEdge(QtWidgets.QDialog, wStartEdge.Ui_start_edge):
+    """Dialog to allow users to change temperature source.
+
+    Parameters
+    ----------
+    wStartEdge.Ui_start_edge : QDialog
+        Dialog window to allow users to change start edge
+    """
+
+    def __init__(self, parent=None):
+        """Initialize dialog."""
+
+        super(StartEdge, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/StationaryGraphs.py b/UI/StationaryGraphs.py
new file mode 100644
index 0000000000000000000000000000000000000000..3d0ce7281430f7795c6865b0808e960d4001d296
--- /dev/null
+++ b/UI/StationaryGraphs.py
@@ -0,0 +1,340 @@
+import numpy as np
+import matplotlib.gridspec as gridspec
+
+
+class StationaryGraphs(object):
+    """Class to generate two time series plots (moving-bed velocity and
+    shiptrack based on upstream/downstream movement) used to evaluate
+    stationary moving-bed tests.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    mb: list
+        List of plot objects
+    stud: list
+        List of plot objects
+    hover_connection: int
+        Index to data cursor connection
+    annot_mb: Annotation
+        Annotation object for moving-bed time series data cursor
+    annot_stud: Annotation
+        Annotation object for upstream/downstream shiptrack data cursor
+    x_axis_type: str
+        Identifies x-axis type (L-lenght, E-ensemble, T-time)
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.hover_connection = None
+        self.annot_mb = None
+        self.annot_stud = None
+        self.mb = None
+        self.stud = None
+        self.x_axis_type = "E"
+
+    def create(self, mb_test, units, x_axis_type=None):
+        """Generates a moving-bed time series and upstream/downstream bottom
+        track plot from stationary moving-bed test data.
+
+        Parameters
+        ----------
+        mb_test: MovingBedTest
+            Object of MovingBedTest contain data to be plotted.
+        units: dict
+            Dictionary of unit conversions and labels.
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        """
+
+        # Set default axis
+        if x_axis_type is None:
+            x_axis_type = "E"
+        self.x_axis_type = x_axis_type
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Setup grid space
+        gs = gridspec.GridSpec(1, 2)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.1, bottom=0.1, right=0.98, top=0.85, wspace=0.2, hspace=0
+        )
+
+        # Configure moving-bed time series graph
+        self.fig.axmb = self.fig.add_subplot(gs[0, 0])
+        self.fig.axmb.set_ylabel(
+            self.canvas.tr("BT Moving-bed speed" + units["label_V"])
+        )
+        self.fig.axmb.grid()
+        self.fig.axmb.xaxis.label.set_fontsize(12)
+        self.fig.axmb.yaxis.label.set_fontsize(12)
+        self.fig.axmb.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+
+        # Mark invalid data
+        valid_data = mb_test.transect.boat_vel.bt_vel.valid_data[
+            0, mb_test.transect.in_transect_idx
+        ]
+        if np.any(valid_data):
+            invalid_data = np.logical_not(valid_data)
+            # Compute x axis data
+            x = None
+            if x_axis_type == "L":
+                # Length doesn't make sense for this plot so default to
+                # ensembles
+                x = np.arange(
+                    1, len(mb_test.transect.depths.bt_depths.depth_processed_m) + 1
+                )
+            elif x_axis_type == "E":
+                x = np.arange(
+                    1, len(mb_test.transect.depths.bt_depths.depth_processed_m) + 1
+                )
+            elif x_axis_type == "T":
+                x = np.nancumsum(mb_test.transect.date_time.ens_duration_sec)
+
+            self.mb = self.fig.axmb.plot(
+                x, mb_test.stationary_mb_vel * units["V"], "b-"
+            )
+            self.mb.append(
+                self.fig.axmb.plot(
+                    x[invalid_data],
+                    mb_test.stationary_mb_vel[invalid_data] * units["V"],
+                    "ro",
+                )[0]
+            )
+
+            # Label axis
+            if x_axis_type == "L":
+                self.fig.axmb.set_xlim(
+                    left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+                )
+                self.fig.axmb.set_xlabel(self.canvas.tr("Ensembles"))
+            elif x_axis_type == "E":
+                self.fig.axmb.set_xlim(
+                    left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+                )
+                self.fig.axmb.set_xlabel(self.canvas.tr("Ensembles"))
+            elif x_axis_type == "T":
+                self.fig.axmb.set_xlim(
+                    left=-1 * np.nanmax(x) * 0.02, right=np.nanmax(x) * 1.02
+                )
+                self.fig.axmb.set_xlabel(self.canvas.tr("Duration (seconds)"))
+
+            # Generate upstream/cross stream shiptrack
+            self.fig.axstud = self.fig.add_subplot(gs[0, 1])
+            self.fig.axstud.set_xlabel(
+                self.canvas.tr("Distance cross stream" + units["label_L"])
+            )
+            self.fig.axstud.set_ylabel(
+                self.canvas.tr("Distance upstream" + units["label_L"])
+            )
+            self.fig.axstud.grid()
+            self.fig.axstud.xaxis.label.set_fontsize(12)
+            self.fig.axstud.yaxis.label.set_fontsize(12)
+            self.fig.axstud.axis("equal")
+            self.fig.axstud.tick_params(
+                axis="both",
+                direction="in",
+                bottom=True,
+                top=True,
+                left=True,
+                right=True,
+            )
+
+            self.stud = self.fig.axstud.plot(
+                mb_test.stationary_cs_track * units["L"],
+                mb_test.stationary_us_track * units["L"],
+                "r-",
+            )
+
+            # Initialize annotation for data cursor
+            self.annot_mb = self.fig.axmb.annotate(
+                "",
+                xy=(0, 0),
+                xytext=(-20, 20),
+                textcoords="offset points",
+                bbox=dict(boxstyle="round", fc="w"),
+                arrowprops=dict(arrowstyle="->"),
+            )
+
+            self.annot_mb.set_visible(False)
+
+            # Initialize annotation for data cursor
+            self.annot_stud = self.fig.axstud.annotate(
+                "",
+                xy=(0, 0),
+                xytext=(-20, 20),
+                textcoords="offset points",
+                bbox=dict(boxstyle="round", fc="w"),
+                arrowprops=dict(arrowstyle="->"),
+            )
+
+            self.annot_stud.set_visible(False)
+
+            self.canvas.draw()
+
+    def change(self):
+        """Function to all call to change, but there is nothing to change for
+        this class. Mirrors BoatSpeed class to allow interchangable use.
+        """
+
+        pass
+
+    @staticmethod
+    def update_annot(ind, plt_ref, annot):
+        """Updates the location and text and makes visible the previously
+        initialized and hidden annotation.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        annot: Annotation
+            Annotation associated with figure clicked
+        """
+
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                annot._x = -20
+            else:
+                annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                annot._x = -80
+            else:
+                annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                annot._y = -40
+            else:
+                annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                annot._y = 20
+            else:
+                annot._y = -40
+
+        # Format and display text
+        annot.xy = pos
+        text = "x: {:.2f}, y: {:.2f}".format(pos[0], pos[1])
+        annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the
+        annotation. If the location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis_mb = self.annot_mb.get_visible()
+        vis_stud = self.annot_stud.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.axmb:
+            cont_mb = False
+            ind_mb = None
+            if self.mb is not None:
+                cont_mb, ind_mb = self.mb[0].contains(event)
+            if cont_mb and self.mb[0].get_visible():
+                self.update_annot(ind_mb, self.mb[0], self.annot_mb)
+                self.annot_mb.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                if vis_mb:
+                    self.annot_mb.set_visible(False)
+                    self.canvas.draw_idle()
+        elif event.inaxes == self.fig.axstud:
+            cont_stud = False
+            ind_stud = None
+            if self.stud is not None:
+                cont_stud, ind_stud = self.stud[0].contains(event)
+            if cont_stud and self.stud[0].get_visible():
+                self.update_annot(ind_stud, self.stud[0], self.annot_stud)
+                self.annot_stud.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted
+                # data hide the annotation.
+                if vis_stud:
+                    self.annot_stud.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot_stud.set_visible(False)
+            self.annot_mb.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/Subsection.py b/UI/Subsection.py
new file mode 100644
index 0000000000000000000000000000000000000000..ac08fc76632b3ba5b6879dd5728f14995f542cbd
--- /dev/null
+++ b/UI/Subsection.py
@@ -0,0 +1,17 @@
+from PyQt5 import QtWidgets
+from UI import wSubsection
+
+
+class Subsection(QtWidgets.QDialog, wSubsection.Ui_subsection):
+    """Dialog to allow users to subsection extrap.
+
+    Parameters
+    ----------
+    wSubsection.Ui_subsection : QDialog
+        Dialog window to allow users to subsection in extrap
+    """
+
+    def __init__(self, parent=None):
+        """Initialize dialog"""
+        super(Subsection, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/TempSource.py b/UI/TempSource.py
new file mode 100644
index 0000000000000000000000000000000000000000..44c43d4b062362def33c9b33da426e71ade0f988
--- /dev/null
+++ b/UI/TempSource.py
@@ -0,0 +1,18 @@
+from PyQt5 import QtWidgets
+from UI import wTempSource
+
+
+class TempSource(QtWidgets.QDialog, wTempSource.Ui_temp_source):
+    """Dialog to allow users to change temperature source.
+
+    Parameters
+    ----------
+    wTempSource.Ui_temp_source : QDialog
+        Dialog window to allow users to change temperature source
+    """
+
+    def __init__(self, parent=None):
+        """Initialize dialog"""
+
+        super(TempSource, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/TemperatureTS.py b/UI/TemperatureTS.py
new file mode 100644
index 0000000000000000000000000000000000000000..b49f0b7d72a0552938648b85f4018f2f5d444cf4
--- /dev/null
+++ b/UI/TemperatureTS.py
@@ -0,0 +1,229 @@
+import numpy as np
+from datetime import datetime
+import matplotlib.dates as mdates
+from MiscLibs.common_functions import convert_temperature
+
+
+class TemperatureTS(object):
+    """Class to generate a time series graph of the ADCP temperature.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    tp: list
+        Reference to time series plot
+    hover_connection: bool
+        Switch to allow user to use the data cursor
+    annot: Annotation
+        Annotation object for data cursor
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.tp = None
+        self.hover_connection = None
+        self.annot = None
+
+    def create(self, meas, rb_f):
+        """Creates the figure on the canvas.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        rb_f: Widget
+            Radio button control for F or C units
+        """
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.1, bottom=0.15, right=0.98, top=0.98, wspace=0.1, hspace=0
+        )
+        temp, serial_time = meas.compute_time_series(meas, "Temperature")
+
+        # Create list from time stamps
+        time_stamp = []
+        for t in serial_time:
+            time_stamp.append(datetime.utcfromtimestamp(t))
+
+        # Set label to display correct units
+        y_label = self.canvas.tr("Degrees C")
+        if rb_f.isChecked():
+            temp = convert_temperature(temp_in=temp, units_in="C", units_out="F")
+            y_label = self.canvas.tr("Degrees F")
+
+        # Plot data
+        self.tp = self.fig.ax.plot(time_stamp, temp, "b.")
+
+        # Customize axis
+        time_fmt = mdates.DateFormatter("%H:%M:%S")
+        self.fig.ax.xaxis.set_major_formatter(time_fmt)
+        self.fig.ax.set_xlabel(self.canvas.tr("Time "))
+        self.fig.ax.set_ylabel(y_label)
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+        self.fig.ax.set_ylim([np.nanmin(temp) - 2, np.nanmax(temp) + 2])
+        self.fig.ax.grid()
+
+        # Initialize annotation for data cursor
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    def update_annot(self, ind, plt_ref):
+        """Updates the location and text and makes visible the previously
+        initialized and hidden annotation.
+
+        Parameters
+        ----------
+        ind: dict
+            Contains data selected.
+        plt_ref: Line2D
+            Reference containing plotted data
+        """
+
+        # Get selected data coordinates
+        pos = plt_ref._xy[ind["ind"][0]]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+        self.annot.xy = pos
+
+        # Format and display text
+        text = "x: {}, y: {:.2f}".format(
+            plt_ref._xorig[ind["ind"][0]].strftime("%H:%M:%S"), pos[1]
+        )
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with temperature
+        data and makes annotation visible and calls method to update the text of the
+        annotation. If the location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            cont = False
+            ind = None
+            if self.tp is not None:
+                cont, ind = self.tp[0].contains(event)
+
+            if cont and self.tp[0].get_visible():
+                self.update_annot(ind, self.tp[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted
+                # data hide the annotation.
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/Threshold.py b/UI/Threshold.py
new file mode 100644
index 0000000000000000000000000000000000000000..d2441b2aba131efb20ab266ad263a0fc06d065c5
--- /dev/null
+++ b/UI/Threshold.py
@@ -0,0 +1,18 @@
+from PyQt5 import QtWidgets
+from UI import wThreshold
+
+
+class Threshold(QtWidgets.QDialog, wThreshold.Ui_threshold):
+    """Dialog to allow users to change the point threshold in extrap.
+
+    Parameters
+    ----------
+    wThreshold.Ui_threshold : QDialog
+        Dialog window to allow users to change the point threshold in extrap
+    """
+
+    def __init__(self, parent=None):
+        """Initialize dialog"""
+
+        super(Threshold, self).__init__(parent)
+        self.setupUi(self)
diff --git a/UI/Transects2Use.py b/UI/Transects2Use.py
new file mode 100644
index 0000000000000000000000000000000000000000..0958738a728b61ab5bee80a45995674fbbecb176
--- /dev/null
+++ b/UI/Transects2Use.py
@@ -0,0 +1,226 @@
+from datetime import datetime
+from PyQt5 import QtWidgets, QtCore
+from UI import wTransects2Use
+
+
+class Transects2Use(QtWidgets.QDialog, wTransects2Use.Ui_Transects2Use):
+    """Dialog to allow users to to select and deselect transects to use in the
+    discharge computation.
+
+    Parameters
+    ----------
+    wTransects2Use.Ui_Transects2Use : QDialog
+        Dialog window with options for users
+    """
+
+    def __init__(self, parent=None):
+        """Initialize dialog
+
+        Parameters
+        ----------
+        parent: QRev
+            Main UI
+        """
+
+        super(Transects2Use, self).__init__(parent)
+        self.setupUi(self)
+        self.parent = parent
+
+        # Populate table
+        self.summary_table()
+
+        # Setup connections for buttons
+        self.pb_check_all.clicked.connect(self.check_all)
+        self.pb_uncheck_all.clicked.connect(self.uncheck_all)
+
+    def check_all(self):
+        """Checks all transects for use."""
+
+        for transect in self.parent.meas.transects:
+            transect.checked = True
+        self.summary_table()
+
+    def uncheck_all(self):
+        """Unchecks all transects for user."""
+
+        for transect in self.parent.meas.transects:
+            transect.checked = False
+        self.summary_table()
+
+    def summary_table(self):
+        """Create and populate main summary table."""
+
+        parent = self.parent
+        tbl = self.tableSelect
+        units = parent.units
+
+        # Initialize table headers
+        summary_header = [
+            parent.tr("Select Transect"),
+            parent.tr("Start"),
+            parent.tr("Bank"),
+            parent.tr("End"),
+            parent.tr("Duration"),
+            parent.tr("Total Q"),
+            parent.tr("Top Q"),
+            parent.tr("Meas Q"),
+            parent.tr("Bottom Q"),
+            parent.tr("Left Q"),
+            parent.tr("Right Q"),
+        ]
+
+        # Setup table
+        ncols = len(summary_header)
+        nrows = len(parent.meas.transects)
+        tbl.setRowCount(nrows)
+        tbl.setColumnCount(ncols)
+        tbl.setHorizontalHeaderLabels(summary_header)
+        tbl.horizontalHeader().setFont(parent.font_bold)
+        tbl.verticalHeader().hide()
+        tbl.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+        # Add transect data
+        for row in range(nrows):
+            col = 0
+            transect_id = row
+            checked = QtWidgets.QTableWidgetItem(
+                parent.meas.transects[transect_id].file_name[:-4]
+            )
+            checked.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
+            if parent.meas.transects[row].checked:
+                checked.setCheckState(QtCore.Qt.Checked)
+            else:
+                checked.setCheckState(QtCore.Qt.Unchecked)
+            checked.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
+            tbl.setItem(row, col, checked)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    datetime.strftime(
+                        datetime.utcfromtimestamp(
+                            parent.meas.transects[
+                                transect_id
+                            ].date_time.start_serial_time
+                        ),
+                        "%H:%M:%S",
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    parent.meas.transects[transect_id].start_edge[0]
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    datetime.strftime(
+                        datetime.utcfromtimestamp(
+                            parent.meas.transects[transect_id].date_time.end_serial_time
+                        ),
+                        "%H:%M:%S",
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:5.1f}".format(
+                        parent.meas.transects[
+                            transect_id
+                        ].date_time.transect_duration_sec
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:8.2f}".format(
+                        parent.meas.discharge[transect_id].total * units["Q"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7.2f}".format(
+                        parent.meas.discharge[transect_id].top * units["Q"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7.2f}".format(
+                        parent.meas.discharge[transect_id].middle * units["Q"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7.2f}".format(
+                        parent.meas.discharge[transect_id].bottom * units["Q"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7.2f}".format(
+                        parent.meas.discharge[transect_id].left * units["Q"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+            col += 1
+            tbl.setItem(
+                row,
+                col,
+                QtWidgets.QTableWidgetItem(
+                    "{:7.2f}".format(
+                        parent.meas.discharge[transect_id].right * units["Q"]
+                    )
+                ),
+            )
+            tbl.item(row, col).setFlags(QtCore.Qt.ItemIsEnabled)
+
+        tbl.resizeColumnsToContents()
+        tbl.resizeRowsToContents()
diff --git a/UI/ULollipopPlot.py b/UI/ULollipopPlot.py
new file mode 100644
index 0000000000000000000000000000000000000000..70d9f75567ecaa5276f3ef8ae32d6d6a780a5b0d
--- /dev/null
+++ b/UI/ULollipopPlot.py
@@ -0,0 +1,218 @@
+import numpy as np
+
+
+class ULollipopPlot(object):
+    """Class to generate lollipop plot of Oursin uncertainty results."""
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.hover_connection = None
+        self.annot = None
+        self.plot_df = None
+
+    def create(self, meas):
+        """Generates the lollipop plot.
+
+        Parameters
+        ----------
+        meas: Measurement
+            Object of class Measurement
+        """
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        if meas.run_oursin:
+            # Set margins and padding for figure
+            self.fig.subplots_adjust(
+                left=0.2, bottom=0.15, right=0.98, top=0.95, wspace=0.1, hspace=0
+            )
+
+            # Configure plot dataframe
+            self.plot_df = meas.oursin.u_contribution_measurement_user.drop(
+                ["total"], axis=1
+            )
+            self.plot_df = self.plot_df.mul(100)
+            self.plot_df.index = ["Percent"]
+            self.plot_df.columns = [
+                "System",
+                "Compass",
+                "Moving-bed",
+                "# Ensembles",
+                "Meas. Q",
+                "Top Q",
+                "Bottom Q",
+                "Left Q",
+                "Right Q",
+                "Inv. Boat",
+                "Inv. Depth",
+                "Inv. Water",
+                "COV",
+            ]
+            self.plot_df = self.plot_df.transpose()
+            self.plot_df = self.plot_df.sort_values(by="Percent")
+
+            # Generate plot
+            self.fig.ax.hlines(
+                y=self.plot_df.index, xmin=0, xmax=self.plot_df["Percent"]
+            )
+            self.fig.ax.plot(
+                self.plot_df["Percent"], self.plot_df.index, "o", markersize=11
+            )
+            self.fig.ax.set_xlabel(self.canvas.tr("Percent of Total"))
+            self.fig.ax.xaxis.label.set_fontsize(12)
+            self.fig.ax.tick_params(axis="both", which="major", labelsize=10)
+            if np.isnan(meas.oursin.u_measurement_user["total_95"][0]):
+                self.fig.ax.set_title(self.canvas.tr("95% Total Uncertainty: N/A"))
+            else:
+                self.fig.ax.set_title(
+                    self.canvas.tr("95% Total Uncertainty: ")
+                    + "%5.1f" % meas.oursin.u_measurement_user["total_95"][0],
+                    fontweight="bold",
+                )
+
+            # Setup annotation features
+            self.annot = self.fig.ax.annotate(
+                "",
+                xy=(0, 0),
+                xytext=(-20, 20),
+                textcoords="offset points",
+                bbox=dict(boxstyle="round", fc="w"),
+                arrowprops=dict(arrowstyle="->"),
+            )
+
+            self.annot.set_visible(False)
+
+            self.canvas.draw()
+
+    def update_annot(self, name, u_value, event):
+        """Updates the location and text and makes visible the previously
+        initialized and hidden annotation.
+
+        Parameters
+        ----------
+        name: str
+            Name of uncertainty type
+        u_value: float
+            Uncertainty percent
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Get selected data coordinates
+        pos = [event.xdata, event.ydata]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if self.fig.ax.viewLim.intervalx[0] < self.fig.ax.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (self.fig.ax.viewLim.intervalx[0] + self.fig.ax.viewLim.intervalx[1])
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    self.fig.ax.axes.viewLim.intervalx[0]
+                    + self.fig.ax.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if self.fig.ax.viewLim.intervaly[0] < self.fig.ax.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (self.fig.ax.viewLim.intervaly[0] + self.fig.ax.viewLim.intervaly[1])
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (self.fig.ax.viewLim.intervaly[0] + self.fig.ax.viewLim.intervaly[1])
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+
+        self.annot.xy = pos
+
+        # Format and display text
+        text = "{}: {:2.2f}%".format(name, u_value)
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the
+        annotation. If the location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            row = int(round(event.ydata))
+            name = list(self.plot_df.index)[row]
+            u_value = self.plot_df.loc[name, "Percent"]
+
+            self.update_annot(name, u_value, event)
+            self.annot.set_visible(True)
+            self.canvas.draw_idle()
+
+        else:
+            # If the cursor location is not associated with the plotted data
+            # hide the annotation.
+            if vis:
+                self.annot.set_visible(False)
+                self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/UMeasQ.py b/UI/UMeasQ.py
new file mode 100644
index 0000000000000000000000000000000000000000..628852e38339e4a8579e63dc05dd4e05642a010d
--- /dev/null
+++ b/UI/UMeasQ.py
@@ -0,0 +1,225 @@
+class UMeasQ(object):
+    """Class to generate stacked bar graph of contributions to uncertainty.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.hover_connection = None
+        self.annot = None
+        self.col_labels = {
+            "water": "Water",
+            "boat": "Boat",
+            "depth": "Depth",
+            "dzi": "Cell Size",
+        }
+        self.plot_df = None
+        self.plot_df_cumsum = None
+
+    def create(self, oursin):
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        oursin: Oursin
+            Object of Oursin uncertainty model
+        """
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Create dataframe to plot
+        self.plot_df = oursin.u_contribution_meas * 100
+
+        # Create dataframe for data cursor
+        self.plot_df_cumsum = self.plot_df.cumsum(axis="columns")
+
+        # Create x tick labels
+        x_tick_labels = []
+        for n in range(1, self.plot_df.shape[0] + 1):
+            x_tick_labels.append(str(n))
+
+        # Create legend labels
+        custom_labels = ["Boat", "Water", "Cell Size"]
+
+        self.plot_df.plot(kind="bar", stacked=True, ax=self.fig.ax, legend=False)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.01, bottom=0.01, right=0.95, top=0.99, wspace=0, hspace=0
+        )
+        self.fig.ax.set_ylabel(self.canvas.tr("Percent of Measured Q Uncertainty"))
+        self.fig.ax.set_xlabel(self.canvas.tr("Transects"))
+        self.fig.ax.set_xticklabels(x_tick_labels, rotation="horizontal", fontsize=12)
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+
+        # Reverse legend to match stacked bars
+        handles, labels = self.fig.ax.get_legend_handles_labels()
+        self.fig.ax.legend(
+            reversed(handles),
+            reversed(custom_labels),
+            fontsize=12,
+            loc="center left",
+            bbox_to_anchor=(1, 0.5),
+        )
+
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    def update_annot(self, col_name, u_value, event):
+        """Updates the location and text and makes visible the previously
+        initialized and hidden annotation.
+
+        Parameters
+        ----------
+        col_name: str
+            Column name in data frame
+        u_value: float
+            Uncertainty percent
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Get selected data coordinates
+        pos = [event.xdata, event.ydata]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if self.fig.ax.viewLim.intervalx[0] < self.fig.ax.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (self.fig.ax.viewLim.intervalx[0] + self.fig.ax.viewLim.intervalx[1])
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    self.fig.ax.axes.viewLim.intervalx[0]
+                    + self.fig.ax.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the
+        # axis the pos y is located and the direction of y increasing.
+        if self.fig.ax.viewLim.intervaly[0] < self.fig.ax.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (self.fig.ax.viewLim.intervaly[0] + self.fig.ax.viewLim.intervaly[1])
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (self.fig.ax.viewLim.intervaly[0] + self.fig.ax.viewLim.intervaly[1])
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+
+        self.annot.xy = pos
+
+        # Format and display text
+        text = "{}: {:2.2f}".format(self.col_labels[col_name], u_value)
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the
+        annotation. If the location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            row = int(round(event.xdata))
+            df_row = self.plot_df_cumsum.iloc[row, :]
+            col_name = df_row[df_row.gt(event.ydata)].index[0]
+            u_value = self.plot_df.loc[row, col_name]
+
+            self.update_annot(col_name, u_value, event)
+            self.annot.set_visible(True)
+            self.canvas.draw_idle()
+
+        else:
+            # If the cursor location is not associated with the plotted data
+            # hide the annotation.
+            if vis:
+                self.annot.set_visible(False)
+                self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+             active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/UMeasurement.py b/UI/UMeasurement.py
new file mode 100644
index 0000000000000000000000000000000000000000..081298de3b1c1ebaab8692289dc878439239f11d
--- /dev/null
+++ b/UI/UMeasurement.py
@@ -0,0 +1,289 @@
+class UMeasurement(object):
+    """Class to generate stacked bar graph of contributions to uncertainty.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.hover_connection = None
+        self.annot = None
+        self.col_labels = {
+            "u_syst": "System",
+            "u_compass": "Compass",
+            "u_movbed": "Moving-bed",
+            "u_ens": "# Ensembles",
+            "u_meas": "Meas. Q",
+            "u_top": "Top Q",
+            "u_bot": "Bottom Q",
+            "u_left": "Left Q",
+            "u_right": "Right Q",
+            "u_boat": "Inv. Boat",
+            "u_depth": "Inv. Depth",
+            "u_water": "Inv. Water",
+            "u_cov": "COV",
+        }
+        self.plot_df_cumsum = None
+        self.plot_df = None
+
+    def create(self, oursin):
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        oursin: Oursin
+            Object of Oursin uncertainty model
+        """
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Create dataframe to plot
+        self.plot_df = oursin.u_contribution_measurement_user.drop(["total"], axis=1)
+        self.plot_df = self.plot_df.append(
+            oursin.u_contribution_user.drop(["total"], axis=1), ignore_index=True
+        )
+        self.plot_df = self.plot_df.mul(100)
+        self.plot_df = self.plot_df[
+            [
+                "u_syst",
+                "u_compass",
+                "u_movbed",
+                "u_ens",
+                "u_meas",
+                "u_cov",
+                "u_top",
+                "u_bot",
+                "u_left",
+                "u_right",
+                "u_boat",
+                "u_depth",
+                "u_water",
+            ]
+        ]
+
+        # Create dataframe to use for data cursor
+        self.plot_df_cumsum = self.plot_df.cumsum(axis="columns")
+
+        # Create x tick labels
+        x_tick_labels = ["All"]
+        for n in range(1, self.plot_df.shape[0]):
+            x_tick_labels.append(str(n))
+
+        # Create legend labels
+        custom_labels = [
+            "System",
+            "Compass",
+            "Moving-bed",
+            "# Ensembles",
+            "Meas. Q",
+            "COV",
+            "Top Q",
+            "Bottom Q",
+            "Left Q",
+            "Right Q",
+            "Inv. Boat",
+            "Inv. Depth",
+            "Inv. Water",
+        ]
+
+        custom_colors = [
+            "#696969",
+            "#808080",
+            "#A9A9A9",
+            "#0000FF",
+            "#00BFFF",
+            "#00FFFF",
+            "#FF00FF",
+            "#EE82EE",
+            "#20B2AA",
+            "#008B8B",
+            "#FF6666",
+            "#FF0000",
+            "#CC0000",
+        ]
+
+        # Generate bar graph
+        self.plot_df.plot(
+            kind="bar", stacked=True, ax=self.fig.ax, legend=False, color=custom_colors
+        )
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.01, bottom=0.01, right=0.95, top=0.99, wspace=0, hspace=0
+        )
+        self.fig.ax.set_ylabel(self.canvas.tr("Percent of Total Uncertainty"))
+        self.fig.ax.set_xlabel(self.canvas.tr("Transects"))
+        self.fig.ax.set_xticklabels(x_tick_labels, rotation="horizontal", fontsize=12)
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+
+        # Arrange legend in reverse order to match stacked bars
+        handles, labels = self.fig.ax.get_legend_handles_labels()
+        self.fig.ax.legend(
+            reversed(handles),
+            reversed(custom_labels),
+            fontsize=12,
+            loc="center left",
+            bbox_to_anchor=(1, 0.5),
+        )
+
+        # Setup annotation features
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    def update_annot(self, col_name, u_value, event):
+        """Updates the location and text and makes visible the previously
+        initialized and hidden annotation.
+
+        Parameters
+        ----------
+        col_name: str
+            Column name in data frame
+        u_value: float
+            Uncertainty percent
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Get selected data coordinates
+        pos = [event.xdata, event.ydata]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if self.fig.ax.viewLim.intervalx[0] < self.fig.ax.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (self.fig.ax.viewLim.intervalx[0] + self.fig.ax.viewLim.intervalx[1])
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    self.fig.ax.axes.viewLim.intervalx[0]
+                    + self.fig.ax.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if self.fig.ax.viewLim.intervaly[0] < self.fig.ax.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (self.fig.ax.viewLim.intervaly[0] + self.fig.ax.viewLim.intervaly[1])
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (self.fig.ax.viewLim.intervaly[0] + self.fig.ax.viewLim.intervaly[1])
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+
+        self.annot.xy = pos
+
+        # Format and display text
+        text = "{}: {:2.2f}".format(self.col_labels[col_name], u_value)
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the
+        annotation. If the location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            row = int(round(event.xdata))
+            df_row = self.plot_df_cumsum.iloc[row, :]
+            col_name = df_row[df_row.gt(event.ydata)].index[0]
+            u_value = self.plot_df.loc[row, col_name]
+
+            self.update_annot(col_name, u_value, event)
+            self.annot.set_visible(True)
+            self.canvas.draw_idle()
+
+        else:
+            # If the cursor location is not associated with the plotted data
+            # hide the annotation.
+            if vis:
+                self.annot.set_visible(False)
+                self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/WTContour.py b/UI/WTContour.py
new file mode 100644
index 0000000000000000000000000000000000000000..c246fb8f27d65ade616dd6262aa6d9a3457c319f
--- /dev/null
+++ b/UI/WTContour.py
@@ -0,0 +1,782 @@
+import numpy as np
+import matplotlib.cm as cm
+from matplotlib.dates import DateFormatter, num2date
+from datetime import datetime
+
+
+class WTContour(object):
+    """Class to generate the color contour plot of water speed data.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+            Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    hover_connection: int
+        Index to data cursor connection
+    annot: Annotation
+        Annotation object for data cursor
+    x_plt: np.ndarray()
+        Array of values used for x-axis
+    cell_plt: np.ndarray(float)
+        Cell depths to plot in user specified units
+    speed_plt: np.ndarray(float)
+        Water speeds to plot in user specified units
+    x_axis_type: str
+        Identifies x-axis type (L-lenght, E-ensemble, T-time)
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.hover_connection = None
+        self.annot = None
+        self.x_plt = None
+        self.cell_plt = None
+        self.speed_plt = None
+        self.data_quiver = None
+        self.x_axis_type = "E"
+
+    def create(
+        self,
+        transect,
+        units,
+        invalid_data=None,
+        n_ensembles=None,
+        edge_start=None,
+        max_limit=0,
+        color_map="viridis",
+        x_axis_type=None,
+        data_type="Processed",
+        data_quiver=None,
+        bed_profiles=None,
+    ):
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        transect: TransectData or MapData
+            Object of TransectData/MapData containing boat speeds to be plotted
+        units: dict
+            Dictionary of units conversions
+        invalid_data: np.array(bool)
+            Array indicating which depth cells contain invalid data
+        n_ensembles: int
+            Number of ensembles in edge for edge graph
+        edge_start: bool, None
+            Transect started on left bank
+        max_limit: float
+            Maximum limit for colorbar. Used to keep scale consistent when
+             multiple contours on same page.
+        color_map: str
+            Defines the color map to be used in the color contour plot
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        color_map: str
+            Defines the color map to be used in the color contour plot
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time, MAP)
+        data_type: str
+            Specifies data type to be be plotted  (Processed, Filtered, Primary velocity or Streamwise velocity)
+        data_quiver: dict
+            Dictionary with quiver data (secondary/transverse velocity)
+        bed_profiles: dict
+            Dictionary with transects' bed profile
+        """
+
+        # Set default axis
+        if x_axis_type is None:
+            x_axis_type = "E"
+        self.x_axis_type = x_axis_type
+
+        # Assign and save parameters
+        self.units = units
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.08, bottom=0.2, right=1, top=0.97, wspace=0.1, hspace=0
+        )
+
+        # Compute x axis data
+        x = []
+        if x_axis_type == "L":
+            boat_track = transect.boat_vel.compute_boat_track(transect=transect)
+            if not np.alltrue(np.isnan(boat_track["track_x_m"])):
+                x = boat_track["distance_m"] * units["L"]
+
+        elif x_axis_type == "E":
+            x = np.arange(1, len(transect.depths.bt_depths.depth_processed_m) + 1)
+        elif x_axis_type == "T":
+            timestamp = (
+                np.nancumsum(transect.date_time.ens_duration_sec)
+                + transect.date_time.start_serial_time
+            )
+            x = np.copy(timestamp)
+        elif x_axis_type == "MAP":
+            x = (transect.borders_ens[1:] + transect.borders_ens[:-1]) / 2 * units["L"]
+
+        if n_ensembles is None or n_ensembles > 0:
+            if edge_start is None:
+                (
+                    x_plt,
+                    cell_plt,
+                    speed_plt,
+                    ensembles,
+                    depth,
+                ) = self.color_contour_data_prep(
+                    transect=transect,
+                    data_type=data_type,
+                    invalid_data=invalid_data,
+                    n_ensembles=n_ensembles,
+                    x_1d=x,
+                )
+            else:
+                (
+                    x_plt,
+                    cell_plt,
+                    speed_plt,
+                    ensembles,
+                    depth,
+                ) = self.color_contour_data_prep(
+                    transect=transect,
+                    data_type="Raw",
+                    invalid_data=invalid_data,
+                    n_ensembles=n_ensembles,
+                    edge_start=edge_start,
+                    x_1d=x,
+                )
+
+            if x_axis_type == "T":
+                self.x_plt = np.zeros(x_plt.shape, dtype="object")
+                for r in range(x_plt.shape[0]):
+                    for c in range(x_plt.shape[1]):
+                        self.x_plt[r, c] = datetime.utcfromtimestamp(x_plt[r, c])
+                x = []
+                for stamp in timestamp:
+                    x.append(datetime.utcfromtimestamp(stamp))
+                x = np.array(x)
+
+            else:
+                self.x_plt = x_plt
+
+            # Use only specified ensembles, required for edges
+            x = x[ensembles]
+            if x_axis_type == "MAP":
+                if transect.left_geometry is not None:
+                    if transect.left_geometry[1] == 0.3535:
+                        depth = np.insert(depth, 0, 0)
+                        x = np.insert(x, 0, transect.borders_ens[0] * self.units["L"])
+                    elif transect.left_geometry[1] == 0.91:
+                        depth = np.insert(depth, 0, [0, transect.depths[0]])
+                        x = np.insert(
+                            x,
+                            0,
+                            [
+                                transect.borders_ens[0] * self.units["L"],
+                                transect.borders_ens[0] * self.units["L"],
+                            ],
+                        )
+                if transect.right_geometry is not None:
+                    if transect.right_geometry[1] == 0.3535:
+                        depth = np.append(depth, 0)
+                        x = np.append(x, transect.borders_ens[-1] * self.units["L"])
+                    elif transect.left_geometry[1] == 0.91:
+                        depth = np.append(depth, [transect.depths[-1], 0])
+                        x = np.append(
+                            x,
+                            [
+                                transect.borders_ens[-1] * self.units["L"],
+                                transect.borders_ens[-1] * self.units["L"],
+                            ],
+                        )
+
+            if cell_plt is None:
+                return 0
+
+            self.cell_plt = cell_plt * self.units["L"]
+            self.speed_plt = speed_plt * self.units["V"]
+
+            # Determine limits for color map
+            min_limit = 0
+            if max_limit == 0:
+                if np.sum(speed_plt[speed_plt > -900]) > 0:
+                    max_limit = np.percentile(
+                        speed_plt[speed_plt > -900] * units["V"], 99
+                    )
+                else:
+                    max_limit = 1
+
+            # Create color map
+            cmap = cm.get_cmap(color_map)
+            cmap.set_under("white")
+
+            # Generate color contour
+            c = self.fig.ax.pcolormesh(
+                self.x_plt,
+                self.cell_plt,
+                self.speed_plt,
+                cmap=cmap,
+                vmin=min_limit,
+                vmax=max_limit,
+            )
+
+            # Add color bar and axis labels
+            cb = self.fig.colorbar(c, pad=0.02)
+            if x_axis_type == "MAP":
+                cb.ax.set_ylabel(data_type + " " + units["label_V"])
+            else:
+                cb.ax.set_ylabel(self.canvas.tr("Water Speed ") + units["label_V"])
+            cb.ax.yaxis.label.set_fontsize(12)
+            cb.ax.tick_params(labelsize=12)
+            self.fig.ax.invert_yaxis()
+
+            # Plot depth
+            self.fig.ax.plot(x, depth * units["L"], color="k")
+
+            # Plot quiver if available
+            if data_quiver is not None:
+                if data_quiver["scale"] is not None:
+                    q = self.fig.ax.quiver(
+                        data_quiver["x"] * units["L"],
+                        data_quiver["z"] * units["L"],
+                        data_quiver["vy"] * units["V"],
+                        data_quiver["vz"] * units["V"],
+                        units="inches",
+                        scale=5 * data_quiver["scale"],
+                        pivot="tail",
+                    )
+
+                    self.fig.ax.quiverkey(
+                        q,
+                        X=0.95,
+                        Y=-0.046,
+                        U=data_quiver["scale"],
+                        label=data_quiver["label"]
+                        + "\n"
+                        + str(data_quiver["scale"])
+                        + " "
+                        + units["label_V"],
+                        labelpos="E",
+                        coordinates="axes",
+                        fontproperties={"size": 12},
+                    )
+                self.data_quiver = data_quiver
+                x_fill = np.insert(x, 0, (self.x_plt[0, 0] - self.x_plt[0, 1]) * 0.5)
+                x_fill = np.append(
+                    x_fill,
+                    self.x_plt[0, -1] + (self.x_plt[0, -1] - self.x_plt[0, -2]) * 0.5,
+                )
+                # axis_buffer = np.nanmax(x_plt[0, :]) - np.nanmin(x_plt[0, :])
+                # x_fill = np.insert(x, 0, x[0] - axis_buffer * 0.02)
+                # x_fill = np.append(x_fill, x[-1] + axis_buffer * 0.02)
+                depth_fill = np.insert(depth, 0, depth[0])
+                depth_fill = np.append(depth_fill, depth[-1])
+                self.fig.ax.fill_between(
+                    x_fill,
+                    1.15 * np.ceil(np.nanmax(self.cell_plt)),
+                    depth_fill * units["L"],
+                    color="w",
+                )
+                # TODO fix pcolormesh (bug?) which make higher/lower cells too wide
+                self.fig.ax.fill_between(
+                    x_fill,
+                    np.tile(-self.cell_plt[1, 0] * 0.5, len(x_fill)),
+                    np.tile(self.cell_plt[0, 0], len(x_fill)),
+                    color="w",
+                )
+
+            # Plot side lobe cutoff if available
+            elif transect.w_vel.sl_cutoff_m is not None:
+                depth_obj = getattr(transect.depths, transect.depths.selected)
+                last_valid_cell = np.nansum(transect.w_vel.cells_above_sl, axis=0) - 1
+                last_depth_cell_size = depth_obj.depth_cell_size_m[
+                    last_valid_cell, np.arange(depth_obj.depth_cell_size_m.shape[1])
+                ]
+                y_plt_sl = (
+                    transect.w_vel.sl_cutoff_m + (last_depth_cell_size * 0.5)
+                ) * units["L"]
+                y_plt_top = (
+                    depth_obj.depth_cell_depth_m[0, :]
+                    - (depth_obj.depth_cell_size_m[0, :] * 0.5)
+                ) * units["L"]
+
+                if edge_start is True:
+                    y_plt_sl = y_plt_sl[: int(n_ensembles)]
+                    y_plt_top = y_plt_top[: int(n_ensembles)]
+                elif edge_start is False:
+                    y_plt_sl = y_plt_sl[-int(n_ensembles) :]
+                    y_plt_top = y_plt_top[-int(n_ensembles) :]
+
+                self.fig.ax.plot(x, y_plt_sl, color="r", linewidth=0.5)
+                # Plot upper bound of measured depth cells
+                self.fig.ax.plot(x, y_plt_top, color="r", linewidth=0.5)
+
+            if bed_profiles is not None:
+                for i in range(len(bed_profiles["x"])):
+                    self.fig.ax.plot(
+                        bed_profiles["x"][i] * units["L"],
+                        bed_profiles["depth"][i] * units["L"],
+                        color="grey",
+                        linewidth=1,
+                    )
+
+            # Label and limits for y axis
+            self.fig.ax.set_ylabel(self.canvas.tr("Depth ") + units["label_L"])
+            self.fig.ax.xaxis.label.set_fontsize(12)
+            self.fig.ax.yaxis.label.set_fontsize(12)
+            self.fig.ax.tick_params(
+                axis="both",
+                direction="in",
+                bottom=True,
+                top=True,
+                left=True,
+                right=True,
+            )
+            self.fig.ax.set_ylim(top=0, bottom=1.02 * np.nanmax(depth * units["L"]))
+
+            # Label and limits for x axis
+            if x_axis_type == "L":
+                axis_buffer = np.nanmax(x_plt[0, :]) - np.nanmin(x_plt[0, :])
+                if transect.start_edge == "Right":
+                    self.fig.ax.invert_xaxis()
+                    self.fig.ax.set_xlim(
+                        right=np.nanmin(x_plt[0, :]) - axis_buffer * 0.02,
+                        left=np.nanmax(x_plt[0, :]) + axis_buffer * 0.02,
+                    )
+                else:
+                    self.fig.ax.set_xlim(
+                        left=np.nanmin(x_plt[0, :]) - axis_buffer * 0.02,
+                        right=np.nanmax(x_plt[0, :]) + axis_buffer * 0.02,
+                    )
+                self.fig.ax.set_xlabel(self.canvas.tr("Length " + units["label_L"]))
+            elif x_axis_type == "E":
+                e_rng = np.nanmax(x) - np.nanmin(x)
+                e_max = np.nanmax([np.nanmax(x) + 1, np.nanmax(x) + e_rng * 0.02])
+                e_min = np.nanmin([np.nanmin(x) - 1, np.nanmin(x) - e_rng * 0.02])
+                if transect.start_edge == "Right":
+                    self.fig.ax.invert_xaxis()
+                    self.fig.ax.set_xlim(right=e_min, left=e_max)
+                else:
+                    self.fig.ax.set_xlim(left=e_min, right=e_max)
+                self.fig.ax.set_xlabel(self.canvas.tr("Ensembles"))
+            elif x_axis_type == "T":
+                axis_buffer = (x_plt[0, -1] - x_plt[0, 0]) * 0.02
+                if transect.start_edge == "Right":
+                    self.fig.ax.invert_xaxis()
+                    self.fig.ax.set_xlim(
+                        right=datetime.utcfromtimestamp(x_plt[0, 0] - axis_buffer),
+                        left=datetime.utcfromtimestamp(x_plt[0, -1] + axis_buffer),
+                    )
+                else:
+                    self.fig.ax.set_xlim(
+                        left=datetime.utcfromtimestamp(x_plt[0, 0] - axis_buffer),
+                        right=datetime.utcfromtimestamp(x_plt[0, -1] + axis_buffer),
+                    )
+                date_form = DateFormatter("%H:%M:%S")
+                self.fig.ax.xaxis.set_major_formatter(date_form)
+                self.fig.autofmt_xdate()
+                self.fig.subplots_adjust(
+                    left=0.08, bottom=0.3, right=1, top=0.97, wspace=0.1, hspace=0
+                )
+                self.fig.ax.set_xlabel(self.canvas.tr("Time"))
+            elif x_axis_type == "MAP":
+                axis_buffer = np.nanmax(x_plt[0, :]) - np.nanmin(x_plt[0, :])
+                self.fig.ax.set_xlim(
+                    left=np.nanmin(x_plt[0, :]) - axis_buffer * 0.02,
+                    right=np.nanmax(x_plt[0, :]) + axis_buffer * 0.02,
+                )
+                self.fig.ax.set_xlabel(self.canvas.tr("Length " + units["label_L"]))
+
+            # Initialize annotation for data cursor
+            self.annot = self.fig.ax.annotate(
+                "",
+                xy=(0, 0),
+                xytext=(-20, 20),
+                textcoords="offset points",
+                bbox=dict(boxstyle="round", fc="w"),
+                arrowprops=dict(arrowstyle="->"),
+            )
+
+            self.annot.set_visible(False)
+
+            self.canvas.draw()
+        else:
+            max_limit = 0
+        return max_limit
+
+    @staticmethod
+    def color_contour_data_prep(
+        transect,
+        data_type="Processed",
+        invalid_data=None,
+        n_ensembles=None,
+        edge_start=None,
+        x_1d=None,
+    ):
+        """Modifies the selected data from transect into arrays matching the meshgrid format for
+        creating contour or color plots.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData containing data to be plotted
+        data_type: str
+            Specifies Processed or Filtered data type to be be plotted
+        invalid_data: np.ndarray(bool)
+            Array indicating what data are invalid
+        n_ensembles: int
+            Number of ensembles to plot. Used for edge contour plot.
+        edge_start: bool
+            Indicates if transect starts on left edge
+        x_1d: np.array
+            Array of x-coordinates for each ensemble
+
+        Returns
+        -------
+        x_plt: np.array
+            Data in meshgrid format used for the contour x variable
+        cell_plt: np.array
+            Data in meshgrid format used for the contour y variable
+        speed_plt: np.array
+            Data in meshgrid format used to determine colors in plot
+        ensembles: np.array
+            Ensemble numbers used as the x variable to plot the cross section
+            bottom
+        depth: np.array
+            Depth data used to plot the cross section bottom
+        """
+        if data_type in ["Primary velocity", "Streamwise velocity"]:
+            if transect.total_discharge is not None:
+                in_transect_idx = np.arange(transect.primary_velocity.shape[1])
+            else:
+                return None, None, None, None, None
+        else:
+            in_transect_idx = transect.in_transect_idx
+        water_speed = None
+
+        if x_1d is None:
+            x_1d = in_transect_idx
+
+        # Get data from transect
+        if n_ensembles is None:
+            # Use whole transect
+            if data_type == "Processed":
+                water_u = transect.w_vel.u_processed_mps[:, in_transect_idx]
+                water_v = transect.w_vel.v_processed_mps[:, in_transect_idx]
+            elif data_type == "Primary velocity":
+                water_speed = transect.primary_velocity
+            elif data_type == "Streamwise velocity":
+                water_speed = transect.streamwise_velocity
+            else:
+                water_u = transect.w_vel.u_mps[:, in_transect_idx]
+                water_v = transect.w_vel.v_mps[:, in_transect_idx]
+
+            if data_type in ["Primary velocity", "Streamwise velocity"]:
+                depth = transect.depths
+                # cell_depth = transect.depth_cells_center
+                cell_depth = np.tile(np.nan, transect.depth_cells_center.shape)
+                cell_size = np.tile(np.nan, cell_depth.shape)
+                size = transect.main_depth_layers[1:] - transect.main_depth_layers[:-1]
+                d = (
+                    transect.main_depth_layers[1:] + transect.main_depth_layers[:-1]
+                ) / 2
+                for n in range(cell_depth.shape[1]):
+                    cell_depth[:, n] = d
+                    cell_size[:, n] = size
+            else:
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+                depth = depth_selected.depth_processed_m[in_transect_idx]
+                cell_depth = depth_selected.depth_cell_depth_m[:, in_transect_idx]
+                cell_size = depth_selected.depth_cell_size_m[:, in_transect_idx]
+            ensembles = in_transect_idx
+            x_data = x_1d
+        else:
+            # Use only edge ensembles from transect
+            n_ensembles = int(n_ensembles)
+            if edge_start:
+                # Start on left bank
+                if data_type == "Processed":
+                    water_u = transect.w_vel.u_processed_mps[:, :n_ensembles]
+                    water_v = transect.w_vel.v_processed_mps[:, :n_ensembles]
+                else:
+                    water_u = transect.w_vel.u_mps[:, :n_ensembles]
+                    water_v = transect.w_vel.v_mps[:, :n_ensembles]
+
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+                depth = depth_selected.depth_processed_m[:n_ensembles]
+                cell_depth = depth_selected.depth_cell_depth_m[:, :n_ensembles]
+                cell_size = depth_selected.depth_cell_size_m[:, :n_ensembles]
+                ensembles = in_transect_idx[:n_ensembles]
+                x_data = x_1d[:n_ensembles]
+                if invalid_data is not None:
+                    invalid_data = invalid_data[:, :n_ensembles]
+            else:
+                # Start on right bank
+                if data_type == "Processed":
+                    water_u = transect.w_vel.u_processed_mps[:, -n_ensembles:]
+                    water_v = transect.w_vel.v_processed_mps[:, -n_ensembles:]
+                else:
+                    water_u = transect.w_vel.u_mps[:, -n_ensembles:]
+                    water_v = transect.w_vel.v_mps[:, -n_ensembles:]
+
+                depth_selected = getattr(transect.depths, transect.depths.selected)
+                depth = depth_selected.depth_processed_m[-n_ensembles:]
+                cell_depth = depth_selected.depth_cell_depth_m[:, -n_ensembles:]
+                cell_size = depth_selected.depth_cell_size_m[:, -n_ensembles:]
+                ensembles = in_transect_idx[-n_ensembles:]
+                x_data = x_1d[-n_ensembles:]
+                if invalid_data is not None:
+                    invalid_data = invalid_data[:, -n_ensembles:]
+
+        # Prep water speed to use -999 instead of nans
+        if water_speed is None:
+            water_speed = np.sqrt(water_u**2 + water_v**2)
+        speed = np.copy(water_speed)
+        speed[np.isnan(speed)] = -999
+        if invalid_data is not None:
+            speed[invalid_data] = -999
+
+        # Set x variable to ensembles
+        x = np.tile(x_data, (cell_size.shape[0], 1))
+        n_ensembles = x.shape[1]
+
+        # Prep data in x direction
+        j = -1
+        x_xpand = np.tile(np.nan, (cell_size.shape[0], 2 * cell_size.shape[1]))
+        cell_depth_xpand = np.tile(np.nan, (cell_size.shape[0], 2 * cell_size.shape[1]))
+        cell_size_xpand = np.tile(np.nan, (cell_size.shape[0], 2 * cell_size.shape[1]))
+        speed_xpand = np.tile(np.nan, (cell_size.shape[0], 2 * cell_size.shape[1]))
+        depth_xpand = np.array([np.nan] * (2 * cell_size.shape[1]))
+
+        # Center ensembles in grid
+        for n in range(n_ensembles):
+            if data_type in ["Primary velocity", "Streamwise velocity"]:
+                half_back = 0.5 * (
+                    transect.borders_ens[n + 1] - transect.borders_ens[n]
+                )
+                half_forward = half_back
+            else:
+                if n == 0:
+                    try:
+                        half_back = np.abs(0.5 * (x[:, n + 1] - x[:, n]))
+                        half_forward = half_back
+                    except IndexError:
+                        half_back = x[:, 0] - 0.5
+                        half_forward = x[:, 0] + 0.5
+                elif n == n_ensembles - 1:
+                    half_forward = np.abs(0.5 * (x[:, n] - x[:, n - 1]))
+                    half_back = half_forward
+                else:
+                    half_back = np.abs(0.5 * (x[:, n] - x[:, n - 1]))
+                    half_forward = np.abs(0.5 * (x[:, n + 1] - x[:, n]))
+            j += 1
+            x_xpand[:, j] = x[:, n] - half_back
+            cell_depth_xpand[:, j] = cell_depth[:, n]
+            speed_xpand[:, j] = speed[:, n]
+            cell_size_xpand[:, j] = cell_size[:, n]
+            depth_xpand[j] = depth[n]
+            j += 1
+            x_xpand[:, j] = x[:, n] + half_forward
+            cell_depth_xpand[:, j] = cell_depth[:, n]
+            speed_xpand[:, j] = speed[:, n]
+            cell_size_xpand[:, j] = cell_size[:, n]
+            depth_xpand[j] = depth[n]
+
+        # Create plotting mesh grid
+        n_cells = x.shape[0]
+        j = -1
+        x_plt = np.tile(np.nan, (2 * cell_size.shape[0], 2 * cell_size.shape[1]))
+        speed_plt = np.tile(np.nan, (2 * cell_size.shape[0], 2 * cell_size.shape[1]))
+        cell_plt = np.tile(np.nan, (2 * cell_size.shape[0], 2 * cell_size.shape[1]))
+        for n in range(n_cells):
+            j += 1
+            x_plt[j, :] = x_xpand[n, :]
+            cell_plt[j, :] = cell_depth_xpand[n, :] - 0.5 * cell_size_xpand[n, :]
+            speed_plt[j, :] = speed_xpand[n, :]
+            j += 1
+            x_plt[j, :] = x_xpand[n, :]
+            cell_plt[j, :] = cell_depth_xpand[n, :] + 0.5 * cell_size_xpand[n, :]
+            speed_plt[j, :] = speed_xpand[n, :]
+
+        cell_plt[np.isnan(cell_plt)] = 0
+        speed_plt[np.isnan(speed_plt)] = -999
+        x_plt[np.isnan(x_plt)] = 0
+
+        return x_plt, cell_plt, speed_plt, ensembles, depth
+
+    def hover(self, event):
+        """Determines if the user has selected a location with data and makes
+        annotation visible and calls method to update the text of the
+        annotation. If the location is not valid the existing annotation is hidden.
+
+        Parameters
+        ----------
+        event: MouseEvent
+            Triggered when mouse button is pressed.
+        """
+        # Set annotation to visible
+        vis = self.annot.get_visible()
+
+        # Determine if mouse location references a data point in the plot and
+        # update the annotation.
+        if event.inaxes == self.fig.ax:
+            cont_fig = False
+            if self.fig is not None:
+                cont_fig, ind_fig = self.fig.contains(event)
+
+            if cont_fig and self.fig.get_visible():
+                if self.x_axis_type == "T":
+                    col_idx = np.where(
+                        self.x_plt[0, :] < num2date(event.xdata).replace(tzinfo=None)
+                    )[0][-1]
+                elif self.x_axis_type == "L":
+                    col_idx = np.where(self.x_plt[0, :] < event.xdata)[0][-1]
+                elif self.x_axis_type == "E":
+                    col_idx = (int(round(abs(event.xdata - self.x_plt[0, 0]))) * 2) - 1
+                else:
+                    col_idx = np.where(self.x_plt[0, :] < event.xdata)[0][-1]
+                vel = None
+                vel_y = None
+                vel_z = None
+
+                for n, cell in enumerate(self.cell_plt[:, col_idx]):
+                    if event.ydata < cell:
+                        vel = self.speed_plt[n, col_idx]
+                        break
+
+                if self.data_quiver is not None and vel is not None:
+                    vel_y = self.data_quiver["vy"][int((n - 1) / 2), int(col_idx / 2)]
+                    vel_z = self.data_quiver["vz"][int((n - 1) / 2), int(col_idx / 2)]
+
+                self.update_annot(event.xdata, event.ydata, vel, vel_y, vel_z)
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                # If the cursor location is not associated with the plotted
+                # data hide the annotation.
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+        """Turns the connection to the mouse event on or off.
+
+        Parameters
+        ----------
+        setting: bool
+            Boolean to specify whether the connection for the mouse event is
+            active or not.
+        """
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
+
+    def update_annot(self, x, y, v, vy=None, vz=None):
+        """Updates the location and text and makes visible the previously initialized and hidden annotation.
+
+        Parameters
+        ----------
+        x: float
+            x coordinate for annotation, ensemble
+        y: float
+            y coordinate for annotation, depth
+        v: float
+            Speed for annotation
+        """
+        plt_ref = self.fig
+        pos = [x, y]
+
+        # Shift annotation box left or right depending on which half of the
+        # axis the pos x is located and the direction of x increasing.
+        if plt_ref.ax.viewLim.intervalx[0] < plt_ref.ax.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (plt_ref.ax.viewLim.intervalx[0] + plt_ref.ax.viewLim.intervalx[1])
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (plt_ref.ax.viewLim.intervalx[0] + plt_ref.ax.viewLim.intervalx[1])
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the
+        # axis the pos y is located and the direction of y increasing.
+        if plt_ref.ax.viewLim.intervaly[0] < plt_ref.ax.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (plt_ref.ax.viewLim.intervaly[0] + plt_ref.ax.viewLim.intervaly[1])
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (plt_ref.ax.viewLim.intervaly[0] + plt_ref.ax.viewLim.intervaly[1])
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+        self.annot.xy = pos
+        if v is not None and v > -999:
+            if self.x_axis_type == "T":
+                x_label = num2date(pos[0]).strftime("%H:%M:%S.%f")[:-4]
+                text = "x: {}, y: {:.2f}, \n v: {:.1f}".format(x_label, y, v)
+            elif self.x_axis_type == "E":
+                text = "x: {:.2f}, y: {:.2f}, \n v: {:.1f}".format(int(round(x)), y, v)
+            elif self.x_axis_type == "L":
+                text = "x: {:.2f}, y: {:.2f}, \n v: {:.1f}".format(x, y, v)
+            else:
+                if vy is not None:
+                    text = "x: {:.2f}, y: {:.2f}, \n v: {:.1f}, \n vy: {:.1f}, \n vz: {:.1f}".format(
+                        x, y, v, vy, vz
+                    )
+                else:
+                    text = "x: {:.2f}, y: {:.2f}, \n v: {:.1f}".format(x, y, v)
+        else:
+            if self.x_axis_type == "T":
+                x_label = num2date(pos[0]).strftime("%H:%M:%S.%f")[:-4]
+                text = "x: {}, y: {:.2f}".format(x_label, y)
+            elif self.x_axis_type == "E":
+                text = "x: {:.2f}, y: {:.2f}".format(int(round(x)), y)
+            elif self.x_axis_type == "L":
+                text = "x: {:.2f}, y: {:.2f}".format(x, y)
+            else:
+                text = "x: {:.2f}, y: {:.2f}".format(x, y)
+
+        self.annot.set_text(text)
diff --git a/UI/WTFilters.py b/UI/WTFilters.py
new file mode 100644
index 0000000000000000000000000000000000000000..44d4f3d3d2c3f2e33cee2b4382b342c5586f6ea1
--- /dev/null
+++ b/UI/WTFilters.py
@@ -0,0 +1,729 @@
+import copy
+import numpy as np
+from matplotlib.dates import DateFormatter, num2date
+from datetime import datetime
+
+
+class WTFilters(object):
+    """Class to generate time series plots of the selected filter data.
+
+    Attributes
+    ----------
+    canvas: MplCanvas
+        Object of MplCanvas a FigureCanvas
+    fig: Object
+        Figure object of the canvas
+    units: dict
+        Dictionary of units conversions
+    beam: object
+        Axis of figure for number of beams
+    error: object
+        Axis of figure for error velocity
+    vert: object
+        Axis of figure for vertical velocity
+    speed: object
+        Axis of figure for speed time series
+    snr: object
+        Axis of figure for snr filters
+    x_axis_type: str
+        Identifies x-axis type (L-lenght, E-ensemble, T-time)
+    """
+
+    def __init__(self, canvas):
+        """Initialize object using the specified canvas.
+
+        Parameters
+        ----------
+        canvas: MplCanvas
+            Object of MplCanvas
+        """
+
+        # Initialize attributes
+        self.canvas = canvas
+        self.fig = canvas.fig
+        self.units = None
+        self.beam = None
+        self.error = None
+        self.vert = None
+        self.speed = None
+        self.snr = None
+        self.hover_connection = None
+        self.x_axis_type = "E"
+
+    def create(self, transect, units, selected, x_axis_type=None):
+        """Create the axes and lines for the figure.
+
+        Parameters
+        ----------
+        transect: TransectData
+            Object of TransectData containing boat speeds to be plotted
+        units: dict
+            Dictionary of units conversions
+        selected: str
+            String identifying the type of plot
+        x_axis_type: str
+            Identifies x-axis type (L-lenght, E-ensemble, T-time)
+        """
+
+        # Set default axis
+        if x_axis_type is None:
+            x_axis_type = "E"
+        self.x_axis_type = x_axis_type
+
+        # Assign and save parameters
+        self.units = units
+
+        # Clear the plot
+        self.fig.clear()
+
+        # Configure axis
+        self.fig.ax = self.fig.add_subplot(1, 1, 1)
+
+        # Set margins and padding for figure
+        self.fig.subplots_adjust(
+            left=0.07, bottom=0.2, right=0.99, top=0.98, wspace=0.1, hspace=0
+        )
+        self.fig.ax.grid()
+        self.fig.ax.xaxis.label.set_fontsize(12)
+        self.fig.ax.yaxis.label.set_fontsize(12)
+        self.fig.ax.tick_params(
+            axis="both", direction="in", bottom=True, top=True, left=True, right=True
+        )
+
+        # Compute x axis data
+        x = None
+        if x_axis_type == "L":
+            boat_track = transect.boat_vel.compute_boat_track(transect=transect)
+            if not np.alltrue(np.isnan(boat_track["track_x_m"])):
+                x = boat_track["distance_m"] * units["L"]
+        elif x_axis_type == "E":
+            x = np.arange(1, len(transect.depths.bt_depths.depth_processed_m) + 1)
+        elif x_axis_type == "T":
+            timestamp = (
+                np.nancumsum(transect.date_time.ens_duration_sec)
+                + transect.date_time.start_serial_time
+            )
+            x = []
+            for stamp in timestamp:
+                x.append(datetime.utcfromtimestamp(stamp))
+            x = np.array(x)
+
+        x = np.tile(x, (transect.w_vel.valid_data[0, :, :].shape[0], 1))
+
+        cas = transect.w_vel.cells_above_sl
+
+        if selected == "beam":
+            # Plot beams
+            # Determine number of beams for each ensemble
+            wt_temp = copy.deepcopy(transect.w_vel)
+            wt_temp.filter_beam(4)
+            valid_4beam = wt_temp.valid_data[5, :, :].astype(int)
+            beam_data = np.copy(valid_4beam).astype(int)
+            beam_data[valid_4beam == 1] = 4
+            beam_data[wt_temp.valid_data[6, :, :]] = 4
+            beam_data[valid_4beam == 0] = 3
+            beam_data[np.logical_not(transect.w_vel.valid_data[1, :, :])] = -999
+
+            # Plot all data
+            self.beam = self.fig.ax.plot(x, beam_data, "b.")
+
+            # Circle invalid data
+            invalid_beam = np.logical_and(
+                np.logical_not(transect.w_vel.valid_data[5, :, :]), cas
+            )
+            self.beam.append(
+                self.fig.ax.plot(
+                    x[invalid_beam],
+                    beam_data[invalid_beam],
+                    "ro",
+                    ms=8,
+                    markerfacecolor="none",
+                )[0]
+            )
+
+            # Format axis
+            self.fig.ax.set_ylim(top=4.5, bottom=-0.5)
+            self.fig.ax.set_ylabel(self.canvas.tr("Number of Beams"))
+
+        elif selected == "error":
+            # Plot error velocity
+            max_y = np.nanmax(transect.w_vel.d_mps[cas]) * 1.1
+            min_y = np.nanmin(transect.w_vel.d_mps[cas]) * 1.1
+            invalid_error_vel = np.logical_and(
+                np.logical_not(transect.w_vel.valid_data[2, :, :]), cas
+            )
+
+            if transect.w_vel.ping_type.size > 1:
+                # Data to plot
+                x_data = x[cas]
+                y_data = transect.w_vel.d_mps[cas] * units["V"]
+
+                # Setup ping type
+                ping_type = transect.w_vel.ping_type[cas]
+                p_type_color = {
+                    "I": "b",
+                    "C": "#009933",
+                    "S": "#ffbf00",
+                    "1I": "b",
+                    "1C": "#009933",
+                    "3I": "#ffbf00",
+                    "3C": "#ff33cc",
+                    "BB": "b",
+                    "PC": "#009933",
+                    "PC/BB": "#ffbf00",
+                    "U": "b",
+                }
+                p_type_marker = {
+                    "I": ".",
+                    "C": "+",
+                    "S": "x",
+                    "1I": ".",
+                    "1C": "*",
+                    "3I": "+",
+                    "3C": "x",
+                    "BB": ".",
+                    "PC": "+",
+                    "PC/BB": "x",
+                    "U": ".",
+                }
+                p_types = np.unique(ping_type)
+
+                # Plot first ping type
+                self.error = self.fig.ax.plot(
+                    x_data[ping_type == p_types[0]],
+                    y_data[ping_type == p_types[0]],
+                    p_type_marker[p_types[0]],
+                    mfc=p_type_color[p_types[0]],
+                    mec=p_type_color[p_types[0]],
+                )
+
+                # Plot remaining ping types
+                if len(p_types) > 0:
+                    for p_type in p_types[1:]:
+                        self.error.append(
+                            self.fig.ax.plot(
+                                x_data[ping_type == p_type],
+                                y_data[ping_type == p_type],
+                                p_type_marker[p_type],
+                                mfc=p_type_color[p_type],
+                                mec=p_type_color[p_type],
+                            )[0]
+                        )
+
+                # Mark invalid data
+                self.error.append(
+                    self.fig.ax.plot(
+                        x[invalid_error_vel],
+                        transect.w_vel.d_mps[invalid_error_vel] * units["V"],
+                        "ro",
+                        ms=8,
+                        markerfacecolor="none",
+                    )[0]
+                )
+                # Create legend
+                legend_dict = {
+                    "I": "Incoherent",
+                    "C": "Coherent",
+                    "S": "Surface Cell",
+                    "1I": "1MHz Incoherent",
+                    "1C": "1 MHz HD",
+                    "3I": "3 MHz Incoherent",
+                    "3C": "3 MHz HD",
+                    "BB": "BB",
+                    "PC": "PC",
+                    "PC/BB": "PC/BB",
+                    "U": "N/U",
+                }
+                legend_txt = []
+                for p_type in p_types:
+                    legend_txt.append(legend_dict[p_type])
+                self.fig.ax.legend(legend_txt)
+
+            else:
+                self.error = self.fig.ax.plot(
+                    x[cas], transect.w_vel.d_mps[cas] * units["V"], "b."
+                )
+                self.error.append(
+                    self.fig.ax.plot(
+                        x[invalid_error_vel],
+                        transect.w_vel.d_mps[invalid_error_vel] * units["V"],
+                        "ro",
+                        markerfacecolor="none",
+                    )[0]
+                )
+
+            # Scale axes
+            self.fig.ax.set_ylim(top=max_y * units["V"], bottom=min_y * units["V"])
+            self.fig.ax.set_ylabel(
+                self.canvas.tr("Error Velocity" + self.units["label_V"])
+            )
+
+        elif selected == "vert":
+            # Plot vertical velocity
+            max_y = np.nanmax(transect.w_vel.w_mps[cas]) * 1.1
+            min_y = np.nanmin(transect.w_vel.w_mps[cas]) * 1.1
+            invalid_vert_vel = np.logical_and(
+                np.logical_not(transect.w_vel.valid_data[3, :, :]), cas
+            )
+
+            if transect.w_vel.ping_type.size > 1:
+                # Data to plot
+                x_data = x[cas]
+                y_data = transect.w_vel.w_mps[cas] * units["V"]
+
+                # Setup ping types for plotting
+                ping_type = transect.w_vel.ping_type[cas]
+                p_type_color = {
+                    "I": "b",
+                    "C": "#009933",
+                    "S": "#ffbf00",
+                    "1I": "b",
+                    "1C": "#009933",
+                    "3I": "#ffbf00",
+                    "3C": "#ff33cc",
+                    "BB": "b",
+                    "PC": "#009933",
+                    "PC/BB": "#ffbf00",
+                    "U": "b",
+                }
+                p_type_marker = {
+                    "I": ".",
+                    "C": "+",
+                    "S": "x",
+                    "1I": ".",
+                    "1C": "*",
+                    "3I": "+",
+                    "3C": "x",
+                    "BB": ".",
+                    "PC": "+",
+                    "PC/BB": "x",
+                    "U": ".",
+                }
+                p_types = np.unique(ping_type)
+
+                # Plot first ping type
+                self.vert = self.fig.ax.plot(
+                    x_data[ping_type == p_types[0]],
+                    y_data[ping_type == p_types[0]],
+                    p_type_marker[p_types[0]],
+                    mfc=p_type_color[p_types[0]],
+                    mec=p_type_color[p_types[0]],
+                )
+
+                # Plot remaining ping types
+                if len(p_types) > 0:
+                    for p_type in p_types[1:]:
+                        self.vert.append(
+                            self.fig.ax.plot(
+                                x_data[ping_type == p_type],
+                                y_data[ping_type == p_type],
+                                p_type_marker[p_type],
+                                mfc=p_type_color[p_type],
+                                mec=p_type_color[p_type],
+                            )[0]
+                        )
+
+                # Mark invalid data
+                self.vert.append(
+                    self.fig.ax.plot(
+                        x[invalid_vert_vel],
+                        transect.w_vel.w_mps[invalid_vert_vel] * units["V"],
+                        "ro",
+                        ms=8,
+                        markerfacecolor="none",
+                    )[0]
+                )
+
+                # Create legend
+                legend_dict = {
+                    "I": "Incoherent",
+                    "C": "Coherent",
+                    "S": "Surface Cell",
+                    "1I": "1MHz Incoherent",
+                    "1C": "1 MHz HD",
+                    "3I": "3 MHz Incoherent",
+                    "3C": "3 MHz HD",
+                    "BB": "BB",
+                    "PC": "PC",
+                    "PC/BB": "PC/BB",
+                    "U": "N/U",
+                }
+                legend_txt = []
+                for p_type in p_types:
+                    legend_txt.append(legend_dict[p_type])
+                self.fig.ax.legend(legend_txt)
+
+            else:
+                self.vert = self.fig.ax.plot(
+                    x[cas], transect.w_vel.w_mps[cas] * units["V"], "b."
+                )
+                self.vert.append(
+                    self.fig.ax.plot(
+                        x[invalid_vert_vel],
+                        transect.w_vel.w_mps[invalid_vert_vel] * units["V"],
+                        "ro",
+                        markerfacecolor="none",
+                    )[0]
+                )
+
+            # Scale axes
+            self.fig.ax.set_ylim(top=max_y * units["V"], bottom=min_y * units["V"])
+            self.fig.ax.set_ylabel(
+                self.canvas.tr("Vert. Velocity" + self.units["label_V"])
+            )
+
+        elif selected == "snr":
+            # Plot snr
+            max_y = np.nanmax(transect.w_vel.snr_rng) * 1.1
+            min_y = np.nanmin(transect.w_vel.snr_rng) * 1.1
+            invalid_snr = np.logical_and(
+                np.logical_not(transect.w_vel.valid_data[7, 0, :]), cas
+            )[0, :]
+
+            if transect.w_vel.ping_type.size > 1:
+                # Data to plot
+                x_data = x[0, cas[0, :]]
+                y_data = transect.w_vel.snr_rng[cas[0, :]]
+
+                # Setup ping types for plotting
+                ping_type = transect.w_vel.ping_type[0, cas[0, :]]
+                p_type_color = {
+                    "I": "b",
+                    "C": "#009933",
+                    "S": "#ffbf00",
+                    "1I": "b",
+                    "1C": "#009933",
+                    "3I": "#ffbf00",
+                    "3C": "#ff33cc",
+                    "BB": "b",
+                    "PC": "#009933",
+                    "PC/BB": "#ffbf00",
+                    "U": "b",
+                }
+                p_type_marker = {
+                    "I": ".",
+                    "C": "+",
+                    "S": "x",
+                    "1I": ".",
+                    "1C": "*",
+                    "3I": "+",
+                    "3C": "x",
+                    "BB": ".",
+                    "PC": "+",
+                    "PC/BB": "x",
+                    "U": ".",
+                }
+                p_types = np.unique(ping_type)
+
+                # Plot first ping type
+                self.snr = self.fig.ax.plot(
+                    x_data[ping_type == p_types[0]],
+                    y_data[ping_type == p_types[0]],
+                    p_type_marker[p_types[0]],
+                    mfc=p_type_color[p_types[0]],
+                    mec=p_type_color[p_types[0]],
+                )
+
+                # Plot remaining ping types
+                if len(p_types) > 0:
+                    for p_type in p_types[1:]:
+                        self.snr.append(
+                            self.fig.ax.plot(
+                                x_data[ping_type == p_type],
+                                y_data[ping_type == p_type],
+                                p_type_marker[p_type],
+                                mfc=p_type_color[p_type],
+                                mec=p_type_color[p_type],
+                            )[0]
+                        )
+
+                # Mark invalid data
+                self.snr.append(
+                    self.fig.ax.plot(
+                        x[0, invalid_snr],
+                        transect.w_vel.snr_rng[invalid_snr],
+                        "ro",
+                        ms=8,
+                        markerfacecolor="none",
+                    )[0]
+                )
+
+                # Create legend
+                legend_dict = {
+                    "I": "Incoherent",
+                    "C": "Coherent",
+                    "S": "Surface Cell",
+                    "1I": "1MHz Incoherent",
+                    "1C": "1 MHz HD",
+                    "3I": "3 MHz Incoherent",
+                    "3C": "3 MHz HD",
+                    "BB": "BB",
+                    "PC": "PC",
+                    "PC/BB": "PC/BB",
+                    "U": "N/U",
+                }
+                legend_txt = []
+                for p_type in p_types:
+                    legend_txt.append(legend_dict[p_type])
+                self.fig.ax.legend(legend_txt)
+
+            else:
+                self.snr = self.fig.ax.plot(x[0, :], transect.w_vel.snr_rng, "b.")
+                self.snr.append(
+                    self.fig.ax.plot(
+                        x[0, invalid_snr],
+                        transect.w_vel.snr_rng[invalid_snr],
+                        "ro",
+                        markerfacecolor="none",
+                    )[0]
+                )
+
+            # Scale axes
+            self.fig.ax.set_ylim(top=max_y, bottom=min_y)
+            self.fig.ax.set_ylabel(self.canvas.tr("SNR Range (dB)"))
+
+        elif selected == "speed":
+            # Plot speed
+            speed = np.nanmean(
+                np.sqrt(transect.w_vel.u_mps**2 + transect.w_vel.v_mps**2), 0
+            )
+            max_y = np.nanmax(speed) * 1.1
+            # min_y = np.nanmin(speed) * 0.7
+            min_y = 0
+            invalid_wt = np.logical_and(np.logical_not(transect.w_vel.valid_data), cas)
+
+            self.speed = self.fig.ax.plot(x[0, :], speed * self.units["V"], "b")
+            self.speed.append(
+                self.fig.ax.plot(
+                    x[0, np.any(invalid_wt[1, :, :], 0)],
+                    speed[np.any(invalid_wt[1, :, :], 0)] * units["V"],
+                    "k",
+                    linestyle="",
+                    marker="$O$",
+                )[0]
+            )
+            self.speed.append(
+                self.fig.ax.plot(
+                    x[0, np.any(invalid_wt[2, :, :], 0)],
+                    speed[np.any(invalid_wt[2, :, :], 0)] * units["V"],
+                    "k",
+                    linestyle="",
+                    marker="$E$",
+                )[0]
+            )
+            self.speed.append(
+                self.fig.ax.plot(
+                    x[0, np.any(invalid_wt[3, :, :], 0)],
+                    speed[np.any(invalid_wt[3, :, :], 0)] * units["V"],
+                    "k",
+                    linestyle="",
+                    marker="$V$",
+                )[0]
+            )
+            self.speed.append(
+                self.fig.ax.plot(
+                    x[0, np.any(invalid_wt[5, :, :], 0)],
+                    speed[np.any(invalid_wt[5, :, :], 0)] * units["V"],
+                    "k",
+                    linestyle="",
+                    marker="$B$",
+                )[0]
+            )
+            self.speed.append(
+                self.fig.ax.plot(
+                    x[0, np.any(invalid_wt[7, :, :], 0)],
+                    speed[np.any(invalid_wt[7, :, :], 0)] * units["V"],
+                    "k",
+                    linestyle="",
+                    marker="$R$",
+                )[0]
+            )
+
+            self.fig.ax.set_ylabel(self.canvas.tr("Speed" + self.units["label_V"]))
+            try:
+                self.fig.ax.set_ylim(top=max_y * units["V"], bottom=min_y * units["V"])
+            except ValueError:
+                pass
+
+        if x_axis_type == "L":
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(
+                    right=-1 * x[0, -1] * 0.02 * units["L"],
+                    left=x[0, -1] * 1.02 * units["L"],
+                )
+            else:
+                self.fig.ax.set_xlim(
+                    left=-1 * x[0, -1] * 0.02 * units["L"],
+                    right=x[0, -1] * 1.02 * units["L"],
+                )
+            self.fig.ax.set_xlabel(self.canvas.tr("Length" + units["label_L"]))
+        elif x_axis_type == "E":
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(right=0, left=x[0, -1] + 1)
+            else:
+                self.fig.ax.set_xlim(left=0, right=x[0, -1] + 1)
+            self.fig.ax.set_xlabel(self.canvas.tr("Ensembles"))
+        elif x_axis_type == "T":
+            axis_buffer = (timestamp[-1] - timestamp[0]) * 0.02
+            if transect.start_edge == "Right":
+                self.fig.ax.invert_xaxis()
+                self.fig.ax.set_xlim(
+                    right=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                    left=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                )
+            else:
+                self.fig.ax.set_xlim(
+                    left=datetime.utcfromtimestamp(timestamp[0] - axis_buffer),
+                    right=datetime.utcfromtimestamp(timestamp[-1] + axis_buffer),
+                )
+            date_form = DateFormatter("%H:%M:%S")
+            self.fig.ax.xaxis.set_major_formatter(date_form)
+            self.fig.ax.set_xlabel(self.canvas.tr("Time"))
+
+        # Initialize annotation for data cursor
+        self.annot = self.fig.ax.annotate(
+            "",
+            xy=(0, 0),
+            xytext=(-20, 20),
+            textcoords="offset points",
+            bbox=dict(boxstyle="round", fc="w"),
+            arrowprops=dict(arrowstyle="->"),
+        )
+
+        self.annot.set_visible(False)
+
+        self.canvas.draw()
+
+    def update_annot(self, ind, plt_ref):
+
+        pos = plt_ref._xy[ind["ind"][0]]
+        # Shift annotation box left or right depending on which half of the axis
+        # the pos x is located and the direction of x increasing.
+        if plt_ref.axes.viewLim.intervalx[0] < plt_ref.axes.viewLim.intervalx[1]:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -20
+            else:
+                self.annot._x = -80
+        else:
+            if (
+                pos[0]
+                < (
+                    plt_ref.axes.viewLim.intervalx[0]
+                    + plt_ref.axes.viewLim.intervalx[1]
+                )
+                / 2
+            ):
+                self.annot._x = -80
+            else:
+                self.annot._x = -20
+
+        # Shift annotation box up or down depending on which half of the axis
+        # the pos y is located and the direction of y increasing.
+        if plt_ref.axes.viewLim.intervaly[0] < plt_ref.axes.viewLim.intervaly[1]:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = -40
+            else:
+                self.annot._y = 20
+        else:
+            if (
+                pos[1]
+                > (
+                    plt_ref.axes.viewLim.intervaly[0]
+                    + plt_ref.axes.viewLim.intervaly[1]
+                )
+                / 2
+            ):
+                self.annot._y = 20
+            else:
+                self.annot._y = -40
+
+        self.annot.xy = pos
+
+        # Format and display text
+        if self.x_axis_type == "T":
+            x_label = num2date(pos[0]).strftime("%H:%M:%S.%f")[:-4]
+            text = "x: {}, y: {:.2f}".format(x_label, pos[1])
+        else:
+            text = "x: {:.2f}, y: {:.2f}".format(pos[0], pos[1])
+        self.annot.set_text(text)
+
+    def hover(self, event):
+        vis = self.annot.get_visible()
+        if event.inaxes == self.fig.ax:
+            cont_beam = False
+            cont_error = False
+            cont_vert = False
+            cont_speed = False
+            cont_snr = False
+            if self.beam is not None:
+                for n, beam in enumerate(self.beam):
+                    cont_beam, ind_beam = beam.contains(event)
+                    if cont_beam:
+                        break
+            elif self.error is not None:
+                for n, err in enumerate(self.error):
+                    cont_error, ind_error = err.contains(event)
+                    if cont_error:
+                        break
+            elif self.vert is not None:
+                for n, vert in enumerate(self.vert):
+                    cont_vert, ind_vert = vert.contains(event)
+                    if cont_vert:
+                        break
+            elif self.speed is not None:
+                cont_speed, ind_other = self.speed[0].contains(event)
+            elif self.snr is not None:
+                cont_snr, ind_snr = self.snr[0].contains(event)
+
+            if cont_beam:
+                self.update_annot(ind_beam, self.beam[n])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_error:
+                self.update_annot(ind_error, self.error[n])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_vert:
+                self.update_annot(ind_vert, self.vert[n])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_speed:
+                self.update_annot(ind_other, self.speed[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            elif cont_snr:
+                self.update_annot(ind_snr, self.snr[0])
+                self.annot.set_visible(True)
+                self.canvas.draw_idle()
+            else:
+                if vis:
+                    self.annot.set_visible(False)
+                    self.canvas.draw_idle()
+
+    def set_hover_connection(self, setting):
+
+        if setting and self.hover_connection is None:
+            self.hover_connection = self.canvas.mpl_connect(
+                "button_press_event", self.hover
+            )
+        elif not setting:
+            self.canvas.mpl_disconnect(self.hover_connection)
+            self.hover_connection = None
+            self.annot.set_visible(False)
+            self.canvas.draw_idle()
diff --git a/UI/__init__.py b/UI/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/UI/dsm.qrc b/UI/dsm.qrc
new file mode 100644
index 0000000000000000000000000000000000000000..e43b7464dc99f48139ffe875944cc29be19cbf34
--- /dev/null
+++ b/UI/dsm.qrc
@@ -0,0 +1,328 @@
+<RCC>
+  <qresource prefix="/images">
+    <file>24x24/check-mark-green.png</file>
+    <file>24x24/check-mark-orange.png</file>
+    <file>24x24/3d bar chart.png</file>
+    <file>24x24/Abort.png</file>
+    <file>24x24/About.png</file>
+    <file>24x24/Accounting.png</file>
+    <file>24x24/Add.png</file>
+    <file>24x24/Address book.png</file>
+    <file>24x24/Alarm clock.png</file>
+    <file>24x24/Alarm.png</file>
+    <file>24x24/Alert.png</file>
+    <file>24x24/Alien.png</file>
+    <file>24x24/Anchor.png</file>
+    <file>24x24/Application.png</file>
+    <file>24x24/Apply.png</file>
+    <file>24x24/Back.png</file>
+    <file>24x24/Bad mark.png</file>
+    <file>24x24/Bee.png</file>
+    <file>24x24/Black bookmark.png</file>
+    <file>24x24/Black pin.png</file>
+    <file>24x24/Black tag.png</file>
+    <file>24x24/Blog.png</file>
+    <file>24x24/Blue bookmark.png</file>
+    <file>24x24/Blue key.png</file>
+    <file>24x24/Blue pin.png</file>
+    <file>24x24/Blue tag.png</file>
+    <file>24x24/Bomb.png</file>
+    <file>24x24/Bookmark.png</file>
+    <file>24x24/Boss.png</file>
+    <file>24x24/Bottom.png</file>
+    <file>24x24/Briefcase.png</file>
+    <file>24x24/Brush.png</file>
+    <file>24x24/Bubble.png</file>
+    <file>24x24/Buy.png</file>
+    <file>24x24/Calculator.png</file>
+    <file>24x24/Calendar.png</file>
+    <file>24x24/Car key.png</file>
+    <file>24x24/CD.png</file>
+    <file>24x24/Clipboard.png</file>
+    <file>24x24/Clock.png</file>
+    <file>24x24/Close.png</file>
+    <file>24x24/Coin.png</file>
+    <file>24x24/Comment.png</file>
+    <file>24x24/Company.png</file>
+    <file>24x24/Compass.png</file>
+    <file>24x24/Component.png</file>
+    <file>24x24/Computer.png</file>
+    <file>24x24/Copy.png</file>
+    <file>24x24/Create.png</file>
+    <file>24x24/Cut.png</file>
+    <file>24x24/Danger.png</file>
+    <file>24x24/Database.png</file>
+    <file>24x24/Delete.png</file>
+    <file>24x24/Delivery.png</file>
+    <file>24x24/Diagram.png</file>
+    <file>24x24/Dial.png</file>
+    <file>24x24/Disaster.png</file>
+    <file>24x24/Display.png</file>
+    <file>24x24/Dollar.png</file>
+    <file>24x24/Door.png</file>
+    <file>24x24/Down.png</file>
+    <file>24x24/Download.png</file>
+    <file>24x24/Downloads folder.png</file>
+    <file>24x24/Earth.png</file>
+    <file>24x24/Eject.png</file>
+    <file>24x24/E-mail.png</file>
+    <file>24x24/Equipment.png</file>
+    <file>24x24/Erase.png</file>
+    <file>24x24/Error.png</file>
+    <file>24x24/Euro.png</file>
+    <file>24x24/Exit.png</file>
+    <file>24x24/Expand.png</file>
+    <file>24x24/Eye.png</file>
+    <file>24x24/Fall.png</file>
+    <file>24x24/Fast-forward.png</file>
+    <file>24x24/Favourites.png</file>
+    <file>24x24/Female symbol.png</file>
+    <file>24x24/Female.png</file>
+    <file>24x24/Film.png</file>
+    <file>24x24/Filter.png</file>
+    <file>24x24/Find.png</file>
+    <file>24x24/First record.png</file>
+    <file>24x24/First.png</file>
+    <file>24x24/Flag.png</file>
+    <file>24x24/Flash drive.png</file>
+    <file>24x24/Folder.png</file>
+    <file>24x24/Forbidden.png</file>
+    <file>24x24/Forward.png</file>
+    <file>24x24/Free bsd.png</file>
+    <file>24x24/Gift.png</file>
+    <file>24x24/Globe.png</file>
+    <file>24x24/Go back.png</file>
+    <file>24x24/Go forward.png</file>
+    <file>24x24/Go.png</file>
+    <file>24x24/Good mark.png</file>
+    <file>24x24/Green bookmark.png</file>
+    <file>24x24/Green pin.png</file>
+    <file>24x24/Green tag.png</file>
+    <file>24x24/Hard disk.png</file>
+    <file>24x24/Heart.png</file>
+    <file>24x24/Help book 3d.png</file>
+    <file>24x24/Help book.png</file>
+    <file>24x24/Help.png</file>
+    <file>24x24/Hint.png</file>
+    <file>24x24/History.png</file>
+    <file>24x24/Home.png</file>
+    <file>24x24/Hourglass.png</file>
+    <file>24x24/How-to.png</file>
+    <file>24x24/Hungup.png</file>
+    <file>24x24/Info.png</file>
+    <file>24x24/In-yang.png</file>
+    <file>24x24/Iphone.png</file>
+    <file>24x24/Key.png</file>
+    <file>24x24/Last recor.png</file>
+    <file>24x24/Last.png</file>
+    <file>24x24/Left-right.png</file>
+    <file>24x24/Letter.png</file>
+    <file>24x24/Lightning.png</file>
+    <file>24x24/Liner.png</file>
+    <file>24x24/Linux.png</file>
+    <file>24x24/List.png</file>
+    <file>24x24/Load.png</file>
+    <file>24x24/Lock.png</file>
+    <file>24x24/Low rating.png</file>
+    <file>24x24/Magic wand.png</file>
+    <file>24x24/Mail.png</file>
+    <file>24x24/Male symbol.png</file>
+    <file>24x24/Male.png</file>
+    <file>24x24/Medium rating.png</file>
+    <file>24x24/Message.png</file>
+    <file>24x24/Mobile-phone.png</file>
+    <file>24x24/Modify.png</file>
+    <file>24x24/Move.png</file>
+    <file>24x24/Movie.png</file>
+    <file>24x24/Music.png</file>
+    <file>24x24/Mute.png</file>
+    <file>24x24/Network connection.png</file>
+    <file>24x24/New document.png</file>
+    <file>24x24/New.png</file>
+    <file>24x24/Next track.png</file>
+    <file>24x24/Next.png</file>
+    <file>24x24/No.png</file>
+    <file>24x24/No-entry.png</file>
+    <file>24x24/Notes.png</file>
+    <file>24x24/OK.png</file>
+    <file>24x24/Paste.png</file>
+    <file>24x24/Pause.png</file>
+    <file>24x24/People.png</file>
+    <file>24x24/Percent.png</file>
+    <file>24x24/Person.png</file>
+    <file>24x24/Phone number.png</file>
+    <file>24x24/Phone.png</file>
+    <file>24x24/Picture.png</file>
+    <file>24x24/Pie chart.png</file>
+    <file>24x24/Pinion.png</file>
+    <file>24x24/Play.png</file>
+    <file>24x24/Playback.png</file>
+    <file>24x24/Play-music.png</file>
+    <file>24x24/Previous record.png</file>
+    <file>24x24/Previous.png</file>
+    <file>24x24/Print.png</file>
+    <file>24x24/Problem.png</file>
+    <file>24x24/Question.png</file>
+    <file>24x24/Radiation.png</file>
+    <file>24x24/Raise.png</file>
+    <file>24x24/Record.png</file>
+    <file>24x24/Red bookmark.png</file>
+    <file>24x24/Red mark.png</file>
+    <file>24x24/Red pin.png</file>
+    <file>24x24/Red star.png</file>
+    <file>24x24/Red tag.png</file>
+    <file>24x24/Redo.png</file>
+    <file>24x24/Refresh.png</file>
+    <file>24x24/Remove.png</file>
+    <file>24x24/Repair.png</file>
+    <file>24x24/Report.png</file>
+    <file>24x24/Retort.png</file>
+    <file>24x24/Rewind.png</file>
+    <file>24x24/Sad.png</file>
+    <file>24x24/Save.png</file>
+    <file>24x24/Schedule.png</file>
+    <file>24x24/Script.png</file>
+    <file>24x24/Search.png</file>
+    <file>24x24/Shield.png</file>
+    <file>24x24/Shopping cart.png</file>
+    <file>24x24/Silence.png</file>
+    <file>24x24/Smile.png</file>
+    <file>24x24/Sound.png</file>
+    <file>24x24/Stock graph.png</file>
+    <file>24x24/Stop sign.png</file>
+    <file>24x24/Stop.png</file>
+    <file>24x24/Stopwatch.png</file>
+    <file>24x24/Sum.png</file>
+    <file>24x24/Sync.png</file>
+    <file>24x24/Table.png</file>
+    <file>24x24/Target.png</file>
+    <file>24x24/Taxi.png</file>
+    <file>24x24/Terminate.png</file>
+    <file>24x24/Text preview.png</file>
+    <file>24x24/Text.png</file>
+    <file>24x24/Thumbs down.png</file>
+    <file>24x24/Thumbs up.png</file>
+    <file>24x24/Toolbox.png</file>
+    <file>24x24/Top.png</file>
+    <file>24x24/Trackback.png</file>
+    <file>24x24/Trash.png</file>
+    <file>24x24/Tune.png</file>
+    <file>24x24/Turn off.png</file>
+    <file>24x24/Twitter.png</file>
+    <file>24x24/Undo.png</file>
+    <file>24x24/Unlock.png</file>
+    <file>24x24/Up.png</file>
+    <file>24x24/Update.png</file>
+    <file>24x24/Up-down.png</file>
+    <file>24x24/Upload.png</file>
+    <file>24x24/User group.png</file>
+    <file>24x24/View.png</file>
+    <file>24x24/Volume.png</file>
+    <file>24x24/Wallet.png</file>
+    <file>24x24/Warning.png</file>
+    <file>24x24/Wrench.png</file>
+    <file>24x24/Yellow bookmark.png</file>
+    <file>24x24/Yellow pin.png</file>
+    <file>24x24/Yellow tag.png</file>
+    <file>24x24/Yellow check.png</file>
+    <file>24x24/Yes.png</file>
+    <file>24x24/Zoom.png</file>
+    <file>images/1.png</file>
+    <file>images/2.png</file>
+    <file>images/3.png</file>
+    <file>images/4.png</file>
+    <file>images/5.png</file>
+    <file>images/6.png</file>
+    <file>images/7.png</file>
+    <file>images/8.png</file>
+    <file>images/9.png</file>
+    <file>images/10.png</file>
+    <file>images/11.png</file>
+    <file>images/12.png</file>
+    <file>images/13.png</file>
+    <file>images/14.png</file>
+    <file>images/15.png</file>
+    <file>images/16.png</file>
+    <file>images/17.png</file>
+    <file>images/18.png</file>
+    <file>images/19.png</file>
+    <file>images/20.png</file>
+    <file>images/21.png</file>
+    <file>images/22.png</file>
+    <file>images/23.png</file>
+    <file>images/25.png</file>
+    <file>images/26.png</file>
+    <file>images/27.png</file>
+    <file>images/28.png</file>
+    <file>images/29.png</file>
+    <file>images/30.png</file>
+    <file>images/31.png</file>
+    <file>images/32.png</file>
+    <file>images/33.png</file>
+    <file>images/34.png</file>
+    <file>images/35.png</file>
+    <file>images/36.png</file>
+    <file>images/37.png</file>
+    <file>images/38.png</file>
+    <file>images/39.png</file>
+    <file>images/40.png</file>
+    <file>images/41.png</file>
+    <file>images/42.png</file>
+    <file>images/42a.png</file>
+    <file>images/43.png</file>
+    <file>images/44.png</file>
+    <file>images/45.png</file>
+    <file>images/46.png</file>
+    <file>images/47.png</file>
+    <file>images/48.png</file>
+    <file>images/49.png</file>
+    <file>images/50.png</file>
+    <file>images/51.png</file>
+    <file>images/52.png</file>
+    <file>images/53.png</file>
+    <file>images/54.png</file>
+    <file>images/55.png</file>
+    <file>images/56.png</file>
+    <file>images/57.png</file>
+    <file>images/58.png</file>
+    <file>images/59.png</file>
+    <file>images/60.png</file>
+    <file>images/61.png</file>
+    <file>images/62.png</file>
+    <file>images/63.png</file>
+    <file>images/64.png</file>
+    <file>images/65.png</file>
+    <file>images/66.png</file>
+    <file>images/67.png</file>
+    <file>images/68.png</file>
+    <file>images/69.png</file>
+    <file>images/70.png</file>
+    <file>images/71.png</file>
+    <file>images/72.png</file>
+    <file>images/73.png</file>
+    <file>images/74.png</file>
+    <file>images/75.png</file>
+    <file>images/76.png</file>
+    <file>images/77.png</file>
+    <file>images/78.png</file>
+    <file>images/79.png</file>
+    <file>images/80.png</file>
+    <file>images/81.png</file>
+    <file>images/82.png</file>
+    <file>images/83.png</file>
+    <file>images/84.png</file>
+    <file>images/85.png</file>
+    <file>images/86.png</file>
+    <file>images/87.png</file>
+    <file>images/88.png</file>
+    <file>images/89.png</file>
+    <file>images/90.png</file>
+    <file>images/91.png</file>
+    <file>images/92.png</file>
+    <file>images/93.png</file>
+    <file>images/94.png</file>
+    <file>images/95.png</file>
+    <file>images/96.png</file>
+    <file>images/extrap_contour.png</file>
+  </qresource>
+</RCC>
diff --git a/UI/dsm_rc.py b/UI/dsm_rc.py
new file mode 100644
index 0000000000000000000000000000000000000000..bedf087723025ecf87d3987e1e52d372d08e1f9c
--- /dev/null
+++ b/UI/dsm_rc.py
@@ -0,0 +1,27472 @@
+# -*- coding: utf-8 -*-
+
+# Resource object code
+#
+# Created by: The Resource Compiler for PyQt5 (Qt v5.13.1)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x02\xbe\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\x85\x49\x44\x41\x54\x78\xda\x63\x64\xa0\x31\x60\x1c\
+\xb4\x16\x48\x55\xbc\x9a\x0b\xa4\x32\x9f\x75\x88\xfd\xa2\x95\x05\
+\xff\x81\xd4\x35\x20\x36\xc4\x67\x09\xd9\x16\x48\x96\x3d\xfb\xaf\
+\xab\xc6\xc5\x70\xf9\xe6\xf7\x9b\x0c\x0c\xff\xf5\x9e\x77\x4b\x61\
+\xb5\x84\x6c\x0b\x24\x8a\x1e\xfd\xaf\x0c\x13\x65\xd8\x70\xf6\x0b\
+\xc3\xf5\xbb\xdf\xee\x02\x8d\xd2\x7a\xd1\x27\x87\x61\x09\xd9\x16\
+\x88\xe5\xdd\xf9\x5f\x1f\x25\xc5\x70\xf3\xdd\x7f\x86\xdb\x8f\xbe\
+\x32\x9c\xbd\xfa\xe9\x21\xd0\x34\xb5\x57\x93\x54\x50\x2c\x61\x14\
+\xc9\xbc\xf6\x9f\x5c\x4b\x96\x15\x2a\x31\xec\x7b\xf0\x1b\xcc\xbe\
+\x76\xef\x2b\xc3\xf1\x8b\xef\x1e\x03\x8d\x54\x79\x3d\x5d\x13\x6e\
+\x09\xa3\x70\xea\xc5\xff\xce\x56\x62\x24\x18\xfb\x1f\xee\xf1\x0c\
+\x5b\x01\x86\x23\x0f\x7f\xc3\x65\xae\xde\xff\xc2\xb0\xe7\xc4\xab\
+\xe7\x40\x35\xca\x6f\xe7\x18\x7e\x07\x5b\x20\x98\x70\xfa\x7f\xb0\
+\x9b\x2c\x9a\x56\xe4\x10\xfc\x0f\x97\x83\x88\x30\xc2\x2d\x2a\x74\
+\x14\x64\xd8\x7e\xeb\x27\x42\x12\x08\x2e\xde\xf9\xc8\xb0\xe5\xf0\
+\xd3\x97\x40\xa6\xca\xfb\x85\x16\x5f\x18\xf9\xa3\x8e\xfc\x2f\x4b\
+\xd0\x42\x32\xf8\x3f\x92\xc1\x08\xd1\x7f\xff\x31\x43\x32\xc3\x9a\
+\x9f\x61\xe5\xf9\xaf\x48\x96\x43\x74\x5d\x7f\xf4\x99\x61\xc9\x96\
+\xbb\x6f\x80\x3c\x15\x46\xde\x90\x3d\xff\xdd\xbd\xb4\xc8\x8a\x83\
+\xbb\xcf\xbe\x31\xb0\x70\xb0\x01\x0d\x46\xb3\xe2\x3f\x23\xc3\x97\
+\x0f\x5f\x18\x1e\xdf\x78\x7c\x9d\x91\xdb\x6f\xf3\x7f\x0d\x2b\x1d\
+\x90\x18\xd4\xd1\x08\x45\x0c\x8c\xff\xa1\x41\xf2\x9f\x01\xcc\x02\
+\x0b\xff\x87\x07\xd4\xaf\x6f\x3f\x18\x58\xd8\x58\xa1\x66\x33\xc2\
+\x03\xe0\xd3\x9b\xf7\x0c\x2f\xee\x3e\x01\x45\xb4\x3f\x23\x87\xfb\
+\x9a\xff\xea\x36\x06\x60\xcb\x41\xa1\xc0\x08\xa5\x61\x7a\xc0\x62\
+\x0c\x10\xfb\xd0\x23\xea\xff\x9f\x7f\x18\x71\xf7\xe9\xf5\x3b\x86\
+\x57\x77\x1f\x81\x0d\xff\xbe\x23\x6c\x07\x23\xab\xe3\x92\xff\x6a\
+\x76\x26\x60\x13\x40\xee\x44\xc4\x2b\xd4\x07\x30\xcf\x30\xa0\xdb\
+\xc2\xc0\xf0\xf7\xef\x3f\x94\xa8\xff\xf2\x16\x68\xf8\x9d\x7b\xbf\
+\x80\xd2\xfe\x3f\xf7\xc6\xee\x00\xcb\xb0\xd8\xcc\xff\x8f\x1a\xa7\
+\x50\x06\x7a\xa4\x42\xd5\x20\x7c\xc3\xc8\xa0\x60\x61\x02\x96\xfa\
+\xfa\xee\x03\xc3\x8f\x8f\x9f\x18\xbe\xbc\x7e\x01\x34\xfc\xbf\xff\
+\xef\x43\x29\x3b\x90\xb5\x91\x05\x98\x2c\xa6\xff\x17\xd7\xd6\x01\
+\xb3\x41\x86\x7f\x7e\xfe\x08\x6c\xf8\x9f\x63\x59\x3b\x90\xd5\x91\
+\x6f\x81\xe9\xe4\xff\xfc\xf2\x4a\x60\xf6\xc7\xc7\xf7\x7e\x33\xfc\
+\xff\x17\xf4\xef\x54\xfe\x16\x74\x75\x64\x5b\xc0\x68\xdc\xff\x9f\
+\x5b\x52\x96\xe1\xeb\x8b\xa7\x7f\x80\x2e\x4f\xf8\x7f\xb6\x60\x29\
+\x56\x75\xe4\x5a\xc0\x60\xd0\xfd\x9f\x91\x91\xe9\x37\x30\x61\xc4\
+\x30\x9c\x2f\x59\x85\xd3\x21\x64\x5b\x60\xd8\xb5\x05\x18\xe9\xb3\
+\x19\x2e\x94\x6d\xc4\xeb\x53\xb2\x2d\xd0\xef\x94\x61\xb8\x58\xfe\
+\x84\x90\xb2\xc1\x5b\xe9\x13\x0b\x00\xc1\x08\x19\xa0\xba\x59\x22\
+\xcf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xc8\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x8f\x49\x44\x41\x54\x78\xda\xb5\x95\x7b\x6c\x53\x55\
+\x1c\xc7\xbf\xe7\xae\x8f\xad\x6b\xf7\x68\xe9\x36\xb6\x75\x6d\x47\
+\x47\xc7\xe8\x64\x5b\x18\x58\x75\x41\x45\x94\x66\x0b\x0b\x88\x7f\
+\x68\x54\xe2\x9c\x8b\x8b\xb0\x68\x44\x45\x11\xc2\x10\x9c\x81\xf0\
+\x97\x31\x18\x25\x90\x61\x80\xe1\x74\x8a\xc1\x48\x42\x30\xc5\x35\
+\x04\xc1\xcd\x04\x10\xc5\xec\xd1\xbd\x4b\xbb\xbe\xb6\x8e\xbb\xdb\
+\xc7\x3d\x9e\x3b\x13\x22\x0a\x38\x14\x7e\xc9\xcd\xc9\xbd\xe7\xdc\
+\xcf\xf7\xfc\x1e\xe7\x77\x08\xee\x81\xe5\x1f\xe1\x0a\xd8\xd0\x30\
+\xfc\xb4\xf8\x2e\xb9\x47\x70\x27\x7b\x2e\x33\x81\x9a\xbb\x2a\x90\
+\x7f\x98\xcb\xa3\x40\x27\x28\xcc\x20\xf8\x76\xe4\x99\xbb\x28\x90\
+\x7b\x88\xcb\x63\xe0\x4e\x81\xe3\xcc\x4a\x51\x64\x7c\x9c\x18\x79\
+\x56\x74\x90\xdc\xcf\xb8\xd5\xa3\xcf\x89\x5f\xfd\x2f\xf8\x41\x06\
+\x07\xed\xa4\x99\x2a\x33\x2f\x88\x50\xf1\x02\x7b\x85\x6b\xf4\x79\
+\xb1\x8a\xcc\x6d\xe5\x04\xe6\x56\xad\x67\x9d\x78\xe2\xbf\xc0\x73\
+\x5a\x09\x83\x13\x67\x9a\x59\x67\x89\xf0\x09\xc4\x84\x18\x92\x02\
+\x53\x20\x04\xae\xb1\x75\x4c\x20\xe7\x00\xa1\xa0\x84\x67\x92\x0e\
+\x4f\x1d\x3d\x7d\x47\xf0\xfd\x6c\xe7\x04\x4e\xcb\x92\x22\x4b\x58\
+\x88\x22\x3c\x3e\x09\x70\x14\xd1\xa1\x20\xc3\x51\x17\xe3\x49\x02\
+\x32\x9a\x9a\x9d\x81\xc9\x51\x7f\x84\xfd\xb3\xdc\x5b\x4f\xcf\xcd\
+\x06\x9e\xb5\x4f\x0a\x0b\x9c\x2b\x1f\xad\xb1\x78\x93\xc6\x31\x3c\
+\x30\x8a\x18\x8d\x43\x99\x26\x87\xa7\xcb\xcd\xa6\x88\xcb\x5b\xcf\
+\x3c\xc8\x3d\xa8\x8c\x5a\x16\x2f\x90\x5f\xed\x19\x43\xc0\xe3\x0d\
+\x4b\x22\xbe\x06\xda\x75\x3b\xb8\xfe\x93\x99\x98\x9f\xda\xb0\xe2\
+\x75\xab\x57\x3f\x86\x0b\x57\x2e\x63\x8a\x9f\x42\xaa\x56\x85\x64\
+\x9d\x02\x3f\x1f\x3b\x2f\x09\x74\xf9\x1a\xc4\xc5\xa4\xe0\xb0\x7a\
+\xb2\xe2\xc1\x4a\xb5\xe4\xde\x70\xdf\x10\x82\x7e\x9f\x8f\xc5\x6c\
+\xb9\xff\x65\x7a\xf1\x66\x70\xdd\x5e\x92\xc7\x2a\xe4\xd4\xd6\x27\
+\x76\x58\x13\xe6\x69\xfc\xf8\xdb\x79\x78\x42\x5e\x68\xb4\x6a\xe8\
+\xf2\x33\xa0\x96\xa9\xd1\xb6\xff\x08\xcb\x31\x2e\xfa\x1b\xe9\x7d\
+\xa4\xf0\xa8\x76\xd2\xfe\xd0\x52\x75\xd0\x3b\x81\x50\x60\x02\xde\
+\xab\x1e\x04\x82\x7e\x0f\x8b\x61\x55\x60\x3d\xed\xf9\x2b\x5c\xfb\
+\x11\x97\x43\x40\x9d\xef\x3b\x76\x5b\x33\xcd\xa9\xe8\x74\x9f\xc1\
+\x80\x6f\x10\x9a\x74\x35\x0c\xa6\xb9\x30\x2a\x0a\xd1\x3f\x30\x84\
+\x7d\xc7\x3f\x8e\xb2\x24\xd7\xfa\x5f\xa1\x27\x48\xd1\x51\x7d\xe4\
+\x01\xbb\x3d\x35\xe0\x0b\x21\x10\x08\x43\xe0\xa3\x08\x85\x03\x18\
+\x0f\x79\x47\x58\xfa\xab\x82\x4d\xb4\x5f\x82\x67\x7e\x48\x72\xd8\
+\xb6\x9c\x2d\xd5\xbb\xad\x05\x85\x39\x38\x3b\x78\x16\xbd\x3e\x37\
+\xd2\x35\x1a\x58\x4c\x26\x18\x14\x16\x06\x77\x63\xcf\x77\xbb\xf8\
+\x68\x2c\xb6\x26\xd8\xf4\x67\x55\x12\x6b\x5b\x76\xa4\xb2\xa2\x32\
+\x35\xe4\x67\x1e\x84\x99\x00\x2b\x33\x8e\x12\x4c\x46\x26\x30\xea\
+\x1b\xee\x67\xae\x56\xb1\x75\x09\xa9\x5a\xb6\xd7\x34\x5b\xe7\x1b\
+\xcd\xf8\x69\xa0\x1b\xee\xe0\x10\x83\xa7\x61\x81\xc9\x0a\xa3\xd2\
+\x8c\xdf\xdd\xbd\xd8\x7e\xbc\x99\x8f\x26\x84\x35\xa1\x57\xe9\xf5\
+\x92\x27\x9a\x3d\xc4\x6f\xaf\x5c\xa2\x95\x41\x8e\x89\x48\x04\xb1\
+\x68\x0c\x84\x09\xa8\xe4\x29\xe0\x79\x1e\xbf\x0c\x5e\xba\xc2\x96\
+\x25\x5e\x5b\xb1\xa1\xa4\x60\x8e\x11\x7d\xfe\x3e\x8c\x5f\xf3\x43\
+\x9f\xa6\x43\xa9\xd1\x06\x43\x8a\x09\x97\xdc\xbf\x62\xf3\x37\xef\
+\xf0\x42\x4c\x58\x33\xb1\x91\xde\x70\x9e\x88\x66\x17\x56\x12\x8e\
+\x3b\x56\x5a\x6c\x53\xc8\x88\x0c\xb1\x78\x1c\x44\x04\xe4\x49\x0a\
+\x64\x28\xd3\x10\x66\x9e\xe8\xd5\x73\x60\x62\xf0\x88\x30\x05\x8e\
+\x05\xd7\xa0\x33\xa0\xbc\xc0\x86\x6c\x65\x3e\xba\xfb\x2f\xe0\x8d\
+\xaf\x37\xf2\xd3\x71\xa1\x36\xf2\x26\x3d\xf9\xf7\xa2\x98\xe9\x45\
+\xa9\x2d\xa4\x9a\x70\xa4\xa3\x64\x5e\xb1\x42\xa5\x4c\x01\x4d\x50\
+\x36\x41\x20\xe3\xe4\x48\x49\x4a\x46\xb2\x2c\x99\x79\xa4\x42\xb6\
+\x26\x0b\xc5\x59\x56\x94\xe7\x97\x42\xcd\x69\x71\xae\xaf\x0b\x4d\
+\x1d\x4d\xbc\x90\xe0\x6b\x23\x9b\x70\xf2\x26\x45\x87\xeb\xcd\x4e\
+\xb5\x13\xd5\x84\x90\x8e\x85\xf3\x16\x28\x34\x29\x6a\x50\x91\x4a\
+\xfd\x64\x06\xae\x57\xe9\x31\x5f\x57\x84\xf2\xdc\x45\x28\xd6\x17\
+\x43\x09\x35\x5c\x7d\x67\xd0\xf8\x45\x23\xdb\x39\x5f\x73\x6d\x33\
+\xbe\xbf\xd5\x99\xb9\xa1\x9b\xa6\xbc\x87\x55\x94\x92\xf6\x45\x45\
+\x25\x33\x22\xd2\xb4\x2e\x39\x13\x0b\xf5\x0b\x61\x37\xd8\x61\xd3\
+\x97\x40\x06\x15\x7e\xe8\xed\xc4\x8b\xed\xf5\x0c\x3e\x5d\x33\xbd\
+\xe5\xd6\xf0\x7f\x08\x48\xa6\xdc\x86\x55\xec\x73\xbb\x6d\x9e\x55\
+\x21\x25\xd2\xa0\xc9\xc3\x92\xbc\xa5\x78\xd8\xb8\x0c\x5a\x65\x16\
+\x4e\xf7\xb8\x50\xf7\x79\x1d\xcf\xc7\x84\x1a\x61\x1b\xbd\x2d\xfc\
+\xa6\x02\x92\x29\xb6\x62\x35\x1b\xda\xca\x8a\x6c\x8a\x4a\x63\x05\
+\xec\x79\xf7\x63\x59\xc1\x32\x9c\x73\x77\xe3\x85\xb6\x97\x78\x21\
+\x2e\x38\x84\xe6\xd9\x35\xc6\x5b\x5e\x38\xf2\x2d\x92\x08\x69\x73\
+\x94\x3d\xa2\x78\xaa\xec\x49\xc4\xa7\x13\x68\xfa\xf2\x2d\x7e\x3a\
+\xca\x3b\x62\x3b\x30\xeb\xae\x7b\xdb\x1b\x4d\xbe\x19\x6b\x59\x9e\
+\x0f\xad\x7f\xac\x41\xf1\xa9\xb3\x55\xda\xf9\xe3\xf1\x9d\x70\xcd\
+\x16\xfe\xaf\x02\x92\x25\xbd\x8d\xb5\x6c\xd9\x01\xd6\x83\x1c\xf1\
+\x96\x3b\x83\xcf\x4a\x40\x32\x6e\x13\xd2\xc5\x0f\x10\xbe\x53\xb8\
+\x64\x7f\x00\xc3\x0e\xda\x28\xce\xe6\x6e\xf0\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x4e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x15\x49\x44\x41\x54\x78\xda\x85\x56\x0b\x50\x54\x55\
+\x18\xfe\xce\xbd\xac\x2c\xb0\xc0\x82\x80\xa0\xa8\xac\xf1\x0a\x9f\
+\xa0\x68\x3a\x96\x94\x8f\x31\x35\x9c\x32\x8b\xd1\xf1\x91\x96\x8f\
+\xc6\x09\x53\x9b\x66\x12\xd3\xd2\x1e\xce\x60\x36\xa9\x63\xea\x58\
+\x56\xa2\x53\xe6\x88\x8f\xd2\x99\x30\x60\x9c\xf0\x11\xa8\x89\x03\
+\x52\x9a\xab\x22\x2f\x77\x61\x97\x7d\xc0\xb2\xf7\xd1\x7f\xee\x5d\
+\x40\x1b\xa7\x2e\x73\xf6\xfe\xe7\xec\xf9\xbf\xef\x3b\xdf\xff\xdf\
+\xbb\x30\xd0\xa5\x5e\x8d\x48\x02\xc3\x7c\x0a\x67\x42\x45\x16\xdd\
+\x2f\xd3\xfc\x27\x8a\x8b\xd8\xa8\x76\x2b\xfe\xe3\xfa\xbf\x5c\xe6\
+\xaf\x0c\x4f\xa2\xc5\x8f\x04\x73\xce\x3c\x16\x39\x01\x2c\x34\x1d\
+\xaa\xf7\x06\x54\x67\x05\x1e\xb4\xdd\x2c\xd9\xdd\xb1\xff\x8f\xbf\
+\xe4\x71\xc9\xb4\x27\x83\xc6\x80\x00\xee\x7d\x1a\x35\x29\xe2\xc5\
+\x9b\x2b\x8d\x4b\x47\xc6\x46\x27\x4f\xf9\x77\xae\xe2\x2c\x3b\x04\
+\x55\x5d\xcf\xbc\x15\xa6\xf5\x62\xf4\xa4\x2d\x7d\x2c\x9b\x01\xb1\
+\x3f\x49\xea\x00\xfc\x56\x28\xfe\x46\x34\xdf\x2f\xc3\x19\xcf\x5c\
+\xdc\x13\x27\x23\x2c\x08\x08\x11\x41\xe2\x80\x2e\x05\x70\xcb\xc0\
+\x20\xe9\x57\x4c\x33\x1d\x47\x9c\x65\x09\x98\x98\xd0\x93\x0b\x7f\
+\x03\xba\xee\x7f\x05\xd9\x71\xa1\x80\x39\x4a\x43\x2a\xc2\xd2\xdf\
+\x1b\x1f\x14\xfb\x1a\x20\x35\x41\xf5\x55\xc3\x27\xa9\xb8\xe9\x4d\
+\x44\xbd\x2f\x09\xe6\xd0\x58\x1a\x66\x44\x18\x74\xe9\x7e\x45\x45\
+\x87\xc4\xd0\xd6\xa5\xc2\xdb\xe9\x84\xaa\xb8\x90\x64\x36\x61\x50\
+\xf0\x5d\x18\xfc\x57\xc0\x94\x4e\x5a\xeb\x84\xec\xac\x86\xfb\xce\
+\xe1\xf3\xac\xf9\x4c\x70\x67\xec\xb8\x2f\x82\x99\x31\x1b\xf0\x96\
+\xa3\xa5\x2b\x12\xd7\xbc\x23\xd1\x37\x3c\x03\x49\x11\x46\x84\x70\
+\x60\x95\xb8\x09\xb8\x53\x66\x34\x40\x04\x2a\x7c\x0a\x43\x97\xac\
+\xc2\xe5\x67\xf0\xf8\x65\xc4\x08\x75\x48\x36\x5c\x44\x14\xbb\x0d\
+\x26\x79\xa1\xc8\x2e\xd8\x6a\xbe\xf1\xb1\xbb\xc5\x86\x8a\x98\xa1\
+\x0b\xc6\x1b\xa3\x33\xd1\xec\x01\xae\xfb\xa7\x23\x39\x6e\x08\xfa\
+\x87\x0a\x90\xc9\x0a\x1f\x07\x94\xf9\x5d\xc5\x55\xbb\x84\x54\x73\
+\x10\x91\x81\xbe\x63\x90\x38\xb1\xaa\xd2\xa9\x48\x1b\x2d\x86\xcb\
+\xb7\xf0\xa4\xf0\x23\xa2\xa4\x6b\xe8\x6c\xbf\x0b\x9b\xb5\xf2\x3c\
+\xbb\xf9\xbd\xb8\x3e\x3c\x2e\x6d\x4b\xf0\xe0\x19\xb8\x20\xe5\x21\
+\xa3\x7f\x26\xa2\x83\x19\x01\xea\x6a\x79\x32\x57\x2f\xab\x0c\x6f\
+\x95\xdb\xb1\x75\x62\xb4\x46\xac\x81\x6b\x24\xaa\x46\xa8\xc7\x0a\
+\xfa\x29\x97\x90\xee\xfb\x0c\x9e\x3b\x65\x70\xb5\xb5\x16\xb0\xb3\
+\xdf\x0d\x4d\x73\xb1\x7e\x25\x91\x29\x2f\x25\xc6\xa5\xbe\x89\x84\
+\x10\x02\x56\x74\x60\x85\x83\x10\x89\x44\x1e\xf1\x7b\xfe\xd9\x66\
+\x6c\xcd\x89\xd7\x41\x89\x50\x27\x86\x46\xa0\xd0\x5c\xa6\xb9\x28\
+\x30\xf4\xb7\x6d\x87\xb5\xf6\x54\x7d\xb8\xd2\x3c\x85\x4d\xfd\xfa\
+\x5e\x6e\x92\xa9\xed\xf8\xac\x4c\x0b\x46\x27\x84\x69\x47\xa7\x1c\
+\x1d\x5c\xd1\x8b\xca\xc1\xc8\x66\xac\x39\x6d\xc5\x86\xc9\x83\xb5\
+\xd3\xa8\xf4\xc7\x68\x0f\xa3\xb6\x12\xe8\x43\x64\x7a\xcc\xd7\x55\
+\x9f\x13\xc5\x97\xef\xa1\xce\x19\x35\x9b\xe5\xec\xbe\x55\x38\x32\
+\xc9\xbc\x76\xc1\x98\x28\x98\xfb\xd0\x46\x41\xd5\x8f\x4b\xc0\xbc\
+\x1d\x3d\x5d\x34\x02\x05\xdd\xf2\xf3\x9f\x28\x98\x91\x4a\x60\x8c\
+\x40\xa9\xab\x09\x8c\x83\x33\xa6\xea\x73\xfa\x10\xa0\xc7\xbf\xd4\
+\xb4\xa1\xa4\xd6\xb1\x8d\x4d\xfc\xbc\xa6\x6c\x66\xf6\xc0\x49\xd3\
+\x52\x4d\x44\x40\x47\xe6\x7d\x4e\xfe\xbb\xc8\x64\x17\x81\xfb\x24\
+\x52\x26\x70\x30\xa0\xe0\x48\x35\x3e\xcd\x1b\x4e\xb1\x0e\x2a\xb2\
+\xde\x3b\x07\xe5\xe0\x5a\x4c\x22\x6b\xeb\x3d\xd8\x55\x5a\x5f\xce\
+\xc6\x7e\x72\xb5\x71\x45\x6e\x46\x7c\x66\xbc\x01\xa1\x41\xd4\x8a\
+\x04\xe8\xe0\xaa\xa9\xd7\x55\xf2\x9a\x03\x6b\xca\x08\x68\xf5\xfe\
+\x4b\xd8\xf9\xc6\x38\x2d\x26\x0c\x88\x62\xaf\x62\x9d\x00\x3d\x27\
+\x71\xd0\xd1\xdf\x3e\x58\xdb\xc4\xb2\x36\x5e\x92\x0a\x16\x8d\x11\
+\xd3\xcc\xe4\x33\x01\xb6\xf9\x40\x24\xba\xb2\x20\xa1\x3b\x89\xa1\
+\xde\xe6\xc2\xe6\xa2\x2a\xc8\x54\x18\xc5\x2f\x41\xa1\xaa\xcb\xb2\
+\x0c\x95\x8a\x23\x4b\x7c\xae\x60\xe1\xf4\x74\x2c\xc9\x1d\xae\x89\
+\xe2\xb5\xc8\xdb\x5e\x29\xb3\xe1\xef\x9e\x6b\xdc\xb0\x74\x6c\x7c\
+\x4a\x94\x01\xed\x12\xd3\xfa\x9d\xab\x08\x62\xbd\x05\xb4\x36\x39\
+\xb1\xab\xf8\x3a\x9a\x89\x44\x03\x26\x50\x25\x00\xaa\x10\x89\xe2\
+\xd7\xc9\x5e\xcf\x1d\x86\x15\x2f\x8f\xd2\x44\xb9\x3b\x24\xcc\xdb\
+\x7e\xb1\x89\xa5\xe5\x97\x94\xe5\xe7\x65\x4d\x1a\x61\x89\x22\xef\
+\xa1\x1d\xbf\xb7\x58\xa4\xfc\x81\x0b\x1f\x1f\xac\xc4\xca\x59\x19\
+\xc8\x4e\x8f\xeb\xb1\x83\xd7\x41\x08\xf8\xcf\x5f\x50\x22\xb7\x8d\
+\xaf\x09\x7a\x5c\x7d\xdb\x89\xfc\x7d\x97\xcb\xd9\x90\xe5\xa7\x0b\
+\xe7\x4e\x4d\x5b\x3b\x63\x82\x45\xdf\x24\xb0\x1e\x90\x16\xbb\x1b\
+\x1b\xf6\x55\x60\xc5\xec\xe1\x98\x30\x2c\x21\x60\x57\xa0\x63\xb4\
+\x13\x32\xad\x93\x98\x36\xef\xee\x26\xa6\xed\x3b\x54\x7a\x1b\x3b\
+\x4e\xdc\xd8\xc6\x06\x2e\x2e\xce\x1d\x91\x12\x7b\x7c\xcd\x82\xb1\
+\x30\x19\x45\xcd\x3f\x9e\xe8\x70\x75\xe0\x9d\x1d\xe5\x58\xf6\xc2\
+\x30\x3c\x93\x99\xa8\x01\xf2\x44\x26\x3c\x54\x4c\x20\x00\xae\xea\
+\x64\x01\x5b\xbd\xd4\x29\x6b\xf7\xfc\x8e\x0b\xb5\x2d\xb3\x59\x42\
+\xde\x0f\x46\xa3\xd1\x70\x64\xd5\xab\x59\xb3\x9e\xcb\x1e\xa4\x25\
+\x2a\x8a\x82\xa5\x1f\x9e\xc6\x32\x52\xfe\xec\x98\x41\x3d\x8a\x35\
+\xdb\x68\xc2\x5f\xd9\x3d\x84\x0f\xa9\x16\x02\x0e\x9c\xac\xb8\x8b\
+\x4d\x07\xaa\x4e\x79\x7c\xf2\x5c\xbe\x17\xb1\x2f\x16\xcd\xc9\x48\
+\x8e\x39\xb0\x6e\xc1\x58\x53\xf2\x40\xb3\x06\xe8\xf6\xf8\x60\x36\
+\xf5\xd1\x2d\x0b\x28\x66\x01\xd5\x9a\x85\x82\xee\x39\xeb\x79\xd8\
+\x74\xc2\xba\x7a\x07\xd6\xef\xbd\xe4\xae\xaa\xb3\x2d\xb6\x1d\x9b\
+\x7f\x94\x75\xff\xf4\xf5\xcd\x3d\xb0\x69\xca\x53\x96\x8d\xcb\xe7\
+\x8c\x82\x25\x3e\x9c\xac\x60\xbd\xbd\x2d\x3c\x0a\xce\xba\x49\xa0\
+\x5b\xc3\x02\xb1\xb5\xd1\x85\xc2\xc3\x57\x71\xf2\x37\xeb\x07\xb6\
+\x13\x8b\x36\x71\x5c\x8d\x60\xd8\xfb\x15\x39\xb2\x5f\x5a\xe8\x69\
+\xb0\xcd\xc9\x4e\x8a\x88\x58\x4c\xd6\x64\xa5\xc5\xe9\x4f\x69\xa0\
+\x5b\xba\x5b\x56\x23\x50\x1f\xaa\x45\xa0\x0e\x55\xb5\x2d\xf8\xf2\
+\xd8\x35\x94\xd7\xda\xdb\x45\xbf\xef\xa8\x6c\x6f\xfb\xf6\x5e\xe9\
+\xea\x32\xc6\xc1\x69\x4f\x21\x8d\xd1\x92\xc3\x85\xf6\xfa\x26\x24\
+\x98\x8d\x78\x65\x6a\x3a\x9e\x7f\xfa\x09\x0c\x88\x09\x7b\xe4\x49\
+\x65\xdd\x27\x0a\x9c\xa2\xf1\x81\x1b\x27\xce\xfd\x8d\xa2\x92\x5b\
+\x68\xf4\x48\x30\xd0\x2b\xdb\x6f\xb3\xd3\xcf\x65\x7b\x95\x2a\xc9\
+\xeb\x38\xc1\x1e\xda\xbb\x4c\xed\xf4\xc1\x6f\x77\xa0\xab\xc5\x0e\
+\x6f\xab\x13\x92\x20\x22\x39\x25\x41\x99\x38\x2a\x51\xc8\xa4\xfe\
+\xcf\xb0\x44\x23\x31\xce\xa4\x01\x37\x10\xe8\x0d\x6b\x2b\xae\xd4\
+\x35\xe3\xdc\x95\x06\xe5\xb6\x5b\x11\x8c\x11\x61\x30\xc8\x92\x96\
+\x2f\xb5\xb6\x41\x21\x3c\xba\xf6\x72\x02\x2b\x31\x0d\x96\x1c\xed\
+\xf0\x3f\xb0\x13\x7b\x2b\xe4\x76\xb7\x56\x97\x2e\x26\x36\x3b\x82\
+\x42\x76\x52\x38\xe6\x71\xff\x55\xd0\xa8\x1c\x38\x3a\x7d\x55\x68\
+\x64\x58\xbf\xc7\xe5\xd3\x75\xe7\x1f\x75\xa2\x05\x45\x65\x9f\x09\
+\x28\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x43\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x0a\x49\x44\x41\x54\x78\xda\xad\x95\x0d\x4c\x5b\x55\
+\x14\xc7\xcf\xed\x7d\x2d\x6d\xa9\x85\x41\xde\xa0\xb0\x42\xf9\xea\
+\x00\xc7\x96\x95\x90\xcc\x31\x99\xc0\x60\xd9\xd0\x09\x04\x46\xa6\
+\x5b\x66\x1c\x8d\x11\xc5\xcf\x4c\x89\xa8\x0b\x02\x8a\x10\x8c\x32\
+\x31\x11\x62\x86\x68\x46\x97\xcd\x6d\xc1\xb8\x89\xce\x01\x81\x48\
+\xc8\x44\xc7\xc4\x52\xa0\xe3\xa3\x08\x05\xca\xda\x41\x3f\xa5\xc0\
+\xf3\x3e\xb5\x13\x89\xc9\x63\x49\xff\xc9\x7b\xf7\xdd\x77\xcf\xbd\
+\xbf\x7b\xce\x79\xf7\x3c\x04\x6b\x14\x5b\xa3\xa7\x01\xc1\x21\xc4\
+\xc0\x3e\x06\x41\x12\x30\x10\x8e\x00\x26\x18\x80\x1b\xa4\xbd\xc6\
+\x00\xd3\xaa\x3b\x19\x63\x82\xfb\x10\xf2\x3c\x28\xab\x86\xd2\x49\
+\x53\x1c\x15\x28\x90\xe7\x26\x48\x7d\x1f\x89\x92\x84\x28\x02\xf8\
+\x92\x71\xb3\xdb\xd6\xae\xb7\x4d\x5e\x1c\x58\x74\x8d\xce\x2f\x4d\
+\x02\x62\x4e\x0f\x97\xc4\xfe\x70\x5f\x80\xe8\x8a\xdf\xd2\x85\x14\
+\xaf\xf4\xc9\xc4\x4d\xf4\xcb\xa9\x41\xdb\x2c\x36\x00\xa7\x1b\x40\
+\xe2\x03\xe0\x27\x22\x46\xc4\xca\xbd\x02\xcc\x07\x9d\xb3\xbf\x9e\
+\xfb\xd9\x7c\xc7\xb5\xcc\x54\xea\xdf\x7c\x70\x43\x10\x14\x79\xaa\
+\x9f\x26\x21\x68\x54\xef\xa6\xa3\x8a\xf7\xca\xb6\x0d\xcd\x01\x04\
+\xf9\x03\x6c\x79\xe0\xff\x27\xbc\x73\xd5\x38\xd0\xd4\x6b\xba\x4d\
+\xa6\xaa\xc7\xca\xb6\x73\x86\x0b\x85\x95\xf6\x9d\x88\xa2\x85\x45\
+\x57\x9f\x8b\x53\x0d\x18\x11\x6c\x0e\x04\x90\x8b\x01\xba\xc7\x5c\
+\x90\xd7\x34\x07\x17\x9e\xda\x0c\x7b\x22\x84\xf7\x26\xac\xac\x32\
+\x4c\x66\xdd\xe0\x4d\xfd\xbc\xab\xde\x50\x99\xf8\x19\x27\x20\xf4\
+\x64\x6f\xcb\x5b\x8f\xca\x55\x8f\xef\x90\x29\xc7\x48\x68\xb6\x87\
+\x02\xf8\x92\x81\xe0\x53\x06\x98\x29\x0b\xbb\xd7\xae\xd5\xe9\xeb\
+\xc6\x91\xf7\xbf\x35\xf4\x4d\xd5\xec\x3a\xc2\x09\x08\x7e\xa9\x4b\
+\xdf\xf9\xba\x4a\x66\x75\x89\xc5\x82\x00\x80\x78\x29\x40\xcf\x3f\
+\xbb\xf7\x00\xd6\x7b\xa1\x9d\x76\x58\xd3\x6b\x7e\x99\x9b\xf9\x70\
+\x4f\x34\x27\x80\x2e\x6a\x77\x4f\xd5\xed\xa5\xba\x47\x10\xc8\x89\
+\x79\x04\x05\x10\x4a\x16\xed\x7a\x5e\x06\x31\x34\x1f\x46\x4c\x6e\
+\x78\xf8\x63\xe3\x7f\xbc\x70\xfc\xc1\x30\x8a\x57\x3b\x57\x4c\xf5\
+\xa9\x7c\x4e\xc0\x26\x75\x9b\xbe\xa7\x2c\x59\x36\xbd\xe0\x2b\x66\
+\x01\xe3\x93\x2e\x38\x4a\x76\xbf\x5e\x6b\xbd\xe8\x19\xb1\x3b\xb3\
+\x6a\x7e\x9c\xb6\x34\x66\x72\x7b\x20\x3d\xfe\x4d\x4b\x79\x41\xac\
+\x2a\x39\x2e\x52\xc9\x86\x28\xa3\xd6\x00\x6d\x64\xf7\x3b\xe8\x7f\
+\x37\xb7\xde\x8b\xf2\x8b\xe3\xb3\xb5\xad\xda\xf6\x85\xcf\xb3\xb8\
+\x73\xe0\xfb\xc4\xe5\x13\xca\x10\x49\xd1\xd7\x6f\xa4\xa9\x0c\x0e\
+\x04\x39\x0d\x06\xd0\x91\x85\xfc\xd7\x19\x7a\x92\x3d\xb1\xc0\x40\
+\x41\x55\xd7\xe8\x80\xc1\xf2\xae\xfd\x6c\x36\xf7\x57\x24\xca\xbf\
+\x40\x93\xb2\xd0\xf8\x42\x96\x32\xe6\x70\x6a\x42\x3c\x9f\x24\x59\
+\xea\x47\x0e\x19\x19\x24\x67\x0c\x3c\xa9\x75\x91\xcb\xec\x00\xa8\
+\xd6\xe8\x6c\x4d\xdf\x0f\x12\x0c\xd4\xd9\x35\xb9\xd5\x9c\x00\xf6\
+\x26\xc8\xd1\xa4\x8b\x04\xb8\xb4\x70\xbf\x32\xb4\x20\x2d\x41\xb9\
+\x4c\x21\x90\x90\x83\x26\x12\xff\x6d\xe4\x24\x0b\x2f\x92\x25\x5b\
+\xda\x06\x6d\xe7\x3a\x86\x28\x9b\x73\x49\xc8\xc3\xb8\xc3\x71\x3e\
+\x3f\x75\x43\x00\x56\xf8\xb1\x2f\xff\xaa\x45\x71\x72\x3f\xc5\xe1\
+\x94\x18\x3a\x5e\x21\x0b\x92\x4a\x24\x78\xfa\x8e\x6d\x55\x37\x31\
+\x6b\x6f\xfb\x69\xd4\xa4\x35\x98\x6f\xaf\xae\x32\x29\x08\x21\x1f\
+\xcc\xc7\x40\x51\xfc\x06\xab\x26\xf7\x99\x0d\x01\x58\xf1\x0e\x34\
+\xd3\x00\xcc\x21\xf2\x76\x1f\xe9\x26\x31\x6c\x35\x45\x68\x82\xbc\
+\xbb\x41\x2a\x2b\xa9\xa6\xd0\x8a\x31\xca\xe3\xf1\xf0\x27\xc4\x03\
+\x90\x4a\x85\xc0\x20\xac\x71\x23\x7c\xfc\xee\x99\x83\x4b\x9c\x80\
+\x8d\x4a\x90\x7d\xf6\x15\x8c\x71\x2d\x8f\x78\x11\x1f\x16\x00\xf3\
+\x8e\x95\x2b\x56\x37\xe4\xcd\x7f\x9a\xe1\xf4\x0a\x80\x95\x38\xff\
+\x7c\x29\x09\x53\x85\x48\xe8\x03\xfb\x13\x43\x40\x6b\x74\x76\x4f\
+\x59\x97\x0f\xcc\x7c\x94\x62\xf3\x0a\x80\x95\xf4\x58\x6b\x21\xc6\
+\x54\x23\x1d\x28\x86\xc2\xb4\x70\xe8\x18\x5e\xe8\xbf\x65\x74\xa5\
+\xfd\x5e\xbd\xcb\xec\x15\x00\xab\x40\xf5\x77\x6a\x1e\x85\x1b\x76\
+\x46\xfa\xc3\x8b\x99\xe1\x70\xf9\x96\x65\xfc\xda\xb0\xed\xa1\xb1\
+\xf2\x9d\x33\x5e\x01\xb0\x0a\x2a\xee\x3c\x86\x29\xdc\x7c\x64\x77\
+\x08\x3c\x9d\x1c\x0c\x5f\xf5\xdf\x9d\x6b\xee\xb3\x24\x91\x9f\x92\
+\xc1\x2b\x00\x56\x5b\x5e\xeb\x3d\xca\xe7\xe3\x2f\xde\xcb\x89\x80\
+\xcc\x38\x3f\xb8\x32\x68\x5d\xac\xb8\x6e\x4a\xf0\x1a\x80\x95\xe2\
+\xed\x9b\xd9\x52\x11\x75\xa9\xbe\x40\xc1\x02\xda\x2f\x69\xed\x19\
+\x5e\x05\xb0\x8a\xae\xd4\x66\x90\x33\x92\x3b\x5c\xb2\xf5\x59\xb6\
+\xef\x75\xc0\xd6\x2a\x1d\x1a\x2a\x89\x65\x3c\xfd\x3f\x01\x7e\xa1\
+\x8c\x64\x13\x04\xcc\xd8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x05\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xcc\x49\x44\x41\x54\x78\xda\xad\x95\x7f\x4c\x53\x57\
+\x14\xc7\xcf\xed\x7d\x2d\x6d\xe9\x1e\x0a\x7b\x83\xc2\x80\xca\x8f\
+\x5a\x98\xb8\x58\x46\xc2\x64\xc1\x01\x82\x71\xa8\x43\x22\x12\xb6\
+\x19\x93\x49\xb3\x8c\x85\xfd\x8c\x1b\x19\xdb\x0c\x03\x36\x06\x73\
+\x71\x18\x96\x4c\xb2\xa8\xcc\x48\x8d\x4e\x0d\xcb\x74\x6c\x4e\x20\
+\x9a\x19\xe2\xd8\xc4\xb1\xf2\xab\xf2\xa3\x0e\x0a\x14\x5b\xa1\xaf\
+\x3f\x46\x81\xbb\xfb\x5c\x34\xfe\x31\xf3\x6a\xd2\xef\x1f\xef\xdc\
+\x73\x73\xde\xfd\xe4\x9c\x73\xdf\x79\x08\xee\x93\xae\xc1\xcc\x01\
+\x82\x6d\x88\xc0\x46\x82\x20\x0d\x08\xc4\x22\x80\x71\x02\x70\x95\
+\xda\x0b\x04\x48\xdb\xc0\xde\x44\x1b\x3c\x84\xd0\xdd\x85\xb6\x6e\
+\x30\x87\x9a\xf2\xf8\x30\x59\x74\x61\x0a\x1b\xfc\x6c\xbc\x2a\x52\
+\x13\x2a\x55\x8d\xd9\x7d\x7c\x87\x99\xbf\x79\xba\x6f\xde\x3b\x32\
+\xbb\x70\x13\x10\x39\x38\x54\xa1\xfb\xe5\xa1\x00\x09\x35\x7f\xe5\
+\xc8\x19\x49\xe5\x8b\xa9\x2b\xb9\xb7\xb2\xc2\xd7\x38\x78\x00\x8f\
+\x0f\x40\x15\x04\x10\xa2\xa0\x41\x34\xca\xb7\x04\xe4\x8b\xae\xe9\
+\x3f\x4f\xfc\x6e\xbf\xe5\x5d\x24\xb5\xe6\x0f\x9e\xf0\x0b\x82\xe2\
+\xf6\xf5\x72\xb4\x04\xcd\x86\xf5\x5c\x7c\xf9\x06\xf5\x9a\xc1\x19\
+\x80\xf0\x15\x00\x4f\x7d\x6e\xb9\x17\x34\x55\x15\x73\x6f\xfd\xf1\
+\x79\x6b\xdf\x91\x6e\xdb\x0d\xfa\xaa\x61\xb4\x6a\xad\x68\xb9\x50\
+\x4c\x65\xcf\x9e\x78\x4e\x5e\x76\xfe\xb5\x24\x7d\x9f\x15\xc1\x63\
+\x61\x00\xd1\x4a\x80\x88\x7d\xff\x0f\x58\x5a\x26\x24\xaf\xb1\xff\
+\x9a\x79\xd6\xdb\x64\xa9\x4d\xfd\x46\x14\x10\xb5\xb7\xbb\xf5\xc3\
+\x2d\xd1\xfa\xe7\x9f\x54\x6b\x47\x69\x69\xd6\x46\x01\x04\xc3\x83\
+\x01\x82\x0e\x5e\xb4\x0e\x7f\xf6\xa3\xa5\x67\xa2\x21\xbd\x44\x14\
+\x10\xf1\xe6\x25\x73\xd7\x7b\x7a\xb5\xd3\xab\x54\xe6\x1f\xb6\x88\
+\xc5\xdf\x81\x99\x26\xdd\xce\x9c\x86\x3f\x66\xa6\x0e\x3c\x93\x20\
+\x0a\xe0\xca\x3a\x7c\x13\x8d\x1b\x98\xcb\xc3\x08\x4a\x5a\xfd\x03\
+\xb8\xff\x21\x44\xf3\x4e\xd7\x92\xad\x29\x4b\x2a\x0a\x58\x69\x68\
+\x37\x5f\xa9\xca\x50\x4f\xce\x05\x2b\xfd\x05\x5c\x19\x76\x79\xf2\
+\x1b\x7e\x9d\x74\x34\xe7\x89\x67\xc0\xee\xfe\xa1\xb5\xba\x58\xa7\
+\xcf\x48\x8a\xd3\xca\x42\x01\xd4\x2c\xc0\xa3\x22\x3d\xa8\x3e\x3d\
+\x36\xbd\xbf\xcd\xd4\x31\x77\x34\x5f\xbc\x07\xc1\x2f\x9c\xdd\xa3\
+\x8d\x54\x95\x7d\xff\x7e\xb6\xde\xe2\x46\xa0\xa6\x4d\xa6\xb7\x14\
+\x74\x0f\x00\x8c\xcf\x11\x28\xae\xbb\x34\xd2\x67\x71\x7c\xe2\x3a\
+\x5e\x20\x7e\x8b\x14\x45\xa7\x38\x3a\x16\x9a\x5f\xcf\xd7\x26\xee\
+\xcc\x4a\x49\x96\xd2\x0c\xd8\x10\x80\xf4\xfb\x00\x13\x14\xe0\xa5\
+\xd6\xee\x06\xa8\x37\x0e\xf0\x47\x7e\xee\xa7\x18\x68\x74\x19\x0b\
+\xeb\x45\x01\xc2\x43\xb6\xdd\x98\xa3\x90\xe1\xca\xd2\x4d\xda\xa8\
+\xe2\xec\x14\xed\x22\x83\x40\xf5\x08\x80\x42\xf9\x5f\x90\x87\x1e\
+\x3c\x4f\x8f\x6c\x6d\xef\xe7\x4f\x74\x0e\x32\xbc\x67\x41\x2e\xc1\
+\xb8\xd3\x7d\xb2\x28\xcb\x2f\x80\x20\xbc\xf5\xd8\x9d\x59\x94\x14\
+\x1d\xa2\xd9\x99\x99\xc8\x25\x6b\xd4\xe1\xac\x4a\x85\x27\x6f\xf1\
+\xcb\x03\xe3\xd3\xae\xf6\xdf\x46\x6c\x26\x8b\xfd\xc6\xf2\x32\xc9\
+\x44\x08\x05\x61\x29\x06\x86\x91\x1e\x72\x1a\x0b\x5f\xf1\x0b\x20\
+\x48\xb2\xb9\x85\x03\x20\xdb\xe8\xee\x46\xea\xa6\x11\x61\x9a\x22\
+\x34\x4e\xf7\xae\xd2\xc9\x4a\xa7\x29\xb4\x61\x8c\x76\x48\x24\xf8\
+\x2b\x9a\x01\xb0\xac\x1c\x08\xc2\x46\x1f\xc2\xbb\x6f\x1f\x7e\x6e\
+\x41\x14\xe0\xaf\x64\x05\xc7\xdf\xc6\x18\xef\x97\xd0\x2c\x92\x63\
+\x42\x61\xd6\xbd\x74\xce\xe9\x83\x1d\xb3\x5f\xe7\x7a\x02\x02\x10\
+\xa4\x2c\x3a\x59\x49\xcb\x54\xa3\x90\x07\xc1\xa6\xd4\x48\x30\x59\
+\x3d\x97\x27\x9c\x8b\x9b\xa7\xbe\xcc\xe4\x03\x02\x10\xc4\xee\x6a\
+\x2b\xc5\x98\x69\xe6\xc2\x94\x50\x9a\x1d\x0b\x9d\x43\x73\xbd\xd7\
+\xad\xde\xec\xbf\xeb\xd3\xed\x01\x01\x08\x0a\x33\xfc\x64\x90\x30\
+\xf8\xd0\xba\xb8\x15\xf0\x46\x5e\x2c\x9c\xbd\xee\x18\xbb\x30\xc4\
+\x3f\x3d\x5a\xbd\x6e\x2a\x20\x00\x41\xe1\xe5\x5d\xbb\x30\x83\x5b\
+\x4a\xd6\x47\xc2\xcb\x19\x11\xf0\x5d\xef\xed\x99\x96\x1e\x47\x1a\
+\xfd\x29\x59\x02\x02\x10\xf4\xf8\xbb\xdd\x2f\x49\xa5\xf8\xdb\x4f\
+\xb7\xaf\x82\xbc\xa4\x10\x38\xd7\xef\x9c\xaf\xb9\x68\x4b\x09\x18\
+\x40\x90\xe6\xa3\x6b\x05\xac\x82\x39\xd3\x54\xac\x11\x00\x1d\x67\
+\x4c\xae\xdc\x80\x02\x04\x25\xd4\x9a\x72\xe9\x37\x52\x38\x54\xb1\
+\xfa\x55\xc1\x0f\x38\x60\x75\xdd\x00\x1a\xac\xd0\x91\xbb\xfe\xbf\
+\xcb\x48\x74\x64\xf2\x25\xd1\x5e\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x04\xbe\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x85\x49\x44\x41\x54\x78\xda\xad\x95\x7d\x4c\xd5\x55\
+\x18\xc7\xbf\xf7\x8d\xcb\xbd\xa8\x0c\xba\x16\xe1\x26\x5c\x4d\x47\
+\xe1\x30\x79\xf3\x1a\x66\x97\x1b\xac\xa2\xf1\x12\x11\x46\x1b\x6c\
+\xb1\x28\x14\x22\xca\xa2\x36\xc5\xd0\xb6\xc4\x50\x69\x34\xd7\x7a\
+\xd1\xcd\xb1\x6c\xa9\xd4\x78\xc7\x5d\x8c\x77\x88\x82\x71\xb9\x8c\
+\xba\x80\x64\x4d\x31\xff\x48\x10\x15\xb8\xc0\xfd\xdd\xd3\xf3\xfb\
+\xfd\xf0\xea\xef\x2a\xfc\x43\xcf\x76\x38\x87\x73\x9e\xdf\xf7\xf3\
+\x3c\xe7\x3c\x7b\xae\x0c\x8b\x58\x4c\x69\x55\x11\x3f\x37\xbe\x9b\
+\x50\xb4\x1c\x1f\xd9\x62\x07\x99\xe7\x7a\x19\x3f\x9f\x4c\x09\x5b\
+\x96\xcf\xa2\x07\x05\xcd\x7f\x09\x1f\x7f\x66\x0c\x5c\x96\x8f\xeb\
+\xc0\xa6\x01\x73\x3f\x3c\x5c\xde\x8b\x0f\xd3\xc3\xb0\x94\x2d\xe6\
+\x13\x34\x23\x6a\xbb\x00\x7f\x10\x40\xa9\x06\xe4\x72\x1a\x34\xdb\
+\xb5\x5e\x48\xcb\xaf\x41\xd5\xd1\x68\x38\x67\x01\xc7\x1c\xc0\xcd\
+\x03\x4e\x27\xad\x69\x70\x14\xce\x94\xda\x0b\x39\x9f\xd4\xe0\xec\
+\xbe\x68\xc8\x94\x24\xa6\xa0\x41\xfb\xf6\xdb\xc0\x13\xee\x80\x41\
+\x02\xc8\x3c\x00\xc6\x3b\x11\xa4\x7f\x6d\x30\x46\x1e\xd1\x23\x7d\
+\xa8\x06\x8c\x00\xf6\x19\x12\x27\xc0\x3c\x89\x33\x12\x91\xd1\x97\
+\x83\x01\xe4\xf3\xa8\x1e\x19\xbf\xd7\x40\xae\x10\xf7\x19\x47\xbe\
+\x93\x40\xb0\x3b\x60\x80\x00\x0e\x85\xb8\xa1\x54\x2d\x64\x42\x40\
+\xd0\xec\xe4\xa3\xa7\x25\x73\xd0\x1f\x1a\xca\x85\x68\x3d\xc8\x59\
+\x46\xbe\x7c\xf4\x1c\x81\xe7\xed\x22\xc4\x31\x05\x84\xd8\xdd\x00\
+\x16\xfe\x0d\xc8\x59\x29\x5f\x10\xe7\x0f\xe9\xaa\x9c\x24\xc8\x91\
+\x17\x47\xb3\x83\x17\x27\x61\x8d\x5c\x3c\x73\x45\x4d\xe2\x73\x94\
+\xdd\xdc\xac\xa8\x25\xa7\xf5\x66\xf7\x0c\xfa\x3c\xc5\x47\x66\xfc\
+\xce\x9d\xe7\x76\xaf\x0d\xb6\x44\xdd\xdd\x7b\x46\xeb\x50\xf7\x0c\
+\x92\x7f\x73\xb0\x8a\x70\x05\xfe\x0f\x7b\xb9\x87\xc3\x8f\x11\x4a\
+\x29\xe0\xa5\x8e\x69\xf6\x55\xa4\x06\xab\x95\xcb\x07\x24\x77\x4e\
+\xe3\xa7\x28\x2f\x29\x20\xd1\x3c\xce\x8a\xb7\xfb\xc0\x8f\xde\x61\
+\x05\xdd\x71\x4e\xa9\x19\xc3\x97\x27\x84\xb3\x2f\xf2\x4c\xd8\xa4\
+\xd7\xe1\xdf\x9b\x76\xbc\xf2\x71\xd5\x03\x45\xb3\x93\x9e\x44\x6c\
+\xd4\x46\xf8\x52\x80\x49\x8d\x13\xa8\x8c\xf5\x95\x02\xe2\x2b\xc7\
+\xd8\x81\x18\x7f\x3c\x46\x8f\x77\xfe\x97\x3f\x71\xfc\x5c\x8f\xeb\
+\xe3\x43\xb9\x26\x18\xd6\xeb\x70\x6d\xd2\x8e\xb4\xa2\x07\x03\xbe\
+\x29\x8c\x87\xce\x5b\x03\x2d\x05\x97\x52\x7d\x15\xd5\x89\x6b\xa4\
+\x80\x17\x4f\x0f\xb3\x7d\x09\x1b\x60\xf0\x02\x6e\x71\xe2\xde\xa9\
+\x5a\x2b\x2a\x9a\x6c\x02\x20\x74\x9d\x0e\x63\x54\x1d\x3e\xf7\x3c\
+\x53\x67\xff\x65\x94\x94\x77\xc1\x18\xae\x47\x76\x6a\x84\xb0\xa7\
+\x22\xc5\xf4\xb3\x23\xa8\x7b\x6d\xa3\x14\xf0\xfc\xd7\x7d\x6c\xcf\
+\xce\xcd\xd0\xab\xef\x96\x49\x45\xbd\x15\xf5\x2d\x36\x7c\xb4\xcb\
+\x84\x08\x02\xf0\x36\x49\x25\xa9\x5d\x70\xd9\x5b\x66\xc6\xe8\x95\
+\x09\x94\x16\x26\x62\xa5\x97\x1a\xb7\x9d\xe2\xf5\xe6\x9e\xea\x43\
+\xc3\x5b\xa1\x52\x40\xec\x91\x56\xb6\x27\x73\x1b\xbc\x3d\x94\x42\
+\x9d\x3f\x4c\x77\x59\x5e\x7b\x17\x10\x1c\xa8\x13\xd2\x9f\x26\x91\
+\x1b\x94\x61\x57\xbb\x0d\xa7\xeb\xac\x78\x66\xdb\x06\xa4\xc4\x6f\
+\x11\x34\x78\xc0\x2d\xea\x23\x25\xdf\x76\xc0\xfc\xfe\x0e\x29\xc0\
+\xb4\xbf\x8e\xbd\x97\x1b\x0d\x2f\x4f\x4f\x6a\x07\x4e\xe8\x54\x72\
+\x34\x99\xad\xa8\x6e\xb6\xa1\x68\xb7\x09\xfe\x6b\x75\xd0\x90\xf7\
+\x0c\xd5\xf8\x24\x01\x8a\x8f\xd6\xe2\xfa\xf8\x14\x0e\x17\x26\x61\
+\xf5\x0a\x0f\x8c\x4c\x73\xf0\xf5\x50\xa0\xeb\xe2\x35\x54\x56\xf4\
+\xe1\xc2\xc1\x38\x29\xc0\x98\xff\x03\xcb\x2f\x88\x83\x27\x01\x38\
+\x8e\x83\xb7\xa7\x1a\x17\x08\xd0\xd4\x6a\x43\xce\x9b\x26\x04\x06\
+\xe8\xe0\xa7\x14\xa3\x37\x53\x56\x55\xe7\xad\x88\xd9\x11\x84\xd4\
+\xb8\x10\x5c\x9a\xe1\xa0\xd7\x88\x8f\xf3\x5d\x4b\x3f\x9a\xeb\x87\
+\xd0\xf2\xf9\x4e\x29\xe0\xe9\xcc\x13\xec\x9d\xa2\x64\xa8\xd5\x6a\
+\xea\x98\x4e\x68\xb5\x5a\xb4\x35\x0e\xa0\xb5\xcd\x86\xac\x2c\x13\
+\xd6\x05\xe8\x5c\x6f\x73\xec\x18\x45\x7f\x63\x1a\x65\x07\x92\xe1\
+\xa1\x52\xe0\x3a\xb5\x10\x7f\x2a\x6f\x0b\x65\xd4\x6f\x1d\x85\xf9\
+\x4c\x2f\xda\x4e\x64\x4a\x01\x4f\xa5\x96\xb1\xb7\x0f\xbd\x0a\x8d\
+\x46\x23\x00\x54\x2a\x15\x3a\xdb\x86\xe9\xae\x87\x90\x91\x19\x0d\
+\x3f\x7f\x6f\xc1\xaf\xbb\x73\x04\x2d\x3f\x0f\x22\x29\x21\x0c\x5b\
+\x23\xd7\x43\xb9\xa0\xb0\x86\x00\x65\x15\x2d\x30\x3e\x17\x85\x83\
+\xd9\x5f\xa2\xf3\x4c\x9e\x14\x60\x88\x2b\x66\x79\x65\xaf\xbb\x00\
+\xbc\x75\xb5\x5f\x44\x4f\xf7\x28\xd2\x32\xb6\xe3\x21\x9d\x96\x9a\
+\xa0\x1c\x03\x96\x2b\xb8\x34\xf4\x0f\xb2\xb3\xa2\xa1\x50\xc8\x05\
+\xbf\xab\x37\xa7\xd0\xdc\xd0\x86\x4d\xe1\x8f\x23\x29\x28\x00\x2f\
+\xc4\x7f\x8a\x5f\x1b\xf6\x4a\x01\x91\xc6\xfd\x6c\xd7\xf1\x37\xb0\
+\x6a\xd5\x2a\xe1\x7f\x85\x42\xbc\x53\x25\xf5\x66\xbb\xdd\x2e\xac\
+\x79\x00\x6f\x0e\xbe\xad\x82\xef\xa4\x0c\x96\x76\x0b\xb5\x6e\x19\
+\x0c\x26\x03\xb6\xf8\x68\x85\x4a\x7b\xd6\x58\x00\x4b\x47\x89\x14\
+\x10\xb1\xb5\x80\xed\x3e\x99\x2b\x7c\x7c\x27\x83\xa5\xec\xef\xb1\
+\x09\xd8\xc7\x27\xe0\xeb\xb7\x12\x21\x21\x21\x2e\x71\xbe\x55\x84\
+\x1b\x3e\x40\x6f\xf7\x11\x29\xe0\x7b\xf5\xfd\xbf\xc9\xf7\xd9\x52\
+\xed\xda\xcd\xd2\x66\x45\xcf\xff\x00\x26\xc1\xbd\x28\x45\xb9\xb0\
+\x94\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xa5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x6c\x49\x44\x41\x54\x78\xda\xad\x96\x5d\x6c\x53\x65\
+\x1c\xc6\x7f\x5d\xbb\x76\x5d\x0b\xdd\x3a\x46\x1a\x2a\xdb\x20\x31\
+\x60\x50\x99\x8e\x6c\x83\x68\x4c\x4c\x34\x41\x10\x63\x42\x42\xc2\
+\x0c\x9a\x68\xa2\x17\x53\xf1\xeb\x72\x92\xe8\x4d\xc9\x30\xc3\x8b\
+\x71\xa1\x17\xc6\x29\xf1\x5b\x71\x43\x50\x83\x84\x4d\x96\x0d\x02\
+\x4e\x66\x60\x13\xcd\x30\x80\x6e\xd2\xad\x9d\x5d\xb7\xae\xed\xda\
+\xd7\xa7\x3b\x4d\xf4\x6e\xbb\x38\x27\x79\xd2\xf4\xfd\x7f\x3c\xff\
+\x8f\xf7\x39\x39\x0e\x96\xf1\x3c\x39\xd1\x62\xde\xff\xfb\x28\x5c\
+\xd7\x9f\x3f\x84\x79\x61\x75\xc1\x80\x63\xa9\xd8\x25\x1d\x0a\xcf\
+\xb1\xd9\x2f\x4d\x43\x79\x80\x4f\xc7\x22\x7c\x75\xf9\x12\xce\x92\
+\x12\x7a\x3d\x13\xf0\x90\x4d\x04\xe7\x33\xe7\xcc\x2a\xd7\x24\x9d\
+\x63\x3b\xe8\xbe\xa0\xe2\x2b\xa0\x3f\x24\x43\xbd\x5d\x04\xe9\xf3\
+\x66\x8d\x3b\xc5\xe1\xb1\x07\xf8\x62\x00\x36\xd5\xc1\xe4\xda\x06\
+\x06\x6b\x2f\xda\x43\xd0\x9b\x3a\x63\x6a\x3d\x19\x0e\xfd\xf6\x30\
+\xc7\x06\x61\xeb\x1d\x50\x5b\xf3\x12\x87\x42\x1d\xf6\x10\xfc\x98\
+\xea\x33\x21\x77\x82\xf6\xd1\x9d\x7c\xa3\x0e\x1a\xee\x84\x7c\x68\
+\x3b\xc7\xeb\x4e\xda\x43\xd0\x9f\x3a\x6b\x82\xae\x28\x91\xd1\xc7\
+\x39\x75\x0e\xea\x6a\x74\xa6\x3d\xd0\x68\xd3\x0e\xbe\x4d\x9c\x30\
+\xd5\xee\x71\x22\x57\x9e\x66\xe0\x12\x94\x97\xc3\x55\xaf\x0c\xbb\
+\x6c\x22\x38\x70\xb3\xcd\x34\xaf\xcc\xd0\x39\x72\x90\xe1\x51\xc9\
+\x40\x3a\xb8\x95\x92\x61\xff\x32\x08\xf6\xfd\xde\x62\xba\xfe\x94\
+\x88\xa6\xb1\x30\x2b\x38\x85\x95\x42\x40\x58\x01\xd5\x65\x01\x22\
+\xe1\xc7\xe8\xba\xda\xc5\xf5\x9b\x10\x8f\xcb\xf5\x2f\xd9\x4c\x11\
+\x05\x1a\x57\xf1\x77\x41\xc8\x17\x73\x54\xea\xa8\x3b\xf6\xb5\xa9\
+\x0f\xd4\x30\x30\xfd\x2e\xd7\xe2\xe3\xdc\x88\x47\xc9\x9a\x1c\x95\
+\x65\x7e\x2a\xbd\x3e\x02\x5e\xff\x62\x9c\x2f\xb7\x81\x8e\x2b\x6d\
+\x4c\xc5\x20\x99\x50\x9e\xb4\xf4\x50\x59\x81\xc7\xe5\xc4\x53\xea\
+\xc6\xef\x71\x93\xc9\xe5\x88\x27\x93\x8b\x95\x87\xab\x82\xfc\x10\
+\x1b\xc3\xd1\x33\xd5\x6d\xd6\xfb\x7c\x7c\x3e\xd9\xca\x50\x6c\x84\
+\x89\x49\x48\x69\x04\x6e\x37\x28\x06\x97\xd3\x6a\x75\x76\x0e\x66\
+\x94\x78\x46\xf1\xf3\xea\x72\x21\x63\x9d\xbb\xe4\xa3\xfc\xb8\x3d\
+\x90\x51\x5c\x72\x46\x71\xda\x4f\x4d\x2d\x0c\xe5\x0b\x23\xba\xdc\
+\x62\xb6\xaf\x5e\xc3\x7b\x37\xda\x89\x46\x61\x4a\xc8\x28\xd8\x5d\
+\x26\x47\x8f\xe5\xec\x2c\xb1\xce\xe6\x94\x78\x4e\x09\xe6\x45\x96\
+\xcb\xfe\x37\x67\xbd\x39\x70\xa8\x10\x35\x40\x89\xda\x0d\x4a\xe5\
+\xe1\xb5\x70\x31\xeb\x50\xf7\x9f\x60\x9e\x5b\xf7\x20\x3d\xbf\x9e\
+\x26\xa1\xea\xd3\xe9\x62\x65\x0a\x28\xf5\x6b\x05\x15\xd6\xad\x59\
+\xd0\x6c\xe7\x54\x7d\x52\xf3\xcf\xaa\x52\x67\xa9\xec\x42\x2e\x6f\
+\xed\x21\x9f\xb7\x0a\xf1\x6a\x6f\xc1\x6a\x8d\x5f\xf8\x25\xe9\x15\
+\xc1\x41\x99\xc7\xe5\x94\x28\x2e\xa9\xf4\x7f\x8b\x52\xeb\x04\xad\
+\x65\xad\xbb\x5d\xc9\x35\xff\x7f\xd4\xa1\x43\x7e\xe9\x94\x75\x01\
+\x16\x7d\x0b\xe3\xca\x16\x63\xca\x8a\x17\xc4\x27\x94\x2f\xf3\x9a\
+\x72\x04\xd3\xba\xf5\x11\x3e\x1a\x3e\x41\x4c\xaf\x6c\x7f\x95\x76\
+\x51\xd8\xcd\xb3\x36\xe9\x80\x0f\x30\x07\x9a\xf6\x71\xe4\x42\x17\
+\xd1\x11\x35\xa5\x6e\x62\xaa\x8e\xdd\x36\x11\xdc\xf3\xfd\xdd\x66\
+\xef\xc6\xfb\x89\x0c\x74\x32\x25\x25\x57\x6d\x86\xa7\x36\xec\xe7\
+\xad\xfa\xc3\xf6\x10\xbc\xfa\xf3\x2b\x66\x73\x28\xcc\xf3\x7d\x2f\
+\x33\x3d\x04\x15\x0d\x9a\xda\x96\xa3\xec\xad\x6b\xb1\x87\xe0\xcd\
+\xe1\x37\x4c\x78\x95\x97\xd6\x33\xaf\x31\xa7\x0e\x56\x34\xc1\xc7\
+\x4d\xc7\xd9\x11\xde\x69\x0f\xc1\x9e\xde\xdd\x66\x7d\x28\x48\xe4\
+\xd4\x3b\x98\x6b\xba\x1c\xdb\xe0\xb3\x46\x11\xdc\x66\x13\x01\x1d\
+\x98\x27\xb6\x3d\xca\x87\xdf\xf5\x2c\xbe\xab\x3c\x8d\xd0\xbe\xf1\
+\x6d\x5e\xd8\xf4\xa2\x4d\x04\x6d\x98\xfb\xb6\xdc\xcb\xd9\xbe\x9f\
+\xa4\x24\x09\xea\x2e\x68\xf6\x36\xd3\xbf\x6b\xd0\x26\x82\x67\x24\
+\xc6\x5b\x58\x9f\x2b\x05\x11\x85\x05\x69\x81\xd7\x97\x8e\xff\x17\
+\x60\xe2\x31\x42\x0a\x3b\xe3\xcd\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x05\x71\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x38\x49\x44\x41\x54\x78\xda\xa5\x94\x5d\x6c\x53\x65\
+\x18\xc7\xff\xe7\xab\x3d\x6d\x4f\xd7\x32\x1d\x9f\x8e\x6d\x3a\xc7\
+\x67\x90\x80\x52\x0b\x5b\x1c\x23\x68\x66\xe2\x05\x5e\x80\x66\x41\
+\x63\x10\x23\x17\xdc\x10\xbd\x30\xde\x78\xe1\x85\x44\x6a\x8c\x60\
+\x82\x89\x8a\x48\x02\x59\xb2\x60\xd4\x04\x42\x11\x70\x30\x16\x5c\
+\x98\x10\x60\xc8\x58\x37\x3e\x36\xb6\x76\x6c\x2b\xeb\xfa\x79\xbe\
+\x5e\x9f\x73\xd6\x0d\xc6\x0a\x92\xf8\x5e\xf4\xb4\x7d\x9f\xf7\xf9\
+\x3d\xcf\xff\x7d\xfe\x87\x43\x81\xc5\x36\xbc\xea\x32\xcf\xb4\xcc\
+\x13\x86\xd2\x11\x3c\xc1\x62\x2f\x2f\x59\xae\x47\xba\x23\xd2\x50\
+\x36\xf9\xf0\x1e\x37\x2d\xf8\xd7\x46\x17\xce\x36\x87\xcd\x1f\x7f\
+\xaa\x4c\x1b\x6a\xad\x37\xae\x77\x3e\x36\xf9\xc1\x1f\x82\x68\x6a\
+\x0c\xe7\x4e\x37\x5f\xcc\x6a\x5a\xbd\x7f\xd4\x4c\x3e\x12\xc0\x5a\
+\x9b\x5d\x30\xf4\x30\x92\xc9\x6a\xd4\xd4\x21\x31\xd7\x1f\xcd\x9a\
+\x46\xed\xac\x24\x0a\x42\xd8\xf9\xd6\x20\x62\xd1\x30\x5e\xdf\xa0\
+\x64\xe6\x7a\x91\x1a\x4b\xb6\x64\x19\xea\x4b\x53\x48\x4e\x03\xb0\
+\xef\x77\xbb\x50\x5a\x16\x46\xd9\xb3\xd5\x58\xb0\x18\x38\x71\x0c\
+\x99\xeb\x1d\x18\xfd\xf8\xa3\x28\x6d\xd7\xce\x49\x4d\x85\xb0\xbf\
+\xdb\x82\x60\x46\x18\x2b\x02\x0a\xfe\xe9\x80\xd9\x71\x11\xb1\x2d\
+\xef\x22\xa7\x9b\x2d\x30\x51\x5f\x91\x1d\x87\xd8\x00\x73\x69\x85\
+\xc2\x55\x55\x1d\xc5\xc6\xb7\xab\xb1\xf1\x1d\xa0\xa7\x0b\xb8\x7a\
+\x09\xa9\xb6\x56\xa8\x99\x0c\xd4\xbd\x7b\xa3\x0e\x0e\xb5\xc5\xf9\
+\x4e\xd8\xc9\xa3\x41\x78\xbd\x61\xbc\xb8\x46\xc1\x40\x3f\xc5\x5e\
+\x46\xe2\xc8\x61\x24\x2e\xb4\x43\x6f\x6b\x07\xc7\xd0\xc2\xf2\x10\
+\x6e\xcc\x27\x0a\x44\xf9\x53\x5c\xbd\xba\xda\xf9\xd5\xb7\xc0\xf5\
+\x6b\x76\x85\x06\x1d\x4c\xf7\x74\x42\x1f\x19\x81\x54\x56\x01\x6d\
+\xe7\xce\xa8\x4b\x92\x6a\xe5\x4d\x9b\x8a\xb1\x76\x5d\x18\x1b\x37\
+\x2b\xb8\x75\x13\xb8\xd1\x85\x74\xf3\x49\x8c\x9c\xfa\x03\x4c\xcd\
+\xc1\xe9\xf2\x00\xed\xe7\x49\x69\xa3\x45\x65\x58\x6f\x77\x10\xf3\
+\x60\x07\x73\x39\x43\xc2\x2b\x6b\x21\xcc\xf0\x81\x77\xc8\xe0\x78\
+\x9e\x82\x34\x6a\x0f\x10\x5c\x32\x3c\x6b\x6a\x90\xdb\xba\x65\x58\
+\x5e\xf9\x92\x8b\xff\xed\xb8\x1b\xd7\x3a\x28\x79\x0f\x92\xe7\x5b\
+\x10\x3f\x7b\x86\xe2\x05\x14\x2d\x5b\x0e\x87\x2c\x43\xdb\xff\xb3\
+\xd5\x79\xf0\xe9\xa4\x79\x6e\xf2\x0e\x6e\xc8\x04\x11\x11\x12\x9e\
+\xab\x04\xef\xf3\x42\xf0\x28\x10\xbd\x0a\x3d\x3d\x10\x3d\x45\x10\
+\xfd\x33\xe0\x5e\xb7\x1e\x28\x2d\xa7\x61\x38\x0b\x2d\x3e\x8c\xd4\
+\xb5\x2b\x48\x92\x2c\xe0\x38\xf8\x56\xd7\xc0\xe3\x2b\x06\xa3\x4e\
+\xb4\x4b\x97\x83\xee\xe1\xf4\xb9\x69\x53\x14\x71\x62\x07\x2c\x48\
+\xd9\x7c\x08\xc5\x7e\x48\x3e\x3f\x41\xa8\x23\xb7\x1b\x02\x55\x26\
+\x50\xfb\x9c\xec\x04\xcb\xe6\x90\x8d\xf5\x21\x13\xe9\x86\x91\x4e\
+\x43\xa1\xca\xbd\xcf\x94\x42\x1a\x1b\x03\xe7\xf5\x04\xf8\x2f\xf6\
+\xb4\x3d\xd2\x07\x13\x10\xc7\xc2\x2a\x88\x25\x33\x29\xa9\x9b\x34\
+\x92\xac\x51\x00\x27\xf0\xf6\x11\x93\x92\xaa\x77\x07\xa1\x25\x46\
+\x21\x15\x15\x41\x99\x37\x1f\x52\xf3\x69\x38\xd6\xd5\x05\x9c\x8d\
+\xbf\xb7\x3d\x98\x6f\x1a\x60\x42\x2e\x5e\xe4\x43\xd2\xaa\x95\x24\
+\x91\x17\xa6\x69\x50\xd5\x2a\x18\xd3\x61\x32\x06\x96\xc9\x42\x1f\
+\x4b\xc0\xd4\x54\x48\xb2\x0b\x52\xcf\x6d\x48\x8c\x05\x4a\x52\x66\
+\xdb\xc3\xb9\x0a\x02\xac\xd5\xef\xc6\x37\x90\xc4\xed\x42\x4d\x0d\
+\x0c\x35\x0b\x83\x92\x32\x4a\xc8\x0c\x06\x53\x55\xe9\x77\x0a\xd0\
+\x68\x08\x06\x86\x20\x32\xbc\x59\x9e\xc3\x2f\x85\xf2\x14\x04\xc4\
+\x64\x04\xe9\x11\x2e\xde\xb7\x4f\x19\x39\x78\x08\x6a\x62\x04\x46\
+\x2a\x65\x8f\x21\xb9\x80\x20\x86\x5d\x3d\xcb\x6a\x10\xfc\x5e\x68\
+\x57\x6f\x46\x05\x60\x55\xa5\x8e\xde\xff\x04\x64\x3f\xdd\x11\xd4\
+\xfb\xef\x84\x3d\xdb\xb6\x2b\x77\x77\xed\x84\x3e\x34\x88\xdc\x50\
+\x1c\x46\x76\x0c\xd0\x75\x8a\xe0\xf3\x56\x36\x09\x64\x49\x66\xda\
+\x83\xa0\x5d\xbf\x6d\x3b\x7e\xa1\x3e\xd5\xf1\x53\x00\xc6\xfe\xef\
+\x82\x4c\xd7\xc3\x42\x5d\xbd\x32\xba\x7b\x17\xd2\x17\x2f\x20\x37\
+\x18\x83\x3e\x4a\x00\xaa\xf8\xfe\x29\x0e\x9c\x28\x10\x8a\xb7\x6c\
+\x42\x77\x63\x40\x2c\x22\x48\x67\xaf\x0d\x59\x64\xdc\x87\x4c\x02\
+\xd2\x9f\x7d\x12\xe4\xfd\x45\x61\xe7\x86\xb7\x94\x54\xe3\x01\x24\
+\x8e\x1e\x41\x2e\xda\x8f\x5c\x7c\x04\x04\xa5\x09\x22\x11\x48\x1a\
+\x4b\x22\xfb\x18\x47\x9d\x88\x22\x04\x02\x59\x5d\x30\x4d\xb7\xbd\
+\xa2\x46\xfa\x6c\xc8\xe2\x3c\xc4\x06\xdc\x52\x9c\x41\x69\xee\xac\
+\xf0\x9c\xfd\x07\x94\xc1\xaf\x43\xc8\x75\x77\x43\xbd\x37\x0c\xed\
+\x5e\xdc\x0e\xe1\x5d\x2e\x08\x56\x87\xfd\x71\x30\x3a\x21\x2d\xae\
+\x40\xae\xb7\x97\xa0\xe2\x38\xd8\xc2\x12\xdc\x92\xcc\x31\xb3\x84\
+\x20\x03\x93\x10\xae\x93\xc7\x6c\xaa\xa5\x6b\xf6\x97\x9f\x2b\xb1\
+\x3d\xf4\x2e\xa2\x29\xd1\xd5\x34\x19\x28\x05\x5e\x12\x6d\x17\xf3\
+\x94\x9e\xdd\x89\x5a\xc5\xbf\x41\xb7\x50\x45\x90\x90\xb4\x60\x3e\
+\x72\x7d\x7d\xb6\x5c\xe3\x04\x46\x5f\x49\x34\xc9\x61\x77\xca\x46\
+\x73\x51\x92\x2f\x60\xef\x76\xf0\x64\x2e\x20\xe4\x7a\xa1\x0a\x99\
+\xae\x08\xc5\x9a\xe0\xad\xf6\xdd\x5e\x38\x9f\x2a\x81\xbf\xae\x16\
+\xda\xdd\xa1\x60\xc9\xa1\xc3\xb6\xfd\xaf\x52\xbc\x49\x10\xb9\x72\
+\x0e\xb2\x7d\x03\xe3\x5a\x53\x27\x82\xc3\x69\x77\xc5\x86\x13\x96\
+\x2f\x9b\x48\xd0\x86\xc9\x3b\xb8\x9c\x87\x70\x0e\xd8\x8e\x15\xc8\
+\x40\x72\x79\x39\x66\xbe\xff\x01\x78\x45\x09\xc8\x9b\xb7\x4c\x31\
+\xd1\x95\x7c\xbc\xbc\x94\xe4\xea\xb9\x05\x9e\xdc\xce\x89\x12\x04\
+\xba\x0b\x7a\x4b\x36\xe9\x29\xbd\x61\x11\xa0\x4e\x99\xa2\x4b\x74\
+\x88\xfe\x08\xf1\x2e\x6b\x3e\x24\xcc\xda\xb6\x15\xf2\x92\xa5\x01\
+\xf7\x7b\x1f\x4e\x73\xe8\x44\x51\x56\x3c\x27\x53\x3c\x2f\xc1\xbd\
+\xe8\x79\xb8\x57\xae\x68\x4a\xfd\xd5\xde\x50\x7e\xa1\x43\x2d\xe8\
+\x83\x09\x08\x47\x02\xfa\x5e\x5b\x1b\x28\x3d\x76\xaa\x60\xf2\xc9\
+\x78\xe4\x3b\xa7\x0f\x5f\x5d\xb0\x89\xe3\xa4\x86\xd2\x13\xa7\x27\
+\x67\x9a\x7b\xcc\xa1\xd6\x65\xc0\x39\x3c\xc1\xca\xc7\x5b\xee\x6f\
+\xa0\x33\xea\x83\x7b\xdc\x93\x24\xf8\x3f\xeb\x5f\x00\xb0\x53\xfb\
+\x24\xba\xbd\x42\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x03\xe8\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xaf\x49\x44\x41\x54\x78\xda\xad\x94\x69\x48\x54\x51\
+\x14\xc7\xff\x33\xef\xd5\x34\x33\x65\x24\xb4\x19\x58\x7e\x68\x35\
+\x8c\xca\xca\x76\x2d\x83\x32\xd2\x32\x99\x36\x0c\x1a\xa2\xd5\xca\
+\x16\xc7\x4c\x33\x53\x33\x73\xac\xa4\x85\x48\x34\xa8\xa0\xe5\x99\
+\x85\x26\x26\x59\x64\x8b\x41\x8b\x68\x44\xfb\x97\x0a\xaa\x0f\x41\
+\x56\xa4\xbd\xd1\x99\xb9\x9d\x3b\x6f\x1a\x7c\x63\x63\xd0\x74\xe0\
+\xce\xbd\x73\xef\xb9\xff\xdf\xb9\xe7\xde\x77\x34\xf0\x61\xd1\x87\
+\x2b\xb3\x78\x7f\x63\x6b\x6c\x96\x3f\x3e\x1a\x5f\x0b\xe6\x4b\x0d\
+\x8c\xf7\xa7\x12\xc6\xfb\xe5\xe3\x73\xc1\x52\xf7\xd6\xb5\xb9\x20\
+\x72\x88\x5f\x3e\x9e\x85\x97\x7a\x30\xef\xc5\x03\x67\x1b\x90\x9a\
+\x38\x1e\x5d\x99\x2f\x9f\x11\x3f\x15\x6d\x0f\xe0\x05\x01\x44\x1d\
+\xa0\xd5\x52\xa3\x5e\x36\x18\xb1\x2c\xb9\x0a\x95\x07\xa3\xe0\xb4\
+\x01\xf6\x36\xc0\xd1\x0e\x38\x9d\x34\xa6\xe6\xa0\x70\x5a\x74\x46\
+\x6c\xcc\xa9\x42\x59\x46\x14\x34\x22\x89\x09\xd4\x68\x5e\xfe\x01\
+\x8c\xf2\x06\x3c\x23\x80\xa6\x3b\xc0\xb8\x13\x41\x9e\x04\x87\xe2\
+\x4d\xff\x10\x24\xbe\xaa\x02\x23\x80\xfc\x93\xc4\x09\xd0\x4e\xe2\
+\x8c\x44\x34\xb4\xf3\xd9\x60\xf2\x19\x18\x82\x95\xcf\xab\xa0\x15\
+\x94\x79\xe6\x20\xdf\x6f\x40\xa8\x37\xe0\x29\x01\xec\x82\x32\x21\
+\x76\x73\x9f\x84\x80\xa0\xde\xc9\xa3\xa7\x21\xb3\xd3\x0f\x35\xd1\
+\x1d\x6d\x77\x72\xd6\x90\x2f\x8f\xde\x41\xe0\x76\x59\x81\xd8\x5b\
+\x80\x30\xd9\x0b\xd0\xc4\xef\x80\x9c\x45\xad\x5b\x9c\x2f\x52\xaa\
+\x9c\x24\xe8\x20\x2f\x07\xf5\x76\x2e\x4e\xc2\x7a\xad\xb2\xe6\x89\
+\x9a\xc4\xdb\xe8\x74\x6d\x36\x45\x4b\x4b\xe3\x31\xde\x27\x68\xec\
+\xa1\x5c\x32\xe3\x33\xbf\xaf\xdb\xfb\x6d\xb0\x2e\xde\x5d\xc7\x35\
+\x1a\x8f\xf3\x3e\x41\xfc\x23\x3b\x2b\x0f\x17\xf0\x3f\x6c\xf1\x63\
+\x07\x2e\x4f\x10\xd5\x80\x45\xf5\xad\xec\xe4\x44\x3d\xfa\x8a\xfe\
+\x03\xe2\xef\xb7\xe2\xca\x54\xa3\x1a\x10\x57\xfb\x85\xe5\x4f\xeb\
+\x83\x01\x74\x0f\x3d\x29\xc7\xe2\x1f\x52\xc1\xb3\xd0\xce\x7c\x0b\
+\xff\xa0\x97\x10\x48\x01\x2e\xbc\xd1\x8c\x8a\x39\x81\x6a\xc0\x82\
+\x8a\x0f\x6c\x6f\x74\x10\xa2\x8b\x82\xfd\x8a\xfe\x53\xda\x7b\x24\
+\x5c\xfd\x88\xab\x71\x83\xd4\x80\xf9\xe7\x5e\xb3\x8c\xd8\xa1\x48\
+\xcb\x90\xfc\x02\x94\x5b\x4d\x48\x2c\x7b\x83\xea\xe5\xc3\xd4\x80\
+\xb9\xc5\x8d\x6c\xfb\x92\x31\xd8\xb7\xa7\x0c\x25\xf9\x26\xd7\xdc\
+\xea\x9d\x92\x6a\xcc\x37\x7f\xa3\x27\x69\x4e\x95\x70\xa1\xc0\x04\
+\x1d\xa5\x72\xd1\x0e\xa9\x93\x7f\xd2\xe9\x46\xd4\xac\x1d\xa7\x06\
+\xcc\x29\xbc\xc3\xb6\x9b\x27\x23\x3f\xfb\x32\x8a\xf2\x4c\xe8\x47\
+\xb9\x5c\x6e\xe9\x0c\x68\x25\x40\xa2\x1b\xf0\x99\xbe\x8b\x4d\xbb\
+\x24\x1c\xcd\x53\x7c\xf8\x78\x57\x56\x02\xac\x25\xf5\xa8\xdd\x31\
+\x43\x0d\x98\x95\x59\xcd\xb6\x25\x45\xa1\x30\xaf\xd2\xaf\x14\xc5\
+\xaf\x9a\x81\x8a\xf2\x46\xdc\xcc\x8e\x51\x03\x22\x93\x2f\xb2\x64\
+\x4b\x0c\x8a\x0a\xaa\x91\x92\x1e\x87\xde\x3d\x74\xc8\xd8\x2d\xc1\
+\xba\x4f\x89\x2e\x25\x5d\xc2\xd9\x03\x26\x7c\x75\x74\x8e\x3a\x6d\
+\xcf\x62\x84\xe8\x05\xac\xa1\x53\xce\x9c\x37\x1c\x75\xd7\x5e\xe1\
+\x76\xd1\x12\x35\x60\xba\xb9\x94\x6d\xc9\x8a\xc7\xb1\x43\xd7\xb1\
+\x35\x75\x3e\x0c\x06\x83\xeb\x3e\x72\x73\x14\x21\x0e\xdb\x9f\xab\
+\x8c\xf9\x43\x28\x76\xa7\x8e\x8b\xf2\xf9\x20\x7a\xde\xd6\x33\xf7\
+\xd0\x2f\x38\x00\xb5\x52\x03\xee\x96\x9a\xd5\x80\x29\xa6\x23\x6c\
+\xd3\xfe\xa5\x38\x79\xf4\xd6\x3f\xa5\x66\x74\x68\x10\x64\xb9\x05\
+\x09\x2b\x66\x23\x7b\xdd\x09\xdc\x97\x36\xab\x01\x11\x31\xf9\x6c\
+\xf3\x91\x55\xd0\xeb\xf5\x54\xf3\x9d\xae\x39\x41\x10\x60\x34\x1a\
+\x61\xb3\xd9\x68\xb3\x4c\x45\x50\xeb\xfa\x1f\xa4\x13\x20\x77\xf8\
+\xe0\x3e\x7e\x6f\x41\x5d\xcd\x5d\x8c\x0e\x1f\x89\x85\x23\x06\x63\
+\xde\x82\x3c\x3c\xac\x49\x57\x03\x26\x46\x66\xb2\xf5\xc7\x57\x23\
+\x20\x20\xc0\x23\xce\x4d\xa4\xda\xcc\xc5\xb9\x71\x00\x37\x3b\x2f\
+\xab\xe0\x95\x94\xa1\xe9\x5e\x13\x95\x6e\x0d\x22\x66\x45\x60\x6c\
+\x1f\x03\x0c\xe4\x32\x3b\xd2\x82\xa6\x7a\xab\x1a\x30\x61\x92\x85\
+\x6d\x38\x95\xe4\xda\xfc\xfb\x04\x5d\xd9\xbb\x0f\xcd\x90\xbf\x34\
+\x23\x70\x40\x2f\x84\x85\x85\x79\xc4\x79\xa9\x08\x8f\x48\x41\xc3\
+\x83\x42\x35\xe0\xbc\x0e\xec\xaf\xaa\x5d\x95\x6b\x2f\x5b\x66\x53\
+\x3c\x7f\x01\x37\x1a\x77\x28\x31\x63\x61\x87\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x65\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x2c\x49\x44\x41\x54\x78\xda\xad\x55\x7b\x4c\x5b\x65\
+\x14\xff\x1d\x6e\x1f\x40\x78\xdc\x96\x47\x8c\xaf\xf1\x50\x18\x31\
+\xed\x70\x08\x73\x19\xc3\x0d\x93\x2e\x1b\x0b\x28\x33\x71\xc9\x0c\
+\xff\xcc\x98\x2c\xfe\xb1\x6c\xea\x32\xa3\xe8\x8c\x33\xee\x0f\x30\
+\xb2\xa8\xcb\xb2\xa0\x4e\x34\xd3\x68\x32\x66\x62\x96\x2d\x81\xf0\
+\x1a\x90\x5a\x5b\x09\x61\x20\x2c\xe8\x50\x84\x0d\x4a\xe8\x60\x02\
+\x7d\xdc\xcf\x73\x7b\x0b\x94\x52\x19\x31\x3b\xc9\xe9\xb9\xf7\x7c\
+\xe7\x9c\xdf\x79\xdd\xaf\x84\x30\x9a\x00\x72\x59\x1c\x65\x2e\x60\
+\x0e\x30\x77\x30\xd7\xa5\x01\x23\x88\x42\x6c\xff\x28\x8b\x43\xcc\
+\x16\xe6\x71\xe6\x56\xe6\x1f\xd8\x7e\x6e\xd1\x86\xc2\x8c\x5f\x64\
+\xf1\x45\xfc\xd6\xad\x71\x86\x6d\xdb\x20\xa5\xa7\x43\x69\x68\xc0\
+\xfc\xe0\xa0\x6f\x61\x61\xe1\x48\x0a\xf0\x69\x44\xf0\x37\x8c\x92\
+\x74\x32\xb6\xb0\xd0\x20\x95\x97\x43\xcc\xcf\xc3\x7b\xed\x1a\xee\
+\x36\x35\xfd\xca\xc7\x15\x8b\x49\x05\x01\x18\xba\x98\x74\xba\x26\
+\xf9\xc0\x01\x83\xc1\x66\x03\x52\x53\x81\xc9\x49\x2d\x92\xdf\x8f\
+\x40\x4d\x0d\x3c\xbd\xbd\xaf\x32\xc8\x67\xaa\xea\x36\x70\x44\xce\
+\xce\xfe\x48\x7f\xec\x18\x90\x90\x00\x98\xcd\xc0\xd4\x54\xd0\x3c\
+\xd0\xdf\x8f\xa9\xda\xda\xdb\xca\xdc\xdc\xa6\x07\x38\x74\x10\xe0\
+\x2f\xc0\x95\x52\x59\x99\x1f\xbb\x7b\x37\x50\x52\xa2\x05\x6e\x6b\
+\x63\x78\x3e\x16\x22\xc8\x81\xba\x3a\x65\xa6\xbf\x3f\xe3\x1f\x45\
+\x91\x53\xd2\xd3\x7b\x8c\x27\x4e\x10\xf4\x7a\x80\xab\x0d\xa6\xd9\
+\xd1\xc9\x3f\x22\xe8\xea\xb5\xdb\x31\x71\xee\x5c\xc3\xc3\x40\x15\
+\xfd\x01\x3c\xa3\x97\xe5\x96\x07\xab\xab\x81\x3d\x7b\xb4\xe0\x2e\
+\xae\x72\xe2\xd6\x72\x07\x55\x90\x3b\x77\x30\x7b\xea\x54\xbb\x4f\
+\x11\xf1\xa6\xe3\xc7\x0b\x60\x92\x81\x9d\x3b\xb5\xf3\xbe\x3e\x2e\
+\xeb\x96\x16\x9f\x34\x9c\xc9\xd3\xa7\xfd\x77\x87\x87\x1f\xa1\x1b\
+\x40\x6d\xda\xf6\xed\x47\x93\x76\xed\x02\xd4\x0a\x5c\x2e\x2e\x6c\
+\x3c\xda\x4c\x21\x7a\x7a\x84\x42\x44\x92\xd5\xaa\x29\xd6\xb0\x9f\
+\x73\x38\x30\xda\xd8\x58\x45\xd7\x81\xf6\xac\x7d\xfb\x8a\x8d\xd9\
+\xd9\xb8\x9f\x14\x70\xbb\x31\x58\x5f\x7f\x86\xb8\x19\xc3\x4f\xec\
+\xdf\x9f\xa9\x93\xe5\xb0\xa5\xd2\x7a\x89\xe9\x69\x80\x0d\x31\xed\
+\x01\x66\x67\x38\xad\xd0\xf6\xc5\xc6\x01\x89\x89\x08\xb6\xc9\x6c\
+\x02\x64\x53\xc4\x52\x0a\x08\xaf\x0f\xbd\x9f\xd7\x5f\x24\x3b\xc1\
+\xbd\xb9\xe2\x79\xb3\x14\x1f\xbf\x1c\x78\x86\x83\xb9\x79\x2b\xa6\
+\x38\xb8\xa2\x68\x33\x08\x07\xa7\xc5\x60\xfc\x2c\x49\x0c\x64\xd6\
+\x36\x4f\xdd\x28\x55\x4f\xac\x57\x04\x7e\xbe\xf0\x6d\x33\xb5\x03\
+\x03\x85\x3b\x76\xe4\x1a\x83\x87\xd0\x32\x9d\x99\x05\x7c\xbe\xe8\
+\xb5\x87\x63\xa9\x2f\x22\x04\x64\xd0\x6b\x55\x25\x24\x69\x2d\xf2\
+\x79\xd1\x7d\xf5\xca\x45\x6a\x06\x5d\x7a\xd2\x6a\x29\x97\xd5\x2c\
+\xfc\xbe\xe5\xc0\xe1\x59\x86\x07\x16\x2b\xd5\x4b\xc6\x14\x52\xe8\
+\x18\x48\xa7\xe3\x3c\x67\x60\x77\x3a\x3f\xa0\xcb\xc0\x2b\xa9\xc9\
+\xf2\xd9\x82\xbc\x8d\x20\xa3\xf1\xfe\x4c\xd8\xeb\x45\xcf\xd0\x10\
+\xc6\xdc\x93\x5b\xa8\x11\x94\xc0\x09\x0c\x58\x73\x72\x1e\xca\xcc\
+\xc8\x08\x25\x44\x2b\x33\xa4\xb0\x12\x44\xc4\xfb\x52\x85\xa1\x67\
+\xf6\x1d\x19\xb9\x09\x57\xff\xc0\x4f\xcf\x09\xb1\x37\x68\xfa\x1d\
+\xa8\x8c\xd7\xfb\xd2\x53\xf9\x9b\xa4\xcc\x0d\x1b\x22\xd2\x89\xd8\
+\xac\xc5\x76\x88\x88\x16\x86\xce\x6e\xfe\x39\x02\xbb\xcb\x39\x2a\
+\x14\xb1\x85\x2f\xb7\xd1\xa5\x71\x7d\x4d\x38\xc8\xcb\x72\x36\xf7\
+\xf1\x1c\xa9\x60\x73\x3e\x62\x62\x62\x42\x59\x45\x19\x2a\x61\x15\
+\x29\xbc\x6d\x0e\xa7\x13\x83\x37\x86\xc6\x49\x90\xed\x25\x88\xde\
+\x15\xae\x2a\xd5\x83\x4a\x59\xf3\x7d\x5a\x6a\xaa\xb9\xa4\xb8\x18\
+\xc9\x72\xf2\x72\xa6\x24\x56\xb4\x21\x7c\xf2\x1e\x8f\x07\xad\x6d\
+\xad\x98\x74\x4f\xfd\xc2\xba\xca\x83\x62\xf9\x7a\x5f\x95\xcb\x19\
+\xd0\x63\x2c\xbe\x91\xf4\xba\xa2\xa7\x8b\x8a\x60\xb1\x58\xa2\xad\
+\xcd\x12\xf5\x5d\xef\x43\x57\x57\x37\x5f\xba\xfe\x4f\xd8\xe6\xb5\
+\x43\x02\xde\x68\x0d\x5e\x41\x75\x04\x03\x1f\xbd\xc3\x8f\x6f\xe5\
+\x6d\xcc\x43\xe9\xb3\xa5\xfc\x3d\x49\xab\xec\x3a\x3b\x3b\xe1\x70\
+\x38\x3c\x8c\x5d\x75\x18\xe2\xc7\x68\xb1\xa2\x02\x2c\x52\x0d\xe8\
+\x05\xb6\xf8\x2a\x2b\x2b\x2b\xae\xbc\xa2\x22\x04\xa2\xb5\xa5\xb9\
+\xa9\x09\x4e\x97\xcb\x43\x10\xb6\xd7\x05\xec\xff\x15\x63\x4d\x00\
+\x95\x3e\x24\x2a\x62\x71\xd5\x62\xb5\x26\x97\x95\x95\x05\x01\xba\
+\xb9\x25\x2d\x2d\x2d\xfc\xb9\xc3\xf6\xa6\x10\x5d\x6b\xf9\xdf\x13\
+\x40\xa5\xf7\x89\x87\x0f\x5c\xe6\x2a\x0c\x26\x93\x09\xe7\xcf\x7f\
+\x39\xc7\x38\xb6\x6a\x21\x3a\xee\xe5\xbb\x2e\x00\x95\xde\x25\x3a\
+\x9c\x94\x98\xf8\x71\x02\xdf\x59\x7f\x8f\x8d\x55\xbc\x27\xa2\xf7\
+\xfc\x7f\x03\xbc\xcd\xff\x33\x2c\x5a\x98\x7f\x3b\x29\xc4\xcb\xeb\
+\xf5\x5b\x37\x40\x08\xa4\x98\xc5\xef\x0c\x30\xba\x5e\x9f\x7f\x01\
+\x15\xcb\x8d\x6d\xf1\xd0\x3c\x62\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x03\x98\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x5f\x49\x44\x41\x54\x78\xda\xa5\x95\x79\x6c\x4c\x51\
+\x14\xc6\xbf\x37\xbb\xe9\x82\x54\xa5\xad\xb1\x37\x0d\x21\x88\xad\
+\x9b\x2d\x96\xc6\xd6\x26\x95\x5a\x9a\x20\x24\xd6\x04\x25\x4a\x0d\
+\xd5\x6a\x95\x2a\x45\x13\x8d\x3d\x34\x25\xb1\xfd\x51\xa9\xa8\xa6\
+\x43\xc5\x68\x51\x41\xec\x6a\x29\x45\x99\x89\xb6\x5a\xf5\x3a\x66\
+\xeb\x1c\xaf\x3a\x33\xe6\x3d\xd5\xf5\xfc\xf3\xee\x7d\xf9\xce\xf7\
+\xbb\xe7\xdd\x77\xef\x61\xd0\xc6\x90\x84\x6b\xc8\x75\x6e\xbd\x32\
+\x8d\x69\x4b\x9e\x53\x64\xbb\x07\x6a\x49\xe8\x77\xac\x18\x20\x4e\
+\xc2\x34\xa5\x7c\x5d\x19\xda\xa2\xb1\x28\xa8\xc9\xdb\x09\xb0\xde\
+\x01\xed\x55\x5a\x9a\x15\xeb\xf5\x2c\xee\xde\xa9\x70\xae\xa8\x71\
+\x25\xc1\x21\x2a\xf8\xf8\xb8\x37\xab\xdf\x6c\x90\x42\x12\x22\x00\
+\x98\x8b\x18\x4a\x77\x37\x43\x3d\x5c\xc2\x13\x1b\x2d\x84\x8d\x39\
+\x7a\x54\xd5\x37\xfc\x31\x76\x24\x78\xb9\x89\x71\x20\xd2\x07\x0a\
+\x29\xff\x4b\xa5\x3e\xb1\x22\x96\x95\x42\x36\x4e\x00\x30\xde\xe2\
+\x2a\x70\x33\x61\xfb\x28\x99\x53\x1c\x7b\xbd\xce\xbe\x64\x87\x8c\
+\x9c\x1f\x96\x21\xc7\x8c\x41\xfa\x54\x0f\x67\xce\xce\x47\x66\x6c\
+\x62\xe5\xe8\x32\x51\x00\xa8\x2f\x64\x68\x8f\xd2\x80\xe4\x40\x45\
+\x5b\xf6\xee\xbf\x91\x50\x62\xc4\x16\x83\x12\x6e\x93\x89\x0f\xf8\
+\xa1\xe1\x00\x72\x16\xbb\xc7\x2b\x3b\x05\x50\x17\xd5\x43\x6d\xf4\
+\x40\xd7\x69\x02\x40\xf5\x35\x11\xed\x96\xd6\x20\x7d\x8a\x67\xa7\
+\x00\xb1\x37\xea\xb0\xd5\xd2\x1d\x5e\x33\x6c\x7c\xc0\xb7\x2b\x22\
+\x4a\x12\x55\x21\x73\x66\xf7\x4e\x01\xd6\xe6\xd5\x20\x81\xbc\xd1\
+\x73\x76\x03\x1f\xf0\xe5\xb2\x88\x76\xd8\xf4\x38\x1e\xe9\x8d\x06\
+\xea\x98\xb9\x98\x73\x5b\x91\x53\x89\x24\xc6\x17\x7e\x91\x02\xc0\
+\xa7\x4b\x62\xda\x66\xad\x40\xf6\x02\x1f\x98\x6d\x1d\x03\xc8\x44\
+\xc0\xe2\xf3\x3a\xec\x92\xf6\x46\x9f\x28\x01\xe0\xfd\x39\x31\xc5\
+\x19\xcb\x71\x71\x89\x0a\x86\x86\x8e\x01\x94\x62\x60\x5e\x56\x05\
+\xd2\x14\xfd\x31\x20\xda\xca\x07\xbc\x3e\x23\xa1\x58\xf6\x2d\x72\
+\x57\xf5\x43\x9d\xb5\x63\x00\x4f\xee\x8c\x46\x1c\x2d\xc7\x7e\x77\
+\x7f\x04\x2c\x12\x54\xf0\xf2\xb4\x84\x62\x6a\x5f\xa1\x60\xbd\x3f\
+\xaa\xcd\xed\x37\xaf\x31\x11\xfc\x3d\x18\x84\x65\xbc\x43\x46\xb7\
+\xc1\x18\xb2\x54\x50\xc1\x93\x13\x52\x5a\x53\xf9\x14\x5a\xf5\x20\
+\xe8\x4d\xed\x07\x7c\x66\x09\x63\xbc\x18\x4c\x48\x2d\x45\xa6\xf7\
+\x30\x0c\x5f\x6e\xe1\x03\x1e\x1e\x91\xd2\x2a\xdd\x23\xdc\x4f\x1a\
+\x8a\x4f\xbf\xda\x67\xfe\xc3\x4c\x60\xb9\x7b\x32\xb8\x07\x83\xb1\
+\x89\xcf\x71\xd4\x77\x24\x46\xad\x16\x00\x4a\x0e\xc9\x68\xd9\xe7\
+\x12\x3c\x4d\x1b\x81\x32\x43\xeb\xa6\xa5\xdf\xf9\xff\xb2\x9c\xdb\
+\xe0\xa9\xbe\x0c\x86\xc5\x3d\xc6\x49\xd5\x58\x04\xae\x13\x00\x8a\
+\x0f\xca\x68\x49\x79\x31\xde\x64\x8c\x46\x29\xdb\x3a\xe0\x6d\x2d\
+\x21\x5c\xf5\x6f\xcf\x09\x88\x79\x80\xac\xfe\xa1\x08\xdd\x60\xe6\
+\x03\xb4\xfb\x64\xb4\xb0\x4c\x8b\x8f\x47\x02\xf1\xfc\x67\xcb\xe6\
+\x2c\x77\x85\x7f\xe3\xaa\x8c\x10\x00\x4e\x15\xea\x91\x72\xe9\x03\
+\xb2\x06\x4e\xc2\xc4\x4d\x02\xc0\xcd\x54\x19\x45\xbf\xbe\x09\xdd\
+\xe9\x10\x3c\xae\x6b\x19\x50\xcf\x01\x74\x5c\x95\x51\x7d\xff\x02\
+\x4e\x68\x74\x48\x3c\x57\x86\x75\xbe\xc9\x08\xf4\xd0\x62\xb2\xda\
+\xc4\x07\x68\x52\xe4\x34\xff\x55\x01\xaa\xcf\x4e\xc0\xed\x2a\x82\
+\xd1\x7e\x16\x4c\x2e\x87\xce\xe2\x72\xc2\xad\xdc\x78\xae\x1d\x70\
+\x2c\xff\x0b\xe2\xcf\xbe\x43\x4c\xaf\x5d\x08\xf2\xd4\xfe\xe9\x13\
+\x61\xf1\x02\xc0\xb5\x24\x39\xcd\x7d\x91\x8f\x9f\x17\x26\xb5\xbe\
+\x01\x2e\x71\x38\xaf\x02\x5b\xb3\xdf\x60\xbd\x2a\x15\xc1\x9e\xb7\
+\x9d\x96\xd3\x13\x8d\x7c\xc0\xd5\x04\x39\xcd\x79\x96\xc7\xbd\x70\
+\x6d\x8c\x82\xb0\x77\x31\x47\x66\xe3\x58\x0c\x1b\x36\xf6\x49\x43\
+\x50\xb7\x22\x97\x2e\x47\x98\x95\x2c\xa8\x20\x37\x5e\x41\x8c\xd0\
+\xcd\x65\xc4\xd8\xd1\x68\x16\xdf\xa4\x70\xc0\x1b\x9f\x11\x29\x4d\
+\x15\xfc\x06\xe6\xbb\x4c\x28\xa7\x52\x0a\xc3\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x55\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x1c\x49\x44\x41\x54\x78\xda\x8d\x55\x6b\x6c\x14\x55\
+\x14\x3e\x77\xa6\xbb\xdb\xd9\xed\xb6\x50\x10\x69\x51\x48\x9b\xa6\
+\x54\x04\x5c\xaa\x15\x88\xc8\xd3\x5a\xde\x15\x82\xad\x18\xa0\xf8\
+\x08\x62\x34\x08\x41\xc4\xc8\x0f\x1f\xd1\xf0\xf0\x51\x7f\x10\xf1\
+\x87\xf1\x87\x89\x26\x1a\x8d\x91\x20\x36\x9a\x58\x5e\xa1\x45\x79\
+\x95\x87\x6e\x6b\x69\x4b\x1f\xb4\xbb\xdd\x66\x77\xbb\x3b\x3b\xbb\
+\x33\x73\xe7\x7a\xee\xac\xe3\xb6\x65\x57\x9c\x9b\xc9\xbd\x77\x72\
+\xe7\xfb\xce\xf9\xbe\x73\xef\x25\x90\xe1\x79\xee\xfa\x43\x6e\x03\
+\x68\xb9\x83\x38\x9f\xc8\x16\x9d\x2b\xed\x82\x54\x34\xc9\x59\x48\
+\x76\x7f\x41\x00\x7a\x7b\x19\xe8\x5a\x27\xc8\xd1\xe3\xa0\xc4\x7e\
+\x00\x51\xbc\x4c\xbe\xf9\x3d\x94\x0e\x87\xa4\xfb\x58\x77\xcd\xb3\
+\xc2\x25\xba\x5f\x29\x76\xcf\xa8\x2a\x72\x4f\x87\x7b\x5d\xc5\x90\
+\x23\xe6\x81\x13\x24\x98\xd6\x6e\x00\x68\x2a\x40\x68\x08\xa0\xbb\
+\x0b\xa0\xdd\x0b\xcc\xeb\x3d\x49\x87\x87\x0f\xda\x8e\xb6\xfc\x74\
+\x47\x82\xba\xab\xe5\x07\x4b\xdc\x33\x76\xcd\xbf\xeb\x31\x5b\x81\
+\x73\x1a\xe8\x8c\x42\x4c\x8f\x81\x4a\x11\x94\x31\x58\x78\x0e\x09\
+\x74\x1c\x8b\x22\x80\xc3\x8e\x3d\x01\xe6\xf7\x81\x7e\xea\xa4\xa6\
+\x7b\xbd\xf5\xce\x63\x2d\x7b\x33\x12\x6c\xbd\xf2\xe0\x91\xd9\xf9\
+\xf3\xb6\x2f\x2d\x58\x8b\x33\x01\xc2\x89\x08\xe8\x86\x0e\x94\xe9\
+\x60\x30\xc3\x5c\x53\xd5\x8c\xbd\x1a\x07\x30\xb0\x37\x28\x22\x20\
+\x84\x24\x01\xb3\xdb\x40\x3b\xd1\x08\x89\xf3\x17\x3e\xcd\x3d\x76\
+\xf9\xc5\x51\x04\x9b\xce\x97\x0b\x40\xe8\x81\x39\x93\x1e\xd9\x53\
+\x79\x4f\x35\x44\xd4\x04\xc8\x09\x19\x0c\xde\x10\x98\x62\xe3\x3d\
+\xc1\xb6\xa6\x09\x7f\xd0\x13\x29\x02\x0e\x41\xf5\x64\x56\x2e\x09\
+\x62\x67\xce\x82\x72\xb1\xe5\x7d\x95\x92\xd7\x0b\x7f\xbd\x6e\x98\
+\x04\x35\xe7\x66\x54\x95\xe5\xcf\xfe\x6e\x5d\xc9\x16\x97\x1c\x4f\
+\xc0\x70\x22\x86\x6a\xa4\x80\x29\x24\x33\x10\xb0\xad\x6f\x22\x29\
+\x02\x22\x00\x44\xd1\xdb\xa0\x0f\x3d\xf1\x03\x28\x32\xb0\x09\x13\
+\x61\xf8\x8f\x1e\x59\xfe\xab\x77\xc3\x94\xd3\xad\x0d\xa4\xa6\x69\
+\x56\xae\x64\x93\x1a\x9e\x2a\xdb\x36\x7f\xbc\x7d\x32\xf8\xa2\x68\
+\x9e\x15\x39\xea\xcf\xb3\xb0\x24\x22\x48\xb0\xb1\x19\xb5\x57\x31\
+\x5a\xc2\x00\xfc\xbd\x00\xfd\x1d\x49\x12\xc6\x33\xc3\x4c\x44\x01\
+\x34\x29\x0f\x06\x2f\xdd\x6c\xd4\xa3\xb1\xb5\x64\xdd\xe9\xfb\x16\
+\x95\x17\xcc\x3d\xb1\xbc\x68\x03\xdc\x0a\x0f\xa1\x99\x1a\xae\x45\
+\x60\x23\x95\x81\x39\x42\x39\x08\x46\xbc\xb5\x19\x8d\xc5\x35\xd0\
+\xdf\x09\xd0\xd3\x96\xac\x28\xee\x0f\x35\x92\x04\x7c\xee\xce\x81\
+\x80\x5f\x63\xc3\x1d\xfe\xc5\xa4\xf6\xcc\x9c\xfa\x35\xd3\x9f\xdc\
+\x59\xe8\x2c\x01\x5f\x64\x08\x18\x46\x66\x45\xfc\xaf\x44\xe6\x9c\
+\x99\x12\x6d\xfb\xcd\x89\xe0\x58\x9e\x1d\x57\x10\x90\x26\x7d\x30\
+\x3d\x18\xd1\x63\xe6\x51\xc1\x0d\xbe\xce\xe0\xc7\x64\x6b\xd3\x82\
+\xd6\xcd\x9e\x17\x4a\x83\x72\x1c\x64\x55\xc1\xe8\x53\x92\x98\x12\
+\x31\xee\x40\x32\x23\x51\xc8\x82\x97\x1b\x11\xe0\x2a\x3a\x8d\x3e\
+\x99\x51\x73\x02\x1e\x39\xfd\xa7\xe7\x73\xcc\x82\xba\xf2\xa0\xb3\
+\x3d\xda\x46\x9e\x39\xbb\x50\x7d\xb6\x62\x87\xad\x75\xa0\xdb\xd4\
+\xdb\x22\xa0\x46\xca\x5c\x8b\x48\x24\x59\xb0\xfb\x2b\x8c\xbe\xb7\
+\x3d\x59\x3d\x16\xe0\x6d\x04\x28\xa1\x2d\x0b\xda\x6e\x52\x8d\xbc\
+\xd6\x52\xa3\x3f\x5e\x5a\x2d\xfe\x89\x69\x13\x81\x98\x40\x74\xc4\
+\x6b\xcd\x93\x66\x1b\xf0\xd6\xe1\x4b\x00\x71\x65\x34\xa0\x45\x40\
+\x47\x10\xe1\xc6\xec\x4a\xe4\x53\xf2\xea\xc5\x0d\xfa\xe2\xd2\x15\
+\xa2\xb7\xbf\xdb\xac\xba\x94\x24\xd4\xdc\xc5\x16\x01\x8f\xb8\x3d\
+\x34\x55\x6e\xef\x79\xde\xa5\xd3\xe4\xfe\x64\xe8\x0b\x7f\xad\xf1\
+\xc8\x5e\x10\x04\xe8\xea\xea\xa2\x64\x53\xe3\xa3\x6a\xed\xc3\x5b\
+\x6c\x2d\xdd\x37\x40\x10\x21\x25\x0d\xf6\x3a\xf7\x82\xcb\x66\x30\
+\x18\x52\x66\x2a\x17\x6f\x6c\x94\x74\x8a\x22\x32\xc8\x08\x6c\x8d\
+\x45\x3c\x4a\xbc\x5e\xaf\x46\xaa\x8f\x97\xb7\xae\xaf\xa8\x2d\xed\
+\xf0\x0f\x62\x05\x19\x29\x89\xcc\x0c\x74\xd3\x13\x39\x5e\x11\xbf\
+\x70\xf3\xe9\xec\x68\x34\x86\xa5\x4a\x46\x45\x9e\x8e\x84\xaf\xd1\
+\x51\x26\xcc\xa0\x8d\x2c\xfa\xba\xa4\x7e\xc9\xac\x65\x3b\xb3\x6c\
+\xe3\x60\x38\x16\x41\x40\x66\x02\x73\x02\xde\xe2\xea\xbc\xc4\xb5\
+\x5b\x75\x8e\xa1\xa1\x60\x46\xc0\xb1\xdf\x78\xf4\xc1\x60\x10\xc2\
+\xe1\x50\x3d\xf1\x7c\x3e\x79\xa1\xa7\x78\xf6\x89\xb2\xa9\xe5\x64\
+\x00\x8f\xe0\xa4\x99\xc9\xfa\x0f\x29\x15\x6a\x5b\x7f\x9d\x3d\x18\
+\x0c\x8f\x02\xbb\x93\xfe\x3c\x83\xbe\xbe\x3e\x26\x65\xd3\xb9\xe4\
+\x81\xcf\x0a\x72\x5c\x0e\xe7\x51\xcf\xfd\x9e\x25\x11\x8d\xd7\x35\
+\x56\x19\x9e\xa0\x83\x91\x0a\xed\xd6\xc0\x36\x9b\x2c\x2b\xff\x19\
+\xed\xd8\x6f\xdc\x5c\x59\x96\x21\x14\x18\x6c\x1c\x37\x41\xaf\x34\
+\xcb\xa1\xec\xf0\xc4\xe5\x85\x53\x26\x7e\xab\xe7\x0b\xae\x50\x34\
+\x0e\x6a\xb4\x92\x86\xfb\x77\x89\x84\x88\x66\x34\xe9\xc0\xd2\xcd\
+\xf9\x5a\x5e\x1c\x01\xbf\x4f\x96\x24\xb6\x32\xf6\xf6\xd2\x53\xe6\
+\xdf\x33\x8f\x4c\x16\x74\x95\x1e\xc8\x2b\xc8\xd9\x13\x30\x96\x50\
+\xb9\x7f\x8f\xc8\xef\x03\xeb\xe7\xb1\xc6\xa6\xcb\xc0\x7a\x02\x81\
+\x00\x08\x4c\x3f\x64\x1c\x5a\xb6\xf7\xb6\x0b\xe7\xee\xfd\x3b\x7e\
+\x06\xc7\xf6\x4a\x01\x8f\x04\x5e\x05\xff\xd7\x54\x2e\x0b\xc5\x0d\
+\x16\xf6\xf5\xe1\x5e\x62\x9f\x18\x1f\xad\x7a\x29\xe3\x95\x99\xfd\
+\x66\xd3\x7e\x8c\x7e\xb7\xc3\xe1\xb0\xf1\x6a\xc8\x64\xa8\x65\x26\
+\x9f\xc7\xe3\x28\x6b\x70\x40\x13\xec\x59\x1f\xd0\x0f\x57\xbf\x91\
+\xf1\xca\xb4\x9e\xdc\x77\x7e\x59\x10\x55\x1c\xfb\x0c\x83\x2d\xb7\
+\xdb\xed\xc0\x5f\x4e\x36\xb2\x4a\x34\x3c\x6f\x38\x30\x53\x22\x58\
+\x18\x5a\x43\x76\xae\xf8\x9e\xf2\xee\xea\x33\x63\xb1\xd2\x12\xf0\
+\x67\xc2\x81\xef\x45\x55\x93\x66\xc5\x62\x8e\xcd\x86\xa2\xac\x06\
+\x2d\x5e\x04\xb6\x6c\x74\x91\x9f\xf9\x71\x34\x46\xe8\x24\x39\xe3\
+\x7f\x44\x33\xbf\xb4\xdb\x13\x2d\xc1\x7d\xab\xf4\x74\x38\x7f\x03\
+\x14\xe5\x90\xb7\x02\xa7\x82\xec\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x04\xf0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xb7\x49\x44\x41\x54\x78\xda\xbd\xd5\x5b\x6c\x14\x55\
+\x18\x07\xf0\xff\xdc\x76\x66\x67\x76\xf6\xd2\x65\x8b\x74\x77\xdb\
+\x6e\x77\x5b\x42\xb9\x0b\x86\x07\x51\x13\x12\x62\xf0\x41\x4d\x8c\
+\xf1\x95\x80\x97\xe0\x8b\x3e\xf0\xa0\x26\x26\x84\x68\x24\x46\xa3\
+\xc6\x5b\xc2\x93\x62\x14\x51\x62\x20\x26\x0a\x91\x40\x30\x80\x04\
+\x41\xb7\x42\x21\xdd\x42\xca\xb6\xb4\xdb\xd2\xeb\xee\x4e\xbb\x3b\
+\x97\x33\xc7\x33\xbb\xa5\x80\x0a\x88\x51\x4f\x32\x99\x49\x66\xf7\
+\xfc\xf2\xff\xbe\x73\xce\x70\xb8\x71\x3c\x97\x4d\x83\xe2\x1d\xf6\
+\xf4\x10\x88\x1d\x80\x6d\xf2\x30\xab\x36\xaa\x33\xfd\xb0\x66\x5e\
+\x65\xcf\x7b\x70\x78\xa3\x8b\xbb\x18\xdc\xec\xc4\x32\x28\xdd\x0e\
+\x87\x3e\x25\x88\x02\x12\x71\x95\x5f\x9d\xd1\x63\xf1\x90\x20\x76\
+\xe7\xc6\xa6\x4e\x9d\xbe\x6c\x94\x0b\xa3\x04\xd4\x39\x03\xbb\xba\
+\x05\xc7\x9f\x9f\xb8\x5b\x60\x17\x1c\x77\x4d\xb0\x31\x90\xe8\xe8\
+\x68\x10\xda\x63\xd2\xcc\xca\x84\x5f\x4e\x45\x24\x7e\x60\xb4\x62\
+\x66\xf3\x65\xf1\x6c\xf7\xa0\xf0\xeb\xd1\xae\x41\x98\x95\xf3\x70\
+\xec\xc7\x71\xf2\x85\x3b\x27\xd9\x74\xaa\xf1\x1a\x30\xc5\x07\x15\
+\x7f\x6a\x51\xcc\x58\xd5\x1e\x6a\x48\xf9\x81\x05\x1a\x87\xb8\xc6\
+\x83\xb0\xd7\x05\x07\xe8\xca\x57\xac\x43\x07\xba\xc6\x86\x4e\x74\
+\x35\xb9\xd3\xc6\x4a\xfc\xb2\x35\x7b\xbb\xb9\x63\x5b\xb3\xa1\xd1\
+\x09\xeb\xd0\x35\x80\xea\x99\x18\x9a\xdb\x1b\xd0\x26\x53\xa4\xc3\
+\x02\x92\x3a\x2b\x55\x40\x80\xe9\x50\xf4\x95\x1c\xf4\x55\x78\xf4\
+\x8d\x9b\x38\xb9\x73\x1f\x35\x87\x0a\x3f\x83\x58\x1b\xd0\xf5\xca\
+\x5f\x96\x4a\xdd\xfc\x63\x54\x54\xd5\x13\xa5\x69\xd2\x31\x07\x68\
+\xa9\x68\x0d\xc8\x68\x40\x5b\x48\x44\x33\x9b\x3c\xa1\xd7\x81\xcb\
+\x65\x07\x97\xca\x14\x17\xaf\x56\xd1\x7d\xfc\x1c\x8a\xbf\x5d\x28\
+\xd2\x89\xf1\x51\x80\xbe\x09\x49\xde\x0f\x49\x19\x87\xcf\x4f\x21\
+\x2b\x21\x41\x0b\x6c\xf2\x87\x83\xdb\x38\x59\x09\x94\xab\xd7\x7b\
+\x30\x0b\x44\x91\x51\x81\x74\x88\x25\x08\x8a\x2c\x01\x5f\x07\x58\
+\x82\x4b\x45\xc2\x2e\x07\xf9\x29\x1b\x85\xfc\x55\x38\xa7\xcf\x0c\
+\x20\xdf\x6f\x80\x17\x1b\xe1\x93\x79\x86\x00\xfe\x00\xa7\xce\x8f\
+\xd2\xfb\x56\x35\x2b\xc1\xb0\xe6\xff\xf6\xd8\x30\xfe\x94\x20\xcd\
+\x12\x64\x58\x82\x64\x60\xb6\x44\xc4\x4b\x40\x70\xd1\x03\xa6\x1c\
+\x5c\x99\x06\x86\x4a\x16\xec\xc9\x92\xe5\x23\x55\x34\xaa\xa2\xaf\
+\x29\x20\x62\x81\x2e\xa2\x49\x97\x90\x08\xcb\x34\x16\x55\x91\xcd\
+\x4f\x73\x1f\x7d\xdd\x3b\x0b\x3c\xcb\x80\xb6\x59\x80\x25\xc8\x84\
+\xa5\x3a\xa0\xf3\x75\xa0\xe4\x4d\xee\x21\x0e\x06\x0c\x82\xc2\x0c\
+\x85\x4d\x39\x28\x8a\x88\x16\x96\x34\x1d\xe4\xd9\x7f\xbc\x3b\xd0\
+\xaa\xc3\x96\x44\x48\x07\xb3\x25\xbc\xb7\xbb\xe7\x1f\x02\x86\x0b\
+\x9b\xb8\x50\x24\x0e\x09\x4d\x44\x2a\xc4\xb3\x4b\xaa\xdd\x5b\x58\
+\xdf\x14\x99\xc3\x91\xee\x22\xde\xff\x32\x77\x43\x89\x18\xd0\xd2\
+\x11\x45\xbb\x56\x07\xbc\x1f\x26\x75\x0e\x55\xb6\x4e\xfb\x4a\x2e\
+\x72\x93\x0c\x98\xb4\xd1\xcf\x1a\x5e\x98\x66\x80\xe3\x01\x7c\xad\
+\x8c\x35\x20\xc8\x00\x96\xa4\x25\xc8\x00\x85\x01\xe7\x18\xb0\x3b\
+\x77\x73\x0f\x12\x99\x08\x4d\xc9\x94\xb6\xea\x02\x1f\xd7\x04\x34\
+\x69\x5e\x02\x17\x57\xca\x84\x5e\x36\x08\xcd\x1b\x94\x1f\x60\x93\
+\xd7\x01\xd4\x13\x5c\x03\xfe\x98\xc0\x03\xf6\xe4\xae\x97\x28\x90\
+\x0c\xc3\xaf\x49\x33\x56\xa1\x68\x58\x26\x89\x72\xc4\x11\x38\xdb\
+\x04\xac\x2a\x95\x39\xbb\x1c\x89\x69\xb6\xde\x96\x8c\x4e\xa8\x21\
+\x14\xaa\x0c\xb0\xc9\xcd\x09\xf4\xd9\x04\xa1\x5b\x24\x10\x64\xc1\
+\x5b\xb4\x0e\xa9\x90\x5e\x10\x77\x37\x3b\x0e\x3e\x85\x65\x1a\xb0\
+\x2a\xed\xb0\x2b\xdb\x44\xce\x79\xd0\xaf\xf9\x54\xa1\x31\x0a\xa3\
+\x35\x05\x47\x51\xa1\x70\x14\x09\x56\x12\x6f\xe2\x1a\x70\xcb\x1e\
+\x6c\xb9\x40\xe3\xee\x08\x20\x28\xfb\x06\xf9\xe4\x46\x58\x23\x25\
+\xec\xbc\x97\xce\x6d\xcd\xc7\xf6\xf3\x9c\x55\x5d\x23\x70\xce\x67\
+\xb0\xad\x14\x79\x78\x3d\x4f\xa3\x51\x28\x56\x85\x25\xb8\xa1\xc9\
+\x0c\xf2\x36\x68\x88\xf5\xee\x58\x8f\x81\x1d\x9f\x5c\xa8\x03\x81\
+\x8d\x47\xe8\xba\xe2\x61\x34\x1b\x3d\x4f\x7e\xf0\xc3\x57\x7b\x6f\
+\x75\xbe\xa8\x4f\xec\x5d\x54\x19\x2c\x9c\xa6\xcb\x97\x8a\x58\xb2\
+\x18\x4a\x24\xe8\x4b\x4a\x0e\x52\x01\x20\xc5\x96\x69\x26\x22\x61\
+\x71\x8c\xc3\x58\xd1\xb6\x3f\x3f\x3a\xcc\x1d\x3c\x31\x6c\xd7\x80\
+\x07\x1e\x79\x89\xae\x2d\x1c\xc0\xba\xa1\xec\xc2\xf5\x23\xc8\xdd\
+\xf6\xf8\xbd\xff\xe3\x0d\xd4\x36\x3f\xc4\xf2\x65\xf7\xf8\x3a\x3b\
+\x94\x78\xd0\x47\xd2\xf3\x55\xd1\x3b\x5e\x1a\x45\xe2\xce\x57\x38\
+\xf2\xd3\xd9\x51\xf7\x8b\x23\x83\xa3\x6c\x97\xbf\x55\x03\x5e\x5c\
+\xb5\x8c\x2e\xa8\x8e\x20\x66\x8d\x2d\xdc\xd4\x4b\x6e\x0b\xd4\xc6\
+\x9a\x77\x57\xa2\x52\xf9\x86\x0b\x87\x95\xc8\xf2\x4e\x25\xb3\xb4\
+\x35\x1c\x67\x3b\xb9\x58\x18\xaf\x9c\xef\x99\xa8\x0e\x4f\x39\x02\
+\x3b\x97\xb6\x63\xd7\xda\xb7\x6b\xc0\xcb\x2b\xd2\x74\x9e\x35\x89\
+\xb0\x5d\x5a\xb8\xb9\xd7\xb9\x33\xe0\x8d\x15\x3b\xe6\x81\xe7\xbe\
+\xe7\x15\x75\x35\xef\x57\xc0\xfb\xfc\xa0\x92\x0c\x47\x54\x86\xa8\
+\xa4\x3c\x83\x3d\xeb\xbf\x9b\xfb\xe0\x6c\x5f\x1c\xa3\x41\x76\xae\
+\xe8\xc4\x6c\xd9\xdc\x6b\xf5\xff\x2d\xa0\x86\xbc\xc1\x41\xf0\x09\
+\xf0\xf9\x24\x48\xec\x23\xa2\x68\x0e\x5b\xeb\x0e\xf6\x3f\x3a\xb7\
+\x40\x6a\xc0\xeb\x9d\x11\xaa\xbb\x16\x54\xd7\x6e\x79\x3a\x77\x17\
+\xc0\xdf\x18\x35\xe0\xb5\xce\x06\x06\x98\xd0\xfe\x07\x20\xc1\x80\
+\xc1\xff\x12\x58\xc2\x80\xee\x7f\x13\xf8\x1d\x44\x78\x47\x0b\xd1\
+\x99\x24\x5f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xc3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x8a\x49\x44\x41\x54\x78\xda\x95\x95\x79\x6c\x4c\x51\
+\x14\xc6\xbf\x57\x4b\x5b\x4d\x15\x45\xd2\xda\x29\xb1\x26\x28\x15\
+\x54\xa8\x25\xd6\x86\x68\x14\xb1\xef\xc4\x9e\xda\x52\xe5\x8f\xd2\
+\x50\x2d\xa2\x76\x12\x29\x25\xb6\xd8\xc5\x92\x30\xb6\xa6\x82\x4e\
+\x2a\x28\x4d\x5a\x14\xa5\x8a\xd1\x4e\xa7\xb3\x74\xc6\xbc\xe3\xde\
+\x99\x37\xd3\x37\xd3\x6b\x99\x93\xcc\x9c\x7b\xdf\xbb\x39\xbf\x73\
+\xbe\x73\xdf\xbd\x12\x54\xb6\x2d\xcf\x46\xdc\xf3\x3f\x49\x72\x0e\
+\x48\x52\x2d\x60\x73\xf5\x94\x4d\x12\x48\xc6\xee\xc4\xde\xf5\x08\
+\x7f\x30\x8f\xf5\x29\x5a\x2b\xb1\xc5\xf8\x1f\x33\x58\x08\x9a\xcf\
+\x76\xfd\xad\x32\x39\xb5\x65\x20\xb6\x27\xf5\xf6\xa7\x7f\x02\x92\
+\x9f\x5a\x68\x53\x5f\x7f\x68\xbe\x12\x64\x36\x37\xfd\xaa\x79\x57\
+\xc5\x8b\x23\xfe\xcc\x19\x67\x7e\xa7\x3a\x20\x36\xcc\x7a\x6d\x35\
+\xe6\x96\x53\x5a\xe3\xfa\x48\x4e\xee\x17\x40\x7f\x05\x6c\xca\x31\
+\x51\x72\xff\x40\x68\x2b\x9c\xd2\x90\x33\xa6\xc3\x38\x90\xc9\x01\
+\x9d\x99\x50\x66\x94\x31\x8f\x01\xb8\xd9\xec\x84\xb3\x05\x56\xeb\
+\x2b\xbd\xbc\x8b\x2d\x4a\x4c\x1d\xd4\x80\xfe\x08\x48\x7c\x54\x45\
+\x29\xd1\x41\xc8\xd3\xbb\x25\x77\x04\x76\x00\x94\x09\xaf\xa4\x58\
+\x2f\x63\xae\x02\xe0\xc6\x8b\x3a\xaa\x35\xa1\xb4\x1a\x69\x66\x9b\
+\xbc\x3e\x3d\x26\x98\x84\x80\x35\x1a\x3d\xa5\xc5\x34\xc4\x8b\x4a\
+\x55\xd6\x0a\x49\x56\xbc\xc1\x4a\xf8\x6c\x20\x4c\xeb\xe0\xe7\x21\
+\x85\x99\x81\x33\x9e\x19\xf1\xd1\x24\xa7\x1f\x18\x11\xb2\x56\x08\
+\x58\x75\xab\x82\x76\x8f\x0c\x41\x7e\xa5\x4a\x22\x65\x27\x71\x10\
+\x1f\xeb\xab\x09\x3a\x13\xb9\xa5\x53\xeb\x31\xa9\xad\x1f\x96\xdd\
+\xae\xc0\xfe\x51\x8d\x25\x21\x60\xe9\x35\x1d\xed\x1b\xd7\x04\x05\
+\x06\xcf\x0a\x5c\xbd\xe0\x3f\xab\x0c\x8f\xe0\xfc\xf7\xd3\x48\x30\
+\xb1\x0a\xe2\x38\xe0\x7a\x39\xf6\xc7\x36\x11\x03\x16\x5c\xf8\x46\
+\x47\x26\x36\x43\xa1\xd1\xd9\x50\xf2\x53\xc9\x24\xd7\x86\xc9\x54\
+\x93\x48\x51\xb9\x8c\x78\x06\x58\x78\xf1\x3b\x8e\xc6\x35\x17\x03\
+\x66\x9c\xfe\x42\x27\xa6\x84\xe1\x9d\xa9\x26\x88\x77\x50\x0e\x96\
+\xbd\x77\x17\x9b\x94\x54\x11\xc6\xb6\x90\x30\xf3\x4c\x29\xb2\xa6\
+\x86\x8b\x01\xf1\x99\x9f\xe8\xec\xac\x96\xf8\x60\xf6\xcc\xd2\xd5\
+\x07\x78\x81\xdc\xef\x99\xd7\xb1\xe6\x0f\x6e\x2a\x61\xf2\xf1\x12\
+\x9c\x9b\xdd\x4a\x0c\x98\x70\xb8\x98\x2e\x2d\x6c\x83\x12\x06\x58\
+\x9e\xf5\x01\xbe\xd8\x86\xb8\xd6\xe8\x17\x2a\x61\xfc\x91\x8f\xb8\
+\xba\xa8\x8d\x18\x30\x3a\xe3\x2d\xdd\x58\xde\x1e\xa5\x96\xda\xf2\
+\xb8\xa4\xf0\xd8\x5d\x2a\x19\x6d\x6c\x41\xb7\x60\x60\xcc\xde\x77\
+\xb8\xb9\xa2\x83\x18\x30\x34\xbd\x90\xee\x26\x44\xe0\x9b\x45\x69\
+\xb0\x5c\x5b\x6b\x61\x5f\x94\x71\x44\x10\x30\x6c\x67\x11\x34\x6b\
+\x3a\x8a\x01\x03\xb7\xbe\xa1\xec\x8d\x9d\xf1\xc3\xc6\xe4\xda\x51\
+\xe0\x93\x44\x59\xab\x3b\xa3\x5d\x03\x16\x23\xa5\x00\x39\x49\x5d\
+\xc4\x80\xc8\xa4\x97\x94\xbb\xa5\x3b\xca\x6d\x7f\xd9\x45\x4a\x83\
+\x45\x55\xb5\x0e\x04\xfa\x6c\x7e\x05\xed\x96\x1e\x62\x40\xd7\xb5\
+\x79\x94\xbf\xa3\x27\xf4\xbf\x6a\x07\x76\x05\x74\x78\xbb\xd3\x7b\
+\x27\xd1\x82\x01\xba\xaf\x7b\x8e\xfc\xb4\x5e\x62\x40\xc4\x8a\x5c\
+\x2a\xdc\x13\x89\x2a\x06\xe8\x95\xa0\xf5\x49\xa2\x87\xa9\x91\x08\
+\x0b\x00\x3a\xae\xd4\xa2\x28\xa3\x8f\x18\xd0\x76\xf1\x13\x7a\x7f\
+\x30\x0a\x46\xbb\x33\x23\x48\x82\x6f\xc0\xfb\x23\x53\x9e\x71\x6b\
+\x56\x1f\x68\xb7\xe4\x19\x8a\x0f\x45\x89\x01\x61\x73\x72\xe8\xcb\
+\xb1\xfe\x30\x73\x09\xfc\x6a\x3e\x26\xb5\x1c\x8e\x93\xd5\x05\x51\
+\xdd\x19\xdc\x87\x32\x40\xf8\xbc\xc7\x28\x3d\x36\x40\x0c\x08\x9d\
+\xf6\x88\x7e\x9c\x8c\x46\x35\xd7\x73\x46\xb6\x4f\x12\x15\x65\x46\
+\xa3\x51\x5d\xa0\xe9\xf4\x6c\xe8\x4e\x0d\x12\x03\x82\x27\xdd\xa7\
+\xca\x73\x83\x61\x25\x65\xa7\xa8\x8e\x7c\x57\x35\xde\xc7\xb4\xfb\
+\xc0\x63\x3e\x84\x5d\xe7\x0d\xe3\x1f\xc0\x70\x7e\x88\x18\xe0\x3f\
+\x5e\x43\x96\xcb\x31\x3e\x65\xee\x6d\x01\x13\xee\xa1\xfa\xca\x50\
+\x31\xa0\x6e\xec\x1d\xd5\xfd\xa1\x74\xd9\x9d\xab\xe4\x7e\x46\xaa\
+\x1a\x24\x8f\x30\xfc\x22\x92\x60\xbf\x36\xdc\x1d\xf7\x37\x1f\xa0\
+\xfb\x28\x81\xc6\x9e\x86\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x03\xca\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x91\x49\x44\x41\x54\x78\xda\xa5\x95\x79\x4c\x54\x57\
+\x14\xc6\xbf\x87\x56\x16\x83\x54\x50\x13\xd4\xd6\x0d\x8d\x75\x49\
+\x14\xb7\x68\x35\x8a\x4b\x5c\xaa\xd1\xd4\x80\x6d\xd4\x5a\x45\x51\
+\xd3\x8a\x26\x6a\x4d\x28\xfa\x07\x96\x54\x0b\xad\x11\x77\x48\x48\
+\xeb\x12\x97\xc6\xdd\xa8\x4d\x74\xd4\x68\x68\xac\x4c\x30\x0a\x4a\
+\x02\x2a\xa5\x08\x6e\x53\x18\x86\x59\x98\x61\xee\xf1\xde\x99\x37\
+\x33\x77\x66\x2e\xda\xa4\x27\x79\xef\xde\xfb\xde\xc9\xf9\xdd\xf3\
+\x9d\x73\xdf\xd3\x20\xd9\x8f\x65\x2e\x12\xa3\xb8\x69\x9a\x77\x42\
+\x9a\xe4\xc0\xd7\xf2\x92\x2f\x36\x12\xc3\xae\xac\xe4\x0f\x08\xed\
+\x58\x90\x7f\xae\xd1\x49\xdc\x19\xff\xc5\x2c\x0e\x82\xe1\xb9\xdb\
+\x7c\xf5\x25\xdb\xd9\x3b\x1a\x3b\xb2\x93\x23\xe9\xbd\x80\x9c\xbf\
+\x1c\xb4\x75\x4c\x24\x0c\x2f\x08\x8c\xaf\x6d\x6d\x81\x77\x2d\x22\
+\x39\x12\xcf\xbc\x71\x56\x0e\xea\x00\xe2\xd3\x23\x8f\x9c\xd6\xd2\
+\x46\xca\xeb\xda\x09\x39\x39\xe3\xa2\xe8\x9d\x80\xad\x25\x36\xca\
+\x19\x1f\x0d\x63\x93\x57\x1a\xf2\xc6\xf4\x98\x00\x72\x39\x60\xb2\
+\x13\x5e\x5a\x19\xd2\x39\x40\x98\xcb\x4d\x38\x59\xe9\x74\x96\x9b\
+\xd9\x2f\xdc\x29\x6b\xe7\xa4\x18\x6a\x17\x90\x75\xbb\x85\x72\x27\
+\x76\x46\x99\xd9\x2f\xb9\x27\xb0\x07\xa0\x2f\x44\x26\x35\x66\x86\
+\x15\x3a\x40\x98\x48\xaa\xc8\x68\x43\x43\x2b\xf2\xec\x2e\xb6\x25\
+\x3f\x25\x96\x94\x80\x4d\x06\x33\xe5\xa5\x74\xc1\x83\x66\x69\xd7\
+\x3a\x89\xe9\xa3\xc5\x49\x78\x6e\x21\x2c\x1e\x10\x11\x24\x85\x9d\
+\x83\x0b\xee\x59\x51\x6b\x63\xf9\xfb\x67\xc4\x6d\x56\x02\x36\x5c\
+\x6d\xa2\x5d\x33\xe3\x50\xd1\x2c\x49\xa4\x77\x92\x00\x89\xb9\xb9\
+\x95\x60\xb2\x91\x5f\x3a\x59\x8f\xd4\xbe\x11\xf8\xf6\x8f\x26\xec\
+\x9b\xd5\x55\x53\x02\xbe\xb9\x68\xa2\xbd\x73\xe3\x51\x69\x09\xce\
+\xc0\x57\x0b\x71\x39\x19\x82\x82\x8b\xeb\x5f\x2b\xc1\xc6\x33\x58\
+\x28\x00\x97\x1a\xb1\x6f\x5e\xbc\x1a\xb0\xea\xf4\x2b\x2a\xfc\xbc\
+\x3b\xaa\xac\xde\x82\x52\x84\x24\x13\x0b\x87\x31\x0a\x6c\xa4\xba\
+\x91\x21\x8d\x03\x32\xce\xbc\x46\xd1\xc2\x1e\x6a\xc0\xd2\xe3\xf5\
+\x74\xf8\x8b\x44\x3c\xb5\x05\x82\x84\x06\x15\x60\x16\xda\x5d\x7c\
+\x51\xd7\x42\xf8\xac\x97\x86\xaf\x4e\x34\xe0\xc8\x97\x3d\xd5\x80\
+\xb4\x5f\xff\xa1\x93\xcb\x7a\xe3\x6f\x7b\xf0\x2e\x7d\x75\x40\x08\
+\xc8\xff\x9e\x8f\x26\x5e\xfc\xc9\xdd\x34\x2c\xfa\xad\x0e\xa7\xbe\
+\xfe\x48\x0d\x58\x70\xa8\x86\xce\x66\xf4\x41\x9d\x3d\xd0\x9e\x72\
+\x06\x2c\x24\x1b\x4f\x06\x3a\xa8\x99\x03\xc6\x25\x68\x98\x5f\x58\
+\x8b\x0b\xab\xfb\xa8\x01\xb3\x0b\x9e\xd0\xe5\x75\xfd\xd1\xe0\x08\
+\x97\xc7\x1f\x5c\xee\x2e\x49\x46\x17\x77\x18\x1a\x0b\xcc\xd9\xf3\
+\x14\x57\x32\x07\xa8\x01\x53\xf3\xab\xe8\xfa\xc6\x24\xbc\x72\xe8\
+\x05\x66\xe1\x5a\x2b\xeb\xa2\xcf\x93\x3a\x03\xd3\x7e\xae\x86\x61\
+\xd3\x40\x35\xe0\xd3\x1f\x1e\xd3\x9d\xef\x07\xe3\x8d\xab\x7d\x29\
+\xe0\xd3\x5d\x0b\x87\xf4\x8b\xe1\x31\x72\x2b\x51\x92\xfd\x89\x1a\
+\x30\x2a\xfb\x21\x95\x6e\x1f\x86\x46\xd7\x3b\xba\x48\x2f\xb0\x2a\
+\xab\x8f\xa3\x81\xd1\xdb\xca\x61\xdc\x3e\x5c\x0d\x18\xb2\xb9\x8c\
+\x2a\x7e\x1a\x01\x73\x5b\x78\x60\x5f\x40\xcf\xe8\x0e\x3e\x68\x3e\
+\xdf\x5e\x1c\x30\xec\xbb\xfb\xa8\xc8\x1b\xa9\x06\x24\x65\x96\x52\
+\xd5\xee\x51\x68\x69\x7b\x4f\x06\x14\x0e\x10\x12\x26\x46\x01\x03\
+\xd7\x1b\x51\x5d\x30\x5a\x0d\xe8\xbb\xe6\x2e\x3d\x3b\x30\x16\x56\
+\xb7\x1e\x44\x43\xf8\x19\x08\x3d\x64\x12\xb0\x7b\x27\x5e\x87\xb5\
+\xf7\x50\x73\x70\xac\x1a\x90\xb8\xbc\x84\xea\x8b\xc7\xc3\x2e\x24\
+\x88\x08\x1c\x26\x79\xb7\x9e\x2f\xab\x0f\x22\x17\x9a\xdf\x12\x38\
+\xa0\x67\xfa\x9f\x68\x28\x9e\xa0\x06\x24\x2c\xbe\x4d\x6f\x8e\x4e\
+\x44\xab\x2c\x01\x0b\xae\x03\x10\x22\x9b\xf4\xdf\xfe\xb0\x23\xd0\
+\x6d\xc9\x1d\x98\x8e\x4d\x52\x03\x62\x53\x6f\x52\xf3\xa9\xc9\x70\
+\x92\xde\x29\xd2\x27\x3f\x14\x24\xb7\xac\x6f\x8c\xe3\xbf\xf3\x2e\
+\x69\xb7\x60\xf9\x7d\x8a\x1a\x10\x39\xdf\x40\x8e\x73\x29\xf8\x3f\
+\x16\xb5\xe0\x06\x5a\xcf\x4f\x55\x03\x3a\xce\xbb\x26\x29\xa1\x57\
+\xd9\xbf\x57\xcd\xff\x8c\xa4\x1c\xb4\xa0\x30\xe2\x47\xa4\xc1\x7d\
+\x71\xba\x3f\xee\x5b\x6e\x73\x2a\x37\xcd\x0f\x96\x47\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x8e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x55\x49\x44\x41\x54\x78\xda\xad\x94\x6b\x68\x1c\x55\
+\x14\xc7\xff\x33\x73\xe7\xb1\xb3\xbb\xd9\x31\x8f\xcd\xc3\x90\x34\
+\x0d\xb6\xd5\x04\xe9\x07\x6b\x24\x62\xb5\x46\x69\xa3\xb4\x62\xa4\
+\x18\xda\x4a\x91\x54\xe8\x07\x21\x11\x83\x2b\x28\x81\x90\x54\x5b\
+\x02\x92\x44\xa5\x82\x15\xad\x85\x58\xa3\x44\x6a\x8c\x18\x43\xe9\
+\x0b\xaa\x50\x51\xac\x48\x82\x22\x06\x4b\xf3\xb4\xbb\xd9\xcd\x3e\
+\x67\xe7\xe1\x99\x89\x56\x63\x4d\xba\x10\xcf\x72\xb8\xcb\xdc\x99\
+\xff\xef\x9c\x73\xcf\xb9\x1c\x56\xb0\xb2\x17\xe7\x6c\xac\xd1\xa6\
+\x0e\x07\x39\x6e\xa5\xcd\xd2\x17\xa6\x43\x3c\x2f\x74\xdd\x5a\xcc\
+\x44\xcd\xcf\x5f\x7f\x6e\x59\x16\xb9\x0d\x66\x93\xf3\x16\x64\xce\
+\x86\x28\x58\x50\x05\xc0\xc3\x00\x55\x04\xa6\x23\x3a\x2e\xfe\x26\
+\x61\xf2\x95\xd2\x95\x01\x8e\x95\x3c\x7f\x25\xc4\x0b\x42\x57\x59\
+\xb1\x2c\xe6\x07\x04\xd8\x24\x2a\xc1\x11\xa6\x95\x44\x3d\xc4\x55\
+\x04\x1b\x1e\x12\xf5\x8a\x8e\x38\x87\xc9\xb9\x34\x2e\x4c\xc4\xb0\
+\x68\x07\x30\xd5\x53\xbe\x3a\xc0\xb1\x60\xeb\xaf\x21\x9e\x31\x17\
+\x52\x15\x14\xa1\x30\x1b\x0a\x45\xee\x88\xaa\x6c\xc9\xbd\x12\xe0\
+\x93\x78\x8c\x5f\x4d\x62\xf4\x72\x14\x46\xd6\x44\x8a\x23\xc0\x6b\
+\x95\x37\x07\xb8\x90\x67\x7f\x0a\x71\xa2\xd4\x5d\x59\xa6\xb0\xfa\
+\x6a\x19\x3e\x12\x77\x00\x7e\x12\x56\xc9\x37\x06\x25\x8c\x7c\x1f\
+\xc3\x27\x97\x22\x30\x0c\x03\x26\x01\xd2\x42\x00\x33\xbd\xeb\x73\
+\x03\x38\x56\x78\xf0\xc7\x56\x41\x92\x8f\xac\x2b\x53\xe4\xbd\x75\
+\x3e\x68\x1e\x8e\xa2\xe6\x70\x47\xa9\x84\x33\xe3\x71\xf4\x7e\x31\
+\x47\x91\x1b\xe4\x16\x4c\xd3\x84\x2e\xf8\x30\xf7\xc6\xc6\xdc\x01\
+\x8e\x15\x3d\xf3\xdd\xeb\x3e\xcd\x77\x70\xc7\xe6\x3c\xb6\xaf\xce\
+\x8f\x75\x05\x22\x46\x7f\x88\xe1\xc8\x67\x33\xae\xb0\x1b\xbd\x41\
+\x00\x5a\x0d\xe6\xc3\xfc\xd1\x9a\xdc\x01\xc1\x03\xdf\x74\xd4\x56\
+\x78\x3a\x77\x6e\xc9\xc7\x54\xc4\xa4\xc3\x36\xb0\xa1\x32\x0f\x87\
+\x4e\x4d\x53\x49\xfe\x14\x35\x4c\xb7\x3c\x86\x49\x9d\xc6\x3c\xb8\
+\xf6\xf6\xe6\x1c\xcf\x80\xc4\xd7\x97\x28\x9d\xcd\x77\xfb\x51\xaa\
+\x49\x10\x64\x19\xbd\xa3\xb3\xd6\x7c\xc2\xe2\x0d\xfd\x6f\x71\xe7\
+\x70\x2d\x27\x03\x02\xd8\x4c\x46\xf8\xdd\xbb\x6e\x0e\x28\x6a\xb9\
+\xd4\x51\x5e\x28\x75\x36\xd6\xa8\x28\x21\xf1\x2d\x1b\x34\xbc\x7a\
+\x2e\x89\xa9\xb0\x8e\xc8\x5c\xd4\xca\xe8\x06\x0f\x9a\x0b\xd3\x05\
+\x38\xe2\x86\x0b\xe1\x44\x86\xc8\xfb\xf5\xab\x03\x8a\x9e\xfe\xba\
+\xa3\x48\x93\x3b\xef\xa9\x12\x29\x72\x19\x0f\xdc\x59\x80\x1e\x12\
+\x8f\x66\x96\x86\x7c\xf6\x6a\x38\xbb\x10\x8e\xdb\x8c\xf1\xd4\xa4\
+\x9c\x7b\x06\x6e\x06\x34\x8c\xbc\xc0\x23\x3a\xb0\x75\x65\x40\xc1\
+\xfe\x8b\x1f\x68\x3e\xb1\xb9\xa6\x84\xa1\xba\x44\x41\x6d\x55\x00\
+\xef\x7d\x9b\x41\x52\xa7\x69\xa6\xdf\xef\xd3\x51\x24\xe3\xa9\x3e\
+\x3d\x95\x1c\xe4\x38\x7e\x4c\x60\xa2\x6a\x5b\x70\xc5\x2d\x2a\x11\
+\x4f\xb3\xb2\x38\xf8\xd0\x8d\x80\xfc\x7d\x17\x8a\x69\x19\xf0\x7a\
+\xc5\x07\x6b\xa9\x05\x0b\xfd\x0c\xb7\x95\xfb\x30\x3c\x61\x20\x63\
+\x02\x36\x95\xe3\xda\xcc\x02\xd2\x19\xbd\x2f\x7c\xe2\xbe\x36\xe7\
+\x1b\x65\xfb\xc9\x16\xe6\xd3\xde\xe2\x78\x91\x59\x36\xb7\x04\xe0\
+\xb2\x48\x0c\x35\xde\x08\xb8\x65\xcf\xd9\x1e\x45\x91\xda\xab\x0a\
+\x04\x04\xbc\x0c\xb7\x57\xe4\x61\xec\x67\x1d\x94\xb9\x7b\x0f\x45\
+\xe6\x17\x90\xd5\x8d\xbe\xc8\xc0\xb6\xb6\x7f\x7e\x27\x35\x1c\x0f\
+\x31\xaf\xd6\x4d\x1d\xc0\x4c\x4b\x80\x60\xa5\x90\x1c\xde\xb5\x1c\
+\xa0\x3d\x79\xba\x89\x6a\x37\xa8\x2a\x4c\xa8\x28\x90\x50\x53\xe9\
+\xc7\xd9\x5f\x74\x38\x15\x77\x86\x27\x16\x5e\x74\xda\xb0\x6f\xe1\
+\xc3\x86\x36\xfc\x87\x89\xf7\xbf\x13\x12\x7d\x81\x6e\x4b\xf0\x32\
+\xce\x4c\x22\x35\xf2\xc4\x72\x40\xde\xee\xd1\x63\x92\x2c\xb7\x94\
+\x04\x18\xaa\x82\x2a\x26\xe6\x4d\x64\x9c\xc8\x29\xe5\xc4\x42\xcc\
+\xc9\xa0\x3f\xfa\xd1\xf6\xd6\xd5\x1a\x43\xa8\x3f\x1a\x12\xfd\x5a\
+\x17\xdd\x8c\x62\xfa\xcb\x3d\xcb\x01\xfe\xa6\x91\x71\x49\x51\x37\
+\x29\x74\x81\xd5\x56\x07\x70\xf9\x4a\x1a\x4e\xf8\xc9\x18\x89\x9b\
+\x66\xff\xe2\xd0\xa3\xab\x8a\xff\x65\x7c\x5d\x7f\x48\x90\xd5\xc3\
+\xd9\xf3\x07\x96\x03\x7c\x8f\x7d\xaa\x8b\x1e\xaf\xe8\x91\x04\xe4\
+\x07\x64\xcc\xc6\xb2\xc8\xc4\xe3\xd4\x7a\xc6\x85\xf8\xa9\x5d\x5b\
+\x73\x11\xff\xb7\x2d\x03\xa8\x3b\x87\xc6\x25\x35\x6f\x93\x2a\xd3\
+\xdd\x4f\x5b\xa9\x8c\x8e\x6c\x32\xe1\x6c\xd5\x27\x86\x1f\xff\x6a\
+\xcd\x00\x4f\xe3\xc7\xc7\x98\xe2\x69\x51\x55\x0f\xf5\x31\x87\x78\
+\x3c\x09\x23\x93\xa2\x1d\x5b\x49\x7d\xbe\x3b\xb3\x76\xc0\x8e\x93\
+\x4d\x34\x34\x83\xd4\x6e\x02\xc7\xf3\x30\xf5\x34\xcc\x54\x82\xb2\
+\xb1\xeb\xd3\xa3\xcd\x6b\xcf\xc0\x31\xe5\xe1\x81\x1e\x08\xac\x5d\
+\xf2\x6b\xb0\xb2\x54\xa2\x44\xd4\x79\xe9\x50\x7a\x6c\xef\xcb\xff\
+\x0b\x40\x6a\x38\x51\x4c\x0f\xdb\xe9\xef\x73\x34\x94\x82\x3b\x04\
+\xb0\x27\x39\x70\x2f\x65\x4e\x3f\x35\xb0\x66\xc0\x75\xd0\xb6\xe3\
+\x4d\x24\xfc\x08\xe9\xdf\x4b\xe2\xd5\xe0\xec\xf3\xf4\xfa\x9b\x04\
+\x3c\xa7\x9f\xd9\x1f\xce\x15\xf0\x07\x67\xd6\xd8\x28\x53\x48\x2d\
+\xba\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x01\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xc8\x49\x44\x41\x54\x78\xda\xad\x56\x7d\x68\x14\x57\
+\x10\xff\x4d\x4d\x93\x18\xab\x56\x4c\x4e\x2d\x46\x6b\x6c\x34\x2a\
+\x09\xc4\x8f\x48\x23\x7a\x67\x50\x2e\xe2\x07\x41\xb9\xaa\x88\x8d\
+\xa0\xc6\xe2\x12\x34\x82\x0d\x44\x51\xd3\x82\x11\x45\x09\xe8\x09\
+\x36\x50\x3f\x21\x48\x6c\x11\x54\x92\x9a\x36\xde\x29\x1a\x48\x6d\
+\x4d\x93\x2a\x21\x68\xad\xb1\xa2\x92\x90\xe8\xd9\x36\x31\x1f\x37\
+\xbe\xdb\xb7\xbb\xd9\xdd\xbb\xf3\xaf\x0c\x2c\x6f\xdf\x7b\x33\xf3\
+\x9b\xf9\xbd\x99\xb7\x4b\xab\xfd\x1c\x07\xa0\x58\x3c\xa5\x18\x5a\
+\x39\x2b\x9e\xbd\x94\x57\x37\xb0\xf6\xb3\xd1\x54\x3c\x75\x24\x65\
+\x26\xc4\x0c\x8d\xe7\xff\xfb\x81\x47\x01\xc6\xc3\x00\x7f\x4d\xab\
+\x6a\x7b\x79\xd9\xe4\x0f\x31\x37\x11\x48\x12\xb9\x24\xc5\x03\x2c\
+\x94\x48\x53\x36\xbf\xc3\xb6\x16\x49\xef\x5f\xe1\xfc\xcf\x2e\xa0\
+\x35\x00\x54\x3f\xe9\x03\x2d\xaf\xee\xe1\xf5\x69\x71\x58\x34\x0e\
+\x88\x1d\x06\x24\x7c\x20\x94\x4d\x1e\x89\xa5\xb1\x9c\x98\xd6\x28\
+\x02\x92\x18\x7b\x82\x40\x7b\x0f\xd0\xd8\x09\x54\xb6\xbc\x05\xe5\
+\x5e\xf9\x8f\xf3\xd3\x13\xe0\xfe\x44\xd3\x13\x8a\xac\x79\x34\xbf\
+\xd7\x75\x54\xe1\xd2\x33\xaf\xaa\xe3\x99\xa0\x20\xc7\xe1\x89\xce\
+\x91\xb0\xbb\xfe\x4c\x1c\x42\x73\x37\x68\xe9\x8f\x01\x2e\x98\x33\
+\x52\xcd\xc0\x92\xaf\x2d\xea\xc2\x3f\x5c\x68\xec\xf2\xab\x80\x69\
+\x1f\x39\xb1\x2b\xd5\x87\x9e\x01\xe0\xad\x88\xb8\x6f\x40\xea\xc4\
+\x08\x06\xe2\x05\x03\x71\x62\xec\x10\x59\x54\xfc\xf6\x06\x94\x73\
+\xb1\x93\x0b\xb3\xc7\x20\x2b\x31\x32\xa7\xc2\x1e\xaf\x7a\x81\xd5\
+\xf5\x24\x27\x21\x7a\x84\xc3\xc3\x99\x6c\xc6\xb7\xc4\xa4\xcb\x89\
+\xfa\x57\xa0\x45\x17\xda\x79\xf7\xe2\x44\x64\x7c\x3c\xa8\xad\xd3\
+\x12\xe8\x93\xce\x5f\x8b\xb1\xa8\x51\x02\x70\x50\xa2\x96\x67\x45\
+\x72\x69\x95\x23\x37\x3a\x40\xd9\xa7\x9f\xf3\x3e\xf7\x78\xa4\x8e\
+\x1a\x64\xa4\x8f\x35\xc7\xbd\x32\xe8\x90\x28\x0d\xd6\x0c\x4e\x2e\
+\xe0\x41\x03\x1d\xcb\xfc\x2e\xe4\x9b\x9a\x17\xa0\xac\x53\x4f\xb9\
+\x2c\x6f\x22\x92\x13\xe4\x7e\x6f\x50\x46\xdc\xdd\x6f\x35\x28\xb8\
+\x4d\x32\xb3\x01\x99\x41\x45\x0e\xab\xd5\xa4\x66\x6c\xe3\x49\x2d\
+\x0e\x31\x96\x5c\xfe\x07\x34\xfb\xf8\x63\x2e\x5f\xf7\x29\x1c\xa2\
+\x07\xfa\xc5\xea\x2f\x2f\xab\x70\xfd\xb9\x17\x2d\xaf\xfd\x32\x62\
+\xed\x09\x45\xcd\xb6\x39\x34\xc0\xd0\x7a\xda\x58\x27\x96\x4c\x51\
+\x30\x3f\xd9\x23\xe3\x12\x7b\x3b\x2f\xfe\x0d\xca\x38\xda\xca\xdf\
+\xe5\xa7\x62\x74\xac\xec\xc0\x03\xcd\x2e\x3c\xe8\xf2\x1b\x7c\x93\
+\xcd\x39\x47\x01\x08\xad\xcd\x48\x74\xa2\x74\xa9\xcf\xa0\x68\xdb\
+\x99\x87\xa0\x99\x65\x0f\xf8\xfc\x57\x33\x10\x4b\x92\x9e\x03\x8d\
+\x02\xa0\xd3\x1f\xe6\x50\x77\x64\x01\x08\x5a\xb3\x9a\xe5\x70\xe2\
+\x60\xae\xcf\x38\x86\x8d\xa7\x5a\x40\xd3\x4a\x9b\xf8\x87\x1d\xe9\
+\x06\xea\x6d\x41\xd1\xb5\x27\x5e\xdc\x6f\x8f\x00\x12\xb4\x82\x98\
+\x41\xd3\xc7\x39\xb1\x72\xa6\x82\x85\x29\x1e\xa3\xc6\xd7\x94\x37\
+\x83\x52\xf6\xfc\xce\xd5\xc5\x99\xea\x02\xdb\x0e\xc9\x28\x0c\x31\
+\x71\x57\x92\x25\xfa\xda\x4d\x2c\xf7\xb4\x42\x30\xba\x9e\x06\xed\
+\x72\x0f\xdd\x03\x4d\xda\xdd\xc0\xbe\xfd\xf3\x8c\x6b\x22\xac\xdb\
+\x34\x6d\xd7\x69\x89\xaa\x47\x7c\xb3\x80\xad\x3a\xe6\xae\xd3\xd6\
+\x5d\xa5\xbf\x82\x26\xec\xb8\xc3\x0d\x65\x9f\xab\x9b\x46\x55\xda\
+\xeb\x5a\x8c\xd9\x15\x64\x94\x68\x28\xd2\x7a\x85\x2d\xce\x74\x7d\
+\x3d\xe3\x90\xcc\x2f\xa9\x07\x39\xb6\xdf\xe4\xa6\x63\x0b\xad\x2d\
+\x68\xbf\x29\x85\xcc\x3b\x49\xb2\x9a\x58\x56\xd6\xdd\x22\x96\x2a\
+\xef\x69\xe8\x8c\xa2\x5b\xa0\xb1\x5b\xeb\xb8\xd5\xbb\xd8\x1e\x48\
+\x18\x53\x9b\x2f\xb9\x70\xf7\xa9\x2c\xdf\xb9\x13\x9d\xf8\x7e\xad\
+\x2f\xcc\xc6\xce\xd8\x34\xc5\x07\x1a\xb5\xa9\x96\xdb\x2a\x96\x18\
+\xfc\xb3\xad\xe5\x49\xb3\xac\x69\xa9\x42\xe5\x3d\xaf\xca\xff\x86\
+\x39\x0a\xdc\xd3\x3d\xd6\x73\x33\x1d\xb8\xee\x22\x79\xcb\xcf\xa0\
+\x11\x1b\x6a\xf8\xe5\x39\x37\x6c\x7e\xed\xd7\x4a\xc4\x4f\x5b\xb4\
+\x9b\x54\xb7\x1d\xff\xe5\x4f\xa0\xf8\x2f\xae\x72\xd3\x89\x1c\x4c\
+\x4a\x1a\x2e\xf9\x85\x35\x8b\x68\xa0\xef\xbb\xa6\x43\x7b\x6d\x1d\
+\xdd\xc8\x28\xbc\x01\x8a\x5d\x73\xe5\x8c\xb2\x62\x4a\xbe\xb2\x3c\
+\x45\x05\x19\x0a\x69\x6b\xef\x86\xf7\xda\x5f\xf0\x5e\x7d\x7c\x96\
+\x62\xf2\x2e\x3b\xc4\x5a\x81\x78\xbe\xb5\x68\x59\xbe\xb7\x26\x92\
+\xa3\x7d\xf5\xc2\x2a\x84\xc5\x6f\x0b\x95\xbc\x03\x1e\x34\xda\x9e\
+\x6a\xe4\x76\x27\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x05\xb6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x7d\x49\x44\x41\x54\x78\xda\x85\x55\x0b\x4c\x53\x67\
+\x14\x3e\xb7\x5d\x29\x56\x1e\x15\x21\x54\x79\x33\x66\x21\x43\x7c\
+\x00\xd9\x86\x59\xd1\x68\x81\x8a\xd3\x65\x88\x4c\xc1\xf8\x64\xc9\
+\x88\xc5\xcd\x25\x38\x31\x59\x1c\x13\x8d\x4b\x04\xa2\x0e\x65\xf8\
+\x58\x0c\x53\x23\x8a\xdb\xa4\xa0\xa0\x82\xb8\x8a\xd3\xa1\x93\xcd\
+\xd9\x92\x31\xa5\x80\x80\x0f\x68\xa7\xd4\x96\xd2\xdb\x9d\xbf\xff\
+\xbd\xb6\xea\x98\x27\x69\xef\x7f\xef\xff\xdf\xef\x3b\x8f\xef\x9c\
+\xcb\xc0\xff\x58\xda\xb6\x53\xb2\x80\x00\x99\xea\xf5\xa8\x08\xd5\
+\xe4\x80\x80\xb8\x09\x62\x08\xb1\xb2\x00\xf7\xcd\xf6\xee\xee\xfe\
+\xc1\xf6\x3b\x9d\x1d\xf5\xa6\xfb\x7d\x67\x9a\x8a\xb2\xfa\xc6\xc2\
+\x60\xfe\xeb\xa1\x6a\xfb\x8f\xa1\x11\x6f\x4c\xc9\x4f\x8d\x8f\x5e\
+\x13\xed\x0b\xd2\x30\x1f\x00\xb1\xf0\xf9\x33\x66\x1b\x80\xce\x04\
+\x70\xfd\x01\x18\xcf\x5f\xd3\x1d\xea\xed\xb8\x51\x76\xa9\x78\x99\
+\xe1\x95\x04\x59\x15\xda\x8c\xf9\x8a\xb7\x8b\xe7\x06\x0b\xe4\x41\
+\x5e\xf4\x99\x0d\xbd\xb6\xd9\x01\xec\x6e\xe7\x08\x9f\x44\x44\xd7\
+\x1d\x43\x00\x47\xf4\x36\x7d\x4b\x53\xf3\xe6\xa6\xc2\x94\x93\x63\
+\x12\x64\x1f\xb8\x9a\x9b\x33\x2f\x71\xf7\xdc\x60\x10\x8b\x04\x00\
+\x2c\x01\x76\x00\x0c\xa3\xb7\x24\x35\xe4\x9e\x98\x40\xc0\x91\xe0\
+\x55\x8c\x08\xde\x48\x64\x41\xf6\xfd\x3a\xb0\xd6\x68\xce\xab\x2f\
+\x6e\x9a\x57\xf9\x12\xc1\x92\x0a\xed\xe2\xb5\xf3\x93\xaa\x94\x08\
+\xce\x7b\xcd\x3a\xe8\x9e\x65\x14\x53\xe2\xee\x3e\x50\x32\x3b\xee\
+\x8f\xb0\x94\xc8\xdf\x93\x46\x55\xd2\x0e\x56\xcd\xe9\xba\x9c\x2b\
+\x5f\xa6\x9f\x78\x46\x80\xc5\x0c\xc9\x5c\xa8\x6a\x5c\x19\x23\x96\
+\x13\xef\xac\x2f\x80\x11\x90\x7f\xac\x14\x90\xdf\xb2\x8d\xba\xd6\
+\xa3\x9c\x23\x81\x12\x1a\x51\xc1\x45\xb3\xfe\x5a\xed\x91\x94\x1b\
+\xbb\x73\x0d\x4e\x82\xbc\x9a\xbf\xcb\x0a\x95\x11\xeb\x49\xce\x49\
+\xf1\x84\x5c\x0a\xec\x5c\x4a\x08\xd0\x43\x8b\x0b\x94\x00\x3a\xb8\
+\xbd\x51\xde\x09\x8e\x2d\xce\x0f\xa0\xed\x21\xc0\xa6\xa3\xd7\x4b\
+\xb5\x9f\xc5\x6f\x60\x94\x45\xd5\xb2\x55\x4b\x17\xdf\xce\x8a\x04\
+\xa9\x71\x04\xe0\x29\xbe\xe1\x23\xa6\xe1\xf2\xe0\x64\x7d\xcf\x8c\
+\x51\x20\xf9\x6b\x1c\xa8\x9d\xab\x0f\xef\x88\xf3\x87\x6b\x94\x32\
+\xa0\xf2\x60\x63\x2b\x18\x5b\x8e\x7e\x13\xc3\x64\x94\xb7\xac\xda\
+\x98\xf1\xee\xc1\x78\x7f\x80\xae\x61\x97\x97\x3e\x22\x17\xd1\x13\
+\x7c\x70\xad\x1f\xe0\x46\xf7\x10\xae\x1c\x10\x1e\x28\x15\x4e\x1a\
+\x2f\x70\xee\x91\xb3\xa4\x56\x84\xc0\x59\x0f\xbc\x4f\x94\x01\x34\
+\xa0\x60\x77\x1e\xd2\xac\x66\xd4\xb5\xfd\xc7\xbf\x9a\x17\x98\x49\
+\xf2\xdb\x6b\xa6\x1e\x91\xf0\x89\x6a\x3c\xd1\x5d\x2f\x24\x3a\xad\
+\x33\xb1\xcd\xad\xbf\xd6\x0e\x9b\x86\xb6\x3b\x80\xb5\x7b\x8c\xf3\
+\x51\x47\xcd\x78\x27\x27\x39\xd2\x97\x11\x32\x2e\x09\x13\xe5\x91\
+\x7b\x12\x01\x79\x77\xc9\xe1\x3b\xd5\x4c\xa1\x76\x44\x57\x9c\x24\
+\x92\xff\x65\xa2\x79\xe6\xcd\xc6\xe5\xb8\x07\xa3\x3a\x79\xb6\xf9\
+\xdc\xc9\x75\x73\x94\xee\x85\x4f\x2e\xaa\x3d\x3d\x6b\x6e\xca\x02\
+\x65\x98\x08\x3c\x10\x4c\xc4\xd0\xda\x91\x14\x06\x60\xb1\x27\xe1\
+\x2f\xa9\xca\xa6\x67\x4a\x6e\xda\x87\xd7\xc5\x0a\x24\xbf\x0f\x52\
+\xa5\xc0\x0b\x61\xb7\x76\x99\xd8\xcb\x17\xce\xa6\x9f\xdb\x92\x75\
+\xc6\x9d\x20\x3e\x6f\x4f\x62\x58\xf2\xd2\xd6\x1d\xa9\x7e\x42\x02\
+\xcc\xa7\x8b\xa4\x98\x78\x1f\xea\x0d\xf0\x61\x1d\x6b\x76\x12\xe4\
+\xbd\x29\x90\xb4\x3f\x02\x78\x64\x71\x15\xcd\xc2\xa9\xa2\xe5\xae\
+\x89\x6d\x6b\xfc\xe1\x3d\xed\x8e\x95\x75\xee\x04\x71\x6b\x4b\x52\
+\x26\xcf\x5e\x51\x5f\xbe\xd0\x4f\xc0\xcb\x96\x98\xd5\x41\xd3\x1a\
+\x81\x04\x99\x1a\x9b\x99\x51\x37\x8d\xe8\xca\x14\x22\xf9\xd5\x07\
+\x00\x86\x27\xd4\x13\x11\xfe\x79\xe0\x6b\x52\x2c\xf2\x1f\x18\xd9\
+\xfe\x63\x75\x6d\xbf\x14\xa5\x27\xb8\x13\x44\x7e\x5c\xa5\x9d\x9d\
+\x91\x9d\xb4\x3c\x1a\x60\xe2\x38\xaa\x7f\x02\x4e\x52\xeb\x2f\xa6\
+\x11\xcc\x38\x88\x29\xca\x3c\xd6\x7d\xbc\x34\x3d\x38\x93\x48\x70\
+\x08\x65\xea\x89\xe0\x5e\x42\x1a\xa6\xa7\x88\x8e\x89\xe2\x56\x2b\
+\x5c\x69\x3c\x7b\x93\x7d\xd4\xb9\x8b\xb5\x8f\x82\x55\x12\x9c\x3f\
+\x21\x71\xd1\xb4\x0f\xa6\x49\xc0\x03\x81\xa5\xe3\xa8\xc7\xc1\xe3\
+\x69\xc1\x49\x0d\xc8\x75\xfe\xbe\xce\x6a\x26\x79\x6b\xc3\xaa\xcf\
+\x97\x2b\x0f\xa6\x04\x03\x0c\x58\x5c\x63\xc0\x99\x2a\x07\x55\xc5\
+\x6f\xd8\x38\x47\x3a\x00\xfa\xfa\x4d\x0e\xd2\x64\x13\xfd\x7c\x99\
+\x69\x32\x3a\x61\x47\x11\x68\x84\x3b\x47\xc6\x45\x2c\x36\x9a\x62\
+\x12\x40\xf9\x2d\x1c\x1b\x7b\x8f\xaf\x66\x12\xd6\x57\xca\x52\x97\
+\xad\xbd\x5d\x94\x40\x1b\xed\x89\xed\xf9\x06\x1b\x78\x8a\x85\x1e\
+\xa0\x91\xf0\xa4\x0e\xae\xa9\xc8\x9a\xe5\xd6\x84\x88\xa4\x27\x1a\
+\x09\x56\x4c\x21\xf9\x07\xa3\xee\xd8\xd6\x18\xe7\xa8\x50\x94\xb4\
+\x95\x94\x2e\x9f\xf9\xe9\x4c\x6c\x36\xc3\x63\xda\x30\x7c\x24\x0d\
+\x3d\x2e\xf9\xba\x03\x12\x21\x38\xb8\x4e\x66\x39\x02\x31\xa6\x35\
+\x37\x06\x40\x8b\x0e\x6d\xa9\x6c\x2e\x35\x94\xcc\xd9\xe0\x24\x98\
+\xae\xfe\x36\x74\x6a\x5a\x76\xc3\x3e\xa5\x44\x4e\x5e\x1e\x30\xd3\
+\x22\x37\xe3\x77\xea\xcf\x41\x97\x04\x79\x50\xf6\x05\x02\xe2\xb9\
+\x07\x1e\x52\x85\x01\x84\x61\x2d\x96\x9e\x30\xeb\x4d\x8d\x3b\x53\
+\xee\x56\x7f\x61\x78\x36\xae\xe3\x0a\x4e\x2d\x9e\xbd\xe0\xfd\xaa\
+\xaf\x93\xe8\xb8\x6e\xe9\xa3\xed\x6e\x77\x9b\x37\xce\x2e\x77\x03\
+\xe5\x47\xba\xb7\x07\x05\x8f\x44\xf0\xbc\x0b\x60\xd5\xff\xb4\x37\
+\xa7\xe7\x70\x9e\x6b\x5c\xf3\x16\x5b\x50\x9b\xab\x48\x4f\xdf\xbd\
+\xed\x2d\x10\x9b\xb0\x1e\xe7\x7b\x01\xf4\x46\x1c\x80\x98\x7f\x8b\
+\xcd\xd5\x80\xc4\x48\xe7\x12\x95\x85\xe3\x58\x48\x0b\xa1\xaa\xf9\
+\xa4\x19\xac\x1d\x9a\x4a\x75\xef\x77\x1f\xbd\xfc\xc1\xe1\x4d\x9e\
+\x5f\x9d\x11\xae\x58\x54\xbc\x7a\xba\x48\x3e\x2b\x90\x16\xf7\x16\
+\x92\xf4\x63\xda\x1e\x5b\x29\xc9\x78\x04\x0e\x42\x29\x4e\xf5\xa3\
+\x72\xd6\x60\xa4\xe5\x97\x6d\xfa\xa1\x8b\x15\x9b\x7b\xbf\x57\x8f\
+\xfd\xc9\xe4\x6d\xca\xca\xb2\x50\x08\x4a\xcc\x8f\x4a\x48\x5a\x93\
+\x1c\x0a\x52\x45\x10\x3e\xf3\x75\xcd\x7e\x62\x7a\xfc\x0e\x6b\xba\
+\x00\x2e\xdd\x01\x63\xd7\x65\xcd\x01\xe1\xbd\xab\xbb\x0c\x35\x45\
+\xaf\xfe\xe8\xbb\x5b\x54\xf6\x0e\x19\xeb\x1b\xa9\x12\x4c\x9e\xa1\
+\x02\x69\x68\x9c\xcc\x0f\x42\x48\x2d\xee\x3d\x84\x6e\xfb\x60\x67\
+\x3b\xd3\xf3\x73\xbd\xc0\xd8\x55\xdf\x55\xb3\xb5\x7f\x2c\x8c\x7f\
+\x01\xf7\xad\x74\xae\x88\x98\x29\x08\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x03\xfb\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xc2\x49\x44\x41\x54\x78\xda\xa5\x94\x6b\x68\x1c\x65\
+\x14\x86\xdf\x6f\x66\x76\x66\x27\x7b\x49\x66\x9b\x4b\x93\xb4\xb6\
+\xa9\x6d\x6a\x49\x8a\x9b\x16\x15\x4b\x88\x9a\x5a\xad\x17\x62\xf1\
+\x9a\x20\x8a\x54\x05\x05\x51\x51\xab\x54\x23\x42\x29\x6a\x95\x62\
+\xa0\xd0\x3f\x11\xa5\xb6\x48\xc0\x8a\x46\x0b\x4b\x45\x4c\x57\x68\
+\xb1\x8d\xad\x35\x9a\xad\xd9\x24\x4b\x9b\xd8\x6c\x76\x37\x71\x67\
+\xf6\xc2\x5e\xe6\xf2\x39\xc9\x8f\xaa\xe9\x5e\xeb\x81\xf9\x73\xe6\
+\xfb\xde\xe7\x1c\x1e\x66\x08\x4a\xa8\xec\x09\xf0\x2c\x8b\x83\x60\
+\xf8\x1d\x60\x25\x09\x44\x23\x54\x4f\xa9\xc4\x48\xf9\xa9\x41\x7b\
+\xb9\x0e\x0c\xe6\xbb\x4b\x8a\x85\x27\xbf\x47\x0d\xc7\x31\xa7\x50\
+\xb9\x79\x2d\xdb\xf0\x1c\xd8\xda\x7b\xcd\x6e\x14\x34\x7e\x1e\x7a\
+\x64\x08\x46\x68\x50\xa3\x99\x70\xaf\xf5\x0e\xec\x2b\x1b\x10\xfb\
+\x0e\x2c\x43\xc8\x19\xa6\x66\xeb\x26\x7e\xdd\x7b\x30\x58\x09\x41\
+\xbf\x07\x72\x70\x06\x15\xd2\x72\xd4\xad\xbe\x01\xa2\x7a\x16\x6a\
+\xa0\x4f\xd7\x53\xe1\x07\x1d\x77\xe1\x9b\xb2\x00\xb2\x07\x8f\x33\
+\xf6\xa6\xc3\xd6\x8d\xfd\x04\x7c\x35\x26\x4f\xf5\xe3\xe2\xf0\x17\
+\x34\x23\x87\x27\x58\xab\xb0\xa6\x7a\xdd\xdd\x6c\xcb\xb6\x9d\xe0\
+\xa2\xc7\x90\xbd\xf8\xe9\x78\xd5\x76\xbd\xb9\x2c\x40\xe4\x2b\x1c\
+\x13\x56\x3d\x70\x9f\xbd\xf5\x03\xc4\x43\x3f\xe2\xcc\xc0\x3b\xa0\
+\xd9\x79\x2c\xab\xa9\x08\x73\x24\xf3\x76\x54\x36\x0e\x5e\xd7\xfe\
+\x12\xbb\xb2\x79\x2d\x94\xe1\xd7\xb4\xea\xed\x8a\xa5\x2c\xc0\x9f\
+\x03\xf0\x49\x37\xed\xdd\xc0\xd7\xb6\x41\x4b\x06\x91\x8e\x85\xcc\
+\x27\x8c\xf0\x05\x0f\x2c\x34\x32\x57\x27\x45\x35\xa7\x64\x5f\xce\
+\x70\x76\x33\x49\x85\x29\x3e\xbb\x54\x7c\x41\x40\xe0\x08\x7e\x91\
+\x5a\xba\xdd\xb6\x95\x77\x82\x1a\x1a\x18\xc2\x80\xb0\x1c\x12\x97\
+\x4f\xc2\x12\x3e\x04\xce\xd5\x86\x62\xe2\x0b\x02\x7c\x1f\xa3\xdf\
+\x75\x7d\xfb\x33\xae\xf5\x5d\xe6\x28\x64\x71\x1a\x4a\x0d\xa8\x93\
+\x7d\x20\x8e\x16\x94\x22\x3e\x2f\x60\xf8\x00\xec\x36\x47\xc5\x64\
+\xa3\x7b\x47\xad\xad\xa6\xd9\xdc\x40\x07\x35\x4f\xeb\xd1\xdf\xa0\
+\xca\xbf\xc2\x14\x8f\x7f\x89\x87\x9e\x08\xa7\x28\x27\xf0\x4b\xc5\
+\xe7\x04\x9c\xdc\x0f\xd1\xe6\xe4\xfd\xab\x6e\x79\x61\x85\x50\xc1\
+\x83\x25\x0a\x58\x8b\xb8\xb0\x04\xe2\xe3\x5f\x83\xa9\xda\x88\x1c\
+\xe2\xe7\x4d\xf1\x6f\x2e\x15\x7f\x15\xe0\xc4\xfb\x0b\x93\xf3\x63\
+\x6b\xb6\x3c\xdd\x60\x11\xac\xe0\xe9\x14\x78\xbb\x0b\x6a\x3a\x8d\
+\x64\x2c\x8a\xd4\xd4\x10\xaa\xdc\xbb\x91\x4b\x3c\x67\x44\xe6\xd2\
+\x4a\xd4\x57\xb5\xe1\xa1\x8e\xd5\x5b\x9e\xc2\x9c\xf7\xd9\xff\x4a\
+\x3e\xbe\x07\x95\x76\x3b\xe3\x6b\xee\xd8\xd9\x20\x88\x02\x62\xd3\
+\x5e\x98\xb9\xe6\x21\x03\x09\x39\x8a\xf9\x99\xa0\xd2\x50\x0f\x5b\
+\x9d\xbb\x9b\xbb\x4a\x7c\xf0\x1c\xa2\xbe\x23\x30\x54\xd9\xa8\xde\
+\xfc\x2e\x63\xab\x6f\x43\xf0\x87\x9e\x7f\x00\xdf\xf6\x2e\x84\xe3\
+\x42\x6b\xe7\x93\xf5\x9c\x85\x81\x95\xf1\x63\x6a\x6c\x16\x63\x67\
+\x03\x72\xd7\x3e\x48\x05\xc5\x2f\xbc\x50\x15\x24\xff\x38\x00\xd6\
+\x75\x2b\x6c\xeb\x77\x23\x15\x3c\x8e\xd9\x9f\xf7\xa7\x17\x01\x5f\
+\xbe\x0e\xd1\x61\xc3\xf8\x8d\xdb\xba\x1b\x05\x81\x01\xaf\x8d\x40\
+\x74\x2d\xc3\xe8\x4f\x7e\xb4\x3e\x11\xbc\x32\x44\x3e\xf1\xc4\x24\
+\x50\x43\x05\xd1\xe3\xe0\xa4\xdb\xa0\xa5\x2e\x21\x38\x72\x08\xca\
+\xf4\xa8\x97\x0c\xbc\x02\xde\xe9\x14\x02\x6d\x9d\xf7\x34\x8a\xa2\
+\x19\xae\x9f\x87\xe8\xb4\xe3\xf2\xa4\x82\x73\xa7\xa7\xb3\x5d\x7b\
+\x0d\xa1\x98\xf8\x2b\xdf\x2c\x11\xa0\xa9\x19\x44\x26\xbc\x88\x04\
+\x46\xe2\x84\x66\xdd\xe4\xe8\x2e\x12\xd8\xd4\xde\xd2\x64\x73\x35\
+\x21\x31\x33\x04\x1d\x22\xb2\x19\x03\xfe\xd1\xbf\x34\xdd\xa0\x0f\
+\x3f\xf2\x21\x06\x8b\x89\xa7\x9a\x39\xbd\xf9\x3f\x4f\xc5\x64\x28\
+\xe1\x4b\x88\x47\x66\xe7\x08\xd1\xef\xbf\xf9\x45\x9c\x26\x47\xdf\
+\x60\x68\xe7\xd6\x4a\x64\xb3\x2a\x26\xc6\x35\xf8\x7e\x4f\x27\xcc\
+\x0c\x99\xb7\xe0\xad\x9e\x3e\x7c\x56\x8a\x78\x4a\x91\x61\x08\x38\
+\xb3\x19\x62\x18\x78\x4c\xe7\x7b\xda\x5f\x85\xb2\xb8\xd7\xe7\x2f\
+\x13\xfa\xe8\x63\x0e\xb0\x0e\x06\x5e\x4f\x12\xb7\xef\x52\xcb\x16\
+\x5f\xa8\xc8\x27\xcf\xc3\x58\xd1\xc8\x10\x8e\x03\x42\x21\x6a\xf4\
+\x7c\x44\xd9\x72\xc4\x17\x05\xe4\x6a\x96\x2a\xfe\x9a\x01\xa5\x88\
+\xff\x7f\x80\x22\xe2\x4b\x0d\xcf\x0b\x28\x24\xbe\xdc\xca\x79\x31\
+\x9f\xf8\x6b\xa9\xbf\x01\x8b\xf4\x35\xf6\x49\xb9\x5b\xec\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x4e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x15\x49\x44\x41\x54\x78\xda\xed\x94\x7f\x48\x53\x51\
+\x14\xc7\xcf\x13\x93\xc8\xc2\x4a\x90\x0a\xcc\x69\x33\x86\x96\x62\
+\x0d\x4b\x4b\x33\x61\xa6\x61\x6a\xbf\xa8\x44\xa7\x96\xae\x1a\xb3\
+\x9c\x2c\x4d\x0b\xd1\x22\x35\x35\xe7\x6f\x73\x28\xfe\x98\xfd\x10\
+\x4c\xc4\xc4\x0c\xcb\x12\x45\xac\xa4\x42\x13\x04\x5d\x16\x41\x44\
+\x89\xfd\x20\x09\xa2\x38\x3d\xef\xdb\xdb\xdb\x2b\xb9\x91\x7f\xf7\
+\x60\xbb\xf7\x9c\xef\x39\xf7\x73\xde\xbd\xe7\x3e\x06\x28\x8f\x7f\
+\x83\x09\xe7\xc6\xc1\xf8\x75\x0c\x2c\xf0\xa1\x26\xfe\x07\xcc\x0b\
+\x60\x17\xdd\xce\x0e\xdd\xec\xcf\x7e\x01\xeb\x69\xd9\x62\x4a\xa8\
+\x00\xbf\xba\x89\x51\xe9\x4a\x3b\x8f\xa6\xa8\xb5\x36\xff\xb2\xf2\
+\x83\x57\x5f\x21\xb3\xf7\x1d\x0c\x1d\x73\x17\xad\xf9\x07\xc0\xd7\
+\x30\x8e\xf7\x94\xee\xb0\x64\x11\x2b\x31\x9c\x8c\xc8\x47\xb2\x13\
+\x64\x88\x5b\xec\x42\xf8\x30\xfb\x13\xa2\x6e\x98\xe0\xb1\x4a\x46\
+\x07\xc8\xab\x5e\x60\xbf\xca\x93\xcc\x9d\x7c\xf2\xc0\xde\x75\xd5\
+\x5f\xab\x9f\x6a\x4b\x20\x63\x80\x61\x0c\x86\xd5\x1b\xe8\x00\x9f\
+\xd2\xe7\xd8\x77\xd2\x9b\x94\xe6\x1a\x55\x07\x2b\xfc\x37\x5a\x05\
+\xa2\x25\x6d\x6e\xb6\xc5\x65\x19\x24\x6e\x5d\x03\x9b\x5d\x96\x13\
+\x69\x47\xf5\x08\x3c\x4b\xf1\xa6\x03\xbc\x0a\x87\xb1\x57\xb3\x89\
+\xcc\x25\xe1\x35\x60\x2f\x97\xcd\x1b\xee\xef\xe6\x00\xea\x40\x67\
+\x78\xf2\xfa\x0b\xa8\x82\x24\x04\x10\x5c\xf1\x14\x46\xce\xc8\xe9\
+\x00\xcf\xdc\x21\xec\x39\xed\x4b\x12\x5c\x42\x2b\xc1\xd6\x4b\xfa\
+\x5b\x18\x42\xa0\xbb\x23\xa4\x28\x24\x30\x64\xfa\x08\x05\x77\x5f\
+\x82\xa9\x70\x17\x39\xa7\x90\xb2\x47\x30\x96\xe9\x47\x07\xc8\xb2\
+\xfb\xb1\x2b\x75\x1b\x30\x6c\x86\x6b\x48\x39\x80\x87\x9b\x48\x0f\
+\x92\x39\x82\x2e\x54\x0a\x83\x93\x33\x90\xdb\x39\xc1\x9d\x41\x69\
+\x38\x01\xec\xd6\x0f\xc0\x78\x76\x20\x1d\x20\xcd\xb8\x8f\x9d\x69\
+\x3b\xd9\x3a\x91\x88\xa2\x6e\x31\x7b\x18\x46\xb0\x19\x06\xb9\x18\
+\xf6\x2f\xbc\xa8\x0f\x26\x73\x83\xe9\x00\x89\xae\x1b\xdb\xd3\x15\
+\x5c\x06\xf0\xfd\xc8\xb5\xa7\x98\x68\xd9\x31\x8b\x7f\x6f\x7e\x0f\
+\x4c\x5d\x09\xa5\x03\x9c\x93\x6f\x63\xeb\xf9\x30\x52\x5d\x54\x52\
+\x23\xf1\xb5\x1b\xe2\x48\xdf\x44\xaa\x9a\x04\x9b\x85\x46\x26\xf1\
+\xb6\x92\x2c\x75\xf0\x52\x17\xbc\x29\xdf\x43\x07\xac\x3e\xde\x86\
+\x37\xb3\x22\xb8\xc2\x78\x15\xcd\x25\xf2\x6f\x20\xca\x66\xcc\x37\
+\x11\xe0\xc8\x85\x0e\x78\x5b\xb3\x8f\x0e\x70\x4a\x68\x41\x63\xce\
+\x7e\x22\x28\x35\x5c\x85\x8d\x15\x4a\x32\xc6\xf1\x76\x65\x2c\x81\
+\x0a\xb6\x92\xec\x62\x4c\xd6\x2d\x78\xdf\x70\x88\x0e\x58\x19\xdd\
+\x8c\x8d\xb9\x87\xd9\xa2\xd0\xaa\x42\xe0\x0e\xd3\xaa\x7a\xe1\xa0\
+\x85\x33\x88\x3f\xd7\x02\x33\xd7\x63\xe8\x00\x87\x03\xf5\x58\x9b\
+\x1f\x43\xe6\xc9\xa9\x46\x32\x56\xe8\x63\x49\xa8\x46\xcb\x55\x5c\
+\x5e\x1c\x4b\x32\x93\xb5\x66\xbd\x58\x49\x40\x89\x67\x9b\xe0\x73\
+\xeb\x51\x3a\x60\x69\x84\x01\x6b\x8a\xe2\xc5\x92\xf0\x85\x30\x37\
+\x0d\x5a\x75\x90\xf9\x0c\xd8\x51\xa5\xab\x87\xd9\x0e\x15\x1d\xb0\
+\x38\xac\x0a\xab\xf5\x49\x24\x29\x23\xbd\x99\xf8\xf2\x2e\x73\x15\
+\x67\xa4\x19\x05\x1b\xac\xf4\x02\xce\x56\x6b\x6b\xe1\xdb\x1d\x35\
+\x1d\x60\xa7\x28\xc3\x8a\x92\x13\xc2\xc6\x32\x7c\x17\x89\x5f\x47\
+\x74\x1d\xcc\xa1\x9a\x94\xab\xf0\xbd\xe7\x14\x1d\x60\x1b\xa4\xc7\
+\xd8\x78\x05\xc8\xe5\xeb\x2d\x22\xa2\xd0\x9f\xfc\x8e\xf0\x22\x63\
+\xd6\xa7\xa7\x3f\xc1\xc5\x1c\x23\xfc\x78\x98\x4a\x07\xd8\x04\x14\
+\x5e\x63\xdd\xd1\xd6\xbb\x2d\xfa\x54\xa3\xb0\xf5\xfc\xed\x46\xe1\
+\xb6\x8f\xe2\x80\xce\xcb\x7a\xbd\x5f\x1e\x1e\x40\x28\x89\xd6\xdf\
+\x23\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xaf\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x76\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x68\x54\x47\
+\x14\x3e\x33\xf7\xde\x64\xef\x3e\x92\x55\x37\x89\xd1\x88\xa9\xab\
+\x5d\x5f\x34\x6d\x11\x1b\x5b\x02\xd2\x1f\x6d\xa9\xb4\x36\x15\x91\
+\x2a\x16\xfc\xd1\x1a\xd2\x82\x56\x90\x9a\x22\x58\xc1\x12\x45\xb0\
+\x16\xac\xc4\xfa\x43\x8a\x98\xf8\xca\xa6\x48\x91\x22\x54\x2c\xd2\
+\xd6\x0a\xfd\xd1\x07\x36\x31\x6c\xd4\xa6\x9a\x44\xb3\xd9\xec\x23\
+\x7b\x77\xef\x63\xa6\x67\xe6\xee\x5e\x2b\x36\xed\x24\x87\xb9\x7b\
+\x77\xf8\xbe\x73\xbe\xf3\x98\x25\xf0\x1f\x2b\x13\x57\x9b\x81\xc3\
+\x6a\x20\xb0\x12\xf7\xa5\xf8\x6a\x5e\xe9\xab\x61\xb4\x1b\x68\xd7\
+\xd1\xae\x54\xad\xb3\xaf\x4d\x87\x41\xfe\xed\x65\xae\x4f\x6d\xc1\
+\x6d\x13\xa9\x08\x6c\xa4\x81\x99\x21\xea\x9f\x01\xc4\x17\x04\x50\
+\x2b\x00\x38\x07\x6e\xe6\x81\x1b\x69\x69\xcc\x48\x67\xb9\x55\xe8\
+\xc6\xf3\xa7\x82\xad\xf6\xd5\xff\x25\xc8\xf4\xaa\xed\x44\xf3\xed\
+\x50\xc3\x73\xa2\x6a\x64\x36\x90\x80\x1f\x08\x65\x78\xd2\x06\xc2\
+\x11\x9f\xe1\xb3\x0d\xc0\x1c\x3c\x6c\x72\x24\xc8\x81\x9d\x19\x03\
+\x96\x4d\x26\xb8\x63\x1d\xc2\x68\x8e\x4e\x4b\x30\x79\x4e\xed\xa0\
+\xfe\xea\xbd\x5a\x6d\xa3\x56\x51\x5b\x03\x44\x43\x44\xa2\x02\xd0\
+\xd2\x31\xee\x60\x00\x88\xee\xa0\xd9\xf8\x6c\x31\x60\x16\x9e\x29\
+\x32\xb0\xb2\xe3\x60\x4f\x8e\x5a\xac\x68\xec\x99\xb1\xde\xee\x7c\
+\x8c\x20\x79\x46\x69\xa7\x7a\xf5\x61\xbd\x61\x91\xa6\xd5\x84\x01\
+\x34\x0d\x81\x35\xf4\x1e\x77\xa0\x02\x1d\xff\x2d\xd7\x98\x89\x5c\
+\x45\x00\xcb\xc6\x47\x41\xc2\x80\x23\x89\x93\x9b\x04\x2b\x39\x62\
+\xd9\x66\x7e\x7b\x64\x83\x73\xd4\x23\xb8\xdf\xad\xb6\x50\xad\xe2\
+\x84\xde\x10\x8b\x56\xd6\xd7\x00\xf5\xa1\xd7\x8a\x1f\x71\x2b\xa1\
+\x75\x4d\xb7\x17\x61\xdf\xc5\x4d\x72\x6f\x7d\xf5\x94\xf7\x2e\x7e\
+\xbe\x05\x39\x91\x10\x23\x61\x69\x1b\xcc\xf4\x38\x14\x92\x63\x09\
+\xe6\x58\x5b\xea\x36\x3a\x57\x25\xc1\xbd\x93\x4a\x97\xbf\x6e\xfe\
+\xd6\x40\xe3\x02\xa0\x41\xf4\x56\x0d\x00\x51\x74\x04\xef\x81\xaf\
+\x7e\x64\x70\xf2\x17\x17\xac\xb7\x8d\xca\x7d\x5d\x17\x93\xfb\xe6\
+\x26\x80\x37\x56\x51\x88\x9f\x7d\x0e\xa3\x61\x28\x11\x46\x62\x16\
+\x21\x3f\x3e\x02\x85\x54\xea\xd8\x9c\xb7\x9d\x36\x32\x7c\x42\x69\
+\x56\x7d\xfa\xa5\xf0\xa2\x65\x21\x6d\x56\x10\x88\x5e\x81\xb2\x04\
+\xa0\xf5\xf5\x5e\x38\x70\xfc\x07\xb8\xee\x34\x7b\x40\x35\x4f\xae\
+\x96\xc0\xc7\xbf\xbc\x2c\x3f\x0b\xa2\x95\xca\x35\xf8\xf0\x9d\xe7\
+\x21\xde\xb3\x02\x09\x30\x2f\x45\x07\x9c\xa9\x0c\x4c\x8e\xdc\xcb\
+\x3a\x96\xfd\x12\x19\x3a\xae\xec\x0a\xd6\xd6\x75\x86\x17\xc4\x40\
+\xa9\x46\xcd\x2a\x74\x94\x07\x09\x5e\x3b\xef\x79\x5f\xf6\xbc\x4c\
+\xf0\xe0\xe6\x15\x2f\x12\x2f\x8a\xd3\xcf\x82\x83\x04\xac\x28\xca\
+\xd8\x80\xcc\xc8\x28\xe4\xd3\x53\x1d\xe4\x66\x97\x12\x8f\x44\xa3\
+\xad\xc1\xd9\x73\x80\x86\x29\xe6\xb5\x12\xb5\x77\x23\x10\x04\x62\
+\x95\x25\x1a\xf8\xe2\x45\xb9\xc7\xde\xbd\xec\x49\x24\x96\x24\xe8\
+\x6e\x02\x27\x83\x79\xc0\x08\x84\x4c\x53\xc9\x14\x4c\x8c\x4e\xf4\
+\x91\x1b\x47\x94\xfe\x86\xa6\xa5\x31\x5f\x38\x0c\x4a\x90\x60\x04\
+\x3e\xcc\x01\xea\xbf\xf6\x82\x94\x28\xb6\xbc\xd9\x4b\xe8\xee\xf7\
+\x5c\x82\x7d\x9f\x5f\xf6\xde\x0d\xfc\xee\x4a\xd4\xdb\xfd\x14\x38\
+\x69\x26\x25\x12\x49\x37\xb3\x39\xb8\x3b\xf4\x60\x80\xfc\xfa\x29\
+\x9d\x5a\xb8\xaa\xc9\xaf\xf8\x7d\xa0\xe8\x0a\x76\x2c\x96\xa6\x86\
+\x32\x51\x1f\x46\xd1\xf7\x48\x13\xf6\x5d\xdc\x5c\xaa\xa2\x93\x8f\
+\xbc\x8f\x9f\x7d\x1a\xbd\xb6\x31\x02\x47\x96\xab\x20\x70\x8c\x02\
+\x0c\xfd\x31\x9a\x27\x3f\x1f\xa4\x53\x4b\x5e\x58\x8e\x04\x3a\x50\
+\x1d\x25\xaa\x54\xb1\xb7\x70\x24\xa8\x95\xc0\xb1\x4c\x09\x11\xfd\
+\x50\xea\x03\xd1\xbe\x1c\x4b\x92\x17\x81\x30\x03\x7b\xc1\xc0\xea\
+\x29\x20\xa0\x00\x16\xf2\x30\x69\xdc\xb2\xc0\x29\x18\x30\xf8\xdb\
+\x83\x3c\xf9\x69\x3f\xed\x5f\xbc\x22\x1a\xab\xac\xae\x76\x09\x7c\
+\x14\x23\x28\x91\x60\x93\x71\x8a\xcf\x84\x8a\x11\x04\x62\x46\x10\
+\x66\xb9\x24\xac\x80\x1d\x2d\x9a\xcd\xc2\x8f\x08\x6c\xba\x04\x80\
+\x64\xcc\xb4\x20\x9f\xc9\x43\xa2\x3f\x35\x40\xbe\xdf\x47\xe3\x8d\
+\x4b\x66\xb7\xce\x6a\x88\xa0\xfe\x9a\xe8\x2d\xdc\x51\x2a\x0d\x4d\
+\x51\x90\x44\x41\xdf\x4b\x11\x00\x02\x08\x02\x40\xb3\x4d\x24\x40\
+\xcf\x6d\xdb\xf5\xde\x64\x92\x88\x97\x08\x92\x63\x39\x18\xbe\x95\
+\xed\x23\xdf\x7d\x4c\x77\xd5\xce\xad\xea\x6c\x5c\x56\xef\x7a\x8e\
+\xe0\x54\x13\xc9\x46\x53\x68\x69\x0e\xa1\x51\x2e\x67\x11\xba\x2e\
+\x67\x11\x77\xd8\x23\xf3\xa8\x0c\xee\x9a\x09\x7f\xde\xca\xc0\xfd\
+\xb1\x62\x07\xf9\x76\x37\x69\xf6\x07\xb4\x4b\x8b\x9f\xa9\x0f\xe9\
+\x55\x38\x1e\x54\x45\x82\x4b\x12\x45\x00\x33\x97\x44\x8c\x52\x39\
+\x8f\xb8\x0b\x8c\x04\xdc\x66\x72\x44\x08\x12\x69\xb6\x1b\x91\x91\
+\x2d\xc0\x40\x7f\x36\x63\x18\xec\x65\x39\x2a\xbe\xd9\x45\xba\xe6\
+\x47\xab\xb6\x36\xc6\x22\xee\x70\xd3\x30\x0f\xaa\x20\x70\xab\x64\
+\xf0\x4e\x1e\x3e\xea\xbc\xfd\xd8\xbd\xf1\xc9\xce\xb9\xb0\xb0\x5e\
+\x75\x89\x6c\x2e\xe5\x13\x04\xb7\x13\x28\xcf\x70\xf1\xd8\x2b\xfb\
+\x79\x9b\x24\xf8\x7a\x27\x69\xd1\x75\xe5\xc4\xa2\x25\xe1\x68\x4d\
+\x7d\x08\x3b\x59\xf5\xe4\x21\x42\x1a\x5a\x86\x74\x23\x90\x77\x02\
+\xae\x0d\xdb\x86\xe0\xf4\x81\x06\x8c\x06\xa5\x13\x11\xa1\x74\xe3\
+\xf7\xb1\x7a\x06\x8d\x44\xb1\xc0\xb7\xac\x39\xc8\xaf\x7a\xe3\xfa\
+\xc2\x07\xa4\x3d\x3c\x53\x3d\xbc\x30\x56\xad\x85\x23\x3a\x02\xa3\
+\xfb\xa4\x94\x03\x52\x9e\xbb\x25\x89\x44\x1e\x90\x44\x12\x09\x13\
+\x04\x58\xc2\xa9\x89\x22\x24\x06\x0d\x2b\x95\x76\xb6\xaf\x3d\x04\
+\x0f\xc7\xb5\xd7\x48\xdb\x48\xc7\x8c\x99\xea\xde\x27\xa2\x7e\xad\
+\xa6\xce\xef\xd6\xbf\x20\x01\xf2\xf0\xa4\x00\x97\xe6\xf6\x05\xe7\
+\x2e\x01\x26\x14\xee\xdc\x29\x58\x13\x29\xbe\xe7\xcd\xcf\xf8\xe3\
+\x17\x4e\x79\x9d\x7b\x1f\xda\x75\x9d\xee\x98\x37\xcf\x17\xad\x6f\
+\xf0\x41\x20\x88\x72\xe1\x1f\x97\x87\xb9\xdc\x05\x01\x91\x04\x0c\
+\x72\x39\x0b\xee\xdd\x35\xe1\xaf\xbb\x56\xc2\x28\xf0\x43\xeb\x8f\
+\xc0\xf4\x57\x66\x79\x9d\x69\x07\x79\xe9\x87\x82\x74\x63\x24\xa2\
+\x86\x30\x2a\x08\x85\x14\xf0\x07\xa8\xac\xd4\x82\xe1\x40\x1a\x2f\
+\x97\x09\x9c\x9e\xc9\xa4\x93\xc9\xe5\x58\x0f\x9e\x3f\xb5\xe1\x28\
+\xfc\xff\xa5\xff\xcf\xd5\xd3\x06\x62\xd2\x89\x19\xbd\x12\x6d\xda\
+\x9f\x2d\x6f\x75\xc1\xb4\x3f\x5b\xfe\x06\x16\xde\xca\x45\x63\xa3\
+\x6b\xef\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\xdd\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xa4\x49\x44\x41\x54\x78\xda\x63\x64\xa0\x31\x60\x1c\
+\x70\x0b\xa4\x2a\x5e\xb1\x01\xa9\xe9\xcf\x3a\xc4\x92\xa9\x6e\x01\
+\xd4\xf0\xf3\x40\xac\x05\xb4\x80\x2c\xdf\xe2\xd4\x24\x59\xfa\x0c\
+\x68\x38\xe3\x25\x5d\x75\x4e\xf5\xcb\xb7\xbe\x31\x3c\xef\x92\xa2\
+\x9e\x05\x12\x45\x8f\x80\x86\xff\xbf\xa6\xa9\xcc\xa5\x2c\x2f\xc5\
+\xc9\xb0\xe3\xf0\x3b\x86\x17\x7d\x72\xd4\xb1\x40\x2c\xef\x0e\x1b\
+\xc3\x7f\x86\x5b\xc6\xda\x7c\xf2\xaa\x72\xdc\x0c\xdf\x7f\xfe\x65\
+\xd8\xb8\xff\x15\xc3\xab\x49\x2a\x8c\xa6\x3d\x8f\xb4\x4f\x97\xc8\
+\x5d\x25\xdb\x02\xd1\xcc\xeb\x20\x97\xdf\xb1\xd4\x17\x92\x0d\xb5\
+\xe0\x67\xb8\xfa\xea\x0f\xc3\xb7\x1f\xff\x18\xd6\xec\x7d\xce\xc0\
+\xc9\xc9\xcc\xf0\xe7\xcf\x7f\x86\xaf\x5f\xff\x90\xe7\x03\xe1\x94\
+\xf3\x9c\x40\xee\x5d\x17\x0b\x31\xc9\x3c\x17\x61\x86\xbd\x77\x7f\
+\x82\xc5\xbf\xfe\xf8\xcb\x70\xea\xde\x57\x06\x66\x26\x06\x06\x21\
+\x2e\x26\x06\x52\x52\xf6\xde\x63\xaf\x20\xaa\x05\xe3\x4f\xf0\x00\
+\xa9\x3b\x3e\xb6\xd2\xe2\x75\x01\x12\x0c\x1b\xaf\x7c\x87\x5b\xff\
+\xf9\xdb\x1f\x86\x13\xf7\xbf\x31\xf0\x71\x30\x33\xf0\x73\x30\x01\
+\x43\xef\x3f\x9a\xd7\x41\xac\xff\x70\xde\x7f\x24\xb9\xb5\xbb\x1e\
+\x33\x30\xf2\x47\x1e\xe0\x07\x0a\xdd\x89\xf1\x51\x16\x29\x72\x17\
+\x67\xd8\x71\xfd\x1b\x5c\x39\x48\xe1\x27\xa0\x05\x57\x5e\xfe\x62\
+\x90\xe1\x67\x61\xe0\xe5\x60\x82\x1b\xc4\xc4\x88\xec\x93\xff\x48\
+\x16\x31\xc2\x45\xba\x16\x5c\x63\x60\xe4\x0d\xde\x79\x4d\x56\x43\
+\x56\x93\x47\x00\xe8\x09\xc6\xff\x28\x2e\xfa\x0f\x64\xff\xf9\xf1\
+\x8b\x41\x80\x9f\x83\x41\x98\x9b\x89\x81\x54\xb0\x73\x1b\xd0\x02\
+\x6e\xbf\x8d\x1e\x40\xf6\x46\x09\x65\x19\x36\x3e\x11\x41\x84\xff\
+\xfe\x43\x2c\xf9\xf3\xeb\x37\x03\x1b\x37\x07\x94\x0b\xb4\xf2\x3f\
+\x23\x03\x10\x01\x95\x41\x1c\x03\x0e\x32\xb0\x00\xd4\x71\x20\x85\
+\x50\xee\x8d\x63\x57\x20\xc6\x71\x7a\xac\x02\x5b\x22\xa6\x2c\xc7\
+\xc6\x27\x2a\x84\xe2\xe9\x3f\x3f\x7f\x31\xb0\x02\x2d\x40\x0f\x60\
+\x90\x01\x60\x2e\x23\xdc\x2d\x70\x36\x23\x34\x10\x6e\x1e\xb9\x80\
+\x88\x2b\x76\xe7\xc5\x1e\x40\xde\x46\x31\x15\x25\x36\x1e\x61\x21\
+\x78\x20\xfd\xfc\xf4\x85\x81\x4b\x90\x0f\x35\xd1\x31\x42\xa2\x9a\
+\x11\xea\x78\x28\x01\x0f\x5d\x46\xa8\x17\x6e\x1d\x3a\x83\x9a\xe6\
+\x58\xed\xe6\x00\x2d\x61\xdc\x28\xaa\xaa\xca\xc6\x25\x24\x08\x56\
+\xfc\xf9\xc5\x2b\x86\xb7\x0f\x1e\x41\x83\x07\x1a\x3b\xa8\x09\x07\
+\xe1\x7c\x98\x17\x91\xa2\x12\x23\x51\xb3\x58\x4d\x03\x5b\x22\xa2\
+\xa6\xc1\xc6\xc8\xc4\xc2\xf0\xe3\xc3\x07\x86\x8f\x4f\x9f\x30\xfc\
+\x3b\x91\x49\xbd\xb2\x88\xc9\x6c\xa2\x0f\x03\x23\xd3\x3a\x6e\x31\
+\x69\x56\x16\x76\x76\x86\x8f\x0f\xef\x31\xfc\x3b\x9d\x4b\xdd\xd2\
+\x94\xd1\x78\x42\x34\xd0\x27\x0b\xb8\x25\xa4\x59\xbe\x3e\x7f\xcc\
+\xf0\xff\x6c\x21\x75\x2d\x00\x03\xc3\x9e\x30\x60\x84\x2d\xf9\xff\
+\xff\x1f\x2b\xc3\x85\x52\x1a\x58\x00\x02\x06\x5d\xfe\x40\x55\xa9\
+\x0c\xe7\xcb\x7c\x68\x63\x01\x08\xe8\x77\xca\x30\x5c\x2c\x7f\x42\
+\x3b\x0b\x28\x00\x34\xb7\x00\x00\x17\xe7\xe4\x02\x1c\xb0\x39\x17\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x5b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x22\x49\x44\x41\x54\x78\xda\xb5\x96\x6d\x4c\x5b\x55\
+\x18\xc7\xff\xa7\xf7\xf6\x85\xb5\x74\x2d\x53\x06\xa5\xad\x56\x81\
+\x31\x60\x38\x64\x71\x91\x88\x4e\xa5\x62\x4c\x64\x86\x25\xcb\x92\
+\x29\xd9\x16\xbf\x99\x45\x63\x62\x8c\x89\x1a\x5f\x3e\xe8\x17\x8d\
+\xd3\x39\xfd\x60\x5c\xfc\xa2\xd9\x67\x13\x33\x13\x4c\x7c\x8d\xe0\
+\x12\x1d\x0b\x8c\xb1\x02\x6e\x94\x52\x6e\x69\xb9\x85\xbe\x97\xb6\
+\xc7\xe7\xdc\x83\x33\xc6\x37\x60\xf3\x24\x37\xe7\xf4\xb9\xe7\x3c\
+\xbf\xe7\x3c\xff\xe7\xb9\x29\xc3\xff\x3c\xd8\x7a\x37\x56\xf6\x62\
+\x10\x61\x9c\x30\x7e\xf8\xb0\xdf\x34\x82\x6f\x6f\x18\xa0\x14\x84\
+\x05\xa1\x9a\x8c\xa2\x58\x55\x54\x80\xb2\x1e\x9b\x55\x93\xe5\x5b\
+\x6e\x18\xa0\xd0\x81\x97\xcc\x6c\xe7\x6b\xec\x85\x67\x80\x6c\x06\
+\x95\x53\x1f\xa1\xc4\x2e\x06\xad\xe7\x30\x74\xdd\x80\xfc\x83\x50\
+\xf9\x78\x75\xd6\x76\xe8\x80\x19\x7e\x1f\x9d\xa0\x23\xa7\x3f\x43\
+\x36\x32\x13\xb6\x27\xca\xfe\xeb\x06\xa4\x77\xb3\xe7\xab\xd4\xd6\
+\x37\x4d\xc7\x0e\x03\x4b\x09\xc0\x5d\x03\x54\x3b\x51\x7a\xef\x7d\
+\x14\x30\x79\xbf\xe3\x1c\xff\x7a\xd3\x80\x95\x20\x33\xf1\x0b\xb6\
+\x9c\xb3\xb7\xd7\x82\x96\x26\x19\xbd\xd3\x09\x28\x2a\xf0\xce\x07\
+\xd0\x97\x22\xd1\x9a\x04\xf7\x6c\x1a\xb0\xd4\xc5\x9e\xaa\x36\xb5\
+\x9d\x54\x0f\xf6\x13\x6d\x05\xec\xf5\x93\x86\x9d\xbf\x7c\x9c\x94\
+\x2f\xa1\xf8\xe5\x10\xd2\xea\xd4\xbe\x6d\x23\xfc\x9b\x0d\x03\x12\
+\xbd\x8c\x95\x2e\xa8\xd9\xda\x8e\x4e\x1b\x1e\x0e\x02\xa9\x14\xd8\
+\xab\xef\x4a\xc0\x73\x4f\x92\xf2\x45\xe0\xf3\xaf\x10\xcb\xce\x47\
+\xb6\x6b\xdc\xbb\x61\x80\xb6\x87\x1d\xdd\xaa\xb6\x7f\x6c\x7d\xe2\
+\x10\x45\xbf\x4c\x0e\x0b\x60\xaf\xc8\x36\xe0\xc7\x06\xae\xed\xcb\
+\x9d\x1f\x45\xd2\x3c\xd3\xe3\x19\xe1\xdf\x6f\x08\x10\xde\xae\xa4\
+\xbc\x9e\xdb\x1c\x38\x72\xd8\x70\x8e\x62\x11\xec\xc5\xb7\x24\x60\
+\x70\xbf\xb4\x95\xca\xc0\x2f\x13\x98\xcb\x47\xe6\x7c\xf3\xdc\xb7\
+\x6e\x40\xf8\x2e\x76\xd0\x5d\xd9\x71\xc6\x3e\xf0\x28\x85\x98\x03\
+\x54\x12\x35\x9f\x07\x7b\xe3\x43\x09\x38\x10\x34\x34\xc0\xdc\x02\
+\x50\x65\x43\x26\xab\x23\x6e\xbd\xba\xf7\xd6\x1f\xf9\x4f\xeb\x02\
+\x84\xea\xd9\x72\xa3\xb9\xce\x89\xc7\x1f\x03\x6c\x36\x6a\xae\x2c\
+\xa5\x89\x34\x38\xf5\xa9\x04\xf4\xdc\x49\x36\x02\x57\x38\xbd\xb7\
+\x00\xf3\x71\x4c\x57\xa2\x57\x1a\xc3\x3c\xf0\x9f\x80\x99\xbb\x59\
+\x9f\x3b\x17\x38\xeb\x7a\xa4\x4f\xa6\x41\x51\x28\x7a\x9a\xb5\x18\
+\xd8\x99\xb3\x12\x70\x47\x33\xb0\x4a\x37\x30\x99\x00\x8b\x99\x0c\
+\x1c\xa9\x72\x1a\xda\x96\xc8\xee\xa6\x61\x3e\xfa\xaf\x80\x09\x1f\
+\xd3\x76\x58\x7c\xb5\xac\xff\x01\x19\x7d\x3a\x03\x2c\xaf\x50\x94\
+\x1a\xd8\xd0\xb0\x04\xdc\xee\x95\x8e\xcd\xaa\x84\x88\x8a\x4a\x65\
+\x31\xa9\xc6\xa6\x5b\xae\xf0\xc6\x7f\x04\x84\xba\x59\xb7\x53\x6f\
+\xf8\xa1\xf6\xa1\x35\xe7\xc2\xb1\x48\x45\x2c\x0e\x44\x17\xc1\x46\
+\x2f\x4b\x40\x2d\x75\xb3\x4a\x37\x53\x4c\x86\x06\x28\x97\x8d\x5b\
+\x24\xed\x15\x2c\xd8\x17\x76\xed\x1c\xe6\x63\x7f\x0b\x18\x0b\xb0\
+\xab\xad\x55\x01\x3f\xeb\xbb\x97\xba\x2c\x29\xa3\x8f\xd1\xe7\x41\
+\x5f\x31\x00\x46\xd5\x94\xe9\x73\x5a\xa9\xac\x9d\x66\xf2\x11\x82\
+\x0b\xd0\x56\x07\xc6\x4d\xd1\x89\xf6\x19\xde\xfa\x17\xc0\xe5\x7b\
+\x58\xa7\x35\x7a\xf3\xcf\xfe\x81\x7e\x19\xb1\xb6\x28\x9d\xc6\x96\
+\x08\x44\x22\x73\x18\x51\x1a\xa2\x8a\x59\x8c\x74\x4e\xae\x45\x9a\
+\xc4\xd8\x62\x83\xee\xb3\x23\x5a\xb5\xd0\xd4\x36\xc2\xa7\xfe\x04\
+\x18\x6f\x64\x93\x2d\x8e\xa6\x66\x53\xf7\x1e\x72\xac\x01\xd3\xb3\
+\x54\x86\x34\x17\x4b\x32\x15\x4e\x3b\x58\x58\x93\x29\xda\x47\x7b\
+\x52\x19\x09\x58\x4e\x51\x29\x17\xa4\x13\x01\x12\xb7\x50\xa3\xe7\
+\xdb\xa7\x78\xe7\x35\x40\xa8\x8b\x1d\xb7\x2e\xba\x4e\xf8\xee\xeb\
+\x61\x86\x60\x73\x51\xe0\xd7\x08\x90\x21\x07\x36\x2b\x10\x68\x00\
+\xb6\xb9\xc0\xbe\xf8\x4e\x02\x9e\x1e\xa4\xb4\x51\x77\x27\x74\x20\
+\xa2\xc9\x14\xe6\xe9\x5c\x71\x95\x20\x0c\xa9\x7a\x3b\xc2\x4a\xf4\
+\x48\xdb\x28\xff\xc4\x00\x8c\x79\x98\xde\x5a\xd7\xea\x62\x1d\xcd\
+\x46\xbd\x1b\xd1\x67\xf3\x32\xbf\xfe\x7a\x02\x50\x93\x36\xd0\x47\
+\xd3\xe5\x92\xb6\x24\xe9\x13\x5b\x94\x69\x14\xcd\xb6\x92\xa6\x75\
+\xe2\x0f\x31\xdd\x2e\x5c\x4c\xcd\x26\xdb\x34\xee\x96\x80\x7a\xa6\
+\xb7\xf8\x3b\x5c\x8a\x88\xa8\xd1\x27\x37\x8b\xca\xb8\xc9\x0d\x78\
+\x09\xe0\x25\xe7\x5e\xb2\x3b\xaa\x01\xbb\x03\x88\xc7\x80\xa9\x10\
+\x09\x37\x4d\xc5\xb0\x2c\x75\x8a\xeb\x12\x4e\x45\x50\x0e\x78\x70\
+\x29\x32\x99\x6c\xff\x1d\x70\xa9\x8b\xbd\x9d\x8b\xe2\x68\xa1\xc8\
+\x6c\x79\x1d\xb6\x92\x28\x0c\xca\x1e\x65\x1f\x62\x2d\x6a\x46\xac\
+\xc5\xac\xac\x3d\x42\x56\x95\xf4\x55\xe9\xbd\x59\xcc\x24\xb6\x4a\
+\x67\x2c\xd5\x7c\xd5\x6c\xe5\x19\xa5\x0e\xa7\x77\x8d\xf2\x67\xd7\
+\xfd\xaf\x62\xb3\xe3\x37\x70\x3d\xb8\x28\xff\x40\x70\x84\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xf5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xbc\x49\x44\x41\x54\x78\xda\xb5\x95\x5b\x68\x1c\x55\
+\x18\xc7\xff\xbb\xb3\xe9\x26\x9d\xd9\xd9\xed\xa6\xc9\x4e\x86\x8d\
+\xc9\xa6\xdd\x56\xd2\x06\x84\x3e\xb4\x22\x15\x1f\x7c\x10\xa5\x41\
+\xbb\x85\x78\x79\x90\x58\x10\x44\xd1\xa0\x52\x7c\xf0\x51\xf0\x42\
+\x41\x11\x8a\x20\x8a\xe3\x43\x21\x0f\x1a\x51\x10\xbb\x8a\x89\xa0\
+\xd6\x52\xac\x90\x87\x84\x58\x63\x53\xb3\x6e\x66\x6f\xd9\xcb\x6c\
+\x36\x7b\x99\x99\x33\x9e\x73\x76\x1b\xb1\x36\x76\xb7\xd8\x0f\x0e\
+\xe7\x9b\x33\x67\xbe\xdf\xf9\x6e\x67\x5c\xb8\xcd\xe2\xda\xee\x45\
+\x68\x6a\xe5\xd9\xf4\x3b\x91\x33\xb7\x05\xa0\x4c\x5d\x99\x16\x7d\
+\xd2\x44\xd5\x74\xb4\xb5\x37\x42\x93\xff\x2b\x40\x99\xfa\x7d\xfa\
+\x9e\x83\xfe\x89\xd3\x0f\x07\xf0\xea\x17\x06\x66\x97\x6a\x9a\xfe\
+\x96\x7a\xcb\x10\xd7\x75\xc6\xcf\x1e\x8c\xca\x8f\x7f\x7a\x32\x88\
+\x64\xc9\xc1\x46\xcd\xc2\xeb\x5f\x95\xf1\xd3\x72\x5d\x4b\x9d\x0e\
+\xdf\x12\x64\x0b\xd0\xff\xfc\xf2\x07\xfb\xa3\x81\x93\x3d\x3d\x1e\
+\x3c\xb0\x6f\x07\x8e\x1d\xf0\x62\xb5\x60\xc3\xa8\x98\x78\xef\xdb\
+\x32\xe6\x13\x35\x2d\xfd\xf6\x70\xc7\x90\x2d\x80\xf2\xd2\xea\xd2\
+\x68\x54\xda\xef\xf1\xb8\xf9\xf3\xdd\x43\x5d\x38\x1c\x16\x90\xdd\
+\x74\x50\x2a\x37\x30\x7d\xbe\x84\xe5\x54\x5d\xcb\xbc\x1b\xed\x08\
+\xf2\x8f\x10\xdd\xf1\x4a\x42\x8f\x8e\x48\x8a\xe0\x76\xc1\x71\x1c\
+\x8c\xf6\x79\x10\xf6\xbb\xd0\xb0\x1c\x14\x8d\x1a\xe2\xbf\x18\xd0\
+\x8b\xa6\x96\x3d\x73\x67\x5b\x10\xf9\xb1\xef\xc6\xff\x95\xe4\xc1\
+\x53\xab\x1c\xe2\xa6\x8e\x38\xb6\x03\xd5\xef\xc6\x68\xbf\x07\xc5\
+\x4d\x1b\xab\x99\x4d\x5c\x5c\x30\x50\xaa\x98\x5a\xee\xfd\xb1\xc9\
+\x9b\x19\x27\x8d\xda\xcc\x0d\xcb\x74\xf0\xe5\x2b\xfa\xde\x11\x59\
+\x61\xba\x43\x08\x64\xaf\x0b\x7b\x7a\x05\x14\x2a\x36\x56\xf4\x0a\
+\x2e\xaf\x94\x50\x6f\x58\x5a\xfe\xc3\x43\x37\x84\xc8\x8f\xce\x8d\
+\xc3\x36\x67\x68\x14\x84\x6d\x1b\x2d\xfc\xe2\x6f\xfa\x48\xc4\xaf\
+\xd0\x58\x81\x50\x88\x87\xee\x1c\xda\x25\x20\x5f\xb6\x70\x35\x55\
+\x46\xf2\x4f\x83\xc2\x6d\xad\xf0\xf1\x91\xc9\xeb\x8d\xbb\x89\x39\
+\x73\xdf\x5d\x8a\x30\xfb\x73\x72\xfb\x4e\x66\xa2\xbe\xb0\xa4\x47\
+\x86\xfd\x0a\xcb\x07\xb1\x09\xf7\x66\x38\xe8\xa1\x10\x13\x09\x1a\
+\xae\xf4\x5a\x9e\xad\x6b\xa5\xb3\x47\x39\x44\x9e\x98\x1d\x77\x3b\
+\xf6\xcc\x43\x47\x06\x04\xd0\xfd\x9f\x9f\x4f\xfc\x37\x80\x43\x9e\
+\x5b\xd0\x87\x86\x02\x0a\xf3\x82\x41\x08\xb1\x11\x09\x76\xe1\x72\
+\xaa\x86\x6a\xa5\x8e\xb4\x9e\x03\x35\xa6\x51\xfa\xac\x00\xf2\xd1\
+\x23\x47\xc3\xc2\x0e\x10\x64\x8c\x06\xbe\xbe\x98\xbc\x39\x80\x89\
+\xf2\xcc\x7c\x32\x3c\xe8\x57\x09\x71\x68\xe2\x09\x6c\xdb\xc6\xc8\
+\x6e\x0a\xd1\x6b\xa8\x55\x1b\xc8\xae\x65\x20\xee\xec\xc6\xf1\xc3\
+\x7d\xe8\x16\x80\x6c\x89\xae\x51\xc0\xf7\xf3\x6d\x02\x98\xf4\x3f\
+\x7d\x29\xa9\x86\x03\x2a\xf7\x82\x43\x08\xf6\x50\xc8\xaf\x6b\x55\
+\x96\x0b\x1c\x1b\x13\x31\x4c\x9f\x17\xae\x6e\x70\xc0\x3a\x0d\xe3\
+\xa5\x45\xbd\x7d\x00\x93\xbe\xa7\x2e\x24\x15\x35\xa8\xda\x96\x4d\
+\xa3\xd2\x04\xed\x0b\x79\x31\xa6\x08\x38\x14\x11\xf1\xc3\x62\xa1\
+\x69\xdc\x68\x02\x16\x97\x53\x9d\x01\x98\xf4\x3e\xf9\x63\xb2\x7f\
+\x60\x97\x6a\x99\x36\xaf\x2e\xe6\xc5\x6b\x31\x15\x9f\x5d\x48\x73\
+\xe3\x39\xc3\x44\x8e\xce\xf9\x0d\x13\x7f\x24\x32\x9d\x03\x98\x04\
+\x9f\x98\xb3\x7b\x43\xbb\xdd\x96\x65\x71\x2f\xf6\xd2\x8e\x3f\x10\
+\xea\xe2\x71\xcf\x52\x40\x9e\x8e\x22\xbd\xc3\x52\xa9\x6c\xe7\x00\
+\xdf\x89\xf8\x29\x5f\x40\x7e\xd3\x4b\x93\x6a\xb7\xf2\xc1\x3a\x7e\
+\x80\x76\xfc\x80\xcf\xc5\x8d\xb3\xd3\x1b\x15\x0b\xf9\xf5\x5c\x67\
+\x00\xe9\x44\x3c\x26\xf9\xc4\x4f\x7a\x7c\x62\xd3\x38\xad\x2a\x62\
+\xd9\x7c\x66\x3d\xe2\xef\x06\x44\x0f\xbd\xb7\x18\xa0\x6a\x63\xb3\
+\xb8\xde\x3e\x40\x8a\x9d\x7b\x50\xf4\x89\x5f\xee\x94\xa5\xd6\xc9\
+\x9b\x25\xcb\xfb\xa3\x35\xd8\xba\x97\x96\x29\x28\x94\xfd\x4b\xac\
+\x4a\xa1\x3d\x80\x74\xfc\xdc\xfd\xa2\x2c\x7e\xc3\x8c\x6f\x95\x29\
+\x69\x41\x5a\x86\x19\x80\x85\x8a\xd0\xae\x77\x51\x9d\xde\x55\x40\
+\xb5\x0d\x80\x2f\x16\xbf\xb7\x5b\xea\x99\x93\xfc\xb2\x9b\xd0\x06\
+\x23\xf6\xdf\xa7\x65\x00\x6e\x98\xb4\xc2\xc5\xf5\x26\x84\xe7\xa6\
+\xd2\x46\x88\xa4\x58\xbc\x4e\x77\xd3\xee\x6f\x96\x25\xd8\x70\xae\
+\xe9\x0e\xd7\x1d\xbe\x46\xbd\x71\xd8\x7c\x4d\x77\xf8\xf7\x7f\x01\
+\x48\xac\x3b\xdc\xef\xc3\x26\x3e\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x04\x34\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xfb\x49\x44\x41\x54\x78\xda\xad\x94\x0d\x4c\x13\x67\
+\x1c\xc6\x9f\x3b\x28\x95\x56\x3e\xca\xc6\x47\x01\x45\x8a\x1d\x28\
+\x41\x47\x56\x17\x93\xa1\xe8\x1c\x9b\x26\xfb\xc8\x34\x6c\x6c\xc6\
+\xd8\x64\xcb\x88\xba\x64\x26\x9d\xc9\x9c\x38\x21\x63\x8b\x8b\x32\
+\x48\x96\xb9\xe0\x56\x75\x26\x3a\x31\x53\xc7\xc0\xcc\x18\xc9\x2a\
+\xab\x95\x01\xa5\x51\x4c\x54\xc0\x82\x34\x32\x28\xd0\x2b\x57\x7a\
+\xb4\xd7\xf6\x6e\xaf\x37\xd7\xcd\x6d\x91\xc2\xf8\x27\x77\x6f\xee\
+\xbd\x7b\x9f\xdf\xdd\xf3\x3e\xf7\xa7\x30\x8b\x0a\x99\xa1\x23\xc3\
+\x8b\xe4\x58\x03\x11\x05\xa0\x40\x06\x74\x93\xc1\x44\xe6\x9a\xa3\
+\x8a\xd0\xf9\xe7\xb3\xd4\x4c\xc5\xf9\xcb\x28\x87\x3c\xc3\x20\x26\
+\x16\x69\xa3\xd4\x3b\x40\x29\xf2\x10\xe0\xac\xa0\xbc\xb7\x00\xb6\
+\x0d\x94\xdb\xdc\x0b\xff\xbd\x9a\x98\x62\xd4\xcf\x18\xc0\xb5\xa0\
+\x9c\x8a\x5f\x56\x83\xb4\x32\xa5\x3c\xfd\x3d\xf0\x53\x56\xe9\xd5\
+\x1f\x2a\xc6\x0c\x71\xe4\x94\x17\x9e\xeb\x86\xd8\x67\x51\x1f\x31\
+\x80\xbd\x08\x1d\x3d\x4f\x7d\x92\xce\xda\xa6\x95\xa7\x6f\x47\x60\
+\xca\x86\x3b\x1d\x17\xd1\x6f\xfb\x19\x4e\x7b\x37\x52\x34\x05\xc8\
+\x2e\x5c\x8b\xc5\x2b\x9e\x87\xc0\x5c\x45\x68\xe0\xab\x5e\xc1\xff\
+\xdb\x9b\x11\x03\x98\x9f\x50\x19\xad\x7e\x65\x9f\x22\xff\x30\x82\
+\x5c\x07\x06\xba\x2e\xe1\x8e\xe5\x84\x3f\x4e\x31\x79\x4a\x46\x4f\
+\xed\x0d\x84\x62\x3f\xf6\x70\xf3\xcb\x72\x8a\x36\xcb\x17\x15\x3e\
+\x07\xbe\xff\x6b\x04\x87\x1a\xab\x22\x06\x8c\xfe\x08\x93\x22\x7f\
+\x4f\xb1\x5c\xfd\x3a\x42\xfe\x1e\x58\xcf\x54\x83\x19\xec\x46\x7c\
+\x4a\xba\x2f\x56\x36\xd5\xa8\x2b\x1f\x2b\x6b\x3f\x14\x7b\x2c\x18\
+\x93\xbb\xf5\xa9\x4d\x15\x08\x32\x36\x78\x6f\x7c\x72\x39\x62\xc0\
+\xd0\x59\x8c\x27\x97\x58\x92\x04\xde\x4e\x7c\x17\xe1\x63\x87\x20\
+\x0a\x22\x98\x81\x76\x8c\xf5\xb5\x42\xa1\x10\x1b\x44\x7e\x7c\xd7\
+\xc4\x64\xcc\xa0\x6e\xcb\x11\x08\x3c\x0b\xc6\xb2\xdd\x15\x31\xe0\
+\x6e\x03\xc6\x53\x56\x1d\x4c\xa2\x65\x71\x04\x40\x49\xe9\x10\xa5\
+\x94\x88\x70\xf5\x34\x63\x72\xd8\xea\x13\xfd\xae\x06\x59\x7c\xce\
+\xd6\xcc\xb5\x46\x04\x26\xae\xc0\x69\x36\x44\x0e\xe8\x3b\x01\x53\
+\xca\x93\xe5\xc5\xf3\x92\x96\x10\x7d\x11\x54\x38\x80\x22\x42\xdc\
+\x30\xdc\xd7\x0e\x00\xb2\x04\xbf\x72\xe1\x06\xb9\x32\xb7\x1a\xde\
+\xbe\xcf\xe0\xb4\xd5\x47\x6e\xd1\xcd\x63\x38\x9a\xb6\x7c\xb3\x5e\
+\x99\xb2\x54\xba\xa6\x28\xc9\x29\x09\x23\xf0\xa3\x08\x0d\x9f\x07\
+\x9d\xb0\x0c\xb2\xec\xfd\x08\xb9\x4e\x63\xec\xf6\x79\x4c\xdc\xb5\
+\x44\xb6\xc9\xd7\x0f\x43\x9f\xb4\x68\xc5\x91\xd4\xbc\x92\xb0\x37\
+\xc4\xa5\xb0\x4d\xf7\x4f\xf7\x81\x74\xdc\x2a\x08\x9e\x5f\xe0\x71\
+\xf6\x60\xe4\xe6\xa5\xde\x00\xe7\x9e\x3e\xa6\x9d\x5f\x42\x9f\x9c\
+\x5d\x68\xcc\x5c\x59\x49\xb3\xfd\xc7\x31\xff\xb1\xcc\xbf\x29\xff\
+\xb3\x44\xb0\x23\x76\x8c\xda\xbb\xbc\x93\xae\x21\x83\x6e\xc7\x34\
+\x3f\xda\xd5\x5a\xe8\x53\x73\xf2\x8d\x59\xcf\x54\xd2\xce\x6b\x75\
+\x48\xce\x5a\x42\xc4\xff\xd8\x5a\x81\x24\x28\xe8\x9b\x04\x1d\x15\
+\x2d\x7d\x0d\xc7\x8c\x63\x62\xd4\x01\xf7\xf0\x60\x2f\xcf\x79\x6a\
+\x56\xee\x9c\xa6\x55\xb4\x1e\x80\x5e\x9d\x93\x6b\xd4\xac\xfe\x88\
+\x1e\xb6\xd5\x41\x99\xa8\x0a\xdf\xf3\xba\x19\x38\x6e\xdd\x00\xef\
+\x9b\x72\x90\x4b\xe5\x83\xe9\x6e\x3c\x68\x76\xab\x77\x4d\xd3\xec\
+\x5a\x3e\x85\x3e\x63\xb1\xc6\xa8\x5d\xb3\x97\xbe\xd7\x55\x8b\xd4\
+\x8c\x74\x98\x9b\x2e\xfc\x65\x84\x88\xdb\xc4\xf3\xf5\xc4\x11\xc7\
+\xba\x3d\x08\x3d\xca\x85\x7f\x01\x2e\x54\x41\xbf\x50\xbb\xc0\x98\
+\xb7\xae\x82\x76\x74\xd4\x20\x43\x93\x89\x20\x1f\x84\xa9\xb1\x15\
+\xeb\xf7\xcd\xbc\xfb\x3e\xb4\xa0\xa9\x02\xfa\xec\x27\xd4\xc6\xa5\
+\x25\x1f\xd2\x83\xed\xb5\x58\xa0\x49\x96\xe6\x39\x2f\x0f\x53\xb3\
+\x0d\x2f\x55\xff\x0f\xc0\xb9\x0f\xa0\xd7\xe4\x3e\x6e\x2c\x78\x61\
+\x37\x3d\xd0\x56\x8b\xac\x1c\x95\xb4\x9f\x7e\x7f\x10\x57\x5a\xfa\
+\xc1\xb2\xbe\xb7\x37\xee\x87\x71\x56\x80\xd3\xef\xe3\x35\x6d\x5e\
+\xc2\x77\xcb\x37\xec\xa6\xed\x96\x1a\xa8\x54\x72\x29\x19\xa2\x00\
+\x58\xdb\x9c\xf0\x4c\xf0\x86\xd2\x83\xf8\x7c\xa6\xe2\x12\xe0\xe4\
+\x4e\x44\x91\xd1\xff\xf2\xc6\xb4\xa8\xce\x5f\xdd\xd0\x3d\x9d\x80\
+\xa6\x73\x23\xe1\x98\x13\x4e\xe5\x1b\x75\xa8\x9a\x8d\xb8\xb4\xfe\
+\xf8\xbb\x88\x23\x22\xec\xab\x9b\x54\x50\x28\x69\x78\xbd\x02\x7e\
+\x38\xcb\x60\xcb\x17\x33\xf7\xfb\x3f\x01\x47\xb7\x81\xb4\x47\xb0\
+\xa5\xa5\x4a\xd2\x72\x29\x78\x39\x01\x67\xbe\xe7\xa0\x3f\x34\x47\
+\x80\x6f\xde\x21\x00\x0a\xac\x2a\x91\x42\x34\x31\x2b\x48\x52\xed\
+\x66\xc4\x6f\xdf\x22\xfd\x67\x4e\x00\x73\x21\xf2\xa8\xfa\x1d\x19\
+\xfe\x9c\x56\x87\xba\xa2\x97\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x05\xfe\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xc5\x49\x44\x41\x54\x78\xda\x8d\x55\x6b\x6c\x14\x55\
+\x18\x3d\x33\xfb\xea\xee\x76\xdb\x52\xa1\x0f\x5a\x30\x85\x5a\x0a\
+\x05\x5c\xaa\x88\x44\xe5\x21\x22\x8f\x84\x42\xb1\x14\x82\x94\x82\
+\x08\x62\x0c\x02\x89\x3c\x12\x7f\xe8\x0f\x45\x2a\x68\x11\xc1\x02\
+\x01\x63\xf4\x87\x31\x91\x88\xc4\x40\x15\x85\x12\x54\x42\xc1\x4a\
+\x41\xfa\x7e\x6e\x5a\xfa\xa0\xaf\x7d\xef\xce\xce\xcc\xf5\x9b\xbb\
+\xed\xda\x26\x25\x78\x27\x93\x99\x7b\xef\xcc\x39\xdf\x77\xbe\xc7\
+\x15\xf0\x90\xb1\xe5\xde\xd3\x36\x15\x4a\xb6\x49\xb0\xac\x8a\xd2\
+\x59\x96\x1b\x45\x73\x5a\xbc\x31\x41\x50\x54\x05\x9d\x9e\x76\x26\
+\x29\x52\xb3\xcb\xef\xbe\xe0\x0d\x7a\x7f\x84\x22\xdc\x3e\xbf\xa8\
+\x7a\x60\x34\x1c\x61\xb4\xc5\xc2\x7f\xec\xcb\xac\x3a\xdb\xce\x49\
+\xb6\x69\x4b\xd2\x6c\x53\x30\xc1\x3a\x09\xd1\xba\x58\x28\x83\x97\
+\x48\xbf\x0d\xc8\x3d\x68\x75\x36\xa2\xbe\xa7\x06\xd5\x5d\x55\x57\
+\x07\xbc\xce\xa2\x4b\xcb\x9b\x2e\x3e\x92\xa0\xf0\x6e\x76\x51\xba\
+\x6d\xda\xee\xb9\xe3\x5e\x32\x24\x5b\x1e\x87\xcc\x14\xf8\x64\x1f\
+\xc8\x62\x28\x4c\x86\xca\x54\xa8\x82\x0a\x9d\x20\x40\xaf\xd3\x43\
+\xa7\x03\x3a\xdc\x6d\xb8\xda\x70\x39\x54\x75\xbf\xba\xf8\x72\x4e\
+\xd3\xbe\x87\x12\x6c\xba\xf3\x54\xc9\xcc\xf8\x67\xb7\xbf\x98\x9c\
+\x43\x33\x11\xce\xa0\x1b\xb2\x2a\x47\x80\xf9\x13\x8c\x6e\x85\xe6\
+\xe4\x0b\xdd\xa0\xb9\xd9\x18\x05\x83\x91\xe1\xb7\xaa\x5f\x71\xa3\
+\xb1\xfc\x44\xd9\xea\xa6\x37\x47\x10\x6c\xb8\x95\x4d\x5e\x2b\x07\
+\x67\x25\x3c\xb7\x67\x71\xea\x4a\xb8\xa5\x20\x48\x5b\x02\x52\xc3\
+\xc0\x1c\x50\xe5\xa0\x1a\xbc\xe6\x95\xf6\xae\xed\x80\x09\x90\xe9\
+\x92\xd4\x00\x62\xac\x26\x5c\xab\xb9\x8a\xf2\x9a\xdb\x87\x54\x99\
+\xed\xbf\x59\xd8\xa6\x72\x82\xfc\x1b\xd3\x96\x64\xc6\xcf\x3c\x9b\
+\x9b\xbe\xd1\xea\x0d\x04\xe1\x0a\xfa\xc0\x86\x01\x2b\x90\x23\x04\
+\x1a\xa9\x32\x48\x20\xd0\xe5\x54\xfa\xd1\x16\x68\x42\xb7\xdc\x01\
+\x91\x89\x48\x89\x1b\x87\xea\xea\x06\x6f\x6d\x7d\x5b\x5e\xe5\xeb\
+\x1d\xa5\x42\xfe\xf5\x19\x31\x66\x83\xb9\x74\x5d\xe6\xb6\xb9\x63\
+\x8c\x49\xe8\xf2\xf4\x12\xe5\xa0\xe5\x11\x40\x79\xc4\x9c\x7b\xc2\
+\x18\xda\x83\xad\x70\x04\x1b\x90\x69\xb1\x23\xd1\x98\x8a\xb2\xfe\
+\x9f\x20\xeb\x82\x88\x11\xa2\x50\x51\x5e\x77\xc5\xed\xf6\xe7\x08\
+\xb9\xd7\xa6\xce\xcf\x4e\x9e\x53\xb6\x34\x2d\x0f\xf7\x9d\xbd\x14\
+\xcc\x10\xc9\x40\xba\xab\xdc\x7e\x0e\xc4\x7d\x51\xc3\x19\xa4\x79\
+\xa6\xe9\xde\x1c\x68\x40\xa3\xaf\x0a\x8b\xe3\x57\xa3\x20\x69\x07\
+\x4c\x62\x14\x2e\xf7\x9d\xc7\x17\x6d\x1f\x61\x4c\xb4\x15\x0f\x1a\
+\xfb\x58\x43\x7d\xfb\x02\x61\xed\xef\xb3\x8a\x57\x4c\x59\xb3\x6b\
+\xbc\x25\x9d\x5b\xaf\xc1\x85\xd4\x10\x0c\x82\x11\x7e\xd5\x17\x96\
+\x66\x98\x47\x22\xc1\xb7\x06\x1a\x71\xcf\xf3\x37\x56\x8c\x5d\x8f\
+\x6d\xa9\x7b\x23\x49\x52\x4f\x84\xfb\xea\x36\x53\x7e\x50\x86\xf9\
+\x18\xea\xef\xb6\x1f\x11\x36\x5d\x7f\xbe\xb6\xc0\xfe\x46\x46\xbf\
+\x37\x00\x0f\x69\xaf\x59\x37\xd1\x3c\x19\x4f\x58\xb2\xd0\x19\x6c\
+\x47\xb9\xb3\x8c\x07\x35\xec\x89\x4a\xf9\xdf\x87\x7b\xee\x0a\xe4\
+\x24\xac\x47\x41\xf2\x5b\x10\x84\x70\x22\x6a\xe4\xc7\x5a\x3e\x44\
+\x69\xcf\x0f\x1a\x04\x62\x4c\x66\xd4\xde\x72\xd4\x09\x9b\xff\x9c\
+\x27\xbd\x36\xfb\x6d\x43\x6d\xa7\x83\x07\xd3\x2c\x5a\x91\x9b\x58\
+\x40\x85\x65\xe3\x3f\x56\xba\xca\xf1\x4b\xcf\x39\x0e\xa0\x49\x56\
+\xef\xad\xc6\x2b\x89\x1b\xb0\x22\x71\x5d\xc4\x72\x2d\x26\xa7\x1c\
+\x9f\xe0\xdb\xf6\x33\x30\x88\x26\x4e\x60\x8e\x32\xa2\xe1\x46\x5b\
+\x48\xd8\x5b\x99\x2f\xbf\x9c\xb1\x52\x57\xdd\xd1\x02\x26\x32\x58\
+\x88\x60\x4d\xf2\x66\xc4\xe8\x63\x23\x00\x37\x9d\x7f\xe0\x62\xf7\
+\x59\xb8\x65\x17\x66\xc5\xcc\xc1\xfa\x94\xad\x91\x3d\x8d\xf6\x64\
+\xf3\x61\x7c\xdd\x76\x12\x26\x92\x55\x84\x9e\xab\xa0\x0a\x0c\xfe\
+\x56\xbf\x22\xbc\x53\x91\x27\x2f\xc8\x58\xa6\xab\xe9\x70\x40\x20\
+\x81\x25\x35\x88\x34\x4b\x06\x72\x93\x5e\x85\x51\x34\x46\x80\xae\
+\xf5\x5e\x42\x7b\xc0\x81\x75\x29\x5b\xfe\x03\x27\xcb\x4b\x34\x70\
+\x47\x09\xc5\xcc\x44\xd2\x8b\x5c\x4a\x5e\x60\x14\x87\x07\x35\x03\
+\x8a\xb0\xe1\xca\x0b\xd2\xda\x67\x36\x1a\x2a\x1d\x8d\x10\xa9\xec\
+\xb5\x6c\xf1\x29\x3e\x4c\x8d\x9e\x81\xfc\xd4\x42\x9e\x1d\xa3\x0d\
+\xae\x79\xc3\xc7\xf8\xaa\xf5\x38\xa2\x74\x56\x9e\x5d\x6c\x68\x53\
+\x23\xd1\x8b\xe8\xfc\xab\x27\x24\xac\xbc\x90\x5d\xbb\x7a\xf6\xda\
+\x8c\xa6\xee\x07\x54\x94\x6a\xa4\x05\x78\x65\x0f\xb2\x62\xec\xd8\
+\x38\x71\x1b\x01\x98\x47\x80\x6b\xdf\x14\xd7\x1d\xc0\x99\xe6\xe3\
+\x7c\x4f\x2b\x38\x36\x08\xcc\x9f\x14\x78\x25\xa4\xa0\xe7\x8e\xb3\
+\x4e\x98\xff\x5d\x7a\xf1\xc2\x19\x8b\x76\xe9\x0d\x71\x70\xf9\xdc\
+\xd0\x3e\x91\x59\xb8\x0e\xfc\xe4\xc9\xf4\x38\x3b\xb6\xa6\xed\x80\
+\x59\x67\x89\x58\x5e\x5c\x7b\x00\xa7\x9a\x8e\x92\xe6\x9a\x2c\x7a\
+\xfe\x8f\x26\x8d\xc0\x4b\x94\xf0\x49\x09\x7f\xb7\x04\x67\xbd\xe7\
+\x88\x60\xff\x32\x69\x9e\x7d\xd2\xcc\xb2\xcc\x89\xd9\x42\xe7\x40\
+\xef\xb0\x56\xa0\x22\xa0\xf8\xd1\xe2\x6d\x42\xa6\x2d\x0b\xef\x66\
+\x7d\x40\x00\x22\xbe\x69\x39\x8d\x53\x8d\x9f\x73\x70\x41\x0b\x1a\
+\xf7\x88\x45\xa4\xe1\x6f\xb4\xec\xaa\xf3\xb2\x40\xb7\xb4\x40\x78\
+\xf2\x74\x72\xb4\xd5\x64\x39\x6f\xcf\xb2\x2f\x74\x87\x54\x6e\x42\
+\x88\x3a\xa8\x27\xe4\x46\xaf\xd4\x83\x3e\xa9\x97\x7b\x13\x67\x8c\
+\x27\x6b\x75\xe8\xf2\x77\x90\x2c\x51\x61\xd0\x21\xc0\x41\xf0\x21\
+\xeb\x43\x4e\x19\xae\x6a\xdf\x15\x5a\xc8\xe1\x55\x92\x79\x6c\xec\
+\xd2\xf1\x29\x63\xbf\x97\xe3\x45\xeb\x80\x27\xc0\x35\xd6\xce\x00\
+\x6a\x94\x94\x74\x3a\x0e\xa2\x55\xb7\xf6\xd4\x6b\x92\x0c\x5a\x3c\
+\x5c\x77\xbe\x46\xdf\x6b\x9d\xc4\x5b\xe7\xf7\x4a\x7d\x72\x9e\xe7\
+\x70\xb0\x94\x13\x4c\x2f\x49\x12\x65\x49\x39\x18\x9b\x1c\xbd\xa7\
+\xdf\x1c\x80\x24\xcb\x18\x32\x8d\x0d\xf6\x74\x36\x64\xed\x30\xab\
+\x87\x13\x0d\xad\xfa\x9b\x83\x90\xba\xe4\x43\x3a\xbd\xb8\xdf\x55\
+\x14\x50\x47\x1c\x38\x93\x0f\x3f\x56\x62\x4b\xb2\x6e\x77\x59\x89\
+\x84\x64\x62\x4c\xf8\x5f\xe0\xbc\x41\xc9\x14\x33\x87\x8c\x50\x97\
+\x7c\xc2\xf7\xa9\x34\xf2\xc0\x19\x3e\x26\x1c\x88\x2d\xd2\xdb\xf4\
+\xbb\xa5\x38\xd5\x20\x9b\xc2\xb6\x21\x2c\xf7\x48\x02\xed\x8d\x8a\
+\x89\xf7\x28\x37\x35\xc8\xfb\x72\x48\xe9\x57\x8b\xfd\x47\x42\x0f\
+\x3f\x32\x87\x46\xd2\xfb\xb6\x65\xaa\xc8\x76\x32\x2b\x96\xd0\x0d\
+\x46\x19\xca\x8c\x11\xae\xb0\xd6\x41\xca\x37\x37\xd1\x0c\xd0\x09\
+\x37\xa0\xfe\xcc\x24\x7c\x16\x38\x1a\x7a\xf4\xa1\x3f\x34\x12\xde\
+\x8b\xb6\x29\xb2\x9a\x4d\x3d\x65\x15\x1d\x54\xcb\xa9\x4e\xd3\x18\
+\x65\x26\xf7\xc4\x4f\x75\xab\xa8\xcd\x2c\x84\x0b\x54\x32\xe7\xa8\
+\xae\x2a\xc8\x72\xf7\x68\x38\xff\x02\xe0\x0f\x6c\xec\x9e\xf5\x76\
+\xe1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x3b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x02\x49\x44\x41\x54\x78\xda\xb5\x56\x6b\x88\x94\x55\
+\x18\x7e\xde\xd9\x66\x76\xb6\x95\x08\x4c\xbb\xb8\xe4\x82\xb4\x26\
+\x5d\x36\xc8\x40\xe8\x47\x14\xa5\xd8\x92\xf4\x43\x94\xa0\x88\x48\
+\x58\x90\x14\x24\x88\x88\xca\x04\xad\x08\x7f\x08\x45\x8b\x95\xe8\
+\xe2\x16\x76\xf7\xca\x66\x21\x89\x62\xb9\xe3\xaa\x2d\x83\x86\xda\
+\xd2\xb6\xae\xba\x97\xd9\xd5\xbd\xe8\xec\xcc\xf9\xe6\x7b\x7b\xbf\
+\x73\xf9\x2e\x53\x7f\x1d\x38\x9c\x73\xbe\x73\xce\xf3\xbc\xef\xf3\
+\xbe\xe7\xbc\x43\x85\xce\x3a\xc6\x4d\xfc\x51\x40\x30\xf3\x99\xc2\
+\x4d\x01\x1f\xfd\xe5\x0e\xd0\xf0\x81\x3a\x9e\xb5\x64\x18\x5c\x99\
+\x00\x51\x0a\x8c\x1a\x10\x52\x42\x2d\x4d\xc6\xa6\x0f\x9a\x0f\xb0\
+\x34\x54\xcc\x58\x1a\xfb\xbe\xec\xad\xc8\x19\x4f\xcf\x89\xa5\x67\
+\x99\x4b\x4f\x99\x46\x8c\x1c\x9c\x05\x1a\xda\x9f\xe5\xd9\x42\x00\
+\x2e\x09\x58\x8d\x69\x4c\x16\x18\x21\x30\x0b\x10\x39\x12\x01\x60\
+\x0b\x18\x7c\x0f\x40\x29\x00\xd6\xe4\x4a\x8e\xc8\xbc\x76\x3e\x86\
+\x0f\xce\x06\x5d\xde\x93\xe5\xbb\x9e\x1d\x92\xc3\x14\x28\x66\x81\
+\x7d\x7d\x48\x5b\xa9\x81\x2a\x61\x1f\x78\xc0\x7e\xd0\x7b\xc6\x1b\
+\x6b\xb5\x9e\x87\xbd\x78\x90\x7d\x04\x83\x9d\x77\x82\x06\x76\x67\
+\xf9\x9e\x96\x2b\x22\x4f\xda\x1e\x60\xbb\xc9\xb7\x52\x98\x31\x5b\
+\x70\x0d\xc2\x11\x38\xc9\x3a\xdb\x39\xf9\x9e\x91\x2b\x98\xdf\xba\
+\x08\x57\xf6\xdf\x0d\xea\xff\x3e\xcb\x0d\xcb\x2e\x89\x75\x14\x93\
+\x21\x02\xd3\xdf\xb4\xae\x91\x75\x88\x49\x61\xe6\x5e\xd8\xb3\x1f\
+\x90\xca\x5a\xfd\x53\x18\xd8\x3b\x07\xf4\xf7\x37\xb5\x3c\xf7\xf9\
+\x01\x6d\x89\x76\x9f\xad\xa6\x76\x4c\x88\x02\x17\x81\xc5\xc8\xf4\
+\x37\x15\x01\xb3\x21\xa7\x19\x2d\xe8\xdb\xdd\x00\xfa\xeb\xab\x0c\
+\xcf\x5b\xde\x2f\x0b\x45\x03\xe8\x74\xb6\x60\xc4\xd1\x18\x7e\xd2\
+\x5a\xb0\xb2\x67\x94\x0d\xbc\xb2\xa4\x0a\xa9\xdb\x96\xa3\xf7\x87\
+\xb9\xa0\x73\x3b\x33\xdc\xb4\xa2\x4f\x2c\x18\x0f\xf5\xd5\xd9\x41\
+\x32\xf6\x55\x14\x4c\x37\x66\x2f\xf4\x86\x2c\x20\x5b\x82\xc8\x2b\
+\x21\xb8\xfd\x25\x9c\xff\xb6\x11\x74\xb6\x3d\xc3\x0b\x56\xf6\x0a\
+\xf6\x70\x2c\x23\xac\xc6\x1c\x93\x21\xb0\xd6\x65\x88\x03\x8d\x49\
+\x02\x47\x22\x86\x78\x37\x2e\x22\xd3\xb0\x1e\x7f\xee\x9a\x07\xca\
+\x6f\x4b\xf3\x03\x2f\x5e\x90\x3d\x03\xd1\x26\x6b\x25\xc5\xe5\xb0\
+\x1e\x70\x6c\x8f\x91\xb0\x5c\x15\x9f\x32\xbc\xeb\x97\x91\xb9\xf7\
+\x7d\xe4\x3b\xee\x03\x9d\xde\x9a\xe6\xe6\x97\xcf\x01\xa5\x0b\x16\
+\xc0\x33\x9a\x5a\x8d\x8d\x6c\xc6\x5a\xb6\x01\x25\x27\x93\x1f\xdb\
+\xe7\xc8\x25\x4e\x95\xe2\xa0\x10\x6c\x46\x4f\x7b\x13\xa8\xbb\x2d\
+\xcd\x8f\xbe\x72\x56\x62\x9c\xb7\x7a\x07\xa9\xa6\x6c\x7e\xc7\xad\
+\x2d\x27\xe4\xfa\xbf\x7d\x64\x03\x5d\xbe\xda\x8b\xba\xf9\xed\x38\
+\xb5\xfd\x7e\x50\xd7\xc7\xb7\xf0\x63\xab\xce\x08\x41\x4e\x1f\xa4\
+\x78\xea\xb1\x4a\x00\x9a\x2c\x52\x55\x31\x51\xe1\x85\x33\x1e\x55\
+\x50\xba\xd6\x27\x04\x1d\xc8\x7d\xf1\x20\xe8\xb7\x2d\x35\xbc\xa8\
+\x35\x0f\xbe\x7e\x44\xeb\x67\x82\x56\x65\x6d\x15\x09\x3b\x99\xe2\
+\x72\xc5\xd2\xb8\x58\xe8\xc5\x8c\x87\xf6\xe0\xf7\xad\x42\x70\x74\
+\x73\x0d\x3f\xbe\xba\x07\x3c\xd9\x99\xc8\x6f\xe7\x85\xc9\xf5\xc8\
+\xfd\xf0\x2e\x38\x4f\xc2\x79\x94\x71\xc5\xc2\x45\xd4\x3f\xbc\x0f\
+\xc7\xda\x9a\x41\xbf\x7e\x94\xe2\x27\x5e\x3b\x0d\x9e\xf8\xd1\xba\
+\xad\x12\x6f\x0a\x39\x29\xfc\x48\x0a\x8e\xdf\x62\x69\xd3\xa3\x7d\
+\xb2\x5c\xb2\xef\x17\xeb\x96\x6e\xda\x89\xae\x1d\x4b\x40\x87\x3e\
+\x48\xf1\x93\x6b\x4f\x82\xc7\x3b\xec\x33\xa1\x12\x5e\x44\x39\x9f\
+\xbc\x6c\xe1\xa5\x0b\x34\xbf\xaa\x50\xbf\x30\x17\x16\x1a\x75\x63\
+\x04\x5d\xdb\x9a\x2f\x95\xa7\x86\x5a\xe9\xe7\x8d\xc4\x4f\xaf\xeb\
+\x06\x8f\x7d\xfe\x9f\xa0\xb1\x0b\x6a\xf8\x2c\xbb\xe0\xba\x27\xc5\
+\x7a\x30\x4e\x42\x70\x4a\x83\x4f\x8f\x1c\x46\xf7\xae\x95\x63\xc5\
+\x89\x42\xeb\xe2\xb7\xfd\xef\xe8\xa7\x0d\xc4\x8b\x5f\x3f\x01\x7f\
+\x74\x4b\xd5\x43\xa6\xc2\x0b\x67\x2e\x94\x7d\xf4\xec\xfb\xe4\x5e\
+\xd5\xc0\xeb\xd2\x64\xad\x10\xfc\x81\xf2\xe8\x31\xe4\xbe\x5c\x31\
+\x32\x75\x6d\x70\xcd\xd2\xf5\xfe\xd7\xba\x26\x1f\x78\x17\xbc\xf4\
+\x8d\x1c\xfc\xc2\x87\x89\x9b\xec\xac\xab\x4c\x4f\x86\xb5\xc0\x2f\
+\x15\x75\xe1\x71\xb5\x82\x3d\x65\x0a\x51\x66\x0e\xd2\x8d\x6d\x38\
+\xde\xf1\xc2\x3f\x53\x63\xfd\xef\xb5\x6c\xe0\x1d\x61\xd1\xdf\xf7\
+\x0e\xb8\xe5\xcd\xe3\xa6\x4c\xc2\xfd\xc1\x88\x8f\xdd\x27\xb2\xc5\
+\x08\x55\x7b\x82\x3a\x92\xc2\xd1\xed\xaf\xf6\x4c\x0e\xe5\x3f\x7d\
+\x6e\x23\x7f\x96\x38\xb6\xf7\x2d\x39\x66\xf7\x92\x80\x70\x15\x48\
+\x70\xdc\xac\x07\xe5\x94\x63\xb0\x91\x0d\x7a\x09\x58\xb3\x6c\x13\
+\x3e\xa9\xfe\x67\xf1\x2f\xdf\xca\x6e\xf9\x04\x10\x20\x14\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xb1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x78\x49\x44\x41\x54\x78\xda\x9d\x94\x6b\x6c\x53\x65\
+\x18\xc7\xff\xef\xb9\xf6\xba\x76\x5d\xbb\x76\xdd\x5c\x98\x73\xc3\
+\x81\x38\x61\x30\x41\xd1\x18\x51\x11\x89\xa0\x33\x51\xa3\x51\x49\
+\xbc\xc6\x00\x5e\xf0\x82\xd1\x2f\xc4\x0f\x1a\x31\x31\x7e\x50\x63\
+\xd4\xa8\xf1\x92\x18\xbc\x46\x13\xbc\x2c\x30\x85\x62\x04\x65\x43\
+\x36\x36\x06\x6c\xeb\xda\xad\x6c\xeb\x65\xdd\xda\x9e\xd3\x73\x7a\
+\xde\xd7\x97\x2d\x31\x5e\x50\x18\xef\xd7\x73\xce\xef\xf7\x9c\xff\
+\xf3\x3c\x2f\xc1\x39\x9e\x6f\xd6\xde\xb4\x79\xac\xbb\x67\xbb\x3e\
+\x99\x95\x83\xcd\x8b\xba\x3d\xe1\xf0\x9d\x82\x24\x75\xaf\xfa\xf0\
+\x5d\xf6\xd7\xf7\xc8\xb9\xc0\x77\xb6\xad\x5c\x62\x99\xf5\x5f\xd7\
+\x2e\x5f\x10\x56\xbd\x1e\x24\x3a\xbb\x4a\x89\x83\x87\x7e\xf7\xd5\
+\xd7\x5d\xbd\x7a\xc7\xc7\xd9\x73\x12\xb0\xdd\x76\x35\x4b\xa9\xa9\
+\xba\x8a\x37\x7f\xf7\x34\xb6\x07\xe6\x3f\x59\xd7\x72\xdf\xdd\x10\
+\x44\x0b\xfc\x4f\x10\x8d\x44\x58\xfc\xb7\xce\x3e\xbb\xd7\x7b\xc5\
+\xfa\xf6\x9d\xa9\x39\x0b\xbe\xfa\xd2\x26\xad\xf6\xa9\x51\x52\x79\
+\x5d\xf8\xc4\x77\x83\x70\xa8\x57\xa2\xb2\x7e\x0d\x08\xb1\xc1\x32\
+\x0b\xd0\x92\x13\xd6\xd1\xef\xdb\xc5\xb1\xe3\x03\x51\x59\x55\x5a\
+\xd6\x75\xb4\xa7\xe6\x24\x58\xf1\xa6\x2a\xbe\x55\xeb\x9b\x5c\xb8\
+\xf2\x53\x17\x5c\x26\xd3\x3b\xbf\x45\xe1\x08\x23\x8a\xd8\x0c\x5a\
+\x30\x28\x4a\xa6\x20\x88\xc0\x91\x1f\x76\x61\xb8\xbb\x77\xc2\xe6\
+\x2b\x6f\xba\x71\xcf\xee\xd4\x59\x09\xea\x5f\x2f\x13\x55\xcd\x3a\
+\x50\x61\xc9\x8b\x77\xb4\xdd\x8f\x40\xdd\x33\x10\xf4\x7d\xd4\xe8\
+\xf9\x8c\x14\xbb\x5c\xcc\x4a\x85\x74\x73\x3a\x6f\x83\xae\x09\x92\
+\x22\xa3\xff\xf7\x23\xe8\x3b\x78\x78\x38\x74\x41\xdd\x92\x33\x0a\
+\x16\xbe\x53\x26\xa5\x63\xc2\xde\xf1\x21\xb4\x96\x37\xea\xe4\xb2\
+\x06\x8a\xd7\x16\xdd\x8f\x9a\x79\x0f\xa1\x94\xef\x65\xda\xaf\x6f\
+\xc2\xd8\xeb\x65\x34\xe1\xcd\x51\xdd\x70\x08\x84\x4a\xd3\xd3\x39\
+\x0c\xc5\x13\x34\x99\xc9\xf6\xfc\xaf\xa0\xe9\x6d\xaf\x92\x1a\x10\
+\x7e\x4a\x4f\xb0\x4b\x69\xa5\x06\x29\xa4\xe3\xa2\x2a\x11\x8f\xb5\
+\x04\xd0\x86\xb5\x70\x48\x2b\x51\x30\x62\x28\x74\x7e\x4e\xcd\x5d\
+\x6e\x6a\x1d\xb7\x89\xc4\x04\x91\x5d\x32\x46\x33\x59\x44\x7e\x3d\
+\xcc\xfe\x53\xd0\xf8\x46\xb9\x9a\x19\x16\x22\x99\xb4\xd5\x52\xf2\
+\x6a\xb0\x9f\x67\x60\xd1\x79\x2a\x6e\x68\xf6\x22\xe8\xa0\x08\x15\
+\x05\x5c\x9e\x5a\x0a\x37\xad\x41\x76\x2a\xc2\x8a\x7d\x09\x18\x1d\
+\xe5\x44\x1d\xf4\xf1\xc6\x2b\x88\x15\x26\xd1\x33\x10\x37\x4e\x2b\
+\x98\xf7\x6a\x85\xbd\x90\x64\x87\x92\x27\x59\x03\x2d\x9f\x85\xd7\
+\x57\xdb\xb1\xe1\x52\x37\x5c\x4e\x37\x4c\x89\x40\xd6\xa6\xe0\x2f\
+\x10\x5c\x36\xe0\x84\x3c\xad\x21\x6b\x26\x98\x39\x60\x47\x71\x8f\
+\x97\xa4\x0f\xaa\xc8\xe6\xac\x3c\x9c\xec\xc5\x7f\x09\x6a\x5e\xf6\
+\x3b\x8a\xd3\xec\xf8\x44\x94\x55\x09\x61\x0d\x4a\xd0\xc4\xbc\x2a\
+\x3b\x6e\x5e\x56\x89\xa0\x57\x46\xd1\xb0\x20\x80\x81\xd8\x44\x28\
+\x5a\x11\x8e\x54\x01\x0b\x7f\x19\x87\x8f\xf0\x11\x72\x58\x18\xe9\
+\x02\x92\x7b\xd5\x98\x30\xea\xde\xe4\xb0\xca\xbe\xfe\x9b\x20\xb4\
+\x3d\xe0\x32\xa7\xd8\x60\x2a\x5a\xf2\xcb\xb5\x3c\xcc\x72\x03\xd5\
+\x21\x3b\xd6\x2e\x0b\x22\x50\xa6\xc0\x30\x4a\x10\x45\x06\x59\x00\
+\x78\xda\x98\xd4\x4a\xf8\xb9\x2b\x0d\xcf\xa4\x81\x47\x35\x0d\xe5\
+\x94\xa1\x44\xb8\xdd\xce\x5e\x5a\xb2\x01\x5b\xff\xb6\x07\x95\x2f\
+\x07\x3d\xfa\x04\x3d\x32\x3d\x56\xaa\x12\x6b\x78\x74\x2e\x13\x21\
+\x0e\x5f\xb3\x22\x0c\xbb\x22\x82\x50\x0a\x51\x60\x10\x38\xdc\xad\
+\x02\x05\x0e\xff\xa1\x2b\x83\xc3\xfd\x39\xb8\xf2\x22\x1a\x2d\x86\
+\x6d\x15\x45\x54\x2b\x56\x41\x93\x71\x49\xeb\x83\x38\xf6\xa7\xc0\
+\xb7\x3d\xe4\xd3\x4f\x5a\x3f\xeb\x59\xab\x11\xbe\x22\xa4\x0a\x0a\
+\x7f\xc0\x81\xa5\x17\x07\xe0\x76\x4a\x50\x78\xb5\x02\xa3\xb3\x95\
+\xdb\x08\x1f\xf7\x12\x22\x87\x92\xe8\x1f\x2a\xa0\x38\xc6\xa3\xc9\
+\x88\x38\xbf\x01\x90\x14\xb3\xf9\x01\xa2\xcb\xeb\x1c\x56\xac\xf1\
+\x41\x8c\xcf\x0a\xb6\x86\xeb\x78\x47\x76\xc2\xa0\xf3\x89\x87\x40\
+\xa9\xa4\xf0\x72\xf8\x82\xa6\x20\x9c\x0e\x09\x32\xff\x9e\x70\xb8\
+\x2a\xf3\x68\x78\x39\x06\xef\x41\x67\x6f\x12\x43\xa7\xe0\xa3\x80\
+\xa8\xcb\x70\x07\x05\xdd\xf0\x94\x1a\x0a\x5b\xb2\xf1\x7f\xf6\x94\
+\x6c\x7a\xcf\x3f\xf9\xd5\x51\xb7\x67\xc4\xc8\xc3\xf2\x4c\xc2\x1f\
+\xae\xc0\xbc\xc6\x00\xec\x76\x09\x02\x07\x8a\x1c\xae\x9c\x9a\x1a\
+\x81\xc2\x28\x96\x70\xac\x2f\x8d\x68\x3c\x07\x2b\x01\xc8\xa6\x0c\
+\x9b\x8f\x8c\x4b\x41\xba\x2c\xf3\x48\x66\xf8\x74\x13\x49\x58\x9f\
+\x8b\xed\x31\x1e\xc3\x43\x07\xda\x11\xd5\x07\x10\xbe\x30\x04\xa7\
+\x53\x05\xb3\x2c\x88\x98\x85\x4b\x3c\x9a\x12\x87\x0f\x1f\x4d\x22\
+\x11\xcb\x81\x65\x78\x64\x05\x09\x0e\xbf\x70\x52\xae\xa2\xcb\x33\
+\x9b\x53\xd1\xff\xda\x27\xc2\x3a\xdd\x0c\x0b\xbe\x41\x24\x25\x63\
+\xcb\xb1\xe7\x31\x6c\x8d\xc3\x86\x59\xa8\xcc\x9b\x2a\x73\x81\xc5\
+\xe1\x89\xfe\x24\x52\xf1\x69\x90\x3c\x7f\xc0\x05\x8e\x6a\x29\x4f\
+\xca\x59\x53\x6e\xcb\x44\xec\xff\x6e\x03\x42\x0f\x56\x30\x56\xff\
+\x01\xa8\xeb\x1a\xec\x4f\x75\xe0\xe1\xde\x57\x30\xa8\x8d\xa2\x4c\
+\x52\x78\xf5\x02\xa8\x59\x42\xe6\x44\x12\x53\x33\x70\x80\xa6\xf9\
+\xb8\xd7\x2a\xb0\x6c\xac\xa6\xf8\xec\xd8\xc8\x99\xee\x32\xf2\xc9\
+\xb6\x32\xb6\xfa\xde\xf7\xe1\xa9\xbe\x12\x46\x61\x0c\xfb\xb3\x7d\
+\xd8\xd8\xff\x16\x4e\x18\x29\x10\x0e\xa7\xd1\x34\xb4\x44\x0e\x34\
+\x43\x41\x72\x80\x52\xa3\x40\x2d\x13\xc3\x53\x4f\x8d\x24\xce\x04\
+\x9f\x11\xdc\xbd\x52\x61\xad\xab\xd6\xe3\xd6\xbb\x6e\x47\xa0\xbe\
+\x8e\x57\x98\xc1\xbe\xa9\x01\x6c\x1c\xf8\x1c\xdd\xdd\xbd\xbc\x99\
+\x19\x20\xcb\x63\x31\x05\xc8\x7e\x35\x2f\x57\x90\xc6\xc2\x93\x23\
+\xa3\x67\x03\x9f\x11\xac\x59\x20\x30\x4d\x97\x70\xcb\x6d\xd7\xe3\
+\xd6\x7b\xd6\xa0\xb2\x3a\xc8\xb7\x88\x61\x7f\x7a\x18\x1b\x3a\x3e\
+\x42\xac\x37\x8e\xdc\xb4\x0e\xc1\x67\x4f\x2b\xd5\xea\x25\xfa\xe3\
+\x43\xb1\xb3\x85\xcf\x08\xda\x16\x0b\x6c\x30\x46\xe1\x70\xca\xb8\
+\xe3\xb6\x15\xb8\xe9\x96\x16\x38\x49\x11\x65\x8a\x1d\xbb\x63\x43\
+\xd8\x1a\x39\x84\x03\xd9\x4c\x52\xa8\xb6\xb7\xd2\xe7\xe2\x83\x73\
+\x81\xcf\x08\xd6\x5f\x0c\x96\x9c\xe4\x29\xf0\x7c\x6b\x2a\x81\x6b\
+\x97\x03\x57\x2d\xe5\x63\x59\x02\xfc\x3c\x99\x27\xa6\xbc\xf8\x22\
+\xef\xba\x0a\x2f\xc4\x7f\x9c\x2b\xfc\xd4\xf9\x03\x50\x5c\x77\xfa\
+\x81\x95\x47\x01\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x04\x03\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xca\x49\x44\x41\x54\x78\xda\xbd\x54\x4d\x68\x5c\x55\
+\x14\x3e\xe7\xbe\x79\x33\x93\xe8\xb4\x69\xd2\x26\xa6\x99\x76\xcc\
+\x8f\xa5\x36\x68\x14\x52\xc1\x4a\xc0\x62\x8b\x1b\x6b\xb1\x2e\xa4\
+\x3f\x1b\x5d\x59\x17\xba\x50\x10\x44\x29\x08\x2e\x5c\xd4\x85\x0a\
+\x8a\x20\xe2\x46\x37\xa5\x52\x25\x9b\x16\x44\xc1\xd4\xda\x34\x42\
+\xad\x68\x5b\x62\x1b\x26\x24\xe9\x38\x26\x99\x99\xbc\x4c\xc6\x37\
+\xef\xbd\xe3\xb9\xef\xde\x79\xef\xce\x18\x37\x62\x7d\xcc\x99\x73\
+\x7f\xce\xfd\xbe\xf3\x73\xcf\x45\xb8\xcd\x1f\xfe\xef\x04\x34\x3b\
+\xb8\x8b\xd5\xb3\x2c\x07\x81\xc2\xa5\x33\x2c\x9f\xe0\xf6\xdf\x7e\
+\xf9\x6f\x08\xf2\x83\x1f\x40\x7a\xf7\xf3\x90\x7e\x48\x2d\xd4\x2e\
+\xb2\x4c\x7e\xc8\x04\xc7\xff\x15\x81\x3f\x33\x40\xa1\xa7\x4c\xa5\
+\x15\x88\xee\xb7\x9b\x8c\x82\xc2\xab\x6a\xa3\x61\x60\x3a\xd4\x58\
+\xa2\x78\xcd\xea\xbf\x11\x59\xa1\x3b\xdd\x4f\x76\xef\x1b\xda\x9a\
+\xd7\x91\x94\x6e\x9c\x40\xc9\x4c\x9a\x40\xfe\x05\xac\x1d\x56\x2b\
+\x2c\x55\x16\x5e\xb3\x52\xbc\x9f\x66\xcf\x6c\xa8\x17\xde\x85\xe4\
+\xd0\xcd\x98\xa0\xfa\x6b\x8e\xda\xb2\x2f\xb5\xf8\x43\xeb\xb8\x28\
+\xff\x7c\x06\x5c\x63\xb5\xc4\x52\x66\xe1\xb1\xe7\x31\x41\x92\xb7\
+\x59\x44\x12\xd6\x96\xce\x42\xfb\xce\x99\x98\xc0\xf9\x29\x47\x77\
+\xe4\x0e\x6b\x20\x0d\xbe\x4e\x2a\xc2\x28\xa0\xce\x80\x0c\xee\x2d\
+\x82\x5b\xbd\x05\xfe\x9f\x15\x10\x42\x00\x0a\x36\x17\xc8\x63\xe6\
+\xf7\xab\x20\x2c\x31\x25\xc7\x88\xe8\xe2\xf2\x54\x96\x3a\xfa\xf7\
+\xc5\x25\x8f\x82\x40\x23\x3d\xac\x83\x40\x79\x5d\x5f\x84\xd5\x72\
+\x01\x30\x75\x1f\xa4\x36\xed\x91\x20\x4d\xd7\xa5\x11\x2c\x79\xb7\
+\x80\x2a\xa7\xa6\xb0\xf8\x7d\x1f\x6d\x1e\xb8\x87\x57\x7c\x59\x5e\
+\xfe\x59\xca\x22\x3c\x28\x62\x56\xdf\x65\xf0\x12\x54\xfe\x58\x04\
+\x6c\x1f\x85\x4c\xf6\x49\x59\x4e\x08\xdd\x27\xe9\xae\xa5\xed\xd5\
+\xe7\x3b\x13\x10\x54\xce\x7c\x8c\xf3\xdf\x6e\xa5\xde\x5c\x52\x79\
+\x28\x0b\x26\x48\x19\x4a\x02\x81\xba\xb0\x92\xc3\x83\xe5\x42\x0d\
+\x82\xd4\x30\x74\x0d\x3d\xa5\x01\x0d\x51\x79\xd2\x73\x04\xb7\x78\
+\x8a\xef\xc0\xa5\x17\x30\x7f\xae\x87\xb6\xf5\xd5\x74\x6e\x98\xc4\
+\xd3\x37\xc6\x37\x0a\xcd\x44\xc5\x25\x1b\xbc\xe4\x0e\xe8\x1d\x3e\
+\xc0\xfb\xb6\x76\x22\xc1\x3a\x61\x00\xc7\x64\xab\xf9\xf7\x64\xad\
+\xf6\xe0\xf4\x78\x37\x0d\x6e\x5b\x86\xc9\xf3\x49\xa8\xfb\x5c\x28\
+\x4b\x15\xcb\x62\x2d\x0b\x67\x25\xd4\xda\x86\xcd\x5b\x61\xfb\xe8\
+\x7e\x5e\x4b\x2b\xef\xc3\x08\x12\x1a\xd4\x8e\x23\x62\x4d\xbe\x07\
+\xa5\xeb\x27\x7d\x3e\xd7\x81\x57\x4f\x77\x51\x7f\x76\x09\x2e\x4d\
+\x6e\x80\xfb\xf7\xed\x52\x5e\xb1\xa0\xf6\x10\xc3\xb9\x05\xe9\x4c\
+\x07\x88\x44\x5a\x7b\xac\xc1\x51\x13\x84\x11\xb1\x26\xb5\xe7\x3a\
+\x73\x50\xba\x79\xfa\x5a\xcf\x23\xf3\x3b\xf1\xca\xe7\x9d\x74\x57\
+\x4f\x09\xe6\x16\xba\x60\x64\xff\xa0\x3e\x6c\xab\xc3\x64\x78\x17\
+\xa5\xc3\x36\x40\x5b\x08\xb4\x4d\x65\xfe\x32\x38\x85\xa9\xcf\xfa\
+\x1e\x5d\x38\x8a\x3f\x7e\xba\x91\x32\x19\x07\x44\xdb\x16\x18\x78\
+\xb0\xd3\x00\x32\x0e\x93\xe9\xb5\x6d\xec\x1b\xda\x88\xac\x70\x6d\
+\x02\x6a\xe5\xb9\x97\xef\x7e\xbc\xf0\x0e\x5e\xfc\x28\x43\x96\x55\
+\x85\xdc\x48\x27\x74\xf5\xb5\x19\x07\xac\x96\x54\x24\x9a\xbc\x6c\
+\xd2\xd2\x01\x61\x47\x44\x37\x2e\x9c\xe3\x3a\xb8\x8f\x0d\x1d\x28\
+\x7e\x8d\x13\xef\xdf\x49\xb5\xd5\x35\x18\x7b\x26\x03\x76\xca\x6a\
+\xca\x65\x04\x28\xc7\x64\xb5\x78\xdb\x32\x46\x15\xad\xbb\xe6\xc1\
+\xf4\xf9\x0b\xf2\x62\x74\xdf\xfb\xf4\x62\x11\xbf\x39\xd9\x4e\x01\
+\x37\xd1\xde\x23\x09\x7d\xf5\x8c\xc6\x89\x80\xad\xbf\x47\xd5\x18\
+\xb7\xa4\x68\x79\x61\x05\x66\xaf\xcc\xe4\x47\x8e\x95\x72\x61\x53\
+\x9f\x7d\x2b\x45\x5b\xb2\x75\x78\x60\x8c\x8c\x0e\xc6\xa8\x61\xa2\
+\x26\x02\x11\x77\x3a\x35\x3a\xde\xbc\xfb\x4a\xcf\x5e\x5d\x81\xdf\
+\xf3\xce\x17\xa3\xcf\x95\x0f\x85\x04\xe3\x27\x92\x34\xbc\xdb\x83\
+\xdc\x8e\xa0\xe9\x11\x55\xe0\xba\x9b\x41\x77\x74\x23\x3a\x81\x71\
+\xb4\x60\x3c\x13\xbc\xf7\xf3\x0f\x35\x70\xca\xc1\x89\x87\x8f\xaf\
+\xbc\x19\xa2\x7c\xf5\xba\x4d\x63\x07\x3d\xd8\xb8\x89\x5a\x08\xcc\
+\xe7\x1a\x63\xd2\x08\x54\xe8\x67\x44\x8d\x9d\x12\xf2\x54\xc0\xe5\
+\xef\x5c\x69\xf7\xc4\xd8\x8b\xab\xe3\xe1\x89\x2f\x5f\x4b\x10\xad\
+\x07\xfc\x0f\x1f\x62\xfc\x34\xcb\x89\x08\xb3\x85\xea\xe9\x12\xaa\
+\xfb\x79\x9e\xdb\xfb\x4a\x35\x6f\x3c\xb2\xb7\xef\xfb\x0b\xa3\xb7\
+\x4d\xab\x8a\xe9\x9a\x2b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x08\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xcf\x49\x44\x41\x54\x78\xda\xb5\x56\x69\x48\x54\x51\
+\x14\x3e\x67\xc6\x31\x6d\x88\xa2\x68\xfd\x11\x85\x45\x91\xcd\x66\
+\x45\xd4\xb3\xec\x87\xb4\x10\x51\x48\x0b\x11\x48\x05\xd9\x0f\x2b\
+\x63\x08\x0d\x69\xa7\xcd\x2c\xc3\x56\xb0\x40\x28\x2a\xb2\x2c\xa1\
+\x22\xc3\xa2\xed\x8d\x46\x61\x33\x93\x1a\x19\x14\xd4\x8f\xa2\x8d\
+\x22\x4a\x73\x99\x39\xdd\xfb\xee\x9b\x37\xf7\x4e\x2b\x41\x17\x66\
+\xde\xbb\xdf\x3d\xf7\x2c\xdf\x39\xf7\xdc\x87\xe3\x6b\xda\x08\x08\
+\xac\x81\xec\x47\xd2\x33\x11\xe7\x2f\xf2\x1a\x52\x1c\xb7\x36\xc6\
+\x06\x9b\xe3\xb8\x0b\x5f\xe8\xd6\x1c\xa7\x25\x88\x92\xb0\x31\x97\
+\xde\x21\x36\x07\xd5\x0b\x59\x8e\x63\x44\x62\x29\xeb\xd2\x57\xc0\
+\x8c\x73\x9f\xe9\xee\xbc\x5e\xf0\x3f\xc6\x94\x8b\x9f\x01\xbd\x67\
+\x3e\x92\x3e\xbf\x8f\xb0\x8a\xa6\x13\xa6\xbb\x84\xe6\xfb\xcf\xf8\
+\x8a\x05\x42\xd2\x34\x81\x9e\xcc\xea\x4f\x80\xee\x93\xef\x49\x5f\
+\xd4\xef\xa7\x1e\xa0\x19\xee\x0f\x06\xfe\x62\xf0\x2d\x5a\xd5\x07\
+\x40\x57\xe5\x1b\xba\xbb\x64\x80\xd0\x61\x2a\xeb\xb3\xd3\x0e\xe0\
+\x48\xf0\xe8\x77\x83\xef\xeb\x02\xf8\x54\x1c\x11\xca\xcd\xbc\x4c\
+\x39\xfd\x0e\x70\xcc\xb1\x57\xa4\xe7\x0e\xb6\xac\xf2\x05\xd7\xf1\
+\x66\x70\x3a\x10\xda\xbb\x08\xa2\x14\x35\xa3\xb1\x41\xcf\x24\x21\
+\xd5\xde\xcd\xf0\x28\x59\x51\xa6\x3a\x6c\x86\x6c\xd3\x8a\xb1\x96\
+\x3d\x3e\xb4\x93\xaf\x01\x47\x1d\x7d\x41\x81\x65\x43\x15\x87\xbc\
+\x15\x6f\xc0\xc6\x36\x3e\x5c\x31\x50\xe1\x76\x5c\xc5\x5b\xe3\xd9\
+\x98\x37\x40\x61\x8d\xe3\x51\x16\x7e\x30\x6f\xa0\xa2\x27\xb3\xf2\
+\x25\xe0\xc8\xf2\xe7\x14\x58\x39\x5c\x09\xd7\x7d\xe8\x19\x44\xd9\
+\x4b\xd3\xea\x11\x42\xb7\x49\x9d\xeb\xe0\x33\x43\xe4\xd1\xaa\x34\
+\x2b\x3f\x7c\x9d\xe3\xfc\x19\x5e\x93\x66\x15\x88\x11\x41\xc5\x73\
+\xc0\xb4\xbd\x4f\x49\xcf\x1f\x19\xe7\x92\x49\xba\xcb\x5a\x81\x9f\
+\xbe\x26\xff\x68\xc5\x23\xd7\xbe\x27\xc6\x7a\x33\xc3\xe5\x9c\xbb\
+\xf7\xb5\x0a\x03\xfe\x51\x4a\xde\xb4\xc3\x4f\x01\x87\xed\x6a\x26\
+\xbd\x20\x5d\x09\xd9\xb3\xa7\xc5\xa0\x28\x58\x98\x6e\x81\x7c\xdd\
+\x57\xda\x6c\x94\x6e\x70\xdd\x58\x25\x67\x19\xa5\x2d\x10\x61\xb9\
+\x0a\x17\xba\x94\xba\x98\x5c\xfe\x18\x70\xe8\xd6\x10\xe9\xeb\x3c\
+\xf1\x83\xc9\xfe\x7c\x3b\x42\xe0\x4c\xb6\x41\x5b\x57\x14\x22\x22\
+\xc7\x60\xb7\x11\x38\x7b\xd8\x0d\x8d\x6d\x9d\x11\xe8\x36\xf1\x24\
+\x1b\x40\x0a\x4b\x72\x5b\x67\x14\x82\xc5\x3e\x4b\x07\xa7\x4a\xdb\
+\xfb\x08\x70\xc8\xc6\x46\x0a\x14\x65\xa8\x49\xde\xf6\x80\x19\xb0\
+\xb3\xca\xe0\x8a\xc8\x54\x84\xd0\x93\x61\x7c\x08\x03\x71\x3c\xd5\
+\x61\x87\xaf\x1d\x11\x08\x6d\x99\xa0\x9c\x17\xad\xe4\x21\xe0\xa0\
+\xf5\xf7\x48\xdf\x30\x51\xa1\xc8\xbb\xb1\x41\x54\xd1\xb6\x49\x0a\
+\x9e\xb1\xa9\xc1\x98\x73\x9c\xac\xe6\xc4\x70\x26\xcf\x03\x0a\x31\
+\x5c\xe6\x2e\x73\xfb\x7d\xc0\xfe\x7e\x9d\xf4\xad\x9a\xd2\x0c\x3d\
+\x45\x77\x58\x98\x04\xe1\xdd\x59\x6a\x75\x15\xdd\x36\xaa\x27\x5c\
+\x92\x25\x3a\xa5\x49\xb8\xa7\xf0\xb6\x31\x09\x97\x4c\x95\x6b\x05\
+\xb4\xcd\x3a\x60\xdf\x55\x37\x29\xb0\x73\x9a\x4a\x91\xff\x86\x51\
+\x45\xe1\xb2\x6c\xa5\x03\xbb\xfd\x75\x8c\x5b\xa6\x68\x7f\xb6\x22\
+\xef\xf6\x5f\x17\x55\x54\xa6\xe2\x5a\xf1\x2d\xc0\xde\x2b\xeb\xa8\
+\xbe\x34\x5b\x69\x72\x9e\x35\xb5\x60\x63\x1c\x05\xcb\x67\x80\xc4\
+\x04\xf8\x0a\xae\x19\x06\x1a\xcb\xa7\x2b\xd4\xf9\xd6\xd6\x02\xb1\
+\x9c\x84\x0f\xcc\x52\xee\x86\xcc\xc2\x1b\x80\xbd\x96\x5f\xa5\xc0\
+\xfe\x99\x0a\x15\xde\xfc\x4b\x90\x9a\xec\x80\x0e\x96\xe4\x88\x99\
+\x4c\x3b\x33\x98\x62\x26\xf9\x5b\x27\xc7\x45\x19\x71\x47\x52\x58\
+\x92\xdb\x3b\xbb\x21\x74\x64\x8e\xb8\x1f\x62\x55\xe4\xaf\x05\x74\
+\xe6\x5e\x26\xfd\xc0\x6c\xa5\x7e\xbd\xb9\xe7\x01\x7a\x24\xa9\x4d\
+\x54\xbe\xc9\x24\xde\x44\x93\x64\xff\x1d\x5d\x10\x3a\x31\x5f\xa5\
+\xa8\xe0\x0a\x60\xea\xe2\x1a\x0a\x1c\x9d\x6b\x51\x64\x5d\x8b\x09\
+\xfd\xdf\xea\xfb\x09\x2d\xdc\xba\xe0\x4c\x07\x62\x11\x18\x14\xe5\
+\xd7\x00\x26\x2f\xa8\xa6\xfa\x8a\x9c\xf8\xb5\x88\x7f\xd1\xa5\x13\
+\xef\xde\x5f\x0c\x2d\xaf\x1a\x30\x29\xe7\x2c\xd5\x1f\x5f\x18\xf7\
+\x44\x96\x90\x6a\x17\x25\xcf\x12\xd7\x95\x8f\x00\x33\x1a\xc3\xc0\
+\xf2\x2a\x40\xdb\xdc\xd3\xd4\x50\xb9\xf8\xcf\xee\xfc\xc3\x98\xbc\
+\xf4\x0c\x3b\x1e\xb3\x4f\x11\x22\xaf\x7a\xb4\x42\x40\x7e\x0a\xe4\
+\xa6\x12\xf3\x4e\xfe\x82\x90\x62\x16\xf9\x11\x71\x90\xfc\xd9\xc1\
+\xf6\x7f\x07\xd4\xc9\xa3\xce\x7a\x3c\x30\xdd\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xfe\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xc5\x49\x44\x41\x54\x78\xda\xad\x95\x7f\x4c\x53\x57\
+\x14\xc7\xcf\xed\x7d\x2d\x6d\xe9\x1e\x0a\x7b\xc3\x82\x40\xe5\x47\
+\x05\x26\x2e\x96\x90\x38\x59\x50\x40\x30\x8e\xe9\x90\x88\x04\x7f\
+\xc4\x64\xd2\x2c\x63\x61\x3f\xe3\x46\xc6\x74\x61\xc0\xc6\x20\x1a\
+\xc5\x60\x32\xc9\xa2\xc3\x45\x6a\x74\x6a\x58\xa6\x63\x73\x02\xd1\
+\x68\x88\xe2\x44\xb1\xfc\xaa\xfc\xa8\x83\x02\xc5\x56\xe8\xeb\x8f\
+\x51\xe0\xee\x3e\xa3\xc9\xfe\x70\x79\x35\xe9\x37\xb9\xef\xbe\x7b\
+\xdf\x3d\xf7\x93\x73\xee\x3d\xe7\x21\xf8\x8f\xe2\x6b\x4d\x1c\x20\
+\xd8\x8c\x08\xac\x27\x08\x52\x80\x40\x14\x02\x18\x21\x00\x37\x69\
+\x7f\x99\x00\x69\xee\xdd\x1b\x67\x85\x17\x10\x7a\xf6\xa2\xad\xee\
+\xcb\xa4\x5d\x49\x4c\x88\x2c\x22\x2f\x89\x0d\x5c\x17\xa3\x0a\xd3\
+\x04\x4b\x55\xc3\x36\x2f\xdf\x6a\xe2\x1f\x9e\xeb\x9e\xf1\x0c\x4e\
+\xcd\x3e\x04\x44\x8e\xf4\x97\xc6\xff\xf9\x42\x80\xd8\xca\xfb\x99\
+\x72\x46\x52\xb6\x23\x79\x31\xf7\x71\x7a\xe8\x0a\x3b\x0f\xe0\xf6\
+\x02\xa8\x02\x00\x82\x14\x74\x11\x5d\xe5\x9d\x07\x72\xb0\x7d\xe2\
+\xde\xe9\xdb\xb6\x47\x9e\x39\x52\x65\xfa\xf2\x55\x9f\x20\x28\xfa\
+\xab\x2e\x8e\x86\xa0\x41\xbf\x86\x8b\x29\x59\xab\x5e\xd1\x37\x09\
+\x10\xba\x08\x60\xe9\x4b\xcf\x37\xf8\xfa\x92\xa5\xfb\x44\x87\xf5\
+\x01\x35\xd5\x0f\x95\xaf\x14\x0d\x17\x8a\x2c\xeb\xdc\x13\xc3\xc9\
+\x8b\x2f\xbd\x9f\xa0\xeb\xb6\x20\x78\x25\x04\x20\x42\xf9\xff\x06\
+\xf3\x0b\x84\x64\xd7\xf5\xdc\x31\x4d\x79\xea\xcd\x55\xc9\x3f\x88\
+\x02\xc2\xf7\x76\x34\xed\x7b\x2b\x42\xf7\xf6\x6b\x6a\xed\x10\x0d\
+\xcd\xca\x70\x80\x40\x11\xa3\x23\x57\x2c\x03\xdf\xfd\x66\xee\x1c\
+\xad\x5d\x5d\x28\x0a\x58\xf2\xd1\x55\x53\xfb\xe7\x3a\xb5\xc3\xa3\
+\x54\xe6\x1c\x37\x8b\xc6\x74\xbc\x3c\x12\x8c\x63\x2e\x47\x66\xed\
+\x5f\x93\xe3\x87\xde\x88\x15\x05\x70\xc5\xad\xde\xd1\xba\xb5\xcc\
+\xb5\x01\x04\x85\x4d\xbe\x01\x5c\xff\x10\xa2\xf9\xb4\x7d\xde\x5a\
+\x9f\x2e\x15\x05\x2c\xd6\xb7\x98\x6e\x94\xa7\xaa\xc7\xa6\x03\x95\
+\xbe\x02\x6e\x0c\x38\xdd\x39\xb5\xd7\xc7\xec\x0d\xd9\xe2\x1e\xb0\
+\xbb\x7f\x6d\xaa\x28\x88\xd7\xa5\x26\x44\x6b\x65\xc1\x00\x6a\x16\
+\xe0\x65\x11\xa3\x8a\x73\xc3\x13\x07\x9a\x8d\xad\xd3\x3f\xe6\x88\
+\x9f\x41\xe0\xf6\x0b\x7b\xb4\x61\xaa\xe2\x5f\xbe\xc8\xd0\x99\x5d\
+\x08\xd4\xf4\x90\xe9\x2d\x7d\xd2\x9e\xa7\x91\x69\x02\x05\xd5\x57\
+\x07\xbb\xcd\xf6\x6f\x9c\xa7\x72\xc5\x6f\x91\x22\xff\x2c\x47\xcb\
+\x42\xc3\x07\x39\xda\xb8\x6d\xe9\x49\x89\x52\xea\x01\x1b\x44\x93\
+\x8c\x7e\xa4\x39\x06\xf2\xa7\x0b\x3d\xb4\xd9\x5c\x00\x35\x86\x5e\
+\xfe\xc4\x1f\x3d\x14\x03\x75\x4e\x43\x5e\x8d\x28\x40\x78\xc8\xb6\
+\x18\x32\x15\x32\x5c\x56\xb4\x41\x1b\x5e\x90\x91\xa4\x9d\x63\x10\
+\xa8\x68\xa2\x29\x9e\xe6\x83\x9b\x6e\x3c\x43\xb7\x6c\x6a\xe9\xe1\
+\x4f\xb7\xf5\x31\xbc\x7b\x56\x2e\xc1\xb8\xcd\x75\x26\x3f\xdd\x27\
+\x80\x20\xbc\xe9\xa7\x27\xb5\x28\x21\x22\x48\xb3\x2d\x2d\x8e\x4b\
+\xd4\xa8\x43\x59\x95\x0a\x8f\x3d\xe2\x17\x7a\x47\x26\x9c\x2d\xb7\
+\x06\xad\x46\xb3\xed\xc1\xc2\x02\x49\x43\x08\x05\x60\x29\x06\x86\
+\x91\x1e\x73\x18\xf2\xde\xf5\x09\x20\x48\xb2\xb1\x91\x03\x20\x9b\
+\xe9\xec\x7a\x3a\x4c\x21\x42\x35\x45\x68\x84\xce\xdd\xa4\x95\x95\
+\x56\x53\x68\xc6\x18\x6d\x95\x48\xf0\x51\xea\x01\xb0\xac\x1c\x08\
+\xc2\x06\x2f\xc2\xbb\x1f\x1f\x7f\x73\x56\x14\xe0\xab\x64\xb9\xa7\
+\x3e\xc1\x18\x1f\x90\x50\x2f\x12\x23\x83\x61\xca\x35\x7f\xd1\xe1\
+\x85\xad\x53\xdf\x67\xb9\xfd\x02\x10\xa4\xcc\x3f\x53\x46\xc3\x54\
+\xa9\x90\x07\xc0\x86\xe4\x30\x30\x5a\xdc\xd7\x46\x1d\x73\x1b\xc7\
+\x0f\xa7\xf1\x7e\x01\x08\x62\x77\x35\x17\x61\xcc\x34\x70\x21\x4a\
+\x28\xca\x88\x82\xb6\xfe\xe9\xae\xbb\x16\x4f\xc6\xdf\x35\xab\x6d\
+\x7e\x01\x08\x0a\xd1\xff\xae\x97\x30\xf8\xd8\xaa\xe8\x45\xf0\x61\
+\x76\x14\x5c\xb8\x6b\x1f\xbe\xdc\xcf\xbf\x3e\x54\xb1\x6a\xdc\x2f\
+\x00\x41\xa1\x25\xed\xbb\x30\x83\x1b\x0b\xd7\x84\xc1\x3b\xa9\x4b\
+\xe0\xe7\xae\xc7\x93\x8d\x9d\xf6\x14\xfa\x53\x32\xfb\x05\x20\x68\
+\xe9\x67\x1d\x3b\xa5\x52\x7c\xf2\xdb\x2d\xcb\x20\x3b\x21\x08\x2e\
+\xf6\x38\x66\x2a\xaf\x58\x93\xfc\x06\x10\xa4\xd9\x7f\x27\x97\x55\
+\x30\xe7\xeb\x0b\x34\x02\xa0\xf5\xbc\xd1\x99\xe5\x57\x80\xa0\xd8\
+\x2a\x63\x16\xcd\x91\xbc\xfe\xd2\xe5\xef\x09\x63\xbf\x03\x96\x57\
+\xf7\xa2\xbe\xd2\x78\xf2\x6c\xfc\x2f\x14\x19\x62\x64\x51\xcb\xa5\
+\xe3\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x9d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x64\x49\x44\x41\x54\x78\xda\xa5\x56\x6d\x6c\x53\x55\
+\x18\x7e\x6e\x6f\x6f\xdb\xf5\xf3\xb6\x5b\x57\x36\x36\x37\xd8\x60\
+\x28\x10\x3e\xc6\xd8\x46\x0c\x09\x61\x4e\x64\x46\xa6\x21\x11\x7e\
+\x00\x41\x59\xf8\x01\x26\x84\x30\x83\x24\x26\x26\x26\x42\x18\x11\
+\x0d\xa2\x3f\x36\x7f\x28\x3f\x24\x01\x02\x68\xe6\x8f\x06\x32\x37\
+\x13\x26\x6c\x53\x51\x3e\x86\x0e\xe6\xc0\xb5\x74\x5d\xbf\x3f\xd6\
+\xaf\xdb\xe3\xdb\x5b\xb6\xc2\x98\x40\xf4\x26\x6f\xcf\x3d\xe7\xbc\
+\xe7\x79\xde\xfb\x7e\x9c\xb7\x1c\x9e\xf0\x14\xef\x1f\xab\xa7\xa1\
+\x81\x64\x15\xc9\x22\x92\x22\x12\x27\xc9\x35\x92\x4b\x24\x17\x1c\
+\x87\x0a\x7b\x9f\x84\xc1\xcd\xb4\x38\xab\x75\xb4\x82\x36\x76\x94\
+\x5b\x85\x9d\x0b\x4b\x54\xe6\x12\x0b\x0f\xbd\x46\x81\x34\xc7\xc1\
+\x15\x94\xf0\xb7\x57\xc2\xa8\x37\x09\xa7\x37\xe5\x89\xc6\x58\x3b\
+\xc0\x3a\x9c\x6d\xb3\x6f\x4f\xc7\x29\x6a\x75\x58\x1e\x23\xb0\xed\
+\x19\xae\x01\xc7\x1d\x68\x5a\xae\x6f\xae\xab\xd0\xa0\xc0\xc0\x23\
+\x1c\x67\x08\x91\xb8\x42\x12\x24\xc6\x70\x3f\x94\x46\x84\xe6\xe3\
+\x34\x77\x8c\x25\xe0\x09\x24\xce\xd1\xd1\x8f\x5c\x47\xe7\xf4\xe5\
+\x70\xfe\xb2\x90\xf9\xf6\x47\x08\xac\xbb\x6e\x55\xd0\x70\x64\xf3\
+\x8b\xe6\xe6\x65\x73\xb5\xb8\xe5\x4a\xe2\xae\x3f\x05\x6f\x24\x8d\
+\x58\x92\x41\xc9\x73\x50\xf1\x80\xa8\xa5\xaf\x49\x03\xee\xb0\x84\
+\x54\x9a\x83\xdb\x33\x01\xf7\x78\x9c\x48\xd8\x3e\xf7\xf1\x05\xb7\
+\x09\xc7\x42\xef\x76\x81\xe7\xaa\x1f\x21\xc8\x6f\xf9\xf5\xe0\xab\
+\x35\x96\xfd\xe5\x45\x5a\xf4\x0c\x86\x30\xec\x8c\x21\x16\x4b\x21\
+\x95\x92\xa0\x54\xf2\xd0\x68\x94\xd0\xe9\x94\xd0\xeb\x55\xe0\x79\
+\x05\x4c\xe4\xb6\x40\x4c\x92\xcf\xba\x5c\x11\xf8\xfd\x89\x43\xf4\
+\xda\x46\xa0\xf6\x97\x96\x8b\xd5\x57\x06\x83\xb9\x18\x98\xb7\xf5\
+\xd6\x97\xdb\xb4\x9d\x4b\x2a\x8d\xba\xee\x1b\xc1\x1e\x9f\x37\xfa\
+\x25\x6d\xf6\x91\xc6\x08\x6d\x97\x51\xb8\x6a\xc0\xd0\xc0\x38\xf6\
+\x9a\x4e\xa7\xb6\x9a\xc5\x3c\x68\xb4\x02\x6d\x73\xb4\xcc\x10\x8f\
+\xa7\x30\x76\x3f\xe4\x4d\x24\x52\x63\x1b\xea\x6d\x0b\xca\x8b\x75\
+\xe8\xe8\xbc\x9b\x23\x30\x6d\xea\x7a\xbf\x7e\x71\xc1\x96\x9b\xa3\
+\xd1\xf6\x91\xcf\x6b\xdb\xa6\xc7\xa6\xb1\xc3\x3f\xdb\xbe\x43\x1c\
+\x35\x6e\xea\xda\x40\x87\xde\x11\x4d\x9a\xb5\xa2\x59\x0b\xa6\x14\
+\x1e\x80\x30\x78\xc7\xc3\x58\xb7\x54\xc4\x8a\x2a\x0b\xae\xdc\x89\
+\xe0\xbb\x1f\x46\x72\x04\xfa\xd7\x3b\x0f\xd6\x2e\x29\x72\x5c\xfc\
+\x60\xf9\xb1\x19\xc0\x95\x04\x9e\x7a\x48\x77\x65\x26\xa8\x79\x3a\
+\xcd\x5a\x4b\x81\x08\x85\x52\x41\xf0\xc0\xc6\x1a\x11\x8b\x4a\x0d\
+\xe8\x1e\x0c\xc0\xe9\x4f\xa2\xfb\xd2\x9d\x1c\x41\xde\xfa\xd3\x8d\
+\x13\xdf\x6f\xb4\xcf\x94\xb6\x8c\x31\x59\x8f\xe3\x38\x36\xa5\xdf\
+\x74\x66\x03\x6d\xb4\x8b\x56\x8b\x55\x6b\xd0\xc9\x6e\x3a\xf6\xd6\
+\x3c\x5c\xfc\xcd\x87\x7b\xde\x38\x5c\x44\x30\xf0\xf3\x9d\x99\xeb\
+\xe0\x59\x1f\x75\xc3\x89\x13\x6a\x9d\x6e\xb3\xc9\x5a\xc0\x67\x4b\
+\x8a\xa1\xb9\xb6\x10\x37\xee\x85\x31\x16\x48\xe0\x8f\xeb\xff\x83\
+\x40\x58\xdd\x91\x49\xc5\xcb\xfa\x7c\x6b\xa5\xda\x60\x90\xd7\x64\
+\x0a\xfa\xc6\x55\xcf\x9b\xd1\x3f\x44\x6e\x1a\x1a\x02\x47\xd5\xc6\
+\x00\xf6\xd0\xd1\xac\x25\x59\x97\x64\x0f\xc8\x6b\x0c\x03\x34\x34\
+\x3a\xdb\x8a\xbd\x7c\xfd\x67\x04\xce\xd9\xf5\xb6\xe2\x6a\x41\xa3\
+\x7d\xa0\xff\xa8\xad\x16\x83\x80\xdb\xbf\xdf\x00\x47\x15\xc7\x1a\
+\x57\x8a\x10\x04\x45\x56\x69\x52\x8f\x65\x7f\xe2\x71\x09\x17\xfa\
+\x03\x03\x99\x58\xbb\x3e\x29\xf7\x72\x35\x1f\x67\xca\xdf\x4e\x61\
+\xa9\x96\x95\x38\xc5\x03\x2b\x58\xee\xb8\x6c\x72\xd6\x50\xce\xba\
+\x6b\x90\xbd\xb0\x40\xc4\xca\x32\x0d\x6c\x26\x21\x87\x4d\xcf\xb0\
+\x2b\x86\x53\xdd\xee\x21\x3a\x56\xeb\x3e\x5e\xe5\x95\x17\x97\x1d\
+\x7e\x0e\xbf\xbc\x7b\xf7\x59\x5d\xc9\xe5\xb7\x5c\x65\x55\x55\x16\
+\x19\xf5\xe5\x85\x3a\xd4\x55\xea\x64\xee\xbe\xe1\x09\x74\xd8\x9d\
+\x52\x30\x18\xff\xc6\xd3\xbe\x74\xcb\x7f\x8d\x15\x67\xde\xda\xcb\
+\x2a\xe7\x17\xca\x69\x96\x01\xde\xd3\x50\x80\xb8\xc4\xf0\x45\x97\
+\x07\x81\x60\x0c\xca\x64\xc2\xe3\xf4\x24\xde\xf6\x7d\x5d\x77\xfe\
+\x59\x41\xcd\xdb\x7e\x6a\xf4\x7d\x55\x27\xa7\x3c\x47\x15\xcc\xca\
+\xe6\xd9\x30\x99\xe1\xf1\x44\x0a\x6a\x95\x12\x20\xd7\xae\x9e\xa7\
+\x83\x41\x21\xe1\xec\x25\xe7\x8f\x0e\x4f\x62\x5f\xe0\xe4\x9a\x2b\
+\x53\x20\x1b\x3b\x95\xbe\xd3\x4d\xa9\xe9\xe0\x73\x76\xf7\x6f\xf7\
+\x8c\x87\xe6\x07\x4f\xae\x79\x4f\x26\xd0\xbf\xd1\xc9\x4a\xe7\x16\
+\xcb\xf6\xfb\xc7\xfd\x99\x62\x82\x29\xdf\x08\xab\x51\xc0\xba\xc5\
+\x22\xb9\x4e\xc2\xc0\xcd\x71\x74\x5f\x1d\xeb\x8a\x27\xd3\x9f\x86\
+\xcf\x36\x9d\x27\xf0\xd9\x04\x3e\x3a\x1d\xbc\x78\x7b\xcf\xbe\x74\
+\x5a\xda\x1a\x0e\x4e\x9c\x0a\x9f\x5d\xff\xa1\x4c\xa0\x5d\x7f\x9a\
+\x15\xcd\x2d\x45\xc0\xe3\x47\x24\x10\x1a\x54\xaa\x54\x85\x66\xab\
+\xd9\x22\xa8\x55\x54\xf6\x3a\x54\xcc\xd2\x40\xad\x60\xe8\xbb\xe9\
+\xc6\xb5\x3f\xdd\xe3\x81\x68\xf2\x3c\x59\x73\x01\x93\x17\x21\xcb\
+\x5e\x84\xa5\x25\xe6\x9d\xf3\x4b\x8c\xab\xc2\xa1\xe8\xc4\xe5\xeb\
+\x63\xaf\xd0\xad\x20\x77\x3a\x8e\xaa\x91\x69\x8d\x46\x44\x83\x21\
+\x39\x15\x49\x5a\xf3\x0c\x86\xfd\x86\x7c\x33\x34\x94\xba\x65\xb6\
+\x3c\x54\xd8\xb4\x08\x46\x12\xf0\xfa\x23\x70\xb9\x43\x70\x79\xc2\
+\x34\x8f\x53\x7f\xe0\x21\x9a\xb4\xb0\x16\x18\x30\xcb\x6a\x84\xc7\
+\xed\xc7\xf0\x88\xfb\xc8\xfd\x73\x6f\xb6\x4e\x05\x99\x2a\x32\xe3\
+\x7d\x02\x67\x8d\xc9\x9e\x16\x2f\xcd\x2b\x68\xe1\x88\x56\x14\x9b\
+\xb5\x26\x33\x54\x44\x62\xd1\x0b\x28\x27\x22\x85\x22\x57\x53\xc1\
+\x48\x2a\x9b\xfe\xf4\x9e\x69\x3e\x0e\x87\x1b\x8e\x51\xf7\xb7\xb1\
+\x78\x6a\x2f\xe1\x4c\xb5\x4f\x8e\xaf\x3f\xde\x9f\x01\x97\x7a\x77\
+\x7b\x27\x17\xa9\x52\x6b\x68\x38\xa0\xd6\x9b\x9a\xd5\xf4\x75\xbc\
+\x40\x6e\x12\x38\xfa\x22\x1e\x82\x92\x23\x51\xc8\x7a\xc9\x14\x43\
+\x6c\x22\x86\xa0\xcf\x47\x2e\xf6\xc9\x6d\x53\xea\xdd\xd5\xf7\x70\
+\x5c\xb8\x4c\x65\xb2\xbe\xbd\xde\xe9\x01\xe3\x56\x1c\xa5\xc6\xcf\
+\x76\x28\x04\x75\x8b\x32\x4f\x97\xaf\xd4\xe4\x81\x57\xa9\xe9\x6a\
+\x16\x90\x4e\x25\x21\x25\xe2\x90\xe2\x51\x24\xa3\x51\x8f\x94\x4c\
+\xc8\x8d\x9f\xf5\xef\x7d\xac\xf1\x3f\xfd\xb2\x5b\x76\xf8\xa9\x7f\
+\x5d\xa8\xb2\xff\xf5\xaf\xcb\x3f\x7c\x2b\x43\xae\x7f\x97\xfe\x23\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xa8\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x6f\x49\x44\x41\x54\x78\xda\x9d\x95\x0b\x48\x14\x51\
+\x14\x86\xcf\xb4\x64\x25\x1a\x45\x52\x56\x90\xf4\xdc\x1e\x2a\x99\
+\x99\x56\xab\x62\x54\x4a\xad\xa6\x59\x6e\x69\xda\x6a\x66\x8a\x96\
+\xa5\xd6\x88\xa6\x89\x88\xb4\x98\x96\xa9\x28\x3d\x48\xc5\x24\xcd\
+\x57\x9a\xa5\x25\xa6\xd9\x6a\x22\x3d\xcc\x1e\x14\x21\x41\x10\x52\
+\x56\x94\x10\x15\xba\xa7\xd9\x7b\x67\xd7\xdd\xd5\x6e\x8f\x03\xb3\
+\xf7\x9c\x7b\xee\xfc\xdf\x99\x73\xef\xce\x70\x60\x62\xf6\xd9\x0f\
+\x56\x0a\xc3\x23\xf8\x3f\xcb\x78\x12\xef\x98\x62\x38\xc1\x99\xae\
+\xb0\xcd\xea\x69\x5f\x6c\x35\xc5\xad\xd0\x7f\x31\xcc\xb2\x34\xfb\
+\x6b\xe5\xbb\xfd\x5f\x20\xa6\xe6\xf5\xab\xbe\xa3\xab\xa5\x4c\xc0\
+\x0a\x55\x37\x76\xc6\x3a\x82\xb9\x99\x44\x9f\xd4\x8e\x28\x3a\x1c\
+\x8a\xbe\xe1\xbc\x60\x1a\x0d\x82\xc3\xa9\x1e\x78\x96\xe8\xcc\x31\
+\x01\xcb\x32\xbb\xb0\x97\x77\x21\xfe\xa4\x3d\x16\xc0\xd9\x4e\x02\
+\x98\x20\x2c\x43\x41\x8a\x13\x47\x1c\x55\xc7\x11\x0d\xfc\x48\xfe\
+\x4c\xa6\x1c\x54\x5d\xf0\x3c\x69\x1d\x1b\xb0\x34\x5d\x8d\x0f\x93\
+\xd6\x11\xdf\x22\x63\x06\x58\xbb\xcd\x21\xcb\x38\x41\x1c\xb5\xe2\
+\x82\x14\x8a\x65\xdb\xdb\x48\x21\x64\xa1\x02\xfc\x86\x77\x02\x0a\
+\x4a\xab\x33\xd5\xf0\x22\x55\xc6\x06\x48\x4f\xb4\x63\xcf\x71\x37\
+\x52\xdd\xb4\x94\x69\xa0\x71\x35\xa7\x95\xeb\x4c\xa3\x21\x83\xeb\
+\xfc\x55\x10\xb6\x22\x18\xda\x86\xee\x41\xde\x94\x7c\x02\x75\xca\
+\xe8\x80\x57\xe9\x6e\x6c\xc0\xa2\xe4\x56\xec\x4e\xf5\x20\xbd\xb6\
+\x4a\x98\x2a\x94\x25\x02\x48\xf1\x48\x2e\x3b\xdb\x25\xb0\xdf\x29\
+\x14\x3a\x3e\x76\xc2\xd5\xba\x6b\x30\x18\xfc\x81\xe4\xd7\xa4\xdf\
+\x81\xd7\x99\x1b\xd8\x80\x05\xfc\x6d\xec\x4c\xdb\x48\x12\xb3\x23\
+\x2d\x85\xc6\x8a\x7b\x40\xaa\x47\x58\xe0\x68\x03\x07\x64\x4a\x68\
+\x1f\x50\x43\x63\x59\x33\x81\x0f\x44\x7f\x22\xe9\xb5\x69\x2d\xd0\
+\xaf\xda\xc4\x06\xd8\xc4\xdf\x44\x75\xba\x97\x3e\x46\x93\xc5\x28\
+\x9e\x24\x43\xd3\xed\xb9\x2c\xa5\x19\xde\xe4\x78\xb1\x01\xf3\x0e\
+\x35\x60\x5b\xa6\x9c\x8a\x70\xc6\x04\x1c\xe7\x46\x1d\x50\x3b\xba\
+\x27\x5d\x87\xb7\x67\xbd\xd9\x80\xb9\x51\x75\xd8\x7a\x72\x1b\xc9\
+\x48\x37\xa9\xc8\xdc\xcb\x5b\x3c\x3d\x00\x9b\xd9\xb1\x47\xe2\x35\
+\x78\x57\xe8\xcb\x06\x58\x87\x57\x61\x4b\x96\x3f\xf1\x6d\xbd\xa8\
+\x40\x5f\x33\x4f\xca\xb7\x13\xe3\xa7\x4d\x3c\xa9\xd8\xce\x53\xcc\
+\x0b\xb1\x56\x68\xe3\xb1\x6a\x18\x38\xbf\x83\x0d\x98\xa9\xac\xc0\
+\xa6\x9c\x00\xa3\x3f\x93\x71\x4f\xc6\xb6\x4e\x97\xf3\x8a\xab\x80\
+\xf7\xc5\xbb\xd8\x00\xab\xa0\x32\x6c\xcc\x0d\x22\x27\xd2\x45\x4e\
+\x2b\xbc\x7f\x9d\x27\x27\xd5\x79\xeb\x68\xac\xbd\xd3\x45\x8c\xbb\
+\x1b\x79\xc2\x93\xc7\x96\xc3\xe0\xe5\x20\x36\x60\xba\xa2\x04\xeb\
+\xf3\x42\x88\xef\xea\x4d\x05\x3a\xea\x69\x8f\x5d\x7d\xc4\xb8\x81\
+\xb6\x4c\x1f\xd7\x53\xa0\x4f\x4c\x29\x7c\xae\xdc\xcb\x06\x4c\xdd\
+\x7e\x11\x6b\x0b\xc2\xf4\x47\xd2\xa8\x3b\x06\xaf\x23\x32\xaf\x7b\
+\x45\x89\x79\xdf\xe8\x4b\xf0\xb5\x26\x8c\x0d\xb0\xf0\x39\x87\x55\
+\x45\xfb\x49\xc2\xd3\x8f\x56\xd8\x54\xcb\xff\x31\xd6\x3e\xd1\xce\
+\xc8\xf3\x30\xd4\x10\xc1\x06\x98\x6f\x29\xc4\x8a\x73\x91\xc4\xf7\
+\xf6\xa7\x02\x0d\xd5\x54\x50\xce\x88\xb5\xa6\x88\x28\x82\x6f\x37\
+\xa2\xd8\x80\xc9\x9b\xf3\xb1\xfc\x42\xb4\xd1\x02\xfd\xc1\x19\xe7\
+\x7b\x60\x78\xb0\x76\xef\x2b\x80\xef\xb7\x63\xd8\x00\x33\x8f\x5c\
+\x2c\x2b\x3e\x44\xfc\x80\x00\x5a\x61\x65\x05\xdd\xc4\xdf\xc6\x95\
+\xf4\x09\xf6\x84\xe6\xc2\xcf\xd6\xc3\x6c\xc0\x44\xf7\x1c\x2c\x29\
+\x3e\x42\xfc\xc0\x5d\x54\xa0\xfc\x0a\x15\x0c\x54\x30\x62\xc1\x42\
+\x94\xa7\x61\xb8\x3d\x8e\x0d\x90\xc8\xb2\xb0\xb8\x34\x61\xcc\x67\
+\xd1\xb4\x1d\x3a\xdf\x50\x44\x19\x9c\x0d\x23\xea\x04\x36\x80\x5b\
+\xab\xc2\xf0\x88\x2d\xe0\xb2\x7e\x39\x48\x24\x13\x46\xfb\x8f\xc6\
+\xab\x4d\x6f\xec\x7d\xdc\x0f\x67\x4e\x55\x01\x76\xf1\x6c\x00\x38\
+\x9f\xdc\x2d\xfc\x9e\x16\xae\x59\xf0\xef\x96\x0f\xdd\x89\x07\x0d\
+\x27\x7e\x01\xc6\x8c\x60\x28\xd2\xef\xfe\x96\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x1b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xe2\x49\x44\x41\x54\x78\xda\xad\x54\x6b\x6c\x54\x45\
+\x14\xfe\xa6\x34\x6c\xa4\x16\xab\x36\xd2\xd6\x96\xbe\x36\x84\x12\
+\x89\x2f\xec\xf6\xb9\x29\x34\x06\x4c\xaa\xa6\x85\xa4\x80\xc1\x1f\
+\xfa\x03\x23\x89\xcf\xf2\x68\x04\x4c\x44\x79\x36\x24\x45\x1b\xe3\
+\x46\x9e\x6a\x82\x46\x88\x09\x0d\x81\x1f\xe5\xb1\x7d\x2d\x88\x1a\
+\x35\x90\x62\x79\x68\xdd\xb5\x5b\xd8\xae\x2c\x2d\x85\xd2\xbd\x7b\
+\x3c\x73\x77\xee\xf6\xee\xb2\x9b\x40\x71\x72\x93\x39\xe7\xdc\x39\
+\xe7\x9b\x6f\xbe\x33\x23\xd0\x74\x89\x70\x3f\x43\x66\x0b\x65\x37\
+\x14\x88\xd8\xdf\x02\x5b\x7a\xa9\xc1\x9e\x81\x4d\x25\x0f\x4e\x18\
+\xa3\xd1\x35\x8c\x26\xe7\x00\xb0\xda\x1a\x07\x60\x63\x0f\xbd\x6d\
+\xcf\xc4\xd6\xf2\xa9\x08\x4d\xa0\x78\x12\x33\x58\xd9\x19\xc0\x0e\
+\xa7\x17\xf8\x60\x66\x1c\x80\x0d\x67\xe9\xcd\xca\x4c\x34\xd9\x1f\
+\x46\x90\xa2\xfe\x44\x1f\x01\x8d\xc7\x89\xed\x90\xb2\x93\x79\x5a\
+\x71\xd4\x87\x7d\xed\xff\x00\x1b\x9f\x8c\x03\xb0\xfe\x57\x7a\xad\
+\x32\x0b\xcd\xd5\xe9\xb8\xc9\x59\xa7\x3d\x37\x71\x4b\x23\x8c\x51\
+\x08\x14\x0c\x2f\xd2\x30\x5e\x34\xc4\xff\x42\xba\x4f\xb0\x5b\xa7\
+\x22\x75\x32\xb0\xd4\x71\x11\x27\x7e\x76\x03\x8e\xaa\x38\x00\x8d\
+\x67\x68\x69\xc5\xe3\xf8\x6c\x41\x06\xfc\x5c\x70\x88\xb3\x9f\x6e\
+\xb9\x3c\x61\x3d\xa2\x58\xeb\x53\x83\x8b\x6a\xcb\xb3\xe0\x78\x31\
+\x07\x1e\x06\x38\xf8\xcb\x35\x7c\xe4\xf4\xe1\xff\x12\x5e\xe0\xad\
+\x76\x7a\x81\x19\xec\xae\xcd\x47\xdf\x6d\xc0\xcb\x20\x2f\xb5\x9c\
+\xc7\xfd\x0a\xbf\xaa\x2b\x80\x66\x16\x5e\xe0\x8d\x36\xaa\xaa\xc8\
+\xc6\x7b\x73\xa7\xa3\x30\xcd\x82\xa4\x64\x81\xa2\xad\xe7\x70\xaf\
+\xc2\x9b\x6d\x29\xfc\xfb\xce\x7f\xf1\xb9\xb3\x9f\xdd\xd7\x8f\x90\
+\xad\x2c\x07\x63\xb7\x83\x08\x78\x03\x18\xfe\x7b\x10\x03\xd9\x05\
+\x30\x84\xbf\xc5\x14\x7a\x7c\xa3\xb1\x47\x7b\xc7\x91\x1b\x38\x33\
+\xd3\x2d\xb0\x24\x01\xef\xb6\xf9\xb0\xb3\xdd\xc3\xb1\x65\x87\x68\
+\x76\x69\x0e\x82\x63\x1a\x86\xfb\xaf\xe3\x46\x9f\x1b\xfe\xdc\x22\
+\xbc\x52\xc9\xc2\xcf\xcf\xc0\x88\xa6\x92\xc5\x9d\x05\x13\x8d\x94\
+\x24\xd9\xba\x5e\x7c\xa3\x03\xd4\x1f\x20\x6b\x69\x2e\x42\x41\x0d\
+\x37\x3c\x83\x78\xd9\x96\x0b\xc7\x99\x21\xd4\x55\xb0\xf0\x35\x39\
+\x7a\x57\xfd\xa1\x18\xdc\xcd\x98\xc1\x0c\x52\x19\x60\x79\xab\x1b\
+\x07\x3a\xdc\x0c\x50\xb7\x9f\xb2\x4b\xf2\xa0\x31\x83\x51\xaf\x1f\
+\xc7\x36\xd7\xe0\xa9\xc6\x0e\x48\xe1\xf7\xb0\xf0\x01\x93\xca\xb1\
+\x47\x2f\x0d\xc9\x2c\x96\xd1\x14\x8e\x2d\xff\xe1\x32\x0e\x77\x4a\
+\x06\x35\x5f\x51\x7a\x69\x01\x20\x01\xfa\xaf\xe0\xfb\x6d\x0b\x31\
+\x7f\xd5\x31\x48\xe1\x57\xcf\x9b\x8e\x27\x1e\xb5\xe0\x81\x49\xe2\
+\xae\x76\x6f\x8c\x0b\xc3\x1a\xd6\x1c\xba\x84\x13\x9d\x92\xc1\x82\
+\x5d\x94\x5a\x52\x08\xc1\x00\x63\x03\x7e\x7c\xcd\x00\x0b\x1b\x8e\
+\x42\x0a\x4f\x6a\xcb\x42\xed\x9b\x74\x8b\xf4\x78\x58\x93\x28\x3e\
+\x2a\xae\x62\xfc\x9d\xea\xee\xe3\x15\xf3\x1c\x64\x29\xb3\x42\x68\
+\x21\x68\xfd\x57\x71\x78\xc7\x62\x3c\xbf\xa2\x15\x52\xf8\xa8\xbe\
+\x34\x80\x28\x0c\xa5\x7b\x42\x3a\x06\x88\x88\xac\x33\x36\xf6\x7b\
+\x97\x04\xb0\xb7\xd0\xa4\xe7\x0a\xf9\x76\x70\xe4\x8a\x1f\x3f\x3a\
+\x16\xe3\x99\x57\x0f\x42\x0a\x6f\xa4\x7e\x58\x9d\x8b\xaa\xfc\x34\
+\xa4\x4d\x49\x0e\x43\xaa\x02\x44\xa6\x0e\x63\xbb\xe7\xea\x08\x96\
+\xec\xef\x51\x5c\x81\xde\xee\xbf\x78\x2e\x6b\x9e\x2d\xd2\x52\x7e\
+\x13\xf9\x8f\x41\xf0\x5d\x70\x7f\x51\x8b\xcc\x45\xdf\x42\x0a\x6f\
+\x34\xf7\x4f\xef\xd8\xf4\x79\xda\xb3\x5b\xf4\xd0\x77\x2d\xf5\xb0\
+\xdb\xf2\x22\xad\x4b\xa6\x8b\x30\x67\xfb\xa9\x08\x19\xb7\xeb\x4f\
+\x75\x06\xb6\xed\x8f\x20\x44\x83\xd0\xf8\xad\x18\xb9\x0e\x58\x67\
+\x41\x0a\x2f\xd4\xf1\xb8\x56\x96\xeb\x09\x85\xc5\x61\x80\xbd\x9f\
+\xd6\xa3\x82\x01\x22\x0f\x1a\x29\x52\xec\x17\x6f\xeb\x54\xf5\x05\
+\x7c\xae\x8b\x88\xdf\x1e\x86\xf0\xca\x75\xad\xb1\xeb\xf3\x2c\x5b\
+\x18\xe0\x4b\x06\x28\x2b\xce\x8b\x9b\x5a\xb2\xd9\x19\x91\x7d\xa8\
+\xfb\x42\x02\x00\x43\x78\x5d\x59\xc2\xb9\x75\x73\xf5\x2d\x16\x28\
+\x06\xfb\x4c\x0c\x68\xbc\x07\xf4\x51\xf4\xf1\xf1\x08\xa3\xd1\xae\
+\xde\x04\x00\x86\xf0\x93\x93\x75\xd7\xb3\xa1\x5a\x4f\x9a\x36\xc7\
+\xa4\x01\x6b\x24\x4c\x8f\x13\x29\x90\xac\xf5\x6d\x91\x32\x5a\xc7\
+\xf9\x04\x00\x86\xf0\xd6\x4c\x88\x14\x0b\xae\x7d\x52\x3d\x5e\x2c\
+\xe6\xc5\x33\x0a\x53\x98\x2c\x1e\x5a\x6b\x02\x38\x79\x16\x89\xaf\
+\xa8\x14\x9e\x30\x18\x7e\x0b\xc8\xf4\xda\x99\x14\x8d\x02\x35\xf5\
+\x6e\xe4\x12\x02\xff\x01\x99\x94\xa9\xf7\xf8\xcf\x4e\xdd\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x76\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x3d\x49\x44\x41\x54\x78\xda\x7d\x95\x7b\x6c\x54\x45\
+\x14\x87\xcf\xcc\xdc\xdd\xbd\xfb\xe8\xee\x52\xa4\x2b\x7d\x20\x41\
+\xa9\x01\xa1\xa5\x21\x6a\x35\x96\x56\x6a\x2d\x62\xd5\x68\x30\x44\
+\x09\x3e\x28\xf0\x87\x0f\xd4\x6a\x4a\x83\xa6\x46\x94\x40\x49\x8d\
+\x89\x86\x98\xf0\x52\x89\xc1\xa8\xa5\xd1\x88\x15\x2a\xe5\xa9\x82\
+\x60\x95\x2d\x4d\x09\xb4\x94\x47\x5f\xb4\xb4\xcb\x6e\x77\xdb\xee\
+\x6e\xf7\xde\xeb\x99\xb9\xb7\xa5\xbb\x22\xd3\x9c\xcc\xce\xdc\x99\
+\xdf\x77\xce\x99\x33\x53\x02\x46\x8b\x1e\x81\xdd\xd8\x2d\x37\xe7\
+\x83\x02\x37\x69\xf8\xdd\x8c\xdd\x21\xb4\x76\x5c\xb3\x1c\x6e\xd1\
+\x70\xed\x17\xb8\xe6\x65\xfe\x9b\x8c\x4d\x86\x0f\x43\x98\xa5\xe6\
+\x9d\x57\xba\x8e\x3d\x28\x3f\x0c\xa1\x89\x1b\xf0\x9b\x15\x24\xbb\
+\xd7\x9c\xfd\xd9\xcc\x91\xcb\xdb\x80\xf9\xfe\xfe\x15\x94\x48\x09\
+\xae\x8b\x26\xac\x63\x2c\x35\xbf\x51\xe9\x3e\x32\x4b\x2e\x00\x4b\
+\x1c\x60\xa8\x01\xfc\xd6\xbc\x6a\xd7\xe8\x85\xda\x8e\x58\xf7\x1f\
+\xf9\xf6\x42\xb8\xc8\xe7\x87\x1b\x80\x11\xd9\x53\x6b\xc9\xde\xf8\
+\x24\xb1\xcd\x82\xa0\xf7\x35\x90\x64\x37\x68\x3e\xef\x29\x88\xf4\
+\x2f\xb2\x2f\x04\x9f\xb1\xdf\xca\xa6\x64\x1f\xb4\xcc\x5a\x96\x3b\
+\x7c\xb4\x3c\x80\xfb\xdd\x71\x80\xc1\x7a\xf0\x27\x15\x54\xb9\x40\
+\x53\x21\x7c\x6e\x4f\x28\xd6\xfb\x57\x09\x4e\x9f\x24\xf6\x8c\x7d\
+\xb6\xec\xf7\x17\x10\x79\x1a\x0e\x6d\x08\x78\x1d\xa8\x75\x12\x30\
+\xd9\x05\x6a\xff\x99\x1e\xd5\xdf\xb6\x00\x3f\xf8\xa8\x73\xda\x01\
+\x6b\x56\x69\x0e\x61\x32\x84\x8e\xac\x0d\x24\x15\x25\x00\xfc\xfb\
+\xc0\xef\x2a\xf8\xc8\xa5\x8f\x18\x0c\x9d\xad\x89\xa9\x91\x40\xaf\
+\x7d\x6e\x59\x1a\x35\xa5\x80\x46\xec\x40\xd0\x82\x4d\x6b\x50\xdc\
+\x8d\x10\x37\x30\x8b\x0b\x46\xaf\xb5\x84\x95\xeb\x6d\x57\xec\x39\
+\xab\x32\xa9\xc5\x29\x76\x07\x0e\xbf\x17\x70\x2f\x4a\x00\x0c\xec\
+\x05\xff\xa4\xc2\x4a\x17\xd1\xf8\x88\xa7\x8f\x82\xaa\x99\x81\x32\
+\x5c\x47\x1c\x68\x76\x61\xc1\xa6\x37\x80\xa2\xf7\x1c\x22\x40\xb2\
+\x53\x38\xc4\x81\x44\xc8\x69\xe0\x3b\xb4\x3e\x30\xf9\xf1\x04\x40\
+\xef\x8f\xe0\x4f\x29\xac\x70\x69\x62\xca\x84\xde\x5a\xd0\x6b\x2b\
+\xf6\x5c\xdc\x66\x40\x1c\x10\x3c\xf3\xa6\xf0\x9c\x0b\xf3\x9e\x58\
+\x92\x80\x9a\xed\x40\x25\x59\xc8\x69\xf8\x77\xad\x61\x53\xc0\xf3\
+\x54\x02\xa0\xab\x16\xfc\x53\x1f\x29\x73\x71\x0f\x44\x04\x84\x6f\
+\x40\x00\xb5\x8f\x8b\x03\x4d\x42\xc0\x5b\x28\xec\x14\x00\x8a\xe2\
+\x8c\x03\x4c\xb8\x0e\x73\xaf\xa1\x1a\xcf\x40\x77\xc3\x27\x81\xb4\
+\x67\x12\x00\x97\xbf\x03\x7f\x46\xd1\xab\x3a\x80\x98\xd1\x73\x2b\
+\x6e\xb0\xc5\x89\x13\x82\x80\xe6\xb7\x6f\x08\xcb\xd8\x9b\x1c\x40\
+\x4c\x32\x46\x80\x11\x1b\x49\xba\x52\xbf\x25\x70\xc7\xd2\x04\x40\
+\xdb\x6e\x18\x9c\x51\x5c\x9a\xc4\x3d\xd0\x30\x3d\x84\x62\x04\x1c\
+\x02\x28\xcc\x1c\x38\xa7\x03\x42\x67\xd7\x61\x4a\x1c\x08\xc1\xb4\
+\x98\xec\x08\xc2\xc3\x97\x30\x02\xc9\x24\x74\xf8\xfe\xf6\xfa\x1d\
+\xc1\x3b\x9f\x07\x67\x1c\xe0\xdc\x2e\x18\x9e\x59\xbc\xcc\x2a\x66\
+\x30\x02\x2e\x2e\x8c\xa2\x87\xc4\x09\x1a\xd5\xa3\x18\x3a\xf7\xa1\
+\x48\x09\x35\xdb\x84\x31\x9e\x1e\xcc\x3f\x65\x26\xd0\x34\x3d\x86\
+\xf3\xfb\xbf\x1e\xb9\xfb\x05\xac\xe9\x89\x80\xe6\x9d\x10\x99\xfd\
+\xd8\x12\xb3\x38\x02\xca\x01\x16\xbd\x72\xa8\x51\x41\x28\xce\x6d\
+\xb8\xad\x1a\x01\x72\x9c\x11\x86\x29\xa5\x12\xae\xd3\xe5\x5a\x7e\
+\xa9\x89\xce\x59\x91\x70\x93\x4f\x6f\x85\x58\xd6\xe2\x12\xa6\xc7\
+\x69\xd6\x0f\x59\x44\x60\x40\x0c\x1b\xb9\xf8\x39\x7a\x6c\x41\x61\
+\x34\xc9\x2c\x8c\xa0\xf7\x02\x60\x34\x6f\xdd\x5e\x25\x67\x35\x48\
+\x71\x80\x53\x5b\x40\x9d\x5f\x52\xa4\x8f\x89\x49\x8f\x80\x5a\xf5\
+\x12\x15\x10\x1d\x14\xee\xd8\x25\x3c\xa6\x98\x73\x21\xcc\x21\x94\
+\x21\x80\x8d\x03\x1a\x7f\x3e\xa0\xdd\xfb\x0a\x5e\xa4\x89\x80\xe3\
+\x9f\x42\xf4\xfe\x92\x87\x4c\xe3\x00\x7e\xc8\x3c\x4a\x6a\x00\x8c\
+\xf3\x08\xf7\xec\x41\x71\xc9\xf0\x9a\x89\xdc\x13\x42\x71\x4c\x45\
+\x01\xf2\x0c\x9f\xdc\xfb\x9b\xf6\xc0\x9a\x04\xc0\xd1\x8f\xc1\x3b\
+\xaf\xe0\x9e\x2c\x87\xcb\x86\x8b\x50\x80\x5a\x74\x00\xb3\x8a\x0b\
+\xc7\x01\x04\x61\xd1\xbe\xfd\x38\xc7\x74\xaf\xb1\x27\x84\xf7\xfc\
+\x02\x20\x04\x2f\x82\xaa\xa8\x70\xbc\xae\xb1\x35\xaf\x0c\x32\xe3\
+\x00\x07\xab\xe0\xcb\x99\xf3\xd2\x5e\x4c\x9b\x9e\x6c\xa4\x48\x32\
+\x0e\x1a\x23\xa1\xc6\xad\xc6\x94\x8d\xfa\x7e\x47\x51\xdc\xc6\xbd\
+\xa7\xe8\x24\x25\x3a\x84\x80\xb8\x07\x3d\x97\x06\xe0\xbc\xb7\xeb\
+\xab\x85\xe5\xf0\x52\x1c\xa0\x7e\x03\x94\x7a\xd2\x93\xb6\xcf\xbd\
+\x2f\x55\xbc\x43\x1a\x7f\x2e\x18\x17\xe6\x59\x33\xaa\x0a\x6f\xab\
+\x12\x38\x2d\xbe\xf3\x94\x88\xcd\x08\xe1\xe2\x84\xef\xc1\xbe\xf9\
+\xcf\x6e\xe8\xed\x0e\xae\x7c\x74\x1d\xec\x88\x03\xd4\xad\x87\x74\
+\x49\xa2\xdf\xcf\x99\x3f\x39\xd7\x93\xae\x3f\x60\x7a\x24\x3c\xc7\
+\x58\xe3\xa2\xb2\xcc\xa0\x0c\xb5\x8a\x08\x44\x45\x0a\x23\x42\x9c\
+\x8f\xaf\x76\x0d\x41\x73\xe3\xc0\x89\x58\x4c\x7d\x76\x71\x25\x74\
+\xc6\x01\x78\xfb\xa9\x12\x56\xdd\xe6\xb1\x6c\x9d\x9d\xe5\x06\x87\
+\x8b\xa7\x87\x19\xe2\x92\x78\x00\xf9\x58\x89\x74\x8b\x27\x4d\xe4\
+\x5c\xbf\xf6\xfc\x27\x84\x02\x31\x68\x69\x1a\x84\xfe\xbe\xc8\xea\
+\x27\x3e\x80\x6d\x63\x9a\x71\x80\x1f\xde\x15\xe7\xb4\x29\x2d\x43\
+\x2e\xcf\x9c\xed\x00\xa7\x93\xdf\x3b\x2a\x84\xc5\x99\x60\x54\x6a\
+\x74\xc0\x48\x8d\xbe\x9d\x33\x82\x21\x05\x5a\x5b\x86\xa1\xb3\x23\
+\xb2\x19\x27\x2b\x9e\xde\x20\x8a\xe9\xbf\x00\xde\x6a\x2a\x20\x19\
+\x27\xd7\x4e\xf1\x98\xca\xa7\xdf\x25\x43\x5a\xba\x2c\xbc\xe4\x87\
+\x29\xce\x46\x19\x06\xbd\x18\xf5\x34\x75\x75\x8e\xc2\xa5\x0b\x51\
+\xe8\xeb\x8b\x71\xf1\xaa\x25\x1b\xf5\x7f\xa1\xff\x0b\xe0\xed\xdb\
+\x72\xf1\xa4\xac\x94\x18\x59\x71\xfb\x54\x96\x9b\xe2\x91\x20\x39\
+\x59\x02\xbb\x83\xd7\x7a\x0c\x86\x42\x2a\xf8\xae\xab\xd0\xd7\xab\
+\xc0\xd5\x1e\xf5\x84\x12\xd3\x76\x22\x72\xfb\xd2\xcd\x37\x3c\xbf\
+\x25\x60\xac\x7d\xf3\x0e\xa4\x63\x57\x8c\x96\x87\x96\x83\x36\xc3\
+\xf8\xd4\x8e\xf6\x0f\xda\x31\xb4\xfd\xcf\x55\xeb\x07\x7a\xb3\xf6\
+\x2f\x13\x70\x96\x28\x10\xe0\x48\x4b\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x01\x79\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x01\x40\x49\x44\x41\x54\x78\xda\xed\x93\xbb\x4a\x03\x41\
+\x14\x86\xbf\xc9\x66\x13\xdd\x04\xc1\x46\x83\x85\x20\x16\x16\x22\
+\x82\x85\x22\x36\xbe\x80\x4f\xe0\x9b\x88\x8d\x85\xaf\x20\xc4\x57\
+\xd0\xc2\x22\xad\x08\x1a\x1b\x0b\x83\x8a\x10\xbc\x22\x98\xb8\xe8\
+\x1a\x4d\xa2\x26\xd9\x4b\x8e\x1b\x12\x21\x45\x40\x58\x10\x54\x76\
+\x8a\x61\x86\x99\x73\xbe\x33\xff\x7f\x46\xf1\xc3\x43\x85\x80\x10\
+\xf0\x07\x00\xb2\xbf\x2b\x1c\x65\x21\xbd\x81\x5b\xa9\x60\x7b\x0e\
+\x4d\xf1\x02\x25\xf3\xfc\x30\xc7\x15\x1c\xf1\xd7\xcd\x76\xf5\x4a\
+\xf2\xa7\xc2\xc4\x14\xd8\x0d\xa8\x94\xe1\xee\x06\xcf\xb2\x02\x01\
+\x1c\xcb\xa4\x76\x7e\x42\xe3\xf6\x0a\xa5\x45\x51\x3b\x19\x1f\x70\
+\xb8\x27\xcc\x2d\x80\x69\x42\xf1\x1e\xd7\x3f\xb4\x1f\xcd\x6f\x54\
+\x95\xde\x80\x87\x02\xb5\xb3\x63\xbc\xea\x1b\xf1\xb1\x71\xb4\xad\
+\x6d\x54\x6d\x79\x49\xfa\x56\xd7\xb1\xb3\x07\xd8\x4f\x05\xea\x97\
+\x17\xb8\xa5\xe7\x00\xf5\x0b\x5e\xe9\x15\xb7\x5a\x46\x1f\x1a\xc6\
+\x98\x9c\x46\x6d\xa6\x51\x45\x1d\x31\xd6\x56\xa8\x66\x32\xb8\x2f\
+\x16\xcd\x8f\xf7\x20\x56\xb6\xe7\x68\x14\x6d\x60\x10\x3d\x95\x42\
+\x1f\x19\xa5\x5f\x29\xd4\xb5\x42\xf4\xc5\x19\xea\xb9\x5c\xfb\x52\
+\xcc\xd7\x4e\xc5\x02\x79\xd0\x02\x44\x8c\x04\x91\x78\x02\xcd\x48\
+\x92\x9c\x9f\x45\xe5\x5b\x6f\xfb\x6a\x56\xe9\x38\xdf\x51\xb9\xbb\
+\x87\xbb\xf7\xbd\x1c\xe8\x15\xa3\x25\xf4\xff\xf0\xd1\x42\x40\x08\
+\xf8\xfd\x80\x4f\x42\x61\x75\x4f\xda\xf9\x29\x5c\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x40\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x07\x49\x44\x41\x54\x78\xda\xb5\x54\x5d\x6c\x14\x55\
+\x14\xfe\xee\xec\xec\x6f\xb7\x5b\x4a\x69\xa1\xb6\x0b\x2c\xdd\xfe\
+\xd8\x68\x84\x20\xea\x8b\x11\x24\x25\x9a\x26\x18\xa0\x90\x90\x00\
+\x2d\x1a\xad\x89\x0f\x3c\x10\x13\xc3\x93\xbe\xd8\xa4\xfe\xc4\x44\
+\x43\x4c\x49\x0d\x09\x4a\xd4\x58\x0c\xb5\x98\xa0\xa6\xc0\x03\x98\
+\x00\xb6\x90\x50\xac\x96\x96\xed\x8a\xdd\x6e\x77\x6d\x77\xeb\xee\
+\xce\xce\xce\xcc\xbd\x9e\xdd\x9d\x6a\x43\x59\x6a\xa4\xde\xcc\x97\
+\x99\x39\x73\xe6\x7c\xe7\x3b\xe7\xdc\xcb\xf0\x3f\x2f\xf6\x6f\x1d\
+\xc5\x00\x0e\xc1\x59\xf5\x01\xd4\xf0\x39\x08\xbd\x89\x6d\x80\xb1\
+\xb4\x04\xd7\xad\x3f\xa2\xf1\x9d\xa7\x10\x3e\xad\x89\xd0\xb9\x16\
+\x69\x13\x7a\x97\x8c\x40\x5c\x45\x13\xca\xb7\x7c\x8d\xd5\x9f\x15\
+\x21\xf1\x3d\x8c\x9f\x5b\x8f\xca\x4f\xe0\xb5\x25\x23\xe0\x57\xd0\
+\xc9\xea\xbb\x5e\x47\xf1\xcb\x80\x1e\x80\x3e\xbc\x75\xc4\x88\x8d\
+\x35\x39\x9e\xc6\xf8\x03\x13\xe8\x97\x51\xcd\x8a\x56\x9c\x95\x6a\
+\xfb\x1b\x61\xf5\x91\x45\x22\x8e\x76\xe8\xc1\x4f\x77\x39\x9f\xc1\
+\xa9\x07\x26\xd0\x2e\x61\xbb\x54\xbd\xe7\xb4\xe4\x3d\x4a\x6f\x27\
+\x08\x1b\xc1\xe3\x41\x64\x86\x0e\x7e\x61\x64\xb4\x7d\xee\x2d\xd0\
+\xff\x33\x81\x7a\x11\x56\x66\x93\x4e\xca\x75\xc7\x5b\x98\x67\x25\
+\x59\xbe\x21\x64\xef\xdb\xa0\x5c\x7b\x49\xd7\x22\x37\x6a\x4b\xb6\
+\x21\x70\x5f\x02\x31\x88\x27\xc1\xa4\x2a\x21\x04\x17\x9c\x41\x08\
+\x02\x17\xa0\x8b\xea\xc3\x5d\xf0\x34\x76\xdb\x1e\x39\xe6\x00\xfa\
+\xc9\x30\x41\xc8\x10\x76\x41\x0d\xf6\x20\x3d\xd2\xdd\x2b\x84\x74\
+\x85\x1b\x7c\x94\x74\x24\x85\x80\x4c\x50\x38\x67\xbf\x72\x2e\x22\
+\x95\x3b\x31\xcb\xc4\x50\x89\x06\xef\xf3\xb2\x30\xea\xe8\xc7\x15\
+\x04\x1b\x8d\x8d\x05\x02\x1a\x91\x69\x90\x1c\xab\xc1\x5c\x1a\xd9\
+\xbf\x25\xc8\x59\x5d\x84\x2a\x08\x6d\x03\xf4\xd8\x10\xf9\xa6\x61\
+\x64\x26\x21\x94\x69\xf2\xa7\xac\x58\x02\xc2\x98\x40\x72\x6c\xfc\
+\xd6\xca\xe6\x4c\x2d\x33\x06\x9d\xc3\xac\xa6\xb9\x9e\x15\x77\x66\
+\x2b\x4e\x18\x24\x50\xc2\x28\x32\x03\x66\x33\x3e\x4b\x98\xcc\x35\
+\x18\xb9\xfd\xa5\xe6\x7a\x01\x54\xe6\x13\xca\x2d\xc3\xac\x78\x14\
+\x46\xaa\x07\xd1\xf3\x97\x95\x55\xcd\x9a\x8b\xd1\x94\x78\x49\x52\
+\x17\x7b\x68\xf3\x73\x72\xf5\x11\xf2\xe9\x23\xa7\x30\xc1\x6a\xfe\
+\xc0\x4c\x12\xc3\x84\xb8\xeb\x79\x8e\x94\x93\x5b\x18\x4a\x30\x84\
+\xf8\x8d\x48\x50\x4f\x1b\xad\xde\xbd\x38\x9f\x6b\xb2\x7a\x09\x32\
+\xd7\xf1\x36\x2b\x5d\x73\xd8\xe6\xdf\x2e\x31\xc7\x1f\xf9\x1f\xb2\
+\x03\xa2\x4f\x93\xb0\x10\x21\x4a\x26\x7a\x97\x97\x01\x16\x52\xc8\
+\x48\x1d\xa3\xc0\x9c\x54\xf3\x38\x44\x6a\x06\x89\x80\x86\xf8\x18\
+\x7e\x20\xde\x36\x0a\xfe\xfb\x82\x29\x4a\xf4\x63\x37\x1c\xf6\x0e\
+\x47\xdd\xe3\x35\x96\x32\x3f\x90\xbc\x08\xa4\x6e\xe5\x13\x9d\xbf\
+\xb8\x79\x17\x94\xbd\xec\x80\x9e\x4c\x61\x66\x04\x86\x32\x85\x4e\
+\xc9\x82\xb7\x28\xb8\x5a\x70\x4c\xe3\xdf\xc1\xcf\x85\xf5\x98\xfb\
+\xe1\x55\x9b\x65\x47\x28\x9f\xf5\xdc\x9a\x4f\x94\x7d\xd6\x68\xd3\
+\x19\x2e\x44\xae\x27\x03\x99\x84\x38\xb4\x76\xff\xc2\xf3\xe9\x9e\
+\xfb\x20\x7a\x06\xef\x7a\xfc\x38\x6c\x2d\x99\x9f\x2d\x16\x12\xa5\
+\xa9\x82\xc4\x3f\x75\x13\x17\x32\x09\xec\xf0\x1d\xc0\xcc\xa2\x04\
+\x91\x5e\x54\xc8\x2e\xf4\x79\x6a\xb0\x49\xb2\xdf\x45\x30\x07\x8b\
+\x69\xa7\xde\x73\x85\x08\x02\x18\x4d\x46\xf1\xac\xff\x20\x82\x8b\
+\x12\x4c\xf6\x60\xbd\xb3\x02\x83\x1e\x9f\x19\x84\x99\x43\x02\x33\
+\x70\xca\x24\x71\x12\x94\xbc\x8a\x08\x4d\xf0\x74\x00\x1b\x1b\x5e\
+\xc5\xc0\xa2\x04\xa1\x53\xd8\xe7\xf1\xe2\x84\x2b\x7b\x22\x68\x66\
+\x70\xea\xa5\x41\xa5\xf8\x93\x02\x39\x69\x88\xec\x96\x7c\xe0\x5c\
+\x02\xf4\x2d\x36\x4b\x2a\x46\x71\xa0\xfe\x95\xdc\x61\x55\x98\x60\
+\xe2\x2b\x3a\x34\xac\xf8\xb2\x74\x0d\x5a\x6c\xb6\x7f\x82\x27\x93\
+\xc0\xcc\x6d\x84\xb4\x34\x3e\x92\x24\xec\x2e\xf5\x61\xbd\xc7\x43\
+\xdf\x66\xf3\x6a\x12\x54\xaa\xd0\x38\x3a\xea\x5e\xc4\x91\xfb\x12\
+\xfc\xf6\x39\xec\x36\x37\xee\x54\xf8\xe8\xcc\xa0\xec\x33\x84\x78\
+\x14\x5a\x22\x8c\x4f\x98\x05\x6f\xf8\xf6\x23\x36\x7a\x1c\x25\xba\
+\x8a\xf7\x3c\x95\x68\x2b\xab\x86\xc5\x4a\x49\x64\x48\xcd\x9d\xdb\
+\xe8\xd3\x14\xbc\xd0\xd0\xfe\x77\xd7\xee\x49\xf0\x98\xab\x1c\xd7\
+\x96\xaf\xa5\xe4\x02\x14\x7c\x0a\x57\x35\x15\x6f\xd6\xb4\xe1\xcc\
+\x7c\xbf\x91\x6e\x30\xb2\xef\x74\x14\xe3\xc3\x72\x1f\x2a\xdd\x15\
+\x40\xf0\x27\xa4\x94\x38\x96\x53\x1f\xd4\x82\x04\xc1\x93\x68\xb0\
+\xd8\x30\x40\x65\xb2\xa7\x63\x78\x9f\xd4\x77\xac\x6b\xc5\x34\x0a\
+\xac\xe1\x8f\xb1\x4e\x92\xd1\xe5\x2e\xc3\x56\x0a\xfe\x0b\x29\x7b\
+\xb4\xbe\x3d\xd7\xb9\xc2\x4d\x5e\xea\xf5\x17\x35\xc2\xb3\x28\xa5\
+\x52\x77\x24\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x4f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x16\x49\x44\x41\x54\x78\xda\xb5\x55\x0f\x4c\x55\x55\
+\x18\xff\x1d\xb2\x1e\xbe\xde\x7b\xb4\x9e\x4e\x1f\xe0\x93\x37\x45\
+\x60\x0f\x44\x74\xac\x8c\x6a\x4b\xcd\x04\x92\x94\xc5\x2c\x70\xd3\
+\x96\x9b\x8e\x45\xcd\x6c\x33\xd9\x74\x8c\x35\x58\xad\x7f\x94\x63\
+\xb3\x5c\xb1\xe5\xb3\x52\x61\x60\x22\x65\xe9\xd6\x2a\x2b\x33\xdb\
+\x58\x8e\xe0\x31\x40\x30\x6a\xf2\x47\x53\x78\x79\xef\xb9\xd7\xd3\
+\x77\xff\xbc\xfb\x2e\x88\x9b\x8b\x3a\xdb\xd9\x39\xf7\xfb\xce\xf7\
+\xfb\x7d\xe7\x77\xbe\xf7\x3d\x86\xff\x79\x30\x6f\xc1\x01\xc1\x04\
+\x20\x98\x69\xa0\x29\xa2\x5e\xda\x30\x66\x7c\xdb\xed\x2c\xe6\x36\
+\xec\x22\x66\x64\x36\xbb\xfe\x3d\x7b\xed\x41\xf1\x47\xcb\xd3\x96\
+\x47\x5f\x6c\x68\xcc\x3c\x19\x05\xd1\x93\x99\x04\x34\x55\x02\x1a\
+\x86\xaf\xe8\x63\xb0\x39\xeb\x0f\x89\xfe\x23\x25\x78\xf4\xd3\xc1\
+\xff\x54\x9a\x2f\x37\x24\xc2\x5f\x72\x08\x2c\x71\x43\xa3\x08\x87\
+\x8a\xf1\x58\x68\x00\x09\x97\x47\xe1\x71\x3a\x10\x4c\x72\x23\x7b\
+\x9e\x0b\x29\xb3\x1c\xb8\x78\x45\x45\xe7\x10\x47\xd7\x25\x09\x91\
+\xeb\x0a\xb8\xc2\xc1\x39\x87\x2c\xd3\xe4\x32\xad\xe6\xd4\x6d\x32\
+\xf9\x15\x24\x64\x65\xe1\x44\x99\x1f\x0b\xca\x9a\xc0\x92\xcb\x5a\
+\xc4\xf9\x86\x22\xac\xf9\xb0\x07\xde\xc8\x18\x7c\xf7\x3a\x91\xed\
+\xf7\x20\x33\xd1\x09\x57\xfc\x0c\xf4\x8c\x68\xe0\x1c\xbd\x23\x12\
+\x14\x45\xd1\x01\x64\x93\x80\x9b\xe0\x92\x4e\xa4\x11\x13\x01\x57\
+\xe0\xce\xc8\xc0\xe7\x9b\x17\x20\xb8\xf9\x28\x98\xff\x99\x63\xe2\
+\xdc\xbe\x42\xe4\xef\xeb\x84\x4f\x70\xa4\xfa\x5c\xc8\xf1\xbb\x91\
+\x36\xd7\x89\xbf\xb9\x40\x78\x58\x41\xe7\x25\x19\x23\x63\x5c\x07\
+\x56\x2c\x02\x59\x27\xd0\xc1\x25\xe3\x36\x1a\x39\x27\x22\x67\x20\
+\x15\x6d\xdb\xd2\xb1\x74\x5b\x2b\x58\x60\xeb\x17\xe2\xbb\xba\xd5\
+\x28\x7c\xa7\x1d\x8b\x3c\x77\x22\x38\xcf\x8d\x25\x34\x53\xbc\x24\
+\xcf\x5f\x0a\xba\x86\x54\x74\x0f\x49\x18\xbf\x4e\xe0\xaa\xa2\x67\
+\x28\x5b\x99\x73\x6b\xaf\xcb\x46\x3e\x85\x24\x74\xf8\x52\x70\xfc\
+\xf9\xc5\x78\xe0\x85\x13\x60\x0b\x2b\x4e\x8a\x93\xaf\xae\x40\xe1\
+\x6b\x67\x71\x7f\x20\x81\xb4\x77\x23\x33\xd9\x05\x97\xe3\x0e\xf4\
+\x8e\x6a\x04\x0a\xfa\x34\x79\x54\x15\x0a\x37\xf4\x8f\x02\x6b\x92\
+\x48\x32\xb7\x08\xb8\x49\x10\x77\x4f\x22\x5a\x77\xe6\x62\xe5\xce\
+\x53\x60\x69\x3b\xbe\x16\xad\xd5\x0f\xe3\xf1\xea\x6f\x51\xb8\x2c\
+\x09\x4b\x48\xff\xb4\xb9\x33\x41\xef\x89\xb0\xf6\xb8\x44\x30\x3c\
+\x26\xeb\x04\xdc\x24\x90\x2d\x59\xcc\x1b\x70\xe3\x91\xb9\x2e\xa1\
+\x0a\xc4\x7b\x71\x6c\xcf\x83\x28\xd8\xf3\x0d\x58\x46\xe5\x69\xd1\
+\xb8\x6b\x39\xd6\x56\x9e\xc2\xa6\xd5\x8b\x88\x40\xab\x9e\x78\xaa\
+\x1e\xd2\x9e\xc0\xb5\x47\x8e\x90\x3c\xdc\x46\x60\x3d\x6a\x54\x2a\
+\x39\x0a\xce\xf5\x77\x50\x84\x07\x9f\xd5\xac\xc4\x93\xb5\xdf\x83\
+\x65\x56\x9d\x11\xa1\xed\xb9\x28\x7a\xb1\x0d\x3b\x4a\x73\x90\x95\
+\x7c\xb7\x55\x3d\x61\x22\xb8\x70\x85\x02\xb5\xab\x13\x41\xb4\x0c\
+\x63\xba\x47\x25\x32\x2b\xc8\x94\x51\x8a\xcc\xc4\xd1\x37\xf3\x51\
+\xf6\xd6\x4f\x60\xd9\x35\xe7\xc4\xfe\xf2\x1c\xac\x2b\x6f\x41\x6d\
+\x45\x1e\xd2\x7d\x46\xf5\x74\x51\xf5\x74\x0f\x73\x8c\x8e\xab\x46\
+\x79\x72\x6e\x2b\xd1\x58\xe6\x7a\xf5\xc8\x46\x79\x6a\x7e\x95\xe6\
+\xf8\x68\x1c\x9a\xeb\xd7\x61\x4b\xfd\x2f\x60\x4b\x5f\x6f\x17\x7b\
+\x9f\xcd\xc2\xfa\x2d\x87\xf1\xde\xee\x55\x08\xcc\x8e\xc7\x80\x26\
+\x0f\xd5\x7e\xdf\xe5\x1b\x18\x97\x8c\x20\x59\xbb\xba\x09\x28\xc9\
+\xb2\xed\x87\x66\x66\xaf\x68\x37\x55\xf5\x4a\xbb\x36\x78\x03\x4d\
+\xfb\x4b\xf0\xdc\x07\xbf\x82\xe5\xd6\x75\x88\x37\x36\xa6\xa3\x78\
+\xd3\x41\x7b\x0f\x9c\xd0\xb2\x18\xed\x85\xbd\x0f\x58\x2e\xa6\xfb\
+\x62\x66\x66\x34\x2d\x5a\x1a\x1b\x4a\xf1\x52\xa8\x03\xec\xbe\xfa\
+\x2e\x51\x53\x92\x7a\x2b\xec\x9b\x5b\x28\x6e\xf6\x8b\x49\x4d\x31\
+\xba\xaf\x3c\x1c\x06\x5b\xfe\x7e\x8f\xa8\x7a\x22\x30\x21\xe6\x56\
+\xa3\xaa\xa5\xd7\x58\xe9\xfc\x94\xfd\x7b\x12\x79\x55\x73\x2f\x58\
+\x5e\x43\x9f\xa8\xcc\x9f\x1f\x3b\x33\x55\x66\xb6\x20\x01\x5b\x5b\
+\x8f\x86\xd8\x3e\x84\x4d\x85\x9a\xb6\x0b\x60\x0f\x7d\x34\x60\xc4\
+\x98\xbd\xde\xae\x8a\x9d\x8f\x47\x24\xcc\xa0\x4e\x1b\x4b\xf6\x76\
+\xee\x7c\x3b\x27\x68\xcc\x2a\x38\x50\x4a\x4b\xc8\x66\x1a\xa3\x19\
+\x1c\x3e\xbe\xb1\x7f\xda\x04\x49\x4f\x35\xb9\xe2\xe2\xd8\x6f\x47\
+\xaa\x1f\x49\x4a\x9f\x9f\xa0\xdb\xbe\x3a\x3b\x88\x8a\xba\x1f\x4f\
+\x0f\x7e\x52\x9c\x37\x6d\x02\x6a\x86\xb5\x2b\xb2\xe7\xbc\xbc\xab\
+\x34\x38\xe1\xbf\xb1\xfc\xdd\x33\x08\x5f\xbc\xf6\x76\xf7\xde\x55\
+\xdb\xff\x35\xc1\xe2\x57\x7e\x5e\x48\x60\xe7\xb7\xae\x09\xdc\xe5\
+\xf5\x38\x26\x44\x75\xf4\x5f\x45\xf3\x0f\xbf\x5f\x15\x82\xa5\xb5\
+\xef\x5e\xf6\xe7\xb4\xde\x60\x3a\xe3\x1f\x3d\xfb\xa7\x0d\x11\x83\
+\x35\x8b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xd2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x99\x49\x44\x41\x54\x78\xda\x8d\x96\x7d\x68\xd5\x55\
+\x18\xc7\x9f\xf3\x7b\xd9\xee\xef\xbe\x6c\x77\x7a\xb7\x39\xdb\x70\
+\x7a\x1d\xf3\x0d\x4c\x09\x59\x88\x21\x04\x2a\x09\xe5\x34\xb5\x54\
+\x22\xe9\x0f\x65\x18\xa9\x11\x38\x90\xcc\x8c\xb4\x04\x5f\xc0\xc6\
+\x24\x6a\x44\xa4\x2e\xd3\x49\x14\x85\x16\x14\x12\x64\x14\x82\x89\
+\x4e\xc7\x9d\xd9\xd2\xbd\xb8\xbb\xbb\xfb\xb2\xfb\xbb\xf7\xfe\x5e\
+\x4e\xdf\x73\x7e\xdb\x4c\x6c\xd9\x61\x0f\xe7\x77\xef\xef\xec\xf9\
+\x9c\xe7\xfb\x3c\xe7\x39\x97\xd1\x7f\x8c\xd4\x59\xad\x81\x38\x2d\
+\x25\x46\x8b\x30\xcf\xc1\x57\x35\xa3\xaf\x7a\x60\xd7\x60\xbf\xc0\
+\x7e\x28\x59\x63\xff\x3c\x91\x0f\xf6\x6f\x5f\x66\x3a\xb4\x25\x98\
+\x36\xb2\xa2\xc0\x06\x25\x30\x29\xa4\xf8\xcb\x88\xf9\x82\x44\x5a\
+\x11\x11\xe7\xc4\x0b\x59\xe2\x66\x52\x9a\x6b\x26\xd3\xdc\xca\x9d\
+\xc0\xfa\xcf\x82\x8d\xf6\xc5\x47\x02\x52\x67\xb4\x26\xa6\xfb\x76\
+\x6a\xe1\xa9\x51\x2d\x32\x85\x58\xc0\x4f\x4c\x71\xb1\xd2\x26\xc6\
+\xe1\xdf\xc5\xb3\x4d\xe4\x3a\x58\x5c\xe0\x00\x64\xc8\x4e\xf5\x93\
+\x9b\x8e\xc7\xb8\x63\x1d\x42\x34\x2d\x13\x02\x86\x4f\x6b\xcd\x8a\
+\xbf\x74\xaf\x5e\x51\xab\x17\x55\x94\x13\xd3\xe1\x91\x69\x44\xca\
+\xe8\x32\xee\x20\x00\x78\x77\x60\x36\x9e\x2d\x97\x5c\x0b\x6b\xf2\
+\x2e\x59\xe9\x41\xb2\x87\xfb\x2c\x37\x6f\xee\x29\x5b\x6b\xef\x7f\
+\x08\x10\x6f\x57\x9b\x14\xa3\xf4\x88\x51\x5d\xa7\xeb\xe5\x61\x22\
+\x5d\x87\x63\x1d\xbb\xc7\x4c\x8a\xf0\x8e\x3f\xcb\x33\xb7\x00\x56\
+\x9e\xc8\xb2\xf1\x28\x20\x2e\x71\x40\x9c\xcc\x30\x59\xf1\x5e\xcb\
+\x2e\x64\xb7\x47\xd6\x3b\x2d\xe3\x80\x81\x13\xda\x12\x45\x2f\x6a\
+\x33\xaa\xeb\xa3\xc5\x55\xe5\xa4\xf8\xb0\x6b\xd5\x0f\xbf\xc5\x58\
+\x01\x00\x53\xa4\xf6\xf0\x28\x9d\x13\xcf\x01\x90\x43\x14\x98\x2d\
+\xc0\x2c\x21\x15\x5c\x15\x2c\x2a\x24\x07\x29\x17\xef\x8f\xb9\x8e\
+\xb5\xb9\x72\x83\x73\x51\x02\xee\x7e\xaa\xb6\xfa\x2b\xa7\x6d\x09\
+\xd4\xce\x20\x25\x08\x67\x5a\x80\x98\x6a\x00\x00\x63\x48\x2c\x53\
+\xb1\x13\x21\xcf\x28\xc0\x35\x21\xd3\x08\xf2\x91\x05\x13\x20\x44\
+\xe0\xe4\x90\x7c\x61\x85\x3c\x65\x07\x7b\x29\x97\x48\x1c\x9f\xfa\
+\x92\xb3\x95\xf5\xb4\xa9\x0d\x9a\xcf\x38\x1f\xae\x9b\x1b\xd2\x27\
+\x07\x89\x19\x45\xd8\x70\x80\x1a\x9f\x3d\xf3\x40\xf2\xcf\x7d\xb7\
+\x03\x8e\x21\x8b\x63\xc2\xb1\x49\x8d\x2b\x4f\x3d\xf0\xfe\x8b\xb6\
+\x85\xe4\x0a\x40\xde\x01\x3b\x45\xc3\xbd\x77\xd3\x8e\x65\x2f\x63\
+\xdd\x1f\xaa\xbb\x82\x15\x95\xfb\xc3\x33\xea\x49\x2d\x15\x1b\x36\
+\xa8\x71\xd5\x37\xb4\xef\xc0\x72\x9a\xf7\xf8\x74\x6c\xde\x4f\x57\
+\xaf\xf4\xd1\xee\xd7\x4f\xd0\xb9\x0b\xaf\x02\x90\xa5\x55\x2b\x3e\
+\xa2\x7d\xef\x2e\xa6\xb9\x73\x20\xa1\x9d\xc5\xfb\x38\xbd\xf9\x76\
+\x17\x9d\x6e\x9d\x8f\x3d\x88\x28\x4c\x4a\xf5\xf6\x51\x36\x39\xd2\
+\xcc\x6e\xb6\xaa\x67\x23\xd1\x68\x63\x70\xca\x54\x52\xc2\x0a\xf2\
+\x8a\x7f\x42\x04\x1c\x8e\x85\x73\x36\x96\x07\x42\x79\x72\x44\xe0\
+\x0a\xfd\xb3\xa3\x12\x8d\x00\x90\x81\xf6\x79\x38\xe5\xe2\x15\x00\
+\x8e\x94\x69\x24\x9e\xa0\xa1\xbe\xa1\x0e\x76\xed\x98\xda\x59\x3d\
+\x7f\x4e\xbd\x2f\x1c\x26\x35\xc8\x10\x81\x0f\x39\x80\xf6\x6a\x00\
+\xe6\x23\xc6\x04\x50\x85\xfe\x1c\xe7\xc0\xc2\x9c\x93\x51\x10\xf4\
+\xe7\x80\x48\x10\x92\x2b\xaa\x48\x00\x84\x44\x22\xf1\x85\x74\x86\
+\xee\x74\xdf\xbb\xc1\xae\x1c\x56\x46\x66\x3e\x39\xdf\xaf\xfa\x7d\
+\xa4\x1a\x48\xa6\x0f\xa5\xa9\x8b\x04\x03\x24\x12\x2d\xab\x48\x24\
+\x99\x7b\x67\x40\xe4\xc1\x35\xbd\x04\xcb\x48\xf0\x5c\xb0\x3d\x80\
+\x90\x07\xb3\x00\x38\x66\x8e\xba\xaf\xf7\x65\xd9\x6f\x07\x95\x91\
+\xd9\x8b\xe7\x01\x60\xa0\x68\x20\x51\xb1\x86\xb3\x85\xca\xd1\x8a\
+\x89\x43\x1e\x26\x00\xca\xe8\x39\x10\xc7\x97\xa3\x2c\x21\x15\x13\
+\x10\x38\x17\x55\xc4\x2d\xec\x1a\xce\x5d\x09\x11\x00\x0b\x55\x65\
+\x52\xd7\xef\xf7\xb2\xec\xd2\x01\xa5\x73\xd6\x13\xd1\xfa\xe2\xd2\
+\x52\x0f\xe0\x53\x68\xcd\xa6\x4b\xb2\x32\x3a\x3a\x96\x01\x02\x20\
+\xce\x81\x3c\x06\xe8\x11\xcc\xb5\x3c\x88\xd0\x43\x1e\x36\x8b\x56\
+\x6f\xba\x2e\xd7\xb7\x1f\x9d\x89\xcf\x0e\x2a\xd9\xa2\x6c\x2a\x4b\
+\xb1\xce\xc4\x0d\xf6\xd3\x3b\xca\xd9\xda\xd9\x53\x1a\x27\x57\x47\
+\xa0\xbf\xee\x9d\xad\x22\x95\xbe\xbe\x30\x40\x1f\x7f\x72\x9b\xfe\
+\xcf\x78\x79\x5d\x39\x3d\xf3\x54\x09\xb8\xae\x8c\x46\x00\xe2\xfd\
+\x19\xea\xb9\x95\xee\x60\x3f\xbe\xa5\xec\xaa\x78\xac\x64\x7f\xed\
+\xdc\x2a\xc8\xad\x49\xe7\x8a\x2e\x92\x0d\x53\x95\xd1\x3e\x04\x53\
+\x38\xad\x5e\xfb\x2b\x35\x5d\xd6\xbd\xcf\x32\x24\x46\x2d\x0b\x0b\
+\xf4\xf9\x07\xd1\x71\xe7\x9e\x15\xe8\xcf\x5b\x29\x1a\xe8\xcf\x37\
+\xb3\xef\x77\xb3\x06\x7f\x40\x3f\x3f\x6b\x41\x55\xc8\x28\x41\x7b\
+\xd0\x54\xe9\x5c\x42\x54\xe1\xd8\xf5\x20\x68\xa5\x6b\x36\x5e\xa5\
+\x3d\xc9\x59\x9e\x73\xc6\x64\x5a\xf6\x86\x3b\xa9\xfd\x70\xad\x6c\
+\x7c\x5c\x34\x40\xdb\x26\x33\x9d\xa3\x1b\x9d\xe9\x94\x69\xba\xcb\
+\x65\xab\xf8\x76\x17\x6b\x9d\x16\x2d\xd9\x52\x5b\x1f\xf1\x9a\x9b\
+\xae\x20\xd1\x02\x20\x0a\x88\x4b\xe7\x62\xd3\xcf\xbf\xd2\x49\x2f\
+\x94\x2d\xa0\xa7\x43\x75\xf8\xc8\xe8\x42\xea\x26\xb5\x0f\x5f\xa6\
+\x53\xef\xd7\xc0\xb1\x28\x02\x4b\x02\xfe\x88\x41\x9e\x9e\xfc\xf1\
+\x15\x07\xf8\x56\x09\xf8\xea\x0d\xb6\xc4\x30\xd4\xb6\xba\xd9\xe1\
+\x68\x79\x55\x08\xe5\xa9\x8d\xcb\xc3\x20\x8d\x6c\xa6\x5e\xbf\xa6\
+\x75\xdb\xba\x1e\xd0\xff\xd4\x7b\xd5\xa8\x26\x54\x97\x83\x08\xd0\
+\xc6\x07\x07\x50\x3d\x5d\x66\x2c\x9f\xe3\x9b\x57\x1e\xe4\x17\xc7\
+\xdb\xf5\x97\x3b\x58\x53\x78\x92\x76\x64\x66\x7d\xa9\x1e\x8e\x18\
+\x70\xac\x7a\x5d\x54\xca\x33\xd6\x77\xb9\x27\x0f\x87\x6c\xb8\x78\
+\xe4\xe5\x23\x4c\x00\x50\xc2\x89\xa1\x3c\xc5\xba\x4c\x2b\x91\x74\
+\xb6\x3f\x77\x88\xee\xb7\xeb\xb1\xd1\xf1\x1a\x6b\x2e\x9b\xa4\xed\
+\x9d\x1e\xf5\xeb\xe5\x95\x7e\xaf\xfe\x05\x84\xd8\xfd\x95\xc2\xb9\
+\x34\xef\x5c\x70\xee\x01\x90\x50\xba\x7d\x3b\x67\x0d\x25\xf8\x9e\
+\xd5\x47\xf9\xc3\x17\xce\xd8\x38\xbd\x8d\x9a\x0c\x43\xd9\x59\x53\
+\xe3\x8b\x56\x55\xfb\x28\x10\xd4\xa4\xde\x5e\xcd\x70\x39\x0b\x00\
+\x93\x00\x97\x32\x19\x8b\xee\xde\x29\xd0\x5f\x77\xac\x98\x99\xe3\
+\x87\xd6\x1e\xa3\x89\xaf\xcc\xb1\xd1\xde\x44\xf2\xd2\x0f\x05\x95\
+\x0d\x91\x88\x16\x42\x54\x14\x0a\xa9\xe4\x0f\x28\xe2\xd6\xa4\x9c\
+\xe9\x50\x32\x69\xd3\xd0\xb0\x43\xf1\xb8\x93\xca\x64\xdc\x93\xe2\
+\xd2\x5f\xdf\x42\x8f\xbe\xf4\xff\x39\x4e\x6e\xa5\x06\x4c\x4b\x61\
+\x8b\x60\x13\xfe\x6c\x79\xb1\x95\x26\xfc\xd9\xf2\x37\xeb\x11\xd6\
+\x45\xbd\xc1\x77\x13\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\xd5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x9c\x49\x44\x41\x54\x78\xda\xad\x55\x0b\x4c\x53\x57\
+\x18\xfe\x6e\x7b\x7b\xa1\xd4\x5a\xc0\x5a\xa5\x14\x79\x29\x0f\xa5\
+\x16\x9d\x83\x05\x87\x22\xc8\x63\x31\x26\x6e\xe8\x82\x1a\x64\xcb\
+\xdc\xc6\xaa\x64\x31\x8b\x4a\x34\xbe\x50\x96\x0d\xb6\x84\x44\xf7\
+\x60\x4e\x0d\x83\xa1\x68\x98\x98\xb8\x65\x22\x6e\x3a\x87\xef\x27\
+\x58\x21\xa5\x0d\x54\x56\x51\x01\xa9\x85\x42\xdf\x77\xa7\x05\x1d\
+\x4a\x23\x60\x76\x92\x93\x7b\x5e\xff\xf7\xfd\xff\xf7\x9f\xff\x5c\
+\x0a\xa3\xb4\xe9\x5f\xa8\x7d\x07\xec\xec\xaa\x10\x3f\x5e\x76\xa8\
+\x3f\xf3\x5a\xaf\xd9\xa9\xbf\xfb\xc8\x72\xd8\x6a\x67\x0f\xe8\xb6\
+\x46\x68\x47\xb3\xa7\x5e\xb6\x19\x5a\xa0\x9a\x21\xf4\xa6\x2b\x73\
+\xe2\xfc\x15\x71\x41\x02\x8e\x22\x80\xcf\xb5\xb3\x4e\xeb\x05\x9d\
+\xc9\x5a\x7e\xed\xf1\xa3\x0b\x6d\xa6\xcf\xda\xb7\xcf\xaa\x79\x25\
+\x82\xa0\x6d\xb7\x7c\x85\xde\xdc\xd3\x5b\x53\xa5\xb1\xa9\x33\xfd\
+\x69\x86\x0b\x78\x93\xee\xc5\x1b\xdc\x37\x9a\x1d\xa6\xf5\xc7\xee\
+\x75\x9c\x51\x1b\x33\xef\xef\x89\x6d\x18\x33\x41\x71\x93\xcd\x87\
+\x43\xa1\xa5\xa1\xb9\x73\xc2\x24\x87\x45\xb8\x25\x23\x84\x32\x3a\
+\x48\x34\xc2\x91\xc6\xfa\x27\xd6\xfe\xa4\xaf\x55\x65\x9a\xdd\x73\
+\x95\x63\x26\xd8\xdd\x68\x11\x48\x7d\xa8\xbe\xba\xba\x16\xe4\x24\
+\x04\x42\x3a\x45\x84\x60\x7f\x60\x22\x77\xa4\xb1\xdd\xc1\x9a\xd7\
+\xfd\xdc\xd2\xfe\x43\x4e\x64\xc4\x98\x09\x76\xdc\x34\x0b\x64\x02\
+\xca\x50\x7e\xec\x16\x7d\x38\xf7\x75\xe8\xed\x14\x14\x12\x80\xf1\
+\x6c\xcf\x96\xfe\xa1\x47\x6e\x8a\x8c\x33\xae\x1c\x7c\xdb\x34\x60\
+\xab\xfd\xad\x91\xfe\x70\x51\x04\xa4\x41\x22\x84\x88\x01\x5f\x4f\
+\xe8\x2c\x1c\x9f\x1c\x6c\xee\x2a\x5d\x1b\x3d\x75\x5c\x04\x25\x8d\
+\x7d\x36\x46\xff\x90\x56\xb5\x9b\xb0\x29\x4b\x0e\x27\x1f\x08\x24\
+\x12\xf1\x5e\x38\xd7\xda\x6d\x63\xd3\x76\x9e\xff\x49\xb3\x2f\xe5\
+\xbd\x71\x11\x14\xdd\x34\xda\x3e\x98\xee\x45\x67\x16\x5d\xc0\xaa\
+\xa4\x48\xa4\x27\x06\x80\x21\xe8\x02\xb2\xe7\x43\xba\x2b\x1d\x5d\
+\x36\x60\xeb\x21\x95\xfd\x50\x6d\x53\xa1\xad\x7a\xc5\xce\x71\x11\
+\x14\x5e\x35\xd8\xb7\xcc\x13\x71\x1b\xda\x0c\xd8\xb0\xff\x3a\x12\
+\x15\xc1\x48\x50\x04\x22\x34\x88\x0f\x0b\x01\xbe\xdb\x6a\xc0\xf1\
+\x73\xad\xa4\xab\xc1\x12\xa1\x18\x86\x37\xbb\xaf\x6a\xf9\x1d\x8f\
+\x04\xef\x9e\x32\x53\x76\x8a\x9b\x1e\x36\x11\x47\xc8\x5c\xe4\x5a\
+\x34\x9b\x8d\xc8\x08\xe6\xbb\x0f\x18\x7a\xcd\xa8\xab\x6f\x85\x56\
+\x67\x00\x4d\x44\x22\x80\xf0\x17\x7b\x81\x96\x4d\xc6\xd5\x7a\x2d\
+\xf4\xf7\xba\x20\x98\xe0\x8d\xe8\x04\x45\xbe\x2c\x5c\x5a\x7c\x34\
+\x83\xef\x7c\x8e\x60\x49\x75\x8f\x44\x22\xe4\x3d\xdc\x30\x87\x81\
+\x5c\xec\x0a\xde\x89\xbc\x73\x46\x8c\xa5\xed\x5d\x28\x42\xda\xb6\
+\xb3\xb8\xa8\xe9\x41\xc8\x54\x72\x0d\x84\xa2\x35\x77\x76\xc7\x95\
+\x3f\x47\xb0\xa8\xec\xc1\xfc\x79\x52\xde\xdf\x05\x49\x22\x70\x09\
+\x7e\x1f\x91\x40\xf5\xc0\xea\xba\x23\xc3\x34\x7c\xaa\xa4\xcb\x7f\
+\xca\xfd\xa5\x49\x35\x46\x49\x18\x30\xe4\x82\xae\x2c\xbe\x84\xeb\
+\xba\x3e\x2c\x90\x4f\x81\xa6\xdb\x9a\x75\x75\x47\x7c\xd5\x33\x82\
+\xb8\x12\xf5\xc6\x94\x48\x61\xd1\xe7\x19\x53\xd1\xef\x74\x40\xd3\
+\xd1\x0f\x75\xa7\x15\x14\xfb\x14\x98\xf5\x90\x32\xb2\xe6\x22\x98\
+\xe2\x85\xb0\xc9\x7c\xf0\xb9\x14\x66\x6e\xb9\x08\x21\x43\x61\xf5\
+\x9b\x32\xd4\x36\xf7\xe6\xfe\x9a\x37\xab\xd4\x6d\x31\xa7\xe0\xc6\
+\x99\x15\xf1\x93\x93\x37\xa7\xc9\x40\x9c\xc7\x5b\x9f\x9e\x40\xfd\
+\xed\x0e\xf0\xe8\x91\xb5\xc3\x0e\xa3\xb0\xd8\x1c\x58\xb6\x30\x1c\
+\x55\x05\x69\x20\x2f\x09\xf2\xab\xdb\x50\x59\xaf\xd7\xa6\xc6\x88\
+\xc3\xd7\x27\x07\xe2\xe0\xe5\xc7\xdb\x4a\xb3\x82\xf7\x50\x8a\xcd\
+\xe7\x2f\xe5\x2d\x0d\x8b\xcf\x9e\x2f\xc5\x3f\x06\x0b\x96\xe5\xff\
+\x0e\xfd\x43\x13\x68\x9a\x7a\xe6\x35\x35\x14\x05\x4b\x0d\xc5\x44\
+\xa6\x66\xab\x03\xb3\xc3\x27\xa1\xaa\x30\x15\x62\x3e\x8d\xed\x55\
+\x6a\xd4\x5c\xe9\xb8\xf4\x84\x27\x68\xd9\x9c\x2e\xcb\x4e\x89\xf2\
+\x85\xf2\x78\x87\x9c\x0a\xc8\x39\xa1\x5b\x95\x1c\x36\xad\x68\x4d\
+\x0c\x4e\x36\x76\x63\x57\xc5\x1d\xf4\x0e\xd8\xc0\xe5\x50\x43\x5e\
+\xff\x47\x80\x61\xaa\xd9\x1c\x2c\x24\xbe\x0c\x0a\xb2\xe5\x58\x10\
+\xe1\x87\xc2\xa3\xcd\x28\xab\xd5\xd4\xe8\x0e\x2c\x7d\x7b\x46\xe1\
+\xdd\xbd\x8b\xa3\x44\xdc\xef\x32\x03\x95\x94\x78\x79\xe5\x49\x65\
+\xa6\x7c\xc9\xae\xac\x18\xec\xab\xef\x44\x45\xfd\x7d\x70\xdc\xa0\
+\x04\x8b\x1a\x92\x85\x1d\xf4\x7e\x78\x56\x1c\x4e\x96\xa4\x81\xc2\
+\xc7\x8b\x83\xb0\x72\xae\x1f\x94\x7b\x2f\xa3\xe6\xac\xf6\xcb\xee\
+\x5f\x56\xe7\x3f\x77\x8b\x7c\x16\xef\x8f\x9c\x16\x30\xb1\xae\x20\
+\xf7\x0d\x59\x63\x0f\x85\x6a\xad\x01\xa5\x59\xb3\xdc\x11\x50\xac\
+\x67\xfd\x39\x24\x3d\x3d\xfd\x76\x7c\x74\x44\x85\xf7\x63\x24\x60\
+\x0c\x9d\xf8\xaa\xe2\x46\xab\xd5\xee\x5c\x68\xaa\x5d\xdb\x3e\xa2\
+\x92\xbd\x12\xbf\x49\xa2\x19\xfa\x4f\xd7\x78\x52\x7a\x1c\x4e\x2b\
+\x63\x07\x23\x60\x07\x0f\x38\x87\x0e\x3e\x1d\xbb\xd2\xf3\xd8\xca\
+\xe2\x9d\x1f\x6f\xa3\xfb\xd4\x15\x37\x90\xdd\x66\x4f\xb3\xfc\xb5\
+\xee\xf4\xa8\x4f\xc5\xb4\xa2\x9b\xec\xb5\xbc\x58\x12\xc1\x60\x32\
+\x39\x2f\xca\x44\xbe\xae\x7a\xe9\x1a\x70\x20\xf9\xfb\x46\xdc\xdb\
+\x34\xe7\xa5\xbf\x5d\x8f\x04\xba\x8d\xb1\xa3\x56\x71\xbf\xcd\x89\
+\xe8\x92\x86\x57\x23\x18\x15\x7d\x58\x1b\x37\xc1\xff\xdd\xfe\x05\
+\xbf\xf6\xc5\x03\x2c\xf3\x2f\xcc\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x04\x72\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x39\x49\x44\x41\x54\x78\xda\xad\x55\x6d\x6c\x53\x55\
+\x18\x7e\x4e\x6f\xbf\x58\xd7\xce\x8d\x8c\xa0\x18\x90\x88\xb0\xc5\
+\xb1\xe0\x47\xc2\x0f\x9d\x90\x90\x09\x44\x19\x5f\x01\xf6\xa1\x11\
+\x03\x6a\x14\x70\x11\xa3\x46\x13\x1a\x1b\x8d\x86\x1f\x18\x13\x25\
+\x1a\x12\x62\x97\x30\x21\xd9\xc2\x87\x40\xf7\x99\x6c\x08\xcb\x74\
+\x04\xa3\xe2\x36\x0c\xb0\xb1\x65\x30\xd6\x8d\xae\xeb\xe7\x6d\x7b\
+\xef\x3d\xbe\xe7\xb6\xb8\x6e\x91\xb9\x1f\x3d\xe9\x7b\xcf\xe9\xbd\
+\x7d\x9f\xe7\x79\xcf\xfb\x9c\x5b\x86\x69\x43\x7a\xb7\xa3\x18\x26\
+\xd3\x72\x18\x0d\x05\xdc\x68\x5c\xc2\x8d\xd2\x42\x48\xec\x61\x2e\
+\x49\x79\x0c\x2c\x1b\xd0\x00\x55\x0b\x51\xf8\x98\xa2\x0e\x43\x51\
+\x07\x69\xbe\x81\x84\x7a\x8d\x25\x94\xab\xca\x77\x2f\xfc\x99\x8e\
+\xc7\xc4\xc5\xbc\xb3\x65\x11\x81\x6d\x80\x49\x5a\x5f\x52\x98\xb7\
+\xb6\x64\xe9\x43\xd2\xf2\x05\x36\x2c\xcc\x35\x63\x6e\x96\x11\xd9\
+\x16\x09\x66\x89\x11\x0f\x61\x73\x20\xaa\x70\x04\x63\x1a\xc6\x22\
+\x0a\x86\xfc\x71\xdc\x18\x93\xf1\xfb\x40\x10\x1d\x7f\xfb\xd4\xb1\
+\xd1\x48\x13\x12\x4a\x03\xc5\xd9\xf8\x8f\xeb\x07\x98\xa5\xb2\x61\
+\x1d\x37\x19\xf7\x7f\x50\xf6\x78\xe9\xa6\x67\xf3\xe1\xb0\x99\xe0\
+\x8d\x6a\x18\x09\x29\x18\x27\x10\xbf\xac\x21\xa2\x68\x88\xab\xba\
+\x76\x2a\x8c\x21\xcb\x64\x80\x8d\x22\xdb\xcc\x60\xa7\xd9\x61\x35\
+\x20\xc7\x62\x40\x8c\x88\xaf\xf4\x4d\xa0\xf6\xe7\x21\x5c\xed\x19\
+\x6d\x61\x8a\xf2\x15\x33\x57\x78\x1a\xdd\xfb\x56\xac\x5d\xb6\x38\
+\x17\x9d\x43\x32\xba\x86\xa3\xa4\x94\xd4\x1a\x04\x98\x21\x35\x27\
+\xd7\x02\x5c\xac\x25\x5a\x9b\xa4\xfb\xbf\x49\xbb\x47\xf3\xa3\x76\
+\xa3\x5e\xe9\x11\xcf\x4d\x34\xb6\xf7\x37\x31\x4b\xb9\xa7\xdd\x57\
+\xf3\xe2\xaa\x2f\x3b\xc7\xd1\x3f\x91\x80\x44\x2a\x0d\x7a\x92\x00\
+\x48\x07\x49\x8f\xd4\x3d\x42\x32\xb2\xc9\xdf\x48\xa9\x67\xa2\x9a\
+\x50\x34\x81\xbd\x9f\x5f\xec\x67\x96\xed\xe7\x6a\x7f\xa8\x7e\xaa\
+\xf2\x89\xc5\x79\xe8\xbc\x1d\xc5\xe5\x3b\x72\x0a\x78\x6a\xb2\x0e\
+\xa6\x2b\x65\xa4\x34\x49\x24\xaa\x98\x24\x49\x3e\x5f\x60\x97\xf4\
+\x1e\x1d\x6f\xee\x43\x53\x5b\x5f\x83\xde\x64\x4b\x85\xe7\xeb\xfd\
+\x9b\x96\x54\x6f\x59\x39\x1f\xd9\x36\x33\x46\xc2\x1a\xee\x86\x13\
+\xf0\xc5\x38\x02\x31\x95\x12\x80\x84\xc6\x41\x1f\x1d\x28\x8b\x90\
+\x6c\xb4\xff\x0e\x52\x6a\x37\x27\x43\xf4\x45\x26\x07\xfc\x35\x18\
+\x40\x6d\xeb\x00\xba\xbb\xef\xd6\x93\xc3\xca\xd9\x7d\x3b\x59\xaa\
+\x1a\x5c\x25\xc5\xf3\x9c\x47\xdf\x22\x97\x8a\x7d\x22\x55\x06\xb1\
+\x5d\xa4\xd0\xc4\x92\x76\x13\x0e\x12\x44\x31\x35\x19\x32\x35\xfe\
+\x1e\x5d\xee\xc9\x42\x90\x06\x8d\x71\xd4\x91\xf2\xae\xcb\x43\x6e\
+\x96\x50\x77\xcb\x27\x37\xaa\x2c\xdd\xb3\xe6\x57\x1a\x5d\x4f\x2f\
+\x9d\xeb\x3c\xfc\x46\x91\x68\x04\x64\x2a\x55\xe1\x9c\xc0\xb9\xee\
+\x22\x9f\xcc\xc9\x59\x2a\xe2\x5a\x92\x28\x14\xa7\xef\x51\x8e\x70\
+\x42\x05\x23\x35\x97\x3a\x6e\xe1\x7a\xef\x88\xdb\xa0\x10\x78\x7d\
+\x99\xfa\xef\x39\x98\x4e\x52\xb0\x28\xc7\x79\xf0\xf5\x22\x48\x46\
+\x49\x27\x11\x23\x46\x80\x3e\xb2\x6d\x98\xb6\x8d\x26\x02\xe5\x98\
+\x20\xa6\x30\x85\x9c\xd0\xd0\xf5\xcb\x2d\x0c\xde\x1c\x25\xe5\xda\
+\xee\x58\xfd\x06\x75\xca\x41\x9b\x3e\x2c\x55\x8d\xae\xc7\x1e\xb1\
+\x3b\x3f\xae\x7a\x12\x56\xab\x11\x54\x04\x44\x46\x90\x40\xc5\xb9\
+\x10\x8a\x83\x71\x20\x42\xc0\x32\x9d\x91\x8b\x17\xfa\x30\x3c\xe0\
+\x73\x33\x95\x94\xd7\x4d\x82\x3f\x90\x20\xd5\x78\xd7\xfc\x7c\x9b\
+\xf3\xbd\x8a\x22\xd8\xed\x66\xdd\x21\x42\xb5\x37\xac\xc2\x4f\xaa\
+\xc9\x85\x88\xc6\x15\xb4\xb5\x5e\x87\xf7\xb6\xdf\xcd\x34\x4e\xdb\
+\x32\x15\x7c\x46\x02\x9d\x64\xc7\x79\x57\x6e\x8e\xd5\xf9\x4e\x65\
+\x31\xf2\xf3\xac\x20\xb1\x18\xa6\x13\xee\xa7\xc6\x86\x29\x5a\x9b\
+\xaf\x61\xec\xce\x44\x12\x9c\x1a\xfa\x5f\x18\x33\x12\x88\x61\xdd\
+\x7a\xc6\x65\x77\x58\x9d\xbb\xca\x8b\x31\x2f\xdf\x06\x6f\x48\xc5\
+\x70\x20\x86\xe6\xb3\x3d\x18\xf7\x06\xdc\x10\xe0\x67\x36\xab\x0f\
+\xca\xff\x5f\x02\x31\xe6\x94\x9d\x74\xcd\xb1\x99\x9d\xef\x57\x3f\
+\xa7\xbb\xe8\x58\xcd\x6f\xf0\x8f\x85\x92\xe0\xe7\xb6\xaa\x33\xe5\
+\xce\x8a\x40\xaf\xe4\xa5\x3a\xbe\xf7\xc3\x35\x08\xd1\x3e\xd5\x1c\
+\x6a\x43\xd4\xb3\x6d\x56\xb9\xb3\x26\xc8\x2a\x3d\xce\x5f\xfb\xa8\
+\x94\xde\x98\xc0\x89\x43\x2d\x88\xb4\x54\x64\x98\x60\xf5\x31\x5e\
+\xf9\xc9\x3a\xfa\x5f\x01\xea\x0f\x36\x20\xdc\xfe\x6a\x66\x09\x6c\
+\xcf\xbb\xf9\xf6\x03\x2f\x13\x01\xc7\xa9\x2f\xce\x23\x7c\x69\x67\
+\x66\x09\xb2\x57\x1e\xe5\x5b\x3e\x2d\xd3\x5f\x78\xa7\x5d\x3f\x21\
+\xf4\xeb\xae\xcc\x12\xd8\x9f\x39\xc2\x37\x7e\xb6\x59\x5f\x9f\x3e\
+\x70\x0a\xa1\x2b\x6f\x66\x98\x60\xc5\xf7\xbc\x60\x4d\xa1\xbe\xee\
+\x6d\xed\x41\xe8\x8f\xb7\x33\x4b\xe0\x28\xfa\xb6\x9d\x33\xb6\x0a\
+\xe2\xdd\xc7\x71\x21\xd8\xbd\x67\x75\x66\x09\x0a\xbf\xd9\x46\xd3\
+\x1e\xe8\x0c\xec\x70\xa0\x77\x5f\xdd\x6c\xf2\xfe\x01\xf4\x5b\xfb\
+\xf8\xc8\x33\x3d\xdc\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x01\x61\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x01\x28\x49\x44\x41\x54\x78\xda\x63\x7c\xfa\xe1\xff\x7f\
+\x29\x7e\x06\x9a\x01\xc6\xe1\x63\x01\x4b\x0f\x23\xc3\xb5\xe4\x9b\
+\x0c\x6a\x82\x6a\xb4\xf3\x01\x36\x4b\xae\xab\x2b\x90\x6d\xb8\xe6\
+\xcd\x07\x98\x41\x84\x6c\x09\xc8\x70\xe5\x9d\xfb\x19\xd8\x14\x14\
+\xa9\xe3\x03\x64\x4b\xb6\xac\x92\x62\x70\x5a\x75\x84\x22\xc3\x71\
+\x5a\x00\x72\xb9\x6e\xea\x43\xaa\xc4\x09\x86\x05\xc8\xc1\x42\x8d\
+\x88\x47\xb1\x00\x5b\x98\xe3\xb2\xe4\xf6\xd3\x4f\x0c\xaa\xd2\x7c\
+\xc4\x5b\x80\x2f\x42\xd1\x2d\x01\x19\xae\x95\xbc\x96\xe1\xda\xdc\
+\x60\x9c\x96\xdc\x7a\x7f\x0b\xac\x1e\x6e\xc1\xaf\x07\xf7\xf1\x46\
+\x28\xcc\x12\xc6\x6f\x12\x60\xc3\x7f\xef\x48\x64\x60\xf5\x98\x8f\
+\xd5\x12\x90\xe1\x5a\x73\xd5\x19\xfe\x94\xfc\x27\x2d\x27\x83\x2c\
+\x61\xdc\x33\x0f\x6c\x38\x0c\xa0\x5b\x82\x6c\x38\xd6\x48\xc6\x05\
+\x60\xc1\xf2\xdf\x25\x09\x23\x4e\x60\x96\xfc\xe7\x7a\x81\x62\x38\
+\xd1\x16\xc0\x0c\x87\xb9\x1c\x5b\xc4\x83\x2c\x01\x59\x8e\x6c\x38\
+\x51\x16\xa0\x1b\x8e\x2d\xe2\x61\xc1\x02\x0a\x3e\xf4\x38\xc1\x6b\
+\x01\x2e\xc3\xd1\x2d\x41\x0e\x16\xf4\x38\xc1\x69\x01\x21\xc3\x91\
+\x2d\x41\x0f\x16\x64\x4b\xb0\x5a\x40\xac\xe1\xf8\x00\xc8\x12\x90\
+\x7e\x0c\x0b\xa8\x61\x38\x32\x40\xb1\x80\xda\x86\x63\x58\x00\xf3\
+\x16\x35\x01\x7d\xea\x64\xda\x19\xcf\xc0\x00\x00\xe4\x0f\x16\x9f\
+\x34\x4b\x74\xfc\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x04\xb0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x77\x49\x44\x41\x54\x78\xda\xa5\x96\x7d\x4c\x55\x75\
+\x18\xc7\xbf\xe7\x9c\xfb\x7e\x2f\x70\x79\x11\x94\x5e\x04\x04\xc5\
+\x95\x99\x5a\x99\x25\xa9\x50\xd2\x6c\xd6\xa2\xd4\x62\x63\xfa\x07\
+\xab\x2d\x9d\xac\x35\xcc\x45\x1b\xc5\xea\x9f\xc6\x0a\xff\x70\xbd\
+\x92\xb1\xcc\x50\x1c\xce\xde\xcc\xa1\xd9\x6c\x1a\xb3\x5a\x2b\x07\
+\x81\x1b\xd8\x80\x29\x70\xb9\x70\xb8\x87\x7b\xef\x79\xff\xf5\x9c\
+\x73\xd1\x62\xf8\x42\xf2\xdc\xfd\xce\x6f\xcf\xf9\x9d\xdf\xf7\x73\
+\x9e\xf3\x3c\xbf\x67\x97\x03\x59\xf6\xee\x21\x06\xdb\x68\x32\x19\
+\x18\xb3\x86\x41\x2e\xb3\x07\x33\xcd\x84\x6f\x5a\xeb\x06\xf9\x57\
+\xd6\xe9\xbe\x61\x5a\xf7\xe2\xe1\x4f\x57\xf8\x70\x0d\xe3\xac\x4b\
+\xee\xeb\x83\x6c\x71\x9e\x07\x05\x19\x02\x06\x25\x13\x4e\x01\x70\
+\x09\x1c\x9c\x3c\xcd\xd6\x20\xdf\x6d\xdf\x63\xb6\xef\x76\x24\x7c\
+\x29\x6e\x60\xef\xd1\x7e\x55\x66\x8e\xa2\x91\x0f\xee\x3a\x77\x5d\
+\x40\x4e\xcd\x65\xb6\x30\xd7\x83\xa0\x97\xc7\xca\xdb\x9d\xe8\x1b\
+\x37\x12\x42\x96\xe8\xa4\xd8\x15\xdf\x12\xcf\x0c\xf0\xe8\x19\xd6\
+\xf0\x4e\xcb\x45\x43\x61\x8e\xe2\xf0\x87\x4b\x4e\xe3\x3a\x66\x03\
+\xe6\xbf\x76\x89\x2d\xca\x4b\x44\x38\x3f\x55\xc0\xc6\x42\x27\xba\
+\x86\xf5\xab\x82\x6e\x8a\xc6\x9a\x3d\xe4\xa7\xfb\x79\x74\x5e\x52\
+\xf0\xe6\x81\x5e\x68\x4c\x78\x3c\xfc\xd1\xd2\xe3\xb8\x81\x25\x00\
+\xbb\x07\xd8\xa2\xfc\x40\x22\x0b\xf4\xcd\x97\xce\x15\x50\xbe\xcc\
+\x83\x6e\x82\x78\x2c\x80\x83\xb3\x61\xf3\x52\x78\xfc\xdc\x23\xa3\
+\xa6\xa9\x87\xc4\xf9\xb2\xf0\xc7\xf7\x1e\xc1\x4d\xcc\x06\xdc\xf9\
+\x6a\x3f\x2b\x2c\x48\x9a\x4c\x2e\xa3\x9c\x31\x14\x2f\x70\x61\xeb\
+\x03\x3e\xf4\x8d\x6a\x04\xe1\x48\x5c\x40\x5b\x67\x14\xbb\xf6\xf5\
+\x42\x37\x58\x45\xb8\x71\xf9\xfe\x9b\x89\x5f\x05\xdc\xb1\xab\x8f\
+\x15\xe6\x4f\x05\x30\xaa\x90\x67\x96\x78\xb0\x6d\xa5\xdf\x2e\x9e\
+\x6f\xce\x47\x51\xfd\x59\x2f\x14\xc5\x38\x13\x6e\x5c\xb1\x7a\x26\
+\xe2\xff\x02\xaa\xff\x66\x0b\xf3\x93\x13\xe5\x47\xc3\xa4\xb2\x34\
+\x2d\x18\x95\xe0\x1b\x1b\x52\x10\x92\x0c\xbc\x7b\x62\x14\x19\x1e\
+\x20\x26\x4a\xf8\x6b\x40\xae\x1d\xfe\xe4\xbe\xba\x19\x03\x6e\x7b\
+\xa5\x97\x72\x90\x62\xbf\xb5\xfd\xf6\x93\x90\xa7\xef\xf1\xa2\xe5\
+\xb7\x09\x18\x54\xfb\x99\x5e\x0e\x9b\xee\x76\x40\x8c\x6a\x68\x3e\
+\x27\xa1\x77\x70\x66\x90\x04\xe0\xe5\x1e\x56\x50\x90\x88\x20\x01\
+\x30\xf1\x70\xae\x0b\x27\x3a\x24\xf0\x3c\x67\x1f\xb6\xac\x54\x17\
+\x6a\xd6\xf9\xf1\xcb\x05\x11\x83\xa2\x8a\x63\x1d\x31\x0c\x8c\xa8\
+\xb5\xa1\xc6\xfb\xeb\x6e\x0a\xc8\xae\xba\xc0\x0a\xf2\x83\x89\x4f\
+\x43\x23\x27\x28\xe0\xd7\x6e\x11\xe1\x50\x14\x73\x32\x7d\x2c\x39\
+\xe8\xe7\xac\x27\x53\xdc\x1c\xaa\xd7\xf8\xf0\xe3\x9f\x61\x5c\x16\
+\x15\xb4\x5f\xd4\x10\x12\x95\xda\xd0\xbe\x07\xeb\x6e\x08\x98\x57\
+\xd5\xcd\xf2\x17\x04\xed\x6f\x6e\xd2\x08\x0f\x47\x10\x0a\xc7\x43\
+\x4c\xd7\xde\xe7\x61\x64\xf9\x02\x9e\x17\x33\xe6\xa5\x80\xa7\x9f\
+\xcf\x05\x6c\x5b\xee\x46\x7b\xe7\x28\x86\xc6\x35\x74\x0c\xea\x10\
+\x27\xb4\xe6\x70\xd3\x43\xcf\x5f\x1f\xb0\xa3\x93\xe5\xd9\x00\x86\
+\xd0\xe0\x38\x46\x45\x39\xae\x47\x23\xcb\xc6\xbf\x5c\xdb\x6d\xad\
+\xa7\x55\xfc\xd4\xe0\x71\xbb\xaa\xd2\xe7\x06\xc1\xf1\x89\x33\x51\
+\x9c\xc3\xa3\xab\x8f\x5e\x24\xa2\xa1\x3f\xc2\x10\x8d\x6a\x3f\xd0\
+\xa3\xe5\xa3\xfb\x8b\x86\xa6\x01\xe6\x6e\xef\x60\xb9\xb9\xc1\x49\
+\x71\xc5\xd0\xa5\xd1\xd5\x91\x83\x25\xed\xff\x7d\x30\xb5\xfc\x54\
+\x83\xd3\xe5\xa8\x4a\x9d\x13\xa4\xbc\xf0\x70\x50\xeb\xc8\xf6\xa8\
+\x90\x26\x54\x8c\x51\xe2\x45\x99\x87\x2c\xab\xf5\x63\x07\xd6\x56\
+\x4f\x03\x64\xbd\x74\x9e\xa5\x26\x39\x30\x3c\x12\x83\x2e\x8d\xad\
+\x8f\x1c\x7a\xb4\xed\x5a\xe1\x06\xb7\x9c\x6c\x10\x9c\x42\x55\x72\
+\x5a\x12\x04\x41\xb0\x37\xa7\x09\x0a\x22\x04\x90\x14\x86\x98\xac\
+\x53\xc1\x99\x9b\xc5\x83\x25\xad\x53\x00\x19\x2f\xfc\xc1\x4c\x43\
+\x87\x36\x1e\xde\x22\x1d\x5e\x7f\xe8\x46\x55\x91\xb2\xe9\xf8\x1e\
+\x8a\x60\xa7\x3f\x98\x0c\x5e\xe0\xe1\xa6\x48\x1c\xba\x82\xf1\x98\
+\x06\xd5\xe4\xa0\x2a\x4a\x63\xa4\xa5\xb4\x72\x0a\x20\xbd\xf2\x77\
+\xa6\x88\xc3\x3b\x26\x0e\x97\xee\x9d\xc9\xe1\x49\x2a\xfb\x76\x0f\
+\x2f\x08\x3b\x7d\xc9\xc9\xb6\x82\x97\xda\xb8\x12\x57\x21\xeb\x80\
+\x2a\xc7\xba\xa4\xd6\x27\x16\x4f\x01\xdc\x8a\x05\x9e\xfa\xea\x34\
+\xef\x70\x14\xb9\x03\x01\x38\x2d\x15\x2a\xef\xb8\x6a\x40\x8b\x47\
+\xb5\x89\xa3\x4f\xba\x66\x0d\xf0\x6f\x3c\xb2\x8a\xa6\xb3\x4e\x9f\
+\x1f\x5e\xb7\x8b\x84\x28\x07\x8a\x01\x35\x16\xe9\x8a\x7d\x5d\x36\
+\xfb\x08\xbc\x1b\x5a\xdc\xb4\x5d\x76\xb8\xbd\x08\x04\x7c\x14\x00\
+\x01\x62\x71\xe8\x72\xbc\x31\x7e\xec\xd9\xca\x59\x03\x3c\xa5\xcd\
+\xab\xe8\x78\x9f\x15\xbc\x7e\x08\x2e\x8f\xdd\x5e\xf4\xa8\x68\x50\
+\x3f\xdb\x1c\xff\xfe\xb9\xd6\xd9\x03\x1e\xfb\xe2\x2d\xea\xe2\x35\
+\x4e\x3f\x9d\x70\xa7\x0b\xaa\x24\x02\x86\x5e\x2f\xb7\x95\x4f\x3f\
+\x07\xff\xd7\xdc\x25\x9f\x97\x53\x4b\x7c\x9b\xb6\xe7\x58\x0a\x1c\
+\x03\xfd\xc5\xc0\x7b\x04\xac\x57\x4f\x56\x0c\xdd\x32\xc0\xb5\xae\
+\x29\x8d\x76\xac\xa1\xf6\xba\x1d\x8c\x7b\x84\x20\x3d\x24\x70\x86\
+\x64\xbe\x53\x4f\x6d\x6d\xbd\xd6\x9e\x7f\x00\x0d\xd5\x2e\x37\x61\
+\xeb\x71\x9a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xeb\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xb2\x49\x44\x41\x54\x78\xda\x63\x64\xc0\x03\x84\xbb\
+\xae\x2c\xf6\x56\xe5\x8b\x4e\x31\x12\x62\x3c\xfd\xec\x1b\xc3\x89\
+\x27\xdf\x7e\xec\xbb\xff\x65\x3b\x50\xaa\xe1\x6d\x99\xce\x25\x06\
+\x22\x00\x23\x2e\x09\xa9\xbe\xab\x07\x16\xf8\xcb\xda\xbb\x2a\xf1\
+\xa2\x88\xbf\xfd\xf6\x87\x61\xcd\xf5\x8f\x0c\x6b\xaf\x7f\xfc\x74\
+\xee\xf9\xf7\x6d\x40\xa1\x32\xa0\x65\x8f\x49\xb2\x00\xe8\xf2\xa0\
+\x3e\x37\xa9\xb5\x71\xfa\x82\x78\x5d\x77\xfb\xf5\x77\x86\xa5\x67\
+\x5e\x32\xac\x38\xff\xe6\xc5\x1b\x56\xce\x52\xa0\x45\x4b\x88\xb2\
+\xc0\x78\xe6\x8d\x4b\x27\x53\xd5\x74\x99\x19\x19\x19\x88\x05\x3b\
+\xaf\xbf\x63\x58\x72\xfa\xd5\xef\xed\xd7\xde\xed\xfc\xc3\xc8\x98\
+\xf5\xb1\xc3\xea\x31\x4e\x0b\x3a\x0e\xbd\xf8\x5b\x6e\x2b\xce\x44\
+\xb4\xe9\x48\x60\xf5\xb9\x57\x0c\x95\x9b\xee\x7e\x7d\xf5\xe9\xb7\
+\xc8\xe7\x7e\xfb\x1f\x18\x16\x08\x36\x9f\xd3\x5b\x1a\xa6\x74\xd1\
+\x53\x8d\x9f\x24\x83\x0f\x5c\x79\xc5\x50\x38\xff\x02\xc3\xdd\xbf\
+\x6c\x40\xde\x7f\x06\x06\x66\xe6\xf6\xcf\x7d\xf6\x55\x98\x16\xd4\
+\x9f\x6e\x39\x93\xaf\x5b\x2d\x2f\xc0\xce\xc0\xc4\x88\x27\x15\x20\
+\x81\x83\xd7\xde\x30\x78\x35\x1e\x60\xf8\xfb\xef\x3f\x03\x33\x17\
+\x07\x58\x8c\x49\x80\xe7\xf2\x97\x49\x4e\x7a\x18\xfa\x85\x6b\x4f\
+\x6d\x7d\x54\x6b\xe2\xc5\xc2\xcc\x08\x36\x9c\x11\x6a\x09\x32\x1b\
+\x1d\xf8\xcf\xbb\xc1\xb0\xef\xfc\xb3\x8a\x2f\x53\x9c\x3b\x79\x73\
+\xf7\x66\xff\xff\xff\xdf\x05\x28\xfc\xe6\xcb\x14\x97\x54\x0c\xf5\
+\x2a\xcd\xa7\xee\x5c\x28\x37\x55\x06\x1b\x06\xc4\x4c\x50\x83\x99\
+\xa0\x2a\x99\xa0\x31\x07\xb3\x14\xe4\x6a\x99\xfa\x93\xcf\x5f\xb4\
+\x58\x4a\x61\xf3\x1d\x86\x05\x26\x5d\x67\x3f\xed\xce\x37\xe2\x85\
+\x19\x8c\x62\x09\xb2\x8f\xa0\x7c\x50\x52\x35\xeb\x3c\xdd\xf9\xa9\
+\xcf\xbe\x82\x28\x0b\x5c\x26\x9c\xfb\xb3\x2c\xdd\x90\x19\x66\x00\
+\x13\xd4\xf5\x70\x43\xa1\x6c\x98\x65\x07\x6f\xbe\x67\x08\x9e\x71\
+\x51\xee\xf3\x24\xc7\xc7\x04\x2d\xe0\xce\xda\xc5\xe6\xa4\x2d\xf6\
+\x73\x7a\x82\x3e\xc4\x60\xa8\x21\xcc\x48\x3e\x61\x42\x0a\x1e\x10\
+\x7b\xf9\xc9\x67\xff\x53\x6c\xa4\x71\x26\x69\x54\x0b\x52\xb7\x5b\
+\xf8\x99\x49\x1f\x6f\x8b\xd0\x65\x60\x62\x42\x32\x10\x64\xf8\x7f\
+\x24\x36\x92\xe5\x13\xb6\xdd\xf9\xd5\x10\xa0\xca\x4e\x94\x05\x9c\
+\x09\x9b\x8b\xe3\x9d\x95\x7b\x8a\xfc\x35\x21\x06\x30\x40\x5d\xcf\
+\x84\xea\x7a\xe4\x60\xab\x5d\x71\xe5\xc3\x8c\x04\x5d\x41\xe2\x2c\
+\x88\xd9\xb0\xa3\x38\x54\xcf\x3d\xc2\x4e\x11\xee\x5a\x66\x64\x43\
+\x91\x0c\x87\xb1\x33\xa7\x9f\x7a\xba\xa1\xd8\x5c\x86\x28\x0b\xd8\
+\xc3\xd7\x7c\x9a\x5a\x60\xcf\x6b\xa4\x26\x82\x30\x08\xe6\x5a\x50\
+\xe6\x64\x82\x5a\x0a\x35\x1c\xa4\x3b\xac\x79\xdf\xd9\x53\x1d\xce\
+\x26\x04\x2d\x60\x0b\x5c\x76\xd2\x52\x47\xda\xac\x35\xc7\x96\x81\
+\x15\xe8\x6c\x78\x04\x33\xa0\xfa\x04\x96\x74\x19\xa1\x71\xe2\x52\
+\xb8\x7e\xdb\xe3\x79\x41\xde\x38\x2d\x70\x6d\x38\xe4\xfd\xf3\xd7\
+\x9f\x95\x16\x46\x72\xdc\xee\xd6\xca\x60\x4d\xcc\xc8\x29\x87\x11\
+\x11\x17\x60\x57\xff\x47\xd0\xbf\x7e\xff\x65\xb0\x8a\x5f\xd8\xfb\
+\x67\x67\x72\x09\x4e\x0b\xf8\x3c\x67\xe7\xdb\x59\x6b\x76\x87\x07\
+\x1a\xb3\x0a\x09\x70\x80\x5d\xce\x8c\x14\xfe\xcc\x8c\x68\x49\x13\
+\x64\x36\x34\x55\xdd\x79\xf4\x8e\x21\xbe\x78\x45\xc9\xdf\x83\xd9\
+\xbd\x04\x83\x88\xd7\x79\xda\x4c\x67\x17\xfd\xe4\xe0\x40\x63\x66\
+\x3e\x6e\x76\xb8\x45\xcc\x50\x15\xcc\x50\x1b\xc0\xae\xff\x07\x61\
+\x6f\xd9\x7d\x8d\x61\xc2\xf4\xdd\x9e\xff\x8e\x17\xec\x20\x2a\x92\
+\x19\x4d\xba\x78\xf8\x05\xb8\x17\x3a\xb9\x18\x06\xf9\xfb\x1a\x33\
+\xf0\x70\xb3\x81\xf3\x03\x72\xd1\x00\x8b\x70\x90\x60\x4b\xe7\x66\
+\x86\x13\x27\x6f\xf3\xfe\x3b\x55\xfc\x85\x28\x0b\xe0\x82\x86\xed\
+\xe2\x7c\x7c\xdc\xeb\xdd\x7d\xcd\x2d\x7d\xbc\x0d\x19\x38\x38\x58\
+\xc1\x79\x01\x1c\x44\xff\x21\xe1\x74\xfb\xf6\x0b\x86\xea\xaa\x65\
+\x6f\xfe\x9c\x2c\x16\x65\xc0\x03\xf0\x16\xf7\x8c\xfa\x6d\x1a\x82\
+\xc2\x7c\x1b\xbd\xfc\xcd\xd5\xdc\x3d\x0d\x19\xd8\x59\x99\xc1\x3e\
+\x79\xf4\xe0\x35\x43\x53\xc3\xaa\x7f\x9f\x3e\xff\xb0\xfe\x7f\xb6\
+\xe4\x04\xd9\x16\xc0\x81\x41\xbb\xb3\xa8\x98\xe0\x22\xff\x20\x0b\
+\xa9\x97\x2f\x3f\x30\xec\xde\x79\xe1\xf5\x8f\x9f\x7f\x5d\x18\xce\
+\x16\x13\x6c\xba\x00\x00\xa2\x00\x34\x28\x8b\xa4\x3f\x9c\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\xe6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xad\x49\x44\x41\x54\x78\xda\xa5\x55\x4b\x68\x14\x41\
+\x10\x7d\x35\xb3\x9b\xec\x66\x45\x34\x48\x10\x54\xb2\x2a\xc4\x1c\
+\x5c\x3f\x10\x02\x42\x0e\xc1\x80\x18\x82\x51\x62\xf4\xb0\x8a\x06\
+\x0d\x28\xa2\x06\x3c\x85\xf1\x64\x0e\x7b\xf2\x14\xf6\x28\x42\xc4\
+\x93\x48\x50\x3c\x29\xf8\xc1\x43\x4e\x5e\x3c\xf9\x81\xa0\xa2\x66\
+\x15\xa2\x82\x07\x41\x37\x52\x76\x4f\xd7\xf4\xce\xce\x7e\xb2\x83\
+\x0d\x35\xfd\xa9\xcf\xab\xee\x7e\xd5\x43\x45\x97\x18\xaa\xb5\xbb\
+\x84\x94\xe3\x20\xed\x3a\xe8\x08\xf5\x29\xd5\xa7\x1c\xa3\x4b\xa8\
+\xbe\xcc\x8c\xec\xd2\x0f\x42\x8b\x8d\x7e\xbf\x7d\xc3\xad\x1a\xbb\
+\x9d\x9d\xf8\x94\xeb\x41\xb6\x14\x03\xe0\xcb\xad\xb9\xe6\x00\x3a\
+\x94\x58\x64\x76\xe6\xf0\x6d\x64\x28\x1e\xc0\xab\x99\x6b\xcc\xca\
+\x5c\x1f\x14\x9b\x8f\x89\x19\x04\x0e\x01\x6c\x18\x18\xc0\xaf\x93\
+\xe3\xf1\x8e\xe8\xf9\xa9\x13\xc6\x9d\x25\xdd\x50\x40\x58\x85\x89\
+\xb7\x65\xf4\x10\xe8\xf2\xf9\x78\x3b\x98\xdf\xd7\x2f\x00\x95\xc8\
+\x7e\x48\x99\x1a\x5c\x35\x51\x97\xdb\x7b\x7a\x02\x99\x99\xab\xf1\
+\x00\x6e\x6c\xec\xaa\xca\x57\x62\x05\x49\x57\xed\x66\xf7\xd4\x14\
+\xba\x66\xaf\xa3\x3b\x0e\x40\x31\x21\x34\xd5\xd4\x14\x3a\x76\xb8\
+\x46\xd2\x3e\x45\x0d\x4d\xb5\x3e\x49\x42\xd3\x38\x00\x4e\x5e\x72\
+\x4c\x18\xa1\xa4\x46\x53\xd2\x16\xea\x53\x66\x4c\x29\x99\x27\x43\
+\xbd\xab\xe4\x2f\xb0\x32\x86\xba\xa0\x34\xbf\xe8\xb5\x5c\x07\xf5\
+\xda\x8e\x75\x83\xd8\xf3\xec\x00\xca\x47\x1b\x00\x5c\x59\x40\xeb\
+\x00\xe1\xbb\x91\x36\xb4\xc9\xc3\xe1\x17\x05\xac\x34\x02\x98\x7c\
+\x5c\x4b\x4a\xab\x5c\x65\xae\xdb\x48\xd6\xc3\xf1\x97\x85\xc6\x47\
+\x34\x7a\x2f\xe2\x23\x59\x52\xf5\xb4\x26\xb0\xd4\x24\x8e\xf5\x78\
+\x38\xf3\xba\x80\x72\x23\x80\xfe\xb9\x8a\xaf\x0d\x1a\x54\x76\xb0\
+\x16\xaa\x89\x68\x94\x89\x9c\x87\x4b\xef\x9b\xec\x60\x6b\xb1\xf6\
+\x0e\xfc\x78\xa1\x68\xd1\x92\xb0\x91\xd4\xc2\x85\x3e\x0f\xd3\xa5\
+\x26\x00\x96\xa6\x9a\x6e\x49\x23\x14\x50\x34\x22\x9a\xa6\xdc\x26\
+\x7a\xb1\x5d\x95\xa6\xce\xf0\x03\x03\xa0\x8a\x09\xea\x9f\x00\xc7\
+\x95\xde\x01\xab\x42\x23\x25\x50\xc2\x09\xd7\xef\xb5\x8e\x5d\x17\
+\x94\xd0\x63\xb3\xc6\x6a\x4d\xdb\xb1\x63\xf4\xa4\x7d\xf5\x93\xa0\
+\x62\xd2\x93\xcf\x7f\xfe\xab\x0e\x1a\xb5\xee\x35\x0e\xb6\x17\xdf\
+\x81\xa6\x17\x7e\x5a\x80\x30\x63\xc8\x7e\xaa\x4e\x5d\xec\x2a\x17\
+\x54\xb1\xa3\xca\xaa\xba\xc0\xc1\xcd\xed\x38\x78\xfb\x23\xe8\xdc\
+\xa3\x65\xf3\x60\x2a\xea\x30\xd5\xbb\x50\x96\x31\x59\x05\x51\x18\
+\x2c\xe4\xc3\xc1\x63\xc9\x18\xde\x96\xc6\x91\x3b\x4b\xa0\xf1\xbb\
+\x25\x8e\x5a\x52\xd4\xb1\xce\x3e\x1a\xe9\x83\xf1\x58\x6f\x06\xf9\
+\xfb\x5f\x41\xfb\x6f\x7e\x60\xeb\x10\x3c\xd5\xa0\x50\xe6\xf6\x30\
+\xfc\x3f\x9e\xad\x8f\x9a\x32\x37\x0b\xfe\x2e\xd4\x28\xbf\x6b\x2d\
+\x26\x1f\x2e\x83\xf6\xce\x2e\x72\x75\x1e\x92\x89\x72\x20\xae\xfc\
+\x8b\xfc\x23\xb4\x67\x24\x56\x1c\x1c\x5e\x34\x1d\xc6\xd9\xbe\xf5\
+\xb8\xf8\xf4\x7b\x84\xa6\x42\x33\xd3\x1b\x9a\xfa\xd4\xd4\x94\x74\
+\x84\x96\x09\x59\x93\x75\x76\x85\xd6\xae\x63\xfd\x20\x14\xd5\xf2\
+\x0f\xf6\x51\xee\x11\xce\x6c\xc5\xdd\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x05\xed\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xb4\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x68\x14\x57\
+\x14\xfe\xee\x3c\x36\x3b\xfb\xc8\xae\xba\x49\x8c\x26\x34\x75\xd5\
+\xd5\x68\x9b\x2a\x92\xc6\x6a\x8a\xf4\x47\x5b\x94\xd6\xa6\xbe\xa8\
+\x62\xa9\x94\x6a\x48\x0a\x5a\xa1\xd4\x80\x60\x05\xa9\xb6\x82\x0f\
+\xd0\x10\x6b\x41\x24\x98\xf8\xca\xa6\x88\x48\x11\x2a\xda\x68\x7d\
+\x40\x1f\xd6\x92\x26\xb1\xd1\x6a\x1a\x93\x98\x6c\x92\x7d\x64\x5f\
+\xb3\x33\xd3\x33\x33\x9b\xad\x56\x53\x2f\x7b\xb8\xb3\xb3\x97\xef\
+\x3b\xe7\x3b\x8f\xbb\x0c\xff\xb3\x42\x7e\xa1\x0c\x1a\x16\x81\xa1\
+\x94\xf6\x62\x7a\x55\x98\xfe\xa9\x8b\xac\x95\xec\x06\xd9\xc5\xec\
+\x65\xa9\x6b\x63\x61\xb0\xa7\xbd\x8c\x34\x0b\xe5\xb4\xad\x61\x16\
+\xfb\x6a\xce\x3e\xde\xc9\xd9\xc6\x81\x59\x1d\x80\x60\x01\x34\x0d\
+\x5a\x32\x0a\x2d\x16\x34\x4c\x8d\x05\xc3\x9a\x1c\x6f\xa0\xf3\xc7\
+\x1c\x15\xa9\x96\x67\x12\x84\x9a\x84\x2a\x26\x5a\x37\x0b\xee\x49\
+\x5e\xc1\x33\x11\xcc\x6e\x03\xe3\x54\x3a\x99\x02\xd3\x08\x5f\xa5\
+\xe7\x14\xa0\x2a\x74\x38\xa9\x11\x41\x04\xa9\x50\x1f\xd4\x70\xa0\
+\x53\x53\xe4\x3d\x14\x4d\xed\x98\x04\xc3\xa7\x84\x1a\xce\xe6\xda\
+\x2e\xe6\x16\x89\x96\xdc\x1c\x30\x91\x10\x99\x00\x70\xe9\x63\x9a\
+\x42\x01\x10\xba\x42\x96\xa2\x67\x59\x85\x2a\xd3\x99\x84\x0a\x39\
+\x3c\x80\xd4\x70\xaf\xac\x26\x62\xdb\xc6\xad\x48\xed\x7c\x82\x20\
+\x70\x82\xaf\xe2\x24\xd7\x3e\xa9\x60\x9a\x28\xe6\xb8\x01\x51\x24\
+\x60\x91\xbc\xa7\x1d\x9c\x8e\x4e\x1f\xd9\x34\x35\x49\x5c\x09\x40\
+\x4e\xd1\xa3\x4e\xa2\x42\x23\x12\x25\x32\x0c\x39\xd0\x23\xa7\x92\
+\xd1\x4d\x9e\x55\x4a\x6d\x86\xe0\x61\x83\x50\xce\x89\x96\x23\x52\
+\x81\xcf\x9b\x95\x9f\x03\xce\x4a\x5e\xf3\x36\xc2\xcd\x42\xc5\x92\
+\x86\x4c\x84\xcd\xe7\xd6\x18\x7b\xc5\xe2\x63\x99\x77\xfe\xd3\xe5\
+\xc4\x49\x84\x14\x89\x1a\x4c\x21\x19\x1c\x40\x3c\xd0\xd7\xa9\x2a\
+\xf2\xba\xbc\xd5\x4a\x8b\x41\xf0\xa0\x9e\xaf\xb3\xe5\x3d\xb7\xc1\
+\x5e\x34\x05\x9c\x83\xbc\x15\xec\x60\xbc\x44\xe0\x8d\xf8\xf6\xaa\
+\x8a\xfa\x9b\x26\x58\x53\x25\x67\xec\xcb\xea\x54\x63\x5f\x5b\x02\
+\xbc\x33\x9f\x83\xff\xe4\xcb\x14\x8d\x4a\x12\x51\x24\xc9\x04\xa2\
+\x03\x3d\x88\x0f\x0d\x1d\x9a\xf4\xbe\x52\xc9\xba\x8e\xf0\x65\x82\
+\x55\x3a\xef\x9e\x36\xcb\x29\x4e\x70\x80\x49\x16\x92\xc5\x8e\x8a\
+\xb7\x9b\xf0\xe5\xe1\x1f\x71\x43\x29\xcb\x00\xe5\x4c\x5f\x64\x00\
+\x1f\x3e\x7a\xc1\xf8\xae\x13\x95\xf2\xd7\xf0\xd9\x47\xaf\xc0\xdf\
+\x38\x8f\x08\x28\x2f\x09\x05\xca\x48\x08\xc3\x3d\x0f\xc2\x8a\x9c\
+\x7a\x9d\xdd\x39\xcc\x6f\x71\xe4\xe6\xed\x74\x4f\xf1\x81\x77\x91\
+\x66\x16\x89\xe4\x21\x82\xb7\x4e\x67\xbc\x1f\xf5\x7c\x94\xa0\xbf\
+\xe3\x62\x26\x92\x4c\x14\xc7\xe7\x42\x21\x02\x35\xa1\x97\x71\x0c\
+\xa1\x9e\x5e\x44\x83\x23\x35\xac\xa3\x8e\xf7\x7b\xbc\xde\x0a\xc7\
+\xc4\x49\xe0\xdc\x1c\xe5\x35\x8b\xb4\x37\x23\xd0\x09\xf4\x35\x2a\
+\x51\xfb\xd7\xaf\x19\xbb\x6f\xfd\x85\x8c\x44\xfa\x32\x08\x1a\x4a\
+\xa0\x84\x28\x0f\x14\x81\x2e\xd3\x48\x60\x08\x83\xbd\x83\xcd\xac\
+\xf5\x00\xdf\x56\x50\x52\xec\xb3\xba\xdd\xe0\x1d\x8c\x22\xb0\x52\
+\x0e\x48\xff\xa5\x67\x0c\x89\x7c\xb3\xcb\x32\x09\xdd\x5a\x6d\x12\
+\xec\x38\x78\x21\xf3\xae\xfd\x77\x53\xa2\xa6\x86\x17\xa1\x04\x55\
+\x43\x22\x3d\xe9\xc9\x70\x04\xdd\x77\xfa\xdb\xd9\x6f\x7b\xb9\x91\
+\xa9\xf3\x4b\x6c\xbc\xcd\x0a\x5e\xe2\xa9\x63\xa9\x34\x45\x92\x89\
+\xb3\x52\x14\xcd\x8f\x35\x61\xf3\xb9\xb5\xe9\x2a\xaa\x7f\xec\xbd\
+\xff\xe4\x4b\xe4\x75\x8a\x22\x50\x8c\x72\xd5\x09\x94\x58\x1c\x77\
+\xfe\xe8\x8d\xb2\x9f\x76\x73\x23\x33\x17\xcc\x26\x02\x09\x9c\x44\
+\x12\x65\x09\xd4\x5b\x34\x12\x84\x2c\x68\x54\xa6\x8c\xe9\xfd\x90\
+\xee\x03\xbd\x7d\x35\x2a\x49\x2d\x01\xa6\xc6\xa8\x17\x62\x54\x3d\
+\x71\x02\xd4\x81\x75\x79\x54\xc3\x34\x59\x86\x12\x8f\xe1\xf6\xad\
+\xfe\x28\xbb\xbe\x8b\x6b\x9b\x31\xcf\xeb\xcb\x72\xb9\x4c\x02\x2b\
+\x47\x11\xa4\x49\xa8\xc9\x34\x8e\x9e\x19\xa7\x8f\x20\xe8\x33\x82\
+\xa9\xb2\x49\xa2\xc6\xa9\xa3\xf5\x66\x93\xe9\x2b\x01\x27\x4d\x02\
+\x10\x99\x9a\x94\x11\x0d\x45\xd1\xd9\x36\xd4\xce\xae\xec\xe0\xfc\
+\x45\x33\x27\x56\x4c\x28\xf0\x90\xfe\xa2\xde\x5b\xb4\x93\x54\x22\
+\x19\xcf\xe3\x52\x4b\x00\xfb\xf6\xb7\x3d\x75\x52\x6e\xac\x2e\xc4\
+\xab\xa5\x92\xe9\x7d\x52\x35\x88\xb4\x34\x41\xa0\x2f\x82\xae\xbb\
+\xe1\x66\x76\xe9\x73\x6e\x4b\xee\xe4\xec\x9d\x45\xb3\xf2\x4d\xcf\
+\x09\x9c\x13\xf5\x64\x33\xfc\x70\x75\x18\xf5\xdf\xdc\xc7\xdc\x3f\
+\x19\xa6\xf7\x93\x4c\x4c\xcb\x80\x77\x78\x34\x5c\x29\x52\xb1\xbe\
+\x72\x32\x16\x14\x5b\x32\xe0\xa6\x25\x71\xff\x6e\x08\x0f\xfb\x12\
+\x35\xec\xfb\xad\xac\xcc\x66\x17\xcf\xcf\x98\x93\xef\x94\xb2\x69\
+\x3c\x08\xbc\x01\xae\x93\x2c\xff\xf0\x16\x16\x07\x5c\x28\x0e\x5b\
+\x09\x9b\x19\x04\x86\x54\xe9\x09\xd6\xea\x88\xe3\x9c\x27\x88\x13\
+\x7b\x8b\x8c\xc1\xa7\xe9\x03\x30\x95\x42\x2c\x1c\x47\x7b\x5b\x38\
+\x14\x8b\xa9\x6f\x18\x47\xbf\xdb\xc2\xea\x9e\xf3\x66\x6f\x28\xf2\
+\x79\xcc\xe1\x26\x52\x1e\x04\x86\x95\xd5\xad\xd8\x91\x98\x63\xe0\
+\x69\xcc\xcc\xf3\x7f\xe7\xf0\x56\xcb\x2f\x38\xfe\x55\x21\x01\xeb\
+\x45\x20\x1b\x04\x7f\x75\x92\x3c\x5d\x89\x43\x6f\xee\xd2\x2a\x8d\
+\x63\x67\x3f\x65\xe5\x92\xc4\x1f\x99\x36\xd3\xed\xcd\xc9\x77\x52\
+\x27\x93\x54\x3c\x87\x55\x9b\x3b\xf0\x41\xf6\x1c\x94\x66\x15\xc0\
+\x74\x3c\x8d\x9a\x96\xea\x7a\xbc\x1b\x47\x43\x3f\xa3\xf1\x8b\x7c\
+\x4a\x38\x45\x40\x63\x7c\xe0\x21\x55\xcf\xed\x58\x67\x22\xae\xad\
+\x5b\xb2\x5b\x6b\xc9\x8c\xeb\x33\x9f\xb0\x2a\xf7\x78\x61\xdf\x54\
+\x9f\x4b\x74\x7b\x24\x8a\x84\x47\xcb\xaf\x51\x9c\x3a\x1b\xc1\xf2\
+\x09\x65\x58\xe8\x9e\x4e\x24\xff\x86\x71\x79\xb8\x03\xa7\x03\xd7\
+\xb0\x72\xb1\x15\x0b\x67\x0b\x46\x09\x0f\x0d\x26\xd0\x79\x3b\x26\
+\x0f\x05\x95\x4d\x4b\xf7\xa0\xf6\x91\x40\xd3\x8d\xb4\x91\xd5\x8c\
+\x1b\x2f\x6c\x7f\xde\x6b\x13\x73\xf2\x6c\x46\xfd\x5f\xbe\x19\xc7\
+\xc1\x93\x83\x4f\xad\xa2\xea\xe5\x2e\x2c\x78\x81\xc0\x15\x45\x4f\
+\x28\xee\xdd\x8b\xcb\x83\x43\xda\xb6\x77\xf7\x6b\x4f\x5e\x38\xa3\
+\xeb\xd4\xc7\xa8\x92\x24\x6e\x73\x61\xa1\xd5\x9b\x5f\x60\x85\xdd\
+\x21\x18\xd2\x98\x12\x69\xa6\xff\x9a\x4a\x2a\xe9\x9a\xab\x88\x44\
+\x64\x3c\xe8\x4e\xe2\xef\x6e\xb9\x33\x16\xd7\xf6\xac\x38\x80\xb1\
+\xaf\xcc\xd1\x75\xa2\x0a\xc6\xa5\xef\x74\x70\xab\x3d\x1e\xc1\x49\
+\x51\xc1\xe9\xe4\x61\xb3\x73\xfa\xad\x89\x78\x4c\x41\x90\x2e\x97\
+\x41\x9a\x9e\x81\x80\x12\x8a\x44\xd4\x46\x3a\x7f\x6c\x55\x2d\x9e\
+\x7d\xe9\x3f\xba\x1a\x2b\xa1\x4f\xba\x45\x64\xa5\x64\x63\xfe\x6d\
+\x79\xaf\x0e\x63\xfe\x6d\xf9\x07\x10\x4a\xb0\x45\x30\xd9\x5e\x48\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x26\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xed\x49\x44\x41\x54\x78\xda\xb5\x95\x7b\x4c\x95\x75\
+\x18\xc7\x3f\x87\x57\x38\x9d\x0b\x02\x72\x99\x93\x63\xb0\x2c\xc0\
+\xd0\xca\xe2\x96\x97\x5a\x51\x0e\xb1\xd1\xba\xb0\x22\xa9\x95\xab\
+\x66\x93\x6c\xb8\x51\x6b\x5a\x59\xd9\xc5\x6c\x59\x6e\xce\x69\x6b\
+\x4e\xc6\xd4\x59\x91\x3a\x4c\xfe\x28\x5c\x64\x62\x18\x23\x17\xe8\
+\xd1\x3a\xd9\x31\x38\xf3\x68\xde\xce\xd5\x73\xe3\xf4\xbc\xbc\xb6\
+\x73\x18\x08\x2d\xe9\xd9\x7e\x3b\xe7\xfd\xbd\xcf\xef\xf9\x3e\xbf\
+\xef\xf3\x7d\x9e\x57\xc7\xff\x6c\xba\x7f\xeb\xd8\x02\x0f\x2d\x2c\
+\x2b\x68\x3e\x7a\xc4\xda\xd8\xee\x67\xf1\x0b\x10\x19\x57\x80\xe3\
+\x66\xdc\x79\xcd\xbb\xcd\x91\x4d\x6b\xf8\xfc\xcb\x83\xef\xd4\xc0\
+\xca\x71\x03\xd8\x0e\xaf\x54\x95\x17\xbc\x6f\xdc\xd3\x05\xdf\x7c\
+\xc5\xfe\x07\x6b\xdb\xee\x85\xf2\x71\x03\x68\x83\x1f\xef\xd9\xbe\
+\xb9\x84\xc7\x9f\x83\x3e\x3b\xf6\xa2\x5c\x5f\x8b\x93\xb9\x75\xd0\
+\x7d\xcd\x00\x1b\xa1\x78\x41\x26\xdf\xe7\x74\xf4\xea\xc9\xcd\xd7\
+\x36\x9f\x7a\x80\xad\xdb\x5a\xd7\x3e\x0d\x2f\x5f\x33\x40\x13\xac\
+\x5e\xf4\x4c\xd5\x0a\x36\xee\x84\x9f\x0f\xc2\xe4\xeb\xa1\xa3\x8d\
+\xf6\x9a\xe7\x4f\x1d\x80\xfc\x15\x70\xf9\x3f\x03\x7c\x04\xc6\x12\
+\x85\xe3\x73\x9a\x36\x5b\x28\x9e\x03\xd6\x5e\xd9\x31\xc2\x4d\x33\
+\x88\xdc\x5f\xca\x3a\xab\x73\x5e\x03\x1c\x18\x15\x40\x32\x5c\x9c\
+\x04\x05\x91\x38\xd9\xa9\x7f\xc2\xb2\x26\x40\xf2\xa3\x85\x59\x4b\
+\xf5\xad\x9d\xf0\x6b\x0f\xf8\x7c\xf2\x32\x08\x85\xb3\x60\x55\x03\
+\xed\x4d\x5f\x9f\x76\x40\xef\x39\x38\x26\xee\x97\xe4\x5c\x92\x2c\
+\xf7\x25\x01\xf5\xc3\x89\x0f\xa0\x5f\x17\xbe\x65\x4a\x54\x79\xa2\
+\x16\x0c\x66\x59\x06\x50\x94\x2b\x28\xe2\xea\x17\xb7\xe9\xb7\x42\
+\xb6\xd0\xf2\x5b\xaf\xb6\x1f\x08\x40\x6a\x06\xe8\x25\xad\xb6\x7d\
+\xe2\x23\x0c\x39\xfa\xe0\xcc\x19\x39\x13\x95\xcc\x24\x35\x8f\x07\
+\x5b\x97\x2d\x74\xa3\x00\xea\xfe\x4c\x23\x60\xa9\xaf\x4f\xa2\xee\
+\x55\x2d\x80\xa8\x04\x45\x72\x37\x25\x6b\xcf\xe1\x80\x46\x8d\xcf\
+\x1d\xbb\xb7\x0a\x3e\x65\xaa\xd0\x25\x3e\x7a\xfd\x50\x4e\x54\xbf\
+\x7d\xbb\xf0\xbd\xbb\x1e\x53\x08\x9d\x4e\x54\x52\x5a\xa6\xd0\x72\
+\xdb\xc3\xe5\x19\xbc\xb7\x7e\x78\xb0\xf8\xa0\xf1\x16\x08\x0e\xf7\
+\x39\x7d\x0a\x76\xed\xc1\x7e\xc8\x1a\xde\x02\x0d\x6f\xc2\xc7\xba\
+\x2b\xc5\xbc\x2e\x0f\xbe\x5b\x38\xc3\x52\x42\xfd\x72\x61\x3e\x25\
+\x16\xf4\xdc\x59\x39\xe8\xd0\x28\x08\xc9\x6d\xd2\xd3\xc5\xdb\x38\
+\x94\x4a\x97\xb0\xde\xdf\x2f\xea\xea\x62\xbf\xc3\x75\xbe\x15\xe6\
+\x0b\xff\x5d\xc3\x54\xf4\x99\x60\x95\x1b\xa8\xcb\x79\xb2\x3a\x91\
+\xfb\x2a\xa0\x53\x04\x72\xf2\x0f\x09\x1c\x1a\x9a\xe9\xc0\x40\xec\
+\xd7\x64\x92\xe0\x0e\x22\xdd\x56\xb6\xfa\xa3\x1d\x47\xa0\x42\x78\
+\x70\x5d\x55\xa6\x6b\x65\x04\xcc\x83\x2f\x4a\x2b\xcb\x52\x07\x8b\
+\xae\x16\x75\x24\x53\x83\x7b\x45\x04\xd1\x08\xf6\xf6\x9e\x70\x23\
+\xac\x79\x7d\x84\xf9\x34\x62\x1f\x48\x4b\x1d\xae\x9e\x75\x43\x11\
+\xd9\x93\x63\xd9\xc6\x9b\xaa\x14\xd5\x5c\x9e\xc1\x5a\xfc\xd0\xfd\
+\xfb\x45\x99\x57\xb7\x6f\x90\xfb\x8e\x09\xf0\x06\xdc\xfc\x88\x8e\
+\xce\x99\x77\x4e\x37\x91\x9a\x12\x0b\xa6\x4a\xf0\x9f\xe0\xfa\x44\
+\xed\xd9\xeb\x15\xf5\xbb\xb0\x1d\x73\x84\x84\x96\xbb\x64\x1d\x1a\
+\x13\xe0\x2d\x78\xec\xb5\x74\xc3\x0e\xee\x28\x1c\x1a\x54\xb5\x09\
+\x22\x5f\xb7\x5b\x2b\xac\xd9\x3c\xa8\x77\xbc\xd2\x7c\x76\x27\x2f\
+\xf9\x07\x16\x09\xc0\xb6\x31\x01\x3e\x91\xf9\xb6\xcc\x92\xb2\x84\
+\x7c\x69\x13\xbf\x1c\x0e\x4b\xb0\x84\x04\x4d\x96\x27\x45\x29\xe9\
+\x72\x2b\x83\x68\xdf\x27\x0d\x16\x11\xfa\x14\x79\x77\xf6\x22\xab\
+\xdc\xa1\x4d\x22\xcb\x25\xa3\x02\xd4\x4b\xa8\xf9\x92\x4f\xc5\xb4\
+\x2c\x0b\x13\xcd\x9a\x7a\xd4\xe0\x7f\x5d\xa0\xcf\xe1\x1a\x68\x86\
+\x6f\x67\xc3\xdc\xa2\x0c\xa9\x7e\x66\x9a\xd0\xe3\xd1\x0e\x7a\x2e\
+\xb3\xc1\x15\xec\x90\xf1\x3d\x7b\x54\x80\x65\x30\x71\xa5\xc2\x85\
+\xcc\xc2\x9c\x04\x82\x92\xb1\x2f\x40\xc4\x79\x9e\x1d\x01\x8e\xca\
+\x34\xaa\x14\x0a\xec\x4b\x61\x6a\xb1\x7c\x76\x6a\x15\xf2\x94\xdc\
+\x2c\x51\x51\x74\x50\x4d\x7b\x9d\x1e\xa7\x88\xc3\xd2\xa8\x8d\xb1\
+\x91\x01\x44\x63\xd5\x6f\x27\x27\xee\x64\xa6\xd0\xd3\x63\xe3\x27\
+\x57\xd0\xbb\x1b\x3e\x5c\x2d\xa3\x2d\xde\xef\x59\xb9\xd7\x24\x91\
+\xe5\x8b\xb0\xdc\x92\x65\x4a\x20\x37\x1b\x5f\xe7\x09\xe4\x06\x29\
+\x5b\xe2\x7a\x60\x18\x80\x4c\xa3\x4a\x01\xd9\x6b\x94\x5a\x7e\x1a\
+\xe6\xb0\x34\x4d\x8d\x48\xcf\xc6\x55\x4c\x3e\xfc\x77\x57\x41\x73\
+\x85\xc2\xa4\x5f\x22\x04\xd7\x41\x9a\x00\xf8\x46\x2d\xf2\x78\xdb\
+\xdf\xc2\x9f\x80\x28\x10\xb4\x91\x4e\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x04\x32\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xf9\x49\x44\x41\x54\x78\xda\xb5\x94\x7d\x4c\x55\x75\
+\x18\xc7\xbf\xe7\xe5\xbe\x7b\xb9\x80\x5c\x2f\x02\xf1\x62\x58\x33\
+\xc1\xd6\x8b\x04\x02\xd1\x6a\xa9\x9b\x0d\xc6\xe6\xa4\xa2\x56\xe6\
+\x68\xb5\xe6\x2a\x37\x9b\xfa\x87\x6e\xb5\x46\xcb\xfc\xa3\xb9\x66\
+\xf6\x47\xb3\x56\x53\xca\x0a\x97\x8c\xa4\x64\x31\x42\xa6\x86\x15\
+\x6a\xe2\x54\x04\x2e\xdc\x2e\x70\x2f\xf7\x5e\x0e\x97\x7b\xce\xb9\
+\xe7\xa5\xe7\x5c\x35\xb2\x49\x21\xd0\xb3\xfd\x9e\xdf\x39\xbf\x97\
+\xef\xe7\x77\x9e\xe7\x3c\x3f\x06\xff\x87\xbd\x7b\xa5\x9a\x7c\x0d\
+\xb5\x22\x66\x9e\x85\x9f\x26\xbf\xcd\xce\xa3\x30\xcf\xa1\xa2\x67\
+\x9c\xc3\xfc\x00\xea\x2f\x65\x93\x3f\xe4\x71\xb0\x25\x1b\x0b\xec\
+\x70\xb0\x0a\x3a\x07\x22\x68\xf1\x59\xe6\x01\xf0\x56\xcf\xe3\xa9\
+\x36\xfe\xe0\xeb\xc5\xae\x85\x59\x4e\x06\xc1\xa8\x8c\x8e\xbe\x30\
+\x04\x51\x41\xeb\x9c\x01\xbb\x7e\xdf\x99\x9b\x62\xde\xb9\xbf\xca\
+\xc3\x85\x62\x71\x9c\xf4\x0a\xf0\x45\x62\x08\x4e\xc8\x60\x19\x06\
+\x2d\x7d\x73\x09\xd1\x8e\xb3\x5b\xee\x76\x5b\xf7\x1c\xd8\x90\x89\
+\x88\xa4\xe0\x78\x6f\x18\x43\x61\x11\xa3\x82\x08\x45\xd5\xe1\xb2\
+\x9b\xd0\x78\x4e\x9b\x25\x60\xeb\xaf\xf7\xf0\x1c\xf3\xcb\x7b\xd5\
+\x19\x66\x4f\x92\x09\x67\x86\x04\x12\x9f\xc4\xf0\xb8\x0c\x59\x51\
+\xb1\xc0\xca\xc3\x93\x64\xc5\x81\x8e\xe8\x2c\x00\xaf\x76\x99\x69\
+\xd7\x89\x75\x2b\x92\x1f\xa8\x2b\x4b\x43\x6b\x5f\x04\xfe\x70\x0c\
+\x23\x82\x04\x29\xae\xc2\x6e\xe6\xb1\x28\xc9\x82\x64\x9b\x05\xfb\
+\x5a\x02\xb3\x00\xbc\x7c\xf2\xc5\x64\x07\xbf\xff\xed\xa7\x72\x10\
+\x95\xe2\xe8\xe8\x8f\x20\x40\xe2\xb2\xaa\xc1\x41\xe2\x69\x4e\x4b\
+\xe2\xf4\x76\x13\x87\xdd\x87\x07\x67\x01\xd8\xd4\xd1\xfd\xd0\xf2\
+\xe4\xc2\xca\x95\xa9\x68\xef\x0b\x61\x2c\x6a\x84\x45\x4b\x84\xc5\
+\x65\xb5\x20\x18\x8c\x23\x36\xa9\x21\x18\x96\x31\x18\x90\xa6\x01\
+\x3c\xdb\xf6\x1a\xc0\x3c\x0c\x5d\x7f\x12\x9f\x55\xc8\x7f\x8d\x3f\
+\xd3\x56\x62\x84\x67\x6b\x6d\x1e\xce\xf8\x05\x8c\x4d\xca\x88\x93\
+\xb8\xc3\xc2\x43\x8c\xe8\x38\x77\x5e\x80\xaa\x69\x80\x9e\x58\xdd\
+\x65\xb8\x9b\x01\x1b\x8e\xbb\xc9\x7f\x4f\xed\xde\xeb\x23\xef\xe0\
+\x8b\xc7\xb6\xff\x6d\x7e\x4b\x4a\xaa\x65\x4f\x61\x51\x0a\x42\x93\
+\x52\xe2\xe4\x36\x13\x8f\xd0\x90\x84\xfe\xcb\x13\x31\x5a\xf1\x3e\
+\xb5\x6f\x68\xcf\xa9\x1b\x5b\xa6\x00\x55\xc7\x36\x91\xdf\xe7\x4c\
+\x32\x9b\x76\x3c\x7f\x17\xf6\x36\xf6\xc1\xe7\x9d\x50\xe9\x34\xab\
+\x71\x64\x4d\xeb\xf5\x35\x87\x72\x0b\x93\x6b\x6c\x8b\x4c\x89\x84\
+\x9a\x79\x16\xb1\xe1\x38\xfa\xcf\x47\x5a\x49\x69\x23\x1a\xd7\x0c\
+\xfc\x33\x18\x0c\xd6\x1e\x75\x51\xd7\xc4\xf2\x4c\x69\x6e\xc1\x42\
+\xd4\x55\xe6\x60\x4c\xd4\xd0\x35\x28\xe0\x54\xb3\x17\x13\x61\xc9\
+\xd8\x74\x1f\x9a\xd7\x8d\x61\x6d\xd3\xa5\x9c\x0a\x77\xbe\xce\x03\
+\x1c\xc7\x42\x8f\x28\xe8\x3f\x3d\x76\x4c\xd7\xf5\x6a\x9a\x8f\xdd\
+\x2a\xda\x0c\x1e\x3d\xd2\x4b\x7d\x5e\x4e\xb1\x07\xab\x4b\x17\xa3\
+\x7b\x44\x84\x11\x44\x4d\xd7\x21\x0a\x32\x2e\x7c\xe7\x85\x22\xa9\
+\x0d\x34\x56\x6b\x72\x9a\x62\x69\xab\xd2\x4c\x2c\xcb\x80\x8d\xe9\
+\xf0\x75\x8e\xfe\xa0\x4a\x6a\x25\x5a\xab\x6e\x29\x7e\x0d\x50\xfa\
+\x55\x11\xf5\x47\x19\x8e\x71\x67\x3d\x92\x09\x87\xc7\x4e\xa3\x0c\
+\x34\x4a\x96\x91\xb0\xe8\x08\x15\x50\xbb\x1f\xba\xa2\x6d\xb7\xdd\
+\x99\x54\xef\x5c\xe6\x02\x47\x79\x0c\xb4\x0f\xf7\xc6\x05\xb9\x00\
+\x1d\xeb\xa7\x15\x9f\xca\xc1\x83\x0d\xf9\xf4\xd4\x4c\x90\xfc\xd4\
+\xf2\x0c\x58\xd2\xed\x89\x2f\xd0\xd4\x6b\x10\xd1\x3b\x81\x68\x57\
+\x50\x75\x96\x7b\x38\xab\xdb\x06\xe1\xc4\x88\x26\xfa\xa2\x65\x38\
+\x5d\xd3\xf9\x5f\x7f\xf5\x54\x92\x57\x7c\x9e\x4a\xfe\x6b\xba\xa5\
+\x2a\x1c\x14\x2a\x3e\xc3\x96\x80\xe8\x9a\x8e\x92\x3b\x9c\xc8\xa6\
+\xea\x3c\x7c\x31\x04\xcd\x2f\x42\xf8\x71\x70\x37\xba\x6b\xdf\x98\
+\x49\xd9\xdc\xfc\x9b\x2e\xfb\xc4\x46\x43\x9f\x82\xc5\x7a\x73\x49\
+\x3a\xd8\xac\x05\xf4\xaa\x13\x93\x05\xc3\xb2\x89\x1b\x32\xfa\xed\
+\xd5\xcb\x5a\x58\x5c\x8e\x9e\xe7\xe4\xdb\x07\xdc\xb0\x25\x1f\xd7\
+\x13\x64\x1b\xb7\x6a\x31\xd8\x25\xae\x84\x30\xc3\x71\x50\xce\x06\
+\xa0\xfc\xec\x7f\x02\x57\x5e\x68\x9a\x89\xf8\xf4\x80\xec\x8f\x38\
+\x9a\xea\xa4\xd9\x95\x6c\x59\x26\xd8\xa5\x14\x3d\x49\x85\xd2\x70\
+\xc1\x07\x45\xcf\xc6\x40\x9d\x3a\x37\x80\x61\xe9\x1f\x1a\xb7\x66\
+\x1b\x3d\x15\xa3\x3c\x0b\x18\x97\x80\xdf\x46\xdf\xc4\x1f\x2f\xed\
+\x9a\xa9\xf8\xbf\x03\x0c\x73\x7f\x40\x39\xc1\x4f\x54\x16\xf7\x83\
+\x63\x54\xa8\xfa\x52\x04\x5e\xb9\x3a\x7f\x00\xc3\x52\xf6\x52\xa5\
+\xe3\x4b\x6a\x17\x11\xda\xbc\xf9\x76\xc4\x0d\xfb\x13\x33\x04\x98\
+\xfd\x4c\x72\xcd\xc9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x06\xb4\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x7b\x49\x44\x41\x54\x78\xda\xa5\x56\x6b\x6c\x5b\xe5\
+\x19\x7e\xbe\x73\x8e\xcf\xdd\x77\x3b\x8d\xe3\x24\xbd\x51\x27\xed\
+\xda\x46\x85\xaa\x0d\x4c\x54\xa8\x30\x71\x29\x1a\x48\x88\x1f\x80\
+\xd4\x1f\x45\x68\xa0\x6d\x6c\x5a\xd1\xc4\x24\xf6\xa3\xd3\x56\xa4\
+\x49\x63\x9b\xb6\x49\x83\x49\xa8\x88\xb1\xd2\x15\x6d\xb0\x76\xa5\
+\x65\xc0\x46\x94\xb6\x34\xa4\x4d\xda\x90\x3a\x6b\x69\x93\x26\x8d\
+\x73\xf3\xb1\x63\x3b\xbe\x9e\x73\xfc\xed\xb5\x3b\x0a\x65\xfc\x40\
+\x9a\xe5\xcf\xc7\xfe\x6e\xcf\xfb\xbc\x97\xe7\x35\xc3\x57\x7d\x3d\
+\x3f\xb2\x8d\x3e\x9f\xa3\xd1\x45\xa3\xf3\xfa\x3c\xc7\x59\x30\xdc\
+\x8b\x1f\x6d\x98\xf9\xb2\x63\xec\x2b\x03\xfc\xf4\x5c\x56\x93\xc5\
+\xc0\xf7\xb6\x84\xb0\x63\xb5\x17\x8b\x95\x3a\x7e\x77\xc6\xc2\xd1\
+\x64\x1e\x50\x84\x53\x04\xd0\xfb\x7f\x01\xa8\x3f\x1f\xad\xfd\xe4\
+\xf6\x16\xcf\xae\x9e\x00\xc2\x9a\xd4\x9c\x3b\x35\x53\xc6\x9e\xfe\
+\x79\xbc\x3d\x9c\x05\xf6\x6e\x62\x5f\x0e\xf0\xfc\x48\x02\x2e\xff\
+\xc7\xa6\x36\xad\x33\x11\x94\x51\x71\xf8\xff\xee\xa2\xb9\xf6\x90\
+\xec\x3c\xbd\x39\x2c\x45\x35\x11\x35\x97\x83\x31\x06\x91\xae\xfc\
+\xd7\x54\x11\x2f\x7d\x64\x61\xaa\xec\x60\x32\xef\xa0\x58\x71\x1b\
+\x27\x66\x69\xf1\x09\x62\x75\xb8\x01\x30\xdf\xee\xf5\x44\x9f\xbb\
+\x2d\x82\x1d\xab\x88\x7a\xd5\xfd\xd4\xb7\x9f\x33\x83\xc1\xa6\x4b\
+\xb3\x74\xd8\xae\x7f\xb6\x20\x10\x80\xee\x11\xc8\x3e\x60\x70\xb6\
+\x84\x33\xb3\x55\x0c\xa4\xca\xb8\x92\xab\x92\x11\xb0\x21\x60\x47\
+\x03\xc0\xf9\xce\x2d\x11\x71\xfb\x72\x13\x1e\x32\xc9\xe1\xbc\xe9\
+\x37\x7a\xdc\xe0\x3f\xfe\x05\xe2\x8c\xf1\xeb\xdf\x1b\xab\x22\x3d\
+\xfd\xaa\x88\x7e\x62\xb4\xff\xfc\x22\x46\xe7\x4b\xbc\xce\xd8\x20\
+\x01\x7c\xec\xfe\x78\x5b\x4c\xb8\x39\x66\xa0\x54\xab\x37\xf7\x7f\
+\x7a\x39\x6f\x5e\xc2\x3e\x43\x20\x26\xcd\x5f\x9c\x35\xde\xd7\x26\
+\xff\xbb\x99\x13\xb3\xc6\x90\x88\xd6\x40\xaa\x88\x83\xc9\x0c\xa6\
+\x97\xec\x39\x86\xdd\x83\x3c\x6e\xca\x4d\xaa\xb6\x5b\xa7\xfd\x1c\
+\x75\xce\xaf\x1f\x60\xa2\x08\x41\x6c\xdc\xe3\xc0\x71\x2a\x70\x5d\
+\x1b\x0e\x8d\x3a\x77\x21\xd0\x82\xc4\x3c\x50\x64\xd9\x59\x16\xf2\
+\xd6\x7a\xd7\xc6\xb4\xee\x36\x93\x59\x65\x1b\xef\x5d\xcc\xe2\xa3\
+\x54\xc1\x62\x78\xea\x24\x99\x60\xa3\x19\x31\x99\x36\xab\x32\x54\
+\x1a\x0a\x7d\x57\x35\x15\xe5\x4a\x15\xd9\xb4\x45\x5b\x8a\xe8\xa4\
+\x24\xe8\x08\xeb\x68\x0b\x69\xd0\x65\x11\x05\x0a\xec\x94\x55\xc2\
+\xa4\x55\xe2\x99\xa2\xe3\xfa\x0d\x2f\xdb\x78\x53\x4c\x58\xb7\x32\
+\xc4\xe6\x4b\x35\x1c\x1a\x9d\xab\x30\x7c\xeb\x38\x17\x74\x1b\x0a\
+\x65\x87\x61\xe8\xf0\xfb\x0d\xf8\x7d\x26\xbc\x5e\x03\x92\x2c\x20\
+\xbb\x90\x86\xb8\xb4\x88\xaf\xb5\x68\xb8\x75\x4d\x04\xcb\xc3\x3e\
+\xc4\xc3\x0a\x0c\x05\xc8\x97\xd1\x04\x18\x4b\xe5\xd0\x37\x36\x87\
+\x13\x63\x19\x5e\x75\x15\xde\xd3\xd5\xce\x7c\x51\x93\xf5\x4f\xa4\
+\x6b\x0c\x8f\xf7\x71\xc1\xe4\x90\x09\x40\x37\x34\xf8\xbc\x3a\x5d\
+\xae\x13\x98\x86\xfc\x62\x16\x7a\x2d\x87\x6d\x2b\x03\xf8\x46\xcf\
+\x72\x9a\x93\xb1\x50\xe4\x28\xd9\x2e\x9c\xa6\xbf\x85\x66\x60\x03\
+\x2a\xb0\x90\x2b\xe2\xdd\x91\x69\x1c\x1e\x48\xf1\x6c\xd9\x53\x0f\
+\xb4\x86\x85\xac\xc0\x1d\x86\x9d\xef\x71\x21\x20\x42\x31\x24\x18\
+\x9a\x06\xaf\xcf\x80\x61\x6a\xf0\x50\x2d\x55\xac\x05\xdc\x79\x53\
+\x00\x0f\x6e\xee\x80\x2b\x78\xf0\xd7\xd1\x45\x0c\x4c\x17\x31\x9d\
+\xb3\x51\x75\x5c\xa8\x92\x88\xd5\x61\x15\x77\xac\x30\x70\x4f\xc2\
+\x8b\x4c\xa1\x82\x37\x06\xaf\xe0\x9d\x33\xb3\xdc\x2a\x8a\x75\x89\
+\xd8\x32\x3c\xf6\x0e\x17\x82\x12\x14\x2f\x05\x5a\xd7\x9a\xae\x31\
+\x89\x7f\xbd\x56\xc6\x6a\xa3\x8e\x9d\xbd\x1d\x88\x86\xbc\x38\x70\
+\xd6\xc2\xe1\xb3\xb3\x58\x9a\x9f\x43\xb9\xb0\x04\xd7\xb6\xc9\x85\
+\x1e\x68\x81\x20\xda\xda\x5b\xf1\x60\x4f\x0b\x76\x74\x07\x30\x32\
+\x99\xc6\x2b\x7d\x13\x7c\x68\xbc\xe8\xda\x82\x52\x67\x78\xf8\x08\
+\x17\x5a\x14\x28\x7e\x8d\x18\x28\x4d\x06\xba\x2e\xc3\x2e\xe4\xf1\
+\xcd\x75\x01\x3c\xb6\xa5\x1d\x1f\xa7\x6d\xec\x3d\x76\x19\xa9\xc9\
+\x39\x74\xea\x2e\x7a\xe2\x5e\x44\x29\xf3\xa6\xb2\x65\x0c\x11\xa3\
+\x0c\x57\xd1\xbd\xa6\x0d\x7b\xee\x5e\x01\x55\x70\xb1\xef\xe4\x04\
+\xde\x3c\x35\xc7\x0b\x19\x87\xb2\xf9\x81\xb7\xb8\x10\x37\x20\x07\
+\x1a\x00\x2a\xc5\xc0\x68\xfa\xba\x96\x4b\xe3\x99\xed\x2b\xf1\xc0\
+\xc6\x08\xfe\x38\xb4\x88\x67\xff\x32\x06\x5f\x2d\x8f\xdb\x56\x05\
+\xb0\x3e\xee\x43\x40\xf7\x60\xa1\x50\xc5\xe0\xf8\x22\x06\x09\x44\
+\x0e\x85\xf1\x87\x47\xd6\x62\x4b\x87\x86\x57\x06\x66\xf0\x9b\x23\
+\x17\xb1\x70\xa9\xd0\x10\xda\x83\x5c\x58\x11\x84\x1c\xbc\x06\x70\
+\xcd\x45\x32\x58\xd1\xc2\x9e\x7b\x12\xb8\xb7\xcb\x87\x5f\x1f\x9f\
+\xc3\xb3\x7f\x4e\x62\x99\x4f\x6a\x5a\x1f\x20\xb1\x93\x04\x92\x28\
+\xaa\xcb\x54\xbe\x8a\x73\x54\x58\x25\x72\xc6\xfe\x5d\x3d\xb4\xdf\
+\x8b\x57\x87\x2c\xfc\xec\x8d\x51\x5c\x1d\x5e\x20\x80\x3b\xff\xc4\
+\x85\x35\x51\x28\x61\x13\x06\xe5\xbf\xd9\x48\x51\x02\xd0\xed\x25\
+\xec\xbe\xa3\x13\xf7\x77\xfb\xf0\xe2\xf1\x69\xec\x3e\x98\x44\x24\
+\x1a\xa6\x8c\x91\x40\x25\xd0\xd4\xa1\x86\x06\x95\x09\x25\x47\xf5\
+\x50\xca\xe7\x71\xe0\x89\x5b\xb0\x6d\x8d\x0f\xaf\x0d\x5b\x78\xe1\
+\xad\x0b\xb8\x7c\x62\xf2\x02\xc3\xed\xfb\xb8\xb0\xb6\x15\x4a\xc4\
+\x0b\xbd\x01\x60\xea\x34\x54\x04\x25\x07\x8f\x6c\x0c\xe1\xe1\x9e\
+\x08\x8e\x51\x70\x7f\xf8\x66\x12\x55\xc5\x0f\x49\xd1\xc0\x04\x76\
+\x5d\x87\x5c\x97\x2a\xba\x56\x42\x98\x97\xf0\xfb\x9d\x37\xa3\x33\
+\x6a\xe2\xb5\xa1\x59\xbc\xfa\xee\x04\xbf\x7c\xe2\xca\xeb\x0c\xb7\
+\xbe\xcc\xc5\xee\x30\x44\xaa\x4e\x0f\x13\x28\x3d\x29\xa3\xc8\x05\
+\xb1\xa0\x81\xfb\xd6\x45\xb1\x6b\x6b\x0c\xb9\x5c\x09\x7b\xff\x3e\
+\x86\x43\x49\x0b\xbe\xd6\x38\x64\xd3\x24\xf9\x90\xe1\x3a\x35\x14\
+\xb3\x19\x88\xf9\x34\x1e\xdd\x1c\xc3\xf7\xef\x4e\x20\xe7\x08\x78\
+\xf9\xc4\x55\x1c\xf9\xe7\xb8\x9d\x1a\x9d\xfd\x01\xc3\xe6\x17\xb9\
+\xb8\x7e\x19\xc4\x08\xa9\x29\x15\x4e\x53\x22\x14\x0f\x82\x3e\x1d\
+\x3d\xed\x26\x1e\x5a\x1f\xc2\xd7\x3b\xbd\xf8\x64\x26\x87\x5f\x1e\
+\xfb\x37\xfa\x2e\x5a\x58\xc8\x50\x09\x37\x84\x51\x11\xb1\xa2\xd5\
+\xc0\xfd\x1b\x62\x78\x72\x7b\x82\x92\xc3\x83\x0f\xa6\xcb\x38\xf0\
+\xfe\x38\x4e\xbe\x3d\x36\x9f\x9b\xcd\x51\x17\xda\xf8\xdb\x82\xd8\
+\xbb\xca\x94\xa2\x5e\x28\xe4\x53\x8d\x02\xad\x69\x32\x34\x55\x41\
+\xab\xdf\x83\xde\xb8\x8e\xfb\x12\x7e\x74\x93\x3c\xcc\x58\x05\x24\
+\xa7\x17\x31\x9f\xaf\xa0\xd6\x28\x34\x8f\x48\x8d\xc8\x40\x77\x3c\
+\x88\x00\x19\x34\x9c\xb5\x71\xe8\xf4\x0c\x8e\xfe\xed\xbc\x3d\xfe\
+\xe1\xf8\x5d\xee\xc8\xb7\xfb\x18\xd6\xfd\x6a\x9e\x2d\x8f\x84\x95\
+\xb5\x6d\x82\xd1\x12\x6c\xd6\x42\xa3\x92\x55\x9d\x9e\xaa\x07\x71\
+\x53\xc2\x86\xb0\x88\xad\x31\x05\x9b\x5a\x64\x84\x85\x2f\x34\x3b\
+\x1a\xd3\x15\xe0\x34\xa5\xea\x49\x52\xd0\xf7\x8f\x26\xed\xf3\xfd\
+\x97\x76\x56\x4e\x3f\xf5\xfa\xb5\x28\x75\xbd\xb0\x95\xea\x7e\x9f\
+\xb4\xbe\x23\xa1\x27\x62\x82\x4e\xf2\xac\xea\x2a\x29\xa9\x07\x92\
+\x24\x83\xf4\x0e\x41\xa2\xb6\x32\x2c\xa3\x7b\x99\x41\x62\xa7\x22\
+\x1e\x22\x70\x4a\xa5\x7c\x85\xda\x64\xa6\x8a\x89\x74\x05\x17\x52\
+\x85\xfa\xf0\x87\xe3\x4b\xc9\xfe\x4f\x9e\xac\x9d\xfb\xee\xfe\x1b\
+\x9b\x7e\xe2\x17\x5d\x24\xf8\x2f\x51\xff\x30\x6e\xf8\x3b\xd0\x68\
+\x32\xd4\x23\x14\x53\x41\x6c\x75\x0b\x3a\xbb\x5a\xd1\xd2\x19\x46\
+\x38\xee\x27\x23\x64\x94\x48\x7b\x2c\x8a\x8d\x95\xca\x39\xe9\xab\
+\x99\xa9\x4b\xc3\x53\xcf\x54\xce\x3d\x7d\xe5\xf3\x0c\xff\x03\x7a\
+\xd0\xa4\x24\x5e\xad\xc0\x5f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x06\x4f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x16\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x50\x54\x65\
+\x18\x7e\xde\xb3\x0b\x2c\xb0\x20\x17\x41\x17\xb9\xac\xc6\x20\x22\
+\x8c\x37\xcc\x91\x29\xb1\xb4\xc9\x51\xc3\xca\x34\xd3\xc9\x49\x2b\
+\x53\xa7\x8b\xa6\xf6\x23\x35\xef\xd9\x05\x73\x2c\x1d\xad\x26\x4d\
+\x27\x6d\x1c\xc4\x4b\x79\xe9\x87\x29\xa8\x83\xc2\xe0\x15\x25\x75\
+\x40\x41\x40\x2e\xb2\xb0\xec\xc2\xc2\xee\xb9\xf5\x9e\x73\x16\xd0\
+\xa9\xa9\xb3\xf3\x9d\xf3\x7e\x67\xbf\xf7\x79\x9e\xef\x79\xdf\xb3\
+\x67\x09\x7c\xa8\xd7\xc2\xed\x20\xcc\xe1\x70\x0a\x54\x8c\xe4\xeb\
+\x15\x9e\x9f\xe0\x78\x3f\x0d\x77\x55\xe1\x3f\x8e\xff\xcb\x25\xb1\
+\x34\xcc\xce\x37\x37\x09\x11\xe3\x67\x53\x9f\x2c\x50\x48\x2a\x54\
+\xcf\x6d\xa8\x6d\x45\x50\xee\x9d\x39\x6d\xda\xd5\x75\x9d\x2a\xe4\
+\x64\x5e\x93\xc6\x63\x80\x1f\xb7\x8e\x47\xb9\x9a\x6c\xaa\x90\xdf\
+\xb3\x0c\x13\x9e\x7a\x7e\xe2\x3f\x72\xdb\x0a\x0e\x40\x55\x57\x92\
+\xa7\xc8\xba\xd2\x14\x95\xbd\x31\x70\xe0\x06\xc0\x14\xc7\x92\x3a\
+\x01\xb1\x0a\x8a\x58\x8f\xc6\xba\x02\xd4\x97\x84\xa2\xc5\x3b\x12\
+\xce\xc4\xa1\xf0\x44\x27\xb0\x38\xc0\xda\x52\x83\xc8\xda\x5b\x88\
+\x0a\xbc\x8a\x7e\x4f\x8b\x88\x1d\x38\x1f\x64\xb2\xf5\xe4\x42\x7c\
+\x08\x5f\xdd\x6e\xc8\xce\x4b\xab\xc8\x79\x36\xb8\x28\x34\xf5\xd3\
+\xb1\xe6\x98\x79\x80\xd4\x00\xd5\x5b\x06\xaf\xa4\xa2\xc2\x13\x8f\
+\x5a\xaf\x1d\xd1\x41\x91\x88\xb6\x84\xc2\x12\x12\xac\x4b\x17\x15\
+\x15\x9d\x12\xa1\xa3\xc3\x03\xb7\xe8\x81\x84\x4e\xd8\x23\xac\x48\
+\x0c\x7a\x80\x00\xf1\x2a\x48\xe9\x82\xca\x43\x6e\x2b\x43\x7b\xf5\
+\xaf\x17\xa9\xf1\x8f\xa0\xae\x98\x31\xdf\x06\x91\x65\x34\xe0\x29\
+\x44\x93\xaf\x0f\x6e\x78\x86\x21\x3a\x2c\x0d\xf6\x70\x0b\x82\x03\
+\x34\xa3\x99\x9b\x81\xbb\x64\xe2\x01\x26\x50\xe1\x55\x08\x3e\x59\
+\x65\x12\x26\x13\x65\xf4\x15\xee\x20\x39\xa0\x18\x91\x74\x1f\x24\
+\x79\xa0\xc8\x6e\x34\x97\xef\xf5\xd2\x83\xa3\x01\x45\x7d\x87\xbe\
+\x39\xd6\x12\x35\x02\x8d\x1d\xc0\x4d\x71\x12\x92\x63\x07\x21\x2e\
+\x44\x80\xac\x00\x5e\x0d\x50\xd6\xae\x2a\xae\x39\x24\xa4\x44\x98\
+\x99\x0c\xfc\x1d\x41\xd2\x88\x55\x95\x77\xc5\xda\xf8\x66\x98\x5c\
+\x89\x21\xc2\x21\x44\x4a\x37\xd0\xe5\x7a\x80\xe6\xaa\xd2\x8b\x54\
+\x71\xd0\xb4\x32\x2c\x76\xf0\xc6\xa0\xa4\xc9\xb8\x24\xcd\x42\x5a\
+\xdc\x08\x44\x05\x11\x03\x1a\x6a\xb5\x64\x4d\xbd\xac\x12\x3e\x2c\
+\x74\xe0\xcb\x67\xa2\x74\x62\x1d\x5c\x27\x51\x75\x42\x23\x56\xd0\
+\x4f\x29\x41\xaa\xf7\x1b\x74\x54\x17\xc0\xdd\xda\xb2\x8a\xee\xe6\
+\xd2\x60\xea\x10\x4e\xd7\x4e\xda\x16\x1f\x9b\xb2\x18\xb6\x60\x06\
+\x56\x0c\x60\x45\x03\x61\x12\x89\x3d\xd2\xae\x1f\xfd\xd9\x88\x2f\
+\xc7\xf7\x37\x40\x99\xd0\x20\x86\x4e\xa0\xf0\x5c\xe6\xb9\x49\x20\
+\xc4\x35\x6f\x45\xe8\xef\x2b\x6a\xd5\x50\x65\x22\x3d\x18\x84\x1c\
+\xe7\xa8\xcc\x63\x0f\xd7\x9f\x40\x7a\x62\x8c\xbe\x75\xce\x31\xc0\
+\x15\xa3\xa8\x1a\x18\xdb\x8c\x8f\x4f\x55\x61\xf5\x84\x24\x7d\x37\
+\x2a\x7f\x88\xd7\x10\xb7\x95\xc0\x27\x13\x19\xb1\x76\x3f\xc8\x5d\
+\x87\x98\x35\xaf\x20\xa8\xa4\x74\x1a\x55\xd8\x91\x5b\x33\x7b\xe5\
+\xb2\xb0\xa5\x1b\x10\x11\xc8\x0b\x05\xd5\xd8\x2e\x03\xfb\x98\xa0\
+\xc3\xc7\xc3\x5f\xd0\x8d\x27\xef\x62\xd5\xe4\x14\x06\x23\x06\xe5\
+\xae\x66\x30\x0d\x9c\x48\x35\xe6\x7c\x12\x60\xc4\xa1\x3b\x57\xc3\
+\xb2\x67\xd3\x16\xba\x95\x80\x82\xfb\x9b\x8f\x67\xdb\x5e\x9c\xc2\
+\x04\xbc\x65\x56\xef\x63\xff\xdd\x6c\xb2\x9b\xc1\xbd\x12\x2b\x13\
+\x34\x30\x60\x55\x5e\x19\xbe\x98\x95\xc1\xb1\x01\x6a\xa2\xde\xab\
+\x06\xaa\x81\xeb\x31\x8b\x34\x9d\x3f\x09\xf3\x07\x53\x0b\xe9\x5a\
+\x3c\xea\xef\xe7\xd7\xf4\xb7\x27\xc7\x23\xc4\xcc\xad\xc8\x80\x4e\
+\x4d\x35\xf7\xba\xca\x5e\x6b\xc0\xba\x32\x06\x5a\xf2\x53\x09\xb6\
+\xbf\x3b\x46\x8f\x19\x03\x26\x53\xaf\x62\x83\x00\x3d\x3b\xa1\xc6\
+\x1a\xf8\x26\x24\x36\x50\x09\xd7\xac\xfe\x82\xcf\x94\x1c\x15\x00\
+\x91\x01\x5b\xbd\x60\x12\x43\x99\x59\xe8\x4e\x22\xd4\x36\xbb\xb1\
+\x61\xff\x65\xc8\x5c\x18\x45\x94\xa0\x70\xd5\x65\x59\x86\xca\xc5\
+\x91\x25\x6d\xae\x60\xee\xa4\x54\xcc\xcf\xc9\xd0\x45\x09\x8a\x08\
+\xc7\xd0\x40\x99\x2e\xc4\xa2\xde\x75\xba\xa9\xbf\xcd\xd6\x17\x2e\
+\x89\xf4\x7e\xd7\x54\x98\xa9\xb7\x80\x55\x0d\x6d\xd8\x71\xf4\x26\
+\x1a\x99\x44\x07\x66\x50\xc5\x0f\xaa\x30\x89\x22\x1a\x64\xef\xe4\
+\xa4\x63\xe1\x6b\xc3\x75\x51\x70\x3a\x50\x97\x19\xd3\x40\x67\xa2\
+\x51\x20\xed\x2e\xc8\x0e\x19\x93\xcd\xde\x43\xdf\x7e\x6f\xb1\x58\
+\xf9\x23\x37\x3e\xff\xa5\x14\x8b\xa6\xa6\x61\x74\x6a\x6c\x8f\x1d\
+\x5a\x1d\x04\xbf\xff\xda\x0f\x94\x49\xb3\x4d\xbb\x27\x18\x71\x67\
+\xf1\x79\x54\xcf\xcc\x2e\xa4\x53\x91\xc8\x35\x2f\xff\x6a\x59\xe0\
+\xbc\x15\xc6\x22\x81\x7a\x40\x9a\x1c\xed\x58\xfd\x63\x11\x16\x4e\
+\xcb\x40\x56\xba\xcd\x6f\x97\xbf\x63\xf4\x1d\x92\xde\x49\xa4\xcf\
+\xbb\xbb\x89\xf4\x75\x4d\xbb\xbe\x46\xdd\x86\x4f\xb6\xd0\xb1\x3e\
+\xc8\x09\xcc\x9a\x78\x2c\x7c\xc7\x61\x98\xad\x56\xdd\x3f\x2d\xd1\
+\xe9\xee\xc4\x8a\xef\x0a\xb1\xe0\xa5\x74\x8c\x1b\x11\xaf\x03\x6a\
+\x89\x24\x3c\x56\x4c\xc0\x0f\xae\x1a\x64\x7e\x5b\x95\x76\x37\xee\
+\xcc\x7b\x15\x2d\xe7\x4e\x4f\xa3\x43\x56\x58\xc8\x1a\x96\x17\xb3\
+\x71\xe7\xd4\xb0\x97\xe7\xe8\x89\x8a\xa2\xe0\xed\xf5\xa7\xb0\x80\
+\x95\x3f\x97\x99\xd8\xa3\x58\xb7\x4d\xeb\x10\xa0\x97\xf0\x31\xd5\
+\x82\xdf\x81\x86\xbc\xfd\x28\x5f\xbe\xe8\xb8\xdc\xee\x9e\xa1\xad\
+\xc5\x81\x10\x4c\x0f\x19\x9d\xf5\x73\xc2\xe6\x5d\xd6\x90\x21\x19\
+\x3a\x60\x7b\x87\x17\x11\xd6\x40\xc3\x32\xbf\x62\xf2\xab\xd6\x2d\
+\x14\x0c\xcf\xa9\xe7\x61\x33\x08\xdd\x7f\x95\xe1\xc6\x92\x85\xed\
+\xad\xc5\x45\x6f\xbd\xe1\x41\x3e\x75\xbf\xfa\xf6\x59\xcd\x6b\xa3\
+\x73\x66\xac\x49\x5a\xb1\x0e\xa1\x83\x92\xd9\x0a\xea\xed\x6d\xe1\
+\x49\x70\xea\x26\x81\x61\x0d\xf9\x63\xcf\xbd\x0a\xdc\xdc\xb4\x06\
+\x35\x47\xf2\xd6\xcd\x75\x4b\x6b\x35\x5c\x9d\x20\xfd\xb3\xa2\xf1\
+\xc1\x1e\xe7\xdc\xac\x8b\x7b\xa7\x4f\x1c\xa0\x84\xdb\x17\x2f\x45\
+\xd4\xe8\xb1\xc6\x53\xea\xef\x96\xee\x96\xd5\x09\xd4\xc7\x6a\xe1\
+\xaf\x83\xa3\xf8\x22\x6e\x6f\xdf\x8a\xdf\x2a\x45\xd7\x19\xdb\x0b\
+\xf9\x6d\x2e\x71\x5f\xcd\xd9\x25\x05\xa4\x81\xf3\x9a\x5c\x1e\xa3\
+\xa8\xc5\x81\xe1\x25\x07\x31\x1e\xf7\x90\x36\x6b\x26\x06\x4c\x9b\
+\x8e\xd0\x01\xf1\x4f\x3c\xa9\xd4\xbd\x23\xff\x2e\x3c\x75\xb5\xa8\
+\x3e\x92\x8f\xeb\x79\x87\x71\xd6\x9c\x82\x62\xdb\x38\x74\xb4\xb8\
+\xf9\x75\xe9\xba\xac\x4a\xf2\x72\x8d\xe0\x7b\x5e\xbb\x40\xed\xf2\
+\x42\x74\x38\xe1\x6b\x72\x20\xf1\xde\x25\x64\xb4\x5e\x47\x56\x3c\
+\x29\x71\xe3\xb2\x85\xbe\xa3\x32\x11\x95\x36\x14\xd6\x04\xe3\x9d\
+\xec\xa9\xab\x81\xb3\xfc\x16\x9a\xaf\x94\xa2\xb6\xf0\x9c\x52\x2c\
+\xc7\x08\xb7\x07\x3e\x8b\xca\xb0\x14\x3d\x5f\x6a\x69\x85\xc2\x78\
+\x7c\xfc\xa0\x11\x54\x31\x53\x92\xe4\x74\x41\x7c\xe4\x80\xd8\xdc\
+\x02\xd9\xd5\xae\xd7\xc5\xee\xae\x6c\x7c\xbd\x62\xcf\x76\x0e\x33\
+\x9f\xf8\x57\x41\xfc\xaf\x42\x45\x39\x47\xa5\x27\xe7\x6c\x7b\xbf\
+\x36\x61\x64\xbf\x7f\xcb\xe7\xa3\xfa\x6f\x33\x84\xfc\x55\xe2\x47\
+\xfc\xb1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xc8\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x8f\x49\x44\x41\x54\x78\xda\x85\x56\x0b\x4c\x53\x57\
+\x18\xfe\x4f\x5b\xd0\x21\x95\x4e\x04\x14\xda\x29\xf8\x40\x11\xaa\
+\x64\x50\x3a\x19\xd3\xc9\x46\xc2\xe2\x23\x06\xe7\x36\x9d\xf3\x31\
+\x05\xed\xa6\x53\xc4\x08\x73\x3e\x98\x4c\xa2\x51\x62\x9c\x61\x6a\
+\x96\x4d\xb7\xe9\x46\xb2\xa8\x4b\xdc\x74\x68\x9c\xcc\x17\x22\x46\
+\x14\x99\xb0\x48\x4d\xa5\x13\x44\x50\xda\x42\x81\xde\xde\x7b\xf6\
+\xdf\x73\x6e\x8b\xc6\x31\x6f\x72\x73\x1e\xf7\xfc\xdf\xf7\xfd\xdf\
+\x7f\xee\x3d\x97\xc0\xff\x5c\x89\x3b\x04\x33\x25\x30\x15\xbb\x26\
+\xa0\x10\x07\x04\x0c\x04\x07\x14\xa0\x09\x9b\xbf\xb0\x53\x85\x73\
+\xe7\x6a\xd6\x05\x54\xf6\x87\x41\xfe\x6b\x72\xe2\xf6\x9e\x34\x0c\
+\x9e\xff\xe2\x60\x32\x2f\x72\xa8\x4a\x1b\xa1\x23\x10\x1a\x42\x20\
+\x24\x88\x2f\xef\xea\xa6\xd0\xee\xa2\xd0\xfa\x88\x42\x53\x9b\xe4\
+\x6a\x77\xd2\x23\xb8\xfe\xf0\x8d\xfc\x81\xe7\x9f\x4b\x60\xdc\xd6\
+\x65\x09\x19\x44\xd6\x8e\x36\x68\x62\xd2\xc6\xaa\xc1\x14\x49\x20\
+\x02\x81\x83\xd4\x4c\x39\x78\x44\x0a\x5d\x5e\x02\x0e\x81\xc2\xa3\
+\x1e\x80\x3b\xed\x98\x46\xa3\x08\xb7\x6d\x5e\xeb\xe3\x4e\xba\xeb\
+\xe6\xa7\x83\x4a\xfb\x25\x88\xdf\xea\x2c\xd0\x87\xa9\x0a\x8d\x63\
+\x02\x03\x16\x26\x6a\x20\x5a\x4b\x40\x83\xc0\x82\xc8\x81\xbb\x45\
+\x02\x3d\xd8\xef\xc1\xbe\x20\x11\xf0\x4a\x9c\xcc\xe9\xa1\x50\x63\
+\x13\xa1\xb2\xbe\x57\xb0\x3d\x10\x37\xd7\x6e\x0c\x29\x7e\x86\x20\
+\x6e\x4b\xbb\x45\x1f\xae\xd9\x9d\x99\x14\x14\x30\x77\x82\x06\xc2\
+\x5f\x90\x41\x01\x7a\xbd\x80\xc0\xd8\x22\xd8\x89\x7b\x1e\x48\x8f\
+\x0a\x44\x60\x00\x51\x26\xc0\x94\xbc\x94\xb2\x71\x17\xae\x6b\x6c\
+\xf6\xc2\xa9\xeb\x3d\xc2\xdd\x66\x61\x75\xdd\x96\xd0\x52\x3f\xc1\
+\xf8\xcf\x5a\xd2\x74\x5a\xf5\xc1\xd7\x5e\x0e\x8e\xf9\xd8\x3c\x00\
+\x86\x0c\x90\x55\x72\xb5\x02\x06\xcb\x4a\x45\xac\xf6\x9a\x4a\x27\
+\x6c\x4b\xd6\x22\x38\x70\x70\x46\xc2\x09\x7c\xfd\xfa\x7b\xbd\x70\
+\xbc\xb2\xd3\xda\xd6\x21\x2d\xba\x5d\x14\x71\x9e\x11\xc4\xe6\x37\
+\xed\x9b\x3c\x69\x70\x4e\x6e\x86\x16\xf4\xe8\x77\xb7\xc4\x81\x25\
+\x19\x04\x49\xbc\xe8\xbe\xdc\xe6\x5d\x78\x04\x5f\xbc\x12\xca\x41\
+\x29\xb7\x88\x13\x01\x13\x20\xe2\x58\xa3\x22\x70\xe6\x9a\x13\x7e\
+\xad\x72\xed\x6f\x28\xd6\x2f\x27\xa3\xf3\xac\xe6\xb0\x21\x81\xe5\
+\x2b\x66\x86\x6b\xa7\x45\x6b\x40\x42\x25\x72\x31\x45\x25\x50\x06\
+\x93\x83\x65\x82\xb5\x7f\xb4\xc0\x86\xd4\x08\xa6\x56\xc2\x55\x84\
+\x72\x0f\x54\x84\x80\x9a\x70\x3b\x28\x4e\x3e\x76\x78\x61\xef\x2f\
+\xad\x2e\x7b\x9b\x27\x83\x44\xaf\xae\xcf\x4f\x31\xea\x8a\x73\xa7\
+\x87\xa3\x35\x58\x54\x15\x65\x00\xa2\x92\xba\x5b\x00\xe8\x64\x76\
+\x51\x28\x3e\x6b\x83\xf5\xaf\x8f\x60\x80\x28\x14\xd4\x48\x22\xf7\
+\x09\xa1\x7c\x2c\xcf\x03\xef\x7f\x77\xe6\x21\x9c\xba\xda\x51\x40\
+\x46\x7e\x54\x7b\xf4\x9d\x4c\xfd\xec\xb9\x29\x3a\xd0\x05\x52\x54\
+\xc6\xfd\x74\x23\xa0\xd3\xc3\x09\xa8\xac\x12\xe7\xb7\xfe\xf6\x37\
+\x14\x4e\x1f\x8b\x7d\x04\x42\x21\xac\x25\xd4\x9f\x41\x5f\x9f\xc2\
+\xc5\x5a\x07\xec\xfc\xd9\x7e\x8c\x18\x72\xaa\xeb\xd7\x2d\x99\x10\
+\x9b\x3a\x6a\x20\x68\x03\xb8\x6a\x07\x82\x3a\x3d\xdc\x63\x39\x6d\
+\xa6\x0c\x83\xf2\xcb\x6a\x61\xe7\x7b\x46\x06\xc0\xe6\x55\x0a\x01\
+\x00\x53\xad\x62\x6b\xb1\xc5\x81\xbd\xb5\x1b\xb2\x4b\x6e\x37\x90\
+\xc8\xc5\x97\xba\x4a\x0a\x52\x82\x26\x0c\x55\xb1\xc5\x1d\xbd\x00\
+\x2e\x41\xae\x03\xe5\x8b\x01\x14\x4b\x28\xac\xfc\xba\x0a\xbe\xca\
+\x36\x71\x95\xb2\x15\x2a\xd9\x26\xf4\x5e\xb1\xcc\x77\xcb\x71\x1e\
+\xdc\x25\x99\xeb\xaf\xb8\xc9\xb0\x05\x15\x5d\x7b\x37\x4d\x0e\x8a\
+\x1d\xa2\x86\x4e\xaf\x0c\xce\xdf\x0b\xb5\x3f\x80\x30\x92\xa6\xf6\
+\x4e\x28\xfc\xbe\x1a\x44\x4c\x51\x12\xbc\x20\x61\xd5\x45\x51\x04\
+\x8a\x6f\xa1\xe8\x95\xc7\x12\x2c\xca\x1c\x07\x4b\x67\xc6\x33\xeb\
+\x7a\x71\x7e\x5a\xee\x45\x37\x09\x7b\xf7\x74\x7d\x71\x9e\x39\x36\
+\xde\x10\x0c\x6e\x2f\x28\xca\xb9\x8f\x3e\x65\x77\x9b\x1d\xb0\xf7\
+\xf8\x2d\x68\x69\x73\x71\x60\x0c\x96\x14\x50\x09\x49\x24\x81\x93\
+\x2d\x9b\x95\x00\x96\x39\x93\x58\xb6\x77\xef\xbb\xe1\xed\x4d\x97\
+\x1a\x48\xe8\x9c\x13\x47\x3f\xf9\x60\xd2\xec\xa9\xc9\x51\x40\x29\
+\x4f\xdb\xa7\x5a\xce\xc2\xfe\xd0\x05\x45\xa8\xdc\x32\x23\x0e\x4c\
+\xe3\x22\x9e\x2d\x2a\xb3\x88\xd7\x49\xae\x8b\xcf\xb6\x53\x57\xee\
+\x43\x5e\xe9\xf5\x63\x44\x37\xeb\x58\xfe\x8c\x69\x31\xc5\xcb\xe6\
+\x1a\x41\xa3\x04\x33\x1f\x71\xe1\x03\xb4\x65\xc3\x81\x4b\xb0\x02\
+\x95\xa5\x26\x0c\xf7\x93\xca\xdb\x92\xef\xfb\xa7\x77\x8f\xca\x97\
+\x35\xae\x2b\x3a\x54\x0b\x87\x4e\x36\x16\x90\xc1\x6f\x95\x99\xa3\
+\x0d\x21\xe5\x5b\x56\xa6\x6a\xf5\x11\x83\xfc\x45\xeb\x70\x75\x43\
+\xde\x9e\x0a\xc8\x46\x4f\xa7\x24\xea\xfd\x05\x27\x2a\xf0\xef\x1a\
+\xb5\xa2\x9e\x67\xa2\x14\x1a\x1f\xda\x9a\x3b\x21\x67\xc7\x45\x57\
+\xbd\xcd\x91\xc1\x3e\x15\xc1\x19\x3f\xec\x5b\x32\xc7\x98\xf3\x61\
+\x56\x02\x5b\x24\xe1\xc7\x66\xf1\xe7\x27\x21\x1b\x95\xa7\x27\xbf\
+\xe4\xdf\x19\x44\xa9\x0f\xf1\x8f\xe1\x29\xd5\xbe\x4c\x4a\x7e\xc4\
+\xed\x7c\xf8\xe6\xfe\xce\xf2\xf7\x97\x33\x82\xa0\xf4\x6f\xd2\x0c\
+\xc3\x43\x0e\xe6\x2e\x4c\x8e\x99\x92\x64\x60\xc1\x2e\x77\x2f\xe8\
+\x82\x03\xfb\x3e\x03\xa4\x6f\xaf\xb3\x5b\x79\xd1\x88\xff\x6d\xe6\
+\xf3\xa7\xaf\x36\xc1\xc6\xfd\x57\xad\x56\xbb\x73\x91\xfb\xec\xe2\
+\xf3\xfe\xcf\xf5\xc0\x29\x07\x2c\xa6\x84\xc8\xdd\xab\x16\x24\x05\
+\x24\x8d\x0f\xef\xdb\xdb\x4a\xe1\x88\x62\x89\xca\x47\xc6\x88\x50\
+\xbd\x4a\x29\xae\x7c\x7e\xd6\xb5\x42\xd1\xb7\xd5\xc2\x85\x9a\xe6\
+\xd5\x3d\x15\xcb\x4a\x9f\x3a\x0f\xe4\x2b\xf0\xd5\xd2\x02\xf3\xc4\
+\xa8\xc2\xa5\x59\xc6\x80\x37\x52\x46\xf2\x62\x82\xaf\x78\xd0\xa7\
+\x94\x3e\x51\x0b\xa5\x0e\xbf\x5f\xb6\xc1\x97\x65\x37\x84\x3f\x6b\
+\xfe\xd9\xec\xb9\x60\x79\xf6\xc0\xf1\x5d\x01\xe6\x3d\x96\x91\x06\
+\xdd\xda\xac\xf4\xd8\x98\xac\x37\x63\x21\x26\x2a\xa4\xef\x2d\x55\
+\x02\x58\x46\x4a\x36\x56\xbb\x03\xca\xca\x1b\xe0\xa7\xd3\x0d\xd6\
+\xc6\xa6\x8e\x5d\xc2\xe5\x55\xfd\x1f\x99\xbe\x4b\x6d\x2a\x49\xc3\
+\x47\xf3\xe3\x46\x0d\x9d\x97\x96\xa8\xd7\x9a\xe2\x87\x43\xc2\x98\
+\x30\x18\x31\x4c\xcb\x22\xec\x2d\x2e\xa8\xbb\xf3\x10\xae\xdc\xba\
+\x0f\x15\xd7\xec\xae\xba\xc6\xb6\x23\x98\xe3\x61\xb1\x6a\xcd\xf3\
+\x0f\xfd\x27\x2f\x55\xd2\x4e\x33\x36\x53\x41\xfe\x6d\xc1\x53\x15\
+\x6f\x83\xf2\x88\xff\xb6\x00\xfe\xb6\x00\x9c\x93\xaa\xf3\xfa\xfd\
+\x6d\xf9\x17\x9c\xfc\x7d\xe8\x58\x4b\x79\x41\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x12\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xd9\x49\x44\x41\x54\x78\xda\xdd\x95\x7b\x4c\x5b\x55\
+\x1c\xc7\x7f\xa7\x96\x8b\xa5\x08\xf2\x2a\x50\x06\x64\xb4\xc0\x60\
+\xc3\x0d\xc9\x48\x31\x1b\x31\xba\x44\x34\x44\xd4\x6d\x24\xba\xf9\
+\x98\x4e\x13\x4c\x9c\x6e\x71\xa8\x31\xd1\x7f\x37\x66\x7c\xcc\x44\
+\x92\x6d\xea\xdc\x33\x5b\xe6\xa3\x09\x91\x9a\xb8\x47\xc6\x22\x88\
+\x69\x0a\x02\xed\x80\x5e\x36\x5a\xa0\xb5\xb0\x42\x4b\x9f\xb7\xa5\
+\xc7\x5f\xef\xb0\xdb\xe9\x78\x2c\x33\xfe\xe3\x49\x6e\xcf\x39\xbf\
+\xf3\xfd\x7d\x3f\xbf\x73\xcf\xbd\xb7\x04\xfe\xe3\x46\xfe\xff\x00\
+\xe5\xfb\x0e\x0e\xbb\xd6\x89\x7d\x8a\xd7\xe2\xe2\x5f\x63\xd7\x84\
+\x71\xe1\x9e\x01\xf3\xe6\x06\xbc\xca\xd1\x88\xc4\xad\x51\xec\x8c\
+\x78\x55\x2e\x05\x59\x14\x90\xbb\x77\x02\xcd\xc9\x9f\x15\xa5\xb2\
+\xd2\xbe\x21\x1f\xd8\x5a\x94\x8c\x36\xb7\x79\x82\x56\x94\x24\x41\
+\xdf\xa0\x7f\x10\x80\x3e\x64\x3b\xa0\x14\xee\x1a\x90\xb3\xc7\x82\
+\xe6\xd4\x58\xa6\x4a\x52\x15\x2a\x65\xa0\xeb\x70\x82\xfd\xd3\x02\
+\x12\xa7\xa1\x1f\x34\x66\xc1\x4f\x7a\x0f\x98\x78\x1f\x8f\x56\xe5\
+\xa8\x11\x96\x05\x28\x76\x99\x39\xa0\x30\x54\xb5\x3a\xa5\xb0\xb8\
+\x40\x0e\xfe\xe0\x1c\x68\x2f\x3a\xc0\x71\x50\x4d\xe2\x74\xf4\xe3\
+\x17\x94\x30\xe8\xa4\x30\x6c\xf1\x82\x7e\xc0\x3d\x8a\x6e\x25\xa8\
+\x13\x16\x05\x64\x35\x99\xa2\x95\x9b\x6b\xd6\xa6\xe7\x6f\xd5\xa4\
+\xc2\x80\x23\x0c\xbe\x40\x04\x4e\xb5\x8f\xc3\x54\x6b\x39\xa3\xcd\
+\x6c\x32\xd2\x53\xbb\x8b\xe0\xc2\xf5\x90\x38\x37\x8e\x78\xa1\xb3\
+\xd7\x69\x45\x4b\xf5\x64\x6b\x99\x70\x07\x20\x63\xa7\x41\x86\x53\
+\x7e\x93\x46\x91\xbb\x6b\x53\x06\x9c\xe7\x83\x62\xdc\x1b\x98\x83\
+\x43\xe7\x86\x61\xfa\xdb\x6a\x06\x90\xb6\xa3\x9b\x7e\xff\x61\x05\
+\x5c\x19\x0d\xc5\x62\x03\xd7\x3c\xf0\x6b\x97\xc3\x86\x45\xaa\x6e\
+\x1c\xa9\xf4\xc7\x00\x69\x2f\x77\x25\x63\x67\xae\xdf\x98\x97\xfd\
+\xd1\x33\x39\xa0\xed\xf7\xc7\xf0\xb3\xbe\x30\x1c\x3c\x3d\x08\xd3\
+\xc7\x6a\x58\xc0\x4b\x9d\xf4\xca\xfe\x87\xa1\x7d\x08\x0b\xa1\xb7\
+\xe2\xbd\x66\x17\xb4\x75\x8c\xff\x85\x43\xf5\xf4\x77\x1a\x0f\x49\
+\x7d\xfe\x52\x2a\x3a\x99\xb7\xd7\xab\x32\xf7\x3c\x91\x0d\x3a\x93\
+\x2f\xa6\x8f\x3a\xba\x11\xb0\xef\x68\x1f\xb8\x4e\x3f\xca\x00\x30\
+\x8f\xf2\x87\x37\xc0\x19\x83\x97\xd1\x47\xc7\x26\xcb\x2c\x9c\x68\
+\xe3\xa7\x70\xa6\x26\x0f\x6c\xfe\xc5\x98\xbf\x2a\xbf\x2c\xf9\x41\
+\xdc\x04\xa1\xb7\xc9\xa2\xbf\x04\xc2\x01\x01\x86\xf5\x43\xe0\xf9\
+\xf1\x29\x06\x90\xfc\xec\xcf\xb4\xb8\xaa\x04\xa4\xf7\x73\xa8\x8a\
+\x43\x50\x02\x9e\x19\x0f\x58\xaf\x5a\x4d\x44\xfe\xb4\xb6\x0e\xa3\
+\xda\x1c\xd5\x0a\x2e\x25\x33\xed\xd6\xa9\xd0\x9b\x49\x61\x21\x04\
+\xe6\xee\x7e\xf0\xb7\x6f\x61\x00\xb2\x27\xcf\x51\x75\xf5\x1a\x90\
+\x72\x09\xf3\xde\xf3\xcb\x98\xe6\x9e\x9a\x06\x3b\x3f\x16\x3d\xe8\
+\x06\x31\x2a\xab\x3b\x2b\x42\x14\xaa\x02\x2e\x25\x2b\xfd\x1f\x9d\
+\xc8\x0a\x07\x05\xe0\x7f\xef\x05\xe1\xc2\x36\x06\xc0\x3d\x76\x92\
+\x96\xd6\xae\x67\xb4\xd1\xe6\x9e\x74\x82\x83\xb7\x88\xe6\x7e\x5d\
+\xa3\x2e\x96\x94\xf8\xf8\xf1\x3a\x54\x69\x15\xea\x22\x2e\x39\x23\
+\x3d\x76\x93\x82\x6e\xdc\x6a\x4f\x3f\x84\x3b\x5e\x65\x00\xd2\x8d\
+\xdf\x50\x75\xad\x26\x76\x6b\xa2\x8b\x9e\x1b\x68\x6e\x1e\x11\x30\
+\xad\x21\x78\xfe\x45\xdd\x1d\xef\x41\x42\xed\x11\x84\x10\x6d\x56\
+\x71\x31\x97\x94\x9e\x26\x96\x36\x6b\x77\xc0\x94\x99\x87\xb9\xce\
+\x37\x18\xed\x7d\x35\x87\xe8\xca\x0d\x35\x37\x1f\x65\xe7\x0c\x04\
+\x5c\x6e\xf0\x4c\xda\xd1\x9c\x36\x84\x2e\xef\xd4\x2d\xf8\xa2\x89\
+\x95\x3d\xf2\x95\x08\xc9\x2c\x59\xc5\x11\x89\x14\x02\x33\x33\xe0\
+\x1a\x1f\x83\x48\x57\x13\xa3\x95\x68\x5a\x69\xf6\xea\x35\xe2\x38\
+\x6a\x3e\x6b\xb3\x88\xe6\xe1\xdf\xde\xd4\xdd\xae\x5b\xf0\x5b\x24\
+\xa9\xfe\xa2\x1e\x88\xe4\x07\xb9\x22\x2f\x41\x9a\x98\x08\xae\xd1\
+\x11\x88\xfc\xf1\x16\x0b\x58\xff\x25\x4d\x2d\x2c\x12\xc7\x2e\xeb\
+\x48\x08\x68\xe4\xb9\x48\xf7\xdb\x6d\xf1\x5e\x8b\x7e\x4d\x49\xd5\
+\xe7\xdb\x70\x27\x47\xe5\x39\x79\x52\xaf\xcd\x0a\x54\xbf\x9b\xb0\
+\xeb\x9f\x51\x79\x6e\x3e\x78\xed\xe3\x61\xac\xfc\x15\xaa\x7f\xe7\
+\xe4\x82\x3e\xb0\x54\xab\xfc\xa4\x11\x8f\xef\x04\xa5\x91\x04\xe8\
+\xd9\xcb\x6a\xd7\x1d\xa0\x84\x48\x42\x14\xe8\x76\x30\xbc\x7b\x76\
+\xd1\x42\x61\xb9\xb6\xae\xa5\x01\x55\xaf\x83\xa1\xb9\x9e\x85\xb7\
+\xb4\xe1\x43\x70\x18\x7a\x9a\xb5\x4b\xa5\xdf\xdd\x7f\xf2\xda\xfd\
+\x2b\xa0\xf7\xbd\xb1\x65\x63\xf7\x0c\xf8\x17\xed\x6f\xeb\xb8\x99\
+\xa0\x39\x82\xd5\x77\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x03\x96\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x5d\x49\x44\x41\x54\x78\xda\xb5\x93\x7b\x48\x53\x51\
+\x18\xc0\xbf\xdd\xbb\xcd\x7b\xf7\xa0\x49\x2e\x42\xe7\x5c\x85\x8a\
+\x65\x2f\xa5\xb2\xe8\x89\x85\x41\x11\xdd\x92\x5e\x62\x45\x26\x95\
+\x10\x54\x18\x15\xf4\x20\x0a\x82\x5e\xd8\x3f\xd5\x1f\x45\x04\x3d\
+\x2c\xe9\x5a\x66\x96\x65\x69\x37\xcb\xe1\xa8\x4c\x2b\xd3\x9a\xdb\
+\x72\x9a\x9b\x3a\xab\xbb\xed\xde\x6d\x77\xf7\xb6\x29\x49\xf6\xd2\
+\x69\x1d\xf8\xfe\x3a\xe7\xfb\xfd\xbe\xf3\x7d\xe7\x88\xe0\x3f\x2f\
+\xd1\x60\x13\x37\x97\xbb\x73\x3c\x1e\x5f\x16\xeb\x64\x13\xdc\x4e\
+\x06\x47\x51\xc4\x28\x96\x8a\xd3\x38\x2f\xe7\x24\x33\xb5\xb6\x21\
+\x09\xb2\x1f\xba\xce\xd0\x4e\x4f\x96\x46\x8e\x4a\x9e\xb5\x70\x30\
+\x9c\xa7\x3f\xa3\x88\xe8\xfa\xcd\x75\x31\x9b\x86\x7c\x83\x8d\x0f\
+\x9c\x39\x2e\xb7\x37\x6f\x6c\x84\x54\x72\xd7\xcc\x81\x82\xee\x00\
+\x1c\x17\xe7\xdd\x5a\xa7\xdb\xfe\xe3\xb9\x79\x27\xeb\xb0\xf2\x1d\
+\xe3\xd9\x90\x05\x6b\x6f\x3b\x9e\x87\x21\x48\x92\x2e\x02\x87\x47\
+\xb5\x6d\xa0\x90\x08\x3b\x6f\xad\xd7\x1d\xff\xf9\xdc\x94\x7d\xfa\
+\x03\x86\x43\x29\x07\x43\x16\xac\xbc\xf6\xc9\x9d\x1a\xaf\xc2\x2f\
+\xbf\xe7\x41\x68\xb5\x82\x02\x43\x16\x97\x6c\x8a\xbd\xd3\x07\xbe\
+\xbf\x2a\xbb\xd5\x68\x3b\xd5\x72\x79\xa9\x2c\x64\xc1\x92\x0b\x26\
+\x61\x66\x62\x24\xdc\xb3\xf8\x81\x63\x59\x60\x8c\x4d\xbc\x42\x2e\
+\x4d\x29\xcf\x9d\x60\x08\xee\x4f\xde\x53\x99\xdb\x54\x67\x39\xe6\
+\xf3\xfa\xc0\x7d\x7f\xbd\x28\x64\xc1\xc2\xb3\x8d\xee\xa9\xe3\xa2\
+\x70\x7d\xbb\x08\x38\x1e\xc0\xc7\x7a\xa0\xfd\xe5\x6b\x41\x81\x8b\
+\xb7\xfa\xfd\xfe\x0e\x63\xad\x39\x5f\x95\x10\x0b\x74\xc3\x07\xa6\
+\xeb\x76\x46\xe8\x37\x48\xcd\x7b\xd3\x3c\x3e\x51\xab\x79\x47\xa3\
+\xc0\x0b\x00\xfe\x60\xf8\x79\xf8\xf8\xac\x06\x58\x97\x1b\x66\xcd\
+\x4d\x84\xa7\x06\x13\x70\x36\xdb\x8b\xb6\xab\xcb\x92\x43\x12\xcc\
+\xcf\x7b\x43\xf2\x12\x29\xa1\x8c\x8e\xea\x01\x07\x83\x0f\x86\x00\
+\x63\x54\x08\x68\x95\x08\x5c\x2a\xfd\x00\x6d\x35\x6f\x7d\xaa\x70\
+\xd9\x36\xf3\xf9\x45\xa7\x07\x2c\x98\x77\xa2\x96\x44\x31\x19\x11\
+\xae\x8b\xea\xae\x9c\x0b\x84\x87\xf1\x02\x1f\x78\xe9\xbc\x08\x05\
+\xda\xee\x00\xbb\xd1\x0a\x5d\x66\xab\x4f\x2e\x93\x9c\x6f\xb9\xb4\
+\x74\x4b\x30\x6f\x40\x82\x39\x47\x5f\x91\x98\x52\x4e\x44\x8c\xd6\
+\x04\xe0\xa2\xee\x8a\x1b\xf5\x75\xd0\x69\x6e\xed\x64\xdc\x1e\x99\
+\xeb\x8b\x0b\x47\xc5\x28\x13\x86\x49\xeb\x31\x39\x16\x84\x9f\xfe\
+\x9e\xdb\xaf\x60\xe6\x91\x97\xa4\x52\xa5\x24\x46\xc6\x46\xf7\x54\
+\x1b\xe8\x4b\x45\x7e\x19\x20\x20\x50\x96\x0b\x8b\xe7\xf4\x97\xff\
+\x57\xc1\x8c\xc3\xcf\xc9\x70\xf5\x30\x42\x13\x17\x84\x23\xc0\xf3\
+\x3c\x54\x14\x3c\x06\x2f\xc3\x52\xcd\x17\x97\xf4\x0b\xff\xab\x20\
+\xe5\x60\x35\xa9\x8e\x1c\x4e\x24\x4f\xd2\x42\x07\xd3\x33\xcc\xf2\
+\x1b\x14\xd0\x0e\x9a\x0a\x7c\xa0\x01\xc1\xff\x28\x98\x7a\x40\x4f\
+\x46\x6a\xd4\xc4\x94\x24\x2d\x74\xb2\x3d\x3d\xaf\x28\xd2\x83\xdd\
+\x6a\xa7\x3e\x5d\x5d\x3e\x60\xf8\x6f\x05\xc9\x7b\xab\xc8\x18\xdd\
+\x08\x62\xc1\x74\x1d\x58\x68\xa1\xfb\x29\x96\x15\x56\x41\xab\xc5\
+\x46\xd9\xae\xa5\x87\x04\xff\x45\x90\xb4\xa7\x92\x1c\x15\x1b\x49\
+\xa4\x4d\x8b\x81\xaf\x1c\x40\x97\x27\x00\x2f\xaa\x06\x53\x43\x33\
+\x65\x2f\x58\x11\x32\xbc\x8f\x60\xe2\xae\x27\x64\x5c\x7c\x14\x41\
+\xcc\xd6\x41\x3b\x23\x74\xc3\x4b\x03\xf0\xc6\x3a\x0b\xd5\x59\xb8\
+\x6a\x50\xf0\x5e\xc1\x84\xdc\xc7\x64\xc2\xb8\x68\x62\x59\x00\xce\
+\xf8\x45\x60\x75\xf1\x70\xb7\xd0\x00\xf5\xb5\x26\xca\x71\x73\xf5\
+\xa0\xe1\xbd\x82\x49\xbb\x2b\x99\xcc\xb4\x38\x6c\x84\x46\x0d\xb4\
+\x0f\xe0\x4a\xbe\x1e\x5e\xd7\x98\xa8\xcf\x45\x6b\x86\x04\xef\x15\
+\xc4\x6c\x28\x3e\x87\xcb\xb1\xac\xd4\x19\xa3\xa1\xc1\xe2\x00\x43\
+\x65\x03\xf5\xa5\x38\x63\xc8\xf0\x3e\x33\x50\xa7\x17\x9c\x93\x84\
+\x89\xb3\x9c\x5d\x4e\xea\x6b\x49\xe6\x3f\x81\xf7\x11\xfc\xaf\xf5\
+\x0d\xca\x0d\x80\x28\x32\x31\x6d\xdd\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x04\x86\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x4d\x49\x44\x41\x54\x78\xda\x95\x94\x7b\x6c\x14\x55\
+\x14\xc6\xbf\xbb\x8f\xd9\xed\x2e\x7d\x58\x5a\xe8\xf6\x81\x04\x8d\
+\x31\xc6\x44\x94\x88\xd6\x47\x82\x69\xd4\x56\x34\x8d\xe0\x1f\x04\
+\x35\xa6\x42\xac\x85\xb6\x42\x82\x68\x63\x9a\x80\xa8\x60\x0a\x08\
+\x36\x59\xab\x31\x26\xfe\x51\xad\x21\x45\x49\xaa\xad\x26\xd4\x18\
+\x21\xa2\x88\x09\x54\xc1\x8a\xb4\x81\x6e\xdb\x85\x6e\xb7\xfb\x9a\
+\xed\xee\xce\xce\x1c\xcf\xcc\x6e\x5a\x12\xa7\x90\x9d\xd9\xd9\x99\
+\xdc\x7b\xee\xf9\xdd\xf3\x7d\x73\x46\xe0\x26\x07\x25\xde\xa9\x82\
+\xc3\xb1\x1e\xb0\x3e\x09\x28\xab\xa0\x28\x80\x9c\x3e\x03\xa2\xef\
+\x01\xad\x57\x14\xef\x19\xbb\xd1\x7a\x71\xc3\xe4\xc9\x5d\xd5\x90\
+\xac\x6f\x40\x6d\xac\x47\x7c\x3f\xa2\xd3\x31\x7d\x14\xf9\xee\x3c\
+\xce\x6f\xe7\x27\xed\x18\xb4\xd4\xfb\x56\xcf\xe1\x5f\x72\x06\xd0\
+\xf4\x8e\x2a\x14\xe7\x75\x42\x6d\xa9\x8f\x5e\xd8\x8a\xb4\x92\x4e\
+\xb8\xa5\x74\x1f\x27\x4d\xc5\xa2\xa9\x75\x45\x9e\x4a\x27\x59\x17\
+\x41\x68\xca\x31\x0d\x68\x91\x6e\xed\x1a\xcb\x0d\x10\x6e\xd9\x06\
+\x77\xfb\x07\xf0\x35\x41\xf6\xf9\x07\xd4\x64\x62\x43\x61\xcd\x99\
+\xb0\x3e\x27\x9f\xac\x76\xb9\x4a\x0a\xf6\xc2\xbe\xb4\x35\xa5\x5a\
+\x41\x4a\x7c\xbb\xf3\xae\xaf\x0e\xe5\x06\x98\x7a\xb1\x1f\x93\x81\
+\x5a\xff\xe8\x94\x4c\xc1\xa0\xa7\xbc\x61\x24\xfa\xbf\x98\x7f\xd7\
+\xf5\x25\x67\x2d\x6b\x93\x91\x99\x81\xc2\x87\x8f\xd7\xe5\x06\x18\
+\xdd\x45\xd1\xb1\x41\x04\xce\x8d\x1e\x5d\xd1\x3c\xb6\xde\x34\xe6\
+\x9f\xa7\x1b\x93\x31\xad\x2b\x16\xb8\x86\x92\x27\x7e\x17\x39\x01\
+\x92\x13\xdd\xe4\x3f\xb1\x0f\x33\xa7\xc7\xbd\x2b\x3b\x82\x5b\x4d\
+\x01\x23\xb5\x8f\xa7\xd5\xd5\x3f\x4c\x9f\xff\x1a\x65\xf5\x43\xb9\
+\x01\xa2\x43\x3b\x69\xe4\xc4\x97\x48\xf9\xe4\xb6\xfb\xdf\x0d\xee\
+\x33\x05\xfc\xf5\x68\x53\xda\xf6\x90\xf7\xf2\xa9\x23\xb8\xfd\xa5\
+\x91\xdc\x00\xd7\xfa\xee\xa4\x8b\x43\xd3\x70\x27\x94\xb6\x95\xbb\
+\x43\xe6\x80\x53\xf7\x34\x69\x95\xad\xde\xb3\xbd\x6f\xe1\xbe\xd7\
+\xfc\xb9\x01\xc6\x8f\x54\xd1\xc5\x73\x21\xe4\x27\x68\xdb\xaa\x8e\
+\xd8\x61\xb3\x18\xf5\xc7\xdb\x9a\x68\xc5\xeb\xde\xd3\x5f\xbc\x89\
+\xea\xb6\x50\x6e\x00\x5f\x77\x29\xfd\x79\x36\x86\xe2\x34\xb6\xac\
+\x3e\x38\xfb\x91\x59\x8c\x32\xe0\x79\x25\x55\xfc\xd4\xc7\xbf\x7d\
+\xdb\x83\xc7\x76\xcb\x37\x07\xa4\x7e\xca\x27\x61\xb5\xf0\x57\x01\
+\xb9\x1d\xc4\x3f\x85\xdb\x6d\x56\x35\x9e\xa5\xba\xb8\x30\x05\xc8\
+\xfd\x6e\x72\x2d\x77\x33\xc0\x05\xb2\xdc\x02\xd8\x4a\xf9\xf2\xf0\
+\x55\x01\xcd\x5a\xce\xf7\x32\x5e\xc1\xe3\xea\x0c\x27\xf2\xc3\x92\
+\x9e\x00\xd2\xe3\x10\xc9\x2b\x9c\x9c\x1b\x59\x0e\x42\x9e\x88\x63\
+\xd1\xb3\x09\x73\x40\xe0\x1b\x17\x2d\xbe\xa3\x80\x13\xe5\xf3\x36\
+\x4a\x00\x7b\x05\xc8\xaa\x03\x2a\x01\x8b\x87\x9f\x97\xf0\x8a\x42\
+\x4e\x1e\xe2\xef\xdc\x14\x84\x3a\xc9\x00\x1f\xbf\xd3\x23\x10\xb1\
+\x4b\x40\x22\x88\xa9\xe1\x08\x96\x6c\x5c\x00\x70\xa5\xc7\x45\x36\
+\x87\x80\x55\x12\xd9\x99\xcc\x74\xe9\x03\x7b\xb8\x2a\x1d\xc0\x50\
+\x51\xc4\xc9\xc3\x7a\xab\x23\x70\x72\x53\x26\x86\x08\x6a\x42\x83\
+\x12\xd1\x74\x85\xb0\xbc\x61\x01\xc0\xf0\x67\x4e\xb2\x39\x19\xe0\
+\xb0\x40\x08\x43\x4e\xe3\x58\xb6\x66\x2f\x57\x50\xc6\xb2\x31\xc0\
+\xa2\x57\x10\x61\x99\xa6\x30\x76\xbc\x21\x13\xc7\x81\xca\xac\x86\
+\x54\x44\x35\xd6\xdc\xbd\x25\x65\x0e\xf8\xc3\xeb\xa0\x7b\xd7\xf0\
+\x0e\x1d\x2c\x93\x54\x0e\xb2\x57\xf1\xce\x2b\x8c\x8b\x58\x22\x18\
+\x80\x82\x4c\x05\x5a\x80\x21\x7e\xfe\x9a\xea\x1e\x5c\x02\xc5\xfe\
+\x86\x88\x5f\xc5\xaf\x83\x21\x3c\xb8\x43\x31\x07\xfc\x7c\x40\xa2\
+\x47\xea\xd8\x44\x87\xee\x41\xc5\x3c\xc0\xa2\x7b\xc1\x06\x5b\x4a\
+\xb3\x80\x88\xe1\xc1\x1c\x40\x61\xfd\xc3\x17\xd8\xe4\xab\x18\xec\
+\x0f\xa3\xa6\x7d\x01\x40\xff\xdb\x36\xaa\x7d\x6e\x31\x03\x58\x06\
+\xc9\x33\x07\x20\x03\x32\x0f\x10\xc4\x15\xa8\x5c\x81\xe6\xe7\x3b\
+\xbf\x49\x29\x36\x39\x7a\x9e\x01\x93\xe8\xeb\x0d\xe3\x99\xf7\xd2\
+\xe6\x80\xde\x36\x1b\x39\xd9\x03\x7b\x5e\x66\x42\xf0\x49\x7c\xd6\
+\x6c\xde\x7f\x9d\x44\x85\x99\x0a\xd8\xe4\xc1\x4f\x5e\x30\x0c\x20\
+\x4d\x20\x1e\x23\xcc\x46\x35\xf6\x44\x60\xc3\xa1\x05\x00\xdd\xdb\
+\xad\x24\x39\x79\xf3\x0c\x11\xd9\x19\xc1\xae\xad\x6d\x39\xc8\x80\
+\xb2\x79\x40\xd6\xe4\xef\x3e\xdc\x68\x98\xaa\xe9\x3d\x26\x13\xe4\
+\x10\x19\x4d\xba\xb9\x4b\x33\x07\x7c\xfa\xaa\xa0\x4d\xcd\x25\x2c\
+\x0d\xcb\xe0\xe4\xb7\x46\x5a\xc6\x0b\xca\xb2\x1e\x94\x67\x01\x45\
+\x99\x3e\x60\x80\x30\x24\x1a\x67\x89\x2e\x03\xb1\x61\x88\xf0\x24\
+\x3a\xbd\x33\x68\xfd\x7c\x01\x40\xe7\xcb\x82\x9a\x1b\x39\x81\xe4\
+\xe0\xe4\x85\x0c\x59\x0a\xb2\x95\x43\xe3\x4e\x86\xdd\x03\x0b\x43\
+\x34\x51\x0c\x8b\x3a\xcd\xdb\xd6\x9b\x6c\x32\xd3\xc9\x29\xbe\xcb\
+\x3e\xa3\x93\x3b\x3a\x43\xd8\xd9\x43\xe6\x80\x03\xcf\x0b\x72\xb0\
+\xfe\x4e\x27\xe6\xf4\x11\x1c\x4b\xd7\xc9\xa5\xff\x11\x32\x4d\xa2\
+\x0f\x93\x3e\xc8\x01\xf1\x38\x10\x09\x65\xe6\xda\x8f\xce\x03\xfe\
+\x03\x17\x84\xfa\x28\x04\x68\x5c\x79\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x05\xb2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x79\x49\x44\x41\x54\x78\xda\x95\x56\x6b\x6c\x54\x45\
+\x14\x3e\x73\x9f\x7b\xf7\xd1\x7d\xb5\xdb\x6d\xb7\xad\xb4\x4a\xd1\
+\x62\x10\xa8\xb6\xc4\x58\xc5\x10\x0b\x9a\x98\xfa\x87\x44\xa8\x31\
+\x18\x22\x92\x12\x49\x09\xa8\xc0\x0f\x1b\xf9\x21\x12\x21\x10\x8d\
+\x08\x26\x24\x6a\x04\x49\x88\x41\x12\x0d\x81\x68\x20\x29\x21\x52\
+\x2d\x31\xa8\x44\xa3\xb4\x94\xda\xee\xa3\xdd\xdd\x76\xef\xdd\xdd\
+\xfb\xdc\xf1\xec\xdd\xd2\x06\x59\x08\x4c\x72\x32\xf7\x31\x73\xbe\
+\xf3\xf8\xce\x99\x21\xb5\xdb\x13\xef\x8e\x7f\x10\xda\x05\x65\x06\
+\xfe\x5b\x86\xd3\x72\x94\x36\x94\x16\x94\xfa\x99\x5f\xa3\x28\x57\
+\x51\x06\x50\xce\xe3\xfe\x9f\xe0\x0e\x83\xd4\xbc\x13\xa5\x38\xf7\
+\x45\xf7\xd4\xcc\x82\xd4\xbc\x1d\xeb\xc0\xa9\xbb\x36\xc0\x76\x2f\
+\xa8\xe1\xdc\x0d\x41\x0e\xaa\xdc\x0c\x48\x02\x03\x46\x81\x42\x2a\
+\x5b\x80\xd8\xb4\x05\xff\x26\x2d\xb8\x91\x34\x95\x64\xa6\x70\x14\
+\x08\x1c\x1d\xdf\x13\xee\xbf\x0d\x20\xf2\xd6\x18\x75\xbb\x59\xc8\
+\x28\x56\x5f\xf4\xc3\xc8\xae\xf0\xb6\xb1\x1e\x97\xc4\x6c\x6b\xa9\
+\x13\x1a\xdb\x9b\x44\x88\xf8\x18\x28\x50\x02\xba\x45\x51\x00\x34\
+\xb3\x00\x86\x85\xef\x26\x05\x15\xbf\xa5\x11\x6c\x28\x66\xc0\xf5\
+\x84\x31\x9c\xcd\x17\xf6\x46\xf7\x46\x0e\xde\x02\x50\xbb\x6d\x94\
+\xae\x58\xea\x81\xab\x23\x79\x18\x9b\xd0\x7f\x70\xbb\xb8\x67\xea\
+\x43\x3c\xbf\xb8\x41\x84\x10\x5a\xed\x16\x09\xfc\x3a\x6e\xda\x56\
+\xe7\x74\x74\x96\x00\x08\x1c\x01\x89\x27\xe0\xe0\x00\x78\x96\x20\
+\x20\x40\x2c\x6d\xc2\x48\x5c\x37\xa6\x15\xb3\x2f\xb6\xaf\x61\xf7\
+\x5c\x88\xb6\x0c\xd3\xe7\x1e\xaf\x80\x85\x61\x1e\xbe\xbb\xac\x80\
+\xc1\x30\x10\xac\x60\x21\xe0\x64\x41\x44\x05\xd7\x26\x4d\x5b\x29\
+\x50\x7b\xf9\xcc\xc3\xdc\x5c\x5c\x23\xb0\xa5\xb7\x69\xc5\x82\xb1\
+\x84\x66\x28\x39\xab\x37\x7e\xa0\xc9\xf6\x84\x84\x37\xff\x4d\x9f\
+\x5e\xe2\x83\x25\x75\x02\xb4\xd6\x0b\xf0\x69\xbf\x0c\x19\xb4\xb4\
+\xa8\xc2\xc0\x10\xa8\xaa\x05\x72\xd6\x84\x5c\xce\x02\xcd\x28\xd8\
+\x56\x89\x02\x7a\x20\x71\xe0\x71\x73\x20\x89\x2c\x30\xb8\x98\xa0\
+\x50\x5a\x04\x31\x21\x31\xa1\x0e\xe9\x06\x5d\x97\xf8\x78\x7e\x3f\
+\xa9\xde\xf4\x27\x6d\x5f\xe4\x83\x47\x6b\x79\x78\xa8\x4a\x80\xc5\
+\xb5\x02\xf4\x7e\x93\xb4\x2d\x4a\x4f\x6b\x90\x9e\xd2\x63\xba\x66\
+\x1d\xc7\xf7\x33\x84\x90\x41\x8a\x5a\x50\x59\x2b\xa5\x64\xa5\x28\
+\xb2\x2f\xfb\x7d\x7c\xd8\xe7\x15\x60\xce\x3f\x02\xc9\x94\x0a\x93\
+\x49\xf5\xf0\xc4\xc1\x96\x8d\x24\xb4\xf1\x37\xba\x78\xa1\x1f\x16\
+\x54\x0b\xc0\xe2\xce\x9f\x47\x54\x98\x87\xac\xf9\x63\x54\x85\xf1\
+\xa8\x32\x66\x59\x74\x53\xf2\xb3\x45\xa7\xca\x51\x30\xb8\xe1\x4a\
+\x17\xc7\x31\x3b\x83\x41\x47\x9b\xcf\x2b\xce\x46\x4f\x47\x4f\xa3\
+\xe3\x8a\xac\x6a\x85\x4e\x52\xf9\xfa\x65\xfa\xd8\x23\x41\xa8\x90\
+\x18\x88\x22\xf5\x66\x82\x8d\x20\x3c\x5c\xfc\x3d\x0d\x8a\x62\xf4\
+\xa5\x8e\x2c\x2d\x5b\x27\xc5\x11\x58\x3f\xd8\x85\x9e\x1c\xaa\x0e\
+\xb9\xc3\x62\x31\xeb\xf6\xa0\x30\x39\x91\x43\xef\xb5\x1d\x24\xf8\
+\xda\x00\x6d\x6e\xae\x04\xd3\xa2\xb3\x3f\x8b\x6e\xda\xee\x62\x38\
+\xe2\x71\x19\x14\x59\xef\x4b\x7f\xd1\x7e\x47\x10\xff\xba\x4b\xfb\
+\x03\x01\xa9\xd7\x1f\x70\xce\xa6\x5f\x51\x74\x88\xc7\xe4\x93\xc4\
+\xfb\xca\x05\x5a\x52\x36\x13\x43\x52\x8e\x2b\x36\x70\xdf\xd4\x57\
+\x1d\x65\x41\xbc\xdd\x17\x56\x49\x12\x7f\xba\xae\xc1\x0f\xc8\x60\
+\xd0\x8a\x35\x83\x45\x33\x76\x23\xf5\x17\x81\x7b\x1c\x15\x6b\xce\
+\x35\x66\xbe\x7e\x76\xb8\x2c\xc0\x9a\x73\x55\x2c\xcb\x24\xe6\xcf\
+\xaf\x06\x16\x29\x9b\x55\x0b\x40\xb1\xe2\xaf\x0f\x25\x72\xf7\x0c\
+\x70\xb7\xe1\x59\x7d\xd6\x06\x58\xd8\x52\x0b\x1c\x16\x5e\x52\x36\
+\x11\xa0\x00\x37\x86\xe2\x73\x00\x18\xef\xe2\x33\x32\x91\x14\xee\
+\x17\xc0\xfd\xd2\xf7\xab\xdc\x1e\xf1\xf4\xc3\xcd\x61\xbb\x1e\x62\
+\x53\x06\x86\xc8\x84\xf8\x68\xa2\x14\x22\x54\x5e\x4c\xbf\x84\x92\
+\x47\x00\xf3\x7e\x01\x9c\x2f\x7e\xbb\x3f\x12\x09\xf4\xce\xab\x0f\
+\x80\xaa\x17\x1b\xa1\x0e\x79\x05\x59\x14\x4f\x9d\x24\xd2\x0b\x27\
+\xb6\xf3\x1c\xb3\x9b\xd0\x62\xe5\x16\xec\x64\xcf\x64\x75\x14\x33\
+\xfc\x66\xfe\xf4\xea\x53\x77\x53\x2e\x3d\x7f\xa2\xcb\xe5\x12\x0f\
+\x35\x3f\x58\x13\x0e\xfa\x1d\x30\x96\xd6\x61\x0a\x2b\x3f\x33\x99\
+\x86\x6c\x46\xd9\x41\x1c\x9d\xc7\x96\xf1\xa2\x70\xd6\x17\xaa\xf2\
+\x30\x3c\x8f\xba\x4b\x34\xcd\x67\x64\x90\xd3\x53\x03\xd4\xb2\xde\
+\x57\xcf\xae\x2d\x0b\x22\x76\x1e\xeb\x12\x38\x76\x67\x63\x63\x75\
+\xdb\x03\x11\x3f\x26\x98\x81\x2b\x23\xd8\xcf\x34\x1d\x52\xf1\x09\
+\xd9\xd2\x8d\x4e\xdb\x56\x71\xc5\x97\x87\x5c\x7e\xff\x1b\x2e\xbf\
+\xd7\xe6\x69\x89\x9e\x14\x41\x14\xc8\xcb\x99\x98\xa1\x69\xc7\xf1\
+\xdb\x19\x8a\xad\x62\x26\x69\xad\xe8\xe8\x4a\x97\xcb\xb1\xa6\x2e\
+\x12\xac\x9e\x57\x17\x80\xca\x0a\x1e\x06\xaf\xc9\x90\xc6\x5e\x94\
+\x4d\xa3\xf5\x53\x53\x87\xb5\x1f\x5f\xdd\x68\xaf\x17\x96\x1f\xe9\
+\x60\x78\xe1\x73\x77\x20\xd0\x24\x38\x5d\xb6\x86\x9b\x9e\x58\xba\
+\x06\x46\x2e\x07\x86\xaa\xa2\x65\x9a\x0d\x2e\xb9\x25\xf0\x7a\x5d\
+\x50\x13\xf2\x42\xc0\xef\x82\x4a\x0f\x0f\x57\xae\xcb\x98\x5c\x1d\
+\x74\x5c\xab\x24\x27\x87\x0a\xa6\xb1\x4e\x3f\xbf\xbe\x7f\x96\x45\
+\xdc\x53\x87\x7b\x78\xc9\x79\xc0\xe5\x0f\xf0\x9c\xc3\x31\x03\x82\
+\xfd\x9e\x63\x50\x08\xf6\x7d\x06\x1c\x3c\x03\x02\x8a\x88\xe2\xc0\
+\xd3\xad\x3e\xe8\x40\x4a\x1a\xf0\x4f\x34\x0b\xa9\x0c\x32\x47\x53\
+\x21\x9f\x4e\x1a\x7a\x5e\xed\x35\x2f\x6c\x38\x78\x53\xc7\xec\x60\
+\x9f\xfc\x64\x87\xe0\x70\xbe\xe7\xf0\xfa\x79\x1e\x3d\x21\x98\x79\
+\x16\x7b\xb1\xc8\xb3\x78\x5c\xb2\xe0\xc4\xd6\x5c\x54\xee\x75\x71\
+\x10\x44\xab\x87\xe3\x79\xb8\x36\x9e\x03\x0b\x99\x61\x64\xb3\x18\
+\xd2\xb4\x61\xa8\xf9\x3e\xeb\x62\xcf\xdc\x81\xf3\xff\xc4\xb1\xed\
+\x1f\xf5\x60\xb8\xb6\x8a\xee\x8a\x26\xde\xe5\x01\x56\xe0\x4b\xfd\
+\xa3\x54\x2d\xb7\x6d\xb3\x4c\x0c\x8b\x92\x41\x91\x87\x2c\x43\xdf\
+\x57\xb8\xb4\xf9\xd6\x23\xb3\x1c\x3b\x98\x27\xf6\x77\xa0\xaa\x6e\
+\x96\x17\xd7\x72\x92\xd3\xc3\x89\x12\x70\x82\x08\x84\xe7\x80\x20\
+\x98\x65\x19\x76\x6e\x2c\x35\x0f\xa6\x9a\x93\x4d\x4d\x3b\x86\xdb\
+\x8e\xd2\x5f\xb6\xdc\x7e\xe8\xdf\x8d\xe3\xa4\x75\xef\x32\x34\x7a\
+\x39\xae\x6a\xa3\xc5\x6b\x0b\x2d\x5d\x5b\xb0\x18\xf1\xda\x42\xf1\
+\xda\x42\x06\xf0\xfb\x79\x18\xdc\x7a\xc7\x6b\xcb\x7f\x8e\x67\x70\
+\xd4\xa4\xe6\xb8\x84\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\xcf\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x96\x49\x44\x41\x54\x78\xda\x9d\x94\x7b\x50\x54\x55\
+\x1c\xc7\xbf\xe7\xee\x65\x59\x58\x5c\x44\x9e\x09\x5b\x3c\x14\x8c\
+\x92\xb2\x14\x07\x6d\x32\xe9\x21\x0c\x13\x39\x08\xcc\x28\xe5\xf0\
+\x98\x69\x44\x98\x9c\x46\x27\xfc\xa3\xa6\x19\x6b\x12\x0c\x2b\x73\
+\x10\xc7\xc4\x1d\xcb\x2c\x87\xc5\x31\xa7\xc1\xb5\x07\xa8\x95\xcd\
+\xd0\x83\xa6\x87\xa3\xcb\x0a\x28\x6f\x24\x5e\x2d\xaf\x7d\xdc\xd3\
+\x6f\xef\x5d\x70\x60\x71\xd3\xce\xee\xd9\x73\xf7\xfc\x1e\x9f\xdf\
+\xef\x77\x7e\xe7\x32\xcc\x19\x83\x3f\x44\x70\xf9\x81\x7e\x17\x3d\
+\xd1\xcb\x66\xf6\xbf\x8f\xc8\xa1\xa5\x84\x29\xa2\x2a\x92\xd5\xe2\
+\x2e\x06\x9b\xbb\x31\xd2\x14\xc9\x75\x2b\x9b\x30\xfa\x73\x32\x02\
+\x93\xbb\x98\x7b\xaf\x94\x96\x83\xfe\x4b\xdf\x93\xdd\x8f\x5b\x76\
+\x73\x70\x7b\x2e\xc9\x8d\xf7\x0c\xb0\xfe\xa6\xe7\xda\x87\x1b\x30\
+\xfe\x67\x2a\xb4\x8f\x76\x30\x6b\xb3\xbe\x94\x94\x0e\xfa\xc6\x7e\
+\x00\x95\x36\x49\x06\x48\x93\x16\x4c\x58\x4a\x6d\x04\xc9\x0b\x58\
+\xd1\x61\xbc\x27\xc0\xc4\x5f\xd1\x5c\xb3\xe4\x34\x26\x2d\x59\x2e\
+\x67\xdb\xe9\xe7\x90\x3a\xf2\x2d\x08\x7e\xcb\x95\xe2\xb8\x4c\xe8\
+\x2b\x4d\xb4\xc0\xd6\x51\x66\x03\xe3\x79\x7e\x0f\xb5\x1b\xef\x1a\
+\x30\x65\x8e\xe5\xea\xa8\x1a\x32\x2e\x24\x21\x83\x2a\x74\x27\x04\
+\x4d\xa2\x72\x2c\x8e\x01\xc5\x48\x0c\x51\xfe\x4f\xb5\xc0\x71\xab\
+\x9c\x32\x41\x9e\x3a\xa1\xd5\x78\x57\x00\x7b\x6b\x02\x17\xfc\xd7\
+\x81\x8f\x37\x40\xd0\x15\x81\xa9\xe3\x65\x35\x6e\xbf\x06\x69\xe4\
+\x63\xd9\x42\x58\xb0\x95\xf6\x13\x14\x88\xdd\x02\xe7\xc8\x11\x1b\
+\x23\x88\x18\x67\x31\xfe\x27\x40\xba\x11\xcf\xe5\x52\xf8\x65\x83\
+\xf9\xc4\xd0\x23\x39\x77\xb6\x11\xf0\x0c\xfa\x74\x7b\xa0\x92\x46\
+\x11\x6a\xad\x04\xf3\xdf\x08\xa8\x62\x14\x23\x67\x2b\xc9\xeb\x6c\
+\x64\x95\xa7\x7a\xc0\x6c\xbc\x23\x80\x77\x26\x14\xd1\x72\x14\xe2\
+\xd3\x14\xa6\xde\xbd\xd9\x45\x69\x35\xa0\x37\x60\x1f\xac\xbe\x19\
+\xf2\xd6\xc2\x49\x03\x42\xc6\x2a\x01\x31\x95\xf4\x22\xdd\x91\xdd\
+\x04\x1c\x0d\x36\x7a\xca\x63\x51\xd7\x8c\x1e\x00\xe7\xcd\xa5\xf9\
+\x94\xa6\x01\xaa\x64\x30\x21\x42\xf1\xcd\xfb\xc9\xe8\x27\xf4\xe8\
+\x5c\xce\x9f\x47\x9c\x46\xd1\xbd\x3e\x45\x90\x71\x82\x58\xf7\x41\
+\x10\x57\x91\x97\x30\x37\xa4\x0b\x92\xf3\x57\x82\x70\xca\xa4\xc5\
+\x38\x03\xb0\xb7\x2e\xc9\xa7\x07\x83\xa0\x5a\x06\xc6\x42\xe4\x6e\
+\xe1\x7c\x08\x4e\xe7\x55\xf4\x05\xee\xc5\x88\x5f\x16\x62\x7c\x67\
+\xa7\xdb\x46\x90\xa0\xb1\x63\x08\x1d\xad\x20\xc8\x83\x64\x17\xa4\
+\xd8\x49\xb7\x20\x49\x66\x39\x13\x31\xd6\x62\x64\x36\x73\x6c\x1a\
+\xed\x97\xab\xc4\xa8\x47\x04\x04\xca\x5e\xb8\xf4\x0f\x1c\xce\x4e\
+\xf4\x04\x91\x73\x6d\x36\xa2\x7d\x3d\xbb\xc3\xd5\xb0\x37\x5c\x10\
+\x6b\x0d\xc2\x47\xf6\x42\x54\xe9\x09\xb2\x40\x49\xc4\x39\x04\x07\
+\xef\x6e\xa7\x8a\x14\x33\xea\x7b\x93\x5a\x0c\xde\x20\x30\x25\x7f\
+\x49\x9a\x84\xcd\x31\x88\x9e\x90\x72\x0c\x07\xe4\x42\xaf\x76\xe7\
+\xc9\xe7\x14\xd5\x7d\x25\x3a\x5d\x90\xd1\xa3\x08\x1f\x7a\x07\xe4\
+\x07\x02\x53\xa2\x71\x4a\x13\xb0\x3b\x06\xcf\xbb\x6e\xaa\xc9\x47\
+\xa5\xde\xe0\x23\x6a\x20\x71\x07\x5a\x86\x03\x21\x46\xef\xc0\x90\
+\x6e\x0b\x22\xd5\xae\x73\xb8\x53\xbf\xdd\x1e\xdd\x54\x90\xe0\xe1\
+\x8f\xe0\xdb\x73\x00\xe1\x5a\x07\x54\x4c\x84\xdd\x69\xa3\x39\x79\
+\x9e\x8d\x34\x2d\x4e\x23\x9d\x42\x9a\x69\xe4\xc3\xb4\xed\xc7\xd7\
+\x73\x4a\x0a\x8a\x11\xe1\xe3\xd9\xcf\xc1\x7f\x44\xb9\x6e\x04\x7d\
+\x66\xd3\x06\x92\x3a\xd1\x4b\x90\x2a\x43\x35\xaa\x53\xde\xae\x65\
+\x8c\xa5\x71\xce\x4d\xa4\x76\xcc\x23\xae\xc8\x9d\xdf\xf2\xaf\xf7\
+\xa4\xce\x2e\x8b\x7b\x44\x34\xdf\x87\xa0\x64\x13\xc9\xa8\x9c\x82\
+\xeb\xd4\xd5\x18\xba\xfc\x38\x7a\x1f\xeb\x91\x55\x9f\x7d\xa3\x11\
+\xdd\xfb\x53\xd9\xdc\xc0\x66\x8d\xb0\x92\x7a\x6e\xaa\x48\xf7\x3c\
+\x51\xd2\xd4\x37\x85\x21\x64\xf5\xe7\xe4\xdc\x8f\xa6\x46\x9e\x03\
+\xdf\xad\x43\xc7\xaa\x7e\x59\x9e\x56\x56\x8f\xfe\xaa\x0c\xef\x80\
+\x45\x45\x75\xfc\xcb\xf7\xb3\xe6\x4b\x00\xb1\x97\x83\x11\x9e\x52\
+\xe5\x06\x68\xe5\xb5\xef\x52\x26\xda\x52\xfe\x96\xe5\x19\xaf\x9e\
+\xc6\x60\xcd\x26\xef\x00\xdd\x8b\x9f\xf2\x2f\xaa\xb6\x78\x7a\xa7\
+\x11\x7f\x69\x21\x16\xaf\x79\x53\x71\xae\xa2\xc9\xfc\xd1\x7d\xb1\
+\x00\xe6\x27\x87\x65\xfd\x17\x4a\x4f\x62\xf4\x44\x9e\x77\x80\x36\
+\xa7\x86\xd7\x1d\x29\x94\xbb\x87\x4d\xa7\xe1\xd6\x4a\x6c\xd0\x41\
+\x9f\x52\xac\x38\x17\x94\xd9\x71\xe1\x35\x5c\x59\x3f\xea\x7a\x65\
+\x21\xfb\x65\x03\xc6\x6a\x0b\xbd\x03\x34\x99\xd5\xfc\x94\x61\xdb\
+\xbc\x87\x9c\xf4\x95\x16\xd1\x6b\x36\xdd\xce\x80\x66\x7b\x43\x25\
+\x7e\x7f\x6e\x4c\x96\xe7\x16\x1c\xc6\xd4\xd9\x62\xef\x00\x9f\xf4\
+\x03\xfc\xe4\x27\xaf\x28\x81\xbb\xa3\x9f\xce\x66\xc5\x39\x0d\xe2\
+\x52\x9e\x22\xc7\x7e\x33\x19\x5c\x6f\x3c\x8e\xe6\xf4\x49\x59\x6f\
+\xf3\xd6\x0f\xe1\xa8\xdf\xe1\x1d\x20\x3c\xf3\x2e\x3f\xf1\xd9\x2e\
+\xc5\x29\xe4\xb7\xf5\xcc\x58\x79\x56\x8d\xf8\xb5\xcb\xdd\x87\xec\
+\x2f\xaf\xe6\xc6\x73\xf8\x25\xd3\x26\x07\xf4\xd2\xe6\xfd\x90\xbe\
+\xd9\xe5\x1d\x80\xf5\xe5\xfc\xf8\xa9\xb2\x99\xda\x4f\x67\xe2\x5a\
+\x57\x9f\x11\xb1\x6c\xed\xfd\xee\x3b\xa0\xb4\xea\xd5\x8b\x4d\x68\
+\xda\xe8\x90\xe5\xf9\xb9\x15\xc0\x85\xdd\xf3\x03\xae\x1c\x62\xf3\
+\xf4\xcd\xff\x1f\x89\xdb\x95\xdc\xff\x05\x9d\xfe\xc6\xbf\x42\xed\
+\x57\xfe\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x4b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x12\x49\x44\x41\x54\x78\xda\xb5\x94\x7d\x68\x1b\x75\
+\x18\xc7\xbf\xbf\x4b\x72\x49\x13\xdb\xd4\xae\x75\x49\xda\x4e\x99\
+\x22\xe2\x3f\x4e\x87\x93\xfa\x02\x83\xa1\x76\x4c\x28\x6c\xfe\x21\
+\x53\x91\x39\xa1\xd6\xb5\x73\x03\xdf\x8a\x08\xd3\x29\x9b\x74\x9b\
+\xce\x42\x1c\x22\xfe\x57\x5f\x18\x55\x07\xc5\xce\xc1\x2a\xe2\x86\
+\x93\x39\x61\xab\x6e\xd6\xb9\x94\xad\x69\x93\x2d\x2f\xcd\xdb\xe5\
+\xed\x72\xf7\xf8\xdc\x25\x6b\x87\x24\x85\x08\xde\xe5\x72\x3f\xee\
+\x9e\x7b\x3e\xbf\xe7\xfb\xfd\x3d\x3f\x81\xff\xf9\x10\xd7\x07\x94\
+\x7f\xb7\x13\x76\xfb\x26\xc0\xf2\x38\xa0\xae\x86\xaa\x02\x4a\xe9\
+\x0c\x88\xbe\x07\xf4\x51\xd1\xb2\x7b\xe6\x3f\x03\xa8\xb0\xab\x0b\
+\xb2\xe5\x75\x68\xbd\x3d\xc8\xee\x43\x3a\x96\x31\x9e\xa2\xd1\xd5\
+\xc0\xf9\x6d\x3c\xd2\x8f\x40\x2f\xbe\x6f\xf1\x1e\xfc\xb9\x6e\x00\
+\xc5\x5e\xe9\x44\x4b\xc3\x30\xb4\x81\x9e\xf4\x85\x6d\x28\xa9\xa5\
+\xbc\x4b\x2e\x8d\x71\xd2\x62\x26\x5d\xdc\xd8\xec\xed\x70\x90\xe5\
+\x26\x08\x5d\x3d\xa2\x03\x03\xf2\xad\x87\xea\xaa\x44\x50\x72\x60\
+\x07\x5c\x6f\x7d\x80\x60\x1f\x94\x60\xf8\xa8\x56\xc8\x3f\xe5\x5e\
+\x77\x26\x69\xbc\x54\x4e\x76\x39\x9d\xad\x4d\x7b\x60\x5b\xbe\xbd\
+\xa8\x59\x40\x6a\x76\xa7\xe3\xee\xaf\x3e\xac\x0f\x10\x79\x76\x1c\
+\xa1\x68\x77\x78\x3a\xa2\x50\x3c\xee\xf5\x6d\x09\xa4\xff\x1d\x44\
+\x7f\x6f\x1c\x2b\xe4\xa4\x0d\x85\xd4\xfc\x51\xf7\x43\xc7\xd7\xd7\
+\x07\x98\xde\x45\xe9\x99\x09\x44\xcf\x4d\x7f\xbd\xb2\x7f\x66\x53\
+\xb5\x20\xfa\xeb\x89\xde\x42\x46\x3f\x94\x89\x5e\x43\xeb\x63\xbf\
+\x8a\xba\x00\x85\xb9\x11\x0a\x9f\xd8\x8b\xf9\xd3\xb3\xfe\x55\x43\
+\xf1\x6d\x55\x01\x81\xee\x47\x4b\xda\x9a\x63\xb1\xf3\xdf\xc0\xd3\
+\x33\x59\x1f\x20\x3d\xf9\x1a\x05\x4e\x7c\x81\x62\x50\x19\xbc\xff\
+\xbd\xf8\xde\xaa\x80\x3f\x1e\xe9\x2b\x59\x1f\xf4\x5f\x3e\x75\x18\
+\x77\x3c\x17\xa8\x0f\x70\x6d\xec\x2e\xba\x38\x19\x83\x2b\xaf\x0e\
+\xae\x7a\x3b\x51\x1d\x70\xea\x9e\x3e\xbd\x63\xbb\xff\xec\xe8\x9b\
+\xb8\xef\xe5\x70\x7d\x80\xd9\xc3\x9d\x74\xf1\x5c\x02\x8d\x79\xda\
+\xb1\x7a\x28\x73\xb0\x5a\x90\xf6\xc3\xed\x7d\xb4\xf2\x55\xff\xe9\
+\xcf\xdf\x40\xd7\x60\xa2\x3e\x40\x70\xa4\x8d\x7e\x3f\x9b\x41\x4b\
+\x09\x2f\xad\x39\x90\xfb\xf8\xfa\x8b\xe2\x8f\x8d\x24\x2c\x12\x37\
+\x76\x3d\xe9\x8c\x72\xf9\xa7\x72\xc7\xe4\x34\x73\x5c\x73\x36\xca\
+\xb8\x8b\x9c\xb7\xb9\x18\xe0\x04\x49\x37\x03\xd6\x36\xbe\xbc\x7c\
+\xb5\x43\xb7\xf8\xf8\xee\xe1\xaf\xf9\xb9\x36\xcf\x89\xc2\x90\x4a\
+\x73\x40\x69\x96\x57\xcd\x15\x4e\xce\xbd\xa8\xc4\xa1\xcc\x65\x6b\
+\x03\xa2\xdf\x3a\x69\xd9\x9d\x4d\x9c\xa8\x11\x90\x5b\x01\x5b\x3b\
+\xc8\x62\x00\x3a\x00\xc9\xcb\xe3\x5b\x18\xe0\xe6\xe4\x09\xde\xaa\
+\x22\x10\x5a\x88\x01\x41\xa0\x10\x80\xc8\x5c\x02\xf2\x71\x44\xa6\
+\x52\xb5\x01\x57\xbe\x74\x92\xd5\x2e\x60\x91\x45\xa5\xce\x72\x68\
+\xdb\x03\xbb\xb9\x2a\x03\xc0\x50\xd1\xcc\xc9\xb9\xe9\x29\x82\xe8\
+\xc9\xad\xe5\x18\x22\x68\x79\x1d\x6a\x4a\x37\x14\xaa\x0d\x98\xfa\
+\xcc\x41\x56\x07\x03\xec\x12\x84\x30\xe5\x34\x8f\x15\x6b\xf7\x70\
+\x05\x1e\x96\x8d\x01\x92\x51\x41\x8a\x65\x8a\x60\xe6\xf8\x96\x72\
+\x1c\x07\xaa\x39\x1d\xc5\x94\xb6\x34\xe0\x37\xbf\x9d\xee\x5d\xcb\
+\x33\xb4\xb3\x4c\xb2\x0f\x64\xeb\xe4\x99\xb7\x9b\x17\xb1\x44\x30\
+\x01\x4d\xe5\x0a\xf4\x28\x43\xc2\xbc\x21\x1a\x1e\x5c\x02\x65\xfe\
+\x84\xc8\x5e\xc5\x2f\x13\x89\xda\x80\x9f\xf6\xcb\xf4\xf0\x7a\x36\
+\xd1\x6e\x78\xd0\xbe\x08\x90\x0c\x2f\xd8\x60\xa9\xad\x02\x48\x99\
+\x1e\x2c\x00\x54\xd6\x3f\x79\x81\x4d\xbe\x8a\x89\xf1\x64\x6d\xc0\
+\xf8\x3b\x56\xea\x7e\x72\x19\x03\x58\x06\xd9\xbb\x00\x20\x13\xb2\
+\x08\xe0\xed\x98\x93\x73\x05\x7a\x98\xef\xbc\x92\x8a\x6c\x72\xfa\
+\x3c\x03\x42\x18\x1b\x5d\x02\x30\x3a\x68\x25\x07\x7b\x60\x6b\x28\
+\xeb\x28\xf8\x24\x3e\xd7\xbd\xb0\xef\x06\x89\xdc\xe5\x0a\xd8\xe4\
+\x89\x4f\x9e\x31\x0d\x20\x5d\x20\x9b\x21\xe4\xd2\x3a\x7b\x22\x6a\
+\x03\x46\x76\x5a\x48\x76\xf0\xe4\x19\x22\x2a\x51\x82\x5d\xdb\x30\
+\x70\x80\x01\x9e\x45\x40\xc5\xe4\xef\x3e\xda\x6c\x9a\xaa\x1b\x3d\
+\xa6\x10\x94\x04\x99\x4d\x5a\x13\xf0\xe9\x8b\x82\xb6\xf6\xb7\xb2\
+\x34\x2c\x83\x83\x57\x8d\xbc\x82\x3f\xf0\x54\x3c\xf0\x55\x00\xcd\
+\xe5\x3e\x60\x80\x30\x25\x9a\x65\x89\x2e\x03\x99\x29\x88\x64\x08\
+\xc3\xfe\xf9\xda\x80\xe1\xe7\x05\xf5\xf7\x72\x02\xd9\xce\xc9\xdd\
+\x0c\x59\x0e\xb2\xfa\xa0\x73\x27\xc3\xe6\x85\xc4\x10\x5d\xb4\x40\
+\xd2\x62\x3c\x6d\xa3\xc9\x42\xe5\x4e\x2e\xf2\x5d\x09\x9a\x9d\x3c\
+\x34\xbc\xc4\x2a\xda\xff\xb4\x20\x3b\xeb\xef\x70\x60\x41\x1f\x41\
+\xec\xc3\x0d\x72\x19\x7f\x04\xb1\xb0\xe7\x90\xf1\x90\x03\xb2\x59\
+\x20\x95\x28\xbf\xfb\x07\x07\x1f\xdb\xad\xef\xa9\x66\x45\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x42\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x09\x49\x44\x41\x54\x78\xda\xb5\x96\x6b\x6c\x14\x55\
+\x14\xc7\xff\x77\x66\xf6\x45\xb7\x0f\xba\xb0\x2d\x0d\x95\xd2\x0a\
+\x26\x95\x14\x4d\x1b\x48\xb0\xa6\x24\x35\x41\x53\x94\x48\xb2\x81\
+\xaa\xd1\x60\x91\xa8\x44\x63\xfc\xe0\x23\x3e\x22\x5f\xfc\xa0\xf2\
+\xad\x18\x63\x20\xe1\x93\xc1\x54\xbf\x48\x8b\x04\xb5\x69\x53\x02\
+\x4a\x8c\x28\x8b\xd4\x16\x08\xaf\x56\xda\xb2\x3b\xfb\xec\xee\xce\
+\xee\xcc\x1d\xcf\xdc\x3b\x1a\x8c\xaf\xb6\xe0\x24\x67\xce\xdc\xd9\
+\x3b\xff\xdf\xb9\xe7\x9c\x3b\xb3\x0c\xff\xf3\xc1\xe6\x3a\xd1\x3e\
+\x81\x08\xb9\xdd\xee\x70\x1f\xdb\x80\xbe\xdb\x06\xe0\x27\x50\xcd\
+\xbc\xe1\x51\xac\x7a\x33\x0c\xbb\x00\xfb\xdc\x6b\x93\xb6\xcd\x1b\
+\xd5\xfb\x50\xbc\x2d\x00\xeb\x38\xde\x66\x0d\x3b\xf7\xb0\xda\x87\
+\x69\x29\x26\xf8\xf8\x7b\xb0\xf5\xef\x76\x68\xf7\xe3\xe0\x2d\x03\
+\xcc\x11\x04\xa1\x55\x5c\x52\xef\xfd\x78\x09\x14\xcd\xb9\x03\x7b\
+\xf6\x22\xcc\xe8\x5b\x63\xb0\xf9\xdd\xde\x0e\x58\xb7\x04\x28\x0d\
+\xe3\x65\xa5\xbe\x7b\xaf\xb2\x7c\xab\x33\x12\x2b\x80\x5d\x44\x69\
+\xfc\x43\x70\xfd\x87\x88\x7f\x23\x3e\x5b\x30\xc0\x18\x82\x17\x4a\
+\xe0\x92\xa7\xad\xb7\x8e\xa9\x7e\x09\xe0\x4e\xda\x0d\xf0\xcc\x65\
+\x18\xd1\xbd\xd1\x45\x9d\x68\x59\x30\x20\x3f\x88\x1e\xb5\xae\x6b\
+\xbf\xa7\xb1\x9b\x84\x4b\x60\xfe\x1d\xe2\xbe\x9d\x79\x97\x4e\x39\
+\x14\xc6\x3f\x87\x95\x1c\xdd\x1c\x7c\x00\x03\xf3\x06\xe4\xbe\x81\
+\x6a\x33\xcf\x58\xa0\xed\x83\x26\xe6\x2d\x17\x69\x61\x81\x67\x25\
+\x20\xf5\xba\x18\xf3\x7c\x1c\xd9\x33\x07\x4f\x56\x6e\xc2\x86\x79\
+\x03\xb2\x5f\x61\x9b\x56\xd3\x71\xc8\xb7\xfa\x49\x12\x93\xa9\x61\
+\x65\x2f\x4a\x40\xf2\x25\x3a\x51\x6d\x6d\x9a\x37\x7e\x04\x66\xe2\
+\x62\xe7\xe2\x87\x30\x38\x2f\x40\xfa\x98\xfa\x63\x59\xdb\x9e\xb5\
+\x4a\xa0\x5a\x16\x96\xe7\xc1\x82\xaf\x4a\x80\xfe\xbc\x58\x81\x63\
+\x66\x36\x81\xf4\xd9\xc3\x83\xa1\xcd\xe8\x9c\x33\x20\x75\x14\x5d\
+\xda\x92\xd6\xfe\x45\xcd\x3d\x52\xc8\xd9\x4f\x3c\x07\x56\xfe\x8e\
+\x04\xc4\x9f\xa6\xf1\x2c\x75\x6c\x9e\x14\x54\xa4\x2f\x7c\x0f\x43\
+\xbf\xb6\x3e\xfc\x08\x4e\xcd\x09\x90\x38\x82\x91\x60\xeb\x2b\xed\
+\x5a\x70\x99\x1b\x69\x81\x76\x5b\x16\xac\xea\x7d\x09\x98\xa6\xb7\
+\x86\x55\x90\x60\xc5\x8f\x52\x6e\x16\xfa\x4f\x5f\x7f\x51\xfb\x28\
+\xb6\xfc\x27\x40\xff\x12\xed\x6a\x55\xf3\x48\x45\x4b\x8f\xcc\xbd\
+\x6d\x88\xf4\xc0\x4c\x82\x85\x3e\x92\x80\x5f\x1f\xa4\x7b\x54\x00\
+\x45\x01\x54\x8f\x90\xd1\xcf\x7d\x0b\x23\x31\xdd\x52\xb7\x15\xd1\
+\x7f\x05\xc4\x06\xd0\x5f\xb1\xf6\xb9\x2e\x4f\xe5\x1d\x70\xfa\x1d\
+\xdc\x89\x3e\x43\x80\x04\x58\xf8\x13\x09\x98\xe8\x94\xe2\x8a\xc7\
+\x95\xb0\x50\xcc\xea\xb8\x71\xfa\xd4\xa7\xcb\x23\xd8\xfe\x8f\x00\
+\x7d\x00\xf7\xb0\xe0\x8a\xd3\x55\xad\xbb\x64\xe4\x56\x4e\xe4\x9e\
+\x9a\x9d\xf6\x58\x0a\xac\x4e\xb6\xbb\x7d\xa5\x5d\xe4\x9e\x1a\x99\
+\x06\xb6\x00\x38\x1d\x15\xfb\x65\x94\x17\x92\x89\xe6\xfa\x08\xc6\
+\xfe\x16\x10\x3b\x8c\x43\xc1\x35\x4f\x6c\xf3\x85\x1a\xe8\x19\x2a\
+\x22\x4f\x8b\xd4\xa0\x44\xbe\x94\x15\x9b\x4d\x0a\xd2\x63\x8c\x93\
+\x77\x8c\x3a\xcc\x22\xaf\x29\x30\xf2\x06\xa6\xa3\xe7\x0f\xac\xd8\
+\x8e\x9d\x7f\x01\xc4\x07\x70\x17\xf3\x87\x7f\x5e\xbc\x6e\x97\x0a\
+\x53\xa6\x04\xa5\x38\xd5\x91\xae\x4b\x79\x77\x16\x45\xed\x51\xdd\
+\x6b\x12\x36\x0b\x6e\x9d\xb8\x54\xa2\x9f\x66\xce\x4f\x9a\x85\x44\
+\xa6\x89\x20\x57\xff\x04\xa0\xe8\xf7\x97\xad\xde\xd2\xe3\xaf\x69\
+\x22\x41\x9d\xec\x06\x95\x80\x20\x26\x09\x68\x94\x6b\xad\x02\xac\
+\xfe\xa8\x4c\xd1\xcc\xe3\xb2\x4d\x9d\xda\x38\xab\xe4\x86\xdc\x78\
+\x0a\x87\x91\xc9\xe3\xfa\x99\xcb\xbd\x2b\xbb\xf1\xc2\x1f\x80\x78\
+\x3f\x7d\xad\xbc\x95\x07\xaa\xd7\x3d\x53\x4e\x6f\x31\x29\x5e\xa0\
+\xe8\x4d\x6a\x43\x8d\x5e\x72\x81\x30\x45\xb7\x94\xba\xa8\x57\x02\
+\xd2\x6f\x90\x38\x09\x5b\xce\x9c\x19\x32\xdd\x6d\x67\x2e\xea\x31\
+\x75\x76\x22\x6f\xa4\x66\x9f\x6a\xe8\x46\x9f\x00\xc4\xfa\x31\x54\
+\x76\xe7\xa6\x0e\x7f\x78\x95\x4c\x8d\x49\x0f\x5a\x14\x15\xf3\x01\
+\xde\x10\xe0\xab\x25\x40\x0d\x19\xbd\x93\x98\xd7\xed\x2c\x12\x35\
+\xaf\x53\x0a\x27\xa5\x77\x56\xe3\x7e\x1a\x0a\xa9\x3c\xa6\xa2\xd7\
+\x86\x57\x3e\x86\x8d\xcc\x4d\xcf\x90\xbf\x7e\x7d\x87\xb7\x6a\x19\
+\x3c\x01\x9f\xd8\x54\x62\xb2\x56\x49\x39\x5f\x4a\xde\x31\x07\x10\
+\x12\x1b\x4b\x74\x96\x39\x4d\x2b\xa5\x34\x17\xaf\x90\x9f\x90\x41\
+\x39\x95\x29\x9a\xc8\x4c\xa5\x91\xbc\x1a\x1b\x6e\xbc\x09\x10\xb1\
+\x2c\xec\xa6\x66\x08\x91\x5f\xc3\x49\xdb\xb2\x64\x73\xf0\xdf\xfd\
+\x4d\x66\xbb\xdd\xc9\x98\x34\xb1\x25\x1c\xaf\x8a\xeb\x0b\xaa\x8a\
+\x49\xb2\x7d\x04\xe8\x9b\xf3\xbf\x8a\x85\x1e\xbf\x01\x60\x9d\xde\
+\x28\xc4\x3a\xec\x11\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\x36\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xfd\x49\x44\x41\x54\x78\xda\xad\x95\x7f\x4c\x5b\x55\
+\x14\xc7\xbf\xaf\x94\x02\x2b\xd0\x8e\xfe\xdc\x3a\x9c\x03\xa9\x06\
+\x70\x6c\x91\xe8\xd6\xc0\x80\xd7\x15\x3a\xa6\x4c\x22\x89\xeb\x34\
+\xc6\xfd\x21\x89\x66\x71\x8b\x66\xd9\x92\x6d\x9a\x09\x5b\x9c\x31\
+\x73\x4e\xe3\x1f\x2c\x99\x8b\xd3\x62\x0c\x99\xda\x30\xa1\x94\x1f\
+\x62\x1b\x46\xdc\xa6\xb2\xe8\x7e\x26\xe2\x32\x44\xb0\x0c\x29\x32\
+\x91\xb5\xe5\x79\xde\x7d\x5d\x1b\xff\x79\x0d\x64\x37\xbd\xb9\xa7\
+\xa7\xdf\x73\x3e\xf7\x9c\x77\xef\x2b\x87\xfb\x3c\x84\x01\x3c\x4e\
+\x4b\x1d\xcd\xcd\x9c\x0d\x6b\xb9\xfb\x94\xd4\x21\x26\xa4\xd9\x00\
+\xb5\xd5\x02\x6d\x19\xf0\xfb\xc9\x10\x01\xb4\x8b\x02\x44\x03\x50\
+\x09\x80\x83\x82\xeb\xc5\xdd\x0a\xe9\xb9\x06\x85\xc1\x09\x8e\x26\
+\x32\x56\x32\xcd\x7c\xa0\x34\x94\x52\xbe\x00\xc0\xdd\x7e\x64\x82\
+\x63\x49\xb7\x41\xa0\x1d\xab\x0c\x1a\x85\xb1\x1a\x9c\xb1\x06\xdc\
+\x92\x02\xb1\x0e\x9a\x5c\x7c\x0d\x07\xd6\x43\x55\x01\x4e\x16\x30\
+\xdb\x87\x1c\xd2\x4b\xa5\x8b\xc9\x95\xda\x0c\x85\xd1\x8e\x14\x7d\
+\x25\x14\xd9\x8f\xc6\xf2\x51\xc2\xe8\x3f\x88\xde\x3e\x87\xe8\x44\
+\x1f\x54\x45\x87\x58\xec\x9c\xbf\x12\xe9\x55\x49\x00\x33\x3e\xdc\
+\xe4\x94\x59\x0f\xa4\x18\x6c\x50\xea\xca\x91\xa2\x2b\x8d\x35\x9d\
+\x3e\xd1\xbf\x29\xe1\x20\x22\x41\x3f\xa2\x53\x17\xbb\xc9\xd1\x4e\
+\xfe\x63\xea\x0d\x9d\x0c\x3c\xd3\xef\x44\x96\x23\x09\x60\xaa\x13\
+\x82\xa6\xe2\xcb\x78\xd9\xc2\xdd\x29\x84\x29\x69\xf8\xf6\xf9\x48\
+\x64\xf2\x07\x2f\x39\xc5\x1f\x3d\x5a\x27\x82\x09\xfd\x19\xa6\x0d\
+\xf5\xd7\x83\xfc\xf2\x80\x09\xda\x93\xae\xf2\x33\x66\x4f\xff\xd4\
+\x8c\xf0\xd4\x15\x31\xa1\x9b\xa6\x4f\xff\x24\x42\x72\xfa\xc9\xfe\
+\xe7\xa0\xdb\x9c\x04\x30\xf6\x35\x04\x53\x55\x0b\x15\xc0\x61\xbc\
+\xef\x25\x98\x9f\x86\xbc\xfe\x2b\xd2\xf3\x27\x58\xc1\xe3\xdf\x92\
+\x7e\x4b\x12\xc0\x48\x1b\x04\x0b\xff\x1e\x2b\x79\xa4\x77\x17\x72\
+\x1b\xe4\x01\xb7\x48\xbf\x82\x3f\x26\xc5\xc6\xf4\xb2\x01\xc3\xad\
+\x10\x1e\xdc\xd8\xcc\xec\xdf\xba\xf7\x63\x95\x4b\x1e\x30\xfc\x39\
+\xe9\xf9\x66\xf6\x90\x87\x7b\xf6\x23\x6f\x6b\x12\xc0\xf5\x4f\x21\
+\x14\xd8\xf7\xb2\x80\x1b\xdd\x6f\xc3\xfa\xbc\x3c\xe0\xfa\x69\xd2\
+\x3b\xf6\xb2\x16\xdd\xe8\x91\xf4\xb2\x01\xbf\x7c\x0c\xa1\xd0\xb1\
+\x83\xb5\xe8\xb2\xef\x03\x14\x6d\x47\x72\x7d\xf5\x0e\x06\xb8\xe2\
+\xfb\x10\x85\xdb\x93\x00\x86\x5a\x20\xac\xae\x79\x51\xb2\xbd\xa7\
+\xb0\xa6\x31\x01\x18\x3a\x81\x62\x88\xaf\x09\xc0\x4e\xce\x12\xf1\
+\xbe\xd1\xaa\x63\x7a\xb2\x2f\x75\x9d\x42\x49\x63\x12\xc0\x85\x8f\
+\x20\x3c\xe6\x7c\x86\x9d\xa2\x8b\xde\x36\x94\xbe\x22\x01\xc8\xcf\
+\x2b\xd3\xd2\x9b\x96\x9a\x2c\x36\x8d\xde\x0c\xb5\x36\x87\x25\xbd\
+\x13\x9a\x84\xc6\x60\x66\x15\xdf\xd3\xcb\x02\xce\x1d\x87\xb0\x6e\
+\x93\x93\xbd\x0e\x06\x3b\xbc\x58\xbf\x53\x02\x0c\xbe\x0f\xf7\x0a\
+\xab\xd5\x65\xc9\xcf\x03\x56\xd1\xb9\x8f\xd0\x3d\xbb\xb5\xeb\x7f\
+\xb1\x83\x1d\x9d\x4c\x2f\x0b\xf0\x1f\x85\x50\xb6\xa9\x8c\xed\xc8\
+\xdf\xe1\xc7\x86\xd7\x24\xc0\x77\x47\x11\x5a\xc7\x3f\x91\x9d\x9a\
+\xbb\x13\x58\xb2\x86\x8e\x4c\x23\xa4\x54\x54\x86\xf1\x05\xba\x10\
+\x9f\x20\xd0\x19\x98\x2e\x7f\x1d\x9a\x38\xa0\xf7\x88\xd4\x53\x72\
+\xd8\x49\x56\x12\x73\xeb\xaa\x6a\xd7\xb2\xe6\xf6\x9d\xfd\x11\xfc\
+\x1e\x09\x40\x5a\x77\xde\xc3\xcb\x5d\x2b\xf3\x4d\x88\x3f\x15\xfd\
+\x56\x40\x4d\xb0\x54\x13\x6e\x7a\x6b\xf1\xeb\xd5\xd1\x56\xd2\x6f\
+\x63\x3f\x77\x1d\x02\x9f\x96\xa6\x6c\x32\x98\x33\x6d\x7a\xa3\x1a\
+\x1a\x6d\x06\x0b\x0c\xfd\x35\x0b\x83\x31\x93\xd9\xbe\xf6\x6b\xa8\
+\xde\x27\xa5\xeb\x3a\x4c\x7a\x55\x42\x9f\x53\xd8\xc8\x18\x93\x97\
+\x5b\x30\xf1\xe7\x1d\x04\xc7\x66\x06\xe6\xe6\x22\x07\x48\xdf\xcb\
+\x02\xbe\x39\x08\xb7\xf5\x11\x8d\x2b\xbf\x20\x1b\x28\xbe\x00\x84\
+\x47\x81\x6b\x75\xf1\x56\xcd\xcf\x0b\xf0\x9e\x1d\x41\xed\x9b\x89\
+\x53\x44\x31\xac\x62\xc4\x2a\x8e\x75\x68\x88\xec\x1e\x32\x3d\xa4\
+\xfd\x19\x88\x15\xe8\x79\x03\xa1\xea\x9a\x9c\xec\xb4\xfc\x83\x40\
+\xa6\x0d\xb8\x5a\x23\xbd\x40\xc5\x91\xbb\x9b\xee\xfd\xbb\x68\xf7\
+\x04\xa7\x9f\x7a\x0b\x1a\x2c\x70\x30\xc0\x99\x7d\x70\x17\x15\xaa\
+\x5c\xd6\x87\x54\x89\x87\xb5\xec\x65\x20\x8b\x60\xa9\x16\x8c\x76\
+\x55\xe0\xfb\xf3\xb3\xad\xf5\x87\xe9\xdf\x6c\x31\x80\xb6\x3d\xe0\
+\xd3\x33\xd0\xb4\x7c\x99\xc2\x66\x36\x29\x60\x58\xfd\x2a\x83\x04\
+\x2f\x1d\xc7\xd8\xb8\x80\xd1\x3f\xe6\x07\xfe\x9d\xc5\x81\x86\x23\
+\xe8\x5d\x14\x40\x1c\x5f\xec\x46\x31\xdd\xa7\x3a\xca\x6b\xc7\xbd\
+\x53\xc4\x61\x88\xbe\xf7\xd0\xea\x79\xf6\x1d\xa9\xa7\x0b\x1d\xff\
+\x01\xfd\x53\x67\x28\xa3\x81\x66\x33\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x03\xf1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xb8\x49\x44\x41\x54\x78\xda\xad\x96\xdd\x6b\x1c\x55\
+\x14\xc0\x7f\x3b\x3b\xb3\x5f\xb3\x3b\xbb\x9b\x4d\x9a\x4d\xd2\x6a\
+\xa9\x49\xab\x7d\x68\x63\x5a\x6d\x15\x2d\x5a\x91\xfa\x10\x4a\x45\
+\x2d\x88\x20\x22\xf8\x60\x45\x88\xf8\x54\x7c\x50\x41\xe8\x83\xa5\
+\xfa\x22\x56\x0a\x6a\x15\xad\x34\xb5\x95\x44\x68\x62\x4b\xc0\x42\
+\x92\xc6\xb6\x54\xd3\x88\xd4\xd8\x24\x4d\xd8\x6e\x48\x36\xbb\xd9\
+\xcd\x7e\xcc\xec\xec\xee\xf5\x6e\xf2\x07\xa4\x0f\x73\xe1\x72\x87\
+\xb9\xe7\x9c\xdf\x39\xf7\xdc\x73\x66\x5c\xdc\xc7\x38\x3a\x56\x12\
+\xc7\x26\xca\xf0\x6f\x06\x26\x53\x90\x2b\x42\x54\x87\xde\x5d\xae\
+\xf5\x74\xd7\x15\xa8\x8f\x81\xe9\xb2\x78\xb4\x59\xa5\xff\x66\x96\
+\xbe\xcb\x49\x2c\xb3\xc2\xa0\x1d\x84\xe3\x5b\x9c\x01\x5c\x4d\x54\
+\x44\xdc\x50\xf8\xf1\xaf\x3c\x7d\xbf\xdc\x25\x14\xf6\x70\x29\xd4\
+\x00\x3d\x4d\xce\x00\xae\xcc\xd9\x62\x73\xc4\xcd\xf7\xb7\x0a\xfc\
+\x7c\xe6\x0e\x1d\xdb\x23\x5c\x8b\xc5\x98\x3a\x1c\x72\x06\x70\x71\
+\xaa\x2c\x3a\x62\x2a\xdf\x5c\xcf\xd1\x77\xf6\x0e\xbb\x9f\x8a\x23\
+\x5a\x23\x7c\xfb\x9c\xee\x0c\xe0\x37\x09\xd8\x14\x75\x73\x6a\x34\
+\xcb\xe0\x85\x69\x3a\xf7\x36\x33\xdd\x10\x66\xe4\x45\x87\x22\xf8\
+\x7d\xa6\x2c\x62\x86\x9b\xaf\x86\x97\x19\xea\x9f\x61\x63\xbb\xc1\
+\xa0\x3b\x02\xef\x3b\x94\x83\x81\x49\x4b\x34\x49\xc0\xc9\xe1\x0c\
+\x23\x97\x66\xf1\xf9\x35\x6e\xd4\x02\xf0\x79\xbb\x33\x80\x13\x63\
+\x45\xb1\xa3\x55\xe3\xeb\x2b\x4b\x4c\xfc\x31\x4f\x31\x6b\xf1\x5f\
+\x5a\x6e\xf4\xed\x59\x1f\x70\x74\x28\x2f\x3e\xbb\x65\x61\x2e\x9a\
+\x90\x2e\x40\x5e\x16\x94\xaa\x40\xd8\x2f\x8b\xc9\x47\x7c\x83\x97\
+\x56\x5d\xa1\x67\x87\x46\xef\x58\x86\xd9\xdb\x19\xb2\xf3\x79\x66\
+\x66\xa4\xac\x10\x6b\x56\xea\xf2\x9a\x06\x8a\xe4\x95\x2b\x60\xcb\
+\xe9\x92\xef\x42\x7e\x5c\x17\x6f\x9b\xe2\x91\xb8\xc6\xf8\x52\x95\
+\xd9\x79\x93\x44\xb2\x48\xb5\x22\x30\x0c\x15\x23\xa4\x11\x0c\x4a\
+\xc5\x9a\xc0\x6b\xda\x32\xc9\xcb\xa4\x93\x05\x0a\x4b\x25\x6c\x69\
+\xa8\xc9\xd0\xf0\x79\xdd\x04\x74\x15\x7f\x40\x93\x7a\x35\x52\x8b\
+\xf5\xbd\x2a\x1b\xe2\x3a\x03\x73\x2e\x5c\xe7\xc6\x8b\xa2\x3d\xee\
+\x61\x30\x61\x33\x9e\xb4\x58\x98\x2b\x60\x15\x6c\x34\x9f\x7b\x6d\
+\x7a\x14\x44\x55\x06\x96\x2b\xb3\xb2\x64\x52\x5a\x36\x31\x73\x16\
+\x15\x6b\xcd\x4b\xd5\xa7\xae\xca\x79\xe4\x5a\x2e\x55\xc8\xa7\x8a\
+\x68\xba\x46\xeb\xd6\x06\x46\xb2\x1e\x5c\xdd\x3f\x64\xc4\xcb\x9d\
+\x3e\xce\x4d\x14\x48\x27\xf2\x64\x12\x2b\xd8\x66\x55\x2a\xa9\x78\
+\xa4\xa0\x4f\x46\xe0\x76\x2b\x58\x52\xd9\x5c\x29\x53\xca\x98\x58\
+\x79\x8b\xaa\x5d\x93\x67\x23\xd6\xd2\x28\x4f\xa3\x2e\x53\x8f\x40\
+\x91\x6b\xf4\x81\x30\x2d\xdb\xa2\x8c\x2e\xba\xe5\xee\xbb\xd3\xe2\
+\xad\x2e\x95\xa1\x1b\x69\x0a\x8b\x05\x6a\x32\xbc\xd5\xe4\x48\x41\
+\x55\x02\xf4\x58\x00\x5f\xc4\x2b\xa3\x10\xd2\x7b\x8b\xd2\x52\x11\
+\xbb\x50\x46\x91\x0e\xa8\x5e\x6d\x15\x22\x6a\xb5\xd5\x7d\x45\xe6\
+\x22\xd0\xa8\x13\x69\xd3\x09\xb7\x05\x99\x4a\x0a\x09\x38\x78\x4d\
+\xb0\x20\xbb\x64\xd9\xac\x5b\x05\x9f\x07\x2a\x12\x62\xd9\xd2\xad\
+\x7a\xa2\x42\x10\xd1\xd9\xde\x69\x50\x4c\x95\xc8\xdf\xcb\xa1\x68\
+\x6e\x16\x4a\xea\x6a\x12\xeb\xf9\xc1\xae\xae\xe9\xd4\x9f\xe5\x15\
+\x26\xe0\x03\x5d\xda\x09\xa8\xf7\x77\x4d\x79\xed\x6f\x71\xa4\xbb\
+\x81\x5f\xaf\xa6\xc8\x4d\xa5\xd1\x5b\x0c\x12\x42\x76\xd3\x53\x1d\
+\xce\xd4\x01\xef\x4c\x8b\x0f\x0e\x85\x39\x3d\xb8\x40\xee\x9f\x24\
+\xa1\x87\x9b\x29\xf9\x23\xa4\x3f\x69\x75\x06\xb0\xf1\xc3\x84\x78\
+\xfb\x85\x30\x5f\xf4\x27\xc9\xde\x9c\x23\xd2\xb5\x89\x57\xbb\x62\
+\x1c\x7f\xa9\xc1\x19\xc0\x1b\xa7\x17\xc5\x63\x3b\x75\x3e\x3e\x9f\
+\x24\x37\x76\x97\xf0\x13\x9b\x39\xb6\xbf\x91\x37\xf7\x19\xce\x00\
+\xde\xfb\x29\x25\x1e\xec\xf0\xf3\x51\xef\x3d\x4a\xd7\x67\x09\xee\
+\xdb\xc2\xc9\x03\x8d\xbc\xb2\xc7\xa1\x6e\xba\xff\xd3\xa4\xe8\xec\
+\xf4\xf3\xe5\x99\x19\xec\xd9\x14\x81\x67\xb7\xf2\xdd\xf3\x51\x0e\
+\x3d\xee\x10\x80\xd7\x27\xc5\xe1\x67\x02\x9c\x97\xdf\x02\x21\xfb\
+\x8c\xf6\xf4\x43\x9c\xd8\x1d\xe2\xc8\x81\x88\x43\x80\xee\x3f\xc5\
+\x93\x3b\x35\x46\x87\x13\x60\xe8\x28\xbb\xda\x38\x18\xf6\x72\xa1\
+\xa7\xc5\x21\xc0\xde\x21\x41\x46\xfe\xae\x54\x65\x31\x19\x51\x68\
+\x6a\x92\xdd\x56\xd6\xc1\xd9\x6d\xeb\xea\xff\x0f\xe3\xcf\x8c\x38\
+\x31\x36\xc4\xa6\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x05\x30\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xf7\x49\x44\x41\x54\x78\xda\xb5\x55\x7d\x4c\x55\x65\
+\x18\xff\xbd\xf7\xe3\xdc\x73\x2f\x87\x7b\x41\x50\x2e\x5c\x40\x11\
+\x14\xb4\xf1\x87\x4e\x59\xa6\x9b\x2d\x81\x15\x6c\x64\xba\xb6\xe6\
+\x56\x6b\xb1\x39\x56\xf6\x8f\xf9\x47\xab\xe9\x1c\x73\xb5\xda\x5a\
+\xd6\xfc\x83\xb1\x39\x2b\x8b\xac\xe5\x42\x4c\x25\x2a\x07\x01\x45\
+\x53\x0c\x61\x03\x95\x40\xe4\x1b\x44\xee\xe5\x7e\x9f\x73\xee\x3d\
+\x6f\xcf\x39\x17\xad\x35\x5d\xb0\xd6\xbb\x3d\xf7\xbc\xe7\x7d\x3e\
+\x7e\xcf\xf3\x7b\x9e\xf7\x5c\x86\x65\xac\x58\x07\xb8\xfe\xb4\xec\
+\x00\x5b\xaa\xcf\x92\x0d\xf5\xc5\x7f\x49\x00\xb0\x27\x96\x01\x10\
+\xa7\xac\xcc\xcb\xc8\x68\x39\x2b\xde\x0e\xce\xe4\x36\x70\xdb\xce\
+\xff\x07\x40\x8f\xbd\xac\xc0\xe1\x36\xe9\x34\x62\xc1\x51\xc7\x2e\
+\xbc\xbd\x64\x8a\x96\x6a\xb8\xd0\x82\x37\x93\xb6\x36\xbd\xcb\x95\
+\x39\x84\xaf\xbf\xf2\x92\xab\x1c\xa7\xff\xcd\xc7\xdf\x02\x81\xcd\
+\x5f\xc4\xfb\x9c\xe3\x48\x5a\x25\xa2\x8f\x32\xbc\x77\x11\x55\x8e\
+\xc2\xb7\x1a\xc5\xbc\x1a\x16\x1f\xa8\x86\x6a\xdf\x16\x8f\x0c\xd4\
+\x96\xaf\xa8\xc4\xe5\x47\xf9\x50\xdc\x24\x7a\x34\xb0\x99\x73\xc4\
+\x93\x35\xf9\xba\x16\x0b\x3c\xed\xae\xc2\xf4\x3f\x0d\x49\x5f\x2c\
+\xa4\x6f\xff\x2d\xe5\xf1\x06\x7b\xa2\x5e\x13\xb4\xe1\xa3\x08\x05\
+\x23\x81\xc8\x68\xc3\xe6\x8c\x2a\xfc\xf1\x10\x1f\x8f\xc5\xb5\xa1\
+\x4d\xf5\xdf\xcc\x67\x33\x2d\xf9\xdc\x95\x96\x8a\xb9\x3b\xd7\x46\
+\xc1\xb5\x5d\xd9\x7b\xff\x72\x18\x3f\x8b\x95\x26\xbb\xfb\x77\x77\
+\x79\xa7\x87\x41\x23\x42\xad\x24\x66\x9a\xd7\x38\xb4\xdb\x47\x30\
+\x3f\x35\x34\x11\x9d\xed\xdc\x94\xb3\x17\x77\xef\xfb\x8c\x9d\x45\
+\x31\x98\xe9\xbb\xcc\x8a\x9e\xdc\xd9\x66\x9a\xe7\xf1\x0b\x79\xdc\
+\xb3\xb3\x1e\xca\xd0\x31\x4c\x0f\xf7\x7a\x35\xd9\xfb\x5c\xde\x0b\
+\x68\xbb\x7d\x06\x02\x05\xeb\x70\xef\xa8\xdf\x2a\xba\x77\x01\x5a\
+\x84\x92\xb7\x25\x40\xb8\x4a\xef\x32\x62\x43\x87\x31\x35\xf8\x6b\
+\x67\x3c\x34\xf1\x14\xf9\x28\xc3\x67\x50\x66\xb2\x38\xbe\xcd\xdd\
+\xdd\x97\x84\xe8\x30\x46\x9b\x77\x83\x8d\x9c\x5b\xcd\x73\x77\x7e\
+\x68\xa0\xc7\xc6\xeb\x30\x35\x32\xa2\x46\xbd\xb7\xf6\xd3\x6b\x99\
+\x7b\xf3\xc1\x7d\xc9\x85\xaf\x81\xa9\x73\x80\xd9\x41\x00\xba\x08\
+\x46\x70\x1d\x50\x1b\x79\x07\xaa\xb3\x1c\x63\xad\x07\xbe\xd6\xd4\
+\xd0\x25\x8b\x2d\xa5\x3e\x6f\x4f\xb7\x15\xc1\x1e\x23\xde\x50\xf3\
+\x8b\x60\x83\xdf\x64\xf3\xb5\x4f\x1e\x03\x23\x7e\xa9\xd9\xe0\xd3\
+\x0d\x98\x9e\x51\x90\x94\xb6\x1e\xae\xc7\x0e\x01\x91\x9b\x54\x88\
+\x0b\xf0\x11\x45\xa7\x1a\x80\xaa\xe7\x01\x4f\x2a\x20\x11\x55\x31\
+\x3f\xe2\x63\xc7\x11\x42\x11\x66\x7a\x3f\x45\xc1\x1e\xba\x59\x0b\
+\x3f\x3f\x18\xcd\x1b\x17\x5f\x05\xeb\xff\x32\x93\x17\xb9\x88\x82\
+\x92\x1a\xa2\xf6\xaa\xa1\xd4\xee\x36\xc1\xb4\xf6\x28\x78\x58\x0f\
+\xee\xa4\x8f\x4f\x2a\x58\x6d\x1d\x70\x67\x02\xf8\xaa\x0b\xe8\x6d\
+\x07\x0a\x45\x02\xf0\x11\x5b\x5e\x68\xde\xcb\x30\x79\xf6\x83\x7b\
+\xdb\x8d\xc1\x67\x03\xb3\xa4\x9b\x47\xdf\xe8\x27\x60\xbd\x9f\x65\
+\xf0\xe2\xf3\xc4\x6f\xc9\x1b\xd0\xf6\x51\x74\xfe\xb7\x1b\x62\x4a\
+\x22\xca\x57\x00\x42\x3a\xd8\xa9\x16\xa0\x60\x3b\x50\x5b\x0b\xd8\
+\x24\xf0\xe6\x8f\x28\x08\x51\x47\xf7\x42\x0f\xc6\x63\x41\x24\x68\
+\x20\xb7\x8a\x0f\x80\xad\xc0\xd5\x12\x05\xac\xfb\x64\x3a\xdf\x94\
+\x5a\x04\xa4\xad\x02\x5f\xbd\x26\x81\x90\xb0\x33\xa8\x61\x42\x1a\
+\x01\xb8\xe9\x32\x50\xcf\xbf\xf8\x09\xe8\xee\x03\x0e\x56\x83\x6f\
+\xc9\xa1\xe0\x33\x86\x70\xf5\x1e\x01\x2c\x3c\xc8\x8b\xdd\xa2\x9f\
+\xd0\x15\x74\x8d\x5f\x01\xeb\xaa\x4b\xe5\x5b\x4a\x77\x27\x54\xba\
+\x56\x6f\x04\x65\xc2\xf4\x7e\x58\x53\x08\x60\x15\x98\x2d\x8b\x40\
+\x3c\xc6\x1e\x96\x94\x04\x35\x0a\xd1\xa0\x4c\x82\xcb\x44\x9b\xbe\
+\xa7\x33\x63\xe9\x7e\x8b\xa1\x3a\x9a\x3e\x07\xeb\x38\xe1\xe2\xdb\
+\x4a\x4b\x17\x0f\x13\x5a\xe3\x0b\xa5\x97\x40\xf4\x30\x9b\x9b\x24\
+\x17\x10\x73\xe8\x99\x49\x00\x44\x99\x4a\x94\x28\x53\x40\x74\x8c\
+\x00\x74\x99\x24\x00\x2f\xee\xbb\xdd\xcf\xb3\xb5\xa9\x09\xac\xf5\
+\xb8\xc4\x77\x94\x6d\xa3\x03\x0d\x01\x5f\x10\x41\x7f\x10\xe1\x50\
+\x44\xbf\xa9\x90\x23\x31\xc8\x4a\x1c\x4a\x54\x41\x2c\x26\x43\x8b\
+\xa9\x30\x9b\x05\x98\x05\x07\xac\xa2\x04\xd1\x61\x87\x68\xb7\xc0\
+\x21\x9a\xe0\xa0\x09\x96\x9c\x12\x92\x53\x24\x22\x20\x31\x47\x3f\
+\x36\xb6\x82\xfd\xf0\x9e\xc8\xd7\xe4\x67\x60\x7a\xd2\x07\x99\x02\
+\x49\xc9\x76\x12\x11\x0e\xc9\x06\xd1\xb9\x0a\x76\xe7\x1a\xd8\xa8\
+\x47\x16\xe7\x06\x58\x92\x0b\xa8\x82\x74\xc4\x23\xe3\x50\xfd\xb7\
+\xa0\xf8\xfa\x11\x99\xbf\x81\xb0\x6f\x14\xe1\x85\x39\x84\x02\x51\
+\x58\x05\x33\x9c\x29\x0e\xb8\x3d\x2b\xd0\xf6\x7d\x2f\xd8\xb9\x23\
+\x16\xee\xc9\x76\x22\x23\x4b\x42\x46\xa6\x04\x93\xd1\xa5\xc5\x2e\
+\x0b\x2b\x89\x9a\x3c\x30\xc7\x7a\x92\x75\x60\xb4\x87\xde\x07\xe2\
+\x9c\x47\x6f\xd3\x18\x0f\x1a\x02\x99\xf6\xf2\x0c\x12\x24\x73\xcc\
+\x4e\x06\xa0\xa8\x1a\xae\x5f\x9b\x22\x80\xa3\x16\x5e\x51\x99\x6d\
+\x10\xe7\xf7\xa9\x08\xf8\x15\x04\x82\x2a\x82\xc1\x38\xd1\x63\x21\
+\x61\x50\x64\xa2\x49\x56\xa0\xaa\x8a\x51\xba\x60\x13\x21\x88\x22\
+\xd1\x23\xc0\x26\x98\x48\x54\xd8\x6d\x54\xbd\x64\x85\xd3\x25\xc0\
+\xe5\xb2\x18\x76\x8d\x67\xc7\xc0\x1a\x0f\x9b\x79\x61\x51\x12\x26\
+\x27\x65\x5d\xfa\x29\x81\x7e\x02\xa3\xb4\x30\x4c\x45\x8c\x11\x2e\
+\x75\x13\x73\xd4\x34\x3f\x15\x16\xe1\x89\x49\xb1\xd3\x2f\xdd\x40\
+\xd0\x05\x41\x26\xd9\xe4\xd0\xf9\x5a\x7a\x5f\x47\x36\x1b\xb3\x32\
+\x6d\x1b\xb3\xb2\x04\xf4\xf4\x04\x69\xb4\x0f\xb1\x29\x55\xe1\x8d\
+\xa4\xbc\x40\x72\xe9\xe5\x8f\x11\x5f\xea\x9f\xd0\xc3\xd6\xa9\xd7\
+\x61\x26\xc0\x67\x68\x12\x2b\xcd\x26\x3c\xcb\x4e\x1e\x40\x4d\xf5\
+\x09\xd4\xfd\x97\xa0\x8f\x5a\x7a\xec\x3f\x01\xf5\x8e\x1c\xc3\x86\
+\xe1\xa8\xe5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x5b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x22\x49\x44\x41\x54\x78\xda\xb5\x96\x5d\x68\x9b\x55\
+\x18\xc7\xff\x27\xef\x9b\x8f\x2e\x1f\x4b\x5a\xed\x47\xda\xc4\x45\
+\xd2\xb5\x4b\xbb\xd2\xd2\xe9\xb0\xb8\xe9\xb4\x5d\x45\xb0\xca\x26\
+\x63\x30\x75\x9b\xe2\x95\x28\xc3\x0b\x45\x44\x94\x5d\x88\x17\x22\
+\x1b\x73\xee\x46\x1c\x5e\x88\x7a\x2d\xa2\xe2\x04\x15\xc7\x56\x07\
+\xda\x8e\x76\x5d\x4c\x5b\xb7\xa6\x69\x3e\x9a\xf4\x4d\x9a\xef\x34\
+\xc9\xf1\x39\x39\x75\x22\x7e\xb5\xdd\x3c\xf0\x72\x4e\xce\x79\xce\
+\xf3\x7b\xce\xf3\x7f\xce\xfb\x86\xe1\x7f\x6e\x6c\xad\x86\xd5\x9d\
+\x78\x0a\x41\x9c\xac\xfd\x70\xe1\x51\xdd\x28\xbe\xbf\x65\x80\xf2\
+\x10\x0c\x08\xd4\x67\x15\xc5\xa8\xa2\x0a\x54\xb4\xd8\x9c\x9a\xac\
+\xdc\x71\xcb\x00\xc5\x1e\xbc\xa6\x67\xdb\x8e\xb3\x57\x8e\x01\xb9\
+\x2c\xaa\xef\xbd\x8f\x32\xbb\x32\x64\xbc\x84\x73\x37\x0d\x28\x3c\
+\x08\x95\x4f\x5a\x73\xa6\x83\xfb\xf5\x70\xbb\x68\x07\x6d\x39\xfb\
+\x31\x72\xa1\xd9\xa0\x39\x51\x71\xdf\x34\x20\xd3\xcb\x5e\xae\x53\
+\x7d\x6f\xe9\x9e\x3e\x04\x2c\x25\x00\x47\x3d\x60\xb5\xa1\x7c\xea\
+\x34\x8a\xf0\xef\xb1\x5c\xe2\xdf\x6e\x18\xb0\x3c\xc4\x74\xfc\xb2\
+\x29\x6f\x1b\x1c\x34\xa0\xb3\x5d\x46\x6f\xb3\x01\x8a\x0a\x9c\x38\
+\x03\x6d\x29\x14\xae\x4f\x70\xe7\x86\x01\x4b\xfd\xec\x39\xab\xae\
+\xeb\x5d\xf5\xc0\x08\xd1\x96\x81\xe3\xa7\xe4\xc2\xeb\x2f\x90\xf2\
+\x65\x94\xbe\x3a\x87\x8c\x3a\x7d\x7f\xc3\x28\xff\x6e\xdd\x80\xc4\
+\x20\x63\xe5\xcb\x6a\xae\xb1\xa7\xcf\x84\x87\x86\x80\x74\x1a\x78\
+\x43\x56\x29\x5e\x7a\x96\x94\x2f\x01\x9f\x7d\x83\x58\x6e\x21\xd4\
+\x14\xe5\x6d\xeb\x06\x44\x77\xb0\xa3\x9b\xd5\xee\x0f\x8c\x4f\x1e\
+\xa4\xe8\x53\xe4\xb0\x48\x91\x9f\x90\x8b\xcf\xec\xbf\x61\x97\x1f\
+\x1b\x47\x52\x3f\xbb\xcb\x39\xca\x7f\x58\x17\x20\xd8\xa4\xa4\xdb\
+\x9c\x77\x5a\x70\xe4\x90\x74\x5e\xa2\x88\x5f\x7d\x5b\x2e\x1e\x7e\
+\x4c\xce\x95\x2b\xc0\xcf\x53\x98\x2f\x84\xe6\x5d\x0b\xdc\xb5\x66\
+\x40\xf0\x6e\x76\xc0\x51\xed\xf8\xd4\xbc\xef\x11\x0a\x31\x0f\xa8\
+\x24\x6a\xa1\x00\xbc\x79\x46\x1a\x3c\xbe\xb7\xa6\x01\xe6\x23\x40\
+\x9d\x09\xd9\x9c\x86\xb8\xf1\xfa\xce\x2d\x17\xf8\x8f\x6b\x02\x04\
+\x5a\x58\xca\xab\x6f\xb6\xe1\x09\x8a\xd4\x64\xa2\xcb\x95\xa3\x34\
+\x91\x06\xa7\x3f\x92\x06\xbb\xfb\x69\x8e\xc0\x55\x4e\xeb\x06\x60\
+\x21\x8e\x99\x6a\xf8\x9a\x37\xc8\x3d\xff\x09\x98\xbd\x87\x0d\x3b\
+\xf2\x9e\x2f\xed\x0f\x0f\xcb\x34\x28\x0a\x45\x4f\x7d\x34\x06\x7c\
+\xf2\x85\x34\xea\xed\x00\x56\xe8\x04\x3a\x1d\x60\xd0\x03\x9c\x23\
+\x5d\xc9\x20\xba\x29\xd4\xdb\x7e\x91\x8f\xff\x2b\x60\xca\xc5\xa2\
+\x1d\x06\x57\x23\x1b\x79\x40\x46\x9f\xc9\x02\x29\x2a\xd1\x85\x28\
+\xf0\xf5\x05\x69\xe4\x75\x49\xc7\x7a\x55\x42\x44\x45\xa5\x73\xf0\
+\xab\xb1\x99\xce\x6b\xdc\xfb\x8f\x80\xc0\x00\x1b\xb0\x69\xad\xe7\
+\x1b\xf7\xae\x3a\x17\x8e\x45\x2a\x62\x71\x20\xbc\x08\x8c\xf9\xa5\
+\x61\x53\x03\xe9\x42\x27\x53\x74\x35\x0d\x50\xa9\xd4\x4e\x91\x34\
+\x57\x11\x31\x47\xb6\x6f\xbb\xc8\x27\xfe\x16\x30\xe1\x61\xd7\x7d\
+\x75\x1e\x37\x1b\xde\x4d\xb7\x2c\x29\xa3\x8f\xd1\xeb\x41\x5b\x96\
+\x00\x51\x35\x15\x7a\x9d\x56\xab\xab\xbb\x99\x7c\x84\xe0\x02\xb4\
+\xd9\x82\x49\x5d\x78\xaa\x7b\x96\xfb\xfe\x02\xf8\xe5\x5e\xd6\x67\
+\x0c\xdf\xfe\x93\x7b\xdf\x88\x8c\x38\xba\x28\x9d\xc6\x96\x08\x44\
+\x22\x93\x9e\x22\xca\x9a\xa8\xa2\x17\x2d\x93\x97\x63\x91\x26\xd1\
+\x36\x99\xa0\xb9\xcc\x08\xd7\x45\xda\xbb\x46\xf9\xf4\x9f\x00\x93\
+\x5e\xe6\xef\xb4\xb4\x6f\xd5\x0d\xec\x20\xc7\x94\xef\x99\x39\x2a\
+\x43\xea\x4b\x65\x99\x0a\x9b\x19\x98\x8b\x48\xe3\x3d\x77\x51\xce\
+\xb3\x12\x90\xa2\xea\xca\x17\xe5\xbc\x00\x89\x53\xa8\xe1\xb1\xee\
+\x69\xde\x77\x03\x10\xe8\x67\xcf\x1b\x17\xed\x27\x5d\xf7\xed\x62\
+\x35\xc1\xe6\xc3\xc0\xaf\x21\x20\x4b\x0e\x4c\x46\xc0\xd3\x0a\x34\
+\xd8\x81\xcf\x57\x3f\x62\xc7\x0e\x53\xda\xe8\x76\x27\x34\x20\x14\
+\x95\x29\x2c\xd0\xbe\xd2\x0a\x41\x18\xd2\x2d\x66\x04\x95\xf0\x91\
+\xae\x71\xfe\x61\x0d\x30\xe1\x64\x9a\xaf\xd9\x67\x67\x3d\x5b\x65\
+\xbd\x8b\xe8\x73\x05\x99\x5f\x77\x0b\x01\xa8\x6a\x5a\xe9\xa5\x69\
+\xb7\xcb\xb9\x24\xe9\x13\x5b\x94\x69\x14\x97\x6d\x39\x43\xe3\xc4\
+\x1f\x62\x3a\xec\xb8\x92\x9e\x4b\x76\x45\xb9\x43\x02\x5a\x98\xd6\
+\xe9\xee\xb1\x2b\x22\x22\x51\x82\xc2\x58\x54\xc6\x6d\x0e\xa0\x8d\
+\x00\x6d\xe4\xbc\x8d\xe6\x2d\x56\xc0\x6c\x01\xe2\x74\x27\xa6\x03\
+\x24\xdc\x0c\x15\x43\x4a\xea\x14\xd7\x24\x9c\x8a\xa0\xe2\x71\xe2\
+\x6a\xc8\x9f\xec\xfe\x1d\x70\xb5\x9f\xbd\x93\x0f\xe3\x68\xb1\xc4\
+\x4c\x05\x0d\xa6\xb2\x28\x0c\xca\x1e\x65\x1f\x62\x2c\x6a\x46\x8c\
+\x45\xaf\xac\x3e\x42\x56\x95\xf4\x55\x69\x5d\x2f\x7a\x12\x5b\xa5\
+\x3d\x06\x2b\x5f\xd1\x1b\x79\x56\x69\xc6\xd9\xed\xe3\xfc\xc5\x35\
+\xff\xab\xd8\x68\xfb\x0d\x33\x83\xad\x28\x41\xbf\x52\xed\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xac\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x73\x49\x44\x41\x54\x78\xda\xb5\x94\x6b\x48\x53\x61\
+\x18\x80\xdf\x6f\xd3\x4d\xe7\x2e\xd6\x2c\x8c\x2e\xb6\xf0\x46\x33\
+\xa7\x2b\xdb\xd6\xa6\xd3\x6a\xd6\xaf\xa0\xa0\x82\x7e\x04\x46\x10\
+\x51\xfd\x29\x32\x2c\xa8\x1f\x41\x50\x50\x41\x45\x41\x3f\xfc\x13\
+\x11\xb5\x4a\x53\xc3\x64\xe5\x75\xea\x9c\x97\xb4\x95\x68\x96\x99\
+\x97\xd2\x12\x5d\xdb\xda\xd9\xa6\x9d\xd3\x77\x8e\x3b\x73\xd6\xba\
+\xaa\x2f\x1b\xdf\x77\xce\x79\xbf\xe7\x79\xbf\xc3\x77\x5e\x04\xf3\
+\x18\x9e\x3a\xb8\x88\xe6\x0b\xee\x6d\x4f\x28\xa7\x9c\x3d\x39\xf3\
+\x22\xf0\xb4\x25\x54\xf0\xe4\x05\xb9\x1e\xcb\x3e\x98\x73\xc1\xd7\
+\x96\x78\x53\xe4\x9a\x93\x9b\x11\x2f\x11\xbe\x56\xe9\xe6\x56\xe0\
+\xb4\xc6\x9b\xa2\x14\x53\x70\x80\x4f\xe0\x78\xb6\x63\xee\x04\x5f\
+\x1a\x57\x55\x0a\xd3\x4e\xe4\x70\xf8\x49\x40\xc1\x08\x20\x0a\x60\
+\xdc\xb4\x7b\x6e\x04\x63\x75\xb2\x4a\xb1\xf2\x58\x0e\x97\x9f\x8c\
+\xaf\x86\xf1\x9f\x62\xee\x8f\x56\xec\x9d\xbd\x60\xb4\x5a\x56\xbd\
+\x40\x79\x58\xcf\x89\x5c\x0d\x14\x39\x04\x08\xf9\xf9\x78\x1c\x7e\
+\xb2\x7f\x76\x82\x91\xa7\x71\xd5\xd2\xb5\x07\xf4\x5c\x81\x1c\x80\
+\x1c\x00\x92\xfc\x06\x88\xc3\x0d\x40\xfb\x4a\x8e\xfc\xbf\x60\xe8\
+\xc9\x72\xf3\xe2\x8c\x3c\x6d\x58\x54\x0a\xc0\xe4\x7b\xf8\x36\xe1\
+\x86\xf1\xce\x32\x88\x51\xec\x62\x37\x00\x7d\x8f\xf3\xff\x4f\xd0\
+\x5f\xba\xd4\xbc\x44\xb5\x07\xc3\x15\x40\x4d\xf6\x02\xe9\x73\xc1\
+\x87\xa6\xdb\xc3\x14\x39\x19\xbb\x42\x7f\x88\xc9\xa1\x25\x6f\xcb\
+\xce\xfc\xbb\xa0\xb7\x38\xb6\x61\x99\x6a\xa7\x26\x5c\x98\x06\x94\
+\xaf\x07\x48\x5c\xf9\x40\xd3\xfd\x01\xcf\xf8\xc7\xad\x7c\xf1\xa2\
+\x57\x2b\xb3\xf3\xfc\xf5\x03\x74\x95\x9c\xff\x37\x41\x8f\x71\xb1\
+\x25\x4e\xbd\x4d\x15\x26\x4a\x07\x98\xe8\x86\x49\x2f\x01\x7d\x0d\
+\xc5\x83\x5e\xc7\xa8\x1a\x57\xec\x8a\x10\x4b\xed\x09\xd9\x7b\x80\
+\x39\xa3\x38\x5e\x3e\xba\xf6\xf7\x82\xae\x3b\x31\x56\x99\x3a\x37\
+\x83\x27\x5e\x8b\x2b\xef\x84\x09\x0f\x01\xef\x1a\x2b\x06\xdd\x5f\
+\xc6\xb4\xca\x83\x54\x7f\xdb\x0d\x8e\x24\x52\x1c\x6d\x4f\xda\xb4\
+\x9d\xe1\xd3\x8a\x8e\xe2\xc2\xbf\x13\xbc\xbc\x25\x6d\x4e\xd0\x64\
+\xad\x0b\x97\x64\xe0\x2e\x66\x63\xe0\xaf\xcd\x35\x1f\x09\xa7\x5d\
+\xbd\xfe\x08\xd5\x4f\xe7\x58\xaf\x22\x46\x20\xdf\xb4\x25\xf0\x8a\
+\x5a\x8a\xee\xfe\x59\xd0\x51\x18\xdd\x9a\xac\x5d\xaf\x0c\x97\xa8\
+\xe9\x16\x09\x5e\xb7\x07\xba\xea\x2d\x23\x6e\x87\x53\xa3\x3d\x4a\
+\xbd\x63\xf3\x1a\x2e\x23\x89\x40\x24\xb2\xaf\x31\x64\xb3\x6f\x08\
+\x2c\x0f\x4b\x7f\x2f\x68\xbd\x29\x6e\x97\x6b\x15\x0a\xde\x42\x0d\
+\x80\xbb\x15\x7c\x84\x17\x6c\x75\xcf\x47\x08\x27\xa1\xcb\xca\x27\
+\xdf\x04\xe7\xd6\x5e\x40\x92\x28\x89\xd0\x9e\x6e\x50\x4d\x9d\x21\
+\xfc\x33\x3f\xa8\xfa\xb5\xc0\x7a\x5d\xd8\x9e\xaa\x4b\xc6\x70\x2d\
+\x50\x6e\x2b\x78\x09\x1f\x74\xd4\x76\x0e\x13\x2e\x6f\xe6\xc6\x82\
+\x99\x70\x3a\x2a\xcf\xd1\x02\x81\x7d\x9d\x21\x15\xd8\x8f\xb9\xe6\
+\xbe\x25\xb4\xa0\xf1\x8a\xc0\x96\x96\x29\x4b\xe1\x4b\x75\xb8\xff\
+\x5a\x80\x70\x4f\x40\x5b\x6d\xef\x67\xc2\xe9\xcb\xcc\x3d\x4d\x76\
+\x87\x5a\x63\x3a\x4b\x0b\x22\xec\x2a\x43\x22\x73\x4d\x83\x9f\x1a\
+\x6d\x3f\x0b\xea\x2f\x45\xda\xd2\xb3\x96\xa4\x44\xc4\xe8\xf1\xc1\
+\x33\x83\xc7\x43\x42\x73\xd5\x20\xb8\x5d\x3e\x9c\x8c\xfc\x6d\x8c\
+\x3e\x89\x14\x50\x68\xe6\x72\xa1\x84\x07\x1b\x72\x97\x33\x79\x74\
+\x54\x18\xdf\x4c\x0b\xca\x4e\x71\xb8\xa2\x05\xe1\x2f\x32\x32\xa5\
+\xab\x23\x16\x65\xe3\xe6\x5e\xc7\x94\xc1\x02\xa7\x27\x10\xa8\x30\
+\x38\xd8\xf6\x10\x3c\x96\x1b\x87\xa6\xf2\x4a\x0a\x30\x3c\x3a\xec\
+\x85\x2a\x4b\x84\xe1\x39\x18\x5e\x33\xc5\xa3\x7e\x26\x31\x67\x1c\
+\x4d\x43\x42\x3e\xf3\x8f\x65\xf7\x46\x01\x15\xe5\x73\xb8\x3c\x1e\
+\xea\x48\x57\xf1\xe5\xb1\x49\x06\x00\x47\xd5\xcc\xca\xfc\x24\x14\
+\x98\xfb\xad\x28\xa8\x74\xff\x96\xd8\x0f\x8c\x8d\x12\xa3\x0b\xd0\
+\x83\xe3\x1c\x1b\xbe\x9b\x12\xd8\x77\xf0\x1e\xd9\x55\xa1\xde\xc5\
+\x0f\xf0\x90\x73\x1c\xdf\x01\xe9\xdf\x61\x49\x4f\xad\x48\xc0\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x77\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x3e\x49\x44\x41\x54\x78\xda\x9d\x55\x6b\x6c\x14\x55\
+\x14\x3e\x77\xf6\xd5\xed\x76\x29\x94\x0a\xdd\x62\x81\x42\x2d\x15\
+\x0b\x2c\x2b\x28\x04\x85\x22\x28\x50\xc3\xf2\xb0\x14\xa2\x14\xaa\
+\x20\x62\x54\x1e\x89\x28\xd1\x44\xfd\x61\x0c\x15\x42\x91\x98\xc0\
+\x0f\x25\x1a\x7f\x99\x68\x02\x68\x0a\x28\x50\x10\x23\xe1\x61\xd3\
+\x07\x76\xdb\x6e\x1f\xb2\xd9\xbe\xbb\xb0\xbb\xb3\xcf\x99\x3b\x73\
+\x3d\x33\xfb\xc0\x21\x10\x92\xde\xbb\xb3\xbb\xf7\x66\xee\xf7\x9d\
+\xf3\x9d\xc7\x25\xf0\x90\xb1\xed\x9f\x79\x56\x19\x24\x87\x89\x64\
+\xae\xcd\xd0\x65\x96\x1b\x39\x73\x61\x8e\x71\x02\x91\x64\x09\x06\
+\x42\xbd\x4c\x90\x84\x9e\x60\x94\xaf\x0b\xc7\xc3\xa7\x40\x22\x8d\
+\xa7\x97\xb9\xfc\x0f\xc2\x21\x0f\xda\xdc\x7a\xcb\xbe\xca\xa2\xb3\
+\xee\x9e\x66\x9d\xb9\xa2\xd0\x3a\x03\x0a\x2c\xd3\x20\x4b\x97\x0d\
+\x52\x72\x72\x78\xcc\x4f\x47\xe0\x76\xa0\x0b\xdc\x23\x6d\xe0\x1a\
+\x6c\xbd\xec\x0f\x07\x6a\x7e\x2f\xef\x3e\xf3\x48\x82\xad\x2d\x8e\
+\x9a\x22\xeb\xcc\xbd\x0b\x1f\x5b\x6e\xb0\x65\x4e\x01\xca\x24\x88\
+\xd0\x08\xa0\xc5\x20\x31\x0a\x32\x93\x41\x26\x32\xe8\x08\x01\xbd\
+\x4e\x0f\x3a\x1d\x40\x3f\xef\x85\xcb\x9d\x17\xc5\xd6\x3e\x57\xed\
+\x45\x67\xf7\x87\x0f\x25\xa8\x6e\x7e\xfa\xd8\xec\x9c\x05\x3b\x5f\
+\xb0\x39\x71\xc5\x41\x20\xce\x03\x95\x69\x1a\x58\xfd\x05\x86\x8f\
+\x84\x6b\xf4\x05\x1f\xc0\xb5\xd9\x98\x01\x06\x23\x83\x0b\xad\xe7\
+\xe1\x5a\xd7\xf5\xe3\x97\xd6\x77\xbf\xad\x21\xd8\x7c\xd3\x81\x5e\
+\x4b\x07\xe6\x4e\x58\xb4\xef\xc5\xc7\xd7\x00\x2f\xc4\x01\xb5\x45\
+\x20\x39\x01\x8c\x33\x4f\x3f\x19\xa6\x1a\x4b\xd4\x43\xee\x78\x0b\
+\x78\xe2\x1d\x2a\x11\x30\x02\x14\xa7\x20\xc7\x60\x8c\xc5\x04\x57\
+\xda\x2e\xc3\xf5\xb6\xc6\x83\x32\x65\xfb\x6f\x6c\xf5\xca\x2a\x41\
+\xe5\xb5\x99\x2b\x4a\x72\x66\xff\xbc\xae\x68\x8b\x25\x1c\x8b\x43\
+\x30\x1e\x01\x96\x04\x4e\x10\x50\x58\x3f\xee\x4d\x8d\x94\x3f\x0c\
+\x1f\x46\xeb\x08\x04\x25\x3f\x0c\x8b\xfd\xe0\xa3\xc3\x10\x97\xa2\
+\x60\xcb\xce\x01\x97\xab\x33\xdc\xee\xf6\x56\x34\x6d\xef\x3f\x4b\
+\x2a\xaf\xce\x1a\x63\x36\x98\xcf\x6e\x2a\xd9\xb1\x70\x9c\x31\x0f\
+\x06\x43\x3e\x3c\x9e\xb4\x1c\x25\x50\xbc\x50\xa4\xd9\x94\xfb\x8e\
+\x86\xe0\xc4\xc0\x97\xd0\x27\x78\xd0\x93\x4e\x08\xd1\x20\x52\x71\
+\xea\xbe\xd1\x60\x00\x2b\x31\x41\xc3\xf5\x8e\x7a\x9e\x8f\x3a\xc9\
+\xba\x2b\x4f\x2e\x71\xd8\x9e\xbd\xb4\xb2\xb0\x02\xfa\x02\x3e\x0c\
+\xa6\x88\xaa\x22\xb0\x7c\xcf\x03\xe5\xdf\x96\x89\x7b\x34\x04\x1f\
+\x77\x6f\x87\x9e\x58\xbb\x6a\x04\x87\x32\x31\xc6\xf0\x1c\xe0\x9a\
+\xc1\xb8\x2c\x0b\x0c\x77\xdd\x61\x9d\xee\xde\x32\xb2\xf1\xcf\xb9\
+\xb5\xab\x67\x6c\xd8\x93\x9f\x59\x04\x83\xbc\x0f\x25\x65\xf7\x82\
+\x9a\x92\x08\xd7\x3b\xf2\xf7\x6b\x08\x2a\x9a\x17\x80\x02\x49\x14\
+\x70\x25\xd4\x8c\xa9\xfb\xca\x37\xe1\x30\xc3\x22\x0c\xdc\x2d\xbd\
+\x47\x48\xf5\xd5\xe7\xda\xab\xec\x6f\x15\xdf\x0d\xc7\x20\x2c\x44\
+\x13\x39\x92\xce\x9a\x44\xb6\x60\x1e\xc1\x7b\x05\x9f\x68\x08\x9c\
+\x0d\xf3\xd4\x18\xa4\x2c\x4f\x11\x28\x43\x42\xef\xc7\x98\xcc\xd0\
+\x7e\xd3\xd3\x41\x5e\xff\x6b\xb1\xf0\xc6\xfc\x5d\x86\xf6\x01\x8f\
+\xaa\x77\xa1\xf9\x09\x58\x3e\xde\x09\xa3\x19\x9f\xbb\xf7\xc1\x1f\
+\xbe\xdf\xd0\x28\x4c\xdd\x0c\x23\x74\x5e\xf3\x8a\xe4\x83\xa6\x4a\
+\xfa\x52\xf1\x1a\x9d\xab\xff\x5f\xd5\xb5\xb5\x13\x5f\x85\x49\x19\
+\x53\x46\x45\xd0\x14\xb8\x01\xbb\x5b\xaa\xd5\xdc\x97\x51\xea\xe8\
+\xed\xa8\x44\xde\x6f\xa8\xa0\x65\xc5\xab\x74\x6d\xfd\x1e\x24\x00\
+\xd8\x60\xab\x86\x02\xf3\xd4\x51\x11\x34\x22\xc1\xbb\x8d\x55\x89\
+\x02\x43\x63\x87\xdb\xfc\x12\xd9\x5c\xff\xbc\xb0\xf1\x99\x2d\x86\
+\x26\x4f\x17\x70\x58\xf6\xc5\x96\x52\x78\x25\xff\xb5\x51\x11\x7c\
+\x74\x6b\x17\x5c\x18\x3a\xa3\x04\x04\x40\xcf\xc1\xc0\xdf\x23\x22\
+\x59\x53\xe7\x68\x5f\x3f\x7f\x63\x71\xf7\xd0\x30\x66\x90\x9c\x6e\
+\x01\x4a\xd7\xa4\x18\x6c\x25\xe8\x4a\xbb\x38\x6a\xff\x4e\x03\x36\
+\xef\xfc\xf4\x74\xd6\x40\x32\xd0\xe9\x5f\xec\x53\x92\x28\xc1\x48\
+\x73\xa0\x83\x2c\xf9\xb1\xa8\x76\xe9\xac\x65\x7b\xf4\x86\xb1\x10\
+\x8c\xf0\x6a\xea\x29\xc0\x0a\x81\x32\x19\x92\xf5\x46\xbd\x70\x72\
+\x51\xbd\x86\x60\xce\xb9\xa9\x09\x4b\x93\x24\x4a\x16\xa9\xda\x2b\
+\xf8\xa8\x44\x74\x48\x80\x80\x3b\x74\x84\xd8\x4f\xe4\x2d\xb6\x4f\
+\x9b\x7d\xa9\x64\xb2\x83\x0c\xf8\x7d\xc9\xca\x4d\xe4\x7f\x4c\x8a\
+\xc1\x40\xac\x0f\xbc\x11\x0f\x34\xaf\xbc\xad\x21\x28\xad\x2b\x48\
+\x80\x29\xa0\xa9\x14\x4d\x79\x80\xb1\x0c\x76\x84\x59\x6c\x48\x28\
+\x23\x73\xbe\xb1\x65\x59\x4c\x99\xa7\xed\x4f\xd9\x97\xf2\xa2\xac\
+\x9a\x20\xa2\x24\x21\x91\x07\x9f\x30\x02\x77\x04\x1f\xbe\xcf\x41\
+\xeb\xcb\x5e\x0d\xc1\x8c\x5f\xf2\xd3\x35\x90\x02\x4f\x59\x2f\x06\
+\x28\x04\x5d\x91\x7a\xdc\x70\xaa\xcd\xae\xe4\xeb\xdc\x95\xf9\x93\
+\x72\x7f\xa2\x39\x9c\xc5\x1f\x8a\xa9\x71\x50\xee\x00\x2c\x52\xd0\
+\xe1\x54\x86\xdb\xd9\xaf\x21\x28\x3c\x39\x51\x63\xb5\x5a\x68\xf8\
+\x3e\x3a\x0e\xe1\x8e\x68\x58\xb8\x43\x2b\x42\x87\xe2\x67\x55\x82\
+\xd2\x63\x79\x1c\x15\xa4\x03\xd9\xb6\xac\x7d\x77\xcd\x31\x10\x28\
+\x85\x94\x69\x2c\x29\x43\x79\xfe\x6a\xa8\x9a\xbe\x4d\xdd\xf8\xbe\
+\xfb\x5b\xf8\xd5\x7b\x4a\x1b\x83\xe4\x81\x68\x4f\x1c\x84\x41\x7a\
+\x50\xa7\xe7\xf6\x07\x6b\x62\xb2\xe6\xc2\x99\x7e\x68\xfc\x31\x6b\
+\x9e\x65\x67\xd0\x82\x24\x28\x13\x63\x44\x05\x67\xf7\x67\x09\x68\
+\x7b\x8f\xda\x48\x29\xc6\xcc\x43\x41\x1c\xa4\xc7\x23\x87\x05\xed\
+\x85\xf3\xff\x51\xf0\x45\x76\x8d\xde\xaa\xdf\x2b\x8c\x95\x0d\xd4\
+\x94\xb0\x4d\xfd\xb0\xfb\x08\x94\x7f\x5c\xa2\x17\xc9\xbc\x0c\x62\
+\x1f\x15\xa5\xbb\x72\x6d\xf4\x88\xf8\xf0\x2b\x33\x35\xf2\x3e\xb3\
+\xae\x92\x39\xb6\x9b\x59\x60\x05\x3e\xc0\x32\xf1\x31\xa6\xb9\x12\
+\x5a\xc7\x31\xdf\x78\xa4\xf1\x63\x9d\xf8\xe5\x73\x4c\x80\xaf\x62\
+\x47\xc5\x47\x5f\xfa\xa9\x31\xe1\xd3\x2c\xab\x44\x65\x07\xf6\x94\
+\xb5\x8c\x83\x72\xbc\x8b\x0b\x99\x09\xbb\xb3\xc2\x10\xc5\xfb\x4e\
+\x92\x7b\x98\x08\x75\x58\x32\x27\xb1\xae\x1a\xd0\x72\xfe\x41\x38\
+\xff\x01\x1d\x84\x05\xec\x91\xb4\x3b\xed\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xc5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x8c\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x6c\x54\x45\
+\x14\x3e\x33\xf7\xde\x76\xef\x3e\xda\x05\xb6\x2d\xad\x25\x54\x96\
+\xba\x14\x88\x55\x43\xb0\x68\x9a\x10\x7f\xa8\x91\x28\x56\x24\x8d\
+\x10\x4c\x88\x51\x9a\x6a\xe4\x91\x18\xa9\x21\x62\x23\x11\x94\x04\
+\x50\x91\x14\xf9\x41\x0c\x69\x2b\x8f\x6e\x0d\x31\xc4\x90\xd8\x60\
+\x88\x8a\x24\xfe\x50\x08\xb4\x90\x05\xa1\xf4\x05\xdd\x6e\xf7\xd1\
+\xbd\xbb\xf7\x35\x9e\x99\xbb\xbb\x48\xa0\x32\xed\xc9\xb9\x7b\x3b\
+\x3d\xdf\x39\xdf\x9c\xf3\xcd\x12\xf8\x9f\x95\x08\xcb\x0d\xc0\x60\
+\x39\x10\x58\x8a\x7e\x21\xbe\x9a\x93\xfb\xd3\x20\xda\x25\xb4\xf3\
+\x68\x67\x4a\x56\x99\xe7\xa6\x8b\x41\x1e\xf4\x32\xd5\x2b\x37\xa2\
+\x5b\x4b\x8a\x3c\x6b\xa8\x67\xa6\x8f\xba\x67\x00\x71\x79\x01\xe4\
+\x22\x00\xc6\x80\xe9\x69\x60\x5a\x5c\x98\xad\xc5\x93\xcc\xc8\x74\
+\xe1\xfe\x4e\x6f\x93\x79\xf6\xa1\x00\x89\x1e\xb9\x95\x28\xae\x2d\
+\xb2\xbf\x2a\x28\x07\x66\x03\xf1\xb8\x81\x50\x1b\x77\x9a\x40\x18\
+\xc6\xb7\xf1\xd9\x04\xb0\x2d\xdc\xac\x33\x04\x48\x81\x99\x18\x03\
+\x3b\x19\x8d\x30\xcb\xd8\x83\xd5\x1c\x98\x16\x60\xf2\xb8\xdc\x46\
+\xdd\xa5\xed\x4a\x79\x8d\x52\x54\x5e\x06\x44\xc1\x88\x44\x06\xa0\
+\xb9\x6d\xcc\xc2\x02\x30\xba\x85\x66\xe2\xb3\x61\x83\x6d\xe0\x9e\
+\xac\x0d\x46\x72\x1c\xcc\xc9\x51\xc3\xce\x6a\xdb\x67\xac\x36\x77\
+\xde\x07\x10\x3d\x2a\xb5\x52\xb5\x74\x9f\x5a\x5d\xab\x28\x65\x7e\
+\x00\x45\xc1\xc0\x0a\x66\x8f\x1e\x28\x8f\x8e\xbf\x86\x63\xb6\x8e\
+\x58\x59\x00\xc3\xc4\x47\x0e\x62\x03\x43\x10\x2b\x35\x09\x46\x74\
+\xc4\x30\xf5\xf4\xa6\x40\xb3\x75\xa0\x00\x70\xbb\x4b\x6e\xa4\x4a\
+\xd1\x61\xb5\x3a\x14\x2c\xae\x2c\x03\xea\xc2\xac\x25\x37\xc6\x2d\
+\x86\xa6\x15\x5d\x85\x0a\x7b\x4f\xad\x15\xbe\xe9\xa5\xce\xc2\xbb\
+\xf0\x89\x46\xc4\x44\x40\xac\xc4\x8e\x9b\xa0\xc7\xc7\x21\x13\x1d\
+\x8b\xd8\x96\xb1\xbe\x62\x8d\x75\x56\x00\x0c\x1f\x91\x3a\xdc\x15\
+\x73\x37\x78\x6a\xe6\x01\xf5\x62\xb6\xb2\x07\x88\xa4\x62\xf0\x6e\
+\xf8\xe1\x77\x1b\x8e\xfc\xe5\x04\xeb\x69\xa1\xc2\xaf\xea\xb0\x85\
+\x5f\x57\x0f\xf0\xea\x32\x0a\xe1\x63\x4f\x63\x35\x36\x52\x84\x95\
+\xe8\x59\x48\x8f\x8f\x40\x26\x16\x3b\x58\xf5\xa6\xd5\x42\x06\x0f\
+\x4b\x0d\xb2\x4b\x3d\xed\xaf\x5d\xe4\x53\x66\x79\x81\xa8\x45\x48\
+\x8b\x07\x9a\x5e\xe9\x81\xcf\x0f\xfd\x06\xe7\xad\x86\x42\xa0\xb2\
+\xc7\x96\x8b\xc0\x87\xbe\xeb\x13\x9f\x39\xd0\x52\xe9\x1c\x7c\xf8\
+\xf6\x33\x10\xee\x5e\x82\x00\x78\x2e\x59\x0b\xac\xa9\x04\x4c\x8e\
+\x0c\x27\x2d\xc3\x7c\x9e\x5c\x3b\x24\x6d\xf5\x96\x57\xec\xf4\xcf\
+\x0b\x81\x54\x8a\x9c\x15\xa9\x48\x0f\x02\xbc\x7c\xa2\x90\x7d\x3e\
+\xf3\x3c\xc0\x9d\x2b\x67\x0a\x95\x14\xaa\xf8\xfe\x29\xb0\x10\xc0\
+\xce\xf2\x36\xd6\x20\x31\x32\x0a\xe9\xf8\x54\x1b\xb9\xd2\x21\x85\
+\x03\xc1\x60\x93\x77\x76\x15\x50\x3f\xc5\x73\x2d\x46\xee\x9d\x0a\
+\x38\x00\x5f\x79\x8a\x06\xbe\x7d\x4e\xf8\xd0\x3b\x7d\x05\x8a\xf8\
+\x12\x00\x5d\xf5\x60\x25\xf0\x1c\xb0\x02\x4e\xd3\x54\x34\x06\x13\
+\xa3\x13\xbd\xe4\xd2\x7e\xa9\xbf\xba\x7e\x61\xc8\xe5\xf7\x83\xe4\
+\x25\x58\x81\x0b\xcf\x00\xf9\x5f\x79\x52\x50\x14\x5a\xdc\x50\x38\
+\xd0\x6d\xef\x3a\x00\x3b\xbe\xe9\x2b\xbc\x1b\xb8\xe8\x50\xd4\xd3\
+\xf5\x38\x58\x71\x5b\x50\xc4\x0f\x5d\x4f\xa6\x60\xe8\xda\x9d\x01\
+\xf2\xf7\x5e\x3a\x35\x7f\x59\xbd\x5b\x72\xbb\x40\x52\x25\x9c\x58\
+\x6c\x4d\x05\x69\xa2\x2e\xac\xa2\xf7\x9e\x21\xec\x3d\xb5\x2e\xd7\
+\x45\x47\xee\x79\x1f\x3e\xf6\x04\x66\x6d\x62\x05\x96\x68\x57\x0e\
+\x60\x69\x19\xb8\x76\x79\x34\x4d\xfe\xdc\x4d\xa7\xea\x9e\x5d\x8c\
+\x00\x2a\x50\x15\x29\x2a\x96\x71\xb6\x50\x12\xe4\x62\x60\xd8\xa6\
+\x84\xf0\x79\xc8\xcd\x01\x1f\x5f\x86\x2d\xc9\xb2\x40\x6c\x0d\x67\
+\x41\xc3\xee\xc9\x60\x40\x1e\x98\xd3\x63\x0b\x63\x86\x01\x56\x46\
+\x83\xab\x17\xee\xa4\xc9\x1f\xbb\x68\xff\x82\x25\xc1\x50\x71\x69\
+\xa9\x03\xe0\xa2\x58\x41\x0e\x04\x87\x8c\x51\x7c\x26\x94\x4b\x10\
+\x70\x8d\x20\xb6\xe1\x80\xd8\x19\x9c\x68\x3e\x6c\x06\x7e\xc4\xc0\
+\xba\x03\x00\x08\x66\xeb\x06\xa4\x13\x69\x88\xf4\xc7\x06\xc8\xaf\
+\x3b\x68\xb8\xa6\x6e\x76\xd3\xac\xea\x00\xf2\xaf\xf0\xd9\x42\x8f\
+\x54\x29\x68\x92\x84\x20\x12\xe6\x9e\xab\x00\x30\x00\x07\x00\x34\
+\x53\x47\x00\xcc\xdc\x34\x9d\xec\x75\x5b\x00\xb1\x1c\x40\x74\x2c\
+\x05\x83\xd7\x93\xbd\xe4\x97\x4f\xe8\xd6\xf2\x47\x4a\x76\xd6\x2c\
+\xaa\x74\x32\xc7\xe0\x54\xe1\x87\x8d\x26\x51\xf8\xf8\xd3\x2b\x70\
+\xf1\x52\xf2\x81\x52\xbc\xa8\xce\x0d\xed\x9b\xab\x84\x1e\xe5\x83\
+\x3b\xa6\xc3\xcd\xeb\x09\xb8\x3d\x96\x6d\x23\x3f\x6f\x23\x0d\x6e\
+\x8f\x72\x7a\xc1\x93\x95\x3e\xb5\x04\xe5\x41\x96\x44\x70\x0e\xf2\
+\xfa\x5b\x17\xe0\xeb\x2f\x6a\xa1\xaa\x0a\x3b\x8b\x4b\xa9\xd0\x23\
+\xee\x25\x01\x30\x74\x33\x01\xef\x7f\x74\x03\x8e\xee\xad\x11\xc2\
+\xc7\x4c\xa7\x22\x2d\x99\x81\x81\xfe\x64\x42\xd3\xec\x17\x84\x54\
+\xfc\xb4\x95\x74\xcc\x0d\x96\x6c\xa8\x09\x05\x1c\x71\x53\x28\x34\
+\x6f\xbc\x0c\x5f\xb5\xcf\xc7\xe0\x8a\x13\x3c\x2f\x8b\x28\xd7\x5c\
+\xb2\x99\xe5\xcc\xc8\xf0\xb0\x0e\x9b\x76\xdc\x82\xee\xcf\xaa\x05\
+\x7d\x1c\xe0\x9f\x08\xd2\x33\x98\x3d\xf8\xe2\x2e\xd6\x22\xfe\xed\
+\xc7\x0f\x48\xa3\xaa\x4a\x87\x6b\xeb\xfc\xc1\xb2\x4a\x1f\x26\x28\
+\x0b\x7a\xb8\x4c\x13\xca\x1c\x31\x75\xf4\xda\xb9\x70\xf8\x9d\x90\
+\x07\xb1\xb8\xb7\x72\xde\x84\xf1\xdb\xd8\x3d\x57\xb5\x48\x36\xc3\
+\xd6\xaf\xd8\xcd\xce\x16\xe4\xfa\xe4\x66\xd2\xea\x9f\x29\xef\x9b\
+\x1f\x2a\x55\xfc\x01\x15\x03\x23\x0d\xc4\x01\x11\xd9\x93\xbb\x00\
+\x88\x50\xa8\x84\x7b\x7e\xd8\xbc\x85\x63\x13\x59\x88\x5c\xd5\x8c\
+\x58\xdc\xda\xb4\x72\x0f\xdc\x95\xeb\xc2\x20\x6d\x24\x6d\x33\x66\
+\xca\xed\x8f\x06\xdd\x4a\x59\x85\xdb\xe9\x7f\x0e\x02\xe4\xee\x4e\
+\x1e\x5c\x98\x33\x17\x8c\x39\x00\x78\xa0\x70\xe3\x46\xc6\x98\x88\
+\xb1\xed\xaf\x7d\xc9\xee\xbf\x70\xf2\xeb\xf8\x7b\xd0\xaa\xaa\x74\
+\xcb\x9c\x39\xae\x60\x65\xb5\x0b\x3c\x5e\xa4\x0b\x7f\x98\xd8\xcc\
+\x84\xe7\x00\x44\x00\xd8\x90\x4a\x19\x30\x3c\xa4\xc3\xad\x21\x23\
+\xa2\x65\xd8\x9e\xd5\xfb\x61\xfa\x2b\x33\xbf\x8e\xb6\x82\xb8\xf4\
+\x7d\x5e\xba\x26\x10\x90\x7d\x58\x15\xf8\x7c\x12\xb8\x3d\x94\xdf\
+\x9a\x90\xd1\x2c\x88\xe3\xe5\x32\x81\xea\x19\x8d\x5a\x89\x54\xca\
+\xee\xc6\xfd\x9d\xcd\x07\xe0\xe1\x97\xfe\x7f\x57\x77\x0b\x70\xa5\
+\xe3\x1a\xbd\x14\x6d\xda\xaf\x2d\x6f\x74\xc0\xb4\x5f\x5b\xfe\x05\
+\x21\x2c\xc5\x45\xf6\xde\x1e\x39\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x04\x89\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x50\x49\x44\x41\x54\x78\xda\xb5\x95\x5b\x68\x1c\x65\
+\x18\x86\xdf\xd9\xdd\x4c\x9b\x73\xda\x9c\x9a\x93\xe6\x54\x09\x4d\
+\x0c\x29\x82\x11\xec\x85\xbd\xb0\x20\x28\x52\xd9\x8a\x45\x44\x82\
+\x5b\x4a\x84\x88\x62\x2f\x7a\x91\xdc\x8a\x11\x04\x0b\x05\x45\x10\
+\xf7\x66\x6f\x54\xa8\x68\x95\x56\x2b\xa5\x0d\x89\xb6\x21\xb5\x6a\
+\x6b\xdb\xa4\x69\x9a\xc3\xee\x26\xbb\x9b\x3d\x65\x77\x76\x66\xfe\
+\xff\x9f\xdf\x6f\x26\xe9\x7a\xa8\x69\xaa\xc6\x85\x61\x96\xbd\x78\
+\x9e\x77\xde\xef\xdb\x7f\x14\xfc\xcf\x1f\x65\x33\x20\xea\xde\x8f\
+\xbd\x52\xf0\x06\x76\xfe\xd0\xb1\x4d\x17\x6c\x79\x32\x40\x70\x16\
+\x90\x9c\xab\x92\xb3\x01\x3e\xd6\x7f\x7c\xd3\x04\x5b\x9f\xfa\xc4\
+\xeb\x52\x64\xa0\x75\x77\xb7\xaa\xa7\x57\x70\xfb\xc7\x4b\x90\x8c\
+\xbd\x2a\x2e\x0c\xbc\xff\x9f\x05\x45\xcf\x9c\xf0\xba\x20\x03\xed\
+\x8f\x74\xab\xaa\xea\x46\x49\x01\x30\x75\x7d\x16\xc1\xab\x57\x40\
+\x75\x1d\x96\xe3\xaf\x7f\xf8\xaf\x05\xc5\xfb\xbf\xf2\xba\xa4\x15\
+\x68\xeb\xe9\x50\x4b\xb6\xaa\xa8\x28\x94\x88\xa5\x39\x12\x2b\x06\
+\x92\xa1\x20\xa2\x93\xd7\x48\xc2\x7c\x72\xe2\xc8\x47\xff\x58\x50\
+\x7a\xe0\x1b\xaf\x02\x82\x77\xb6\xab\xdb\x4a\x0b\x50\x59\xa8\x20\
+\x14\x37\x11\x4b\x99\xe0\x5c\x20\xbd\x18\xc4\xf2\xf4\x0d\x58\x82\
+\xf9\x31\x71\xa4\x4f\xa9\x3f\x1a\x91\xd2\x12\x47\xc3\xef\xd4\x0d\
+\x6f\x04\x2f\x3b\x78\xd6\x49\xbe\xb3\xab\x45\xad\x24\x78\x4d\x91\
+\x82\x99\xa8\x8e\x48\xd2\x20\xb8\x45\xf0\x30\xe2\x33\x93\xa0\x61\
+\xfb\xa5\xb0\x7c\xf2\xd2\x9b\xc2\x11\xd0\x63\x30\xc1\x8c\xa1\xc5\
+\x77\x9b\xd6\x95\x54\xbc\x34\x4a\x70\x11\xd8\xd5\xd9\xa4\x56\x97\
+\x79\x50\x53\xea\xc2\x8d\xa0\x8e\x70\x42\x77\x92\xaf\x2c\x45\x10\
+\x9f\x9d\x82\xc5\x39\xc1\xb9\x4f\x8e\xbf\x21\x9c\x19\xd8\x82\xc6\
+\x5a\x0f\x16\xc2\x3a\xe3\x86\x31\x14\x39\xd6\x72\x97\x64\x7b\xdf\
+\x45\xaf\x42\xf0\x87\x3b\xeb\xd5\xba\x0a\x37\x6a\x4b\x5c\xf8\x69\
+\x2e\x87\xd0\x32\x25\x67\x04\x8f\x45\x91\x98\xbb\xb5\x96\x9c\xfb\
+\xc4\x0f\x03\x22\xbf\x45\xb6\xa0\xab\x5d\x45\x3c\x25\xb0\x10\xd2\
+\x98\x65\xe4\x86\x22\xc7\x1f\xca\x4b\x2a\x0f\x5d\xf6\x7a\xc0\x03\
+\x3d\x9d\x35\x6a\x7d\x85\x07\x75\x65\x2e\x8c\x4f\x6b\x98\x8b\xe4\
+\x9c\xe4\x99\xe5\x38\x12\xf3\xb7\x57\x3b\x27\x38\x1f\xed\x17\x7f\
+\x0c\x97\x17\xd8\x9f\x18\x0d\x2b\x18\xd6\xb8\xc8\x65\x07\x63\x1f\
+\x74\x0e\x57\x1d\xbe\xea\x55\x5d\x3c\xf0\x68\x57\x95\xda\xb0\xcd\
+\x8d\x1d\x54\xcb\xe8\x8d\x0c\x66\x96\x56\x6b\xc9\xc4\xe3\x48\x05\
+\x17\x60\x59\x94\x9c\x71\x1f\x1b\xf1\x89\xbf\x3e\x7d\x5e\x20\xa5\
+\x44\x19\xed\xf2\x7c\xd4\xc0\xec\x7c\x86\x0b\x53\xff\xac\x50\x75\
+\x3d\xf7\x78\x57\xb9\xda\xb4\xdd\x83\x1d\x65\x6e\x9c\xf9\x25\x8d\
+\xe9\x45\x9d\x82\x0a\x64\x93\x29\xa4\xc2\x21\x7b\x1d\xfd\x16\x37\
+\x7d\xe6\xd9\xbe\xbb\xe0\x79\xc1\xae\x56\x0f\xb6\xd0\xa4\x2b\x0a\
+\x81\x6a\xda\x8c\xef\x27\xb3\x58\x8a\xe5\xe4\xde\xae\x12\xe5\x01\
+\x4a\x5e\x47\x43\xfd\xf2\x72\x0a\x37\xc3\x1a\x75\x6e\x21\x9b\x4a\
+\x23\x1d\x89\x50\x2d\xa6\x9f\x8e\x08\x9f\xf1\xed\x8b\x7f\x0b\xcf\
+\x0b\x3a\x9a\xdd\xa0\xad\x43\x15\xfd\x61\xea\x4a\xdd\xa8\x29\x51\
+\x70\x2d\x64\xa0\x08\x0c\xdd\xcd\xc5\xf0\x8f\x2c\xd3\xae\x1b\x4e\
+\x2d\x5a\x5a\x43\x3a\xb6\x0c\x70\xd3\x2f\x38\xf3\xe9\xa7\x9e\x5f\
+\x17\xfe\x7b\x45\x0f\xba\x50\x4e\xf0\xda\x62\xc5\x11\x34\x55\xb8\
+\xd0\x56\x55\x80\xaf\x2f\x46\x70\xee\x66\x0e\xd1\x8c\xe5\x6c\x8b\
+\x96\xd1\x91\x49\x26\x69\x5b\x4c\xbf\xc5\x98\x4f\x3b\xb9\xff\x9e\
+\xf0\xbc\xa0\xa7\xc5\x4e\xaf\xd0\x10\x15\x34\x96\xbb\xd1\x48\xab\
+\xd8\xdb\x52\x88\x33\xbf\xae\xe0\xad\x2f\xc2\x14\x56\x20\xa7\x19\
+\xc8\xa4\xb2\xd4\xb9\x0d\x37\x7d\xd9\xcf\x9f\xde\x10\x9e\x17\xf4\
+\xb6\x4a\x54\x53\xfa\x7a\x5a\xc1\x46\xea\x7c\x4f\x5b\x21\xc6\xa6\
+\xb2\x78\xfb\xe4\x22\x04\x75\x6e\x98\x0c\x99\x74\x4e\x0a\x43\xa3\
+\xe3\x52\xf6\xae\x7c\xba\xef\xbe\xe0\x79\xc1\x9e\x9d\xc2\xa9\xa6\
+\xb1\xdc\x85\xc7\x28\xf9\x95\x85\x1c\xde\x3b\xb5\xe4\x0c\x54\x70\
+\xee\x1c\x03\xba\x6e\xc2\xd4\x34\x6e\x26\xa3\x83\xfa\xe9\x17\x36\
+\x3c\x56\xfe\x24\xd8\xd7\x21\x50\x5f\x6e\x77\xef\xc1\x6c\xcc\xc0\
+\x89\xf1\x84\xd3\xf9\x2a\xdc\xbe\x5b\xce\xc5\x4c\x13\x4c\xb7\x25\
+\x4b\x83\xe6\x77\x2f\xdf\x97\xc4\x11\x3c\xdb\x25\xd0\x40\x70\xfb\
+\xd0\x3a\xfd\x73\x9a\xe0\x77\xc0\x62\x4d\x24\x21\x04\xa7\x73\xc6\
+\x16\x31\x08\x23\xc3\x59\x2a\x36\xc8\xce\xbd\xb2\xa1\xc4\x11\x1c\
+\xdc\x2d\x90\xca\x72\x8c\x5c\x4f\x3b\x60\x6e\x12\x48\x10\x98\x44\
+\x76\x72\x4e\xdf\x1d\xb8\x65\xd1\xee\x5b\xf6\xa0\x01\x33\xc3\x8d\
+\x44\x74\x50\x8c\xf5\x0f\x6f\x28\x78\xa2\x39\x87\x89\x5b\x99\xb5\
+\xb4\xc2\xe9\xfc\x4e\xf7\xab\xa9\x45\x1e\xee\x5c\x96\x84\x22\x39\
+\x60\x24\x19\xcd\x64\xc8\xba\xf0\xda\xf0\x3d\x05\xaa\x4b\xc0\x24\
+\x38\xec\xa4\x96\x9d\x96\xd9\xaf\xbd\xd5\x3b\x89\xec\xc4\x74\x0c\
+\xd3\x65\xae\xfe\xc6\xe8\xb2\xec\xbb\x01\xa1\x6b\x60\xe7\x7d\xeb\
+\xbe\xb8\x7e\x03\x90\x67\xec\x37\xe1\xad\x55\x02\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x16\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xdd\x49\x44\x41\x54\x78\xda\xad\x95\x6d\x4c\x53\x67\
+\x14\xc7\xff\x77\x12\x63\xa6\x7b\xd1\xc4\xe8\xf4\x83\xd9\xd0\x2d\
+\x1a\x67\x1c\x04\x31\x9a\x98\x2c\xfb\xb0\x2f\xee\x83\x89\xd9\x08\
+\x11\x17\x26\x41\x46\x98\x31\x2e\x71\xe6\x1a\x65\xbe\x70\xc9\x16\
+\x08\x4c\x44\x0d\x3a\xb2\x61\xc6\xc4\x38\x54\xc0\x8a\x52\x52\x51\
+\x04\xca\x24\xd0\xda\xd2\xd6\xb6\x50\x4a\xad\x28\x4a\x2d\x52\x50\
+\x50\xce\x9e\xe7\xd2\xb7\xcb\x4d\x96\x26\x70\x3f\xdc\x3e\xbd\xe7\
+\xf6\xfc\xce\xff\x7f\xce\xf3\x54\xc0\x4c\xaf\x3c\x3b\xfd\x5f\x58\
+\x98\x31\xe0\xd8\x03\xba\x90\xf6\x11\x46\x26\x26\x55\xa1\x8c\x0b\
+\xae\x99\x03\x84\xa3\x36\x2a\x4b\xf9\x10\x8f\x03\x13\x20\x9a\xaa\
+\x38\x24\xe9\x50\xad\x67\x16\x14\xfc\x6c\x61\x80\x78\x78\x47\x26\
+\x58\x32\x0a\x27\xe7\x89\x73\xeb\x66\x03\x70\xa8\x9b\xce\xa4\xc6\
+\xc3\x33\x3c\xce\x92\xb1\x74\x02\x05\x25\x08\x38\x56\xe7\x9e\x05\
+\x8b\x0e\x9a\xa8\x34\x75\x25\xfa\xfd\xe3\xd3\x02\x40\x7e\x2c\x80\
+\xb8\x6a\x50\x54\x51\x0a\x8f\xf9\xf5\xba\xdd\x88\x92\x1d\xab\xe0\
+\xf6\x8d\x07\x9f\x93\xac\x84\x9b\x55\x70\x2d\x16\xc0\x55\x90\x69\
+\xcb\x4d\xd8\xfd\xb7\xa2\x8b\x93\x93\x6d\x33\x48\x78\xd3\x6c\x40\
+\x51\xda\xc7\x70\x0d\xbd\x94\x9f\x09\xf2\x6d\xea\x8d\xe2\x98\x00\
+\x4c\x41\x4d\xa2\x08\xed\x43\x49\x15\x3b\x31\x00\x06\xe8\x44\xe1\
+\xce\x4f\xe0\x7c\x3a\x26\xa3\x09\xa1\xd9\x27\x9c\xd2\xf4\xc5\x00\
+\xa8\x02\x5d\x49\x16\x71\xb3\x5f\x0a\x57\xcf\x6f\x7c\x24\x4f\x79\
+\x19\xa0\xe5\x1e\x7e\xfd\x76\x35\xec\x83\x63\xf2\xb3\x68\x0f\xcf\
+\x69\x62\xd8\x07\x71\xe7\x41\xff\x6c\x16\x51\xef\x56\x2b\x38\xeb\
+\x61\x3d\x68\x6d\xc7\x2f\xe9\x6b\x60\x19\x18\x55\xc4\x38\xa3\xe2\
+\x3a\x03\xb8\x96\x2d\x54\x0e\x2f\x29\x97\x2b\xf3\x7c\xa8\xda\x22\
+\x42\xe3\x8a\x02\x04\x83\x7f\xb8\x81\xc9\xf6\x56\xe4\x7d\xb7\x16\
+\x66\xef\xa8\x22\x39\x7f\xa5\xb2\xbe\x17\xc2\xc3\xe5\x8b\x68\xc9\
+\x7d\x07\x26\xfd\x7e\x55\x85\x83\x9b\x13\xb1\xe2\xf0\x10\xfe\xfa\
+\x5c\x44\x4d\xaf\x84\x28\x83\xe5\x75\x55\x1f\xb3\xa8\xa3\x05\x47\
+\x76\xad\xc5\x7d\x4f\x40\xf5\xfb\x4b\x1c\xd0\xf7\xc1\x42\x5a\xda\
+\xd4\x86\x89\x9e\x1e\xd5\x0b\x4f\xd3\x53\x11\xff\x93\x0f\x15\x5f\
+\x8a\xa8\x76\x48\x88\x56\xca\x39\x97\x9d\x4c\x81\xb1\x19\xb9\x19\
+\x9f\xa2\xd3\x1d\x88\x90\x69\x6a\xc3\xd5\xdc\xe8\x81\x60\x5b\xf2\
+\x1e\xad\xd0\xde\xc1\x2b\xab\x45\x05\x18\xc8\xc9\xc4\x9a\x7d\x7e\
+\x94\x6f\x15\x71\xd1\x2a\xc9\xd3\x47\x51\x2a\xea\xed\xec\xbb\xb9\
+\x09\x07\x33\xd7\xe3\x9e\xeb\xc5\xd4\x0c\xb1\xe4\xc1\xfc\xb8\xae\
+\x75\x42\x30\x2c\x7e\x97\x56\x69\x1a\x30\xd6\xd5\xa9\x02\x78\xc4\
+\xfd\x48\xc8\x19\x46\xd9\x36\x11\x95\x96\x48\x0f\xe4\x43\x8d\x25\
+\xb9\x65\x63\x6b\x9b\x0e\x07\x32\x3f\x43\x7b\xef\x70\xb8\x6f\x21\
+\x17\xb5\x0d\x0c\xa0\x5f\xb4\x80\x56\x5f\xae\xc5\x48\x6b\x8b\x72\
+\x04\xd8\xd5\x5f\x90\x8f\x4d\x59\x23\x28\xdd\x2e\xa2\xc2\xa4\x9e\
+\x22\xbd\x95\x59\xe4\x6c\xc4\xfe\xdd\x09\x68\x73\x4e\xef\xa1\x80\
+\xdb\x5a\x07\x04\xdd\xfb\x6f\xd3\xba\xca\x8b\x78\xde\xa8\x9d\x16\
+\x06\xdc\xbf\x97\xe1\x8b\x8c\x51\xfc\x96\x22\xa2\xdc\x28\xc9\xd2\
+\xe5\x58\xf0\xe8\x30\x76\xb3\xcf\xbe\x06\xfc\x98\x95\x88\xbb\x0e\
+\x7f\xb0\x30\x0a\x37\xa9\x8d\x03\x34\xef\xcc\xa3\x84\xf2\x3f\xf1\
+\xa4\xe6\xaa\x6a\xcc\x3c\x57\xaa\xf1\x55\xfa\x4b\x14\xee\x10\x51\
+\xd6\x29\x45\x62\x41\x2f\x6c\x26\xf6\xe1\xbd\x81\xbd\xdf\x27\xa1\
+\xd9\xfa\x3c\x52\x80\x7c\x12\x09\xe8\x68\xb4\x43\xb8\x34\x7f\x2e\
+\x25\x9d\x3c\x0d\x4f\xd5\xdf\x0a\x8b\x78\xa2\x81\x3b\xb7\xf1\x4d\
+\xda\x38\xdb\x48\x22\x4e\x77\x48\x91\x43\x2e\xd8\x83\x5e\x23\x5b\
+\x3f\xae\xc7\x9e\xec\x24\x34\x59\x7d\x4a\x87\x18\xcd\xa0\x7b\x00\
+\xe1\xfc\xbc\x38\xda\x50\x50\x04\x67\xf9\x39\x95\xc7\x43\xdd\x66\
+\xec\x4c\x7d\x8d\xfc\x5d\x22\x4a\xfe\x95\x54\x7f\xb0\x5e\x03\x9f\
+\xe5\x6b\xc8\xc9\x4e\x86\xce\xe2\x0b\x37\x4f\x3e\x4f\xd9\xd2\xac\
+\x63\x0a\xce\xce\x7d\x8b\x92\x8f\x4b\x30\x97\x96\x84\xfb\x1f\xca\
+\xf3\xe2\xd1\x23\xec\x4e\x79\x83\xe3\x99\x22\x8a\xf5\x52\x78\x07\
+\x87\x2c\x1a\xec\xe2\x55\xd4\x21\x3b\x67\x23\x1a\xcd\xcf\xc2\xde\
+\x87\x7a\x64\xe3\x0a\x4e\xce\x11\x28\x39\x37\x17\x5d\x85\x05\x2a\
+\x05\xaf\x02\x01\xec\xf9\x9a\x70\x24\x4b\x44\x91\x3e\x32\x45\xa1\
+\x02\x7c\x7c\xb2\x7d\xb5\xc8\xfa\x61\x23\xb4\xa6\xa1\x69\x1d\x24\
+\x38\xb8\x82\x58\x01\xc5\x7a\xf5\x98\x2a\x01\xcf\x54\x71\x0e\xf8\
+\x0f\x51\xb0\xdd\x60\x06\xc9\x7b\x11\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x04\x42\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x09\x49\x44\x41\x54\x78\xda\x9d\x54\x6d\x6c\x14\x45\
+\x18\x7e\x66\x7b\xfd\xda\xf6\xe8\x87\x85\xea\x05\xd2\xc6\x3f\xf2\
+\x83\x98\x68\x4c\x34\xb4\x09\xc4\x12\x4d\x45\x6c\x34\x16\x25\xa8\
+\xd4\x04\x62\x23\x56\x48\x2d\x46\x45\x50\x44\xd2\xc6\x42\xc5\xb6\
+\x51\x44\x92\x7e\x04\xd1\x50\x84\x54\xb1\x8d\x05\x15\x63\xab\x12\
+\x7f\xe0\x47\x8d\x42\x94\x14\x6a\xd0\xb6\x5c\x7b\x7b\x5f\xbd\xbd\
+\xbb\xdd\xd7\xb9\xb9\xdd\xeb\xdd\xde\x5d\xab\x4e\x6e\x77\x66\xde\
+\x79\xe6\x79\x9f\x79\xde\xd9\x63\x88\x6b\x45\xa5\x7b\x8b\x59\x6e\
+\xf6\x15\x29\x5f\xde\x78\x7d\xf4\x99\x8f\xf1\x1f\x5a\xc9\x8a\xce\
+\x07\x74\xaf\xff\x7d\x9a\x55\xcb\x66\x26\x76\x4d\x9b\x71\x66\x05\
+\xde\xb0\xa2\xa3\x52\x2a\xc8\x1f\x94\x0a\xed\xaf\x4d\x7c\xfa\x70\
+\xeb\xbf\x21\x2f\x5d\x7b\x62\x87\xee\xf2\xec\xd6\x15\x6f\xb5\x73\
+\xb4\x61\x38\x7e\x8d\xa5\xd9\x50\x29\x15\x2d\x1a\x64\xc5\x8b\x1a\
+\xae\xb5\xdf\xd5\x3d\x1f\xb9\xe3\xd9\xef\xea\x68\xda\xdd\xa1\xcf\
+\xb8\xab\xb9\xa0\x61\xeb\x3a\x9b\x67\x63\x25\x3f\xc5\x69\x56\x90\
+\xff\xe4\xf8\x73\x65\xa7\x52\x61\x96\x1d\xb8\xf2\x20\x29\xde\x2e\
+\xae\xfe\x7e\x2e\x64\x38\x15\x26\x6d\x02\x41\xb0\x7f\xac\x52\xb2\
+\xcb\xfd\xbc\x2e\xb5\x63\x4f\x14\x7c\x11\xbf\x56\xde\xab\xdc\xcd\
+\xfd\xee\xd3\x3d\xfe\x9a\xf1\xa6\xf2\xe1\x74\x1c\x0c\x77\xb6\xd0\
+\x42\x1e\x67\xc8\x32\x34\xbf\x7f\xc1\x58\xca\x04\x6c\x65\x2b\xe9\
+\x23\x4d\x0b\x02\xff\x4f\x93\x2a\xf6\x83\x49\xab\x0e\x92\xfa\xe5\
+\x36\x3e\xa5\x39\xc7\xcc\x33\x25\x18\x48\x58\xc0\xd1\xa4\x96\xbd\
+\xfa\x2d\x30\x5b\x55\x27\xb9\x3f\xdb\x2a\x02\x7b\xce\x7a\x13\x00\
+\x21\x9d\x10\x0c\x03\xaa\x46\x50\xc3\x84\xd9\x10\x7f\xf8\xdc\x1f\
+\x8c\xf4\x04\x7f\x28\x1a\x0b\x44\x1e\x03\x17\xe4\x8f\x73\x57\x29\
+\xd7\x42\xb0\xdf\xfb\x36\x58\x56\xf5\x61\x9a\xec\xdf\x22\x08\x5b\
+\xce\x28\x42\x67\x49\x71\x26\xb4\x48\x02\xcd\x20\x17\x09\x80\x80\
+\x18\xf3\x3e\x1c\x8d\x99\xa4\x61\x2d\x2a\xe6\xc2\x6f\x3e\xe8\x3a\
+\x30\xb5\x77\xa9\xe0\x5b\x5c\xf3\x1e\x58\x4e\x4d\x17\x5d\x3d\x5e\
+\x07\xe2\xcc\x6f\x0c\x3a\x05\xd0\xe1\x90\x85\x92\xa8\x22\xc0\xa5\
+\x12\x66\x02\x3a\x7c\x42\x29\x81\x43\xc0\x97\x62\x86\x99\x8e\xfe\
+\x38\xaa\x40\x55\x75\x8c\x37\xdf\xcc\x8b\xcb\x6f\xe1\xfa\x1e\x30\
+\xb9\xf6\x18\x5d\xec\xdd\xc0\x13\x10\xf6\x7d\xf4\x17\xc2\x7c\x65\
+\xc9\x4d\x32\x54\x4e\xe6\xe4\xa4\x4e\x9f\x0e\x57\x50\x17\x2a\x05\
+\x63\x84\x98\x25\x56\x44\x8c\xf9\xeb\xd2\x45\x05\x1e\x5f\x18\xbf\
+\x1f\x58\xce\x83\x0c\xcb\xeb\x3e\x00\xcb\x7b\xec\x04\x5d\x38\xf4\
+\x10\x07\x33\xbc\xdc\x7d\x19\x64\xcb\x40\xe1\x12\x19\x7f\x7b\x34\
+\x5c\xf7\x69\xbc\x06\x51\xa9\xa9\x4a\x6c\x8d\x5d\xbd\xac\xc0\xed\
+\x52\xf1\x53\xc7\x6d\x62\xe1\xf6\xfa\x93\x60\xf6\xcd\xa7\x69\xa4\
+\xed\x3e\x01\x68\x7a\xf3\x17\x48\xb9\x99\x08\xe6\x64\x61\xda\xaf\
+\x09\x3f\x63\xb7\xc9\x94\x29\xa4\x18\xb6\xc4\x32\x44\x07\x93\x7f\
+\xba\xa1\x38\x67\x71\xfe\x70\x05\x22\x9e\x57\x34\x0e\x80\x15\x6e\
+\x3d\x43\x43\xaf\x57\x09\xc0\xd3\xbb\xbf\x45\x30\xc3\x06\x4d\xce\
+\xe6\x3e\x47\x37\x91\xe1\x70\x2c\xc7\x1c\x7d\x2c\x6a\xc6\x95\x29\
+\x1f\x5c\x93\x5e\x9c\xeb\x59\x23\x6c\x5c\xb3\xf3\x73\xb0\xa2\xc6\
+\xaf\xa9\x7f\x67\x85\x00\xd5\xd5\x0f\x21\xcc\x4f\x90\x95\x97\x2b\
+\xd4\x32\xee\x23\xff\xc5\x44\xc6\xc6\x11\x52\x32\x52\x89\x17\x89\
+\x04\x7e\x77\x00\xca\xa4\x07\x03\x1f\xae\x13\x6b\x35\xfb\x46\xc0\
+\x4a\x5e\x3a\x4f\xc7\xb6\xdf\x21\x34\x3c\xba\xbe\x0f\xd9\x85\x79\
+\xc8\xcc\xb5\x25\xdd\x10\xeb\x3c\x55\x2c\x34\x1b\x82\x67\xca\x8b\
+\x93\xa7\x1e\x11\x89\x37\xb6\x7d\x0f\xb6\x78\xcf\x0f\x74\xe4\xa9\
+\x5b\x05\xea\xf1\xb5\xdd\x90\x8b\xf3\x20\xd9\xa4\xa4\x62\xc6\x93\
+\x92\xa5\x37\x9b\xce\x6f\x9b\xcf\xe5\xc3\xd1\x81\x4d\x62\xbe\xf9\
+\xd0\xcf\x60\x37\x36\xff\x4a\xed\x9b\x6e\x11\xe0\x2d\x55\xef\x20\
+\xc7\x9e\x63\x78\x1f\xdd\x9d\x40\x64\x64\x12\x56\x19\x41\x22\x24\
+\x54\x45\xf5\x04\x70\xe4\x6c\x3d\xc7\x10\xb6\xf5\x5c\x02\x73\xb4\
+\xfd\x41\x2d\xb5\xe5\x02\xdd\xb0\xfa\x20\x32\x32\x6d\x49\x2a\x61\
+\x19\x5b\x5b\x3c\x5e\xe3\xff\x2d\xed\x5f\x6d\x17\x91\x17\xfa\xc6\
+\xc0\x96\x76\x8e\xd3\xab\xeb\x1c\x42\xd5\xf3\x2b\x5b\x93\x3d\x37\
+\x3e\x2c\xb3\xca\xc4\xe6\xee\x0e\x33\x4e\xca\xe2\x8f\xc6\x5b\xeb\
+\x37\x3b\x44\xff\xca\x27\xd7\xc0\x96\xbd\x3b\x41\x2f\xde\x53\x92\
+\xc2\x54\xe3\xfc\xd6\x8a\x5a\x5b\xcc\xcb\xe4\xf3\x35\x0f\x4d\x81\
+\x95\x75\x4d\x53\xe3\xaa\x02\x60\x9e\xfd\x2c\xdd\x35\x4a\xe7\x93\
+\x81\x69\x3b\xa7\x80\x95\xf7\xba\x09\x0c\x73\xd5\x32\xff\x17\xd2\
+\x5d\x19\xf3\x13\x66\xcc\xa2\xc0\xa2\xc8\xe0\xfb\x07\x6a\x7a\xff\
+\x23\x86\x40\x51\xf1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x03\x27\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xee\x49\x44\x41\x54\x78\xda\xb5\x54\x5d\x48\x93\x61\
+\x14\x3e\xaf\x9b\xdb\xf2\x27\xc5\x4c\x9b\x5a\x63\xad\x68\x85\xa3\
+\x34\x1c\xfd\x69\x50\x60\x10\x89\xd4\x9d\x74\x11\x5d\x04\x05\x41\
+\xd0\x4d\x10\xfd\x11\xde\x78\xd3\x4d\x42\xd1\x4d\x74\x63\x77\x41\
+\x84\x48\x48\x90\x91\x06\x8a\xa5\x2d\x52\xc1\xd4\xa6\xcb\x65\x66\
+\x33\xe7\xcf\x36\xf7\x9d\xde\xed\x7b\xdf\xbd\xef\xf7\x6d\xb6\xd2\
+\x3a\x70\x78\x3f\xce\x77\xce\xf3\x3c\xe7\xbc\x3f\x04\xfe\xb3\x11\
+\x7d\x00\xc7\x1d\xbb\xe8\x72\x96\x7a\x3d\x60\x3c\xf4\x94\xfa\x43\
+\xb2\xe5\xd3\xc7\x7f\x43\xe0\x75\xdc\x03\x4b\xd5\x79\xb0\xb8\xd5\
+\xc0\x52\x37\xf5\x9e\xfb\x94\xe0\xc2\xaa\x08\xa2\x63\x5b\x31\xae\
+\x94\x52\xb1\x05\x32\x8a\x9a\x34\x49\xca\xd7\x2b\xea\x0f\x9e\x20\
+\x0b\xe2\x21\x14\x31\x83\x7d\x24\x91\x45\xc2\xc3\x76\xcc\xb4\x5e\
+\x67\xd9\x34\x4e\x50\x5d\x79\x05\x89\x31\x23\x23\x60\x75\x84\xc3\
+\xb2\x5c\x89\x34\x32\x79\x1b\x4c\xdb\x46\x05\xc1\xc2\x80\x0d\xd7\
+\x95\x5d\xd2\xe9\xc1\x14\x12\xf5\x2d\xf0\xb6\x51\x15\xc1\x6a\x16\
+\x7d\x77\x21\xcb\x39\x26\x08\x82\xef\x6d\x98\x6d\x6b\x60\xf9\x5c\
+\x55\x8a\xdd\x49\xfc\x97\xc1\x79\x37\x42\x40\xd0\xdb\x02\xb9\x2e\
+\xaf\x20\xf8\xd1\x5b\x86\xf9\xf6\x5a\xb5\x48\x16\xc9\x01\xb9\x42\
+\x94\x06\x9d\xe0\x21\xda\x18\xfd\x9c\x1d\x6d\x87\xfc\xbd\x13\x82\
+\xe0\xdb\x9b\x52\x2c\xdc\xbe\x3b\x45\xfb\x00\x1a\x34\xbe\x0f\xfa\
+\x11\xe9\x6c\x7a\xb8\x1f\x36\xee\xf3\x09\x82\x2f\x1d\x25\x68\xdd\
+\xb9\x29\x59\x51\x42\x55\x32\x48\x62\xa3\x51\x6a\x99\xa8\xa3\xf5\
+\x0f\x4e\x82\xf5\xf0\xa4\x20\xf0\xb6\x17\xe3\xe6\x72\xb3\xa6\x4d\
+\xfd\x3e\xa7\x36\x29\x51\x1a\xa1\xd7\x13\x01\x5b\xad\x5f\x10\x0c\
+\xb7\x16\xa1\x63\xcf\x62\x72\xdb\x7c\xf3\xf8\x31\xc4\xdf\x1c\x5b\
+\xbe\x7f\x51\x84\x91\xfe\x6c\x70\x9c\x98\x12\x04\x83\x4f\x36\xe0\
+\x0e\xf7\xf7\x74\x72\xd3\x9b\x12\x23\x00\x18\x7a\x57\x08\xce\x53\
+\xd3\x82\xc0\xf3\xb8\x00\xcb\xab\x67\x56\x0f\x8c\xcc\xa3\x2a\xc9\
+\x87\xee\x02\x70\x35\xcc\x08\x82\xb7\x8f\xf2\xb0\xe2\xe8\xec\xdf\
+\x03\x22\x53\xcd\x94\xab\x68\x00\x7d\x5d\xf9\x50\x71\x26\x20\x08\
+\xba\x1f\xe4\x62\xd5\xf1\xb9\xf4\xa0\xa0\x03\x5c\x96\xd6\x98\x65\
+\x50\x37\x00\xf4\x74\xae\x07\xf7\xb9\x9f\x82\xa0\xb3\x39\x07\x0f\
+\xd4\x07\x93\xc1\xf4\x6a\xf9\x18\x22\xcc\xc3\x20\xbd\x8e\xd4\x8d\
+\x2a\x41\xd7\xcb\x1c\x38\x78\x31\x28\x08\x3a\xee\x64\x61\xcd\xc9\
+\x05\x01\x10\xd5\x11\x71\x10\x85\xa9\x0d\xd1\x14\x7a\xe8\x02\x7e\
+\x80\xb9\x00\xa4\x3b\xce\xcd\xe4\x45\x93\x05\x8f\xd4\x2d\xa9\xc5\
+\x61\x69\x0c\x20\xad\x8c\x48\xa1\xca\x67\xe8\x1d\x0a\x86\x2c\x60\
+\x3d\x54\x01\xe6\xbc\x1c\x29\x41\xdc\x89\x79\xdf\x14\x4c\xbc\xea\
+\xf3\xd1\xa3\xee\x24\xcf\x1b\x2d\x58\x59\x19\x82\xf1\x01\xa2\x49\
+\xd5\x4f\x4c\x3d\xfe\x08\xb9\xc5\xd9\x60\xaf\x29\x01\x83\xc9\x28\
+\xdd\x66\x48\x7c\x2b\xcb\x51\x18\x6c\x1d\x83\xd0\x7c\xe4\x74\xe5\
+\x65\xa5\x85\xb4\xdd\x32\xa1\x6b\xbf\x11\x4a\x5d\x66\x09\x15\xc5\
+\xcb\x99\xfa\xc9\x81\x95\x7e\x7e\xee\xa5\x62\x3d\xa1\xd7\xd5\x57\
+\xa3\xd5\x71\xde\xb6\x1b\x46\x2c\x73\x2a\x60\x30\x48\xd8\xac\xdd\
+\x39\x7a\x9c\x15\x45\x33\x00\x6d\x77\xec\x79\x67\xcf\x50\xfc\x67\
+\x90\xde\x31\x5a\xe2\x3c\x76\x73\x79\x28\x1e\x7a\x76\x2d\xd3\x45\
+\x57\xd3\x0a\x12\xc3\x75\x8d\x11\x0f\xac\xc1\xc8\x5a\x8a\xff\xc4\
+\x7e\x01\x00\x71\x43\xaa\x98\x01\xd8\x49\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x58\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x1f\x49\x44\x41\x54\x78\xda\xad\x95\x5b\x68\x1c\x55\
+\x18\xc7\xff\x67\xce\x39\x33\x7b\x4b\xb2\xb9\x9b\xb4\x76\x9b\x34\
+\x26\x2a\xda\xa4\x46\x0d\x0d\x52\x11\xed\x43\x41\x1f\x0a\xab\x22\
+\xd5\x87\xe2\x7a\x29\x54\x8a\x54\x5c\xdf\x13\x41\xc1\x87\x60\xc1\
+\x22\x45\x8c\x0f\x83\xe8\x4b\x15\x5a\x68\x15\xcd\x43\x69\x51\x8b\
+\xa5\x55\x43\x25\xd4\x1a\xd6\x34\x9b\x5b\x77\x93\xdd\xec\x64\x77\
+\x33\x17\xbf\x39\xa9\xb1\xa5\x69\x9a\x54\x3f\x38\x3b\xbb\xb3\x3b\
+\xbf\xdf\xb7\xff\x39\xe7\x0c\xc3\x2a\xd5\xfc\xce\x94\x87\xff\x58\
+\x6c\xb5\x2f\x9b\xde\x4e\x27\x35\x8d\xf7\x6d\x68\x14\x32\x5a\xa1\
+\x2d\x9f\x77\x5d\x97\x86\x07\xe1\xd1\xd0\x5c\x18\xcc\x83\xe4\x2e\
+\x42\x1c\x08\x0a\x20\x24\x81\x74\xb6\x8c\x33\x29\x7d\x75\x81\x5f\
+\x77\x1d\xfc\x2b\xa9\x71\xde\xd7\xdc\x68\xc8\x9a\x2a\x0e\x8f\xa0\
+\x3a\x7c\x30\x1d\x09\x1a\x24\x6f\x80\x7b\x08\x12\x34\x2c\x7d\x38\
+\xc3\xe8\x54\x11\xa7\x7e\xcf\x21\xef\x55\xdd\x5e\xe0\x57\xc3\x81\
+\x3f\x93\x9a\x10\x4a\xd2\xd2\x20\x11\x10\x1e\x02\xd4\xb9\x0f\x0d\
+\x89\xa5\x11\xd6\x81\x88\xae\xe1\xe2\x15\x0b\x27\x7f\x99\x83\xbd\
+\xe8\x60\x81\xad\x51\xa0\x24\xfb\x47\x92\x4c\xea\xfd\xb1\xe6\x80\
+\xe8\xdd\x62\x20\x42\x70\x5f\x50\x41\xe0\x10\x8d\x8e\x06\x1d\xc7\
+\x2f\xe4\x70\xf4\x6c\x16\xb6\x6d\xc3\x21\x41\x91\xaf\x43\xe0\x57\
+\xdd\xeb\xc3\x49\xae\x1b\xfd\x9b\x49\xb2\xa7\x27\x82\x68\x90\x51\
+\xd7\x0c\xf7\x37\xe9\x18\xba\x38\x8f\x81\x13\x53\xd4\xb9\x4d\xc3\
+\x85\xe3\x38\x28\xf3\xc8\xfa\x04\x4b\x92\xdf\x3e\x8f\x44\x8c\xe7\
+\x77\x6d\xab\x64\x2f\xf6\x54\x60\x73\xad\xc4\xc9\x5f\x73\x78\xff\
+\xd8\x84\x02\xab\xee\x6d\x12\xd0\xd1\x16\xeb\x14\xd4\xbd\x36\x1c\
+\x0f\x1a\xcc\x7c\xea\xa1\x6a\xbd\x46\x3a\x08\x30\x1b\xed\xb1\x4a\
+\xbc\xfb\x75\x9a\x22\xb9\x06\xb5\x1d\x15\x8f\xed\xd0\x4c\x13\xc1\
+\xb5\x0b\x6a\x5f\x39\x1f\x37\x04\x33\x77\x6c\xab\xd3\x3b\x1a\x25\
+\x5a\xeb\x24\x8e\x7c\x37\x81\xe9\x02\x75\x5d\xfe\x17\xee\xdf\x5c\
+\xd7\xff\x07\x24\xf0\x84\xb1\x36\x41\xcd\xde\x9f\xe2\x52\x68\xe6\
+\xf6\xae\x26\xfd\x9e\x46\x81\x2d\x14\xcb\x17\x3f\x66\x30\x9e\x29\
+\x29\x60\xa9\x6c\xd3\xe2\xf0\x48\xe2\x5c\xcb\xdf\x56\x12\x26\xc5\
+\xed\x05\xd1\x97\x4e\xc7\x39\xd7\xcc\x87\xbb\x36\xe8\x6d\x34\x53\
+\x5a\xeb\x04\xbe\x1f\xce\xe3\x52\xda\x5a\x9a\x8a\x56\x09\x96\x55\
+\xf6\x84\xd0\x98\x46\x38\xff\x1e\xa8\x7f\x40\x8b\x51\xe3\xda\xea\
+\x82\xca\x17\x86\xe2\x82\x73\x73\x6b\x67\x4c\x6f\xa9\xa7\x58\x6a\
+\x05\xce\x8c\xcc\xe3\xf2\xe4\x82\x8a\xc3\xca\x17\x51\xc8\x5b\xf0\
+\xdc\xc5\x9f\x19\xd3\x3a\xb9\x90\xc2\x73\xa1\xe0\x2e\x45\xa4\xd1\
+\x5a\xb9\xa5\xa0\xe2\xd9\x6f\xa8\x73\x6e\x3e\xd0\xd9\xaa\xdf\x4d\
+\x79\xb7\x10\xfc\xdc\x65\x8b\xe0\x45\x15\x85\x95\x2f\x60\x7e\x2e\
+\xe7\xff\x74\x90\x46\x62\x31\x97\x79\x4b\x44\xa2\xfd\x4c\x93\xc2\
+\xf5\xd8\x92\x80\x2d\xae\x2c\x08\xef\x3e\x1e\xe7\x82\x9b\x1d\x9d\
+\xed\xfa\xc6\x6a\x89\x58\x0d\xc7\xf0\x58\x11\x29\xda\x02\xfc\xce\
+\x0b\x04\xce\x67\x66\xc1\x98\x37\x48\x3b\x47\xa2\xf0\xd5\xd3\x8e\
+\x7f\x9d\xfe\xe4\x67\x49\x11\x8e\xf6\x83\x1b\xc2\x71\x39\xb8\xbb\
+\x70\xb3\x20\xf4\xcc\x51\xea\x5c\x98\x6d\x5d\xf7\xe9\x8d\xd5\x06\
+\x62\xd5\x1a\x46\xd2\x45\x8c\xcf\xf8\x70\x17\x85\xd9\x39\xe4\xa6\
+\xa7\xfd\x0b\x07\x69\xab\x4d\x58\xc7\x76\x3b\xd7\x5f\x2f\x1f\xff\
+\x24\x29\x23\x55\xfd\x2e\x0f\x0b\xe6\x58\x37\x0a\x02\xbb\xbe\x8c\
+\x0b\x41\xf0\xee\x07\xf5\x1a\xda\x03\x36\x56\x72\xa4\x66\x4a\xb4\
+\x33\x96\xd4\x0a\x9d\xcf\x64\x91\x9b\x9c\x84\x47\x9d\xd3\x4b\xa2\
+\x78\xe2\x39\x67\xa5\x04\x78\xef\xe1\xa4\xac\x88\xf6\xd1\xce\x28\
+\x97\x05\xc6\x4e\x33\xce\xa5\x30\xdb\x1f\xed\xd6\x23\x01\x89\xa6\
+\x4a\x86\x89\xd9\x32\xa6\x66\x4b\x6a\xea\xcd\x5f\xbd\x8a\xb9\xf1\
+\x2b\xfe\x06\xaf\x3a\x2f\x7d\xbb\x67\x45\xf8\x3f\xa5\xf5\x7c\x98\
+\xe4\x46\xe8\x3d\x25\xd0\x9f\xf8\x34\x4e\x81\x9a\xed\xdb\x7b\xf4\
+\x50\x38\x80\x86\x30\x43\x36\x6f\x63\x26\x57\x52\x99\xe7\xa7\x67\
+\x30\x3b\x96\x52\x70\xea\x2a\x51\x1e\xda\xbb\x2a\xfc\xfa\x52\x02\
+\xb9\xe3\xc8\x01\x7a\x3b\x10\xeb\xdc\x8a\x4d\x9b\xea\x61\x15\x1d\
+\x64\x73\x65\x5a\xee\x04\xa7\x48\xb2\x63\xa3\xfe\x73\x60\x90\x51\
+\x2c\x8b\xa7\x12\x6b\x86\x2f\x0b\xfc\x12\xbd\x87\xf7\xd3\xbc\x3a\
+\xd4\xd4\x71\x2f\x42\xb5\xf5\x2a\x96\xdc\x64\x1a\xd9\xd4\x1f\xa0\
+\xe7\x8b\x9a\x8a\xf6\xe9\x7d\xeb\x82\xdf\x20\x50\x37\xa7\xe7\xd0\
+\x3e\x8f\xb1\x8f\xea\xdb\xda\xd5\x3c\xce\x8c\x5e\x5a\xea\x9c\xe0\
+\xce\x0f\x6f\xac\x1b\x7e\x93\x40\x9d\x78\x64\xe0\x55\xc6\xd8\xc7\
+\xea\x83\xe7\xaa\x1b\xea\x9d\x7d\xf3\x8e\xe0\x2b\x0a\xd4\xc9\xee\
+\x0f\x5e\x26\xf0\x63\x7e\xe6\xde\xb9\x83\x77\x0c\xbf\xa5\xe0\xff\
+\xac\xbf\x01\x76\xd6\xdc\xff\xff\x8d\xb9\x9c\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x29\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xf0\x49\x44\x41\x54\x78\xda\xa5\x96\x0f\x4c\x13\x77\
+\x14\xc7\xdf\xdd\x95\xbb\xd6\xb6\x50\xfe\x15\xa8\x95\xd2\x02\x1b\
+\x15\x51\x8c\x3a\x8d\xd3\xc9\x1f\x41\x74\x8b\x11\x18\x64\x0e\x45\
+\x66\xf6\x2f\x2e\xcb\x60\xd1\xfd\x89\xba\x84\x65\xd9\x1f\x36\xa3\
+\x73\x73\xd3\xc9\x8c\x06\x37\x74\x8e\x6c\x2a\x6e\x88\x05\xa7\x20\
+\x93\x40\x14\xd4\xa1\x11\x90\x95\x55\x81\x54\x44\x68\xcb\xd1\xde\
+\xf5\x6e\xbf\xa3\x2d\xb6\xfc\x59\x88\x7b\x49\xf3\xbb\xfb\xfd\xae\
+\xef\xf3\xde\xfb\xbe\x77\x39\x0c\xc6\x59\x7a\xd5\x50\x8c\x1f\x06\
+\x69\x24\x8e\x2d\xf4\xc3\x21\x8e\xc0\xb0\x30\x9e\xe7\x1d\x2c\x0f\
+\x5d\x0c\xc7\xdf\xb0\x73\x50\xcf\x03\x5c\x3c\x9b\xe1\x3f\x08\xd3\
+\x30\xcc\x73\xb1\xea\xb7\x41\x0a\xc3\x21\x2b\x80\x24\x36\xeb\xa4\
+\xc4\xe2\x99\x12\x42\x1e\x42\xe2\x20\x43\x34\xe4\x1c\x06\x1d\x1c\
+\xf4\xd9\x39\xc6\x68\x73\x9a\x4d\xc3\xec\x2f\xb4\x93\x3f\x58\xbd\
+\x3a\xa0\x75\x5a\x80\xb4\x93\xf7\xc3\x25\x94\x68\xfd\xfc\x40\x72\
+\xe7\x82\x60\x32\x30\x4c\x4c\x00\x3f\xc9\xc3\x38\xfa\xa1\x0c\xa0\
+\xd3\xc2\x40\x83\xd9\x7e\xc7\x68\x65\x3e\x71\x3a\xd8\x43\x86\x2c\
+\x25\x37\x25\x20\xf9\xf8\xbd\x70\x85\x94\x7c\x39\x36\x80\xdc\x9e\
+\xa6\x96\x8a\x83\x28\x1c\x18\xee\x51\x6e\xbc\xe7\xd2\x4d\xc4\xd0\
+\x0d\x2a\x1d\xf4\x8f\x70\x70\xce\x64\xb3\xb6\x98\xe9\xad\xd5\x59\
+\x61\x07\xa6\x04\x24\x95\x9b\x9e\x8d\x09\x14\x97\xe6\xe9\x15\xe1\
+\xfe\x24\x01\x9c\x97\x23\xc1\x29\x8f\x56\x8c\xf7\x02\xb9\x59\x14\
+\x21\x40\x9c\xf0\xc3\xcd\x87\xc6\x5b\xf7\xe9\x75\xf5\x1b\x66\xb5\
+\x4c\x0a\x28\x38\x75\x6f\x77\x6a\x94\xa2\x60\x5e\xb8\x44\xe1\x44\
+\x91\xf3\xbc\x97\x30\x1e\xe7\x98\x6b\x8f\xf7\x50\xdc\xab\x44\x04\
+\xd0\x74\x8f\x86\xc3\xad\xe6\x3d\x35\x1b\x35\x45\x93\x02\x72\x8f\
+\xb4\xdf\x78\x2b\x59\x1b\xaf\x70\xd7\xdd\x27\x52\xf7\xcd\x58\x36\
+\xe3\xfe\x4c\xa0\x52\x0d\x0c\x3b\xa1\xe4\x42\x77\xf3\xc9\x8d\xba\
+\x45\x53\x02\x76\x65\xc6\xc4\xdb\x1c\xbe\xce\xc7\x22\x75\x5f\xfb\
+\x9c\x79\x91\x84\x52\xbd\x7b\xaa\xc3\xf2\xd3\xa6\x58\xff\xa9\x00\
+\x7c\xf1\x1a\x2d\x4b\x11\x84\x88\x1b\x57\x6f\xa1\x34\x42\xe7\x8c\
+\xe9\xe2\xeb\x1b\x08\xb4\x31\xc2\x3a\x61\xdb\x89\x9b\x1d\x95\x5b\
+\x12\x62\x27\x05\xbc\x72\xa4\xed\x62\xce\x62\xf5\x92\xd9\x2a\xb9\
+\x1f\x37\x59\x6f\x7a\xd9\x78\xa1\xa5\x24\xc0\x15\xa3\x05\x3e\xab\
+\xed\x36\x2b\xe3\xa2\xce\x58\x59\x67\x9d\x83\xc3\xaa\x78\x8e\xeb\
+\xa9\x5e\xa3\x18\xf5\x86\xc5\xbf\x53\x93\x93\x91\xa8\xfa\x6e\x7b\
+\x76\x9c\xc2\xce\xc0\x84\x42\x4f\xd6\x45\x82\x91\x48\x60\x3b\xea\
+\xe7\x5d\x95\xb7\x41\xa3\x0a\x86\xa8\x59\xc1\x60\x42\x7a\xb4\x0e\
+\x30\xcd\xdd\x36\xe6\x53\xbb\x9d\x39\x5d\xbb\x2e\xd4\x81\xa9\x5e\
+\x3b\x1d\x99\xa0\x0e\xf8\xea\xa3\xbc\xc4\xe7\xe6\x68\xe5\xf8\x08\
+\xd2\xc2\xc9\x22\x67\xb8\x0b\xc6\x21\xa5\x85\x52\x70\xc8\xbd\x00\
+\x11\xb6\xc5\x28\x72\x1a\x3d\x77\xa4\xb6\x13\xba\xee\x3b\x60\x7d\
+\x4a\x1c\x50\x22\x0c\xd0\xd0\xc3\x10\xda\xbf\xd0\x47\xd3\x97\x7a\
+\x6d\xdb\xac\x36\xfb\x81\xd1\xa0\x94\x1b\x7f\x9e\x3f\x37\x52\x71\
+\xf0\x8d\xb5\xfa\x05\xcb\xe2\x95\x40\xa1\xf0\x84\x03\x96\x75\x4d\
+\x1c\x8e\x08\x22\xdc\x15\xb5\x50\xc6\xae\xde\x61\x38\x5c\xd3\x09\
+\x0f\x69\x0e\x72\x53\xf4\x20\x93\x90\x63\xfa\x08\xa2\x0b\x41\x55\
+\x74\x58\x1e\xd6\x9b\x2c\x99\x63\x59\xfb\x67\x95\xe9\xc4\x7e\xc4\
+\xf7\xa5\x6f\x3f\x93\x94\x34\x2f\x02\xac\x34\x0b\x52\xb1\x08\x66\
+\x88\x71\x70\xa0\x8c\x4c\x66\x1b\xfc\xdd\x3b\x04\x8d\xb7\xcc\xd0\
+\xf6\x8f\x05\x12\x9e\x08\x87\xd4\x85\x51\x40\xf9\x11\xe0\x3d\x1e\
+\x42\x6b\x0b\xda\xdc\x1d\x62\xe1\xeb\xa6\xbe\xc3\xde\x65\x05\x72\
+\x55\xe9\x96\xb5\x4b\x35\xfb\xbe\x29\x5c\x01\x3f\xd6\xdc\xe6\x8f\
+\xd7\x76\x58\xad\xc3\x0e\xab\x95\x66\x46\x12\xf5\x2a\x6d\x44\x90\
+\x04\x62\x35\x4a\x58\x34\x3b\x02\x14\x72\xf1\x94\xcd\x80\xe3\xae\
+\xd7\xc9\xee\xba\xbb\x9d\x3e\x00\x49\xea\xfe\x78\x8a\x24\xce\x94\
+\x17\x67\x68\xea\xae\xf7\x42\x49\xf9\xd5\x73\xac\xe1\xd5\x74\xe1\
+\xec\x8f\xce\x11\x5e\x17\x42\x01\xcd\xfa\x8a\x3d\xb1\x2f\x5d\x59\
+\xc8\x29\x80\xcf\x0d\xc6\xfe\x09\xcf\xe2\x4b\xf7\x16\x2c\xd2\x2b\
+\x4b\x72\x56\x3e\x19\x7a\xfe\x5a\xcf\x03\x8d\x52\xbe\x69\x5f\xe1\
+\xb2\xea\x5f\xaf\x0d\xd8\x93\xf5\x81\xf0\xc0\xea\x9a\x6c\xcc\x33\
+\x7c\xfc\x23\xa7\x9e\x3a\x09\x5a\x39\xd1\xfa\xde\x89\xb6\xa6\x09\
+\x00\xbf\xa7\xf7\xe2\x8c\xdd\x91\x1e\xac\x90\x14\xc8\x24\xd4\x72\
+\x07\xcb\xd5\x68\x55\xb2\x0f\x97\xa4\x24\x36\x14\xe7\xea\x43\x05\
+\x3d\x68\x66\xdc\xfb\xca\xd3\xdd\x6e\x48\xb0\x0c\xc0\x70\x7d\x00\
+\xb6\x1f\xbb\xbe\xf3\x3f\xb3\xf5\x36\x7d\x61\xd5\x07\xef\x67\xcd\
+\x29\xce\x5b\x3e\x13\x84\xde\xb2\xd0\x30\xba\xf2\x6e\xcf\x38\xe6\
+\x22\x05\x21\x69\xee\xf4\xdb\x61\xeb\xa1\x2b\x4d\x97\x3b\x07\x9e\
+\x9f\x36\x20\x24\xbf\x42\x11\x2a\x15\xed\x28\x58\x19\x5b\xf4\x62\
+\x8a\x0e\x57\x2b\x28\x9f\x73\x61\x46\x85\x16\x6e\xbc\x69\x86\x2f\
+\x2a\xfe\xaa\xbf\xdc\xfe\xa0\xc8\x5c\x96\xdd\x3c\x6d\x80\x60\xf2\
+\xec\xa3\x32\x12\xf8\xd5\x73\xb5\xc1\x2f\xcd\x8b\x0e\x5a\x12\x1d\
+\x21\x0b\x8c\x0c\xf5\x1f\x9d\x13\x9d\x4a\xce\x07\x48\xc5\xd8\xeb\
+\x7b\xea\xda\xcf\x5e\xed\x29\x60\x2a\xf3\x1b\xdc\x15\x7c\x0c\x5b\
+\xb1\x3f\x24\xed\x29\x75\xb4\x26\x5c\xae\x3e\x66\xe8\x90\xa1\x0f\
+\x84\xb4\xa2\x17\xe6\xe7\xcd\xd5\x05\x41\xfe\xc7\x86\xa3\x83\x43\
+\xf6\xcd\x50\xb7\x85\x79\x7c\x80\x97\x55\xfe\x69\x9c\xb1\xe3\x50\
+\xd3\xb7\x99\xcb\xb4\xf9\x97\x5b\x4c\xa6\xdf\x1b\xba\xf2\xa1\xb1\
+\xf0\xbc\xe7\xfc\x7f\x01\x16\x6c\x28\x23\xd4\x11\xfe\xab\xaf\x75\
+\xf4\x97\xe0\xc0\x75\x19\x7b\x2c\x5f\x62\x84\xc8\xc0\x5c\x7a\x73\
+\xec\x23\xe0\x5f\xeb\x0f\x02\x23\x97\x32\x03\xf4\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x5e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x25\x49\x44\x41\x54\x78\xda\xad\x95\x6d\x4c\x5b\x55\
+\x18\xc7\xff\xb7\xbd\xa5\x6f\xd0\xd2\x52\x79\xb1\x80\x6b\x29\x0e\
+\xd8\x10\x64\xbc\x4e\xb6\x22\xcb\xd8\x32\x61\x38\x37\xd8\x86\x1a\
+\x67\x5c\xc4\x18\x33\x63\x96\x98\xb8\x0f\xb8\xa9\xc9\x4c\x94\x25\
+\x1a\x23\x61\xc6\x90\x98\xb0\x68\xd4\xe9\x02\x1f\x18\xce\x0c\xc8\
+\x60\xb0\xc1\x1c\x82\x82\x01\xc6\x22\xe5\x65\x50\x0a\xb4\xbd\x6d\
+\x6f\xef\x9b\x07\xbe\x03\xd7\x8c\x7f\x72\xee\x3d\xf7\x3c\xcf\x79\
+\x7e\x27\xcf\x39\xe7\xb9\x14\x36\x90\x34\x59\x94\x0b\x0a\xe5\xa4\
+\x5b\x42\x5a\x26\x24\xf2\xa4\x30\x44\xde\x1d\xa4\xd7\x4a\xd9\x6e\
+\xf7\x63\x13\x51\xeb\x19\xb8\xf1\x82\x5a\x4a\xa1\x3e\x4b\xa9\x34\
+\xa9\x94\xc6\x0f\x8a\xe6\x01\x9e\x83\xc4\x08\x90\x78\x25\x61\xd0\
+\x63\x80\xa2\x9e\x76\xf4\x35\xfe\x6f\x40\x70\x34\xaf\x56\xa1\x8a\
+\xad\xa7\xb5\x29\x7a\x85\x9a\x0c\xd0\x43\x40\x38\x04\x30\x41\x20\
+\x10\x26\xdf\x14\x44\x8d\x16\x3c\xaf\x64\x44\x56\x3c\xab\x4d\xbf\
+\xdb\x28\x1b\xe0\x1d\xca\xc9\xa5\x54\x51\x57\x34\xc6\x92\x54\x5a\
+\x1d\x4b\x46\xa6\xc8\x42\x49\x26\x02\x01\xc0\xcd\x20\xe4\x67\xa1\
+\x51\x47\x00\xf1\x46\xf0\x91\x1a\xb0\x73\xde\x31\x31\xcc\xd5\x18\
+\x32\xef\xf5\xcb\x02\xb8\x07\xb2\xce\x6b\x8c\xd9\x1f\xea\x2d\xfb\
+\x00\x71\x99\xb4\x07\x80\xf0\x17\x21\x93\xe0\x1e\x3f\xfc\xbe\x30\
+\x22\xb4\x5a\x18\xe2\x2d\x80\x3d\x1e\xcc\x34\x87\xd0\xfc\xc8\x05\
+\x4b\xce\xe0\x79\x59\x80\x99\xde\x1d\x1d\x66\xeb\x21\xa7\x5a\x97\
+\x44\x02\x2f\x90\xcd\x18\x82\xe0\xf3\x20\x4c\x00\xc1\x00\x07\x96\
+\x15\xa1\xd2\x47\x21\xc6\x1a\x07\xca\xba\x07\x2c\x63\x82\x67\xf4\
+\x52\xe7\x93\x45\xc3\x25\xb2\x00\x93\x5d\x69\x8b\x49\xa9\x87\xcc\
+\x4a\xc5\xea\x4e\xcf\x82\xf5\xb9\x11\x5c\xf6\x21\x1c\x08\x91\x9c\
+\x8b\xa0\x28\x1a\x3a\xb3\x09\x46\xab\x0d\x88\xae\x82\xa0\x4c\xc6\
+\x54\xef\x11\x8f\x6d\xef\x68\x8c\x2c\xc0\x68\xbb\x63\xd1\x91\x96\
+\x6d\x56\x52\x3c\xb8\x10\x8f\x10\x13\x40\x70\x85\x01\xc7\x92\x13\
+\x24\x4a\x50\xaa\xd4\x30\xc4\xc5\x43\x9f\x50\x0c\x44\x56\x40\x40\
+\x08\x63\x5d\x47\x3d\xe9\xfb\xc7\xe5\x01\xee\xb7\xda\x3a\x1c\x36\
+\x9b\x53\xa7\xd5\x23\x1c\x14\x10\x64\x58\xb0\x64\x83\xa7\xd5\x07\
+\x89\xf3\x2a\x40\x83\x0c\xcb\x3f\xa0\x63\x8e\x03\x11\x29\x60\x56\
+\x46\x30\x7e\xe7\x4c\x67\x76\xf9\x43\x79\x29\xea\xfd\x39\xa9\x65\
+\x7b\xaa\xbd\x3c\xda\x68\x84\x14\x12\xe1\xf7\x87\x31\x25\xe4\xe2\
+\x09\xe6\x26\x94\xb4\x12\xda\x68\x0b\xb4\x89\x05\x80\xae\x6a\x6d\
+\xba\xcf\x33\x8c\xbf\xbb\xdf\xf9\xae\xf0\xd8\xd4\x6b\xb2\x00\x9d\
+\x57\x12\x7e\xd4\xe9\x34\xc7\x72\x76\x67\x43\xc1\x91\x43\xe4\xe5\
+\x11\xf0\x87\x20\x72\x2c\x3c\x91\xa5\xd8\x16\xfb\x08\x30\x57\x13\
+\xcf\x64\x72\xd5\x25\xdc\xbd\x7e\x12\x41\xff\x54\xa3\xb3\x66\xee\
+\x2d\x59\x80\xeb\x4d\x16\x2d\x19\x9d\x74\xa4\xd9\xe3\xec\x19\x29\
+\xe4\x72\xf1\x90\x3c\x41\xb0\xc1\x20\xdc\x86\x03\x48\xb4\x29\xc9\
+\x45\x3b\x49\x3c\x05\x04\xbc\x2e\xdc\xba\x5a\xf1\x80\xa2\xf0\x74\
+\xd9\x29\xb7\x20\x0b\xb0\xaa\x96\x46\x53\x3e\xb1\xdc\x7e\xbe\xa2\
+\x44\xa1\xd7\xeb\x81\x65\x3f\xe0\xe3\xe0\x32\x1d\x46\x62\x42\x1e\
+\xf1\x48\xc5\xcc\x44\x2b\x06\x6e\xbc\xcd\x12\xbf\x9d\x87\x6b\x97\
+\xc6\xb1\x8e\xd6\xad\x45\x3f\x7d\x19\x75\xc1\x9e\xf2\x54\xdd\xb3\
+\xf9\x99\x64\xb1\xa4\x3c\x28\xb4\x70\x69\x4e\x20\x31\xea\x85\x35\
+\x7b\x77\x4b\x35\x66\x1f\xb6\x9d\xae\x3a\xe3\xfb\x16\x1b\x68\x5d\
+\x40\xf3\xe7\xba\x08\x9a\xa6\xe7\x5e\x3a\xb0\xcf\x44\x1b\x68\x20\
+\x2e\x19\xae\xc0\x29\x02\xd8\x49\x6a\x9e\x1f\x57\x1b\x6c\x33\xc7\
+\xdf\x75\x5b\xb1\x89\xa8\x8d\x8c\x4d\x17\xd5\xcd\x19\x76\x47\x4d\
+\x7e\xd6\x33\xa4\x2c\xa4\xc3\x15\x7a\x95\x00\xb6\x61\x64\xa0\x01\
+\x7d\xed\xef\xfd\xf0\xfa\x39\xf6\xc4\x63\x01\x2e\x7f\x44\xef\xa7\
+\x95\xca\xf6\xc2\x9c\xe7\x90\xb2\x6b\x2f\xe6\x35\xd5\xa0\x16\x26\
+\xd0\xdd\xf6\x3e\x56\x16\xc7\xca\xde\xac\xe3\x7f\x7b\x2c\xc0\xaa\
+\x5e\x69\xf8\x5e\x2a\x62\xbf\x02\x3c\x3d\xd0\xdb\xab\xb0\xe4\xfe\
+\x17\x5d\xdc\x69\xfc\xf2\xc1\x1b\x9b\xce\x95\x05\x28\xfb\x66\x4c\
+\xaa\xdc\x61\x44\xb1\x3d\x0a\xd7\x86\x96\xc8\xef\x40\xc0\xcd\xc1\
+\x79\xf4\x9d\xdb\xb5\x35\x80\xd2\xaf\x47\xa5\x23\x99\x26\x54\x66\
+\x99\xd1\xd4\xf3\x88\x00\x44\xfc\x7e\x7f\x16\xfd\x75\x05\x5b\x03\
+\x70\x7e\x31\x2c\x1d\xcd\x8e\xc1\xf6\x78\x2d\x7a\x26\xbc\x6b\x80\
+\x1b\xfd\x33\xf8\xe3\x93\xdd\x5b\x03\x28\xae\x1f\x94\x9c\x0e\x03\
+\x0c\x5a\x1a\x0c\x09\xee\x5a\x0c\xa2\x7f\x64\x01\x7f\x7e\xba\x67\
+\x6b\x00\x85\x17\xef\xfd\x6a\x8d\x56\x55\x26\xc7\x68\x10\x22\x80\
+\xf1\x69\x2f\x66\xdd\x81\x6b\xc3\x9f\x39\x5f\xdc\x12\x40\xde\xc7\
+\x77\x8a\x05\x4e\x78\x59\x14\xc4\x83\x02\x2f\x40\x14\xc5\x36\xd2\
+\x6f\x1e\xb9\x54\x7a\x4b\x0e\xe0\x3f\x68\xd6\xac\x28\x34\x9a\xe6\
+\x48\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x28\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xef\x49\x44\x41\x54\x78\xda\xb5\x95\x4d\x48\x54\x51\
+\x18\x86\xdf\xd1\x71\x6a\x26\x4d\x6d\xb4\xfc\x29\x1a\x35\x2a\xca\
+\x16\x11\x88\x6b\x17\x12\x6e\x46\x88\x02\x8d\x0a\xc5\x45\xb6\xa8\
+\x90\xca\x96\x2d\x5a\x47\xd0\x3a\xa8\x20\x88\xa0\x45\x91\x30\x08\
+\x3a\x96\xa5\x59\x94\xf6\xe7\xa8\x99\xa3\xa5\xa3\xcd\xe4\x34\x92\
+\x33\xce\xbd\xe7\x9e\x7b\xfa\xce\x9d\x51\x23\xf2\x2f\x6f\x07\x2e\
+\xe7\x2e\xee\xf9\x9e\xf3\xbe\xef\x77\xce\xb5\x60\x85\x91\xd3\xd8\
+\x2f\x84\xc6\xa0\x33\x15\xba\xaa\xd0\x13\xa7\x67\x0e\x5c\x51\xc0\
+\xe9\x5d\x30\x06\xed\x59\x9d\x65\xa9\xf5\x96\xd5\x00\x4e\x56\xe6\
+\xa2\x78\x8b\x15\x55\xa5\x9b\x70\xe3\x49\x04\xe3\x61\x15\x5c\xd3\
+\xc1\x39\x47\xcb\xbd\x0e\x68\x9d\xeb\x04\x54\x94\x65\x63\xf3\x06\
+\x0b\xca\x5c\x76\xb4\x0e\x44\x31\x12\xa2\xdd\x33\x0e\x4d\xe5\x18\
+\x6c\xef\x5a\xbf\x02\x09\xc8\x20\x40\x49\x8e\x0d\x6f\xc6\xe3\x18\
+\x09\x2a\xd0\x24\x80\x69\x18\xf2\x76\x9b\xa7\xa0\x38\x27\x8d\x00\
+\x0a\x29\x20\x8b\xa8\x38\x93\x00\xa9\xa0\xb3\xde\x2c\x40\x52\x01\
+\x59\x24\xed\xf9\x7f\x0a\x82\xaa\x51\x5c\xda\x34\xd4\xfe\x9c\x32\
+\x30\x45\x41\x4a\x12\x10\x5f\x08\xd9\xb0\xa8\xad\xcb\x2c\xc0\xa2\
+\x45\x7e\xca\x80\xa9\x9a\x91\x43\xa2\x8b\x4c\x07\x24\x32\x60\x9a\
+\x89\x0a\x64\x9b\x16\x39\xd3\xd0\x37\x91\xe8\x22\x99\xc1\x82\x02\
+\x33\xba\xe8\x77\x80\x9f\x42\x96\xbb\xe7\xc6\x41\x33\x25\xe4\x2c\
+\xb2\x28\x15\x2e\xa7\x35\xa9\x20\x61\x11\x4f\x76\x11\x33\xab\x8b\
+\x16\x01\x49\x8b\x28\xe8\x41\xef\x1a\x2c\x2a\xb8\x1c\xbc\x49\x53\
+\xbd\xd0\x35\x08\xb2\x40\xd7\x54\xe3\x16\x9d\x0f\xd9\x35\x6f\x91\
+\xec\xa2\x05\x40\x37\x7d\x13\x07\xdd\x7e\x30\xd6\xd1\x0c\x8b\x68\
+\x81\x2e\x4e\xe3\x6d\xf3\xf8\x9f\x00\x1b\x4d\xbd\xa5\xbb\x6c\xfb\
+\x0a\x68\xb7\x69\xd0\x61\x4f\x15\x70\x65\x5a\x90\x9f\x6e\x81\xd3\
+\x91\x82\xe6\x07\x93\x89\x43\x46\xc5\xe3\xb3\x31\xc4\x22\x3f\xa1\
+\xc6\x62\x54\x34\x05\x2c\x3e\x87\xe8\xc4\x18\x13\x82\x1f\x45\xdf\
+\xa5\x87\x7f\xb5\x48\x42\x04\xe7\xef\xf6\xba\xac\x7b\x0e\x14\x39\
+\xe0\xb0\xea\x70\x10\xc4\x61\x05\x0a\x09\x72\xcd\xfb\x03\x9a\xc2\
+\x8c\x53\xcc\x0c\x10\x47\x34\x1c\xc1\x6c\x30\x84\xd9\xc9\xaf\x9a\
+\xe0\xec\x38\x7a\x2f\xdc\x5f\x36\x83\xfc\x8b\x01\x82\xb0\xfe\x83\
+\xbb\xed\x25\xb5\xe5\x19\xf0\x4f\x33\x82\x10\x3c\xc3\x82\xeb\xde\
+\x30\x98\x22\x2f\x3a\xbe\x70\xa3\xce\x86\xbe\x23\xd8\xff\x81\x09\
+\x8d\xd7\x89\xd7\xe7\xef\xae\x2a\xe4\xbc\xa6\x2f\x36\xf2\x7f\xa8\
+\x7c\x7f\xfa\xce\xe6\xc3\xd9\xe8\x1e\x55\xb0\x91\x94\xdc\xe9\x89\
+\xd0\x29\xe6\x86\x45\x12\x30\xf3\x2d\x84\xa0\xef\xa3\x4a\xdf\x1e\
+\xd1\x5f\x9e\x7b\xbc\xa6\x2e\xda\x7a\x76\xd8\x26\x98\x3a\x5c\x71\
+\x28\x6b\xc7\xd5\xea\x5c\xb4\xfa\x62\xb8\xdd\x33\x63\x5c\x13\x12\
+\x10\x99\x0a\x61\xca\x37\xa0\x0a\xa6\xb8\xb5\xae\x33\x9e\x7f\x6a\
+\xd3\xdc\x46\x1f\x29\x51\x46\xab\xca\x9d\xf9\x57\xaa\xf3\x50\x73\
+\x2b\x40\x16\x71\x84\x03\x41\x4c\x0d\x7e\x52\xe9\x3f\xed\x66\x4f\
+\x1b\x3c\x4b\xad\x5f\x11\x20\x87\xb3\xa1\xd7\x4e\x10\x7f\x6d\xe5\
+\xf6\x6d\xaf\x02\x3a\xa6\x03\x21\x04\x7c\x9f\xc9\x16\xc5\xad\xb4\
+\x9d\xf0\x2c\xb7\x76\x55\x00\x39\xb2\x4f\xbd\x48\xa7\xdd\xfa\x0b\
+\x8b\x73\x73\xc6\xde\x27\x76\x3e\xe7\x39\xe6\x59\x69\xdd\xaa\x01\
+\x72\x64\xd6\x74\x64\x52\xe1\x6e\x3a\x58\x4d\xd1\x47\xee\x15\x8b\
+\xcb\xf1\x0b\x36\x49\x33\x37\xa2\x8b\x1e\x74\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xba\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x81\x49\x44\x41\x54\x78\xda\xa5\x95\x6b\x6c\x14\x55\
+\x14\xc7\xff\xf7\xce\xec\x76\x9f\x7d\x6c\xdf\x42\xe9\x6e\xbb\x5a\
+\xa0\xd8\x87\x25\x62\xac\xb1\x29\x3e\x12\x0c\x31\x36\xc1\x98\xb4\
+\x34\x21\x91\x54\x5a\xbf\x18\xbf\x80\x7e\xd3\x04\x90\x98\xa8\xa8\
+\x24\x88\xa8\x11\x0d\x6a\x4a\x04\xa3\x12\x9f\x35\x25\x8d\x31\x96\
+\x52\x5b\x48\xb5\x85\xd2\x87\x6d\x69\x17\xba\x6d\xf7\x35\xbb\x33\
+\x3b\x73\x3d\xd3\x56\xa3\x84\x52\xa4\x27\x39\x3b\xb3\xf7\xde\x73\
+\x7e\xf7\xde\xf3\x18\x86\xeb\xe4\xac\x1d\x0f\xd3\xe3\x69\xd2\x27\
+\x48\x6d\xa4\x21\xd2\x63\xa4\x47\x37\x2a\xe8\xc1\xff\x14\x76\xa3\
+\x41\x82\x98\xe3\x3e\xfa\xfd\x0e\x02\xc5\x8b\xc3\x11\xd2\x6e\xd2\
+\x57\x09\xf4\xe5\x8a\x00\xff\x80\x9c\x48\xa1\x47\x1b\x41\xee\xbf\
+\x6e\xea\x05\xc6\x70\xa0\x2a\x4a\x33\x2b\x01\x98\xd2\xe5\x46\x2a\
+\xad\x9a\x9b\xff\xa3\x03\xc9\x28\xc0\xed\xa4\x32\x8e\xd0\x78\x4b\
+\x55\xc8\x1c\x5d\x01\xc0\x94\x73\xe9\xd8\x06\x19\xad\x72\x3a\x74\
+\x6b\x2e\x90\x18\x26\x50\x08\x12\x38\x0e\x56\xcd\xe1\xb9\x15\x03\
+\xba\x32\xe0\xe6\x4e\x84\x52\xab\x11\xf1\xbe\xc4\xd8\xf8\x41\xe8\
+\xd3\x5f\x08\x9b\x50\x60\x65\x12\x76\x55\x5e\xc3\x3b\x2b\x02\x74\
+\xe7\xc0\xc6\xad\x50\x1c\x65\x2c\xe2\x3d\x60\x75\xc8\xb9\x8c\x8f\
+\xef\xd7\xb4\xc0\x31\xdd\xc2\x38\x14\x82\x54\x54\x4c\x62\xe0\xf6\
+\xaf\x28\x13\x15\x8e\xb5\x52\xf7\xea\xdd\x0e\xdd\xb6\x8e\x4b\x52\
+\x06\x83\x72\x21\x29\xa6\x8e\x24\xf4\x99\xd3\x9a\x24\xb9\xf0\x63\
+\xf9\x18\x1e\xb9\x2d\x40\x8f\x17\xb9\x42\xc5\x70\x5a\xad\xd5\xe6\
+\x7d\x3d\x0b\x42\x61\x10\x42\x80\x31\x01\x75\x44\x4f\x5e\x3b\x19\
+\x93\xaf\x7e\x1a\x19\xaf\xbc\x82\xd5\x3d\x3e\xa4\x97\x0f\x61\xf6\
+\x96\x01\xbd\x25\xc8\xd1\x67\xf1\xbd\x63\x7d\x4a\x59\x4e\x53\xa6\
+\x91\xbe\xd9\xcd\x85\xaa\x11\x40\x06\xe3\x0c\xcc\xc3\x45\xac\x33\
+\xca\x06\x9b\x46\xcd\x84\x5d\x45\x26\x8d\x65\x03\x78\xfb\x96\x00\
+\xe7\x4b\xe1\x16\x09\x9c\x93\xd3\x24\x7f\xf6\x8e\x7c\x91\xb5\xe3\
+\x0e\x26\xe6\xc8\x79\x72\x9a\x72\x94\x0a\x9c\xd9\xc0\x5d\x14\x98\
+\x3f\x62\x98\xd8\x3b\x94\x8c\x8f\xc4\xf7\x0a\x5d\x6c\xb9\xbb\x0f\
+\x9b\x96\x05\xf4\x6d\x02\x33\x54\xb4\x53\x96\x54\xe7\xb6\xf8\x78\
+\xd6\x53\x85\x82\xc1\x60\x42\x9d\x85\xd0\x26\xe6\xad\x98\x94\x05\
+\xe6\xca\x86\x3a\x9a\x14\x81\xf7\x2e\x19\x91\xb3\x41\xdd\x50\x74\
+\x89\xe6\x1c\xa5\xdd\x50\x6f\x0e\xb8\x17\x8f\x19\x0a\x5a\xb3\x1a\
+\xfd\x36\xcf\xe3\x3e\x61\xc9\x71\x48\x22\x1e\x84\x88\x9b\x89\x42\
+\xb6\x82\x6a\x4b\xf2\xd0\x09\x7c\xd0\x02\x56\x04\x4f\x0d\x20\xda\
+\x3b\x6d\xa8\xa3\x11\x2e\x34\xa3\x68\x7d\x27\x86\x96\x04\xfc\xfe\
+\x00\xb5\x07\xce\x7e\xb3\xe6\xb9\x56\xe7\x3f\x5f\xed\xb0\x6f\xc8\
+\xe6\x22\x32\x46\xce\xc9\x46\xc4\x69\x05\x87\x59\xd2\x8c\x59\xe8\
+\x96\x8a\x61\xa0\x10\xf1\xa1\x00\x66\xbf\xea\x17\x91\x5f\xc7\x98\
+\xa1\x68\x9b\xd7\x75\xe0\xa7\x25\x01\xfd\xb5\xf0\x73\xbb\x65\x20\
+\xf7\xd9\x87\x02\xae\x4d\xc5\x19\x4c\x0a\x5a\x45\xe4\x22\x60\xd0\
+\xdd\x93\x53\x31\x6f\x42\x2d\x88\x52\x0b\x96\x22\x70\x77\x19\xf4\
+\x70\x18\x53\x87\xcf\x20\xda\x39\x0c\x23\x91\xac\x5f\xdb\x26\x3e\
+\x59\x1a\xf0\x28\x1e\x94\x5c\xb6\xf6\xc2\x37\x76\x86\xe4\xec\x4c\
+\x87\x08\xf7\xcb\x50\x2f\xd3\x8c\x31\xbf\x7b\xb1\xe8\x7f\xfe\x34\
+\x96\x42\xf0\xd4\x7b\x60\x84\x42\x18\xdf\xd7\x8a\xf8\x00\xc5\x47\
+\x88\x27\xef\xfa\x56\x9c\x58\x12\x70\x71\x2b\x6a\xb9\xd3\xd6\x56\
+\xf0\x72\x33\x2c\x05\xab\xc8\x0f\xed\x3e\x31\xb4\xe8\x95\x2d\x58\
+\x98\x14\xa1\x01\xd6\x42\x30\x3a\x81\x31\x33\x83\x91\x17\xdf\x42\
+\x72\x62\x86\x82\x8f\x2d\x77\x7e\x8d\x6f\x96\x04\x5c\xaa\x43\x01\
+\x77\x3a\x46\xd7\xbc\xb2\xc7\x90\xb2\x29\x35\xe3\x03\x0c\xea\x30\
+\x98\x30\x08\xc1\xff\xde\x3e\xc5\x40\x26\x80\x97\x3e\x49\x7e\x68\
+\x57\x27\xf1\xe7\xee\x7d\x04\x8a\x81\x59\x51\xed\x3f\x85\x9f\x97\
+\x04\x0c\x6e\x83\x95\xdb\x6c\x13\xd9\xcd\xcf\x48\xf6\xb2\x72\x37\
+\x97\xc3\x12\x94\x41\xba\x21\x2a\x50\xd3\xa9\x29\xb4\x7b\xc1\x33\
+\xe6\x83\x2c\x44\x1a\x94\xbe\x0b\x08\xbc\x79\x88\x3a\xac\x22\x28\
+\x4c\x3e\xff\x09\x8c\xdc\x34\x4d\x2f\x37\xca\xaf\x39\x37\xde\xb7\
+\xdd\xd3\xd0\x94\x25\x67\x7a\x18\xa2\x04\xd0\x27\x09\x12\x5d\x38\
+\x01\x77\x51\x9a\xe6\x03\x4e\x1f\x92\xd3\x41\x2d\x78\xfc\xdd\x70\
+\xac\xf3\x17\x8f\xa1\x26\x0f\x17\x7f\x86\xe6\x65\x0b\x6d\xb0\x81\
+\x65\x48\x76\xfb\x99\xf4\xba\x06\xbf\xbb\xa6\x2e\x85\x3b\xd3\xa8\
+\x01\x11\x40\x8b\x2e\x2c\xb0\x38\xc9\x32\x9f\x78\xb3\x89\x70\xfb\
+\xc9\xc4\xcc\xe7\x1f\xd9\x85\x1a\x67\x54\x1e\xbe\xe2\xe3\x18\x5b\
+\x16\x60\xca\x50\x3d\x2a\xe5\xbc\xbc\x0f\x5d\x35\x5b\x4b\x1d\x55\
+\x35\x5c\xf6\xe4\xeb\xdc\xee\xe1\xa6\x89\xa1\x4c\x27\xf5\xe0\xb8\
+\x88\x75\xb5\xb3\x50\xfb\x69\x49\xbb\x32\x19\xa3\xce\xb1\xa7\xe8\
+\x03\x1c\xba\xde\xcf\x4d\x9b\xdd\x60\x3d\xbc\xdc\x61\xfb\xd8\x5e\
+\xb2\xa1\xc4\x5e\x56\xed\x96\xf3\xd6\xa4\x98\x37\x94\x9c\x1a\x35\
+\x62\xbd\x1d\x4a\xa2\xff\xbc\x61\xc4\xd4\x00\x39\xdf\xe5\x7b\x1f\
+\x3f\xdc\xc8\xc7\xb2\xed\x7a\x78\x27\xa8\x64\xb1\x9d\x5e\xf7\x93\
+\xf3\x4c\x7a\x97\x17\x53\xc9\x6c\xcb\x1d\xf4\xd6\xe2\x3d\xfa\xdf\
+\x6b\xf9\xb7\xfc\x05\xbd\xf5\xd2\x28\xbe\xfb\x8e\xa3\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x02\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xc9\x49\x44\x41\x54\x78\xda\xb5\x95\xcb\x4f\x13\x51\
+\x18\xc5\x4f\xdb\xa1\x58\xe4\x69\x41\xc4\x47\xe4\x29\x46\x31\xc4\
+\xf8\x80\x35\x89\x2e\x74\xc1\xc2\x68\xa2\xc6\x18\x08\x0b\x71\xa1\
+\x86\xf8\xfa\x33\xfc\x07\x4c\xd4\xc4\x8d\x3b\x8d\x26\xdd\xa0\x46\
+\x04\x44\xa3\x45\x4d\xc0\x56\x6c\x0b\x42\xad\xad\x62\x8b\x81\x76\
+\xe6\xde\x3b\xd7\xef\x4e\xc1\x48\x24\xb4\xea\xd8\x64\x32\x93\x66\
+\xee\xf9\xdd\x73\xbe\x33\x33\x0e\xe4\xf9\x2b\x3b\xfe\xb8\xcc\x34\
+\xf4\x61\x93\x65\xfa\xe6\xef\x75\xfa\xf2\x5d\xe7\xc8\xe7\xa6\x8a\
+\xd3\xcf\x8a\x49\x3c\xbc\xa9\xbe\xaa\x72\xf2\xed\x7b\x83\xae\x3b\
+\xd3\xbe\x63\x79\x41\x72\x02\xbc\x3d\x7e\x8f\xc9\xf4\xf0\x89\x83\
+\x9b\xab\x5f\x44\x4d\x7c\x8d\x26\x10\x1d\xff\x60\xd0\x7f\x9d\x7a\
+\xff\xa9\x9c\x90\x55\x01\x55\xbd\xe3\x6e\x12\x8a\x1c\x6a\xf7\xd6\
+\xb4\x35\x97\xe2\xd6\x48\x12\x4c\x17\x98\x8d\xc6\x11\x0b\x64\x9d\
+\xb0\x27\x3d\xbe\xbf\x02\xac\x3f\x37\xe1\x96\xcc\x98\xe8\xd8\x53\
+\xbe\x65\x5f\x63\x31\x3c\x2e\x89\x9b\x23\x29\x30\x83\x83\xd3\x91\
+\x8c\x25\x10\x1b\x7f\x67\x48\x72\xc2\x87\xce\xfa\xfe\x08\xb0\xa1\
+\x6f\x8a\x76\x6e\x04\xdb\x77\x16\x6f\xdd\xdb\x54\x84\x22\x17\xb0\
+\x86\x00\x96\x03\x43\x58\x00\xce\x04\xb9\x08\xe1\xfb\xa7\x29\x8a\
+\xcb\x38\x62\x3e\x3f\x7f\x3f\x2f\x40\xcd\xa5\xa8\x5b\x0a\x36\xb6\
+\x7b\x9b\xa7\xa1\xb5\xde\x43\xe2\x72\x39\x40\xe7\x60\x24\xae\x00\
+\xa9\xd8\x17\x64\x52\x73\x48\x7d\x0c\x31\xc9\x45\x97\x7c\x79\xe1\
+\xf6\xaa\x80\x8d\x57\xe3\x24\x2e\xde\x6c\xaf\xd5\x9a\x77\xd5\xd1\
+\xce\x35\x33\x0b\xd0\x00\x8f\x53\xe2\x06\x45\xc4\x75\x66\x89\x33\
+\xa6\xa2\x12\x98\x9f\x4d\x5a\x90\x64\x64\x82\xd3\xc6\x4e\xc2\x7f\
+\xf1\xce\x8a\x00\x25\x4e\x27\x7f\x4b\xa3\x7b\xc7\xe1\x96\x42\x68\
+\x90\x68\x5a\xe7\x84\x46\xc2\xd5\x6b\x9d\xa8\x2e\x71\xe1\xc0\xb5\
+\x08\x89\x73\x5a\xe5\xfc\x0d\xc0\x32\x69\xcc\xcf\x4c\x32\x29\xc5\
+\x51\x8c\x5e\xbe\xbb\x12\xe0\x3a\x9d\xba\xa5\xc9\x21\x39\x87\xc9\
+\x0d\x50\xb6\x68\x6b\x2d\x83\x94\x12\x1e\xcd\x81\x05\x2e\x11\x9f\
+\xe3\x96\xb8\xa0\x39\x04\x1e\x0d\xd3\x3d\x19\x40\xd0\x1a\xb5\x4e\
+\x28\xb8\x7c\x00\x53\x9e\xc1\xeb\x2b\xd3\x39\x6b\x5a\xd9\x3b\x26\
+\x3b\xf6\x57\xa0\xb4\xd0\x09\xd3\x34\x11\xf9\xc6\x90\x5c\x30\x2d\
+\x17\x59\xc0\x10\xf8\x40\xf7\xaa\x1a\x79\x00\xca\x09\xe0\x42\xad\
+\x57\xc3\x60\x28\x8d\xcf\x73\x0c\x82\x99\x56\x93\x82\x0f\x07\xc1\
+\x9e\xfe\x33\xa0\x02\x25\x85\x0e\xd4\x79\x0b\x30\x3a\xa3\x23\x1c\
+\x37\xc0\x05\xb5\x88\xda\x14\x20\x00\xb7\x1b\x10\x4a\x18\xd9\x88\
+\x98\x02\xd8\x12\x91\x9a\x81\x03\xf5\x95\x6e\xbc\x9a\xce\x20\x9c\
+\xd0\xad\xf6\x30\x2a\x42\xb0\x7f\xc8\x1e\x07\xcb\x01\x86\xf5\xba\
+\xf8\xe9\xc0\x1e\x80\x93\x00\x05\x16\x20\x44\x0e\xc4\xe2\x83\x66\
+\xb3\x03\x05\xa0\x19\xc4\xb3\x33\x50\x4f\x73\xd0\xae\x21\xff\x1a\
+\x51\x68\x71\x06\x0a\x12\xa4\x07\x8d\x0f\x74\xd9\xec\x80\x66\xa0\
+\xf2\xb7\x22\xb2\xab\x45\xaa\xa6\x0d\x4b\x0e\xe2\xba\x15\xcf\x7f\
+\x70\xe0\x5e\x36\x64\x15\x53\xb6\x45\x36\x01\xea\x08\xe0\x57\x35\
+\x5d\x72\xc0\x55\x4d\x6d\x70\x20\x39\xb3\xde\xaa\xf4\xfd\xa5\x23\
+\x43\x47\x1a\x42\x27\x17\x74\x2d\x19\xcb\xe9\xe0\x07\x9c\x03\x34\
+\x37\x32\x0f\xb6\x36\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x03\xe2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xa9\x49\x44\x41\x54\x78\xda\xb5\x55\x69\x48\x54\x51\
+\x14\x3e\x77\xc2\x20\x2a\x2d\xcc\x6c\xd5\x94\x56\x2a\x22\x35\xad\
+\x09\x75\x66\xb4\x05\x02\x83\xea\x47\xf3\x23\x0a\x0c\xca\xa8\x68\
+\x2f\x8d\x84\xca\x52\x4c\x0c\xd2\x16\x8a\x7e\xd4\x0f\x8d\x20\x7f\
+\xd8\x8f\x0a\x9d\x45\x2b\xd1\xcc\x16\x5b\x0d\x31\x9c\x16\x2c\x22\
+\xcc\x34\x2a\xb3\xd3\x79\xe7\xdd\x37\x73\x5f\x23\x05\x52\x17\xde\
+\xbb\xe7\x9e\x7b\xde\xf9\xbe\x7b\x96\xfb\x04\x14\xb5\x21\xfc\xc7\
+\x21\xa0\xb0\x15\x77\x25\x47\xf2\xe2\xd0\xbc\xa1\xca\x16\xf2\xf6\
+\x40\x46\x6e\x63\x0f\xcf\x45\x37\xdf\x91\x87\xfc\x16\xdc\x9e\x32\
+\x86\x9d\x1d\x49\x1a\xf6\x4f\x58\xef\x6f\xe8\x66\x82\xc7\x6b\x3b\
+\xc8\x6b\xde\x33\xdc\x92\x3a\x96\xd6\x08\x47\x17\x84\x31\x6f\x7f\
+\xcc\x8c\x03\xa0\x20\x11\xb5\x89\x55\xa8\xae\xd1\x6f\xc2\x7b\x16\
+\x5a\xe7\xd4\x77\x69\xee\xa0\xa4\xf6\x2d\xe9\x0e\x3e\xc6\xac\xd4\
+\x71\x6c\x94\xbf\x70\x24\xf4\xd2\xdc\xd6\xf9\x5d\x41\x40\x45\x12\
+\x2a\xbc\x29\xd2\x9a\x3e\x36\x2c\x04\x42\x48\xcc\xbe\xdd\xc9\x66\
+\xa7\x19\xe0\xc0\x03\x5c\x9f\x3a\x81\xa9\x14\xa4\x84\xc3\x57\x64\
+\x6e\x32\x05\x82\x67\xa1\xd3\x66\x96\x86\x7f\x41\x4a\xe4\x3d\x3d\
+\x57\x88\xfa\xc6\x10\x8b\x80\x7d\x35\x1f\x40\x3b\xe3\xb9\x9a\xd7\
+\xf4\xce\x6e\xc2\xb5\x04\xa0\x39\x29\xb0\x47\x40\xf7\x4f\x01\xbe\
+\xae\xde\xdf\x72\xac\xc4\x41\x2d\x00\xff\x52\x5f\x47\x8d\x08\x81\
+\x61\x16\x80\xbd\xee\xf7\xac\xbe\xe0\xd5\x00\x76\x37\xa0\xd3\x36\
+\x91\x15\xc7\x16\x8d\x85\xae\x3e\x8d\xa9\x52\x3d\x86\x2f\x0c\xc4\
+\x99\x4f\xa3\x71\x14\x4a\xc0\xe4\x49\x87\xd3\xb3\xa7\xaa\x83\x3f\
+\x28\xf7\xfa\xc8\x6a\xdb\x6d\x5c\x69\x8f\x66\x8b\xe2\xa5\x13\xa0\
+\xf3\x27\xc0\x9b\x4f\xbd\x03\xaa\x9e\xf1\x94\x83\x11\x74\x82\x9d\
+\xd7\x5e\x33\xc9\x2b\xde\x76\x02\xd8\xec\xc5\x0c\x5b\x0c\x03\x9c\
+\xcc\x88\x86\xcf\x7d\x92\x95\x52\x21\x6a\x6e\xfd\x91\x33\xb5\x08\
+\xca\x7c\x08\x18\x4e\x00\x9b\x2a\xdb\x39\x07\x95\xde\x97\xf4\xde\
+\x50\x8d\x4b\xec\x31\x6c\x96\x99\x38\x1a\x12\x22\x87\x40\xe8\xe0\
+\x41\x03\xe0\x8f\xf0\x83\x62\xd8\xd8\xf1\x05\x4a\xeb\x3a\x58\x73\
+\xc3\xa3\x01\x64\x5e\x47\xbb\x2d\xd6\x5f\x34\x46\x01\x19\xac\x85\
+\xd2\x10\x28\x30\xb8\xb7\x31\x60\xab\x9e\x4e\x3b\x91\xd7\xd3\x46\
+\xe2\x9a\xab\x68\x75\x4c\x1e\x50\xcc\xff\x36\xea\xdc\xad\x04\xe0\
+\xac\xc0\x78\xc7\x14\xbd\x5b\x25\xb2\x3f\xe4\x46\xf5\x48\x6e\xa6\
+\x22\x95\x15\x24\xd0\x68\x14\x63\x1d\x38\x41\x93\xe7\x05\x89\xab\
+\x2e\xe3\x6c\xc7\x34\x35\x7d\x60\x8b\x0d\x83\xbc\xb4\x28\x5e\xa3\
+\x50\x3a\x57\x11\xd5\x9e\xd6\xe4\x83\x9e\x57\x50\xd5\xda\x29\x19\
+\xea\x7e\x1e\xb9\x5b\x68\x6f\x79\x19\x4e\x4d\x9b\xee\xff\x40\x63\
+\x54\x93\x15\xa7\x14\x3e\x4a\x51\xd2\x32\xb9\x17\x26\x62\xa9\x67\
+\xee\x2b\x6a\x84\x16\xf7\x73\x12\x97\x5d\xc4\x49\x8e\x19\x32\x1c\
+\xba\x03\xf7\xe6\x04\x9e\xeb\x9b\x5e\x81\x33\xab\x9c\xe5\xb2\xd3\
+\x4e\x98\x1f\x1f\xe5\x6f\x34\x10\xc1\x57\xb9\xbd\xf4\x2e\x08\x25\
+\xa0\x2f\xdd\x4f\xe9\xbd\xf8\x3c\x8e\x4f\x9b\x09\x46\x2b\x6a\x77\
+\x8a\x6b\xeb\x7c\x66\xde\x40\x00\xeb\x36\xe9\x00\x17\x4e\x39\x21\
+\x91\x00\xd0\x14\x2b\x11\x08\x15\x7d\xb7\xe8\xc4\x1d\x59\x6d\xba\
+\xf2\xad\xeb\x09\xed\x3b\xce\x62\x84\x06\xa0\x24\xb8\x7a\x87\x95\
+\x0d\xef\xde\xf3\x41\xa6\x04\x38\x4f\x00\x09\x71\x51\x7f\xac\x9a\
+\xf4\xe2\x3a\x53\xba\x3e\x30\x40\xca\x29\x0c\x4b\x9f\xad\xf3\x91\
+\x37\x66\xfd\xee\x64\x36\x68\xbc\xef\x83\xb5\x59\xe6\x13\x04\xaa\
+\x45\xde\x59\x18\xa8\x28\x6b\xe1\x2d\x0e\x90\x91\xb3\x4f\xd5\xcd\
+\x04\x60\x2d\xc1\xa1\x12\x40\x47\x11\xf0\x38\x27\x45\xe6\xa0\x9d\
+\x72\x70\x89\xe5\x72\x99\x03\x50\xaf\x72\x75\x90\x6e\x56\x7e\x8d\
+\xa9\xda\x7a\x5c\x1a\x40\xd2\x71\xb4\x8c\x0a\x85\x90\x39\x93\xf4\
+\x1c\xd0\xe3\xcb\xb5\xb1\x55\x1d\xe5\x60\xc5\x46\xfd\x04\x15\x67\
+\x56\x83\x35\x3e\x3a\xb8\x5e\x95\xc2\x8d\x3e\xe4\xe1\xbf\x1d\xff\
+\x9a\x68\xfa\x56\xf5\x90\xb4\x09\x45\x1a\xfd\x66\x11\x1e\x0a\x96\
+\xb8\x58\x36\xfd\x78\xd8\x11\x54\x91\x81\xe6\x13\x81\x8e\x52\xff\
+\x40\x34\xc2\x73\x3d\xa6\xf2\xed\xab\x7a\x20\x0b\x78\x6e\xa1\x83\
+\x24\xd7\x1f\xfe\x86\xfd\x2d\x82\x96\xfd\xe9\x7e\x01\x06\x84\x9a\
+\xf3\x93\xd5\xe4\xf0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x05\xda\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xa1\x49\x44\x41\x54\x78\xda\x85\x56\x7d\x6c\x53\x55\
+\x14\x3f\xf7\xbe\xf7\xb6\xbe\x7e\xac\x05\xba\x8d\xcd\x2d\x0c\x0a\
+\x96\x01\x71\xa8\x04\x87\x66\x06\x3f\xa2\x46\xa2\x30\x11\x89\x10\
+\x8c\x98\x28\x73\x92\x88\x24\x86\x2d\x21\x41\x12\x12\x50\x12\x40\
+\x83\x64\xc0\x1f\x84\x90\x6d\x7c\xad\x33\xc4\x10\x43\x94\xa0\x44\
+\x45\x12\xe3\x67\xe6\x06\x29\x88\x03\xb6\xb1\x75\x5d\x3f\xd6\xd7\
+\xf6\x7d\x5c\xcf\xbd\xaf\x2d\x12\x98\xdc\xed\xe4\xbe\xbe\xdd\x9d\
+\xdf\x39\xbf\x73\xce\xef\x96\xc0\xff\xac\x78\x48\xae\x07\x06\x8b\
+\x81\xc0\x42\xdc\xe7\xe0\xab\xea\xdc\x9f\xfa\xd1\x7a\xd0\x2e\xa2\
+\x9d\x2b\x59\x6e\x5c\x98\xc8\x07\xb9\xd7\xcb\x64\xb7\xdc\x80\xdb\
+\x6a\x52\xe4\x5a\x45\x5d\x93\x3d\xd4\x39\x09\x88\xc3\x0d\x20\x17\
+\x01\x30\x06\x2c\x9b\x02\xa6\xc5\x84\x59\x5a\x2c\xc1\xf4\x74\x07\
+\x9e\x6f\x77\x37\x1a\xe7\xef\x0b\x10\xef\x92\x9b\x89\xe2\xd8\x28\
+\xfb\x2a\x03\xb2\x7f\x2a\x10\x97\x13\x08\xb5\xf0\xa4\x01\x84\xa1\
+\x7f\x0b\x9f\x0d\x00\xcb\xc4\xc3\x59\x86\x00\x49\x30\xe2\x43\x60\
+\x25\x22\x61\x66\xea\xbb\x30\x9b\x7d\x13\x02\x8c\x9d\x90\x5b\xa9\
+\xd3\xbb\x55\x29\xab\x51\x8a\xca\x4a\x81\x28\xe8\x91\xc8\x00\x34\
+\x77\x8c\x99\x98\x00\x7a\x37\xd1\x0c\x7c\xd6\x2d\xb0\x74\x3c\x93\
+\xb1\x40\x4f\x8c\x80\x31\x36\xa8\x5b\x19\x6d\xcb\xa4\x15\xc6\xf6\
+\xbb\x00\x22\xc7\xa4\x66\xaa\x7a\xf7\xa8\x55\xb3\x14\xa5\xd4\x07\
+\xa0\x28\xe8\x58\xc1\xe8\x71\x07\xca\xbd\xe3\xaf\x6e\x9b\x95\x45\
+\xac\x0c\x80\x6e\xe0\x23\x07\xb1\x80\x21\x88\x99\x1c\x03\x3d\x32\
+\xa0\x1b\xd9\xd4\x06\xff\x4a\x73\x5f\x01\xe0\x56\x87\xdc\x40\x95\
+\xa2\x43\x6a\x55\x30\x50\x5c\x51\x0a\xd4\x81\x51\x4b\x4e\xf4\x5b\
+\x0c\x8d\x4b\x3a\x0a\x19\x76\x9f\x5e\x2d\xf6\xc6\x17\xdb\x0b\xef\
+\x42\x27\x1b\x10\x13\x01\x31\x13\x2b\x66\x40\x36\x36\x02\xe9\xc8\
+\x50\xd8\x32\xf5\xb5\xe5\xab\xcc\xf3\x02\xe0\xe6\x11\xa9\xcd\x59\
+\x3e\x6d\x9d\xab\x66\x06\x50\x37\x46\x2b\xbb\x80\x48\x2a\x3a\xef\
+\x84\x2f\x7e\xb4\xe0\xc8\x6f\xb6\xb3\xae\x26\x2a\xf6\xe5\x6d\x96\
+\xd8\xd7\xd4\x01\x2c\x5b\x44\x21\x74\xfc\x31\xcc\xc6\x42\x8a\x30\
+\x93\x6c\x06\x52\x23\x03\x90\x8e\x46\xf7\x57\xbe\x61\x36\x91\xfe\
+\x43\x52\xbd\xec\x50\xcf\xf8\x66\xcd\xf5\x28\x53\xdc\x40\xd4\x22\
+\xa4\xc5\x05\x8d\x2f\x77\xc1\xc7\x07\x7f\x80\x8b\x66\x7d\xc1\x51\
+\xe9\x83\x8b\x85\xe3\x83\x87\xcf\x8a\xcf\x1c\x68\xa1\x74\x01\x36\
+\xbd\xfd\x38\x84\x3a\x17\x20\x00\xd6\x25\x63\x82\x39\x1e\x87\xb1\
+\x81\x9b\x09\x53\x37\x9e\x23\x57\x0e\x4a\x2d\xee\xb2\xf2\xed\xbe\
+\x19\x41\x90\xbc\xc8\x59\x91\x8a\xf4\x20\xc0\x4b\x27\x0b\xd1\xe7\
+\x23\xcf\x03\x0c\x5f\x3a\x57\xc8\xa4\x90\xc5\xd1\x47\xc0\x44\x00\
+\x2b\xc3\xdb\x58\x83\xf8\xc0\x20\xa4\x62\xe3\xad\xe4\x52\x9b\x14\
+\xf2\x07\x02\x8d\xee\xa9\x95\x40\x7d\x14\xeb\x5a\x8c\xdc\xdb\x19\
+\x70\x00\xbe\xf2\x14\xf5\x1d\x78\x5a\xec\xc1\x77\xce\x16\x28\xe2\
+\x4b\x00\x74\xd4\x81\x19\xc7\x3a\x60\x06\x9c\xa6\xf1\x48\x14\x46\
+\x07\x47\xbb\x49\xcf\x5e\xa9\xb7\xaa\x6e\x4e\xd0\xe1\xf3\x81\xe4\
+\x26\x98\x81\x03\x6b\x80\xfc\x2f\x3d\x25\x28\x0a\xce\xab\x2f\x14\
+\x74\xf3\x7b\x36\xc0\xb6\xcf\xcf\x16\xde\xf5\xfd\x69\x53\xd4\xd5\
+\xf1\x10\x98\x31\x4b\x50\xc4\x8b\x9e\x4d\x24\xe1\xc6\x95\xe1\x3e\
+\xf2\xfb\x6e\x3a\x3e\x73\x51\x9d\x53\x72\x3a\x40\x52\x25\x9c\x58\
+\x6c\x4d\x05\x69\xa2\x0e\xcc\xa2\xfb\x8e\x21\xec\x3e\xbd\x26\xd7\
+\x45\x47\xee\x78\x1f\x3a\x3e\x1f\xa3\x36\x30\x03\x53\xb4\x2b\x07\
+\x30\xb5\x34\x5c\xf9\x6b\x30\x45\x7e\xde\x49\xc7\x6b\x9f\x98\x87\
+\x00\x2a\x50\x15\x29\x2a\x96\x71\xb6\x50\x12\xe4\x62\x60\xd8\xa6\
+\x84\xf0\x79\xc8\xcd\x01\x1f\x5f\x86\x2d\xc9\x32\x40\x2c\x0d\x67\
+\x41\xc3\xee\x49\xa3\x43\xee\x98\xd3\x63\x09\x63\xba\x0e\x66\x5a\
+\x83\xcb\x7f\x0c\xa7\xc8\x4f\x3b\x68\xef\xec\x05\x81\x60\xb1\xd7\
+\x6b\x03\x38\x28\x66\x90\x03\xc1\x21\x63\x14\x9f\x09\xe5\x12\x04\
+\x5c\x23\x88\xa5\xdb\x20\x56\x1a\x27\x9a\x0f\x9b\x8e\x1f\xd1\x71\
+\xd6\x06\x00\x04\xb3\xb2\x3a\xa4\xe2\x29\x08\xf7\x46\xfb\xc8\xf7\
+\xdb\x68\xa8\xa6\x76\x6a\xe3\x94\x2a\x3f\xf2\xaf\xf0\xd9\xc2\x1d\
+\xa9\x52\xb0\x5d\x25\x3e\xc4\x12\xc6\x9e\xcb\x00\xd0\x01\x07\x00\
+\x34\x23\x8b\x00\xa6\xa0\xc8\x4c\x18\xc0\xb8\x74\x64\x2d\x91\x0d\
+\x07\x88\x0c\x25\xa1\xff\x6a\xa2\x9b\x7c\xfb\x11\x6d\x29\x7b\xa0\
+\x64\x7b\xcd\xdc\x0a\x3b\x72\x74\x4e\x15\x02\xaf\xbe\xf5\x2b\xf6\
+\xf6\xa3\x39\x1d\x42\xa3\x4c\x68\x11\x86\x2e\xb4\x88\x99\x96\xd0\
+\x23\xd1\xae\x6b\x2f\xc1\xb1\xdd\xd3\x6d\xaa\x74\xbb\xc8\xff\x5c\
+\x8d\xc3\xad\xa1\x4c\x2b\xf9\x66\x33\xa9\x77\xba\x94\x33\xb3\x1f\
+\xae\xf0\xa8\x25\x28\x0f\x32\x46\x5f\x44\xe0\xdd\xd6\x3e\x78\x6d\
+\x59\x39\x3c\xfb\x94\xcf\x06\xe1\x52\x2a\xf4\x88\xd9\x42\x67\xda\
+\x2d\xfc\xf5\xb9\x31\x08\x9d\x8e\xc2\x67\x9b\x2a\xed\x2c\x0c\x03\
+\xb4\x44\x1a\xfa\x7a\x13\x71\x4d\xb3\x9e\x17\x52\xf1\x55\x0b\x69\
+\x9b\x16\x28\x59\x57\x13\xf4\xdb\xe2\xa6\x60\x1d\x64\x02\x2b\xd7\
+\xf7\x40\xd3\x9a\x0a\x78\xe6\x49\xef\x6d\x59\x44\xb9\x16\x92\xcd\
+\x9d\x7f\x17\x83\xfd\xed\xc3\x70\xf4\x93\x6a\x74\xcc\x04\x7d\x1c\
+\xe0\xef\x30\xd2\xd3\x9f\xd9\xff\xc2\x0e\xd6\x24\xfe\xed\xcb\x0f\
+\x49\x83\xaa\x4a\x87\x66\xd5\xfa\x02\xa5\x15\x1e\x9c\x64\xa4\x4a\
+\xa2\x22\xf2\x1d\x07\xae\xc3\x2f\x3d\xe3\xf7\xbc\xad\xe6\xd7\xaa\
+\xd0\xf2\xe6\x14\xcc\x06\xa9\xc2\x8c\x18\x52\x37\x72\x0b\xbb\xe7\
+\xb2\x16\xce\xa4\xd9\xda\x25\x3b\xd9\xf9\x82\x5c\x9f\xfa\x80\x34\
+\xfb\x26\xcb\x7b\x66\x06\xbd\x8a\xcf\xaf\x62\x26\x58\x61\x42\x73\
+\xf4\xe4\x75\x37\x47\x11\xaf\x43\x3e\x13\x6e\x1c\x00\x5b\x38\x3a\
+\x9a\x81\xf0\x65\x4d\x8f\xc6\xcc\x0d\x4b\x77\xc1\x6d\xb9\x2e\x0c\
+\xd2\xfb\xa4\x75\xd2\x64\x79\xeb\xf4\x80\x53\x29\x2d\x77\xda\xfd\
+\xcf\x41\x80\xdc\x3e\xc9\x9d\x0b\xb3\xe7\x82\x31\x1b\x00\x0b\x0a\
+\xd7\xae\xa5\xf5\xd1\x28\xdb\xf2\xca\xa7\xec\xee\x0b\x27\xbf\x4e\
+\xac\x87\x66\x55\xa5\x1b\xab\xab\x1d\x81\x8a\x2a\x07\xb8\xdc\x48\
+\x17\xfe\x30\x71\x98\x89\x9d\x03\x10\x01\x60\x41\x32\xa9\xc3\xcd\
+\x1b\x59\xb8\x7e\x43\x0f\x6b\x69\xb6\x6b\xc5\x5e\x98\xf8\xca\xcc\
+\xaf\x63\xcd\x20\x2e\x7d\x8f\x9b\xae\xf2\xfb\x65\x0f\x66\x05\x1e\
+\x8f\x04\x4e\x17\x15\x9d\x9a\xd6\x4c\x88\xe1\xe5\x32\x8a\xea\x19\
+\x89\x98\xf1\x64\xd2\xea\xc4\xf3\xed\x2b\xf7\xc1\xfd\x2f\xfd\xff\
+\xae\xce\x26\xe0\x4a\xc7\x35\x7a\x21\xda\x84\x5f\x5b\x5e\x6f\x83\
+\x09\xbf\xb6\xfc\x0b\xfe\xe9\xc1\x45\x53\x0e\x88\xeb\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x95\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x5c\x49\x44\x41\x54\x78\xda\xb5\x95\x4b\x4c\x13\x41\
+\x1c\xc6\xbf\xd9\xb6\x2c\xdd\x52\x5e\x46\x51\x13\x45\x83\xa0\x40\
+\x3c\x79\xe2\x26\x17\x0f\xc6\x9b\x07\xa3\x47\x03\xe1\xe4\x41\x13\
+\x34\x31\xde\xaa\x12\x23\x09\xf8\x08\xde\xf5\xc6\xc5\xc4\x44\x09\
+\xc1\x44\x2f\x12\x8d\xa2\x89\x46\x31\xbc\x0c\xa0\x20\xa2\x80\xe5\
+\xd5\x6d\xe9\x8e\xdf\xcc\x6e\x6d\x41\x41\x4a\x64\x93\x7f\x67\x3b\
+\xdd\xfd\x7e\xff\xe7\x54\x20\xe3\x92\x37\x91\x0b\x07\x37\x68\x27\
+\xb0\x84\x30\xcd\xa0\x25\x68\xfd\x48\xe2\xa4\xb8\x82\xb7\xc8\xf2\
+\x12\xbf\xc5\x6f\xa3\x8e\x52\x8d\x94\x84\xdc\x0e\x3f\xf6\x62\x07\
+\xf2\x10\xc0\x27\x7c\xc7\x3b\xcc\x88\x49\x62\x7c\xe8\x84\xc4\x05\
+\x71\x9d\xb8\x6c\x00\xf2\x16\x22\x7c\xe5\x18\xb6\x61\x9f\x2c\x87\
+\x5f\x16\x62\x4e\xee\x64\x34\x16\x25\xa7\x11\x13\x63\xf0\x8b\x01\
+\xda\x73\x0c\x12\xd3\x2d\x9a\xd1\xb0\x1e\x71\xd9\x0a\x5f\x0a\x30\
+\x85\x02\x58\xb2\x0a\x51\x59\x86\xad\xf4\x1b\x92\xa6\xd6\x54\x8c\
+\xc6\x04\x6c\xf1\x14\x5f\xf1\x1a\xa5\x88\xa3\x48\xb4\x62\x66\x4d\
+\xf1\xbb\x7c\x73\x0a\x5d\x29\x80\xc4\x01\xc0\xa9\xf0\x04\x43\xdc\
+\x0b\x72\xcd\x55\x3f\xd2\x16\xb8\x9d\xa0\x45\x69\xf7\xb8\x33\x89\
+\x2e\xc6\x76\x54\xb4\xfc\x3d\x55\x4c\xb7\x01\x93\xf5\x5a\x40\x75\
+\x1a\x50\xee\x01\x72\x68\x41\xd7\x24\x01\xc2\xe1\xfd\xa2\x67\xf4\
+\xd9\x78\xc5\xf5\x23\x13\x37\x87\x2f\x84\x34\xb0\x5a\x2f\x44\x93\
+\x0b\x92\x11\x2d\x7c\x84\xa9\x6d\xe7\x7e\x18\xb1\x74\x0d\xfe\x04\
+\x58\x2e\x40\xbf\x4a\x71\xc1\x28\x28\x0a\x63\x96\xeb\x67\x5a\x2f\
+\x86\x30\x81\x1f\x54\xd8\x4d\x90\x4f\x35\x07\x53\x6a\xc8\x22\x6a\
+\x55\xf2\xed\x10\x82\xa2\x27\x03\xc0\xe2\x02\x15\x6e\xde\x65\x66\
+\x8a\x32\x01\x2a\x55\x31\x37\x55\x8c\xc1\x56\xdf\xe9\xa9\xa9\x9f\
+\xa7\x21\x9f\x6b\x21\x01\x05\x74\x64\x14\x42\x74\xae\x06\xb0\xd2\
+\x29\x82\x93\x06\x88\x79\xde\x2b\xb3\x79\x1f\xf7\xe0\x7e\x3e\xe7\
+\x0a\x03\x45\xae\x63\xaa\x6c\xbe\x41\x3e\xf3\x70\xa3\x00\x15\x85\
+\xaa\xc9\x92\x07\x08\xd3\xe8\xb5\xf2\x5c\xaf\x3e\x46\x30\xc0\x67\
+\x1e\xad\xa8\x81\x64\x27\x49\x55\x83\x3c\x4f\x3c\xe0\x75\x91\xf2\
+\x98\xf9\xc7\xac\x97\xaa\xc5\x0d\x00\x74\x04\x65\x94\xf3\xf1\xde\
+\x62\xb1\x4c\x7e\x37\xbd\x34\xc4\x20\x85\xad\xcd\x10\xa9\x8e\xca\
+\x1a\x50\xaa\x3b\x67\x4e\x8c\x20\xca\x97\x4b\xf4\xc1\x90\xd4\x22\
+\x0a\x1a\xe5\x4e\x8c\x4e\x94\xa8\xe8\x52\x51\x64\x05\x70\x4c\x3d\
+\x23\x4b\xc6\x3c\xde\x70\x52\xd5\x69\xf3\x40\x1f\x73\x49\x96\xce\
+\x41\x33\x85\x8e\x53\x20\x8f\x73\x0e\x36\xa6\x16\x51\xa9\x5b\x15\
+\xd0\x9f\x09\xb8\x03\x99\xb4\x73\xd4\x0f\x6d\xbe\x9c\xf8\x19\xd1\
+\xa0\x4b\xbb\x7c\x3a\x2f\xf2\xa4\xf2\xe3\x89\x9a\x79\x59\xcb\x54\
+\x85\xdd\x9a\xac\x0a\x18\xa5\xf8\x7d\x0f\x30\x7b\xcd\x90\x63\x23\
+\x26\xa6\x26\x45\x75\x4d\xfb\xc2\x87\x55\xcf\x97\x26\x46\xf0\x0d\
+\xe3\xf2\x20\x02\xa2\x4c\x37\x81\xa9\x9a\x40\xcf\x81\x12\xde\xe2\
+\xc2\x38\x1f\x09\xa3\x87\x73\xc0\x5c\x68\xc0\xb3\xd3\x41\x39\xdc\
+\xeb\x60\xe8\x3d\xac\x4b\x51\x7b\x71\xcd\x43\xec\x3c\xf6\x30\xbe\
+\x0e\xec\x67\xa2\x76\xb1\x99\x03\x48\x72\x7a\xfd\x1a\xa0\xfe\x4d\
+\x42\x9c\xe9\x3e\x1e\x8c\xdd\x18\xa7\x78\xbd\x06\xb4\xd5\x14\x4a\
+\x63\x3e\x01\xdf\x42\xc2\xaa\x1f\x88\xaf\x09\xd0\x90\x73\x2a\x19\
+\x78\xc9\xcf\x20\x21\x16\x1b\xa4\x58\x79\x2e\xa6\xb1\x28\x86\xe9\
+\xff\x4f\x26\xc9\x8f\x53\xe2\x2c\x3a\x34\xa0\xe5\x50\x91\x34\x63\
+\x71\x04\xe2\x04\xf4\xff\x1b\xe0\x41\x94\xc8\x63\x46\x70\x58\xb7\
+\xb3\x2a\xba\x52\x33\x30\xcc\xfb\x5a\xd1\xc8\xbf\x2a\x6f\x0b\x57\
+\xab\x8b\x65\x5e\xd2\x86\x95\x4c\x98\x75\xfd\xf1\xf8\x7a\x00\x2b\
+\x1a\x40\x28\x80\x88\xe8\xb1\x5c\x76\x69\x40\xa4\xb2\x58\xe6\x3b\
+\x36\x42\x92\x80\xbe\xec\x01\x6b\x5d\x1a\x70\xb9\x8a\x29\x54\x00\
+\x67\xf3\x01\x39\x04\x24\x36\x13\x10\x26\x60\xee\x7f\x02\x7e\x01\
+\xb5\xd8\x94\x80\xcd\x41\xfa\xaa\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x04\x59\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x20\x49\x44\x41\x54\x78\xda\xb5\x95\x7f\x4c\x55\x65\
+\x18\xc7\xdf\xe7\x7d\xcf\x39\xf7\x72\x2e\xc8\xe5\xee\x5e\x76\xaf\
+\x0a\x43\x09\xbc\xb8\x51\x8e\xe9\x48\xad\x28\x17\x3a\x8d\xa5\x5b\
+\x0b\xd6\x96\xd3\x6a\x73\x38\x6b\xce\xa5\x11\x69\x66\x73\xe8\xa8\
+\x19\xad\x65\xb9\x5c\xab\xf4\x9f\x98\xf1\x53\x57\x39\x1a\x83\xb5\
+\xe5\x28\x2a\x29\x20\x6a\x02\x72\xaf\x17\x49\xe0\xc2\xe5\xde\x7b\
+\xee\x3d\x3f\xde\xf7\xed\x10\x4b\x33\x45\xae\xa6\xcf\x1f\x67\x67\
+\xef\xf9\x9e\xef\xe7\x9c\x67\xcf\xfb\x7d\x01\xdd\xa3\x2a\x6e\xf1\
+\x2e\xbf\x14\xf4\xd7\xc0\xbd\x30\x7f\xb2\xad\xc0\x7b\x21\xf4\x5b\
+\x5b\xd8\x47\xd1\x5d\x07\xac\x6d\xf5\x66\x85\xd0\x44\x7b\xd0\xaf\
+\x64\x86\x2e\xc5\x1b\xc1\x5b\x2b\x5b\xfa\xca\x14\xf5\x6e\x98\xaf\
+\x6f\xcd\xf7\xa8\x62\xb4\x6d\x64\x24\x98\x3b\x15\x50\x3b\x11\x66\
+\xe5\x50\xf8\x75\xfa\x9e\x70\x34\x7c\xa4\xf7\xa9\x18\xfb\x3f\xe6\
+\x1b\x5a\xef\xb7\x33\xc2\xce\xc9\x82\xec\xfd\xb1\xab\x67\x94\x73\
+\xfd\x59\xc4\xa1\x1d\x0a\xbf\x74\xf3\x88\x3e\x55\x1d\x1b\xa3\x95\
+\x03\x2f\xa8\xfc\x8e\xcc\xbf\xc9\x4f\xe6\xc0\x3b\x1c\x2e\x87\xb7\
+\xe3\x87\xf3\x1a\x00\x3b\xa3\x6b\x7a\xd9\xc5\x72\x95\x41\xf6\xc7\
+\xd6\xb8\x60\x03\x41\x8f\xb0\x37\x8c\x28\x3f\xe4\xdb\xa9\xdd\x16\
+\x64\xed\x57\x4b\x93\x30\x26\x67\x3d\x0b\x9d\x2b\xbe\xef\xe9\xb2\
+\xc6\x43\x3a\xa2\x86\x96\x77\x71\xbb\xda\x37\xfd\x1c\xdc\x55\x52\
+\x87\x33\x5b\xce\x37\x0c\x03\xc2\x23\xb1\xc3\x98\x90\x83\xfe\x5d\
+\x89\x41\x1e\x6f\xce\x13\x44\x49\x6c\x5c\x99\xb3\x7a\x7d\xd3\xef\
+\xf5\x78\x7c\x30\x1a\x25\x22\x7d\xbd\x7f\x5b\xac\xe6\x1f\x0d\x38\
+\x2b\x85\xa5\x52\x8a\x70\x3c\xc5\x2d\x2e\x37\x21\x28\x1e\x34\xde\
+\x34\x67\xeb\x70\xa0\x42\xbf\x25\x64\xcd\x17\x5e\x62\x95\xa5\x4f\
+\x56\xe5\x14\x6d\x3e\xe3\xaf\xa3\x57\xfa\x23\x3a\xc6\x74\x58\x8f\
+\xeb\x0f\x0c\xed\xd0\x22\x57\x01\xd3\x17\xc7\x6e\xf2\x92\xec\x96\
+\x5e\xb1\xcf\xb7\x78\xa2\xe3\x71\xae\x4e\xd1\x7d\xe6\xf2\x5b\xc3\
+\x7b\x6f\x0e\x79\xb4\x76\x09\x24\xc9\xd6\x9a\xd5\x39\x45\x3b\x5b\
+\x26\xeb\x99\xff\x97\x10\x26\x88\x2b\x94\x19\x9b\x06\xca\xe3\x2d\
+\xff\xd6\xce\x00\x76\x91\x14\x41\xc6\xf5\x36\x8f\xf4\x70\xb2\x4b\
+\xc4\x21\x5f\x4c\xd4\x63\x6c\x1f\x62\xfc\xd0\xe5\x03\xc6\x0d\x90\
+\xe2\xba\xfc\xaa\xbc\xec\x25\xaf\x4d\x90\x2b\xec\xbb\x8e\xf3\x18\
+\x18\x9b\xd2\x63\x6a\xbb\x11\xe7\x1b\x03\x15\xd7\xeb\xaf\x6e\x34\
+\xfb\x76\xfc\x88\xc5\x41\xce\xda\x73\x65\x8b\x20\x21\x65\xb2\x5f\
+\xb1\x51\x8d\x55\x62\x01\xaa\x87\xf7\x5f\x7b\x69\xdd\xe7\xcb\x5e\
+\x4e\x5a\x08\xd5\x5e\x57\x3e\x6e\xea\x6c\x02\x65\xdc\x88\x33\x4d\
+\xff\x09\x21\x5e\xea\xdf\xad\x07\xfe\xfb\x31\xd7\x00\x2f\x12\xc0\
+\x12\x1c\x91\x52\xc9\x56\xfb\x22\xc9\xbe\xc0\x96\xa9\xf7\xf5\xfe\
+\x61\x30\xca\x5f\x75\xba\xed\x47\x7f\x2d\x1f\x63\x5b\x1a\x36\x3c\
+\xa7\x38\x83\xef\xdf\xe7\xca\x4d\x3a\xdd\xdd\x0c\x21\xbf\xaa\x5b\
+\x2c\x10\xd4\xc2\xea\x31\x5f\x05\x3d\x70\xb3\x76\x5e\x17\x15\x69\
+\x3b\x88\xc7\x84\x0c\xca\x59\xa2\x45\x4e\x13\xf8\x02\x5b\x06\x0c\
+\x0c\xf6\xfb\xed\xc8\xf5\x69\x61\xee\xca\x0e\x70\xaa\xcd\xe9\x69\
+\x6e\x68\xe8\xad\x85\x50\x40\x33\x37\x2a\x20\x23\xac\x9f\xa3\x1a\
+\x7f\xec\xf2\x41\x43\x9d\x13\x30\x5d\xa9\xdb\xf0\xf3\x52\x1a\x79\
+\xdb\xea\x21\x0e\x9b\x4b\x40\x0f\x3a\x8b\xd8\xb8\x32\xc2\x0d\x51\
+\x25\x05\x8b\x57\xf0\x9f\x87\x3a\xa1\xbb\xff\x02\x62\x0a\x53\x40\
+\xe7\x3e\x4d\xa1\xe5\x7f\x56\xd1\xf6\xd9\xa6\xed\x06\xc0\xbc\x2d\
+\x66\xd7\x45\xf4\xad\x35\x83\x2c\x93\x52\xb1\xc5\x92\x2a\xc0\x22\
+\x67\x16\x2f\x72\xaf\x43\x27\xfb\x8e\x41\x2c\x48\x91\xa1\x21\x0d\
+\x62\x9c\x1a\x61\xfa\x2e\xa3\x68\xef\xe8\x3b\x94\x27\x0c\x98\x81\
+\xc0\x2a\x61\x1e\x3e\x25\x3a\xf1\x7c\x31\x05\x10\x11\x67\x64\xe6\
+\x94\x98\xe6\x1c\x11\x8a\xe2\x5c\xe1\x3e\x43\x61\x6b\x46\xdf\x63\
+\x01\x74\x8b\x9a\x35\xae\x93\xcb\xe0\x23\x6b\x26\xde\x4a\x52\x41\
+\xc0\xc2\xb4\x0e\x10\x35\xa3\x8a\x08\x66\x12\x04\x19\xe3\x71\x78\
+\x66\xec\x28\xad\x43\x73\xd4\xec\x80\x52\x70\x60\x1b\x6a\x12\xd3\
+\xa1\x80\x24\x63\x19\x71\xb3\x0b\x0c\x31\x16\xe2\x43\x40\x51\x0f\
+\xd3\xd1\xd3\xe3\x1f\xb2\xf8\x1d\x03\xa6\xcb\xb6\x09\x36\x4b\x19\
+\x70\x42\x70\x9a\x53\x6e\x20\x8a\x39\x8a\xd0\x20\x17\xb9\x8e\x0a\
+\x83\xc7\x79\xf7\x5c\xe6\x73\x02\x92\x4a\x10\x16\x92\xd1\x29\x31\
+\x03\x4a\xcc\xc4\x95\x8c\x11\x14\x44\x06\xfb\x80\xa9\xb0\x7f\xf2\
+\x24\x4f\x28\x10\xe7\x3c\x32\xe5\x12\xb4\x58\x74\x42\x97\xe8\x30\
+\x7f\x62\x14\x0d\x00\xe6\x0f\x4d\x7c\x86\x22\x89\x98\x27\x04\xf8\
+\xbb\x55\x1b\x51\x15\xb6\x40\x29\xb1\xa2\x3d\x93\x27\x78\x63\xa2\
+\xe6\x09\x03\xe4\x27\x90\x8c\x25\x74\xda\xbc\x2d\x8e\x34\xa0\xdb\
+\x3a\x5a\xff\x02\xcc\x0b\xd9\x5d\x17\xd3\xf4\x15\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x20\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xe7\x49\x44\x41\x54\x78\xda\xb5\x92\x5d\x48\x53\x61\
+\x18\xc7\xdf\xa3\x3b\xdb\x59\xfb\x68\x3a\xd7\x96\xb3\x91\x1e\xdd\
+\x46\x17\x52\x82\x68\x05\x6a\x04\x41\x22\x26\x4e\xea\x2a\x11\xea\
+\x42\x73\xc9\xbc\x28\x2f\x23\xa8\x1b\x09\x5a\x45\x76\x21\x64\x9a\
+\x06\x6e\x66\x86\x26\x7d\x59\xa8\x20\x7e\x0b\x36\xbf\x96\x9a\x22\
+\xa4\x8b\x65\xdb\x39\x67\x7a\xf6\x71\xb6\xde\x29\x8b\xd2\xd4\xcd\
+\xe9\x0b\xef\xdd\xf3\xfc\x7e\xff\xf7\xcf\x8b\x80\x7d\x3e\xc8\x7e\
+\x40\xb5\xed\xf2\xcb\x52\x2e\x5a\x6e\x59\x75\x5f\xdc\x53\xc1\xf9\
+\x46\x31\x82\x0b\x31\xbd\x14\x43\xcb\x96\x56\xdd\x60\x96\xa2\x6b\
+\xf6\x4c\x90\x6d\x10\x47\xc6\x0b\xb0\x16\x19\x86\xe6\x2c\xd1\x10\
+\x4e\xd2\xfe\x5b\xb4\x27\x82\xec\x46\x31\x96\x20\xe0\x7c\xcc\x57\
+\x97\x9f\x6e\x9e\xd4\x83\x19\x08\x1f\x18\xb7\xf7\x5a\x6f\x7b\x4e\
+\x86\x2d\x80\xb5\x08\x71\x01\x36\x9c\xaf\xd6\xe1\xcd\x93\xf7\xc1\
+\x0c\xe5\x04\x83\x13\x84\xc9\x2d\x46\x92\x6d\x5a\x97\x2f\x2c\x01\
+\x84\x4b\x20\x7c\x14\xc2\x65\x6b\xc9\x29\x1a\x0c\x4d\x11\xf3\xce\
+\x28\x04\xb7\x6b\x5d\x8c\x7f\x66\xd7\x02\x08\x57\x24\x08\xb1\x31\
+\x8d\x4a\xc7\x0f\xc0\x87\xcd\x84\x85\x16\x21\x47\x20\xdc\x1d\x98\
+\xdb\x95\x20\xcf\x98\x7e\x5c\xce\x5b\xe8\xd3\xa8\x75\xec\xb5\x5a\
+\x48\x27\x18\xfe\x4a\x58\x9d\x22\x44\x01\x6b\x59\xfd\x7b\x36\x64\
+\x81\xc6\x98\x5b\x22\xe3\x0d\xea\x35\xea\x72\xf6\x4b\x98\xdc\xff\
+\x5b\x7a\x46\x6c\x0e\x24\x2e\xf2\x30\x84\x93\x1b\xe7\x43\x12\x14\
+\x36\x57\xde\x8b\xe2\x3d\xbd\x7e\x21\xe9\xca\x46\xb8\x3f\xf9\xf2\
+\xff\x76\x82\x16\x5c\x7d\xd5\x5a\x7c\x4e\x9d\xfe\x44\xc1\x7f\x07\
+\xea\x4d\x15\x6b\x5f\xb1\xbb\x6f\xd9\x05\xa4\x29\x4a\xea\xe6\xd0\
+\xfc\x56\x7b\x41\x09\xb4\xaf\xa7\x0a\xb2\x94\xd2\x86\x8c\xf8\x83\
+\xec\x26\x53\x13\xf8\x34\x67\x00\x6f\xba\x9b\x7c\x11\xb1\xa9\x09\
+\x8e\x8a\xfe\xb9\xed\x76\x77\x14\x94\xb6\x98\x0b\xb2\x54\x92\x86\
+\xcc\x78\x11\xbb\x6b\xce\x0e\x3e\x4f\x59\x80\xb1\xbd\xcb\x45\xc4\
+\xf6\xa4\xd2\xb7\x6a\x46\x77\xda\xdf\x56\xe0\x4f\x9e\x09\x93\x67\
+\xc2\xe4\x5d\xdf\xd6\xe1\x86\xb6\x7e\xab\x95\x7f\x20\xd9\xa7\xd7\
+\x2c\x06\xf3\xfa\x2d\x05\xa5\x2d\xb0\x16\xd5\x3a\xbc\x13\xc2\x3b\
+\xcd\x16\x50\x53\xf7\x61\xc5\x21\x3f\x8a\x83\x87\x39\x4b\xc1\xc0\
+\xb7\x15\x18\x27\x7e\x2d\xc2\x5a\x64\x81\xe4\xcf\x9e\x43\x78\x1c\
+\x84\x3f\x08\x1e\xbe\x49\x30\xd1\xc0\x49\x8f\x8e\x41\x1f\xb3\x58\
+\x08\x4e\xb1\xd3\xe6\xc7\x39\x3a\x6e\xdb\x77\x65\x52\x75\x75\xab\
+\xdb\x85\xab\x14\xa1\x24\xdf\x24\xf8\x52\xcb\x66\x8b\x25\xe8\x18\
+\x8a\x46\x24\x62\x71\xc5\xc0\x62\x7a\x04\xcc\x8e\x94\xf1\x3c\xa3\
+\x26\xc9\x95\x08\xe1\x21\x26\xdf\x24\x98\x36\x70\x4b\xf8\x82\x88\
+\x2a\x49\xc6\x10\x58\x78\x7f\x02\x10\x04\x03\x28\xbb\xc7\x7e\xaa\
+\xcc\x2b\xda\x0d\xf8\x1f\xc1\xe4\x0b\x8e\x9c\x2f\x64\x8d\x1e\x4a\
+\xad\x8b\xfe\x31\x50\x08\x48\xbb\x07\x90\x50\xe0\xa0\x98\xda\x33\
+\x37\x7c\x45\x61\x09\x60\x35\xb9\x42\x21\xab\x32\xe6\x58\xa9\x8a\
+\x9c\xad\x02\x14\xc9\x00\xc2\xce\xf8\x28\x8a\x69\x77\xbb\xbc\x77\
+\xce\x56\x80\xde\xb0\x04\xd3\x46\xae\x91\xc7\x8f\x2c\x60\xb1\x00\
+\x4c\xec\xf5\xa7\x1f\x21\x48\xe6\x2e\xbd\xc2\x74\x40\xb8\x2d\x1c\
+\xf8\x9f\x8a\x7e\x76\x08\x2e\xd1\x2b\xde\x3c\x82\xf4\xbc\x25\x6c\
+\x4c\x7d\xda\x35\x0f\x13\x2e\x38\x70\x7e\x03\xb5\x53\x56\x5b\x2e\
+\x01\xd5\xd9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x4b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x12\x49\x44\x41\x54\x78\xda\xad\x55\x7b\x50\x54\x55\
+\x1c\xfe\xce\x65\x1f\xec\x83\x15\x90\x15\x10\x41\x84\xf0\x01\xa5\
+\x62\x21\x99\x08\x59\x08\x0d\x89\x6f\x33\x65\x7c\xd1\x3b\x2b\xd0\
+\x66\xb2\x97\x25\x3d\xb4\x9a\x49\xa5\xa6\x6c\x74\x62\x8c\xa2\x32\
+\x53\x53\x8c\x0a\x5f\x03\x38\xf9\x8c\xa4\x06\x14\x53\x40\x10\x45\
+\xde\x2c\xec\xeb\xee\xee\x3d\xfd\xf6\x2e\x20\x8e\x30\xfd\xd3\xd9\
+\xbd\xbb\xe7\xfe\xee\xef\x7c\xdf\xf7\x7b\x9c\x73\x19\x86\x18\x4f\
+\x9c\xb0\xfb\x31\x8e\x05\x34\x9d\xc9\x19\x12\x18\x30\x92\xe6\x4a\
+\xba\x1c\x9c\xe3\x3a\x18\x4e\xd0\xf3\xe3\xf4\x6c\xdf\x97\x09\xea\
+\x8e\xa1\x70\xd8\x60\xc6\xcc\x12\x6b\x16\xe7\x3c\xcd\xcb\x21\xa6\
+\x70\x46\x2e\x84\xe8\x65\xb5\xc2\x39\xcc\x17\x8a\xae\x4e\xb8\x34\
+\x1a\xb0\x5e\xbb\x4b\xa9\x2a\xa6\x79\x51\x5e\x92\x26\xf7\x3f\x09\
+\x56\x1e\xeb\x89\x26\x55\xeb\x05\xd1\xbe\xdc\x4b\xb4\x31\x8d\x56\
+\x05\xa5\x42\x89\x18\xbd\x13\xc3\xbd\x05\xec\x6b\x51\x63\xce\x70\
+\x1b\xda\xad\x12\xaa\x2c\x0a\x38\x9d\x4e\xd8\xac\x22\x9c\x2a\x6f\
+\xce\x55\xea\xaf\x09\xed\xc3\x5d\x0f\xe9\xab\x06\x25\xc8\xf8\xa5\
+\x3d\x54\x50\x2a\x7f\x55\x88\xf6\xe8\x50\x2f\x1b\x0c\x3a\x6f\xdc\
+\xe4\x4a\xc4\xf9\x72\x18\x14\x1c\x12\x07\x0a\x1a\x05\x3c\x16\xe4\
+\x82\x44\x37\x1d\x0e\x86\xbf\xba\x05\x0c\x87\x1d\x66\x22\xb9\x09\
+\x0d\x5c\x2a\x55\x95\x4b\x74\x3e\x52\x90\xe6\xdf\x70\x07\xc1\x92\
+\x03\xcd\x5b\xd4\x4a\x61\xad\x46\xe9\x85\xbb\x7d\x81\x76\x11\xd0\
+\x2b\x80\x18\x03\x93\x01\x5d\x94\x8e\x6f\xea\xc9\x2f\x84\xe6\x92\
+\xe7\xba\x64\x66\xe8\x71\x91\x9f\x00\xd4\x8b\x02\x44\x87\x04\xbb\
+\x43\xda\xba\x7b\xee\x88\x75\xb7\x11\x2c\xdc\xd3\xb8\x42\x2b\xf0\
+\x5d\x63\x7d\x05\xa6\xd6\x7a\xa3\x96\x16\x76\x93\x73\xa4\x0f\x43\
+\x90\xda\x43\xa4\x26\xcf\xdd\xf5\x2e\x2c\x08\xa1\x67\x4e\xa0\xcd\
+\xc6\xd1\x62\x07\x9a\x29\x12\xa5\xc0\x60\x90\x1c\x50\x4a\x22\x5a\
+\x44\xc6\x2d\x92\xb0\x6a\xef\xe2\x90\x7c\x99\x60\x6e\x41\x9d\x81\
+\x0a\xba\x67\x8c\x5e\x48\x99\x16\xa6\x85\x51\xa7\x44\x79\x9b\x0b\
+\x35\x26\x09\xc1\x5a\x86\x36\x02\xe9\x76\x70\x58\x48\xa9\x83\x54\
+\x2b\xa8\xb8\x0a\x2a\x94\x0a\x1c\x6a\xc1\x85\x1e\x87\x00\x5f\x2f\
+\x17\x02\x94\x2e\x30\xee\xf6\x97\x70\xb5\x47\x2a\xa6\xe9\xe2\x83\
+\x19\x63\x4c\x2c\x2d\xef\xd2\x42\x7f\x6f\xaf\x1f\xa7\x8f\xd6\x61\
+\xac\x51\x43\x8d\x41\xbd\x77\xcd\x0e\xad\x82\x61\x52\x80\x82\xd2\
+\x43\x04\x76\x17\xba\x6c\x2e\x14\x36\x38\xf0\xa0\x51\x20\x68\x77\
+\xe8\x9e\xdf\x06\x0b\x87\x48\x6b\x22\x75\x42\x6f\x52\x38\xfe\x6e\
+\xa6\x46\xb0\x49\x8b\x8a\x32\xc7\xee\x65\xb3\x3e\xff\x7b\xdb\xf8\
+\x40\x5d\x56\x42\x84\x01\x01\x3a\x05\xe5\x16\xd8\x53\xdd\x8d\xd8\
+\x11\x6a\x04\xeb\xbc\x60\x22\xe0\x1e\x52\xe5\x22\xa6\x83\x75\x76\
+\xa4\x87\x7b\xcb\x20\x7d\xe5\x6b\xa6\x8e\xaa\xa5\x9c\xc5\x1b\x55\
+\xbd\x76\xe0\x72\x9b\x0d\x17\x9b\xcc\xb9\x87\xd7\xdc\x93\xcd\x92\
+\xb6\x96\x97\x26\x4f\x08\x98\x71\x6f\xa8\x1e\x54\x64\x99\xe0\x8b\
+\x3f\xda\x31\x3b\x4a\x2f\xef\x2a\xab\x93\xcb\x0b\x19\x7d\x0a\xaa\
+\x4c\x58\x16\x6d\xe8\x57\xea\x26\x31\x89\x12\x4a\xea\xcd\x98\x73\
+\x97\x0f\x59\xb8\x4c\x7b\xc3\x24\xe2\x68\x55\x4b\x59\xc9\xba\x7b\
+\x13\xd9\x03\x9b\x4e\x36\xad\x4c\x1c\x1d\x78\xd7\x08\x1d\xdc\x7b\
+\xc7\xdd\x31\xef\x97\xdc\xc0\xea\xd8\xe1\x10\x58\x2f\x0c\x25\x94\
+\xbe\xd8\x7e\xa6\x19\xcf\xc7\x8d\x90\x81\xfa\x86\x83\x6a\x93\x5f\
+\xd1\x86\x27\xa7\x04\x78\x68\xc9\xcf\x6c\x77\x22\xbf\xa4\xf6\xe6\
+\xef\xaf\x3f\x10\xc4\xe2\x72\x2b\x6e\x79\xbb\x33\xcb\x3d\x6a\x09\
+\xf5\x96\xce\xde\x8c\x78\xfe\x3c\x3b\x18\xfd\x3e\x03\xef\x21\xcf\
+\xe5\x3b\x9a\x9f\xcd\x9a\xc4\xd8\xa4\x57\x8a\x9b\x5e\x7f\x6c\x72\
+\x60\x88\x9f\x37\x28\x3b\xb0\x39\x25\x6c\x28\xaa\xc1\x6b\x0f\x8f\
+\x86\x5a\x21\x0c\xc8\x36\xf0\xea\xa1\x1a\x7c\x90\x1e\x81\x01\x01\
+\xc0\x4e\x39\xdd\x7c\xa4\x1e\x1b\x53\xc3\xfb\x05\x75\x5b\x1c\xd8\
+\xf4\xc3\x9f\x37\x2b\x3e\x4a\x0d\x62\xd1\x2f\x15\x96\x66\xcd\x9f\
+\x38\x63\x62\xb8\xbf\xbc\x79\x9c\xa4\x20\xe7\xe7\x2b\x78\x36\x31\
+\x14\x81\x7a\x95\xac\xa4\x4f\xd2\x73\xbb\x2f\x60\xfb\x92\xf1\xbd\
+\x82\xe5\x58\xd0\x64\xb2\x63\x7b\x59\x03\x36\x3e\x1a\x29\xe7\xc7\
+\xdd\x5d\x17\x1b\x3b\x91\xbb\xef\xaf\xb2\xaa\x4f\xd2\x13\x59\xd4\
+\xd3\x7b\xb7\x2d\x99\x19\x95\x35\x77\x7a\x84\x67\x21\x39\x7c\xf8\
+\x5b\x0d\x52\x63\x8c\x98\x34\xca\x30\xe0\xb0\xe2\xc8\xc8\x3b\x8f\
+\x82\xcc\xc9\xb7\xd2\x49\xbf\x15\xd7\x4c\xf8\xb5\xb2\x05\xeb\x53\
+\x23\x7b\x2d\xc0\xc1\x93\xb5\xf8\xfe\xd8\x3f\xb9\x97\x77\x2c\xcc\
+\x66\xe1\x2b\xbf\x5b\x18\x1b\x65\xfc\x31\x67\xf5\xfd\x24\x4a\x90\
+\xf3\xb1\xb3\xf4\x2a\x02\x48\xfd\xbc\xd8\xa0\x01\x04\x0c\xb3\x3f\
+\x3d\x8d\x43\x2f\xc6\x0f\xe8\x21\x60\x7f\xf9\x75\xb4\x99\x1d\x78\
+\x72\x46\x98\xc7\x4e\x2a\xdf\xde\x75\x0a\xe5\x97\x5a\x16\x5d\xfd\
+\x6a\xe9\x5e\x36\xf2\xf1\xaf\xdc\x7d\xb7\xe7\x8d\xe5\xf1\x29\xa9\
+\x53\xc3\xe5\x28\x8a\x2b\x9b\x71\xba\xb6\x1d\x1b\xd2\xc7\xf7\xf7\
+\xb6\x3b\xfc\xa4\x8f\xca\x50\xb2\x7e\x06\x58\xbf\x95\xe3\xdd\xc2\
+\x6a\xc4\x47\xf8\x21\x25\x26\x50\xb6\x14\x9f\xa9\xc5\xa6\xaf\xcf\
+\x14\x13\xd1\xe2\xeb\xbb\x57\x99\x64\x81\xc6\x79\x3b\x57\xc4\x45\
+\x07\xed\x7a\x63\xc5\xfd\x2c\x2c\xc8\x80\xf2\xab\x5d\x78\xff\x60\
+\x35\xe2\x68\x61\x73\xb7\x88\xc6\x76\x2b\xda\x7a\x44\xf4\x88\x4e\
+\xe8\xd4\x0a\x39\xba\x51\xd4\x14\x46\x1f\x35\xce\xd6\x74\xe0\xcd\
+\xf4\x71\x98\x12\x3e\x0c\x75\x37\xba\xb1\x29\xff\x24\x3f\x7b\xa1\
+\x69\x55\xcb\x4f\x4f\xe5\xdf\x76\x9a\xfa\xa5\x7d\xb6\x65\xee\x83\
+\x13\xd6\x8e\x19\x37\x12\x15\x0d\x26\xd4\xb5\x5a\x10\x1e\xa0\xc5\
+\xb2\x69\xa1\x08\xf3\xd7\x22\x80\xc0\xa6\xbc\x75\x18\xe5\x39\xc9\
+\x68\x25\xd2\xfa\x0e\x0b\xbe\x3d\xd9\x80\xda\x56\x33\xc2\x8d\x3a\
+\xc4\x52\xbd\x6a\xaa\x1b\x71\xe0\xf8\xc5\xad\x1d\xbf\xac\xb9\xfd\
+\x34\x75\x0f\x9f\xe4\xdc\x50\x61\x98\x4f\xde\xf8\xa8\xe0\xe4\x97\
+\xe7\x44\x43\xab\x51\x61\xfb\xb1\x1a\xbc\x3d\x3f\x06\xe3\x82\xf5\
+\xb2\x67\xc8\x0b\x87\xd0\xf8\xe9\x6c\x79\x59\x35\xa9\xcd\xd9\x57\
+\x89\x67\x93\x23\x61\xb5\x88\xf8\xb8\xb0\x12\x17\x2f\x35\x1d\x91\
+\x3a\xbb\x32\xbb\x8f\x66\xdf\xf9\x3e\x70\x0f\x6d\xda\xe7\x13\x78\
+\x8f\xf9\xa9\xc4\xd8\xb0\xec\xa5\xa9\x31\xec\x8a\x85\xe1\x46\xa7\
+\x15\x6f\x2d\x88\x81\x51\xaf\x86\xff\x33\xfb\xd1\xb6\x63\x1e\x5a\
+\xe9\x28\x78\x87\xc0\x83\x29\x4d\x91\x1a\xe0\xdb\xdf\x2a\x79\xe9\
+\xf9\x86\x6d\x82\x5e\xb7\xd3\x52\xf4\xdc\x85\x21\x5f\x99\x7d\x43\
+\x39\x6d\xf3\x0a\x77\x57\x26\x4d\x8d\x48\xb1\xe9\x7d\xa0\xa1\x68\
+\x32\x12\xc6\xe0\xe9\xbc\x73\xd8\x91\x79\x1f\xbe\x39\x51\x07\x9b\
+\xc5\x0e\xb5\xd9\x84\xb2\xb3\x75\xee\x82\x16\x38\x4e\xbd\x96\x3f\
+\x18\xd6\xa0\x04\xee\x21\xc4\xbd\x67\xa0\x93\x60\x16\x14\x8a\x64\
+\x3e\xcc\x90\xc2\xb4\x9a\x51\xdc\xcd\x64\xa5\xf7\xa3\xc5\x7a\x8d\
+\x75\x75\x15\x73\xa7\xeb\x08\xb9\x1e\x96\xce\xbd\x69\x1a\x0a\x67\
+\x48\x82\xff\x6b\xfc\x0b\xe7\xd7\xb1\x37\x75\xe7\x53\xbf\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x21\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xe8\x49\x44\x41\x54\x78\xda\x63\x64\xc0\x01\xbc\x77\
+\x7e\x92\x00\x52\xf6\x40\x6c\x06\xc4\x7a\x40\xac\x02\xc4\x12\x50\
+\xe9\x17\x40\x7c\x07\x88\x2f\x01\xf1\x29\x20\x3e\xb8\xd5\x9d\xef\
+\x05\x36\x73\x18\xb1\x18\xac\x04\xa4\xc2\x39\x98\x19\xc3\x65\xb9\
+\x98\xf5\x65\x38\x99\x19\xc4\x39\x98\x18\x84\xd8\x98\x18\x78\x58\
+\x99\xc0\x6a\xbe\xfc\xfe\xc7\xf0\xee\xd7\x3f\x86\x97\x3f\xfe\x31\
+\x3c\xf9\xfe\x97\xe1\xf1\xb7\xbf\x17\x7f\xfc\xfd\xbf\x12\x28\xb5\
+\x12\x68\xd1\x3d\x9c\x16\x78\x6e\xfb\x10\x04\x34\x27\x57\x9b\x9f\
+\xcd\x41\x4b\x80\x95\x41\x91\x87\x85\x81\x18\x70\xff\xcb\x1f\x86\
+\x6b\x1f\x7e\x33\x5c\xfd\xf8\xeb\x00\xd0\xde\xc9\xdb\xbd\x04\xd6\
+\x61\x58\xe0\xbe\xf1\x4d\xb2\x24\x17\x4b\x93\xa9\x28\x87\x94\x91\
+\x08\x3b\xc3\x7f\x98\x24\x90\xf1\x9f\x11\xa1\xf0\x3f\x03\x16\x6f\
+\x43\xc1\xb9\xb7\x3f\x19\x4e\xbd\xfa\xf1\xec\xc5\xf7\x3f\x75\x3b\
+\xfd\x44\xe6\xc2\x2d\x70\x59\xf3\x22\x50\x8a\x87\x65\x8a\x93\x34\
+\x8f\x94\xa6\x10\x3b\x86\xa1\xc8\xa6\x62\x58\x80\x26\x70\x0d\x68\
+\xc9\xbe\x67\x5f\x9f\x3d\xff\xf2\x3b\x67\x4f\x88\xc4\x7a\x46\xc7\
+\xe5\x4f\x24\x99\x99\x98\x16\x06\xaa\xf0\xb9\x9a\x4b\x71\x43\x34\
+\xa0\x01\xb0\x19\x8c\x48\xbe\x81\xa9\x61\x84\x2a\xff\x8f\x1a\x1c\
+\x27\x9e\x7f\x65\xd8\x70\xfb\xe3\xee\xbf\xff\xff\xc7\x33\xda\x2d\
+\x7a\x90\x6e\x28\xce\x3d\x23\x41\x4f\x04\x62\x18\xd4\x20\x46\x64\
+\x36\xcc\xf5\x68\xe2\x38\x93\x0b\x50\x6e\xe1\xe5\xd7\x0c\xe7\x9e\
+\x7f\xcb\x60\xb4\x9e\x7d\x7b\x65\x9c\xa1\x58\x98\x85\x2c\x1f\x03\
+\xb2\x3e\x0c\x36\x92\xcb\xff\x23\xc9\x23\xd3\xc8\xe0\xf8\xe3\x4f\
+\x0c\x0b\xcf\xbf\x5a\xc5\x68\x3e\xf9\xda\xdd\x36\x2f\x65\x25\x09\
+\x5e\x36\xdc\xb1\x87\x1e\xd6\xf8\x4c\x86\x82\x17\x9f\x7f\x31\x54\
+\x6d\xbb\x73\x8f\xd1\xb8\xf7\xe2\xef\xc5\xb1\xba\x2c\xcc\x4c\x8c\
+\x98\x7a\x19\x91\x7c\x81\x24\x81\x91\x00\x90\xed\x82\xaa\xf9\xfb\
+\xef\x3f\x43\xec\xe2\x4b\x7f\x18\xf5\x5b\x4f\xdd\x9d\x1c\xa5\xab\
+\x24\xc5\xcf\x81\xd5\x25\x28\x96\xfd\x47\x58\x0a\xb2\x10\x5b\x10\
+\xc2\xc4\x9e\x7d\xfc\xc1\x90\xbb\xfc\xca\x3d\x46\xed\xba\xa3\x2b\
+\x0b\xdd\x55\xc2\x5c\xb4\xc5\xb0\x9b\xcc\x40\x94\x30\x06\xd8\x73\
+\xf5\x15\x43\xdf\xce\x3b\xab\x18\xd5\xca\xf7\xa7\x3b\x6a\x89\xcd\
+\xa8\x0d\xd4\xc2\x1a\xce\xf8\x32\x16\x3e\xd0\xbc\xfe\x1a\xc3\x81\
+\x6b\xaf\x32\x18\x95\xf3\x77\x4a\xb2\x30\x33\x2e\x2c\xf6\xd5\x74\
+\xf5\x33\x91\xc1\xcc\x50\x48\x61\x8e\x2d\x3e\xd0\x93\x27\x48\xed\
+\xe6\xd3\x4f\x19\x7a\x37\x5f\xdb\xfd\xfb\x2f\x30\x1f\x80\xc4\xe5\
+\xd2\x37\x07\x6a\x48\xf3\x4f\x49\x75\x57\x95\x72\xd4\x91\xc0\x08\
+\x5b\x90\x00\x33\xb0\x9c\xfb\x0f\x8c\x38\x48\x7c\x20\x6c\xfc\x0f\
+\x35\x14\xa6\xfe\xd2\xfd\x77\x0c\xed\xeb\xae\x3e\xbb\xf9\xf4\x53\
+\xce\xa3\x19\x3e\xeb\xe1\xf6\x4b\x25\xae\x4d\xd6\x92\x11\x6c\x8a\
+\x70\x50\x92\x0a\xb6\x92\xc7\x19\xf8\x7f\xff\xfd\x63\x00\x95\xa9\
+\xcc\x40\x1b\xff\x23\xc7\x07\x90\x71\xec\xda\x4b\x86\xbe\x0d\xd7\
+\x9e\xdd\x78\xf2\xa1\xee\xe9\xfc\x20\x44\x59\x04\x03\xe2\x51\x2b\
+\x82\x38\xd9\x59\x73\x7d\xcc\xe5\x1c\x7c\xcc\x64\x19\xac\xb4\xc5\
+\x51\x73\x32\x34\x78\x7e\xfd\xfd\x0b\xf6\x05\x0b\x33\xa4\xf8\x7e\
+\xf9\xee\x1b\xc3\xa4\x8d\x57\x19\x36\x9f\x7c\x74\xe0\xdb\x8f\x3f\
+\x93\x5f\x2d\x8f\xc0\x2c\x4d\x61\x40\x38\x78\xb1\x12\xd0\xa4\x70\
+\x3e\x6e\xf6\x70\x33\x0d\x51\x7d\x13\x75\x51\x06\x6d\x79\x41\x06\
+\x45\x49\x3e\x06\x71\x41\x4e\x78\xb8\x3f\x79\xf9\x99\x41\x18\xc8\
+\x07\x59\x78\xf9\xc1\x3b\x86\xc8\x96\xbd\x5f\x81\x96\xea\xbd\x5d\
+\x1b\x83\xbb\x3e\x40\x06\xfc\x3e\xf3\x40\x91\x61\x0f\x54\x01\xaf\
+\xd1\x80\x8a\x25\x40\xe6\x73\xb0\xb3\x30\x58\xeb\x48\xb0\x15\x87\
+\x1b\x32\xc9\x89\xf1\x30\xe4\x4e\x3c\xc4\xb0\xff\xfc\xd3\x1d\x1f\
+\xb7\x24\x79\x62\x0b\x59\x92\x81\x64\xc8\xe2\x25\xff\xff\xff\x0f\
+\x9c\x53\xea\xc8\xc5\xc7\xcd\xca\xe0\x55\xbc\x09\xe4\xb1\xc2\xaf\
+\xbb\xd2\x26\x90\x65\x01\x30\xdb\xb3\x03\x8b\x92\x9f\x30\xbe\x44\
+\xf0\xa2\x73\xc1\x76\x4a\x7a\x51\xce\xaa\xcc\x0d\x73\x8e\x33\x1c\
+\xbe\xf0\x6c\x23\x23\xe3\xff\xdc\xef\xfb\xb3\x1f\x93\xed\x03\xa0\
+\x8b\x41\x15\xfe\x4f\x9b\x9c\x0d\x7d\x5a\x0a\x82\xc1\x82\x3c\x6c\
+\xbc\xe7\xae\x3e\x67\x38\x74\xfe\xe9\x46\xa0\x78\xe7\xaf\xa3\x79\
+\xc7\xb1\xe9\x23\xca\x02\x16\x8b\x3e\x16\x60\x62\xe7\x02\xc6\xa8\
+\x15\x90\x4e\x05\x0a\xd9\x02\xad\x3c\x0b\xd4\xbe\x13\x48\xaf\xfd\
+\x73\xb2\xe8\x31\x2e\xbd\x64\xc5\x01\x29\x00\x00\x31\x0b\x8d\x2d\
+\x25\x76\x16\x42\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x04\x51\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x18\x49\x44\x41\x54\x78\xda\xa5\x55\x6b\x68\x1c\x55\
+\x14\x3e\xf7\xce\xcc\xce\x36\x33\xbb\xb3\xdd\xd5\x64\xd3\x80\x59\
+\x44\xd0\xfe\x28\xf1\x15\x64\xc5\x47\x6b\x24\x2a\xad\x45\x31\xa5\
+\xd8\x88\x88\x23\x14\xd2\x1f\xa5\x50\xa1\x18\xf1\x8f\x15\x94\x8a\
+\xf5\x87\x44\x42\x35\x16\x69\x5a\x95\x80\x85\x54\xb4\x0b\x0d\x89\
+\x86\xa4\xa5\x56\x52\x95\x8a\x88\xad\xad\xed\xa6\x8f\x74\xbb\xd9\
+\xd9\xf7\xec\x9d\xeb\x99\xd9\xcd\x3e\xcc\x6e\x08\xcd\x85\xe4\x3e\
+\xf6\xdc\xf3\x7d\xe7\xdc\x73\xbe\x21\xb0\x82\xb1\x66\xcf\x75\x15\
+\xa7\x9e\xe8\xfb\xcd\x07\x1b\xd9\x90\x95\x00\xdc\xfb\xce\xac\x2f\
+\x99\xb1\xe6\x2c\x0e\x6f\xcc\x7e\xd8\x56\x17\x64\x45\x00\xbf\xfe\
+\x9b\x7b\xe2\xd0\x2f\xd9\x89\x6f\x4f\x25\xac\x44\xda\xd4\xaf\x7d\
+\x7c\xf7\x22\x10\x07\xe0\xce\xbe\x3f\x42\x9c\xf3\x5e\x42\x60\x23\
+\x07\x08\x93\x85\x9f\xf8\x82\x05\x2f\xae\x71\xc3\x09\xc7\xff\xc4\
+\x39\x93\x28\x81\x81\xed\xed\x70\xfa\x62\x1e\x46\x7e\x9a\xb3\x62\
+\x09\x53\xbf\xf1\xe9\xda\x1a\x10\xe2\xd7\xcf\x84\x34\xaf\x7b\x28\
+\x95\xce\x6f\xf0\x7a\x65\xb8\xaf\xdd\x03\x02\x2d\x3a\xa8\xe5\x51\
+\x44\x43\x08\x10\x45\x02\x14\x77\xa2\x40\xe0\x83\x17\x9b\xe1\xfb\
+\xdf\x93\x10\x4f\x33\xf8\xe4\x58\xd4\x4a\x65\x4c\xfd\xe6\xe7\x0f\
+\x95\x41\x88\xaf\x77\xb2\xdf\xe3\x95\xf7\x0a\x78\xe9\xb9\x07\x03\
+\xd0\xe2\x73\x01\xaf\xf2\x8d\x91\x01\xe6\x18\xb2\x05\x0e\x39\xd3\
+\x02\xf4\x09\xcc\x02\xa0\x88\x60\x3b\x9d\xb9\x98\x41\xc8\xe2\x85\
+\x42\xc1\x82\x68\x34\xc1\x70\xdb\x1b\x3f\xf4\xd8\xd7\x0e\x80\xa7\
+\x27\x32\x25\xc9\x42\xf8\x9e\x36\x15\x36\x75\x36\xc3\x97\x3f\x5e\
+\xab\x64\x06\xaa\x02\xa9\xce\x58\x9d\x61\x21\x8b\xf8\xad\x34\x98\
+\x79\x36\x83\xdb\x2e\x63\xa4\x3b\xe6\x5c\x53\x9e\x3f\x9a\x25\x94\
+\xca\xaf\x3e\x13\x82\x6f\x26\xa3\xe0\x72\x89\x95\x94\xf0\x4a\x1d\
+\xb0\x02\xab\x64\xaa\x2a\x6b\x54\xa0\xce\x22\x69\x64\xc1\x62\xe8\
+\x9c\x43\x57\x6a\xf4\x85\x58\x39\x45\xee\xee\x23\x53\x68\x1c\x96\
+\x64\x17\x30\xb3\x80\xe1\x5b\x40\x30\x2d\x54\x10\x80\x50\x01\xcf\
+\xf2\x35\xcc\x79\xc9\xb3\xf3\xd0\xf8\xe0\x92\x4b\x46\xf0\x42\xd1\
+\x39\x32\xcf\x46\xb6\xc5\xaa\x23\x23\xd2\x93\x43\xfd\x68\xb8\x97\
+\x52\xd1\xc9\x37\xb7\x58\xd8\x9c\xd0\x4f\xaa\x9b\x46\x82\xc9\x63\
+\x3d\x57\x97\x2a\x53\x69\xfd\x90\x86\x58\x71\xbc\x8f\xcc\x49\x97\
+\x39\xf1\x7a\xec\xff\x36\x44\x08\x0f\x84\x90\xd1\x7b\xb8\xde\x56\
+\x8a\xfb\x7e\x36\xbd\xe3\xec\x72\xfa\x40\x78\x74\x00\x01\xf8\x38\
+\x10\xd2\xc5\xa6\xfa\x62\xf5\x6c\x9c\xc8\x49\xe7\x47\x21\x0c\xb9\
+\x17\x03\xd8\x88\x07\x07\x39\x81\x61\xb0\x8b\xe7\xe7\x5d\x99\xa5\
+\x00\x68\xe7\x7e\x17\xa6\x4f\xe5\xa7\x77\xc5\x1a\xd9\xac\xa8\x93\
+\x97\x33\x96\x04\x08\xee\xbe\xe2\xc7\xf0\x93\x57\xf7\xad\xc9\x2f\
+\x65\xd7\xfa\xe6\x15\x2f\x4e\x2a\x46\xbd\x05\x3d\x6e\xc5\xf9\x3b\
+\x9c\x87\x67\xf7\xb5\xfd\xd3\x10\xa0\x65\xe7\x05\x74\xce\x4f\xe0\
+\x72\x3d\x6a\xcc\xfc\x72\xd8\xb6\xec\x3c\xdf\x81\x29\x9b\x29\x49\
+\xc9\x61\x24\xd7\x5f\x17\xe0\x8e\xbe\x73\x7e\xac\xee\x31\x2c\xc6\
+\x0e\x64\xe3\x43\x7d\x69\x08\xf0\xf4\xe0\x4d\x55\x10\x45\xf1\xb8\
+\xae\xc5\xef\xda\xfd\xd7\x53\x16\x83\x13\xd8\x6c\xc0\xb8\x5d\xee\
+\xf0\xf6\x22\x80\x80\x7e\xc6\x2f\x08\x74\xdc\x17\x50\xd6\xbd\xf4\
+\x80\x0a\x83\xc7\x67\xcb\xb9\xac\xf4\x03\x71\xd6\x6e\xb7\x00\x4d\
+\xaa\x1b\x8c\x44\xd6\xee\x60\xb0\x7b\xae\xfb\x91\x16\x38\xf9\xa7\
+\x81\x5d\x9d\xc2\x0b\x64\xba\x06\x40\x7b\x65\xd2\x4f\x29\x19\x0b\
+\x06\xb5\x8e\x77\x5f\x6e\x87\x08\x8a\xd8\xf9\xeb\x59\x58\xad\x60\
+\xc3\xa1\x14\xd8\x1a\x65\xff\x29\x4d\x02\xa8\x6e\xd1\xb9\xa3\xc8\
+\xd4\x39\x13\x51\x20\xcd\x5c\x01\x24\x01\x20\x72\xce\x80\xcb\x17\
+\xe6\x80\x31\x2b\x57\x06\xf0\x6c\x89\xf8\x31\x77\x63\xcd\xad\xbe\
+\x8e\xd1\x3d\xeb\x60\xf4\xec\x3c\xcc\x67\x18\x9c\xfa\x3b\x0d\x6b\
+\x5b\x65\xc8\xa1\x52\x68\x6e\x5a\xe4\x4f\x4b\xc2\x54\xd2\x0d\xc7\
+\x39\x12\x90\x50\x09\x7f\xf8\xcd\x80\x4c\x2a\x0b\xd1\x4b\x37\x50\
+\x9f\xac\x4a\x04\xca\xe6\xa3\x5b\x15\xaf\x72\x38\x10\x0c\xd0\xdb\
+\xa8\xc6\xf2\xb0\x50\x6a\xe3\x73\x71\x30\xe2\x49\x7b\x5b\xfb\x06\
+\xab\x9e\xfd\x4a\x57\x34\xcf\x01\x75\xb5\x46\xca\x62\x47\x16\x64\
+\xb4\x22\x7e\xa4\xf4\x11\xe2\x50\x15\x09\x1e\xda\x5a\x96\x4a\x18\
+\x90\x35\xd2\xc8\x9e\x1d\xc1\xc3\xb7\x16\x3d\xb2\x6b\xc3\x17\xba\
+\xdb\xa3\x1e\x68\xd2\xbc\xce\xb7\xeb\xd6\xa5\xcb\xc5\xaf\x18\x27\
+\x65\xdd\x27\xd5\x7e\x4b\x5f\xb9\xaa\x32\x98\x2e\xf6\x01\x1f\x36\
+\xc7\xf5\xfa\x7d\x20\x3d\x3e\xb8\x5d\x94\x57\x0d\x10\x42\x68\x2e\
+\x95\xf0\xb1\xa9\x1d\xcb\xea\x83\x7a\xa3\x61\xa3\x91\x87\xf7\xbf\
+\x86\xdc\x3e\x43\xee\x01\xd4\xa4\xdb\x06\xf8\x0f\x81\x17\xbc\x28\
+\xbb\x96\x55\xb1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x04\x3e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x05\x49\x44\x41\x54\x78\xda\x95\x54\x6d\x6c\x93\x55\
+\x14\x7e\xee\x4a\xeb\x4a\xb7\x16\x2b\x93\x2d\xdb\x0a\x18\x11\x1d\
+\x83\x39\xd8\x6c\xeb\x8c\xdb\x32\x15\xf6\x63\x89\x8b\x03\x11\x23\
+\x62\xc0\x2c\x0c\x27\xfc\x19\x33\x0e\xd3\x11\xa7\x19\xa0\x86\xa9\
+\x19\x44\x47\x16\x41\x51\x11\xc5\x1f\xc6\x68\x18\x19\x4d\x64\x5f\
+\x22\x2b\x93\x05\x6b\x36\x27\x73\x1f\xca\xec\x68\xbb\xb5\x5b\xdb\
+\xbd\xbd\xde\xf7\x7d\xdb\xee\x2d\x6d\x65\x3d\xc9\xc9\xbd\xf7\x9c\
+\x73\x9f\xe7\xdc\x73\xee\xbd\x04\x31\xe4\xc8\x75\x1f\x45\x6c\x99\
+\x64\xfa\x68\xcd\x43\x72\x2b\xee\x20\x24\x96\xa3\xb1\xdf\x43\x6b\
+\xb3\x14\x51\x7d\xdf\x8f\x71\xff\xfc\x6a\xf7\xb3\x19\x2d\x7c\x6d\
+\xcd\x5d\xff\x4b\x12\x93\xa0\xa1\xcf\x43\xeb\xd6\x2a\xf0\xa7\x0b\
+\xf0\x32\x2c\x1f\xd3\x11\x37\x07\x3f\x1b\x4b\xd3\x65\xf6\xb3\x37\
+\x7c\x23\x56\xa7\x7f\x29\x0b\x2d\x3a\xb0\x2e\xd1\x1a\x37\x41\xbd\
+\xc5\x4d\x4d\x39\x4a\x8c\xcd\x88\x04\x41\x1d\x63\x24\x4f\xa5\xc9\
+\x86\x59\x88\xee\x8b\x21\x6f\x9f\xd5\xc1\xdd\xcb\x50\x8a\xea\x1f\
+\x5e\x6c\x8d\x8b\xa0\xee\xf2\x34\x6d\xd8\xa0\x82\xcd\x03\x78\x24\
+\x04\x57\x6d\x3e\x6c\x5e\x21\xe7\x7b\xa0\xe5\xe3\x3e\x1d\x9c\xb5\
+\xfc\x66\xe7\x52\xdf\xca\x4b\x4a\x8b\x8b\xa0\xa6\xcb\x49\x0f\xeb\
+\x93\x31\x35\x27\x02\x7b\x38\x71\xbc\xc2\x08\xf8\x32\x39\xd8\x1d\
+\xe0\x6f\xc1\xae\x55\x0a\xec\xef\x9e\xc2\x11\x83\x9a\xc4\x45\xb0\
+\xf7\x27\x3b\x3d\x5a\xa0\xc1\x2c\x27\xd6\x3f\x78\x02\x0f\x43\xf5\
+\x72\xf3\x3d\xd9\x98\x26\xc3\xbe\x4b\x0e\x34\x3d\xb6\x24\x3e\x82\
+\xdd\x17\x6d\xb4\xb9\x50\x8b\x39\x06\xc8\xf9\xc3\xfb\x20\x2d\x59\
+\xb6\x06\xa8\x32\x4f\xe2\x58\xd1\x3d\xb1\x09\xb6\xb5\x73\x49\x6c\
+\x68\x65\x5a\x11\x74\x28\xb9\x49\xb4\x94\x2c\xc5\x42\x64\xd7\x85\
+\x7f\x31\x23\xd3\x4a\x4d\x83\x4c\xd7\x9e\x2e\x96\xcd\x08\x04\x5b\
+\x7e\x98\xe9\x48\x56\xc0\x68\xca\x5f\x84\x65\x8b\xc5\x44\xaa\xda\
+\x6f\x2d\x08\x3c\x28\xcd\xc5\x77\x0b\xe3\xb4\x0f\x78\xb7\x77\x0e\
+\x03\x0e\xfa\xcb\x99\x4d\xca\x3c\xf2\xf4\x39\xbb\x8c\xd9\xdd\xd5\
+\xeb\x13\x15\x05\xe9\x72\xf0\xad\xf3\xb3\xb2\x98\x07\x5d\xe2\xf9\
+\x28\xc2\x47\xa9\x48\x6c\x8f\xdf\xa7\xc2\x22\x36\xa7\x4c\x6f\xba\
+\xfd\xd8\xdb\xe6\xe6\x03\x32\xc8\xa6\x53\xe3\x59\x2c\xa8\xbf\xa9\
+\x54\x8b\x4c\x8d\x4c\xd8\xe3\x62\x45\xb6\x8c\x7b\x05\x84\x70\x6c\
+\x12\x86\x4c\x03\x7e\x7e\x9e\x9d\xaa\x80\x3a\x31\x41\x58\xf3\x37\
+\x6e\xdb\x99\x09\xde\x5c\x44\x8a\x8f\x0d\x6c\x25\x84\x7c\x7e\xf6\
+\xa5\xe5\x90\x27\x88\x70\x13\x2e\x3f\xfe\x72\xb2\x0e\x52\x69\xfa\
+\xb7\xb7\x4e\xe2\x23\x04\x19\xea\x04\xa4\xa8\x64\x22\x2d\x33\x57\
+\xb4\xde\x80\x6f\x0e\x95\xc4\x70\xa8\xef\x9b\x54\x8d\xa2\xbc\x75\
+\xe7\x2a\x90\x00\xce\x93\xbb\xbf\xc6\xc0\xa8\x33\x0c\xea\x4e\xf2\
+\x80\x6e\x09\x7e\xfc\xb0\x3c\x44\xfb\x7c\xcb\xef\xb0\x4d\xfb\x9a\
+\x48\x4e\x5d\x67\x57\xee\xca\x64\xfd\x3b\xdb\xb3\x04\xc7\x94\xdb\
+\x8b\xfc\x17\xbf\x04\xc7\x89\xb0\x7c\x36\x84\x86\x27\x1f\xad\x1d\
+\x32\x76\x8a\x9e\x93\xcf\x42\xad\x94\x0b\xfe\xca\x8f\xae\x61\xe0\
+\x6f\x77\x1b\x59\xfd\xea\xf9\x8e\x32\x7d\xba\x71\xff\x33\x0f\x0a\
+\x8e\xee\xeb\x13\x78\xe5\xfd\x4e\x01\x94\x86\x55\x83\x30\x1b\x9d\
+\x27\x11\x2b\x13\xaa\x22\x1f\xd6\x54\x6d\x80\x71\x4d\x8a\x60\xa8\
+\x6e\xbe\x02\xcb\xd0\xad\x11\xa2\xdb\xf1\xad\x8d\x19\xb4\xdd\xc7\
+\xcb\x84\xbd\x9f\xb4\x0f\xe3\x33\xa6\xa1\xcc\x03\xa9\x86\xb0\xa3\
+\xdc\x28\x61\xc9\x02\x9e\x2b\xd4\x61\x47\xc9\x72\xe6\x22\xa8\x3d\
+\xde\x83\x8b\x96\xf1\x13\x24\xa5\xe2\x74\xcb\x46\x83\x6e\x67\xe3\
+\x9e\x02\x21\xf8\xe0\xb9\x3f\x70\x6d\xd4\x35\xbf\x33\x78\x88\x00\
+\x21\x0d\x00\x87\x4e\x28\x91\xec\x8c\x24\x98\xca\x57\x60\x96\xfd\
+\x25\x2f\xd4\x9f\xc7\xe0\xb0\xfd\x3d\xa2\x2e\x3d\x91\x44\x28\xe9\
+\xad\xdc\x92\x73\xff\x9e\xad\xeb\x61\xfa\x6e\x04\xe6\x31\x1b\xbe\
+\xda\x9e\x13\xbd\x9b\xd1\xde\x05\x9b\x6f\x3e\x65\xc1\x6a\x95\x06\
+\x47\x2b\x32\xb1\xaf\xf1\x02\x3a\xae\x8e\x0e\x31\xcf\x3a\x21\x44\
+\x59\xd8\xfc\x08\xff\x18\x59\xe4\x06\x7e\xad\x2d\x33\xa2\xed\xe5\
+\x5c\x31\x5b\x1a\x7e\xfb\x23\x5e\x43\x20\xe6\x89\x8f\x7b\xe1\xb9\
+\xd4\x0f\xb7\x7d\x9a\xfd\xb6\x94\xbd\x04\x94\xcc\x9a\xab\xcc\x51\
+\x3f\xa8\x65\x87\x7e\xa6\xbd\xd5\x79\xa1\x72\x40\xd2\xd0\x68\x64\
+\xfc\x3c\xf7\x83\xcb\xb8\x59\x9b\x1f\x81\x17\x95\x40\xfb\x76\x0f\
+\x1d\xae\xc9\x8f\xfc\x21\x02\x86\x88\x7e\x30\xcd\x3c\xdc\x83\xc9\
+\xd7\xf5\x0b\x23\x50\xbf\xd9\x45\x1d\x07\xf4\x88\x47\x34\x0d\xdd\
+\x70\xbe\x61\x58\x18\x81\xea\x60\x27\x8d\xf0\x06\x33\xbf\xbd\xe1\
+\x92\x53\xba\x4c\xc6\x08\xbc\xff\x00\x4c\x40\xc2\x46\x5a\xf6\xe5\
+\x0f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xc4\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x8b\x49\x44\x41\x54\x78\xda\xa5\x56\x6b\x68\x14\x57\
+\x14\xfe\x66\x67\x67\x66\x9f\xc9\x6e\x36\xd9\xbc\x6a\x5e\x5a\x43\
+\x4d\xb5\xd4\x54\x13\xc4\x50\x53\xdb\x04\x2b\xa2\xd2\x16\x7c\xb5\
+\x95\x0a\x46\x52\x5a\x14\x6d\x55\x0a\x29\xe9\x0f\x2d\x45\xa9\xb6\
+\x18\xac\x54\x90\x96\x18\xc1\x22\x4a\x29\xf5\x81\x98\x9a\x60\x93\
+\xb4\x51\xab\x55\xe3\xa3\x59\x4d\x62\xb2\x9b\x64\x1f\xd9\xd7\xec\
+\x3c\x76\xa6\x77\xc7\x55\x13\x5c\x83\xe0\x85\xb3\x67\x77\xce\x3d\
+\xdf\x77\xee\xbd\xdf\x3d\x3b\x14\x26\x19\x79\xdb\x86\x2b\x89\x5b\
+\x40\x6c\x2e\xb1\x19\xc4\xa6\x24\x43\xfd\xc4\xae\x13\xeb\x22\xd6\
+\x3a\xf8\xb5\xb3\xe3\x29\xf9\x0d\x54\xca\xc0\x56\x77\x15\x54\xac\
+\x9e\x9e\xab\x5f\xf3\x6a\x01\x63\x2e\xca\xd2\xc3\x61\xd6\x81\xd3\
+\x53\x88\x48\x2a\xdc\x41\x05\x7d\xbe\x38\xee\x8d\xca\x09\x0b\x7b\
+\x83\x4a\x33\x49\x6b\x1e\xfa\x26\xa7\xed\x21\x46\xee\xd6\xa1\x06\
+\xe2\x1a\x9f\x20\xc8\xdd\x72\xbf\xbe\xc8\xa9\xff\xbc\xa6\xcc\x58\
+\x38\xb7\x98\x45\x61\x06\x0d\x5f\x94\x80\x86\x14\x44\xc4\x84\x01\
+\x51\x29\xe9\xc9\x6f\x6f\x58\x45\xef\xb0\x84\xbe\x11\xd1\x15\xe5\
+\xd5\x5d\xee\x5d\xf9\x4d\xb9\x9f\xdd\x6f\x48\xb3\xd0\x8d\xe1\x70\
+\x1c\x13\x08\x72\x36\xf7\x6d\xaf\x9c\x66\xf8\x6a\xd9\x6c\xb3\xbe\
+\xa2\x88\xc5\x68\x44\x41\x47\x9f\x88\xbb\x3e\x05\x1e\x42\x10\x12\
+\x14\x90\x95\x69\x2b\xe1\x18\x0a\x2c\xad\x42\x47\x51\x88\xc9\x2a\
+\x86\x03\x32\x06\x47\x24\x29\x14\x91\xff\xc8\xcf\x62\xdf\x9c\x51\
+\x68\xc4\xd9\x8b\xa1\xc7\x04\xd9\x1b\x7b\xeb\x2b\xa6\x19\xf7\xae\
+\xac\xb4\xea\x67\xe6\xb3\x38\xff\x9f\x80\xee\x01\x09\xbd\xde\x38\
+\x34\x54\x6d\xea\x38\x9f\x74\x0c\x4d\x69\x24\xb2\x4a\x0a\x20\x05\
+\x31\x8a\x82\x25\xb3\x2d\xb8\xe6\x96\x70\xe6\xef\xe0\x03\x02\xe7\
+\x27\xb7\xab\x0a\x32\x99\x9f\xd7\x55\xdb\x0b\xab\x4b\x8d\x38\x71\
+\x95\xc7\x9f\x2e\x01\x7e\x5e\x01\x2f\xc4\x11\x0a\xcb\xe0\x79\x19\
+\x82\xa8\x6a\xc5\x70\x8c\x0e\x26\x13\x0d\xab\x59\x0f\x83\x81\xd6\
+\x9e\x25\x22\x19\x46\x1d\xea\xab\xac\xe8\xee\x17\x71\x69\x40\xc4\
+\xf9\x4b\x81\x07\x04\x59\xf5\xd7\xf7\xbf\xff\xba\xa3\x6e\x61\x99\
+\x05\x37\x3c\x12\x5a\x6f\xf3\x08\x10\xf0\xc0\x98\x08\x7f\x40\x72\
+\x0b\x42\xfc\x08\x45\xa9\xa7\x54\x15\xdd\x14\xa9\x56\x55\xd5\x72\
+\x92\x58\xcb\x72\xf4\x0a\xbb\x8d\xcd\xb1\xa7\x73\x1a\xc9\xde\x77\
+\x1c\xb8\x3c\x28\xe2\xce\x88\x88\x7f\x07\x25\x74\x5e\x21\x04\x8e\
+\xf5\x57\x2b\x4b\x72\xb8\x33\x75\xb5\x4e\x4b\x71\x26\x8b\x1f\xdb\
+\xc7\x70\xcf\x2f\x13\x70\x01\x5e\x6f\xac\x4b\x96\x95\x1d\xde\x03\
+\xb3\x4e\xa4\x52\x9b\x63\xfd\x95\xa5\x34\x4d\xed\xcb\xcb\xb5\xe4\
+\x97\x4d\x31\xe0\xae\x57\xc6\x9c\x42\x03\xe2\xa4\x92\x9b\x1e\x11\
+\x97\xaf\xf9\x41\x65\xac\xbb\xb8\xad\xb6\xdc\xbe\xf3\xad\x57\x6c\
+\xb8\x36\x24\xa2\xfd\x0e\x0f\x21\x26\xc3\x33\x1c\x4e\x54\xbe\xc1\
+\x77\xb0\x3c\x25\x78\x62\x90\xdc\x06\x8b\x85\x69\x9c\xf7\xb2\x9d\
+\x80\x4b\xc9\xa7\x14\x72\xd3\x69\x04\xc9\x0e\xfc\x73\xc3\x0b\xca\
+\xbe\xb6\xf3\xd8\xea\x85\x79\xcb\x0b\x9d\x06\x74\xf4\x46\x71\x8f\
+\x4c\xf4\xfb\xa2\xf0\xf9\xf8\x3d\xfe\x43\x15\x9b\x9e\x06\x6e\xff\
+\xb0\xb3\xc1\x62\x65\x1b\xb3\xb3\xad\xd0\xb6\x4d\x83\x7e\x28\x02\
+\x40\x4f\x0e\xff\xd6\xad\x51\x50\xb6\x35\xed\x3d\x1f\x2d\x2e\x2a\
+\x65\xc9\xc1\x5d\xb8\x1d\xd1\xa4\x38\x34\x10\x20\x87\x2a\x2d\x1a\
+\x6b\x9e\x7f\x32\x15\xb8\x6d\x4d\x1b\xb9\x44\x54\x63\x0a\x6d\x81\
+\x52\x93\x9e\x4a\xfa\xb4\x15\xe7\x22\x6b\x17\x4f\x35\x25\xb4\xdc\
+\xe5\x8a\x80\xa8\x0d\x7d\xae\x11\x28\x8a\xe2\x1c\x6b\xa9\x1e\x49\
+\x45\x90\xb6\xf2\x5c\x71\xb0\xa5\xda\x85\x67\x18\x94\xf5\xdd\xd3\
+\x91\x65\x6f\x94\x10\x02\xa0\x67\x88\x27\x0a\x21\x8d\xc6\xe5\xd1\
+\x08\x42\x47\x6b\x46\x9e\x05\x64\x52\x02\xcb\xf2\xdf\x7a\x2a\x66\
+\x17\x94\xea\x68\x1d\x86\x02\x12\xe2\x0a\xb9\x95\x83\xa3\x10\xa2\
+\xe2\xa2\xf0\xf1\xc5\x27\x9f\x9b\xc0\xbc\xe4\xf8\xb1\xe2\x12\xe7\
+\x72\x83\xd9\x84\x30\x1f\xd7\x24\x16\xf4\x07\x11\xf2\x05\xf7\x44\
+\x7f\x5d\xb6\xe9\xb9\x09\x8c\x6f\xff\xb2\xcd\x9e\x91\xb6\xd3\xea\
+\xb0\x41\x8a\xab\x9a\x12\xa4\x98\x84\xc0\xa8\xd7\x2d\x09\xd2\x06\
+\xfe\xf7\xf7\x4e\x4c\x06\x60\x5c\x74\x74\x29\x49\xfa\x1e\x89\x56\
+\xae\x8e\x47\xd6\x3e\xb7\x53\x86\x9a\x96\x4a\x3d\xc7\x9c\xb6\x3b\
+\xb3\xac\x3a\x86\x79\x14\x8b\x85\xc2\x08\x7a\x7d\x5d\x71\x45\xd9\
+\x21\x9c\x5e\x95\x92\xc4\x50\x73\x78\x29\xcb\x31\x5f\xcc\x99\x99\
+\x3f\xa7\x6c\x6a\x26\x8a\x88\xd4\xf7\x9d\xbc\x0f\x31\x46\x3a\x80\
+\x67\x24\x24\x8b\x62\x8d\xc6\xc3\x2d\xfc\x69\xbf\xd9\x66\xab\x33\
+\xdb\xed\x1a\x3a\x69\x96\x5a\xbf\x89\x86\x42\x89\xed\x72\x47\xa3\
+\xb1\x23\xe4\xd1\x29\x32\xb5\xfb\x81\x14\xd5\x72\xe2\x6b\x33\xec\
+\x96\x95\x65\x2f\xe6\x64\xcf\x9a\x9e\x89\x97\xf2\xcd\x38\x74\x6e\
+\x08\xfd\x5e\x1e\x11\xff\x18\x31\xff\x0f\xc2\xd9\x0f\x36\x68\x04\
+\xec\x82\x83\x55\x3a\x3d\x73\xc8\xe2\xc8\x2c\x61\x4d\x26\xb0\x84\
+\xc1\xc4\xd1\x30\xb2\x34\x64\x41\x40\x88\xac\x26\x1c\x8a\x22\x12\
+\xe2\xb5\x4b\x95\x9e\x6e\x42\x5e\x76\x3a\xa6\x16\x64\xe0\x05\xa7\
+\x05\xa5\xf9\x26\xb4\xb4\xb9\xd1\x33\x10\x81\x18\x8d\x20\xec\xf3\
+\xf5\x2a\x92\xb8\x56\x6c\x5d\xd7\xf6\xa8\x5d\xeb\xe7\x1f\xa8\x67\
+\x8d\x86\x3d\x46\xbb\x83\x61\x39\x03\x38\x4e\x07\x9b\x89\x41\xba\
+\x49\x0f\x8e\xd5\x69\x2b\x32\x68\x46\xc3\x40\x62\x09\xf2\x22\xa7\
+\x11\x57\x5c\x41\xdc\x1c\x8c\xc0\xe5\xe1\x21\xc7\x62\xa4\x72\x9f\
+\x24\xf1\xd1\x8d\x72\x7b\x5d\xd3\xe3\xa3\x48\x0e\x7a\x5e\xd3\x76\
+\xc6\x60\x6c\x34\xa6\xd9\x19\xc6\x6c\x86\x8e\x84\x6d\x56\x3d\xec\
+\xa4\x2d\x3b\xd2\x38\xcc\x2c\xb4\x62\x34\x28\xc2\x69\xe3\x48\xb5\
+\x61\x78\x48\x43\x74\xb9\xa3\x90\xc8\x25\x95\x48\xe5\xb1\x31\xbf\
+\x24\xc6\xa2\x5f\xc6\x2f\x7c\xbc\x73\xe2\x59\x8f\x1b\xba\x8a\xef\
+\xea\x69\x86\xdd\xcc\x5a\xac\x25\xac\x25\x0d\xb4\x9e\x1d\x17\x55\
+\x27\xa6\x91\xbe\x10\x17\x25\x48\x91\x10\x84\x70\x30\xb1\x2d\xbb\
+\xe3\x9d\x9f\x36\x4d\x90\x69\x4a\xed\xbe\xf6\x6d\x15\x71\xab\xf5\
+\x1c\xb7\x4a\x6f\x30\x59\x69\x83\x11\x34\xcb\x81\xa6\x19\xa8\x04\
+\x54\x95\x64\xc8\xa2\x40\xce\x87\x6c\x0b\x1f\x0d\xc5\x25\xe1\x30\
+\x01\x6a\x56\xfe\xda\xd4\xf6\x04\xd6\xa4\xb7\xa4\x7c\x77\x25\xa5\
+\xbd\xb6\xa8\xe4\xb5\x85\x9a\x41\xfe\x68\xa6\x24\xb3\xfa\xa9\xc4\
+\x6b\x0b\x69\x5f\xe4\x7b\xab\xda\xbd\xa5\xe3\x69\x10\xff\x03\x7f\
+\xff\x85\x4f\x2f\x0b\xfc\x1e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\x27\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xee\x49\x44\x41\x54\x78\xda\xad\x95\x6d\x4c\x5b\x65\
+\x14\xc7\xff\x7d\xa3\xad\x6d\x99\xd0\x41\xa0\x08\x73\xc0\x2a\x19\
+\x60\x91\x97\x30\xb0\xd0\x80\x6c\x23\x8b\x08\x63\xc9\x3e\x0c\x96\
+\x90\x38\x25\x9a\x99\xb0\x45\x4d\x44\x9c\x4e\x0d\x5b\xd2\x38\xe6\
+\x66\x9c\xcb\x5c\xdc\x07\x7c\x4b\x74\x1b\xc1\x18\x83\xec\x4d\x1d\
+\x0b\x08\x48\x29\xa3\x48\x25\xa2\x8e\x61\xdf\x56\xd6\x95\x42\x5f\
+\xee\xbd\x9e\xdb\xf2\xd1\x41\x97\xf5\x24\x27\xbd\xbd\xed\xf9\xff\
+\x9e\xf3\xbf\xe7\x3e\x8f\x00\x6b\xc4\xb6\x33\xd6\x64\xfa\xd8\x43\
+\xd9\x42\xb9\x79\xe5\xf6\x24\xe5\x39\xca\x2f\xfa\x5e\xd8\x64\x5f\
+\xad\x5e\xb0\xda\x8f\x35\xa7\xa7\xeb\xa4\x22\xee\xec\x53\x19\x8a\
+\xa4\x2d\x99\x6a\x68\x13\x64\x58\x66\x80\x69\xd7\x32\x7e\x9d\x75\
+\xc0\x7c\x6b\xd1\x11\x60\x45\xcf\xf7\xb7\x6a\x7b\x1f\x18\x50\x7d\
+\x6a\xaa\x6e\xbd\x42\x78\x71\x6f\x69\xba\xb0\x38\x4d\x86\x10\x07\
+\xf8\x43\xc0\x12\xe5\x22\xa5\x44\x08\x58\x9d\x4b\x38\x3f\xf2\x17\
+\xeb\xf2\x0a\x1a\x2e\xbd\x9c\xd3\x1b\x35\xa0\xea\xe4\xcd\xe4\x38\
+\xb1\x60\xe2\xe0\xd6\xc7\x93\x4a\xd2\xe4\x11\x71\x26\x22\x4e\x9a\
+\xb8\xb3\x0c\x28\xe3\x00\x8d\x02\x98\x71\xf9\x70\xfc\xc7\x59\x47\
+\x20\x84\xbc\x2b\xaf\xe4\xda\xa3\x02\x54\x76\x99\xdb\x0c\x9b\x13\
+\xbb\x5e\xaf\xd2\x20\xc8\x44\xc4\x7d\x24\xee\x09\x44\x00\x4e\x02\
+\x28\xc4\xc0\xc6\x78\x20\x73\x1d\x60\xbc\x36\x87\xcb\x37\xdd\x07\
+\x7e\x6a\xcb\x3f\x1e\x15\x40\x6f\x1c\x1b\x3b\xdc\x98\xa3\xd3\xa5\
+\x4a\x11\x64\xc9\x92\x20\x70\x97\xc4\xe7\x09\xe2\xf6\xd3\x77\x02\
+\x26\x50\x07\xf9\x4a\x20\x8b\x00\xe3\x36\x3f\xda\xbe\x9c\x32\x5d\
+\x7f\xb5\xa0\x20\x2a\x40\xd9\xd1\x91\x40\x77\x6b\xa1\x44\x26\x8e\
+\xd8\xc2\x8b\xfe\x4d\x00\x0f\x81\xfc\x04\x14\x52\xd5\x63\x72\x02\
+\x50\x07\xa9\x8f\x00\x1c\x59\x58\x69\x1c\x0d\xde\x78\xa3\x28\x2e\
+\x2a\x40\xc9\x7b\x43\x81\xb3\xad\x25\x12\x99\x24\x02\xb0\xf3\xb9\
+\x1c\x59\x79\x88\x00\x72\x11\x59\xa3\x02\x72\xa9\x83\x44\x19\xc0\
+\xd0\xbd\xa7\x8f\x0c\x05\x87\xde\x2a\x8d\x0e\x50\xf8\xf6\x8d\xb1\
+\x77\x9a\x0a\x75\xd9\xea\x38\xdc\xa3\x55\xdb\x48\xf8\x2e\xdf\x05\
+\x8d\x27\x1f\x52\x02\x6c\xcf\x92\x41\x4b\x0f\x39\x8e\xae\x2d\xce\
+\x20\x9a\x4f\x8e\x98\x46\xdf\x2d\x8b\xce\x22\x5d\xfb\xcf\xdf\x74\
+\x34\x15\xed\xd2\x69\xe4\xe1\x0e\xf8\xa9\x19\xbf\xe3\x47\xa2\x4a\
+\x1a\x16\x4c\x21\x7b\xb4\xe4\x7d\xca\xca\x7a\x27\x6d\x41\xec\x39\
+\x31\xd8\x6d\xea\xac\xd8\x1b\x15\x20\xef\xb5\xab\xd9\x2a\x85\x68\
+\xfc\xab\x83\x7a\x39\x3f\x45\x7c\x17\x3c\xc4\x43\xff\x76\xdf\xf3\
+\xc3\xb0\x41\x8a\x74\xf2\x9e\x1c\x0c\xfb\x5f\x7e\xf8\x3a\xbc\xbe\
+\xe0\x93\x13\xc6\x2a\x73\x54\x00\x3e\x72\xda\xfa\x3d\xcd\xb5\xd9\
+\xaa\x7d\x15\x1b\xc2\x53\xb4\x40\x16\x39\xc9\xeb\x05\xaf\x1f\x3b\
+\xb2\xa4\x50\xae\x54\xba\x7c\x0c\x2a\x3a\xae\x2e\x58\xba\x6a\x12\
+\xfe\x4f\xe7\xbe\x00\xed\xfe\x3e\xda\x83\x38\xdb\x85\x43\x35\x50\
+\x2b\x84\x91\x77\x80\x7f\x16\x04\xa8\xa5\x0e\xf8\xb8\x6c\xf5\xe2\
+\xa5\x13\x03\xd4\x84\x40\x69\xfd\x68\x9b\xef\x81\x00\x7c\x64\xb6\
+\x7e\x7f\x60\x6b\x79\xfa\xb1\x8e\xc6\xbc\xf0\xf4\xb0\x34\xb6\x36\
+\x6a\xa5\x4c\x13\x01\xec\xec\x1a\x85\xf9\x77\xdb\xf6\x99\xd3\x3b\
+\xfa\xee\xa7\xb1\x2a\x20\x0c\xd9\xd7\x1b\xf8\xb6\xf3\x59\x89\x8a\
+\x0c\x5f\x4f\x73\x6f\xfd\xd7\x8f\x62\x02\xb0\xe4\x7d\xd6\x8b\xdf\
+\xf9\x66\x3f\xad\x53\xac\x56\xbf\x26\x20\xbd\xa5\xe7\xeb\xdd\x75\
+\xf9\xbb\x5b\x2a\x37\x86\xb7\x85\x49\x47\x04\xd0\x3d\xe8\x40\xfb\
+\x27\x03\x17\xfe\x39\xd7\xd0\xf8\x50\x00\x4d\xf3\xf9\x4d\x22\x01\
+\x37\xfd\xe6\xfe\x1a\x3c\x97\x1b\x8f\x39\x7a\x21\xc4\x1c\x8b\xe6\
+\xce\x6b\x70\x7b\x96\xb4\xb7\xbb\x1b\xad\x0f\x05\xe0\xe3\x99\x53\
+\x53\x9c\xd3\xf2\x27\xec\x0e\x2f\x52\x32\x92\x10\xf0\xfa\xa0\x4c\
+\x4d\xc6\x60\x47\xf1\x9a\xf5\x51\x01\xe8\x54\xe3\xea\x73\xd7\x41\
+\x4f\xfb\x43\x8f\xd9\x0d\x5f\x80\xc1\x15\x93\x1d\x83\xed\x45\xb1\
+\x01\x54\x7f\x3c\xc5\xed\xcc\x4f\x40\xbd\x2e\x11\x9f\x0d\xd8\x08\
+\xc0\xe2\xd2\xd8\x3c\x86\x0f\x95\xc6\x06\x60\xf8\x70\x82\xdb\x55\
+\xa0\xc6\x13\xb4\x47\x0c\xcc\x78\xc2\x80\xfe\xe1\xdb\xf8\xed\xfd\
+\xf2\xd8\x00\xf4\x1f\x98\x38\x43\x76\x3c\xe2\xe5\x62\x2c\x92\xf8\
+\x2d\xd7\x12\x86\x2d\x0e\x8c\x1f\xad\x88\x0d\x60\xcb\x91\xd1\x8b\
+\x69\x8f\x4a\xea\x33\xd4\x74\xe8\x13\xe0\x8f\x39\x0f\xe6\x9d\xbe\
+\x9e\x09\xa3\xa1\x21\x26\x00\x3a\x1f\xf4\x4c\x90\x69\x62\x19\xb6\
+\x96\x09\x31\x60\x59\xf6\x07\xba\xfe\xdc\x72\xac\xfa\x97\xb5\x6a\
+\xff\x03\x8d\x82\xa6\x28\xaf\x8f\x9b\x2a\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xe3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xaa\x49\x44\x41\x54\x78\xda\x9d\x96\x6b\x6c\x14\x55\
+\x14\xc7\xff\x77\x1e\xed\xce\x3e\xba\x5b\xe8\x9b\x22\xa5\x4b\x2d\
+\x4f\x79\xc4\x94\x1a\x82\xa2\x1f\x80\x48\xa2\x54\x25\x68\x31\x18\
+\xe2\x07\x4a\x05\x05\x7c\x84\x06\x14\x91\xc6\x92\x60\x00\x0d\x21\
+\x25\x46\x1b\x41\x40\x40\x28\x41\x13\x10\x35\x11\x09\x46\x11\x12\
+\xad\x0a\x85\xd2\x42\x69\x4b\x5b\xe8\x76\xbb\x8f\xce\xec\xee\xbc\
+\x3c\x33\xdb\x22\x04\x2a\xc6\x9b\x3d\xb9\x37\x3b\x67\xce\xef\x9e\
+\xff\xb9\x8f\x61\xf8\x97\x16\x3e\x2c\x94\xc2\xc4\x2c\x30\x94\x50\
+\x3f\x9e\xfe\x1a\x39\xf0\xa8\x8d\xec\x3c\xd9\x19\xb2\x1f\xd2\x9e\
+\xd5\x7e\x1e\x2a\x06\xbb\xd7\x9f\xd1\x7a\x61\x26\x75\x8b\x58\x8a\
+\xab\x9c\x73\x0d\xf3\x70\xce\x74\x30\x87\x1b\x10\x52\x00\xd3\x84\
+\x99\x90\x61\x2a\x21\xdb\x0c\x25\x14\x31\xd5\xd8\x5e\xf2\xdf\xe3\
+\x2e\xd3\x4e\xdd\x17\x10\x3e\x24\x54\x32\xd1\xb1\x5a\xf0\xe5\xf9\
+\x85\x8c\x1c\x30\x97\x13\x8c\x33\xc8\x53\x03\x33\x29\xbe\x41\x63\
+\x0d\x30\x74\x72\x4e\x98\x04\x88\x42\x0b\x77\xc3\x88\x04\x9a\x4d\
+\x5d\xdd\x42\xd9\xec\x18\x12\xd0\x77\x50\xa8\xe2\x9c\xde\x0d\x62\
+\x56\x81\x98\x92\x95\x09\x26\x52\x44\x26\x00\xdc\x80\x9b\xa9\x53\
+\x02\x14\x5d\x27\xd3\x68\xac\x1a\x30\x54\xf2\x89\x1b\x50\x23\x3d\
+\xd0\xfa\xba\x54\x23\xae\xac\x4f\x5f\xa0\xd5\xdc\x05\x08\xec\xe7\
+\x2b\x39\xc9\xbb\x4d\xca\x2f\x12\xc5\x4c\x1f\x20\x8a\x14\x58\xa4\
+\xd9\x53\x0f\xce\x8a\x4e\x3f\x35\x69\x46\x82\x58\x71\x40\xd5\x68\
+\x68\x41\x0c\x98\x04\xd1\xa3\x7d\x50\x03\x9d\xaa\x96\x90\x57\x66\
+\x2c\xd4\x77\xdc\x02\xdc\xd8\x2b\xcc\xe4\xc4\x94\x3a\x29\xbf\xd8\
+\x9f\x9a\x9b\x09\xce\x41\xb3\xe6\x9d\x14\x37\x95\x3c\x08\xc0\x38\
+\x5b\x7b\x8a\x68\x07\x87\x19\x23\x40\x8c\xb2\xa0\x5e\x25\x98\x6a\
+\x49\x45\xa1\x12\x2a\x12\xa1\x1e\xc4\x02\xdd\xcd\x86\xae\x2e\xc9\
+\x2e\xd7\x4f\xd9\x80\xeb\xbb\xf9\x5a\x67\xf6\xa8\xa5\xae\x82\x42\
+\x70\x6e\x0a\x26\xb8\xc0\x78\x89\x00\x64\x8c\x0a\xcb\x78\x9a\x89\
+\x25\xcf\x00\xc0\x50\x48\xa6\x7e\xaa\x87\x4c\x4c\x02\x51\x06\x7a\
+\x8c\x8a\x6f\x59\x22\x0e\xb9\xa7\x13\xb1\x60\x70\x67\xde\x62\xbd\
+\x82\xb5\xd5\xf1\xa5\x82\x43\x3a\xe1\x2b\x9a\xe0\x11\x87\xbb\xc1\
+\xa4\x14\x9a\xb0\x0b\x65\x4f\x1d\xba\xa3\xf8\x47\xbe\x5b\x45\x81\
+\x49\x16\x5d\xa1\xc0\x0a\xca\xe6\x7d\x71\xc7\xf3\x2f\xeb\xa6\xc1\
+\xb0\x00\x71\x9d\xd8\x61\xf4\x75\x5e\x8f\xe8\xaa\x36\x9b\xb5\x7c\
+\xcc\xaf\x71\x67\x65\xd7\xf8\x0a\x8b\xc1\x7b\xad\x09\x4b\x28\x9b\
+\x7f\x0c\x1b\x37\xcd\xc1\xc4\x29\xa3\x69\xf2\x4e\xfc\xd9\xd0\x85\
+\x75\xaf\xef\xc5\x91\x6f\x57\x10\x40\xc6\xfc\xb9\x9f\x60\xe3\xfb\
+\x33\x30\x61\x3c\x49\xa8\xc9\xf4\x3c\x80\x77\xde\x6b\xc2\xc1\xda\
+\xc9\x34\x07\x2b\x0b\x05\xe1\xce\x2e\xc8\xa1\xfe\x2a\x76\xa9\x96\
+\x3f\x9c\xe1\xf7\x97\xb9\x73\xf2\xc0\xf9\x38\xaa\x2b\xbd\x44\x19\
+\x98\x14\xd8\x0a\xce\x06\xeb\x00\x5a\x9e\x26\x65\x60\x58\xfa\xcb\
+\x03\x12\xf5\x13\x20\x4a\xda\xc7\x29\xa8\x69\x3d\x22\x80\x6e\xcb\
+\xd4\x1f\x08\xa2\xb7\xab\xb7\x9e\x9d\xdf\xce\x37\xe6\x4f\x1e\x5f\
+\xec\xf0\xf9\xc0\xbb\x19\x65\xe0\xa0\x1a\x90\xf6\xbc\x8b\xcc\x01\
+\xc6\x2c\x20\x4f\xfa\x9b\xb4\x0f\x54\xea\x63\x76\x16\x20\xfd\x4d\
+\x82\xd8\x20\x2a\xae\xb5\x8a\x2c\x80\x25\x91\x55\xf8\x44\x24\x8a\
+\x8e\x96\x9b\x17\x59\xc3\x56\xae\x7f\xcc\x23\x93\x9d\xbc\xd3\x01\
+\x5e\xa2\x62\x3a\x68\x69\x8a\x56\x81\x09\x64\x15\xda\x5e\x45\x56\
+\x91\xcd\xe4\x1e\xb0\xea\x60\x28\xc9\x02\xdb\x99\xd0\x38\xa1\x25\
+\x01\x96\x3c\xd4\x5b\x00\x5d\x89\xa1\xe5\x42\x97\xcc\xce\x6d\xe6\
+\xfa\xc7\xcd\x98\x48\x00\x89\x16\x0d\x87\xc5\xcb\xce\x42\x96\x35\
+\xfc\x9f\xe6\xa4\xf7\x3f\xad\x2e\x24\x80\x4a\xab\x4a\x41\xd3\x1f\
+\x37\x65\xf6\xcb\x26\xae\x71\xec\xc3\xfe\xe2\x54\xaf\xd7\x06\xac\
+\xdd\x74\x01\x0f\xbc\x7c\x06\x53\x8a\x46\x61\x84\x8b\xc1\xeb\x48\
+\xa5\x99\x27\xee\x19\xd0\xa0\xad\x11\x25\xed\x3b\xfa\x4d\xfc\xd6\
+\xd4\x8a\xd6\x9d\xd3\x50\xbd\x3c\x97\x56\xb2\x0a\x39\x2c\xa3\xb9\
+\x31\x78\x91\x9d\xae\xe6\x0e\x17\x8c\xcb\x29\x1b\x9e\x9f\x41\xfa\
+\x8b\xd8\x7d\xa4\x1d\x17\x1c\xaf\xe0\xf9\x25\x6b\x51\xe8\x4d\x6e\
+\xf4\x74\x47\xb2\x0f\xd2\x32\xbc\x7d\xec\x4d\x65\x08\x91\x2c\x2d\
+\x21\x13\x27\x0f\x7d\x00\xef\xb5\x1a\xbc\xf8\xa4\xd7\x06\x04\xba\
+\xa3\x68\xbb\x12\xa9\x67\x27\xdf\xe5\xd6\x64\x8d\x48\xab\x29\x98\
+\x90\x4b\x72\x0b\x68\xb8\x2c\xa3\xf6\x68\x1a\x96\x6d\x3d\x7b\x0b\
+\x70\xbf\x66\x01\xea\xde\x2a\xc1\x4b\x8f\xb6\x63\xd2\x68\xd1\xae\
+\xc1\xb5\x2b\x61\xdc\xe8\x8e\x57\xb1\xef\xd7\xb1\x52\xa7\x4b\x3c\
+\x31\x76\x6a\xae\x47\x4a\xa3\xe3\x41\xe0\xf1\xf9\x57\xdd\x68\x4b\
+\x29\xc7\xab\x6f\x6c\xfd\x4f\x19\x7c\xf6\xd1\x6a\x78\x02\x75\x58\
+\x34\xd7\x03\x53\xd3\xa0\x44\x62\xb8\xd8\x18\x09\x2b\x8a\x31\xc7\
+\xf6\x3e\xbe\x86\xd5\x8e\xf2\xa7\x2d\x2d\x28\xce\xb0\x0f\xb7\x9b\
+\x11\x1d\x07\xbe\x09\x42\xcb\x2a\x47\xc5\x8a\x6a\x78\xdc\x9e\x7b\
+\x02\x44\x35\x8c\x5d\xb5\x6f\x23\x7e\x6d\x17\x9e\x7b\xdc\x89\x4c\
+\xaf\x69\x03\xae\x36\x93\x3c\x6d\xf1\x9d\x73\x37\x99\x15\xb6\xf7\
+\xd7\x6f\xb2\x99\x92\xc4\xd7\x15\x8d\xf3\xf9\x33\x73\x29\x18\x2f\
+\xa0\x27\xa4\xe3\xf8\xe9\x10\x1a\xda\xf3\x30\xfd\xb1\x85\x98\x5a\
+\xf2\x04\x72\x8a\x4a\x91\xaa\x85\x29\xfd\xbf\x70\xee\xa7\x63\xf8\
+\xf5\xc7\x03\x98\x94\xdf\x85\xd9\xd3\x25\x64\xa6\xd1\x42\xa6\x63\
+\xbc\xe7\x06\xad\x9e\x26\xa5\x39\x1e\x33\x97\xcc\xdb\x6c\x9e\xba\
+\x25\xf2\xd1\x55\xac\xd2\x37\x4c\xd8\x36\xa6\xd8\x2b\xfa\x32\x24\
+\xca\x84\xb7\x4f\xd1\x86\xcb\x31\xfc\x7e\x49\xc6\xa5\xab\x31\x74\
+\x74\xab\xb6\xef\x88\x6c\x11\x0f\x3e\x90\x82\x87\x8a\xc8\xfc\xb4\
+\x4f\x74\xdd\xbe\x81\x82\xbd\x71\x34\x37\x29\x6a\x30\xa4\xaf\x7c\
+\x7a\x0b\xfe\x39\xae\x07\x5b\xfd\x6b\xac\x2a\x7d\x98\xb0\x61\xb4\
+\xdf\x29\x66\x66\x5b\xc7\x35\x97\x3c\xaa\x2d\xb7\x41\x4f\xd3\x18\
+\x30\xd3\x0e\x6a\x5a\x63\x02\x50\x41\xd1\xda\x1a\x53\x7b\x83\xe6\
+\xfa\x67\x3e\x34\xef\xbe\x70\x06\xdb\xc1\xe5\xa8\x94\x24\x6e\xf5\
+\xc8\x91\x0e\x7f\x6e\xbe\x03\x2e\xb7\x40\x4e\xd6\x3e\x46\x72\x37\
+\x0f\x40\x98\x0d\x30\x10\x8d\xaa\xb8\xde\x91\x40\x7b\x87\xda\xac\
+\xc4\xcc\x2d\x0b\xb6\x63\xe8\x2b\x73\xb0\xed\xaf\x84\x7d\xe9\x7b\
+\xdc\x5c\x79\x46\x86\xe0\xa1\xac\xe0\xf1\xf0\x70\xba\x38\xeb\xd6\
+\x44\x4c\xd1\x11\x0a\x69\xe8\xed\xd3\x11\x08\xe8\xe1\x68\xd4\xd8\
+\x47\xfe\x7b\x16\xee\xc0\xfd\x2f\xfd\xdb\xdb\xbe\x0a\x94\x52\x37\
+\x8b\xac\x84\x6c\xc8\xcf\x96\x17\x6a\x31\xe4\x67\xcb\xdf\xbd\x8f\
+\xd1\x45\x9c\xa9\xd8\x42\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x94\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x5b\x49\x44\x41\x54\x78\xda\xad\x94\x6b\x6c\x54\x45\
+\x14\xc7\xff\x73\xef\x6d\x77\xdb\x6e\xdb\xed\x6e\x1f\xb4\x28\xed\
+\x96\x96\xd6\x10\xe4\xa5\x12\x43\x45\x05\x53\x41\xe9\x46\x24\x3e\
+\x42\x7c\x10\x45\x51\x24\x21\xc6\x80\x44\xfa\x41\xb3\xdf\x34\xf1\
+\x1b\x89\xa0\x50\x15\x03\x91\x82\x42\xa0\x09\xa4\x4d\x13\xc1\x56\
+\x63\xaa\x06\x09\x95\x55\xdb\x62\x8b\xd0\x76\xbb\xdb\x76\xb7\xdb\
+\x7d\xdc\xc7\x78\xee\xdc\xb6\x29\x68\x1f\x82\x27\x99\xcc\x3d\x33\
+\x73\xcf\x6f\xce\x6b\x58\xd1\xee\x3e\x0e\x21\x34\x19\x1c\x9c\x9b\
+\x43\x27\x95\x8b\xc1\x0d\xc3\xd2\x0d\x73\x5f\x27\x7d\x7c\x9f\xd6\
+\x75\xc3\x5c\x8b\x05\x0f\x2e\x4f\xc7\x14\xc2\x3c\xb5\xbd\xfc\xae\
+\x52\x3b\xca\x73\x65\xf4\x46\x0c\xa4\xc8\x40\xaa\xcc\x90\x22\xd1\
+\x6c\x0e\xd2\x6d\x62\x8d\x0b\xdd\xa6\x58\x7a\x24\xa6\x63\xef\xc9\
+\x9e\x64\x9c\x2b\x0f\x0c\x7c\xb4\xf0\x87\x29\x01\x25\x7b\xae\xf3\
+\x05\x1e\x3b\x9c\x69\x12\x56\xdc\x91\x82\xee\x61\xdd\x32\x64\x1a\
+\x1d\x33\x36\xae\x9b\xc6\xf3\x1d\x12\x3a\xfa\x55\xbc\x5f\xdf\xa5\
+\x27\xb8\xb2\x3a\xb8\x6f\xd1\x39\x4c\x23\xac\xf8\x9d\x6b\xbc\xa2\
+\xd4\xf2\xb0\x38\x47\x46\x4d\x65\x0a\x2e\xf7\x6b\x13\x06\x6d\xe4\
+\x8d\x39\xdb\x49\x77\x67\x48\x68\xbf\x96\xc0\x7b\x87\x3b\xa1\x72\
+\x79\x6d\x70\xff\xe2\xb3\x98\x41\x58\xf1\xee\xab\xbc\xa2\xcc\x61\
+\x65\x81\x62\xbe\x78\x8e\x8c\x4d\x4b\xed\xf0\x13\xc4\x6e\x02\x14\
+\x26\x60\x85\xd9\x12\xbe\xeb\x88\x63\xcf\x67\x1d\x64\x5c\x7a\x32\
+\xf8\xf1\x92\xaf\x67\x32\x2e\x00\xf3\xde\xee\xe1\x95\xe5\x99\x63\
+\xc9\xe5\x94\x33\x8e\xd5\xf3\x53\xf1\xe2\x7d\xe9\xe8\x0e\xa9\x04\
+\x61\x64\x5c\x46\x63\x7b\x14\xbb\xea\x3a\xa1\xe9\xfc\xf9\xe0\x81\
+\x65\x5f\xcc\xc6\xb8\x00\xdc\xb9\xab\x9b\x57\x96\xdd\x08\xe0\x54\
+\x21\x1b\x17\xd9\xb1\x79\x45\x86\x28\x9e\xd3\x17\xa3\xd8\xf9\x69\
+\x27\xe2\x09\xa3\x21\x74\x60\xd9\xfa\xd9\x1a\xb7\x00\x3b\xaf\xf0\
+\x05\x65\x59\x56\xf9\xd1\x30\xa8\x2c\x0d\x13\x46\x25\xf8\xee\x63\
+\xd9\x08\x44\x74\x7c\xd8\x14\x22\xb0\x81\x9e\xae\x20\x79\x00\x6f\
+\xa8\xee\x9e\x53\xb3\x06\xcc\x7d\xab\x93\x72\x90\x2d\x6e\x2d\x6e\
+\x3f\x06\xd9\x70\x77\x1a\xea\x7f\x1c\x81\x4e\xb5\x6f\x68\x06\xcd\
+\x1c\x8c\xce\x5c\xfd\x73\x00\x9a\xc6\xbd\x83\x9f\xdf\x3f\x2b\x08\
+\x9b\xfb\x66\x07\x2f\x2f\xb7\x3c\xb0\x00\x06\x56\x7a\x52\xd1\x74\
+\x29\x02\x49\x62\xc2\x13\x9d\x06\x7d\x09\x00\xa3\x9f\xae\x74\xf5\
+\x41\x53\xb9\x77\xe8\xf0\xaa\x19\x21\xac\x68\xc7\x6f\xbc\xbc\xcc\
+\x69\x85\x86\x46\x89\x53\x46\x9b\x7f\x08\xc1\x40\x14\xf9\x05\x19\
+\xb0\x51\x8d\xea\xb4\x6e\x76\xae\x9d\xfa\x41\x80\xe8\xc7\x8e\x3f\
+\xae\x23\xa1\x1a\xde\xf0\x97\x6b\xa6\x85\xb0\xc2\x1d\x7e\x5e\x36\
+\xdf\x29\x6e\x6a\xc6\x39\xd8\x1f\x46\x20\x18\x0b\x70\x4d\x6d\x60\
+\x12\xdb\x9c\x97\xeb\x40\x0a\xd5\xa9\xb9\xa7\x30\x8e\x4c\x1b\x83\
+\x6c\x12\x28\xf9\xbf\xfa\xff\xa2\xc4\x6b\xde\xc8\xf1\xb5\xa7\xa6\
+\x06\x6c\x6f\xe7\xa5\x02\xc0\x11\xe8\x1d\x46\x68\x28\x1e\xd3\xa2\
+\xe1\xa5\xc3\x47\x1e\xf2\x67\x3f\x77\xbe\x96\x31\xe6\xcb\xcd\xcb\
+\x82\xac\x58\x10\x9b\xc2\x51\xe0\x50\xa0\x48\xe6\xdf\xc0\x4f\x17\
+\xba\x31\x1a\x57\xbd\xd1\x93\x35\xff\x0a\x61\x73\xde\xb8\xc4\x3d\
+\x1e\xe7\x98\xf1\x84\xae\x45\x42\x55\xe4\xf6\xf7\xe3\x07\xb2\x9e\
+\x6d\xae\x25\x4f\x7c\x2e\xb7\x13\x92\x2c\x51\x3e\x74\x64\x51\x5b\
+\xcf\x73\x29\xf4\x6e\x99\x01\x03\x5a\xdb\xba\x30\x32\x9a\xf4\x8e\
+\x9e\xde\xf0\x0f\x08\x2b\xd8\x76\x91\xe7\x64\x2a\xe8\x1f\x18\x85\
+\x16\x19\xac\x0e\x1f\x7d\xa4\xf1\xe6\x43\x99\x1b\xcf\xd6\x32\x59\
+\xf2\x65\xbb\x73\x40\x79\x27\x08\x87\xdb\x21\xa3\xb2\xc8\x4e\xef\
+\x15\xa3\x1c\x31\x34\xb5\xf8\x11\x1e\x49\x78\xe3\x67\x9e\xbe\x01\
+\xc2\x72\x5f\xbd\xc0\x0d\x5d\x83\x3a\x1c\x7c\x26\x72\xac\xfa\xe8\
+\x54\xb1\x74\x3c\xd1\x50\x4b\x65\x45\x10\x97\xb8\xb5\xe9\x49\x91\
+\x33\x15\xcb\x4b\x1d\x63\x10\xe0\x44\x73\x3b\x86\x86\x63\xde\x44\
+\xe3\xa6\x09\x08\x73\x6f\xf9\x99\x27\x86\xfa\xb7\x8f\x1c\x7b\x74\
+\xef\x4c\x25\x97\x5e\x73\x82\xc2\x25\xf9\x32\x5d\x6e\x61\x50\x54\
+\x5d\x9e\x0d\x0f\x2e\x74\x8a\x37\x8b\x9a\x10\x87\x1a\x7e\x41\x68\
+\x30\xea\x4d\x36\xbf\x20\x20\x6c\x36\xcd\x32\x59\xd2\xd6\xd5\x53\
+\xb8\x64\x5f\xba\x2b\x4f\x34\xa0\x41\xfd\x53\x51\x94\x86\xc7\xef\
+\xcd\x15\x90\x24\x41\x3e\xa8\xfb\x16\xb1\xb8\xb6\x4e\xfd\xe6\xa5\
+\x33\xff\x19\x60\x8a\xbd\xfa\x08\x79\x22\xfb\xd2\xdc\xf9\xd4\x70\
+\xd6\xd3\xb2\xa4\xc4\x81\xa7\xaa\x0a\xd0\xea\x0f\xe3\xab\x86\x36\
+\xb3\x6f\xb6\xaa\xe7\xb6\xec\xbf\x25\x80\x29\xb6\x35\x87\xc8\x13\
+\xc5\x67\x77\x15\x40\x4b\x5a\x10\x4f\x61\x06\x7e\x6f\xf7\x53\xc9\
+\x6b\x2f\xab\xe7\x5f\x39\x78\x4b\x21\x9a\x2c\xa9\x0f\xd7\x51\xe2\
+\x15\xf2\xa4\x50\x34\x5e\x2c\xd0\x93\x34\xd4\xe4\x7a\xad\x65\xeb\
+\x44\x25\xde\x16\xc0\x94\x94\x55\x9f\x08\x4f\xe8\xa9\x0f\x71\x35\
+\xb1\x52\x6b\x79\xed\xf2\xe4\xfd\xdb\x06\x98\xa2\x54\xed\xdb\x46\
+\x8f\xe4\x71\xbd\xf5\xf5\xbe\x9b\xf7\xfe\x17\xc0\x74\xf2\x37\x46\
+\x62\x32\x37\xb8\x58\x6c\x3e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x05\x14\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xdb\x49\x44\x41\x54\x78\xda\x95\x55\x6b\x6c\x14\x55\
+\x14\x3e\xf7\xce\xcc\xee\x76\xbb\xb4\x5b\xba\xaf\xb2\x14\xc1\x42\
+\xa4\x95\x62\x1b\xc5\x54\x84\x88\x98\x6a\x13\x44\xaa\x90\x20\x46\
+\x89\x10\x90\xc4\x18\xfe\x18\x53\x83\x8f\x88\xf5\x07\xea\x0f\x4c\
+\x34\x04\x11\x7f\x18\xc1\xf8\xc3\x48\xd3\x12\x28\x4a\x88\x22\x58\
+\x12\x8c\x28\x52\x5a\x52\x2d\x16\xfa\xda\x3e\x96\x6e\x3b\xbb\xb3\
+\xbb\x33\x73\x8f\x67\xba\xdb\x6d\xb7\x60\x4a\x6f\x72\xe6\xbe\xce\
+\xfd\xbe\x73\xbf\x73\xef\x1d\x06\xb3\x28\xd8\x16\xf4\x53\x55\xc9\
+\x4a\x7b\x9a\xef\x76\x0d\x9b\x01\xf0\x55\x02\x3b\x30\xa5\x7f\x9c\
+\xaa\x52\x1a\x2b\x99\xe6\x57\x45\x63\x17\x66\x4d\x20\xae\x2d\x52\
+\x01\x45\x0b\x5f\xda\x55\x8d\x57\x83\x36\x74\x97\x6b\xcc\x7e\x0f\
+\xc7\x50\x53\x21\x2f\xeb\x0d\xe3\xd5\x79\xc5\xe4\x76\x89\xec\x38\
+\x2b\xeb\x7d\x79\xf6\x04\xdd\xeb\xe2\x2c\xb0\xdd\x8e\x9d\x6f\x7d\
+\x04\x7a\xe4\x6f\x76\xdf\xfe\x43\x00\x32\xe0\xb5\xdd\x7b\x69\xfa\
+\x4b\xf0\x3d\xde\x09\x39\x8b\x65\xe8\xfa\xe2\x43\x7e\x7f\xef\x9b\
+\x33\x12\x98\x7f\x15\x7d\x96\x6e\xbe\x2b\x95\xf7\x85\xcd\xfe\xcd\
+\x31\xee\xaf\xcb\x01\xbd\x15\x44\xff\xe1\x6e\x5e\xbc\x7f\x3e\x80\
+\x01\xa2\x63\xdb\x79\xe6\x7d\x6c\x05\x73\x6f\xb7\x61\xac\x09\xb0\
+\xf3\xd0\x46\xf2\xff\x3e\x83\x73\xa5\xc8\x2f\x2d\xeb\x0b\xdd\x46\
+\x60\x5c\x0e\xd4\xf1\x79\xb5\xfb\xc0\x3e\x1f\x45\xf7\x91\x53\x6c\
+\x4e\x49\x19\x0f\xd6\x2f\x48\x4d\x76\x50\xf0\x4b\x52\x9a\x47\x8e\
+\x22\xcb\x7f\x9e\xd6\x4a\x80\xe1\x4f\x51\xf4\x9c\x74\xd0\xe8\x0e\
+\xe6\x2e\xad\xc7\x91\xf6\x02\x72\x59\x23\x2f\xef\x3f\x7b\x47\x89\
+\xf4\xce\x55\x71\x79\xd1\x27\x76\x80\x24\xa0\x7a\x1a\x98\x6b\x9d\
+\x85\x48\x76\x9d\x34\xfb\x97\xac\x8b\xcc\x0a\x8e\x30\x99\x17\xcc\
+\xd0\x65\xc1\xe7\xae\x66\x2c\x77\x3d\x03\xfd\x0a\x18\x6d\xef\xb7\
+\x2a\x15\x03\xcb\xfe\x37\x07\xc9\x4b\xde\x9d\x4a\xd9\xc7\x87\xc0\
+\xb6\x3c\x9d\x88\x36\xb2\x3f\xc9\x6e\x90\xc5\x69\x40\x23\x32\xcb\
+\xa8\x8d\x09\x32\x1d\x80\x07\x69\x77\x8f\x82\x7e\xfd\x3b\x1d\xb4\
+\x81\x62\x5b\xe5\x40\x28\x43\x10\xff\xcd\xeb\x67\x0c\x9b\xa5\x82\
+\x4a\x1f\xd8\xf2\x15\x1a\x32\x41\x72\x7a\x24\xff\x4e\x2b\x9b\x24\
+\xe8\xaf\x69\xc0\xa9\xc0\x13\x96\x24\x77\x22\x40\x01\xc6\x80\x00\
+\x31\xa2\x7e\x4e\x9d\x73\x88\xec\x86\xe3\xa1\xc1\x49\x89\xe2\x17\
+\x3d\x6f\x73\xdf\xea\x7a\x65\x41\x1d\xf5\x6c\xe9\xc8\xdb\x09\xfc\
+\xcc\x14\xd0\x29\x24\x90\x48\x81\x5b\x06\x22\x05\x83\x56\x93\x72\
+\x62\xdf\x40\xd3\x06\x24\x3b\xbe\xb2\x50\x5e\xc9\x48\xa4\x5d\x98\
+\xbb\x99\xbb\x17\x1f\xb1\x2d\x79\x47\x26\xe1\x09\xfc\x07\x5a\x70\
+\x73\x12\xdc\x92\x46\x68\x29\x59\x20\x2d\x0d\x98\xb7\x1f\xed\x84\
+\x0f\x12\x5d\x37\x63\xa0\xc7\x76\x39\xab\xc2\x47\xb2\x72\x10\x6d\
+\x29\x58\x2f\x7b\x2a\x8e\xd9\x16\x6e\x92\x40\x5c\x98\x16\x39\xb5\
+\x4d\x32\xc3\x00\x34\x04\xa9\xc2\x09\x8d\x0c\x09\x82\xd1\x2e\x84\
+\x01\xfa\xd0\x20\x9a\xb1\xe4\x81\xdc\x95\xb7\x5e\xcb\x4a\xb2\x7a\
+\xce\x7d\xd8\xb1\x74\xc7\x36\xa9\xa0\x9a\x03\xf7\x12\x48\x13\x81\
+\xb5\x66\x08\x50\x57\x29\xfb\x54\x27\x8d\x14\x20\x62\x56\xd4\x98\
+\x06\x12\xba\x0e\x46\x64\xcc\x34\xa3\xb1\x46\x1a\xdd\xea\x5a\x15\
+\x51\xd9\xe8\xd9\xbc\x7d\x4c\x71\xbd\xe1\x58\xbc\x85\xcb\xee\x95\
+\x74\x1a\x16\xd2\x59\x3d\x48\xde\x03\x29\xf0\x58\x98\xaa\x28\x11\
+\x8a\x14\x2e\x9b\x3c\x7a\x13\xc0\x53\x6b\xeb\x23\xb4\x38\xc4\x87\
+\x22\x49\x86\x62\x6b\x46\xa2\xc8\x4f\x73\x6a\xa8\xaa\x65\x8a\xe3\
+\x39\x57\x69\xb9\x97\x39\x48\x25\x75\x90\x74\x8b\x8c\x2f\x47\x98\
+\x8c\x9a\xa5\xbf\x53\x81\xcd\x68\x02\x74\x95\x02\x32\x45\x5c\xe8\
+\x26\x45\x85\x03\xc0\xd8\xb7\x59\x39\x18\xf9\xa5\x70\x57\xde\xc3\
+\xfb\x0f\x32\x3c\x41\x77\x8b\x9e\x07\xf5\xd6\xed\x8f\xcb\xb8\xe6\
+\x98\xa6\xc8\xc4\x0d\x82\xd2\xa0\x85\x46\xa3\x22\x61\x96\xb8\x9f\
+\x88\x86\xb2\x83\xa1\x12\xfe\xd1\xf9\x62\xfe\x23\x1f\x7c\xcd\x73\
+\xd7\x80\x18\xde\x03\x7a\xcf\x45\x90\x9d\x32\xcc\x58\xd0\x4a\x09\
+\x02\xe3\xb4\x23\x13\x41\xed\x8d\x0e\x17\xac\x8d\x7a\xb2\x08\x86\
+\x4f\x39\x4a\x18\x63\xed\xf6\xe0\x83\x72\xbc\xe7\x77\x3a\x26\xa2\
+\xd3\xe6\x92\xef\xcd\xf1\xd8\x64\xcc\xc4\x99\xad\xf8\x84\x68\x8c\
+\x76\x34\xd6\xa3\x19\x92\x9d\x4b\xb2\x9d\x33\x3d\x4e\x97\x4e\x33\
+\x1b\x0b\x9f\xd4\x36\x64\x08\x86\x9a\x1d\xf4\xa7\x42\xbf\xa7\x26\
+\x71\x79\x9c\xb0\xd9\x51\xe3\x0c\x28\x27\x15\x3b\xb3\x9c\x81\xc9\
+\x1c\x24\xba\xe3\x82\xc0\xe8\xd6\x8f\xc3\x5b\x40\xb2\x8d\x96\x53\
+\xe4\xda\x90\x81\x49\xd5\xf4\x50\x6f\x37\xcd\x3e\x45\xb5\x0f\x19\
+\xae\x20\xbc\xf0\x1d\xff\x07\x43\xa7\xec\x7f\xe4\x05\xf9\x03\xf1\
+\x11\x01\x89\x51\x68\x73\x05\x78\xa9\x4c\xcf\x5f\x7c\x04\x41\x71\
+\x32\xb0\xda\xb1\x30\xd2\xb5\x40\x2d\xd7\x2f\xe5\xe8\x51\x01\xb1\
+\x61\xdc\xeb\x5d\x97\x78\x6f\x3a\xd6\x1d\x09\x06\x4f\x28\x3a\xed\
+\x9f\x93\xb4\x7b\xa8\xdb\x32\x27\x00\x3f\x73\x89\xc1\x68\x1f\xf6\
+\x29\x4e\xf0\xe4\x7a\x40\x51\x29\x8d\xba\x06\x01\xc6\xa1\x5d\xc9\
+\x01\x77\x52\x85\xf3\xbe\xf5\xfa\xaa\x19\x09\x42\x8d\x32\xfd\x6f\
+\xd9\x37\x24\xd9\x0b\xfe\x67\x8c\x7f\x42\x4d\x72\x95\xb3\x00\x5b\
+\x92\x51\x92\x2b\x01\x1b\x69\xc5\x96\xbc\x80\xd8\x34\x16\xe2\x86\
+\xef\x69\x43\x09\x35\x2a\xf4\x78\x21\x3d\x5a\x10\x24\xff\x45\x77\
+\xb5\x83\x2c\xc2\x06\xc9\x85\x1c\xc6\x68\x47\xa7\x03\x1b\xcc\xea\
+\x7e\xea\x73\x09\xc2\x74\x2c\x43\xd4\x2f\x9e\xf0\xeb\x6f\x90\xfd\
+\x81\x5a\x23\x34\x6b\x02\xab\xf4\x35\xf0\x33\x45\xb5\x62\x6d\xa6\
+\x7f\x8c\xbf\x4e\x89\xae\x08\x3c\x6b\xbe\x34\xd3\xda\xff\x00\x62\
+\x3a\x61\xc1\x3a\x72\x47\x5b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\x9f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x66\x49\x44\x41\x54\x78\xda\xad\x95\x6b\x4c\x93\x57\
+\x1c\xc6\x9f\xb7\x94\x96\xd2\xf2\x96\x42\xa9\x2b\x50\x8a\x5c\x04\
+\x37\xa0\xdc\x17\x0b\x73\x84\x8b\x91\xe1\x98\x13\x37\x03\x92\x18\
+\x89\x8b\xd9\xe5\xc3\xb6\x2c\x99\x64\x31\x61\xe1\xc3\x5c\xb2\x8c\
+\xc5\xcc\x18\xcd\x86\x71\x23\x68\x08\x4e\xa3\x6e\x32\x06\x04\x44\
+\xd8\x90\xa1\x80\x15\x25\xdc\xad\x83\x41\xb9\x15\x6a\x0a\x14\x38\
+\x3b\x3d\x65\x90\xec\xc3\xeb\x24\x9e\xa4\x39\xff\xbc\xef\xef\x79\
+\x9e\x73\xfe\x39\xef\x29\x87\xe7\x3c\x12\xae\x93\x1d\x74\xca\x71\
+\xfe\x3a\xf6\x70\x71\xdc\x73\x32\xdd\xed\x34\x94\x8a\xf0\x96\xde\
+\x13\x5b\x82\x65\x40\xad\x05\x56\x1a\xe0\xbd\xa9\x80\xb8\x2b\xcb\
+\x32\x2a\xcc\x02\x87\x03\x62\x11\xc9\x0e\xf6\x14\xa9\xc2\x15\x1c\
+\x82\x3c\x39\xb8\x39\x1d\x09\x70\x6a\x70\xc5\x7a\xf7\x0d\xf1\xff\
+\x0f\x88\xad\x5e\x50\x82\xe3\x72\x40\xc8\x7e\xb1\x88\xdb\xad\xf3\
+\xe4\x64\x11\xbc\x08\x81\x72\x11\xc4\x1c\x81\x4a\xca\x31\xe3\xd9\
+\x45\x0a\xd3\xf2\x74\x9f\x03\x9d\x79\x52\x4e\x30\x20\xe6\xa2\xed\
+\x05\x2a\x7a\x93\x0a\x72\xdd\x41\xb2\x02\x14\x62\xb7\x30\x2f\x11\
+\x74\x72\x37\xb8\xbb\x81\x9a\xba\xcc\x9c\xc6\x7d\xd6\x55\x0c\xdb\
+\x56\x91\xe8\x2b\x66\xda\xb3\xbd\x0b\xe8\xce\x57\x08\x07\x44\xff\
+\x30\x4b\x74\xd4\x30\x94\x17\x43\xa7\xa0\xa6\x22\x0e\x3e\x1e\x1b\
+\x92\xee\xa9\x65\x98\xe7\x57\xf0\xc8\xb6\x3c\x68\x5b\x22\xc7\xa8\
+\x5b\xd5\xe1\xed\x72\x96\xf9\x7d\xcf\x13\x98\x0e\xa9\x84\x03\xe2\
+\xca\x2d\xe4\x33\xa3\x12\x03\x33\xab\xf0\xa5\x5d\x5f\x59\xa5\xa6\
+\x16\x07\x46\xe6\x1c\x18\x7d\xb2\xdc\xb5\xe0\x20\x3f\x51\xec\x72\
+\xcf\x3b\x9a\x7b\x4e\xfe\xc5\xef\x26\xc8\xa1\x97\x78\xa6\x3d\x7f\
+\x7f\x0e\x3d\x47\x34\xc2\x01\xf1\x67\xc7\xc8\xde\x48\x9e\xf5\xa1\
+\xe9\xd1\x3c\xc6\x6d\xcb\xf5\x8e\x15\x72\x8d\x3e\xa8\xee\x7d\x3f\
+\xf0\xaf\xff\xf2\x91\xa7\x1e\x93\x83\x31\x3e\xac\xae\xb8\x37\x8d\
+\xde\xf7\x02\x85\x03\x22\xca\x86\xc8\x7e\x83\x9a\x6d\xf9\x62\xa7\
+\x05\xfd\x1f\x87\x08\xf2\xe1\x65\x83\xe4\x80\xc1\x8f\xd5\xff\xf2\
+\x82\x82\x90\x2f\x1e\x90\x7d\xf1\x5a\xb6\x83\xcb\x77\x46\x31\x50\
+\xbc\xfd\x29\xfc\x43\x92\xe7\xe4\x29\x75\xa9\x63\x0c\x83\xc5\x91\
+\xc2\x01\xfa\x92\x6e\x92\x9b\x18\xc0\x02\xae\xfe\x69\xc6\x48\x89\
+\x41\x90\x0f\x2e\xe9\x22\xaf\x27\xea\x58\x7d\xad\xdd\x8c\xe1\xcf\
+\x0d\xc2\x01\x81\xc7\xda\x49\xf6\xcb\xc1\xac\xae\x69\x1b\x86\xf9\
+\x44\x92\x20\xaf\x2b\xa6\x7c\x72\x30\x3b\xb6\xbf\xdc\x1e\xc2\xe3\
+\x13\xc9\xc2\x01\xfe\x1f\xde\x22\x99\xc6\x30\x27\x8f\xba\xdf\xfb\
+\x31\x56\x96\xfa\x74\x7e\x47\x18\xab\xeb\xfe\xe8\xc7\x28\xe5\x05\
+\x05\x9a\x77\xeb\x49\x5a\x4a\x24\xab\x9b\x5a\x7a\x31\x7e\x3a\x9d\
+\xdb\x78\xd7\x10\x45\xa7\x5c\x0e\x24\x83\x2e\xc0\xe0\xfa\xde\x38\
+\xdf\x57\x53\x22\xd8\xa1\x68\xa4\xfc\x04\xe5\x05\x03\xd4\x45\x37\
+\x88\xf1\x95\x28\x26\x6d\xb9\x69\xc2\xd4\xb9\xd7\x18\xef\x7b\xf8\
+\x46\xba\x54\x22\x2e\x55\xa9\x79\xa3\x4a\xa5\x80\x17\x2f\x63\xfc\
+\xfc\x9c\x1d\x3e\xbe\x5e\xac\x6e\x69\xbe\x8f\xa9\xf2\x6c\xe1\x00\
+\x55\xc1\x15\x92\x9c\x16\xcb\xea\xb6\xc6\x4e\xcc\x56\xee\xe5\xd6\
+\x9e\x57\x06\x86\x68\xf3\xfd\x83\x34\xf8\x3a\x57\x8b\xa1\xa9\x25\
+\x9c\x6c\x99\x62\x87\x61\xed\xe6\x40\x3b\xe5\x67\x28\x2f\x18\xc0\
+\xef\xab\x22\x71\x19\xf1\x4c\xd8\xd9\xd0\x01\xeb\xa5\xb7\x19\xcf\
+\xe7\x55\x59\xa3\x53\x63\xf8\x83\x49\x6a\x04\x28\xdd\x51\x76\x73\
+\x92\xba\x12\x10\x6a\x97\x10\xe4\x85\xb6\xfe\x69\x98\x6e\x75\xcf\
+\x51\x5e\xb9\x1e\xa0\xc8\xa9\x88\x22\xac\xa7\xc8\xa0\x7e\x06\xb8\
+\x56\xe2\x1b\x93\x99\xcc\x56\x64\xaa\xbb\x0d\xdb\xf5\x42\xc6\xcb\
+\xf7\xfc\x58\xa9\x0d\xd5\xe5\xab\xb7\xfa\xaf\x2f\x26\x79\x2b\x0f\
+\x95\x5c\x02\xb9\x87\x18\x67\xaa\xef\x62\xbc\xcf\x7c\xc1\xf6\x73\
+\x61\x01\x13\xc8\x76\x95\xa7\x8b\x25\x92\x52\xaf\x2d\x3e\x46\x85\
+\x5a\x05\x99\x52\xc1\x44\x76\xeb\x3c\x14\x7e\xae\x4f\xff\x41\x6d\
+\x2b\xec\xb5\x45\x2e\x3e\xab\x3c\xdd\x5d\x2a\x29\x55\x68\x28\xef\
+\xe7\x8d\xf4\x84\x20\xb6\x83\x86\x3b\x66\xd8\x26\x67\x31\x3f\x3e\
+\xdd\xba\xbc\xb8\x74\xdc\xfe\x5b\x51\x03\x13\x48\xd2\xce\x54\xaa\
+\xb7\x05\xe7\xfb\x84\xe8\x50\x51\xa8\x47\xaf\x65\x09\xa5\xbf\x8e\
+\x6d\xf4\xca\x79\x1d\xd7\x34\x63\xb1\xe9\xe8\xfa\x8e\xa5\x69\x67\
+\xd8\x29\xa2\xc6\x19\x74\x36\xb8\xee\x6d\x74\xd1\xa9\x9e\xce\x57\
+\x17\x1b\x8f\x9a\x80\xb5\xa7\xee\xc6\x6f\xad\xfa\x4c\x23\x7f\x64\
+\xa7\x16\x7a\x95\x04\x25\x35\x63\x6c\x45\xf4\x0f\x06\xa9\x61\x4a\
+\x34\x99\x2c\x18\xa9\x6f\x9d\x73\xb4\x7e\xa0\xc4\x33\x0e\x16\xe0\
+\x96\xf4\x4d\xa5\x77\x64\x68\xbe\x32\x5c\x0f\x8e\x70\xac\xe7\x3b\
+\xb7\x79\x43\xcd\x7b\x80\x97\xb9\xe3\xe4\xb9\x66\xcc\x3c\xec\xbf\
+\xb0\xd2\xfe\x51\xc1\xa6\x02\xb8\xd8\xaf\xd2\xc5\x1e\xd2\x52\x0f\
+\xad\x9f\x51\xa6\x51\x63\x57\x4a\x28\x7b\x59\xdb\x32\x00\xfb\xc4\
+\x24\xec\x7f\x5b\x5a\x57\xec\x8b\xc7\x49\xe7\x27\x0d\x9b\x0a\x60\
+\x23\xfa\x4b\x57\x4f\x9d\xa7\x08\xae\x53\xc4\x7a\x0a\xda\x53\x7a\
+\xd7\xa1\xfb\x53\xd3\xb3\x9a\x3b\xc7\x3f\xbd\x6a\x94\x28\xa2\xa7\
+\x23\x39\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x44\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x0b\x49\x44\x41\x54\x78\xda\x9d\x95\x0d\x50\x54\x55\
+\x14\xc7\xff\x2b\x0a\xf1\xe1\x07\x0b\xd3\xa2\xcd\x0a\xae\x30\xa0\
+\x81\x41\x60\x2c\x1f\xb3\x82\x82\xb3\x99\xa0\x49\x25\x44\x29\xd0\
+\xb6\x41\x92\x10\x62\x30\x94\xc2\xec\x38\x8b\x1b\x08\x6d\xa1\xa0\
+\x92\x82\x29\x49\x01\x82\x9a\x89\x30\x24\x35\xcb\xc7\x6c\x26\xd8\
+\x56\x23\xc2\xa6\x30\x2a\x90\x42\xa2\x51\x96\x70\xdb\xbd\xac\xdb\
+\x2e\x30\xd7\xea\xcc\xbc\x77\xcf\x3d\xe7\x7f\xcf\xef\xbc\xfb\xee\
+\xbc\xc7\xc1\x24\x5b\xb6\xe7\x82\xb7\x6e\xb8\x88\xff\x67\xbb\x2e\
+\x6d\xf3\xdd\x61\x1a\xe0\x4c\x56\x78\xe6\xa9\x9b\xdd\x1c\xad\x45\
+\xc5\x51\x6e\xe0\xcd\xb6\xfc\xd7\x95\xbf\xd6\xde\x41\x72\x4d\x77\
+\xd7\xf7\xdb\xfd\xdc\x99\x80\x27\x15\xed\xa4\x25\xc5\x17\x36\x96\
+\x16\xc6\xa4\x7e\x24\x06\x87\x43\x0c\xbe\x69\x5c\x67\xe3\xe3\x04\
+\x3e\xf9\x6a\xfc\x90\xe9\xcf\x61\x02\x96\xc8\x5b\x49\x67\x86\x90\
+\xfa\x0e\xde\xb9\xb0\x5d\xe4\xf4\xc8\xee\x7b\x4f\xc4\x53\x90\x8f\
+\xa2\x15\x3f\x66\x05\xb2\x01\x1e\x32\x15\xf9\x2e\x2b\x90\xfa\xfc\
+\xc8\x52\xd8\x07\x7a\x99\x08\xff\xe9\x5d\xef\xf9\x3b\xcf\x86\x44\
+\xb8\x00\xfe\x2e\xf3\x40\x74\x02\x3f\xb9\x0a\x3f\xed\x0c\x66\x03\
+\xdc\xb3\x9b\x89\xfa\x3d\x11\xad\xb5\xe0\xd9\x12\xd8\xfa\x79\x4c\
+\x2b\x0f\x14\xcc\xc5\x9b\x22\x3e\xd4\xd7\x46\x90\xbc\x6a\x11\x88\
+\x4e\xbf\x7c\xd7\x37\xe8\x92\x89\xd8\x00\xd7\x77\x9b\x48\xfb\xce\
+\x50\xba\xd7\xbc\xb0\x22\xcc\x5c\xe6\x3a\x49\x46\x20\x72\x73\x40\
+\x6a\xb8\x0b\xda\x7a\x86\xf1\x7e\xbd\x16\xd7\x0b\xc5\xb4\xa1\x67\
+\x64\x5f\xa1\x5b\xbe\x92\x0d\x10\x64\x34\x90\x96\x9c\x30\x9a\xe0\
+\x85\x28\x81\xa5\x02\xb3\x7c\x88\x87\x03\xd2\xc5\xae\x68\xe9\x1e\
+\x82\xfc\xf4\x15\x1a\x1b\xd8\x17\x41\xc7\x80\x9c\x46\x68\x15\xe1\
+\x6c\x80\xf3\xb6\x2f\x89\x4a\x26\x36\xe9\xd7\x5c\x4c\x0c\x27\xc9\
+\xd4\x88\x21\x17\xbc\xa3\x1e\x57\x0b\xc4\x6c\xc0\xc2\xad\xa7\xc8\
+\x79\xf9\xda\x89\x22\x1c\x73\x02\x99\x66\xe1\x43\xa0\x7e\x5c\x91\
+\x75\x1a\x7d\x1f\x46\xb0\x01\x4f\x24\xd5\x92\xa6\xdd\xeb\x4c\x2a\
+\x4c\x7d\x02\x10\x4c\x6b\xa1\x99\x75\xb8\x51\xbc\x9e\x0d\x70\x92\
+\x54\x91\xc6\xbc\x28\xe3\xfc\xde\xe8\x7d\x28\xf6\x37\x41\xf5\xad\
+\x16\xb7\x86\x7e\xa3\x31\x47\xae\x2d\x82\xfc\x04\xc8\x90\xae\x84\
+\x9d\x9d\x15\x3d\x41\xfa\x42\x61\xef\x54\xa3\xff\xe0\x0b\x6c\xc0\
+\xe3\x71\x95\xe4\x6c\xc1\x4b\xb4\xcb\xe1\x91\xdf\x91\x92\x53\x8d\
+\xe5\x5e\xf3\x91\xb0\xce\x1b\x4f\x39\xdb\x53\x4d\xe7\xb5\x61\x1c\
+\xaa\xeb\x80\x5a\x73\x13\xca\xec\x28\xd8\xcf\xb5\xa6\x71\x71\x5a\
+\x25\x06\xcb\xa2\xd9\x00\xc7\xd8\xa3\xe4\x0b\x65\x2c\xed\x4a\xa6\
+\x3c\x0b\x1e\xd7\x0a\xb9\xd2\x60\xd8\x58\xcf\xc2\x8d\xbf\x80\x5f\
+\x1e\x00\xbf\x8e\x01\x5a\xed\x20\x2a\x3f\x51\x61\x9e\x8d\x35\xb2\
+\x53\xc5\x74\xd7\xd6\xa6\x54\xe0\xd6\xb1\x58\x36\xc0\x7e\x63\x39\
+\x39\xf9\xd1\x26\xea\xaf\x7f\xa3\x14\x75\xf9\x1b\xe0\xb6\x90\x8b\
+\x9e\xfb\xc0\xed\x31\xf3\x17\x5e\x5f\xaf\xc1\xf1\x8a\x36\xd4\xee\
+\x97\xd0\x4a\x91\xc9\x47\x30\xfc\xd9\x66\x36\x60\xce\x86\x8f\xc9\
+\x89\xbd\x09\x34\x11\x1e\x57\x82\xde\x1a\x09\xae\x63\x26\xee\x8c\
+\x99\xab\xf5\x6e\xff\xe0\x5d\x6c\x4e\x3a\x86\x86\xf2\xc4\x89\x86\
+\xb6\x1c\xc6\x48\x4d\x02\x1b\x60\x17\x79\x80\x54\x95\xbc\x4e\x13\
+\x11\x49\x87\xd1\x7e\xe8\x65\x8c\x5a\x59\x4d\x88\x39\x86\x03\x64\
+\x38\xc2\x03\x83\xf7\x10\x9d\xfa\x39\x4e\x16\xc7\xd3\xd8\x8b\x89\
+\x07\x71\xf7\x94\x94\x0d\xb0\x59\x53\x4c\x2a\x0f\x4c\x74\x94\x96\
+\x77\x06\x89\x91\x1e\x58\x15\x20\x30\x5b\x40\x0c\xab\xaa\x1b\xbb\
+\x70\xbc\xf1\x0a\x0a\xb6\x3f\x47\xe7\x1b\xa5\x25\x18\x3d\x93\xc4\
+\x06\x3c\xb6\xba\x88\x54\x94\x6e\xa1\xfe\xb9\xb6\x1e\x74\x68\xae\
+\x22\x33\xc6\x07\x9e\x02\xae\xb1\x7b\xfd\x93\x68\x7e\x1e\x42\x6e\
+\xc5\x45\x3c\xed\xe9\x82\x70\xe1\x62\x5a\x28\xe6\xb5\xbd\xf8\xa3\
+\x21\x99\x0d\xb0\x0c\x55\x92\xa3\x65\x5b\x8d\x6f\xf2\xd3\x73\x1a\
+\x0c\xf4\xdf\xc6\xf3\x42\x3e\x42\xbc\x9c\x28\xe4\xbc\xa6\x1f\xb5\
+\xad\x7d\xe0\x39\x39\x20\x7a\xb5\x27\x05\xea\xed\x95\x78\x25\xfe\
+\x6c\x4a\x65\x03\x66\xad\x28\x20\xe5\x65\x6f\x1b\xf7\x7c\x7c\x1c\
+\x50\x5d\xea\xc3\x85\xcb\x37\x71\xb9\x77\x88\xc6\xdd\xf9\x5c\xf8\
+\x2e\x99\x8f\x20\x2f\xbe\xb1\xb8\xde\x36\xc5\x15\xe2\x41\x73\x1a\
+\x1b\x60\x11\x9c\x47\xca\x8e\xa4\x4f\xf9\x2d\x9a\x7e\x39\x26\x7f\
+\x45\x1e\xce\xe3\x5e\xdd\x83\x31\x55\x3a\x1b\xc0\x09\x50\x10\x89\
+\x74\x0d\x84\x41\x4b\x61\x61\x31\xc3\x58\x90\x10\x4c\x39\xa6\xa6\
+\xd6\xd9\xa1\xc5\x07\xf9\x55\x20\xad\x19\x6c\x00\xfc\x77\xc7\xe8\
+\xee\x85\xba\x8b\x87\xff\x6e\x45\x68\xcf\x7c\xcb\x34\xf0\x37\x21\
+\xe6\x75\x28\x08\xc5\x14\xee\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\x2d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xf4\x49\x44\x41\x54\x78\xda\xb5\x95\xdb\x8b\x1c\x45\
+\x14\xc6\xbf\xaa\xea\xae\xee\x9e\xde\xdd\x99\x9d\x44\x76\xbd\x20\
+\xc8\x1a\x61\x65\x21\x48\xd6\x07\xd1\x37\x41\x7c\x11\x14\xf2\x1f\
+\x24\x28\x1a\x05\xf1\xc1\x17\x41\x82\x17\xf0\x41\x89\x24\x2a\x06\
+\x1f\xf2\xa0\x62\x7c\x10\xfc\x03\x7c\xf2\x41\x04\x15\x31\x82\x68\
+\xd6\xc4\x49\xbc\xac\xbb\xd9\x5b\x66\xb6\x67\xfa\x56\x75\x3c\xd5\
+\xd3\x9b\xdd\xa0\xae\xb3\x60\x0a\xce\x74\x0d\x33\x7c\xbf\xf3\x9d\
+\x3a\x75\x5a\x60\xc7\x9a\xf9\x00\x73\x54\xe0\x2c\xc7\x2c\x87\xa4\
+\x1c\xb0\x59\x15\x3d\xde\xbf\x48\x19\x4e\x2e\xbe\x0e\x8b\x3d\x2c\
+\xe1\x3e\xee\xfc\x10\x21\xef\xde\x25\x83\xc3\x64\x04\xfc\xc0\x93\
+\xe1\xa4\x1f\x2a\xad\x44\xba\x5c\x14\x9b\xbf\xe4\x59\xbe\x6e\x2d\
+\x4b\x9f\x43\x89\xc7\xfe\x7c\x13\x2b\x7b\x05\x7c\x46\x84\x43\xbe\
+\xef\x4d\x84\x8d\x50\x78\xb1\x34\xba\xe9\x49\xbf\x21\x45\x91\x58\
+\x9b\xae\x94\xa2\xff\x7b\x2e\xae\xfe\x94\x3a\x27\x17\xc8\x62\x7e\
+\xe9\xe4\x68\x4e\xb6\x00\xa5\x84\x27\xa3\x38\x32\x51\x4b\x7b\x22\
+\x02\x64\x20\xa0\x82\xea\x67\x90\x21\xe4\xab\x86\xd6\xbe\x1f\x64\
+\xbd\x8b\x59\x68\x33\xba\x6f\xf9\x6d\x7c\xb9\x9b\xf0\x81\xf7\xbd\
+\xb6\xb5\xe5\x0f\x5b\x00\x0a\x54\x04\xce\x1e\x32\x26\xa8\x88\xc5\
+\x23\x05\x15\x3a\x71\xc0\x0c\xb8\x3a\x39\xa1\xdc\x24\x2c\x7e\xde\
+\x05\x97\xeb\x37\xa9\x70\x68\xe9\x14\x96\xff\x49\x7c\xe6\x3d\x39\
+\x25\xb4\xb8\x4c\x30\x7a\x07\x20\x44\x18\x45\x90\x63\xa8\x00\x5e\
+\x24\x21\x1d\xc0\x3a\x00\x55\x51\x76\x0d\xba\x0b\x19\x92\x5f\x73\
+\x63\x32\x9b\x0a\x8d\xb7\xa4\xc6\x29\x7e\x2e\x09\x1f\x96\x9f\xfb\
+\x39\xcf\x97\x54\x43\x3e\x2e\x7d\x21\x2c\x0c\xae\x07\x54\x0e\x44\
+\x0d\x10\x0c\x10\x35\x80\xff\x9a\x30\x80\xc3\x24\x06\xe9\xb2\x41\
+\x7f\x31\x1f\xe4\x49\xd9\x17\x1e\x26\x44\x00\x21\x7d\x16\xe2\xa7\
+\x3f\x2e\x45\x3c\xad\xa5\xd3\xe8\x5d\x19\x0c\x01\x33\x35\x20\x72\
+\x0e\x62\xe7\x00\x0c\x50\x43\x07\x54\x3b\x48\x18\xd2\x27\xd8\x94\
+\x50\xf4\xac\x0b\xb2\xb9\x65\x45\xb8\xa6\x80\x1a\xe3\xee\x9b\xe0\
+\xc4\x9a\x0a\x5e\xa0\x90\x6d\xe4\x58\xbf\xd4\xdb\x76\xa0\xdd\x19\
+\x44\x21\x94\x03\x34\xd8\x45\x38\x8c\x6b\x0e\x2a\x08\xbb\xe8\x0f\
+\xf7\x96\xef\x08\x57\x80\xd5\x39\x99\x31\x09\xbf\xe5\x82\x21\x4d\
+\x45\x82\x20\x92\xc5\x0c\x6b\x9d\xee\x1e\x01\x7d\x57\xa6\x1a\xc0\
+\x4e\x6c\xc9\xdd\x56\x03\xbc\x26\x03\x9a\x15\x00\x52\x0a\x24\x4b\
+\x19\xd6\x77\x02\x82\x1a\x20\xc7\x08\xdc\xff\x55\x17\xc9\x68\xc7\
+\x21\xb3\x70\xb1\x59\x97\xc9\x7d\x4f\xed\x7f\x03\x2e\x75\xaf\x3f\
+\xe4\x20\x64\x40\x83\x58\xd8\xdd\x01\x39\x74\x60\x6a\x80\xcb\x38\
+\x73\x2e\xec\x50\x7c\x80\xd1\x01\xee\x90\xb5\x17\xf0\x0f\xca\x16\
+\x45\x56\xda\xd4\x6a\x5b\x70\xf6\xf5\x2c\x02\x09\xeb\xc7\xbe\x89\
+\xf6\x6b\xdf\x53\xb2\x82\x55\x77\xe3\x6f\x80\x61\x88\x0a\x90\x63\
+\xa3\x73\x75\xdb\x81\xe0\xad\xeb\x18\x5b\xd2\x2a\x0f\xb5\xb3\x7c\
+\x88\x27\x6c\x5a\x0d\xb9\x83\x1c\x27\x40\x98\xf5\x7c\x1e\x1f\x63\
+\x1e\xc2\x96\xe7\xa0\x30\x7c\xf9\x76\x73\xb0\xb6\xe5\xe0\x8e\x8f\
+\x41\x37\x6f\x6a\xe4\x1e\xbe\xea\xc4\xf9\x43\x2b\x87\xb1\xb1\xf3\
+\x66\xde\x76\x9c\x27\x6b\x81\x07\x59\xf4\x13\x2e\xd9\x78\xeb\x40\
+\x0c\xa5\x65\xd5\x51\xdb\x00\x05\xcd\x00\xc5\xad\xaa\x7c\x89\xc1\
+\x95\x1c\xab\x17\x6a\x07\x73\xa7\x25\xcd\x9f\x0f\x31\xfd\x07\x8e\
+\xbd\xf6\x51\xff\x9d\x7f\x9b\x2f\xb7\x1f\x97\xf7\xf0\x98\xf8\xba\
+\x71\x8b\x16\x61\x5b\xbb\x52\x38\xe3\xf0\xe2\x61\xff\xeb\x49\x01\
+\xdd\x56\xd5\x19\x75\x3b\x7d\x24\x6b\x03\xaa\x00\x8f\x1e\x8b\xe8\
+\xe0\x77\x3c\x22\xbf\xc5\xfc\x23\x49\xf6\xcd\x6e\x43\x6c\xfa\x39\
+\x3c\x41\x25\xde\x68\x4c\xe9\x46\x30\xc9\xf3\x40\xb1\x68\x73\x58\
+\x22\xd7\xe2\x0c\xa3\xc1\x6a\x26\xba\x97\xfb\x39\x7c\x9c\xae\x00\
+\xcf\x3f\xd0\xa2\x9b\x7a\x05\xda\x49\x31\x7f\xe4\xe7\x7c\x57\x80\
+\x5b\x53\x4f\xe3\x61\xce\xfc\x53\x97\x79\xb8\xcf\xf7\xc2\x7d\x5a\
+\xa9\x71\x3e\x13\x63\x90\xf5\x72\x5b\x96\x25\x78\x46\x9d\xb9\x78\
+\x04\x47\x2b\xc0\x0b\xf7\x4e\x52\x7b\x90\xa3\x95\x8e\x06\xa8\x20\
+\xcf\xe0\x56\x1e\x6e\xe7\x94\x46\x5b\xf0\x58\xe7\xbd\x13\xe5\xd1\
+\x41\x29\x34\x9e\xea\x3c\x89\x33\xd7\xde\x07\x2f\xcf\xb5\x69\xa2\
+\xcc\x10\x9b\x62\xf6\xe8\x42\xfe\xe3\x28\x80\xba\x5c\x92\x67\x91\
+\x64\x71\xed\x46\x86\x0a\xf8\xbd\x12\xa2\xec\x3c\xbb\xfd\x32\xaa\
+\x00\xaf\xce\xb6\x69\x9c\x1b\xbe\x41\x0c\x38\x3f\x3a\x60\x94\x55\
+\x01\x5e\xb9\x7b\x08\x88\xed\x8d\x07\xdc\xc5\x80\x85\x1b\x09\xb8\
+\x9f\x01\x5f\xfc\x9f\x80\xbf\x00\x29\x9f\x2b\x56\x54\x6a\x6d\x4c\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x72\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x39\x49\x44\x41\x54\x78\xda\xbd\x95\xcb\x6f\xdc\x54\
+\x14\xc6\xbf\x7b\xfd\x18\xcf\x3b\xe3\x79\xcf\xa4\x55\x4a\x3a\xa5\
+\x4d\x50\x84\x90\xb2\x61\xc1\x06\x16\x08\x44\x51\xc5\x5f\x80\x44\
+\x57\x2c\xba\x42\x48\x6c\x01\x01\x0b\x40\x94\x25\x74\x87\x10\x94\
+\x0a\x2a\x5e\x55\x69\x69\xc5\x9b\x4a\x14\x50\x5b\xa5\x28\x99\x36\
+\x25\x34\x99\x78\x26\x49\x99\x24\xf3\xf2\xb5\x7d\x39\x76\x92\x12\
+\x44\x09\x19\x04\x1c\xe9\xf8\x5a\x96\x7c\x7e\xfe\xce\xcb\x0c\xeb\
+\x36\x1b\x01\x73\x80\x31\x1b\x78\x41\x48\xdc\x2d\x80\x68\x4f\x82\
+\x93\x0b\x7a\x36\x17\x3c\x07\x5e\xdb\xdf\x83\x83\x3e\x8c\xf9\x97\
+\x5a\x04\x09\x4f\xe2\x15\xe1\xe0\x3e\xa1\x29\x60\x3b\x8a\x3c\x34\
+\x36\x6a\xb2\x4c\x46\x5d\x9e\xaa\x36\x1b\xdf\x5f\x6a\xaf\x2c\xb5\
+\x5c\x47\xc3\x4f\x2e\xc3\xa1\x47\x6c\x4c\xf6\x0b\x78\xdf\x15\x18\
+\x45\x36\x55\x50\xf7\x55\x14\xb6\xb3\xdc\xd1\x2a\xbb\x75\xa5\x90\
+\xe3\xf6\xbc\x65\x77\xa7\xae\x28\x37\x2e\x4f\x29\xd7\xce\x5f\x9a\
+\x17\x0c\xd3\x1c\xb8\xff\x80\x0d\xfb\xef\x82\x53\xdc\xa1\x0d\x40\
+\x13\x86\x61\xa8\x7b\x2b\x2d\x6d\x6c\x34\x85\xac\x09\x0c\x0c\x80\
+\x99\x29\x30\x29\xa1\x2c\xaf\xa0\x5b\xbd\x62\xcf\x9c\xf9\x7a\x69\
+\xfa\xea\x4c\x81\x39\xde\x03\x07\x1c\x9c\xd8\x2a\xf8\x6c\x42\xcd\
+\x70\xc7\x39\xb5\x01\x90\x6a\xa9\x08\x5e\xd9\x05\x64\xd2\xe0\x85\
+\x3c\x28\x3d\x74\x9f\x02\x84\x80\xd7\x58\x80\xd2\x58\x84\x3b\x67\
+\xe1\xdc\xe9\xcf\x65\x67\xb5\x7b\x21\xc4\xb1\xff\x41\x1b\x33\xb7\
+\x0a\xfe\x73\x94\x95\x54\xe0\x2c\x97\x72\xcf\x4d\x00\xa5\x03\xca\
+\x6e\x02\xf8\xc1\xf3\x79\x70\x02\x05\x00\x5b\x40\x12\x00\x56\x1d\
+\xce\xf5\x1a\x66\x2e\x4c\xa0\x51\x5f\x58\x76\x85\xbb\x10\x62\x78\
+\x59\x07\x3e\xa4\xd3\xa2\xd3\xd5\x19\x4c\xf2\x47\x75\x55\x7d\x4a\
+\xe5\x3c\xc6\x6d\x1b\x9b\x00\xd9\x00\xc0\x0a\x85\x00\xc0\xb2\x04\
+\x48\xaf\x29\xf0\x01\xb2\x56\x87\x9c\xab\xc1\xa9\x59\x58\x99\xad\
+\xc1\x6a\xae\xcc\xb5\x6d\xb7\xa5\x7b\x32\xad\x53\xb7\x69\x1e\x60\
+\x70\x30\x72\x2f\x7c\x47\xc5\xd0\xf2\xb9\xb0\xfb\xd9\x57\xf8\xa3\
+\x82\xe1\xdb\x48\x41\x8e\x20\xe4\xa4\x80\x65\xcc\x75\x05\x8b\x90\
+\xf3\x16\x01\xe6\x81\x7a\x23\x80\x88\x56\xcb\x76\xc3\x61\xf0\x74\
+\x5a\xe7\xa4\x94\x9b\x26\x78\xd8\x80\x92\xcb\x48\x6e\x0e\x40\x5e\
+\x9e\x62\xf6\xdb\xef\x6d\x02\xe4\x7d\x05\x04\x28\xfa\x0a\x72\x41\
+\xf0\x5b\x01\x24\xa5\xca\x4f\x17\xeb\x74\xc0\x13\x09\xa0\x5c\x02\
+\x1b\x2c\xae\xbd\x17\x8b\x02\x3b\xcb\x02\xaa\xa6\x39\x67\xbf\x80\
+\xfd\xe6\xb1\x7f\x06\xf0\xef\xd1\xe9\x02\xf1\x18\x58\xb1\x08\x56\
+\xca\xad\xa5\x35\x46\xd3\x4a\x40\x18\x21\xb8\x5f\x7e\x0b\xfb\xad\
+\x77\x37\x03\xf2\x01\x80\x95\xa9\xc0\xa5\x3c\x15\x38\x13\xa4\x29\
+\x98\x63\x8b\x6a\x40\x1d\xe4\xcd\xce\xc1\x0b\x00\xa4\xa2\xdd\xee\
+\x03\x10\xf6\x01\x7e\x0d\x86\xa4\xcc\xa6\x25\x72\x19\x4e\xb9\x85\
+\x34\x93\x90\x7e\x91\x17\x6f\x48\x34\x16\x25\xab\x2f\x70\x58\x0d\
+\x52\x61\xad\x03\xe2\x7d\x28\xa0\xaf\xf5\xa2\xd1\x76\xf7\xd7\xe5\
+\x76\xaf\xdb\x4d\xf5\xc0\x14\xc1\x18\x7a\x90\xd2\xd5\xf5\xd5\x70\
+\x3a\x2d\x32\xb9\xb4\x19\xed\xb6\xc1\xa8\xd0\xb2\xd5\xe9\x2f\x45\
+\xae\xa6\xc1\x61\x70\x9c\x9e\x98\xee\xb9\x38\x29\x3c\x1c\xa1\x45\
+\xd7\x24\xdf\x6b\x73\x3c\xe9\x1a\xda\xb8\x16\x8b\x44\x92\x11\x03\
+\x45\xc7\x45\x88\x52\xe7\x51\x51\xb7\x05\xa8\x53\x8a\x9c\x98\x01\
+\xe9\xe1\x53\x77\xb9\xfb\xf8\xaa\x8a\xea\x48\x07\xee\xc6\x64\x9e\
+\xd6\xa1\x09\xb0\x87\xa4\xa6\xbc\xe4\x72\xb6\xe3\xce\x44\x94\x27\
+\xe8\x4d\x9b\xda\xf4\x4f\x80\x12\x35\x49\x32\x01\xf7\xdc\x79\xf4\
+\x8e\xbc\xb1\x06\xb8\x1a\xe7\x72\x29\x65\xa0\xa9\xb3\x83\xf7\x56\
+\x5b\xaf\xff\xd5\x7e\xf9\x24\x15\xb9\xa7\xd9\x6a\x9f\x18\x8e\x1a\
+\xea\xa0\xa1\x43\x4f\xc4\x75\x8f\x06\x53\x6e\x00\x92\x71\xf0\x3d\
+\xc3\xb4\x5a\x16\x85\x7d\xf4\x38\xf3\x7e\xbc\x28\x02\xc0\xc9\x62\
+\x58\x5a\x21\x0f\x56\x04\x63\x4f\x4c\xf4\x2e\x6e\xb5\xc4\x8e\xe9\
+\x78\x58\x03\x0e\x0f\x45\x42\xd9\x5c\x3a\x65\xf0\x62\xc1\x55\xcb\
+\x05\x95\xd1\x8a\xf1\x38\xf3\x68\x03\xb8\xe2\x9b\x1f\x3c\xf1\xc1\
+\x99\x05\x35\x82\xc3\x01\xe0\xd5\xca\x80\x54\x19\xcd\x07\xc4\xd8\
+\xc1\x49\x7b\x4b\x80\x6f\xc7\x75\x8c\xd3\x7a\x78\x27\x1e\x33\xc2\
+\x99\x52\x21\x94\x2c\xe7\x93\xfe\x72\x14\xbf\x5c\xef\x38\x13\xd5\
+\x2e\x6f\xb6\x14\x55\xc3\x73\x83\x1d\x3c\x1f\x00\x5e\xbc\x3d\x25\
+\x0d\x69\x43\xdf\x26\xc0\xb7\x8f\x43\x28\xe8\x8c\x7d\x64\x70\x7e\
+\x57\x88\x33\xe8\x0a\x87\xe6\x79\xe4\xee\xbc\x26\xe5\xa1\xa1\x36\
+\x8e\xde\xfc\xe1\x3c\xbb\xcf\x94\x71\xaf\x87\x88\x14\x95\xc7\x26\
+\xed\xea\x76\x00\xbe\x9d\x0a\x41\x21\x25\xd4\x33\x88\xd1\x36\x05\
+\x9d\x6d\x5d\x41\xa7\xd2\xf9\xfd\xb7\x1a\x00\x9e\x1e\x31\x65\x82\
+\x00\x51\xaf\x3f\xc0\x76\x2c\x00\x3c\x33\xb2\xa6\xe0\xff\x00\xec\
+\x22\xc0\xb5\xff\x12\x30\x4e\x80\xef\xfe\x4d\xc0\x6f\x71\x97\x28\
+\xa5\x21\x0a\x03\x30\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\x5f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x26\x49\x44\x41\x54\x78\xda\xad\x95\x7d\x4c\x13\x77\
+\x18\xc7\x9f\x5f\x7f\x77\x85\xb6\xec\x00\x6b\x81\xc9\x4b\x2b\x82\
+\xc5\x4d\x5e\xc4\x91\xa0\x38\x16\x41\x20\xcc\x68\x80\x58\x0d\x4e\
+\x42\xa2\x12\xb3\x2d\x64\x2f\x19\x86\xa8\x99\x71\xc3\xcc\x48\x4c\
+\x36\x37\x59\x06\x31\x4e\x34\x48\x86\xaf\x2c\xe2\xb6\xa0\x22\xb2\
+\x64\xcc\x60\x78\x51\xb0\x50\x45\x90\x22\x6b\xe9\x5a\xfa\x46\x81\
+\xd2\xdb\x73\x4e\x93\xfd\xb1\xed\x30\xe9\x37\xf9\xde\xdd\xef\x9e\
+\xbb\xfb\xdc\xf3\xfc\x7e\xf7\x1c\x81\x7f\x28\xa1\xda\xa0\x02\x02\
+\x9b\x09\x0f\x1b\x78\x02\x69\xc0\x83\x9a\x00\x8c\xf0\x00\x77\x70\
+\xdf\xca\x03\xdf\xfc\xa0\x22\xde\x0c\x2f\x21\xf2\xe2\x60\xf9\x11\
+\x7d\x36\xee\xca\xe5\xac\x84\xcd\x8e\x57\x18\xdf\x49\x0d\x09\x5b\
+\x19\x11\xa8\xe9\x19\xf7\xf4\x9f\xbd\x6b\xb3\xb6\x3d\x74\xaa\xa7\
+\x67\x79\x2f\x10\xfe\xeb\xc1\xca\x84\xeb\x2f\x05\x88\xab\xba\x9f\
+\x4d\x80\x54\xac\xd1\xc8\x8d\xb5\xdb\xd4\xf9\x93\x0e\x98\x73\xcd\
+\x80\x47\x1e\x00\x66\xa5\x02\x4c\x12\x02\xcc\x8c\x97\x0f\xde\xd3\
+\x34\xa2\xef\x7a\xe2\x8e\xc1\x8c\xaa\x0d\x07\x5e\x5f\x10\x84\xc4\
+\x1e\xec\x51\xe1\x0d\x75\x19\xb1\x41\x96\x6f\xb7\xc6\x6e\x1d\x30\
+\x01\x28\x39\x30\xc6\x86\x40\x2b\xc6\xff\x40\x7b\xd0\x81\xe8\x70\
+\x74\x4c\xf1\xa9\x47\x96\xce\x11\x67\x28\xde\x5a\x36\x7c\x28\x49\
+\xb4\x5c\x24\x66\x7f\xd7\x2e\xb9\x54\x52\xd4\xbd\x2f\x39\xab\x6f\
+\x9c\xc0\x62\x25\xd8\x34\x0a\xb8\x80\x31\x3d\xfa\x09\xda\x85\x56\
+\xa0\xa3\xd1\x5a\xaf\x8f\x5f\x9e\x5c\xd5\x3b\xef\x9c\x9d\x3f\x3f\
+\x7a\x78\xf5\x49\x51\x40\x64\x45\xe7\x39\xdd\x1b\x4a\xf7\xde\xbc\
+\x65\x25\x8f\x9d\xc0\xae\x8c\x84\xce\x57\x00\xae\x62\xac\x0f\x6d\
+\x40\xdb\xd0\x21\x42\x25\xd1\x89\xe8\x94\xf7\x1b\x1e\x39\xae\x74\
+\x9b\x03\x8c\xd5\xe9\xc5\xa2\x80\x88\x0f\x6f\x1b\xae\x7d\x94\x62\
+\x9c\xf7\x05\x65\x48\x17\x01\x4d\xe0\xe0\x0a\x0b\xf0\x2b\xc6\xba\
+\xd1\x03\x84\x90\x31\x9e\xe7\xa3\xf0\x78\x85\xf0\x70\x74\x6a\xc7\
+\x90\x9d\xd5\xd5\xf4\xa5\x4c\x7c\xb9\x2e\x4e\x14\xa0\x7a\xef\xe6\
+\x9c\xf1\xf8\x5b\xb3\x1d\x83\x44\x16\x1d\x0f\x44\xc3\x40\x0b\x03\
+\xf0\xdb\xff\x65\xe0\xf0\xf8\xb4\xcb\x3e\x69\xd7\x9a\x4f\xac\x67\
+\x45\x01\xa1\x65\x3f\x1b\xae\xef\x4b\x37\xda\x3c\x5c\x66\x34\x3e\
+\x22\x9c\x81\x7b\x58\xa2\x5b\xff\x35\x07\x42\x26\x3f\xf5\xda\x65\
+\xdb\xbf\xe9\x0c\xb3\xd6\xe5\x8a\x67\xc0\x95\x5e\x3d\x57\x9c\x11\
+\xe9\x2e\xcb\x49\xde\x89\x25\x82\x70\x0e\x6c\x61\x00\xb7\x31\x36\
+\xfa\x6f\xab\x08\xbd\xb4\xfc\xfb\x21\xfb\x99\xb6\xa1\xd1\xa9\xd3\
+\x1b\xc5\xe7\x40\xb1\xfd\xf2\x2e\x45\x00\x2d\xba\x7b\x6c\x63\xee\
+\xa8\x9b\x30\xaf\x46\x02\x04\x03\x98\x70\x1d\xde\x7b\x5e\x9e\x59\
+\xb4\xf4\x79\x99\xc2\x86\x6d\xbc\x3a\xff\xe0\x8d\xa1\xb1\x49\x67\
+\x8d\xab\xa1\x40\x7c\x15\xc9\x74\xe7\x55\xd8\x16\xea\xb2\x12\xc3\
+\xed\x9f\x95\xae\x2b\x61\x39\x00\x2e\xf8\x59\x4d\xdc\x32\x00\x2b\
+\xbe\xba\x03\xaf\x63\x66\x00\x42\x2d\x6e\xe0\x0e\x9d\xee\x37\xfd\
+\xd0\xae\xc7\x2e\x02\xc7\x5d\x8d\x45\x47\x45\x01\xc2\x46\x5a\xd8\
+\x98\x4d\x08\x54\xe4\xa5\x46\x39\x0f\xec\x58\x5b\xe8\x65\x88\x24\
+\x08\x27\x42\x26\xff\xfb\xa2\x69\x37\x80\x7d\x8a\x87\x93\x3f\xde\
+\x37\x5e\x6c\xd7\x2b\x67\xe6\xbc\x81\x12\x4a\xdb\xdc\x4d\xba\xf5\
+\x0b\x02\x08\xa2\x9b\xce\x3e\xeb\x45\xc1\x0a\xa9\x4c\xf7\x66\x3c\
+\xcd\x4c\xd2\x24\x2d\x0e\xe1\x94\x63\x66\x87\xa7\x6b\x68\x7c\xe2\
+\xda\xef\x0f\x6d\xe3\x16\x87\xc5\xe7\xe3\x33\x71\xe9\x06\x50\x96\
+\x02\xc3\xb0\xb5\x8e\xc6\xa2\x3d\x0b\x02\x08\x92\xe4\xd7\xab\x00\
+\xf8\xcd\x78\x76\x03\x0e\xd3\x78\xa1\x9b\x12\x32\x82\xe7\xee\x60\
+\x4d\xb0\x9b\x42\x33\xa5\x64\x8b\x44\x42\x6b\x30\x03\xe0\xb8\x40\
+\xe0\x09\x6d\x9c\x23\xb4\xd4\x76\xea\xed\x59\x51\xc0\x42\x25\x2d\
+\x68\xf8\x98\x52\x7a\x4c\x82\x59\xbc\x16\xb3\x08\x26\xdd\xf3\x2d\
+\x8e\x39\xd8\x32\xf9\x5d\xce\xb4\x5f\x00\x82\xe4\xba\xa6\xfd\x58\
+\xa6\x2a\x59\x60\x00\xe4\xad\x5e\x02\xfd\x4f\xa7\x3b\x8c\x0e\x6f\
+\xfe\xc4\x57\x99\x4e\xbf\x00\x04\x71\x25\xcd\xbb\x29\x65\xea\x54\
+\x4a\x39\xec\xce\x52\x43\xdb\xe0\x54\x4f\xef\x53\x4f\xd6\xd8\xd1\
+\xf4\x3f\xfd\x02\x10\xa4\x2c\xfb\xa5\x4c\xc2\xd0\xda\x55\xd8\xdf\
+\x3f\xc8\x55\xc3\xe5\x5e\xeb\xe3\xd6\x41\xe7\x9a\xe1\xcf\x57\x4d\
+\xf8\x05\x20\x28\xbc\xfc\x56\x09\x65\x68\x7d\xf1\xda\x25\xb0\x33\
+\x23\x02\x2e\xf4\xd8\x4c\xf5\x5d\xd6\x34\xfc\x29\x8d\xfa\x05\x20\
+\x28\x6a\x6f\xe7\x0e\x96\xa5\x67\xbe\x28\x5c\x0a\xb9\x2b\x82\xa1\
+\x65\xc0\x61\xaf\xba\x61\x4e\xf4\x1b\x40\x90\xe6\xd3\xee\x02\x4e\
+\xc6\x5c\x3a\xb1\x4d\x23\x00\x6e\x5e\xea\x77\xe5\xf8\x15\x20\x28\
+\xee\x70\x7f\x0e\x7e\x23\x45\x83\x95\xda\x77\x85\xb1\xdf\x01\xda\
+\x23\x0f\x88\xbe\x32\x81\x7f\x31\xfe\x0b\xcf\x03\x85\x64\x26\x58\
+\x5f\xe1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x8e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x55\x49\x44\x41\x54\x78\xda\xad\x94\x5b\x6c\x14\x65\
+\x14\xc7\xff\xdf\xcc\xb6\xbb\xb6\x40\xbb\x96\x2d\x35\xa2\x91\xe2\
+\x03\xfa\x00\xc1\x4b\x83\x2f\x3e\xa0\x44\x20\x6a\xfa\xa0\x25\x29\
+\xc6\xad\x57\x74\x2d\xa8\xc4\x44\x43\x42\x4c\xac\xc1\x4b\x52\x83\
+\x4a\x80\xc4\x98\x6c\x13\x62\x8c\x4f\xfa\x42\x4c\x84\x26\x4a\x94\
+\x06\x01\x6b\x48\x6d\xeb\x6e\x77\x5b\xe9\x95\x76\x9d\xd9\xfb\x65\
+\x66\xbf\xe3\x99\xd9\x61\x8b\xed\xc4\x4b\xd2\xd9\x9d\xfd\xf6\x9b\
+\x3d\xe7\xfb\x9d\xcb\xff\xac\xc0\x3f\x5c\x8d\x5f\x29\xdb\x78\x39\
+\xcc\xf7\xc3\xce\xa3\x33\x7c\xf7\xe8\x1d\x72\x00\xff\xf1\x12\xff\
+\x02\x08\x6f\x0c\x6c\x0e\xb6\xac\xbb\x0b\x17\xf2\x83\x28\x5c\x9b\
+\x86\x9a\x4e\xf7\x31\xa0\x6b\x65\x00\x5f\x2a\xd4\x71\xcf\x01\x98\
+\xf5\x3e\x9c\xd2\xbe\x81\xf2\x67\x16\xbe\x99\x49\xe8\x7b\xa4\x58\
+\x19\xc0\x17\x0a\xbd\xb8\xfd\x7d\x0c\x15\x23\xf8\x2e\x79\x0e\xc8\
+\x4a\xd4\xc5\xa3\xd0\x3b\x57\x0a\x70\x4a\xa1\xe7\x1f\x7a\x17\x03\
+\xb9\x41\xfc\x9c\x1a\x04\xf2\xc4\x80\x31\x68\x7b\xff\x07\xa0\x31\
+\x2c\xc8\xe6\xf0\x22\x48\x80\xec\xa7\x54\x65\xbf\xb0\xa3\x07\xfd\
+\x99\x9f\x30\x94\x89\x40\x98\x04\xef\xc8\x58\x35\x32\xfa\xdb\x51\
+\x04\xfd\x69\x12\xcb\x01\x9f\x2b\x74\x70\x77\x2f\x22\x85\x38\xa6\
+\x8c\xd9\xaa\xeb\x1a\x75\x35\x02\x9e\x26\xa4\x64\x1a\x97\x73\x57\
+\x30\x55\x9c\x73\x8e\x21\x6c\xaa\xdb\x08\xbf\xd2\x68\xef\xe3\xa5\
+\xab\x98\xcb\xce\xa1\x76\x38\x06\xbd\xcb\x0d\xf0\x99\x42\xdd\xbb\
+\xde\xc3\x48\x3e\x82\xdf\xf8\xae\xc4\x25\xa0\x0a\x05\x0a\xaf\x59\
+\x99\x87\x56\x4e\xa2\x20\x8b\x36\xda\xab\x78\xe1\x57\x1b\x50\x2b\
+\x6a\x6c\xbb\x89\xc2\x24\x90\x2b\xa3\x66\xec\x0f\xe8\xcf\x49\x17\
+\xc0\x09\x41\x3b\xb6\x3f\x83\xef\x53\x03\x28\x18\xd9\x4a\x06\x8a\
+\xf5\xa9\xd8\xa5\x92\xd5\x8a\x59\xb1\x0b\x08\x27\x00\x22\xa7\x8c\
+\x06\xd9\x00\x75\x7c\x0a\xfa\x3e\x17\x80\xff\x98\x20\xb9\xf5\x36\
+\x50\x91\xdd\xad\xdf\x55\x5e\x3d\x7c\x90\x6a\x21\x54\x06\xf0\x8b\
+\xa4\x53\x77\x81\x0a\xa6\xb2\xb3\xbe\x83\xfb\x42\x59\x82\x62\x01\
+\x42\x6e\x25\x3a\xaa\x90\xb0\x42\xb4\xde\x56\xaf\xeb\xbd\x80\xbf\
+\x0e\xb5\x81\x35\xf0\xa9\x3e\xe4\x65\x01\x86\x34\xed\xd2\x09\x21\
+\x9c\xce\x2e\x8a\x80\x18\x60\xa9\x8b\xe2\xb3\xd0\xf7\xbb\x64\xb0\
+\xf4\x81\xbf\x57\x04\x49\x11\xa1\x40\xeb\x1d\x6d\x4d\xcd\xb7\x60\
+\xb6\x74\x0d\x19\x33\xb3\xa8\x1b\x1b\x72\x83\x7e\xca\xbc\x2f\x13\
+\xca\xa3\xb3\x15\x60\xd5\x44\xf4\xf1\x7a\xd2\x55\xcf\x8d\x1f\x88\
+\x60\x60\x6d\x4b\x78\xeb\x96\x07\xf1\x7b\x6e\x14\xd3\xf9\x19\xdb\
+\xc9\xf2\x26\x27\x0b\x7b\x7b\x5d\xab\x54\xe9\xce\x86\xfa\x56\x58\
+\x5d\x8b\xcd\x47\x50\x5e\xc8\x43\xa6\x8a\xa7\x5d\x01\xfe\x23\xa2\
+\xc1\xa3\x7a\xf4\xce\x9d\xfb\x70\x49\xbb\x88\x68\x36\x7a\x7d\x54\
+\x9c\x0e\x90\x03\x5c\xac\x83\x57\xf8\xb0\xda\xb3\x0a\xba\xa1\xc3\
+\x28\x1a\x90\x69\x13\xa5\x99\x54\xc9\x3d\x83\x1e\x11\x6c\x5d\x77\
+\x67\x78\xe7\xb6\x76\xfc\x38\xff\x03\xa2\x3c\x64\xd5\x62\x92\x8b\
+\x83\x74\x1e\x5b\x5a\x60\x41\x10\x1f\x2b\x73\x06\x4a\x73\xd9\xe5\
+\x00\xff\xdb\x08\x7a\xd4\x9a\xd0\x23\xf7\x3e\xda\x56\xe3\xaf\xc5\
+\x99\x99\x6f\x59\x5d\x4e\x39\xac\x60\x15\xc5\x29\xb4\x23\x57\xae\
+\x3f\xb1\x54\xc9\x5c\x4c\x49\xe6\xcb\x30\x53\x25\x18\x39\xf3\xb4\
+\xf0\x1f\x12\x8e\xee\x2a\x0e\xb7\x36\xaf\xc7\xa6\xdb\xef\x86\xf7\
+\x66\x2f\xce\x4d\xf7\x73\x34\x95\xa6\x59\xb2\x15\x2a\x9b\x28\x3c\
+\x84\xb6\x7c\x4d\xdb\xc3\x16\x58\x81\x90\x8e\x67\x2b\x2a\x5c\x2c\
+\x5b\x1f\x9f\x79\x52\xf8\xdf\x04\x1d\xde\xfb\x0e\x26\xd2\x31\x24\
+\x4b\x1a\x4f\xb0\x07\x91\xe4\x30\xae\xea\x13\x28\x2e\x70\x9a\x99\
+\x32\x64\x81\x07\xa9\x5e\x45\x4d\x83\x07\xab\x02\x3e\x96\xef\x4d\
+\xc8\x9b\x39\x16\x4f\x99\xa3\x67\x11\x15\x24\xd2\x13\x3c\xf1\x47\
+\xe0\x32\x68\x6f\x80\xde\xea\x3c\x84\xa8\x3e\x82\x68\x6a\x04\xd3\
+\xd9\x49\x94\xf2\x06\x8a\x09\x13\x85\x84\x71\x81\xe5\x76\x9c\x23\
+\xf9\x9a\x4d\xdb\x85\x4a\xa1\xf5\x1b\x5a\xda\x9a\x5b\x9a\x31\xcf\
+\xca\xca\x18\x19\x1b\x20\x19\x90\x1c\x2f\x42\xfb\xd0\x0d\xf0\xba\
+\xa0\xee\x27\x43\xb8\x92\xb8\x84\xa1\xc4\x65\xae\x29\x37\x88\x53\
+\xce\x4c\x9b\x30\xf2\xb2\x4b\xfb\xc8\x4a\xd5\xe9\xcf\x41\x04\x03\
+\x4d\x6b\xc3\x0f\xdc\x77\x3f\x62\xc9\x51\xcc\xe6\x26\xb9\xf6\x56\
+\xcd\x01\x6d\xdc\x80\xd6\xeb\x32\xc9\xfe\x57\x41\xfb\x3b\x18\x30\
+\x7f\x91\x01\xbf\x30\x80\xe3\x65\x87\x44\x8c\x1d\x3e\x5e\x1e\x51\
+\xe3\x6b\xa0\x67\xdb\x9f\xc2\x70\xe2\x57\xc4\x38\x6b\x1b\xc0\x01\
+\x2d\xc4\x4d\xe8\x47\xdd\x32\xe8\x06\xed\x79\xec\x71\x9c\x9f\x3c\
+\xcb\x7f\x76\x05\x5b\x0d\x56\xda\x0b\x31\x13\xda\xa7\x2e\x93\x7e\
+\x00\xf4\xc4\xae\xdd\x38\x3f\xd5\x0f\xc3\x34\x6c\x80\x6d\x1f\x2f\
+\x43\xfb\xc4\x0d\x10\x02\xb5\x6c\x51\x20\x4b\xd6\xd8\x3b\xff\x02\
+\x2c\xcb\xf9\x31\x09\xed\xb8\x0b\xe0\x15\xb6\xdf\xec\x62\x1f\x67\
+\xfb\x63\x6e\x80\x97\x96\x8c\xce\x0d\x26\xda\x09\x17\xc0\xcb\x8e\
+\xfd\x92\x49\xb6\xed\x5d\x02\xfa\x0b\xf8\x4d\x3c\x96\x89\xb1\x82\
+\xc7\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x6b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x32\x49\x44\x41\x54\x78\xda\xad\x56\x7b\x48\x93\x51\
+\x14\xff\x9d\xb2\x6d\x2d\xb4\x22\xb7\x1e\xf4\xb4\x94\x0a\x1a\xf4\
+\x32\x32\xf2\x11\x85\x45\x25\xa3\xe8\x45\x94\x41\x65\xd1\x90\xea\
+\x8f\x12\x2c\x0a\xeb\x0f\x83\x28\x84\xda\x1f\x5a\x50\x56\x10\x22\
+\x46\xa5\x61\x2f\x6a\x16\x25\x14\x3d\xb0\x88\x90\x9e\xf6\x66\x52\
+\x36\xab\xcd\x2d\x3d\xdd\xed\x7b\xec\xdb\xb7\xa5\x19\x1e\xb8\xdc\
+\xf3\x9d\x7b\xee\x79\xfc\xce\xb9\x67\xa3\x25\x75\x6c\x04\x50\x20\
+\x56\x11\x7a\x96\xca\xc5\xda\x4d\xf6\x1b\xed\x2b\xc6\xf5\xa7\x82\
+\xb1\xf1\x34\xd9\x1c\xd7\x33\x96\x7f\xfd\x06\x5e\x7a\x18\x2f\x3c\
+\xbc\x93\x72\xae\xf9\x79\xc1\xa8\x3e\x98\x96\x08\x58\x44\x2e\x16\
+\x13\xc0\x42\x89\x64\x65\x2d\x0f\x9d\x2c\x96\xde\x0f\x61\xfc\xe9\
+\x37\xa0\xd1\x03\xd4\xbe\x0d\x80\x16\xd6\xfa\x78\xd5\x78\x23\xd2\
+\x07\x03\x86\xde\x80\xb9\x97\x50\xd6\x58\x24\x96\x2e\x4b\x1f\x1a\
+\x19\xc5\xf0\x24\x76\x5f\x07\xe0\xf6\x01\x8f\xbf\x02\x67\x9f\xb7\
+\x81\xe6\x57\xff\xe4\xdc\x49\x66\x64\x0f\x93\xf5\x84\x22\xcb\x16\
+\x23\x78\x84\x1d\x69\xf9\x98\x24\x14\xae\x7e\x10\x45\x78\xe2\x05\
+\xcd\x3b\xe7\xe1\xbc\xa9\xf1\xa1\x0c\x22\xf2\xd5\x45\xad\x44\xd7\
+\x1a\x90\x60\xf0\x8a\xe5\x6b\x07\xda\x84\x2c\xd0\x2e\xa9\xc4\x09\
+\x04\x4c\x02\x01\xa3\xd8\x9b\x45\x16\xc7\x1e\xb4\x82\xe6\x54\x7c\
+\xe5\xfc\xb4\x81\x48\x4d\x8c\x8d\xa9\xb8\x8f\x16\xbf\xb4\xbe\x8b\
+\xe5\xef\x88\xce\x46\x1f\x93\x42\x47\xeb\x5b\x40\xe9\x67\xdc\xbc\
+\x23\x2b\x11\xb6\x01\x61\x6d\x05\x16\x4f\x40\x36\x1c\x88\xac\x68\
+\x97\x10\xc9\x74\xf0\x66\x33\x28\xed\xc4\x27\xde\x93\x3d\x04\xc9\
+\x09\xe1\xcb\x01\x0e\x47\xdc\xa1\x6d\x1d\x2d\x6c\xdc\x05\x2f\x68\
+\xdf\xe5\xcf\xa0\xd4\xd2\x77\x5c\x6c\x1f\x8e\x11\x66\xe9\x3c\x08\
+\x41\x30\xe2\x20\xc6\x9d\x86\x4a\x52\x37\x85\x7c\xeb\x70\x0a\x35\
+\x87\xd8\x0b\xcf\xbf\x07\x4d\x39\xf2\x9a\x4b\x56\x8e\x86\x55\xbc\
+\x81\xdf\xc1\xf6\xab\xaa\x44\xfc\x71\x27\xcc\x77\xeb\xfe\x01\x84\
+\x30\xfd\x4a\xcb\xc0\xb7\xf5\x0e\xb4\xe6\x2c\x93\xe2\x12\xb6\xb6\
+\x55\xbc\x01\xd9\x0e\x35\x72\x59\x6e\x32\xfa\x1b\xa4\x17\x68\x59\
+\x9c\x09\xd3\x9d\xee\x19\x57\xc8\x37\x2b\x03\x1f\x2f\xba\xd4\xef\
+\x4d\x27\x5f\x80\x26\x16\x3f\xe3\xd3\x9b\x27\xc0\x40\x12\x3c\x56\
+\xe1\xc0\xf8\x9f\x0e\xda\x84\x03\x77\xb5\x4b\x45\x75\x4d\xe9\x73\
+\x50\x4a\x51\x03\x57\x6d\x9d\xa4\x2a\x99\x2e\x54\xa2\x6f\x99\x13\
+\x86\x6e\x3a\xf1\x0b\xe3\xde\x3c\x07\x7c\xf6\x65\x6a\xc7\x2d\x2d\
+\x79\x02\x4a\xda\xf5\x90\x6b\x0b\x26\x87\x04\xac\x2b\x12\x94\x3a\
+\x73\x58\xa6\xd6\x9d\x65\x5e\x16\xa8\xaf\x5e\xd3\xca\xf3\x0f\x3c\
+\x02\x8d\xdc\x71\x8f\x5d\x7b\xa7\xab\x63\x22\xea\xb5\x01\x11\xdd\
+\xa4\x1e\x77\xf6\xea\x65\x79\x66\xd1\x7d\xd0\xd0\xad\x77\xf9\x5e\
+\xf1\x4c\xa9\xed\x34\xd1\x45\x18\xfe\x07\x63\x8a\x4c\xc9\x38\x48\
+\x33\x0a\xeb\x41\xd6\x2d\xb7\xb8\xe1\xf0\xec\x48\x40\xf5\x93\x52\
+\x86\x82\x10\xe9\x30\xc4\x76\xf2\xa4\x6d\xdb\x6f\x83\x06\x6d\xbc\
+\xc1\x8d\xce\xac\x98\x88\x74\x15\xb8\xfe\x8e\x5e\x37\xc5\xe1\x02\
+\x25\xac\xbb\xc6\x4d\xc7\xe6\xaa\xf8\xb3\x0e\x73\xd2\xcc\x27\xd5\
+\xb1\x46\x97\x74\x59\x42\x33\xde\x47\x6c\xb8\x0e\xea\xb7\xfa\x32\
+\x7f\x39\x95\xad\xaf\x65\xf4\x94\x88\xf1\xd3\xf6\xb7\x49\xaa\xdc\
+\x1d\xb2\xf6\x0a\xc8\xb4\xbc\x86\x1b\x8e\xce\xc1\x48\x4b\xdf\x88\
+\x28\x15\xa6\xb3\xb9\x16\xcb\xb8\x72\xd6\xd4\xec\x85\x2d\xff\x26\
+\xc8\xb0\xb4\xfa\xa4\x63\xd1\x98\x5c\xc7\xc2\xa4\x90\x93\x9e\xa0\
+\x26\xb7\x17\xce\x4b\xaf\xe0\xac\x79\x5d\x4e\x71\xf6\xf3\x56\x21\
+\xcb\x13\x6b\x7f\x54\xf5\x54\xd0\xf5\xad\x14\xa3\xf2\x51\x1d\xc2\
+\xe2\x6f\x0b\x15\xfe\x01\x37\x45\x5e\x9e\xc0\xa3\xba\xcb\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x02\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xc9\x49\x44\x41\x54\x78\xda\xad\x94\x4d\x68\x13\x41\
+\x14\xc7\xff\xb3\x49\x8a\xe8\xc1\x63\x41\xea\x07\x22\x6a\x15\x15\
+\x44\xa1\xa0\x08\x11\x41\x28\x88\xb5\xc4\x52\xb1\x85\x2a\x1e\x6a\
+\x15\xa9\xa0\xe2\xc1\x9b\xe7\x82\x20\x8a\x20\xf4\xe4\x41\x45\x8b\
+\xb4\xe0\x49\xad\x9a\x46\x4d\x3f\x63\x69\x8a\x96\x8a\x5a\xa5\xc4\
+\x36\xdb\xcd\x47\xa3\x6d\x36\xb3\xe3\xdb\xd9\x6c\x92\x05\xdb\x08\
+\xdd\xc0\xf0\x26\x6f\xdf\xfc\x7f\xef\x63\x76\x19\xca\xfc\x0e\x76\
+\x6e\x11\x95\xeb\x57\xc1\x5b\xe1\x73\xf8\x73\x59\x1d\xbf\x7e\x2c\
+\xa0\xef\xec\x24\x5b\xee\xfc\xb2\x0f\x6d\x40\x7b\x7d\x2d\x36\xaf\
+\xad\x72\xf8\xbf\xa7\x63\xe8\x78\xd2\xbd\x72\xc0\xde\x7b\x1b\xc4\
+\xf5\xc6\x3a\x44\xe7\x1e\x38\xfc\xc9\x8c\x82\xb7\xa1\xd5\x18\x6e\
+\x9d\x72\x01\xd0\x70\x02\x13\xa9\xc7\x0e\xbf\x96\x02\x7a\xdf\xf9\
+\xdc\x01\x5c\x0b\xd4\x63\x72\xfe\x91\xfc\x2f\x68\x19\x06\x10\x4f\
+\x02\xa1\xb0\x4b\x80\x2b\x04\xf8\x42\x00\x53\x98\xd3\x32\x84\x82\
+\x78\x02\xe8\x1f\xf2\xb8\x04\xa8\x3f\x8e\x4f\xa9\x2e\x12\xb6\x2a\
+\x30\x21\x71\x0d\x18\x8e\xb8\x04\xb8\x74\xac\x0e\x9f\xe7\x9f\x92\
+\x38\x93\x10\xb3\x92\x19\x95\x63\x2c\xfa\x1f\x2d\x32\xaf\x61\x39\
+\xc8\xb9\xa3\xb5\x18\x4f\x77\xe5\xdb\x43\x55\x90\x9d\x4b\x70\x9a\
+\xc1\x62\xb9\xa3\x60\xfe\xce\x9d\xe2\xc6\x19\x3f\xa6\x13\xdf\x20\
+\x98\x42\x22\xcc\x1a\xa4\x14\x52\x20\xb8\x82\x71\x35\x44\xb9\x7b\
+\xa5\xb0\x01\x45\x5a\x9d\x02\x16\xb9\xc0\xee\xca\x1a\xf2\x19\x85\
+\xca\xe4\x59\x0e\x78\x7d\x1e\x3c\x7c\x1e\x06\x3b\x74\xbf\x5a\x9c\
+\x3f\xb5\x15\x91\xe9\x10\x1d\xf5\x58\x41\x82\x41\xa7\x20\x32\x72\
+\xcf\x68\xa8\x06\x3d\x2b\x54\x00\x4b\xcc\x10\x02\x9c\x96\x41\x20\
+\x23\xef\x13\x26\x88\xf6\x0a\x25\x34\xf8\x21\x0d\x76\xe0\x6e\xb5\
+\x68\x6b\xda\x41\x80\x3e\xca\xd2\xe7\x08\xe2\x32\x23\x25\x2f\x56\
+\x14\xb6\x67\x21\x81\xb0\x5a\x06\x51\xdc\x9b\xf6\x4f\x56\xc1\xd8\
+\x40\x12\xac\xe6\xf6\x76\xd1\xd6\xbc\x0b\x23\x3f\x83\x50\x98\xb7\
+\x28\x6c\x28\x56\x56\xa5\xc2\x54\x0d\xb7\xb3\xb7\xdb\x91\x9f\x60\
+\xce\xb0\x6e\x8c\x95\x9c\x02\xfa\x54\xe1\xe3\x7b\x02\xec\xbf\x65\
+\x01\x86\x09\xc0\x94\x8a\x42\x06\xa5\xc2\x5c\xb0\x62\x5b\x4a\x84\
+\xed\x58\x94\x08\x1b\xd2\xc1\x91\xe3\x74\x85\x83\x04\xd8\xd7\xb1\
+\x4d\x1c\xf1\x6f\x44\x74\x3a\xba\xe4\x4d\xd8\x53\xe9\xc7\x94\x11\
+\x74\x08\xc7\x62\x39\xf9\x6c\x4d\xc5\xbf\xcf\x64\xb2\xc0\xc4\x68\
+\x06\xac\xfa\xe6\x26\x91\x4e\x65\x97\x14\xd7\x7e\xcf\xe1\x72\x4b\
+\x00\x5f\x79\xd0\x91\xf1\x0c\x01\xc2\x2f\xd5\xf2\xd7\xb4\x5c\x40\
+\xd5\xd5\x75\xa2\xa5\xe1\x30\x26\x75\xbb\x02\x45\x52\xd4\xd9\xac\
+\x04\x64\xee\x2c\xac\xec\x4d\x36\x01\xed\x2d\x27\x11\x4e\x74\x17\
+\xfa\x6b\xf6\x5b\x55\x0d\x0c\xbe\x88\xbb\x03\xb8\xd0\x1c\xc0\x60\
+\xf2\x59\x7e\x90\x1e\x59\x89\x36\xab\x63\xe8\x95\x4b\x80\xb6\xd3\
+\x01\xf4\xa7\x7a\xa4\xb0\x3d\x04\x95\x00\x23\xaf\x5d\x02\xb4\x36\
+\x05\x30\xa0\xf5\xc0\xd6\x37\x87\xad\xc5\x75\x44\xde\xb8\x05\xa0\
+\x0a\xc2\x89\x1e\xc7\x2d\xd2\x66\x74\x8c\x06\x5d\x02\x5c\x6c\x6e\
+\x44\x88\x66\x20\x2b\xc8\xbf\xb9\x09\x02\x44\x7a\x67\xdd\x01\x98\
+\x36\x9d\x4d\x16\x5a\x24\x6d\x8e\x4b\x5b\x0e\xf0\x17\xa5\x35\xdf\
+\xe4\xdf\x81\x57\x9f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x06\x29\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xf0\x49\x44\x41\x54\x78\xda\x85\x56\x69\x6c\x15\x55\
+\x18\x3d\xb3\xbe\xad\xef\xb5\x6c\x2d\x65\xed\x23\x15\x44\x22\xa6\
+\x05\x17\x42\x88\xda\x02\x91\xad\xa0\x6c\x26\x42\x0c\x11\x45\x52\
+\x44\xad\x89\xcb\x0f\x15\x5c\x88\x26\x2e\x11\x5a\x2c\x22\x1a\x83\
+\x20\xf4\x07\xf2\x43\x0c\x10\x01\x05\x0b\x84\xd0\x16\x41\x08\x08\
+\xb6\x2c\x2d\x48\x0b\x05\xfa\xf6\x79\xb3\x78\xee\xbc\x5a\x59\x44\
+\xa6\x7d\x99\xce\xbc\xb9\xe7\x7c\xf7\x7c\xe7\x3b\x53\x09\xff\x73\
+\x8c\xf8\xaa\xa9\xc4\xb4\x31\x2b\x65\x3b\xe3\x47\xf6\xd4\xc3\x3c\
+\xc3\x71\x00\x05\x0e\x7e\x6b\x37\x9b\x74\x45\xda\xae\x29\xa8\xa9\
+\x9b\x17\xde\x79\x3b\x0c\xe9\xbf\x6e\x8e\x5c\xd3\x58\x94\x30\x51\
+\x3b\xa5\x30\xcb\x57\x9c\xa3\x61\x54\x9e\x07\x16\x9f\xf4\x7a\x34\
+\x04\xfd\x0a\xe2\xfc\x52\xb1\x2d\xec\x6e\x49\xe0\xe7\xe6\x38\xb6\
+\x9d\x4d\x25\xfc\xaa\x34\xba\xee\xb9\x41\x0d\x77\x24\xb8\xef\xf3\
+\x53\x95\xfd\x73\xf4\xf2\x8a\xe1\x21\x78\x2d\x40\xd5\x25\xa8\x2c\
+\xd3\xa7\xcb\xf0\x7b\x54\x78\x75\x05\x89\xa4\x09\x59\x96\xa0\x70\
+\x75\xcf\x80\x86\xc3\xe7\x3a\xf0\x7a\xed\x25\xb4\x26\xcc\xaa\x23\
+\xe5\x43\x16\xdd\x96\x60\xd8\xf2\x13\x1b\xc6\x16\x66\xcd\x9e\x53\
+\x90\x85\x8e\x94\x05\x4d\x95\xa1\x13\xd0\xab\x09\x70\x05\x01\xaf\
+\x02\x4d\x91\x11\x27\x81\x58\xa9\x91\xc1\xc3\x67\x12\x49\x0b\xb2\
+\x69\xe1\xcd\x3d\x7f\x61\xff\x85\xe4\xc6\x63\x15\xf7\x3c\x79\x0b\
+\xc1\xd0\x8f\x8e\x56\x96\x0e\x09\x95\xcf\x1c\x10\x44\x94\xc2\x13\
+\x0b\x3a\x17\x7b\x48\xe0\x23\x81\xa8\x3c\x40\x79\x78\x1b\x89\x94\
+\xed\xae\xc9\xf2\xaa\x48\x3b\x36\x62\x31\x0b\xb6\x63\xa2\x77\xc0\
+\x8b\x8a\xad\xa7\xb1\xa7\x39\x51\x75\xe2\xd5\x7b\x17\x75\x11\x0c\
+\xfd\xf0\x50\x51\xbf\x1e\xde\xfa\xf7\x47\xf5\xc6\xc5\x68\x1a\x8a\
+\xca\xaa\x59\x9d\x4e\x60\x1f\xe5\xf1\x7a\x24\xf8\x28\x4f\x96\x4f\
+\x81\xc4\x26\xc7\x44\xc5\xfc\x23\x94\xa5\x13\xdc\x44\xd2\xb0\x10\
+\xcc\xd2\x60\xa5\x1d\x68\x92\x8d\xc9\x6b\x8f\xa3\x23\x69\x15\x1f\
+\x7b\xa3\xb8\xc1\x25\x28\x58\x72\x30\xfe\xe5\xf4\x42\x5f\x5c\x80\
+\x13\x58\x66\xe5\x82\xc0\xab\x77\xee\xa0\x53\xff\x20\x2b\x8e\x53\
+\x3a\xd3\xb2\x78\x4f\xe1\x0e\x25\x44\x13\x16\xfc\x24\x36\x4d\xc7\
+\xfd\xd8\x74\x5a\xe3\x85\x08\xe6\x6c\x3a\x95\x38\xf7\xee\x43\x7e\
+\xa9\xf0\xed\xfd\x25\x65\x23\xf3\x76\x8c\xcd\x0d\x22\x4d\xfb\xa9\
+\xb2\x42\x5d\x33\xf2\xfc\xa3\x7f\x80\xfa\xfb\x09\x1e\x24\x50\x8c\
+\x04\xa9\x94\x89\xee\xd9\x1e\xa4\x79\x16\x05\x18\x96\x83\x74\xda\
+\x76\x09\xd2\x94\x57\xe7\xfa\x57\x36\x9d\xc4\x81\x96\x68\xa9\xd4\
+\xff\xf5\xbd\xd5\xcb\xa6\x0d\x5a\x90\xed\xf0\xae\x4c\xd7\x08\xdd\
+\x6f\xd6\x9f\x37\x6c\x57\x76\x56\x99\xb6\xdc\x5d\xe6\xf7\xf4\xbb\
+\x40\x36\x41\x53\xd7\x11\x18\x24\x00\x65\xda\x79\xa4\x1d\x6f\xff\
+\xd4\xb8\x4a\xea\xf5\xd2\xae\xc6\xda\x8a\x07\xc3\xbf\xb7\x44\xa1\
+\xd3\x21\xb2\x22\xdf\xa0\xbf\xcf\x4b\x9b\xf2\xda\xa7\xe9\x74\x91\
+\x84\xc6\x4b\x31\x0c\xc8\xf6\x23\x4d\xc6\x6c\xea\x2e\x39\xb7\x12\
+\x98\x9c\x11\xd5\xb0\x51\xfc\xf1\x81\x26\x69\xc6\x9a\xc3\xce\xc2\
+\xa2\x7e\x88\x08\x5b\xde\xa4\xbf\x90\x28\xe8\xe5\xb5\xaa\x62\x6d\
+\xfd\x79\x2c\xdb\x74\xfc\x62\x4e\x96\x9e\xfb\xec\xb8\x01\xd2\xcb\
+\x63\xc2\x88\x11\x24\xc7\xaf\x22\x49\xd0\xeb\x09\xd2\xec\x91\x47\
+\x96\x31\xbb\xba\x1e\x52\xd9\xca\x7a\x67\xe1\xfd\x03\x61\xb0\xa2\
+\xeb\xf5\xd7\x84\x7b\x34\xc9\x6d\x6e\x5e\x8e\x07\xf9\xe5\x3f\xb6\
+\x25\xbe\x99\x94\x2b\x84\xf2\x3e\xfd\xc3\xc5\xcb\x5f\x4c\xca\xbd\
+\xd2\x61\xa0\x7b\x50\x47\xaa\x8b\x00\x24\xb0\x5c\x02\xaf\xa2\x62\
+\xea\xf2\x7d\x90\x26\xad\x38\xe8\x2c\x7a\x30\x8c\x94\x20\x10\x8d\
+\x65\x1f\x84\xf6\xbd\x42\x1a\xba\x85\x3c\xe8\xa0\x4b\x06\xf7\xd6\
+\xa1\x3d\xb5\xb9\xcd\x5c\xff\xb8\x4b\xe0\x99\xb3\xb9\xf5\x8f\x4f\
+\x27\xf4\x52\x69\x67\x1f\x77\x9b\x24\xb8\x45\x92\x94\x45\x12\x5a\
+\xd5\xa4\x64\x5e\x7e\x37\x6b\xc5\x5e\x48\x53\x96\x1f\x70\xde\x28\
+\x19\xcc\x06\x4b\xc8\xe6\x76\x7b\x50\x57\x31\xb5\x92\x20\xd3\x80\
+\xe6\xcb\x69\xf7\xba\xa6\xfe\x2c\x2a\xaa\xeb\x5a\xe9\x42\x2c\x9d\
+\x3b\x3c\xf7\xe5\xd2\xbb\x5c\x69\x5a\x5a\xe3\x6e\xc5\x86\x91\x91\
+\x88\xbf\x1c\x3a\x1b\x01\x12\x2c\x5e\x57\x07\x49\x9b\x55\xd3\x18\
+\xff\x76\x66\xf8\xcc\xa5\x04\x9b\xac\xd2\x21\x99\x08\x70\xdd\x44\
+\x9f\x1b\x8e\x84\x56\x4a\xd1\x53\x48\x11\x31\x90\x9f\xa7\x23\x12\
+\x27\x10\xcd\x72\x95\xd7\x1d\x9c\x1d\x97\x80\xc8\x96\x25\xaa\x87\
+\xeb\xa2\x6c\x62\x8d\x7e\x6f\x7b\x93\x14\x98\xb9\xa1\x7a\xdd\x6b\
+\x0f\x2f\x18\x9e\x9f\x0d\xe1\x53\x31\x3c\x2a\x1d\xa4\xca\x99\xb3\
+\x4b\x42\xb0\x8b\x97\xe3\xb8\x7a\xcd\x44\x41\xdf\x00\x24\x8e\x67\
+\x8a\xd3\xdb\x11\x35\x61\x50\x9e\x94\xab\x3b\x09\x04\x09\x9f\xe5\
+\x12\xec\x3b\xd1\x86\x77\xbe\xaf\x5b\x25\x85\x66\x7f\x57\x32\x63\
+\xec\x90\x1d\x4b\x26\x0f\xa3\x86\x99\x80\x13\x81\xa6\xa9\x99\x5d\
+\x30\xf3\xa1\x31\x51\x9b\x5a\x62\x8c\x6a\x8d\xd6\xd4\xd9\x17\x13\
+\x09\xf6\x46\x44\x44\x2a\x9d\x21\x49\x9b\x99\xea\x39\xcb\xb4\xb4\
+\x86\xb7\x6a\x1a\x70\xe0\xd8\xf9\x52\x37\x2a\xa4\x09\x5f\xc7\x1b\
+\xaa\xa6\xfb\x82\x74\x8c\xb8\xa1\x51\x3f\x31\x4c\xc2\x4d\x2a\x9d\
+\x24\x7e\x1a\xcf\xc6\x90\xd7\xcb\xc3\xc0\x53\x11\x65\xfe\x44\x39\
+\xc5\x06\x43\x4f\xb8\xc6\xe8\xb4\xa8\x90\x8d\xee\xc4\xf9\xd6\x18\
+\xe6\x7e\xb6\x2d\x61\x6e\x99\xef\x77\x09\x42\x53\xbf\x29\xca\xed\
+\x9b\x5d\x7f\xf0\x83\x32\xb4\x45\x52\x0c\x2c\xc9\xdd\x89\xca\x5d\
+\x78\xd8\xe0\xf6\xab\x19\xad\xfb\xe6\xfa\x38\x88\x22\x7f\x18\x70\
+\x49\x11\x72\x9d\x04\x9d\xfa\x5b\xb6\x84\x6e\x8c\x93\x89\xcb\xb6\
+\xe2\x5a\x24\x56\x1c\xdb\x3c\xaf\xa1\x2b\xae\xd5\xc7\x56\x57\x4e\
+\x19\x77\x77\xf9\xea\xf9\xa3\xd0\x11\x4b\xbb\x53\x2d\xca\x09\x05\
+\x14\x9c\x39\x1f\x87\x4d\x80\xfe\xf9\x7e\x82\xd8\x88\xc6\x3b\xe5\
+\x31\xfe\xd5\x9f\xc3\xcb\xa1\xa4\x73\xbe\xde\x8f\xbd\x87\x1a\xab\
+\xac\x6d\xcf\x2f\xba\xe5\x85\x83\xd2\x95\x1b\xca\xc6\x0d\x9b\xbd\
+\xfe\x85\x31\xb8\x12\x31\xa1\x7a\x64\x38\x5c\xdc\xd6\x9e\x14\xe2\
+\xa2\xa0\x4f\x00\x31\x4e\x53\x22\x6e\x77\xe9\x2f\x06\xcc\x66\xe5\
+\x21\xaf\x8e\x05\xab\xf7\xe0\xd7\x83\xa7\x36\x62\x67\xf9\xad\x2f\
+\x9c\xae\xe3\x91\xca\xca\x3e\xfd\x7a\x94\x6f\x59\x3a\x11\xc3\x0a\
+\x42\x68\x6e\x49\xba\xf9\x6f\x31\x73\x06\x0d\x0c\x20\x12\xc9\xe8\
+\x9f\x36\x1c\xd7\xef\x32\x21\x4e\x36\x5f\xc3\x33\x2b\x76\xa0\xbd\
+\xed\x4a\x15\x7e\x79\xf1\xf6\xaf\xcc\xae\xe3\xd1\xca\x22\x0a\x5d\
+\x5b\x36\xad\xd8\x37\xe5\x81\x30\x9e\x18\x11\xa6\xce\x26\x9b\xac\
+\xe2\x5a\x8c\x71\x40\x42\x87\x7e\x5c\xbf\xb7\x09\x9b\x6b\xff\xc4\
+\xee\x3d\x47\x13\x9c\xc6\xd1\xd8\xb5\xf8\xce\x2f\xfd\x1b\x8e\x31\
+\x9f\x94\x50\xe4\x59\x44\x1f\x5f\x58\x1c\x0e\x1b\x86\xeb\x43\x3a\
+\x4c\x46\xd3\x91\xd3\x4d\xb4\xd9\x76\x46\x6d\x0d\x6a\x5f\xb9\xed\
+\xbf\x2d\x7f\x03\x08\xf7\xed\x5b\x6f\x29\x61\xc0\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x44\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x0b\x49\x44\x41\x54\x78\xda\x85\x56\x09\x4c\x14\x67\
+\x14\xfe\x66\x66\x2f\xd9\xc3\xdd\x65\x41\x57\x40\x0e\x51\x44\x25\
+\x8b\x02\x22\xb5\x8a\x8a\xa8\x10\x8c\x56\xe3\x49\xbd\x6b\x55\xd0\
+\x46\x5b\x63\x5b\x9b\x1a\xd3\x26\x36\x4d\x43\x6a\x6a\x40\x6c\xb5\
+\x1e\xb4\x16\xb0\x31\xa6\x12\x0e\xef\x23\xc4\x45\xa4\x62\x41\x5b\
+\x0f\x40\x8e\x8a\xdc\xd7\xb2\xec\xee\xec\xcc\xf4\xdf\x59\x41\xad\
+\xa2\x2f\x99\x4d\xfe\xb7\x6f\xde\xf7\xff\xdf\x7b\xef\xfb\x87\xc2\
+\x1b\x4c\x37\x27\x3d\x96\xe7\xf8\xe5\x1c\xc7\xcd\xe5\x79\x21\x50\
+\xae\x51\x88\x7e\x7b\xb7\x0d\x34\x4d\xd5\x30\x0c\x53\x44\x33\x74\
+\x76\xc7\xb9\xd4\xab\x83\xe5\xa0\x5e\xe7\xd4\x27\x1e\x34\xb1\x36\
+\x47\xa9\xda\x5b\x2f\x1d\x19\x32\x02\xbe\x81\x5e\xd0\x69\x15\x90\
+\x2b\x64\x6e\x00\x9b\x03\x1d\x9d\x36\x34\xd4\xb4\xa0\xee\xfe\x13\
+\xf4\x34\xb7\xb3\x52\x85\x2c\xaa\x3d\x7f\xcb\x9d\xb7\x02\x78\x26\
+\x66\xa4\x83\x92\xa4\x44\xc5\x9b\x10\x14\x6c\x80\x42\x29\x03\x4d\
+\xc2\x78\x41\x00\x84\xe7\x6f\xd1\x14\xf1\x11\x87\xad\xd7\x81\xea\
+\x47\xad\x28\x3d\x4f\x72\x0b\xce\x8c\xb6\xfc\x94\xd4\x41\x01\x3c\
+\x13\x7e\xcc\x51\x1b\x75\x4b\x67\x27\x84\xc1\x73\x98\x0a\x82\x40\
+\x89\x49\x49\x2e\x77\x60\x7f\xf4\x33\x2c\x17\xa6\x1b\x4c\x40\x6b\
+\x93\x05\x17\x0a\x2a\xd0\xd3\xd8\x91\xdb\x56\xf0\xe1\xb2\x57\x00\
+\x86\x2d\x3c\x9a\xae\x34\xa8\x52\x16\x2f\x89\x82\x52\xa5\x00\xef\
+\xe4\x61\x27\x19\xba\xfa\x9c\x68\xb3\x72\xe8\x21\x6b\xde\xe9\x8e\
+\xa5\x25\x80\x5a\x42\x43\xef\xc1\x40\xa7\x90\x10\x00\x1a\x0c\x59\
+\x5b\xad\x7d\x38\x93\x5b\x0a\x4b\xab\x25\xa3\xe9\xcc\xba\xd4\x01\
+\x00\xdf\x65\x59\x26\xd6\xc9\x97\xaf\x5c\x37\x15\x43\xd4\x1a\x58\
+\x58\x0e\x76\xd6\x89\x86\x6e\x16\x52\x86\x24\x14\xdc\x47\xa0\x9e\
+\x6d\x47\x64\x8b\x3c\x52\x9a\x34\x82\x5c\x06\x1b\xcb\x93\xff\x28\
+\x18\x54\x0c\x38\x5b\x2f\x4e\x1e\x2d\x86\x54\x42\x87\x37\xe4\xac\
+\xba\x23\xbe\xe2\xbd\xe8\xb8\x23\x2e\xc1\x24\x9d\x12\xe1\x87\x47\
+\x4d\x7d\x78\x6f\xac\x06\x45\x0f\x7b\xf1\xc4\xca\x82\x73\x65\xa2\
+\x5e\x2d\x96\x8b\x1d\x57\x5d\x3e\x0a\xd7\x21\x26\x40\x23\xfa\x36\
+\xe6\xd5\x21\xcc\x47\x05\x73\x59\x3d\x2e\x16\xdc\x61\x9b\x4f\xaf\
+\x91\x51\x23\x57\xe6\xc4\xca\x54\xd2\x2b\xdb\x37\x4e\x43\x55\x07\
+\x8b\xe6\x6e\x3b\xf6\xcf\xf1\x81\x41\x2d\xc5\x95\xaa\x2e\x64\x57\
+\x76\xc2\x46\xb2\x49\x18\x52\x6a\x9a\x26\x3b\x17\x06\x40\x5c\x3b\
+\x5f\x33\x5e\x85\xf8\x31\x7a\x71\xbd\xe4\xb7\x2a\xf8\x79\x79\x60\
+\x94\x56\x8a\xfd\x3f\x5d\x87\xc3\xc2\xce\xa0\x7c\x93\x73\x0e\x4e\
+\x8e\x09\xd8\x1c\x1d\x19\x88\xaa\x4e\x07\x7a\x3b\x6c\xf8\x6e\x9e\
+\x0f\x8c\x5a\x77\xcf\x73\xbc\x80\x93\xb7\x5b\x90\x77\xbf\x1b\x5a\
+\xa5\x14\x72\xa5\xc4\x5d\x5c\xf2\x58\xfb\x38\x2c\x1f\xab\x44\x7c\
+\x88\xa7\x18\xbb\xec\xd7\x87\xd0\x1a\x5c\x00\x32\x94\xdc\xaa\xc1\
+\xcd\x1b\x8f\x33\x29\x9f\xe4\x53\xd5\xab\x56\x47\x05\x5a\x41\xda\
+\x91\xf0\xf0\xb4\xd9\x82\xb4\x44\x5f\x8c\xd0\x0d\x79\x89\x92\x27\
+\x5d\x7d\xf8\xb2\xa0\x16\x25\x55\xbd\x30\x1a\x87\x42\xaf\x1f\x02\
+\x9a\x63\xb1\x7e\x1c\x39\x41\xa8\xc1\x7d\x82\x63\xff\xc0\xd7\x67\
+\x28\xa1\x0e\xf0\x80\x03\x59\x27\x4a\x6b\xa8\x11\xc9\xb9\xc2\xba\
+\x4d\xb1\xa4\xa8\xa4\x50\x04\xa1\xbe\xae\x13\x69\xf3\x47\xbe\x02\
+\xd0\x6f\x97\xef\xb7\x61\x5b\xf6\x03\xb0\xb4\x14\x0a\xb5\x02\x9b\
+\x26\xa9\x91\x32\xdd\xdf\x0d\xf0\xf3\x5d\x04\x06\x19\x20\x10\x04\
+\x39\xe9\x80\xa3\x87\xae\x82\x0a\x4e\xcd\x13\x56\xaf\x8a\x21\xd3\
+\x49\x3a\x86\x38\xaf\x95\xd6\x21\x73\xe9\x18\x8c\x36\xaa\xdf\xa4\
+\x22\x38\x66\x6e\xc0\xce\x23\x95\xf8\xfa\xfd\x50\x6c\x89\x75\x03\
+\x4c\x4f\x2b\x45\x5c\x4c\x00\x58\xb2\x59\xb9\x42\x8a\xe3\x27\xcc\
+\xa0\x42\x3e\xbe\x28\xac\x5d\x11\x01\xce\xe1\xc4\xa3\x6e\x1e\xe7\
+\xf2\x2b\x71\xe9\xb3\x08\x84\x8c\xd0\xbc\x11\xa0\x98\x4c\xef\x8a\
+\xef\x6f\x61\xd7\xe2\x10\x6c\x9d\x15\x28\xfa\xbc\x52\xcf\x23\x69\
+\x7e\x38\x82\x35\x34\x24\x32\x09\x0e\x67\x11\x00\xff\xad\xe7\x85\
+\x9d\x1f\x44\xe3\xaf\x46\x2b\xba\x9d\x14\xae\x17\x96\xe3\xe2\x17\
+\xd1\x18\x4b\x78\x7e\x9d\x55\x3f\xed\xc6\xc2\xfd\x66\x74\x5a\x00\
+\xe3\xa8\xe1\x58\x31\x56\x8e\xed\x09\x21\xee\x61\xdd\x5c\x88\x99\
+\x49\x93\xa0\x91\x08\x30\x19\x3d\xf0\xdd\xe1\x12\x50\xa3\xb7\x5f\
+\xaa\x9e\x3d\x6f\x5c\x20\x99\x29\xc8\x09\x6a\xfe\xef\x66\x5c\xda\
+\x33\x15\xa1\xbe\xda\x97\x12\x73\x3c\x8f\x45\xfb\x8b\x71\xd1\xdc\
+\x88\x18\xa2\x53\xfe\x41\xde\x78\x5c\xd3\x86\x79\xc3\x59\xec\x4c\
+\x0a\x15\x63\x0c\xeb\xcf\x62\xc1\xf2\x77\x60\x27\x6c\x68\xa4\xc0\
+\x85\xc2\x7b\x35\x54\xe8\xe7\x57\x0f\x06\x8d\xf7\xdb\x6c\xf4\x56\
+\x8b\xc7\x3a\x7d\xe2\x1a\x2e\xef\x9d\x86\x71\x7e\xba\x81\xe4\x69\
+\x67\xef\x61\xd7\x01\x33\x26\xce\x9c\x00\x53\x64\x10\x18\x32\xb5\
+\x02\xd1\x9f\x5a\xd2\x10\xb3\xf5\x7d\xd8\xb5\x20\xcc\xad\x65\x6b\
+\xcf\x60\xc9\xba\x19\x22\xdd\x8d\xcd\x3d\xa8\xbe\x5b\x9f\x49\x85\
+\xed\xb9\x11\xeb\xa1\x51\x5c\x99\x3c\x25\x80\x68\x02\x8d\x9c\x43\
+\x17\x50\xfc\x4d\x1c\x82\x09\x45\x7f\xfc\x59\x8f\x0d\xfb\xae\x60\
+\xa8\xaf\x11\xef\x26\x9a\xa0\x22\x73\xc0\x91\x02\xba\x86\x8d\x66\
+\x28\x54\xd7\xb4\x63\xba\xca\x82\xdd\x8b\xc3\x45\x00\x6d\xf2\x69\
+\xac\xde\x3a\x9b\x8c\x38\x8f\x9b\xe6\xc7\xb0\x76\xdb\x66\x88\x0a\
+\x10\xb6\xc7\xec\x98\x38\xc5\x5f\x3a\xcc\x4b\x8d\x13\x3f\x14\x61\
+\xef\xda\xf1\x38\x92\xf7\x00\xf7\xaa\x3a\x90\x90\x1c\x0b\xff\x00\
+\x4f\xb0\x76\xe7\x4b\x53\xcc\x90\x96\x7e\xf4\xb8\x1d\x71\x5a\x2b\
+\x76\x24\x4d\x10\x7d\xba\xe4\x53\xd8\xb8\x23\x11\x4d\x2d\x3d\xb8\
+\x6d\xae\x65\x2b\xbe\x9a\x22\x13\x01\x26\xee\x2b\x33\xd1\x32\xa6\
+\x7c\xce\xac\x31\xc8\x4a\x2f\xc4\x93\x7b\xb5\x98\xb5\x26\x1e\x93\
+\xa3\x83\xe1\xb0\x3b\xc8\x86\x78\xbc\x90\xdb\xad\xa8\x04\xa0\xa9\
+\xcd\x82\x5f\xf6\x66\x41\x9c\x50\xd2\xfb\xfe\x11\xa1\x58\xb9\x29\
+\x1e\xe7\x2e\x3d\x00\xef\xe0\xc2\x6f\xef\x8e\xb8\x33\xa0\x61\x11\
+\xdf\x96\xa7\x0f\x1d\xa6\x4c\x89\x8d\xf4\x03\x61\x01\x4e\xa2\xa6\
+\xfd\x74\x0c\x66\x12\x22\xb5\x4d\x2d\x5d\xb0\x13\xc9\x70\xc5\x05\
+\x06\xe8\x61\xae\x78\x8a\xae\xa6\xde\x8c\xb2\x4f\xc3\x9f\xcb\x75\
+\xbf\x45\xa6\x55\xe4\xe8\x0d\xca\xa5\x51\x13\xbc\x44\xb1\x71\xa9\
+\xe5\x1b\xf2\xbb\x2f\x22\xf2\xe3\x12\x42\x97\x36\x99\x2b\x9b\xd1\
+\xde\xdc\x9b\x7b\xeb\x93\xb0\x57\x2f\x9c\x7e\x8b\x3e\xf0\x77\x3a\
+\x23\xa3\x53\x22\x08\x88\x81\x48\x01\xc7\xf1\xa2\xb6\xfc\xff\x24\
+\xae\xc4\x2e\x66\x18\x92\xbc\xb5\xc7\x86\xb2\xca\x16\xd2\x3d\x7c\
+\x46\xc9\xb6\xd0\xc1\xaf\xcc\x7e\x8b\xc9\x7c\x68\xe2\x38\xa1\x54\
+\xa7\x95\x4b\xfd\x7d\x3c\xe0\xa9\x92\x41\x29\x97\x0c\x9c\xc6\xb5\
+\xf3\x5e\x52\xf4\x36\x8b\x03\xb5\xff\x5a\xc9\x07\x80\x9d\x65\x18\
+\x2a\xea\xc6\xe6\xd1\x6f\xbf\xf4\x5f\xb4\x69\x47\xaa\x62\x79\x9e\
+\x5a\x4e\x2a\x31\xd7\x45\xb1\x7c\x08\x23\xfa\x5d\x9c\x13\x90\x1a\
+\x72\x43\x14\xd1\xb4\x90\x7d\x7d\xc3\xa8\x41\x3f\x5b\xfe\x03\xc2\
+\xa4\x7c\x16\xce\xe0\x53\x7c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\x41\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x08\x49\x44\x41\x54\x78\xda\xad\x94\x0f\x4c\x1b\x55\
+\x1c\xc7\xbf\xed\x15\xda\xf2\xa7\xb4\x2b\x30\x40\x58\x15\x89\x8a\
+\x26\x6c\x12\x14\xdd\x70\x41\x49\x46\x9c\x38\xb3\x00\xe3\xba\x48\
+\x40\x64\x71\x13\x12\x5c\x9c\x53\x26\x10\x70\x63\xc6\xb2\x4c\x59\
+\x98\x18\xe2\x9c\x21\x6a\x0b\x93\x38\x45\xc6\x1c\x59\xdc\xa2\x2c\
+\x1b\x61\x7f\x5c\x36\xd9\x70\x6c\x08\xe5\x28\x75\x14\xda\x59\xba\
+\xfe\xb9\x7b\xde\xb5\xa3\x92\x25\x86\x02\x7e\x92\x77\xb9\xf7\xe7\
+\x7e\x9f\xf7\x7e\xef\xbd\x13\x61\x0e\xdd\x3f\x9c\x7d\x2c\x58\x1e\
+\xfc\xab\x4a\x19\xa6\x56\xaa\x42\x60\xb1\xd8\x61\x1c\x36\xff\x26\
+\xa1\x44\xbb\x73\x72\x33\x3a\xb0\x08\x44\x73\x2b\xdf\x1f\xf9\x45\
+\xec\x74\xb1\xc6\xec\x9c\xb4\x58\x85\x22\xd4\xdf\x3e\x34\x34\x86\
+\xbe\xde\xeb\xed\x9b\x8b\xb2\x0a\x96\x24\x98\xe5\x50\x73\xd7\xc8\
+\x86\xfc\xd5\x09\x91\x6a\xa5\xbf\xcd\x34\x7e\x1b\xc7\x3b\xfb\x0f\
+\xbe\xf6\xc6\x8b\xe5\x4b\x16\x08\x1c\x68\xe8\x18\x2e\x28\xca\xd4\
+\x44\x47\x2d\xf3\xb7\xf5\x1c\xeb\xc7\x8d\x1b\x8c\xe2\xcd\x8a\x57\
+\xee\x04\x2c\xe0\x03\x39\x08\xe1\x4a\x2b\x76\xe6\x7f\x7d\x7f\x67\
+\xc3\x9e\x76\xb2\xe3\xfd\x7c\x7f\xdd\x32\x69\xc5\x97\x2d\x3f\xed\
+\x79\x7b\x57\x41\x75\xc0\x02\x7d\xeb\x49\x22\xbc\xdc\x1a\x1a\xd7\
+\xee\xaa\x7b\xd5\x30\xdb\xb1\x6f\xaf\x61\xb8\x7c\xfb\x46\x8d\x54\
+\x16\xcc\xd7\xc8\xbd\xc5\x12\xec\xae\x6a\xed\xa9\xa9\x2f\x5e\x17\
+\xb0\xe0\x4c\xef\x55\xf2\xec\xea\xc7\xd1\xd2\xd4\x85\x91\x11\xd3\
+\xa6\xfa\x86\xd2\x23\x1f\x54\xb7\x8e\x6c\x7f\x27\x37\x41\x1e\x22\
+\x03\xcb\x72\xbe\x81\x22\x11\x5f\x80\xda\x9d\x87\x7b\xea\x3f\xde\
+\x12\xb8\xe0\xf3\x4f\xbb\x49\xc9\xd6\x6c\xb0\x1e\x16\x8d\xfb\x8f\
+\xc2\xc4\x4c\x9a\xaa\x6a\xb5\x31\xd2\xd9\xe0\xc4\x37\x50\x4c\x89\
+\x30\x3a\x6c\x46\x73\x53\x67\xd5\x27\x07\xcb\xea\x03\x16\x94\x16\
+\xe9\x2e\x35\xb5\xbc\xb5\xd2\xed\x74\x83\x25\x04\x2e\xa7\x0b\x32\
+\xb9\x14\xac\x5b\x08\x4e\x7c\xc9\xe1\xa7\xce\x72\x1e\x30\xc6\x29\
+\x34\xee\x6b\x3f\x7c\xe8\xab\xf7\x4a\x02\x17\x14\xeb\x72\x9f\x5b\
+\xfb\xe4\xb7\xb9\x79\x6b\xe0\xb8\xeb\xf2\x05\x25\xe4\xdf\x01\x7c\
+\x70\x97\xc7\x8d\x8b\xe7\x6f\x42\xad\x0e\x47\x10\x25\xc1\x81\x8f\
+\xbe\x31\xb4\x7e\x57\xa7\x0d\x48\x20\x3c\xe8\xbc\xda\xb6\xbc\xfc\
+\xac\x4d\x2f\x64\xa5\xc0\xe5\xf2\x80\xe3\x88\x77\x43\x67\xf3\xfe\
+\xfb\xc0\x08\x24\x12\x8a\x0f\x4e\x21\x82\xbf\xe1\x76\xd3\x14\x6a\
+\xaf\x53\x43\xdc\x83\x71\x3d\xdd\xeb\xa3\xb7\xcd\x2b\x10\xd8\xb8\
+\xa1\xaa\x29\x31\x31\xa1\x2c\x33\x33\x05\x71\x0f\xa8\x21\x93\x05\
+\x61\x98\xcf\xb9\x46\x13\xe5\x4d\x1d\xff\x00\x15\x24\x82\x32\x98\
+\xc2\x17\x16\x19\xfa\x6d\x14\x96\xc9\xc5\x60\xcc\x4e\xc3\x89\xbc\
+\x38\xed\xbc\x02\x9f\xa4\x46\xc1\xb2\xec\xeb\x1c\xc7\x29\x85\x4c\
+\xf1\x9d\x1e\x89\x54\x92\x53\x57\x5b\x9c\x1e\xa1\x90\x23\x54\x02\
+\x7c\xc6\x88\x71\x92\x21\xe8\xdb\xff\x23\x14\xb1\x2a\x64\x95\x65\
+\x62\xcc\x68\x37\x9c\x2a\xd4\x68\xe7\x15\xfc\x17\x2f\x65\x57\xea\
+\xeb\x6b\x36\xd3\x5d\xe2\x68\x9c\xf8\xd3\x8d\xf3\x4d\xc7\x11\xf5\
+\xe8\x72\x6f\x2a\x9d\x36\x17\x32\x4a\x32\x30\xce\xfc\x6d\xe8\xdd\
+\x92\xa4\x5d\x94\x40\x20\xe3\xc3\xbe\x3f\xc2\x93\xe3\x93\x4e\xeb\
+\xba\x90\x90\xf6\x10\xc4\x62\xb1\xf7\x40\x08\x47\xd9\x6a\xb4\x22\
+\xbd\x30\x1d\x13\x46\x9b\xe1\x5c\xc5\x13\xda\x45\x09\x9e\x37\x8c\
+\x36\xab\xc2\xa8\xad\xa3\x97\xc7\x31\x63\x73\x78\x0f\x80\xf7\x6b\
+\xbe\x10\x0f\xc1\x5f\x03\x0c\x56\xe5\x3f\x85\xdb\xc6\x29\xc3\x85\
+\xca\x54\xed\x82\x05\x02\x6b\x5a\x06\xf5\xcb\x63\x42\x69\xf3\xe8\
+\x34\xec\xd3\x77\x21\x12\xfb\x3e\xf7\xde\x13\x0f\x87\xb1\xb3\x83\
+\x48\x7e\x39\x15\xd3\x8c\xd5\x70\xb9\xee\x69\xed\x82\x05\x02\xe9\
+\x8d\x57\xf4\x91\xd1\xa1\xf4\x8c\x83\xc5\xcc\x1d\xa7\x6f\x25\xf7\
+\x24\x1c\xe1\x30\x74\xec\x12\x92\xb2\x57\xc2\xca\x58\xda\x06\x1a\
+\xd6\xd2\x0b\x16\x08\xa4\xee\xbd\xa0\x57\xc5\x84\xd3\xe2\x90\x60\
+\x38\x1d\x1e\xff\x2c\x85\x15\xb1\x6e\x82\xab\x6d\x67\xf0\xf0\xfa\
+\x55\xb0\xdd\x34\x55\x2e\x4a\x20\x90\x52\x7d\x4e\xaf\x88\x51\xd0\
+\x8a\x78\xa5\xf7\xb7\x22\xdc\xfe\xd9\x7d\xf1\xf0\x12\xe3\xb5\x09\
+\x70\x13\x93\xf6\x45\x0b\x04\x92\x77\x9c\xd6\x87\xc6\x44\xd0\xb1\
+\x29\xf1\xe0\xdc\xac\xbf\x5d\xf0\x58\x79\x29\x73\xea\xda\xc2\xf7\
+\xe0\x7e\x1e\x29\xef\xd1\x4b\xa3\x54\xf4\x8a\x67\x34\x10\xcd\xf9\
+\xb5\x0f\x9a\x1d\x70\xfc\x7c\x65\xe9\x02\x81\xc4\xd2\x4e\xbd\x44\
+\x1d\x49\x2b\xd2\x34\x20\x1c\x07\x8b\xdd\x0d\xf7\xc5\x5b\x20\x66\
+\xb3\xee\x7f\x11\x08\xac\x28\x3c\xaa\xe3\x28\x6a\x1b\x17\x44\x85\
+\x11\xbb\x13\xc4\xe9\xd4\x99\x3a\xe8\x77\xff\x01\xe7\x03\xb1\x52\
+\xbf\xc1\xc9\xe9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x04\x8f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x56\x49\x44\x41\x54\x78\xda\x8d\xd5\x6b\x4c\x5b\x65\
+\x18\x07\xf0\xff\xe9\x69\xcb\x45\x2c\x13\x22\x0c\xb1\x46\x70\x8c\
+\x6b\x06\x48\xdb\x29\x88\x22\xc8\x14\xbb\x6e\xc8\x70\x41\x66\x46\
+\x34\xb2\x0f\x4c\x67\xdc\xbc\x90\xa8\x99\xc6\xc5\xe8\xcc\x12\x13\
+\x13\x3e\x2c\x63\xc3\x45\x97\xb9\xc9\x32\x66\xb9\x0c\x07\xa3\x63\
+\xa3\x32\xca\xb2\x21\xf7\x95\x16\x5a\x98\x5c\xdc\x86\x20\x6d\xe9\
+\xe5\xbc\xbe\x3d\x51\x92\x5a\xc2\xe9\xf9\xf4\xf4\x39\x4d\x7e\x79\
+\xde\xff\xfb\xbe\x87\xc1\xbf\xcf\xbe\xfd\x1f\x1c\xb3\xd9\x6c\x2f\
+\x11\x42\x62\xa5\xf0\x60\x4e\x59\x89\xbf\xa5\x11\x60\x08\x87\xb5\
+\x1e\xc2\x88\x10\xe6\xbc\x8b\xb8\x81\xd3\x70\x70\x0c\xed\x30\xf7\
+\x43\x42\x82\xf7\x1f\xfe\xea\x8b\x3a\xef\x7b\xe6\xbf\x3f\xaa\x35\
+\xaf\x58\xb4\x17\xce\xc9\xbd\xf5\x60\xdf\x2d\x1c\x32\x38\x91\xb4\
+\x29\x09\x1c\xb7\x36\x20\x12\x89\x30\xd2\x3f\x8a\xb2\x08\x2b\x34\
+\xdb\x8a\xf9\xde\xeb\x15\x6f\xdd\xff\xf1\x64\x6d\x84\x0f\x50\x52\
+\x5a\x46\xbe\x3f\x71\x0c\x0e\x87\x03\xfd\x37\x7b\x51\x33\x16\x86\
+\x84\x8c\x54\x70\x1e\xcf\xda\x00\xcb\xc2\x78\x6b\x10\xc5\x21\x46\
+\xbc\xa8\x56\x43\x22\x96\xa0\xea\xdd\xf7\xf0\x43\x5d\x2d\xe3\x07\
+\xa8\x54\x2a\xb8\x5c\x6e\x04\x8b\x08\xf4\xb2\x67\x10\x9f\x96\x04\
+\x22\x00\x30\x14\x30\x0d\x0c\x23\x7b\xe1\x2a\xec\x74\x89\xc4\x5e\
+\x70\x6c\x0c\xb5\x47\x6b\x7c\x01\xcd\xf6\x1d\x44\xa1\x50\x52\xc0\
+\x89\x10\x96\xc1\x6f\xeb\x9e\x85\x3c\x31\x29\xa0\x09\xac\x23\x14\
+\x58\xbc\x8a\x25\x17\x47\x01\x31\xc6\xc7\xcd\xa8\x3b\x7e\xd4\x17\
+\xc8\x2f\x2c\x22\x6d\xad\x4d\x7c\x6d\xd0\xeb\xf1\xc9\x95\x25\xc4\
+\x24\x26\x83\x70\x02\x13\x88\x58\xcc\xde\x1e\x46\x79\xd4\x14\x76\
+\x55\xec\xe6\x7b\xa5\x3b\x77\xa1\xfe\xec\x29\x7f\xa0\xfe\xec\x69\
+\x2c\x2f\x3b\x60\xe8\xd6\xe3\xdb\xdf\xa5\x78\xe8\x89\x94\x80\x80\
+\x79\xf3\x10\x4a\x64\x46\x94\xbc\x5a\x06\x89\x44\x82\xca\x3d\x55\
+\xab\x03\x4a\x95\x77\x89\x5c\x08\x66\x69\x06\xa1\xb9\x90\xca\x13\
+\x00\x01\x80\xae\x11\x9c\xd6\xdb\xc8\xb1\xd3\x0c\xdc\x00\x4b\x97\
+\x6c\xcc\x68\xf2\x07\x72\x9f\xcb\x23\x8a\x2c\x15\x9f\x41\xa8\x98\
+\x81\xfe\xc1\xe7\xe1\x5a\x1f\x07\x46\x60\x9b\x12\xba\x4d\x25\xd3\
+\x66\xe4\xd8\x74\x58\x5a\xe6\xc0\x8a\x59\x98\xcd\xe3\x68\x38\xff\
+\xb3\x2f\x90\xa5\x7c\x9a\x18\xae\x77\xf1\x75\x97\xee\x32\xde\x69\
+\x9a\x83\x3d\x7a\x03\x44\x02\x07\x8d\xa3\x07\xed\x81\x39\x13\x2a\
+\xe5\xd3\xd8\x53\xf5\x36\xdf\x2b\x28\x2c\x42\xfb\xa5\x16\x7f\xa0\
+\xf5\x62\x33\xec\x76\x3b\xba\x3b\x3b\x70\xb0\x87\x60\x72\x5d\x7c\
+\x40\xc0\x63\x0b\x13\xd8\x1d\x69\x42\x79\xc5\x9b\x90\xd2\x0c\x76\
+\x96\x95\xaf\x0e\x28\x14\x0a\xb8\xdd\xf4\x1c\xb0\x80\x2e\x28\x1b\
+\x13\xec\xc3\x01\x01\x8f\x7b\xe6\x90\xe7\xd4\xc3\xe6\x26\x7c\x06\
+\x46\xa3\xd1\x1f\xc8\x78\x52\x49\x32\x33\x33\xf9\x90\x43\x68\x06\
+\xfd\x11\x2f\x20\x3a\x31\x25\xa0\x83\x36\x33\x3a\x84\x4d\xf3\x6d\
+\xb0\x39\x39\x1e\x18\x37\x9b\xd1\x71\xf9\x92\x2f\xb0\x31\x31\x85\
+\x8c\x0c\x0f\xf0\x75\x7b\x4b\x33\x0e\x76\xcc\x63\xcb\x6b\xc5\x70\
+\x3b\x5d\x6b\x02\x62\xa9\x04\x6d\x67\x7e\x81\x46\x66\xc2\x81\x8f\
+\xaa\xf9\x9e\x6a\x73\x0e\x7a\xae\x77\xf9\x03\xd7\xae\x5d\xe1\x33\
+\xd0\xfd\xda\x8a\x9a\x81\x20\xe4\x95\x6e\xa3\x80\x53\x00\x90\xa2\
+\xf3\x9c\x16\x05\xd2\x7e\x54\x56\xed\x85\x94\xfe\x56\xab\xb7\xaf\
+\x0e\x78\x33\xf0\x2e\x51\x10\xbd\x8b\x8c\xb1\x5b\x91\xbd\xb5\x08\
+\x6e\x97\xc0\x04\x34\xd4\x2e\x6d\x0b\x12\xfe\x68\x84\x83\x9e\x03\
+\xb1\xd8\x9b\xc1\x98\x3f\x10\x17\xbf\x71\x25\x83\x60\x9a\x81\x59\
+\xae\x81\xb2\x48\x4d\x01\x81\x09\x24\x52\xf4\x34\x37\x62\xc3\x54\
+\x23\x96\x9c\x1e\x0a\x88\x61\xb1\x4c\xa0\xd7\xd0\xed\x0b\x3c\x2a\
+\x8f\x23\x56\x8b\x89\xaf\x9b\xb5\x0d\xf8\xf0\xc2\x0c\x32\xe9\xf5\
+\xeb\x11\x98\x80\xa5\x13\xf4\xd1\xcc\x76\x44\x5b\xf1\xe9\x67\x9f\
+\xf3\xbd\xd4\xb4\x74\x0c\x0e\xf4\xf9\x03\x37\x7a\xbb\x61\xb7\xd9\
+\xd1\xda\xa4\xc5\x11\x03\x90\x5c\xf8\x32\x38\x01\x40\x44\x81\xd1\
+\xf6\x8b\x28\x0a\x1d\xc2\xbe\x03\xef\xf3\x19\xe4\x17\x14\xae\x0e\
+\x64\x64\xa4\xaf\xdc\x45\xc3\x51\x1a\xc8\x73\x0b\xc0\xb9\x05\x00\
+\xfa\x81\xb1\x76\xb6\x21\xf9\xcf\x46\xd8\x5d\x84\x5f\x22\x33\xdd\
+\xa6\x7e\x40\xcc\x23\xb1\x24\x2d\x2d\x7d\xe5\x2e\x1a\x5a\xaf\x41\
+\xe4\x53\x05\x20\x02\x00\x43\x81\xbb\xdd\xed\x48\x9b\x6d\xc4\xe2\
+\xb2\x87\x0f\xd9\x3a\x69\xc1\xc8\xd0\xa0\x3f\x70\x67\x6a\x92\xaf\
+\x1b\xea\xcf\xa0\xf2\x27\x0b\xc2\x36\xe7\x03\x02\x00\x4d\x19\x76\
+\x83\x0e\x6f\xc8\x27\xf1\xe5\xe1\x23\x7c\x2b\x29\x25\xd5\x1f\x88\
+\x8a\x8e\x21\x33\xd3\x77\xf8\x5a\x7b\xbe\x1e\xe5\x27\x8d\x20\x59\
+\x14\xe0\xdc\x6b\x03\x22\x31\xc4\x37\x75\xd8\x1b\x3f\x83\x43\x5f\
+\x7f\xc3\xb7\x22\x23\xa3\xec\xf7\xee\xcd\x85\xfe\x1f\xa8\x5e\x58\
+\x58\xac\xe6\x08\x17\x1e\x2c\xe2\xc0\xe4\x7f\x8c\xbf\xa4\x51\x01\
+\x7d\x0f\xc2\x97\x67\x11\x7e\xe3\x3b\xba\x4d\x09\x18\x86\x71\xc8\
+\x64\xb2\x2a\x93\xc9\x78\xc2\xfb\xfa\x1f\x48\x5f\x06\x37\x7a\x51\
+\x6d\xcd\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x59\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x20\x49\x44\x41\x54\x78\xda\xa5\x55\x69\x6c\x54\x55\
+\x14\xfe\xee\x7b\x33\xd3\x99\xb6\x94\x2e\xce\x94\x2e\x50\x5a\xab\
+\xd0\x46\xa5\x2c\x05\x63\x2b\x88\x1a\xc5\x8d\x04\x13\x05\x6d\x8c\
+\x09\x6d\xe2\xf2\x07\x92\x9a\x12\xc3\xf6\x07\x12\x82\x4b\xea\x42\
+\x82\xd0\x44\x7f\x08\x01\x14\xd1\xa0\xb2\x8a\x21\x62\x40\xac\xac\
+\x29\x45\x3b\x52\xbb\x0c\x33\x1d\x3a\xd4\x29\x9d\xe9\x2c\xef\xbe\
+\xeb\xb9\xef\xbd\x4e\xdb\xa4\xfc\x40\xee\xe4\xe5\xce\xbd\xef\x9c\
+\xf3\x7d\xe7\x9c\xef\xde\xc7\x40\x23\x7b\x4b\x97\xaa\x38\xd5\x9f\
+\x16\x56\x3b\x16\x95\xa7\xab\xd0\x04\x6d\xea\x30\x86\x9c\x94\xd1\
+\xe5\xb8\xc1\xc9\xce\x4e\xb3\xa6\x0b\x63\xcd\xc8\x30\x1c\xe3\x38\
+\xdc\x1a\xbd\x1e\xe9\x4a\x2c\x8f\x34\xcf\x38\xc5\xe4\x8b\xf2\x5d\
+\xd7\x45\xc7\x8a\x7c\x44\x39\x10\x4b\x8e\x0f\x22\x83\xdb\x6d\x0a\
+\x18\x33\x03\x82\xe6\x34\x95\x82\x92\x6d\x22\xa9\x1b\xc0\x62\x8c\
+\xbd\x4a\x0e\xd9\x4e\x05\xcf\x1d\x0b\xe0\xe7\x03\xc1\x47\x99\xab\
+\xc9\xbb\xe5\xca\xba\xa2\x35\xa1\xa4\x1d\xde\x61\x2e\xfd\x0d\x07\
+\xc9\xc6\x4e\x0b\xdf\xb0\x8e\x23\xed\x03\x08\x06\x87\xe0\xf1\x64\
+\x1a\x41\xbc\x67\x7a\xa0\xa8\x02\x6b\xdf\x9a\x0d\xc4\x81\xa4\x40\
+\x2a\x47\xf9\x37\x97\x50\x96\x16\x39\x90\xb7\xe1\xea\x75\x56\xde\
+\xd2\xf5\xcf\x99\xba\xe2\x92\x23\x21\x0d\x36\xc5\x62\x4d\xb6\x14\
+\x17\xa7\xfd\x43\xe8\xe9\x8f\x63\xfb\x82\x1c\x14\xe5\x39\xc7\x65\
+\xe6\x0b\xc5\xf0\xd4\xa7\x17\xf1\x6e\xc3\x6c\x28\x5c\xc7\xd8\xc4\
+\x35\x7a\x66\xb8\x14\x7c\x72\xee\x06\xd8\x8c\x1d\x5d\xa2\xe5\xc5\
+\x02\x74\xc7\x04\x98\x55\x68\xc9\x22\xcd\x06\xec\xbe\xfa\x2f\xf6\
+\x2f\xf6\xe0\x76\x23\x05\xb2\x72\x36\x12\x5c\x03\x1f\x71\x96\x65\
+\xa5\x2c\x8e\xb6\x87\xc0\xca\xb7\x77\x8a\xe6\x65\x85\x08\xc7\xf5\
+\xd1\x46\xca\xe6\x51\x8d\xbe\xbc\x1c\x32\xd8\xcb\xb1\x95\xd8\x5c\
+\xe8\x89\x60\xf3\xa2\x3c\xd4\xde\xeb\x36\xf6\x62\xd1\x18\xaa\x3f\
+\x38\x8f\xa6\x95\x73\x31\x9c\xd0\x60\xb5\xc8\xa8\x56\x9a\x5d\xc1\
+\xd6\xe3\x01\xb0\x92\x66\xaf\x68\x7e\x65\x2a\x75\x5f\x4f\x35\xcb\
+\x54\x8e\x8e\x4b\xfe\x61\x74\x84\x12\xc6\xde\xd3\x95\x93\x61\x27\
+\x83\x03\x27\xba\x70\xb8\xbe\x62\x1c\x40\xe3\xca\x79\x18\x8a\x9a\
+\x76\x49\x0b\x24\x83\x1a\xd8\x7c\xac\x0f\x6c\xde\xde\x6e\xb1\xa6\
+\xc6\x8d\x01\x52\x84\x44\x18\xab\x08\x46\x59\xc4\xa8\xbe\xe9\x0a\
+\x35\x87\x94\x73\xe8\x62\x08\x1f\x3d\x92\x97\xea\xc7\x48\x89\xde\
+\x7c\xf5\x41\x52\x95\x30\x2b\x40\x01\x38\xfd\x32\x1d\x0c\x1f\x1f\
+\x0a\x82\x55\x7d\xd1\x25\x1a\x1f\xf7\x20\xaa\xe9\x06\x75\x6d\x24\
+\x0b\x4b\xdb\x9a\x21\x3d\x86\xce\xfe\x61\xdc\xea\x1b\xc4\xce\xa5\
+\xa5\xa6\x41\x22\x89\xe9\xab\x4f\x62\xd5\xea\x05\xe0\x24\x23\x3e\
+\x72\x36\x2c\x90\x0c\x02\xd8\xf6\x83\x1f\xec\x81\x96\x4e\xd1\xf8\
+\x84\x87\x32\xb0\x0e\x8b\x25\x7e\x95\x33\x49\xda\x78\x68\x81\x63\
+\x97\xfa\xf1\xf5\xb2\xd2\x54\x11\x6b\xb6\xb4\x62\xc9\xf3\xf7\x23\
+\xcb\xa6\x22\xce\xe5\x8e\x20\xb9\xea\x16\x39\xc0\xe9\x50\xf0\xd9\
+\x77\x3e\xb0\x99\xdb\xbc\x62\xf5\x33\x05\x18\x26\x15\x39\x18\x37\
+\x22\xfa\x49\xa3\x9d\xf4\xf4\x0e\x0a\x44\xc9\xda\xdb\x1a\x31\x1c\
+\x6f\xae\x9d\x6e\xcc\xee\xd7\x8e\xa3\xa4\x6e\x96\x49\x88\x88\x4d\
+\xc9\x61\x28\x71\xa9\x28\x76\xda\x10\x27\x9e\x09\xf2\x71\x10\xc0\
+\xe7\xfb\xba\x49\xa6\xcd\x7f\x8a\xa6\xa5\x05\xf8\x3b\xc2\x71\x36\
+\xc8\xd1\x33\x90\xa4\x7a\x2a\x46\x16\x8c\xea\xcf\xe8\x4f\xb0\x2d\
+\x8c\xb6\x55\x53\x53\xb5\xb7\xd7\x1e\x44\xc9\x3b\x35\xd0\xc2\x71\
+\x70\x6e\x8a\x42\xa7\x5a\x2a\xa4\x73\x8f\x5b\xc5\x9c\x42\x07\xca\
+\xb2\xed\xd8\xb9\xa7\x13\xac\x60\xfd\x65\x51\x5a\x53\x00\x5f\x30\
+\x01\x55\x65\xa9\xcb\x47\xe8\xa3\x0d\x0f\xff\x35\x08\xf4\x0f\x22\
+\xeb\x1e\x7a\x1f\xd1\xe0\xfb\x2d\x88\xc2\xb7\x17\x40\x1b\x8a\x9b\
+\xaa\xb6\xc4\x21\xb8\x59\x1e\x9d\xee\x91\xac\x7c\x27\x42\xdf\x5f\
+\x03\x9b\xf4\xc6\x39\x91\xb7\xb8\x08\x22\xc6\xc7\x1b\x4b\x20\xca\
+\x00\xa4\xa0\xe8\x8d\x28\x34\x6f\x08\x93\x32\x4c\x9b\xbe\x4b\x61\
+\xb8\x5f\xaf\x82\x3e\x94\x30\x98\x8f\xf5\x83\xa1\x15\xca\xdc\x66\
+\xc7\xad\xdd\x67\xc1\x32\xeb\x7f\x17\xb9\x8f\x15\x81\x53\xcd\x85\
+\xd5\xa4\x94\xb1\x8c\x47\xf7\x47\xe8\xa4\x0f\x89\x5d\xf3\x53\xf2\
+\xcd\x7e\xe1\x20\x44\x65\x19\x6c\x53\x26\x91\xf0\xa5\x9f\x99\xab\
+\xcc\x60\x44\xea\xcc\xae\x22\xb2\x9f\x00\xd2\x5f\xfe\x55\x64\x3f\
+\x5b\x0a\x4e\xa9\x43\xb7\xb4\xac\x8d\x01\x21\x89\x86\x4f\xf9\x91\
+\xfc\x6a\x14\x40\xf6\xc0\x3e\xb3\x18\x69\xe5\x39\x10\x09\x6e\x66\
+\x4c\xe4\x04\xb3\x74\x2d\xfd\x5d\x76\x24\x0e\x9c\x26\xa0\x39\x7b\
+\x02\x93\x1b\x16\xe6\x23\x4e\x47\x9d\x0e\x8b\xe0\xd6\x89\x16\xc2\
+\x64\x44\x7d\x89\x5f\x0b\xe1\x8f\x4d\xa5\xa8\x70\xe7\xa2\xfd\xc6\
+\x4d\x54\x56\xef\x41\x66\xdd\x93\x90\x11\x05\x46\x58\x73\x23\x63\
+\x21\x17\xe4\xa3\xcb\x5b\xf6\x9b\x6f\x77\x32\x5b\xc5\x0e\x37\xcb\
+\x98\x1c\x74\x2e\xa9\x82\x9a\xeb\x82\xa0\x2b\x5b\xa6\x2c\xe4\xc1\
+\x23\x55\x48\x10\xa1\xdb\xa0\x75\xdf\x44\x32\x30\x04\x91\x8c\xc1\
+\x39\x6b\x1a\xd5\xc9\x21\xbf\x34\x56\x29\x2d\x32\x56\xc6\x7a\xef\
+\x20\xf4\xf3\x17\x02\xbc\xad\xa1\x80\xa5\x3e\x2c\xa5\x1f\xee\x53\
+\x72\xf2\x5f\x52\xf2\x3d\x50\xf2\xb3\xa1\x16\x66\x51\x30\x0a\x40\
+\x3d\xd0\x07\x62\xd0\x3b\xfc\x54\x42\x6e\x29\x8b\xf6\x02\xa4\x71\
+\xa6\x42\x98\x5d\x1d\xed\x34\x51\x14\x91\xbe\xf7\x45\xef\xc6\x0d\
+\xa9\x83\x3b\x76\xb0\x69\x9b\xeb\xd5\xb2\xaa\x16\x75\x4e\x99\x91\
+\xbb\x3e\x98\x04\x3f\xfa\xa3\x8f\x28\x96\xe8\x3d\xeb\x38\xee\x70\
+\x4c\x00\xb0\xa9\x4a\x99\x5e\x75\x5e\x99\x7f\x1f\x44\x30\x02\x7e\
+\xe2\xd0\x65\xd1\xbb\xf6\xa1\x3b\x0d\x7c\x7b\x80\xa2\xf5\x73\x59\
+\xd9\xc3\xad\x70\xb9\xa0\x5f\xf9\x65\x2f\x7a\x37\xae\xf8\xbf\xc1\
+\x27\x04\x40\xe1\xba\x6a\x38\xf3\xce\x22\xe2\xdf\x87\xbe\xad\xcb\
+\xef\x26\xf8\xc4\x00\x53\x9a\x6a\xa9\xf6\x8d\x08\xbc\xb7\xec\x6e\
+\x83\xcb\xf1\x1f\xe9\xb1\x79\xc2\xdb\x07\xdb\x7b\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x73\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x3a\x49\x44\x41\x54\x78\xda\xa5\x95\x7b\x50\x13\x77\
+\x10\xc7\xf7\x2e\xb9\xbb\x5c\x12\x12\x12\x02\x26\x11\x02\x88\x22\
+\x14\x01\x41\xa9\x05\xb5\x28\x14\x15\x81\xd6\x4a\x67\x7c\xd4\x5a\
+\x9d\xd1\x89\x76\xa4\x75\xac\x8e\x76\x7c\x76\x28\x54\xea\xb4\x56\
+\xb0\x0a\xb5\x1d\x5b\x1f\x55\xac\xa8\x38\x13\x6d\xb5\x0c\xb6\x55\
+\x10\x81\x82\x29\x44\x1e\xf2\x50\xe4\x91\x84\x24\x10\x84\xbc\xef\
+\x7a\xe0\xe8\x40\x07\x95\x91\xfd\xef\xf6\xee\xfb\xfd\xcc\xde\xee\
+\x6f\x7f\x08\x8c\x21\xc2\x0a\x4d\x41\xe1\x12\x3c\x3b\x7e\x22\x91\
+\x80\xa1\x00\x75\x26\xa7\xa6\xb0\xc5\xb2\x4d\xbd\x44\x74\xe5\x65\
+\x5a\xe4\x65\x1f\x4c\x29\xe8\x0e\x4a\xf5\x27\xb3\xe3\x03\xb8\x09\
+\xc5\xbd\x00\xec\xc1\x1c\x09\xc0\x1a\x70\x36\x7c\x7e\xbb\xf7\x83\
+\xfa\x65\x92\x3b\xe3\x02\xec\x55\x5b\x36\x62\x24\x76\xa4\x97\x85\
+\xc2\xad\xfa\xbe\x62\x93\xd9\x5e\x19\x17\x26\xdc\x2a\x23\xd8\x94\
+\xa5\xd7\x7a\x22\x23\x82\xbb\x76\x5c\x80\x95\xa5\x7d\x9f\x49\x04\
+\x78\x26\x45\x21\xad\x66\x93\x75\x03\x17\x43\x1a\xf5\x2e\x44\x15\
+\x24\xe3\x04\xf5\x19\xad\xdf\x67\x47\xf1\x95\xe3\x02\x24\x14\xf5\
+\xbd\xe7\x21\xc4\xf2\x66\x4f\x20\xc4\xf8\x80\xe3\x51\x97\xcd\xa9\
+\x95\x0b\x39\x33\x4a\x7a\x5c\xd6\xd6\xce\xfe\xa3\xc5\x8b\xdc\xb7\
+\x8c\x0b\x30\x18\x51\x67\x75\x5f\x84\x4f\x17\xef\x94\xb2\x51\xe0\
+\x32\x4d\xbe\x6f\x71\x41\x53\x73\x6f\xe9\x9f\x29\x92\x98\x97\x69\
+\xc7\x04\x18\x8c\x80\x9c\x07\x9f\x84\x45\x48\xbe\x15\x70\xd9\x50\
+\x5e\xa9\xbb\xa0\x59\xef\x93\x3a\x16\xdd\x98\x01\x7e\x87\x1e\xa4\
+\xc4\x44\x7b\x9d\x23\x30\x94\xa3\xa9\x33\x65\x95\xad\x90\xee\x78\
+\x65\x00\x6f\x8b\x1a\x0d\x0f\x15\xef\x14\x79\x12\x4a\x31\x8e\xa4\
+\x9f\x5c\x20\xc9\x5b\x55\x64\x5c\xdc\xee\x40\xf2\x45\x6e\x18\xd7\
+\xda\x63\xcf\xb8\x92\x24\xde\x43\x6e\x2a\x8f\x4f\x48\xf4\x3b\x6c\
+\x34\x58\xab\x6f\xae\xf6\x59\x31\x66\x80\xf2\x0f\xc3\x77\x22\x0f\
+\xf2\x23\x1f\x09\x09\x76\x8b\x03\xba\xcd\x56\x40\x51\x04\xf4\x4e\
+\x16\xf4\x3a\x01\x26\x71\x68\x40\x9d\x14\x08\xdd\x30\xa0\xd8\x6c\
+\xb0\xd9\x9d\xf6\xca\x06\xe3\xf9\x4b\xef\xca\xdf\x1f\x13\x20\xfa\
+\x74\xfb\x11\x81\x07\x6f\x23\x57\x40\x00\x45\x33\x66\x2c\x04\x68\
+\x8a\x06\x9a\x31\xa5\x99\x67\x60\xce\x84\x8b\xc9\x51\x2e\x1a\x28\
+\x07\x05\x08\x4d\x53\x2e\xdd\xe3\x6b\xd7\x97\xcb\x13\xc7\x04\xf0\
+\xdc\x52\x35\xd9\x2b\x50\x94\x27\xf6\x11\xc4\x75\xdd\x33\x94\x77\
+\xfe\xab\x3d\xc9\x97\xf0\x22\x02\xe6\x28\x56\x73\x78\x18\xab\xb1\
+\xb4\xed\x2f\xc3\x3d\x6d\xbe\xd0\x47\x34\x57\x3e\x53\xbe\x7c\xc0\
+\x38\xd0\xae\xd5\x74\xa7\x18\x72\xa2\xaa\x46\x05\xb8\x6f\x28\x63\
+\x21\x24\x8b\x32\x1d\x9c\x49\x3f\xaf\x59\xf2\x1d\x77\x93\xfd\xe7\
+\x28\xf2\xd9\x1c\x94\xd3\x56\xd5\x95\xd9\xbc\x6d\xea\xee\x17\x35\
+\x97\x7c\x47\x85\x5a\x0a\x93\xa8\x21\xc0\xe2\x5f\x3b\xe8\xba\x06\
+\xd3\xdf\x31\xa1\xa2\xb5\xa7\xde\x96\x37\x8d\x26\x08\xce\x7b\x98\
+\xc2\x11\xe0\xa7\x59\x6c\xd4\x4d\xa7\xd6\xab\x1e\xa6\x87\x24\x8f\
+\xea\x3c\xff\x82\x47\xe0\x82\xe0\xe3\x7e\x13\xc9\x94\x6b\xab\xfd\
+\x90\x21\xc0\x8c\x53\xed\xf4\x82\x69\x62\x10\x33\x4b\xec\x9c\xaa\
+\xb5\xb8\xa3\xdb\x96\xd6\x9e\x39\xbd\x76\xb8\xce\x7b\x6f\x8d\x92\
+\x2f\x77\xcb\x25\xdc\x09\xd0\x55\x6b\x55\x9d\x5f\x86\x3f\x03\x60\
+\x6f\x15\x60\x38\x8f\x58\xf4\xfa\x92\xd0\xec\xd8\x30\x91\x1f\xc5\
+\x27\xe1\xd4\xa5\x66\x68\xde\x3e\xf5\x09\xc0\x37\xb3\xa1\x95\xeb\
+\x2d\xf0\xc5\x05\x38\x24\x85\x08\xa0\x45\xa3\x87\xd2\xaa\xee\x4f\
+\x5b\xf7\x85\x7e\xf3\xd4\x44\xb6\xfd\xae\x92\x37\x51\x90\x8b\x8b\
+\x48\x30\xfc\xd3\xa1\xd2\x1e\x8c\x7c\x06\x88\x38\x50\x13\x48\x90\
+\x58\xbd\xff\x2c\x5f\x28\xad\xeb\x01\x70\xd1\x54\x7f\xad\xf6\xba\
+\xfe\xc0\xf4\x45\x43\x80\x09\x69\xe5\x87\x45\xe1\xd2\x54\x8e\x27\
+\x5f\xda\xa7\xb7\x82\xa1\xac\x69\x57\xcf\xb1\x39\x19\xc3\x2b\x98\
+\xb0\xb9\x42\x49\xc8\x98\x0a\xa4\x42\xe8\x6f\x31\xa9\x3a\xf6\x05\
+\x8f\xf8\x45\x64\xe2\xc5\x29\xc2\xb9\xa1\x0d\x84\x94\x0f\x34\x82\
+\x38\xf4\xf9\xb7\xb6\x59\x7e\x5b\x7a\x68\x08\xc0\x4b\xbe\xac\x10\
+\xbc\x31\xf9\xf8\xa4\x18\x45\x5c\x7f\xf5\xa3\x1b\x0d\xd7\xeb\xd2\
+\x06\xae\x2e\xa9\x19\x6e\xe0\xb5\x5d\xad\xc4\x3c\x78\xb9\x6c\xa6\
+\x02\x6b\x67\xaf\x4a\xbb\x67\x24\x80\x15\xf5\x93\x50\x3e\xcb\x7f\
+\x3f\x39\x2f\x64\x83\xae\x5c\x6b\xe9\xc9\x0a\xe1\x8e\x18\x53\xd1\
+\xba\x9b\x07\xa8\x50\xc5\xe6\xd4\x18\x09\x5b\x53\x50\xb5\xf3\xf6\
+\xfe\xd9\x99\x23\x00\xfb\xea\x94\x28\x1f\xcf\x45\x70\x16\xd8\xb4\
+\x7d\x2a\x63\xc6\xb4\x11\x00\xde\xfc\x33\xb3\x16\xee\x4a\xbc\xfd\
+\xfb\xdd\x3e\x07\x55\xde\xf4\x8b\xe5\xcc\xbc\x35\x23\x00\x9c\xe8\
+\x13\x3c\x4e\x54\xf0\x65\x62\x86\x22\x2e\x29\x84\x0f\xf5\x67\x2a\
+\xd2\x6f\x7d\x1d\xbb\xe7\xe9\x7b\xfe\x0e\xb5\x12\x17\x92\xb9\xc0\
+\xc1\xc0\xde\x65\x56\x3d\xce\x0a\x7b\x06\x70\x8f\x3d\x1e\x9b\x9c\
+\x9e\x7a\xa3\x50\x6d\x06\x47\x55\x9b\xd1\xfa\x63\xb4\xc7\xa8\x07\
+\x8d\x9b\x78\x69\x19\x15\x16\xf0\x95\x2c\x52\xae\x88\xf3\x27\xa0\
+\xe6\x62\x75\x61\xa3\xde\x96\x66\xfc\x21\xbe\x0d\x5d\x59\xac\xe4\
+\x05\x7b\xe7\x22\x04\x1b\x2c\x8d\x5d\x2a\xc7\xb1\xe8\xe4\xc0\xdd\
+\x65\x1c\x53\x9d\x76\xdd\xbc\x75\x31\x39\x57\x9b\xec\x4c\x5e\x67\
+\xa4\xcb\x6b\x16\x52\x37\x57\x55\x8c\x0a\x18\xaa\x64\xf1\xe5\x35\
+\x0e\x7f\x59\x16\x16\xe2\xed\xb5\x34\x92\x0f\x02\x87\x1d\x0a\xce\
+\x37\x5c\xd5\x77\x0c\x98\xd1\x49\xb2\x65\x83\x15\x50\xf7\xbb\x6a\
+\xdd\x50\x5b\x51\x44\x9c\xef\xc7\xa2\x00\x4f\x28\x2c\x61\x26\xe7\
+\xa1\xb1\x1b\x2a\x2a\x97\xc3\x9d\xf5\x45\xc3\xfd\x46\x5d\x15\xec\
+\xf9\x67\x63\x29\xa9\x24\x87\xf2\x57\x84\x92\x32\x12\x66\xbe\xc6\
+\x07\x85\x08\x87\x2e\x93\x03\x9c\xcc\x2e\x12\x30\xb7\x8e\xa9\x9f\
+\x86\x2a\x8d\x99\x99\x28\x33\x40\x4b\xdb\x7d\x68\xac\x7d\x13\x34\
+\x5b\x3b\xff\xef\xf5\xe2\xfb\x20\xf2\x68\x34\x48\xe5\x9b\xc0\xdd\
+\x7d\x21\x60\xb8\x07\xb0\x90\x27\x12\x17\xb3\x52\x6d\x36\x03\x3c\
+\x1e\xf8\x19\x8c\x86\x02\x28\xf9\xb0\xe4\x79\x16\xff\x01\xef\xcc\
+\x16\x37\xc4\x30\xf9\xbe\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x06\x15\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xdc\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x6c\x14\x55\
+\x14\xfe\x66\x77\x76\xdb\x2d\x7d\xd1\xa5\x85\x02\xdb\x76\x4b\x1f\
+\x54\x81\xf2\xaa\x01\x21\x14\xd0\xb6\xf0\x03\x11\x0c\x88\x11\x7f\
+\x18\x63\x82\x45\x11\x82\x89\x24\x04\xff\x69\x94\x3f\x44\x09\x8f\
+\x84\x18\xfd\x43\x78\x05\x23\xd6\x20\x0f\x43\x4b\x78\x83\xd0\x17\
+\x7d\xd0\xd2\x2e\xa5\x4f\xda\x6d\x0b\x6d\xf7\x39\x33\xf7\x7a\xee\
+\x9d\x65\xc5\x20\x32\xcd\xec\x4c\xee\xcc\xfd\xce\xf9\xce\xf7\x9d\
+\x33\x55\xf0\x3f\xc7\x97\x95\xde\x62\x83\x61\x83\x4d\x55\xca\x9c\
+\x0e\xd5\xfd\x74\x5d\x51\x80\x41\x9f\xee\x09\x33\x7e\xd6\x0a\x7e\
+\xf4\xbb\xe5\xa9\x17\x5f\x84\xa1\xfc\x37\xf0\x40\xa1\x05\xca\xad\
+\xfc\x89\x0e\x5b\x5e\x6a\x1c\x92\x1c\x40\x50\x07\xfc\xba\xf9\x9c\
+\xd3\x19\x6f\xa7\xb5\x20\xd0\xd4\xe7\x43\x5b\xff\x98\xa6\x73\x5e\
+\xb4\xbb\x24\xbd\xf6\xa5\x01\xbe\x38\xf7\x68\x5f\x46\x4a\x6c\xf9\
+\xf2\xfc\x44\x09\xda\x1f\xe0\x18\x09\x73\xf9\x22\x8f\xa0\xf3\x67\
+\x76\x27\xa8\x0a\x9c\x71\x0a\x6e\xb6\x0e\xe1\xc1\x90\x7f\xff\x9e\
+\x95\xae\xcd\x2f\x0c\xb0\xf5\x74\xef\xb1\xc5\x39\x89\xeb\xa7\x4f\
+\x8e\x43\xaf\x8f\xc3\x4b\xe0\x16\xfe\xcc\x5b\x9c\x45\xdf\x65\x91\
+\x1f\x26\x02\x72\x8e\xe4\x58\x2b\x7c\x63\x01\x5c\x6e\xf1\x1e\xdf\
+\xbb\x3a\xeb\xdd\xe7\x02\x6c\xa9\xe8\xdc\xb7\x38\xd7\x59\x5e\x30\
+\xd5\x81\x7b\x83\x0c\x1a\x6d\xb6\x98\x30\x51\x30\x44\x59\x70\x3c\
+\xb3\x24\x17\x19\xfd\xc4\x58\x14\x78\x87\xfd\x68\xe9\x1c\xde\xff\
+\xfd\x1a\xf7\xe6\x68\x80\xad\x15\x1d\x85\x53\x52\xe2\x6a\x56\x16\
+\x4e\x40\x93\x97\xc0\x29\x53\x85\x99\x6a\xd2\x1e\x99\x21\xa7\x54\
+\x8d\x08\x98\x22\x54\x26\x6a\x0a\x57\x60\x30\x06\x83\x9b\x41\xc5\
+\x45\x55\xac\x68\x79\xf0\x08\x4f\x46\x03\xb3\x7f\x78\x27\xb7\x56\
+\x06\xd8\x76\xca\x13\xfe\x70\x69\x96\xad\x7b\x84\x61\x30\x68\x98\
+\xa0\x04\x62\xb7\xab\xa8\xae\x6e\xc5\xc4\x49\x4e\xa4\xa5\x26\x41\
+\xd3\x0c\xe9\x20\xc5\x6a\x41\x67\xc7\x00\x82\xe1\x10\xf2\x72\x32\
+\x10\xd2\x74\x4a\x80\xc9\x00\x32\x38\xdd\xd4\x34\x74\x68\x7b\xd7\
+\xe5\xdb\x95\xcd\x27\xef\x17\xcf\x74\x8d\xaf\x9a\x33\x2d\x05\xcd\
+\xde\x30\xac\x84\x2e\x72\xb1\x59\xad\xb8\x72\xa3\x11\xcd\xb5\x1e\
+\x18\xba\x8e\xb5\xef\xbf\x89\x78\x47\xac\x0c\x30\x30\x38\x82\x3f\
+\x7e\xbd\x0c\x0b\xbd\x3b\x63\x7e\x2e\x66\xcd\xcc\x85\xae\x6b\xb2\
+\x72\x82\xb8\x95\xce\xce\xde\xc7\x18\xe8\x7f\xb2\x54\xf9\xf8\x70\
+\xf3\x81\x8d\xcb\xa6\x6d\x1a\x24\xa7\x8c\x86\x38\x78\xc4\x23\xb6\
+\x18\x1b\x7e\x39\x71\x09\xa1\x31\x3f\x18\x65\x37\xbd\x30\x07\xb3\
+\x0b\xb3\x25\x42\x5d\x43\x1b\x05\x6e\x97\xd9\x26\x39\x93\xf0\x46\
+\xe9\x3c\xb2\xac\x2e\x77\x4a\x16\x54\xba\xa0\xa6\xa1\xa9\xf1\xe1\
+\x41\xe5\x93\xa3\xcd\xed\x9b\x56\xe4\xbb\x6f\x76\x07\xa1\x52\x46\
+\x8c\xd2\x10\x59\xc6\xc6\xd8\x71\xf2\x44\x15\xb8\x6e\x48\xfa\xae\
+\xbc\x4c\x64\xe5\x67\x42\xf0\xab\xad\x69\xc5\xf5\xaa\x7a\x24\x25\
+\x8f\x43\xa2\x33\x01\x25\xab\x16\xc1\x6e\x18\x88\x57\x21\xcd\xa1\
+\x4b\x2d\x2c\xa8\xad\x6d\xf3\x28\xbb\x7e\x6f\xe7\x2b\x8a\xb2\xd0\
+\xe8\x0d\xca\x45\x8b\x05\x08\x84\x0c\x0c\x90\x72\x27\x0e\x5f\x42\
+\xfd\xe5\x3b\xe0\x43\x23\x58\xf8\xd9\x46\xa4\x67\x4d\x24\x06\x0a\
+\x9a\x6e\xdf\x43\xd3\xc9\xd3\xd2\x04\x53\x96\x2c\xc6\xdc\x92\x79\
+\xd0\x42\x61\x59\x9e\xf1\x0e\x2b\x12\x62\x2c\xd4\x1b\x76\x3c\xe9\
+\xee\x81\xb2\xab\xa2\x95\x2f\x26\xea\x2d\xc3\x41\x78\x86\xc3\xe8\
+\x1d\xd3\x89\x1e\x93\x5a\x08\xd9\x6e\x9f\xfd\x0b\x69\x59\x69\x70\
+\x17\x64\x43\x0f\x12\x08\x81\xaa\x76\x2b\x6a\x2e\xd5\x49\x0b\xe6\
+\xcd\x9f\x2e\x59\x8b\x32\x8a\x00\xdc\x10\x6e\xa3\x42\x59\x54\x34\
+\x5f\xac\x81\xf2\xc1\x8f\x75\xbc\x60\x8e\x1b\x57\x3c\x3e\xd8\x85\
+\x43\x22\x8d\x25\xad\x49\xb5\x54\x54\x92\x8c\xe8\x0b\x3b\x32\x26\
+\x14\xa2\xab\x58\x17\x66\x60\xe2\x11\x83\xce\xcc\x8e\x30\xed\x6c\
+\x7a\xd9\xa2\xaa\x68\xb9\x78\x07\x4a\xc1\xf6\x3f\xf9\x9a\xb5\xaf\
+\xe1\x6e\xe7\x18\xd9\x8f\x36\x71\x16\x15\x4b\xdc\x1b\xcc\x0c\x28\
+\xac\xc9\xb9\x45\x9a\x40\x04\x12\xa7\x41\x81\x45\x13\x08\x60\x46\
+\x2f\x72\xc5\xec\x41\x1e\x09\xd0\x56\x55\x0d\xc5\xf9\xde\x91\xf6\
+\x5d\x3b\x56\xbb\xcf\x34\x0e\x51\x59\xb8\x04\x8c\x66\x42\x82\xa8\
+\x31\x2a\x06\xfb\x1e\xa3\xbb\xae\x15\x63\x8f\x47\x64\xff\xc6\x27\
+\x27\x21\x61\x62\x2a\xd2\x0b\x32\xa0\x05\x35\x02\xd7\xa5\xb0\xa2\
+\x19\xc5\x3e\x71\x55\xc8\x24\x6d\xbf\x5d\xf0\x28\x09\x6f\xfd\x7c\
+\x60\xcb\xb6\xb2\x4d\x57\x3b\x35\xc2\xe3\x66\x06\xa2\x83\x55\x0b\
+\x46\xbc\x63\xa8\xaf\xb8\x80\x60\x47\x07\x62\x32\xb3\xe0\xcc\x98\
+\x2a\x6b\xf8\xa4\xaf\x1f\xbe\xce\x2e\xe1\x65\xe4\x94\x16\xc3\x99\
+\x95\x0e\x2d\xac\xcb\x59\xc5\x22\x5d\x1d\xf4\x87\xd0\x53\x79\xe5\
+\xa0\x92\xb4\xea\xa7\xe2\x57\x8b\x72\xab\x26\xcf\xca\xc6\x00\x09\
+\xad\x88\x7a\x50\x7d\x3b\x9b\x3c\x68\x3b\x75\x06\xe3\x72\x73\x31\
+\x7b\x6d\x09\xa8\x3a\x60\x3a\x93\x22\x32\x2a\x17\xa8\xab\x1f\xde\
+\xac\xc7\xa3\x6b\xd7\xe0\x2a\x2d\x85\x33\xcf\x05\x3d\xa4\x4b\xf6\
+\x20\xdd\x06\xef\x12\xe3\x87\x5d\x4b\xe5\xa8\x48\x5e\x75\x28\xfc\
+\xd1\xf6\x35\xb6\x4b\xad\xc3\xd2\xaa\x21\xa2\x7d\xfb\xd0\x11\xb8\
+\x96\x2c\x84\x6b\xee\x2b\x08\x05\x42\xa6\x36\xa2\x53\xa5\xd8\xa6\
+\x2e\x56\x9b\x0d\xfd\xcd\x1d\xe8\x39\x7f\x0e\x93\x57\x94\x20\x71\
+\xea\x64\x53\x17\xc2\xe8\x3a\x5f\xa9\x05\xce\x7d\x6a\x97\x01\xe2\
+\xcb\x0e\x16\x66\x64\xa7\xd7\x64\x2e\x2b\x42\xdf\xa0\x1f\xfd\x0d\
+\xf7\x31\x74\xff\x01\x66\xac\x5b\x09\xcd\x1f\x90\x4e\xe1\x91\xb1\
+\x2c\x2a\x20\x47\x34\x93\x53\x0f\x8c\xd8\x8e\x3e\x20\xbf\x3b\x62\
+\x10\x9b\x92\x4c\xec\x14\x0c\x5f\xab\x46\x68\x68\x68\x76\xa8\xf2\
+\xf3\xda\xe8\xb8\x56\x97\xec\xd9\xb7\xf4\xed\x85\xe5\xc3\x09\x69\
+\x08\x13\x03\x0b\x6d\x36\x68\x88\x09\x8f\x1b\x91\x21\x23\xb2\x37\
+\x22\xe3\xda\x5c\x8a\x8c\x73\x71\x4f\x0f\x18\x95\x26\xd0\xde\x81\
+\xd1\x86\x86\xfd\xc6\xd5\x1d\xff\x8c\xeb\xa7\x87\x65\xd1\xee\x63\
+\xee\x05\xf3\xd6\xdb\xdd\x2e\x30\x0a\xa2\x13\x5d\x1e\xf9\x8c\x49\
+\x90\x88\x85\x4d\x9b\x9a\x8c\x64\x73\x89\x55\xd5\x86\xc0\x7d\x0f\
+\x7c\x8d\x0d\xc7\xf9\x8d\x9d\xcf\x7f\x70\xa2\x41\x5e\xff\x76\x9f\
+\x63\xc2\xa4\xf2\xd4\x45\x73\x49\x58\x2a\x01\xb9\xc3\xe0\xa6\xef\
+\x05\x8e\xc1\xcd\xfe\x10\x9e\x37\xfb\xcb\x0a\x83\x3e\x1e\xfe\x5b\
+\x77\xa0\x7b\xfb\xf6\xe3\xe6\x57\x2f\xfe\x64\x46\x8f\x85\xdf\x14\
+\xd2\xa3\x5b\x71\x19\x99\xb6\xd8\xcc\x4c\xa8\x49\x09\x52\x3c\x39\
+\x6b\xa9\x14\xba\x68\x3c\xfa\xd3\x86\x47\xa1\x75\x75\x40\xef\xe9\
+\xa2\x59\xcd\x8a\x70\x7d\xe7\xcb\x3f\xfa\xff\x3a\x16\x7c\x5d\x4c\
+\xc8\x1b\x60\xb3\x95\x59\x13\x93\xdd\x62\x54\xca\x8a\x51\x2f\x30\
+\xdf\xa8\x07\xba\x76\x16\x56\xeb\x51\x02\x7e\xe1\xbf\x2d\x7f\x03\
+\x3a\x5f\x24\x87\xb2\x8e\xb8\x5c\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x06\xc3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x8a\x49\x44\x41\x54\x78\xda\x7d\x95\x09\x70\x53\xd5\
+\x1a\xc7\xff\x37\x37\x69\x9a\x92\xa4\x89\x4d\x37\x4a\x13\x08\xb4\
+\xa2\x40\x61\xd8\x0a\x2e\xb8\x8c\xd4\x15\x50\x40\x9f\x4f\x06\x9e\
+\x83\xef\x51\xc5\x4a\xc5\xd7\xd2\x3a\x3e\xbb\x60\x65\x7f\xb2\x8d\
+\xf3\x9c\x8a\xd8\x82\xe2\x1b\xb0\x33\x6f\xab\x08\x38\x76\x7c\x6a\
+\x4b\x59\x94\x42\x41\xa6\x95\xd2\x34\x62\x97\xb4\xd9\x73\x73\x93\
+\xbb\x1c\x4f\x6f\x4a\x29\x16\x3d\x33\xdf\xdc\xe4\x9c\x7b\xff\xbf\
+\x73\xce\xb7\x31\x18\x31\xaa\xf6\xee\x23\x4b\x3e\x7f\x7f\x87\xdd\
+\x17\x5c\x26\xb9\xa2\x13\xe0\x8d\xd2\x59\xe6\x03\x63\x6f\xe7\x9f\
+\x71\x8b\x11\x5a\x3a\x6f\x9f\x2a\x35\xe5\x05\xc6\x36\x01\x0c\x83\
+\xab\x1d\xed\x9d\x75\x1f\x64\x3d\x58\xb4\xa3\xa4\x90\xb9\xfe\xce\
+\xf0\x8f\xc8\xbb\xe5\xcf\xb0\x67\xbf\x3d\x20\xfa\x82\x5a\xd1\x1f\
+\x86\xec\xe2\x81\x5e\x6a\xb2\xf2\xca\x0e\x0a\x29\x1e\x29\x1e\x78\
+\x74\xfa\x76\x36\x39\xa5\x88\x9d\x3e\x13\xb2\xdf\x0d\xe2\xec\x84\
+\x2a\xc4\x81\xf5\x07\x23\x11\x5e\x5a\xa5\x6f\x68\x3d\x3c\x0c\x08\
+\xe7\x3f\xf1\x47\xd5\xc4\xec\x43\xd2\xa5\x73\x20\xa1\x08\x64\x6f\
+\x10\xe4\x3a\x40\x24\xe7\x89\x4c\xd6\x24\x0e\x38\x9b\x6f\x02\xe4\
+\x66\xe7\xaa\xf3\x1e\xac\x66\xd4\xea\x1c\xe9\xe2\x59\xaa\xc4\x82\
+\x44\x04\x10\x8e\x07\xf1\x0a\x80\x57\x78\xce\xd8\xd6\xfe\x89\x02\
+\x08\xe5\x3f\x45\xd8\x8c\x71\x90\xce\x35\x83\x08\x32\x18\x8f\x72\
+\x02\x0f\xe9\x0e\x7d\x0d\xb3\x3e\x5d\x7d\x67\xe6\x1c\x66\x52\x06\
+\x98\x78\xad\x22\x4e\xf8\x08\xc8\x65\x27\xc4\x96\xce\xd3\x4c\xfa\
+\x98\x6e\xd6\x1a\x7f\x2f\x08\xcc\x72\x54\xa2\x1b\x14\x41\x7c\x14\
+\xe0\x8b\xc2\xe8\xec\x64\x62\x80\xa5\xf7\x13\xd5\x9d\x53\x21\x5d\
+\xfc\x1e\xcc\x80\x9b\x77\x6a\x52\x9d\x4c\xb7\x27\xcb\xb6\x78\x3e\
+\x7c\xcf\xfc\x45\x11\x95\x12\xf4\x50\x7b\xfb\x6f\xf2\x41\xdc\x80\
+\x13\xda\x86\x06\x38\x3f\x6b\x42\x28\x79\x4c\x7b\x56\xd8\x93\x29\
+\x73\x72\xfc\x20\x84\xe1\x64\xd0\x6b\x8d\x01\x7c\xd3\xb2\x49\xdc\
+\x5d\xb9\x01\x68\x35\x55\xdc\xfe\xfa\x2b\xda\x19\x13\x0e\xa2\x38\
+\x5f\xe7\x1f\x3f\x0b\xba\xab\x2d\xd0\xd1\xab\x53\x5d\xb9\x06\x96\
+\xa8\xc0\xa8\x28\x4c\x45\x20\x4f\xc8\x40\xf8\x8e\x19\x50\x33\x02\
+\xd4\x4d\xcd\x10\xbf\x39\x17\x8e\x5c\x70\xac\xd4\x98\x74\x13\x19\
+\x5e\xfe\x1b\x01\x0c\xc3\x80\x91\xc3\x37\x7f\x2e\x11\xb7\x55\x41\
+\x96\x18\x18\x8e\x1d\x01\x61\x93\xd0\xb5\x76\x1d\x4c\x6a\x0d\xbe\
+\x68\x6a\xc4\xfb\xdb\xb6\xa1\xba\xf6\x20\xbc\x41\x3f\x3a\x3b\x1d\
+\x78\xf2\xcc\x67\xf0\x2d\x5c\x06\xc3\xd1\x3a\x44\xfe\xff\x3d\xf8\
+\x8b\x5d\x49\xa9\xbe\x6e\xf7\xa8\x28\x1a\x1c\xfd\xd3\x72\x38\xf5\
+\xa6\x0d\x3a\x31\xce\x88\x84\x7f\x1e\x80\xf4\xf4\x1a\xfc\x3c\x63\
+\x1a\x76\x97\xbd\x89\xaa\x1d\x7f\xc7\x97\x27\xbe\xc0\x3d\x0b\x16\
+\x20\xc8\x71\x70\xfb\xbc\xd8\xf0\xf2\xcb\xd8\xf7\xec\x4a\x58\xcf\
+\x37\xc0\xff\xf4\x0a\xe8\xbf\xac\x47\xb0\xbe\x31\x6c\xb9\x70\x3e\
+\x61\x14\xa0\x2b\xc1\x52\x99\x54\xf6\xa7\xb2\x50\xee\x23\x30\xfe\
+\xbb\x06\x58\xb4\x06\xfc\xdc\x99\x50\x8d\xd8\xc3\xf1\xcf\x8f\xc5\
+\x00\xc1\x20\xdc\x3c\x3f\x3c\xaf\xfb\xfa\x24\x26\xb7\x35\x20\x72\
+\xdf\x03\x60\x5a\x5b\x30\xf0\xf6\xa1\x8d\x56\xae\xaf\xfc\x26\x40\
+\xef\xbc\xb9\x7e\xf5\xa6\xb7\x0c\x09\xa7\x8e\x43\x12\x92\xb0\xc1\
+\xd1\x81\x2d\xef\xec\x8c\xe5\x48\x94\x86\x2e\xbd\xd4\xba\xc3\x47\
+\xb0\x74\xf9\x72\x04\x43\x21\xf0\xf4\x14\x92\x2c\x2b\xeb\x85\x2f\
+\xbd\x88\xda\xd9\xf3\x90\x96\xc1\x80\xcb\xce\x41\x74\xcb\x9e\x40\
+\xea\xc9\xd3\xc6\x61\x40\x9b\x69\xac\xdd\x32\x3d\xf9\x8a\x58\xf0\
+\x57\xe8\x4e\x1c\x85\xb6\x72\x17\x38\x7d\xec\x94\xd4\x9f\x08\xf3\
+\x61\xea\x5c\x16\x87\x0e\x1e\xc4\xb3\xcf\xad\x40\x88\x8a\x73\xf4\
+\x14\x82\x48\xa3\x65\xc8\x8d\xd1\x9f\x7b\x90\xf3\x9f\x5a\xa8\xec\
+\x63\xc1\x35\x7e\x07\x57\xc3\xa5\x89\xd9\xbe\xee\x0e\x65\xf5\xa2\
+\x31\x75\x7d\xf2\x23\xb3\xdf\x51\xdb\x52\x21\x7c\x75\x0a\x29\xcd\
+\x17\x40\xa8\x30\xc7\x85\x20\x08\x22\x15\x12\xc0\xb2\x6a\x6c\xae\
+\xaa\x42\x51\x49\xa9\x02\x90\xa9\x78\x54\x10\x20\x0c\x9d\x82\xd0\
+\xff\x99\xa5\x05\x60\x67\x4d\x81\xd0\xe6\x80\xeb\xd8\xd9\xd7\xa6\
+\xf8\x7b\x77\x2a\x80\xf3\xfa\x94\x4a\xdb\x9a\x87\xcb\x58\xc7\x15\
+\x84\xd9\x71\x48\xd8\x5f\x73\x23\x63\x29\x44\xa4\x42\x71\x1a\x2d\
+\x1e\x7a\xe0\x3e\x65\xee\x36\x93\x09\x1a\xad\x16\x63\x69\x72\x9a\
+\x4d\x89\x78\x3e\xff\x45\x65\x5e\x5d\xb0\x16\x76\x0b\x85\x5a\xed\
+\x70\x54\x1f\xdb\x98\x13\xec\x2b\x57\x00\x67\xf5\xc9\x95\x93\x97\
+\xcf\x2e\x43\x8f\x13\xa1\x9c\xc7\x50\xe1\x76\x63\xfb\x9e\x3d\x31\
+\x80\x3f\x40\x7d\x10\x85\x8a\x65\xf1\x78\x5e\xde\x2d\x01\x8f\x2e\
+\x5e\x82\xcd\x15\xe5\xd8\x9b\x95\x8d\x49\x7d\x67\x20\xa7\x64\xe0\
+\xf2\xa7\x67\x36\xce\x0a\xba\x62\x80\x66\x63\x5a\x61\xd6\x4c\xcb\
+\x2e\xad\x9a\xa0\xe7\xfe\x15\xb0\xbf\xf1\x7a\x2c\x27\xfc\x7e\xf0\
+\x61\x5e\x01\x0c\xde\xb7\x8a\xfa\x41\x92\x24\x44\x23\x11\xea\x17\
+\x3a\x4f\x8d\xa7\x65\x43\x94\x44\xf8\x45\x09\xd3\x4e\x36\xc2\xda\
+\xf4\x29\x78\x5a\x84\xdb\xbf\xeb\x7f\x35\xd7\xdf\xb3\x5b\x01\x34\
+\x9a\x52\xe7\x5a\xed\xe6\x66\x73\xa2\x0a\x7d\xf6\xd9\x18\xff\x8f\
+\x0f\x63\x80\x70\x70\x18\x10\x55\x4c\x50\x9e\x82\x70\xe3\xa9\x14\
+\xcb\x08\x8f\x90\xc7\x8f\xbb\xbf\x3a\x8a\xc4\xcb\x4d\xf0\xf8\x64\
+\x74\x75\x78\x72\xef\xf2\xf6\x9e\x1a\x0e\xd3\x1f\xec\x36\x62\xb3\
+\xea\x21\x1a\x92\x10\x5f\x7d\x04\xaf\xbe\xf9\x06\x2a\x36\x6d\x56\
+\xd6\x78\xba\xe3\x08\xb5\x5f\x03\xe4\x21\x07\x97\x95\x96\x60\x43\
+\x61\x31\x16\x7c\xbc\x13\x2a\x9f\x0b\x8e\xae\x20\xee\xe8\x70\x30\
+\x37\xe5\xc1\x09\xbd\xa5\x62\xce\xd4\xe4\xf2\x38\x21\x8a\xae\xc5\
+\xab\x91\xb4\x6a\x15\xe2\xd3\x2c\xca\x9a\xa7\x7f\x40\x11\x95\x68\
+\x32\x0c\x5e\x0f\x3f\x94\x64\x83\xd1\x24\x48\x32\xa2\x7d\x6e\x4c\
+\xfe\xb1\x0d\x69\x75\xef\x21\xaa\x89\xc3\xe9\x56\x57\xe5\xc2\x60\
+\x7f\xc5\xa8\x52\x71\x3a\x3d\x83\x4c\xcd\x30\x20\x6a\x4a\x82\xe3\
+\xb1\x95\x48\x5e\x94\x07\xfd\xb8\x74\x94\xbc\xf2\x0a\x4a\x2b\x2a\
+\x69\x06\x87\x6e\x74\x33\x9a\x07\xc5\x85\xeb\x50\xba\xbe\x18\x19\
+\x3f\x75\xc3\x56\xff\x11\x34\x9e\x7e\xb4\x5e\x0b\x60\x4e\xf7\xb5\
+\xd1\x1d\x6d\x70\xfc\x37\xc1\xbc\x70\x6a\x8a\xe1\x78\x9a\x3e\x0e\
+\x82\xd9\x02\xc7\x8a\x02\xdc\xbe\x64\x21\x22\x26\x23\xbc\xb4\x5b\
+\x05\xe8\x49\xd6\xbe\xb0\x1a\x7b\x6a\x6a\x10\xf1\xf9\x31\xd0\xe9\
+\x84\xd5\xc3\x21\xf3\xc0\x6e\xa8\xa9\x78\x4f\x30\x8a\xd6\xbe\x40\
+\xde\x22\xce\x73\xe2\x96\x00\xa5\x37\x4e\x9a\xb2\xe5\x49\xbf\xab\
+\xc4\x6a\x32\x40\x60\x08\x7c\xcb\x56\xc2\x95\x3d\x1d\xa1\xb6\x4b\
+\x50\x51\x10\x19\xac\x19\x81\x20\xf4\xb7\x4f\x81\xa5\xad\x05\xc6\
+\x23\xb5\xd0\x10\x06\x5d\xde\x00\xfe\x65\xb4\x6c\x2d\xfa\xf1\x52\
+\xe9\x48\xbd\x51\x80\x3f\xe4\x17\xfc\x2f\xed\xaa\xe3\xf1\xa7\x4e\
+\x36\x61\x86\x59\x0f\x1d\x91\x20\xd2\x7b\x15\x33\xc7\x43\xc8\xb4\
+\x29\x9f\x68\x68\xff\x55\x0f\x1a\xf5\x57\x98\xb6\xca\x16\x4f\x00\
+\x75\xf3\xe6\xa3\x67\xbc\xad\xfe\x70\xf5\xbb\x4f\xfc\x2e\x20\xff\
+\xa5\x42\x12\xa1\xf5\x45\x0e\x87\x4a\x1e\xae\xa9\xd5\xa4\x27\x1a\
+\x4b\x92\x34\x6a\x83\x59\xa5\x82\x81\x9a\x92\x7c\x34\x7a\x3c\xd4\
+\x06\x04\x31\xd0\xed\xf3\x6f\x3d\xbe\xea\x79\x01\xba\xf8\xad\x5a\
+\x5a\x7b\xab\xdf\xdb\xc5\xfc\x26\x60\xfd\x6b\xaf\x9b\x09\x21\x6e\
+\x49\x96\xbe\xdd\xbb\x7b\xfb\x3d\x23\xd7\xf6\x6b\xc6\x2c\xa3\x15\
+\x27\x6b\xe8\xb3\xf6\xd5\x42\xa8\x6e\xe4\x7a\xc1\xba\xa2\x6f\x58\
+\x96\xbd\x9b\x01\x73\xdb\xae\x9d\x5b\x3c\xd7\xe7\x7f\x01\xea\xa9\
+\x3f\x46\xad\xc2\x2a\x6e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x05\x6a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x31\x49\x44\x41\x54\x78\xda\x95\x56\x7d\x6c\x53\x55\
+\x14\xff\xdd\xd7\xd7\xbe\x76\xaf\x5d\xd7\xad\x1b\xac\x45\xcb\xc6\
+\x56\xc6\xd8\xe6\xb2\x11\x23\x9b\x89\xc6\xf0\x11\x21\xc6\x44\x13\
+\x23\x7f\x68\xc0\x20\x09\x42\x04\xe3\x9f\x62\xd4\x60\x48\x48\xf8\
+\x30\x51\x26\xc3\x3f\x50\x40\x14\x12\xc0\x68\x20\xd1\xc4\x81\xc2\
+\xba\x6c\x40\x16\x18\x03\x66\x07\x03\x9c\x6d\x37\x28\xed\xba\x76\
+\x5b\x59\xdf\xbb\xde\xfb\xfa\xba\x96\xc9\x02\x9e\xe4\xbe\x8f\xf3\
+\xf5\x3b\xf7\x9c\xf3\xce\x7d\x04\x8c\xd4\x8d\x4b\xce\x51\x93\xa9\
+\x99\x08\x06\xfe\x0a\x2a\x10\x76\x51\x41\x28\xc1\x14\x31\x11\xa1\
+\x02\xbb\x30\x1e\x67\x73\x15\x5d\xc4\x5f\x29\xbb\x52\x95\xb2\xa5\
+\x00\x93\x6c\x25\x93\x3e\xf1\xeb\xdf\x9b\x89\xf2\x4e\x73\x1f\xa9\
+\xae\xf2\x92\x12\xb7\xae\xa9\x9b\x71\x47\xaa\xca\xee\x4c\x59\x14\
+\x11\xbf\x1d\xd0\xdc\x44\xfe\x09\xb1\x2b\x77\xc4\x44\x2c\x10\x6e\
+\xa2\xaa\x54\xbb\xcb\x25\x45\x28\xaa\xf0\x00\x8a\x0a\x65\x38\x04\
+\xb5\xff\xb6\x8f\x3c\xd8\xf4\x32\x35\x36\x2e\x42\xb0\xf3\x3c\xc6\
+\xc2\x11\xa6\x9d\xd2\x22\xa3\xd4\x80\x62\x6f\x39\xc3\x21\xe8\xfb\
+\xb3\x03\x66\x8f\x0b\x56\xef\x7c\x14\x36\xbd\x84\x99\xa8\x7f\xff\
+\x3e\xb8\x0a\xf3\xe1\xaa\xa9\x66\x3b\x16\xf0\xa0\xe7\x32\x48\xf2\
+\x83\x95\xd4\x54\x57\x8b\x81\x5f\x4f\xa3\x68\xdd\xfb\x10\xdd\xf3\
+\x41\x44\x03\x22\xa7\x0e\x80\xf4\xf6\x22\xe4\xef\x47\xcd\xd1\x3f\
+\x60\x2c\x9c\x83\xc7\xd1\xe0\xfe\x4f\xa0\x74\x75\xc0\x53\x5f\x07\
+\xb0\x6c\x26\xaf\x5f\x07\x99\xd8\xbc\x82\x4a\xb5\xd5\xb8\xf3\xdb\
+\x19\x94\x6c\x6b\x85\xb9\xbc\x41\x53\x0e\x1f\xdb\x8d\x60\xeb\x5e\
+\x38\xdf\x78\x1d\xb3\xd7\x6e\x7b\xa4\xc3\x2b\xab\xea\x31\x72\xa5\
+\x8f\xd5\xcc\x00\x55\x61\xe9\xb2\xd9\x31\xaf\xb1\x16\xae\xfa\x05\
+\x2c\x4d\x14\xe3\x1c\x60\x7c\xd3\x0a\x6a\x5e\xe8\x45\xb0\xad\x1d\
+\x8e\xcf\x5a\x60\xf6\x2e\xd2\x8c\x23\x47\x77\x22\xb4\xf7\x4b\x54\
+\xfe\xd2\x0d\x51\x76\x3c\x36\x7a\xad\x59\xa0\xe0\xfc\x8a\x5a\xd4\
+\xbf\xf8\x1c\x24\x9b\x0d\x63\x7d\x7f\x81\x24\x36\x2d\xa7\x79\x0b\
+\xaa\x10\x3a\xe3\x83\xfd\xf3\x16\x58\xe6\x65\x00\x76\x20\xf6\xd3\
+\x0f\xf0\x1c\xbe\x38\xa3\xc3\x89\xc1\xab\xff\xe1\x5d\xdd\xb0\x0a\
+\x35\x4d\x8b\x60\x92\x65\x24\x38\x40\x7c\xe3\x72\x2a\x57\x7b\x31\
+\x74\xb6\x13\x05\x6c\x07\x52\x65\xa3\xa6\x18\x3d\xb2\x03\x63\x1d\
+\x6d\x70\x7d\x71\x6a\x46\x80\x2b\x8b\x1d\x48\xc1\x08\x55\xef\x3c\
+\x15\x22\x44\xbb\x03\x55\xcf\x37\xc2\x5c\x68\x45\xfc\xda\x4d\x90\
+\xd1\x0d\x4b\xa9\xb5\xb2\x02\xc3\x5d\x17\x51\xb0\xb5\x05\xa6\xf2\
+\x0c\xc0\x76\x60\x3c\x8e\x82\xd5\x5b\x9f\x28\x3d\x19\x1a\x66\xb5\
+\x8b\x1d\x3d\x82\x8a\xe6\x06\x8c\x5e\xef\x07\x89\xbd\xb7\x8c\xda\
+\x2a\x3d\x08\x77\xf7\x20\xff\xd3\x3d\x30\x96\xa5\x8b\x1c\x3b\xb6\
+\x0b\x93\xd7\xba\x51\xb4\xe5\xe0\xff\x02\x88\xb6\x1d\x42\xf4\x9b\
+\x16\xcc\x7d\xb6\x06\x23\xfe\x01\x90\xe8\xfa\xa5\xd4\x5e\xe6\x41\
+\xe4\x52\x0f\x64\xbe\x03\x1d\x20\x71\x72\x0f\xe2\x07\x5a\x31\xeb\
+\xc8\xe5\x19\x9d\x5d\x92\x08\xc4\xb9\x26\x18\x5c\xc5\xac\x6b\x14\
+\xa4\x3f\x37\xc0\x5e\xf7\x0c\x5c\x4f\xbb\x11\x1d\xb8\x03\x12\x59\
+\xb7\x84\x16\x54\x3c\x85\x58\xbf\x1f\x96\xed\x07\x60\x2c\x28\x4b\
+\xef\x60\xd7\xdb\x08\x7c\x78\x10\xde\x89\x10\x04\x69\xd6\x23\x01\
+\x92\xb7\x7a\xb2\x1d\x94\x9a\x84\x20\x1a\x11\x39\xf9\x2d\x62\x7b\
+\xf6\xc3\xbb\xfa\x35\xdc\xf7\xb3\x1a\xdc\x5f\xbf\x8c\x3a\xca\xdd\
+\xb8\x77\xa2\x0d\x13\xbe\xdb\xac\xd1\x78\xb1\xf8\xd4\x60\x5f\x0a\
+\x5b\x52\x93\x1d\xa5\xed\xf7\x9e\x38\x45\xf1\xae\xe3\x08\xac\x5e\
+\x0b\xef\x9a\x57\x11\x1e\x08\x80\x0c\xad\x5c\x48\x8b\x07\x23\xda\
+\x3c\x11\x4c\x62\x7a\x06\x81\x8f\x0a\x15\x02\xfb\xdc\x03\xe7\x83\
+\x30\xbd\xb5\x10\xce\xef\xba\x1f\x72\x34\x72\x68\x0b\xe2\xdf\x1f\
+\xc6\x64\x34\xc1\xba\x28\xcd\x53\x04\x01\xb1\xae\x10\xca\x8a\xed\
+\x28\x9c\x2d\x23\xe4\x76\x80\xdc\x30\x5b\x69\xb9\xd7\xce\xe6\x53\
+\x5a\x4b\xf7\xaf\xcd\x3c\xfe\xcc\xf9\xc3\xbd\x41\xd8\xf7\x6d\x80\
+\xf5\xdd\xaf\xa6\x00\x6e\x30\xa1\xb3\xb4\x80\x8d\x15\x92\x9e\xaa\
+\x34\x6d\x2c\xc9\x46\x48\x92\xc8\x26\x2f\xe0\xef\x8b\x82\xf8\x65\
+\x1b\xad\xf0\x58\x59\x8d\xa8\x36\x92\xb5\x1c\xe5\x10\x07\x99\x64\
+\xb2\xbb\xfe\x21\xcc\x0a\x5c\x82\xb1\xb4\x4e\xe3\x0f\x32\xc1\x9c\
+\xea\x52\x6d\xe0\x3e\x44\x94\x6a\x58\x06\x03\x1b\x92\xb7\x46\x41\
+\xfa\x64\x2b\xf5\xba\xad\x5a\xa4\x94\x66\x76\x41\xa6\x81\x10\x24\
+\x22\xe3\x48\xce\x17\xe1\x3c\x97\xae\xc7\x1d\xc6\x9b\x5d\xe6\x84\
+\xc8\xd2\x42\xa7\xe9\x73\x32\xb0\x51\xde\x3b\x18\x07\xb9\x6a\x91\
+\x69\x55\xa9\xac\xd5\x20\x93\x1a\xbd\xdb\x90\x6b\x26\x30\x83\x7b\
+\x37\x87\x51\xac\x07\x11\xfb\xf8\x15\x28\xbb\x4f\x23\xbf\x44\xce\
+\x9e\x21\x99\x4c\xe9\x00\x3d\xc1\x04\xc8\x65\xb3\x4c\x6b\x4b\xf2\
+\x90\xe2\x00\x2c\x3d\x84\xd5\x99\xa6\x90\x45\x10\x74\x00\x16\xe5\
+\xc8\xdf\x77\xe1\xd0\x9d\x25\x76\xae\x81\xf2\xd1\x8f\x90\x9d\x36\
+\xed\x24\x23\x06\xfd\x84\xe3\x3e\x0c\x69\x80\xee\x61\x06\xd0\x2d\
+\xe5\xd1\xfa\x42\x0e\xa0\x66\x2b\x9c\x09\x5d\xcd\x9e\x6e\x5c\x94\
+\x08\x86\x91\xaf\x03\xc4\x37\xbf\x00\xd2\x7a\x01\x66\x87\x25\x5b\
+\xe4\x9c\x3a\x88\xcc\xe0\x42\x78\x0c\xe4\x82\x64\xa1\x0d\x56\x0b\
+\x52\x94\xe6\xa4\x84\x4c\x59\x64\xb6\xcc\x01\xc6\xc3\x23\xc8\x0b\
+\x74\x01\x36\x27\x46\x6c\x73\x61\x75\xb0\x2e\x22\x42\x56\x37\x27\
+\xbd\x46\xc6\xef\x1c\x65\x00\x3e\xd1\x42\x17\x4b\x66\x0d\x20\x47\
+\xae\xa5\x86\xe6\x76\x08\x6f\xd9\xa4\x02\xb5\x42\x84\x3a\x94\x80\
+\x98\x90\x60\x30\x1a\xa6\x22\xe7\x38\x1a\x80\xfe\x6e\x64\x29\x3a\
+\x9b\x1c\x07\xf9\x59\x30\xb5\x37\x18\x4d\x4d\x6e\x62\x9c\xd6\x9f\
+\x39\xe1\xe7\x6e\x25\xc5\x02\x21\x3c\xe7\xc2\xf4\xdf\x8a\xec\x33\
+\x5b\x83\x29\x76\xf8\x4c\x8e\xf9\x34\xf3\xe3\x44\x6c\xcf\x17\x0c\
+\x4d\x12\xc8\x94\x9e\x42\xf4\x3f\x14\x4a\xb4\xbf\x08\xde\xaa\x7c\
+\xee\x93\x69\x80\x4a\x2e\xb8\x9a\xd6\x4b\xa9\x04\xf7\xd5\x07\xbe\
+\x37\xa1\x34\xff\x0b\x1c\x62\x18\x7b\x2c\x9a\x34\x42\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x0f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xd6\x49\x44\x41\x54\x78\xda\xad\x95\x7b\x4c\x5b\x55\
+\x1c\xc7\xbf\xf7\xb6\x8c\x32\xb3\x15\xa5\x03\x4b\x19\x44\x56\x15\
+\x07\xd3\x2d\xe8\x5e\x99\xec\xe1\xd8\x5c\x66\x78\x6c\x89\x63\xc9\
+\xb6\x60\x24\x8b\x2e\xd1\x19\x65\xd1\x4c\x20\xd4\x2d\xfa\xc7\x8c\
+\x31\x1a\x30\xca\xe6\x8c\x10\x07\x32\x18\x16\x08\xa1\x4c\xb7\xc9\
+\x56\xb6\xe2\xd8\x70\x8f\xd8\x15\x79\x6c\x94\x0a\x94\xd2\xf5\x45\
+\x1f\xf7\x9e\xe3\x69\xf1\x2f\xf1\x8f\xb6\x78\x72\x4f\x7e\xf7\xdc\
+\x9b\xf3\xfd\x9c\xfb\xfb\x9d\xfb\x3d\x1c\xc2\x6c\x8a\x5a\xfb\x89\
+\x82\x35\x71\xa5\x3e\x3f\x45\xc7\x4d\x6f\x8d\x75\x5f\xfc\xc1\x70\
+\xe6\x71\xe1\x02\xd6\x5f\x76\xd3\x96\xf5\x0b\xa1\x77\x03\x72\x9e\
+\xe2\xad\x5f\x9d\xa3\x7f\x99\x7c\xeb\xac\x6f\x27\x8e\xfe\x2f\x80\
+\x55\x3a\x07\xfd\x64\xc3\x22\x68\xad\x04\x22\x1b\xe7\x25\xf0\x38\
+\xdc\x6a\x87\x6d\xc4\x9b\x62\x7b\x5f\x69\x9e\x37\xe0\xd9\x76\x3b\
+\xad\xcc\x91\x43\x67\x23\x90\xb0\xb1\x87\x52\xac\x5e\xcc\xe3\x73\
+\x9d\xcd\x67\x2c\x52\xc8\xe6\x0d\xc8\x6a\x9e\xa6\x95\x2f\xc5\xa3\
+\x7d\x4a\x04\x65\xe2\xec\x02\x61\xcf\xa5\x12\x0e\xcd\xb5\x96\xd6\
+\x87\x15\x4b\xf3\xe6\x05\xc8\x68\xb4\xd1\xb2\xdc\x78\x74\xb0\x14\
+\xc5\xf0\x40\x20\xc0\x3a\x21\xe0\x59\x3d\xa6\xdc\x94\x5e\xad\x33\
+\x7f\xe4\xfc\x6c\x59\x65\xd4\x80\xa7\xea\xac\xb4\xfc\x95\x04\x9c\
+\x1e\xf0\xe1\x6e\xcf\x43\xac\xd8\x20\x87\x5c\xc6\xc3\x17\xa0\xa1\
+\xf7\x7f\xdc\x72\x79\xc7\xf5\x93\x72\x47\x55\x86\x3f\x2a\x80\xfa\
+\xdb\x09\xfa\x41\xe1\x12\x9c\xbc\xe3\xc1\xed\xb3\x96\x32\x7e\x01\
+\xbf\x3a\x35\x27\x21\x4f\xa5\x8a\x85\x28\x50\x48\x64\x12\x5c\xf9\
+\x6a\x70\x97\xab\x3a\xe3\x5c\x54\x80\x27\xbe\xb6\xd0\xd2\xdd\x49\
+\x38\xf5\xbb\x07\xf7\x9a\x46\x2b\x5c\x55\x19\xc7\xe2\x5e\xbb\x75\
+\x26\xeb\x40\x7a\x91\x6c\x21\x0f\x91\x15\xc5\x74\xde\x8a\xc9\xb2\
+\x54\x2e\x2a\x40\xda\x97\x66\x7a\xb8\x48\x89\xd3\xd7\x5d\x18\x6a\
+\xbe\xaf\x71\x7d\x93\x15\xca\xb7\xe2\xd8\x08\x55\x6f\x4d\x64\xf5\
+\xa0\x18\xd3\x4f\xc3\x72\x44\x15\x1d\x20\xf5\xd3\x07\xf4\x8d\x7d\
+\xc9\xa8\xbd\xee\xc6\x48\xc3\x90\xc6\xf3\xfd\x73\x21\x80\x6c\xb7\
+\xa1\x67\xf9\x3b\x59\x6b\xfd\x3e\x82\x89\x6b\x36\x4c\x7c\x18\xe5\
+\x17\xa8\x3e\x1e\xa6\x25\xc5\x29\xa8\xbb\xe6\xc6\x58\xc3\x80\x66\
+\xa6\x3e\x3b\x04\x78\xa4\xb8\x7f\x20\x6d\xbf\x7a\x19\x09\x10\x8c\
+\x69\x1f\xc0\x51\xbd\x3c\x3a\x80\xf2\xf8\x20\xdd\x5f\xbc\x14\x0d\
+\x57\x5c\x98\xa8\x37\x6a\x66\xce\xad\x0d\x01\xe2\xdf\xbb\x47\x15\
+\x9b\x94\x20\x52\x09\xc6\xaa\xfb\xbb\xbc\xad\xeb\xb6\x45\x05\x78\
+\xbc\xdc\x44\x5f\x2d\x49\x43\xe3\x45\x17\xa6\x9b\xee\x68\xbc\xda\
+\x17\x67\x01\xa5\x7f\x52\xf9\x56\x25\x1c\x57\xa7\xe0\xd1\x9b\xb2\
+\x7d\xba\x2d\x7d\x51\x01\x12\x8f\x1a\x69\xfe\xeb\xe9\xd0\x5e\x70\
+\xc0\xde\xd8\xaf\xf1\x75\x6e\x99\xad\x41\x61\x77\x0d\x1f\x1b\x97\
+\x27\x58\xc6\x4f\xf9\x2f\xed\x3c\xfa\xef\x79\xff\x09\x58\x90\xaf\
+\x7f\xc1\xef\x17\x76\x82\xd0\x02\xb6\xff\x08\x02\xfe\xde\x45\xcf\
+\x24\x1f\xcc\x7f\x57\x8d\x8e\x4e\x27\x9c\x2d\x37\x35\xfe\x9f\x73\
+\x2b\xc3\x59\xd8\x5c\xc0\xb6\x8b\xbf\x64\xee\x7d\x7a\xf3\x81\x5c\
+\x05\x56\x26\x4a\x31\xc5\x2c\x61\xdc\x4b\xf1\x28\x04\xb4\x8c\x0a\
+\xb8\xd4\xe5\x80\xfb\xa7\x1b\x1a\x7f\xf7\x8e\x28\x00\x9b\xbb\xaa\
+\x8e\xd4\xe4\x1c\xca\x4c\x90\xe2\x3b\xa3\x17\x77\x87\x02\xa1\xfd\
+\x4d\xd9\x21\x43\x59\xe4\x82\x06\x37\xe9\xc3\x4c\xbb\x41\x13\xb8\
+\x5c\x10\x39\x20\xa9\xc2\x44\xbf\x28\x4d\xc7\xa1\x36\x27\xa4\xcc\
+\xf4\x79\x50\x10\xe6\x35\x84\xfd\xa5\x84\xdd\x8b\x02\x20\x8c\x7b\
+\xe1\x6d\x33\x1c\x17\x0c\xbb\xca\x23\x06\x3c\x7f\xd2\x4c\xd5\x6b\
+\x1e\x83\xae\xd7\x83\x18\x8e\x83\x28\x12\x30\xc3\x04\x11\x69\x28\
+\x32\xa3\x86\x70\xdf\x05\xb1\xab\xf7\x65\xa1\x6f\x4f\x67\xc4\x80\
+\x27\x4f\x0c\x51\xf5\xc6\x24\xf4\xdc\x70\x83\xe9\x33\x61\xd6\x85\
+\xd9\xd5\x13\xe6\x91\x44\xca\x3c\xa7\x7b\x18\x74\x78\x70\xb1\xf8\
+\xdb\x1e\x67\xc4\x80\xd8\x1d\xe7\xcd\x85\x55\x1b\x93\xb5\x6d\x76\
+\xf0\x5c\x50\x94\xe5\xfe\x9f\x18\x3c\x5c\xa8\x9f\x83\xd0\x74\xe1\
+\x36\xfa\xf7\xae\x08\x47\x7c\x0e\x80\xcb\x3e\xbb\x4a\xb5\x3d\xb3\
+\xcf\xaa\x58\x02\x48\x98\x78\x30\xff\x24\x28\xce\x81\x3a\x45\x90\
+\x4e\x83\x08\x43\xbe\x34\x5c\xf1\x39\x80\x50\x5b\xf9\x43\x12\x47\
+\x50\xcf\xa5\xa4\x6e\xa2\xb2\x98\x60\x69\x01\xcb\x84\x13\x36\xcb\
+\x8f\x30\xbe\x59\x12\x89\x78\xb0\xfd\x0d\xae\x1c\xdc\x28\xf6\x9b\
+\x70\x8b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x4e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x15\x49\x44\x41\x54\x78\xda\x85\x96\x7d\x4c\x55\x75\
+\x18\xc7\xbf\xbf\x73\xcf\xb9\x2f\x87\x7b\xb9\x20\x08\x08\x44\xd1\
+\x14\x28\x2d\xd0\xc5\xe8\xc5\x04\x4d\xbd\x43\x7b\x59\x96\xa8\x6d\
+\x35\xe7\x56\x33\x9a\x9b\x6b\xeb\xbf\x36\xe7\xd6\xdf\x2d\xe7\x50\
+\xeb\x0f\x6b\xd9\x9a\xd0\xd2\x59\xe9\x24\xcd\x61\x33\xcb\x50\x01\
+\xd3\xd4\x48\x6e\xc2\x54\xc0\x0b\x02\xf7\x72\x5f\xce\xdb\xaf\xe7\
+\xdc\xc3\xf5\x72\x78\xd1\x67\x83\xcb\xfd\x9d\xf3\x7b\x3e\xcf\xf3\
+\x7d\x9e\xe7\xf7\x83\xe1\x01\x16\x5d\xb9\xb6\x96\x1b\x7c\xa3\xaa\
+\x6a\x01\xcd\x30\x4a\x39\xe7\xe0\xb4\x6e\xfe\x08\x82\x10\x94\x9d\
+\x62\xab\x43\x10\x0e\xba\x4f\x1e\x3d\x3d\x9b\x0f\x36\xd3\xe2\xf8\
+\xca\xb5\x95\x5c\xd3\xdb\x13\x09\x45\xd2\x72\xfd\xf0\x3c\xb7\x10\
+\x42\xd1\x5c\xc0\x30\x26\x76\x31\xc4\xfb\x06\x30\x74\xf6\x12\xc4\
+\xbb\xa3\xc8\xca\xc8\x50\x65\x49\xac\xf6\x9c\x3c\xda\xf5\x50\x40\
+\xf8\xa5\x35\x4d\x5a\x5c\x69\x44\x61\x0e\xe4\xcd\xf5\x10\x7c\x5e\
+\x40\x55\x80\x48\x18\xd0\x54\xeb\x25\x51\x02\xbc\x3e\x08\x92\x0b\
+\x5a\x38\x82\x9e\xcf\x0f\x43\xbc\x13\x42\x41\xa6\x7f\x8f\xef\x97\
+\xa3\x1f\xcc\x0a\x88\xac\xa8\x6f\xd6\xa2\x89\x06\x57\xc3\x72\x88\
+\xd5\x15\xe0\xb7\x6f\xc3\x08\xdd\xa1\x94\xc8\x79\x66\x16\xc4\xa5\
+\xaf\x26\xdf\xd3\xce\xfc\x00\x8c\x8d\x00\x19\x04\xc9\x9d\x07\x47\
+\x61\x21\x86\xcf\x5d\x46\xef\x81\xe3\x28\xcb\xc9\x69\xf1\x9d\x3a\
+\xb6\x61\x1a\x60\x64\x45\x7d\x13\x8b\x26\x1a\x5d\xeb\xeb\x20\x94\
+\xe5\x43\xef\xbe\x4e\x92\x50\xc4\x4c\x00\x8f\x8e\xc1\xf3\xf1\x7e\
+\x5b\xa6\xb1\x4f\xb6\x80\xc9\x99\x54\x10\x92\x4d\x90\x20\x95\x55\
+\xe0\xde\x95\x3e\xdc\xf8\xe6\x38\x16\xe6\xe5\xdd\xcf\x24\x09\xb8\
+\xb7\xbc\xbe\x92\x29\x6a\xa7\xfb\x8d\x17\x21\x14\x67\x43\xbf\x71\
+\x8d\x36\x39\x92\x5a\x43\xd7\xe1\x28\x7f\x1a\xd2\xeb\xef\xd9\x00\
+\xea\xe1\x2f\xa0\x5f\xbf\x04\x38\xe8\x3d\x2a\x3e\x0c\x1d\xd2\xfc\
+\x27\x30\xd0\x15\x44\xa4\xb5\x1d\x05\x3e\x5f\x95\xff\xd4\xb1\xae\
+\x24\x60\xa8\x36\xa0\xb8\xf3\x73\x24\xe9\xcd\x1a\xda\x74\x25\xed\
+\xdc\x34\x5d\x83\x63\xc1\x22\x48\x1b\xb6\xd9\x01\xcd\xbb\x29\xcb\
+\xcb\x04\x10\xad\x85\x09\x88\xb3\x62\x11\x3a\xbe\x6c\x45\xc9\xb8\
+\xa2\xe6\x9d\x3e\xe1\x64\x83\xcb\xeb\x6b\x9d\x8a\xda\xe6\x79\x37\
+\x00\xe3\xe6\x44\xe4\x93\x4b\x63\x02\xca\x08\xb0\x69\xfb\x74\xc0\
+\x3f\x97\xd3\x19\x98\xcd\x9b\x84\x18\x60\x8f\x56\xe0\xea\xae\xef\
+\x51\x92\x9d\x5d\xc7\xfa\x6b\x03\x7b\x7d\x45\x79\x5b\x85\xa7\xfc\
+\x24\x6c\x22\x1d\xb9\xf9\x49\xfa\x9b\x51\x39\xca\x4d\x80\x3d\x83\
+\xf8\xa7\x1f\x81\xff\xd5\x01\xe6\xa5\x3a\x78\xdc\x54\xf0\x4c\x2b\
+\x1b\x53\x52\xd9\x89\xab\xbf\xdd\x44\xe1\x58\x62\x1f\xeb\x5f\xb6\
+\xba\x27\xab\xe6\xf1\x52\xee\xd6\xac\x09\x32\x1d\x9b\x59\x24\xe2\
+\xe0\x43\x83\xe0\xbd\xbd\x60\xe5\x4f\xc2\xb3\xab\xd9\x5e\xe4\x0f\
+\x37\xc1\xb8\x78\x01\x90\x24\x2b\x7a\x33\x72\x59\x06\x9b\x47\x5d\
+\x35\x37\x1f\xa1\xb8\x04\xfd\xcf\x60\x90\xdd\x59\x16\xe0\xd9\xd5\
+\x45\xe0\xce\xe4\x78\x02\x8a\x02\x23\xd8\x0d\x3e\x10\xb2\xd2\xa7\
+\x88\x84\x25\x4b\xe0\xf9\xec\xa0\x1d\xb0\x7d\x23\x8c\x8e\x8b\x04\
+\x70\xa6\x17\x53\x12\x51\x67\xc5\x44\x37\x42\xc3\x5e\xb0\xdb\x4b\
+\x57\xf1\x39\xcb\x8a\x29\x06\x07\x8c\x9e\x7f\xc1\x6f\xf6\xd2\x20\
+\x89\x16\x2c\x29\xb6\x62\x01\x76\x7f\x67\x07\x6c\x5b\x4f\x19\x4c\
+\x01\x4c\x32\x49\x64\x38\xff\x2b\x65\xdf\x5b\xb7\x9a\xe7\xd5\xcc\
+\x83\xf6\xfb\x39\x70\x8a\x3e\xe9\x98\x4d\x2a\xf2\x04\x40\xde\x7b\
+\xc8\xe6\x20\xfa\xfe\xba\x07\x02\x1c\xa2\x80\x6b\xed\x83\x60\xdd\
+\x2f\xac\xe2\xc5\x62\x1f\xb4\x98\x62\x15\x75\xaa\x91\x44\xac\xb4\
+\x04\x19\x2d\x6d\xb6\xe5\xf1\x86\x3a\xf0\x60\xaf\x25\xe3\x0c\x26\
+\x4a\x02\xfe\xbe\x18\x02\xbb\x90\x5d\xd0\x33\xbf\xd8\x55\xea\x90\
+\x1c\x56\xb7\x4d\x35\xf3\x04\x1d\x1d\x85\xfb\x50\x2b\xa4\xaa\x67\
+\xac\xa4\x3a\xcf\x23\xbe\x2e\x00\xe6\xf7\xdb\xb3\x45\xba\x01\x75\
+\x9d\xe3\x5a\xf7\x48\x90\x9d\x95\xb3\xf6\x3e\x96\x2f\x6f\xcd\xf4\
+\xb9\xc0\x67\x24\x58\xb3\xc0\xfb\xfb\x81\xdc\x2c\xeb\x7b\x68\x04\
+\xac\xa0\x20\x3d\x64\xd3\x00\x0c\x63\xe1\x04\xfe\x1b\x8c\xee\x63\
+\x67\xbc\xd9\xb5\x19\x92\xd0\x56\x5e\xe4\x83\xa6\xcf\x00\x30\x33\
+\x18\x1b\x83\xfc\xd5\x01\x88\xab\x5e\x4e\x2e\x69\x27\x7e\x42\x74\
+\xf3\xdb\x60\x99\x99\x33\x66\x20\x3a\x18\xae\xdf\x0a\x63\x5c\x35\
+\xea\x92\x4f\x7f\x96\xfd\xca\xe2\x5c\xaf\xe4\x71\x09\x30\xa6\x32\
+\xcc\x1a\x94\x3c\x02\x6f\xdb\x1f\xb6\xe5\x48\xdd\xb3\x34\x23\x7d\
+\xd3\x6a\x20\x30\x73\x5e\x0d\x74\x84\x22\xea\xea\xe8\xa8\x33\x05\
+\xa8\xa4\xae\xea\xac\x99\xeb\x03\x75\x31\x6c\x0c\x4d\x83\x50\x55\
+\x85\x8c\x1f\x8f\xd9\x8b\xfc\xca\x1a\x18\x9d\x9d\x56\x4b\xa7\xa4\
+\x31\x01\xb4\xfb\xdc\xdd\x30\x34\x8e\x2a\x02\x74\xdd\xcf\xef\x88\
+\xc7\xdb\x94\x2f\x89\x8d\x8b\xfd\x5e\x28\x06\x4f\x43\xcc\xba\xc4\
+\x62\xf0\x0d\x0f\xdb\x00\xe1\x39\x73\xe8\x88\xf0\xdc\x97\xc8\xfc\
+\xed\xa4\xf0\x3b\x46\x23\x18\x50\xb5\x3d\xaf\xc5\x22\xe9\xe3\x3a\
+\x65\x2d\x6e\x6f\x73\x91\xe8\x68\xa8\xf2\xca\x24\x15\xc9\x95\xc2\
+\x28\x2a\x98\xdb\x05\xd7\x8e\x1d\xc9\xaf\x89\x9d\x3b\xc1\xe3\x74\
+\x6e\x39\x25\x4b\x16\x72\x23\x30\x03\x9d\x91\x28\x6e\x69\x7a\x4b\
+\x43\x3c\x32\xfd\xc2\x49\xd9\xb7\x2e\xb9\xc9\xcd\x84\xc6\xe7\xe9\
+\x5c\xf1\x93\xbe\x3a\xad\x19\x66\xa1\xa9\x16\x3c\x91\xb0\x36\xb9\
+\x5c\x60\xf4\x4c\xa0\xe8\xcd\x0a\x8c\xd2\xb3\xb3\xd1\x28\xe2\xdc\
+\xd8\xf3\x56\x22\x3a\xfb\x95\x99\xb2\xaf\x5d\x9e\x4a\x95\xa3\xbd\
+\x48\x70\x48\x0b\x68\x52\x73\x24\x11\x1e\xf3\x66\x9b\xb4\x29\x46\
+\xe7\xcd\x90\xaa\xa1\x9b\x26\xfd\x96\xa1\xab\x12\x43\xf5\x3b\x89\
+\xd8\xc3\x2f\xfd\xc9\xb6\xdf\xe9\xae\xa5\xce\xdd\x48\x8e\x03\x74\
+\x31\x96\x66\x4d\x4c\xfa\x08\x39\xa7\xbf\x82\xb4\xb9\x95\x3a\xf2\
+\xe0\x16\x25\x3e\xeb\xbf\x2d\xff\x03\x15\x20\x1b\x7b\xc3\x22\xfa\
+\x0e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xa2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x69\x49\x44\x41\x54\x78\xda\xa5\x55\x6d\x6c\x53\x55\
+\x18\x7e\xce\xed\xed\xe7\xed\xba\x2f\xf6\xe5\x18\x4c\x82\x11\xe7\
+\x58\x9c\x13\x50\x10\x10\x70\x83\x38\x8c\x38\x32\x61\x30\x90\xa8\
+\x63\x89\x53\x7f\x4c\x51\x13\x15\xc4\xa8\x89\x59\x9c\x26\xb0\x44\
+\xa6\x18\x10\xcc\x80\x89\xc6\x09\x53\x60\x10\x36\x84\xc1\xf8\x30\
+\x61\x83\x99\xa8\x61\x19\x94\x75\x0c\xb6\x6e\xdd\xda\xde\xf6\xde\
+\x7b\x7c\x7b\xdb\xf2\xa1\xb0\x60\x3c\x4d\x6f\xde\x7b\xfa\xbc\xef\
+\xf3\x9e\xe7\x9c\xf3\x94\x61\x94\xf1\x56\x87\xbf\xe0\x93\x6c\xcb\
+\xfe\x50\xbc\xa6\xdd\xcf\xab\x26\x5b\xd8\x3f\x63\xc2\xe4\x13\xe6\
+\xc0\x9d\x6a\xb0\xd1\x08\xde\xec\xf0\xd6\x06\x15\xad\x8c\x41\xa8\
+\x4c\x90\x84\x6a\xf7\x08\xd7\xe7\xe3\x25\x86\x6b\x23\x5a\xa5\xc8\
+\x58\x35\x17\xf8\x57\x55\x93\x6d\x65\xff\x89\x60\xcd\x99\x11\x3e\
+\xa2\x69\x35\x4c\xc5\xec\x79\x13\xac\xd9\xfb\x2e\xf8\xb0\x68\xa2\
+\x0d\x5d\x43\x8a\xfe\xfb\xf8\x18\x11\x0d\x7f\x79\x31\x37\xd3\x8a\
+\xe6\x0b\xbe\x0e\x18\x84\x66\x9b\x80\x8a\xaa\x87\x25\x76\x57\x04\
+\x2f\xb7\x0d\xf1\x69\x63\x25\x9c\x73\xf9\x31\x33\xc3\x0a\x4e\x8d\
+\x07\xb8\x46\x60\x41\xff\x5d\xa3\x8f\x81\xd1\x1b\x65\x1f\xb9\xe8\
+\xc3\x83\x29\x66\x9c\x71\xca\xd8\x38\xd5\x3e\x3a\xc1\x2b\xad\x43\
+\x5c\x56\x34\x78\xfc\x1c\x2b\xf2\x1c\xf0\x51\xac\x52\xd3\xca\xcd\
+\x40\x1e\x7e\x37\xe9\x44\x80\xc1\x20\xc0\x2a\x02\x3b\x7e\x1b\x82\
+\x9d\xb6\xc5\x2c\x0a\xd8\xf0\x98\x83\xdd\x96\x60\xd5\xa1\x81\xe6\
+\xc2\x2c\xfb\x2c\x2b\x81\x86\x82\xd4\xa7\xa6\xd7\x8b\x3c\x00\x35\
+\x0a\xd4\xc2\x93\x3c\x92\x2d\xd0\xc2\x6c\x46\x01\x3e\x02\x1c\xfa\
+\xdd\xd3\xb2\x65\x4e\xfc\xec\x5b\x08\x56\xb7\xf4\xd7\x51\x5b\x4b\
+\x7d\x0a\xc7\x43\x99\x12\x92\xac\xc2\x8d\x62\xd1\x9a\xfc\xc6\x0a\
+\xa2\xa1\x16\xca\xe6\x3c\x42\xc2\x71\x75\x98\xa3\xb3\xdb\x07\xb3\
+\x91\x26\x44\xec\xa8\x9d\x95\x50\xa2\x13\x94\x37\x0d\xa4\x42\xe4\
+\x3d\x85\x39\x71\x70\x7b\x49\x16\xd2\x5b\x0b\x31\x18\xb8\x5e\x2c\
+\x04\xd2\x34\x76\x9d\x81\xf3\xf0\x5e\x30\xc6\xa9\x91\x70\x1c\x7a\
+\xd2\xc2\x21\x59\x04\x34\xb5\xf7\x43\xd0\x0c\x69\x9b\x9e\x8c\x77\
+\xb1\x55\xbf\xf4\x31\x4d\xd3\x96\x78\xbc\x6a\xdd\x84\x89\x0e\x58\
+\x08\x65\x11\xc2\xc5\x64\x92\xc2\x4a\x9b\x39\xac\x6a\x08\xaa\x2a\
+\x82\x24\xbe\x81\xf4\x30\x90\x46\x0a\xe9\xa3\x04\x82\x14\x09\x30\
+\x8a\x44\x44\xab\x27\x55\x41\xc5\x30\xd8\x1f\x84\x68\x62\x25\x82\
+\x20\xec\x64\x2b\xf7\xf6\xee\x32\x8a\xac\x38\x2f\x3b\x01\x45\xf1\
+\x40\x8a\x95\xa1\xf4\xe8\x30\x24\x91\x61\xd3\x34\x09\x2f\x35\x0d\
+\xe0\xdd\xa9\x36\x64\x5a\x68\xdd\x26\x86\xbd\x67\xfb\x31\x7d\x9c\
+\x0d\xc7\xba\xbd\xa8\xbf\xa8\x60\x4b\xe1\x18\x9a\x73\xa3\xb1\x47\
+\x41\xcd\xfc\x44\x9c\xec\x1a\xc1\xd6\x6e\x06\x3f\x6d\x48\x50\x53\
+\xeb\xf5\x56\x97\xec\x76\x6e\x33\xc5\x98\x4b\xab\x1e\x8f\x23\x02\
+\x03\x25\xf4\x61\xe1\x11\x92\xa2\x22\x19\x39\xdf\xf6\xe2\x6c\x71\
+\x22\xba\xfc\x41\xbc\x76\xa0\x1f\x31\x26\x01\x1b\x67\x3a\x10\x1f\
+\x27\x21\xfd\xa3\xf3\x70\xbe\x93\x05\xaf\x3f\x80\x89\x9f\xfe\x89\
+\xcb\x14\x7f\x7d\xcc\x89\x33\x8a\x84\xab\x57\xbd\xdb\x77\x2e\x4e\
+\x5f\xc1\x96\x7d\xe7\x5c\x2b\x49\xc6\xf5\xbd\x0e\x09\xb5\xb9\x66\
+\x9d\x20\x34\x42\x24\x85\x39\x49\xc8\xab\xeb\xc5\xe9\xc5\x61\x82\
+\xf1\x36\x23\x1a\xcf\x0f\xe0\xed\x76\x05\xed\xcb\xd3\x50\x7b\xea\
+\x0a\x56\x3f\x92\xac\xe3\x4f\x76\x0d\x60\xca\x38\x09\x05\xbb\xaf\
+\x21\x2b\xcd\x8a\x81\x7e\x19\xb2\x5f\x5d\xc7\x4a\xf7\xb8\xd6\x36\
+\x34\x5d\x5b\x1f\x37\x63\x2c\xda\x0a\x25\x9d\xa0\xdd\xe9\xc6\xe4\
+\xf4\x38\x3d\x71\xdc\x06\x27\xba\xcb\x53\x74\x82\xe2\x9f\x07\xf5\
+\xb9\x53\xad\x1e\xf0\xcf\xef\xd3\xe3\x1b\x58\x95\xba\x77\xe1\xfd\
+\xd3\x40\x72\xa6\x1d\xf7\x73\x1f\xac\x26\x61\x9d\x2e\x51\xe2\x8b\
+\x6d\xdb\xdc\x49\x71\xa5\xce\xb5\x13\x74\x02\xf6\xd9\x15\x9c\x7d\
+\xce\xa4\x27\xde\x4c\x70\xef\x7b\x97\xae\x1f\xee\x28\x01\xab\x38\
+\x0d\x5e\x93\xa7\xc7\xa9\x1f\x74\xc2\x14\xef\x80\xec\x1a\xc6\xc8\
+\x25\xf7\xf6\x91\x6f\x1e\x5d\xc1\x12\xca\x8f\xef\x12\xad\xe6\xe2\
+\xa4\x67\xb3\x71\x70\x0a\xd3\x09\x4c\x5b\xdd\x78\x23\x47\xc0\xc7\
+\xb9\x31\x44\x70\x19\x2d\xcf\x27\x20\xd3\x21\x86\xce\x2d\x7c\x01\
+\x19\xb6\x0f\xfb\xb0\x79\x81\x01\x2f\x4c\xbf\x07\xac\xe4\x04\x36\
+\xbf\x9a\x41\x71\x32\x58\x59\x27\x32\x72\x12\x61\x9f\x34\x06\xfd\
+\x3f\x75\x42\x0d\xc8\xf5\x6c\x4c\xf9\x09\x3a\x59\x7c\x89\xec\x1a\
+\xac\xb3\x2d\xcc\xc5\xff\x1d\x16\x39\x00\xcf\xe1\x4e\x88\x89\x31\
+\x25\x64\x56\x3b\x75\x89\x62\x97\x1d\x4e\x35\x48\x96\x9e\xb1\xab\
+\xa6\x21\xd8\xe7\xa1\x4b\xa6\x81\x6b\x61\x2b\xd0\x42\x0f\xfd\x1b\
+\xb9\x4d\x74\xd6\x55\x7a\x65\x3c\x7c\x09\x09\xaa\x5b\x05\xa7\x77\
+\x8d\x7c\x89\xc7\xda\xe1\xaf\x6b\x83\x12\x94\xd3\x06\xb7\x3f\xe1\
+\xd2\x09\xe2\x4a\x0e\xd6\xa9\x1a\x5f\x8a\xe1\x20\x6c\x73\xb3\x60\
+\xcd\x88\x85\x4a\xb7\x26\xe2\x02\x7a\x32\xa7\xc3\xc5\x95\x48\x1c\
+\x31\x26\x1e\xdd\x0f\xba\xf9\xaa\x48\x80\x8b\x5e\x28\xc7\xdb\xc1\
+\x25\x33\xb9\x2d\x76\xb8\xeb\xe6\x95\xdc\x62\x76\xd2\xd3\x7b\x9b\
+\xed\xcb\xe7\xcc\x12\x8c\x74\x33\x3d\x32\x75\xa9\xe9\x36\x2d\x50\
+\x95\x50\xf1\x88\x2b\xe8\xc4\x3c\xea\x81\xa1\xf9\x50\xe7\x36\x13\
+\x54\x3f\x61\x1b\x7e\x6d\xf1\x34\x14\xde\x6a\x76\xd1\x61\x2f\x6a\
+\xe4\x9a\x37\x00\x0c\xf9\x60\x7c\x7d\x11\xe0\x96\x49\x2a\x6a\x55\
+\x51\xaf\xab\xa4\x7b\x91\x16\x49\x20\x4b\x09\xc9\xa2\x59\xcd\x30\
+\x7d\xb1\x07\xdc\x61\x43\xc8\xe9\x86\x7f\x78\xea\xf6\x76\x1d\x1d\
+\xb6\x82\x7a\x8e\xfc\x19\x40\xeb\x39\xf0\x67\xa6\x12\x01\x55\x24\
+\xdf\xd1\x25\x23\xd7\xe4\xd4\x03\xa7\x42\x9a\xd1\x00\x73\x43\x1b\
+\x02\xb9\x0f\xc0\x78\xb4\x15\xde\xfd\xc5\x77\xf7\x8f\x66\x99\xff\
+\x3d\x47\x40\xa9\x41\x30\x30\x5b\x59\x94\x9f\x6d\xa8\x6f\x82\xb2\
+\x72\x01\x0c\x7f\x5c\xd1\x6d\x9c\x4f\x4a\x86\x79\x6b\x23\x02\x45\
+\xf9\x30\xfd\x78\xa8\x83\x9b\xc4\x66\x72\xbc\x0a\xff\xbe\xa2\xbb\
+\x23\x88\x0e\x73\x7e\x7d\x2d\x59\x68\x19\xa1\x2a\x79\x6a\x7a\x35\
+\xeb\xed\x09\x8b\x94\x92\x06\xe6\x72\x56\x92\x5a\xd5\x54\xf8\x4b\
+\xf9\x40\xf1\xea\x3b\xd5\x18\x9d\x60\xfe\xee\x02\x79\xdf\xe2\xfd\
+\x11\x32\x4e\x85\xd8\xbf\xe2\x9b\x30\xb7\x1b\x7f\x03\x09\xd4\x72\
+\xf8\xce\xde\x27\x2c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x03\xb7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x7e\x49\x44\x41\x54\x78\xda\xd5\x55\x4f\x6c\x4c\x41\
+\x18\xff\xcd\x7b\xfb\x76\xb7\x5d\x59\x52\x0e\xba\xa5\x45\x22\x91\
+\x08\x4d\x43\x38\x08\x41\x05\x29\x2a\x21\x69\x25\x38\x38\x34\xe2\
+\xe2\x22\x91\x70\x10\x0e\xfe\x44\x48\xc4\x41\x82\xc4\x41\x51\xab\
+\xea\x4f\x48\x11\xff\xb9\x88\x08\x9a\x48\x54\x4b\x55\xf5\xad\xaa\
+\x6d\x4b\xb1\xb6\xeb\xcd\x8c\x6f\xe6\xbd\xdd\x16\xd5\xd6\xc1\xc1\
+\x64\xdf\x4e\x66\xe6\xfb\xf7\xfb\xe6\xfb\x7e\xc3\xf0\x8f\x07\xfb\
+\xff\x1d\x4c\xad\x7a\xff\x51\x48\x0c\x0f\x87\x0c\x48\xc6\xc0\x69\
+\x01\xf5\xd1\x10\x6a\xe6\x80\x94\x82\x3e\xe8\x7d\xb5\x27\xb9\x5a\
+\x4b\x75\x00\xce\x69\x2d\x3c\x59\x5a\x33\xfa\xb2\x2c\x03\xf1\x0f\
+\x3d\x30\x0d\x7c\xd2\x08\x26\x9f\x6c\xb3\x0b\x0b\x82\x91\x9d\x33\
+\x86\xe3\xdb\x77\x92\xeb\x0b\xaf\x1f\x8c\xec\x97\x45\x5f\xb9\x6c\
+\x0b\xd8\xf7\x20\x8e\xea\xda\xb6\xd8\xbb\x9d\x53\xf2\x32\xb2\xe3\
+\x0e\xb7\xda\xa5\x85\xc3\x22\x93\xc6\x0c\xc3\x37\x8a\x3a\xe3\xc5\
+\x1b\x32\xb3\x26\x14\xee\x44\x3f\xfd\x07\x02\x01\x66\x10\x0a\x13\
+\x38\x7b\xe5\x2d\x5a\x9a\xba\x5b\x3b\xf6\x16\x8d\xfd\x2d\x98\xfc\
+\x03\xcd\x76\x71\x51\x28\x32\xa1\x20\x87\x90\x70\xbd\xe7\x48\x57\
+\x88\x7b\x29\x92\x2a\x62\xee\xce\x8e\x70\xb3\xc9\x0c\x86\x60\xc0\
+\x40\xf5\xc5\x26\x7c\xb5\x3f\xc3\x17\x34\xc7\xc6\x76\x15\xb5\xf6\
+\x9b\x80\xdc\x3d\x8d\xb2\x78\x5a\x18\x05\xe3\x72\x90\xea\xe3\xc4\
+\xbb\x16\x9d\x7b\x85\x46\x08\x7d\x3d\xca\x2b\xfc\x7e\x13\x37\x6e\
+\xdb\xe8\x78\xf1\x01\xa6\xdf\x97\x17\xdb\x37\x3d\xf6\xc7\x2a\x9a\
+\xb0\xa7\x21\x92\x48\x70\x7b\xde\x8c\x11\xc8\x9b\x48\x48\x12\x02\
+\x9c\xf5\x5e\xb4\xf0\xd2\x45\xf7\x4c\xca\x12\x96\xe5\xc3\xbd\xbb\
+\x2d\x88\xd7\xc7\x61\x5a\x66\xee\xfb\x83\x33\xdb\x06\x2d\xd3\xfc\
+\x6d\xcf\x22\x8e\x14\x76\xc5\xb2\x3c\x34\xfb\xb2\xc1\x1c\xae\x8d\
+\xaa\x9c\x0b\xcf\xb8\xca\xbd\xe9\x63\xa8\xaf\xef\xc2\xab\x7b\xaf\
+\x61\x05\xcc\x55\xed\x87\x66\x45\x07\x2c\x88\x9f\x52\xb5\xe5\x49\
+\xc4\x49\x09\x7b\x69\xc9\x18\x24\xb2\xb2\x20\x1d\x65\x5c\x66\x10\
+\x18\xa6\x89\x37\x4d\x9f\xf0\xf2\x66\xa3\xca\x79\x79\xfc\xc8\x9c\
+\x33\xfd\xf6\xc1\x40\x4d\x92\xbb\xf1\xe1\xe8\x1e\xee\xbc\x5b\x52\
+\x32\x1e\x9d\xd9\x21\x08\xc7\xd1\x35\xcf\x2c\x86\xd8\xab\xcf\x68\
+\xbe\xf3\x1c\xbe\x80\xb5\xa3\xe3\xd8\xfc\xed\x7f\xb2\x31\x68\x27\
+\x8f\xaa\xb8\x5f\xce\xa5\x73\x7a\x61\xe9\x44\xd8\x46\x10\x54\x30\
+\x48\x26\x38\x1a\x2e\xd4\xc1\x30\x70\xa6\xb3\x72\x61\xf9\x40\xfa\
+\x43\xa2\x8a\x91\xeb\x6e\x95\x51\x69\x46\xd7\x6c\x28\xc2\xb5\xc6\
+\x24\x62\x97\x9f\x52\xc7\x22\xfa\xb1\xba\x64\xd5\x60\xba\x43\xe6\
+\xa2\x70\xd9\xd5\xb2\x50\xd8\x1f\x55\xd5\x9a\xe8\xfa\xd2\xd6\x5d\
+\x53\x9a\x3b\x14\xbd\xbf\x22\xbb\xf0\xca\x4b\x8b\xa9\x01\x8e\x74\
+\x9f\x5f\x9e\x3f\x54\x1d\x96\xb3\xf6\xfa\xa3\x44\x22\xa5\xab\x04\
+\x52\x78\x8d\x24\xdc\x4e\x52\x25\xa3\xba\xd6\x63\x3c\x3a\x4b\x4a\
+\x21\x52\x8c\x23\x44\xbb\x96\x94\x54\xbe\xe9\x0e\x14\xae\xbe\xd6\
+\x93\x5c\xc7\x6e\x06\x7c\x60\xc1\xd2\x4b\x72\xfb\xee\xb9\xe0\x49\
+\xae\xdb\x5f\x1b\x87\x4b\x45\x5c\x78\xba\xc2\x5d\x2b\xe7\x8a\x32\
+\x38\x93\x69\x1b\xda\x81\x48\x9f\x09\x77\x56\x23\x10\xf4\x63\xff\
+\xfa\x4a\xa2\x91\x45\x35\xb2\xf6\xd4\x0a\x1c\x78\xdc\x09\x3f\x95\
+\x88\x12\x10\x69\x00\x5e\xdd\x6b\x07\xe4\x58\x48\xcf\x31\xef\x4b\
+\x19\x1a\x9f\xab\xc7\x15\xad\x68\x0a\x84\x91\xed\x47\xdd\xd6\xe3\
+\x60\x6c\x7e\x95\xac\x89\x96\x61\x73\x6d\x3b\xb2\x7c\x2e\x52\xcd\
+\xf9\x64\x55\xa8\x10\xd5\x4c\xd0\xf4\x9e\x3a\x53\x0d\x07\xf7\x4c\
+\x78\xdc\x21\x94\x73\x2e\xbd\x2c\xb9\x72\x08\x5a\xe8\x3a\x7a\x8e\
+\xa4\x66\x9f\x90\xe7\x6b\x57\x63\xd3\xb9\x76\xe2\x15\xe8\x28\x34\
+\x25\x70\x95\xfe\x5e\x62\x93\x69\x34\x19\x43\x42\x1b\x96\x4e\x6f\
+\x3a\xb5\x4c\xda\x89\xe9\x47\xb2\xb2\x1a\x2c\xb0\xe0\xa4\xec\xf9\
+\x92\xa2\x06\x12\x30\x74\x1a\x94\x07\xa6\x0d\xe8\xfb\xd0\x1e\x78\
+\xef\x83\x90\xbe\xd4\x01\xeb\x8f\x0e\xe9\x7d\x50\x11\xff\xff\x8f\
+\xfe\x0f\x28\x17\x22\x0b\x63\x49\xe7\xd1\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x61\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x28\x49\x44\x41\x54\x78\xda\x95\xd5\x6d\x50\x54\x55\
+\x18\x07\xf0\xff\xb9\x77\x5f\x79\xc9\xa4\x62\xa4\x02\x6b\x26\x88\
+\xfc\xc0\x87\x9a\x49\x19\xcb\x1c\x7b\x91\x9c\x36\x87\x15\x81\x85\
+\x85\x30\xa5\x85\x35\x24\x61\x46\xc6\x1c\xf8\x00\x95\x43\x33\x98\
+\x48\x2c\x90\x68\x84\xcb\xae\xbb\x22\x3b\xb9\x8e\x46\x99\x63\x94\
+\x83\xd6\x34\xd3\xd8\x4c\x43\xe8\xf4\x02\x15\x0e\x16\x66\x02\xfb\
+\x7a\xef\xe9\xb0\x3a\x7b\x81\xdd\xbb\xa3\xe7\xd3\x99\x73\x9f\xfb\
+\xfc\xce\x7d\xce\xb9\xe7\x10\xdc\x41\xf3\xd4\xe8\x76\x41\xc9\x35\
+\x83\xa2\x50\xfb\xfe\xa7\x0e\xcf\xae\x8d\xf9\x20\xbc\x03\xc1\x40\
+\xb7\xb6\xc5\x5d\x1e\xeb\x5d\x12\xeb\xe1\x4c\xe9\xea\xe5\x44\xc1\
+\x0f\x81\x23\x69\xa1\x01\x91\x0e\xc6\x1d\x1e\xca\x99\xdd\xb2\xe6\
+\x34\x78\x92\x73\x7b\x6c\x96\x06\x85\x27\xe2\x7b\xcf\x8f\xdd\x15\
+\x30\xbd\x21\x2b\x1d\x0a\x6e\x74\x61\x08\x45\xc2\x89\x1f\xc8\xf4\
+\xc6\x27\x29\x28\x5d\x30\x8e\xa0\x98\x9e\x70\xea\xd2\x95\x3b\x06\
+\x66\xb3\x96\xed\xa1\x71\x09\xef\x50\xc2\x42\x08\x09\x47\x53\x11\
+\x2f\x10\x0e\x67\x30\x2f\x3f\x11\x45\x90\x99\xe9\xfd\x71\x3f\x5e\
+\xdd\x79\x57\x25\xf2\x24\x29\x12\x45\x4d\x5c\x09\x0d\xa2\x94\xd5\
+\x7c\x25\x55\xa9\x41\x09\xf7\x3b\x11\x83\xcb\x89\xdf\x3f\x57\x9f\
+\x8b\xe0\xe8\x49\xde\x3f\x3b\xa8\x9d\x12\xbe\x8b\x59\xa2\x8f\x2c\
+\xbd\x39\x19\x8f\x3f\x36\xc0\xba\xda\x68\x81\xa9\x5d\x16\x68\x15\
+\xd7\x71\xef\x2f\xe3\xb8\x96\xb5\x02\xc1\x7f\x15\x18\x37\x99\x65\
+\xe7\x36\xfa\xf3\x15\xfd\x1b\xe6\xd2\xcf\xc2\xc0\xb9\x2f\xbf\xa1\
+\xcf\xad\x5b\x7d\xab\x9e\x8b\x1a\x65\xf3\x10\xbe\x3f\x03\xc1\xd5\
+\x0e\xa8\xb5\x20\x5e\x0f\x78\xbd\x19\xdc\x53\x2f\xb2\x27\x34\x4a\
+\x7e\x82\xaf\xce\x9e\xc7\xda\xe7\x9f\x21\x61\xe0\xeb\xa1\x61\x9a\
+\xb9\x22\x1d\x82\x20\x46\x02\xbc\x12\x9a\x4b\x5f\x40\x7b\xf6\x28\
+\xa0\x54\x03\x01\x1f\x3c\xeb\x0a\xe1\xcd\x62\x80\x10\x88\x88\xe7\
+\x79\x0e\x23\x3f\x5d\xc6\xb3\x6b\xb2\x25\xc0\x69\x77\xd1\x07\x1f\
+\x49\x81\x28\x46\x02\xa2\x42\x85\xd4\x8b\x9f\x23\x79\x78\x10\x54\
+\xa1\x04\x09\x06\x30\x99\xbd\x1e\xe3\x2b\x5f\x02\x17\xf4\x47\xc4\
+\x73\x1c\x87\xbf\x7e\x9b\x40\xbe\x21\x57\x02\xea\xf7\x34\xd1\x7f\
+\xfe\x9b\xc2\xc2\xed\x77\xab\x05\x95\x2a\x6c\xb8\x30\x8c\xa7\x47\
+\x46\x20\x28\x95\xe0\x03\x01\x7c\x9b\x99\x89\x53\xab\xb2\xa1\x08\
+\x44\x02\x73\xbb\xee\xbe\x7b\x92\xd0\xf4\x6e\xbd\x04\x38\xac\x03\
+\x34\xbf\x38\x97\x6d\xc3\x28\x6b\xc0\x11\x04\x2f\xb8\x41\x6d\xad\
+\xa0\x2a\x0d\x88\xdf\x0b\x52\x54\x0d\xc5\x2a\x1d\xdb\xa2\x91\xf1\
+\x84\xc5\x3b\xfb\x5c\x28\x30\xea\x25\xa0\xbb\xab\x97\x1a\x4a\xf2\
+\xe0\xf3\x45\xce\x88\xb2\xba\x2b\xcf\xf5\x43\x79\xb4\x0d\x54\xcd\
+\x00\x9f\x17\x81\xc2\x2a\x04\xd6\xe6\x81\xb0\xf5\x58\xdc\xd4\x6a\
+\x15\xec\x47\xfa\xb1\xcd\x54\x2a\x01\x1d\x6d\x87\xa8\xa1\x54\x1e\
+\xd0\xb0\x05\x56\x59\xdb\xc3\x80\xdf\xb8\x1d\x5e\xb6\xd0\xb2\x40\
+\x6f\x3f\x2a\xab\xb6\x4a\xc0\x81\x7d\x9d\x0c\xd8\x2c\x0b\x68\x07\
+\xad\xd0\x5a\x3b\xc2\x80\xc7\x58\x09\xcf\x7a\x63\x0c\xe0\x18\x76\
+\xd4\x54\x48\x40\x4b\x73\x1b\x2d\x7a\x2d\x3f\x3a\xc0\xea\x1e\xef\
+\x3e\x8c\x78\xeb\xc1\x30\x30\x63\x2c\xc7\x8c\xee\xf5\xd0\x7a\x44\
+\x03\x6c\x9f\x38\x51\x5b\x57\x25\x01\x7b\x9b\xf6\x51\xe3\x16\x19\
+\x80\x25\x4d\x1c\xe8\x46\xa2\xf5\x50\x18\xb8\x69\xdc\x8a\x9b\xfa\
+\x6d\xa1\x7e\x34\xc0\xfa\xb1\x13\xbb\xeb\x6b\x24\xa0\xb1\x61\x2f\
+\x03\x8a\x18\xe0\x8b\x0a\x2c\x71\x74\x61\x89\xad\x27\x0c\xdc\x28\
+\x2a\xc3\x8d\x02\x93\x0c\xa0\x66\x80\x0d\x0d\x8d\xbb\xe7\xfd\x07\
+\x6f\x37\x52\x63\x99\x3c\x90\x64\xed\xc4\x52\xbb\x95\xf5\xd5\x2c\
+\xa9\x0f\xd7\x0d\x46\x4c\x19\x2b\xe4\x81\x1e\x1b\x9a\xde\x6b\x90\
+\x80\xba\xda\x7a\xf6\x05\x86\xa8\x80\xc8\x80\x65\x3d\x5d\x58\xea\
+\xb4\x4b\x40\xbe\x01\x57\xcb\x4c\xe0\x64\xbf\xc0\x8e\xe6\x96\x26\
+\x09\xa8\xad\xae\xa3\xc5\x65\xc5\xd1\x01\x8d\x06\x29\x07\x3b\x91\
+\xdc\xef\x60\x98\x9a\x25\xf5\x61\x32\xaf\x00\x13\xe5\x15\xe0\xbc\
+\xd1\x81\xbe\x9e\x3e\xb4\xb4\x36\x4b\xc0\x0e\x73\x2d\x03\x8a\x64\
+\x81\xd4\x0e\x0b\x92\x5d\x03\x12\x90\xab\xc7\x78\xa5\x39\x06\x60\
+\xc3\x01\x4b\x8b\x04\x6c\x37\xbd\x45\x0b\x4a\x0a\x64\x81\x47\x2d\
+\x1d\x48\x71\xbb\x21\xaa\x54\xe0\xd8\x65\x33\xa1\xd3\xe1\x57\x73\
+\xa5\x2c\xe0\x38\xe2\x40\x7b\xd7\x7e\x09\xd8\xa4\xdb\x4c\x2b\x76\
+\x56\x85\x6e\x20\xba\xe8\x8c\x17\xd8\x0b\xe9\xad\x1f\xe2\xe1\x93\
+\x12\xf0\xc7\x2b\x3a\x5c\xae\x7e\x13\xfc\xa2\x09\x91\xdb\x37\x44\
+\xe7\x07\x6d\x38\xee\x3e\x26\x01\xaf\xbe\xbc\x29\x97\x25\x1e\xb8\
+\x3f\xf9\x81\x88\x23\x5b\xe0\x79\x64\x8c\x8d\x21\x63\xe2\xcf\x50\
+\x9f\x17\x04\x8c\xa6\x3c\x84\xd1\xb4\xb4\x50\x7f\x7e\x9b\x3b\xaa\
+\xff\x9e\xbc\x36\x07\xe9\x4f\x9c\x3e\xee\xfa\x1f\xc5\x8c\xed\x28\
+\x04\x47\xff\xd1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x04\xd7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x9e\x49\x44\x41\x54\x78\xda\xad\x95\x7b\x4c\x53\x67\
+\x14\xc0\xcf\xed\xed\xed\xed\x6d\x0b\xb4\xd0\x07\x60\xc1\xd6\x62\
+\x81\xa2\x86\x02\xe2\x46\x91\xa1\x28\x22\x25\x3c\x12\xa9\x38\xb7\
+\x28\x66\x98\xa1\x4e\x37\x45\x17\xdd\xd8\x42\xe6\x96\xb9\xcd\x2d\
+\xc6\x3d\x32\x86\x0e\x45\xb6\xe1\x13\x37\xa3\x06\xe7\xfb\x05\x68\
+\x22\xab\x55\x88\x08\x36\x48\x1f\x80\x60\x7b\x5b\xa1\x50\x7a\xef\
+\xae\x6c\x2e\x33\x8b\xb3\x12\xce\x1f\x5f\xf2\xe5\x3b\xe7\xfc\xce\
+\x77\x1e\xdf\x87\xc0\x38\x65\xd7\x2f\xf5\xe5\x32\x89\x64\x8b\x48\
+\x22\xd3\xe8\x66\x44\xdd\x7b\x96\x1e\xf2\xa2\x8e\xd3\x73\x0c\x92\
+\xd2\x95\x2b\xcc\xa9\x73\xe6\xf1\x7a\x6d\x56\xd0\xaa\x23\xff\xd7\
+\xc7\x0b\x01\x38\x32\x05\xb2\x65\xc3\xda\x96\xd2\xb5\xef\xcc\xf0\
+\x8d\xd2\x60\xb5\x5a\x3d\x49\x6a\x39\x31\x61\x00\x61\xc4\x54\x7d\
+\xfd\xe1\x83\xc7\xd4\xb1\xd3\x81\x66\xf6\x2d\x46\x63\x8b\x3e\x25\
+\x5e\x3b\x61\x80\x97\xe7\x2e\xfc\x6c\x57\xf5\x9e\x8d\x02\x61\x30\
+\x60\x6c\x14\xf6\x1f\x38\x58\xbd\x6e\x59\x61\xf1\x84\x00\x82\x14\
+\x71\x48\x52\x9c\xfa\xd0\x0f\x7b\x7e\x2a\x78\x1c\xfd\xa8\xd7\x03\
+\x0d\xe7\xae\xac\x7e\x6b\x89\xfe\xdb\x09\x01\x04\xab\x93\xb0\x64\
+\x8d\xb2\xe9\xc7\xda\x3a\xad\xcb\x3d\x08\x0f\x1f\xf4\xc0\xa5\xeb\
+\xa6\xe4\x0d\xcb\xf2\xae\x4d\xd0\x0d\x34\x82\xf4\xe4\xc4\x9b\xdf\
+\xed\xde\xab\x20\x49\x12\x6c\xf7\xef\xc1\x9c\x59\xf1\xcf\xb5\xf7\
+\x1b\xc0\x97\xab\x15\x4b\x0b\x72\x2e\xbe\xfb\xe1\x56\xf9\x88\xd7\
+\x0b\x77\x4c\x26\x77\xde\x7c\x5d\xc0\xbf\x75\xbe\xda\xf7\x9b\x06\
+\x47\xe9\x4c\x36\xc0\x7c\xcd\xb4\xb8\x54\xbb\xa5\x3b\xf0\x3f\x80\
+\x50\xc3\x61\xbe\x38\x10\x09\x31\x55\x15\x74\x3d\x75\x20\x0a\x4f\
+\x78\x7f\xfd\xba\x93\x86\xe5\x25\x12\x9c\x83\xc1\xaf\xf5\x47\x9a\
+\x50\x81\xf0\x3d\xda\x33\x54\x24\x97\x89\x75\x61\x61\xb2\x58\x0e\
+\x4e\x80\x44\x1a\x0a\x82\x00\x1e\xa0\x18\x40\x5d\x6d\xdd\xa9\x7f\
+\x00\x11\x73\xbf\x59\x8c\x4e\x51\xed\x0d\x14\x71\x39\x18\x9f\x03\
+\x1c\x0e\x02\xb4\x97\xea\x75\x8f\x22\xe5\xa6\x8f\x52\x2a\x75\x0b\
+\x72\x0d\x79\x39\xfa\xea\xf9\xfa\x3c\x02\xc7\x71\xb8\x7c\xf6\x34\
+\x24\x26\xcf\x82\x60\x89\x0c\x50\x04\x01\x8a\xf1\xc4\xfa\x3b\x29\
+\x5c\x02\x85\xeb\x4d\xd7\xe1\x72\x63\x73\xf4\x18\x20\x32\x61\xc3\
+\x1a\x7c\x66\xe6\x4e\x4e\x78\x00\xb8\xba\xcc\x56\x5f\x67\xab\x0b\
+\x0b\x9b\x36\x29\x5a\x37\x5d\xa0\x92\x10\x40\xda\xbb\x21\x77\x52\
+\x0f\xf4\xbb\x47\x81\xe0\x0b\x60\xca\x94\x28\x70\x3a\x1d\xa0\x54\
+\x4d\x05\x0c\x63\x03\x86\x73\x81\xc0\x39\xc0\xe3\x01\x3c\xec\x1f\
+\x82\xe6\xab\x97\xa0\xe1\xf7\x33\x25\x55\x3b\x3e\xad\x62\xd8\x20\
+\x56\x64\x57\xb6\x8b\x67\x6b\x85\x7d\x16\xf3\x21\xf3\xd7\x85\xab\
+\x30\x0c\x42\x7c\x5e\xc8\x95\xc4\x6f\x5a\x93\x5a\xf6\xa6\x9c\xa2\
+\x58\x90\x45\x37\x02\x8b\x89\xfc\x7c\xc3\x09\x48\xcf\xcc\x86\x98\
+\xe8\x18\x26\x64\x04\xdc\x2e\x27\x38\x1e\x3a\xa0\xe3\xee\x9d\xde\
+\xf6\xd6\xdb\x8f\xfa\x06\x9c\x17\x9a\x6e\xfc\xb1\xed\x41\x87\xa9\
+\xf5\x49\x91\xd3\x63\x97\xd4\x9f\x8d\x48\x51\x82\xc7\x47\xa5\x5c\
+\x78\x5b\x7b\xf5\xf1\x01\x97\x8f\xb2\x78\xd2\xc2\xcb\xda\x8d\x1f\
+\xbc\xc4\x27\x70\x58\x40\x1e\xf1\x45\x28\x94\xa8\x66\x46\x02\x18\
+\x6f\xb5\xc2\xb6\xcf\xbf\xac\xe9\x27\x5d\x66\xab\xb5\xa7\xcb\x4b\
+\xd1\x16\x14\x63\xdf\x47\x28\xda\x3c\x64\xef\x74\x3f\xd5\x45\x0c\
+\x21\x43\x91\xf5\x7d\x9d\x3c\x63\x66\x88\x17\xa1\x8e\x36\x96\x25\
+\xe5\x8f\x15\x3b\xad\xa2\x28\x28\x3a\xe1\xe7\x18\x9d\x06\x6e\x9c\
+\x39\x76\xc0\xd1\x61\x14\xcc\x7c\xb5\x6c\x21\x8a\x21\x10\xe9\xb5\
+\x3a\xab\x56\xcf\x15\xfa\xd3\x7d\x08\x8b\x0d\xf2\x20\x59\x56\xb5\
+\x6c\xd1\xe6\x0c\x8e\x08\x85\xe1\xc1\x61\x0a\xa1\xf0\x21\x2e\xce\
+\xe2\xe3\xc1\x3c\xe8\xbd\x75\xe3\xf8\x90\xa3\xaf\x27\x31\x77\x51\
+\x31\xc6\x54\x91\xc7\x2c\x5c\xe6\x25\xba\x6d\x7b\x54\xdc\xb8\x7e\
+\x5a\xb5\x5f\x73\xc0\x5c\x63\xb1\x50\x65\x58\x25\x7e\xe5\x8d\x34\
+\x34\x90\x00\x14\xc7\x80\x1c\xe8\x1b\xf0\xdc\xbd\xb8\x75\xd0\x72\
+\xb3\x37\x76\xf9\xc7\xfb\x48\xfb\x00\xf4\x9d\xd8\xdf\x86\x87\xc8\
+\x85\x9a\xa2\xfc\x50\x0f\xe9\x1a\xb9\x52\xae\xc3\xfd\x1e\x34\x16\
+\x0a\x89\x28\x05\xf1\x2c\x42\xca\x41\x69\x8f\x6d\xd8\x43\x9e\xa7\
+\x69\x20\x95\xaf\xd7\xdc\x0e\x9c\xaa\x56\x5b\x4e\x9c\xaa\x70\xb6\
+\x94\x7f\x41\x8d\xd0\x6b\xa4\xfa\xca\x4d\xe1\xa9\x5a\x11\xd2\xd3\
+\xaf\x6a\xde\x9e\xd5\x39\xee\x49\x66\x66\x25\x6d\x72\x59\xe3\x79\
+\xb6\xd7\x0d\x6d\x3b\xe6\x21\x7f\x15\x1f\x0f\x27\x62\x57\x34\x44\
+\xe6\x17\xc7\xd1\x5d\xd6\x7c\x63\x65\xfe\xd1\x71\x03\x08\x8c\xf5\
+\x5a\x68\xe9\xb9\x1a\x0c\xf3\xc0\x9d\xed\x99\x4f\x74\x59\x93\x73\
+\x3e\x31\x06\xc4\xcf\x8e\x1b\xbe\x67\xd7\xb7\xd7\x16\x1e\x1f\x37\
+\x80\x69\xf3\x25\xaa\xa5\x87\x76\x63\x4a\x09\x97\x83\xc2\x69\x81\
+\x54\x54\x66\x6f\x6b\x35\xb0\x84\x93\x36\xfb\x7a\x9d\xe0\x34\x77\
+\xe3\x0f\x4e\xae\x1c\x19\x7f\x8a\xb8\x58\x0c\x21\xcd\xd8\x19\x96\
+\xbd\x79\x9e\x24\x2a\x00\x82\x04\x6c\x70\xb8\x47\xc0\x6e\x21\xc1\
+\xd7\x69\xab\x32\x1f\x5d\x5a\xe2\x77\x91\x9f\x25\x28\x1b\x0a\x78\
+\xe2\xd4\x92\xe0\xe9\x45\x49\x7c\x71\xb8\x64\x74\xd0\xe5\x71\x59\
+\x3b\xab\x6d\xd7\x2a\x4a\x9f\x67\xeb\x17\x60\x2c\x55\x6c\x08\x45\
+\x68\xd0\x50\x14\xf3\x9e\xd1\xd0\xc6\xfc\x68\xdd\xfe\xd8\x3d\x96\
+\x3f\x01\xe7\xb2\xa9\xa6\x50\x81\xbc\x1a\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xcc\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x93\x49\x44\x41\x54\x78\xda\x9d\x95\x7d\x4c\x55\x75\
+\x18\xc7\xbf\xbf\xf3\x76\xef\x01\xee\x45\x20\x11\xb8\x17\x70\x57\
+\x51\xd3\x36\x24\x45\x18\x99\x90\x30\x25\xbd\xf4\xe2\x70\x46\x2d\
+\x2d\xdb\xea\x0f\xa1\xfe\x6a\x86\xc5\x94\x94\xfe\x68\x83\x2d\x85\
+\x56\x6d\x6d\x32\x94\xb9\x5e\x86\x68\xb6\x74\x51\xb9\x88\x29\x8a\
+\x42\xd4\x72\x24\xa2\x80\x13\xf2\x05\xf1\x72\x2f\xdc\x73\xee\x39\
+\xa7\xe7\x5c\x2a\xbd\x35\xe0\xd2\xb3\xdd\xdd\xb3\xf3\x7b\xf9\x3c\
+\xcf\xf3\x7d\x9e\xe7\x30\x4c\x63\x51\xc5\xa7\x64\x0d\xd8\xa3\x70\
+\x62\xfe\x43\xce\x39\x2b\x1c\x2e\x3b\x78\x89\xc3\xcd\x3b\x2a\x46\
+\x47\x03\x1d\xb2\x4d\x6a\x89\x88\x14\xf6\x5c\x7e\x63\xfe\xf8\x54\
+\x77\xb0\xa9\x16\xf8\xc2\xe6\x03\x4c\x8e\x28\x7d\xb5\x34\x03\xc5\
+\xab\xe2\x60\x11\x00\x5d\x07\x0c\x03\xb0\xd1\x73\x40\x05\x9a\x7a\
+\xc7\x70\xf8\xc7\xbb\xe0\x38\x56\xdb\xb7\xc3\x59\x16\x3e\xe0\xb1\
+\x23\x03\x6b\xb6\x66\x39\x2b\xb6\xce\xc7\xef\xe4\xdb\x98\x42\x17\
+\xeb\xc6\x3f\xcb\xc1\x27\xc6\x90\x20\x02\xcb\x64\xe0\xe3\x2e\x0f\
+\x5a\xba\xbd\x83\x7d\xaf\x25\x26\xcf\x0c\x58\xd5\x30\xb0\x69\x57\
+\x81\x73\x73\x41\x02\xae\x79\x8c\xa0\xcb\x1c\xed\xe2\xe8\x42\x8e\
+\x9b\x8c\x40\x0f\xbe\x36\x82\xff\x94\x42\x2c\x91\x39\x74\x0f\xf9\
+\xd0\xd8\xee\x1d\xec\xd9\x16\x9f\x3c\x35\x20\xa7\xe1\x40\x46\xf1\
+\xca\xd2\x57\x5e\x5e\x82\x3b\x5e\x0d\x8c\x2e\xa0\xf0\x61\xb5\x72\
+\xb8\x74\xdd\x87\xc1\x21\x3f\x78\x81\xc1\x31\xcf\x8a\x85\x73\x2d\
+\x50\x54\x82\x10\x85\x32\x87\x24\x0b\x87\xf3\xfd\x5e\xb4\x5d\x55\
+\x6b\xbb\x8b\x63\xcb\xfe\x0b\xc8\x6b\x8c\x82\xc6\x79\xf6\x1f\xdd\
+\x82\x3f\x7c\x93\xc9\x16\x78\x12\xd4\x13\x40\x43\x4d\x17\x0c\x9f\
+\xbf\x5d\x88\x14\x8f\xf3\x56\x09\x4c\x14\x8a\xac\xf1\x51\xab\x9e\
+\x79\x36\x09\xb1\x56\x01\xda\x5f\xd1\x2c\x26\x47\xf6\x9f\x1d\x05\
+\x27\x70\xb6\x73\x1b\xa2\xc7\x42\x01\x39\x0d\xb5\x2b\xb6\xe7\xee\
+\x58\x5f\xe8\x84\xea\xd7\xc0\xf3\x0c\x43\xf7\x02\xf8\xac\xaa\x0d\
+\xa2\xc0\x2d\x1f\x3d\x9c\xd7\xf5\x60\xb0\xce\xbd\x3d\xe9\xcc\x22\
+\x76\xba\x8b\x12\x61\x27\x88\x19\x09\xa3\x34\x8e\x93\x60\x3f\xf5\
+\xab\x75\x17\xdc\xd1\xa5\xa1\x80\xcc\x83\xbd\xdb\xea\x9f\x77\x45\
+\x53\x0a\xcc\xcd\xd6\x08\x01\x75\x3b\x4f\x83\x57\xd4\xe5\x63\x5f\
+\xae\x0b\xb9\xfc\x6f\x73\x55\x5f\x49\xe7\xac\x52\x67\x51\x61\x02\
+\x54\x55\x0f\x8a\x6f\xa7\x0a\xfb\xe6\xd2\x38\x2e\xba\xa3\x59\x28\
+\x60\x7d\xb3\x51\xf6\x51\x51\xd0\x03\x33\xef\xb7\x46\x55\x1c\xdb\
+\xf7\x43\x7b\xe0\x6b\x77\xd6\x74\xbd\x32\xbf\xe6\xaa\x91\x93\x1b\
+\x8f\x48\xd2\xc0\x2c\x00\x9e\xce\x76\x0e\xfa\x71\x76\xbd\x3d\x14\
+\x10\xf5\xe2\x77\xc6\x73\xbb\x56\x43\x19\x0f\x90\x90\x24\x58\xdb\
+\x4d\xf4\x9c\xf8\xb9\xc2\x7f\x7c\xe3\xbe\xe9\x00\x0b\x6b\xfa\x8d\
+\xd4\x65\x76\xa4\x26\x59\xa0\x6b\x08\x56\x5c\xef\xed\x00\x4e\xaf\
+\xb5\x85\x02\xe4\x17\xbe\x37\x9e\x7e\x33\x07\xca\xc4\x24\xe0\x97\
+\x33\x37\xd1\x77\xaa\xfb\x9d\x89\x63\x1b\xab\xa6\x03\xb8\xaa\xaf\
+\xfd\xca\xc9\xfc\x52\x9e\x3a\x51\x90\xf9\xe0\x4f\x22\x4d\xce\x3d\
+\xf9\xaf\x08\xb8\x75\x47\x0d\xf7\x7b\x85\x50\x7c\x2a\x18\xb9\x71\
+\x97\x04\xee\xa8\x6b\xbd\xa2\x9c\x70\x2f\x30\xd7\x6d\x5b\x5b\x0d\
+\x41\x14\x30\xf2\x69\x36\xc3\x2c\xec\xfe\xe6\xac\x83\xbd\xd9\x95\
+\x9b\x5c\xb2\xc4\x82\x9d\x64\x7a\x74\xb1\xfe\x22\xfc\x23\xde\x02\
+\x12\xb9\xc5\x04\xec\xaf\xca\x44\x69\xf9\x19\x78\x0f\xe5\x86\x0d\
+\xb9\xbf\x71\x75\x43\xed\xdc\xdc\x15\x3b\x5c\x79\xc9\xd0\x55\x0d\
+\x06\x95\xdc\x62\x4a\xe3\x57\x1f\x76\x98\xe2\xe5\x18\xa2\xd8\xb6\
+\xfb\xed\x0c\xc4\x51\x75\x95\x96\xb7\x83\x9b\xd0\x92\x3d\x5f\xe4\
+\x0d\x86\x0f\xc8\x6b\xb4\x51\xa3\xdd\x7b\x64\xe7\x06\xb0\x80\x46\
+\x41\x18\x34\x06\x18\xd6\x3a\x45\x9c\x3e\x39\x80\xfe\x9e\xdb\x58\
+\xea\x5e\x84\xa4\x78\x2b\xb6\x2f\x8b\xc2\xf6\x8a\xf3\xf0\x0d\x7b\
+\x4a\xbc\x4d\xf9\x47\xc2\x03\x98\xf6\xf8\xa1\x3d\xb2\x33\x65\xb7\
+\x73\x4b\x3a\x0c\x12\xdb\x84\x04\xa8\xa9\xb3\xd3\x64\x64\xc7\x30\
+\x5c\xb8\xa5\xe1\x64\x87\x07\x56\x0b\xf0\xfe\x53\x89\xa8\xf8\xe4\
+\x37\xdc\xb8\x30\x7c\xc4\xdb\xf4\x44\x49\x78\x00\x53\xec\x35\x8d\
+\x83\x11\x8b\x5c\x0e\x5b\x41\x1a\x0c\xea\x68\x73\xa8\x69\xa4\x89\
+\x66\xd6\xb8\x39\x74\xa8\xa1\x54\x8f\x02\x7b\xac\x84\xcd\x59\x36\
+\x1c\x6b\x1e\xc0\xd0\x65\xdf\xf5\xb1\xfa\x95\xce\xb0\x00\xa6\x89\
+\xf9\x9f\x77\x8a\x29\xce\x74\x29\xdb\x05\x83\xa7\x4d\x93\xe3\x33\
+\x38\xa7\x0d\x4d\x87\x3e\xae\x43\xa3\x86\x8c\x73\xc8\x78\x38\x55\
+\x42\x54\xc0\x40\xdb\x59\x8f\x6f\xa8\xd2\x15\x19\x16\xc0\x34\xb9\
+\xe8\xf8\xbb\x9c\x24\x56\x70\x29\x89\x08\x38\xe6\x40\x97\xc5\x60\
+\x75\x31\x33\x14\xca\x9b\xae\x10\x64\x42\x83\xe4\x53\x30\x47\xe6\
+\xba\x6e\xec\x5d\xbc\x3c\xec\x08\x1e\xb4\x98\x92\x6f\x5f\x67\x92\
+\xf4\x81\xc0\x38\xdc\x5e\xe4\x80\x26\x08\xe6\xd7\x87\x3e\x04\x3a\
+\xe2\x08\x64\x17\xf5\xda\xbe\xf2\xb4\xb2\xa9\xce\x87\x5d\xcf\xf1\
+\x2f\xb5\x1a\x23\x69\x49\x50\xa9\x3f\x38\xba\x3f\x61\x42\x81\x45\
+\x62\x25\x7d\x6f\x2d\x98\x45\x15\xcd\x00\xb8\x43\x11\x98\x36\x6f\
+\xdc\x4b\x43\x4d\x48\xe9\xaf\x5c\x32\x30\xd3\xb9\x59\x01\xfc\xf3\
+\x62\x48\x50\x3f\xae\x57\x3f\xfa\x3f\x3a\x39\x0c\x00\x8b\xb4\x60\
+\xb8\x2e\x73\x56\xb3\xe8\x4f\x4d\x02\xdc\x28\xe3\xf8\x7a\xec\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x5a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x21\x49\x44\x41\x54\x78\xda\xa5\x94\x6b\x4c\x14\x67\
+\x14\x86\xdf\x99\xd9\xd9\xbb\xbb\x2b\x11\x10\x58\x50\x11\x2f\x5c\
+\x77\x51\x2b\xa5\xb6\x4a\x1b\x5d\xb5\x16\x2f\xa8\x78\x8d\x8d\x55\
+\x30\xa9\xda\x80\xd8\x2a\x1a\x6a\xdb\x68\x8b\x35\x6a\xb4\x48\xda\
+\xa0\x88\x8d\xb6\xd5\x14\x35\x8d\x55\x09\x14\xfd\xe1\x05\x5b\x50\
+\xd8\x1f\x95\xb5\x28\xe0\x65\x97\x45\x0a\xbb\xc0\x2e\xec\xec\xce\
+\x4c\xbf\xdd\xf6\x0f\x36\xde\x70\x92\x93\x99\xc9\x39\xdf\xf7\xcc\
+\xfb\xce\xf9\x0e\x85\x17\xb8\x0c\x06\x03\x1b\x13\x13\x93\xa5\xd7\
+\xeb\x57\x68\x34\x9a\xe1\xd7\xae\x5d\x6b\xbb\x7c\xf9\xf2\x5e\x9e\
+\xe7\x4f\x3f\x6f\x2d\xf5\x22\x80\x94\x94\x94\xdd\x59\x59\x59\x9f\
+\xa8\xd5\xea\xc0\x3b\xc7\x71\x28\x2e\x2e\x46\x4d\x4d\xcd\x0a\xf2\
+\xfa\xc3\x2b\x01\x22\x22\x22\x12\x22\x23\xa3\x7e\x0d\x0e\x0e\x8e\
+\x12\x04\x1e\x9d\x9d\x9d\xd0\x6a\xb5\xb0\xd9\x6c\x68\x68\x68\xb8\
+\x48\x4a\x96\x92\x70\xbe\x8a\x82\x69\x8b\x32\x16\x54\x2f\x5e\x92\
+\x49\xe7\xe7\x17\xa0\xb0\x70\x17\x6e\xd6\xd5\x62\xdf\xfe\x83\x44\
+\x89\xc7\xea\x17\x48\xe2\xe1\xab\x00\xd2\xbe\xf8\x6c\x7b\x75\x42\
+\x82\x81\xda\x96\xbf\x0d\x1f\xe5\xe4\x62\x82\x31\x01\xb9\x9b\xb7\
+\xe0\xfa\xf5\x9a\x5e\x92\x4f\x26\xd1\x34\x78\x00\xa3\x9c\xf2\x75\
+\xf6\x84\xaa\x8c\x29\x31\x72\x81\x09\x82\xd9\xdc\x00\x68\x43\x50\
+\xf2\x5b\x07\x2a\x2a\x2b\xfd\x80\x24\x12\xcd\x83\x06\xbc\x1d\xa7\
+\x49\x5d\x39\x6b\x58\xd5\x07\xeb\x26\x2a\x01\x3d\xd0\xf7\x27\x7a\
+\x6c\x8f\xb0\xbc\xa0\x19\xe7\x6a\x5d\xfd\xa4\x24\x9e\xc4\xbd\x41\
+\x03\x0c\x23\x34\x33\xd7\xce\xf5\x5d\xcc\x5e\x10\x0d\x49\x70\x3b\
+\xba\x1f\x0c\x03\x07\x0f\xf2\x4b\x74\x28\x3d\x53\x07\x86\xa1\xc7\
+\xf3\xbc\x60\x19\x2c\x40\x42\x62\xdf\xe6\xdc\x9c\x8d\x39\xd3\x9d\
+\x70\x3e\x3e\x0e\x01\x93\x31\x3a\xfd\x24\xf6\x1f\x3a\x8a\xed\x9f\
+\x16\x10\x00\x73\x21\x29\x29\x29\xfd\xd6\xad\x5b\xfc\x4b\x03\x12\
+\x13\x13\x0d\x16\x4b\xe3\xcd\xd2\xd2\x52\x7a\xfe\x7b\x33\xd1\xd9\
+\xde\x01\x56\x46\x43\x17\x3c\x12\xf5\x75\x57\xb1\x6c\xe5\x6a\xb4\
+\xb4\xde\x07\x01\x1c\x30\x9b\xcd\x39\x2f\x05\x48\x4d\x4d\x8d\x70\
+\x3a\x9d\x35\xc4\x02\xfd\xf1\x63\x47\x10\x12\x1a\x06\xd0\x52\xd0\
+\x44\x83\xd7\xcb\x41\xc2\x50\xc8\xc9\xcd\xc3\x4f\xa7\x7e\x46\x5c\
+\x5c\xbc\x4f\x14\x85\xbc\xdb\xb7\x6f\x1f\x7c\x61\xc0\xb4\x69\x53\
+\xcf\xd8\xed\xed\xf3\x4d\x26\x13\x76\x17\x7e\x05\x51\x24\x0d\x25\
+\x91\x04\x72\xfe\x93\xcc\xf3\x3e\x54\x55\x55\x61\xfd\x86\x8d\x00\
+\xc9\x45\x45\x45\x3e\x68\x6c\x6c\xcc\xe8\xe9\xe9\xa9\x7d\x2e\x80\
+\x58\x63\x52\xa9\x54\xa7\xdc\xee\x3e\xed\xd1\xb2\x32\x18\x8d\x06\
+\x78\x39\x2f\x28\x9a\x0a\x6c\x46\x51\x54\x00\xd0\xe5\xe8\xc6\xba\
+\xec\x2c\x5c\xba\x54\x1d\x38\xdd\x0a\x85\xa2\xb8\xa9\xa9\x69\xfd\
+\x73\x01\x46\xa3\xf1\x2c\xcb\xb2\xf3\x62\x63\xc7\xa1\xa8\xa8\x98\
+\x6c\xc6\x43\x2a\x93\x81\xa6\xe9\xc0\x02\xd1\x2f\x87\x5c\x6e\xb7\
+\x1b\xe7\xcf\x9f\xc7\xa6\x4d\x9b\xe0\x70\x38\x40\x66\xd5\x5f\x24\
+\x97\x4e\x9e\x2d\x4f\x05\x48\x24\x4c\x74\x6c\x6c\xfc\xb9\x88\xf0\
+\xb0\xd8\x65\x4b\x17\x61\xc6\x74\x13\xb1\x86\x85\x42\xa5\x22\xbe\
+\x33\x81\x1a\x3f\xc0\x0f\x75\x3a\xba\xd0\x6e\x6f\xc7\xbc\x05\x19\
+\xb0\xdb\xed\x64\xad\x04\x12\x96\x35\x11\x9b\x2a\x9f\xa5\x60\x3c\
+\x2d\x0b\xfa\x65\xe1\xc2\xb9\x63\x56\x2d\x9e\x8d\xc4\xf8\x38\x88\
+\x34\x03\xb9\x42\x01\x56\x22\xf3\xfb\x43\x4a\x04\x70\x1e\x0f\x3c\
+\x3c\x85\x9b\x7f\xdc\xc0\xce\x5d\x85\x01\xfb\xda\xda\xec\xb0\x5a\
+\xad\xef\x92\x82\x0b\x4f\x05\x64\xcf\x1c\x3b\x27\x34\x7a\xf4\x8f\
+\xfd\x8e\xde\x21\x62\xf8\x6b\xd8\xb1\x75\x23\x99\xa0\x0e\x08\xa2\
+\x40\x7a\x9e\x25\xfb\xd3\x7e\x0d\xf0\x91\x7e\x1a\xe2\xeb\x44\xc9\
+\x81\x2f\x71\xfc\x8a\x15\x02\xc5\xa0\xa9\xb5\xa3\x6b\xce\x78\xda\
+\x74\xf6\x46\x4b\xed\xff\x00\x6d\x7b\xde\x62\x15\x4a\x6a\xbe\x66\
+\xd2\xeb\xdb\x30\x36\xcd\xf8\xf7\x8d\x4a\xac\xdb\x51\x8e\xa4\x59\
+\xab\xf0\xf1\xfa\xf7\xd1\xeb\x72\x07\x6c\xf1\xff\x60\x91\x84\x40\
+\x2b\x11\xd4\x5c\x8e\x96\x7b\x66\x7c\x7e\xd2\x82\x71\x23\x42\x10\
+\x17\xd1\xe7\x7d\x33\xdc\x73\x20\x9c\x56\x16\x50\x6b\xab\xfb\x07\
+\x00\xba\x0e\xbe\xb1\x6f\x48\xe4\xa8\x0f\xe9\xe8\x77\x64\x14\x4d\
+\xda\x91\xed\xc3\xb9\x23\xdf\x22\x7d\x4f\x3d\xbe\xd9\xbb\x13\x1b\
+\xb2\x56\x10\x48\xff\xbf\x0a\x48\x9e\x17\x28\x30\xf5\x87\xa1\x90\
+\x38\xe0\xa4\x15\x50\xaa\x59\xc8\x18\x33\x3c\x0f\x1f\xf5\x74\x35\
+\xa9\x93\xc3\xf2\xae\xde\x1d\x00\x70\x1e\x4e\xa9\xd0\xe8\x83\x4c\
+\xd0\x90\xf1\x2e\x92\x9f\x49\x89\xe0\x5c\x36\x64\xe5\x9f\x80\x3c\
+\x79\x21\xbe\x3b\xb4\x13\xf0\x08\xe0\xc1\x90\xfd\x89\x55\x3e\x2f\
+\xbc\x57\x0a\x21\xe1\x2c\xa0\x82\xb4\xe4\x83\xdc\x00\x4f\x86\xaa\
+\xba\x07\x4e\x4b\x50\x99\x2e\xb3\x7e\xf5\x00\x40\x4f\xb9\xf1\xac\
+\x7a\x78\xf7\x3c\x70\x21\xa4\x95\xa2\x49\xb1\x1c\xf0\x0a\xf0\x74\
+\x91\x2f\x8c\x5c\x84\xa1\x13\x4d\x60\x59\xe9\x7f\x4b\xa4\x68\xbd\
+\x73\x07\xf2\x86\xad\x08\x1d\xda\x02\x22\x83\x04\x71\x44\xed\x86\
+\xa8\xf4\x0a\xfd\x36\x55\xb9\x72\x72\x73\xe6\x40\x05\x55\x31\xad\
+\x9a\x78\x67\x14\x38\x62\x81\x5b\x01\xf4\xea\x80\x7e\x72\xa7\x79\
+\x5c\xff\x1d\x38\x61\x1e\x83\x51\x63\x62\x20\xf0\x5e\xd8\x48\xb7\
+\x3c\x6c\x7e\x8c\xbc\xcc\xbb\x48\x99\xe4\xb7\xda\x03\xa8\x38\x12\
+\xa8\xf1\x76\x48\x8b\xbc\x1d\xf2\xd3\xaa\xa9\x4d\x7d\x03\x00\x8f\
+\x2b\xa2\xd3\x74\x89\x4e\x7d\xb7\x45\x97\xcc\x2a\xfb\xc3\xd4\x61\
+\xbe\x19\x14\x43\xe9\x20\x55\x49\x2a\xca\xfa\x4e\x2d\xd9\x62\x2d\
+\xf1\xc8\x35\x5a\x9a\xe2\xe1\x76\xb9\xb8\x35\xe9\xf2\x91\x87\x8b\
+\x82\xb6\x42\xea\x0b\x87\x8c\x83\xe8\x92\x99\xc1\x50\xb3\xe9\xf0\
+\x36\xeb\x33\x4f\xf2\xfd\x63\xf1\x8c\x3c\xd4\x45\xcb\x86\x7a\xd7\
+\x90\xec\x74\x9a\xa2\xee\x48\x45\xa6\x5c\x36\xb9\xb5\xee\xc9\x5a\
+\xb1\x55\x9f\x09\x8e\x5f\x4e\x86\xfa\x55\x91\xc6\xf7\xf4\x08\x9b\
+\xfd\xc9\x9a\x7f\x00\xc9\xe2\x03\x37\xe1\x3b\x2a\x76\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x19\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xe0\x49\x44\x41\x54\x78\xda\xa5\x55\x6b\x50\x54\x65\
+\x18\x7e\xbe\xdd\x73\xce\xee\x02\xeb\xe2\x85\xfc\x91\xa5\x93\xff\
+\xb2\x99\x46\x47\x48\xc9\x04\x53\xb2\xc0\xbb\xa9\xd3\x04\x0d\x6e\
+\x6a\xe0\x65\x18\xc4\xc5\x06\xaf\x80\x20\x72\x33\x19\x58\x15\xc1\
+\x35\xc0\xbb\x88\xb2\x2a\x19\xda\x18\x95\xa4\x68\x99\x33\x4d\xcd\
+\x30\x34\x69\x90\x44\x90\x2e\x57\xd9\xcb\x39\xbd\xdf\x01\xb7\xcb\
+\x40\x13\xf8\xee\x9c\xd9\xb3\xfb\x7c\xe7\x7d\xbe\xe7\x79\xdf\xf7\
+\x3b\x0c\x4f\x19\x0b\xdf\x8d\x79\xf9\x8f\xb6\x87\x73\x6b\xaa\x4e\
+\x4c\xa1\x9f\x81\x74\xbd\x50\xff\xd3\x3d\xc4\x25\x26\x1b\xab\xca\
+\x6d\x9d\xec\xff\x26\x9a\xbd\x20\xd2\x74\xb6\xc4\x3a\x7d\x84\xc9\
+\xf8\x0a\xfd\x8c\xe0\xc9\x56\xc7\x6f\xc7\xfd\x7b\xf7\xb1\x29\x6e\
+\x0d\xc2\x42\x82\xd1\xeb\x74\x41\xab\xd5\x60\xfe\x8a\x55\x60\x0c\
+\x51\x55\x67\x8e\x94\x0d\x48\xa0\x28\xca\x44\xfa\x9a\x46\x57\x50\
+\xf9\xc5\xea\x69\x87\x6c\xc7\x83\x02\x02\x02\x50\xba\x7f\x8f\x77\
+\xcd\xe9\xca\xcb\x38\x50\x5c\x8a\x09\xcf\x3d\x0f\xeb\xde\x14\x3c\
+\x7a\xe8\x80\x20\x88\xd8\x9d\x6b\xc5\xed\x3b\x77\x20\x68\x84\xf4\
+\x2b\xf6\xa3\x5b\xd8\xe2\xc8\xd8\xf1\x5c\x29\x25\x0d\x72\xb4\x77\
+\x4e\x3b\x94\xb7\x6b\xe2\xc4\x09\xe3\xd5\x24\xbd\xce\x5e\xbc\xb9\
+\xd4\x0c\x0d\x6d\xa7\xe4\x60\x0e\x46\xf9\xfb\xc3\xe9\x76\xa3\xe9\
+\x41\x0b\x56\xaf\xdf\x44\x3b\x01\xf2\x3f\x4a\x87\x41\xaf\x83\xdb\
+\xad\xe0\xe6\x37\x77\x51\x58\x58\x04\x83\xc1\x40\x4f\xcb\x0b\xae\
+\x55\x95\xdb\x39\x81\xc2\x93\x39\x49\xde\xac\x90\x57\x91\xb0\x36\
+\x9a\x16\xbb\x21\xd3\xd3\x1b\x2c\xa9\xa8\x6f\x68\xc0\x92\x05\x11\
+\x58\xb1\x28\x1c\x1d\xdd\x9d\x94\x94\x61\xe5\x07\x1b\x49\xa5\x0b\
+\x11\xf3\xc2\x11\x32\x63\x3a\xba\xba\x1f\xd7\x49\x1a\xa1\x36\x2d\
+\x3b\xf7\x66\x4f\x57\xc7\xd7\x35\x97\x2b\x1a\x9e\x28\x65\x4b\x88\
+\xc0\x23\xcb\xe8\xed\x75\xe2\x4c\x99\x15\x5d\x9d\xdd\x60\x1a\x0d\
+\xca\x4e\x56\xa2\xe2\x7c\x25\x4c\x26\x7f\x64\xa4\x24\xf1\x24\x70\
+\x79\x3c\x8f\x8e\x9d\x3e\xd7\xf0\xed\xad\x1b\x76\xc6\xd8\x8d\xe0\
+\xd7\x42\x6b\xb3\x77\x6e\x72\xfc\x57\xed\x58\xf8\xf2\xe8\x9b\x5d\
+\xed\x5d\x81\xbb\x53\xb7\x62\xd4\x48\x13\x1e\x3f\x76\xa2\xfe\xe7\
+\xfb\xc8\xc8\xc8\xf9\x41\xa7\x93\x1a\x66\xcf\x09\xbb\x31\x2b\x34\
+\xd8\xfe\xfa\xf4\x29\xdf\x0d\xa7\xcb\xd8\xac\xb7\xde\x3e\xf5\xe2\
+\xa4\x49\xcb\xe2\xd7\xad\xaa\x57\xa0\xd4\x1a\xf4\xfa\x3a\x83\x4e\
+\x3c\xbf\x2c\x7a\x83\x4e\xaf\xd7\x6b\xb7\x24\xac\xd5\x06\x07\x4d\
+\x96\x68\xad\x96\x2e\xcd\x27\x57\xbf\xc0\xde\x82\x62\xea\x16\x2d\
+\x36\xc7\xc7\x22\x24\x78\xaa\x37\x59\x15\xc7\xf2\x8b\xe0\xeb\xeb\
+\xc3\x98\x2c\xb7\x57\x1c\x2f\xfc\x91\xd7\x60\xa3\x20\x8a\x39\x87\
+\xf3\x76\xc3\x87\x8a\xc3\xfd\x97\x74\x22\xf2\x8b\x8f\xc1\x7e\xf1\
+\x53\xe8\x7d\xf4\x28\x29\xc8\x24\xcc\x07\xdc\x4a\x2d\xd9\xb7\x6e\
+\x73\x32\x1a\x1b\x9b\xd4\xae\xf9\xf8\x60\x16\xfc\x38\xe6\xe9\xc3\
+\x62\x2c\x3b\xd0\x44\x98\x28\x8a\xb8\x70\xb2\x88\xb1\x45\x91\xb1\
+\x16\xd9\xe3\xc9\x74\xd1\x82\x7d\x19\xdb\x61\xf4\xf3\xa5\xc5\x1e\
+\xf8\xf9\xf9\xc0\x5a\x74\x14\xd5\x57\x3f\x87\x28\x89\x28\xc8\x4e\
+\xa5\xff\x7c\xa1\x10\x89\x20\x0a\x48\x48\x4a\x43\x53\x53\x13\x79\
+\xa0\xc5\x81\xbc\x74\x18\x7d\xfb\x30\xbe\x36\xce\xb2\x13\xcd\xbf\
+\x35\xe3\xb3\x0b\x27\x18\x9b\xb7\xcc\x6c\x21\x75\x99\x6e\x4a\xea\
+\xf1\x28\x48\xd9\x99\x88\x91\x46\x23\x64\x45\xe6\x52\x71\xe0\xf0\
+\x09\xd4\x5e\xff\x0a\x1a\x8d\x16\xe9\xc9\x49\xf0\xf7\x1f\xc1\xe7\
+\x04\xa2\x56\x40\x52\xca\x1e\xb4\x34\x3f\xa0\xc6\x62\xc8\x4c\xdd\
+\x01\x93\xbf\x51\xc5\x04\xc2\x12\xb7\xa5\xa1\xa2\x6c\x3f\x63\x81\
+\x33\xe7\xaa\x04\xbc\xa7\x3d\xb2\x07\xb2\xac\xe0\xbd\xa8\x28\x48\
+\x92\xa4\xfa\xca\x49\x6c\xb6\x23\x70\x38\x1c\x84\x2b\x30\xaf\x8c\
+\x56\x31\x0d\xd9\xc1\x9f\x29\xb6\xd9\xe0\x76\x3a\x55\xfb\xcc\xe6\
+\x95\x5e\xcc\x45\x6d\x1f\x17\x13\xc5\x58\xfc\xd6\xac\x3e\x82\xbe\
+\x19\x56\x09\x5c\x2e\x17\x29\x50\xc7\x83\x86\x0c\x64\x89\xa8\x3e\
+\xc4\x77\xa7\x62\x72\x3f\x46\x20\xf7\x9a\x5a\x56\xc5\xdc\x84\x29\
+\xfd\xcf\xf1\xb3\xc2\x9a\xb9\x95\xb1\xac\x82\x32\xaf\x02\x9e\xcd\
+\xcf\xa0\xa7\x5b\x65\x58\x07\x1f\x57\xd1\xd3\xd3\xab\x12\xf2\xb0\
+\xac\x8b\x64\x6c\x5b\x86\x55\x25\xe0\xcc\x23\x4d\x26\x4c\x9d\xfc\
+\x92\x6a\xd5\x50\x83\x1f\x27\x8f\x3a\x3a\x51\x77\xfb\x6e\x9f\x7d\
+\x14\xa9\x1f\xae\x65\x6c\xe3\xf6\x9c\x7e\x02\x7e\xc8\xc9\xe0\xc5\
+\x56\x06\x11\xb0\x74\x7e\x18\xca\xed\xd5\x83\x93\x90\x03\x02\xcd\
+\xc7\x13\x05\xb9\x29\x09\x8c\xc5\x5a\x76\x79\x15\x08\x82\x40\x47\
+\x83\xd1\xeb\xf1\xbf\x23\x2c\x34\x18\xd5\xd7\xae\x0f\x3c\xb1\x94\
+\xd4\x45\x33\xd4\xee\xe8\x50\x89\x78\xec\xcf\xa2\x1a\x44\xaf\x4f\
+\xf2\x12\x8c\x1d\xfb\x0c\x16\x47\xbc\xa1\x0e\xdb\x40\xc1\x13\x88\
+\xb4\x89\x81\x09\x34\x68\x69\x6d\xc3\xd9\xca\x4b\xea\x46\x79\x1c\
+\xc9\x4f\x67\x6c\xb9\x39\xce\x4b\x20\x53\x91\xfe\xde\x41\x43\x09\
+\x46\x1f\xee\xbd\x24\x89\x5e\x8b\x4e\x1d\xde\xc7\xd8\xfc\x77\xd6\
+\xfc\x65\x11\xf5\x70\xc0\xe8\x31\x90\x69\xaa\x87\x4c\x40\x39\x9d\
+\x6e\x17\xda\x5a\x5b\xbd\x45\xb6\x1f\x2f\x64\x6c\xce\xa2\x28\x95\
+\x80\xef\x7e\xdc\xb3\xe3\xb0\x3e\xc6\x4c\xef\x06\xe7\x90\x09\x78\
+\xd2\x5f\x1a\x7f\x45\x41\x61\x31\x24\x9a\x0d\x1e\x57\xce\x95\x32\
+\x36\x63\xee\x52\xaf\x02\x49\xd2\x61\xf4\x98\xe1\x2b\xe0\x35\x6a\
+\xfd\xbd\xc5\xab\xe0\xcb\xcb\xe5\x8c\x4d\x9d\x19\x9e\x48\xf7\xea\
+\xcb\x96\x93\x28\xc3\xf0\xff\x1f\x4a\xa8\xd8\xe8\x7f\xd3\xdf\xaa\
+\xb9\xc4\xd8\xa4\xc0\x99\xef\xd3\x7d\xd1\x53\x65\x1d\x24\xbe\xaf\
+\xab\x61\x7f\x02\x5d\x06\x25\x37\x01\xaf\x02\x2c\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x96\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x5d\x49\x44\x41\x54\x78\xda\xed\x95\xcb\x4f\x53\x79\
+\x14\xc7\xbf\xe7\x5e\x4b\x9b\x42\x9d\x02\x0e\x2d\x08\xb4\x95\x87\
+\xb4\x51\x7c\xce\xa8\xa3\xce\x18\x5c\x18\xe3\x42\xdd\xf8\x88\x1a\
+\x63\x34\xf3\x4f\x4c\x34\x26\x6e\x5c\xb8\x70\x67\xa2\x0b\x8d\x0b\
+\x4d\x66\x26\x13\x46\xcd\x4c\x88\x4e\x9d\x08\x23\x3e\x63\xa2\x40\
+\x29\x0f\xad\x94\x6a\x8b\x40\xa1\x2d\xb4\xa5\xf7\xde\xdf\x9c\x7b\
+\x01\x03\x31\xf1\xcd\xc6\x78\x9b\x76\xf1\x7b\x7c\x3f\xdf\x73\xbe\
+\x27\xb7\x84\x39\x7e\xe8\x2b\xe0\x9d\x80\xe3\x8f\x46\x84\x26\xc4\
+\x9c\xd0\x24\x22\xd0\xd1\xbb\x43\xa2\xa1\xb2\x00\x03\x39\xf1\xd9\
+\xdd\xdf\x0f\xa7\x40\x7b\xff\x08\x89\x1d\xab\x9d\xe8\x1f\x57\x10\
+\xcf\x8a\x4f\xae\x42\xb7\x59\x6c\x21\xf4\x47\x93\x68\x09\x24\x41\
+\x47\xfe\x0e\x0b\x93\x4c\x48\xa5\x14\xac\xf1\x16\xe3\xf9\xb8\xc6\
+\xa5\x7d\x78\xbb\x74\x61\x8d\x7f\x5c\x56\x09\xf7\x3a\x07\x91\x96\
+\xf3\x30\x9a\x9c\x00\x1d\x6c\x0c\x09\xaf\xc7\x8e\xe6\xe0\x28\xc6\
+\x86\x53\x38\xb0\xa9\x02\x81\xa4\x06\x4d\x63\xc8\x7b\x52\xf4\x08\
+\x25\x09\xf0\xda\x24\x5c\xfc\x37\x8c\x52\x57\x11\xbe\xb1\xe5\xa1\
+\x33\x38\x0c\xda\xf7\x5b\xaf\xf0\xb8\xed\xe8\x89\x2b\xc8\x64\x72\
+\xe8\x0b\xc4\x70\x68\xab\x07\x51\x45\xc6\x70\x46\x7d\x6b\x35\xd3\
+\xae\x8b\x2c\x32\x9c\xf3\x54\x9c\xff\xeb\x29\x6a\x56\x96\x43\xe2\
+\x1b\x12\x5f\xec\xeb\x1e\x02\xed\xbe\xd4\x25\x2a\x3d\x85\x08\x0e\
+\x29\x98\xc7\x2e\x34\xbe\xd1\xfd\x30\x8c\x6d\x1b\x4a\x51\xe6\xb0\
+\xe3\xf1\x60\x0e\x32\xbd\x59\x8d\xee\x5a\xe5\x6f\xfd\x02\x13\x22\
+\xd1\x11\x34\xdd\x1b\x60\xf1\x0a\x68\xaa\x66\xec\x13\x03\x22\xc1\
+\x01\xd0\xce\x0b\x1d\xa2\xac\xaa\x18\x5d\x83\x13\x2c\x34\x69\x57\
+\xe2\x7a\x23\x1d\x31\x54\xda\x09\x3b\x36\x57\xe3\xbf\x48\x16\x39\
+\x56\x9b\x86\xe8\xe2\x7a\x6e\xeb\x17\x9a\xd1\xf8\x4f\x0f\x0f\x08\
+\xc1\x59\xfd\x2d\xc4\x94\xf8\x34\x60\x80\xbb\x41\xdb\xcf\x3d\x16\
+\xc5\x8b\x4a\xd0\xf3\x2a\x6b\xcc\xed\xeb\x03\xb2\x84\x44\x34\x01\
+\x7a\x15\xc7\xcf\x7b\x97\x72\x25\x13\x88\x8d\xa9\xc6\x9e\x23\x5f\
+\x36\x9c\x9f\xbd\xdc\x06\x69\xe1\x02\xe4\x17\x5a\x21\xb4\xd9\x63\
+\xae\x03\xe2\x9d\x2f\x40\xdb\xce\x3c\x12\x85\x8b\x9c\x08\xc6\xd2\
+\x90\x25\x9a\x75\x20\x93\x98\xc0\xf3\x3f\xfd\x70\x78\xab\xb1\x6f\
+\x57\x3d\xe7\x22\x4d\x02\x64\x0d\xbf\x5e\x0d\xa0\xff\x41\x3b\x1c\
+\x1b\x57\xa3\xb0\xc6\x01\xa1\x68\x6f\x00\x92\x3a\x60\xcb\xe9\x07\
+\x22\xbf\xb6\x14\xbd\xd1\xb4\x11\xcc\xf4\x66\x76\x34\x8b\x97\x8d\
+\x37\x50\xb4\xe1\x7b\x14\x78\x4a\x30\x72\xbf\x1b\x87\xf7\x2f\x37\
+\xf6\xcf\xff\xde\x06\xdb\x12\x37\x94\x54\x16\xb1\xeb\x77\x60\x5f\
+\xe1\xc3\xfc\x9a\x92\xd9\x10\x6e\x73\xa6\xbd\x0f\xd4\x70\xea\x8e\
+\x30\xd7\x95\xe3\x69\x64\x0a\xc0\x1b\xb9\x64\x1a\xf1\x6b\x7e\xd8\
+\xd6\xae\x82\xb5\xaa\x94\x7b\xab\x1a\xeb\xa9\x8e\xb0\x71\xb7\xc0\
+\x57\xc1\x09\x6b\xfa\xbb\x80\xf3\x10\x18\xba\xd2\x0c\xeb\xb2\x3a\
+\x58\x3d\x4e\x5e\x57\x5f\x03\xd4\x8e\x10\x68\xd3\xc9\xdb\x42\xf6\
+\x96\xe3\x59\x3f\x03\x78\x8c\xd4\x44\x16\x89\x26\x3f\xac\x6b\x56\
+\xc1\xe2\x76\xb2\x2b\x75\x86\xab\xa9\x16\xce\xec\xb7\x91\x9b\xc0\
+\xe8\xb5\x66\x58\xea\x17\xc3\xec\x76\x4e\xc1\x25\x88\xb6\x5e\xd0\
+\xc6\x13\xb7\x84\xf0\xb9\x10\x7a\x91\x01\x8d\x65\x90\xbe\xd9\x0a\
+\x4b\xc3\x0f\x90\x6c\x96\xc9\x83\xef\xf3\x90\x8e\x20\xa4\x9b\x5a\
+\x60\xf2\xd5\xc2\xe4\x72\x4c\xfa\x79\xd2\x05\x5a\x7b\xec\xa6\x40\
+\x7d\x15\x42\x81\x61\x28\x2d\xad\xc8\xfb\x71\x1d\x48\x17\xd7\x3e\
+\xf0\xe5\xc7\x95\x08\xfe\xe4\xae\xb7\x42\xf6\x55\x43\x76\x97\x81\
+\x1e\xb6\x83\xbe\xfb\xe5\x86\xc0\x62\x17\x7a\x2f\xf9\x91\xf7\xd3\
+\x3a\x6e\xf0\x47\x88\xcf\x6c\x17\x67\xa2\xf8\x6f\x43\xae\xab\x85\
+\x14\xe1\x29\xaa\xdc\x73\x51\x10\x2f\x8e\x9b\xf2\x41\x42\xfb\x78\
+\xf1\x99\x39\xe9\x41\xb3\xa6\x6c\x36\x7f\x09\x7f\x99\x73\x0d\xf8\
+\x1f\x05\xe5\x65\x12\xae\xc3\x6d\xef\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x04\x4f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x16\x49\x44\x41\x54\x78\xda\xad\x95\x7f\x4c\x1b\x65\
+\x18\xc7\xbf\xef\x5d\xaf\x2d\xc8\xd8\x06\x04\xe8\xb9\x21\x38\xc5\
+\x0d\x0d\x6c\x05\x8d\x51\x26\x9d\x74\x2d\x18\x1d\xce\x98\x74\xd9\
+\x62\x82\x89\x21\x0e\x19\xfa\xc7\x7e\xe8\x1f\xfe\xb1\x19\xb7\xa8\
+\x6c\xd3\xa0\xa0\x59\x34\x2e\xba\xa0\x18\xa3\x89\x59\x4c\x04\x5c\
+\x07\xac\x6e\x5a\x69\x3b\x16\xf9\xb1\x05\x28\xac\x60\xa1\x14\xd8\
+\x80\x52\xda\xbb\xd7\x97\xab\x83\x90\x2d\x58\x98\x4f\x72\xb9\xe4\
+\xbd\xbb\xcf\xe7\x79\x9f\xe7\xb9\x3b\x82\x15\x44\x4f\xf5\xde\x03\
+\x44\xad\xaa\x50\xa7\xc6\xa5\xc9\x12\x5b\xe0\x08\xa4\x9b\x33\xfd\
+\x21\xff\x74\x95\x4a\xe0\x91\x51\xfe\x49\xf5\xad\x7b\xc9\xb2\xc0\
+\x35\xe5\x46\x4a\xf8\x86\x24\x63\x26\xe2\xd2\x52\x20\x07\xdd\x80\
+\x3c\x1d\x01\xf1\x6a\x04\x6f\xc4\xc1\xd7\x7a\x1d\x41\xef\x8d\xc2\
+\xcc\xca\xda\x5f\x97\x25\xe8\xa9\x79\xad\x4c\x48\x88\xf9\x4c\x2c\
+\x79\x0c\xd2\x74\x37\xa4\x40\x3b\x5b\x65\xe9\x13\x8e\x9d\xa9\x42\
+\x22\x90\xa1\x8a\xdb\x84\x11\xbb\x80\x9b\x57\xbc\xc6\xcc\xca\x9a\
+\xa6\xa8\x05\x7d\x5f\xec\x0f\x88\x2f\xe4\x69\x31\x6b\x87\x14\xec\
+\x63\x34\x41\xc9\xef\x16\x7f\xc6\x2f\x20\x26\x39\x08\x1a\x96\xc1\
+\x69\x05\x78\xcf\xad\x42\xd8\x27\xec\x89\x4a\xd0\x56\x9a\xbd\x27\
+\xbd\xa2\xe4\xeb\x55\xe9\x1c\xc2\x53\x36\x40\xb5\x9e\x41\x65\x10\
+\x42\x21\x87\x09\x06\x7f\x5a\x5d\xf7\x40\xc5\x47\xbb\xdd\x75\xfb\
+\x5c\xba\x6d\x24\x5b\x96\xbc\x08\x4d\xa9\x31\xf0\x1d\x7f\x24\x2a\
+\x41\x8b\x21\xb9\x31\xef\x74\x61\xa1\x34\xf6\x83\x52\x15\x50\x96\
+\xb2\x10\xc7\x32\x8d\xc7\x44\xe7\x3a\xe8\x4a\x5a\xe6\x39\xe3\x5d\
+\xa7\x68\x4c\xac\x15\x9c\x5a\xc6\xf5\x86\x35\xee\xa8\x04\xe7\xf3\
+\x53\xfe\x7c\xf2\xc7\xad\xfa\x99\xde\xb3\xac\x2a\xea\xc8\x22\x93\
+\x10\x95\x0c\x6f\x13\x3b\xc7\xef\x3f\x9d\x51\x76\xb8\xf4\xe2\xae\
+\x9c\x57\x73\xaa\xdf\xaa\xe5\x83\x36\x56\xb5\x31\xf8\xff\xd2\x46\
+\xd7\xe4\xab\xef\x64\xdb\xef\x2b\x5d\x9d\x3b\x3b\xe8\x60\x02\xd5\
+\xc2\x05\xf6\x34\xaf\x91\x30\x78\x2e\x1d\x01\x77\xd8\x9a\x58\x20\
+\x1a\x12\x36\xc7\x42\x1a\x73\x80\x4b\x7c\x02\x13\xd7\x12\xa3\x13\
+\x58\xb7\xa6\x3a\xf2\xbf\xd9\xb8\x79\xa6\xdf\xbe\x58\xa0\x48\x28\
+\x38\x41\x00\x1f\x7f\x3f\xeb\x47\x00\xd2\xb8\x5b\xd9\x1d\xc7\x66\
+\x60\xf8\x72\x56\x94\x82\xa7\x52\xdf\x7b\xb4\x56\x7f\x90\x8e\x59\
+\x17\x4a\xb4\x28\xa8\xd2\xf4\xc8\xac\x46\x0e\x21\x96\xa2\xed\xa8\
+\x26\xba\x1e\xb4\x9a\x74\xd7\xf4\xd5\xa6\x0d\x74\xf4\x2c\x68\x28\
+\x14\x81\x2c\x11\x84\x07\x02\x7f\x13\xfc\xfe\x41\x14\x53\xd4\x5a\
+\x24\x7a\xf4\x27\x0d\xa2\xa0\x1e\xc0\xec\x80\x83\xe5\xaa\x5a\x1a\
+\x4e\xe6\x06\x8c\xc2\x79\x82\x83\xae\xb8\x7c\x37\xf9\x2f\x78\xee\
+\x87\x05\xa2\x34\x35\x08\xd7\x31\x27\xf4\xaf\x87\x21\xcd\xaa\xee\
+\xbc\x03\x12\x79\xa9\x85\x7b\x28\xba\xcf\x68\xd0\x7f\x29\xbc\xeb\
+\x19\x9b\xff\x5b\xb2\x14\x5c\x7f\xa2\x40\x24\x33\x43\x68\xdc\xdb\
+\x8e\x7b\x73\x28\x1e\x39\x94\x8f\xb0\xe7\x12\xa8\x14\x60\x4d\x5c\
+\xfc\x28\xcf\xbc\x93\x7d\x3c\x3a\xbf\xd7\x60\xd2\xcf\x59\x4c\x4d\
+\x9e\xfa\x7f\xbd\xb7\x47\x8b\x59\xf4\xe4\x1d\x37\x88\x74\x7a\x08\
+\xcd\x95\xed\x10\xb7\xc8\x78\xf8\xcd\x02\xc8\x24\x15\x63\x8e\x0e\
+\x50\x9f\x0b\xee\x06\x2d\x38\xd5\x7c\x8b\x11\x18\x27\x98\x9e\x24\
+\x2e\x95\x9a\xbe\x6c\xfc\x65\x6e\x9e\xe7\x37\x76\x07\x78\x95\x41\
+\x94\x03\x43\xb0\x31\xb8\x8e\xc1\x37\x1d\x2c\x00\xe5\x92\x31\x6a\
+\xbf\x0a\x47\xd5\xe5\x33\x9c\x46\x7d\xdc\x64\x5d\x80\x2c\xd9\x93\
+\x45\xf0\xa2\x54\x4f\xde\xfb\x4f\x8b\xf2\xd4\x30\x2e\xbe\xe1\x42\
+\x96\x25\x84\xa4\x1d\x46\x56\xdb\x14\x8c\xb6\x75\xc1\x79\xd2\x61\
+\x31\x5f\x18\xad\x8f\x06\x7c\x9b\x40\x81\x1f\x2b\x64\x99\x0f\xe3\
+\x8f\x03\x0e\x64\x3e\x2f\x21\xe9\x39\x23\x7b\x53\x75\x18\xb1\xfd\
+\x06\x57\x4d\x2f\x83\xfb\x96\x05\x9f\x17\xcc\xc1\x73\x8f\x1a\x45\
+\x04\xbc\xb0\x1f\x72\xe2\xc1\x9d\x40\x62\x91\x01\x7c\x8c\x0e\x3d\
+\x5f\xfe\x8c\x1e\xeb\x84\xc5\xdc\x3c\xbc\x6c\xb8\x22\xb8\xf0\xac\
+\xae\x63\xcb\x91\xed\x1b\x31\xd1\x07\xc7\xdb\x9d\xd8\xf0\xa2\x8a\
+\xc1\x8b\xd9\x94\x68\xd1\x53\x67\x43\x6f\xa3\xc7\x62\xb2\xae\x0c\
+\xae\x08\xba\x0e\x6f\xa3\x69\x8f\x8f\xc0\xf5\xee\x08\x32\x76\xf2\
+\x48\x30\x17\xb3\xef\xbd\x06\xc3\xe7\xdb\x71\xe5\xab\x8e\x7a\x73\
+\xb3\xcf\xb2\x52\x78\x44\x50\x21\xd2\xc9\x6e\x82\xf5\x66\x60\x6d\
+\x51\x11\xfb\x81\xab\xe1\x6f\xeb\x86\xf3\x53\xd7\x29\x73\x8b\xaf\
+\xec\x6e\xe0\x8a\xc0\x66\x5e\x47\x1f\xda\xc1\x63\xcd\x76\x06\x97\
+\x79\xf8\xe6\xa6\xa5\xc6\xf9\xb1\xb9\x75\x74\xdf\xdd\xc2\x15\x81\
+\xe3\xa5\x14\xba\x36\x4b\xc7\xe6\x5c\x8b\x50\x70\x16\xbd\x0d\xfd\
+\x9f\xb3\xcc\x5f\xf9\x3f\xe0\x73\xf1\x0f\x1b\x61\xa5\x28\x00\x24\
+\x9e\x71\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x91\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x58\x49\x44\x41\x54\x78\xda\x9d\x56\x09\x6c\x14\x65\
+\x14\xfe\xfe\x39\x76\x76\xbb\x3d\xb7\x94\x2d\xad\x51\x4b\x39\x52\
+\xbb\xa5\x14\xa8\x31\xd4\x56\x03\x02\xa2\x41\x23\x42\x38\xaa\xe5\
+\x08\x68\xd9\x56\x10\x45\x84\x48\x02\x4d\x34\x20\x8a\x08\xe9\x2e\
+\x55\x08\x42\xb5\x1c\x01\x31\x4a\x14\x01\x21\x5a\x2c\x31\x96\xab\
+\xb4\xb5\xe1\x68\x2b\xc6\x96\x2e\xa5\xdb\x83\x2e\xdb\xd9\xd9\x99\
+\xdf\x7f\xa7\x07\xac\x05\x34\x7d\x93\x49\xe6\xbf\xde\xf7\xde\xf7\
+\xde\xfb\xdf\x10\x3c\x40\xf8\x3c\x31\x53\xf5\xab\xb3\xd1\xa1\x4d\
+\x85\x17\x09\x18\xd4\xb3\x70\x93\xbd\x26\xd4\x23\x9c\x3b\xc2\x0b\
+\xfc\x3e\xd5\xa1\x9c\xba\x9f\x0e\x72\xaf\x49\x21\x5f\xb4\xf9\xdb\
+\x94\x8a\x08\xab\x99\x9b\x34\x66\x04\x9e\x4c\x7a\x0c\xc3\xa2\xe3\
+\x10\x69\x8a\xd2\xd7\xdb\xbc\xad\xb8\xda\xd2\x88\x5f\x6b\xfe\xc0\
+\xf1\x73\x97\xd1\xee\xf2\x68\x42\xa4\x98\xea\x2f\x54\xaa\xfe\x1b\
+\xc0\x6e\x70\xe0\xb6\xcf\xbe\xe2\x95\xc9\x98\x96\x9c\x81\x68\xe3\
+\x60\x10\xca\xc3\xaf\xa9\xd0\x40\xf5\x2d\x1c\x3b\x26\x70\x3c\x28\
+\x51\xd1\xd2\x75\x03\x87\xab\xcb\xf0\xf1\x57\xc7\x80\x10\x83\x13\
+\x4e\x5f\xde\xfd\x01\x16\xe3\x80\x35\x3a\x62\xc6\xa7\x8b\x73\x60\
+\x8b\x4a\x66\x4a\x09\x34\x4a\x21\x10\x01\x3c\xe1\xee\xda\x4e\xa1\
+\x52\x0d\x7e\xea\x07\x47\x02\x60\x14\x55\xad\xd5\x78\x73\x7b\x31\
+\x5c\x2d\xed\x07\xb1\x1d\x33\xfb\x01\x90\xa5\xa2\xc3\x1a\x61\xb6\
+\x17\xe7\x2f\x43\xac\xe1\x61\xc8\xaa\x0a\x55\xf3\xa1\x8b\xba\x70\
+\xb4\xe9\x04\xea\x3a\x6a\xa1\xb1\xb1\xee\x01\x67\xc0\xd0\xf0\x44\
+\x4c\x89\x9d\x08\x23\xb1\x82\x67\x63\x89\xe7\xd1\xe4\xfb\x0b\x39\
+\x85\x5b\xe0\x6a\xf7\x38\xe9\x56\x25\xaf\x0f\x40\x5a\x2e\xd9\x64\
+\x8f\x5c\x79\x68\xcd\x6a\x24\x86\x25\xc1\xeb\xbf\x85\x66\xf9\x0a\
+\xdc\xea\xdf\x30\x70\x04\xd7\x5a\x2d\x78\x37\xa5\x28\xc8\xd9\x0f\
+\x2b\x73\xf1\x48\x94\x1b\x3e\x8d\xc2\xc2\x3f\x84\x18\x69\x38\x4c\
+\x42\x18\x6a\x6f\xd5\x60\xfa\xfb\xeb\x21\x99\xa5\x14\x79\xb3\x5c\
+\xd5\xed\xc1\xeb\x50\x57\x65\x4f\xe7\x72\x52\x67\xa1\xd1\x7b\x15\
+\x0d\x72\x35\xe3\xb9\xe7\xe1\x34\xd4\xde\xe4\xf1\xde\xe8\x5d\x41\
+\x00\x1f\x5c\x98\x8f\xc4\x41\x2c\x2e\x1a\xc7\x62\xd3\xfd\xc4\x4b\
+\xc9\x88\x33\x0d\x43\x71\xc5\x7e\x6c\x28\x39\xa4\xe1\x33\xc6\xac\
+\x71\x85\x94\x69\x12\x48\xe9\xcf\xab\x3e\xc7\x9f\x9e\x8b\x70\x2b\
+\x0d\x8c\x57\x91\xb9\x46\x7a\xe8\xd0\x70\xf9\x3a\x41\x41\xfa\xee\
+\x20\x80\xb5\xe5\xf3\x30\x62\x08\xd5\x01\xba\xa3\xc2\xbe\xa9\x02\
+\x8b\x18\x8f\x47\xcd\xa3\xf0\xf4\x86\xd7\x18\x13\x34\x8b\x70\xcb\
+\x45\xc7\xbc\x09\x4f\xd9\x17\x8c\x9f\x8a\xab\x9d\x67\x19\x25\x52\
+\x20\x84\xfa\x11\xbd\x16\x58\x00\xcf\xd7\xfb\xb1\x31\x63\x6f\x10\
+\xc0\xca\xb2\x39\x48\x4b\x10\x58\x9c\x7a\xc3\x18\x30\x89\x67\x94\
+\xc9\x18\x16\x3a\x16\x5f\x9c\x3e\x82\xdd\x27\x7f\x71\x12\xbc\x81\
+\xba\x9d\xcb\x96\x27\x50\xb1\x19\x22\x0c\xf8\xa9\xfe\x0c\x62\xf9\
+\x74\x28\x6c\xa3\x6e\x19\xcb\x94\xc4\xf0\x34\xe4\xa7\xad\x0c\x02\
+\x28\x3c\xbf\x11\xb5\x1d\xe7\x41\x58\x86\x05\x44\x64\x86\x35\xa9\
+\xe5\x78\x26\x61\x1c\x14\xf8\x40\x94\x18\x2c\xdc\xb2\xb9\x9e\x20\
+\x17\x74\xcf\xba\x5c\x74\x79\x65\x48\xa2\x01\xdb\x4e\x7f\x83\x53\
+\x33\x5d\x18\x88\x64\x1e\xb0\x62\xc9\xf8\x97\x20\x2b\x3e\x18\x4d\
+\x12\xe6\xae\x2b\x02\x31\xad\xe6\xe9\xae\x65\x4b\xd0\x71\xdb\x0b\
+\xb3\xc1\x84\x4f\x4a\x4b\x50\x3e\xc7\x3d\x20\x80\xf4\xbd\x16\xbc\
+\x95\x95\x0d\x8f\xcf\x8b\xf0\x10\x13\xe6\x6f\xd9\x06\x62\x59\x1f\
+\x42\x0b\x17\x2c\x84\xdc\x45\x51\xad\x94\x61\xc7\xd1\x0b\x68\xcd\
+\xa3\x03\x02\x88\x72\x10\x2c\x9a\x32\x1a\xc9\x62\x06\x24\x23\xc1\
+\x92\xa2\x9d\x20\xc6\x35\x1c\x2d\x5e\xfa\x0e\xca\x9a\x8f\xa3\xd9\
+\xdf\x80\x1f\x4b\x5d\x68\xc9\x1f\x18\x40\x74\x21\xc1\xb3\x59\x56\
+\xc4\x08\xf1\xc8\x88\x99\x84\x9c\xad\x1f\x81\x84\x15\x18\xeb\x5e\
+\x7d\x39\x29\xc1\x25\x37\x42\x12\x0c\x38\x57\xe1\xc2\xd8\xd0\xe7\
+\x58\x25\x7b\xf5\x43\x2a\x4b\xbd\x54\x4b\x16\xd6\x4e\x5c\x1b\xa4\
+\xac\xe0\x44\x01\x2a\xdc\xa5\x2c\xd1\x45\x7d\x2c\xf1\x26\x9c\xed\
+\xfc\x01\x63\x52\xad\x90\xfd\x3e\x58\xa5\x38\x7c\xf9\x75\x4d\x3d\
+\xb1\x6e\x08\x71\x8c\x1c\x6b\xb6\xc7\xc5\xb0\xf4\xa4\x81\xbc\x07\
+\xfc\x2c\x0b\x68\x8f\x13\x54\x90\x21\x57\x8d\xc1\xe1\x59\x27\x83\
+\x00\xa6\xed\x9f\x00\xc9\x76\x0e\xc4\x2f\x75\x27\x29\xcb\x56\x81\
+\x65\xa1\xa6\x75\x7f\x37\x36\xcb\xb8\x74\xd6\xe3\x24\x71\x9b\xc2\
+\x32\xcd\x16\xae\x74\x5c\x7a\x24\x7c\x3e\xad\x9f\xdb\x1a\xef\x83\
+\x5a\x35\x0a\xdf\xce\x3d\x16\x34\xff\xe2\x9e\xc9\xe0\x6d\x17\xc1\
+\xa9\x86\x7e\x67\x0c\x06\x0e\x67\xca\xdb\xe0\x71\x6b\x59\x7a\x95\
+\x0c\xd9\x64\x56\x53\xc7\x87\x73\x21\x46\x91\x59\x40\xfb\x01\x50\
+\x06\xf0\x5d\x76\x30\xc0\x0b\x25\x93\x41\xee\x01\xc0\xb1\xbb\xeb\
+\x76\x97\x82\x8a\xd3\x1d\xda\xf5\xb7\x3d\xbc\x0e\x90\xe0\x0c\xb3\
+\x11\x1e\x95\xa3\x9e\xb0\x04\x48\xef\xa3\x47\xa7\x88\x57\xc0\x57\
+\xa5\xe1\x50\xf6\xf7\x41\x8a\xa6\x97\x3c\x0f\xd5\xc6\x0a\x4d\x15\
+\xfb\xe6\x02\xd4\xb0\xa0\xe0\xe2\x6f\x6e\x50\x15\x29\xf5\xf6\x5b\
+\x55\x7d\xd7\xf5\xd0\xa2\x50\x47\xb8\x45\xb4\x27\x26\x45\xc0\xaf\
+\x68\x7d\x20\x1c\x2b\xd4\xf2\xdf\x9b\xd0\x70\xc3\x17\x04\x10\x3f\
+\xd8\x80\xf4\xc7\x63\xa1\xf9\xef\x28\x17\x44\x0e\xb5\x35\xed\xe8\
+\x70\x2b\xce\xba\xdc\xce\x3b\xd7\x75\xaf\x0c\xdf\x61\x3e\x10\x6a\
+\x11\x67\x3c\x92\x18\xc1\xb8\x61\xd6\x07\xe8\x62\x3b\x78\x9e\xd3\
+\x83\x1f\x44\x1d\x5b\x57\x55\x4d\xbf\xb2\x08\xa3\x85\x5d\xbc\xb8\
+\x56\xdb\x8e\x4e\xb7\x72\xf0\xca\x22\x4f\xff\x86\xd3\x2b\x23\x77\
+\x85\x3b\x58\xef\xb0\xc7\x8f\x88\x80\x51\x62\x6d\x91\x52\xfd\xc5\
+\xbf\x4b\x83\x04\xac\x26\xfa\xdb\x25\xab\x68\xb8\xdc\xce\x00\xe1\
+\xbc\x34\xbf\xe3\x01\x2d\xb3\x47\x52\xf6\x44\xd8\x54\x45\xab\x30\
+\x45\x0a\x5c\x94\x45\x82\xc1\x2c\x41\x60\xdc\xf6\xd2\x16\xa0\xc3\
+\xcf\x62\xe5\xf3\xc8\x68\x75\xcb\xf0\xb6\xf9\x35\x5e\xe4\x52\x2b\
+\xe7\xb6\xff\x8f\xa6\x7f\x37\xd0\xfe\xc8\x4c\x0e\x74\x36\xd3\x3c\
+\x95\xb5\xe0\x04\xde\xd8\xbd\x5d\x65\xd7\x0a\x6b\xd1\xf5\x0c\xe9\
+\x88\x06\xb2\xaf\x72\x56\xdb\x7d\x7f\x5b\xfe\x01\x67\xff\x26\xfa\
+\x57\xcb\xae\xf3\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x03\x62\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x29\x49\x44\x41\x54\x78\xda\xad\x94\x5d\x48\x14\x51\
+\x14\xc7\xff\xb3\xba\x6b\x6b\x62\x7e\xac\xa4\xad\x7d\xb8\x66\x6a\
+\x65\x7e\xb4\xf6\x41\x61\xf6\x10\x19\x98\x58\x51\x8d\x45\x05\x16\
+\x3d\x14\x54\xd4\x43\x0f\x51\x0f\x25\x44\x44\x94\x42\x12\x85\x05\
+\xdb\xd2\xbd\xd1\x43\x21\x41\x0f\x85\xd1\x4b\x2f\x65\xa9\xb4\xe6\
+\xa2\x69\xf9\xb1\xa9\x59\x9a\xd4\x6a\xad\x3b\xdb\x99\xdd\xd9\x9c\
+\x35\xad\xd5\xfc\xc3\xe5\xce\xb9\x73\xe7\xfc\xe6\xfc\xcf\x9d\x11\
+\x30\x46\xfd\xcc\x54\xa5\x37\xc6\x95\x0e\x3b\xfa\x6e\x46\x89\xef\
+\xf6\xe3\x3f\x25\x04\x24\xbf\x63\x62\x51\xf9\x66\x11\x09\x76\x8a\
+\xba\xd0\x6f\x09\xe7\x31\xfb\xda\x4b\xa6\x05\x30\x9a\xbc\x06\x90\
+\xfa\x00\x8d\xbc\x6a\x40\x5f\x95\x8e\xc7\x1d\x70\x4c\x19\x22\x04\
+\x26\x7f\x02\x5b\xed\x30\x1a\xed\xf3\x50\x58\xd0\x04\x7d\xb4\xbc\
+\xc3\x80\x9e\xca\x10\x1e\x7f\xb8\x67\x4a\x10\x61\x80\x9b\xaa\x66\
+\xe5\xe5\x96\xca\x6f\x6e\xab\xfd\x8e\xa5\x66\xa7\x17\x9a\x97\x5f\
+\xec\x7e\x56\xf3\x40\x03\x27\x05\x33\x0d\x70\x54\x78\xb8\xf1\xe8\
+\xe7\x49\x43\x04\xe7\xd3\x95\x1e\x7d\xfe\x7b\xb2\xa5\x07\xf7\x78\
+\x1a\x76\xec\x6e\xf2\x02\x16\xa5\x6d\xf0\xd8\x6d\x8f\x81\x2f\xf0\
+\xd9\x45\xd5\x74\x5d\x89\xe4\x89\xc7\x07\x27\x05\x11\xfa\x2d\x49\
+\x55\x11\x6b\xda\x4a\x43\x4d\xc0\xd0\x20\x50\x50\x54\x8c\xee\x5e\
+\x27\xb6\x6e\x6c\xc4\xf9\xb2\x4e\xe0\x1b\xed\x72\x2b\x66\x46\x02\
+\x1d\x57\x23\xf8\xbc\x93\xdf\x82\x86\x78\xdf\xf6\xd3\x8d\xf9\x2c\
+\x3a\xff\x83\x18\xb2\x50\x59\xf5\xd0\x70\x2a\x63\x84\x86\x4b\x05\
+\x89\x03\xda\x2e\x6b\xb9\xe9\xb4\x2b\x28\xc8\xef\x53\xd4\x7d\x75\
+\x0e\x41\x1c\xa2\x2e\x89\x82\x61\x55\x52\x79\x96\x54\x71\x08\x8d\
+\x08\xa0\xf5\x9a\x86\x27\x9f\x95\xfe\x09\x09\xf8\x0e\x1c\xe5\xf1\
+\x2c\x76\x7d\xb7\xa8\x4b\xa4\xe0\xa7\x32\xdc\x4a\x15\x92\x32\xbb\
+\x95\x9e\xc4\x00\x2d\x95\xe0\x29\x65\x28\x09\x1a\x20\xab\xeb\x62\
+\x2c\x33\xac\xfb\xec\x83\xb8\x14\x88\x34\x06\xf4\xd3\x57\x89\x47\
+\x57\x82\x66\x2b\xe3\xa9\x17\x26\x86\x08\xe3\x2d\xb6\x5f\x88\x62\
+\xf1\x6b\x07\x44\xed\x5c\xc5\xae\x11\x55\x72\x97\x0a\x48\x4f\x7b\
+\xb4\x3b\x61\x67\x77\x79\xfa\xa5\xf1\x21\x02\x26\x50\x6b\x59\x38\
+\x4b\x5c\xed\x14\xb5\xf3\x29\x18\x52\x12\xaa\x7b\xe1\xaf\x88\xec\
+\x72\xeb\xb7\xc0\x6e\xbd\xcf\x97\x54\xfc\x09\x99\x10\xe0\x85\x9c\
+\x09\x63\xc6\xb5\x3f\x7c\x76\xfd\x50\xd9\xe5\xaf\xc8\x0f\xa2\x2c\
+\x52\x44\x11\xde\x58\xab\x79\x66\x65\x20\xe4\xaf\x00\x59\xcd\xa7\
+\xc0\x16\xac\x82\x18\x6a\x54\x00\x23\x08\xb4\xcc\xad\xac\xcb\x95\
+\x44\x17\xc1\x66\x21\xc8\xf5\x51\xc8\x3f\x01\xb2\xec\x27\xc1\x4c\
+\xb9\x04\x49\x54\x7a\xa2\x3e\x51\xea\x59\xbe\x34\x14\xa2\xde\xf2\
+\x90\x2f\xbf\xe9\x83\x04\x05\x90\xf5\xf6\x04\x58\xb2\x19\xa2\xd6\
+\xa8\x82\xf8\x1b\xee\xaf\xc4\xe5\xcb\x38\x12\xbb\x89\x20\x8f\xb8\
+\xf9\x36\x4a\x82\x06\xc8\xb2\x1d\x01\x4b\x59\x41\x90\x78\xa5\xf1\
+\x4a\xf2\xde\x06\x9a\x08\xa0\x0f\xa3\xff\x62\x38\x10\x3a\x83\x4e\
+\x57\x6c\x2a\xea\xaa\xed\xb7\x27\x05\x90\x55\x7f\x08\x6c\x71\x0e\
+\xd9\x95\xa0\x54\x42\xea\xae\x07\x3e\x76\x62\x33\x25\xeb\xf0\x48\
+\xd8\x2e\x49\x74\x47\xc2\x36\x8d\x06\xc2\xa4\x01\xb2\xea\x0e\x82\
+\xa5\x67\x43\xd4\xcd\xf6\xd9\xf2\xb5\x85\xfe\x4f\x2d\xc8\xce\xbe\
+\x85\xba\xb1\x7b\xa7\x04\x90\x55\xbb\x1f\x6c\x69\x06\x41\xa8\x12\
+\xb7\x83\xa0\xaf\x71\xcc\x6c\x41\xf9\xb4\x01\x64\xbd\xdc\x0b\x96\
+\x91\x49\x10\x3d\x5d\x3f\xc7\x99\x5c\x2b\xce\x4d\x2b\x40\xd6\x8b\
+\x5d\x60\x59\x74\xba\x1a\x5e\xa1\x6e\xb9\x15\xd9\xd3\x0e\xf0\xda\
+\xb5\x07\x16\xea\xe6\xb2\x1c\x0b\xb2\xc6\xde\xfb\x05\x81\xad\x34\
+\xf0\x7b\xf9\x59\xb5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x05\x8f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x56\x49\x44\x41\x54\x78\xda\x9d\x95\x6b\x6c\x14\x55\
+\x14\xc7\xff\x33\xbb\xdb\xdd\xb6\x4b\xb7\x5a\xb1\x52\x54\xec\x96\
+\x0a\xa5\x4f\xda\xe5\x25\x10\x2d\x44\x28\x0f\x21\xa1\x46\x40\x88\
+\x42\xd5\x28\x41\x49\xfc\xc0\x07\x08\x51\x2c\xf5\xd1\x44\x23\x68\
+\x02\x9a\xf8\xf8\x20\xc4\x44\x20\x41\x34\x50\x29\x0f\x43\xac\x52\
+\x4a\xdf\xa5\xb4\x3c\xba\x2d\x5d\xd8\x96\x6e\xe9\xee\xb6\xdb\xdd\
+\x79\xdc\xb9\x9e\x19\x8a\x09\x6e\xa9\xc4\x3b\x99\xcc\xee\x9d\x3b\
+\xff\xdf\x39\x73\xce\xfd\x8f\x80\x31\x46\xd1\xd1\xdc\xbc\x24\x5b\
+\xd2\x8e\xc7\x1d\x4f\x3c\x9f\x6c\x4b\x4c\x60\x1c\x10\x04\x01\xbe\
+\xb0\x3f\xe8\x19\xf4\x54\xfa\x86\x7d\x65\x15\x2b\x1b\x1a\xc6\xd2\
+\x10\x46\x9b\x5c\xfa\x73\xbe\xc3\x61\xb3\x9f\x2a\x4e\x5b\x59\x50\
+\x90\xe4\x82\x06\x1f\xc2\xea\x00\x24\x16\x84\x6a\x40\xac\x10\x91\
+\x88\xf6\xc0\x4d\x1c\x75\x1f\xab\x0d\x0e\x07\x16\x1e\x5f\x55\x17\
+\x78\x20\xc0\xe2\xc3\x79\x4f\xe5\xa6\xe4\xba\x4b\xd2\xd7\xc2\x22\
+\x0e\xc3\x2f\x5f\x06\xd3\x24\x68\x02\x87\xca\x00\x46\x38\x45\x63\
+\x50\x38\x23\x90\x19\x26\x21\x19\x15\xee\xf3\x68\xf2\xb6\xa4\x56\
+\xae\xae\xef\x1c\x13\x50\x74\x68\xba\x23\x27\x39\xc7\xbf\x39\x6b\
+\x23\x82\x4a\x1b\x45\xdc\x0b\x93\x68\x31\x96\x31\x4d\x23\x71\x06\
+\x59\xe3\x86\xb8\x0e\xd1\xe7\x64\xae\x51\x36\xf1\x38\xd8\x5a\x85\
+\x9e\x60\x5f\x62\xe5\xda\x7b\x33\xb9\x07\x50\x7c\x64\xfe\x85\x5d\
+\xf3\xb6\x15\x48\x5a\x07\x64\xb5\x1f\x16\x53\x0c\xcc\xf4\x38\xa7\
+\x43\xe5\xfa\xc9\xfe\x89\x5e\xd5\xaf\x04\xd3\x01\x8c\xee\xfb\x23\
+\x0a\x0e\x37\x56\xd5\x1e\x5b\x53\xed\x1a\x15\x50\xf8\x43\xce\xcc\
+\xd5\x39\xc5\xd5\xcf\x4d\xcc\xc0\xad\x48\x0b\x6c\xba\xb8\x60\x82\
+\x28\xe8\x4b\x38\x18\x09\xdd\x01\xf0\x28\x80\xfe\x9f\x53\x20\x55\
+\x9d\x9d\xa8\xef\x6c\x9f\x75\xb6\xa4\xe1\x7c\x14\x60\xc9\x8f\xb3\
+\xf7\xef\x5e\x54\xba\xae\x2f\x5c\x43\xb3\x0a\x2c\x86\xb8\x08\x61\
+\x64\x85\x66\x64\xa0\x19\xc2\x2a\xc9\x29\x23\x00\x75\x64\x9e\x71\
+\x01\x21\x45\xc0\xfe\xbf\x2a\x0f\x9c\xde\x78\x61\x7d\x14\xe0\xe5\
+\x23\x4b\xf9\xeb\x2e\x17\xda\x83\x67\x31\xde\x3a\x01\xf1\xe6\x44\
+\xc4\x9a\xe2\x60\x37\x27\x51\x59\xa9\xb8\x5c\x87\x30\x43\x50\x87\
+\xc9\x04\x90\x98\x44\x4d\x30\x80\x20\x75\x57\x40\x09\x60\x80\x0d\
+\xe2\x5c\xcd\x10\xfe\x78\xb3\x41\x88\x02\xbc\x7d\xa2\x98\x17\x4d\
+\x7b\x92\xba\x25\x84\x04\x12\x1d\x94\x7b\xe1\x0f\x77\x91\xb0\x6a\
+\xa4\xcf\x29\x42\x45\x8f\x56\xd3\x0b\xad\x21\xcc\x64\x24\xda\x52\
+\x10\x1b\x93\x80\xf8\x98\x47\xe1\x95\xae\xa3\x2b\xd8\x8d\xc6\x26\
+\x09\xa7\x5e\xad\x8b\x06\x6c\xaa\x58\xc5\x17\x27\xcf\xc1\x4f\x1f\
+\xb6\x23\x23\x7b\x2a\x9e\x99\x3b\x0f\x11\x4b\x37\x42\x29\xbf\x20\
+\xc0\x3c\x14\xb5\x78\xa7\x0e\x24\x2e\x71\x09\x69\xf6\x39\xb0\xf7\
+\x16\xe2\x5a\xed\x6d\x54\x56\x1c\x47\x9f\xd7\x87\x8c\xad\x0c\x57\
+\xc3\x7e\x9c\xde\x50\x1f\x0d\x78\x8b\x00\xe9\x01\x27\x2a\xbf\xbb\
+\x82\xbc\x82\x6c\x94\x95\x7e\x80\x7d\xfb\xbe\x87\xc7\x7b\x0d\xce\
+\x0d\xb5\x90\x64\xd9\x78\x4d\x2a\x65\xf4\x58\x5c\x3a\x84\x9a\x22\
+\xa4\x3b\xd3\x31\xe5\x69\x27\x5e\x7c\x69\x0d\x7a\xba\xbd\x48\x59\
+\x21\x42\xc9\x12\x70\xe6\x95\x51\x32\x58\x77\x68\x39\x9f\x24\xd9\
+\x50\xb5\x77\x00\x93\x33\x26\xc3\xe1\x78\x18\x43\xa1\x00\xae\xb4\
+\xbb\x31\x75\x89\x88\xc9\x2f\x0c\x42\x91\x09\x20\xa8\x98\xe0\x59\
+\x89\xba\x5f\x6f\xc1\xee\x88\x87\xf7\x86\x07\x5d\xd7\xbb\xe0\xbb\
+\xd9\x07\xe7\x26\x0b\xfa\x63\x34\xfc\xb9\x79\x94\x0c\x16\x7c\x35\
+\xaf\x7a\xdd\xc2\xec\x99\xfb\xd6\x9f\x87\x23\x2e\x09\x71\x09\xf1\
+\x90\xc3\x12\x7c\x7d\x3e\x58\xc6\x4b\x58\xb1\x27\x01\x4a\x84\x0a\
+\x6d\x56\x70\xfb\x40\x2e\xdc\x4d\x3d\xb0\xc6\xc7\x62\xd0\x3f\x40\
+\x6b\xfa\x09\x2c\x21\x6b\xb7\x15\x6d\x55\x72\x75\xdd\xf6\xa6\xd9\
+\x51\x80\xdc\x8f\x33\xb7\x94\x2c\x5b\xb4\xa7\xd5\x7b\x16\xd5\xdb\
+\x34\xf0\x08\x15\x56\xa4\x82\x86\x55\x4c\x9c\x1b\x83\xb9\x5b\x63\
+\xa1\xca\xb4\xe5\xcc\x1c\xb5\x7b\x54\xf4\x9e\xd3\x60\xb1\x9a\x21\
+\x45\x64\x08\x56\x15\xd3\x4a\xad\x18\x12\x34\xdc\x6c\x64\xa5\x75\
+\x3b\x1a\xdf\x8f\x02\xe4\x7f\x94\x95\x98\x9f\x91\x3d\x90\x92\x76\
+\x8b\x3a\x68\x08\x1d\xc7\x55\xf4\xd7\x32\xc4\x4e\x14\x91\x5b\x62\
+\x33\xf6\xb3\x5e\x03\x7d\x28\x54\xe8\x96\x6f\x65\x44\x7a\x38\xc6\
+\x4d\x17\x90\xbc\x88\xec\xc4\xac\xe1\xf2\x39\x15\x92\x5f\x7b\xa8\
+\xfe\xbd\x26\xff\xa8\x56\x31\xab\x7c\x46\xcd\xea\xa5\xf9\xae\xab\
+\xe1\x5a\x58\xcc\x64\x12\x22\x20\xea\xa2\xea\xbd\x06\x36\x4c\xed\
+\xca\x44\xdd\x40\x40\x96\x42\xbf\x89\x3c\x1c\xe1\xb8\x7a\x46\xee\
+\x68\x2a\x6b\x4e\xbb\xaf\x17\xe5\xec\xcc\x74\xcd\xc9\x73\xd5\xf0\
+\x94\x36\x70\x7a\x50\x30\x0e\x90\xe1\x09\x38\x78\xba\x0f\x2b\x0a\
+\x93\x70\xf4\x4c\x3f\x5d\x1f\x21\x67\xd5\x46\xba\x8a\x36\x1e\xc1\
+\xba\x9b\x54\x0c\x7b\xb5\xf5\x8d\xbb\x9a\x0f\x8c\x69\xd7\xae\x32\
+\x57\xcd\xf2\x65\x99\xae\x6b\xa1\x66\x98\xc8\xea\xee\x2e\x32\x99\
+\x04\xc3\xf4\x34\x5d\x94\x71\x63\xd3\x19\xbb\x5b\xf7\x23\x3a\x3b\
+\x4e\xc8\xc1\x8b\xe5\x2d\x8e\x7f\xeb\x45\x01\x32\xb7\x4f\x4b\xcd\
+\xcb\xca\xe9\xb0\x38\xbb\x10\xa1\xde\xd7\x73\x10\x4d\x40\x24\xcc\
+\x11\x1e\xd2\x60\xb3\x0b\x30\xdb\xc8\xbe\x15\x18\x2e\xca\x29\x86\
+\xee\x2a\x15\xb2\x5f\x2b\x6a\xf9\xa4\xe5\xb7\xff\x04\x18\x1d\xb5\
+\x23\xe7\x8b\x85\x0b\x0a\xde\x71\x8b\x75\x14\xb9\x19\x35\x5f\x0f\
+\x82\x9c\x82\x40\x82\xf1\xea\xf4\x91\xfd\x9a\xdd\xa8\xc1\xed\xeb\
+\x0c\x81\x66\x76\xa2\xf5\xd3\x96\xc5\xa3\x69\x8d\x0a\xd0\xc7\x8c\
+\x9d\xb3\x3a\xa7\x17\x4e\x98\xe4\x61\x6e\x82\x98\x30\xec\xd7\x40\
+\xe6\x4a\xaf\x04\xb0\x3a\x04\xe3\x2a\x51\x56\xbd\x27\x65\x5c\xfa\
+\xbc\xf5\xbe\x3a\xf7\xbd\xa1\x8f\x67\xcb\x0b\xb9\x73\x7e\x1c\x3c\
+\x91\x1b\xd0\x53\x18\xe9\x52\xa3\xa8\x6a\x88\xa3\xef\x77\x45\x9f\
+\x4f\xbd\xf4\xd9\xc5\xce\xff\x05\x98\xf2\x6e\x86\xd3\x61\x4f\x3c\
+\xc9\x53\x87\x52\xe3\xd3\xa8\x10\x14\x35\xd5\x16\x21\x37\x43\xa8\
+\x95\x36\x23\xe3\xa9\x6d\xbb\x5b\x3b\xc7\xd2\x18\x13\x70\x77\x4c\
+\xdd\x92\x51\x2e\xc4\x0a\x9b\xe8\xf3\x30\x8e\x85\xa8\xb8\x61\x7c\
+\x73\xf9\xcb\xd6\x37\x1e\xe4\xd9\xbf\x01\x0f\xa0\xd4\x37\x2f\xa3\
+\x49\xae\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xb0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x77\x49\x44\x41\x54\x78\xda\x95\x95\x7d\x4c\x55\x65\
+\x1c\xc7\xbf\xcf\x39\xe7\xbe\x78\x19\x2f\x72\x05\x02\x53\x0a\x96\
+\x05\x4a\x8a\x13\x8d\x6c\xe9\x54\x28\x52\x6c\xce\x42\x8b\xb6\x5e\
+\xe6\x6c\x2b\x57\xff\xb4\xb6\xe6\x46\x6c\x4d\x5d\x6b\xc3\xd6\xca\
+\xb5\x18\xb4\x86\xd3\x30\xa2\x05\x2b\xc5\x5c\x25\x6b\xa0\x6b\xc8\
+\xe5\xad\x41\x02\x43\xe2\x2d\xde\x2f\xf7\xf5\xdc\x73\xcf\x79\xfa\
+\x9d\xfb\x22\x63\xd7\xf0\xf2\xdc\xfd\xce\x73\xce\xef\xfe\x9e\xef\
+\xe7\x3c\xbf\xdf\x79\x9e\x87\x61\x99\xb6\xaf\xb0\xf8\x29\xea\x6a\
+\xc9\xd2\x42\xae\x01\xb2\x6e\xb2\xe7\x03\x4f\x8c\x81\x01\x55\xbf\
+\x34\x35\x1c\xfb\x3f\x0d\xb6\x8c\x78\x3a\x75\x43\x77\x03\x59\x30\
+\x94\xab\x9c\x1e\x38\xb8\x46\xc6\x39\x54\xae\x91\xd3\xff\xc5\xf5\
+\xdf\xaf\x9d\x58\x11\xa0\xe0\x99\xe2\x5a\xae\xa2\x84\x93\x98\xa6\
+\x69\x50\x55\x32\xea\x19\x39\x99\xee\x23\x8e\x0e\x58\x34\x35\xe6\
+\x66\xeb\x1f\xee\xa8\x01\x4f\xef\x2e\x74\x72\xae\xc5\xe8\xe2\x6e\
+\x8f\x0f\x49\xd6\x18\x64\xac\x5f\x8d\xa1\x91\x79\x4c\x4e\x3b\x20\
+\x0a\x2c\x20\xac\x85\x01\x1a\xff\xc8\x76\xeb\x46\x59\xd4\x80\x27\
+\x9e\xdc\xc5\x75\x71\x87\xcb\x87\x92\xfd\x8f\xa2\xfc\xcc\x11\xf2\
+\xaa\x68\xb9\xf2\x27\x8e\xbc\xf5\x23\x12\xe3\x4d\x08\x64\x87\x7e\
+\x8c\xfc\x34\xa3\x8e\x9e\xae\xf6\x2d\x51\x03\x72\xb7\xe5\x73\x8f\
+\xd7\x8f\x82\x1d\x69\xf8\xec\xcb\x97\x80\x99\xd0\xec\x63\xcd\xf8\
+\xe4\x74\x23\x3e\xae\x6e\x43\x7c\xac\x09\x66\xa3\x08\x41\x08\xc8\
+\xb4\x75\x77\xb6\x6f\x8b\x1a\x90\xf3\x78\x2e\x9f\x77\xc8\xb8\x52\
+\xf5\x32\xb2\xb3\xd7\x00\x3e\x35\x5c\x6d\x20\x86\xde\xde\xe1\xc6\
+\xd9\xaf\x5a\x50\xdd\xf8\x37\xbd\xbd\x0a\x91\xb1\x76\x02\x6c\x8d\
+\x1a\xb0\x89\x00\xb3\x76\x37\x46\x9b\x4f\x52\x66\x26\x29\x17\x7a\
+\xa8\x40\x26\x02\xda\x3c\x99\x97\x66\x23\xe1\xfc\xd7\xdd\xf8\xf0\
+\x9b\x7e\x58\xcc\xe2\x05\x02\x94\xae\x10\xe0\xc1\xe8\xaf\xef\x01\
+\x7e\x02\xf8\x1c\xe0\xde\x31\x40\x99\x0e\x81\x68\x0d\x18\x04\x8c\
+\xff\xe3\xc7\x8e\xf7\x87\x11\x6f\x11\x4f\x12\xe0\xf4\x8a\x00\x76\
+\x97\x8c\xcb\x15\x2f\x62\xa3\xd5\x06\xcd\x43\x35\x60\x62\x30\x45\
+\xa1\x26\x18\x19\x2a\xeb\xed\x38\xf3\xb3\x8b\xb2\xc6\x1a\x09\x70\
+\x30\x2a\x00\x89\x77\xe9\x9d\x97\xf2\x5e\xb2\x2b\x0b\xa7\x8e\xce\
+\x41\x75\xea\x00\x61\x49\x9c\xb8\x8a\xa1\xac\xca\x8b\x8b\xed\x32\
+\xcc\x86\x80\xd4\x14\x41\x92\x97\x05\x90\x78\x31\x75\x0d\xfa\xbd\
+\xfe\x8d\x7b\x15\x86\x81\x4b\x07\xa1\xf5\xd4\x83\x0b\xa6\xbb\x33\
+\x10\x88\xa5\xa7\x28\xf3\x03\x19\x26\x91\x51\x91\x83\xe3\x09\xc0\
+\xee\x07\x78\x9d\x16\x69\xb5\x7e\x2f\xab\x2a\xbc\x5e\x19\x57\x5f\
+\xdd\x80\xac\x3d\x0f\x83\x0f\x5e\x0b\x2c\x2a\xc1\xa0\x17\x9a\xa1\
+\xf6\xdc\x18\x2a\x26\x52\x31\x1e\x6b\x84\x44\xf1\x2a\x63\x13\xc3\
+\xb6\xb6\xd4\xfb\xa6\x28\x67\xe3\x96\xef\xc6\xfc\xca\x0b\x07\x92\
+\x53\x50\x59\x7a\x08\x8a\xe3\x14\xfa\xff\x8a\x87\x75\x67\x3e\x12\
+\xe3\x66\xd0\x57\x7f\x03\xbd\xbd\x32\xf6\x1e\x4d\x42\xd2\xf5\x35\
+\x68\xec\x9f\xc3\x98\x43\xf6\x65\x72\x35\xb1\xe0\xdf\x11\xd7\xb2\
+\x00\xd9\x18\x9b\xc6\x7c\xca\xa8\xe1\x9d\xe3\xc0\x81\x3c\xa8\x2d\
+\xcd\x60\x99\x7d\xc0\x03\xc0\x6c\x9f\x1d\x33\x43\x2e\x24\xac\x8f\
+\x43\xca\x56\x2b\x39\x34\xc8\xdf\xab\x30\xc6\x8a\x50\x7e\xea\x87\
+\x67\x74\x7e\x24\xc1\x67\x5f\xb7\x2c\x60\x58\x8a\x1d\x5d\x7d\xe2\
+\x8d\x34\x4b\x51\x2e\x94\xba\xf3\xe0\x4e\x07\x84\x07\x2d\x30\xbe\
+\x99\x01\x78\x94\xe0\x08\xca\x21\xcc\x12\x94\x1f\xc6\xa1\x76\x2e\
+\x00\x92\x00\xb6\x4a\x82\xeb\xea\x20\xe4\xb1\x85\xdf\xd2\x3c\x73\
+\x7b\xee\x09\xb8\x2d\x59\x5e\x49\x28\xda\x57\x63\x3d\xfe\x1c\xe4\
+\x4b\x35\xe0\x2e\x4f\xa0\x9a\xdc\xa3\xc1\x74\xec\x31\x08\x7b\xb3\
+\xc1\x7d\x7e\x30\x93\x04\xad\x75\x00\xf2\xa7\x36\x30\x8b\x14\x54\
+\xd1\xcf\x06\xda\x65\xa7\x1b\x6e\x53\x79\x98\x25\xdd\x3d\xe7\x89\
+\x00\x74\xc0\xd0\x94\x79\xb6\xbc\xd0\x30\xd1\x05\xbf\xad\x13\x30\
+\x18\x82\x7f\xe8\xbb\xa5\x4b\x81\x74\x68\x03\xd8\xba\x44\x68\xcd\
+\x83\x50\x3b\xa6\x42\xe2\x8b\x12\x8c\x8a\x6f\xef\x9c\x82\x73\x64\
+\xe1\xdc\x23\xb2\xfd\xed\x08\x40\x7b\x5c\x12\xdf\x5c\x59\x0e\xcf\
+\xe7\x15\xe0\xe2\xd2\xc1\x3a\x04\x8a\x16\x38\x68\x18\xa5\x24\xf0\
+\x5d\xb2\xa5\x19\xd6\x0f\x25\xdf\xbc\x0f\xc3\x3d\x93\x77\x36\xcb\
+\x8e\x87\x22\x00\xad\x09\x29\x7c\x7b\xd9\x6b\x70\xd5\xd4\x50\x1a\
+\xcc\x58\x71\x23\x35\x89\xd6\x46\x77\xcb\x04\xf2\xfc\x4e\x16\x09\
+\x48\xcf\xe0\x79\xa5\xcf\xc2\x5d\x57\x0f\x66\x34\xae\x1c\x40\x4d\
+\xa2\x99\xdd\xea\x9d\xc5\x4e\xd9\x11\x09\xb8\x99\x95\xc3\xb7\xef\
+\xdf\x0d\xd7\xc5\x6f\xc1\x0d\xc6\xc0\x61\x12\xc5\x4b\x07\xae\xfa\
+\x91\x10\xac\x35\x87\x6d\xc2\x81\x7c\xf7\x3d\x00\x35\x40\xdd\x5a\
+\x6b\xca\xe1\x54\xda\xd8\xe2\x4c\x46\x24\x1b\x17\x21\x3c\x64\xe1\
+\x41\xe1\x81\x0a\xd5\x66\x41\xf1\xc3\xe9\x57\x31\xe5\x57\x30\x2d\
+\x6b\x3a\xa4\xbe\x58\xf5\x1e\x8e\x00\xe8\xad\x1a\xe2\x26\x3a\x5a\
+\xde\x25\xb1\xb5\x54\xd2\xa2\x70\x90\x91\xae\x56\x41\x0a\x6c\xd4\
+\xd3\x9a\x1f\x4a\x28\x5e\x04\xb3\xd3\xc6\xd1\x4a\x2b\xe1\x0e\x65\
+\xa7\x89\x22\x2e\x97\x70\xd9\x1b\xd6\xfb\x0f\x95\x04\x06\x37\xe7\
+\x1d\xbb\x2f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xe3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xaa\x49\x44\x41\x54\x78\xda\x9d\x95\x7f\x4c\x5b\x55\
+\x14\xc7\xbf\xf7\xf5\x27\xa3\x08\x24\xb4\x30\x60\xd3\xb5\xa3\x0c\
+\x1d\x60\x34\x51\x34\x8b\xba\x60\xcc\x32\x83\x26\x4b\x16\x17\x62\
+\x4c\x8c\x31\x59\x8c\xd1\x64\x51\x50\xc7\xaf\x25\x18\xe6\xfe\x30\
+\x1a\x51\x97\x6c\x4b\xd8\x74\x4b\x4c\x98\x84\x04\x35\x73\x9a\x09\
+\x4c\xb1\x0c\x19\x11\xa7\x40\xd7\x8d\xad\x50\xa0\x50\xca\xa0\x1b\
+\x85\xbe\xf7\xae\xe7\xbe\x16\xb6\x6e\x65\x09\x9c\xd7\xdb\xf7\xda\
+\x7b\xdf\xf9\x9c\x7b\xce\xb9\xe7\x30\x90\x7c\xdd\xf7\x31\xd7\xe9\
+\x64\xe8\x18\xa2\xb2\x74\x8f\x7f\x8c\x97\x15\x27\x00\x85\xd3\x50\
+\xf5\xd8\x5b\xb8\x9f\xb1\x2f\x7a\xeb\xf9\x86\x54\x05\xa9\x49\x80\
+\xca\xb9\xb6\x40\x77\xc7\x62\xae\x5d\x34\x47\x17\x63\xf4\xc4\x19\
+\xf4\x12\x03\xe7\xd2\x8a\x00\x9a\xc6\x6c\x98\xc1\x1d\x94\xc1\xbe\
+\xba\x58\xcd\xf3\xad\x7a\xc8\xfc\x2e\xc3\x62\x0f\x9c\xab\x64\x8d\
+\x4c\x56\x2d\x20\x2c\x03\x13\x21\x3d\x9c\x56\x23\x74\x89\x00\xb1\
+\x77\xc4\x8c\x8e\xbe\xfe\xf5\x33\x02\xf4\x1e\xe0\x76\x9b\x66\xe2\
+\x3d\xa2\x29\xe7\x11\x2c\x2a\x61\x8c\xce\x86\x70\x75\x22\x82\xcc\
+\xb4\x14\x14\x65\xa7\x90\x3b\xf5\x51\x55\x2c\xb1\xc7\x24\x89\xc3\
+\xe3\x57\xc0\x1a\x7b\x6a\xb8\xc3\xa6\x83\xaa\xc6\x5b\x21\x1c\xa3\
+\x92\xe5\xb2\x1a\xc6\xf0\xcc\x0c\x7a\x87\x26\xb1\xa7\xf8\x35\x74\
+\x8d\xff\x88\x12\xbb\x95\x00\x26\x72\x19\xd3\x96\xb3\x04\x41\xd3\
+\x13\x7b\xd0\x4f\x3f\x3f\xef\xae\xe6\x8e\x2c\x13\x29\x8b\x7a\x5a\
+\x5a\xf2\x3b\x59\x2f\xab\x0b\xf0\xcd\x84\xd0\x35\xe8\x43\x4d\xe9\
+\x41\x64\x59\xb2\x51\xd7\xb1\x17\xdb\x9c\xeb\xc9\x05\x26\x5a\x4b\
+\x17\x93\x34\x00\xdd\xb4\x58\x49\x31\x86\x44\x81\x70\x4f\xd0\x0e\
+\x3e\x73\x55\x73\x3b\x01\x78\x2c\xc0\x9a\xe5\x5c\xa1\x21\xc3\x17\
+\xbc\x81\xee\x21\x3f\x6a\xb7\xd7\x63\x73\x66\x1e\xa6\xe6\x26\x51\
+\xdf\xfe\x36\x9e\x2e\xb0\x91\x22\xa3\xe6\x26\xbd\xa4\x27\x98\x8e\
+\x94\x0a\x82\x48\x05\xae\x3d\x33\x0a\xc2\xe5\x71\x4a\x8c\x4f\xbb\
+\xaa\xb8\x3d\xdb\xac\xed\x40\x83\x90\x72\x05\x8b\x18\x99\x0c\x61\
+\xf0\xfa\x3c\x2a\x9e\xa9\x80\x9d\x94\x0b\xf1\x05\x7c\x78\xa7\xf5\
+\x0d\x24\x27\xa5\x92\x52\x3d\x4c\x46\x1a\x26\x13\x4c\x7a\x23\xb9\
+\x4b\xa4\xa7\x42\x96\xeb\x90\xf1\x80\x05\x85\xeb\xcd\x18\x14\x80\
+\x43\x7f\x54\xf1\x3c\x02\x28\x8a\xaa\x59\xad\xb0\x08\xbc\x93\x73\
+\x70\x7b\x6e\xe1\xcb\xdd\x87\x61\x30\x18\xb0\x1a\xe9\xf7\xf6\xe1\
+\xb4\xe7\x08\x1e\x77\x58\x31\x34\x4a\x69\x7a\xe8\x3c\xed\x20\xc7\
+\x84\x88\x2c\x43\x25\xe5\x03\xc3\xd3\xf0\x8e\xce\xe3\xf0\x2b\x47\
+\xc8\xba\xd5\x29\x17\xd2\xe5\xe9\x44\xeb\x95\x6f\x51\xe2\xcc\xc4\
+\x65\x1f\xed\xe0\x60\x47\x15\x77\xe4\x52\x90\x99\x8c\x7e\xf7\x14\
+\x7c\x3e\x52\x5e\xbe\x7a\xcb\xef\x04\x34\xbb\x4f\xe0\xa9\x82\x2c\
+\x78\xbc\x04\x68\x68\xff\x88\x6f\xde\xb8\x0e\x43\xd7\x42\x08\x06\
+\x54\x7c\xf2\x52\x03\x24\xbd\xb4\x26\xe5\x42\xba\x87\x5d\x38\xfd\
+\x5f\x13\x9e\xdc\x42\x2e\x1a\xa1\x2c\x6a\xe8\xa8\xe5\x9b\x72\x0d\
+\x38\xda\x76\x0e\x8b\xb7\x14\xb4\x57\x9e\x5b\xb3\x72\x21\x4d\xae\
+\xa3\x38\x79\xf1\x18\xde\xda\xb9\x03\xee\x61\x8a\xc1\x9b\xcd\xe5\
+\x7c\xde\xf6\x0f\x16\x14\xda\xde\xe9\x00\x32\xad\x39\xe8\xa9\x71\
+\xad\x19\x70\xe2\xc2\x71\xd4\xb6\x56\xe2\xd9\x17\x6d\x48\x9a\x28\
+\x02\x2b\xa8\x71\xf0\x47\x4b\x2d\x5a\x11\xa3\x0f\xce\x7f\x47\x90\
+\x8c\x2c\xf4\x1c\xe8\x5e\x13\xe0\x54\xef\x29\xd4\x7c\x5f\x89\xe7\
+\xca\xac\x70\x9d\x9d\x05\xdb\x5a\xeb\xe4\x8f\x10\x80\x47\xb8\x96\
+\xcb\x7a\x13\x43\xf7\x4f\x53\x58\x27\xdb\xe0\xaa\xeb\xa4\x4c\x32\
+\x2f\xbf\x2c\xf2\xdc\x17\x1c\x83\x41\x17\x4d\x00\xb6\x54\x21\x62\
+\x85\xd2\x48\xe7\xa1\xf1\xf7\x46\x7c\xd3\x79\x0c\xdb\xca\x32\xd0\
+\x73\x66\x0e\xec\xe1\x2a\x27\x2f\x7c\xde\x02\x25\xc2\x97\x15\x49\
+\x26\x8e\x9e\xb6\x00\x26\x07\x66\x11\x68\xf6\x53\x46\x19\xb5\xff\
+\xbd\xd3\x5e\x3c\xf4\xba\x03\x16\xb3\x25\xaa\x74\x09\x10\x6b\x24\
+\xa2\x36\x99\x74\x46\xa4\xe7\x58\x50\xf2\xb2\x05\x7f\xfd\x7c\x93\
+\x5c\xb4\xdf\xc9\xb7\xc6\x00\xc2\x22\x71\x9a\x55\xaa\x7c\xb2\x24\
+\xe3\xef\x96\x19\x4c\x79\xe6\x30\xd3\x36\xa5\x41\xc6\xa6\xc7\xf0\
+\x58\x5d\x31\x4a\xcb\x37\xd2\xc1\xe4\x09\x5d\xa4\xd5\x32\x35\xca\
+\xee\xfb\x25\x04\xb6\xe5\x43\x72\xd1\x0b\xf1\x3b\xe0\x74\xaa\xc5\
+\xc1\x93\xa9\x54\x5f\xb9\x30\x87\xd1\x3f\x43\x18\x69\xb9\x06\x89\
+\x7a\x40\xfe\xfb\x79\xd8\xbe\x67\x03\xe4\x48\x3c\xe0\xee\x72\xad\
+\x33\x30\xf4\x0b\x40\xfe\x07\x79\x04\x48\x89\x03\x88\xce\xa6\x2a\
+\x54\x91\x64\xd1\x68\xa8\xe8\x5d\x9a\x87\xe7\x87\x00\xf6\xbd\xb7\
+\x0f\x27\xcf\x36\xe1\x89\xdd\xd4\x40\xe4\x95\x03\x2d\x3c\xa1\x01\
+\xce\x10\xc0\x59\x41\x80\x1d\xf1\x00\x6d\x17\x54\xfc\x14\x01\x89\
+\x88\x12\xa2\xc0\x3f\x10\xc6\xc8\xaf\xf3\x48\x77\x26\xa3\x78\x57\
+\x3a\x88\x7b\x3b\xc8\x09\x44\x00\x2e\x89\x20\xe7\xbd\xeb\xe0\x85\
+\xbb\xd2\x20\x2f\xa8\xcb\xd9\xb0\xbc\x93\x18\x24\x42\x83\x8a\x24\
+\x82\xde\x08\xa6\x06\x14\x14\x95\xa5\x8a\xa2\x7b\xbf\xbe\x0f\x83\
+\x59\x42\x5f\xcb\x0d\xb0\xdc\x57\x37\xf1\x07\x4b\x93\x91\x65\xa7\
+\x7a\x94\x20\x70\xc2\x5d\x5c\x55\xa3\xcd\x84\xb2\x45\x91\x19\x8c\
+\x46\xa6\x05\x72\x25\x11\xeb\xc6\x3d\x0b\xb8\xfe\xdb\xcd\xa8\x11\
+\x39\x04\x31\xa7\x51\x93\x30\xde\x6b\x13\x5b\x6e\xfe\xd1\xbc\xbc\
+\x9f\x5b\x6e\x27\x09\x47\x38\xa8\x62\xe4\xf8\x55\xf6\x3f\x25\x3b\
+\x27\x94\x48\x9f\x94\xf8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x03\xcc\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x93\x49\x44\x41\x54\x78\xda\x9d\x96\x5d\x4c\x53\x67\
+\x18\xc7\xff\xef\x39\xa7\x28\x6e\x5a\xf0\xab\x94\x61\xb1\x14\xa8\
+\x50\x11\x5a\xda\x75\x31\x98\x66\x7e\x24\xe8\x85\x26\xc6\x2b\xd4\
+\x44\x2f\x48\xbc\x22\xea\x85\x78\xef\x8d\x5e\x91\x90\x18\x5d\x5c\
+\xa2\xcb\x9c\x26\x8b\x5b\xa6\x2e\xca\x36\x75\x29\x2a\xa1\x40\x69\
+\x2b\x14\x28\xd0\x16\x4a\x6d\x29\x6a\xb4\x1a\xd9\x68\x7b\xfa\xfa\
+\xf6\x88\x5e\x41\xdb\xe3\x7b\xf9\x3c\xe7\x7d\x7f\xcf\xff\xf9\xca\
+\x21\x58\xe6\xf4\x8c\xcd\xd0\x92\xe2\xd5\x10\x29\x45\xb6\xc3\x13\
+\x82\xd9\xd7\xef\xb0\x7d\xcb\x26\xb2\x94\x9f\x2c\x77\xd1\x31\xfe\
+\x9c\x1a\xb4\xa5\x10\xd3\xe9\xec\x00\x8e\x83\x37\x18\x81\xb5\xfa\
+\x1b\x79\x00\xfb\x48\x88\x6e\x2d\x2f\xc9\x0b\x30\x3c\x3d\x0b\x5b\
+\xad\x46\x1e\xa0\xcb\x1d\xa0\x0d\xe5\x6a\xa4\x72\x00\x04\x06\x70\
+\x4f\x47\xd1\xdc\x50\x21\x0f\xf0\x7b\xdf\x38\x35\xb3\x14\xe5\x03\
+\x18\x60\x29\x3a\xf8\x6d\xb5\x3c\xc0\xf5\x27\x5e\xfa\x5d\x45\x59\
+\x5e\x80\xde\x40\x18\x47\x9a\x0c\xf2\x00\x97\x1f\xba\xe9\x8e\x4a\
+\x4d\x5e\x80\xc7\x93\x21\x9c\xd8\xd5\x20\x0f\xd0\xd9\xd5\x4f\x9b\
+\xaa\x18\x40\xcc\x01\xe0\x39\x3c\x99\x08\xa1\xad\xd9\xb2\x34\xe0\
+\xe9\xe3\xbe\xf3\xb1\xb9\x68\x7b\x01\x47\xf1\xcb\xc2\x16\xc9\xf8\
+\x76\x2e\x0e\xb3\x3a\x09\x93\x76\x53\x5e\x0a\x06\x83\x33\x18\x88\
+\x2a\xb0\x66\xa3\x52\xb2\x1d\x5e\x31\x86\x44\x9a\x60\xe3\x06\xf5\
+\x39\x32\x31\x19\xa0\x95\x3a\xad\xe4\x38\x65\x8f\xa1\x5a\x5b\x8c\
+\x47\xfd\x51\xa8\xe2\x3e\xd4\xe8\x36\x43\xcc\xa1\x80\x67\x0a\x46\
+\xfd\x53\x88\x29\xf5\xd8\x69\x51\x63\x3c\xf8\x1a\x1d\x36\x95\xe4\
+\x9b\x9a\x0a\x83\x8c\x79\xc7\xa8\xbe\x56\x2f\x19\x5a\xef\x04\x51\
+\xbf\xad\x14\xff\x3a\xc2\xf8\xcf\xef\x85\x4a\xad\x46\x3a\x9d\x7d\
+\x92\x39\x8e\x20\x16\x8d\xa2\x50\x67\xc0\xf7\xd6\x32\x78\x9e\x45\
+\x70\x65\xff\xc7\x80\x27\x7d\x7e\x10\xb7\xfb\x19\xad\xab\x33\xb0\
+\x0f\x29\x8e\xde\x98\x40\x4d\x7d\x19\xde\xbe\x4f\x20\x3e\x9f\x82\
+\x9c\xa3\x5c\x25\x60\xcd\x57\x05\x18\xf5\x84\xf1\x73\x4b\x15\x0b\
+\x8c\x60\x68\x78\x14\xc4\xd1\xeb\xa4\x0d\x46\x03\x0a\x78\xe0\xd0\
+\x15\x2f\x34\xa6\x0a\x50\x91\x82\x10\x59\xef\x23\xb3\xb2\x08\x4f\
+\x10\x1a\x0c\xe0\x56\xab\x01\x0b\x2c\xbe\xe1\xa1\x11\x90\xee\xee\
+\x3e\x6a\x34\xd5\xa2\x50\x00\x0e\x74\x7a\xa0\x34\xea\x18\x80\xe5\
+\x9d\xca\x03\x64\xfa\x91\xb0\x7a\xc4\x5d\x7e\xdc\x6e\xab\xc7\x7c\
+\x92\x01\x86\xbd\x20\x7f\xff\xf5\x80\x36\x5a\x1a\xb1\x52\xa0\xd8\
+\x7b\x61\x00\x69\x83\x5e\x52\xf3\x25\x80\x84\xc8\x6a\xe2\xf5\xe1\
+\x7e\xbb\x19\xff\xa7\x08\x5c\x4e\x37\xc8\xdd\xbb\xf7\xa9\xc5\x62\
+\x62\x7e\x11\x3d\xfe\x37\x38\x7e\x23\xb2\x28\x59\x1e\x81\x2c\xe6\
+\xf4\x6a\x4b\x29\xb6\xeb\x8a\x58\x7c\x3c\x9c\x4e\x17\xc8\x1f\xbf\
+\xdd\xa1\x26\x8b\x91\xb5\x63\x0a\x0a\x26\xb1\xb0\x80\x03\xc7\xdc\
+\x32\xdf\x97\x6a\x96\x66\x61\xce\x8b\x02\x12\x44\x80\x42\x4c\xc0\
+\xd9\xef\x04\xb9\x79\xf3\x57\x6a\x36\x37\x22\x95\x92\xd7\x35\x4b\
+\x16\x9a\x28\xb0\xee\xc5\x2d\xac\x3d\x7f\x06\x81\x4b\x31\xb8\x7a\
+\xba\x41\x7e\xba\x7a\x9d\x1a\xcd\xc6\xcf\x80\x8c\xd4\x4c\x6f\x67\
+\x54\x80\xa6\x73\x2a\x91\x32\x43\x38\x29\x7a\x91\xb5\x66\x61\x22\
+\x82\xaf\x3d\x7f\xe2\x55\x53\x1b\x3c\xbd\xbd\x20\x97\x7f\xf8\x91\
+\x9a\x1a\x4d\x9f\x01\xbc\xc0\xe3\x9f\xdb\xf7\x10\xdb\x6c\x85\x46\
+\x5d\xc2\xfa\x39\xfb\x24\x73\x6c\x55\x84\xa2\xb3\x50\x4d\x39\xb0\
+\xe7\xc0\x3e\xb6\xbb\x32\x46\x1e\x0a\x42\x59\x91\x07\x41\x3a\x3a\
+\x2e\x52\xb3\x25\xa3\x40\x94\x2e\x08\x0a\x01\xf6\xae\x07\x78\x63\
+\xd8\x05\x5b\x55\x19\x92\x39\x00\x0a\x06\xb0\x4f\x84\x51\xe4\x7d\
+\x08\x5b\xf3\x6e\xa4\x92\x1f\x03\x15\x58\xa0\xae\xc1\x21\x90\xd3\
+\x27\xcf\x76\xeb\x6b\xf4\x3b\x44\x51\x5c\x54\x20\xc0\xe3\x70\xc0\
+\x78\xac\x0d\x36\xad\x0a\x49\x31\x7b\x8e\x14\x6c\xb8\xec\x41\x96\
+\xef\x6b\x9d\xa8\xb7\x5a\x21\x7e\xca\x04\xcf\xc3\x37\xe2\x3b\xbd\
+\xec\xbc\xde\x1b\x9a\xa1\x26\xcd\xfa\xfc\xb6\x69\xe8\x25\xf6\xd5\
+\xc9\xfc\xab\x78\x34\x32\x4d\x4b\x95\xab\xf3\xaa\x41\x24\xfe\x0e\
+\x3b\x6b\xcb\x97\x7c\xeb\x03\xaa\xba\x8a\xea\x8e\xfc\xcb\x2c\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x48\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x0f\x49\x44\x41\x54\x78\xda\xa5\x95\x5b\x48\x14\x51\
+\x18\xc7\xff\xe3\xae\xab\x69\x6e\x1a\x4a\xa1\x29\x14\x69\x61\x04\
+\xa1\x89\x94\x11\xa4\x3d\xf8\x10\x41\x05\x12\x54\x4a\x26\x15\x15\
+\x95\xd1\x1a\xd1\x4b\xd1\x43\x50\xf4\x2e\x95\x15\xde\x36\x13\x4d\
+\xb2\xed\x8a\x59\xa4\x21\x86\x91\xb7\xcc\x8d\xd6\x76\x35\xd7\xd4\
+\x5c\xd7\xbd\xcd\x65\xe7\x9c\xce\x2a\x5a\xea\xaa\xbb\xfa\xc1\x61\
+\xe6\x61\xe6\xf7\x3b\xe7\xff\x7d\xc3\x70\x58\x42\xa5\x6b\x8d\x45\
+\xe9\xeb\x43\x73\xbf\x9a\x5d\x0e\x43\x9f\xed\x5a\xd3\xa9\xc4\x5b\
+\x33\x9f\xe1\x16\x0b\xdf\x55\x6e\xd4\xe6\x25\x47\x1c\x5c\xad\x0e\
+\x82\xd3\x4d\x60\xb4\xf0\xa8\x6d\x36\xe3\x55\x5e\x22\xb7\x64\xc1\
+\x24\x3c\x2a\x4c\x85\x51\x5e\x06\x25\x14\x84\x52\x48\x04\xa8\xfc\
+\xd8\x8b\xda\xa3\xff\x24\x7e\x0b\x66\xc2\x09\x83\xbb\x09\x81\x24\
+\x03\xdd\x16\x09\x16\x81\xa0\xb3\xb5\x17\x0d\xe7\x93\x38\xbf\x05\
+\xde\xe0\x32\x83\xdb\x45\x8a\x8e\x11\x1e\x0e\x9e\x42\x90\x65\xf0\
+\x22\xa0\x6f\xec\x46\xfb\xcd\x74\xce\x67\xc1\x5c\x70\xab\x30\x01\
+\x17\xd8\x95\x77\x7b\xe0\x04\x2e\xd6\x13\xeb\x88\x13\x03\x8d\x1d\
+\x97\x7c\x12\xcc\x05\x1f\x72\xc9\xf8\x36\x2c\xb1\xec\x09\x78\x69\
+\x02\xee\x14\x65\xb8\x3c\x8b\x85\x33\xf8\xa1\xcd\xb1\xa0\x60\x21\
+\xb8\x27\x7f\xd7\x0c\xb8\x93\x9d\xc4\x21\x01\x76\x7d\xdf\xfc\x3d\
+\x98\xab\xa1\x4e\x89\xe2\xf3\x00\xcf\xee\xa9\x77\x38\x4f\xe0\xb0\
+\xf1\x10\x9b\xdb\xba\x38\xbf\xe0\x32\x03\xb9\x29\xbe\x0c\xb3\xcc\
+\x59\x63\xf9\x79\xe1\xad\xbd\xfd\x95\x39\x71\x9c\x3f\x70\xcf\x9c\
+\xb7\x0f\x0b\xb0\xb2\x78\x26\x1b\x3a\x1f\xdc\xeb\x98\x66\x68\x8d\
+\x15\xb9\x49\x11\x59\xff\xc3\x25\x06\x97\x29\xf0\xdd\x22\xc2\x6c\
+\x73\x43\xf0\x11\xee\x55\x70\xb5\x79\x98\x66\xae\x55\xc3\x34\x26\
+\x4d\x7c\x9d\xe3\x3b\xa7\x18\x71\xca\xe8\xfc\x23\x42\xf4\x03\xee\
+\x55\x90\x7a\x47\x5f\x95\x9b\x1a\xb5\x3f\x3a\x3c\x18\x16\x9e\x8d\
+\x20\xdb\x3a\x61\xab\x69\xc0\xc5\x1a\x4a\x58\xf6\xbe\xc3\xbd\x0a\
+\x5e\x57\xeb\x68\xdd\xb2\x44\x44\x45\x84\x20\x2e\x32\x14\xa3\x2e\
+\x09\xfa\x51\x09\xbf\xd8\x89\x44\xc9\x3f\xf8\x2c\xc1\xd3\x9a\x37\
+\x74\xe7\xee\x34\x84\x05\x02\x05\xba\x5e\xac\x64\x82\xc8\x88\xe5\
+\xa8\x33\xda\x21\xb3\xe9\xf1\x17\x3e\x4d\xa0\xab\x7d\x4b\x05\x4e\
+\xc4\x96\xcd\x9b\x10\xb3\x2a\x0a\x2a\x25\xc1\xe9\x72\x3d\x10\xae\
+\x86\x5d\x15\x8c\xdf\x56\x11\x82\xe4\x1f\x7c\x4a\xf0\xa4\xea\x25\
+\x4d\xde\x9e\x8c\x6d\x29\x49\x50\x87\xa9\x51\xff\xae\x1e\x81\x0a\
+\x25\x38\xc9\x8e\x33\x15\x06\x28\xa3\xa3\x61\x51\x04\xc1\x6c\x15\
+\xd8\x09\x7c\x87\x8f\x0b\x58\x2c\x64\x47\x46\x1a\x17\xac\x52\xa2\
+\xe1\x7d\x03\x5a\x5a\x3e\xe1\x42\x7e\x3e\x7e\x18\x0c\x4c\x12\x00\
+\xc1\x66\xc1\xe5\x67\x83\x50\xad\x8b\x87\x29\x40\x85\x21\xf3\x98\
+\xcf\xf0\x71\xc1\xbd\xc2\xb2\xae\x3d\x07\x32\x37\xae\x08\x0d\x01\
+\x02\x38\x96\x35\x81\x4e\xa7\x83\xa6\xa0\x00\x1a\x8d\x06\xf1\x09\
+\x09\xd0\xde\x2d\x44\x1d\xb7\xb7\x7a\x4d\x52\xc2\x7e\x63\x8b\xbe\
+\xdf\x5c\x99\x1d\xe3\x0b\x7c\x2a\xa2\x1b\xd7\x6f\x9b\x8e\x9d\xc8\
+\x89\x55\x28\x14\x70\x38\xec\xe8\xe9\x31\xe0\xec\xb9\x7c\x24\x6f\
+\x4d\x81\xe8\x14\x51\x5a\xfe\x60\xd1\xbf\xd6\xa9\x17\x2f\xe6\x5f\
+\x31\xe5\x1d\xcf\x89\xa5\x94\xc0\x66\xb7\xc3\x60\xfa\x89\xe7\x35\
+\x2f\x50\x5c\x5a\xb4\x68\xf8\x34\x81\xa7\x72\x8f\x9c\x34\x1d\xca\
+\xce\x8a\xe5\xd9\x5f\xa9\xe4\x7e\x31\x1e\x3d\x2e\x59\x12\x7c\x96\
+\xc0\x53\x59\xfb\x0e\x77\x05\x06\x2b\x37\x94\x69\x1f\x06\x2c\x15\
+\xee\xa9\xbf\x25\xee\xbd\x3e\x3d\x5f\xbd\x98\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xbe\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x85\x49\x44\x41\x54\x78\xda\xd5\x93\x6f\x4c\x1b\x65\
+\x1c\xc7\xbf\xcf\x3d\xbd\xb6\xf6\x8f\x93\xf6\x60\x80\xb4\x64\x24\
+\x5b\xc6\xd4\xa4\x44\x74\x4b\x44\x24\x06\x14\x57\x49\x66\x70\x8e\
+\x76\x6c\x4c\x5f\xb9\x44\xd4\xc4\xc4\x44\xdf\x9a\xf8\xc2\xc4\x37\
+\x73\xd1\x57\xbe\x30\xcb\x68\x5d\x16\x75\x6c\x32\x32\x66\x8c\xce\
+\x8c\x05\x82\xdb\x18\x62\x57\x75\x1b\xb0\xc2\x5a\x4a\x0b\xdd\xf5\
+\xcf\x5d\xaf\x77\x3e\xed\xa2\x71\x0e\x68\x51\x7c\xe1\xef\xee\x97\
+\x5c\xee\x79\xee\xfb\xf9\xfe\x7e\xbf\xe7\x08\xfe\xe3\x20\xff\x3b\
+\xc0\xed\x56\xb7\x89\x08\xb6\x13\xfa\xc6\xfa\x56\x39\x38\xb5\xbe\
+\x80\xa5\x96\x67\x5f\x33\x3c\xd7\xfc\x11\xef\x6e\x86\x36\x1f\x82\
+\xd4\x7f\x7e\x76\xdd\x00\x4b\x3b\x77\xf9\x4c\xaf\x7b\xbb\x08\xcf\
+\x21\x17\x18\x81\x12\x98\x47\x36\x10\x7d\x78\x5d\x00\x8b\xdd\x07\
+\x66\xcc\x07\x77\xd7\x68\xd3\x41\x68\xd7\x7e\x81\x12\x97\x20\x5d\
+\x8a\x78\x6c\x67\x4f\xfa\x49\xfc\x99\x8e\x3a\xa8\x6a\x05\x08\xb9\
+\x5a\x36\x74\x2a\xbe\x66\xf1\xbd\x3d\xd3\xa6\x57\x76\x39\xb4\xab\
+\x57\x0a\x6d\x51\xd3\x2a\xd2\xe3\xe1\xc3\xf6\x81\xfe\xde\xfc\x3a\
+\xb9\xfd\xf6\x5b\x9a\xbe\xa1\x1e\xd9\xe0\x0d\x64\x47\x03\x87\xcb\
+\x4e\x1d\xef\x2d\x55\x3c\xe6\xe9\x99\xb6\xbc\xdc\xe1\xd0\x46\xbe\
+\x83\x96\x4c\x41\x95\x35\xa4\x7e\x5a\xf0\x0b\x83\x27\x3c\x7f\xec\
+\x21\xf1\x3d\x7b\x27\x4d\xae\xca\x7a\xb2\x65\x2b\xc0\x1b\x21\xfa\
+\xce\xdc\xb4\xf9\x8e\x38\x8a\x89\x47\x3d\xdd\x33\x1b\xf6\xbb\x6b\
+\xd4\x61\x26\x9e\x4a\x03\x1c\x81\x18\x4c\x5c\x12\xbe\xfa\xa2\xe1\
+\xaf\xfb\x0a\x33\x58\xe8\x7c\x49\xb1\x54\x71\x94\x3c\xe8\x00\x79\
+\xc8\x85\xa5\xa3\x83\x33\xc2\xe7\x47\x9c\x2b\x89\x47\x3c\xdd\x7d\
+\x65\x07\x3a\x3d\xda\xc8\x39\xa8\x91\x30\x38\x1d\x45\x2c\xb8\x38\
+\x5d\xf9\x75\x7f\xed\xdf\xf7\x16\x00\xd1\x9e\x57\xeb\x38\x31\xf2\
+\x9b\xc9\x6e\x00\x8c\x66\xd0\xe6\x16\xc4\x8f\x0f\xdd\xac\xf0\x7f\
+\x76\x4f\x25\xd7\x6a\x37\xfb\xaa\xde\xed\xed\x22\x63\x17\xa0\xcc\
+\xcd\x82\x2f\xb3\x43\xcc\x50\x64\x05\x87\xad\xf2\xe3\x0f\xe3\xcb\
+\x02\xf2\x11\x7a\x7e\xcf\x3b\x1b\xac\xb9\xf7\x29\x73\x43\x9d\x4e\
+\x10\x57\x23\x66\xde\xfb\xc0\x5f\x37\x3e\xf6\x67\x3f\x2f\x53\x83\
+\x6f\x53\x47\x6b\x17\x37\x31\x01\x25\x3c\x5f\x70\x9e\x92\x15\x4c\
+\x25\xd3\x6d\xdb\x81\xb3\xcb\x55\x7b\xd7\x31\x0d\x3d\xdd\x7e\x4b\
+\x70\x0a\x1b\x95\xf0\x2d\x90\xd0\x2c\x94\x6a\x27\xa6\xbe\xfd\x7e\
+\x30\x21\xc9\x6f\xda\x2c\xe6\xa3\x35\x2d\x4d\x8f\x92\xc0\xcf\xc8\
+\x45\xe6\x01\x4a\xf3\x6d\x47\x40\xcc\x1c\x7a\x4c\xce\xbc\xb1\x52\
+\x3b\xef\x02\x5c\x77\x77\xee\x30\x4f\x5c\x1c\x36\x86\xe7\xa0\xb1\
+\x15\x5a\x5e\x01\xdd\x93\x4d\x88\x5d\xbc\x02\x5b\xc3\x23\x50\xce\
+\xfd\x80\xdc\x42\x94\x0d\x94\x63\x37\x87\x50\x26\x8b\xad\x52\x6a\
+\xd5\x7f\xe9\x9e\xc5\x51\x90\xbe\x2d\x66\xab\x07\x44\x05\x72\x2a\
+\x88\xc5\x0a\xce\x26\x20\xc7\xa0\x90\xa5\xc2\x69\xc9\x5f\x6c\x05\
+\xa3\x69\xc9\xd3\x96\x93\xfc\x6b\x02\x7c\x43\x0d\xe6\x5a\x1d\x15\
+\x37\xb2\x16\xa8\xf9\x17\x9a\x76\x27\x99\xe3\x42\xb2\x47\x1d\xfb\
+\x6a\x42\xce\x24\xb7\xcb\x92\x05\x45\x62\xd9\xf2\x86\xa8\xbe\xef\
+\x09\xbd\xc1\x93\xcd\x0b\x13\xe6\x97\x25\x08\xbd\xf3\xac\xa9\x48\
+\xb2\xca\x86\xe5\xb4\xf7\x05\x35\xeb\xfb\x47\x80\x2f\x39\xde\xec\
+\xe2\x79\x51\x60\x55\x68\x2c\xc1\xf1\x85\x13\xa3\x31\xa0\x4e\xd5\
+\x30\x26\x26\x92\x4d\x4a\xa6\xa8\xfb\x15\x01\xf9\x18\xa0\xfc\xe9\
+\x96\xfb\xad\xed\x39\xa3\x11\xc4\x6a\x05\xe1\xf4\x20\x72\x0a\x89\
+\xc5\x04\x86\x62\x71\xef\x3e\x28\x45\xdd\xaf\x0a\xf8\x14\xb4\xdd\
+\x6d\x7f\xe0\xb4\xd5\x51\x05\xce\x5e\x0e\xe8\x79\xd0\x68\x0c\xc3\
+\xe3\x93\xc9\xa7\xa4\x54\x49\xee\x57\x05\x14\x66\x71\x9f\x29\xd9\
+\xfc\xf8\x36\x93\x5a\x5e\xce\xe6\x4b\x21\xfe\x7a\x1d\xc7\x7e\x9c\
+\xf4\x1e\x84\x56\x92\xfb\xa2\x80\x43\x40\x9b\xb7\x71\xf3\x19\xeb\
+\xa6\x6a\x40\x51\x70\x72\x60\xec\xf2\x8b\x52\xc6\x55\xaa\x78\x51\
+\x40\x3e\x3e\x01\x8e\xed\x70\x08\xbb\xe7\x96\x32\x73\x3b\x13\x62\
+\xf5\x5a\xc4\x4b\x02\xfc\xdb\xf8\x1d\x36\x57\x5b\x4e\xfb\xd7\x6a\
+\xd5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xb7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x7e\x49\x44\x41\x54\x78\xda\xb5\x56\x6b\x48\x14\x51\
+\x14\x3e\x77\x77\x6d\x75\x7c\xec\x96\x8f\xd4\xd0\xac\x24\x1f\x15\
+\xac\x59\x60\x24\xa5\x90\xa4\x50\xe1\x52\x41\xfd\xc8\x07\x14\xfd\
+\x28\xc2\xc8\x8a\xd0\x30\xcd\x1f\xbd\x70\x05\x0d\xa2\xd7\x4a\x81\
+\x51\x04\xf6\xa0\x12\x0a\x5c\x0a\x7a\x52\x99\x95\x95\x52\x4a\xa5\
+\x3d\x74\x75\xd7\x66\xdd\x6d\x77\x66\x4e\x77\xae\x5b\x39\x26\xa8\
+\xa9\x07\x76\xe6\x7e\xf3\xdd\x73\xbf\xb9\xe7\xce\xfd\xee\x12\xa0\
+\x91\x73\xc7\xd5\x2b\x8a\xa2\x8d\x77\x0a\x49\x57\xb3\x75\x36\x98\
+\xc0\x20\xf2\x65\xe3\x8d\xbe\xb6\xd4\xf8\xc0\x98\x27\xad\x7d\x96\
+\x9a\x4c\x5d\xfa\x84\x0b\x64\x5d\xec\x32\xc4\x47\x72\x0d\xb1\x61\
+\x9c\xfe\x61\x4b\x4f\xe5\xf9\xd5\xc1\x3b\x27\x54\x40\x8e\x55\x17\
+\xbe\x14\xa4\x26\x84\x98\xfa\x9d\x1e\x28\x5b\xc2\x91\xf1\x0c\x3a\
+\xac\x80\x1c\x3b\x2c\x0e\xe4\x54\x00\x51\xc1\x1c\x63\x08\xf9\xdb\
+\x01\x87\x49\x46\xfa\x50\x45\xbc\x1c\x0e\xdc\x3d\x12\x80\xdb\x23\
+\x82\x53\x52\x6f\x29\x49\x26\xa7\x15\x02\xb9\x37\xed\x18\xe0\x83\
+\x10\x1d\xaa\x03\x81\x76\x2c\x5a\x48\x18\x5f\xfe\x0c\xd9\x18\xc5\
+\x5e\x7c\x90\x62\x32\x08\x0f\xe5\x4b\x1e\x09\x88\x2a\x35\x94\x2d\
+\x26\x44\x21\xb0\xb1\xce\x8a\x9c\x0f\xc0\xec\xf0\xa9\xf0\x93\x2a\
+\x94\xa5\x68\x18\xbf\xff\xa1\x44\x47\x90\xa0\xdc\x8b\x8b\x29\x06\
+\x8a\x51\x42\xf6\x41\x10\x15\x69\xa0\x73\xa1\xbc\xca\xcb\x0b\xf8\
+\x1b\x2b\x04\x8c\x97\xbe\xa2\x96\x20\xc4\x86\x0f\xcc\x00\x87\xab\
+\xcb\x18\xe2\x70\x1a\xa7\x14\xc8\x3a\xf7\x19\xd5\x92\x00\x73\x23\
+\x82\xd8\xe0\xa6\xcc\x69\x8c\x5f\x57\xdb\x89\x6a\xba\x36\x17\x37\
+\x44\x32\x9c\x71\xb6\x1d\xd5\x44\x05\xf5\xf9\xd1\x64\xd7\x6d\x9b\
+\xfe\x9b\xcd\xd5\xab\xd5\xa8\xe0\x8c\x31\x8c\xf1\x9b\x6a\x3f\x62\
+\xc8\xb4\x00\x96\xaf\x10\x58\x21\x27\x0a\x02\x04\xf9\xaa\xc1\xe5\
+\x16\xe1\xfa\xe6\x58\xc6\x1b\x8e\xbc\x64\x73\x69\xdc\xb3\x60\x54\
+\x58\x16\xd0\x71\x1a\xa8\xce\x8e\x54\x0a\x2c\x3f\xf1\x01\xf9\x1f\
+\x3c\xf4\x3b\x5c\x74\x06\xd2\xb8\xca\xe3\xeb\xa3\x81\xc6\xe2\x45\
+\x4a\x81\x94\xaa\xb7\xc8\xdb\x79\x70\xd0\x9f\x1c\x6d\x47\xd3\x18\
+\x3f\x6b\xb7\x05\xff\x17\x2b\x04\x92\x2b\x9a\x91\xef\xb5\x03\xdf\
+\x33\x60\x47\x1d\xc7\xb3\x18\x3f\x63\xdb\x2d\x1c\x0b\x0e\xce\xaf\
+\x43\x5f\xce\x97\x61\x85\xc0\x82\x43\x4d\x54\xc0\x06\x7d\xdd\xd6\
+\x91\x6b\x30\xb4\x82\xaa\x21\x1c\xc5\xd6\x33\x46\xa5\x40\x1c\xdd\
+\x31\xbc\xb5\x07\xac\x5f\xbb\xc7\x55\x7f\x6f\x54\xb8\x2e\x6c\xd8\
+\xa5\x10\x88\x2a\x79\x8c\x2e\xbb\x1d\xba\x2a\x33\x26\xc7\x8b\x42\
+\xf6\xdd\x47\xe2\x74\x4c\x9e\x80\x7f\xe1\x5d\x24\xda\x29\x20\xba\
+\xdd\x74\x1b\x13\x46\xb2\x52\xa3\xf8\xc7\xec\x24\x6f\xed\x71\xd0\
+\x95\xb5\x86\xec\x7a\xc2\xff\x00\xe1\xf4\x1a\xf2\xcf\x9b\x26\x1d\
+\x7e\x82\xb2\xa3\x3c\xfd\xe4\x5d\x68\x91\x66\x52\x77\x1c\x8d\x6f\
+\x24\xce\x0c\x65\xaf\xfc\x93\xf6\x7f\x5f\xba\x94\x28\x66\x70\xb2\
+\xc9\x13\x23\x48\xf8\xbc\xa5\xcb\xa9\xf7\x50\x2f\x4b\x08\xf3\xb3\
+\x05\x69\xd5\xe9\x39\x89\x9a\xc6\xd1\x94\xe2\xe4\x2b\xc9\xfc\xee\
+\xbb\x23\x4f\x6e\x07\x4e\x21\x30\x53\xaf\x2d\xcd\x9f\xef\x73\xe0\
+\x8f\xc0\xb1\x7b\x76\x53\x7d\x73\x57\xc1\x9d\xad\x03\xf6\xb0\xec\
+\x78\x0b\xae\x4c\x0c\xbd\x52\x94\x3e\xd5\x38\xd2\xe0\x55\x8f\xfb\
+\x0d\xcf\x3e\xd9\x9f\x9b\xd7\x46\xb0\xdc\xb4\x13\xad\x68\x88\xf4\
+\x87\xca\x35\x83\xac\x62\xfd\xa9\x37\x75\xaf\x3f\xdb\xb3\x9b\x4b\
+\x53\xd8\xb3\xb8\xe2\x07\x18\xa1\xf7\xb3\x58\x0a\x0d\x23\x9e\xd1\
+\x85\xd7\x3a\xd3\x6e\xbe\xe8\x6c\x68\xde\xbf\x88\xe5\xce\x3b\xf0\
+\xa8\x8d\x7a\x51\xcc\xfd\x3d\xc9\x7f\x05\x66\x6c\xaf\x2f\xa0\x37\
+\x93\x77\xc5\x6c\xf4\x38\xd3\xd3\x56\x4d\x47\x75\x66\xfe\x48\x02\
+\x73\xf6\xde\x8d\x11\xdc\xee\x36\xf9\xd4\xa0\x6b\x66\xa3\x57\x3d\
+\xf5\xb2\x76\x9a\x3b\x4b\xb1\xc8\xba\xdc\xcb\x66\x49\x44\x56\x47\
+\x7a\x54\x58\x34\x1a\xb5\xd1\x6a\x36\x8e\xea\x6f\xcc\xf4\x2d\xd7\
+\xf2\x04\x41\x34\x51\x11\x3d\x15\x68\xd7\x10\x62\xec\x36\x1b\x1b\
+\x7f\x01\x23\x6f\xa2\x28\xab\x2e\xa3\x8a\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x01\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xc8\x49\x44\x41\x54\x78\xda\x85\x56\x7d\x4c\x13\x77\
+\x18\x7e\xee\xae\x77\x6d\x69\x29\xd8\xf2\x29\xe5\xfb\x63\x08\x68\
+\xab\x88\xa0\x8b\x43\x5d\xe6\xc7\x36\x74\x53\x41\x9d\x3a\xbf\x91\
+\x40\x4c\x96\x6c\x66\xd3\x64\x73\xfb\x63\x23\xce\x2c\x4b\xb6\x80\
+\xce\xc5\x29\xd3\x39\x50\xe3\xe2\x5c\x64\x98\x4d\x21\x38\x40\xd1\
+\x09\x0a\x8e\xa0\x80\xc0\x00\x45\x40\xa0\x50\xda\x5e\x7b\xb7\xdf\
+\x1d\x88\xa2\x30\xde\xa4\x97\xe6\xde\xbb\xe7\x79\xde\xdf\xfb\xfe\
+\x9e\xdf\x51\xf8\x9f\xf0\x5b\x79\x24\xd9\xe5\x14\xd6\xba\x04\x61\
+\x89\x20\x88\xa1\x2a\xad\x5a\xbe\x6f\x1b\x18\x02\x4d\x53\x4d\x0c\
+\x4d\x17\x31\x0a\x3a\xff\xc1\xd9\x6d\x25\x13\x61\x50\xe3\xdd\xf4\
+\x5f\x7d\xcc\xe4\xb0\x3b\x2a\x3d\x7c\xa7\xb0\x61\xd1\xfe\x08\x0a\
+\x99\x02\xbd\x87\x1b\x54\x4a\x76\x98\xc0\xce\xa3\xa7\xcf\x8a\x96\
+\xfb\x8f\xd1\x58\xd7\x81\xbe\x87\x8f\x79\x4e\xc9\x25\x74\x9c\xd9\
+\x5c\x3d\x29\xc1\xd4\xd5\x47\x73\xc0\x30\x99\xf3\x17\xc7\x21\x3c\
+\xdc\x00\x95\x9a\x80\x8a\x14\x48\x05\x63\x9e\x23\x15\x90\xb7\x45\
+\xd8\x86\x78\x34\x34\x74\xa3\xf4\x62\x0d\xe0\x72\xe5\xb6\x9f\xd9\
+\x92\x35\x21\x41\x40\xea\xf1\x02\x9d\xbf\x47\xda\xb2\xa5\x31\xf0\
+\xf6\xd6\x40\x20\xc0\x10\x87\x1f\xa2\x9e\x93\x22\x8a\x72\x4a\x4e\
+\xd2\x84\xe8\xd1\xa3\x41\x14\xfe\x7e\x07\xfd\x1d\x7d\xa7\xda\x4e\
+\x6f\x5c\xf3\x02\x41\xf0\x86\x9f\x73\xdc\xbd\xb4\x99\x6b\x56\x9a\
+\xa1\xd5\x28\x21\xb8\x44\xd8\x09\x4a\xaf\xcd\x89\x6e\xab\x13\x03\
+\x4e\x91\xdc\x1b\x51\xcf\x00\x5a\x05\x05\x83\x9b\x02\x9e\x2a\x05\
+\x94\x84\x9d\x66\x28\x0c\x0c\xda\x51\x70\xb6\x0a\x96\xae\x81\xdc\
+\xe6\x13\xeb\xb2\x46\x09\x22\xb6\x9e\x36\x39\x05\xa1\x6a\xf3\xa6\
+\x44\xf8\x78\x6a\x61\x73\xba\xd0\x6a\xe1\xd1\x39\xe4\x04\x23\x29\
+\x94\x1e\xa3\x9e\x2a\x92\x95\x93\x8b\x40\x2e\x44\x07\x7c\xd4\x0a\
+\x18\xdd\x59\xa8\x15\x0c\x3a\x7b\x07\x70\x2c\xef\x2a\x14\x34\x6d\
+\xbe\xf7\x43\x6a\xb5\xfc\x5a\xf0\xbb\xa7\x1c\xcb\x96\xc5\xb0\x89\
+\xa6\xa9\xe8\xe8\xe7\xd1\xdc\x6b\x27\x65\x53\xa3\xcb\x22\x01\xda\
+\x7b\xad\xf2\x7f\xce\x43\x2d\xe7\x9e\x0d\x89\x44\x18\x72\x20\xdc\
+\x4f\x03\x5f\x1d\x87\xab\xd5\xed\x28\x2c\xbc\xc3\x37\xff\x98\xc6\
+\x51\x51\xe9\xe7\x92\x95\x5a\xb6\x78\xf7\x96\x24\x34\xf6\x91\xe9\
+\x20\x4d\x1b\x05\xa7\xa4\xe6\x0a\xb0\xf4\x0c\x22\xd6\xa8\xc3\x8d\
+\x86\x2e\x28\x75\x5a\x78\x6a\xb9\x91\x72\x28\x88\x24\x3f\x38\x60\
+\x47\xb4\x8f\x1b\xea\x3a\xad\x08\xf4\xd2\x22\xc4\x83\xc5\x81\xa3\
+\x15\xb0\x0f\xf0\x0b\xa8\xc8\x9d\xe7\x0e\xce\x9b\x1b\x9c\x91\x64\
+\x36\xa2\x91\x28\x67\x64\xf0\xe1\xe6\x5a\xad\x0e\x58\x2c\x36\xa4\
+\xcf\xf1\x43\x62\xb0\x0e\xeb\x4f\xd4\xc0\xd3\xcb\x1d\x7a\x77\xa5\
+\x5c\xd5\x90\x95\x87\x85\xfc\xde\x8c\xf0\xc0\xf2\x58\x03\x52\x73\
+\xaf\x21\x20\x3a\x00\xd1\x06\x15\x2a\xaa\xfe\x45\x59\x79\xf3\x21\
+\x2a\x3c\xe3\x7c\xe3\x8e\xf5\x33\x43\x07\xc1\x42\x9e\x3c\x02\xde\
+\xd2\xf6\x58\x16\xf8\x4a\xa8\x3b\x36\xc5\xfb\x8d\x8e\x50\xcc\xbe\
+\x2b\x08\x8f\x0b\x00\x47\x3a\x61\xe9\xb1\x20\x25\xce\x13\xeb\x4d\
+\xbe\xd0\x8f\x54\x24\x11\x84\xc7\x90\x3c\xcb\x42\x23\xf2\xf8\xfe\
+\xa7\x9b\x4d\x54\x58\xfa\xaf\x62\xc6\xce\x79\xe0\xc9\x94\xd8\x6c\
+\x3c\xda\xda\xfa\x10\x62\x60\x91\xf5\xb2\x11\x7a\x32\x4d\xcf\x46\
+\xd0\x07\xc5\xf0\x9c\xe2\x06\x9d\x92\xc6\xd7\xab\x22\x90\x10\xea\
+\x39\x26\x2f\x11\x44\xc5\x18\xe1\xa6\x62\x09\x09\x85\x43\x87\xcb\
+\x41\x4d\xff\xf0\x0f\x71\xc7\x86\xd9\x68\x22\xeb\xeb\xb0\xd9\xf1\
+\xfe\xa2\x20\x84\x7a\x6b\xc7\xdd\xf6\x11\x7b\x4b\xf0\x65\x5a\x14\
+\x56\x9a\xfd\xc7\xcd\x4b\x04\x71\xd3\x03\xa1\x26\x04\x4a\x25\x83\
+\x23\x27\xff\x06\x35\x6b\x5f\xa9\xb8\x33\xcd\x8c\xdb\x35\x2d\x60\
+\x44\x27\xf6\x2e\x8d\x84\x8f\x87\x7a\x5c\x80\x99\x9f\x14\x23\x6f\
+\xfb\x0c\xcc\x08\xd2\x4f\x48\xa0\x0a\xf0\x45\x52\x90\x07\x88\x47\
+\xe1\xbb\x82\x9b\xa0\xa6\xed\x29\x11\xf7\x6c\x9a\x85\xda\x1e\x3b\
+\x2a\x6f\x75\xa0\xfa\xaf\xbb\xd8\x96\x12\x81\xfd\xab\x63\xc9\xda\
+\xd3\x63\x00\x0c\x9b\x7f\x81\x56\xab\x81\x39\x4c\x8b\x93\x99\xb3\
+\xa1\x51\x71\x63\xf2\xab\xbe\x29\x83\xcb\xc7\x0f\x91\x46\x77\xcc\
+\xf0\x56\x23\x3b\x8f\x54\x60\xfe\xf8\x4a\xe3\x92\xc5\x51\xa1\x16\
+\x87\x08\x05\x43\x43\x20\xfd\x2c\x2b\xae\x47\xdb\xdd\x76\x7c\xb1\
+\xdd\x8c\xad\xc9\x11\xa3\x00\xba\xd4\x93\xc8\xfa\x68\x39\xca\x4b\
+\xeb\x51\x55\xde\x80\x6d\x2b\x22\xf0\xd5\x3b\x33\x47\xf3\x2b\xf6\
+\x97\x80\x0b\x09\x82\xaf\x8f\x16\x5a\x62\x61\x45\x17\xeb\x9b\xa8\
+\x84\xcf\x2b\x0e\x46\xc5\xfa\x67\xf8\x7a\x69\x64\x43\x93\xa6\x48\
+\xc1\xd2\xe8\x21\x1b\xeb\xd2\xf9\x5b\x10\xac\x56\xfc\xf6\x59\x32\
+\xe2\x02\xbd\xa0\x4d\xc9\xc3\xae\x4f\xdf\x86\xd3\xe1\x82\x93\x00\
+\x16\x17\xde\xc6\xfd\xda\x56\x64\x67\x25\x20\x63\x51\x14\x52\xb2\
+\x8b\xe1\xfe\x52\x30\x02\xfc\x3d\xd1\xd1\x69\x41\x7d\x6d\xc7\x21\
+\x6a\xee\x81\xeb\xc9\x1a\x9d\xaa\x38\x71\x96\x11\x0e\xde\x35\xc6\
+\x2d\x59\x8e\x45\xfd\xbd\x87\xb8\x90\x5f\x8e\x05\xb3\x03\x50\x52\
+\x7a\x0f\xef\x65\xaf\x83\x8d\xec\x0f\x49\x08\xcb\x31\x68\x6d\xeb\
+\xc5\xe5\x0b\x55\x50\x3a\xed\x50\x11\x61\xa6\xd7\xe2\x11\x16\xac\
+\x47\xf9\xf5\x56\x0c\xf6\xdb\x16\xc8\x03\x9e\x74\xe0\x86\x63\x4e\
+\x82\x91\xd5\x69\xb8\x31\xb6\x2c\x8d\x3f\x4d\xd3\x50\xaa\x39\x14\
+\x15\xde\x22\x1b\xcb\x8e\x37\x52\xcc\xe0\x1d\x4f\x85\x30\xc4\xac\
+\x38\x22\xa4\xb2\xaa\x19\x0d\x35\xed\x78\x2b\x35\x1e\x83\xc4\x1c\
+\x2b\xae\xb5\xf2\x15\xbb\xe3\x39\x99\x60\xfe\xb7\xd5\x26\x86\x65\
+\xaa\x16\x26\x06\x92\xad\x2f\x59\xf1\x58\xef\x97\x97\x4d\x31\xdc\
+\x70\xa7\x53\x18\x37\x4f\x4e\x37\xd9\x65\x5d\x44\xe0\xa5\x8a\x16\
+\xb8\x78\x97\xb9\x74\x97\xa9\x7a\xd4\xb5\x92\x73\x6b\x72\xf4\x5e\
+\x6e\x99\xf3\x62\x7d\x60\x27\x4b\xf5\x1c\xc6\xa4\x21\x55\xab\x64\
+\x19\x94\xd5\x76\xa2\xa7\xcb\x9a\x5b\x92\x19\xf7\xd4\xae\x9f\xc4\
+\xc2\xc3\xff\x14\xe8\x0d\xea\xb4\xa4\x68\x2f\x52\x09\xf1\x7f\xc2\
+\x32\x19\x8f\x04\x20\x9b\x23\xe9\x59\x45\x5d\x17\x7a\xba\x87\x4e\
+\x5d\x4e\x9f\xf6\xe2\x81\xf3\x24\x5e\x3d\x7a\x37\x87\xe5\xa8\xcc\
+\x84\x68\x03\x0c\xa4\x27\x2e\xe2\xc5\x92\xef\x3f\x5f\x11\x35\x72\
+\x4e\x48\x3d\xe8\x1e\x74\xa0\xb2\xae\x9b\xf4\x46\xcc\xfd\x73\x4b\
+\xe4\xc4\x47\xe6\x93\x58\x7c\xbc\xd1\xe4\x14\xc5\x4a\xbd\x8e\x63\
+\xc3\xfc\xdc\x08\x11\x0b\x37\xb2\xf5\xc5\x91\x01\x90\xd4\x5a\xed\
+\x2e\x02\xcc\xa3\xf1\x81\x15\x3d\xfd\x0e\x5e\x41\x51\x09\x17\x37\
+\x86\x4d\x7e\xe8\x3f\x1b\xaf\xe7\x37\x25\x0b\x02\xb5\xd6\x45\x63\
+\x09\x01\x0f\x55\x93\xe3\x51\x8a\x21\x72\x8c\x52\xd2\x67\x8b\x80\
+\x22\x9a\x16\xf3\x2f\xac\x0d\x9d\xf0\xb3\xe5\x3f\x8c\xe6\x44\x3e\
+\xd9\xd2\x47\xab\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x05\xd2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x99\x49\x44\x41\x54\x78\xda\x9d\x55\x69\x4c\x54\x57\
+\x14\xfe\xee\x7b\x0c\xc3\x0e\xc3\xb0\xc8\x88\xc3\x32\x96\x82\x0b\
+\xbb\x1b\xb6\xd5\xd6\xad\x89\x6d\x93\x1a\x0b\x8c\x48\xdc\x6a\xd3\
+\x84\x4a\x6c\x8c\xd1\xc4\x74\x49\x4d\x5a\x93\xb6\x71\x69\xba\xc4\
+\xa6\x36\xad\x49\x19\x48\x63\xa3\xb6\x1a\x51\x14\x65\x97\xcd\x28\
+\x55\xd6\x01\x51\x1c\x96\x41\x40\x98\x61\x96\xf7\xde\xed\x7d\x0f\
+\x43\xa4\x22\x35\x3d\x3f\x26\x93\x77\xef\x3d\xdf\x77\xce\xf9\xce\
+\x39\x64\xdd\x79\x2b\x8d\x0a\xe0\x21\x52\x4c\x31\x9e\x00\xc3\x4e\
+\x09\x83\x36\x2a\xff\x0f\x29\x7e\x23\x64\xf0\xc9\xf3\xb5\x7f\x5a\
+\xb5\xec\x8d\x55\xeb\x4b\x10\xa4\xe6\xa6\x7d\xdf\x3d\x22\x81\x6c\
+\x2f\x7b\x48\xb3\xe2\xfd\xa7\x1c\x8e\x08\x04\x36\x41\x44\x41\xe3\
+\x08\x44\x11\xc6\x92\xb7\xc3\x4c\x98\xc6\x56\xfd\xd1\x9f\xcd\xf3\
+\x28\x30\xa6\x04\xc2\xd7\x83\x07\x47\xa6\x9e\x17\x36\x0d\x83\xe4\
+\x96\x58\xe9\xe6\xc4\x40\x34\x8d\x88\x20\xec\x02\xe1\x80\x47\x8c\
+\xf9\xa5\x5b\x23\x8c\x05\x97\x55\xba\x31\xbc\x08\x33\xd8\xca\xdf\
+\xfb\x32\x05\x2a\x15\xae\x5a\x10\x88\x40\x4f\x6e\xf2\xbb\xca\x83\
+\xa0\xf8\xf6\x23\x90\x4d\xc5\xfd\x74\x4b\x8a\x06\x37\x87\x26\x00\
+\x78\xf6\x73\xc3\x62\x43\x8b\xd9\x5e\x5a\xbd\x25\xf2\x55\x3c\x87\
+\xa5\xfc\x7c\x4f\xc8\x5d\xaa\xe1\x25\x95\x0a\xa0\x74\x12\xe0\xc2\
+\x2d\x16\x41\xe6\xb9\x5e\xba\x63\x91\x16\xf5\xc3\xe2\x44\x88\xec\
+\x02\x21\x14\xe7\x1b\x87\xe1\x1c\x13\x4c\x55\xdb\xf4\xc6\x99\x9c\
+\x27\x1f\xbf\x4b\x77\xaf\xd2\x22\x22\x40\x8d\xfa\x11\x01\x3c\x08\
+\x64\x08\x96\x31\x5c\x6c\x18\x02\x79\xe7\x8c\x85\xbe\x9e\x1c\x8c\
+\x96\x21\x37\x6c\x4e\x01\x91\x81\x6a\x48\xec\x86\x1c\xcd\xc5\x06\
+\x2b\xc6\x19\x48\xf5\xce\x98\x69\x41\x92\xbe\xef\xa4\xbb\x56\x87\
+\x60\x4e\x90\x17\xaa\xad\x82\x52\xd8\xbf\xef\xdb\x10\x15\xe6\x85\
+\x60\x1f\x0f\x5c\x6c\x7c\xc8\x22\x38\xdb\x43\x33\x12\x34\xf8\xf5\
+\x92\x05\xd4\x0d\x31\x3d\x4d\xc3\xeb\xb5\x5e\x90\x44\x16\x0c\x8b\
+\xa4\xa4\xce\x0a\xa7\x4d\x30\x5d\x7f\xdf\x30\x05\x64\xe1\x37\x1d\
+\x34\x7f\x75\x28\xf4\x21\xde\x28\xef\x77\x29\x8c\x4b\x6a\xad\xb0\
+\x8d\x09\xa5\x8c\xdc\xca\xb5\x2f\x47\xa0\xb6\x69\x10\x64\xcd\xc9\
+\x2e\x3a\xea\x10\x21\xb8\x90\x55\x97\x67\x28\x4a\x3a\xd2\x46\x53\
+\x53\xb5\x98\x13\xa2\x56\x40\x58\xc4\xb8\x52\xdb\x0f\x87\xcd\x6d\
+\xaa\xff\x20\x4e\x01\x99\x77\xb8\x8d\xe6\xaf\x0b\x43\x4c\xa8\x0f\
+\xae\xf4\xba\xc1\x33\xea\x57\x6a\x7a\x19\x11\x91\xdd\x99\x6b\x5c\
+\xf4\x6d\x7b\x26\xe1\x48\xa1\x8a\xc9\x97\xa4\x1c\x6d\xa6\x0c\xd1\
+\xd8\x90\x1f\x3f\x29\xc5\x05\x5f\xdd\xa1\x89\x29\xa1\x88\x0a\xf7\
+\x56\x40\x24\x8e\xe2\x5a\x65\x2f\x03\x11\x4e\x39\x04\x69\x43\xfe\
+\x7a\x1d\xe6\x86\xf9\xa2\xb8\xc7\x05\x8e\x9f\x38\x73\x8d\x0b\xa6\
+\xc6\xdd\xf1\x93\x51\xa6\x1e\x6b\xce\x66\xe5\x2c\x20\xc9\x5f\xdf\
+\xd1\xde\xd8\x93\x30\xf8\xef\xfc\xce\xfb\xbc\x89\x26\xa6\x87\x21\
+\x32\xdc\x47\x01\x11\x59\xba\x6a\xea\x07\x90\xb3\x58\x83\xb8\x08\
+\x3f\xfc\xd5\xed\x64\xcc\x81\xf2\x0a\x0b\x9c\x0e\xc1\x74\x73\x4f\
+\xc2\x53\x75\x92\x7d\x13\xcc\x60\x09\x07\x6f\xd2\xf8\xf4\x70\xcc\
+\x61\x6c\x45\x91\x2a\x85\xf7\x66\x4e\x47\xdd\x54\x91\x73\x75\x65\
+\x0f\x4b\x8b\xdb\xd4\x74\x60\xe1\x33\x95\x36\x23\x80\x6c\x71\x9f\
+\x34\x4a\xb1\x49\xe1\x44\x1f\xe1\xcb\x14\x4c\x15\x09\xaa\x3c\x38\
+\x54\x5e\xbb\x0f\xf7\xb8\xeb\xc4\xed\x8f\x92\x77\xcc\xf4\xfe\x3f\
+\x01\xa2\xf7\xd5\x4a\xd9\xeb\xf5\xe4\x3e\x51\x3f\x56\x38\xd3\x38\
+\x03\xa8\xbb\xdc\x0d\xb7\xc3\x75\xa2\xf9\x60\xda\xff\x07\xd0\xef\
+\xad\xa6\xef\x6e\x8c\x85\xcb\x53\xcd\xfa\x44\x54\x72\xae\x40\x48\
+\xb2\x84\x99\xe6\xcb\xee\x41\xb0\x3b\x4d\x2d\x5f\x2c\x7e\x76\x8a\
+\xe2\xf6\x57\x69\x5b\x0f\x2d\x7b\xaa\xc8\x91\xbb\x2b\xe8\xf6\xcc\
+\x17\x30\xee\xed\x85\xdb\x7d\x4c\x8a\x6c\xcc\x74\xd5\xf5\x40\xa3\
+\x0f\x44\xb0\xce\x1f\x54\xa0\x0a\xbd\xd6\xf2\xbb\x70\xdb\x1d\xa6\
+\xb6\x2f\x33\x9e\x02\x91\x7d\x13\xc3\x9e\x0a\xca\x18\x19\x3b\x0e\
+\x2f\x9f\x94\xa9\x2e\xef\x2a\xdd\x96\x15\x0f\x97\xbf\x37\x6e\x3c\
+\x70\x31\xe7\x14\x5d\x95\x77\xe1\x1a\x75\x9c\x92\x44\x69\xc3\xec\
+\x34\x3d\x82\x22\x18\x88\xdc\xf2\x2c\x26\x73\xd9\x04\x48\xc7\x91\
+\x97\x26\x41\x0c\x1f\x56\x64\x83\x63\x32\x4d\xfc\xb4\x96\x3a\x6c\
+\x2e\x08\x4e\x21\xcb\x7c\x6c\x45\x91\x6e\x67\x09\xcd\xcd\x99\x0f\
+\x29\xd0\x07\x35\x4c\x8a\x1e\x6c\x68\xdd\xbb\x66\x86\xe8\x70\x98\
+\xcc\x47\x5f\x51\x1c\x44\xe7\x95\xd2\xb0\x94\x68\x04\xe8\x58\xe1\
+\xe5\x45\xc0\x71\xca\x1d\xc1\x3e\x6e\x32\x7f\xb3\xc2\x18\xb3\xeb\
+\x6a\x26\xa7\xf6\x28\xf4\xf5\xf3\x04\x59\x7e\xa8\x91\x66\xac\x33\
+\xa0\xe8\xc7\x06\x56\x34\xb7\x98\xb3\x79\x01\x0f\x8d\x2f\xca\xda\
+\xed\xac\xfd\x39\xf4\x56\xb4\x41\x1c\x77\x9a\x3a\xbf\x7b\x6d\x4a\
+\x0a\xa2\xdf\xbb\x44\x83\x93\x63\xe0\x37\xdb\x7f\x02\x84\xc9\xd6\
+\x52\xde\x06\x61\xcc\x59\x2a\xf2\xdc\xca\xbd\xbb\x52\x71\xbc\xa0\
+\x0d\x24\xfd\xb3\x3a\x1a\x91\x11\x8d\xce\x2e\x1b\x5e\x0c\x02\x62\
+\x0d\x1a\x5c\x68\x19\x83\x8a\xe3\x31\x54\xd1\x0a\xc9\xe9\x30\x75\
+\xfd\xb0\x66\xda\x22\x46\x6d\xbf\x40\xfd\x53\x62\xe1\xa5\x9b\x48\
+\x17\xa1\x1c\x06\x6a\x3b\x91\x97\x13\x87\x73\x0f\x24\x74\x95\x30\
+\x80\xb4\x8f\xaf\x53\xcd\x92\x28\x58\x86\xc5\xc7\xcf\x28\xe4\xb5\
+\x31\x5a\xd5\x0e\x89\x31\xef\xfe\x69\xed\x8c\xe3\x3a\x72\xeb\x79\
+\xea\x9b\x14\x0b\xb5\x2e\x00\xf2\xde\x94\xe7\x0e\x21\x12\x2b\x2b\
+\x07\x5b\x75\x07\x48\xd2\x81\x2a\xea\xb7\x24\x06\x96\x01\xd6\xfa\
+\x6c\x21\xb0\x21\x05\x67\xbb\x15\x42\xf7\x83\xd2\x9e\x5f\xd6\x3f\
+\xd7\xc2\xd1\x6d\x3e\x2b\x78\x26\x1a\x78\x3e\xd4\x9f\xb9\x65\x9a\
+\x61\x32\xe6\x54\x1c\x1c\xb5\x66\x90\xf9\xfb\x2b\xa8\xd7\x12\x03\
+\x7a\xfb\x1d\xac\x56\x44\x69\x0d\xce\xee\x82\xbb\xbe\x59\xee\xdc\
+\x2c\xcb\xc9\x37\x67\x5c\x99\xb3\x72\xcf\x66\x52\x89\x2b\x5c\xbd\
+\x35\x15\x97\xcd\x6c\x6c\x3f\xde\x9a\x84\xfd\x71\xd7\xb4\x83\xcc\
+\xdb\x57\x4e\xb9\xa5\x73\x31\xd0\xe7\x54\xf6\xb1\x22\x6e\x06\x44\
+\xed\x02\x70\xfd\x96\xdc\x54\xc6\xbe\xdf\xde\x9a\x76\xe9\x87\x1b\
+\xcf\x64\x43\xc5\x17\x64\xe7\x2f\xc3\xe9\x56\x07\xec\x8f\xdc\xb2\
+\xa0\x26\x8c\x75\x25\xad\x69\x05\x99\xb5\xe9\x34\x85\xbf\x0f\x93\
+\xa9\x34\xa5\xaf\x89\x7c\xd3\xe5\x06\x1b\x95\xf2\xf7\x90\x81\xc2\
+\x0d\x53\x9a\x31\x34\xeb\x94\x96\x8d\x26\xab\xb7\xc6\x1b\x02\xef\
+\x09\x17\x23\x44\x9e\x9c\x0b\x72\x2d\x1c\x76\xfc\x03\xe4\x3c\x8a\
+\xb4\x40\xbb\x8f\xd5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x06\x58\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x1f\x49\x44\x41\x54\x78\xda\x85\x56\x0b\x50\x54\x55\
+\x18\xfe\xee\xdd\xbb\x8f\xbb\xc0\xba\xbc\x61\x37\x20\x54\x46\x0b\
+\x4c\x40\x44\x09\x33\x45\xf2\x51\x54\xd2\x43\x73\x7c\x8c\x69\x93\
+\x26\x46\x56\x4e\xd8\xdb\x1a\x2b\xd1\x4c\x73\xc0\x41\x67\xac\x46\
+\x65\x44\x32\x6d\x8a\x44\xcd\x14\x4d\x40\x7c\x00\x5a\xa4\x0e\xaf\
+\x44\x59\x10\x58\x59\x5e\x7b\xd9\xe5\xee\x3d\x9d\xbd\xab\x77\x9d\
+\x31\xeb\xcc\xdd\x9d\xff\xee\x7f\xfe\xef\x3b\xe7\xfc\xdf\xf9\xff\
+\x65\xf0\x5f\x63\xc2\xb6\x34\x88\xd2\x1c\x48\x64\x3a\x5c\x52\x34\
+\x0c\xbe\x9e\xdf\x7b\xfb\x01\x15\xdb\x0c\x96\x39\x0a\x8e\x2d\x46\
+\xd5\x8a\xe3\xf7\x83\x60\xfe\xf5\xd7\x94\x1d\x09\x70\x38\xcb\x79\
+\x53\x08\x1f\x99\x18\x85\xe8\xd8\x20\x04\xfb\xf3\xd0\xeb\x55\xb2\
+\xdb\x6e\x77\xa1\xb3\x5b\x40\x73\x5d\x17\x5a\xaa\xaf\x41\xb0\x74\
+\x08\xd0\x6a\x52\x51\xf9\x6a\xcd\xff\x12\xb0\x8f\x16\xe4\x41\xa5\
+\xcd\x9a\x38\x2f\x19\xb1\xb1\x81\xe0\xfd\x38\x70\x84\xa1\x9b\x20\
+\xa0\x8f\x27\x88\x46\xb1\xf4\x4b\x64\x08\x84\x3e\x11\x75\x75\x56\
+\x9c\xd9\x7b\x16\x70\x39\xf2\xa5\x8a\xe5\x2b\xef\x4b\xc0\xa6\x7e\
+\x53\x64\x88\x0c\x9e\xfb\xd4\xc2\x04\x98\x4d\x3a\x8f\x9b\xb8\x01\
+\x09\xb5\x18\x65\x32\x91\x3f\x6e\x42\xe6\x36\x02\x41\xab\x65\x10\
+\xbf\xec\xae\x41\x6f\x4b\xe7\x3e\xa9\x7c\xc9\x4b\xf7\x10\x68\xd2\
+\xf6\xe4\xf9\x86\xf9\x67\x2d\xca\x4a\x82\xff\x30\x0d\x06\x9c\x04\
+\x22\x5d\x72\xcf\xa0\x84\x9b\x82\x04\xc1\x29\xc1\x4e\x6d\x37\xb8\
+\x8f\x8e\x05\xaf\x61\x11\xca\xb3\x18\x46\x6d\x8e\x65\xe0\xa3\x66\
+\xd0\xdd\xe3\xc4\xae\xfc\xf3\xe8\x6f\xef\xce\x77\x1e\x5f\xb0\x52\
+\x21\xf0\x99\x55\x94\x20\x12\x54\x2f\x7d\x6f\x0a\x86\x07\xf1\xb0\
+\x39\x24\xb0\x12\xf0\x62\x04\x0f\x17\x85\xd4\x73\x2c\x3e\xbb\xd4\
+\x87\xd6\x01\x27\x58\x0a\x36\xc2\xa0\xc3\xaa\x87\x78\x08\x34\x48\
+\x4d\xdf\xf7\x34\xda\x41\x38\x82\x60\x9e\x43\x63\x97\x80\x9d\x9f\
+\x97\x81\x63\x90\x38\x50\xfa\x52\x8d\x4c\xa0\x7d\x62\x9f\x7d\xc6\
+\xa2\x71\xfc\xcc\x47\x43\xf0\xb7\x6d\x08\xf5\xb7\x44\x4c\x0b\xd3\
+\x20\x2b\xce\xa8\x1c\xdf\x8b\x87\xda\xe1\xa4\x60\x1c\x8d\xd4\xd3\
+\xf7\xdd\xe9\x21\x8a\x2f\xff\x0f\x1b\x4a\x5b\x1d\x88\x0b\x51\x23\
+\xca\xa8\xc6\xe1\x8a\x0e\x1c\xd9\x75\x41\x70\xfc\x3a\x57\xcf\xf8\
+\x3d\xfb\x63\x1a\x67\xd4\xfe\xb6\xfe\x83\x54\x5c\xb6\x0e\xe1\xa6\
+\x9d\x2e\x9d\x48\x48\xf2\xe7\xf0\x56\x42\x80\x02\xf2\xf4\x81\x1b\
+\xf0\x35\xea\xa0\xa6\x04\x42\xaf\x13\xdf\x67\x84\x2b\xbe\xcd\xd5\
+\x56\x54\x74\x0d\x41\xad\xe1\xe4\x63\x7b\x28\x50\x8d\x35\xeb\xca\
+\x21\xda\x1c\xd3\x18\xbf\xcc\x9f\x0b\x26\x3c\x39\x72\xd9\xac\x54\
+\x33\xfe\xb0\x3a\xe9\x79\x02\x4e\x7a\xde\x63\x7c\x24\xac\x1e\x1f\
+\xaa\x80\x3c\x53\x7c\x1d\x21\x66\x1e\x1a\x3a\xa1\xa3\x5d\xc0\xfe\
+\x67\xcd\x8a\x6f\xe3\xb9\x9b\xb8\x60\x23\x30\xf8\x68\x30\x24\x11\
+\x8c\x09\xd4\xa0\xb4\xbc\x15\x55\x87\x1a\xb6\x33\xfa\xcc\x92\xa6\
+\x95\x39\xc9\xd1\xfd\x84\xa3\x09\x21\x54\x7e\xc0\x20\x4d\xe6\x08\
+\x8d\x84\x9c\x14\xef\x31\x04\x7f\x70\x11\x23\x12\x42\xe9\x2a\x59\
+\x34\xd4\x76\xa0\xed\xc3\x38\xc5\xf7\x71\x99\x05\x8d\x0e\x16\x01\
+\x46\xad\x47\xce\x14\xc9\x97\x11\x91\x97\x7b\xb6\x99\xd1\xcd\x2e\
+\x21\x6f\x7d\x32\x89\xae\x9a\xc8\x19\x77\x27\xb1\x67\x60\x08\x2e\
+\x6b\x3f\x76\xcc\x7e\x50\x01\x51\x2d\x2e\x47\x7c\xc6\x48\x99\xa0\
+\xfa\x50\x33\x9c\x05\xc9\x8a\x6f\x51\x71\x03\x60\xf4\x83\x39\x48\
+\x47\x2f\x3c\x91\x95\xa6\xd1\x30\xf8\xea\xe3\xd3\x60\x02\x5f\x39\
+\x41\x56\xad\x4e\x82\x63\x50\x84\x8a\x32\x74\x39\x80\x53\x97\xfb\
+\x60\xb0\xf5\xe0\x74\xb6\x77\x95\xec\x82\x32\x4c\x5d\x38\x46\x0e\
+\x2e\xdb\x53\x07\x69\xf7\x64\x6f\x45\xd9\x58\x8b\x6e\xbf\x61\x98\
+\x9e\xe4\x8f\x20\x0d\xbd\x6f\x74\x92\x56\xc7\x61\xcb\xa6\x0b\x60\
+\x42\xb3\xab\xc8\xdb\x59\xb1\x10\xe9\xb9\xd7\x5a\x45\x74\x0a\x54\
+\xfb\x56\x01\xba\xb6\x4e\x94\xaf\x8e\xf7\xde\xc8\x39\xc7\x30\x6b\
+\xc5\x78\xd9\x2e\xdd\x76\x0e\xa4\x38\x5d\xf1\x8d\x5f\x77\x1e\x83\
+\xa1\x41\x08\x89\x32\x20\x48\xcb\x20\x3e\x90\xde\x7e\x8d\x0a\x1b\
+\xb7\xd6\x80\x31\xbc\x56\x41\x72\x73\xe2\x71\x86\xca\xac\xb3\x5f\
+\x02\x47\xb7\xd1\xd1\x61\x87\xd8\x74\x13\xe7\xde\x4f\xf4\x12\x64\
+\xfc\x84\xe7\xd6\x4c\x91\xed\x03\xeb\xcb\x40\x4a\x9e\x51\x7c\xb1\
+\x6b\x2a\xa0\x1b\x65\x46\x04\x25\x18\xa2\x77\x23\xd8\x97\xc5\x44\
+\xb3\x16\x39\xb9\xb5\x60\x42\x5e\xaf\x6a\xca\x98\x17\x13\xdd\xe3\
+\x60\xe4\x04\xbb\x73\xd0\x6a\x19\xa0\x04\x6d\xa8\x7c\x77\x9c\x97\
+\x60\xea\x7e\xcc\xcf\x9d\x25\xdb\x85\x39\xa5\x20\x27\x5e\xf0\x1e\
+\xd1\xba\x73\x50\xc7\x98\xf1\x80\xc9\x07\x12\xcd\x01\x7d\x30\x4c\
+\x4b\x50\xb2\xb7\xbe\x99\x31\xe5\x54\x17\xc4\xa4\x84\x2f\x8b\x08\
+\xd3\xcb\x4e\x37\xc1\xf5\xd6\x7e\xf4\xd7\x5e\xc7\xf9\x4f\x27\x78\
+\x09\x52\x0a\xf1\x72\x41\xa6\x6c\x7f\xbb\xfc\x20\x48\xe5\x7c\xc5\
+\x97\xf4\x51\x15\x7c\xe3\x23\x10\x61\xf6\xf5\x62\xb4\xdb\x51\x5f\
+\xd9\xb6\x9d\x89\xfc\xf0\x52\x9a\x3e\x88\xff\x6d\xf2\x94\x30\x0c\
+\xd1\x3c\xb8\x9d\xcd\x2d\x03\xe8\x3c\xd3\x80\x4b\xeb\x27\x79\x09\
+\x12\xbf\xc3\xf2\x42\x4f\x0d\x2b\x98\x5f\x04\x52\xbd\x58\xf1\x3d\
+\xb2\xe6\x34\x82\x27\x8e\x44\x74\xa4\x67\x07\x6e\xa5\x9d\x2a\x6b\
+\x87\xbd\x4b\x98\x26\x97\x8a\xc8\xb5\x75\xf6\x94\xf4\x70\x3e\xd0\
+\x4f\x23\x4b\xf5\xea\xb5\x7e\x58\x4e\x5e\x41\xdd\x97\x8f\x7b\x09\
+\xe2\x0a\xb0\xea\xe0\x52\xd9\xde\x92\xb9\x13\xe4\xcf\xe5\xde\x1c\
+\xac\x3e\x09\xd3\xe3\xa3\x31\x2a\xca\x57\x56\x99\xb5\xcf\x89\xca\
+\x63\x6d\x42\xcb\xda\x58\xbd\x4c\x30\x3c\xf7\x4a\x02\xa3\xe1\xaa\
+\x33\x66\x84\x43\x45\x67\xfc\xd5\xd8\x87\x63\x5f\x1f\xc5\x86\x77\
+\x27\xd1\x2a\xea\x82\x9e\x16\xb1\x37\x17\xff\x80\x77\x8e\x67\xcb\
+\x80\x1b\xd2\xb6\x62\xf3\x77\xcf\xc3\x2e\x88\xb4\xaa\xaa\xf0\xce\
+\x17\xa7\x91\xfe\xc6\x74\x3c\x3c\xc2\x0f\x2e\x8a\x58\x72\xa4\x0d\
+\xc4\x29\x26\x36\xe5\x8c\xae\x51\xca\xf5\xc8\x4d\xf5\x79\x46\x93\
+\x3e\x6b\x66\x72\x80\x7c\x13\x2f\xd6\xdb\xf0\xe7\x79\xab\xa7\x25\
+\xd0\xdb\x99\x32\xd5\x84\x28\x5a\x69\xdd\xe3\x1a\xad\x98\x95\x27\
+\x2c\xb4\x4f\x78\xfa\x45\x5c\x52\x20\xc6\xc6\x18\xe5\x4a\x70\xf8\
+\xec\x2d\xd8\x2c\xf6\xfc\x86\xb7\x63\xbc\xe5\xfa\xce\x88\xd9\xda\
+\x54\x14\x68\xe2\xe7\xa6\xc7\x1b\x65\x45\x81\xbd\xdd\x60\x28\x88\
+\xcb\x45\x64\x22\x39\x88\x02\xab\xa8\x9c\x99\x3b\xd1\xb4\x3e\xba\
+\x95\x73\xac\xd6\x06\xab\x45\xd8\x57\x9f\x3d\xfc\xde\x86\x73\x67\
+\x8c\xde\xde\x92\xc7\xe9\x54\x59\x8f\x8d\x33\xc0\x44\x8b\x97\x78\
+\x5b\x76\x77\xc0\x95\x40\xc6\x23\x6b\x77\xb3\xb1\xd0\x3e\xf1\xfb\
+\x85\x5e\x88\x83\xae\xfc\x2b\xcb\x22\xef\xdf\x32\x95\xa4\x7d\x73\
+\x23\xc1\x05\xa6\xdc\x3f\x80\xe3\x47\x45\xe8\x60\x32\xa8\xe1\x47\
+\x95\x71\x77\x4f\xee\xa3\x8a\xb3\xf4\x0e\xe1\xea\xf5\x41\x74\xdf\
+\x12\x05\x15\x48\x6a\xdd\x92\x07\xfe\xbf\xe9\xdf\x3d\xc6\x16\xb6\
+\xa5\xb9\x24\xcc\xa1\xad\x77\x3a\xdd\x45\x34\xaf\xf7\x9c\x99\x40\
+\x7b\x86\x5b\xcd\xb4\x55\x1f\x55\xb1\x28\xbe\x38\x3f\xfc\xbe\x7f\
+\x5b\xfe\x01\x52\x1a\x7d\xac\x8b\xcf\x20\x5b\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x47\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x0e\x49\x44\x41\x54\x78\xda\x9d\x55\x69\x6c\x54\x55\
+\x18\x3d\xf7\xbe\xfb\xd6\x99\x32\xed\xcc\x74\x19\x96\x16\xda\x40\
+\x95\xa6\x16\x5a\x0a\x45\x10\xc2\x0e\x82\x42\x30\x42\x41\x23\x31\
+\x8a\x09\x01\x63\x34\x8a\x89\x1b\x25\x48\x8c\xc4\x40\x0c\xa0\x44\
+\x90\x04\xff\xb0\x19\x97\x44\x04\xa5\x84\xb0\x34\x2c\x69\xa1\x80\
+\xd2\x82\x61\x6b\x4b\x4b\xa1\xa5\x2d\x2d\x2d\xd3\x37\xf3\xae\xdf\
+\x9b\x51\xac\x50\xfe\xf0\xd2\x9b\xd7\x37\xef\xdd\x73\xbe\xe5\x7c\
+\xe7\xb2\xd0\xd2\xc3\xfe\x86\x8d\xe3\x6e\xe3\x11\xd7\x93\xeb\x2e\
+\x2e\x96\x9c\xcf\x13\x82\x4f\x96\x8a\x82\x61\x83\xbc\xb8\xd4\xda\
+\x8d\x08\x18\x84\x2a\x2a\x0c\x9d\x1d\x10\x42\x29\x29\x9d\x96\xd8\
+\xd5\xdb\x7e\x96\xb6\xe4\xa0\x64\x8a\x32\xa5\x61\xc3\xb8\xd2\x9e\
+\x2f\xb2\x56\x9d\x5d\xef\x80\x2f\x9b\x51\x94\x8c\x7e\xc9\x16\x82\
+\x3e\x15\x89\x9a\x02\x4e\xc0\x49\x1a\x47\x7f\x83\xa1\xaa\xd5\xc6\
+\xc9\xa6\x6e\x1c\xbc\x6e\xc3\x14\xd8\x71\x70\x7a\xd2\x82\x87\x08\
+\x02\x6f\x1f\x93\x2a\x63\xe0\x76\xf7\x8e\xfa\xf5\xe3\x16\xa4\xbf\
+\x7f\xa2\x2f\x18\xff\x6b\xf0\x13\x41\x6b\x68\x4e\x10\x2d\xb6\x44\
+\x94\x01\x3a\xe7\xd0\x15\xba\xab\x0a\x54\x01\xa8\x9c\x61\xa0\xa9\
+\xa0\xd0\x27\xa0\x33\x89\x6f\x2e\x77\xa2\xe2\x06\x11\x29\x2c\x9d\
+\xb2\xa9\xbd\x4f\xe0\x7f\xab\x4c\xa2\x30\x0b\x66\x5d\x0b\x64\xed\
+\xcd\x46\x2b\xc1\x4a\xcd\x18\xde\x17\x48\xb2\x08\x54\xc2\x10\x1c\
+\x86\xca\x29\x42\x22\x10\x8c\x08\x18\x34\x22\xd3\xe8\x7f\x4e\x24\
+\x42\x21\x22\x8b\x63\x4c\x1f\x8e\xf2\x96\x08\xd6\x9e\xe9\x80\x57\
+\xfc\x47\xc2\x7c\x4b\x8f\x48\x99\x9f\x89\x04\x9d\x43\x74\x76\x23\
+\x25\x41\x83\xf0\xaa\x04\xce\x08\x98\xc0\x08\x58\x50\xc4\x1e\x8a\
+\xdc\xe3\x12\xd1\x52\x5d\x22\x85\x83\xfe\xa0\x12\x81\x42\xdf\x06\
+\xe8\xdb\x22\x22\xa9\x6a\x8b\xe0\xcb\x73\x1d\x28\x7b\x36\x89\xc5\
+\x08\x12\x96\x1c\x96\xb2\x20\x0b\x5e\x45\xc2\x43\x35\x36\xa9\xbe\
+\x16\x01\x18\x82\xea\x4d\x25\xc9\x4d\xd1\x31\x36\x4d\x45\xfd\xad\
+\x30\x1a\x3a\xba\x51\xd5\x10\x46\x52\xd0\x84\xe6\x51\x30\x28\xd9\
+\x43\x3d\x91\x10\x44\xe0\xa2\xf9\x88\x7c\x72\x22\xc3\xba\x0b\x77\
+\x71\xee\xa6\x1d\xeb\x09\xb3\xde\x38\x24\xe5\xc8\x4c\x78\x28\x1a\
+\x8b\x40\x3d\x1a\x83\x97\x88\x18\x3d\x2f\xcd\xf3\xe1\xfc\x95\x56\
+\xec\x2e\x6b\x04\x35\x7c\x9b\xaa\x8b\x53\x9a\xae\x1c\xe2\x82\xcf\
+\xe6\x0a\x7b\xd7\xf4\x68\x09\x13\x46\x04\x10\xb4\x34\x30\x29\x69\
+\x0f\x43\x3f\xda\x9f\x43\x02\x78\xad\xac\xd5\x2d\x95\xc5\xcc\xc5\
+\x07\x24\x46\x0d\x86\x49\x31\xb8\xe9\x7b\xdd\x0c\x68\xa9\x54\xe7\
+\xa9\x03\x75\x6c\xdd\x79\x11\x8a\xc2\x57\xd6\xae\xce\x2f\x79\x50\
+\x21\xf9\x5b\xae\x2e\xa5\x97\x1b\x66\x8e\x49\x85\x5f\xe7\xb1\x52\
+\x45\x09\x67\xa2\x8f\x61\x77\x4d\x17\x8e\xd6\x85\xd7\x30\xed\xd5\
+\x52\x89\xa2\x21\x30\x49\x49\x96\xea\x2e\x85\x1a\xe9\xaa\x86\xb2\
+\x20\xc2\xe7\x06\x9b\xa8\xac\xbc\x89\xca\xea\xb6\xfd\xd7\x56\x0d\
+\x9b\xfa\x20\xc9\x88\x6f\x6b\x56\x58\x7d\xd4\x92\x17\x46\xa7\xd2\
+\x93\x03\x46\xa9\xa7\xbb\x38\x4e\x14\x9f\x9e\x6e\xaf\x60\xca\xa2\
+\xfd\xd2\x19\x99\x0d\x95\x5e\xba\x12\xf4\x99\x1c\x13\x32\x2d\x14\
+\x04\x74\x3c\x45\xcb\xa4\xa8\xaa\x9a\xbb\xb0\x61\x4f\x0d\xee\x74\
+\xd8\x14\x30\x1b\x70\xe1\x83\xdc\xba\x9e\x24\x79\x5b\xae\xb5\xce\
+\x9d\x10\xf2\x25\xd3\x30\xdc\x8b\x3a\xb8\x7e\x27\x4a\xb2\xb7\x51\
+\x4e\xb2\x65\x78\x69\x8f\xcc\x29\x1e\x89\xa2\x54\x15\x63\x53\x0d\
+\xe4\xf8\x74\x94\xd7\xb5\xe3\xcc\xa5\x76\x9c\xbe\xdc\x8a\xaa\xea\
+\xe6\xcb\x96\xa5\xfe\x62\x5a\xda\xde\xab\xab\x0b\xf6\xf5\x36\xad\
+\x05\x5b\xae\xee\xf4\x25\xe9\xf3\x22\x34\x30\x9d\x11\xe7\x78\xf9\
+\xc2\xbe\xa3\xef\xcf\x41\xe6\xf2\xa3\x72\xdc\xd3\x19\xb1\x87\xb3\
+\xd5\x4d\xb1\xfb\xf9\xb3\x37\xb6\x19\x86\xd8\xdb\xba\x75\xca\x4e\
+\x3c\xe6\x55\xf4\x53\xd3\xeb\xa6\x2e\xd6\x32\xcc\xdc\x71\x87\x8c\
+\x65\x2e\x7e\x2b\x2e\x7d\x5c\xb0\xdc\x4d\x57\xe6\x4b\xc6\x67\x18\
+\x5e\x31\x27\x3f\xdd\xf2\x15\xa4\xe9\x28\x0c\x18\xf8\xaa\xba\x23\
+\x26\x5f\xf8\x5e\xd9\x9b\x4a\x4a\x1e\x4e\x7a\x5e\xa1\xf6\xb1\x8a\
+\x54\x53\x47\x77\x47\x78\xd7\x8d\x8d\xcf\xcc\xef\x0d\x70\xc8\x67\
+\xe7\xa6\xdb\x52\x99\x41\x15\x99\x95\x37\x24\x31\xb3\x30\xc3\x83\
+\x11\x69\x26\x72\xfd\x2a\x68\x98\x41\xf6\x84\x36\x09\x6c\xa9\x6c\
+\x05\xd3\x5f\xfc\x51\xf2\xb4\x14\xf0\x90\x0f\x56\x80\x96\x4f\x83\
+\x7a\xcf\x46\x7b\xd9\x85\xb6\xc6\xcd\x93\x12\xff\x67\x80\x25\xa7\
+\xfb\x4b\x07\xb5\xfe\xa0\x85\x77\x66\x0d\x40\x6e\xc0\x84\xe3\x48\
+\xd4\x87\x81\x86\xb0\x83\x9a\x6e\x57\x45\xee\x94\xc7\x15\xb9\xef\
+\x1c\x11\x88\x39\xdf\x97\x47\x0b\x87\x16\x70\xbf\x97\xa4\x09\x9a\
+\x60\x9a\x07\x53\x45\xe4\xf8\x25\xa0\x3b\x5c\xd2\xb8\x69\xe2\xca\
+\x07\x33\x48\xff\xb8\xe2\xf7\x11\x39\xc1\x29\x93\x47\x85\x70\xa2\
+\xc9\x46\x1f\xb2\x12\xa1\xc4\x6d\x44\x23\x70\xba\xc1\xa3\x0b\xfc\
+\x7a\xaa\x89\x4a\xf4\xfc\xce\xcf\x59\xdf\xd0\x72\x99\x37\x10\xcc\
+\x8e\xc6\x5c\x92\x9a\x03\x3d\x12\x85\x53\x71\xd1\xd5\xf5\xb2\x5b\
+\x9b\x27\x6d\x7c\x88\xe4\xc3\x8a\x12\x87\xb1\x15\xef\xbd\x9c\x8d\
+\x3f\xef\x48\x92\xf8\x3f\xe0\x22\xee\xba\x16\xb9\xc1\xfe\x18\xc1\
+\xec\xdd\x26\x6c\xbb\x93\x4d\x23\x65\xd1\x07\x92\x46\x5e\xd0\xcf\
+\xba\x41\x11\xd9\x0e\x64\xe5\x65\xb0\x48\xb4\x9d\x0b\xe5\x0b\xc6\
+\xc4\xcf\x8e\xc6\xc6\x43\xf2\x7c\xdd\xa3\x2e\x5a\x38\x2d\x03\x23\
+\xb3\x03\xf8\xa1\xa6\x93\x6c\x81\xc7\x8c\xcf\x75\x5c\xd7\x05\x3c\
+\x86\x82\x03\x15\x37\xe3\x4d\xa6\x2c\xb6\x23\x10\x28\x66\xa3\xb2\
+\x81\x48\x84\x48\x5c\x2e\x16\x8b\xca\x34\x54\x88\xe6\x0e\xa4\x70\
+\x07\x6a\xe7\x5d\x0c\xcf\x0e\x62\x40\xc8\x42\x7a\x5a\x02\x4e\x36\
+\x87\x51\x43\x43\xe5\xda\x8b\x11\xb3\xf3\x78\x16\x6e\xa9\x75\x4a\
+\xe3\xc8\x7d\x02\xf7\x9a\xb9\x5d\xb2\xe1\x43\x81\x7e\xd4\x57\x9a\
+\x46\x32\xc9\xd8\x72\xa3\x32\x34\x41\xcb\xb5\x6f\x25\x7e\xe8\xb8\
+\xbf\x29\x71\x5b\x31\xa9\x99\xae\x03\x6b\x54\x12\xbb\x93\x26\x9d\
+\xf6\x84\x92\x0d\xa8\x14\x5c\xd9\xc9\xc6\x1e\x04\xb3\x77\x0d\x80\
+\x1d\xa9\x61\xf9\x39\x40\x7f\x3f\x65\x12\x85\x9b\x8a\xcb\xe3\x96\
+\x4c\xd3\x5c\xc0\xf8\xc1\x13\x3f\x80\x58\xfc\x30\x72\xa3\xa7\x2c\
+\xef\x36\xb6\xa3\xee\x8f\x1b\x20\x51\x35\x66\x0d\x0b\xa5\xe6\xe5\
+\x06\x71\xec\x48\x7d\x0f\x82\x7f\x49\x22\xd1\x1a\xa4\xa4\x80\xe5\
+\x65\x22\x16\xae\x43\x7d\xa0\x5d\x2c\xe6\xb6\x94\x11\x59\xba\x45\
+\xd1\x9b\x54\x63\x93\xde\x1b\xa4\xfb\x96\xea\x06\x84\x9b\x3a\x3a\
+\xb9\xa1\x0c\xae\x5d\x53\x54\x3f\xf0\xa3\x8a\xed\x5e\xbf\xa7\x98\
+\x53\x86\x0c\xbd\x5d\x6e\x4f\xec\x68\x31\x32\xfa\x83\x85\x28\x9b\
+\x10\x95\x8d\x48\x5c\x01\x68\x24\x47\x9d\x3e\x31\xda\xbb\xc0\x5b\
+\xda\xe1\xd4\x36\x83\x5b\xda\x86\xc6\xaf\xc7\xbf\xd9\x13\x22\xf3\
+\x93\x53\x93\x29\xa8\xfd\xbd\x13\xc4\xb2\x21\x75\x49\xa7\x84\x80\
+\x27\x51\x16\x05\x50\x04\x78\x30\x09\xea\xed\x36\x70\x3a\xf5\x15\
+\x4d\x94\x2a\x42\xd9\xd5\xf6\xdd\x8c\xcd\x8f\x82\xc8\x5a\x71\xda\
+\xff\x37\x2e\xd5\xee\x30\x68\x21\x72\xcf\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x2d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xf4\x49\x44\x41\x54\x78\xda\xed\x94\x5b\x48\x14\x51\
+\x18\xc7\xff\xb3\xe3\xee\xd2\x2a\x86\xee\x6d\xbc\xaf\xda\x45\x2d\
+\xca\xec\xa1\x87\x7a\x90\x10\xed\x22\x41\x10\x16\x84\x4a\x60\x17\
+\xa8\x07\x89\x28\x34\x10\x8a\x92\xa0\x12\x23\xc4\x88\x20\x33\x2c\
+\x4d\x82\x2e\x50\x90\x44\x45\x6f\x22\x11\x28\xa6\xe6\xaa\xed\xae\
+\x9a\x23\xae\xeb\x5e\x9d\xd9\x9d\x39\xcd\x0e\xb6\x58\xba\x9a\x97\
+\x7a\xea\x83\x33\x03\x73\xce\xf9\xfd\xe6\x7c\xe7\x3b\x87\xc2\x5f\
+\x0e\xea\xbf\xe0\x9f\x0b\x98\x57\x4c\x45\x7e\x7a\x4e\x75\xd7\xa8\
+\x19\x9f\x72\x7b\xa9\x55\x15\x6c\x7a\x9b\x46\xb6\x27\x66\xe0\x6a\
+\xea\x0d\x94\x74\x1e\xc1\x88\x6d\x6a\xf5\x56\x30\x1b\x7e\xd9\x56\
+\x01\x2b\x67\xc1\xd7\xcf\xe3\xab\x23\x08\xc2\xab\x77\x9c\x43\x8e\
+\x2a\x57\x86\x5b\xb8\x6f\x70\xbb\x79\x58\x7b\x1c\x2b\x17\xfc\x0e\
+\x1f\xf4\x0d\xc1\xcf\x8b\x18\xec\x9a\x00\xaf\x15\x2b\x57\x24\xc8\
+\x6a\x4b\x25\x0f\x77\xd5\xc1\x40\x9b\x64\xb8\xd9\x33\x80\x60\xdd\
+\x0c\x75\xdb\xe1\xf6\xf2\x60\x8f\xb1\xcb\xdf\xe4\xb8\xa7\x0c\xb9\
+\x53\x50\x15\xfa\xf3\x7e\xb7\x19\x34\x4d\xc3\xda\xef\xc0\xe4\xb8\
+\x0f\x6c\x19\x2b\xb3\xe5\x47\xdc\x6b\x86\x08\xac\x28\x4f\x64\x4b\
+\xd9\x45\xa5\x4c\x33\x43\x2a\x0b\x4a\x51\x14\x75\x1c\xe5\x43\x27\
+\x31\xe2\xfd\x0e\x95\x32\x02\x63\x56\xb7\xd4\x5c\x21\xb8\x2c\x60\
+\x5e\x30\xa4\x60\x63\x0e\xce\x26\x9c\xc1\x5d\xf6\x3e\x5a\x3f\x7e\
+\x08\x2b\x61\x9e\x31\x94\xe8\x11\xc5\x92\xbc\x3d\x38\x1f\x7b\x09\
+\x17\xad\xe5\xe8\x71\xf6\x42\xad\x54\xc3\x3e\x3e\x8d\xe1\x3e\x07\
+\xc6\x4e\x8c\xfd\x32\x97\xca\x78\x63\x22\xa7\xb6\x14\xa2\xdd\xd9\
+\x81\x0b\xf1\x55\x38\xdc\x79\x1a\xf6\x3e\xcf\xbc\x12\x43\x93\x81\
+\xe4\xed\xcc\x46\x4d\x42\x3d\xea\xd8\xeb\x78\xc7\xbe\x97\xe0\x2a\
+\x4c\x39\x79\x0c\x77\x4f\x62\xb4\x6c\x6c\xce\x1c\x2a\xb3\x2d\x8d\
+\x6c\x4b\x31\x40\x13\xa1\x86\x37\xc0\x85\x95\x18\x5b\x8c\x24\x6b\
+\x6b\x12\xd7\x98\xd6\xa8\x7e\xe9\x78\x82\xc7\xa3\x2d\x50\xd2\x11\
+\x70\x3a\xfd\xe0\x5c\x7e\x74\x16\x98\xe7\x5d\x35\xc5\x3c\x67\x48\
+\xb2\x3e\xc6\xbf\xd9\xa8\x53\x4e\x0b\x7e\x04\xa4\x8f\xbb\x63\xf6\
+\xa2\xb6\xbf\x21\x24\x31\x3c\x30\x90\xa4\x6c\x2d\x9a\x33\x1b\xd0\
+\xe1\x6a\x47\xbd\xad\x1e\x0a\x85\x02\x6e\x57\x00\xac\xd9\x09\x4b\
+\xf1\x48\xd8\x7d\xa3\x82\x77\x07\xfc\xa8\x5e\x67\xd4\xc2\xa4\x5b\
+\x0b\x5e\x14\x11\x90\x5a\xbe\x76\xbf\x2c\x41\x70\xef\x15\x40\x53\
+\xce\x6d\x4c\x4c\x7b\x71\xcd\x72\x45\xea\x17\xe0\xf5\x08\xb0\xdb\
+\xdc\x18\x28\xb2\x2d\x58\x14\x72\xa7\x24\x21\x94\x8f\x42\xa6\x49\
+\x0f\x7d\x74\x24\xb8\x40\x40\x5a\x89\x88\x42\xdd\x01\x58\x23\xbe\
+\xe0\xe0\x9a\xa3\xb0\x73\x3e\xdc\x1a\xae\x81\x93\x77\xc2\xe7\x15\
+\xe1\xb6\x73\xe8\x29\x1c\x5c\xb4\xe2\x42\x03\x82\xd5\xa4\xf2\xd3\
+\xc8\x48\xd7\x21\x52\xa3\x96\x25\x02\x11\x90\xa2\x49\xc6\xa1\xd8\
+\x62\xd4\x0e\xdf\x94\xe1\xd3\x5e\xb2\x60\xce\xc3\x0a\x66\xca\x90\
+\xa8\x04\x1a\x99\xeb\xf5\xa0\x95\x0a\x08\x82\x28\xa5\x2c\x00\x4e\
+\xe0\xa0\xa0\x54\x12\x5c\x4a\x8d\x83\x47\xf7\xbe\x81\x3f\x3e\xa0\
+\x73\x06\x32\xad\x0c\x89\xa4\x95\x48\xdf\xa0\x95\x92\x44\x20\x8a\
+\x04\x82\xd4\x3c\x5e\xff\x92\xe1\xf3\x0a\x82\x61\x7c\x64\x24\x31\
+\xd1\x1a\x24\x9a\xa2\xa5\x34\x11\xb8\x5c\xfc\xb2\xe0\x61\x05\xc1\
+\x30\xdc\x33\x10\x5d\x7c\xd4\x4c\x0d\x61\x59\xf0\x05\x05\x3f\x25\
+\xc1\xf7\xec\xbb\x65\xa9\xf1\x03\x6a\x34\x72\x3c\x94\x42\xe5\x6b\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x83\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x4a\x49\x44\x41\x54\x78\xda\x85\x55\x6b\x4c\x53\x77\
+\x14\xff\xdd\xd2\xf6\xde\xbe\x29\x48\x0b\x05\x4a\x7d\x20\x8b\xba\
+\x89\x51\x54\x7c\xcc\x22\x28\x5b\x96\x29\x68\x8c\x99\xaf\x69\xcc\
+\x96\x65\x59\x26\x66\xdf\xfc\xb0\xf8\x69\x5f\xb6\x45\x97\x65\x8b\
+\x1a\x1d\xc6\x19\x9d\x33\x51\x50\xd1\x69\xa6\xe0\xe2\xe6\x03\x9f\
+\x99\x41\x10\xa5\x40\x0b\xd8\xd6\xb6\xb4\xa5\xb4\xa5\xed\xbd\x3b\
+\xf7\x5e\xd4\x25\xce\xf9\x4f\x4e\x6e\x7b\x72\xce\xef\x77\x5e\xff\
+\xf3\x67\xf0\x3f\x27\xd4\xa2\x59\xc1\xa8\xf4\xef\x2b\x0d\x65\x4b\
+\x14\xac\xa9\x34\x1e\x11\x24\xbd\xc6\xc8\x80\x4f\x86\xbb\xd3\xd1\
+\xae\x4b\x42\x6a\xe4\xb4\xf9\xbd\x78\xcb\xab\x30\x98\xff\x52\x06\
+\x4e\x71\x4e\x85\x6e\x62\xa3\xa6\xb8\xde\xa1\xca\xaf\x82\x42\x6b\
+\x43\x26\xe6\x45\x2a\x16\x04\x43\x1e\x6c\x9e\x9d\xac\xb2\x64\x9d\
+\xf7\x32\x7d\x87\x90\x74\xff\x5a\x95\xbb\x22\xd1\xf6\x5a\x02\x7f\
+\xb3\x69\x97\xc6\xbe\xba\x41\x5b\xba\x19\x89\x90\x1f\x91\xce\x56\
+\xa4\x63\x3e\x64\x69\xd4\x50\xb0\x6a\x30\x0a\xca\x82\x8f\x03\xa9\
+\x14\xb8\xfc\x52\x68\xed\x95\xa4\x63\x11\x7f\x74\x04\xf1\xfe\xe6\
+\xdd\x79\x2b\xc3\xdb\x5f\x49\xe0\x6d\xb2\x35\x1a\x67\xed\xd8\xac\
+\x34\xce\xc0\xe0\xe5\x9f\xa1\x36\xa8\x60\x9c\x36\x13\xac\x79\x02\
+\x52\xf1\x30\x52\x89\x61\x40\x48\x91\x65\x12\x2a\xbd\x02\x19\xdf\
+\x00\x92\x1e\x37\xb8\xc2\x59\xd0\xd8\x17\x23\x31\x78\x07\xd1\x7b\
+\xdf\x1f\xb4\xd6\x0d\x6e\x79\x89\xe0\xc9\x31\xc3\x2e\xd3\xdc\xaf\
+\x1a\xc0\x4d\x82\xe7\xfc\x5e\x58\x97\x2c\x85\xb6\xa0\x10\xf1\x90\
+\x17\xbe\x87\xd7\x08\x3c\x05\x95\x92\x45\x2a\x9d\x94\xec\xf5\x16\
+\x01\x96\xd2\x02\x08\x42\x04\xa9\x41\x1f\x71\xda\xa0\x9d\xbc\x04\
+\x09\x6f\x0f\x22\xed\x5f\xef\xce\x5f\x1b\xdd\xfe\x9c\x60\xe0\x10\
+\xe7\xd4\x97\xad\x6f\x55\xdb\xeb\xe1\x6e\xd9\x8b\x92\x35\x6b\x91\
+\x88\xfa\xe0\x7d\x78\x1d\x59\x82\x0a\x6c\xce\x18\x0a\x67\x6c\x23\
+\x4b\xb9\xc9\x89\x50\x3f\x9e\xf6\x1f\x86\xa5\x2c\x97\x7a\x12\x25\
+\x92\x18\x32\x7e\x9e\xca\x56\x0a\xd6\xbe\x80\xb2\x68\x41\xec\x61\
+\x73\x55\xe1\xa6\x44\x9b\x44\x10\xbe\xbe\x55\xd0\x4f\x5b\x87\x9e\
+\x13\x7b\x51\x50\xed\x04\x37\x21\x0f\x1d\xe7\xf6\x23\xc7\x61\x22\
+\xe0\xcf\x64\x60\x46\x18\xcf\x55\x40\x3c\xe0\x81\xaf\xb7\x11\xb6\
+\xe9\x1c\x04\x3e\x49\x55\xcb\x00\x19\x86\x48\x94\x50\x1a\xde\x02\
+\x63\x28\xc1\x68\xd7\x9f\xc8\x9e\x7f\x8c\x61\x5c\x7b\xd9\x3a\xf3\
+\x9c\x86\x93\x19\x65\x11\x92\xc3\x7d\xb0\xcc\x9d\x23\xd5\xb9\xe3\
+\xfc\x61\x4c\xae\x5c\x07\x6d\xae\x0d\x63\xb1\x08\xd2\x89\x28\xb4\
+\xe6\x02\x22\xe0\x11\x0b\x0e\x51\x76\x07\x50\x54\xae\x96\x5b\x92\
+\x11\x5d\x28\x00\x12\x3e\xa4\x03\x5b\xba\x10\x91\xae\x0e\x8c\x3e\
+\xbe\xbb\x95\x71\xed\xcb\x6d\xb4\xad\x3e\xb0\xb9\xff\xcc\x11\x14\
+\xbe\x53\x4d\x11\xb0\x64\x9d\x40\xe7\x6f\x97\x9e\x37\x3f\x1c\xf0\
+\x49\xdf\x45\x9b\x3e\x97\x32\x18\xa1\xff\x3d\x7f\xfd\x80\x32\x67\
+\x1e\x90\x26\x4d\x86\xca\x33\x26\xd0\x97\x64\x94\xb2\xb0\x4c\x03\
+\xaf\xd0\x23\xd0\x76\x66\x27\xe3\x39\x5e\xe9\xca\xaf\xdd\xe9\x70\
+\x9d\xfa\x09\x25\xab\x97\x51\x80\x09\x08\x4c\x9c\x66\x3e\x82\x44\
+\xb8\x5b\x9e\x04\x86\x32\xba\x18\xc0\xc2\x0d\xab\x08\x9e\x41\xd4\
+\x1f\x41\xdf\x8d\xa3\x98\x5a\xa9\xa7\xe8\x59\x08\x69\x5e\x4c\x8c\
+\xbe\x62\x16\x0a\x30\xac\x15\xaa\xa2\x22\x78\xcf\x5c\x38\xca\x0c\
+\x34\x2d\x17\x4c\x6f\xae\x86\xef\xde\x21\x14\xd5\xd6\x53\xc3\xfc\
+\x64\x2c\x46\xec\x97\x7e\x0b\x42\x08\xe1\xfe\x11\xf4\xde\x2d\xc0\
+\xec\x55\x4b\xa4\x0c\x42\x6e\x3f\x3a\x2f\x9c\x40\x79\xcd\xa8\x18\
+\x0f\x94\x0a\x1d\xe9\x4d\x24\x94\x91\x60\xa4\xfb\x92\x0d\x65\x89\
+\x15\xfe\xdf\xaf\x81\x79\xbc\x7f\xaa\x30\x61\xe1\x26\x04\x1e\x9c\
+\x83\xad\xda\x41\xf1\xc5\x08\x22\x4c\xc0\xc3\xd4\x57\x9a\x7b\x04\
+\x11\xea\xcb\xa0\xe7\xba\x1d\x15\x1f\xcc\x92\x7a\x10\xec\x8b\xa0\
+\xab\xa5\x15\x33\xab\x89\x20\x25\x5f\x0d\x81\xfa\x20\x96\x2b\x8b\
+\x57\xd3\xa5\x2c\x06\x57\x3e\x17\xee\xe3\xb7\x64\x02\xf3\x9c\x1a\
+\xf8\xef\x34\xc1\xb1\xaa\xfc\x05\x38\x1f\x14\x63\xa5\x12\x8c\x21\
+\xe4\xe2\xd0\xd5\x6e\xc1\x82\x8d\x0e\x42\x22\x02\x57\x02\x1d\xcd\
+\xf7\x51\x4e\x04\x72\x83\x09\xfc\x59\xb3\xc7\x68\x95\xe8\x34\x44\
+\xe0\x80\xfb\x74\x06\xcc\xd0\xe9\x65\x02\x5b\x5c\x42\x04\x67\x61\
+\xaf\x2f\x14\x57\x1c\x45\x1e\x22\x9c\x30\x45\xc4\x83\xa7\xa8\x02\
+\x3d\x1c\xba\xdb\x4d\x58\xb4\x31\x47\xde\x55\x2e\xe0\x7e\x53\x2f\
+\x66\xd5\xc4\xc0\x64\xc6\xc1\xd3\xe3\x99\x90\x68\x0b\xb3\xc1\x4e\
+\xb2\xe0\xe9\xed\x12\x89\xa0\x33\xa7\x72\x66\x59\xef\xe9\x23\x28\
+\xa9\x53\x52\xf4\x01\x69\xd7\x08\xa2\x43\x52\x74\xe0\x89\x40\x83\
+\xee\x9b\x26\x38\x3f\x34\x4a\xcd\xf4\x11\xc1\xbd\x53\x03\xa8\x18\
+\x27\x10\x41\xf9\x31\xb9\x4c\x0a\xe2\xd2\x96\xe4\x82\xb3\xe5\xc0\
+\xf7\xb7\xa3\x4b\x24\xf8\x45\x3f\xad\x60\xed\x60\xdb\x21\x58\x9d\
+\x6a\xb0\x86\x14\x81\x33\x04\x2e\x48\x53\x21\x3a\x06\xa9\x44\x8f\
+\x6f\x9a\xb1\x74\xbd\x56\xba\x73\x5e\x17\x83\x5b\x2d\x4f\x30\x6f\
+\xd9\xc8\xf3\xa8\x85\xf1\xf2\xa8\x74\x4a\xe8\xa7\x58\x90\x49\x65\
+\x21\xec\x7d\xe3\x1b\xe6\xf6\x0e\xd4\x4d\xa8\x98\x79\x32\x67\x4a\
+\x04\x03\x37\x5c\x28\x5a\xae\x20\x43\x41\xba\x38\xa2\x03\x5d\x54\
+\x04\xfb\x59\xf4\xde\xce\x46\xd5\x1a\x9d\x34\x45\xde\x7e\x06\xed\
+\x67\x9f\x62\x5e\x75\x44\xce\x34\x2d\x97\x48\xec\x01\x67\xd3\xc2\
+\x34\xb1\x00\xee\xf6\x00\x54\xe6\x8a\x0d\xd2\xaa\xb8\xf3\x25\xeb\
+\x2a\xfd\x68\xb9\xa3\x6b\x7f\x2b\xec\xcb\x47\xc0\x51\xa9\x33\x71\
+\xd9\x51\xcc\x60\xd8\xc3\xa2\xef\x8e\x19\x55\xab\x38\x52\x30\xf0\
+\x79\x78\x5c\xbb\x18\xc2\xfc\xb7\x23\x72\x83\x45\x3b\x12\x95\x89\
+\xb6\xef\xa4\x5c\x72\x54\xc1\xdb\x15\x3d\x6a\xdf\x34\xbc\x4e\x22\
+\x68\xff\x02\x4e\xe3\x54\x6b\xab\xad\xb6\x14\x9d\x7b\xae\xa0\xb8\
+\x06\x50\xeb\xc6\x6b\x4b\x8e\x21\x0f\x87\x27\x1d\x66\x2c\x5e\xa1\
+\x96\xdf\x0c\x0f\x70\xe3\xe2\x30\xe6\x54\x86\xa5\x2c\xc5\xc8\x19\
+\xb5\x02\xfa\x89\x26\xe8\x72\xcd\x78\xd4\x3a\x84\x61\x77\x5c\x57\
+\xf1\x2d\x46\x9f\xaf\xeb\xab\xdb\xb0\xab\xb8\xd6\xde\xa0\x9b\xc8\
+\xa2\xe7\xf0\x63\x58\x67\xf3\xe0\x4c\xf2\x84\x04\x07\x34\x68\xbf\
+\x9c\xf7\xd2\xcb\xb7\x74\x41\xbf\x94\x25\xa3\xa5\xba\x17\x19\xa0\
+\xcf\xcb\x86\xaf\x63\x18\x3d\x37\x42\xbb\x2b\xbf\xc3\x8b\x75\xfd\
+\xec\x5c\xf9\x14\x8d\xf6\x77\xad\x9b\x73\xca\x0c\xe8\x3b\x3b\x00\
+\x25\xe2\x30\xd2\x7e\x53\xaa\x68\x34\x3d\x1a\x79\xce\x49\x78\x12\
+\x83\x76\x0c\x59\x2a\x01\x0a\x9d\x9a\x6c\x74\xb4\x08\x8d\xf0\x76\
+\x04\xf1\xe8\x6a\xf8\xe0\xa2\x1f\xf1\xf2\x83\xf3\xec\xfc\xf1\x09\
+\x76\xe5\x94\x69\x1b\x1c\x35\x56\xa4\xa2\x69\x84\xbb\x69\x27\xf9\
+\x46\x90\x45\x4f\x25\x43\x33\xc8\x28\x18\x28\x48\xd4\xd9\x2c\x0c\
+\xb9\x1c\x09\x3d\x42\x71\x1e\x03\xf7\x22\x70\x3f\x18\xdd\xfd\xf6\
+\x1e\xbc\xfa\xc9\x7c\x76\xda\x3e\x86\x53\xcd\xa1\xd1\x32\xdd\xe0\
+\xc8\x9f\x2e\xd6\x95\xa5\x69\x4a\x23\x19\x4e\x4a\x0e\x9c\x91\xc6\
+\x95\x17\x90\x78\x1a\xc3\x93\xce\x11\x0c\x3d\x1c\xed\x1d\x4b\x61\
+\x8b\x73\x1f\x5e\xff\xe8\xff\xfb\x5c\xda\x8a\x3a\x9a\xca\x95\xba\
+\x6c\x85\x93\xd5\x67\x39\xc2\xa3\xac\xa4\x37\x71\x49\x24\x47\x52\
+\xbd\xb4\x70\xdb\x08\xa1\x79\xe9\x01\x34\xbd\x0a\xe3\x1f\x8b\x8a\
+\xf2\x1b\xb5\xa6\x15\xb8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x2b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xf2\x49\x44\x41\x54\x78\xda\xad\x95\x7b\x4c\x53\x57\
+\x1c\xc7\xbf\x7d\x89\x9b\x10\xb3\xa1\x65\x5b\x10\x9d\x2e\x0e\xcd\
+\x02\xb8\xb0\xcc\xb0\x38\xc2\x1c\xc9\x8c\xc4\xb8\x3f\xf6\xc0\x65\
+\x8b\xc9\x32\x17\x14\x16\xa3\xce\xa1\x6c\xd8\x06\x07\x0d\x11\x35\
+\x0e\x82\x59\x4c\x96\x39\x34\x46\x5d\x37\x40\x31\xab\x88\xdd\x40\
+\x29\x32\x04\x06\x03\x8a\x3c\xca\xbd\x2d\xa5\x15\x0a\xb5\x50\x6a\
+\xa1\xf7\xec\xd7\xcb\x46\x8a\x7b\xd0\xea\x6e\x72\x5f\xe7\x9e\xdf\
+\xe7\x73\x7e\xbf\x73\xee\xbd\x12\x84\xb0\xbd\x7d\x9e\x8f\x8a\x59\
+\x1a\xb1\x6b\x31\xee\xef\x1c\x65\x61\x91\x23\xb6\x49\xb1\x7d\x78\
+\xc2\xf7\xcb\xb4\x8f\xe5\xfc\xf4\xf1\xb2\xba\x07\x63\x24\x21\xc0\
+\x93\xe3\x94\x0b\xf4\xef\xbd\xac\x84\xeb\x3e\x60\xf5\x00\x3e\x8a\
+\x9e\xa6\x67\xdc\x18\x70\x87\x73\xa2\xe1\x16\x57\x6a\xc8\x89\xdb\
+\x19\xb2\xe0\xad\x32\x2e\x35\x3e\x3a\x4c\xe7\x87\xb7\x0d\x03\x2e\
+\x6a\x0b\x93\x01\x72\x05\xc0\xe8\x7a\xda\x07\x8c\x53\x32\x46\xfe\
+\x1e\x6a\xae\x75\xab\x6e\xa9\x5f\x52\x87\x24\x38\xac\xb7\xb1\x0f\
+\x93\x94\xa8\xb6\x30\x48\xa5\xc0\x02\xa9\x04\x46\x6e\x18\xd5\xba\
+\x36\xc8\x64\x72\x7b\x7c\x5c\xb4\xf2\xc5\x84\x15\x10\x08\xd7\x41\
+\x92\xcb\x17\x5a\x12\xda\x4e\x24\xb7\x06\x25\x48\x2f\xeb\xdf\xfd\
+\xe5\xd6\x15\xc7\x5a\x47\x04\x38\xa9\x1e\x32\x82\x7b\xbc\x5e\x9c\
+\x29\xbb\xe1\xd0\xe7\x6d\x8c\xf4\xf7\x79\xf5\xc8\xed\x6f\xd3\x92\
+\x9f\xfb\x40\xf9\xc4\x22\x78\xa9\x6e\xe5\x35\xc6\x96\xcb\x19\x6b\
+\xd6\x05\x25\xd8\x7b\x69\x40\xb7\x3b\x25\x26\xf5\x8a\x65\x0a\x0a\
+\x82\xfb\x33\x70\x38\xdc\x28\xaf\xbc\x9d\xae\x57\xa7\x9c\xf3\xf7\
+\x49\x2a\xed\x59\x93\xf2\xc2\x93\x1d\xcb\x97\x86\xc3\x33\xcd\x70\
+\xad\xde\x84\xf2\x8f\x9e\x97\x04\x25\x78\xa3\xa4\xa3\x31\x3d\x75\
+\x75\xe2\x15\xce\x0d\x39\x09\x24\x14\xc1\x68\x94\xd7\x2f\xd6\xe2\
+\xde\x74\xd8\xd3\xae\x53\xaf\x0d\xa5\x57\xd8\xaa\xd6\xc7\x44\x6c\
+\x92\xc9\x65\xf0\xd0\x7c\x18\x1a\x4c\xb8\xb8\x23\x48\xc1\x86\xa2\
+\xd6\xc6\x2d\xaf\xaf\x4e\xac\xe8\x76\x53\x06\x10\x67\x55\x2a\x93\
+\xe2\xae\xd5\x05\x87\x75\x0c\xf2\xc5\xe1\x08\xa7\x91\x47\x45\x28\
+\x10\x1e\x06\x44\x3d\x26\x83\xd5\x38\x88\x8a\x8c\xd8\xe0\x04\xd1\
+\x59\x35\xba\x3d\x3b\x92\x52\x4f\x37\x8f\xd1\xca\x91\x80\x09\x4c\
+\x6c\x67\x62\x36\x14\x4e\xf7\x02\x13\xfc\x27\x08\x02\x30\x45\x19\
+\xac\xf2\x3a\x83\x17\x60\xe3\xb9\x37\x4f\x17\x6f\xd1\xaa\xf4\xa3\
+\x58\xa8\x60\x62\x89\x84\x29\x6a\x97\x32\x30\x36\x93\xd1\x8c\x90\
+\x60\x54\x7f\x1f\xa4\x18\xba\xde\x32\xe1\xba\x90\x16\x1e\x94\xa0\
+\xa2\xb2\xaa\xea\x70\xf3\x92\x4d\x8f\xaf\x7d\x16\x3d\xfc\x24\x4d\
+\xb2\x4f\x1c\x29\x0b\xe8\xc3\xc8\x24\xde\x4b\x65\x70\xf3\x36\x8c\
+\xdf\x6c\x48\xf4\xd5\x67\x35\x05\x25\xf8\xf1\x87\x4a\xa6\xfa\xfa\
+\x12\x22\xb7\x7e\x8a\xfa\x51\x40\x41\x28\xe6\x4f\x83\x6a\x21\x50\
+\x99\xc4\x8a\x09\x12\xb1\x64\x6c\x72\x02\x1e\x43\x73\x09\xaa\xb7\
+\x67\xfe\x15\x2f\x99\x07\x7e\x26\xe9\x95\xf5\xdb\xce\x9f\xfd\x0e\
+\x37\x1b\x5b\x70\xd6\xfb\x0e\x10\xbb\x8a\xa2\xfe\xac\x8d\x38\x6c\
+\x3a\xd0\x5b\x0d\x8b\x9d\xbe\x17\x5d\x25\xd0\x67\x64\x06\x32\x24\
+\xff\x01\x3f\x40\xf0\xfc\xda\xda\x1b\xf8\x5e\xab\xc5\xbe\x7d\x7b\
+\x71\xf5\x67\x03\x0a\xaf\x8e\x4f\x8d\xb0\x48\x27\x16\x2d\x5c\x02\
+\xc1\x37\xf3\x9d\x70\x8d\xe9\xe0\xf6\x1c\x84\x61\x7f\xd3\x83\x9c\
+\x7f\x14\x7c\x9e\xab\xca\xfd\x24\x73\x97\x3a\x10\xde\xd0\xd8\x0c\
+\x8b\x85\xc3\x98\x73\xbc\xbf\xf8\x78\xe1\xca\x79\x17\xc7\xbf\x09\
+\x08\x5e\x94\xa7\x3e\xb4\x47\xab\x2d\x9f\x85\x37\xb5\xb4\xc3\x3e\
+\x34\x04\xab\xcd\x66\x26\xf8\xb2\x60\xe1\x7f\x13\x10\xfc\x04\xc1\
+\xb3\x02\xe1\x6d\xbf\x75\x82\xb7\x98\x61\xb5\xdb\x3b\x4b\x8e\x17\
+\xae\x0d\x05\x3e\x47\x40\xf0\x6f\xde\xdf\xf6\xee\xf6\xf6\xdf\xbb\
+\x66\xe1\x9d\xc6\x3b\x18\xe0\x78\x0c\x3b\xee\x72\x47\x35\xf9\xcb\
+\x43\x85\xcf\x0a\x08\x7e\x80\xe0\xf9\x7e\x78\x71\x49\x29\x8a\x8a\
+\x0a\xd1\xd3\x6b\xc2\xa0\x75\x08\x03\xfd\xfd\x96\x63\x47\x35\xd1\
+\x0f\x03\x0f\x14\x7c\xb6\x2e\x3e\x41\x73\xf2\xe4\x29\x14\x7f\x75\
+\x04\x5d\xdd\x26\x70\xbc\xd9\xd7\xd7\xdb\x63\x27\xf8\x33\x0f\x0b\
+\x0f\x14\x64\x37\xd4\xff\x5a\xe0\x87\xf7\x71\x83\xe8\xed\x33\xc1\
+\xcc\x71\x36\x4d\xbe\xea\xa9\x47\x81\xcf\x11\x1c\xcc\xde\x5f\x50\
+\x5b\x57\x8f\x01\xde\x0c\x9e\x33\x1b\xf3\xd4\x39\xb1\x8f\x0a\x9f\
+\x23\x48\xdb\xbc\xb9\xa0\xbd\xc3\x08\xde\x6c\xae\x53\x7f\x91\xbd\
+\xe1\xff\x80\xcf\x0a\x0e\xe5\x69\xfc\x3f\xe9\x5c\xda\xcd\x04\x0f\
+\x69\x9d\xcf\xb7\xfd\x01\xeb\xf5\xdd\x28\xa9\x90\x53\x4d\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x78\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x3f\x49\x44\x41\x54\x78\xda\x95\x96\x0b\x4c\x13\x77\
+\x1c\xc7\xbf\xbd\x6b\xaf\x13\x5c\x24\x55\x88\xb5\x44\xe6\x50\xe2\
+\x6b\xce\xed\x74\xc3\x6d\x4c\x13\x04\x83\x2f\xb2\x4d\x04\x1f\x71\
+\x2e\x1a\x8d\xd9\xd4\x19\x66\x9a\x29\x03\xdd\x74\xc6\x8d\xcc\x88\
+\x88\x0e\x98\x04\x15\x59\x11\x35\x3e\xd8\x84\xf0\x50\xac\x28\x70\
+\x28\x86\x89\x3c\xc6\xd3\x52\x4a\x4b\x4b\xa7\x52\xb4\x94\xfe\xf7\
+\x3f\x1e\x89\xf1\x20\xea\x2f\xb9\xb6\x77\xff\xfb\xff\x3e\xbf\xf7\
+\xbf\x32\x3c\x27\x0b\xf3\x6c\xf6\xfc\x50\x95\x17\x5e\x43\x3e\xc9\
+\x36\x09\x0e\x27\xe1\x9d\x7d\x04\x70\xd3\x0b\x04\x1e\xac\x0c\x65\
+\x6b\x35\x32\x71\x5d\xf6\x02\x80\xd0\x57\x8c\x05\xa1\x2a\xcd\xab\
+\x02\xde\x3d\xd9\x26\x1c\x5d\xe6\xcd\x4f\xf6\x94\x53\xfd\x04\xa3\
+\x39\x06\x1f\xa6\xb4\xe2\xc1\x26\x3f\x29\x60\xfe\xdf\x56\xa2\xa0\
+\x4f\x9e\x3d\x73\x1b\x6f\x84\x7b\xbf\x12\x64\x46\x6a\xab\x70\x28\
+\xdc\x87\x37\xf5\xc9\xfa\x95\x79\x70\x2c\x76\x9d\x6e\x41\xed\x36\
+\x7f\x29\x60\xce\x79\x33\xb9\xba\x6c\x2c\xd6\x17\xdb\x61\xb1\xf6\
+\x1a\x4b\x57\x8e\x7f\x29\x64\x5a\x52\x93\x90\x18\xa1\xe6\x2b\x9f\
+\x32\x34\x44\x6e\x78\x8c\x62\x71\xf8\x54\x33\x6a\xa2\xa7\x48\x01\
+\xb3\xce\xb4\x93\xab\x5f\xf8\xc0\xec\x24\xf8\xfe\x86\x0d\x66\x5b\
+\x2f\xe4\x32\x68\x4a\xd7\x68\x8c\x23\x01\x02\x12\x1a\x84\xc4\xa8\
+\x09\xfc\x5d\x87\x0c\x2c\xbd\x57\xbe\xc1\x20\x21\xbd\x11\xf5\xda\
+\xa9\x52\xc0\xf4\x74\x03\xc9\x8f\x52\x23\xd3\xe2\xc2\x62\x15\x83\
+\xad\xb9\x56\x74\x76\x3a\xa1\x60\x88\xa6\x7c\x83\xdf\xb0\x90\xc9\
+\xbf\xd4\x09\x47\xd6\xf9\xf2\x15\x83\x00\x4e\xc9\x22\x29\xad\x1e\
+\x0d\x31\x33\xa4\x80\xa9\xc9\xad\xa4\xe8\x4b\x5f\xa4\x9b\x9c\x62\
+\x31\x20\x48\xc5\x22\xe6\xaa\x09\x96\x0e\x17\xe4\x14\x52\xf9\xf5\
+\xdb\x12\xc8\xa4\xfd\xd5\x42\xc2\x57\x7e\x7c\x79\x37\xcd\x01\x19\
+\x00\xfc\x91\x5a\x8b\xc6\x9f\x66\x49\x01\x01\x47\x1b\x49\xe1\x46\
+\x3f\xa4\x19\x9d\x50\xd2\xfb\x5e\x7a\x85\x8e\x53\x20\x59\xb0\xa1\
+\xb8\xdc\x0e\x4e\x01\x75\xd5\x8e\x00\xd3\xf3\x7b\xde\xda\x5b\x25\
+\x1c\xda\xe0\xcf\xdf\x7e\x44\xc0\x50\x82\x08\x48\x4f\xa9\x41\xf3\
+\x81\xf7\xa4\x00\xff\xc3\xff\x92\xa2\xcd\x93\x90\x6a\x70\x82\xa3\
+\x2e\x88\xa5\x4d\xd3\x81\xc5\x3e\x14\x52\x6e\x85\xbe\xd4\x0a\xa5\
+\x82\x89\xaa\xd6\x4e\xd3\x0d\xed\x99\x18\x53\x29\xfc\xb6\x79\x0a\
+\x7f\xd3\x4e\xa8\xb2\x01\xc0\x99\xe4\xfb\x68\x8d\x9f\x2b\x05\x4c\
+\x3a\x58\x4b\x0a\xb6\xfb\xe3\x58\x93\x13\x34\x57\x20\x64\x08\xe2\
+\xc6\x52\xb5\x12\x27\x4a\x3a\xa1\xbf\x6d\xa1\x9e\xb0\x91\xb5\xb1\
+\x33\xb3\xc4\x3d\xbe\x5a\x41\x88\xdf\x32\x95\xbf\x66\x73\x83\x19\
+\xcc\x41\xf6\xb1\x2a\x18\x12\x03\xa5\x80\x89\xfb\xaa\x49\x51\x74\
+\x00\x12\x1a\x7a\xc0\xc9\x44\x7b\xd0\x9f\x8b\x3e\x0a\x72\xba\x81\
+\x40\x6f\x0e\x39\xe5\x16\xe8\xf5\xed\x18\xa5\x64\x23\xeb\xf7\xbd\
+\x9f\x35\x61\x47\x69\xd9\xc1\xad\xd3\xe7\x16\x74\x52\x00\xd5\xa6\
+\x50\xca\x71\x25\xe9\x0e\xda\x8e\x07\x49\x01\xbe\x71\x55\xa4\x50\
+\x3b\x1d\x87\xea\xba\xfb\x01\xb4\xac\xa9\x7e\xd2\x3f\x01\xc4\xdf\
+\x62\xb8\x66\xd3\x9c\xb8\x1d\x4e\xc4\xa7\x3c\xa0\x9e\x30\x61\x0e\
+\x87\x73\xd7\xcf\x3b\x66\x05\xe5\x9a\x07\x3c\x50\xd0\x46\xcb\xff\
+\xbd\x02\xc6\x94\x05\x52\xc0\x84\x5d\x95\x24\x7f\xf7\x4c\xfc\x7a\
+\x9f\x02\xa8\x39\x6e\x51\xfd\xe0\x88\x11\xbd\x11\x21\x7d\xf4\x5b\
+\xed\xc9\xe0\xc2\xa9\x1a\xb8\x9c\xbd\x0f\x7b\xba\x5d\x75\x3f\x7e\
+\x37\x3b\xf8\x8a\xc9\x05\x05\x5d\x63\x39\x39\xf4\xc9\xe5\x68\x4f\
+\x0b\x96\x02\xc6\xef\xbc\x43\xf2\xe2\xde\xc1\x81\xaa\x01\x0f\x86\
+\x72\xe0\x16\x23\x45\x29\x32\x39\x83\xc7\xdd\x6e\xdc\x3d\xf7\x80\
+\xd6\x7c\x9f\xa9\x35\x29\x48\xed\xbd\xbe\xe0\x56\x9c\x76\x4e\xe0\
+\x45\x03\x2d\x65\x6a\x06\xab\x54\xa0\x22\xb9\x04\xed\xa7\xc3\xa4\
+\x00\x9f\xed\xb7\x49\xee\xbe\x39\xd8\x73\xe7\x11\x94\xac\x6c\xd0\
+\x7a\x32\xb0\xc8\xb0\xe8\x68\x79\x8c\x26\x7d\x13\xe4\x84\xe8\x5a\
+\x8e\x7f\x1a\x25\x3e\x1e\xbb\x3a\x4f\x88\x8d\xf9\x80\x3f\xdb\x4c\
+\x3d\xa0\xef\x32\x34\x07\xff\xa4\x94\xa0\x43\xb7\x44\x0a\x18\xb7\
+\x45\x4f\x72\x0e\x06\x22\xb6\xec\xbf\xfe\x10\x91\xc1\x10\x89\x96\
+\x5b\x9a\x9e\xc0\x70\xbd\x16\x8c\x5c\x9e\xf5\x30\x65\x41\xe4\xd0\
+\x1e\x55\xe4\x5f\x82\x76\xf7\x3c\x3e\xbb\xa1\x17\x2c\xed\x03\x86\
+\x86\xa8\xfe\xc4\x4d\x58\xb2\x97\x0f\x03\xd8\x78\x9d\x9c\x8f\xff\
+\x08\x31\xb7\xec\x83\x1e\xd0\xee\x54\x30\x30\xd7\xd0\xe1\x77\xab\
+\x4e\xb4\x6e\xaf\x21\x35\x78\xcf\xf3\x7b\xbc\x56\x5c\x16\xa2\x63\
+\x3e\xe6\xff\xac\x75\xd2\xb9\x25\xb6\xb2\x02\x6d\x27\x8a\xd1\x79\
+\xe9\x73\x29\x40\xb5\xae\x80\x9c\x4b\x08\xc2\xce\x6b\x5d\x18\x45\
+\xad\x66\x68\x4d\x1b\x6e\xb4\xa2\xa7\xb1\x9d\x82\xe4\x91\x6d\x69\
+\x21\x59\x2f\x8e\x8a\x31\xe1\x17\x84\x6f\x7e\x98\xcf\x67\x54\xd3\
+\xd2\x16\x7b\x87\xe3\x60\x4b\x2f\x80\x35\x27\x4a\x0a\xf0\x5a\x95\
+\x47\x32\x13\xe7\x43\x5b\x68\x83\x87\x07\x07\xf3\xcd\x16\x38\x9a\
+\x3a\xc0\xd0\xee\x35\x9e\x5c\xa4\xc3\x30\xf2\xe6\x92\x6c\x61\x53\
+\xec\x02\x3e\xe3\xde\x53\x70\x2c\xf5\x80\x26\xf9\xd1\xa9\x02\xd8\
+\x73\xd7\x0c\x03\x88\xc8\x21\xe9\xc7\x43\x10\x9d\x6b\x43\x4f\x49\
+\x03\x5c\x96\x2e\x1a\x73\x46\xdd\x9e\xb1\xd8\x84\x11\x64\x74\x68\
+\xa6\xb0\x2e\x6e\x21\x9f\x79\xcf\x01\x25\x0d\x91\x5b\xc1\xc1\x99\
+\x55\x08\x7b\xde\x5a\x29\x60\xcc\x8a\xcb\xe4\x48\x72\x18\xb6\x7d\
+\x7b\x0d\x5c\x8f\x03\x32\x8e\xd1\x74\x64\x2c\x1d\xf1\x2c\x10\xc5\
+\x23\xf8\xb4\xb0\x2a\x2e\x94\xd7\x09\x4f\x06\xf2\x46\x93\x4c\x2e\
+\x14\xa3\x2b\x6f\x18\x0f\xc6\xad\xbc\x44\x46\x6b\x54\x78\xdc\xdc\
+\x69\x60\xe5\xcc\x3c\xf3\xd9\xe5\x06\xbc\x44\x3c\x29\x20\x22\x36\
+\x84\x3f\x5b\xf1\x84\x86\x48\xd6\x1f\x22\x9c\x1f\x01\xe0\x1d\x71\
+\x91\xb8\xdd\x6e\xa3\xf5\xdc\x67\xaf\x7c\xe8\x7b\x86\x64\x08\xab\
+\xf7\x87\xf1\x67\xca\x28\x80\x1e\x7f\xf4\x03\xd0\x15\xa1\x2b\x77\
+\xb5\x14\x30\x36\x3c\xdb\x6e\xbd\xb8\xe2\xb5\xfe\xb6\x78\x2d\xd5\
+\x09\xae\x67\x2e\x5e\xd4\x3d\xa0\x51\x9c\x78\x2c\xba\xae\x44\xf6\
+\xdf\xfe\x0f\x27\x58\x56\x37\xf1\x3f\xaf\x13\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x16\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xdd\x49\x44\x41\x54\x78\xda\x85\x56\x5b\x6c\x14\x55\
+\x18\xfe\xce\xdc\x76\x67\xf6\x46\xbb\xb5\x95\x4b\x5b\x6a\x81\xb4\
+\x60\xa4\xad\x08\x14\xa2\x68\x4b\x4a\x34\xfa\xa0\x26\x58\x4d\x34\
+\x46\x63\x50\xb7\x68\x4c\x4c\x34\xbe\x9a\x98\xa8\xf1\xa9\x5d\x02\
+\x26\x3e\xa8\x89\x54\x12\xd4\x44\x7c\xa0\x01\x8c\x60\x41\x41\x5b\
+\x68\x14\xe8\x25\x5d\x7a\x83\xa5\xa5\x85\xed\x5e\x66\x76\xe7\x72\
+\xfc\x67\xcb\xd6\x96\x8b\x9e\xcd\x4c\x26\xe7\xf2\x7f\xe7\xfb\xfe\
+\xef\xfc\x67\x19\xfe\xa3\xa5\xb4\x50\x93\x63\xdb\x3b\x0d\xd3\x6e\
+\x31\x1c\xab\x0a\x92\x92\xef\xcf\x59\x59\x28\x82\x18\x0b\x49\x4a\
+\x97\x22\x09\x07\xd4\x4c\xe2\xd8\xdd\x62\xb0\x3b\x75\x26\xb5\x50\
+\xbd\x65\x5a\xdd\x59\x51\x56\x9d\xea\x4a\xf8\xb6\x6f\x81\xb7\xa6\
+\x02\x70\x6c\x38\x34\xce\x99\x80\x4c\x7f\x0c\x23\x87\xbb\x81\xe1\
+\x11\x94\x39\x8e\x5e\xac\x28\x5b\xb5\x4c\xa2\xf7\x7f\x01\x12\x6a\
+\xb0\x23\x67\xd9\x11\xf1\xa1\x0d\x28\x7a\x67\x27\xe0\xf7\xd3\x96\
+\x0d\xa2\x93\x5e\x3c\xd1\xef\x03\x3c\x5e\x60\x36\x8d\x9e\x4f\xbf\
+\x44\xf6\x4c\x2f\x6a\xbc\xde\x68\xb1\x31\xdb\x76\x57\x80\xeb\x9e\
+\x60\xa7\x23\x8b\xcf\x05\xdf\x7d\x05\xd2\xa6\x75\xc0\xe5\x09\x38\
+\xd7\xae\x82\x91\x24\x10\x45\x40\xb8\x39\xdd\xe1\x80\x6d\x83\x4b\
+\x1e\x08\x25\x65\xc0\xb2\xe5\x98\xfe\xf5\x1c\x4e\x7f\xfc\x39\x36\
+\x4b\xd2\xb7\xc5\x46\xb2\xf5\x36\x80\x6b\xde\x60\x87\x28\x89\x91\
+\xc0\x7b\x6f\x40\xac\x0e\xc3\x1e\xba\x40\x81\x48\x90\x9c\x09\xe3\
+\x44\x3f\xcc\xfe\x31\xf0\xac\x79\xca\x0d\xce\x3c\x72\xa3\xbc\xae\
+\x02\xea\x63\xf7\x03\xb2\x04\x4e\xf3\xc4\xea\xb5\x98\x19\x98\xc0\
+\xaf\x1f\x46\xf1\xa8\xec\x89\x86\x8c\x44\xdb\x3c\x40\x5c\x0d\xd6\
+\xcb\x96\xd3\x13\x7a\xff\x75\x88\x2b\x43\xb0\x07\x07\xe6\x76\x4c\
+\x0f\x4f\xa4\x30\xd3\x7e\x28\x57\xe6\xa4\x3d\x0b\xd9\x4e\x8a\xbe\
+\x16\x2e\x08\x1f\x69\x9b\x6b\x1e\xf4\x3d\xde\x00\x27\xa5\x43\x5c\
+\xbd\x06\x13\xbd\x23\x88\xb5\x7f\x85\x5a\xaf\xa7\xa1\x44\x9f\xed\
+\xcd\x03\x4c\xc8\x5a\xa6\x64\xf3\x46\x55\x79\xb9\x19\xf6\x05\xda\
+\xb9\x28\xcd\xc9\xc1\x1c\xf0\xf1\x31\x98\x43\xe3\x98\xe9\x99\x1a\
+\x5b\x61\x24\x2a\x6e\xcd\xd9\x98\xa8\x45\xb4\x8a\xb2\x8e\xa2\x97\
+\xb7\x83\xa7\x33\x10\x6a\x6a\x71\xac\xfd\x3b\x54\xf6\x5d\xd4\x57\
+\xd9\x19\x8d\x5d\xf2\x06\x9a\xfc\x4c\x3e\x1a\xfe\xec\x2d\xd8\xb1\
+\x0b\x60\x02\x05\x97\x04\xc0\xe2\xb0\xfa\xce\x92\x2c\x59\x30\x49\
+\x84\x99\xb4\x31\xdd\x7b\x75\xac\xd2\x98\xbd\x0d\xe4\x92\xa4\x45\
+\x96\x6c\xac\xe9\x08\x3c\x46\x79\xcb\xe5\xc0\x57\xd6\xe2\xc8\xdb\
+\x9f\x60\x9d\x24\x36\xb3\x41\x59\xdb\xbb\xbc\x6e\xfd\x2e\xcf\x8e\
+\x5a\x70\x5d\x07\x4c\x07\xd3\x87\xce\x20\xbc\xa1\x0c\x56\x7c\x8a\
+\x98\x08\x73\xc9\x22\x46\x56\xca\x42\xbc\x6f\x6a\xac\xfa\x0e\x20\
+\x31\x25\xf0\x47\xf9\x9b\x4f\x3e\x08\x57\x59\x4d\xc3\x89\x83\xa7\
+\x51\x3e\x34\xbc\x8f\x0d\x0a\xea\x70\xf5\x8b\x4f\x55\x39\x61\x01\
+\x4c\x14\x90\xf8\xe5\x3c\xe2\x67\xfa\xa3\xc1\x12\x2d\x52\x76\x7f\
+\x98\xac\x4f\x32\xf1\xb9\x6c\xb9\x20\x99\x49\x03\xf1\x81\xeb\x67\
+\x6b\xad\x54\xfd\x42\x80\x8b\x92\xd6\x52\xda\xb0\xe6\x70\x68\xdb\
+\x5a\x30\x5a\x33\x7a\x39\x8d\x1b\x07\xba\x62\x6c\x80\x79\x79\x75\
+\xe4\x69\x3a\x40\x26\x04\x72\xc4\xf0\x57\xc7\xb0\x7a\x7a\x92\xf5\
+\xc9\x81\xf6\x92\x32\xad\xad\x78\x65\x00\x8e\xe5\xcc\x07\x12\x44\
+\x86\xd4\x55\x1d\x13\x97\x92\x9d\xeb\xad\xe4\xf3\x0b\x41\x06\xc3\
+\xa5\xfc\xbe\x97\x9a\xc0\x4d\x1b\x69\x13\x38\xb7\xef\x07\xb0\x7e\
+\x4f\x80\xaf\x7a\xfd\x09\x38\x59\x0b\xa2\x47\xc1\xc5\xaf\x8f\x9c\
+\x5a\x3b\x33\xb5\xc5\x5d\xd0\x23\xf9\xf6\x97\x57\x04\x5b\x03\xa5\
+\x1e\x72\x2c\xd1\xb8\xc9\x44\x20\x26\xa9\xc9\x2c\x46\x47\x93\x9d\
+\x0d\x56\x6a\x1e\xe4\x7c\xf1\x3d\x27\x6b\x5e\xdc\xde\x68\x67\x73\
+\x90\x3c\x32\x8e\x47\x7f\x04\xeb\x21\x80\xba\xd7\x1e\x87\x45\xbb\
+\x64\xb1\x41\x9c\x3f\x3e\x74\x6a\xbd\x9e\xde\x52\x58\xf4\xbb\xa4\
+\xed\xaf\x58\x11\x6c\x5d\x52\xa2\x90\x5c\x7c\x11\x93\xd9\xa9\x1c\
+\x2e\x5d\x4e\x76\x6e\x32\xd3\x79\x90\x73\xaa\xef\xe4\xda\x47\x56\
+\x35\xf2\xaa\xd5\x90\xc8\x28\xbf\xef\x21\x80\x6e\x28\x7c\xcb\xee\
+\x67\x91\x3d\xdb\x0b\x7e\x23\x81\xc1\x91\x0c\x1e\x98\x4d\x2c\x3a\
+\xe1\x27\x25\x75\x7f\xd5\xb2\x40\xeb\x92\x22\x02\xe1\x8b\x99\xc4\
+\xaf\xe8\x88\xcf\xe8\x1d\x8d\x66\x66\x77\x5f\x30\xc4\x57\x57\x6a\
+\x60\x4b\x42\xf0\xd4\xd5\xe3\x64\xfb\x41\xb0\x9f\x45\x75\x78\xe3\
+\xfa\x15\x55\x2c\x99\xa4\x24\x8b\x98\xba\x61\x20\x36\xa3\xef\xd8\
+\x96\xcb\x74\x2d\x04\xf9\x45\xd2\x7a\x6b\x96\xfa\xeb\x82\x3e\x79\
+\x0e\xe4\x66\x93\x88\xc9\xd0\x44\x0a\xf1\x74\x2e\xba\x2a\xac\x45\
+\x4a\x8b\xbc\xe0\x6e\x19\x09\x04\x70\xfa\xdc\x78\x8c\x1d\x53\xd4\
+\xbd\x6b\x8a\xd5\x5d\xe1\x00\x0d\xb8\x0b\xc9\x95\xbf\xc5\x12\x7f\
+\x36\x99\x99\x0d\xb7\x5a\xf1\x67\x59\x1b\xad\x5f\xee\x2f\xf7\x90\
+\x19\x0a\x20\x8c\x98\x88\xc4\x64\x28\x9e\x46\x65\xa9\x06\x81\xbb\
+\x7d\x0c\xd3\x49\x03\x03\x33\xfa\x3e\x76\x58\xd6\x9a\x42\x92\x70\
+\xb4\x6e\xa9\x1f\x16\x25\x52\xa0\xc1\x2b\xb3\x59\xf4\x27\x8c\xb6\
+\x27\x2c\x3d\x7a\x2b\x48\x97\xa2\x8d\x3e\x54\xe6\x2b\xf7\x90\xc6\
+\x4e\x81\x88\x2b\x17\xbd\xb8\xfb\xe3\xee\x39\x65\x38\x7b\x25\x85\
+\x84\xe5\x34\xe7\xb5\xfe\x5e\xf6\x66\xb6\x16\xf9\x54\xbf\x22\xe4\
+\x27\xb8\x3b\xfa\xeb\xba\x81\x51\x23\xdb\xf6\x8c\x95\xbd\x0d\xe4\
+\x27\x59\x1d\x6d\x0c\xfb\xca\xbd\x12\xfb\x17\xa4\x90\x7c\x8a\x98\
+\xca\x39\xe8\xbe\x9e\xd6\x9f\x36\x0d\xad\x00\x50\x2f\x93\x2b\x9b\
+\x4b\xfc\x74\x1e\xe6\xf2\x2b\x11\x93\x58\x2a\x8b\xbf\x75\xe3\x4f\
+\xd3\xe1\x1f\xb4\xda\xb9\x45\x39\xe9\x94\x94\x6c\x4b\x71\x50\xf1\
+\x08\x0c\xf3\x44\xf2\x4c\x38\x8e\x5e\x4b\xd1\xa9\x42\x03\x01\xf4\
+\xce\xbb\xe5\x1b\x41\xe9\xb8\x57\x16\x23\x0f\x07\x7c\xc8\xdd\xd4\
+\xd7\x95\xcb\xa5\x1d\xd3\x4d\x8c\x9b\x54\xb6\xb9\x73\xca\xed\x57\
+\x99\xd0\xb8\x4c\x96\x51\xe1\x95\xa8\x32\xb0\x82\xa9\xa0\xd0\xfc\
+\x13\xc9\x34\xe2\xa6\x1d\x7d\xc1\xc9\xfd\x5b\xae\x0b\xed\x0b\x26\
+\x77\x56\xd2\x85\xb3\xd5\xa7\xe5\x99\xb8\x89\x64\x98\x4b\x9a\xb0\
+\x60\xb2\x1b\x30\x7f\x75\x72\x9e\xff\x16\xf2\xe3\x1c\xdd\x54\x4d\
+\x47\x4c\xfb\xdb\x57\xb9\x79\xfb\x85\x53\x68\xfb\x98\xd4\xe1\x65\
+\x2c\xd2\xac\x6a\x28\x25\xdb\x52\x51\xa5\x60\x1c\xb7\x48\x9d\x5f\
+\xe8\x26\x96\xd2\x80\x49\xb2\xe5\x51\x3d\x43\x0c\x79\x74\x17\xb7\
+\xee\x7e\x65\x16\xda\x1e\x26\xd4\xe7\x68\x43\x2b\x04\x49\x5d\x47\
+\x52\x2c\x95\x24\xf8\x98\x80\x05\xa6\x41\x9a\x3b\xb8\x62\x59\xf8\
+\x9b\xa4\x1b\x77\x2c\x5d\x61\xd8\xfa\x26\x77\xfe\xff\xd2\x5f\xd8\
+\xda\x21\x34\xd9\xc0\x4e\x92\xa3\x85\x9e\xaa\x10\xe6\x4a\x77\x82\
+\x38\xd1\x57\x8c\x9e\x2e\xaa\xce\x07\x76\xc3\xb9\xeb\xdf\x96\x7f\
+\x00\x4e\x90\x89\xf8\xea\xce\x85\xa5\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x05\x5d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x24\x49\x44\x41\x54\x78\xda\xbd\x55\x7b\x50\x54\x65\
+\x14\xff\x7d\x77\x77\xb9\xec\x5e\x9e\xba\x28\x20\x28\x06\x2a\x0a\
+\x2b\x9a\x60\x81\xe3\x0b\x45\x46\x45\x0a\x53\xca\xac\x19\x2b\x2d\
+\xab\x3f\x72\x70\x26\x66\x9a\xf0\x39\x95\x96\x96\x33\xd9\x58\xca\
+\x44\x4d\xa5\x65\x13\x36\x4a\x96\x69\x88\xa4\x62\xa0\xab\x29\x68\
+\x0a\xa2\xa2\x68\x12\x4f\xe1\x2e\xec\xe3\xde\xaf\x73\xef\xae\xab\
+\xf4\x67\x8d\xdd\xb9\xb3\x73\xcf\xd9\xf3\x9d\xdf\x39\xbf\xf3\xf8\
+\x18\x1e\xf0\xc3\x1e\x38\x40\x41\xe5\x9f\x5c\xfb\x50\x55\xee\x57\
+\xf2\x7f\x81\xfc\xcf\x33\x82\xe0\x95\xd8\x6b\x87\x6e\xf2\x2d\x33\
+\xa2\xe0\xf0\x90\xd2\xf7\xa7\x68\x04\x3c\x0a\xa0\xf8\x30\x4d\x64\
+\xab\xe2\x9e\x6c\x60\x5e\x5b\xf7\x7d\xb2\xd1\x00\x38\x3d\x5e\x59\
+\xb3\xb5\x90\x8f\x15\xbf\xdc\x02\x5b\xbe\xbf\x89\x6f\x9b\x1d\x8b\
+\xa2\xda\x6e\x88\x64\xa9\x25\x32\x31\xd4\x84\x9a\x2e\xb7\x3f\xb2\
+\x11\x64\xdd\xe0\xf0\xf4\x8b\x38\x81\x74\xf5\xa4\xbb\x1b\x75\x1a\
+\x9d\xa9\xa6\x33\x5a\xe0\x4e\x8a\x64\x7d\x72\x30\x5e\xfe\xf1\x3a\
+\xd8\xb2\x7d\x57\xf9\xf6\x9c\x61\x58\x55\xdb\x03\x33\x01\x28\x3a\
+\x80\x01\x27\xbb\x14\x7f\x34\x23\x25\x01\x0d\xb2\xda\x1f\x80\x74\
+\x97\x48\x77\x37\xeb\x54\x3a\x53\x4d\x67\xb4\x6c\x7a\xc9\xc9\xba\
+\xe4\x20\xbc\x58\x76\x0d\x6c\x69\x69\x03\xdf\x91\x17\x8f\xc2\x33\
+\x5d\x08\xf4\x01\x4c\x1a\x60\x42\x55\xfb\xbd\x0c\x46\x49\x46\x72\
+\xd6\x3f\x83\x91\xa4\xbb\x28\xdf\xcb\x20\x9d\xce\x1c\xa3\x33\xc4\
+\x14\x64\x72\xb2\x69\x7c\x28\x96\xed\xb9\x0c\xb6\x64\xf7\x25\x5e\
+\xb2\x70\x04\x4a\xaf\x38\x88\x22\xe8\x14\x49\x04\xe4\xa4\x8f\xbb\
+\x9c\x07\x68\xc0\xf7\xc9\x5a\x94\x06\xe2\xc2\xe5\x53\x68\xb2\x48\
+\x72\x0f\xc9\x1e\xb2\xcb\x88\x10\x11\x19\x64\xc4\x73\xdf\xd6\x83\
+\x3d\xb3\xf3\x02\xff\x62\x51\x22\x8a\xec\x9d\x30\x1b\xb5\x0c\x38\
+\xc6\x86\x98\x50\x7b\xc7\xe3\xcf\x60\x98\xd9\x80\xa6\x5e\xa5\x5f\
+\x06\xd1\x81\x06\x34\x52\x06\x46\x1f\x47\x29\x5a\xdd\x3a\x5c\x98\
+\x1b\x65\x46\x46\xa4\x48\xed\xc3\xf0\xec\xae\x3f\xc0\x16\x7d\x59\
+\xc7\x77\x2e\x1e\x83\xe7\x2b\xff\xa2\xca\x0b\x3a\x40\xe6\x60\x33\
+\x2a\x5a\xfa\xbc\x00\x24\x27\x85\x9b\x70\xbe\xb3\x3f\x45\x0b\x62\
+\xcd\x48\x8d\x08\xc0\xe7\x97\x65\x5c\x95\x15\x3d\xa8\x20\x6a\xb7\
+\xf9\xf1\x41\xc8\xdf\xdb\x84\xdd\xb9\x43\xf1\xf4\x57\xe7\xc1\x9e\
+\x2c\x39\xcb\xbf\x5e\x62\xc3\xa2\x83\x2d\x90\x08\xc0\x43\x0e\xb3\
+\x62\x02\x51\xde\xec\xf4\x03\xd8\xac\x94\x51\x9b\x17\x40\xe5\x5e\
+\x5a\x4a\x32\x23\xd0\xda\xdd\x07\x6b\x70\x20\xea\xdb\x9d\x44\x21\
+\x90\x68\x15\xa9\x73\xae\xe1\xb6\x20\xa2\x34\x3b\x12\x4f\x7d\x76\
+\x0e\x6c\xe1\x8e\x33\x7c\xf7\xd2\x14\xac\xad\x69\x25\x8a\x04\x9d\
+\xe7\x58\xc9\x80\x16\x87\x0a\x97\x46\x10\xbd\x83\x89\x8e\x1e\x0f\
+\x87\xec\x51\x75\xca\x56\xda\xc2\xd0\xd8\xd2\x8d\xd5\x27\xda\x11\
+\x61\x54\xb0\x21\x2b\x16\x41\x16\x11\xc5\x35\x37\xd1\xcc\x45\x7d\
+\x48\x56\xa7\x0e\x44\x7e\xf1\xef\x60\xf3\xb7\x9d\xe4\xdf\x2d\x9f\
+\x80\xc2\xe3\xad\x08\xa4\x1a\xc8\x34\x3d\x05\x63\x43\xf4\x02\x7e\
+\x58\x7b\x07\x16\x93\x80\x21\xd4\x92\x5d\x2e\x95\x40\x39\xd6\xa4\
+\x86\x83\x7b\xdc\x78\xe5\x40\x33\x46\xc6\x0d\x40\xaf\xcb\x83\x43\
+\x27\x6f\x43\x62\x0a\x26\x8e\x8f\x86\x14\x20\xc0\x41\x3e\x36\x66\
+\x58\xf1\xc4\xc7\xa7\xc0\x1e\xdb\x5a\xcd\xbf\x7f\x35\x0d\x53\xbe\
+\x69\xd2\x7b\xbe\x78\x46\x04\xac\x26\x0e\x6b\xa8\x05\x37\x3a\x5d\
+\x78\xe1\x70\x0b\x6c\x83\x44\x34\x76\xb8\xf1\x52\x52\x30\xb2\x87\
+\x07\x23\xf7\xd3\x3a\xd8\x92\x06\xc3\xde\xdc\xe7\x5f\x09\xb9\x23\
+\x2c\xd8\x73\x51\xd6\x3b\xaa\xc7\xad\xe2\x48\xfe\x50\x3c\xfe\x51\
+\x0d\x58\xce\x07\xc7\xf9\xbe\x15\xe9\x48\x2c\x69\x44\xe9\xbc\x48\
+\x8c\xb1\x5a\x90\xb5\xf5\x14\x3a\x3b\x1c\xa8\x28\x48\x83\x51\x0c\
+\xc0\xf6\xba\x76\x44\xd1\xfe\x58\x90\x18\x86\xbc\x4f\xec\x60\x51\
+\x11\x88\x0b\x17\x61\xbf\x45\x00\xcc\x0b\x30\x37\xde\x82\xbd\xf5\
+\x32\x75\x15\x43\x37\x65\x5b\xbd\x78\x18\xe6\x6d\xa9\x02\x9b\xbb\
+\xe9\x28\x2f\x5b\x39\x09\x55\x37\x64\xa4\xc7\x48\xc8\x23\xde\x32\
+\x26\xc4\xe2\x5c\x9b\x0b\x97\x4e\x37\xe1\xdd\x39\x31\x98\x92\x14\
+\xad\x3b\x29\xdc\x75\x06\x76\x43\x38\xa2\xc3\x4c\x18\x44\xad\x7b\
+\xa1\xd5\xe9\x1f\xb4\xa9\xb1\x16\x94\x37\x39\xf4\xb6\xed\x21\x80\
+\xf2\xfc\x38\xe4\x6c\x3e\x06\x36\x7b\x43\x25\xdf\x5f\x38\x59\x37\
+\x9a\xfe\x4e\x25\xd2\x33\x47\x63\x20\xd5\xa2\x87\x0a\xaa\x50\x34\
+\x07\x8f\x5f\x47\x5a\x38\xc7\x20\x8b\x01\x3f\x34\xab\x98\xf9\x68\
+\x0c\x4c\x64\xab\x4d\x7d\x17\x51\xa1\x25\x60\xa2\x9f\x20\xf2\xdc\
+\xe6\xf2\xae\x0a\x99\xf4\xef\x4f\x8e\xc2\x9c\x8d\xbf\x82\xcd\x7a\
+\xeb\x30\x3f\xf0\xc6\x34\x8c\x2a\xd8\x0f\xd7\xf0\x87\xa8\x4b\x18\
+\xf2\xc6\x85\xe0\x28\x4d\x76\x7b\xb7\x47\xe7\x58\xa8\x6f\xf0\xb6\
+\x68\x42\x82\x7f\xad\x8f\x8b\x33\xc3\x7e\xa5\x17\xbe\x12\x20\x37\
+\x25\x04\x7b\x4e\x77\xd1\x56\x65\xb8\xe3\xa4\x86\x28\x18\x8d\xec\
+\xb7\x2b\xc0\xa6\xaf\x39\xc8\xcb\x57\xcf\x44\xe8\x7b\x75\x08\x13\
+\x69\x0e\xa8\x7b\x72\x68\x8f\x9c\xb8\x22\xa3\x83\xa6\x59\x6b\xfb\
+\x94\x78\x09\xe7\x1a\x65\xff\x64\x6b\x8f\x6d\xb8\x84\xb3\xa4\xf3\
+\x95\x00\xb3\x53\x42\x51\x46\x00\x26\x02\xe8\xec\x53\xd0\xf9\x7a\
+\x32\x32\xd7\x1e\x02\x9b\x5a\x74\x80\x57\xac\x9b\x05\x56\x64\x87\
+\x44\xcb\x48\x07\x78\x64\x20\xaa\x1a\xba\xa9\xd0\x6e\x1d\xc0\x96\
+\x20\xa1\xf6\xb2\xdc\x6f\x92\x93\x35\xd0\x86\xfb\x00\xd2\x06\xa0\
+\xec\xb7\x36\x3d\x03\xd9\xa9\x80\xaf\x7f\x18\xd3\x56\xfd\x0c\x36\
+\xe5\xcd\x9f\xf8\x91\xf5\xd9\x68\x76\xb8\x60\x12\xbc\xf7\x41\x38\
+\x01\xc9\x34\x58\x6e\x55\xd5\x43\x96\x8c\x46\xb8\xb8\xea\x95\xb5\
+\x0b\x48\x10\x10\xc0\x04\xb2\xf1\xe8\xd7\x98\x26\x4b\x54\xb7\x0e\
+\x72\xac\x51\xe6\x26\x27\x43\x2c\x01\xa0\xe0\xbd\x00\x8a\xaa\x40\
+\xa5\x59\x67\xbe\x9e\xe0\x3e\x22\xfe\x8b\x2c\x18\x04\xda\xb8\x86\
+\xff\xe1\xd2\x7f\xd0\x00\x7f\x03\xd5\xb2\x3b\xdd\x23\x6d\xbe\xda\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x37\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xfe\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x4c\x14\x57\
+\x14\xfe\x66\x5f\xb0\x3c\x16\x8c\x20\x54\x51\x79\x69\x7d\xf0\x92\
+\xa5\xe2\xa3\x5a\x4c\x41\xeb\xab\xa2\x86\x58\x5c\x6d\xec\x4b\x63\
+\x8a\xb5\xad\x5a\x6c\x7d\x92\x6a\xdb\x60\x52\x54\x48\x1b\x4d\x1a\
+\xd4\x46\xac\x12\x4d\xb5\x89\x3f\x84\xaa\x55\x8b\x2f\x40\x45\x41\
+\x8b\x08\xb2\xe2\x1b\x05\x76\xd9\x85\x9d\xd9\x99\xdb\x33\x33\xec\
+\x12\x63\xa9\x37\x7b\x77\x66\xef\xdc\xf3\x7d\xe7\x7c\xf7\x9c\x33\
+\xcb\xe1\x7f\x46\xb2\x39\x35\x5d\x10\xc4\x2c\x53\x50\x70\xc6\xb0\
+\x98\xd0\xa8\xf0\x70\x5f\x70\x1c\x60\xb5\xda\x71\xd7\xda\xd1\x64\
+\xb7\xb5\x97\xe9\x74\x9a\xd2\xea\xaa\x8b\xe5\x7d\x61\x70\xff\xb5\
+\x68\x4e\x49\x35\x4b\x92\xf6\xd4\xbc\xb9\xc9\x81\xef\x2f\x32\x13\
+\xa8\x16\x4f\x9f\x38\xf0\xe0\xb1\x03\x60\x0c\x83\x88\x28\x24\xd4\
+\x17\x9d\x0e\x27\x8e\xfc\x7e\x13\x87\x8f\xdc\xb0\x6b\x34\xee\x29\
+\x55\x95\x17\xaa\x5e\x49\x10\x1f\x6f\x2e\x9c\x92\x16\x97\xb3\x6e\
+\xed\x34\xf2\xb4\x0d\xfb\x4b\x1b\xd0\xe5\x70\x83\xd3\xf4\x6e\x26\
+\x0e\xb8\xdd\x0c\x01\xfe\x3a\xbc\x3b\x3b\x14\xf1\xa3\x03\xb0\x21\
+\xaf\x02\x15\x15\x8d\x45\x35\x35\x97\x57\xf4\x49\x90\x94\x94\x5a\
+\xb2\xfa\xcb\xe9\xd9\x16\x8b\x19\xcc\x2d\x22\x77\xe3\x19\x38\x3a\
+\xdd\x20\x19\x54\x54\x1a\x92\xe4\x21\x61\x74\x2f\xc2\xe9\x94\xb0\
+\xec\x93\x01\x18\x3f\x31\x18\xc5\xc5\x77\xb0\xb3\xb0\xea\xc0\xd5\
+\x2b\xe7\x17\xbe\x44\x10\x17\x9f\x5c\x98\xbb\x66\x56\xce\xa2\xc5\
+\xe3\x20\xf2\x5d\xd0\x6a\x19\xea\x6e\x3e\xc2\xf6\xa2\x7f\xe0\x6b\
+\xd0\x28\xda\xcb\xe0\xac\x87\x88\x7e\x41\x14\x25\x04\x04\x68\xb1\
+\x6d\x5b\x04\x84\x6e\x1e\x7a\x5f\xa0\xf8\x97\x16\x14\xec\xa8\x2e\
+\xba\x7e\x5d\x8d\x44\x21\x18\x33\x26\xc5\x3c\x61\xdc\xa8\xca\xa2\
+\xc2\x79\x64\x24\x10\x88\x9b\xa6\x44\x06\x0c\x45\x85\xb5\xa8\xad\
+\x73\x50\x14\x5c\x0f\xb8\xd4\x13\x09\xa3\x33\x60\xc8\xff\xae\x3f\
+\x42\xfa\x6b\xe8\x37\xc9\xc8\xb9\xa1\xd7\x53\x44\xcb\xef\xe0\x72\
+\x55\x4b\xca\x95\x2b\x97\xaa\x14\x82\x84\xc4\x54\xdb\xa9\xb2\x9c\
+\xc0\xe0\x7e\x3a\x88\x24\x0d\x20\x4f\x37\x34\x1a\x86\xd6\xa7\x1d\
+\x58\xbb\xbe\x11\x7e\x7e\x5a\x02\x90\xbc\x11\xb8\x5c\x0c\x63\xdf\
+\xd0\x61\xe9\xc7\x81\xe0\x5d\x82\xb2\x1f\xe0\x29\x72\x37\xda\x9e\
+\x6b\xf0\xf6\xf4\x6b\xf6\x9a\x6b\x7f\x9b\xb8\x84\x44\x73\xfa\xec\
+\x99\x09\x65\x5b\xb6\x4e\xa5\x30\x5d\x5e\x70\xd5\x53\xf2\xc8\x47\
+\xc2\xa1\x43\x0f\xf0\xe7\xc9\x4e\x8a\x42\x95\x49\x14\x19\x34\x24\
+\x61\x41\xbe\x3f\xad\xb9\x95\x88\x01\x0f\x89\x00\x83\x51\xc0\xfa\
+\x6f\x78\xfc\x71\xbc\x39\x83\x1b\x31\x32\x71\xd7\xe1\x83\x1f\x2c\
+\x1d\x31\x22\x88\x0c\xf9\x9e\x4d\x64\x24\x13\x30\x35\x6c\x41\xe0\
+\xb1\x6a\xcd\x63\xb8\x04\x8e\x34\x65\x70\x8b\x22\x96\x2c\xd2\x21\
+\xed\x2d\x82\x13\x7a\x81\x3d\x24\x5a\x2d\x8f\xfa\xdb\x81\x78\xcf\
+\x72\x67\x37\x17\x13\x9b\xd8\x58\x5f\x3b\x39\x4a\x94\xc2\xc9\xd4\
+\x5f\xce\x0f\xfa\x78\x36\xab\x24\x3a\x9d\x88\x8b\x97\x9d\x88\x8d\
+\xbe\xaa\xc8\xd3\xd0\x98\x44\x59\x63\x07\xef\x7c\xd1\x73\xf5\xaa\
+\x2a\x60\xd0\xb7\x22\x2e\xd9\xb7\x89\x9b\xfc\xe6\x58\xf6\xd7\xd9\
+\x04\xc2\xea\xee\xd9\x60\x52\xa7\x14\xa4\x18\x31\xa6\x46\x65\xb7\
+\x0b\xd8\x51\xe8\x52\x84\x5b\xbd\x92\x87\x7f\x40\xb7\x92\x08\x1c\
+\x47\xc0\x14\x25\x34\x32\xc1\x13\xb2\x7b\x4a\x66\x36\x40\x2b\x60\
+\x52\x5a\x0c\xb8\xc5\x96\xf1\x2c\x77\x4d\x28\xbe\xfa\xba\x15\xe1\
+\x61\x9c\x92\x7a\x51\x91\x0c\x91\x91\x12\x24\x16\x80\x20\x93\x11\
+\x93\x27\x32\x6c\xf9\xde\x1f\xd6\x16\x1d\xc5\x27\x62\xd0\x40\x09\
+\x9b\xd6\x3f\xc7\xe9\x93\x5d\x68\x6b\x27\x60\x66\x23\x49\x1c\x68\
+\xb8\x4d\xcf\x39\x86\x87\x0f\xb5\xf8\x79\xab\x0d\x3b\x8b\x07\x10\
+\xc1\xc2\x54\x36\x6b\x46\x20\xf2\xbe\xeb\x80\x8f\x2f\x29\x4c\xe9\
+\x27\x1f\xa2\x9c\x86\xf2\x14\xdc\x12\xce\x9f\x1e\x88\x0f\x97\x36\
+\xe3\x56\xbd\xaa\x60\x6c\xb4\x0b\x87\x76\x3d\xc3\xa8\x49\xe1\xa4\
+\xb7\x24\x2f\x29\x67\xc3\x71\x4c\x29\xc8\x2e\xca\xb0\xbc\x65\x36\
+\x54\xd4\xf5\x03\x37\x73\x46\x32\xdb\xbe\xcd\x84\x39\x59\x0e\x18\
+\x8d\xbd\x55\xaa\x4c\x4a\x19\x99\x84\x5a\x0e\x2e\x9c\x19\x88\x05\
+\x96\x26\x45\x96\x63\x7b\x9e\x20\x2e\xed\x35\x2a\x40\x02\xe7\x24\
+\x85\x54\x92\x24\xaf\x5d\x27\xed\xaf\xde\xdf\x8a\x05\xeb\x86\x82\
+\x1b\x1a\x19\xd7\x78\xf1\x4c\x40\x54\xda\x54\x91\x72\x9d\x79\x37\
+\xc9\x9e\x48\xca\xbd\x44\x79\x0e\x7c\xbb\xd1\x1f\x59\x96\x5a\xc5\
+\xd7\xd2\xfd\xa3\x90\x4b\x12\xe9\xf5\x1e\x47\x98\x92\x75\x4c\xa9\
+\x74\x09\x76\x27\x87\x9a\xbd\xed\x98\xb0\x62\x48\x13\x17\x13\x1d\
+\xbf\xab\x64\x2f\x5b\xba\xfc\x33\x5f\x88\xb4\x91\x83\xea\x89\xd4\
+\x53\xb5\xa2\x5b\x6d\x6c\x95\x67\xef\xc3\xa0\x55\x13\x4b\x20\x0f\
+\xe3\xd3\x42\xa0\xd5\xc8\x7c\x92\xd7\x21\xd5\x0e\xca\x3c\xb6\xa1\
+\x0b\xf3\xf3\xc3\x76\x73\xaf\x0f\x8f\x4b\x4f\x4e\x92\xca\xe6\x66\
+\x4a\xd8\x98\x67\x84\xc1\x47\xf5\x5a\x89\x80\x2e\xb2\x3c\xf9\xeb\
+\x9e\x61\xfe\x3c\x27\x5c\x0e\x19\x8f\xc1\x47\x43\xc5\xf7\x9b\x11\
+\x9f\x17\x98\x60\x34\x48\xde\xf6\x21\x8f\x6e\x3a\xf3\x1f\x48\xee\
+\x13\xf5\x26\x54\x36\x1a\x33\x94\x56\x31\x38\x62\xb4\xed\xf4\x89\
+\xb6\xc0\x39\x59\x21\xde\x03\x93\xbd\xe1\x79\x86\x91\xb1\xdd\x38\
+\x7a\xe0\x29\x5c\x1d\xb4\x55\x60\x4a\x9a\xcb\xb2\x1b\x8c\x12\xa6\
+\x65\x07\xa3\xee\x9e\x0e\x7a\x5d\x4f\xfb\x93\x1f\xd3\xd7\xb9\x4d\
+\x0e\x4c\xda\x1a\x66\xbf\x77\xb7\xd6\xa4\x10\xc4\x46\x8f\x30\x0f\
+\x1d\x2c\x54\xe6\x6f\xe9\x44\xe6\xc2\x70\xea\x90\xa2\x12\x85\xc0\
+\x8b\xb8\x76\xfc\x11\x7c\xa8\x81\x89\x54\xc5\x0a\xb8\x5b\xbd\x6a\
+\xe4\x77\x02\xa5\x7b\x8c\xa5\x9f\x97\xc0\xd6\xcd\xa1\x7c\x65\x27\
+\xd6\x1e\x0b\x44\xd3\x33\x43\x4a\x43\xc3\xad\x2a\x6f\xbb\x1e\x32\
+\x64\x78\xa1\x25\xd3\x99\x33\xff\x1d\x1e\x33\x3f\x0a\x85\x86\xdc\
+\xdc\xb1\xea\x39\xb2\x32\x49\x9a\x2e\xce\x0b\xec\x99\x72\x6d\xe9\
+\x89\xe5\x60\xa9\x11\xcb\x4b\xfc\x14\x39\xcb\x3e\xed\xc4\xd1\x1b\
+\x46\xfc\x5a\xed\x5b\x64\x6d\xaa\xef\x6d\xd7\x9e\x31\x28\x62\x78\
+\x89\x65\x86\x23\x7b\xd5\x12\x07\x7e\xda\x13\x80\xcd\x6b\xdb\x21\
+\xd8\xb5\x6a\xe7\x90\x41\x3d\x7d\x50\xe9\x08\x44\x4a\xeb\x3a\x1f\
+\x60\xdd\x8f\x46\xac\x24\xc7\xb6\x97\xfb\x61\xdf\x55\xe3\x81\xfb\
+\xcd\xf5\x2f\xbf\x70\x3c\x23\x22\x62\x58\x61\x64\x98\x90\xb3\x7f\
+\x73\x07\x86\x0c\xa3\xa6\xd7\x49\xd5\xcd\x73\xf0\x36\x4c\x51\x3e\
+\x0b\x4e\x21\xd3\x29\x27\xc6\xd0\x52\xaf\x43\xf6\x3e\x13\xee\xb6\
+\x69\x8b\x5a\xee\x35\xf4\xfd\xca\xec\x95\x2b\xda\xec\xec\xe6\x4e\
+\x8d\x8d\x71\x05\x7e\x31\xb3\x1b\xe9\x13\x08\x5d\xc7\x14\x60\xf0\
+\x3d\x32\x51\x46\x95\x57\x18\x50\x70\xce\x07\x97\x1e\x18\xec\x7e\
+\x06\x36\xc5\xda\xdc\xf8\xea\x97\xfe\x0b\x44\x83\xa3\xd2\x79\x37\
+\x97\xc5\x0b\xc8\x08\x0b\x92\xa2\x22\x83\x44\x65\xfd\x6e\x87\x16\
+\x8f\x6d\x9a\x26\x83\x9e\x95\x19\x74\x28\xb5\x5a\x9b\xfa\xfc\xdb\
+\xf2\x2f\x59\xa4\x23\xc9\x36\x09\xb8\x0e\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x57\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x1e\x49\x44\x41\x54\x78\xda\xc5\x55\x5b\x6c\x54\x55\
+\x14\x5d\xe7\xde\x79\x74\x66\x4a\x5f\xb6\x62\x29\x58\x5b\x22\x15\
+\x41\x5a\xda\x08\x04\x22\x44\xa5\xf0\x81\x89\x8a\xa8\xed\x0f\x91\
+\x48\x62\x90\x48\xe4\x99\x08\x8d\x1f\x8a\x1f\x9a\xa0\xd1\x2f\xa3\
+\xc6\x20\xc6\xb4\x4a\x54\x30\x04\xa4\x35\xca\xab\x86\x00\x6d\x87\
+\xd0\x96\xb6\xb6\xf2\x1a\xca\xb4\xd3\xe7\x4c\x67\xee\xeb\xdc\x73\
+\xdc\xf7\xb6\x69\x83\x24\x24\x24\x12\xcf\xcc\xc9\xb9\x33\xf7\x9e\
+\xb5\xf6\xde\x67\xed\x75\x19\xee\xf3\x60\xff\x2b\x01\xbf\xf4\xc6\
+\x16\xd8\x7c\x3d\x38\xaf\x80\x6d\x42\x72\x0b\xd2\xb0\x00\xdb\x06\
+\x2c\x5a\x0d\xab\x09\xdc\x3c\xe0\x7b\xf9\xcc\x67\xf7\x44\xc0\x3b\
+\xb7\xd4\x12\x68\x15\x08\x70\x7c\x12\xb8\xc5\x69\x5a\x60\x0e\x89\
+\x65\x12\x01\x1f\x27\x31\xb9\x7b\x8f\x59\xbc\xce\xb7\xb1\xa5\xfa\
+\xae\x04\x56\xf7\xf6\x4a\x08\x51\xcf\x08\xd0\x01\x96\x36\x87\x42\
+\x53\x72\x3e\x41\x64\x40\x9a\x4e\xe4\x0e\xb8\x39\x01\x3e\x45\x22\
+\xb9\x80\x94\x58\x15\x78\xab\xb5\xe1\x0e\x02\xab\x7b\x47\x15\xdd\
+\xad\x65\x04\xc2\x84\x4d\x97\x54\x86\x91\x61\x58\xd7\x6f\x42\x8c\
+\x8e\x01\x63\x06\xa0\x28\x53\xd1\x78\x55\x30\x9f\x0a\x85\x56\xc5\
+\x16\x2e\x89\x2d\x01\x29\xa4\x43\x52\x1d\x7a\xbb\xad\x6e\x92\xc0\
+\xea\xd9\xb5\x10\x10\xcd\x0a\x45\xc9\x20\x61\xf4\xf7\x22\xde\xd4\
+\x05\xb3\x2f\x01\xc6\x04\x98\x43\x06\x9a\xb4\x73\x72\x28\x1e\xda\
+\xad\x42\xa8\x5e\x78\xbd\x0a\xd2\xd3\x69\xf5\x30\x2a\x80\x84\xc3\
+\x47\x38\xe5\xa1\xad\xed\x2d\x6c\xa2\x34\x49\x45\xda\x41\x66\xeb\
+\xb8\x75\x26\x8c\x81\xf3\x57\xa1\x30\x2a\x43\x9a\x17\xd6\xdc\x4a\
+\xd8\xb3\x96\xc0\xca\x5f\x0c\x19\xc8\x72\x23\x12\x94\x89\xbf\xeb\
+\x08\xd8\xf0\xdf\x48\xbb\x50\xeb\x46\x2f\x54\x3f\x72\x72\x82\x34\
+\x7d\x2e\x09\x7d\x53\x19\xdb\xdb\x43\xcc\xea\xd9\xf1\xa2\xca\xec\
+\x9f\x6c\x83\xa1\xe5\xf3\x83\x18\xbd\x31\x88\x82\xa7\x96\xa1\xbf\
+\x62\x3b\x44\xd9\x6a\xaa\xab\x93\x36\x45\x94\x4c\xc0\x8c\xf5\x62\
+\x30\x16\x83\xcc\xc8\x45\xfe\xe3\x8f\xc1\x34\x1d\x32\xc0\x13\xe9\
+\x44\xfe\xd9\xf7\x30\x78\xe2\x30\x42\x19\x99\x28\x99\x93\x09\x46\
+\x41\x50\xb9\xd6\x32\xde\xb3\x2d\x6c\x0e\xf7\x97\x36\x7e\x78\x08\
+\xd3\x1e\x2d\xc6\x82\x9d\x47\x21\xb2\x0a\xd0\x18\x15\x50\x05\x1d\
+\x34\xa3\x68\x07\xae\x63\x4e\x96\x17\xd7\x22\x11\x84\x9b\x9b\x11\
+\x8d\x46\xc0\xf3\x4a\xb0\xa2\x6a\x03\x52\x29\x0d\x1c\x2a\x4a\xbc\
+\x3a\x7c\x5a\x1f\x62\x3f\xbc\x09\xad\xb5\x09\xa5\xf3\xf2\xe0\xf1\
+\xab\x17\x99\xf8\x6b\xb3\x3c\xb5\xb7\x16\xc5\x1b\xf6\x62\xd6\x8a\
+\x4d\x6e\x79\x7b\xe2\x1c\x9d\xa3\x26\x54\x02\x17\xb6\x85\xec\x6b\
+\x4d\x78\xb8\x68\x36\x7e\x6b\x68\xc0\x91\xe3\xbf\x22\xdc\x12\x26\
+\x35\xa5\xf0\xf4\xee\x6f\x30\x7f\xe9\x62\x04\xe8\x7c\x66\xaa\x3a\
+\x4a\x7c\x49\x98\x4a\x10\x89\xd6\x83\x30\x0e\xbd\x8f\xf9\x25\xd9\
+\x60\xed\xfb\x16\xca\xfc\x97\xf6\x23\xab\x70\xc1\xe4\xf9\x9d\x8b\
+\x6a\xe8\x37\x04\x09\xc5\x83\xd6\x0b\xe7\x31\xdc\xf8\x33\xae\x90\
+\x9a\xda\x3b\xda\xd0\xd1\xd5\x0d\x5d\xd7\xdd\xe7\x8a\x2b\x37\x62\
+\xf9\xee\x7d\x48\xa4\xc6\x50\x98\x26\xb1\x79\xe6\x18\x92\x96\x80\
+\x80\x07\xc6\xc8\x0d\xf8\x6a\xab\xc0\x12\xb1\x88\x4c\xcf\x2d\xb8\
+\xad\x39\xce\x44\x34\x9c\x8d\xe9\xb8\xae\x2b\xe8\xa9\x3f\x8e\x9b\
+\x75\x7b\xd0\x3b\x30\x82\x24\x01\xeb\x9a\x46\xca\x52\xa8\xc1\x2d\
+\x14\x3f\xf3\x1a\x2a\x76\xed\x73\xcb\x54\xe0\xe7\xd8\x59\x94\x74\
+\x09\xb8\xa0\x29\x3d\xe0\x7d\xad\x94\xc1\xc7\x4b\xe5\xdc\xad\x8d\
+\xb7\x11\x9c\xb8\x96\xc4\x17\x1d\x09\x04\x48\xe3\xf1\xe1\x24\xea\
+\x5f\x2d\x02\xf7\x07\xa1\x1b\x26\x81\x33\x57\xae\x36\x35\x60\xf9\
+\x9e\x5f\x90\x5b\x56\x8e\xb8\x6e\x60\xdd\x0c\x1b\x6b\xa6\x9b\x48\
+\x99\x36\x9d\x09\x23\x02\x92\xf4\x77\xaf\x80\xc5\x8f\xad\x0e\x5f\
+\x3e\x1d\x2d\x2d\xab\x39\x0d\x5f\x60\x9a\x4b\xd0\x3b\xa2\x63\xe3\
+\xc9\x01\x04\x49\x21\x8a\x2f\x88\xb6\xba\xaf\xd1\xbe\x7f\xe7\x64\
+\x57\x3a\xdd\x90\x53\xfc\x24\xe6\x7d\x74\x0c\x5a\x62\x04\xc3\xba\
+\xc4\x27\xe5\x26\x95\x49\xc0\x50\xd2\x60\x46\x9a\xc1\xeb\x36\x61\
+\x4e\x61\xf6\x45\x66\x9f\xab\x5e\xab\xc5\x06\x7f\xfc\xf3\xab\x3f\
+\x30\xfb\xf5\x1a\x14\xae\x79\x97\x34\x01\x6c\x3b\xd5\x8f\x70\xaf\
+\x46\x07\x4d\x80\x5e\x1f\xc6\xfa\x86\x70\xf5\xc0\x07\xa4\x2a\x86\
+\x69\x8b\x9e\xa7\xb9\x1c\x7a\x22\x0e\xdd\x14\x98\x91\xa3\xe2\xdb\
+\x45\x2a\x86\x46\x07\x91\x3a\xba\x0b\xb2\x2b\x4c\x52\xcd\x83\xea\
+\x51\xd7\xba\x41\xd9\x27\x5f\x48\xe9\x43\x89\xc0\x85\xc3\x17\xdd\
+\xd4\x0a\x56\xae\x43\xee\xca\x1a\x3c\x7b\xc2\x0f\x43\xb3\x1c\xfb\
+\x73\xcb\x22\xa9\x7b\x39\xf9\x81\x49\xde\x64\x18\x36\x4c\x4a\xc5\
+\x52\xfc\x38\xfe\xc8\xef\x50\xbb\x0f\x23\x79\xb6\x01\xfe\x60\x08\
+\xb3\x8b\x32\xe1\xf1\x28\xa9\x07\xf7\x5c\x0e\xb9\x04\x66\xc3\x73\
+\xe5\xe4\x92\x4d\x8e\x3b\xde\x6a\x8d\x22\x7a\x65\xc8\xd1\x01\xb4\
+\xc0\x03\x68\xce\x5c\x82\x9b\x9e\x19\x68\xf6\x97\x62\x54\xa6\x53\
+\x87\xda\x08\xd9\x63\x78\xc2\xba\x84\x05\x66\x1b\x16\x27\x5a\xa8\
+\xa1\xa8\xee\xcc\x87\x8c\x74\x1f\xb2\xb3\x9d\x4e\x26\xcb\x90\xa2\
+\xfc\xa1\x9a\xce\x96\x49\xb3\x33\x0f\x3d\x5b\xc5\x6c\x5e\xcb\xc8\
+\xeb\xad\xa4\x86\x78\x2f\x69\x5a\xe7\x44\x64\x43\xa5\x56\x56\x69\
+\x65\x90\x13\x67\xc0\x60\x33\xe7\x1f\xd5\x5d\x19\xd5\xd1\xe7\x27\
+\xd3\xa3\xdb\x4e\x86\xf4\xa9\x26\xf0\x29\xb3\x9b\x24\xf9\x7e\x59\
+\x25\x65\x51\x0f\x92\x9a\x6b\xd7\x54\x5f\x6e\x91\xaf\x08\xd7\x86\
+\xc9\x9f\x14\x77\x03\x17\xe3\x44\x14\xa5\x6b\x23\x52\xba\xde\xe3\
+\x3e\x43\xbf\x57\x4d\xaf\xe9\xb8\xd3\xae\x6f\x23\xfa\xb2\xac\x96\
+\xde\x5c\x55\x42\x32\xd7\x7e\xdd\xa8\x69\x11\xf6\x14\x90\x93\x87\
+\x73\x2d\x26\x08\xe8\x67\x5d\xde\xee\x8e\xbb\xbf\x70\xfe\x3d\xb4\
+\x4f\xe7\x6d\xa1\xbd\xeb\x09\xa8\xc2\xf5\x79\x37\xea\x71\xb6\x09\
+\xf0\x26\xba\x3e\x90\xfb\x4e\xc7\xbd\xbd\x32\xff\xcb\x71\xdf\x09\
+\xfe\x01\xb9\x4a\xdc\x4b\xf9\x26\xdd\x23\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x63\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x2a\x49\x44\x41\x54\x78\xda\x9d\x56\x6b\x6c\x53\x65\
+\x18\x7e\xbe\x73\x69\xbb\xae\xa3\x03\xdd\x05\x1c\x94\xc9\x65\xba\
+\x95\x0d\xc7\x50\xa3\x06\x94\x30\xbc\x00\xc6\x04\xa3\x22\x51\xfc\
+\x41\x4c\x08\xc6\x3f\xfe\x51\x22\x04\x8d\x89\x08\x19\x1a\x13\x0c\
+\x89\xa2\x24\x18\x62\x88\xfc\x50\x88\x4a\xa6\x44\x46\x44\x1c\x6c\
+\xb8\xc1\xca\x7d\x63\x52\x47\x21\xe2\xd6\x15\x58\x2f\xe7\x9c\xcf\
+\xe7\x9c\xd3\x42\x21\xd5\x80\xef\xf9\xd1\xd3\xaf\xdf\xf7\x3e\xef\
+\xe5\x79\xde\xaf\x02\xb4\x2f\x22\x1f\xfc\xac\x69\x99\xd9\x42\x02\
+\x42\xa8\x90\xd2\x44\xce\x14\x7e\xcf\x58\x26\x54\xe1\x7e\x17\xc8\
+\x33\xe9\x2e\x98\x52\x5e\x5b\xd2\xb8\x90\xb6\x24\x0c\x53\x6b\x5b\
+\x36\xed\xad\xd9\x62\x63\xd7\xea\x9e\x9a\x31\x81\xda\xd1\x3e\x05\
+\x37\x9b\xbd\x22\x88\x2a\xa5\x05\xcb\xf1\x26\x61\xc9\x1c\x10\x1f\
+\x85\x3b\xa4\x42\x80\x3c\x4c\xe9\x22\x0f\xa6\x2c\x9c\x1d\x34\xdb\
+\xc4\x96\x9e\x77\x65\x7d\x45\x11\xd2\x86\xbc\x16\x94\x1b\x39\x10\
+\x4f\x1b\xe8\x8f\x2b\x08\xf9\x27\xd2\x89\x71\xcd\x89\x70\x7e\xd7\
+\x70\xf6\x4a\x1f\xaa\x82\x16\x4a\x3d\x3a\xa3\xb6\xd7\x44\x0e\x01\
+\x1e\x4d\x45\x77\x2c\x01\xf1\xf9\xd1\x77\x64\xb8\xbc\x18\x69\xd3\
+\x72\xa2\x62\xbc\x8e\x03\x7b\xef\x50\x32\x05\xd5\x9a\x8c\x79\xd5\
+\x2f\xa0\x90\xed\xee\xdd\x06\x4b\x3b\x8b\x62\x02\x30\x49\xe4\x47\
+\xa0\xd1\x41\xcf\xc5\x2b\x10\x9f\x76\xaf\x91\x75\x04\x30\x64\x5e\
+\x8e\xc2\x2d\x57\x22\x9d\x84\x91\x9c\x80\xa7\xa7\xbe\x54\x10\x60\
+\xe7\xc9\xad\x90\xde\x7e\x94\xe8\x3e\x1e\x33\xa0\xf2\xc9\x75\x4f\
+\x61\x09\x4e\xd8\x00\x9b\xba\xd6\xc8\x70\x05\x01\xcc\xbc\x12\xb1\
+\xc9\x4e\x89\x32\x06\xcc\xe4\x78\x3c\x53\xb3\xb4\x20\xc0\xb7\x27\
+\xb6\xc2\xd4\x7b\x31\xca\x57\xec\x04\x96\xed\xb9\x43\x12\x4d\xd1\
+\x11\xb9\x10\x87\xf8\xe4\xf0\x2a\x39\xad\x22\xc8\x1a\x5a\x37\xf4\
+\xc0\xde\x39\x9c\x4a\xc1\x1a\xa9\xc2\xa2\xda\x57\x0a\x02\xec\x88\
+\x6c\x81\xf0\xfd\x81\x12\xaf\x9f\x4e\xaf\x77\xda\x7e\xd3\x49\x80\
+\x48\x8c\x00\x1b\x3b\x57\xc9\xba\xca\x20\xa9\x98\xe1\x2f\xea\xf5\
+\x4d\x04\x48\xd8\x00\x57\xab\xf0\x6c\xb8\x30\xc0\xf6\xa3\x9b\xa1\
+\x14\xc5\x10\xf4\x6a\x24\x81\x7d\xd6\x26\x82\xeb\x43\x53\x24\x7a\
+\xce\x5f\x86\xf8\xf8\x10\x01\xc6\x06\x61\x90\x7f\x8a\x70\x23\x17\
+\x59\x8a\x0e\xa5\xd2\x48\x0e\x97\x63\x71\xc3\xb2\xc2\x00\x47\x36\
+\x43\x04\x06\x10\xf4\xf8\x49\x5f\xd3\x2d\x11\x69\x6b\x31\x1b\x85\
+\x19\x1c\x3f\x3f\x04\xf1\x61\xfb\x2a\x19\x1e\x1b\x70\x78\x7e\xe9\
+\x72\x06\x57\x32\x6e\x9b\x86\x92\x71\xe7\x73\xac\x3e\x05\x4b\xa6\
+\x2f\x2f\x08\xd0\x72\xf0\x0d\xe7\xd3\xef\xf5\x92\x35\x3a\x03\x53\
+\xe0\x23\x3d\xc7\x04\x34\x06\xab\xa3\x27\xfa\x37\x44\xcb\x6f\x2b\
+\x65\x78\x1c\x33\x20\xf2\x88\x91\x41\x77\x6f\x1c\x8b\xeb\x9e\x63\
+\x8a\xfe\x6c\x1e\xc0\xe4\xf2\xa9\x05\x01\x7a\x2f\x9e\xca\xd6\xdc\
+\x64\x89\x47\xf0\x65\xf7\x57\xb8\x6f\xca\x1d\xd0\x55\x85\xe7\x05\
+\x8e\xf6\x13\x60\xdd\x2f\x2b\x65\x7d\xa8\x94\x4d\x52\xe1\x15\x1e\
+\x9c\xbc\x7a\x0c\x9f\xed\xdc\x87\xad\x2f\x6e\xc1\x3d\x95\x8d\xb8\
+\x15\x3b\x1e\x3b\x8c\x25\xdb\x96\xe2\xd5\x05\x8f\xe0\xee\xe2\x69\
+\xd4\xd4\x08\x6b\x65\xe2\x48\xff\x20\x33\xd8\xbf\x5a\x86\x43\x63\
+\x70\x2c\x7e\x90\xce\x23\x94\x80\x40\x32\xa5\xe0\xeb\xed\xa7\x30\
+\xb8\xfe\x12\x84\xaa\xfe\xa7\xf3\xae\x81\x76\xcc\x69\x79\x0a\xf3\
+\x17\x55\xa3\xc8\x63\x39\xa3\xa4\xc6\x7f\x2f\x6a\x83\x4d\x88\xf4\
+\xff\x05\xf1\xfa\x77\x2f\x4b\x6b\x5c\x04\xa9\x94\x84\xa6\x6a\x4e\
+\x1d\x15\x32\x20\x1a\x4b\xa3\xbd\x75\x00\xe7\xd6\x47\xa1\xfc\x0b\
+\xc8\xef\xd1\x5f\x31\x67\xfd\x02\x2c\x7c\x7e\x32\x02\x1e\xce\x24\
+\xaa\xd7\xa2\x62\x0d\x3e\xba\x4e\xaa\x46\x6b\x21\x66\x6c\xa8\x93\
+\x0f\xcf\x09\x20\x93\x11\x8e\x0a\x6d\x08\x93\x03\xce\xa7\x2b\xe8\
+\xeb\x1f\xc1\x81\x1f\xff\xc4\xc0\x86\x01\xa8\x37\x81\x48\xd3\xc4\
+\x84\x95\x21\x3c\xba\x70\x1c\xfc\x3e\x15\x56\x56\xc2\x2a\x41\x0c\
+\xce\x0d\x8d\xe7\x0f\xec\x19\x86\x78\xe0\xa3\xe9\x72\xe6\x63\x7e\
+\xa4\x93\xae\x50\x6c\xb2\xa9\xd9\xa1\xac\x68\xcc\x24\x9a\xc6\xb1\
+\xfd\x43\x38\xbd\xf6\xcc\x75\xe7\xf4\x56\xbe\xa2\x12\x0f\x2d\x9c\
+\x80\xca\x0a\x0f\x4c\x23\xab\xcc\xac\xd6\x2c\x8e\x78\x5d\xb7\xd0\
+\xb1\x87\xa3\xa2\xa9\xa5\xc1\x01\xb0\x75\x96\x21\x7f\xed\x08\xec\
+\x3e\x88\xac\x26\x74\x0d\x38\xb0\x8f\x91\x24\x34\xb4\xbf\x79\xd8\
+\x71\x70\xe7\x6b\x65\x78\xf0\xf1\x10\xaa\x42\x3e\x9e\x73\x47\xb8\
+\x33\xec\xa4\xfb\x6e\x1f\xd5\x3c\x02\x1d\x3f\x11\xa0\x71\x5d\x83\
+\xbc\x7f\x6e\x31\x32\x69\xe9\xcc\x75\x93\x3b\xbb\x3a\x2f\x22\x63\
+\xa6\x1d\x51\x4a\x2e\xea\xdc\xec\x35\x47\xa3\xa7\xf3\xb4\x4b\xdb\
+\xa6\x32\x37\x5b\xd6\xdb\xe2\x88\xb1\x45\xc5\x98\x51\xdf\x58\xce\
+\x52\x2a\xce\x44\xd0\xd9\xf0\x8e\x56\x2a\xb9\x71\x6d\x83\x6c\x6a\
+\xe6\xb8\x4e\xdb\xea\x03\xfa\xce\x5d\xc2\x37\xcd\x87\x50\x32\xaa\
+\xe4\x96\x28\x9a\xb3\x44\x3c\x81\x05\xad\x4d\xa8\x1e\x5f\xce\xe0\
+\x0c\xf8\xbc\x3a\x3a\x76\x53\xc9\xd3\xdf\xaf\x97\x33\x9a\x03\x4e\
+\x06\x8a\xa2\xa2\xf7\xdc\x05\xec\x9a\xd7\x71\xfb\x00\xc3\x09\xcc\
+\xff\xbe\x11\x13\x43\x65\xb0\xe7\xa6\x97\x59\x1f\xda\xcd\x0c\x1a\
+\xde\x23\xc0\x13\xc1\x2c\x00\x33\x88\xc6\xb0\xab\xb9\xf3\x7f\x01\
+\x3c\xd9\xda\x88\xea\xbb\xca\xd8\x0f\xde\x0c\x6c\x72\xd7\x0f\xec\
+\x5d\xf8\xed\x5a\x39\x73\xd1\x68\xa4\xaf\x5a\x0e\x80\x23\x9e\x8e\
+\xd8\x6d\x39\xcf\x59\xfd\x8c\x4a\x97\x45\xec\xa5\xaf\x88\xa4\xd8\
+\xc1\x51\x31\x69\x45\xcd\xde\xa9\x73\x4b\x67\x55\x4c\xd4\x5c\x26\
+\x90\x3e\x23\x66\x82\x75\xcc\x64\xaf\x4f\xfe\xcb\xa0\x70\x04\x15\
+\x22\x61\xde\xe0\x50\x64\x67\x15\x47\x28\x74\x0e\xb7\x22\xcd\xcf\
+\x57\xd2\x4e\xb1\x30\xd0\x97\xc1\x99\xd6\x78\x9b\x43\xf8\x49\xcb\
+\x6b\xf6\xfa\x4a\xd5\x59\x82\x75\x13\xf6\x45\xa0\xe4\xc4\xc4\xb3\
+\xdc\x6f\xdf\xf7\x22\x4f\x67\xee\xfd\xeb\xde\x5f\x02\x79\x97\x14\
+\x5c\x8e\xca\x34\x83\x1c\x34\xda\x7a\x37\x1d\x9f\xfd\x0f\x57\x46\
+\x3e\x1d\x98\x54\x3d\xdf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x72\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x39\x49\x44\x41\x54\x78\xda\xc5\x94\x7b\x6c\x53\x55\
+\x1c\xc7\xbf\xb7\xf7\xae\x5b\xf7\x40\x70\x4f\xe6\x12\x61\x2c\x12\
+\x25\x93\x48\x48\x98\x0b\x43\x1d\x2a\x06\x89\x10\x51\x30\x4a\x82\
+\xc4\xc7\x8c\x18\x62\xe2\x1f\xf8\xcf\xe2\x6b\x33\x40\x06\x42\xc0\
+\x20\x8b\x0f\x46\x40\x0d\xad\xc6\x29\x65\x6a\x02\xb8\x8d\xb9\x8e\
+\xd8\xad\x93\xc9\x36\x4d\xd7\x15\xba\x67\xbb\x47\xdf\xf7\xb6\xf7\
+\xde\xe3\xef\x76\x45\x8d\x6c\x99\xed\x3f\xde\xe4\x97\x73\x4e\xcf\
+\xe9\xf9\xfc\xbe\xbf\xdf\xef\xfc\x38\x24\xf1\xed\x7d\xe3\xad\x47\
+\xe5\xa8\x7c\x20\xbf\x30\x67\xa5\x14\x92\x10\x89\x48\x90\x15\x05\
+\x5e\x9f\x0f\xfd\xd7\x7a\x4d\x82\x5e\xf8\xec\x87\x0b\xe6\xf3\xda\
+\x59\x2e\x89\xcb\x9f\x2a\x2b\x5f\x6d\xdc\xf2\xe4\xa6\x59\xf7\xfb\
+\xfb\x7f\xc7\xa1\xfd\x87\xe1\xbc\x7e\x7d\x03\x41\x7e\x4c\x08\xf0\
+\xfe\x3b\x87\x76\x96\xae\xbc\xfb\xe4\xa6\xcd\x8f\xc1\xe3\xf1\x60\
+\x78\x74\x0c\x3a\x1d\x0f\xc6\x54\x88\xa2\x88\x80\x3f\x08\x59\x96\
+\xb1\xac\x64\x29\xf6\xbf\x7b\x40\x83\x6c\x4f\x08\xd0\xfc\x53\x1b\
+\x5b\xf7\x40\x39\x26\x26\xa7\xe0\x26\x40\xeb\xc5\x36\x74\x75\xda\
+\x86\x26\xdc\x53\x63\x69\xa9\xba\x55\x0f\x6d\x5c\x8f\xc2\xc2\x22\
+\x44\x64\x09\x03\xfd\x0e\x9c\x3d\xf3\x79\x63\x42\x00\x4b\xbb\x95\
+\xad\x29\x5b\x85\x3f\xec\x76\xfc\xdc\xd2\x81\x9e\xee\xde\xc7\xeb\
+\x8e\xd4\x9c\xbf\xb9\x5f\x59\xfe\x70\x4f\xed\xc1\xda\x15\x4e\x97\
+\x8b\x94\x09\x38\xb2\xaf\xee\x62\x52\x00\x5b\xf7\x55\x34\x1a\x9b\
+\x86\xde\xae\xdd\x5b\xf4\xcf\xfd\x8d\x8f\x3c\x91\x5e\x76\x7f\x59\
+\xb0\x72\xc3\x7a\x38\x6e\x38\x71\xbc\xee\xa8\x39\x21\x40\x6b\x8b\
+\x85\xad\xad\x58\x83\x2b\xd6\x2e\x7c\x67\x32\xf7\xd4\xec\xab\x2e\
+\xfd\xf7\x99\x57\x5e\xda\xc3\x76\x55\xed\x44\xa7\xad\x1b\xa7\x4f\
+\x9c\x4c\x0c\xa0\xe5\x60\xed\xba\x32\x58\x3a\xae\xa0\xe9\x5c\xf3\
+\xb5\x9a\xda\x37\x57\xdc\x02\x78\xf1\x35\xb6\x63\xd7\xb3\xe8\xf8\
+\xa5\x13\xdf\x9c\x31\x26\x0e\xa8\xa0\x24\xb7\x5b\x2c\x1a\x00\x04\
+\xb8\xe5\xff\x55\x2f\xec\x66\x4f\x3f\xb7\x15\x56\xab\x0d\xe7\x4c\
+\xdf\x9a\xb9\xea\x45\x78\x75\x79\x45\xe1\x87\x6c\x7a\x04\x10\x19\
+\x54\x05\x30\xe8\x81\x74\x03\x9d\x36\xa4\x83\xe7\x79\x08\x02\xa0\
+\xe7\x18\x78\x1d\x90\xc2\xa9\x48\xa1\xb5\x40\x73\x81\xaa\x45\x51\
+\xd9\x7d\xa5\x67\x55\xdb\x4d\xc0\xee\x97\xf7\xb0\xad\x3b\xb6\xc1\
+\x66\xb3\xa1\xf1\x8b\xaf\xcc\xdc\x47\x0f\xe6\xb3\xaa\x4b\x5f\xd2\
+\x56\x37\x20\x85\x81\x70\x08\x08\xd2\x18\xf0\xd3\x48\xf3\x50\x90\
+\x8c\xe6\x21\x9a\x07\x02\xf4\x1b\x59\x24\x0a\x95\x5e\xaf\xae\x72\
+\x3b\xec\x9f\x1a\x51\x72\x6c\xe4\x2f\x25\xdb\xb6\x3c\xc3\x96\xdf\
+\x7b\x0f\x3c\xa3\x6e\xf4\xf5\xf6\x75\xc5\x01\x17\xa0\x4e\x38\x80\
+\x68\x1f\x58\x70\x9c\x94\xf8\xc0\x85\x44\xba\x34\x4c\x6b\x0d\xe4\
+\x83\x1a\x0c\xc6\xa0\x2c\x10\x02\x8b\x8a\x10\x0a\x8a\xc0\x2f\xb9\
+\x13\x0e\x53\x33\x8a\xeb\xfd\x73\x86\x3a\x0e\xf8\x1a\x6c\xa0\x17\
+\xf0\x79\x00\xff\x04\xd8\xf4\x18\x54\xdf\x20\xc8\x4d\x70\x86\x4c\
+\x70\x99\x06\xb0\xf4\x4c\xa8\x59\x0b\x80\xd4\x34\x02\x47\x21\xa8\
+\x1c\xed\x65\xc0\x51\x7f\x0a\xc5\xc7\x46\xe7\x03\x5c\x26\xcf\x06\
+\x67\x42\x21\xf9\xc1\x49\x14\x86\x30\x79\x1c\xf6\x42\x9d\x9e\x8c\
+\x81\x99\x77\x9c\xa0\xe3\xb1\xb9\x2a\x4e\x83\xcb\x32\x40\x9f\x9f\
+\x0d\x7b\xbb\x0b\x25\x9f\x44\xe7\x01\x34\x9d\x26\x05\xbf\x02\x53\
+\xc3\xe4\x3d\x5d\x34\x35\x02\xc5\xeb\x8a\x29\x10\xf2\x0a\xc0\xe5\
+\xe6\x81\x2d\xca\x05\x97\xbf\x18\xf2\xc2\xdb\x21\x84\x55\x70\x11\
+\x01\x9c\x9e\x14\xd4\xbc\x87\xe2\xc3\x83\xc9\x28\x08\xcc\xa2\xc0\
+\x9d\xa4\x82\x4b\xa6\x78\x0e\x28\x04\x7e\x37\xa9\x70\xcf\x84\x43\
+\x11\xc1\x65\x64\x50\x0e\x32\xc0\x0c\x69\x94\x83\x2c\xaa\xd7\x54\
+\x02\xcb\x10\x18\x0f\x8e\xf2\xe2\x38\xd1\x80\xe2\xa3\xc3\xf3\x01\
+\x5a\xc1\xfc\x8e\x19\x05\xa2\xa6\x22\x00\x2e\x4c\x63\x98\xaa\xc7\
+\xa7\x29\xa0\xc4\x53\xf2\x55\x82\xc3\x3f\xf9\xb7\x82\xbc\x1c\x0c\
+\xb4\x39\xb1\xec\x63\xe9\x7f\x57\x30\x4b\x0e\x24\xed\x91\xf9\x08\
+\x36\x09\x46\xb1\x9f\xc9\xc1\x18\xe0\x4d\x26\x07\xdf\x6b\x55\xf4\
+\x1b\x29\xa0\x8b\xe2\x09\x55\x86\xa8\xaa\x64\x0a\x55\xde\x62\xe8\
+\x72\x0b\x62\x23\xee\x58\x0a\x65\xc1\x42\xf0\x21\x85\xaa\x88\x4f\
+\xa4\x8a\xac\x14\x5f\x02\x0c\xb4\x80\xb9\xae\x52\x89\x8e\x80\x63\
+\x8c\x54\x44\xc0\xa8\x45\xb0\x30\xb5\x0e\x91\x4c\xa5\xf2\x84\x0e\
+\x0c\x32\x85\x2d\x0d\xfa\xec\xdb\x60\xbf\x3c\xf8\x5f\xaa\xe8\x38\
+\xd0\x56\x0f\xb0\x14\xf2\x5a\xa6\x96\x41\x26\x49\x64\xd4\x2e\xc4\
+\x08\xf5\x1e\x1a\xc3\xb4\xd6\xa0\xda\xa7\x32\x30\x9e\xde\x41\xc5\
+\x66\x38\x1b\x8c\x58\x72\xf0\xc6\xdc\x80\xea\x6c\xbc\x7e\xd7\xea\
+\x9c\x0f\x14\x31\x48\x1d\x92\xa7\xee\x49\x5d\x92\x3a\xa7\x40\x63\
+\xac\x7b\x6a\x6b\x1d\x83\x5e\x17\x5f\x6b\x46\x7e\x08\xa4\x43\x9f\
+\xc2\x10\x0d\x46\x9e\x2f\x35\xa9\x0d\x73\x01\xfe\x04\x20\x90\x90\
+\xb6\x4c\x3e\x2d\x2e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x06\x75\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x3c\x49\x44\x41\x54\x78\xda\x85\x56\x7b\x50\x54\x65\
+\x14\xff\x7d\xf7\xb5\xcb\x2e\x20\x2e\xac\x80\x88\x0a\xa4\x99\x69\
+\xe0\x10\x8c\x6f\xd0\x0c\x12\xc3\xac\x29\xd4\xd1\x28\xa7\xa6\xd0\
+\x12\xfd\xa3\xc9\xc9\x71\xcc\x1c\x27\x6b\xd4\x62\x2c\x90\xb4\x87\
+\x63\x2f\x5f\x65\x39\x25\x5a\x4e\x21\x3e\x13\x0d\x50\x12\x84\x62\
+\x45\x03\x04\x79\x2c\xaf\x7d\xdd\xbd\xf7\x76\xee\x2e\x22\x66\xe6\
+\xd9\xf9\xee\xec\x7c\xfb\xdd\xf3\xfb\x9d\x73\x7e\xe7\x7c\xcb\xf0\
+\x7f\x96\x98\x97\x02\x45\x59\x00\xaf\x96\x0e\x45\x8d\x41\x70\xa0\
+\x7f\xbf\xab\x07\xe0\x39\x1b\x04\x76\x04\x3c\xbf\x1b\xe7\x57\x1e\
+\xbb\x9b\x0b\xf6\x9f\xbb\xc9\x1f\xc6\xc3\xe9\x2a\x35\x0c\x0d\x17\
+\x87\x4f\x88\xc1\x88\x71\x56\x58\x2d\x66\x98\x02\x38\xdf\xcf\x0e\
+\xa7\x8a\x1b\xed\xbd\xa8\xaf\xbc\x81\xab\x65\x36\xb8\x1b\x9b\x65\
+\x04\x18\x93\x70\xf6\xd5\x8a\x7b\x02\xb0\xa4\xad\xf9\x1a\x27\x2e\
+\x4b\x5e\x38\x19\x63\xc8\x71\x60\x30\x0f\x4e\x65\x14\x80\x06\x68\
+\xb7\xde\xe2\x18\x83\xc6\x6b\xe8\xed\x56\x50\x7d\xf1\x06\x7e\xfb\
+\xfa\x14\x98\x2a\x17\x68\xa5\xb9\xaf\xdc\x15\x80\x4d\x2c\xdc\x13\
+\x14\x65\xcd\x7a\xf4\xb9\x64\x58\x88\xed\xe8\x70\x13\x2a\x5a\xdc\
+\x08\x23\x10\x9e\xdd\x3a\xac\xe3\x68\x37\xf1\x98\x7f\xa7\xb1\xd1\
+\x89\xa2\x5d\xe7\xd0\xdd\x70\x63\xaf\x76\x26\x67\xfe\x1d\x00\xe2\
+\xb4\x4f\xf2\xcd\xe1\x21\xcb\x16\xe6\x4e\x81\xd7\xe5\xc6\x96\x87\
+\x24\x04\x85\x47\xe0\xfb\xda\x4e\x7c\x5a\xdd\x83\xeb\xb2\x0a\xcd\
+\xeb\x3f\x2b\x08\x40\xb0\xc8\x30\x24\x50\x80\xd5\x24\xc0\x24\x92\
+\x23\x62\xd0\xd1\xe1\xc1\xe7\xf9\xa7\xe1\x68\xb6\x17\xc8\xc7\x5f\
+\x78\xa5\x1f\xc0\x94\xb6\x2b\xde\xeb\xd5\xca\x97\xac\x9e\x05\xd1\
+\x64\xc4\x72\xd3\x35\x8c\x8e\x8f\xf7\x39\x6b\x6b\x6d\x45\x71\x2b\
+\x8f\xc2\x0b\xdd\x50\x8c\x14\xc9\x6d\x11\x68\x94\x3a\x20\x32\x48\
+\xc0\x28\x8b\x00\xb3\x28\xc0\xd6\xec\xc0\xce\x8d\x47\x89\x04\x4b\
+\x70\xfc\x94\x5d\xe1\x03\x10\xa7\xef\xf2\xcc\x7a\x3e\x49\x4c\x9b\
+\x16\x8d\xba\x33\x17\xb0\x75\xf1\xc4\xfe\xe0\x74\x80\x4e\x52\xcd\
+\x79\x77\x10\x3e\xbb\xe4\x80\x44\x8c\xfb\x6b\xd1\x67\x7a\x79\x54\
+\xa6\x11\x88\x88\xd8\x50\x03\x8a\x4e\x34\xe2\xe8\xce\x52\x59\x2e\
+\xc9\x96\x58\xe0\xec\xbd\x29\x42\xb0\x54\xbc\xe1\xad\x54\x54\xb6\
+\x29\x48\xec\xb8\x8c\x17\xe7\x4c\x22\x75\x2a\xe0\x38\x0e\xd7\x9b\
+\x9b\xe0\x74\x78\x7c\x00\x3b\xce\x75\x22\x2c\x32\x90\xd8\xff\x0b\
+\xa1\x2f\x22\x85\xd6\x10\x33\x87\xb1\x56\x09\x6b\xde\x2c\x86\xb7\
+\xcb\x93\xca\xcc\x73\xf6\x6f\x4b\xca\x18\x9d\xf3\xd8\xf4\x68\x9c\
+\x6b\x92\x91\xa5\xfd\x89\xa7\x1f\x49\x82\x97\x68\x75\x75\x76\xfa\
+\xd8\xd7\xff\xdd\x88\x16\xcb\x28\xec\xab\x71\x62\x70\x58\x80\x8f\
+\xb1\xee\x51\xed\x73\xdc\x0f\x42\x4b\x4f\xd9\xf8\x70\x09\x87\x4b\
+\xae\xa1\xf4\x50\x4d\x21\x33\xce\xd9\x5f\xb7\x74\xd5\xd4\x98\x5e\
+\xc6\xc3\xad\x72\x18\x55\x7b\x02\xab\xb2\xd3\xe1\x55\x80\x0e\x7b\
+\x1b\xaa\x6b\xae\xe0\xbd\x7a\x2b\xaa\xdb\x35\x58\x88\x3d\x34\x15\
+\x22\xe3\x60\x36\x72\x54\x60\x1e\x16\x93\x5f\xc2\x03\xc1\x34\x4a\
+\xaf\x19\x0a\xb6\xbd\x7b\xc2\xc6\xa4\xd9\xdf\x68\x2b\x37\xcc\x84\
+\xcb\x45\x1e\x79\x1e\x5a\xd5\x25\xac\x9b\x1d\x0b\xde\x10\x00\x91\
+\xe4\x52\x6b\xf7\x22\xf5\xe3\x06\xc4\x3d\x18\x42\x2a\xd2\x6e\xc9\
+\x54\xff\xd0\x17\xa6\x31\x0c\xb7\x8a\x18\xa9\x4b\xb9\x2f\x4d\xba\
+\x19\x49\x10\x79\x6b\x7e\x01\x1b\x9c\x7d\x58\x5b\xfe\xfa\x64\xb8\
+\x9c\x32\x39\xe4\x50\x56\x65\x47\x66\xf3\x01\x3c\xfd\xec\x62\x3a\
+\x46\x4c\x4d\x66\x98\x57\x94\x61\xea\xdc\x38\xa8\x1e\xa5\x9f\x25\
+\xa3\x46\xe3\x44\x7f\x67\xcb\xb4\xaf\xdb\xb8\x08\x11\x43\x28\x32\
+\x9d\x87\x31\x40\xc4\x07\x9b\x4e\x83\x0d\x79\xb9\x44\x5b\x91\x3b\
+\x01\x5e\xb7\x82\xf2\x36\x19\xd7\xba\x29\xe4\xdd\xef\x63\xdf\xfa\
+\x6c\x98\x06\x05\xc2\x3a\x28\x18\xf9\x65\x76\xac\xdb\xdf\x84\xa4\
+\xc7\xe2\xa0\xd0\x39\x5d\x60\x7a\x4b\x94\x7f\x5b\x05\xd9\xe1\x44\
+\xd2\xb3\x89\x10\x28\x4d\x1e\xf2\x6c\x0d\xe2\x90\x10\x2a\x42\x30\
+\xf0\xd8\x92\x77\x1e\x2c\x68\x49\xb1\xf6\xf6\x9a\x64\x9c\xba\xea\
+\x40\x6b\x8f\x0a\x41\xe4\x51\x53\xd9\x8e\xa7\xae\xef\x40\x6e\xee\
+\x72\x0a\x82\xc3\xb0\x28\x2b\x16\xed\xaa\x45\xd1\xef\x5d\x98\x3e\
+\x6f\x0c\x64\x59\xc3\xa1\xcd\xc7\xb0\x67\xb1\xdd\xc7\x7c\xfe\x47\
+\x22\xd2\xd7\x65\x80\xa3\xc2\x51\x3f\x21\x2c\x90\xc3\xe4\xe1\x26\
+\xac\xde\x70\x16\x2c\xec\xa5\xe3\x75\x19\x8b\xc6\xc6\xd8\x5d\x1a\
+\xcd\x17\x3d\x74\x62\xc7\x04\x94\x7f\xf1\x13\xd6\x4f\x6a\x45\x6a\
+\xfa\x1c\x6a\x1a\x9e\x40\x22\x90\xb5\xbd\x12\x3f\x96\xf5\xc2\xd1\
+\x60\xc7\x9e\x67\x5a\xf0\xf0\x94\x54\x1f\x80\x4d\x35\x61\x56\x56\
+\x11\x32\xb7\x3c\x01\x51\x55\x49\x20\x1a\x42\x8c\x0c\x87\xbe\xbc\
+\x64\x63\x11\x2b\x7f\xdb\x16\x37\x39\x2a\x67\x58\xa4\x19\x6a\x5f\
+\x85\xf4\xb6\xb7\xf7\x32\xd8\xb6\x17\x62\xd3\x82\x11\x18\x9f\x38\
+\x11\x06\x83\x84\xa8\xa1\xa1\x38\x57\xdf\x8d\xba\xe3\x3f\xf8\x9c\
+\x8f\x1c\x19\x4d\x01\xf2\xbe\x77\x9a\x7b\x7a\x11\x91\x71\x00\x4f\
+\xbe\x33\x17\x46\x2a\xd4\xd5\xc6\x1e\xfc\x75\xaa\xa1\x90\x45\xaf\
+\x3a\x9f\x62\x0c\x33\x15\x4f\x9b\x11\x05\x8f\x5b\xe9\xd7\x34\x4f\
+\xac\x6b\xea\x3d\x70\x7e\xb5\x09\x6b\x17\x25\xe0\x21\x02\x91\x78\
+\x9a\x3b\x34\x4a\x0c\x46\x03\x09\x4e\x24\x51\xf0\x60\x94\x42\x9e\
+\xf7\x83\x74\xf4\x3a\x61\x99\xf7\x1d\x96\xe6\xcd\xc3\xd1\xa2\x7a\
+\xb8\x5a\x1d\xa9\xbe\x79\x10\xf5\x46\x99\x67\x52\x5a\xb4\x68\x09\
+\x92\xfc\x63\x19\xfe\x54\xe9\x20\x4d\xed\xc0\xf1\x8d\x05\x58\x3b\
+\xd3\x8d\xcc\xac\x05\x08\x30\x05\xf9\x52\x66\x10\xa9\x90\x92\xbe\
+\x24\x88\x04\xa2\x77\xfd\xe1\xaa\x16\x64\xbe\x55\x8a\x67\x56\x4e\
+\x43\xc9\xc1\x3a\xb9\x61\xe3\x04\xc9\x07\x30\x72\xfd\xc5\x78\x4d\
+\x12\xcb\x1f\xcf\x18\x06\xd5\xab\xde\xd6\x9d\x3c\x49\xb7\xd3\xc3\
+\xe1\xe0\xd6\x63\x18\xd7\x71\x00\x2b\xb2\x26\x61\xea\x8c\x14\x84\
+\x85\x5a\x49\x10\x22\x38\x41\xf2\xcd\xad\x5f\x4b\x4e\x61\xe6\xd2\
+\x0a\xe4\xec\x5f\x82\x23\x3f\x5e\x85\xe6\xf4\x24\x5c\x59\x3b\xbe\
+\xa2\x7f\x5c\xc7\xbe\x5d\x95\x3f\x68\xa8\x69\x59\xda\x44\x2b\x5c\
+\x03\xf5\xae\x2f\xaa\xbe\x64\x94\x50\x5e\xdb\x85\x0b\x3f\xff\x01\
+\xe7\x99\x43\xe0\x34\x05\x13\xe2\xa3\x70\xa5\x59\x41\x63\x8b\x1d\
+\xa1\x33\x32\xb1\xf0\x85\x04\x14\x9f\x6c\x41\xfb\xb5\x9e\x82\xba\
+\xd5\x0f\xdc\x1a\xd7\x37\x2d\x6e\x73\xcd\x9e\x90\xc8\x80\xac\x59\
+\x89\xa1\xbe\x82\x2b\x03\x42\xd1\x53\xa6\xa7\x81\x27\x19\x33\xea\
+\x70\x7d\x1c\x28\x34\x78\xf4\x8b\x48\xa0\x07\x53\x15\x1c\x39\xd3\
+\x8c\xb6\x06\xe7\xde\xbf\x5e\x1b\x7d\xe7\x85\x73\xd3\xee\xdb\x5a\
+\x97\x2f\x1a\xb9\x65\x53\x92\x07\x23\x8a\x6a\x22\x93\xae\xd5\xbe\
+\xeb\x4b\x1b\xf8\x52\xdf\xb5\x29\x0a\x0c\x0d\xdd\x1e\x9c\x3c\xdb\
+\x01\xd9\xa5\x16\xfc\x99\x1b\x7b\xf7\x2b\xf3\xa6\x8d\x29\xb4\xc5\
+\x7b\x35\xae\x34\xc4\x22\x8a\xf7\x8f\x30\x22\x72\x10\xdd\x6e\x06\
+\x6e\xc0\x98\x00\xba\xdd\x2a\x9a\x3a\x3d\xb8\x5c\xef\x82\xbd\x5d\
+\x96\x05\xa6\x26\x55\xe7\xc4\xdc\xfb\xd2\x1f\x68\xe3\x3e\xfb\x3b\
+\x85\x54\xb5\x80\x84\x95\x4e\x2b\x26\xc0\xe4\x97\xa3\xd3\xa1\xe8\
+\x4d\x69\xa3\x75\x84\xe7\xd8\xee\xca\x25\xc3\xee\xfa\xb7\xe5\x1f\
+\x1b\x8d\x9b\x14\xe4\xcc\x14\x3f\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x05\xa6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x6d\x49\x44\x41\x54\x78\xda\xad\xd6\x0b\x4c\x53\x57\
+\x18\x07\xf0\xff\x2d\x94\x87\xd3\x22\x62\x05\x6d\x81\x22\x8f\x0a\
+\xa8\x6c\x28\x28\x8a\xc0\xac\x3a\xdd\x74\xa2\x51\x23\x38\x50\x26\
+\x2a\xbe\xe2\xa6\xd1\x18\xa7\x66\x99\x66\x9a\x19\x71\x73\x3e\x98\
+\xe2\x98\x28\xb8\x84\x6c\x88\x0f\x18\x46\x9e\x82\x82\xae\x02\x05\
+\x84\x96\xf1\x28\x6f\x84\x0a\xb4\xb0\x02\x05\xce\x0e\xf7\xe2\x26\
+\xd9\x5c\x86\xd9\x69\xda\xde\xdc\xdc\xf3\xfd\xbe\xf3\x9d\x93\xaf\
+\x65\x40\xc7\xca\xc4\x06\xc2\x37\x02\x08\x21\xf8\x3f\x06\xc3\x30\
+\x30\x0c\x00\x49\xab\x44\xf4\x8a\x8e\x55\x37\xeb\xc8\xb9\x45\x53\
+\xa0\xed\x1f\x04\x33\xfc\xc0\x9b\x8c\x97\x09\x9a\x1a\xf3\xb0\xf7\
+\x7e\x23\x12\x03\x6d\xb9\x48\x2b\x12\x6a\xc8\x57\x8b\xc5\x28\xed\
+\x34\xa0\x55\xd7\x8b\x31\x7c\x63\x10\xf6\x05\x16\xc4\x4b\x8f\xbc\
+\x72\x8d\x57\xee\xb1\xb7\x19\xe8\x0d\xfd\x98\x34\xce\x14\x26\xc6\
+\x0c\x2e\x3f\x6c\x46\xd2\x5a\x09\x07\x7c\x10\x5f\x49\x4e\x2d\xb3\
+\x43\xb9\xd6\x80\x16\x5d\x1f\xbc\x2d\x68\xbd\x78\x3c\x0c\xd2\xd9\
+\xcc\xf0\x64\x30\xaf\xcf\x7a\x68\xc5\xcc\xe0\x20\x1e\x77\x0c\xc0\
+\x46\x60\x02\xbe\x11\x83\xa8\xec\x46\xdc\x0e\x72\xe4\x80\xa5\x57\
+\x55\xe4\xf4\x0a\x07\x94\x75\xf6\xa1\xa1\xbd\x07\xbe\x42\x13\x78\
+\x8a\xc7\x8e\xaa\x3c\x05\x0d\x5d\xc8\x6d\xed\x83\xc8\xd2\x8c\x02\
+\x3c\x5c\xcc\xa8\x43\x72\xa8\x0b\x07\x2c\xf9\xbe\x9c\x44\xae\x9c\
+\x8a\xd2\x0e\x03\xea\x5f\xe8\xb1\xc0\x9a\x0f\x2f\x5b\x01\x7e\xce\
+\xaf\x86\xba\x4d\x0f\x3e\x9f\xc7\x65\xc9\xee\xcf\xcb\xcc\x81\x7e\
+\xba\x67\x12\xa1\x39\x3e\x9c\x2d\x81\xbc\x5e\x87\x07\xcf\x0d\xb0\
+\xa5\x80\x31\x05\xa2\xd2\xd5\xf8\x25\x6c\x1a\xf7\xf8\xa2\xcb\xcf\
+\x48\xe4\x6a\x47\x14\xbf\xe8\x43\x7d\xbb\x1e\x01\xd6\xa6\xf0\xb6\
+\x13\x20\x32\xa5\x0c\xaa\x26\x1d\xcc\xe8\x11\x7b\x09\xb0\x1f\x84\
+\x2b\x7d\x5f\xff\x00\x5c\x45\x02\xec\x5a\x2c\xa5\x80\x16\x99\xcd\
+\x7d\x10\x0f\x03\x97\xd2\xd4\xb8\x17\xee\xc6\x01\x0b\x2f\x2a\x48\
+\xe4\x1a\x29\x8a\xdb\x69\x89\x34\xdd\x08\xb0\x31\xc3\x1c\x89\x05\
+\xce\xdd\x53\x72\x80\x89\xf1\x5f\xc0\x9f\x7b\x4b\xd0\x4b\xcf\xa2\
+\x74\xf2\x38\x6c\x5f\xe4\x82\x5f\x6b\x3b\x91\xd9\xd4\x0b\x91\xd5\
+\x18\x0e\x48\xad\xc2\xfd\xed\x33\x38\x20\xe0\x6c\x21\x39\xb3\x7e\
+\x1a\x0a\xe9\x0a\x9a\x5a\x75\x08\x10\x99\xc3\xc7\xc1\x92\x02\x2a\
+\x0a\x74\xc1\x84\x96\xc8\x56\xf8\x16\xd6\x79\x4e\x61\x4b\x74\x3e\
+\xa3\x1a\x3d\xbd\xfd\x30\xd0\x12\x49\x45\x14\x90\x39\xe3\xb1\xba\
+\x13\x19\x0d\x7a\x88\x85\x63\x61\x44\x37\x39\x3a\xb9\x12\x69\xbb\
+\x3d\x38\xc0\xff\x6b\x39\x39\x1d\xe4\x0e\x85\xa6\x17\x95\x4d\x5a\
+\xc8\x6c\xcd\xf0\xae\xf3\x44\xec\x8b\x2f\x44\x8e\xa2\x05\xfb\xd7\
+\xb9\x63\x8d\xa7\x78\xc4\xa6\xee\x4f\x28\x46\x72\x46\x15\xbc\x3d\
+\x26\x23\x66\x9b\x37\x92\x14\xcf\x91\x52\xab\x87\x93\xed\x78\x08\
+\x4c\x78\x88\x4f\x55\x21\xeb\xd3\xd9\x1c\xe0\x7d\x22\x8f\x1c\x59\
+\x3f\x1d\x29\x35\xbf\xa3\xa2\x4a\x83\xb0\x99\xe3\x10\x34\x5b\x84\
+\xe0\xa8\x7c\xe4\x15\xb6\x20\xe7\xc4\x42\x4c\xb1\x1c\x79\xaa\x9a\
+\xdb\xbb\xe1\x77\x38\x1d\x5e\x33\xad\x11\x47\x81\x1f\xe5\x8d\x88\
+\x51\x68\xe1\x32\x75\x22\x18\x1e\x83\x87\x59\x2a\xc8\x8f\xcc\xe3\
+\x80\x99\x47\x73\xc8\xa1\x10\x0f\xa4\xd5\x76\xa3\x92\x02\xe1\x1e\
+\x02\x04\x79\x89\x11\x1a\x2d\x47\x76\x41\x0b\x72\x8f\xf9\x41\x34\
+\x61\x24\xd0\x44\x01\x9f\xcf\xb2\xe0\xe7\x69\x8d\xd8\xf0\x59\xb8\
+\xf1\xa4\x1e\xd1\x45\x5a\x48\x9d\x38\x20\x2f\x43\x85\xa7\x9f\xfb\
+\x72\xc0\x8c\x43\x59\xe4\xe0\xc6\x77\x70\x4f\xdd\x8d\xea\x8a\x36\
+\x6c\xf5\x14\x60\xc3\x5c\x3b\x84\x5d\x2d\x42\x76\xe1\x73\x64\x1e\
+\xf6\x81\xad\xd5\x48\xa0\x4e\xd3\x85\x80\xe3\x8f\xe0\xf7\xf6\x24\
+\xc4\x6c\xf4\x40\x5c\x5e\x2d\x2e\x3d\xd5\xc2\x59\x2a\x64\x01\x79\
+\x7a\x39\x0a\x8e\xfb\x73\x80\xfb\x81\x34\x72\x20\x6c\x16\x52\xaa\
+\xf5\xa8\xab\x68\x46\x84\x97\x25\x3e\xf2\xb1\x47\x78\x7c\x29\x1e\
+\x14\xb7\xe1\x68\xa0\x04\x1b\xe6\xd8\x8f\x00\xe2\xf2\xd5\x38\x96\
+\xa4\x86\xef\x74\x2b\x44\x07\xbb\xe3\xfa\x23\x35\xa2\x9e\xb4\xc3\
+\x41\x6a\x43\x9b\x00\x83\xa2\xf4\x52\x14\x9d\x94\x71\x80\xdb\xbe\
+\x54\xb2\x77\xf3\x1c\x24\x57\x76\xa3\x5e\xd9\x84\x9d\x73\x27\x20\
+\x74\xbe\x03\xb6\x27\x28\x91\x53\xd6\xce\x06\x2c\x3e\x3a\x77\x04\
+\xe0\x71\x3c\x9f\xfd\x9e\x27\x1d\x8f\x8b\x6b\xa5\x88\xcd\xad\xc6\
+\xf9\xbc\x17\x90\xb8\x4e\x66\x57\x50\x96\x5e\x02\xc5\xa9\x25\x1c\
+\x30\x6d\x4f\x32\xf9\x24\xdc\x07\x77\x2a\xba\xd0\xa8\x6c\xc4\xee\
+\xf9\x56\xd8\xb4\xc0\x11\x11\x89\x15\xe8\xe8\x1a\xc0\x0a\x17\xf3\
+\x7f\x5c\x41\xac\x42\x07\x47\xa1\x29\x2e\x04\x3a\xe3\x87\x07\x95\
+\xf8\x36\x57\x03\x3b\x57\x7a\x94\x69\x1f\xab\xc8\x50\xa0\xe4\xcc\
+\x32\x0e\x90\xee\xba\x4d\x76\x6e\x99\x8f\xbb\x4a\x1d\x9a\x95\x0d\
+\xd8\xe3\x2b\x44\x58\x80\x13\xbe\xc8\xac\x83\xa3\xf9\xe0\xdf\x82\
+\xbf\x8a\xc8\x35\x83\x88\x7c\xdf\x01\x31\x99\xbf\xe1\x9b\x9c\x56\
+\x88\x5d\x45\x2c\x50\x93\x59\x84\x92\xb3\xcb\x39\xc0\x65\xdb\x4d\
+\xb2\x35\xc2\x17\x77\xcb\x74\x68\x29\x6f\xc0\x5e\xff\x89\xd8\xbc\
+\x50\x8a\x0e\xbd\x01\xe3\xcd\xf9\xff\xda\xe4\x3a\x7b\x0c\xb0\x30\
+\xe3\xe3\x4a\xba\x12\x91\x59\x6d\x10\xb9\x89\xd8\x4e\xdc\x90\x59\
+\x88\x67\x17\x56\x72\x80\x53\xf8\x4f\xe4\xe3\x08\x3f\xdc\x2a\xd5\
+\x42\x53\x5e\x8f\xfd\x32\x1b\x6c\x91\xb9\x8c\xaa\x9b\x5e\x4e\x53\
+\xe1\x54\x5a\x33\x6c\xdc\xc4\x2c\xd0\x9a\x5d\x80\xf2\xef\x56\x73\
+\xc0\xd4\x4d\x09\x24\x64\x87\x3f\x6e\x95\x74\xa2\xa3\x4c\x8d\x83\
+\xef\x89\xb1\x55\x26\x1d\x15\x70\x29\x4d\x89\x93\xa9\xf5\x10\xba\
+\x4b\x28\xc0\xa0\x33\xab\x00\xca\x2b\x6b\x86\x81\xd0\x1b\x64\xdd\
+\x0e\x19\x6e\x29\xda\xd1\xfd\xac\x06\x87\x96\xdb\xbf\x11\xf0\xe5\
+\x1d\x35\x2c\xa6\x3b\xb0\x3d\xbd\x27\x47\x0e\x55\xcc\x7a\x0e\x90\
+\x04\xc7\x91\xd5\x3b\x65\x48\x7c\xaa\x81\x5e\x59\xcb\x4e\x30\x0c\
+\x12\xfc\xd7\xff\x00\x43\x51\xf8\x3c\xae\xd7\x0a\x5c\xe9\x81\x30\
+\x32\x02\xc9\x95\xa3\xe2\x5a\x30\x07\xd8\x05\xc5\x92\xc0\x3d\x4b\
+\x71\xf3\x71\x1b\xdb\x6a\xd9\x19\xa3\xfd\xdd\x1f\x4a\x66\x28\xa3\
+\xa1\x37\x05\x90\x9b\x8f\xaa\xeb\x21\x1c\x60\x1f\x7c\x8d\x0c\xd0\
+\xde\xce\xc6\x1e\x65\xdc\xd7\xac\x09\x43\xc1\x6a\xe2\x43\x98\x3f\
+\x00\x25\xbb\x3d\x37\x94\x2f\x54\x06\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x04\xf3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xba\x49\x44\x41\x54\x78\xda\xad\x56\x5f\x4c\x5b\x65\
+\x14\xff\x7d\xb7\xbd\xb4\x40\x5d\x4b\x69\x07\x08\xcc\x6d\xec\x8f\
+\xb4\x6c\x8b\x63\x91\x39\x47\x36\x42\x36\x13\x35\x8b\x1a\x89\xc5\
+\x65\x3e\x74\x2f\xc6\x07\xff\xc4\xb8\x69\x62\xe2\x8b\x99\xa2\x2f\
+\x8b\x2f\x3e\xc1\x83\x8b\xa1\x66\x31\x1a\x1f\xfd\x13\x33\x32\xfe\
+\xac\x9d\x28\x6c\x73\x66\x0a\x6c\xc3\x16\x18\xb0\x51\x7a\x5b\xda\
+\xde\xde\xfb\x79\xee\xed\x6d\x69\xa1\x64\x2f\x9e\xf4\xb6\xf9\xbe\
+\x7b\xce\xef\x77\xbe\x73\xbe\x73\x4e\x19\x36\x90\xe8\x9e\x03\xbd\
+\x70\x3a\xfc\xcc\x22\x62\x43\x61\x0c\x3c\x95\x01\xee\x2f\xf5\xd9\
+\xc7\x83\xa7\x4b\xaa\x94\xda\x5c\xf2\xb6\xf6\x9b\xf6\xec\xf0\x95\
+\x9d\xec\x04\xe6\x22\x3a\x50\x91\xf0\xdc\x9a\x03\xa2\x09\xc9\xaf\
+\x7f\x01\x9f\x8d\x07\x1c\xe3\xc1\xee\x87\x12\x3c\xf0\xec\xef\x37\
+\xb5\xec\xf0\x59\x08\x5c\x09\x0d\x65\x41\x54\xbe\x86\x20\xbb\x56\
+\xe8\x9d\x06\xc0\xac\x65\x90\x2f\xdf\x21\x92\x58\xa0\xea\x5a\xa8\
+\x7b\x43\x82\x45\x02\x37\x7b\x9b\x7c\xd6\x93\x1d\x50\x82\x43\x50\
+\x4b\xf9\xc0\xd5\x35\x2e\x71\xfd\xc3\xca\x4c\x90\x87\xff\x85\x32\
+\x2b\x05\xaa\x0b\x48\xf2\xd6\x0b\x5e\x02\xf7\x10\xf8\x2b\x47\x91\
+\xd1\x3c\x67\xdc\x08\x8d\x76\x82\xf5\xde\xe7\xb0\x57\x49\x18\x98\
+\x28\x20\x1d\x8c\x40\x99\x8f\x07\x5c\x46\xb8\x74\x82\x59\xf2\xdc\
+\xe2\xdd\xe6\xab\xe8\xea\x80\x1c\x1a\xcc\x1a\x68\xe0\x85\x00\x6a\
+\xb1\xc7\x25\x4f\x44\x26\x8c\x72\x92\x0a\xcd\x42\x9e\x97\x02\x35\
+\xd7\xae\x76\xb3\x88\x77\x7f\xaf\xb5\xf9\x31\x7f\xe5\xcb\x47\x20\
+\x07\x07\x0d\x4e\x56\x1a\xa0\xd0\x73\x66\xec\x2b\x6b\x88\x0d\x92\
+\x95\xdf\xef\x21\xbd\x90\xe8\x63\xb3\xed\x47\x79\xd5\x1b\x27\x20\
+\x8f\x50\x58\x78\x06\x5c\x51\xc8\x79\xd2\x32\xd1\xa3\x2a\xc5\x00\
+\x26\x31\x7b\x32\x39\x0d\x9e\x26\x3d\x93\x99\x6e\x11\x3d\x0a\xbd\
+\x53\x32\xab\xe1\x13\x45\x08\x65\x66\x44\x87\x23\x60\x33\x9d\xc7\
+\xb9\xf3\xf9\x7d\x48\x0e\x8c\x00\x29\x1b\xfe\x2f\x31\xd5\x0a\x58\
+\xfe\xf3\x01\x58\xb8\xe3\x18\x77\x3d\xe3\xc1\x4a\xcc\x05\xfb\xc7\
+\x1f\x42\x4d\xa5\x20\x58\x2c\x98\xb9\xf8\x3d\xea\xba\x5e\x28\x32\
+\x5a\xec\x39\x8f\x8a\xf6\xa7\x50\x7e\xa8\x2d\xbf\xb7\x32\x74\x05\
+\xe9\x8f\xce\xc0\xfe\xd3\x25\xa8\xc9\x04\x04\x6b\x85\xbe\x1f\x3d\
+\x76\x04\x92\x94\x06\x9b\xee\x38\xce\xdd\x9d\x3b\x91\xac\x3b\x04\
+\xbb\xff\x55\x4c\xdb\xec\x10\x90\x82\x9a\x96\xa1\xca\x2a\x36\x0f\
+\x8e\xe8\x80\xb7\x8d\x62\xdb\x4a\x61\x58\x7c\xed\x34\x92\x17\xfa\
+\x60\x3d\xe5\x47\xf5\x57\xbd\x98\x7e\xb4\x09\x8d\x91\x09\xcc\x3d\
+\x7d\x58\xd7\xa9\x19\xbc\xac\x13\x44\x63\x32\xd8\xe4\xc1\xc3\xbc\
+\x76\x9f\x1d\xf3\x63\xcb\xd8\x32\x3c\x90\xf7\x34\xd9\x73\x96\x42\
+\x29\xa0\xe2\x87\x41\xd8\xda\xf6\x63\xae\x32\x4b\x50\x13\xe7\x98\
+\xb4\x08\x70\x37\x91\xcd\x44\x14\xdb\x53\x6a\x9e\xe0\xfe\xdb\x67\
+\x75\x1d\xe7\xf9\x1e\x84\xf7\x7a\xb1\xb2\x9c\x00\x1b\xb3\x3b\xf9\
+\xce\x8e\x5d\x58\x1e\xfa\x03\xcb\xf5\x7b\xb0\x73\x34\x98\x27\x49\
+\x9f\x7b\x17\x15\x3f\x86\x60\x27\x82\xb0\x35\x4b\x50\x9f\xe4\x98\
+\x70\x6e\x42\x8d\x03\xb8\x17\x96\x8a\x08\x0a\x65\xa1\xb6\x12\xe1\
+\x28\xd5\xc6\x68\x95\x8b\x3f\x7e\x78\x1b\x6e\x4d\xa6\x50\x1e\x9d\
+\x47\xec\x41\x0c\xad\x52\x4c\xcf\x81\xe2\x7f\x11\x8f\xfc\x7c\x95\
+\x08\x5a\x31\x6d\x10\x34\x12\xc1\xcc\xa7\x9f\x21\xfc\xc1\x59\xd4\
+\x7f\xd2\x83\xba\xf7\xcf\x60\xbe\xce\x06\xf7\x8c\x84\x50\x4b\x0b\
+\xb6\x2e\xde\xd6\xf5\xca\x6d\x95\xf8\x3b\x1c\x07\x0b\x3a\x5d\x7c\
+\xfb\x6e\x37\xd2\xef\x9c\x2b\x4a\xea\xb8\xd7\x83\x4d\x77\x6f\xc1\
+\x31\x3c\x0e\x47\x8b\x07\x53\xe5\x0c\x19\xba\xfa\x0d\xbf\x8e\xac\
+\x4b\xf2\xfc\x5b\xa7\xb1\x25\x74\x5d\x27\x68\x5e\x9a\x86\x22\x5a\
+\x20\x50\xce\x6e\xce\x4a\x60\x57\xaa\xaa\xb9\x67\x5f\x23\x6e\x8c\
+\x4d\xa1\xfc\xc4\x4b\xba\x51\xe2\xdb\x6f\xb0\xdb\x51\x06\x89\x92\
+\x3c\x25\x6e\x82\xd5\x61\x47\xed\xdc\x5d\x38\x6d\x16\xdc\x9c\x5a\
+\x80\xe5\xd9\xe7\xb2\x7a\xa1\x20\x1a\x64\x09\x12\x01\xc6\x36\xd7\
+\x63\x29\x1c\x41\x1b\xe5\x8a\x2a\x84\xca\x88\xe1\xc6\x22\xe5\x60\
+\xc0\xe6\xe0\x4f\x1e\x6c\x42\xea\xd6\x24\x15\x96\x9a\x2d\x16\xb3\
+\x48\xad\x45\xd0\x41\x04\x5a\x73\xda\xe7\x82\xa0\x17\xb5\xd6\xa2\
+\x90\x49\x53\x61\xa9\x7a\xe1\x69\xfb\xcc\xe8\xb8\x5a\x81\xaa\x46\
+\x2b\xa7\xfb\x81\xdf\x16\x88\xe0\x3b\x26\xf6\x36\xd4\xb8\xfc\xcd\
+\x55\x22\xe4\x58\xdc\x68\xc0\x05\xfd\x66\xa3\xdf\x52\x3a\xc8\x3a\
+\x60\x16\x18\xae\x2f\x27\x31\x97\x96\xfb\x74\xba\x8b\x30\xf7\x37\
+\xd4\xb8\x7d\x7b\x6d\xd4\x0d\xa5\x15\xf2\x9e\x6d\x08\x80\x35\xa3\
+\x41\x5f\x1b\x2d\x42\xb3\x32\xd3\xf7\xb8\x94\x44\x44\x96\x03\x5d\
+\xaa\xdc\x9d\xef\x6a\x17\x88\x64\xdb\x66\x97\xef\x89\x4a\x33\xd2\
+\xda\x49\x72\x53\xac\x00\x60\xdd\x09\xf2\xef\xb3\xe0\xda\x70\x1d\
+\x4d\xa4\x70\x47\xce\x04\x4e\x71\x79\xb5\x5d\xe7\xa4\x0f\x42\xff\
+\x0e\x97\xdb\x77\xc0\x4a\x2d\x37\x6e\x90\xf0\xc2\xf0\xf0\x55\xe8\
+\x82\xd3\xe9\xe0\xa4\x1b\x5a\x49\xe2\x76\x46\x0e\xf8\xb9\xb2\x7e\
+\xe0\xe4\xe4\x4b\x22\xd9\xe5\x72\xf9\x0e\x9a\x0d\x92\x22\x95\xf5\
+\x61\xd3\x12\x5c\x46\xe0\x23\x04\xfe\x8f\xa2\x04\x5e\x87\xb2\xf1\
+\xc8\xcc\xc9\x17\x60\xfd\xcd\xd5\x2e\x5f\xbb\x60\x86\x9c\x90\x56\
+\x4f\xb2\x26\x3a\xda\x48\xd0\xba\xfa\x65\x6a\x90\x7f\xa9\x72\xe0\
+\x4d\xa8\x0f\x1f\xfa\x39\xf9\x1c\xe8\x75\x0b\xa2\x5f\x2c\x35\x70\
+\x0a\x24\x43\x64\xf7\xa0\xf6\xbd\x07\x5e\xf2\x6f\xcb\x7f\x9d\xce\
+\x24\x20\x63\x8f\x73\xbb\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\xac\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x73\x49\x44\x41\x54\x78\xda\xad\x95\x7b\x4c\x14\x57\
+\x14\xc6\xbf\xd9\xdd\xd9\xf7\xc3\x5d\x6c\xbb\x80\x80\x44\x34\xa1\
+\x51\xf9\x87\xfa\x47\x6b\x8c\xa9\x69\xa5\x48\x90\x56\x28\x88\xda\
+\x60\xa8\x95\x4a\xd5\x00\xb2\x21\x22\x01\xa4\xd5\x80\xb6\x98\xda\
+\xda\x22\x0f\x11\xa4\x80\x55\xdb\xa6\x96\xa4\xd6\xd8\x1a\x4a\xda\
+\x48\x49\x94\x48\x50\x7c\x50\xb1\x74\x21\xe9\xf2\x58\xf6\xc5\xce\
+\xec\x4e\xef\x0c\x2c\x41\x54\x76\x9b\x3a\x9b\x9b\x99\xd9\x7b\xcf\
+\xf7\x9b\xf3\x9d\x73\x67\x28\xfc\x87\xa3\xbe\xf6\x2c\xc7\x9f\x33\
+\x32\xdf\xa6\x02\x8d\x09\x78\xe1\xc7\x15\x27\x9a\xb7\x65\xa6\xa6\
+\xf1\xd7\x67\x6a\x5b\x5a\x72\x4d\xd9\x9b\x9f\x29\xe0\x6c\xcb\x05\
+\x2e\x61\x63\x1c\x44\x22\x0a\xe7\x9a\x2f\x62\x6b\x46\x4a\x40\xb1\
+\x01\x2d\x2a\x3b\x50\xfe\xe9\xee\xfc\x5d\xbb\xc5\x12\x0a\x12\x4a\
+\x04\xb3\x79\x18\xcd\x8d\xe7\x8f\x17\x96\xec\xdb\xf3\x4c\x00\x0d\
+\xa7\x5b\xb8\x6d\xef\xa4\xc2\xe9\xb4\x43\x44\x7e\x32\x85\x02\xc7\
+\x3e\xa9\x42\x4e\x5e\x96\xdf\x78\xbf\x0b\x0a\x72\x4a\x8a\x0f\x94\
+\xe5\x95\x28\x94\x2a\xb8\x99\x49\x70\x9c\x08\x0a\x99\x14\x77\xef\
+\xf5\xa3\xa1\xba\xa9\xa4\xac\xbc\xa8\xf4\x7f\x01\x3e\x3b\x56\xc3\
+\x65\xef\xcd\xc4\xa4\xdb\x0d\x8a\xa2\xa6\x83\x28\xd0\xb4\x04\xa5\
+\xc5\x87\x51\x72\x70\x3f\xe5\x17\x50\x64\xfa\x50\xeb\xf2\x38\x5e\
+\xf1\x38\xd8\x48\xab\xcd\xb1\xe4\x85\x90\xa0\x58\x8d\x4e\xc3\x18\
+\x8d\xc6\x85\xaf\xc5\xad\x8b\x09\x09\x36\x82\x61\x18\x52\x60\xd1\
+\x54\x94\xd7\x0b\x31\x4d\xa3\xb7\xb7\x0f\x57\x7e\xba\x7a\xc3\x3a\
+\x3e\xf6\xcf\xf8\xc8\x38\x3d\x38\x34\xfc\x87\x46\xab\xbd\x27\xa1\
+\xbc\xfd\x32\xa5\xb2\xe3\x68\xe5\x21\x2b\x55\x79\xe4\xf8\x45\xb5\
+\x46\x13\x1a\xbe\x78\x51\xb0\x94\xa6\x35\x21\x61\xa1\x4a\xa9\x44\
+\x22\x88\x19\x82\x0c\x50\xab\x55\x44\xcf\xfb\xd8\x93\xf9\x60\x23\
+\xa3\x63\xb0\x5b\xad\x60\x3d\x5e\x32\x58\x3c\x1c\x18\x74\x4c\xba\
+\x99\x89\x81\xfb\x0f\xcc\x43\xc3\x96\x41\xaa\xf6\x64\x23\x97\x92\
+\x9e\x08\x97\xc3\x0d\x85\x52\x01\xb5\x4a\xf5\x88\x10\xc7\x71\xc2\
+\x10\xd2\x9d\xb6\xc8\x77\x3f\x93\xd1\xac\xc3\xe9\xb0\x61\xc2\xe1\
+\x82\x4a\xa9\x46\xf5\x17\x35\xa0\x3e\x3a\x58\x71\x32\x21\x31\x6e\
+\xc7\xca\x98\x15\x18\x19\x1b\x81\x44\x44\x43\x22\x11\x43\x44\xb2\
+\x10\x13\x41\xb1\x58\x3c\x23\x3e\x1b\xe0\x83\xf0\x67\xd6\xe3\x81\
+\x97\x65\xe1\x21\x99\x32\xe4\x5a\xaf\xd3\xa1\x8f\x34\xc1\x99\x9a\
+\xc6\x6a\x21\xa2\x30\xbf\xe8\xc7\x94\xad\x69\xaf\xc7\xac\x7c\x11\
+\x36\x9b\x8d\x00\x24\x82\x30\xff\x84\x3e\x61\x9f\xf8\xdc\xcc\xf8\
+\xe1\xf5\x7a\xc0\xb0\x1e\xb0\xa4\x4e\x5a\xad\x16\x57\x7e\x69\x47\
+\xdd\x97\x75\x97\x9a\x5a\xeb\xd7\x0b\x51\x7b\xb3\xf2\x14\x72\xb5\
+\xfc\xdc\xce\xec\x9d\xf1\x91\x8b\xc3\x48\xbf\x3b\x05\xc8\x7c\x80\
+\xa9\x5a\x7b\x85\xe1\x21\xfe\x33\x2c\x23\xd8\x7b\xbd\xbb\x1b\x9b\
+\xe2\xd3\xda\xf4\x0b\x74\xc9\x5d\x3d\xbf\x3b\x1f\x89\x32\xe5\x15\
+\x36\xe5\x9b\x72\xd2\x17\x3e\x1f\x44\x7a\x9e\x74\x0d\x11\xf5\xf9\
+\x3c\xd7\x6f\xdf\xd3\x7b\x88\x25\x2c\xcb\x41\xa1\x90\xa2\xef\xd6\
+\x6d\x24\x6e\x48\xfe\xea\xf6\xfd\x9b\x5b\x9e\xba\x0f\x72\x3f\x30\
+\x7d\xf3\xfe\x9e\xf7\x92\xa2\x96\x2e\x01\xc3\xf7\x3e\x11\xf6\x65\
+\xf2\x64\x80\x17\x52\x29\x8d\x9e\x9e\x5e\xbc\x15\x97\xf2\x6d\xdf\
+\x5f\x3d\x6f\xfa\xdd\x68\x6b\x5e\x5e\xc7\x5d\xed\xb8\x8c\x49\x97\
+\x0b\x22\x52\x0b\x6a\x56\x26\x73\x01\x2c\x29\xae\x5c\x2e\xc7\x8a\
+\xe8\x55\xb8\x79\xab\xf3\x31\xbd\x27\x02\x56\xc7\xae\xe5\xda\x3b\
+\x7f\x86\xdd\xe1\x10\x6a\x21\x00\xf8\x3a\xf8\xc4\xa7\x01\xbc\xff\
+\x7c\x07\xa9\x94\x4a\xc4\xc6\xac\x46\x57\x77\x47\x60\x00\xd2\xbf\
+\xdc\xbb\x59\x99\xb0\x4e\x4c\x4c\x01\x78\x9b\x08\x60\x66\x3f\xf0\
+\x35\x21\x83\xe1\x01\x24\x03\xad\x46\x83\x1d\xdb\xb3\x50\x53\x5f\
+\x15\x10\xe0\xa5\xaf\x5b\xcf\x5f\x4b\x4c\x4a\x80\xdd\x6e\x87\x44\
+\x2c\x21\x6a\x94\xf0\x6a\x50\xca\x64\xc2\x02\x3b\xb1\x8e\xef\x7b\
+\xf0\x16\x31\x2c\xf4\x06\x3d\x8e\x94\x57\xc2\x54\x90\xbb\x8a\x4c\
+\x77\xfa\x03\x7c\xde\xd5\x79\x7d\x57\x58\x64\x28\x38\x86\x23\x1b\
+\x4e\x04\x8d\x46\x05\x99\x4c\x0e\x8b\xc5\x22\x64\xa4\x23\x1b\xc9\
+\x49\xec\xe3\xdb\xd9\x4d\x40\xb4\x54\x8a\xa1\x87\xc3\x58\x1e\x13\
+\x7d\x82\xc4\x67\xfb\x03\xfc\x40\xac\x88\xbf\x7b\xa7\x0f\xb4\x4a\
+\x8b\x05\x1a\x25\xe9\x12\x39\x86\x07\xcd\x58\xff\xea\x1b\xa3\x21\
+\xe1\x8b\xf0\xdd\xf7\x17\xf4\x34\xe9\x1c\x7e\x63\x8d\xbb\x6c\x70\
+\xdb\x27\x21\x57\xca\x10\x6a\x0c\x6e\x23\xf1\x1b\xe6\x05\x44\x45\
+\x44\x3f\xf8\xed\xc6\xb5\x70\xcb\x90\x19\x5a\xbd\x8e\xd8\x22\x45\
+\x72\x42\x2a\x2e\xff\x7a\xa9\x9e\x4c\x6f\x9f\x5e\x76\x2a\x39\x29\
+\x35\xa3\xaa\xae\x4a\xa8\xc1\xe8\xe8\x28\x96\x2e\x8b\xe2\x5f\x2d\
+\x03\x64\x2e\x62\x5e\x80\xd1\x10\xc1\x99\x2d\x7f\xa2\x7f\xe0\x6f\
+\x14\x9b\xf6\xa3\xb1\xf5\x74\x0b\xf9\xfb\x69\x1f\xf8\xa6\x2d\x9b\
+\x33\xd2\xcb\x0e\x97\x22\x32\x22\x1c\xcb\x22\x96\xe3\xce\x40\x0f\
+\x35\x2f\xc0\xa0\x7a\xce\xb2\x71\x53\x92\xe1\x54\x43\x75\x3b\xb9\
+\x5d\x03\xff\x87\x82\x74\x41\x9b\x69\x5f\xc1\xda\x8a\xa3\x87\x46\
+\xc8\x7d\xd0\xec\xc9\x7f\x01\x0d\x58\xe2\x1f\xdf\x48\x2a\x0c\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xf3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xba\x49\x44\x41\x54\x78\xda\xad\x95\x7d\x4c\x55\x65\
+\x1c\xc7\xbf\xe7\xc2\x45\x05\x41\x38\x17\x76\xb9\x60\x12\x17\xb8\
+\x2a\x5d\xb8\xa1\x29\xb2\x8c\xa6\xb5\x36\xd9\xda\x68\x61\x7b\x4e\
+\x9b\xe6\xd0\x56\x30\xa6\xb9\xe5\x56\x6d\xe6\x1f\xe5\xa6\xfe\xe5\
+\x4b\x86\xbd\x40\x89\xce\xe7\x38\x57\x8b\x36\xab\x59\xb4\x68\x35\
+\x5b\xe5\xc2\xc0\x8c\x19\x6c\xf9\x32\x45\xe1\x0f\x5f\xef\x79\x3f\
+\xfe\x9e\x73\xb3\x8c\x7f\x3c\x20\xdf\xed\xec\x39\xf7\xdc\xb3\xef\
+\xe7\xf9\x7d\x9f\xdf\xf3\x1c\x09\xe3\x54\xd3\x35\xd6\x51\x19\x9e\
+\xd9\x3c\x30\x72\xa3\xf3\xe4\xea\xd0\x5a\xdc\xa7\xa4\xbb\x7f\x24\
+\x3e\x1e\xe3\x2d\xf5\x32\x2b\xca\x07\x32\x75\x60\xc3\x67\xa3\xea\
+\xa9\x17\x0b\x94\x29\x01\xdc\x31\xcf\xcc\x01\x86\xaf\x01\x41\x7a\
+\xb6\x38\x0b\x68\xfb\xe4\xa2\x3a\xd8\x5a\x34\x69\x88\x74\xb7\x79\
+\x56\x1e\xd0\x7f\x7c\x08\x37\x86\xfb\x51\xf0\x78\x23\x32\xb2\x81\
+\x45\xd3\x81\x16\x3e\xac\x0e\x6d\x2c\x9b\x14\x44\x12\x99\xbf\xb4\
+\x54\x6e\x16\x33\x1f\xf8\x79\x08\x3b\x1a\xca\x3d\xe8\xb2\x47\xeb\
+\xed\x27\x0e\xf7\x06\xac\x5b\x04\xa1\x4a\x5a\x0f\x0c\xaa\x7f\xbf\
+\x36\x6f\xc2\x10\x69\xd5\x31\xcd\x6d\x58\x30\x0d\x67\xae\x03\x97\
+\x8e\x76\xe3\xdd\xb6\x46\x0f\x10\x8f\x96\xba\xcf\xf5\x0e\x43\xa3\
+\xb8\x5c\x07\x58\x92\xe3\xa2\xb5\xeb\x94\x7a\x61\x73\xd5\x84\x20\
+\xd2\xc2\xce\xcb\x1d\x8b\xe7\x17\x34\x97\x44\x80\x24\x41\xbe\x7f\
+\xb9\xde\xbe\x32\x72\x21\x2d\x52\xbf\x12\x75\xaf\x6f\x83\x7e\x13\
+\xb0\x5c\x82\xd0\x55\x97\x6b\x63\x7d\x67\x9f\x7a\xf1\xed\x47\x7c\
+\x43\xbc\xd9\x56\xb7\x9f\xe5\x75\xd5\x0f\xb0\x39\xc5\x80\x1d\x00\
+\x68\xc2\x70\xa8\x8b\x0c\x8a\xc7\xb0\xe9\xde\x02\x4c\x1a\x25\x7a\
+\x7b\xa9\x6c\xa2\xad\xe3\x37\x75\x74\x7b\xad\x2f\xc8\xbf\x5d\x54\
+\xb9\x6b\x88\xd7\x12\xa4\xa4\x28\x08\x5d\xa3\x59\x13\xc5\x12\xe6\
+\x76\xaa\x02\xc7\x76\x61\x3a\x2e\xc1\x02\x58\x56\xa8\xa3\xed\xbd\
+\x5f\xd4\xab\x3b\x1f\xbb\x27\xe4\x7f\xfb\x20\xb6\xe3\x34\xaf\x4d\
+\x44\x59\x71\x24\x03\x9a\x49\x0f\xac\x54\x05\xb6\x67\x9c\x02\xd8\
+\xa6\x09\x27\x90\x86\x27\x0b\x2d\x6c\xd8\xf7\x93\x7a\x6d\xef\x72\
+\xc5\x37\x40\x28\xba\xf5\x77\xbe\x28\xf1\x20\x8b\x14\x66\x43\xd7\
+\x85\xb9\xf3\x9f\xb9\x6d\x53\x55\x74\x4f\xe5\x59\x52\x00\x2b\x8a\
+\x4d\x6c\x6c\xff\x51\x4d\xbe\xbf\x42\xf1\x0d\x10\x2a\xd9\xf2\x2b\
+\xaf\x49\x94\xb2\x48\x44\x86\xa6\x3b\xde\xac\x45\x15\x29\x88\x18\
+\x1d\x98\xb4\x28\x36\x02\x68\x98\xe3\x60\xd3\x3b\xdf\xa9\xe6\xfe\
+\x46\xc5\x37\x40\x68\xf6\x1b\xc7\x79\x22\x5e\xc6\x0a\x0a\x73\xa1\
+\x8b\x19\x9b\x74\x11\xc0\xf2\xaa\x20\x00\x81\x74\x5a\x20\xc7\x95\
+\xf0\x4c\x69\x00\x9b\x76\xf7\xa8\xee\xa1\x26\xc5\x37\x40\x28\xfc\
+\x6a\x2f\xaf\xaa\xaa\x60\xf9\x61\x19\x49\xcb\x84\x65\x50\x05\x64\
+\x6a\x0a\x80\xa8\xc8\xeb\x2e\x0b\x26\x5c\x34\x95\xa5\x63\xf3\xee\
+\x6f\x54\x1c\x51\x14\xdf\x00\xa1\xfc\xf5\xdf\xf2\x58\x55\x39\x0b\
+\x85\x73\x69\xe1\xed\x54\xfe\xff\x54\x63\x90\xb9\x18\x75\xea\x04\
+\x9d\xac\x58\x45\x10\xdb\xf6\x7c\xad\xa2\x7b\x95\xe2\x1b\x20\x94\
+\xd7\xf2\x15\x8f\xc6\xcb\xd9\xac\x70\x08\x5a\x92\xb2\xa7\x8d\x61\
+\x78\x31\x39\xde\xa8\x51\x4b\x27\x29\x3a\xd3\x91\xa0\x94\xa5\xa1\
+\xbd\xbd\x47\xc5\xd1\x35\x8a\x6f\x80\x50\xce\xda\xcf\xf9\xec\x87\
+\x62\x2c\x8b\x20\x86\x6e\xc0\x30\xa9\x02\x8a\xcb\x20\x73\x8d\x46\
+\xcd\x12\x6b\x42\xcf\x68\xcf\x3c\x1f\x4d\xc7\xa1\x0f\x28\xae\x2f\
+\xd7\x29\xbe\x01\x42\x33\x5e\xf8\x94\x17\xcd\xaf\x60\xc1\x90\x4c\
+\x51\x59\x64\xea\x20\x49\x67\xc8\xcd\xc1\xbf\x60\xd1\xae\xb4\xd3\
+\xa7\xd1\x87\x84\x8e\xdf\x8c\x0c\x2c\x2c\xce\xc4\x89\xee\x1f\x0e\
+\x4c\x08\xe0\x41\xd8\x61\x9e\x5d\x39\x97\x05\x64\x99\xb2\x37\xa0\
+\x93\xc3\xad\x3f\xcf\x00\x97\x47\x9e\xa6\x40\xce\x51\x6e\x2b\xa9\
+\x97\x35\x38\xce\xb3\x74\xb6\x48\x13\x06\x08\x05\x9b\x0e\xf2\xe0\
+\xbc\x18\xb3\xe5\x10\x74\xd1\x4a\x67\xcf\x03\xe7\xcf\xd5\xa0\x7b\
+\x4d\xdf\xf8\x77\x27\x05\xf0\xd4\xf8\x11\x47\x6c\x2e\x43\x5e\x08\
+\x18\x1d\x03\x4e\xff\xf1\x0a\xbe\x58\xb7\x6b\xea\x00\x42\x0d\x1f\
+\x72\x94\x57\x30\x4c\x9f\x01\xf4\x9d\x78\x13\xc7\x5a\xde\x9a\x5a\
+\x80\xd0\x53\xfb\x38\xe2\x71\x86\x81\xfe\x3e\x02\xd4\x4c\x3d\x40\
+\x68\xf9\xde\x2e\x5a\xd0\x6a\xf4\xb4\x3e\x3c\xfe\xaf\xdb\x92\x53\
+\xcf\x5d\x8b\xd4\x8d\x7a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x06\x2c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xf3\x49\x44\x41\x54\x78\xda\x8d\x56\x6b\x6c\x14\x55\
+\x14\xfe\xee\xdc\x99\x9d\x99\xed\x63\xb7\x2d\x6d\x2d\x10\xb4\x56\
+\xc1\x3e\x10\x23\xa8\x04\x2c\x20\x51\x13\x50\x13\x05\x1a\x1e\x4a\
+\x79\x44\x05\x0b\x8a\x44\x30\x10\xf9\x81\xd1\x04\xa2\x12\x84\xd0\
+\xb5\x88\x68\x45\xd0\x6a\x2b\x26\x62\x20\x02\x51\x94\xa2\x51\x54\
+\x52\xdb\xa2\x68\xd3\xaa\x20\xd0\x07\x6d\x77\xed\xb2\x3b\xbb\x33\
+\x73\x3d\x33\xdb\x07\x0d\x56\xbd\xd9\x99\xd9\x9d\x7b\xee\x77\xce\
+\xf9\xce\x77\xcf\x5d\x86\x7f\x19\x7c\x85\x52\x6c\x99\xd6\x3c\x84\
+\xec\x19\x88\x20\x17\xc3\x7a\x27\x3a\xe8\xd2\xd1\x82\x54\xe9\x10\
+\x97\x79\x95\x55\x1e\x3f\x3e\x14\x06\xfb\xa7\x97\xf2\x4a\xa5\xc8\
+\xec\x8e\xd7\xf9\xb2\x93\xa4\x7b\x6e\x1d\x8d\x3b\xf3\x0b\x70\x43\
+\xc6\x70\xf8\xf5\x34\x77\xbe\x3b\xd2\x85\xa6\x4b\xe7\x51\xfb\xd3\
+\x69\x1c\xf9\xe1\x17\x04\x5b\xc3\xb6\xec\x57\xc6\x99\x3b\xe2\x0d\
+\xff\xed\xa0\xcc\x53\x8e\xcb\xb1\xb2\x35\x8f\xdc\x8b\x07\x0a\x27\
+\x23\x43\xcb\x02\x13\x1c\xa6\x6d\xc1\x86\x70\x4d\x24\x5a\x26\x4b\
+\x1c\x82\x59\xb8\x14\x6d\xc3\x81\xc6\x13\x78\x65\xef\x61\xc0\xeb\
+\x09\x20\x10\x5b\x31\xb4\x83\xc7\x50\x9d\x9d\xe1\x9b\xf3\xea\x63\
+\xa5\x28\x4a\x2b\x24\x50\x06\x5b\x08\x28\xcc\x43\x80\x32\x01\x4b\
+\xe8\x11\x31\x24\x33\x05\x61\x7a\xc2\x36\xc1\x19\x03\x97\x6c\x34\
+\x74\x35\xe2\xe9\x5d\x7b\xd0\x7a\x29\x58\x83\x5d\x28\xb9\xca\x01\
+\x7b\x4a\x29\xcf\xf6\x25\x95\xed\x59\xb9\x0a\xd7\x78\x46\xc1\xb0\
+\x28\x5e\x61\x22\x2a\xce\xa3\xd3\xe8\xee\x37\xec\x7b\x3a\xb9\xa4\
+\xa9\x7e\xe8\x6c\x24\x18\x39\x57\x25\x86\x0b\xb1\xdf\x51\xba\x63\
+\x1b\x5a\x83\xe1\x80\xd8\x1e\x5f\xd1\x6f\xaf\xae\x56\x8b\x8c\xb0\
+\x51\xbf\x7f\xc3\x7a\xe4\xa5\xe4\x23\x6a\xf6\xa0\x35\xfa\x33\x5a\
+\xad\x26\x68\x48\x23\x23\x76\x35\x99\xc2\xf9\x08\xc4\x58\x10\xa3\
+\xd4\x31\xc8\xf4\x14\x40\xe1\x3a\xce\x04\xeb\x31\xeb\xc5\x4d\x50\
+\x93\xd4\xb1\xc6\x56\xa3\x21\xb1\x6c\x19\xac\x75\x0f\xcf\x92\x4a\
+\xc7\xcd\xc5\xf9\x48\x13\x7e\x8f\x9e\x82\x02\xa2\x85\xa8\x10\xbd\
+\xbc\xff\xd3\x90\x88\x1e\x9f\xa6\x63\xe6\xdb\x15\x58\x38\x21\x0f\
+\xcd\xed\x2a\x2a\x67\xbc\x80\xdd\xa7\xf6\x61\xf3\xbe\xfd\x36\x76\
+\x12\x83\xda\x1a\xb5\x58\x97\xd9\x97\xc7\xd6\xbd\x8e\xdf\xc2\x3f\
+\xa2\x9d\xd2\x94\x25\x9d\x02\x96\xdc\x30\xe5\x21\x1c\x38\xdc\xab\
+\xb2\x8c\x87\xde\xd9\x0d\xf1\x2c\xd9\x44\x1c\x2a\x80\xb9\x47\x27\
+\xe2\xb9\x3b\x56\x60\xda\xe6\xc7\x11\x31\xc5\x14\x26\xad\x56\xca\
+\x17\x4d\x9f\x5a\xb6\x64\xd2\x0c\xfc\xda\x73\x12\x1a\xf7\x82\x59\
+\xa6\x0b\x3b\xc0\xf7\x95\xbf\x12\x91\xcb\x5c\x42\xc9\xde\xb7\x5c\
+\xf0\x48\x38\x02\x93\xea\x95\x92\x9c\x82\x8c\x0a\x1d\x07\xe7\xbf\
+\x84\x9d\xc7\x3f\xc6\xdb\x9f\x7d\x11\x60\x78\x12\xcd\x6f\xae\x5a\
+\x9d\x2b\x94\x76\x97\x96\x48\x2c\x84\x34\x3d\x05\xb6\x2d\x5c\x60\
+\xc3\x14\xe0\xf0\x82\xcb\x91\x7e\x89\xa6\x6a\x2a\x66\xee\xde\x09\
+\xb1\x8e\x6a\x60\xc4\x48\x0c\x36\x54\x8f\x86\x23\x17\xf6\xe3\xfe\
+\x9a\xd9\xd8\x35\x67\x21\xac\xe8\x30\x2c\xdd\xb6\xb5\x85\x61\x39\
+\xc4\xbb\x1b\x97\x23\x1a\x31\x48\xc6\x1e\x78\xb9\x85\xf7\x1a\x4e\
+\x60\xe2\x88\x31\xd0\x25\xd5\x95\x29\x7a\x33\xa0\xc0\xa1\x79\x24\
+\x2c\xfa\xa0\xca\x8d\xdc\x8c\x53\xa6\xf4\x4e\x21\xaa\x0e\x9f\xab\
+\x21\xf0\x12\x54\x96\x2c\x83\x11\x8f\x41\xd3\x55\x2c\xd8\x58\x01\
+\xa6\xaf\xe7\xa2\x72\xd5\x13\x08\x5d\x8e\x40\xe5\x1c\xa5\xd5\xaf\
+\xe3\x8f\xd9\x17\x31\x6a\xff\x35\x78\x60\x4a\x06\x74\x55\xa1\x6c\
+\xe0\x82\xcb\x1e\x81\xf7\x0e\xb4\x42\xac\xa5\xdc\x2c\xe1\xa4\x43\
+\xef\x19\x0e\x9f\xad\xc1\x83\x1f\x95\x60\xea\xcd\x05\x28\xbd\x71\
+\x3a\xc2\xb1\x08\x52\xbd\x3a\x16\x6f\x7b\x0d\x2c\x7d\x93\x57\xec\
+\x58\xb2\x14\x46\x54\x60\xd9\x27\x01\x18\xf3\x6d\x84\x8c\x10\x52\
+\x7d\xa9\x60\xaf\x31\x2c\xbe\x7f\x24\x2c\x53\x22\x8a\x6c\x54\x1e\
+\x38\x07\xb1\xc6\x01\x27\x60\x29\x51\x96\x4f\x09\x7c\x16\x81\xdf\
+\x5a\x90\x81\x6b\x73\x74\xe4\xa8\xc3\x50\xa8\x4c\x86\xaa\x31\x3c\
+\x51\xf1\x26\x98\xb6\x41\x12\x7b\x9e\x5a\x8b\x13\xed\x47\xb0\xb7\
+\xb6\x0e\x1d\xf3\x4c\xfc\x11\x3a\x0b\x5d\xd1\x90\xe9\xcb\x04\xa3\
+\x32\x15\xde\x04\x34\x9e\x46\x2f\xb8\x00\xe3\x89\x82\x0f\x80\x0f\
+\x43\x5e\x0e\x47\x9c\xe6\x4c\x11\x47\xa6\x3c\x12\x53\xb3\x66\xa2\
+\x74\xfb\xcb\x60\x29\xcf\x6b\xcd\x0b\x67\xe7\xe7\xb6\x1a\xe7\xd1\
+\xd5\x69\xe3\xd8\xe9\x76\x58\x4b\x04\xda\x22\xed\xf0\x70\x05\xfe\
+\x64\x7f\xa2\x04\x1e\xea\x0c\xc4\x95\x03\xee\xd0\x32\x08\x7c\x38\
+\xf5\x2a\x02\x77\xca\xc5\x98\x86\x9e\x58\x18\x23\xb4\x51\x78\xe7\
+\xc3\x9f\x5a\x58\xf6\x66\x6f\xf9\x98\xf1\x49\x65\xc3\x33\x55\x97\
+\xe7\x33\x4d\x7f\xa1\xee\x5c\x10\xe6\xe3\x02\x5d\x97\xbb\x88\x1a\
+\x4e\x92\x94\xc1\x79\xef\x53\xe1\x38\x72\xf6\x23\xe2\x7c\x16\xc6\
+\x13\x2d\xd7\x65\x7b\xdd\xc8\x5d\x85\x71\xc0\x22\xfa\x24\xa2\xef\
+\xcf\x36\x03\x67\xbe\x0f\x07\xd8\xf0\x2d\x29\xc5\x49\xe9\xd2\x97\
+\x13\x6e\xf3\x23\x16\xb3\xa1\x28\x0c\x0d\x0d\x41\x34\x5e\x0c\xc2\
+\x5e\x29\xa8\xf8\xd4\x87\x08\x5c\x93\x35\x28\x54\xf0\x2f\x2e\x1c\
+\xc4\xcc\xea\xfb\x30\x81\xc0\x7d\x59\xc9\x04\x38\xb0\x11\x9d\x6f\
+\x5e\x4a\x43\xd5\x38\x4e\x7e\xdb\x85\x70\xa7\x3d\xc5\x25\x33\x67\
+\x4b\x92\x35\x6e\x52\xaa\xe4\xd5\x14\x57\xff\x5c\x66\x44\x57\x14\
+\x9f\x9f\x6a\x83\xbd\x8a\xb4\x1e\x33\xe1\xd1\x64\x7c\xd3\x76\x14\
+\xd3\xaa\xee\xc1\xed\x05\xe9\xf0\x67\xa5\xf4\x83\x3b\x77\x55\xf4\
+\x65\x21\x21\x1c\x89\xa1\xee\xab\x90\x7d\xe1\x99\x70\xa2\x5a\xb9\
+\x81\x94\x22\xc6\x51\x7f\xf3\xc4\x74\xca\x31\xc1\x25\xa7\xa9\xf6\
+\xb6\x30\x6a\x1b\x3b\x60\x3f\x2d\xf0\x5d\xc7\x31\x14\xef\xbb\x0b\
+\x77\xdf\x52\x48\x6d\xb4\x27\x21\xd3\x2b\x22\x57\x44\x42\xca\x8c\
+\x82\xab\xfb\xba\xd3\x51\xda\xd8\x96\xb2\xbf\x1a\xfa\xf7\xff\xf5\
+\x15\xc9\xe5\xa9\xe9\x4a\x59\x5e\xbe\x8f\x36\x90\xed\x3a\x91\xb9\
+\x0d\xa3\xdb\x87\xda\xfa\x46\xb7\x33\x4d\x1e\xeb\x80\x87\x68\x31\
+\x1b\x04\xee\x0c\xc5\xb9\x3c\x1c\x4d\xa7\xbb\x11\xea\x8c\x07\x9a\
+\x97\xf7\x0c\xb4\xeb\xbe\x71\xe3\x1b\x49\xd5\xc9\xe9\xca\x9c\x6b\
+\xf3\x7c\x24\x19\x5a\x4c\x74\x49\x92\x80\xc5\x25\x77\xde\x51\x91\
+\xb0\x07\x83\x7b\x9c\xc8\x9d\x79\xb2\xfb\xad\x29\x88\x9e\xce\x78\
+\xcd\xaf\x8f\x86\xaf\x3e\x70\xfa\xc6\x98\xca\xd4\x72\xaa\x69\xd9\
+\x88\xd1\x3e\x68\x2a\x1d\x8b\x42\xb8\x97\xe3\x70\x70\xaf\x4e\xec\
+\x62\x46\x07\x4d\x34\x6a\xe1\xcf\x5f\x82\x8e\x82\x02\x67\x16\x87\
+\xfe\xe5\xc8\xec\x1d\x63\xdf\xf5\x15\x59\x71\xbb\x4e\xf7\xcb\x52\
+\x5a\xba\x0a\x4f\x92\x4a\x74\x31\xf4\xd6\xd1\xe5\xda\xd1\x7d\x2c\
+\x6c\x90\x18\x0c\x44\xba\x4d\x9b\x2b\xd2\xb8\xfa\x05\xc1\xff\x71\
+\xe8\x5f\xe9\xe8\x7d\x7f\xb1\x04\x31\x8f\x90\x67\x50\xc3\xcc\xe5\
+\x5a\xc2\xdc\xa2\xb6\x42\xad\xa2\x85\x3c\x1d\xa2\xad\x57\x55\x3f\
+\xb7\x7b\xc8\xbf\x2d\x7f\x03\x43\x92\x8a\xfa\xc0\x7b\xcf\x8c\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xe6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xad\x49\x44\x41\x54\x78\xda\xad\x95\x5b\x6c\x54\x55\
+\x14\x86\xff\x7d\xee\x9d\x5e\xa6\x03\x0d\x4a\x9c\xb6\xa4\x26\xa2\
+\x5c\x62\xda\x52\x12\x1f\x4c\x4c\x1a\x89\x09\x91\x10\x43\x63\x80\
+\x50\x0d\x0f\x92\x10\x1e\x94\x27\x7c\x51\x23\x21\xd2\x40\x6d\x04\
+\x45\x8b\x3e\x88\x51\x21\x60\x20\xe9\xc4\x42\x2d\x0d\xb7\x38\x7d\
+\x90\x14\x5a\x2b\x33\x98\x98\x29\x1d\xc0\x38\xcd\x74\xda\x39\xe7\
+\xcc\xed\x5c\x36\xeb\x54\x8a\x31\x99\x6a\x3b\x74\x27\x2b\x7b\x92\
+\x3d\xf3\x7d\x6b\xad\xbd\xce\x19\x86\xc7\x58\x85\xe1\xf6\xd7\x10\
+\x89\x7c\xc7\xad\xa4\xc6\x2a\x7d\x40\x99\x36\xcc\x96\x36\x7c\x28\
+\xaf\x3b\x7d\x76\xf6\x3b\xac\x54\xb8\xfe\xfb\xb2\x3a\xf5\xf6\xd3\
+\x77\x78\x3c\x02\x94\x4b\x80\xea\x02\x0a\xa7\xcf\x0a\x58\xcd\xaa\
+\x8b\x4a\xf3\xa5\x97\x1f\x4b\x60\xc4\x56\xc7\x95\xdf\xaa\x82\x7c\
+\x22\x4a\x99\x8b\x24\xc0\x8c\x80\x7b\x12\x8d\x62\x69\xd3\x7d\x6d\
+\xd5\xc0\x53\x25\x0b\x32\xe3\xad\x5c\x49\x3e\x0b\x67\xf4\x04\xe0\
+\xd3\x48\x40\x70\x0a\x28\x8c\x76\x97\x82\x41\xa8\x7e\x61\x5f\xc9\
+\x82\x42\xb2\xe3\xaa\xe4\x6b\x79\xd1\xee\x7f\x13\x9c\xa7\xa9\x0a\
+\x81\xb2\x67\x33\x12\x2e\x3b\x7f\xb7\xab\x72\x85\x59\x92\x40\xbf\
+\x55\xd3\xaa\x54\x6f\xec\x93\x97\x6c\x16\xdd\x54\x14\xce\x48\x27\
+\xb8\xe4\x80\x97\x81\xe0\x04\xa6\xec\x3d\x19\x7c\xfe\x85\xdf\x81\
+\x19\x5d\xbe\x47\x50\x1b\x8e\xca\xfe\x36\xa2\x99\xc8\x4f\x87\x20\
+\xa2\x16\x98\x8c\xc0\x71\xc6\xc0\x34\x91\xe0\x5e\x35\x2e\x58\xc5\
+\xff\x54\x30\x3d\xb8\x61\xbd\x93\xcd\x6d\xe2\x86\xc9\x5d\x47\x1f\
+\xf0\xad\xd6\x77\x0a\xca\xda\x1d\x72\x60\x0b\x04\xa9\x06\x85\xa9\
+\xb3\xb0\x27\x7b\xc1\x72\x22\x44\xd6\x00\xe6\x5b\x06\x97\xdd\x83\
+\x13\xc8\x42\x28\xf8\x21\x4c\x56\xbc\x5b\x54\x60\xfc\xda\x56\x4f\
+\x5b\x14\xae\xad\x39\xd9\x2c\x6c\x3d\x0d\xf9\xc9\x18\x94\x40\x0b\
+\xe4\xaa\x2d\x34\x7b\x12\xac\xa9\x33\xb0\xd3\x61\x08\x06\x87\x60\
+\x52\x5b\x2c\x0e\x96\xa1\xde\x5b\xd4\x96\xac\x04\x9e\x4a\x9f\x56\
+\xdf\x4e\xbc\x5e\x54\x60\xde\xde\xce\x59\x65\x15\x90\xcf\xc3\x4d\
+\x4f\x13\x30\x02\xa9\xe6\x79\xc8\x95\x9b\xa8\x2d\x39\xca\xfc\x24\
+\x9c\xf4\x10\xc1\x05\x0a\x3a\xd6\xbd\xb1\xc2\x37\x34\xaa\x5d\x30\
+\xb8\x8c\x8c\x2b\xab\xbb\x93\x61\x8f\x55\x54\x90\x89\xed\xe4\x2c\
+\xb0\x04\x9c\xb2\x77\x26\x12\x90\xe8\x29\x55\x97\x6f\x86\x9b\xbb\
+\x4f\x99\x9f\x22\x78\x04\xa2\x29\x80\x79\x70\xc3\xbb\x75\x98\x6a\
+\x7b\xa2\xa2\x18\xab\x78\x05\x91\xad\x9c\x95\x97\x83\x17\x2c\x70\
+\x3d\x05\x56\x56\x47\x82\x95\xb0\x26\xbe\x86\x63\xde\x81\x48\x99\
+\x33\xf3\x61\xe6\x3a\xb5\x27\xcf\x1a\xd5\x5d\x89\x9b\xf3\x16\xa4\
+\x7f\xd9\xd8\x07\x45\xd9\x40\x63\x01\x37\x4f\x55\xa4\xa6\xa0\x35\
+\x58\x60\xf9\x71\x82\x4a\x33\x60\xf6\xb0\x35\x6e\x0e\x1d\xda\xee\
+\xc4\xbe\xb9\x06\xa5\xa8\x20\x75\xf9\xa5\x66\xda\xae\xd3\x23\x03\
+\x9e\xcf\xc1\xf5\x5a\x65\x18\x28\x7f\xc2\x80\xea\x50\xc6\x3a\xf3\
+\xda\x42\xd5\xb8\xf8\xcb\xb2\xfb\x56\xec\x9d\x7a\x65\x41\x02\x6f\
+\xe9\x3d\xcf\x74\xe6\x6d\x69\xaf\x4b\xef\x30\x37\x4b\x97\x9d\xc9\
+\xc1\x32\x72\x90\x65\x17\xaa\x24\x42\xb0\xe8\xae\xe8\x90\x5e\x0a\
+\xd7\x6b\xdf\x49\xb5\x2c\x58\x70\xe0\x93\xef\x5f\xdd\x15\xec\xec\
+\xb1\x53\x7f\xc2\x29\x78\xad\x22\x22\x27\xdc\xec\x4f\xfe\xd9\x86\
+\x48\xd0\xbc\x20\xc1\xe1\x8f\x8f\x04\x1b\x9b\xd6\xc5\xc3\x83\x83\
+\x68\x93\x0e\x3b\x15\x62\x46\xe4\x4c\x98\x8b\xb1\x9f\x04\xef\xcd\
+\x5b\x40\xf0\xda\xa6\xa6\xc6\xf1\x1b\x37\x86\x30\x12\xbd\x7b\xf2\
+\x44\xf7\xa1\x6d\x77\xbb\xaa\x3f\xa0\xcc\xdf\x9f\x83\xe1\x27\x41\
+\x7a\x5e\x02\x82\xd7\xaf\x59\xf3\xdc\xd8\x1f\xb1\x18\x46\x87\x47\
+\xef\x7d\x7e\xec\x48\x70\xf6\x2c\xde\x15\xf0\xd3\xf6\x06\x45\x3b\
+\x85\xd7\x92\x2c\xc5\x5b\x04\xff\x16\xff\xb1\xfe\x25\x08\x9d\xbf\
+\x30\x96\x9c\x48\xd6\x87\x7f\x0e\xc7\x8f\x77\x7f\x56\x87\x45\x58\
+\x8f\x04\xe7\xce\x85\xe2\x96\x63\x07\xfb\x7f\xea\x8f\x7f\x79\xfc\
+\xd8\xa2\xc0\x1f\x09\x4e\x9d\xf9\xe1\x62\x99\xa6\xb5\xf6\xfe\x78\
+\x01\xdd\x5f\x7c\x5a\xf2\x9f\x50\x51\xc1\xd5\x6b\xe1\xb5\x86\x61\
+\x8c\xf4\x84\x42\xf0\xfb\xab\xeb\x3a\x3e\xda\x1f\x5f\x54\xc1\xc0\
+\xa5\x2b\xb1\xde\xde\xf3\x5f\x75\x1e\x3a\x78\x60\x31\xc1\xb3\xeb\
+\x01\x1b\x45\xa3\x34\x4f\x28\xad\x9b\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x06\x44\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x0b\x49\x44\x41\x54\x78\xda\x8d\x55\x09\x50\x53\x57\
+\x14\x3d\x3f\xc9\x0f\x4b\x48\x0c\x5b\x50\x10\x68\xa0\x46\x14\x11\
+\x44\x51\xa1\xa0\x88\x7b\x5d\xc7\x1d\xaa\xe0\x86\x2b\x8c\xd5\x3a\
+\xad\x5a\xad\x8a\x56\xea\x52\xb5\xee\x8e\x0b\xca\x28\xc5\x05\xcb\
+\xa0\xd5\x82\xb8\x54\x8b\x08\x6e\x08\xb8\x44\x0a\x48\x14\xa2\xec\
+\x84\x24\x90\xf5\xf7\xe5\x6b\xd5\x76\xd0\xe1\xce\xfc\xf9\x6f\xde\
+\xfb\xf7\x9e\xbb\x9c\xf3\x3e\x85\x76\xda\xf0\xe3\xcf\xa6\x76\x73\
+\x11\xa4\x70\x38\x14\x53\x5c\xa5\x8e\xcd\x9a\x29\x4b\x6a\x8f\x1f\
+\xd5\xd6\x66\xc8\xc1\xc7\x83\x1d\xad\xb9\x87\xeb\x54\xfa\xe7\xb7\
+\xe2\xfd\x06\x59\xf6\x7a\x6d\xbd\xc7\x9c\x88\x0f\x04\x45\x3c\x62\
+\xf6\x16\xe0\xce\xb2\x5e\xac\x6f\xc8\xee\xa2\xdf\xc5\x76\x74\xb7\
+\x06\x9d\x69\x6e\xee\x02\xdf\xab\xed\x02\x18\x7b\x4c\xce\xfc\x14\
+\x29\x43\xde\xdf\x2d\x58\x97\x7a\x1f\x06\xbd\x19\xbd\x7d\x24\xd8\
+\x1c\xd5\x95\x3d\x5f\x7b\xa6\x14\x7f\x15\x56\x81\xe6\x51\x58\x1b\
+\x19\x88\x60\x99\x2d\x56\x9f\x2a\xc1\xb9\x68\x19\xd5\x2e\x80\x80\
+\x2d\x77\x99\x03\xf3\x7a\x43\x64\x03\x5c\x7f\xaa\x46\x83\xda\x80\
+\xa1\x3d\xec\xc1\xe3\x02\x1c\x0e\xd0\xaa\x07\xb2\x1f\xd5\x83\x64\
+\x8e\x08\x1f\x21\x5a\x0d\xc0\xc2\x43\x0f\x91\xb7\x34\xe0\xe3\x00\
+\x6e\x1b\xee\x08\x2a\xd7\x04\x69\x2c\x6b\xa7\x25\x99\xcc\xba\xd9\
+\xc1\xe8\xe3\x29\x64\x41\x2c\x56\xdd\x0c\x34\x6a\x8d\xec\x5a\x6c\
+\xcb\x83\x44\xf8\x66\xbf\xbe\x05\x90\xbf\xd0\x62\xc5\x91\x1c\xd4\
+\xec\x1c\xd6\x36\x40\xe7\xf5\xf9\xa3\x7b\x79\x88\xce\xd7\xa9\x74\
+\xfa\x27\xc5\xa5\x7c\x59\x77\x2f\x24\xce\xf0\x87\xb3\x1d\x70\x43\
+\xde\x8c\x13\xd7\xca\xf1\xf4\x51\x19\xf9\x92\x79\xe7\xe6\xe3\xeb\
+\x85\xe9\x83\xa4\x18\xd0\x55\x88\xea\x26\x60\x55\xca\x43\x3c\x7b\
+\x5c\x06\xcf\x2e\x1e\x70\x75\xb4\x45\xe1\x0b\xd5\xf0\x97\xeb\xfa\
+\x67\xb1\x00\xae\x2b\x6f\x36\x64\xaf\x0b\x15\xab\x5b\x81\xb2\x1a\
+\x3d\xc9\x90\x46\x27\x31\x85\x2d\xe7\xcb\x91\x91\x7e\x13\x14\xdf\
+\x1a\x7c\xb1\x98\x0c\x98\xc3\x86\x67\x18\x33\xf4\x8d\x8d\x60\xf4\
+\xad\x18\x3b\x3e\x0c\xdf\x8e\x91\xa2\xb2\x81\x81\x92\x94\xe3\xe3\
+\x6e\x0b\x7b\x52\xf5\x88\x84\x9c\x3a\xc5\x8f\xa1\x4e\x2c\x80\xcb\
+\xca\xeb\x89\x11\xfe\xee\x2b\x66\x87\x7b\x41\xa3\x37\xc2\xc9\x8e\
+\x87\xfd\x97\xcb\x91\x9e\x76\x0d\xb6\xae\x1e\xa0\x38\xec\x67\x55\
+\x5c\x2b\x7e\x9a\x65\x61\xd2\xe9\x27\x5a\xf2\xb2\xac\x35\x2f\x15\
+\x98\x30\x29\x1c\xf3\x87\x48\x51\xab\x36\x42\x44\xda\x97\x72\xa3\
+\x02\x19\xb7\x4a\x92\xab\xb7\x0d\x8d\x79\xd7\x33\xde\xf0\xad\xcc\
+\xe4\x59\x13\xb0\x78\x98\x17\xee\x3e\x57\x21\xe1\xc0\x35\xd8\x38\
+\x3a\x40\xa7\x6d\x01\x45\x53\xf1\x35\xdb\x86\xed\xf9\xb0\xb7\xce\
+\xcb\xb3\xe2\x60\xa4\x76\xdb\x89\x6c\xa1\x56\x69\xb0\x26\xba\x1f\
+\x7a\x7a\x88\x70\x30\xbb\x0c\x39\x84\x61\x8a\x4d\x61\xd4\x7f\x59\
+\x14\xba\x9a\x89\x8c\x9b\x85\xb8\x11\x5e\xf8\x39\xa3\x04\xf7\x4a\
+\xaa\xc1\x21\xa4\x6f\x50\xbe\x4a\x6c\x3c\x34\x71\x55\x5b\x6c\x13\
+\xc7\xa6\x6d\x72\xee\xec\xb6\xd2\x12\xc4\xdf\xdb\x09\x4b\x46\x7b\
+\x63\xd7\x85\x52\xdc\x7e\xac\x7c\x0f\x20\x9c\x91\x7c\xd4\xc6\xc5\
+\x6d\x96\x8b\x83\x08\x0b\x47\xf9\xc0\x8e\xf4\x3f\xe9\x72\x09\x74\
+\x84\xfb\x72\xb9\xc2\x5c\xb7\x7f\x0c\xf7\x53\x4a\x75\x8c\xbf\x68\
+\xf2\xf7\x75\xe7\xd0\x5c\x0e\xa2\xc3\xbd\xd1\xda\x6a\xc2\xa6\xb4\
+\x87\xa8\xaf\x7a\xdd\xa2\x6f\xaa\x3f\x44\x85\xef\x2d\x62\xf6\xcd\
+\xed\xc1\x8a\xaa\x46\xad\x03\x9f\xe6\xe0\x42\xbe\x02\xd6\x34\x17\
+\xd7\x32\x6f\x97\xeb\x19\x63\x0f\xc3\x99\x79\xda\x8f\x01\x08\xa6\
+\x24\x95\x8d\x1c\x13\x2a\xd5\x19\x4d\x18\x19\xe8\x06\xa3\xc9\xcc\
+\xfa\x86\xca\x04\x98\x7f\xb0\x08\x94\xfd\x9c\x73\xcd\xd1\x93\xfb\
+\xd9\xb1\x5a\xb0\xb7\x05\x8f\x0c\xf4\x4e\x69\x1d\xf8\x24\xa3\xb3\
+\x67\xae\xd4\x6a\x4e\xcf\x75\xfe\x54\x05\x82\x29\x47\x6a\xa2\xa2\
+\x86\x38\xe9\x0d\x66\xf4\xf2\x76\x20\x62\xa4\x50\xf6\x4a\x0d\x13\
+\xc3\xe0\x64\x46\x81\x9e\xe2\x8d\xd9\x29\x74\xe8\xea\xa7\x62\xaf\
+\x88\x10\x6f\x04\x77\x71\xc6\xfd\x8a\x7a\x08\x6c\x68\xa4\x5e\x29\
+\x41\x63\xe5\x8b\x42\xd5\xf1\x28\xff\xb6\x82\x77\x98\x99\x9a\xd7\
+\xc1\xd5\xad\x6f\xec\xa8\xee\x50\x13\x39\xcb\x88\xfa\xf2\xca\xeb\
+\x70\x64\x67\x32\xdc\xfa\x0f\x44\x65\xf1\x03\xf7\xf7\x43\x96\xc5\
+\x2c\xf1\x9c\x1a\xbb\x73\x73\x4c\x10\x1e\xbd\x6c\x22\xa5\xbe\x11\
+\x55\xe2\x0f\xbb\xaa\x3a\x74\xf1\x53\x34\x1d\x9b\x16\xfc\x61\x70\
+\x51\x4c\xca\x03\xd5\xd3\x02\xc9\xc6\xed\xdf\xb9\x3a\x09\xad\xd0\
+\xa2\x37\xc1\xb1\x83\x15\x56\x27\xdd\x81\xe2\xec\xe1\xc5\x78\x76\
+\x7c\xdf\x7b\x16\xf5\xf9\xc6\x47\x12\xfe\xe5\x93\xf0\x00\x4f\xf8\
+\x4b\x1d\x60\x32\x9b\xd9\xed\x8e\x62\x6b\x28\x1b\x5b\xb1\x21\xe1\
+\x68\xad\x8d\x4b\x47\x21\x87\xc7\xbf\x0b\x2e\x55\x6b\xd6\xe9\x86\
+\x6a\x5e\x94\x6b\x57\xac\x5d\xe0\x14\xf0\x99\x3d\xb4\x84\x10\xd5\
+\x44\x64\x5c\x9a\xc2\x6d\x79\x2d\xce\x1d\x4d\x85\x49\xa3\xe9\x88\
+\xbc\xc4\xd7\x2c\x80\x64\xf9\x15\x66\xcf\xa2\x30\xbc\x6a\x6c\x81\
+\xaa\xc5\x08\x81\x15\x8f\xbc\x0d\xb0\x17\xd0\x90\x4a\xec\x48\x4c\
+\x0a\x47\xaf\x96\x22\x97\xd0\xcf\x62\x7d\xbb\x75\xc4\xf4\x30\x29\
+\x4b\x08\xad\xce\x08\x65\x53\x2b\x88\xb8\xf1\x56\xe8\xec\x1c\xe2\
+\x66\xaf\x51\xe0\xde\x2f\x9e\x6f\x2b\x58\xfa\x6b\xc2\x8e\xef\xa7\
+\x5d\x2d\x54\x22\xe7\x62\x36\x82\x47\x0c\xc1\x84\x2f\x3c\xd0\xa4\
+\x31\xa0\xb3\xd8\x06\x2e\xf6\xd6\x70\x15\x73\xc0\x7d\x1b\x40\x47\
+\x6e\xcf\xd7\xcd\x66\xb6\x2d\x95\x24\x73\x3e\xc9\xfc\xb7\xdc\x0a\
+\xdc\xca\xce\x45\xc8\x90\x60\x84\xf9\x76\xc2\xda\xaf\x37\xa4\x11\
+\x80\x49\xef\x66\x60\xa9\x82\xbd\x35\x33\xcf\x06\xd3\x1e\xb2\xdc\
+\x88\xf1\xc3\x10\xe8\xe5\x04\x83\x99\x81\x44\x60\x05\x11\xb9\x9a\
+\xad\xf9\x3c\x30\x84\x86\x06\xd2\x42\xad\xc1\x84\xfa\x66\x3d\xeb\
+\x5b\x54\xd1\x80\xcc\x8c\xeb\xd0\x16\xe5\x0d\x06\xcc\x03\x60\x27\
+\xf6\xa4\x6d\xe9\x39\x86\x9b\x5b\xcc\x6d\xfe\x0f\xe8\x51\x3b\x18\
+\x8f\xa0\x7e\x84\x76\xce\xb0\xe2\x73\x59\xea\xd2\xa4\x6c\x9d\xd1\
+\xcc\xaa\x5b\x48\xc4\xc8\x10\x1a\x5a\x2a\xb0\x3c\xf9\x4f\x5f\x43\
+\x59\x5c\x0c\xed\xd9\x79\xed\xfb\xe1\x38\xcc\x4b\x67\x76\x2c\x1b\
+\x81\x24\x42\xd3\x47\x25\x4a\xd4\x17\xe6\x43\x28\xed\x06\xbf\x00\
+\x19\x7b\x2e\xaf\xa8\x46\xdd\xfd\x5c\x38\x06\x06\xc3\xd7\x4b\x82\
+\x48\x32\x8f\xe5\x5b\x33\xb4\xaa\xe4\x28\x41\xbb\x00\xac\xc6\xed\
+\xce\x8f\x9e\x35\x36\x28\xfd\xba\x1c\x35\xb7\xfe\x18\x8e\xfc\xed\
+\x59\xdc\x88\x8d\x4c\xcf\x91\x23\xd9\xf3\xc2\x4b\x97\x60\xba\xba\
+\x9a\xc2\xc0\xf5\x93\x25\x41\xa1\xa7\xc7\x85\x7e\x8e\xe4\x63\xe7\
+\xff\xd4\xa5\xc7\x85\xb7\x0b\xc0\x62\x9c\xa1\x9b\x22\x69\x91\xf8\
+\x89\x2e\x6d\x51\xc1\xbf\x33\x9a\x3f\xda\x0f\x6a\xc2\x9a\x93\x97\
+\x9f\xa0\x7a\xdb\x60\xd6\x97\x1e\xbf\x3b\xd4\xa4\x69\xf6\x34\x5f\
+\x5e\x75\xb2\xad\x38\x1f\x05\xf8\xbf\x09\xbe\x4a\x8a\xb0\x12\x88\
+\xb7\x59\x7a\xaf\x53\x35\xc4\x6b\x4f\xcd\xc9\x69\x8f\xdf\x3f\x32\
+\xd0\x77\x92\xbe\xd4\xed\xfb\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x06\xf1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\xb8\x49\x44\x41\x54\x78\xda\x75\x95\x0b\x50\x54\xe7\
+\x15\xc7\xff\xf7\xb1\x7b\xf7\xbd\xcb\x73\x17\x70\x51\x89\x08\x18\
+\x23\x41\xa3\xc9\x1a\x5b\x93\x99\xa6\x76\xc6\x62\x45\x48\xd3\x86\
+\xc9\x74\x22\x26\x1a\xdb\x54\xd0\x28\x86\xa0\x80\x89\x29\x28\x51\
+\x63\x34\x4d\x15\x99\x49\x66\x34\x26\x46\xcc\x14\x67\x32\x61\x32\
+\x9d\x69\x22\x54\x1a\x6b\x24\x5a\x41\x82\x59\x11\x45\x9e\xcb\xb2\
+\xef\xbb\xf7\xd5\x6f\xef\x2a\xd5\x6a\xbf\x99\x9d\xbd\xf3\x3d\xce\
+\xef\x7c\xe7\xfc\xbf\x73\x28\xdc\x35\x0e\xec\xda\xaf\x8c\x2c\xf9\
+\xd5\xde\x64\x87\x63\xa5\x28\xcb\x33\x43\x82\x0c\x6f\x48\x3a\xd2\
+\xb8\xc0\xb2\x06\x0f\x18\x1b\x3a\x27\x9b\xa6\xdb\xd8\x32\xa7\x9e\
+\x06\xa7\x61\xdd\x57\x06\x86\x3f\x0f\x7e\xfa\x41\x45\x6d\xe3\x5b\
+\xd4\x9d\x3d\x53\x1f\x6d\x43\xd1\xdf\xf4\xf1\x74\x73\x44\x94\xf4\
+\x61\x5e\x84\x2f\x22\x63\x32\x22\x61\x22\x24\x60\xd4\x27\xec\xfa\
+\xdb\xaa\xf4\xca\xbb\x8d\x2f\x39\x39\xd8\x90\x93\xc4\x6d\x59\x6c\
+\xe7\x10\x22\x56\xc6\x45\xc0\xac\x63\xc1\x6a\x35\x61\x45\x14\x57\
+\x97\x67\x71\xc7\xa7\x00\x47\xdc\x91\xe7\x93\x35\x38\xda\xe5\x93\
+\x10\x21\x46\xbd\xbc\x0c\x4f\x40\xc4\x58\x28\x8a\x71\xbf\xd8\x25\
+\x2a\xf8\xbd\xc3\xc6\x45\x65\x19\x74\x6c\x3f\x4d\x43\x76\x8f\x85\
+\xb5\x4f\x67\x19\x0e\x26\x72\x74\x7e\xf7\x84\x0c\xbb\x45\x83\x04\
+\x1d\x03\x13\x47\xc3\xa0\x61\xc0\x32\x54\x69\xf9\x2c\xdd\xb1\xdb\
+\x80\xb0\xc2\xc9\x0a\xce\x8c\x44\xe1\x0b\x11\xc3\x41\x01\x23\x7e\
+\x71\x82\x02\xd5\x3e\x23\x99\xb3\xcf\x4e\xd2\x2e\x9c\x61\x63\xc1\
+\x51\xf1\x0b\xf3\x8a\x82\x6b\x5e\x11\x3d\xa3\xfc\xb7\x83\x93\xc2\
+\x70\x80\x97\x9e\x74\x58\xb4\x09\x29\x46\x06\x09\x26\x16\x56\x02\
+\xb2\x10\x50\xf5\xc3\xa6\xf8\x89\xed\xe7\x27\x15\x07\x07\x7c\x75\
+\x3d\x02\xb7\x27\x1a\xb2\x85\xbd\x37\x2d\x46\x6d\x76\xf1\xe3\xd3\
+\x31\xcf\xc6\xc0\x4c\xfc\x66\xc9\xbe\xb0\x1c\x07\xe8\x69\x05\x24\
+\x22\xf0\xc9\x40\x97\x57\x42\xcb\xd9\x6b\xb8\x31\xe4\xfd\x41\x48\
+\xcd\xc8\x48\x35\xb2\x86\x64\x33\x8b\x44\xa3\x06\x7f\x76\xd9\xe2\
+\x80\xe5\xad\xc3\x4a\x76\x22\x33\xe1\x97\xe4\x86\x2e\x77\xb8\x7f\
+\x51\xb6\xb9\x69\x4d\xae\xd5\x68\xa3\x65\x8c\x0b\x0a\x06\x48\x3e\
+\x06\x03\xc4\x1a\x43\xc5\x63\x4a\x6e\x9b\x66\xa4\x91\x41\xbc\x4c\
+\xd2\x02\x93\x22\x8d\xc3\xdd\xbe\xe0\xf9\x1f\x03\x6b\x3c\xb2\x3c\
+\xdd\xca\xb1\x95\x49\x26\x26\xa1\x6d\x45\x5a\x1c\x90\x7f\x74\x60\
+\x6e\x57\xa9\xf3\xd2\x63\x4d\x6e\xfb\xbc\x2c\xe3\xd0\xe6\x82\x44\
+\x88\x92\x82\xef\x7d\x22\x58\x31\x8a\xf9\x56\x0a\xa9\x9c\x82\x7f\
+\x76\x9c\xc1\xd1\x63\xc7\xf0\xa7\x5d\x8d\xe8\x27\x6b\x97\x05\x03\
+\xb4\x66\x03\xe6\x91\xd0\x30\x04\xde\x78\xde\x83\xde\xfe\xa0\xa3\
+\xbd\x2c\x6b\x38\xef\xc3\xeb\x73\xbb\x7f\x97\x79\x89\xba\x5b\x19\
+\x25\xad\x83\xbe\x2a\x57\x8a\x99\x52\x64\xfc\x7d\x84\xc7\xb2\x44\
+\x20\x85\x0a\x61\xff\xfe\xfd\xd8\x5a\x5d\x8d\x13\x27\x4e\xa2\xb8\
+\xa4\x18\x81\x60\x00\x7e\xaf\x17\xeb\xd7\xbd\x82\x57\xdf\x69\xc6\
+\x55\x6d\x22\x96\x26\x6b\x21\x10\x6b\x0d\xed\x63\xfe\x96\xa2\x0c\
+\xcb\x7d\x32\x2d\x78\xaf\xa7\xae\x6a\x45\xe6\xf6\x5c\x03\x8b\xb3\
+\x13\x02\x96\x98\x25\xe4\xa4\xe8\xc0\x0b\x92\xba\x1e\x15\x04\x7c\
+\x7a\xfc\x13\xfc\xb6\xb4\x14\x3e\xbf\x1f\x01\x9f\x0f\x2c\x1d\x3f\
+\xde\xed\x01\x06\x6c\x69\x78\x82\x08\x21\xa6\xc4\x3d\xa7\xaf\xef\
+\xe8\x2a\xcf\xad\xb9\x07\xf0\x7c\xeb\xc0\xc4\x56\x97\xdd\xd6\x4b\
+\xe4\xf9\x30\x27\xa2\x61\xf3\x2b\x78\xff\xd0\x61\x75\x4d\x10\x45\
+\xc4\xa2\x5f\xff\x76\x3d\xaa\xb6\xbd\x81\x40\x20\x80\x48\x38\x02\
+\x89\xe8\x36\x36\xd6\xad\x29\x43\x61\x5d\x33\x52\xa6\xa5\x22\xcf\
+\x40\x63\x67\xfb\xb0\xf7\xc4\xaa\xcc\x84\x29\x40\xc1\xee\x8b\xb3\
+\xf2\x0b\x1c\x3f\xac\xce\x33\xe1\xdb\x51\x1e\xeb\x72\xf5\xea\x41\
+\x45\x14\xd4\x7f\x51\x92\xc0\xd0\x0c\xb6\x55\x55\xe1\xad\xfa\x7a\
+\x75\x6e\x74\x64\x54\x9d\xa7\x6f\xdf\x62\xc4\xc7\xe3\x6b\xc9\x81\
+\xa7\xd2\x75\x68\xfe\xb7\x0f\x9d\xff\xba\x95\x7d\xa1\x32\xbf\x4f\
+\x5d\x9d\xfb\xf6\x85\xf2\x67\x96\x3a\xf7\x3a\xad\x1c\x3a\xaf\xf9\
+\x70\x7c\x79\x5a\x5c\xef\x3c\x0f\x91\x78\x1f\x33\xa4\x61\x35\x58\
+\x59\x58\x88\x53\xad\xad\xea\x9a\xdf\xe7\x57\x6f\x26\x29\xf1\x5b\
+\x0c\x79\x82\x38\x34\x68\x46\x5e\x86\x19\x57\xc7\x78\xb4\x77\x0c\
+\x54\x5c\xda\x36\x7f\x9f\x0a\xc8\xad\x39\x57\xf7\x62\x49\xee\xf6\
+\x1b\x41\x11\xba\x10\x8f\x37\x17\xdb\xa6\x12\x1f\x21\x10\x89\x18\
+\xe2\x38\x0e\xae\x85\x0b\xe3\x89\x23\x4f\xd9\x6e\xb7\x23\x3d\x63\
+\x1a\x12\x6c\x56\x3c\x57\xb6\x5e\x9d\xdf\x7d\x4e\x82\x75\x76\x1a\
+\x91\x30\x8b\x53\x7f\xed\xd9\xd1\x5d\xb7\xa8\x26\x0e\x78\xa3\xb3\
+\x6e\x45\xf1\x9c\xed\x23\x01\x01\xf3\xf5\x0a\xc6\x4e\xbd\x83\xea\
+\xda\x5a\xf5\x50\x30\x18\x52\x3d\xd5\x68\x58\xfc\xd4\xb5\xf8\x81\
+\x80\x5f\x97\xbe\x80\x9a\xaa\xad\xc8\xf9\xc3\x07\xb8\x69\xb4\x21\
+\x99\xc8\xf6\x9b\x2f\xae\xec\xe8\xd9\xe9\x8a\x03\x72\x2a\x3b\x36\
+\xcc\x5d\xfa\xd0\x3e\x96\x14\xab\xa7\x2d\x0a\xd6\x2e\x48\x52\x0d\
+\x85\xc3\x61\x12\xa6\x68\x3c\x14\x92\x48\xb4\xae\x81\x4c\x12\x2b\
+\x08\x51\x52\xb3\x78\xf2\x8b\xa8\xeb\x31\x85\x45\x43\x41\x74\xb0\
+\xb3\x71\xc6\xc7\x42\x8c\x44\xd1\xdf\xd9\x5f\x7e\x65\xf7\x93\xef\
+\xaa\x80\xd9\x15\x5f\x3f\x31\xad\xc0\xf9\x8f\x04\x87\x09\x99\x1a\
+\x19\x7b\x9e\x4a\x55\x01\x5e\xef\xe4\x94\x8a\x44\x92\x70\x81\x48\
+\x56\x20\xc6\x62\xdf\xd1\xa8\xa0\x7e\x87\x88\x13\xb1\xe1\xf1\x86\
+\xf0\x95\x29\x1f\x97\x3d\x02\x82\x63\x41\x78\x2e\xdf\x74\xf5\xee\
+\x5d\x7a\x76\x4a\xa6\xf3\xf7\x5c\x54\xd2\x72\x1d\xb0\x90\xa7\x7f\
+\x60\x81\x1e\x9b\x5e\x5d\x8b\x7d\x07\xde\x9f\x02\xc4\xbc\xfe\x5f\
+\x80\x7c\x5b\xa6\x9b\x2b\xca\xb1\xaa\xf2\x3d\x7c\x21\x25\xc3\x13\
+\x16\x31\xd9\x3b\x82\x8b\xaf\x3f\x4a\xdd\xf3\x0e\xb2\xd6\xb6\xd5\
+\xce\xf8\xd9\x9c\x1a\x81\x65\xb1\xdc\x4e\xe3\xa5\x3c\x03\x4c\x7a\
+\xe6\xb6\x77\xf1\x9b\x28\x0a\xa5\x02\x78\x3e\xa2\xe6\x46\x2d\x4b\
+\x04\x3e\x4c\xea\xd4\x77\xba\x99\xf8\xe4\x6a\x08\x1a\x49\xc6\x44\
+\x7b\x77\xdd\x8f\x7f\xf9\x45\xed\x3d\x80\xd8\xc8\xab\xee\x54\x12\
+\x0b\x32\x61\xd2\x00\x2b\x1d\x34\x8a\x1f\xd2\xc3\x4a\xaa\xe2\xce\
+\x1d\x6f\x62\xc3\x6b\x9b\xc8\x03\x8b\x87\x83\x61\x69\xf2\x0e\xc6\
+\xb0\x65\x63\x05\x36\xd6\x34\xa0\x97\x73\xe2\xe3\x9b\xc4\x73\x52\
+\x14\x85\xef\x6f\xa0\xaf\xc1\x75\x7f\x47\x8b\x0d\xe7\x8b\xa7\x7f\
+\x6e\x7e\x64\xd6\x97\x4c\x9a\x19\x56\x2d\x85\x17\xb2\x38\x2c\xd2\
+\x87\x91\x9d\x66\x98\xda\x53\x54\xf4\x2c\x3e\xfa\xa8\x19\xe7\xdd\
+\x13\xb8\x16\xe4\xc0\x3a\xec\x38\xd8\x13\x84\x2f\x40\x4a\xca\x78\
+\x00\xf2\x65\xf7\xb2\xeb\x1f\x16\xb6\x3d\x10\xa0\x2a\xaa\x64\x4f\
+\x03\xff\xe8\xb2\x2d\xb4\x93\xd4\x2b\x12\xe3\x95\x79\x46\xcc\xd3\
+\x01\xbd\x43\x41\xa4\x70\xf1\x52\x3d\x1c\xa5\x90\x93\x6e\xc6\xb9\
+\x90\x8c\x96\x0b\x7e\xd2\xe2\x28\x28\xb7\xfc\x48\xb8\xd4\xb6\xab\
+\xfb\xb3\x4d\xf7\xb4\xd6\xfb\x00\x25\xab\x8a\x49\x77\x48\xff\x65\
+\x5f\x7a\x31\xa8\x39\x4e\x88\xa4\x0c\x33\xa4\xe1\xa4\x5a\xb5\xc8\
+\xb0\xb0\x20\x69\xc0\x0d\xaf\x80\xa1\x71\x92\x74\x92\x63\x56\x10\
+\x41\xf7\xde\x42\xf6\xf0\x67\x70\x28\x83\xa7\x4f\x7e\xde\x52\xf8\
+\x7f\x01\xab\xcb\xfe\x48\x45\x85\xb0\x2c\x12\xc5\x04\x79\x69\x6b\
+\x07\x5d\xc4\x32\xa9\xd6\xd7\x14\xb3\xd9\xa6\x98\x75\x10\x39\xad\
+\xba\x8f\x26\xbd\x9a\x26\xf9\xa0\xfc\x7e\xaf\x3c\x3a\xd9\xe8\x52\
+\x5a\x44\x93\x86\xa9\xa7\x19\x3d\x74\x7a\x0d\xdd\x7c\xe4\xa0\xf2\
+\x40\xc0\xcb\x6b\x37\x26\x91\x76\x3b\xa6\xc8\xfc\x99\xa6\xa6\x83\
+\x3f\xb9\x33\x9f\x52\x74\x74\xa6\x42\x51\x8f\x41\xc6\xac\x38\x01\
+\x7d\x94\xa2\x9c\x1b\x3d\x55\xea\xfe\xaf\x73\xeb\xbf\xa1\x58\xcd\
+\x12\x5a\xa1\x93\x0f\x1f\xda\x3b\x7e\x67\xfe\x3f\x04\xda\x21\x46\
+\x5a\xbf\xb5\x78\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x03\xdd\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xa4\x49\x44\x41\x54\x78\xda\x95\xd5\x7b\x6c\x53\x55\
+\x1c\x07\xf0\xef\xbd\xb7\x97\xb1\xbe\x6e\xf7\x68\xd7\xde\xae\x5b\
+\xf7\x68\xb6\x75\xed\x36\xa6\xac\x73\x0f\x27\x6c\x62\x34\xfe\xa1\
+\xc6\x84\xc4\xc4\xc4\x3f\x34\x26\x26\x26\x1a\x42\x7c\x04\x45\x09\
+\xd1\x10\x42\x90\x40\x30\x10\x8d\x46\x8c\x89\x06\xd9\xa3\x03\x01\
+\xa3\x46\x9c\x13\x97\x81\x80\x04\x11\x02\x1b\x6c\xed\xd6\x75\x2d\
+\x5d\xdb\x6d\xc2\x80\xc3\x2f\x85\x10\x20\xbb\x67\xf3\xf7\xcf\x39\
+\xf7\x9c\x9b\xf3\x39\xe7\x9e\x73\x7e\x57\xc0\x03\xd1\xf5\x74\x19\
+\xb3\x94\xfb\xf0\x7f\xe3\xfa\xec\x34\xd2\xa1\x21\x3c\xd3\x7b\x41\
+\xb8\xb7\x5d\x78\xf0\xc5\x4e\x02\x86\x61\xc8\xd4\x25\x41\x80\x24\
+\x0a\x99\x52\x77\xa7\xbc\xfb\x7c\xa7\x4d\x27\xde\x7e\x4f\xb1\xe7\
+\x60\xf2\xec\x39\x3c\xbb\x10\xb0\xf7\xa9\x52\x36\x22\x1a\x51\x5f\
+\x25\xc1\x6a\xcd\x5e\xf4\x0a\xc4\xbc\xe5\x38\xfd\x7d\x10\xcf\x1f\
+\xb8\xc8\x07\xbe\x7d\xb2\x84\x85\x25\x13\x6a\x2b\x44\x18\x65\x1d\
+\x26\xce\x27\x21\x67\x49\x9a\x03\x33\x1a\xc1\xe9\xb3\x40\xcc\x6f\
+\xc0\xe9\x7d\x3d\x58\xfd\xc3\x10\x1f\xf8\xe6\x89\x12\x16\x91\x4d\
+\xf0\x97\x0b\x30\x10\x10\xbb\x98\x42\x61\x5d\xae\x26\x10\x3e\x93\
+\x80\xea\xb5\x40\xb2\x35\xe0\xef\x7d\x41\xbc\x70\x68\x01\x60\xcf\
+\x2a\x37\x8b\xca\x66\xf8\x4a\x01\xbd\x2c\x21\x71\x69\x1a\x0e\x9a\
+\xa1\x26\x70\x76\x0a\x6a\xa5\x02\x9d\x3d\x80\x53\x9d\x41\xbc\x78\
+\x78\x98\x0f\x7c\xf9\x78\x31\x8b\x2d\x31\xa3\xba\x18\xc8\x26\x20\
+\x35\x3a\x03\x5b\x95\xa2\x0d\xfc\x4b\x40\x85\x02\xd9\x11\xc0\xc9\
+\xae\x20\x5e\xfa\xf1\x12\x1f\xf8\xac\xbd\x88\x25\x08\xf0\x16\x01\
+\x4b\x75\x12\x66\xc6\x67\x91\xe7\x31\x6b\x03\xe7\x09\xf0\x28\x58\
+\xe2\x0c\xe0\x2f\x02\x5e\xfe\xe9\x32\x1f\xd8\xb5\xd2\xc5\x12\xb4\
+\x07\x5e\x97\x40\x80\x88\xab\xd1\xab\xb0\x94\x18\xb5\x81\x0b\x49\
+\xa8\x65\x66\x64\xb9\x1a\x71\xbc\x3b\x88\x57\x7f\x1e\xe1\x03\x3b\
+\x57\x14\xb2\x04\x9d\xa2\xea\x22\x01\x59\x92\x88\xeb\xf1\x6b\x30\
+\xb9\x0c\x9a\x40\x68\x28\x09\x67\x89\x19\x4b\x8b\x1b\x71\xac\x27\
+\x88\xd7\x7e\x19\xe5\x03\xdb\xdb\x9c\xec\x8a\x68\xc0\xf2\x65\x2e\
+\x94\xb5\x3d\x87\x73\x5f\x6d\x83\x5e\xd5\xbe\x0f\xe1\xe1\x14\x54\
+\xb7\x09\xd9\xee\x47\x30\x48\xc0\xeb\xbf\x86\xf8\xc0\x27\x8f\xaa\
+\x2c\x4e\x37\xb9\xad\x23\x80\x95\xef\xed\x41\xf4\xcc\x40\xa6\xfd\
+\xc4\x8e\x57\xe6\x05\xc6\x46\x52\x70\xb8\x4c\xd0\x97\x36\x61\x30\
+\xd8\x83\x37\x8e\x84\xf9\xc0\x96\x16\x07\x8b\x31\x3d\x1e\x6b\x0f\
+\xa0\xe5\xed\xcf\xf1\xcf\x77\x9f\x66\xda\xa3\xfd\x5f\xcc\xbf\x82\
+\xd1\x34\xd4\x42\x23\x0c\x65\x4d\x18\x20\x60\x4d\xdf\x18\x1f\xd8\
+\xdc\x6c\x67\xb1\x9b\xd9\x68\x6a\xad\x47\xc7\x07\x5f\x63\x6b\x87\
+\x1b\x32\xed\x45\xb5\x27\x6f\x7e\x20\x4c\x80\x6a\x84\xd1\x43\x40\
+\x6f\x0f\xd6\xfe\x3e\xce\x07\x3e\x6e\x2a\x60\x71\x02\x6a\x3c\x05\
+\xf0\xb6\xaf\xc6\xc1\xdd\x9b\xa8\x9e\xaf\xbd\xc9\x63\x69\x38\x1d\
+\x04\x54\x34\xe3\x68\x6f\x37\xde\xe9\x8f\xf0\x81\x8d\x8d\x36\x36\
+\x45\x9f\xc8\xef\x90\x30\x1e\x9b\xc1\xdc\x8d\x9b\x74\xab\xf3\xb4\
+\x81\x08\x01\x05\x04\x54\x36\xe3\x0f\x02\xd6\x1d\x9d\xe0\x03\x1b\
+\x02\x56\x96\x24\xa0\x56\x95\x21\x52\x1a\x1e\x8e\x24\x51\x55\xac\
+\x9d\x8b\x42\x13\x04\xd8\x8c\x30\x55\x11\xb0\xbf\x1b\xef\xff\x19\
+\xe5\x03\xeb\x1b\xf2\x59\x1a\x7a\xd4\xd8\x6f\x03\x97\xa3\x29\x54\
+\x14\xe6\x68\x03\x51\x02\xac\x04\x54\x37\xa3\x9f\x80\x0f\x07\x26\
+\xf9\xc0\xba\x87\x73\xd9\x0c\x8c\xf0\xdb\x75\xd4\x29\x20\x14\x4f\
+\xa3\xdc\xa1\x9d\x8b\x42\x93\xd3\x70\xe6\x1b\xa0\xf8\x5a\xd0\xb7\
+\xbf\x0b\x1b\x07\xe3\x7c\xe0\xdd\x87\x72\xd8\x7f\xa2\x09\x3e\xab\
+\x94\xe9\x1e\x4b\x4c\xa3\xd4\xa6\x9d\x8b\x42\x71\x02\x72\x09\xf0\
+\xb7\xa2\xef\x40\x27\x3e\x3a\x76\x85\x0f\xbc\x55\x6f\x61\x73\x3a\
+\x05\xde\x5c\xfa\x17\x82\x21\x92\x9c\xcd\x1c\x53\x5e\x38\x2d\x04\
+\xd4\xb6\xe2\x37\x02\x36\x1d\x4f\xf0\x81\xb5\x75\x0a\xbb\x21\x2b\
+\xa8\xb4\x88\x99\x74\xbd\xd8\xb0\xd4\xb5\xe2\x08\x01\x9b\x4f\x4c\
+\xf1\x81\x35\xb5\x66\xb6\xc2\xef\x85\xce\xed\x5d\x70\xe6\xf7\x46\
+\xfa\xda\x5c\x06\xd8\x72\x32\xc9\x07\xde\xac\x31\xb1\x45\x8f\x3a\
+\x4f\x6c\x3d\x95\xba\x6f\xcc\x5b\xd0\xa6\x36\x28\x30\x32\x13\xa1\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x12\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xd9\x49\x44\x41\x54\x78\xda\xb5\x96\x7b\x50\x54\x55\
+\x1c\xc7\xbf\xe7\xde\xbb\x2c\xcb\x26\xa0\x26\x90\xb3\x95\xb8\x8e\
+\x51\xc4\x60\xbe\x22\x7a\x60\x8a\x62\xcd\xd4\x98\xca\x1f\x8e\x95\
+\x66\x89\x49\xea\x58\xd9\x50\x49\xf5\x87\xd8\x38\x39\xd3\x4c\x32\
+\x92\xd1\x90\x53\x53\x39\xd3\x0c\xa9\x4c\x56\x66\xf8\x20\x45\x1e\
+\x8a\x0f\x58\xd2\x78\xb8\x18\x82\x3c\x04\x84\x65\x97\xdd\xbd\xf7\
+\x9e\x7e\xf7\xde\x95\x59\x88\x40\xff\xe8\xcc\xfc\xf6\x9c\xbb\xf7\
+\x9c\xdf\xe7\x77\xce\xef\xfb\x3b\xbb\x0c\x63\xb4\xeb\xb9\x38\x33\
+\x61\xf9\x57\xb3\x9a\x3e\x5c\x83\xf0\xb4\xa7\x11\x22\x4a\x68\x29\
+\x3a\x82\xe9\xdb\xf7\xa2\xad\xf0\x95\xb3\xb6\x8d\x98\x3d\xda\x7a\
+\x36\x16\xc0\x75\x0c\xe5\xd6\x79\x7c\x6e\xe5\x83\x0c\x51\x59\xef\
+\x22\x2c\x44\xc2\xb9\xec\x1c\x2c\x6a\xe4\xb8\x79\x94\x55\x44\x2e\
+\xc0\xa3\xb7\x0d\xb8\x9a\x67\xdf\x42\xdd\x03\x64\x7d\x64\x13\xc8\
+\xec\x91\xb1\x0d\xe3\x2f\x66\x20\x3e\xf9\x2a\xc7\xd5\xb7\x53\xd1\
+\xdb\xef\x41\xc2\x9e\x53\x28\xb6\x31\xcc\xcc\x87\xc3\xd5\x64\xef\
+\xa4\x79\x4d\x64\x37\xc9\xac\x64\x97\xef\xcb\x6c\xf8\xe4\x5f\x00\
+\x72\xbe\xcd\x96\x16\x95\xad\x3f\xc8\x7e\xfa\xe0\x50\x55\x06\x31\
+\xbc\x03\xfe\xf6\x6e\x98\xee\x7f\x0c\xbc\xc3\x01\x95\x73\x88\x31\
+\x09\xf0\xd7\x9d\x86\x29\x3a\x12\xb2\xeb\x6e\x40\xe0\x34\x5d\x05\
+\x93\x42\xf4\xe5\x2d\x47\x6e\xe4\x10\xe4\x83\x21\x80\x3f\x97\x46\
+\xe4\xc4\xfd\x90\xba\xb5\xc7\xb7\x09\xbd\x6a\x22\x04\xa6\x68\x0c\
+\x6a\x82\x31\x81\xd3\x33\x0b\x4c\x27\x08\x98\x18\x58\xa9\xea\x5e\
+\x08\x8b\x08\xe1\x02\xc2\xcd\xb9\x38\xf9\xec\xcf\xdb\x9f\xfc\xd5\
+\x9d\x3d\x04\xd0\xf6\xa9\xfd\x4c\xd4\xab\x89\xb3\x1c\x52\x21\x3a\
+\xdc\x63\x65\x66\xe4\xe6\x23\x5b\x14\xba\x0c\x57\xf2\xaa\xce\x4e\
+\xcd\x72\xce\x1e\x04\xd4\xa4\x84\x2d\x88\xcf\x9d\xfb\xbb\xdf\x96\
+\x8e\x6a\x21\x13\x37\x3c\x14\x37\x33\xde\xb2\xa0\x28\xf4\xf1\x30\
+\x59\x68\x9b\xe1\x41\x80\x27\x84\xcf\x60\x6d\x3d\x80\xc3\xab\x4b\
+\xd7\x2f\xae\xf2\xed\xb9\x05\x58\x4f\x80\xbc\xf6\x98\x1d\xa8\x25\
+\x51\xf4\x79\x55\x48\x74\x32\x1e\x19\xf0\x92\x87\xeb\x6e\xae\x03\
+\x3d\x8a\x0a\xb7\xca\x07\x81\x9a\xe3\x08\x41\x84\x44\xa7\x65\xa2\
+\xf1\x38\x8b\x84\x64\xb1\x1c\x76\xd7\x56\x1c\x5e\xf9\xc7\x97\x04\
+\xc8\x60\xc6\xf9\x4f\xdc\x15\x97\xb7\x70\xe3\x59\xfe\x1d\x7e\x6b\
+\xf3\xa1\xc5\x2d\xa3\xcb\xcf\xa1\xf8\x29\x71\x14\xf2\xad\x5d\x8c\
+\xa4\x69\x1e\xd4\x2b\x94\x87\x30\xb8\xb0\x37\x32\x06\x25\x5b\xcc\
+\xb9\x29\xc7\xbc\x9b\xf4\x35\xed\x5b\xc6\x5d\x99\xf4\x8c\x30\x65\
+\x43\x78\x0f\x4e\xd4\x7b\x60\x16\x31\xe8\x58\x5f\x3a\xdc\xf3\x7f\
+\x54\x8f\x06\xe9\x81\x05\x75\xd6\x10\x34\x1c\x64\xce\x69\x9f\xfb\
+\x62\xf5\xa9\xbd\x1f\x99\xb8\x39\x2d\x14\xc5\xa1\x6b\xd1\xda\xdd\
+\x45\xaa\x13\x74\x71\x70\x92\x29\xe7\x92\x16\x9a\xae\x44\x68\xc7\
+\xc3\x0d\xe1\x70\x4e\x51\xc8\xcc\xe0\x73\x23\x17\x02\x7d\xef\x51\
+\xc3\xf0\x92\xa5\x00\xae\x73\xbd\x88\xfe\x58\x61\xac\x69\xb3\xf5\
+\xc7\xc9\x6f\xf5\xbf\xc0\xbd\x74\x8e\x6a\x20\x3a\x3a\x7b\xf8\x0d\
+\x47\xba\xc9\x01\x53\x82\x9e\x95\xc0\x1c\x25\x60\x72\x60\x0b\xda\
+\x7b\x0f\x05\xa8\x70\x54\x1d\x32\xef\x67\xae\x03\xe0\x21\x33\x8c\
+\x24\xd5\x5f\xb6\xa2\xd1\x19\x86\x85\x49\x1d\x86\xfc\x49\x16\x2c\
+\xd8\xa1\xc2\x82\x00\x34\xf6\x33\xa3\xa7\xf0\x79\x3f\xe8\x78\xef\
+\x45\x8c\x78\x13\x71\xf6\x1e\x60\x40\x42\xfb\x25\x5a\xdf\x5f\x02\
+\x1e\x36\x05\x28\x3a\x9c\x80\xc2\xf2\x65\xf0\x7a\xba\x51\xe3\xa8\
+\x46\x75\xc1\x51\x30\x61\x58\xf4\x23\x01\xb4\xe3\xa2\xdd\xaf\x2a\
+\x7e\x13\x16\xb3\x05\xb5\x75\x4e\xa4\x8f\x3f\x8a\x4d\x8b\x5b\xd1\
+\xe7\x14\x09\x70\x82\x00\xd3\x80\x35\x39\x3b\x31\x7d\xaa\x05\xd7\
+\xaf\x39\x71\xd1\xd1\x8c\xcc\xa7\x0e\x61\xf9\x12\xba\x92\x06\xc6\
+\x00\xd0\x15\x51\xd9\xf8\x10\x7e\x72\x6f\x80\xea\xed\x46\x5b\x5b\
+\x0b\x7e\x39\x51\x83\xbf\xb3\x8f\xa3\xaf\xde\x14\x00\xd8\x81\xb5\
+\xdb\xde\x43\x6c\xec\x3d\x68\x6f\xbb\x86\x92\xb2\xbf\xb0\xf7\xf5\
+\x22\x24\xce\x50\x8c\xea\x19\x15\xc0\xd1\xd4\x3a\x09\x3b\x9d\xef\
+\x60\x7c\xa8\x8c\x6b\xcd\xcd\x38\x7e\xaa\x12\x8d\xef\x57\xa0\xaf\
+\x41\x02\x73\x9f\x04\x37\xd9\x80\xfe\x2e\x13\x36\xef\x4a\x47\x6d\
+\xa3\x84\xd5\xc9\x47\xb0\x7e\x4d\x2b\xdd\xd5\x41\x09\x1c\x2d\x07\
+\x4c\xc6\xfe\xaa\x99\xd8\x7d\xf1\x71\x98\x5c\x0e\x7c\x3d\xbf\x14\
+\x51\x31\x32\x5c\xcd\x24\xf5\xce\xdd\xa6\x81\x88\x25\x7e\x33\xe8\
+\x7a\xd0\xaa\x57\x4f\x2e\xa9\x43\xa1\xa4\x09\xca\x6d\x26\x59\x57\
+\x9b\x12\xd0\x2b\x8d\xfb\x25\x5d\x8e\xce\x93\x82\x8f\x39\xe6\x4d\
+\x58\x62\xdb\xd8\xbd\x3f\x7c\x0e\x37\x9c\x07\x4b\x53\x1d\x26\xcb\
+\x5b\xdf\xf9\x03\x00\x5f\x00\xa0\x99\xcc\x75\x69\xea\xef\xdd\x2a\
+\xba\x1d\x12\xca\x8e\x9b\x97\xea\x85\x56\x97\x1a\x21\x16\x79\x26\
+\xd7\x50\x10\x71\x0a\x91\x67\x89\x9d\xf9\xd1\x82\xb7\xd9\xa7\x32\
+\x51\xa5\x90\x8c\x1a\xa3\xa2\xa3\x6a\xe3\xba\x0f\xa3\xd7\xea\x91\
+\x6b\xbf\x0f\x5c\x55\x5a\x61\xb1\x5d\x60\x93\x32\xb8\xaa\xa2\x97\
+\x49\x97\xd2\x51\x9f\x90\x52\xea\x95\x07\x8b\x3e\xf9\xb9\x15\x15\
+\x56\xf8\xe7\x68\xe3\x3e\x16\xf2\x70\x59\xd1\xf7\x8e\x3b\xb9\xaa\
+\x93\x9f\x5f\x19\x7f\x17\xf7\xd6\x68\xb7\xad\x87\x99\x2a\x4b\x0e\
+\xee\x9b\x3b\xe4\x56\x59\xb1\xf2\xe5\xf3\x14\x63\xa2\x7e\xa7\x30\
+\x96\xb4\xef\xdb\x6f\xca\xef\x04\xb0\xe2\xc5\x55\x49\x8c\xab\xa7\
+\x03\xeb\xcf\xd3\xfa\x47\x86\x00\x32\xd6\x65\xee\x60\x4c\xca\xe2\
+\x5c\x46\xfe\x17\x79\x63\xfe\x19\x18\xa9\x65\xac\x7b\xa3\x93\x31\
+\x71\x22\xf9\x28\x20\x1f\xaf\x0d\x01\xfc\x5f\xed\x1f\x6d\x63\x45\
+\xdc\x18\x4b\x48\x07\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x03\xec\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xb3\x49\x44\x41\x54\x78\xda\x9d\x94\x5b\x4c\x13\x59\
+\x18\xc7\xff\x33\xcc\x14\x10\x5a\xda\x7a\xa9\x97\x56\x20\x26\xee\
+\x82\x01\x63\x05\x35\x6c\x76\x35\xf1\xba\x6c\x4c\x8c\xc6\xb8\x9b\
+\x90\x26\x46\x1f\x7c\xf3\xc5\xdb\x6a\x34\xde\x62\x96\x35\x26\xfa\
+\x62\xf6\x92\x75\x93\x35\xde\x62\xf0\xc1\x78\x7b\xd0\xac\x92\x35\
+\x5e\x51\x59\x12\x04\xb3\x02\x6d\xb5\x2d\x05\x91\x61\x41\x29\xed\
+\xcc\xf1\x9b\xce\x0c\x4e\x0b\x22\x70\x92\xd3\x76\x3a\xdf\xf9\xfd\
+\xce\xf9\x9f\x99\xc3\x61\x9c\xad\xe3\x9c\x27\x1f\x4c\x29\x83\xc2\
+\x0a\x18\x53\x56\x81\x09\x85\x82\xc5\x36\x0b\xe0\x20\x27\x7a\x23\
+\xc8\x60\xde\xc9\x3f\x04\xc2\xdc\xb8\xe0\x67\xf3\x83\x42\x8e\xcb\
+\x9d\x39\x71\x12\xc4\x69\x33\x20\xd8\x1c\x40\x4e\x2e\x90\xdd\x4d\
+\x77\xdf\x81\x45\x24\x74\xdd\xae\x07\x93\xa5\xe9\x63\x16\x44\x4f\
+\xbb\x99\x7d\xfe\x0a\x88\x45\x4b\xe8\xea\x1a\xf5\x08\xf5\x3e\x20\
+\xd1\x03\x30\x1e\xea\x0a\x20\xd0\x65\xd0\x85\xb7\x37\x9b\x22\x63\
+\x12\x24\xe1\x5e\x82\x17\x13\x3c\x5e\x4d\x20\x85\xd8\x36\xa2\x89\
+\x40\x56\x0c\xc8\xec\x07\x64\x4e\x13\x89\x1c\xda\x7f\x97\x30\x6a\
+\x41\x2a\xfc\x67\x02\x30\xc4\x9e\x4c\x81\xf4\xec\x25\x58\xa2\xef\
+\x1f\x8e\xb7\x55\xd8\x2b\x5c\xbc\x65\xf6\x3b\xa0\x9f\xb0\x22\x8f\
+\xd0\x1f\x6f\x46\x27\x88\x9e\x9e\xc1\xec\xf3\x56\x42\x9c\xa3\xc3\
+\x69\x82\x89\xb0\x03\x6f\xae\x36\x77\x4f\xdd\x12\x75\x18\x75\xaf\
+\x4f\xba\xd9\xf4\xaa\xaf\x00\xa5\x01\x78\x9b\x87\x40\xcd\xbf\x2f\
+\x3f\x2b\x88\x9e\x72\xb1\xbc\xb2\x95\xb0\x94\x2c\xd3\xe0\x6a\xcb\
+\xe0\xf1\xbe\x41\x40\xd7\x9d\x17\x3b\xdc\x5b\x7b\x8f\x1a\xb5\xad\
+\xd5\x42\x6d\xc1\xc6\xed\x5f\x83\x5d\x82\x1c\xb1\x23\x70\xf9\xf1\
+\xad\x11\x05\x91\xdf\x26\x32\x47\x59\x25\x2c\xf3\x96\x13\xdc\xe0\
+\xd0\x10\x9e\x21\xee\xb7\x22\x5c\x53\x27\xe5\xef\x88\xd9\x8d\xfa\
+\x96\x23\x02\x2b\xdc\xbc\x9b\x6a\xcf\xa3\xaf\x89\x47\xb8\xb6\x69\
+\xdb\x27\x05\xa1\x5f\x9c\xcc\x59\xbe\x1a\x99\xde\xa5\xc0\xc0\x8f\
+\xd0\xc2\xcc\xa2\xee\xa4\x08\x18\x6d\x66\x06\x3a\xaf\x24\xd0\xd3\
+\x5c\x27\x71\x0a\x0e\xd3\x5f\x7b\x5c\xdf\xac\xb5\xe7\x96\xcf\x04\
+\xba\xae\x23\xfa\xf7\x00\xa4\x96\xd6\xf5\xc3\x0a\x02\x27\x72\x99\
+\x75\x4e\x21\xec\x4b\xb7\x43\xf9\xdf\xa7\xc1\xe9\x81\x21\x10\xc9\
+\xa8\x27\x74\x9f\x2c\x40\x96\x2a\x11\xef\xb1\x21\xd3\xee\x04\xe7\
+\x99\x00\xb4\xdf\x48\x16\xb7\xd5\x84\x10\x93\x3a\x0b\x86\x08\xfc\
+\xc7\xb2\x99\xf5\x4b\x37\x1c\x95\x7b\xa1\xf4\xfa\xb4\x50\x64\xfa\
+\x88\xeb\x5d\x85\xeb\xdf\xc9\x2e\xeb\x03\x45\xda\x6b\x46\x69\x89\
+\x79\xf4\x64\x31\x84\xee\xd6\x3f\x2d\x3e\x0e\x6f\x8a\xa0\xad\xda\
+\x42\x33\x9f\x09\xe7\x77\xfb\xc0\xfa\x7c\xda\xe0\x81\x8f\x30\x6e\
+\x40\x07\xc6\x4d\xf0\x84\x5e\xa3\x68\x8c\x8e\xc6\x2c\xb4\x3f\xef\
+\x47\xc9\x09\x6d\x91\x83\x82\xd6\xc3\x02\xb3\x95\x7a\xe0\x5c\x7d\
+\x00\x4c\xf2\x69\x03\x8d\x19\xa7\x89\x06\xe1\xf1\xd4\x55\x84\x1e\
+\x00\x9d\x01\x60\xee\xc9\x8f\xdc\xe4\x8f\x16\x62\x5a\x4b\x0b\x30\
+\x69\xcd\x41\xb0\x6e\x82\xc7\xb4\xc1\xe9\xd1\xa4\x80\x65\xd3\x35\
+\xa7\xc1\xdb\xfd\x80\xf7\xd7\xd4\x77\x8b\xfb\x6f\x3f\xc2\xb6\x92\
+\xfc\xa9\x93\xd7\x1e\x02\xeb\xf0\x25\x67\xca\x25\xd2\x20\xc6\x6f\
+\x35\x86\x58\x9a\x8c\x5e\xba\x57\xf7\x34\x78\xd9\xa9\xa1\x2f\x2e\
+\xd7\xbc\x13\x6c\xf6\x4f\x7f\x51\x85\x0f\x2c\x96\xb6\x81\x46\xb6\
+\xe9\x71\x98\x32\x0f\xde\xa7\xa1\xaf\x80\xf2\x3f\x87\x3f\x15\xb8\
+\xa6\x5d\x68\xb4\xe4\xa0\xa8\xb0\xca\x04\x35\x04\xe6\x19\x9b\xa3\
+\x89\x6b\x33\x0f\x52\x2c\x91\x36\x60\xc1\x99\x4f\x1f\x39\xc9\x1b\
+\x0d\x5b\x11\x10\xad\xf0\x7c\xf1\xbd\x29\xf3\x78\x1a\xd0\x9c\xb9\
+\xfa\xae\x3c\xd4\xe0\x0b\xcf\x8f\x7c\x9e\x0d\xde\xac\xdf\xa2\x49\
+\x8a\xd6\x99\x56\x62\x16\x18\x70\x5a\x95\x9f\xe0\xa1\x20\x50\x71\
+\xf1\xf3\x87\x65\x4a\x41\xdd\x26\x04\xb2\x26\xc0\x53\xbc\xc6\x04\
+\x35\x47\x44\x27\x84\xff\x11\xc1\x5f\x8f\x0e\x3e\x44\xa0\xb6\x87\
+\x55\x24\xc9\x81\xa7\xe4\x5b\x5d\x62\xec\x09\x65\xee\x7f\x4c\xf0\
+\xd0\xe8\xe1\xc3\x0a\xd4\x76\x7f\x03\x02\xd9\xd9\xf0\x94\x2e\xd7\
+\x05\x54\xe5\x7f\x36\xb6\x99\x8f\x28\x18\x94\x50\x5c\xa5\x8b\xc7\
+\x0f\x1f\x51\xa0\xb6\x07\x1b\xd0\x28\x2b\x28\xe2\x79\x44\x16\x5d\
+\xc0\xb4\xb1\xc2\xd5\xf6\x01\xb3\x4d\xa7\x08\xab\x18\x86\xd1\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xa0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x67\x49\x44\x41\x54\x78\xda\xb5\x55\x69\x4c\x54\x67\
+\x14\x3d\x6f\x36\x83\xac\x23\xb8\x80\x16\x61\x06\x03\x32\x32\x2c\
+\x55\xd3\x20\x56\x13\x10\x0b\x15\x11\x45\x01\xad\x4b\xb1\xe0\x82\
+\x52\x5a\x50\x54\x10\x51\x59\x0b\x96\x8a\x15\xb5\x15\x2c\xad\xe2\
+\x8a\x80\x08\x0a\x65\xc8\x40\x14\x6d\xd2\x5a\x05\x03\x88\x38\x05\
+\x06\x86\x25\x0d\x02\x4a\x0b\x33\xcc\xbc\x7e\x3c\x8a\x3a\xc4\x25\
+\x9a\x78\x93\xf7\xe3\x7b\xef\xbb\xf7\xdc\x7b\xee\xbd\xe7\x51\x78\
+\xcf\x46\xbd\x78\xd8\x17\x1b\xf7\x87\x83\x83\x83\x93\x9e\x9e\x2e\
+\x73\x56\x2a\x55\xb8\x7f\xbf\xa6\x25\x72\x67\xf8\xf4\x77\x06\xf8\
+\x26\x25\x2d\xc5\xc6\xda\x3a\xa2\xb9\xb9\x19\x2e\xf3\xe7\x61\x60\
+\x60\x10\x2a\x95\x8a\xf9\xc8\xe1\x70\x60\x68\x68\x80\xe2\xa2\x62\
+\xd8\xdb\xd9\x41\xa5\xd1\x80\xa2\x28\xe6\x79\x95\xd1\x34\xcd\x3c\
+\x83\x83\x83\x68\x6c\x7c\x94\x4a\x5d\xce\x2b\xa0\x45\xb6\xb6\xa8\
+\xaa\xaa\xc2\x47\xce\xce\x04\x60\x40\xcb\x81\xc7\xe5\xe2\x66\xd5\
+\x2d\xcc\x76\x70\x40\x77\x6f\x1f\xfe\xee\xec\xc2\x6b\xe2\x43\x43\
+\x82\x0b\xad\x04\x30\x99\x34\x09\x77\xef\xdc\x01\x75\x26\xe7\x3c\
+\x3d\x81\x3f\x01\x7f\x35\xcb\xe1\xe3\xed\x89\x21\xf5\x90\x96\x03\
+\x8b\xc5\x46\x43\xc3\x43\xd4\x57\xd7\x42\x69\x38\x05\x36\x24\x89\
+\xd7\x99\x8a\xa6\x70\x23\xfb\x47\x04\xf8\x7b\xa3\xfa\x5e\x35\xa8\
+\xef\x8f\x1e\xa7\x45\x33\x45\xa8\x6b\xa8\x83\xbf\xdf\x4a\x42\x8f\
+\x36\x00\x9b\xcd\x46\x4d\xcd\x7d\x54\x94\x4a\x31\x7d\xa1\x07\x14\
+\xa6\x36\xa0\x68\xf5\x2b\x01\x58\x1c\x1e\xe4\x17\x33\xb1\x2b\xd0\
+\x07\x79\xf9\x57\x40\x1d\xcd\xf8\x81\xb6\x9b\x25\x42\x6d\x5d\x3d\
+\xfc\xfd\x7d\x9f\xf1\x3f\x6a\x1c\x36\x07\x92\x72\x29\xda\xe5\x0a\
+\xe8\xdb\xce\x41\xc7\x34\xd1\x1b\x1b\xdb\x95\x7b\x0a\xbb\x37\xaf\
+\xc2\xd9\x73\x97\x08\xc0\xb1\x13\xf4\xc7\x2e\xf3\x71\xad\xa4\x14\
+\xeb\xd6\xae\xc1\xd0\x58\x00\xd2\x83\xf3\xe7\x2f\x40\x87\xa7\x03\
+\x9e\xc0\x0e\xb4\xf0\xcd\x00\xf7\x72\x4e\xe2\x40\xe8\x06\x64\x9f\
+\x3e\x43\x28\xca\x38\x4e\x2f\xf1\xfc\x14\x09\x89\x49\xd8\x13\xb5\
+\x0b\x2a\xa5\x72\x0c\x00\x07\x67\x73\x2e\xc0\xc9\xde\x1e\xb7\x3b\
+\x87\x20\xf4\xf4\x80\x5a\x83\x97\x36\x9a\xf4\x97\x54\x0c\x94\x25\
+\xc7\xe3\xe8\xfe\x30\x64\x66\xff\x02\x2a\xfd\x48\x06\xbd\x7a\x8d\
+\x3f\xa2\x76\xc7\x60\x6b\xc8\x96\x91\x5b\x2f\x18\x97\x54\x70\xe8\
+\x50\x1a\x62\x62\xf6\xa0\xf1\xe1\x23\xdc\xac\xb8\x01\x16\x9b\x35\
+\x1c\x0e\xda\x6b\x34\xe2\xa7\x33\x5e\x07\x6e\xee\x6e\x10\x08\x05\
+\xc8\x3a\xf5\x33\xa8\xb4\xc3\x47\xe8\x4d\xc1\xc1\xd8\x16\xf2\x25\
+\x7c\x7c\x7d\x30\x81\xcf\x67\xe6\x78\xd4\xc6\xf1\x78\x38\x96\x71\
+\x02\x49\xc9\x07\xa1\x50\x74\xa0\xa9\x49\x4e\x26\x8b\x05\xbe\x91\
+\x01\x7a\xfb\x9e\x40\xa3\xa1\xc9\x20\xb0\xa0\xab\xab\x83\xbe\xde\
+\xa7\xe4\xac\x81\xd8\xde\x16\xc6\xc6\x26\xc8\xcc\x3a\x05\x2a\x39\
+\x35\x95\x0e\xde\x18\x84\xb0\xb0\x1d\xf0\xf4\xfa\x04\x46\x86\xfc\
+\xe7\x55\x10\x1e\x1e\xf7\x74\xe3\xda\xd5\xeb\xf8\xee\x70\x2a\x0e\
+\x1e\x4c\x42\x7c\x72\x02\x58\x24\x71\x0f\xf7\xa5\x48\xcf\x48\x87\
+\x50\x68\x81\xdc\xcb\x85\xcc\xf5\x15\xcb\xbd\xd0\xd2\xda\x86\xdf\
+\x2a\x2b\xe1\xe1\xb1\x18\x59\xd9\x04\x20\x2e\x2e\x81\x0e\xdc\x18\
+\x88\x9d\x3b\x76\xc3\xd5\xcd\x15\x06\x46\x46\xcf\x2a\x18\xde\xd8\
+\xbe\x9e\x1e\x48\xca\x24\x48\x49\x4d\x44\x6a\x4a\x3a\xb6\x45\x45\
+\x13\x00\x16\xb6\xae\xfd\x0c\x11\xb1\x07\x60\x29\xb0\x40\x51\x61\
+\x11\xfa\x9f\x3c\xc5\xaa\x35\x7e\x78\xf0\xa0\x11\xf2\xda\xbb\x58\
+\xec\xee\x8a\xec\x9f\xb2\x41\x45\xef\xdb\x4f\xaf\x5f\xbb\x0e\x7b\
+\x63\x62\x31\x9f\x48\x85\xbe\x81\x81\x16\x45\x43\x64\x2f\x24\x25\
+\x65\xd8\x1f\x1f\x8b\xdc\x4b\x05\x90\x4a\x2b\x18\x8a\x44\xa2\x99\
+\xa8\xaf\x6f\x80\x9a\x2c\xe6\x54\x33\x53\x26\x99\xd6\xb6\x76\xc6\
+\x77\xdb\xf6\x4d\xb0\xb4\x14\x20\xe7\x6c\x0e\xa8\xc8\x5d\xd1\xb4\
+\x7f\x80\x1f\x12\x13\x92\x31\x77\xee\x1c\xe8\xe9\x6b\x03\x70\xb9\
+\x6c\x94\x96\x48\x10\xbc\x69\x23\xf2\xf3\xae\xe2\xab\x9d\xe1\x4c\
+\x05\xdb\xb7\x84\x20\x32\x3a\x1a\x66\x66\x93\x21\x2d\xbf\x41\xfa\
+\xd1\x03\xef\x65\x4b\x20\x6f\x69\xc3\xef\xb7\x6f\x61\xc1\x42\x17\
+\x5c\xba\x48\xf6\x20\x3c\x22\x92\x5e\xb4\xc8\x1d\x99\x27\xb3\x18\
+\xb1\x53\xab\xb5\xb7\x74\x78\x93\xab\xaa\x6e\x62\xe5\x4a\x3f\x48\
+\x24\x52\x44\x25\x25\x30\x00\x41\x01\xab\x11\x19\x97\x00\x81\xc0\
+\x1c\x45\x05\xc5\xcc\x3c\x79\x2e\xf5\x80\xbc\xad\x03\xe5\x05\xb9\
+\x98\xe7\xe2\x8c\x2b\xf9\xf9\xa0\x42\x43\xc3\x69\xc7\x0f\xe7\xa0\
+\xe4\x5a\x11\xec\x1d\xec\x99\x29\xd0\xd6\x22\x16\xa3\x45\xb3\x66\
+\x11\x35\x25\xf2\x2d\xad\xa8\x64\xe8\x10\x8b\x45\x78\xd4\xd8\x84\
+\xfe\x7f\xfa\x31\xd1\xc4\x98\x50\xab\x0f\x99\xac\x89\xf9\xb6\xdc\
+\x77\x19\xa6\x4c\x9e\x84\x92\xe2\xeb\xa0\xb6\x86\x84\xd2\x42\xab\
+\x19\xa8\xa9\xfe\x13\xd3\x2d\x2c\x89\x1a\x8e\x01\x20\xd9\x2a\xc8\
+\x64\x58\x58\x59\xa3\x49\x26\xc3\xde\xd8\x7d\xe4\x1d\x85\xe0\x2f\
+\x36\x23\x2c\xe2\x6b\xd8\x58\xcf\x40\xde\xff\x53\xe4\xb3\x82\x50\
+\x44\x24\xe5\x6a\x7e\x01\x1c\x1d\xc5\x28\x97\x94\x81\x0a\x0a\xde\
+\x42\x9b\x9b\x5b\x11\xf4\x7a\x4c\x31\x9d\x46\xf8\xd7\x06\x18\xce\
+\xa8\xbb\xbb\x8b\xcc\xb9\x21\x7a\x1f\xf7\x22\x31\xfd\x30\xb3\xc5\
+\x1b\x56\x05\x20\xfe\xdb\x34\x98\x92\x1e\x48\xca\x2a\xf0\x6f\x7f\
+\x3f\x96\x10\x35\x6e\x6d\x6d\xc7\xb9\xcc\x13\x10\x89\xed\x50\x29\
+\x95\x82\xfa\x7c\x43\x10\x3d\xd5\x42\x88\xee\x2e\x05\xb9\x6c\xa6\
+\xd5\xe0\x51\x80\x76\x85\x02\xe3\xf5\xf4\xc1\xa6\xb8\x68\xef\x6c\
+\x67\xf8\xe6\x1b\x19\xa2\x87\x2c\x1a\x4d\x28\x1d\xc7\xe3\x32\x3b\
+\x33\x38\xa8\x64\xb6\xdb\xc6\x46\x08\x3e\xdf\x18\xb7\x48\xef\x28\
+\x6f\x1f\x5f\xa5\x9d\x78\x36\xb7\x59\xf6\x00\x8e\x4e\x4e\x2f\x6d\
+\x72\x5d\x6d\x2d\x4c\x26\x4e\x23\x32\x40\x8d\x91\x87\x97\xdb\x70\
+\x92\xaa\x21\x35\xa1\xfd\x9e\x8a\xf2\xf2\xf2\x16\x10\x5a\xd6\x93\
+\xf7\x6e\x0b\x16\xba\x3a\xeb\x91\x4c\x47\x7e\x7b\xc3\xbf\x47\x16\
+\xd3\x13\xc9\xaf\xa5\xf5\x4a\xe5\xc0\x69\x12\x9c\xfb\xc6\xe8\x2f\
+\xe8\x24\x19\x90\x2c\xad\x74\x96\x7a\x2f\x6f\x31\x37\xb7\xf8\x80\
+\x4b\x14\x74\x94\x9e\x96\x66\x59\x3f\x29\x5d\x5c\x58\x58\x20\x7b\
+\x8b\xe0\xcf\x29\x7e\x17\xa7\xb7\xb1\xff\x00\xce\x00\x38\xe9\xd5\
+\x6d\xc4\xcf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x98\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x5f\x49\x44\x41\x54\x78\xda\x85\x56\x69\x6c\x54\x55\
+\x14\xfe\xde\x9b\x7d\xef\x32\x2d\x1d\xa6\x76\xdf\x6c\x29\x5d\xa0\
+\x65\x49\xa5\x40\x51\x94\xad\x98\x48\x45\x8d\x4b\xc4\x85\x14\x63\
+\xe2\x0f\xa3\x71\x8f\xc6\x3f\x26\x26\x6a\x2c\x4b\x8c\x41\x11\x1b\
+\x40\xb0\x41\x4d\x23\x11\xb0\x80\xa2\xa5\x82\x2d\xd5\xb2\x4c\x99\
+\xda\xd2\x3a\x94\xb6\x74\xa6\xb3\xbe\xdd\xf3\x5e\xb1\x6a\x14\x39\
+\xc9\x4d\xde\xdc\xf3\xde\xf9\xee\xfd\xce\x77\xce\x19\x06\xff\x63\
+\x8b\xf6\x07\xea\x05\x59\xd9\xe8\x4d\x35\xae\x74\x5b\xd9\xdc\x24\
+\x33\xab\xed\x07\x13\x32\xc6\xa3\xd2\xc0\xf0\x35\xf1\x90\x9e\x51\
+\xf6\x74\x6e\x98\x7d\xec\x46\x31\x98\xff\xda\xac\x69\x1d\xae\xb0\
+\xd9\x74\x5d\xab\x8a\x1d\x86\x5a\xb7\x01\x6e\x1d\x0b\x23\xbd\x69\
+\xb8\xee\x17\x68\xf1\x0a\x30\x2a\xc9\x38\x3d\x26\xa0\xdd\x17\x16\
+\xa2\x61\xa9\xa6\xeb\x81\xcc\x9e\x9b\x02\xcc\xdd\x39\xd4\x72\x47\
+\x85\xa3\xf9\xfe\x3c\x27\x92\x20\x83\x62\x23\x22\x4d\xaf\x98\xac\
+\x68\x1f\x58\x58\x06\x76\x1d\x60\xa3\x1f\xb4\x8d\x49\x02\x6b\xf5\
+\x47\x70\xa4\x7b\x6a\x6b\xcf\xa6\xec\x2d\x37\x04\x58\xb8\xfb\xf2\
+\xde\xfb\x6a\x92\x9b\x56\x66\x98\x60\x22\xcf\x15\x4e\x81\x2f\x26\
+\x61\x68\x4a\x40\xbe\x05\x60\x75\x7a\xed\x3d\x9e\xe3\x31\x28\xb0\
+\xc8\xb4\x1b\x50\x64\x65\xe1\x31\xb2\xe0\x18\x05\x5f\x04\x12\x38\
+\xf0\x53\x70\x5f\xe7\x83\x59\xf7\xfe\x0b\xa0\xac\xe5\x52\xcb\xa3\
+\x0d\x69\xcd\x6b\x3d\x16\xf0\x82\x82\xf3\x9c\x8c\xdf\xc6\x13\x68\
+\xcc\xd0\x23\xdb\x31\xfd\x1a\x63\xb2\x20\x1e\x9a\xd4\x9e\x23\x91\
+\x38\x2e\x45\x59\x9c\x48\x98\x51\x94\x66\x43\x91\x99\x81\x89\x6e\
+\xd5\x36\x12\xc7\x47\xc7\xc6\xb6\x9e\xdf\x52\xb0\x65\x06\xa0\xfc\
+\x7d\x5f\xc5\x92\xea\xa4\xee\xa7\x6e\x75\x41\x90\x81\x4e\x3a\xb1\
+\x47\x14\xb0\x3a\xc7\x82\xe2\x92\x32\xec\xd9\xb7\x17\xa5\x73\xca\
+\x91\x9f\x9d\x8d\x13\x3f\xfc\x08\x97\xcb\x89\x44\x82\xc3\xb2\xdb\
+\xea\x34\xdf\x69\xc9\x03\x29\xc5\x85\x45\x49\x7a\xb0\x44\x5f\xcb\
+\x2f\x41\x7c\xdf\x1d\xac\xec\x7d\xba\xa8\x47\x03\x98\xf7\xe1\x25\
+\x7e\xdb\xdd\x59\x06\x07\x14\xfc\x14\x92\x90\x2c\x72\x58\x5d\xe0\
+\x04\xc7\x8b\x98\x9c\x9c\x84\x81\xa8\x31\x5b\x2d\xda\xc9\x39\x8e\
+\x83\x2c\xcb\x10\x45\x11\xf1\x78\x02\x41\xf2\xbb\x9d\x56\x1c\xbc\
+\x62\x85\xdd\x9b\x8a\x5a\x07\x8b\x00\x25\xe6\xb9\x83\x97\x85\xd3\
+\x4f\x14\x18\x99\xd2\xb7\xfa\xea\x57\x2f\x9d\xd5\xf1\x78\xa1\x1d\
+\x3f\x87\x65\xf4\x07\xc2\x78\xa1\xda\x85\x6f\x3b\xbe\xc3\xe2\xfa\
+\x25\x10\x79\x1e\x92\x2c\x41\xaf\x27\xbe\xf3\xf2\xb4\x1b\x38\x5d\
+\x0e\xc4\x63\x89\x69\x45\x09\x02\x44\x5a\xac\x22\x63\xe7\x55\x27\
+\x8a\x33\x9d\xa8\x75\xea\xd1\x72\x71\x0a\x87\x8f\x8f\x2e\x65\xf2\
+\x5f\xef\xd9\xf6\xf2\xc3\x85\x9b\xcb\x29\x59\x27\xc7\x79\xac\x4b\
+\xd7\x23\xd5\xc0\xa3\xba\x6a\x3e\xce\x9e\x3b\x47\x09\x55\x4f\x2c\
+\xc1\x64\x32\xa3\x20\x27\x07\x9f\x7c\xb2\x1b\x55\xf3\xe7\x21\x1c\
+\x89\x42\x92\x44\xc8\x24\xd5\xbb\xee\xb8\x1d\xed\xed\xed\x38\x1f\
+\x66\x71\xc1\x3c\x0b\x0b\x53\xf5\xb8\xcc\xcb\x78\x61\xa7\x6f\x3b\
+\x53\xfe\x6e\x9f\xff\xd9\xc6\x9c\xdc\xa1\xa8\x84\xbe\xc1\x29\x7c\
+\x7a\xd7\x6c\x28\x14\x50\xa4\x5c\xa8\x34\xa8\x4b\x05\xb0\xd9\x1d\
+\xc8\xf1\x7a\xd1\xb2\x6d\x3b\x96\xaf\x68\x40\x30\x18\x9a\x01\x88\
+\xc6\xe3\xf0\xfb\x7c\x28\x29\x2c\xc0\x8e\x49\x37\xe6\x66\xd8\xe0\
+\x20\x65\xbd\xb2\xdf\x3f\xc0\xd4\xee\xf0\x29\xcd\x0d\x5e\x1c\xbf\
+\xc6\xc3\x1e\x8a\xe1\xdd\x15\x9e\xeb\x57\xe7\x49\x4d\x44\xa6\xa2\
+\x68\x14\x59\x6d\xf6\x19\x80\xc6\xf5\xeb\x10\x8d\xc6\x34\x7a\x78\
+\x75\xf1\x82\xf6\xcc\x85\x83\x78\xe9\x8c\x0e\x4c\xee\x6c\xd4\x11\
+\x13\x1f\x1f\x09\x80\xb9\x6d\x97\x5f\xb9\xb7\x26\x0d\x9d\x13\x22\
+\x52\x38\x11\xef\x2c\x77\xe3\xdb\xc3\x47\xb1\x6c\xc5\x72\xa2\x21\
+\x42\x1f\x8a\x84\x21\xc3\x95\x94\xac\x01\xbc\xf6\xfa\x1b\x78\xec\
+\xf1\x4d\xff\x28\xce\xe1\x91\xc0\x0c\xc0\x33\xa7\xcc\x30\xe7\xbb\
+\x51\xe3\xd6\xa3\xed\xe4\x18\x98\xba\x0f\xfb\x95\xea\xb9\x6e\x04\
+\xa8\x54\xd7\xa4\x19\xf0\x50\x99\x03\xc5\x05\x85\xb8\xd0\xef\xd3\
+\x00\x24\x51\xd2\x68\x72\x38\x9d\x70\x5a\xad\x5a\xc0\x4c\x02\xe2\
+\x28\xf9\x7f\x37\x15\xb8\x6e\x61\x0d\x5a\x03\x49\xe8\x52\x2c\x48\
+\xb7\xe9\xd0\xd7\x3b\x0e\xa6\xea\xed\x5f\x94\x92\x05\xb3\x11\x89\
+\x4b\x58\x95\xac\x60\xf3\xbc\xb4\x69\x39\xd2\xc9\x79\x2e\x31\x03\
+\xa0\x9a\x85\x00\xd4\xdb\x24\x48\x9e\x3c\xf9\x13\xc4\xbd\xca\x3f\
+\x47\x95\x2d\xab\x54\x46\xc3\xf8\x6c\x22\x1d\x67\x4d\xc9\xd4\x62\
+\x18\x8c\x74\x13\x45\xc5\x2f\x76\xf9\xcb\x6f\xcf\xcb\x8d\x53\xe5\
+\xe6\x89\x09\xbc\xb7\x2a\x13\x5d\xa7\xba\x50\x58\x54\x04\xbd\x41\
+\x4f\x12\x9c\x4e\xb4\x28\xa9\x40\xea\x22\xbe\x55\xce\x69\x4f\xe5\
+\x5f\xdd\x8b\xc5\x62\xda\x01\x42\x94\xf8\xa3\xe6\x6a\x74\x45\x64\
+\x18\x29\xc9\xc3\xc7\x7e\x1b\x60\x32\x37\x7d\xb3\x6d\x4e\x53\xc5\
+\x66\x91\x64\xb3\x20\xdd\x80\x47\xb2\x4c\x58\xbd\xb8\x12\x1d\xc7\
+\x4f\xc0\x41\x7a\xbf\x19\x00\xcb\xb2\xd8\xb0\xbe\x11\x1f\x7c\xb4\
+\x0b\xdf\x0f\xf0\x08\x95\x56\xe0\xc8\xa5\x18\x15\x27\x83\xe1\xf6\
+\xde\xed\x4c\xd6\xa3\x87\xea\xd3\x17\xe4\x75\x38\x3c\x0e\xe8\xa9\
+\x97\x34\xb9\x65\x3c\x56\xeb\xa1\x00\xaa\x32\x24\xa2\x44\xa1\x8a\
+\x8d\x5f\x97\xec\x3f\x01\x54\x50\x86\x61\xa8\xda\x83\x48\xb1\x9b\
+\xd0\x11\xc9\xc0\xee\x51\x86\xf2\x23\x81\xbb\x12\x41\xf4\xec\xe0\
+\x52\xad\x55\x64\x3d\x79\x98\xcf\x5e\x3b\xd7\x10\x0b\x0b\x58\x55\
+\x64\xc1\x1c\x21\x8a\xa6\x05\x1e\x0c\x5f\x1e\x41\xc3\xb2\x06\x9c\
+\x3a\x73\x5a\x6b\x0b\x46\xa3\x51\x03\x8a\x84\x23\x08\x85\x42\xd8\
+\xb8\xe1\x1e\xec\x6b\xfb\x1c\x3a\x49\xc0\x81\x8b\x3a\x44\xf3\x73\
+\xd0\xd6\x3b\x09\x93\xd9\x80\xf0\xd1\xf3\xc2\xd0\x07\x2b\x8c\x1a\
+\x80\xf7\x81\x2f\x2b\xac\x25\xb7\x74\x3b\x8b\xd3\x35\xed\x3f\x5d\
+\xe5\x80\x31\x38\x85\xba\x59\x92\xc6\xad\x3b\x35\x85\x7a\x35\x83\
+\x9a\xaa\x6a\x3c\xfb\xdc\xf3\x58\xb3\x6e\x2d\xc2\xa1\x20\x22\xd1\
+\xb8\xe6\x6f\xbb\x20\xc1\x5b\x5d\x88\x37\x4f\x4e\xc0\x08\x1d\x04\
+\xdf\x18\xa4\xa1\xdf\x2b\x47\x76\xaf\xed\x99\x69\xd7\x19\xf7\x1c\
+\x68\xb1\x2f\x2e\x6d\x36\x50\xeb\x4d\x50\x75\xbe\xb8\x28\x05\x03\
+\xfd\x13\xa8\xf7\xea\x30\xdf\x6b\x81\xd3\x6e\x46\x78\x2a\x32\x23\
+\xcb\x31\x3a\xc0\x51\x5f\x0c\xfd\xa2\x1d\xf9\x65\x19\x78\xf5\x9b\
+\x31\x18\x89\x62\x4c\xc4\x20\x9e\x39\xb7\xf5\xca\xfe\x0d\x7f\xb5\
+\xeb\x19\x90\xfb\xbe\xd8\x6b\xaa\xcc\x6f\x62\xdd\x36\xf0\x34\xbd\
+\x96\x14\xd8\x70\xf7\x2d\x26\x1c\xec\x1c\x45\x25\xcd\x85\x1f\x7d\
+\xd3\x00\xd5\xd9\x16\xf4\xd1\x18\x6b\x5c\xe8\x41\xeb\x60\x1c\xdf\
+\xfd\x3a\xa5\xb5\x69\x66\x3c\x0a\xe5\x57\xff\xbe\xab\x7b\xd7\xff\
+\x7b\xe0\xfc\x69\x69\x6b\x5a\x5b\x74\x25\x79\xcd\x6c\x91\x87\xea\
+\x80\x7a\x0d\x4d\xaa\x32\x0a\x58\x9a\x66\x82\x97\xe6\xa4\xa2\x90\
+\x3a\x22\x02\x7a\x47\x39\xf4\xf9\x63\xd4\x45\x01\xbd\x89\x26\xdd\
+\xc5\x00\x58\xff\xe0\xd6\xab\x5f\xdd\x7f\xe3\x91\xf9\xa7\xb9\xd7\
+\xb5\x56\x28\x06\x7d\x17\x5b\x98\x6f\x50\x3c\x2e\x88\x14\x44\x22\
+\xda\x24\xf5\x81\x8c\x94\xa9\xc9\x93\xe0\x68\xae\x4e\x82\xf5\x0d\
+\x0a\x8c\xc4\xd5\x8c\x7f\xf9\xe0\xcd\x87\xfe\xdf\x2d\xe5\xce\x5d\
+\xf5\x14\x79\x23\x5c\x8e\x95\xb0\xd8\x72\x61\x33\x4d\x3b\xa2\xd4\
+\x26\x12\x91\x01\x04\xc3\x87\xa8\x64\xf7\x5c\xfb\xfa\xe1\x1b\xfe\
+\x6d\xf9\x03\xb5\xab\x35\x6d\xd3\x57\x91\x82\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x83\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x4a\x49\x44\x41\x54\x78\xda\x9d\x95\x5b\x4c\x53\x77\
+\x1c\xc7\xbf\xff\x73\x4e\x5b\x10\x28\x30\x85\xcd\x53\x09\x16\x09\
+\x32\x2c\xa5\x01\x61\x46\xbc\xe0\x6d\x71\xba\xf9\x32\x1c\xcb\x2e\
+\x35\x3e\x6c\x7b\x59\xa2\x71\x3e\x6c\x4b\xd4\x2d\x5b\xc8\x5c\xe2\
+\xd8\xe6\x8b\xcb\x36\xe7\xc3\x66\x64\x7b\x20\xc1\x89\x5c\x42\x0c\
+\x12\x46\x60\x4a\xb8\xb4\x94\x4b\x91\x64\xb1\x84\x5b\x60\x08\x9d\
+\xb4\xe7\xf2\xdf\xff\x9c\x22\xa1\x52\x6e\xfe\x73\x72\x92\x9e\xf3\
+\xef\xe7\xf3\xbb\xfd\x5b\x82\x67\x5c\xaf\xdc\xcc\xdd\xa4\x50\x25\
+\x1f\x50\x36\xab\x50\x8f\x10\x8e\xb7\x9a\x8d\x71\x5b\x08\x21\xf0\
+\x4b\xfe\x11\xa2\xf2\xd9\x55\xaf\xde\x1f\x23\x6b\x06\x57\xe4\x6e\
+\x52\x39\xb5\x35\x39\x66\xfd\xc6\xb4\xe7\x52\x91\x95\x98\x81\x8d\
+\x26\x11\xf1\xa6\x78\xc4\x18\x29\x54\x3a\x0b\xf7\xbf\x03\xb8\xda\
+\x51\x09\x49\x96\x92\xd7\x24\x38\xf4\x47\x8e\x18\x54\x65\x9f\xd3\
+\x5e\x8c\x83\x29\x7b\x30\x12\xe8\x83\x5f\x1e\xc5\xac\x3a\x8d\x59\
+\x65\x06\x94\x6a\x38\x02\x23\xcf\x63\xec\xb1\x80\x5f\xdb\xee\x8c\
+\xac\x5a\xb0\xef\x37\x07\x83\x07\x7c\x27\xf2\x4a\x50\x24\x6e\x47\
+\xe7\x74\x15\x04\x8e\x47\x50\xe5\xa1\xaa\x1c\x0c\x06\x40\xa0\x0a\
+\x54\x50\x68\xd7\x3a\xa3\x11\x65\x0d\x7f\x61\x55\x82\x3d\xd7\x72\
+\xc4\x59\x06\x3f\x59\x50\x82\xfd\x29\xf9\xe8\x98\xba\x0d\x81\x17\
+\xe0\x1e\xf6\xa3\xba\xb3\x15\x8a\x22\x35\x45\x45\xc5\x16\x1e\xcd\
+\x76\x20\x6d\x43\x34\x14\x95\xea\x82\xcb\xf5\xcd\x2b\x0b\x76\xfd\
+\x64\xd7\xcb\xf2\xee\x8e\xe3\x38\x94\x9a\x8f\xb6\xa9\x5a\xb0\x3e\
+\xe2\x91\x9f\xe0\xe7\x86\xfa\xe9\xd6\x0f\x5c\x66\x7d\xdf\x55\x7b\
+\x12\xc7\x45\x8f\x9e\x3f\xfc\x36\xc6\xa5\x3e\x26\x8d\xc6\xe5\xba\
+\x9a\x81\x65\x05\x3b\xae\xe4\xe8\x65\x71\xee\x2c\xc1\xcb\x9b\xf3\
+\xd1\x3e\x55\xc7\x4a\xa0\xea\xa5\x71\x0f\x4f\xa2\xaa\xe5\xde\xd9\
+\xfb\x1f\xba\x2f\x3d\xd9\x6f\xff\x3e\xfd\xee\x95\xe3\x5f\xed\x1e\
+\x94\xee\x60\xfa\xb1\x01\x3f\xd6\xd5\xd6\x2f\x29\x28\xf8\x4e\x8b\
+\x3c\xe8\x3b\xb1\xb7\x18\x87\xad\x85\xf8\x7b\xaa\x66\x2e\x5d\x02\
+\x8e\xa5\x30\xe1\x57\xf0\x43\x55\xf5\x8c\xeb\x6c\x6f\xdc\xbc\xe0\
+\xdb\x0c\x7a\xed\x9d\x6f\xe0\xf9\xaf\x1a\x7d\xc3\xd3\xa8\x6c\xbe\
+\x77\x26\xa2\x20\xaf\x2c\x5b\x94\x15\xd9\x77\xf2\xc0\x9b\x38\x92\
+\x56\x88\xda\xd1\xeb\x20\x1c\x01\x4f\x8c\x30\x73\x09\xac\x87\x14\
+\x1c\xcf\xa1\xa6\xad\x1f\x2d\x3d\xed\x33\x84\x92\x0b\x0a\x51\x3f\
+\x7b\xef\x60\x49\x5c\x91\x35\x0f\x3d\x33\x8d\xa8\xeb\x78\x80\xae\
+\x7e\xef\xeb\x8b\x04\x8e\x8b\x36\x51\x92\x24\x5f\x9e\x3d\x13\x6f\
+\x14\xbc\x84\x3f\x7d\x37\x40\x59\xc4\x1c\x8b\x9c\x0d\x87\x0e\xe7\
+\x89\x01\x66\x21\x16\x89\x86\xf5\xd8\x40\xed\x90\x82\x26\x58\xcc\
+\x2f\xc0\x9a\x90\x84\xb6\x47\x0d\x10\x04\x82\x5f\x6e\xb5\x60\x7c\
+\x6a\x2c\x25\x4c\x60\x2f\xb5\x89\x41\x16\x79\xae\x2d\x0d\x6f\xed\
+\x2c\x62\xf0\x72\x50\x95\xb0\xa6\x72\xa1\xf2\x10\x3a\xb7\x93\xce\
+\x5d\x5a\x47\x64\x24\x1a\xe3\x91\x6c\xb2\x62\x1d\x1f\x03\x33\x3b\
+\x70\xed\xde\x71\xdc\x6c\x6c\xec\xe8\x39\xd7\xeb\x98\x17\xd8\xbf\
+\xcc\x16\x67\xe5\x80\xcf\x61\x4b\x87\x73\x57\x11\x2a\x19\x5c\xc3\
+\x86\x62\x0f\x5f\xf4\xe9\xcf\x34\xa4\x12\x8c\x0a\xc6\xbc\x49\x70\
+\xbb\x1e\xb2\x2c\xb8\xd4\xce\x4f\xdd\xff\xe8\xdf\xb5\x5d\xd8\x26\
+\x06\x64\xc9\x97\x63\x67\xf0\xdd\xfb\x50\x31\x54\x0e\xa2\xf0\xe0\
+\xf9\xd0\xc9\x5c\x71\xb1\x2d\x6c\xec\xd1\xd9\xea\xc7\xf8\xa0\x26\
+\x82\xa5\xeb\xbc\x6b\x48\x7f\x95\x75\xce\x96\x14\x94\xa4\x51\xbb\
+\xc3\x0a\xe7\xde\x03\xa8\x78\x78\x03\x9c\xa2\x95\x45\x9b\x96\x55\
+\xb0\xd9\x3e\x83\x91\xa0\xa3\x35\x80\x89\x07\x12\x78\x23\xb1\xb8\
+\x3e\x0f\xc1\xf5\xf7\x19\x1f\x67\x0e\x6f\x73\x58\x9f\x77\x16\xed\
+\x47\xc5\x60\x39\x7b\xc2\xeb\x63\xb8\xaa\x23\xae\x45\x6e\x22\xe8\
+\x6a\xf6\x33\xb8\x0c\xce\x44\x2c\xdd\x5f\xb8\x87\xc2\xb6\x58\xcf\
+\xa4\xd3\xd2\x4f\xde\x47\xcd\xc0\xef\xda\x7c\xe8\x55\x27\x11\xea\
+\xbc\x38\x72\xc0\xc0\xe0\x9d\x1a\xdc\xcb\x22\x37\x71\x16\x4f\x69\
+\x38\x3c\x94\xc1\x47\x2f\x7a\x10\xa3\x64\x16\x1c\x4d\xd0\x1b\x4a\
+\xd5\xc8\xc0\x85\xe5\x9a\x87\x37\xf9\x31\xd9\x2f\xe9\x91\xf7\x5e\
+\xec\x1e\x8a\x18\x88\x76\xcb\x38\x9d\xe9\xe3\xe3\x78\x71\xfb\x6b\
+\xb1\xfa\x4f\xee\x52\x92\x85\x70\x57\xd3\x0c\x26\xfb\x58\xe4\x51\
+\x9c\xa5\xf7\xeb\xc8\xf0\x79\x81\xb6\xd2\x99\xc4\x10\xcb\x8b\xb9\
+\x9a\x84\x35\x99\xd2\xa5\xe1\xee\x46\x06\x1f\x08\x35\xb4\xef\x92\
+\x67\x49\x78\x98\x40\x5b\x5b\x4e\x65\x31\x09\x11\x73\x8f\xc5\xea\
+\x07\x6c\x61\x26\x61\x70\xaf\x0c\xde\x40\x2c\xfd\x65\xdd\xcb\xc2\
+\x17\x09\xf4\x4c\x4e\x6d\xf5\x09\x5a\x26\xc7\xe2\xe6\x25\x4f\xe0\
+\xdd\x0c\x3e\xe1\x0d\xce\xc1\x7b\x56\x84\x47\x14\x3c\x2d\x01\xe5\
+\x20\xb0\x7f\xab\x67\x81\x2f\x29\x58\x28\xc9\x2f\x8e\x87\xe7\x2e\
+\x1b\xc5\xfe\xc0\x9a\xe1\xcb\x0a\x74\xc9\xe9\xad\x1e\x55\x46\x26\
+\x3b\x7b\x23\x1c\x47\xb2\x19\x7c\x6c\x2d\x70\x6d\xfd\x0f\x58\xdf\
+\xcd\xe6\xb5\xff\x6b\xdc\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x05\x7a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x41\x49\x44\x41\x54\x78\xda\x95\xd6\x0b\x50\x54\x65\
+\x14\x07\xf0\xff\xdd\x37\x96\x25\xea\x08\xad\x38\x94\x84\x51\x23\
+\xd6\xa0\xad\x6b\x91\x9a\x98\x39\x3e\x9a\x7c\x21\x26\x6a\x3e\xd0\
+\xd4\x21\x1f\x8d\x3a\x59\x66\xd9\xa4\x4c\x3a\x4e\x62\x9a\x92\x28\
+\xad\x21\xbb\xa0\xe1\x0c\xa3\xc4\x3b\x5d\x18\x21\xbc\x42\xa2\x92\
+\x3c\x45\x58\x60\x79\x2e\xb0\xec\xe3\x2e\x7b\xbf\xbe\xbd\x98\xe9\
+\x5c\x4c\xbd\x33\x3b\x7b\x77\x76\xf6\xfc\xf6\x7c\xe7\x7c\xe7\xbb\
+\x0c\x1e\xb8\x82\x93\xcc\xa4\xd7\xc5\x83\x27\x00\x43\x3f\xcb\x18\
+\x06\x5e\x72\x86\xbd\xbe\xc4\x67\x02\x9e\xe2\x7a\x43\x6f\xb6\x94\
+\x46\xf8\x0c\xf1\xdc\x33\x0f\x7e\x11\x70\xaa\x99\xe4\x46\xfa\xc0\
+\xe6\x02\xa4\x12\xa0\xb2\x87\xc7\xa6\xf3\x4d\x6c\x55\x94\xdf\x13\
+\x03\x41\xf1\x0d\x26\x46\xca\xa8\xcb\x3f\x1e\xc9\x88\x80\x51\xc7\
+\xea\xc9\xb9\xa5\x7e\xc8\x6b\x75\x43\x29\x65\x50\xdf\xcb\x21\x35\
+\xaf\x85\xad\xd9\xe8\xff\x44\x80\x7f\x6c\xad\x49\x33\x66\xb0\xfa\
+\x6e\x87\x13\x45\x1f\x0d\x04\x1c\xbe\x43\x92\x57\xf8\x23\xa5\x91\
+\xa3\x80\x04\xad\x3d\x1c\x72\x8d\x66\xb6\x66\xd3\xe8\xc7\x02\xbe\
+\x31\x95\xa6\x79\x6f\x79\xab\x37\x6b\x86\x61\xfe\xe9\xbb\xb8\x19\
+\xe5\x2f\x06\x46\x1e\xa8\x26\xfa\xb5\xa3\x71\xd6\xc4\x41\x25\x61\
+\xd0\x42\x81\x9c\xdc\x26\xf6\xee\xf6\xc0\x47\x02\x2f\xee\xbb\xad\
+\x76\x72\x6e\xd3\x9c\xd0\xa1\x58\x17\xe2\x83\x9c\xae\x3e\xfc\x70\
+\xa6\x1a\x4d\x3b\x83\xc4\xc0\x88\x98\x0a\x92\xf2\x49\x20\x52\x1a\
+\x1c\x50\x32\x12\x0a\x38\x71\x39\xbb\x91\xad\xfb\x32\x68\x40\xc0\
+\x7f\xf7\x0d\xb5\xcd\xe5\x36\xcd\x9d\x3c\x02\x1b\x26\xfa\xe2\x42\
+\x33\x87\x5a\xbb\x1b\x59\x17\xee\xc0\xb4\xeb\x35\x31\xe0\xf3\x4d\
+\x39\x49\x8c\x0e\x82\xa1\xce\x4e\x33\xa0\x4b\x64\x75\x20\x3f\xa3\
+\x9e\x6d\xd8\x13\x2c\x02\x46\xee\xb8\xa6\xe6\x00\xd3\x2c\x1a\x7c\
+\x8d\xd6\x17\xc9\x75\x4e\xb4\x38\x79\xda\x75\x52\x64\xa6\x56\xa1\
+\xf1\xbb\x71\x62\x60\xf8\x17\x65\x24\x71\xeb\x58\x24\xd6\xda\x04\
+\xa0\xad\x9b\x16\x2b\xb3\x8e\x35\xed\x7d\xfd\x21\xc0\x67\xf3\x9f\
+\xbe\x9c\x9b\x6f\xfa\x6c\x59\x20\xa6\x04\x78\x23\xa1\xca\x8a\x2e\
+\x27\x01\xed\x6a\x28\x15\x52\xe4\x9c\xad\x40\xd3\xfe\x10\x31\x30\
+\x6c\x7b\x29\xf9\x65\xfb\x38\x9c\xa9\xea\x85\x4a\x26\x41\x7b\xa7\
+\x07\xa8\x65\x9b\xf7\x8f\xbf\x0f\x8c\x58\x6f\x5c\xec\x70\x33\xfa\
+\xad\xab\x5f\x41\xe8\x4b\x34\x78\xb5\x1d\x3d\x74\x59\x68\xd3\x81\
+\x71\xd3\x97\x4a\x0a\x63\x72\x39\xcc\xb1\x1a\x31\x30\x64\xcb\x55\
+\x92\xf0\x79\x08\x12\x2b\xac\x42\x0d\xda\xac\x4e\x94\x5e\xac\x66\
+\x9b\x0f\x69\x04\x60\xd8\xaa\xdc\x70\xa7\x9b\x18\xb6\xac\x0d\xc6\
+\x94\x97\x87\x22\xee\xb6\x15\x56\xfa\xcf\x3d\xc1\xe9\xde\xa4\x1b\
+\x94\x40\x4e\x81\x82\xa4\x5b\x68\x3b\x3a\x49\x0c\x3c\xb7\xb1\x88\
+\x9c\xdc\x35\x01\xa7\x6f\xf5\x40\x2e\x97\xa0\xb3\xc3\x81\xb2\x9c\
+\x9a\xe2\x96\x58\xad\x66\xc8\x92\xf4\x70\x5e\x2a\x33\x44\x47\x05\
+\x63\x6c\xc0\x50\x9c\xad\xb2\xc1\xd2\xdb\x27\xec\x76\x72\x2f\x8a\
+\x67\x02\xc8\x54\x32\x14\x27\x96\xa0\x3d\x7e\xaa\x18\x18\xbc\xae\
+\x80\xc4\xed\xd6\x22\xa1\xac\x0b\x4a\x0f\xd0\xe9\x40\x79\x66\xb5\
+\x91\x6b\xed\xd8\xab\xf4\xf6\x4a\x8f\xd9\xa1\xa1\x01\x14\x88\xbf\
+\x61\x05\x43\x83\xd1\xcd\xde\x1f\x9c\xef\xcf\x00\x74\x89\xa4\x14\
+\x28\x49\x64\xd1\xa9\x0b\x13\x03\xcf\xac\xcc\x23\xc7\xf6\xbc\x83\
+\xf8\xbf\x2c\x02\x60\xa1\x3b\xb2\x32\xab\x22\x87\x6b\x6d\x1f\xe3\
+\x3f\xf6\x85\x51\x5f\x7d\x1a\x82\xef\x8b\xba\xe1\x85\xfe\xe0\x6e\
+\x0f\x40\x3c\xc1\x79\xe1\xf7\x84\xef\x07\x6e\x9e\x2e\x86\x45\x3f\
+\x53\x0c\x0c\x8a\xcc\x26\xb1\x7b\x27\x23\xbe\xb4\x4b\x28\x72\x37\
+\x5d\xa2\xda\xcc\x5b\x85\x1d\xba\xf7\x26\xa9\x66\x18\x9a\xd4\xaf\
+\xfa\xf8\x2e\x8f\x1a\x8f\xd4\xbf\xed\x50\x78\x52\xe8\x8f\x4b\x03\
+\x93\xfe\x0c\x3c\x59\xa9\xe4\xb8\xad\x2b\x40\xf7\x6f\x1f\x88\x01\
+\xaf\x88\x74\x72\x60\xdf\x34\xc4\xb3\x9d\x50\xd1\x0c\xac\xad\x4e\
+\xd4\x67\x95\xb1\x9d\x86\x59\x42\x91\x95\x33\x92\xf4\xde\xc3\x9f\
+\x5f\xbc\x70\xfd\x9b\x30\x9a\x78\x1a\x98\x17\x96\x8a\xe0\x3f\x88\
+\xa1\x40\xad\x2e\x1f\x3d\x69\xf3\x06\x00\x3e\x4c\x23\x31\x07\xa7\
+\x23\xae\xd0\x02\x2f\x9a\x81\x8d\x66\x60\xca\xb8\xce\x76\xa5\xce\
+\xbd\xdf\xa6\xaa\xb0\x44\x83\xe2\x59\x79\xf8\x86\x9d\x61\x38\x5f\
+\xc9\x81\xa1\xe3\xfd\x5f\x45\x80\x14\x32\x34\xe8\x8c\xb0\x66\x2c\
+\x12\x03\xca\x39\xe7\xc9\x9e\x83\x33\x71\xa2\xa0\x1d\x5e\x0a\x09\
+\xec\x9d\x76\x34\x67\x94\xb0\x3d\x69\x0b\x1e\xda\x68\x8a\x77\x75\
+\x5f\xcb\x07\xa9\x76\x47\x6e\x0e\x45\xb6\x89\x86\xe5\xdc\xf7\x6a\
+\x41\x03\x2a\x65\x30\xff\x9a\x87\xde\xec\xa5\x62\x40\xfe\x7e\x0a\
+\xd9\x15\x3b\x1b\xa7\x2e\xb7\x43\x41\x9b\x9b\xb3\x38\xd0\x9a\x55\
+\xca\x5a\xd3\x17\x8a\x46\x85\x74\xca\xc9\x70\x9e\x23\x86\x55\xdb\
+\xc2\x90\x6f\x53\x0a\xf5\x92\xd2\x01\x49\xfb\x1b\xed\xfa\x6c\xd8\
+\xf3\x56\x0c\x00\x4c\x33\x90\x6d\x87\x28\x70\xa9\x0d\x2a\x9a\x01\
+\xd7\x46\x7b\xfd\x8f\xab\x6c\x6f\x66\xe4\x80\xc3\x4e\x1a\x1a\xbf\
+\xd8\xed\xea\xd3\x2f\xdb\x36\x1d\x46\x0f\xd2\x46\x11\x25\x7d\xd7\
+\x67\xc2\x69\x5c\x2d\x06\x64\x53\x75\x24\x3a\x76\x3e\x74\x59\x2d\
+\x50\x2a\x25\x70\x75\xd8\x60\xcd\x63\x59\x7b\xde\xb2\x47\x8e\x6b\
+\x89\xf6\xb8\x2f\x6f\xe3\x9a\xb4\x11\x5a\xf4\x06\xf8\xa1\xa6\x9e\
+\x83\xf3\xdc\xef\xe8\xbb\xb2\x4e\x0c\x30\x6f\x27\x90\x35\x47\x16\
+\x20\x29\xd3\x4c\x87\x1d\xe0\xb2\xd8\xe1\x30\x5e\x65\x9d\x97\x56\
+\xfe\xff\x81\xa3\xfd\x49\x0d\x1b\x67\x0a\x8d\xd0\xc0\x1c\x14\x88\
+\xca\x6f\x93\x80\x92\x68\x31\x00\xed\x09\x12\xf9\xe3\x22\xa4\x5c\
+\x34\x43\xae\x64\xc0\xd3\x0c\x5c\xf9\xc5\xac\xab\x60\xcd\xe3\x8f\
+\xcc\x89\x47\xfc\x60\xe7\xae\x04\xcf\xd6\xf8\x95\x65\x5c\x03\xae\
+\x0d\x04\x68\x8e\x93\x88\x9f\x97\x23\x39\xad\x11\x32\x5a\x03\x7a\
+\xe2\xc0\x6d\x2c\x60\xdd\x45\xeb\x9f\xfc\xa9\x62\xc2\x61\x13\xad\
+\xb6\x1a\x45\x1b\xc5\x80\x64\x52\x1c\xe1\x1d\x4e\x61\xae\x0b\x7b\
+\x93\x9e\x09\x8c\x4c\xca\x92\xc2\xa7\x00\x84\x95\x38\x6a\x41\xe1\
+\x06\xe1\xb1\xe5\x1f\x55\x1f\x6f\x37\x94\x8e\x85\xe9\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x32\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xf9\x49\x44\x41\x54\x78\xda\xad\x55\x5d\x4c\x14\x57\
+\x18\x3d\x77\x66\x76\xd9\x95\x3f\xf9\xd9\xd2\x2e\xb0\x6b\x03\x06\
+\x01\x5b\x60\x09\xa0\x04\xa2\xa5\xa6\xf6\x81\x92\x50\x62\x6a\x9a\
+\xd4\x27\xed\xcf\x43\x1b\x6b\x4d\xfa\x40\x4c\x88\x4d\xdb\x48\x1b\
+\x4c\xa4\x49\x4d\x4d\x4c\x9a\xc6\x98\xfa\xd3\x68\x7d\x31\x7d\xd2\
+\x54\x24\x28\x85\x5a\x04\x0d\xb0\x01\x64\x81\x45\x04\x2a\xb0\xc0\
+\xb2\xbb\x73\xfb\xdd\x3b\xb3\x0b\x9b\x3e\xb5\xe1\x26\x3b\x77\xe6\
+\xce\x37\xf7\x9c\xf3\x7d\xe7\xbb\xcb\x40\x23\xa3\x65\x60\x4f\x6a\
+\x9a\xed\xc2\xfe\xa2\xa4\xec\x14\x2b\x03\xe7\x30\x86\x2a\x2e\x0c\
+\x8c\x19\x8f\xd1\x99\x73\x63\x8d\xcb\xb7\x62\x28\xf2\x46\xa1\x9f\
+\x2f\x10\xc1\xad\xc1\xe5\xdb\x7a\x98\xef\xf7\x7d\xe2\x0e\xb2\xf4\
+\xe6\xbe\x3d\xfb\x2a\xd2\x6e\xfd\xd8\x90\x8d\x89\x25\x8e\xe8\xde\
+\x72\x43\xf3\x81\x3e\x47\x84\x50\x9f\x07\x82\x08\xeb\x61\x64\x26\
+\x27\x42\xd1\x18\x74\xbe\x21\xda\x44\x4b\x20\xe4\x44\x0d\x78\xf3\
+\x92\x1f\xf7\x0e\x39\x19\x73\x7f\x35\xe0\xeb\xff\xbc\x30\xfb\xc6\
+\xd8\x0a\x96\xd6\xa2\x8c\xc4\xae\x4a\x6c\xf3\xd1\xd9\x55\x0c\xf9\
+\x17\x62\x7b\x3d\xf5\x4e\x61\x9b\x2b\x1d\x35\x1e\xd7\x3a\x80\xb2\
+\x4e\xca\x9d\xa4\xc2\x12\x0e\xe1\xad\xf3\x4f\x5a\xd9\x91\xeb\xe3\
+\xbc\xbe\xd4\x81\xc9\x65\x1d\x1a\x8b\x69\xa6\x78\x66\xca\x66\x18\
+\x79\xb6\x8a\x43\xc5\x29\xc8\x4b\x8e\xc1\xe3\xf0\xe5\x61\xd4\x55\
+\xba\x11\x0e\xeb\xeb\xa4\x28\x96\x4b\xb5\x40\x45\x86\x05\x47\x7e\
+\x19\x1b\x63\x1f\x5e\x1b\xe7\x65\x3b\x1c\xd0\x23\xba\x19\xb4\xae\
+\x42\x88\x10\x00\x8f\xa6\x03\xf8\xa8\x34\x3d\x0e\xa0\xbe\xbd\x1b\
+\xef\xd6\x97\x10\x40\xc4\x48\x2b\xc5\x45\xdf\x52\x89\x90\x66\x53\
+\xd1\x7a\x73\x1c\xac\xee\xbc\x97\x1f\xd8\xed\x94\x4c\xa2\x11\xea\
+\x06\x46\x02\x60\x6a\x71\x0d\xef\x15\x26\xc7\x00\xbc\x8b\x1c\x67\
+\x3b\x27\x50\xf4\xb2\x83\xd8\xea\x92\x95\x02\xc4\x7d\x6f\xb3\x28\
+\x38\xf3\xdb\x28\xd8\x6b\x3f\x0c\xf2\xa6\xea\x6c\xc9\x44\x54\x8a\
+\x99\xb9\x37\x1c\x23\x13\x85\xc5\xa0\x8e\x62\x87\x05\xc5\x69\x56\
+\xf9\xae\x7f\x7e\x0d\x3d\xfe\x20\x5e\x4a\xb2\x12\x5b\x1e\xa7\x38\
+\xfa\xad\x00\x68\xbd\x31\x06\x56\x7b\xf6\x31\x6f\xda\x9d\x83\x20\
+\xa5\x48\xdb\x90\x1f\x31\xa9\xa6\x8d\x7e\x9f\x0c\x81\xfb\xa7\xe5\
+\xfd\xf2\xc2\xb2\x9c\x77\x96\xba\xe1\xca\xdc\xf2\x2f\xc5\x51\x30\
+\x01\xf0\x73\xf7\x34\x58\x4d\xfb\x00\x6f\xaa\xc9\x45\xd0\x4c\x11\
+\x8b\xc5\x1a\x05\x53\xc8\xdc\x5d\x53\x94\xa2\xe2\x44\x34\xb8\x2c\
+\x98\x5d\xd2\xd1\x31\x17\xc1\x4f\xfd\x01\xd4\x3a\x2d\x86\xf9\x65\
+\xbc\x12\x23\x26\x2e\x56\x4d\xc1\x95\xae\x29\xb0\x8a\xb6\x3e\xde\
+\xb8\x37\x17\x7a\x68\x5d\xa2\xca\x14\x53\x81\xb1\xd6\x31\x15\x42\
+\x5b\x95\x1d\xb9\xe9\x76\xf9\x7e\x7c\x6e\x05\xc7\xba\x56\xb0\x37\
+\xc7\x26\xfb\x43\x30\xd1\xe9\xa2\xc0\xec\x23\x9d\x21\xc1\x46\x00\
+\x77\x27\xc0\x3c\xa7\x1e\xf0\xc6\xd7\xdd\x88\x90\x02\x51\x50\x8d\
+\xf4\xce\xad\x72\x4c\xaf\xe8\x78\xba\x14\x11\x7d\x8c\x8e\x1e\x3f\
+\xfa\x8f\xe6\xc7\x01\x94\xb4\x7b\xb1\xab\xec\x45\x24\x52\x2a\x1c\
+\x94\xa9\x17\xec\x1a\x39\x47\xa1\xe6\x13\xbd\x40\xfb\x90\xe7\x2f\
+\xdf\xf5\x81\x95\x9d\xea\xe5\x8d\x75\xdb\x30\x13\xd0\x31\x30\xb3\
+\x86\xe9\x85\x30\x22\x14\xa5\xa9\x4c\xaa\x57\x35\x0b\xbc\x03\x53\
+\xe8\x3b\x5e\x10\x07\x50\xde\x36\x88\xfc\x57\x9c\xd0\x75\x5d\x1e\
+\x1d\x42\x86\x95\x8e\x19\x27\xb5\x71\x41\x3a\x43\x56\xa2\x05\x97\
+\x6e\x93\x4d\x5d\xc7\x3a\xb8\xc3\xb3\x0d\x73\xf3\x21\xda\x4c\x91\
+\x76\x53\x49\x05\x23\x99\xcc\x2a\x0a\xc8\xe0\xfd\x6b\x12\x8f\x4e\
+\xec\x8c\x03\x78\xf5\xcb\x3e\xe4\x7b\xdc\xe4\x22\x6a\xb4\x08\xc5\
+\x52\x39\x58\x44\xf4\x00\x93\x69\x73\xa6\x5a\x30\xd2\x3f\x09\x66\
+\x7f\xfb\x1a\xcf\xaa\x2b\x03\x42\x94\x0e\x02\x10\x16\x13\x20\x8c\
+\x24\x32\x51\x77\x5a\x1b\xe9\x1e\xc5\xf0\xd7\xe5\x71\x00\x45\xcd\
+\xdd\xc8\xdb\x9d\x07\x2e\xcd\xc1\x64\xad\x98\x59\x6c\x51\x07\xd5\
+\xaa\x60\xe2\x81\x4f\x00\x5c\xe5\x99\xb5\x1e\x2a\x52\x44\x16\x4b\
+\x83\xc1\x82\x45\x1b\x8d\xf2\x3a\x76\x77\x04\xa3\xa7\xab\xe2\x00\
+\x0a\x3e\xeb\x82\xab\x76\x3b\x11\xd3\xa5\xd3\x24\x19\xab\x50\xce\
+\xa5\x03\x55\x55\x81\xff\x21\x01\x24\x34\x5c\xe1\xc9\x35\xa5\xc0\
+\x5a\x58\x36\x99\x64\xa1\x19\x36\x15\xfe\x66\x09\x2a\x7c\x77\x06\
+\x71\xfd\x9b\xbd\x64\xd3\x04\x09\xf0\xeb\x93\x20\x0e\xb4\x74\x22\
+\xa7\x22\x8f\x1c\xa3\xc7\x29\x96\x1b\x28\x02\x40\xc5\xcc\x9f\x23\
+\xf4\x58\xfd\xfd\xb9\xa4\x7d\xb5\x87\x15\x2b\xb5\x99\xc8\x27\xa2\
+\xcd\x62\x02\x10\x50\xf0\xd9\x92\x5c\xe9\x69\x29\x93\xb3\xa7\xa5\
+\x17\xf6\xad\x5b\x60\xa5\x4e\x96\x09\x61\x2c\xd6\x3b\x10\xad\x21\
+\x5a\x96\x6e\x27\x6f\x76\xf9\x8d\x4c\xbc\x71\x61\xdc\x52\xb8\x3d\
+\x47\xc9\xd8\x0a\x95\xce\x16\x91\x22\xd5\xfc\x43\x51\x89\x99\x42\
+\x56\x5c\xf5\xcd\x63\xc5\xeb\x13\x86\x47\x6a\x45\x01\xac\x36\x4d\
+\x9e\x6a\x4c\xe5\x92\x88\xa2\x2a\x12\x80\x59\x55\x84\xe6\x57\xf1\
+\xf7\xfd\x87\xd0\x57\x02\xce\xf5\xe3\xb1\xb2\xed\x24\x92\x32\x3e\
+\x25\xf8\x24\x70\xb3\x62\x8a\x71\xbe\x0b\x36\xaa\xc3\x21\x67\xb9\
+\x09\x41\x6b\xce\x2c\xa8\xa9\x76\x23\xe7\xc4\x46\x9f\x5d\x44\x88\
+\x7e\xe1\x69\x3f\x42\xcf\x17\x2f\xf1\x8e\x0f\xde\xd9\x70\xfe\xfd\
+\xc7\x51\xf5\x5d\x02\x15\x6c\xd0\xbe\x67\x97\x8b\xd9\x6c\xf2\x48\
+\x0c\x0e\x8d\x22\x34\x34\xfc\x3e\xee\x7f\x7c\x6e\x63\xe8\xff\x03\
+\x88\xa9\x3e\xd3\xab\x54\x57\x97\x6a\xe9\x29\x08\x0f\x0c\x43\x1f\
+\x1b\x2c\x47\xe7\xd1\x9e\xcd\x03\x90\x20\xdf\x5e\xc4\x8e\x92\x83\
+\x58\x0d\xd2\x7f\xeb\xe3\x4a\xdc\x3b\x7e\x7f\x73\x01\xc4\x28\x3b\
+\x79\x11\x29\x99\x07\x11\x98\xaf\x42\x77\xf3\xbd\xcd\x07\x10\xc3\
+\xf3\xc5\x55\xda\xed\x34\xfe\x38\x71\x67\xe3\xf2\x3f\x54\x7c\xd3\
+\xab\x0b\x25\xef\xbf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\xcd\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x94\x49\x44\x41\x54\x78\xda\xad\x55\x5d\x4c\x1c\x55\
+\x14\xfe\xee\xec\xce\xee\xec\x82\x54\x0a\x42\x01\x11\xdb\x52\xda\
+\x20\xe5\xa7\x50\xf1\xc1\x84\x58\x24\xa4\xc6\xa6\x3f\xb4\xfc\xb4\
+\xd4\xc4\x07\x9f\x7c\x50\x1f\x4c\x63\x68\x64\x41\xaa\xf6\xd1\x46\
+\x13\x23\xda\x87\x2a\x50\x6a\xdb\xd4\x6a\xa2\xb6\x56\xe2\x43\x6b\
+\x05\x59\x16\xa8\xb5\x95\x96\x74\x83\x60\x09\xc5\x5a\x76\x97\x01\
+\xf6\xce\x5c\xcf\xdc\x85\x42\xb4\x2e\x24\x32\xc9\xdd\xc9\xcc\xbd\
+\xe7\xfb\xbe\xf3\x9d\x73\x66\x19\x96\x78\x79\xdf\xdc\xa1\x29\x36\
+\x45\x07\x63\x60\xaa\xd3\x91\xf7\x46\x6b\x78\x29\x71\x6c\xe9\x04\
+\xdb\xcf\xac\xde\x7f\x68\xbb\x10\x02\xfe\x36\xcf\xf1\x82\xfa\x53\
+\x35\xcb\x46\xd0\xfb\xce\x5e\x8d\x29\x9a\xbe\xf1\xd5\xe7\x80\xc0\
+\x59\xf4\x7f\xac\x41\x88\xa0\x8b\xb2\x98\x5a\x1e\x82\xa6\xea\xe3\
+\xc9\xa5\x3b\xab\x92\xd7\x7c\x08\x08\x37\x6e\x7b\x57\x61\xd4\xab\
+\xb7\xe7\x1f\x6c\xad\x5e\x16\x82\xee\xba\x5d\x22\xff\xc0\x0e\x20\
+\xd4\x0a\xc5\x74\x82\x73\x86\xbe\x4f\x62\x51\xd8\xf8\xd9\xa2\xf1\
+\x8b\x1e\xf0\x79\x2a\xde\x4d\x2a\xa9\x3c\x90\x92\xdb\x0e\xa1\x53\
+\x5d\x85\x02\x66\x17\xf8\xfd\x52\x0c\xc6\xaf\x29\x0d\xf9\x75\x2d\
+\x9e\xff\x45\xd0\x5d\xb7\x53\xe4\xd7\xbd\x08\xdc\x7b\x1f\xcc\x70\
+\x11\x01\x05\x11\x89\x69\x0a\xf8\x8e\xc6\x50\x16\x2d\x6c\x49\x04\
+\xde\x83\xcf\x27\xf2\x29\x3d\x57\x8d\x8b\x7b\xd6\xd4\xa7\x92\x98\
+\xdd\x5e\x2c\x0c\x33\x67\x55\xe9\x7e\xa4\xe6\x9d\x80\x98\x99\x01\
+\x4c\x1b\x2d\xc8\x3b\x53\xc3\x18\xba\x94\x84\xb1\x9e\x71\x30\x9b\
+\xf9\x8b\xe0\xe1\xcb\x36\x97\x7b\x84\x87\x82\xe7\x15\x55\xbd\xb6\
+\xa9\xe9\xab\x31\x49\xd0\xf7\x76\x4d\xa7\x30\x66\x36\x3b\x12\x1f\
+\x87\xe3\x91\x47\xf1\x70\xf6\x16\xd8\x1c\x0f\xc1\x95\x9c\x02\xd5\
+\x19\x24\x05\x1d\x30\xc7\x9b\x49\xbd\x5b\xaa\x8f\x10\x58\x59\xd0\
+\x8f\x96\x0a\x91\x78\x18\xe1\xc0\x38\xf4\x09\x05\xc6\x74\x00\x7f\
+\x5d\xed\xc0\xcc\xd8\x10\x2d\x3f\x98\x62\xef\x62\x3d\x1e\xb2\xa0\
+\xfe\x34\x45\x75\xd2\xf2\x03\xfa\x20\x4c\xfd\x6b\x02\x54\x20\x4c\
+\x4a\x50\x90\x6a\xa1\x81\x99\x4a\x84\xc0\xb0\x9e\x0d\x5a\xf4\xc0\
+\x89\xc4\x9c\xa2\x3d\x16\xd9\x8b\x2d\x02\xec\x2b\x80\xf8\x32\xc0\
+\xb5\x01\xbe\xc6\x17\xc0\x7a\xdf\xaa\xfe\x28\xbe\x40\x79\x29\xbd\
+\x6c\x0c\xc6\xa4\x9d\x0e\xb2\x88\x05\x56\x90\xa5\x96\x80\x98\x7c\
+\xc7\xee\xdb\x23\x09\x8c\xf9\x6c\x08\x95\xee\x24\x80\x1b\x14\x47\
+\x2f\x14\x8e\xa1\xcb\x76\xdc\x1d\x73\x37\xcb\x1a\xf4\x78\xf6\x8d\
+\x24\xe4\xf3\x94\xf4\xad\xd3\x30\x43\x82\xe2\x09\x54\x82\x5b\x00\
+\x62\x5e\x3d\x15\x57\x12\xfd\xf3\x3e\xe9\x97\x99\x32\x8b\x54\x05\
+\x06\xbe\xd1\x10\x98\x88\xf9\xa3\xf0\xd0\x17\xa9\xf7\x8b\xdc\xe3\
+\xa9\x1d\x5e\x99\xc7\x53\x1f\x2b\x0b\x51\x3b\x32\x29\x52\xb6\x80\
+\x69\x27\x02\x5b\xc4\xaa\xa9\x21\x20\x7c\x07\x62\xf2\x2e\x30\xa3\
+\xd3\x54\x07\x22\x99\xd0\xb2\xc0\xad\xe3\xde\xa3\x2a\x06\x06\xd9\
+\x48\x75\xff\x4c\xda\xbf\xda\xb4\xa7\xa1\x76\x38\x21\xd7\x48\x4d\
+\x2f\xd3\x09\x44\x85\x08\x4f\x10\xd0\x20\x11\x8e\xd3\x90\xfd\x39\
+\x0f\x36\x67\x4d\x98\xc2\x0d\xfa\xf8\xd1\xe0\xd1\x37\x10\xde\x66\
+\x0d\x37\xfc\x6c\xa4\xca\x1b\x4c\xfb\xcf\x39\xf0\xd5\xd7\x0e\x3b\
+\x57\xfe\x96\xba\xbe\xa2\x0f\xfc\x1e\x15\x90\xcf\x81\xd2\x80\x71\
+\x21\x33\x93\x04\xd6\xb7\xd4\xda\xa3\xfa\x90\xe5\x18\xfa\xce\x81\
+\x4b\x1d\xea\x48\xb5\x2f\x90\xb6\x10\xef\x81\x43\xd2\xb2\x5a\x13\
+\xd5\x17\xc8\xa6\x29\xca\x84\x54\x4a\x6f\x49\x29\x88\x60\xce\x0e\
+\x09\xce\x23\xea\xcd\x10\xd0\x5e\xef\x16\xfb\x7e\x0d\x28\x4b\x9a\
+\xe4\xd6\x4c\xa7\xa8\xe9\xce\x02\xf7\xf7\xcb\x22\x4a\x7f\x79\xa4\
+\x79\x98\x55\xec\x69\xcc\xda\xc5\xa4\x4d\x8a\x26\xd0\xf6\x8a\x0b\
+\x7b\xaf\x86\xd8\xa2\x04\xa7\x0a\x5d\x99\x69\x4f\x97\x0f\x14\xbf\
+\x76\x06\x7c\xc2\x52\x3b\xe7\xf3\xac\x3d\xc6\xac\x3d\x32\x0b\x45\
+\x66\xa2\x50\x97\x5e\x3c\x96\x81\xd1\x9b\xa3\x6b\x2b\xba\x42\x83\
+\x51\x09\x4e\x6e\x72\x6d\xcb\x78\x2a\xf9\x6c\xd1\xeb\xb7\x88\x60\
+\x81\x3d\xd4\xba\x8a\x88\x00\x8b\xe9\x88\x3d\xb2\xc8\x16\x01\xb5\
+\x66\xe7\xb1\x78\x0c\x0d\xea\xe5\xbb\xbb\x42\xe7\xa2\x12\x7c\x9e\
+\xe7\x6a\x2a\x78\x39\xbb\x6e\x4d\x49\x37\x0c\x6a\x57\xab\xa0\x8a\
+\x35\x0b\x24\x76\xe2\x8a\x2a\x09\xe2\xb2\xc2\xd4\x65\x54\xa3\x69\
+\x45\x66\xa3\x50\x07\xdf\x3c\x6f\x47\xcf\x45\x47\xc3\x1e\x6f\xc0\
+\x13\x95\xa0\x3d\xc7\x75\xa1\xf4\x48\xd6\x96\xf8\xa4\x5e\xa9\x5c\
+\x21\x8c\xe9\xdb\x0a\xbc\x1f\x38\xe1\x1f\xb0\xc9\x33\x19\xeb\x0c\
+\x14\x56\x72\x38\x12\x38\xb5\x30\x75\x17\x65\x77\xe7\x56\x1c\xbe\
+\xff\x34\x7c\xae\xca\x17\x2c\x8f\x4e\x90\xed\x1e\xd9\xd6\x16\x9f\
+\xe2\xd2\x86\x61\x90\x45\x7d\x47\x9c\xb8\xde\xad\x42\x75\x8b\x86\
+\xdd\x3f\x07\xa5\xba\x93\x9b\x63\x3d\x61\x9d\xd5\x67\x6d\xe0\x28\
+\xd8\xc3\xc1\x34\x0e\x7d\x7c\x05\xbe\x7c\x8f\x0f\x56\xf5\x06\xd7\
+\x46\x27\x78\xc2\x25\x2a\xbb\x8a\x70\xbd\xf1\x47\x5c\xf9\x56\xa3\
+\x13\xac\x7d\xb7\x37\xf0\xc0\xbf\xc6\x93\x45\xb1\xc7\x69\x0e\xaa\
+\x72\x36\x72\xac\x2f\xe7\x38\x71\x58\x43\x95\x2f\xc0\xa2\x12\x9c\
+\x7e\x32\x66\x20\x3c\x69\x66\x2a\xaa\xed\x07\x9b\x03\xcf\xec\xfa\
+\x29\x28\x10\xe5\x3a\x5d\x1c\xcb\x4c\x03\x1d\x86\xc1\x4a\x54\x87\
+\xb8\x41\xe7\xd7\x2d\xdc\xff\x1b\x62\xa3\x1e\x9e\xc1\x99\xfe\xff\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x7b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x42\x49\x44\x41\x54\x78\xda\xb5\x94\x7b\x48\x53\x51\
+\x1c\xc7\xbf\xe7\xee\xb6\x56\x96\x5e\x35\x34\x32\x7b\x4c\x8d\x9c\
+\x96\xad\x34\x0d\x0a\x57\xd0\xeb\xaf\xea\x8f\x88\x88\xa0\xd7\x1f\
+\xfd\x25\x99\x3d\x28\x03\x0d\x2a\x0a\xac\xd6\xa4\xfe\x08\x8a\xa2\
+\xa2\x20\x4b\x7a\x62\x45\xb4\xca\x6c\xad\xa2\x29\x36\x21\x75\x36\
+\x6f\x2b\x18\xd2\x66\xaf\x6d\xf7\x75\xba\x9b\x30\x58\x6a\xa4\xb3\
+\xdf\xe5\xdc\xef\xe1\x9e\x73\xbe\x9f\x73\x7e\xf7\x9c\x43\x30\x02\
+\x51\xbe\x73\x17\x95\x25\x09\x16\x8b\x99\xfc\xd9\x46\x86\x63\xf8\
+\xa7\x79\x47\x7b\x3b\x42\x82\x00\x21\x24\xc0\x6a\x7d\x1c\xe3\x19\
+\x17\x60\xcf\xde\xfd\xd4\xe5\x72\xa1\xee\xfa\xb5\x88\x4f\x69\xe9\
+\x12\x2a\x8a\x02\x9a\x9a\x1a\xa3\xbe\xc3\x06\x54\x1e\xa8\xa2\x6e\
+\xf7\x47\x5c\xbe\x74\x31\xea\x51\x56\xb6\x83\xda\xed\x76\xd8\x6c\
+\x4d\xf1\x01\xaa\x0f\x1e\xa2\xdd\xdd\xdd\x38\x7f\xee\x6c\xcc\xf8\
+\x9a\x9a\x13\xf4\x46\x5d\x1d\x5e\xc6\x03\x38\x7c\xe4\x18\xf5\x78\
+\x3c\x38\x73\xda\x12\x33\xf6\x94\xa5\x96\xde\xbc\x51\x0f\x49\x12\
+\x93\x5f\xbc\x78\xee\x1f\x16\x60\x30\xf3\xda\xda\xd3\xf4\xee\xc3\
+\x3b\x78\x70\xa7\xa1\xff\x2e\x9a\x55\x51\xc0\x69\xc7\x6a\x4e\x8e\
+\x1e\xa7\xd9\x34\xd4\xd5\xe8\x44\x1d\xd6\xa4\xae\x43\x43\xc3\x43\
+\xf8\x0c\x5e\x80\x93\xa3\x6d\xa1\x1f\xb2\x59\xf8\x25\x1f\x24\x5b\
+\xef\xad\xf4\xcd\x9b\x0e\x8e\x61\x34\x08\x3f\x2c\xc3\x82\x21\xe1\
+\x32\x4a\x2d\x8c\x5a\x34\x50\xdf\xa0\x84\x80\xd0\xf0\x94\x28\x28\
+\x55\xd0\x68\x0b\x82\xb1\xa5\xa3\xa7\xb7\x07\xcb\x0e\x88\x50\xa8\
+\x04\x59\xfd\xae\x28\x92\x5a\x97\x21\x43\xc1\xbb\x2e\xe2\x27\x55\
+\xd6\x6d\x54\x9b\xc8\x23\x28\xff\xfa\xe7\x99\x53\x91\x81\xf7\xba\
+\x1e\x81\x6f\x12\xd2\xd7\x7a\x30\x26\x55\x1c\xb0\x9f\xfb\xb3\x0c\
+\x52\x71\x7f\x0b\x0d\x25\x76\x0c\x29\x35\x4a\x6b\x1a\x42\x2d\x1c\
+\x46\xaf\x70\x83\x49\x09\x0d\xda\x8f\x77\x0b\x20\x5b\xae\xae\xa7\
+\x98\xf8\x79\x68\xc9\xef\xd5\xa9\xcb\x50\xf3\xc5\x85\xfe\xda\xcd\
+\xdd\x16\x00\x29\xd8\x5d\x50\x9d\x98\xa1\xad\x22\x71\x5f\x1a\xfd\
+\xe3\x87\x57\xec\xbb\x9c\x56\x5d\x29\xa1\x23\x6f\x0f\xdc\xda\x60\
+\xeb\x9b\xf7\xd2\xb3\xc5\x4f\x96\x97\xb0\xa6\xa0\x4c\xa0\xd3\x8c\
+\x0c\xeb\x59\xb3\xec\xb8\xbd\xd1\x66\x8c\x00\x4c\x96\xf9\xd5\xc5\
+\xf3\xd8\xaa\xf1\x63\x19\xf0\x5e\x05\x2e\xbe\x17\xfa\xcc\x24\x74\
+\xba\xfd\xc8\x9a\xca\xa1\xe3\xa3\x0f\xd9\xd3\x92\x23\x3a\x37\x3f\
+\x05\xce\x4e\x05\x86\x2c\x66\x40\x2d\xca\x65\x22\x00\xeb\x4b\xf1\
+\x82\xb5\xcc\xbe\x39\x02\x58\x78\xbc\x68\x75\x56\x36\x5b\x3f\x65\
+\x92\x26\xb2\xb5\xba\x5c\xbd\x98\xae\x4f\x82\xab\xc3\x0f\x7d\xb6\
+\x0a\x68\xf7\x23\x3b\x47\xd5\x0f\x3e\x14\x16\xa6\xa2\xd5\x29\x22\
+\xdf\x30\x6a\x50\x95\x15\x8a\x66\x87\x58\xde\x58\xf1\xba\xef\x1f\
+\x2c\x38\x5a\xc8\x4d\x48\xd7\xf8\x0c\xb9\xda\xb8\x53\x23\xa9\x87\
+\xb9\x9b\x17\xc1\x77\x4a\x8b\x6d\x95\x6f\xac\xd1\xbd\x63\x32\x17\
+\x75\x4d\xcd\xd1\x4e\x8b\x17\xa0\xd3\x11\xb8\xda\x05\x3c\xda\x6e\
+\x8f\x78\x47\x01\x73\x2b\x8d\xf5\x39\x46\xdd\xea\x70\xbd\xed\xd5\
+\x57\x64\xcc\xe4\xc0\x3b\x7d\xc8\x34\x24\x83\x7f\xff\x15\x99\x79\
+\x29\x11\x9d\x55\x9a\x06\x67\xe3\x4f\x18\x16\x26\x0c\xaa\x6e\x67\
+\xd0\xd1\xb4\xef\xad\x31\x06\x30\x67\xef\x9c\x1d\x39\x25\x09\x27\
+\xc3\x75\xe7\xd3\x1e\x4c\xca\x4d\x82\xe7\xbd\x0f\x19\x79\xc9\xf8\
+\xd4\xea\xc3\xe4\xfc\x3e\xcd\x33\xa5\xa1\xed\xf9\x77\xe4\x2e\x1a\
+\x3f\xa0\xea\x8b\x12\xc0\xb7\x04\xcc\x8e\x63\x8e\xf2\x18\xc0\xec\
+\x8a\x02\x53\xfa\x0c\xdd\x13\x56\x5d\x22\xcb\x12\x24\x70\xec\x90\
+\xd3\xf3\xd3\x2f\x41\x08\x52\x7c\x69\x0b\x6c\x6e\xa9\x69\xbe\x10\
+\x03\x08\xc7\x92\x33\xc5\x23\x72\x08\xbc\x1f\x02\xc6\x56\x73\x8b\
+\xa3\x1f\xe0\x7f\xc4\x6f\x40\x47\x80\x44\x90\xc1\x0b\x05\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x16\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xdd\x49\x44\x41\x54\x78\xda\xb5\x95\x6f\x4c\x5b\x55\
+\x18\xc6\x9f\xd3\x01\xd5\xad\x63\xb0\x81\x08\xba\xad\x63\xe9\x64\
+\x83\xae\x40\x19\x19\xd9\x54\x44\x34\x9b\x11\x02\xcc\x59\x89\xcb\
+\xb2\xfa\xc1\xcc\xa8\x89\x9a\x68\x4c\xe6\x07\x16\xb3\xc4\xa8\x99\
+\x31\x6a\x34\x9a\x6c\x84\x98\x6c\x1f\x88\x23\xea\x87\x69\x71\xe0\
+\xdc\x80\xa5\xd0\x52\xa8\x74\x50\x4a\xdb\x75\x30\x20\x2b\xbd\xfd\
+\x43\x69\xef\xbd\xed\xf1\x42\xbb\xd6\xe6\x6e\x25\xd9\xb2\xe7\xd3\
+\xcd\xb9\xe7\x79\x7e\xef\x7b\xfe\xdc\x4b\xf0\x90\x45\x1e\xc4\xfc\
+\xc2\xaf\xb3\x39\x12\x42\xec\xc2\x63\xd7\x1f\x0d\x05\xda\x7b\x02\
+\xea\x7f\x99\x31\x16\x64\x67\x94\x7b\x97\xa2\x08\x71\xd1\x93\xdd\
+\x2d\x45\x6d\xab\x85\x3f\xdf\x39\x93\x43\x24\xe8\x69\xd8\xb5\xbe\
+\xdc\x30\x1b\xc2\xf4\x02\xd7\x2e\xf8\x44\x10\x52\x7b\xde\x65\x6f\
+\x54\x66\xcb\xb7\x6c\xc8\x82\x4b\x00\x5c\x1a\xf7\xc1\x1f\xe0\xb5\
+\xbd\xaf\x6d\x6e\x4f\x07\x10\x7c\x3d\xd5\xdb\xd6\xd6\xaa\x8b\xd6\
+\x62\x72\x31\x82\x81\x49\xff\xb2\xef\xa4\xe0\x4b\x29\x8e\xb4\xfc\
+\x36\x43\x5b\x55\xb9\xb0\x0a\xe1\xcb\x9a\xf3\xb1\x30\x5a\x7c\xb8\
+\x7c\x74\xeb\x3d\x97\xef\xe9\x0e\xc7\x59\xa5\x7c\xdd\xb1\x17\x8b\
+\x65\x18\x5b\x8c\xf9\xf8\x08\xc5\xc0\x72\x71\x7e\x56\xfb\xcf\x51\
+\x79\xa2\x38\xf2\xea\xef\x33\xb4\x66\x47\x36\xbc\x7c\x6c\xc0\xbd\
+\xc8\xc1\x60\xf6\xe0\xaa\xb6\xf8\xae\x80\x7d\x67\x6c\x5f\xe5\xe7\
+\x4a\xdf\x3b\xa2\xde\x88\x71\x21\x9c\xa3\xc9\x77\xcb\x90\x3e\xc1\
+\x1b\x5e\xe2\xb4\x57\xdf\xd8\xbe\x02\x21\x87\xbb\x5c\xb4\xaa\x24\
+\x17\xfe\xf8\x4c\x77\x80\xc5\xf0\xe8\x02\xfa\xdf\x54\x88\x00\x35\
+\x3f\x58\x8f\xe5\x6d\x92\x9e\x7d\xbd\x6a\x13\x2c\x42\x78\x84\x8a\
+\x0b\xf0\x86\xf8\x15\x3f\xcf\x46\x9b\xfb\x8f\x2b\xba\x48\x73\xa7\
+\x93\x56\xed\xdc\x08\x3f\x1f\x9b\xbd\xe0\x67\x61\x32\xdd\xc6\xb5\
+\xb7\x4b\x52\x00\xd5\xdf\x5e\x6f\x92\x4a\xd7\x5c\x38\x5e\x57\x08\
+\xdb\x12\x45\xf0\x6e\xe9\x77\x20\x41\x0e\x23\x26\x37\xc3\xb1\x91\
+\xe7\x48\xe3\xb9\x29\x5a\x59\x9a\x07\x1f\x97\x04\x98\x8d\xf3\x18\
+\x7c\xbf\x34\x01\x50\x9f\x36\xcb\x09\x21\x46\x99\x2c\x33\xe7\x91\
+\x47\xd7\x80\xe5\x80\xac\x2c\x09\x6a\xcb\xf3\x30\x1f\x8a\x26\x82\
+\x47\x2d\x6e\x44\xe2\x39\xe1\x30\x2f\x2c\x15\xcf\x90\x97\x3a\x6c\
+\xb4\x42\x99\x07\x2f\x1b\x9b\xc8\x08\x9b\x3c\x36\x3c\x07\xc3\x87\
+\xbb\xd3\xde\x91\xca\x2f\x46\x68\xeb\x41\x39\x9c\xc2\x09\xba\xa3\
+\xbe\xcb\x2e\x91\x8f\x1c\x38\x33\x41\x77\xab\xf2\xe1\x0d\xc7\xc8\
+\x1e\x2f\x8b\x71\xc3\x2d\x98\x4e\x54\xa4\x05\xa8\x4e\x19\xa9\xa6\
+\xa1\x18\xce\x40\x12\x30\xd0\xe3\x14\xf9\x48\xfd\x8f\x16\x5a\xa6\
+\x7a\x1c\x4c\x38\xd6\x81\xd7\x1b\xc6\xe4\xd0\x34\x46\xdb\xf6\xa4\
+\x05\x28\xdb\xf4\xf4\x50\x93\x02\x0e\x5f\x12\x30\x74\x69\x4a\xe4\
+\x23\x75\xdf\x99\xe9\x53\x15\x85\x09\x80\x9f\x09\xc3\x3e\xe8\xc2\
+\xbf\xa7\x6a\xd2\x02\x4a\x4f\xf4\xd3\xa6\x96\x12\x4c\xf9\xf8\xc4\
+\xd8\x48\xf7\xa4\xc8\x47\x9e\xf9\xda\x44\x15\x15\x4f\xc0\x13\x07\
+\x2c\x32\x21\x38\xf5\x37\x70\xfd\xf3\xfd\x69\x01\x25\x1f\x5d\xa1\
+\x0d\x87\x76\xc2\xf6\xbf\x0e\xc6\x74\x13\x22\x1f\xd9\xff\xa5\x91\
+\xca\xd5\x4f\x82\x89\x9f\x86\xa0\x00\xb8\xa9\xb7\x63\xe2\x74\x6d\
+\x5a\xc0\x8e\x0f\x7a\xe9\xc1\xc3\x4a\xd8\x98\x64\x07\x13\x3a\x8b\
+\xc8\x47\xf6\x7e\x36\x48\xb7\xa8\x37\x0b\x17\x24\xb6\xc9\x41\xcf\
+\x12\x66\xf5\x36\x58\xbf\xa9\x4f\x0b\x50\xbc\xdb\x4d\xeb\x34\x2a\
+\x38\x3c\xc9\x0e\xa6\xfe\x34\x8b\x7c\xa4\xfa\xd3\x6b\xb4\xa8\x6a\
+\x2b\x3c\xf1\x6f\x51\x48\x00\xdc\x1e\xb4\xc2\xf6\xfd\x81\xb4\x80\
+\xed\x6f\x5d\xa4\xcf\x6a\x2a\x61\x5b\x48\x76\x70\x53\x37\x22\xf2\
+\x11\x75\x5b\x1f\xcd\x57\xcb\xc1\x04\x63\x00\x56\x00\x78\x86\xc6\
+\x81\x28\xd2\x4b\x02\xec\xd5\xec\x81\xdd\xcd\x25\x86\xe6\xba\x87\
+\x61\xff\xe9\xe5\x54\x40\xf9\x27\x57\x68\x8e\x7a\x9b\x70\xbd\x63\
+\xad\xca\xa4\x12\x6c\x88\xb0\x58\x4d\x99\xd2\x0c\x84\x32\x32\x30\
+\xeb\x4d\x76\xe0\xd1\x0d\xc3\xd1\xde\x98\x0a\x28\xfb\xf8\x6f\xba\
+\x4e\x5d\x0c\x5f\x30\xb2\x6a\xe8\x6a\x0a\xe8\x0c\x70\xfd\xdc\x92\
+\x0a\x50\xbc\x73\x91\xca\xf6\xed\x82\x2f\xc0\xdf\x6f\x6e\x42\xa1\
+\xbf\xf4\x98\x3e\xaf\x49\x05\x14\xbe\x72\xce\x9e\x59\xa6\x90\xa3\
+\x20\xf7\x81\xc2\x23\x37\xe6\x11\xb5\x3a\xda\x6f\x75\xb6\xa6\xfc\
+\x36\x57\x68\x8f\x35\x75\xd8\x21\x5b\x2f\x87\xb0\xa6\xf7\x25\x5e\
+\xe8\x3e\xe0\xef\x25\x44\xd2\x3c\x77\xe1\x08\x23\x02\x3c\x4c\xfd\
+\x07\xc6\x24\xda\x7e\xd7\x07\x0d\xaa\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x05\xb5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x7c\x49\x44\x41\x54\x78\xda\x9d\x95\x0b\x50\x54\x55\
+\x18\xc7\xff\x77\x1f\xb0\x2f\x70\x53\x8c\xdd\x25\x36\x65\x71\xa1\
+\x71\xcc\x71\xc4\x00\x17\x05\xc9\x04\x79\x2d\x89\x4e\xf9\x18\xd4\
+\x7c\x8d\x93\x9a\xc9\x94\x63\x56\xe3\x0b\xc5\x14\xac\x40\x44\x04\
+\x73\x28\x47\x54\x14\xc6\x94\x4c\x73\x46\x7c\x24\xe0\x0b\xc1\x68\
+\x54\x94\x52\x59\x10\xdb\x05\x91\xd7\x3e\xee\xbd\x9d\x7b\x17\x16\
+\x73\x5a\x66\xea\xdc\x39\x7b\xce\xde\xf3\xdd\xef\xf7\x9d\xef\x3b\
+\xe7\xfb\x28\xf4\xb5\x91\x41\x63\x66\x78\x48\xa4\xc7\x7a\xac\x36\
+\xb4\x59\x2c\xa0\xad\x40\xf4\x5a\x29\x64\x4a\x01\x18\x1a\x60\x18\
+\x86\x74\x22\x48\xe6\x0e\x32\xda\x1c\xa4\xdb\x29\xd0\x0c\x4b\x46\
+\xf0\x6b\xce\x4e\x41\xa4\x10\xe1\xea\x86\xdb\x14\xa7\x97\xea\x07\
+\xa8\x5e\x0f\x62\xf5\x81\x3a\xcc\x4a\x49\x84\x9f\xda\x0f\x36\x71\
+\x27\x64\x0a\x39\x28\x81\x10\x22\x81\x18\x02\x81\x00\x42\xa1\x08\
+\x22\x4a\x40\xde\x89\xc9\x9c\x1b\x49\xa7\x28\x88\xc9\x7b\x8a\x7b\
+\xc8\x9c\x93\xa9\x69\xae\xc2\xba\xfd\x1b\x77\x35\x17\xfd\xb9\xc6\
+\x05\xa8\x38\x7f\x89\x1d\x15\x14\x88\xba\xba\x7a\xa8\x54\x1a\xb4\
+\x79\x54\xc2\x57\xa5\x24\x16\xb1\x64\x95\x05\xcb\xe2\xa5\xc6\xfe\
+\xcb\xcc\x69\xb1\xa7\xc8\x13\xd5\x0f\xea\x31\x77\xdc\xa7\x94\x0b\
+\xb0\x71\x73\x06\x1b\x11\x1e\x86\xe2\x23\x25\x88\x8c\x88\xc6\x03\
+\xe5\x5e\x8c\x0a\xf6\xed\x03\xfc\xb7\x26\x10\x50\x30\x3d\x15\x22\
+\xcd\xf0\xdd\x00\x60\xcb\xd6\x1d\x3c\xe0\xf0\xd1\xe3\x88\x34\x4c\
+\x21\x80\x7d\xd0\x05\x11\x00\xfd\x3f\x00\x14\x8b\x56\xb3\x0c\x2b\
+\xc3\x73\xdc\x03\xee\x7a\x13\xc0\x1b\x03\x00\x96\x77\x13\x03\x9a\
+\xb5\x83\x84\xdb\xe5\x18\xce\xf7\x24\x3a\x44\xa9\x98\x8f\x01\xff\
+\x08\x58\x58\x5a\x65\x58\x65\x70\x03\x88\x22\x80\xdf\xbd\x08\x20\
+\x58\xcd\x03\x58\x12\x00\x07\xdb\x0b\x85\x70\x38\xc2\x54\xa9\x18\
+\x26\xd5\xba\x62\xc2\x29\x30\x75\xfd\x86\x9b\x4f\x4b\xd1\x45\x9b\
+\x21\x14\x78\x10\x18\x60\x36\x4b\xf0\xf1\x60\x80\xdb\xde\x05\x08\
+\xd0\xab\x40\xd3\x0c\x7a\x1c\xcf\x91\xe0\xbf\x0e\x23\x94\x63\x79\
+\xd9\x5e\x5b\x37\x6c\x4c\x0f\x3f\x57\x78\x0e\x25\x0a\x9d\x6a\xaa\
+\x9a\x8b\x71\xc3\x72\x12\x12\xa1\x14\x6d\x66\x29\xd2\x22\xb2\xdd\
+\x03\xea\xbc\x08\x20\xd0\x17\x5d\xb6\x0e\xa4\x04\xa4\x43\xed\xa5\
+\xc3\xf3\x5e\x0b\x4a\x1e\x7c\x8e\x76\x6b\x93\xd3\x39\xe4\x73\x86\
+\x5c\x12\x9d\x77\x28\xde\xd1\xae\x82\xcc\xc3\x0b\x95\xa6\xc3\xb8\
+\xdd\x76\x1a\x1d\x6d\x5e\x48\x9b\x34\x08\xa0\x46\x5e\x08\xbf\xc0\
+\x57\xf0\xb6\xef\x62\x04\xfb\x18\xf0\xf8\xd9\x5d\xfc\xd0\x90\x86\
+\x90\x61\x49\x08\x55\xa7\xc0\x8b\x58\xde\xda\xf9\x90\xc0\x9e\x40\
+\xa3\xd0\xe1\xec\xa3\x3c\x18\x75\xeb\xf8\xdd\x6c\xba\x16\x83\x76\
+\x8b\x04\xbb\x62\x4e\x0c\x00\xb6\x6d\xcf\x62\x27\x86\x85\xe2\x08\
+\x1f\xe4\x28\x5c\x97\x90\x1d\x8c\x52\x61\xe9\xe8\x3c\x70\x0e\xff\
+\xe6\x56\x2a\x51\x1e\x07\x83\xff\x6c\x5e\xbe\xbd\xf7\x29\x94\x92\
+\xe1\xae\x93\x93\x71\x7d\x06\x46\x2b\x23\x90\xa8\x5b\x83\x9c\x5b\
+\xeb\x71\xbf\xa5\x0e\x5f\xc7\xfe\x38\x00\x58\xbc\x64\x05\x9b\x10\
+\x1f\x8b\xef\x0f\x16\x23\x6e\xda\x74\x54\xcb\xf3\x31\xc3\x30\x17\
+\xd3\xb4\x4b\x70\xf6\x8f\x03\xa8\x7f\x76\x11\x1f\x8d\x2d\xe4\x65\
+\x73\x6b\x97\xe3\x61\xd7\x3d\x74\x3b\x3a\xf0\xed\xa4\x6a\x12\x27\
+\x1a\x4b\x2a\xc6\x40\x23\xf5\xc7\x96\xf0\x9f\x51\x65\x2a\x43\x51\
+\xcd\x3e\xe4\xc6\x97\x0f\x00\x52\x17\x2c\x65\xe3\xa7\xc7\x22\x3b\
+\x67\x0f\x92\xe2\x92\x71\x4a\xbc\x05\xdb\xe7\xee\x41\xa8\xca\x88\
+\xd5\x17\x27\x63\xbe\x7e\x03\xc6\xf9\x46\xe3\x72\x53\x29\xf6\xdf\
+\xd9\x04\x31\x39\x2d\x63\x86\x4e\xc0\x87\x6f\xe6\xe0\x71\xc7\x3d\
+\x7c\x71\x75\x16\x7c\x65\x6a\x64\x84\xff\x84\x2b\xa6\x52\x14\xdd\
+\x2c\x40\x5e\xc2\x4b\x80\x84\xb8\x58\xe4\xec\xde\x0b\x23\x01\x9c\
+\xa0\x36\x23\x63\x5e\x2e\xc2\xd4\x46\xa4\x94\xbf\x8e\xfc\xa8\x4a\
+\x0c\x23\x0a\xd6\x5e\x8e\x41\x87\xad\x13\x76\x72\x1f\x66\x8d\x58\
+\x86\x98\x80\x45\x38\xd3\x58\x88\x83\x0d\xd9\x88\xd4\xc4\xe1\x83\
+\xd1\x5b\x79\x17\xd5\x3f\xaa\xc5\x9e\xc4\x93\xee\x01\xa5\x70\x02\
+\x0c\x1a\x23\x92\x4e\x6a\x51\x38\xa5\x12\xc3\xe5\x1a\x2c\x3a\x17\
+\x42\xae\x98\x10\x5d\xf6\x67\xc8\x9e\x74\x0e\xaf\xca\xfd\x90\x75\
+\x63\x39\x2e\xb5\x9c\x21\x46\x5c\x86\x8f\x4c\x85\x4f\x7e\x8d\x45\
+\xb7\x45\x8a\xdc\xc4\x32\xf7\x80\xe3\x74\x3a\xbe\x9c\xb7\x0d\xd3\
+\xfc\xe7\x21\xbd\x7a\x01\x66\x06\xac\x44\x90\xcf\x78\x5c\x6b\xfe\
+\x05\x25\x8d\xb9\x58\xa0\x5f\x4f\x4e\xd7\x78\x67\x1e\xab\x9e\x8d\
+\x85\xfa\x8d\xd0\x2a\xf5\xa8\x69\xb9\x80\x9d\xb5\xab\xa1\xb4\xeb\
+\xb0\x3b\xa1\xc4\x3d\xa0\x8c\xf9\x0a\x13\x26\x07\x23\x73\x62\x39\
+\x1a\xdb\xef\x60\xf3\xb5\x54\xec\x9f\x5a\xf5\x8f\x9c\x63\x73\x58\
+\xe1\x41\x32\x67\x7f\x6b\xb0\xd4\xe2\xb3\xaa\x39\x50\x78\x78\x43\
+\xd6\xa3\xc1\xee\xc4\x63\x83\x00\xe8\x9d\x78\x2d\x44\x89\x9d\x6f\
+\x1d\x85\x66\xc8\x48\x94\xdd\xcb\xc7\x81\x86\x2c\x4c\xd5\xa4\xf0\
+\xf2\xa6\xee\x46\x3c\xea\xbc\x8f\x39\xba\x15\xb0\x33\x76\x9c\x6e\
+\x3a\x04\x73\xb7\x19\x32\x91\x9c\x64\x3b\x40\xda\xa3\x22\x31\x70\
+\xb7\x83\x78\x12\x03\x6b\x26\x02\x27\xaa\x41\x3b\xec\x28\x88\x3e\
+\xcf\x5b\xda\xda\xd9\x8c\x23\xf7\x73\x70\xc1\x54\xce\x5b\xcf\xdd\
+\x64\x4f\x91\x04\x11\xea\x58\x78\x0a\x25\xa8\x68\x3a\x45\x4e\x97\
+\x27\x58\x8a\xe1\x01\x79\x49\x83\x00\x4a\x7a\x33\xa1\x37\x90\xca\
+\x46\xea\x21\x29\x5c\x08\xf3\x8d\xc2\x8a\xb1\xe9\x83\xa6\xe9\x99\
+\xe5\x21\xfc\x0e\x38\x80\x9c\x00\xf6\x1a\xdd\x00\x92\x09\xe0\x70\
+\x4f\x26\x82\x22\xfc\xc0\x38\x58\x30\x24\x4d\xdb\x18\x2b\x7a\x1d\
+\xdd\x88\xd1\x1a\xc9\xf9\x0f\x23\x69\xdb\xc1\x7f\x27\xa4\x44\xb8\
+\xf2\xe4\x2c\xae\xb4\x54\x40\x21\xf6\x26\xa9\x42\xe0\x02\xe4\xbb\
+\x07\x24\xa1\xf8\x79\x16\x82\xa2\xfc\xc1\xd8\x19\x97\x85\x5c\xda\
+\xe6\x14\xd3\x2c\xcd\xcf\xf9\x74\xcd\xd5\x61\x4a\xc8\x83\xa8\x3e\
+\x75\x1c\x40\x66\x55\xa1\xe0\x45\x17\xcd\x5f\xb8\x8c\xdc\xe4\x18\
+\x17\xe0\x10\x01\x04\x73\x00\x07\x83\xc1\x5b\xbf\x8a\x17\xea\x36\
+\xa9\x68\xa2\x6e\x25\x8a\xde\x7d\x21\x17\xbd\xf7\xfe\x7c\x76\x66\
+\x4a\x32\x49\x15\x79\x48\x9e\x9e\x84\xa2\xbf\x76\x40\x1f\xa9\x05\
+\x6d\xeb\xab\x5f\xac\xf3\x87\x65\xfa\x77\xe3\x2c\x6a\x2c\xb7\xca\
+\x3a\xff\x0f\xf1\xf1\xe0\x77\xc6\xd5\x64\x41\x97\x37\x0f\xf8\x1b\
+\x82\x2f\x8a\x37\x22\x26\x76\xc6\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x05\xdc\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xa3\x49\x44\x41\x54\x78\xda\xb5\x55\x7b\x4c\x53\x57\
+\x1c\xfe\xee\x6d\x6f\x29\xd0\x96\xb6\xbc\x14\x41\xea\x0b\x9c\xa8\
+\x10\x56\x9f\x58\x33\x02\x43\x71\x8b\x0a\x89\x64\x32\x75\x7f\x2d\
+\x66\x8b\xa8\x61\xce\xc5\xcd\x64\xf1\x85\x38\x31\x59\x0c\xba\x38\
+\xcd\xd4\x80\x24\xcc\xb8\x4c\x17\x33\x15\xe7\x63\x2c\x9b\x4c\x71\
+\x88\x03\x1f\x63\x14\x15\x2b\xcf\x3e\xa8\xf4\xb6\xf7\xf6\xde\xbb\
+\x73\x6f\x5d\x37\x83\x73\xfe\xb1\xfd\x92\xe6\xa6\xf7\x9c\xdf\xf7\
+\x9d\xfb\x9d\xef\x7c\x87\xc2\xff\x5c\xd4\xf3\x06\xb3\xb6\x66\xad\
+\x4a\x32\xc6\x5b\x86\xa4\x8c\x45\x8b\xf2\x76\xcd\xd2\xd0\x1c\x8c\
+\x11\xb4\xd2\xd4\xe3\x13\xe0\xe3\x84\x0e\xbb\x8b\x3f\xd3\xed\xe2\
+\x36\x7f\xbf\x2c\xd9\xf3\xc2\x04\x85\x07\x0b\xea\x66\xa5\x27\x2d\
+\x1f\x6b\x8c\xc7\xe5\xb6\x1e\x64\xbc\xb4\x13\x49\x3a\x33\xa2\xc1\
+\x41\xa2\x54\x80\x24\x81\x92\x44\x38\xc1\x60\xb4\x4e\x8d\xfb\x8f\
+\x79\x34\x75\xfb\xea\x0e\xe7\x26\xbc\xf9\x5c\x82\x82\xc3\xf3\xb2\
+\xd3\x46\x5b\x9a\x5f\x9d\x62\xc2\x0f\xf6\x66\x5c\x6e\xb5\x62\xeb\
+\xeb\x95\xb0\x9a\x29\x68\x11\x00\x45\x53\x68\x38\x7b\x0e\xf3\x6c\
+\x36\x65\x3e\xeb\x0f\xc2\x3e\x2c\xe1\x36\xf4\x18\x63\xd4\xe2\x6a\
+\x2f\x8b\x73\xad\x1e\xcb\x8f\x6f\x59\xee\x8d\x20\x28\xa8\x99\xb9\
+\xbc\x70\x8a\xad\x2e\xde\xdc\x89\xe6\xbe\x76\xfc\x74\x65\x36\xf6\
+\x2d\x5d\x8b\x49\xe6\xf4\xf0\x02\xd4\x6a\x15\x66\x5b\x67\xe0\xbb\
+\x4b\x97\x94\xff\xfe\x80\x1f\x34\x45\x20\x04\x1e\xd7\x9c\x6a\xb8\
+\x0d\x46\xf4\x0e\x07\x71\xe2\xca\x80\xa5\xe9\xed\x89\xf7\xc2\x04\
+\xaf\xd4\x4c\xb3\x14\xa4\xdb\xec\x4c\xf4\x4d\xb0\x82\x17\x8d\x57\
+\xb4\xa8\x5c\xb0\x4f\x01\x3f\x50\xbd\x1f\xab\xd7\xbc\x0b\x9a\xa6\
+\x95\xd9\xef\xaf\x2b\xc7\xc7\xdb\xb6\x28\x04\x82\x28\xa2\xbc\xac\
+\x0c\xdb\x76\xed\x84\x46\x45\xa3\xdd\x09\x3c\x32\x8c\x42\xc7\x20\
+\x8b\x0b\x37\x9c\xc6\xa6\xd5\x69\x1e\x85\x60\x63\xe3\x2a\x6f\xa2\
+\xa9\x5f\xe7\xe4\xfb\xf0\x5b\xb7\x0f\x1f\x4c\xaf\x45\xf6\xd8\x6c\
+\xf8\xfd\x7e\xa2\x79\x68\xf5\x01\x3f\x07\x86\x51\x13\xc0\xf5\xd8\
+\xb2\x63\x9b\xf2\x8e\x0f\x06\x21\x12\x12\xb9\x38\x3e\x40\x5e\x08\
+\xb8\x3e\x14\x01\x3a\x31\x11\xc7\x5b\x9d\xcd\xc7\x17\x27\x5b\xa9\
+\xe2\x93\x73\x4b\x6c\xe3\xd2\xea\x1d\xfc\x4d\xa8\xc8\x2a\x5b\x6e\
+\x71\xf8\xb6\xa8\x05\xa2\x26\xd4\xe8\x63\x59\x05\x44\x10\x44\x68\
+\x34\xcc\x08\x02\x41\x10\x94\x9f\x48\x36\x9d\x26\x06\x90\x82\x01\
+\x9c\xf2\x98\x40\x45\x6a\x50\x7b\xde\x91\x4a\x6d\x68\x5c\x59\xaf\
+\xd5\xd9\x4b\x58\x32\x00\x04\xc1\xf5\x67\x63\x6f\xee\x21\xbc\xb1\
+\x62\x19\x8e\x1e\xab\x0d\xaf\xf2\xdf\x08\x68\x35\x8d\x4d\xe5\x1b\
+\xb0\xbd\x62\x3b\xda\xdd\x34\x9c\x71\x49\xa8\xb9\xf8\xf0\x10\x55\
+\xd6\xf8\x9a\xa4\x8a\xe8\x03\x31\x1e\xd4\x64\xc3\x96\x18\x3f\x81\
+\x6d\xc2\x7c\xe2\x10\x36\xac\xf3\x8b\x10\x30\x8c\x06\x7d\x7d\x7d\
+\xe4\xc9\x40\x45\x64\x3d\xe6\x4d\xc4\x1d\x07\x6b\xa7\x4a\xcf\xcf\
+\x90\x4c\x7a\x1a\x92\x28\xc1\xc0\x44\x23\x37\x7a\x23\xf2\x27\x2e\
+\x00\x47\xbe\x48\x22\x20\x22\x01\x16\x44\x41\x21\xd0\x46\x6a\x61\
+\x9b\x33\x17\x17\x9e\xb8\x28\x28\x83\xcb\xe4\x84\x88\xe3\x78\x0c\
+\x0d\x79\xc1\x72\x7e\xf8\x5c\x4e\x7c\xea\x48\x82\x5f\x1d\x05\xaa\
+\xb4\x61\xa6\x64\x8c\xa2\x88\x86\x12\x74\x5a\x1d\x72\xb4\x6b\xb0\
+\x34\xbd\x08\x01\x42\xe0\xf2\xba\x89\x3b\x18\xc5\x6c\xb2\xc6\xbd\
+\x3d\xbd\xc8\xcf\xcd\x85\x41\xaf\x57\x56\xaa\x8d\x8a\x82\xd1\x60\
+\x42\x5c\x9c\x09\x31\x31\x26\x94\x95\x97\x2b\x04\x8e\xce\x0e\x1c\
+\x71\x4d\x82\x94\x10\x07\xaa\xe4\xcc\x4c\x29\x46\x4f\x00\xc8\x17\
+\x68\x49\x93\xde\x9b\x8d\x9d\xf9\x7b\x89\x36\xc0\x8a\x13\x45\xd8\
+\xbf\xa0\x36\xe4\x79\x8e\x85\xdb\xe5\xc2\xe4\xf4\x34\xa4\x8c\x19\
+\x03\xbd\x4e\xff\x8f\x04\x7b\x76\xec\x00\x9b\xf7\x21\xf8\xc4\x78\
+\x50\x8b\x4f\xcd\x68\x4e\x30\xab\xb2\x09\x3e\x04\x29\x88\x62\xcb\
+\x1c\x74\xd9\xc7\x63\x6d\xce\x7a\x54\xdd\x99\x8f\x96\x5f\x63\x51\
+\x9d\x77\x14\x9c\x48\x62\x82\xc8\x21\x6b\x2d\x4b\x13\x20\x87\x4c\
+\x96\x25\x48\xe4\xe1\x79\x59\x22\x8e\x38\xce\xaf\xec\x07\x78\x16\
+\x15\x77\x63\xe1\x53\x45\x82\x5a\x58\x6f\xdd\x64\x8e\xa5\x2b\x34\
+\x1a\x8a\x44\x8c\x88\xa9\x71\x5a\xa4\xe9\xb3\xf0\xcd\x35\x27\xc6\
+\x4e\x6c\x43\xa4\x4a\x8f\xc8\xee\x95\x28\x7d\xb9\x04\x6c\xc0\x47\
+\x00\x85\x90\xf6\x42\x08\xf8\x4f\x02\xf9\x19\x24\xfb\xa4\x10\xb3\
+\x01\x6c\xec\x48\x41\x24\x04\xbb\x72\x8c\x16\x7d\x69\x95\x12\x46\
+\xab\x21\x9f\x19\x59\xeb\xcc\xf8\x08\x85\xe4\xdc\xa3\x9f\x61\xd1\
+\x69\xd0\x7a\x3d\x19\x7b\x0a\xf6\x86\xc0\x14\xa0\x67\x13\xbc\xb7\
+\xae\x0c\x95\xbb\xab\xd0\x70\xcb\x8b\x06\x7d\x06\xdc\x37\xee\x1d\
+\x0a\x45\xc5\x91\xac\xd2\x18\x23\x73\xcc\x60\x22\x07\x45\x94\xc3\
+\x52\xf6\x0f\xf9\x11\xdb\x1a\xa3\xa0\x90\x24\xf4\xbf\x83\xc2\xf4\
+\x7c\xa2\x71\x60\x04\x81\xec\xb0\x50\x0f\x40\xf3\x3e\xac\x3a\x4b\
+\x83\x49\x8a\x85\xf7\x6a\x47\x6a\x38\xec\x72\xf6\x67\xd6\xc5\x25\
+\x69\x96\x47\xc7\xa8\xf0\x64\xae\x52\x72\x63\xac\x0e\xe8\x6b\x19\
+\x87\x83\xc5\x07\xe0\xf1\x0d\x85\x09\x64\x63\xf8\x7c\xa1\xf3\x22\
+\x12\x2b\x6b\x48\x5c\x55\x34\xf4\xa3\x75\xd4\x64\x08\xed\x0f\x9a\
+\xef\x54\xe6\x58\x9f\x8a\x6b\x6b\xd5\xf4\x13\xc9\x19\xda\x62\x2d\
+\xb9\x54\xfe\x5e\x44\x75\x24\x44\xab\x14\x92\xaa\x85\xbb\x09\x41\
+\x30\x3c\xb6\x30\x2f\x1f\x5f\x9f\x3e\x0d\xd1\x3f\x8c\xaf\x7e\x19\
+\xc4\x41\x67\x0a\x22\xfc\x3e\x08\x9d\xdd\xc6\xae\xc3\x4b\x3c\x4f\
+\x11\xe4\x54\x67\x0e\x24\x4f\x8d\x8c\x95\xf7\x42\x1e\x90\x4f\x24\
+\x68\x89\x88\x25\x22\x5a\x65\xc2\x50\x9b\x19\x2d\x95\x57\x71\xfe\
+\xd2\xc5\x70\xcf\x80\xc7\xab\x3c\x77\x9d\x7d\x80\xcb\x54\x2a\xb4\
+\x72\x40\xde\xee\xb2\xdc\xaf\x2d\xfa\x2b\xae\xe5\x9a\x57\x9d\xb9\
+\xdd\x9c\xaa\xf9\x28\x2a\x46\x8d\xc7\x2e\x62\x3b\x36\x08\xdf\xe0\
+\x30\x86\x06\xf4\x18\xfc\x3d\xf4\x45\xb1\x13\x44\x1c\x21\x31\x9e\
+\x30\x2a\x0e\x8c\x4a\xa5\xbc\xdb\x77\xe1\x21\xbe\x68\x23\xf3\x53\
+\x92\xc1\x38\xfa\x81\xce\x6e\xcb\xc3\xfa\x65\x23\x2f\x1c\xdb\x67\
+\x59\x77\x69\x86\x72\x7b\x7b\x83\x77\x05\x4e\x68\x62\x3d\xc6\x9b\
+\x5e\xbe\xf2\x24\x9d\x36\xde\x00\x12\xc5\xde\xae\x1e\x4c\x1b\x1f\
+\x41\x2c\xee\x57\xec\xec\x18\xa6\xe0\x0e\xa8\xa1\x49\x31\x83\xf1\
+\x0c\x83\x76\xf4\xd6\xf5\x7c\x5e\xf8\xfc\x2b\xf3\x59\x95\xb8\xa4\
+\x66\x85\x64\x36\x97\xc2\x6c\x28\x14\xc9\xa5\x42\x02\x49\xe9\xa2\
+\x1f\x0f\x83\xe2\xf8\x0e\xb8\xbd\x67\x48\x08\x6d\xee\x3d\xb9\xf2\
+\xc5\x2f\xfd\xff\xb2\xfe\x00\x47\x49\xf2\x0d\x88\xb9\xea\x14\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xbb\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x82\x49\x44\x41\x54\x78\xda\x95\x55\x6b\x4c\x5c\x45\
+\x18\x3d\x73\xef\x5d\x76\xb7\x65\x95\x48\x69\x0a\x54\x45\xc0\x57\
+\x20\x56\x05\xa9\x2d\xd2\xd8\x80\x5b\x35\x26\x44\xa2\xbc\xaa\x31\
+\x4a\x8c\x4d\xd5\xa4\x49\x4d\x6b\x4b\x41\xac\x51\x89\xc6\x34\x35\
+\x6a\x5b\xf1\x51\x1f\x2d\x10\x13\x1b\xfb\xa3\xd2\x2a\xb1\xa0\x68\
+\x83\x80\xa0\xb4\x36\x48\x29\xb4\x40\xa9\x02\xf2\x5a\x96\xbd\x7b\
+\xe7\x8e\xdf\xdc\x05\x29\x50\x08\x3b\xbb\x9b\x3b\x3b\x8f\x73\xbe\
+\x39\x73\xbe\xef\x32\x2c\xd0\x92\x92\x53\x33\xe9\x51\xc9\x54\xd8\
+\xc1\x05\x75\x95\x51\x08\xf1\xb5\x60\x66\x94\x10\x70\x70\xc1\x8b\
+\x5a\x9a\xea\x6b\x16\xc2\x60\xf3\x4d\x24\x27\xa5\x3e\x00\x88\x13\
+\x26\x4c\x48\x68\x93\x10\x65\x47\x30\x01\xc1\x4d\xea\x08\xf9\xa5\
+\x09\xe4\xb7\x9e\x6e\x2c\x0f\x9a\xe0\xce\xbb\x53\x7c\xb4\x3f\x44\
+\x82\x49\x70\x41\x98\xdc\x02\x36\xa1\x28\x8c\x88\xe8\x67\x72\x42\
+\x60\x38\x7b\xa6\x85\x05\x45\x90\x70\x47\x72\x1c\x4c\xb3\x5d\x86\
+\x28\x4f\x20\x9b\x6f\xc2\x40\xdc\xca\x70\xe8\x06\x47\x5b\xd7\x20\
+\xed\x34\xb0\xc4\x6e\x23\x7c\x46\x01\x98\x6b\x3a\xda\xff\x3c\xb5\
+\x68\x82\x5b\x6f\x4b\xbc\x87\x76\xd6\x0b\x53\x58\xf2\x18\x14\xf9\
+\xc8\xa8\x0f\xfd\x7d\xdb\x01\x7a\x82\x80\x4b\x8b\x6b\x50\x5a\x56\
+\x87\x6b\xaf\xb1\x4b\x90\xe4\xae\xce\xbf\x1a\x17\x4d\x10\x7f\x73\
+\x42\x92\xc1\x79\x83\x6e\x98\xd0\xfd\x7e\x70\x3f\xc3\x1b\xcf\xaf\
+\xc1\xa6\x67\x13\x21\xbc\x86\x15\x35\xc2\xec\xd8\x5d\x52\x87\x77\
+\xca\x1b\x11\xea\x54\x53\x7a\xbb\x3b\x7f\x5d\x34\x41\xf4\x0d\xf1\
+\x49\x0e\xcd\xde\xf0\xd8\xfa\x18\x5c\x1f\xe1\x44\x96\xfb\x46\x44\
+\xc6\xbb\x80\x31\xbf\xa5\xb9\x20\xe9\x2c\x92\x15\xa1\x88\x4a\x28\
+\xa3\x31\x1e\x7f\xa9\xa7\xf3\xdc\xe2\x2f\xd9\xb5\x32\xa9\xe6\xe0\
+\xd6\x86\x75\x77\xf5\x92\xf8\xb4\xc4\xb0\xdc\x62\x39\x08\xfa\xa8\
+\x45\x00\xee\x85\x72\xdd\x32\x64\x64\x57\xa1\xba\xf9\x4c\x70\x97\
+\x7c\xe9\x61\xac\x8e\xd8\x55\x78\x4a\x0d\x19\x22\x54\x1b\xc9\x32\
+\x00\x3e\x4e\x64\xba\x17\x42\x51\x20\xfd\xca\xa0\x40\x5b\xaa\x60\
+\x5f\x61\x43\xfd\xe6\x9f\x3d\xab\x83\x22\x90\xcd\x53\x5b\x24\x9c\
+\xb8\x08\x71\xb9\x85\x0c\x45\x03\xaa\x62\xe5\x81\x4a\x59\x27\x1b\
+\xa7\x8f\xb6\xd4\x81\x8a\xd2\xa6\xea\xbc\x1a\x6f\x46\xd0\x04\x97\
+\x5f\x4d\x10\xcb\xd7\xae\x82\xbf\x9b\xcc\xa1\xda\x26\x17\x33\x2b\
+\xed\xe4\x26\x46\xb9\xc0\xc8\x65\x45\x2f\xb6\x6e\x79\x73\x18\x7b\
+\x83\x26\xe8\x4f\xc7\xc7\xe1\xaf\xef\x78\xc6\x68\x2e\x27\x48\x85\
+\x2e\x55\xb1\x2c\xcb\x26\x77\x68\x76\x05\x27\x2b\x7b\xb0\xfe\x98\
+\x67\x5e\x8c\xf9\x09\x8a\xbf\xd3\xe0\x37\x7f\x38\xdf\x9d\x7f\x5f\
+\x4c\x7e\x16\x70\xe1\x24\x0c\xef\x18\x65\x30\xc9\xa4\xaa\x50\x54\
+\x81\xa1\x76\x1f\x5e\x6e\x1e\xc6\x81\xb4\x1f\x1b\x61\x1b\x4f\xc5\
+\xce\xfb\x7d\x8b\x23\xd8\xfa\x4d\x8e\xe2\x72\x56\xa4\x67\x26\xa2\
+\x4f\x3d\x8f\x03\xaf\xa5\x23\xdc\x19\x8d\xf0\xdb\x57\x80\x0f\x5c\
+\xc0\x50\x57\x3f\xba\x3b\x74\xd4\xdf\x64\xc3\x8e\xe2\x4e\xa0\xb5\
+\x07\xf8\xfd\x6f\xc0\xa1\xe6\xa1\xc4\x5d\xb1\x30\xc1\xe6\xaf\xb2\
+\xed\x91\xae\xca\xdc\xe7\x92\x29\x4a\x15\x9f\x0e\x7b\x81\x71\x8a\
+\xba\xa7\x1e\x1f\x55\xe5\xc2\xc7\x19\x3c\x11\x76\x6c\x5b\x77\x14\
+\x58\x1e\x4b\x16\xf6\x50\x81\x25\xe1\xfe\xa5\x9a\x74\xb4\x8d\xfa\
+\xc8\xc5\xdb\x99\x95\x57\x27\x78\xfa\xf3\x55\x4a\x58\x68\x73\xce\
+\xb6\x34\x28\x36\x0d\x87\x74\xb2\xce\xf8\x44\xe0\x27\x88\xc4\xd4\
+\xa4\x85\x02\x6b\xb9\x8e\x40\x62\x88\x00\x82\x94\x6e\x88\x92\xa5\
+\xb2\x45\xce\x46\xe3\x83\xec\xde\xb9\x04\x8f\x7f\xa8\x67\x6c\xdf\
+\x60\x8b\x8f\x0d\xc3\xfe\x31\x8a\x68\x82\x24\x1d\x27\x20\xdd\x90\
+\xb5\x3a\xb0\x46\x02\x71\x6e\xdd\x43\xc0\xbb\x93\x63\xb2\x1f\x42\
+\xcf\xe6\x3e\xa0\xf6\x9c\x81\x83\x4f\xda\x66\x12\x3c\xfa\xfe\xc6\
+\xd0\x5b\xa2\xbf\x2c\x28\x74\x63\xef\x20\xc9\xe2\x23\x90\x31\x49\
+\xe0\x0b\x44\x39\xb5\xf4\xff\xfe\x55\x34\x20\xdb\xc2\x49\xb8\xef\
+\xd2\xfb\xc7\xef\x7f\x02\x87\x0b\x0e\x4d\x4f\x67\xbc\x75\x3c\xa3\
+\x34\xc7\x2d\x96\xb9\x50\x3d\x62\x40\x21\x60\x31\x46\xd1\x53\xb1\
+\x13\x6c\xd6\x45\xc9\x3f\x53\x3c\x62\x26\x89\xd0\xe8\x14\x67\xe9\
+\x14\xdf\xff\x76\x02\x47\x5e\xd8\x30\x3d\xf5\xc8\x1e\x91\xff\xde\
+\x53\x38\x4c\xe0\xaa\x47\x87\xf0\xf8\x21\xa4\x34\x12\x40\x26\x2e\
+\xc7\xc2\x6d\x8a\x54\x56\x91\x11\x0a\xee\x93\x2a\xe0\xf8\x4b\x6c\
+\x9a\xe0\xa1\x3d\xe2\xc1\xb2\x02\x54\x35\xfd\x63\x25\x12\xe3\x93\
+\xfa\x4a\xed\x65\x57\x0b\x2c\x13\x5c\x04\x12\x6d\x6a\xcc\x98\x25\
+\x19\x8d\x31\x2a\x1f\xbc\xe4\x33\xa0\x6e\xd7\x34\x81\x92\xb7\x5f\
+\xa4\x95\xe4\xa0\xf6\xf4\x20\xdd\x99\xac\x94\xf2\x15\x29\x16\x8e\
+\x78\xaa\x23\xbf\xd2\x5d\x94\xe9\x8c\x24\x32\x47\x26\x60\x7e\x41\
+\x27\x38\xb6\xe5\x8a\x13\xdc\xfb\xca\x3e\xb8\x42\x37\x21\x2a\x12\
+\x88\x8d\x04\x73\x2d\x81\x1a\x17\x45\x93\x01\x12\xcb\x8d\x6c\x2e\
+\x0b\x1f\x18\x26\x49\x08\xb0\x6f\x00\x18\xa0\xd7\x68\xdb\x45\xc0\
+\x4b\xb9\xe1\x70\x1e\x41\xed\xce\xac\x99\x36\x5d\xbb\xdb\x01\x93\
+\x6f\xa4\x12\xe1\x06\x37\x62\x48\x9e\x94\x39\x91\xf3\x59\xa7\xb2\
+\x69\xc3\xe4\x9e\x5f\x88\xbd\x03\x36\xb5\x0b\x9a\xfa\x2d\x7e\x2a\
+\xfa\xe3\xca\x25\xff\x01\x8e\xfc\xeb\x28\xd4\xdd\xc0\xeb\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x6f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x36\x49\x44\x41\x54\x78\xda\x9d\x96\x4d\x6c\x54\x55\
+\x14\xc7\xff\xf7\xcd\x47\xdb\xe1\x4e\xdb\x69\x4b\x09\x1f\x12\x88\
+\x2e\x94\x8d\x0b\xe3\xce\x68\x10\x13\x53\x43\x13\x57\x2e\x6a\xd4\
+\x90\xb0\x52\xe2\x67\xe3\x67\x42\x40\x04\x6a\x40\x13\x1a\x24\x25\
+\x26\x12\xd7\xba\x01\xc1\x60\x14\x85\xb8\x31\x1a\xe3\xc6\x16\x28\
+\xc4\x4c\x28\x65\x3a\x6d\x67\xa6\x33\x7d\xd3\x99\xf7\xee\x7b\xef\
+\xf8\xbf\x33\x55\x17\xda\x30\xe3\x24\x93\x3b\x6f\xde\x7d\xe7\x77\
+\xce\xff\x7f\xce\x9d\x51\x68\xe3\xa5\xc7\x97\x05\x21\xe0\xbe\x96\
+\x56\xad\x3e\xd3\xf2\x46\xfd\xf1\x8a\xec\xd8\x6a\xb0\x7d\x4b\x1c\
+\x17\xae\x44\x70\xdf\x6a\x0d\xd2\xd2\x26\x7d\xd4\x95\xcc\x80\xc1\
+\xa5\x91\x5e\x24\x04\x78\xfe\x72\x05\xbf\xfd\xcc\x4a\xde\xef\xb9\
+\xeb\xf3\x77\xdd\xa0\x0f\xb9\x92\x4c\x7b\xf2\xcd\x9e\x8c\xba\xc7\
+\x51\x58\x32\x11\xe6\x43\x85\x97\xbf\x2b\xe3\xe6\x14\x21\x87\x32\
+\xea\x7f\x03\xf4\x81\x65\x51\xda\xaf\x9d\xdf\xd3\xdb\xb5\xa3\xcb\
+\xc1\x54\x39\xc4\x94\x2b\xd0\x09\xc0\x89\x29\x1c\xbd\x54\x41\xf6\
+\x9a\x82\x3b\xb6\x36\x64\xcd\x1b\x7a\x7f\x59\xa4\xcb\xc7\xd9\xbd\
+\x7d\x78\x48\x3b\x98\xac\x84\xf8\xa9\x48\x8f\x95\x20\x08\x04\xdd\
+\x49\x07\xf1\x98\xe0\xd8\xc5\x0a\xe6\xb3\x84\x1c\xeb\x57\x2d\x03\
+\xf4\xdb\x65\xa9\x27\x3c\x7c\xb9\x2f\x83\xc7\xba\xe3\xb8\xca\xe0\
+\x3f\x16\x23\xde\xa1\x01\x5c\x7c\xbe\x6b\xbe\xa0\xab\xc3\x81\x10\
+\x72\xfa\x6c\x09\xe5\x5c\x1c\xee\x89\x01\x75\x57\x80\x7e\x77\x49\
+\x6a\xe2\xe1\xcc\x8b\x19\x0c\xaf\x4f\xe0\x3a\x65\xb9\x5c\x88\x10\
+\x88\x34\xe2\x9b\x48\xe0\x85\xcd\x75\xc5\x07\xba\xd7\x39\xa8\x06\
+\x21\xbe\xb8\xb0\x84\xea\x62\x82\x90\xf5\x6a\x4d\x80\x7e\xa7\x2c\
+\xae\xa9\x61\x62\x5f\x1f\x9e\xd9\x90\xc0\x34\x33\xff\x7e\x31\x82\
+\x6f\x04\xe2\x00\x21\x21\x86\xc1\xeb\x0c\xee\x07\xbc\xb6\x10\xae\
+\xbd\x9d\x31\x94\xf9\xc5\xf9\xaf\xca\x30\xb5\x18\xdc\xf1\x0d\xea\
+\x5f\x00\xfd\x46\x49\xaa\x5e\x1d\xa7\x5e\xef\xc3\xb3\x9b\x92\xc8\
+\x2e\x87\x38\x3b\x1f\x62\xc5\x00\x1d\xd4\xbd\xbe\x9a\xb5\x05\xf8\
+\xab\x00\x5a\x81\x80\x9d\x55\x67\x25\xba\x4b\xa1\x50\x0d\x70\xe5\
+\x5c\x89\x1b\x28\xd7\xc4\x46\xf5\x37\x40\x1f\x2e\x4b\xd2\xf7\xb0\
+\xff\x85\x1e\x8c\x6c\x4e\xa2\x4a\x7d\xa7\x2a\x11\x7e\x58\x08\x10\
+\x32\x50\x9c\xd9\x7b\xac\xc2\x06\x36\x56\x26\x1b\xdc\x7e\xe6\xea\
+\x32\x83\x18\x0d\x07\x41\xba\x3b\x81\x22\x4b\xfa\xe5\x1c\x2b\x31\
+\x94\xeb\x93\x41\xa5\xf4\x07\x4b\x22\x31\x83\xa1\x87\x93\x18\x7a\
+\x60\x1d\x6e\xce\x1b\x14\x3c\x41\x07\xdb\x30\xc5\xc8\x2b\xec\x7b\
+\x2f\x94\x46\xb6\xd1\x6a\x15\x16\xd4\xb8\xe6\xbe\xfc\xcd\x3b\xac\
+\xc0\x41\x80\x54\x23\x93\xd4\xc6\x24\x5c\x4a\x3b\x7d\xa9\x8c\xce\
+\x7e\x0d\xa5\x0f\x97\x24\x16\xfa\xd8\x44\xcd\x8b\xcc\xda\x63\xf6\
+\x41\x29\xc2\xc0\x7d\x09\x8c\xee\xd2\xd8\xd6\x09\x7c\x7d\x2b\x40\
+\xc9\xfa\x60\x3d\x60\x07\x99\xd0\x4a\xc5\xa0\x24\x56\x6e\xcc\x21\
+\x3b\xed\x45\xd5\x64\x07\x47\x23\x0e\xa7\x9e\x40\xb2\x2f\x0e\xcf\
+\x0d\x10\x98\xd8\xda\x73\x90\x39\x58\x90\x23\xcf\xe9\x46\x9b\x9e\
+\xbc\xe1\x61\x86\xf0\xb8\x6a\x1a\x5d\x67\xfa\xa1\xe3\xc0\xd0\x98\
+\xea\xed\x39\x14\x16\x35\xb2\x07\x37\xb7\x3e\x07\xf6\x35\xf0\x51\
+\x51\x46\x9f\x4a\xe1\x91\x3e\x07\xa7\xaf\x7b\x98\xad\x00\x31\x65\
+\x07\x8d\xfa\x9b\xa6\xc1\x7e\x9d\x2d\xbb\x70\x0b\xcb\xb3\x03\xc8\
+\x8e\x6d\x6c\x0f\xd0\x3f\x56\x90\x97\x76\xaf\xc3\x4e\x9e\x02\xa7\
+\xae\x1b\x2c\x2c\x53\x1b\xdb\xaa\xa6\xd9\x49\x81\x28\x04\x7e\x88\
+\x5a\x21\x8f\x95\x3f\x52\x98\x39\xb1\xb5\x3d\x40\xef\x91\x45\xd9\
+\x3b\x94\xc2\xe3\xfd\x31\x9c\xbc\xea\xa1\x60\x2b\xc0\x3f\x1e\xf8\
+\x1c\x8c\x90\x00\x73\xa7\x08\x8f\x9d\x39\x7b\xfc\xde\xf6\x00\x99\
+\x03\x0b\x32\x62\x2b\xe8\x77\x30\x31\x49\x40\xb9\x29\xd1\x5f\xb3\
+\x10\x46\x0a\x86\x00\xff\x76\x9e\xab\x46\xfe\xc3\x36\x2b\xe8\x79\
+\x6f\x5e\x9e\x1e\x4e\x61\x17\x2b\xf8\x74\xd2\x47\x81\x12\x29\xdb\
+\x9a\x76\x0e\x28\x53\x18\xd1\x64\x9e\x19\xf5\xd9\x3c\x54\xa0\xb1\
+\x70\xbc\x5d\xc0\x68\x5e\x9e\x64\x05\x8f\x6e\x88\xe1\xb3\xdf\xeb\
+\x28\x2f\x71\xb3\x35\x99\xee\x06\x76\x1e\xe8\x81\x10\x60\x72\x73\
+\x10\x56\x50\x1a\xdf\xde\x1e\x20\xfd\x6a\x4e\x9e\xd8\xcd\x36\xdd\
+\xe2\xe0\xcc\xaf\x3e\x4a\x4b\x51\xf3\x30\xb5\xc7\x43\x18\x41\x58\
+\x81\x6f\x25\xca\xe5\x91\x34\x69\x94\x4e\x6d\x6b\x0f\xa0\x5f\xc9\
+\xc9\xce\xe1\x34\x06\x53\x82\x6f\x27\x0d\x02\x4e\xad\x70\x7b\x64\
+\xa7\xda\xb6\xa9\xe2\x51\x6d\x4d\x9e\xc9\xd1\xfc\x34\xdc\x76\x01\
+\x83\x6f\xe6\xa4\xff\xc1\x14\x6a\x6c\xfc\x1a\xf5\x77\x38\xb5\x86\
+\x53\x1e\x05\x9c\xf6\x6a\x88\x88\xc1\x43\x9e\x5f\x3e\x1d\xd7\x1c\
+\x42\xf7\xf3\xfb\xdb\xac\x60\x24\x2b\xb5\x42\x91\xb2\xa8\x46\xff\
+\x0b\xb3\x66\xe3\x43\x45\x41\xe3\x57\x8d\x87\x0f\xec\x5f\x18\x7b\
+\x04\xe9\x8e\x01\xb8\x17\xff\x1b\xf0\x27\xed\x3c\x70\xf0\xc1\x15\
+\x0b\x1a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\xda\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\xa1\x49\x44\x41\x54\x78\xda\x85\x56\x69\x6c\x54\xd7\
+\x15\xfe\xde\x9b\x7d\xb3\xc7\x2b\xe3\xf1\x82\x8d\x6d\x3c\x66\x1b\
+\x9b\xad\xd4\x25\x72\x5a\x82\x40\x24\x24\x0e\x6d\x8d\x03\x6a\x8b\
+\x68\x4b\x91\x91\x51\xf7\xb4\x3f\x48\x09\x88\xf0\x27\x52\xd3\xb4\
+\x06\xd4\x90\x02\xa2\x0d\x4b\x82\x1d\x27\x01\x15\x68\x93\x14\x4a\
+\x5a\x62\x12\x30\x60\x8c\xa1\xf2\xc0\x18\x3b\xc6\xcb\x78\xb6\xf7\
+\xe6\x6d\xf7\xbd\x9e\x19\x08\x52\x44\x69\xae\x74\xf5\xee\xdc\x77\
+\xdf\xf9\xee\xf9\xce\x77\xce\x19\x0e\xff\x67\xcc\x3e\x34\xde\xa8\
+\xea\x5c\x4b\x71\x9e\x69\x59\x81\xd3\x54\xe1\xb5\xf3\x99\xfd\xa8\
+\xa4\x63\x4c\x64\xa1\x3b\x13\xda\x49\x33\x8c\xc3\xbd\x6b\x0b\xfe\
+\xf1\x28\x1b\xdc\xff\xda\xac\x3d\x30\x12\x74\x3b\x4d\xdd\x2b\x02\
+\x2e\xcb\xfc\x7c\x3b\x7c\x36\x0e\x56\xdd\x80\xf5\xfe\x69\xc5\xa0\
+\xc9\x73\xf8\x8c\x16\x9f\x8c\x4a\x38\xd1\x2f\xa8\x49\x81\x2d\xe8\
+\x5b\xe7\xeb\xf9\x52\x80\x69\x7b\x87\xdb\x97\xcd\xf2\xb4\xae\xa9\
+\x76\x23\x17\x06\x2c\x74\xe9\x98\x06\x24\x75\x0e\x02\x81\xa4\x87\
+\xdb\xc4\xc1\xc5\x19\xc8\x32\x01\x2a\x6d\x8d\x1b\x1c\x0e\xdd\x4c\
+\xe0\x74\x4f\x72\xd7\xc0\x46\xff\xa6\x47\x02\xcc\xfc\xd3\xf0\x91\
+\xb5\x0b\x73\x9a\x97\x97\xd8\xe1\x32\x0c\x0c\x2a\x40\x7f\x92\x21\
+\x1c\x57\x51\xe5\xd0\x61\x32\x99\xa0\xeb\x64\x54\x51\x10\xd6\xac\
+\x28\x76\x9b\x51\xe3\xe1\x50\x42\xb7\x48\xd1\xf7\x5d\x43\x29\xbc\
+\xd5\x1d\x3d\xda\xfb\xfd\xe2\xd5\x0f\x01\x94\xbe\x7a\xab\x7d\xc3\
+\xd7\x0b\x5a\x9f\x2e\x76\x40\x56\x75\xf4\x49\x40\x68\x54\xc4\xd3\
+\x05\x06\xaa\x3c\x0c\x36\xbb\x05\x07\xf7\x1d\x00\xd3\x19\x9a\x5b\
+\x5a\x10\x8b\x27\xd1\x17\x37\xe1\x8c\x96\x8d\x9a\x42\x0f\x6a\x1d\
+\x3c\xac\xe4\x59\x47\x38\x89\x7d\x67\x26\x76\xdd\xf9\x71\xf9\xa6\
+\x07\x00\x15\xaf\x84\x82\x8d\x73\xb2\x2f\xb5\x05\xb3\xa1\x31\x0e\
+\xe7\x22\x0a\x8a\x98\x84\x55\x15\x66\x32\x68\x40\xd2\x18\x9c\x0e\
+\x27\xca\xfd\x7e\x70\x1c\x87\xab\x37\x6e\x22\x16\x8b\xc2\xd0\x54\
+\x68\x8a\x8a\xf7\xc6\xdd\x30\x7c\x3e\x2c\xce\x26\xbe\xcc\x26\xb4\
+\x5f\x8c\xe2\xcc\xd5\x58\xdd\xed\x9f\x54\xf6\x64\x00\x02\x7b\x42\
+\x4a\xfb\xaa\x32\x8b\x97\xd6\xe7\x63\x0c\x39\x8a\x88\x96\x5a\x0f\
+\x44\x32\xae\x31\x1d\x9a\x24\x81\xe8\xc6\xc5\x0b\x9f\xc0\xe9\x76\
+\xa1\xb8\xb4\x0c\x32\xed\x69\x9a\x06\x83\x3c\x32\x31\x19\x1d\x23\
+\x1e\xb8\xa6\x96\xe0\x2b\x6e\x03\x43\x3a\x8f\xe7\x8f\x0d\xaa\xfd\
+\x6d\x15\x56\xae\x74\x47\x5f\xe3\xca\x46\xff\x87\x1b\x6a\x1c\xf8\
+\x54\x00\x6e\x84\xe3\xd8\xd9\xe0\x25\x95\x98\xc0\xed\x3b\x08\x96\
+\x88\x41\xf8\xd1\x0f\x61\x10\xef\x86\xaa\x42\x27\xa3\x32\xdd\x3a\
+\x6d\x3c\x3d\x75\xc6\xee\xad\xe9\xfd\xfe\x88\x1f\x35\xe5\x5e\x2c\
+\xf2\xf2\xf8\x43\x6f\x02\xa7\xce\x8d\x3c\xce\x15\x6e\xb9\xbc\x7b\
+\xeb\xba\xc0\xc6\x39\x6e\x0e\x67\x47\x35\x3c\x9b\xcf\x50\xe3\x73\
+\x92\x11\x06\xd5\x6a\x86\x7d\xf9\x2a\xc8\xa1\xdb\x10\xbb\xde\x00\
+\x2b\x2b\x83\x1e\x8f\x53\x90\x55\xb0\xfb\x86\xd3\x00\x6a\xda\x13\
+\xa6\xe2\xf2\xa4\x09\xa1\x9c\x2a\x2c\xca\xe5\x71\x87\x24\xfc\x8b\
+\xfd\xfd\x7b\xb8\xf2\x97\xaf\x0f\xfc\xaa\x69\x5a\xc5\x6d\x41\x47\
+\x6f\x28\x82\xae\x67\x8a\xa0\x93\x82\x54\x85\x6e\x45\x04\xb2\xd8\
+\x24\xcc\x55\x73\x90\x24\x6e\x95\xb5\x6b\xc0\x6d\xdf\x02\x96\x92\
+\x32\xb4\x69\x69\x8f\xee\x03\x68\xf4\x34\x24\x19\x7f\x4c\x54\x62\
+\x76\xb1\x13\x6e\x2b\xf0\xc2\x5b\x03\x21\x6e\xc6\xef\x07\x8c\xd6\
+\xa5\x7e\xfc\x73\x82\xc1\x3d\x99\xc0\x6b\x4f\x4e\xc9\xa8\xca\x20\
+\x90\x54\xda\x90\xc3\x0e\xbc\xfe\x17\x28\xdb\xb6\x41\x22\xbe\x93\
+\x04\xe8\xee\x3a\x0a\x7d\x7a\x2d\xc5\x41\x4e\x1f\x84\x4e\x5a\xc9\
+\x88\x61\x72\x1c\x5b\xae\x52\xc0\xcb\xcb\xb0\xb8\x90\xc7\xfe\x0f\
+\x3e\x03\x57\xbf\x37\x64\xac\x5e\x30\x05\xe7\x09\x20\x4f\x96\x11\
+\xe8\x7e\x15\x3f\x7f\x61\x1b\x2e\x5c\xb8\x80\xda\xda\x00\x24\x59\
+\x81\x62\xb1\xc3\xf0\x38\xa1\x15\xf8\x21\xbe\xf2\x3b\xac\x93\x17\
+\xe1\xc0\x57\x05\x88\x52\x0a\x8a\xa6\xe3\x9d\x8e\xb7\xb1\x63\xe7\
+\x76\x3c\xd7\xf4\x0c\x86\x96\xbc\x04\x5b\xa0\x0c\xf3\x73\x78\x74\
+\x9e\x1f\x25\x80\xdd\x21\x63\x5e\xb0\x00\xc3\x02\xc3\x53\x39\x1c\
+\x92\xc7\x5f\xc6\x2f\x7f\xf3\x39\x40\x6d\xc6\x0b\x95\xe8\x61\xff\
+\xee\xc6\xb5\xe5\x4b\xb1\xf9\x4d\x11\x13\xfd\x61\x34\xfa\x15\x6c\
+\xad\x57\x21\x68\x06\xde\x7b\xfb\x5d\x6c\xdf\xf1\x22\x5a\x9a\x9a\
+\xe0\x5f\xff\x5b\x74\x73\x5e\x4c\x71\x71\xb8\x72\x85\x00\xaa\x5f\
+\xea\x35\x02\x0d\x53\x21\x48\x0c\x2b\x3c\x12\x7e\xd6\x50\x98\xa1\
+\x88\x51\xca\x8a\x82\x00\x85\x02\xaa\x12\xbf\x30\xf1\x44\x23\x8f\
+\x0d\x6f\x8e\x01\x71\x01\xf1\x58\x0a\x6f\x7c\xcb\x82\x8a\x2c\x1d\
+\x92\xc2\x81\xa7\x42\x25\x45\xa3\x38\x16\x29\xc5\xa7\xb6\x29\x30\
+\x9b\x81\xc1\x4b\x43\xe0\x7c\xcf\x77\x0f\xcc\x5b\x32\xbd\x42\x90\
+\x75\x4c\xd3\x04\xbc\xbe\xd2\x4f\x9c\xa6\x3f\x52\x32\x41\x54\x55\
+\x2d\x13\x44\x46\x13\xba\x9a\x91\xea\x8b\x67\xe3\xd8\x7b\x22\x82\
+\x3c\x4a\xac\x8f\xda\xbc\x18\x1c\x93\xa0\x50\x2e\x24\x09\xf8\xb4\
+\xfd\x6b\xf8\x58\xe4\x61\xe3\x0d\xdc\xfa\x88\x82\xec\xfe\xee\xe9\
+\xdd\x73\x57\xcf\xdd\xa8\xc8\x1c\x1a\x7c\x3c\x56\xe7\xab\x58\x58\
+\x9d\x0b\x31\x25\x7f\x01\x20\x2d\x49\x95\x7e\xa7\x81\x6c\x86\x86\
+\xee\x61\x01\xcd\x7b\x06\xf1\x44\x8d\x19\x5b\x96\x64\x43\x94\x53\
+\x38\x1b\xd2\x11\x99\xd1\x80\xf7\x6f\xa5\x60\xb6\x70\x08\x1f\xbf\
+\xb8\x87\xcb\x5e\x77\xaa\xd1\x57\x5f\xf9\x61\x56\x71\x36\x2c\x44\
+\x43\xb3\x37\x85\xb6\xc5\x79\x90\x35\x23\x53\xd4\x1e\x78\x90\xa6\
+\x29\x5d\xaa\x89\xb2\x94\x98\xca\x78\x63\xe5\x18\x76\x9c\x1a\xc5\
+\x0f\xe6\x39\x30\x11\x4d\xe2\x9a\x7d\x06\xfe\x1c\xb1\x23\xa5\xe8\
+\x90\xef\x26\x90\xbc\x3c\xf0\x78\xa6\x54\x64\xad\xff\xbb\x52\xb9\
+\x72\xae\x45\x4c\x28\x78\xb2\xda\x8e\x99\xca\x24\xd6\x3f\x56\x84\
+\x64\x52\xce\x64\x6d\x1a\xc0\x4c\xa4\x76\x76\x74\x22\x27\x27\x07\
+\xc1\x60\x1d\x04\x51\xc8\xbc\x33\x41\x85\x22\x4a\xe8\x0c\x39\x21\
+\x92\x74\x8f\x5e\x8b\xc1\x6e\xb3\x20\xf6\xfe\x55\x35\xb1\x7f\xc9\
+\xbd\x16\xe2\x6a\x79\x37\xe8\xae\x99\x7a\xc9\x13\xf0\x41\x97\x19\
+\x36\xd7\xb9\x60\x99\x18\xc7\x77\xea\x73\xc0\x53\x3f\x48\xca\x2a\
+\x3c\x1e\xaa\x35\x4e\x47\xc6\x8b\xa1\xa1\xbb\x18\x1b\xbf\x0b\x46\
+\x94\xc5\x63\x02\x8e\x87\x6d\xf0\xcf\x9f\x85\xad\xff\x8a\x10\x0b\
+\x04\xd9\x4f\xef\xc2\x77\xea\x84\xc3\x2b\x7b\x1e\x94\x6b\x7b\x53\
+\x47\xbb\xb7\x61\x56\x2b\x9f\xe7\x86\x4c\x0a\xda\xba\xc8\x8b\xff\
+\xf4\x8f\x60\x71\x91\x81\xc7\xca\x5d\xc8\xf5\xba\xf1\xd3\xb6\xcd\
+\xd0\x74\x0d\xdb\xb6\xef\xc4\xe0\xc8\x18\x4e\xde\x48\x62\xd0\x5c\
+\x88\xca\x99\x25\xf8\xf5\x07\x11\x58\x2d\xd4\x2f\x46\xa3\xd0\x2f\
+\x5e\xdf\x25\x77\x7e\x73\xd3\x43\x0d\xc7\xf2\xed\xae\x23\x8e\xba\
+\x9a\x66\x2e\x3f\x2b\xc3\xf9\x37\xaa\x5d\x78\xb6\xc4\x8c\x77\xce\
+\x8d\x20\x48\x02\xf8\x38\x94\x24\xee\x81\xba\x52\x3b\xae\x27\x78\
+\x3c\xb5\xb0\x18\x47\xc2\x32\x4e\xf7\x25\x00\x6a\xa1\xfc\x28\x3d\
+\xfb\x6e\x1e\xd5\x8e\x35\x3d\xdc\x70\x3e\x1f\xa6\xe5\x87\xda\xf9\
+\x40\x65\x2b\x3f\xbd\x14\x0a\x51\x63\x90\xdc\xea\xc9\xe0\xec\x7c\
+\x2b\x8a\xb2\xa8\xc5\x53\xac\x87\x45\x0d\x3d\x23\x0a\xae\xdc\xa2\
+\xf2\x9b\xee\xa2\x36\x12\x7d\xff\x20\xcc\x03\xe1\x5d\xda\x5f\x9f\
+\x7b\x74\xcb\x7c\x00\xb2\xe2\x50\x90\x71\xe6\x6e\xcc\xa8\xb2\xc0\
+\x97\x4b\xa7\xc8\x0a\xa3\xa9\xb1\xfb\x27\xd2\x8d\x85\xbb\xb7\x37\
+\x36\x41\xb7\xbe\xad\xf2\x60\x0b\xf4\x13\x6b\xbe\xbc\xe9\x7f\x61\
+\x2c\x3d\xd8\x48\x09\xd0\x82\x6c\xcf\x32\x38\x9d\x15\x70\xda\xef\
+\xed\x93\x6a\x48\xab\x21\x44\x13\x27\x29\xc3\x0f\xe3\x6f\xdf\x7b\
+\xe4\xdf\x96\xff\x02\xf7\x08\x64\xc9\x5e\xc3\xa7\x06\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\xa7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x6e\x49\x44\x41\x54\x78\xda\x85\x56\x09\x6c\x14\x65\
+\x14\xfe\xfe\x99\xdd\xd9\xee\xd9\x2d\x14\x7a\x59\xca\xd6\x8a\xa5\
+\x88\x55\x6b\x53\x95\x88\x16\xba\x82\x02\x06\x34\x1c\x2d\x87\xa8\
+\x51\x14\x8b\x11\x05\x8f\x04\x8c\x89\x91\x68\x82\x80\xb6\xc4\x80\
+\x78\x60\x29\xa0\x68\x09\x88\x94\xba\x34\x44\x08\x14\x4b\x8b\xb6\
+\x2a\x2a\xd2\x9b\xd2\xb2\xb4\xdb\xdd\xee\x7d\xcc\x8c\x6f\x66\xb1\
+\x6a\x14\xfd\xb3\x93\xdd\x99\xf9\xe7\x7d\xdf\xfb\xde\xf7\xde\x2c\
+\xc3\x7f\xac\xa2\xbd\x7d\x25\x96\x04\x6e\xfe\x84\x51\x1a\x7b\xb2\
+\x9e\xb3\xe9\x04\x1e\x3c\x5d\xf7\x86\x44\xb8\x23\x52\xc7\xf9\xc1\
+\x98\x63\x38\x2c\xed\x3b\xbd\x30\xed\xe8\xb5\x62\xb0\x7f\xbb\x58\
+\xb8\xab\xb7\xc0\x96\xac\x3d\xf6\xd4\x44\xbd\x59\x16\x04\x5c\x6f\
+\xe0\xe0\x8e\x01\x8d\x1e\x09\x12\x3d\x71\xab\x11\xb0\xf0\x1c\x7e\
+\xf2\x89\xd0\x47\x22\xd8\xd9\x16\xf2\x76\x0e\x44\x8b\x1b\x97\x64\
+\x34\xff\x2f\xc0\x1d\xbb\x7a\x2b\xee\xcb\x35\x94\xdf\x3b\x46\x83\
+\x90\x56\x40\x8b\x1f\x58\x99\xc1\x61\x4b\xb7\x88\x04\x2e\xbe\x27\
+\x22\x03\x8f\x8d\xe5\xf0\xa1\x53\x42\x96\x00\xe4\x08\x32\x0e\xf7\
+\x86\x50\x7f\x3e\x50\xd9\xb0\x24\x63\xd5\x35\x01\xa6\xed\xbd\xb8\
+\xbb\x2c\xdf\x52\x3a\x3d\xdd\x00\x4f\x44\xc2\xfe\x41\x09\x26\x9e\
+\x61\x11\x05\xdb\xd1\x27\x42\x7b\x75\x77\x8c\x00\x16\x27\x73\xa8\
+\x1e\x90\xc0\xe8\x9a\xdd\x24\x23\x00\x0e\x67\x07\x43\x70\xfc\xec\
+\xdd\xe3\x58\x78\x5d\xd9\x3f\x00\x6e\xdb\xd1\x55\xb1\x72\x8a\xb5\
+\x5c\x67\xd2\x63\x6e\x32\xc3\x29\x97\x84\x54\x1d\x43\x8e\x99\x41\
+\x92\x95\x43\x86\x92\x80\x24\xc7\x0f\xfa\x80\x13\x65\xb4\x05\x65\
+\xf4\x45\x49\x36\xbd\x8c\xad\x4e\x40\x08\x04\x51\xd3\xe4\xae\x6c\
+\x5d\x61\x5b\x35\x02\x90\x57\x79\xa1\x60\x4e\x81\xb5\x69\x56\xb6\
+\x05\x69\x1a\x20\x2d\x81\xe1\x62\x48\x46\xc3\xb0\x88\x49\x26\x1e\
+\x97\xc2\x32\x7e\xf0\xc7\x01\x94\xa5\x04\xcf\xd1\x01\xa9\x5a\xa0\
+\x8b\xf6\x4d\x36\x32\x64\xe9\x94\x67\x24\x7c\xe9\x06\x6a\x5b\x5d\
+\xf0\x0d\x06\x6f\x6f\x59\x99\xd3\xac\x02\x4c\xdd\xd5\x31\x5c\x3d\
+\x3b\xc3\x6c\xa4\x08\x61\x3a\x3f\x42\xd2\x5c\x8a\x10\x53\xfa\xbd\
+\x2c\x95\x47\x55\xbf\x08\x81\xee\x89\x0a\x7b\xa2\xaf\x7c\x07\x48\
+\xa7\x52\x92\xee\x63\x92\x4e\xa4\xec\xd2\x49\xbf\xb9\x24\x5b\xa2\
+\x86\xe1\xc4\x50\x14\xeb\xeb\xfa\xbd\xbf\x96\xdf\x60\x61\x39\x1b\
+\xcf\x95\x6c\x9e\x95\xea\xc8\x4d\x35\x63\x67\x7f\x0c\xab\x33\x35\
+\x78\xaf\x57\x84\x4e\x01\x23\x84\xe7\xb2\x78\xbc\xd9\x16\x25\x7b\
+\x32\x35\x50\x6c\x04\x40\xc2\xfa\x6c\x01\xaf\x5e\x88\x80\x62\x22\
+\x10\x95\xb0\x6e\xbc\x16\x6b\x7e\x8b\xe0\x85\x2c\x1d\x4e\x75\xbb\
+\xf1\xd1\x19\xb7\x9d\xe5\x6d\x39\xb7\xad\xaa\xd4\xf6\xe4\x11\x0f\
+\x03\xed\x41\x39\x39\x66\x73\x8f\x08\x8e\x82\x90\x41\x50\x96\xc6\
+\xc3\x1b\x16\x91\x93\xa4\xf9\x9b\xdb\x2e\x0c\xc5\xd4\xef\xca\xae\
+\x08\x82\x94\x8d\x97\xea\xb0\x31\x57\x8b\x55\x3f\x85\xd5\xc2\xe7\
+\x53\x4d\x6a\xbe\xb9\xb4\x9d\xcd\xae\x6e\x6f\x5f\x5e\x9c\x69\xe3\
+\xa2\x22\x26\x26\x00\x7a\x72\x4d\x90\x28\x86\x49\x69\x1f\x3d\x94\
+\xae\xe7\x70\xc4\x19\x05\xc7\xc5\x33\x10\xa5\x78\x91\x83\x94\xc1\
+\x9c\xb1\x1a\x74\x05\x15\xa7\x71\x94\xb1\x04\x23\xed\x19\x8a\xca\
+\x38\x36\x20\xe2\xa8\x4b\xc4\xe5\xef\xfa\x3a\xd8\x23\x9f\xb7\xcb\
+\x1b\xa6\x5f\x87\x06\x57\x0c\x8c\x82\xa7\x10\xd1\xaa\x7e\x09\x3c\
+\x05\xf3\x51\xb4\xb7\x27\xe9\xb1\xba\x35\x00\x9e\x68\xc5\x44\x39\
+\x2e\x93\x2c\xc1\x4f\xe0\xdb\x6e\x31\x60\x59\x93\x1f\x5a\x4a\x37\
+\x20\x32\xac\x18\xa7\x41\x27\xb9\x8a\x31\x19\xb3\x53\x74\x58\x5b\
+\xdb\x0d\xf6\xcc\xd7\xbd\xf2\x98\x8c\x24\x38\xe9\xc6\x24\x13\x90\
+\x4c\xce\xa8\x23\x06\x3c\xb1\xf4\x91\x66\xef\x4c\xd6\x63\xc5\xf7\
+\x01\xb5\x07\xc4\xab\x16\x55\xea\xe0\xa5\x93\x9d\xb7\x1a\x50\x4a\
+\x00\x64\x3a\x04\x89\x79\xe9\x38\x2d\x5a\xa9\xdb\x1b\x07\xa2\xea\
+\xbe\x70\xb7\x0b\xec\x89\xda\x1e\xd9\x9a\x4a\x00\x34\x5f\x6e\x36\
+\xf3\x48\xd1\xca\x38\x74\x59\x54\xfd\xeb\x23\x19\xb6\x51\x90\x47\
+\x9b\xfd\x10\x94\x0c\x46\x5c\xa4\x68\x2e\xa3\xba\xd0\x88\x05\xa7\
+\x7d\x2a\x80\x9f\x6e\x2e\x19\x2f\xa0\xd9\x23\xa2\xe9\x72\x14\xa2\
+\xe2\xe9\x4e\x02\x58\x50\x7d\x5e\x7e\xa3\x24\x13\xf5\xce\x98\x6a\
+\xcb\x74\x03\xc3\xd6\x8e\x08\x18\x05\x0a\xd2\xe0\xa9\x2e\x34\x60\
+\x11\x05\x11\xa8\x26\xca\x1c\x8a\x12\x73\x99\x7e\x28\xd9\xd5\x4c\
+\x31\x61\xe6\x37\x1e\x72\x11\x23\x57\x01\xab\xf3\x12\x70\xde\x27\
+\x81\x4a\x81\xb2\x0c\x01\x2f\x1e\xe8\x04\x2b\xda\xd4\xd2\x7e\xcb\
+\x3d\xd9\xb6\xc4\x58\x0c\xb3\xc6\x6a\x61\x26\xcf\xf9\xc5\xb8\xcf\
+\x5d\x14\x24\x9b\x9a\xa3\x91\x7c\xad\x34\xdc\x5f\x97\x32\xe8\x6e\
+\xb2\x68\xf1\xe3\x70\x14\xa3\xa8\x49\x94\x2c\x46\x93\xbc\x3d\x24\
+\xf5\xfb\xdd\x61\xca\x22\x06\x6b\x6b\x47\x07\x1b\xb7\xf6\xf8\xb6\
+\xe7\x96\xe6\x3f\xf9\xc5\xc5\x28\xa8\x61\xb1\xeb\x36\x03\x16\x34\
+\xfa\x55\xc6\x3c\x51\x79\x3d\x4f\x8f\xaa\x9e\x90\xca\x4a\xbc\xaa\
+\xbf\x22\x55\x80\x48\x2c\x27\xcd\x9f\x6d\x0a\x20\x4c\x66\xf0\xd1\
+\x04\x6c\xb0\x27\xa2\xb0\x76\x48\xcd\xa8\x88\x9a\xb0\xad\xbe\x6d\
+\x3b\xb3\xae\xa8\x2f\xd9\xb0\xf4\x46\x47\x4a\xb2\x05\x2f\x9d\x0b\
+\xe2\x60\x91\x09\x0f\x35\x78\xa1\xa7\x4d\x4a\x0d\x0e\x4f\x35\xa3\
+\xb8\x7e\x98\x3a\x59\x99\x47\x12\x01\x30\x55\x2a\x2f\x65\x77\xc2\
+\x9e\x84\xbb\xea\x5c\x20\xcb\xc3\x4d\x35\x71\xd8\xad\x98\x76\xd0\
+\x85\x0d\xc5\x89\x70\xb6\x0d\xa0\xaa\xbe\xc7\xae\x8e\x8a\xac\xf5\
+\xa7\x86\x5f\x5b\x94\x67\xbe\x83\x64\x70\x13\xc3\x57\x7e\x09\xa1\
+\x8d\x6c\xab\x30\xdd\x79\xa7\x05\x65\x27\x3d\xd0\x91\x42\xb2\x88\
+\x78\x2f\x88\x4a\x8f\xc8\x38\x58\x32\x0a\x0f\xd4\x0d\x12\xa8\x84\
+\xd1\x49\x3c\xea\xa6\x58\x55\xf9\xde\xba\x10\x44\xed\x9e\x56\xaf\
+\xef\x03\xbb\x45\x05\xb0\x2c\x3f\x52\x90\x7f\xf7\xf8\x26\x77\xf2\
+\x28\xac\xbd\x5e\x87\x3c\x53\x7c\xc8\x3e\xff\x63\x10\xeb\x26\x1a\
+\xf1\xea\xaf\x3e\x9c\x25\x5d\xa1\x36\x1b\x81\x10\xfb\xdc\x74\x01\
+\xef\xe6\x5b\xf0\x74\xb3\x07\x6b\x6e\x34\xa0\x30\x91\xc7\x51\xaa\
+\xd5\x3a\x72\x1c\x6b\xe9\x86\x39\xe8\xbf\xdd\xb5\x63\x46\xf3\xc8\
+\xb8\x4e\x7a\xfc\x70\x85\xed\xee\x09\xe5\xe7\x98\x01\xdb\x0b\x8c\
+\xf8\xb4\x37\x8c\xd9\x34\x2e\x8b\xac\xbc\x3a\x42\x94\xc2\x2b\x75\
+\x50\x9c\x46\x84\x61\xa0\xe6\x52\x9a\xef\xac\x57\xc4\x8e\xae\x10\
+\xe6\x67\x0a\x78\xf9\xeb\x21\x08\x57\x86\x60\x70\x5e\xa9\x74\x7f\
+\xf2\xc0\x9f\xe3\xfa\x8f\x65\x58\x74\x60\x37\xb2\x33\x4b\x67\xcc\
+\xcc\x82\x4d\x27\x61\xd3\xb7\x7e\xb5\xb3\x2a\xa6\x59\xb1\xca\x31\
+\x14\xdf\x2d\xab\x95\xc6\xc6\x19\xa3\xb1\xe6\xd0\xa0\x3a\xbc\x97\
+\x91\x34\xbf\x90\x7b\xce\x38\xda\x61\x72\x5e\xd9\xe3\xad\x7e\xf0\
+\x9f\x2f\x9c\x11\x90\x85\xfb\x2b\x02\x96\xc4\xf2\x79\x4b\xf3\x71\
+\xfa\x52\x10\x7d\x34\xb7\xf7\xdd\x9f\x84\xf9\x87\x06\xc0\xd1\xcc\
+\x91\x09\x40\xa6\xb9\x5f\x3d\x37\x05\x8b\xf7\xf7\xc3\x92\xa6\x47\
+\x6e\x9a\x0e\x8d\x7b\x5a\x61\x8c\xfa\x2a\xfd\x7b\xe7\x5d\xfb\x95\
+\xf9\xc7\xd2\x3d\x5c\x53\x80\x04\xcd\xb1\x99\xc5\x36\xf3\x57\x2e\
+\x1d\x1e\x2c\x4a\x82\x87\x4a\x50\xdf\xe2\x51\x33\x98\x3a\x39\x11\
+\x46\x81\xa1\xf6\xa4\x93\x7a\x47\x84\xe3\x78\xa7\x97\x45\x62\xc5\
+\xe1\xcf\x1f\xfa\xff\x97\xfe\x5f\x17\x37\xef\xb3\x12\x4e\x94\xe6\
+\x6b\x0d\x82\x7d\x74\xba\xd5\x76\x71\x48\x52\xaf\x67\x58\x38\xb8\
+\x06\xfc\x1d\x51\x9f\xdf\x21\xf1\xdc\x3e\xa9\x66\xc1\x35\xff\xb6\
+\xfc\x0e\x3b\x30\x15\x74\xf9\x7d\x80\x0b\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x81\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x48\x49\x44\x41\x54\x78\xda\x8d\x55\x6b\x6c\x53\x65\
+\x18\x7e\xbf\x73\xba\x76\xeb\xda\x95\x76\x74\xb4\xec\x02\x8c\x41\
+\xc7\x36\x99\xf1\x02\x61\xd2\x91\x10\x83\x46\x4c\x9c\x31\x1b\x4a\
+\xd0\x60\xf8\x21\x8a\x31\x31\xf1\x12\xc4\xc4\xc4\x3f\x26\x5e\x82\
+\xa2\x44\xff\xa8\x88\x3f\x80\x0e\xe3\x05\x2f\x24\x5e\x16\x46\x10\
+\x05\x99\xb0\x8b\xc3\x6c\x30\x07\x9b\xbd\xad\xed\xba\xae\x97\x73\
+\xfb\x3e\xdf\xef\x14\xd6\x36\x1d\x99\x6f\x73\xb6\x9e\xd3\xf3\x3d\
+\xcf\xfb\xbe\xcf\xfb\x7c\x1f\x81\xff\x11\x9f\x8e\x24\x98\x28\x00\
+\x30\xc6\xf0\x02\x20\xf8\x2c\x2d\x33\xd8\xdd\x6c\x23\x0b\xad\x9d\
+\xf7\x85\x8f\x86\x67\xbc\xbb\xd7\x54\x9c\xbe\x79\x7f\xf8\x4a\x82\
+\xad\xb1\x9b\x40\xa3\x00\x14\x09\x04\x24\x1b\x9e\x4a\xc1\x93\x9e\
+\x45\x73\xeb\xf7\x5f\x08\x7b\x9f\xbf\xd3\x79\x7a\x41\x82\x83\x43\
+\x71\x5f\xb5\xd5\xd8\x19\x9c\x95\x03\x4f\x35\xd9\xdc\xef\xf5\x4f\
+\xdb\xad\xa5\x24\xda\x68\x2f\x03\x95\xa3\x03\x27\x20\x30\x14\x4a\
+\xc2\x8c\xa4\x39\x5e\xbc\x63\x71\xec\xdd\xbe\x29\x7f\x95\xd5\xe8\
+\x9a\x98\x96\xba\x5f\xba\xdb\xd9\x75\x4b\x82\x03\x83\xd3\xc7\x56\
+\x39\x4c\x5d\x95\x65\x06\x48\xc9\x14\x2e\x05\x92\xcc\x69\x29\x21\
+\x95\x65\x22\x98\x0d\xa2\x9e\x3d\xd3\x3f\x00\x49\x59\x83\xf0\xac\
+\x8a\x97\xc4\x6e\x73\x5b\x88\xb1\x44\xc0\xef\x0a\x8c\x05\x93\xbe\
+\xbd\x6d\xae\x6d\x45\x04\xef\x0f\xc4\x7c\x2b\x1d\xa6\x4e\x87\x49\
+\x04\x25\x9b\x28\x08\x8c\xe8\x60\xfa\x5b\x84\xa3\x67\xef\x39\x11\
+\xd5\xf5\x60\x80\x5d\xd3\x5b\xc7\x28\xd5\x5f\x8c\x66\x14\xb8\x1a\
+\x48\x76\xbf\xba\xd1\xdd\x35\x47\x70\x70\x20\xe6\x5d\x62\x31\xf6\
+\xd6\xd8\x4a\x40\x56\xf5\x34\x75\x20\x81\x90\x1b\xf9\x16\x46\x46\
+\xa1\xd9\x2f\x22\x47\x07\x50\x28\x9b\x4b\x84\x03\xfa\xa7\x25\x08\
+\x45\x53\xed\xaf\xb4\x57\x9f\x9e\xab\xe0\xc0\x40\xd4\xdf\x52\x65\
+\x76\x19\x20\x9b\x25\x21\xc5\xc0\x3c\x66\xb1\x3c\x9e\x3d\x27\xcf\
+\x0f\x45\xcd\x92\x4a\x58\xce\xc8\x64\x22\xb0\xcf\xbb\xd4\x5d\xa4\
+\xc1\x5b\x17\x22\x74\x43\x9d\x85\x28\x34\x07\x2e\xe3\x42\x11\xc7\
+\xe6\xca\x54\x12\xe2\x29\x15\x54\x59\x05\x13\xce\x6c\xe3\xf2\x45\
+\x20\x2b\x1a\x76\x4e\x28\x50\xf4\xd2\x95\x08\x7b\x6d\x73\xad\x90\
+\xf7\x28\x1b\x6f\x9e\x0b\xdb\x9d\x56\x43\x74\xb9\xdd\x0c\x37\xbb\
+\x92\x54\x35\xe0\x1d\xbb\x1c\x4c\x82\x41\xa3\xe1\x7a\xab\xd0\xa3\
+\x6a\x94\xfd\x7e\x75\xa6\x23\x93\xd1\x4c\xeb\x5a\x5d\x60\xc6\x81\
+\xc8\x8f\x09\x1c\xdf\x58\x34\xe3\x78\x7d\x4b\x5d\x4c\x27\xd8\xdf\
+\x17\x61\x65\x25\x28\x1a\xf6\xb2\x1a\x47\xd1\x62\xcc\x65\xc4\x5b\
+\x31\x18\xce\x80\xd3\xc8\xce\xee\x58\xe3\x68\xcb\x07\x7a\xfb\xc7\
+\xb1\x5f\x87\xfd\xb3\x1b\xb6\xb4\xaf\x28\x6c\x21\x56\x19\xc0\x6a\
+\x09\x7e\x32\x92\x02\xe4\xc3\xfe\x08\x6b\x59\x62\xc5\xc9\xa1\x7a\
+\xb6\xba\x55\x6f\x44\x02\xfb\x3d\x19\x97\xe0\xb9\xb5\xf6\x79\x0d\
+\xb9\xfb\xc8\x20\xbb\xb7\xad\x90\x40\x46\x0d\xf8\x74\x69\x44\x80\
+\xf1\xf1\x18\x90\x0f\xfe\x9c\x62\x8d\x6e\x0b\x68\x1a\xd3\xe5\xe5\
+\x48\x33\x2a\x40\x0a\xfb\x1b\xc7\xaa\xc6\x22\x52\xff\x3b\x6d\x8b\
+\x5b\xe7\x55\x7c\xd3\x67\x67\x9a\xee\x6f\x6d\x6b\x6a\x5d\x02\xe5\
+\xf6\x52\xfd\x51\xa5\x48\x75\x5d\x9c\xe5\x02\xc8\xe1\x04\x90\x83\
+\x48\xd0\xec\x2a\x87\x0c\x82\x5d\xc7\x3f\x11\x29\x3b\x0d\x17\xa7\
+\x64\xc0\x0a\xb1\x5c\x69\xe4\xec\xa3\xd5\xab\xe7\xc3\xaf\xec\x38\
+\x3a\xea\x5e\xdf\xb8\xd2\xb1\xa2\x12\xcc\x8e\x2c\x81\x82\x18\xa8\
+\x13\xa8\x38\x08\x13\xbd\x57\x81\x3c\xf3\xd3\xbf\xac\xb6\xc6\x06\
+\xe3\x49\x15\x98\xca\x1b\x4f\x91\x2c\xd7\xa6\x31\x7f\x06\xe4\xb4\
+\xda\xf2\xdb\x13\x75\x43\xf9\xe0\x4b\x1f\x3f\xd1\x2c\x27\xd2\x83\
+\xad\x3b\xdb\x41\xc8\xd3\x4d\x91\x34\xa0\x7c\xb3\x32\x08\x10\x38\
+\x35\x0a\xa4\xe5\x8d\x7e\x66\xb6\x95\x82\x86\xe6\x69\x68\xb2\x43\
+\x45\x85\x11\x14\x39\x47\x10\x40\x0d\x62\xc1\x34\xd0\x8c\xb2\xed\
+\xfc\x1e\x8f\x8f\x3f\x6b\x78\xb6\x67\xb3\x14\x4f\xfe\x5c\xe2\x6d\
+\x82\x9a\x2a\x73\x41\x55\xe9\x30\x4e\xd1\x65\x3f\x37\x3d\xd0\x44\
+\x2a\x37\xa6\x9e\x7d\xe7\xed\x95\xb5\xb6\xe8\xea\xb5\x4e\x34\x4d\
+\x8e\x40\x43\x5d\x42\xc1\x0c\x4c\x4f\x26\x40\x9e\x49\xff\x21\xcf\
+\xa6\x2f\x29\xd3\xa9\x5d\xe4\xae\x7a\x58\xea\x2c\x04\x57\xb1\xfa\
+\xe8\xc5\x49\x90\xaf\x87\x1c\xff\x1c\xda\x1a\x2b\x32\x5a\xc3\xcb\
+\x67\xe9\xba\x87\x3c\x44\x4b\x53\xa0\x24\x2b\x74\xbe\x8b\x52\xd8\
+\x46\x5e\x69\x89\x15\xb7\x6e\xdc\xec\xa4\x3c\x37\xcb\x29\x19\xb3\
+\x16\x61\xea\xbb\x3e\x76\xed\xf3\x07\x8b\x8d\xd6\xb8\xf7\x9c\xdf\
+\xd3\xbe\xcc\x65\xe4\x9b\x1d\x8a\xa4\x71\x37\x93\xe2\xe9\x4c\xa9\
+\x44\x07\x4f\xe5\xe9\xa4\x72\x61\x31\x7b\xfc\x09\x54\x4c\x22\x75\
+\x66\x38\x30\x71\x78\x6b\x6e\xab\x58\xf5\xc2\x19\xef\xe2\x86\xaa\
+\xde\x9a\x66\x07\x48\x68\x14\xbe\x3b\x72\x02\x7a\xe3\x80\x89\xcb\
+\x74\xde\x29\x55\xd1\x27\x7c\x62\x34\xf4\x90\xa6\x66\xf7\x28\x4d\
+\xc0\x04\xff\x0e\x80\x32\x36\xd9\x1e\x38\xfa\x70\x6e\xb3\xab\x7f\
+\xfa\x17\x9f\x6b\x7d\x7d\xa7\x0d\x47\x96\xaa\xdc\x74\x88\x2c\x12\
+\x50\x14\xee\x72\x4d\xf7\x89\x7e\x41\xd6\xf5\x5c\x1b\x15\x95\xe4\
+\xff\x35\x3e\x39\x48\x44\x45\x11\xd4\x89\x38\x28\x17\x87\xbb\x83\
+\x5f\x6e\xeb\x2a\x68\x11\x8f\xe5\xbb\x4e\x1e\xab\x5a\xbf\xaa\xcb\
+\x52\x6d\x85\x34\x4e\xcf\xc4\xc9\x01\x66\x5e\xe6\x24\x65\x35\x76\
+\x10\x2b\x4a\x31\x5b\x04\xa3\x3c\x63\x1c\xc7\x68\x1a\xa4\xf1\x08\
+\x02\xfa\x99\x71\xd3\xed\x84\x96\xa3\x2e\xd7\xf1\xbe\xef\x2f\x5f\
+\xe8\xeb\xed\xc5\x07\xce\xcd\xa8\xdb\xf9\x83\xaf\xc2\x53\xdd\x99\
+\x18\xf1\x07\xc6\x3f\xb9\xcf\x5d\xbb\xe3\x5b\xbb\x58\x61\x8e\x5a\
+\x37\xae\xd6\x77\x52\x95\x97\x80\x26\x4a\xf6\x0e\x03\x9d\x99\x75\
+\x04\x8e\x3f\x12\x73\x75\x1e\xf7\x43\x8d\xdb\xa5\x8d\x8e\x75\x87\
+\x4f\xec\xb8\xf5\x91\x99\x23\xf9\xde\x7b\xed\xd0\x03\x73\x07\x78\
+\xed\x9e\x1e\x56\x76\x8f\x07\x27\x08\xcd\xc8\xb5\x11\x0d\x90\x3e\
+\x35\x04\xc1\x8f\xb7\xcc\xad\xaf\xea\x38\xe2\x0d\x7d\xf5\xd8\xc2\
+\x87\xfe\x7c\xe1\xde\xfe\x0d\x23\x66\x13\x30\xfd\xb0\xc1\xcd\x0c\
+\x0f\x7d\x48\x24\x20\xf4\x45\xd7\x82\xeb\xff\x03\xa2\xe5\xc6\x94\
+\xfa\x4a\x63\xdd\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x03\x9b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x62\x49\x44\x41\x54\x78\xda\xed\x94\x4b\x48\x14\x71\
+\x1c\xc7\xbf\xff\x99\xdd\x71\xd7\x5d\x8b\xa4\x17\x6a\xba\x26\x44\
+\xa1\x1d\xb2\x94\x5e\x52\x41\xf4\x84\xc8\x3c\xc4\xf6\x38\x16\xe5\
+\x5a\x87\x3a\xf4\xb8\x14\x74\x29\x29\x42\xa5\xdd\x20\xa2\x42\x9a\
+\x4d\xb0\x43\xa7\xea\xd0\x25\x4b\x83\x1e\xd0\x03\x2a\x2b\xdd\x72\
+\xdd\x56\x2c\x4d\xdb\x99\xd9\xdd\x99\x9d\xe9\x37\xbb\x62\x5a\xbe\
+\x20\xeb\xd4\x1f\x66\x0e\xc3\xfc\x3f\x9f\xdf\xeb\xff\x67\xf8\xcb\
+\x8b\xfd\x17\xfc\x3b\xc1\x45\xa7\x95\xde\x5b\xb0\x2f\x72\xf3\xef\
+\x08\xbc\x76\x11\x89\x84\x1b\x16\xab\x1b\xfb\xa5\x1b\x93\x2b\xb8\
+\x60\x17\x67\x4c\x9b\xe9\x3e\xb4\xad\x0a\xc7\x2e\x1d\x07\x2c\x82\
+\x9f\x24\x3b\x26\x47\xe0\x4d\xaf\x82\x9e\xa8\xab\xf7\x5c\xc5\xed\
+\xde\x3b\x68\x0a\x3e\x40\xf8\xe9\x17\xa8\x8a\x26\xa2\x52\xda\xf9\
+\x67\x02\x6f\xba\x1b\x86\x21\x9e\xdd\x7b\x1a\x9f\xf5\x10\xc4\x77\
+\x0d\xb0\xf1\x36\x70\x1c\xd0\xf1\x28\x8c\xb8\xac\xbe\x1f\x2e\xf0\
+\x39\xf2\xa0\xeb\x01\xfa\x63\x23\xa5\x78\x67\x4c\xb8\xcf\xb1\x0e\
+\x51\xe9\xee\xb9\x03\x35\x08\x25\x3e\xe3\xfa\xbb\x1b\xb0\x71\x69\
+\x60\x8c\x81\x91\x20\x98\x12\x5c\x61\x43\x36\xb8\xa1\x6a\xa2\x7b\
+\xd9\x1a\xf8\x9b\xef\x01\x82\xe0\x22\xc9\xc7\x51\xe0\x79\x88\xc9\
+\x01\xcf\xd6\x03\x48\xcf\x72\xa0\xbe\xd5\x3f\x08\xe7\xac\x1c\xba\
+\x9e\x77\x23\xd2\x25\x07\xa8\x44\xf9\x6c\x10\x1e\xd7\xc4\xc3\x9b\
+\x16\xa3\x30\x57\x41\x77\x4f\x29\x8e\x34\x5c\x06\xd2\xd2\xf2\x49\
+\x12\xf8\x05\x9e\x8f\x78\xb4\xad\xaa\xbc\x12\xf3\xe7\x2c\xc0\xa9\
+\x57\x67\x60\xa7\xb2\x24\xe1\x16\x82\xbf\x20\x78\x58\x6e\x87\x47\
+\x9a\x9b\x6a\xb2\xcf\x59\x41\x91\x37\x9a\xf0\xdc\xe9\x1f\xd0\x1f\
+\x67\xc8\xb0\x67\xe1\x5b\x5f\x11\x4e\x36\x8a\x24\x11\x86\x4b\x6a\
+\xad\x7d\x1b\x4b\xd6\x4f\x29\x5f\xba\x01\xd5\xaf\x6b\xa1\xd2\x27\
+\x8e\x6a\xc2\x78\x86\xde\x0f\xfd\xe8\x6d\xeb\x05\x3c\xf2\x60\x65\
+\x18\xbc\x0e\x63\xed\x82\x2c\x54\x94\x48\x88\xc4\x18\x64\x9d\x21\
+\xa6\x9b\xbb\x04\x68\x91\x52\x54\xdf\xba\x69\x4a\x72\x49\xd2\x81\
+\x3a\xa1\xbd\xac\x68\x99\x6b\xcf\xea\xed\x38\xfd\xba\x06\x31\x18\
+\x48\x10\x9c\xe3\x18\xa4\x2e\x39\x59\x1a\x58\x38\x0a\x28\x12\xf8\
+\x29\xf0\x39\xb3\xa1\xe9\xc1\x5d\x2b\x9d\x28\x99\x2b\xa0\x2f\x0e\
+\x44\x13\x1c\x24\xdd\x6c\x96\x00\xa6\x2c\xc1\xf9\x5b\x8d\x2a\x6d\
+\x7c\x5b\x90\x5d\x50\xe4\xdd\x7a\x02\x47\x5b\x8f\x43\x31\x78\xc4\
+\x0d\xce\x0c\x1f\xf2\x97\x28\xc2\xcf\xc2\x04\xe7\xa9\x6f\x91\x61\
+\x7d\x1b\xe8\x81\xd3\x05\xd5\x68\x77\x97\x39\xb0\xd0\x95\x86\x7e\
+\xca\x24\xaa\x73\x94\x0d\x60\x50\xf3\x04\x65\x11\xfc\x0f\x9b\x70\
+\x6d\xf7\x29\x78\x3f\x5d\x44\x48\xf9\x8a\xa8\x61\x85\x46\xf0\xb8\
+\xac\xa1\xa3\x25\x44\x24\xb6\x93\xe0\xe2\xaf\xf3\x30\x64\x8a\x4c\
+\x89\xde\x5e\xbe\x22\x03\x85\x79\xb6\x64\x2f\xa2\x94\x85\xac\xe9\
+\x48\xf0\x02\xb6\xe5\x54\xa2\x21\x28\xe2\x93\xdc\x43\xa5\xe1\x11\
+\xa3\xe8\x23\x04\x0f\x3e\x4a\xc2\x87\x5d\x0f\x23\x0b\x86\x48\x36\
+\x2f\xcf\xc0\xbc\xec\x74\x7c\xd7\x90\xec\x87\x92\x60\xf8\xae\xeb\
+\x14\x35\x9f\x7a\xe8\x57\x53\xd0\x7a\xbf\x13\xba\xa6\xd7\x11\xfc\
+\xe0\x68\xc7\xe5\xf7\x93\x3c\x20\x59\xb7\x74\x2a\x5c\x39\x76\xc8\
+\x2a\x83\x42\x12\xd9\x48\x95\x4c\x36\x58\x52\xf8\xa6\x25\x0c\x4d\
+\xd1\xfc\x34\xeb\x3b\xc6\x3a\x8f\x23\x5f\x15\x03\x92\x55\xa5\xa6\
+\xc4\x81\x3e\xd5\x48\x36\xde\x14\xc4\x2c\x3c\x5e\x34\x87\xa1\xf4\
+\xab\x77\x09\xbe\x01\xe3\xac\xd1\xef\x22\x9f\xb3\x98\xa6\xeb\xe9\
+\xf2\x25\x99\x98\x95\x65\x83\x44\x99\xc4\x38\x1e\x2f\x9f\x7f\x45\
+\x4f\x88\x4e\xa9\x47\xca\x1f\x0f\x3e\xb6\x20\x25\x71\x93\x44\x2c\
+\x2e\xce\xc4\xec\x5c\x07\x1e\x3f\xe9\x41\x77\xa7\xdc\x86\x2a\xa9\
+\x60\x22\xf0\xf1\x05\x43\x24\xd9\xae\x0c\x74\x7e\x8c\x00\x3c\x2b\
+\xa0\x71\x6c\x9b\x3c\x41\x4a\x52\x41\xd7\x72\x23\x8d\x63\x0e\xc1\
+\x3b\x27\x0a\x37\xd7\x0f\xc2\xf5\x84\xe5\x60\x82\x52\x9b\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xed\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xb4\x49\x44\x41\x54\x78\xda\x9d\x95\xc9\x4b\x5b\x51\
+\x14\xc6\x4f\x1c\x70\x2e\x0a\xa6\xb1\x31\xb5\x89\x11\x8d\x42\x24\
+\x0a\x15\xa1\x56\x17\xa2\x68\x76\xd2\x8d\x33\x82\xfa\x0f\x94\xee\
+\xdb\x95\xb8\xb0\xff\x82\x0a\x22\x38\x6d\xdc\xa9\x50\x84\x42\x10\
+\xaa\x20\x11\x44\x17\x76\x61\xf5\xc5\xc6\x28\x4e\x71\x1e\xd2\xf3\
+\x1d\x72\x1f\x71\x8e\xbd\x70\x7c\xcf\xf7\xce\xfd\x7d\xe7\x7e\xf7\
+\xbc\x1b\x03\xfd\xe7\xa8\xaf\xaf\xb7\x5c\x5d\x5d\xbd\xbf\xb8\xb8\
+\xb0\x5e\x5e\x5e\xba\x39\x6c\xa1\x50\xc8\xce\x41\x37\x37\x37\x7e\
+\x4e\x71\x2e\x2e\x2e\x06\x0c\x2f\x05\xbb\xdd\x6e\x80\x7f\xa5\xa4\
+\xa4\xbc\xc9\xc9\xc9\xa1\x92\x92\x12\xca\xcd\xcd\x95\x77\x87\x87\
+\x87\xb4\xb9\xb9\x49\x7b\x7b\x7b\x34\x30\x30\x80\x47\xaf\x5f\x24\
+\x50\x57\x57\x67\x3e\x39\x39\xd1\xda\xdb\xdb\xa9\xb3\xb3\x93\xbc\
+\x5e\xaf\x00\x03\x81\x00\xf9\xfd\x7e\x11\xb8\xbe\xbe\xa6\xd8\xd8\
+\x58\xf9\x7f\x66\x66\xc6\x1f\xb5\x40\x6d\x6d\xad\xf9\xec\xec\x4c\
+\x6b\x6d\x6d\xa5\xc6\xc6\x46\x1a\x1b\x1b\x23\x5e\x89\x40\x59\x94\
+\xd8\x22\x0a\x06\x83\xc4\x96\x89\x48\x62\x62\x22\x8d\x8f\x8f\x53\
+\x54\x02\x35\x35\x35\xe6\xf3\xf3\x73\xad\xa9\xa9\x49\xe0\x98\xc8\
+\x3e\xd3\xfc\xfc\x3c\xcd\xce\xce\x02\xea\x61\xe8\x07\x87\xc3\x41\
+\x59\x59\x59\x22\x92\x94\x94\x44\x53\x53\x53\xcf\x0b\x54\x57\x57\
+\x8b\x2d\xcd\xcd\xcd\xd4\xd1\xd1\x41\x43\x43\x43\x52\xb9\xa6\x69\
+\x34\x32\x32\x72\xb4\xbe\xbe\xfe\x0a\x79\x99\x99\x99\x46\x5e\xc5\
+\x36\xac\x5b\x5e\x5e\x96\xb9\x73\x73\x73\xbf\x9f\x14\xa8\xaa\xaa\
+\x32\x9f\x9e\x9e\x8a\xe7\x2d\x2d\x2d\x34\x3c\x3c\x2c\x56\x20\x16\
+\x16\x16\xc8\xe3\xf1\x7c\x61\xa1\xef\x2a\x3f\x39\x39\xf9\x67\x6f\
+\x6f\xef\xc7\x89\x89\x09\xe2\x79\xb4\xba\xba\xfa\xe3\x51\x81\xca\
+\xca\x4a\x81\xb7\xb5\xb5\x11\x02\x95\x03\xcc\x56\xd1\xf1\xf1\x31\
+\x6d\x6d\x6d\xd1\xe4\xe4\x64\x70\x77\x77\x37\x4d\xcd\x61\xdf\x43\
+\xa3\xa3\xa3\xc4\x22\xb4\xb3\xb3\x43\x3e\x9f\xef\xf3\x83\x02\x15\
+\x15\x15\x7a\xe5\x5d\x5d\x5d\xd4\xd7\xd7\x27\xbe\x42\x80\xab\xa4\
+\xa3\xa3\x23\xa9\x70\x7a\x7a\x1a\xdd\x12\x64\xff\xbf\xf2\x9e\x7c\
+\xcb\xcf\xcf\x4f\xeb\xee\xee\x26\x88\xac\xad\xad\x21\xe7\xd3\x3d\
+\x81\xf2\xf2\x72\x81\x3b\x9d\x4e\x6a\x68\x68\xa0\xc1\xc1\x41\xdd\
+\x16\xee\x22\x01\xe3\xde\x60\x30\x48\x3b\x9a\x4c\x26\x59\x55\x5e\
+\x5e\x1e\x61\x0e\xba\x0b\xcf\x97\x96\x96\xb0\x57\x6f\x6f\x09\x94\
+\x95\x95\x09\xbc\xa0\xa0\x40\x3c\xbf\x0b\x07\x08\x57\x84\xb2\x0b\
+\x2d\x19\x13\x13\x43\xe9\xe9\xe9\xb2\xba\x8c\x8c\x0c\xda\xd8\xd8\
+\x40\x78\xb9\x39\x5c\xba\x40\x69\x69\xa9\xf4\x39\x5a\x0d\xed\x08\
+\xb8\xb2\x05\xa0\xc8\x40\x17\xe1\x39\x5a\x55\x05\x06\x84\x30\xf0\
+\x3d\xc4\xc5\xc5\xbd\x3b\x38\x38\xf8\x23\x02\x2e\x97\x4b\xe0\x85\
+\x85\x85\x84\x76\xec\xef\xef\x17\x00\x04\x60\x09\xae\x00\xe3\x19\
+\xe0\x08\x54\x8e\x81\xb3\x07\x03\xb6\x60\xf3\xf1\x8e\xef\xb3\xf9\
+\x03\xf4\xe1\xb9\xa1\xb8\xb8\xd8\xc8\x93\xb7\x01\x47\xe5\x80\xa3\
+\x22\xe5\x37\xae\x10\x50\x5f\x28\x22\x7c\xa0\xe9\x55\x23\x00\x47\
+\x0e\x57\xae\xc3\x45\xa0\xa8\xa8\xe8\x2f\x7b\x6e\x02\x1c\x07\x94\
+\xb2\x44\xc1\x71\x8f\x89\xa8\x2c\xd2\x0e\x88\x60\xa3\x19\x28\x70\
+\xcc\x63\xa1\x6c\xee\x30\x5f\xe4\xbe\x1a\x6c\x36\x5b\xa8\xa7\xa7\
+\x47\xfa\x1c\x93\x91\x0c\xb8\x12\x50\x96\x28\x01\x40\x65\x62\x04\
+\x1c\x45\xa0\xf2\xbb\x70\xc9\xb3\xdb\xed\x2b\x9c\xec\x80\x45\x80\
+\xe2\xe0\x42\x44\x56\x8f\xea\x50\x71\xa4\xdf\x08\xe4\x21\x07\x9e\
+\xf3\xc6\xde\x83\x8b\x00\xfe\xf0\xb9\xae\x71\x92\xd9\x6a\xb5\x4a\
+\x45\xe8\x02\xd5\x92\xca\x77\x55\x3d\x22\x3e\x3e\x5e\x3e\x36\x08\
+\x03\xce\x73\x1e\x84\xeb\x02\x18\x46\xa3\x51\x44\x2c\x16\x8b\x6e\
+\x93\xea\x1a\xc0\x55\xf5\x80\xab\x02\x00\xe7\xbc\x47\xe1\xb7\x04\
+\x30\x52\x53\x53\xb5\x84\x84\x04\x33\x8e\xdc\x48\x01\xac\x40\x7d\
+\xb9\xdc\xdb\x3a\x9c\xaf\x4f\xc2\xef\x09\x84\x0f\x2c\x8d\x37\xcc\
+\xac\xce\x75\x65\x0f\x5a\x71\x7f\x7f\x5f\xe0\xe8\x16\x7e\xf7\x2c\
+\xfc\x41\x01\x0c\x16\x10\x11\x1e\x7a\xf5\x38\x1d\xb1\xa9\xa8\x9c\
+\x57\x16\x15\xfc\x51\x81\x70\xa7\x88\x08\x36\x5e\xfd\xde\xa2\x72\
+\xb6\x2c\x6a\xf8\x93\x02\x61\x91\x15\x5e\x81\x83\x57\xe0\x67\xb8\
+\x93\xef\x03\x2f\x81\x63\xfc\x03\x2c\xcd\xf5\xbc\x41\xe8\x10\x78\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x36\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xfd\x49\x44\x41\x54\x78\xda\x95\x94\x4b\x6c\x1b\x55\
+\x14\x86\xff\x33\x8e\x1f\x6d\x88\xec\xaa\xa6\x04\x47\x25\xd0\xa8\
+\x55\x55\x85\x82\x68\x43\x54\x45\x20\x45\x59\x21\xf1\x2a\x94\x05\
+\x6c\xd8\xa6\x9b\x82\x80\x0a\xb2\x28\xb0\x0c\xab\x20\x36\xd9\xb0\
+\x45\x45\xbc\xa4\x4a\x48\x74\x81\x50\x14\x54\x01\x42\x62\x01\x25\
+\x11\x04\x22\x27\x71\xec\x26\x4d\xed\x24\xe3\xd8\x8d\xed\x99\xc3\
+\x39\xf3\xf0\xf8\x25\xd5\xcc\xe8\x6a\x46\x33\xe7\x9e\xef\x9e\xff\
+\xfe\xe7\x12\xfe\xc7\x35\x3b\x3b\xcb\x44\x84\xc9\xc9\x49\xea\x76\
+\x4e\xd7\x81\x73\x73\x73\x3c\x3c\x3c\x0c\xd3\x34\x91\x4e\xa7\x31\
+\x3e\x3e\xde\xd5\xdc\xae\x82\x32\x99\x0c\xa7\x52\x29\xcc\xcc\xcc\
+\x60\x74\x74\x14\x63\x63\x63\xc8\x66\xb3\x18\x18\x18\xb8\xe7\xfc\
+\x7b\x06\xfc\xfb\xcf\x5f\x7c\x6c\xe8\x84\xf3\x3e\x3d\x3d\x8d\x91\
+\x91\x11\x4c\x4c\x4c\xa0\x68\x16\xb0\x95\x37\xf1\xc8\xc3\x83\xd4\
+\x35\xc0\xfe\xf2\x79\xa6\xc4\x51\xe0\xee\x3a\x96\x2b\x27\x50\x1a\
+\xfd\x08\xc3\x03\x40\xa5\x52\x41\x24\x12\xa9\xc7\x55\xab\xfb\x08\
+\x87\xa3\xce\xfb\xfc\x8f\x73\x28\x5d\x7d\x15\x67\x07\x7b\x91\x4c\
+\x24\xb0\x5b\xd8\x40\x7c\x2a\x43\x6d\x00\xfb\xab\x17\x19\xe3\x17\
+\x41\x77\x6e\x00\x5c\xc2\xc2\xca\x7d\xd8\x4c\x4e\xe2\xc9\xe3\x31\
+\x6c\xdc\xde\x82\x61\x84\xe4\xbb\x37\x49\x66\x19\x64\x21\x71\x64\
+\x08\x3f\x7c\xff\x2d\x72\xd7\x2f\xe3\xf5\xb1\x07\x11\xeb\x89\x49\
+\x22\xc6\x6e\x7a\x01\xf1\xf7\x56\xa9\x0d\x40\x67\x9e\x06\x96\xaf\
+\x01\xf1\x24\x7e\x5e\x3c\x8c\x6b\x9b\xe7\x31\x71\xfa\x20\x0a\x7b\
+\x65\x89\x30\xda\xca\x8f\xf6\x3e\x80\xf9\x1b\xf3\x78\x28\xfd\x09\
+\x2e\x3d\xd3\x2f\x5f\x0e\x00\x96\x85\xdd\xb5\x25\xc4\xdf\x6d\x03\
+\x9c\x67\x7a\xe2\x29\x20\xf7\x0b\x90\x38\x8c\xe5\x35\x1b\xef\x7c\
+\x6a\xa2\xb4\xb7\x85\xbe\x68\x54\xd2\xcb\xf2\xa5\x88\x48\xd8\x6e\
+\x82\x30\x33\x3e\x3e\x77\x13\xc9\xc7\x0f\x01\x25\x0b\xd8\x49\x02\
+\xd9\x05\xd0\xdb\x9b\x2d\x80\xaf\x5f\x62\x7a\xec\x9c\xfc\xfc\x15\
+\x88\xc5\x81\x5e\x1b\xd9\xa5\x15\xfc\xf4\xc7\x06\x92\xb1\xb0\x24\
+\x27\x44\xec\x5a\x5b\x15\x83\x43\x49\xa4\x8e\x0f\x02\x5b\xbb\x4a\
+\x03\x36\xb7\x65\x91\x37\x41\x6f\x6e\x74\x00\x3c\x7a\x56\x00\xbf\
+\x01\xe1\x3e\xfd\x02\xdc\x2f\x9a\xf6\xc9\x60\x91\xc7\xae\xc8\x28\
+\x77\xb6\xca\xaa\x0f\x16\x80\xd8\xd7\x01\xbc\xd1\x06\x78\x99\xe9\
+\xd4\x69\xf9\xf9\xbb\x00\x7a\xdd\xe0\x9a\x0e\xdb\x8d\x0a\xb3\xee\
+\xac\x9f\xc6\x9d\x48\x02\x66\x02\xdb\x12\xa3\x83\x6d\x90\x18\x02\
+\xb9\x3f\xa5\x82\x5b\x1d\x00\x27\x4f\x4a\x89\x8b\x92\xe8\x20\x02\
+\xcb\xc0\x71\x06\x88\xeb\x8b\xac\x03\x54\x12\xfd\x67\x49\x05\x96\
+\x07\x29\x9a\xc0\xad\xbf\xa5\x82\x4c\x07\xc0\xb1\x21\x20\xbf\x24\
+\x80\x03\x01\xc0\x4f\xa4\xde\x6c\x7c\x3a\x93\x24\x61\xad\x16\x3c\
+\xab\x32\xca\x22\x63\x7e\x05\x74\x29\xdd\x02\xf8\xe6\x02\xd3\x51\
+\xe9\xaa\xed\x74\x33\xc0\xf6\xa5\xa1\xa0\x22\x05\xe8\xd0\xa4\x62\
+\x4b\xf8\x12\x49\x43\x62\xaf\x24\x80\x75\xd0\x5b\x6d\x80\x57\x98\
+\x52\x47\x04\xb0\x2a\x8e\xf1\x00\xec\xe9\x61\x18\x41\x24\xfb\xd2\
+\x68\x52\xab\xae\x3d\x6a\xf2\xbe\x2f\x80\xa2\x00\x0a\x59\xd0\xe5\
+\x95\x0e\x80\xfe\x84\x00\x72\x92\x30\xda\x2c\x51\x28\x14\x48\xd5\
+\x38\x74\xf5\xfe\xb3\x5a\x95\x23\x66\x1f\x30\x05\xb0\x93\x03\x4d\
+\xad\x77\x90\xe8\x90\x6c\xee\x5e\x3e\xe8\x5a\xc3\x08\x00\xaa\xbd\
+\x2f\x87\x7f\xa9\x44\xba\x0e\x4d\xae\xf2\x94\x05\x50\xbe\x2b\x8b\
+\x94\x0a\xae\xb4\xd9\x54\x00\xf1\x90\xeb\x02\xa3\xe1\x58\xd0\xc4\
+\x0e\x00\xae\x53\x7c\xd9\xd4\x39\x2a\x8b\x42\x2b\xb5\x00\xb2\x2f\
+\xef\x3b\x6b\xa0\x0f\xee\xb4\x1e\x15\xd2\x68\xea\x4e\x53\x3a\xb2\
+\x27\xd4\xdc\x48\xea\x77\x87\x69\xb8\xba\x5b\x9e\xde\x0a\xf4\x2d\
+\xaa\xfd\xa2\x10\x8b\x5d\xc0\x87\xf9\x16\xc0\x17\x2f\xb0\x36\x16\
+\x61\xdb\xed\x5c\x5d\x39\xf9\xcd\xc4\x2e\xc0\xf2\x9c\x53\xf5\x20\
+\x8e\x64\x4e\x69\x2e\xc0\xf2\xf6\xa6\x98\x91\x0a\x5a\x01\x9f\x3f\
+\xc7\x1a\x44\xd5\x82\xd7\x49\x0d\xce\x51\xab\x86\x55\x6b\xb5\x62\
+\xd5\x4d\xe6\xef\x85\xed\x4b\xc6\xae\x31\x74\x61\x66\xa6\x43\x05\
+\x9f\x3d\xcb\xda\x28\x24\x0e\x08\x3c\x4f\x41\xeb\x3a\xc3\xf6\xe0\
+\x76\x60\x57\x34\x34\x9e\x6f\x8c\xa2\xf4\xc1\xfb\x2d\x00\x56\xc0\
+\x99\x94\x1c\xb9\x25\x57\x67\xc3\x3d\x67\x9c\x23\x42\xe7\xc7\xbc\
+\x73\xa9\x48\xae\x44\x5a\x81\x56\x19\xf2\x86\xc6\x87\x7a\xe4\x19\
+\xc2\xce\x77\xd7\x91\xb8\xd2\x62\x53\xbd\xae\x4e\x9d\xe2\x4a\xd6\
+\x92\x05\x35\x9f\xf9\x1a\xa6\xbb\xa3\xdf\xdd\x23\x89\xeb\xea\xc0\
+\xd9\x2a\xb9\xa5\xdb\x0d\x19\xe1\x7e\x03\xaf\x4d\x2f\xd6\xf3\xfe\
+\x07\xd9\x6b\x19\x37\x09\x48\xf2\x32\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x04\x7a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x41\x49\x44\x41\x54\x78\xda\x95\x94\x7d\x4c\x55\x65\
+\x1c\xc7\xbf\xcf\xb9\xaf\xdc\xa0\x4b\x12\xa9\x0d\xbc\x66\x26\x63\
+\x97\xf8\xc3\x53\x46\xe0\x0a\xe7\x1c\x94\x2f\x49\x2a\x28\x82\x30\
+\x30\xe7\x68\x05\x2b\x91\x1a\x65\xf5\x07\xac\x65\xcd\xd6\x32\xa5\
+\xb9\x16\xd3\xb9\xf9\x92\xd6\x32\x37\x88\xb1\x21\x13\x06\x1d\x5f\
+\xa8\x78\xb9\x17\x14\x96\x17\x91\xdd\x6e\x70\xf5\x72\xef\xb9\x2f\
+\xe7\x3c\x3d\xe7\x72\xad\x1c\x70\x39\xfd\x76\x9e\x7b\x77\x9e\xf3\
+\xfc\x7e\x9f\xdf\xef\xf9\xbd\x10\xa8\x90\x57\x7f\x70\x08\xe0\x38\
+\x5e\xa3\xd5\x02\x84\xcc\x3c\x40\x29\x42\x21\x19\x54\x96\x21\x87\
+\x24\xe5\x35\x2c\x1a\x2d\x01\x51\x03\x78\xe5\xec\x2d\xc1\x3f\xe1\
+\xe2\x6f\x5f\xfc\x16\x44\xab\x83\x14\x10\x23\xc6\x42\x6c\x05\x21\
+\x05\x03\xb0\xae\xcf\x87\xfe\xa1\x38\xac\x78\x26\x1d\x8f\xc6\x68\
+\x10\xab\xd7\xe2\xbb\xab\x4e\x75\x80\x8d\xa7\x47\x84\xbb\xb6\x7e\
+\xbe\xb7\x7e\x23\x8c\x8b\x96\x61\xf5\x96\x5d\xd0\x19\x62\xf1\xd4\
+\xaa\x0c\x2c\xb7\xa6\xc1\x14\x6b\x82\xa4\xc0\x64\x0a\x59\x62\x60\
+\x50\x18\x35\x04\x5f\xb5\x3a\xd4\x01\x5e\x3a\x39\x2c\x4c\x0d\xd9\
+\xf8\xbe\x8f\x37\xc0\x5a\x7f\x09\x15\x5b\x9f\x87\x37\xe0\x67\x46\
+\x99\x31\x89\x5d\x09\xe8\x0c\x1d\x83\x96\x43\x63\x9b\x4a\x40\x4e\
+\xe3\x90\xe0\xb9\xd1\xcf\xdb\x0e\xe6\xe1\xc9\x9a\x0b\x28\x2d\x58\
+\x0d\xd1\x1f\x8c\xaa\xa3\x00\x4e\x5d\x1e\x55\x07\x58\x77\xcc\x26\
+\x4c\x0d\x0f\xf0\x83\x87\xb6\x20\xb9\xea\x1c\x8a\x0b\x5e\x84\xcf\
+\x1f\x9a\x17\xf0\x7d\x47\x94\x08\xdc\x0b\x16\x51\xf3\x5f\x77\xc2\
+\xdf\xb3\x1b\x06\x04\x71\xb8\x9f\xbf\xf1\x45\x3e\x16\xbf\x7e\x1a\
+\xf9\xdb\xb3\xe1\x9f\x27\x02\xbd\x56\x83\xa6\x8e\x5b\x51\x00\x29\
+\x56\x8a\xc9\x49\x98\xc7\x47\xc9\xca\x63\x37\xbb\xb4\xb6\x2b\xab\
+\x46\x0e\xef\x44\xe2\x6b\x27\xb0\xb9\x70\xed\xbc\x00\x1d\x8b\xe0\
+\x52\x34\xc0\x84\x35\x95\x9a\xf6\xef\x06\xa9\x3f\x0a\x6b\x75\x4b\
+\x53\x5c\x6f\x77\x8e\xe3\xeb\x9d\x78\xa4\xe4\x1b\x6c\x2a\xcc\x85\
+\x28\x06\xe6\x34\xce\x29\x8b\x01\x3a\xba\xfe\x00\x71\x65\x66\x52\
+\xee\xb1\x04\xb0\x1a\x63\xdb\x91\x6a\xe0\x18\xd7\xe9\x84\x31\xed\
+\x61\x18\xd6\x6d\x46\x53\xc3\x55\x54\xaf\x58\x8b\x3b\x8d\x65\x88\
+\xdf\x71\x04\xb9\x45\xeb\xe1\x17\x67\x8f\x40\x51\x55\xd2\x73\xdb\
+\x13\xc4\x3d\xfb\x38\x88\xe7\xc3\x7d\x54\xbf\x34\x9e\x35\x4e\xe4\
+\x84\xac\x40\x58\x07\x6a\x0d\x08\x9c\x39\x0e\x2e\xde\x8c\x98\x0d\
+\x5b\xd1\xff\xee\x61\x64\xb9\x46\x11\x9b\x77\x08\xb9\xbb\x36\xcd\
+\x88\x80\x28\x6e\xcb\x04\x2e\x5f\x08\x93\xa2\xcc\xba\x98\x83\x68\
+\x63\x55\x74\xb7\xb6\x8a\x72\xdd\xcd\xac\xaf\xb9\xe9\x00\x22\x8b\
+\x12\x45\x49\x03\xb0\x3a\x27\x71\xb1\x30\x6d\x2b\xc6\xf5\xb7\xeb\
+\xf1\xf2\x0b\xb5\x58\x53\x9e\x87\x90\xcf\x3f\x6d\x98\x9d\xd3\xb0\
+\x1f\xb7\x28\xc1\xc9\xbc\x56\x74\x89\xb2\xc9\x00\xb2\x02\x98\x78\
+\xa7\x92\xea\x84\x9f\x59\x6c\x9a\xc8\x0d\xd1\xe9\xff\xfb\x11\x29\
+\x83\x85\x75\x27\x67\xd2\x23\x26\xe5\x69\x1c\x68\xb9\x87\xeb\x9f\
+\x35\x00\x53\x3e\x18\x58\xb7\xba\x7d\x52\xd8\x6b\xe6\x47\x18\xf6\
+\x4f\x52\x59\x15\x71\x03\x23\x0c\xb0\xff\x0d\xaa\xeb\x6c\x52\xb2\
+\x12\x31\x18\x31\xaa\x3c\x4a\x5e\xa8\x92\x34\x02\x8d\x57\xc4\x11\
+\xbb\x13\x35\xb9\x75\xa8\xac\x29\x44\x52\xd0\x83\x2f\x7b\xbc\x30\
+\xe8\x34\x98\xb5\x54\x18\x40\xd7\x37\x0c\xe2\x4c\xb3\x4c\x67\x96\
+\x3c\x18\x81\x12\xa6\x51\xcf\xbc\x60\xc9\x21\x1e\x2f\x0e\xd2\x64\
+\x7c\xea\xea\x87\x94\x59\x8b\x4f\xea\xca\x90\x13\xb4\x23\xeb\x5c\
+\x08\x0b\x96\x2e\xfc\x37\x7f\xff\x11\xca\xae\xc8\xd8\x7b\x73\xee\
+\x32\xbd\x92\x90\x48\xad\x8b\xcd\x98\x74\xb9\xb1\x2f\xad\xdc\xdd\
+\x9e\x9c\x6a\x0e\x9c\xdd\x0b\x77\xd6\xfb\x48\xcc\xcd\x83\xd1\xeb\
+\x42\xc8\x9c\x10\x76\x60\x36\x51\x00\x31\xbf\x0e\x45\x07\x2c\x34\
+\xea\x91\x34\x3a\x4a\x96\x1c\xf8\xa5\xd5\x68\xef\x5c\x33\x75\xb1\
+\x06\xce\x8c\x1a\x58\xb6\x15\xb1\x91\x1d\x00\xa1\x74\x2e\x75\x50\
+\x56\x34\xa6\x1e\x5b\x74\x00\xef\x72\x86\xbf\x5b\xaa\xdb\xbb\xf5\
+\x23\xdd\xcf\x7a\x9b\xdf\xc3\xd8\xca\xb7\xf0\xc4\x8e\x52\x48\xa2\
+\x1f\xd1\x84\xb2\x1c\xc4\x5c\xeb\x9b\x1b\xd0\xa8\x37\x19\x4b\x02\
+\x2c\xb3\x4c\x96\xef\xbd\x20\xc8\xe3\x36\xde\xdf\xca\x00\xe9\x95\
+\xb0\x14\x95\x43\x56\x01\x30\x08\xbf\xa9\x9b\xa6\xcb\xca\xcf\x0b\
+\xb2\xd3\xce\x07\xdb\x3e\xc2\x98\xb5\x02\x4b\x4a\xf6\x40\xf6\xcd\
+\x0f\xd0\x77\xf5\xa8\x03\x58\x4a\xcf\xfc\x0e\xe7\xa0\x35\x74\xb9\
+\x0e\x63\x29\xbb\x91\x5c\x56\x31\x2f\x00\xac\x7c\xb9\xf6\x6b\xea\
+\x00\x49\xc5\xa7\xf6\xd0\x3f\x07\x93\x49\x67\x9d\xc7\x91\x5a\xfd\
+\xa6\xa5\xb4\xf0\x71\xc9\x17\x88\xa6\xe2\x61\xe3\xf4\x3c\xda\xba\
+\x87\x54\x01\x1e\x90\xec\xcf\x3b\x2d\x05\x39\x19\xd2\xcc\x71\xcd\
+\xba\x15\x3f\xb1\xf5\xa3\xa3\x2a\x7d\xe4\xfe\xe6\xff\x07\x3c\xf7\
+\x81\x60\x29\xd9\xce\xcb\xfe\x60\x33\xd3\x6e\x61\x85\x7a\x82\x19\
+\x1c\x9b\xeb\xf8\xdf\xec\xa5\xdd\x9e\x5e\xdc\x3f\xd9\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x77\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x3e\x49\x44\x41\x54\x78\xda\xad\x95\x7b\x50\x54\x75\
+\x14\xc7\xbf\xbb\x0b\x2c\xcb\xb2\xb0\xc6\xbe\x80\xe5\xa1\xe0\x9a\
+\x20\x90\xa6\xe5\x48\xe5\xe4\x6b\xa2\x29\x61\xca\xc6\x67\x93\x1a\
+\x56\x0a\x9a\xa6\x8e\x8f\xd0\x61\x9a\x98\x4c\xd4\x1e\xec\x62\x94\
+\x3d\xcc\x47\xfe\xe7\x03\x91\x6c\x24\xcd\xc0\x52\x30\x44\x25\xe5\
+\xb5\xa2\xbb\xc0\x82\xb0\x2c\x5c\x76\x97\xbd\x8f\xbd\xfd\xf6\x52\
+\xcc\xac\xe6\x88\x33\x9e\x99\xdf\xbd\x77\x7e\xe7\xfc\xce\xe7\xf7\
+\x3b\xe7\xfc\xce\x15\x61\x84\x72\xe0\x87\xc3\x7c\xa4\x4e\x83\x13\
+\xa5\xe5\x68\x68\x69\xc2\xe9\x9f\x4f\x88\x46\xb2\x6e\x44\x46\x3e\
+\x39\xf4\xe3\x11\x5e\xa7\x55\xe3\xd8\xf1\x32\x34\x9a\x9b\x1f\x3f\
+\xc0\x27\x07\xf7\x1f\xe1\x9b\x1b\x1b\x91\x5f\xb0\x7d\xc4\xeb\x1e\
+\x09\xb0\xaf\xb8\x84\xb7\xb5\x75\x20\xaf\x20\xff\xf1\x00\x9e\xfb\
+\xc9\x12\xaa\x55\x4a\x77\x4c\xd2\x05\x67\x84\x2b\x64\x63\x34\x52\
+\x09\x78\xb2\xc4\x4e\xf3\xe8\xec\x77\x9a\xaf\xd9\xdc\xe5\x9d\x0e\
+\xcf\xe6\xca\x85\x31\x03\x8f\x0c\x98\x7b\xac\xc3\xf8\xaa\x21\x34\
+\x67\x96\x3e\x18\x83\x2c\x70\xd7\xc5\xa1\x97\xe1\xc1\xf3\x80\x5a\
+\x2a\x82\x26\x44\x0c\xaf\x58\x8c\x33\x6d\x6e\x94\x37\x52\xa6\x93\
+\x59\x51\xb9\x23\x06\xac\xbb\xd0\x63\x7d\xdb\xa0\x88\xa6\x39\xa0\
+\xbe\x77\x10\xf1\x81\x2c\xd4\xc1\x3c\x82\x3c\xfd\x82\x9e\x96\x86\
+\xa1\xb9\xdb\x85\x9e\x00\x05\x26\x6a\xe4\x60\x78\x2f\xbe\xbd\xd9\
+\xdf\x56\xfc\x82\x5a\xff\x50\xc0\x07\x95\x5d\x96\x35\xa9\xa3\xf4\
+\x95\xed\x1e\x44\x05\xd0\x98\x1a\x19\x38\xac\xb3\x75\x76\x63\xe1\
+\xbc\x37\x50\x5a\x5e\x06\xb7\xcb\x2d\xcc\x9d\xef\x02\xc2\x54\x2a\
+\x8c\x55\xca\x50\x54\xd7\x63\xdd\x3b\x43\x13\xf3\x40\x40\xc6\x91\
+\xd6\xa2\xc2\x59\x51\xb9\x55\x1d\x6e\xa4\x47\x88\x31\x5e\x35\xe4\
+\x7c\xf9\xb2\x15\xf8\xc2\xf4\x25\x28\xca\xe9\xb7\x99\x79\x99\x59\
+\x38\x5a\x7a\x0c\x67\x1b\xed\x10\x47\xc7\x23\x4e\x11\x84\x8f\xcf\
+\xd9\x8c\xa7\x16\xc6\xaf\xbe\x0f\xf0\xd4\x9e\xeb\xa1\xab\x33\x62\
+\xa9\x38\x79\x10\x82\x18\x0f\x26\xeb\xc4\x90\x48\x02\x41\xb3\x2c\
+\x38\x32\x58\x61\x78\xc1\x71\x43\xdf\xc2\x52\xb1\x08\x25\x45\x26\
+\x2c\x5a\xbc\x00\x17\x1d\x32\xa4\x18\xe2\x70\xea\x36\x85\xe3\x55\
+\x36\x45\xed\xfa\x09\x03\x7e\x80\x99\xdf\x37\x19\x8d\x59\xf1\x39\
+\x65\x4d\x0e\xac\x9f\xa2\xc2\xf6\xad\x5b\xb0\x61\xcb\x56\x41\xe7\
+\x03\x70\x1c\x37\x0c\xe0\x49\xa6\x39\x32\xf6\xec\xd8\x89\x55\x6b\
+\xdf\xc7\x5b\x0b\x16\x60\xf7\xae\x9d\xb8\x20\x4d\xc6\x0c\xc3\x13\
+\xd8\x70\xdc\x6c\x3a\x97\x3d\x2e\xd7\x0f\xb0\xf4\xa4\xb5\x25\x73\
+\x42\xc4\x98\x00\x8a\xc2\x2b\x13\x54\x42\xb5\x50\x03\x03\xf7\x00\
+\xc8\x24\xbc\xf0\x3d\xd7\xad\x5a\x8d\x82\xdd\x9f\x82\xa1\x59\xc1\
+\xc6\xcb\x32\xa8\x68\x17\x21\x35\x39\x01\x5f\x57\x77\x9a\x0f\x67\
+\xc5\x26\xf8\x01\xd6\x9c\xe9\xe0\xbb\x39\x11\x76\x3d\x13\x8e\x48\
+\x65\x30\x71\xc6\x81\x66\x68\xc1\x31\x47\x16\x7b\xbd\x3c\xa4\xd2\
+\x10\xb4\x77\xb4\x21\x7f\xdb\x36\x6c\xdc\xb4\x09\x61\xe1\xe1\xc4\
+\x86\x81\x8f\xe8\x03\x54\xb7\x3a\x50\x1f\x6e\x40\x9d\xc5\x89\x5f\
+\x16\xc5\x8b\xfc\x00\x79\xbf\x77\xf2\x57\xba\x59\xe4\xa8\x7b\x90\
+\x9e\x36\x7a\x38\x91\x0c\x71\xe0\x0b\x8d\x5c\x1e\x82\xe9\xe9\xe9\
+\x68\x6d\x6d\x45\xc5\x6f\xe7\x11\x22\x97\xa3\xbf\x8f\x22\x3a\x66\
+\xd8\xf6\xd0\xe9\x6a\x38\xa7\xbe\x8e\x40\x2f\x8b\x92\x97\xa2\xfc\
+\x01\x6f\x96\x5a\xf9\x60\x92\xe0\x6c\x1d\x8d\xe2\x82\x2d\x30\x96\
+\xec\x15\xe6\x3d\xb4\x87\x3c\xc5\x68\xb7\x5a\x91\x9a\x9a\x82\x27\
+\x13\x12\x71\xfa\xec\x39\xd8\xed\x76\x78\x7c\x27\x64\x38\xc1\x6e\
+\x7e\xd6\x5c\x2c\xfd\xf0\x73\xdc\x4e\x9a\x4d\x74\x03\x28\x9b\x7f\
+\xcf\x09\x66\x1f\x34\xf3\xa3\xa3\x14\xd8\x96\x22\x83\x5e\x25\x27\
+\xa1\xf1\xc2\xe5\x76\x09\x16\x96\x3b\x56\x24\x27\x8d\x47\x4d\x4d\
+\x2d\xa2\xf5\x51\xe8\xed\x75\xc0\xe3\xf1\x08\xe1\x61\x68\x72\x42\
+\x62\x2b\x16\x7b\x71\xe5\x16\x85\xbf\x74\x53\xd0\xd0\xdc\x83\x3f\
+\x56\x8e\xf3\x07\x4c\x2b\xfe\xbb\x25\x2d\x45\x3b\x26\x33\x8c\xc6\
+\xe4\xc8\xa1\x69\x96\xec\xdc\x27\x3a\x8d\x06\x57\xea\xae\x42\xad\
+\xd6\xc0\xe9\x1c\x00\x4d\x9c\xfa\x42\x27\xc4\xdf\x67\x47\x42\xe8\
+\x76\xf5\xe1\x52\xa7\x1c\x0d\x5a\x03\xae\x5f\x6d\x37\x5f\x5e\x97\
+\xe2\x9f\xe4\xa4\xcd\x55\x46\xfd\xb4\xc4\x9c\x25\x51\xc0\x8b\x1a\
+\x1a\x79\xa4\x44\x4b\xbe\xdb\x27\xe8\x1c\x7d\x7d\xc2\xdb\xed\x1a\
+\x24\xce\x3d\xc4\x39\x3b\x0c\x90\x88\x25\xc8\x59\x91\x8d\x8f\x0a\
+\x77\xa3\x39\x70\x34\xf6\x77\x48\xd0\x5f\x63\x36\xdd\x2c\x7c\xde\
+\xbf\x4c\x13\xde\x29\x0f\x0d\x4f\x89\xa3\x66\x4e\x52\x61\x4e\x28\
+\x87\x59\xa4\x54\xdd\xf4\xd0\x0e\xed\x76\xc7\xbf\x3b\xe5\x88\x63\
+\x5a\x38\x81\x4f\x06\x49\x98\x58\xf2\x7d\xe3\x6a\x1d\xba\x14\x49\
+\xb8\x13\x39\x16\x15\xb5\x5d\xa0\xeb\x5b\x15\x2d\xdf\xbc\xec\x7f\
+\xd1\x7c\x62\x58\xfb\x6b\xd1\xa8\xa9\x89\xb9\x8b\xe3\xa5\x78\x36\
+\x8c\xc3\xa4\x04\x25\x18\x2f\xb0\x32\xfb\x5d\x7c\xb2\xab\x50\xb0\
+\x71\x3a\x9d\x10\x89\xc4\xa4\x6d\x50\x78\x6f\xf9\x72\xec\x25\xc5\
+\xf0\xa7\x85\x9c\x2a\x66\x3c\x8a\xaf\xf7\x83\xae\x69\x32\xdd\x32\
+\xcd\x19\xee\xac\xf7\x35\xbb\xc4\xbc\x8b\x16\xed\xc4\x18\xfd\xe2\
+\xd8\x00\xa8\x19\x8a\xdc\x4c\x25\x71\x48\x92\x28\x09\x10\xf4\x69\
+\x49\xc9\xa8\xba\x54\x8d\xe6\x86\x9b\xb8\x4b\xca\xb4\x99\xd1\x62\
+\x54\xe2\x58\x18\x1b\x5d\xe8\xaf\xb5\xb4\xdd\xd9\x99\xee\xd7\x51\
+\xff\xb7\x5d\xeb\x37\x56\x59\x23\xd2\x62\xa2\x97\xa5\x28\x40\xd9\
+\x1c\x50\x8b\x3c\x88\x57\x90\x64\xcb\x68\x41\x7f\xa3\x8b\x86\x85\
+\x22\x21\x0a\x55\x41\xae\x53\xe2\xab\xcb\x76\x50\xd7\x2c\x6d\xb6\
+\xcf\xa6\x3f\xbc\x5d\xff\x27\xda\xa5\x27\x8c\x8c\x4e\x9b\x93\x3a\
+\x2d\x16\x19\x71\x32\xc4\x04\x91\x76\x4d\x31\x42\x9b\xd0\x29\xa4\
+\xb8\x45\x7b\x51\xd6\xea\x42\x7d\xe5\x6d\x48\x6d\x5d\xa6\xbb\x07\
+\x32\x47\xfe\xc3\x19\x86\xbc\x76\x40\xc6\xc8\x42\xf3\xd9\x08\xe5\
+\x4c\x56\x1c\xf8\xb4\x94\xb4\x10\x91\x88\xc7\x20\xf9\x09\x49\x58\
+\xee\x72\x60\x8f\xbd\x22\x60\xd0\x95\xdf\x75\x74\x89\xfb\x41\x3e\
+\xfe\x01\x49\xf0\x76\x37\x84\xa8\xca\x66\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xcc\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x93\x49\x44\x41\x54\x78\xda\x95\x56\x7b\x4c\x53\x57\
+\x18\xff\x9d\x7b\xfb\xa2\xa5\x52\x11\xb0\x88\x02\x2a\x50\x45\x19\
+\x9a\xa9\x63\x32\x9c\xcc\x85\xbd\x13\x5d\x16\xb3\x98\x19\xc5\x6d\
+\xc6\x3f\xc6\x7c\x10\x75\x8b\x2e\x46\xe7\xd4\xf8\x9c\xcb\x96\xcc\
+\x6d\x6e\x51\x34\xcb\x32\x75\x2e\x06\x99\x13\xdc\x14\x69\x98\x32\
+\x19\x08\x48\x51\x79\xf8\x28\xc8\x28\xa0\xf2\x2a\xf4\xf6\xec\xbb\
+\xa7\x2d\xd4\x44\x33\x3d\x4d\x7b\xda\xfb\x7d\xe7\xfc\xbe\xdf\xf7\
+\x2c\x03\xad\x5d\x97\x56\x9f\xd7\xeb\x58\xba\xcc\x39\x20\x49\x80\
+\xba\x33\x0e\xb1\xfc\x9b\x02\x06\x99\x76\x89\xf9\x7e\x7b\xb9\xfa\
+\x56\x7c\x3f\x18\x49\x02\xdf\x55\x99\x17\xe8\x19\x60\xf6\xb5\xd3\
+\x76\xa6\xb3\xcd\x17\x72\x1c\xb6\x08\x63\x92\xd5\x28\x41\x61\x92\
+\x4f\xaa\x5e\xc2\x25\xdf\xd9\xc0\x85\xf4\xd2\xd0\xed\x75\x77\x7a\
+\x61\xd0\x30\x8c\x0e\x37\x40\xf1\xfa\xf0\xb9\x97\xd1\xce\x07\x01\
+\x54\x23\x5a\xbb\x3d\xa8\xef\x50\xec\xec\xf3\x7f\x72\xf9\xd4\x68\
+\x3d\x06\x14\x2e\x0c\x1f\x52\x13\xd7\x43\xa1\x87\x2a\x86\x46\x96\
+\x50\x75\xbb\x1b\xdd\xed\x61\x74\x21\x87\x6e\xb8\x0b\x4f\xc7\x86\
+\xa1\xdf\xe3\x21\xa9\x4c\xf0\x3e\xfd\xc0\xd2\x10\xa9\xaa\x66\x37\
+\xd8\xde\x4b\xb9\x7c\x52\xb4\x01\x1e\xc5\x3b\x28\xe4\x7e\x55\x2e\
+\x68\xab\x87\x19\x1d\x60\x28\xac\x6c\xc1\xba\xf4\x5d\x08\x33\x85\
+\x61\x51\x5e\x36\xe6\xce\x8a\x82\x5e\xab\x21\xd2\x01\xcb\x14\xbf\
+\xbb\xe8\x14\xe9\x5f\x69\xe9\x03\xdb\x53\xb6\x8a\x4f\x54\x01\xbc\
+\x3c\x08\x5f\x22\x1d\xaf\x60\x14\x58\x5a\x3a\x70\xaa\xf2\x36\xd6\
+\xa4\x6d\x83\xd5\x62\x45\xde\xc5\x03\xe8\xd4\x96\x63\x5c\x78\x88\
+\x60\x89\xa0\xb3\x82\x0b\xf9\xc9\xd1\xd2\x0b\xb6\xf3\xc2\x4a\x9e\
+\x3c\x8a\x94\xfc\x00\x5e\xaf\x12\x14\x5b\xf6\x00\x40\x61\x75\x33\
+\x56\xcf\xd8\x0a\xeb\xf0\x68\x9c\x73\x14\xa1\xc4\x75\x04\x93\xc6\
+\x58\xc4\x59\x04\xf1\x27\x6f\x8b\x78\xd5\x3a\xfb\xc1\xb6\x95\x2e\
+\xe7\x93\x47\xa9\x01\x93\xfc\xc1\xc4\xe0\xce\x82\x58\x18\x74\x0c\
+\x3f\x17\x37\x60\xdf\xdc\x03\xd0\xe9\xf5\x38\x44\x0c\xee\x30\x62\
+\x10\x65\x12\x79\xe1\xbb\x5a\x35\x92\x09\xe3\x28\x64\xa8\xa1\x98\
+\xb1\x2d\x76\x02\x18\x6d\x12\x56\x78\x78\x20\x19\x85\x1d\xaa\xe7\
+\x45\x1c\x64\xca\x9a\x6b\x94\x3d\x9a\xde\x08\xac\xcc\x58\x2f\xe4\
+\x8b\xf3\x16\xe2\xa5\x99\xd1\xd0\xc9\x5a\xa1\x23\x48\xa8\xfe\x87\
+\x47\xc8\x65\x59\x83\xda\x26\x02\xd8\x5c\xbc\x9c\x27\xc7\x11\x03\
+\x45\x0a\xca\x1d\x88\xbc\xe6\x04\x20\x31\x05\xdd\x1e\x2f\xca\x6a\
+\xda\xb0\xfb\x95\xfd\x90\xb5\x0c\x2d\x2e\x27\xb6\xda\x3f\xc2\xec\
+\xa9\xb1\x18\xf0\xf0\xa1\x64\xe0\x3e\xa3\x54\xf3\x18\xf3\xc2\x71\
+\x83\x62\xb0\xe9\xec\x87\x3c\x39\x3e\x94\x00\x78\x90\x83\x7c\xca\
+\x12\xd5\x85\x56\xa3\xc5\x1f\x15\x0d\xc8\x99\xb6\x1e\x89\xd6\x24\
+\x21\xed\xec\x6a\xc7\xd2\x23\xd9\x98\x3a\x71\x34\xcc\x06\x99\x7c\
+\xee\x2b\x34\x46\x45\x63\xd4\x1a\x60\x0a\x21\x47\x49\xc4\xa0\xe1\
+\x1e\xd8\x86\x33\x39\x7c\xe2\x58\x93\x28\x2c\x85\x0f\xf8\x72\x98\
+\xe9\xa0\x97\xf5\x68\xed\xaf\xc7\xf1\x8b\x57\x91\x9d\xbc\x04\x6f\
+\xa5\x2e\x79\xa0\x42\x9a\x3b\x9c\xa8\x6e\xae\x14\x3e\x57\xb9\xaa\
+\xc1\xd2\xc9\x3a\x1c\xfe\xeb\x27\x24\xa7\x98\x11\x13\x6e\x44\xe5\
+\xd5\xbb\x60\x9f\x14\xe5\xf0\x14\x02\x68\xed\x52\x60\x91\x63\xd0\
+\xd3\xef\x46\xd3\xfd\x06\x9c\x6b\x3c\x0f\x67\x47\x07\x32\x63\xd3\
+\xf0\xed\xdc\x23\x78\xdc\xd5\x79\xbf\x13\x6b\xf2\x57\x60\xce\xb3\
+\x71\xa8\x70\xb8\x88\x41\xe1\x72\x9e\x92\x60\x46\x7e\xd3\x19\x6c\
+\x9f\xf2\x0b\x22\x86\x45\x09\xc5\xa3\x35\xdf\x60\xe9\x89\x5c\xb8\
+\x72\xef\xa9\x94\x1e\x7a\x59\xe5\xcd\x4b\xc2\x6a\xb5\x9f\xa8\x19\
+\xd4\x3d\x70\x1f\xab\x0e\x7f\x8c\xc8\xf1\x0c\xf3\xd3\x32\x50\x5d\
+\x47\x2e\xca\x3e\x36\x8f\x7b\xc6\xd4\x52\x1b\xb8\x8b\x93\xcf\x97\
+\x50\x11\xc5\x8b\xc3\x87\x2a\xf7\xe2\x60\x45\x1e\x7e\x5f\x58\xf6\
+\x48\x6b\x13\x37\x8c\x47\xa8\x9e\xe2\x47\x81\x46\xbf\x02\x8d\x4e\
+\x8f\xf2\x72\x07\x32\xdf\x8b\x45\x64\xa4\x04\x7d\x63\x22\x98\x6d\
+\x47\x02\x9f\x96\x19\x8a\x3a\xa7\x0b\x27\x32\x8a\x31\xd2\x12\x27\
+\x0e\xff\x50\xbe\x0b\xa5\xcd\x76\xec\x7b\xf5\xe8\x63\xbb\x47\x5d\
+\xd7\x5a\xab\xf1\xdc\x8e\x2c\xcc\x5e\x30\x12\x7f\x17\x74\x81\x4d\
+\xd8\x6a\xe3\xd3\xb3\x8c\xb8\x72\xdb\x85\xfc\x8c\xb3\x88\xf2\x33\
+\xd8\x5f\xbe\x03\x9d\xee\x0e\xe4\xa6\x6d\x79\x22\x80\x77\x0f\x2e\
+\x46\x51\x43\x31\xa6\xbf\x11\x86\xaa\xdf\xa8\x0e\x26\x7c\x96\xc4\
+\x53\xb3\x4c\xb8\xee\xfc\x17\xf9\xb3\x8a\x07\x01\x0e\x56\xec\xc1\
+\x71\xc7\xaf\x38\x36\xff\xcf\x47\x5e\xa6\x59\x46\x19\xd4\x06\xd1\
+\xe3\x44\x86\x53\x29\x99\x87\x45\xe2\xc5\x65\x31\x60\x54\x2f\x35\
+\x05\x3d\x04\xf0\xa9\x8d\x3f\xf5\xb2\x11\xf5\x02\xe0\x3c\x01\xf8\
+\x5c\x94\x47\x31\xd8\x5d\xba\x07\xe5\x4b\x1b\x9f\x88\xc1\xb8\x0f\
+\x12\x91\xf8\xa6\x09\x21\x06\x09\x35\x85\x04\x60\xdb\x64\xe3\x93\
+\x09\xa0\xb1\xd9\x85\x93\xb3\x86\x5c\x74\xf8\xf2\x17\x58\x91\xbf\
+\x0e\xf5\x39\x37\x61\x36\x59\x1e\x7a\xd9\xad\xf6\x1b\xe8\x1d\xe8\
+\x16\x43\x89\x91\xf9\xfd\xbc\x0f\x19\x6b\x5e\xc3\x94\x77\x46\xc0\
+\x18\x2a\xa3\x56\x75\x51\xe2\x86\x24\x9e\xf2\x7a\x28\x9a\x28\xc8\
+\xa7\x33\x4b\x31\xdc\x6c\xf5\xa5\x69\xf5\xd7\xc8\x2d\xda\x84\x45\
+\x29\xf3\xb0\x31\xf3\xab\x87\x02\xd8\x36\x26\xa0\xae\xea\xba\x7f\
+\xac\xa9\x2e\x0a\xc1\xe4\xd9\xb1\x88\x4b\x35\x8a\x7e\x53\x7b\x8a\
+\x00\x12\x08\x60\x52\x56\x28\xf5\x97\x2e\x64\xc7\xbe\x0d\xab\x3e\
+\x86\x74\x25\x14\x5c\x3f\x85\x0a\x77\x35\x6e\x39\xda\x70\x6c\xc1\
+\x8f\x98\x11\x37\xe7\x7f\xdd\xf3\x9d\xfd\x4b\x6c\xb7\xef\xc6\xf8\
+\x67\x2c\x62\xb4\x3b\x0a\x08\x20\x7e\x6d\x02\x4f\x9d\x67\x46\x2f\
+\x55\x72\x57\x9f\x9b\x7a\x12\x75\x46\xea\x4b\xb2\xa2\x87\xc1\x24\
+\x8b\xe6\x76\xb5\xac\x0d\x16\xc9\x8c\x71\x91\xb1\xe8\x75\x7b\xc0\
+\xa9\x61\x2a\x03\xd4\x6f\xa9\x09\x7a\xa9\x45\x70\x85\x8b\x2e\xdc\
+\xec\x6c\x45\x78\xba\x04\xcb\x28\x2d\xb4\xd4\xde\x2f\x1f\xa5\x42\
+\xb3\xbe\x3f\xb6\x24\xfe\x85\xd0\x99\x11\xf1\x5a\x31\xfa\x02\xe3\
+\x52\x0c\x7b\xff\x24\x54\xbb\xb0\x2a\xeb\xb9\xe7\x11\xf3\x58\x55\
+\x60\x5e\x7f\x75\x73\x31\x35\xc4\x33\x75\x6e\x1b\x2d\x64\x14\xf5\
+\xb5\xd6\x06\x37\x1a\x4f\x77\xd9\x85\x96\x75\x49\x7c\x89\x7e\x84\
+\x3c\x53\xd6\x4a\xe2\xdf\x07\x93\x1f\xa4\x2e\x9e\xa9\xed\x42\x8c\
+\x2a\x7f\x5a\x06\x64\xc2\xa0\xa1\x4f\xf5\xc3\x4b\x95\xed\x6e\xf7\
+\xd8\x5b\xbe\x6f\x4c\xff\x0f\xb4\x32\x67\x70\x21\x23\x78\xfe\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xba\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x81\x49\x44\x41\x54\x78\xda\xa5\x95\x7d\x4c\x1b\x65\
+\x1c\xc7\xbf\x77\xd7\x17\x28\xa3\x80\x14\x18\x63\x30\x18\x63\x03\
+\x81\x19\x1c\x3a\x24\x5b\x32\x82\x2f\xd3\x08\xd9\x0c\x05\xfd\x03\
+\x93\x45\x63\x26\x66\x26\xd3\x18\xcd\xfe\x71\x26\x98\x19\x63\xa2\
+\x89\x63\xcb\xa2\x64\xbe\x2d\x3a\x0a\xcb\x16\x71\x8c\x39\x9c\x46\
+\x17\xc8\x16\x19\xce\x01\xca\x66\x61\x54\x68\x29\x6b\x29\x6d\x29\
+\x6d\xef\xae\x8f\xbf\xbb\x32\x1d\x8a\x0a\xec\x49\x7b\xe9\xdd\xf3\
+\xdc\xe7\xfb\xf4\xfb\x7b\x79\x38\x2c\x61\xcc\xde\x95\x29\xb0\x50\
+\xb8\x1e\xa2\xf4\x14\xc2\xd2\xc3\x42\x59\x31\x20\x47\x00\x9e\x47\
+\xc4\xe1\x04\xb3\xbb\x7b\x99\x5e\x7b\x3c\xce\x67\x7f\xfb\xd6\x3b\
+\xdc\xa2\xc0\xc9\x99\x3a\x16\x08\x7e\xc2\x25\x1b\xeb\xb4\xe6\xed\
+\x10\x1e\xda\x0a\x24\x0a\x80\xd3\x0e\x84\x44\xa2\x44\x45\x98\x3f\
+\x08\xa9\xd7\x06\xf1\xb0\x05\xcc\x68\x28\x5a\xe1\xb2\xf5\xff\xaf\
+\xc0\xac\x31\xfd\x05\x7a\xfd\xa0\xfe\xc5\x7a\x08\x35\x95\x40\x6f\
+\x0f\xe4\xa1\x3e\x9a\x08\xcd\x6d\x8f\x2e\x8c\x45\xbf\x3c\x07\x5e\
+\xc7\x83\x4b\xc9\x81\x6d\xdf\x31\x24\x25\xc6\x97\xfd\xa7\x40\xc0\
+\x90\x7a\x9e\x2b\xc8\xde\x16\x73\xf4\x2d\xe0\x4a\x37\xe4\xbe\x1e\
+\x40\x92\x09\xa4\x99\x5b\xc1\xd4\x8f\x0a\x8f\x30\xe2\x13\x9c\x67\
+\x68\x7f\xaf\x13\x29\x59\x49\xc8\xf7\x68\xa5\x7f\x15\xf0\xeb\x92\
+\x27\xb4\x8f\x96\xa7\xea\x1a\x5f\x82\xdc\x72\x04\xf0\x78\x00\x61\
+\x0e\x1c\x99\x83\x2a\x3f\xe6\x04\x78\x8e\x11\x5c\x83\xf6\xf7\x3b\
+\xb1\x72\xb5\x09\xa5\xbb\xca\x31\xf5\xd1\xe5\x85\x63\xe0\xd5\x9b\
+\x26\x74\xb5\xdb\x53\xf5\xbb\x77\x42\xfe\x9c\xe0\x8c\xa7\x5d\x0b\
+\xea\x8e\x39\x21\x6a\x09\x93\xa5\xa8\x86\x02\x57\x42\x20\xf0\x68\
+\x3f\xf4\x0d\x56\xa6\x27\xa2\xb4\x7e\x33\x3c\xa7\x7f\x43\x70\xc4\
+\xd3\xfc\x0f\x01\x4f\x6c\xca\xa4\xb6\xb2\xcc\x64\x78\xf5\xe9\xbf\
+\xe0\xf4\x32\xb8\xa8\x1d\x81\x5e\x87\xba\x71\xc3\xc6\x54\xf5\x9e\
+\x83\x4c\xf1\x15\xf0\xd5\x91\xef\x90\xb6\x2a\x01\xa5\x4f\x96\xc2\
+\x7d\x66\x18\x81\x91\x29\x4b\x66\x60\xa2\x76\x9e\x80\x2b\x2e\xad\
+\x49\xb7\x29\xbf\x61\xc5\x9b\x7b\x20\x7f\x76\x08\x8c\xa3\xe9\x08\
+\x07\x8e\xbc\x95\x67\x42\x98\xee\xb8\x0e\x39\x24\xbf\x4c\x4f\x8b\
+\xb8\x38\xed\xae\xe4\xea\x75\x10\x22\xb4\xf3\x66\x05\x9e\x88\xfb\
+\x6a\x4b\xe1\x3a\x3b\x0c\xff\x88\xc7\x92\x4d\xf0\x79\x69\x7a\x33\
+\x31\xa3\x10\x1a\xcd\xd5\xe4\xb6\x77\x21\xb7\x7d\x4c\x29\xe7\x55\
+\x67\x39\x12\x61\x94\x1d\x93\xc7\x06\x00\x2d\x67\x5e\xe5\x19\x6f\
+\x55\xd6\x8f\x1a\xd2\x5a\x0c\xc5\x59\xe6\xee\x4b\x7d\x28\x2a\xc9\
+\x42\xf6\xbd\x6b\x60\x3b\x35\x04\xc9\x2f\x5a\xd6\xce\xc1\xe7\x09\
+\xd8\xb9\x78\x29\xe5\x68\xa3\x00\xdb\x55\xb0\x5f\xfa\x01\x8d\x56\
+\x85\x2b\x2b\x9c\xe4\xa7\x14\x10\x6b\xb3\x7c\x0e\xcb\xed\xff\xf8\
+\x5a\x9c\xc9\x12\xd4\xa0\xa6\xa0\x32\x17\x63\xdf\x8f\x21\x3c\x1b\
+\x6e\xcd\xf3\x3b\xcd\xb7\xaf\x51\x05\x7e\x8f\x35\xed\x37\x54\x6c\
+\x7e\x3d\xe9\xb9\x2a\x48\x9f\x7e\x08\xa6\x8f\x21\xdf\xa1\xda\x33\
+\xf1\xf5\x30\xa4\x59\xc9\x9c\xe3\x73\xb4\x2e\x94\x10\xd7\x8d\xe9\
+\x7b\x25\x51\xdc\x4d\xc1\x6f\xdb\xe0\x9f\xdc\xf7\xf7\x79\x55\xc0\
+\x8a\x38\x96\xd3\xfe\x01\xa4\xe3\x87\xc1\x42\x92\xfa\x98\xd7\xf0\
+\x98\xfa\xc9\x8e\xe9\x61\x5f\xcb\xba\x80\xb3\x6e\x31\x15\xbf\xd0\
+\xe0\xac\xb1\xc9\xd5\xf1\x15\xf7\x9f\x32\xed\x2c\x87\xf8\xe5\x09\
+\xf2\x99\xac\x61\x94\x1b\x54\x50\xd6\x0e\xab\xf7\x6e\xd1\x9d\xb0\
+\x5c\xb8\x2a\x70\x8d\x37\x7e\x91\x71\x60\x6f\x9d\xae\xff\x02\xe4\
+\x29\xb7\x12\x55\xd5\xfb\xa0\x27\x88\x1b\x3d\xe3\x3f\x14\x87\xdc\
+\x5b\xef\x48\xe0\x67\xe8\xbd\x45\x1d\xcd\xf1\xa1\x77\x1a\xc1\xc5\
+\xc4\x46\xab\x94\x2e\x02\x35\xaf\x5f\x2f\x50\xe0\x42\xd2\xc1\x92\
+\x59\xf7\x9e\xe5\x5b\x54\x54\xc2\x72\x9e\x79\x0c\xe1\x93\x6d\x64\
+\x8f\x8e\xda\x2f\xd4\xea\x54\x82\xa3\x14\xed\xa8\x43\x86\xc3\x6a\
+\x1b\x78\x20\xe4\x2b\x5c\x96\xc0\x50\xfe\x46\x96\x57\xb3\x05\xe1\
+\xae\x2e\x35\x35\x6f\x95\x3f\x47\x42\x3a\xba\xff\xb1\xff\x06\x9c\
+\xd3\x01\x18\x05\x3d\xb6\x88\xde\x45\xb5\xf7\x79\x02\x83\x05\xf7\
+\xb0\xfc\x1d\xe5\x08\x76\x9e\x03\x47\x40\xc5\x22\x8e\x04\xb4\x1a\
+\x01\x97\x06\x6d\x70\xfa\x02\x78\xbc\x34\x0f\x83\xd6\x49\x8c\x4f\
+\x07\xca\x1f\x94\x66\xba\x97\x24\x70\x1e\xbc\x7f\xdb\x2b\xcf\xc7\
+\x05\x4f\x77\x46\x05\x14\x38\xf9\x3f\xec\x70\x61\xc0\xe1\x46\x55\
+\x61\xae\xda\x73\xce\x0c\x8e\x52\xc7\xe4\x8c\x8f\x44\x66\x7c\x4b\
+\x12\x38\x0b\x5d\xd3\xa6\xda\x1d\x0d\xf1\x57\x2e\x52\xef\xd1\x42\
+\x43\x19\x34\x36\xe5\xc5\x65\xbb\x0b\x55\xeb\xb3\x55\xf8\xb7\xd6\
+\x31\xf8\x65\xb1\xae\x1a\x62\xcb\x92\x2d\xea\xe4\x63\x0b\x84\x84\
+\x84\x81\x8a\xb5\x19\x60\x1e\x2f\xec\xd3\x3e\xf4\xde\x24\x78\xee\
+\x1a\x3a\x5c\x80\x2e\xdb\x18\x7c\x91\xb0\xf9\x09\xc8\xad\x4b\x85\
+\xab\x02\xca\xa5\x0d\x7c\xd3\xfa\xbc\x0d\x0d\x26\x97\x0b\x17\xdd\
+\x64\x4b\x7a\x96\x1a\x8b\x2e\x3a\x73\xfd\x2c\xfc\x06\x9d\x0a\xfb\
+\x97\x03\xff\x53\x40\x19\x27\xc0\x5b\x78\xf0\x35\xd5\x69\xab\xa9\
+\xd0\x04\x9c\x9b\x18\x57\xe0\xad\x04\x37\x2f\x17\x3e\x4f\x40\x19\
+\x27\xa1\x39\x40\xa7\xea\x6b\x3a\xea\x74\xb3\x10\x9b\x09\xfe\xec\
+\x9d\xc0\x95\xf1\x07\x24\xaa\xe2\x70\x23\xf1\xe9\xc0\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xf9\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xc0\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x50\x54\x65\
+\x18\x7e\xce\x39\x7b\xf6\x06\xc8\x72\x11\x21\x40\x40\xbc\x80\xa0\
+\x80\xb2\xa0\x84\x82\x36\x85\x8d\x63\x33\x5e\x12\xcb\x41\xc9\x0c\
+\x0d\xed\x36\x39\x65\x56\x33\x4e\x33\x5d\xa6\xa9\x98\xd1\x40\xd2\
+\xd1\x50\x87\x02\xd1\x4c\xb1\x99\xd0\x2c\x4c\x44\x01\x65\x41\x33\
+\xf0\x06\x2b\xab\x72\x87\x05\xf6\xc2\xee\xd9\x73\x4e\xdf\x59\x2e\
+\x0a\x42\xbc\x3f\x76\x76\xcf\xf7\xbd\xcf\xf3\x7e\xcf\xf9\xde\xe7\
+\x5d\x0a\xff\x13\xde\x2b\x7f\x4c\x12\x1c\xc2\x3a\x5e\x10\x52\x04\
+\x51\x0c\x51\xb9\xaa\x9c\xcf\xad\x26\x2b\x68\x8a\x6a\x64\x68\xba\
+\x84\x96\xd1\x05\x1d\x27\x5f\xbb\x30\x1e\x06\x35\xd6\xc3\x29\xab\
+\x8f\x44\xd9\x6d\x5c\x95\xbb\xaf\x86\x0d\x09\xf3\x43\x70\x90\x06\
+\x1e\xee\x6a\x28\x14\xac\x73\xdd\x66\xe3\xd0\xdd\x63\x81\xfe\xbe\
+\x11\x8d\xf5\xcd\xe8\x69\x31\x72\x72\x05\xab\x6d\x3d\xb1\xa1\x76\
+\x42\x02\xdf\xb5\x87\xb3\x29\x30\x99\x09\xcf\x47\x62\x7a\xa8\x27\
+\xe4\x6a\x16\xb4\x48\x41\x10\xc4\x11\xfb\x68\x9a\x3c\xa3\x44\xd8\
+\x2d\x1c\xee\xde\xeb\x42\xf9\xb9\x7f\x20\x82\xcf\x69\x39\xb6\x71\
+\xdb\xb8\x04\xbe\x2f\xe7\x17\x6a\xfc\xdc\xd7\xa6\xa4\x84\xc3\x6b\
+\xb2\x0b\x40\x80\x49\x96\x73\x13\x3d\xaa\x14\x89\x4f\x1c\x42\x20\
+\x44\x9d\xed\x66\x94\x94\xd4\xc1\xd8\xdc\x73\xac\xa5\x68\x7d\xea\
+\x53\x04\x81\xeb\x0b\xb3\xdd\x26\xbb\x64\xa6\xae\x8c\x86\xda\x55\
+\x01\x91\x17\x61\x23\x28\x46\x9b\x03\x9d\x56\x01\x26\x4e\x80\xc0\
+\x0f\x56\xcf\x00\xae\x2c\x0d\x2f\x15\x0d\x8d\x42\x06\x05\x61\xa7\
+\x18\x0a\x16\x93\x0d\x85\x27\x6b\xd0\xd7\x6e\xce\x31\xe4\xa7\x6e\
+\x1b\x26\x98\xf6\xfa\x89\x28\x07\x2f\xd4\xa4\xa7\xc5\xc1\xc7\xc3\
+\x0d\x16\x87\x03\x0f\x7a\x39\xb4\x11\x60\x86\xa2\x06\xaa\xa7\x9c\
+\x85\x3a\x0f\x05\xf1\xf1\x29\x78\x51\xc4\x14\x42\xe4\x3f\x89\x85\
+\x5a\x26\x43\x5b\x77\x1f\xf2\x8e\x56\x42\xc6\xd0\xd1\x0d\x07\x57\
+\xd7\x3a\x09\x02\xd3\x8e\xdb\x97\x2d\x0f\x67\x63\x23\xfc\xd1\x69\
+\xb2\x43\xdf\xc7\x39\x93\x99\x51\xb2\x48\xb8\x4a\xc2\xe6\x10\x00\
+\x07\xf9\x35\xb4\x2c\x0a\x12\x99\x88\xa9\x1a\x96\x10\x29\x70\xe5\
+\xc6\x43\xfc\xfe\x5b\x1d\x67\x38\xba\x46\x4e\x4d\xcf\x28\x4e\x52\
+\xba\xb2\xa5\xef\xa7\xc7\x43\xdf\x63\x07\xb9\x96\x30\xf6\x13\x2d\
+\x68\x52\xb1\x54\x3a\x4d\xbe\x88\xe2\x63\x02\xf2\xc1\x12\xe6\x1e\
+\x3b\x4f\xa4\x22\xd2\x0c\xae\x4b\x5b\x24\x12\x0f\x95\x0c\xa1\xee\
+\x72\x7c\x9b\x57\x81\x7e\x13\x97\x4c\x85\x66\x14\xef\x4b\x48\x98\
+\xba\x35\x3e\x2a\x10\xf5\xed\x56\xcc\xd5\xc8\xf0\x86\xd6\x07\x87\
+\xab\xdb\x50\x66\xb0\xc2\x95\x24\x28\xd5\xb2\xe1\x6a\x7b\xba\xfb\
+\x91\xbd\x22\x08\x57\xf4\x26\xec\xd7\x75\xc0\x55\x29\x83\x8a\xdc\
+\x34\x69\x83\x48\x08\x24\xc9\xa6\x69\x94\xa8\xa8\x35\xa0\xbc\xbc\
+\x29\x97\x0a\xde\x72\xa6\x21\x63\x7d\x4c\x88\x89\x62\x61\xe7\x38\
+\x04\xc9\x44\x6c\x5f\xe4\xef\x04\xeb\x34\xdb\xf1\x5d\x59\x0b\x2a\
+\x9b\xcc\x50\x93\x3e\x90\xab\x15\xb8\x53\xdf\x82\x9a\x1d\xd1\xc3\
+\xa2\x1d\xaa\x6a\xc5\xdf\x8d\xbd\xf0\xf6\x70\x81\x5a\x2d\x1f\x3c\
+\x09\xb9\x04\xe0\xb0\x3f\x5f\xd7\x48\x05\x65\x9c\x11\xdf\xcc\x58\
+\x00\x9b\x1d\xb0\xf4\xdb\x31\x85\xe2\xf0\x5e\xf2\xd4\x11\xda\x57\
+\x34\x18\xb1\xe1\xc8\x2d\xa8\x5c\x95\xe8\xee\x32\xe3\xfe\x17\x09\
+\x23\xd6\xbb\xc9\xed\xf9\xec\x9c\x01\x3d\x36\x11\x7e\x7e\x6e\x50\
+\x2a\xe4\x60\x65\x40\xee\x81\xcb\xa0\x66\x7f\xf8\xa7\xb8\xf9\xd5\
+\x79\xe8\x27\xba\x5b\x09\x01\xdd\x67\xc2\xee\xe5\xd3\xc7\x6c\xfb\
+\x22\x5d\x33\xb6\x1c\xaa\x47\xd7\xde\x25\x63\xae\xd7\x1a\x8c\xc8\
+\xbd\xd4\x0c\x57\x72\xda\x00\x7f\x4f\xec\xff\xe9\x2a\xa8\xe8\x4f\
+\x2f\x89\x9b\xd7\x44\x82\x27\x2f\xf7\x8a\xa1\x0f\xfd\x4d\x2d\xf8\
+\xe5\x2d\xed\x98\x00\x35\x4d\xdd\x58\x91\xa5\x83\x21\x6b\xe9\x98\
+\xeb\xad\x46\x2b\x3e\x38\x5e\x07\x37\x8d\x0b\x22\xc2\x03\xb0\xaf\
+\xa0\x1a\xd4\xcc\x9d\x17\xc5\x8f\x36\xc6\xe0\x7a\x87\x0d\xb7\x0d\
+\xbd\x90\xb5\x35\xe3\xd7\x77\x16\x8e\x48\x6c\xea\x34\x63\x5b\xde\
+\x75\xe8\x1a\x4c\xb0\x98\xad\xe8\xca\x7b\x69\x14\xb4\x88\xf4\x83\
+\x3a\x9c\xbe\x60\x40\x6c\x72\x38\xe6\x86\xf9\x20\xd2\x93\xc5\x57\
+\x79\x3a\x50\x73\x3e\x29\x6f\x48\x79\x61\x46\x88\xc9\x41\xa3\xad\
+\xb5\x0f\x76\xfd\x7d\x14\xef\x5c\x3c\x9c\xf8\x6e\x7e\x2d\x0e\x9e\
+\xbe\x83\xb8\xa5\x11\x98\x1f\x1b\x82\xec\x2f\x4f\xc1\x7c\x7c\xdd\
+\x30\xf4\x81\xbf\xee\x22\x33\xab\x02\x31\x89\x61\x98\x1f\x1f\x02\
+\x86\x74\x22\x69\x5a\xb8\xc9\x45\x94\x9c\xbd\xd3\x48\xcd\xfb\xbc\
+\x72\xdf\xcc\x70\xbf\xad\x7e\xbe\x6e\x78\xf8\xc8\x08\xf3\x2d\x3d\
+\xce\xec\x4a\x42\xf6\x1f\xb7\xb1\x2b\xf7\x1a\x66\xc4\x84\x22\x61\
+\xc9\x2c\xd2\x74\x22\x58\xb9\x0c\x7b\x77\x9f\x84\xb5\x38\x0d\xe7\
+\x6f\xb6\x60\x53\xd6\x65\x40\xae\xc4\x8b\xa9\x5a\xb8\x10\xa7\x75\
+\x10\x3b\x91\xae\xaa\xd4\x1f\xad\x6d\x66\xdc\xae\x6b\xce\xa5\xe2\
+\xbe\xae\x4e\x72\x99\xa4\x2c\x5d\x18\x1b\x80\x06\xa2\xf1\xf5\xb3\
+\xd7\x60\x25\x1b\x6d\x32\x05\x96\xad\xd2\xc2\xc7\x53\x0d\x6e\x30\
+\x51\xa9\x62\xb1\xe7\xe3\x02\x2c\x4e\x0c\x45\xe9\xd5\x47\x58\x95\
+\xbe\x18\x01\x81\x1e\xe0\xec\x0e\xa7\x77\x0d\x85\x9c\xf8\x54\x45\
+\xf5\x43\x98\x7b\xfb\x93\x9d\xfd\xa3\xfd\x46\x67\x5f\xa0\x0d\x64\
+\xd5\x04\xe0\x54\xd1\x55\x44\xc6\x06\x23\x82\xcc\x01\x32\x13\x46\
+\xd8\xb4\x9c\x9c\xa0\xa8\xb0\x12\xcf\x04\x7b\x21\xe9\xd9\x99\xce\
+\xb9\xc0\x13\x39\x9e\x0c\xc9\xc6\x7b\x49\xff\x54\x5e\x7b\xc0\x55\
+\xed\x88\x91\x3b\x09\x12\xf6\xdc\x88\x62\x58\xa6\x66\xe9\x82\xa9\
+\x60\xc8\x06\x9e\x54\x23\x01\x8b\xe2\xc8\x19\x40\x11\xe3\x63\x49\
+\x75\x02\xc1\x94\x80\xc7\x5a\x97\x2c\xa6\xb4\xc2\x00\x9e\xe3\xa3\
+\xcb\xdf\x9e\x53\x3b\x6c\x67\x89\xdf\xff\x9b\xad\x99\xac\xce\x4c\
+\x8c\xf0\x81\x8d\xe3\x31\x2a\x77\xc2\x90\xb0\x15\x2c\x83\xb2\x9b\
+\x6d\x30\xb6\x5b\x72\xca\xb6\xcf\x7e\x6c\xd7\x43\xb1\xe8\x87\x5b\
+\x85\xde\x5e\xea\xb5\x71\x61\x5e\x90\xca\x94\xcc\x6b\x22\x9e\x81\
+\x61\x34\x60\x8a\x95\xf5\x9d\xe8\xe8\xb4\x1c\xbb\xb8\x65\xd6\xd3\
+\x03\x67\x28\x92\x0f\xdd\xcb\x66\xe4\x54\x66\x7c\x98\x27\x3c\x5d\
+\x14\x03\x72\x01\x63\xca\x41\xd4\x00\x43\x6e\x4c\x97\xd9\x86\x8a\
+\xfa\x2e\xf0\x76\x31\xa7\x74\x53\xe8\xf8\x23\x73\x28\x9e\x3b\xaa\
+\x8f\xe2\x05\xb1\xca\x73\x92\x9c\x0d\xf6\x53\xc1\x9b\x98\x9c\x5a\
+\x41\x13\xdf\x1f\x20\x91\x6c\xdc\x62\x13\xd0\x61\xb1\x41\xdf\x4c\
+\x1a\xaf\xd7\xce\x91\x77\xa7\x3d\x9f\x16\x3c\xf1\xd0\x7f\x32\x52\
+\x7e\x36\x24\x11\xa5\xd6\xf1\x34\x52\x08\x78\x88\x4a\xc9\x38\x9f\
+\x5b\x89\x6f\x11\x92\x46\x46\x40\x09\x51\xa6\xa0\xe4\x95\xc0\x71\
+\xff\xb6\xfc\x07\x8a\x51\x8a\x31\x04\x6f\x35\xec\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x75\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x3c\x49\x44\x41\x54\x78\xda\xad\xd5\x6d\x48\x53\x51\
+\x18\x07\xf0\xff\xd9\xe6\xe6\x6c\x6a\x66\x6a\x59\x2e\x95\x10\x04\
+\x51\xa3\x22\x22\x7a\x55\xb1\x22\x29\x89\xea\x0a\x05\xb5\xc4\x22\
+\x34\x0a\xea\x93\x10\x51\x44\xf4\xa1\x20\x88\x8a\x20\x89\x22\x3d\
+\x50\x04\x11\x89\xa4\x45\x41\x20\xbd\x81\x54\x1a\x44\x51\x21\xbd\
+\x52\x60\x59\xce\xcd\xfb\xd2\xff\x6c\xd3\x74\xa4\xa9\xf9\x6c\x97\
+\xdd\x73\x37\x9e\xdf\x79\x9e\x73\xee\x9d\x40\x54\x04\x80\xf3\xce\
+\x8c\x4c\x5f\xb0\xf3\x6d\x9d\x0b\xd8\x8e\xff\x0c\x11\x95\xbc\xc1\
+\x59\x5d\xa5\xa1\x30\x3f\x34\x0e\x56\x56\x4b\x22\x15\x13\x02\x0c\
+\x49\xde\x78\x1a\x70\xbb\x81\xe5\x5b\xe1\xaf\xac\x91\x71\xff\x81\
+\x88\x81\xe4\x35\x4c\x3e\x5d\xc7\xf3\xa7\xaf\xf1\xc2\x11\x8f\x35\
+\xbf\x3a\xe1\x76\xd8\x80\xd2\x6d\xe8\xae\xdc\x2d\x13\xc6\x89\x88\
+\x50\xcf\x6b\xaa\x7c\x2a\x79\x3b\x93\xe7\xc9\x7b\x21\xb4\x68\x4d\
+\xb9\xd1\x22\x3a\x6c\x88\x71\xc2\x2a\xf5\xa1\x6b\xc7\x5e\x39\x65\
+\x1c\x88\xb0\xbc\xb3\x2d\xec\x5c\x02\xb4\x3d\xc2\x95\x98\x4c\x6c\
+\xbc\x7c\x23\x04\xe4\x2e\x2e\xb6\x3a\x12\xdf\x01\x06\x07\x36\x07\
+\xac\x55\x3e\x7c\xa9\xde\x2f\xa7\x8d\x11\x11\xbd\xac\xc0\x35\xd7\
+\xeb\x43\x6e\x2a\xfc\x01\x13\x65\xfe\x59\xc6\x87\xee\x9f\xf6\x72\
+\xb3\x0b\x47\xe2\xbb\x80\x3e\x8b\x88\x09\xd8\x6d\x30\xd8\xae\x4f\
+\xfb\x6a\xe5\xcc\x31\x20\xa1\xd9\xf6\x70\x0d\x62\x0b\x33\x34\x91\
+\xc3\x26\x04\x82\x80\xc9\x69\x9b\x4c\xcc\x53\x98\x66\x78\xdc\xa7\
+\x03\x0e\x27\xf4\x92\xcd\xe8\xac\x3d\x24\xb3\x47\x89\x0c\xec\xa2\
+\xef\x44\xe2\x0a\xd2\x35\x47\xf6\x64\x26\xd6\xff\xcc\x5c\x01\xfa\
+\x20\xc4\xe9\x44\x5f\x71\x05\x5e\x1f\x3c\x26\x73\x47\x81\x0c\xb9\
+\x0f\xbe\x11\xf1\xe4\x4e\xd3\x9c\x59\x89\x4c\xa6\x12\xeb\x61\xc4\
+\x60\x72\x9d\xa0\xa5\x3e\x0d\x58\x76\x07\x82\x44\x5e\x1e\x3d\x21\
+\xf3\xff\x81\x88\xe8\x0b\x1f\x89\x24\xe5\xa4\x6a\xae\xac\x78\xc0\
+\xaf\x87\x2b\xe8\x47\x0c\x8b\x85\xa8\x73\x1d\x36\xe1\x80\xbf\x64\
+\x13\xda\x8f\x9f\x92\xf3\x47\x40\xc4\xdf\x2e\x72\xef\x34\xa4\x64\
+\x27\x6b\x6e\xaf\x87\x6b\xa2\x0f\xb4\xca\xec\x6f\x95\xaa\x86\x15\
+\xda\xb8\xbb\x7a\x56\xac\x47\xdb\x99\x73\x72\xd1\x30\x88\x18\x4e\
+\x7e\x45\x24\x2d\x23\x41\xf3\x78\xe3\x43\x6b\x62\x72\xf6\xa1\xb5\
+\xe8\x6f\x97\x3a\x57\x08\x2b\xe9\x2e\x5a\x87\xc7\x75\x17\xe4\x8a\
+\xbf\x20\xc3\x02\x2a\xda\x89\xcc\x98\xe9\xd1\x12\xd3\x3d\x30\x55\
+\x25\x7a\x24\xb9\xaa\x88\x9f\x96\xda\x08\x5c\x78\x3b\x5f\x3f\x8a\
+\xd7\xa2\xb5\xbe\x5e\xae\x8c\x42\x46\x04\x54\xb4\x11\xf1\xa6\xb9\
+\xb5\xa4\xf4\x49\x30\xfd\x91\x76\x31\xb1\x15\x69\x53\xff\x58\x21\
+\x5d\xcb\x56\xe3\xee\xf5\xab\xb2\x7c\x10\xf2\x4f\x40\xc5\x43\x22\
+\x59\x49\x2e\x6d\x6a\x5a\x2c\x2b\x31\xc3\x33\xd7\xcd\x48\xab\x22\
+\x47\x9f\x01\xbb\x25\xf0\x75\x69\x09\x6e\x37\x37\x4a\x2d\x82\x8c\
+\x0a\x50\x71\x9f\x48\x8e\x27\x46\x4b\x49\x8e\x85\x11\x08\xef\x28\
+\x95\x58\x10\xb3\xb1\x30\xb5\xb3\x2c\x56\x24\x58\xc9\xe7\x85\x4b\
+\xd0\xd4\x7a\x47\x6e\x25\x32\x6a\x40\x45\x0b\x91\x3c\x97\xd0\xd2\
+\x92\xdc\xe1\x4a\x08\xd8\x69\x3d\xe9\x09\x40\x19\x7c\xc0\x23\x79\
+\xd0\xef\x9b\x80\x4b\x63\x02\x54\x34\x12\x29\x10\xd0\xd2\x13\xc3\
+\xed\xb2\x11\x78\x10\x0c\xe2\x0d\x50\xc6\x64\x9d\x7c\x3a\x6f\xe0\
+\xa5\x5e\x1e\xeb\x39\x16\x63\x06\x54\x5c\x23\x32\x0f\xd0\x32\x5c\
+\x4e\x98\xec\xfd\x33\xde\x1b\xcf\x80\x39\x5b\x42\x7b\x62\x68\x8c\
+\x0b\x50\xd1\xc0\xf7\x02\x22\x59\xec\xf9\x7b\x3e\xd3\x6f\x01\x7b\
+\x7c\xc0\xc9\x09\x03\x54\xd4\x11\x59\x4e\x44\x9d\x37\x03\x07\xaa\
+\x80\xc3\x13\x0a\xa8\x38\x4b\xa4\x94\xc8\x4d\xb6\xa7\x9a\x6d\x9a\
+\x70\x40\xc5\x29\xe0\x22\xff\xbd\xf3\x77\x01\x85\xd1\xdf\xfd\x06\
+\x46\x8c\x6c\xd2\x4c\x7a\xb4\x1a\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x05\x14\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xdb\x49\x44\x41\x54\x78\xda\xb5\x54\x6b\x6c\x14\x55\
+\x14\xfe\xee\xcc\xec\x76\xb7\xaf\x6d\xa9\x4d\xa5\xa5\xb4\xb4\xb5\
+\xb4\xb6\x0b\xb4\xd0\x40\xdd\x02\xd6\x02\x31\x3e\x23\x82\x1a\x44\
+\x63\x10\x12\x22\xad\xa2\xe1\x87\x36\x91\x1a\x40\x9a\x10\x25\x1a\
+\x1e\xbf\xa4\x48\x90\xa8\x18\x1a\x8d\xc6\x58\xa8\x98\x16\x90\x87\
+\xa5\x4f\x68\x81\x42\x5f\xdb\x6e\xb7\x0f\xba\xed\x6e\xb7\xfb\x9a\
+\x99\xeb\x9d\xd9\x75\x6b\x09\xaf\x80\xde\x4d\x66\x76\xee\x3d\xf7\
+\x7c\xe7\x7c\xe7\x3b\x87\xe0\x7f\x5e\xe4\x7e\x0d\xf3\xbe\xed\x8f\
+\x7f\x31\x5d\xdf\xe8\x92\x80\xda\x6e\xd7\xbc\x53\xab\xa7\x5b\xfe\
+\x33\x80\x25\x47\xfb\x36\xad\x33\x46\xec\xcd\x8f\x0f\x43\xf5\xb0\
+\x17\xbf\xb5\x8d\xc3\x66\xf7\x16\x9f\x5e\x93\xb0\xef\xa1\x00\xe6\
+\x7c\x6d\xd1\x99\x92\x34\xe7\x36\x64\x1b\xe6\x5a\x45\x0e\x75\xe3\
+\x32\xb4\x84\x20\x44\x00\xae\x0d\xb8\x50\x7f\x65\xac\x89\xf2\xc2\
+\xa2\x0b\x6b\xa7\xbb\xef\x1b\xe0\xf0\xc1\x63\x51\x44\x12\x53\x2f\
+\xc9\xb1\x33\xc9\x8c\xe4\xca\x95\x99\xe1\x68\x1c\xa3\xb0\x32\x17\
+\x1a\x2e\x70\x89\xdd\x12\x38\x82\x51\xa7\x0f\xf5\x37\xec\xc8\x91\
+\xfa\x57\x66\x60\xa8\x4b\x26\xbc\xee\xcd\xb7\x57\x9d\xbd\x23\x40\
+\xc5\xbe\x43\x91\x39\x05\xf9\x63\xea\x01\x15\xd5\x3d\x8e\x79\x93\
+\x24\x09\x1e\xe7\x84\xfa\x6d\xb3\x8f\xaa\xef\x71\xfb\x64\xd0\x37\
+\x87\x47\xa6\x04\xb9\xb1\xe4\x2d\x72\x5b\x80\xe2\x5d\xc7\x5e\x5a\
+\xbf\x7c\x76\x65\xba\x31\x0b\xb2\x2c\x43\x09\x98\xb2\x1f\x51\xcc\
+\x94\xb0\xe9\xa4\x2d\x65\xff\x65\x48\xec\x84\x53\x9d\x88\x32\x45\
+\xa8\x8e\xc7\x81\xbd\x87\x6e\x0f\x50\xf0\x55\xe7\x9e\xd7\x1f\x43\
+\xf1\x7c\xed\x08\xe6\xe5\xe5\xa0\xee\xba\x05\x43\x36\x27\x3c\x1e\
+\x1f\x04\x81\x63\xce\x94\xac\xfc\x37\x14\xe7\x94\x3d\xd4\x37\xdb\
+\xe2\xd9\x5e\x81\x31\x11\x71\x51\x11\x28\x29\xab\x40\x4d\x6c\x61\
+\x59\x4b\x49\xca\x36\x15\x20\xbd\xbc\x25\xee\xd9\xdc\xe8\xfa\xd5\
+\xd9\x31\xf1\x8d\x3d\x43\x98\x2f\x5a\xb0\xa0\x60\x21\x44\x51\x54\
+\x9d\xdc\x59\x1e\x24\x18\xa1\x62\x25\x33\xf9\xea\x59\xf5\x3f\x2a\
+\xaf\x80\xd9\xf4\x0a\x5a\x2f\x9a\x2d\x04\x34\x97\x6c\xab\xed\x97\
+\x9e\xce\x8a\xe1\x0e\xdf\xf0\x60\xdc\x6c\xc5\x3b\x71\x43\x58\x60\
+\xca\x47\x63\x87\x15\x83\xa3\x4e\xb8\x7d\x3e\x15\x88\x04\x22\x27\
+\xe4\x36\x40\x8c\x9e\xa5\xd9\xc9\x30\x84\xeb\xb1\xa9\x94\x29\x77\
+\xd5\x06\x08\xd4\x87\xb3\x67\xfb\x64\x92\xf9\x61\x2d\xd5\xc5\x46\
+\x23\x6f\x71\x0a\x5c\x5d\xbd\x78\x37\x5e\x01\x30\xc1\x7b\xaf\x0c\
+\xa6\x60\xf8\x51\xb5\x82\x80\x0d\x5b\x3e\x03\xbf\xf6\x7d\x5c\x3c\
+\xd9\x0a\xc7\xc8\x04\xc8\x91\xcb\x36\xba\xe3\xe7\x6e\x0c\xb4\x98\
+\xb1\xec\x99\x59\xd8\x1c\x37\x88\x45\x45\x85\x38\x7f\xb5\x0f\x03\
+\xa3\x2e\x78\x7c\x52\x90\xef\x7f\xa2\x27\xb7\xa4\xa1\x9c\x3f\x9f\
+\x97\xc2\x8a\xac\xc5\x1b\x1b\xb7\xe2\x38\x0a\x91\xb1\x70\x26\x42\
+\x34\x1a\x90\xfd\x7f\x0d\xd0\x2a\x9b\x06\xae\xb1\x09\x9c\x39\x72\
+\x0a\x3b\x5e\x4b\xc0\xe6\x57\x17\xc3\xe9\xf6\xcb\x50\xf6\x57\x14\
+\x41\x8e\xee\x92\x45\x7d\xaf\x03\x45\xef\x55\xe1\xa9\x75\x45\x88\
+\x8e\x09\x45\xef\xf5\x9b\x20\x7b\xce\x59\xe9\x8f\x56\x02\xbd\x96\
+\x40\xa4\x1c\x2e\xfc\xd4\x8c\xd9\x71\x14\xd5\xa5\xf9\x70\xb3\x56\
+\xf0\xfa\x64\xd5\x81\x86\x75\x99\x4c\x65\xb5\xa2\x1c\xe1\xe0\x13\
+\xa5\xc0\xbe\x80\x30\x76\x77\x59\xf9\x9f\xa8\x6b\x1e\x43\xe1\xfa\
+\x25\x10\xe0\x3f\x1b\xe8\xb0\x81\x7c\x79\xc6\x42\xbf\x67\x63\x2b\
+\x84\xf3\x47\xc1\x6b\x05\x74\xb7\x58\xd0\xdf\x70\x0d\x3f\x6c\x7d\
+\x02\x39\x33\x0c\xac\x27\x28\x7a\xed\x1e\x2c\xfe\xe0\x24\x22\x0d\
+\x1a\xfc\x52\x56\x80\xc4\x48\x1d\x38\xd6\xcd\x4d\x16\x07\x56\x94\
+\xfc\x8a\x04\x63\x3a\xb2\x56\x64\x42\x74\x07\x44\xc1\xb4\x3b\xda\
+\xc5\x00\x3e\x3f\xdd\x47\x8f\x74\x33\x00\x9e\x06\x53\xe5\x78\x0e\
+\x2e\x36\x36\xeb\xbf\x3b\x8d\x35\x2f\xa4\x22\x63\x46\x24\x3e\xde\
+\x79\x02\x89\xa6\x1c\xd5\xc6\x7c\xa6\x01\xdb\x4b\x97\xe3\xaa\xd9\
+\x81\x6f\x8e\xb6\x20\xe3\xb9\x7c\xc4\xce\x8a\x82\xe4\x95\x82\xc2\
+\x50\x00\x1c\x9d\x23\x20\xbb\x6a\xfa\xe8\x81\x4e\x11\x3a\xee\x5f\
+\x85\x53\x1a\x97\x81\x10\xad\x16\xed\x07\xab\x18\x27\x1c\x12\x56\
+\xe4\x21\x2c\x36\x5c\x3d\x76\x0e\x8d\xa3\xef\x44\x1d\x64\x97\x1b\
+\x49\x2f\x3f\x09\x7d\x94\x0e\x92\x4f\x9c\xd2\xe9\x84\xf9\x73\x9b\
+\x19\xc0\xce\x3f\xcc\x74\xff\x35\x09\x7a\x3e\x28\x11\x50\xe6\x90\
+\x4e\xb8\x60\xab\x3a\x8f\x90\xe4\x44\x44\xe6\xa6\xf8\xbb\x56\x9a\
+\x8c\x4e\xa9\xb9\xa3\xa1\x03\x1e\x26\x6d\xc3\x92\x5c\xf0\x8f\x44\
+\x28\xf3\x62\x52\x08\x0c\x80\xf6\x0e\x83\x6c\xff\xbd\x87\x7e\xd1\
+\xea\xf3\x03\xb0\x5b\x44\xc3\xc3\xd7\xde\x0f\x4f\x6b\x3b\x42\x0b\
+\x72\xc0\x4d\x8b\x00\x55\x0a\x7a\xab\x82\x14\x5b\x81\x87\x3c\xe2\
+\xc0\x04\xa3\x4c\x9b\x96\x04\xed\xe3\x49\xa0\xbe\x80\x2d\x03\xe0\
+\x2c\x4c\x45\x65\xc7\xbb\xe8\xee\x4b\x5e\xe8\x03\xf3\x06\xe7\x2f\
+\x43\x0e\xd3\x43\x30\xa6\xf8\x1d\x49\xf7\x68\xb6\x40\xe6\x62\x4b\
+\x27\x38\xbb\x03\x30\xcd\x41\x60\xaa\x43\xe8\x65\x14\x95\x56\x75\
+\xd2\xdd\x6d\x8c\x22\x87\x0b\x5c\xd3\x55\xc8\xc6\x34\x60\x9a\x92\
+\xae\x84\x29\xa4\xde\xbd\x97\x99\x37\x1e\x60\xd9\x70\x0d\x6d\x90\
+\xe6\x64\x82\x3c\x1a\x09\x6d\xd7\x20\xc8\xa7\x35\x3d\xb4\xbc\xb2\
+\x07\xa1\x1e\x37\x84\xec\x14\x95\x5f\x65\xb6\x3c\xd0\x52\x78\x67\
+\xf4\x88\xcd\x1d\xea\x20\xd7\xc5\x46\x81\xcc\xdd\x52\x4d\xa5\xd4\
+\x64\x84\x4f\x37\x00\x2a\x7f\x0f\xe6\x7b\x8a\x02\x59\x1d\x9d\x66\
+\x1b\xfa\x6b\xea\x41\x96\x7e\x52\xdb\xce\xc5\x44\xa7\x0d\xd9\xbd\
+\x41\xee\x1e\x76\x29\xbd\x24\x32\x45\x0d\x5f\xe9\xb9\xfe\x37\x4a\
+\x2c\x1e\x98\x84\x25\x34\x18\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x05\x35\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xfc\x49\x44\x41\x54\x78\xda\x8d\x95\x6b\x4c\x93\x57\
+\x18\xc7\xff\x2f\xbd\x50\xa8\xdc\x2d\xb2\x42\x23\xc8\x1d\x01\x27\
+\x22\x04\xb9\x8d\xab\x12\x4d\x74\x53\xa6\x93\xc4\x2c\x73\x66\xfb\
+\xe0\xbe\x6c\x26\x5b\xb6\xb9\x4d\x77\xf1\x93\x7e\x31\x59\xb2\x3b\
+\x73\xf3\x42\xb2\xc4\x68\x96\x78\x41\x8d\xdc\x74\x93\xda\x85\x3b\
+\x85\x32\x8a\x80\xb4\x96\x72\x6b\xb9\x14\xda\x9e\x3d\x3d\xaf\x2e\
+\xc1\x16\xc3\xf9\xc2\xbf\x0f\x4f\xce\xef\x7d\xfe\xcf\x73\xce\x11\
+\xe0\x63\x55\xd5\x19\x2f\xd3\x9f\x3d\xf0\xbd\x5a\xae\xed\x8f\x2d\
+\xc0\x2a\x97\xb0\x02\x80\x15\x66\x44\xc0\xe9\x62\xcb\xe2\x52\x89\
+\x80\xc6\xb6\x71\x5c\x7f\x23\x4e\x58\xd5\xee\xcf\x03\xca\xcf\x0f\
+\x76\x2d\xba\x58\x9a\x4c\x2a\x20\x48\x29\x83\x9b\x3d\x97\x4c\xd9\
+\x6e\x97\x1b\xd3\x36\x27\xfc\xfc\x04\x48\xfc\x50\x73\xbb\x26\xee\
+\xc2\xaa\x01\x87\xfe\x1c\x61\x47\xb7\x45\xe1\xd1\xcc\x22\xba\x69\
+\x93\x7c\x95\xbf\xe8\x89\xc5\xb1\x4c\x67\x84\x48\x61\x5f\x72\xa1\
+\xbe\x67\x1a\xe7\x76\xc5\x08\xab\x06\x1c\xb8\x6c\x64\xaf\xe7\x46\
+\x41\xf7\xc4\x81\x36\xa3\x0d\xdb\x33\x23\x78\xc2\xb5\x36\x2b\xaa\
+\x36\x45\xf0\x9c\x1b\xed\x56\x64\x6d\x08\x06\xa3\xf2\x7a\x06\x27\
+\x21\x95\xcb\xb1\xf5\xa5\x00\x48\xa9\xbc\xbe\xc9\xa5\x83\x67\x4b\
+\x55\x17\x57\x04\x54\x5f\x32\xb0\x8c\x8d\x91\xb8\xab\x33\x43\x4a\
+\xbf\x65\x72\x29\x4f\xb0\xcd\x2f\x21\x28\x40\xc6\x73\xec\xa4\x15\
+\x72\x09\x01\xdc\x08\x0b\x96\xe3\x58\x8e\x0a\x0e\xea\x95\x3f\xf5\
+\xe7\xdb\x4e\x1b\x7e\xae\x5c\x27\xac\x0c\xa8\x33\xb0\xea\xbc\x68\
+\xaa\x60\x01\x5d\x03\x53\xa8\xd8\xb2\x8e\xc7\x6f\x6a\xcd\xa8\xcc\
+\x16\xf5\xad\x87\x66\x64\x26\x86\x82\x31\x06\x7d\xff\x04\xe4\x41\
+\x81\x3e\xad\xb9\xb0\x53\x2d\x78\x01\x5e\x3b\xdf\xc7\xaa\x0b\x34\
+\x78\x38\x36\x8f\x2e\xc3\x24\xca\xb2\xa3\xc4\x4d\x5b\x4d\x28\xdf\
+\x2a\xea\x3b\x5a\x13\x32\x93\xc2\x68\x00\x08\xd0\x37\x8e\x53\xdb\
+\xe3\x38\xec\xf3\xbf\xc7\x71\x22\x77\x2d\x1f\x8c\x53\x0f\xad\xbe\
+\x01\xd5\x17\xfb\x59\x60\x54\x30\xac\x26\x1b\x5c\x0e\x27\xc2\x42\
+\x15\x3c\x63\x78\xc4\x06\x4d\x4c\x10\xcf\x19\x1d\xb5\x21\x7c\x2d\
+\x7d\x35\xd9\x32\x6f\x5b\xc0\xdb\xc5\x1a\x1e\xaf\xeb\xb5\x63\x7f\
+\xca\x1a\xae\xaf\x18\xec\xf8\x6d\x67\xb4\x37\x60\xc7\x77\x9d\xac\
+\x3c\x57\x8d\xfe\x09\x07\xfa\xf4\x13\x28\xcc\x8b\xe1\xf1\xc6\x7b\
+\xc3\x28\xda\x26\x6e\xd4\x74\x7f\x04\x69\x69\x11\x34\xae\xc0\x80\
+\xde\x82\x94\xa4\x48\x1e\x37\x4c\x2d\x22\x21\x54\x4e\xd5\x00\x0b\
+\xf4\xcf\x1f\x2a\x7d\x54\xb0\xeb\xfb\x0e\xb6\xa7\x24\x0e\xad\xc3\
+\x36\xf4\x13\xa0\xe0\x19\xa0\x85\x00\xf9\x22\xa0\x99\x00\xa9\xff\
+\x03\xcc\x38\xbe\x2b\x49\xb4\xa8\xf9\x09\x4e\x14\x44\x72\x8b\x7e\
+\xd7\x4f\xe1\x47\x5f\x80\x8a\xb3\x3a\xa6\x4e\x8f\xc6\xa3\x6e\x13\
+\xec\x93\xb3\x88\xd4\x88\xa3\x69\x1e\xb2\x62\xdd\x7a\x51\x3f\x19\
+\xb6\x22\x54\x15\x04\x3a\x6f\x60\x0e\x07\xbe\xd8\xbb\x91\x84\x1b\
+\x9f\x36\x59\xf0\x55\xa1\xca\x23\xf1\x6b\xcf\x14\x7e\xa9\xf2\x61\
+\x51\xe9\xe9\x07\xac\xa2\x38\x1e\x6d\x63\x73\x18\xea\x31\x21\xbb\
+\x30\x9e\xc7\x5b\x1b\x0d\xd8\x5a\x94\xc0\xb5\xb6\x69\x00\xf1\xe9\
+\x6a\x30\xaa\xc0\x62\x34\x21\x2c\x2e\x0a\x02\x8d\xac\x69\xc6\x89\
+\xa8\x60\x29\xb7\x68\x7a\xc1\x85\xeb\xfb\x63\xbd\x01\x65\x67\x5a\
+\x59\x55\x65\x32\xb4\x83\xd3\xab\x02\x8c\xf4\x8e\xe0\xe3\xea\x4c\
+\x78\x76\xfd\xe4\xce\x63\x7c\x5d\xaa\xe6\x07\xb0\xb6\x73\x02\x97\
+\x76\x6b\xbc\x01\x45\xdf\xb4\xb0\xb8\xbc\x04\x68\xaf\x75\x41\xa1\
+\x94\x73\x6f\x3d\x6b\x61\x7a\x0e\x8a\x10\x71\xde\x1d\x33\x73\x90\
+\x2b\xfc\xc9\x6b\x37\x02\x03\x65\x78\x75\x67\x06\xfc\x48\xd7\x6a\
+\x2d\x78\x33\x5b\x05\x2a\x06\xf5\xff\xce\xa0\xde\x57\x05\x79\x27\
+\x9b\x59\x49\x69\x22\x74\x43\x76\x8c\xb5\x0f\x21\xb5\x3c\x9d\xc7\
+\x7b\x1b\x7a\x90\x52\x9c\xca\xb5\xbe\xb1\x17\xd1\xe9\x1a\xea\x01\
+\xc3\xec\xa0\x09\xea\x74\xb1\xf9\xed\x64\x6b\xe8\x1a\xf1\xb4\x33\
+\x1a\xe1\xfb\x87\xe2\xbd\x01\xdb\x08\xf0\xca\xf6\x34\xe8\xe8\x90\
+\x99\xa9\xfc\xe4\xa2\xd4\x17\x02\x26\x7b\x8c\x78\xf7\x60\x0e\xfc\
+\xe8\xb3\x8f\xdf\x1e\xc1\x97\x65\x31\x7c\x8a\x6a\xe9\xbe\xba\xfb\
+\xf4\x4a\x5f\x5e\xc1\x89\xbb\x2c\x89\x36\x6d\xa9\x7b\x00\x89\x6b\
+\x09\x12\xa5\x92\x12\x04\x38\x67\xed\x90\x2a\xc5\x43\xe4\x9c\xb3\
+\x43\xa2\x50\x90\x15\x6e\x04\x87\x05\xe2\xf0\x81\x1c\xde\xe4\x93\
+\x77\x86\xf1\x59\xa9\x86\x03\xce\x75\x8c\xe3\x5e\xcd\x06\x6f\x40\
+\xd6\x87\x37\x59\xc5\xde\x6c\x34\xe8\x4c\x98\xe9\x7d\x04\x75\xa1\
+\x68\xd1\xe3\xc6\x4e\xa8\x8b\x9e\xea\xa6\x4e\x84\xa7\xc7\x7a\x0e\
+\x32\xd8\xa8\x09\x9b\x4b\xa9\x07\x2e\x17\xae\xd0\x43\xb4\x7b\xd3\
+\x5a\x78\xba\xd6\x60\x98\x42\xd7\x91\x24\x6f\xc0\x96\x8f\xea\x59\
+\xf6\x8e\x4c\xb4\xf5\x5a\x57\x05\x58\xec\x1b\x82\xff\xcb\x89\x3c\
+\x3e\x64\x99\xc3\x7a\x95\x38\x08\xb6\x05\x27\x3a\x0e\xfb\x00\x6c\
+\x3e\x76\x83\x25\x17\xa4\xe0\xde\x1f\x7f\x41\x42\xf7\xb5\x40\x77\
+\xbd\x27\xc3\x65\x9b\x85\x24\x48\xc9\x73\xa4\x32\x19\xd9\xe4\xe0\
+\xe3\x18\x1a\xae\xc4\xbe\x43\xf9\x10\xa8\x82\xd3\x64\xd1\x07\x64\
+\x91\x67\xf0\x2e\xb5\x8f\xa3\xe3\xad\x44\x6f\x40\xca\xd1\xab\x2c\
+\x77\x6f\x2e\x9a\xb5\x8f\xe1\xee\xea\x83\xa2\x24\x87\xc7\xe7\x1b\
+\x74\x08\x28\xce\x12\x75\xd3\x3f\x90\xa7\x25\x90\x15\x0c\xc2\x80\
+\x11\x35\x47\xca\x38\xe0\xcc\x2d\x23\xde\x2f\x8f\xe5\x80\xba\x36\
+\x33\xba\x7d\x55\x90\xf6\xde\x55\x16\xbb\x23\x0b\xfa\x6e\x0b\x5c\
+\xfa\x41\x04\x14\x6e\x7e\x21\x40\x62\x18\x84\x25\x3e\x91\x03\x64\
+\xf4\x46\x2f\x3d\x7d\xc4\x3d\x7a\xec\x58\x86\x37\x40\xbd\xef\x27\
+\x26\x0b\x09\x81\x63\x6e\x1e\xf4\xaa\x43\x90\x3c\x9b\xeb\xa5\x65\
+\x9a\x7f\x26\x3d\x91\x12\x9a\xa8\xd1\xcb\xef\xbc\xf0\x4d\xfe\x0f\
+\xec\x23\x63\x37\x17\xf6\x43\xdc\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x03\x69\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x30\x49\x44\x41\x54\x78\xda\xad\xd5\x5b\x48\x53\x71\
+\x1c\x07\xf0\xef\xb9\xcc\x90\x7c\xcb\xe8\x82\x51\x22\x54\x4a\x10\
+\xd8\x05\x9f\x8a\xb2\x9e\xd4\x99\x14\xb3\x9e\x8a\x96\xb7\x15\x14\
+\xf5\x22\xa1\x64\xd2\x43\x8f\x41\x96\x76\x81\xa2\x87\x6a\x16\x74\
+\x79\x09\x8a\xd0\x74\x73\x86\xf7\x30\xba\x90\xd4\x72\xcb\xa5\x73\
+\xb7\xce\xd9\x9a\xdb\x39\xff\x7e\x67\xce\x75\xb3\xb2\x4e\x67\x63\
+\x6c\xe3\xff\xfb\x7f\xf6\xbb\xec\x7f\x38\xfc\xc5\x65\xe9\x37\x5e\
+\x65\xc0\xe6\xe6\xfc\xfb\xd9\x73\x8d\xe1\xe6\xba\xb0\xb2\xaf\xc8\
+\x6a\x5e\x55\x66\x5a\x90\x9e\x81\xa6\xe1\x1b\x63\x67\xd6\xde\x5b\
+\xfa\xdf\x80\xea\xfe\x92\x83\x5b\x97\xae\x6b\x2a\x5c\xb4\x1d\xbd\
+\xc1\x8b\x70\xcb\x41\xf4\x8d\x89\x37\xcf\xad\xbf\xbd\x47\x37\x50\
+\xd3\x6f\x34\x15\x2c\xcc\xb5\x1a\xb3\x4a\xe1\x08\x34\x23\x1a\x0f\
+\x41\xe0\x45\x78\x22\x40\xbf\x8b\x6f\x6d\x29\xb8\x55\xfe\xcf\x40\
+\x75\x8f\xd1\xb4\x61\x51\xae\x75\xe7\xb2\x1d\xb0\x07\xce\x43\xa6\
+\xcd\x79\x4e\x80\x4a\x61\xa2\xc0\xc1\x1d\x64\x18\x7a\xaf\xb6\x5e\
+\xde\x74\xa7\xfc\xaf\x81\xca\xae\x12\xd3\xc6\x25\x79\xd6\x9d\x2b\
+\x4a\x61\x0b\xb4\x40\x4a\x6c\x2e\x82\x76\xd7\x9e\xe0\xa8\xdb\x1c\
+\x0f\x38\xfd\x0c\x2f\x46\x95\x93\x57\x0a\xef\x36\xcc\x19\xd8\xdf\
+\x51\x62\x2a\xc8\xca\xb5\xee\xca\x2e\x83\xcd\xdf\x8c\x50\x8c\xca\
+\xc2\x44\xa8\xc9\xd5\x09\x80\xa3\x0f\x8c\xc3\x3c\x91\xc3\x80\x53\
+\xc5\x44\xd0\x50\x7e\x69\xcb\xf5\xd6\x3f\x02\xe6\xf6\x22\x53\x7e\
+\x56\x9e\x75\x77\xce\x0e\xb4\xfb\x2e\x40\x8e\x05\xe8\x97\x1b\xc0\
+\x12\x4b\x39\xf0\xf4\x10\x98\x00\x49\x09\x13\x1c\x40\x48\x09\x12\
+\x18\x41\xdb\xa0\x8c\x17\x43\xfe\x72\x6f\xa3\xd4\xfa\x4b\xc0\xdc\
+\x66\x5c\x97\x93\x99\xd5\x7b\x6c\x4d\x05\xba\x65\x2b\x46\xc3\xcf\
+\x31\x5f\x58\x8c\xb8\xa2\x20\xa2\x86\x11\x51\x64\x8c\x4a\x23\xf0\
+\xd2\xc6\x52\x5c\xa6\x60\x01\xa2\x81\x50\x9e\x7a\x92\xc6\xc3\xd6\
+\x1e\xc3\xc4\x5b\x65\xef\xf8\xa9\xd0\xb5\x59\x81\x7d\x8f\x4a\x99\
+\xa2\xa8\x08\x47\x59\xea\xbb\xba\x6d\x55\x70\x4d\xb5\xe1\x81\xdb\
+\x0a\x7f\x54\x82\x40\x4d\xd6\xf2\x60\x54\xa2\x49\xbf\x8a\x9e\x87\
+\xd1\x9f\x4a\xec\x3d\x2d\x71\xb3\x02\x3f\x5e\xab\xcf\x66\xb3\xda\
+\xb2\x32\xf8\x94\x61\x38\xc6\x9f\x22\x4d\x48\xc3\x0c\xcd\xe8\x8d\
+\x3f\xc0\xd0\xfb\xe8\xf3\x77\x1b\xce\x79\x8a\x66\x80\xa3\xc6\x62\
+\x44\xb8\x11\x74\x78\xba\x60\xe0\x0d\x09\x40\x61\xd4\x09\x9a\x20\
+\xaf\x8f\xe1\xd9\xe3\xb0\x3e\xe0\x48\x71\x09\x64\x5e\x03\x1c\x10\
+\x09\x48\x8d\xa9\x56\xa2\xc9\x38\x9e\x3f\xd1\x91\x41\x66\x6d\x06\
+\x6b\xa8\xaa\x80\xcc\xbd\x46\xe7\x18\x01\x34\x4d\xf1\x64\x10\x4f\
+\xaf\x93\xbe\x38\x5e\x76\xe8\x04\xea\x2b\xf6\xe3\x13\x65\x60\x73\
+\x27\x33\x48\xd6\x9f\xd1\xe4\x04\xbd\x71\xbc\xb2\xeb\x04\x8e\x1f\
+\x20\x80\x7a\x60\xff\xe0\xa0\x33\xc8\xf0\x4d\x20\x07\x1f\x95\xe8\
+\x4d\x97\x4e\xa0\xd6\x3c\x0d\x68\x19\x68\x4d\x56\x93\x21\x89\x1e\
+\x78\x63\x78\xd7\xad\x03\x48\x3f\x2c\xb2\x46\x8b\x05\x21\x61\x04\
+\x9d\xae\xee\x04\x80\xe4\xa0\x6a\x50\x80\x32\x70\x3e\xd5\x09\x34\
+\xd4\x58\x20\x51\x0f\xda\x5c\x0e\xa4\xf1\x33\x47\x06\x31\x74\x9a\
+\xfa\xc7\x63\x70\xf7\xe8\x04\x4e\x54\x55\x23\x20\xbc\xc7\x13\xb7\
+\x3d\x01\xa4\xfe\x69\x04\x04\x3f\xc6\xe0\xea\xd3\x09\xd4\x11\x20\
+\x69\x80\xcb\x9e\x9a\x22\x55\xa1\x40\x0d\xa0\x0c\x3e\x0c\xe8\x05\
+\x2a\xa7\x33\xe8\x70\xda\x61\x10\x0c\xa9\x04\xb8\x64\x06\x63\x83\
+\x3a\x81\xfa\x9a\x43\x90\xe6\x39\xd1\xfe\xce\x46\x77\x31\xba\x27\
+\xa8\x33\x00\x9d\x45\x9e\x38\x3c\x7d\x11\x7d\xc0\xca\xe5\xb9\x88\
+\xf2\x12\x9d\x3b\xe3\x54\x76\xfe\x6b\x20\x01\x53\xb2\x4a\xf7\x0a\
+\xee\xb7\xc0\x17\xde\x7f\xa5\x28\x16\x1a\xad\x2f\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x36\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xfd\x49\x44\x41\x54\x78\xda\xad\x95\x4b\x68\x13\x51\
+\x14\x86\xff\x99\x4c\x32\xc9\x34\x8f\x9a\xd6\x16\x6d\xd3\xa2\xb6\
+\x52\x44\x8b\xa0\x05\x15\x5b\xc1\xb7\x74\xa1\x15\xad\x15\xd4\x85\
+\x48\x11\x17\x22\x8a\x0b\x11\xd4\x95\xb8\x14\x04\x1f\x88\x28\x2d\
+\x1a\x2b\x2a\x2e\xd4\x14\x6c\x51\x94\x88\xa2\x12\xa9\x18\x5b\xab\
+\xa5\xb4\x69\xa2\x79\xb4\x49\x66\x9c\xc9\x24\x93\x89\x37\xad\x8f\
+\x8d\x49\xda\xc4\xb3\xb8\x03\x97\xf3\xff\xdf\xb9\x87\x73\xef\x50\
+\xc8\x23\x46\x4d\xa5\xfb\x35\xd6\xd2\x6b\xc9\xa0\xff\x9c\xed\xc7\
+\xf8\x89\x6c\xb9\xd4\x4c\xcd\x3d\xc5\x65\x4b\x18\x73\x49\x5f\xc9\
+\xf9\x76\xf0\x37\x9e\x41\xec\x71\x7e\xa8\x14\x83\xf5\xff\x0d\x30\
+\x62\x9c\x9d\x2a\xbb\x70\x1c\x34\x44\x80\xd5\x21\xe6\xfc\x82\xf0\
+\x4d\x87\x5c\x15\xf6\xe9\x0b\x06\x0c\x73\xd6\x3e\xeb\xe1\x7d\x4b\
+\xf4\x35\x26\xa4\x12\x49\xa2\xa6\x40\xb1\x5a\x24\x7d\x11\x04\x2f\
+\x3e\x84\xcd\x33\x48\xe5\x0d\x18\x32\x58\xce\x98\xb7\x35\x9f\xb6\
+\x6c\x5a\x08\x55\x20\xd5\xab\xbf\x0c\x74\x1a\xc8\x43\xe3\xf0\x5f\
+\xba\x17\x58\xc0\x07\xcb\xf2\x02\x0c\x1a\xad\xeb\x0c\x55\xf3\x7a\
+\xca\x4f\xb6\x41\xf5\xfb\xa6\x64\x29\xb2\x32\x34\x94\x1f\x2a\xc6\
+\xce\x76\xa2\x96\xf7\xff\xd3\x2b\x27\xe0\xb3\xa5\xd4\x00\x68\xc4\
+\xea\xab\x67\x40\x0d\xf7\x13\xdf\xb4\x84\xac\xa4\x3d\x8a\x94\x84\
+\xef\xf2\x23\x24\x85\x48\xd9\xc2\x68\x28\x90\x17\xc0\xad\xb7\xbc\
+\xad\x3c\x75\x6c\x19\x57\x24\x40\x89\x0a\x44\x41\x4f\x01\x68\x0a\
+\x71\x1f\x8f\xd1\xeb\x8f\xfd\x8b\x84\x40\x79\x26\x7d\x6e\x80\xb9\
+\xb4\x5a\x55\xa9\xe1\xaa\x13\x87\xc0\x99\xe2\x50\x42\x21\xb2\x4b\
+\xff\xed\x7f\x30\x86\x91\x0e\x87\x73\x71\xc8\xbb\x3a\x2f\xc0\xef\
+\x70\x31\x45\xcf\x67\x37\x6f\x6c\x2c\xdf\x50\x0f\xc5\x3b\x46\x18\
+\x14\x68\x2d\x83\xe8\x47\x2f\xc6\x1c\x4e\xe7\x52\x3e\x58\x18\xe0\
+\x0d\x6b\x74\xce\x3f\x72\x70\x95\xd1\x28\x43\xe5\x05\xd0\x0c\x03\
+\x29\x28\x62\xd0\xee\xf0\x36\xf0\xe3\x15\x79\xb7\x28\x1d\x2f\xf5\
+\xa6\xae\x8a\xb5\x6b\x5a\x2b\xb7\x36\x21\xd1\xef\x06\xa5\xd5\x42\
+\xf4\x8b\x18\xb8\xdf\x8d\x15\xd1\x50\x56\x8f\x9c\x80\x17\x06\x4b\
+\x2b\x67\xd0\x77\xd5\xb7\xef\x40\xfc\x49\x2f\x19\x4d\x72\xb1\x14\
+\x15\xef\xdd\x1e\x34\x4a\x91\x9c\xfa\xac\x09\xbd\x45\x96\x4d\x74\
+\x42\xe9\x6e\x3c\x7a\x00\xb1\xbb\x0f\xc8\x68\xd2\x90\x15\x05\x2e\
+\x72\x73\xd7\xc5\xa2\xd3\x3a\x7d\xd6\xa4\x6e\x1d\xf7\xa9\x71\xe7\
+\xf6\x3a\x66\xe0\x23\x12\x81\x00\x28\x8d\x06\x71\xf2\x44\xbc\x0e\
+\x45\xb0\x59\xe4\x0b\x07\x3c\x64\x4d\x57\x4c\x45\x5c\x7b\x83\x6d\
+\x0e\xd4\x40\x68\x72\x72\x18\x22\x09\xc7\x65\xbc\x8a\x0a\x5f\xb7\
+\xc5\x84\x9a\x82\x00\xe9\xb8\x45\xeb\x52\x5b\xd6\xae\x87\xce\xe5\
+\x02\x9d\x3e\x81\x9a\x44\xaf\x10\x49\xb7\x6b\x79\x8b\x24\xbc\x2b\
+\x08\x60\xd7\x19\xda\xe6\x96\x58\xed\x2b\x8d\xb3\xa0\x4e\x90\x07\
+\x2d\xa1\xe0\xa9\x14\x05\x4b\x51\x15\x6d\xb2\xe4\x2d\xb8\x45\x1d\
+\x8c\x4e\x6a\xae\x5b\xac\x37\x7d\xfb\x86\xef\x7f\xcc\xe9\x8a\x5d\
+\xb2\x38\x2d\xf3\xac\x80\xc9\xea\x2d\xc5\xf6\x26\xce\x08\xcf\x44\
+\x18\x4f\x63\x7c\xda\xdc\x46\xcc\x3d\xd3\x35\xcf\x0a\xe8\x64\x58\
+\xa9\x65\x5e\xad\x7e\x60\x6c\x04\x6e\x25\x81\xbd\x71\x69\xc6\x7f\
+\xbf\x8c\x80\xdb\xa4\xfa\x6a\x93\xd9\xce\x91\x99\xff\x20\x89\xd8\
+\x93\xa7\x79\x46\x40\x97\xce\x10\x37\xb3\xac\x36\x2c\xcb\xd8\x5d\
+\x80\x79\x46\xc0\x1d\x96\x4b\xa5\xbf\xad\xb2\x58\x90\x79\x3a\x7e\
+\x02\x8f\xa6\x30\x28\xea\xca\x19\x31\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x07\x0a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\xd1\x49\x44\x41\x54\x78\xda\xa5\x95\x7b\x50\x54\xf7\
+\x15\xc7\xbf\xbf\x7b\x59\x60\x61\x81\x5d\x96\x87\xcb\x7b\x59\xc0\
+\x5d\x61\x97\xc0\xf2\xae\x06\x03\x26\x34\x35\x31\x26\x93\xa0\xa2\
+\xd3\x89\xb1\x4d\xac\xd1\x89\x93\xda\x69\x9a\x51\x81\xb6\x9a\x6a\
+\x9d\xa6\x26\xa3\x9d\xd4\xa4\xa1\xe3\x03\x25\x3a\x29\x8d\x26\x60\
+\x8c\x18\x30\x46\x90\x87\x8b\x08\xc8\x02\x0b\x0b\xcb\x43\x1e\x2e\
+\xaf\x7d\xb2\xfb\xeb\xdd\xb5\x5a\x92\x50\xfb\x47\xcf\xcc\xbd\xbf\
+\x99\x73\xee\x39\x9f\x7b\xce\xef\xf7\x3b\x87\xe0\x11\xb2\xa2\xac\
+\x2f\x97\x05\x5d\x2f\xf0\x66\x0b\x42\x85\x5e\x52\x27\xfd\x8f\x8d\
+\x3a\x28\xee\x4e\x5b\x9b\xa6\xac\xce\x4b\x3c\x82\x3d\x57\x5e\x96\
+\xda\x17\x8b\x41\x16\x53\x2e\x3f\xd6\x9d\xec\xeb\xc5\xde\x48\x8e\
+\x16\xf0\xe4\x21\x7c\x84\xf8\x7b\xbb\x42\x82\x50\x02\xc2\x00\x6e\
+\x10\xf7\xb2\x51\x37\x04\x75\xdd\xd3\x18\x98\x30\x57\xd4\x6e\x89\
+\x5b\xf7\x3f\x01\x8f\xff\xb5\xeb\x88\x4c\xe2\xb3\xed\x49\x45\x20\
+\xfc\xbc\x79\x18\x9b\x31\xa3\x7d\xc4\x8c\x49\x93\x1d\x86\x31\x2b\
+\x9c\x04\x5d\x42\x5f\x36\xc1\x9f\xcf\x43\x92\x44\x80\xb0\x00\x4f\
+\xf8\x78\x79\x40\x37\x36\x8b\xcf\x5a\xc6\x0d\x66\x9b\x33\xe7\xea\
+\xd6\xa5\xfa\x45\x01\xd9\x47\x3a\xce\xe4\x29\x45\x85\xe9\x31\x22\
+\x18\x4d\x36\x5c\x68\x19\xc3\x80\xd1\x76\x82\xfb\xd1\xe3\xf5\xdb\
+\xe4\x17\x17\x7e\x9b\x79\xa4\xd3\x77\x9e\xd2\xd5\xbe\x3c\xa6\x6c\
+\xe5\x32\x21\x3f\x25\x2a\x00\x26\xdb\x3c\x3e\xbc\x32\x68\xab\xf9\
+\xb9\xdc\xeb\x07\x80\x94\x77\xdb\x4a\x0b\x92\x83\xf6\xa6\xcb\x44\
+\x30\x4c\x58\x70\xfa\xba\x61\x70\xde\x81\xf4\x86\x1d\xcb\x46\x5c\
+\x76\xf5\x9f\x5a\x33\x5d\x85\xe1\x9e\xc9\xa6\x37\x55\x3d\x0b\x61\
+\xea\xc3\xed\x25\x8a\x08\x7e\xf1\xf3\x69\x61\x30\xdc\xb3\xa0\xfc\
+\xea\xc0\xe5\x6f\xb7\x27\xe5\x3f\x04\xa4\x1d\xd4\x44\xc4\x47\x09\
+\x06\x9e\x49\x93\x60\x74\xda\x82\xb3\x75\x86\xa1\x6b\x6f\x28\xc3\
+\xdd\xe0\x83\x37\x4b\x43\x85\x9e\x7b\xe3\x23\xfd\xe0\x2a\xcb\xc8\
+\xa4\x19\xa3\x53\xd6\x59\xfd\x88\xf9\x94\x42\xea\xff\x2a\xc3\x12\
+\x18\x8d\xd6\xa9\x89\x19\xfb\xee\x55\x29\x41\xef\x2b\xa3\x03\x71\
+\xf1\xe6\x30\x6e\xf5\x4e\xab\x1b\x77\x25\x37\xbb\x01\x19\x7f\x6c\
+\xb9\xf9\x4a\x81\x34\xd9\xd3\xc3\x03\xc7\x2f\xeb\x50\xb3\x5d\xe9\
+\xd6\xab\xff\xd0\x7c\xe6\x89\xd4\x90\x42\x55\xb4\x08\x0c\xcb\x80\
+\xf9\x77\xc2\x4e\xa7\x13\xb5\x6d\xa3\x50\xc7\x89\x20\x14\xf0\x71\
+\xac\xea\x4e\xdf\xa5\x6d\x2a\xe9\x8f\x0e\x6b\xfa\xb7\x3c\x25\x8b\
+\x32\x59\xec\xf8\xb8\x5a\x77\xba\xe9\xad\xd4\x0d\xe4\xb1\xfd\x8d\
+\x4b\x54\xb1\x01\xc3\x79\xa9\x11\x68\xbc\x33\x8a\x3a\xcd\x78\x9e\
+\x66\x77\x5a\x4d\xea\x3b\x37\x2a\x56\x3e\xb6\xe4\x25\x65\xac\x18\
+\xb3\x26\x2b\xbe\x6e\x1d\x85\xfe\xae\x69\x22\x2c\x84\x2f\x4e\x8c\
+\x0e\x40\xbc\x44\x08\xab\xdd\x01\x2b\x57\xf7\x8f\xab\x7a\xca\x5b\
+\xde\x4e\x2b\x52\xfd\xee\xc6\xfa\x55\x19\x92\xf2\xe4\xd8\x20\x9c\
+\xba\xd8\x35\x57\xfd\xba\x4a\x40\x14\x7b\xae\xbf\xf3\xea\x9a\xb8\
+\xb7\xf8\x5e\x9e\x28\xab\xd6\xf6\x5f\xff\x95\x3a\x26\xa9\xb4\x5e\
+\x95\x96\x20\xd2\xe4\xa6\x84\x61\xd6\x6c\x47\xd9\x17\x5d\xfd\x76\
+\x3b\x91\xb5\x16\x67\x38\x5c\x19\xa8\x4a\x1b\xfe\x96\xad\x0a\xde\
+\x9c\x12\x27\xc6\xb0\x71\x0e\xe7\xbe\xec\x2f\x6a\xfb\x6d\x56\xb9\
+\xcb\xb6\xb6\xac\x83\xae\xcd\x8e\xc2\xa7\xd7\xf4\xa8\xdc\xac\x20\
+\x24\x63\x7f\x43\xe3\x2b\xcf\x2a\xd4\xfa\x91\x29\xfc\xe3\x4a\xdf\
+\xeb\xed\xfb\x96\x1f\xcd\xdc\x5f\x6f\xd8\xb4\x5a\x11\x36\x61\xa1\
+\xf8\xfc\xb2\x16\x16\x8b\x2d\xbc\xb5\x34\x67\xe8\xc1\xa6\x2a\xf7\
+\x5c\x7d\x41\x12\x1d\x7c\x2e\x36\x3e\x18\x9a\x96\x01\x98\x8c\xa6\
+\x58\x4d\x49\xb6\xce\x65\x7b\xfe\xa3\xdb\x74\x75\x76\x0c\x2a\xeb\
+\x7a\xf1\xd9\x6b\x4a\x42\x9e\x3e\xa2\xa1\x6b\x73\x63\x51\xd3\x3c\
+\x80\x5b\x5d\x13\xe1\x0c\x25\xc4\x4f\x2c\x18\x5c\x96\x1c\x89\x21\
+\xc3\x3d\xf4\xdf\x1e\x2a\xbf\x7d\xe0\xf1\xa2\x85\xa7\x26\xf1\x37\
+\xb5\xef\x25\xaa\xa5\x3b\x44\x62\x01\xea\xbf\xee\xc4\xcd\x92\xec\
+\x87\xa7\xf1\xc9\xf7\x35\xf4\xc5\x27\x64\xb8\xf0\x8d\x0e\xff\x74\
+\x01\x7e\x7c\xb4\x85\x3e\xb7\x22\x8e\x53\xf4\xe2\xfc\xd6\x64\xb2\
+\xec\xd7\x35\x3b\x23\x13\xc2\xde\x95\x44\x89\xd1\xd1\xd2\x8f\xb9\
+\x89\x99\xc8\xb6\x03\x2b\x07\x17\x02\x14\xbb\x6a\x1a\x32\xf2\x15\
+\xe9\x56\x6e\xb3\x35\x35\x9d\x4d\x1d\x87\xf2\xd2\x1e\xd8\x52\xf7\
+\x35\xd0\x94\xac\x58\x74\x71\xbe\x75\xbb\xd4\x5c\x06\xef\x35\xd3\
+\xcc\x2c\x19\x2a\xab\x3a\xd1\xb2\x37\x93\xc8\x7f\xf9\x55\x69\xbc\
+\x5a\xb6\xd7\x2f\x90\x8f\x3b\x37\x74\x68\xda\x93\xf5\x83\xdb\xae\
+\x7c\xbb\x96\xaa\x72\xe5\x98\xe0\xca\xda\x77\x4b\x5f\xd2\x79\x28\
+\xbf\xd4\xa5\x97\xef\xfa\x2a\x5f\x1c\x21\xbe\x24\x4d\x8c\x40\x73\
+\x75\x2b\xda\x0f\xe5\x11\x92\xbd\xef\x5b\x1a\xae\x8a\x85\xb6\xb1\
+\x07\x9a\xd2\x1c\x92\xb0\xb3\xba\x24\x36\x35\xae\xd8\x2f\xd0\x87\
+\xd3\xe9\xb8\xf4\x73\xbe\x03\x90\xbf\xf9\x65\xbe\x5f\x90\xf0\x92\
+\x94\x2b\xa1\xbe\x63\x18\xc6\xc1\xb1\xa7\x3b\xff\xfc\x54\x95\xcb\
+\x96\xb0\xa3\xba\x39\x61\xb9\x3c\xc5\x61\x73\xa0\xa7\x51\x5b\xde\
+\x75\xb8\xa0\x88\x24\xed\xae\xa5\xb2\x8c\x04\xf4\x34\xdc\x41\xdb\
+\xef\x73\xc9\xd2\xed\x9f\x97\x84\xa7\xc5\x17\xfb\x0a\x7d\xa1\x6b\
+\xd4\xba\x75\x0b\x01\xf1\xbf\x38\xdf\x17\xb7\x32\x29\xda\x83\xc7\
+\x83\xae\xb9\xfb\xa1\x3d\x61\x47\xd5\x8b\xfc\x40\xc1\x27\xd2\xb4\
+\x78\xce\xaf\x1b\x36\xe3\xac\xba\xe3\x70\x41\x33\x91\xfd\xac\xb2\
+\x57\xb1\x3a\x43\x3a\xd4\xa6\xc7\xec\xd0\xd8\x0a\xee\x5b\x89\x20\
+\x2c\xa4\x62\x89\x3c\x0c\x77\x7b\x46\x31\xa5\x33\x9c\xd4\x7e\xb0\
+\x66\x13\x17\x38\x94\x3a\x1c\x8d\xa1\x2a\x59\x84\x7f\x50\x80\xbb\
+\x07\xe8\x5d\x81\x66\x66\xb8\x56\x4b\x0e\xb0\x3e\xfc\x37\x62\xb2\
+\xe4\x98\x9b\x9c\xc1\x70\x93\xf6\x56\xf7\xb1\x35\x2a\x77\xab\x90\
+\xbd\x56\xf9\x97\x60\x65\xdc\x56\x1e\xdf\x0b\x86\xeb\x6d\x5f\xf4\
+\x1e\x5b\xfb\x13\xd9\xd6\x0b\x34\x22\x4b\x01\x96\x6b\x0d\x93\xda\
+\x21\x58\x8d\xb3\x20\x2c\x0b\xff\x98\x10\x10\x42\xdc\x37\xda\xd3\
+\x9f\x8f\x7b\xda\x61\x58\xe7\xcc\x10\x48\x02\xe1\x1f\x15\x02\xeb\
+\xf8\x14\x46\xb8\xac\x08\x0b\xbe\xf6\xe8\x33\x96\xfb\x80\x2d\x95\
+\xb9\x5e\xa1\xa2\x2b\x62\xa5\x14\x63\xf5\x1d\xb0\xcf\x98\x65\xf0\
+\x40\x28\xcf\xd3\xf3\x9a\x5f\x7c\x14\xbc\x83\xfc\xef\x77\x45\x86\
+\xc0\x64\x18\xc7\xe4\x6d\x9d\xd3\x2b\x50\xc8\x88\x95\x31\x20\x1e\
+\xac\xcb\x00\x87\xcd\x06\x63\xd7\x00\xcc\x86\x89\x11\xd6\x9b\x95\
+\x76\x7f\xf0\x9c\xe5\x3b\xdd\x54\xfa\xd3\x33\x06\x61\x66\x72\x18\
+\xe1\x86\xca\x54\x53\x3b\xd7\x32\xa9\x1f\xcb\x30\x3c\xe7\xbc\xa3\
+\x82\x15\xf0\x57\x81\xe1\xc1\x69\xb5\x80\x5a\x6d\x9f\xf4\x96\xbd\
+\x54\x28\xdb\x72\xae\x84\x1b\x3f\xc5\xac\xc0\x17\xce\x39\x13\xa8\
+\xdd\x7e\x91\xe1\x79\x1c\xef\xfe\xf0\x85\x13\x8b\x0e\x9c\x98\xcd\
+\x67\xc3\x19\x96\x37\x28\xc8\x4a\xc4\xbc\xd9\x06\x53\x43\x1b\x87\
+\xc2\xf2\xfe\xe3\x85\xdf\xe0\xff\x94\x87\x27\x24\x6a\xe3\x99\x75\
+\x84\xcf\x3b\xed\xa9\x56\x82\x58\xe7\x61\x69\xd7\x02\xd3\xd3\x7a\
+\xca\x90\x83\x9c\xf9\xfc\xc0\xa9\x8d\xfd\xdf\x77\x8e\x2c\x3a\x19\
+\xcd\x2d\xcf\x72\xfb\xb2\x93\x6b\x00\xab\x06\x4e\x6c\xe8\xfb\xaf\
+\x00\x97\x44\x14\x9d\x5c\x4f\xa9\xb3\xdc\x43\xbe\x14\x24\x34\x10\
+\xd4\x6c\x05\xee\x4e\xc2\x71\xcf\x08\xcc\x73\xb3\x66\x9a\x5b\x1d\
+\xe4\x1a\x58\x9a\x03\x7f\x21\xe0\xc1\x80\x0d\xe4\x56\x91\x10\x8e\
+\x66\x0d\x1d\x2c\xdf\xc4\x3c\x12\xe0\x92\xf0\x75\x27\x7d\x9c\x76\
+\xc7\x47\x54\xe0\xbd\x9e\x09\x5d\x02\x1a\x2c\x02\xe1\xbb\x26\xe0\
+\xfd\xa1\xff\x40\x28\xa1\x6e\x77\xca\xcd\x6c\x32\x3e\x01\x8c\x72\
+\x83\xcf\x4e\x99\xa1\x8a\x8d\xf4\x91\x80\x07\x22\x29\xfc\xbb\x17\
+\x1c\xce\x8d\x70\x3a\x36\x38\xe1\x91\x4e\xfd\x7c\x02\xb0\xd0\x95\
+\x3b\xae\x64\xca\xd8\xcb\x30\x4c\x23\x58\xf6\xf4\xf0\xd9\x97\x3f\
+\x5d\x2c\xce\xbf\x00\x45\x63\xdc\x37\xcf\x12\x3f\x7e\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xc6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x8d\x49\x44\x41\x54\x78\xda\xa5\x55\x7d\x4c\x95\x55\
+\x18\x7f\xce\x7b\xee\x05\x2e\x78\x2f\xf7\x42\x06\x04\x14\x32\xd2\
+\x2e\x24\x08\x4a\x4a\x82\x8b\x46\xd6\x8a\x96\xa5\x14\xd2\x2a\x65\
+\xba\x48\x19\x35\x6a\x4d\xd3\x0d\x36\xd7\xc7\x1f\x4d\x2b\x61\x2c\
+\xc9\x5c\x36\x53\x51\x97\xd1\x77\xf9\x95\x73\xe4\x26\x01\x57\xbe\
+\xfc\x80\xe2\x1b\x2e\x78\xe1\xbd\x9f\xdc\x8f\xf7\x3d\xa7\xe7\xa5\
+\xc1\xa4\x34\x2e\xf2\x6c\x67\xe7\x79\xf7\x9e\xe7\xf7\x3b\xe7\x79\
+\x7e\xe7\x39\x04\xe6\x60\xef\x5f\xb6\x6d\xc1\xa9\x12\x47\xd0\xf6\
+\x64\x9d\xe7\x56\x6b\x88\x1f\x20\x2f\x72\x80\x42\xe0\x70\x3f\x7e\
+\xc6\xa2\x8f\x2e\xfc\x41\x38\xb4\xa3\xdb\x41\x08\x94\xe3\xf7\xd1\
+\x1d\x29\xba\xfc\x59\x11\xbc\x67\xb2\xed\xc2\xc0\x9d\x32\xe3\x20\
+\xc9\x00\x12\xe7\x8d\x92\xc4\x9b\x39\x87\x44\x2a\x80\x9e\x08\x42\
+\x82\x8a\x02\xa8\x91\x81\x23\x5b\x59\x6a\x28\x99\x91\xc0\x96\xb9\
+\x30\x53\x77\xe1\xda\x85\xb7\x06\xf9\x9b\xba\x11\xd7\x87\x3e\xaf\
+\xd4\x2f\xba\xe4\x0d\x7b\x57\x85\x9d\xba\x79\x5d\xe1\x4f\x43\x46\
+\x20\x64\xad\x40\xe0\xed\x70\x9d\x5a\x1b\x20\x50\xb0\xca\xba\x37\
+\x3e\xc9\x20\x1f\xbb\xad\x69\x2b\x19\x0c\xb5\x04\x87\x0e\x58\xa7\
+\x08\xec\x6b\x52\xcf\x80\x4a\x95\xcd\x9d\x1e\x10\xcc\x22\x8c\xd1\
+\xf0\x0f\x76\xd7\x36\x98\xf6\x44\x91\x23\xb7\xda\xd5\xfa\xda\xc1\
+\x46\x87\x53\x5a\xc2\x39\x83\xbb\xf4\x21\x75\x24\x30\x1c\x5e\x5f\
+\x54\xdd\x94\x62\xb8\xbc\xc5\xcb\x3c\x20\xb3\x3a\x60\xf6\x9e\xe6\
+\x79\x31\xf6\x64\x62\xcb\x49\xda\x27\x44\xea\x37\x93\xf9\x61\xc0\
+\x86\x6f\x00\xf4\x8e\x02\xe9\x17\x41\x3d\x28\x66\x07\xba\x3c\xe7\
+\xfc\x29\x36\x77\x45\x66\x70\xf6\x4c\x1d\x57\xe7\x02\x63\x66\x90\
+\xa5\x6f\x40\x72\x9e\x07\x55\x17\xaf\x26\xb6\xac\x45\x9c\x44\xe9\
+\x81\xe8\x42\x80\x8b\x76\xe0\x43\x56\x60\x66\x17\x70\xab\xaf\xd9\
+\x30\x6c\x4e\xf6\x87\x60\x5c\x8c\x3d\x2d\xa8\x56\x3f\x4a\xe9\x43\
+\x48\x60\x01\x59\xfe\x15\x64\x67\x03\x04\xb4\x62\x8a\xac\xa9\x71\
+\x9c\xe8\x35\x00\x81\x2a\x00\xb7\x0f\xf8\x98\x1b\xf8\x28\xce\x2e\
+\x5f\x83\xc1\x32\xbc\xd4\x1f\x02\xc7\xa0\xae\x51\x08\xb9\x67\x09\
+\x21\x09\x78\x1c\x07\xa6\xa8\x1d\xe8\xa0\x0b\x68\x3b\x05\x22\x2e\
+\x88\xe9\x23\xc1\x34\x1a\x50\x11\x20\x31\x04\xc6\xe1\x44\xd9\xf8\
+\xd8\x71\x83\x38\x9c\xe7\x0f\x81\xbb\x41\x57\x25\x1b\x58\x11\x0f\
+\x16\x00\x50\x75\x54\x24\x20\x0c\xe0\xee\x3b\xa9\x9b\x8c\x45\x44\
+\x64\x01\x11\xce\x13\x94\x04\x97\xb9\xa2\x47\xc0\x2d\x28\xe5\xd7\
+\x1a\xc6\x86\x1d\xfe\x10\x28\xe6\xfb\x41\xcf\xd9\x3c\x8c\x53\x42\
+\x45\x01\xe8\x08\x03\xc1\x6b\x7f\x76\x42\x45\x92\x40\x8d\x08\x5b\
+\x82\x72\x4e\xe3\x94\xd6\xbb\x42\xb4\xdb\x42\xad\x16\xbb\xbf\xe0\
+\x93\xe6\xad\x36\x54\x09\x4c\x5e\x41\xbd\xf6\x56\x20\xbc\x9c\x14\
+\xe3\x45\x54\x7e\xe4\x5f\xf4\x94\xe1\x54\x8e\x07\xd0\x1e\xcb\x08\
+\xf4\x7b\xd7\xb7\xb3\x87\x4f\x72\xb5\x96\xdb\xbc\x1a\x66\xd3\x93\
+\x0d\xdf\xf5\x07\x72\x0a\x6e\x8e\x69\xe7\x4a\x86\x88\x10\x73\x38\
+\x37\xaa\x7f\x2e\x04\xb9\x35\x3d\xcb\x09\xc8\x17\x11\x2e\x9d\xac\
+\xaf\xed\xdd\x87\xcd\x65\xf3\x44\x8f\x41\x06\xa6\xcc\x8c\xcf\x3f\
+\xfe\xdc\x7d\x37\xee\x94\xe0\x89\xaf\x3a\xf1\x12\x42\x23\x96\x55\
+\x4b\xd6\x9e\xe8\x56\xb0\x6b\x10\xfc\x79\x74\xb6\x63\x6b\xd9\xc8\
+\x18\xac\x3b\x99\x17\xd7\x7c\xa7\x04\xd9\x5f\x5c\x2b\x47\x8c\xb2\
+\xdf\x36\x2e\x24\xe4\xe9\x63\x5d\x19\xdf\xe6\xc5\xfd\xfe\xe4\x91\
+\x3f\x3d\x58\x90\xa6\xef\xf3\xe3\x97\xcf\xb5\x06\x2b\xf7\x5f\xc5\
+\xde\xc8\x4e\xd4\x6d\x32\xbe\x30\xd5\xec\x72\x0e\x76\x14\x60\x72\
+\x0e\x71\x20\x25\xa7\x5f\x4e\xd8\x3b\x5b\xd0\x65\x9f\xb6\x55\xd4\
+\xbf\x9a\x58\xbc\xb4\xaa\x75\x2b\x66\xa2\x02\x9b\x61\x7a\x43\x51\
+\x62\xfd\xb4\x6e\x9a\xf9\xd9\xd5\x21\x94\x57\x04\xe3\x3c\x1a\xd9\
+\x07\xfe\x0d\x52\xf4\x63\xfa\x2b\x9c\xb0\x04\xa7\x87\x8f\x3a\x7d\
+\xec\xf3\xaf\xd7\x35\x4d\x74\xcc\x94\xca\x96\x02\x2c\xe0\x21\x54\
+\x61\x0e\x82\x9f\xc2\xfc\x57\xb6\x95\x2c\x2e\x56\xfe\x4d\x23\x58\
+\x51\xdd\xae\x91\x64\xee\x9a\x28\x36\xe3\x25\x8d\x5b\x1f\x9c\x3a\
+\xc9\x6b\x3f\xa7\x9f\x0d\xd7\xd0\x47\x04\x10\x60\x04\x5b\x8a\xd9\
+\xe6\x03\x87\x34\x76\xef\x2f\xf9\xdd\xbd\x0f\x7c\x64\x72\xe1\x05\
+\xd6\x60\x18\x6a\x11\xcc\xd7\x4b\x53\xa2\x27\xe3\xfe\xf3\x48\x2c\
+\xae\x68\xd1\xe0\x23\xf3\x17\xa6\x2b\x02\xbb\xb1\xc7\x2d\x69\x4b\
+\x57\x19\x73\x46\x0c\x01\xe1\x35\xf1\x86\x20\xa0\x18\xd1\x25\x7a\
+\xa1\xc7\xe1\x81\x91\x71\x4b\xf7\xf5\xae\x73\x8f\x53\x6a\xbd\xa2\
+\xc4\xe2\xc6\x06\xb0\x09\x24\xf5\x6d\x4b\x13\x6f\x4b\x30\x69\x09\
+\x7b\x4c\x05\x78\x8a\x83\x5e\x59\x4b\xb3\x8c\x8f\x95\xea\x03\xc2\
+\x76\xdf\xad\x09\xc0\xd4\x02\x02\xe3\x09\xec\x38\xc6\x2d\xd0\xd1\
+\x7b\x36\x8b\x70\xeb\x19\x04\x57\x73\x32\xf1\x9c\xf6\x99\xdf\x59\
+\x16\x3b\x23\xc1\xcd\xf6\xd4\xd1\x05\xbb\x82\x83\x42\x77\x6a\x29\
+\x05\x7c\xbc\xc0\xe1\x61\x60\x19\x97\x41\x94\x44\xb8\xf4\x52\xcf\
+\x34\x8c\xc8\x77\x2f\xa9\x86\x76\xa4\x4b\xb3\x22\xc8\xfc\xd2\x18\
+\xaf\xa2\xaa\x4e\x8d\xfa\x9f\xe5\x1e\x2f\xc7\xfc\x63\xfe\x64\xb9\
+\xd2\x54\x78\xa5\xf8\xff\x62\xfd\x22\x50\x2c\xed\x40\xd2\x1a\x5c\
+\x7c\x18\xdd\x20\xe5\xb6\xa3\xd2\xf6\x9b\x0a\xdb\x36\xcd\x14\xf7\
+\x37\x54\x32\x27\x6b\xac\x2e\x1f\xec\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x03\xda\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xa1\x49\x44\x41\x54\x78\xda\xad\x93\x5f\x6c\x14\x55\
+\x14\xc6\xbf\x3b\xb3\x5b\x76\x77\x66\x3a\x5b\xda\x2d\x48\x2b\xed\
+\x36\xb5\xb6\x40\x88\x8b\x3e\xa8\x44\xaa\x31\x46\x50\xfe\xd6\xae\
+\xce\x9a\x98\x98\x12\xe3\x83\x2f\xf8\xe8\x8b\x0f\x1a\x9f\x8d\x31\
+\x31\x3e\x58\x8d\x1a\x73\x87\x44\x49\x34\x42\x82\x84\x08\x29\x58\
+\x6c\x59\x58\x0a\x44\x83\x85\x14\xb1\x34\x61\x4b\xa4\xdb\xdd\xed\
+\x6e\x67\x67\xc6\x73\x67\x07\x03\x35\xe2\xb6\xf6\x9b\x4c\xe6\x6f\
+\xbe\xdf\xf9\xee\xb9\x87\x61\x81\x66\xf6\x69\x83\x81\xb5\xad\x03\
+\x95\x6b\x93\x9f\xea\xef\xe7\xf6\xe2\x7f\x8a\xdd\xf9\xf0\xe7\x1b\
+\x2a\x8f\x6c\x4f\x1a\xb2\xa2\xa0\x92\xbd\x8e\xb9\x63\x47\xcc\x86\
+\x0f\x67\x53\xcb\x02\x98\x7e\x5d\xe5\xea\xee\xa4\x51\xe7\xce\xc2\
+\x9d\xbc\x00\xc7\x5d\x01\x4b\x59\x83\xe2\xc9\x9f\xcc\xa6\x8f\x66\
+\x96\x0c\xf1\x00\x37\x5e\x23\xf3\x3d\x49\x23\x1c\x98\xc1\xe5\xf3\
+\x59\x8c\xdf\xd2\xf0\xc4\xca\x3f\x10\x0a\x38\x28\x6b\xad\x98\x3d\
+\x35\x6c\xae\xfa\x78\x69\x10\x36\xb5\x57\x1d\xd4\xfb\x92\x03\xa1\
+\xe0\x2c\xae\x5c\xcc\xa2\xf3\xcd\xe3\x1e\xf4\xb9\x5d\x2f\xd9\x07\
+\x7b\xd3\xd2\xbc\x45\x49\x9a\x5a\x90\x1b\x3e\x65\xae\xf9\x24\xb7\
+\x68\x08\xcb\xbe\xd7\xe3\x36\x3e\x96\x00\x26\xc6\xf0\xc3\x44\x1b\
+\xb6\xbe\x73\xd0\x03\x6c\xea\xdd\xee\xa6\x77\xfe\x8a\x52\x91\x51\
+\x4c\x19\x56\xac\x15\xb7\x7e\x1e\x31\xef\xff\x6c\x71\x10\x76\xf5\
+\x55\x7d\x30\xba\x2e\x36\xa0\x34\x69\x98\xcf\xbb\x48\x1e\xed\xb1\
+\xa7\x66\xf2\x72\x7f\xf3\x34\xde\xda\x34\x8d\x52\x89\xfe\xb2\x6c\
+\x82\x48\x28\xdf\xd7\x86\x9b\xa3\x23\x66\xc7\xe7\xb5\x37\xde\xab\
+\xf6\xca\x2b\x3a\x6f\xec\x8e\x19\x6a\x43\x18\x52\xa5\x0c\x54\x5c\
+\x32\x65\x28\x97\x5d\xb8\x96\xe3\x3d\xbb\x15\x07\xcc\x95\x60\xb5\
+\xb6\xe3\xc6\xe8\xa8\xd9\xf9\x55\x6d\x90\xbf\x77\xd1\xa5\x97\xa3\
+\x3c\xd6\xd9\x60\x28\x7a\x08\x4e\xc9\xf1\x0c\x3d\x90\x30\x77\xfc\
+\xfb\x79\xc7\x5b\xae\x52\x5b\x3b\xb2\xe9\xd3\x66\x17\xff\x6f\xc8\
+\x5d\x73\xf0\x8b\x11\xe5\xcd\xed\x51\x43\xd5\xea\xe0\x88\xca\x2d\
+\x51\xb9\x80\xdc\x86\x01\xae\x5d\x4d\x52\x8e\xc7\x71\xfd\x6c\xda\
+\x5c\xbf\xff\xde\x10\xb6\xf0\xc5\x85\x17\x75\xbe\xba\xa5\xde\xd0\
+\xd4\x15\xb0\xa9\x62\xd8\x3e\xc0\x86\x0f\xab\x9e\x8c\x31\x14\x3b\
+\x04\xe4\x8c\xb9\xf1\x9b\x7c\xaa\x66\x80\xd0\x58\x7f\x94\xb7\xac\
+\x56\x0d\x25\x42\x49\x7c\x88\x67\x6e\x57\x53\xd0\x14\x7a\x50\xc6\
+\x64\xcc\x75\xc6\xf1\xfb\xb9\xb4\x99\x38\x50\x48\xd5\x0c\x10\x4a\
+\xf7\xd5\xf3\xb5\x31\xcd\xd0\xc2\x41\x4a\xe2\x57\xee\xf8\x57\x01\
+\x22\x2e\x2a\x36\xed\x2d\x19\x85\x07\x3b\x70\x35\x73\xc6\x7c\xf8\
+\xbb\x7f\x42\xfe\x15\x20\x34\xb2\x4b\xe7\x6d\x8d\x8a\x51\x5f\x17\
+\x84\x53\xb9\xbd\x5c\xbe\xb9\xed\x03\xe9\x2a\xd1\x91\xef\xee\xc0\
+\xe5\x73\x19\xf3\xd1\xef\xef\x5e\xae\x7b\x02\x84\x86\x77\xe8\x3c\
+\x1e\x8d\x18\x7a\x30\x40\x8d\xf7\x4d\xdd\x3b\x40\x4e\xb5\xf1\x92\
+\x2b\x23\xbf\x2e\x8e\xdf\xc6\xce\x9a\x9b\x0f\x15\x53\x35\x03\x84\
+\x86\x9e\xaf\xe7\x0f\x68\x21\x82\x50\x4f\x6c\x3f\x89\xed\x9b\x0b\
+\x88\x00\x0a\x08\x0b\x20\xd7\x13\xc7\x25\x4a\xb2\xe5\x70\x75\xb9\
+\x6a\x02\x08\x1d\xdb\xaa\xf1\x2e\x2d\x62\x34\xc8\x12\x41\x50\xdd\
+\x55\x64\xce\xc8\x9c\x89\x54\x0e\x59\xd1\xbc\x48\x92\x8c\x5c\x77\
+\x1c\x17\xc7\x32\xe6\x53\x47\x8a\xa9\x9a\x01\x42\x47\x9f\xd5\x78\
+\x77\x24\x64\x34\x32\xea\x09\x19\x3b\x64\x2c\x11\x64\x82\xa6\x5f\
+\x84\x8a\x50\xbd\x2a\xcd\x88\x4c\x45\xb0\xf5\x5d\xc8\x64\x32\x5f\
+\x2e\x0a\x20\x74\xf8\x19\x95\x6f\x08\x87\x8c\x95\x12\xed\x2e\x51\
+\xb1\xcd\x30\x4e\x80\x29\xc7\xda\x21\x33\x5c\x23\x4e\x92\xd8\x25\
+\xaa\xe0\x05\x89\x89\x69\x59\x82\x0e\x3d\xad\xf0\x0d\x75\x21\xa3\
+\x59\x0a\x7a\x3d\x9f\xac\xcc\x63\xdc\x2a\x27\xb6\xfd\x58\xc8\x2c\
+\xfc\x77\x49\x00\xa1\x6f\x9f\x54\x78\x22\x14\x36\x56\x49\x01\xdc\
+\xac\x58\x38\x5d\x2e\xed\xdb\x79\xbc\xf0\xc1\xb2\x01\x84\x0e\x6c\
+\x89\xf0\x47\x08\x12\x61\x12\x86\x8a\x85\xb7\xf7\x0c\x15\xdf\x5d\
+\x56\x80\xd0\xfe\xc7\xc3\xbc\x57\x51\x8c\x13\xc5\x42\xa6\xff\xe4\
+\x5c\x62\xd9\x01\x42\x5f\x6f\x0e\x7f\x41\x0d\xdd\xd8\x77\xa2\xf8\
+\xd0\xc2\x6f\x7f\x01\x23\x3e\xb5\xb4\x40\xad\x14\xec\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x03\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xca\x49\x44\x41\x54\x78\xda\xad\x56\x5d\x6c\x53\x65\
+\x18\x7e\xbe\x73\xda\xfd\x39\x37\x60\x1d\x25\x4c\x84\x0c\xdc\x58\
+\xcc\x48\x3a\xfe\x54\x26\x7a\xb1\x01\x26\x43\xc5\x98\x69\xa6\x4b\
+\x4c\x74\x18\x12\x13\x59\x8c\x09\x17\xca\x05\x24\xc6\x0b\x22\x81\
+\x8b\x11\x83\x84\x44\x0d\x46\x89\x9d\x66\xb0\x31\x92\x29\x3f\x4e\
+\xb7\x69\xbb\x41\xd9\xd8\xca\xe6\x52\x1d\xeb\x7a\x4a\xe9\xcf\xba\
+\xb6\xe7\xef\x3b\xbc\x07\xd2\x5b\x72\xe8\x78\x93\xd3\xd3\xf4\x9c\
+\xf7\x7d\xbe\xef\x79\xde\xf7\xf9\xca\x60\x31\xaa\x7e\x9a\x29\xd5\
+\x38\x62\x22\x67\x7b\x6e\xb5\x54\xfc\x62\x35\x8f\x59\x7d\xb1\xbe\
+\x37\x68\x5c\x6c\x74\xa2\x7d\x24\x8a\x0b\x9e\x78\x4d\xa0\xad\x72\
+\xfc\xb1\x01\xd4\xba\x67\xe6\x2e\xbf\xb6\xd2\x39\x10\xd5\x51\x59\
+\x22\xa0\xf5\xfc\x1c\x42\xb7\x53\x8e\xff\x3e\x7a\x26\xb2\x68\x80\
+\x55\xdf\x4c\x49\xe7\x9a\x57\x97\xdf\x85\x81\xab\x11\x15\x4c\x64\
+\x68\x5c\x6a\xc7\xbe\xee\xff\x11\x9a\xce\x2c\x9f\x3d\x50\x13\xce\
+\x19\xa0\xa2\xc3\x1f\xee\x69\xad\x74\xe8\x02\xd0\x29\x29\x60\x06\
+\xa0\x13\x10\x33\x18\x76\x3b\xf3\xb0\xb7\x33\x80\x91\xd6\xb5\x2c\
+\x27\x80\x15\xc7\xc7\xc3\xdd\xef\xaf\x73\x70\xfa\xde\x15\x52\xc0\
+\x0d\x83\x2e\x80\xd3\x47\x86\x7e\xb4\xd3\x4e\x5e\x2e\xcb\x43\x5b\
+\x87\x5f\xba\xfd\xd9\xb3\xce\x47\x02\xa8\x38\x36\x7e\xb3\xa7\x6d\
+\xdd\x7a\x8d\x9e\x76\xce\xca\xb4\x6a\xc0\xa0\xc2\x0a\x15\xd6\x74\
+\x03\x2a\x5d\x32\xe7\xb0\x11\xc8\x4b\x65\x76\x7c\xd2\x31\x11\x09\
+\x1e\x76\x39\x2c\x01\x38\x0e\xfa\xba\xba\x0f\xd4\x34\x15\xe7\x31\
+\x9c\x99\x55\x20\xcb\x44\x8a\x06\xa8\x44\x8d\xaa\x19\x04\xc0\xa1\
+\xd2\x6e\x74\x42\x55\x68\x47\x62\x9e\x80\xe6\xa7\xf3\xf1\xe1\xa1\
+\xd1\xc0\xdc\xd1\x8d\x6b\x1e\x0a\xb0\xea\xe0\x35\x4f\x79\x65\x71\
+\xdd\x4e\xd7\x12\xf4\x4d\xa7\x90\x96\x39\xce\x34\x3d\x05\x77\x30\
+\x83\xd9\xa4\x42\x85\x19\x74\x1a\x06\xb3\x30\x61\xe2\xda\xd0\x1d\
+\x18\xa4\xcf\xb2\x52\x1b\x92\x52\x06\xe1\xb1\x88\x47\x3a\xf9\xe2\
+\x26\xcb\x22\x17\xbd\xf3\xc7\x44\xe0\xbb\x17\xaa\x8e\x4f\xa6\x30\
+\x1d\x57\x40\x8b\x87\xaa\xd2\x0e\x28\x8b\x0b\x22\x2e\x7d\xe5\xf1\
+\xcf\x9f\x6d\xa8\xce\xb9\x8b\x8a\x5a\xae\x78\xa7\xbe\xaf\x77\x1d\
+\xf1\x27\x71\xeb\x8e\x0c\x83\xa8\xd1\x48\x18\x53\x78\xcd\x26\xc2\
+\x7b\xd4\x3b\x1c\x75\x37\xd4\xe5\x0e\xd0\xfc\xfb\x75\xff\x0f\xdb\
+\x6b\xbf\xf0\xcd\x63\x32\xa6\x52\x8f\x92\xb8\xa6\x0e\xa4\x07\x67\
+\x36\x8c\x9d\xf8\xc7\x17\xef\xdc\xb5\x21\x67\x80\xc2\xd7\x7b\xaf\
+\xdf\xf8\xb9\xa1\xf6\xd0\x48\x1c\x93\x92\x6c\x0e\xc1\xfd\x0e\xd2\
+\x29\x4d\x17\x45\x04\x4e\x0c\xf8\xa2\xe7\x5f\x5d\x04\x40\xe3\x39\
+\xaf\xf7\xc2\x2b\xae\xcf\x07\xa3\xf8\xd7\xa4\xc8\xdc\x84\x09\x40\
+\x3a\x68\x76\x01\xa1\xaf\x07\x86\x63\x7d\x6f\xe6\x4e\x51\x61\xfd\
+\xd9\x89\xa1\xdf\xde\xa8\xfa\xf4\xaf\x08\x66\x82\x34\x6c\x5c\x03\
+\xa7\xe2\x0a\xe9\xa0\x32\x01\x89\xd3\xfd\xfe\xf8\xd5\x16\xeb\x22\
+\x97\x35\xf7\x78\x0a\x96\x96\xd4\x15\x57\x2f\x83\x9c\xd4\x90\x4a\
+\xab\xf8\x72\x7f\x35\x4e\x0d\x27\x20\x85\x32\xe0\xe6\x3c\x70\x1d\
+\x2a\xb1\x45\x52\x40\x19\x0e\x3e\x48\xa4\x5e\x35\x62\x49\xb0\x44\
+\xd4\x13\xef\x7b\xfb\xe1\x6d\x5a\xba\xc3\xdd\xb5\x76\xef\xd6\xa6\
+\xfc\xb2\x02\xa4\x12\x2a\xd2\x09\x05\x9a\xa2\x51\xff\x9b\x1d\x44\
+\x2d\xaa\xd2\x9d\xe6\x83\x06\x99\xe8\x12\x48\x6c\x4a\x5a\x90\x21\
+\xfc\xe9\x0b\xcc\x5f\x6a\x59\x63\x89\xa2\x92\x1d\xee\x9b\x2b\x5b\
+\x37\xaf\x17\x0a\x18\xd2\xf3\x34\x60\x64\x3e\x9a\xf2\xa0\xb8\x4e\
+\x77\x9d\x6c\x83\x13\x08\x44\x5a\x39\x3d\x67\x83\x23\x91\x85\xfe\
+\xf7\xac\x59\x45\x36\x9e\xdc\xf6\x63\x78\xc9\x5b\x9b\x1c\x7a\xa1\
+\x08\x25\x45\x43\x96\xa6\x55\x6b\x26\x80\x69\x1d\xa6\xdb\xd9\xc0\
+\x08\xcc\xe8\x1b\x90\x16\x86\x3e\x78\x34\xb3\xcb\xc6\x13\xcf\x7f\
+\x1b\xce\xdf\xb5\xd9\x61\x14\xd9\xa1\xa5\x48\x60\x85\xda\x88\xb8\
+\x27\x2b\x05\x68\x92\xf9\xc5\xbf\x91\xee\x7f\x37\x37\xbb\xce\x46\
+\x91\xeb\xa4\x84\x86\x2d\xe5\x8c\x40\xee\x7b\x05\xd1\x02\xd3\x93\
+\x7a\x07\x81\x64\x74\x79\x66\xb4\x3d\xf7\x03\x27\x1b\x85\x1b\x4f\
+\xcd\x09\x4d\xdb\x9c\xb0\x51\x71\xb2\x68\xfd\xd7\x2b\xc4\x7d\xc2\
+\x21\x8f\xb5\x2f\xfe\xc8\xcc\x46\xc1\x73\xa7\x0d\x71\xf7\x76\xf0\
+\xcb\xa3\xe0\x33\x53\x35\x54\xfc\xf1\x1d\xfa\x66\xe4\xd7\x1e\x2b\
+\xa5\x23\x2d\x06\xc6\xf6\xc8\x37\x3e\xb6\xfc\xb7\xe5\x1e\xa2\xfe\
+\xed\x28\xd2\x3a\x4b\xd2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x06\x54\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x1b\x49\x44\x41\x54\x78\xda\x85\x56\x7b\x50\x54\x65\
+\x14\xff\x7d\xf7\xee\xdd\x5d\x96\x65\x59\x5e\x12\x0b\xe6\xae\x28\
+\x10\xe6\x82\x82\x48\x5a\x62\x6a\x61\x9a\xda\x38\xa5\x36\x6a\x3e\
+\x22\xc7\x56\x6d\x7a\x4c\xa3\xf5\x87\x4d\x8f\xc9\xc9\xa4\x2c\x13\
+\x1c\x73\xcc\x0a\x13\x7c\x50\x46\x3e\x18\x47\xc2\x37\x02\x0a\x2b\
+\x2a\xa2\xc2\x62\x81\x09\x2c\x2f\xf7\xc9\xee\xde\x7b\xfb\xf6\x2a\
+\x68\x21\x7a\x66\x76\xee\x9d\x6f\xbf\x7b\x7e\xbf\x73\xbe\x73\x7e\
+\xe7\x23\x78\x88\x69\xa7\x7e\x97\xc1\xf3\xc2\x3c\x81\xe7\x33\x05\
+\x41\x34\x28\xd5\x01\xd2\xba\xdb\xee\x02\xc3\x10\x0b\xc3\xb2\xc5\
+\x2c\xcb\xe4\x77\x1d\x5e\x79\x6c\x20\x1f\xe4\x41\x8b\xa1\xd3\x73\
+\x93\x3c\xee\x9e\x8a\xa0\x88\x10\x6e\x48\x5c\x34\x62\x0c\x61\x08\
+\xd1\xaa\xa1\x50\x72\xd2\xff\x3d\x6e\x2f\x3a\xbb\xec\x68\xb2\xb4\
+\xe3\xc6\xd5\x66\xd8\xda\x3a\xbd\x72\xa5\x62\x4c\xc7\x81\x37\xcd\
+\x8f\x04\x08\x9d\x9e\xb3\x99\x30\xac\x29\x6d\x92\x11\xfa\x61\x91\
+\x50\xaa\x64\x20\x22\x81\x20\xfe\x77\x1f\x43\xbf\x14\x89\x08\xb7\
+\xd3\x87\xc6\xeb\x2d\x28\x2f\xb9\x00\x51\xe0\x73\x3a\x0e\x98\x56\
+\x0c\x08\x10\x36\x6d\x6b\x41\xd0\x63\xda\x39\x93\x5f\x30\x22\x2c\
+\x22\x10\x22\x58\xf8\x3d\x93\xbb\xbb\x7a\x9f\xa2\x78\xdf\x93\x22\
+\x11\xf0\x68\x6f\x73\xe0\xe8\xa1\x0b\xb0\xdd\xea\xda\xdd\x7e\x70\
+\xd9\xdc\x7e\x00\x91\xb3\xb7\x6f\x56\x87\xaa\x4d\x2f\xcd\x4e\x85\
+\x4a\xad\xa2\x6c\x04\x78\xa8\xf3\x6e\xb7\x0f\xed\x76\x1f\x9c\xf4\
+\xdd\xe7\xa3\x4e\xe9\x5e\x96\xe2\xaa\x59\x82\x50\x35\x0b\x8d\x42\
+\x06\x25\xc3\x80\x91\x31\x70\xd8\x9c\xf8\xad\xb0\x12\xf6\x0e\x7b\
+\x4e\x4b\xe1\xd2\x15\x7d\x00\xd1\x73\x7f\x4a\xe2\x79\xb1\x7a\xee\
+\xc2\xf1\x18\x14\xa6\x81\x8b\x7a\x6a\xbe\xed\x81\xd5\xc9\x4b\xa9\
+\x60\xee\xf2\x10\xa8\x7b\xb5\x5c\x86\x40\x39\x87\x5b\x36\x17\x94\
+\xd4\xa9\x86\x53\x48\x44\x38\xba\x31\x4a\xcb\xc2\xd6\x6d\x43\xc1\
+\x4f\xa7\x28\x09\x92\xdc\x5c\xf0\x9a\x99\xdc\x61\xbf\xc3\xf3\xec\
+\xd4\x91\xdc\xd8\x14\x3d\x6e\x76\xf5\xe0\x2f\xfa\xf3\x3b\xed\x4b\
+\x89\x9f\x09\xcd\x07\x4b\x64\x98\x6c\x08\x44\xbb\x8b\xc7\xd9\x9b\
+\x76\x30\x02\x90\x33\x2d\x06\x21\x81\x32\x1c\xaf\xef\xc6\xbe\x6b\
+\x76\x18\x06\x05\xe0\xec\xb9\x46\xfc\x79\xb8\xc6\xdb\x52\xb8\x58\
+\x4e\x06\xcf\xcf\xcf\x50\xa8\xb8\xd2\x55\x59\x13\x60\xe9\xf2\xa1\
+\xc3\xe9\xa1\xac\xc9\xdd\x43\xa4\x87\xcb\x0b\xe0\x3d\x02\xf4\x21\
+\x1c\x4c\xe9\x11\x88\x0a\x92\xe3\xab\x93\x2d\xa8\xb2\xf6\xc0\xeb\
+\xf1\x21\xfb\x79\x1d\xa2\xb5\x4a\x14\xd7\x75\xe1\x07\x73\x27\x8d\
+\x22\x00\x06\xad\x0c\x9b\xb6\x1d\x47\x8f\xd3\x3b\x91\xc4\xcc\xcf\
+\xcf\x4d\x4b\x37\x2c\x4f\x19\x6d\x40\x23\x65\xce\x4a\xcc\x89\xc4\
+\xda\x65\x77\x43\xf4\xf1\x58\x36\x36\x12\xe3\x87\x6a\xfa\x8a\x61\
+\x7d\x49\x33\x1a\x3c\x04\x8e\x6e\x17\xd6\x4d\xd1\x21\x26\x2c\x00\
+\x87\x6b\xad\xd8\x55\x73\x1b\x0a\xb5\x02\x7a\xad\x1c\xe7\xce\x5b\
+\x50\x5e\x66\xd9\x42\xa2\x17\xec\x6e\x58\x30\x7f\x8c\xc1\x49\x94\
+\x12\x6b\xbf\x73\x1b\x6d\x24\xab\xd5\x81\x05\xa9\x11\x78\x79\xd4\
+\xa0\x7e\x7d\xb2\x74\x57\x1d\xba\xb8\x40\x08\x0e\x07\x72\x66\xe8\
+\xa1\x0b\x55\xe0\xc0\xc5\x36\xec\xa9\xbd\x0d\x6d\x70\xa0\x54\xd2\
+\x2a\xd1\x8d\xbc\x9d\x15\x16\xa2\x9b\x5f\x20\x2e\x7e\xe3\x59\x78\
+\xe9\xa2\xcb\xd9\x83\xe6\xe6\x76\x8c\x88\x52\xe1\xe3\x17\x87\xd3\
+\x73\x78\xb0\xcd\xca\xad\x82\x2d\x28\x14\x4d\xf5\x6d\xd8\xbf\x2c\
+\x0e\x4f\x44\x69\x70\xd0\xdc\x8a\xbd\x57\xec\xb4\xbc\xd5\xb4\x7c\
+\x45\x28\x64\x04\x3b\xbe\x2f\x05\x19\x66\x2a\x12\x17\x2e\x1a\x8f\
+\xbf\xea\x5b\xc1\xf1\x3e\x7c\x3a\x73\x38\xc2\x35\xf2\x87\x29\x08\
+\x66\x7e\x53\x09\x5e\x17\x85\x86\xba\x7f\x50\xb8\x94\x02\xe8\x34\
+\xd8\x74\xb4\x01\x47\x1b\xdd\x30\xc6\x85\xd3\x72\x16\xa5\xae\xcf\
+\xcb\x3b\x03\x92\xf0\xee\x51\x71\xd1\xbc\x54\xd4\x5d\x69\xa2\x21\
+\xb8\xf0\xf5\xc2\x27\xa1\x0d\x50\x3c\x14\x60\xda\xfa\x53\x50\xc6\
+\x0f\x47\xad\xb9\x11\xfb\x28\x40\x62\x8c\x16\x1b\x8f\x5c\xc7\xd6\
+\xb2\x4e\xa4\x8d\x1a\x82\xd8\x60\x16\x2c\x27\xc3\x8f\xf9\x65\x20\
+\x86\x55\xc5\xe2\xdb\xaf\x3f\x85\x4b\xad\x6e\x5c\xaa\x6d\x85\xf9\
+\xc4\x25\xbc\x9a\x19\x8b\xad\x59\x29\x03\x02\x4c\xf9\xac\x14\x11\
+\xa3\x8d\x30\x57\x5c\xc5\x9e\xc5\xf1\x18\x31\x24\x04\xd9\x07\xea\
+\xf0\x73\x55\x37\xe2\x8c\x7a\x68\x64\x22\x46\xea\x54\xf8\x66\x3b\
+\x8d\x20\xfe\x9d\x92\x86\x8c\xe7\x12\x0d\x76\x0f\xed\x50\xda\x38\
+\x54\x35\x71\xf9\xc2\x0d\xd4\x57\x5d\xc5\xc6\x55\xe9\x58\x92\x11\
+\xdb\x0f\x60\xd2\xda\x23\x78\xfc\xe9\x54\x54\x9c\xba\x82\xfc\x25\
+\xf1\x18\xa9\x0f\xc5\x97\x45\x97\xf1\x4b\xb5\x0d\xc6\xd1\xb1\xf0\
+\xd2\xca\xa3\xd5\x8c\x63\x47\x2e\x5b\x48\xe2\x07\xc7\x72\x0d\x89\
+\x83\x97\x47\x46\x04\x49\xce\xfd\x55\xc4\xb0\x0c\x5c\x6e\x0f\x4e\
+\x15\x9b\xe1\x6c\xb7\xe2\x64\xf6\x74\xc4\xe9\xb4\x7d\x00\xcf\xac\
+\x39\x8c\xc4\x17\xc6\xe1\x64\x49\x0d\x76\x2d\x4e\x80\x91\xaa\xed\
+\xfa\xdf\x2f\x62\x97\xd9\x8e\x94\xf4\x38\x49\x66\x5a\xda\x6c\xb0\
+\x5c\xfe\x7b\x0b\x31\x7e\x74\x26\x23\x20\x48\x59\x9a\x92\xa6\x87\
+\xd7\xcb\xfb\xf5\xe0\x8e\x48\x51\xad\xe1\x64\x32\x34\x37\xb5\xe3\
+\x50\x5e\x29\x46\xc4\x87\xa1\x7c\xc3\x0c\xb0\xb4\x96\xc7\xbd\x5f\
+\x84\x94\xd9\x93\x50\x72\xa8\x0a\x3b\x29\x40\xf2\xd0\x70\xac\xdb\
+\x6b\x46\x41\xad\x03\xe3\x32\x12\x25\x05\x38\x57\xde\x08\x97\xcd\
+\x3d\x51\x12\x03\xe3\xda\x32\x4f\x52\x9a\x9e\x0b\xa6\x4d\x22\x88\
+\xf7\x74\x99\xaa\xb1\x14\x0d\xa7\x94\xa3\xec\xc4\x45\x9c\x2e\x3c\
+\x86\x35\xa6\x89\xf8\xe3\x78\x3d\xa6\x66\xcd\xc2\xc1\xfd\x15\x28\
+\x5a\x65\xc4\xd0\xc8\x60\x6c\x28\xaa\x41\x5e\x65\x37\x26\x65\x26\
+\xc3\xda\xe9\x80\xb9\xbc\xd1\x7b\xe1\x93\x74\xb9\x04\x30\xfa\xf3\
+\xca\x24\xc2\xc9\xaa\x27\x8c\x33\xd0\x34\x41\xaa\xe3\xff\x68\x3a\
+\xa5\xc4\x72\x2c\x78\x9a\xc2\xe2\x5f\xcb\x60\xbd\x71\x0b\x59\xab\
+\x5f\xc1\x45\x7a\x56\x7f\x6c\xca\xbf\x23\xaf\x74\x66\xcc\x58\xf9\
+\x32\x12\x12\xa2\x51\x72\xe2\x3a\x44\xaf\x2f\xf9\xfc\x87\xa9\xe6\
+\x3e\xb9\x4e\xfd\xa2\x7a\x73\x70\xb8\xca\x34\x36\x49\x07\x8f\x57\
+\xe8\x07\xd2\x0b\x24\xa3\x40\xfe\xa7\x5f\x87\xa4\xe8\xa8\xb2\x4a\
+\xa2\x28\xfa\xa5\x59\xc0\xe9\xf3\x4d\xe8\x6e\x73\xe4\x54\xae\x4e\
+\xbe\x27\xd7\xbd\x36\x26\xbb\xa6\x20\x24\x3c\x70\x4e\xea\x88\x41\
+\xd2\xa0\xf1\xa7\xab\x3f\xcc\xff\x40\x01\x49\x1c\xfd\x3a\x53\x79\
+\xa9\x15\x9d\x56\xc7\xee\x8a\xf7\x46\xf6\x1f\x38\xbd\x96\xf6\xed\
+\x95\xcd\x9c\x9c\x98\x92\x29\x48\xb8\x46\x09\x3a\xf4\x25\x6d\x79\
+\x50\xda\xfc\xda\x45\x87\x3e\xac\xb7\xdd\xa8\xa6\xce\xbd\x1e\x31\
+\xa7\xfc\xad\x84\x81\x47\x66\xaf\xa5\xe7\x5c\x4b\xe2\x45\xb1\x22\
+\x34\x58\xce\x0d\xd6\xa9\x11\x4e\x8b\x5a\x45\x27\x57\x5f\x38\xf4\
+\x2b\x67\x8f\x0f\x56\x9b\x07\x7f\xd3\xb9\xd0\xd1\xed\xf1\xb2\x84\
+\x8c\x29\x33\x0d\x7f\xf4\xd0\xbf\xdf\x26\x6c\xab\xa7\xd7\x16\x32\
+\x4f\x60\xc4\x4c\x51\x80\x41\xa1\x64\xa5\xf5\x1e\x37\x0f\xc2\xc0\
+\xc2\x08\x84\x5e\x5b\xc4\xfc\xe3\x59\xb1\x03\x5e\x5b\xfe\x05\xb9\
+\x78\x8c\x1d\x83\xaa\xaf\x97\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\x31\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xf8\x49\x44\x41\x54\x78\xda\x95\x95\xeb\x6f\x14\x55\
+\x18\xc6\x9f\x5d\x76\xb7\x14\xba\x17\x68\xb7\x96\x5e\xc1\x44\xa5\
+\xda\xaa\xf1\x5b\x6d\x15\x83\x8d\x31\x48\x42\xa2\x18\xf8\x40\xd4\
+\xaf\x26\xc6\x3f\xc1\x4f\x7e\xd0\x14\xeb\x35\x7e\x50\xa3\x95\x82\
+\x20\x8b\xa2\x31\x6a\xd4\xc4\xc4\x20\x35\x92\x50\x5a\xaf\x40\x35\
+\xd6\xd6\xdd\xd9\x96\x6d\xbb\x3b\xf7\xcb\x99\x39\xbe\x67\x86\x35\
+\xab\x76\xdb\xce\x24\x27\x33\x9b\xec\x79\x7e\xef\xf3\xbc\xef\x99\
+\x89\xa0\xce\xd5\x7b\x7c\x89\x1b\x36\xc7\xf6\x2d\xd0\xe4\x8a\x03\
+\xc7\x71\xc1\x0d\x0f\xdc\x61\x70\x2d\x06\x46\x77\xf1\xec\x59\x6c\
+\xab\xab\x58\x28\xbf\x33\x10\x59\x4d\x27\x52\x0f\xd0\xf9\xc6\x22\
+\x7f\x6e\x7f\x06\xb7\xa5\xe3\xf8\x78\xd9\x85\xc1\x23\xe0\x8c\xc3\
+\x70\x68\x31\x8f\xee\x1e\x18\x03\xf2\x79\x13\x53\xa7\x7f\x86\x7a\
+\x62\x28\x1c\xa0\xfd\xf5\x22\x7f\xe5\x60\x33\xee\x48\xc5\xf0\xa5\
+\x0c\x50\xf1\xb0\x5d\x01\x00\x4c\x02\x69\xb4\x4c\xd7\xc3\xac\xe4\
+\xe0\xfb\xb7\x2e\x42\x3b\x75\x6f\x78\xc0\xe8\xc3\xcd\xe8\x23\xc0\
+\xe7\x65\x0e\xdd\x25\x61\x02\x58\x54\xb9\x4e\x2e\x74\x83\xc3\xa6\
+\xdd\x73\x92\x85\xe9\xf1\x49\x02\xdc\x17\x12\xf0\x9a\xc4\x47\x1f\
+\x69\x41\x7f\x3a\x86\x8f\x56\x3c\x1f\xc0\x48\x5c\xb5\x41\x00\xfa\
+\x6d\x91\x03\xda\x5d\xa0\x88\x7e\x39\x3e\x0d\x2d\xb7\x27\x1c\x60\
+\xc7\xab\x12\x7f\xe1\xd1\x66\xf4\x27\xe3\xc8\x2d\x51\xe5\x4c\x2c\
+\x0f\x9a\x15\xb8\x50\x44\x1f\x58\x04\x52\xde\xc2\xcc\xe9\x49\xe8\
+\xb9\xbd\xe1\x00\x6d\x2f\x15\xf8\xe8\x21\x8a\x28\x99\xc0\x99\x52\
+\x20\x68\x53\xfe\x9a\xed\xf9\x0e\x54\x5b\xf4\x00\x28\x92\x83\xd9\
+\xdc\x25\xe8\x1f\xdc\x1f\xd2\xc1\x8b\x05\x3e\x42\x80\x5b\x09\x70\
+\xaa\x14\x88\xda\x54\xbd\x72\x1d\xa0\xd3\x04\x19\xe4\x6a\xf1\x4f\
+\x03\xf3\x9f\x4c\xc1\x38\x33\x1c\xd2\xc1\xcb\x79\x3e\x72\xb0\x05\
+\xbb\x09\x70\x72\xd1\xf1\xb3\x37\x6d\x51\x39\x45\x43\xcf\xe2\xae\
+\xd3\x7d\xa5\x60\xa0\xf8\xe9\x34\x39\x08\x0b\x38\xfa\x17\x7f\xfe\
+\x70\x16\x37\x13\xe0\xc4\x02\x83\xaa\x7b\xfe\x19\xd0\x41\x23\xaa\
+\x8b\x26\x53\x3f\x68\x92\x96\x8b\x26\x96\xbe\x98\x82\xf9\xe1\x03\
+\xe1\x00\x2d\x23\x73\xfc\xe8\xe1\x56\xf4\xa6\x1a\x30\x96\x67\x28\
+\xd3\x18\x99\x1e\x01\x28\x7b\x21\xae\x9a\xd4\x17\x72\x20\x4b\x3a\
+\x94\xaf\x7e\x80\x71\xb6\x0e\xe0\xa6\x67\x7e\xe4\x0d\xfd\x1d\x48\
+\x6c\x8d\xc3\xd6\x1c\x24\x1b\x63\x50\x0c\x06\x67\x41\xc7\x53\x0f\
+\x65\xd1\xd3\x14\xc3\x59\x89\x41\x21\x41\x9b\x72\x57\x2c\x97\x9e\
+\x09\x42\x2e\x34\xea\x85\xbc\x64\xc2\x98\xf8\x0d\x2c\x12\x01\x33\
+\x4c\x20\x16\xff\x37\xa0\xed\xc9\x0b\x3c\x99\x6d\xc4\xde\x03\x37\
+\x62\xb8\x67\x33\x06\x32\x51\xbc\x57\xa2\xe6\x51\xa5\x0e\x55\x2a\
+\x8b\x79\xf7\x9b\x4a\x8b\x84\x45\x2c\x2a\xb9\xd1\x08\xa8\x5e\x77\
+\xa2\xd1\x29\x87\x61\x00\xd1\x4d\x18\xb8\x2b\x8d\xef\x26\x4a\x68\
+\x9b\x97\x50\x2c\xd9\x41\x44\xb5\x90\xfd\xdd\x71\xec\x24\x37\xe3\
+\x92\x8b\x92\x78\xb9\xb9\x22\x16\x02\x55\xa3\x11\x00\x53\x00\x5c\
+\x1f\xa0\xd3\x7f\x6c\xdd\xf2\xab\xed\xbd\x3d\x8d\x5f\x2f\xad\x20\
+\xf3\xfb\x02\xca\x32\xb9\x79\x7f\x4f\xe4\x9f\xdc\x3a\x9f\xbe\xc8\
+\x1b\x33\x09\x1f\xb2\xaf\x63\x13\xd2\x8d\x09\xbc\xf9\x87\xed\xcf\
+\xbe\xc3\x3d\x54\x48\xd8\xf4\x01\x9e\x5f\xbd\x88\x4c\x38\x31\xc4\
+\xcb\x89\xfe\xd4\x75\x4b\x0a\xf3\x57\x64\xa4\x67\x16\x50\x51\x03\
+\xf1\xff\x35\x39\xf5\xf8\x79\x7e\x43\x4f\xca\x87\x1c\xda\xd5\x80\
+\x6f\x8a\x36\x26\x95\x08\x09\x07\xa7\xb7\x5a\x7d\xe0\x80\xfb\xbd\
+\xf2\x34\x13\xed\xbb\xb7\xa1\x70\x99\x2a\x27\xf1\x72\x8d\xf8\xaa\
+\x53\x54\x85\x64\xee\xd9\x85\x67\xef\x4c\x60\xe2\x1a\xc3\x67\x79\
+\x0f\xae\x13\xf4\xa4\x62\x06\xf9\x8b\x65\x56\x0c\x24\xbb\x93\x50\
+\xe6\xe4\x55\xc5\xeb\x8e\x69\xea\x09\x82\x74\x07\x90\x7d\x1d\x51\
+\x7c\xbd\xec\xa1\x50\xa0\x0f\x4c\x34\x78\x8b\xfa\x2e\x4a\x3a\x1a\
+\xda\xb7\xc0\x2a\xe8\x68\xbd\x32\x8b\x45\xea\xf1\x7f\xc5\xd7\x3c\
+\x07\x55\x88\xd7\xd7\x85\x23\x7d\x09\x1f\xf2\xd3\x8c\x05\x4e\xfd\
+\x28\xcb\x1c\xd1\x74\x14\x5e\x51\xf3\xc5\xad\x68\x02\x95\xb7\x43\
+\x7e\xd1\x6a\xe3\xaa\x85\x9c\x9b\x58\x06\x9a\x36\x83\xba\xee\x8b\
+\x9b\x88\x43\x1e\xbb\xbb\xae\xce\x9a\x80\x5a\xc8\xf6\xae\x14\x1e\
+\x1c\xcc\x22\x57\xf4\xb0\x8d\x4e\xdc\xd5\x93\x53\xb0\x84\xf8\xbb\
+\x83\x6b\x6a\xac\x0b\xa8\x85\xb4\x76\xa6\x30\x3c\x94\xc5\xb1\xb1\
+\xab\xb8\x46\xf1\xa8\xc7\x06\xd7\xdd\xbf\x21\x80\xb8\x9a\x1e\xfb\
+\x96\xef\xd8\x99\xf6\x21\xd3\xe7\xe6\xa1\x8e\x0f\x6d\x68\xef\x86\
+\x01\x55\x27\x62\x87\x3c\xb6\x7e\xe5\xd5\xeb\x6f\x13\x96\xa7\x65\
+\x0a\x94\x8d\x23\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x05\x51\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x18\x49\x44\x41\x54\x78\xda\x95\x96\x6b\x4c\x14\x57\
+\x14\xc7\xff\xb3\x23\xc8\x02\x5b\x76\x17\x16\x79\x28\x0b\x88\xc8\
+\x82\xab\x20\xac\xab\x16\x7c\xf1\x50\xd1\x36\x46\x93\x2a\x24\x55\
+\x9b\x3e\x8d\xd6\x18\xdb\xa4\x6f\x1f\x89\xc1\xb4\x4d\x63\xfd\x52\
+\xd3\xb4\x55\xe3\x87\x3e\xac\xd4\x5a\x25\xd1\xa6\xda\x7e\xb0\xad\
+\xb1\x69\x8b\x4a\xa5\xc1\x56\x5d\x64\x45\x1e\xfb\x10\x5c\xf6\x35\
+\x33\xb7\x67\x66\x9f\x58\xb6\x49\xef\x26\x3b\x77\xee\xdc\x39\xbf\
+\x39\xe7\xfc\xef\xb9\x97\x43\xb8\x19\x4b\x2b\xd6\x26\x4d\x56\xb7\
+\xfb\xfd\x7e\xb8\xdd\x2e\x88\x01\x2f\x6a\x5e\x38\x00\x5e\xa3\x87\
+\x10\x14\x20\x06\x45\x04\x25\x11\x42\x40\x84\x28\x0a\x10\x04\x89\
+\xc6\xa5\x68\x3f\x48\xd7\xa0\x48\xf7\xd4\xe7\x52\x74\x70\x1c\xdb\
+\xc8\xc9\x76\xb9\x08\xc0\x60\x2c\x65\x33\x8c\x05\x58\xf3\xd8\x0a\
+\xe4\xe5\xe6\xc0\xc7\x6b\xa1\xd6\xea\xc1\x33\x09\x3c\xcf\x83\x57\
+\xa9\xc0\x4f\xe2\xa1\xa2\xb9\xbc\x8a\x07\xa7\xe2\x94\x2b\xcf\x71\
+\x4a\x5f\xc5\xa9\x14\x3b\x3c\xf5\xbf\xfb\x7b\x18\xfb\x3f\xfa\xed\
+\x40\xe0\xfc\xf6\x9d\x51\x40\xc7\x99\xb3\xac\xac\x7c\x26\x3a\x3b\
+\xbb\x08\x60\x80\x3b\x2d\x1b\x39\x05\x45\x60\x22\x83\xfc\x8b\xb4\
+\x58\xef\xe1\x81\x70\x87\x80\xea\x64\x15\xbe\xef\xbc\x83\x6d\x75\
+\x05\x5c\x14\xf0\xea\x6b\xbb\xd8\x82\xf9\xf3\x70\xa2\xfd\x14\x6a\
+\xe7\x57\xc3\x96\x53\x8d\x12\xf3\x6c\x0a\x81\x88\xff\xdb\x64\x6f\
+\x6d\xbd\x03\xd8\xdb\x60\x8c\x01\xde\x78\x73\xaf\x02\xf8\xea\xe4\
+\x69\x2c\xb4\x56\xc1\x36\x65\x2e\x4a\x2a\xcc\x90\x28\xb6\x91\xc6\
+\x85\xa3\xca\xc5\x19\x63\xe1\x7f\x16\xe7\x9a\x8a\x00\xbd\x04\x78\
+\xab\x3e\x01\xe0\x51\x02\xdc\xcc\xae\xc2\x74\x53\x08\xc0\x29\xc6\
+\x39\x25\x63\x4e\x4f\x00\x4e\x2f\x79\xc5\x91\x45\xc6\x41\xaf\x9e\
+\x04\x7d\x5a\x92\x02\x60\x61\x8a\x0c\xe8\xeb\x1b\xc0\xae\x86\xc2\
+\xc4\x80\xbf\xb2\x2a\x51\x64\x9a\x05\x26\x09\x90\xe8\xbd\xde\x61\
+\xaf\xa2\x20\x6b\x5e\x32\x16\x4c\x4d\xa7\x31\x46\x89\xe5\x70\xc9\
+\xee\xc1\x0f\x77\x7c\x28\x9a\x92\x86\x34\x8a\xbd\xcc\x90\x01\x77\
+\xfb\x06\xb1\xa7\xa9\x28\x31\xa0\x3b\xa3\x12\xc5\xe5\x15\x20\x17\
+\xd0\xdd\x3f\x82\x35\xc5\x6a\x2c\x9b\xa1\x9b\x30\xe6\xa3\x5e\x01\
+\xaf\x5c\xe8\x87\xb9\x40\x07\x89\xbe\x46\x01\xd8\x07\xb1\x6f\x65\
+\xf1\xc4\x80\x5a\xeb\x5c\x5c\xd3\xcc\x46\x61\xb9\x89\x3c\x90\x30\
+\x3c\xe2\xc3\x6a\x63\x0a\xac\xc6\x47\x30\x46\x5e\x38\x28\x4c\xb2\
+\x57\x46\xbd\x3a\x0a\x39\xdb\xed\xc4\xcf\x0e\x09\x99\xe9\xc9\x04\
+\x00\x06\xec\x0e\xec\x6b\xfe\x0f\xc0\xef\x69\xb3\x60\x2c\x33\x91\
+\x03\x22\x68\xe9\xe0\xae\x6d\x08\x9a\xd4\x64\xf4\xfb\xc8\x48\x46\
+\x2a\x1c\xa3\x3e\xb4\x9a\xd2\x51\x3f\x33\x53\x79\xff\xde\x7d\x1f\
+\xda\x2e\x0e\x21\xd7\xa0\xc1\x30\xcd\x71\xdd\x1b\xc2\x91\xf5\x65\
+\x31\xc0\xae\xdd\xfb\xd8\x7c\xab\x05\xed\x27\xbf\x51\x00\x97\x93\
+\x4c\x30\x52\x88\x98\x9c\x64\x9a\x36\xec\x1c\x83\x96\x0c\x27\xf1\
+\xa1\x84\xdb\x1d\x0f\xf0\x78\x21\x85\xad\x2c\x04\x38\xd7\x35\x84\
+\x0f\xaf\x79\xa0\xd7\xa7\x29\x62\x60\x2e\x27\x0e\x6f\x88\x03\x3c\
+\xb9\xe9\x59\xb6\xa2\xa9\x11\x5f\x1c\xff\x12\x8d\x4b\x6b\xf1\x4b\
+\x6a\x25\x0a\xca\xcd\x4a\x29\xe0\x22\x1a\x65\xa1\xb5\xef\x09\x48\
+\xb8\xd5\x63\xc7\xa9\x2d\x55\xd1\x10\xd5\xbd\x7b\x19\x85\xa6\x02\
+\x5a\xf5\x21\x29\x33\xb7\x13\xc7\x5a\xcb\x63\x80\x0d\x2d\x9b\x58\
+\x63\x43\x3d\x3e\x39\x7c\x04\xcb\x97\x2d\x42\x07\xab\xc4\x74\xcb\
+\xc2\x71\xeb\x40\x79\x95\x02\x7c\xbd\xf3\x26\xce\xef\xac\x42\x96\
+\x26\x94\x83\x67\x8e\x5e\x45\x2f\x4b\x81\x41\xaf\x09\x49\x55\x2e\
+\x1f\x23\x6e\x7c\xba\x31\x1e\xd0\xba\x99\x35\x85\x01\x2b\xeb\x17\
+\xe3\x54\xb0\x1c\x85\x96\x5a\x48\x42\x30\xce\x38\x87\x7e\xbb\x0b\
+\xdb\x17\xe8\xf0\x44\xcd\x54\x65\xac\xad\xe3\x4f\x9c\xbe\x29\x60\
+\x5a\xbe\x4e\x11\x04\x0b\x7b\xcb\x3f\xb8\x8f\xe3\x9b\x67\x25\x00\
+\x34\x2c\xc6\x09\x4f\x19\xa6\xcd\x7b\x18\xa0\xc2\xd5\x9f\xba\x61\
+\x7b\xbf\x49\xb9\x7f\x30\x16\x80\x79\xf7\x45\x98\xad\xa5\x8a\x18\
+\x22\xe5\x88\xc9\xf5\xc8\x33\x82\xf6\xa7\xcd\x89\x01\x9f\x8d\xcc\
+\xc0\xd4\x9a\xba\x71\x00\x46\x15\x33\x3f\xe8\xc6\xd1\xa7\xe6\x28\
+\xf7\xb7\x06\xdd\x58\x77\xf4\x36\x0c\xf9\x5a\xfa\xfa\xb8\x82\x48\
+\x66\xd3\xbd\xa3\xf8\xfa\xb9\xd9\x13\x03\x9a\x09\x70\xcc\x59\x84\
+\xdc\xea\x3a\xb0\x38\x80\x2c\x70\x7f\xff\x20\xb2\x93\x05\x04\x7c\
+\x22\xd5\xfd\x24\x38\x92\xb4\x48\xd5\x4c\x8e\x96\x89\x08\x40\xe3\
+\xf7\xa0\x63\x4b\x65\x62\xc0\xc7\x03\x46\xe4\x5a\xe2\x00\xf2\x4c\
+\x92\x88\xed\xc7\x3f\xb0\xa5\x79\x3a\xf4\xb4\xa0\x3e\x38\xd3\x83\
+\xc9\x25\x46\xa4\xa4\xfe\x1b\x90\x11\x18\xc3\xb9\xad\x55\x09\x00\
+\x8d\x4b\x70\xc8\x9e\x87\xec\xea\x45\x51\x80\xac\xfd\x91\x01\x17\
+\x76\x58\x33\xb0\x75\x65\x85\x32\x26\x09\x02\xf2\x9e\x3f\x83\x7c\
+\x4b\x99\x92\xe0\x58\x85\xa5\x22\x28\x79\x71\xe1\xc5\xea\x89\x01\
+\xab\x08\x70\xf0\x76\x2e\xb2\x2c\x71\x00\x0a\x8f\xeb\x86\x1d\xa7\
+\xb7\xcd\xc1\xdc\x12\x43\xd4\x98\xbe\xf5\x73\xe4\xd5\x55\xd2\x3c\
+\x71\x1c\x20\x93\x00\x17\x77\xd4\x4c\x0c\x58\xdd\xb4\x04\xef\xdc\
+\xc8\x42\x66\xf5\xd2\xb8\x10\x71\x10\xfd\x41\x64\xf4\xf6\xa0\xf3\
+\xd0\x7a\x65\xe8\xbd\x93\x57\xf0\xf6\xb7\x7d\xc8\x28\x2d\x1c\xe7\
+\x81\x5c\x5a\xa6\x70\x5e\x5c\x7a\x69\x5e\x22\xc0\x62\xb4\x75\xeb\
+\xa0\xab\x59\x36\x2e\xc9\xb2\x8a\x02\x2e\x37\x46\x7b\x6c\x74\x08\
+\x90\x90\x6a\xd0\x22\xdd\x54\x0c\x4e\x12\xc7\xed\xa5\x32\x20\x87\
+\xf7\xe3\xd7\x97\xad\x31\x40\x0b\x01\x1a\xe3\x00\x7b\xae\x68\xa0\
+\xb5\x36\x00\xf1\x2a\x42\x68\xd3\x91\xd5\xa4\x54\x0e\x49\xd9\x65\
+\x62\x4f\x59\x64\x7f\xa3\x10\xc1\x87\xeb\xaf\x2f\x8c\x01\xd6\xae\
+\x6b\x61\xab\x57\x35\x87\x00\x94\x83\xfd\x5d\x6a\xe8\x2d\xcb\xc1\
+\x82\x81\xa8\x42\x18\xa3\x2f\xa5\x43\x80\xa4\x6c\x5f\x21\x53\xf2\
+\xa1\xe0\xe1\x2d\x33\xd2\xfa\xdb\xea\xb8\x7f\x00\xfe\x9b\x73\x37\
+\xdb\x69\x33\xfe\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x05\x96\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x5d\x49\x44\x41\x54\x78\xda\x95\x96\x69\x4c\x54\x57\
+\x14\xc7\xff\xf7\xbd\x37\xf3\x66\x65\x66\x80\x8a\xa0\x42\xb1\x0c\
+\x28\x08\x28\x0a\x55\x03\x56\xfd\x60\xda\x6a\xa3\x69\xb4\x19\xd2\
+\x98\xa6\x68\xfb\xa1\xbb\xdd\xd2\x6a\x93\x7e\xeb\x87\xda\x34\xa6\
+\x36\x26\xd5\x82\xda\x46\x99\x44\x53\x63\x6c\x6c\x62\x23\xae\x31\
+\xad\x5a\x97\x28\x08\x6e\xd0\x61\x5f\xc2\xc0\x2c\x0c\xcc\x5b\x6e\
+\xcf\x1b\x90\x92\x8a\x45\x4f\x66\xf2\x26\xf3\xe6\x9d\xdf\xfd\x9f\
+\xff\xb9\xe7\x0e\xc3\x23\x22\x32\xa7\xb8\x1a\x29\xee\x2a\x26\xcb\
+\xf8\xbf\xe0\x8a\x02\xf4\x06\x6b\x1c\x8d\xd7\x36\x4d\x76\x9f\x4d\
+\xf6\x65\x38\xb7\xa8\x56\x2c\xce\xf3\x99\xde\x5c\x03\x74\x06\x00\
+\x81\x8d\xff\x92\x89\x0c\x5c\x4b\x7c\x00\x74\x15\x30\x49\x88\xef\
+\x3e\x0e\xbd\x23\xec\x77\xde\xba\x5a\x39\x25\x20\xe4\x2d\xa4\xe4\
+\xb9\x3e\xf3\xe6\x17\xa1\x9e\x3e\x01\x1e\x0a\x41\x1b\xa1\x8c\xaa\
+\x8e\x98\x39\x07\x7a\x6b\x03\x6c\xd3\x2d\x88\x75\x04\xe1\x5a\xec\
+\x05\xd7\xe9\x21\x8b\x19\xda\xc9\xfb\xd0\x3b\x43\xfe\xa4\xc6\x6b\
+\x95\x8f\x04\x04\x29\xb9\x89\x92\xcb\x6f\x50\xf2\xba\xdf\xa0\x76\
+\xf6\x81\x95\x6c\x84\xb0\x60\x2e\x06\xb6\x7e\x84\xf4\xf3\x17\xd0\
+\xb6\xc0\x0b\xeb\xd6\x1d\x48\xd9\xb0\x1a\x9d\xeb\x56\x20\xb9\x38\
+\x9d\x14\x31\x30\x59\x84\x52\xd7\x02\xad\x2b\xec\x77\x4f\x80\x8c\
+\x03\x06\xc6\x56\x2e\x6f\x7a\x1e\xda\xb9\x93\xe0\xb1\x28\x94\x9b\
+\x01\xd8\xbe\x3b\x02\x69\x4e\x36\x5a\x0b\x4a\x30\xab\xfe\x4a\x02\
+\xe0\x3e\x70\x1c\x8e\x7c\x2f\xfa\xbf\xfa\x14\xf6\xc1\xbf\xc1\xd9\
+\x68\x2a\x66\x16\x11\x3f\x1b\x80\xde\x1d\x19\x87\x24\x6e\xf5\xe5\
+\xcc\xab\x35\x15\x79\x7d\xd6\xd7\x5f\x80\x76\xe1\x24\xd0\x13\x03\
+\x7b\xee\x35\x0c\xff\xf4\x23\xec\xdf\x7e\x03\xa9\x30\x1f\x2d\x79\
+\x85\x78\xba\xe9\x46\x02\xe0\xda\x77\x14\xce\xe2\x7c\xf4\x7f\xf9\
+\x21\xec\xe1\x66\x70\x41\x1c\x5b\xae\x01\x11\x30\x7c\xbe\x03\x5a\
+\x77\xd8\x9f\xd2\x74\xbd\x92\xf5\xe6\x16\x56\x9b\x0b\x66\x57\x59\
+\xab\x56\x41\x3b\x73\x8a\x8c\x53\x20\x78\xbc\x30\x7f\xb1\x1d\x03\
+\x15\xcb\x61\xdb\xb5\x0b\x66\x03\x30\x87\x00\x8d\x63\x80\xbd\x04\
+\x98\x4f\x80\x6d\xef\xc3\x1e\x69\x19\x03\xe8\x89\x97\xb1\x64\x43\
+\xc9\xf0\x1f\xdd\x50\xfa\xa2\x35\xac\x6f\x71\x39\x77\x7d\xe6\x83\
+\x7a\x96\x92\x53\x7b\xf0\xb8\x02\x66\x4b\x87\xe5\xeb\x3d\x08\x2e\
+\x2e\x87\x73\xcf\x0f\xa4\xa0\x00\x81\x82\xf9\xc8\xac\xbf\x36\x06\
+\x38\x42\x80\x79\x04\x78\x0f\xf6\xe0\x7d\xea\x32\x09\x9c\xf3\xd1\
+\xec\x86\xeb\xa4\x44\x20\x25\xa1\x33\x6d\x60\xbd\xcb\x56\x70\xd7\
+\x2b\xa5\xd0\x9a\x6e\x52\x7e\x81\xba\x66\x10\xcc\x3a\x13\xd6\xdd\
+\x07\xd1\xbf\xe8\x59\x24\xed\xdf\x07\xa9\x60\x2e\xda\xcb\xca\x31\
+\xe3\xe2\x79\x74\x6e\x5c\x0d\xe7\x27\xdb\xe1\x28\xca\x47\xf0\xf3\
+\x77\xe1\xe8\xbf\x8b\x50\x57\x08\xce\x34\x37\x79\xc1\x61\x70\x38\
+\x99\xc2\x24\x01\x91\x8b\x5d\x60\x3d\x15\xcb\xb9\xfb\x65\x02\x34\
+\x36\x10\x40\x87\x16\x0c\x42\xb0\xa6\xc3\xf6\xf3\x2f\xe8\x2f\x5d\
+\x42\x80\x1a\x48\xf9\x73\xd1\x9a\x91\x8d\x59\x1d\xcd\xe8\xae\x5a\
+\x07\xeb\xe6\x6d\x48\x5a\x5a\x8a\xee\x0d\x6b\xd0\xdb\xdc\x85\x8c\
+\xc3\x47\x31\xb8\x65\x13\xd2\x3d\xc0\xa8\x10\x02\x88\xa4\xe0\xaf\
+\x6e\xb0\xae\x65\x2b\xb9\x67\x6d\x09\xf8\xbd\x26\x68\x1d\x54\xb7\
+\xe6\x76\x40\x11\xe0\xaa\x0f\x20\x38\x7f\x11\x6c\xdf\xef\x84\x5c\
+\xbe\x04\x3d\x4b\x57\x62\xda\x85\x3a\xc4\x4f\x9d\x03\xcf\x7b\x06\
+\x72\x46\x06\xae\xb8\xac\x28\x19\x8c\x25\xfc\xbd\x5b\xec\x45\x7a\
+\x3c\x0c\xfe\x94\x07\xd2\x8c\x34\x30\x97\x1d\xfd\x97\xa9\xcd\xdb\
+\x16\x96\xf1\xd4\xd2\x54\xc4\xeb\x2e\xd1\xc6\x24\x05\x51\xea\x20\
+\xc9\x0c\x4f\x5b\x10\x5a\x1b\x49\x4c\x75\x43\xb0\x58\x26\x1d\x13\
+\x13\x01\xb7\xb2\xa7\x61\x7a\x34\x0a\x41\x36\x91\x27\xb4\xc1\x9d\
+\x36\xf4\x0d\x88\x60\x4d\x8e\x24\x9e\xb9\xc2\x0b\xb5\x91\xfa\x97\
+\x4c\x56\x23\x23\x24\xcf\x00\xf4\x63\xaa\x98\x08\xb8\x9a\xe6\x44\
+\x96\xaa\x81\x59\x4c\x10\x65\x09\x22\x95\xa9\xad\x3d\x0a\x76\x2b\
+\xc9\xc3\xb3\x2a\xb2\xc9\x83\x16\x52\xc0\xa0\x0c\xc5\x20\x98\x64\
+\x78\xda\x9f\x0c\x70\x39\xd9\x86\x6c\x5d\x27\xb5\x66\x88\x66\x02\
+\x08\x02\x02\x5d\x43\x60\x37\x92\xdc\x3c\x67\x49\x16\x94\xa6\x56\
+\x52\xa0\x27\x14\x08\x92\x05\x9e\xae\xa9\x01\x86\xc9\x69\x87\x7e\
+\x1d\x05\x10\x2c\x9b\x1c\x16\x65\x33\x2d\x50\x84\x48\x5d\x74\xbf\
+\x87\x00\xd7\x1d\x6e\x9e\x5b\x96\x09\xe5\x0e\x01\xa8\x8b\xd4\xe1\
+\x38\x04\xa3\x44\x3d\x03\x53\x02\xfe\xab\x66\x16\x3d\x2f\x9a\x0d\
+\x05\x04\x60\x02\xee\x05\xc9\xcf\x4b\x56\x07\x2f\x2a\x9b\x8d\xf8\
+\xed\x00\x68\x9b\x51\x89\xc8\x03\x2a\x51\x4a\xef\x93\x01\xf6\x52\
+\xcd\xd7\x3a\x64\x6a\x10\xf2\x80\x5a\xd4\x44\xef\x9b\x06\xe0\x04\
+\x93\xaa\xd3\x93\x3d\x55\x39\x2e\x9a\x21\xa1\x21\xa8\x23\x2a\xe2\
+\xe1\x18\x32\x12\x0d\xfd\x78\x31\x14\x89\xe0\x8a\xd3\x89\x7c\x87\
+\x8d\x1a\x44\x84\x85\xca\x73\x27\x12\x47\xb7\xa2\xd5\x24\x86\xdd\
+\x31\x88\xb5\x33\x53\x93\x7d\x79\xd4\x8d\x43\x83\x51\x0c\x87\x87\
+\xe0\xd9\xbe\x13\xb6\x8f\xdf\x79\x2c\xc0\x31\xa7\x0b\xcb\x46\xa2\
+\xd0\x65\x0b\x64\x02\x34\xc5\xe2\x68\x57\x54\xff\x4b\x5c\xad\x1c\
+\x1f\xd7\x87\x09\x92\x45\x90\x02\x51\xc7\xc0\xe0\x20\xe2\xc3\x2a\
+\xb2\x1e\x43\x45\xfd\xdb\x5b\x60\xd9\x45\xe7\x83\xdd\x06\xda\x01\
+\x68\x50\x34\x04\x14\xdd\xbf\x9e\x2b\xff\x8e\xeb\x07\x71\x00\xac\
+\x36\xdb\xe3\xf1\x15\x71\x95\x20\x61\x44\x08\x90\x79\xf0\x10\xac\
+\x95\xeb\x1f\xee\xa0\xdf\x4f\xa3\x61\xd5\x4a\x64\x90\x6f\xa9\xe4\
+\x99\x2c\x49\xb8\xa1\xaa\x68\x56\x14\xff\xab\xd0\x1f\x3e\x70\x1e\
+\xc4\x6e\x08\xb5\xb3\x93\x9c\xbe\x85\xba\x86\x30\xed\xcc\x38\x41\
+\x14\xe3\x86\x24\x63\x44\xe7\x30\x8e\xe3\x11\x3d\x0e\x2b\x5d\xa7\
+\x1b\x33\x87\x4c\xb5\x53\x59\xae\xd2\xca\xef\x6a\xaa\xbf\x6a\x42\
+\xf2\x49\x01\x46\xec\x04\x6a\x73\x9d\x2e\x5f\x05\xa5\x1b\xa1\xb6\
+\x4d\x14\x8a\x36\x91\x9e\xb8\xcb\x21\xd0\xb4\xe4\x46\x72\x18\xdd\
+\xc2\xf0\x27\xad\xfc\xb6\xae\xf9\xdf\x02\x9f\xfa\xd0\x7f\x10\x3b\
+\x80\xea\x64\xd1\x54\xc5\x34\x8d\x30\x0c\x2a\x8d\x62\x7d\xc2\x43\
+\xc6\x5b\x32\x8e\x49\xba\x06\xb9\x5e\xf3\x01\xf8\xa4\x7f\x5b\xfe\
+\x01\xb5\x1d\x53\x25\x7d\xa2\x87\x28\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x05\x25\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xec\x49\x44\x41\x54\x78\xda\xc5\x54\x6d\x50\x54\x55\
+\x18\x7e\xce\xfd\x5a\x60\x17\x8b\x55\x4c\x2b\xcd\x49\x91\x05\x11\
+\x03\x51\x72\x48\xd2\x61\x34\x4d\x41\x6b\x1c\x2b\xcd\xc0\x24\xd3\
+\xc9\xb1\xa6\x8c\xa6\x74\xb4\xa6\x1f\x66\x53\x8e\x65\x35\x18\x56\
+\xd6\x34\x36\xe3\x94\x39\xc2\x8f\xd6\x19\xcb\x0f\x42\xfc\x04\x59\
+\x58\x16\x36\x43\x11\x19\x88\x8f\x85\x5d\x5c\x76\xef\xde\x7b\x4f\
+\xe7\xde\xa5\x4d\xc7\xa5\xe1\x47\x4d\x67\xe7\xec\xdd\x7d\xef\x7b\
+\xde\xe7\x7d\xde\xf7\x79\x0f\xc1\x7f\xbc\xc8\xff\x02\xb0\xe0\xdb\
+\xf4\x9d\xec\x31\x53\x12\x4d\x73\x04\xde\x64\x51\xb4\x10\x88\xa6\
+\x16\x55\x3c\x7d\xe1\x6b\xfd\x7d\xc1\xa1\x6c\x17\xcf\x49\xc9\x1a\
+\xa5\xe0\x08\x81\x5f\xf6\xe9\xe6\x66\xb6\x7f\xb1\xaf\xaa\xdd\x30\
+\x2c\xc0\x63\xdf\x64\xbe\x67\x89\x8d\x7f\x23\xf3\xfe\x14\xa4\x58\
+\x6d\x98\x30\x6a\x2c\xcc\x12\xd0\xee\xeb\xc6\x47\x67\xbe\xab\x2f\
+\x7f\xe6\xcc\x74\xdd\x6f\xd9\xa1\x1c\xba\x67\x71\x09\x3a\x6f\xb6\
+\x40\xd1\x14\x84\x94\x58\x5c\xed\xf3\xe0\xcc\xf5\x0b\xe8\x1a\xe8\
+\xc6\x8f\x4f\x55\x92\xa8\x00\x79\x5f\x65\x38\x76\x2d\x2e\x49\x53\
+\xb4\x1e\xfc\x21\x5f\xc5\x60\xa8\x0f\x3c\xc7\xa3\xbd\x4f\xc3\xe1\
+\x9a\x73\x27\x4f\x14\x5f\x9e\xa7\xfb\x2d\x3a\x90\x45\xd7\x64\xe7\
+\x41\x12\x3d\xa0\x94\x80\x91\x60\x4c\x80\x7b\x2c\x93\x70\xd4\xe9\
+\xc0\xfb\xf3\x0f\x46\x07\xc8\x2d\x9d\xb6\xb7\xf0\xe1\x95\x9b\xe2\
+\x2c\x37\x00\x2a\xb0\x97\x04\x26\x91\xc7\xbe\xe3\x35\xf8\x69\xdd\
+\xe9\xdb\x7c\x17\x96\xcd\xa1\x25\x4b\x96\xb2\x8c\xdb\x18\x00\x67\
+\xd8\x44\x9e\xc7\x81\x53\x75\x28\x2f\x3a\x11\x1d\x20\xe7\xd3\xf4\
+\x85\xb9\xc9\xd9\xf6\x39\x93\xc7\xc0\x2b\xf7\x1b\x00\xfa\x21\x7b\
+\x43\x2b\x1a\xaf\x5d\xf1\xa8\x84\x7e\xc9\x52\x06\xa1\xda\xda\x5c\
+\x5b\x8e\x75\x49\xda\x74\xb4\xfa\x5c\x2c\x7b\xce\x60\x11\x94\x45\
+\x94\xfe\x7c\xfc\xe2\xd9\xcd\x8e\xac\xa8\x00\x8f\x7c\x32\x23\x6e\
+\xa2\x75\xe2\xcd\xc2\xb9\x73\xd1\x31\xd0\x62\x64\xa6\x1f\x8c\x11\
+\x24\x10\x65\x3c\xce\x5d\x6d\x36\xfc\xf2\x53\xf2\x10\xc7\x7a\xd3\
+\xe4\xad\x46\x48\x17\x00\xfb\xf0\x3c\x41\x53\xbb\x17\xc7\x6a\x6a\
+\x5f\xaf\x7e\xa5\xee\x83\x61\x55\x94\xbb\x67\x16\x7d\x67\xe5\x73\
+\x68\xf1\x38\x59\x66\xfc\x90\x95\x86\x9d\x49\xf8\xb7\xa6\x69\xec\
+\x5b\x0f\xab\x27\x10\x0e\x21\xe9\x4c\x1d\x2d\xa8\x77\xbb\xed\x82\
+\x20\xe4\x28\xd0\x06\x4d\x10\x33\xc9\xac\x9d\xe9\xbb\x12\x47\x27\
+\x96\xe8\x4e\x5d\x9e\x5e\xa8\x9a\x8a\xbd\x6b\xb7\xa0\xa1\xa7\x0a\
+\x3c\x11\x46\xac\x77\x51\xe0\x50\x5e\xdd\x8c\xc4\xf8\x44\xac\x78\
+\xe8\x71\x38\x3a\xeb\x70\xe0\xf8\xd1\x1f\xc8\xec\x9d\x19\xb4\x74\
+\xdd\x0e\xb4\xf9\x5d\x2c\xb3\x18\xa8\x01\x13\x46\x99\x39\xb4\x78\
+\x2f\x83\xe3\x44\x70\xb7\x28\x9a\x0c\x11\xa6\x43\x8c\x0c\x36\x43\
+\xff\x39\xb6\x65\x45\x42\x7a\x62\x06\xdc\xfd\x17\x41\x79\x0d\xfb\
+\x8f\x9c\x05\x99\xbf\x3b\x97\x6e\x5d\xb9\x0a\x4d\xbd\xb5\x4c\x92\
+\x22\x78\x16\x24\x48\x35\xc8\xea\x20\xfa\xe5\x1e\x56\xe3\x20\x02\
+\x6a\xc0\xb0\x0f\xa8\x03\x8c\xa1\x02\xb3\x60\x66\xec\x44\xe8\x85\
+\xba\x4b\xb4\x22\x86\x97\x58\x9f\xe2\x0d\xbb\x5e\x01\xa3\x64\x92\
+\x80\xb2\xc3\x55\x20\xf9\x9f\x2d\xa2\x9b\xf2\x97\xa3\xb1\xb7\x06\
+\xfd\x41\x0f\xba\x03\x37\x98\xfe\x03\xe1\x06\x47\xda\x44\x6e\xe9\
+\x01\x61\x42\xa2\xb7\x14\x87\x0e\x31\x0a\x77\xc5\x1a\x3b\x06\x09\
+\x52\x22\xc6\xc7\x8f\xc3\xd1\x4a\x07\x48\xda\x9b\xe9\x74\x73\xd1\
+\x3c\x54\xb6\x9d\x82\xa4\xab\x45\x27\xcb\x78\xdf\x16\x63\x24\x8b\
+\x81\xf3\x7c\x18\x50\x51\x35\x98\x18\x83\x5f\x2b\x02\x61\x80\xe9\
+\x33\xc6\x43\x33\xf7\xa0\xa7\x4d\x83\xa7\x4b\x41\xda\x6c\x33\x04\
+\x49\x47\x19\xf9\x5d\xc8\x0b\x04\x17\x4f\xfa\xa1\x04\x28\xa6\x64\
+\x99\x60\x61\x7d\xbc\x70\xec\x66\x50\x07\xb0\xd3\x90\x3a\x96\xf9\
+\xc4\x32\x8a\xa7\x43\x21\x75\xc1\x8a\x27\xb3\x1f\xb8\x26\x37\x32\
+\x2e\xdc\xc8\x01\x44\x82\x86\xd3\x03\xf0\xf7\x6b\x6f\x31\xf6\x5b\
+\x19\x11\x33\x33\xbb\xef\x48\x71\xca\x4b\xb6\xde\xd5\xab\x73\x13\
+\xdc\x3e\xd6\xf4\xc8\x1c\x84\xeb\x4f\x38\x12\x19\x1c\xcd\x28\xe3\
+\xdf\x75\xd4\x19\x34\x5f\xf2\xa3\x6a\x4b\xed\x6d\x31\xef\x00\x78\
+\x70\xc3\x14\xba\xed\xb5\x67\x61\xff\xbd\x02\x02\x53\xca\x5f\xc1\
+\x43\x32\x45\x4f\xbb\x0c\x45\x0e\x1f\xb9\x7b\x2c\x0f\x8b\x95\x07\
+\x0d\x8b\x06\x1c\x9b\xe4\xee\xeb\x32\x5a\x2e\x0d\xda\x5d\x1f\x37\
+\x2c\x1a\x16\x60\xf6\xf6\x6c\x5a\xf0\x44\x1a\x1c\x1d\x8e\x08\x03\
+\x41\x22\xa8\xfe\xbe\x4f\x9f\xdb\xfd\xcc\xd4\xca\x32\xb7\x84\x02\
+\xda\xcb\x39\xcb\x27\x98\x14\xc1\x17\x9e\x11\x16\x49\x56\x28\x1c\
+\xe5\x3e\xb8\x4a\x1b\xa2\x5f\x76\xc9\x1b\x53\xde\x9e\x3a\x6d\xd2\
+\x8e\xa4\x8c\x58\x5c\xef\xbf\x61\x5c\x62\x06\x7d\x06\x70\xee\x60\
+\x1f\x7e\xfb\xc2\x19\xf1\x9f\x54\x9c\xd4\x50\x5c\x58\x90\x5a\xeb\
+\x3b\x15\x99\x78\xc1\x44\x50\x53\xe1\x85\x73\x77\x7d\x74\x80\xc9\
+\x2f\x24\x3b\x9e\x2f\x2a\x48\x73\x06\xab\xa0\x2a\x61\x15\xe9\x92\
+\xe5\xd8\xf9\x2b\xe7\xfd\xf0\xb6\xca\xef\xba\x4a\x9d\xdb\x6d\x1b\
+\x53\x5f\x8d\xb3\xc6\x7d\xf8\xe2\x9a\xa5\xb0\x5f\xa9\x80\xc8\x06\
+\x54\xef\x8f\x68\xe2\xe0\xaa\xf4\xe1\xfc\xb6\xcb\xc3\x31\x48\x2d\
+\x0b\x05\xd5\xc2\x98\x04\x41\x18\x35\x4e\x20\x66\xab\x00\x53\x9c\
+\x80\xd1\xf7\x89\xb8\xe6\xf0\xa3\xb3\x2e\xd0\xd4\xb4\xcf\x69\x4b\
+\x5a\x6f\x3b\x32\x6f\xe1\xcc\x65\xe4\xde\x2e\x78\x07\x7d\x08\x0e\
+\x52\x78\xda\x64\x74\xd4\x07\xa1\x85\xa8\xda\xbc\xcf\x29\x44\x05\
+\xd0\x57\xd2\xfa\xd4\xc3\xec\x31\x75\x68\x1b\x5d\x66\xb7\x83\xce\
+\x42\x71\x7f\xee\x14\x23\x62\x28\xb6\x51\xbd\xc1\xc6\x9d\xaa\xab\
+\x8b\x43\x17\x33\x37\xba\xcb\x9c\x8f\xfe\xa3\x8a\xfe\xed\xf5\x27\
+\xb2\xb9\xff\x30\xb4\xbb\xad\xd3\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x06\x16\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xdd\x49\x44\x41\x54\x78\xda\x85\x56\x69\x4c\x54\x67\
+\x14\x3d\x6f\x9b\xc7\x30\x2b\x82\xe0\x02\x22\xa2\x2c\x75\x01\xb5\
+\x88\x68\x2c\x52\x8d\x04\xdb\xa4\xb1\xb1\xa2\x86\x8a\x49\xad\x01\
+\x4c\xfa\xc7\x9a\x26\x6d\xba\xd8\xfe\x69\x6a\xfd\xd3\x84\xa5\xd6\
+\x26\xa2\x44\x85\x9a\x9a\x26\x2e\xc1\x68\xd1\x5a\x45\xa0\x55\xb0\
+\x5a\x45\x45\x44\x5c\x00\x41\x67\x83\x61\xe6\x6d\xbd\xef\xcd\x88\
+\xb5\x16\xb9\x7f\x26\x99\xef\xfb\xee\xb9\xf7\xdc\x73\xef\x7d\x0c\
+\x5e\x62\xb1\xab\xab\x73\x55\x45\x5d\xab\x28\x6a\xbe\xaa\x6a\x49\
+\x66\xbb\xd9\xf8\xdf\xef\xf1\x83\x65\x99\x4e\x8e\x63\xeb\x59\x8e\
+\x3d\xd8\x77\xa8\xf8\xcc\x68\x3e\x98\xff\xfb\x73\xe2\xba\x9a\x8c\
+\xa0\x5f\x6a\x71\xc6\x39\x85\xe4\xd4\x09\x48\x48\x74\x62\x9c\x3d\
+\x12\xa2\xc8\x19\xe7\x81\x80\x82\xc7\x9e\x21\x74\x77\xb9\xd0\xd1\
+\xde\x03\x57\xaf\x4b\x32\x99\x85\xac\x87\x07\x8a\xda\xc6\x04\x98\
+\xb4\x6e\x5f\x39\x0b\xae\x6c\xf1\x8a\x57\x90\x3c\x35\x1a\xa6\x48\
+\x01\xac\xc6\x80\x32\x78\xee\x1e\x65\x00\x95\xd1\x10\x1c\x92\xd0\
+\x71\x67\x00\xe7\x4e\xfc\x0d\x15\x4a\xc5\x83\x03\xef\x6e\x19\x15\
+\x60\x72\xe1\x81\x5a\xe7\x44\xc7\x9a\xfc\xfc\x34\xc4\x8c\xb7\x80\
+\x5e\x00\xe4\x97\x61\x5e\x8c\x44\x87\xd3\xb4\xb0\x07\x16\xe8\x7f\
+\x34\x88\xfa\xfa\xeb\x70\x3d\x74\xd7\xdd\xaf\x5d\x57\xf8\x02\x40\
+\xe2\x86\x9f\xca\xed\xe3\x2d\x65\x85\x6f\xcd\x41\xa4\x55\x84\x26\
+\x53\x74\xe4\xe6\xb1\x5f\xc1\xc0\x90\x02\x9f\xa2\x42\x96\x43\x77\
+\x79\x1e\xb0\x72\x2c\xa2\x23\x39\x8c\x33\x73\x30\x91\x1b\x86\x67\
+\x30\xe4\x0b\xa0\xf6\x97\xcb\xf0\x3c\x1a\xac\xe8\xda\xfb\xce\x96\
+\x11\x80\xe9\x9b\x0f\x67\x50\x21\x5b\x8b\x8b\xb2\x10\xeb\xb4\xc2\
+\x4f\x9e\xee\x79\x65\xf4\x0d\x2b\x10\xe8\xdc\x66\x31\xc3\x24\x88\
+\x60\x38\x3e\x14\xbd\x22\x23\x28\x05\xe0\x1d\xf4\x43\xd2\xc5\x10\
+\xc1\x21\xde\xc6\xc3\x4c\xc8\x7d\x2e\x1f\xaa\x6b\x5a\x40\x02\xc8\
+\xbc\xb5\x6b\x55\x9b\x01\x90\x58\xfc\x73\xb0\xa0\x20\x4d\xc8\xce\
+\x98\x84\x87\x9e\x00\xba\x5c\x32\xd1\xc2\x40\x20\x9e\x59\xb3\x1d\
+\x79\x7d\xad\xc8\xe9\x6d\x44\xac\xaf\xc3\x00\xe8\xb3\x26\xa3\x31\
+\x2e\x07\x0d\xb1\x99\x50\xfd\x1e\x48\x54\x1f\x8d\xf8\x4a\x74\xf2\
+\x98\x68\x17\xd1\xd4\xf6\x00\xc7\x8f\x5f\x97\xba\xaa\xdf\x36\x31\
+\xa9\x65\x47\x72\x23\x2c\xc2\xe9\xad\x1b\xb2\xd0\xe1\x96\xf0\x24\
+\xa0\x82\x23\x58\x95\xf8\xe7\x18\x1e\x5f\x5e\xdc\x01\x4b\xe0\x31\
+\x54\x8d\xa5\xa2\xb2\xa1\x02\x6b\x2a\x58\x46\xc5\xa0\x38\x0e\x9f\
+\xcd\xdb\x06\x45\x93\xa9\xe8\xa0\x5f\x20\x4a\x64\x91\xec\x10\xb0\
+\x73\x6f\x0b\x86\x07\xa5\xa5\x4c\x4a\xd9\xd1\xca\x45\xd9\x09\x25\
+\xd9\x19\xf1\xe8\x70\x05\x0d\xe7\x7a\xf1\xdc\x92\x80\x6f\xcf\x7f\
+\x05\x6b\xc0\x05\x99\xe5\x43\x95\x1e\x29\x99\x66\x5c\xe2\x55\x19\
+\x3e\xd1\x89\x0f\x17\x7d\x0a\x87\x20\x19\x57\x74\x90\x64\xa7\x89\
+\xb2\xb8\x87\xf3\x4d\xdd\x55\x4c\xf2\x96\x63\xb7\x37\xaf\x9d\x93\
+\xe4\x33\x4a\xa5\x19\xd4\xb8\xa9\xb0\x39\x77\x5b\xb1\xe6\xfa\x7e\
+\x48\x6e\x0f\x54\xf7\x13\x68\x6e\x2f\xa5\xa5\x84\x35\xca\x81\x71\
+\xd8\xc0\x3a\xa2\x20\x38\xec\xa8\x4b\x5b\x8f\xc6\x29\x99\x70\x50\
+\xc1\x75\xaa\xc8\x0b\xac\x24\x91\x5d\x07\x2f\x77\x32\xd3\x4a\x8f\
+\x69\x25\x9b\x16\x50\xf3\x84\x74\x4e\xc5\x41\xc7\x80\x84\xcf\x6b\
+\xca\x30\xe1\xea\x05\x28\x0c\x1f\x0a\x3c\x4c\xcf\x33\x9d\xaa\x46\
+\x22\x1c\xd1\xd3\x33\x73\x21\xb6\x17\x55\x20\x39\x5a\x00\x89\xc5\
+\x38\x16\x45\x06\x55\xbb\x9b\xc1\xcc\xfe\xa4\x41\xdb\x54\x38\x17\
+\x01\x3f\xf1\x48\x8e\xbc\xd4\x54\x3f\x36\xf4\xa2\xbb\x72\x21\xfc\
+\xa2\x3d\x4c\xcd\x4b\x8c\x22\x36\x07\x3c\x48\x28\xbd\x80\xf7\xf2\
+\xe2\x60\xa3\xe6\xd3\x7b\x52\x34\xf3\xd8\x5d\xdb\x0a\x66\xfe\xf6\
+\xf3\xda\xa6\x55\x33\x21\x4b\x2a\xda\xdd\x32\xbc\x32\x83\x13\x8d\
+\xf7\xf0\xa0\xea\x35\x0c\xf3\x56\x68\x63\x00\x30\x04\x10\x21\xfb\
+\x30\xa9\xe4\x37\xac\xc8\x89\x87\x8d\xd7\x90\xea\xe0\xc1\x0b\x1c\
+\xbe\xaf\x6b\x03\x93\xfe\xf1\xef\xda\x47\x1b\x32\xf1\x57\xaf\x9f\
+\x14\xa4\x41\x34\x71\xa8\x3f\xdb\x85\xe3\x7b\x36\x22\xc9\xdb\x03\
+\x89\xe5\x5e\x0a\x20\x50\x5d\x3a\x6d\x13\x50\xb0\x71\x0f\xf2\x97\
+\x24\x22\x10\x54\x48\x49\x0c\x66\xc7\x99\xf1\xcd\x3e\xca\x20\xf3\
+\x8b\xc6\xdb\xf9\xcb\xa7\x27\x79\x02\x8c\x21\x35\x9e\xe3\x70\xfe\
+\x62\x37\x72\x8f\xef\xc7\x8e\xa6\x2a\xf8\x19\x61\xd4\x2c\xf4\xe8\
+\xcd\x9a\x84\x6d\xd9\x25\x38\x53\xb0\x1e\x8b\xe6\x25\x40\x56\x14\
+\x43\xe2\x76\x51\x43\xfd\xc9\x5b\x9d\x4c\xd6\xd7\x2d\x95\x29\xe9\
+\x13\x4a\xe2\x62\xac\xc6\x40\xd3\x55\x14\x24\xad\x55\x1f\x6a\x43\
+\xe7\xfe\x22\x44\x0d\xfb\x10\xe4\x04\x43\x19\xcf\x0f\x31\x0d\x26\
+\x85\xfa\x26\xc2\x8a\xa4\xf5\x35\x28\x5e\x9d\x01\x13\x69\x5c\x57\
+\x91\x3e\x08\x7b\xfb\x7d\xb8\x71\xad\xa7\x8a\xc9\xd9\x79\x29\xd7\
+\x62\x8b\x38\x9d\x3d\x77\x12\xb5\xbf\x12\x9e\x35\x1c\xda\xef\x3c\
+\xc1\xaf\xc7\xda\x70\xe3\x68\x29\xc6\x2b\xc3\x90\xa8\xd1\xe4\xb0\
+\x92\x78\x52\x90\x40\x8d\xf6\x88\x8b\x40\xca\x1b\x95\x78\x7d\x65\
+\x06\x52\xa7\x46\xd1\xac\x0a\xbd\x37\x11\xff\x4d\x97\x1e\x60\xd0\
+\x3b\xbc\xd4\x08\x6b\xe1\xce\xd6\xe0\x82\x57\x27\x0b\xf6\x48\x53\
+\x38\x0b\xe2\x56\xe0\x71\xe5\x66\x3f\x0e\x1f\xb9\x8a\xcd\xf7\x4f\
+\xe2\x83\xee\x53\x48\xf3\x77\x1b\x0e\xae\x9b\x13\xf0\x5d\xc2\x32\
+\xec\x9a\xbc\x1c\xab\xde\x9c\x89\x59\x33\x62\x20\x49\xb2\xd1\xa0\
+\x7a\xf4\x9e\xa1\x20\x9a\xff\xb8\x2f\x5d\xd8\x9a\x69\x32\x00\x96\
+\x94\x5f\xc9\xe0\x78\xae\x75\xe9\x82\x78\x63\x44\xeb\x69\xea\x54\
+\xf1\x3c\x0b\x6f\x50\x46\x7d\xc3\x4d\x74\xde\x1e\x80\xdb\xe5\x37\
+\x00\x1c\x4e\x33\x92\xa6\x45\x23\x3f\x6f\x06\x6c\x26\x9e\x22\x57\
+\x47\xde\xe8\xa3\xfb\x74\xf3\x3d\x28\xb2\x92\x79\x76\xcb\xac\xb6\
+\x11\x62\x73\x2b\xaf\x95\x47\x8d\x37\x97\x2d\x4e\x8f\x45\x80\xa8\
+\xd2\xc2\xfb\x85\xd5\x81\x28\x65\x5a\x8d\x21\x07\x08\x05\xa0\xea\
+\xe3\x9b\xee\xa9\xe1\x8b\xfa\x91\x48\xf7\xce\x5d\xeb\xc3\x93\x47\
+\xfe\x8a\x33\xa5\xe9\xcf\xc6\xf5\x53\xcb\xfb\xe1\x46\x6d\x4c\xb4\
+\x79\xcd\x82\xd4\x68\x28\xaa\x36\xf2\x78\x2c\xd3\x83\xe0\x88\x9a\
+\xe6\xf6\x01\xf4\x0f\xf8\xeb\x1a\xde\x4f\x79\x71\xe1\x3c\xb5\x65\
+\x7b\x6e\x97\x0b\x26\x94\xcd\x4f\x1d\x87\x18\x8b\x48\xad\x4f\x40\
+\xd0\xf0\x5f\xac\x10\x1b\xe4\x98\x94\xd3\x3f\x18\xc0\x9f\xed\x8f\
+\x21\x05\x51\x71\x6a\xe3\xb4\xd1\x57\xe6\x53\x5b\x51\x73\x27\x83\
+\x48\x6a\x89\xb6\x89\x42\x22\x35\x4c\x8c\x45\x40\xa4\x18\x1a\x64\
+\x21\xe7\xb4\xbd\x68\xf1\xf7\x0f\x4a\xe8\xa2\x06\x1d\xf0\x06\x24\
+\x1a\x7f\x59\x27\x8a\xa6\x8e\xbd\xf4\xff\x6d\x2b\x6b\xef\xe6\xaa\
+\x2a\xb3\x56\x61\x90\xaf\xe9\x9f\x2d\x11\xa1\x8d\xe6\x1f\xa6\x85\
+\xa4\x7f\xb6\x50\x2f\xb1\xac\x76\xf0\x58\xe1\x94\x51\x3f\x5b\xfe\
+\x01\x2a\x40\x8a\x7e\xe4\x95\xdf\x9d\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x04\x49\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x10\x49\x44\x41\x54\x78\xda\xcd\x95\x6b\x6c\x14\x55\
+\x14\xc7\xff\x77\x66\x3a\x7d\x6d\xb7\xcb\xb6\xdd\xbe\xb7\x05\x6d\
+\x0c\x42\x62\x20\x41\x52\x44\x54\xe4\x91\x48\x77\x49\x4a\x44\x62\
+\xb4\x56\xf9\x42\xa2\xf1\x8b\x31\x7c\x52\xea\x23\xc6\xe8\x17\x63\
+\x62\x50\x13\xc3\x17\x5f\x1f\x80\xda\x56\xd4\x36\x12\x31\x28\x6d\
+\x02\x24\xad\xd8\x60\x4b\xb7\x4b\xd7\x6e\xb7\xfb\xea\x7b\xbb\xdd\
+\x79\x5d\xcf\x4c\xc9\x92\x65\xc5\x56\xd4\xc4\x49\x6e\xee\xdd\x73\
+\xcf\x39\xbf\xb9\xe7\x3f\xf7\x2c\xc3\x7f\xfc\xb0\xff\x15\x60\xa8\
+\xa9\xf9\xa8\x0e\x5e\x7b\xef\xd7\xed\x2f\xfc\xeb\x80\xa1\xdd\x5e\
+\x5e\xb4\x71\x2d\x38\x13\x10\xfb\xd5\x87\xfb\x7a\x3a\x57\x15\xbb\
+\x2a\xa7\x6b\x7b\xbc\xbc\xc2\xf3\x00\x64\x51\x01\x8f\x45\x91\x52\
+\x18\x7c\x17\x03\xd8\xdc\xdd\xbe\x62\xfc\x8a\x0e\xd7\xbd\x07\x8f\
+\x89\x8e\xa2\x36\xd7\xb6\x75\x50\x47\x46\x28\x42\x84\x24\x8b\x08\
+\x8c\xcc\x22\xb1\xa8\xb4\x6d\xea\x3a\xfd\xda\x3f\x02\xf8\x1e\x69\
+\xe2\x35\x47\xbc\x48\xfd\xd8\x03\x56\x52\x49\x16\x0e\x1e\x99\x84\
+\x64\x77\xe2\xca\x2f\x11\x6c\xed\xfe\x8a\xdd\x31\x20\xb0\xef\x40\
+\xa4\x70\xcb\xfa\xb2\x3c\x61\x0a\x39\x0f\xed\x47\xce\x8e\x3d\x96\
+\x5d\x39\xd7\x03\xed\xd4\x09\x4c\x25\x72\x10\x0a\x2f\x84\xef\xff\
+\xa6\xbd\xe2\xce\x00\x7b\x9b\x79\x45\xeb\x2e\xa4\xce\x7d\x07\xdb\
+\x87\x1d\x19\x7b\x73\x2d\x1e\xe4\x96\x57\xe1\xca\x50\x1c\x5b\xba\
+\x4e\xb1\xbf\x0d\x08\xee\xd9\xcf\xed\xde\xed\x90\x12\x21\x68\x7e\
+\x3f\x6c\xc7\x4f\x67\x02\x9e\x7e\x0c\x52\xb9\x1b\x73\xb3\x09\xf8\
+\x83\xf3\xd8\xf6\x6d\x07\x5b\x35\x60\xd2\x7b\xf0\x75\x56\x52\xf4\
+\x8a\xf3\xd1\x0d\x50\x7c\x7e\x18\xa1\xf1\x6c\x40\xab\x17\x92\xab\
+\x16\x32\x69\x32\xe8\x9f\x46\x52\xd5\xde\x68\xec\x38\xf9\xea\xaa\
+\x00\xa1\x9d\x4d\xdc\xfe\xd4\x6e\x5a\x8c\x5a\x5f\x8d\x11\x9a\x80\
+\xed\xfd\x2f\x32\x7c\x66\x1e\xde\x08\xa1\xaa\x1e\x82\xaa\x42\x97\
+\x0a\x70\x29\xa6\x62\xd7\xf7\x67\xd8\x8a\x80\xb0\xf7\xf1\x4e\xb9\
+\xa1\xc6\x93\xbf\xc9\x0d\x3e\x1e\x84\x1e\x8f\x41\xbb\xdc\x8b\xe2\
+\xb3\xbf\x65\xf8\xc5\xd7\x16\x40\xac\xbd\x1b\x50\x75\xc8\x3a\x47\
+\xff\xf5\x18\xc2\x49\xde\xd5\xbc\x10\xf3\xfe\x25\x20\x72\xa0\x85\
+\x3b\x0e\x35\x22\xd9\xdd\x01\x63\x7a\x0a\x82\x28\xc3\x18\x1d\x81\
+\xe3\x62\x28\x13\xd0\x60\x4f\x03\x98\x06\xc8\x06\x43\xd7\xe0\x38\
+\x9e\x48\xc4\xd9\x6d\x01\x93\x3b\xf6\x4e\xe4\x36\x94\x57\xca\x62\
+\x18\xda\x62\x6a\x79\xdb\xe0\x30\x7c\xc3\x70\xf4\x05\x6f\x0b\xe0\
+\x2a\x87\xa4\x03\xbf\xc7\x17\x30\x10\x9d\x0d\x3c\xb9\x30\x55\x97\
+\x05\x08\xbb\xea\x3c\xda\x92\xda\xe9\x7c\xa7\x05\xea\xcf\x7d\xe0\
+\x92\x64\x05\x5b\x00\xff\x28\x1c\x17\xc6\x32\x01\xeb\x9d\x10\x2b\
+\xeb\xd3\x00\xa6\x1a\x28\x22\xbd\x4e\x0e\x07\xcd\xac\xde\x43\x73\
+\xf1\xae\x0c\x40\x28\xaf\x94\xdb\xdb\x9e\x85\xee\xeb\xa7\x20\xba\
+\xad\xa6\x51\xbb\x01\x98\x99\x46\xce\xce\x26\x14\xbe\xf4\xa6\xe5\
+\xbb\xf0\xf6\x51\xa4\xbe\x3c\x01\xd1\x59\x4b\xbe\x9a\x05\x00\x01\
+\x44\x2a\x53\x32\xa1\xe0\xcc\x78\x04\x87\x93\x33\x2c\x0d\x88\xba\
+\xea\x8e\xc1\xe5\x6c\x2b\x78\xa6\x11\xfa\xd5\x61\xb2\x08\xe0\x86\
+\xb1\x0c\xd0\x69\x56\x54\xea\x43\x57\x61\x4c\x4e\x2f\x1f\xdb\x5e\
+\x48\xa3\x18\xa2\xbd\x22\x03\xc0\x35\x8e\x22\xce\x70\x76\x22\x86\
+\x68\x72\xe9\xa3\x96\xc5\xd9\x23\x16\x60\x52\x70\x70\xfb\x27\x2f\
+\x43\x3b\xff\x03\x20\x4a\x56\xd2\x34\xc0\x3c\x41\x24\x04\xdb\x7b\
+\x9f\x43\xda\xb0\xd9\x02\x68\x03\x97\x30\xf7\x5c\x33\x84\xe2\xd2\
+\x74\x89\x4c\x00\x08\x20\xd0\x6c\x8a\xfe\x69\x20\x88\xe7\x53\xf3\
+\x8c\x45\xd7\x54\xf7\xc9\x9e\x07\xb7\x0a\x6e\x89\x9a\x58\x9c\x7a\
+\x19\xcf\x06\xf8\xae\x91\xc8\xe3\x99\x1a\xdc\xe3\x80\x58\xbd\x2e\
+\x0b\x60\xce\xb9\x14\x36\x38\x33\x8f\xfe\xf9\xb9\x28\x8b\xe6\x95\
+\x71\xdb\xf1\x17\xa1\x5c\x38\x4f\x77\x4a\xa6\xe4\x5a\x36\x60\x8c\
+\x44\xfe\xe9\x56\x91\x4b\x49\x64\xf7\x9f\x02\xcc\x91\x4f\xa5\xfa\
+\x6c\x62\x02\x2c\x5a\x56\xcf\x6d\xef\xb6\x42\xe9\xed\x25\x41\xcc\
+\xf2\xe8\x59\x00\x24\x12\x00\xb5\xe7\xc2\xb7\x3e\x80\x50\x52\x41\
+\x8d\x6e\x1f\xb4\xd1\x21\x88\x8e\xaa\xb4\x06\xfc\x16\x80\x93\x72\
+\x7d\x1c\x0c\x10\xc0\x51\x3d\x96\xe7\xd9\xee\x66\x77\x09\xc0\x7c\
+\xf2\x26\x40\x33\x2f\x10\x0d\x5a\x33\x2a\xdb\xd2\xc0\x20\x05\x2a\
+\xe6\xdf\x01\x58\x7e\x3e\x69\x25\x22\xd7\x51\x0e\xa4\x96\x4f\x20\
+\x28\x37\x01\x32\x15\xe1\x72\x7c\xc6\x2c\xd1\xf2\x57\x14\x5e\x53\
+\x33\x46\x39\xdc\x70\xd9\x60\xd0\xb5\x37\xe8\xed\x75\xc6\x88\xc3\
+\xa1\xd3\x06\xa5\xb0\x7e\x9b\x87\xd1\xb9\x6e\xcd\x2a\xd9\x0d\x82\
+\x6b\x37\xf6\x35\x5a\x5b\xfe\x30\x10\x5d\x52\xc8\x6e\x04\x0e\x2f\
+\xce\xd6\xfd\x01\x75\xa3\x49\xde\x80\x7c\x62\x3c\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xdc\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xa3\x49\x44\x41\x54\x78\xda\x85\x56\x6d\x70\x4c\x57\
+\x18\x7e\xce\xfd\xd8\xcd\xee\x4a\x6c\x9a\x0f\xa1\x82\xb5\x8d\x4a\
+\x54\xd3\xa8\xa1\x98\x0e\x49\x4c\x98\x61\xa6\x3a\x2d\xea\xab\x44\
+\xa7\x43\x1b\x54\xdb\xdf\xfd\xd1\x3f\x7e\x29\xd3\x4a\x4c\xb4\x49\
+\xfd\x30\x8a\x0c\x1a\x5a\x8a\x50\x62\xaa\x43\x45\x36\xd1\xd1\x10\
+\x12\xd2\x64\x8a\x7c\x08\x36\xf6\xeb\xde\x7b\x4e\xdf\x7b\x77\xb3\
+\x29\x99\xd4\xdd\x39\xb3\x77\xcf\x3d\xf7\x79\xde\xf3\xbe\xcf\xfb\
+\x9c\x65\xf8\x9f\xeb\x56\xf9\xda\x02\x61\xf0\x25\x92\x5d\x29\xb2\
+\xa5\xbb\x3c\x9c\x9b\xb3\x0c\x92\x04\x44\xba\x02\xb7\x79\x48\x3b\
+\x05\x99\x55\x65\xad\xff\xfe\xd7\xa1\x30\xd8\x10\xc0\x79\x4c\x95\
+\x2e\x24\xe6\xa4\x3b\x5c\xde\x91\xb0\x0f\x4b\x00\x37\x1e\x02\xda\
+\xbd\xd8\x2b\x02\x50\x32\xa0\xf5\xa9\xf0\xb7\xde\x45\xdf\xf5\xde\
+\xa0\xd0\x8c\x59\x59\x1f\x55\xfa\x9e\x4b\xd0\x5c\x5a\x5c\xea\xf4\
+\xba\x4b\x46\xbc\x99\x03\xce\x7b\xc1\x43\xd7\xa1\x6b\xff\x40\x12\
+\x32\xe1\xb2\xd8\x10\xb1\xd5\x02\x8a\x2d\x15\x4c\xc9\xc2\xfd\xcb\
+\x8f\x11\xb8\xd3\x55\xf6\xf2\xc7\xbb\x37\x0c\x49\xd0\xbc\x63\xcd\
+\xfe\x94\x7c\xcf\xd2\x24\xcf\x48\xf0\x60\x23\xf4\x48\x2b\xcd\x2a\
+\x31\x50\xc9\x0a\x3c\x3e\xcc\x97\x4d\xa2\xd8\x6f\xc5\x96\x02\xff\
+\xfd\xf1\xe8\xfc\xbd\xe5\x40\xf6\xc6\xdd\xef\x0d\x22\x68\xda\xb1\
+\xa6\x34\x3d\xdf\x53\x92\x34\x76\x14\x6d\xbd\x06\x06\x7f\x02\x09\
+\xcf\x44\x2d\x58\x0c\x18\x4f\x93\x46\x37\x03\x59\x91\xe1\xef\x48\
+\x44\x67\x23\x2b\xcb\x29\xa9\xd8\x10\x27\xb8\xb1\xb3\x38\x2f\x61\
+\x5c\x72\xfd\xa8\xd9\xd9\x88\x3c\xae\xa1\xc5\x41\xeb\x65\x66\x7e\
+\x4c\x1c\x1e\x1d\x26\x88\x05\x4e\xf3\x32\xd1\x83\x0b\x98\x85\x17\
+\x16\x59\x3f\x89\xc0\xbd\x86\x44\x3c\xe9\x52\xa7\xe4\xac\xaf\xf0\
+\x59\x04\xcd\xdf\x7d\x10\x18\xbf\xfc\x0d\x47\x24\xf0\x27\x44\xb8\
+\xc5\x4a\x8b\x09\xae\xaa\x1c\xcd\x3e\x01\xf7\x08\x86\xd4\x54\x06\
+\x43\x97\x2c\x62\x0a\x14\x77\xdb\x34\x84\xfa\x0c\x78\xb3\x55\x68\
+\x61\x93\x44\x1e\x48\x08\x45\xd1\x56\xeb\x0e\x66\xaf\xab\x74\xb2\
+\xbf\x76\x16\x17\xb8\x5f\xcb\x38\x93\x3a\x29\x19\x9a\xff\x2c\x3d\
+\xb5\x47\x73\x4a\x91\xf8\x6a\x75\xd4\xd7\x6a\xd0\x75\x60\xc5\x46\
+\x1b\x9c\x2e\x1b\xcc\xc0\x1f\x74\x6a\x38\x5c\x19\x82\x61\xe8\x98\
+\x39\x5b\x46\xee\x74\x27\xdd\x53\xad\xcc\x87\xc2\x0c\x4d\xa0\xfb\
+\x8e\x03\xfe\x36\x5b\x21\xbb\xf6\xf5\xea\xf2\xb1\x4b\xa7\xae\x93\
+\xe1\x03\xd7\xba\xe3\x39\xb7\x29\x06\xaa\x2b\x42\xa8\xfb\xed\x16\
+\x45\x27\xb0\xb8\x78\x02\x72\x67\xb9\xe8\x99\x82\x6b\x75\x41\x54\
+\x55\x36\x21\x12\xd6\x31\x7d\xe6\x38\x2c\x5a\x95\x44\x4a\x53\x29\
+\x72\x39\x56\x58\x06\x3d\x28\xa1\xed\x92\x6b\x17\x6b\x2a\x5f\xdb\
+\x9a\xb5\x6a\x86\x27\xdc\x73\x38\x1e\xbd\xb9\xc4\xae\x70\xec\xf9\
+\x26\x80\xab\x97\x6e\x58\x53\xcb\x8b\x33\x91\x3b\x4d\x80\x51\x97\
+\xd5\xd7\x46\x50\x7d\xb0\x1b\x11\xdd\x40\x4e\x76\x12\xde\xff\x70\
+\x18\x34\xe9\x05\x48\x72\x72\x5c\x0c\xb2\xcc\x71\xf3\x7c\xc2\x6d\
+\xd6\x7a\x78\x93\x18\x5d\x98\x09\xed\xe1\x79\x8b\x40\xa2\x8f\xe0\
+\x7d\x60\xda\x1d\x1c\xdc\xde\x8d\x23\xc7\xfb\xd0\xdd\x1b\x42\xd9\
+\x16\x15\x63\x72\x64\x2b\x0b\xbe\x1a\x8e\xad\x15\x06\x38\x51\xaf\
+\x9c\x2b\x63\xe1\x32\x99\x76\x40\x3b\x37\x38\x24\x87\x1b\xcc\x9e\
+\x04\xd9\x31\x1c\x1d\xb7\xbc\x60\xad\x87\x36\x8b\xd1\xf9\x2e\xe8\
+\x8f\x2e\xc3\x08\x34\x83\x07\x7a\xc0\x28\xb7\xe0\x44\xa4\x09\x9c\
+\xd8\x0b\xbc\x94\x05\x4c\x9c\x2e\x51\x91\x09\x84\x54\x63\xa7\x8d\
+\xd6\x1e\x32\xe1\x19\x66\xcc\xa1\x39\x26\x45\x95\x64\x50\x8c\x86\
+\xb0\x76\x21\x33\x8e\x86\x6a\x1b\xd8\xb5\x6f\x17\x09\xcf\xbc\x76\
+\x72\x81\x46\x92\xa4\x1d\x76\x1b\x43\x24\x18\x55\x83\xd0\x48\x76\
+\xa6\x1a\x8d\xe8\xbd\xd5\xc0\x44\xc0\x38\xb3\xe6\x61\x90\xb2\xb4\
+\x68\x4f\xc8\xf4\x8a\x44\x9a\xd6\x82\x02\x82\xd6\x2b\xb2\xc0\x95\
+\x9f\x12\xc0\x2e\x6e\x18\x23\x72\x3f\x77\x81\x3f\xf8\x9b\xc4\x29\
+\xc3\x88\x0c\x74\xb6\x16\x16\x16\xa0\x15\x99\x05\xce\x06\xee\x8d\
+\x58\x03\x9a\x60\xd2\xd3\x76\xc3\x03\x44\x26\x11\xc1\x31\x3b\xd8\
+\x89\x85\x23\x5a\x8b\x2a\x5f\xf1\x04\x3b\x2e\xc2\xa9\xca\x08\xf6\
+\x46\x5b\x93\x32\x04\x23\x3c\x04\x30\x47\x1c\xdc\xbc\x37\xf1\x6d\
+\x86\xc0\xb3\xd7\xc9\xbd\x54\xe4\x23\x85\x29\xe5\x73\xb6\x4d\x5b\
+\xa7\x06\xce\x41\xf7\x2b\x83\x16\x89\x21\xa2\x46\x7f\x67\xd3\xb7\
+\x12\x1e\x6c\xca\xc1\x47\x0c\xe7\x7e\x56\x77\xb1\xa3\xf3\x53\x0b\
+\x3c\x73\xd3\xcf\x78\xf2\xc9\x39\xfd\x7e\xa8\x54\xb0\x2f\x3e\xd1\
+\x90\xed\x95\xb0\xe6\x53\x05\x81\xc7\x64\x07\xa6\x42\x78\xcc\x0e\
+\xfe\x0b\x4e\xc3\x61\x67\x68\xb8\xa8\xe3\xab\x7d\x3a\xb6\x7f\x66\
+\x87\x3b\x45\xb2\xfa\xe6\xe6\x1f\x32\x5a\x5a\xa5\x42\x8b\xfa\xe8\
+\x82\x8c\xc0\xbc\xad\x5e\x47\xb8\xdd\x47\x82\x90\xc9\xec\x18\xb6\
+\x7c\xa9\x21\xd1\xc9\xb0\x69\xa3\x0a\x57\x12\x15\x3e\x64\x12\x45\
+\x81\x29\xbd\x50\x25\x6a\x27\xda\x51\x69\x65\x04\x97\x6f\x72\x6c\
+\xdb\x6c\x47\x52\x32\xb3\x6a\xc8\x88\xf9\x74\xb5\x3d\xf8\xf6\xf1\
+\xfb\x4e\x8b\xe0\xc7\x79\x69\x79\x23\x27\x27\xd7\xbf\xba\xb8\x0f\
+\x7a\x8f\x9f\x16\x90\x2a\x28\xca\x23\x7b\x0d\xec\x39\x49\x76\x90\
+\x23\x61\xb2\x87\xc1\x9b\xc9\x2c\xd3\xeb\xa6\xb3\xa7\xa9\x45\xe0\
+\x58\xa3\x81\xb7\xa6\x2a\x58\xf9\x8e\xcd\xf4\x3d\x70\x52\xb7\x42\
+\x0d\x5d\x77\x56\x46\x67\xb7\x34\xe5\xdd\x5f\x3a\x7d\xf1\xe4\x55\
+\x15\xa4\x96\xbe\xbe\x7a\x7c\x49\xc6\xa8\x66\xea\x07\x6e\x69\x5b\
+\x25\x22\x41\xf7\x17\xce\x69\xa8\xbb\xca\xd1\xde\xc3\x2d\x3f\x1b\
+\xee\x94\x30\x73\xa2\x8c\x19\xd3\x54\x24\xba\x25\x84\x43\x51\xb5\
+\xc9\x04\xde\x71\x83\x3a\xbd\x41\x2a\x5b\x56\xd3\x35\x60\xd7\xfd\
+\xd7\x0f\xf9\x29\xfb\xa7\xce\xb7\x2d\x1d\x3d\x39\x40\x5e\x42\xe0\
+\x14\x11\x74\x01\x29\x36\x64\x1a\xd0\xcd\x3a\x93\xd7\x90\x65\x70\
+\x44\x8b\x6e\x5a\xba\x42\x3e\xd8\xd6\x24\xe1\x8a\x4f\x3a\xb0\xf2\
+\x74\xd7\xe0\x03\xa7\xff\xda\x57\x98\x56\xfa\xe2\x58\x51\x32\x65\
+\x81\x46\x45\xa4\x9c\x86\xcc\xad\x0b\x8b\x48\x44\xfa\x0f\x9a\xa8\
+\xa1\x99\x87\xbf\xac\x32\xab\xa8\x57\xce\x2b\xe8\xb8\xcb\xca\x56\
+\x9c\xe9\x1a\xfa\xc8\x8c\x93\x14\xa5\xe5\x29\x4c\x5c\xf0\x4e\x10\
+\x8e\xcc\x49\x1c\xc3\x12\xb9\xd5\xcd\x96\x4c\x63\x92\x35\xc1\xfb\
+\x7a\x25\xb4\xb7\x30\x52\x8b\x1c\xd4\xb9\x98\x45\x69\x79\xfe\xa1\
+\xff\x14\xd1\xdc\xb4\x02\x6e\xb0\x25\x36\x1b\x8a\x92\xdd\xc2\x23\
+\x62\x87\xbd\x99\x92\xde\x87\xd2\xed\x88\x26\x4e\x11\x51\xd5\xb2\
+\xd3\x5d\x43\xfe\x6d\xf9\x17\xcb\xa7\xa1\xa5\xb5\xbf\xf4\xf9\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xc2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x89\x49\x44\x41\x54\x78\xda\xed\x55\x5d\x6c\x53\x65\
+\x18\x7e\xbe\x73\xda\xb2\x2d\x19\x1a\x41\x08\xb0\xa2\xa3\x75\x65\
+\xcb\xc8\xe8\xba\xc2\x9c\x0c\xc5\x8c\x61\x6c\x32\x6f\x46\x18\x60\
+\x42\x4c\x83\x21\x81\x25\xfc\x84\x60\x62\xd4\x00\x2a\x60\xd4\x78\
+\x61\x34\x31\x80\x8a\xc6\x98\x0c\xae\x08\x17\x5e\x03\x37\x20\xb3\
+\xed\x7e\x92\xfd\x75\x5d\xcf\xe9\x0f\x6d\xd7\xf3\xb3\x75\x6b\x0f\
+\x6d\x8f\xef\x39\x73\x9a\x19\x6f\x66\x42\x62\x0c\xdf\x39\x27\xdf\
+\x77\xbe\xf7\xfd\x9e\xe7\x79\xdf\xbc\xef\x39\x0c\x8f\x79\xb0\x27\
+\x04\xff\x3d\x82\x43\x6f\x1d\x8e\xbb\xdd\xee\x75\xa5\x52\x71\x79\
+\x40\x1c\x87\xfc\xdc\x1c\xc2\x93\x91\xf3\x97\xbf\xf9\xea\xfd\x7f\
+\x24\x38\xf0\xe6\xa1\xe8\xe9\x53\x27\xec\x0e\xa7\x13\x85\x42\x7e\
+\xf9\x01\xea\x3a\x3e\xfb\xfc\x0b\xa4\x52\xd3\xfb\xaf\x5e\xf9\xfa\
+\xe7\x25\x04\xfb\x7a\x0e\x46\x8f\xf5\x1e\xb3\xd7\x3e\xff\x1c\x32\
+\x59\x89\x0c\x74\x2d\x13\x9f\xd1\x01\xab\xd5\x8a\x0b\x17\x2e\x1a\
+\xc0\xf6\xef\xbe\xbd\x2c\x9a\x10\x3d\x04\xee\xf7\xfb\xed\x35\x1b\
+\xed\x88\x27\x12\xa6\xe3\xbf\x1d\x3c\xcf\x41\x55\x73\xf8\xe9\x87\
+\x6b\xb0\xda\x6c\x2b\x58\x77\x77\xcf\xf0\xea\x35\x6b\xeb\xab\x9f\
+\x5a\x89\x52\xb1\x64\x82\xeb\x14\xaa\x31\x73\x1c\x43\xa9\x5c\x5e\
+\x08\xd3\xd8\x2f\xeb\x66\x54\x86\xad\xbc\xe8\x63\x8a\x59\x14\xa4\
+\x9b\x6b\xde\xc2\x23\x19\x13\x91\xcb\xe5\x86\xd8\xa5\x4f\x3e\xd5\
+\xbb\xde\xe8\x82\xa3\xb6\x16\x92\x2c\x41\x92\x64\x38\x37\x6d\x42\
+\x2c\x99\x40\x3c\x9e\x80\xb7\xb9\x19\xb2\xaa\x50\x5e\x53\x70\x3a\
+\x1c\x50\x54\x15\xa9\x74\x1a\x75\x0e\x27\x84\x58\x0c\x99\xe9\xac\
+\xa9\x1a\x7f\x92\x2d\x44\x41\xe2\x71\xbd\xaf\x0f\xec\xc3\x8f\x2e\
+\xe9\x1d\x9d\x1d\xd8\x58\xb3\x01\x8a\x42\x87\x33\x19\xb8\x5e\x70\
+\x20\x99\xca\x40\x10\x45\x22\x70\x43\x9d\x99\x85\x20\x08\xa8\xdf\
+\xec\xc2\x8c\x3a\x0b\x31\x1e\xa3\x75\x1d\xf9\xa4\x91\x7c\x98\x82\
+\xc5\x62\x01\x41\x82\xe7\xb8\x85\x60\x58\x11\xd6\x8a\x0a\xfc\xf8\
+\xfd\x35\xb0\xf7\x3e\x38\xab\x7b\xbc\x5e\xd4\xd7\xb9\x30\x9d\xcd\
+\x42\x20\xd5\xee\x2d\x8d\x10\x49\xdd\xc8\xc8\x18\x3a\x5e\xdd\x05\
+\x49\x91\x31\x3a\x3a\x06\x6f\x8b\x07\xb2\xa2\x60\x74\x6c\x02\xdb\
+\x5a\x9a\x11\x89\x44\x10\x15\x12\x28\x68\x65\xc4\x72\xbf\xa0\x58\
+\x2d\x62\x36\x52\x8b\x17\x1b\x7c\xa8\xac\xb2\xe1\xd6\xcd\x5b\x60\
+\x67\xde\x79\x57\x77\x38\x5d\xd8\xd2\xd8\x40\xea\xd3\x88\x4c\x09\
+\x68\x25\xa0\x29\x52\x3c\x30\x38\x88\x2e\xdf\xeb\xc8\x48\x12\x42\
+\xa1\x41\xec\xdc\xf1\x12\xb2\x94\xc6\xa1\xa1\x61\x5a\xef\xc0\xc8\
+\xf8\x38\xa2\x53\x22\xc6\x92\xf7\xd0\x7b\x4e\xc3\x33\xac\x06\x7d\
+\xb1\x3b\x10\xbf\xec\x84\xab\xd1\x81\xbb\x77\x6e\x83\x1d\x3f\x79\
+\x5a\x7f\x76\xcd\x5a\x34\x12\x41\x3a\x9d\x45\x38\x1c\x46\x5b\xeb\
+\x76\x4a\x43\x1c\xc1\x50\x08\x3e\x9f\x0f\x8a\x2c\xe3\xc1\x83\x00\
+\x76\xbd\xd2\x8e\x2c\x91\x05\x82\x21\xbc\xbc\xb3\x1d\xd1\x68\x94\
+\xfc\x23\x18\x4c\xde\xc6\x81\x8b\x65\xac\x42\x15\x6e\x24\x04\xcc\
+\x7f\xdc\x8a\x86\x66\x17\x42\xbf\xf5\x83\x1d\xed\x3d\xae\x57\x55\
+\x56\xc2\x49\x29\x52\x48\xdd\x38\xa9\xda\xb6\xbd\x15\x19\xca\x6d\
+\x70\x20\x80\xce\x3d\xaf\x21\x3c\x3e\x81\xfb\xf7\x7f\x45\xf7\xbe\
+\xbd\x50\x65\x05\xc1\x60\x10\x6d\x14\x41\x82\xd2\x38\x19\x9e\x84\
+\xf4\x50\x45\xda\x33\x0c\x6e\x43\x11\xf9\x80\x0d\x4d\xf9\x36\x54\
+\xae\xac\x40\x84\xc4\xb2\xb7\x8f\x1c\xd1\x19\xb3\x62\xfd\xfa\x75\
+\x98\x9f\x9b\xc7\xc4\x44\x18\x4d\x5b\x9b\x30\xab\xce\x60\x60\x20\
+\x84\xb6\xf6\x76\x14\x35\x0d\xfd\xfd\x01\xb4\x78\x3d\xd0\x0a\x1a\
+\x11\x04\xe0\xf1\xb6\x40\xce\xca\xa6\x20\x9b\xc5\x06\x6d\xbe\x80\
+\x42\x5e\x43\xf5\xd3\xd5\xb0\xae\xb0\x82\xe3\x19\x55\x1e\xf5\x94\
+\xdf\x7f\x58\x2f\x68\x45\xaa\xfd\x32\xca\x54\xf3\xc6\x30\x66\xe3\
+\xe1\xa8\x2a\x8a\x8f\x1e\x2d\x54\xb7\x51\xfb\x7f\xd8\x8d\xfd\x45\
+\x3b\xcf\xf3\xe6\x6c\xd8\x19\xe3\xcc\x3e\x31\xde\x2d\xb4\x1f\xa7\
+\x34\xb3\xdd\xbb\xf7\xe8\x4b\xda\xfd\xaf\xbe\x5f\x66\x0f\xeb\x8b\
+\xf7\x92\x4f\xc7\xff\xf0\x7f\xf0\x84\xe0\xef\xe3\x77\x59\x46\x91\
+\x77\xae\xe8\x85\xd5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\x64\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x2b\x49\x44\x41\x54\x78\xda\x9d\x55\x0b\x4c\x9b\x55\
+\x14\xfe\xee\xdf\x17\x6c\x19\x1b\xa8\x6c\xb1\xe1\x21\x93\xcc\xd7\
+\x44\x64\x28\x73\x8b\x93\xe9\xec\xa6\xdb\x8c\x71\xc8\x63\x64\x6a\
+\x24\x1a\x66\x1c\xd3\xc4\x49\xd4\x05\xc2\x62\x34\x26\x46\x34\x66\
+\x4c\x97\x69\xb2\x85\xf0\xc8\x98\xc9\x98\xae\xeb\x62\x1c\x04\xac\
+\x16\xc6\xc0\xac\x0c\xc1\xae\x94\x42\x29\x92\xe2\x4a\x81\x3e\xff\
+\xff\x7a\xfb\x6e\x79\xad\xda\xa4\xe9\xbd\xf7\x9c\x7b\xbe\x73\xbe\
+\xfb\x9d\x53\x82\xdb\x7c\x36\x1c\x53\x57\x0a\x40\xb9\x44\xc6\xa5\
+\xde\x9d\x14\x8f\xf1\x29\x3b\x5c\x4e\xe1\x0f\x11\x21\x87\x06\x3e\
+\xca\x6b\xbb\xdd\x7d\xb2\x9c\x31\xf3\x98\x7a\x34\xfb\xbe\x24\x79\
+\xe5\xb6\x54\xac\x4b\x88\xc3\x9c\x87\x42\xcc\x11\x5c\x37\x4f\xa3\
+\xae\xc3\x88\x41\xbd\xad\x79\xa8\x6a\x73\xe1\xff\x02\xc8\x38\xda\
+\xd9\x5b\xb6\x2b\x2d\xeb\xf5\x6c\x39\x0c\x33\x6e\x98\xec\x02\xb8\
+\x80\xcd\x0b\x92\x20\x25\xf8\xfa\x8a\x0e\x3d\xfd\x53\x35\x83\xd5\
+\x5b\xaa\xfe\x13\xc0\x86\xea\xce\x9c\xf5\x29\xab\xba\xeb\x0a\x1f\
+\xc0\xe0\xb4\x87\x65\x0e\x70\xf3\x3c\x09\x21\xe0\x38\x8a\x23\xa7\
+\x7a\xe0\x71\x0b\x6b\x06\x6a\xb6\x5a\x63\x06\xc8\xa8\x6c\xff\xf9\
+\x93\x57\x1e\xdc\x9e\x99\xbc\x0a\x23\x36\xde\x1f\x7c\x11\x4f\x99\
+\x98\x43\x6b\x9f\x09\x97\x3a\x8c\x87\x87\x3e\x7e\xf2\xcb\x98\x01\
+\xee\xa9\x6c\xeb\x6a\xac\xc8\xd9\xf4\xb7\x4b\x04\x37\x15\xa2\x9d\
+\x48\x78\xe7\xa5\x4a\x3b\x6e\xc5\xc9\xb3\x37\x1a\x74\x9f\xe5\x97\
+\xc4\x0c\xb0\xb1\xba\x43\xa3\x7c\xff\x89\xdc\x76\xd3\x1c\xc4\x81\
+\x80\x91\x14\x05\x97\x1c\x3b\x9c\x71\x7a\x70\xf4\x9b\xae\xab\xfa\
+\xcf\x9f\xde\x14\x33\xc0\x43\x55\xed\x9a\x8b\x47\xb6\xe4\xb6\x05\
+\x00\x88\x0f\x80\x43\x90\x29\x9b\xc0\xfb\xd7\xcc\xc6\xbb\x3d\xa8\
+\xf9\x56\xd3\xa5\xff\xe2\xd9\xc7\x62\xaf\xa0\xaa\x4d\x73\xee\x9d\
+\xcd\xb9\xbf\x4f\x38\x21\xf1\x66\xc9\x0b\xb0\x38\xa9\x4f\xa6\x0e\
+\xc1\xab\x26\x12\xaa\xc0\x6c\x75\xe0\x97\xf3\x7d\x3d\xba\x5a\x45\
+\x4e\xcc\x00\xf2\xb7\x2e\x76\xb7\x7c\xb0\x35\x47\x3d\x25\x60\xc2\
+\xce\xc3\xc3\x3a\x8d\x0b\x78\x47\x5e\x10\xb3\x47\xbe\xa6\x35\x63\
+\xb0\xc7\xf0\xd5\x5f\xb5\x8a\x8a\x98\x01\x32\xde\x56\x36\x29\x9e\
+\x59\xff\xf2\x8a\xb5\x77\x82\xe7\xf9\x90\xfe\xa3\xdc\xd9\xa1\x54\
+\x2a\x86\x4a\xa9\x85\x6d\xd2\x76\x60\xa8\x56\x71\x26\x66\x80\xcc\
+\xc3\xca\x34\x46\xf0\x70\x51\x51\x0e\xa6\x9c\x8c\x12\xba\xd0\x87\
+\x13\x11\x58\xac\x4e\x74\xb6\xf6\x41\x7f\xe2\xf9\x25\x1b\x76\x49\
+\x43\xfa\x9b\x3f\x8e\xc7\xaf\x8e\x5b\xb7\x7d\x4f\x16\x5c\x6e\x3e\
+\xe4\xe8\x7f\x5c\xc0\x43\x29\x2e\x37\x6a\xbc\x34\x5d\xd1\x1d\xdf\
+\x9d\x1f\x33\xc0\xbd\x07\x2f\xec\xb0\xdb\x3d\xaa\xac\xbc\x54\xbc\
+\x96\x9f\x8e\x09\x07\x81\xc6\x6c\x67\x2a\x22\x51\x57\x08\x7b\x60\
+\x37\x03\xd6\xfe\x36\x8c\x5b\xa6\x49\x56\x11\x97\xad\xab\xdb\xd3\
+\xbb\x2c\x40\x46\x79\x6b\x11\x4f\x49\x43\x59\xf1\x23\xd8\x98\xb2\
+\x1a\x97\x47\x66\x31\x31\xc3\xfb\xa5\x4a\x42\xd4\x87\x2f\x32\x9a\
+\xc4\x12\x11\xc6\x86\x2d\xd0\x69\x74\xec\x40\x28\xb9\x79\x62\x6f\
+\xc3\xa2\x00\x19\x6f\xb4\xa6\xce\x39\x5c\x86\xea\x77\xb7\x21\x4e\
+\x26\xc6\x0f\x7f\xda\x7c\x59\x92\x80\x72\x16\xe3\x92\x04\x0c\x22\
+\x11\x07\xdb\x94\x03\xd7\x2f\x5d\x83\x48\x2a\x49\xd7\x9f\xdc\x6b\
+\x58\x00\x20\x7f\xf5\xec\xc8\x73\xbb\x1f\x4e\xc9\xbb\x3f\x19\x2d\
+\x37\xac\xbe\x26\x22\x8b\x44\x25\x4b\xbc\x9c\x57\xb2\xc6\x01\x33\
+\x26\xfb\x87\x8d\x86\xef\xf7\xa5\x46\xf9\xa7\x95\x9d\x2b\x15\xc9\
+\xa4\x67\x3e\x65\xd9\x9f\xea\xb1\x30\x69\x86\x47\x4e\x30\x16\x9d\
+\xb7\x5f\xb0\xe6\x38\x96\xbd\x18\xfd\x3f\x75\x41\x70\x79\x76\x19\
+\xbe\x7b\x49\x19\xf2\x91\x97\x36\x2b\x5f\x28\x78\x54\x41\x12\x56\
+\xe2\xaa\x71\xd6\xd7\xbd\x61\x1a\x16\xa6\x1b\x7c\x07\x1a\x81\x42\
+\x02\x20\xb7\x0c\x16\x58\xb4\x37\x55\x23\xa7\x0b\x14\x21\xf3\xda\
+\xe2\x26\x5a\xf9\x5e\x3e\x9a\xb4\xd3\xf0\xb0\x71\x40\xc8\x12\x59\
+\x46\x8f\xd5\x28\x7b\x68\x36\xb1\xb1\x32\xa6\xea\xc2\x68\x43\x49\
+\x98\xcd\xbb\x0a\xea\x69\xc5\x87\x3b\x71\x5a\x3d\xc9\x66\x3c\x89\
+\x8a\xb6\xe8\xe3\xce\x33\x44\x82\x70\x32\x09\xcc\x17\x7e\xc5\x58\
+\xe3\xfe\xb0\x5b\xca\x81\x66\xfa\xe2\xc1\xa7\x70\xbe\xf7\x1f\x48\
+\x09\xf5\xd7\x4e\x97\xe7\x3c\xd8\x71\xc1\x28\x7e\x51\x70\x10\x58\
+\x6f\xd8\x3a\x7a\x31\x5a\x5f\x18\x06\x90\x17\x37\x1c\xe7\x79\x5a\
+\x2e\x4e\xbe\x03\xa2\xc4\x04\x90\x78\x09\x90\x94\x10\x42\x21\x14\
+\x11\x88\x11\x15\xda\x5d\x80\xc3\x09\x6a\x77\x83\xb7\xcd\x82\x5a\
+\xac\x10\x66\x67\x98\xa4\x44\x2d\xa6\xc6\xfd\xfb\xa2\x65\x5a\x54\
+\xbf\x02\x94\x1e\x12\x04\xba\x83\xfd\xae\x64\xdf\xc7\x43\xd9\xb2\
+\xb1\x40\x12\x13\x59\xa0\x39\xc0\xe9\x8c\xd4\x16\xfb\x1f\x26\x6a\
+\xb6\xb5\xb1\xd9\xdd\xcd\xaa\x50\x99\x9a\x4a\xa3\xba\xf9\x5f\x5b\
+\x48\x9c\x28\x77\xe7\x9d\x84\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x01\xe1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x01\xa8\x49\x44\x41\x54\x78\xda\xed\x53\x3b\x4b\x03\x41\
+\x10\xfe\x36\xc1\x46\x04\x4b\x9b\xc4\xd2\x3f\x60\x2f\xd8\x58\xf8\
+\x8a\xa8\xd1\xca\xde\x46\xb4\xb3\xf1\x17\x59\x68\xe3\x4f\xd0\x42\
+\x7c\x34\x22\x12\x15\x2c\x84\x28\x21\x2f\xd0\x18\xbd\xdb\xdd\x71\
+\xf6\x66\x2f\x77\x06\x05\x41\x52\x08\x77\xb0\xcc\xcd\xce\xcc\xf7\
+\xcd\x6b\x15\x06\xfc\xa9\x8c\x20\x23\xf8\x07\x04\x34\x35\x43\x28\
+\x8e\x01\xc6\xfe\x22\x07\xea\xb3\xd1\x57\x3f\x9b\xba\xcf\xe5\x80\
+\x6a\x8d\x09\xca\xeb\x84\xdd\x0d\xa0\x5e\x63\x9f\x5c\xe2\x6f\x7d\
+\xb0\x0d\xd9\x9f\x83\xc9\xc8\x9d\xf6\x92\x48\xa4\xb5\x02\xf8\xe1\
+\x24\x1f\xb2\xc2\x9b\x67\x79\x70\xc6\x04\xf3\x25\xc2\xd6\x12\x50\
+\xb9\x12\x56\x97\x49\x14\xec\xfc\x03\x01\x77\x20\x3d\x40\x87\xa7\
+\xb9\x62\x47\x66\x13\x52\x67\x77\x5d\x30\xfc\xaf\x39\xa9\x3c\x63\
+\x5d\x3c\x43\x05\x73\x8b\x34\xb4\xbd\x0c\xdc\x5e\xf3\x65\x9e\x03\
+\x94\x00\x74\xdf\x80\x4e\x47\x2a\x0b\x99\xa8\xd5\xe2\x60\xb6\x35\
+\xeb\x0c\x00\x21\x0d\x8d\xc8\xb8\x92\xd0\x57\x67\x10\x55\xf2\x7e\
+\xd7\x86\xea\xcc\x2e\xd0\xf0\x4e\x99\x09\x6e\x80\x5a\x95\x01\xf9\
+\x34\x1a\x4c\xd0\x15\xe7\xd0\xf5\xc9\x48\xe6\xda\xb7\x26\x02\xd2\
+\x3e\x19\x36\x04\x31\xb0\x23\x21\xa9\x8e\xf5\xd6\x03\x13\xb4\x4b\
+\x2b\x34\xba\x3a\x09\x1c\xed\x73\x1f\xb5\xf4\x2f\x02\x21\x01\xd6\
+\x94\xb4\xc3\x7c\x03\x6c\x3c\x70\xec\x17\x5a\x4f\xc0\x33\x7e\x7a\
+\x81\x7a\x2c\x14\xa9\xb0\x39\x0d\x9c\x9e\xcb\x0c\x82\x50\x86\xab\
+\xe3\xb2\xc9\x03\xc7\x43\xf6\xfa\x4f\xc0\xb1\xce\xea\x7d\xf3\x15\
+\xaa\x32\x32\x42\x13\x7b\x6b\xc0\xf1\x89\x1b\x7d\xd2\xcf\xc0\x0f\
+\x32\x06\x8e\x00\x6c\x02\x1c\x7a\x70\x9d\x6a\x8b\xf6\x8b\xe0\x74\
+\xad\x71\xd9\xd5\x50\x87\xbc\x48\xe3\xbc\x9e\xc6\xad\x61\x6a\xb3\
+\xd3\x1b\x6e\xfb\x64\x6c\xa7\xde\xbd\xf2\xba\xf2\x87\xa2\xd7\xd3\
+\x8e\x2c\x83\x7e\xc9\x19\x41\x46\xf0\xe7\xef\x13\x84\x6c\x39\xe7\
+\xae\x6b\x4b\xb3\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x02\x86\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\x4d\x49\x44\x41\x54\x78\xda\xed\x95\xcd\x6b\x13\x41\
+\x18\xc6\x9f\xd9\x7c\x6d\x83\xd4\x6c\x04\x49\x4a\xb5\xa4\x89\x64\
+\x0b\x1e\xa4\x42\x0e\x1e\x14\x11\xf5\xa8\x78\xf0\x62\x28\xb5\x27\
+\xc1\x82\x05\xc5\x2f\xbc\x0b\xe2\xd1\xff\x41\x50\x0f\x6d\xb1\x82\
+\x46\x1b\x45\x04\x0f\x7a\x28\xad\xa6\x31\xad\xda\x5a\x34\x49\x6b\
+\x77\x6b\x12\xd8\x4d\x37\xfb\x3a\xd9\xa4\x41\x8c\xb1\xd9\x83\x07\
+\xc5\x07\x76\x66\xe0\x9d\x99\xdf\x3c\xef\xbc\xcc\x32\xfc\x61\xb1\
+\xff\x80\xb6\x00\xa9\x81\x90\x22\xf6\x8a\x3e\x7b\x2b\x59\x6d\x79\
+\xb5\xa3\x9f\x8e\x4a\x84\xd2\x4c\x49\xdd\x7d\x77\x41\x62\xd3\x27\
+\x76\x2a\x3d\xd7\x63\x3e\xb7\x6f\x0d\xb4\x9e\xb5\x66\x6f\xcc\xaf\
+\xf5\x3f\xae\x64\x8d\x8d\x8c\x4a\x07\x34\x2d\x08\xd3\x34\x6b\x1f\
+\x55\xc0\x1b\x10\x1f\x1b\x15\x1d\xde\xf2\x67\xe4\x6e\xe8\x2a\x9b\
+\xbf\x26\x53\xf0\x8c\x04\x66\x64\x61\x56\x0a\x16\x1d\x4c\xa8\xf7\
+\x1b\x98\xda\xa9\xea\x03\xab\x55\x56\x03\x10\xfb\x5e\x41\x60\xbf\
+\xce\x72\xf6\x79\x08\x8e\x04\x81\x65\xae\xca\xd4\x35\x64\x80\x51\
+\x11\x66\xb9\xd4\x76\x86\xbe\xe6\x25\x74\xf4\xa7\x70\x33\x53\x6e\
+\x8a\x5d\x96\x45\x2c\x3e\xe8\x86\x73\x52\xe0\x80\x2b\x1c\x30\xa8\
+\x41\x20\xdd\x16\x60\x65\x59\x82\xc1\x1d\x0c\xbf\x6e\x06\xdc\xda\
+\xeb\x46\x21\x29\xc3\x91\xe4\x09\x7e\x77\x49\xa6\xee\x81\x32\x77\
+\xa0\xd9\x73\xb0\xe2\x47\x31\xfc\x14\xc7\x93\xeb\x4d\xb1\xd1\x83\
+\x2e\xe8\xc9\x7e\xb0\x67\x3c\x45\xe9\x8b\x32\xed\x88\xf3\x14\x99\
+\x55\x40\xb1\x6d\x40\xa1\xb4\x15\xf9\x40\xa2\x65\x5c\x78\x11\x83\
+\xfe\x84\xa7\x68\xf6\x82\x4c\x3d\x43\x5e\x40\x5b\x86\xa9\x7d\x6b\
+\x1b\x50\x95\xb6\xa4\xc3\x58\x33\x79\x2d\x50\xa3\x16\x2c\xf1\x7b\
+\x77\x76\x3a\xf0\x7e\xcc\x0b\x96\x3a\x2f\x53\xe8\xb4\x0f\x7a\x76\
+\x11\x66\xa9\x7d\x07\x96\xf8\xa6\x6e\x49\x68\x54\x18\xd5\xeb\x9b\
+\xb1\x5a\x39\x2f\xdc\x16\xc1\xde\x8e\x44\xa9\x77\xd0\x0f\xe5\xe5\
+\x1c\x96\x1e\xd9\x73\x10\x88\x39\xe1\x8f\xb9\x5a\xc6\x3f\xde\xe1\
+\x80\x37\x23\x32\x85\xe3\x7e\xee\xe0\x13\xcc\x62\xc1\x9e\x03\xd4\
+\x1d\xb4\xd0\x87\x7b\x6e\xb0\x99\x73\x7d\x14\x39\xb5\x0d\x5f\x26\
+\x66\x91\x1e\x57\x6d\x6d\x1e\xde\xef\x41\xd7\x61\x4f\xcb\xf8\xfc\
+\xa8\x0b\x6c\x7a\x38\x4a\x91\x93\x5b\x50\xce\xe5\xb9\x03\x9b\x77\
+\xb0\x89\x83\xb9\x31\x0e\x98\x3a\x1b\xa5\x5d\xc7\x18\x72\x0f\x73\
+\x48\x27\xec\x01\x22\xfb\xdc\x08\x1e\x12\x5b\xc6\x33\x13\x4e\xb0\
+\xc9\xa3\x41\x65\x4f\xbc\xd3\xe7\x71\xae\xd8\x3e\xfd\xef\xa4\xad\
+\x32\x4c\x8d\xbb\x54\xeb\xa5\x7a\x7c\x24\xa0\xf8\xb7\x9b\xf6\x9e\
+\xeb\x4d\x54\x50\x05\xf5\xc0\xfd\xac\xf4\x8f\xfc\xd1\xfe\x6a\xc0\
+\x77\x2b\x43\xef\xd5\x14\xdc\xf1\xdc\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x05\x43\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x0a\x49\x44\x41\x54\x78\xda\xad\x95\x7b\x4c\x53\x57\
+\x1c\xc7\xbf\xb7\x2d\x7d\x50\x2d\xd0\x96\x02\x05\x5f\x80\x0a\x52\
+\x5f\x88\x20\x8c\x38\xf6\x62\x43\x0c\xce\x39\x75\xa0\x63\x3a\x9d\
+\xd3\x19\x35\x71\x73\x31\x8b\xd1\xe9\xdc\x23\x5b\xdc\xc3\xd7\x1e\
+\x66\xce\xe9\x40\x27\xdb\x8c\x31\x73\xea\xd4\xc5\xf8\xa8\x8d\x5b\
+\x02\xa8\x01\x64\x08\x6a\x51\xc0\x62\x1f\xb4\x85\xdb\xdb\xde\xb3\
+\x5f\x6f\x17\xf6\xcf\x92\x39\xe5\xa4\x27\xf7\xf6\xdc\x73\x7e\x9f\
+\xdf\xfb\x70\x78\xc0\xb1\x67\x6f\xd5\x5a\x9d\x4e\xf7\x7e\x5f\x1f\
+\x0f\xc6\x44\xdb\xbc\xf2\x39\x53\xfe\x6d\x1f\xf7\x20\xc2\xf7\xee\
+\xdb\x5f\x5d\x58\x30\xa5\xdc\xdd\xd3\x83\xe6\x96\xeb\xf0\xf6\x78\
+\x6d\x2f\x2f\x98\x3f\x30\x80\x2f\x76\xed\x6e\x9b\x3b\xeb\xb9\x61\
+\xb1\x71\x31\x38\x7b\xde\x8a\x8e\xce\x2e\x74\x3b\x1c\xb6\x65\xaf\
+\x2e\x7e\x78\x40\xd5\x81\x83\x2d\x33\xa6\x97\xa6\xaa\xd5\x6a\xb8\
+\xdc\x6e\x5c\xfa\xfd\x0f\x78\xfd\xbd\xb8\x6d\x6f\xb7\xad\x5a\xb1\
+\xec\xe1\x00\xdf\x55\x7d\xcf\x66\xcd\x7e\x16\x41\xc6\xa1\xfb\x96\
+\x1d\x4c\xab\x45\x43\xfd\x65\xf8\xfd\x7e\xb4\xb6\xb6\xda\xd6\xac\
+\x5e\xf5\x60\x80\x8d\x9b\xde\x7d\xc1\x62\xc9\xda\x5f\x36\xa3\x0c\
+\x1e\x9e\x87\xe3\xdc\x45\x8c\x28\x2e\x85\x63\xcb\x87\xb8\x94\x3d\
+\x0e\x82\xc7\x83\xc6\x86\x06\xdb\xba\xb5\x6b\x24\x80\xa8\x31\xce\
+\x67\x22\xfb\x58\xce\x77\x9b\xfa\x01\xeb\x37\x6c\x36\x88\x62\x68\
+\xa4\xc8\x58\x08\x0c\xb9\xb4\x9a\xc9\x81\x9b\x20\x8a\xe2\x84\x92\
+\x92\x62\x6d\xce\xa4\x6c\x38\x7a\xbc\xf0\xd5\x1c\x42\xc6\xc6\xb7\
+\x81\x17\x73\x80\x6f\xac\xb0\x2e\x5c\x84\x96\x47\x0b\x71\xb5\xa9\
+\xe9\xe2\x07\x6f\xbe\x9e\x2f\xaa\xf4\xe5\x5c\x9c\xb6\x1a\x4f\x8f\
+\x42\xe8\x87\xba\x36\x85\xcf\x31\x82\xdb\xf4\xce\x7b\x87\x93\x92\
+\x12\xcb\x72\x73\x27\x23\x36\x26\x96\x52\x8e\x81\xe3\x38\xdc\x73\
+\x76\x83\xe7\x05\x64\x65\x66\xa0\xbd\xa3\x13\xee\xc6\x26\x64\x97\
+\x95\x41\xb1\xfc\x29\x52\x8b\xf4\x0a\x31\x60\xdf\x45\x9c\xaa\x7c\
+\x09\x87\xd2\x86\x9f\xde\xfe\xc6\xba\x4f\x82\x66\xfd\x11\x45\xd9\
+\x18\x40\x26\x03\xae\xdf\x45\xe0\xf4\x9f\xcd\xdc\x57\xbb\xbe\x66\
+\x05\x05\xf9\x30\x18\x0c\x48\x4c\x30\x41\x14\x23\xdf\x3b\x3a\x3b\
+\x09\xe2\x82\x10\x08\xc0\xe9\x74\x83\x51\x60\x8d\xbf\x1c\x87\x65\
+\xf7\x36\x70\x25\x63\x23\x00\x31\x84\x50\x4d\x2d\x1a\x8c\xc9\xc8\
+\x94\x7b\x21\x7f\x32\x0d\x08\x84\x80\x28\x19\xf8\xb3\x37\x20\xb4\
+\xb9\xbe\xe5\xb6\x6d\xdf\xc1\x94\x4a\x15\x06\x0d\xd2\x61\xc2\xf8\
+\xb1\x08\x85\x42\x90\xcb\xe5\xa8\xa3\x00\xb6\xdd\xb8\x81\xdc\xdc\
+\x3c\x82\x8a\x92\xd6\x41\x8d\x06\xa9\x1f\x7d\x8a\x11\x97\x4e\x43\
+\xf9\x58\x3a\x41\x68\x9d\x7e\x81\xda\xdb\x50\x4e\x1e\x42\x2f\x41\
+\x12\x2e\x87\xdf\x7a\x0b\x7d\x37\x3d\xdb\x0c\x82\x73\x25\xb7\x62\
+\xd5\x6a\xa6\x56\xa9\x91\x91\x91\x89\x8c\xcc\x51\x92\x30\x19\x99\
+\xd0\xd8\xd0\x84\xf6\xdb\xed\x98\x34\x29\x47\x82\x46\x52\x82\x20\
+\xda\x68\x8c\xdc\xb0\x19\xc3\x9a\x6b\x31\x38\x7f\x58\x44\xa8\x9c\
+\x5c\x46\xae\x45\x38\xc3\xac\x76\x08\x2e\xbe\x3c\x49\x70\x1d\x90\
+\x8e\xbc\xb6\x7c\x25\x53\x44\x45\x21\x3d\x3d\x0d\xe9\x23\x29\x38\
+\xa4\x95\x5c\x2e\x43\xf3\xb5\x26\x74\xde\xe9\xc0\xf8\x89\x13\xff\
+\x01\xd0\x60\x04\xe7\xe3\xe2\x90\x3f\xbb\x12\x29\x66\x19\x06\x0d\
+\x89\x8d\x08\xa7\xf5\xae\xba\x0e\x78\xbb\x7a\xbf\x4c\x0b\x79\x96\
+\xf6\xa7\xe9\xe2\x57\x96\x32\x85\x42\x0e\xb3\x39\x05\xc9\x29\xc9\
+\xfd\x16\xd8\x29\xd7\x5d\x6e\x27\xb2\xb2\x2c\x11\x17\x85\x85\x93\
+\x05\x02\xb9\x29\x6b\xeb\x4e\x8c\xb9\x56\x0f\xd3\xb8\x24\x40\x08\
+\x46\x82\x2e\x12\x84\x13\xd1\x52\xe7\x40\x1f\xcf\x2a\x2c\x82\x7b\
+\xbf\x04\x58\xb0\x70\x11\x0b\x0b\xd4\xeb\xf5\x88\x8d\xd3\xd3\x3e\
+\x02\x70\x32\x38\xef\x75\x23\xdc\xc8\x46\x8d\x1e\x2d\x01\x98\x8c\
+\x03\xa3\xe7\xb8\xcf\x77\x23\xcf\x7d\x13\x83\xcd\xfa\xbf\x63\x20\
+\xa2\xf3\xae\x17\x09\x89\x64\x49\xd8\x52\x3a\xdf\xd0\xe2\x82\x28\
+\xb0\xe5\x04\xd9\xc9\x55\xcc\xab\x64\x1c\x1d\xd6\x52\x65\x6a\xd4\
+\xd1\x92\xb5\x61\x85\xfc\xbd\x3e\xe9\x3d\x2d\x35\x95\xe4\x88\xa4\
+\x1c\xc3\x23\x5b\x3e\xc3\x44\x39\x0f\x9d\x41\x17\xc9\x22\x12\xd6\
+\x78\xdd\x81\xfa\x78\x13\x72\x7c\x2e\xa4\x26\x1b\x68\x5d\x00\x95\
+\x3b\xea\xee\xb8\xa0\x60\xf2\x25\xdc\x9c\xd9\x73\xbb\x28\xef\xe3\
+\x65\x0a\x25\x94\x4a\x45\xd8\x11\x52\xfd\x05\x02\x02\xd4\x6a\x15\
+\x92\x87\x0e\x95\x64\x25\x5e\xb9\x8a\xfc\x1f\x7f\xc2\x64\x73\x42\
+\xb8\x5e\xc1\xf7\x06\x50\xef\xf1\x62\x47\xf1\x13\xe8\x48\x30\xfd\
+\xfa\xd6\x9e\xaa\x56\x83\x52\xb5\x24\x2b\x2e\x02\xf7\x0b\x3c\xac\
+\x1e\x9f\x57\xaa\xe4\x99\x33\x9f\x2f\xa5\x47\x1e\xcd\x70\x34\xc9\
+\xb1\x30\xd3\x1c\x42\x9a\x27\x26\x24\x24\x25\xea\x62\x06\x43\xa0\
+\xd4\x35\xd7\xd6\xa3\xf0\xd8\x51\x64\x47\x69\x71\x46\x08\xa0\xa6\
+\xf4\x19\xdc\xd3\xaa\xd1\xc7\x60\x3d\x56\x73\xa0\xe0\x30\x54\xd5\
+\x79\x4a\x55\x79\x34\xed\x3d\xd7\xeb\x6d\xe5\x20\x1b\xfb\x9f\xbd\
+\x68\xda\xb4\xe9\x5b\x75\x31\x31\x2b\x0c\x46\x63\x04\x72\xf9\x0a\
+\x2c\xa7\x4e\xe0\x42\xe5\x02\xd8\xc9\xe7\x22\xf5\xa7\x5e\x9e\xb7\
+\xfd\x7c\xe4\xb0\xd4\x8b\xaa\xa1\x3c\x48\x5e\x28\xac\x80\x60\xbe\
+\xef\x6e\x5a\x5c\x5c\x52\xae\xd1\x44\x57\x1b\x4d\x46\x88\x94\x10\
+\x21\x9a\x0a\x12\xee\xa3\x96\x1d\x4e\xe1\x1e\xba\x70\x8e\x1f\x3f\
+\xda\xdf\x4d\xf7\x42\xa6\xaa\x24\xf4\xff\x6a\xd7\x11\xd0\x34\x66\
+\x4e\x4e\xea\xff\xef\xf7\xf9\xa4\xde\xe5\x74\x3a\x6d\x27\x4f\x9e\
+\x18\x98\x1b\xad\xa8\xe8\xf1\xd6\x94\x94\x94\xe1\x4a\x95\x8a\xae\
+\xca\x1e\x09\xd0\xd5\xd5\x65\x3b\x73\xe6\xb7\x81\xbb\x93\xa7\x4e\
+\x2d\xaa\x8a\x8f\x37\x55\x28\x95\x51\x92\x8b\xda\xed\x76\xdb\xf9\
+\x0b\xe7\x06\x0e\x10\x1e\x79\x79\xf9\x1b\x35\x1a\xcd\xfa\x10\xa5\
+\x64\x30\xc8\x5f\xb5\x5a\x2f\x58\x06\x14\x70\xbf\xe3\x2f\xde\xd0\
+\x46\x9d\x97\xa9\x1a\xce\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x02\xdb\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xa2\x49\x44\x41\x54\x78\xda\xed\xd4\x4b\x48\x54\x51\
+\x18\x07\xf0\xff\xb9\xf7\x8e\xe3\xf5\x51\x59\xa4\x59\x94\x0b\x23\
+\x1f\xf3\x52\x34\xa1\x22\x0a\x6d\xd3\x43\xa9\x5d\x9b\x16\xb5\xaf\
+\x4d\x45\xa4\xe9\x50\xe4\xc6\x08\x6a\x11\x44\x21\x92\x85\xa4\x61\
+\x5a\x56\x18\x39\xa3\xe6\xa2\x07\xc6\xa0\x62\xe3\x18\xe2\xa0\x88\
+\x8f\x19\x2d\x9d\x71\x1a\xe7\x3e\x4e\x47\x27\x35\xc9\x9c\x42\x5d\
+\x44\x9d\xdd\xf9\xce\xf9\xbe\xdf\x79\xdd\x4b\xb0\xca\x8d\xfc\x1b\
+\x40\xc5\xc3\x47\x0d\x82\xc0\xe7\xf0\x1c\x07\xef\xe4\x24\xdc\xee\
+\x51\x78\xbd\xde\x0e\x73\x61\xbe\x71\x45\x80\x07\x15\x95\xd4\x64\
+\x34\x40\xaf\x4b\x81\x7b\x6c\x14\x56\x4b\x33\x3e\xda\xed\xb8\x6c\
+\xbe\x14\x32\xff\xb7\x01\x83\x5e\x07\x83\x3e\x15\xc3\xae\x11\x34\
+\x35\xb6\xa0\xcb\xe1\xf8\x0f\xcc\xb7\xfb\x15\x55\xd4\xc8\x8a\xff\
+\x08\xd8\x1d\xdd\xb8\x62\x2e\x58\x19\xa0\xac\xea\x39\x4d\xd7\x27\
+\xc1\x94\x92\x88\xe1\xb1\x09\x58\x2c\x4d\x68\xb3\x7f\x42\x89\xf9\
+\xdc\xf2\x01\xfb\xd5\xfd\x37\xfd\x88\x38\xa3\x89\x8e\x45\x84\x28\
+\x22\x20\x4b\xf0\x4c\x78\x40\xfc\x5f\x10\xa5\x09\xd4\x27\x17\x34\
+\x1e\x5c\x16\xd0\x51\xb4\x8f\x26\x9c\xdc\x0a\x55\xa2\xa0\x34\x98\
+\x40\x78\x82\xa9\x91\x00\xdc\x16\x37\x52\x0b\xad\x64\x59\x40\x5b\
+\xfe\x5e\xaa\x3b\xa5\x42\x19\xef\x64\xb3\xb9\xb9\x2c\xff\xa8\x08\
+\x67\x63\x22\x4c\xc5\xaf\xff\x1c\x68\x3f\x9f\x56\x2c\x73\xda\x7c\
+\xaa\xb2\x25\x53\x0e\x71\xdb\x05\x50\x9f\x6b\x1e\x00\x85\x14\x10\
+\x30\xe6\x8a\x06\x21\x0a\x0b\x13\x08\x34\x50\x69\x2c\xb1\x1d\xff\
+\x09\x60\xbf\x81\x72\x55\x55\x4f\xcc\x06\x14\x21\x1c\xa6\xb7\x45\
+\x88\xca\x48\x46\x64\x42\x04\x64\xaf\x87\x1d\x8f\xc4\x4a\x2e\x5c\
+\x0b\x61\x5d\x5e\x2b\x82\x17\xc3\xe1\xeb\x0b\x60\xe0\x95\x15\xce\
+\x43\x77\xc0\x49\xbe\xb9\x39\x1c\xc7\x3d\x26\xd5\xd5\xb5\x34\x29\
+\x79\x07\x18\x12\x8c\x86\x45\x42\xba\x95\x8b\xf8\x63\x99\x58\x9b\
+\x56\x07\xaa\x08\xbf\xd8\x2c\x0d\x46\x79\x0a\x57\xf3\x3a\x38\x6b\
+\x3c\xd8\x50\xf0\x06\x74\xca\x3b\x5b\x1c\x8e\xae\x6e\x90\x9a\x27\
+\x75\xf4\x68\xde\x91\x05\xa9\xad\xa7\x53\x11\x7f\x78\x27\xd6\x27\
+\xbe\x00\x55\x35\x4b\xde\xd1\x34\x30\xf4\x7e\x0d\x7a\xeb\xc7\x91\
+\x5d\x3e\xb4\x60\xac\xf6\xe9\xb3\xe9\x23\xaa\x62\x40\x2e\x64\x49\
+\x0e\xca\x62\x14\xec\x67\x75\xd8\x94\x93\x81\x8d\x5b\x42\x03\x1c\
+\x03\x06\x6c\xd1\x70\xb6\x78\x91\x55\x3a\x08\xd5\x17\xdc\x81\xa0\
+\x11\x18\x50\x07\x52\x5a\x76\x8f\x1e\xc8\xc9\x86\xa2\xc8\x73\x47\
+\xf4\xb9\x24\x1b\xb1\x7b\xd2\x10\x17\x53\xcf\x9e\x66\x68\xa0\xaf\
+\x33\x12\xfd\xb6\xaf\xd8\x56\xdc\x0e\x4c\x79\x66\xe2\x3c\x2f\xa0\
+\xc1\x62\x05\xb9\x76\xfd\x46\xbb\xa2\x28\x06\x4a\xbf\x5f\x32\xaf\
+\x45\xde\xd0\x5d\xc4\xa4\x1b\xb1\x39\xfc\x25\x03\x84\x10\x00\xd0\
+\xdb\x2d\x62\xb0\x47\x42\x53\xd2\x05\xf0\xb2\x7f\xfe\x11\xf0\x7c\
+\xcf\xa2\xcf\xb4\xf5\xe2\xae\x77\x12\xb4\x59\xc4\xd7\x3f\x5d\x62\
+\x49\x60\xe6\x9b\xf0\x13\x84\xc1\xff\x61\xf7\xed\xbe\xcc\x45\x86\
+\x57\xb7\xfd\xfd\xc0\x37\xf1\x54\x30\x40\x25\x67\xc5\x12\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x73\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x3a\x49\x44\x41\x54\x78\xda\x9d\x55\x6b\x6c\x14\xd7\
+\x19\x3d\xf7\xce\x9d\x99\x9d\xd9\x97\xdf\x36\x36\x60\x6c\x07\x02\
+\x05\x37\x60\x03\x75\x4a\xe4\x96\x37\x84\x34\x89\xa0\x0a\x4e\xaa\
+\x36\xaa\x52\xaa\x52\x52\x55\x55\xab\x54\xea\x1f\x1c\x51\x7e\xb4\
+\x8a\x92\x46\x10\x55\x4d\xdc\x48\xb4\x6a\x03\xe1\x47\x9b\x2a\x11\
+\x49\x30\x45\xa1\xb1\x92\xb4\xa6\x10\x93\xc4\x8e\xdb\xf0\xb0\x0d\
+\xc6\x8e\xc1\x6b\x7b\x59\xef\xee\xec\xce\xed\x99\xa5\x4d\x5d\x97\
+\xfc\xc9\x9d\xbd\x3b\x73\x75\x67\xce\xf9\x9e\xe7\x8a\x39\x7b\x4e\
+\x95\x0c\x3f\xd3\x7a\x1d\x9f\x32\x96\x3c\xd5\xbf\x4b\x4b\xf9\x80\
+\x52\x72\x83\x36\x0c\x2c\xaf\x8b\xe0\xa3\x44\x16\x39\x08\x28\x53\
+\x9d\x0e\xd9\xe2\x84\x52\x46\x7b\xe7\xe6\xa2\xe9\x5b\x7d\x2f\xaa\
+\x76\x9f\xd4\xc2\x30\x36\x0e\x1f\x6c\xed\x9c\xb9\xd1\xb0\xaf\xe7\
+\x80\x0f\xf9\xe8\xd6\x96\x72\xd4\x94\xbb\x28\x8b\x9b\x28\xb2\x0c\
+\x48\x02\x17\x5b\x12\x73\x43\x02\xbd\x09\x0f\x7f\x1d\xcb\xe2\xe4\
+\x65\x0f\x8e\xc2\xe1\x93\x5b\x8a\x1f\xfc\x3f\x82\xd2\x1f\xbc\xa5\
+\x4d\x21\x20\xbd\xec\xe1\x2b\x07\x5a\x1f\x9c\xff\xe3\x77\xaa\x21\
+\xe4\x3f\x16\x2e\x2e\x73\x3f\xb7\xb4\x0c\xe3\x9e\x46\x5e\x00\xb6\
+\x94\xb0\x0d\xde\x4d\x03\xa6\x02\x4c\x29\xb0\xc0\x31\xb0\x2a\xae\
+\x60\x0b\x8d\x67\xcf\xa7\x70\xfa\x2a\x89\x0c\x31\x9f\xde\x0c\x7e\
+\x42\x50\xf2\xfd\x2e\x8d\x55\x0d\x70\x86\xc6\xa1\x07\x47\x47\xdc\
+\xa8\x5b\x59\xbb\xa2\x1a\x28\x76\x09\xaa\x11\x52\x12\x21\x53\xd2\
+\x42\x12\x28\x41\x02\x01\x8b\x64\x16\x9f\x25\x49\x94\x41\x22\x57\
+\x62\x4d\x4c\xa2\x7b\x3c\x87\x27\xdf\x4d\x22\xa2\xfe\x4b\x22\xe2\
+\x7b\xfe\xa2\x75\x53\x3d\xa2\xb6\x84\x4a\x65\x51\x11\xb5\xa0\x22\
+\x26\xc1\x05\x81\x09\x46\x60\x45\x8b\xc3\xb4\x3c\x1c\x10\x71\x9a\
+\x01\x91\x21\xc1\x1f\x4c\x12\x18\x7c\xb7\x94\xef\xb6\x90\xa4\x77\
+\x22\x87\xa7\xcf\x25\xd1\x75\x77\xb1\x28\x10\x44\x77\x9f\xd2\xba\
+\xb9\x01\x11\x43\x23\xcc\x18\x3b\x8c\xaf\x4b\x80\x90\x62\xbc\x19\
+\x92\xc6\x0a\x1b\x77\x55\x99\xb8\xf2\x71\x06\xc3\xc9\x2c\x7a\x87\
+\x33\x28\x2e\x73\x60\x85\x0d\xd4\x95\x87\x99\x13\x0d\x45\x82\x00\
+\x2d\x4e\xf2\x0d\x45\x02\x4f\x7d\x78\x03\xe7\x46\xbd\x42\x4e\x84\
+\xfb\xed\x37\xb4\x5e\x5d\x8f\x30\xad\x71\x09\x1a\xb6\x04\x22\x24\
+\x12\x5c\xef\xb9\x23\x8e\x0f\x2e\x24\x70\xb4\x6b\x04\x4c\xf8\x21\
+\xd3\x56\x7f\xb7\x6c\xe3\x0d\xa9\xe4\x7d\xd2\x10\x3f\x72\xc2\x56\
+\x74\xed\xca\x52\x94\xb9\x16\x84\xd6\xfc\x46\xa0\x86\xdf\x2f\x65\
+\x01\x3c\xd2\x95\x08\x42\xe5\x0a\x67\xd7\x09\x8d\x2f\x2c\x84\x43\
+\x1b\x02\xf7\x23\x81\x07\x9c\x26\xe3\xbc\x69\x81\x8d\xe7\x8f\xf4\
+\xc3\x30\xe4\xe3\x83\xfb\x9b\xda\x67\x57\x48\x53\xc7\xc5\x3d\xdc\
+\x3c\xb8\x6d\x4d\x25\x4a\x6c\x59\x08\x55\x9e\x38\xeb\xe2\x02\x47\
+\x07\xa6\xf1\xe6\x50\xe6\xe7\xc2\xfa\x66\xa7\x46\xcb\x22\x38\xac\
+\x24\xd7\x0c\xa6\xc1\x44\x06\x55\x43\x2f\x48\xf8\x95\x85\x0e\xce\
+\x9e\x1d\xc5\xd9\xbe\x89\xe3\x97\xf6\x2d\xdf\x34\x9b\x64\xe5\xaf\
+\x07\xf6\xba\x31\xb3\x7d\xc7\x9d\x95\x5c\xf9\x10\x74\x7d\x7e\x80\
+\xe3\xe7\xf1\xd3\x33\x53\xa7\x85\xf1\xf0\x71\xed\xaf\xbe\x1d\x26\
+\x37\x83\x12\x8c\x3b\x12\x6b\xeb\x5d\x34\x97\xda\xf8\x3c\xa7\x43\
+\xab\x7a\xaf\x4d\xe3\xe0\x2b\x03\x98\x4c\x7a\x34\x58\xcc\xfb\xf0\
+\x27\x8d\x43\x33\x49\xee\xe8\xb8\x94\xd8\xbe\x76\x4e\xbc\x9c\xcd\
+\x90\xce\xfb\xb8\x3c\x99\x67\xd9\x7b\xe8\x66\xd9\x0a\x7c\xed\x15\
+\xbd\xb4\x6d\x35\x5a\x2a\x4d\xdc\x55\x19\xc2\xd2\xb8\x8d\xee\xa1\
+\x29\xbc\xfb\xd1\x14\xce\x9c\x4f\xa0\xb7\xef\xda\x79\xd7\x35\x5f\
+\x76\x5c\xeb\xd8\xc5\xfd\xcd\xaf\xde\xaa\x5b\x9b\x3b\x2e\x1e\x89\
+\x17\xdb\x0f\xe4\xd8\x30\xa9\x9c\xff\x76\xf7\x43\xd5\x77\x7e\xd2\
+\x07\xf5\x8f\xbd\xa9\x5b\xbf\x58\x5b\x58\xf4\xf4\x8d\x15\xee\x1f\
+\xf4\x5c\x3d\x14\x0a\xa9\x63\x89\xe7\x37\x1e\xc1\x67\x1c\x91\xbe\
+\x86\x6f\x31\x77\x4f\x0a\x6c\x3b\x3c\x49\x61\xd9\x8e\xd7\xda\x3a\
+\x3f\x2b\x58\xe8\xb5\x05\x3b\xfd\xbc\xb7\x55\x98\xf9\xfb\xab\x2a\
+\xcb\xe2\x9b\x2a\x1a\xf1\x50\xc5\x0e\xec\xbe\xf8\x44\xa1\x7c\x61\
+\xff\x7e\x4b\xa9\xb6\x26\x57\x09\x1f\x7b\x65\xc8\x6f\x81\xc5\x74\
+\xa5\xf5\x8b\x99\xfb\xdf\xd9\x79\x4b\xc0\xa3\xb7\x6d\xc9\xeb\xcc\
+\x56\x7f\x22\x7d\x4f\xa4\x36\x56\xdf\x58\x53\x83\xaf\xce\x6b\xc5\
+\xdd\xd1\xfb\x30\x89\x6b\x98\xe2\x35\x89\x09\x7c\x77\xb0\x83\xa5\
+\xfb\xab\x46\x8d\x92\x14\xa5\x21\x0d\x55\xa5\xd8\xc5\xec\xe4\x7c\
+\x14\x5e\x5f\xf1\xc4\xf4\xb6\x13\x45\x33\x81\x63\x6f\xaf\x9f\xeb\
+\x8d\x8c\x0e\xea\xeb\x09\xfc\x70\xf3\xbd\xd8\x3e\xe7\x5e\xd6\xbf\
+\x8d\x61\x5c\xc6\x55\x7f\x14\xfd\xb9\xcb\xd4\xa2\x10\x62\xc2\x45\
+\x54\xd8\xd8\x7f\xe5\x4f\x24\xf8\xc5\x92\x6e\xbf\xf9\x7a\xb3\x28\
+\xf6\xa8\x2d\x16\x0c\x8b\x5d\x1a\x0a\x43\x5f\xa0\x1e\x79\x46\xfb\
+\x8d\x75\xc7\x1e\x9f\xed\x81\x75\xa8\xee\xf5\x58\x55\x74\xe3\x77\
+\xd6\x7c\x19\x5d\xfe\xc7\xa8\x33\x2a\x11\x92\x54\x5b\x69\x23\x2c\
+\x2c\x84\x18\x82\xa8\xb2\xb0\xef\xd2\x4b\x0c\xd1\x81\xc5\x3f\xc3\
+\xdc\xec\x63\x58\xc4\x23\x21\x47\x79\xe0\x86\x0a\x87\xa1\x10\x83\
+\xee\x2f\x03\xb4\x7e\x74\x7a\xf3\xf1\x67\x66\x93\xd8\x47\x17\xb7\
+\xe7\x27\x93\x7b\xf7\xee\xf8\x06\xde\x53\x53\x88\x12\xdc\x62\xa9\
+\x07\xb2\x11\x23\x45\x5c\xd9\x78\xfa\xc2\x9f\x49\x70\x68\xb9\x83\
+\xeb\x99\x14\xd6\xb1\x82\x0c\x1f\x81\x46\x48\xdb\x86\x61\x92\xc8\
+\x8f\xc2\x3f\xe7\xc2\x4f\xa4\xa7\x20\xc5\x13\xd2\x56\x2f\x41\x79\
+\x5f\x82\xa1\x9a\xa4\xc8\x3d\xbc\xb6\xe1\x76\xec\x5a\xb4\x11\x07\
+\x52\xa7\x10\xd3\x16\x55\x69\x1a\x06\xff\x23\xca\x41\x85\x19\xc1\
+\x6f\xfa\xdf\xba\x99\x64\x74\x2c\x7b\x01\xd1\x74\x1b\x56\x24\x68\
+\x31\xa5\x93\x0a\x2a\x0c\x93\xad\x6f\x52\x2d\x15\xfc\x31\x13\x4e\
+\x3a\x06\x4c\x28\x2c\xab\xae\x45\x63\xac\x04\xab\xcb\xeb\xf0\xc7\
+\xf4\x59\xfc\xd3\x1f\x83\x2b\x02\x2d\xf2\x28\x13\x69\x08\x3f\x43\
+\xe1\x74\x51\x6a\x47\x71\xf2\xfd\xfe\x7f\x13\x04\xe3\x97\xcb\x34\
+\x16\x8d\x03\xb5\x59\xd0\x05\x7a\x12\x6c\x51\x8a\x85\x62\xf7\x32\
+\x37\xd4\x4d\x25\x15\xa4\x26\x29\xef\xa6\x64\xa4\x09\x6c\x68\xbf\
+\x00\xae\x45\x16\xc9\x89\x24\xbc\xc9\x14\xe6\xd4\x14\xa1\x34\x5a\
+\x8a\x33\x67\x06\x67\x10\xfc\xae\x69\x1e\x43\x35\x80\xe5\x53\x60\
+\x4e\x88\x4d\x41\xd2\xc1\x86\x66\x74\xcc\xc2\x51\xa9\x58\x19\x8a\
+\xcf\x05\xd2\xe0\xf2\x83\x6d\xca\x82\x4d\xdb\x87\xf3\x48\xfd\x2d\
+\x09\xff\xea\x8d\x11\x6b\xa5\xaa\x5c\xd2\x5a\x8b\xfe\xd3\xc9\x19\
+\x04\xc1\xf8\xed\x8a\x79\x18\x9f\x1e\x40\x35\xbf\x5c\x91\xe6\x69\
+\x92\x67\x43\xf0\x15\x5f\xdf\xf4\x26\xcf\xfc\x70\x69\x30\x9d\x06\
+\xd5\x56\x04\x47\xad\x6f\x22\xfb\x7e\x1e\xfe\xb8\x4c\xc9\x90\x58\
+\x98\xde\xf9\xde\x15\xf3\xd9\xda\x17\x64\x48\xb7\x19\x65\xce\x2c\
+\x82\xff\x8c\xe7\x98\x13\xdf\x68\xc3\x6d\x24\xa8\xc8\xf0\x24\xa1\
+\x57\x39\x92\xe4\x68\x6d\xe1\xa2\x47\x93\x61\x60\x84\xc7\xcd\x90\
+\x0d\xe1\xea\x83\xd9\xaf\xf7\x7c\xef\x7f\x9a\xf1\x0f\x8d\x1b\xfc\
+\xb4\x77\xfc\xd6\x04\x37\xbd\x71\x90\xc9\xb5\xd3\x83\xf5\x48\x79\
+\xcd\x0c\x36\xcf\x57\x0f\x18\x23\xa0\x64\xdc\x6d\xa3\x53\x58\xc6\
+\x8b\xb9\x47\x7a\x9e\xfb\x34\x88\x68\xd7\xfa\x92\x7f\x01\x79\xce\
+\x08\x4f\xa8\xcb\x1b\xec\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x07\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xce\x49\x44\x41\x54\x78\xda\xb5\x56\x5d\x6c\x14\x55\
+\x14\xfe\xce\xdc\x99\x9d\xd9\x12\x4d\x88\xb1\xda\x48\x82\x98\x58\
+\x9e\x4d\x30\x31\xa0\x56\x2d\xd6\xd2\x92\xa5\x95\x2a\x29\x86\x27\
+\x9f\xf0\x85\x67\xa3\xa9\x12\xab\x90\xa8\xb4\xe8\xb2\x36\x5d\x40\
+\x5a\x2b\x52\x2a\x0d\x18\x7c\x30\x16\x85\x08\x4f\xc6\x17\x9f\x44\
+\x13\xc1\xa8\x98\x52\x81\xba\xbb\xdd\xdf\x99\xb9\x9e\x3b\x77\x97\
+\xed\xec\x6e\xba\x31\x91\x49\x66\xef\xcf\x77\xf7\x7c\xe7\x7c\xe7\
+\xdc\xb3\x4b\xb8\xc3\x0f\x1d\x39\x34\xbd\xb7\x7d\x7d\xfb\x90\x65\
+\x5a\x6a\x59\x03\x97\x40\xd2\x87\x24\x85\x19\x0d\xbe\xee\x96\x47\
+\x33\x6c\x94\x5f\xcf\xf3\xf1\xd3\xe5\xcb\x6f\xd2\xd9\xd9\x39\x69\
+\x6d\x3c\x7b\x47\xbc\x5f\xf8\xa2\x03\xb7\x09\xbe\xfa\x7d\x8e\x7d\
+\x14\x21\xef\x85\xd8\x00\xcb\xd8\x8a\x82\xfb\x1a\xa4\x6c\xa9\x8b\
+\xce\x34\x37\xe9\x38\xdc\x4b\xfc\x69\x85\x50\x69\x96\xf0\xc8\xf7\
+\x6f\x57\x09\x66\x7f\xfb\x0e\x06\x55\x65\x90\x6c\xc0\x36\x1e\x85\
+\x2d\x9e\x43\xaa\xf8\x06\x88\xc2\x04\x1a\xd7\x04\x05\xff\x12\xcb\
+\x12\x26\xf0\x85\x8b\x27\x7e\x18\xaa\x12\xc4\x7f\xf9\x32\x44\xa0\
+\xf4\xbd\x4b\x3c\x86\x55\xa2\x1b\xf3\x45\x8e\x00\xd1\x3a\xfd\xef\
+\x16\x8f\x07\xb3\x94\x77\xb1\x3e\x0f\xa6\x87\x81\x1f\xdf\xd5\x04\
+\xbd\x5b\x3b\xe1\xe6\xc3\x5f\x37\x99\xeb\x9b\xeb\x92\x0d\x7b\xe8\
+\x6c\x35\xe1\xfa\x8d\x70\x3d\x7f\xa6\x15\xf5\xb8\x0d\x7c\x3a\x71\
+\x1a\x74\xea\xe4\x19\xd9\xd5\xd3\x89\x7c\x2e\xcc\x60\x71\x29\x9c\
+\xbf\xa5\x73\xf2\xd4\x6a\x0f\x25\x89\xff\x84\xdb\x8e\x8d\xcf\x26\
+\x4f\x81\x4e\x9e\x98\x95\xdd\x3d\x9b\x91\x6b\x40\xf0\xed\x0d\x6d\
+\xe0\xe9\x7b\x1a\x13\xac\x84\x3b\x4c\xf0\xc9\xc4\xe7\xa0\x99\xa9\
+\x19\xd9\x1d\xeb\x42\x3e\x5f\xa8\x26\x90\x0f\x47\x58\x82\xaf\xe7\
+\xf5\xbd\xd8\x7c\x9f\x8f\x52\x8d\x04\x16\xe3\x73\xf3\x06\x94\xdd\
+\x67\x19\x2f\xd6\xe0\x8e\x6d\x63\xea\xe8\x09\x4d\xb0\x66\x53\x07\
+\x96\xb2\x79\x08\x83\x82\xeb\x64\x10\xc1\x26\x89\x0b\x37\xcd\xa0\
+\x70\x3b\xee\xf5\xe1\x4a\xe2\x4a\x22\x7d\x15\x15\x2e\x24\x2e\xde\
+\x30\xd5\x14\x4f\xae\x66\x9c\x47\x52\x9e\x19\x01\x0c\x2b\x62\xe3\
+\xdc\xf1\x69\x4d\x30\x6a\x6d\xc0\xcd\x54\x01\x2d\x42\x20\x62\x12\
+\x8f\x06\x1c\xce\x62\x91\x8d\x0a\x41\xb8\x7f\x95\x01\x32\x0c\x58\
+\xbc\xaf\xa4\x71\x78\xcf\xb4\x04\xb2\x3e\xdf\x1c\x5e\xb7\x46\x99\
+\x58\x39\xc7\x0b\x8b\xd4\x68\x20\xc2\x11\xa4\xa7\x46\x40\xc7\x93\
+\x93\xb2\x7f\x60\x0b\x27\x39\x57\xae\x6f\xfd\x2a\x43\xa7\xaf\x99\
+\xc1\xbc\xaf\xad\xc4\xb5\x5e\x6d\x23\x6a\x2f\x42\x7e\x80\xab\x27\
+\xd6\xe6\x72\x0e\x28\x90\x76\x79\x92\x93\x89\x49\xd0\x78\xe2\x98\
+\x8c\x6d\xdf\x82\x4c\x26\x17\x84\x56\x79\x54\x0e\xce\xfc\xa5\x93\
+\xb8\xad\xcd\xab\xd3\xb8\x19\xee\x38\x0e\x8e\x8c\x1d\x03\x8d\xc5\
+\x0f\xcb\xd8\xf3\xbd\xc8\xe6\x96\xb0\xbc\xd9\xd9\x6c\x60\xe6\x4f\
+\xed\xe1\x0b\x0f\xb8\x1c\x41\x4d\x19\x36\xc1\x9d\xa8\x83\xf1\xf8\
+\xc7\xa0\xc4\xe8\xb8\x8c\x0d\xf4\x22\x93\xcd\x85\x7a\xa9\x32\x30\
+\xfd\x87\xf6\x70\xc7\x1a\xaf\x21\xc1\x4a\xb8\x22\x48\x7e\x78\x98\
+\x23\x78\x3f\x2e\x5f\xdc\xb9\x0d\xd9\xa5\xa5\xba\x32\x9d\xb8\x6a\
+\x05\x8a\xef\x7a\xb0\x84\xa2\xc7\x33\xa5\xa1\xd4\x39\x50\x55\xa6\
+\x71\x60\xd7\xda\x22\x0a\x72\x99\x7b\x7c\xc0\x66\x82\x43\x23\x49\
+\x4d\x70\xb4\xad\x07\x0b\xb7\xf2\x68\x61\xab\x36\x57\x52\x4b\xb9\
+\x92\xb2\xbe\x80\xcd\xd9\x6e\xe5\x3e\xa7\x4a\xd8\x32\x45\xb9\x92\
+\x28\xd8\xcf\x78\xbc\x56\xb8\x83\xa0\x8a\xd4\x19\xd5\x42\x54\xc5\
+\x45\xa3\x51\x5c\x8b\x73\x93\xfc\x60\xdf\x01\x39\xf8\x52\x3f\x32\
+\xe9\x8c\x4e\x41\xc5\x43\x3e\x98\xb8\x62\x41\x75\xa3\xdd\xeb\xb8\
+\x8a\x54\x04\x65\x11\x2b\x11\x24\xae\x46\x82\xf5\x2b\x6b\x0b\xc8\
+\x55\x22\x90\xd5\x24\x1f\x1c\x1d\x03\xed\x1f\x3e\x20\xb7\x0f\xf6\
+\x21\x9d\x4a\x07\x17\xe9\xb6\x86\x2c\xef\x47\x57\x74\x12\x77\xaf\
+\x73\x91\xf7\x6a\x34\x6e\x82\x47\x59\xa2\xf8\x48\x40\xf0\x9e\xec\
+\xdf\xd1\x87\xd4\x3f\xa9\x10\x41\x94\x0d\x1c\xfc\x55\x6b\xbc\xe7\
+\xa1\x12\x72\xb5\x06\x9a\xe1\x15\x82\xe1\xa1\xfd\x72\xe7\xcb\x83\
+\x48\x2d\xd6\x46\x20\xb1\xef\x67\x6d\xe0\xd5\xf6\x12\x7b\x18\xfe\
+\xbd\x6e\x86\xab\x1c\x0c\xef\x7d\x07\xd4\xdb\x15\x7b\xbd\xfd\xe1\
+\xf5\x6f\x2d\xa6\x17\x41\xcb\x0a\x55\x50\xb8\x3d\x7a\x32\x6c\x60\
+\x25\x5c\x39\x5a\xcc\x17\xb1\xf0\xf7\xf5\x64\xed\xdf\x88\xff\xfd\
+\xf9\x17\x90\x7f\x9c\xdb\x5d\xed\xa3\xf0\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x8d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x54\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x6c\x14\x55\
+\x14\xfe\x66\x76\x67\xf6\xd1\x7d\x74\xb7\x5b\x96\x3e\xa1\x50\x1e\
+\x2d\xf8\xa0\x9a\x92\x50\x4c\x95\x46\x4d\xa9\x09\x89\x31\x56\x12\
+\x01\xa3\x58\x28\x60\xe4\x87\xc6\x07\x09\xc6\xa0\x89\x82\xf8\x40\
+\x5a\x81\xc4\x47\x44\x14\x10\x14\x35\xbe\x90\x22\x52\x14\xa1\x50\
+\xd2\x48\x4b\xe9\x63\xb7\xed\x96\xee\x8b\x6e\xbb\xdb\x76\x66\x67\
+\x77\x67\xae\x77\x66\x41\x41\x44\x6f\x32\xc9\xee\x9d\x73\xcf\x77\
+\xbe\x73\xbe\x73\xee\x30\xf8\x8f\x35\x91\x91\xb5\x88\xa4\xe4\x87\
+\x59\x47\xc6\x7d\x26\x86\x2b\x7a\xea\x39\x27\xf2\x2b\xcb\x30\x12\
+\x0a\xa1\xf8\x83\x76\xef\xd2\x6f\x63\x87\x39\x59\xde\x6f\x10\x23\
+\x47\x6f\xe6\x83\xf9\xb7\xcd\x31\x8b\x6b\x1e\x7d\xf3\xab\x6e\x86\
+\xcb\xa4\x2b\x71\x81\xcd\x30\x20\x68\x48\x60\x57\xdd\x2c\x54\x39\
+\xa7\x21\x90\xe8\x01\x31\x14\xe0\x54\xd3\x11\x3c\xbb\x2d\x08\x67\
+\xfb\xa8\x98\x64\x51\x61\x1d\xbf\x7c\xee\x7f\x01\xa2\xe6\xac\xed\
+\xba\x3c\xfb\x5a\x6e\x61\x3e\x88\x9e\x6e\x10\x40\x2f\x13\x78\x6c\
+\x29\xec\x5e\x31\x07\xf9\xc6\x10\x02\xc2\x00\x38\x96\x47\xb1\x6b\
+\x01\xbe\xec\xe8\xc4\x3b\x07\xa2\xb0\x1d\x0d\x20\x11\x88\x35\xd8\
+\x84\xe1\x75\x37\x05\x18\x35\x39\xf7\x72\x65\x39\xb5\xfa\xd2\x2c\
+\x90\xb8\x0c\x86\x63\x21\x77\x0e\x83\xe9\x8b\xa1\xbf\xd0\x85\x3d\
+\x8d\xf3\xe1\xe6\x7d\x18\x16\xc3\xf4\x24\x03\x85\xa4\x50\x68\x2f\
+\xc1\x8f\xd4\x66\xdf\xfe\x18\xe2\x3d\xa3\x88\xb7\x05\xf6\x39\xc4\
+\xc8\x23\x37\x00\x0c\x9b\x5d\xdb\x0d\xf3\xdc\x6b\xb9\xe9\x36\x90\
+\x94\x02\x86\x65\x21\xfc\xd4\x0f\xe3\x0b\x1b\x60\x7c\x7a\x8d\x66\
+\xf3\xca\xc9\x3a\x58\xac\x7e\x8c\x48\x21\x7a\x90\x05\x21\x2a\x41\
+\x05\x2c\x67\x40\xf7\xaf\x12\xf6\x1c\xe3\x20\xf4\x0f\x23\xde\x1e\
+\x6e\xc8\x9a\x48\x33\xd1\x00\x42\x96\xac\x79\x7c\x76\x46\xab\x69\
+\x61\x0e\x88\xa8\xa4\x11\x59\xa2\xbd\x4e\xe6\xdd\x05\xcb\x9b\x5b\
+\xb5\xad\x4d\xc7\xeb\x60\x73\xf8\xd1\xe1\x0f\x51\xe7\x0c\x72\xb3\
+\x29\x43\x9a\x3e\xd5\x4b\x28\x01\x54\x1e\x48\x62\xa9\x8f\x41\xec\
+\x6c\x10\x89\xb0\x50\x36\x69\x7c\xf8\x5c\x1a\xc0\xea\x12\xec\xf7\
+\x4e\x35\x11\x56\x63\x0e\x22\x2b\x5a\xee\x89\xfa\x47\x21\x60\xdd\
+\x0b\xc0\xef\x78\x17\x2f\x35\xd7\x21\x33\xd3\x8f\xd3\x5d\x41\xdc\
+\x5f\x50\x87\x83\x9d\xbb\x70\xcb\x6c\x0e\x2a\x15\x46\x07\x9c\xbd\
+\x90\xc2\x0f\x9f\x11\x48\x5c\x12\xd1\x9f\x07\x45\xf7\xd8\xb0\x99\
+\xb9\x44\xa5\x68\x2e\xb4\x37\x99\x4a\x1d\x5a\x24\xf1\xe6\x21\x18\
+\xe7\xbb\xd3\xce\xd5\x1c\xb0\x0c\xf4\x09\x05\x3d\xc8\x46\xe3\x4b\
+\xc5\x28\x30\x0d\xe1\xec\x45\x3f\xf6\x3e\x74\x5a\x63\x75\xdf\x8e\
+\x72\x94\xdf\xc1\x43\xa1\x81\x5c\x88\x28\x78\xed\x23\x01\xd3\x27\
+\x80\xf1\xee\x18\x84\x4b\x63\x55\x4c\xbf\xd1\xb1\x23\xbb\x32\x7f\
+\x15\x6b\xd0\x41\xf2\x8d\x01\xcb\xd7\xc3\x38\xe0\x05\xe9\x3a\x42\
+\x49\xa8\x0c\x68\x3d\x28\x18\x17\x4f\xa1\xdd\x6a\xc7\x81\xb7\x72\
+\xd1\x71\x76\x00\x9f\x5f\x01\x38\xd6\x75\x14\x9f\x0d\x6c\x40\xa6\
+\x45\x87\x21\x49\xc1\x63\xef\x0b\xb8\xdb\x9f\x42\x32\x45\x10\x3a\
+\xe5\xdf\xc9\x0c\x64\xb9\x3d\xee\x05\x93\x8b\x08\x51\x10\x69\xbd\
+\x8c\x9c\x4b\x43\xda\x41\xb1\x7e\x0d\x18\x4f\x33\x65\xa5\x55\x52\
+\x2b\x16\x27\xc8\xf8\xc5\x1c\xc7\x96\xf5\x93\xf1\x5d\xf5\x49\xcd\
+\xae\x33\xd0\x81\xad\x6d\x2b\x61\xb5\xb1\x08\x50\x80\x27\x9e\x09\
+\xa2\xd2\x6e\x84\xac\x63\x10\x6a\x0d\x79\x19\x9f\xdb\x4d\x5c\x65\
+\x2e\xea\x80\x6e\x5c\x32\xa2\xa0\xad\xe5\x2f\xd9\x0a\xab\xeb\xc1\
+\x76\x1f\x4f\x33\x21\x8a\x56\x1f\xa3\x04\xec\x95\x04\x3c\xd2\xd2\
+\xa7\xd9\x6c\x3e\xfc\x3a\xfa\xf8\x6f\xc0\x1b\x18\x74\x5f\x96\xb1\
+\xbe\xde\x83\xbb\x67\x3a\xa0\xa8\x85\x6f\x1f\x05\x13\x98\x96\x4f\
+\xec\x45\x36\x2d\x0d\xfe\xf8\x64\x4c\x6d\x3e\x72\x7d\x57\xaf\x5a\
+\x0d\xae\xeb\x98\x4a\x22\xcd\x84\x3e\x3c\x55\xce\xc8\xac\x45\xc8\
+\x7a\xff\x3d\xd4\xee\x59\x8e\xdc\x22\xaf\x66\xfb\xfb\x45\x82\xaf\
+\xbf\x28\x84\x7d\xbc\x15\x0a\xb5\x19\xf5\x8d\x83\x19\x2a\xca\x23\
+\x8e\x29\x56\xaa\x7b\x06\x83\x89\x1c\x4c\x6f\x6e\xba\x71\x74\x3c\
+\x49\x41\x3a\xd3\xe3\x46\xad\x3b\xa3\xa5\x8d\xca\xf1\xb6\xc5\xd8\
+\x54\x63\x06\x9c\xcd\xf0\xf5\x27\xf1\xe8\xdc\x8d\xa8\x58\xd7\x00\
+\x57\xaa\x1b\x32\x2d\x7a\x64\x90\x02\xf4\xba\x5c\x24\xaf\xd4\x49\
+\xc5\x42\xe0\x1d\xb1\x63\xe6\x35\x29\xba\x76\x89\x4f\xd6\x83\x6f\
+\x3b\x8c\x94\x9e\x51\xeb\x9e\x2e\x3c\x6d\xc8\x13\x8e\x42\x5c\x7c\
+\x75\x25\x9c\x19\x99\x78\xa8\xb4\x06\xdd\x73\xcb\xe4\xa9\x96\x98\
+\x4e\x0d\xc4\xd7\x1b\x05\xd3\xe1\xc8\xf2\x14\xcf\x71\x14\x11\x19\
+\x18\xa0\xad\x5e\x1c\x0a\xff\x2b\x80\x27\xd2\x8f\xb6\x7b\xef\xc1\
+\x92\x84\x8c\x24\x55\x1c\xb9\xd2\xa5\x3a\xaa\x16\x7f\x79\x35\x0a\
+\x76\x35\x6a\x76\x3d\xd9\xd9\x28\x2c\xb4\x6a\xf5\xea\xe9\x8d\x7a\
+\x99\xdf\x79\xdb\x8e\x39\xa5\xce\x55\xbc\x9e\xc5\x48\x44\x02\xbb\
+\x62\x1d\xb2\x37\x3e\x8f\x43\x67\xbe\x42\xfb\x40\x3b\xce\xf4\x9e\
+\x81\x5e\xc7\x81\xd3\xf3\xd0\x97\x18\x50\xff\xd6\x49\xcc\xef\x8d\
+\x21\x69\xd4\x5f\x93\x2e\xc0\xbb\xb0\x06\xb3\x1b\x1b\x94\xe0\xd4\
+\x3c\xd6\x61\xe3\x91\xa4\xcd\xfa\x47\xef\xe8\x4e\xe6\x37\xb3\x7d\
+\x51\x9e\xc3\xd8\x34\x79\x92\x19\xb4\x27\xd1\x14\x88\xe3\x85\xa7\
+\x66\xa3\xba\xfc\x56\x94\xe4\x16\x61\x92\xcd\x09\xbf\xe8\x03\xc7\
+\x18\xe1\xe0\xb3\x71\x30\x76\x08\xd5\xab\x5a\xb0\x24\x4c\x3b\x96\
+\x06\xa5\x31\x51\x07\x1f\x4d\x57\xdb\x50\x14\x77\x4e\xc9\xa4\xbf\
+\x81\xe0\xa8\x88\xc1\x68\xb2\x4a\x1b\x15\x27\xcc\x76\xe1\xce\x69\
+\x99\x26\x83\xcc\xe2\x81\xea\x4c\x3c\x4e\x87\x5b\x6c\x22\x80\xd6\
+\xf0\x29\x84\xc5\x00\xad\x8f\x9a\x12\x4d\x47\xd0\x73\x1c\xce\x0f\
+\x26\xd1\xf8\xb1\x05\x77\x78\xbb\x34\xbd\xa7\x99\xd0\x87\x6a\x33\
+\x9d\x3a\x05\x2d\x43\x63\xe2\x5d\x42\xd4\xac\x01\x1c\x35\x59\xe7\
+\xe5\x18\xf5\xad\xc9\x29\x16\xbc\xbd\x79\x31\x2a\x0a\xf2\xf1\x43\
+\xdf\x21\x3a\xf3\x0d\xf4\x20\x7b\xdd\x4c\x67\xa9\xc3\xbe\x6e\x09\
+\x1f\xd7\x7e\x01\xd3\x86\x2d\xb0\x7e\x7f\x50\x7b\x4f\xd2\xf8\xa0\
+\x1a\xc0\xc5\x91\x09\x84\xa4\x54\x59\x95\x38\x76\xee\xaf\xb3\x47\
+\xf4\x19\xdb\x7b\x67\x5a\xd6\x46\x3e\x59\x83\x90\xd0\x86\xc0\xb8\
+\x1a\x39\x7b\x43\xb1\x59\xea\xe1\x7c\x4f\x1c\xad\x75\xa7\xe1\x7d\
+\x7b\x1b\x42\x1b\x37\xe2\x76\x87\x85\xce\x44\x02\xbd\xda\xac\x71\
+\x09\x6d\xd1\x78\x43\x4d\x62\xfc\xef\x71\x7d\x75\xbd\x98\x9b\xf9\
+\x29\x7f\x70\xed\xd2\x70\xf2\x0f\x44\x84\xcb\x5a\xf4\xd7\xdd\x4e\
+\x6a\x1a\x4c\x2c\x3c\x1f\x86\xb1\x73\xf7\x20\x6c\xb4\x98\x39\x46\
+\x03\xd4\xe1\xab\x46\xee\x97\x24\x9c\x89\x09\xfb\x1e\x4c\x8a\x37\
+\x5e\x38\x57\x57\xcd\xb6\x1a\x52\xb6\xc0\x85\xae\x70\x37\x74\xff\
+\x04\xe0\x18\x5c\xe8\x97\xf0\xf2\xd6\x00\x6a\x82\x49\x48\x74\x44\
+\xab\x16\x0a\x1d\x23\xe7\x27\xe2\xf0\x24\x12\x0d\xb5\x49\xf1\xe6\
+\x57\xa6\xba\xa6\xaf\x2c\x59\x5a\x5e\x39\xf3\x53\x5d\xfe\x30\xbd\
+\x17\x98\x2b\xa5\xa5\x8b\x67\xe0\xf1\x49\xa8\xd8\x3d\x82\x37\x5a\
+\x26\x20\x33\x0a\x44\x45\x46\x5f\x42\xc2\x85\x78\x42\xa4\x22\xa8\
+\xa8\x4d\xc5\xff\xff\xd2\x57\xd7\x8c\xba\xd2\x4a\x3e\x43\xb7\xcd\
+\x68\xd7\xdd\x9a\xe1\xd4\x43\xa4\x53\xd4\xd4\x3a\x8e\xaa\x13\x11\
+\x2c\x0b\x4a\xf0\xea\xa8\x44\xa1\x78\x83\xa9\xd4\x61\x3d\xcb\xee\
+\x5f\x96\x92\x6e\xfa\xd9\xf2\x27\xac\xbf\xc7\xad\x62\x2f\xac\xbc\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\x35\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e\xc4\
+\x01\x95\x2b\x0e\x1b\x00\x00\x01\xe7\x49\x44\x41\x54\x48\x89\xad\
+\xd4\x3d\x68\x14\x51\x14\x05\xe0\xef\x85\x25\x04\x11\x09\xa9\x42\
+\x10\xb1\xf5\x07\x41\x48\x61\x11\xb1\x4d\x23\x76\xc1\x46\x08\x16\
+\xce\x36\x22\x28\x12\x82\x88\x88\x84\x60\x21\xa6\x92\x4c\x27\x82\
+\x12\x2c\x44\x8d\x85\xa6\x48\x21\xc4\x42\x6c\x83\x22\xa2\x8d\x88\
+\x58\x2c\x22\x22\x61\x09\x79\x16\xb3\x9b\x9d\x4d\x9c\xd9\xcd\x9a\
+\x5b\xcd\x9c\x73\xdf\x39\xf7\xde\x77\x67\x82\xdd\x88\xd4\x08\xa6\
+\xb0\x88\x65\x89\x8d\x26\x15\x76\x41\xbc\x82\x87\x98\xc0\x1a\x5e\
+\x60\x1a\x9f\x24\xbb\x63\x30\x2e\x5a\x14\x54\x72\x68\x0d\x77\x30\
+\xf7\x7f\x06\xa9\xbd\xa2\x15\x1c\x2b\xc8\x78\x5b\x29\x20\xba\x8d\
+\xaa\xe0\x68\x59\x42\xef\x1d\xa4\x86\xf1\x1e\x83\x62\x4e\xa9\xf5\
+\x5c\xc7\x99\xde\x3a\x48\xf5\x89\x6e\x63\x70\x13\x8b\x39\x3e\x33\
+\x79\x8a\xa5\x5e\x47\x34\x86\x89\x92\xfe\x6b\xb8\x21\xb1\xd1\xb7\
+\x63\xe9\xd4\x00\x66\x05\x03\x25\x59\xf7\xf0\x01\x7a\xe9\x60\x52\
+\x74\xa2\x90\x0d\x3e\x63\x56\xd2\x7c\xdd\x49\xcc\x1b\x12\xac\x62\
+\xb8\x20\x63\x1d\xe7\x24\x16\x9a\x40\xfb\x88\x52\x87\xa5\xfe\x3d\
+\xb6\x14\xc1\xb5\x12\x71\x58\xc6\x93\x3c\xd0\x12\x4b\x9d\x15\xad\
+\xe2\x95\xd4\x98\xf9\x6d\x87\x47\x45\xd5\x42\xe9\xe8\x37\xa6\x24\
+\xea\x79\x38\x34\xc4\x47\xb0\x82\x83\x0d\x7c\x4d\xf4\x18\x33\x82\
+\x8f\xa2\x7e\xc1\x33\x8c\x97\x54\x3f\x27\xba\xa2\xda\xfa\xd1\x65\
+\x06\x69\xc3\x82\x0b\xb9\x6a\x9a\xd6\x35\xdc\xc7\x17\xdc\x55\xb4\
+\x14\xd1\x0f\x1c\x52\x55\xdb\x4a\x55\x1a\x55\x4d\x16\x54\x35\x84\
+\xcb\x25\x55\x13\x6d\x08\xa6\x25\xdb\xc5\xc9\xee\xe0\x26\xfa\xdb\
+\xd0\x9d\xec\x56\xf0\x06\x8f\x8a\xe8\x3e\xd1\x8c\xc6\x47\x91\xab\
+\xaa\xbb\x88\xea\xb8\x2e\xb1\x56\x6c\x50\xf5\x1c\xc7\x71\x51\xf4\
+\xbd\x4b\xe9\x2c\x82\x07\x78\x5d\x9e\x92\x8f\xd4\x7e\xd1\x55\xc1\
+\x24\xf6\x75\x90\xff\x89\x23\x12\xdf\xca\x92\xda\x3f\xaa\xc4\x57\
+\xc1\x25\x9c\xc4\x4b\xda\x57\x6e\x33\xb2\x11\xce\x74\x12\xa7\xec\
+\x3a\xb3\xf5\x1d\xc7\x2d\x8c\x6e\x61\xdf\xe1\x94\xc4\x9f\xde\x0d\
+\x5a\x46\x7b\x64\x6b\x3c\x85\x03\xa8\x8b\x4e\xab\x5a\xea\x78\xb6\
+\x2b\x83\x96\xd1\xb0\xe8\xbc\xe0\x17\xe6\x25\xd6\xbb\x39\xf6\x17\
+\xb5\x84\x78\x95\xc2\x0a\x85\xf0\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x04\x79\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x40\x49\x44\x41\x54\x78\xda\xad\x96\x6b\x68\x1c\x55\
+\x14\xc7\xff\x77\x66\x36\x91\x68\xd4\xb5\xb5\xb5\x0a\x55\xb0\xfa\
+\x41\x45\x82\x82\x1f\x7c\x41\x35\x5a\x45\x08\x3e\x28\xd8\x16\x2b\
+\x3e\x2a\x7e\x28\x55\x94\x4a\x6b\xb3\x48\xa5\xc6\x56\xb4\x58\x14\
+\x11\x94\x34\xb5\x46\xeb\xa3\x41\x41\x8d\x92\x52\x05\x6d\x20\xa9\
+\x69\x8a\x48\x5e\xdd\x6e\xc3\x66\x37\xcd\x26\xbb\xc9\x66\x67\x67\
+\xe7\x7d\xaf\xe7\xce\x6e\x62\xb6\x1b\xa2\x0d\xbd\xb3\x33\x73\x1f\
+\xb3\xf3\xbb\xe7\xfc\xcf\x3d\x77\x18\xe6\x94\x77\xdb\x7e\x13\x82\
+\x33\x78\x3e\x87\x10\x02\x60\x0c\x0a\xe4\x8d\xee\x0c\xc8\x9a\x1c\
+\x2a\x75\x4c\xdb\x26\x32\xd9\x1c\x62\x49\x1d\x9d\x7b\x5f\x60\x58\
+\xa0\xb0\x73\x01\x6b\xef\xba\x35\xa8\x87\x42\x2a\x0a\x86\x8b\x9c\
+\x55\x40\xde\xf2\x60\xd8\x2e\x26\x0d\x03\x53\xba\x0f\xd3\x72\x10\
+\x1d\x3b\x8b\xa1\xb3\x19\xd8\x26\x5b\x10\x52\x36\xb0\xe7\x9b\xa3\
+\xe2\xc9\x7b\xeb\xb0\x72\x59\x38\x68\x0b\x3a\x0a\x05\x07\xba\xe5\
+\x23\x67\x9a\xc8\xe9\x79\xa4\x0c\x07\x2e\xb5\xfb\x53\x69\x74\x9c\
+\xe8\xc3\x9d\x37\x5e\x8f\xce\xa1\x38\x7e\x7d\xeb\x59\x76\x5e\x00\
+\xdf\x75\x61\xc2\x23\x80\x4a\x33\x76\x61\x39\x79\x58\x64\x45\x86\
+\xac\x72\x39\x47\x7f\x62\x12\x03\xf1\x38\xd6\xdf\x7d\x0b\xda\xba\
+\x4e\xe3\xaf\x78\x6a\x5e\x48\x59\x47\xd3\xa1\xa3\x62\xc3\xea\x12\
+\xc0\xf7\xc9\x04\x0e\x07\x2a\x2c\xcb\x82\x69\x14\xa0\x9b\x3e\xb9\
+\x4b\xc0\xf1\x5d\x0c\x24\xd2\xe8\x8a\xc6\x10\x59\xff\x20\x7c\xc7\
+\xc3\x9e\xef\x3a\xd1\x3f\x32\x5e\x01\x29\x6b\xec\x6a\x3d\x22\x9e\
+\xaa\xbf\xad\x04\x70\x20\x05\x67\x8a\x02\xcb\x27\x4b\x4c\x17\x05\
+\xdb\x83\xe3\x88\xc0\x79\xbd\xb1\x04\x7a\x87\xd3\x78\x7b\xe3\x7d\
+\x48\x4e\xe9\x18\x1c\x1e\x47\x7b\x6f\x14\x3d\xb1\xd1\x32\x48\x19\
+\xe0\xcd\x2f\x8e\x88\xa7\xef\x9f\x01\x58\xe0\x5c\x95\x81\x04\x41\
+\xa7\x49\x91\x65\x90\xd8\x9e\xe3\x43\x11\x3e\xce\x8c\xe7\xf0\x63\
+\xcf\xe9\x00\x30\x9d\xcb\x23\xef\x0b\xc4\x93\x63\x68\xeb\x8e\xe1\
+\xa7\xe3\x03\xe8\xfb\xf8\x65\x56\x01\x88\x7c\xde\x21\x9e\x7f\xe0\
+\xf6\x59\x0b\x38\x2f\x0e\xcb\x10\xf5\x4b\x10\x29\xb0\x74\x91\x41\
+\x5a\x74\x9c\x1c\x0a\xc6\x75\x5d\x20\x2f\x9c\xa0\xfe\xe7\xa9\x51\
+\x9c\x49\x8e\x63\xf0\x93\x57\x2a\x01\x5b\x9b\x7f\x16\x9b\x1f\xb9\
+\x63\x56\x03\x4e\x62\xce\x3c\xc4\x4a\x10\xb9\x46\x72\xb6\x80\xe7\
+\x3a\xc5\x40\xb0\x38\x69\xe4\x62\x2c\x6b\xa0\xa6\x46\xc3\x89\xe8\
+\x08\xf6\xfd\xd0\x8d\xe1\xe6\xad\x95\x80\x2d\x1f\x7e\x2f\x5e\x5d\
+\x7b\x4f\x00\xf0\x08\xe0\x10\xa0\xaa\x34\x26\x4a\x0f\x0b\xd2\x64\
+\x9a\xa2\xc9\x71\x5c\x70\x97\xb4\x91\x11\x46\xa0\x74\xd6\xc2\x65\
+\x97\x56\xa3\xeb\x54\x02\xbb\x0f\xfd\x8e\x91\xcf\x5e\xab\x04\x6c\
+\xda\xdb\x2a\x1a\x37\x3c\x5c\xb4\x00\xd2\x15\x1c\xd2\x86\x10\x5d\
+\xb4\x39\xcf\x79\xbe\x02\x9b\xdb\x30\x3c\x1b\x76\x9e\xc1\x15\x16\
+\x01\x4c\xac\xb8\x22\x8c\x63\x83\x71\xf2\x44\x3b\x46\x0f\x6e\xab\
+\x04\xac\x6b\x6a\x11\xbb\x9f\x6b\x08\x00\x06\xcd\x4e\x90\x05\x74\
+\x45\x35\x25\x8c\x10\xf9\xc8\xa7\x3a\xa7\x54\x51\x25\xeb\x1e\x89\
+\xee\x91\x05\x36\xf5\x7a\x2e\x26\x72\x05\xac\x5a\x71\x25\xfe\xe8\
+\x8b\xe3\x99\x7d\x87\x91\x6a\xdd\x5e\x09\x68\x88\x7c\x2a\x3e\xd8\
+\xfc\x78\x00\xc8\x18\x16\x54\x2e\x82\x97\x6a\xe4\x16\x95\x29\xc5\
+\x70\x22\x9f\x29\x2a\x59\x44\x82\xf8\x74\x9a\xdc\x85\x47\xc2\x4f\
+\xe8\x06\x6e\xbe\x76\x19\x8e\xfd\x3d\x82\xc7\x9a\x0e\x62\xe2\xcb\
+\x1d\x95\x80\xd5\x3b\x9a\x45\xcb\x96\x47\x03\xc0\x64\xbe\x10\x38\
+\x3e\x88\xfa\x40\x6c\x86\x10\x39\xaa\x9a\x60\x8e\x14\x26\x04\x5c\
+\x24\x81\x1e\x23\x6b\x49\x83\x9c\x89\x1b\xae\x0e\xe3\x64\x74\x14\
+\xf5\x8d\xfb\x91\xf9\xaa\xf1\xff\x01\xe6\x16\xd9\x54\x29\x9d\xaa\
+\x52\x11\x8d\x15\xc1\xf4\x0b\x11\x74\x82\x2c\x5e\xb9\xe4\x62\x0a\
+\xd3\x04\xd6\x34\x1e\xc0\xe4\xd7\x8b\x01\x50\xbb\xaa\x4a\x83\x4b\
+\x33\x56\x15\x8d\x5c\xa7\x81\x53\x3a\x51\x58\x31\x9d\x2c\x09\xd7\
+\xa0\x7b\x28\x81\x87\x22\x07\x30\xb5\x18\x00\x02\x0b\x54\x8a\x22\
+\x02\xd0\x11\x22\x31\xa4\x97\xa4\x03\x1d\x4a\x27\x4b\x6b\x2f\x00\
+\xe0\xdf\x1c\xc3\x4a\x2b\x10\xc1\xa6\x64\x72\x1f\x57\xd5\x5e\x82\
+\xe3\x04\x58\x73\x21\x00\x72\xd6\x32\x84\x59\x20\xbe\x4c\x23\x3e\
+\xae\xb9\xbc\x76\x61\xc0\x4d\x2f\xbe\x2f\xda\x77\x6e\x9c\x05\xb0\
+\x79\x00\xf2\x0f\x9c\x44\xf5\x25\x82\x42\x54\xa5\x85\xa1\x69\x1a\
+\x4c\x4a\x82\xcb\xc3\x64\x41\x49\xe4\xff\x04\xa4\xa6\x75\x5a\xa1\
+\xc5\x7e\xe5\x1c\x88\x69\x53\x22\xa4\xdc\xc6\x54\x9a\x3f\x45\x95\
+\x46\x0b\x6f\xaa\x60\xa1\xee\xba\xe5\xe8\x89\x26\x51\xbf\x7d\x3f\
+\xb2\xdf\x46\x2a\x01\x4b\x9f\x78\x43\xf4\x7c\xf4\xd2\xec\x96\xb9\
+\x98\x22\xf7\x86\xba\x4d\xef\x21\x7d\x78\x67\x25\xa0\xb6\xe1\x75\
+\xd1\xdf\xb2\x6d\xd1\x2f\x9f\x29\xab\xd6\xed\x82\xf5\xcb\x3b\xf3\
+\x03\xe4\xdd\x15\xd2\x29\xe2\xbc\x5e\x2a\x3f\x73\x18\xe5\xaf\x99\
+\x32\x03\xf8\x07\x33\xbf\x9c\x37\x4a\x11\x78\x43\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x7e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x45\x49\x44\x41\x54\x78\xda\xad\x55\x6b\x4c\x1c\x55\
+\x14\xfe\xee\xcc\x2c\x8b\xf1\x07\x21\x69\x4b\x89\x3f\x34\x06\x13\
+\xfd\xa1\xbf\xaa\xd1\xa4\xc1\xa6\x95\x96\x82\x4b\xeb\x52\xfa\x60\
+\x5b\x1e\x42\x4b\xb0\xd1\x54\x4d\x34\xad\x8d\x6d\x63\x94\x58\xd3\
+\xa7\xe8\xb6\x40\x59\xca\xab\x3c\x76\x81\x2d\x2f\x2b\x05\xd1\x10\
+\x4d\x35\x6a\x7c\x24\xc6\x68\x8c\x1a\xad\xc5\x2e\x05\x16\x96\xd9\
+\xd9\x79\x5c\xcf\xcc\x6e\x69\x69\xb1\xb2\xc4\xb3\x3b\xb3\xd9\x99\
+\x73\xcf\x77\xce\xf9\xbe\x7b\x2e\x73\x57\x7a\x8e\x09\xa2\xb0\x27\
+\x65\xd9\x32\x80\x73\xfc\x1f\xc6\x18\xc3\x95\xbf\xaf\xc2\xd0\xf5\
+\xe3\xcc\xfd\x6e\x2d\x2f\xdd\x5d\x04\x55\xd5\xa1\x69\x9a\xf5\x92\
+\x90\xac\x6f\x7c\x51\xa3\x37\x4e\x49\x4a\x36\xc9\xca\xf5\xec\xe9\
+\x06\xb0\xb6\x16\x3f\x77\x38\x33\x29\x38\xc7\xfb\xcd\x7e\xcb\xd7\
+\x6e\x4f\x8c\xfa\xc7\x09\x10\x51\xc2\x10\x28\xb3\xb2\x6d\x1b\x01\
+\x81\xa1\xc7\xdb\x07\xd6\xdc\xd0\xce\x9d\x9b\x37\xc2\xa0\x4f\x9b\
+\xaf\x1b\x3f\xdd\xb7\x1a\xdf\xfc\x15\x34\xdf\xc7\x6d\x1a\x24\xac\
+\x19\x1f\xc1\xee\x1d\x4e\x8a\x06\xf8\x9a\xbb\xc0\x1a\xea\x5a\xf9\
+\x16\x57\xae\xd9\x2f\x74\xf4\x5e\xc4\x17\xc9\x2b\x30\x16\xa2\x4c\
+\x58\xfc\x08\x1a\x93\xb0\x22\x70\x09\xcf\x6d\xcb\x22\x00\x86\xb6\
+\xc6\x0e\xb0\xba\x33\xe7\xb8\xab\x30\x8f\x00\x0c\x74\xf6\x0c\xe0\
+\x87\x94\xc7\x30\x16\x94\x17\x0d\xf0\xe0\xe8\x25\x94\xe7\x67\x51\
+\xa3\x18\x1a\xeb\xda\xc0\x6a\xab\xea\x79\x51\xa9\x8b\x38\xa0\x0a\
+\x08\xe0\xd7\xd4\x27\x10\x08\x29\x8b\x6a\x91\x4e\x00\xf7\x5f\x1e\
+\x41\xd9\xd6\x6c\x02\x10\x50\x7f\xa6\x09\xac\xca\xed\xe1\x45\x25\
+\xdb\x61\x18\x1a\xfc\x7d\x43\xb8\x7c\xef\x4a\x4c\x4c\x2b\x16\xc9\
+\x16\x86\x10\xfb\xe5\xf3\x23\x72\x46\x72\x31\xa2\xa2\xd3\x05\x09\
+\xa9\xbf\x7d\x82\x92\xbc\x4c\x5a\x24\xc0\x53\xd3\x08\xe6\xae\xac\
+\xe6\xc5\xbb\x0a\xa0\x45\x54\xf4\x7e\x38\x8c\xf1\xb4\x74\x4c\x84\
+\x34\xab\x02\x9d\x96\xc9\x11\x0e\xc5\x30\x10\xd6\x6f\xd7\xad\x44\
+\xe0\x77\x8b\x22\x24\xf2\xbd\xcb\x26\x40\x17\x25\x24\xff\x3c\x84\
+\x82\x9c\x0c\x02\x16\x50\x5b\x5d\x0f\x56\x79\xe2\x34\x2f\x2e\xdd\
+\x0e\x55\x53\x71\xbe\x77\x10\x81\x87\xd6\xe1\x97\xb1\x10\x64\x15\
+\x96\xa6\x17\x42\x05\x8f\x6d\x1b\x7b\x42\x22\x96\x7f\xef\xc7\x9e\
+\x42\x07\x04\x49\x82\xa7\x8a\x5a\x74\xe2\x88\x9b\xe7\x17\x6c\x86\
+\x22\xcf\xc0\xd3\xda\x05\xed\xc9\x67\x11\x98\x8e\xea\x39\x5e\xe3\
+\xb6\x44\x88\x43\x35\x78\xa5\x38\xd7\x92\x69\x4b\x13\xa9\xe8\xc8\
+\xdb\x27\x79\x1e\x6d\x0c\x25\xac\xa0\xa5\xeb\x03\xd8\x33\x77\xe2\
+\xca\x84\xbc\x28\x92\x41\x15\x68\xfd\xa7\xf0\xbc\xcb\x01\x83\x4a\
+\xf7\x9a\x00\x87\xdf\x3a\x4a\x1b\x2d\x07\xe1\x99\x30\x7c\xfd\x43\
+\x48\xca\x29\xc7\xe8\xe4\xe2\x00\x58\x82\x1d\x53\xfe\xf7\x50\x96\
+\xbb\x8e\x38\x60\xf0\xb5\xd3\x46\xab\x38\xf4\x0e\x77\x6c\xca\x86\
+\x1c\x92\xd1\x3f\x3c\x82\xa5\xce\x17\x30\x1a\x0c\xc5\x3d\x2a\x4c\
+\xae\x18\x55\x30\xe6\xad\xc4\x8e\xac\x74\xaa\x00\xe8\xf1\xf5\x82\
+\xbd\x71\xb0\x82\xaf\x7f\x3a\x13\xb2\x1c\x42\x75\x55\x1d\x1e\x3d\
+\x50\x05\x59\x67\x88\x17\xc1\x74\x0f\x6b\x06\x7e\xac\xd8\x89\xf2\
+\x5d\x25\x16\x07\xfd\xdd\x17\xc0\x0e\xee\x7f\x93\x67\x64\xad\x46\
+\x30\x18\xc4\xb9\xa6\x76\xd2\x66\x84\x86\x96\x82\x1b\x08\xc6\x6c\
+\x08\x1e\x1b\xe7\x6c\x56\x5a\x3c\xe6\x17\x9d\xc0\x09\x76\x3b\x0c\
+\x92\xaa\xcb\xb5\x15\x22\xc9\x77\xa0\x7f\x10\x6c\xff\xde\x43\x7c\
+\x55\x46\x3a\xc6\xaf\x4d\x58\x0f\x25\x49\xa4\x00\x42\x74\xb9\x15\
+\xf0\xbf\xd5\x74\xc3\xdf\xb0\x26\x02\x37\xa2\x23\x7b\x78\xe0\x23\
+\x02\x78\xf5\x00\x7f\x7c\xd5\x4a\x04\x02\x57\x71\xab\xe8\xcd\xf9\
+\xb4\x90\x7d\xc0\x04\xe1\xb6\x76\xd9\x6c\x36\x7c\x3a\xfc\x19\x58\
+\x61\x7e\x09\x5f\xeb\x58\x8b\x08\x1d\x36\xb7\x9a\x6e\xe8\x0b\xea\
+\xbf\x28\x88\x73\x1f\x90\x04\xa7\x27\xa7\xf0\xf9\xc7\x04\x90\x9f\
+\x57\xe8\xd4\x34\xd5\x37\xdb\xce\x9b\x2c\x12\x8e\x20\x29\x39\xe9\
+\x8e\xc1\xa7\x88\x3b\x89\xb2\x9d\x63\xdc\xac\x8a\x41\x94\xa4\xdc\
+\x3b\x36\x60\x43\xb6\xf3\xe2\x6b\xaf\xef\x5b\xb3\x3c\x35\x05\xf2\
+\x8c\x0c\x95\xe6\x95\xa2\x46\xa0\x28\x11\xea\xb5\x8a\x3f\x7e\xff\
+\x13\xed\xad\xed\x83\x9d\xdd\xde\xa7\xfe\xb5\x7d\x37\xff\xd9\xb4\
+\x61\x4b\x81\x22\x2b\x67\xcd\xb3\xf9\x3a\xb5\xee\x9a\x4a\x2c\x59\
+\xba\x84\xce\xec\x08\x74\xe2\xc4\x3c\x98\x74\x1a\x7e\xa6\x00\xc6\
+\x02\xd7\xb0\xf7\xe5\x7d\x31\xa2\xcd\x8c\x45\xd8\x12\x6c\x85\x5e\
+\x7f\x6b\xfd\xbc\x00\x59\x19\x39\xdf\xd6\x78\x4e\x3d\x9c\x7a\x4f\
+\xea\x9c\x2c\x54\x55\x83\xa6\xab\x51\x00\x2d\x0a\xa0\x13\x90\x19\
+\x54\x92\x6c\x94\x8c\x6e\x1d\x30\x5f\x7d\xf9\x35\x8e\x1f\x3e\xf9\
+\x5d\xcf\x85\xce\x47\xe6\x05\x70\xac\x7f\xe6\x68\xda\x03\x69\x2f\
+\x5a\x04\x53\x40\x83\x46\xb4\x6e\x98\xa3\xd2\xb0\x14\x65\xca\xd0\
+\xcc\x5c\xa7\x8b\x5b\x97\x6e\xf9\x58\x72\x8e\xc9\x6d\x72\x62\xf2\
+\xd8\xf9\xbe\x8e\x97\xae\xc7\xfc\x07\xeb\xee\x07\x1e\xc6\x86\xaa\
+\xdb\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xe0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xa7\x49\x44\x41\x54\x78\xda\xb5\x94\x7f\x4c\x53\x57\
+\x14\xc7\xbf\xf7\x95\x76\x01\xa4\x21\xaf\x68\xa6\xe9\x04\xad\x12\
+\x40\x30\xa2\x8e\x39\x37\x13\x62\xf0\xe7\x22\x59\x60\x04\xeb\x02\
+\x93\xc4\x41\x36\xb2\xcd\x2d\x0b\x19\x24\x44\x42\xac\xfa\xc7\xe2\
+\x8f\x48\xa2\xc6\x18\x63\xf0\x07\x99\x1a\x7f\x30\xd8\x32\x46\x88\
+\x28\xc3\x31\x16\x1c\x32\x28\x16\x08\x60\x2d\x0c\x68\xad\xd0\x5f\
+\x50\xde\xbb\xde\xf6\x4d\x94\x52\x35\x84\x7a\x92\x97\x9b\x77\xcf\
+\x8f\xcf\x3d\xe7\xdc\x73\x09\xde\xb0\x90\x57\x29\x2f\x95\x5f\xbf\
+\xca\x96\xb4\xd7\xc4\xa8\xd0\x66\x7d\xac\x9d\x35\xe0\x54\xd9\xb9\
+\x0f\x12\x56\xc7\xde\x89\x98\xaf\xf2\xfe\x3b\x6c\xce\x99\xce\x1c\
+\x81\xdd\x6e\x47\x5b\x8b\x3e\x36\x37\x3f\x5b\x3f\x2b\x40\x49\xd1\
+\x81\xd2\x5d\x39\x99\xc5\x23\xc3\x66\xf4\x75\x9b\xfc\xda\x44\x6a\
+\x16\x41\x19\x16\x86\xab\x15\xd7\xf7\xef\xd3\x15\x16\xcf\x16\x40\
+\xb7\xa4\x6e\x42\xdd\xaf\x75\x28\x2a\x29\xf0\x6b\x77\xb1\xbc\x82\
+\x46\x69\x96\xa2\xa6\xaa\x16\x0c\x40\x5e\x0a\xd8\x7c\xe5\x61\x11\
+\x28\xd5\x3d\xdb\xa4\x5c\x10\x14\x7f\xfc\x8c\x2f\x93\xd5\xa8\xad\
+\xfe\x0d\x2d\x5b\x8b\xc1\x09\xee\x69\x8e\x02\x91\xe1\x93\xee\x0b\
+\x88\x5a\xae\xc1\x89\x7a\x13\x26\xd6\xef\x00\x11\x27\x5f\x0c\x7d\
+\xc6\xed\x74\xe7\x91\x55\xa5\x8d\x29\x72\x85\xbc\x86\xbe\xe8\xcd\
+\xc9\xa0\x30\xdc\x86\x66\xa4\x1e\x8f\x6d\x2e\x0c\x6c\xd6\x81\xf8\
+\x00\x3c\x87\x58\xd8\x7c\x06\x8a\x90\x10\x18\x95\x09\x10\xd5\x71\
+\x80\x28\x4e\xb7\x11\x84\x2f\xc8\x7b\xc7\xfe\xa1\x13\xe3\x93\xf0\
+\x15\xca\x20\x14\x32\x6f\x8e\xd2\xe9\xa9\x8f\x05\xf9\xdf\x86\xe9\
+\x29\x0b\x4c\xc5\x19\x31\x14\x8a\x20\x90\x9d\xd5\x8f\xa8\x36\x9e\
+\x87\x40\x29\x02\x29\x41\xec\x86\x5d\x6a\x7b\x0c\xf2\xe9\x8d\x7e\
+\x9a\x14\xcd\x63\x68\x5c\x7c\xf5\x50\xcc\x52\x64\x0c\xd0\xdc\x69\
+\x06\xc9\xb8\xdc\x43\xe3\x34\x2a\x0c\x39\x05\x2f\x40\x24\xdc\xb4\
+\x62\x70\x2c\x33\x02\xff\xd9\x79\x34\x22\x79\x7e\x2c\xf2\xac\x5c\
+\x9e\x95\x01\x3a\x0d\x0c\x90\x76\xde\x40\x17\x44\xf2\xf8\xcf\x2e\
+\x40\x64\x9b\xef\x0f\xeb\x21\x9f\xb0\x79\x43\xca\x98\xc7\x3d\x55\
+\x1c\x46\x15\xc1\x33\xb2\xf3\xe8\x95\x13\x4e\xac\x32\xb7\xb3\xf2\
+\x4a\xc1\xdd\x8a\x79\x68\x9c\x1f\x03\x99\xe7\x50\x6c\x63\xb8\xcf\
+\x02\x92\x5c\xd6\x4a\x89\x32\x04\x63\x0e\xc1\x7b\xf5\xf6\x85\xfe\
+\x8d\x75\xc9\xeb\x11\xae\xe2\xd1\x6f\x1c\x44\xc9\x4d\x3d\xba\x94\
+\xd1\x20\x3e\x4d\xa4\x2c\xd3\x65\xa3\x0f\x70\x38\x73\xe5\x94\x6d\
+\xfb\x9f\xcd\x28\x75\xac\x81\x1c\x82\x64\x33\xe6\x04\x49\xd4\x35\
+\xad\x15\xdc\xc2\x5f\xdb\x57\x86\xa3\xe2\x96\x09\xdf\xab\xff\x45\
+\x54\x6c\x34\x54\x11\x2a\x98\x47\xcc\x38\x52\xd9\x05\x63\x68\x2c\
+\x38\x4c\x07\x88\x6c\x47\x6d\xef\xc0\xb7\x3b\x96\x81\xe7\x79\x58\
+\x2c\x16\xf4\x76\x3c\xc0\x51\x53\x3c\xe4\x44\x44\x30\x1f\xc6\xea\
+\x44\xde\xf5\x66\x1e\x57\x58\x4f\xbf\xce\x88\x41\xdd\x80\x88\x90\
+\x9f\x0e\xe0\xed\xf0\xb7\xd8\xdc\x51\x38\xed\x36\x58\x92\xb2\xd8\
+\x1d\x8f\x62\x11\x7d\xfa\xc0\xca\xc9\x19\x7b\xc1\x37\x95\x23\x38\
+\x74\x1e\x2b\x09\xc1\xa0\x75\x1c\xe3\x3b\x8b\x60\xb7\xda\xd1\xd3\
+\x66\xc2\x7d\xdd\x06\xa9\x43\xcb\xbf\xfb\x9d\x16\xec\x4e\x44\xc3\
+\x08\x65\x33\x16\x34\xd5\x52\x8f\x92\x88\x82\xdf\x3b\x2e\x19\x70\
+\x53\xb3\x30\xd5\x64\x36\xcd\x4f\x9e\xb0\x07\xf0\x8e\x01\x1d\x3f\
+\xa6\x48\x00\x4d\x7e\x35\xdd\xbb\x27\x09\xf5\x03\x6e\x6f\x63\xe7\
+\x22\x9e\x88\xa3\x56\x17\xba\x1a\xf4\xe8\x3c\xbe\x4d\x02\x2c\xf9\
+\xfc\x06\xcd\xcf\x5d\x87\xba\x47\x81\x00\x10\xd8\xac\x0e\xf4\x35\
+\x74\xa0\xeb\x54\xaa\x04\x88\xfc\xec\x0a\xcd\xcd\xfb\x10\x35\xfd\
+\xae\x39\x03\x3c\x29\xb8\x18\x60\xb0\xb1\x1d\xdd\x67\xd3\x25\x80\
+\x5a\x7b\x91\xe6\xe4\x27\xe3\x17\x83\x8b\x8d\xf8\xdc\x01\x6e\xd6\
+\x03\xf3\xdd\xfb\xe8\xbd\xa0\x95\x00\x8b\xd2\xce\xd1\x5d\x5f\x6d\
+\x44\x65\xa7\x23\x20\x00\x81\x65\xe0\x68\x6a\x45\xff\xe5\x6c\x09\
+\xb0\x20\xf5\x34\x4d\xff\x66\x1b\xaa\xda\x6d\x01\x29\x91\x68\xb5\
+\xc1\xdd\xdc\x02\xd3\xb5\x3d\x12\x20\xe2\xa3\x93\x07\xdf\x59\xb1\
+\xf8\x07\x63\x9f\xd5\xfb\x86\xcc\x0d\xc0\xbe\xc9\x49\x50\xa7\xe3\
+\xd0\x50\x65\x5e\x61\x20\x1f\x50\xbf\xf2\x14\x79\xef\x80\xf0\xef\
+\x05\xd8\x45\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xcb\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x92\x49\x44\x41\x54\x78\xda\xa5\x94\xdb\x6b\x14\x57\
+\x1c\xc7\xbf\x67\x76\xb3\x21\xbb\x99\x5c\x4c\xb5\x42\x30\x42\xe2\
+\x56\x83\xf8\xd0\x22\x8d\x45\x8a\xa5\xa5\x79\xd0\x62\x1f\x5a\x4a\
+\xa1\x2f\x8d\x56\xa5\x8a\xd0\x87\x4a\xad\x77\xff\x80\x7a\x03\x95\
+\x4a\xfb\xda\x37\x5b\xc1\x0b\x94\xf6\x41\x5a\x34\x35\x4d\x82\x35\
+\x89\xd9\x4b\xa2\xd5\xc4\x4d\x36\x9b\xcd\xec\x64\x76\x76\x2e\x3b\
+\x7b\x8e\xbf\xd9\x49\x54\x10\x93\x75\x3c\x30\x9c\xb3\x7b\xce\xef\
+\xfb\x39\xdf\xf3\x3b\xe7\xc7\xb0\x40\xcb\x6d\xfc\x20\x19\x7c\xf7\
+\xad\x55\xac\xb1\x01\x5c\x70\x80\x73\x08\x21\x40\x23\x08\xfa\xb8\
+\xa2\x62\xe6\x7a\xcf\x48\xb4\xf7\x46\xf4\x45\x1a\x6c\x41\x40\xc7\
+\x7b\xe3\xf2\x8f\x07\x9b\xdd\xb1\xc8\x4e\xd1\x6a\xee\x4d\x70\x06\
+\xc6\x18\xac\x47\x29\x3c\x3a\x73\x29\x4e\x80\x35\xfe\x00\x6f\x6f\
+\x4a\xc8\x17\x0e\x45\xf9\xe4\x18\x44\xec\x3f\x20\x10\x2c\xbb\x20\
+\x1b\x14\xc8\x61\x67\x74\xa4\xfe\x48\xc4\xa3\x3d\x7f\xfb\x04\xbc\
+\xf3\x7e\xbf\x7c\xfe\xfb\x37\xf9\xc4\x38\x44\xe2\x0e\x20\x49\x4f\
+\x01\xe4\xc0\x4e\x6b\x48\xfd\x99\x88\x45\x7b\xfe\x6a\xf7\x0b\xb8\
+\x1e\x3e\xba\x67\x13\x2b\xe5\xc8\xc1\x6d\x72\x10\x20\x00\x9d\x3e\
+\x89\xb3\x80\x84\xe2\x74\x1e\x77\x4f\x5e\x1c\x5c\xaf\x65\xd7\xf9\
+\x05\xfc\x1e\x3e\xfc\x75\x27\x2b\x29\x10\xf1\x01\xa0\x2a\x04\x98\
+\x3a\xc4\x74\x16\xd0\x54\x98\x23\x53\x48\xde\x1a\x7b\x25\xc0\x95\
+\xf0\xf1\xbd\x5b\x24\x3d\x05\xe7\xda\x45\x40\x21\x27\x05\x93\x66\
+\x24\x0a\x64\x28\x66\x4d\x0c\xdd\x9e\x8c\x6f\xb0\x34\x7f\x39\x98\
+\x69\x6e\xbb\x1a\x39\xb8\x6d\x33\x52\xc3\xe0\x7d\xfd\xa4\x1b\xf4\
+\x26\xdc\x1c\x50\x2a\xec\xac\x81\xe1\xc1\x4c\xbc\xc3\x50\xfd\x01\
+\x32\x21\xf9\x8a\x7c\x78\xd7\x16\xc9\xc9\xa0\xf4\xcf\xbf\xb4\x3a\
+\x50\x16\x7f\x02\x50\x4c\x0c\xdf\x9d\x1e\x25\xc0\x2a\xbf\x80\xcb\
+\x04\xf8\x48\x32\x26\x51\xba\xd5\x3b\x77\x8b\x50\x4e\xb4\x1b\x68\
+\xe7\x2c\x0c\xc7\xb2\x23\x04\xf0\xf7\xd0\x08\x70\x49\x3e\xb0\xf3\
+\x63\x18\x13\x10\x37\xc9\x41\x70\xde\x81\x17\x68\x2b\x04\x48\x2a\
+\x49\x02\xbc\xe1\x17\xf0\x8b\xbc\xff\xab\xcf\x91\x4f\x31\xd1\xd3\
+\xeb\x5d\x53\xb7\x46\x94\x44\x39\xd4\x56\x2d\xc4\x46\x73\xaf\x74\
+\x44\x3f\xcb\xdf\x6d\xef\x82\x46\x80\xee\xde\xb2\x03\xc1\xe7\x72\
+\xe0\x3a\x50\x8b\x88\xfd\xaf\xde\x23\x40\x9b\x5f\x40\xb7\xfc\x6d\
+\x57\x07\xb4\x71\xc6\xbb\xfb\xbd\x23\x9a\x07\x08\x72\xa0\x11\x60\
+\x6c\x76\xb6\xa3\xa0\xd6\x2f\x0a\xc8\x37\x2c\x1d\xa0\x17\xda\x24\
+\x4a\x25\xf7\xa2\x4f\x3a\x36\xaf\x76\x8a\xce\xea\xda\xfd\xdb\x23\
+\x92\xf2\x90\x92\xdc\x47\xab\xa5\xb9\x32\x4a\x43\xea\x4d\xcd\xc6\
+\xe0\x98\xca\x75\x26\x6e\xd2\xbf\xe4\x47\x34\xda\x74\x90\x34\x9e\
+\xfa\xc4\x2a\x6c\x7d\xce\x01\x41\xee\xb1\xd7\x9a\x5a\xaa\x7f\x3a\
+\x26\x39\x17\xce\x51\xfd\xb9\xcf\xb0\x64\x09\x60\x58\x10\x79\xf3\
+\x89\x78\x39\xd1\xdc\x73\xe1\xaa\x49\xf4\x3b\xc0\x24\x3e\x34\xa1\
+\xb2\x98\x6e\x26\x3e\xb5\x8d\x35\xcf\x39\x98\x6f\x5a\xa4\x71\x44\
+\x6a\x6d\x69\x0b\x1d\xd9\x01\xe7\xc4\x19\x08\xcd\xa0\x3d\xb9\x3b\
+\x67\xde\xf1\x94\xbf\xa7\x20\xf7\x3d\xb8\xcf\x6f\x34\xab\x21\x61\
+\xd8\x53\x5b\xad\xc2\xeb\x8b\xe6\x40\xa9\x69\xc8\x54\xb5\xb6\x34\
+\x55\x1f\xda\xc9\x9c\x1f\x4e\x79\xbb\xa7\xf2\x50\x6e\xcf\x38\x70\
+\xc7\x01\x52\x78\x30\xa3\xe3\x81\x59\x9c\xf9\xd0\xcc\x37\x55\x9c\
+\x64\x82\xa4\xa5\xd6\x15\xcb\x22\xfb\x76\xc0\x22\x08\x73\x6b\x10\
+\x9b\x4f\xb2\x07\x09\x50\xaf\x14\x6c\x0c\x68\x46\x9a\xc4\x97\xbf\
+\xfc\x2d\x0a\xd7\xdf\xaf\x5a\xb9\x72\x45\xed\x37\x5d\x01\xeb\xc4\
+\x69\x30\xca\x85\x97\x68\x41\xe7\xce\xa0\x9b\x74\x8b\x74\x33\xb7\
+\xb1\x30\xdb\xe8\xeb\x9a\xba\x2d\x5d\x53\x37\x48\x90\xb5\x75\xbb\
+\xbf\x84\x75\x92\x20\xa6\x45\x15\x23\x08\xdd\x22\xf1\x82\x69\x92\
+\x78\xcd\x42\xf1\x8b\x02\xdc\xf6\x30\x14\x49\xc9\xed\xed\xcb\x6b\
+\xbf\xf8\x8c\x39\xe7\xce\xc2\xd2\x74\x31\x64\xd8\x06\x89\x47\x16\
+\x8b\xad\x08\x30\x07\x49\x37\x74\x76\x2e\x0b\xd5\xd7\xa3\xef\xb7\
+\x5f\xf3\x24\x2e\x57\x12\x57\x31\xc0\x6d\x37\xc2\x75\x49\xea\x9a\
+\x49\x3c\x5c\x69\xcc\x63\x57\x3f\xe5\x28\x32\x43\xed\x9e\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x3a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x01\x49\x44\x41\x54\x78\xda\xad\x95\x5f\x4c\x5b\x55\
+\x1c\xc7\xbf\xe7\xde\xde\xb6\x14\xba\x02\x63\x60\x8b\x18\xb3\x8d\
+\xcd\x4c\xe2\x16\x16\x65\x3e\x98\x45\xb2\x01\x71\xb0\xb2\x45\x86\
+\xf3\x4f\xa6\x46\x13\x35\xfa\x60\x7c\xd0\xcc\x07\x21\xfa\xe0\xeb\
+\x5e\xd5\xe8\x22\x3e\xc0\x16\xe7\x82\x9b\x0a\x4e\xdd\x9f\x2c\xcc\
+\x69\x9c\x8a\x64\xf2\x67\x15\x58\x29\x7f\x0a\xa5\xf4\xb6\xbd\xbd\
+\xf7\xf6\x9e\xe3\xe9\x65\xb0\xe2\x58\xdb\x44\x6e\x73\xd2\x7b\x7a\
+\xce\xef\xf7\xf9\x7d\x7f\xbf\xdf\x39\x25\xc8\xf1\x89\xec\x6f\xb2\
+\x4b\x65\x1e\x85\x10\x11\x08\xce\x5a\xed\x5f\x9d\xd0\x73\xb1\x23\
+\xb9\x02\xa2\x75\x8d\xa7\xed\xef\xbf\xe9\xc5\xcd\x21\x68\xc7\x7f\
+\xec\x74\x9c\x39\x79\x78\xcd\x00\xf1\xe6\x43\x76\x52\x55\xa9\x48\
+\xf5\xbb\xc0\x06\xfa\x90\xfc\x23\x08\x36\x2d\xe7\x39\x4e\x75\x26\
+\xd6\x06\xf0\xc4\x81\x4e\xe9\xad\x17\x5a\x31\x3a\x00\x28\x32\x1f\
+\x14\xea\x25\x5f\x57\x41\xf7\x89\xa7\xd6\x04\x20\xbf\xf6\x06\x73\
+\x3c\xbf\x1f\xf4\x72\x2f\x20\x4a\x80\x55\x44\xe2\x8a\x1f\xce\xe3\
+\x9f\x65\xb5\xcf\xba\x21\xd4\xe0\xfd\xb0\xe0\x95\xd6\xb7\x89\x3c\
+\xc3\x8b\x3b\xc1\x2d\x04\x40\x20\xa0\x11\x0d\x89\xab\x37\xdb\x5d\
+\x5f\x9f\x6c\xfb\x5f\x00\xf9\xd5\xd7\x59\xfe\x91\x46\x18\xe7\xbf\
+\x03\x24\xeb\x6d\x43\xae\x22\xfe\xb3\x1f\xeb\xbe\xe8\x20\x39\x03\
+\x46\x1b\x6a\x6b\x9d\x82\x73\x8f\x6a\xe8\xa5\x12\xc4\x1a\x4b\x69\
+\x69\x95\xa3\xb9\x16\xa2\x1c\x00\x9d\x9e\xe4\xe9\x11\x56\x98\xd2\
+\x78\x12\xca\x68\x02\xfa\x84\x7f\xc0\x20\xc6\x15\x1b\xc9\x0b\xc4\
+\x10\xfd\xbe\xe2\xdb\x9e\x4b\xcb\xbb\xa6\xf7\x1d\xbc\xea\xbc\xff\
+\xbe\x87\xe9\x3d\x45\x10\x5c\x2e\x08\xe5\x25\xb0\xb8\x0a\x79\x84\
+\x0c\x4c\xe5\x4d\x32\x3b\x03\xfa\xcf\x20\xdf\x69\xb9\x43\x2f\x61\
+\x0c\x64\xcb\x03\x20\x45\x1b\x78\xca\xe2\x30\x28\x87\xfa\x67\x41\
+\x17\x22\x10\x66\xe6\x21\xfb\xc6\x7f\x21\xe1\xa3\xef\xb0\x75\xf5\
+\x35\xa0\x81\x00\xd8\x5c\x10\x24\xa9\xf1\xcd\xe1\x45\x71\xe4\xd6\
+\x10\x84\xbb\x64\x93\x01\x94\xf2\x2f\xb6\x3c\x17\x78\x70\xcc\x62\
+\x85\xe8\x76\x43\xbe\xd0\xcf\x15\xb4\x3c\xf3\x91\xeb\x91\x8d\x2f\
+\x93\xf8\xfc\x62\x01\xcd\xd0\x72\x3e\x7f\x69\x81\x2c\x31\x98\x39\
+\x35\x12\x3a\x16\xfe\x0a\x7e\x6c\xfe\xec\xf7\x3e\x19\x58\xff\x60\
+\xa9\x5b\xb4\x89\x7c\x9d\x65\xf0\xb5\xd8\x41\x29\x0f\x64\x49\x55\
+\xaa\xa3\x26\xfc\xa6\x4a\xd3\x99\xc8\xe7\x31\x15\xb3\x37\x94\xc9\
+\x8a\x73\x67\x3d\xcb\xa1\x8e\x7b\x5b\x26\x36\x6c\x2b\xf1\x88\xd6\
+\x34\xc8\xad\xf4\x10\x41\x34\x0b\x4c\xa7\x78\x9b\x86\x43\x60\x21\
+\xae\x56\x49\x80\x06\x83\xb7\x81\xa9\x0f\x7f\x4f\x2a\x06\x6e\x5c\
+\x9f\x0f\xec\x60\x89\xf2\x3b\xba\x68\xac\xe9\x10\x87\x14\x7b\x2c\
+\x0e\xde\x8e\xfc\x52\xa3\x31\x19\x6c\x7c\x8c\xf7\x3f\x2f\xf4\x64\
+\xaa\x8b\xc4\x15\x91\xa7\xa7\x32\xf5\xaa\xab\x14\x23\x83\x0b\x81\
+\x6a\x4d\x2e\xbf\xeb\x39\xf0\x35\x1e\x9c\x28\xb3\xcb\x1e\x31\x30\
+\x0a\x63\x7e\x9e\x37\x8f\x94\xe6\x6c\xf5\xda\x98\x4b\xbc\xd6\xd7\
+\x87\x22\x81\x6a\x25\x52\xbe\x62\x6d\x35\x83\xdf\xcb\xca\xd9\xb6\
+\xbd\xdb\x91\xfc\xf5\x37\x33\xea\x6c\x8f\xc8\x03\x18\x1e\x8f\xb2\
+\xaa\x85\xb0\xf0\xdf\xb5\x55\x01\xfd\xf7\x6e\x64\x5b\x1f\xdb\xc2\
+\x01\xd7\x72\x06\xfc\xed\x8f\x62\x7b\x64\x81\x64\x05\xf4\x12\xeb\
+\xe6\xca\x5d\x3b\x87\x3d\xf9\x14\xc6\x88\x2f\x37\x00\xcf\x91\x3f\
+\x9c\x80\x2f\xa2\x6e\xda\xab\xc5\x7d\x19\x01\x67\x2c\x52\x53\x75\
+\xdd\x9e\xee\xe2\x99\x31\x18\xd3\x73\x66\xdb\x65\x7b\x04\x0e\x08\
+\xc6\x75\xf4\x87\x62\xf5\xfb\x74\xa5\x37\x23\xe0\x4b\x58\x3e\xd8\
+\xfd\x74\xcb\xbb\xf9\xe7\xbe\x01\xb5\xda\x56\x38\x59\xd2\x62\xf0\
+\x41\xd3\xce\x4b\xaa\xc8\xb2\xc6\xd0\x17\x8a\xb6\x37\xeb\x4a\x5b\
+\x46\x40\x07\xc4\x1f\x9e\x6d\x3f\x5a\x1b\x3f\x76\x8c\xdf\xfb\x36\
+\x7e\x0c\x08\xf8\x2d\x84\xb0\x9e\x44\x5f\x58\x31\xf7\x3c\x5a\x98\
+\x87\x42\xc9\x82\x64\x0a\x44\x17\x41\x79\x5c\x69\xd7\x54\xb8\xf7\
+\xb0\xa1\xd5\x67\x04\x74\x3b\x9c\x81\xc6\xd6\x03\x6e\xf5\xd4\x69\
+\x48\x36\x1b\x42\xdc\xf1\x9f\x71\x0d\x93\x7a\xb2\xfd\x39\xaa\x9a\
+\xd1\x75\x08\xb6\x36\xb7\x64\x79\xef\x21\x7e\x5e\x8a\x39\x48\xe3\
+\x6a\xac\x5c\xc6\xd9\x70\xd4\xe7\xd5\x94\x4d\x19\x01\x3d\x25\x6e\
+\x56\x57\xb3\x13\xb1\x8b\x17\x71\x4d\x37\x30\xa8\xea\x5d\x2f\x31\
+\x6d\xd5\xbf\xc6\x4f\x88\xb5\x73\xab\x4d\x6a\xdd\x91\x67\x43\x81\
+\x24\xa1\x87\xdf\xa2\x0d\xaa\x42\x32\x02\x3e\x97\xec\xc3\x9e\xa2\
+\xf5\x9b\x87\x66\xa6\x2e\xd8\x05\xe1\xf1\x17\xa9\x9e\xe1\x72\x02\
+\x3e\x15\x24\xa2\x02\x3f\x55\x88\xe2\xee\x39\x6a\x8c\x1c\x31\xf4\
+\xca\xf4\xf5\x7f\x01\x67\xfb\xa0\x70\x62\x65\xd7\xe7\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xdc\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xa3\x49\x44\x41\x54\x78\xda\x8d\x96\x79\x6c\x54\x55\
+\x14\xc6\xbf\x3b\xaf\x33\xa5\x44\x83\x89\x10\x31\xd8\xa6\xa2\x15\
+\x83\x51\xf4\x8f\xaa\x51\x20\x26\x14\x90\x25\x8a\xc4\x04\x5c\x58\
+\x45\x0c\x51\x01\x31\x60\x0b\x1a\x10\x94\x88\x12\x6a\x04\x8b\xc4\
+\x22\x91\x42\x58\xa3\x54\x0b\x24\xa0\x15\x5b\x4b\x97\xe9\xde\xd2\
+\x62\x81\x6e\x43\x67\xa6\x9d\xe9\x32\x9d\x99\x37\x33\x6f\xbb\x9e\
+\xb7\x74\x99\xbf\x6a\xd3\xd7\xb7\xcc\xf4\xfb\x9d\xf3\x9d\x73\xee\
+\x7d\x6c\xf6\xd7\x15\x7c\x7a\xea\x04\x80\x73\x08\x76\x01\x0d\x57\
+\x6b\x30\x23\xe3\x19\xc8\x92\x02\x7a\x68\xfc\x32\x8c\xfc\x68\xa3\
+\x6e\x86\x2e\x19\x67\xe8\x0d\x46\x51\x7f\xd3\x3f\xe7\x66\xf6\xdc\
+\xc2\x51\x5f\x07\x7b\xef\x74\x33\x9f\x38\xc1\x81\xb2\xe6\x3e\x38\
+\x12\x05\x34\x5e\xad\xc7\x57\x39\x6f\x41\x0c\x4b\x3a\xd3\x38\x34\
+\xe3\xcc\xa1\xd2\xc1\xad\x6b\xfd\x99\x6a\x9d\x39\x01\x64\xae\xe2\
+\xec\xc9\xea\xba\xfa\xfd\x73\x9e\x8e\x03\xac\x3f\xd1\xc4\x6f\x7b\
+\x82\x70\x7b\x43\xb0\x27\xda\xd1\x5c\x50\x8c\x7d\x17\xb6\x42\x1c\
+\x8c\x8e\x08\x53\x1a\x8a\x6a\x66\xa3\x03\x14\x5d\x5c\xe3\x16\x88\
+\x1b\xd7\x76\x87\x80\xfc\xdc\xeb\xce\xb6\xdc\xc5\xcf\xc6\x01\xd6\
+\xe5\x35\xf2\xf6\x9e\x10\xdc\x77\x83\x48\x70\x10\xe0\x52\x09\xf6\
+\xe5\x6f\x45\x30\x10\x31\x00\x1a\xd7\x48\x60\x24\x93\x21\x41\x33\
+\x23\xba\xa7\x3f\x1a\xdd\x0b\x8e\x04\x9c\x3a\x54\xee\xf4\x9f\x5a\
+\x10\x0f\x78\xe7\xe7\x06\xde\xe6\x21\x80\xc7\x04\xb4\x5c\x2e\xc1\
+\x1e\xca\x20\x64\x00\x4c\x4b\x8c\xe0\x35\x6e\x59\x42\xcf\x34\xd3\
+\x1e\x55\xb5\x3e\xd7\x01\xe3\xec\x38\xf1\x5d\x79\x49\xf0\xcc\x82\
+\x99\x71\x80\xb5\xc7\xea\x4c\x80\x7b\xd0\x04\x5c\xb9\x8e\x9d\xe7\
+\xc9\x22\x2a\xda\xb0\xb8\x15\xb5\x66\x79\xae\x47\x6d\x66\x61\x81\
+\x48\x48\xb1\x39\x50\xbe\x73\x7b\xeb\xcd\x3d\xbe\xa9\x72\x83\x17\
+\x4a\x6d\xcf\xf7\xe3\x73\x5b\x3e\x60\x6b\x8e\xd6\x12\x20\x68\x00\
+\x04\x02\xdc\xbe\x5a\x8a\xcf\xce\x6d\x43\x38\x18\xb5\x04\x4d\x0b\
+\x86\x41\x86\x25\x18\x81\x31\x86\x80\xa8\xc1\x59\xd5\x85\xfa\x8d\
+\xa9\xe8\xc9\x9e\x87\x54\x6f\x1f\x62\x35\x14\xe0\xa0\xf2\x13\x5b\
+\x95\x5b\xc3\xdb\xba\x06\xe1\x71\x07\xa8\x4d\x13\xd0\x5a\xe8\x44\
+\x16\x01\x42\x83\x91\xb8\x22\x1a\x16\x69\xa3\x32\x82\xfe\x8c\x41\
+\x94\x05\x94\x56\x74\xe0\xf4\x4b\x39\x78\x32\x3d\x17\xde\x81\x5e\
+\x88\x0b\xa7\x21\x6d\x80\x6a\x47\x01\xb3\x95\x47\xaa\x79\x2b\x89\
+\x7b\xbb\x02\x48\x20\xc0\x9d\x6b\x4e\x6c\x3d\xb3\x0d\x91\x60\x24\
+\xae\x88\x43\x6d\x69\x76\x91\x46\xf7\x36\x44\x15\x01\x65\x24\xde\
+\xb1\xfd\x0b\xfa\xe2\x15\x14\x9e\x9d\x82\x69\x0b\xff\x45\x30\xd6\
+\x0b\x79\xd6\x63\x78\xd4\xc6\x64\xb6\xe2\x87\x4a\xde\xaa\x67\xe0\
+\x1a\x30\x3a\xa1\xbd\xa8\x02\x1f\x9f\xce\x24\x8b\x22\x71\x45\xa4\
+\xe0\xcd\xb3\x7e\x90\x2d\x61\x8a\xbc\xd2\xd9\x49\xe2\x7b\x20\xc5\
+\xfe\x06\x73\xc9\xb0\x47\x64\xfc\x5a\x30\x03\x13\x17\x5d\xc0\xf8\
+\xfb\x19\x92\xd2\x53\x26\xb3\x37\x73\x9c\xbc\xf5\x6e\x00\x9e\xae\
+\x01\x2a\xb2\x80\x8e\xe2\x6a\x6c\x3e\x49\x35\x30\x2c\xb2\x8a\xa8\
+\x5b\xa5\x5a\x75\xd0\xc5\x25\x01\x55\x55\xba\xf8\x6e\x12\x2f\x02\
+\xeb\x54\x60\x0b\x33\x74\xdf\x48\x86\xe6\x0f\xe0\xe2\x0d\x86\x45\
+\x87\x3b\x53\x92\x93\x98\x8b\x2d\x3f\x54\xc1\xdb\x5c\x04\x70\xf7\
+\xc3\x46\x19\x74\x15\x3b\xf1\x7e\x5e\x16\xc4\x50\x64\x64\x5a\x49\
+\x59\xd1\x69\x24\x1e\x8a\x09\xa8\xa9\x71\x91\xf8\xe7\x96\xb8\x0a\
+\x9b\xc8\xe0\xa9\x7b\x08\x52\x9f\x08\xc8\x31\xd8\xe4\xde\x94\x87\
+\x77\x49\x2e\xa3\x4d\x97\x1d\x2c\xe7\x77\x5c\xfd\xf0\xde\xed\x87\
+\x90\x40\x80\xd2\x6a\x6c\xc8\x23\x8b\x74\x80\x21\x4c\xf6\x42\xaf\
+\x01\x45\x1e\xb3\xa1\xad\x27\x80\x86\xd5\x9b\x48\xbc\xd4\x10\x87\
+\x68\x43\x77\xfd\x14\xa8\x7d\x61\x38\x78\x84\x47\x55\x21\x79\x6a\
+\x96\xa7\x6b\x78\x0e\x5e\xff\xb6\x94\x32\x18\xa0\x1a\xf4\x19\x5d\
+\xe4\xad\xa8\xc6\xda\xe3\x99\x10\x03\x66\x9b\x9a\x85\xb5\x91\x2d\
+\x36\xb4\xfb\x74\xf1\x8d\xa6\x78\x87\x06\x5b\xc4\x06\x8f\x2e\xee\
+\x0f\x41\x90\x42\x78\xfc\xd4\xdc\xd2\x70\xd3\x99\x17\xe2\x06\x6d\
+\x69\xf6\x75\xde\xda\x49\x19\xb8\xfc\x04\xb0\xa3\xdb\x59\x8b\x55\
+\xc7\x32\x11\x09\x45\xad\xf6\xa4\x20\x55\x06\x7d\x39\x69\x58\xfd\
+\x21\xa4\x68\x19\x45\xae\x8b\x83\x6c\x49\x26\xf1\x20\x98\xd8\x8f\
+\x59\xb7\xbe\x41\x20\x72\x9f\x33\x70\xe1\x8d\xf8\xa5\x62\xc9\x7e\
+\x1d\xe0\x47\x37\x65\x60\xa3\x0c\x7a\xaa\x6a\xf1\xf6\xd1\x2c\x6a\
+\xd3\xa8\x19\xbd\x20\xa0\xa5\x2b\x88\x86\x35\x6b\x20\x45\xea\x49\
+\x1c\x23\xe2\xbe\x41\x24\x32\x11\xcf\xd5\x7d\x89\x49\x4b\x96\xa2\
+\x33\xef\x37\xa7\xaf\xe0\xdd\x78\xc0\x2b\xfb\x4b\x78\x5b\x87\x7f\
+\x38\x03\x7f\x55\x1d\x96\xff\x98\x65\xd6\x80\x7c\x0f\x89\x2a\xd2\
+\x3c\x1d\x38\xbc\xa9\x09\xca\xad\x1d\x40\x40\x82\xb7\xd1\x14\x77\
+\xb0\x30\x9e\xaf\xdb\x8b\xfb\xe6\x2f\xa2\xfa\xcb\x70\x9f\xfb\x93\
+\x00\xeb\xc7\x02\xd4\x62\xe9\x11\xca\x40\x6f\xd3\x04\x6a\xdb\x3f\
+\x2a\x51\xb5\xfb\x09\xd8\x79\x14\xf0\xed\x84\xb7\xac\x06\xb2\x3b\
+\x86\x44\x41\x44\x7a\xcd\x5e\xdc\x33\x77\x01\x18\x75\x0e\x6c\x02\
+\x7a\xf2\x0b\xff\x07\xa0\xb2\x16\x8b\x73\x3e\x81\x14\x8e\x41\x1d\
+\x97\x04\xff\x81\xdd\xa8\x3c\xf7\x2a\x20\x0d\x00\x31\xea\xbc\xf6\
+\x7c\x94\x5d\x6a\xc6\x32\xd7\x2e\x12\x7f\x19\x2c\x26\x91\x95\x2a\
+\x34\xc1\x8e\x81\x82\xbf\x9c\x3d\xbf\x8f\x01\xe8\xad\xaa\xc6\xfc\
+\x83\x99\xe4\x77\x0c\x4d\xe5\xdd\x58\xf1\xcb\x8b\x98\xc4\x15\x7c\
+\x74\x69\x33\x8a\x8a\x42\xd8\xd1\x98\x8e\x4e\x9f\x8a\x7b\x33\xe6\
+\x41\x93\x64\x6a\x04\xcd\x5c\xf8\x28\x83\xd0\xe5\x62\x02\x8c\x55\
+\x83\xca\x6a\x64\x64\x6f\xa3\x79\x51\xd1\x7e\xf4\x38\x56\xde\xfe\
+\x14\xc5\x0f\xcc\x43\x4b\xea\x12\xa4\x4c\x12\xd0\xff\x54\x06\xb8\
+\x4a\xc2\x8a\x6a\x0c\xa2\x62\x2c\x1f\x34\x29\x42\x02\xa2\x57\xfe\
+\x19\x1b\xd0\x4b\x80\xd9\x07\xf4\x0c\xa2\xb4\xe9\x44\xe1\xb9\xe1\
+\xc3\x83\xb3\xd3\xa0\x45\x44\xa8\x31\x65\x38\x62\x7d\x0b\xd5\x86\
+\x97\x10\x3a\xd3\xff\x2a\x17\xc9\xa2\xcb\x1b\xe2\x01\xaf\x65\x97\
+\xf2\xd6\x36\x1f\xdc\x9d\x3e\x02\x38\xd0\x57\x59\x86\xe9\x5b\x36\
+\x42\x26\x8b\xf4\x8d\x84\x33\x5a\x76\x25\x6b\xb9\xb0\x96\x6d\x73\
+\x2f\x20\x10\xcd\x87\xa6\xcf\x39\xcd\x8a\xe4\xea\x86\xe0\xbe\x53\
+\xd7\x7f\x6d\x4b\xfc\xa6\x9f\xb6\xee\x3c\x97\x65\x85\x36\x79\x91\
+\xe6\x80\x00\xc5\xf9\x48\x7a\x64\x26\xd9\x60\xbe\xb6\xf0\xa1\xf7\
+\x93\xb8\xd7\x17\x3e\xea\xc4\xac\x0f\x54\x8c\x9f\x32\x79\x8e\xf7\
+\xfc\xaa\xb8\xd7\x96\xff\x00\xa5\x14\x40\x78\x80\x20\x64\x41\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xed\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xb4\x49\x44\x41\x54\x78\xda\xad\x95\x7f\x4c\x94\x75\
+\x1c\xc7\xdf\xcf\xf3\xdc\x73\x07\x07\x1e\x14\x84\xd6\x38\x31\x59\
+\x3a\x32\xe5\x08\x9c\xa4\xb9\x39\x49\xd0\x45\x6a\x25\x0b\xb0\x04\
+\x97\xac\xa4\x96\xd2\xe6\xa8\x19\xd2\x1c\xd6\x74\xce\xa9\xd3\x52\
+\xac\x95\x6e\xc5\x59\x96\xfa\x87\x9a\x3a\x6b\x65\xb4\x51\x98\x18\
+\xad\xd3\x01\x43\xef\x04\x0e\x41\xb9\xe7\xb9\x9f\xcf\xf3\xdc\xf3\
+\x3c\x7d\x9e\x73\x34\xd7\x76\xa8\xc3\xf7\xf6\xec\xb9\xe7\xbb\xdd\
+\xf7\xf5\x79\xbf\x3f\xdf\xcf\xf3\x30\xf8\x9f\x76\x6c\x77\xce\x34\
+\x01\x0d\x26\x9e\x29\x63\x19\x0e\x32\x67\x45\xb2\x49\x02\xcb\x71\
+\x6e\x86\x63\xf7\x56\xad\x2e\xdd\x86\xfb\x10\x73\xe7\x43\x53\xc3\
+\x81\x0e\x58\x53\x72\xf9\x49\x53\xc0\xa4\xa5\x23\xc1\xc2\x43\x8f\
+\xea\x08\x49\x0a\x22\x42\x00\x8c\x30\x8c\xac\x24\x91\xfe\xc5\x55\
+\xae\x5e\xb3\xb4\xe5\xbe\x00\x1b\xeb\xf6\x78\x6c\x39\x33\x32\xed\
+\x79\x4f\xc1\x66\x65\xa0\x46\x35\x28\xb2\x06\x55\xa3\xbb\x0a\x28\
+\x8a\x86\x40\x50\xc3\xe0\xc0\x08\x52\xfd\xbd\x98\x60\x46\xc5\x1b\
+\xb5\xcb\x9d\xf7\x04\xa8\xab\xdd\xde\xf1\x68\x5e\x7e\xae\xa3\xa8\
+\x00\x26\x2d\x8a\x61\x9f\x04\x1f\x5d\x8f\x3c\x6c\x81\x2d\xd9\x0c\
+\x55\xd7\xa1\xe9\x0c\x42\x61\x19\x3e\x31\x8a\xae\xab\x41\x64\xdc\
+\xb8\x08\xde\xc4\xe5\xbf\x5d\x57\xf6\xe7\x98\x80\x37\x6b\xb6\x96\
+\x25\x3f\x94\xf2\xcd\xb2\x75\xab\x40\x65\x43\x14\x65\xaa\x5a\xa5\
+\xcc\x59\x4c\x4a\xb7\x62\x78\x24\x82\xc9\x93\x92\x40\x49\x21\x18\
+\x8c\x62\xe8\x56\x08\x43\xc3\x12\xfe\xee\xec\xc7\x64\xb9\x27\x5c\
+\xb7\xa1\xd2\x3a\x26\xa0\xaa\xbc\xd1\x59\x54\xfd\xf2\x2b\x79\x73\
+\xa7\x23\xe0\x97\x63\x9e\x34\xda\x2d\xd1\x6c\x82\x3f\x22\x23\x81\
+\x65\x90\x3d\x31\x09\x92\xaa\x41\x94\x75\x0c\x91\x33\x8f\xd7\x0f\
+\xef\xb0\x02\x5f\x7b\x2b\xac\xbc\x32\xf5\xfd\x8d\xd5\xbd\x71\x01\
+\x2b\x5e\xd8\xa0\x7f\xf8\x55\x13\x18\xca\x99\x92\x00\x43\x00\x85\
+\x72\x4f\x32\xb3\x10\xfd\x0a\x24\xea\xc5\x33\xf6\x09\xf0\xab\xb4\
+\x79\x44\xc1\x4d\x5a\xbb\xda\x27\x42\xf0\xeb\xb8\xdc\x7a\x09\xb6\
+\x48\x5f\x53\x63\x53\x4d\x43\x5c\x40\x69\xf1\x3a\x7d\xdf\xe9\x9d\
+\x08\x51\xf5\x2c\x2d\x10\x83\xf2\x06\x78\xd6\xf8\xcd\x60\x40\x90\
+\x60\xe3\x18\x4c\x4c\xb1\x20\x48\xeb\x3d\xb4\xb9\x3f\x40\xd5\x07\
+\x54\x74\xb7\xfd\x05\x0c\x76\xb5\x7c\xb4\xfd\x9d\xca\xb8\x80\x45\
+\x0b\x6a\xf5\x96\x9f\xf6\x22\x1c\x52\x08\xc0\xc4\x10\x54\x2c\x24\
+\x72\x91\x91\xc0\x63\x30\xa8\x60\x80\xfa\x72\x93\x40\x7e\x21\x82\
+\x4c\xea\x87\x48\x00\x21\xa8\xa2\xb7\xc3\x05\xff\xe5\xce\x96\x1d\
+\x7b\xd6\xc7\x07\xcc\x9f\x5b\xa3\x9f\x6a\x6d\x46\x58\x56\x63\x0e\
+\x18\xda\x5c\xa1\xac\x64\xb2\x11\xa6\x5e\x24\xf1\x34\x6c\x94\xbf\
+\x14\x8d\x22\x44\x31\x5e\x73\x8b\x90\x14\xe3\x54\xb1\x68\x3b\xdb\
+\x06\xd5\xe3\xda\xbc\xa7\xb9\xbe\x31\x2e\xe0\xd9\xc2\x9a\x8e\xad\
+\x9f\xd6\xe7\xe6\x39\xb2\x11\x2b\xdd\xa8\x9e\x00\x46\x53\x25\x7a\
+\x0e\xd3\x3d\x4c\x9b\xfb\x44\x15\xbe\x91\x30\x65\x1f\x45\x6a\xaa\
+\x19\x42\x48\xc7\x2f\x9f\xb7\x80\x8d\x06\x4b\x0f\x7c\xb9\xf1\x44\
+\x7c\x07\xf3\xd6\xbc\x94\x33\x23\xe7\xbb\xfd\xfb\xdf\x8d\xe5\x4f\
+\x45\x52\xb5\x34\xbd\xaa\x8a\x88\x7a\xdb\x85\x01\x13\xa8\xb9\x37\
+\x85\x30\x38\x3a\x55\x2c\xcb\xe1\xc2\xef\xd7\xe0\x3a\xfe\x6d\xb0\
+\xe5\xe8\xc7\xc9\x77\x1d\x34\xc7\xac\x57\x3d\x8d\x5b\xde\xca\x5c\
+\x5e\x5a\x48\xf1\x20\x76\x72\x42\xff\x39\xb8\x0d\x18\x11\xe9\x75\
+\x41\xc7\xd6\x42\xc7\xd7\x3d\x28\xe1\xd8\xb6\xdd\xd0\x19\xdb\xf3\
+\x47\xbf\xaf\x3f\x79\x57\xc0\x9c\x39\xaf\x5b\x45\xc1\x17\xdc\xd5\
+\xdc\x88\x45\xf3\x67\x82\xd2\x40\x48\x36\x1c\xd0\x45\x0e\x22\x34\
+\x78\xb2\x31\x22\x54\xb9\xa7\x2f\x80\xcf\x36\xed\xc0\xd4\xac\x4c\
+\x2c\x48\xff\x71\xa8\x80\x3b\xb2\xef\xf1\x4d\xd8\x34\x26\xc0\x50\
+\x7e\xfe\x6b\x59\xc1\x60\xf8\xfc\xd3\xb3\x1d\xf6\xf5\x1f\x54\xe1\
+\x89\x69\x99\x08\x1b\x6e\x54\xc3\x11\x62\x13\x7c\xec\xe0\x69\xfc\
+\x76\xfc\x14\x8a\x4a\x16\x60\xf1\xf4\x6e\x4c\xec\x6e\x84\x25\x7b\
+\x36\x6e\x75\xfe\x71\xd8\xb1\x15\xe5\x63\x02\x46\x35\x2b\xb7\x72\
+\xa5\x12\x91\xb6\x24\x26\x5a\xb3\xa6\x39\x9e\xa4\xa1\x00\xbc\xfd\
+\x5e\x08\x83\x37\xc0\xf3\xfc\xc1\x92\xc5\x0b\x95\x82\xb4\x8e\x35\
+\x93\xbd\x3b\x91\xb3\xf6\x10\x78\x4b\x0a\xae\xfd\xb0\x19\xde\x4b\
+\x17\x9d\x73\x77\x6b\x15\x77\x05\xdc\x29\x87\xa3\xb2\x90\x65\x18\
+\x8d\xbe\x05\x23\xed\xed\x87\xba\x46\xd7\x7f\xad\x86\x9e\x57\xbf\
+\x1b\x16\xdb\x14\xe8\x8a\x0c\x3d\x34\x80\xde\x33\x9f\xc0\xf3\x4f\
+\xb7\xf3\xb9\x66\xa5\xe2\x9e\x01\xf1\x74\xb2\x8a\xb3\x33\x0c\xeb\
+\x9e\xb7\x76\x03\x12\x52\xb3\xa0\xab\x32\x34\xa1\x1b\x57\xce\x1d\
+\xc7\xf5\x9e\x01\x67\xe9\x17\x52\xc5\xb8\x00\x86\x8e\x54\xf2\x04\
+\x81\xbb\x68\x55\x05\x2c\x29\x19\xd0\xb5\x10\xe0\xef\x81\xeb\x7c\
+\x07\xba\xba\x04\x67\xf9\xe1\x48\xc5\xb8\x00\x86\x0e\xbd\x68\xb6\
+\x83\x63\xdc\x4b\x96\xe5\xc3\x9a\x36\x01\xe0\xc2\xd0\x02\x1e\x0c\
+\xb8\xfa\xf1\xf3\x05\xee\x6c\xcd\xd1\x50\xf1\xb8\x00\x86\xf6\x2f\
+\x49\x88\x41\x96\x16\xa7\x23\x29\x83\x5e\x8f\xa6\x41\x9a\x56\x05\
+\x5e\x97\x09\x67\xda\xb8\xcb\xe3\x06\x8c\x6a\x57\xb1\xc5\x5d\x52\
+\xa0\xd9\x1f\xcb\x56\xc0\x25\x02\x57\x3a\x81\x13\xed\xa9\xe2\x03\
+\x03\x18\x6a\x28\x4c\x70\x97\x15\x4a\x76\xcf\x08\x07\x97\x68\xc7\
+\xd7\xd7\x17\xde\x78\xa0\x00\x43\xef\x15\x98\xaf\xd0\xe8\x58\xce\
+\x31\x2b\xdd\xb2\xac\xae\xf8\x17\x8f\x74\x52\x3f\xa9\x7e\x8b\x04\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x6e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x35\x49\x44\x41\x54\x78\xda\xbd\x55\x7b\x4c\x53\x57\
+\x1c\xfe\xce\xbd\xb7\xb7\x2d\x94\x02\x51\xe7\x70\xe0\x74\x46\x03\
+\xd3\x39\x87\x33\xc3\x89\xa0\xa2\xeb\x70\xbe\xd8\xa2\x6c\xf1\xc5\
+\x5e\x99\xd9\x16\x16\x1f\xfb\x63\xe2\x74\x21\x71\x0f\x89\xba\x3f\
+\x10\x8d\x2e\xc3\xb8\xa0\xce\x4c\x65\xce\xb9\x69\x85\x88\x0a\x3a\
+\xb4\xf8\xc0\x51\x25\x4a\xac\x68\x29\x05\xa1\xb4\xa5\xaf\xfb\x38\
+\x3b\x2d\x19\x1b\x43\xcd\xde\xbf\xf4\xf6\x24\xe7\xdc\xf3\x7d\xbf\
+\xf3\x9d\xef\xf7\xbb\x04\xff\x71\x90\xff\x95\x20\x3b\x3b\x27\x91\
+\xcd\x34\x53\x50\x44\x7e\x54\x75\x29\x94\x1a\x54\x45\xc9\xab\x3c\
+\x7e\xa4\xec\x1f\x13\x64\x99\x66\xcb\x54\x51\x78\x06\x88\x6e\xbf\
+\x04\x59\x55\x21\x6a\x38\xf0\x3c\x50\x73\xb2\xf2\x6f\x9d\xb6\xcf\
+\xa6\xf4\x8c\x2c\x86\xaf\xa2\xcb\x13\xc2\xe6\x82\x74\x3c\x9a\x14\
+\x8f\xd5\x9f\x9e\x40\xa3\xcd\x05\x9d\x96\x4f\x3b\x5f\x5b\xfd\x53\
+\x9f\x13\xcf\xcc\xd9\xca\x86\x65\x3d\x27\xa6\x1e\x45\xa5\x8d\xaa\
+\xaa\x34\x57\x98\xbf\xcf\xb9\x27\xc1\xa8\xd1\x13\xa8\xcf\x27\x23\
+\x63\xfc\x20\x94\xed\x58\xcc\x56\x05\x40\x47\xf0\x4c\xe6\xe7\xf0\
+\xf8\xa5\x34\xeb\x65\x4b\x2f\xc1\xb4\xe9\xb3\x27\x10\x1e\xb5\x2c\
+\x23\xc8\x92\x0a\x7f\x48\x8a\x80\x69\x34\x8c\x4b\xa5\x1f\xd7\x9c\
+\xae\x2c\xe8\x47\xf0\xe3\xae\x35\xd4\x34\x7f\x04\xe0\x57\xd8\xa3\
+\x82\x86\xda\x41\xf4\x3a\xec\x2b\xb3\x20\x77\x65\x59\x9f\x77\xc7\
+\x65\x9a\xd6\x45\x43\xf9\x48\x0e\xca\x88\x8b\xd7\x62\xc5\xab\x4f\
+\xa1\xe1\x7a\x1b\xb6\xec\xaa\x47\xac\x51\x73\xc9\x52\x5b\x3d\xae\
+\x1f\x01\x6d\x28\xa1\xe0\x6d\xa0\xbe\x66\x20\xd8\xce\x66\x38\x10\
+\x51\x83\xae\xa6\x2e\xcb\xb9\xd2\x5b\x25\x8a\x86\x37\xca\x2a\x3d\
+\xce\x81\x4e\xfe\xc1\x6b\xcc\x3d\xe1\x8e\xc9\x74\xb6\xba\x71\x6c\
+\xfb\x2c\x8c\xcd\x60\x78\x3c\x87\xaa\x6f\x6b\x90\x57\x50\x79\xe1\
+\xe6\xf5\x8b\xa9\xfd\x09\xcc\x2b\xdd\x10\xea\x62\x54\x39\xc0\x56\
+\x78\x10\x42\xd8\xc0\xe3\xf0\x67\xb7\xa0\x08\x4c\x69\x26\xb5\xc2\
+\x1e\xa8\x80\xc0\xfe\x3a\x15\x82\xbc\xf2\x42\xa0\x5b\x66\x09\xc9\
+\x3d\x68\x03\x0c\x48\x9e\xb0\x79\xf7\xb5\xfa\x73\x0b\xfb\x11\x1c\
+\x5a\xf3\xf0\x89\xd9\xb9\xcb\x33\x61\x3b\x00\x48\x21\x86\xc2\xc3\
+\x71\xc1\x83\xca\x53\x41\x70\x54\x45\xc0\xcf\x88\x39\x46\xaa\x13\
+\x19\x3c\x41\xc0\x1b\xc4\xdc\xfc\x34\x0c\x19\x33\x08\xd4\x6f\x8f\
+\xc0\x91\x28\x2d\xae\xee\xbb\x51\x98\x52\x78\x69\x5d\x2f\xc1\xa4\
+\x1d\x63\x86\xa4\x24\x25\xdf\x99\x9f\x3a\x13\x51\xdf\x6d\xc0\xd0\
+\xe0\x10\x18\x6e\xb4\xc3\x29\x74\xe0\x64\xab\x00\xb1\x49\xc6\xc0\
+\x44\x1d\x66\xed\xdc\x08\xe7\xe5\x6a\x7c\xf5\xfa\x17\xd0\x19\xf5\
+\x08\x48\x0a\x9e\xcf\x8a\xc3\xe8\xec\x44\x76\x5f\xec\x92\x09\x07\
+\xc4\x08\xd8\x92\x6d\x36\xbd\xdb\x86\x63\xbd\x04\x8b\xbe\xc9\xa1\
+\x2b\x32\xe6\xa1\xda\xb5\x03\x9d\xaa\x2f\xa2\xa5\xca\x32\xe5\xb4\
+\x1c\x62\x0f\xba\x41\xb7\xb6\xe0\xbd\x9a\x6d\x80\xcc\xf4\xd1\xe9\
+\xd1\xf0\x75\x29\x4e\xef\x39\x8f\x96\x76\x09\x2f\x4e\x8d\xc1\x13\
+\xa6\x01\xa0\xb2\xcc\xe4\x24\x70\x54\xdc\xc6\xaa\xf8\xed\xb1\x65\
+\x05\x73\xdd\x11\x82\xd4\xf5\x4f\xae\xda\xb0\x64\x45\x51\x9d\xb7\
+\x14\x5d\x92\x0f\x02\xd3\xfe\xd7\x50\xb5\x04\xd1\xe5\x77\x91\x70\
+\x3c\x88\x25\x07\x8a\x41\x3b\x6c\x2c\x4b\xe6\x30\xce\x0f\xc4\x0b\
+\x28\x9a\xf6\x09\xd2\x1f\x37\x62\xe2\xd8\x6e\xc8\x5e\x3f\x1c\xd6\
+\x10\x8a\x17\x37\xa1\x9e\x8b\x86\xe4\xf1\xbe\x62\x7e\xe9\x91\xbd\
+\x64\x41\xe9\x82\xee\x5c\x53\x72\x54\x95\xf3\x28\x03\x17\xfb\x5c\
+\x0a\xd5\xf3\x88\x3e\xd4\x0a\xa5\xe4\x16\xd6\xd7\x6e\x02\xbd\x69\
+\x66\xa7\x08\x27\xc6\x0c\xc0\x24\x2a\x5e\x56\x05\x7b\x66\x3e\x46\
+\x2e\x5d\x0b\xc7\xed\x16\xdc\x1d\x9c\x00\x6d\x28\xc0\xee\x4b\xc6\
+\xd9\x86\x0e\x84\x7c\x92\x86\xac\x3c\x9c\x4f\xe3\x53\x5a\x60\xf7\
+\x3a\x40\x28\xf7\x1b\x38\x93\x88\x97\x24\x0c\x7c\xad\x11\x6e\xd6\
+\x36\xd6\x6e\x9c\x01\xa3\xb6\x99\x5d\xae\x00\xc2\x31\xfb\x32\xf9\
+\xf2\x16\x59\x10\xad\x7a\xa0\xac\x3e\x02\x6e\xfc\x14\x90\x50\x90\
+\x25\xa8\x46\xdc\xe7\xf6\x49\xb0\xd6\xb7\x6d\x27\x2f\x6c\x9e\x4b\
+\xe9\xf0\x3b\x78\x28\xc9\x00\x83\x41\xe8\x69\x72\x2a\x85\x2a\x72\
+\xd0\x97\x35\x83\xee\x76\xc0\xab\x48\x98\x93\x3e\x0a\xb3\xde\x18\
+\x09\xb4\x59\x99\x76\x04\xa7\x77\xb7\x61\x63\x9d\x17\x51\xa4\x1b\
+\xea\xd2\x6d\x50\xa7\xe4\x82\x04\x83\xbd\xfd\x41\x10\x79\x58\xcf\
+\xda\xbc\x64\xc4\xb2\x51\x7a\xaa\x92\x37\x99\x0b\xe7\x30\xe0\x38\
+\xd6\xdf\x60\x7c\x4c\x8b\xc0\x60\x41\xf6\x9c\xf1\xf2\xe5\x47\x5d\
+\x4f\x8b\x0b\xb2\x90\xfa\xac\x0f\x0e\xa7\x1b\x5d\x3f\xb7\xc3\x6d\
+\xb7\x23\x39\x33\x01\x42\x39\x07\x5f\xcd\x15\x2c\xdd\x7b\x17\x7e\
+\x51\x86\x20\x4b\xbd\x0a\x70\xac\x7e\x5a\x1b\xec\x0f\xfe\x1e\x04\
+\x10\x7b\x52\xbb\x67\xd3\x64\x7a\xe3\x0c\x14\x6f\x23\x84\x77\xc2\
+\x6d\x84\x15\x94\x5e\x03\x7a\xaa\x0d\x72\x85\x07\x9a\x0e\x0f\x1a\
+\xab\x5c\xc8\xfa\xf2\x22\xe2\x3c\x9d\x88\x48\x10\x2e\x50\x56\x95\
+\x21\xeb\x9d\xfb\x13\xd8\x34\x86\xe1\x86\xa9\x13\x9b\x62\xa6\x0f\
+\x83\x7a\xea\x0c\x93\x85\x07\xf7\x5c\x22\xb8\xfc\x97\x41\x2b\x2a\
+\xa0\x14\xd5\x45\x3c\xcf\x31\x29\x05\xf3\x35\xa4\x99\x4a\x70\x73\
+\x68\x0a\x44\xbf\x97\x25\x11\x00\xe9\xf2\x5e\xe0\xb4\xe2\xfa\xfb\
+\x12\x5c\xe1\xb4\xcb\x87\xad\x7e\x7b\x93\x60\x61\xce\x09\x84\x7a\
+\x26\x43\x6a\x4f\x41\x09\xe1\x2e\xcb\x47\xb4\x0e\x17\x17\xed\x0c\
+\xe0\xb2\xd5\x5d\x32\x79\xde\xce\xad\xb1\x01\x8f\xcd\x79\x70\xa1\
+\xe7\x9e\xed\xfa\xf7\x71\x96\x88\x85\xa3\xdf\x7f\xeb\x43\xcd\x91\
+\xfd\xa0\xa2\xf8\x20\x25\x23\x1f\x25\x7b\x6d\x53\x5d\x12\xc5\xf8\
+\x3f\xae\xdd\x97\xc0\xcc\x69\x57\xa5\x4e\x9d\x54\x14\xd7\x68\x65\
+\xea\x70\x61\x65\x23\xcd\xae\x77\x23\xe9\xd9\x1c\x36\xb6\x2b\x24\
+\xe3\x6a\xbb\xe7\xda\xa4\x90\x2f\xf9\x4f\x13\x84\x63\x2f\xc4\xfd\
+\x31\x02\x31\xe9\x39\x3e\x9a\x99\x0b\x09\xcc\x19\xe1\x31\xc0\x98\
+\x7c\xcc\x76\xe1\x9a\x77\x2a\xea\x39\x2d\x60\x11\x39\xfe\x83\x19\
+\xa1\x6e\xd7\x5f\x22\xf8\x37\xe2\x17\x2b\x56\x52\x0b\xe2\x9b\x7b\
+\x52\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xcb\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x92\x49\x44\x41\x54\x78\xda\xa5\x94\x7b\x6c\x53\x75\
+\x14\xc7\xbf\xf7\x77\xef\x6d\xbb\x95\x0d\x25\x82\x21\x1b\x09\x04\
+\x34\xb2\x6e\xeb\xb6\x28\xec\x61\x78\xd6\x92\x81\x32\x64\x6b\xeb\
+\x33\x6a\xd4\x98\x95\x87\xd1\x49\xd0\x11\x14\x22\x3a\xb2\x3f\x14\
+\x13\x16\x98\x4a\x48\x48\x58\xdc\xba\x00\x32\xf6\x30\x2c\xa9\x80\
+\xeb\x6b\x65\x8b\xc8\x43\x32\x21\x83\x51\xb6\x52\xf7\xe8\xba\x3e\
+\xd6\xc7\xbd\xfe\x7a\x19\x49\x0d\xf3\xb1\xed\xfc\x71\xef\xcd\xb9\
+\xf9\x9d\xcf\x39\xe7\xfb\x3b\x87\x41\x82\x69\xdb\xb2\xab\x56\xa5\
+\xab\x3f\x9e\xcd\xcf\x42\x73\xef\xc5\x23\x2d\xeb\x1c\xef\x60\x86\
+\xc6\x3c\xf8\x28\x6b\x2f\x30\x19\x96\xbc\x56\x96\x36\x5b\x81\xeb\
+\xbe\x63\xb8\xe5\x0b\xc1\xe9\x62\x1b\xcf\x68\x2d\xba\x19\x03\x9e\
+\x3b\xa3\xae\xf9\x24\x6f\xab\x31\x8c\x3e\xec\xb3\x9c\xc2\xb3\xb9\
+\x73\xb0\x90\x84\x70\xcf\xcf\xa0\xb3\x8f\xec\x6d\x2a\xee\xd8\x33\
+\x6d\xc0\x86\xa6\xa7\x97\xe6\xa7\x2f\xbf\x5a\xb6\x48\x8d\xf6\xc1\
+\x6f\xd0\x3f\xaa\x44\xc7\x55\x1e\x85\xf9\x0a\xa4\xb1\x21\x0c\xf9\
+\x22\xb0\xde\xe4\x74\xad\x25\x96\xc6\xe9\x01\x4e\xe7\xd7\x54\x15\
+\xed\x30\x5e\xf1\xd7\x62\x28\x3c\x0c\x19\xcf\xe2\xfa\x9f\x22\x2e\
+\x74\x13\xac\x5c\x9d\x8c\x74\x12\xc4\xd0\x98\x00\xfb\x4d\x62\xa0\
+\x90\x86\x29\x03\xde\x38\xbb\x79\xac\x72\xb9\x56\xd9\xea\xae\x01\
+\x21\xb3\xc0\xd0\xa6\xb1\x84\x41\x8f\x5b\xc0\x79\xa7\x08\x4d\x71\
+\x8a\x54\xc9\x55\x57\x18\xb7\x07\xd8\xd4\x96\xcd\x56\xdf\x94\x00\
+\xfb\x3a\x8d\xe2\xca\x85\xc9\x70\x7a\xcd\x60\x19\x19\x62\xe2\x7d\
+\xdd\xe5\x32\x06\x6d\x0e\x01\x7d\x77\x04\xac\xdb\x94\x0a\xaf\x3b\
+\x80\xde\x5b\x42\x61\xab\xde\x6a\x9d\x12\x60\xb7\xa3\x5c\x5c\xbd\
+\x90\x47\x97\xb7\x83\x02\xe4\x10\xa9\x53\xa0\xda\xc7\xdf\x49\x72\
+\x82\x36\x5b\x14\x9e\x7e\x11\x69\x4f\x70\x38\x51\xfc\x0b\x33\x95\
+\xe0\x12\x60\x57\x87\x51\x5c\xf3\x24\x87\xae\x11\x0b\xc8\x03\x00\
+\xad\x22\xde\x2a\x91\xe3\xd0\xdd\x13\x46\xbf\x4b\xf0\xfc\xfc\xa6\
+\x6d\xde\xb4\x44\xde\x68\x5a\x3f\xfa\xb9\x76\x7d\x4a\xb3\xfb\x28\
+\x38\x46\x11\x77\xd1\x0a\x00\x4e\xc6\xe2\xac\x7d\x1c\xe3\x01\x1c\
+\xa4\xc1\xb7\x4d\x27\xb8\x04\x28\x3c\xba\xec\x87\x43\x25\xbb\x0c\
+\xa7\x3d\x9f\x42\x46\x45\x16\xc1\x42\x20\x90\x6e\x8e\xc5\x11\x39\
+\x61\x79\xd7\x5e\x3a\xdd\xe0\x12\xe0\x99\xc3\xea\x8d\xe5\xab\x5e\
+\xfd\x91\x4f\xe9\xc2\x2d\x7f\x1f\x6d\x0d\x4b\x21\x0c\xc2\xb4\x57\
+\x6d\xed\x21\x9f\xc3\x68\x4f\x9d\x11\x20\xfe\xd8\x50\xb7\x41\xdc\
+\xbd\xbe\x04\xad\xf7\xbe\xa5\xf9\x2b\xa5\x1f\x2c\x47\x70\xe9\x8f\
+\x08\x6e\xdf\x88\x34\x58\xcb\xed\x86\x19\x01\x72\x0e\x64\xed\xa9\
+\x28\x36\x7e\xe6\x57\x9c\xc5\x40\xe8\x1e\xf5\x72\x92\xc8\x02\x9d\
+\x87\x73\xe7\x03\x08\x07\x18\x9d\x65\x8b\x6d\xd2\x49\xce\x39\x90\
+\xfd\x4a\xca\x2c\xe5\x9e\x60\x20\xd2\xe8\xdc\xee\xac\x9c\x14\x10\
+\xb7\x35\xdf\xad\x8d\xee\x2f\x7d\x9b\x3d\xe9\xf9\x1a\x3c\x93\x2c\
+\xb5\x89\x89\x53\x78\xe0\x9c\x39\x80\xf1\x31\xe8\x6d\xdb\xec\xa6\
+\xc4\xc3\x05\x87\x96\x99\xde\xd3\x1a\xca\x34\x0b\xe6\xe3\xfb\x6b\
+\xb5\x38\xd9\x1e\x68\xfc\xb5\xa2\x53\x37\x29\x20\xf7\xab\x1c\x55\
+\x51\x66\xd1\x65\x4d\x4e\x2a\x6c\xc3\xe7\x68\x70\xb9\xe4\x27\xb4\
+\x0a\x86\x63\xd0\x7a\x72\x14\x1c\x4b\x74\xf6\xed\x76\xa9\x12\x55\
+\x75\x46\xc3\x87\xcf\x97\xeb\xc6\xc9\x30\xcc\x9e\x53\x58\xb1\x48\
+\x01\x57\x7f\x04\x66\x1b\x31\xd9\xb7\xd9\xf5\x0f\x01\xe2\x96\x51\
+\xa5\xaa\xd9\xf1\xc2\x56\xa3\xf7\x11\x33\xee\xfa\xef\x4a\x93\x2d\
+\x50\xb1\x19\x7a\xab\x82\x61\x06\x76\xb3\x8f\xb6\x4b\xa8\x08\x45\
+\x43\x99\xfa\x15\x2f\xbe\xa5\x51\xa9\x50\xef\xa9\x45\xcf\x6f\x41\
+\x28\x92\x38\xac\x51\x73\x10\x02\x41\x1c\x6f\x81\xa9\xf3\xfd\xfb\
+\x90\x87\x26\x33\xbb\x3a\xcf\xb3\xb3\xa4\xfc\xb1\xdb\xf2\xd3\x18\
+\x0c\x79\xe9\xf0\xb1\xd2\xd5\x8d\x57\x22\x30\x31\xdc\xe9\xe5\x91\
+\x9f\x56\x80\xa7\xe6\xce\x47\xf3\x60\x1d\x4d\x80\x07\xcf\xb1\xb8\
+\x64\x1b\x85\x2c\x85\x85\x26\x8f\x07\xa1\xc3\x73\xbc\x49\x34\x39\
+\x3f\x70\xe8\x27\x1d\xfd\xec\xea\x5c\xf7\x5e\xdd\x47\xf3\xae\x91\
+\x7a\x0c\x06\x7d\x12\x44\x90\xd2\x61\x10\xa3\xb8\x98\x18\x45\x8c\
+\x96\x46\x18\x9e\x66\x48\xa4\x0b\x11\x4f\xe0\xe2\x79\x2f\x92\x52\
+\x39\x68\x0a\x64\x60\x43\x7e\xd4\x35\x09\x47\xfe\x71\xb7\x64\xed\
+\xcf\x75\xef\xd8\x64\x9c\xe7\x52\x36\x63\x20\xe0\x85\x28\x72\x7f\
+\x2b\x57\x9c\xd8\x57\x89\x6a\xc6\xb5\x72\xfc\x34\x82\xe4\x47\x39\
+\x14\xaf\x96\xe3\xda\xe5\x20\xfe\x75\x79\xa9\xab\xf2\xcc\x2f\xad\
+\x2d\x5d\x95\xf4\x78\x2f\x7a\x42\xd7\xc1\xd2\x76\xd0\x09\x99\x00\
+\x24\xc2\x26\x18\x54\x2b\xc2\x32\xb0\x36\x8f\x60\x76\x1a\x8f\xa8\
+\x3f\x26\xfc\xe7\x76\x5c\xba\x37\x6b\xcb\xe2\xf4\x25\x07\xf5\x9a\
+\x95\xb8\x22\xb6\x62\x2c\x1c\x01\x11\x29\x64\x62\xad\x27\x82\xe2\
+\x00\x9e\x27\x08\x45\xa3\xb8\x50\x37\x42\xf7\x19\x59\xfc\xbf\xd6\
+\x6f\xf6\x97\xb9\x32\x8e\xf0\xc7\x32\x17\x67\x18\x32\x54\x73\x71\
+\x07\x97\x21\x53\x8a\x10\x63\x09\xc1\x29\x73\x3c\x24\xe0\xc6\xef\
+\x01\xb8\xba\x83\xe0\x93\xd8\xcc\xae\x9d\x8e\x2b\x53\xda\xef\x59\
+\x5f\xe4\xb0\xa2\x80\xd7\x19\x91\x7d\x59\x10\xa0\x9d\xb3\x80\x87\
+\x40\xc5\x8e\x67\xee\x1f\x88\x21\x1a\x13\xbb\x38\x8e\xa9\xef\xae\
+\x74\x56\x3f\x38\xf3\x17\x1e\x1e\xcf\x3a\xcf\x0b\x01\xdb\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x59\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x20\x49\x44\x41\x54\x78\xda\x8d\x95\x8b\x4f\x53\x77\
+\x14\xc7\xbf\xb7\xaf\x0b\x02\x2d\x02\x5b\x5b\xba\xf2\x12\x24\xcb\
+\x62\x46\x8c\x26\xcc\x85\xc7\xe6\x1c\x48\x7d\x74\x35\x22\xe0\x70\
+\x0b\xc4\xa9\x51\x33\x89\xdb\x5c\xf6\x07\x2c\x73\x9b\xc1\x45\x8d\
+\x3a\x03\x71\x32\x85\xe1\xec\x3a\x5d\x3b\x9c\x6e\xeb\x64\x63\x24\
+\x33\x86\xc5\x2c\x0b\x82\x08\x14\xfa\x50\x1e\xb6\x50\xa1\x8f\x7b\
+\x7f\xfb\xb5\x10\x5d\x22\xe4\xd7\x93\xdc\xdc\x7b\xce\xef\x77\xcf\
+\xe7\xfe\xce\x39\xf7\x1c\x0e\x0b\x88\xdd\xde\x49\x78\x85\x02\xb1\
+\x4a\x30\x14\x44\x49\x49\x11\xb7\xd0\xda\x53\x46\x9b\xb5\x83\x28\
+\x13\x12\x31\x30\x34\x08\x41\xe0\x98\xce\xa5\x52\x82\x9c\xcc\x2c\
+\xf8\xfc\x7e\x54\x18\xca\x38\x26\xe0\xd4\xf1\x33\xc4\x2d\x5f\x8a\
+\x25\x2f\x16\x82\x24\x29\x01\x22\x2e\xee\x9d\x93\x80\x9b\xf2\xe1\
+\xd1\xdf\xdd\xd0\x84\x26\xb1\x7b\xdf\x4e\x36\xe0\xe4\xb1\xd3\xc4\
+\xa3\x48\x45\xdf\xf2\x12\x48\x42\x01\xe6\x09\x44\x39\x8f\xbc\x3b\
+\xbf\x41\x1d\x1c\xc7\x9e\xfd\xbb\xd8\x80\x13\x47\x4f\x90\x21\x92\
+\x8c\x25\xc5\x06\x80\xc6\x96\x29\x72\x05\x1e\xdd\xb0\x22\x93\x7b\
+\x88\xbd\x07\xf6\xb2\x01\x8d\x47\xbe\x20\xe3\x71\x1a\xe8\x5e\x35\
+\x40\x0c\xb2\x01\x12\x5a\x0c\xa3\xbf\x58\x91\x3a\xeb\x46\xc3\xc1\
+\x77\xd9\x80\x23\x87\x1b\xc9\xb4\x52\x87\xbc\x72\x23\x84\x20\x3b\
+\x44\x52\x05\x8f\xbe\x0e\x0b\x12\x7d\xa3\x38\x78\xa8\x81\x0d\x38\
+\xfc\xf1\x67\x24\x98\x96\x8d\x95\x9b\x8c\x08\xcf\x03\x16\xaa\x25\
+\x32\x7f\x97\x51\xc0\xad\xcb\x16\x28\xc6\xee\xe1\xd0\x47\xef\xb3\
+\x01\x9f\x7e\xf2\x39\xe1\xd2\xf3\xb1\x7a\xf3\x06\x4c\xfb\x43\x20\
+\xd4\xd3\x0c\x79\x1a\x10\x4f\xdf\xe4\xe8\xa5\x4a\x94\xa3\xdb\xf2\
+\x03\x88\xb3\x17\x1f\x7c\xf8\x1e\x1b\xb0\x67\xf7\x01\x22\x96\xd5\
+\x47\x9f\xd5\x7a\x2d\x44\x51\x5c\xf4\x04\x12\x89\x04\x1e\x87\x6b\
+\x2e\x17\x57\x9b\x70\xf2\xd4\x51\x36\xe0\xcd\xed\x75\x24\x21\x3e\
+\x1e\x6e\x87\x23\xfa\x0f\x10\x7a\x84\xc8\xc5\x45\x3e\x37\xba\xfd\
+\x89\x1e\xb5\xd1\x7f\x41\xa3\xd7\xc3\x3f\x33\x83\xaf\xcf\x37\xb3\
+\x01\xd5\xd5\x75\xe4\x6e\x7f\x2f\x02\xb3\xb3\x51\x9d\x8f\x8b\x8b\
+\xde\x83\x81\xd9\x68\xb8\x22\x3e\x15\xfc\x9c\xed\xff\x7b\x96\xe5\
+\xe6\xa3\xb5\x35\x06\x40\x65\x65\x2d\x71\x38\x9d\xb0\x58\xaf\x50\
+\xa7\x01\xf4\xf5\xdf\x43\x7d\x6d\x0d\x6e\x74\x77\x43\x14\x04\x48\
+\xa4\x52\x14\x17\x16\xa2\xa9\xe5\x02\xf2\x72\xb3\x29\x8c\x87\xd1\
+\xb0\x11\xfa\xf4\x74\xb4\xb7\xb7\xb0\x01\x5b\x4c\x35\xc4\x79\xdf\
+\x83\xcb\x3f\x5d\x43\x80\x7e\xf5\x83\x09\x1f\x4c\xaf\x95\xe2\xd6\
+\x9d\x7f\xe1\xf3\xfa\xa1\x54\x25\x60\xe5\xf2\xe7\x61\xbe\x6e\xc7\
+\x33\x29\x4a\xf0\xf4\x34\x9b\x5e\x5f\x87\xf4\x67\xd5\xb8\x64\xbe\
+\xc0\x06\x98\xb6\xd4\x10\x97\xc7\x83\x75\xa6\x2a\x08\xe1\x30\x1c\
+\x83\x83\xb8\xf9\x6b\x07\x0c\xdb\xeb\x20\x93\xcb\x11\x0e\x85\x60\
+\x3d\xdf\x8c\x55\xaf\x94\x43\x9f\x95\x05\xa9\x4c\x86\x6b\xe6\x36\
+\x68\xd5\x6a\x98\x2f\xc5\x00\xd8\x6c\xac\x24\xe3\xe3\x63\x08\x04\
+\x43\xd1\x0a\x92\xd0\x1d\x12\xa9\x3c\xba\x16\x71\x1e\x81\x44\x44\
+\x14\xe8\x3a\x99\xab\x24\x5e\x21\x47\x6a\x6a\x1a\xbe\xb7\xb4\xb3\
+\x01\x15\x06\x13\x99\xf4\x7a\xd1\xd5\x79\x1d\x61\xaa\x8f\xb8\x26\
+\x68\xcc\x57\x63\x78\xe8\x2e\x42\x54\x8f\xb8\xcf\xc8\x5c\x46\x73\
+\xf2\x17\x9e\xd3\xa6\x40\x46\xf5\xa2\xe2\xb5\x50\x2a\x93\x69\xab\
+\x37\xc7\x00\xa8\x78\x83\x4c\xfa\x7c\xf8\xd6\x66\xa3\x55\x12\xc0\
+\xd8\xa4\x0f\xc6\xb5\x45\xe8\xe9\x1f\x80\xf7\xa1\x17\xaa\x64\x15\
+\x0a\x72\x73\x60\xf9\xb9\x13\x69\x4b\x69\x0e\xe2\x78\x6c\x33\xac\
+\x87\x32\x49\x05\x9b\xed\xbb\x58\x73\xe0\x46\xe9\xc6\xad\x74\xe0\
+\x84\xf1\x4f\x4f\x0f\x06\x6e\xdf\x44\x59\xd5\xdb\x90\xd1\x70\x84\
+\x69\xd8\xae\xb6\x9d\x45\xce\x8a\x55\x78\xa1\xa0\x80\x0e\x1c\x19\
+\xec\x57\x2e\xd2\x1c\x68\x62\xcb\xc1\xd6\xaa\xb7\x88\xdb\xe5\x82\
+\x5a\xa3\x79\x6c\x1b\x75\x0c\x43\xa7\xcf\x58\x54\xf7\xb8\xdd\xd0\
+\x68\xb5\xb8\xd8\xf6\x15\x1b\xb0\x8d\x02\x86\x47\x46\xf0\x3b\xcd\
+\x41\x40\x00\x26\xbc\x53\x28\x7d\x69\x0d\xfa\x7a\x6f\x63\x9a\x26\
+\x81\xb6\x1e\xe4\xe5\xaf\x80\xfd\xcf\x2e\xa4\xa8\x92\xc0\x4b\x81\
+\x12\x9a\x03\x9d\x4e\x8f\x6f\x62\x01\xd4\xee\x78\x87\xb8\x1f\xdc\
+\x47\x73\x5b\x3b\x9d\x37\x01\x3a\x9b\x47\xb1\x6f\x47\x35\x7e\xfc\
+\xa3\x0b\x42\x20\x08\x29\xaf\xc0\xfa\x97\xd7\xe0\xf8\xb9\x56\x3a\
+\x8b\x75\x74\xde\xf0\xa8\xde\x50\x8e\xec\xec\x5c\xb4\x9c\xfb\x92\
+\x0d\xa8\xaf\xdf\x4f\x86\x9d\x0e\xda\xe7\xe3\x1f\xdb\xc2\xfe\x29\
+\xc8\x12\x92\x16\xd5\x85\xe0\x0c\x32\xd2\xf5\x68\x6a\x3a\xc6\x06\
+\x44\x64\xe7\xae\x06\xc2\xcd\x0f\x7b\x8e\x26\x36\xd2\xd4\x88\x28\
+\x3e\x69\x72\xd4\x16\x6d\x82\xe2\xdc\x1e\x42\x1b\xde\x99\xd3\x8d\
+\x0b\xfa\xfa\x0f\xf7\x82\xb5\x28\x60\xc8\xbd\xb2\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x5e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x25\x49\x44\x41\x54\x78\xda\xad\x95\x6d\x48\x53\x51\
+\x18\xc7\x9f\x73\xb7\x79\xef\xd2\x58\xcb\x74\xcc\x37\x4c\x87\xb3\
+\x5c\x53\xa8\x10\x2d\xc8\xd0\x0c\xfa\x10\x11\x95\x29\x58\x64\x41\
+\x5f\x1a\x42\x45\x41\x5f\x52\x82\xa6\x59\x42\xf6\x26\x06\x7d\x88\
+\x7c\x21\x83\x2c\x09\x7b\xc1\x62\x50\x66\x5a\x36\x5f\xa8\x04\x9d\
+\xa8\xd3\x6d\x6e\xb9\xab\xdb\x98\x6e\xbb\x3b\x1d\xf5\x5b\x68\xf7\
+\x4e\x3b\x70\xbf\x1c\xce\xf3\xff\x9d\xe7\xf9\xff\x0f\x17\x41\x88\
+\x6b\xb4\xf6\xd4\xa5\xf5\x9a\x98\xca\xa0\x1f\x01\x04\x97\xf6\x10\
+\xa2\xc0\x33\xe1\x80\x84\xe2\xfb\xe8\xef\xf3\x28\x14\xf1\xa1\xca\
+\xc2\x98\xa8\x3c\xf5\x44\x84\x32\x00\x9c\xd3\x48\x00\x22\x00\x0e\
+\x13\x11\x0a\x46\xde\x4b\x9f\xa6\x9c\x6f\x2c\x58\x13\xc0\xda\xa2\
+\x1b\x8f\xde\x93\x16\xe7\xb7\xb5\x01\x04\x28\x02\x40\x20\xa2\x30\
+\x4c\x76\x31\xbe\x84\x92\x46\x7a\xb9\x1a\xc1\x80\xb1\x07\x27\x6b\
+\x94\x47\x77\xeb\xf0\x8c\x01\xb0\xdf\x45\x00\xa2\xc5\x62\xf7\x98\
+\x08\xec\xc6\xb0\x18\xf5\x95\x7a\xcb\xaa\x01\xa6\xaa\x22\xed\xa6\
+\x7c\x75\xaf\x34\xca\x05\x41\xd7\x0f\x00\x4c\x03\xe2\x10\x04\xe7\
+\x10\x8c\xbe\x61\xca\x89\x78\xd9\x4a\xb5\x82\x00\xb6\x16\xdd\x5c\
+\x64\x8e\x8a\xe6\x1c\xaf\xc8\x58\x18\x02\x10\x01\xc5\x91\xfd\x4e\
+\xe6\x73\x5c\x49\x63\xf6\xbf\x6a\x79\x01\xe6\xba\xd3\x35\xd1\x47\
+\x76\xea\xc0\xd5\x0e\x38\xe0\x25\xa6\x92\xd1\x20\x04\x8e\x2e\x29\
+\xcc\x9a\xc4\xb7\x91\x24\xf8\x9b\xa8\xf8\xd5\x97\xeb\x2b\x42\x06\
+\x8c\xde\x2c\xd6\xca\xf7\xab\x7a\xa5\x8a\x19\x08\xba\x7f\x91\x9b\
+\x4b\x48\x07\xd4\x62\x07\x0b\xc9\xa1\x30\x06\x11\x09\x92\xbd\x4f\
+\x02\xd1\x87\x1b\x50\xc8\x80\xa9\xd6\xd2\xb9\x8d\x7b\xc9\x68\x9c\
+\xaf\x89\xb0\x94\xdc\x7e\x1e\xb0\xd7\x06\xe0\xf3\x03\x76\x39\x81\
+\xa2\x10\xb0\x24\xad\xb6\x11\x55\x9e\xf6\xd6\xbb\xf6\x90\x00\xd6\
+\x27\xa5\x35\xf2\x03\x51\x3a\xcc\xd6\x02\x66\x59\x22\x3c\x07\xe0\
+\xc5\x00\x7e\xd2\x81\x8f\x5a\x34\xd9\x4f\x58\x3d\x75\xb8\x3c\xe7\
+\xfb\x7c\x68\x26\xf7\x64\xca\xb2\x36\x57\x29\x3a\xc2\x53\x1d\xc0\
+\x39\x58\x22\x28\x06\xec\x86\x25\x71\xf2\x82\x91\x8f\x7c\xe4\x0d\
+\xf4\xdc\x10\xf5\x67\x7f\x9c\xd5\x86\x6c\xb2\x31\x5b\x7e\x6c\x43\
+\x7e\x44\x59\xc0\xe2\xf4\x60\x0e\xb9\xc3\xe2\x99\x1c\xe5\x09\x25\
+\x04\x46\x06\xc9\x98\x28\x90\x48\x10\xfc\xac\x16\xfb\xb4\x2f\x67\
+\x69\xe0\x59\xbc\x29\xfa\x94\x2a\x4b\x54\x5f\x4f\x18\x89\x48\x36\
+\x43\x70\xda\x0b\x22\xe2\xb3\xa5\x59\x02\xc3\x06\x2a\x36\xd7\x38\
+\x33\xb9\x66\xc0\xc0\xc1\xc8\xb7\xa9\x8f\xb7\xee\xf3\x0d\x74\x02\
+\x85\xc4\xe0\x19\xa0\xc0\x78\x27\xac\x30\x77\xc0\xd9\xc4\x57\xcb\
+\x0b\xe8\xde\x21\x63\x92\xae\xc5\x7b\xc3\x93\x2c\x80\x9d\x1e\xf0\
+\xdb\xc9\x68\xf4\xf4\xbd\xcc\x0e\xf6\x9c\x10\x71\x5e\x40\x6f\x8e\
+\xbc\x71\x4b\x73\xda\x71\x6e\xb4\x93\xc4\x54\x0c\xc3\x7a\xba\x5f\
+\xf3\x7c\x46\x2b\x54\x9c\x17\x60\x7d\xa4\xc2\xf2\x3c\x12\x4f\x8f\
+\x1d\xcc\xd5\xb4\x2f\xf9\x21\xbf\xa9\x82\x01\xdd\x1a\x59\x59\x7a\
+\x87\xe6\x2a\x67\xe9\x02\xb6\x35\x0c\x4c\x0d\x74\xec\xae\x9e\x69\
+\x5e\x53\x05\x03\xc6\x2b\xe2\xb1\xe2\xac\x04\xdc\x1f\x26\x61\xb0\
+\x6c\x5d\x61\x56\xdf\xb4\x20\x53\x05\x01\xbe\xa6\xcb\x0a\xb6\x19\
+\xb4\x4d\xf3\x43\xdd\x60\xba\xc0\xdc\xcd\x30\xb0\xba\xd5\x88\xaf\
+\x08\x30\x93\xe4\x28\x2e\x8a\x99\xe1\x62\x87\x35\xf5\x99\x4b\xb9\
+\x5a\xf1\x65\x01\xc6\x0c\x59\x51\x4a\x9b\xaa\x7e\xaa\xc6\x0c\x89\
+\x7a\x5b\x48\xbf\x54\x41\x80\x71\x7d\xbc\x91\x4e\x63\xd2\xc7\xcb\
+\xed\xca\xed\xdf\x58\xeb\x7f\x07\x0c\x9f\x51\x60\x77\xff\xfc\xa1\
+\xf4\x2f\xec\x8b\xb5\x8a\x2f\xac\x3f\x49\x01\x3f\x28\x3d\x4c\xf3\
+\x82\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x01\x36\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x19\x00\x00\x00\x19\x08\x06\x00\x00\x00\xc4\xe9\x85\x63\
+\x00\x00\x00\xfd\x49\x44\x41\x54\x48\x4b\xed\x93\x5d\x6e\xc2\x30\
+\x10\x84\x67\x1d\x04\x12\xc7\xc0\x39\x42\x79\xa8\x28\xb4\x9c\x80\
+\x14\x7a\x4b\xd4\xc0\x01\x2a\x01\x02\x95\xde\x01\x7c\x10\x24\xc8\
+\x54\x5b\x44\x15\xf1\x17\x27\x48\x79\x8a\x2d\xbf\x78\xd7\xf3\x79\
+\x67\x6d\x41\x09\x43\x4a\x60\xa0\x82\xe4\x72\xb9\xb2\xab\xb2\x2b\
+\x97\x03\xb9\x92\x0b\xbf\x2e\x17\x77\x09\x13\x80\x87\x1d\xc2\xd1\
+\xfa\xae\x4e\x21\x88\x9b\xf4\x08\x31\x00\x04\x36\x9a\x65\x6a\x5c\
+\x4d\xd8\x7e\x3e\x53\x05\xc2\xd1\xf7\x45\x7c\x1b\x77\x28\x30\x50\
+\x88\x7d\x5f\x64\x02\xd4\xd7\xab\x49\x2e\x7e\xa1\x06\xc9\x04\xa6\
+\xd6\x44\x6b\xf0\x25\x6e\xf2\x4a\x72\x0f\x49\x1d\xb1\xc3\x55\x71\
+\xc8\x66\xfc\x44\x09\x1a\xc7\xe6\x52\x79\x5a\x98\x49\x01\x04\x76\
+\xb8\xf4\x02\xdc\xac\x44\x03\x6a\x0b\x98\x1c\x8b\x15\xbd\xbf\x6a\
+\xea\xd2\xed\x3d\xc2\x8f\x9f\xc7\x21\x9b\x71\x9b\x12\xd4\x71\xf2\
+\x5f\x4c\xed\xaf\x2a\x9d\x3e\xcd\x4e\xbf\xf1\xbb\xb7\x71\xd3\x3e\
+\xcf\x05\xb5\x37\xbe\x0d\x3f\x81\x32\x20\x6f\xb4\xd1\xdc\xdb\x96\
+\x5b\x3f\xf4\x61\x01\x9f\xaf\x5f\x41\x7c\x5c\xfa\xcf\x29\xc5\xae\
+\x5f\xb2\x40\x46\x1a\xa8\x90\xed\xa7\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x04\x09\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xd0\x49\x44\x41\x54\x78\xda\xad\x94\x6d\x6c\x53\x55\
+\x18\xc7\xff\xbd\xf7\xb6\xbd\x6d\xd7\x6d\x5d\x52\x06\xee\x0d\x98\
+\x06\x37\x07\x11\x96\xb2\x17\x8c\x24\x10\x8c\x4c\x1b\x08\x5f\x20\
+\x0a\x81\x60\x50\x11\x13\x13\x03\x89\x33\x53\xd1\xa8\x1f\x58\x40\
+\x24\x26\x44\x79\xc9\x62\x22\x1a\x65\x9d\x74\x80\x1b\x6c\x02\xc2\
+\xd8\x74\x5b\x6d\xeb\xcb\xf8\xe0\x60\xac\x4b\x24\xc6\xd1\x6e\x6d\
+\xd7\x7b\x7b\xdf\x7c\x6e\x4d\x09\x9a\x42\xb6\xd1\x27\xf9\xe7\xde\
+\x9c\x73\xee\xff\xf7\x9c\xe7\x3c\xf7\x18\xf0\x00\xe1\x72\xd5\x6c\
+\x18\x1c\xec\x3f\x4c\xaf\x73\x0c\x06\x06\x8c\xc1\x10\x30\x5b\x2c\
+\x7b\x62\xd1\xc9\xf3\xe9\x35\x86\xd9\x9a\xef\x7c\x6d\xf7\xb2\x96\
+\x23\x87\x07\xc5\x44\x02\x06\x86\xcc\x19\x03\x89\x25\x08\x03\xb3\
+\xd5\x72\x39\x72\x7b\xfc\xc9\x07\x02\xbc\xf9\xd6\xfb\x89\x4f\x3e\
+\x6e\xe6\x63\xb1\x18\x18\x96\x01\x9b\x82\x70\xe0\x8c\x24\xce\x08\
+\xbb\x3d\x67\x68\xf4\xe6\x48\xe5\xac\x01\x2d\x9f\x7f\xa9\x1d\x3f\
+\x7a\x04\x3d\x3d\x97\xc8\x9c\x03\xc3\xb1\x64\xcc\xc1\x68\x34\x81\
+\xe7\xcd\x30\x99\x78\xf0\x56\x4b\xe3\xac\x01\x3d\xbd\xbd\x43\xf1\
+\xb8\xf0\xa8\xfb\xd9\x06\x2a\x0b\xc0\xb2\x46\xca\xde\x48\xc6\x66\
+\x58\x78\x0b\x2c\x36\x2b\xf2\x73\x1d\xb7\x66\x05\xd8\xbc\x6d\xc7\
+\x92\x8a\x45\x8b\x7c\x1c\x6f\x62\xfd\xfd\xfd\xf0\x9e\x6a\x4b\x65\
+\x6e\x32\x53\xd6\x3c\x0f\x8b\xc5\x0a\x5b\x8e\x0d\xb9\x39\x79\x33\
+\x3f\x83\xad\x3b\x76\x6d\x9c\xe7\x74\x7e\xb5\x6a\xd5\x4a\xb4\xb5\
+\x7a\x11\x08\xfe\x8c\x85\x0b\xe7\xe3\xe2\xc5\x0b\xa9\x33\xd0\x01\
+\x56\x9b\x0d\xf6\x5c\x3b\xe6\xcc\x2d\x4e\xde\x17\x50\xb5\xa4\x7a\
+\x39\xb5\x5c\x5d\x3c\x1e\x73\xc6\xa2\x13\x5d\x5b\xb6\xbf\xbc\xbd\
+\xf8\xa1\xc2\x2d\xf5\x75\xb5\x18\x1e\xbe\x01\x4f\x9b\x07\xd7\x7e\
+\xff\x2d\xd5\x2a\x95\x15\x95\x10\x05\x01\x82\x24\x52\xb9\x78\xe4\
+\xda\x73\xe0\x1b\xe8\x6b\xce\x08\x58\xbd\xa6\xa1\x4c\x91\xe5\x6b\
+\xc9\x64\x92\x9f\x9c\x0c\x63\x22\x12\x46\xed\x13\x2b\x51\x5b\x5b\
+\x87\xa5\x8b\x1f\x83\x2f\x10\xc0\xa9\xf6\x33\x08\x5d\xff\x03\x53\
+\xa2\x00\x39\x29\x42\x55\x14\xc8\x24\x23\x67\x42\x22\x31\x05\x51\
+\x14\xbe\xd6\x34\x75\x63\x46\x80\x7b\xc3\x26\x2d\x8f\xb6\x18\x8f\
+\xc6\x30\x16\x1a\xc5\xdc\xa2\x22\xac\x77\xbb\xb1\x60\xc1\x7c\x5c\
+\xba\x7c\x15\xdf\x9d\x39\x8d\x3f\x6f\x8d\x41\x4c\x08\x10\x93\x02\
+\x92\xa2\x08\x59\x56\xce\x72\x1c\xdb\x28\xcb\xb2\x59\x51\x14\xa3\
+\xaa\x2a\x57\x75\xaf\x8c\x80\x4d\xcf\x6d\xd3\xca\x4a\xcb\x30\x11\
+\x8b\xe0\x17\x7f\x10\x6b\x9f\x7e\x06\xf5\x2b\x6a\x70\xb6\xa3\x13\
+\x5d\xe7\xcf\x61\xfc\xef\xbf\xa8\x1c\x22\x04\x31\x01\xda\x25\x14\
+\x59\x82\x24\x49\x19\xbd\x32\x0e\xae\x69\x70\x6b\x8e\x02\x67\xea\
+\xc3\x9b\xd7\x87\x51\x34\xaf\x08\x65\xe5\xe5\xe8\x3e\xd7\x81\x08\
+\x95\x2b\x49\x59\xeb\xf5\xd6\xcd\x29\x63\x50\x29\x1e\xa7\xac\x03\
+\xd3\x06\xb8\x96\xaf\xe8\x64\x18\xe6\x29\x15\x1a\x26\xc3\x61\x84\
+\x49\x8e\x82\x02\x44\xe3\x51\x24\xe9\x6a\x10\xf4\xba\x4b\xff\x9a\
+\xab\xaa\x7a\x9c\xf4\xc2\xbd\x1a\x25\x23\xa0\xfc\x91\x8a\x6a\x68\
+\xea\x80\xac\xca\x90\x04\x09\x09\x21\xae\x1f\x5a\xaa\xd7\x15\x45\
+\x85\x94\x14\xd3\x99\xeb\xcb\x3b\x08\xb0\x76\x46\x00\x3d\x1c\x0e\
+\xc7\x7e\x0d\xec\xeb\x9a\x46\xdd\x21\x49\x64\xa8\x4b\xa1\x19\x2d\
+\x35\xaf\x69\x5a\x7a\xe9\x00\x01\x5c\x33\x06\xec\x7c\x75\xf7\x3a\
+\xcf\x37\x27\xbe\x8d\x44\xc6\xa1\x7b\x91\x49\x4a\x69\xc0\x5d\xe1\
+\xa3\xf1\xea\x19\x01\x3e\x3d\xd6\x52\x5c\x5f\xe3\x0a\xf5\xf6\xfe\
+\x84\x5d\xaf\xbc\xa4\x50\xcb\xb1\x77\x65\xfc\xff\x78\x8f\x00\xef\
+\x4c\x1b\xf0\xd9\xb1\x96\x92\xea\x65\x4b\x47\xfd\x81\x20\xfd\xa5\
+\x43\x27\x9a\xf7\x7d\xf8\x3c\xdd\xf1\x7b\x69\xe5\xbd\x4c\x1e\x26\
+\xc0\xf0\xb4\x00\x64\x6e\xad\xaa\xaa\x8c\x8f\x8c\x8c\xa1\xff\xc7\
+\xbe\xb1\x8f\x0e\xec\x2b\x49\xcf\x51\x57\xe5\xd1\x63\x2b\x69\x33\
+\x49\xaf\xf9\x14\xe9\x45\x32\xff\x02\xf7\x89\xff\x00\xae\x5c\xe9\
+\x1b\xbd\x1d\x0e\x97\x7c\xdf\xdd\x15\x3a\x78\x70\x7f\x29\xb2\x10\
+\x77\x00\xdd\x17\x7e\x08\xa9\x8a\x5a\xdc\xee\xf5\x86\x0e\x1d\x3a\
+\x90\x15\xf3\x3b\x80\xce\xce\xee\x2e\xab\xd5\xb2\xfa\x64\xab\x07\
+\xce\xc2\x42\x5b\x53\xe3\x9e\xa9\xac\x01\xfc\xc1\x5f\x17\xc7\x63\
+\x89\xe0\x49\x4f\x2b\x1c\xf9\xf9\xa5\x6f\x37\xbd\x11\xca\x96\x79\
+\x0a\x30\xe0\xf3\xdf\x68\xf7\x9e\x3e\xfa\xee\xde\xa6\x0f\xb2\x69\
+\x9c\x8e\x7f\x00\xe6\xfa\xbf\x50\x3a\xbf\x64\x01\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xe3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xaa\x49\x44\x41\x54\x78\xda\xcd\x94\x5b\x68\x5c\x55\
+\x14\x86\xbf\x93\x76\x3a\x19\x88\x31\x52\x21\xd6\x89\x6d\x2a\x52\
+\x4a\x55\x88\xb7\xea\x93\x15\x11\x14\xf5\x21\x56\x31\xa0\x16\x15\
+\xed\x83\x78\x41\xc5\x82\x22\x05\x1f\x7c\x11\xa4\xe0\x4b\xbd\x74\
+\x2a\x08\xd2\x28\xd5\x3a\x1a\x63\xb1\x49\x4c\x10\x8c\x84\xc6\x28\
+\xd6\xda\xd6\x4e\x32\x71\x32\xb9\xcf\xe5\x9c\x39\x67\x66\xce\x7d\
+\xbb\x92\xbc\x28\x5a\x33\x19\x7c\x70\xc3\x66\x2f\x0e\x7b\xef\xef\
+\xfc\xeb\xdf\x6b\x69\xac\x61\x44\x1f\x3d\xa1\x02\xd7\xc7\xef\xbe\
+\x5b\xab\xf5\x4c\xcd\x1b\x23\x8f\x0d\xaa\xeb\xb6\x5f\xcc\xd9\xc9\
+\x12\xa5\x05\x1d\x8e\x75\xd6\x74\xb6\xa6\x4d\x4d\xcf\x7e\xa7\x76\
+\xc4\x63\xec\xef\xda\xca\x2b\xbf\xfa\x64\x7a\x4e\x53\x9a\xce\x43\
+\xcf\xfd\xab\x9e\x5f\x75\xc3\x25\x2f\x8f\xa9\x2d\x97\x36\x70\xe8\
+\xa1\x76\x9e\x3b\xe5\xf0\xfd\x19\x87\xcb\xae\xd8\x40\xa5\xef\x2c\
+\xa5\xec\x3c\x7c\xd9\xa5\xd5\x0d\x68\x7d\xed\x94\x6a\x5c\x17\xf0\
+\xf1\x23\x97\x73\x30\x1b\xa5\x6f\xc2\xa6\x60\x87\x38\xa6\x4e\xbc\
+\xad\x19\x73\xe8\x3c\xa5\xcc\x14\x7c\xb5\x47\x5b\x33\x20\xfe\xc6\
+\x19\x15\x5b\xaf\xe8\x79\xb0\x95\x23\x85\x08\xc7\x33\x3e\x55\xdb\
+\x67\xb1\x12\xb0\xe0\x84\xb0\x38\x4b\xc7\x0d\x6d\x4c\x24\x45\x49\
+\x2a\x05\xfd\x4f\x6a\x35\x03\xb6\x1e\x18\x57\xd1\x68\xc8\xd7\x5d\
+\x1b\x19\x77\xa3\xbc\x95\x0a\xa8\xb8\x21\x7a\x39\x20\x2f\x73\xb1\
+\x1a\x60\x96\x6d\xd0\xe7\xb9\xf5\xe6\xab\x18\x39\x3c\x88\x93\x93\
+\x74\x7d\xf3\x8c\xb6\x2a\x60\x5b\x62\x4a\xc5\xb4\x90\x81\xce\x16\
+\xa6\xb4\x28\xef\xa6\xe5\xf2\x50\x61\x94\x05\x20\x0a\x8a\x55\x8f\
+\x5c\x59\x31\x5f\x0d\x09\x8a\x62\x74\xd5\x60\x57\xc7\x16\xbe\x3d\
+\x3c\x8c\x32\x33\x30\xb8\x4f\xbb\x20\xe0\xea\x8f\x16\x54\xd5\xf4\
+\xe9\xbf\xaf\x89\x48\x2c\x4a\x62\x46\xc3\xf6\x7d\x0c\x2b\xc4\xf0\
+\x42\xf2\xd5\x15\x50\xd1\x16\x48\xc5\xa7\x20\x6a\x30\xe4\xcf\x7d\
+\x97\xbd\xb7\xb5\x73\xe8\xf5\x7e\x89\x17\x44\xc9\x4b\xda\xdf\x00\
+\x37\x7e\xae\xab\x06\xdf\xe1\xc0\x4d\x11\x5a\x9a\x1b\xf9\x60\x4e\
+\x63\x5d\x18\xb0\xed\xa2\x08\xa9\x92\xe4\xbd\x22\x10\xc9\x7f\xc1\
+\x0e\xd0\x25\x45\x8b\x16\xf2\xcd\xc1\x9e\xcd\x41\xc5\x80\x0d\x31\
+\xee\xb9\xb2\x89\xde\xee\x51\x08\xe4\xdb\xc0\x8b\xda\x5f\x00\xb7\
+\xf4\x1a\xca\xb1\x5d\x2c\xcb\xc7\x35\x3d\x02\xd7\x63\x63\xa3\xcf\
+\x4f\x4f\xb5\x73\x30\x15\x72\xba\x14\x52\x16\x48\x3e\x08\x29\x58\
+\x02\x11\xa3\xe7\xa6\x75\x0a\x27\x7e\x94\xd3\x2e\xf2\xb4\x64\x96\
+\xa5\x22\xe5\x4a\x4d\x66\xff\x0b\xda\x3f\x7a\xf0\xe7\x71\xfd\x7b\
+\x29\xf5\xc3\xde\xcd\x24\x32\x01\xbf\x59\x0a\x53\x14\x14\x25\x4d\
+\x39\x47\x62\x51\x32\x9d\x29\x31\xd3\x37\x86\x4a\xee\x5e\xfb\x33\
+\x5d\x4e\x5b\x62\x42\x9d\x7c\x22\xce\x91\xe9\x90\x73\x66\x03\xa6\
+\x23\x79\xb7\x95\x78\x20\xe9\x72\x03\xb2\xbf\x97\x98\xec\x3d\x49\
+\x90\x7c\xa0\x3e\xc0\xce\xf7\x27\xd5\xc8\xe3\x71\xbe\x28\x68\x9c\
+\x13\x05\xd5\x40\x14\x88\xe1\x4b\x2a\xf2\x3e\x02\xd0\xf9\xf9\x93\
+\x11\xc2\x63\x75\x2a\xb8\xe6\x9d\x71\xd5\x1c\x5b\xd9\x52\x30\xa4\
+\x8b\x56\x5d\x42\xe9\xa6\x8e\x3c\x57\x57\x3c\x72\x4c\x87\x72\x5e\
+\x27\x38\xda\x59\x1f\xe0\xbf\x18\xff\x0a\xd8\x71\x34\xaf\x96\x03\
+\xcf\x47\xc9\x5f\xfb\x92\xa2\x50\x56\x25\xb5\x81\x28\x71\xa5\x36\
+\x50\x8a\xec\xfe\x6b\xeb\x53\x70\xe7\x67\xb3\x2a\x71\x47\x33\xc9\
+\xbc\x46\xda\x58\x79\x39\xc5\xa5\x02\xb3\x3c\x0a\xa6\x98\x2c\x5e\
+\x78\xa3\x29\x8c\xb7\x77\xd5\x07\xb8\xfd\xc3\xb4\x1a\x78\xb8\x8d\
+\xee\xf9\x90\xd1\xa2\xb4\x07\x3d\x60\x46\x00\x59\xf1\x23\xad\x8b\
+\xa2\x52\x8e\x88\x74\x54\x2f\x59\xa7\x07\xf1\x7d\xc3\x6a\xd3\xe6\
+\x96\xe5\x38\x67\x78\x94\xa5\x45\x18\xd2\xf4\x5c\x4b\x1a\x5d\x45\
+\xaa\x55\xf3\x20\x3d\x0b\x43\xcf\xff\x4f\x4d\xee\x48\x16\x95\x65\
+\xb9\x62\xb0\x87\x92\xc2\x5a\x1a\x81\x55\x26\x94\x82\x53\x62\x72\
+\xe0\x2b\x7c\x4f\xfa\xd2\x9b\x3b\xeb\x53\xb0\xfb\xf8\x8c\xfa\xf4\
+\xae\x56\x86\xdd\x06\xc6\x8a\x30\x27\xb0\x71\x59\xd3\xba\xcd\x79\
+\xa9\xb4\x82\x61\x12\x1b\xfa\x85\x6a\xf7\xbd\xf5\x01\x36\xbd\x3a\
+\xaa\xd6\x47\x56\xe2\x8a\xb5\xf4\x44\x5d\x1c\xc7\xa3\x22\x8a\xf0\
+\xa4\xb9\x79\x15\x69\xd7\xb2\xf6\x3f\x7d\xc1\x7b\xfe\x00\x72\xf7\
+\x32\x37\xf7\xa7\xcf\xab\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x41\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x08\x49\x44\x41\x54\x78\xda\xad\x93\x5d\x4c\x5b\x65\
+\x18\xc7\xff\xe7\x9c\x7e\x02\x13\x3a\xb6\xf0\xd1\x76\x48\x89\x93\
+\xc9\xf8\x1c\x0e\x88\xba\x39\x5d\x14\x8d\x37\x8b\x8b\x4c\x93\xc5\
+\xc4\x2b\x13\x97\x68\x34\x6a\x30\xcb\xe6\x5c\x88\xd3\x19\x31\x8b\
+\x8b\x31\x46\xbd\xd0\xe8\xb6\x4c\x13\x2f\xf4\xc2\xc4\x2c\xa0\x88\
+\x44\x56\x5c\x97\x4e\x46\xa1\x15\xfa\x05\x2d\x85\xb6\xb4\xb4\x3d\
+\xed\x39\xaf\xcf\x39\xac\x28\x0b\xdb\xb8\xe8\x93\x9c\x93\xf7\x7d\
+\xce\xfb\xfc\x7f\xcf\xc7\x7b\x38\xdc\xb0\x3d\xdf\x78\x9f\xd6\x69\
+\xf8\xd6\x4d\xc5\xda\x0e\x9e\xe3\x4a\x4a\x8c\x7c\x67\xfe\x1b\x63\
+\x80\x51\x2f\xa0\x58\xc7\xab\xfb\xa4\x28\x23\x95\x91\xc0\x71\x58\
+\xb5\x44\x4a\xfe\x43\x66\x2c\xb1\x94\xcc\x8e\x88\x39\x79\x6c\xf0\
+\x39\xeb\x77\x8a\x5f\x3d\xf2\xd8\x45\x3f\x23\x61\x18\x05\x0e\x1c\
+\xbf\xe2\x64\xca\x23\x63\x8d\x29\x20\x35\x88\x5b\xeb\xcf\xc7\xdc\
+\xd8\x21\x25\xc9\x88\x2d\x65\xf1\xf3\x41\xf3\xca\xd1\xce\x2f\x3d\
+\xc1\xfa\x2a\x7d\x65\x98\xb2\x1a\x72\x25\xa0\x21\x90\xc0\x73\x79\
+\xbe\xfa\xd6\x0a\x00\xff\x3f\x99\x2c\xc1\x94\x23\x5a\x25\x29\x5a\
+\x4b\xb4\x26\x5d\x6c\x35\xca\xa8\x2b\xd5\xc0\x9f\xe0\x66\x87\x9f\
+\xaf\xad\x52\x23\xba\x3e\x9f\xb2\x34\x54\xea\xbd\x9f\x3d\x69\xce\
+\xe7\x8a\xf1\x70\x52\x4d\x59\x96\x25\x50\xe9\x18\x98\x4b\x63\x36\
+\x21\xd1\x17\x19\x39\x99\xe1\xa0\x55\x87\xf1\x48\x06\xc3\xbe\x65\
+\xc8\x44\xa8\xd3\x4b\xe0\xe9\xec\x5e\xb3\x1e\x27\xae\x19\xb0\x90\
+\xe6\xac\x43\x2f\xd8\x7c\xab\x29\x35\x9d\x75\x1d\xea\xde\x51\xf4\
+\xed\x7b\xfb\xaa\x57\x21\x60\x39\x10\x01\xa4\x48\x7b\x12\x97\x08\
+\x46\x69\x4a\x8a\x8f\x9e\x1f\x27\xa2\x08\x24\x45\xf0\xe4\xcb\xe6\
+\x72\xe0\x0d\x45\x18\x59\xd4\xe2\x5a\x18\xcf\xda\x5f\xac\x3b\xb7\
+\x3a\x83\xbc\x35\xf4\x8f\x7f\xfc\x44\x5b\xe9\x4b\x55\x15\xa5\x10\
+\x73\x12\x2a\xb5\xbc\x9a\x6d\x8d\x91\x41\x47\x59\x4a\xb2\x52\x91\
+\x4c\x85\x31\x2c\x11\xf4\xcc\xc0\x22\x0c\x3a\x20\x9e\x06\x44\xe8\
+\xb0\xa5\x5c\x83\x50\x28\x79\x76\xec\xc8\xf6\x23\xff\x4d\xe4\x26\
+\xab\x3f\xed\x74\xbc\xd6\x5d\xdd\xb8\xc0\xeb\x30\x9b\x96\xa9\xbf\
+\x24\x4c\xc5\xc8\xf4\x52\x86\xac\x88\x2b\xcd\x9f\xf0\x26\x30\x1f\
+\x58\xa6\x25\x07\x89\xbe\xd5\x6c\x2b\x82\xd7\x1b\xfb\xc5\xfe\xca\
+\x7d\xfb\xd7\x5c\x00\xac\x63\xad\xfd\x4e\xef\x89\x03\x35\x96\x5f\
+\xe7\x57\xfa\xad\x74\x4b\x99\x83\xa2\xad\x54\xa1\xa5\x89\x0f\x0e\
+\x05\xc9\x09\xb5\xa2\x4a\x73\x11\x42\xfe\x25\x9f\xfd\xf5\x9d\xd6\
+\x9b\xb5\xd6\x05\x34\x9d\x72\x58\x72\x3c\xf3\x7e\x7a\xb8\x1e\x5f\
+\xbb\x97\xa1\xa5\x2c\x15\x80\xc2\x52\xee\x5d\x70\x2e\x05\xf7\xf5\
+\x18\x05\xcb\x30\x6e\xd2\x21\x2b\xa6\x21\xe5\x60\xfd\xeb\x8d\x46\
+\xdf\x86\x00\xea\x3c\xfa\xec\x8d\x26\x93\xde\xf1\x72\xf7\xdd\xf8\
+\xc9\x97\x86\x06\x2b\x33\xe7\xe9\xba\x3a\x9d\x11\xc4\x17\x33\x10\
+\x04\x1e\x1a\xbd\x0c\x31\x9d\x6b\x72\xf4\xb6\x5e\x5d\x4f\xe7\x96\
+\x00\xc5\x76\x1c\xfb\xf3\x99\xce\xe6\xf2\xf3\x2d\xf7\x6e\x81\x7d\
+\x4e\xa4\xec\x19\xb2\xd4\xef\xd1\x41\x1f\x04\x8d\x80\x92\x32\x01\
+\xe9\xa5\x4c\x8f\xe3\xe8\xae\x0b\xb7\xd2\xb8\x2d\x40\x31\xdb\x9b\
+\xbf\x9f\xeb\x79\xd4\xd2\x13\xd5\x17\xd3\x6d\x91\xe1\x0f\xc6\x11\
+\x98\x88\x43\x6b\xa0\x7e\x65\xb3\xe7\x9d\x27\x3b\x0e\xdd\x2e\xfe\
+\x8e\x00\xc5\x1e\xff\xe4\x2a\x6b\x6e\x31\xc3\x15\xcb\x21\xe4\x89\
+\x61\x6e\x2a\x82\xb2\x6a\x23\x46\x5f\x6d\xbe\x63\xfc\x86\x00\xfb\
+\xcf\x5c\x61\x3b\xdb\xad\xf0\x44\x44\x04\xa6\xa3\x08\x4f\x46\x60\
+\xaa\x28\xc2\x58\x6f\x6b\x61\x00\x8f\xf4\xdb\x59\x7d\x7b\x0d\x3c\
+\x0b\x19\xcc\x7a\xa2\x88\xb8\xc2\x28\x33\x17\xc3\xf1\x56\x7b\x61\
+\x00\x7b\x4f\x8f\xb2\xed\xbb\x6b\x30\x15\x16\x11\xfe\x27\x86\x05\
+\x57\x10\x65\x15\x25\x70\xbe\xd3\x51\x18\xc0\x43\xa7\x46\x98\xed\
+\xfe\x5a\xb8\xc3\x19\xcc\x7b\x16\xb1\x38\x31\x07\x53\x75\x09\xfe\
+\xee\xeb\x2a\x10\xa0\x6f\x98\x59\xdb\x6b\x31\x49\x15\x44\x55\x40\
+\x00\x9b\x2d\x77\xe1\xfa\xbb\x0f\x14\x06\xf0\xe0\xc9\x21\xb6\xb5\
+\xcd\x06\x4f\x28\x43\x80\x79\xc4\x27\x67\x55\xc0\xe4\xfb\x7b\x0a\
+\x03\xe8\x7a\xfb\x37\x66\x6a\xab\x85\x87\x5a\x94\x98\x0a\x13\x20\
+\x88\x72\x4b\x19\xdc\x1f\x3e\x5c\x18\xc0\xee\x63\x03\xac\xb8\xc5\
+\x86\x19\xfa\x9b\x93\x9e\x30\x92\x53\x3e\x6c\xb6\x96\x63\xfa\xa3\
+\x7d\x85\x01\xb4\xf7\x5e\x62\xfa\xb6\x7b\x30\x43\x2d\x4a\xb9\x83\
+\x48\x5f\x76\xc0\x64\xdb\x06\xef\x17\x4f\x15\x06\xb0\xeb\xe8\x25\
+\x26\x34\xd4\x61\xe6\xb2\x0f\xdc\xf4\xf4\x32\x6f\x30\x7c\xe0\xff\
+\xea\xc0\xf1\x8d\xc4\x6e\x08\x60\x39\xfc\x3d\x13\x93\xa9\x2b\x82\
+\x46\x73\x3c\x78\xa1\xe7\x87\x8d\xc4\xe4\xed\x5f\x35\xdb\xdb\x28\
+\x77\xd7\xed\x06\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x03\xed\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xb4\x49\x44\x41\x54\x78\xda\xbd\x55\xdd\x6b\x5c\x45\
+\x14\xff\x9d\xbb\xd9\x8d\xdd\x24\xfd\x48\x2a\x36\xa2\x0f\x8a\x68\
+\x91\xaa\xb5\x50\x42\x2b\x48\x91\x12\x29\xe8\x83\xa2\x60\x11\x9f\
+\xfc\x1f\xfa\x62\x8b\x8a\x54\x2c\xd2\x26\x29\xb1\x29\x22\xd6\x98\
+\x54\x09\xa6\xd2\x62\x82\xf8\x49\xe9\x83\xa2\x0f\x5a\xda\x20\x29\
+\xad\x49\x6d\x9b\x74\x37\xd9\x6c\x9a\xdd\x7c\x9a\x3b\x73\x7a\xe6\
+\xe3\xde\xbd\x29\x56\x6b\x8a\x0e\x77\x98\x7b\xe7\xce\x9c\xdf\x39\
+\xbf\xdf\x99\x33\x84\xff\xb8\xd1\xff\x02\x70\x6e\x27\xb1\x0e\x19\
+\xe0\xa5\xb0\x41\x9a\xf0\xd0\x27\x7c\x5b\x4e\xd0\xc0\x8b\xc4\xf5\
+\x4f\x3d\x8f\xfa\xe6\x9d\xe0\xc5\x05\x07\xa2\x19\x54\x55\x85\xe2\
+\xb7\x3d\x28\x9e\x3c\x8e\x0d\x9f\x2d\x1f\x84\x7e\x79\x16\xbc\xbe\
+\xa5\x17\x2b\xee\x6d\x04\xe6\xf2\xd6\x38\x58\x8b\xfb\x84\xd9\xe1\
+\x21\x9c\x7b\x73\x17\x36\x9d\x58\x3e\x95\xf4\xd3\x0e\xf0\x86\x77\
+\xbb\x91\xbd\x67\x05\x78\xae\x64\xdc\x07\x42\x0d\x4a\xa5\x30\x3d\
+\xfc\x3b\x7e\x7b\x7b\x2f\x9a\xfa\x6f\x03\xe0\x87\x66\xf0\xa3\x07\
+\xba\x51\xd3\x58\x0d\x5e\x98\xb2\xf6\xa1\x15\x28\x08\x50\x3a\x3f\
+\x88\xd3\x7b\xf6\xa3\xaa\xe6\xef\x14\xfc\xeb\x69\xaa\x02\xb6\xf4\
+\x81\xe8\xfb\xed\xe0\xcd\x07\xba\x50\xdb\x98\x91\x08\x04\xc0\x88\
+\xa0\x0d\x8a\x80\x54\xaf\xc1\x7c\x31\x8d\x70\x76\x0a\x64\x64\x20\
+\x76\x0e\x98\x91\xa5\x2b\x6d\xe9\x64\x63\xd2\x7c\x1b\xcb\x66\x14\
+\xe7\xa6\x06\x4f\xe3\x42\xef\xfb\xa0\x6f\xb6\x81\x9b\xda\x3e\x46\
+\xdd\xba\xb4\x00\x5c\x73\x00\xd1\x66\x79\xa8\x3a\x1b\x1b\xb2\xf3\
+\x09\xc3\xf1\x9c\x71\x88\x95\x50\xeb\xf5\x13\x7a\xcb\x97\x2e\xe2\
+\xe7\xb6\xf7\x40\x5f\x3e\x09\xde\xda\xda\x89\x95\x8d\x06\x60\xd2\
+\x47\xc0\x96\x26\xbb\xd8\x6c\x56\xd1\x37\x57\x0c\x47\x20\xda\x03\
+\xe8\xc4\x77\x00\x94\x46\x46\xf1\xe3\xe1\x2e\xd0\xf1\x2d\xe0\x6d\
+\xed\x1f\x61\xd5\xba\x94\x68\x70\xcd\x6f\x84\x37\x24\x31\x2b\x55\
+\xf1\xdc\x52\x27\x63\xa8\xdc\xa8\xbc\x13\x2a\xb4\x0e\xb0\x5f\x13\
+\x48\x06\x4e\x5e\x1e\xc5\xa9\x8e\x6e\xd0\xb1\x26\xf0\xf6\xf6\x0f\
+\xb1\xd2\x00\x58\x0d\x0c\x9f\xb2\x61\x7e\x42\x00\xa7\x01\x0b\xaa\
+\xdc\x9c\xa5\x4d\xb9\x6e\xe6\xd2\xf5\x42\x87\xa8\x19\x48\x16\x64\
+\xea\x64\x5e\xd6\x84\x8b\x92\xe1\x84\xe2\x95\x11\x9c\xec\xf8\x14\
+\xd4\xb3\x19\xdc\x7c\xe8\x08\x56\xaf\xd5\xd0\x93\x67\xc4\xa0\x80\
+\x2c\x94\x13\x3a\x78\x7a\xe4\x9d\x2d\x15\x11\x90\xe9\x8b\xf2\xcb\
+\x44\xb0\x28\x7e\xa5\x11\x64\x56\x83\x6a\xee\x16\xbc\x3b\x31\x71\
+\xe9\x32\xbe\xeb\x38\x0a\x3a\xba\x09\xbc\xa3\x6d\x1f\xd6\x64\x2f\
+\x42\xcf\x16\x1d\xdf\xfe\x2c\x38\x5e\x43\x79\x22\x83\xde\x73\x1b\
+\x85\x76\xc6\x0d\xa0\xf9\x67\x68\x13\x40\x43\x57\x10\x64\x30\x39\
+\xb7\x0a\x5f\x77\x9d\x02\x75\x6e\x04\x3f\xd3\xf2\x16\xea\xeb\xae\
+\x42\x4f\x17\xe2\xcd\xb1\xd7\x91\x41\x8e\x40\x5d\x04\x5a\x27\xe8\
+\x4a\xac\x37\x9d\xc4\xa9\x89\xb1\x19\x7c\xd5\x3f\x0a\xfa\xe0\x11\
+\xf0\x73\xad\x02\x50\x3b\x02\x5d\x1e\xf3\x99\x70\x33\x4a\x94\x3c\
+\x09\x83\x3a\x12\xd8\xfd\x67\x1f\x51\x20\x09\x30\x91\x9f\x43\x7f\
+\xdf\x55\xd0\xe1\x87\xc1\x2f\xb4\xbd\x81\x86\x9a\x2b\x02\x90\xb3\
+\xec\x70\x94\x76\x3a\x29\xec\x0d\x94\x2c\x11\xdc\x38\xe3\xd6\x90\
+\xe9\x72\x26\x0a\x63\xf3\x38\xd1\x97\x03\xb5\xaf\x07\xbf\xd4\xfa\
+\x3a\x1a\x6a\xff\x80\x2e\xe5\x6d\x00\x71\xb8\x09\x03\x4b\x28\x51\
+\xc9\x08\x54\xc5\xb8\x07\x32\x11\x14\xc6\x17\xf0\x79\x5f\x1e\xd4\
+\xf2\x20\xf8\x95\xd6\x3d\x68\xc8\x0e\x43\x95\xc7\x2b\x87\xc8\x47\
+\xa0\x63\xb1\x95\xd3\x80\x13\x94\x24\xbf\x63\xea\xb4\x4d\xd3\x71\
+\x01\xe8\xf9\x42\x00\xf6\xdf\x0f\x7e\xf9\xe0\x6e\xdc\x95\x1d\x82\
+\x2a\xe5\xe2\x62\xe7\x28\x49\x88\x78\x53\x4a\x94\x4f\x04\x9f\xd2\
+\xd2\x52\x72\xd0\xf2\x05\x01\x38\x26\x00\xef\xdc\x07\x7e\xf5\xd0\
+\x6e\xac\xcd\x0c\xc9\xf9\x1e\x8d\xf3\x5f\xeb\x5b\xe0\x3b\x34\xef\
+\xa1\xbf\x43\x38\xae\xae\x52\x8a\x90\xcb\xfd\x89\xce\x5e\xd1\x60\
+\xdf\x03\xe0\xc7\x9e\x7e\x02\x8f\x6f\xbc\x03\x6a\xa6\x20\x1b\x28\
+\xce\x7f\x57\x36\xb8\x52\x93\x4c\xe5\x0c\x5d\xe9\xb0\x9e\xb3\xaf\
+\x53\x37\xb4\x54\x8a\xf0\xeb\xc0\x0c\xce\x0e\x96\x1d\xe6\x5e\x89\
+\x22\x0c\xff\xa1\xce\xff\x9b\x2b\x47\xd6\xca\x8d\x8b\xd7\x2e\xc8\
+\x7d\xb0\xdc\x9b\xea\x56\xdb\x75\x05\x0e\xde\xc3\xbd\xe0\xf7\xe2\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xee\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xb5\x49\x44\x41\x54\x78\xda\x9d\x94\x5b\x68\x54\x47\
+\x18\xc7\xff\x73\xb2\xee\x26\x9e\x5c\x56\xe3\xa6\xc9\x42\x92\x5a\
+\x12\x70\xc5\x17\x63\x5b\x88\x17\x4a\x2d\x05\x1b\x50\x0a\xa1\xea\
+\x83\x14\xfa\x5c\xf0\x4d\x0a\xa5\xd4\x17\xf1\xc5\x37\x29\x94\x3e\
+\x54\x5a\xeb\x83\xe2\x43\x29\x88\xf4\x21\x08\xa5\x56\x9f\x5a\x4b\
+\x23\x6d\xec\x25\xe6\x66\x2e\xcd\xd6\x6c\xf6\x9c\xcd\x39\x67\xce\
+\x99\x19\xbf\x99\xd9\x0a\x62\xda\xec\xc9\x81\x39\xc3\x37\x7c\xf3\
+\xff\x7d\x97\x99\x61\x48\xf1\x0d\x7e\x3c\xae\xbc\xe5\x00\x8b\x9f\
+\xbe\xca\x1a\xdd\xd3\xb0\xa3\xfe\xf6\x5c\x7f\xac\xa2\xf1\x47\x48\
+\x03\x49\x05\x18\xba\xe9\xa9\x57\x5e\x70\x70\xeb\x9b\x49\x04\x15\
+\x8e\xb9\x8b\xfb\x36\xdc\x9f\x3a\x83\xb3\xaf\x77\x60\x6c\x3a\x34\
+\x90\xa5\xe9\x2a\xaa\x5f\x1e\xf8\x5f\x8d\x54\x80\xe1\x1b\x55\x75\
+\xfd\x48\x1b\xee\xad\xc4\xb8\x31\x13\x37\x04\x49\x9d\xc1\xbb\x87\
+\xf2\x78\xab\x9d\x61\xb2\x1a\xe1\xe6\x23\x61\x21\x33\x04\xf9\x62\
+\x7d\x08\x2b\x5d\xf9\x47\x79\x6b\x02\x32\x91\x76\x45\x2a\x28\x05\
+\x28\xa1\xc0\xf4\xec\xd0\x2f\x56\x48\x94\x44\x67\x8b\x83\xa3\xc7\
+\x7a\xe0\x90\x3d\xb2\xc3\x81\x14\x12\x1f\xfc\x18\xa2\xf2\xfd\xc3\
+\xff\x84\xb0\x17\x2f\x95\xd5\xb9\x23\xed\x68\xce\x30\x18\x06\xe9\
+\x49\xa3\xac\x34\xcb\xc0\xec\xac\xe0\x25\x0c\x7f\x26\x0e\xbc\x48\
+\x21\x22\xe7\x81\xac\xc4\xfe\x42\x06\x1f\xfd\xcc\x2d\x64\x9d\x72\
+\xb1\xa1\xab\x65\xff\xf3\xa3\x9d\x6e\x6b\x13\x10\x49\x5b\xb3\x7f\
+\x85\x13\x1a\xa2\x3e\x3b\xb4\xbe\xc4\x25\xbe\x5e\x12\x66\xd1\xe7\
+\x0a\x21\x39\x0e\xb5\x29\x23\x74\xe5\x3e\x87\x73\x7f\xf6\x39\x08\
+\x1b\xf8\x6c\xc1\x3f\x35\x52\x70\x0b\xb9\x26\xac\x91\x12\x27\xe5\
+\x48\x30\x43\x09\xb5\xb8\x10\xe0\x92\x41\x24\x40\x48\x51\x87\x24\
+\x2e\xc9\x2f\x22\xbf\x5a\x08\x54\x28\xaa\xe6\x16\xe0\xf0\x76\x67\
+\x5d\x08\xeb\xff\x64\xce\x3f\x79\xac\xc7\x2d\x64\x1d\xd4\x62\x0b\
+\x48\x48\x8c\x4b\x89\x98\x32\xe2\x1a\xca\x75\x49\x14\xd9\x34\x98\
+\xb6\x35\x4c\x11\x94\x32\xa1\x72\xad\xfa\x02\xc5\x62\xc6\x40\xbe\
+\xfd\x61\x19\x8f\x67\xab\x58\x98\x5a\x85\x7f\xf9\x20\x63\x7d\x17\
+\x66\xfc\x93\xa3\x45\x37\x9f\xa3\xda\x12\x40\x37\x2e\xa2\x2a\xc4\
+\x7a\x90\x40\xa8\xed\x18\x06\xac\xb3\x08\xc8\xe6\x3a\x10\x9d\x05\
+\x81\x62\x8a\xa2\x46\x6b\x2b\x9e\xc4\x9e\xc1\x9c\x81\x8c\xdd\x5e\
+\xc6\xdf\x73\x55\x93\x09\xeb\x3d\x3f\xe9\xbf\x3d\xda\x4b\x80\x26\
+\xca\x40\x50\xa4\x36\x6a\x1d\xad\x8e\x3a\xa2\xcd\x31\x63\xe0\x14\
+\x29\x8f\x2d\x2c\x32\x00\x69\xe6\x90\xd6\xb8\x2e\x1f\xed\xad\x94\
+\x03\xec\x7e\x79\x3b\xde\xe9\xb6\x90\xf1\x3b\x73\x60\xc5\xb3\xbf\
+\xfb\x23\xc7\xfb\xdd\x6d\xb9\x0c\x3c\x2e\x8c\xa8\x4e\x3d\xac\x03\
+\xf4\xe6\x88\xea\xae\xb3\x09\xa8\x54\x3c\x92\x4f\xed\x30\xb6\x10\
+\xed\xe7\xd7\xa8\x61\x59\xe0\xc0\x4b\x59\xcc\xdf\x9a\xc2\xf2\x82\
+\x0f\xff\x2b\x2a\x51\xd7\x87\xbf\xfa\x6f\x1e\xdf\xe9\x76\x34\x6f\
+\x21\x27\x02\x48\xdd\x07\x69\x32\xd1\x3d\x08\xe9\xe4\x68\x31\x23\
+\x14\xea\x59\x9a\xac\x4c\xa6\xb1\xb5\xc3\x4a\x00\xa7\xdb\x85\x5c\
+\xac\xa1\x30\xf1\x10\x81\x22\xad\xcb\xf5\x26\x17\xce\xfc\xe2\x1f\
+\x3e\x31\xe8\xba\x2d\x74\x8a\xa8\x0c\x81\x8e\x5c\x47\x2a\xec\x08\
+\x42\x1b\x75\x40\xb0\x98\x9a\x13\x46\x75\x40\xfd\x2e\xc8\x5a\x84\
+\x5c\xcf\x56\x44\xf3\x6b\xe8\x7a\x30\x45\x27\x2f\xf3\xec\x31\xed\
+\x3c\xfd\x93\x2a\xbd\xb1\x13\x59\x37\x4b\x9b\x05\x45\x2b\xcd\x29\
+\x89\x49\x24\x21\xb1\x44\xd8\xe8\xb5\x1d\x53\xa3\x79\x26\x63\x7d\
+\x6c\x0a\x68\xeb\x6b\x87\x37\xed\x59\x71\x6c\xa1\xdb\xbc\xff\xd9\
+\x8b\x96\x7f\xef\xae\x4a\xa8\xf6\x4a\xe8\x6b\x4c\x83\xee\x00\x75\
+\xc1\x3e\x19\xcc\x3e\x17\x92\x4a\x66\x2e\xf7\xd6\x16\x84\x07\x77\
+\x01\x7e\x40\x7e\x12\xc5\x5d\xdb\x30\x3f\xb1\x82\xae\x89\x69\x44\
+\x4e\x16\xab\x97\x86\x9f\x7f\x2a\xd2\x3c\x76\x99\x53\xb7\x55\x32\
+\xd4\x07\xcd\xef\x1d\x68\xc5\xec\x83\x2a\xf2\x7f\x2c\xa1\xe2\xd3\
+\x8d\xbb\xf6\xda\xfa\x8f\x5d\x1a\x00\x46\xc7\x14\x0e\x95\x50\x2a\
+\xb5\xe2\xb7\x7b\x2b\x1b\x8a\xa7\x07\x9c\xf8\x4e\x0d\xbf\xbf\x0f\
+\x77\xef\x94\xd1\x41\xe2\xab\x1b\x88\x6f\x0a\x80\xbd\xfd\xc8\xff\
+\x45\x91\x57\x37\x16\xdf\x14\xa0\x7b\x47\x16\x8b\x65\xde\x90\xf8\
+\xe6\x32\xd0\x5f\x83\xe2\xfa\x7b\x02\x3d\x7f\xb6\x9a\x3b\xde\x2e\
+\x6e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xc2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x89\x49\x44\x41\x54\x78\xda\x85\x55\x69\x4c\x54\x57\
+\x18\x3d\x6f\x56\x87\x01\x2b\x82\x40\x5c\xaa\x88\x28\x0a\x36\xa2\
+\x69\xb1\xb1\xad\x8d\x26\x4d\x8b\x0b\x51\xff\xd4\xda\x8e\x0b\x61\
+\x29\x01\x11\x1a\x17\x04\x59\x94\xd6\x58\x4b\xdd\xca\x32\x92\x6a\
+\x5b\xd1\x28\x2d\x88\xb6\xd5\xc6\xa5\x8b\xa1\xb8\x03\xa5\x2d\x16\
+\x2d\x0c\x68\xd2\x2a\x49\x1d\x66\x60\x98\xed\xcd\xbc\x7e\xf7\x8e\
+\x33\xb8\x80\xbe\x99\x97\xb9\xf3\xee\x7d\xdf\xf9\xee\x39\xe7\xfb\
+\xae\x80\xa7\x5c\xe3\xc7\x87\x4f\xcf\xcc\x5a\xb7\x99\x86\xaf\xd8\
+\x6c\xce\xb1\xdd\x77\xef\x42\x26\x97\x41\x10\x04\x18\x7b\x8c\x86\
+\x4e\x43\xe7\x19\x93\xd9\x54\x7d\xfd\xea\xe5\x1f\x87\x8a\x21\x0c\
+\xf6\x30\x34\x6c\x74\x5c\x51\x61\xd1\x27\x2c\x70\xfc\x82\xb7\x60\
+\xe8\xec\x42\x17\xdd\x7d\x16\x0b\x20\x49\xf4\x95\x10\x12\x12\x42\
+\x40\x40\x5b\x5b\x1b\x8c\xff\x19\x0d\x67\xcf\x9f\x5d\xf6\x5b\x73\
+\x63\xd3\x33\x01\x52\x52\xd2\x8f\xcc\x98\xf1\xc2\xf2\x97\x66\xcf\
+\xc6\xa8\xe0\x91\xa8\xd0\xeb\xf1\xcf\x9d\xbb\xe8\xb3\xf6\xd2\x62\
+\x19\xad\x90\xf8\x3a\xd1\x25\x22\x20\x20\x00\xe1\x13\xc2\x11\x11\
+\x31\x11\x2d\xcd\x2d\xa8\xaf\xbf\x50\x7a\xe9\xf2\xc5\xf4\x21\x01\
+\x92\x92\xde\xdf\x12\x1b\x3b\x63\x6b\x62\xe2\x6a\x0a\x23\x21\xbf\
+\xb0\x10\x37\x5a\x6f\x42\x41\xb4\xb8\xdd\x6e\xd8\xed\x76\x9e\xbd\
+\x42\xa1\x80\x42\xa9\xe0\xef\xb8\x9d\x22\x04\xb9\x1c\xd3\xa2\xa3\
+\x11\x14\x14\x88\xe3\xc7\xeb\x8e\x35\xd4\x5f\x78\xfb\x09\x80\xb5\
+\x6b\xb3\x3e\x8a\x8a\x8a\xca\x49\x4a\x5a\x0d\x8b\xd5\x0e\xb3\xc9\
+\x84\x95\xba\x55\xf0\xa7\x2c\x59\xf0\x91\x81\x81\xd8\xbd\x67\x17\
+\xe4\x04\x56\x7d\xac\x06\xd5\xdf\x54\x43\xa9\x50\x71\x9a\xd8\xbc\
+\xcb\xe5\x42\x68\xe8\x28\x4c\x8e\x9a\x82\x53\xdf\x7e\x5f\x7a\xe9\
+\x52\x43\xba\x0f\x20\x2c\x6c\xcc\xac\x82\x82\x82\x6b\xc9\xc9\x89\
+\xe8\xef\xef\xe7\x80\x3f\xff\xf2\x2b\x3e\xde\xb9\x03\x7e\x7e\x7e\
+\xe8\xef\xb3\xe0\xb3\xd2\x7d\x88\x9a\x32\x05\xff\x92\xd0\x26\xfa\
+\xbf\xb5\xa0\x10\x26\xe3\x7d\x08\x32\x19\xdf\x15\xd3\x46\x74\x4b\
+\xf0\xf7\xf7\xc7\xf3\xe3\xc6\xa1\xa1\xa1\x7e\x66\x73\x73\x53\x13\
+\x07\xa8\xa8\xa8\x6c\x9c\x37\x6f\x6e\xec\x38\x9a\x70\x8a\x22\x64\
+\x94\x56\xed\x89\x13\xd0\x97\xe9\x31\x6c\x98\x1a\x56\x02\x2d\xd3\
+\x97\x23\x7a\xea\x34\x0e\x60\x26\x80\x4d\x1b\x72\x61\x32\xdd\x87\
+\x4c\x46\x21\x24\xf7\x03\x65\x00\x17\xbd\x3f\x69\x72\x24\xb4\x1a\
+\x6d\x7b\x59\xd9\xbe\x49\x42\x4e\x4e\xfe\xd2\x39\x73\x5e\xae\x89\
+\x8f\x7f\x03\x56\x9b\x9d\x6f\x95\xa1\x5e\xb9\x7a\x1d\x1b\x36\x6e\
+\xa4\x85\x1a\xb8\x88\x02\x81\x3e\x95\x95\x95\xd0\x6a\xfd\xf0\xe5\
+\xa1\x43\x38\x59\x57\x07\xb5\x5a\xed\xd1\xc1\x2d\xf9\x74\xf4\xd2\
+\x15\x19\x19\x89\xd6\xd6\x3f\xe7\x0b\x79\x79\x85\xc5\x3a\xdd\x3b\
+\xb9\x13\xc2\xc3\xe1\x74\x3a\xf9\xa4\x9b\x6e\x9b\x43\xc4\xdc\x57\
+\x5f\x43\x20\x71\xcf\x82\xbb\x28\x4b\x9b\xd5\xc2\x98\x20\x81\x95\
+\xc4\xbf\x82\xd7\x03\xbc\xbe\x92\x24\xdf\x98\x51\xe6\x47\x89\xf5\
+\xf6\xf6\xea\x85\xc2\xc2\xe2\xda\x82\x82\xdc\x25\x0e\x87\x93\x5b\
+\x8f\x01\xb0\x6d\x2a\x14\x4a\x94\x95\x57\xe0\xe0\x17\x07\xe1\xaf\
+\xf5\xf7\x04\x93\x06\x32\x95\x86\x18\x7b\xff\x3f\xb8\x0d\x42\x79\
+\xf9\x7e\x29\x35\x35\x09\x8f\x03\xb8\x5c\x6e\x68\x28\x8b\x92\x92\
+\x5d\x38\x70\xe0\x73\xa2\x46\x4b\x0e\x92\x13\xe7\x32\x8f\xfd\xbc\
+\xd9\x0f\x05\x4a\x54\xf9\x07\x0c\x87\xb0\x6f\x6f\xa9\x94\x9e\x91\
+\xf6\x04\x80\x28\xba\x38\x9f\x0a\xa5\x1c\x3d\xa6\x3e\xe8\xf5\xfb\
+\xf1\x47\x4b\x0b\xb9\xcc\x02\x43\x47\x3b\x94\x4a\x15\x54\xa4\x81\
+\x9c\x01\xd1\x2d\x0d\xa0\xf8\xc6\x2c\x05\x61\xf7\xa7\x7b\xa5\xcc\
+\xac\x8c\x41\x01\xd8\x98\x3d\x63\x40\x32\x41\x0e\x37\xb3\x22\xcd\
+\x31\x4d\x9b\x9a\x9a\xb0\x63\xfb\x76\xf4\x90\x55\x59\xd1\x79\x28\
+\x1c\xa0\x89\xbf\x43\x3b\x7e\xea\x0e\xbc\x00\x2c\xa8\xe8\x74\x71\
+\x0b\x33\x23\xf0\x39\x12\x5d\xad\x52\xa3\xa8\x20\x9f\xc0\x1a\x69\
+\x47\x4a\x3c\x8c\x20\x51\x16\x41\xc1\xc1\x10\xb6\x6d\xdb\xfe\x53\
+\x5e\xde\xa6\xd7\x9f\x05\xe0\x22\x00\x91\xb2\x62\x99\x59\xad\x36\
+\xd8\x9d\x0e\x5a\xc7\xe6\xdd\x48\x49\x5c\xc5\xc7\x5e\x7d\x7c\x97\
+\x4c\x30\x08\x45\x45\xc5\x5b\x17\x2e\x5e\xbc\x65\x7a\xf4\x54\xca\
+\xd0\x39\x28\x00\xfb\x85\x24\x50\x91\x75\xe3\xdc\xf9\x73\x58\xbc\
+\x68\x21\x6c\x04\x60\xef\xb7\xd1\x63\x19\x4e\xd4\xd4\x52\xfb\x38\
+\xc2\xeb\xc2\xab\x00\x13\x9c\x34\xd2\x0b\xf9\xf9\x45\x09\x11\xe1\
+\x13\xeb\xde\xd5\xad\x80\xcd\x6e\x1b\x14\x40\x22\x3a\xda\xdb\xbb\
+\xb0\x2e\x33\x13\x26\xb3\x11\x66\x63\x0f\x4e\x9f\x39\x07\xbb\xc3\
+\x01\x07\x35\xbb\x3b\x77\x6e\x63\xd3\xfa\x6c\xde\x56\x7c\x4d\x8e\
+\x12\x52\xaa\x95\xf3\xb9\xd7\x32\x33\x3f\xf8\x4e\xb7\x6a\xe5\x82\
+\xa9\x51\x91\x1e\x3a\x1e\x03\x60\x02\x1e\x3d\xfa\x35\x6a\x6b\x6a\
+\xd0\xd3\x73\x1f\xdd\xf7\xee\x51\x9f\x2a\xa1\xc6\x16\xc5\xab\x5f\
+\x43\x81\x97\xc4\xbf\xc9\x1b\xa3\xf7\x22\x4b\x5b\x6f\xb5\xdf\xf2\
+\xe3\x00\xc3\x03\x86\xcf\x2a\xfe\x70\xc7\xb5\xa5\x4b\x17\xe1\xb9\
+\x11\x23\x48\x50\xe7\x23\x00\x4c\xbc\x96\xdf\x5b\x91\x9b\xb3\x99\
+\xfa\x8f\x11\xa6\x9e\x07\x3b\xa0\xf6\xcd\x76\x60\x34\x1a\x91\x96\
+\x94\xc8\x6b\xc5\x5b\x23\x04\x30\x93\x00\x9a\x7c\xed\x3a\x23\x23\
+\xab\x2e\x22\x22\x32\x21\x25\x75\x0d\xec\x36\x1b\xb9\x45\x7c\x44\
+\x03\x19\xe4\xb8\xd9\xf1\x37\xce\x9c\xfa\x01\x8b\x12\x96\x40\xad\
+\x51\x51\x13\xb4\x72\xcb\x5e\xb9\x78\x11\xbb\x4a\x76\x52\x63\x1c\
+\xe6\x01\x90\x0b\xa5\x1d\x1d\x1d\x03\xed\xda\x7b\xad\x59\x93\xa2\
+\x8f\x89\x89\x49\x4e\x4d\x65\x6d\xdb\xea\xb1\xa7\xd7\x45\xa2\x9b\
+\x37\x3d\xb7\xdb\x45\x2e\xb2\x53\xaf\xb2\xd3\x4e\x45\x12\x52\x83\
+\xb4\xe4\xd5\x44\x5b\x37\xaf\x74\x41\x90\x1d\x33\x74\x19\x9e\x3c\
+\x70\x06\x4e\xb5\xb4\xba\xb0\xd0\x91\x09\x2b\xde\xd3\x21\x38\x28\
+\x88\x84\xb4\x7b\xbc\x4f\x36\x75\xb0\x3a\x20\x61\x19\x7d\x22\x01\
+\xa9\xa8\x0e\x0e\x7f\x55\x85\x23\x55\x07\x79\x65\x53\xf0\xd2\xce\
+\xdb\x9d\x43\x1f\x99\xbe\x87\x82\x10\x5b\x55\x75\xf8\xb4\xd9\x6c\
+\x0a\x8d\x8b\x8b\xc3\x98\xb1\x63\x79\xb6\x8c\x2a\x27\x05\x67\x35\
+\x63\xb1\xf4\x23\x7b\xdd\x5a\xfc\x75\xa3\x95\x9d\xcd\x56\xb2\xe7\
+\x9c\x0e\x83\xe1\xd9\x87\xfe\xc3\x57\x76\xf6\xfa\x05\xd4\xeb\x97\
+\x51\x01\xbd\xa8\xf5\x53\xc5\x3c\x3c\x17\x12\x32\xba\x4d\xa5\x56\
+\x35\x6a\x34\xda\x93\x3a\xdd\xf2\xa3\x43\xc5\xf8\x1f\x65\x0b\x62\
+\x2d\x09\xd8\x66\x56\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\x8f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x56\x49\x44\x41\x54\x78\xda\xad\x95\x7f\x4c\x5b\x55\
+\x14\xc7\xcf\x7d\xaf\x14\x28\xf4\xb5\xd8\xc2\x60\x05\x29\x20\x73\
+\x2a\x73\x8a\x19\x64\x6e\xb8\x4d\x96\x2d\x48\x86\x03\xb7\xc5\x39\
+\x40\xb3\x1f\x2c\xb0\x64\x33\x26\x46\x64\x89\xdb\x0c\xd1\xa9\x8b\
+\x31\x33\x4c\x19\xdb\x22\x32\x45\x32\x04\x35\x02\xfe\x9a\xfc\x98\
+\xc6\x31\x1d\x11\xc4\x0c\x41\xa0\xfc\x68\xb7\xf2\xa3\x5d\xfb\x4a\
+\x5f\x7f\xbd\x77\xbd\x7d\x25\xc6\x2c\xf0\x68\x32\xef\x3f\xef\xf5\
+\xde\x73\xce\xe7\x9d\x73\xbe\x3d\x17\xc1\x12\xcb\x99\x5f\xbe\x13\
+\xa9\x95\x07\xe1\xbe\xf8\x6c\x44\x51\xe2\x1e\xc6\x3c\xc0\x90\xf1\
+\x32\xb6\xb1\xd5\x8a\xa6\x93\x97\xa4\xfc\xd1\x62\x07\x73\x05\xe5\
+\xc9\x48\xcd\x5c\x96\x6d\xcf\xd2\x53\x0f\xea\xfd\x51\x01\xdc\x9e\
+\x79\x0f\x24\x3e\x7c\x43\x26\xf0\x7d\xfe\xa3\x01\xe6\xb8\xec\x88\
+\xa6\x93\x23\x41\x03\x1c\xf9\xaf\x24\xa3\x84\xb8\xe1\xd0\xb2\xed\
+\x81\x0d\xd6\x09\x40\x11\xd3\xf9\x0c\x40\x20\x30\x2c\x04\x7e\xcb\
+\x28\x70\x9f\x6f\x03\x3c\x6e\x4a\x89\x6c\x7e\x6b\x24\x28\x00\x5b\
+\x5c\x39\xaa\x78\xad\x58\x8f\x39\x37\x80\xcb\x2b\x7e\x3c\x3f\x38\
+\x01\xc2\x90\x51\x3c\xa7\x52\x75\x40\xaf\x48\x00\xe4\x87\xfa\x0f\
+\x09\x90\x3b\xf3\x85\x41\x59\x7b\x34\x69\x49\x80\x2d\xe7\xc5\x3d\
+\x61\x47\x76\x5f\xa4\x13\xa2\x49\x9d\x38\xe0\x67\x59\xf0\x34\x77\
+\x5a\xb1\xd1\x7c\x88\x69\x79\xb7\xde\x6f\x63\xcf\x7d\x69\x37\xd2\
+\x2d\xab\x92\xe7\x6f\x88\xa2\xb5\x4a\x12\x05\x81\x6f\x62\x1a\xdc\
+\x67\x9b\x0b\x55\x6d\xef\x7d\x22\x09\xb8\xfd\xcc\xd1\x61\xe5\x1b\
+\x07\x92\xb1\x85\xf5\xb7\x13\x9c\xe7\x5b\xad\xcc\xb9\xf2\x7b\x16\
+\xca\xd4\xbe\xef\x4d\xac\x28\xc9\x0b\x64\x41\x6c\x1d\xa7\x1a\x46\
+\xd4\x8d\x95\x29\x92\x00\x7b\xf9\x87\x38\xe2\x85\xad\x20\x58\x1d\
+\xe0\x25\x25\x71\xd7\xb5\x3e\x17\xf5\xfd\xe9\xfa\x85\x00\xd6\xcd\
+\x87\x9f\x0d\x2b\x2d\xa8\x97\x2d\xd7\x90\x5e\xd0\xc0\x35\x74\x00\
+\x73\xaa\x0c\x49\x03\x5e\x3d\x8b\x23\x76\x65\x81\xe0\x16\x80\xfb\
+\xfa\x2a\x30\x95\xfb\x16\x55\x9a\x28\x88\xd7\x6b\x71\xe8\xb6\x4c\
+\x00\x0f\xb1\x6f\xec\x04\xe6\x9d\x52\x69\x80\xad\x82\x00\xb6\x3d\
+\x0e\x30\x63\x05\xc7\x67\xed\xc0\x9b\x67\x54\x9a\x1f\x4e\xdb\x17\
+\x0a\x3e\xbb\xf9\x30\x43\xc7\x69\x6d\x11\x79\xc4\x9e\xa2\x61\xee\
+\x9b\x6e\x50\xd7\x94\x4b\x03\x2c\x3b\x2a\x70\xe4\xd3\xeb\x88\x94\
+\x38\xf0\x0c\x9a\x80\xeb\x1d\x38\x1e\xdd\x7e\xe6\xc4\x42\x80\xe9\
+\x8d\xa5\xc7\x14\xb9\x1b\x8e\xcb\xb4\x11\x40\x79\xbc\x60\x6f\xb9\
+\x0a\x9a\xaf\xde\x96\x06\x4c\xad\x2f\x69\x61\x0e\xe6\x3f\x85\xac\
+\x6c\x20\xa3\xa6\x0e\xbf\x4a\x12\x63\xda\xab\xc6\xff\x6b\x67\xde\
+\x58\x76\x2f\xc2\x30\xa6\xae\x28\x02\x3c\x30\x0e\xd8\x27\x80\xfd\
+\xcb\x8e\xd6\x98\xae\xea\x5c\x49\xc0\xad\xac\xb2\x22\x79\x62\xec\
+\xc7\x91\x99\xf7\x93\xff\x92\x00\x02\xeb\x02\xc7\x95\x3e\xcc\x3b\
+\xb8\x63\x18\x50\x1b\x11\x3d\x20\x8c\x73\xa8\x48\xe5\x09\x66\x7f\
+\x2e\xa2\x6e\x93\xea\xb9\xdd\xc0\x76\xfd\x01\x5e\xf3\x6c\x71\x6c\
+\xd7\x07\x75\x92\x00\xff\x32\xad\x2d\xb9\xae\x5a\xf7\x70\x7a\x88\
+\x4e\x03\x98\x17\x44\x33\x0f\x29\x99\xe0\x15\x44\x49\xd2\x1a\x06\
+\xe4\x7a\x2d\x31\xb4\x00\x78\x7d\xe0\x31\x98\x81\xfd\x6d\xa0\x27\
+\xee\x97\xea\xc7\xee\x8c\xb5\xa8\x42\x8c\x19\x7b\x47\x99\x35\x0f\
+\xe9\xe5\x49\xb1\x24\x7d\x9f\x5f\xe6\xe2\x58\x40\xe1\x61\x80\x9d\
+\x2e\x32\x88\x48\x26\x21\x34\x78\x46\xcd\x60\xbf\xfe\xa7\x41\xd7\
+\x7d\x21\x69\xa1\x38\x92\x12\x9c\xcc\xd8\xff\xad\x5c\xa5\xda\x12\
+\xbe\x52\x07\xf2\x38\x92\x8d\x8f\x0f\x38\x11\xcd\x7b\x6e\xce\x02\
+\x37\x60\x04\x8f\xcd\xf6\x5d\xfc\xb5\x73\x5b\x17\x8b\x21\x09\x10\
+\x33\xc9\x3c\x90\x2e\xf8\xf8\x43\x32\x8d\x6a\xaf\x26\x3b\x1d\x30\
+\xe7\x02\x6b\x67\x1f\x78\x59\xc7\x05\x8a\x96\x55\xe9\xba\x6b\x7a\
+\xa4\xfc\x97\x04\xfc\xdb\x97\x9c\x97\xb1\x36\x6f\x2d\x08\x93\xb7\
+\xc0\xf2\xf3\x0d\x58\xde\xf1\x7e\x50\xbe\x8b\x1a\x8d\xad\xda\x33\
+\xa1\x58\xfd\x40\xbc\x4c\x4d\x86\x19\x51\x13\x52\x47\x42\xf8\x32\
+\x06\xf0\xe4\x14\x70\x64\xb0\x09\xe2\xdd\x80\x80\x27\x13\x97\xbb\
+\x69\x99\x4c\xfc\xfd\xa3\x84\xa0\x01\x86\xd5\xcf\xaf\x57\xae\x49\
+\xbb\xa2\xca\x48\x01\xde\x34\x13\xd8\xc4\xc4\xd4\xe5\x04\xec\xf6\
+\x05\xc6\x34\x0a\xdc\x0d\x88\x46\x60\xbf\x61\x04\xc7\xb8\x39\x4b\
+\xdf\x5b\xfb\x53\x50\x80\x91\x55\x45\x5a\x99\x22\x7c\x3a\xea\xd1\
+\x54\xc0\x76\xc7\x7c\x20\x0a\x42\x18\x85\xf8\xd5\x5e\xbb\x73\x5e\
+\xbe\x81\x7d\x4b\xbf\x01\x78\x9f\x37\x3a\xb9\xaf\x6e\x26\xe8\x12\
+\x0d\xa7\x15\x7e\x4a\x54\x93\x4d\x5e\xfd\xd2\x41\xa1\x51\xea\xd8\
+\x98\x27\xd2\xc8\x08\x65\x61\xaa\x67\x18\xdc\x4e\xe7\xdc\xfc\x99\
+\x8b\x64\xd4\x9b\xd2\x7f\x71\xcb\x5d\x35\x79\x72\xd3\x11\x1c\xfd\
+\xe4\x23\x24\x3d\x23\x4c\xf5\x8f\x41\xc2\xaf\x35\x77\xd7\xe4\x3b\
+\xd7\xdf\x2b\x0b\x71\x62\x01\x19\xe3\x13\x26\x18\xbf\x36\x08\xa9\
+\x7f\xd5\xff\xbf\x80\xc1\xd4\x5d\x3b\x64\xb4\xec\x92\x78\x3d\xf2\
+\xbe\x9d\x2b\x06\x1b\x1a\x83\xf1\xfb\x07\x2d\x2b\xd2\x28\x1c\xed\
+\x1c\xa3\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xad\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x74\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x4c\x14\x57\
+\x14\xfe\x96\x65\xd9\xe5\xb5\x3c\x14\x90\x97\x8a\xa8\x54\xaa\x22\
+\x68\x62\x30\x35\x12\x69\x77\xb5\x54\xb4\x1a\xad\x08\x49\x6b\x63\
+\x6c\xda\xaa\x3f\x4c\x53\xdb\xa4\x8d\x6d\x8d\xc6\xa6\xda\x6a\x6a\
+\x1a\x6b\x2a\x68\x1b\x14\xa9\x2f\x62\x4b\x77\x15\xa9\x45\x05\xa4\
+\x95\x87\xc8\x43\x44\xe5\xa5\xbc\x96\x65\x61\x77\x67\x67\x67\x77\
+\x66\x7a\x66\x20\xd5\xd2\x8c\x9d\xe4\xe6\xde\xb9\x33\x73\xbe\x7b\
+\xce\xf7\x9d\x73\x46\x85\x09\xd7\xa6\xf2\xa1\xfd\x11\x01\xaa\x5d\
+\xd2\x5a\x10\x9f\xee\xf3\x02\x20\xd2\x06\x2f\x8a\xf2\x9a\x97\xd6\
+\x34\xbc\x3c\xad\x79\x11\x1e\x1e\xbf\x5d\x58\x15\xf5\xea\x44\x7b\
+\xaa\x09\xc6\x4b\xb7\x27\xf9\xaf\x2c\xe8\x64\x21\xe0\xbf\x97\x04\
+\x28\xf0\x63\xa8\x12\x90\x28\x19\x87\x08\xc1\x2b\x22\x51\x07\x34\
+\x0e\x7a\xce\x5e\x5a\x17\xbb\x5e\x11\x60\x7b\x95\xd5\x1c\xe5\x07\
+\x43\xe6\xb4\xa0\x7f\x19\xf6\x8a\x63\xa7\xe5\x68\x78\xbc\xe3\xf3\
+\xf8\xbd\x5b\xba\x27\x97\x2a\xda\x9d\x18\x71\x0b\x0d\xa5\xeb\xe3\
+\x17\x28\x02\x6c\xbb\x6e\x31\xc5\xea\x60\xcc\x48\xd0\xcb\x1e\x08\
+\x64\x98\xf3\x3e\x35\x36\xca\xf1\xb0\x71\x22\x58\xaf\x00\x96\x3c\
+\x71\xd1\xf0\x57\xab\xc8\x1b\x01\x77\x1f\x32\x70\x72\x62\x55\x69\
+\xce\xd4\x25\x8a\x00\xef\x5e\x1b\x34\x47\xa8\x79\xc3\xf2\xd9\xa1\
+\x18\xf5\x08\xe8\x67\x05\xf4\x31\x34\x33\x5e\x1a\x02\x18\x4e\x80\
+\xcb\xcd\xc3\x45\x33\xe3\x26\x10\x02\x64\x69\xcd\xd1\x98\xae\xf1\
+\x42\x1f\xac\xbb\x6c\xce\x9b\x6e\x54\x04\xd8\x7a\xb5\xdf\xec\xe7\
+\x72\x1b\x82\xe2\x42\x60\x61\x78\x38\x09\x84\x25\x10\x69\x96\x8c\
+\xb2\xb2\x71\x3a\xf9\xb8\x61\x2f\xed\xf3\xfc\x18\x5b\xb1\xbc\x1b\
+\x51\x51\xc1\x67\x2f\xbf\x99\xa0\xcc\xc1\x16\x73\xaf\x89\xb5\x38\
+\x8c\xce\xc9\x21\x20\x3b\x0a\xa7\xe5\x49\x39\xa2\xac\xa8\x67\x25\
+\x16\xcf\x31\x08\x8f\x09\x3d\x7d\xf5\xed\xc4\x4d\xcf\x05\xf8\x30\
+\x35\xcc\xf8\x59\xc9\x7d\x74\xf5\x39\x65\xd9\x48\x3c\xc8\x0a\x92\
+\xd7\x02\x19\x1e\x23\x5d\xf4\x8a\xb2\xaa\xa4\xfb\x40\xbd\x16\xd9\
+\x2f\x27\xe0\x4a\xd3\x48\xe1\xef\x5b\x67\xe7\x29\x02\xbc\xf5\x4b\
+\x8f\x79\xcf\x4b\x91\x06\x52\x1e\xc5\xdf\x2b\xef\x85\x6b\x7c\xe4\
+\xd9\x41\xe1\xf0\xa1\xb7\xed\xe4\x95\xca\xc7\x87\xd4\x43\xe1\xe9\
+\xb1\xc0\x35\x38\x8a\xfe\xc4\x78\x12\x80\x80\x92\x3a\xeb\xff\x00\
+\x5c\xec\x36\xed\xc9\x88\x32\x96\x74\x33\xd8\x98\x10\x08\x95\x4a\
+\x85\xf2\x76\x2b\x66\x46\x06\xe1\x5a\x0f\x83\xdc\x24\x3d\xec\x04\
+\x7c\xd7\xe2\xc6\x9c\x9a\xdb\x88\xeb\x2c\x27\x6f\xdc\xa8\xea\x09\
+\x46\xcb\x3b\xdb\x70\xae\x66\xb0\xe8\xfa\xfb\x73\x72\x14\x01\x72\
+\xcf\x75\x98\xf6\x67\xc6\xc8\x00\x8b\x42\x7d\xe5\xbd\x6e\x2b\x83\
+\x88\xb0\x40\xd4\xf5\xbb\x90\x3e\xc5\x1f\xfe\xbe\x2a\xfc\x50\xd9\
+\x8b\xcf\xab\x4f\x22\xa0\xfd\x12\x48\xc7\x78\xd0\xe9\x85\x39\xff\
+\x3a\x2e\x56\x0f\x9c\xaf\xd8\x91\xbc\xee\xf9\x00\xcb\x63\x8c\x5f\
+\xd6\x5a\xe1\x1e\x76\xc1\x47\x2d\xc2\x6e\x71\xe2\xbd\x15\x33\x70\
+\xa2\x79\x14\x71\x94\xad\xf5\x2d\x56\xac\x4a\x8b\x80\xe1\xe0\x3e\
+\x84\xd4\x16\xcb\xdf\x55\xaa\x22\xd1\x5a\x58\x86\xe2\x3f\x9e\x5c\
+\xaa\xfc\x60\x7e\xb6\x22\xc0\x1b\x45\x8f\x4c\x07\x56\xc4\x1a\x59\
+\x22\x30\xbf\x7e\x00\x6e\x3b\x8b\x9c\xb4\x29\x08\x0b\xd0\xa0\xd5\
+\xc6\xa1\xa4\x61\x08\x29\xd1\x3a\xcc\x8b\x19\xcb\xf4\xd0\x23\x05\
+\xb0\xb9\x3d\xe8\xc8\xd9\x88\x61\x3f\x2d\xce\x94\x77\x97\x56\xed\
+\x4a\xcd\x52\x04\x58\x5f\xd8\x6e\xfe\x3a\x6b\xaa\x4c\xb2\x9d\x48\
+\xf5\xa3\xa7\x3e\xe3\x6f\x48\x24\x07\x11\xe1\x0f\x6d\x6e\x04\x69\
+\x7d\x65\x92\x2d\x2c\x0f\x9d\x9a\x04\xe1\x12\x64\x92\x8b\xca\xba\
+\xcb\xaa\x3f\x4e\x7d\x45\x11\x60\xdd\x8f\xf7\xcd\x87\xb2\xa7\x19\
+\x6e\x3c\xb2\x21\x33\x31\x94\x8c\xab\x70\xa5\x7d\x18\x29\xb1\x7a\
+\x98\x3b\x1d\xc8\x21\x92\x47\x5d\x1e\xb4\x0c\x71\xf0\xf5\x53\x63\
+\xc1\x64\x2d\x34\x74\x82\x9b\x9d\x23\xe8\x64\x55\x38\x65\xee\x2a\
+\xaf\xf9\x24\x2d\x53\x11\x60\x6d\xfe\x3d\xd3\xe1\xb5\x09\xc6\xe2\
+\x4e\x06\x0b\xf5\x6a\x79\xaf\xd7\xe6\x42\xf4\xa4\x31\x92\x53\xc9\
+\xa0\x96\x6a\xcf\xf7\xd7\x7a\x30\x2f\x65\xca\x3f\xef\x74\x0c\x31\
+\xb0\x89\x6a\x14\x96\x76\xdc\xf8\x73\xf7\xa2\xa5\x8a\x00\xab\x8f\
+\x35\x9b\x8e\x6c\x98\x69\x3c\xdc\x38\x02\xcb\x10\x0b\xaf\x93\xca\
+\x36\xc3\x62\xe7\x6b\x89\x38\x52\x37\x02\xad\x97\x43\x6b\xb3\x05\
+\x86\x45\x11\xf0\xe8\x03\x61\xa5\x70\x09\xa4\xa2\x9b\x95\x1d\xc8\
+\x5b\x3d\x07\xa7\x7f\x7d\x58\xf3\xd7\x17\x8b\x17\x2b\x02\xac\x39\
+\xda\x64\xfa\x76\xe3\x2c\xa3\x54\x6f\xce\xb5\x5a\xe1\x70\xb0\xd8\
+\x90\x12\x89\x40\xad\x1a\x5d\xa3\x1c\x7e\xae\xb7\x60\x46\xb8\x16\
+\x73\xa3\x83\x28\x47\x80\xea\x3e\x16\x2d\x14\x9e\xb4\x84\x10\x68\
+\x28\x64\x3f\x95\xdc\x6f\xa8\xdb\x9b\xae\x5c\xae\xb3\x8e\x34\x9a\
+\x8f\xe6\x25\x19\xec\x44\x98\x20\x48\x85\x8c\x87\x46\xad\x86\xce\
+\xd7\x47\x26\x9d\xe1\x78\xb9\xd0\x05\xe8\x34\x32\xa9\x7e\x94\xe4\
+\x6a\x52\x44\xc3\x00\x79\x4b\xd9\x5d\x70\xa1\xad\xb1\x61\xdf\x92\
+\xf9\xcf\x07\xc8\x4d\x32\x1c\x6b\x73\x60\x73\x62\x80\xbc\x77\xe6\
+\xce\x20\x32\x92\x26\xa1\xfa\x09\x83\x2c\x6a\x44\x81\x24\xad\x53\
+\xe4\x49\x5c\x74\x30\xce\xdf\x1d\xc1\xde\xa5\x11\xa8\x7d\x3c\x82\
+\x3e\xaf\x1a\xf9\xc5\x4d\xcd\x77\xbe\x5a\xf6\xa2\x22\xc0\xca\x6f\
+\xea\x4d\xc7\x36\x27\x1b\xbf\x6b\xb6\x63\xae\x7e\xac\x06\x75\x0d\
+\x38\x90\x3e\x33\x1c\xb7\x7a\x9c\x88\x0d\xd6\x50\x25\x15\x70\xfb\
+\x81\x0d\x93\xe2\x43\xd1\x44\x19\xbf\x26\x29\x08\x37\xda\x86\x31\
+\x2b\x4e\x8f\x82\x33\x4d\xf7\x1a\x0f\x2e\x7b\x41\x11\xc0\x70\xa0\
+\xd6\x7c\x7c\xcb\x5c\x43\x19\xd5\x9d\x13\x15\x7d\xe0\xec\x2e\xac\
+\x4a\x0d\xc3\x6a\x52\xcc\xa7\x15\xfd\xb0\xf4\x3a\xc1\x0c\xd8\xb0\
+\x3b\x37\x99\x4e\x0c\x5c\x6e\xb3\xc3\x61\x75\x62\xf8\xf1\x30\x5e\
+\x37\x24\xe2\x44\x71\x73\x4b\xcb\xa1\x8c\x64\x45\x80\x85\x3b\xcb\
+\x4d\x45\x1f\xa5\x1b\x75\x1a\x35\x18\x8a\x39\x47\xbf\x0c\xd2\x9a\
+\x94\x49\x6d\x93\x24\xeb\xe0\x28\x44\x6a\x48\x7d\x5f\x4a\x34\x27\
+\x65\xfc\x63\x87\x47\xfe\x76\x90\xba\xde\xc9\xe3\xb7\x9a\xef\xe5\
+\x67\x2b\x87\x48\xba\x52\x76\x94\x95\x84\x44\x06\xcb\xf5\x44\xee\
+\x05\x13\x7a\x82\xd4\xc1\x9e\xed\x07\x02\x09\x41\xfa\x6d\x11\xec\
+\xce\x01\x32\x1e\x35\xd1\xde\xdf\xa4\x83\x1f\x46\x01\x3c\xbf\x9d\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x7c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x43\x49\x44\x41\x54\x78\xda\xad\x96\x7d\x4c\x55\x75\
+\x18\xc7\xbf\xbf\xf3\x72\xcf\xe5\x5e\x5e\x43\x41\xe0\x96\xdc\x41\
+\x90\xe2\x9a\x80\x45\x36\xc2\x55\xd0\x9a\x05\x45\xab\x55\xb6\x56\
+\xd6\xd6\x20\x15\xf1\x05\x68\x73\x2d\x87\xae\xb5\x86\xbc\xe9\x9c\
+\x4a\x94\x15\x95\xd3\xc1\x00\xcd\xb6\x70\x96\x85\x03\xdd\xa2\x96\
+\xac\x61\x0a\x8c\x0b\x25\x01\xf2\x22\x78\x2f\x97\x73\xcf\xf9\xf5\
+\xdc\x97\x45\xe1\x4d\x62\xf1\xdc\x7f\xee\xfd\x9d\xf3\xfb\x7e\x9e\
+\xe7\xfb\x3c\xbf\xdf\x2e\xc3\x02\x22\xa7\x2d\x39\xc3\x20\x19\xce\
+\x19\x04\x19\x63\x8e\xf1\x0f\xbf\x4a\xef\x7c\x7d\xbe\x3d\x6c\x21\
+\x80\xac\x73\x49\x03\xe5\x19\x3b\x62\xc2\x21\xe0\x48\xdf\xb7\xb8\
+\x68\xeb\xd8\x7b\x3a\xe3\xe7\xb7\x17\x0d\xb0\xee\xeb\x44\xfe\x41\
+\x56\x09\x6d\x72\x40\x87\x19\x9b\xce\x96\xa1\xe5\xd1\xce\xdb\x6a\
+\x2c\x08\x90\xde\x9c\x70\xf5\x48\xf6\x5b\x71\x02\x01\x4c\x50\xf0\
+\x6e\xc7\x49\x1c\x4a\x6d\x5a\x3c\x40\x5a\x43\xfc\xf9\x9a\xdc\x5d\
+\x0f\x8a\xb0\x93\xbc\x01\x75\x57\xbe\xc7\xee\x84\x4f\x16\x07\xb0\
+\xae\x7e\x95\xd1\x20\x07\x38\x2a\xb3\xf3\xa1\x51\x05\x66\x42\xec\
+\x39\xdf\x88\xa3\xe9\xa7\x16\x07\x70\x7f\x5d\xfc\x17\xd9\x6b\xb2\
+\x5e\x78\x36\x71\x35\x5c\x84\x18\x55\x19\x8a\x4e\x54\xe2\xe2\x4b\
+\x97\x17\x07\x90\x79\x3c\x8d\x97\x3d\x97\x47\xd2\x33\x90\x69\x8a\
+\x1a\xbb\x3a\xd0\xd4\xde\x52\xf5\xc3\xc6\xab\x85\xff\x1b\xb0\xea\
+\x70\x1c\x2f\x7f\xa5\x18\xe1\x0a\x28\x7b\x1d\x46\x42\x1c\x6e\x3f\
+\x83\x83\x6b\x8f\xcd\xbb\x7f\xde\x17\x92\x0e\xc4\xf1\xc2\xdc\xd7\
+\x70\x5f\x74\x04\x9c\x24\xcf\x69\x4d\x82\x88\x4b\xd7\xae\xa1\xb6\
+\xe5\x4b\x0c\x8d\x0e\xb6\x89\x82\x64\x98\xb3\x4d\x14\x45\x76\xa1\
+\x73\x73\x77\xde\x6d\x01\x49\x55\xf1\xfd\x85\xb9\x1b\x2d\x29\x77\
+\x46\x92\xb8\x4a\xb9\xcf\x86\x4c\x18\x9d\xf2\x1b\x77\xa8\xe8\x1d\
+\xb1\x81\x09\xc2\xac\xba\x6f\xbd\xb6\xf9\xd8\x65\xb6\xba\x6a\x05\
+\x0f\x0a\x0e\x83\xee\x72\x79\x4b\x62\x02\x9c\x4e\x3b\x46\x6f\x4c\
+\x0c\x6e\x78\xec\x99\x65\x4f\xa7\xdc\x4b\x33\x33\x0d\xce\xfd\x94\
+\xcf\xdc\x62\x02\xc9\x09\xb7\x58\x11\x48\x27\x25\xef\xa3\xfd\x60\
+\x69\x07\xd3\xf8\xa7\xf9\xdb\x30\x45\x22\xee\x70\xfb\x5b\xfd\xcd\
+\x29\xb4\xfe\xf8\x13\x8e\x6e\x2f\x81\x83\x3b\x49\x5c\x87\xbf\x90\
+\x28\xeb\x69\x55\x80\x24\x89\x73\x7c\x67\x18\xbb\xa9\x62\xe7\x81\
+\xf7\x9c\x2c\xa5\x32\x95\xd7\x6c\xdd\x82\x29\x97\xc3\xf3\xd0\x24\
+\x29\xa8\x38\xdd\x0c\x97\x0a\x14\x3d\x95\x03\xbb\xcb\xe9\xcb\x4e\
+\xf0\xb5\x8c\xd3\x47\xf7\x7e\x13\x25\x3c\x5f\x5a\x8a\x9b\x93\x37\
+\x3c\xa2\x7f\xaf\xcc\x20\xc9\x08\x0b\x0a\x5a\xcb\x92\xf7\xa5\xf0\
+\x43\xdb\x0b\x3c\x00\x26\x88\x30\x0b\x0a\x2a\x9b\x1a\x91\x9a\xb8\
+\x12\x0f\xdd\xb3\x82\x9c\xd7\xe0\xce\x6f\x78\xe6\x0f\x38\x35\x3b\
+\x96\x18\xa3\xa0\x30\xa3\xa7\x1f\x3a\xd9\xc6\x5d\x92\x47\x90\x7e\
+\x79\x26\x0c\x1e\xb8\x00\xdb\xc8\x28\x4a\x6b\xf6\x3b\x59\xf2\xfb\
+\xa9\xbc\xb6\xa8\x18\xd3\x5c\xc5\x6f\x8e\x6e\x8c\xe9\x34\x1d\x9f\
+\xb7\x23\xca\x62\x46\xe8\xdd\x13\xd4\x1b\xdf\xa8\x31\x5f\x13\x3d\
+\xcd\xe0\x9e\x69\x0a\x09\x08\x46\xa0\x21\x10\x11\x01\x91\x08\x33\
+\x44\xc2\x62\x8a\x85\x89\x85\xd0\x13\x8d\xce\xb9\x11\x6f\x94\x57\
+\x80\x25\xee\x4e\xe2\x2f\x6e\x8a\x45\xf7\x50\x0f\x04\x26\xc1\xa8\
+\x48\x68\x6d\x98\xc4\x92\x58\x05\x2b\x93\x4d\xf0\xf5\xde\x6f\x08\
+\x82\x8e\x91\x21\x8d\x3a\xad\x51\x35\x64\x9c\xae\xc1\xa4\x98\xb0\
+\x54\x8e\x81\xd1\x61\x41\x5d\xfd\xc9\x5f\x58\xf4\x36\x2b\x7f\xa2\
+\x70\x29\x54\x87\xd7\x65\xd9\xc8\xd0\x7a\x62\x1c\xc6\x50\x86\x94\
+\x47\x42\xa0\xa9\xfc\x5f\x01\x22\xbd\x5b\xbf\x67\x10\xb2\x32\xbb\
+\xe6\x19\x07\x02\xcb\x0a\xc3\xef\xfb\x6c\x8c\x45\x17\x58\x79\xce\
+\x8e\x08\xcc\xd8\xbd\x42\x5e\xc0\x18\x8d\xaa\x8e\xcc\x97\xc3\x09\
+\xec\xb5\xc3\x5f\xb8\xbd\x77\x0b\x31\xe1\x9f\xeb\x3a\x67\x38\xf3\
+\xf1\x30\xba\xdf\xe9\x26\xc0\x66\x2b\x5f\xbf\x73\x16\x20\xd1\x86\
+\xb6\x86\x31\x8c\xf7\x3a\xf1\x70\x7e\x04\x64\x89\xf9\x3d\x03\xbe\
+\x79\x84\x24\x13\x40\x9a\x73\x25\x10\xe0\x6c\xed\x30\x7a\xf6\x12\
+\x20\x2a\x7f\x39\x5f\x5f\xb2\xec\x2f\x80\x48\x80\xf6\xfa\xeb\x98\
+\xb2\xa9\x93\x77\xa5\x07\x05\x25\xac\x31\x7b\x6d\xf2\x03\x11\x0d\
+\x0c\xdf\xd5\x0d\x63\xb2\x5f\xa5\xfe\xcd\x42\x05\x49\x20\x27\x70\
+\xc1\x56\xd1\xf7\x80\x07\xf0\xe4\xae\x18\xcc\x38\x34\xaf\x45\xb2\
+\x88\xd6\xe3\x23\xe8\x2a\xfe\x95\x59\xb6\x58\x79\xda\xab\x77\x20\
+\xd0\x4c\xd7\x82\xe6\x6e\xe2\x1c\x00\x55\x37\xd0\xe3\xb8\x05\x3c\
+\xd0\x61\x87\x7d\x58\x2b\x1b\xa8\xee\x2d\x22\x91\xe5\xdc\x1c\xa3\
+\x80\xfb\x76\xbb\xaf\x8a\xe9\xeb\x4e\xf4\x95\xf5\x31\x4b\x81\xf5\
+\x33\x70\x6d\x43\xc2\xe3\xa1\xe0\xc1\x43\xf8\xaf\x31\xd1\x15\x86\
+\xa1\x4b\xf6\x2b\x03\xd5\x7d\x09\xf3\xde\xa6\x96\xad\xd6\x5c\x4d\
+\xd5\xdf\x24\x8b\x32\x75\x7d\x7e\x71\x77\xe3\xe9\x5f\x8d\x2e\x0a\
+\x42\x59\x7f\x55\x6f\xc9\x9f\x4b\x10\xa3\xe6\xb1\xa4\x83\x3c\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x85\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x4c\x49\x44\x41\x54\x78\xda\xd5\x55\x4b\x48\x54\x61\
+\x14\xfe\xce\xdc\x19\x27\x2d\x0b\xac\x88\xac\x4c\x67\xb2\xc0\x4a\
+\xb1\x98\x1e\xe3\xab\xcc\x47\x5a\xad\x0a\x72\x13\x44\x9b\x8a\x1e\
+\xab\x88\x56\x6d\x22\xa2\xa8\xc0\x22\xc4\xa2\x36\x2d\xda\x04\xda\
+\xf4\x30\xb1\x07\x41\x11\x5a\x0c\x9a\x41\x39\x3a\x6a\x51\x04\xe3\
+\x6b\x9c\xb9\x3e\xe6\x3a\xf7\xfe\xfd\xff\x7f\x9d\x4a\x2a\x68\x7a\
+\x2c\x3a\x9b\x73\xbe\xf3\x9f\xfb\x7f\xe7\x1c\xce\x7f\x2e\xe1\x1f\
+\x0b\xfd\xff\x04\xf5\x6b\xe7\x1e\x6b\x0b\x0c\x9f\x52\xc8\x02\x0b\
+\x91\x64\x54\x48\x30\x73\xcc\x6d\xe1\x53\x84\x9f\xfb\x14\x71\xc6\
+\x9d\x24\x7d\x02\x4f\xfa\x49\xc4\x99\xb1\xe2\x1b\x45\xa1\x4f\xdb\
+\xbd\x43\xa9\x92\xe0\x6e\xc9\x02\x56\x78\xf6\x38\xb4\xbe\x0e\x30\
+\xc3\x30\x59\x15\x9b\xd4\x4c\x9f\x30\xd3\x98\xc4\x30\x74\x30\x71\
+\x6e\xb1\xc8\x58\xd3\x56\xcc\x58\x7e\x06\xc6\x04\x3b\x6c\xd3\x13\
+\xd1\x78\xa0\xa6\xbd\xaa\x75\x30\x9b\x9e\xec\x2d\x62\x2b\xf6\x54\
+\x21\xd0\x50\x8d\x39\xa5\x87\x64\xf0\xc0\xa3\x5a\xa9\x67\x17\xef\
+\xfd\x8a\x79\x85\xc9\x2b\x37\x4a\x1c\x6a\x7b\x20\xf5\xcc\x9c\x12\
+\xa9\xc3\xed\x8f\xa5\x9e\xb1\xbc\x50\x6a\xd5\xeb\xc1\x0b\x8f\x8a\
+\x5d\x6d\xfd\x44\x75\x65\xe9\x2c\x67\x6b\x26\xc2\xbd\x7e\x91\xc6\
+\xd4\x8c\x7f\x50\x81\x14\x91\xf5\xb7\x76\xac\x3a\x1e\x9f\x52\xb4\
+\x13\xe1\x96\x7a\x34\xdf\x1f\xc6\x9e\xd6\x3e\xa2\x9b\x65\x0e\x96\
+\xbd\x8d\x13\x74\xf9\x65\xe9\x7f\x24\xbc\x45\xa2\x55\xb6\x69\x36\
+\x3c\x6b\xe8\xc3\xfe\xf6\x41\xa2\x1b\x25\x19\x2c\xb7\x22\x13\x21\
+\x7f\x57\xdc\x04\xf4\xdd\x0c\x0a\x02\x06\x5b\x82\x82\xa7\x4d\x03\
+\x38\xf8\x9a\x13\x5c\xdf\xc4\x09\xca\x96\x20\xd4\x15\x1f\x81\xb8\
+\x7c\x62\x4c\x87\x36\x6a\x7c\xbd\x5e\xd7\x91\xe2\x72\x63\xd8\xfb\
+\x1c\xed\xaf\x54\x1c\xee\x08\x12\x5d\xdb\x90\xce\x5c\x25\x4e\x04\
+\x3b\x7f\xbd\x45\xe2\xf2\x11\x35\x0a\x45\x37\xe0\x70\xcf\x07\x8b\
+\x46\xa0\x58\x13\x10\x25\x2b\x0c\x5e\x81\x85\xcf\x72\x82\x5d\x41\
+\xe3\x55\x1f\xe8\x4a\xc1\x62\xe6\x2a\x76\x62\xa8\xf3\xd7\x2b\x10\
+\xef\x20\x38\x14\x81\xab\x62\x31\x5e\x8f\xe7\xc0\x5e\x7c\x04\x75\
+\x35\x27\xb1\x5b\x79\x04\x0d\x56\x19\x63\xb5\x11\xbc\xcd\xc3\xa0\
+\x9a\x82\x34\xb6\xa6\xd0\x89\xc1\xb8\x2a\x20\xa8\x61\x0d\x8f\x5f\
+\x05\x60\xdf\x50\x01\xcb\x92\x3c\xd4\xdf\x6b\x40\x6d\x5a\x17\xc6\
+\x0d\x73\xaa\xac\x56\xc2\xcb\xb7\x21\xd0\x85\xbc\x45\x6c\x5d\x3e\
+\x27\xf0\xc5\x47\x10\x54\x23\x68\xee\x0e\xa1\x28\x6d\x16\x6e\x05\
+\xed\x70\xd8\x0d\xe4\x24\x45\x31\xc1\xcc\x73\xe2\xba\xe5\x23\x27\
+\x38\xbf\x7e\x21\x73\xbb\x9d\x18\xe8\x88\x6f\x4c\xad\xbc\xcf\x2f\
+\x7b\x82\x18\x18\x8d\xc2\xca\x6f\x13\xaf\x3a\xca\xfb\x9f\x98\x9c\
+\x8c\x71\x55\x45\x28\xa2\x8b\xb5\x72\x94\xce\xac\x5d\xc0\xf2\xd6\
+\x38\xd1\xff\x1b\x53\x24\x77\xcf\x37\xa3\x2a\xa6\x28\xd5\x5d\x80\
+\x40\xf3\x53\x3c\x7c\x1b\xc6\x69\x5f\x88\xe8\x94\x2b\x95\xe5\xbb\
+\x1c\xe8\xef\xec\xfe\xe3\x87\xc6\xf8\x43\x33\x34\x0d\xf6\x44\x3b\
+\x9a\x7c\x41\x54\xfb\x55\xa2\x13\xab\xe6\xb1\xfc\xdc\x0c\x04\x7c\
+\x9c\x80\xd7\x44\x7c\xe7\xb0\xc9\x95\x11\x23\xfc\xb2\x04\x05\x66\
+\x22\xd3\xa8\x89\x15\x45\x66\x1d\xb3\xf5\x88\x86\xa5\x3b\xb6\xa3\
+\xf7\xb6\x07\x0f\xdf\x85\x70\xa9\x7b\x94\xe8\x7c\xe9\x32\xb6\x69\
+\x4b\x29\xfc\x0d\xb7\x91\xb1\xb9\x5c\x06\xf7\x36\x36\x49\x9d\x5e\
+\x5e\xfa\x43\xdc\x7d\xe7\x9e\xd4\x8e\xad\x95\x53\x70\xc6\x96\x4a\
+\x49\xd8\xe3\xf1\xa0\xe9\xc3\x08\x6a\x7b\x38\xc1\xb9\xb2\x2c\xe6\
+\xd0\x55\x18\x64\x91\x7d\x8d\xad\xe2\x9f\x56\xc0\xc5\x88\x9a\x59\
+\x5b\x78\xd6\x86\x3e\xd5\x96\xeb\x43\x9b\xc0\xfd\xf7\x43\x6f\x2e\
+\xf7\x8e\x65\xd1\x3e\x47\x12\x9b\x99\x64\x87\x36\xae\xfd\x95\xff\
+\x1b\x99\xd3\xe4\xbd\xe8\x1f\x5d\x1d\xc3\xff\x54\xfe\x7f\x82\xcf\
+\x12\xb0\x6f\x75\x83\x23\x31\x72\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x04\xb6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x7d\x49\x44\x41\x54\x78\xda\xa5\x95\x6b\x4c\x54\x47\
+\x14\xc7\xff\xf7\xb1\x0f\xdc\x45\x57\x6a\x97\x4a\x2b\xd6\x0a\xb2\
+\x4b\x1f\x60\xa1\xc5\x60\x69\x1a\x01\x15\x48\x6c\x9b\x56\x9b\xb4\
+\xf6\x8b\x35\xb5\x55\x40\x13\xec\x97\x36\x24\xa8\xe9\x43\xda\xf2\
+\xc1\x62\x2d\x89\x36\x9a\xf4\x91\x60\x2d\x31\x95\x46\x83\x6d\x49\
+\x29\x54\x48\x41\x79\x2c\x6e\x8a\x80\x54\x91\x47\x90\x85\x5d\x16\
+\xf6\x75\xef\xf4\xec\x5d\x59\xa0\x0b\x8b\x49\xe7\xe6\xde\xec\xce\
+\x9c\x73\x7e\x67\xfe\x73\x66\x86\xc3\x7d\xb4\xec\x1f\x9e\x50\x09\
+\x82\x78\xc4\xa8\x8f\xce\x5a\xbb\x2c\x36\xc5\xa0\x89\x82\x4f\xf2\
+\xc2\xe1\x75\x80\xe3\x00\x87\xc7\x31\x3e\xe8\xbc\xdb\x74\x7b\xbc\
+\xaf\xa6\x76\xc7\xdf\x9f\xce\xf6\xe5\x16\x0d\x5e\xf9\xe4\x17\xb9\
+\xf1\x5b\xf2\x37\xc6\x64\x20\x4a\xcb\x51\xb0\x61\x4c\xc9\x63\xf0\
+\xc8\x93\x8a\xb3\x5e\x34\x2a\x76\x6a\x41\x0f\xa7\x97\xa1\xa1\xbf\
+\x15\xbf\xf5\xd5\x59\x7f\x7a\xb9\xd1\xbc\x28\xe0\xcd\xea\x2d\xee\
+\xfc\xe4\x7d\x6a\xfd\x12\x2f\x06\x27\x3b\x20\x31\x06\x25\x65\xf0\
+\xe4\x18\x70\x65\xf4\x04\x9a\x0c\x9e\xc6\x22\x54\x5a\x9c\xb7\x5e\
+\x43\x69\xc6\x77\x5c\x58\xc0\xce\x0b\xb9\xec\xf0\xc6\x62\xfc\xe3\
+\xba\x02\x97\xcf\x4e\x96\x33\x41\x43\x3c\x19\x82\x18\xb5\x20\xa2\
+\xaa\xb3\x11\xc7\x32\xab\x16\x06\xe4\x7d\xff\x5c\x7f\x79\xee\x67\
+\x31\x37\x9d\x0d\x98\x92\x48\x67\x08\x81\xc0\x94\xa1\x8a\xe7\x21\
+\x33\x01\x5e\x99\x57\x9c\xfd\x81\x55\xbc\x0c\x81\x5e\xaf\x24\xd1\
+\x6f\x01\x67\x2d\x4d\x38\x91\xfd\xe3\xfc\x80\x94\xf2\xb8\xc3\x1f\
+\xe7\x1d\x2a\xd6\x68\xc6\xe0\xf0\x8d\x04\x83\xfb\xa7\x2f\x70\x6a\
+\xd4\xf7\xf6\xe0\x4a\x5f\xdb\x5f\xa3\x13\x23\xe7\x09\x28\xca\x90\
+\xa5\x68\x9d\x71\xc3\x4a\x83\x31\x77\xb3\x29\x05\x2b\x97\x6a\xf0\
+\x4d\xf3\x9f\xa8\xc8\x39\x37\x3f\xe0\xb5\xca\x1c\x56\x9c\x5d\x88\
+\x9e\xf1\x46\x0a\x2a\xde\xcb\x1c\x10\x79\x2d\x4e\xfe\x71\x19\x76\
+\x9f\xa3\xe8\xd2\xce\xfa\xb2\xf9\x66\x9e\xfe\xd5\x53\xc7\x32\x12\
+\xd2\x0a\x26\x5c\xe3\x38\x9e\x53\x19\x0a\x30\x1d\x8d\x7d\xab\x24\
+\xef\xfd\x93\x06\x83\x93\x74\x9f\x0a\x6a\x2e\x0a\x3c\x7e\xb1\xde\
+\x80\x65\xc8\xfa\x39\x05\x3f\x18\xae\x30\x9e\x2e\x33\xbf\x6e\x34\
+\xac\xf8\xf6\xe2\xae\xba\x19\xc0\x1b\x67\x5f\x64\xdb\xcc\x5b\x15\
+\x03\x73\xf4\x3a\x74\x3b\xea\x29\x6b\x21\xe8\x24\x92\xae\x96\x81\
+\x21\xf0\x02\x55\x0a\x3d\xd3\x8d\x96\x03\xb7\x6c\x36\x94\x65\x9d\
+\x5e\xb0\x58\x94\x81\x82\xea\xdd\x2c\x77\x7d\xbc\xd2\x31\xe9\xf6\
+\x90\xd6\xa2\x52\x8a\x02\x55\x0e\x4f\xaf\x0f\x5e\x4c\xc8\x77\xe7\
+\x04\xf7\x37\x41\xe0\xd0\x79\x6b\x18\x25\xe9\x5f\x87\x07\xec\x38\
+\xb3\x4d\xa9\xb2\xcc\xa4\x24\x3c\x64\xd0\xe1\xb6\xb3\x1b\x76\x69\
+\x0c\x76\x8f\x0d\xa3\xde\x21\xdc\x19\x94\xe0\x75\x73\x81\x2d\x30\
+\xab\xf1\xf4\xdf\x6e\xe3\x50\xb7\xa7\x23\x3c\x60\xba\xbd\x74\x3a\
+\x87\x3d\x9e\x2c\xe3\x8e\x73\x90\xb2\x17\x68\x90\x87\x4a\xc5\xa3\
+\xb5\xde\x85\xfa\x03\x6d\x8b\xee\xfa\x45\x01\x9b\x2b\x5e\x60\x1b\
+\xd2\xf4\x04\x18\x08\xca\x21\xaa\x39\x34\xff\xee\x42\x63\xd1\xff\
+\x00\x3c\x53\x9a\xc2\xb6\x67\x64\x29\x1d\x36\x8d\x05\x83\x13\x03\
+\x24\x47\x00\x20\x90\x0e\x83\x03\x3e\xb8\xa7\x64\x45\x92\xb9\x1a\
+\x91\x44\x23\x12\x1a\x0a\xdb\xc3\x4b\xb4\xf5\xcb\x4c\xb6\x2a\x75\
+\x4c\xe9\xf0\xb9\x38\x45\x9a\xd9\x06\x1c\x2d\x26\x9d\x00\x21\x9b\
+\x86\xa7\xfe\x6e\xab\x1b\x97\x76\x5e\x0d\x0f\x48\xfb\xf0\x59\x65\
+\x91\x75\x31\x6e\xac\x4e\xd0\x42\xf6\xb2\x39\x06\x5e\x7a\xfb\xbb\
+\xdc\xe0\x45\xee\x3f\x00\x9a\xc1\x90\x8c\xa6\x83\x6d\xf7\xb7\xc8\
+\x71\xfb\xcd\xa7\x12\x9f\x5f\xb2\x6b\xf9\x83\x22\x64\x99\x05\x0d\
+\xe8\xd8\x41\xe3\x39\x07\x98\xc4\x4e\xdd\x28\xb7\xee\x0e\xa7\xb9\
+\xe9\xbd\x44\x1d\x55\xdb\xd1\xeb\xa5\x9d\xf9\x21\x00\x53\x91\x69\
+\xfd\xf2\x58\x4d\x4b\x5c\xaa\x16\xd2\xac\x59\xf8\xa5\xb0\x0d\xfb\
+\x60\xfd\xd5\xd9\x4b\xce\x17\x08\x52\x18\x12\xf8\x80\x49\x4b\x39\
+\x95\x6a\x22\xf9\x02\x7f\x3d\xb7\x1f\xb1\xcc\x7f\x16\xc5\xed\x33\
+\x79\x52\x5f\x5d\xaa\xf2\x2f\x28\x9b\x61\x28\x9b\xca\x61\x97\x60\
+\xad\x9d\x84\xe4\x92\xcf\xd0\x70\x4f\x60\x99\xe9\xee\x91\xd9\xdb\
+\x51\x8f\xaa\x57\x3f\xb0\x4a\xc4\xc3\xeb\xb4\xb8\xfa\xb3\x1d\x2d\
+\xc5\x0b\x00\x12\xf6\x9b\x93\x34\x51\xfc\xb5\xe4\xec\x48\xda\x5c\
+\xf2\x1c\x08\x47\x54\x41\x05\x38\x47\x65\x8a\xca\x02\xc7\x35\x8d\
+\x47\x2e\xe3\x21\xaa\x38\x3a\x57\xfd\x05\x01\x74\x5c\x9e\x40\x6b\
+\x89\x65\xe1\xfb\x60\xed\xde\x84\xe3\x86\xc7\x54\x7b\x13\xd3\xf5\
+\x21\x10\xc5\x89\x9b\xfe\xe0\xde\x4d\xc3\x82\x36\x02\xed\x9b\xf6\
+\x1a\x07\xda\x0f\x75\x86\xbf\xd1\xe2\xde\x31\x55\xea\x1e\x11\xb6\
+\x9b\x33\x74\x4a\x30\xd9\xe7\xcf\x96\x2d\x64\xae\xcc\xce\x7f\xf8\
+\xa9\xb4\x3c\x9a\xab\xc6\xd0\xf9\xc9\xf5\xf0\x00\x65\x26\xef\x26\
+\x64\x92\x45\xf5\x8a\x78\xb5\xc6\x48\xda\xea\x0d\x74\x9b\xc9\xa1\
+\x65\xa8\x14\xc1\x90\x0f\xa3\x37\xdd\x18\xe9\xf2\x80\x67\xdc\x47\
+\x5d\x27\xac\x1f\x2c\x0a\x98\x6e\x6b\xf6\x98\x5e\xe1\x24\x6c\x82\
+\xc8\xe5\x44\x44\x71\x6b\xfc\xb2\x08\x11\x1c\xa4\x29\xa6\x54\x9b\
+\x6b\x14\x17\x79\x81\xb5\x30\x1e\x35\xbd\x15\xd6\xda\xd9\xbe\xff\
+\x02\x29\xad\xaf\x28\x79\x31\x1d\xfe\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x04\xe4\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xab\x49\x44\x41\x54\x78\xda\x9d\x96\x71\x4c\x94\x75\
+\x18\xc7\xbf\xbf\xf7\xf7\x1e\x70\x7a\x20\x70\x70\xc0\xc1\x29\x78\
+\xdc\x81\x0a\x8d\x0c\x21\x56\x64\xae\xcc\x55\x6c\x8c\x74\x6b\x93\
+\x42\x36\x75\xa3\xe5\x1f\xfd\x97\x0a\x12\xd0\x5a\xa1\xce\x9a\x2b\
+\xc7\xda\x5a\x5b\x6b\x4e\xe7\x66\x2b\x56\x73\x2d\x66\x9a\x53\xb2\
+\x69\x02\x39\x13\xe4\x2c\x15\x84\x3b\x36\x20\x4e\xe1\xbd\xbb\xf7\
+\xfd\xf5\xbc\xef\xdd\x05\x47\xc1\x92\xe7\x1d\x7b\x8f\xdb\xef\xf7\
+\x7c\x7e\xdf\xe7\x79\x7e\xcf\x73\x0c\x64\x1d\x7d\xef\x09\x2e\x85\
+\xc0\x19\x16\x36\xf1\x3f\xbe\x8e\xfc\xa3\xd2\x5b\x55\x65\xbc\x51\
+\xd2\xc8\xd8\x87\x57\x0f\x08\x57\x8a\x8c\xa4\x04\x01\x4d\x2c\xec\
+\x9f\x31\x0d\x21\x7d\x01\x13\x10\x82\x41\xa2\x47\x3f\x0f\xc3\xec\
+\xa9\xd4\xc8\x5b\x62\x0c\x93\xd3\xc0\xdd\x49\x0e\xd6\xd1\xd3\x2a\
+\xd6\xda\x04\x54\x0d\xd0\x16\x39\xad\x4a\x80\x7e\x5f\x00\x19\x96\
+\x10\x12\x64\x90\xda\x78\x70\x49\x26\xb0\x14\xb3\x27\xba\x55\x26\
+\xee\x4d\x5f\x08\xec\xd3\x6b\x07\x84\xd3\xc6\xa1\x69\xb1\xf1\x11\
+\x31\x1f\x34\x92\x1d\x42\xef\xf0\x14\x46\x27\xa6\x90\x97\x61\x42\
+\x76\x92\x05\x71\x3c\x81\x40\xa6\x59\xc8\x5c\xa3\xaf\x3c\x5e\x52\
+\x78\xec\xd7\x56\x51\x60\x03\xc9\xff\xf7\xe9\x85\xf1\xd0\x5b\x90\
+\x42\xa1\xa0\xdb\xe3\x43\x45\xe6\x4b\x38\xd1\xf3\x05\xd6\xbb\xd3\
+\x91\x9b\x9c\x0c\x59\x4a\x80\xa4\x2b\x89\x86\x2a\xb2\x5f\x22\xc0\
+\xa0\x57\x05\xfb\xe4\x4a\xb3\x70\x65\xe8\x0a\xc2\xce\x34\x23\xae\
+\xb4\x4e\x0b\x03\x34\xfa\xa0\x3f\xaa\xa6\xe0\x42\xff\x7d\xb4\x3c\
+\xd3\x81\x11\xff\x30\xda\xba\xf6\xa2\xa2\xc0\x0e\x7b\xb2\x85\x20\
+\xf1\x86\x0a\x1d\xa2\x45\x8e\x2f\x49\x0c\x83\x23\x0a\xd8\xd1\x5f\
+\x9a\x45\x7e\xa6\x04\x41\x49\x20\x77\xe1\xd4\xd1\x62\x61\x38\x55\
+\x49\x59\xc8\x08\x8f\x86\x00\x2e\xde\xf0\xa2\x69\xe3\xc7\x48\x4b\
+\x4c\xc7\xad\xd1\x01\xb4\x9e\x6d\x42\x99\xdb\x06\x7b\xca\x0a\x4a\
+\xac\x4c\x7f\xfc\x1f\x25\x8c\x12\xed\xd1\x01\x1f\x5d\x6e\x16\x05\
+\x04\xe8\xbb\x3f\x83\xb1\xbf\xfc\xa4\x44\xa5\xb8\x72\x0a\x0b\xa0\
+\x84\x02\x50\x14\x05\x4a\x80\x20\x04\x7a\x30\x3d\x89\xa3\xd5\x9f\
+\xc1\x6e\xb5\x1b\x4e\x3c\x04\x39\x78\xfe\x20\x0a\x56\x9a\x91\x93\
+\x6e\x01\x47\x1c\x79\xe6\x86\x73\x5d\x81\x67\x78\x06\xec\xf0\xa5\
+\x46\xe1\xce\x96\x71\x65\xd0\x87\xad\xce\xdd\x28\x76\x94\xe0\x51\
+\x2c\x18\x0c\xe2\xcd\x53\x0d\x70\x39\x97\xc1\x91\x9e\x08\x2e\x4c\
+\x86\x1a\xce\x25\x0c\xe8\x80\x43\x17\x1b\x45\xbe\x5d\x42\x77\xff\
+\x28\xaa\x57\xbf\x86\x0a\x67\xe5\x23\x01\x74\x53\x94\x20\x1a\x4e\
+\xee\x86\x23\xdb\x8c\xc2\xdc\x54\x48\x04\x31\xc9\x32\x3c\x43\x14\
+\xa2\x0f\x7e\xda\x2f\x9c\x0e\x09\x97\x6e\x8c\x60\x9b\xab\x6e\x49\
+\x80\xa8\x92\x86\xe3\x0d\xb0\xdb\xcd\x28\x76\xa5\x11\x44\xc6\xe0\
+\x3d\x02\xbc\x7f\x7e\xbf\x70\xe7\x70\xfc\xfc\x3b\x85\x68\x4d\x3d\
+\xca\x72\xcb\x97\x04\x30\x6e\x0b\xd5\xfa\xdb\xdf\xec\x43\x8a\x55\
+\x82\x7b\x95\x05\xb7\xee\x3c\x04\x6b\x3f\xd7\x24\x5c\xb9\x32\x8e\
+\x7d\x77\x06\xb5\x8f\xef\x44\x7d\xf9\xae\x25\x03\x74\xdb\xd8\xbe\
+\x09\x71\xcb\x38\x76\x55\x6d\xc2\xed\x7b\x41\xb0\x86\xaf\x6a\xc5\
+\x74\x46\x2f\xce\x7d\xeb\x45\x6b\x75\x3b\xea\x36\xec\x58\xb2\xf3\
+\xd2\xb6\x72\x8c\xfa\x86\x50\xb1\xd5\x8a\x78\x0e\x98\xbd\x45\x60\
+\x45\xef\x3a\x45\xf9\xe6\x24\xfc\xd8\xe9\x43\xdb\x2b\xed\xd8\xbe\
+\x7e\xfb\xd2\x9c\xbf\x53\x86\xd1\xb1\x11\x3c\xfd\xaa\x55\xef\x87\
+\x46\x53\xbc\xd6\xe5\x07\x2b\x6e\x73\x8b\xd2\x2d\x89\xb8\xd0\x39\
+\x86\xd7\x2b\x77\x62\xcf\x53\x7b\x10\xa0\xfa\x37\x2c\x7a\xfb\x23\
+\xd7\x3f\xa8\x06\xe9\x52\x65\x19\xf7\x24\x6a\x8a\x32\x83\xf2\x96\
+\x4a\x3c\x94\xbd\x28\x7b\x31\x0d\x21\x45\x18\xeb\x99\x89\xe1\xba\
+\x0e\x28\x6a\x75\x8b\x27\x5e\x58\x8e\xee\xaf\xfd\x18\x1f\xf2\x43\
+\x51\x03\x46\xef\x31\x4c\x9d\xd3\x22\x09\xe6\x9f\xf1\xe3\x8f\xcf\
+\x07\xe1\x48\x75\x44\x2a\x27\x00\xeb\x36\x1b\xd2\x0b\x93\x50\x5a\
+\x65\x85\xa6\xcc\x36\x4c\x4e\x80\xbe\x1f\x08\xb0\xb6\xd9\x2d\x4a\
+\x9e\xb7\x84\x7d\x48\x73\x5a\xf6\x3c\xe3\x34\x8d\xba\x8e\xdf\xc1\
+\xd5\x96\x1e\x64\xa5\x66\x19\xce\x93\xab\xd2\x90\xe6\x4c\xc4\x63\
+\x35\xd4\xf4\x34\x6a\x15\xd4\xe1\xf4\x5b\xac\x9f\x4f\x07\xfc\x66\
+\x00\x9a\xdc\xa2\x98\x00\x6a\x30\x76\x08\xcc\x1f\x09\x32\x6d\x38\
+\x7b\xe2\x2e\x6e\x1e\x1a\x80\x46\xb3\x21\xa7\x66\x15\xb2\x9f\xb4\
+\x60\xf5\x86\x44\xea\xfd\xe1\x8b\xc5\xb8\x14\xa3\xe0\xfa\xf7\x04\
+\x58\xb3\x8f\x00\x5b\xc2\x00\xb1\xc8\x44\x03\x0d\x99\xcb\xa7\xbc\
+\xa8\xdd\x5c\x8f\x23\x87\x8f\xc0\xf9\xb2\x15\xf6\x75\x66\xca\x87\
+\x8c\x38\x72\x2e\x71\x6e\x4c\xb2\x58\xc0\x14\x58\xe1\x5e\x97\x58\
+\x47\x49\x9e\xaf\x20\x46\x8d\x9e\x34\x02\xf4\x9c\x1e\xc7\x78\xff\
+\x03\xe4\x3c\x67\x86\xad\x90\xe6\x80\xa0\xf6\x66\xd2\xfb\x0e\x35\
+\x38\x29\x76\x60\x19\x80\x33\x04\xc8\x7f\x2b\x5f\x94\xd4\xac\x40\
+\x70\x46\x5b\x18\x00\xa3\x49\xa2\xb7\x73\x12\x69\x85\x1c\x29\x0e\
+\x13\xa8\xe9\xc2\x44\x8e\x75\xe7\xd2\x3c\xe7\x7a\x41\xc8\xf1\xd4\
+\xa1\x4f\x4f\x80\x39\xea\xf2\xc4\xca\x67\x97\x23\xd3\x19\x4f\x9b\
+\x16\x56\xa1\x17\x40\x20\x20\xc0\x65\x61\xac\x33\x06\x3e\x25\x75\
+\x6e\x58\xa2\x26\x51\x41\x8c\x78\x14\xfc\xd9\xf5\x20\x5c\xe9\x39\
+\x3b\xf2\x44\x42\x0a\x55\xc0\xa2\xbf\x5b\x66\xc3\xa5\x6b\x62\x11\
+\xc7\xff\x95\x37\x41\x07\x99\x99\xd0\x30\xf4\xe5\x6d\xf6\x37\x8a\
+\x46\xda\x39\xa3\x36\x76\x11\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\x40\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x07\x49\x44\x41\x54\x78\xda\xad\x95\x6b\x6c\x14\x55\
+\x14\xc7\xff\x33\xb3\x3b\xbb\x9d\xed\x3e\xba\xa5\x0f\xca\xee\xd6\
+\x07\x50\x50\x09\x42\x43\xeb\xfb\x4b\x69\xc5\x57\x09\xfd\xd2\x58\
+\x14\x8d\x31\x7e\x51\x3f\xd0\x26\x58\x35\x8a\xda\xaa\xf8\x40\x10\
+\x05\x83\xb6\x25\x34\x80\x60\x11\x1f\x34\x90\x26\x35\x45\x94\x45\
+\xb0\x3c\xda\x82\xd9\x6a\x37\x2d\x5d\x5a\x59\xba\xbb\xdd\xee\x76\
+\x76\x76\x76\x5e\xde\x6a\x69\x62\xb2\x90\x76\xe9\x99\xdc\x4c\x72\
+\xe7\xdc\xff\xef\xdc\x73\xcf\xb9\x43\xe1\x26\xac\x71\xbc\xba\xe2\
+\xed\xce\xd6\xbd\xa1\xd1\xa0\xd1\xc4\xe9\x90\x6b\xb1\x74\x95\x3a\
+\xee\x7b\xe7\x63\xe7\xee\x43\xd7\x7c\xa8\x54\xc5\xbf\x8a\xe6\xb8\
+\x9a\xfa\x72\x2e\x9d\xfc\xfd\x02\x60\x20\x13\x8c\x0a\x83\x1e\xc8\
+\x9d\xc3\xe2\xe1\x5b\xee\x6f\xff\xf2\xf6\x8e\xd2\x9b\x02\xb4\x08\
+\x4b\x7d\xf5\x17\x05\x47\xd7\xc5\xbf\x40\xe9\x35\x18\x69\x0a\x1c\
+\xab\x81\x4b\xa7\x60\x4a\x03\x9e\x9c\xff\xf8\xf0\xc6\xb9\x87\xe7\
+\xa5\x0c\x68\xe6\x5d\xda\xe5\x78\x19\x5e\x3b\xd2\x00\x23\xd9\x01\
+\xa7\xa3\x60\xe0\x68\x98\x59\x1a\x16\x13\x8d\x2c\x13\x83\x2a\x57\
+\x55\x6d\xca\x00\xb7\x56\x76\x7c\x31\x2a\x1f\x2c\xe8\x58\x0f\x21\
+\x1a\x81\x95\xd5\xc1\x40\x20\x36\x22\x6e\x49\x23\x83\x05\x1e\xc8\
+\x59\xc6\xa7\x04\xd8\x3e\x96\x5b\xb2\xc0\x78\x5b\xdb\x42\xb6\x88\
+\x09\xc2\x8e\xd5\x1d\xf5\xd0\x23\x01\x6b\x1a\x0b\x9b\x81\x41\x86\
+\x91\x81\x8d\x00\x0a\x6c\x73\x67\x7e\x06\x5f\x8c\xe5\xbd\xc4\x31\
+\xc6\xcf\xee\x36\x15\x43\xd0\xc2\xf8\x33\xee\x45\x06\xbd\x0a\xfb\
+\x7d\xed\xf0\x46\x3c\xc8\x22\xf9\xb2\x93\x34\x65\x92\x73\x28\xb2\
+\x17\xdf\x78\x07\x25\xdd\x5c\xd1\xb8\xa4\x96\x87\x05\x59\x03\x43\
+\xff\xf4\xca\x92\xac\xe7\x18\x70\x4f\x17\x9a\x56\x80\x05\x07\x77\
+\xec\x17\xf4\x8e\xf9\x31\x22\x2a\xc8\x34\x2c\x42\xb6\x71\x01\x82\
+\x62\x1f\x9c\x26\x19\x7a\x66\x0e\x2e\x8f\x9b\x5e\x4d\x0a\xa8\xe8\
+\x35\xe7\xeb\xa1\x79\x28\x8a\x32\x46\x13\x2a\xfc\x71\x19\x15\xb7\
+\xda\xe0\x34\x5a\xb0\x9c\xbb\x07\x13\xc5\x77\x26\x76\x02\xe7\xc7\
+\x82\xf8\xe3\xaa\x88\x11\x41\x45\x42\x91\x89\xb8\x02\x45\x36\x21\
+\xaa\x51\x88\x05\xc7\xbf\xc1\x5a\x54\x26\x05\x54\xf5\x59\x34\x27\
+\x69\x1c\x3d\x45\x63\x88\x4f\xc0\x69\x66\x71\xa7\xd9\x8e\xa5\x69\
+\xf7\x42\x25\xcf\x69\xde\x8d\xae\x50\x10\x9e\x90\x88\xde\x91\x04\
+\x86\x02\x0a\xc4\xbf\x75\x03\x59\x8b\xb0\x26\x14\x95\xf5\x8a\xa4\
+\xd3\xe3\x29\xd9\x0d\x5c\xa7\x0f\x9e\xf5\x5a\xb5\x02\x9b\x11\x2c\
+\xcd\xa0\x37\xcc\xe3\xae\x8c\x4c\x3c\x6a\x2d\x21\xc7\x28\xe0\x37\
+\xfe\x57\xf4\x04\x47\x71\x21\x2c\xc2\x7b\x55\xc6\x70\x48\x46\x7c\
+\x48\xc7\xa3\x5a\x4e\x4f\xa6\x95\x14\x50\xe9\x31\x6b\xd9\x64\x07\
+\x3a\x3d\x8d\x00\x2f\x62\xa1\xd9\x81\xb5\xd9\xc5\x38\xc6\x1f\xc3\
+\xd9\x40\x18\x9e\xa0\x88\xfe\x00\x11\x27\x43\xf0\x93\xf6\xe5\xe9\
+\x65\x78\x43\x3c\x3f\x6d\xc0\xca\x6e\xae\x2d\xdd\x40\x95\xd1\x60\
+\x20\x48\x12\x06\x22\x12\x9e\x5f\x9c\x83\xc1\x08\x8f\x9e\x80\x00\
+\x6f\x40\x82\xdf\xaf\x22\xee\x27\xb5\x98\xc0\x07\x78\x3d\x51\x7b\
+\xbd\x42\x49\x0a\x58\x7e\x5a\x5f\x48\x51\x4c\x27\x4d\x03\x31\x59\
+\x05\x1f\xd3\x30\x12\x93\x30\xdf\xa6\x43\x64\x54\x85\xef\x8a\x0a\
+\x79\x84\x88\x4b\xc4\xd9\xac\xb5\x61\xbd\xb4\x6a\x46\x80\x09\xb3\
+\xff\x8c\xcd\x06\x05\xd5\x9a\x42\x21\x2a\x52\xe0\xe3\x2a\x10\x9d\
+\x88\x58\x01\x22\x64\x99\xc4\x00\x34\x99\xa3\xb5\x4e\x6c\x90\x57\
+\xcc\x18\xf0\xed\xce\xb6\x27\x6a\xee\x58\xf7\xe3\x40\xd0\x0f\x08\
+\xc4\x2d\x4e\x2e\x1c\x91\x08\x92\x96\xf8\x6f\x10\x27\xf5\x5f\x89\
+\xb3\xd8\x20\x15\xce\x08\xf0\xe9\xe7\x0d\x8e\x35\xab\x1f\xf3\xed\
+\x6b\x3e\x88\xda\xbc\x1a\x05\x34\xc5\x40\xd4\x26\xf2\x4d\x22\x9f\
+\x04\x28\x93\xab\x75\x54\x1d\x6a\xa4\x37\xa7\x0d\x20\xe2\xce\xf2\
+\xf2\x47\x06\x8f\xb6\x1e\xc1\x89\xa3\x27\xbf\xde\x7b\xb8\xa9\x0a\
+\xbb\xd9\xb7\x88\xf8\x46\x24\x26\x21\x2a\x79\x6b\x93\x0b\x0c\x94\
+\x15\x2f\x4b\x91\x69\x01\xb6\x6d\x6f\xcc\x5f\x59\xfa\xd0\xc0\x99\
+\xce\x73\x68\xfd\xa1\x75\xe8\xc0\x81\x66\xc7\xd4\xc7\x46\x83\x95\
+\x44\xff\x0c\x14\x6d\x1d\x89\x7e\x22\x25\x02\x29\xb2\x17\xf0\xa2\
+\xb4\x07\x37\xb0\xff\x01\xba\x7a\x3c\x03\xbe\x41\x5f\x7e\xd3\xae\
+\x5d\xbe\x43\x07\xf7\xb9\x30\x0b\x36\x05\x38\x75\xea\x9c\x4f\x54\
+\x44\xc7\x96\x0f\xb7\xfa\xbe\xfb\x7e\xff\xac\x88\x4f\x01\x3a\x8e\
+\xbb\xdb\xad\x66\x4b\xc9\xfb\xef\x6d\x42\x4b\xcb\x9e\x94\x7f\x42\
+\x49\x01\x43\xc3\x57\x96\x84\x42\x91\xee\xba\xba\x7a\xe4\xce\xcb\
+\x73\x6d\xfb\x64\x93\x6f\x56\x01\xde\xfe\x4b\xfd\x9b\x3f\xda\xda\
+\xb0\x63\xc7\x96\x77\x67\x53\xf8\x9a\xfd\x03\xba\x32\xa0\xdb\xc3\
+\xf9\xf6\xb9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x4c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x13\x49\x44\x41\x54\x78\xda\x9d\x95\xdd\x6f\x14\x55\
+\x18\xc6\x9f\x33\x33\xbb\x33\xb3\x9f\x2d\xb5\x56\x77\xa1\x9f\x36\
+\x56\x14\x54\x12\x42\x22\x41\x6f\x4c\x14\x12\x12\x12\x7a\x41\x13\
+\x62\x8d\x89\xa9\xe2\x9d\x41\xbc\xd4\x5b\x63\xfc\x03\x2a\x72\x21\
+\x58\x6d\x34\xa4\x10\x34\xb6\xa9\x4d\x08\x0a\x52\x2f\x20\xc4\x60\
+\x4d\xa5\x14\xaa\xd3\x8f\x2d\xb4\x6c\x77\x76\x77\x3e\xf6\xcc\xf1\
+\x9d\x69\xd9\xb4\xd2\x8f\xad\x6f\x32\xc9\xee\xcc\x39\xbf\xe7\x39\
+\xcf\xfb\x4e\x86\xe1\x7f\x96\xa5\x27\xb7\x82\xf3\xdd\xac\xe4\x35\
+\xc2\xe3\x07\x04\xd0\x24\xc2\x7a\x0b\x18\x83\xc4\xdd\x19\x11\x52\
+\x76\x68\xc5\x07\xb3\x6c\xb3\xe0\xa2\x96\xdc\xca\x78\xe9\x37\x96\
+\xa8\x7a\x12\xad\x4d\x90\x5e\xda\x05\x3c\xd3\x0c\x39\x55\x07\x51\
+\x97\x00\x73\x2c\xf0\x1f\x7f\x01\xff\xe4\x14\x84\x84\xc7\x37\x25\
+\x50\xd0\x93\x29\x51\xb4\x8c\xd0\x9b\x1d\x50\x4e\x74\x02\xe3\xa3\
+\xf0\xe6\x66\x20\x99\x79\x78\x85\x1c\xe0\xd1\x39\xe8\x04\xd0\xc3\
+\xc0\xc8\x3c\xec\xee\xb3\x33\x15\x0b\x98\x04\x87\x0f\xef\xec\x80\
+\xfc\x5e\x3b\x70\xf1\x87\x45\x58\xbe\x04\x94\x24\xb0\xa8\x02\xa1\
+\xd2\x7f\x87\x07\xeb\x59\x42\x47\xf1\xf8\x97\xa8\x48\x60\x41\x4f\
+\x04\xf0\x70\xe7\x11\x84\xde\x6d\x87\x20\x38\x0b\x2b\x70\x07\x47\
+\xe1\xf4\x5f\x01\x84\x7b\x19\x8a\xb6\x57\x3d\xb4\x0f\xf2\x9e\x7a\
+\x80\x0b\xb0\x98\x86\xfc\x89\x33\x1b\x0b\xcc\x2f\xc1\xb5\xa3\x47\
+\xa0\x1e\x6b\x87\x37\x74\x1e\x90\x14\x78\x13\x59\xe4\xbb\xcf\xe5\
+\xaa\x61\x25\xfc\x75\x59\x2d\x56\x2b\xb8\x9c\x89\x77\x7f\x08\x31\
+\x39\x0e\x41\x89\x99\x9f\xf6\x8c\xad\x2b\x70\x5f\x23\xb8\x55\x34\
+\x74\x82\x6b\x3e\xbc\xff\x1c\xdd\xa5\x38\x42\xe4\xfe\xf2\x28\xf2\
+\x83\x57\x8f\xd7\xf0\xe2\x67\xe5\xf5\x90\x2e\x25\x7a\xbf\xd8\x27\
+\xfd\x49\x4d\x9e\x2a\x22\x77\xb2\x6f\x68\x4d\x81\xd9\x32\xbc\x03\
+\x91\xae\x43\x04\xbf\x40\x51\x60\x31\x77\x99\xc1\x33\x4c\xcc\x9f\
+\xea\x33\xeb\xe0\xc4\x1f\xee\xc9\x40\x16\x5b\x2e\xf4\x80\x0d\xf7\
+\xc3\xb9\x36\x81\xdc\xc0\xd5\xf7\x57\x15\x98\xf6\xe1\xae\x6b\x44\
+\xc9\x79\xac\xeb\x30\xf8\x57\x9f\x07\xce\x11\xa6\xe9\x48\x54\x21\
+\x50\x92\x64\x2c\x7c\x37\x0c\xfb\xe6\x4d\x93\x81\x7d\x24\xe0\x7e\
+\x1c\xed\xe8\x88\xc7\x3a\xf7\x43\xfc\x3c\x88\x85\xbe\xeb\xb0\x6f\
+\xdd\x3e\xfc\x88\x80\xa1\xc6\x53\x70\x5c\x43\x7f\xb6\x15\x55\x5d\
+\xaf\x83\x9f\xee\x21\xd7\x04\x97\xe8\x12\x62\xf1\x22\xb8\x94\x8c\
+\x43\x54\x57\xc3\x4d\xb5\x81\x3b\x21\x28\xcd\x0d\x08\x3f\x4f\xef\
+\xdc\xc5\x01\x30\x6a\xf2\xbd\x93\x43\x28\x65\xe7\xb6\xad\x10\xf8\
+\x5b\x8d\x91\x73\x6e\x44\x9e\x6a\x44\xf5\xb1\x83\xe4\xfc\x6b\x80\
+\xf2\x0e\x62\x59\xbe\xd2\x8f\x2a\x10\xf3\xc0\x3c\x0e\x56\x4d\x29\
+\xa5\x69\x7a\x22\x71\x48\x5b\x92\xc8\xfd\x7a\x07\xd9\x9f\xae\xdc\
+\xd8\x26\xac\x17\xca\xdb\xee\x90\x73\x41\xb1\xc4\x5a\x1a\xf1\xd8\
+\x3b\x07\xe0\xf6\xf4\xd2\x5d\x99\xdc\x6e\x30\x68\xcb\xc4\x24\x49\
+\x20\x9b\xd5\x91\x1b\x9f\x01\x53\xd0\xd0\x60\x9b\x13\xc1\xee\xdb\
+\x6a\x34\x80\xc7\x5b\x9a\x50\xfb\x36\xc1\xcf\xf4\x06\x8d\x0c\xa2\
+\xa9\xa4\xfc\xbe\xd3\xfa\xd9\x31\x13\x85\x9c\xe5\xc7\x99\x6e\xb6\
+\xf3\x93\xc1\xa3\xbf\xd4\x78\xad\xe7\xba\x99\x64\x53\x3d\xea\xde\
+\xf2\xe1\xdf\x04\x73\xbe\xa1\xf3\x65\x25\xcb\x12\x32\x13\x0b\xc8\
+\x99\x25\xd0\xcf\x74\x8b\x6d\x4e\x96\xb5\x47\x42\xfa\x74\x55\x43\
+\x7d\xdd\x13\x6f\xbc\x06\xf7\xb4\xef\x5c\x5e\xcc\xbc\x62\x38\xc3\
+\xf4\x54\x01\x0b\xa6\x4b\xc6\x59\xfa\x69\x2b\x37\xb9\xfc\x39\xfb\
+\x9d\x69\xe2\xb9\x0f\x3a\x51\xfa\xf6\x2c\x84\xac\x6c\x1a\x3e\x95\
+\x29\xe0\x01\x39\xf7\xe1\xdb\xed\x95\xf0\x40\xe0\x46\x38\x32\xa2\
+\x7a\xbc\xad\x35\x55\x05\x8f\xe0\xa2\xb2\xc8\x29\x0a\x86\x7f\xe6\
+\x0a\xb8\x5f\x74\xa9\x5d\x2c\xbd\x73\x29\xf3\xd5\xd6\xe2\x5a\x38\
+\x6a\xa8\x32\x4b\xb5\xd5\x44\xe1\x2d\x0d\xc6\x7a\x70\x85\xe0\x77\
+\xe7\x2d\xdc\xb3\x9d\x00\xfe\xe2\x1a\xf0\xb2\x80\x5f\xc3\xa1\xa8\
+\xa1\x4b\x48\x6d\xaf\x89\x94\x27\x6f\xb5\x0a\x11\x7c\x3c\x5b\x44\
+\xc6\xe6\xfe\xa0\xa5\x77\x3b\x85\x35\xe1\x2b\x04\xfc\xba\xa4\xe8\
+\x46\x9c\x4e\xb2\x33\xbe\x24\xf2\xdf\x58\x28\xc2\xb1\xbc\x05\xc3\
+\x71\xa1\x30\x29\xbd\xd7\x5d\x1f\xfe\x88\x80\x5f\x43\xb2\x16\x88\
+\xec\x8a\x45\x16\xdf\x9f\x87\xb1\x10\x7c\xb4\x60\x61\xc2\x75\x11\
+\xa6\x86\xbe\xe2\x5a\x1b\xc2\x57\x15\xf0\x6b\x40\x52\x8d\x84\xc4\
+\x52\x7b\x22\x51\x70\xea\x8a\x0f\x1f\x29\xda\xb8\x5b\x72\x11\xa2\
+\xcc\x5f\xe5\x76\x45\xf0\x35\x05\xfc\xfa\x5e\x56\x8d\x38\x58\xea\
+\x65\x2d\x82\x3f\xe8\x43\x3e\xc6\x39\xc1\x91\xde\xbf\x09\xf8\xba\
+\x02\x7e\x9d\x97\x43\x23\xae\x40\x1b\x35\x73\x46\x01\xdb\x71\x90\
+\x3b\xb3\x9b\x81\xfb\xf5\x2f\x9f\x37\xb1\xa8\x57\x2f\xde\x3f\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xa5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x6c\x49\x44\x41\x54\x78\xda\xcd\x95\x7d\x4c\x55\x65\
+\x1c\xc7\xbf\xcf\x39\xf7\x05\xee\x55\x30\xe0\x92\x86\xbc\x88\x8d\
+\xd1\x92\x74\x8d\x06\xcd\x59\xba\x24\xe6\x84\xeb\x7a\x59\x1b\x2d\
+\xd7\xcc\x36\x49\xcc\xad\x5a\xba\xb5\x19\x44\x2b\x67\xb8\xb4\xf9\
+\x57\xba\x85\x43\x9d\x7f\x80\x2d\xa0\x70\x60\xc5\x1c\xa3\x1c\x7f\
+\x94\x2b\x30\xe5\x6d\x97\xcb\xe5\xed\x5e\xee\x0b\xd7\xfb\x7e\xcf\
+\x39\x4f\xbf\x73\x90\xbb\x39\x0a\xe8\x6d\xeb\xee\x9c\x3d\xe7\x3e\
+\xcf\x79\xbe\x9f\xdf\xeb\x73\x18\xfe\xe3\x1f\xfb\x5f\x01\xc6\x9a\
+\x2a\x8e\xca\x1c\xd9\xf9\xaf\x7e\x7d\xe8\x5f\x07\x8c\x9d\xdb\xc9\
+\x4d\x05\x9b\x01\x2e\xc2\x7b\xfb\x67\x14\x54\x5f\x5b\xd1\xde\x15\
+\xbd\x64\x6f\x2c\xe3\x19\x5b\x2b\xa0\x4b\x8a\x02\xd1\x69\xc4\xc2\
+\x0c\xe3\x3d\xbf\xe2\x91\x9a\xae\x65\xf7\x2f\xfb\xc2\xd4\x25\x6b\
+\xad\xb0\x2a\xad\xee\x81\xc7\x8b\x20\xcd\xdd\x22\x0f\x74\xd0\xe9\
+\x45\x4c\x0f\x78\x10\xf2\x05\xeb\x0a\xf7\xb7\x7f\xf0\x8f\x00\x8e\
+\xb3\xdb\x79\x66\xe5\xeb\x88\xcf\xb4\x82\xe9\xd7\x6b\x73\x3c\xea\
+\x80\xa8\xcf\xc0\x50\xf7\x08\x8a\x0e\x2f\xed\xc5\x92\x8b\xd3\x97\
+\x76\x3b\x93\x0b\x4b\x2c\x86\xd4\x59\x4c\x0c\x4f\xa2\x77\x66\x0f\
+\x04\x81\xa1\x34\xa3\x15\xeb\x1f\xd2\xc1\x3f\x63\x80\x6b\xd8\x35\
+\xb3\xe9\x60\xc7\xda\xbf\x07\x38\xff\x2c\x4f\x2f\x7f\x19\x71\xe7\
+\x97\x68\xf8\xaa\x38\x31\xef\x74\xce\xe2\xc4\xde\x51\x18\xcc\xd9\
+\x18\xfa\xc1\x81\x47\x0f\xb4\xb3\xbf\x0c\x70\x5d\x2c\xe3\xe6\x27\
+\xac\x14\x0a\x07\x64\xff\x30\x8e\x5d\x78\x58\x9b\xf7\xf9\xbc\x98\
+\x98\x18\x47\x0b\x45\x5e\x34\x6e\x40\xd0\x17\x80\x63\xc0\x85\x2d\
+\x35\x57\xd9\x8a\x01\xee\x66\x6b\x3d\x4b\xb1\x1c\x4b\xd9\x52\x8c\
+\xb8\x6f\x10\x3c\x6c\xc3\x9b\x67\x2c\x70\xb9\x9c\x08\x04\x82\x88\
+\x84\x43\xe8\x3a\x9d\xa6\x01\xf4\x3a\x8e\x91\x9f\xa6\x69\x2e\xf6\
+\xe1\xe6\x03\xad\xef\xaf\x08\x30\xdb\xb4\x83\x9b\x9f\xaa\x02\xa4\
+\x3b\x5a\xd5\xf0\x90\x1d\xe5\x87\xa6\xc0\x15\x19\xf1\x78\x1c\xb2\
+\x2c\xa3\xfb\x44\x00\x2c\x39\x1f\x02\x8f\x41\x96\xcc\xe8\xef\xbb\
+\x8b\x27\x8f\x7c\xc7\x96\x05\x78\x5a\xac\x6d\xfa\xac\xc2\x4a\x63\
+\x5e\x3e\x09\x8f\x41\x8e\xcc\x40\x76\xf7\xa0\xec\xdd\x0c\x48\x24\
+\xac\x48\x32\x01\x24\x5c\xaf\x1f\x84\x68\xca\x07\xfd\x81\x8e\x71\
+\xdc\xee\x73\xc3\xe9\x08\xb7\x97\x9f\x0b\x5a\x97\x04\x78\x9b\x5f\
+\xe4\xab\xb6\x57\x22\x3a\x71\x19\x3c\xe6\x06\x63\x06\xf0\xb9\x61\
+\x3c\x7d\x24\x9b\x2c\x95\xa0\x90\x17\x8a\xac\xa0\xf7\xf8\x18\x01\
+\x36\x6a\x00\xd0\xa5\x67\x0c\xdf\xb6\x8c\xa0\xa2\x31\xc4\xfe\x14\
+\xe0\x6e\xda\x36\x69\xc8\xdb\xb8\x4e\x97\x3e\x09\x39\x4a\x5d\xcb\
+\x69\x99\x73\x70\xff\x20\xb6\x1e\xb6\x40\x56\xc5\x15\x85\x42\xc5\
+\x71\xe3\x13\x47\x02\xc0\xe3\x1c\xa2\x5a\x75\xb6\x20\xfa\x6f\xba\
+\xec\x7b\xbe\x08\xe6\x2e\x02\x78\x4e\x5b\x2a\xe5\x50\xa4\x2d\xe5\
+\xb5\xb7\x20\x4d\x5d\x27\x6d\xdd\xbc\x75\x1a\x60\x14\x25\x07\x57\
+\xcf\x8b\x73\xf5\xe6\xe8\x3b\xe5\xa2\x24\xe7\x26\x00\x8c\xbc\x32\
+\x19\x45\x74\x5c\xb1\x51\x79\x31\x6b\xe5\xd9\xbb\xed\xf7\x01\x66\
+\x3f\x4a\xe2\xe6\x97\xde\x86\x12\xe9\xa3\xe4\x92\xa8\x3a\xa9\xdc\
+\x03\x44\x3d\xd8\x51\x1d\x85\x3f\x42\xcf\x0a\xb0\x3a\x49\xc1\xf7\
+\x27\xe7\x20\x8a\xd4\xd9\x94\x0f\x15\x00\x49\x81\x40\x72\x51\x7f\
+\x14\x5d\x9d\x93\xa8\xba\x1c\x66\x09\x80\xf7\x33\x4b\x2d\x52\x2d\
+\x75\x49\xcf\xec\x84\xe2\x19\x20\x51\x41\xb3\x54\x03\x28\xea\x18\
+\x87\xe4\xb5\xc1\x66\x0b\x69\xc6\xe4\xe5\x99\xb4\x51\x14\x1e\xbc\
+\x0f\xa0\x8e\x26\x23\xc3\x8f\x3d\x33\x70\xb9\xc3\x9f\xbf\x70\x3e\
+\x5c\xad\x01\xdc\xb5\x02\x37\x57\x37\x40\x76\x76\x10\x52\xaf\x09\
+\x27\x00\xaa\x07\xe1\x49\xd8\x6d\x01\x9c\xe9\x7d\x4e\x13\xae\x29\
+\x6d\x41\x4e\xa6\x01\x82\x2e\x3d\x11\x22\x15\x00\xfa\x58\x30\x1a\
+\x19\x55\x5a\x73\x9b\x03\xfb\x9a\xa3\x8c\x79\x3f\x5d\x73\x43\x5f\
+\xbc\xab\x44\xc8\xd2\x83\x07\x5d\xb4\x9d\x2f\x06\xf8\x87\xf0\xfc\
+\xf1\xc7\xe0\xf5\x7a\x10\x8f\xc5\x60\x32\x25\xe3\xea\x7b\x03\x10\
+\x93\x36\x2c\x02\x20\xae\x50\x45\x29\x18\xb9\x33\x87\x9b\x83\x01\
+\x17\xf3\x7e\x9c\xc4\x4d\xfb\xeb\xe9\xb4\xbc\x46\xf1\x32\x12\x40\
+\x5a\x04\xb0\x0f\x8e\x63\xef\xc9\x34\x6a\xb2\x18\x24\x2a\x55\x99\
+\x2c\x6c\x7c\xc3\x87\xa2\x4d\x6b\xff\x10\x80\xb8\x0c\xa3\xc8\x71\
+\xa5\x73\x0a\xcc\x7b\x2a\x83\x9b\x5e\x79\x87\x00\xdd\x60\x0a\x85\
+\x87\xcb\xf3\x00\x2c\xe4\x40\xdd\x14\xc4\xbe\x7a\x8e\x7e\xca\x81\
+\x42\x82\x05\x59\x3a\x5c\x38\xea\xa6\x24\xaf\x4b\xe4\x80\xab\x80\
+\x05\x10\x19\x90\x62\x00\x2e\x7e\x33\x49\x80\x86\xd4\x31\x63\xe9\
+\xae\x1c\xe4\x0a\xf4\xb5\x0a\xdd\x03\x2c\x58\x2f\x11\x94\x62\x4a\
+\x9d\xea\x1b\xbd\x85\xce\x5e\x51\x8b\x60\xf9\x36\xc0\x6c\x12\xa0\
+\x37\x52\x92\xe3\xf3\x00\x41\x13\xa6\x45\x2a\x57\x1d\x79\xff\xdb\
+\x2f\x1e\x35\x44\xf3\x55\xe4\x69\x58\x33\x46\xcd\x93\x83\x4c\x0b\
+\x15\x8c\xda\x48\x0a\xbd\xc7\xb4\x67\x99\x3c\x50\x9d\x90\xa9\xe9\
+\x38\x85\x40\xf3\x8d\x46\x89\xee\xf9\x63\x83\xab\x9a\x90\x28\x2c\
+\x32\x41\x64\xf5\x24\x9e\x8d\x50\xa4\xb8\xbd\xea\x62\x38\xf7\x77\
+\x14\xfd\x9e\x40\xee\xbe\x86\xe2\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x03\x6f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x36\x49\x44\x41\x54\x78\xda\xb5\x55\x5d\x48\x53\x61\
+\x18\x7e\xbf\x33\x37\xcd\xda\xa6\xf9\xb3\xa9\xc9\x74\xfe\x05\x96\
+\x96\x4b\xa4\x30\x94\x8c\x95\x69\x52\x41\x51\x57\xe2\x45\x92\x17\
+\x51\x94\x60\x14\x74\x21\x5d\x44\x41\x57\xf6\x23\xd1\xcf\x55\x3f\
+\x88\x15\x21\x49\xa6\x58\x62\x16\x93\x59\x8c\x04\xb7\x74\xb4\x74\
+\xbf\x59\xea\xca\x2e\xe6\xce\xf9\xfa\xce\xb7\xff\xa1\x39\x6d\xbd\
+\x63\xe7\xbc\xe7\x79\xdf\x3d\xcf\xf7\xbe\xef\x77\xbe\x21\xf8\xcf\
+\x86\xf8\x4b\xab\xc6\xd1\x1c\x1b\x17\x7b\xd5\x07\x62\xf2\x59\x1d\
+\x19\x0a\x7e\xbc\xdd\x52\x24\x6d\x44\xa7\x06\x1d\x17\xd4\xd9\x92\
+\x4b\x3c\x22\x40\x08\x38\xbc\x3a\x72\x9f\x31\x84\x83\xf5\x72\x68\
+\xcd\xce\x1b\xbc\x00\x56\x67\x4b\x01\xe3\xd5\xae\x7b\xf1\xb6\x20\
+\x22\xa4\x35\xcf\x01\x22\xed\xc1\xa5\x1b\xa4\xb0\xc0\x45\x8b\xde\
+\x63\x42\x06\xc1\xf0\x94\x57\xa0\x24\x43\x02\x6c\x94\x05\x04\x44\
+\x60\xc4\xec\x04\x74\x71\xc8\x8e\x4b\x32\x43\x05\x7c\xa3\x0a\x97\
+\x5c\x0a\xf7\xc5\x70\xb8\xc0\x24\x11\x38\x3f\x60\xc5\x2a\x45\x42\
+\x90\x00\xa6\x83\xf2\x99\x0f\x26\xf9\xe0\xe2\xb8\x40\x0b\x10\x43\
+\x09\xf9\x4c\x17\xe6\xc0\xed\x0d\xc5\xc7\x10\x1c\x7b\x04\xb4\xa6\
+\x59\x40\x2d\xfd\x16\xbc\x35\x4b\x4a\x05\x58\x96\x03\xbd\x6d\x1e\
+\xcc\x36\x27\x4d\xce\xcd\x4c\x80\x7c\xf9\x3a\x4a\xa4\x77\xcc\x83\
+\xd1\x34\xe3\xc7\x15\xc9\xf1\x20\x24\x64\xe3\xb6\x5f\x30\x3e\x39\
+\xeb\xc7\x95\xb2\xb5\xde\x05\x21\xf8\xf0\x85\xcc\xa0\xb9\x77\x12\
+\xab\x94\xeb\xfd\x2b\xd3\x18\x67\xe0\x5a\x55\x06\xf5\x1b\x3a\x0c\
+\x90\xac\x48\xa6\x3b\x6c\xfa\xeb\x77\xb8\x7f\x38\x9f\xe2\x87\x3a\
+\x4d\x50\xb9\x29\x89\xfa\xaf\x34\x16\xe8\x3c\xa2\x04\x51\x6c\x0c\
+\x9c\x78\x36\x01\x15\xc5\xe9\x9e\x3e\x90\xdf\x68\x8d\x3f\x00\x1d\
+\x7c\x38\x81\x73\xf3\x92\xe0\xb7\xdb\xd3\x8b\x4f\x3a\x1b\xbc\x3e\
+\xbe\x91\xfa\xc5\xe7\xfa\xa0\x74\xef\x66\x10\x8b\xe3\xa0\xaf\x63\
+\x18\x74\x97\xab\x28\xbe\xa5\xf5\x1d\xec\xaa\x29\xa4\x7e\xf7\xf3\
+\x51\x18\x38\x53\x0c\x29\xd2\x78\x50\x9e\xed\x87\x86\x7a\x15\xc5\
+\xc5\x0c\xc0\x18\xa9\x18\xed\xbe\xa3\xc7\xf9\x05\x49\x80\x49\x8b\
+\xdc\xe4\xab\x79\x33\x1e\x18\x54\x96\x1c\xb6\xe7\x49\xe9\xf4\x06\
+\x7b\xf5\x21\xb8\x2a\x4b\x0c\x42\x01\x82\xb7\x7d\x86\x10\xbc\x2c\
+\x47\xe2\xad\x00\xc0\xa0\x9f\x06\x54\x79\x6b\x14\xe7\x14\xa4\x02\
+\x47\xc8\xf9\xd9\x5a\x9d\x2e\xb0\xcf\xb9\x68\x92\x4c\x2a\x02\xb9\
+\x58\x44\x7d\xdb\xcf\x50\x3c\x4d\x22\xa2\x24\xe1\x78\x46\x42\x1c\
+\x9d\x25\x43\x86\x3c\xa1\x77\x00\x2a\xbf\xae\xc3\x8a\x02\x19\x15\
+\xf0\x6f\x39\xef\x2e\xc2\x61\xc7\xc6\x52\x78\x20\x86\xc1\x17\xe2\
+\x05\x4c\x7a\x3b\xa0\xd2\x2b\x5a\xac\x28\x4a\x07\x8e\x8d\xee\x8b\
+\xc6\x90\xf6\x99\x74\x16\x8f\x40\x6a\x21\x11\x58\x60\xa3\x2b\x20\
+\x14\x80\x63\xd4\x2b\x20\x51\xca\x3c\xa5\x07\xbd\x48\xff\x62\x88\
+\x61\xe8\xdd\x69\x24\x2d\x2a\x38\xdd\xdb\x95\xb2\x23\xbf\xc6\x1f\
+\x5d\xe4\x4c\xc2\x6c\xa8\x30\x12\x30\x7f\x59\x7a\xe0\x14\xf8\x36\
+\x64\xe8\xa1\x4f\xca\xa6\xee\x97\xe4\xa6\x0e\xa2\x0c\xb8\x44\x30\
+\xb1\xbc\xd0\x23\x42\xb2\xf9\x22\x9d\x23\x64\x6b\xba\x17\xab\x36\
+\xe4\x0f\xa7\xc7\x78\xb3\x7a\x0f\x82\x65\x2c\xfd\xc0\xbd\x81\xc4\
+\xba\x8a\x9d\xd8\x4d\x66\x24\x8c\x81\x79\xcd\x18\xb0\x76\xc7\xd1\
+\xa9\x27\xf5\x8f\x23\x6a\xd7\x72\x09\x69\x75\x77\xdf\xaf\xa9\xad\
+\x28\xe3\x7d\xd7\xc7\xcf\xc0\x59\xad\xc7\x2c\x4f\x1b\x1e\x45\x3c\
+\x8f\xe5\x12\x52\x6b\xdb\x87\x85\xfb\xd5\xdb\xd8\xe1\x51\xe0\x6c\
+\x96\x36\x47\x57\xe3\xc9\x48\xc9\x23\x15\x78\xc1\xc8\x33\xaa\xdd\
+\xe6\xc9\xb6\xe9\xee\xa6\x15\x91\x47\x24\x90\xb2\xaf\xfd\x01\xc6\
+\xdc\x18\x21\x6f\x5d\x29\x39\x6f\x7f\x00\xd0\x30\x5f\xb4\x25\x61\
+\x9e\x4c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xb9\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x80\x49\x44\x41\x54\x78\xda\xad\x96\x7f\x48\x54\x59\
+\x14\xc7\xbf\x77\xde\x98\x3a\x5a\xb3\x68\x3a\x46\xbf\x53\x61\x6b\
+\xd8\x0a\x4a\xa4\x9f\x34\x96\x35\xb9\xd5\x56\x44\x85\x05\x2d\x0b\
+\xbb\x2d\x11\x06\x8b\xb5\x2c\x41\x51\xd0\x1f\xd1\x0f\xfa\x41\x3f\
+\xa5\x98\x28\xed\xc7\x1f\x6d\x12\x8c\x56\xb3\xe2\xb8\xac\x15\x52\
+\x86\xad\xd5\x84\xeb\x33\x71\x75\xc6\xdd\x55\xd7\x19\xe7\xc7\x9b\
+\xf7\xde\xed\x8c\xcf\xfe\x09\xab\x47\xe3\x81\xcb\xe5\x9e\x7b\xce\
+\xf9\xdc\x7b\xee\xe1\xbc\xc7\xf0\x11\x59\x72\xcd\x97\x67\x9e\x66\
+\x9e\x9d\x65\x62\x1b\x2d\xa3\xb0\x2c\xdb\x34\x0a\x0a\x57\x68\x47\
+\xc1\xcb\x3e\x45\x7c\xda\x21\xd7\xb0\x90\xe4\x76\x6d\x1c\x7b\xf5\
+\x43\x31\xd8\x70\xca\x4d\x0d\x51\x21\x22\xab\xdb\x6c\x16\xe1\xd2\
+\x8a\x0c\x01\x66\x23\xf0\x9f\x4c\x43\x05\xc2\x34\x33\xf2\x4a\x36\
+\x00\x63\x49\x5f\xd1\x12\xc2\xc3\xd7\xc1\x62\x82\x5c\xd7\x0d\xd8\
+\xfb\x52\xfe\xe9\xc7\x49\xc2\xb1\x00\x05\xec\x88\x02\x3e\x49\x33\
+\x54\xb9\xb6\xcf\x69\x21\x0f\xd9\x66\x11\xa4\x5a\x1c\x40\x93\x67\
+\xe0\xdb\xda\xad\x96\x2b\xba\x00\xa5\x7f\x46\xc5\xe2\x49\xc6\x29\
+\xcd\x41\x32\xe0\x43\x56\x4c\x9b\x14\x5a\xcb\x5c\x9b\x63\x5b\x32\
+\x1d\xc2\x94\x00\xdc\x7c\xd8\xf3\xa0\x6a\x6d\xfa\x72\x5d\x00\x7b\
+\xcd\xc0\xce\xa3\x73\x4d\xa7\x9f\x10\x20\x91\x52\xc1\x68\x74\x86\
+\x81\x88\xc4\x91\x95\xc2\x10\x8c\x62\x30\x7a\xec\x26\x14\x1f\x82\
+\x00\xfc\xe1\xf1\xa3\x7c\xc9\x18\xa6\x0b\x50\xe4\x0a\xec\xfb\x61\
+\x46\xd2\x81\xa0\x41\x40\xbd\x57\x82\xe8\x8d\x54\x4b\x92\xe4\x80\
+\xc4\xbc\x2c\x11\x65\xdb\xf3\xd3\x72\x3b\x22\xda\x0d\x94\xa1\x1b\
+\x36\x8a\x7e\x5c\x5b\xac\x13\x10\x93\x0d\x0f\xfa\x77\xf8\xc3\xea\
+\x74\x83\x41\xfd\xa5\xea\xeb\xb4\xc0\x3b\xfd\x7c\x87\x37\xf7\xc8\
+\xca\xcc\xd7\x75\x61\x36\x98\x3e\xce\xb5\x20\x4d\x2d\xfd\xa8\x28\
+\x34\xeb\x07\x14\x39\xfb\x0c\xce\xa2\x2f\xd4\xf7\xf5\xb6\x72\x5f\
+\x95\x63\x5d\xa6\xfd\x72\x27\x60\x8c\xbd\x0b\x57\xc1\x04\x06\xf7\
+\xe3\x7f\x02\xf7\x37\x5b\x46\xeb\x06\x0c\x27\x79\x65\x9d\x9b\xf6\
+\x2c\x4b\xbb\x91\x9e\x9a\x08\x77\xaf\x0a\x81\x8e\xcf\x89\x12\xa0\
+\xb7\x71\xdd\x6d\x3b\xd8\xb8\x27\x67\xff\x67\x03\x16\x3b\xbc\x13\
+\x97\xcf\x4c\x6d\xdf\x90\x9b\x82\xe3\x6d\x0a\xfa\xa8\x4e\x7b\x24\
+\x06\xd5\x68\x40\x43\xd9\x8b\x90\xff\xbc\xd5\x34\x9c\x9f\x6e\xc0\
+\xa2\xf2\xee\xe0\xd9\x35\x19\xc9\xdf\x3d\x95\x11\xa6\x8a\x32\x30\
+\xca\x5e\x52\x02\xc4\x4a\x11\xfd\x4f\x5a\x27\xa3\xb6\xb0\xfd\xf3\
+\x01\xeb\x1b\x4a\x0e\x1f\xfa\xea\xe4\xa3\x80\x11\x9e\x1e\x85\x82\
+\x73\x08\xcc\x88\xb6\x7b\x6f\x10\x68\x6c\x9d\xa0\xfc\x56\xf8\xf7\
+\x87\x5c\x75\x01\x32\x7e\x6e\x11\x2f\x94\x66\x4f\xd9\x5d\x1f\x81\
+\x31\x56\x9c\xd4\x2b\xfc\xdd\x12\xba\xae\xd6\xef\xe4\x6e\xfb\x99\
+\x8f\xf9\xea\x02\xe4\x5d\xec\xe2\xd6\xbc\x4c\xb8\x5b\xc3\x54\x35\
+\x0c\x3c\x81\xa1\xeb\x57\x0f\xc2\x8e\xd9\x9f\xf4\xd7\x05\x28\xa8\
+\xf0\x71\x65\x72\x1a\xc4\x2e\x45\xf3\xa0\xfe\xe3\xbb\xd5\xfc\x28\
+\x52\x3e\x67\xde\x88\x00\xb2\x4a\x5f\x71\x65\x4c\x12\x42\xff\xd3\
+\xc3\x46\x39\x54\x81\x23\xdc\xdc\xfe\x42\xbd\x5f\x60\x1d\x11\x40\
+\x3c\xa2\x0f\x30\xbf\xb2\x20\x35\x7b\xdc\xed\x59\xb6\x89\x66\xef\
+\x1b\x3f\xfe\xaa\xf5\x9c\x83\x7b\xf5\x8e\x91\x01\xe4\xdf\x59\x59\
+\xb0\x6b\x81\xf3\x1b\x5b\x3a\xca\x9a\x22\xe8\xed\x57\x90\x9f\x63\
+\xc2\xed\x5d\xce\xeb\xa8\x5b\x55\x1c\x37\x20\x71\xdd\xef\xae\x53\
+\x17\x16\x2e\xdd\xee\xe8\xa1\xfc\xab\x5a\x0b\x05\xf5\xef\x56\x6f\
+\x10\x97\xad\x29\x71\x03\x2c\x25\xcf\x1a\xac\x5b\xac\x73\x6b\x9c\
+\xbd\x00\x95\x27\x14\xaa\x24\x4e\x7d\xa2\xdb\x1f\xc2\xd9\xe9\xa6\
+\xb8\x01\x09\x76\xd7\xb3\x79\x07\x6c\xb3\xea\xee\xf8\xe8\xe0\x11\
+\xed\xbb\x19\xeb\xd1\xde\xbe\x7f\xe1\x98\x93\x11\xff\x1b\x58\xcf\
+\xdb\x67\xee\x5e\x5f\xd5\xf4\x6a\x80\xac\x29\x45\xaa\xa2\xa5\xa9\
+\xdb\x5f\x49\x80\xb5\xf1\x03\x62\xf2\xe5\x89\xef\x31\x7e\xea\x49\
+\x24\x27\x25\x0f\xfe\x52\x74\xb6\x57\x40\x0a\x6e\xc3\xf3\x12\xf9\
+\x53\xae\x6f\x01\xd7\x8b\x6f\x28\x41\xa8\x4d\xab\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x90\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x57\x49\x44\x41\x54\x78\xda\xa5\x95\x7b\x50\x54\x55\
+\x1c\xc7\xbf\xf7\xb1\xbb\x80\xe2\x63\x8a\x0c\xcc\x4c\xb0\x10\x04\
+\x76\x1d\x27\x95\xd0\x41\x89\x12\x01\x51\x0a\x43\x12\xc7\x71\xd2\
+\x51\x69\xa6\x3f\x6c\xa6\xd2\xa9\xd1\x46\xcb\xc9\xb2\x1a\xc7\xb1\
+\x89\x19\xf3\x91\x23\x43\x60\x8a\xaf\x60\x5a\x07\x57\x5c\xe3\x31\
+\x92\x92\xc3\x40\x20\x88\xca\x02\xe2\x03\x13\x77\xef\x73\x4f\xbf\
+\x7b\x79\x4c\x35\x6e\x0f\x3b\xf7\xde\x73\xcf\x39\x7b\xce\xf9\xec\
+\xef\xf7\x3b\xdf\xdf\xe5\x52\x8a\x3b\x59\x48\x10\x8f\x31\x21\x22\
+\xc0\xe8\xe6\x80\x51\xd0\x60\x14\x5e\x14\xcc\xb1\xbf\x2d\x34\xdf\
+\xaf\xe9\xe8\xef\x97\xe1\x0d\x0e\xc1\xad\x3e\xad\xc9\xb5\x34\x22\
+\x66\xf8\xe7\x05\xa5\x1e\xb6\x65\x5e\x18\xac\x1c\x87\x3b\x2a\x83\
+\xce\x8b\x48\xf8\xad\x15\x8f\x47\x3e\x43\x2b\xfd\x01\x36\xa5\x5d\
+\x39\xcb\x9f\x86\x6e\xb7\xb7\xa2\x79\xf4\x64\xec\xbf\x74\x1b\x4d\
+\x1e\x9f\xe7\x6c\xfe\x84\xf1\xe6\xd4\xbc\xe3\x1e\xf6\x5e\x52\x18\
+\x9c\xbd\x2a\xee\x13\x40\xe3\x44\xe4\xdc\x6f\x40\x54\x5c\x0c\x74\
+\x5d\x7f\xe8\xfe\x56\x9b\x15\xdf\x1d\x38\x04\x0b\x59\xa8\x69\x1a\
+\xa6\x27\x26\x82\x49\x32\x8a\x47\x4c\xc5\x58\x91\xa1\xa6\xb5\x0f\
+\x5d\xbd\xb2\xa7\x6a\xc5\xc4\xf1\x5c\xce\x91\x1b\xac\x20\x31\x0c\
+\x95\x04\x30\xac\x50\x20\x60\xf1\xbd\x8b\x88\x9c\x3a\x25\x20\x20\
+\x34\x24\x08\xd9\xeb\x3f\x47\xf4\xa2\x3c\xc8\xaa\x1f\x33\xbb\xcf\
+\x61\xba\x3d\x01\xc5\x21\x71\xb0\x71\x3a\x6c\x22\x8f\xea\x96\x3e\
+\x74\x77\xf9\x9a\xb8\x57\x4a\xae\xb1\x82\xd9\xe1\x70\xdd\x94\x21\
+\x1a\x00\xb2\x20\xab\xb7\x06\x91\x09\xb1\x81\x01\xc1\x56\xac\xfc\
+\xe2\x38\x1c\xaf\x2f\x07\x19\x8d\x89\xce\x42\x38\xec\x0e\x94\x8c\
+\x72\xc0\xca\x34\x23\x2c\x08\xb6\x09\x28\xaf\xe9\x06\x97\x5d\x7c\
+\x95\xad\x4b\x8a\x40\x65\xcf\x20\x80\xb7\x60\x61\x4f\x15\x01\xe2\
+\x02\x03\x82\xac\x58\xb5\xf3\x04\xe2\x72\xf3\xa1\x30\x1e\x91\x67\
+\xbe\x86\x3d\x2e\x1e\xa5\x63\x66\xc0\xea\x57\xcd\x39\x16\x0b\x8f\
+\xb3\xf5\x3d\xe0\xb2\x0e\xb5\xb1\x82\xe4\xf1\x70\x7a\x24\x58\x78\
+\xc3\x02\x0b\x32\x3d\x2e\x44\xd9\x03\x03\x46\x92\x05\x6b\xbe\x72\
+\x22\x3e\x2f\x1f\x2a\x4d\x99\x54\xb1\x13\xb1\x09\x76\x7c\x3f\x76\
+\x26\x59\x30\x08\x20\x37\x9d\xab\x27\x0b\x32\xf7\xb5\xb0\x75\xa9\
+\x13\xf0\xe3\x0d\x19\x16\xb2\x4d\x11\xac\xc8\xb8\xe6\xc4\xe4\x69\
+\xf1\x81\x01\x14\x83\xd7\xd6\x6d\x46\xc4\xf4\x79\x50\x74\x86\xd4\
+\x31\x77\x10\xfb\xdc\xb3\x38\x3a\x2e\x19\x56\x5d\x19\xb6\xc0\x7d\
+\xa1\x8b\x8e\xe9\x9e\x66\x56\x90\xfa\x34\x2a\x3a\x87\x00\x36\x2c\
+\x68\x3f\x89\xc9\x0e\x7b\x40\x80\x28\x08\xb8\xda\xd6\x0e\x81\xe6\
+\x33\x3f\x43\x58\xc4\x93\xe8\xbc\xd2\x86\x53\x13\xd2\x08\x20\x0f\
+\x03\xce\xd7\x79\xc0\xcd\x2f\x6c\x64\x6b\x5f\x9e\x84\xf2\xeb\x03\
+\x2e\x52\xc9\x82\x17\x1b\x4b\x61\x7f\x61\x06\x34\x55\x0b\xa8\x03\
+\x9e\xe7\x4d\x39\x18\x3a\x14\x68\xdd\x25\x77\x2d\x9c\xb1\x39\xb0\
+\x0c\x5a\x20\xd2\x11\xae\xad\xed\x00\x97\xba\xfb\x32\x5b\x3b\x3f\
+\x12\x3f\x74\x48\x10\x2d\x22\x74\x4b\x10\x46\xbb\x4a\x30\x2e\xfc\
+\x31\xd2\x59\x00\xa1\xfd\xa5\x18\xb0\x9e\xae\xdb\xb8\x97\xbc\x04\
+\x82\x2a\x81\x23\xcb\x45\x8a\x41\x5d\x1d\x01\x52\x76\x35\xb0\xb5\
+\x69\x51\x38\x76\x5d\x45\xe8\x2f\xd5\xe0\xbb\x9a\xa1\xf1\x56\xfc\
+\xbb\xad\xff\x00\x31\xfe\xb5\x5f\x81\x3f\x3c\x1a\x8a\x7d\x96\xe9\
+\xee\x0b\xd5\xed\xe0\xe6\x7e\x79\x91\xad\x4e\x8f\x42\xc9\x55\x15\
+\xab\x6f\x95\x23\x3d\x2f\x0f\xff\x9c\x80\x02\x15\x0e\xa7\x8a\x8a\
+\xb0\xff\x89\x05\x18\x21\x30\x34\xd4\x10\x60\xce\x8e\x0b\xec\x8d\
+\x8c\x68\x14\x5f\x51\xb0\x81\xaf\xc6\xcc\x94\x54\x33\xb8\x82\xc0\
+\x9b\x0b\xcc\xb4\x63\x54\xa6\x7c\x06\xd2\x90\x51\x71\x83\xfd\xa1\
+\x97\x9f\xd6\x30\xc6\x50\x7d\xda\x89\x1d\x98\x85\x91\x94\x32\x1a\
+\x6b\xaf\x80\x4b\xfc\xa4\x8e\xad\xca\x9a\x82\xa2\x16\x19\x1b\xf4\
+\xf3\x48\xca\x98\x8f\xda\xf3\xf5\xe8\xe9\xb9\x05\x55\x51\x21\x2b\
+\x32\xe5\x1b\x19\xb2\xa4\x42\xa3\xbe\x4a\x7d\x45\x53\xa0\xca\xd4\
+\x96\x35\xd2\x81\x04\x9f\x24\x61\x52\x54\x24\xde\x7a\xfb\x4d\xb8\
+\xca\x4e\xe2\x33\x6b\x12\x42\x2d\x7e\x34\x55\x19\x80\x8f\x6a\xd8\
+\x8a\xc5\x31\x38\xd4\x2c\x63\xa3\xe6\xc2\x9c\x8c\x74\x33\x68\x8f\
+\x5a\x5c\xc7\x4f\xe0\x53\xdb\x5c\x13\xd0\xea\x6e\x05\xf7\xfc\x96\
+\x9f\x4c\xc0\xc1\x26\x19\xef\x6b\x95\x98\x9d\x9e\x66\x4e\x14\x44\
+\x91\x40\x9c\xe9\x1e\x6e\xc8\x25\xd4\xe7\x87\xde\x43\x63\xdc\x80\
+\x8f\x54\x45\x81\x2c\x2b\xa8\x3a\x79\x0a\xdb\x6d\x29\x26\xa0\xed\
+\x5c\x0b\x01\x36\xb9\xd9\xb2\x9c\x38\x1c\xb8\xec\xc5\x07\xea\x69\
+\x24\x67\x65\xc2\x59\x7e\x16\x1d\xed\x9d\xe4\x16\x09\xb2\xd7\x0b\
+\xaf\x22\x41\x7a\xe0\x83\x24\x4b\x50\x24\x2f\xb9\x44\x36\xdb\xaa\
+\x4c\xee\xa2\xe7\x81\xaf\x1f\xd1\xd1\x31\xd8\xbd\x77\x27\x9c\x87\
+\x8f\x62\x7b\xd0\x4b\x08\x15\x75\x74\xb8\x7f\x05\x37\x6d\x63\x15\
+\x5b\x96\x1b\x8f\xbd\x0d\x5e\x6c\x52\x2a\x90\xbc\x70\x21\xee\xf5\
+\xf5\x41\xf7\x93\x8a\xfd\x1c\x7d\xe1\xe8\xc0\x1a\x37\x05\xd0\xb8\
+\xcc\xb6\x51\x19\x5f\x3f\xe3\x32\xc6\x75\x3f\x04\x8b\x80\xf0\x88\
+\x08\x9c\x29\x3b\x86\x6d\xc1\x69\xa6\x05\xdd\xee\x66\x70\x8e\x77\
+\x2b\xd9\x92\xa5\x0e\xec\xfb\xd9\x8b\xcd\xea\x09\x02\x64\xfe\xaf\
+\x18\x54\x12\xe0\xe3\xa0\x2c\x84\x5a\x75\xdc\x74\x37\x81\x8b\x7f\
+\xe7\x34\x7b\x35\x77\x1a\xbe\xa9\xf7\x62\x8b\x5c\x86\x94\xec\x45\
+\xa8\xaa\xac\x43\x77\x67\x2f\xb9\x88\xdc\x32\xe4\x22\xaf\xcf\xec\
+\x1b\xcf\xb0\x8b\x8c\x13\x45\x6d\xaf\xf4\x00\x91\x51\x51\xd8\xb1\
+\x6b\x3b\x2a\x4a\x4a\xb1\x35\x64\x31\x1d\x53\x1d\x77\x6b\x08\x30\
+\x65\xbd\x93\x65\xe7\x3a\xb0\xe7\xa2\x0f\xdb\xbc\x87\x29\x06\x59\
+\xd0\x0c\x1d\xf0\x02\x38\x1e\xc3\x81\x34\xf5\xf0\xb0\xf6\xa0\x10\
+\x34\x5d\x33\x13\xdf\x99\xb2\xa3\xd8\x1c\x9a\x83\x11\xa2\x86\xfe\
+\xea\x46\x70\x4f\xad\x3c\xc2\xb2\xd7\x24\xa3\xa8\xc1\x87\x0f\x6f\
+\x16\x62\x51\xfe\x72\x0a\x9c\xf2\x48\xee\x31\xbe\xd5\x65\x07\xbf\
+\xc5\xd6\xf0\x35\x08\x26\x7d\x78\x5d\xf5\x03\x00\x45\x1a\xc8\x9a\
+\xd6\x20\x11\x63\x43\x05\x52\xf2\x7f\xcd\x44\x03\xc5\x50\xff\xdd\
+\xfb\x3a\x09\x52\xa7\x43\xc2\xcc\x2c\xfb\x3b\xb0\x5f\x8b\x1a\x04\
+\xce\x89\x28\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xff\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xc6\x49\x44\x41\x54\x78\xda\x9d\x95\x6b\x6c\x14\x55\
+\x14\xc7\xff\xf7\xde\x99\xd9\x77\x29\xf6\x25\xbb\x54\x90\xf2\x6a\
+\x6c\x1b\x22\xd6\x08\xf5\x55\x88\x41\x91\x46\xa3\x44\x91\xb4\x22\
+\x05\xda\x28\xc6\x18\x82\x1f\x4c\x8c\x8f\xe8\x07\x21\xf8\x41\xb1\
+\x89\xd1\x18\x12\x88\x21\x41\x4c\x94\x47\x0d\x60\xa1\x85\xd2\xa0\
+\x02\x8d\x8f\x58\x04\x69\x4b\x61\xb6\x8f\x65\xdb\x42\x97\x6e\xb7\
+\xdd\x99\xf1\xdc\xd9\xd6\x52\x5a\x4a\xeb\xcd\xce\xdc\xb9\x93\x99\
+\xff\xef\x9c\xff\x39\x77\x96\xe1\x7f\x8e\xf4\x6d\xfa\x74\x43\xe1\
+\xf9\xa6\xc9\x67\x5a\x2a\x5f\xce\x15\x71\xaf\xc7\xcb\xb3\xb8\xc2\
+\x60\x98\xac\x5d\x30\x96\x7b\x69\xb5\x2f\xc4\x26\x2b\x9c\xfa\x51\
+\xf3\xf4\x01\x26\x7e\xc9\xb8\xdb\x31\x6d\x6e\xa6\x8a\x82\x4c\x37\
+\x72\x92\x15\xa4\xb9\x38\xd2\x1d\x80\x61\x01\x27\x3a\x2d\x7c\x50\
+\x7b\x1d\xcc\x14\xe9\x93\x02\xdc\xf5\xee\x05\x7f\x5f\x3f\xd3\x5f\
+\x7b\x21\x03\x1b\xb3\xbd\x68\x8e\x02\xe1\x7e\x20\x66\x02\x7d\x74\
+\x48\x31\x46\xa7\x29\x02\x68\x8c\x01\x9f\xd6\xf4\xb4\x4f\x18\x30\
+\xe5\xad\x73\xfe\xa8\x05\xfd\xd5\xe7\xfc\x28\xcd\xf1\xe1\x68\x18\
+\x70\x29\x40\x94\x42\x36\x29\xea\x64\x07\x83\x93\xd4\x0c\x02\x59\
+\x34\xa7\x6b\xc0\xc6\xc3\xd7\x30\x21\x80\xf7\x8d\x3f\xfd\x7d\xa6\
+\xa9\x97\xaf\xba\x07\xa5\xb9\x53\x70\x24\x64\xc2\xad\x72\xd4\x35\
+\x47\x50\x79\x3c\x0c\xd3\xc0\x49\xcd\xa7\x14\xac\x2a\x4c\xc3\xa2\
+\x69\x1a\x2c\x02\xfa\xc8\xae\x4d\xfb\xbb\xef\x0c\x70\x97\xd5\xfb\
+\xa3\x06\xd3\xcb\x4b\x48\x3c\x6f\x2a\x7e\x6c\x33\xa0\x51\x21\x43\
+\x37\x62\xf8\x62\xb7\xde\xd3\xbb\x75\x4e\x92\x5d\xf4\x2d\xc1\x34\
+\x43\x35\x3b\x76\x96\x04\x10\x22\xdb\xfa\x89\xf2\xf6\xbe\xf0\xc5\
+\x71\x01\xae\xb5\xa7\x28\x72\xae\xbf\x52\x32\x0b\xeb\x17\xa6\xe0\
+\x60\xab\x01\x95\xde\xf0\x70\x86\x9f\x5b\x7a\x50\x79\xa8\x75\x73\
+\x74\x5b\xf6\x27\x43\xcf\x3b\xde\x69\x3a\x5e\xf9\xe6\x8c\x47\x2e\
+\xf7\x31\xb4\xf6\x19\xf8\x78\x5f\xb8\xea\xb6\x00\xe7\xea\x5a\x7f\
+\x5f\x1c\xfa\xcb\xa5\xf3\xb0\x21\x3f\x15\x3f\x04\x07\xc0\xc9\x5c\
+\x07\xf9\xae\x09\x8e\xab\xdd\x51\x54\xec\x6c\x8e\xc4\x2b\xa8\x20\
+\xc3\x00\xeb\xf8\xe6\x99\xf8\x3d\x02\x9c\x6e\x8f\x61\xcf\x91\xf0\
+\xa6\x31\x01\xda\xca\x6a\xff\x80\xc9\xf4\x92\x0d\xd9\x28\x5b\x94\
+\x86\x8a\x0b\x31\x38\xc8\x57\xaf\x26\x90\x4a\x29\x28\x36\x84\xe1\
+\xdb\x9a\x36\x9c\x3d\x73\x35\xc2\x35\xf5\x3d\x83\x29\xef\xbf\xfe\
+\xd2\x34\xdf\xda\x79\x5e\x9c\x21\xc0\xce\xd3\x5d\xf8\xeb\x5c\xf4\
+\xf9\x51\x00\xa5\xe8\xb0\x3f\x1e\x37\xf4\xac\xc2\x59\x28\x7e\x26\
+\x0b\x5f\xd7\xdf\x80\x93\xda\x4e\x51\x05\xa8\xae\x34\xcb\x2c\x38\
+\x52\x5c\x02\x19\x1e\x0b\x33\xb9\x41\x9d\x63\x60\x4e\xb2\x86\x9c\
+\x14\x0d\x75\x5d\x80\x4a\x01\x6c\x3d\xd0\x86\xce\x8e\x81\xcc\x11\
+\x00\xb1\xec\x80\xdf\x30\x2c\x3d\xb3\x60\x36\x8a\x8b\xe7\x60\xc7\
+\xa9\x08\x89\x73\x68\x1a\x45\xcd\x2d\x08\x12\x56\xc9\x7f\x95\xd6\
+\x30\x65\x26\x0c\x8c\x8e\x74\xb7\xc0\x6c\x37\x43\x12\x6d\xb6\x34\
+\x27\x6d\xb4\x8b\xd7\xf1\xfd\xc1\xd0\x6f\x91\x2d\xb3\x17\x0c\x03\
+\x96\xee\xf3\xa3\x3f\xae\x07\x48\x7c\xe5\x9a\xf9\xf8\xa6\xb6\xc7\
+\x8e\x54\xa5\x88\xa5\xb0\x22\xb3\xa0\xc3\xbe\x1e\x84\x28\xd6\x20\
+\x8c\x7e\x0a\x9d\x1c\x1e\x81\xf6\xf3\x9d\x38\x77\xb6\x13\x9a\x9b\
+\xcf\xe8\xfc\x70\x6e\x4b\x02\xf0\xd8\x5e\x12\x1f\xd0\xd3\x17\xcf\
+\xc3\x8a\x75\xb9\xd8\x53\xdd\x4d\x69\xd2\xc6\x21\x31\xc1\x25\x40\
+\x46\x3b\x06\x44\xd6\x83\x6a\xa1\xd1\xda\xe3\xe4\xa8\xaf\x6d\x43\
+\x57\x4b\x17\x41\x45\xe0\xda\xb6\xfb\x82\x52\x9a\x61\xf1\xae\x34\
+\xc4\x8d\x8e\xa9\x8b\xf2\xf0\xc4\xfa\x5c\x7c\xf7\x53\xd8\x16\x56\
+\xe9\x45\xe9\xb7\x4a\x16\xd1\x87\x0b\x0a\xa5\x2f\xc0\x12\x10\x95\
+\x20\x9c\xac\x23\x88\xa2\x71\xb8\xdc\x0a\x1a\x6a\xaf\xe0\x7a\x63\
+\x27\xb8\xd3\x11\x88\x7c\x96\x13\x1c\x32\x86\xe1\xc1\xaf\xda\x92\
+\xf2\x17\x64\x3c\xbc\x2e\x0f\x95\x87\xc3\x76\x87\xd8\xd1\x0e\x46\
+\x69\x43\xe4\x35\x3d\x2a\x24\xc4\x92\xa2\x83\x99\x10\xdc\xe3\xd5\
+\xf0\x4f\x4d\x0b\x22\x4d\x61\x30\x87\x1a\xe8\xfd\xf2\xfe\xe0\xcd\
+\x75\x65\xc8\xa9\xb0\x16\xef\x28\x47\x5d\x65\xbb\x34\x12\x82\x5a\
+\x85\xdb\x2f\x27\x6c\x91\x56\xc9\xeb\xff\x20\x64\x85\x6d\x19\xdd\
+\x73\x7a\x34\xb4\x54\x37\x21\xda\x78\x15\xcc\xad\x04\xa2\x3b\x1e\
+\x0a\xde\xda\x95\x0c\x0b\xb7\x37\x40\x78\xe7\x63\xc5\xe3\xb4\xe2\
+\xd2\x60\xdb\x63\x2e\x61\x3c\xe1\xaf\x14\x14\x23\x6c\x13\x50\x7c\
+\x2a\xda\x8e\x36\xa2\xb7\xa9\x03\xaa\x53\x04\xa2\xbb\x1f\x1d\x25\
+\x9e\x00\xc8\xb1\x70\xbb\x0e\xcd\xe7\xc7\xf2\xc2\xc1\x7e\x1d\x86\
+\xc8\xb6\x54\x06\x21\x9c\x66\x97\x04\x79\x55\x84\xaa\x1b\x11\x6b\
+\xd6\xc9\x73\x67\x20\xb6\xb7\x70\x4c\xf1\x61\xc0\x10\xc4\xe9\xf5\
+\xe3\xc9\xa5\xb4\xa0\x6d\x4b\x46\x0b\x91\xa8\x87\xa0\x3d\x60\xcf\
+\x74\xc3\x95\xa4\xa1\xbb\xea\x3c\xfa\xaf\xb4\xda\x9e\x0f\xec\x5f\
+\x76\x5b\xf1\x91\x00\x39\x1e\x20\x88\x42\x90\xa7\x97\x24\xec\xa2\
+\x8a\x0b\x3e\x04\x21\xbb\xa6\x6a\xb8\x71\xec\x6f\xc4\x9b\x83\xe0\
+\x0e\x25\x60\x1c\x2a\x1a\x57\x7c\x34\xe0\x56\x08\xb5\x22\x23\x9f\
+\xe4\xff\xac\xea\x75\x20\x76\xac\x01\x56\xb0\x85\xbe\x6a\xce\x00\
+\xaa\x9e\xbd\xa3\xf8\xd8\x80\x11\x76\x2d\xb1\xfb\x91\x39\x5d\xb0\
+\x4e\xfc\x01\xb4\x5e\xa2\xaf\x1c\x89\xd7\xbc\x38\x21\xf1\xdb\x03\
+\x6e\x86\x14\x3d\x05\x9c\xac\x27\xf1\xcb\x24\xee\x08\xa0\x6e\xcd\
+\x84\xc5\xc7\x07\xd8\x76\x7d\xde\x80\x78\x7c\x3e\x15\xa0\x9d\xda\
+\x25\x17\xbf\x96\x85\x26\x23\x2e\xc7\xbf\xb0\x2f\x88\xfe\x51\x0e\
+\x6a\x4b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xd2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x99\x49\x44\x41\x54\x78\xda\xad\xd6\x7d\x50\x14\x65\
+\x1c\x07\xf0\xef\xb3\xcf\xee\xde\x1d\xe0\x18\x6a\x03\x1d\x12\xaf\
+\x1a\x64\x18\xd1\x90\x3a\xcd\x14\x3a\xbd\x4c\xd9\xcb\xd8\x58\xfd\
+\x57\x53\x39\x4e\x35\x53\xd3\xa4\xa4\xbd\xaa\x15\x99\x8c\x8c\x31\
+\xe4\x8c\x53\x4d\xc4\x98\x29\x2a\x04\xf2\x8e\x04\x0a\x22\x98\xbc\
+\xc6\x79\x80\x19\x0a\xc6\xa5\x02\x07\x1c\x77\x1c\xb7\xdc\xee\xf6\
+\xec\xbd\xa1\x0d\x35\x43\xc3\xcd\xec\xfc\xf6\xb9\xdd\x79\x3e\xcf\
+\xef\xf7\x3c\xfb\xec\x12\xcc\xd3\xaf\xae\x7f\xd3\x77\x2c\xbc\xa6\
+\x9d\x13\x42\x40\x39\x0e\x8d\x16\x0b\xc8\x7c\x74\x5e\xff\x67\xd6\
+\x1e\x16\xde\xf3\xb7\xf5\xbc\x88\x3d\x4d\x85\x18\x77\x8e\xce\x0f\
+\x50\xde\xff\xc9\x4e\x16\x76\xf8\xdb\x06\x41\x44\x4e\x63\x0d\xec\
+\x2e\xdb\xfc\x00\x65\xfd\x3b\x18\x40\x66\x00\x51\x44\x76\x5d\x15\
+\x26\xe7\x0d\xe8\xdb\xf2\x81\x4a\x42\x32\xe0\xeb\x4e\x03\xf6\xd5\
+\x30\x40\xfa\x9f\xc0\xf1\x7e\x97\x56\x73\xa7\x76\x4e\x89\x28\x71\
+\x4a\xd1\xa3\x50\xda\xd2\x58\x2b\x00\x64\x55\x55\xc2\x39\xd7\x0c\
+\x8e\x5d\x71\x2d\x64\xa1\x87\x1d\xe1\x5a\x9b\xe3\x08\xac\x4e\x76\
+\xd8\xeb\x91\x18\xfa\x0b\xdc\x8a\xe8\xb9\x2f\x48\x03\x2a\xca\x58\
+\x89\xec\x73\x03\xea\x2c\xae\x2f\x59\xd8\x16\xa8\x35\xcf\x61\x57\
+\xed\x10\xee\x36\xb6\x23\xed\xce\x66\x48\x6e\x21\x00\xec\x2d\x2e\
+\x61\xc0\xc4\xdc\x80\x92\x7e\x69\x27\x20\x07\x26\x33\x58\xe0\xb0\
+\xfb\xe4\x0d\xdc\x13\xd9\x89\xb4\xe8\x73\x70\xf9\x80\x60\x9d\x1e\
+\x59\xc5\x27\x60\x9f\x9c\x73\x89\xd4\x8f\x45\x4c\x7d\x0a\xa8\xde\
+\x8e\x44\x8a\x8c\x72\x0b\x56\x46\x77\x62\x6d\x6c\x1b\x03\x78\x36\
+\x27\x14\x2e\xce\x8a\x2f\x7e\x28\x45\x90\x5e\xf7\xdf\x80\x3a\x10\
+\x11\xc7\x2a\xbd\x88\x9d\x2a\xe0\xc6\xa6\x4e\xc9\x5d\x6f\x8f\xb8\
+\xc3\x36\x73\x90\x67\x80\xd2\xab\x58\x19\x63\xc2\xba\x65\x1d\x90\
+\x64\x11\xb2\x22\xa1\x69\xb4\x0c\xa7\x4b\xa7\x20\x8a\xdc\xec\x80\
+\x6a\x7d\x87\xc0\x55\x5b\x07\xd5\xfd\xb0\xe7\x0f\xc2\x31\x62\x18\
+\xed\xe6\x37\x71\x31\xee\x23\x50\x79\x72\x06\x28\xba\x82\x7b\xe3\
+\x4d\x58\xbb\xfc\x02\x14\x99\x47\xc3\x50\x15\x64\x3a\x85\x86\x13\
+\x4e\x08\x22\x99\x1d\x98\x1a\x7c\x6e\x35\x08\xdf\xe4\x6d\x11\x70\
+\x7a\x0e\x57\x33\xcd\xb8\x14\xf6\x02\x86\x9f\xdd\x0e\x4e\x9a\xf4\
+\x4d\x26\xc5\xee\x82\x3e\x24\x27\x76\xe3\x91\x84\x0b\xa8\xb5\xd4\
+\xc0\x39\xed\x84\x41\xc7\xe3\x54\x91\xfd\xdf\x01\xd7\xe0\xc6\xfb\
+\x59\x99\x5b\xfc\x6d\x6a\xa0\x18\xf8\xca\x8c\xde\xc5\x2f\xe2\xc6\
+\xfa\x6d\x01\xc0\xa0\xa3\xc8\xcc\xbf\x84\xe5\xcb\xce\x23\x34\xe2\
+\x7b\xb6\xf7\x48\x9e\x39\x10\x74\x04\xf5\x05\x76\x4f\x9c\x1d\x18\
+\xdd\xb8\x02\x13\x30\xdd\x0c\xf4\x33\xa0\x7b\xc9\xf3\xb8\xb6\x5e\
+\xcb\xc0\xc1\x76\x4c\x6d\xb5\xf0\xd8\xfb\xd3\xef\x08\xb9\xe3\x18\
+\xa2\xe2\xca\xa0\x28\x7a\xcf\xfd\x5a\xc7\x0d\x47\x27\x66\x00\x57\
+\xfa\xd3\x2f\x83\xd2\x38\x70\x6c\x32\x65\x5e\x46\x32\x5d\x4a\x1e\
+\x52\x37\xc3\xe5\x5d\x2d\x34\x88\xa2\x2f\xdb\x04\xd3\x62\x0d\x78\
+\x1f\xc2\xb4\x96\x81\x8a\x1e\x87\x82\xc2\x43\x66\xc4\x24\x55\x62\
+\x69\x7c\x39\x64\x59\x0c\x00\x8d\x47\x6d\x5e\x40\xda\x9f\x6e\x85\
+\xdb\x1d\xea\x19\x92\xc0\x43\xed\xbc\x08\xc5\xd4\x0d\xfe\x78\x2a\
+\x54\x9b\xdb\x0b\xe8\x29\xfe\xd8\xdf\x09\x13\xcb\x60\xe4\x99\xed\
+\x18\x18\x1e\x47\xeb\x35\x09\xbc\x40\x61\x2e\xed\x45\x44\x4a\x39\
+\xa2\xe2\xab\x6f\x01\xce\xe4\xfb\x81\xdc\x0c\xd5\xbf\x49\x11\x83\
+\x08\xc7\xe7\x87\x59\xc7\x03\x08\x69\x7e\x02\xea\xd8\xb4\x67\x05\
+\x51\x83\x80\xbe\x6f\xda\x51\x43\x9f\x44\x41\xea\x56\x28\x0e\x07\
+\xab\x35\x01\xcf\x4a\xd4\x5d\xd2\x85\xc8\x94\x6a\xc4\x24\xb0\xad\
+\xc2\x0f\xe8\x59\x06\x3f\x8e\x83\x67\x15\x23\x52\xce\x87\xaa\xbf\
+\xd6\x5c\xb0\x1e\xd6\xec\x62\xc8\xe3\x83\xb8\xfd\xec\x53\x6c\xb9\
+\x3a\x20\x4f\x0e\x80\x2a\x83\xe8\xde\x37\x84\x7c\xe3\x1b\x38\xb9\
+\x2a\x1d\x7a\xdf\x32\xa5\x22\x8f\xcb\x25\xbf\xb1\x0c\x6a\x10\xbb\
+\xa2\xee\x56\xe0\xa0\x0f\x70\xa5\xbf\xe4\x05\xd8\xc6\x85\xeb\x7f\
+\xc1\x52\xd3\x0b\x59\x1d\x47\xe4\x61\x01\xf2\x75\xf6\xa8\x73\x94\
+\xdd\x48\x60\xce\x05\x0e\x19\x5f\x47\x35\xcb\x40\xe7\xf6\x02\x1c\
+\x03\x06\x4b\x3a\x10\xf1\x40\x1d\xa2\x93\x4e\x43\x76\xcf\x00\x4d\
+\x07\xc7\xbc\xc0\x64\x42\xb8\x17\xd0\xde\xa3\x94\xa2\xe7\xf2\x04\
+\x70\x9b\x82\xc4\x6f\x09\x64\x9b\xb7\x74\xbc\x41\x85\x29\x4f\x41\
+\xae\x71\x13\x2a\x53\xb6\x42\xf4\x01\x84\x01\xd6\x92\x36\x44\xac\
+\xae\x47\x6c\xf2\x19\x06\x08\x01\xa0\x39\x6f\xcc\x13\x89\x23\xc6\
+\x18\x28\x11\x4f\x09\x5a\x2c\x6c\xd4\x0b\x14\xa4\x1e\x10\xe0\xb6\
+\x79\x2f\xf1\x7a\x15\x5d\x47\x14\x1c\x08\x7f\x15\x95\x49\x5b\x20\
+\xca\x7e\x40\xc0\x44\x45\x0b\x22\xd6\x34\x20\xfe\xbe\xa6\x7f\x00\
+\xa3\x3e\x20\x3c\x2c\x00\x68\x09\x56\x8f\xd8\xc0\x2d\x50\xf1\xd8\
+\xd7\x7a\x48\x76\xef\x25\xf6\x8a\x45\x47\xe1\x34\x72\xc2\x5f\x41\
+\x45\x52\x3a\xcb\xc0\x11\x00\xa6\xca\xce\xc1\xb8\xe6\x57\xdc\xb5\
+\xea\x2c\x03\x78\xdf\x80\x08\xce\x33\x80\xc5\x1e\x62\x5f\xb8\x24\
+\x00\xe8\xd8\xa7\xc6\x91\x51\x2b\x16\x19\xb9\x9f\x1f\xff\x2c\x78\
+\x83\x1f\x60\x1f\x09\x30\x97\xbb\x46\xdf\x8a\xde\x65\xee\x8a\xda\
+\xf0\xa0\x20\x3b\x7d\x23\x12\x20\x95\xb6\xb6\xae\x7b\x37\x27\x9f\
+\x52\x35\x53\x55\xc8\xcd\x40\x4f\x5f\x5e\x6f\xe2\xdf\xed\xfb\xf1\
+\xb4\x61\xaa\x82\x28\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x06\x93\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x5a\x49\x44\x41\x54\x78\xda\x85\x55\x6b\x50\x54\x65\
+\x18\x7e\xbe\x73\xf6\xec\x9d\x15\x84\x35\x11\x12\x16\x11\x43\x04\
+\x14\x01\x95\x4c\x96\x0c\x8b\xbc\x65\x9a\x8a\x79\xcf\xd2\x16\x33\
+\x27\xa7\x9a\xfc\x91\xf6\xc7\xb2\xac\x1f\x8d\xa2\xe6\x58\x99\x93\
+\x02\x3a\xa3\xd1\x74\x41\xb3\x41\x53\x51\x40\x04\x0d\x12\x35\x90\
+\x06\xa5\xb8\x2d\x2c\xec\xf5\xdc\xfa\xce\x21\x20\xc7\xc8\x77\x66\
+\x67\xcf\x9c\xf3\x7d\xcf\xf3\x5e\x9e\xf7\x7d\x09\xfe\xc7\x86\x3f\
+\xbb\xfb\x69\x51\x94\x56\x49\x92\x34\x8f\xfe\x4c\x7a\x93\x5e\x7d\
+\xef\x73\xfb\xc0\x30\x8c\x9b\xfe\x8a\x59\x96\x39\xd4\xf9\xfd\xc6\
+\x92\xa1\x30\xc8\x7f\xbd\x0c\x9d\xbb\x37\x99\xf7\x07\x2a\x2c\x61\
+\x21\x5c\xd4\xd8\x70\x44\x44\x85\x22\x38\xd8\x04\x9d\x8e\x53\xbf\
+\xfb\xfd\x3c\xba\xba\xdc\xb8\xdb\xd4\x81\xa6\x5b\x2d\x70\xb5\x3b\
+\x79\x4e\xa7\x4d\xeb\xf8\xf6\xd5\x9a\x87\x12\x84\xcd\xcb\xdf\x43\
+\x18\xd6\x91\x9e\x99\x88\xe8\x98\x11\xd0\x99\x39\x30\x32\x03\x49\
+\x92\xef\x3b\xc7\x30\x04\x12\x91\xe0\xef\xe5\xd1\xd4\xd8\x8a\xf2\
+\xd2\xeb\xf4\x8c\x98\xdf\x5e\xec\xc8\x1b\x92\xc0\x3a\x6f\x7f\xe1\
+\x30\x6b\xf0\xe2\xac\xec\x09\x08\x19\x69\x01\x45\x00\x28\x2e\x61\
+\x06\x0f\xcb\xff\xbe\xc6\x12\xb0\x2c\x0b\x57\x67\x0f\xdc\xdd\x3e\
+\xfc\x52\x5a\x8b\xee\xd6\xae\xa2\xb6\xe2\xf5\x4b\x1e\x20\x08\x5f\
+\xf4\xf9\x1e\x73\x88\xc9\x31\xff\xb9\x54\x18\xcd\x46\xc8\x92\x84\
+\x00\xf5\xba\xcb\x2f\xc2\xe9\x16\xe0\x16\x24\x48\x32\x3d\x1e\x10\
+\x69\x8e\x7c\xd0\x0b\x02\x04\x8f\x1b\xf7\x9a\xdb\x31\xc9\x16\x8a\
+\x86\x36\x17\xa6\x64\x26\xe1\xf8\xb1\x4b\xe8\x75\xba\xf3\x5b\x8e\
+\xaf\xcd\x1b\x20\x18\x9d\x7b\x28\x59\x90\xe4\xea\x25\xb9\x8f\x63\
+\x44\xa8\x05\x1e\x7a\xb9\xc5\x25\xa0\xcd\xcd\x2b\x4e\x52\x30\x11\
+\x42\xc0\x0b\xaf\xd3\x87\x30\x33\x83\xd8\x11\x46\x8c\x1d\x69\x46\
+\xaa\x2d\x04\x36\x25\x52\x6a\xc9\x79\x85\x58\xb9\x66\x16\xee\xde\
+\xed\x40\xe1\xd1\x0b\xd0\x30\x64\xe2\x1f\x47\x57\xd5\xa8\x04\xe1\
+\x2f\x7c\x19\x98\x99\x9d\xc0\x4d\x4e\x89\x46\x4b\x57\x00\xcd\x4e\
+\x3f\x08\x51\x52\xc3\x80\x15\x78\xb4\x36\xb5\x61\x6d\xc6\x48\x2c\
+\xca\xb0\x0d\xa9\xb8\x24\x47\x01\xe6\x2e\x7d\x12\x56\x13\x83\x2b\
+\x55\x77\x70\xe6\x74\x2d\xdf\x72\x6c\xb5\x96\x44\xaf\x38\x9a\xa9\
+\x35\x72\xa5\x1b\x57\xcf\x40\x63\x37\x55\x87\x47\x00\x43\xd1\xfb\
+\xf2\x4e\xe0\xe9\xf1\xe0\xab\xdc\xb1\x60\x99\xbe\x6c\x76\xba\xfd\
+\x68\xed\xf2\xa1\xb6\xc9\x89\x8b\xf5\xad\x38\x5f\xfb\x17\x2e\xef\
+\x9a\x4b\x23\x28\x40\x5a\x4e\x26\x2c\x9c\x0c\xdb\x30\x0e\xbb\xbf\
+\x3c\x87\x80\x87\xb7\x93\xd1\x2b\x0a\xf6\xa6\xa7\x47\x6f\x98\x9c\
+\x62\xc3\x1d\xea\x39\x4b\x06\xeb\x4e\xe8\xb3\xd3\xe9\xc1\x81\x85\
+\x31\xf0\xd3\x48\x2e\xd4\xb5\xe2\x95\x43\x75\xd0\x69\x08\x32\x92\
+\xc2\x61\xb4\x98\x51\x7f\xfd\x36\xce\xbd\x37\x4b\x25\xc8\x5c\x90\
+\x85\x80\x3f\x80\xe8\x10\x1d\x8d\xa2\x11\xe5\xe5\x77\xf6\x91\x47\
+\x57\x15\x36\x2c\x5b\x92\x66\xf3\x12\x3d\x88\x3c\xa8\x11\x05\x5c\
+\x43\xa3\xb8\xf5\xa7\x0b\x27\x56\x8e\xc3\xbc\xfd\xd5\xa8\xbe\xd6\
+\x8a\x14\x7b\x3c\x18\x51\x86\x96\x7e\x0c\x35\x6b\x70\xb3\xea\x06\
+\x4e\x6f\xb5\xab\x04\xd9\x0b\x67\x42\xa0\x3d\x22\xd3\xbb\x06\xd9\
+\x87\x23\x85\x15\x8d\x24\x72\x65\x81\xbc\x6a\x8d\x9d\x7a\xd8\x0f\
+\xde\xf7\xdf\xd2\x23\xe2\x2f\xb7\x88\xfa\x9a\x46\x34\x7d\x64\xc7\
+\xa8\x57\x4b\x30\x2e\x25\x06\x5a\x03\x07\x99\x12\xc8\x44\x06\xd1\
+\x68\x50\x76\xf2\x02\x7a\x8a\x72\x91\xb0\xfe\x08\x9e\x5b\xfe\x8c\
+\x1a\x81\x62\x4a\x94\x87\xbe\x28\x05\x89\xdb\x58\x2c\xbf\x98\x9b\
+\x41\x95\xc7\xd3\xe6\x01\xba\xfd\x32\x6e\xb7\x2b\xcf\x12\x34\x1a\
+\x16\xd7\x2a\x1b\xd0\xb0\x33\x13\x91\x79\xa7\x10\x4f\x45\x60\x34\
+\xeb\x21\xff\x13\xa9\x46\xab\xc1\x99\x82\xb3\xe8\x2e\x5a\x06\x36\
+\xe7\x33\x6c\x7e\x7b\x21\x8c\xe0\x69\xc3\x51\x02\x3d\x87\xaf\x8f\
+\x96\x81\x24\xbc\x71\x5a\x7e\x71\x51\x2a\x44\x5e\xc0\x6d\x27\x2d\
+\xb2\x57\x54\xbb\x54\x29\x85\xd2\x44\x95\x97\xeb\x07\x08\x12\xd3\
+\x62\x60\xa2\x3d\xa2\x76\x32\x25\xa7\x71\xe0\xe4\xc1\x1f\xc0\x7f\
+\xbb\x06\xba\x39\x07\x30\x77\xdd\x7c\x98\x89\x88\xd8\x10\x0e\x2c\
+\xa7\xc1\xe1\x22\x4a\x10\xbb\xa9\x44\xde\xb8\x7a\x2a\x7e\xbd\xe7\
+\x41\xb7\x4f\x52\x75\xdf\x57\x60\xea\x21\xc7\xe2\xfc\xb9\x1b\x68\
+\xf8\xb0\x8f\x20\x65\xda\x18\x58\x82\x4c\x10\x69\x87\x5f\xbd\x78\
+\x1d\xf5\x95\xf5\xd8\xf5\x56\x36\xb6\xe4\xc4\x41\x37\xfb\x00\x96\
+\xe6\x2d\x80\xd7\x1b\xc0\x30\x3d\x83\x09\xa3\x8c\x54\x49\x97\x40\
+\xe2\xdf\x38\xd3\x60\x7f\x6a\xbc\xcd\xe5\xa7\x5e\xfd\x03\xae\xc8\
+\x54\x52\x24\xe9\xf2\xa2\x8a\xaa\xe1\xde\x27\x59\x88\x70\x9c\xc2\
+\xd4\xe9\x71\x08\x0a\x31\xe3\x9b\x83\x25\xd8\xb6\x2e\x0d\x9b\x9f\
+\x89\x1b\x50\x9c\x42\xb0\x62\xd3\x42\x04\x7c\x01\x28\x63\xcb\xa2\
+\x03\x4a\x7f\xaa\x6b\x24\x89\x5b\x4b\xf7\xc6\x3c\x16\xb9\xc1\x6a\
+\xb5\xa8\x03\x4d\xd1\x7b\x7b\xaf\x80\x8a\x0b\x37\x30\x7f\xc6\x68\
+\x3c\x16\xa6\x47\xde\x13\x11\x88\xa0\x45\x9e\x31\x6b\x02\x6e\x9e\
+\xbd\x82\x75\xb3\xc7\xc3\x91\x1d\x7b\x5f\xa3\x29\x04\x6b\xb7\xbc\
+\xa0\x12\x28\x29\x6e\xa3\xa3\xa3\xe1\x46\xf3\x3e\x32\x69\xdb\xc5\
+\x4c\x43\x90\xbe\x74\x52\x6a\x34\x04\x5e\x02\xcd\x12\x4e\x7d\x57\
+\x8d\xfa\x5d\x59\x08\xe2\x98\x01\x80\xf0\x0d\x3f\x62\x66\x4e\x12\
+\xea\x7e\xae\xc4\x9a\x39\xf1\x78\x2d\x7b\xec\xc0\xb7\xba\x66\x27\
+\x52\xd7\x17\xe1\xa5\x77\x72\x55\x15\x71\xb4\x3e\x57\x2b\xef\xc0\
+\xdb\xe3\xb3\xab\x49\x49\xd9\x5e\x16\x48\x9c\x1c\xc5\x85\x0d\x0f\
+\x42\xf1\xc9\x4a\xec\x78\x29\x15\x8b\xc6\x99\xef\xf3\xf0\x91\xf5\
+\x3f\x62\xd6\x9c\x24\x2a\x06\x09\x95\xa7\x2b\xf0\xc3\xbb\x33\x11\
+\x11\x6a\x40\x43\x6b\x0f\x12\x57\x1c\x46\xce\xf2\x6c\x8c\x89\x8d\
+\xa4\x0a\x93\xe0\xea\xf5\xe2\xfa\x95\x26\xbe\x6a\xfb\x34\xad\x4a\
+\x90\xfa\x7e\x45\x32\xa3\xd1\x54\x67\xcd\x18\x87\x13\xc7\x2f\x63\
+\x41\x4e\x02\x3e\xc8\xb2\x0e\x80\x77\xd1\xc2\xc5\xbf\x7e\x06\xcf\
+\x2f\x4e\x47\x90\xc5\x80\x72\x9a\xbe\xfa\xda\x26\x3a\x35\x7b\x11\
+\x3c\xc2\x82\xa9\x59\xc9\xb0\x45\x59\xc1\xf3\xa2\xaa\x8e\xf3\x65\
+\xbf\x43\x12\x84\x89\x95\xef\xa4\xd5\x0c\xcc\x85\xf4\x9d\x57\xf7\
+\x04\x5b\x4d\x8e\x8c\xd4\x28\x1c\xfc\xfc\x1c\x76\xac\x4b\xc7\xf2\
+\x04\x0b\x0e\xff\xea\xc2\x9b\x9f\x55\xc0\x3e\x7d\x0c\xa2\x29\x08\
+\x5d\x9d\x60\x58\x46\x95\xb0\xa2\x34\xa5\x27\x44\x3a\x6d\x95\xfa\
+\x69\x69\x4a\xcb\x6b\xee\xa2\xbb\xc3\x93\x5f\xfe\xf6\xa4\xc1\x71\
+\xdd\x6f\x53\x3e\xbe\x56\x18\x66\x35\x2d\x4e\x49\x1a\x85\xaf\x0f\
+\x97\xd1\x96\xa1\x8a\xa2\x00\xcb\x97\x4d\xa3\x48\x92\x0a\x2e\xdf\
+\xbf\xd8\x54\x00\x45\x75\x8a\x04\xab\xe8\xe0\xeb\xec\x70\x17\x5d\
+\xde\x92\xf4\xe0\xc2\xe9\xb7\x8c\x4f\x7f\xdb\xc3\xe9\x18\x47\x5a\
+\xf2\x48\x0c\xb7\x18\x21\x88\x74\xf1\x04\x04\x2a\x3d\xb9\x7f\x9d\
+\x0d\x0c\x42\xb5\x57\x68\x34\x9d\x2e\x0f\xae\xd6\xb6\xd1\xfa\xc8\
+\xf9\x17\x37\xc5\x0f\xbd\x32\xfb\x6d\x7a\xfe\x4d\x65\x01\x55\x0c\
+\x0f\xd6\x73\x91\xe1\x06\x84\x06\x19\x60\xd0\xb1\x83\x04\xf4\x96\
+\x97\x6e\xba\x8e\x1e\x2f\x9a\x5b\xbc\xe8\xec\xf2\xf1\x74\xc1\xa4\
+\x9d\x77\xc4\x3d\x7c\xe9\xff\xdb\xec\x07\x6e\x67\x4a\x12\x59\x2a\
+\x12\xf9\x69\x59\x92\x6d\x06\x83\x56\x7d\xaf\x74\x2b\x61\x48\x23\
+\x2b\x93\x12\x86\x91\x0b\x4a\x5f\x8e\x3d\x3b\x14\xc6\xdf\xef\x88\
+\xb6\x3d\xad\x50\x35\x0c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x03\x01\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xc8\x49\x44\x41\x54\x78\xda\xb5\x95\x4d\x4b\xa2\x51\
+\x14\x80\xcf\xab\x95\x08\x59\x8a\x1f\x61\xd8\x87\x45\x22\x49\xe3\
+\xb4\xe8\x07\xf8\x03\x66\x35\x4c\x5c\x41\x8c\x1a\x68\x3d\xbf\x60\
+\x36\xf3\x0b\xe6\x07\x34\x8b\x11\x7c\x5f\x51\x72\x23\x48\x0b\x0b\
+\x45\xa1\xdc\x38\xdb\x56\x2d\xdc\x48\x11\x22\x82\x9a\x65\xce\x39\
+\x87\xb9\x2f\xe9\x4c\x93\x3a\xcd\x81\xc3\xfd\xd2\xfb\xdc\xf3\xf9\
+\x2a\x30\x24\x3b\x3b\x3b\x47\xeb\xeb\xeb\x07\x57\x57\x57\xdf\x2e\
+\x2e\x2e\x3e\xc2\x3f\x8a\xf2\x74\x11\x0c\x06\xd5\x68\x34\x2a\x56\
+\x57\x57\xa1\x56\xab\x41\x2c\x16\xd3\xce\xcf\xcf\xc3\xaf\x02\x08\
+\x04\x02\xea\xde\xde\x9e\xb0\x5a\xad\x80\x2f\x87\xe9\xe9\x69\x40\
+\x4b\x20\x99\x4c\x6a\xe5\x72\x79\x62\x08\x03\x36\x36\x36\xd4\xfd\
+\xfd\x7d\x61\xb3\xd9\xe0\xec\xec\x0c\x6e\x6f\x6f\x61\x65\x65\x05\
+\x8c\x46\x23\x9d\x81\xaa\xaa\x5a\xa5\x52\x99\x08\xa2\x78\x3c\x9e\
+\xa3\xc3\xc3\xc3\x03\x87\xc3\x01\xa7\xa7\xa7\x90\x4a\xa5\xa4\x55\
+\x3d\xb4\xc8\x40\x13\xaf\xd7\xcb\x90\xcb\xcb\xcb\xb1\x21\x4a\x28\
+\x14\xea\xef\xee\xee\x42\xa9\x54\x02\x0c\x2c\x8d\x12\xd0\x8f\x44\
+\x22\xd0\x6e\xb7\x79\xb1\xb6\xb6\x06\x1a\x4a\xb5\x5a\x1d\x0b\xa2\
+\x2c\x2e\x2e\x1e\x6d\x6e\x6e\x1e\x2c\x2c\x2c\x40\xbf\xdf\x87\x78\
+\x3c\xde\xc3\x7d\x23\x1d\x0a\x21\x18\x70\x77\x77\x07\x8a\xa2\x30\
+\x04\xcf\xb5\x7a\xbd\x3e\x32\x84\x5f\xeb\x74\x3a\xd5\xad\xad\x2d\
+\x41\x90\x87\x87\x07\xfd\xb0\xd5\x6a\xf1\xfa\xfe\xfe\x1e\xba\xdd\
+\x2e\xef\xf9\xfd\x7e\x48\x24\x12\x5a\xb3\xd9\x1c\x09\xa2\x67\x91\
+\xdd\x6e\x57\xd1\x12\x81\x23\x5f\x48\xda\xeb\xf5\xd8\x2a\xb2\x80\
+\xe6\x04\xa3\xc0\x53\x76\x1d\x1f\x1f\x6b\x9d\x4e\xe7\x45\xc8\x40\
+\x1d\xcc\xce\xce\x32\x84\x52\x95\x00\x8f\x8f\x8f\x3c\xd2\xc5\xa4\
+\x12\x48\xe2\xf3\xf9\x20\x9d\x4e\x6b\xb8\x17\x1e\x19\x40\x82\xf9\
+\xaf\x62\x4d\x88\xf9\xf9\x79\xfd\x72\x72\x0f\xc1\x24\x80\xe6\x06\
+\x83\x81\x63\x92\xc9\x64\x34\xfc\x5b\x78\x64\x80\x84\xa0\xaf\x05\
+\x5a\xc4\xee\x91\xaf\x27\x25\xa1\x91\x20\x54\x8c\x94\xc2\xd9\x6c\
+\xf6\x59\x88\x02\xcf\x8b\x8a\x45\x26\xe6\xe6\xe6\xf4\x18\xd0\xa5\
+\x4f\x93\x80\xf6\x08\x42\x96\x9c\x9c\x9c\xfc\x11\xf2\x37\x00\x43\
+\xb0\xa2\x19\x22\x83\x4e\x10\xa9\x24\xe4\x32\x82\x50\xff\xca\xe5\
+\x72\xbf\x41\x5e\x02\x30\x64\x69\x69\x49\x58\x2c\x16\x3d\x16\x4f\
+\xad\x90\x31\x21\x08\xb5\x97\x7c\x3e\x3f\x00\x19\x05\xc0\x10\xb7\
+\xdb\xad\x43\xe8\x52\x19\x70\x99\x55\x54\x88\x53\x53\x53\x80\x8f\
+\x81\x62\xb1\xa8\x43\x46\x05\x30\xc4\xe5\x72\x31\x44\xa6\x30\xa9\
+\x04\x50\x56\xfd\x4a\x10\x58\x5e\x5e\x86\x42\xa1\xc0\x90\x71\x00\
+\x0c\xc1\xa6\x38\x10\x13\x92\xeb\xeb\x6b\x3d\x16\x66\xb3\x19\x66\
+\x66\x66\xd8\x5d\xd8\xe6\x63\xe3\x02\x18\x82\x6d\x9d\xeb\x44\xb6\
+\x0f\xfa\x38\xa1\x35\xef\x70\x5a\x45\xfd\x80\xda\x41\x7d\xcf\x9e\
+\x9b\x00\xc0\x10\xb4\x82\xbf\x1f\x64\xc5\xcd\xcd\x0d\xa5\xf2\x36\
+\xee\xff\x18\xfe\xe1\xa4\x00\x86\x60\x4b\xe1\xb6\x82\xdd\x15\x1a\
+\x8d\xc6\x27\xdc\xfb\xfa\x9a\x00\x86\xa0\xab\x84\xc9\x64\xa2\x38\
+\x7c\xc6\xf5\x97\xd7\x06\x30\x04\xdb\xbd\x40\x37\x91\x7b\xb6\xff\
+\x07\x80\xe4\x3b\xea\x1b\xd4\xb7\xc3\x07\x3f\x01\x81\xdb\x86\x9a\
+\x53\x7c\x84\x62\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x05\x82\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x49\x49\x44\x41\x54\x78\xda\x95\x55\x0b\x50\x54\x65\
+\x14\xfe\xfe\x7b\xf7\xc1\xc2\x2e\x82\xa2\x83\xa1\x35\xe5\x33\xd2\
+\x0c\xb1\xc1\x07\x96\x06\x51\x2a\x6a\x05\x3e\xca\x46\x52\x68\x6a\
+\x6c\x9c\x66\x94\xa9\xa6\x06\x6b\xd2\xa6\x91\xa1\xc6\x31\x4c\x6b\
+\xc7\xc9\x5e\x9a\x6e\x93\x89\x81\x43\x3e\xc0\x51\x40\x52\x41\x11\
+\x01\x85\xc4\x55\x14\x04\x63\x61\x1f\xec\x2e\x77\xf7\xfe\x9d\x7b\
+\x17\x4d\x07\x24\xd8\xdd\x7f\xee\xce\x7f\xff\x73\xbe\xef\x9c\xf3\
+\x9d\xf3\x33\x0c\xe2\x93\xf1\x52\x52\x14\x3d\xce\x70\xce\x23\x69\
+\x29\x5b\xa5\xb4\x1e\xe7\xe0\xe1\xb2\x2c\x83\xb6\xb2\x7f\xc8\x2f\
+\x7a\xff\x5e\x1b\x36\x18\x80\xd5\x8b\x13\xaf\xcb\x32\x1f\xa5\x38\
+\x93\xc9\xdb\x1d\x63\x05\x4a\x01\xec\x59\x1b\xf7\x14\x9e\xd8\x30\
+\x68\x80\x8c\x05\xf1\x63\xbc\x5c\xd3\x20\xf9\x7c\xf0\xf9\xfc\xb4\
+\x7c\xea\xbe\x4e\xa7\x83\x20\x08\x04\x42\x5f\x39\x00\x62\x39\x5a\
+\xca\x06\x04\x90\xbc\x70\xc9\xc4\x3f\x0e\x5a\xea\x54\x80\x79\x33\
+\x52\x5c\x7e\xf1\x57\xa7\xcb\x0d\x63\xa8\x11\x5f\x7e\x34\x1f\x86\
+\xe1\xe1\x48\x7b\xd3\x0c\x91\x00\x98\xc0\xd4\xa8\x10\x88\x62\xe6\
+\xef\xc7\x4f\x97\x3d\x10\x80\x1c\x6f\xa3\xc7\x1a\xc6\x98\xca\xcc\
+\xcf\x51\xa7\xf7\xbb\x87\x08\x92\x63\xa4\xc3\xde\x89\x7d\x96\x74\
+\x08\x43\x42\xc1\x98\x01\x37\x0e\x57\xe0\x9d\x4d\x07\x10\x64\x08\
+\x82\x28\x0a\x8a\x7f\x38\x1d\xf6\xd8\xe2\xf3\xf5\x15\x7d\x02\x2c\
+\x48\x4e\xfd\x94\x62\xcd\x92\xb9\xc2\x48\x56\xdc\xab\xa1\xd3\x0f\
+\x5e\x49\x22\x63\x27\x8e\xed\x7f\x05\x90\xc9\x98\xe9\x21\x18\x4c\
+\xe0\x0e\x09\x65\x7b\x8b\xf0\x6d\xfe\x05\xb8\x5c\x2e\x2c\x5b\xfd\
+\x76\xd6\xd4\xf8\x84\xaf\x62\x62\x62\x3a\x7b\x01\x24\xbd\x90\xac\
+\xf8\x53\x73\xe9\xa7\x62\xba\xdc\x12\x24\xc9\x07\x91\xa2\xd1\xe9\
+\x04\x74\x74\x38\xf0\xc9\x1b\x93\x91\xb8\x68\x1c\x18\xd7\x81\x77\
+\x7b\x89\x00\xbd\x1f\x12\x86\xa6\xbc\x43\x78\xd7\x5c\x8b\xa9\xd3\
+\x67\x2d\xcd\x31\xff\x64\xe9\x15\xc1\x9c\x39\x49\x61\x5c\x64\x36\
+\x4e\x39\x21\xb5\xc0\xe1\xf4\xe2\xc7\x9c\x79\x98\x1c\xf7\x08\x2a\
+\x4b\x1b\x91\xf1\x61\x21\xec\x54\x83\x55\x89\x51\xa4\xa8\x70\x70\
+\xbb\x0b\x94\x17\x30\x2d\x45\x12\x12\x8c\x6b\x45\x25\xc8\xb4\xd8\
+\x71\xbc\xba\xb1\xef\x22\x4f\x9f\x9d\x30\x93\x14\x52\xd2\x4d\x0a\
+\xf1\x74\xf9\x30\xe1\xe1\x30\xe4\x15\xa4\x01\x9e\x6e\x92\x8b\x08\
+\x5c\xef\xc0\x98\x79\xdf\x23\x2d\xce\x80\xf4\x24\x23\xa5\x49\x71\
+\xae\x01\xd3\xe9\xc1\x8c\x41\xf8\xeb\x97\x22\xe4\x9c\x82\x52\xf4\
+\x73\xc5\x17\x1a\x63\xfa\xac\xc1\xf2\xa5\x4b\xf8\xcb\xf1\x11\x98\
+\xfb\x74\x14\x86\xc7\x3e\x44\x15\x93\x02\x42\x57\x8e\x06\x6b\x61\
+\xde\x5a\x0e\x5d\xf3\x45\x24\x4c\xd0\xa9\x7b\x4c\xaf\x05\x08\x44\
+\x18\x1a\x8c\xd4\xf5\xa5\x3d\x85\x56\x94\x84\x0f\x4a\x6a\xaf\x6d\
+\xee\x05\x70\xe9\xcf\xed\x7c\xfc\x34\x72\x4a\xa4\xe1\xa7\xd7\x9e\
+\x76\x62\x4a\xa9\xf0\x7b\x01\x8d\x80\x2b\x35\x3e\xe4\xe5\xe6\x21\
+\xe5\x79\x6a\x6a\x92\x27\xf4\x14\x45\x88\x0e\xa7\x8e\xdc\x40\x76\
+\x99\x8d\x4c\xa8\x01\x99\xa2\x01\x3e\xbd\xb2\xe1\x56\x79\x2f\x00\
+\x7e\xc9\xcc\x21\xde\x24\xe6\xcd\x40\x57\x1b\xed\x28\x0d\x25\x04\
+\x5e\x12\x80\xf7\x42\x0b\x5a\xad\x0c\x27\x4f\x5a\x31\x7a\x98\x01\
+\x5a\x93\x06\x15\x8d\x4e\x3c\xfb\xdc\x28\x44\x17\x7b\x50\x54\x53\
+\x0b\x8f\xd7\x77\x71\x7e\xbb\x34\xa9\xcf\x14\xf1\xfc\xb5\x76\x44\
+\x38\x4d\xe8\xb4\x92\x5f\xcd\xfd\x47\x48\x45\xd6\x03\x57\xa1\x1b\
+\x3b\x05\x72\x84\x0b\xbc\xc1\x49\xa0\x5a\x88\xe3\xc2\xc1\xc4\x60\
+\x44\xe6\x13\x29\x2d\x91\xd9\x45\x85\x70\x78\xd6\x32\x74\xe5\xf6\
+\x06\xc8\x1a\xb9\x19\x69\x99\xef\xa1\x6a\x37\x55\x2b\x08\x6a\xbc\
+\x2a\x15\x25\x6e\x2f\xaa\xb7\xd4\x63\x68\xf4\x6c\x68\xd2\x47\x83\
+\xfb\xdd\x4a\x58\x10\xc3\xc3\xe0\xb3\xb4\x20\xb2\xee\x6a\x40\x0c\
+\x14\xa9\x7b\x7b\xa9\xd2\x41\xc1\xf7\x01\xbc\xb8\xcf\x36\x9a\xc9\
+\xd2\xee\x82\xdb\x2b\xe2\x31\x2d\x1a\x68\x3e\x43\xb5\xb0\x53\x24\
+\x64\x24\x48\xa8\xda\xdf\x84\xf5\xc9\xd7\xb1\xa5\x70\x0d\x9e\xb0\
+\x9d\x46\xfb\xce\x55\xe0\x3e\x2f\xa4\x9d\x97\x11\x79\xa2\x0a\x30\
+\xe9\x55\xe7\x24\x23\xf8\x2b\x9b\x61\xab\x6e\xce\xbe\x0b\x30\x77\
+\xe7\xd5\xe5\x63\x23\x8c\x7b\x96\xcd\x1e\xa6\x8c\x06\xe8\x73\x16\
+\x23\xd6\x5f\x05\x21\x2c\x0a\xb7\xcf\x97\xa0\x3c\x62\x31\x1a\x52\
+\xb6\xc1\x39\x22\x0a\x25\xf5\xc0\xc7\x7b\x57\x62\x6e\xf5\x21\x02\
+\xd6\xa9\xea\x82\x81\x9c\xeb\x35\x81\xc2\xd3\x5c\x52\x9c\x34\x1e\
+\xaa\x3d\xab\x02\x3c\x93\x7b\xf9\xa9\x31\x23\x82\x2b\x33\x68\xdc\
+\x57\xdc\x02\x9a\x1c\x4a\xbe\xe9\x8c\xf0\x5f\x76\x44\x02\x15\xa9\
+\xde\x22\x8d\x08\x2f\xfd\x2f\xac\x71\xe1\xb7\xdd\xc9\x78\xb4\xf5\
+\x12\xe5\x5d\xab\xb2\x56\x97\xd0\xc3\x99\x6a\x51\x7f\xd8\x1a\xa8\
+\x60\xf2\x8e\x5a\x9e\x99\x3a\x11\xe5\x37\xc8\xb9\x5d\xa2\x28\xfb\
+\x9f\xe2\x02\xbd\xef\x70\xd1\xc8\x3e\x56\x80\x5d\xfb\x56\x12\xf3\
+\x10\x62\x21\x04\x98\xdc\x31\xa5\x54\xd5\x9f\x6f\x05\x8b\xde\x50\
+\x92\xb1\x6e\xd1\x93\xe6\x0e\xbd\x11\x35\x2d\x5d\xff\xeb\xfc\x8e\
+\xf4\x04\x8d\x86\x52\xd5\x86\xb3\x9f\xcd\x80\xc6\xd3\x15\x60\x7f\
+\xcf\x09\xc9\xdb\x8d\x33\x6d\x36\xb0\xf8\x8d\x27\x2b\xd6\xad\x9c\
+\x15\x63\xa9\xea\x04\x67\x03\xbf\x81\x94\x4b\xc6\xfa\x8f\x13\x99\
+\x5f\xbc\x85\x59\xe7\x0e\xa2\x03\xa2\x6a\xdb\x4c\xda\xb1\x29\x3d\
+\x0a\x58\x49\x83\x99\xec\xb5\xed\x95\x7c\x52\xdc\x64\x14\xd7\xb7\
+\xab\xec\x07\x7c\xc5\x51\x4a\x5c\x34\xf8\x4c\x7b\xbf\x29\x7e\xbd\
+\x60\xe3\x11\x6a\xfc\x20\xb2\x3d\x41\x65\xb6\x2f\x07\x4e\xdd\x3d\
+\xf6\xea\x8e\xb3\xdc\x38\x76\x3c\x2a\x69\x90\x89\x03\xf5\x4e\xb9\
+\x66\x04\xe0\xf3\xba\xd1\x72\xe5\x76\x56\xd3\xe7\x71\x9b\x1e\x78\
+\x74\xca\xba\x83\xb5\x92\x29\x74\xa2\x3b\x74\x38\x49\xd2\x14\xb8\
+\xf2\xd4\x8e\xe3\xbd\x33\xcf\x7a\x24\xd5\x69\x07\x77\x3a\xc0\x5b\
+\xdb\xe8\x2e\xc0\x6a\xeb\xd7\x0b\xbf\xeb\xaf\x5e\x08\x5f\xf1\x73\
+\x0a\xfc\xfe\x65\xe4\x34\x96\xd6\x63\xa2\x46\x84\x6c\x0c\xe9\x49\
+\x17\x53\x47\x11\xb3\x3b\x7b\xc8\x8b\x7f\xd3\xfd\xdb\x28\x88\xe2\
+\x51\x41\x2b\x6c\xbd\x69\x4e\xed\xea\x2f\xd8\x7f\x01\x4e\x30\x47\
+\xf4\x8a\x28\x7e\xf4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\x44\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x0b\x49\x44\x41\x54\x78\xda\x8d\x95\x7b\x4c\x9b\x55\
+\x18\xc6\x9f\xef\xeb\x05\x11\xfe\x31\x99\x71\x51\xe3\x62\xe2\x25\
+\xd1\xb8\xe8\x08\x6c\x73\x5c\xc3\x65\xfd\xba\x95\x96\x71\x19\x9d\
+\x1d\x23\xe0\x40\x1d\x5b\x61\xce\x11\xad\xcb\x32\x97\xba\xa0\x53\
+\xd8\x64\xd9\x60\x83\x64\x50\x57\x60\x97\xae\x2d\xf4\x42\x31\x50\
+\x86\x30\x71\x9b\x66\x66\x26\x2e\x30\xd1\x6c\x46\x02\x3a\xe3\xb8\
+\x8c\x42\x7b\x3c\x5f\x41\x34\xda\xee\xf0\xfe\x73\xbe\x9c\xf7\x7c\
+\xe7\x77\x9e\xf7\x9c\x3c\x2f\x87\x10\xe1\x76\x79\x1d\x84\x10\x01\
+\x4b\x0c\x8e\xe3\x8e\xaf\x57\x24\xbd\x15\x32\xf7\xdf\x09\xbb\xd5\
+\x33\x98\x26\x24\xc5\x4a\xe8\xb7\x84\xe3\x98\x9b\xfb\x09\x81\x9f\
+\x8e\x5d\x4e\xef\x79\x95\x3a\x3d\x67\x29\x00\x92\x9c\x91\x80\x1d\
+\xa6\x4e\xf8\xfd\x81\xc5\x79\x9e\xff\x67\x69\x20\x40\x16\xbf\x25\
+\x12\x1e\xc7\x74\x19\xe8\xe9\xbc\x04\x0a\xe0\x98\x00\xdb\x05\x17\
+\x89\x4b\x59\x8b\x0a\x73\x37\xa2\xe4\xb2\xf9\x45\x74\xf3\xa1\x5f\
+\xee\x80\xa7\x8a\x02\xf4\xc4\xcf\x3c\xfe\x04\xc8\x02\x64\xd2\x37\
+\x8b\x6a\x6d\x0a\x06\xbb\x07\x90\xb9\x49\xc1\x06\x5c\x38\xeb\x20\
+\xaf\xa6\xc7\x63\x77\x9b\x17\x0f\xcb\xa5\xc1\x39\x7a\x1f\x58\xb6\
+\x6c\x39\x64\xf4\xb4\xb3\x54\xd5\xf8\xf8\xaf\x62\xdd\x83\xb9\x29\
+\xdf\x1c\x3e\xcd\x4b\x42\xbf\xa7\x0f\x9b\x72\x95\x6c\xc0\x39\xb3\
+\x8d\x24\x2a\x93\x51\xde\xd2\x83\x48\xe9\xbf\xd2\x14\x42\xfe\xfe\
+\x81\x6e\xce\x2d\xfc\x3d\x35\x4b\x50\x93\x9f\x8c\x5e\x47\x0f\x72\
+\xb4\x99\x6c\x40\xab\xe9\x3c\x49\x51\x65\x40\x6f\xee\xc2\x53\xb1\
+\xc9\xf8\x63\xca\x87\xb0\x77\xcd\x49\xf0\xe7\x77\x97\x50\xa3\x4d\
+\x43\xb7\xbd\x13\x9b\x75\xd9\x6c\x80\xb9\xe9\x2c\x49\xd7\x08\xd0\
+\x9f\xf1\x60\xf9\xcb\x09\x18\xb9\x3b\x1d\xf6\x35\x05\x28\x20\x72\
+\xe4\xab\x20\xa0\xf3\xa2\x13\xda\x82\x5c\x36\xa0\xb9\xd1\x4c\x52\
+\xb3\x04\xe4\xd5\x75\x61\x45\x5c\x3c\xae\x8d\xdc\x03\x2d\xfd\xff\
+\x83\xd6\x2b\x2a\x2a\x02\xd3\xdf\xf7\xc3\xad\x57\xa0\xcb\xe2\xc4\
+\xd6\x22\x2d\x1b\xd0\x50\xdf\x44\x12\x68\x89\xd2\x0e\x59\xf1\x6c\
+\xaa\x0a\xb7\x47\x27\x83\xaf\x27\x64\x48\x64\x18\x1b\x68\xc7\xc0\
+\x07\x39\xe8\xb5\xbb\x51\x5c\x52\xc0\x06\xd4\xd5\x36\x92\x44\xb5\
+\x02\xca\x4f\xec\x78\x69\xbd\x1a\x3f\x8d\x4e\x84\x05\x70\x52\x19\
+\xee\xf4\xb6\xc3\xfb\xbe\x06\x5e\xab\x0b\xa5\x65\x45\x6c\xc0\xb1\
+\x9a\x7a\x12\xaf\x16\xa0\x39\xea\xc4\x6a\xa5\x06\x3f\x3e\x00\xc0\
+\x53\xc0\x70\x8f\x0d\xee\xbd\x2a\xf4\x59\x9d\xd8\x51\x5e\xc2\x06\
+\xd4\x7c\x54\x4b\xd6\x69\x94\xc8\x3d\xee\x41\x8a\x26\x1b\xc3\x0f\
+\x28\x11\x2f\x93\xe1\x86\xdb\x82\x8e\xdd\x02\xfa\x2c\x1d\x28\xdf\
+\x5b\xc6\x06\x1c\x36\x56\x93\x35\x14\xa0\x3b\xe5\x85\x90\x9d\x8d\
+\xa1\xb1\x69\xf0\x61\xaf\x40\x8e\xab\xed\xe7\x60\xd9\x99\x8a\x7e\
+\x8b\x03\x7b\x0c\x15\x6c\xc0\xa1\x03\x55\x64\xb5\x4a\x89\xc2\xe6\
+\xcb\xc8\xca\xcf\xc5\xf0\x78\x78\x05\x52\x0a\xe8\xb3\xb4\xa1\xf5\
+\xf5\x44\x5c\xb6\x77\xe0\xdd\xfd\x95\x6c\xc0\x41\x83\x91\xc4\xa9\
+\x95\xd8\x6e\xfe\x1a\x5a\x5d\x1e\x05\x84\x57\x20\x95\xcb\xe1\x69\
+\x6b\x83\xa9\x70\x0d\x06\xad\x0e\xec\x33\x1a\xd8\x80\x7d\x95\xfb\
+\x49\xcc\xc6\x0d\xd8\x65\xf9\x16\x85\xdb\xb6\xe0\xd6\xef\x53\x61\
+\x01\xb2\x08\x39\x6c\xcd\x2d\x38\xb5\x65\x15\xae\x50\x05\x07\xab\
+\x0e\xb0\x01\x95\x15\x06\xf2\xca\x06\x05\x2a\x5d\x37\xb1\xeb\xcd\
+\x02\x0c\xfd\x76\x7f\x1e\xc0\x4b\x82\x06\x27\x1a\x1f\x02\xfe\x05\
+\x05\x32\xb4\x9c\x3c\x8d\xa3\x9a\x17\x70\xad\xc3\x85\xaa\x6a\x23\
+\x1b\xb0\x67\xe7\x3b\x64\xa5\x20\xe0\xed\x8b\xdf\x80\x9f\xf5\xd3\
+\x05\x44\x6c\x06\x18\xfb\xe1\x2a\x88\xff\x3e\xb5\x9f\x87\xf0\xe8\
+\xf3\x31\x62\x53\x08\xda\xf8\x4c\x80\x43\x4d\x5e\x0c\xae\x3b\x9c\
+\x38\xfc\xd9\xc7\x6c\x80\xbe\xb4\x82\xbc\x28\x28\xa1\x37\x7d\xb1\
+\x68\xd7\x3e\xc2\xa1\x24\x72\x14\x33\x74\x8c\xe0\x08\xea\xa7\x1f\
+\x83\x9c\x9b\xef\x07\xa2\x5d\x1f\xd1\xa5\xe2\x86\xd3\x81\x23\x75\
+\xd5\x6c\xc0\x1b\xc5\x65\xe4\xb9\x8c\x74\x18\x5a\x06\xe6\x01\x74\
+\xc5\xcc\x5c\x00\xef\x6d\x5c\x89\xe8\xe8\x28\x4c\x4c\x4c\xe2\xc3\
+\xf6\xeb\x88\x90\xf2\x41\x3f\x12\x01\xc6\xfc\xb5\xb8\xd9\xe9\xc1\
+\x89\x86\x5a\x36\xa0\x78\xeb\x76\x92\x98\xa5\x46\x91\xe9\x4b\x88\
+\xed\x40\xf4\x39\xb1\x8b\xf9\xe6\x68\x3f\x20\xb4\x2c\x1c\x0f\x39\
+\x4d\x04\xbb\x1b\xcd\xd1\x69\x34\xea\xd6\xa1\xd7\x62\x45\x43\xf3\
+\xc9\x25\x00\x0a\x4a\xef\x09\x99\x8a\xe8\xbb\xf4\xd4\xb7\x27\x67\
+\x16\x3b\x57\xa8\x10\x2f\xfc\x49\xea\xa8\x8f\x50\x35\x4e\x9b\xeb\
+\xe7\x86\xa6\xba\x15\x4c\x80\x18\xaf\x6d\xde\x76\x8b\x26\x9e\xe6\
+\xc1\x0e\x51\x05\x15\x71\xe5\xf3\xd6\xd3\xb1\xa1\xf2\x7f\x01\xd3\
+\x32\x98\x28\x11\x39\x3d\x6f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x03\x89\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x50\x49\x44\x41\x54\x78\xda\xad\x96\x79\x48\x14\x51\
+\x1c\xc7\xbf\x6f\x66\x57\xf3\xc8\xca\x88\x2c\x4a\xf2\x48\xb3\x28\
+\x48\x88\x82\x82\xfe\x09\xa2\x03\x8c\x8a\x2e\x50\xec\x30\xb0\x10\
+\x3a\x20\xac\xac\xcc\xc8\x24\xe9\xb0\x43\xc8\x0e\xc9\x8d\x2d\x4a\
+\x83\x8a\xee\x22\xc2\x4a\xad\x20\x09\xa2\xcb\x75\xb3\xcc\x6a\xdd\
+\xdc\xd6\xcd\xd9\x75\xd7\x79\xbf\xde\x8c\x58\xd1\xbd\xbb\xfd\x86\
+\x99\x79\x30\x3f\xbe\x9f\xdf\xf1\x8e\x61\xf8\xc1\x26\x55\x26\xd1\
+\xa4\x61\xa9\x60\xaa\x04\xae\x02\x9c\x03\x6a\x97\x78\x40\xc6\xd5\
+\xda\xfb\x78\x92\xfb\x92\xc1\x0f\xfb\xc9\x79\xbc\x39\x8e\x8e\x4d\
+\x2d\xc0\xc9\x96\x0d\xe2\x63\x18\x34\x6d\xc6\x18\x6c\xed\x40\xcd\
+\x1d\xfe\x7f\x00\x07\xa7\x6c\x85\xf9\xcd\x16\xc8\x2c\x1c\x2a\x75\
+\x3b\xb5\x6a\x80\x6b\x1e\xbc\xdc\x61\x09\x0e\x30\xf2\xc0\x50\x2a\
+\x9f\xb7\x1d\xa6\xa6\x6e\x00\x11\x83\xa8\x14\xda\xda\x09\x0f\x6f\
+\xfc\x07\x40\x52\xf1\x10\xaa\x48\x2f\xc4\xd1\xa6\x7c\x18\x7b\x32\
+\x20\x09\xad\x4e\x15\x8f\xae\xb8\xd1\xb8\xa7\x31\x38\x40\x7c\xc1\
+\x60\x32\x2d\x2f\xc2\x61\x6b\x3e\x0c\x88\xe8\x06\x08\xaf\x8f\x0e\
+\x8e\xc7\x97\x14\x58\x0f\x58\xfd\x03\x8c\x2d\x19\x4e\xda\x20\x2a\
+\xa2\x2f\x1c\x0e\x17\x6c\x36\x07\xaa\xd6\xec\x43\xa9\x25\x4f\x94\
+\xa8\x97\x28\x11\xf4\xfb\x63\x9b\x8a\xfa\xaa\x0e\x18\x8c\x80\x24\
+\x0b\x86\xda\x2d\xd0\x74\xf4\xd5\x1f\x81\xfa\xc7\xd1\x3b\x13\x28\
+\x3a\x6a\x00\x8a\xe7\xaf\x80\xf9\x75\x09\x5a\x5c\x4e\x84\x40\x88\
+\x73\x06\x8d\xae\x8a\x3e\x30\x89\x41\x0e\x25\xb8\x14\xc0\x52\xeb\
+\x86\xf3\x85\x17\xcd\xc7\x9a\xfe\x9a\xcd\x57\x87\xc4\x0d\xb1\x14\
+\x1b\x1b\x8f\x8d\x69\x99\x38\x6c\x29\x02\xef\x92\x45\x69\x64\x3d\
+\x7a\xae\x3d\x44\xd4\x9d\x3e\x42\xe3\x03\x0f\x9c\x4f\x85\xf8\xf1\
+\xbf\x8b\xff\xd4\x83\xd8\x9c\x21\x34\x2c\x21\x01\xab\xe6\xa6\xe1\
+\x84\xa5\x4c\x84\xde\x03\x11\x6e\x06\xe0\xf9\x3d\x05\x8e\xc7\x5e\
+\xb4\x98\xff\x4d\xfc\x97\x4d\x1e\x98\x11\x43\x89\xa3\x92\xb0\x7a\
+\xd1\x2c\x54\x34\x94\x89\x19\xa4\x15\x5d\x42\x43\xad\xff\xe2\xbf\
+\x04\xf4\x40\xe2\x92\x87\x63\x75\xc6\x6c\x98\x1a\x8e\xc0\x5a\xe7\
+\x45\x5b\xbd\x82\x77\xa7\xde\xfa\x25\xfe\x5b\x80\x66\xe1\x73\x22\
+\x29\x35\x75\x1c\x1c\x72\x33\xac\x35\xef\xa1\x9c\x73\xf9\x2d\xfe\
+\x47\x80\x6e\x33\x19\x89\x0e\x03\x97\x10\x90\xf8\x57\xc0\x99\xb3\
+\xe7\xd7\x72\x4e\x51\x62\xa8\xaf\x09\x49\x92\x28\xdc\x18\xde\x29\
+\x86\xaa\xe2\x53\xc2\x38\xe7\x92\xbf\xc2\x92\xc4\x42\x85\x4e\x01\
+\x3b\x5d\x79\xee\x4e\x72\x72\xe2\xc4\xfe\xd1\x7d\xc5\x6c\xa1\x40\
+\x03\xd5\x77\x5c\x03\x33\xea\x6f\x95\xba\xe0\xf5\xfa\x50\x53\xf7\
+\xd0\xce\xca\x2b\x4e\x52\x66\xfa\x82\x80\x85\xbf\xb7\x9a\x96\xeb\
+\xb0\xbb\xed\x98\x3c\x78\x3a\xa2\xc2\xfa\xa0\xfa\x6e\x1d\x58\x69\
+\x59\x39\x65\x67\x65\xc2\xe7\xf3\x05\x2c\x2c\x8b\xb5\xf2\xee\xf3\
+\x5b\xe4\xd5\xcf\x42\x64\x84\x1d\x63\xd4\x3c\x64\x4d\xc8\xc2\xf5\
+\x1b\xb7\xc0\xf6\xee\x3f\x44\x39\x2b\x97\xc1\xed\xf6\x04\x05\x68\
+\xfe\xf4\x06\x33\xaa\x46\x21\x3a\xa6\x17\xd2\x22\xb6\x20\x77\xda\
+\x1a\x5c\xb8\x7c\x05\xac\x68\x57\x09\xe5\x64\x67\xc1\xe3\xe9\xd4\
+\xeb\xa7\xdd\x81\x58\xa8\x1c\x8a\x67\x1f\x9e\x8b\x63\x96\x10\x3f\
+\x20\x0e\x21\x21\x46\x5c\xbc\x7c\x15\x6c\x5b\x61\x31\x65\x2f\x5f\
+\x8c\x76\x57\x07\xec\xad\xad\xda\x0c\x0a\x2c\x0d\x11\x98\x96\x09\
+\x27\x8e\xc8\xde\x91\xe8\xd7\xaf\x8f\x00\x5c\x03\xdb\x94\x5f\x48\
+\x19\xe9\x0b\x61\xfb\x60\xc3\xed\xea\x6a\x18\xb4\xfd\x38\x08\x53\
+\xc5\x9f\x42\x4a\x4a\x0a\x52\x46\x24\xe1\xe6\x4d\xd1\x83\xf5\xeb\
+\x37\xd3\x92\xa5\x8b\xf5\x43\x45\x96\xe4\x80\x4b\xd4\x63\x24\x2e\
+\x55\xe5\x30\x1a\x0d\x30\x99\xcc\x60\xeb\x72\x37\x65\x0b\xc9\xd2\
+\x98\x41\x31\xe2\x17\x85\x07\x25\xfe\xad\x5a\x0c\x9f\x9c\x4e\x28\
+\x1d\xca\xee\x2f\xda\xdf\x68\xfd\x0c\xaf\x1b\xe4\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x41\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x08\x49\x44\x41\x54\x78\xda\xd5\x95\x5f\x48\x53\x51\
+\x1c\xc7\xbf\xe7\x9e\xfd\xd1\x32\x25\xfb\xa7\x6e\x0f\xfa\x50\x64\
+\x41\x45\x99\x84\x11\x09\x11\x05\xfd\x27\x70\x45\x0f\x85\x41\x59\
+\x50\x82\x0f\xf6\x07\xa4\x3f\x44\x09\x3d\x18\x84\x5a\x49\x91\xd1\
+\x9f\xcd\x87\x30\xa2\xa9\x4d\xea\xc1\x30\xd1\xa8\xa4\x7a\x30\x2d\
+\xd3\xb5\xe9\xd4\xd2\xe5\xe6\xe6\x76\x77\x4f\xe7\xee\x4f\x43\x5d\
+\x4c\xfb\xf3\xe0\x85\x7b\xef\xb9\xe7\xfe\xce\xf9\xfc\xfe\x1f\x82\
+\xff\x7c\x91\xe9\x0f\x48\xbf\xd3\xcb\x9c\x3e\x06\xb0\x71\x7f\x84\
+\x30\x9f\x04\x1f\x21\x91\x09\x5a\x45\x50\x53\xe0\x73\x33\x95\x02\
+\x88\xa6\xcc\xcc\x9a\xf2\xb4\x70\x7b\xfe\xc2\x1c\x36\x71\x2a\x4e\
+\x0d\x64\x56\xda\x40\xe6\x5d\xfe\xcc\x5e\x1e\x4f\x43\x59\x97\x17\
+\xaa\x7f\xe8\xb0\x19\x6a\x8a\x9b\x4f\xac\x20\x73\x2e\xb4\xb1\xd7\
+\x27\x17\xe1\x46\x97\x08\x35\x99\x04\x21\x82\x88\x14\x41\x4c\xc5\
+\xdd\x53\x6e\xf8\xc2\x2d\x28\xfa\xc0\x2a\xf3\x17\xa3\xca\xe2\x82\
+\x22\x0a\x80\x45\x72\x07\x1b\x07\x61\x81\x91\x92\x03\x8c\x8f\x2d\
+\x3c\x06\x45\xef\x5e\xb9\x3d\x92\x3f\xa6\xa1\x90\x0a\x91\xa2\x48\
+\x88\x97\x50\x38\x65\xe5\xf8\x47\x0c\x18\xf3\xa7\x01\xe8\x58\xd3\
+\x7e\xe9\xc8\x07\x4a\x25\x99\x5a\x5c\x53\x4e\xbc\xe9\x26\x84\x1c\
+\xb2\x14\xaf\xa8\x9d\xec\x9a\x49\x03\xe6\xe7\xb7\xf4\x20\x86\x26\
+\x89\x0e\x2f\x94\x2a\xaa\xb3\x95\x64\x54\xfd\x33\x40\x62\xde\x0b\
+\xbd\xdb\x4b\x74\xf7\x2e\xae\x86\xfe\xbd\x1d\x75\x0f\xda\xb9\xf9\
+\xd0\xf5\x97\x67\x45\x85\x44\x05\x24\x1e\x78\x6e\xf0\x30\xe4\x94\
+\x9e\x5f\x03\x87\x48\x50\xdf\x27\xe2\xed\xb3\x6e\x0c\x7d\xec\x03\
+\x55\xd1\x3d\x03\x15\xeb\x0c\x7f\x0c\x48\xd8\x5b\x7b\xd6\xf9\x43\
+\x3a\x73\xa4\x70\x15\x16\x6a\x13\xf0\xb0\x63\x04\x6a\x05\xe1\x29\
+\x48\xd1\x6a\xea\x84\xbd\xdd\x06\x41\xa0\xc9\x83\xf7\x37\xf4\x4e\
+\x19\x10\xbf\xcb\x98\xe3\x74\x79\x0c\xb9\x85\x59\x58\x96\x16\x8f\
+\xdb\xad\x0e\xc4\x52\x12\x68\x19\x44\xce\x73\x05\xda\x4c\x9f\xe0\
+\xe8\xe8\x01\x51\x51\x8d\xdd\xb0\xd9\x3a\x69\xc0\xac\xed\xd5\x3a\
+\xb7\xc3\xa3\xdf\x7a\x34\x13\xdb\x32\x53\x70\xb5\x79\x10\x84\xef\
+\x1a\x48\x41\x06\xc9\x27\x43\x08\x14\x31\x0a\x98\xeb\x3b\xe0\xea\
+\xfc\x0a\x46\x05\xcd\x70\xf5\x4e\x6b\x54\x40\xec\x26\x7d\x92\xd7\
+\xed\xed\x49\xcb\x4e\x47\x41\xee\x52\x94\x34\x0c\x41\x90\xe4\xda\
+\x90\xfc\x35\x15\xa8\x23\x16\x18\xf3\x9b\xc6\xaa\x60\xd1\x37\xc1\
+\xe7\x74\x41\xa0\x54\x33\x6c\xdc\x6d\xfd\x2d\x20\x26\xfb\x6e\xca\
+\xa8\x47\xb4\xa4\xae\x5f\x82\x73\xc7\x96\xe3\x94\xb1\x1f\x4a\x91\
+\x0b\x09\xe1\x02\x66\x2c\xbc\xb9\x1f\x46\x18\xdf\x84\xe2\x7b\x4d\
+\x0b\xa4\x11\x27\x5c\xa6\x7d\x24\x22\x80\xae\xbd\xa5\x95\x44\xaf\
+\x39\x2e\x55\x8b\xe2\x2b\x1b\x71\xa9\xc6\x86\x51\x87\x04\xca\x2b\
+\x95\xf9\xc6\x6d\x2a\x5b\x10\xea\xf0\x92\xec\x2e\x3e\x12\x78\x99\
+\xd7\x34\x03\x23\x23\x56\x4f\xc3\x7e\xcd\x44\x0b\x56\x96\x9a\x85\
+\xd9\x73\xb5\xa7\xaf\x6d\x41\xa9\x69\x00\xa2\x5d\xe4\x19\x22\x47\
+\x94\xfb\x9c\x84\xb5\x47\x10\x12\xb6\x28\xf8\x26\xfe\x76\x02\xd1\
+\xd4\x08\xe6\xf6\x58\x7d\x8d\x07\x35\x61\x40\x46\x99\x25\x36\x79\
+\x41\x4a\xc1\xf5\x1d\xa8\x78\xfa\x0d\x83\x36\x37\x04\x79\x65\xe8\
+\x90\xf1\x85\x1a\x9d\xe4\x6f\x6a\x21\xcd\x43\xb1\x40\x68\x8e\x2f\
+\x20\x0a\x6e\xf2\xa3\x3a\x79\xc6\xca\x9a\x0e\x6b\x08\x32\xcb\x87\
+\xf8\xdf\x04\x7f\x6a\xb8\xc4\xc0\x49\x26\x8c\x35\x6e\x4a\x1d\x4b\
+\x96\xe5\x65\x1e\x4c\x39\xfb\xf4\x3f\xf4\x7f\x02\xe2\xb7\x34\x28\
+\xdd\x7a\xab\xb3\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x06\xd4\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x9b\x49\x44\x41\x54\x78\xda\x85\x56\x7b\x50\x54\xe7\
+\x15\xff\xdd\xbb\x8f\xbb\xbb\xec\x2e\xb0\xb0\xac\xc8\xa2\xac\x04\
+\x41\x8d\x48\x34\x69\x53\x1b\x27\xa9\x31\x18\x1f\x28\x3a\x36\x13\
+\x63\x32\x9d\x3e\x26\x99\xcc\x60\xdb\x69\xd2\x3a\x63\x9b\x76\x6a\
+\x42\xab\xc6\xc7\x38\xf1\x8f\xb6\x1a\xc1\x64\x4c\xa2\x63\x12\x89\
+\xd5\x88\x55\x9a\x20\x02\x21\xd5\x40\x22\x4f\x01\x59\x04\x61\x61\
+\x61\x5f\xec\xe3\xee\xde\xfb\xdd\x9e\xbd\x38\x9a\xce\x58\xb3\xbb\
+\xdf\x7c\xe7\xfb\x76\xef\xf9\x9d\xc7\xef\x9c\xb3\x1c\xbe\xe3\xf5\
+\x5c\xdd\xc4\x4e\xbb\x89\xdb\x96\x94\x99\x72\xf7\x5e\x66\x80\x42\
+\x17\xb2\xa2\xa8\xb2\x9c\x94\x69\x49\x32\xc9\xb2\x82\x84\x8c\x4f\
+\x3f\x2e\x73\xac\xe6\xbe\x43\xf9\xd9\xad\x85\xc6\x55\x55\xee\x18\
+\xd8\x3d\xbe\x4f\x02\x32\x79\x1a\x35\x09\xa4\x24\x95\x43\x01\x93\
+\x14\xe4\x1b\x80\x6f\xc6\x13\x27\xef\x0b\xb0\xb5\x69\xb2\xd6\xa1\
+\x47\xe9\x93\xb3\xcd\xff\x73\x2f\x29\xd3\xd6\xc6\x69\x25\xa4\xdb\
+\xfb\xed\xb3\x98\x3c\x93\x4b\xf5\xbd\x61\x04\x44\xd6\x76\x5f\x80\
+\x8a\x4b\xde\x73\x39\x06\xac\x7c\xc2\x65\x55\x3d\x60\xa4\x38\x2e\
+\xdd\x55\x16\x8c\xcb\xf0\xc7\x15\xc4\x24\x86\x18\x79\x12\xa5\x65\
+\xd4\x70\xe4\x0d\xc3\xb5\xfe\x08\xc2\x71\xa5\xe9\xbe\x00\x2f\x7f\
+\x36\x5e\x6b\xd7\xc8\xa5\xcb\xe7\xa6\x21\x98\x60\xf0\xc4\x18\x46\
+\x23\xb4\x47\x24\x5a\x0c\x91\x38\x43\x54\x94\x11\xa5\x3d\x22\x12\
+\x08\x01\xc6\x48\x8e\xd3\xca\xd3\x49\xb0\x5a\x0c\xe7\xef\x0b\xf0\
+\xe2\x45\x4f\xad\x3e\x2a\x96\x9a\x9d\xa9\xf0\x46\x64\x84\x09\x24\
+\x46\x20\xc9\x3d\xa9\x34\xa6\x2a\x27\xcb\x6f\x2b\x96\xe8\x5e\x96\
+\xa7\xb3\x95\x23\x8b\x70\x38\x2c\xf7\xce\x81\xb0\x23\x6b\xe7\xcf\
+\x1e\x2d\xdf\x66\x33\x9a\x70\xa9\xc7\x8b\x0c\xe7\x3e\x90\x9e\xff\
+\x63\xad\x4c\xcc\x51\x54\x46\x7d\x9b\x62\xb9\xf1\x08\x6c\x33\xd3\
+\xde\xbf\x03\x90\xfe\x57\x8a\xb6\x46\x5b\x51\x68\x77\x2d\x79\x6c\
+\xd6\xf7\x9e\xfa\xc9\x43\x0b\x33\x0c\xba\x29\xfc\xe3\x4a\x03\xea\
+\x3a\x19\x02\x5e\x27\xec\xca\x0a\x70\xcc\x32\xcd\x20\x52\xc8\x28\
+\xd6\xf4\x51\x93\xae\x48\x8a\xca\xaa\xe4\x39\xc5\x2a\x60\xdd\x0a\
+\x17\xfe\xd5\x1e\x38\xa6\x02\x98\xdf\x70\x38\x4a\x72\x8b\x3b\x7e\
+\xb7\x74\xb3\x2d\x2f\x43\x0b\xf0\x51\xb8\x7d\xc3\x10\x99\x04\x9b\
+\x60\x02\xaf\xd5\xa2\x67\x6c\x04\xfb\x2e\x5f\x44\xf5\xea\x33\xc8\
+\x4a\x71\x60\x8a\xc2\xc1\xd3\xd3\x21\xf2\x8a\xe3\x79\x62\x0f\x85\
+\x67\xc8\x8b\xe8\x78\x10\x9e\xfc\x5c\x22\x00\x43\xcd\x57\x93\xc7\
+\xb8\xf4\xca\x6c\x63\xb1\xf3\xc1\x9b\x87\xd6\xff\x26\x23\x24\xf5\
+\x10\x77\x07\x70\xa6\xa7\x1d\x1b\xe7\x3f\x82\x6c\x53\x2a\x6a\xae\
+\xb7\x62\xae\x2d\x0b\xcb\xf3\x8a\x31\x18\x0c\xe0\x0f\xe7\x3e\xc1\
+\x81\xa7\x3f\x44\xd3\x08\xc3\x96\x42\x2b\x42\x31\x09\xd7\xbc\x22\
+\xe6\xb5\x5c\x81\xd3\x5d\x47\xde\x88\x68\x1a\xb2\xa0\xf3\xa5\x0a\
+\x7c\xd8\x32\xfe\x01\x97\xb7\xbf\xe8\x85\xca\x55\xbf\x7c\x67\xa6\
+\x25\x8c\xf1\xa8\x1f\x3f\x3d\xfe\xf6\xb9\xf0\xef\x47\x57\x5d\x1c\
+\x3a\xa4\x24\xf8\x61\xbc\x5e\x7b\x16\xa3\x01\x1d\xb6\xad\x76\xc1\
+\x95\x9a\x86\x7f\xf6\xde\x80\x93\x7f\x09\x5a\xed\x52\xfc\x60\x86\
+\x11\x46\x2d\x87\xc3\x8d\x23\xf8\x73\xf3\x51\x98\x7a\x4f\x83\x78\
+\x8c\x3e\xb7\x84\xda\x23\x97\x70\xaa\x79\xec\x23\xae\xe0\x40\xf1\
+\xfe\xea\x4d\xdb\x7f\xed\x89\x75\x61\x38\x14\xc6\xd6\x92\x37\xd5\
+\xb0\x55\x7e\xb9\x51\x09\x61\x10\x0d\x5d\x09\xec\x7c\xa2\x11\x2f\
+\xd4\xcc\x87\xc0\xf1\x10\xb4\x26\x3c\xe5\x7a\x11\x7e\xe5\x19\x38\
+\xa9\x5a\x5b\x3b\x27\x51\xb6\xd8\x8e\xd2\xbd\x7f\x41\xea\xd5\x13\
+\x6a\x7e\x1a\xb9\x2c\x74\x1d\xbb\x80\x13\x9f\xdf\x3a\xcd\xe5\xef\
+\x5f\xb0\x7d\x77\x79\x45\xa5\x91\x0f\xe2\xaa\xa7\x05\x55\x4d\xbd\
+\x35\x7d\xbf\x6a\x2b\x7f\xb5\x71\x85\xa2\xf0\x5e\x34\x77\x33\xec\
+\x5a\xde\x74\x97\x61\x8c\x21\xdd\xa4\x43\x97\x3f\x8e\x9a\xb6\x09\
+\x2c\xca\x36\x60\xe1\xcc\xe9\x4a\x4f\x3b\x58\x05\xbf\x98\xc0\xc0\
+\xe6\x67\xe1\xd3\x0b\x38\x5e\x77\xf3\x2c\x97\xbd\x6b\x8e\xeb\xfb\
+\x0f\x2c\xe9\x7f\x34\x5f\xc1\x40\xe8\x6b\x62\x49\x16\xb8\x44\x21\
+\x32\x2c\x3e\x04\xd8\x20\xbe\xbe\x6e\xc6\xbb\x65\xe7\x11\xa2\xa4\
+\xea\xc9\x37\xfe\x36\xef\x92\x49\x36\xeb\x78\xf4\xfb\x45\x98\x05\
+\xad\x9a\x64\x6f\x4c\x86\x41\x03\x78\xa2\x4c\x4d\xf2\x07\x17\x6e\
+\x5e\x50\x7f\x9e\xbd\xab\xe0\x47\x69\x66\x5d\xdd\x02\x97\x09\xb3\
+\xd2\x39\xe8\x78\x01\x81\xa8\x8c\xe4\x5b\x91\x00\x3f\x55\xed\xb0\
+\x8f\xc3\x6c\xc3\x22\xfc\x76\xd9\x6e\x8a\xbb\x09\xb5\xee\x29\x6c\
+\xa6\x24\x07\xa3\x09\x74\x4e\xc4\xa1\xd5\x6b\x50\x92\x29\xd0\xb3\
+\x1c\x2e\xbb\x03\x70\xc7\x38\xbc\x57\x3b\x58\x77\xa7\x0e\x9c\x7b\
+\x8a\x04\x28\xda\x37\x75\x82\xbc\xd2\x99\xa9\x9f\x55\xe0\x30\x18\
+\x38\xe2\x37\xe3\x38\xa4\x18\x79\x68\x49\x9e\x20\xd0\x2f\xbb\x13\
+\x38\xb4\xe6\x34\xfe\x33\x6e\xc4\x43\xa4\x50\xa0\xde\xf3\xf7\xcf\
+\x86\xb0\x70\xd1\x0c\x2c\xb1\x6a\x54\x5d\x03\x13\x11\xca\x91\x06\
+\xc7\xce\x0e\x34\xdc\xb3\x92\x17\x1c\x7c\x7c\xcf\x9a\x87\x6d\xaf\
+\x4c\x46\x07\xd1\xda\x9f\x80\x44\x15\x54\x9c\x67\x44\x0a\x59\x19\
+\xa0\x30\x4c\x8e\xcd\xc1\xbe\x95\xd5\x38\xd0\xec\x41\x57\x87\x17\
+\xa5\x0f\xdb\x91\xb0\xa6\x60\x92\xc2\xc5\x88\x45\x97\x1b\x07\xf0\
+\xfc\xfa\x79\x78\xff\x4c\x7f\x0b\x37\x6b\x6f\xc1\x41\x0a\xdf\x4c\
+\x4e\xe1\xe3\x1a\x0d\xf3\x0d\xbe\x72\xfd\xe5\xb2\x93\xcf\xbc\xe6\
+\xca\x0c\xef\x88\x28\x63\x68\xbd\x11\xc7\x7b\x6b\x5b\xf0\x6a\x7d\
+\x39\x66\x64\xfa\x40\x8e\xa0\xfd\x06\xc3\xe1\xb5\xf5\x78\xab\xe1\
+\x16\xe6\xd8\x04\x3c\x98\x6d\x06\x39\x8a\xe6\xd1\x18\x3a\x29\x3c\
+\x8b\x5d\xa9\xd0\x91\x31\xef\xd6\x5c\x6f\xe3\x36\x9d\xfa\x71\xf4\
+\xb1\x39\x4e\x43\xb2\xc5\xd6\xf7\xf5\xa2\x66\xe3\x19\x6e\xed\xc9\
+\x4d\xdb\xf3\x32\xa3\x95\x41\x79\x1c\x9d\x03\x22\x8e\x96\x7d\x41\
+\xad\x81\x61\x7f\xe7\x93\x6a\xcb\xee\x72\x73\xf8\xdb\xd3\x17\xa9\
+\x9b\xca\x6a\xa3\x33\x19\x74\x6a\x52\xf5\x3c\xa0\xa1\x81\xd3\x36\
+\x16\x83\x44\xd5\x5d\xf5\x71\xcf\x37\xdc\xe2\xc3\x3f\xec\x5e\x56\
+\x94\x3e\xd7\x1d\xea\x86\x14\x37\xa3\xb9\x23\xb8\xc7\x62\x30\x07\
+\xd6\x3d\x92\xff\xba\x4f\x1c\xc2\xb5\x1b\x22\xd6\x2c\xfc\x37\x9a\
+\x06\x57\x20\xd7\x2e\xa8\x8d\xae\x7f\xc0\x84\xa3\x1b\x3e\x05\x35\
+\x15\x0a\x1b\x25\xb3\xd5\x0b\x67\xb6\x05\x1f\x5d\x0b\xa0\x72\x99\
+\x1d\x57\x87\x03\x18\x95\x34\x38\x72\xa2\xbd\x83\xcb\xdb\xbb\xa0\
+\x64\x49\x7e\xd1\x57\x56\xab\x87\xc6\x5f\x9c\x0a\xd1\xc4\x32\xf8\
+\x45\x31\xde\x30\x62\x1a\x8b\xf4\xc1\xed\x51\x20\x08\x40\xbe\x43\
+\xa0\x49\xa5\xa0\xb5\x2f\x82\x37\x1e\xaf\x46\x97\xcf\x89\x1c\x8b\
+\x8e\x3a\x29\xc3\x95\x3e\x3f\x32\x72\xd3\xd0\x7e\x33\x82\xf2\x42\
+\x33\x1a\x7a\x7c\x28\x70\x5a\x51\x75\xbc\xbd\x5b\x4d\xb2\x73\x77\
+\xc1\xfa\x4c\x9b\xf9\xd4\x6c\xbb\x96\xdc\xe5\x60\xd2\x4f\x5b\x2a\
+\x26\xe2\x24\x6b\xc1\x11\x39\xc2\x34\x07\xfa\x6f\xc5\xf0\xf3\xe2\
+\x3f\x62\xb9\x6b\x0d\x5e\xab\xf7\xc0\x3b\x12\x46\x64\xcc\x8f\x3f\
+\x6d\x99\x4f\x16\x03\xe7\x7b\x42\x98\x9a\x0c\xc3\x37\xec\xc3\x86\
+\xd2\x7c\x54\x9f\xe8\xe8\xbc\xc3\xa2\xd9\x7b\x8a\x1e\xa0\x32\xfa\
+\x85\xd5\xa2\x59\x69\x32\xf0\x25\x2e\xea\x33\x82\x96\xc7\xf0\x84\
+\x08\x45\xb4\x63\xbe\x6d\x29\x36\xcc\xdb\x82\x5c\x4b\x0e\x88\x99\
+\x34\x36\x81\x91\xa9\xb8\xca\xac\xe4\xdc\x4f\x16\x5a\x98\x5a\xf6\
+\xf0\x54\x42\xd5\x37\x4e\x53\xef\xe8\xdb\x5f\x74\xdc\x93\xa6\x39\
+\x3b\x8b\xde\xb2\xdb\x85\x0a\x3d\x15\x8d\x6f\xc2\x1a\x74\xc4\x76\
+\x58\x79\x18\xd5\x04\x43\x9d\x03\xca\x9d\x99\x90\x9c\x60\xdf\x9e\
+\x07\x4c\x96\xd5\xbf\x2d\x2c\x14\x1e\xeb\x3e\xb2\xce\xf1\x5f\x84\
+\xac\x84\x9b\xe6\x94\xa8\x74\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\x1b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xe2\x49\x44\x41\x54\x78\xda\xad\x94\x7b\x48\xd3\x51\
+\x14\xc7\xcf\xdd\x6f\x6b\xa6\x46\x69\x56\xf4\xb0\x32\x83\xb9\xa4\
+\x34\x1f\x94\x99\x4a\x1a\x14\x2e\x42\xcb\x48\x1b\xbd\x66\xd1\x1f\
+\x65\x96\x09\x45\xf4\x7e\x10\x92\x84\xd1\x83\x8a\x82\x34\xa1\xd4\
+\x72\x96\xda\xf2\x89\x26\x69\x1a\xcb\xa6\x3d\x96\xd5\x2c\x66\x86\
+\x54\x6a\xad\x3d\xdc\xdc\xef\x76\x7f\xdb\xfc\xe1\x1a\xea\xac\x0e\
+\xec\xf7\xdb\x8f\x7b\xbe\xe7\x73\xce\xbd\xe7\x5c\x04\xa3\xb0\x95\
+\xd2\xf7\x55\x5d\x1a\x70\x69\xde\x34\x37\xdc\x59\x0d\x72\xd6\x51\
+\x24\x7d\x57\x92\x19\xe3\x23\xea\xd0\x63\x48\x2b\x51\x55\xb5\x26\
+\x0b\x96\xff\x37\x80\xe0\x92\xb2\x30\x3b\xc9\x37\xbe\xbd\x0f\x43\
+\xa7\x11\xc0\xdf\x05\x20\xbd\x58\x55\xfa\x72\x9b\xdf\xaa\x7f\x06\
+\x78\x67\xb4\x5e\xc8\x95\x08\x76\x7d\x36\x61\xf8\x68\x40\x40\x01\
+\x06\x8a\x43\xa0\x63\x01\x8e\x3d\x50\xdd\x94\x6f\x17\x6e\xfd\x6b\
+\x00\x09\x7e\xf6\x5a\xb2\x20\xdd\x60\x46\xa0\xfa\x45\x43\x1f\x42\
+\x16\x01\x26\x0f\x3e\x81\xf8\xf2\x31\xa4\x64\xb7\x5d\x54\xef\x9f\
+\x9f\x32\x6a\x80\x6f\x86\x82\x4f\x92\xfd\xa0\x33\xc2\x74\xe6\xfb\
+\xa2\x44\x08\xad\x3a\x0c\x1c\xa2\xe0\x10\xd0\x95\xdb\x6f\x2c\x7e\
+\x7c\x1e\x52\x03\xc2\xc2\x0f\xfb\x03\xb4\x4e\x03\x7c\x8e\xcb\xdd\
+\xda\x8f\x06\xb3\x82\xa9\x27\x14\x38\x4b\xe2\x07\x2f\x34\x64\x7b\
+\x88\x82\x22\x94\x1b\x79\x4a\xe8\x38\x1c\x80\x86\xd2\x0c\x09\x98\
+\x76\xb0\xa9\x86\xe2\xa2\x10\xf5\x89\x50\xf7\xc1\x80\xcc\xcd\x02\
+\x68\xfe\x89\x81\x6b\x03\x64\xdf\x7b\x6b\x07\x98\x79\xb8\xa9\x1b\
+\xd3\xa8\x42\x7d\x3a\x74\xfd\x90\x00\xc1\x69\xf9\xa3\x43\x62\xbf\
+\x15\xa9\x59\x2d\xd0\x9d\x15\x86\x06\x03\xce\x10\xc0\xf3\x1e\x9a\
+\xad\xe0\x4e\x51\x9b\x1d\x20\xf0\xf2\x4b\x1c\x14\x3c\x1b\x6a\x64\
+\xca\x7c\xd5\xb1\x90\xf5\x0e\x00\xef\x43\x8d\x55\x97\x76\xcc\x8f\
+\xee\x32\x53\x70\x24\x47\xe9\xb0\x6d\xc7\xc5\xa4\x82\x5e\xb3\x05\
+\xc0\x9c\x41\x61\xc9\x3b\xf0\xf2\xa4\x2c\x67\xc2\x18\x4d\x7e\xd1\
+\x11\xbe\xd0\xab\x35\xc1\xa3\x7c\xc5\xbd\xce\x73\x11\x09\x2c\x60\
+\xca\xbe\xfa\xca\xcb\x29\x81\x31\x6d\x64\x88\xd4\x3a\x1a\x02\xc6\
+\x73\x01\x63\xab\x90\x79\x31\xff\x3b\x0d\x34\x74\x91\x35\x26\x20\
+\x23\x42\x4c\x47\x0d\xaa\xdf\xe2\x47\x63\x40\xc4\x41\xdb\x47\x43\
+\x65\xa1\x15\x82\xa6\xa5\xd5\xd5\x9e\x4f\x0d\x8a\x54\x6a\x11\xb4\
+\xd9\x32\xa4\x01\x3b\x76\x03\xe9\x4d\x0e\x07\x46\x36\xa6\x42\xf2\
+\xd2\x19\x69\xa8\x2d\x50\xc8\x90\xff\xc9\x86\xe6\xbd\xe2\xc0\xc0\
+\xd2\x4f\x26\x70\xa1\x46\x71\x77\x0c\xc7\x20\xa5\x61\x92\xe9\x93\
+\x07\x2d\x6a\x4b\xbc\x80\x53\x8d\xb5\x09\xf1\xf3\x22\x15\xdf\x31\
+\xc9\x9e\x39\x48\x64\x47\xc2\x34\xb3\x4d\xd8\x21\x08\x1a\x5c\x11\
+\x1e\xf0\x41\x60\x34\xd1\xf0\xbc\xfc\xf5\xa7\x8e\x8c\xf0\xd9\x6c\
+\x18\x2f\x49\x59\xd5\x81\xb4\xb0\xe8\xc7\x5f\x31\xbc\xca\xab\x07\
+\x1e\x8f\x02\x8a\x54\x64\xee\xa7\xc1\x64\x32\x83\x70\x5d\x38\x0b\
+\x61\x82\xd7\x9d\x7f\xe8\x90\x79\x54\xba\x08\xf4\x1a\x13\x34\xdf\
+\x6d\x6a\xfd\x76\x33\x76\x81\x43\x9b\x4e\xde\x5e\x56\xbd\x73\xf7\
+\xd2\x65\xb7\xb2\xe5\xf0\x3e\x33\x92\x5d\x13\xa6\x96\x63\x6f\x51\
+\x28\xd0\x66\x2b\x80\x43\xca\x6f\xbc\x20\x83\x1f\xc5\x1b\x58\x9f\
+\xf1\x09\x45\x38\x78\x4b\x04\xb4\xe4\x37\xca\xbe\xe5\xc4\xc6\x3a\
+\xb4\xe9\x80\xcd\x4a\xa9\x96\x4f\x70\x1f\x13\xa4\x38\xb3\x94\x5d\
+\x5b\x90\x56\x81\x3d\xa2\x17\x02\xb6\x01\x10\x01\xbc\xb8\x5a\x6e\
+\x07\xf0\x4c\xbc\xff\x9d\xac\xd7\xf6\x14\xc4\xad\xf9\xe3\xcc\x1d\
+\xcd\x23\xa9\xc8\xad\xe7\x76\x1c\x3b\xf6\xfe\x7b\xca\xf1\xb8\x65\
+\xc1\x80\xfb\x69\xab\x88\xcb\x81\x37\xd7\xcb\xec\x00\x7f\x6a\x86\
+\x05\x58\x4a\x8e\x2f\x70\x9b\x3a\x67\xa2\xfa\xcb\xdb\x2f\x1e\x5e\
+\x33\x3c\x61\x5c\x4c\x08\xa9\xc0\x06\x20\xf7\x75\x7b\x4e\x85\xd5\
+\x91\xc7\xd3\x93\x03\x9e\xf4\x43\xba\xce\xf9\xcb\x6e\xc0\x66\x26\
+\x97\xde\xe7\x47\x05\xad\xe6\x8c\xa1\xac\xd9\x0f\x74\x12\xd3\x41\
+\x5c\x0a\xfa\xbb\xb5\xf0\x55\xf6\xf4\xe9\xcf\xe2\xc4\xb0\xa1\x62\
+\x8c\xd8\xf6\xee\xab\xf3\x72\x3d\x57\x2e\x16\x23\x57\x1e\x99\x40\
+\x1b\x80\x4c\x2b\x4d\xae\x84\xde\xca\x67\x32\x8d\x34\x21\x76\x38\
+\xbd\x53\x73\xe5\xba\x22\x37\xc7\x3d\x2e\x6a\x23\x70\xad\x8d\x8f\
+\xb4\x46\xd0\x94\xd5\x37\xe8\x64\xe2\x25\x23\x69\x9d\x1e\xdc\xb1\
+\x6b\x0b\x6f\xb8\xc6\x2c\x92\x80\xbe\x0f\xb4\xb2\xba\x8f\x86\xca\
+\xcd\x3e\xce\xe8\x46\x75\x33\xf0\x45\x77\xa4\x48\xaf\x0b\x31\x54\
+\x4b\xbc\x9d\xd5\xfc\x06\xe9\x34\x9c\x67\x4e\x0c\x9f\xc6\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x8a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x51\x49\x44\x41\x54\x78\xda\xa5\x95\x7b\x50\x15\x55\
+\x1c\xc7\xbf\xbb\x7b\x1f\x80\xa2\xa3\x48\x66\xa6\xa0\x99\xe2\x98\
+\x68\x96\x68\xa2\x23\x43\x65\x4d\x1a\x63\xea\x1f\x65\xe6\x60\x3e\
+\x6a\xfa\x23\x1f\x4d\x99\x35\x99\x83\x2f\x2a\x47\x93\xa9\xa6\xc4\
+\x57\x33\x3a\x35\xe5\xab\xeb\x80\x8e\xaf\x78\x0b\xa2\x28\x20\x08\
+\x82\x80\xa0\x82\x5c\x1e\xf7\xb5\x77\xdf\xbb\xfd\xf6\xe2\x50\x17\
+\xd1\xc9\x3a\x3b\x67\xce\xee\x39\xfb\xfb\x7d\xce\x7e\x7f\xbf\xdf\
+\x1e\x06\x0f\x69\xd3\x46\xc7\x8c\x2a\xb8\x5e\x55\x8b\xff\xd1\x98\
+\xde\x26\x73\x8b\x0b\x59\xeb\x07\xc9\xab\xd7\xb8\xd1\x41\x80\x7d\
+\x8f\xe2\xb0\xa4\xa2\x9c\x9d\x34\x6e\xbc\xfe\x40\xc0\xbe\xdd\x07\
+\xb9\xb1\x3f\x6d\xdc\x92\xd3\xca\x7f\x92\xc9\xb1\x2b\xb3\xea\x6e\
+\xa6\x3d\x0a\x60\x61\x64\xc8\xd6\x25\xe9\xc7\xbe\x7a\x79\xee\xab\
+\xae\xfb\x00\x19\x8e\x93\x36\x7f\xca\xda\x1f\xea\x9d\x1d\x4b\xc9\
+\xf9\x46\x72\xbe\xfe\x51\x25\x49\x1d\x1b\x9d\x57\xd6\xd6\xc2\x2f\
+\x4b\x3d\x3f\x27\x71\xe9\xb3\x4a\x37\x20\x3f\x37\xcb\xce\xad\x79\
+\xff\x00\xcf\xeb\x0b\x36\x8a\x52\xc7\xbb\x29\x9b\x22\x17\x2f\x7a\
+\x47\xff\x0f\x80\x1a\xf8\x7d\xa3\xb6\xfa\xd9\xbc\x86\x94\xea\x84\
+\x6e\x40\xe1\xe4\x98\xbd\x8f\xf9\xc4\x25\xf5\x8c\x0d\xab\xfc\x7e\
+\x73\xea\xc6\x8c\xbe\xf6\xc1\x34\x86\x51\x67\xa9\x1b\x4d\x8a\xa6\
+\x5d\xf3\x8a\x8a\x4b\x96\x3c\xf4\x7c\x56\x15\xc4\x13\x2e\x5e\x38\
+\xd0\x03\xd0\x40\x80\xa8\xf5\x6d\x2e\x84\x86\x0d\xcc\xe9\x06\xdc\
+\x9d\x30\xd4\xe0\x65\x2b\x4c\x40\xa6\x57\x0c\xcc\x4d\xb2\x85\x04\
+\xed\xae\xc6\x22\xa2\x4a\x67\x70\x47\x96\x50\xc9\x4b\x90\x35\x0d\
+\xac\xac\x7c\x4e\x90\x2d\xe6\x7a\x66\x41\x9d\xbd\x6c\x69\x62\xd3\
+\x00\x5d\x89\xcc\xd0\x39\x64\xbb\x44\x04\x01\x5a\xd0\x1f\xb9\xbc\
+\x88\x61\x76\x2b\xfa\x1a\x06\x22\x39\x2d\x08\x50\xee\xe7\x02\x10\
+\x59\x33\x70\x85\xc4\xbb\x24\x48\x90\x3c\x5e\x73\x69\x37\x41\x96\
+\xd3\xee\xbf\x48\x64\x8c\x94\xcb\x9a\x8a\xfb\x00\x8d\xd3\x46\x1a\
+\xd9\x4e\x15\x61\x83\x06\x62\xc4\xa6\x64\xdc\xac\x6c\xc1\x53\xbb\
+\x7e\xc7\xdd\x35\x1f\x06\xd6\xbd\xbb\x7e\xc6\x38\xde\x8d\x8b\x7c\
+\x17\x44\xd1\x0d\xd4\x13\xe4\x09\xab\x15\x6f\x18\x0a\x46\xda\xb8\
+\xae\x4d\xc0\x82\x12\x8f\x0b\xdb\x54\x3b\x14\x59\xf9\x1b\xf0\xe3\
+\xe8\x28\x43\x27\xa3\xf8\xef\xd7\x22\x76\xd6\x04\x9c\x48\xde\x0c\
+\x6b\x87\x17\x71\xbf\xac\x43\x3f\x5e\xc5\x99\xcc\x06\x0c\xdf\x91\
+\x86\x62\x92\xa8\x52\x96\xc1\xd1\x17\x9a\x57\x3f\x96\xc3\x4c\x9b\
+\x15\x21\x06\x50\x67\xe8\xa8\xf6\x79\xf0\x9d\x1e\x0a\xaf\x28\x05\
+\xd7\x81\x09\x78\xe6\xad\x99\x88\xdf\xb0\x02\x6d\x0d\x75\x28\x79\
+\xfb\x6b\xc4\xa6\xad\x43\xc4\x73\x83\x61\x69\x6f\xc5\xd9\xe3\x4e\
+\xdc\xda\xb9\x07\xd3\x74\x1e\xbf\x89\x2a\x7c\xa4\xbf\x85\x65\x40\
+\x6a\x81\x23\x2f\xe1\xb2\x80\x3f\x2d\xa1\xb8\x2a\x1b\x10\x49\x59\
+\x77\xbb\x13\x2c\xcb\x9c\x0b\x02\xbc\x57\x7d\x30\xe0\x3c\x90\x42\
+\x3b\xfe\x40\xdc\xce\xcf\x20\xcb\x37\x60\x91\x34\x94\x9c\xf6\xa0\
+\x60\xdb\x7e\xbc\xc9\xb7\xc0\x41\x4e\x6a\x65\x0d\x1d\x8c\x01\x27\
+\x7d\x85\x87\xa4\x6a\x52\x0d\xb8\x74\x16\x06\xa9\xe0\xee\x68\x27\
+\xe7\xb8\xe0\x75\xb9\xa7\x06\x01\xbc\xc9\xf3\x03\xf7\x31\x63\x42\
+\x11\x99\x5d\x05\x87\x3d\x14\x2f\x4c\x8d\xc2\xec\xd9\x13\x51\x7a\
+\xda\x85\x8c\xcd\xfb\xb0\x9c\xbf\x83\x7c\x72\x74\x51\x54\x50\xa3\
+\xeb\xb8\x20\xab\x90\x29\x8b\x55\xd2\x5e\x55\x64\xf0\x5e\xb7\xe9\
+\xa2\xcc\xe7\xf6\x4c\xb4\xd9\x6c\x06\x73\xcf\xf9\x06\x1a\xbe\xfc\
+\xa8\xd5\x17\x00\x2c\x8e\x8e\xc0\x91\xc6\xce\xc0\xfd\xee\xf4\x15\
+\x98\x33\x6f\x2a\x8a\x8f\xdd\x41\xde\xd6\xbd\x58\x24\x3b\x51\xaa\
+\xb1\xc8\xa5\x0c\xaa\xd6\x74\x9c\xa7\x2f\xf1\x28\x3a\x0c\x92\x4c\
+\xf0\xf3\xa6\xc9\x19\xbe\xe9\xf6\x2b\xd6\x41\x11\x7a\x77\x0c\xcc\
+\xdd\x9b\xe3\xaa\x5b\x6d\x50\x29\x78\xf3\xc2\xfb\xe3\x48\xd7\x4e\
+\x70\xf4\xc0\x6a\x02\xc4\xe3\xe4\xde\x2a\xf8\xd2\xf6\x60\xba\x55\
+\xc1\x35\x05\xc8\xe1\x05\x54\x12\xa0\x88\xe2\xe1\x56\x75\x88\x7e\
+\x1f\x44\x5e\x30\x73\xb6\xdf\x3f\x53\x9b\x29\x9a\x10\x7d\x36\x9a\
+\x31\x12\x5b\x99\x3e\x28\xeb\x94\xe0\xa3\x22\xf2\xab\x2a\x3e\xf6\
+\x7a\x02\x2f\x5c\x3a\x9f\x8a\xd8\x31\xa3\xb1\x7d\xe5\x21\x24\xe4\
+\x9c\x42\x74\x88\x1d\x05\x14\xc4\x0b\x82\x88\xab\xaa\x86\x42\x89\
+\x9c\x13\xc8\xe7\x76\x43\x91\xa4\x56\x32\x19\xdc\x13\x60\x3c\x49\
+\x46\x15\x1e\x0d\xb1\x94\x6b\x7e\x41\x41\x81\x47\xc5\x39\x8a\x12\
+\x1f\x37\x12\xdf\x6c\x5f\x86\xec\xc3\x15\xb8\xb8\x3f\x03\xeb\xb9\
+\xae\xd4\x3b\x4a\xbb\xae\x57\x54\x14\x52\x2f\xd7\x18\x88\x94\x92\
+\xb2\x24\x40\xf4\xf9\x0b\x68\x39\x3e\x08\x50\xfc\x7c\x8c\x31\x9c\
+\xd5\x51\xe2\xd3\x31\x29\x94\x81\xa0\x2a\x38\x46\x69\x51\x4e\xba\
+\x8e\x0f\xef\x83\xa1\x76\x06\x21\x5e\x3f\x15\x14\x02\xbb\xaf\xa4\
+\x6c\xc9\x24\xfd\x55\x53\x6c\x0a\x70\x23\x05\xdc\xeb\xea\x84\xcc\
+\xfb\x4d\x4d\x97\x51\x3f\xd4\x13\xd0\x38\x40\xd0\x87\xc1\x62\xc5\
+\x29\x32\xd4\x28\x06\x35\x64\x38\x45\x15\xf1\x74\x98\x15\x51\xe4\
+\x94\xe5\xd8\xc0\xdf\x2e\x50\xf1\x24\x8f\x83\xde\xbb\xae\x6b\xc8\
+\x92\x01\x9e\xaa\xd5\xd5\x6a\x2a\x83\xc3\xd4\x17\xf4\xfc\xbb\x06\
+\x82\xfc\xe9\x88\xa8\xd2\xf9\x11\xa1\xb1\x03\x14\x0e\x3a\xa5\x9e\
+\x45\x11\xc0\x50\x11\xb1\x1c\x07\x1b\x55\x91\xdb\x60\x21\xd0\xfc\
+\x71\x4a\x4d\xb3\xb9\x68\xad\x48\x52\xa9\xa2\xd5\x80\x73\x43\xd5\
+\x2e\x35\x37\x37\xc7\x0d\x19\x32\x44\xef\x15\x70\x0f\xe2\xa0\x61\
+\x32\xa5\xd3\xe3\xf3\xec\x76\x84\x30\x0c\x64\x0b\x87\xdb\x5a\x97\
+\x4d\x99\x22\x76\x1b\xe5\x1b\x1c\xae\x91\xf3\xbb\x9d\xed\x90\xbc\
+\xbe\xe2\x53\x0e\xc7\x8c\x59\x49\x49\x12\x7a\x69\x41\x27\xda\xaf\
+\xa5\x97\xc3\xae\xcc\x9d\xfb\x2d\xc9\xb1\xdc\x7c\x96\x7a\x3f\xb2\
+\x51\x68\x68\x28\xe3\x25\xdd\xeb\x6c\x2d\xcc\xcb\xca\x7a\x69\x7a\
+\x42\x82\x80\x07\xb4\xfb\x3c\xdc\xa8\xa8\x60\xd2\xe7\xbc\x66\x1e\
+\xf4\x53\xcc\xa2\xee\xb9\xde\x6c\x0b\xaf\xad\x95\xdc\x5c\x7e\x43\
+\x53\x51\xd2\xeb\x49\x0b\x1d\xc7\x1d\x06\x1e\xd2\x98\x87\x2d\x92\
+\x6c\xe6\x41\xf2\x22\x75\xf3\x5f\xcc\xde\x7b\xdf\x97\x5a\x7f\x73\
+\x06\xfe\x65\xfb\x0b\x09\x26\xc3\x4e\x3c\x67\xcf\x98\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xc9\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x90\x49\x44\x41\x54\x78\xda\xb5\x94\x6b\x6c\x93\x55\
+\x18\xc7\xff\xef\xad\x5d\xdb\x95\x71\x95\x11\xb6\xc1\x00\x17\x8c\
+\xce\x0d\x06\x1b\x99\x18\xd4\x19\x30\x22\x97\xc5\x4b\x96\x01\xc1\
+\xc4\x44\x8d\x1b\x98\x40\xe2\x07\x07\x02\x99\x82\xc4\x4f\xba\xf1\
+\x41\x13\xa7\x8c\xe8\x24\x2c\x78\x59\xc1\x41\x36\xdc\x10\x97\x8d\
+\x81\x40\x22\x38\x18\x34\xbb\x74\x17\x86\x63\xac\xed\xf6\xb6\xef\
+\xe5\x1c\x9f\xb7\x40\x42\x91\x8e\x99\xe8\x93\x9c\xb4\x7d\xfb\x9e\
+\xff\xef\xb9\xfc\xcf\x11\x30\x46\xcc\xfb\xb4\xc3\x31\x3a\x62\xec\
+\x54\x03\x5a\x5e\x42\x82\x9c\x35\x6d\xb2\x02\x53\x63\xe8\xf1\xfa\
+\xf1\x97\xef\xd6\x59\x1b\xd3\xeb\x25\x60\x67\xb0\x7a\xb9\x1a\x4b\
+\x43\x88\xf5\x47\xea\x3e\x5f\x19\x63\xbc\x78\xdd\xd3\x13\x91\x3f\
+\x37\x1e\xb2\x02\x04\x0c\xda\x40\x3b\x44\x11\x08\xd3\xf7\xea\xd3\
+\x83\xf8\xa2\xfc\x1c\xb8\x3a\x5a\x6e\xd6\xae\xd9\x34\x6e\x40\xea\
+\xe7\x7d\xdd\x79\xe9\xae\xa4\xb7\x32\xdc\xb8\x48\xb9\xf5\xeb\xf4\
+\x90\xf3\xa8\x97\x05\x51\x40\xbc\x0d\x78\xd4\x01\x94\x56\x76\xe0\
+\x64\x65\x8b\x0f\xbf\x15\x24\x3f\x14\x90\xb6\x7f\xa0\xbb\x30\xdb\
+\x95\x94\x9e\xe8\x44\x9b\xca\x40\x2d\x00\x69\x51\xe6\xc2\x9d\x4f\
+\x80\x31\x5a\x04\x64\x1c\x91\x07\xb3\xdc\x02\x0e\xd5\xf5\xe3\xf0\
+\xee\x3a\x1f\x4e\x6f\x48\x8e\x09\x48\xaf\xbe\x59\x96\x3b\x5b\x29\
+\x5e\x94\xe2\x42\x6f\x98\x41\xb4\xc4\x49\xd5\xa6\x08\xb8\x7a\x23\
+\x8c\x9e\xeb\x21\x98\x06\x47\x52\xa2\x1d\xf3\x67\x3a\x11\x0a\x31\
+\x82\x71\x70\x52\x99\xec\x92\xf0\xe5\x57\x6d\x38\x57\x7d\xa6\x1c\
+\x4d\x1b\x36\xfd\x03\xb0\xf8\xe8\x70\x3c\x33\x58\x60\x73\x4e\x02\
+\x2e\xd3\x46\x2b\x5b\x89\xb2\xbb\x19\x32\xf0\xc3\xf7\xbd\x08\x0d\
+\x04\x4f\x73\xdd\xa8\x31\x43\x1a\x8c\x11\x7d\x95\xe0\xb4\x67\x6f\
+\xd8\x92\x81\x69\x6e\x19\x86\xc9\x22\x95\x3c\xe2\x14\xb1\x79\xed\
+\x41\xda\xc8\xdc\x68\x28\x0c\x46\x01\x16\x7a\x86\xcb\x9f\x4a\x51\
+\x8a\x1c\xd4\x58\x4e\xe5\x5b\x99\xfb\x49\xdc\x53\xd3\x07\x1e\xd6\
+\x33\x7d\xdb\xd3\x2e\xdc\x5b\x6d\xc2\xba\x86\x0c\xdd\x60\xe7\x5f\
+\x2b\xc9\x45\xe2\x04\x19\xa6\xc9\xa1\xd8\x25\x1c\xab\xf5\xe1\x6c\
+\x45\xe3\x3e\xaa\xa2\x38\x0a\xb0\xc0\x33\xcc\x5f\x98\xef\x80\xdf\
+\xb8\xfd\x50\x51\x44\xd4\xd4\xf6\x83\x85\xb4\x4c\xef\xd6\x39\x51\
+\xe2\x77\x23\xfe\xe5\xe3\x19\xa6\x4d\x39\x5f\xb4\x77\x19\x42\xa3\
+\x46\x24\xa9\x61\x6a\xe1\xfe\x8d\xdf\x7a\xd1\xfa\xfa\xdc\x28\x40\
+\xce\x31\x3f\xcf\x4c\xb2\xc3\xa4\x9e\x5a\x83\x1c\xa1\x19\x34\x35\
+\x0e\xa0\x63\xcb\xec\x98\x56\xb6\x42\x7e\xd1\xd3\xb2\x7a\xdb\x33\
+\xd9\x53\x13\x94\xc8\x3c\xac\x0e\x94\xbd\x5d\x03\x1c\x5b\x23\x44\
+\x01\x96\x9d\x08\xf0\xb9\x53\xe4\x88\x33\x44\xb2\x4e\x67\x6f\x18\
+\x9d\x17\xfd\xb8\xba\x25\x65\x4c\x80\x7d\xd5\x91\x6d\x69\x2b\x9f\
+\x2c\x5d\x94\x3b\x8d\x0c\xc0\x60\x73\xc8\xf8\x6e\xf7\x29\x04\x0f\
+\x3c\x17\x0d\x58\xfc\xb3\x9f\x6b\xd4\x73\x43\x35\x23\xcb\xa4\x93\
+\xc4\x54\xf3\x92\x77\xeb\xac\xc7\xc7\x02\xc4\xad\x3e\x52\x92\xba\
+\x3c\xfd\xc3\x27\x96\xdc\x01\xc4\xc9\xf8\xf1\x93\x26\xa8\xdf\x3c\
+\x1b\x0d\x18\x6f\x4c\x7a\xa3\x99\x1b\xba\x81\x40\xe5\xd2\xc8\x5e\
+\xdb\x4a\xcf\xb5\xac\xa2\xa5\x73\x26\xd2\xa0\x39\x95\x6f\x73\x2a\
+\xf0\xbc\x5f\x0b\x76\x7c\xed\xbf\x07\xb8\xd6\x37\xf2\xf2\x3d\x4b\
+\xb0\xb9\xa4\x35\x02\xa0\x21\xe7\xd9\x27\xb9\xea\x16\x6c\x5c\x10\
+\xa9\xd8\xf2\xb6\xaa\x71\x34\xef\x38\xec\x45\xcb\x7d\x43\x1e\x2b\
+\xdc\xaf\x34\x24\xb1\x38\xa9\xbb\x7c\x4f\x36\x06\xc9\x2d\xbb\x3e\
+\x3a\x07\x41\xd7\x73\xc9\x0c\x4d\x2f\xbd\x93\x85\xcb\x01\x32\x86\
+\x65\x6d\x45\x82\xb7\xa1\x1b\x37\x1a\xcf\xee\xc3\xa9\xfb\x6c\x1a\
+\x33\xeb\xfc\xfa\x02\xe7\x74\x77\x55\x45\xe9\x22\x54\x5c\x0c\xa2\
+\x77\x20\x84\x4b\x9e\x2b\x48\x49\x9b\x82\x65\x2b\x92\x71\xc2\xa7\
+\xd3\x75\x42\xe2\x44\xe3\xb2\x84\x3f\xf6\x1e\xb5\x0e\xda\x04\x3a\
+\x68\x81\x87\x02\x5c\xf9\xbf\x54\xcd\x58\x38\xbd\xa0\xf4\xcd\xc7\
+\xf0\xde\x4f\x7d\x08\x85\x81\x15\x59\x6e\x2c\x9c\x2a\xa1\x79\x88\
+\x5a\xd1\xae\x42\x16\x11\x11\x17\x68\xb8\xbe\x83\x17\xa0\xfa\xba\
+\x76\xe1\xd7\xf5\x3b\xef\x6a\xc4\x04\xc4\x6f\x3c\xe3\x4b\x9c\xe7\
+\x9c\xb9\x7a\x4d\x32\x0e\xb5\x04\xe0\xbf\xa9\x41\x71\xd3\xf5\x49\
+\x07\xd0\x14\xad\x6b\x84\x16\xf5\xdc\xba\x04\x05\x3a\xc1\x81\xba\
+\x76\x8c\x5e\xf1\xf6\xb0\x93\x85\x49\xf7\xea\x3c\x10\x90\xb8\xc3\
+\x3b\x92\x9b\xe3\x76\x06\x65\x01\x7f\x76\x6a\x18\xec\x51\x21\xd1\
+\x01\x12\x1d\x22\x04\x49\xbc\xbd\xcb\x6a\x89\x05\x30\x01\xad\xd9\
+\x0b\xbd\xcb\x77\x41\xaf\x7f\x35\xf3\x7e\xad\x98\x15\xcc\xd8\x7e\
+\xf9\xfc\x2d\x95\x65\x68\x4e\x1b\xa4\x38\x09\xa2\x8d\x84\xa9\x1f\
+\xdc\x4a\x9d\x84\x45\x55\x87\xdc\x73\x0b\xac\xab\x0f\x4c\xd3\x4b\
+\xd5\x9a\x55\x1f\x3c\x48\x67\xcc\x19\xa4\xee\x69\x2f\xf3\xeb\x62\
+\xf1\xa0\xd5\xe8\x48\xe6\x22\x24\xc3\xc0\x94\x2b\x3d\x30\x38\x03\
+\xd7\xb4\x77\x87\xaa\x9e\xff\x6c\x2c\x8d\x87\xba\x28\xf5\xe3\x6b\
+\x05\x61\x8d\x57\xf5\xc7\xd9\xc0\x88\xa1\x90\xdf\x27\xb5\xf7\x62\
+\xe0\xeb\xa5\xe3\xb2\xf8\xb8\x5e\x4a\xd9\xd1\x96\x6c\x32\xa3\xeb\
+\xba\xc3\x15\xf9\x3d\x99\x2a\xf8\x4f\x01\x77\x63\xe6\xd6\xdf\x79\
+\x50\xb6\xc3\x7e\x7d\xe8\xff\x01\x58\x31\xbd\xa8\x95\xf3\x91\xf0\
+\xb8\x01\x7f\x03\x3c\xea\xf3\x28\xc3\xae\x64\x9e\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xb1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x78\x49\x44\x41\x54\x78\xda\xad\xd4\x79\x4c\x93\x67\
+\x00\xc7\xf1\xdf\xdb\x83\xde\x8d\x4e\x2d\x4e\x97\x25\x76\x52\xaa\
+\xc6\x60\x4a\x74\x32\xc5\xe1\x74\x44\x99\xd1\xf8\x57\x9d\x2e\xcb\
+\x50\xa3\xc6\x23\x9e\xdb\xfc\xc7\x7f\x97\x4d\x23\x1e\x33\x71\xd1\
+\x8d\x7a\xcc\xa0\x6f\xc4\xe0\x41\x24\xc4\xa0\xbb\x40\xa9\x28\x60\
+\xab\xa5\x41\x51\xa8\x80\xe5\x6c\x6b\x4b\xdb\xf7\x78\xf6\xd0\x44\
+\x22\x42\x29\x87\x4f\xf2\x26\x6f\xde\x37\xcf\xe7\xfb\x9e\x0f\x83\
+\xf7\x34\x5a\x0e\xa5\x05\x15\x1f\xc8\xd5\xc1\xaa\x8e\x57\xde\xa0\
+\x30\x3b\xfd\x6c\x63\x5b\xef\x71\xe6\x7d\xe0\xd5\xfb\x53\x5c\x69\
+\x8b\x8d\xa9\x5c\x6d\x33\x88\xbb\x0b\xfe\x97\x61\x34\x4d\xd5\x4e\
+\xb5\x9c\x7e\xde\x3c\xe6\x80\xef\x59\xf9\xc9\xf3\x6c\xd1\x96\xa5\
+\x8e\xd3\x98\xae\x51\x23\xe2\x0e\x42\xa8\x0f\xa3\x47\x21\x83\xe7\
+\x8b\x89\x86\x31\x05\xae\xfc\x9c\x6b\x5b\xfd\x63\xfe\x77\xbd\xfb\
+\xc7\xf7\x6f\xc0\x92\xcb\xf9\x30\x0a\x2a\xf0\x01\x01\x8c\x08\x74\
+\x4c\xd7\xbc\x1a\x75\xc0\x95\x67\x2e\x15\x97\xfb\xbf\x2c\x2e\xce\
+\xc0\xde\xbd\x97\x63\xc7\x7e\xdd\xfc\x0d\x16\x9d\xba\x00\xf3\xa4\
+\x24\x70\x04\x08\xeb\x93\x46\xf7\x0e\x28\x7e\xd7\xb8\x4d\xfd\xa9\
+\x44\xac\x45\x9d\x9d\xc7\xb5\x92\x55\xd8\x7e\xa0\x08\x49\x4a\xe0\
+\xd4\x86\xb5\xc8\xb4\x15\x60\xc6\x78\x39\x3c\x26\xdd\xc8\x03\x14\
+\x2f\xa7\x78\x06\x1f\xae\x05\x7a\x04\x28\x5b\x08\x9e\xdb\x81\xb3\
+\x4f\x56\x62\xeb\x81\xab\x50\x8f\x03\xce\x6c\xfa\x16\x19\x05\xe7\
+\x41\xb2\x93\x7f\x19\x51\x80\xe2\xff\x50\x7c\x61\x0c\x0f\x09\x90\
+\x34\x11\x48\x79\x40\x12\x96\xa0\xcc\x26\xc5\x75\x92\x83\x3d\x79\
+\x45\x50\xc2\x07\xe7\x9a\x64\x76\x49\x59\xc4\x3a\xec\x00\xc5\x2b\
+\x8c\xdb\x34\xf3\xf9\x70\x4d\x1f\x2e\xe1\x00\x31\x20\x85\xe7\xfe\
+\x64\xc8\x23\x01\xd4\x38\xfc\x78\xa8\xce\x44\x0e\xe7\x62\xe7\xb2\
+\x6d\xd6\xde\x79\xc3\x0a\x50\xdc\x69\xdc\xa1\x9d\xc9\x87\xaa\x07\
+\xe2\xf6\xc9\x10\x83\x01\x10\xc2\x83\x89\x32\xe8\x76\xcb\xd9\x79\
+\xc5\xdd\xd6\x37\x73\x13\x06\x28\x5e\xf7\xc9\xae\xf1\x26\x2e\x60\
+\x8f\x8b\x8b\x02\x07\xa5\x4e\x8b\xe6\x1a\x19\xfb\x59\x61\x8b\xf5\
+\xed\xf9\x43\x06\x1e\xe7\x99\xea\x52\x77\x1b\x4c\x91\xc0\x3d\x20\
+\xc8\xc7\xc5\x55\x14\xf7\x54\x32\xec\x82\x1b\x5e\xeb\xbb\x46\xdc\
+\x80\xf3\xb0\xe9\x89\x79\x8f\xc1\x1c\xa5\x38\x19\x02\x57\x6a\x35\
+\x68\xba\xcb\xb0\x99\x37\xdb\xac\x83\x39\x83\x06\x1c\x87\x52\xaa\
+\x66\xec\x4b\xb6\x24\xc4\x75\x1a\x34\x96\x83\x5d\x54\xd2\x6e\x8d\
+\x77\xa1\x03\x02\xce\x23\xa6\x9b\xe6\x5d\x86\x65\x89\x70\x15\xc5\
+\x1b\xfe\x26\x6c\xd6\xad\x8e\xb8\xf8\x80\x80\x7d\xe7\xb4\x3f\x2d\
+\x47\xa7\xac\x8b\x06\x2a\x13\x3e\x96\xfa\xbf\x08\xbb\xb4\x6c\x68\
+\xbc\x5f\xa0\x70\x16\xd6\x66\x97\xe6\x5f\x90\xe9\xd7\x83\xbc\xa6\
+\x3f\x4f\x23\xdd\xf8\xc1\x71\xf7\x1d\x91\xcd\xbe\xdd\x99\x10\xef\
+\x17\xa8\x58\x6f\xaa\x9a\xff\x47\x9d\x45\xf4\x1d\x06\xdf\xf0\x3d\
+\x98\x10\xe9\xff\x9d\x53\x5c\x41\x1f\x8b\xab\x54\x60\x97\xfd\xdb\
+\x35\x2c\xbc\x2f\x70\x29\x15\x73\xb2\x7e\x3f\xfa\xd0\x60\xf9\x0a\
+\x78\xdd\x09\xe2\xdd\x8a\xa8\xa7\x8a\xe2\x53\x20\x86\xe8\xed\x10\
+\x8e\x2e\x64\x5a\x38\x6e\x45\xd8\x15\xff\xf9\x87\x8d\xf7\x05\x6e\
+\xe7\x18\xaa\xb3\x8a\xdd\x69\xf0\xde\xa7\x6b\x6c\x33\x20\x74\x23\
+\xda\xf5\x08\x4f\xcf\x9d\x83\x4c\x25\x85\x18\x4d\x42\x7d\x05\x61\
+\x57\x54\xf8\x46\x84\xc7\x02\x57\xd2\x55\xd2\x36\x5e\xc2\x7f\x6d\
+\xfb\x09\xba\x8f\x3e\x04\xf1\x37\x80\x89\xb4\xd2\x33\x5d\x88\xbe\
+\xb0\xc3\x71\xb1\x09\x2e\x3b\xb7\x63\xdd\xe3\x9e\x13\x23\xc5\x63\
+\x81\x82\x34\xe5\x6f\x95\xad\x91\xcd\xa1\x4e\x82\x83\x25\xb9\xd0\
+\xa7\xd0\x48\xab\x13\xcf\x0a\x1f\xe0\xe9\x3d\x5f\x41\xbb\x97\xeb\
+\xa4\xf8\xf6\xd1\xe0\xb1\x80\xcd\xa2\x27\x8e\xd6\x20\x44\x91\xe0\
+\x63\xbd\x0c\x8b\x3f\x4f\xee\x79\x50\xe2\xf9\x41\xa1\x53\xa6\x53\
+\x38\x77\xb4\x70\x5f\xe0\x98\x49\xde\xae\x56\x29\x26\x28\x45\x9e\
+\x95\x08\x4c\x80\xa2\x1b\xc7\x8a\xbe\x3d\xfe\x07\x5e\x55\xf2\x96\
+\x8f\xaa\x45\xa0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x04\x7f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x46\x49\x44\x41\x54\x78\xda\xa5\x96\x6d\x6c\x53\x55\
+\x18\xc7\xff\xf7\xde\x76\x18\xe3\xd4\x2a\xc1\xa8\x89\x7e\xf0\xe5\
+\x83\x1a\x43\x30\xe1\x83\x6f\x09\x3a\x51\x63\xb2\x4c\x0d\x46\x46\
+\x9c\x11\xc4\xf8\x81\xa0\xd1\x60\x78\x69\x31\x18\x9c\x60\x94\xb8\
+\x88\xf8\x9a\x31\xc4\x29\xbe\x6c\xd1\x84\x30\x49\x27\x68\x94\xc9\
+\x36\x10\x34\x73\xdd\x4a\x9d\xd0\xae\x65\x1b\xeb\x56\xda\xde\xde\
+\xf7\x7b\x7c\xce\x69\x87\xab\x77\x5b\x60\x9e\x93\xdb\xdb\xdb\x7b\
+\x7a\x7e\xe7\xf9\xff\x9f\xf3\xdc\x2b\x61\x52\x7b\xab\xf5\x47\xc6\
+\x5c\x09\xb6\xe3\x82\x31\x06\x48\x12\x64\xf0\x13\x9d\x25\x20\xa3\
+\xb9\x50\xe8\x87\xb3\x86\x86\x74\x26\x8b\x81\x64\x0e\x1d\xdb\x9e\
+\x93\x30\x43\x93\xfe\x0b\x58\x72\xd7\xed\xe2\xbb\xdf\xaf\xa0\xa0\
+\x5a\xc8\xea\x05\xe4\x75\x1b\xaa\x61\x61\x4c\x55\x31\x9e\x73\xa0\
+\xe9\x26\x62\x43\xa7\x11\x3d\x9d\x86\xa1\x49\x33\x42\xca\x6e\x6c\
+\xfd\xfa\x00\x7b\xf2\xde\xf9\xb8\x6e\x5e\x40\x5c\x33\xea\x85\x82\
+\x89\x9c\xee\x20\xab\x69\xc8\xe6\xf2\x18\x56\x4d\x58\x74\x1d\x19\
+\x1e\x45\xf8\xb7\x5e\xdc\x79\xf3\x0d\xe8\x88\xc6\x71\xf0\xf5\xe5\
+\xd2\x05\x01\x1c\xcb\x82\x06\x9b\x00\x0a\xad\xd8\x82\x6e\xe6\xa1\
+\x53\x14\x69\x8a\xca\x72\x5d\x44\x06\xc7\xd0\x17\x8f\xa3\xf6\xee\
+\xdb\xd0\xda\xf9\x17\xfe\x88\x0f\x4f\x09\x29\xfb\xa1\x7e\xcf\x01\
+\xb6\x6c\x51\x09\xe0\x38\x14\x82\x0b\x13\x0a\x74\x5d\x87\xa6\x16\
+\x90\xd3\x1c\x92\x8b\xc1\x74\x2c\xf4\x0d\x8e\xa2\x33\x36\x80\x50\
+\xed\x62\x38\xa6\x8d\xad\xdf\x76\x20\x92\x18\xf1\x40\xca\x2e\x36\
+\x37\xb7\xb3\xa7\xaa\x16\x20\x7a\xaa\x80\x8d\x1f\x75\x10\x40\x12\
+\x46\xbb\xcc\x81\x6b\xd3\x41\x50\xe6\x32\x31\x36\x93\x4e\xe2\x89\
+\xda\x85\x78\xa3\xee\x3e\x24\xc7\x73\xe8\x3f\x39\x82\xb6\x63\x31\
+\x1c\x1d\x48\x95\x41\xca\x00\xaf\x7d\xde\xce\x9e\xbe\x7f\x41\x29\
+\x02\x1d\xae\xab\xf0\xf9\x05\x47\xa3\xcc\x52\xc9\x6c\xdb\x74\x20\
+\x13\x30\x92\x48\xe3\x87\x9e\xb8\x00\x9c\xcd\xe6\x91\x77\x18\xe2\
+\xc9\x21\xb4\x76\x0d\x60\x5f\x77\x1f\x7a\x3f\x78\x51\xf2\x00\x42\
+\x9f\x85\xd9\xb3\x0f\xdc\x51\x02\x98\x04\x28\xde\xe6\x29\xea\x94\
+\x20\xdc\x60\x2e\x91\x4a\x5e\x84\x8f\x47\xc5\xfd\x5c\x8e\x21\xcf\
+\x4c\xf1\xfd\xc8\x89\x14\xfe\x4e\x8e\xa0\xff\xe3\x97\xbc\x80\x35\
+\x8d\xdf\xb3\x55\x8f\x2c\x2c\x49\x74\x98\x96\xce\x3c\x8e\xd1\x46\
+\x41\xd1\x1e\x8b\x0e\x2e\x1b\xa3\xc3\x86\x65\x18\x68\xd8\xb8\x18\
+\x3d\xa7\x52\x68\xd8\xdb\x85\x93\x8d\x6b\xbc\x80\xd5\xdb\xbf\x63\
+\x2f\x2f\xb9\x47\x44\x60\xd3\x2c\x26\x65\x4b\x45\xe9\x1e\x2b\x0d\
+\x66\xb2\x4c\x1b\xcd\x82\x69\x5a\x70\x2d\xca\x32\x9e\x61\x94\x71\
+\xa3\x19\x1d\x97\x5d\x3a\x07\x9d\x27\x06\xb1\x65\xcf\xcf\x48\x7c\
+\xfa\x8a\x17\xb0\x72\x5b\x33\x0b\x2e\x7b\xb8\x28\x11\xb8\x14\x2e\
+\x5c\xbe\xe9\xe8\xc3\x37\x69\x9c\xed\xc8\x30\x5c\x03\xaa\x6d\xc0\
+\xc8\x4b\xb0\x98\x4e\x00\x0d\x57\x5f\x11\xc0\xa1\xfe\x38\x29\xd1\
+\x86\xd4\xee\xb5\x5e\xc0\xd2\xfa\x26\xb6\x65\x45\xb5\x90\x28\xf8\
+\xe1\xaf\x42\x22\xde\x65\xea\xc2\xec\x09\xa5\xf8\xbf\x28\x9b\x1c\
+\x9e\x5d\xb4\x08\xfa\x80\x65\x19\x08\xbf\x5f\x8b\x23\xb1\x24\x9e\
+\x69\x68\xc1\x70\xf3\x3a\x2f\xa0\x3a\xf4\x09\x7b\x77\xd5\x63\x22\
+\x82\xb4\xaa\x43\xe1\x93\xd0\xb4\x3e\x92\x45\x91\xe4\x62\x3a\x91\
+\x66\xb2\x42\x11\x91\xeb\x0e\x1d\x1a\x79\x61\x93\xf1\x67\x72\x2a\
+\x6e\xbd\x7e\x1e\x0e\xf5\x24\xf0\x68\xfd\x6e\x9c\xf9\x62\x83\x17\
+\xb0\x68\x43\x23\x6b\x5a\x5d\x23\x00\x63\xf9\x82\x58\x32\x5f\x35\
+\x73\x5d\x31\xd4\x4f\x42\xcd\x21\x98\xc9\x8d\xf1\x03\x17\x71\xa0\
+\x2d\x41\xe5\x1e\x64\x35\xdc\x74\x4d\x00\xc7\x63\x29\x54\x05\x77\
+\x22\xfd\x65\x70\x7a\xc0\x2f\xc7\xd2\xd8\xd1\xf2\xbb\xa7\xae\x08\
+\xa3\x49\x1f\x89\x76\xb7\xc8\x5d\xca\x28\x88\xa2\x2b\x93\x44\x26\
+\xda\xb7\xd7\x50\x09\x19\xc2\x83\xc1\x5d\x18\xfb\x2a\x78\x7e\x11\
+\x94\x01\xe8\xba\xa2\xc2\x47\x93\x59\x54\xb6\x7d\x24\x9d\x8f\xac\
+\x70\x89\x55\x2c\x27\x57\x06\x2e\x46\x57\x74\x10\x0f\x85\x76\x61\
+\x7c\x36\x00\xde\x14\x45\xa1\x2c\x22\x00\x75\x3f\x99\xc1\x55\xe2\
+\x02\x9a\xb4\x17\xe6\x56\x9e\x27\x60\x3a\x89\x3c\xbb\x6e\x52\xe3\
+\x09\x1d\x6e\xa8\x41\x6f\x82\x24\xfa\x3f\x11\xfc\x3b\x21\xf9\x4b\
+\x03\x24\x61\x3e\x2f\x23\x0e\xae\xbd\xbc\x12\xdd\x14\xc1\xb4\x80\
+\x5b\x9e\x7f\x87\xb5\x6d\xaa\x3b\x07\x90\xa6\x00\x88\x2d\x40\x99\
+\xe4\x70\x04\xa5\xa8\xe2\xca\xf0\xf9\x7c\xd0\xa8\x08\x5e\x15\xb8\
+\x04\xdd\xb4\x93\xb9\xc9\x33\x02\xf8\x46\x5b\xff\xde\x4f\xd3\x06\
+\xc0\x6b\x8f\x08\x41\x2a\x96\x73\xde\x6d\xdb\xc4\xe1\xa6\x3a\xfc\
+\x49\x12\x55\xad\xdb\x89\xcc\x37\x21\x2f\x60\xee\xe3\xaf\xb2\xa3\
+\x3b\x5e\x38\xf7\xc8\x9c\x4d\xe3\xcf\x86\xf9\x2b\xdf\xc6\x68\xcb\
+\x26\x2f\xa0\xb2\x7a\x3d\x8b\x34\xad\x9d\xf5\xe4\x13\xed\xc6\xa5\
+\x9b\xa1\xef\x7f\x73\x6a\x00\x3f\x5b\x8c\xbf\xac\xb0\x0b\x9a\x94\
+\xbf\xe6\x48\x54\x5d\x27\xda\x04\xe0\x1f\x22\x57\x9b\x37\x2d\xb7\
+\x5c\x2e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x07\x2b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\xf2\x49\x44\x41\x54\x78\xda\x8d\x96\x7b\x50\x54\xf7\
+\x15\xc7\xbf\x97\xdd\x65\x01\x79\x1b\x10\x09\x90\x15\x5c\x11\x51\
+\x5e\x46\xac\xa0\x48\x90\x38\xa2\xb0\x51\xa3\x80\x09\xf6\x35\xd3\
+\x28\xa9\x34\x62\xad\x89\xd1\xbf\xfa\x47\xc7\x26\x33\x66\xda\x4e\
+\x9b\xb1\xad\xed\x98\xda\x12\xa3\x48\x82\x0a\x51\x5e\x41\xc4\x6a\
+\x69\x90\x87\x15\x05\x16\x10\x56\xd8\xf7\xdd\xf7\xde\xbb\xaf\xdb\
+\xb3\xd7\x8e\xd3\x49\x66\x6c\xef\xcc\xce\xce\xdc\x3d\xe7\x7c\x7e\
+\xe7\xf5\xfd\x2d\x83\x6f\x3c\x0d\xef\x1c\x56\x3e\x7c\x38\x39\x5e\
+\x90\x9f\x07\x9f\x8f\x87\x4e\x67\x06\xef\xf3\x40\x3d\x3e\x8e\xc1\
+\xaf\xef\x32\x41\x9b\xc2\xf5\x45\x9c\x72\x85\x52\x1e\x1f\xff\x02\
+\x16\xe6\x35\xe0\x79\x0f\xb4\x3a\x3d\xe2\xe3\x63\x54\xd7\xdb\xdb\
+\xae\xfc\x77\x3c\xe6\x9b\x80\x03\xf5\x6f\xef\x94\xc9\xa3\x5a\x8e\
+\x1d\x7d\x87\x00\x01\x8c\x3d\x9a\x84\xdd\x66\xc1\xd9\x3f\x9f\x45\
+\x47\xdb\x15\xd1\xbe\xac\x6c\x2b\x77\xea\x83\x5f\xca\x95\x19\xe9\
+\x78\xf8\x68\x02\x3a\xa3\x09\x3d\x5d\x3d\xb8\x3f\x3a\xa8\xea\xea\
+\xbc\xf1\xff\x01\xde\x3b\xd6\x28\x02\x26\xa7\xa6\xe1\x70\x38\x70\
+\xe6\xcc\xc7\x68\xbf\xf2\xf9\x33\xc0\x2f\x4e\x9d\x92\x67\x2a\x97\
+\xe1\xd1\xc4\x34\x8c\xac\x05\x5d\x1d\x5d\x18\x19\x1e\x50\x75\x75\
+\xfc\x0f\xc0\x5b\x07\xeb\xf3\xc7\xc6\x26\x06\x73\x56\xaf\x86\xc3\
+\x6d\xc7\x14\x05\xb0\xbb\x9c\xb0\x5b\x59\xa8\x27\xc7\x45\xfb\xb5\
+\x2f\xaf\xf7\xe4\xe6\xe6\xc9\xc2\x23\xc2\x31\x4e\x19\x58\xad\x66\
+\x98\x59\x13\x32\x32\x94\xb5\xd7\xdb\xaf\x5d\x78\x2e\x20\xf8\xbc\
+\x5a\x51\xc5\x9d\x38\xf9\xbe\x7c\x71\x74\x3c\x3e\xf8\xe8\x34\xac\
+\x26\x13\x4c\x26\x83\xb3\xff\x56\x6f\x64\xf0\xf7\xcd\x9b\x4b\x5b\
+\xeb\xbe\xf7\xa3\xaa\x57\xcb\x37\xe3\xb7\xbf\xff\x03\xc6\xef\x3f\
+\x80\x7a\x62\x02\xf7\xff\x35\xf4\xad\x78\xcf\x5e\x1c\x6e\x3c\x36\
+\x2e\x91\x48\x94\x06\x83\x1e\x3c\xe7\x41\xd6\xea\x6c\xc0\x1f\xc0\
+\xbd\x91\x61\x78\x78\x0e\x9a\xb9\x19\x8c\x8e\x0c\x8b\xf6\xaf\x94\
+\x6e\x71\x1e\x7d\xf7\x78\x44\x78\x64\x38\xae\xb7\x75\x60\xec\xc1\
+\x7d\xe8\xb5\xf3\xb0\x3a\xec\x60\x04\xc0\xed\x76\x07\xa6\xa7\x27\
+\x25\xcf\x00\x87\x1a\x0e\xef\xc9\xcf\x2f\xb8\xb8\x26\x27\x17\x2c\
+\x35\x74\x4a\x3d\x8d\x7b\xff\xfc\x1a\xac\xc5\x02\x9b\xd3\x8e\xa0\
+\x25\xc3\x04\x30\x37\x3b\x07\x96\x65\x71\xe2\xe4\xcf\xf1\x92\x22\
+\x05\xe3\x13\x93\xb0\x59\x6d\x70\xd8\xec\x30\xb1\x7a\xf8\xbd\x02\
+\xfc\x3e\x1f\x78\x0f\x87\xc7\x33\x53\x1f\xdf\xb9\x73\xfb\x6d\x11\
+\x50\x57\xf7\xfd\x9b\x4b\x52\xd3\x36\x6d\x2c\x5c\x8f\xfc\xb5\xd9\
+\x62\x06\x66\xb3\x05\x4e\x17\x8f\x4f\xce\x9d\x83\x20\x08\x88\x8d\
+\x89\x83\x99\x80\x3d\x5d\x6d\x28\xd9\xb2\x0d\x9c\xdd\x4e\x87\xb1\
+\xa2\xba\x76\x2f\xbe\xfb\x66\x1d\xe6\x9f\x3c\xa1\x03\x99\x09\x64\
+\x41\x42\xc2\x52\xd4\xee\xd9\x39\x3a\x35\xa5\xce\x11\x01\xd5\xb5\
+\x75\x96\x15\x99\x59\x31\x85\xeb\xd6\x61\xd5\xca\xe5\xb0\x90\xa3\
+\xc1\x60\x02\xc7\xf3\xb8\xf4\x59\x33\x02\x82\x1f\x31\xd1\xb1\xd4\
+\x48\x16\xb7\x6e\x76\xa2\xbc\x42\x05\xaf\xcb\x05\x93\x85\xc5\x8e\
+\x8a\x2a\xbc\x5e\xad\xc2\xfc\xcc\x2c\x4c\x56\x0b\xd9\x58\x11\x43\
+\x87\xf9\xf0\xc3\x53\x5c\x6f\x77\x67\xb8\x08\xa8\xd9\xb7\xdf\xaf\
+\xcc\x5a\x19\xb2\xe9\x3b\x1b\x90\x91\x9e\x4e\x27\x65\x09\x60\x20\
+\x80\x17\x2d\x97\x9a\xe1\x7f\x2e\x60\x3b\x01\x76\x11\x40\x03\x13\
+\x95\xd7\x6a\xb6\x43\x1e\x11\x16\x04\xe0\x76\x5f\x2f\x23\x02\xf6\
+\xd6\xd4\x09\x99\x59\x59\x28\x2b\x29\x46\x9a\x42\x01\xb3\xde\x0c\
+\x3d\x6b\x14\x37\xb4\xe5\xd2\xe5\xe7\x02\x2a\xb6\x6d\x47\x4d\xcd\
+\x2e\xcc\x12\xc0\x4a\x00\x13\x01\xa4\x12\x06\x57\xdb\xbf\xc4\xf4\
+\xc4\x58\x12\x73\xec\xdd\x13\x25\x2e\xa7\xab\x37\x63\x45\x26\xaa\
+\xc8\x38\x43\x99\x0a\x9d\x5e\x0f\x8d\x96\x00\x0e\x37\xce\xfe\xe9\
+\x8f\x04\xe2\x11\x15\x15\xfd\x2d\x80\xd5\x6e\x43\x6d\x4d\x2d\xf6\
+\xd7\xd5\xc0\xc5\x05\x68\x94\x75\x30\x9a\x58\x78\xbc\x01\xda\xf0\
+\x31\xfc\xee\x57\xa7\xdf\x63\x1a\x7e\x72\xe4\xcc\xc0\xc0\xc0\x5b\
+\xc1\x20\x9e\xe0\xc7\xeb\x15\x47\x8b\xa6\x8d\x6a\xef\xc3\x32\xc5\
+\x72\xbc\x98\x92\x82\xe8\xc8\x28\xda\x58\x16\x7d\x3d\x37\xb0\xb5\
+\x72\x27\xc1\xed\xb0\x3b\x5d\x24\x0f\x43\xd0\x2e\xcc\x3f\xf3\x11\
+\xbf\x69\x28\x42\x24\x12\x64\x65\x65\xf5\x31\x87\x1a\x1a\x3f\x51\
+\xab\xd5\xfb\x93\x93\x5f\x84\x82\xea\x1f\xb9\x28\x8a\xe6\x7d\x08\
+\x16\x6a\x58\x10\x18\x11\x1d\x0d\xce\xe1\xa4\xad\x76\x82\x77\xbb\
+\xa1\x99\x9d\x45\x6a\x5a\x2a\xe2\xe3\x16\x23\x29\x35\x0d\x71\x94\
+\x59\x40\xe0\x49\x08\x47\xc0\x79\x78\xf8\x69\x44\x39\xaf\x0f\x66\
+\x83\x0e\x89\x89\x89\x83\x62\x0f\xf6\x54\xbf\x29\x6c\xaf\xdc\x81\
+\x8d\x45\x85\x88\x8c\x88\xc0\xc5\xcb\xd7\x68\xec\x34\x94\x36\x07\
+\x17\xc9\xc4\xdc\xf4\x0c\x12\x97\x2c\x4e\x38\xff\x97\x73\xc6\xa0\
+\xfd\xee\xbd\xd5\x2f\x44\x84\x47\x19\x32\x94\x4a\xec\x56\x55\x21\
+\x29\x39\x91\x4a\x79\x1e\xac\xdd\x02\x87\xc5\x21\xee\xce\xbd\xbb\
+\x77\xf0\xe0\xc1\x08\xc3\x1c\xfd\xd9\xf1\x22\xd6\xee\xe8\xdf\x54\
+\xb4\x01\x6b\xd7\xe6\xd3\x29\x39\xb4\x5e\x6d\x87\x8d\xea\xeb\x76\
+\xb9\xc1\x11\x80\xb5\x58\x11\x16\x26\xfd\xe8\xb3\x0b\x4d\x47\x82\
+\x80\x8a\x4a\xd5\x69\x85\x22\xa3\x31\x26\x3e\x0e\xaf\x6d\xdf\x86\
+\x08\xca\xfa\xfc\xdf\x9a\xe0\x72\xb8\xc8\xc7\x21\x8e\xf9\xc2\xfc\
+\x3c\xc2\x42\x25\xc5\xcc\xc1\xfa\x86\x5f\xc7\x26\x24\x34\xe4\xad\
+\x59\x83\x82\xfc\x35\xd0\x3c\x59\xc0\x0d\x52\x46\xa7\x93\x83\x97\
+\xca\xe2\xa4\xb2\xb8\x09\xc2\xf3\xee\xae\x2b\xad\x9f\x97\x3f\x95\
+\x8a\x57\x3a\xcb\x77\xa8\xb6\xb8\x29\xa0\xaa\xaa\x02\x21\x21\x12\
+\x7c\x7a\xe1\x22\x38\xca\xd8\x46\xca\x6b\xa5\xf2\xfa\xc8\xcf\x68\
+\xd4\xfd\x86\xf9\xc1\x0f\x0f\x0c\xa5\x2a\x96\xe5\x16\x14\xe4\x22\
+\x87\xf4\x67\x78\x64\x14\xfd\xfd\x7f\xa7\x75\xe7\xa9\x3c\x6e\xb8\
+\x9c\x14\x9c\x26\x86\xb6\x94\xef\xe9\xee\x08\x13\x33\xd8\x56\xc9\
+\xad\x2b\xde\x28\x0f\x90\x9c\xbf\xbe\xfb\x35\x70\x14\xec\x52\x73\
+\x8b\x58\x52\x87\xd3\x0a\x9b\xc9\x02\x3f\xd9\xcd\xcf\x4d\x0f\x33\
+\x07\x0e\x1e\x5a\x48\x51\xa4\x27\x15\x17\x16\x88\x4d\xbe\xd9\x77\
+\x1b\x43\xc3\x43\xe2\x24\xd8\x49\x67\x9c\x04\x08\x3a\x6a\x1e\xcf\
+\xe0\xde\xe0\x3f\xc4\x9e\x15\x6f\x2c\x15\x4a\xcb\xb7\x40\x26\x0b\
+\xc5\xde\xdd\x95\x30\x1b\x2d\xb8\xfc\x45\x1b\x2d\x26\x47\xf6\x24\
+\x21\x46\x23\xed\x8e\x40\x8d\xd6\x6b\x99\x9d\x7b\x6a\x85\xcd\xa5\
+\xa5\xd8\x50\xf8\x32\xd2\xd2\x92\xd0\xfe\x65\x2f\x5d\x32\x6a\xf8\
+\x3c\x3e\xd8\xa9\x0f\x56\xd2\x1c\x27\x2d\x94\x5e\xaf\x05\x89\x97\
+\x08\xd8\x51\xb5\x4b\xc8\x2b\x28\xc0\xa2\xf0\x48\xbc\xf1\x46\x0d\
+\x16\xb4\x5a\x7c\xd1\xda\x0a\x9e\xa6\xc7\x46\xd2\x6e\x34\x9b\xe1\
+\xf3\x7a\x44\x95\x65\x36\x95\x94\x09\xb9\xb9\xf9\xd8\x57\xbb\x0f\
+\x7a\x83\x16\xcd\xcd\x17\x31\x37\xb7\x00\xaf\xdf\x0b\x81\xe4\x9a\
+\x21\xfd\x65\x68\xe1\xa5\x52\x19\x7a\xbf\xea\x7c\x9a\x41\x49\xa9\
+\x90\x9d\x9d\x47\xf7\x42\x11\x64\x21\x0c\xfa\xfa\xef\x62\x64\x74\
+\x98\x82\xfa\xe0\xf7\xfb\x11\x08\xf8\x10\x26\x0f\x17\x27\x91\xc9\
+\xcc\xcc\x16\x52\xd3\x14\x68\x3c\xda\x88\xee\x9e\xaf\x70\xe3\xda\
+\x35\xda\x46\x03\x84\x80\x1f\x12\xa9\x04\xb2\x50\x39\x22\x69\xd6\
+\x83\x6a\x7a\xeb\x66\xb7\x08\x48\x5e\x9a\x2c\x14\x97\x94\xe1\xc7\
+\xf5\xf5\x38\xdf\xd4\x44\xef\x7b\x60\x21\xa5\x25\x27\xf2\x91\x8a\
+\xc1\x63\xe3\xe2\x61\x25\x75\x65\x56\xad\xca\x11\x14\xcb\xd2\x71\
+\xfc\xe4\xfb\xe8\xec\xee\xc1\xd5\x96\x16\xb1\x1c\x41\x5d\x0f\x02\
+\x42\x83\x00\xda\xe2\xe8\xd8\x38\xf4\xfd\x27\x83\x94\x94\x54\xa1\
+\xb4\x6c\x2b\x7e\xda\x78\x04\x7f\xfd\xb4\x89\xee\xe3\xeb\x30\x19\
+\x0d\x74\xf2\x80\xe8\x23\x27\x40\x5c\x5c\x1c\x58\x2a\x15\xb3\xae\
+\x70\x83\xb0\x88\x02\x04\xcb\x34\x3b\x33\x8d\x39\xcd\x63\x9a\x1c\
+\x17\x5d\x66\x7e\xf1\xa6\x93\x84\x48\x21\x95\x49\x20\x0d\x95\x61\
+\x70\xe0\x69\x93\x5f\x52\xa4\x0b\x49\x4b\x96\x62\xf9\xca\x95\x24\
+\x68\xe3\xf4\xaf\x42\x27\xee\x4f\x30\x03\xea\x2d\xe8\x66\xa4\x92\
+\x4a\x69\x6c\x79\xfc\x1b\xd8\x8b\xd0\x33\x87\x33\xa8\x89\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x43\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x0a\x49\x44\x41\x54\x78\xda\x9d\x95\x7b\x4c\x53\x77\
+\x14\xc7\xbf\x97\xdb\x82\x2d\xa5\x54\x61\xb4\x2a\x16\x18\xe0\xe4\
+\x21\xc1\x57\x25\x2a\x65\x43\x17\xa2\xb2\x69\x36\x9d\x08\x26\x46\
+\x9d\xba\xcc\xc7\x66\xb6\xfd\x35\x9d\xaf\x19\x9d\xfe\x41\x96\xa9\
+\xcb\xdc\xe6\x12\x27\x3e\x26\xc6\xa8\x9b\x41\x8d\x31\x6e\x22\x0e\
+\x79\x0c\xc5\xa2\xf2\xac\xa5\x42\x8b\xb4\xb6\x14\xfa\xbc\xf7\xee\
+\xb4\x35\x19\x6a\x61\xd1\x93\xfc\x72\xfb\x3b\xf7\xd7\xf3\xf9\xfd\
+\xce\xef\x7b\xce\x65\xf0\x0a\x56\x70\xd6\x7c\x38\x35\x46\xb4\x22\
+\x3a\x9c\x09\xf9\x9e\x21\x77\x97\x83\x47\xbb\x85\xfb\x94\x79\xc9\
+\xd8\xc8\x2f\xef\x9a\x39\x2f\x45\x72\xfd\x83\xe4\x28\x3c\xf1\xf0\
+\x43\xae\x0b\x0b\x63\xb0\xaf\xd6\x8a\x97\x06\xe4\x1d\x33\xce\x98\
+\x37\x41\x52\x59\x90\x28\x87\xd5\x13\xf4\x09\x8c\x00\x5e\xa0\x27\
+\x1f\xdc\xbd\x3f\xaa\x98\xc6\x99\x7b\xb6\x97\x07\xf8\x2d\xf7\xc8\
+\xc3\x4e\x6d\xb2\x74\xec\x68\xb9\x18\xfe\x33\x08\x14\x3c\x63\x54\
+\x38\xa2\x22\x58\xd8\xbd\x41\x88\x1f\x70\x4a\xf7\xe4\xd5\x00\x83\
+\x6d\xf2\x8f\x6d\x0d\x6b\x34\x8a\xac\x37\x13\xa2\xf0\xa8\x9f\x87\
+\xf7\x69\xc4\x00\xa0\xf1\x15\x52\x34\xd8\x34\x87\xda\xca\x56\xe7\
+\x28\x8a\xb5\x6a\x39\x0c\xfd\x1c\x38\x08\x70\x7a\x39\x44\x88\x58\
+\x88\x59\x06\xa7\x6e\x0f\x03\xc8\x39\x78\x7f\xd9\xe8\xd8\x08\x6d\
+\x92\x9c\x5d\x3d\x52\x26\x0e\xf8\xac\x0e\x2f\x2c\x6e\xa0\xc5\xe4\
+\xba\xe1\xf4\xf0\xe6\x35\xb3\x62\x16\x6a\xd5\x0a\xe8\xfb\x7d\x94\
+\x16\x06\xf5\x46\x3b\x05\x0e\x43\xba\x52\x06\x7a\xe0\xd4\x3f\xe6\
+\x17\x01\x93\x4a\x75\xdb\xc6\x8f\x95\x6c\x5d\xa5\x89\x85\x5a\x31\
+\x02\x76\x37\x8f\x01\x4e\x80\x97\x67\x02\xb9\x95\x8a\x68\x97\x6e\
+\x0e\xdd\x0e\x0f\x26\xa9\x64\xe8\xa0\x9d\x83\x14\x73\xd7\xd8\x87\
+\xa3\xd7\xcd\xb7\x8b\x73\x95\x59\x99\xaa\x48\x52\x11\x50\x5e\xfb\
+\x1c\x20\x6b\x6f\xe3\xf1\x39\x59\xd1\x45\xab\x35\x4a\x98\x9c\x3c\
+\xac\x14\x5c\x60\x02\xff\x0f\xaa\x85\x47\x60\xee\xb7\x70\x36\x20\
+\x16\x70\xe4\xd0\x75\xd9\x71\xba\xea\xf1\xb1\x5b\x9b\x32\x4a\x76\
+\x57\xf7\x08\x19\x71\xb2\x20\xa0\x6e\x10\x20\x73\x77\xc3\xc6\xfc\
+\x89\x8a\x6f\x57\x4d\x1f\x4d\xbb\xf2\xc1\xe3\x13\x20\x16\x31\xf0\
+\x72\x3c\xba\x6d\x6e\x0c\x50\x6e\x93\x62\x24\x88\x10\x8b\xe0\x23\
+\x9f\xf0\xb4\x04\x1c\x4e\x0f\x4a\x2b\x0c\x5d\x0d\x5f\x64\x8d\xf1\
+\xcf\xd7\x5f\x30\x08\x05\xe9\xb1\x60\x08\x70\xb2\xba\x3b\x08\x98\
+\xb8\xb3\x6e\xa4\x32\x4e\x62\xd9\xbb\x30\x11\x9d\x54\x81\x2e\x12\
+\x35\x4f\xda\xbe\xa6\xb3\xe0\xe6\x5d\x6b\xb3\xdb\x27\x1c\xf1\xab\
+\x9b\x65\x19\x4d\xfa\x38\x59\x61\x41\x76\x0c\xe4\x91\xe1\xe0\x29\
+\x75\xfe\x9c\x5f\x6a\xec\xc1\xf7\xef\x26\x04\x62\xcd\x2c\xbd\x63\
+\xd0\x4e\x1c\x15\xef\xaf\x8b\x8a\x6a\x53\x65\xc0\x39\x7e\x4b\xf5\
+\xf6\xcd\x8b\x5e\xff\x6a\xdc\x28\x29\x8c\x4e\x2e\x70\x41\x87\x2f\
+\x77\xe0\x61\xb7\xbb\xe8\xfe\xf6\xa9\x27\x07\xa7\x31\x6d\x5b\xad\
+\x5a\x3a\x82\xd1\xaf\x2b\x4c\x42\xa4\x24\x78\xf9\x3c\x9d\x6e\xdf\
+\xe9\xd6\xcd\x75\x5f\x4e\xde\x95\xb9\xb3\x9e\xe1\x38\x7e\x39\xb9\
+\x7b\x9b\xb6\x4d\x39\x1f\x00\x4c\xd9\x55\xd3\x7c\x70\x65\x7a\x4a\
+\x4b\x5f\x30\x78\x43\xbb\x0d\xe5\x57\x3a\xd7\x37\xef\xc9\x39\x10\
+\x4a\x61\x69\x5b\xaa\xd5\x51\x12\x56\x5f\x38\x37\x15\x1e\x2f\x0f\
+\x65\x24\x8b\xdf\xaf\xe9\xab\x2e\x7e\x9c\x39\xe3\xf9\xb5\x01\xc0\
+\x82\x1f\x1a\x85\xcf\xdf\x49\xc6\x39\xfd\x00\x7a\xa8\x52\xfe\x3c\
+\x73\x07\x6d\xa5\x79\xc3\xd6\x48\xea\x67\x7f\x9d\xd7\xe6\x27\x17\
+\x5a\x19\x11\xc2\x48\xf3\x7a\x9d\x09\xb7\x36\x65\x32\x21\x01\x39\
+\xdf\xd4\x0a\x39\xb9\x49\x78\x60\xf1\xc2\x65\x73\xc1\x50\xd3\x71\
+\xa3\xb9\x34\x6f\xe6\xb0\x80\x4d\xd7\xb6\x4c\x9b\x1e\xbf\xc3\x19\
+\x2d\xa7\x76\x21\xc0\xdc\x66\x41\xd5\xba\x09\x43\x00\xf6\xd4\x09\
+\xd3\x72\x13\x71\xdf\xe4\x86\xcf\xe5\x83\xa1\xaa\xa5\xb2\xf9\xbb\
+\xb7\x66\x0d\x07\x48\xd9\x70\x75\x73\x76\x4e\xfc\x4e\x71\xac\x02\
+\x56\xba\x37\x8b\xde\x8a\xea\x4f\xd2\x42\x03\x52\x36\x5e\x11\x66\
+\x2f\xca\xc6\x3d\xb3\x0b\x22\x31\x8b\x8e\xcb\x3a\xb4\xee\xcf\x1f\
+\x36\x45\x09\x6b\x2f\x3e\x28\x2e\xc9\x4e\xad\xe9\xa5\x16\x41\x15\
+\x68\xae\xef\x44\xe3\xf6\x69\xa1\x01\x09\x6b\x2a\xfe\x9e\xfd\x7e\
+\x96\xe6\x5e\xaf\x00\x92\x22\x6c\x1d\x8f\xe1\x68\xed\x2a\x6b\x3b\
+\x54\xb0\x2c\x54\xf0\xa4\xb5\x97\x96\x48\xa2\x25\x27\x8a\x8a\x32\
+\x70\xa1\xc9\x89\x70\xea\xa2\xc6\xab\x77\xd0\x7a\xe0\xed\xd0\x80\
+\xc4\x0f\x2f\x94\x24\xa6\xa9\x8e\x0e\x8c\x55\x82\xf7\xf9\x33\x2a\
+\xc0\x76\xb3\x05\xde\x7e\x67\x99\xfe\x97\xf9\xcf\x40\x12\x56\xfe\
+\xb1\x8e\xca\x74\xff\x82\x92\x49\xd0\x59\x39\x4a\x8f\x00\x4f\xb7\
+\x1d\x8e\xa6\xf6\x8a\xf6\x9f\xe6\xcf\x0d\x09\xf0\x5b\xfc\xf2\xb3\
+\x36\x75\x5e\xa6\xdc\xc6\xb2\x01\x27\x4f\x95\xaa\x78\x62\x83\xb1\
+\xd1\x00\x9f\x97\xaf\xa4\xba\x61\x04\x1f\x3f\x43\x95\xaa\x82\x76\
+\x0e\x15\x64\x9f\x00\x9d\xc9\x05\x96\x4a\xd6\x5e\xd5\x84\x30\x1f\
+\xa7\xe9\xf8\x79\xfe\xad\xa1\x01\x2b\xce\x4d\xa1\x9e\x53\x13\xfd\
+\x66\x36\x9c\x2e\x9e\xa2\x51\x35\xd3\xeb\x71\xca\x70\x48\xbd\x1e\
+\x48\xa9\xf7\xc4\xa9\xa2\xd0\x4b\x6d\xe4\x01\xdd\x95\xcd\xce\x83\
+\xa5\x86\xe4\x69\x68\x85\xcf\x6a\xdb\x6f\xfc\x75\xe1\x86\x50\xe9\
+\x7c\x26\x67\x63\x96\x9d\x59\x4a\x9f\xa7\x63\x6c\xf6\x1b\x60\xe4\
+\x52\x08\xfe\x9e\x23\x04\xbf\x58\x7e\x13\xe8\x07\xf5\xd4\x80\xee\
+\x19\x1a\x5c\x7d\x33\x84\x3e\xc7\xf1\x47\x65\xef\x15\x0f\x25\x86\
+\x17\x2e\x45\xb5\xb4\x7c\x2a\xc3\xf9\xae\xf0\x71\x71\x72\x46\xad\
+\x02\x64\x92\xff\x08\xfe\xe5\x1e\x17\x84\x47\x16\x50\x1f\xa1\x29\
+\xbf\xc3\x74\x62\xf1\xd6\xe1\xd4\x36\xa4\x14\x5f\x5b\x7c\x62\x11\
+\x9d\xe0\x23\xea\x1d\xb3\x11\x29\x0b\x3a\x5d\x6e\x30\x1e\x97\x9e\
+\x2e\xf9\x24\x8d\xaf\x7b\x7e\x5b\xd2\x87\xff\xb1\x7f\x01\x48\x4a\
+\x22\xd4\x3b\xbe\x76\x48\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x1f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xe6\x49\x44\x41\x54\x78\xda\xa5\x94\x5d\x6c\x14\x55\
+\x14\xc7\xff\x77\x66\x67\x77\x76\xdb\x2d\xed\x62\x3f\x76\xb7\xb4\
+\x1b\x1a\x41\x6a\x2c\xf5\x03\x6d\x48\xaa\x12\x5a\xb1\x50\xe4\x81\
+\x64\xb5\xd4\x6a\x48\x34\x44\x13\x12\x79\x92\x17\x9f\x7d\x94\x44\
+\x5f\xd4\x56\x85\x20\x61\x4d\x7c\xc0\x54\x21\x9b\xd6\x92\xd4\x68\
+\x94\xa0\x04\x22\x60\xa5\xd1\xad\xdb\xfd\x68\xb7\xdb\x8f\xd9\x99\
+\xd9\x9d\x4f\x4f\x97\x94\x54\x12\xdb\xee\x32\x99\x9b\x4c\xee\x9c\
+\xfb\xff\x9d\xf3\xbf\xf7\x5c\x86\x07\x78\x16\x21\xfa\x1d\x3b\x5a\
+\x3e\xe4\xda\xb6\x1d\x66\x7e\x1f\x20\x6b\xd0\xa2\xe3\xb7\xaa\x62\
+\x7f\xb7\xae\xc4\xb0\x72\xc5\x17\x20\xee\x14\x8f\x1d\xbe\xc6\xb7\
+\x06\x60\x8e\x7e\x0f\x3b\x9d\x86\x99\xd5\xa1\xc5\xd4\x66\x9f\xb6\
+\x34\xf5\xc0\x00\xf5\x40\xb7\xcd\x3f\xd9\x04\x63\xf8\x5b\x30\xd1\
+\x0d\x2b\xa3\xa1\x10\x93\x83\xbe\xc2\x42\x62\x75\x5c\x59\x80\x59\
+\x88\xef\x54\x7f\xfc\xde\x07\xfa\x67\x9f\x80\x31\x06\x73\xd1\x40\
+\xee\xce\xe2\x96\x06\x5d\x8a\xaf\x8e\x4b\x08\x95\x83\x65\x01\xe6\
+\x9a\xb6\x8e\x78\x07\x3a\xf7\x1a\x17\x47\xc0\x1c\x02\x41\xa8\xa2\
+\x29\x65\xaa\x26\x39\xd3\x7c\xcf\xc2\x67\x3a\x12\x7c\x5d\x8d\xbf\
+\xbc\x0a\x42\x2d\xd1\x4d\xfb\xdb\xba\xcd\x9f\x7e\x01\x38\x1e\xb0\
+\x6c\x70\xa4\xb4\x34\xad\x4e\xd7\xa6\x33\x8d\xd9\xa7\x76\xc5\xab\
+\x0e\x3d\x1b\x94\x3f\xfa\xbc\x3c\x8b\x26\xe1\x7e\xbf\xf1\xf8\xc1\
+\x93\xd6\xf8\x0f\x64\x32\x01\x4c\xbb\x38\x98\x6d\x43\xf5\x85\xe0\
+\xdd\xd7\x01\xfd\xd3\x33\x90\x72\x66\xe9\x80\xbf\x98\x2b\x5c\xdd\
+\xb5\x3b\xe2\xa9\xad\x84\x79\xf5\x0a\x6d\xb0\x03\xd0\x09\x40\x2f\
+\x0c\x0b\xcc\x29\xc2\x52\x55\xf0\x06\x10\xcf\xaa\xd7\x4b\x02\xfc\
+\x09\x57\xb8\xee\xd5\xde\x88\x8b\xfc\xc8\x9f\x19\x06\xef\x16\xc1\
+\x07\x3d\x24\xca\x8a\x10\xdb\xb4\x8a\x55\x70\x16\xc3\xbc\xa4\x61\
+\x4e\x31\x3a\x37\x0c\xb8\x0d\x31\x1c\xe8\x3f\x10\x21\x43\x90\x3b\
+\x37\x0c\xc1\xed\x06\x6f\x01\x82\xcf\x09\xce\xc3\xdf\xb5\x82\xaa\
+\xd0\x54\x13\xb3\x39\x1d\x92\xa6\xf7\xed\xcc\xe7\xce\x6f\x08\xf0\
+\x3b\x9c\xe1\xc6\xfe\xde\xc8\x72\x70\xe6\xcb\x61\x88\xcb\x99\xd3\
+\xd1\xf1\x54\x08\xd0\xdc\x1c\xe2\x29\xe5\x28\x25\xbe\x8f\x28\xf5\
+\x34\xbe\x69\x2f\xe4\x4e\xad\xac\x5d\x17\x70\x03\x42\xb8\xf9\xc8\
+\xc1\x88\x09\x13\xf1\x73\x97\x20\x8a\x22\x04\x66\xa3\x8a\xc4\x6d\
+\xca\x3c\x96\x54\x02\x4f\xe8\xb9\xe4\xff\xad\x5f\x13\xf0\x1b\x65\
+\xbe\xf5\x48\x6f\xc4\x30\x0d\x4c\x44\x2e\xa2\xc2\x75\x37\xf3\x87\
+\x2a\x9d\x10\x44\x0e\x93\x33\x4a\x70\x97\x96\x4b\xac\xa5\xc1\xee\
+\x13\x3c\x41\x87\xed\x69\xda\xaa\x5a\x0d\xb8\xf2\x68\xdf\x8b\x27\
+\x0b\x96\x85\x5f\x49\xbc\xca\x25\xc0\x41\xe1\x0d\x15\x4e\x78\x2b\
+\x05\xdc\x4a\xc9\xc1\xdd\x9a\xbc\xa6\xf8\x3d\xc0\x55\x38\xf7\xd6\
+\xb4\x34\x8f\xf8\x5f\x7b\x09\x2e\xd1\x84\x95\xcd\xd0\x7e\x39\x91\
+\x89\xcd\xe0\xf2\xf9\x4b\xa8\x11\x48\x9c\x32\x0f\x51\xe6\xd5\x22\
+\x89\xcf\x29\xfe\xce\x82\x9c\xda\xc8\xfe\xb1\x9f\x21\xec\x08\xf5\
+\x3c\x77\xb3\xae\xb7\x03\xf9\xd3\x67\xa9\xe7\xf3\xd4\x99\xf4\x83\
+\xba\x33\x95\x2d\xe0\x72\x5a\x46\x25\xcf\xa3\xd5\x2b\xa2\xde\x23\
+\xe0\x46\x46\x79\xe5\x79\x4d\x8e\x6c\x44\xbc\x08\xb8\xbd\xa5\xf9\
+\xfa\xf6\x77\x07\x1e\x53\x87\x86\xc0\x91\x09\xb6\xb5\xd2\x34\x36\
+\x04\x3a\xef\xb1\x59\x19\x4b\xaa\x81\x6a\xc1\x81\x3b\x4b\x85\x97\
+\xbb\x75\xe5\xab\x8d\x8a\x17\x01\xf1\xae\x3d\x76\xad\x47\x06\x9b\
+\x4e\x22\x9d\x54\x50\xbf\x3d\x00\x2b\x49\x16\x31\x0e\x8c\x20\xc5\
+\x7b\x86\x2a\x8a\xfe\x33\x3f\xd8\x6b\xe4\xdf\x2c\x45\xbc\x08\xc8\
+\xbe\xfd\xba\xbd\xe9\xc7\x28\x26\x13\xf9\xe9\x6d\x33\xf3\x8d\x93\
+\xed\xed\xf1\x26\x77\x21\x68\xa6\xb3\xcb\x4e\x51\x35\x0c\x4e\xfa\
+\x18\x4f\x49\xd7\xf6\x14\xe4\xc7\x4b\x07\x1c\x0d\xdb\x73\x17\x2e\
+\x26\x1f\xce\x4a\x81\x95\xc9\x89\xb6\xb6\x58\x88\x53\x9a\x8c\xac\
+\x54\xb4\xcb\x49\x63\x2c\x23\x8d\x76\xe7\x95\xae\x92\x01\x17\xe0\
+\x18\x3c\x04\xe3\x8d\xd5\x93\xa7\x81\x40\x4f\x5f\x78\xda\x3b\x36\
+\x5a\xbc\x8e\x79\xaa\x22\x92\x9e\x3f\x31\x60\x69\xa7\x4a\x06\xdc\
+\x3f\xf1\x05\xb8\x70\x57\x4f\x57\xa4\x61\xb3\x17\x7a\x74\x0c\x0e\
+\xde\x81\xc9\x9c\x8a\x47\x24\xa9\xac\xab\xfd\x3f\x8b\x86\xc0\xf7\
+\xf7\xec\x7f\xe1\xac\xdf\xe7\x81\xf6\xdd\x08\x78\xa7\x0b\xe9\xbc\
+\x86\xe1\x05\x29\x78\x0c\xe6\xba\x4d\xb5\x2e\x20\xba\xb9\x36\xd1\
+\x1a\x6a\xf4\xdb\x13\x7f\x40\x61\x0e\xa4\x34\xfd\xeb\x9b\x79\xfd\
+\xf8\x5b\x30\x92\xe5\x88\x2f\x3f\xff\x02\x2d\x19\x9a\x58\xcf\x4c\
+\x33\x6e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x3a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x01\x49\x44\x41\x54\x78\xda\x85\x56\x09\x4c\x53\x77\
+\x18\xff\xbd\xd7\xbb\x40\x2b\xf7\x50\x2a\x05\x3c\x90\x68\x38\xb4\
+\x12\xc5\x05\x15\x14\x75\x8b\xd3\x19\x91\x30\xc4\x39\x35\x1a\x75\
+\x23\x8b\x4b\x16\x67\xb2\x2c\x2e\x99\x3b\xd4\xe9\x22\xa8\xf3\x98\
+\x08\xa2\x38\x61\xc6\x18\x27\x82\x02\x43\x34\xae\xc8\xc0\x93\x43\
+\xb9\x2a\x57\xa1\x62\x5b\x7a\xb7\xef\xed\xdf\x87\xa2\x28\xe8\x97\
+\xbc\xa6\xfd\xf7\xff\x7d\xbf\xef\xfc\x7d\x8f\xc2\x5b\xc4\x77\xd9\
+\x91\x04\xc6\xc5\xa4\x92\x27\x99\x61\xd9\x50\x89\x87\x98\x3b\xb7\
+\x98\xac\xa0\x29\xaa\x85\xe6\xd1\xc5\xe4\x39\xa3\x3b\xbf\xa1\x62\
+\x34\x1b\xd4\x48\x87\x01\x2b\x8e\x45\xd9\xad\x0e\xb5\xdc\x7f\x8c\
+\x20\x6c\x72\x10\x14\x21\x3e\x90\xcb\xc4\x10\x8a\x44\xdc\xff\x76\
+\x9b\x0d\x7a\x83\x15\x9a\xb6\xa7\x68\x6e\xe8\x82\xbe\xf7\x99\x43\
+\x28\x16\xa8\xb4\x85\xeb\xea\xde\x09\x10\xb8\xe2\x68\x16\x45\xf3\
+\x36\xcf\x9e\x37\x0d\x21\x4a\x6f\x88\x3c\xc5\xa0\xc9\x35\x12\x01\
+\xc0\xbe\xd4\x22\x11\x80\x21\x07\xb6\x01\x2b\xda\x5a\xfb\x71\xa3\
+\xec\x2e\x58\xc6\x95\xdd\x53\xb8\x7e\xcb\xa8\x00\x81\x1f\x9f\x28\
+\x90\x07\xca\x53\x16\x2c\x8c\x84\x8f\xbf\x17\x31\x48\x71\x46\xdd\
+\x97\xa8\xd7\x5c\x19\xc2\x73\x5f\xa1\x58\xf4\xf7\x1a\x51\x72\xe5\
+\x01\xf4\x3d\xfa\xb3\x3d\x45\x9f\xae\x7a\x03\x60\x5c\x5a\x5e\x96\
+\xcc\xd7\x63\xf3\xf2\x8f\x62\x21\x91\x48\xe1\x72\x31\xc4\x6b\x06\
+\x4f\x1d\x2e\xf4\x0f\x38\x61\x72\xba\x7f\x0f\xde\xa5\x89\x96\x87\
+\x80\x86\xaf\x07\x1f\x63\x04\x3c\x08\xc9\x01\xa9\x05\x4c\x26\x0b\
+\x8a\x2e\xd4\xc0\xa0\x33\x65\x77\xe4\xa7\x6f\x19\x02\x50\xae\x39\
+\x13\xe5\x64\x98\xda\xf4\xb4\x38\xd0\x22\x4f\xf4\x59\x48\xf0\xc4\
+\x45\x11\x9f\x86\x91\xe4\xdb\xe6\x1a\x1e\x05\xfb\x1c\xc8\x9d\x22\
+\xe2\x07\xc6\xca\x05\x10\xd1\x7c\x48\x85\x3c\x92\x32\x3d\xf2\xf2\
+\x6f\x81\x4f\xd3\xd1\xad\x39\xa9\x75\xd4\xa0\xf7\xf9\xf6\x85\xc9\
+\x91\x02\x55\xf4\x78\xdc\x7f\x62\xc2\x81\x25\xc1\x9c\x81\x9b\x6d\
+\x06\x1c\xbe\xa3\x27\x97\x47\xec\x05\x2e\x22\x1e\x41\x7d\x4f\x2c\
+\x40\x62\xb8\x04\x17\x9b\x06\x10\x1e\x28\x86\xba\xb6\x1d\x57\x8a\
+\x1f\x38\x3a\xf2\xd3\x84\x54\xf8\xba\xa2\x04\x91\x94\x5f\xfe\xc5\
+\x9a\x78\xb4\xe8\x1d\xe8\xd0\x59\x90\xbb\x52\xc9\x19\xb8\xda\xf4\
+\x14\xf9\x0d\x66\x88\x49\x24\x43\x39\x75\x17\x97\x61\xe0\x22\x29\
+\x93\x90\xef\xcb\xa6\x78\x61\x6e\xb8\x1c\xba\x01\x07\xbe\x2e\xed\
+\x86\x9f\x4c\x80\x50\xb9\x10\xbf\xe5\x54\xc1\x66\x76\xce\xa5\x42\
+\xd7\x15\x1d\x9c\x15\xa7\xdc\x14\x1b\x35\x1e\xed\x06\x3b\xfa\xfb\
+\x2c\x38\x99\x1a\x36\x08\xd0\xa8\x43\x61\x93\x05\x52\x09\x9f\xcb\
+\x91\x3b\x0e\xab\xc9\x09\xbd\xc9\x8e\xc5\x13\x64\x58\x19\xed\x0b\
+\x3e\x6f\x30\xba\xee\x67\x36\xec\xb8\xda\x09\x0f\xb9\x18\x21\x32\
+\x21\x6a\xea\xda\x71\xf3\x56\xeb\x21\x4a\xb9\xe1\xaf\xe6\x35\xab\
+\xa6\x87\x9a\x21\xe4\x8a\xd7\xd1\x69\x40\x6e\xfa\xc4\x41\x80\x87\
+\x3a\xe4\x36\x9a\xc0\x50\x02\xf4\x1b\x2c\xe8\xea\xd6\x43\x15\xe2\
+\x89\x6f\x93\x15\x08\x92\x89\x87\xa5\xab\x4b\x6f\xc5\x37\x97\x3b\
+\x10\xe8\xef\xc9\xa5\x4e\x0a\x3b\x72\x0a\x6e\xb7\x50\xe3\xd7\x17\
+\xb1\xeb\xd6\xbe\x0f\xbb\x9d\x01\x4d\x10\x9a\x5b\x7b\x91\x97\x11\
+\xc9\x29\xfd\x7e\xfd\x09\x8e\xd5\x19\x61\x35\xdb\x20\x72\xda\xf1\
+\xcb\xf2\x09\x48\x88\xf0\x19\xb1\x1e\x9d\x7a\x0b\x76\x5c\xd2\x20\
+\x78\x9c\x37\x99\x07\x16\x42\x21\x8d\x63\x7f\x54\x82\x8a\xdc\x76\
+\x99\x5d\x9d\x32\x13\x56\x9b\x13\x42\xd2\x7a\x15\xea\x36\x14\x7f\
+\x1e\xcb\x29\x1d\xae\xd4\x60\xe7\xb9\x06\xfc\x9c\x16\x89\x4f\xe2\
+\xc6\xbe\x8d\x55\xf0\xa8\xc7\x88\xcc\xc2\xc7\x88\x8f\x55\xc0\xee\
+\x60\x20\x16\xf1\x91\x7b\xf6\x5f\x50\x51\xdb\xcb\xd9\xd5\x2b\x62\
+\xe0\x22\xfd\xde\x62\x64\x70\xb1\xb8\x0e\x9a\xdd\xf3\x39\xa5\x43\
+\x15\x6d\xd8\x7b\xa1\x09\x39\x1b\x63\x30\x6b\x92\xef\x5b\x01\x1a\
+\xba\x0d\x58\xb2\xef\x0e\x16\x26\x4e\x41\xa8\x17\x0d\x1e\x99\x8f\
+\x9c\x82\x6a\x50\x93\xbe\x2a\x63\xbf\xcc\x50\xe1\x9e\xd6\x0c\xa3\
+\x9d\x42\x79\x71\x2d\xda\xf6\x25\x71\x4a\x07\x4a\x1e\xe1\xcf\x46\
+\x2b\xba\x9a\x7b\xc8\x50\x01\xa7\xb6\xaa\x10\x16\x20\x1b\x19\xa0\
+\xcb\x80\x0f\xf6\xa8\x11\x9f\x18\x05\x2f\x21\x8b\xa9\x01\x52\xfc\
+\x7a\x52\x0d\x6a\xea\xf6\x7f\x9a\x93\x92\x22\x42\x49\x8d\x20\x12\
+\xf2\x71\xb1\xe8\x16\x34\xd9\x8b\x38\xa5\xfd\x97\x1b\x50\xa2\x15\
+\x60\xbc\xc2\x97\x10\x9b\x16\x37\x09\xdf\x24\xc6\x04\x21\x7f\xeb\
+\x4c\xf0\xf8\xbc\x61\x00\xf5\x1d\x7a\x2c\xfe\xe9\x16\x16\x2d\x55\
+\xc1\x66\x77\x82\x34\x13\x4a\x4b\xeb\x5b\xa8\x98\xef\x6e\x1c\x0c\
+\x8f\x18\xbb\x29\x20\xc0\x8b\x53\x2a\xca\xab\xc2\x93\xc3\x4b\x38\
+\xa5\xbd\x17\xee\xa3\xdc\x20\x81\x22\x78\x0c\x69\x51\x8a\xd0\x07\
+\x8b\x7b\xb5\x2d\xa8\xbe\xfe\x10\x3f\x6e\x98\x81\xcc\x25\x11\x43\
+\x00\x0f\x9f\x10\x80\x5d\x37\xb0\x34\x75\x36\x99\x11\x17\xb4\x5a\
+\x23\x1e\xd7\x77\x1e\xa2\x54\x3f\xa8\x13\xa4\x9e\xa2\xf2\xd8\xd8\
+\x10\x50\x34\x8d\x53\xc7\xaf\xa1\xfb\xc8\x52\x4e\x69\xf7\xf9\x3b\
+\xa8\x34\x7b\x42\x19\xec\x43\x86\x8b\xe5\x86\x8c\x26\x43\x67\x31\
+\x3b\x50\x75\xf5\x0e\xf4\x9d\x5a\x1c\xcc\x8c\xc7\x87\xd3\x83\xf1\
+\xb8\xcb\x88\x79\x3b\xcb\xb0\x32\x63\x3e\xe9\x22\x06\x35\x35\x6d\
+\x30\x0f\xd8\xe6\x72\x53\xa2\xda\x55\x6d\x8f\x89\x55\x08\xfc\xfd\
+\xbc\x70\x34\xab\x18\xdd\xc7\x96\x71\x00\x59\x97\x1e\xa0\x4c\x2f\
+\x45\x98\xd2\x87\xf3\xfe\xd5\x69\x16\x90\x74\xb6\xb7\xeb\xf0\xf7\
+\xb9\x2a\x4c\x53\xca\x91\x91\x1c\x8e\xef\x4f\xd7\x23\x7d\xe3\x02\
+\xf4\xf6\x19\xf1\x5f\x8d\xc6\xa1\xde\x3e\x43\xc8\x01\xcc\xda\x53\
+\x1b\x45\x0b\x79\xb5\x49\x73\x26\xe2\xf4\x89\x52\x34\xd6\x3c\x26\
+\x94\x49\x83\x26\x9e\xac\xdd\x9e\x82\x00\x52\x61\x86\x61\x87\xe5\
+\xdc\x4d\x7c\x34\xb9\x23\x14\x09\xa0\xbe\xdd\x8c\x92\xfc\x6b\x50\
+\x4c\x0e\x41\xfa\x86\x05\x28\xad\x6c\x02\x63\x77\x45\xdf\xdc\x16\
+\x5d\x37\xc4\x62\xf1\xfb\xef\x66\x79\xfb\x4a\x37\xcf\x98\x1a\x84\
+\x96\x36\x1d\x67\x40\x2c\xe6\x23\xd0\x4f\xc6\xe5\x74\xb8\x79\x0c\
+\x8b\x86\x47\xa8\xda\x1d\x91\x9b\x36\x2a\x6f\x6b\xf0\x4c\x67\xce\
+\xae\xca\x9c\xf6\x92\xae\x5f\xc8\x9c\x03\x0f\x0a\x7c\x7c\xa4\x29\
+\x71\x53\x03\xb8\x0d\xe6\x22\x5e\x0f\xdb\x64\xa3\x88\x7b\xbb\xb9\
+\x59\xa0\xfa\x7e\x2f\x9e\xf6\x9b\xcf\x5e\xdf\x1a\xf9\xe6\xc2\x79\
+\x21\x09\x87\x1b\xb3\x78\x02\x7a\x73\x6c\x84\x1f\x7c\xbd\x44\xcf\
+\x41\xc0\xed\x87\xd7\x3d\x77\x73\x17\x8f\x7c\xe8\x8c\x36\xd4\xd4\
+\xf7\x91\x61\x65\xb2\x2b\x36\x4e\x1a\x7d\x65\xbe\x90\x79\xc7\x9b\
+\xa3\x88\x61\xb5\xb7\x4c\x24\x50\x04\x48\xe0\x47\xe8\x57\x42\x68\
+\x84\x6c\x98\xe7\x2e\x93\x37\x0b\x42\x07\x7d\x7a\x3b\x34\x5a\x0b\
+\x21\x42\x9b\x83\x00\xa9\xca\x3e\x0b\x7b\xf7\xd2\x7f\x55\x16\x9c\
+\x6c\x4d\x60\x18\x2a\x95\xa1\x90\x4c\x08\x2c\x54\x44\x6a\xe2\x16\
+\x9b\xd5\x49\x5a\x9a\xbc\xb6\xb0\x28\xa6\x69\xf6\x4c\x49\x86\x72\
+\xd4\xd7\x96\xff\x01\x53\xc3\x88\xd6\xa5\x04\x58\xc2\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xb2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x79\x49\x44\x41\x54\x78\xda\x9d\x56\x69\x6c\x54\x55\
+\x14\xfe\xee\x7b\x33\xd3\x99\xa1\x2b\x1d\xdb\xce\x74\x00\xa7\x0d\
+\x65\x53\x68\x07\x4a\x85\x02\xd2\x12\x36\x71\x8f\x52\x13\x21\xc4\
+\x05\x1a\x28\x2e\x91\x35\x46\xfa\x03\xc4\x40\x0d\x71\x6b\x81\x8a\
+\x21\x31\x42\x02\x8d\x31\x45\x44\x08\x88\x45\x2b\x68\xc1\x2e\x56\
+\x11\xa9\x94\x42\x77\xda\xce\x40\xdb\xd9\xdf\xe6\x79\x6f\x0a\x2e\
+\x50\xac\x9e\xcc\xcb\x7d\xf7\xdc\xfb\xee\x39\xe7\x3b\xdf\x39\x77\
+\x18\xee\x26\xe9\x1f\xe4\x42\x94\x17\x43\x92\xe7\x41\x56\x1c\x88\
+\x8c\x0c\xeb\x3d\x1e\x80\x63\x4d\xe0\xb9\xe3\xd0\x71\x65\xa8\x7b\
+\xe9\xeb\xc1\x8e\x60\x77\xd4\x3a\x77\x65\x20\x10\x3c\xcd\x59\x93\
+\x4d\xc9\x99\xa9\x18\x39\xd1\x82\x44\x8b\x19\xa6\x28\x5e\x5b\xf6\
+\xf7\x4b\xb8\xd6\xe3\x43\x73\x7d\x0f\xda\xce\x35\x42\xee\x68\xf3\
+\xc3\x18\x91\x8d\x9a\x95\xb5\xff\x6e\x20\x63\x67\x31\x74\x11\x05\
+\x13\x97\xce\xc4\x84\xf4\x78\x44\x46\xeb\xc0\x2b\xe1\x25\x97\x3b\
+\x08\x8e\xe3\x10\x17\xab\xd7\xe6\x12\x7d\xed\xe9\x13\x71\xbe\xce\
+\x85\xfa\x4f\x2a\x01\x31\x58\x82\xda\x55\xab\x07\x37\x30\x65\xcf\
+\x01\x63\x72\x72\xde\x82\x7c\x27\xec\x76\x33\xa1\x00\x28\x0a\xb4\
+\xb1\xdb\x2d\xc0\x75\xb5\x0f\x42\x40\x42\xfc\xa8\x68\x24\x27\x1b\
+\x09\x39\x3a\x80\xd6\x64\xda\xd3\xda\xea\xc3\xb1\xd2\x1a\x04\xda\
+\xda\x0e\xe2\xc7\xe5\xcf\xdc\x66\x80\x4d\xdb\x5f\x6c\x4c\x1a\x5e\
+\xb0\x64\x7d\x16\x2c\x31\x3a\x28\xa2\x02\x3f\xb9\xd8\xee\x93\xe0\
+\xea\x93\xc1\xf7\x78\x71\x7c\x49\xb2\xb6\x77\xdc\xd6\x5f\x91\xe8\
+\xb4\x22\x29\x4e\x07\xab\x91\x83\x91\x42\x64\x3a\x86\x9e\x5e\x11\
+\xfb\x8a\xaa\x10\xe8\x74\x97\x28\xdf\x3f\xbb\xfa\x96\x01\x5d\xce\
+\xc1\x0c\x51\xe6\x6a\x96\x6d\xc9\xc1\xe8\x04\x23\xbc\x82\x84\xdf\
+\xdc\x32\x5a\xbd\x12\x0c\xe4\x9d\xd2\x1d\xc0\xa7\x4f\xc4\xc3\x1a\
+\x6d\xd4\x0c\xb4\xf7\xfa\x30\xe7\xdd\x4b\x88\x49\xb7\x02\x11\x3c\
+\x6c\x66\x0e\x63\x87\x73\x18\xa6\xe7\xf1\x7b\x57\x00\x1f\x6f\xaa\
+\xa0\xdc\xcb\x4e\xb1\x22\xaf\x36\x1c\xc1\xf4\x32\xdf\xec\x15\x59\
+\xa6\xc7\x67\x27\xa0\xd1\x1d\xc2\x45\x97\x48\x4a\x8e\x7e\x32\x82\
+\x2e\x01\x7b\x73\xa3\x90\x12\x6f\xfe\x1b\x9a\x87\x2e\xb8\xf1\xc6\
+\x67\x9d\xb0\x4d\xb3\x11\x46\xaa\x46\xc6\x98\x78\x1d\x52\x87\x1b\
+\x50\x7e\xaa\x0b\xa7\x3e\xac\xf2\xe3\xcc\x62\x33\x8b\x98\x7b\x28\
+\x97\xc5\x99\x4f\x16\x6d\x9b\x8e\x5f\x7a\x44\x74\x7a\x09\x0e\x3a\
+\x9b\x91\xe7\xfe\x3e\x01\x2f\x4e\x88\xc0\x93\x29\xd1\x77\x24\xdb\
+\x9e\xb3\x9d\xd8\xf9\x8d\x1b\xa3\x67\x8c\x80\x14\x92\x40\xa8\x22\
+\x69\x18\x87\xfb\x2c\x3a\xac\xdf\x78\x06\xca\x75\xdf\x1c\xa6\x5f\
+\x78\x64\xb7\xf3\xb1\xb4\xfc\x47\x73\x6c\xa8\xeb\x12\xc2\x87\x53\
+\x5c\x5e\xa2\xe2\x83\x89\x0c\xaf\x4d\x8a\xbb\x6b\xa9\x3c\xb5\xf7\
+\x22\x5a\xfc\x0c\x63\xa6\x5a\x21\x8a\x32\x44\x89\xca\x27\x41\x8f\
+\xcf\x2b\xda\x51\x73\xa8\xa1\x94\xf1\xf3\x8e\x5e\x5e\xb9\xf9\x01\
+\x87\x87\xe3\x89\x8e\x8a\x76\xb8\x27\xa0\x20\xc5\xac\x60\xeb\xe4\
+\x58\x0c\x45\xa6\x15\xd5\x21\xca\x6e\x41\xca\xd8\x58\xcd\x88\x44\
+\x87\x44\xca\x12\x76\x15\xfe\xd0\xc4\xb8\xf9\x47\x95\x97\x77\xcc\
+\x22\xfa\xc9\x5a\xc6\xfd\x64\xc4\x4f\x54\xdc\x3f\x3d\x26\xcc\xcf\
+\x21\x89\x04\xc7\xda\x2a\x4c\x99\x9b\x06\x5b\xa2\x19\x12\xf1\x57\
+\x4f\xec\x7a\x7f\xcd\xb7\x60\xe6\xa5\x95\xca\xab\x85\x99\x08\xfa\
+\x45\x0d\x9b\xea\x36\x01\x15\xf3\xa3\x07\x2d\xf2\xc1\xc4\x2d\x09\
+\xb0\x3d\x7d\x02\xf9\x85\xb3\x60\x20\x9c\x0d\x26\x1e\xef\x6d\x3e\
+\x07\x16\x95\x5f\xad\xac\x5b\x3b\x1e\x72\x50\xc6\xe9\x6e\x09\xe7\
+\x1b\x83\xe8\xef\x17\x21\xf8\x42\x10\x3c\x12\xa4\x60\x08\xf0\x05\
+\x29\x29\x01\x50\xfb\x08\x3f\x41\x75\x4e\x8f\x30\xf0\x2e\xaa\x0f\
+\x51\x29\xd0\x8f\xac\x77\x5e\xc0\xc2\xb1\x26\x70\x3a\x1e\xdb\xb7\
+\xd7\x83\xe9\x97\x9d\x55\xde\xde\x32\x09\xdf\xb5\x86\xd0\xe3\x55\
+\x10\x10\xd5\xca\x54\xa0\x50\x79\x32\x1a\x29\x67\x50\xc2\x28\x68\
+\x74\x54\xab\x96\x91\x46\x96\xc2\x9e\xab\x73\xdc\x7c\x27\x68\xac\
+\x8e\x61\x88\xe5\x24\xcc\xb0\xeb\xb1\xae\xf0\x27\xb0\xc8\x15\xd5\
+\x97\x17\x3d\x9f\xe6\xe8\x0d\x72\xe8\xf2\x8a\xe0\x04\x19\x8e\x48\
+\x99\x9c\x96\xb5\xa8\x42\x41\xa2\x9f\xa8\x46\x22\x90\xc3\xc4\x92\
+\xa0\x08\x49\x10\x21\x06\xc2\x7a\xd9\x1f\x44\x48\xed\x19\xa2\x72\
+\x0b\xae\xf1\x79\x4e\x44\xf1\x12\x8e\xec\x6d\x68\x62\x71\xaf\xfc\
+\xbc\xdb\x31\xdb\x96\xef\xb0\x1b\xd1\xd0\x25\xa2\xc8\x69\xc0\x82\
+\x24\xe3\x7f\xc2\xff\xa6\x6c\xab\x68\x41\x69\x79\x33\xa6\x3e\x37\
+\x05\x97\xae\x78\xd1\x74\xaa\xbd\x94\x59\x36\x5c\xc8\x35\xde\x63\
+\x3e\x99\x3b\x3f\x01\xf5\xcd\x21\xbc\x99\x6e\xc0\x22\xdb\xff\x33\
+\xb0\xf5\xab\x66\x7c\x74\xb8\x05\x39\xab\x32\x71\xe2\x8b\x4e\x04\
+\xba\xa9\xd0\xd4\x85\xf8\xd7\x1b\x7c\xd9\x8f\x58\x4d\xee\x20\xc3\
+\xc6\xd1\x3c\x84\x90\x08\x6a\x43\x90\x29\x6c\x85\xc2\x97\x64\x15\
+\x73\x09\x82\x3a\x0a\x8a\x46\x43\xb5\x19\x0a\xa4\x13\xd5\x75\xb5\
+\xe3\x22\x9c\xaf\x2f\x3d\x91\x48\xa0\x4e\x5b\x59\xde\xe6\x77\xbd\
+\x95\x66\xd6\x0c\x24\x6e\x69\xcc\x60\x46\x5d\xcd\xc2\x87\x12\xe1\
+\xf2\xa8\x1f\xd1\xc7\x6a\x42\x69\x54\xd4\x7e\x2d\xab\x49\xa7\x41\
+\x1e\x48\xbe\x06\xb9\xa2\xb5\x72\x46\x73\xf5\x9d\xc9\x4c\xed\x5e\
+\xc8\xbc\x3f\x0a\x65\xe5\x1d\x94\x1b\xd1\x79\x6d\x53\x6a\xed\x2d\
+\xb2\x5b\xb7\x5f\x2d\x8e\xb5\x9b\x0a\x1e\xce\x8e\x43\x20\xa4\x0c\
+\x50\x67\x40\xee\x50\x12\xff\x54\x31\x3a\x3d\xc2\xc0\xe1\x70\xa5\
+\x1b\x37\x5a\xfd\x25\x1d\x1b\x46\xad\xbe\x6d\x9f\x6d\x47\xcb\x81\
+\xb8\x91\xa6\xbc\x05\x93\x63\x34\x4f\x25\x45\xc1\x50\x84\xa7\x02\
+\x65\x54\xf5\xc7\xaa\x7b\x71\xbd\xd9\x7f\xb0\x7d\xcd\x88\xdb\x2f\
+\x9c\x9b\x62\xdf\xd9\x51\xac\x33\xf1\x05\x33\xb3\xa2\x30\x32\xda\
+\x40\x54\x54\x06\xba\x31\x41\x32\xb0\x5b\xed\xb4\x6a\x1b\x51\x21\
+\xd1\xd1\x45\xd3\xdc\x17\x42\x65\x55\x3f\x44\xbf\x54\xd2\xba\xca\
+\x7a\x97\x2b\x73\x40\x46\xed\xe9\xca\x20\xf8\x4f\xc7\x5a\xf4\xa6\
+\x71\xf7\x1a\x60\x8f\xd1\x23\x9a\x7a\x8b\x22\xff\x09\x47\x1f\xf5\
+\xae\xd6\x5e\x01\x17\xae\x84\x70\xa3\x47\xf0\xf3\x0c\xd9\x57\x97\
+\x27\x0c\xe1\xd2\xff\x8b\xa4\xee\x73\xe5\x4a\x92\xb2\x98\x3c\x9f\
+\x27\x53\xfd\x19\xcd\xe1\x7f\x15\x01\xba\x46\xe9\xee\x6f\xa2\x48\
+\x8e\xf3\x3c\x2b\x6b\x5c\x12\x3f\xe8\xdf\x96\x3f\x00\xcf\xd1\x8f\
+\x29\x3c\x2d\xe2\xcd\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\x22\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xe9\x49\x44\x41\x54\x78\xda\xb5\x55\x5d\x68\x5c\x45\
+\x18\x3d\xf7\xde\x6c\xd2\x8d\x77\x93\x6c\x4c\xab\xa9\x04\x4a\x15\
+\x41\x2d\x82\xf8\x20\x16\x8b\x58\xb0\x22\xfa\xa0\x08\x3e\x08\xa2\
+\xf8\x60\xc5\x8a\x05\x25\x50\x5b\x2c\x82\x86\x2a\x88\x51\x41\xfb\
+\xe6\x83\xd4\x3e\x89\x15\x2b\x22\x88\x56\x0a\x7d\x10\xf1\xa9\x8d\
+\x25\xb6\xa1\x69\x13\xb3\x6c\xb3\xd9\xdd\xbb\x7b\x77\xef\xcf\xec\
+\xcc\xe7\x99\xbb\x8b\xd4\x5f\x22\x5d\x77\x59\x66\xe6\xee\xdc\x73\
+\xce\x77\xbe\xef\x9b\x71\xf0\x1f\x3e\xfe\x1b\x75\x81\x23\x08\x0f\
+\x14\x9d\xf5\xbe\xb3\xee\x8d\xfe\x4c\x20\xe2\xa6\x18\x50\x06\xc1\
+\xc1\xeb\xfa\x4b\xe0\xbf\x5c\x93\x41\x5f\x61\xe7\x8e\x21\xcc\x2d\
+\x68\x9c\xdd\x3d\xde\x3f\x02\xff\x95\x40\x5a\xcd\x36\x66\x5f\x1a\
+\x47\x61\xc8\xc3\xfe\xa3\x75\x94\xa7\x27\xfa\x43\xe0\xef\xaf\x4b\
+\x98\xc6\x38\xfc\x7c\x11\x8f\xdd\x30\x88\xd9\x9f\x39\xff\x2a\x44\
+\xfd\xc0\xc6\xab\x27\xf0\xf7\x05\x12\x39\x31\x3e\xd8\x5d\xc4\x13\
+\xd7\xe7\xb0\xa6\x04\x87\xe6\x62\x1c\xfd\xb4\x89\xf0\xed\xab\xcc\
+\x81\x7f\x30\x90\x58\x12\x7c\xf4\xec\x18\x1e\x9e\xc8\x61\x39\xd4\
+\x58\x4a\x81\xaf\x57\x14\x8e\xff\x14\x21\x28\x0b\x3c\xdf\x81\x90\
+\x54\x1b\x16\x56\x2a\x30\x9c\x23\xe1\xd8\x31\x10\x4e\x87\x87\x80\
+\xf6\x72\xf2\x57\x02\xff\xb5\xa6\xc8\x50\x8c\x4f\x9e\x19\xc3\xbd\
+\xa3\x03\x98\x0f\x34\xbe\xa9\x68\x04\x04\xf0\xc4\xc1\x14\x81\x3d\
+\x4f\x10\x10\xac\xad\x09\xc2\xaa\x8a\x38\x86\x04\x8e\x62\x40\x75\
+\x04\x1d\xc2\x9e\x2f\x6b\xfc\xf2\xf1\xc2\x1f\x09\xfc\xd7\x43\x71\
+\xf2\x49\x74\xec\xa9\xb1\xfc\x9d\xbe\x8b\xf9\x86\xc6\x77\x15\x83\
+\x26\xc1\x63\xfb\x22\xd5\x3e\x30\xe9\x61\x6b\xde\x43\x55\xeb\x0c\
+\xcc\x82\xb7\x35\xc9\x38\x6f\x74\x80\x8e\x63\x70\xba\x6a\xf0\xed\
+\x79\xc1\xd2\x91\x2b\x08\xfc\x43\xa1\x0c\xe6\x13\x39\xf6\xe4\x98\
+\x73\xfb\xb0\x8b\xb3\x04\x3f\xb9\x66\x10\x33\x7c\xdb\x5c\x2d\x02\
+\x05\x89\xc1\x80\xe1\x66\x17\x24\xd5\x24\x75\xd0\x62\x04\x29\x05\
+\x24\x04\xb7\x73\x4d\x2b\x6b\x6d\xae\x53\x17\x95\xe3\x17\xba\x04\
+\xfe\x3b\x6d\x29\x16\x12\x7c\xf6\xf8\x28\xb6\xe4\x1c\xcc\x37\x35\
+\x4e\x51\x85\xa2\x62\xe2\xf0\x65\x2a\x24\x48\x48\xa5\x11\x09\x43\
+\xda\xd3\xe2\xda\x64\x6b\x20\xe5\xb3\xc4\x18\x24\xd6\xa2\xd4\x80\
+\xdb\xb3\x3c\x94\x3f\xbf\x04\xc7\x7f\xbf\x29\xb7\x6e\x36\x38\xf2\
+\xe0\x08\x46\xa8\x6e\x9e\x09\xfd\x91\x27\x82\x86\xc9\xc0\x63\x0b\
+\xa2\xba\x80\x31\x55\xc6\xf4\x3a\x51\xf4\x5c\x59\x01\x04\x8f\x25\
+\x8b\x20\xea\x58\xd5\x92\xad\x15\x75\x2b\x46\x5b\xfd\x82\x16\xf9\
+\xb3\x4d\x79\xe8\x6e\x17\x6f\x6e\x1b\xe6\x06\x83\x13\xb4\xa5\x41\
+\x50\x58\x5f\x75\x17\x34\x23\xb0\xf3\x5e\x2e\xac\xf7\x36\x1a\x15\
+\xdb\x67\x24\xb1\x36\x59\x31\x11\x49\xb9\xb6\xc4\x2a\x66\x61\x7c\
+\x79\xae\x67\xd1\x5b\x4d\xb9\xe3\x36\x83\x99\xbb\x0a\xb8\x48\xb3\
+\x2f\x85\x06\x74\x07\xad\x2c\x89\x54\xa6\xac\x45\x24\xd2\x26\x9b\
+\xc7\xbd\x68\xac\x35\x76\x9e\xf6\x7e\x09\xad\x53\x36\xb2\x8e\x8b\
+\xb8\x91\xa2\xf5\xfd\x95\x49\x66\xed\xdf\x74\x8b\xc1\xf4\x3d\x05\
+\x54\x23\x41\x89\x79\x48\xd0\x05\xce\x40\xad\x55\x64\x8d\x13\x07\
+\x29\x9f\x47\xb4\x20\x4d\x91\xfd\xaf\x53\x9b\x68\x0a\xe0\x28\x96\
+\x54\x5c\xa4\xab\x2d\x44\x27\x17\xff\x54\xa6\xaf\xd6\x64\xcb\x8d\
+\x82\x3d\x3b\x7c\x54\x22\x60\x85\x24\x5a\x7a\x36\x59\x7f\xa9\xae\
+\x6d\xba\x5e\xb7\x13\x96\xa4\xad\x7d\xd5\x4d\xac\x25\xcb\x46\xdb\
+\x7c\x24\x88\x57\x03\xa4\xa7\x4a\x7f\xd3\x68\xfb\x6a\xb2\x69\x4a\
+\xe3\xe9\x9d\x05\x26\x16\xf8\xb5\xce\x74\xbb\x0e\x6a\xd5\x04\xb5\
+\x8b\x65\x88\x76\xd0\x61\xa3\xa5\xf6\x6b\x72\x50\x61\x8e\x89\x4d\
+\xb2\x5c\x98\x8e\xce\x0a\xc0\xd8\x68\x3c\xb6\xf2\x99\xcb\xff\x70\
+\x54\x4c\xaf\xc9\xe8\xb5\x0a\x8f\xee\x1a\xa1\x4c\x0f\x2b\xa1\x55\
+\xa8\xb0\x3c\x57\x46\x69\x21\x36\xf9\x8d\xe3\x2e\x12\x17\x9a\xf2\
+\x4d\x4e\x71\x4b\x8e\x25\xcb\xad\x36\xd3\xec\x0d\x65\x41\x5a\xac\
+\xd9\xf2\xbf\x1d\x76\x7b\x2b\x72\xcd\x44\x8a\x5d\xf7\x8d\xc2\xf1\
+\xd8\xb9\x4d\x85\xc5\xd3\x0d\x2c\x2e\xb5\x10\xbe\x7b\x73\x9f\x8e\
+\xeb\xbd\xab\x92\xdb\xa0\xb0\xfd\xfe\x11\x14\xfc\x01\x9c\xf9\xa1\
+\x86\xa5\x45\x1e\x76\xb3\x5b\xfb\x78\xe1\xbc\xc8\xa3\x93\x7e\x6f\
+\x7f\xa4\x88\x7a\x25\xc1\xb9\x13\x6d\xd4\x0e\x4f\xf5\xf9\xca\x7c\
+\xae\xc4\x48\x0c\x26\xb7\xf1\x5e\xb8\xa0\x51\x9e\x99\xfc\x1f\x2e\
+\xfd\x3d\x97\x25\xae\x06\xf0\x37\x6d\x40\xfd\xbd\x3e\x47\xf0\x3b\
+\xc9\x0b\x25\xb1\x2d\x1e\x7e\xb8\x79\xdd\xef\xfd\x06\x99\x90\xb8\
+\x0a\xe8\x50\x3c\xcb\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x03\xeb\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xb2\x49\x44\x41\x54\x78\xda\xad\xd4\x7b\x4c\x53\x57\
+\x1c\x07\xf0\xef\x69\xcb\x2d\x48\x71\x65\xa0\x6e\x1d\x0a\x9a\x22\
+\xcc\xce\x34\x33\xbe\x88\x2f\x88\x91\x91\x10\x37\x1f\xd9\xd6\x09\
+\x89\x5b\xa6\x5b\x75\x0b\x90\xe9\xfe\x70\xc9\x30\x44\xe3\x12\xa3\
+\xd3\x2d\x01\x49\x40\xa3\x6e\x8a\x1a\x37\x37\x9c\x5d\x70\x98\x68\
+\x6a\x14\x83\xcc\x2d\x88\xa3\xd8\xd0\x96\x95\x77\xb5\x85\x56\xb8\
+\x7d\xdc\x7b\x76\x7a\x83\x51\x64\x42\x37\x7a\x92\xe6\xde\xf4\x9c\
+\x5f\x3e\xe7\xfc\xce\xef\xfe\x08\x26\x18\x2b\xce\x74\xfd\xc4\x1e\
+\x6f\x3d\x67\xfa\xa2\xd9\xa0\x79\x73\xbc\x78\x12\x01\x60\x3f\xbe\
+\x26\x39\xd5\x2f\x10\x74\x78\x83\x18\x0c\x88\xd2\xff\x2e\x7f\x08\
+\x35\xad\x43\x0e\x06\xa4\x4d\x0a\x58\x75\xca\x69\x7e\xe9\x05\xf9\
+\xf2\x23\xd9\xd3\xe0\xf6\x8b\x52\xc0\x14\x05\x41\x89\xd9\x85\xee\
+\x01\xe1\xfa\xb5\x82\x94\x15\x93\x02\xc2\x43\x5f\x6d\xa3\xa6\xb7\
+\x53\xf0\xb7\x57\x90\x02\x12\x38\x39\x0a\x6a\x9d\xb8\xb3\x65\xf6\
+\x84\xf1\x91\x01\x15\x56\x7a\x69\x53\x2a\x9c\x61\x80\x45\x24\x28\
+\x19\x70\xde\x81\x3b\xdb\xb4\xd1\x01\x74\xdf\x5a\xe8\xaf\x9b\xe7\
+\xc0\x39\x10\x92\x80\xa9\x0c\x30\x9c\xb3\xa1\xf9\xd3\x8c\xe8\x00\
+\xf3\x0e\xdd\xa3\x75\xef\xa7\xc3\x11\x06\x64\xec\x04\xb1\x72\x6c\
+\xfa\xde\x8a\xbb\x9f\xcd\x8b\x0e\x90\xfe\xd5\x1f\xb4\xce\xf8\x1a\
+\xec\x9e\x80\x74\x02\x15\x03\x0a\x8f\xb5\xc2\xf2\x85\x3e\x3a\x80\
+\xb6\xac\x89\x9a\x8a\xf4\xb0\x3f\xf4\x8f\x00\x0a\x6c\xae\x6e\x41\
+\x5b\xe9\x82\xe8\x00\x73\xf7\x34\xd2\x9f\x8d\x7a\xd8\x58\x8a\x64\
+\x2c\x22\x8e\x93\xe1\xa3\x63\x77\x61\xd9\xbd\x70\xf2\xc0\xec\x5d\
+\x0d\xdb\xcb\xde\xd5\x96\x67\x4c\x8f\x47\xaf\x8f\x4a\x11\xf1\x31\
+\xc0\x75\xbb\x17\xdf\x5d\xb6\x19\xac\xfb\x96\x9e\x9d\x14\x90\x5b\
+\xd1\x4c\xab\x0b\x75\x68\xe8\x1c\x82\x82\x6d\x9f\x32\x43\xad\x04\
+\x94\x9c\x02\x57\xee\x7b\xb0\x3b\x7b\x06\xf9\xdf\x80\xa6\xe8\xea\
+\xbe\xdf\x4a\x97\xee\x72\x0c\x00\x8f\x02\x82\xb4\x5a\x0a\x20\x14\
+\x99\x6a\x0e\x4d\xae\x20\x4a\xab\x1a\x2b\x1d\x87\xb3\xb7\xfd\x67\
+\x40\x5b\x7c\xa5\xec\x8d\x9c\xb4\xd2\x5c\xbd\x06\x37\x7b\x87\x10\
+\xfb\xd4\xca\xb0\xb5\x52\x13\x8b\x76\x6f\x08\x3f\xdc\xec\x41\x67\
+\x6b\x57\x7e\xeb\xd7\x39\xa6\x88\x81\xf4\xe2\x7a\x85\x9c\x53\x04\
+\xf3\xd6\xbf\x8a\xf2\xfa\x3e\x28\x44\x96\x17\xd9\x93\x79\x81\xf5\
+\x3b\x6d\x6a\x1c\x74\x2f\xc7\xa1\xf6\x96\x1b\x33\x3d\xfd\x4d\x72\
+\x91\x2e\xb6\x7c\xb3\x5a\x8c\x08\x98\xb5\xc5\x74\x38\x67\x6d\x46\
+\x71\xf3\x30\x81\xd5\x16\xce\xfd\xe8\x79\xca\x2e\x42\x19\xa7\x80\
+\x71\xd9\x8b\xa8\xba\xe5\x81\xdf\xe5\x43\x62\x6f\xff\xce\xfb\x15\
+\x79\x07\x23\x02\x16\xed\x6d\xa0\xba\x65\x69\x38\x7f\xc3\x05\x25\
+\xeb\x9c\xe4\x99\x55\xec\x3c\xf0\x07\x29\x3e\x58\x9e\x84\x87\xbc\
+\x88\xab\x56\x1f\x62\xda\xbb\x61\x3f\x98\x4d\x26\x04\x52\x3f\xfc\
+\xe5\x40\xc1\xd6\x85\x3b\x4e\xde\xf6\x20\xc0\x53\xa9\xee\xff\x6d\
+\x04\x59\xda\xb2\x32\x13\xb0\x78\x86\x12\xa7\xfe\x7c\x04\xb7\x67\
+\x18\xaa\x36\x5b\x43\x7b\x55\x7e\xd6\x73\x01\x4d\xe1\x85\x8f\x5f\
+\x5f\x39\xa7\x32\x76\xe6\x34\xdc\xb0\x0c\x22\x46\x36\x76\xf7\x4f\
+\xee\x81\x62\x7a\x22\x87\x8d\x99\x2a\xd8\x58\x97\x35\xb7\xf3\xe0\
+\xd9\x29\x68\x57\x5f\x7e\xc7\x89\x75\xa6\x31\xc0\x2b\x85\x3f\xca\
+\xa6\xa8\xe3\x05\xa3\x71\x09\x2a\xcd\xfd\xd2\x9d\x92\x71\xaa\x98\
+\xb0\x52\x0d\xb1\x5c\x6d\x5f\x92\xc8\x52\x46\x70\xba\xc5\x0b\x2f\
+\x3b\x31\xdf\xf8\x57\x8b\xc0\xf3\x7a\xe7\xc9\x0d\xc2\x28\x20\x71\
+\x63\xcd\xfe\xa2\xa2\x55\x9f\xb7\x0c\x12\x38\xdd\x01\x96\x1a\x32\
+\xee\x47\x22\xdd\x83\x40\xf1\x8e\x4e\x05\x35\x47\xd0\x33\x2c\xe0\
+\x62\xdb\x30\xa8\x8f\x47\xd7\xb5\xa6\xbd\xdd\x67\xdf\xfb\x72\x14\
+\x30\x7f\x67\x3d\x2d\xd9\x9a\x85\x73\xf7\x06\xa0\x94\x47\xd4\xa2\
+\x20\xb0\x6a\x9a\x9f\xc4\x61\x01\xfb\xb1\x5a\xc0\xe5\x4e\x3f\xfa\
+\x42\x04\xbf\xd7\xde\x86\xbd\x3c\x8f\x8c\x02\xd2\x3f\xb9\xe4\x35\
+\x96\xe4\xaa\x3a\xdc\x7e\xb6\x3d\x31\x22\x20\x3c\xc2\x45\xa0\x1e\
+\xa9\x63\x9e\xbd\xd3\x18\x0e\xa7\x0f\xd5\x3d\xe8\x38\xba\x36\x79\
+\xcc\x25\x27\x1b\xce\x78\x35\x73\x53\x54\xea\xa4\x04\xd6\x0d\x26\
+\x46\xc4\x91\x5c\x89\x12\x44\xe0\x79\xe0\x43\x8f\xd5\x39\xd4\x5f\
+\x63\x88\x7f\xbc\xe6\x1f\x10\xaf\x77\x28\x9d\x97\x49\x6d\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x20\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xe7\x49\x44\x41\x54\x78\xda\x8d\x56\x79\x50\x13\x57\
+\x18\xff\x6d\xae\xcd\x66\x31\x21\xe1\x10\x82\x01\x14\x94\x5a\xf1\
+\x00\x45\x70\xd4\xca\xa1\x8c\xf5\x1f\xed\xe1\x35\xa5\x4e\xb1\x33\
+\x1d\x5b\x9c\xb1\x5a\x3c\x46\x6b\x3b\xd6\xca\xa8\x58\x3b\xce\x40\
+\x8b\x7f\xa8\x1d\xb5\x53\xd4\xda\xea\x3f\xd6\x41\x45\xbc\x6a\x10\
+\x01\xcf\x5a\x28\x22\x10\x09\xc8\x95\x10\xc8\x9d\xcd\xf6\xed\x26\
+\x62\x0f\xa4\x7d\x99\xb7\xbb\xef\xbd\xef\x7b\xbf\xf7\xbe\xe3\xf7\
+\x85\xc2\x48\x6d\xda\xee\x6c\x70\xdc\x32\x70\x7c\x2e\x18\x6d\x34\
+\xec\xbd\x4a\x71\x9e\x0d\xf3\xc0\x69\x69\x87\x94\xaa\x80\x54\x7a\
+\x12\x77\xb6\x54\xbe\x6c\x0b\x6a\xd8\xd9\xd4\x7d\x29\x70\xb9\x6f\
+\x20\x22\x96\xd1\xa7\xc4\xc3\x30\x29\x12\xe1\x61\x2a\x30\x2a\x99\
+\xb8\xec\x74\xf8\xd0\xd3\xeb\x80\xe9\x61\x17\xcc\xf5\x2d\x40\x77\
+\x9b\x13\x4a\x7a\x36\xea\x0a\xeb\xff\x1b\x60\xda\xfe\x12\x48\x98\
+\x82\x57\x97\x66\x20\x69\x72\x24\x58\x8d\x02\x12\x9e\x82\xdf\xcf\
+\x03\xfc\x0b\x2d\x89\x84\xcc\x51\x3c\xec\xfd\x1e\x34\xdc\xef\xc2\
+\x6f\xa7\x8c\x80\xdf\x59\x8a\x3b\x1b\xd6\xbe\x1c\x60\x7a\x69\xb9\
+\x5c\x1f\xbd\x7c\xc1\xbb\xa9\x88\xd2\xb3\xe2\xb2\x8f\xe3\xe1\x21\
+\x9b\x93\x17\xfc\x7c\x00\x41\x42\x51\xc4\x3a\x80\x82\x80\xc8\x84\
+\x0f\x82\xdc\x69\xb6\xe3\xc2\xb1\x3a\x78\xcd\x1d\x27\x50\x5b\xb0\
+\xe2\xdf\x00\x19\x87\x4a\x14\x91\xa1\x05\xcb\x3e\xcc\x80\x4e\xa7\
+\x04\xe7\xf3\xa3\xdb\xc9\x43\xaf\x92\x62\x4d\x12\x8b\x68\x46\x06\
+\x35\x23\x15\x45\x6d\x4e\x0e\x1d\x4e\x1f\xca\x1a\xec\x30\x3b\x38\
+\x44\x30\x04\x50\x26\x41\x5f\x9f\x0b\x27\xbf\x35\xc2\xd3\x65\x2d\
+\x85\xf1\xfd\xb5\x43\x00\xd4\xdc\xef\x52\x78\x9e\xaa\x5b\xbe\x39\
+\x1b\xe3\xa2\xd4\xe8\xf7\x78\xd0\xd4\xef\xc7\xa6\x64\x16\x39\x06\
+\x76\xc4\x38\xb8\x64\xb2\x63\xef\x03\x3b\x12\x35\x12\x68\x14\x0a\
+\x34\x77\xda\x70\x62\x4f\x25\x28\x8a\x4f\xe5\xaf\xbd\x57\x1f\xb8\
+\xc1\xac\xa3\x8e\xd9\x79\x69\x4c\xee\x9c\x18\xb4\x58\xdc\xf8\xdd\
+\xca\xe1\xf2\xa2\x08\xd0\x72\x89\xb8\xdc\x3d\xe8\x45\x59\xe3\x20\
+\x6e\x75\x71\xe2\x78\x66\x24\xb9\xd5\x84\x10\x44\x84\xc8\xc5\xb1\
+\xdb\xeb\x47\xd6\xb9\x6e\xbc\x12\x2a\x45\xbc\x96\x46\xc5\xf5\x76\
+\xdc\x38\x5e\xe3\xc4\xcd\x55\x2a\x4a\x9a\x53\x9e\x2d\xd7\x30\x97\
+\x3e\xdd\xfe\x1a\x1e\xf5\xf9\xf1\xc4\xea\xc5\xfe\x8c\x51\x48\xd7\
+\xab\x44\xe5\xbd\xf5\x56\x9c\x7a\xec\x86\x8c\x1c\x85\x0a\x1a\x54\
+\x70\x85\x8f\xf4\xa5\x09\x34\x36\xa5\x84\x8a\x73\xd5\x66\x07\x36\
+\x18\x07\x30\x36\x54\x8e\x89\x3a\x09\xbe\xdc\x79\x15\xde\x7e\x67\
+\x0e\xc5\xe6\x5f\x3d\x36\x31\x59\x93\x37\x7f\xde\x58\xdc\x7d\xe6\
+\x42\x92\x5a\x86\xaf\xe7\x68\x45\xa5\xfd\xf7\x6c\x38\xdb\xe2\x42\
+\x56\xb4\x1c\x5b\xa7\x69\xa0\x08\xde\xc8\x43\x4e\x5c\x74\xa7\x1f\
+\x97\x3b\xbc\x58\x1c\xaf\xc4\x86\x29\x6a\x71\x7e\xfd\x75\x0b\x1a\
+\x6c\x3e\x4c\x1d\xad\xc4\xc5\x2b\x4f\x50\x77\xbe\xf1\xa0\x00\xd0\
+\xb8\x6c\xc5\xf8\xf1\x4e\xa9\x02\x4e\xa2\xb8\x2f\x4d\x8d\xc4\x30\
+\x05\xfa\x89\x13\x57\x5e\xb6\x60\x46\x98\x1c\x5f\xa4\x87\x0e\x6b\
+\xff\xcf\xaa\xad\xb8\xdd\xeb\xc5\x0f\x59\x5a\x68\x48\x10\x34\xf5\
+\x7a\x50\x58\x63\x03\x43\x0e\xc2\x70\x1e\x1c\x29\xfe\xf5\x89\x00\
+\x30\xf8\xce\x07\x93\x59\x8f\x8b\x82\x9d\x00\x1c\x99\xa7\x01\xab\
+\x90\x60\x6b\x8d\x15\xdf\xdc\x76\xa1\x7d\x75\x38\x58\x5a\x36\x2c\
+\x80\xdd\xed\x43\xcc\xe1\x1e\x7c\x34\x43\x89\xa2\xb4\x50\xd8\x3d\
+\x7e\xe4\x5f\xe9\x07\x4b\x00\x14\x4a\x1e\x87\x4a\xee\x0d\x50\xc8\
+\x39\xcd\xaf\xdb\x93\x0b\xb7\xcb\x47\x00\x78\x1c\xcd\x0c\x98\x27\
+\xe3\xe7\x5e\xb4\x59\xbc\x30\xaf\x8e\x1a\x31\x8a\xf4\x87\x3b\x11\
+\xab\x95\xc3\xf8\x46\x98\x38\x5e\x55\x65\x21\x00\x14\x68\xa5\x0c\
+\x07\xb6\x54\x40\x04\xd8\xb8\x77\x21\x38\x0f\x87\x2a\xb3\x07\xb5\
+\x6f\x06\x04\xe7\x9d\xeb\x81\xa9\x0f\x68\xce\x0b\x1f\x11\x60\xdc\
+\xf1\x1e\x18\x74\xc0\x95\x45\x01\xb9\xe9\x3f\xf5\x22\x53\xaf\x80\
+\x54\x21\x45\xf1\xe6\xf3\x10\x4c\xe4\xda\x5c\x38\x83\xbe\xf5\xd4\
+\x8d\xc7\x16\x1f\x6a\x16\xeb\xc0\x2a\x25\xd8\x56\x3b\x80\x1f\xff\
+\x70\xe3\xfe\x5b\xba\x21\xe7\xfe\xb3\x09\xce\x9e\x7c\xba\x0f\x6f\
+\x8f\xa7\xb1\x6b\xfa\x28\xd8\x5d\x7e\xa4\x9d\xed\x43\x82\x56\x86\
+\x99\x63\x68\xec\x28\xaa\x19\x10\x00\x7a\x72\x56\x4e\x09\xb3\xb9\
+\x09\x89\x11\x3e\x38\x32\x97\x21\x61\x46\x93\xd8\xf7\x21\xfb\xfc\
+\x20\xe6\x1b\x48\x54\xa5\x87\x0c\x0b\xb0\xbe\x7a\x10\x17\x4d\x3e\
+\x54\x2e\x14\x72\x42\x46\xc2\xdc\x8d\xfc\x6b\x4e\x30\x84\x3e\xd4\
+\x34\x70\xf1\xfb\x07\xa2\x93\x6b\x13\xb2\x26\xa4\x8e\x21\xdc\xe3\
+\x21\x00\x09\x6a\x0a\x65\x19\x81\x0d\x8b\x48\x86\x9e\x69\xe1\x90\
+\x19\x23\xc1\xce\x64\xd5\x50\xe2\x09\x89\xb5\xfd\x81\x03\x55\xed\
+\x7e\x2c\x89\x97\x62\x6b\x72\x20\xdb\xd7\x18\x07\xf1\xd8\xc6\x43\
+\x41\x00\x9e\x12\x6e\x6a\x31\xb6\x1d\xa4\xb4\x1f\xd7\x8d\x65\xc2\
+\xd8\xe6\x59\xd9\x06\x78\x89\x1f\x06\x49\x06\xed\x9e\xa4\x40\x5a\
+\x34\x2d\xb2\x67\xf1\x23\x07\xce\x98\x38\x91\x53\x9e\x13\x17\x1f\
+\xec\x4b\x0c\x52\x6c\x9c\xa8\x12\x17\x6a\x3a\xdc\xd8\xf2\xd0\x83\
+\x10\x92\x91\x72\x62\xff\x9b\x95\x26\x38\x7b\xed\x39\xa2\x4e\xe8\
+\x27\x77\x1d\x69\x0b\x62\x19\x2d\xb9\x97\xc0\x9e\xc2\xaf\x3c\x9d\
+\x19\xb2\x7d\x8f\xc3\x8f\xe3\xad\x6e\xdc\xb3\xf9\xc5\xf1\x14\xb5\
+\x04\x79\x71\x34\xc2\x55\x2f\x12\x6f\x45\xb5\x93\xe0\x04\xd8\xd5\
+\x42\xec\x5d\x73\xa1\xcd\x69\xfd\x6a\xaa\x4a\x04\x08\xdf\xf6\x30\
+\x85\xa2\xe5\x75\xb9\xaf\x1b\x20\xf0\x32\x91\x87\x94\xe8\x6e\x1c\
+\x27\x43\x4a\x84\x7c\xc4\x28\xaa\xef\xf6\xa2\xb8\xd9\x07\x8e\xe8\
+\x88\xe7\x21\x00\x15\xbf\x98\xc0\xbb\xbd\xa9\x3d\xbb\x26\xd5\x0f\
+\xd1\x75\xc4\xe7\x0d\x25\xa1\x31\x6c\x41\x4e\x46\x04\xdc\x24\x61\
+\x04\x05\xc1\xe9\x13\x58\x0a\xf9\x71\x72\x44\xd1\x14\x49\x38\x49\
+\x30\xc1\xfc\xe8\x74\x93\x80\x68\xf5\xa2\xd1\xce\x8b\x4e\x15\x0e\
+\x44\x93\x04\xbd\x64\xec\x86\xb5\xdd\x5e\xda\xbd\x23\xe9\x05\x5d\
+\x3f\x6f\xa3\x77\x36\x95\x6b\x0d\xec\xf2\xcc\x14\x1d\xa9\x56\x10\
+\xab\x98\x40\x6a\x5e\xc2\x6e\x7e\x02\xe8\x0f\xca\x09\x30\x12\xf2\
+\x90\x13\xf6\x93\x05\xab\x9b\x84\xc8\x55\xd5\xf7\xc1\x62\xb2\x9f\
+\x78\xb6\x3d\x71\x98\x82\x13\x6c\x51\xfb\x5a\x4a\x64\x4a\x69\xc1\
+\xac\x99\x3a\xe8\x83\x3e\x11\xab\x25\xcf\xff\x4d\x8e\x22\x9b\x93\
+\x7d\x45\x9b\x9b\x89\xcd\x6f\xde\xea\x83\xcf\xc5\x95\x76\x16\xc6\
+\x8f\x50\x32\x83\x2d\xe6\x40\x5b\x0a\xc7\x53\x37\xb4\x61\x34\x93\
+\x18\xa7\x44\x14\xa9\xcb\xa3\x48\xea\x3f\x07\x11\x36\x1f\x20\xd4\
+\xd2\x49\xea\x71\x53\xab\x0b\x96\x5e\xb7\x53\x4a\xf1\xb3\xdb\xd7\
+\xc5\xfe\x8f\xa2\xff\x97\x16\x57\x66\xce\x56\xb1\xb2\x1d\xe4\x33\
+\x52\x18\x5a\x6d\x3e\x5a\x8c\x3a\xb5\xcc\x4e\x5e\x26\xd2\xdb\x1c\
+\x76\xdf\x9e\xd6\x35\xfa\x97\xfe\x6d\xf9\x13\x04\x0c\x75\x38\x84\
+\xc6\x74\xa9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xc1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x88\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x50\x54\x65\
+\x18\x7e\xbe\xb3\x67\xaf\xb0\x2c\xcb\xc2\x00\x0b\xc6\x45\x05\xb9\
+\x2a\x48\x90\xa9\x53\x62\x12\x93\x35\xce\xe0\x85\x86\x68\x4c\x1b\
+\xa1\x09\xfd\x53\xd3\x94\x63\x8d\x3f\x9c\xa9\x66\xb2\xfc\x11\x16\
+\xd9\x4c\xe9\xa4\x0c\x68\x31\xe3\x38\x39\xc8\x68\x94\x88\xc4\x45\
+\x21\x20\x11\x29\x40\x01\x59\xdc\x85\xe5\xb6\xec\xb2\x7b\x2e\x7d\
+\xe7\xb0\x22\x97\x90\x77\xe7\x9c\x9d\xf9\x2e\xef\xf3\x5e\x9e\xf7\
+\x7d\x0f\xc1\x53\xc4\xb0\xe3\x6c\xa6\xc0\x0b\x7b\x04\x41\xcc\x12\
+\x78\x31\x4a\xe3\xa7\x91\xd7\x5d\xe3\x2e\x30\x0a\xd2\xc3\x30\xa4\
+\x8a\x51\x30\xe7\xc7\x2e\xe6\xff\xb6\x94\x0e\xf2\x7f\x8b\x01\x39\
+\xa5\x29\x1e\x37\x57\x6b\x08\xf1\xd7\x46\xc6\x86\x20\x22\xd2\x08\
+\xa3\x51\x0b\x8d\x5a\x31\x03\x30\xcd\xc3\x6e\x77\xe2\x7e\xaf\x1d\
+\xbd\x9d\x16\x8c\x59\x46\x9d\x4a\x15\xbb\x71\xa4\x22\xaf\x79\x59\
+\x00\x53\xce\xb9\x62\xa2\x54\x16\x6d\x78\x39\x0e\xab\x23\x4d\xd0\
+\xf8\x2a\xc1\x08\x80\x20\xce\x3f\xc7\xd0\x9b\x02\x43\xc1\x26\x3d\
+\xe8\xea\x1d\x46\xdd\x95\x0e\x88\x1e\xcf\xc9\xe1\x8a\x37\x0e\x2e\
+\x09\x60\xda\x55\x5e\x66\x08\x35\xe6\x66\xbf\x12\x8b\xa0\x40\x1d\
+\x44\x50\x0d\xe2\xcc\x21\xb2\xc0\x14\x51\x94\xb7\x20\xd2\x75\x06\
+\x02\xac\xb6\x29\x54\x5e\xee\xc4\xd8\xa0\xbd\x7c\xf8\xe7\xdc\xd7\
+\x17\x01\x04\xe7\x55\x14\xfb\x05\xfa\x16\xed\xd9\x9d\x04\xbd\xaf\
+\x46\x36\xd9\xc9\x89\x18\xf5\xf0\x18\x9e\xe2\x40\x0d\x05\x2f\xcc\
+\x9c\x55\x50\x5c\x1d\x0b\x04\x6a\x95\xf4\x61\xa0\xa4\xe8\x44\x41\
+\x30\x31\xe9\xc2\xf9\x0b\x6d\x18\xb7\x4d\x9e\x1c\x2a\xcd\x39\x38\
+\x0b\x10\xfe\xd6\xc5\x14\x9e\xe0\xf6\xde\x37\xd3\x10\x1a\xa0\x83\
+\x93\x17\xf1\x60\x9c\xc3\x23\x27\x0f\x85\x74\xd9\x7b\x52\xfa\x17\
+\xbd\xd6\xab\x29\x80\x5e\xa5\x82\x94\x16\x5e\x10\x10\xea\xc3\x40\
+\x4b\x41\x06\x47\xa6\x70\xe6\xa7\x26\x28\x44\xa4\xf6\x9f\xde\xd1\
+\x2c\xdf\x0d\xc9\xbf\x38\x95\xfd\x5a\x9c\x76\x43\x52\x30\x1e\x4e\
+\xf0\xb8\x3f\xe6\x96\x35\x32\x0b\xc3\xe2\xb5\x48\x41\xdf\x31\x06\
+\x16\x45\x6b\xfd\x70\xee\xae\x03\xd7\xfa\x1c\xd0\xa8\x18\x44\x18\
+\x54\x30\xeb\x15\xa8\x6b\x1b\x42\xe5\xa5\x0e\xa7\xe5\xec\x0e\x1d\
+\x79\xe6\xed\xca\x4c\x8d\x5e\x75\xed\x83\xfd\xeb\xd1\x3d\xc1\x61\
+\x64\x5a\x90\x15\xcf\xd5\x4d\xa8\x17\x94\xa6\x10\x68\xb8\x34\x34\
+\x3c\xfb\x13\xf4\x48\x36\xeb\xe4\xbd\x13\xf5\x36\x34\x5a\xdc\x08\
+\xf0\x57\x83\xa3\x61\x0d\x50\x33\x88\xd6\xb3\xf8\xe2\x87\x5b\x70\
+\x4d\xb8\xb7\x92\xf0\x82\x2b\x25\x9b\x36\x85\x17\x3e\x97\x1c\x86\
+\x1e\x1a\x96\x59\xab\x65\x10\x22\x27\x77\x9a\x26\x60\x62\xca\x8d\
+\xbc\x78\x3d\xb2\x62\xfc\xe7\x79\x75\xbc\xf6\x11\x5a\xac\x1e\x04\
+\x07\x69\x69\xe8\x44\x99\x6d\x51\x7e\x2c\xfe\x6c\x1d\xc0\x8d\x1b\
+\xfd\xdf\x91\xb0\xc2\x2b\xdd\x05\xf9\x6b\xa3\x1c\x44\x45\xd5\x89\
+\xb3\x16\x2b\x28\x92\x7b\xda\x83\x8e\xfb\xe3\x58\x67\x56\xe3\xd8\
+\x56\x33\xdd\x60\x16\xd5\xcc\xf1\x9a\x41\x74\x8c\x8a\x08\x36\x69\
+\xa9\x72\xd1\x1b\x4a\x02\x1f\xd1\x8d\x53\x67\xff\xea\x21\xe6\x82\
+\x2a\xf1\x9d\x82\x74\xb8\x3d\x82\x97\x21\x04\x2e\x1a\x8a\x86\x76\
+\x2b\x26\x1c\x1c\x2a\xf6\x45\x63\x85\x51\xb7\x64\xb5\xef\x3e\xdd\
+\x09\xce\xc7\x07\xc9\x11\x3e\x33\xd4\xf5\xd6\x8b\x4a\xc9\xa0\xe4\
+\x54\x03\xc8\xea\x0f\xaf\x8b\x07\xf2\x52\xa8\xb5\x1c\x58\xaa\xbc\
+\xdb\xea\xc4\xcd\xa6\x01\x7c\xb5\x2b\x0a\xdb\xd6\x04\x60\x39\xd9\
+\xfe\x6d\x2b\x7c\x56\x47\xc0\xe5\x74\x23\x36\x88\x85\x49\x49\x64\
+\x3a\xab\x29\xcd\x4e\x95\xb6\x80\xc4\x1f\x6d\x14\x0b\x76\x26\x80\
+\xe7\x78\x74\xd2\x1c\x74\xf5\x8f\xc3\xd2\x3e\x80\x8f\x77\x46\x20\
+\x2f\xcd\xbc\x2c\x40\xf6\x89\x5b\xf0\x4b\x5c\x29\x17\x09\xe5\x01\
+\x4c\x1a\x82\x35\xfe\x4a\x28\x94\x0a\x94\x94\xb5\x82\x44\x1f\x6e\
+\x10\x3f\xda\x9b\x84\x56\x9b\x13\x76\x27\x01\x4b\xab\xc8\xe5\xe6\
+\xd0\xf8\x7b\x17\x58\xd1\x83\x8a\x43\xc9\x48\x08\xf3\x5b\x12\x20\
+\xf3\xb3\x9b\x58\xf1\x7c\x12\x44\x6a\xa0\x24\x52\x92\x8d\x5a\x11\
+\xc9\x81\x5a\x7c\x7e\xa6\x0d\x64\xcd\x91\xa6\xee\xac\xec\x95\x51\
+\x13\x6e\xa9\xe4\xbd\xec\x91\x92\xcc\x32\x18\xb2\x3a\xf0\xc7\xe5\
+\x36\x64\xc4\xfb\xa3\xac\x70\x2d\x0c\x3a\xd5\x22\x80\x17\x8e\x5d\
+\x47\xec\x96\x54\x4a\x61\x0e\x5e\x8e\x40\xca\xa6\x9e\x1e\xad\xaa\
+\xfc\xb7\x87\x24\x7e\xda\x52\x12\x93\x10\x52\x18\x12\xa4\x83\x30\
+\xb7\xa3\x49\x3d\x86\x02\xb1\x2a\x16\x8d\x75\xbd\x68\xb9\x71\x0f\
+\x47\xf2\xe3\x70\xe4\xd5\x98\x79\x00\x9b\x3f\xa9\x46\xcc\x8b\xc9\
+\x50\x6b\x55\x32\x4d\x25\xa1\x6d\x1c\x16\xeb\x14\xee\xfd\x6d\xf9\
+\x8e\xac\x3b\xde\x9e\xe9\x43\x0b\x2d\x63\x7d\x18\x3c\x9c\xb0\xc8\
+\x42\xd9\x1b\xda\x02\x3c\x14\xfc\xea\xaf\x77\xf0\xe0\x6e\x1f\x4e\
+\xbf\x97\x8e\xdd\xe9\xe1\xf2\x7e\xc6\xe1\xab\x48\x7c\x29\x05\xbe\
+\x7a\xcd\x2c\x80\x92\x7a\x5f\x7f\x6b\x00\x0e\xa9\xd0\xa4\x85\x75\
+\x5f\xde\x99\x4a\x4f\x0b\xd5\x1a\x7c\x55\xf3\xbd\x58\x00\xc4\xd2\
+\xc4\x3d\xb2\x39\x70\xe9\xc2\x6d\x08\x0e\x07\xba\x4a\xb2\xb1\xfd\
+\x58\x0d\xe2\xb7\xa5\xd2\x4a\xd6\xc8\x77\x25\xeb\xc7\x26\xdd\x68\
+\x68\x1a\x74\xb6\xbc\x1f\xaf\x93\x01\xd2\xbe\xee\x4c\x61\x55\x8a\
+\xdb\x5b\x32\xcc\x20\x73\xb8\xbc\x08\x44\x7a\xa8\x02\x15\xa5\x60\
+\x63\x73\x3f\xaa\x7f\x69\x84\xcb\x3a\x86\xbd\x47\x73\x10\x6a\xd2\
+\xc9\x1e\x48\xed\xbb\xba\xfe\x21\x38\x37\x9f\xda\x74\x28\xb6\x79\
+\xb6\xe5\xa4\x7f\xf3\x4f\xb1\x7f\xa0\xb6\x68\x73\x62\x20\xdc\x34\
+\x54\x4b\x81\x3c\x09\x1b\x43\x7b\x8f\x80\xde\x3e\x3b\x56\x45\x06\
+\x50\x9a\x8b\x50\xb1\x04\x35\xed\x36\x8c\xda\x9c\x27\x1b\xde\x5d\
+\xf5\xa4\x5d\x3f\x96\x8c\xef\x7b\xca\x4c\x26\x4d\xee\x06\x5a\x60\
+\x22\x75\x57\xb6\x08\x4f\x07\x92\x7a\x95\xe4\xb5\xd4\xc4\xea\xee\
+\x8e\x60\x78\xd8\x55\x5e\x7f\x20\x6a\xf1\xc0\x79\x2c\x1b\x7f\xec\
+\x2b\x66\xd5\xa4\xe8\xd9\x38\x23\x82\xe8\x40\x91\x3a\xa4\xfc\x13\
+\x17\x2a\x9f\x69\x86\x52\xf5\x5b\x9d\x1e\x34\x76\xd8\xc1\x4d\x8b\
+\x27\x6b\xf7\xad\x58\x7a\x64\xce\x52\xaf\xf4\x61\x0a\xcf\xa3\xd6\
+\x68\x60\xb5\xd1\x21\x1a\x04\xfa\xaa\x41\x47\x33\x1e\x73\x4c\xaa\
+\x17\x69\xc2\xd9\x26\xa7\xd1\x6d\x71\xc1\x3e\xc6\x39\x15\x0a\x6c\
+\xac\xc9\x33\x2f\x3f\xf4\xe7\xca\x96\xf2\xa1\x4c\xda\x21\xf7\x08\
+\x04\x59\xd4\x83\x28\x8d\xc6\xfb\x55\xe1\xe2\x25\x0f\x7a\x18\x11\
+\x55\xb4\x56\xce\x57\xe7\x06\x2f\xf9\xd9\xf2\x1f\x5b\x5b\x45\x3c\
+\xae\xb7\xe7\x28\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x03\x4e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x15\x49\x44\x41\x54\x78\xda\xb5\xcf\x5b\x48\x13\x60\
+\x18\xc6\xf1\x67\xd3\x69\x99\x3a\xcd\x75\x26\x9a\xae\x6d\xb6\x70\
+\x5a\x2c\x95\xb2\xe1\xd2\x6d\x9a\xe7\xb4\x68\x91\x78\x51\x18\x61\
+\x0b\x03\x0d\x51\x2c\x43\x4c\x4a\x32\xd1\xd0\x40\x12\xf4\x62\x5a\
+\x49\x05\x15\xa2\x16\x76\x30\x14\xd3\x72\x99\x87\x5c\x73\x9b\x4e\
+\x98\xab\x34\xa7\x73\xb6\xa5\xa6\x42\x11\x99\x36\xdd\x7a\x6f\xbf\
+\xf7\xfd\xff\xf8\x08\xf8\x0f\x13\x74\x67\xf0\xea\x46\xb2\x5d\xea\
+\xa8\x61\x6a\x98\x60\xed\x38\xb7\x5c\x29\x61\x6f\x5b\x23\x12\x32\
+\x5c\x50\xdc\xa8\x85\x55\x81\x7d\xa5\x72\x09\x9b\xea\x20\x0a\xd8\
+\xee\x8a\xa7\x8a\x71\xc8\x94\xba\x2b\x56\x03\x7c\x8b\x7a\x24\x6c\
+\x9a\xb3\x68\x37\xcd\x15\x4a\x9d\x11\x4d\x6f\xb5\xba\x97\x89\x74\
+\xb2\x55\x00\xce\xb5\xf7\x12\x2f\x3a\x59\xc4\xf6\x58\x8b\x21\xe3\
+\x77\xb4\xb4\x6b\x31\xa1\x37\x52\x9b\xc5\x3b\x55\x16\x03\xde\xb9\
+\x6f\x24\x5e\x0c\x17\x91\x17\x8d\x02\xb5\x61\x06\xea\x81\xaf\x18\
+\x50\x8e\x5c\x6a\x3d\xef\x93\x35\xf7\x6e\x11\xc0\xce\x6a\x91\xb0\
+\xe8\x6e\x22\x4f\x26\x05\x83\xe3\x53\xd0\xeb\x8d\xe8\x68\xeb\x6f\
+\xed\xb8\xe0\xbb\xe7\xe7\xce\x8a\x01\x56\xfa\xab\x42\xa6\x27\x45\
+\xec\xef\xbd\x01\xef\x86\x4c\x98\x9e\x9e\x46\x67\x93\x02\x44\x22\
+\x81\xdc\x7e\xd1\x4f\x67\x11\xe0\x99\xf2\xec\xe8\x86\x4d\x4e\x95\
+\xc1\x5c\x0f\xb4\x6a\x26\x61\x6b\x43\x84\xbc\x45\x09\xa3\xf1\x9b\
+\xb0\xeb\x32\xb7\xee\xf7\xdd\x65\x03\x8c\xb3\x4f\x44\xce\x6e\xab\
+\x25\x5c\x1e\x1d\x9d\x5a\x13\x48\x24\x1b\x0c\x4a\x07\x30\x31\xac\
+\x13\x7f\x28\x08\xba\xf1\xe7\xfe\xb2\x00\x5a\x52\xbd\x80\xec\xbc\
+\xaa\xf6\x40\x28\x13\xcd\x6a\x03\xec\x66\xe3\xc3\xb2\x21\xe8\xd5\
+\xda\x4a\x59\x71\xe8\xb1\xbf\xdd\x98\x0d\xf8\x1d\xca\xa0\xf6\x12\
+\xd8\x8a\x84\x94\x60\x34\xca\xc6\x40\x20\x12\x61\xd4\x8c\x60\xac\
+\xab\xbf\xad\xaf\x2c\x82\xb3\xd8\x9d\x59\x40\x78\xd4\x09\xf2\x91\
+\x23\xe1\x5f\x1b\xe4\x06\xdc\x91\x39\x61\xeb\x7e\x16\xa0\xff\x86\
+\xc9\xf6\x6e\x85\xb2\x3c\xd6\x63\xa9\x5b\xb3\x80\xfc\xe2\x8a\xd7\
+\xde\x2c\x06\x87\xb7\x77\x17\x1e\xbe\x90\xe2\x78\xa9\x1c\x8e\x24\
+\x3b\xd8\x10\x09\xce\xea\x8a\x43\x63\x16\x01\x99\xd9\x85\x85\x71\
+\x31\x02\xf1\x0e\x26\x0d\xe7\x52\x73\x11\x16\xc2\x85\xea\xf3\x28\
+\xd2\xaa\x75\x9c\xd1\x07\xf1\x6d\xff\xba\x5f\x12\x48\x4e\xcb\x15\
+\x1c\x14\x04\xd6\xf2\x79\xfe\xc8\x2b\x28\xc3\x8b\xe7\xcd\xe0\x0b\
+\x03\xa1\x51\x2b\x43\x72\x73\x32\x6a\xcd\xf9\xfd\x92\x40\x45\xe5\
+\xa3\x99\xc3\x51\xc1\xa8\xba\xfb\x18\x77\xef\xd7\x20\x2c\x9c\x8f\
+\x9e\xae\x5e\x6a\x51\x7e\xa6\xca\x9c\xf8\x92\x40\x71\xe9\xed\xda\
+\x98\x08\x9e\x40\xd5\xaf\xc1\xc5\xec\xeb\x88\x8c\x0c\x41\x4f\x77\
+\xaf\xfb\x6c\x5c\x69\x6e\x7c\x51\xe0\x54\x72\x7e\x70\xf2\xe9\xe8\
+\x7a\xbd\x5e\x8f\xbc\xfc\x5b\xe0\xf3\xf7\xf7\x49\xa5\x5d\xfc\xd9\
+\x78\xdf\x72\xe2\x0b\x80\xe6\x3c\x77\xbf\xad\x4c\x4d\xd2\x7b\x52\
+\x75\xfc\x1a\xd7\x2d\x28\xb9\x59\x0e\x1e\x2f\xa0\xee\x64\x42\xac\
+\x70\xb9\xe1\x05\x80\x34\xcb\xfd\xd2\x36\x2f\x87\x0b\x64\x8e\x18\
+\xfd\x33\x0c\x5c\x2f\xe9\xc4\x7a\x8a\xbd\x38\x3d\x35\xf1\xc6\x4a\
+\xe3\xbf\x80\x8e\x33\x74\x31\x63\xe7\xba\x42\x3b\x2a\x0f\x53\x3b\
+\x48\x18\xfb\x78\x05\xaa\x41\x47\xb1\x4f\xc2\x27\x8b\xe2\xf3\x40\
+\x4d\x34\x2b\x30\x70\xb3\x6d\x83\xbd\xc9\x04\x13\x73\x02\x13\x6e\
+\x26\xc8\xbf\xd8\x57\x71\x52\x14\x22\x4b\xe3\xf3\x80\x3a\x8e\x69\
+\x70\xb4\x99\x5e\xa5\x73\x9b\xc1\xb8\x23\xf1\xcd\x80\x91\x70\x4f\
+\x58\xf0\x21\xc7\x1a\xf1\xb9\xf9\x01\xce\x78\x2b\x11\xf5\x0d\x72\
+\x2d\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x42\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x09\x49\x44\x41\x54\x78\xda\x95\x96\x79\x4c\x14\x57\
+\x1c\xc7\xbf\x8f\xd9\x7b\x39\x76\xdd\xa5\x58\xc5\x22\xca\x26\x2b\
+\x45\x51\x11\x28\x1e\xa5\xde\x49\x5b\x82\xd9\x14\x8b\xc5\xfe\xd1\
+\x23\x46\xa2\xd5\xa6\x69\x2c\xf6\x50\x63\x13\xd3\xd6\xf8\x47\x4d\
+\x0f\xad\x02\x49\x43\x53\x31\x69\xb1\xa5\x47\xa4\xb4\xb6\xf5\xc0\
+\x03\x11\x96\x05\x3c\xb8\x44\x16\x5c\x84\x2e\x6c\x61\xd9\x19\x76\
+\xe6\xf5\xcd\xae\xac\x10\x2b\x81\xb7\x3b\x99\x7d\x33\xef\xf7\xfd\
+\xbc\xdf\x31\xbf\x59\x82\x09\xc6\x9a\xb5\xcf\x67\xb3\x53\x29\x40\
+\xd4\xf2\x9c\x12\xfa\x2f\x91\xe8\xf7\x94\x62\x06\x25\x92\x86\x8a\
+\xe2\x07\x67\xce\x54\xfc\x35\x91\x06\x99\x40\x7c\x2d\x13\xaa\xa0\
+\x90\x98\xb2\x04\xca\x26\xec\x0b\x2a\x7f\x68\xf0\x90\x2f\x48\x94\
+\xbe\x74\xfe\xec\x1f\xdf\x4e\x19\xb0\x72\xd5\x7a\x9e\x19\xab\x46\
+\xc5\x24\x89\x42\x94\xc4\x00\x24\x6c\xd4\xea\xfe\xbd\x8b\x55\x7f\
+\x93\x29\x01\x96\xaf\x58\x35\x97\x9d\x9a\x69\x40\x23\x28\xc2\xf3\
+\x7e\xa4\x24\xc7\x60\x44\xa0\xa8\x69\xe8\x86\xdf\x2f\x42\xa7\x51\
+\x04\x25\x08\xcd\xa8\xbe\x74\xe1\xe2\xa4\x01\x4f\x2d\xcd\x4c\x65\
+\xaa\x97\x47\x01\x7e\xbf\x04\xaf\x4f\x40\x53\xfd\x3b\xc0\x10\x0f\
+\x68\x94\x28\x2f\xb9\x80\x6d\xfb\xff\x84\x31\x4a\xc5\x3c\x22\x4b\
+\x6a\x6b\x2e\x5d\x9d\x34\x20\x35\x7d\x59\x0a\x13\xad\xf6\x09\x12\
+\x04\xd1\x8f\x30\x46\x3a\xba\x6f\x05\x56\x66\x5a\xe1\xe7\x45\x10\
+\x42\xc0\x85\xab\x71\xea\xbb\x6a\xbc\x75\xf0\x1c\xf4\x1a\x65\x9a\
+\xc3\x5e\x73\x65\xd2\x80\xf9\x0b\x97\xa4\xe8\x75\xfa\xea\xfc\xec\
+\x38\xcc\x8c\x09\xc7\xd2\xb4\x59\xd0\x46\x86\x43\x62\x61\xa2\xa3\
+\x86\x24\x0c\x61\x26\x1d\x96\xac\x3e\x86\x61\x7e\x24\xa1\xb1\xfe\
+\x5a\xcb\xa4\x01\x86\xb8\x05\x29\xf6\xf2\xbd\xd5\xb3\x22\x9b\x01\
+\x3f\xbb\x20\x82\x25\x99\xb0\x70\xb1\x89\x38\x18\x48\x2e\xc4\x61\
+\x70\x06\x23\xb6\xee\xac\xc0\xd1\x1f\xcf\x4f\x2d\xc9\xbd\x9b\xf5\
+\xe9\x86\x5d\x87\x2e\x12\x38\x59\xed\xab\x41\x7d\x2e\xc0\xeb\x0c\
+\x88\xb2\x1a\x0a\xad\x53\xe8\x14\x28\xfb\xd8\x7e\xd9\x56\xd6\x96\
+\x3e\x25\x80\x3c\xf8\xfa\xa3\x94\xf3\xdd\x84\xd4\x53\xc3\x56\x85\
+\x05\x85\xc9\xf8\xe5\x4a\x06\xa8\xfc\xfc\xfa\xef\x6b\x4f\xb6\xae\
+\x99\x32\xc0\xfd\xd5\x3a\x1a\x9e\x14\x0f\xa9\xbb\x8e\x69\x2b\x1f\
+\x36\x64\x96\x4a\x8e\xe0\xc0\x1b\xb5\x6f\xbe\xd7\xee\xf9\x74\xca\
+\x80\xa1\x2d\xe6\x42\xdd\xce\xdd\xaf\x0a\xb5\x25\x6c\xc6\xdd\xf7\
+\x62\xcc\xee\x55\x40\xdd\x2f\xdd\x58\x54\x74\xe7\x91\x1a\x8f\x04\
+\x58\x12\x93\x15\x3d\x3d\x7d\x67\x3a\x3f\x4a\x5b\xae\x99\x33\x13\
+\x70\x9e\x03\x15\x46\x98\x27\x41\x08\x91\x78\x0c\xdc\xe3\xf1\xf3\
+\xe0\x0b\xd8\x5e\x54\x76\x35\x76\x5a\xe4\xb2\x26\xc7\x35\x7e\x52\
+\x00\x8b\x35\xe9\x45\xb5\x4a\x75\xa2\xbe\x2e\xf8\xdc\xdc\x3b\xfd\
+\x19\xbc\x8d\x15\x88\x50\x0d\x40\xea\x6d\x83\x30\x2c\xb0\x3a\xde\
+\x00\xe3\x86\xc3\xd0\xea\x55\xa8\x73\x34\x20\x2b\x2b\x1b\x11\xe1\
+\x11\x9b\x1a\x1d\xb5\x27\x26\x04\x24\x58\xe6\x6d\x8c\x8d\x9d\x55\
+\xba\x29\x37\x17\x36\x5b\x16\xcc\x66\x73\xe8\x9e\xd7\xe3\x41\x55\
+\x8b\x0b\xab\x17\x59\xc6\x09\xec\xd9\x7b\x00\x95\x95\xbf\xe1\x1f\
+\x77\x9f\xfc\x44\xe7\x36\x35\xda\x4b\xff\x17\x30\xd7\x62\x4d\x36\
+\x99\xcc\xb5\xdb\xf2\xf3\x61\x6f\xa8\x47\xff\xc0\x10\x8e\x1f\x39\
+\x0c\x49\x14\x71\xa3\xb3\x07\xc5\x7d\x11\x50\xb3\xa4\x6a\x09\x45\
+\x81\x55\xc1\x3a\x86\x1f\x11\x11\xe1\x58\xb4\x38\x83\x6d\xc4\xc4\
+\xda\x89\x1f\xce\xee\x4e\xb9\xdd\xce\xbc\x75\xa3\xa1\xeb\x21\xc0\
+\xec\x78\x8b\xb0\x63\xc7\x0e\xa5\xd7\x3b\x8c\xf2\xf2\x72\x88\xac\
+\x99\xe5\xe6\xe5\xc2\x10\x65\xc0\x6b\xaf\xbc\x8c\x4f\x6a\x07\xe0\
+\x66\xad\xc3\x16\xa7\x43\x6a\x8c\x1a\xfb\x3e\x3c\x80\x2b\xac\xfd\
+\x78\x3c\xfd\x50\x28\x14\x2c\x3d\x84\x6d\xca\x03\x4f\x7f\xbf\xbf\
+\xb9\xb9\x49\x39\x0e\xf0\x44\xdc\x9c\xbc\xc4\xc4\x27\x4b\x6c\x36\
+\x1b\x0a\x8b\x8b\x58\xf9\x05\xef\x0f\x0e\x0e\x22\x27\x27\x07\xef\
+\xee\x7e\x1b\x55\xce\x61\x1c\x6b\xf2\xe0\x60\x86\x09\x26\xbd\x02\
+\xaf\x6f\xd9\x06\x87\xdd\x0e\x95\x5a\x1d\x0a\x07\xc7\x71\xe8\xe8\
+\xb8\xcd\x7e\x49\x9b\x5b\x5b\x6e\x7d\x13\x02\x44\xc7\xcc\x38\x5d\
+\x50\x50\xb0\xae\xc1\xd1\x08\xbb\xc3\x01\xa5\x42\x11\x30\x10\x04\
+\x01\xf3\x93\xe6\xa3\xb8\xe8\x08\x4a\x1c\x6e\xfc\xd4\x3a\x84\xf7\
+\xd3\xcd\x48\x8a\xd1\x20\x67\x63\x1e\x3a\xee\xdc\x09\x88\x3e\x78\
+\x36\x08\xbc\x43\x43\x72\x3e\x2a\x3a\xda\x5b\xd6\x87\x00\x73\x12\
+\xac\x74\x57\x41\x01\x8a\x0b\x8b\x59\xcf\x09\x76\x4b\x79\xc8\x71\
+\x4d\x4e\x5e\x88\xa2\xe3\x5f\x60\xcf\x59\x17\xaa\xbb\x86\xb1\x7d\
+\xb1\x11\xcf\x5a\xa2\x10\x3f\xd7\x8a\xe8\xe8\xe8\xd0\xda\xd1\x80\
+\x50\x2a\xa2\xcb\xd9\x09\x67\xe7\x6d\x12\x02\xcc\x4b\x5c\x40\xf3\
+\xf2\x36\xa3\xf4\x64\x29\xd4\x63\x5c\x96\xdf\x05\x3e\x9f\x8f\x85\
+\xa2\x06\xcf\x7c\x7d\x2b\xd0\xe3\x32\x67\xeb\xb1\x3f\x73\x06\xe2\
+\x13\xac\x30\x9b\x4c\x0f\xd5\xbd\xec\xd1\xed\xf6\x36\xdc\xed\xee\
+\x7c\x00\x58\x9c\x92\x4e\x9f\xcb\xca\xc2\x0f\xa7\x4e\x05\x12\x36\
+\x2a\x2e\x8f\xde\xde\x5e\x74\xb4\x37\x23\xee\x50\x1d\x8c\x1a\x0e\
+\x71\x31\x3a\x14\x66\x70\x48\x7d\x7a\x3d\x8c\x46\xc3\x38\x0f\xe4\
+\x16\x2e\x49\x7e\xb8\x5c\x2e\x74\x8d\xf5\x60\x9a\xe9\xb1\x2f\xa3\
+\xa2\xa2\xb6\x0a\x23\x22\xf4\x3a\x2d\x38\x06\xd1\x6a\xb4\x01\x23\
+\x8f\xdb\x0d\x7b\xcb\x75\xc4\x1e\xba\x89\x48\x35\x07\x37\x4f\xd1\
+\x9f\x1f\x0d\xcb\xc2\xa5\xd0\xb2\xb5\x72\x18\xe5\x5c\x05\x0e\x9e\
+\x87\xc4\xaa\x8f\x70\xa4\xac\xc7\xd5\x65\x1b\x57\xa6\x26\xf3\x74\
+\x0d\xdb\x77\x1e\xfb\x9b\xb0\x8e\xbd\x85\x67\xb3\x17\x7e\x5a\x20\
+\x0f\x23\x23\x88\x9e\xfe\x38\xfa\x84\x30\x28\xd9\x6a\x56\xa9\x88\
+\x37\x28\xd1\xd2\xd6\x0e\x95\x52\x39\xc0\x76\x5d\xc5\xbc\x68\x65\
+\x4a\xac\x7c\xc8\xaf\x7d\xbd\x77\xeb\xc7\x86\xec\x3f\xfa\xf2\x38\
+\x37\x63\x06\xcd\x61\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x05\xac\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x73\x49\x44\x41\x54\x78\xda\x9d\x56\x6b\x4c\x53\x67\
+\x18\x7e\xbe\xd3\x73\x5a\xda\x52\xb0\x48\x71\x85\xa1\x30\x44\x14\
+\x32\x71\x6e\x28\xa8\x13\xa6\x83\x29\xba\x65\xf1\x87\x92\xcc\x6d\
+\xce\x6d\x11\x31\x8e\x39\x75\x73\x78\x89\xd1\x4d\x4d\x66\x9c\x97\
+\x71\xc9\xb2\x2d\x6e\xc6\x05\x2f\x71\x31\xcb\x50\x47\xb4\xcc\x1b\
+\xb7\x2a\x97\xcc\x2e\x28\x20\x82\xa5\xc8\x1d\xb1\xb4\xf4\xf4\x9c\
+\xb3\xef\x1c\x04\x35\xc2\x0c\x7b\x93\xa6\xcd\x39\xdf\xf7\x3c\xef\
+\xfb\x7c\xef\xf7\xbc\x25\xf8\xaf\x88\xdb\x9f\x08\x41\x4c\xd3\x06\
+\x05\xa6\xbb\x7a\x7a\x9f\x78\xa5\xf5\x37\xc0\xd5\xda\x9e\x07\x15\
+\x93\x8f\xf2\x4f\xff\x1a\x09\x82\x0c\xfb\x34\xfe\x50\x2c\xdc\x9e\
+\x72\xed\x73\x26\x2e\x74\x5a\x18\xc2\xa2\x83\x10\x18\xa0\x83\x4e\
+\xcf\x2a\x5b\xfa\x9c\x3c\xda\x3b\xfb\xd0\x60\x6b\x45\x53\x65\x03\
+\x5c\x2d\x6d\x3c\x7c\xd4\x71\x28\x59\x5b\xf5\x4c\x02\x32\xf3\x50\
+\x36\x08\x9b\x11\x9f\x96\x80\xa8\x18\x13\xf4\x7e\x2a\x10\x81\x40\
+\x92\x24\x88\x12\xa1\x1b\x24\x65\x17\x43\xe8\x2f\x95\x04\xe7\x7d\
+\x01\x35\x37\xda\x50\x92\x5f\x0c\x48\xde\x1c\xa9\x74\xed\x9a\x11\
+\x09\x98\x84\xdc\x63\x86\x10\xd3\xd2\xd4\x77\x5f\x81\xd9\xac\xa7\
+\x6f\x29\x98\x8c\x47\x57\x89\x94\xc4\xc5\x03\x06\x1f\x49\x7e\x34\
+\xf0\x91\x1e\x22\x50\x62\x87\xc3\x89\x82\x23\x56\xf4\xda\xdb\x8e\
+\x8b\xc5\xab\x97\x3d\x45\xa0\x4e\xfa\x21\xdb\xd7\x64\xcc\x78\x27\
+\x23\x01\x63\xc6\x68\x20\x09\x22\x05\x94\xd0\xe6\x12\xd1\xd1\xcf\
+\xa3\xf6\x5a\x87\xb2\xce\x7f\xa2\x11\x1c\x55\xca\xc0\x31\x08\xf2\
+\x65\x61\xd2\xa9\xa0\xe5\x68\x65\x2a\x06\xdd\xdd\xfd\x38\x9a\x53\
+\x8c\x07\x6d\x5d\x39\x9e\xa2\x8f\xd6\x0c\x11\xe8\x17\xfc\x1c\xeb\
+\xe5\x51\xb9\x62\xd3\x7c\x84\x05\xe9\xe1\xe4\xbd\xa8\xed\xf4\xc2\
+\xe1\x14\xc0\x78\x05\x34\xdf\xec\x40\x71\x66\x0c\xde\x3e\x5a\x0f\
+\xb5\xd9\x4f\x49\x5d\x52\x8a\x93\x68\x0f\x00\x66\x4a\x34\x31\x80\
+\x85\x9e\x32\x37\xb4\x3a\x71\x78\xcf\x79\xb0\x1c\xa6\x39\xcf\xbe\
+\x5f\x45\x06\xb2\x3f\xec\x49\x7e\x6f\x06\x97\x32\x3b\x18\x0d\x1d\
+\x1e\x0a\xee\x51\x34\xa6\xa2\xa3\xb1\xb6\x13\x27\x96\x47\x20\x22\
+\x50\x87\xd8\xbd\x55\x88\x9c\x3a\x8e\xca\x25\x3d\x71\x6e\xa2\x4c\
+\x48\xe5\x8c\x0c\xd0\x60\x82\x91\xc3\xb9\x2b\xcd\x28\xfc\xa5\x8c\
+\xf7\x14\xad\x50\x13\xc3\xa2\xfc\x44\xd6\xe0\x53\xf4\xd5\xb6\x24\
+\xd8\xda\x3d\x68\xa5\x59\x73\x2a\x02\x2f\x4d\xcd\x56\xd1\x82\x53\
+\x2b\x23\x11\x39\xce\x57\x01\x0a\xdf\x52\x8e\xf0\x29\x01\x50\x09\
+\x0c\xa0\x1a\x3c\xb8\x47\x5f\x12\x4d\x28\x6a\x82\x1f\xa6\x8c\xe5\
+\xb0\x65\x47\x11\xbc\xbd\xee\x24\xe2\xfb\xe6\x89\xdc\x99\x0b\x26\
+\xa5\x27\xbf\x3a\x1e\x37\x5a\xdd\x54\x5f\x06\x02\x95\xa5\xe4\x62\
+\x23\x4e\xaf\x99\x8c\xa8\x20\xff\xa1\x4c\xcf\xd7\x77\x41\xcf\xaa\
+\x20\xe2\x61\x05\x72\x57\x31\x03\xf0\x1a\x7a\x2e\x5f\x9c\x71\xc0\
+\x1c\xee\x8f\x98\x40\x35\x0a\x2f\x35\xa2\xf4\xec\xcd\x3c\xa2\x5d\
+\x7c\xb2\x7e\xf5\xc6\xd9\xe1\x4e\xc2\x82\xa5\x99\xb7\xdc\x7d\x80\
+\xaa\x0a\x3b\x7e\xff\xe4\x45\x4c\x36\x1b\x30\x9a\x98\xf7\x7d\x0d\
+\xa6\xc4\x8c\x85\x20\xd0\x73\x85\x17\xb9\xdf\x5c\xb9\x4d\x34\xa9\
+\x27\xa5\xcc\x1d\xf3\xa9\x24\x40\xb3\xbd\x17\xd7\xaf\xd6\xc1\xb2\
+\x25\x0e\xc1\xfe\xfa\x51\x81\xcb\x31\x37\xf7\x06\xe2\x5e\x0a\xa6\
+\x04\x22\xd4\x3e\x0c\x0e\x6e\xbb\x00\x32\x76\xc5\x59\x29\xf3\xf3\
+\x59\x68\xa8\xeb\x86\xf5\xc2\x3f\xa8\xda\x97\x32\x6a\xe0\xc1\x88\
+\xd8\x5e\x86\xe5\x4b\x26\xa1\xbf\x5f\x80\x56\xcb\xe1\xd0\xde\xab\
+\x20\xa6\x8f\x2d\xd2\xfa\xf5\x71\xb0\xfc\x59\x8b\x7b\xf6\x2e\x54\
+\xec\x49\xfa\xdf\x04\xe4\xad\x02\x2c\xdd\x10\x8f\x18\x5f\x06\xac\
+\x46\x85\x83\xdf\x55\x80\xf8\xad\xb4\x48\x5f\x67\xcd\xc0\xb5\x76\
+\x2f\x2a\xad\xf7\x80\x26\x3b\xca\x76\xcd\x06\xc7\x70\xa3\x27\x58\
+\x74\x1a\x8b\xd7\xcd\x85\x1f\x2b\x22\x21\x54\x8b\xcd\xbb\xca\x68\
+\x05\xab\x2e\xd6\xa7\xa6\x45\x87\xf7\x78\x08\x34\xb4\xac\x9a\xea\
+\x16\x85\xc4\xba\x7b\x0e\x54\x84\x1d\x1d\x41\xf2\x71\x2c\xdb\xba\
+\x10\x6e\x97\x07\xd4\x0c\x50\x90\x6f\xbb\x4d\x82\x3f\x2b\xc9\x8d\
+\x98\x19\x92\x1e\x12\xac\xa7\x7d\x0c\x70\xb4\xdf\xfe\xb6\xb6\xe0\
+\xce\x65\x1b\x5a\x7f\x5d\x04\xf6\x31\x92\x1d\x05\xb7\xa0\xa3\x96\
+\x20\x1b\x1f\x61\x1e\xba\x0c\xbd\x90\xf2\x95\xd0\xeb\x39\xac\xda\
+\x68\xc1\xf2\xfd\x4b\xe0\xa5\xd6\x62\x6f\x76\xa2\xae\xd4\x9e\x47\
+\xc6\x6f\xb2\x26\x6a\x8d\xba\xa2\x39\xaf\x85\xc0\xe3\x11\x14\x63\
+\x93\x49\xac\xa5\x2d\x68\xbc\x64\x43\xfe\xf6\x04\xa4\x44\x05\x0d\
+\x69\xfc\xac\xf8\x60\xeb\x1c\xe5\xd2\x5d\xb6\xd8\xe1\xea\xea\x4b\
+\x52\xd2\x08\xfd\xf2\xba\x27\x3e\x39\x94\x0b\x30\xa8\xa9\xb7\x48\
+\x0a\x89\x9a\x92\x54\x56\x77\xa0\xec\xc8\x65\x9c\x3e\x98\x8c\x85\
+\x51\x26\x85\x60\xdd\xb7\x29\x70\xf7\xba\x87\x05\x97\x2b\x93\x6f\
+\x73\xe7\x7d\x0f\x4a\x0a\x9b\xf8\xa6\xdd\xd3\xd5\x0a\xc1\x0b\x3b\
+\xab\x63\xc1\x71\x95\xa9\x0b\x9f\x87\xe8\x1d\x58\x48\x28\x0b\xa7\
+\x66\xd0\xd4\xee\xc6\xa9\x7d\x25\xb8\xf6\xe3\x5c\xbc\xfc\xe1\x45\
+\xac\xa7\x6d\xdc\xd7\xe3\x1a\xfe\x0c\xe8\x1e\x86\x2a\x5a\x70\xe6\
+\x2e\xc0\xf3\xd3\xea\xb7\x4e\xad\x1a\xb2\xeb\x89\xbb\x6c\xd9\xfe\
+\x66\x5d\x46\x72\x7c\x20\x1d\x66\xa2\xe2\x96\x8a\x5c\x9c\x0a\x77\
+\x3a\x78\xfc\xb6\xf3\x0f\xf0\x9a\x31\xc8\xa2\xd5\x38\x7b\xdc\xc3\
+\x80\x83\x0e\x35\x06\x85\x25\xed\xe8\x71\xf4\xe5\xd4\x66\x45\x3f\
+\xb2\xeb\xc1\x88\xdc\x5b\x73\xcc\x68\xd6\x2d\x9d\x37\x3d\x40\x71\
+\x4c\x41\x1a\x90\x8b\xa5\xfe\xd4\xcd\x13\xe4\x65\x59\xb0\xf9\xc0\
+\xeb\x70\x3b\x3d\x4f\x80\xab\xe4\xcc\xa9\xcd\x5c\xb8\xde\x89\x2e\
+\x47\xdf\xf1\x5b\x1b\xa2\x9e\x1e\x38\x83\x31\xe9\x40\x5d\x36\xe7\
+\xc3\x64\xcc\x9a\x61\x44\xb0\x41\x03\xde\x2b\x8f\x4a\x6a\x67\xb4\
+\x6b\x5c\xb4\x32\x1f\xaa\xaa\x4c\xae\xc8\x21\x57\xc8\x12\x34\xf7\
+\xf6\xe3\x6a\x59\x17\x78\xb7\x98\x73\x33\x33\x62\xe4\x91\x39\x18\
+\xd1\x79\x0d\xb1\x5e\x51\x2a\x37\x06\x68\xb8\xc8\x09\x3e\x30\xfb\
+\x73\x30\xc8\x76\x09\x69\x48\xba\x5e\x6a\x07\x8e\x1e\x1e\xb7\xee\
+\xb8\xd1\xd5\xd9\xcf\xb3\x0c\x89\xb3\xa5\x87\x3d\x7b\xe8\x3f\x1e\
+\x53\x7f\x6a\x4c\x14\x44\x92\x46\xaf\xc7\x1b\xb4\x8a\x70\xad\x6e\
+\x60\x08\xb8\xfa\x04\x39\xfb\xdb\xb4\x1d\xcf\xa9\x18\x29\xbf\x7a\
+\xe5\xf8\x11\xff\xb6\xfc\x0b\xbb\x43\x3a\x29\xef\xa2\xaa\xea\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x4d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x14\x49\x44\x41\x54\x78\xda\x85\x56\x0b\x50\x14\x75\
+\x18\xff\xed\xed\xdd\xb1\x70\x70\x1c\xdc\x9d\xc0\x9d\x81\x27\x28\
+\x06\xe9\xa1\x08\xbe\x32\x68\xc8\x64\xc8\xa9\x99\xa6\x4c\x1b\x75\
+\x18\xb4\x54\xcc\xca\x6a\x6c\xa6\x72\xa6\xc6\x9a\x09\x93\x1e\x26\
+\xa0\x65\x82\xcf\x51\x4c\x47\xcd\x17\x2a\x06\x09\x22\x20\xca\xa9\
+\x90\x2f\x3c\x40\x10\x95\xc3\xe3\xb8\x07\xf7\xda\xdd\xfe\x7b\xc8\
+\xe5\x04\xda\xb7\x7b\x33\x3b\xff\xfd\xf6\xfb\x7d\xcf\xdf\x77\x14\
+\x9e\x22\xa1\xb3\x36\xa6\x71\x2c\x3f\x8f\x65\xd9\xd9\x1c\xc7\xeb\
+\x02\x82\x03\x7d\xe7\x2e\x5b\x3f\x44\x22\xca\x48\xd3\x74\x99\x88\
+\xa6\xf6\x58\x4e\xbd\x57\xf9\x24\x1b\xd4\x70\x87\x8a\xcc\x22\xbd\
+\xdb\xe9\xae\x0f\x19\xa1\x94\x44\x8f\xd3\x60\x64\xac\x1a\x61\xa1\
+\x0c\x98\x00\xa9\xef\xbd\xd3\xe5\x86\xd9\xe2\x44\x47\x4b\x37\xda\
+\xaf\xdd\x85\xf5\x41\x8f\x47\xca\x48\x53\x7a\x4f\x2c\x37\xfc\x2f\
+\x40\x58\x66\x51\x01\x28\x3a\x37\x25\x33\x09\xba\x38\x35\x98\x20\
+\x09\x44\x44\x8d\x03\x0f\xe1\x1e\xfc\x6a\xf0\xcc\xe9\xf0\xc0\x78\
+\xab\x1b\xf5\x27\x1a\xc9\x7b\xb6\xd0\x7c\x62\xf9\x8a\x27\x02\x84\
+\xcd\xfe\x75\x6f\x88\x46\x31\x37\x23\x6b\x02\x54\x11\xc1\xe0\x79\
+\xca\xaf\xe4\x7b\x12\x3d\x52\xe4\x06\xb0\xfc\x78\x14\x0f\xd3\x7d\
+\x1b\xca\x8f\x5d\x86\xf5\x6e\x6f\xa9\xb9\xec\x9d\xb7\x86\x00\xa8\
+\x5e\x2d\x29\x90\xa9\x82\x73\x5f\x9f\x9b\x82\x50\x39\x03\xd6\xcb\
+\xc1\xc1\x71\xb0\xf4\xb3\x78\xe8\x60\x61\xf5\x70\x60\x59\xc1\x18\
+\x40\xd3\x40\xb0\x58\x04\xa5\x8c\x86\x82\x11\x23\x50\x44\x91\xa0\
+\x45\xe8\xeb\x73\xe2\xc0\xbe\x7a\xd8\x4d\xb6\x42\xd3\xe1\xec\x15\
+\x7e\x80\xa8\x37\x77\xe8\x3d\x2c\xdf\xb8\x20\xe7\x79\x04\xc9\x83\
+\x71\xd7\xc2\x82\x14\x15\x8c\x84\x42\x77\xbf\x8b\x78\xca\x43\x25\
+\x63\x60\x75\x7b\x60\x77\xb1\x42\x81\x7d\xee\x73\x3c\x4f\xf4\x00\
+\xb5\x4c\x8c\x18\xb9\x18\x0c\x01\xbb\xf7\xc0\x8a\xdd\x5b\xab\x20\
+\xa1\xa9\xa4\xae\x7d\x0b\x0d\x3e\x00\xf5\x6b\xdb\xdd\xe9\x73\xf4\
+\x92\x19\xc9\x5a\xdc\xea\xee\xc7\xda\x19\x11\x50\xc8\x24\x38\xd7\
+\xda\x87\x82\x4b\x16\xf0\x62\x60\x5c\x78\x20\xd4\x81\x22\xd4\x74\
+\x38\xe1\x25\x97\x90\xbe\xc1\xf0\x79\x01\x8c\x20\xc6\x28\x24\xd0\
+\x86\x4a\x51\xdd\xd0\x89\x8a\x23\x06\x4f\xf7\xa1\x45\x52\x4a\x3b\
+\xbf\x34\x4d\x2a\x13\x57\xac\x5a\x3a\x13\x2d\x66\x2f\xee\xf4\x3a\
+\x51\x30\x2b\x12\x91\x0a\x06\xe5\xb7\x7a\xf1\xdb\xe5\x3e\x88\xc5\
+\x14\x26\xaa\xa4\x58\x35\x3d\x02\xed\x3d\xfd\xc8\xaf\xeb\xf1\xa5\
+\x4d\x14\x40\x93\x68\x44\x3e\x04\xfe\x51\x44\xe1\x0c\x8d\xd8\x30\
+\x09\x7e\xd8\x7c\x16\x6e\xbb\x37\x9d\x8a\x9c\x5f\x5a\x34\x65\x86\
+\x6e\xd9\xd4\x94\x51\x68\x79\xe8\x86\xad\xcf\x85\x7c\x02\xa0\x09\
+\x0b\xc4\xc9\xeb\x3d\xd8\x79\xd5\x86\x00\x46\x82\xf8\x60\xe0\x93\
+\x34\x8d\xbf\x21\x4e\xde\x78\x88\x5d\x8d\x66\xf0\xa4\x20\x32\x99\
+\xd4\x97\x6c\x9e\x00\xb0\xe4\x17\xab\x64\x70\xbe\xbe\x15\xb5\xd5\
+\xc6\x4d\x54\xc4\xdb\xbf\xdf\xce\xce\x4e\xd1\xd9\x79\x29\x84\xd4\
+\x3e\x30\x3b\x90\x9f\x11\x05\x8d\x32\x10\xa7\xae\x9b\xb0\xe9\xa2\
+\x05\x2e\xd0\x50\x53\x1e\x14\xcf\x1b\x33\x64\x66\x8a\xeb\xba\x70\
+\xa8\xd9\x02\x35\x71\x28\x48\x16\xf0\xa8\x36\x80\x8c\x72\xa3\xa4\
+\xa4\xde\x48\xa9\xe7\xed\xe3\x97\xe4\xa6\xc1\x45\xba\x84\x22\x2d\
+\x72\xbf\xdb\x86\xbc\x0c\x12\x81\x32\x08\x85\x7f\xb5\x63\x43\xb5\
+\x19\x72\x65\x30\x22\x79\x1b\x0e\x2f\xd5\x0f\x3b\xad\xf6\x7e\x0f\
+\xf2\x2a\xdb\xd1\x74\xcf\x83\xa8\xc8\x10\x52\x6c\x09\xa4\x34\x85\
+\x2d\x85\x95\xa0\x46\x2d\x3f\xca\x67\x67\x4f\x43\x3f\x51\x0a\x20\
+\x5d\x53\xdb\x6c\xc2\x4f\x59\x5a\xc4\x6b\xe4\x28\xa8\x68\x43\x51\
+\x9d\x19\xe1\x4a\x39\x42\x1d\xbd\xf8\x63\xe5\xa4\xa7\x31\x0b\xfe\
+\xee\xb4\xe2\xe7\xea\x0e\xb0\x74\x00\xb4\x31\xe1\x28\xde\x5a\x03\
+\x2a\xee\xc3\x33\x7c\xce\x82\x64\xb0\x6e\x2f\x6e\x9a\x59\x9c\xad\
+\x6f\xc3\xb1\x25\x71\x18\xa7\x55\x60\xe3\x19\x23\x36\x13\x00\x55\
+\x84\x02\x52\xb3\x09\x65\x1f\xa5\x3e\x15\xe0\xce\x43\x3b\x56\xee\
+\x6a\x42\x44\x64\x38\x46\xc7\x45\xe0\x97\x62\x02\x30\x72\xc5\x69\
+\x7e\xf5\xbb\x53\xd0\xd8\xe5\x80\xc5\x05\x5c\xb9\xd8\x86\x43\x8b\
+\x09\xc0\x33\x61\xf8\xb1\xec\x26\xb6\x36\xf4\x21\x72\xa4\x12\x6c\
+\x47\x3b\xca\x3f\x7b\x61\x58\xc3\x2c\xcb\x21\x77\x9b\x01\xbb\xca\
+\xdb\xa1\x4f\x8b\x47\x62\xac\x0a\xe3\x47\x30\x58\xb7\xb9\x16\xd4\
+\xe8\x0f\xfe\xbc\x9d\xf1\x4a\x82\x8e\x0c\x21\xa4\x12\x1a\x75\x35\
+\xb7\x70\x60\xf1\x18\x24\x44\x87\x63\xfd\xb1\x6b\xd8\x71\xc9\x06\
+\x4d\xb4\x0a\xfd\x2d\x46\x54\x7c\xf9\xe2\x10\xe3\xeb\x8f\xdf\xc0\
+\xd7\xdb\x0d\x88\x4e\x1c\x8d\xe4\x69\xb1\xf0\x92\x61\x64\xbd\x3c\
+\x82\x19\xa0\xfc\x68\xb3\x91\x8a\x5f\x5d\x55\xa4\xd3\x6b\x97\x45\
+\x8d\x08\x01\x45\x7a\xba\xba\xe2\x1a\xf6\x2f\x1e\x8b\xc4\x18\x25\
+\xbe\x3b\xd2\x8c\x9d\x8d\x36\xc2\xa6\x11\xb0\x18\xae\xa3\xea\xdb\
+\x97\xfd\x86\x8f\x5c\xe8\x40\x76\x7e\x35\xe4\x1a\x15\x52\x33\xc6\
+\x43\x46\x0a\xcb\x91\x48\x84\x56\x15\x26\xbd\x8b\x4c\xb4\xd1\xd0\
+\xb9\x89\x4a\x58\x73\x3e\x2d\x28\x94\xa9\x48\x9d\x3a\x4a\xe0\x30\
+\x9c\x39\x71\x15\xfb\x73\xe2\xf1\x9c\x4e\x85\xbc\x83\x57\xb0\xfb\
+\xaa\x03\xba\xb1\x1a\xdc\xbf\x70\x05\x35\xeb\xb2\x60\xb2\x39\xf1\
+\xd2\x17\xa7\xd0\x6a\x72\x63\xe6\x9c\xc9\x88\x8e\x0e\x83\xc7\xcd\
+\xfa\x0c\x0f\xb2\x9b\x2f\x13\xe7\x5b\xe1\xb0\x38\xd3\x7d\xd3\x9e\
+\xb0\xa6\xd6\x9d\x3c\x23\x46\xa2\x54\xc8\x70\xfc\x48\x23\x4e\xae\
+\x9c\x80\xe8\x11\x72\x7c\x7f\xb4\x09\xdb\x2e\x58\x31\x3a\x91\x50\
+\xc8\xe9\xf3\x98\x9c\x34\x12\x25\xdb\xce\x61\xe6\xc2\x4c\x4c\x4e\
+\xd5\xc1\xed\xf2\xfa\xbc\x7e\x5c\x04\xef\xfb\xec\x4e\x34\x54\xb7\
+\x79\x9a\xd7\x4e\x91\xfa\x00\x26\x7c\x73\x51\x2f\x92\xd2\x8d\x19\
+\xe9\x71\x68\xa8\xbf\x8d\x8a\x4d\x07\x07\x28\x93\x67\xf1\xc6\x9a\
+\x45\xd0\x6a\xc3\xb1\xe5\xab\x52\xe8\x52\x9e\x45\x46\xd6\x78\xd0\
+\xc4\x88\xc0\xb6\x7e\xaf\xfd\xb4\x4d\xf9\x22\xa8\xac\x32\x82\x73\
+\xb3\x49\x97\x3f\x9f\x64\xf0\xd3\x75\x52\x9e\xa1\x40\xa1\x96\xe5\
+\xce\x4c\xd1\x92\x54\x89\x06\x46\x9f\xd0\xb3\xc7\xe5\x21\xc3\xc9\
+\x41\x2c\x91\x80\xe7\x58\x78\x3d\x43\x0d\xfb\x8c\x8b\x06\x52\x53\
+\x73\xe9\x1e\x7a\x4d\xf6\xc2\xc6\x4f\xf5\xff\xd2\xf5\xa0\x4c\xcc\
+\x6f\xda\x1b\xa6\x0a\x9a\x3b\x65\xbc\xda\x47\x60\x02\x43\x0e\x63\
+\xeb\x3f\x5e\x0f\x6c\x37\xe1\xa1\xf6\x4a\x37\xcc\x26\x47\xe9\xa5\
+\x8f\x13\x87\x2e\x9c\x41\x49\xde\x70\xa3\x40\xcc\x50\xb9\x93\x13\
+\x55\x50\x85\x90\xc5\x43\x08\x5f\xe0\x96\xe1\xd2\x21\x70\x17\x4d\
+\x3a\xcf\x64\x75\xe2\x42\x93\x09\x5e\x27\x5f\xd8\xf0\xfe\xd8\x27\
+\xaf\xcc\x41\x49\x2d\x6a\xd1\x93\xbe\xa8\x57\xc8\xa5\x92\x51\xda\
+\x20\x02\x24\x85\x2c\x40\xec\x8f\x46\xf0\xda\x4e\x0a\x6c\xb2\xba\
+\xd1\xda\xe9\x40\x6f\x9f\xdb\x43\x83\x4a\xa9\x5b\x1e\xfb\xff\x4b\
+\xff\x71\x99\xbe\xd5\x98\xc6\x71\xd4\x3c\x92\xaa\xd9\x24\x0a\x1d\
+\x43\xb8\x5e\x10\xa7\x93\x15\xbc\x37\x92\xd4\x94\x89\x44\xfc\x9e\
+\x73\x39\xba\x27\xfe\x6d\xf9\x07\xd6\xcb\x98\xf3\x74\x38\x42\x50\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x0e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xd5\x49\x44\x41\x54\x78\xda\xcd\x95\x5d\x6c\x53\x65\
+\x18\xc7\xff\xe7\xb4\x1d\xb6\xdb\xba\xba\xaa\x24\xab\xc1\x8f\x28\
+\xde\x79\x8d\x24\x92\x18\x12\x8d\x3a\x13\x03\x17\xc4\x8d\xc9\x20\
+\xca\x60\xd9\x14\xe2\x8d\x17\x1a\x4d\xe4\x4a\x85\x18\xc1\xf8\x71\
+\x01\xc8\x56\x14\x19\x16\x19\xfb\xe2\x62\x46\x50\xf1\x23\xf1\x66\
+\xc6\x8f\x6c\x38\xba\xae\x9d\x5b\xd7\xb1\xf6\x74\xe7\xbb\x7d\xfd\
+\x9f\x9e\x2e\x21\xe2\xca\xea\x8d\xb6\x79\xf2\xbc\xe7\x9c\xf7\x3c\
+\xbf\xe7\xff\x3e\xcf\xfb\x1e\x09\x15\x7e\x6f\xbc\xfe\xe6\xa6\x50\
+\x28\xf8\x95\x24\x04\x54\xcd\x80\x69\x99\xb0\x2c\x03\xa2\x50\x2c\
+\x3d\x1f\x1b\xfb\x79\x67\xec\xfc\xe9\xe3\x95\x62\x48\x15\x82\x37\
+\x33\x78\x7f\xd7\x8b\x1d\xa5\x6b\xe1\x98\x28\xc2\xb6\x8a\x28\xd2\
+\x2b\xb9\x3c\x5e\x79\xf9\x55\xa4\xe7\xd2\x6d\x84\xf4\x56\x05\x60\
+\xf0\x1d\x6b\x6f\xbf\xe3\xf8\xf3\x9d\x3b\xa0\xeb\x1a\xe6\xd2\x19\
+\x58\x85\x02\x0a\xb6\x0d\x43\xd7\xa1\x2e\xa9\xd0\x4d\x0b\xf5\xf5\
+\xb5\x38\x7c\xf0\x08\xb2\x8b\xd9\x6e\x42\x8e\xac\x1a\x70\xb2\xb7\
+\x4f\x3c\xfa\xd8\x23\x08\x35\x86\x90\x48\xcc\x20\xfe\xc7\x24\x86\
+\x06\x46\x90\x9a\xfe\xf3\xdb\x50\xa8\x6e\xe3\x86\x87\x37\xa0\x69\
+\x5d\x04\xa6\x6e\x22\x39\x9d\xc2\xc8\xe0\xf0\xdc\xa9\xbe\xe8\xda\
+\xaa\x00\xcf\xb4\x6e\x45\x7a\x3e\x83\xdf\x7e\xf9\x1d\x67\xcf\x0c\
+\x9d\x3c\xf4\xee\x81\xd6\xe5\xe7\x8f\x6f\x7e\x2a\xda\xb9\x6f\x4f\
+\x8b\x80\x0c\xd9\x23\xa3\xe7\xe8\x09\x10\x20\x55\x0d\x48\x26\x53\
+\x18\x1e\x18\xc5\x73\x1d\x6d\x37\xcc\xeb\xda\xbb\x4f\xb4\xef\x6e\
+\xc7\xf8\xf8\x04\xce\x7e\x16\xab\x0e\xd0\xd3\x73\x46\x6c\xdf\xbe\
+\x05\x93\xf1\x38\x06\xcf\x8d\xa2\xeb\x85\x5d\x37\xcc\xeb\xee\x7c\
+\x49\x74\xed\xdf\x8b\x4b\x5f\x5f\xc6\xf0\xb9\x01\xf4\xc5\x3e\xad\
+\x0e\xb0\xad\x95\x80\xab\x09\x0c\x5e\xb8\x8c\xfd\x7b\xb6\xfd\x23\
+\x60\x77\x77\x07\x2e\x5e\xfc\x06\x5f\x0e\x8f\xfc\x4f\x00\xd1\xa7\
+\xef\xeb\xbf\x7b\x63\xa4\xd9\x2f\xdb\x10\x6a\x1e\x12\x37\x55\x8d\
+\x07\xf0\xf0\x2f\x17\x2c\x80\x6d\x2a\x17\x6d\x78\x0d\x1d\x1e\x4b\
+\x81\x30\x35\x78\xb9\x41\x9c\x39\xc2\xe7\xc5\xe2\xac\x7d\x69\xfd\
+\x69\x6c\xaa\x04\x10\x2d\x31\xb6\xb3\xf6\x13\x60\xa8\x80\xa2\x81\
+\x4d\xcf\x6b\xa3\xec\x15\x60\x89\xf7\xb4\xbc\x7b\xad\xd0\xdb\x7c\
+\x56\xdb\x08\x6c\x6e\xc7\xcc\x47\xef\xa1\xe9\xad\x84\xb4\x22\xe0\
+\xe3\xe6\x7b\xc5\xb3\xfd\x83\x40\x76\x8a\x81\xae\x30\x50\x8a\x81\
+\x16\x00\x3d\xc7\x31\x81\x2a\x7d\xde\xf1\x8a\xeb\x75\x02\x0c\x02\
+\xea\xfc\x40\x30\x80\xd4\x77\x71\x44\x3e\xb0\x56\x06\x9c\x78\xf2\
+\x2e\xd1\x76\x3e\x0a\x4c\x8d\x03\xb9\x34\x2d\x43\x9b\x63\x30\x9a\
+\xc9\x8c\x03\xb5\x5c\x8f\x5b\x00\xbf\x8f\x59\xaf\xe1\xd8\xe7\xaa\
+\x03\xef\xd5\xf8\x91\xea\xfd\x04\x91\x77\xd2\x95\x14\xdc\x43\x05\
+\x03\x0c\x7a\xb5\xbc\x0c\xcc\x58\x57\xdc\x8c\x1d\x15\xf9\x2c\xc7\
+\x84\x2a\x54\x95\xa7\xa9\xd7\xa8\x80\x16\x08\x00\x8d\x41\x2a\x98\
+\xa2\x02\x73\xb5\x0a\x66\x69\xf3\x65\x05\x54\x63\x50\x41\x6d\xa0\
+\x94\x69\x49\x41\x80\x59\xaf\x71\x14\x98\xd5\x2a\x60\x0d\x14\x2a\
+\x60\x17\x95\xb2\x2e\x29\xe0\x58\x2b\x2b\x58\x9a\x77\xc1\x8e\x8a\
+\x25\x9a\xb1\xe0\x82\xc3\x0d\x48\x7d\x9f\xb8\x49\x0d\x9e\x58\x27\
+\xda\x62\xc7\x80\xf8\xaf\xc0\x22\x0b\x7c\x8d\xd9\xe7\x1c\x9f\x64\
+\xb7\xb0\x7b\xc2\xb7\x01\x0d\xb4\x70\xa3\x6b\xc1\x20\x01\x0c\x61\
+\x50\x89\x44\x05\x87\xdf\x46\xe4\x50\xf2\x66\x0a\x86\x5c\x05\x5a\
+\x59\x81\xe3\x4b\xc6\xec\x95\x45\x57\x41\x96\x4b\xa6\xb0\x16\xf9\
+\xcc\x75\x0a\x42\x48\xfd\x30\x8d\xc8\x87\xf6\x7f\xae\xe0\xef\x35\
+\x58\x56\x50\xae\x41\x7e\xb9\x06\x99\x7f\x51\x83\xe5\x2e\x4a\x4c\
+\xb8\x01\x72\x0b\x6e\x07\x25\xc7\x80\xa2\xce\xee\x61\x20\xbf\xdf\
+\xf5\xb7\x86\xd9\x39\x5e\x82\x79\x5f\xac\xba\x8b\x9c\x9d\x3c\xc2\
+\xe5\xe1\x12\x4d\x8c\x02\xf3\x57\xdc\xa5\xb2\x6c\x6e\x34\x6e\x28\
+\x9e\x41\xfc\x8c\x51\x95\x51\x7e\x5b\x26\x98\x87\x51\x1d\x01\x0d\
+\xf5\xdc\x07\x93\x88\xbc\x5f\x61\x1f\x44\xb7\x3e\x20\x5a\xa2\xaf\
+\x01\x3f\x52\x45\x41\x76\x8f\x01\x8b\x87\x9c\xa1\xb9\x80\x12\x44\
+\x75\x01\x42\xb8\x2f\x39\x8e\x87\x20\x1e\xda\x82\x99\xcf\xbf\x40\
+\xd3\xc1\xd9\x95\x01\x07\xee\xc4\xd1\xfb\x1f\x0c\xef\x14\x96\x0a\
+\xaf\x2c\xc1\x47\x86\x4f\x2e\x82\x43\x5e\xf3\x54\x95\x04\xbc\x34\
+\x9f\x63\x1e\x09\xfc\x5a\xa2\xc6\x99\xc3\x1a\xfb\x3c\x45\x98\x9a\
+\x7d\x6c\xfd\x29\xec\xba\x3e\xe6\x5f\xcd\x6a\x56\x37\x94\x68\xcc\
+\xe1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xab\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x72\x49\x44\x41\x54\x78\xda\xad\x96\x79\x6c\x14\x55\
+\x1c\xc7\xbf\xb3\xbb\xf5\xaa\x34\x59\x45\x6c\x41\x8d\x0a\x5e\x2d\
+\x21\x88\xc7\x1f\x5e\x09\x5a\x45\x63\xd2\x78\x04\x15\x50\x8c\x07\
+\xea\x1f\x88\x46\x03\x01\xe9\x5a\x31\x58\x0a\xda\xa6\x44\x63\x88\
+\x90\x52\x84\x2a\x1e\x34\x9a\xa8\x55\x4b\xd0\x44\xdb\xa4\xad\xa5\
+\xc4\x60\xcf\x65\x5b\xb7\xdb\x63\x97\xdd\x6d\x99\xdd\xd9\xb9\xe7\
+\xf9\x9b\xb7\xdb\xb5\x75\x9a\x22\xe2\xdb\xcc\xbe\x73\xe6\xf3\x7e\
+\xbf\xdf\xf7\xf7\x66\x04\x4c\x2a\xef\xd5\xff\xcc\x98\x25\xc0\x30\
+\x2d\x30\xc6\x00\x41\x80\x0b\x76\x45\xb5\x00\x8c\xcb\x16\xdc\x34\
+\x70\x4a\x95\x11\x1b\x17\x11\x18\x4a\xa0\xb9\xea\x05\x01\x33\x14\
+\xe1\x9f\x80\xe5\xb7\x2f\xe2\xed\x9c\x1c\x37\x52\x92\x0e\x51\x49\
+\x21\xa9\x18\x90\x54\x1d\x71\x49\xc2\x58\xc2\x84\xac\x68\xf0\x8f\
+\x8e\xa0\x77\x24\x06\x55\x16\x66\x84\x4c\x99\xd8\xfe\xc5\x11\xf6\
+\xc4\x5d\x8b\x71\xc5\x1c\x2f\xef\x33\xfa\xa5\x52\x1a\x12\x8a\x09\
+\x51\x96\x21\x26\x92\x08\x4b\x1a\x74\xea\x77\x85\xa3\x68\x3c\xda\
+\x89\xdb\xae\x9d\x8f\xe6\xde\x20\x7e\x7a\xe7\x59\xe1\x8c\x00\xa6\
+\xae\x43\x86\x41\x00\x37\xed\x58\x87\xa2\x25\xa1\x90\x15\x31\xb2\
+\x4a\xb7\x2c\x74\x85\xe2\xe8\x0e\x06\xb1\xf2\x8e\x85\xa8\x6f\x39\
+\x81\xdf\x83\xe1\x69\x21\x53\x06\xca\x0f\x1e\x61\xab\x96\x66\x00\
+\xa6\x49\x26\x58\xd0\xe0\x86\xa2\x28\x90\xa5\x14\x12\xb2\x49\xee\
+\x62\xd0\x4c\x1d\xdd\xa1\x28\x5a\xfc\x01\xf8\x56\xde\x07\x53\x33\
+\xb0\xfd\xab\x66\x74\x0d\x46\x1c\x90\x29\x9d\xad\x75\x87\xd9\x53\
+\xc5\x4b\x32\x00\x0d\x76\xc0\x05\x97\x0b\x8a\x49\x96\xc8\x3a\x52\
+\xaa\x01\x4d\x63\xdc\x79\x1d\x81\x10\x3a\x06\xa2\xd8\xb6\xfa\x6e\
+\x0c\x8d\x25\xd0\x33\x10\x41\x43\x87\x1f\xed\x81\xe1\x29\x90\x29\
+\x80\xb7\x3f\x39\xcc\x9e\xbe\x67\x02\xa0\xc0\xb2\xdc\xb6\x90\xc0\
+\xe8\x92\x49\x59\x12\x05\xdb\xd0\x4c\xb8\x98\x89\xfe\x88\x88\x6f\
+\xdb\x4f\x70\xc0\x29\x31\x89\xa4\xc9\x10\x1c\x1a\x45\x7d\x6b\x00\
+\xdf\xb5\x75\xa3\x73\xd7\xab\x82\x03\xe0\x3b\xd0\xc8\x9e\xbf\xf7\
+\xa6\xac\x05\x96\x95\x9e\xb6\x25\x6a\x66\x20\x76\x80\x6d\x17\x49\
+\x14\x8b\xc6\x63\xbd\x7c\x3e\x91\x60\x48\x32\x8d\xb7\x7f\xeb\x1b\
+\x46\xff\x50\x04\x3d\xbb\x5f\x73\x02\xd6\xd7\x7c\xcf\xd6\x3e\x78\
+\x2b\x07\xe4\x56\xf8\x69\xeb\xcc\xe9\x4c\x8a\x0b\x33\x68\x9c\x20\
+\xb0\x74\x30\x9d\xda\x06\xd5\xa4\xb2\x1f\x5f\xbc\x12\x47\xfd\x83\
+\xd8\xf9\x4d\x2b\x06\x6a\xd6\x3b\x01\xeb\x3e\xf8\x9a\xbd\xbe\xfc\
+\xce\xe9\x01\x59\x90\x00\x46\x31\x81\x41\x97\x45\x97\x6e\x10\xd3\
+\x06\x68\x68\x7a\x79\x3e\x5a\xfa\x42\xa8\x38\xf8\x0b\x06\x3f\xde\
+\xe0\x04\xac\xa9\xaa\x63\xa5\xab\x1e\x48\xbb\x08\xb6\x2b\x2c\x58\
+\x76\xd2\xd1\x9f\x67\xd2\x3a\xc3\x74\x41\xb5\x54\x48\x86\x0a\x35\
+\x29\x40\x67\x0a\xa2\xe3\x32\x0a\x2e\xf2\xa2\xa9\x27\x48\x9e\x68\
+\xc0\xf0\xfe\x8d\x4e\xc0\x8a\xf2\x5a\x56\xf1\x5c\x09\x07\x48\x7c\
+\x67\x16\x65\x02\xc3\xb9\x74\x60\xe4\xd0\xce\x4d\x6a\x5b\x74\x54\
+\x9c\x63\xb7\x0d\x0a\x3a\x59\x31\xef\xdd\x40\xda\x55\xaa\x82\xc8\
+\x9b\x4b\xf0\x6b\x67\x10\xcf\xec\x3c\x84\x70\xdd\x26\x27\xa0\xc4\
+\xb7\x87\xbd\xbf\xf6\x11\x0e\x88\x49\x0a\xdc\x16\xe3\x0f\xf5\x90\
+\x54\xdd\x82\x8b\xcb\x69\x41\xec\x7c\x50\x6a\x20\x38\x47\x21\x21\
+\x08\xb8\xb8\xb2\x8f\xdc\x44\xab\xe8\x7c\x92\xb7\xdd\x8c\xa6\xe3\
+\x83\x78\xb8\x7c\x3f\x4e\x7e\xba\xd9\x09\x58\xba\xb9\x86\xd5\xae\
+\x7b\x88\x03\xe2\xc9\x94\x2d\x77\x70\xd5\x5b\x16\x5f\x9a\x43\x8e\
+\xba\x2e\x92\x4b\x26\x00\xbd\x97\xcb\x38\xcf\xd6\xaf\x21\x90\xb5\
+\x3a\xa2\xa2\x8c\x6b\xe6\x7a\x71\xcc\x3f\x8c\xe2\xd2\xbd\x88\x7d\
+\x56\xfa\xef\x00\x93\x8b\xdd\x2d\x3c\x99\xc7\x6f\xea\xbb\x4c\xe5\
+\xe0\xfc\xca\x01\x7e\xda\x32\x4d\x45\xea\xad\x22\x92\x69\x08\xcb\
+\x4a\xf7\x21\xfe\xf9\xe9\x00\x7b\x32\x53\x8f\x4b\x7f\x03\x88\x50\
+\x14\xcf\x23\x69\x92\x05\x73\x25\x72\x9d\x07\x97\x54\x05\x60\x1f\
+\xea\x8c\x02\x9e\x2a\x2b\x44\x6b\x6f\x08\xf7\xfb\xf6\x61\xec\xbf\
+\x00\x90\xb1\x80\x12\x19\x3d\xf9\x09\xe4\xb8\xdc\x3c\xcb\x6d\x07\
+\x6a\x24\xdd\xd9\xb3\x2e\x38\x7b\xc0\x0d\xa3\x79\xbc\xee\x26\x80\
+\x7d\xf7\xbc\xea\x81\x6c\x02\xa6\x7c\x45\x68\x23\xc0\xb2\xff\x03\
+\xf0\x47\xbe\xc8\x25\x7c\x75\xf5\x9f\xe9\x09\x8a\x47\xaa\x6c\xe1\
+\xcc\x80\xc2\x97\xaa\x59\xc3\x96\xd5\x59\x80\x30\x01\xc8\xcb\x4d\
+\x2f\x10\x25\x5c\x6f\x03\x48\xb1\xc7\x09\x60\xeb\xdf\x4d\x89\xe1\
+\xf1\x78\x20\xd3\x21\x78\xa9\xf7\x42\xb4\x65\x82\x7c\x5a\x40\xf8\
+\x23\xca\x50\x7b\xf0\x31\x11\x2e\x6f\x7a\xd7\x18\x13\x71\x63\xd8\
+\x4b\x9a\x07\x9a\xbc\x61\x08\x6e\x01\x8b\x76\x0d\xf2\xc7\x30\x5d\
+\xa5\x3c\xb8\x05\xed\xfe\x21\x14\x6f\xda\x8b\xf1\x2f\x7d\x4e\xc0\
+\xec\x47\xcb\x58\xfb\x87\xaf\xa4\x5f\x99\x07\x32\x53\x4f\xa6\x5f\
+\xfe\x13\x32\x2a\x18\x49\x1f\x1a\x23\x05\x06\xaf\x73\x77\xf4\x67\
+\xef\x97\x36\x5c\xc5\xdf\x0d\x8b\xd7\x54\x22\x7a\x68\x8b\x13\x30\
+\xab\xe4\x0d\xd6\x55\xbb\x11\x67\x5b\x16\xac\xd8\x0a\xe5\x87\x1d\
+\xd3\x03\xec\x5a\x67\xf6\xc7\x0a\x3b\xa3\x87\xda\x9f\x39\x82\x6e\
+\x64\xfb\x13\x80\xbf\x00\xad\x8e\xaf\x37\xb3\x17\xeb\x4e\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x3a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x01\x49\x44\x41\x54\x78\xda\x85\x96\x0b\x70\x4c\x67\
+\x14\xc7\xff\xf7\xde\x7d\x64\x37\x8f\xcd\x26\x22\xa4\xf1\x48\xd3\
+\x89\x57\xa8\x84\x62\xa8\x22\xd4\xa3\xd5\x64\x68\x83\x68\xa7\x86\
+\x31\x4c\x45\xa9\xa6\xa8\xc7\x20\xaa\x0c\xd3\x8c\x7a\x64\xd0\x9a\
+\x9a\x96\xa9\x37\x13\x04\x95\xa0\x41\xa6\x22\x4d\x42\x1e\x5e\x43\
+\x92\x95\x37\x11\xbb\x99\xec\x6e\x76\xef\xab\xe7\xde\x8d\xad\x48\
+\xd5\xbd\x73\xe7\x7e\x7b\xbf\x73\xce\xef\x9c\xf3\x9d\xef\x7c\xcb\
+\xe0\x7f\xae\xc0\xc9\x27\xe2\x5c\x6e\x61\x1a\x2f\xca\xe3\x45\x51\
+\x8a\xf0\x0b\x0d\x54\xbf\xb7\x34\x58\xc1\x71\x6c\x85\x96\x63\x2e\
+\xe8\x75\x9a\x23\xd6\x33\x53\x2f\xbd\xca\x06\xf3\x9f\x86\xe3\x33\
+\x62\x9c\x0e\x57\x6e\xe7\xfe\xe1\x86\xf8\x0f\x22\x30\xa1\x9f\x09\
+\x3d\x03\xf5\xf0\xe1\x3c\xe2\x2e\x51\x46\xa5\xd5\x85\x3f\x6e\xdb\
+\x90\x91\x59\x81\xc7\x25\xd5\x4e\x83\x51\x3f\xc2\x7a\x2a\xa1\xe8\
+\xb5\x00\xd3\x47\x27\x76\x8a\x7e\xc6\xe4\x8d\xab\x86\x61\x42\xa4\
+\x1f\x74\x0c\x07\x59\x94\x40\x36\x21\xd3\xcd\x91\x0a\x2f\x2b\x23\
+\x8f\xb6\xc4\xc8\xb8\x58\x69\xc7\xca\x0d\xd7\xc1\xb5\x38\xd2\x6d\
+\xa7\xa7\x2e\x7c\x25\xc0\x6f\x72\xc6\xa1\xb0\x41\xe1\xd3\x7f\x5b\
+\x12\x8d\x10\xbd\x06\xa2\xe8\x31\xfa\x5c\x88\x63\x18\xd8\x79\x09\
+\xfb\xca\xed\x18\x1e\xac\x55\x26\xa1\x65\x81\x81\x9d\x0d\xa8\x6f\
+\xe5\xf1\xf9\xd6\x52\xd4\x16\x54\x1f\x6e\x39\x93\x30\xa3\x03\x20\
+\xf0\xe3\xcc\x9d\xa1\x03\xba\x26\x9f\x58\x36\x00\x3a\x09\x10\x25\
+\x19\xf4\x82\x83\x20\x76\x1a\x0b\x34\x7e\x64\x17\x51\xf2\xd8\x85\
+\xb4\x98\x00\xd2\xf4\xa8\x2e\xbb\x69\xc3\x17\x51\x7e\x20\x31\xb8\
+\x09\x36\x75\x4b\x31\x1a\x8a\xeb\xd2\xad\xc7\x3f\x5c\xe8\x05\x04\
+\x27\x9d\x8f\xe1\xb5\xda\xc2\xac\x1d\x23\x11\xa4\x61\xe1\x12\x64\
+\x3c\xa5\xa7\x99\xb4\x58\xc6\xe3\x79\x9d\x53\x40\x49\x6d\x2b\xd2\
+\x86\x04\xb6\x4b\xe9\xb2\x02\x2b\xa6\x50\x2a\x03\xc8\xb8\x5e\xc3\
+\xa0\x49\x90\xf0\xfe\x97\x57\xa1\xe5\xf9\xd8\xa7\x07\x27\x16\xa9\
+\x00\xdf\x29\x67\x1c\x9b\xbe\x1f\x69\x98\xd4\xc3\x0f\x8d\x6e\x11\
+\x0d\x6e\x59\x75\x90\x51\xd3\x02\xd4\x50\x18\xa5\xb5\x4e\x6c\x1b\
+\xa6\x18\x67\xb1\xb9\xd8\x86\xe5\x03\x4c\x2a\xe0\xeb\xbc\x67\x18\
+\xf7\x96\x1f\xa8\xd2\x10\xaa\x63\xd0\x49\xc7\xe1\x9c\xa5\x05\x2b\
+\x56\x5d\x75\xda\x4f\x4e\x36\x32\x21\x9f\x5e\x88\x33\x86\x07\x5d\
+\xbc\xb4\x2e\x06\x16\xbb\x84\x66\x4a\x07\xdb\x16\x9a\x02\xa9\x69\
+\xe1\x51\x5a\xed\xc4\xf6\x11\x41\xea\x87\xed\x25\x56\xe4\xd7\xf1\
+\xd8\x3f\x3e\x44\x05\x2c\xce\x6d\xc2\xb8\x28\x7f\xf0\xa4\x47\x6b\
+\x0f\xb3\x96\x41\x4f\x5f\x0e\x71\xeb\x8a\xe0\xa8\x6e\x1a\xcb\x98\
+\x67\x66\xef\x9e\x3d\xaf\xff\xfc\xc4\x81\x41\x28\xb3\xf1\xb8\x65\
+\x71\xc0\xa9\xe4\x5f\x5d\x07\xc0\x5f\x07\xec\x18\x19\xac\x22\xb7\
+\x17\x37\x91\x03\x1c\xac\x2e\x11\x3f\x0c\x0d\x52\x01\x0b\x73\x1a\
+\x31\xb6\x77\x00\x04\x49\xad\x2b\x28\xaf\x6e\x04\x38\x7e\xb3\x09\
+\xfb\x7e\x2a\xd9\xc3\xf8\x27\x65\x95\xff\x92\x36\x22\x82\x97\x59\
+\xd8\xdd\x12\x32\x1e\x3a\x71\x7a\x6c\x50\x87\xbd\x31\x25\xa3\x16\
+\x2d\x64\x7c\x64\x8c\x09\xa7\x73\x9e\x20\x7f\x56\x37\x0f\xe0\xcf\
+\x27\x18\xd3\x27\x00\x6e\xa1\xad\x74\xe1\x09\x5d\xc7\x48\x98\x93\
+\x92\x5b\xa1\x00\xe4\xbd\x3f\x8e\x42\x2b\x19\x77\xb8\x04\x64\x56\
+\xba\x3a\x00\xc2\x36\xdd\x47\x58\x17\x5f\x0c\x1d\xe2\xf9\x7e\xea\
+\x6c\x2d\xaa\x96\x46\xaa\xe3\xae\x1b\xef\x63\x51\x52\x77\x84\x51\
+\x6a\x58\x42\xb4\x05\x02\x83\x9e\xc3\xdc\xaf\x72\xc0\x84\x26\x5f\
+\x93\xb7\xae\x1d\x02\x27\x55\x89\x93\x97\x91\x5d\xc3\xe3\xe4\x7b\
+\xa6\x76\x00\xf3\xd2\x62\x4c\x9f\x15\x05\x17\x39\xc0\x51\x95\x9d\
+\xcb\xac\x42\xcd\xca\x5e\x1e\x40\xea\x1d\x4c\x4c\xe8\x01\x89\xf6\
+\x47\xb4\x99\x45\x67\x3d\x43\xe9\x02\x8c\x46\x0d\x96\xa4\xde\x00\
+\x13\x96\xf2\xb7\xfc\xdd\x37\x03\x20\x52\xf5\x5c\xa9\x76\x23\x6b\
+\xdf\x0d\xd4\xff\x3c\xae\x1d\xc0\x7f\x41\x3e\x26\xcd\xe9\x0b\x96\
+\xdc\xe3\xa8\xac\xb2\x4f\x59\xd0\x90\xda\x57\x9d\x0b\xf9\xb6\x14\
+\xe3\x13\x23\xc0\x13\x40\x31\x1c\x6a\x64\x30\xd0\xac\x81\x96\x22\
+\x58\xb1\xb1\x10\x8c\x79\xee\x55\x39\x6d\xfd\x50\xe4\xd6\xb9\x50\
+\x5e\xef\xc6\x83\xcc\x5b\x78\x94\x3e\xa6\x1d\x20\xe1\xa0\x05\x79\
+\x85\x36\x0c\x4b\x88\x00\x47\x8b\x7e\xe5\x58\x25\x9e\x6c\xe9\xaf\
+\xce\x05\xa7\xdc\xc4\xa8\xc4\x48\x88\x04\x50\xb2\xa3\xb4\x94\x2e\
+\x46\x16\xef\xbe\xe1\x83\x94\x35\x79\x60\x3a\x2f\xc8\x2d\x1f\xf5\
+\x59\xbf\x08\x6b\x2b\xd0\xda\x22\xe0\x56\xc6\x3d\xd8\xf6\x0e\xef\
+\xb0\xc8\xa9\x39\x75\xd8\x7e\xb4\x1a\x43\x67\xf6\x46\xde\xd1\x87\
+\x78\xba\x75\xa0\x27\x7d\x8b\xf2\x31\x3c\xb1\x97\x0a\x78\x7e\x29\
+\xeb\x10\x48\x91\xe4\x1c\x28\xab\x60\xc2\x16\xe7\xed\x0e\x89\xed\
+\x36\x3f\x38\xdc\x00\x47\xa3\x0b\x55\x97\xcb\xd1\xec\x92\x20\x91\
+\x2b\x12\x35\x23\xad\x9f\x0e\x95\xdb\x06\xc3\xac\xd7\x62\x75\x76\
+\x0d\x76\x1d\xaf\xa1\xb6\x21\xc1\xb6\x6b\x98\x6a\x2c\x60\xde\x75\
+\xbc\x93\xd4\x47\x5d\x03\x6f\x11\xd1\xf6\x6f\xa2\x8d\xf9\xa4\xb0\
+\x6a\x0f\x13\xbe\x34\x3f\x4e\x6f\xf2\xbd\xd8\x65\x50\x17\xc8\x84\
+\x66\x28\xc7\x4c\x5b\x9f\x51\x04\x9f\x3e\x68\xc6\xdd\xb3\x65\xb8\
+\xbf\x7f\x34\x22\x4d\x3e\x58\x79\xa1\x1a\x9b\xb6\x14\x42\xce\x8e\
+\x57\x65\x8c\xb3\xaf\x21\x76\x46\x34\x01\x44\x2f\x80\xa5\x42\xa8\
+\x2f\xa8\x87\xcb\x66\x1f\xab\x5a\x0a\x4f\x29\x70\x98\x63\xc3\x0c\
+\x1a\x83\x86\x76\xa3\xdc\x2e\x35\x0c\x09\xbb\x9b\x05\x94\x1d\x2c\
+\xc0\xbd\xdf\x47\x23\xca\x64\xc4\xac\xa3\xe5\xf8\x35\xf1\x4d\x75\
+\x5e\x3f\xf3\x32\xa2\x93\xde\xf6\x02\x14\xe7\x04\xaa\xc8\x67\x85\
+\xb5\xce\xea\xb4\x41\x46\x15\xd0\x7d\x65\x51\x0c\x34\x9a\x42\xdf\
+\xbe\xa1\x78\x61\xbb\xb4\x0b\xd9\x4d\x9d\xf4\xe1\xfe\xbf\x70\xe7\
+\xd8\x04\xf4\x36\x1b\xbd\x73\xdc\x27\x59\xe8\x35\x33\x16\xf2\x73\
+\x00\xdd\xf6\xdb\x0d\x80\x20\xc4\x3e\xda\x18\x53\xe4\x6d\xd7\x3d\
+\xd6\x94\xee\x94\x7d\xb5\xc9\x6c\xb7\x40\x30\x4a\x9f\x78\x89\xa3\
+\xa4\x8e\xb7\x09\xa8\x3a\x70\x15\x77\xcf\xc4\xa3\x57\xa0\x07\xc2\
+\x4d\x39\x8f\x9e\x33\x06\x43\x16\x04\xc8\x2c\x0b\xa9\xca\x0a\xc6\
+\xce\xa7\x5b\xd6\x47\xff\xdb\xae\xbd\x90\xd4\xd2\x43\xf0\xd1\x4d\
+\xe7\x3b\xf9\xaa\x33\xcc\xcb\xc1\x50\x24\x22\x15\x40\xe3\x89\x7c\
+\x08\x3e\x7a\xb5\x19\xfa\xd3\xb9\x13\x10\x3f\x88\x52\x24\x40\xdb\
+\x68\xa7\x52\x74\x1f\xb6\xac\x8d\xee\x78\xe0\x78\x21\x1b\xca\x76\
+\x52\x4e\x92\x5b\x4d\xbe\x90\x38\xea\xab\xb2\xdc\x5e\x48\x39\x20\
+\x28\x1b\x52\x93\x5d\xed\x39\xb2\x96\x83\x86\x2a\xcd\xc7\xda\x42\
+\xb2\x52\xba\x65\x75\xbf\x57\x1f\x99\x5e\xc8\xa6\x3b\x31\xe4\x7d\
+\x2e\xaf\xe1\x0c\xbc\x46\x03\x81\xe3\xc8\x26\xdb\x4e\x8b\xa3\x66\
+\xa6\xa1\xad\xab\x15\xc9\x73\xb7\xe0\x94\x19\x8c\xb0\xac\xe8\xf3\
+\xfa\x43\xff\xc5\x2b\x62\xf3\xdd\x38\x8a\x60\x1a\x0d\xc7\x2b\x3f\
+\x25\xd6\x23\xce\x7a\x3a\x5a\x05\x3d\x17\x28\x8a\x23\x15\xcb\x7b\
+\xbf\xf2\x6f\xcb\x3f\x6a\xc0\x95\xf2\x44\x0c\xc1\xb8\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\x9b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e\xc4\
+\x01\x95\x2b\x0e\x1b\x00\x00\x02\x4d\x49\x44\x41\x54\x48\x89\xad\
+\xd4\x3f\x88\x54\x57\x14\x06\xf0\xdf\x19\x06\x59\x42\x90\xc5\x6a\
+\x59\x42\xb0\x8d\x86\x40\xc0\xc2\x62\x25\xed\x34\xc1\x4e\x02\x6f\
+\x84\x25\x85\xd8\x84\x40\x42\x58\x16\x09\x22\x22\x62\x21\xb1\x0a\
+\x49\x17\x64\x5e\x08\x29\x44\x5d\x0b\xb3\xc5\x16\x82\x16\x21\xad\
+\x44\x42\x48\x1a\x91\x60\xb1\x88\x48\x58\x96\x65\x8e\xc5\x9b\x37\
+\xf3\x76\x66\xfc\xb3\x7f\x6e\x75\xee\xb9\xf7\x7c\xdf\x39\xdf\x3d\
+\xf7\x84\x7d\x58\x59\x9a\xc7\x52\xa6\x95\x60\x2d\xba\xfa\xf5\x59\
+\xec\x03\x78\x1b\x25\x4e\x61\x03\x77\xb0\x9c\xe9\xef\x56\x77\x7f\
+\x08\x3a\xc9\x4a\xa4\xb6\x40\x92\xac\x0b\x57\x83\x6b\x7b\x22\xc8\
+\x9e\x77\x93\xfb\xc2\x47\xb2\xca\x36\x07\x24\x03\xe0\xdf\xdb\x7b\
+\x22\xe0\x6c\xf0\x21\x68\x02\x0f\x6c\xb1\x07\x89\xb2\x34\x97\xe9\
+\xcf\x08\xb3\x39\xf0\xd5\xb8\x10\x69\x53\x38\xb9\xab\x0a\xb2\xd4\
+\xc2\x15\xcc\x66\x36\xfc\xcd\x4b\xe1\x26\x56\x77\x2b\xd1\x02\x4e\
+\x45\x43\x8a\x21\x43\x65\xaf\x27\xe7\x5b\x85\x7e\x6b\xa7\xc8\x59\
+\x9a\xc1\x65\x69\x26\x6b\xc0\xa4\x69\xe3\xfb\xe0\x11\xec\xbc\x82\
+\xb4\x98\x1c\x1f\x6e\x9b\x12\x55\x24\xff\x04\x97\xa3\xa8\x7c\x3b\
+\x7a\xe4\x7e\xe9\x50\xf0\x50\x9a\x9b\x22\x0b\x69\x2b\x39\xdd\xea\
+\xfa\xa5\x8e\xd9\x26\x51\x96\x8e\x0c\x1e\x70\x32\xf1\x92\xe0\x5c\
+\xd6\xe0\x63\xb2\x64\xf5\xc1\xd6\x82\x1b\xcd\xb8\x21\x58\xbf\xe7\
+\xb3\x4c\x0f\x93\xdf\xb2\xb4\x90\xbd\x71\x06\xc7\x32\x9d\x1d\x6d\
+\x9b\x47\xe0\x45\x84\xa5\xe8\xda\x6c\x86\xc5\x20\xbb\x79\xdc\xc7\
+\xe1\x81\x7f\x23\xd3\xaf\xc1\x25\xfc\x85\x03\xc2\x2d\x74\xa6\x55\
+\x07\x99\xae\x45\xf8\x3a\x8a\xd1\xa0\x83\xc8\x12\xfc\x28\x9d\xc9\
+\xfa\xe7\x35\xda\x0d\x3f\x25\xff\x06\xdf\x49\xed\x8c\xc9\xae\x4c\
+\x9e\x06\x1f\x44\x61\x7d\x9c\xb8\x8d\x4e\xb2\xb8\x5d\x8d\x9a\xdd\
+\xa1\xe4\xab\xc6\x10\x1b\xa2\x0e\xbb\x27\xf4\x23\x2d\x47\x77\x12\
+\xbc\x26\xb8\x10\x95\x04\xa3\xb2\x62\x18\x3c\x72\x8f\xcd\x95\xfa\
+\x4e\xf2\x20\xc2\xcf\xd3\xc0\xa1\x95\x95\xce\x8f\x86\x19\x36\x4b\
+\x98\x62\x8f\x6d\x37\x83\x6f\xa3\xb0\xf1\x4a\x82\x56\xe1\x36\x3e\
+\x4e\xbe\x88\xf4\x5f\x8d\x59\xcb\x31\x6e\xd7\x0c\x59\x4d\xce\xeb\
+\xb8\xf7\x2a\x70\xc6\x3e\x5a\xbf\xf4\x1e\xbe\x89\xea\x4d\x0e\xbe\
+\x2e\x10\xcf\x70\x34\x0a\x4f\x5e\x77\x69\xdb\xa7\x6a\x15\x1e\x07\
+\x5f\xe2\x04\xee\xa2\x3f\x55\xa2\xca\x77\xe9\x4d\xe0\x13\x15\x34\
+\xd7\xa0\x7d\x3b\xd2\xc5\x0c\xc7\xa2\xa9\x7f\xf8\x23\xf8\x24\x0a\
+\xff\xef\x9a\xa0\x41\xf4\x0e\x16\x93\xa5\xe0\x7d\x6c\xe2\xd3\x28\
+\xac\xbe\x29\xf6\xad\x08\xea\xd5\xef\x99\xc3\xe7\xc2\xf3\xe0\x87\
+\x28\x6c\xbd\x4d\xdc\x4b\xc1\x2e\xe3\x9c\x4b\xc8\x00\x9e\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x63\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x2a\x49\x44\x41\x54\x78\xda\x95\x56\x59\x6f\x13\x57\
+\x18\x3d\x77\xc6\x8e\x3d\xb6\x63\xc7\x8e\x77\x07\x42\x48\x21\x90\
+\x40\x80\x20\xd4\x4a\xa8\xaa\x44\x25\xa2\x46\x40\xe9\x43\x1f\x5a\
+\x41\x1f\xda\xbf\xd5\xf6\x81\x3e\x54\x2d\x45\xa2\x4d\xcb\xd2\x88\
+\x56\xaa\xc4\x43\x37\xa0\x01\xd2\x90\x34\x64\x75\xe2\x25\xb6\x33\
+\x5e\x62\x3b\x9e\x99\xaf\xdf\xcc\xb8\x88\x2d\x14\xae\x75\x25\x4b\
+\xbe\xf7\x9c\xef\x9c\xef\x7c\x33\x16\xe0\xb5\x9e\xd8\x4d\x52\xa8\
+\x0b\xc2\xeb\x81\x51\x28\xc2\xa8\xd5\x11\xc9\xcc\x0b\xbc\xc2\xca\
+\xc7\xfb\x48\xf2\x2a\x90\xba\x43\x75\xaa\xd5\x14\xa3\xa8\x22\xbc\
+\xf6\x50\x88\x5c\x72\x37\x39\x8f\x1c\x80\x7b\xec\x4d\x88\xa0\x0f\
+\xfa\xec\x0a\x1a\x97\x6f\x40\x4f\xaf\x21\x9a\x5b\x7c\x29\x92\x5c\
+\xb4\x97\xe4\x54\x02\xee\xb3\x6f\x43\xde\x93\x02\x15\x2a\x68\x5c\
+\xbb\x89\xd6\xed\x7b\x10\xf9\xa1\x11\x52\xce\x8f\x41\x50\x09\xa4\
+\x6e\x40\x4a\xf5\x82\xb6\x14\xd4\x2f\x8c\x97\xb4\x4c\x36\x18\xcf\
+\xbe\x98\x24\xc3\xe0\x8e\x44\x8c\x94\x8f\x4e\x0b\xd1\x51\x87\x91\
+\x5e\x82\x08\x04\x40\x52\x90\x31\xae\x40\xe4\x8e\x1c\xd3\x94\x77\
+\x0e\xc9\x54\x58\x06\x0c\xc6\x92\x04\x57\x31\x08\xd2\xfd\xa8\x7e\
+\xfa\x4d\xc5\x28\x97\x3b\x93\xdb\x90\xa4\x6d\xf0\xaa\xf7\xfc\x19\
+\x9f\x59\xa0\xfe\xcf\x14\x63\x10\x63\x10\xbb\x91\x44\xfd\xda\x5d\
+\x5d\xa4\x7b\x07\xc8\x3d\x9c\x40\x47\x8f\x07\x64\xf0\x2d\xe2\x03\
+\xfc\x45\x7e\x6d\x3f\x34\xd5\x89\xda\xd7\x57\x4b\x9a\xaa\x06\x77\
+\xe6\x97\x9f\x20\x59\x0a\xef\x20\x67\x2a\x51\xf2\x9d\x3b\x15\x94\
+\x8c\x36\xb8\x90\x78\x0b\x08\x59\x42\x73\x26\x8f\xc6\x54\x1e\x62\
+\x31\xb6\x8b\x84\x53\x22\x65\x38\x21\xdc\x3d\x9d\x8c\x4d\x6d\x12\
+\x62\x25\x43\x68\xa9\x32\x2a\x97\xae\x33\x49\x39\xd8\x97\x5b\xb2\
+\x48\xe6\x23\x3b\xc9\x19\x8f\x95\xfc\xe7\xc6\x82\xb2\xa1\x42\x9f\
+\xb9\x6f\x29\xb7\xc1\x05\x1a\xcb\x15\xd4\xef\x66\x40\x2d\x83\x09\
+\x92\xbb\x85\x6e\x90\x21\x39\x24\x78\x0f\x44\xe0\x4a\xf9\x6d\x12\
+\x73\xc3\x54\x32\x08\x43\x0e\x61\xe3\xab\xeb\xf5\x56\x7a\x55\x31\
+\x89\x9d\xa9\xa4\xde\xf5\xe1\x98\x2c\x6b\xeb\xd0\x66\xec\xca\x85\
+\x24\x81\x98\xa3\xfe\x4f\x11\xf5\x39\xee\xa7\xce\x77\x25\x21\x3d\
+\x92\x3d\x6b\x2a\x71\x48\xd4\x39\x14\x11\x4a\xb2\xf3\x31\x12\x82\
+\x83\x7b\xa2\xb9\xc2\xa8\xfc\xfc\x07\xa8\xd1\x84\x7f\xf4\x38\xe4\
+\xd6\x3a\x27\x8e\x2b\x07\xdb\xc2\x96\x98\x40\xd5\xd9\x22\x6a\x73\
+\x45\x4b\x4c\x7f\x66\xc1\xc2\x7e\xc2\xd7\x69\x9b\xc4\x08\xec\x0b\
+\x4b\x9e\xa4\xb7\x6d\x97\x29\x84\xab\xe1\x74\x49\x7d\x03\xec\x82\
+\x80\xbe\x38\x0b\x7d\xf9\xa1\x5d\xb9\x10\x16\x8a\x3a\xb7\x81\xda\
+\x7c\xc9\x02\x1c\x68\x83\x3f\x43\x60\xae\xfb\x9c\x0c\xb0\x5d\xc1\
+\x81\x10\x7c\x71\x1f\x63\x1b\x6d\x12\x1d\xc2\xe3\xb3\x7c\xa6\x5a\
+\x85\x0b\x97\xad\xdb\x26\x41\x79\xb1\x0c\xf5\xe1\x86\x55\xf9\xe0\
+\x63\xe0\xcf\x25\x30\xd7\x64\x8c\x49\x24\x61\x74\xef\x0d\x49\xbe\
+\x88\xc7\xea\xb9\xb5\x98\xc4\x5a\x26\x38\x2c\x2e\x54\xf3\x35\x14\
+\x1e\x94\xac\x22\x86\xb3\x0b\xcf\xe0\x6d\x3b\x44\x7f\x9a\x49\x71\
+\xc9\x94\x3c\x18\x11\x4e\xc5\x61\xdb\xf5\xd4\x4d\xe2\xae\xa6\xff\
+\xca\xa2\x59\xd9\xc2\xd1\xf5\xe5\xe7\x62\x6d\x4b\xf0\x6b\x77\x0f\
+\x29\xa9\x18\xf5\xec\x0d\x08\xa9\x59\xe1\x02\xa5\x27\x0f\xf0\xac\
+\x08\xc5\x8b\x95\x99\x32\x6a\x2b\x39\xbc\x5e\x58\x79\x79\x82\x9b\
+\xc1\x04\xb9\x7b\x52\xc6\x8e\x93\x6f\x48\xae\xa5\x7b\xe0\x69\x66\
+\x5b\x9e\x26\xe0\x69\x75\xb9\xd0\xec\x1b\xc6\xca\xc4\x6f\x68\xac\
+\xae\xe2\x78\x29\xf3\xff\x16\xfd\x12\x8c\x91\x3b\x91\x40\xef\x99\
+\x13\xf0\xe4\x17\xa1\x2d\xcc\xb5\x3d\x27\x3b\x31\x16\x36\xd9\x57\
+\x0d\x8d\x23\xbc\x1f\x55\x5f\x0c\x0b\x17\xaf\x62\x4b\x2d\xe3\xad\
+\x8d\xcc\xf6\x4d\xfe\x89\xc1\x95\x44\xcc\xe8\x7f\x6f\x54\xf2\x64\
+\x17\xd1\x32\x87\xc8\xe1\xb4\xc1\xf9\xa3\xeb\x86\x75\x4e\xe6\xdc\
+\x13\xda\x3d\xe1\xde\x38\x06\x0f\xa2\x24\xf9\xb1\x38\x3e\x81\x56\
+\xb9\x82\x13\x8f\x29\x79\xf4\x65\xa2\x2b\x6a\x56\x4e\x7b\xce\x8e\
+\x0a\x5f\x31\x8d\xad\xc9\x49\x6b\xfc\xcd\xaa\xcd\xc2\x8b\xe5\x26\
+\xd6\xd6\x37\xad\xb3\x89\xb0\x07\x21\xbf\xab\xfd\x44\x61\x72\x8e\
+\xb2\x73\xf8\x30\x0a\x4e\x3f\xe6\xbf\x9b\x40\xb3\xac\x62\x74\x23\
+\x67\x0f\xda\x95\x50\x5c\x40\xd3\x0d\x25\x11\xc7\xfe\x33\x27\xe1\
+\x2d\xae\xa1\x35\x79\xa7\x3d\xfe\x36\x41\x9e\xc1\x17\x72\x55\x62\
+\x05\xa2\xad\x80\x76\x45\x7d\x22\x62\x91\x90\x95\x30\xc1\x4d\x77\
+\x30\x89\x1a\x88\x62\xf6\x87\x1b\xa8\xaf\x65\x58\x3d\x3f\x2c\xc6\
+\xfd\x11\xb6\x25\x4e\x83\xa7\x4f\x8a\xce\xf4\x02\x5a\xd3\x7f\xdb\
+\x01\xe7\x2d\xf3\xce\x56\xeb\x98\xcb\xd7\x48\xe7\x4c\x9e\x2a\xda\
+\xd2\xbf\x0f\xc5\x89\x7f\xa3\xfe\x88\x57\xc4\x7c\x0a\xf4\xf6\xc3\
+\xd1\xb4\xab\x63\xf8\x10\xca\xd1\x24\xa6\xc6\x7f\xb4\x48\xc4\x78\
+\x7c\x27\x0d\xbd\x3b\x86\xf8\x66\x19\x8d\x5b\xb7\xec\xb4\x30\x8c\
+\x09\x9e\xa9\x35\xf0\xa0\x58\xe5\x69\x26\x9c\x6d\x4b\xfe\x6f\x5d\
+\x66\x4b\x25\x56\x38\x10\xf2\x21\xee\x75\xb7\x49\xec\x61\x74\x8f\
+\x1c\x45\xc6\xe3\xc7\xfd\x6f\xf9\x85\x73\x7d\x60\x88\x8e\xf1\x2b\
+\x53\x30\x38\x71\x5a\x4c\x4b\x24\xde\xab\xf5\x06\xa6\x37\x2a\xd0\
+\x18\xfc\x7d\x75\xfd\xb9\x71\xbe\x18\x08\x93\x83\x49\xf6\x75\x75\
+\x22\xa9\xb8\x59\x00\xb5\x7b\xa2\x83\x46\x46\xf0\xfb\xed\x7b\xba\
+\xb8\x14\x4d\xd1\xe1\x70\x37\x62\xcd\x06\x34\xc9\x7e\x2a\xae\x34\
+\x1a\x98\x2a\x57\x49\x63\x5b\x3e\x28\x17\x5e\xf8\xca\xfc\xd2\xdf\
+\x4d\x0e\xb6\x6b\xd0\xef\x13\x3d\x6e\xb7\x25\xc2\xc1\x4d\xcf\xba\
+\xdc\xb8\xb3\x5e\x80\xb8\xd0\x19\xa2\x80\xc3\x81\x7d\x1e\x0f\xbc\
+\xb2\x8c\xb5\xe6\x16\xe6\x36\x6b\x68\xf1\xc1\xf3\x95\xe2\x4b\xbd\
+\xf4\xbf\x60\x0c\x33\xcc\xfd\x1e\x2f\x12\xae\x0e\xd4\x74\x1d\xd3\
+\x9b\x9b\x50\x35\xcd\x8e\xe9\x67\x9e\x00\x75\x70\xf5\x2e\x4e\xce\
+\x26\xcb\x33\xb8\x8e\x8f\x6b\xea\x2b\xfd\x6d\xf9\xdc\x1b\x20\x53\
+\xbf\x87\x6d\x6e\x72\xa2\xb6\x58\xc5\x27\x9b\xaa\xf8\x17\x28\xc2\
+\x76\x85\x0b\x69\x12\xba\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\xbd\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x84\x49\x44\x41\x54\x78\xda\x9d\x94\x7b\x6c\x54\x45\
+\x14\xc6\xbf\xd9\xbb\xdb\xed\xc3\x60\xd3\xf0\x54\x63\x8a\xc1\xfa\
+\x8f\x89\x92\x28\xf8\x08\xa2\x51\x2a\xa5\x2a\x09\x55\x8c\xc1\xf2\
+\xa8\x3c\x7d\x80\xad\x0a\x85\xc4\x3f\x78\x58\x62\x53\x08\x11\x23\
+\x28\x36\xd5\x62\x4c\xa9\x36\x31\x42\x5b\x68\x08\xdd\x18\x42\x43\
+\x8a\x24\x06\x21\x4a\x6b\x2c\x91\x92\xb6\x94\x6e\xf7\xbe\xef\xdc\
+\x97\x67\xee\xda\x85\x86\x82\x5b\x66\x33\xbb\xc9\xec\x99\xf9\xcd\
+\x39\xdf\x37\x87\x6d\x6f\x88\xf9\xaf\x3c\x36\x03\x03\x8a\x09\xd3\
+\xe4\xd0\xb9\x85\xb8\x61\x61\x58\x73\x10\x57\x34\x0c\xc8\x0a\xea\
+\xd6\xbf\xca\x70\x87\x83\xd5\xc7\xce\x3a\xa5\x73\x67\x4a\x80\x47\
+\x87\x5a\x90\x69\x0e\xab\x16\xfa\xe5\x04\x06\x87\x39\xce\xf5\xf6\
+\xe1\xe2\xe5\x41\x34\x55\xbe\x71\x47\x10\x56\x7b\xec\x34\x2f\x2b\
+\x9c\x15\x71\x1d\x07\x9a\xe3\x42\xd6\x5d\x18\xba\x46\x30\x03\xd7\
+\x74\x1b\x67\xba\xae\x20\x7f\x62\x0e\xda\x7e\xeb\xc1\xc1\x8a\x92\
+\x71\x43\xd8\x97\x2d\xa7\xf9\xea\x22\x02\xb8\x2e\x7c\xdf\x83\xe9\
+\x02\xaa\xa2\x42\x36\x1c\xa8\xa6\x8d\xce\xae\x5e\xcc\x98\x92\x87\
+\xcc\xac\x08\xf6\x1f\xed\xc4\x77\x1f\x8c\xaf\x5c\x6c\xdf\x91\x0e\
+\xbe\xb6\xf8\x09\x02\x70\x78\x1e\xed\x65\x3e\x34\x9b\xa6\x61\xc3\
+\x73\x1d\xfc\xdc\xf1\x07\xca\x0a\x67\xe2\x52\x7f\x02\x9d\xdd\xbd\
+\x68\x3e\xdb\x8d\x43\x1b\x17\xa7\x0d\x61\x9f\x1d\x39\xc5\xdf\x2b\
+\x7e\x92\x00\x0e\x01\xfc\x60\x51\x70\x74\xee\xc1\xb6\x39\x1a\x63\
+\xe7\xd1\x27\xab\x28\x98\x9a\x8b\x69\x93\x72\xc1\x09\x7c\x55\xd3\
+\x29\x96\x4c\xa0\x3b\x48\x68\x1c\x43\xba\x8a\xab\x71\x05\x8d\x9b\
+\x96\xdc\x04\x66\xbb\x9b\x7e\xe1\xe5\x8b\xe6\x04\x25\x72\x3c\x0f\
+\x21\x5a\x14\xd3\x0d\x31\x68\xdc\x85\x58\xff\xe1\xe4\x39\xac\x9b\
+\x3f\x5b\xa0\xa1\x92\x2e\xb2\x6e\x60\x98\x0e\xbf\x46\x46\xb8\x12\
+\x37\x11\x97\x0d\x74\xfc\x7d\x09\x57\x07\x34\xb4\x6e\x5f\x36\x0a\
+\xc2\x76\x35\xc5\x78\xc5\xa2\xb9\x11\xd7\x77\x61\x39\x1e\x22\xff\
+\x01\xc4\x97\xed\x30\xd8\xcc\x41\x6d\x6b\x27\xde\x5f\x38\x87\x4a\
+\xe6\x92\x11\x08\xa0\xfa\x30\x2c\x83\x60\x7a\x60\xef\x21\x72\xde\
+\xe9\x3f\x7b\xf1\xd4\x83\x93\x70\xe6\xaf\x3e\x54\x97\x2d\x48\x41\
+\x58\x55\xc3\x09\xbe\xf9\xf5\xe7\x22\x9a\xe5\xc0\xa5\x1b\x8a\x7f\
+\x32\x43\x12\x3c\x12\x3c\x24\x31\x44\xa4\x10\x6a\x9a\x4e\xe2\xc3\
+\x92\x67\x70\xdd\x08\x0c\xba\xa6\x42\xa1\x6c\xe2\xf4\x5e\x12\xaa\
+\x8e\x0e\x32\xc3\xaa\x17\x1e\xa1\xb2\x71\x9c\xf8\xbd\x07\xef\x14\
+\xcf\x0a\x20\xac\xb2\xee\x18\xdf\xb9\xbc\x30\x12\x27\xef\x8b\xcd\
+\x62\x84\xa9\x3c\x12\xa5\xc0\xa2\x0c\x59\xe1\x08\xaa\x1b\x63\xd8\
+\xb4\xf8\x59\x8c\x18\x81\xd1\x56\xcd\x76\x03\x23\x18\x74\x31\xcd\
+\xb4\x70\xea\xc2\x25\xac\x5e\xf0\x38\x06\xae\x29\x68\xf9\xb5\x1b\
+\xed\xe7\x7b\x02\xc7\xb1\xca\x6f\x09\xb0\x54\x00\xcc\x14\x40\x48\
+\x1d\x66\x21\xca\x40\x42\x56\x26\x01\x7e\x8c\x61\xcb\x6b\xd7\x01\
+\x23\x46\x10\x10\x93\x20\xa6\x65\xa1\xe7\x8a\x8c\xcb\xf1\x21\x0c\
+\xc4\x2d\x24\x28\x4e\x23\xf1\x8f\x9f\xbd\x08\xb6\xb9\xbe\x8d\x57\
+\x95\xce\x1b\x05\x08\x52\x63\x2c\x98\xd9\x19\x19\xf8\xa4\xb1\x1d\
+\x5b\x97\x3c\x1f\x94\xc8\xf3\x92\x31\x02\x43\x95\x82\x45\x10\xd9\
+\x74\xc0\x4d\x13\x0a\xc1\x64\x99\xa3\x9f\xde\x91\xeb\x3b\xd8\xfa\
+\x7d\xfb\xad\x01\x23\xe3\x2e\x02\x6c\x6b\x68\xc7\x8e\x65\xf3\x02\
+\x00\xf7\x92\x46\xf0\x53\x10\x86\x84\xc1\xe1\x92\xf8\x3a\xdd\x5a\
+\xa1\x6c\x06\x13\x26\x42\x61\x86\x75\x9f\x1f\xfe\x7f\x40\x66\x46\
+\x04\x3b\x0e\x1d\x47\xd5\xd2\x22\xb2\x71\x12\x20\x0e\x8f\xfa\xd7\
+\x63\x3c\x4a\x45\xf5\x75\xe8\x8a\xc8\xc8\xc0\x90\xc2\x31\x21\x27\
+\x0b\x2f\x6d\xab\x07\xfb\xf8\x60\x1b\xdf\xf6\xe6\xd8\x00\x71\x46\
+\x46\x54\xc2\x96\xba\xe3\xd8\xbb\xa6\x98\x4a\x61\xc3\x27\x48\x00\
+\x08\x85\xe9\x97\x3e\x61\xd2\x4b\x40\xc8\xd2\x0a\x3d\x4c\x9b\x62\
+\x44\x1f\x9b\x9a\x77\x37\x66\x97\xef\x03\xdb\x70\xa0\x85\xef\x59\
+\x59\x14\x11\x9d\xd4\xb9\x01\x10\x12\xef\x80\x1c\x12\x96\x22\xa8\
+\xfc\xa6\x19\x07\xd6\x97\xd0\xe3\x32\xe9\xb6\xc9\x0c\xe8\x36\x74\
+\xb0\x84\x0c\x32\x82\x1d\x45\x50\x36\x46\x99\x28\xd4\xf2\x55\x2a\
+\xd9\xf4\xc9\xb9\x78\x60\x65\x0d\x58\xc5\x81\x66\x7f\xd7\xca\x05\
+\xb7\xed\x27\x6f\xef\x3f\x8c\x2f\xd6\xbe\x9c\x02\xdc\x38\x24\x7a\
+\x27\x21\x91\x83\x44\x58\x37\x69\x0e\x99\x74\xb8\x27\x37\x07\xd3\
+\x57\x10\xe0\xfe\xd2\x9d\xfe\xc3\xf9\xf7\xc2\x26\x01\xc7\x1a\xa2\
+\x3f\x3d\x5a\x30\x15\x35\x2b\x8a\xc6\x04\x84\xc3\x94\x81\xed\x20\
+\x1a\x8e\x06\x25\x13\xd2\x0b\xc1\x73\x27\x64\x21\x5f\x00\xd2\xe9\
+\x88\x1f\xd5\x1d\xf5\xab\x97\xbf\x38\x26\x20\x05\x12\xbd\x45\x4a\
+\xea\x46\x4a\x61\x62\xf6\x38\x00\xe5\xb5\x2d\xfe\xee\xb2\xa2\xdb\
+\x02\x9c\x14\x88\x00\xa4\xcf\x94\x09\x39\xe9\x03\x36\x12\xe0\xd3\
+\x5b\x00\xc4\x01\x0e\xd5\x5d\xb4\x6f\x21\x83\x24\x44\x27\xda\xe4\
+\xdc\xec\xf4\x01\xab\xf6\xfe\xe4\x7f\xf5\xee\xc2\xc0\x7e\xa6\xeb\
+\xdd\xb4\xc9\xd0\x2d\x5a\x4b\xfa\x55\x74\x62\x83\x08\x05\xd3\xf2\
+\xc6\xa1\xc1\xd7\xad\x7e\xf5\x5b\xf3\xd3\x09\x1d\x35\x1e\x5a\xb3\
+\x27\x3d\x00\x9e\xde\xe0\xdf\x97\x3f\x05\xdc\x71\xd3\x0a\x17\x23\
+\x4a\x1d\xe0\x9f\x0b\x5d\xf8\x17\xdd\x70\xc2\xad\x98\x3e\x72\x43\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xa8\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x6f\x49\x44\x41\x54\x78\xda\xad\x95\x6b\x68\x14\x57\
+\x14\xc7\xff\x77\x66\x77\x13\x33\x6b\xc4\x10\xad\x16\xb4\x54\x51\
+\xa3\x34\x45\xb3\x54\x22\x04\x37\x3e\x1a\x5f\xa0\xb6\x1f\xac\x16\
+\x44\x3f\x0a\x55\x0a\x51\x0b\x15\x1f\x41\x10\xd4\xda\x16\xd1\x0f\
+\x6a\x3e\x88\x5a\xaa\xb4\xf5\x15\xa3\x6b\x6c\xf3\xd8\xaa\x35\x1a\
+\x23\x2d\x3e\xd2\xec\xd6\x47\x4c\xdc\x18\xb3\x1b\x37\x8f\xcd\xee\
+\x66\x66\xee\xe9\x99\x0d\x48\x04\x45\xb3\xeb\x81\xe1\x5e\xe6\xde\
+\xfb\xff\xdd\xf3\x98\x33\x02\x29\x58\x91\xa7\x9d\x84\x02\x54\xcc\
+\x1b\x21\x5e\xb7\x47\x0c\x46\x70\xa0\x15\x96\xb7\xd3\x86\x69\x1a\
+\x6a\xc3\x26\x6a\x1a\xa3\xb8\xf2\xf9\xc8\x57\x6a\x25\x05\x98\x59\
+\xf6\x8c\x8a\x59\xdc\x9e\x66\x47\x53\x5c\xc2\xfb\xa0\x07\x8f\x1e\
+\x47\x71\x7d\xe5\x18\x91\x32\xc0\x7d\xfa\x29\xad\x73\x0d\xc5\x28\
+\xa7\x03\x57\xc3\x06\x6c\x1c\xa2\x74\x9b\xc0\xb9\x5b\xcf\xf1\x2c\
+\x10\xc5\xad\x35\xe3\x44\xd2\x00\xd7\x91\x16\x5a\xfa\x71\x06\x66\
+\x7f\xe0\x44\x55\x07\x8b\x13\x60\x12\x41\xf2\x28\x59\xca\xe3\x6d\
+\x45\xac\x3b\x8e\x7f\xd6\x4f\x11\x83\x06\xe4\x96\x36\xd1\x17\x79\
+\x43\x51\x30\xd6\x89\xca\x90\x0e\x85\x85\x4d\x0b\xc0\xea\xa6\xe4\
+\x0d\xd6\x5c\x05\xaa\x2a\x03\x88\x75\x46\xd1\xb0\x75\xaa\x78\x6b\
+\x40\xde\xc1\x87\xf4\x19\x87\x25\xe7\xbd\x0c\x94\x3f\x89\x23\x37\
+\xcb\x81\x96\x5e\x56\x4d\x40\xd8\x03\x86\xf4\xc4\x4c\xc4\xf8\x9d\
+\x2e\x04\x1a\x2e\x37\x43\xef\x8b\xe3\xbf\x9d\xf9\xe2\x8d\x80\xbc\
+\xfd\x7e\xb2\xc6\x3e\x43\xc2\xd0\x4d\xf4\xf6\xe8\xf8\xed\xab\x89\
+\x38\x70\x3f\x06\x85\x8f\x9b\x7c\x7d\x52\x04\x7c\xf7\xc2\x08\xdc\
+\x69\x85\xc2\xae\x08\xeb\x91\x94\x5c\x92\xc7\x7e\x5b\x4f\xc7\xbe\
+\xce\xc1\xde\xc6\x38\xec\x7c\x7b\x9d\x85\xac\x08\xb5\x34\x3e\x47\
+\xe8\x6e\x00\x0f\xf7\xbb\x93\x4f\xb2\x65\xef\x17\xd7\xd2\xe1\x8d\
+\x1f\x61\xf7\xdf\x11\xd8\xf8\xb8\xe4\x44\x18\xfc\x3e\xe8\xeb\x40\
+\x57\x43\x00\x4d\xa5\x73\x52\x03\x8c\x5a\xe3\xa5\x43\x9b\x5c\xd8\
+\x51\xd7\x05\xce\x29\x0c\x06\x98\x2c\xd3\xe9\x0b\x22\xee\x6b\x46\
+\xf3\xd1\x45\xa9\x01\x46\xae\xfe\x9d\xf6\x95\xe4\x63\xf3\x9f\x61\
+\x38\xf8\x74\x5f\x9f\x84\x54\x05\x62\xfe\x20\xe8\xfe\x63\x04\x4e\
+\x2c\x4d\x0d\x90\xbd\xfc\x02\xed\xd9\xe3\xc6\x37\x9e\x10\xec\x6a\
+\x7f\x88\x4c\xe2\xb4\xfa\x5b\xf9\x79\x84\xe0\x99\x65\xa9\x01\xb0\
+\xf0\x2c\x8d\x9f\x94\x85\xa6\x3b\x4f\x61\x57\x64\xa2\x8a\x2c\x93\
+\xc4\x55\x16\xe3\xf9\xd5\x95\x2f\x03\xca\xce\x57\x0c\x91\x52\x6e\
+\x95\x44\xf1\xb7\xd1\xe7\x8a\x94\x9a\x03\x11\xfe\x06\x74\x45\x51\
+\xe8\xc5\x15\xfb\x47\x45\x4a\xa4\x47\xe2\x48\xe7\x79\x3a\xaf\x6f\
+\x17\xbf\x9e\x2a\x6b\x9f\xf1\x89\x2b\x5b\xe5\xa6\x42\x34\x68\x7f\
+\x06\x84\x42\x70\x5f\xb2\x27\x46\x93\x0c\x18\x86\x8e\xbf\xea\xea\
+\x83\xe2\xda\xf5\x9b\x94\x3f\xdd\x95\xbc\xf2\x00\xab\x6b\xab\x46\
+\x28\x1a\x42\xc1\xe8\xf9\x70\xa6\x39\x51\x7b\xa3\x1e\xa2\xba\xfa\
+\x32\x15\x16\x16\x30\xd1\x48\x5a\x58\x15\x2a\xda\x22\x6d\xd8\x72\
+\x7b\x31\x32\x87\x04\x91\x4b\xdb\xb0\xda\xb5\x0a\x35\x35\x57\x20\
+\x2e\x54\x54\x52\xd1\x9c\x99\x5c\x6e\x7a\x4a\x80\x40\x77\x00\x0b\
+\x4f\x4e\xc6\x88\xd1\x1a\x96\x68\x25\x28\x9e\xbb\x16\x9e\x4b\x55\
+\x10\xa7\xce\x94\x53\xd1\xa7\xb3\xa1\xeb\x3a\x84\xd5\x9a\xde\xdc\
+\x9e\x5e\x11\x7f\xc0\xa1\xa6\xc1\xdf\xe6\xe7\xc6\x07\x7c\x98\x3d\
+\x06\x76\x87\x03\x17\x2f\xfd\x01\xf1\xd3\xf1\x5f\x68\xc1\xbc\xb9\
+\xe8\xe8\x08\xa3\xa7\xbb\x1b\x42\x51\x92\xf2\xc2\x82\x28\xec\x89\
+\x55\xae\x9a\xa6\x61\x78\xd6\x30\x78\x2a\x18\x50\x7a\xf8\x08\xcd\
+\x72\xbb\xe1\xf3\xfb\x71\xaf\xe1\x5f\xa8\xaa\x9a\x74\xa8\x2c\x33\
+\x4d\x13\x53\x26\xe7\x60\xe2\x84\x09\xa8\xf6\x7a\x21\x76\x7d\xf7\
+\x23\x7d\xb9\x62\x79\x22\xc9\x5c\xb7\xfd\x61\x4a\xc1\x28\xf1\x7f\
+\x90\xb0\xd9\x6c\xf8\xf9\xf8\x09\x88\x4d\x9b\x4b\xbe\xd7\x32\xb4\
+\xe2\xcc\x61\x99\x89\xc5\x77\x61\xd6\x25\xbb\x3a\xbb\x10\xe9\x8d\
+\xfc\xf0\x3f\x4a\x6d\x8d\xe6\xd4\x0d\x75\xbc\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x4d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x14\x49\x44\x41\x54\x78\xda\xad\x95\x5d\x68\x1c\x55\
+\x14\xc7\xff\x77\x76\x67\x76\x66\x77\x67\x37\x9b\xcd\xc7\x66\x13\
+\x6a\x68\xeb\x47\x21\xb4\xc4\x88\x34\x05\xf5\xa5\x4f\x82\x88\x0f\
+\x82\x08\x0a\xa5\x7d\x10\x41\xdf\xb4\xb4\x98\x0a\x5a\xaa\x88\x08\
+\xbe\xf8\x50\x8b\x2d\x2d\xcd\x43\x05\x15\x04\xe9\x43\x41\x0c\x8a\
+\xa4\x31\x4a\x93\x5a\x88\x51\xdb\x0d\xa6\xf9\x68\x36\xfb\x31\x3b\
+\x3b\x3b\x99\xb9\x73\x3d\xb3\xb3\xc6\x24\x6e\x9a\x07\xf7\xec\xce\
+\x2e\xcc\x9c\x7b\x7e\xe7\xe3\x7f\xe7\x32\xec\x60\x46\xa2\xe3\x39\
+\x51\xb3\x5f\x65\x72\xe4\x30\x54\x15\x10\x3b\x2c\x90\x18\x98\x5d\
+\xf5\x38\xc4\x85\xa4\xb1\x7a\x94\x95\xd2\x59\xa1\x0c\x3c\x0c\xe1\
+\xf0\xc0\x21\x2c\xc1\xcb\xcd\x23\x9e\x9b\x65\xe5\x58\xfb\x65\x29\
+\xdd\xf5\xa2\x72\xf2\x08\xd0\x11\x07\x4b\xc5\x08\xb0\x81\xc0\xe8\
+\x0a\x85\xea\x41\xd7\x2d\x22\x83\x8f\x7e\x0b\xfb\xd3\x2b\xb3\xc9\
+\x6a\xe1\x21\x02\xf4\x89\xe8\x97\x67\x28\x55\x2b\x70\x88\x46\x60\
+\x8f\x9c\x47\xfc\xfb\xef\x58\xb9\x67\xb7\x50\x3f\x79\x93\x02\xb8\
+\x80\xe3\x6d\x0e\x5e\x4f\x26\x04\x6f\x3a\x07\xb1\x98\x27\x1f\x29\
+\xb8\x27\x87\xc1\xaf\xdf\x02\x9f\xba\xf9\x21\x55\xf0\x06\x2b\xb4\
+\xf7\x8a\xf8\xa5\x11\x08\xa3\x1a\x24\x15\x55\x61\xbf\x37\x8a\xb5\
+\xf1\x49\x23\x7a\xea\x35\x5d\xda\xdf\x0b\xac\xf1\xa6\xdd\x60\x94\
+\x6d\xed\x83\xcf\xc1\x7f\xbe\x19\x54\xf2\x4f\x55\x11\x05\x9e\x6d\
+\x8e\xb7\x9b\xc5\x83\x01\xe0\xe2\x5b\x9b\x00\xd5\x33\x97\xc1\xa7\
+\x67\x10\xbf\x78\x0a\x70\xf9\x7f\x33\x5f\x27\x50\xbf\x55\x99\x2a\
+\x09\x07\x81\x1b\x00\x21\x85\x61\x1f\x3f\x0b\xfd\xc6\x04\x63\xf9\
+\x54\x56\x24\xce\x9f\xdc\x04\x30\x09\xe0\x07\x8e\xbd\xfd\x32\x84\
+\x59\xdb\x7e\xa0\x3e\x40\x8b\x50\xf6\xd2\xe6\xfb\xb2\x02\xf3\xc4\
+\x59\xb4\x4d\xfd\xc4\xd8\x32\x01\x52\xe7\x8e\x6f\x00\x44\x50\x79\
+\x7f\x14\x52\xff\x2e\x44\x5f\x78\x02\xc2\x76\x82\xb4\x58\x10\xb0\
+\x6e\x7e\x45\xf4\x65\x9a\x82\xc2\xb1\x8f\xe0\x55\x0d\x6c\x94\x17\
+\xa3\xd9\x08\xc7\xba\x90\x71\xcc\x23\x6c\xb1\xad\x47\xb4\xfb\x80\
+\x0a\x0d\x59\x0a\x81\xc5\x35\x18\xef\x5c\x82\x3c\xb8\x17\xea\x50\
+\x1f\xbc\xa5\xbb\x40\xcd\xa9\x2b\x45\x94\x8d\x20\x40\x42\x0f\x20\
+\x7e\x3b\x92\x59\x30\x85\xaa\xe8\xe8\x02\xb8\x2f\x04\xba\xb8\x40\
+\xed\xea\x38\xaa\xdf\x5c\xbb\xc5\x16\x68\x06\xe9\x73\x27\x20\x96\
+\x57\x20\x72\xb3\xc0\xca\x12\x4a\x5f\xdc\x40\x38\xa1\x20\xba\xaf\
+\xad\xee\xbf\x9e\x79\xb3\x2e\xc1\xa3\xdc\x45\x3d\xb8\x94\xe9\x04\
+\xeb\xee\x01\xeb\x7f\x10\xd2\x9e\x7e\xdc\x7b\xe9\x5d\xb0\xb9\x44\
+\x46\x74\x3f\xdd\x0f\xbe\xb0\x42\xbd\x0c\x93\x32\xc2\x28\x4e\xdc\
+\x43\x48\x97\xa1\xef\x4b\x41\xf0\xed\x76\x96\x80\x47\xea\xf2\x0c\
+\x37\x98\x05\x7d\x84\xe0\x60\x9e\xdf\x3e\x8e\x5a\x19\xb0\x56\xaa\
+\x36\xfb\x53\x4b\x89\xec\x53\x59\x78\xae\x68\xf4\x8f\x61\x75\x32\
+\x0f\xee\x7a\xe8\x3a\xd8\x05\xcf\xd7\x7f\xb3\xf0\x9c\x83\x17\x6d\
+\xe4\xa6\x29\x99\xc6\x1e\x60\x1b\x7e\x43\x21\x06\x59\x0e\x0f\xb3\
+\x3f\xa2\x29\xb1\xeb\xc9\x1e\x02\x78\x0d\x80\x84\xa5\x5f\x56\x29\
+\x03\x1b\xbd\x8f\x52\x5f\x15\x34\x7f\x3d\xd0\x0c\x82\xce\x35\x6f\
+\x9f\x53\xb2\xb1\x3c\x5b\xb6\xd9\x8c\x9e\x16\x7e\x1b\x44\x43\xeb\
+\xfe\x22\x16\xaa\x2f\x5a\x54\xd5\x50\x26\xb3\x3f\x0d\xee\x88\xa6\
+\x7b\x81\xf9\xce\xd2\x96\x11\x89\x46\x10\xfa\xbf\x33\xb1\x8c\x6d\
+\xa7\x47\x60\xc6\xb9\x98\xd3\x13\x72\x5f\xe7\xde\x04\x78\x5d\x21\
+\xff\x3e\x97\x28\x09\xa7\xc2\xb1\x66\xb9\x70\x6c\x77\xcb\xe0\x69\
+\xf3\xd7\x3c\x98\xa6\x33\xb3\xbd\x3c\xc8\x7e\xd5\xdb\x15\x8f\x0b\
+\x3b\xa1\x47\xd0\xfd\x40\x94\x20\x8d\x2a\x49\xb2\x85\x85\x2a\xf2\
+\xf9\x9a\x5f\xc5\x8f\x14\x51\xd9\x02\x20\xbd\x63\x7c\xa0\x52\x78\
+\xe5\xbe\x00\xdf\xa6\xf4\x54\x96\x02\xcf\xf7\x74\x68\x48\xa6\x35\
+\x78\xa4\x12\x7f\x80\x73\xb7\xcb\xb0\x1c\xf7\xf1\x03\x95\xe2\xc4\
+\xfd\xd6\xef\x08\xf0\x6d\x52\x4f\x0d\xb8\xdc\x9b\x7e\x24\x9b\x40\
+\x58\x91\xea\xbd\x9f\x5f\xaa\xa0\x6c\xb9\x23\x43\x66\xf1\xf4\xff\
+\x06\xf8\x76\x3d\x96\xfc\x38\x26\x87\x5e\xdf\x9d\x89\xc3\x97\xba\
+\x61\xae\xe1\x76\xc1\xc2\xb0\x59\x62\x2d\x01\xf8\x36\xa6\x26\xc4\
+\x60\xb7\x4e\xaf\x7e\x89\x8e\x02\x09\x93\x77\x8b\x38\x54\x6d\x21\
+\xe0\x9a\xa6\xff\x30\xd8\x16\x3f\xa4\xca\x12\xa9\x93\xe1\xb7\x52\
+\x05\x07\x4a\xc5\xd6\x01\xae\x6a\xf1\xdf\x1f\xd3\x63\x7b\x34\x3a\
+\xb5\x64\x5a\x39\x96\x2f\xe3\xb0\x65\xb4\x0e\xf0\xb5\x1a\x13\xc3\
+\xf1\x18\x62\x74\xc0\x18\x8e\x8b\x71\xd3\xc4\x33\x35\xb3\x75\x80\
+\xaf\x22\xd1\xbf\x86\x22\x5a\x6f\x27\x01\xc6\x2c\x13\x96\x10\xa7\
+\x9f\xad\x99\x23\x2d\x03\xf8\x76\x45\xd1\xea\x6f\x70\x3a\x81\x3f\
+\x7b\x7e\xcd\x3a\xba\x93\xff\xdf\x78\x33\xba\xf9\x8e\xf0\x81\xd2\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xaf\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x76\x49\x44\x41\x54\x78\xda\xad\x93\x6d\x4c\x53\x57\
+\x18\xc7\xff\xbd\xb7\xf7\xf6\x0d\x7a\xfb\xfe\x26\x14\x5a\x40\x91\
+\xda\x32\x1c\xca\xd4\x7d\x80\x52\xb0\xca\xc0\x10\x71\x02\x05\x37\
+\xdd\xe6\x14\xc1\x2f\x33\xb2\x10\x7c\x89\xf1\x6d\x2c\x2a\x2b\x6a\
+\xb6\xc5\x6c\x93\x2d\x5a\x5c\x64\x31\x9b\x4b\x1c\x6a\x67\x82\x1f\
+\x70\x6e\x8a\x61\xca\x9c\x71\x2e\x20\x4a\xb6\x09\x65\x4c\x91\xbe\
+\xdc\x9d\xba\xcc\xc4\xcd\x00\x8a\xe7\xe6\xc9\xc9\x4d\x9e\xf3\xff\
+\x3d\xcf\xff\x3c\x47\x80\x09\xae\x77\x2f\x0e\x14\xb9\xcd\xb1\xc7\
+\x38\x56\x80\xcb\x83\xa1\xfe\xb6\xdb\x23\x33\x76\x65\x72\xbf\x8f\
+\x77\x4e\x30\x11\xf1\xb5\x6d\x7d\x8e\x12\x87\xba\x73\x94\x16\x82\
+\x27\x9f\x3d\x96\xc6\xf0\x48\x04\xc7\x7a\xef\x95\xbe\x65\x8b\x69\
+\x99\x34\xa0\xb1\x2b\xc0\xa7\xa8\x64\x00\x05\x04\xc9\x7f\x28\x12\
+\xc1\x4c\x15\x03\x39\x39\xfd\x4d\xcf\xbd\x96\xf2\x64\x69\xe9\x53\
+\x03\x36\xb7\xf7\x5f\xb2\x5b\x94\x76\x84\x79\x84\x48\xf6\xa1\x2b\
+\x7f\x5e\xbe\x3b\x1c\x6c\x9d\xa1\x13\xd6\x97\xd8\xd4\x98\xc9\x09\
+\xd0\x71\xfb\x7e\xdf\xd7\xbd\x23\xd6\x86\xd9\x8a\xfb\x4f\x04\x98\
+\xbd\xeb\xd2\xe6\x37\x8b\xa7\x6e\x92\x92\xca\x29\x8a\xc7\xf0\x7d\
+\x1e\x7b\xcf\x0d\xba\x2e\x78\x4c\xa7\x12\x77\x5e\xb6\xa5\x27\x4a\
+\xbb\x3c\x73\xf5\x28\x88\x13\xe3\xd7\x40\x18\x1f\x76\x0f\xe5\x36\
+\xce\x51\x9d\x9e\x10\x40\x9a\xdf\xe2\xb2\x2c\x99\xdb\x26\xd7\x4b\
+\x61\x92\x53\xb0\xab\x59\xd8\x39\x21\xfc\x37\x02\xe8\xe8\x0a\xac\
+\xf9\xae\x2a\x65\x7f\x34\x6f\x56\x43\xe7\xad\x52\xb7\xd9\x50\x9e\
+\xa6\x80\x24\x04\xec\xee\x0a\xec\xdf\x92\xa9\x58\x33\x2e\x40\x5b\
+\x7d\x76\x34\x2e\x27\x85\xa1\xf9\x08\x84\x34\x45\x3a\x10\x80\x13\
+\x53\x58\x68\x91\xe2\xaf\xc0\x5d\xf8\xce\xdc\xf2\x5d\x5c\x37\xa3\
+\x2c\x9a\x6b\x5e\xe5\xf7\x3a\x73\xe3\x6a\xd6\xe6\x25\x21\x95\x58\
+\xe6\xfb\x69\xf8\xe8\x8a\xd4\xd8\x92\x31\x01\xaa\x37\xda\x79\xf5\
+\x8b\x16\xb0\x3c\x20\x64\x29\x88\xc8\x78\x52\x34\x0d\xc2\x42\x46\
+\xbc\x18\x76\x71\x18\x9f\x9d\xb8\xd1\x7b\xf6\xf8\xb5\xac\xc8\xc9\
+\x92\x3e\xdd\xb2\x2f\xb7\x6c\xdb\x98\xb3\x61\x9a\x42\x02\x1d\xcd\
+\x23\x55\x29\x14\x8c\x09\x90\x95\xb5\x5d\x52\x64\xdb\xec\x0c\x1f\
+\x02\x13\x05\x30\x02\x30\x42\x0a\x0c\x43\x81\x26\xa1\x91\x0b\xb1\
+\xd8\x2c\xc2\xb1\x13\xd7\x70\xfc\x8b\x1f\x2b\x94\x5a\x49\xdd\x8e\
+\xad\x79\x69\x72\x31\x03\x33\x4d\xee\x4f\xcf\x8e\x0d\x40\x46\x63\
+\x82\xc4\x91\x7e\x55\x9e\x95\xcc\xb2\x0f\x6c\x02\x58\x96\x26\x21\
+\x78\x00\xa4\x49\x2b\x8a\x18\x06\x9e\x54\x09\xae\xf7\x04\xa0\x51\
+\x88\xa1\xe5\xa4\x50\x32\x40\x64\x78\xe4\xd6\xc2\x64\xb9\x69\x42\
+\x63\x8a\x79\xbe\xae\x98\xc2\xd9\x36\x99\x08\xff\x74\x42\x82\x21\
+\x34\x96\x74\x44\x91\x4e\xe4\x12\x1a\x15\x69\x32\x08\x88\x75\x6c\
+\x44\x80\xd1\x60\x10\x1d\xdd\x03\x53\x0e\x14\x27\xf4\x8d\x0b\x70\
+\xbb\xb2\xe9\x8f\x3f\xf0\x86\x6c\x35\x67\x70\x27\xcd\x09\xb5\x49\
+\x0a\x86\x8c\xab\x88\xa1\x09\x8c\x74\x42\x76\x4a\x08\x58\xb5\x62\
+\x14\x24\x49\x30\x32\x12\x44\xf7\xcf\x03\x35\xef\x17\x27\xee\x9d\
+\xd0\x3b\x38\xfc\x79\xeb\xcd\x48\x30\x6c\xfa\xaa\xd5\x87\xd1\xb4\
+\x62\x1c\xbd\x96\x08\xa9\xc3\x04\x09\x1b\x81\x88\x58\xc4\x10\xcb\
+\xa2\x90\x30\x51\x29\x74\xc4\x00\xb7\x03\x3e\x6f\x61\x42\xd9\x84\
+\xde\xc1\x3b\x0d\x8d\x2d\x45\x45\x05\x2f\xaf\x5a\x5d\x85\xca\x57\
+\x96\x21\x63\x7a\x12\xfe\x08\x8a\x90\xdf\xd0\x0f\x36\x6b\x2a\x24\
+\xd1\x3b\x21\x36\xb1\x51\xbb\x64\x42\x0c\x76\xde\xec\x1d\x68\xca\
+\x8a\xff\xaf\xce\x63\x01\x15\x95\xaf\x2d\x7d\xcf\xbb\xcb\xb7\x64\
+\x71\x19\xf2\x0a\xdc\xc8\x4c\x7f\x0e\x3a\x9d\x1a\x09\x06\x15\x8e\
+\x5f\x1d\x14\x7b\x6a\x2f\x5c\x67\xf3\x66\x99\x84\x52\x21\xb1\x8b\
+\x82\xa0\x6f\x08\x77\xfc\xe7\xe2\x71\xfe\xf5\xde\x71\x01\xd9\x39\
+\xf9\x71\xcd\xcd\x07\x7b\xea\xea\xeb\xa1\x54\xa8\x31\x7f\x81\x13\
+\x06\xad\x1e\x2a\x95\x06\x2a\xb9\xc4\xa5\x50\x6b\x4e\x3d\x48\x9c\
+\xbe\xbd\x02\x09\xd3\x56\x50\x64\x76\xf9\x9b\x3d\xeb\xf8\x1f\xaa\
+\xcf\x3f\xae\xd8\xff\x01\x4e\xfa\xdb\x7b\xae\x74\x5f\x89\xfb\xd6\
+\x7f\x1a\x65\x9e\x4a\x4c\xd1\xe9\xa1\x54\x71\x7e\x4e\x2e\x3b\x60\
+\x34\x1a\x0f\x8d\x3b\x75\x63\x01\x0e\x7e\xda\x72\x78\x7a\x6a\x72\
+\x69\x5d\xfd\x26\x78\xca\xcb\x61\xb5\x5a\xa0\xd1\xa8\xc2\x2a\xa5\
+\xbc\xc3\x68\x30\xce\x7b\x52\xf1\x47\x00\xeb\x6b\xeb\xaa\xab\xd6\
+\x54\x35\xad\x5c\xb9\x0a\xae\x7c\x37\x66\xa6\x3b\xa0\x27\xbe\xc7\
+\xc8\x63\x9b\x2c\x09\xe6\xb5\x4f\x23\xfe\x10\x90\xeb\x5a\x90\xb8\
+\x6f\x9f\xf7\x97\xad\xdb\x77\x42\x67\x30\xc0\xe5\x74\x12\xff\xb9\
+\x23\x5a\x8d\xba\x5d\x2a\x95\xf8\x4c\x46\xc3\x6f\x93\x02\xac\xaf\
+\xad\xdf\xb1\x68\x51\xe1\xdb\x7b\x1a\xf7\xc2\xe3\xf1\xc0\xa0\xd7\
+\x92\xea\x15\x9f\x58\xad\x49\xcb\x9f\x56\xf8\x11\x40\x8e\x73\xfe\
+\x6a\xaf\x77\xcf\xfe\x73\xdf\x77\x62\x6a\x72\x22\x34\x6a\x35\x14\
+\x1c\x37\x64\x34\xea\xb9\x67\x02\x28\x7f\x75\x79\x73\x81\xfb\xa5\
+\x4a\x9d\x56\x0b\xa3\x41\x07\x2e\x56\x76\x24\xde\x1c\xbf\x74\xb2\
+\xe2\x0f\x01\x1b\x36\x6e\xe3\xe7\xcc\xc9\xea\x54\x69\x95\xde\x17\
+\x32\x9f\xff\xe8\x59\x08\xff\xbb\xfe\x06\x56\xcb\x4d\x28\x73\x5e\
+\xbd\x4c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xcf\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x96\x49\x44\x41\x54\x78\xda\xb5\x56\x69\x6c\x54\x65\
+\x14\x3d\x33\x6f\xf6\x7d\x69\x69\x3b\x2d\x5d\xa4\x38\x05\xa1\x34\
+\x50\x51\x30\xa1\x50\x0a\xa2\x02\x26\x02\xa9\x11\x45\x04\x62\xf8\
+\x01\x2e\x60\x6a\x94\x28\x10\x42\x04\x03\xd1\x04\x21\x26\x60\x0c\
+\x12\x0b\xa1\x26\x8d\x04\x41\x44\x76\x84\x46\x0a\x88\xad\xec\x85\
+\x52\x3a\x5d\xe8\xb4\x9d\xed\x2d\xf3\x56\x6f\x47\xd3\xd8\xb0\xd8\
+\x98\xf8\x92\xef\xcd\x97\xf7\xde\x77\xcf\xbd\xe7\x9e\x7b\xef\xe8\
+\xf0\x3f\x5f\xba\xc1\x7c\x34\x6c\x5b\x28\xaf\x30\xd3\xf4\x46\x91\
+\xdf\xb8\xd0\x65\x45\xde\x3d\x5e\xc5\xd9\x26\xf1\x95\xdf\x17\x65\
+\xee\xfe\xcf\x00\x79\x5b\x9a\xa7\xcf\x18\xe9\x5c\xe8\xb1\xea\x67\
+\xe5\x3a\xf5\x8e\xba\x4e\x1e\xf5\xad\x02\xae\xdc\x62\x01\x36\x86\
+\x40\x5e\x16\xfc\x36\x43\x76\xc3\x92\x9c\xb6\x41\x01\x64\x6c\x68\
+\xca\x2f\xca\x35\xcf\x2c\xc9\x32\x2f\x0c\xd8\x8d\xe3\xb2\x9d\x0c\
+\x4e\xb5\x0b\x38\xd9\xc4\xe2\x7a\x87\x08\x85\xbc\x06\xb4\xbf\x8f\
+\x88\xb4\x95\x50\x90\xe1\x4b\xde\x7e\xa7\xc0\xf2\x48\x80\x27\xb7\
+\x37\x7f\x58\x51\x64\x5f\x55\x1a\x70\xda\xe2\xb2\x86\x6b\x31\x05\
+\x75\x77\x79\x74\xc7\x25\xb0\xbc\x82\xa4\x24\x63\xf3\x24\x33\x26\
+\x79\x44\xe8\x24\x16\xbd\xf1\x04\x5e\x3f\x67\xc1\xaf\xb7\x09\xd0\
+\x64\x44\xd0\x6f\xeb\xb8\xf6\xd6\x63\x59\x0f\x05\x58\x57\xd7\xab\
+\x4d\x19\xe6\xc1\x37\x21\x09\x3c\x2b\x81\x13\x68\x71\x0a\x22\x9c\
+\x04\x9f\x59\x8f\xfd\x2f\x38\xc1\xb1\x3c\x3d\x13\x10\x63\x13\xe0\
+\x39\x0e\x76\x31\x86\xe0\x41\x3f\x44\x9e\x03\x8c\x36\x8c\xf0\x9a\
+\xf7\x5e\x79\xb7\xb0\xf2\x81\x00\xaf\xee\x6b\xd3\x4c\x2e\x1b\x2a\
+\x0a\x1c\x38\xd5\xa3\x80\x25\x90\x04\x2b\xa3\x33\x26\xe1\xab\x72\
+\x37\x82\x3e\x06\x6c\x3c\x8e\xea\xab\x2c\x2a\xd2\x04\x24\x05\x01\
+\xe0\xe2\x98\x71\xda\x8e\x3b\xdd\x44\x99\x2c\xc0\x6a\x72\x22\xc7\
+\xa6\x5b\x76\xe3\xfd\xa2\xad\xf7\x01\xcc\xac\x69\xd1\x1a\xba\x80\
+\xb5\xe5\xe9\x68\xd1\x18\x84\x12\x32\xe2\x04\x10\xe5\x54\x2c\xc8\
+\xe6\x50\x51\x98\x8e\xb9\x07\xba\x70\xa9\x59\xc4\xa2\x31\xc0\xf2\
+\x7c\xca\x47\x32\x86\x67\x8f\xdb\x70\x23\xac\x07\xd4\x64\x0a\xc4\
+\x6b\x72\xc0\x67\x42\x71\xd3\xaa\x27\x1a\x06\x00\x54\xec\x6c\x62\
+\x8f\xdc\x12\x6d\xe3\x8b\x3c\x58\x57\x96\x8e\x43\x61\x15\x51\x8a\
+\x22\xc6\xcb\xa9\xdf\xae\xb8\x0a\x55\x56\xd0\x4b\xb4\xad\x2f\x05\
+\xa6\xf8\x45\xc4\xb9\x18\x8a\xf6\xd8\xa0\x37\x69\xf4\x8e\x12\x2e\
+\x13\x88\x22\x23\x60\xb1\xc3\xa0\x28\x43\x5b\xd6\x95\xb4\xf6\x03\
+\x64\x7f\x70\xae\x2a\xa4\x37\x6f\xf4\xfb\x1d\x78\x7e\x8c\x17\xf3\
+\x82\x6e\x1c\xb8\x27\x41\x20\x80\x58\x2a\x27\x14\x11\xed\x3b\xa2\
+\x2a\xce\xbf\xc4\xd0\x73\x1e\xbb\x6f\x0a\xa8\xfa\x45\x0f\x3d\xa3\
+\x42\x94\x48\x50\x29\x10\x31\xa5\xb2\x2c\x1d\xd3\xda\xbe\x7e\xec\
+\xd0\x01\x32\x0d\xbc\x77\x2e\xd4\x66\xb3\x05\x0a\x03\x4e\xac\x28\
+\x4b\x83\x6c\x30\xa2\xb1\x57\x06\xc7\x4b\x64\x5c\x45\x9c\x12\x1f\
+\xea\x95\x70\x75\x9e\x85\xd4\xc5\x63\xfb\x15\x1e\xeb\xeb\x75\xd0\
+\x54\x05\xa2\xac\x82\x84\x46\x11\x24\xff\x5a\x8c\x15\x01\x91\x6f\
+\x68\xdb\x38\xbe\xb8\x1f\x20\x7b\x65\x5d\x20\xa2\x31\x21\xde\xeb\
+\xc0\xe8\x3c\x2f\x3e\x9d\xea\xc7\x4f\xdd\x40\x84\x17\x91\x20\x6a\
+\x12\x14\x41\x6b\x44\xc6\x85\x17\x2d\x94\x64\x0e\x17\xdb\x79\x3c\
+\xf7\x83\x06\xbd\x41\x25\x19\xf7\x49\x99\x52\xa1\xd0\xad\x6f\xf5\
+\xd1\x05\x3b\x02\x7c\x7c\x6f\xdb\xe7\x13\x2b\xfb\x0b\x2d\x73\xd9\
+\xa9\xd5\x1d\x0e\xfb\x1a\xdf\x10\x0f\x26\x8f\x70\xe1\xed\x71\x3e\
+\xec\x6e\x25\x8a\xc8\x38\x9b\x90\xd0\x43\xb2\xa5\x32\x41\xd0\xa5\
+\xa0\xb5\x4b\xc0\xad\x5e\x15\x5d\x6c\x9f\x61\x19\x82\xf6\x4f\xaa\
+\x52\x1b\x98\x54\x13\x7c\xb1\xf8\xac\x01\xad\xc2\xb7\xec\xa4\xd0\
+\xe3\xf5\x9a\xf3\xb3\x5c\x58\x3a\x21\x0d\x19\x5e\x0b\xea\xba\x44\
+\xb0\x44\x51\x34\xa1\x52\x44\x12\x0e\x4f\x37\x42\xa0\x5a\xd0\x8b\
+\x2c\x4a\xf7\x31\x08\xf3\x5a\x2a\x8a\x7e\xaa\x52\xaa\x4a\xa6\xec\
+\xd9\xe9\xcc\x00\x00\xff\xe2\x9f\x8b\x23\x0e\xe7\x25\x25\xdd\x8d\
+\xd1\x39\x2e\x6c\x99\x9e\x8e\x63\x51\x20\x14\x15\xa9\xf0\x14\xa4\
+\x33\x0a\xb6\x4d\x34\xa1\x27\xc2\xc1\x40\x55\x5d\x79\x02\xb8\xd8\
+\x41\xde\xab\x2a\x04\x51\x81\x20\x53\x5e\x48\x71\x7d\x9c\xb9\xa4\
+\x38\x8c\x51\x61\xc7\x7d\xcd\xce\x3f\xff\xc0\x9e\xee\x9c\xf4\x4a\
+\x77\x9a\x0f\x13\x86\xbb\x51\x35\xc1\x87\xbd\x6d\x44\x03\x79\xdf\
+\x1e\x95\xb0\x72\x04\x83\x69\x99\x0a\x76\x35\xb2\xf8\xa8\x9e\xda\
+\x85\xa2\x82\x13\x35\x90\x0f\xb0\xf2\xdd\x18\xa5\x5c\xc7\xa6\x69\
+\x99\x38\xd4\xe9\xc5\x9a\x79\x25\xba\x07\x76\x53\xcb\x92\xa3\x9a\
+\x10\xf0\x22\x27\xc3\x87\xc5\xe3\xbd\x18\x95\xe9\xc0\x91\x8e\x24\
+\x25\x5b\x41\x98\xf2\x11\x8e\xc9\x10\xfb\x8a\x58\xd2\xc0\x27\x04\
+\x04\x7a\xff\x40\x99\xb5\x15\xaf\x4d\x2e\x46\xd1\x98\xb1\xa0\xec\
+\xe3\xb3\x23\x2d\x58\x51\x91\xf7\x60\x00\xd7\xdc\xda\xca\x58\x56\
+\xe6\x1e\xf8\x3c\x18\x59\xe0\xc4\x86\xf2\x21\xb8\xcc\xe9\x70\x2b\
+\xae\x20\x4a\xb2\x8d\x90\xb7\xcc\xed\xab\x70\x37\x9f\xc5\x9c\x42\
+\x23\x46\x95\x3e\x85\xa1\xb9\x79\x64\x98\x01\x63\x30\xc0\x6c\xb1\
+\xe0\xb7\xbb\x51\x8c\x5d\x7a\xb8\xf6\xa1\xf3\xc0\x31\xa7\xf6\x52\
+\xa2\x30\xbb\xd8\x49\x54\x95\xe4\xbb\xf1\xc9\xd4\x34\xec\xba\x99\
+\x80\x78\xe2\x47\x64\x85\x2f\xe0\xe9\xd2\x31\x18\x1e\x0c\xc2\xea\
+\x74\x83\x21\xc3\x46\xb3\x09\x4e\xab\x05\x36\x97\x1d\x8d\xcd\x31\
+\x2c\xdf\xd5\x88\x93\x67\xda\x1f\x3e\x70\xec\xb3\x6b\xcc\xbc\xc7\
+\x29\xa8\xf9\x19\xc8\xce\x48\x43\xa9\xee\x2e\x26\x86\xbe\xc7\xb8\
+\x89\xcf\xc0\xe5\x4f\x23\x29\xea\xc9\x53\x33\xec\xe4\xad\xcb\x61\
+\x81\x8e\x31\x63\x47\x7d\x18\xeb\xbe\xbe\x0c\x2e\x9c\x04\xe3\x30\
+\x1f\x36\x9b\x8c\x2b\x1e\x39\x32\x4d\x33\xaa\xd7\x8a\x8f\xe7\x7e\
+\x0c\x4f\x06\x6a\xca\x22\x28\xb0\x89\x10\x29\xa9\x3a\x4d\x83\x89\
+\xd1\xc1\x4b\xf3\xf3\xf8\x1d\x15\x3b\xce\xc4\x71\xe6\x74\x3b\x60\
+\xd0\xf3\x46\xab\xbe\x4a\xda\xff\xf2\x17\x03\x5a\xc5\xa3\x2e\xfd\
+\xec\x9a\x90\x1a\x2c\x08\x7c\x39\x45\xc4\x78\x8f\x44\x74\xe8\xd1\
+\x23\x68\xf8\xb6\x51\xc6\x77\x75\x09\x44\x3a\x69\x26\x68\x62\x35\
+\x63\x64\x36\x2b\x07\xe7\x5f\xb8\xaf\x5d\xff\x2b\x40\xf9\xce\x80\
+\x9a\x36\x24\xb4\xf5\x4d\x3f\x84\xee\x24\x6a\xaf\xa8\x38\x7d\xbe\
+\x97\x66\x42\xa2\x85\x9a\xd1\x26\x1c\x5d\xb0\xe5\x51\xe7\x07\xf5\
+\xaf\x02\x93\xb6\x6d\xc4\x90\xdc\x2a\x08\x54\x3d\xd1\xf6\x6a\x18\
+\x4c\xab\x71\x6c\x49\xe7\x60\x8e\xfe\x09\xb7\xe8\xb8\x9b\x6a\xcc\
+\x65\x66\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x29\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xf0\x49\x44\x41\x54\x78\xda\x8d\x96\x7b\x50\x54\x75\
+\x14\xc7\xbf\xf7\xee\xe3\xee\xfb\xee\x2e\xcb\xee\xa2\x02\xe2\xa3\
+\x34\xff\x40\x44\x33\x9b\x0c\xcb\x46\x36\x6a\x44\xc1\x14\x1c\x06\
+\xc7\x50\xca\x7c\x8e\xd9\x8c\xe3\x94\x0e\x36\x35\x4e\x3e\x1a\x46\
+\x98\xcc\x7c\xa4\x99\x80\x0f\x30\xcc\x41\x8a\xc2\x8c\x8c\x51\xc1\
+\x47\x63\x6a\x80\x88\xa2\xbc\x96\x7d\xdf\x7d\xef\xde\x7e\xac\xa0\
+\x99\x8a\x9e\xb9\x77\xe6\xce\xfd\xfd\xce\xfd\xfc\x7e\xe7\xdc\xf3\
+\x3d\x3f\x0a\x4f\xb1\xee\xa5\xea\xcd\x34\xab\x7c\x4d\x64\xd0\x25\
+\xd3\x2a\x16\x08\xf9\x10\x76\xba\x10\xe8\x75\x36\x84\x6d\xf6\x5a\
+\x7d\x91\xf5\xa3\xc1\xfc\xa9\x27\x0d\xec\xdd\x7b\x54\x46\x87\x82\
+\xe5\xb3\xba\x3f\x49\x95\x8f\x9f\x00\xbe\xb7\x1d\xbc\xdf\x73\xcf\
+\xa5\xef\x12\x0a\xe0\x69\xb9\x85\xf2\xb8\xc2\x6a\x9e\x16\x64\x2c\
+\x5c\x98\xe9\x7e\x66\xc0\x9e\x9d\x07\x8b\x68\x01\xbd\x54\x13\x1b\
+\x87\xf1\xb5\x79\x88\x89\x51\x23\x64\x31\x93\xd9\xf4\xfd\x39\x34\
+\x79\xec\x34\x73\xb8\x92\x7e\x14\x3d\xad\x37\x11\x0a\x85\x8a\xdf\
+\xcd\x9f\xbf\xec\xa9\x80\xaf\x8b\xbe\x6d\x67\xd5\xaa\xa1\xc3\x47\
+\x0d\x85\xc6\x30\x0c\xc1\x43\x4b\x30\x9a\x72\x22\xd8\x76\xe3\x21\
+\x80\x20\x1c\x44\xb3\x71\x24\xc4\x0b\xca\x60\xef\x69\x47\x4b\xd3\
+\x6d\x58\x7b\xad\x77\xde\x5f\xb6\x70\xd8\x13\x01\x45\x85\xbb\x2f\
+\x1a\x87\xe8\x12\x47\x8c\x8c\x43\x54\x94\x16\x4a\x4d\x34\x1c\x75\
+\xdf\x40\xf1\xd3\x2e\xc8\x7a\x2c\xe0\xfb\x01\x7d\x4e\x5e\x37\x07\
+\xeb\xfc\x15\x88\x4e\x5b\x07\x07\xd9\x9d\xd5\x6a\xc5\x8d\x96\x36\
+\xdc\x6a\xbb\x7b\x69\xf9\xca\x45\xe3\x1f\x01\x6c\xdf\xba\xb3\x80\
+\xd5\x2a\xd7\x8f\x4b\x1c\x83\x68\x9d\x0e\x2c\xcb\x82\x16\x8a\xe0\
+\xe8\x6c\x41\xe0\xb3\x59\x30\xda\x3c\x08\x87\xef\x79\xf4\x61\xba\
+\x9c\x66\xf0\x5f\xd6\x42\x93\x90\x08\x9a\xe7\xc1\x71\x4e\x98\x7b\
+\x2d\xf8\xab\xf1\x0a\x7a\xba\x6d\x1b\x57\x7c\x98\xbf\xe1\x3e\xe0\
+\xf3\x2d\xfb\x65\x52\x9e\xe3\x26\xbf\x3a\x01\x31\x7a\x23\xb4\x5a\
+\x75\x64\xc8\xef\xf7\x83\x97\xb1\x68\x4e\x57\x20\x9e\xd5\xc3\xe1\
+\x72\x91\xd7\x14\xc4\x3c\xe0\x74\x58\x60\xac\x09\x80\x72\x59\xc1\
+\x30\x62\x08\x04\x42\xd8\xed\x76\x98\xcd\x66\xd4\xd6\xfc\x09\x0f\
+\x64\xf2\x75\x6b\x72\xdd\x11\xc0\xf6\x82\x0d\x27\xa3\x12\x53\x52\
+\x93\x12\xc7\xc2\xa0\x53\x43\x44\x53\xf0\x79\x38\x02\xf0\xe1\x44\
+\xd5\x19\xa0\x76\xeb\xc9\xe8\xb6\xc6\xb5\xbc\x40\x28\x8e\xac\x8a\
+\x0f\xfb\xad\x86\x51\x9b\x02\xa6\xf5\xa6\xb4\x19\x2f\x43\x24\x16\
+\x41\x22\x95\x93\x1d\x0b\xd1\x63\x71\xe0\xc2\xe5\xbf\x71\xbb\xfe\
+\x97\xea\x55\x05\x1b\x4d\x54\xd7\x32\xcd\x66\x69\xb4\x7c\x8d\xbd\
+\xc3\x03\x07\x1b\x0b\xe6\xc5\x74\x88\xc7\x9a\x20\x34\x3c\x8f\xca\
+\xf2\x9f\xd1\xd5\xd1\x3d\x77\xc3\xfa\xe5\x87\x1f\xf7\xb7\x15\x6c\
+\x2c\x9a\x6b\x30\x6a\xcb\x66\x65\x67\xc2\xd3\x5c\x0f\xbe\xf3\x32\
+\xb8\xfa\x43\x60\xbd\xbd\x60\x75\x02\xb8\x5b\xdb\xb7\x50\xe6\x8f\
+\xe3\xcf\xb3\xa3\x8d\xc9\xe1\xdb\x76\xf2\xdf\xb9\xe1\x23\xb7\xcb\
+\xee\x42\x17\xe7\x45\x13\x23\x6f\x98\x5b\xcb\x4d\x1c\xac\x90\x76\
+\x66\x4d\xa8\x4a\xb2\x5d\x37\xe9\x86\xc4\x40\xa3\x56\x43\xaa\x91\
+\x82\x92\xf9\x41\x8f\x1e\x01\xcb\x99\xdf\x1b\x28\x7b\x61\x22\x2f\
+\x55\x8a\x10\xba\xe3\x04\xdf\xed\x07\x6c\x41\x80\x0b\x83\xf3\x06\
+\x51\xc7\x39\xa6\xcf\xfe\xcd\xf3\xeb\x60\x80\x63\x53\x99\xe9\x2f\
+\x19\x8c\x35\xac\xcf\x07\x5e\x4a\xd2\xaf\x11\x81\xd2\x09\x21\x48\
+\xd0\x83\x73\x79\x40\x39\x77\x4d\xe1\x19\x2a\x80\xd0\xdd\x7b\x00\
+\x9e\x00\x28\x02\x68\x73\xbb\x71\xcd\xeb\x9f\x34\xfb\x14\x77\x7e\
+\x30\x40\xc5\x34\xf9\xc4\x31\x8c\xf8\x5c\xbc\x54\x06\x5e\x42\x81\
+\x52\xf7\x03\x86\x4a\xe1\x15\x6b\x08\x60\xef\x34\x9e\x09\x3b\x09\
+\xc0\xf5\x10\xe0\x2e\xe7\xc1\x65\x9f\x6f\x62\xc6\x29\xae\xe1\xa9\
+\x00\x09\x73\x2e\x5e\x22\xfd\x1f\x40\x06\x2f\x45\xc2\x65\x2f\x4c\
+\xe2\x65\x5a\x39\x82\x37\xba\xc0\xf7\x90\x10\x59\x09\xc0\x15\x02\
+\x27\x96\xe0\x8f\xae\x8e\xec\xf4\xd3\xbe\xd2\x41\x43\x34\x4d\x36\
+\x3d\x59\x2a\xab\xd1\x31\x4c\x04\x80\xfb\x00\x39\x09\x33\x0f\xca\
+\xbc\x2e\xf6\xbc\x7a\x6a\x4a\x72\xb8\x89\x48\x81\x47\x08\xb7\xc5\
+\x03\x5b\xaf\x0d\xe6\xbb\x9d\xa8\x13\xc6\x55\xad\xaa\xbc\x92\x36\
+\x18\xa0\xe4\x35\x45\xd5\x18\xbf\xcb\xa4\x67\x24\x90\xab\x64\x90\
+\xea\xe5\x80\x41\x02\x3a\x4e\x01\x6b\xab\xa5\x81\xea\x5e\xaa\xd9\
+\xac\x78\x6e\xf8\x1a\x0b\x59\xbd\x4d\xa8\x81\x62\xf2\x3c\x50\x43\
+\x12\x21\x1d\x35\x05\x3b\xb6\x15\xa3\xed\x66\xfb\xbc\xdd\xbb\xb7\
+\x1c\x7a\xdc\xc7\x17\xe7\xad\x99\x3b\x6c\x78\x6c\xd9\xa2\xf7\x72\
+\xe0\xef\xb8\x8a\x60\x53\x0d\x82\xff\xd4\x41\x7e\xf3\x02\xd4\x06\
+\x19\xdc\x56\x6e\x4b\xa4\xd0\x56\xe7\xe6\x9c\x1c\x67\x9a\x97\x9a\
+\x32\x75\x12\xa2\xa3\xd4\xa0\x88\x26\x78\x48\x92\x43\x01\x1f\x76\
+\xec\x2a\x81\xbe\xfe\xab\x93\xb1\xee\x8e\xb5\x61\x8a\x8a\x14\x1a\
+\xcd\x87\xfc\xd7\x55\xa3\x36\xb9\x93\x72\x4d\x79\xf9\xd9\x10\x92\
+\xfa\x93\xc8\xe4\xa4\xe0\x24\xb0\x91\x5e\x71\xea\xf4\x59\x34\x56\
+\x1e\xa8\xde\xb6\x6f\xbf\x29\x02\xc8\x5a\xb0\x5a\xa6\x16\x04\xb8\
+\x25\x2b\xf3\x11\xa5\xd5\x82\x55\xb3\x44\x7e\x83\xf0\xf9\x03\x80\
+\x42\x83\x8e\x37\x84\x50\xa8\xa2\x10\x04\x0f\x9e\xe8\x8e\x4a\xa9\
+\x44\x9b\xbd\x1b\x09\x47\x48\xed\xb8\x6d\x11\xa9\x10\x8b\xc5\x70\
+\xb9\x38\xd8\x1c\x36\x14\x7e\x51\x0c\x6b\x40\x20\x2f\xdd\xb7\xcd\
+\x7d\x5f\xec\x72\xb3\xf3\x0a\xc6\x8d\x7b\x61\xfd\xcc\x39\x6f\x93\
+\x82\x61\x21\x97\x2b\x10\x26\x7a\x64\x69\xbd\x08\x6a\xd5\xeb\x30\
+\xaa\x74\x08\xf7\xcf\xed\x13\xbb\x0e\xad\x14\x82\xb5\x47\xa1\xd4\
+\x8f\x80\x48\x48\xc3\xe3\xf5\x12\x7d\x72\xa0\xe2\xf0\x71\x5c\xba\
+\x78\x69\xe3\xfe\x92\xdd\x0f\xc4\x6e\xc0\xe6\x65\xe4\x5c\x7c\xf3\
+\xad\x19\x89\x53\x5e\x99\x02\xa5\x52\x41\xe4\x5a\x87\xae\x1f\x3f\
+\x85\xf6\xfb\xed\x90\x48\xe4\x64\xfd\xfd\x12\x4c\x42\xe8\x36\x6a\
+\xe1\x48\x5d\x0c\xfd\xf4\x0f\xc0\xd9\xad\x44\x4d\x39\x9c\xa9\xab\
+\xc7\xf1\x8a\x13\x97\xca\x2a\x0e\x3c\x2a\xd7\x03\x96\x99\x9e\xd5\
+\x9e\x94\x9c\x34\x34\xf3\x9d\x74\x48\xd5\x7a\xb8\x76\x65\x62\xf4\
+\xed\x66\x84\x68\xe1\x83\x49\x7c\x18\xc2\xf8\x04\xb4\x48\x35\x50\
+\xe5\xec\x21\x51\xb2\xe0\x48\xd9\x31\x9c\x3b\x7b\xee\x4e\x79\x65\
+\xe9\x93\x1b\xce\x80\xcd\x99\x99\x55\xc4\xaa\xd8\xa5\x69\xd9\xd9\
+\x98\x54\x9d\x0b\x03\xcb\x20\xcc\xe3\x21\x80\x40\xab\x23\x2d\xd3\
+\x89\xc6\x94\x9d\x38\x71\xf0\x3b\x58\x6c\xb6\xe2\xa3\x95\x65\x4f\
+\x6f\x99\x03\x96\x31\x2b\x5b\xe6\xf7\xf9\xcb\x4b\x27\x9d\x4d\x65\
+\x62\xa3\xc1\x07\xfb\x32\x40\x28\x24\xc9\x60\x14\xa0\x35\x31\xf0\
+\x5e\xbb\x8a\xac\xd3\x63\xaa\xc5\x0c\x93\x51\xfe\x43\xc9\xb3\x37\
+\xfd\xff\x5a\xe7\x32\xed\x66\x5a\x45\x8e\x2d\x7a\x75\xb2\x80\xc8\
+\x01\x84\x0c\x42\x4e\x07\x02\x5d\x3d\x0d\x61\x27\x57\x6b\x2c\x1e\
+\xfc\xd8\xf2\x2f\x6c\x5a\x89\x96\xd9\x4f\xad\xf6\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xc9\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x90\x49\x44\x41\x54\x78\xda\xa5\x56\x5b\x4f\x5c\x55\
+\x14\xfe\xf6\xb9\xcc\x7d\x80\xca\x9d\xa1\x98\x49\x2c\x4c\x35\x46\
+\x21\x6a\x6b\xa9\x05\xc1\x52\x6c\xe2\x83\x31\xa5\x9a\x18\xe3\x1b\
+\x0f\xf8\x66\xe2\x6f\xf0\x5d\x48\xda\x44\xa3\x0f\x5e\x28\xc6\x07\
+\x63\x6a\x03\x2d\xd8\xa4\xa5\x15\x12\xc1\x22\x0d\xb5\x91\x6b\xa1\
+\xc0\x14\xe8\x50\x86\xb9\x9d\x73\xf6\x76\xed\x33\xc3\xa5\x85\x69\
+\xa5\xae\xe4\x64\xce\xac\x59\xeb\x5b\x6b\x7f\xeb\xb2\x87\xe1\x31\
+\x62\x34\x9c\x6c\xe0\x5c\xb4\x98\xa6\xd9\x64\x70\x11\x14\x5c\x40\
+\x90\x5e\x30\x40\x53\xd8\xa4\x4b\xd7\x7a\x34\x45\xed\x52\xfb\xce\
+\xf7\x65\xc3\x60\xbb\x29\x53\x0d\x27\xab\x2d\xd3\xea\x4f\x26\x0d\
+\xb7\x28\xcc\x83\xe3\xc8\x41\x68\x81\x22\x42\xb6\xec\x00\xd2\x2d\
+\x71\x27\x8c\xe5\xeb\x23\x50\xc3\x11\x3c\xe3\xf6\xc6\x3d\xba\x5e\
+\xab\xf5\x9d\x1f\x7e\x62\x80\xf8\x9b\x6f\xb7\x5b\x49\xa3\x0d\xe5\
+\x05\xf0\x7c\xd4\x0c\x96\xe3\xa3\xa3\xa4\x80\xf5\xf5\x87\x0d\xbd\
+\xa4\x77\xe8\x10\xab\x51\x4c\x7c\xf9\x33\x94\xb9\x30\x4a\x7d\xb9\
+\x1d\xee\xdf\x7e\xfd\x24\x6b\x80\x44\x7d\x73\xa7\x19\x4f\x9d\x76\
+\xb6\xd4\x43\x7b\x35\x04\x31\x3f\x0f\xb1\xb4\x08\x24\x09\x9c\x3d\
+\x92\x8b\xa0\xb3\x38\xbd\x50\x0a\x8b\x81\xd2\x32\x44\x7e\x1f\xc1\
+\xcc\x77\xdd\xa8\xcc\xcb\x3f\xe7\xbe\x7c\xe1\xfd\x1d\x01\xd6\xeb\
+\x9b\xdb\x11\x4f\xb5\xb9\x4e\xd5\x43\xa9\x2a\x01\xff\x67\x0c\xe0\
+\x26\x59\x28\x3b\xc1\xb7\x07\x11\x1c\x50\x34\x28\x07\x0e\x22\x32\
+\x3a\x83\xf1\xef\xbb\xf1\x62\x7e\x61\x87\x33\x73\x12\xdb\x73\xad\
+\xae\xb9\x9a\x19\xe6\x90\xe7\xbd\x63\x60\xfb\x73\xc1\xc7\xff\x26\
+\x27\x35\x3b\xf0\x6e\x81\xb8\x05\xe5\xb9\x10\x16\x6f\x4c\x23\xda\
+\x3d\x80\x52\xaf\xbf\xc6\x7b\xf9\xc2\xb0\x8d\xb0\xfa\x46\x53\xcc\
+\x13\x28\x74\x6b\xef\xbe\x02\x7e\x7b\x6c\x6f\xe0\x8f\x06\x09\xbd\
+\x80\x1b\x5f\xf7\xa0\x7c\x2d\x15\x2f\xb8\x72\xd1\xc3\x56\xea\x9a\
+\x1b\x9c\x29\xb3\xd7\xdd\x7a\x02\x62\xfa\x16\x01\x67\x01\x97\xba\
+\xc7\x51\x25\xfb\x8b\x3e\x19\x05\xe1\x15\x21\x8c\x7d\xf1\x13\x2a\
+\x72\xf6\x35\xb2\xa5\x63\x4d\x67\x72\x02\xc5\xad\xfa\xcb\xb9\x40\
+\x2c\x4e\x86\x7c\xab\x3c\x12\x50\x91\x0f\xd5\x61\xe5\x3e\x75\x01\
+\xfd\x9e\x48\x6c\x55\x4f\xe2\xba\xdd\x80\x8b\x1e\xbf\x9f\x86\x83\
+\x92\xa3\x59\x81\xcb\x85\x9b\x57\xa7\x11\x58\x4d\x9e\x65\x4b\x47\
+\x9b\x26\xf2\x5f\x0f\x06\x97\x95\x14\xbe\xda\xff\x9a\xed\xab\x10\
+\x70\x22\x69\x22\xb6\x1e\xc5\xec\xec\x1d\x5b\xb7\xba\x16\xa5\x04\
+\xe5\xa0\xa5\xb3\xb5\x2c\x99\xb0\x09\x7b\xf8\xa8\xd0\x5c\x2a\x32\
+\xd2\x75\xc0\x0f\x93\x3b\x60\x0c\x4e\x4f\xb2\x7b\x47\x9b\x44\xc1\
+\xe1\x00\x66\x2c\x13\x9d\xc1\x5a\xac\xcc\x4d\x63\x6a\x6a\x0a\xe1\
+\x70\x98\x0e\xc0\x40\x53\x0c\x8b\x73\x02\xb4\x6c\x10\xd3\xb4\xd2\
+\x3a\xd3\x00\x27\x3d\x97\x94\x58\x1c\x26\xf9\x4b\x1b\xd3\xe9\x41\
+\x6f\x81\x85\x72\x8f\x0b\x77\x57\x7c\x60\x0b\xb5\xc7\x45\x71\x5d\
+\x39\xee\xc6\x39\x3e\x57\xcb\x70\xf3\x8f\x41\x08\x4d\x03\x4f\xa5\
+\x6c\x00\xe9\x64\x3f\x12\x38\x03\x22\x78\x3a\x63\x93\x1b\x76\x97\
+\x4a\x3b\xa9\x93\x27\x8c\x12\x77\x57\x4a\x1d\xa8\xf2\x02\x03\xbd\
+\xd3\x60\xb3\x75\x27\x44\xe0\x70\x31\x46\x2e\xf5\xe3\xb3\x67\xab\
+\x91\x58\x5a\x22\x1a\xc5\x26\xb0\xcc\xd8\xb2\x81\xcd\x74\xc6\x96\
+\x0c\xba\x0d\x58\xd2\x23\xd2\x05\x96\x74\xad\xd1\xa2\xba\x5a\xa2\
+\x22\xe4\x53\x31\x7a\x6d\x1e\x6c\xfc\x48\xa3\x08\xea\xb3\x18\x09\
+\x47\xf1\x69\xe5\x21\xc4\xee\x85\xc9\x91\x02\xd0\x7a\xb0\x83\x64\
+\x28\xe0\x32\x90\xb0\x6c\xba\x64\x21\xb9\x48\x67\x2c\xdf\x25\x30\
+\x67\xb2\x3a\x1c\x11\x03\xb8\x5e\xa4\xe1\x79\xbf\x8a\xbf\x06\x17\
+\xc1\xfe\xcc\x2d\x9a\xa8\xaa\x70\x04\xe7\x4d\x81\x97\x78\x2e\x14\
+\xea\x24\x69\xc8\xed\x96\x83\x0d\x62\x31\x49\x0b\x03\x93\x69\xcb\
+\x5f\x45\xa6\x33\xb1\xf9\x82\xcc\x37\x18\x94\xcc\x54\x99\x1b\xc5\
+\x2a\xc3\xe8\xd8\xca\x24\x1b\x70\xf8\xce\x04\x4b\xbc\xad\xf9\x79\
+\x2e\x28\x82\x6f\xf5\xfc\xc3\x43\xb0\xa7\x99\x93\x28\xcb\x91\x04\
+\x26\x17\xd6\xcf\xb2\x6b\x4e\x6f\x83\x4f\xd7\x7a\x43\xe5\x39\x54\
+\x34\xb1\x27\xa0\x6c\x42\x77\x05\x6e\xcd\x3e\x40\xd4\x30\x1b\xed\
+\xd4\x2e\xe9\x9e\x58\x4d\x91\xdf\xed\x71\x6a\xe9\x82\xfd\x0f\x91\
+\x33\x14\xa3\x19\x1a\x0a\xaf\xc5\xdf\x32\x62\x1e\x3b\xc0\x45\xdd\
+\x53\xed\x60\x62\xe8\x50\xc9\xbe\xcc\x30\x3d\x9d\x30\x9b\x5d\x86\
+\x81\x85\xfb\x48\x09\x56\x73\xdc\x88\x0d\x6f\x92\xfb\x8b\xea\x6c\
+\x2f\x76\xea\x6d\x35\x79\x39\x30\x64\xfb\x3d\x05\xb8\x4e\x2b\x65\
+\x28\xf2\x00\x8b\x49\xa3\xe3\x1d\x2b\xb9\xb5\xae\x37\xe4\x47\xc5\
+\xd9\x59\xae\xab\xa7\x6b\xfc\x3e\x6a\x3b\xf6\x9f\xe9\x92\xb4\x28\
+\x64\x3b\x44\xeb\x64\xd6\xb0\xce\x9d\xe2\xc9\x9d\x17\xce\x86\xfc\
+\xc0\xf4\x76\xea\xa7\xb6\x5a\xbf\x17\x79\xaa\x06\xb9\x61\x76\xa3\
+\x6d\x83\x0e\x5a\x6f\x88\xd0\x10\xf6\xaf\xad\x23\x01\xde\xf1\x81\
+\x30\xb2\x5f\x99\x1b\xf2\x2d\x53\xab\x53\x02\xfd\x01\x45\x73\x57\
+\x3a\x1c\x28\xd0\x1d\x70\xd3\xcd\x26\xb6\x39\xc5\xa9\xa5\x97\x68\
+\x18\x6f\xd3\x4a\x99\xe3\x66\xdc\xc1\x50\xfb\xa1\xb0\x9e\x7c\xe9\
+\x6f\x97\x6f\xa0\x34\xd0\x09\x5a\x08\xb8\x89\x7a\x3b\x98\x6b\xe7\
+\x4b\x9b\x95\xce\x45\x0b\x7c\x92\x9c\x7b\x48\xd3\xf5\x31\x78\xd6\
+\xbf\x2d\xff\x02\xa2\xf6\x72\x5f\x1d\xcb\x63\x26\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x9e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x65\x49\x44\x41\x54\x78\xda\xb5\x55\x4d\x6c\x1b\x45\
+\x14\xfe\x66\xd7\x5e\xaf\x7f\x12\x92\x38\x3f\x8d\x9d\xb4\x06\x45\
+\xa8\x01\xa2\x26\x94\x88\x40\x85\x8a\xa0\x54\xa0\xaa\x02\x71\xa8\
+\x50\x0f\xa8\x70\x41\x1c\xb8\xa0\xaa\x54\x48\x70\x80\x03\x45\x42\
+\xe2\xc6\x85\x03\x5c\xa8\x44\x39\xc0\x85\x72\x28\x95\x82\x2a\xa0\
+\x8a\x14\xd2\x84\x26\xe2\x12\x25\x81\xd8\x49\x9d\x5f\xc7\xb1\xbd\
+\xde\xdd\x99\xe1\xcd\xee\x26\x76\x68\x13\x05\x24\x9e\x6c\x8d\xbd\
+\x7e\xef\x7b\xdf\xf7\xcd\xcc\x33\xc3\xff\x1c\xac\xfe\x8b\xdd\x3f\
+\x74\x56\xd8\xf6\x79\xe8\xfa\x80\x9e\x6a\x07\x34\x0d\x62\x66\x1e\
+\xcc\x34\xaf\x30\x33\xf2\x5a\xf8\xe6\x70\xd9\xcb\x7b\x74\x28\x06\
+\x2e\xbe\x90\x8e\x38\x83\xcc\x01\x30\x21\xe0\x66\xf3\x80\xe3\x8e\
+\x21\x62\x7c\x12\x1b\x1f\xb9\x7c\x57\x03\xfb\xf0\xc0\xa2\x76\xf4\
+\x70\x87\xfe\xf2\x33\xc0\x03\xdd\xc0\xca\x02\xc0\x39\xd0\xd2\x06\
+\x39\x3c\x0a\xe7\xf2\x35\x30\x29\x5e\x72\x99\x86\x50\x38\xfc\x9d\
+\x7e\xf6\x05\x68\xc7\xfb\x81\xb5\x02\x50\xda\x00\xcc\x28\x90\x5b\
+\x85\xf3\xfd\x0d\x54\x27\xa6\xef\x34\xfc\x31\x76\x60\xbb\x01\x81\
+\xe7\x42\xaf\x9f\xea\x64\x4f\x3f\x01\x39\x7d\x1b\x58\x25\x36\xb6\
+\x0b\x08\x17\xd2\xb6\xc0\x9a\x92\x60\x99\x87\xe0\x7c\xfa\x0d\x18\
+\x63\xd0\x2f\xbc\x0a\x54\xcb\x90\x93\xa3\x40\x45\x89\x92\xf4\xdd\
+\x21\xc5\x06\xb4\xae\x83\x10\xcb\x36\x8a\x5f\xfd\xb0\xd0\x34\xf5\
+\x5b\x8a\xd9\x7d\x83\x17\xb4\xa1\x47\x3e\xd6\xcf\x9d\x82\xbc\xf5\
+\xab\x67\x0b\xa1\x40\x4a\x41\x0a\xa8\xd0\x21\x15\x5c\x15\x87\xa0\
+\xb5\xf7\x40\x9a\x09\x20\x54\x85\x1c\x1f\xa1\x35\x4c\xd8\x94\x23\
+\xfc\xb7\x54\xa4\x1c\x07\x5a\x5b\x0b\xac\xe9\x0a\x2a\x37\x27\xde\
+\x61\xd6\x83\x47\xe6\x22\x9f\x5d\x3c\x28\x67\x88\xb9\x6b\x43\x92\
+\x05\x20\x4f\xbd\x42\x97\xc0\x85\x22\x28\xfc\xcf\x4c\x82\x3d\x3c\
+\x08\x39\xf2\x13\xa0\x1b\x3e\x73\x2e\xbc\x9f\x3d\x3b\x55\x23\x7a\
+\x29\xe5\x08\x45\xb1\x76\x75\xf2\x4f\x66\x0d\x3e\x29\x23\x97\xde\
+\x84\x9c\x1a\x85\xd4\x03\x46\x8a\xb9\x2b\x7c\x00\x8f\xa1\xf0\x8b\
+\x49\x09\x8b\x36\x42\x16\xd7\x3d\x73\xa5\x13\xfc\xc6\x83\x3c\x29\
+\xb6\xd5\x30\x22\xb3\x76\x23\x0b\x56\x3d\xf9\xbc\x34\xde\x38\x01\
+\x31\xff\x17\x15\x85\xfc\x24\x5e\x07\xac\x42\xca\x9a\x15\xb4\x4a\
+\x85\xee\x06\x2a\xb9\x02\xe5\x7e\x8d\xca\x57\x96\x4a\x4e\x62\xa9\
+\xc1\xf8\x12\xd8\x46\xdf\x80\x6c\x78\xf7\x0c\xc4\xdc\x2c\x10\x89\
+\xd6\x64\x32\x9d\x7c\xe7\x90\xf9\x25\xa0\x40\xa7\xa4\xb0\x0a\xb9\
+\x59\xf5\x3c\x16\x6b\x45\x78\xde\x29\xd0\x58\xdc\xdb\x37\xcd\x20\
+\xf5\x86\x09\x34\xb7\xd0\xa1\x68\x85\x46\x38\xf9\x31\x52\xb0\x9a\
+\xe9\x9d\x6d\x7a\xfb\xf4\x21\xb9\x42\x40\x09\xda\x40\xc3\x80\x5c\
+\x24\x35\x0b\x77\x68\xcd\xfb\x4c\x29\xd9\x13\x23\x99\xc7\xce\xf7\
+\x39\x50\xc4\x03\x5b\x94\x5d\x6a\x1f\x1c\xe1\xdb\x67\xc6\x91\x2b\
+\x45\xe7\xd8\xd2\xa1\x9e\x8f\xa2\xc7\xfa\x2f\xc6\x7a\xa2\x10\xc5\
+\x22\x1d\xd3\x19\x3a\x72\x76\x60\x8d\x52\x2f\xfd\x8d\xf6\x00\x79\
+\x0d\x78\xbb\x41\xf0\x16\x41\x5e\x90\xbf\xbe\x5c\xc6\x7c\xa1\x74\
+\x89\x2d\x1f\x79\xdc\xa8\x2e\x2d\x56\x93\x5d\x02\x9a\x69\xd0\x26\
+\x46\x48\x32\x25\x56\x89\x35\xb6\x7c\x17\x35\xa6\x5e\x33\xb1\x13\
+\x98\xfb\x04\xa4\xfa\xec\x4a\x68\xe4\xff\xd4\xfc\x06\x6c\x88\x88\
+\x77\xd1\x26\xa1\x7f\x10\x8b\x45\xde\xeb\x3e\xda\x01\x84\xc3\x54\
+\xa7\xf9\x36\x48\x5e\xc7\x2e\xd8\x68\xcf\x32\xd4\xb1\x57\x8f\x7d\
+\x60\xf5\x2c\x44\xcb\x5c\xbe\x84\x25\xc7\xfe\x70\xc8\xae\xbc\xbf\
+\x3d\x2a\x6e\x69\xc6\x8f\x1d\xc9\xf8\xb3\xc9\xde\x56\xc2\xd6\x7c\
+\xf0\xbd\xec\xd8\x62\x5d\xf7\x4c\x27\xf3\xf3\x05\x0b\xb3\x25\xeb\
+\xfa\x31\xbb\x7c\xe2\xae\x61\x37\xa6\x9b\xb9\x4c\xa6\xb9\x33\x91\
+\x8e\xf9\xde\xf3\x7f\xd8\xc1\x6b\x3e\xd7\xb3\x56\x79\x74\xe6\x50\
+\xa0\x53\x36\xb9\x51\xce\x1d\x77\xad\xf4\x3d\xa7\xa9\x8a\x89\x50\
+\x6c\xbe\x3b\xd3\x94\x6e\x68\x33\xc1\x6d\xbe\x83\xad\x67\x87\xa8\
+\x57\xe1\xaf\x1a\x2d\x9b\x15\x07\xa3\x6b\xa5\xea\x73\xc2\x32\x77\
+\x1d\xd7\x2a\x7e\x8f\x24\x22\x36\x17\xd6\xfd\xdd\x8d\x68\x6c\x8e\
+\x50\x13\xdf\xf3\xad\x0d\xdc\x61\x17\xbd\x34\x75\xb7\xe8\x72\xfd\
+\xb2\x5a\x54\x5b\xd4\x75\x52\x58\xd9\x3d\x1b\xa8\x18\x35\xe2\xa9\
+\x8a\x90\xd9\xde\xce\x38\xee\x6b\x30\xe1\x3a\x75\xb7\x7b\x4b\x8d\
+\x62\xce\x19\xfd\x05\xb8\x18\x5e\x29\x40\x68\x5a\xfa\xb4\xa8\xe6\
+\xf6\xfc\xc3\xa9\x8f\x9f\xc3\xb1\x94\xc5\x79\xb6\xaf\xbd\x11\xcd\
+\x09\x83\xc6\x50\x6d\xce\x28\x25\x3a\xad\x55\x1a\x80\xd7\xd6\x37\
+\xa1\x31\xa4\x5f\x14\x76\xee\x5e\x38\xbb\x36\x50\x71\x5d\x37\xd3\
+\xd4\x64\xfa\xb1\xd6\xc6\x48\xd2\xa4\xe3\xcb\x83\x9b\x4b\x0d\x4a\
+\xb6\x8d\xab\x9b\x25\xd0\xf4\x4a\xbf\x02\x9e\xdb\x0d\x63\xcf\x06\
+\x5b\x71\x05\xa1\xec\x53\x4d\x0d\xa9\x56\xba\x23\x92\x58\x67\x2b\
+\x16\xbe\xb5\xca\xa0\xa9\x93\x3e\x07\x91\xdb\xab\x76\x5f\x0d\x54\
+\x7c\x09\x96\x3d\x19\x4f\xa4\x38\xcd\x9b\xaf\xad\x4a\xee\x3c\x64\
+\x7a\x3f\x75\xfb\x6e\xa0\xe2\x73\x68\x2b\x16\x1d\x9d\xb7\x20\x93\
+\xfb\xad\xf9\x57\x0d\xfe\x4b\xfc\x0d\xb4\x71\xb8\xb8\xa4\xc9\xaf\
+\xcd\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x8e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x55\x49\x44\x41\x54\x78\xda\xb5\x55\x0b\x4c\x53\x57\
+\x18\xfe\x6f\x7b\xfb\x44\xa0\xb5\x94\xad\x60\xc5\x4d\xad\x0e\x37\
+\x69\xc1\xfa\x20\x23\x94\xe9\x54\x9c\x26\x30\x1f\xe0\xa6\x11\x16\
+\x75\x6c\x3e\x70\x46\x4d\xd4\x38\x9d\x2e\x23\x41\x83\x8f\xa1\x73\
+\x24\x0e\x12\x45\xb3\xcd\x0d\x32\x4d\x70\x66\x93\x32\x9d\xe2\x6a\
+\xa1\xc5\x4d\xd0\x22\x76\x82\x60\xe9\xbb\xb7\xed\x6d\x7b\x6f\xdb\
+\x9d\xdb\x05\xe7\x96\x4c\xc8\x74\x7f\x72\x93\x73\x73\xfe\xf3\x7d\
+\xe7\x7c\xff\x77\xfe\x83\xc1\x08\x63\xc7\xae\xdd\xd1\x4f\xf6\x7d\
+\x84\xfd\x73\x3c\x5c\x8c\x28\x69\x08\x54\x94\x28\x2e\x47\x43\xca\
+\xe5\x76\x1e\x7b\xe6\x04\xfb\xab\x0e\xbf\xe1\x74\x3a\xce\x33\x63\
+\xb1\x78\x74\xf9\xd6\xcd\xe5\x47\x9e\x19\x41\xe5\x81\x43\x22\x8c\
+\x85\x35\x20\x02\x0d\x15\xa4\x40\x9a\x9c\xac\x65\xb1\xd9\x85\x5b\
+\x3e\xd8\xe0\x1a\x11\xc1\xfa\xf5\x1b\x35\x6c\x9c\xa3\xc4\x30\x0c\
+\x38\x1c\x8e\x61\x7f\x65\x85\xf6\xf1\xa4\x8a\xca\xaa\x5a\x87\xcd\
+\x56\x62\xb7\xdb\x60\xa0\xff\x01\x84\x42\x34\xcc\xcb\xcf\xaf\xdb\
+\xb6\x65\x53\xe9\xe3\x79\x5b\xb7\x6d\xd7\xd0\x34\xad\x0c\x47\xc2\
+\xcc\xaf\xe1\xc8\xa1\x2a\x2d\xf6\xde\xfb\x1b\x1a\x54\xea\x5c\x79\
+\x8a\xfc\xc5\x01\x16\x0b\xc0\xe3\xb4\x4a\xdc\x8e\x87\x32\x9b\x75\
+\xc0\x00\xc0\x3a\xbc\x73\xc7\x36\xed\xde\x7d\x15\x51\x41\x9c\x10\
+\xac\x83\x83\xd0\x6d\x32\x41\xff\x83\x3e\xc8\x50\xaa\xe0\xf3\xe3\
+\x47\xb1\x5d\xbb\xf7\x6a\xd8\x18\xab\x3c\x55\x9e\xa6\x14\x4b\x9e\
+\x1f\x18\x95\x90\x64\x0f\xd2\x61\xe8\xef\xed\x91\x75\x77\xde\xe8\
+\xc5\x0e\x55\xd7\x75\xbc\x9e\xff\xe6\xb5\x08\x44\x81\x85\xce\x23\
+\xe4\xb1\x21\x3e\x8e\x03\x74\xc8\x13\xaf\x6d\xb9\x92\x65\xba\x7d\
+\xfb\x96\x3f\xe0\x2f\xb0\x5b\xed\x40\x78\x3d\x60\x43\x24\x0e\x87\
+\x03\x94\x99\x99\x90\x92\x32\xa6\x71\xd2\xe4\x97\xd2\xe7\xce\xc9\
+\xd3\xf3\xf8\xf1\x84\xdb\x4f\x81\x9f\x0c\x43\x90\x8a\x00\x92\x14\
+\x7e\xba\x78\x6e\x16\xb6\x67\x6f\xe5\xad\x65\x2b\xcb\x2e\x03\x22\
+\xc0\xd9\x18\xf0\x11\x41\xa2\x90\x03\x02\x3e\x1b\x08\x94\x6c\xea\
+\xe9\x95\x5c\x38\xdf\xb0\xe8\x76\xa7\x91\x1b\x20\x03\xe0\x72\xb9\
+\xc0\xe3\x76\x41\x4e\xde\xdc\xd0\x92\xe2\x55\xe7\x26\x8e\x4f\xb3\
+\x27\xc6\xe1\x10\x89\x44\xc1\x45\x50\xe0\x25\x69\xa0\x68\x44\x80\
+\xe4\xfe\xba\xbe\x26\x07\x5b\xbd\x7a\xed\x9e\xd9\x0b\x8a\x72\xa7\
+\xa9\xa7\xdf\xe1\xe2\x2c\x04\x8c\x43\x82\x10\x07\x9a\x59\xe0\xa5\
+\x80\xf0\xd3\x60\xec\xe8\x28\xb9\xdb\x75\x93\x7b\xb7\xab\x1d\x06\
+\x2d\x0f\x21\x31\x49\x0e\x19\xea\x1c\x98\xbf\x20\xbf\x26\x11\xe5\
+\x32\x9f\x90\xd9\x10\x3a\x81\x0f\xe5\x53\xe1\x28\xe8\x74\xbf\x28\
+\x2e\x5d\x38\xdb\x12\x2b\xf2\xbb\x65\xeb\x6a\xa7\xcf\xd2\xbc\xb2\
+\x60\xe1\x42\x3d\x23\x91\xe9\x6e\xef\x5a\xab\xcd\x02\xfd\x7d\x0f\
+\x62\xc5\x13\x8a\x52\x63\x47\x6e\xbd\xf4\x2d\xf4\xf6\xdd\x87\xac\
+\x57\x0b\x01\x8b\x46\x21\x59\x8c\xc7\xe6\x53\xc6\xa4\x82\x34\xe9\
+\x39\x98\xac\x18\x5b\xe3\xf3\x87\xa1\xa9\xa9\x29\x4b\xd7\xaa\xbd\
+\x79\xb4\xfa\x70\xe9\x23\x9b\x6e\xdc\xb4\x79\x93\x58\x34\x7a\xf3\
+\xd8\x17\x26\xc9\x87\x16\x84\x30\x51\x0d\x33\x17\x71\xb7\xae\x8d\
+\xe7\x07\x21\xce\xfa\x31\x90\x6e\x1f\x78\xa5\x5b\xc1\x8a\x0c\x9a\
+\xa4\x28\x8c\xcd\x73\xa3\xae\x47\x1b\xea\x31\xfd\xda\xeb\xf7\xfb\
+\x3e\x3c\x58\x75\xa0\xee\x6f\xf7\x00\x59\xb5\x64\xc2\x64\xe5\xf6\
+\x6c\x4d\xfe\x55\x16\xce\x0f\x31\x9a\xc6\x76\x1f\x35\x2b\xe2\xb0\
+\x3b\x1a\x3a\x68\x81\x80\xf9\x04\x50\x3e\x12\x78\xf2\xe5\xc0\xe6\
+\x4a\x21\xc4\x51\xe8\x03\x42\xb5\x7e\x08\x88\x0a\x91\xdc\x2b\x3f\
+\x7c\x97\x7d\xdf\xdc\x59\x51\x5d\x7d\xe4\x2f\x82\xa5\x4b\x8b\x44\
+\x13\x15\xe9\x37\xd6\xac\xdb\xf2\x63\x08\x15\x88\xa6\xa3\x10\x45\
+\x12\x30\x14\xa6\xae\x8e\xc5\x04\xe1\x97\x5c\x69\x3e\x07\x03\x03\
+\x7d\xe0\xf5\x78\x80\xc3\x15\xc0\xdc\x45\xc5\x90\x2c\x11\xdb\x33\
+\x67\xe4\x7c\x33\x04\xc4\x42\x32\x72\x39\x2c\xf8\xe2\x78\xd5\xec\
+\x7b\x3d\xa6\x69\x67\x4e\x9f\x74\xc5\x08\x8a\x8a\x96\x6b\xde\x59\
+\xb3\x71\xfb\x54\xa5\xd2\x4c\x87\x91\x61\xff\xdc\x3c\x10\x84\x97\
+\xfb\xf3\xe5\x96\x12\x0e\xad\x03\x9f\xd7\x0d\x7e\xb7\x13\x5c\xc8\
+\xa2\x6e\x87\x1b\x01\x62\x10\x3f\x7e\x31\xac\x58\x51\x5a\x37\x2a\
+\x7e\x54\x28\x46\x82\xd0\x18\x27\x1a\x3b\x0c\xe3\x4e\x9e\x38\x56\
+\x71\xfa\xf4\x29\x6d\x8c\x60\xc9\x92\x65\xca\x2c\xf5\x8c\x86\xe2\
+\xe2\xb7\xae\x09\x84\x82\x60\xe7\x6f\x5d\x29\x06\x63\xdb\xb8\x0e\
+\xa3\x41\xb4\xb3\xcc\x9a\x3c\x6e\x62\x32\x2a\x04\x09\x2c\xbf\x19\
+\x28\xc2\x09\x94\xdb\x83\x3e\x1f\x74\xdf\xe3\xc1\xa7\xad\xf3\x06\
+\xa7\x66\xa8\x5c\xaa\xcc\x2c\xf3\x94\x29\xe9\xfd\xa4\x9f\xe4\x9d\
+\xa9\x3f\x35\xab\xad\x4d\x57\x78\xf6\xec\x57\x86\x47\x35\x58\xb9\
+\x72\x95\x86\xcf\xe7\x6b\x30\x74\x9d\x31\x8c\xe5\xa2\xa9\x50\x23\
+\x41\x10\x9a\xdc\xec\xc4\x5a\x99\x7c\x02\xa3\x2f\xe8\xdb\xed\x70\
+\xcf\x6c\x81\xd4\xb8\xdf\xc1\xed\x44\x52\xe1\x6c\x70\xb1\xd2\x4b\
+\x13\x12\x12\xb4\x38\x97\x5b\x80\x2e\x83\x08\xb5\x0a\x20\x49\x52\
+\x5b\x5f\x7f\x52\x3b\x6c\xb3\x9b\x9f\xbf\x50\x23\x93\xc9\x9a\x53\
+\x52\xc7\x40\x38\x1c\x06\xbb\xcd\x06\x56\xab\x05\x1c\x76\x74\xab\
+\x09\x02\x70\x0e\x0e\x12\x89\x34\xef\x42\xd3\x79\xed\xbf\x61\x3c\
+\x91\x20\x37\x37\x4f\xb9\x74\x0e\xb4\xaf\x5e\x81\x8a\x87\x53\x10\
+\x09\xfa\x80\xf6\xfa\x90\x4c\x3e\x70\x5b\x48\x38\xd1\x24\x85\x4b\
+\xdd\x32\x55\x4b\x4b\xb3\xe1\x3f\xb7\xeb\xa2\xc2\x1c\x67\xf1\x7c\
+\x5c\xc4\xb8\x8a\x0a\x04\x21\x80\xc0\x49\x0f\x09\x41\x32\x08\xcd\
+\x26\xa9\xab\xf1\x7b\xbd\x78\xd8\x76\xfd\xa4\x98\x39\x33\xbb\x96\
+\xcb\xe3\x95\x30\xd6\x62\xf4\x0d\x06\x83\x40\x51\x54\xcc\x31\x02\
+\x81\xb0\xae\xb5\xf5\x6a\xe9\x53\x11\xa8\xd5\x33\x34\x39\x53\xc8\
+\xe6\xb7\x5f\xf3\x41\x84\xa2\x81\x0e\x50\x40\xa3\x47\xe7\xcb\x6b\
+\x62\xb8\x6e\x16\xe7\xe9\x74\xd7\xb5\x4f\x45\xc0\x44\xa6\x2a\xab\
+\xe1\xb3\x32\x4b\x81\x22\x8d\x84\x30\x02\xef\x34\x71\xa1\xbc\x3e\
+\xad\xb1\xad\x5d\x5f\x38\xdc\xda\x11\x11\x64\x64\xa8\x44\xa8\x9d\
+\xd7\xce\x7b\xd9\x53\x10\x8d\x44\xe0\xe2\x2d\x51\x23\x5a\x5a\x6a\
+\x34\xb6\x8f\xec\xc9\xfc\x3f\xe3\x0f\x4b\xfa\x7b\x01\x21\x77\x73\
+\x50\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xfb\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xc2\x49\x44\x41\x54\x78\xda\xad\x94\x6d\x68\x1c\x45\
+\x18\xc7\xff\xb3\x77\x97\xdc\xdd\xee\x35\xbd\x4b\xae\x21\x90\x8b\
+\x04\x8b\xd6\x97\x1e\x35\x69\xad\x89\xd2\x46\xa3\x42\x3f\x05\x8a\
+\x50\x41\x45\xb1\x52\xbf\xf9\x41\xf0\x43\x45\x48\x35\x14\x02\xda\
+\x0f\x45\x4d\xd0\x88\x82\xa8\x24\x82\xe4\x40\x29\x09\x09\xd5\x52\
+\xb4\x39\x4c\xa3\x79\x69\x22\xb5\x36\x4d\xaf\xd1\x23\x6d\xef\xf2\
+\xb6\x7b\xb7\xbb\xb3\x33\x3e\x9b\x9a\xa2\x72\x2d\x49\x7a\x03\xc3\
+\x0c\xb7\xbb\xbf\xdf\x7f\x9e\x99\x39\x86\x3b\x68\xf9\xe6\xc7\xf6\
+\x8b\xe4\x54\x27\x84\xd8\x02\x0f\x03\x7c\x6c\x94\x45\xca\xde\x08\
+\x5c\xb8\x38\xb0\xfa\x0e\xdb\x30\xfc\xa9\xfb\xea\xe4\x39\xfd\xac\
+\xcc\x2e\x00\x1e\x0f\x50\xa2\xdc\xe8\x7e\x06\xb6\x29\x78\x3a\x30\
+\x36\xbd\xe7\xce\x04\x4f\x6e\xcb\xc9\xf3\xa6\x5f\x5e\xcb\x12\xf8\
+\x1f\x41\xa9\x02\xa6\xd2\x3c\xe0\x01\x0b\x6b\x53\xfe\x93\x53\xf7\
+\x6f\x58\x60\xee\x8f\x4b\x99\x09\x41\x0c\x8d\x03\x5a\x09\xc1\x09\
+\x1a\x20\x89\xe6\xa5\xd1\x07\x04\x7d\x60\x9a\xff\xf0\x86\x05\xd6\
+\x9b\x2d\x53\xca\x03\xbb\xb7\x99\x87\xda\x5d\x10\x40\xc9\xdd\xf4\
+\x8c\xc0\x50\x4b\xe8\x37\x92\x46\x36\xa7\x37\x24\x30\xf7\x6e\x8d\
+\xb3\xf8\xdd\x23\x4a\xd3\x1e\x8f\x48\xfe\x0e\xfb\xb3\x04\x94\x8a\
+\xe0\x8d\x95\xb8\xc9\xd5\x52\xb0\x10\x49\xcb\xd4\xf5\xef\x41\xbe\
+\xe9\x9e\x03\xac\x3c\xd8\xcd\x1a\x76\x80\x79\xbd\x90\xa9\x34\xd5\
+\xbc\x02\xe2\xc4\x20\x8d\x24\xd0\x08\x5e\x46\x70\x4d\x03\x8b\x86\
+\xad\xdb\x0a\xf2\xcd\xf7\x3e\x2c\x2d\xa7\x81\x99\x3c\x2a\x75\x7b\
+\x90\x55\x6a\x2f\xb3\x0a\xf5\x05\xa5\xe1\x21\x4a\x1c\x85\x33\x31\
+\x09\x79\x61\x06\xd0\x6d\xb0\x58\x2d\x60\x58\x80\xd0\x69\x3f\x68\
+\x35\xaa\x1f\x22\xf9\xd7\xbb\x05\x05\x66\x4b\xfc\x2e\x30\xf6\x1b\
+\xa4\xf0\x4b\x5b\x40\xea\x16\x98\xa4\x23\x57\xb5\x09\x4a\x63\x1d\
+\x94\x70\x18\xce\xe8\x24\x9c\x99\x59\x98\x73\x4b\x90\x4b\x26\xfc\
+\xb6\x03\x39\x4f\x22\x1f\x6d\x7c\x9e\x03\x99\xc5\xaf\x55\x73\xfe\
+\x40\x61\xc1\xb3\x3b\x25\x54\x4a\xe1\x56\x50\xcf\x41\x66\x96\x68\
+\xb9\x1a\x94\x86\x7a\x28\x6a\x68\x25\x39\xbf\x34\x0b\x7b\x6e\x19\
+\xf6\x75\x03\xf6\xa2\x0d\xbe\xcc\x4f\x54\x68\x25\x87\xa5\xc1\x4b\
+\x91\x77\x7c\x41\x63\xfe\x27\xe0\x16\xf7\xc0\x7c\xe5\x71\xc9\xa2\
+\xe5\x90\xc1\x00\x30\x3b\x07\x91\x4e\xc3\xbb\x6f\x2f\x14\x9f\x0f\
+\xce\xf8\x04\xc1\xd3\xb0\xae\x12\x3c\x93\x83\xb3\xc0\x61\x1b\x1c\
+\xb1\x6c\xa6\x20\xab\xb0\xe0\xd5\x27\x24\xab\xa9\x01\xaa\xa8\x4f\
+\x8e\x42\x5c\xcd\xc0\xd7\xf4\x08\x95\x65\x1c\xfc\xe2\x9f\xb0\xb2\
+\x3a\xec\x6b\x39\xf0\x45\x0b\xce\xb2\x00\xb8\xd8\x51\xad\xcf\x8f\
+\xae\x5d\xf0\xd2\xa3\xfd\x08\x85\x9e\x86\x5f\x05\xb2\x59\x88\xf3\
+\x33\x50\x6a\xab\xc0\x33\x0b\x54\x12\x7d\x25\x39\xa7\xe4\x8e\xe1\
+\x10\xdc\xf9\xb4\x5a\x5f\x38\x78\xab\x83\x52\x58\xf0\x4c\x5d\x3d\
+\x3d\x19\x86\x87\x2e\x8d\x65\xd2\xe6\x99\x60\x0b\x3a\x0c\x47\xc0\
+\xce\x39\x04\xb7\x21\x0c\x37\xb9\x83\x88\xe2\xe9\x0b\x2e\x67\xf6\
+\xad\x4b\xe0\x36\xd9\x54\x7b\x8c\x2b\xbe\xd7\xb9\x23\xc1\x2c\x0e\
+\x99\xe3\x60\x6e\x49\xf2\x74\x7c\x69\x2e\x2d\x81\x52\xfa\xda\x2b\
+\x31\x1c\xd0\xb3\xbb\xd6\x2d\x78\xaf\x27\xd1\xf2\xda\x17\x6f\x27\
+\xe4\x15\xda\x64\x87\xfe\x63\x5c\x68\x9e\x52\x9b\x82\x84\x34\x92\
+\x18\x42\x42\x32\x36\x42\x2b\xa8\x5f\x97\xe0\xfd\x8e\xae\xea\xc6\
+\xc6\xdd\xa9\x93\x3f\x9e\xc1\xc1\x8e\x36\x27\x60\x70\x8f\xb4\x09\
+\x48\x77\x62\xa5\x5b\xf2\xdf\xaf\xbf\x43\x82\xd6\x35\x0b\x3e\xe8\
+\xec\x8a\xed\xda\x59\x77\x79\xe4\x97\x31\x9c\x39\x37\xf1\xd5\xe7\
+\xc7\x8f\x3d\x97\xdf\x12\x3d\x22\x1c\xd9\xea\x26\x86\x2d\xff\xff\
+\xc9\x56\x12\xfc\xb1\x26\x01\xc1\x83\xf1\xed\x0f\xea\x97\xa6\xa7\
+\x31\x34\x94\xbc\xd2\xf1\xe1\xf1\xd8\xea\x33\x63\x73\x79\x19\xb8\
+\x7c\x91\xa6\xcf\x53\x77\x6b\x6e\x50\x3f\x44\xf0\x2f\x71\x9b\xf6\
+\x1f\xc1\x0f\xa7\x4e\x5f\xce\x5c\xcf\xc6\xfa\x06\xfa\x52\x1f\x77\
+\x76\xd4\xa0\x08\xed\xa6\xa0\x7f\xe0\xfb\x94\xc3\x79\x75\x6f\xa2\
+\x37\xd5\xf5\x51\x71\xe0\x37\x05\xdf\x7e\xd7\x3f\xa8\x69\x6a\x73\
+\x4f\x4f\x0f\xa2\x95\x95\x6a\xdb\x91\xb7\x8c\xa2\x09\x86\x47\x7e\
+\xdd\x6e\xe8\xb9\xb1\xee\xee\x6e\x84\x23\x91\x9a\xa3\x6d\xad\xa9\
+\x62\xc1\x57\x04\xc9\x9f\xcf\x4e\xf7\x7e\x93\xf8\xa4\xbd\xbd\xed\
+\x68\x31\xc1\xab\xed\x6f\xc0\x0a\xb5\xd2\xe4\xf6\xef\x19\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xf0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xb7\x49\x44\x41\x54\x78\xda\xad\x92\x6d\x6c\x53\x65\
+\x14\xc7\xff\xf7\xad\xed\xda\x6d\x10\x1c\x95\x49\x07\x11\x0d\x81\
+\x29\xba\x30\x45\x86\x06\x13\x89\x1a\xe3\x07\x92\x05\xb3\x0f\x6a\
+\x48\x58\x62\xe2\x47\x49\xfc\xc0\x87\x09\xea\x20\x99\x44\x8d\x18\
+\x5d\x3a\xc6\x56\xa2\xbc\xa8\x13\x4d\x08\x46\x69\x11\x83\xa8\x64\
+\xcc\x2d\x4c\x70\x05\x6d\x4c\xd6\xad\x6f\xac\x5b\xdb\xf5\xe5\xf6\
+\xf6\x79\xee\xe3\xe9\x70\xf3\xad\x90\x6d\xec\x24\xff\xdc\x27\xf7\
+\x9e\xfb\xfb\xe5\x9e\x7b\x24\xdc\x46\x3d\xdb\x1d\x6a\xf4\xba\x07\
+\xda\x25\x13\x4e\xd9\xa2\x42\xd1\xac\x97\x2a\xab\x2b\x5e\x0d\x1d\
+\xad\xf7\x4e\xf7\x48\xf3\x85\xbf\x13\x10\xeb\xf7\xb5\x0c\xfc\x9c\
+\xf0\x8f\xc0\xe2\xb0\x15\xe1\x50\x2c\x1a\x24\x4d\x85\x75\x89\xfd\
+\xfb\xc8\xe1\xfb\x37\xdf\xae\x20\xd7\xb6\x67\xc0\x16\xbf\x16\x83\
+\xcd\x6e\x83\x6a\xb5\x40\x26\x81\x5c\x46\xb1\x58\x48\x62\x1b\x0a\
+\xbe\xb7\xaa\x76\xde\x82\xb6\xdf\x85\x38\x7d\x6a\x18\xe7\x3e\xb9\
+\x06\x7b\xa5\x1d\xb2\x66\x81\x52\xa6\x92\x80\xbe\x84\x24\xc5\x48\
+\x56\x75\xd7\xbc\x05\x27\x47\xc4\xd0\x5a\x07\x5b\xb3\x6e\x5b\x2f\
+\xac\x36\x0d\xaa\x43\xfb\x1b\x4e\x67\xc5\x4e\xa3\xaa\xb4\x44\xe6\
+\x25\x68\x19\x12\x0f\xd4\xda\xd1\x5f\xe7\x80\x72\x7c\x28\x81\xfd\
+\xfb\x7e\x83\xa3\xca\x4e\x92\x1b\xff\x41\x71\xa8\x53\x29\x8e\x6b\
+\xce\x82\xd7\xfc\xa2\x89\x9b\x38\xfe\x68\x25\x20\x33\x8e\x1f\x52\
+\x12\x24\x5d\x47\xbb\x7b\x74\x0a\x6e\x59\xa4\xde\xf8\x02\x1a\x97\
+\x63\x89\x66\xdc\x52\xb0\xf1\x44\x66\x43\x3a\xcd\x1b\x52\x29\xb1\
+\x34\x16\x31\x7c\x6f\xee\xa8\xda\x91\xd0\xf1\xe2\xe6\x4a\x81\x6a\
+\x55\xe0\x8b\x08\xc3\x2f\x49\x12\x98\xc0\xca\x0a\x81\xab\x41\x1d\
+\xc1\x70\x01\xb0\xaa\xb4\x4d\x32\xc6\x32\x62\x7f\x49\x41\xe3\x99\
+\xfc\x4a\x26\xe0\xcf\x73\xd8\x12\x93\x1c\x13\x29\x86\xa7\x37\x38\
+\xb0\x58\x95\xf1\x58\x11\x2e\x0b\x7c\x1e\x16\x18\x4c\x70\x8c\x27\
+\x39\xd2\x79\x13\x8a\xa2\x20\x49\x67\x45\xe5\x88\xa7\x04\xe2\x51\
+\xe3\x53\xd6\xea\x6c\x2a\x29\xd8\xfe\x13\x13\x15\x56\x09\x13\xba\
+\x89\xd0\x18\xc3\xaa\xbb\x2c\x70\x95\xcb\xd8\xf4\x17\xbc\x27\x22\
+\x70\x79\x82\x23\x91\xe5\x88\x46\x0b\x88\x8c\x1a\x98\x18\xcb\x7d\
+\x75\x4f\xed\xe2\x5d\xf1\x14\xb3\x26\x13\x5c\xe3\x7b\x97\xfe\x58\
+\x64\x95\x14\x34\x5f\x2c\x88\x65\x76\x05\xa1\xb4\x40\x28\x5e\xc0\
+\xdd\xcb\x34\x6c\xab\x96\xe0\x94\x8a\x70\x93\xe0\xe6\x0c\x3c\x1a\
+\x2a\x20\x11\xd7\xc1\xde\x75\x95\x64\x95\xbc\xf9\xdc\x19\x43\xd8\
+\xca\x14\xe4\x0c\x86\xf0\x04\xc3\x7d\x77\x2a\x78\x65\xb5\x86\x63\
+\x23\xff\x80\xc7\x08\x3e\x4a\xf0\x71\x1d\x82\xa1\x8e\x1f\x70\x5d\
+\x9a\xb5\x60\xcb\xa9\xdc\x37\x32\xa4\xa7\x0c\xd3\xc4\x64\x46\x20\
+\x76\x9d\xa1\xb1\xc1\x86\xf0\xa4\x84\x78\x96\xc0\x61\x86\x68\xc4\
+\x20\x78\x1e\xa2\x80\x2e\xfe\xbe\xab\xf9\x66\x8b\x52\x52\xf0\xe0\
+\x91\x4c\xbd\x60\xa2\xcf\x94\x4d\xe8\xba\x98\x92\x24\xc7\x19\x56\
+\xaf\x2d\x03\x74\x8e\xd1\x48\x1e\xc9\xeb\x04\x17\x04\x48\xa5\xbf\
+\x66\x87\xd6\x3c\x33\x27\x41\xb1\xaa\x0e\xa4\xdf\xa6\x3d\xdf\xc9\
+\x38\x87\x9e\x23\x51\x86\x43\xa4\xf2\xd0\xe4\x02\x4c\x59\x86\xa0\
+\x0d\x97\xe4\x3c\x60\x88\x3e\x12\x3c\x3c\x67\xc1\x89\x2e\xf7\xd6\
+\x97\x33\x4d\x5f\xc6\x68\xd7\x25\x9d\x41\x36\x08\x96\xa7\x30\xf3\
+\xbf\x6f\xf7\x93\xa0\x7e\x4e\x82\x0f\xdd\xdd\xae\x27\x1e\x6f\x08\
+\xfa\xbc\xdf\x62\xe7\xd5\x27\x39\x2f\xa8\x8a\xc4\x0c\xea\xa6\x99\
+\x88\xff\xb5\xbf\x41\x82\xdd\xb3\x16\xb4\x1f\xec\xae\xd9\xb4\xf1\
+\x91\xe1\xde\x8b\x7d\xe8\x3f\x7f\xf6\x68\x7b\x57\xf7\xf3\x4a\xb3\
+\x7f\x0f\x35\xde\x0c\x72\x2f\x09\x02\xb3\x12\x10\xdc\xfe\xd0\xfa\
+\xba\x4c\x20\x10\x80\xd7\x77\x76\xe4\x50\xc7\x07\x35\xd3\xcf\xd4\
+\x66\xff\x22\xba\x6c\xa7\xbc\x40\x29\xce\x3c\x4b\x79\x89\xe0\x47\
+\x70\x8b\xfa\x97\xe0\x42\x6f\xdf\x70\x7c\x6c\xbc\xe6\xb3\x9e\x9e\
+\xa0\xa7\xab\x63\x05\x16\xa0\x66\x04\xe7\xce\x5f\x08\x72\xc6\x5c\
+\x1e\x8f\x27\x78\xd8\xd3\xb9\x20\xf0\x19\x81\xd7\xf7\x9d\xaf\xa2\
+\xbc\x7c\x8b\xfb\x60\x27\x96\xbb\x96\x3b\x5a\x5f\x6f\xc9\x2e\x98\
+\xe0\xca\xaf\xfe\x75\xd9\x6c\x6e\xd0\xdd\xd1\x89\x3b\x9c\xce\x15\
+\x6d\xad\xbb\x83\x0b\x05\x9f\x12\x0c\x5e\xbe\xf2\xc7\xc7\x1f\x1d\
+\xeb\x7c\xab\xad\x75\xef\x42\x82\xa7\xeb\x4f\xe9\x90\xbe\x1e\x7c\
+\xd7\x1b\xe4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x5e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x25\x49\x44\x41\x54\x78\xda\xb5\x96\x59\x48\x54\x61\
+\x14\xc7\xff\xdf\xbd\x77\x66\x5c\xd0\x24\x44\x1d\x46\x29\x2b\x33\
+\xd7\xdc\x98\x28\xd0\x76\xc1\xa0\x97\xca\xa5\x45\x34\xca\xea\xa5\
+\x17\xe9\x25\x08\x0c\xa2\xe7\x9e\x02\x29\x22\x5f\x02\x8b\x88\xb0\
+\xd2\x92\xe8\x41\x7a\xc8\x0d\xc9\x5c\xa2\x9c\x04\xb7\x71\x5c\xc6\
+\x71\x9a\x19\x47\x67\xe6\x9e\xbe\x7b\xb5\x6c\xd2\x51\xca\xe9\x5c\
+\x2e\x17\xbe\xef\x9c\xf3\x3b\xcb\x77\x3e\x2e\xc3\x7f\x16\xb6\x9e\
+\x42\xf7\xa7\x1e\x62\x01\xb4\x88\x80\xcc\x8c\xf4\x35\x7d\xac\xb9\
+\xd9\xd3\xd7\x4f\x13\x96\x29\x90\x2e\x84\x6b\xb2\x15\xde\xd9\xbc\
+\x1b\x31\xb1\xd1\x48\x4f\x4d\x61\xff\x04\x68\x69\xeb\xa6\xe1\x91\
+\x11\x9c\x3d\x71\x6c\x55\xbd\x47\xcf\x1a\x29\x21\x3e\x1e\x05\xc6\
+\xcc\xb5\x01\xf5\x85\xf1\xb5\xb1\x06\xc3\x65\x59\x96\x7f\x6d\x08\
+\xb2\x07\x6d\x31\x46\x24\x16\x55\x22\xfa\x41\x15\x48\x1b\xe6\x6f\
+\xb8\xe0\xc2\xd4\x85\xfb\x18\x6c\xaa\x83\x71\xa2\x0d\xb2\xa0\x59\
+\xb6\x15\x84\x7e\xcb\xe8\xa8\xa9\xac\x79\xe4\x38\xab\x3f\x6a\x78\
+\xe7\x72\x2f\x1c\x24\x9e\x32\xfd\xee\xc0\x47\xd0\xe8\xb4\x08\xd5\
+\x6f\xc3\xec\x60\x2f\x20\x49\xfe\xa1\x79\xbd\xd8\x94\x98\x86\x39\
+\xf3\x37\x78\xe6\x17\x40\x22\xf3\x8b\x9a\x31\x01\x61\x21\x9a\x06\
+\xd6\x7c\x2e\x9b\x92\x0a\xf3\xe1\x9b\xb3\x73\x80\x7f\xa6\x0a\x94\
+\xa9\x58\x61\x65\x31\xd5\x68\x64\xd5\x86\xad\x72\x0a\x04\x49\x84\
+\xe9\x6d\x2b\xd8\x9b\x0a\x23\x25\x1f\x49\x87\xdd\xd4\xa9\x52\x83\
+\x25\x82\x24\x60\xb0\xd3\x0a\xd6\x58\x9e\x47\x3b\x0a\x32\x30\x3b\
+\xd0\x01\x26\x48\x1b\xf7\xfc\x13\xc0\x4b\x36\xdc\x6b\x03\x7b\x71\
+\x26\x97\x12\xf7\xa5\xc2\xf6\x25\xc8\x00\x81\x61\xec\xab\x1d\xec\
+\xf9\xe9\x1c\x4a\xc8\x4d\xe1\x80\xf6\xa0\x03\x2c\x43\x0e\xb0\xa7\
+\x25\x39\x14\x9f\x95\x0c\x6b\x1f\x07\x48\x9a\x8d\x7b\x5e\x12\xc6\
+\x01\x33\x66\x0e\x78\x7c\x2a\x9b\x0c\x69\x3b\x31\xdd\xcf\x01\x62\
+\x80\x0c\x48\xe6\xc7\xd6\xeb\xbf\xa4\xe8\xae\x71\x28\x94\x93\x65\
+\x9b\x76\x81\xd5\x17\x67\x53\x5c\x52\x12\x26\xfb\xda\x78\x63\xc4\
+\x95\x9a\x7c\xf8\xbc\xe1\x71\x70\xeb\xd3\x41\x3e\xcf\xa2\xb1\xa8\
+\x41\x88\xb9\x07\x92\x73\x5c\xa9\x45\x40\x80\xdd\x36\x07\x56\x57\
+\xb4\x83\xc2\x22\x23\x31\x6f\x9d\x50\x5a\xbf\x52\x93\x3b\xb5\x6f\
+\xdf\x8f\xbc\x2b\x35\xd8\x1c\x15\xae\x2e\x59\x6d\x4e\xb4\xd7\xde\
+\x44\xc4\x40\x0b\x28\x40\xdf\x94\xd1\xf0\x7a\x7c\x60\x77\xf6\x44\
+\x51\xec\xa1\x93\x78\xff\xe4\x21\xb4\x3a\x1d\x44\x5e\x3b\x81\xef\
+\x4a\xa2\x00\xe5\x91\xc8\x0b\xf7\xd6\xbd\x28\xbb\x7d\x17\x06\x7d\
+\x8c\x6a\x3c\x6c\x9e\xc0\xcb\x9a\xab\xd0\x9b\xbb\x16\x4b\x15\x20\
+\x03\xa7\xd7\x03\x76\x2b\x2b\x82\x8c\xc5\xe5\xb0\x76\x34\xf0\x04\
+\xb4\xea\xc4\x2e\xce\x25\x53\xa3\x10\x79\xfd\x2d\x1a\x3d\x3e\x0b\
+\x5b\x40\xde\xe5\x12\xa5\x62\x08\x7a\xdf\xb8\xda\x07\xb6\x64\xa4\
+\x5e\x11\xfc\x15\x79\xd9\x26\xad\x2e\x98\x2c\xdf\xc1\x6a\x76\x87\
+\x53\x7e\x59\x05\xdc\x1f\x5f\xf3\x1d\xed\xea\xd1\x90\x0f\x02\x7f\
+\xd9\xd2\x65\x45\xdc\x8b\xcc\x44\xfe\x15\xf0\xe7\x1d\xa2\x5e\x2c\
+\x7c\x69\x6c\xca\x01\xf3\xa4\x13\xec\x46\x46\x28\xe5\x97\x56\xc2\
+\xd5\xd5\xa4\x46\x16\x0c\x51\x4a\x3c\x66\x75\x60\x88\x43\xd8\xf5\
+\x8c\x10\x2a\x28\xae\x84\xa3\x33\xb8\x00\xf3\x8c\x03\x63\x33\x3c\
+\x83\x6b\x69\x5a\x3a\x50\x72\x1e\xce\xd6\xc6\xa0\x0d\x9a\x02\x18\
+\xb5\x71\xc0\x2c\x07\x54\xa7\x6a\xe8\x70\xe9\x45\x38\x3e\xbc\x0a\
+\x3c\x68\x7f\x0b\xe0\x4d\x18\xe6\x19\x8c\xce\xf2\x26\x57\xa7\x68\
+\xab\x0c\xbb\x32\xef\xcd\x98\xfa\x83\x06\x50\xda\xbe\x20\xfb\xe0\
+\x21\xf9\xd2\xba\x7f\x15\x1b\x95\x1f\x16\xb7\x2e\xe1\x81\xb0\xef\
+\x62\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x21\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xe8\x49\x44\x41\x54\x78\xda\xb5\x54\x6b\x6c\x14\x55\
+\x14\x3e\x77\x76\x66\x67\x76\x77\xba\x9d\xed\x8b\xbe\x56\xd2\x96\
+\x44\x04\x04\xec\xd6\x02\x0a\xa2\x4d\x03\x9a\xd0\x1f\x3e\x02\x2d\
+\x94\xf8\x08\x24\x1a\x85\xe0\x0f\x24\x82\x21\x25\xc6\x1f\x40\x08\
+\x6a\x89\x08\x89\x26\x1a\xa0\x80\x41\x48\x48\xd0\x88\x98\x9a\x2a\
+\x54\xe9\x43\x8b\x0f\x44\x1e\x2b\x0b\xa5\xa5\xdb\xdd\xee\x76\xe7\
+\x7d\x67\xae\x77\xba\xe5\x51\xa0\x14\x4c\x3c\x9b\x99\xbd\xb9\xf7\
+\x9e\xf3\x9d\xf3\x9d\xef\x0c\x82\xff\xd9\x50\x22\x23\xab\x98\x58\
+\xd6\x61\x36\x3b\x30\x1d\x79\x3d\x60\x5d\xbe\x0a\xb6\x6d\xed\x97\
+\x94\x81\x45\xf7\x1b\x2c\x21\x66\x95\x10\xdb\x7e\x09\x80\x2c\xa0\
+\x8f\x05\xc0\x44\x51\xd2\x9f\x7b\x85\x5f\x5d\x9f\x8f\xc6\xe7\x01\
+\xd1\x65\x40\x52\x36\xd8\x07\x5a\xc0\x38\xd2\x22\x13\xdb\x9a\x93\
+\x99\x8a\x75\x8e\x19\xd8\x17\x58\x42\x88\xf5\x1e\x9b\x15\x18\xcf\
+\xce\x0e\x01\x9a\x58\x04\xcc\x93\x95\x80\xd7\x6d\x07\xa4\x56\x3f\
+\x45\x50\xc5\x38\x20\xe1\x8b\xb4\x1e\x44\x81\x6d\x40\xa5\x25\x80\
+\x32\x0b\xc1\x6c\xfc\x02\xac\x78\x72\x45\xa6\x1c\xdf\x36\x4a\xc6\
+\xe5\xc4\xc6\x07\xf9\x29\x13\x1f\x60\x16\x56\x03\x2a\xce\x01\xd2\
+\x7d\x01\xec\x9f\xff\x00\xeb\xf8\x5f\x1d\x38\x9a\xaa\x41\xa9\x89\
+\x65\xc4\x35\xb3\x00\x00\x93\xb4\x17\xa1\xff\x36\x7d\x78\x01\x98\
+\xf2\x10\xd8\xbb\x5b\x40\x3f\x75\x7a\xaf\xa4\x24\xea\x46\x04\xf7\
+\x4a\x47\xd9\xc2\xbc\x6a\x76\xd9\xb3\x80\x82\x59\x60\x77\xb6\x03\
+\xb9\x18\x06\xfb\xf7\x18\x98\x17\xfa\xea\xe8\xfd\xbd\x43\x3d\x88\
+\x7b\xa4\xb7\xf8\xaa\xb2\x8d\x48\x74\x03\x58\xf6\x30\x48\xfa\x45\
+\xb0\x05\xae\x99\x95\x40\xba\xba\x41\x39\xf4\xdd\xa5\x2c\x75\x30\
+\x18\x15\xb3\x1e\x76\x21\xa6\x4b\x78\x7a\x06\xb8\x9e\xaf\x02\xfb\
+\x44\x0b\xd8\x91\x08\x80\x62\x83\xd1\x76\xe5\xa8\x14\xed\x99\x37\
+\xa2\xc9\xce\x2b\x26\xe5\x6c\xe3\x27\xe7\xbd\xce\x14\x89\xb4\x12\
+\x9b\xb6\xe7\xe6\x6a\x2c\x60\xca\x4a\x01\xfa\x01\x92\x07\x9b\x7b\
+\x78\xbf\x2f\x5f\x58\xf3\x32\x80\x16\xa7\x34\x1c\x07\x60\x11\x90\
+\x48\x0a\xd4\xdf\x7a\x57\xe4\xa8\x03\xb7\x51\x89\xae\x2d\x7a\x3c\
+\x52\x88\xcb\x15\x77\x08\x13\xa4\x10\xf2\x71\xe9\x2a\x1c\xaa\x9c\
+\x85\x4d\xfb\x22\xf9\x81\x99\x5c\x09\xa8\x30\x17\xac\xe6\x63\x40\
+\xae\xf6\x02\x08\x1c\xe0\xf3\x49\x50\xce\xf6\xcf\xcb\x57\x07\x8e\
+\xde\x51\xa6\xb7\x6e\x44\x3c\x52\xad\x50\xe4\x6f\xf2\x95\xfa\x87\
+\xab\x40\x69\x30\xa7\xf9\x19\x62\x9a\xba\xc1\x14\x80\x9b\x85\xc1\
+\x3f\x63\x60\xf4\xca\xc1\xa0\x1a\xbf\x34\xea\x1c\x8c\x76\x10\xf6\
+\x67\x6f\xcd\x2c\xc9\x5c\xc5\x07\x78\x5a\x01\xbd\xc6\xdc\x74\xe8\
+\x42\x10\x3f\x1d\x03\x2d\xa6\x4d\x28\x53\xe3\xe7\xee\x26\x61\x74\
+\xb7\xc3\x2e\xc1\xdb\x5d\x5a\x33\xb7\x80\x49\xf4\x02\x91\xe5\x1b\
+\x4e\x0c\x02\xb9\x4f\x81\xbe\x70\xe2\xeb\x49\x5a\xe2\x99\xff\x04\
+\xd0\x2a\xf8\x22\x0f\xcd\x7f\xbc\x98\xcf\xf7\x83\x75\xb2\x8d\x66\
+\xcd\xd2\x67\xf8\x90\xce\x28\xa2\xcd\xed\x8b\x0c\x42\x34\xaa\x6d\
+\x08\x69\x03\x0d\xf7\x05\xd0\x2c\xf8\xf6\x4c\x99\xf5\x48\x9d\x18\
+\x0c\x00\x6e\xeb\xa0\x33\xc1\xd2\xac\x19\x2a\x28\x02\x0c\xcb\x50\
+\x71\xa5\x9b\xcf\xd0\xbd\x73\x7f\xc7\x21\xa5\xd9\xe5\xb3\xb4\x44\
+\xe7\x3d\x01\x1c\xe1\xbd\x1b\x0a\x0b\xc6\xad\x7f\xf0\xb1\x49\x80\
+\x5b\x4f\xd2\x4c\x69\x70\x97\x6b\x88\x96\x53\xff\x24\x7b\x82\x39\
+\xde\x5c\x49\xe4\x5c\x36\x05\x71\x9c\x11\x6d\x7e\xeb\xb9\xb8\x52\
+\xa5\xcb\xbe\x31\x01\xf6\xf1\x9e\xe9\x01\x41\xe8\x7c\x62\xc1\x1c\
+\x30\x5b\x5a\xd3\x9f\x0e\x1a\xd8\xc9\xf4\x7c\x42\x83\xcb\x83\x06\
+\xe5\x09\xf2\x4a\x02\x42\x77\xd0\x2f\x50\xf5\x52\x65\xd1\x62\xfa\
+\x55\x13\xda\xfa\xe5\xc6\xe7\x74\x65\xe5\x5d\x01\x76\xba\x79\xb2\
+\xb4\xa6\x0a\xb4\x96\x9f\x68\x6c\xe4\x74\x13\x58\xaa\x98\x98\x69\
+\xc3\x8f\x09\x79\x65\x9d\xae\x36\x3a\xf7\xbe\xe4\x7d\xc5\xd3\x02\
+\x9e\x48\xbe\x9b\xa3\xa3\x62\x0f\x09\xec\xfb\x7e\x19\x62\x18\x57\
+\xd4\x1b\x5a\xfb\x1d\x01\x36\x73\xdc\x2f\x2f\x56\x94\x4f\xf3\x86\
+\x2f\x80\xa9\x9b\xe9\xcc\xd1\x90\x22\xe1\x50\x42\xed\xac\xd7\xd5\
+\xf2\x9b\x1d\x3f\x75\x0b\x75\x95\xa2\xb0\xa7\x84\x82\x60\x4a\x97\
+\x45\x87\xf2\xf3\x44\xaa\x63\x95\xa1\x87\x6e\x03\xd8\xc2\x71\x4b\
+\x2a\x0a\x8a\x76\x3d\x4a\x95\xa1\xc7\x62\x69\x6a\xa8\xb9\x29\xc2\
+\x0f\x9a\x01\x5d\x86\xe9\x5b\x6d\x1a\xca\xad\xe5\x6f\xe1\xdc\x8b\
+\x6a\x7c\xde\xbd\x45\x6c\x7a\x48\xbe\x92\x75\x38\x83\xcd\x8a\xb5\
+\xa6\xd1\x3e\x02\x60\x2d\xc7\xb5\xbd\x33\x75\x6a\x48\x3f\x73\x86\
+\x66\xce\x0c\x7d\x83\x1c\x0c\x8d\x4e\xf1\x46\x45\x6e\xd8\x8a\xf1\
+\x86\xd1\x64\xf8\x2e\xe7\x6e\x5a\xee\xf5\xd4\x8a\xd4\x41\xa5\x7e\
+\x9b\x14\xe5\x9b\xcd\xa6\x39\x7f\x04\x40\x63\x86\x44\x5e\xf1\x8b\
+\xa0\x27\x93\x90\xd6\x06\x01\x81\x3a\xec\xd4\xb4\xd4\x9b\x86\x9e\
+\x01\x63\xd8\x07\x6e\x3e\xbc\xcc\xe3\x19\xef\xac\x3f\x53\x55\x08\
+\x13\x5b\xda\x64\x9a\x89\xeb\x00\xef\xfb\x32\xc8\x72\x17\x03\x3a\
+\xe5\xd1\xf9\x51\x51\xc2\x59\xcb\x82\x4d\x86\xb6\x78\xbf\x65\x35\
+\x8d\x05\xb0\x9c\x65\x83\xb3\x19\xd7\xc5\x17\x04\x0f\x9c\x30\x4c\
+\x38\x80\xf5\xfa\xed\x18\xef\xbe\x0e\xf0\x36\xc7\xed\x5b\xc7\x8b\
+\x0b\x87\x34\x47\x01\x30\x95\xdf\x1a\x5d\xfd\x75\x07\xc6\xd3\xc7\
+\x0a\x7e\xcd\x5e\x63\xd9\x0f\xd7\xbb\x3d\x2b\x1c\x6e\x1b\x74\xa5\
+\x89\xfa\x2e\x1e\xa1\xa2\x4f\xdc\xfc\xe5\x19\x2c\x57\x38\x40\xab\
+\xf8\xd6\x32\x8e\x35\x98\x66\xf5\xbd\x06\xbf\x41\x95\x7b\x70\x99\
+\x20\x8a\xab\x95\x64\xc7\x47\x18\x87\x46\x00\x38\xf6\x06\xcb\x56\
+\x62\x80\xe8\xc7\x18\x9f\xbf\xdf\xe0\x8e\xbd\xca\xb2\x73\x6b\x59\
+\xbe\xf9\x30\xd6\x77\x6d\xc1\x78\xa9\xb3\xf7\x2f\x44\xcf\x1f\x86\
+\x60\x1b\xad\x88\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x03\xf8\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xbf\x49\x44\x41\x54\x78\xda\xad\x93\x5d\x6c\x53\x65\
+\x18\xc7\xff\xef\x39\x75\xed\x59\x97\x75\x1d\x2b\xcc\x04\xd3\x8c\
+\x6e\x8d\x9a\xb9\x4a\x5b\xc6\x58\x91\x21\x53\x26\x1d\xc3\x95\x4d\
+\xa4\xa4\x4c\xe4\xc6\x44\x13\x89\x91\x25\x10\xf4\x42\x23\xe1\x42\
+\x6f\x8c\x37\x5e\x98\x68\x34\x10\xf0\x33\x01\x87\x70\xb1\x34\x86\
+\x14\x57\x90\xa0\x74\x03\xb7\x9e\x8e\x44\x61\x55\x47\x3f\xce\xba\
+\xad\xac\x6b\xcf\xeb\xd3\x1a\x17\x8d\x18\xdb\x66\x27\x79\xfb\xb6\
+\xe7\x3d\xfd\xfd\x9e\xaf\xc3\x50\xc6\x95\x39\x6b\xac\xac\x70\x27\
+\xe6\x33\x17\x6b\x8e\x81\xf1\x0f\xb8\x9e\xad\x80\xc0\x3d\xda\x66\
+\xe5\x70\xfa\xa6\xa1\x52\x6a\x50\xe6\xff\x7a\x96\x95\x25\xf8\xc6\
+\x18\x80\x88\xd7\x61\xe0\x6f\xd1\x9e\xe5\x15\xa8\x23\x41\x98\x6b\
+\x71\x9c\x8b\x38\x20\xad\x51\x5c\x65\x09\x32\x9f\xd6\x7a\xa1\xc1\
+\x59\xe8\xf8\x11\x6e\xc6\x20\x32\x50\x54\x13\x0c\xd0\x08\x60\xa9\
+\xc5\x19\xae\x65\xd5\x2c\x83\xc3\x5c\x12\xde\x87\xc8\xdc\x52\x7d\
+\xfc\x44\x69\x82\xcf\x8c\x3d\xa8\x64\xa7\x51\xad\xce\xe6\x1a\xc4\
+\x2a\x68\xb5\x80\x56\x02\x38\x61\xd4\xbb\xf4\x40\x1a\x58\x58\x9c\
+\x85\x48\x67\x22\x73\x91\xe0\x62\xd1\x82\xcc\xc7\xb5\x9d\xd0\x22\
+\x06\x09\x1f\xe6\x36\x0a\x8f\x42\x53\x4d\x77\x57\x52\x0d\x4c\xb4\
+\x0b\xb4\x12\x24\xf9\x95\x16\xed\xa9\xec\x30\xb4\x6c\x10\x1a\x5e\
+\x53\x8a\xe0\x10\xaa\x70\x2c\xd7\xca\x01\x9d\x1e\xa8\x58\x0d\x26\
+\xd8\x68\x59\xe9\x54\x03\xae\xde\x04\xe7\xd7\x80\x5c\x04\x3c\x9b\
+\x02\xcb\xe6\x6f\xf3\xa7\x4b\x2b\xd1\xc9\xda\x83\x7c\x15\xde\x56\
+\x9d\x46\xfa\xf5\x30\x04\x71\x13\x04\xcd\x16\x6a\xa4\x04\x35\x7b\
+\x01\xaa\xea\x27\xd1\x8f\xc0\x2c\x65\x22\xb0\x41\x2a\xd1\x3b\x45\
+\x09\x32\x1f\xd5\x9a\x05\x91\x1f\x57\xf5\xcc\xa5\xae\xe3\x48\xeb\
+\x56\x41\xa7\xb3\x92\xe0\x71\x12\x74\x92\x40\x0f\x35\xe7\xa7\x35\
+\x4c\xd1\x5f\xa5\x2c\xa6\x41\xb3\x05\xae\xe1\xfe\x92\x32\xe0\x5f\
+\x55\x3d\x18\xd6\x19\x6f\x98\x1f\x5b\x80\xca\x1b\xc1\x98\x1d\x82\
+\xf0\x50\xa1\x44\xaa\x2a\x53\x89\x7e\xa0\x1e\xc8\xc0\x1c\xf5\x81\
+\x0e\x28\x83\x9f\x8a\x16\x4c\xbe\x6b\x6e\x3a\x72\xe5\xa9\xa1\x3d\
+\xcf\x36\x36\x3d\xd1\x51\x0f\xa6\x1e\xa2\xe1\x69\x20\x10\x7d\xa7\
+\x29\xe2\x3c\x4e\x11\x44\xa9\xc1\xd1\x7c\xcf\x17\xc8\xae\xa5\x0c\
+\x5a\x8a\x16\x78\x07\x5e\x98\xe8\x71\x77\x35\xf5\xf7\x79\x30\x9f\
+\x7a\x13\xd1\xa8\x08\xeb\x9a\xf7\xf0\xfb\x9d\x95\x30\x56\xa5\xc1\
+\x45\xea\x6a\x52\xc9\x27\x43\x25\x42\x8b\xf4\x40\x22\x94\xff\x5f\
+\x51\x82\xbd\xcf\x3d\x2f\x77\x77\x77\x5b\xf2\xf0\x24\x41\xa6\xa7\
+\x93\xf8\x36\x70\x05\x35\xe2\x6b\xd8\x60\x4d\xa1\xfe\xfe\xf4\x8c\
+\x7a\x1f\xaf\x66\x73\xfc\x28\xbd\xd5\x66\x7a\xf1\x0c\x24\xd8\x51\
+\x94\x60\x8f\x6f\x40\xb6\xb5\xd8\x2c\x1d\x1d\x9b\xd0\xd4\x68\xc1\
+\x74\x2c\x8e\x40\x20\x88\x13\xa7\xbe\xbc\xf6\xe2\x86\xeb\x6f\xec\
+\xf4\xdc\xde\xbf\x98\x65\x77\x54\x1d\x22\x14\xbd\x4d\x67\x55\xfa\
+\xd3\xb7\x8c\x7a\x69\x75\x62\xee\x7f\x05\xbb\x76\x79\x65\xdb\xda\
+\xb5\x96\xae\xad\x4f\x22\x78\xe9\x32\x66\x14\x05\x2b\xea\xea\x70\
+\xea\xf3\xaf\xc7\xcf\xbc\xec\x3f\x5a\xe9\x8e\x7f\xa2\x5e\xad\xe9\
+\xa3\x81\x41\x85\x3d\xf9\xc5\xdd\x09\xc3\x6e\x12\x9c\xfc\x3b\xe3\
+\x3f\x05\x9e\x9d\xfd\xb2\xdd\xee\xb0\xb8\xdd\xdb\x0a\xf0\xc8\xa4\
+\x8c\xdf\xa6\xa2\x48\x24\x92\x91\xa1\xa1\xd3\x8d\xc5\xf6\xee\x9e\
+\x82\xed\xdb\x7b\x65\xa7\xd3\x61\xe9\xd9\xd1\x83\xe0\xe5\xef\x31\
+\x19\x96\x71\x7b\x6a\x0a\x09\x25\x11\x39\x37\x74\xa6\x68\xf8\x3d\
+\x05\x5d\x5d\xdb\xe4\xd6\xd6\xf5\x96\x5e\x4f\x2f\x2e\x11\x5c\x0e\
+\x87\x71\xeb\x97\x9f\xa9\xb9\x89\xc8\xf9\xf3\xe7\x4a\x82\xff\x4b\
+\xd0\xd9\xb9\x55\x6e\x6b\x6b\xb5\xf4\xf5\x3f\xf3\x67\x59\x64\x19\
+\xe3\xe3\x13\x98\x4d\x29\x11\xbf\x7f\xb8\x64\xf8\x3f\x04\x9b\x37\
+\x6f\x91\xd7\x51\xe4\x5e\xef\xee\x25\xf8\x8d\xeb\x63\x14\x79\x32\
+\x12\x08\x5c\x28\x0b\xbe\x24\x70\xb5\xb9\xe4\xf5\xed\xed\x16\xdf\
+\x5e\xdf\x12\x7c\x34\x14\x22\x78\x3c\x32\x32\xf2\x5d\xd9\xf0\x82\
+\xc0\xe9\x70\x86\xda\x37\xba\x9a\xf7\xed\xdb\xbf\xec\xf0\x82\xe0\
+\xd5\x83\x83\xdc\xe7\x1b\xc0\x48\x30\xb8\xec\xf0\x82\xc0\x61\x77\
+\x84\x5e\x3a\xf0\x4a\xf3\x58\x68\x14\x63\xa3\xcb\x0b\x2f\x08\xf2\
+\x1f\x34\x96\x21\x93\xc9\xd4\x1c\x8b\xc5\x46\x09\xfe\xc8\x72\xc1\
+\xf3\xd7\x1f\xf9\x7a\xab\x72\xbf\x62\x37\x55\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xc4\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x8b\x49\x44\x41\x54\x78\xda\xbd\x95\x7b\x50\x54\x55\
+\x1c\xc7\xbf\x77\x9f\xb2\xb0\x3c\xda\x85\xe5\x25\xaf\x94\xd7\x06\
+\x22\xbe\x40\xc0\x4c\x45\x45\x9b\xd1\x14\x8b\xd1\x02\x15\x4b\xb2\
+\x69\x9c\x4a\xa7\x31\x4b\x6a\xc6\xca\x17\x4e\xe3\x23\x66\x4a\x8d\
+\x4a\xc2\x47\xe4\xe8\xa8\x9b\x8f\x34\x79\xb4\x21\x88\xc8\x1b\x24\
+\x10\x05\x65\x97\xf7\xb2\xc0\xee\xb2\xbb\xb7\xdf\xbd\x3b\x83\x39\
+\xd3\x3f\xfe\xa1\x67\x66\xe7\xdc\x73\xee\xef\x9e\xcf\xf9\x7d\xbf\
+\xbf\x73\x96\xc1\x33\x6e\xcc\x73\x03\x24\x7c\x53\x55\x1c\x1b\xe9\
+\x93\xd8\x33\x30\x8c\x8a\xf2\x7b\x5b\xee\xee\x9d\x97\xf3\x34\x0b\
+\x85\x7e\x5a\x92\x11\x1b\xed\x9b\xe7\xe9\xe1\x8c\x8a\xaa\x8e\x12\
+\xed\xd6\x69\x49\x4f\x00\x12\xf7\x54\xdc\x5c\x9c\xa2\x9e\xf1\xe0\
+\xc1\x00\x34\xbf\x57\x15\xde\x3f\x90\x92\xfa\x34\x80\xe0\x0f\x2f\
+\x1f\x4d\x4e\x56\xaf\x0f\xf0\x7f\x01\x17\xce\xd7\x95\x6b\xb7\x4d\
+\x9f\xf9\x04\x20\x66\x47\x49\x43\xe2\x02\x75\xb8\xbe\xa3\x0f\x45\
+\xc5\x0d\x45\x5d\xb9\xaf\xbe\xfc\x34\x00\xdf\xf7\x35\xe7\x13\xe3\
+\xc3\x96\x7a\xf9\x7b\xa0\xe8\x72\x4d\x63\xf5\xce\x39\x11\x3c\x20\
+\x2a\xbb\xa4\x69\x49\xb4\x77\x68\x59\x73\x37\x94\xe1\x01\xe8\x79\
+\x38\x08\xb5\x93\x0d\x5e\x9e\xce\xb0\xb1\x00\x6b\xa3\x28\x21\xfd\
+\x58\x6e\xf0\x3f\x96\x31\x2c\x44\x8c\x10\xfa\x7e\x23\xea\x47\x85\
+\x50\xa8\xdc\xd1\x53\x7d\x17\x33\xd5\x3e\xd0\xd4\xe8\x9a\x99\x95\
+\x87\xab\xd8\xad\x69\x53\xb0\xfa\xe3\xb3\xf0\x9e\x1d\x05\xc3\xa3\
+\x01\xc4\x29\x18\xac\x58\x12\x8d\x31\xab\xcd\xb1\x30\xc3\x3c\xee\
+\xff\xd3\x6c\x34\x27\x24\x11\xc4\x12\x21\xce\x69\x6a\x51\xdc\x6b\
+\x83\x1b\x01\x1e\x96\x54\xe3\x64\xce\x72\xec\xc9\xbf\x03\x26\x39\
+\xa7\x82\x7d\x77\x55\x0c\x32\x3f\x38\x8e\x09\xb3\xe3\x60\xd7\xe9\
+\x31\xd3\x8d\xc1\x1b\xa9\x33\x60\xb6\x58\x1d\x22\xb2\x8f\xc5\x64\
+\xb8\x07\x2e\x19\x5a\x9c\x11\x30\xf4\xc8\x42\x22\x16\xa2\xb0\xf0\
+\x16\xb4\x06\x3b\x04\x9e\x5e\x30\x15\xfd\x85\x63\x07\xd7\xe2\xdb\
+\xd3\x95\x60\x16\x11\x60\xdd\xf2\x29\xf8\xee\xe8\x0d\xfc\xad\xad\
+\x87\x42\x2e\x43\xe6\xa6\x14\xf8\xfa\xba\x71\xd9\xc3\x4a\x0b\x88\
+\x19\xc7\x42\x5c\x42\x3c\x44\xe8\xe8\x85\x04\xb1\x12\x50\x28\x14\
+\xa0\x83\xbc\x3b\x96\x7b\x05\x7d\x06\x23\xe2\xe2\xd5\xd8\x98\x39\
+\x07\x47\xcf\x54\x81\x59\xb0\xab\x8c\x4d\x5f\x16\x05\x25\xa5\x29\
+\x16\x0b\xd0\x35\x6a\x83\x61\xc4\x0a\xa5\x94\x5b\x18\xb0\xd8\x01\
+\xdd\xa8\x1d\xee\x62\xc0\x55\x22\x22\x95\xec\x68\x37\xda\x79\x40\
+\x90\xb3\x90\xb7\xc5\x60\xb6\x61\xc8\x2e\x44\x00\x05\x89\x05\x02\
+\xf2\xcd\x86\x8e\x11\x16\x27\x2f\x54\x83\x99\xfb\x65\x29\x7b\x68\
+\xc3\x74\xa8\xbd\x24\xfc\x47\xb7\x1f\x8c\xe2\x62\x87\x09\xdb\xe3\
+\x3d\xc6\xb5\xfe\x4a\xdb\x8f\x77\x5e\x92\x43\x29\x17\xf1\xe3\xd3\
+\x75\x43\x94\x86\x00\xab\x22\x9d\xf9\x71\x9f\xd1\x8a\xdc\x1a\x03\
+\xb2\xa2\x5c\xa1\x70\x71\xc4\x1c\xa8\x1c\xc2\xb9\x4b\xb5\x60\xe6\
+\x7c\x51\xcc\x1e\x7c\x7b\x16\xa2\x7d\xc4\xfc\x8b\xf2\xfb\x26\x68\
+\xda\x87\xb1\x23\x49\x31\x0e\xc8\x2e\xea\xc5\x7b\xd1\x72\x78\xb9\
+\x3b\x36\xf1\x4b\xd5\x00\xdf\xaf\x8e\x71\xe7\x7b\x7d\xbf\x05\xb9\
+\x04\xcd\x52\xcb\xa1\xf2\x70\xc4\xec\xbb\x39\x08\xcd\xe5\x3a\x02\
+\x7c\x5e\xc4\x66\xae\x9c\x8a\x79\xbe\x52\xbe\xe4\x2a\x3a\x4d\xb8\
+\xd3\x3b\x86\x8c\x08\x17\x88\x88\xd9\x4f\xa9\xe6\x37\x0e\x61\x9a\
+\x97\x14\x31\x9e\x12\x08\xe8\xe3\xdf\x5a\x87\xc1\x6d\xf4\xb5\x30\
+\x39\xac\xa4\x56\xad\xce\x8c\xb2\x2e\x13\x16\x05\x3a\xc3\xd7\x4d\
+\x04\xab\x95\xe4\x69\x19\xc1\xd5\x3f\x08\x90\x94\x7d\x83\x4d\x99\
+\x1f\x89\x78\x6f\x29\x5f\x2c\xe5\x7a\x13\xea\x09\xb0\x34\xd0\x09\
+\x24\x25\x5a\x28\x7d\xad\xce\x84\x10\xb9\x18\x89\x2a\x29\xc8\x4f\
+\x9c\x6a\x1b\xc1\x90\xd9\x8e\xd7\x43\x9c\xa1\x72\x11\xa2\xb2\xcb\
+\x82\x6e\x8b\x0d\x49\xb4\x86\xc2\x49\x44\xbe\xb1\x28\xeb\x1e\xc3\
+\x35\x0e\x90\xb0\xfd\x1a\xbb\x7b\xfd\x2c\x24\x84\xc8\xf8\xd4\x7e\
+\xad\x1e\xc0\x41\x92\xe0\x46\x7a\xd0\xb8\x44\x89\x79\x6d\x28\x58\
+\xe2\x8b\x89\x94\x05\xd7\xb6\x5d\xd1\xf1\x9b\xd9\x95\xac\xe2\xc7\
+\xed\x7a\x33\xd6\x68\x1e\xe1\xe7\xc5\x2a\x04\xab\x9c\xf8\xb9\xcf\
+\xae\x77\xa3\xf4\x7a\x03\x98\xa0\x4d\x17\xd8\xbd\x59\x89\x48\x25\
+\x83\x78\x03\x6f\xf7\x61\x5f\x65\x3f\xca\x32\x5f\x1c\x07\x4c\x3f\
+\xf2\x0f\x4e\x2d\xf5\x46\x88\x8f\xc3\xd4\x8f\x34\x9d\x7c\x9f\x93\
+\xe2\xc7\xf7\x6d\x8f\x46\x91\x46\x80\x13\x29\x3e\x08\xf6\x71\x00\
+\x92\x0b\x3a\xd0\x57\x49\x80\x90\x4d\xe7\xd9\xf9\x0b\xa7\x22\x5e\
+\xe5\x30\xb9\x88\x2a\xa8\x69\xd0\x8c\x37\x27\xbb\x51\xd9\xb2\x74\
+\x9a\x59\xfc\xd4\x64\x44\xb2\xbf\x13\x82\xdc\xc4\xbc\x44\x17\x5b\
+\x47\xd0\x4f\x92\xac\x09\x77\x21\x0f\x18\xdc\x1b\x24\x39\x1e\x8e\
+\x62\x59\x90\x0c\x8a\x09\x02\x48\xa9\xe4\xbf\x6f\x1c\x46\x97\xb6\
+\x06\x4c\x70\xd6\x59\x76\x62\x5c\x14\xd6\x86\x39\xee\x9e\x3f\xdb\
+\x47\x50\x3b\x60\xc1\xba\x70\x57\xc8\x24\x02\x34\x76\x9b\x71\x8d\
+\x76\x18\x46\x15\x94\x1c\x28\x03\x1d\x5e\xfc\x58\x6f\xe0\x4f\x73\
+\x86\xda\x95\x37\xb9\xa5\xd7\x82\x4b\x9d\x23\x58\xe8\x27\x43\xa8\
+\x52\x82\x61\x93\x0d\xf9\xad\xa3\xe8\xbf\x45\x1e\xf8\x67\x9e\x61\
+\x77\x6e\x48\x40\x46\x9c\x27\x9f\x41\x5e\xa9\x0e\xd9\xda\x5e\xb4\
+\x6f\x89\x1c\x97\x68\xe2\xde\x3a\x5c\x5f\x1d\x84\x49\x7e\x0e\x89\
+\xd2\x0b\x5a\x09\xc4\x20\x2f\x2d\x98\x1f\x37\x77\x0e\x63\xe1\x89\
+\xfb\xb8\x9a\x16\x48\x31\x0e\x2f\x23\x0e\xb5\xc0\x5c\x4d\x00\x9f\
+\xf4\x53\xec\xce\x8d\xaf\x60\xfd\x6c\x25\xff\xe2\x48\xb1\x0e\x9f\
+\x94\xe8\xa1\xdf\x16\x35\x0e\xf0\xf8\xba\x06\x37\xdf\x0a\xc6\x64\
+\x7f\x17\x47\xfd\x1f\x6f\x03\x6b\xb7\xa3\x20\xdd\xe1\xd3\xdd\x0e\
+\x23\x12\xf2\xef\xa1\x74\x4d\xd0\x78\x4c\xc0\xfe\x06\x88\xea\x08\
+\xe0\xb7\xae\x90\x8d\x9d\x1b\x8b\xc5\xc1\x32\x3e\x6d\x4d\x8b\x01\
+\x15\x94\xf2\xe6\x29\x1e\x70\x91\x0a\x30\x3c\xc6\x62\xff\xad\x3e\
+\xa4\x4e\x92\x21\x42\x39\x81\xae\x02\x06\x07\xa8\x10\xb8\xb6\x39\
+\x56\x41\x12\xb1\xa8\xeb\xb1\xd0\xd9\x30\x60\x45\x88\x1c\x6a\xa5\
+\x14\x43\x26\x3b\x0e\xd3\xd9\x61\xb8\x0c\xfc\x57\xfe\xd0\x64\x77\
+\x96\x85\x5a\xe8\xe6\x64\x84\x0c\xb8\x83\x2e\xa4\xf4\x2d\x36\x3b\
+\xef\x09\xa7\xb9\x94\xee\x17\x2b\x77\xf1\xd1\xae\x39\x69\x38\x08\
+\xd7\x2c\x34\xe6\x02\x04\xf4\x4e\x44\xe6\xdb\xc8\x70\x1b\x01\x19\
+\x8a\x91\xd0\x04\x6b\x34\x36\x3f\xbf\x3f\xfd\x67\xd5\xfe\x05\x05\
+\x58\x47\xed\x51\xe7\x56\xf5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\x4b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x12\x49\x44\x41\x54\x78\xda\xad\x94\x7d\x4c\x5b\x55\
+\x18\xc6\x9f\x73\xfb\x45\x29\x5d\x61\x12\xc8\x8a\xc8\x96\x65\x75\
+\x66\x2e\x61\xa0\x7c\xa8\x89\x73\x41\x63\x74\xce\x75\xb6\xec\x82\
+\x88\x9f\x83\xa0\x30\x71\x91\x85\x18\x34\x05\xba\x4d\xa2\x6e\x3a\
+\x20\x10\x46\x1d\x63\x85\x32\xc0\x7d\x98\xf8\x87\x71\x4b\xf6\x87\
+\x52\x18\x66\x58\x28\x5b\x74\x09\xd2\x8e\xaf\xc9\x90\xb9\x52\x64\
+\xfd\xb8\xd7\x53\x86\x0c\x06\xb4\x44\x79\x93\x37\x37\x79\xef\x39\
+\xcf\xef\x3d\xcf\x79\xef\x25\x58\x66\x74\xe8\x59\x29\x71\x3b\x27\
+\x7e\x55\x65\x61\xea\xf6\x78\xc8\x9e\x9c\xcc\xbf\x97\xb3\x8f\x2c\
+\x17\x60\x2e\xd6\x98\x1e\x7c\x6a\x07\xcb\x6c\xda\x8e\x33\x4d\xad\
+\xa6\xdc\xfc\xac\xf4\x15\x03\xd0\xee\x43\xbc\x2e\xaf\x23\xf9\x23\
+\x2d\x20\xd1\xa2\xa9\xe1\x0c\x6e\x8e\x8e\x86\xe4\x7d\x90\xed\x5c\
+\x11\x80\x59\xa7\x31\x29\x93\x9f\x63\x1f\x7a\xf2\x27\x40\x56\x07\
+\x5b\xff\x75\xb4\x9e\x3a\xd7\xf4\x61\x61\x5e\xda\xff\x06\xb4\x97\
+\xb2\x21\x9c\x9b\x73\x24\x17\xec\x02\x3c\xe7\x81\xd0\x63\xd3\xf5\
+\x86\xfa\x16\x64\xbc\x9e\x1a\x70\x7f\xc0\x05\x66\x9d\xb6\x71\x4d\
+\x72\x4a\x5a\x4c\xbc\x15\x60\x5c\x40\x58\xf5\x74\xdd\xf6\xbb\x0d\
+\xc6\xfa\xe6\xe2\x22\xdd\x7e\xdd\x7f\x06\x98\x4b\x76\x6f\x23\x44\
+\x70\x21\x31\xef\x25\xc0\x7d\x09\x10\xd2\xc1\x09\xad\x9a\x7d\x6f\
+\xa8\x39\x09\xbb\xcd\xae\x2c\x39\x58\x34\xbc\x24\xa0\x5d\xcf\xca\
+\x79\xce\xab\x06\xcf\xaf\xa3\xcf\x27\x68\x9b\xab\x78\x8e\x4b\x12\
+\x88\xa5\x6e\x46\x24\xe9\x8b\x7a\x46\xfd\xb0\x32\x9a\x5a\x23\x14\
+\xd1\xa4\x77\x1a\x76\x0f\x30\x60\x1f\x84\xd5\x7a\x15\xc3\x43\x23\
+\x98\x74\x4e\xde\x1a\x1c\x1c\xba\xc6\x30\x4c\x1b\x7d\xe5\x20\x0c\
+\xf9\x56\x7f\xe8\x93\x4e\x62\x2e\xd6\xf2\x11\x5b\xb6\x3a\x19\xd9\
+\x6a\x59\xd8\xfa\xcd\x10\x73\xa3\x90\xae\x89\x02\x5c\x23\x34\xed\
+\xb4\xf3\x7e\x80\xfb\x13\x10\x33\x14\x30\x31\x0f\xb0\x58\x38\x1c\
+\x0e\x8c\x0c\xdd\xc0\xf0\xf0\x0d\xfc\xd2\xd5\x0d\xd2\xa6\xd3\x7a\
+\x12\x76\xef\x1a\x23\x37\x2f\x46\x10\x01\x0f\x22\x12\x00\x22\xea\
+\x9c\x90\xdc\x15\x15\x09\xe9\x93\xa6\x88\x5f\x16\x60\x6e\x94\x1f\
+\xa9\xa2\x16\x95\xb2\x8f\x12\x70\x3d\x9b\x1f\x5b\x05\x69\xb8\x8c\
+\x3a\x34\x23\x4e\x1d\x01\xd5\xbd\x0b\x21\x33\x50\xc7\xb2\x01\xc7\
+\x6b\x8d\xe8\xb5\xf6\xaa\xa7\x2f\xd9\x5c\xca\x46\x7b\xdd\xbc\x7d\
+\x63\x5c\x08\x1e\x58\xab\xa0\x10\x7e\x46\x10\x33\xe2\xbe\x53\xfd\
+\x6b\x51\x79\x40\x71\x43\x4d\x3d\xac\xdd\xd6\xb4\x2f\x2b\x3f\x6b\
+\x9a\x9d\xa2\x76\x7d\x1a\x85\x70\x76\x55\xbc\x1c\xe1\xeb\x15\xf7\
+\x4e\x22\xa6\x30\x86\x0e\x89\xb0\x8f\xa6\x19\x08\xe7\xfd\x8a\xd7\
+\xd1\xce\x2f\x5f\xee\x4a\x2f\xaf\x3a\x6c\x5a\x30\xa6\x1d\x3e\x88\
+\x07\xf6\x8d\x49\x72\x84\x45\x8d\x01\xde\x2b\xf0\xf0\xfd\x20\x92\
+\x29\x9a\x54\x58\x42\x59\x51\x4b\x03\x0c\x35\x27\xe8\xc5\x5a\xa2\
+\x2b\xaa\x8f\x0c\xcc\x8e\xe9\xfd\x8b\x7e\xdc\x9f\xa2\xec\xb7\xd8\
+\x6d\x3b\xde\xfd\x4b\x18\x14\x79\x07\x4c\xd0\x24\x4d\x17\x78\xdf\
+\x9d\x04\x51\x80\x72\x71\x40\x75\x65\xad\xc7\xd2\x65\x89\xa9\x36\
+\x54\x0c\xcd\xad\x2f\xfa\xa1\x99\x5e\x54\xf1\xac\xf1\x20\xdc\x57\
+\xf7\x80\x09\x76\xd2\xee\x5d\x34\x01\x5e\xbc\xf4\x09\x0e\x14\x97\
+\xa1\x48\x57\xb8\x40\x6f\x41\xa1\x55\xab\x0a\x95\x05\x8b\xc7\x9f\
+\x2f\x65\xe1\x1e\xf8\x02\x02\x19\xfd\xb8\xc4\xf4\x17\x41\xc5\xfd\
+\x59\x54\xf9\x55\x35\x72\xf3\x73\x02\x03\x5a\x5e\x51\xc5\x87\xc7\
+\xac\xfd\x79\x6b\x76\x14\xdc\x63\x67\xc1\x50\x00\xf1\x01\x7c\xe2\
+\xc1\x74\x41\xe4\xe2\x80\x86\xfa\x26\x9c\xff\xe1\x42\x42\x9d\xb1\
+\xb6\xd3\x2f\xe0\xd4\xce\x0d\x25\x9b\xd4\x6f\x7e\xfc\xc8\xba\x4f\
+\xc1\xf9\x2c\x91\x4e\x51\x88\x6b\xda\xff\x71\x8b\x12\x61\x2f\x0c\
+\x2e\x0a\xe8\xed\xb9\x82\x43\xfa\xb2\xf7\x1b\x9a\xeb\x8f\xfa\x07\
+\xbc\xbc\xc1\x98\x90\xc9\xbe\x1a\x1d\x51\x41\x45\xef\x40\x10\x3c\
+\x89\xa9\xeb\x91\xb8\x74\x4e\x81\x91\x3e\x70\x7d\xdb\xf2\x99\xf7\
+\x72\x32\x20\x97\xcb\xe7\xed\xbb\x35\x3e\x8e\xec\x77\x72\x4d\xcd\
+\xa7\x1b\xd3\x03\x00\x54\xed\x29\xfb\x32\x13\x57\x4b\xf4\x70\xdd\
+\x56\xc0\xf2\xbd\x02\xb6\x3e\x1e\x3c\x41\x79\xea\xe9\x6b\x7b\x53\
+\x53\xdf\x92\x72\xae\x49\x43\x42\xe2\xe3\x69\x05\x85\xfb\xe6\xed\
+\x55\x6f\xd7\x74\x9c\xfd\xee\x9b\xa4\x40\x00\x3e\xf5\xf0\x5e\x74\
+\x56\x1d\xa5\xc2\x74\x72\x08\x6f\x62\x18\x92\xa5\x69\xf9\x6d\x62\
+\xee\x3a\x56\x93\x21\x15\x08\x98\xb6\x94\x67\x53\x62\xdf\x78\xfb\
+\xb5\xe9\x5a\x61\x41\x11\xca\x3e\x3f\x40\xfc\x02\x5a\x35\xaa\x8b\
+\x5e\x0f\xff\x34\x61\x60\x62\x04\x0b\x85\xef\x0f\xcd\x4e\x36\x2e\
+\x48\x22\x39\x16\xbb\x25\x36\xae\xa7\xbb\xe7\x8f\x13\x8d\x5f\x47\
+\xfa\x05\xac\x74\xfc\x03\x56\xbd\x85\x3b\xf8\xc5\x2f\x04\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x2f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xf6\x49\x44\x41\x54\x78\xda\xd5\x96\xcd\x6f\x1b\x45\
+\x18\xc6\x9f\x59\x7f\x56\x6a\x89\xa3\x36\x89\x23\x4e\x1c\xab\x22\
+\x81\x04\x45\xb4\x01\x09\x01\x12\xa0\x8a\x13\x4d\x45\x00\x81\xa0\
+\x5c\xaa\xfe\x07\x20\xa4\xf6\xc4\x3f\x00\x27\x6e\x88\xd0\x54\xea\
+\xa1\xa2\x4a\x0f\xa8\xf4\x02\xa8\x7c\xb4\x50\x2e\xa5\x08\x44\x9b\
+\x2f\xc7\xb1\xe3\x78\xed\xf5\xae\x77\x77\x76\x66\x78\x66\xed\x26\
+\xeb\x88\x5b\xd5\x43\x2d\x8d\xbc\xbb\x1e\xbf\xbf\x9d\x79\x9e\xe7\
+\xdd\x15\xc8\x7c\x5e\xbd\xb0\x12\x8e\x95\x45\x09\x51\x02\x63\x34\
+\x72\x5a\x23\x49\x34\xc2\x58\x41\xc6\x1a\x52\x0d\xbe\x95\x54\xd0\
+\x89\x82\x8a\x13\xfe\xce\x63\x7b\x2d\x49\xd2\xdf\xb5\x4a\x10\xb4\
+\xfc\x68\x75\x7e\xb6\x6c\x6b\x8a\x7b\xc5\x8f\x5d\x5c\x33\x67\x9e\
+\x9b\x40\xd1\x11\x28\x0b\x81\x7d\x79\x81\x4a\x49\xc0\x81\x41\x2b\
+\x32\x68\xb3\x48\x87\x85\xbd\x04\x90\xda\x40\xf2\x3f\x5e\xa4\xe0\
+\x13\x60\xbf\x5d\xce\x71\x09\xec\x48\x03\x8f\xf3\x7e\xfe\xe2\x7b\
+\x34\x2e\xcc\x89\x6d\xc0\xdb\xdf\xd6\xcd\xe9\x27\xc7\xf1\x87\xab\
+\x30\x5d\x14\x98\xe2\x98\x28\x39\x28\x38\xc0\xb2\xa7\xb0\xd6\x57\
+\x58\x8f\x24\x5a\xac\x1c\x12\x10\x4a\x0d\xd7\x4f\xe0\x06\x2c\xca\
+\xd1\xed\x73\xf0\xbc\xc7\x63\xc9\x9b\xca\xdf\xbc\x8d\xcd\x73\xb3\
+\xa3\x80\x37\x0f\x55\xb0\x11\xe8\x41\xf1\x7b\x00\xce\x58\xe9\x29\
+\xd4\x86\x80\x2d\x29\x52\x40\x94\x0c\x00\x9d\xfe\x28\xc0\xe3\x71\
+\x6c\x0c\xc4\x6f\x7f\xa2\xb9\x1b\x70\xe2\x60\x05\xcd\xf0\x61\x05\
+\xbc\x77\xa5\x6e\xe6\x0e\x8d\xa3\xc6\x2d\xaa\x16\x06\x80\xc9\xb2\
+\x83\xfc\x2e\x40\x2b\x03\x68\x67\x01\x56\x0b\x0b\xe0\x79\x4c\x0d\
+\xc4\x75\x02\xbe\x3e\xbe\x03\x98\x99\xbf\x7b\xfd\x95\x83\x63\x4f\
+\x39\x74\xd1\x78\x1e\xe9\x98\x60\xf5\x02\x27\x2f\x11\x5a\x27\xa0\
+\xd5\xd7\xe8\x2a\xda\x36\x21\x80\x4e\x09\x02\xba\x28\x94\xe8\xf9\
+\x3c\x0e\x29\x30\x47\x10\x4b\xa8\xad\x1e\x9c\x7f\xfe\xbd\xb1\xb1\
+\x78\xf2\x69\x91\xcd\xc1\xdc\xe2\xaa\x99\x2e\xe5\x91\x63\x06\x0a\
+\x42\xa3\x94\xd3\x30\x2c\xd6\x0a\x24\xdc\x9e\x64\x51\x66\x81\x85\
+\x13\x0e\xa5\x99\x89\x50\x21\xe6\x4a\x74\x22\x21\x23\x8d\x88\x36\
+\x35\x0e\x1d\xe6\x85\xb8\xfd\xd9\xeb\x62\x24\x07\x6f\x2c\xae\x9b\
+\xb3\x33\x07\xd0\x0d\x0d\x8a\x39\xc3\x15\xe4\x50\x29\x02\x39\xce\
+\x68\xf6\x0d\x36\x59\x7c\x93\x2b\xf0\xb9\xbf\x81\xcd\x01\x57\xd2\
+\xa1\xff\xbb\x1c\x3d\x82\xda\x0c\x67\x3b\xb4\x83\x37\xc0\xff\xde\
+\x59\xf8\x09\xf5\x85\x13\x3b\x5b\xf4\x16\x45\x3e\xf5\x44\x05\xb7\
+\x3a\xd4\xc0\xee\x7f\x56\x83\x4c\x0e\xac\xc8\x7d\xab\x81\xcd\x01\
+\x57\x96\x6a\xe0\x8f\xe6\xc0\x8a\xec\xfc\xce\x1c\x2c\xec\x72\xd1\
+\x2c\x5d\xb4\xf9\xd0\xda\xf4\x9d\xe1\x0a\x1e\x18\xe0\x38\x45\x3e\
+\x7d\x78\x7f\xda\x77\xa6\xd9\xe4\x26\x59\x7c\x32\xd3\x8b\x2c\xa0\
+\x66\x73\x90\x58\x0d\xb0\x9d\x03\x77\xa8\x81\x9b\x01\x44\xb4\xb6\
+\x73\xed\x26\x1a\xe7\x33\xcd\xce\x7e\x4e\x5d\xad\x1b\xc5\x4b\x09\
+\xbd\xbd\x57\x18\xec\x2b\xd0\x66\xca\xa0\xe9\xc7\x68\x33\x0b\x5d\
+\xb6\xed\xd8\xb6\x6d\xdb\x9a\xd9\x35\x43\x16\x4b\x68\xcd\xd0\x8b\
+\x10\xd3\x45\x11\x6f\x40\xd9\x96\xdd\x0f\xb0\xc5\xbb\x1f\xb1\xe9\
+\x0b\xe7\x97\x7e\xd9\x5b\x70\x0e\x1f\x7d\x74\x0f\x7b\xbb\x42\x91\
+\x80\x12\x3d\x0d\xe6\xa0\xc3\xc2\x01\x0b\x47\xb4\xa6\x75\x8f\xb2\
+\x83\x39\x88\x78\x2d\x4e\x33\x61\xf3\x31\x78\x6e\xc4\x50\xb8\x7b\
+\x63\x05\x41\xdb\xfb\xb5\x71\xe9\xfd\x67\xb6\x01\x47\xe6\x97\xcd\
+\xe7\xaf\x55\x51\xf3\x35\x1e\xe1\xb6\x1c\xe0\xf6\xec\xe7\xb0\x39\
+\x58\x63\x62\x37\xe8\xef\x06\xf5\xe9\x10\x68\xb3\x10\x73\x65\x56\
+\x03\x9b\x03\xab\x81\x6b\x33\xc0\x6d\xea\x31\x70\x01\x41\xfe\x37\
+\x3f\xa0\x79\xf9\xe4\xce\x16\x3d\xfb\xd5\x92\xf9\xf4\xe5\x2a\xfe\
+\xe6\x7e\x57\x87\x22\x4f\x0e\x45\x5e\xb6\x22\x07\xa3\x22\x87\xd4\
+\xa0\x33\x14\xd9\x3e\x13\xbc\x8c\x06\x9c\x02\xe7\xea\x35\x34\x2e\
+\x7f\xb8\x03\x38\x42\xc0\x47\x2f\x56\xb1\xc1\xbe\x72\xdf\x2e\xb2\
+\x80\xef\xfe\x07\xf0\x31\x01\xf5\x07\x05\x38\x4a\xc0\x27\x2f\x4d\
+\xa3\xd6\x4b\xd2\x36\x71\x5f\x00\xc7\x81\x73\xe5\xc7\x51\xc0\xf3\
+\xe7\x96\xcc\xb1\xc7\xc7\xf0\xd8\xd8\x9e\x14\x30\xc5\x2c\x4c\x95\
+\x2d\x40\xa4\x1a\xac\x50\x83\xb5\xe1\xf3\xc0\xe6\x20\x1c\xe6\xc0\
+\x0a\xeb\xfa\x32\x85\x0c\x7a\x12\x1d\xb5\xda\x80\xb8\xf5\x17\x1a\
+\x97\x3e\x18\xcd\xc1\xcc\x97\x77\x42\x19\x25\xa5\x28\xb2\xfe\x56\
+\xe9\xd0\xf4\xb9\xa6\xb7\x05\xbd\x6f\x68\x49\xd8\xd7\x14\xc9\xc7\
+\xba\xe4\x39\x8f\x05\xaf\x19\xda\xd7\xf0\x75\x45\xdb\x39\x3c\xd6\
+\x5a\x45\xeb\x17\xdf\x4d\x5f\x5b\xfe\x03\x2e\xf1\x73\x55\x4d\x60\
+\xf5\x56\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x54\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x1b\x49\x44\x41\x54\x78\xda\x8d\x56\x5d\x6c\x14\x55\
+\x18\x3d\x77\x66\x77\xf6\xa7\xdd\x76\xb7\xbb\x2d\x4b\xa9\xb4\x0b\
+\x88\xd4\x2a\x5d\xd0\x52\x6a\x0d\x25\xfa\x00\x25\x92\x20\x09\x14\
+\x24\x20\x42\x11\x2c\x24\x46\x13\x21\x46\x7c\xc3\x18\x78\xd0\x98\
+\xd0\x16\x7f\xc0\x0a\x41\x28\x24\x48\x82\xb4\xf0\xa0\x41\x62\x6d\
+\x4b\x05\xb6\x28\x16\x11\xba\x14\x4b\x59\xe8\xfe\xb5\xdb\xfd\x9b\
+\x9d\x99\xeb\xdd\x59\xa8\x02\x96\xee\x97\xcc\xcb\xbd\xdf\x9c\x33\
+\xdf\xf7\xdd\x73\xee\x10\x3c\x26\xcc\x8b\x9b\xaa\x14\x59\x59\xa1\
+\x28\xca\x02\x59\x81\xc3\x60\xd2\xab\xeb\xd1\x50\x0c\x3c\x07\x37\
+\xc7\x71\xa7\x39\x9e\x3b\x1c\x3c\xb1\xf6\xa7\xb1\x30\xc8\xff\x2d\
+\x5a\x97\xec\x2f\x15\xc5\x44\x57\xf6\x84\x1c\x6d\x51\xb1\x1d\x45\
+\x0e\x2b\x72\xcc\x7a\xe8\xf5\x1a\x75\x3f\x16\x93\xe0\x0f\xc6\x70\
+\xc3\xed\xc3\x8d\x1e\x0f\x86\xee\xf8\x13\x82\xa0\x2d\xf3\x1d\x5f\
+\xd3\x3d\x2e\x81\x6d\xc9\xfe\x7a\xc2\xf3\x75\x15\xd5\xcf\x62\xfa\
+\x54\x0b\x74\x46\x01\x1c\xa5\x50\x94\x07\xf3\x38\x0e\x50\x08\x41\
+\x3c\x22\xe2\xea\xf5\x00\xda\x5b\x7f\x03\x95\xe5\x06\xef\xf1\x35\
+\x9b\xc7\x24\xb0\x2d\xfd\xb6\x39\x2b\xdf\xbc\x7c\xd1\xa2\x12\xe4\
+\xe6\x1a\xc0\x70\x19\x4a\x2a\x89\x61\x8d\x26\x27\x97\x93\x7b\x54\
+\x65\x4a\xed\x0d\x0e\x46\xd1\xd2\x72\x19\xc3\x03\xc1\x23\xde\x63\
+\xaf\xd5\x3c\x42\x60\x5f\x79\xb4\xde\x64\x35\xd6\xd5\xd4\x38\x91\
+\x65\xd4\x41\x96\x28\x44\xaa\xc0\x1f\xa7\xf0\x45\x24\x84\x64\xca\
+\xd6\x52\xb9\x3c\xeb\x94\x89\x27\xb0\x1a\x35\xc8\xd1\x11\x08\x84\
+\x63\x6b\x04\xc3\x91\x38\x9a\x9b\x5d\x08\xf9\x22\x0d\x9e\x43\xcb\
+\x36\x8f\x12\x3c\xf1\xfa\x77\xa5\x92\xa2\xb8\xde\x58\x5b\x06\xbb\
+\xcd\x84\x48\x3c\x81\xfe\x88\x8c\xbb\x11\x0a\x8e\x65\x70\xec\x53\
+\x19\xc6\x03\xc1\xb8\x59\x8b\xd8\xc3\xf6\xf2\x8c\x04\x05\x46\x1e\
+\x46\x9d\x16\x1e\x6f\x08\x5f\x37\x75\x41\xc3\x71\xce\xbf\xbf\x79\
+\xb5\x5b\x25\xb0\xaf\x3a\x26\x2e\x7a\xa5\x44\x5b\xe1\xb4\xe3\xd6\
+\x50\x1c\x7d\x41\x19\x8e\x2c\x3d\x0a\xb3\x78\xc8\xf4\xa1\xe6\x3f\
+\x14\x3c\x63\xee\x1b\x96\xe1\x1e\x8e\xa1\xd0\xcc\x63\x52\xb6\x0e\
+\xed\x2e\x0f\x5a\xbe\xbf\x9c\xf0\x1c\x5c\x2a\x90\xa2\xda\x93\x55\
+\x42\xa6\xf6\xcc\xb6\x75\x65\xb8\x3e\x94\x80\x2f\x26\x83\x67\x2f\
+\x3e\x97\x2b\x60\x5d\x69\x0e\xd2\x89\x7d\xdd\x7e\x9c\x1f\x14\x21\
+\x27\x4f\xa0\x9e\xc7\xd4\x6c\x2d\x76\xee\xeb\x82\x38\x92\x98\x4f\
+\x26\xd7\x9e\x6c\xac\xac\x2c\xdc\x54\x31\x7b\x12\xae\x07\xe2\xec\
+\x8b\x08\x44\x76\xe8\x8b\x33\x35\xa8\x2b\xb3\xa5\x45\xd0\xd0\xe5\
+\x45\xcf\x88\x04\x81\x89\x43\x66\xd3\x9f\x6a\x61\x55\x5c\xb8\x85\
+\xb6\xb6\xbe\x3d\xa4\x60\x43\x4b\xef\x9b\xab\x9d\x8e\x30\x11\xd8\
+\x40\x28\x08\x4b\x88\xc9\x32\xa6\xe8\x29\xb6\xcc\x9d\x98\x16\xc1\
+\xee\x8e\xdb\xe8\x8d\x11\xe8\x79\x1e\x94\xa8\x28\xc8\xa0\x22\xbe\
+\x38\xe0\x72\x93\x49\xb5\x2d\xf4\xad\x8d\xe5\x10\x45\x7a\xaf\xa7\
+\x04\x23\xa2\x04\x6d\x24\x8a\x8f\xaa\x0b\xd3\x22\xf8\xa0\xb5\x0f\
+\x09\xa3\x01\x99\x82\x46\xad\x20\x19\x82\x40\xd0\xf8\x79\x27\xc8\
+\xf4\xf7\xce\xd0\x0d\xab\x66\x21\xce\xd4\xc9\x4e\x1e\x02\xac\x91\
+\x9d\xbd\x23\x98\x90\x08\xa3\x79\x6d\x71\x5a\x04\x35\x4d\x3d\xb8\
+\xa3\xcd\x40\xf9\x94\x4c\x58\xd8\x00\xd9\x89\x86\x8e\xa9\xfe\xcb\
+\x83\x17\x41\x4a\x3e\x6c\xa7\x1b\x6b\x4a\x20\x89\x0a\x7a\x82\x12\
+\x02\x51\x05\x21\xe6\x35\xa6\x50\x00\x47\x6b\x67\xa6\x45\xb0\xec\
+\xab\x4b\x08\x99\x2c\x30\x31\xaf\xb2\x18\x38\x14\x9b\x35\xd0\x08\
+\x3c\x1a\x0f\x76\x83\x38\xb6\xb6\xd1\xed\xeb\x9d\x70\x79\x62\xf0\
+\x33\x70\x0d\x3b\xf8\xbe\x40\x04\xbc\xd7\x8b\xe3\x75\xb3\xd2\x22\
+\x58\xd2\x70\x11\xb2\xcd\x06\xab\xc5\x08\x89\x09\x23\x87\x91\x38\
+\xed\x7a\xec\xd8\xeb\x02\x29\xde\xde\xd1\xbb\x70\xc1\x93\x0e\x76\
+\xfc\x93\xaa\x67\x1e\x43\x70\xc7\x1f\x86\x7c\x73\x00\x27\xde\x99\
+\x93\x16\xc1\xe2\x4f\xcf\x81\x9f\x9c\x8f\x09\x39\x19\xcc\xb3\x68\
+\xd2\x5d\xc0\xe4\x80\x53\xa7\xff\x72\x93\x99\x3b\xce\x37\x4e\x7b\
+\xc6\xbe\x69\xa2\x8d\x6d\xb2\xe6\x71\x6c\x10\x9e\xbb\x21\x84\xaf\
+\xf6\xa1\x75\x5b\x65\x5a\x04\xd5\x3b\xdb\x90\x31\xbd\x10\xf6\x3c\
+\xd3\x28\xc6\x6d\x6f\x18\xd7\x7e\xf7\xec\x21\xb3\x77\x75\x57\x65\
+\x98\xf4\x67\xe6\x3e\x9f\x8f\x78\x82\x89\x8c\x55\xd0\x3f\x30\x8c\
+\xe1\x2b\x37\x70\xea\xfd\x17\xd3\x22\x58\xf8\xf1\xcf\xc8\x9a\x51\
+\x84\x82\xfc\x2c\xc8\xac\x02\x9d\x96\x47\xc7\xaf\x03\x08\x87\x62\
+\xf3\x55\xab\x70\xee\xba\x24\x96\xcf\xc9\xd7\x66\x67\xe8\x54\x97\
+\x1c\x89\x89\x38\xf4\x49\x2b\x66\xcf\xca\x47\x42\x7a\xbc\x55\x68\
+\x35\x1c\x2e\x5c\x1c\xc0\xca\x77\xab\x91\xa9\x17\x54\x67\x1d\x0a\
+\xc7\xd1\x79\x6e\x20\xe1\xda\x3a\x53\x50\x09\xca\x3e\xfb\xa3\x94\
+\xd7\xf2\xae\x97\x2b\x0a\x54\x0f\x4e\xce\x21\x18\x8d\xc3\xe7\x8b\
+\xa4\x55\x81\xd5\x6a\x84\xd9\xa0\x53\xfb\x9f\xb4\xcf\x1f\xda\xfb\
+\x21\x27\x64\x67\xd7\xdb\x4f\x77\x8f\xda\x75\xf9\xee\x3f\xeb\x2d\
+\x79\x86\xba\x79\x25\xb9\x88\x4b\x29\xb1\x70\xea\x45\x30\x0e\x3a\
+\x4d\x39\x6a\x32\x74\xcc\xb2\xcf\x5e\x1e\x44\xe0\x6e\xb4\xa1\x73\
+\xcb\x53\xff\xda\xf5\xfd\x98\xbb\xe7\x5a\xb3\x2d\xd7\xb0\xfc\x85\
+\x19\x39\xaa\x58\x94\x7b\xaa\x1c\x2f\x38\xd6\x97\xa4\x48\x7f\xb9\
+\xe2\x87\x77\x30\x7a\xa4\x63\xd3\xb4\x47\x2f\x9c\xfb\x51\xb9\xd7\
+\x5d\xcf\xeb\x49\x5d\x05\x23\xb1\x66\x0a\xea\xd0\x92\x44\x94\x3e\
+\x98\x4a\x08\x4d\x01\x27\x75\x33\x22\xa2\x9d\x81\xcb\x31\xda\xd0\
+\xb6\xde\x31\xf6\x95\x79\x3f\xe6\x1d\xb8\x59\x2a\xc9\xb4\xcb\x6a\
+\xd6\x69\x1d\x76\x03\xf2\x4c\x1a\x18\x99\x32\xe9\xbd\x8a\x08\x03\
+\x8e\x88\xec\x42\x0a\x49\x70\x7b\xa2\xf0\x05\xe3\x09\x0d\x4f\xca\
+\xce\xae\x9e\x3c\xfe\xa5\xff\xdf\x78\xe9\x50\x7f\x95\xa2\x90\x15\
+\x32\x87\x05\x54\xa6\x0e\x83\x21\xf5\x57\x11\x8d\x4a\x20\x3c\x71\
+\xf3\x0a\x4e\x73\x1c\x3d\xfc\xe3\xca\x82\x31\x7f\x5b\xfe\x01\x49\
+\x78\x1d\x0d\xbd\x14\xbd\x9e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x06\x1a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xe1\x49\x44\x41\x54\x78\xda\xa5\x96\x7d\x6c\xd4\xf5\
+\x1d\xc7\x5f\xdf\xdf\x3d\xf6\xae\x0f\x77\xbd\x96\xb6\xf4\x7a\x77\
+\xbd\x4a\x1f\xe8\x4d\x56\x28\x03\x8b\xb3\x28\x31\x1a\xa7\x53\xb2\
+\xd8\x96\x90\x4e\x4c\x58\x36\x87\x38\x17\x71\x93\x30\x33\x83\xc1\
+\x65\x8b\xdb\xd0\x66\x53\x96\xc5\x80\x41\x6d\xf1\x9f\x25\x48\x66\
+\x58\x2c\x05\xa1\x4a\x07\x01\xa5\xad\xa5\x2d\xf4\xb9\xa5\xa5\xd7\
+\x7b\x68\xef\x7a\xcf\xbf\xfd\xb8\x63\xad\x5d\xa7\xd9\xc3\x37\xb9\
+\x3f\xee\xf3\xf9\x7c\xdf\xef\xcf\xe3\xf7\xf3\x13\x91\x9f\x68\x5d\
+\x02\xb9\x49\xe4\xe4\x6e\x46\xaf\x23\x75\x84\xf2\x93\xf9\x9f\x4f\
+\x28\x8c\x3c\x7d\xb3\x4d\x46\xec\x16\xa1\xa7\x35\x97\x35\x0f\x3e\
+\xb6\x46\x2a\xbb\x27\x85\x19\x8f\xc1\x9c\x1b\x4c\x79\x4b\x2f\xfd\
+\x37\x7c\x8a\x7f\x89\xab\x67\x88\x7e\xf8\x97\x36\x31\xff\xd2\x4a\
+\x59\xbf\x7d\xaf\x22\x49\xc0\xd4\x35\x12\x3d\x5d\x88\x82\xf2\x14\
+\xe6\x8d\x1e\x84\x4a\x91\x9b\x73\x11\x16\x85\xd0\xe2\x00\x95\xe6\
+\x3f\x63\x93\x24\x42\xef\xfc\x0a\x11\x78\xd9\x2e\x1b\xea\xf7\x40\
+\x34\x44\xf4\xe2\x59\x34\xdb\x8e\x81\x5a\xbb\x68\x18\x0b\x91\x18\
+\xbf\x0c\x03\xad\xc4\x7b\x5b\x91\x2c\x16\x54\xa5\x6b\x40\x9b\xf1\
+\xf5\x44\x42\x22\xd8\xf2\x2a\xc2\xbf\xdf\x2e\x67\xd4\x3d\x0b\xb3\
+\xd3\x44\xfa\x87\xd1\x36\xbc\xfd\xb5\x8e\xc5\xfb\x5a\x89\xb5\xbf\
+\x86\x48\xd7\xa1\x2d\xaf\x52\x22\xd2\x7e\x05\x81\x8a\xd9\x63\x07\
+\x11\xde\x17\x8b\xe4\xac\x86\xdd\x49\x6f\xc2\xed\x7f\x43\xac\x69\
+\x44\x65\x5d\xa7\xfc\x55\x4a\x94\x99\x8f\x94\x9e\xb3\xec\xae\x1c\
+\x9b\x27\x7a\xe9\x7d\xa2\x9f\xbc\x89\x71\xa3\x52\x3b\x63\xf6\xf2\
+\x68\x94\x08\x7c\xcd\x4d\x88\xe9\x7d\x45\xb2\xa5\xfe\x87\x49\x40\
+\xe2\x71\xa2\x63\xd7\x90\xe3\x51\xe2\xfe\x59\x05\x28\x46\x2c\x10\
+\x45\xed\xa8\x46\x53\xb9\x15\x4d\xf1\xc6\x25\x18\xb1\xc9\x6e\x02\
+\x2d\x4f\x63\x28\xbf\x03\x4d\x81\x3d\x85\xb1\x40\x20\x70\xb7\x1c\
+\x42\x4c\xfe\xac\x48\x5e\xb1\x6d\x67\x4a\xa9\x08\x13\xde\xa9\xc5\
+\x3a\x19\x4d\x4a\xae\x75\xc4\x27\x47\x09\x8d\x8f\x12\x8b\x48\xa4\
+\xdd\xff\x0b\xb4\xc5\x1b\x16\x53\xe6\x19\xc6\xf7\xf6\x93\xa4\x97\
+\x3a\xd0\xe6\xdb\x96\x10\x4c\xbd\xf7\x67\xc4\xc4\x73\x85\x72\x7e\
+\xc3\x8e\xa4\xcc\xf3\xe9\xa7\x48\x39\xa5\x49\x4f\x63\x93\x5d\x44\
+\xc7\x7b\x90\x62\x73\x18\x8a\x6d\xe8\xf2\xad\xc4\xbd\x6e\x7c\xdd\
+\x3d\x4a\x0a\xd7\x93\xf1\x9d\x97\x90\xb4\x69\xa9\x48\x66\x86\xf1\
+\x1e\xdd\x89\xe5\x9b\xa5\x88\xb4\xac\x05\x82\x1b\xcd\x87\x11\x63\
+\x3f\x5d\x29\xaf\xac\x6f\x24\xe2\x71\x13\x9c\xcf\xc6\xb4\xf5\xd7\
+\x4b\xd3\xe0\x1e\x22\xf8\xf7\xa3\xcc\x9f\x6f\x21\xab\xc2\x89\xbe\
+\xd0\x8a\xff\xca\x15\xc2\xaa\x7c\x72\x76\x1c\x41\x68\xf4\x49\xbb\
+\xd0\xf5\xf3\xcc\x1e\x7f\x81\xdc\x8d\xdf\x5a\xc8\xc6\x78\xcb\x51\
+\xc4\xf0\x33\x05\x72\x51\xfd\x36\x22\x8a\x77\x41\x69\x15\xa6\x07\
+\xf7\xfd\xdb\xa6\x08\x4f\x74\x33\xb6\x7f\x0b\xd9\xb6\x34\x4c\x95\
+\x76\xfc\x9d\x83\x78\xdd\x3a\xac\x07\x2e\x22\xe9\x8d\x49\x1b\xef\
+\x89\x97\x51\xcd\x5c\x22\xc3\x69\x4b\x16\x79\xa4\xa5\x19\x31\xb0\
+\x2b\x4f\x76\xd4\xd7\x29\xc9\x8c\x32\x7a\xe2\xaf\xa8\x4b\xee\x42\
+\x9d\x57\x82\x5e\x49\x53\x5a\xf9\xbd\xa8\x6e\x5f\xbe\x75\x12\xe1\
+\x20\x03\x7b\xab\xc8\x36\x87\x30\x57\x58\x99\x38\x7b\x15\x69\x5d\
+\x1d\x79\x8d\x7f\x4c\xe9\x23\x21\x86\xf6\xde\x89\xfd\x81\x1a\x24\
+\x43\x26\x83\xcd\xc7\x10\xfd\x3b\xcd\x72\xc9\xc3\xeb\x95\xe7\x61\
+\x9a\x98\xd2\x45\x81\x61\x0f\xd1\xf9\x08\x61\x7f\x08\xdf\xa8\x0f\
+\xd3\x96\xc7\xc9\xdf\xf9\xd6\x82\x97\xb7\x48\x7a\x77\x95\x60\xbf\
+\x33\x13\xad\xd9\x40\xff\x07\x9d\x58\xf7\xb7\x61\x2c\xdb\x94\xd4\
+\x8f\x34\xd5\x63\xb8\x79\x0e\x4b\xb5\x8b\x6b\xc7\x3b\x10\xbd\x4f\
+\xa4\xcb\xab\xee\x2b\x59\x6c\x63\x21\xbe\xd4\x09\xca\xeb\xf1\xf9\
+\x18\x13\x83\x01\xca\x0e\x5e\x50\xf2\x5f\x91\x14\xcf\x5d\x6d\x67\
+\xf0\xc5\x5a\x5c\x8f\xb8\x98\x19\x98\xc6\xab\xaa\xc0\xb9\xef\x64\
+\x52\x37\x3f\xd6\xcd\xd0\x9e\x2a\xca\x1f\x5a\x4d\xdf\x47\xfd\x88\
+\x9e\xed\x46\xb9\xac\xd6\x96\x44\xf3\x4c\xcc\xe2\x1e\xf4\x10\x8f\
+\xc4\xd0\x1a\x75\xe4\xd8\x4d\x64\xac\x30\x2a\x32\x2f\xa3\x43\x71\
+\x5c\x7f\xba\x86\x2a\x2d\x15\x49\xcf\xcf\xab\xc9\xd1\x8e\x2b\x36\
+\x66\x2e\x1f\xef\xc1\xd5\xec\x47\x7d\x5b\xf7\xf9\xf7\x0b\xa8\xac\
+\x31\xd1\x7f\x76\x04\xd1\xd9\x90\x26\x57\xd6\x5a\x19\xfa\x6c\x0a\
+\x6f\x22\x17\xfb\x0f\x7e\x4f\x86\xeb\x3e\x3c\x1d\xef\x33\x74\xe8\
+\x05\xec\xd6\x04\x39\xc5\x59\x8c\x75\xdd\x84\xbb\x7f\x4c\x61\xfd\
+\x81\x54\x41\x2f\x7c\xc0\xe4\x6b\x75\x94\x6d\xb2\xd2\xdf\x71\x83\
+\xac\x1d\xaf\x93\x7b\x4f\xaa\xdd\xfb\x7e\x57\x47\x7e\xa0\x9d\x91\
+\x2f\x66\x10\x57\xea\xf5\xb2\xf3\x1b\xd9\x74\x75\xc6\x59\x7b\xf8\
+\x3a\x2a\x9d\x61\xb1\x73\x66\xc6\xf9\xec\xc9\x32\xaa\x6a\xb3\x95\
+\xf8\x64\x3a\x3e\x9a\xa6\xe6\x44\x70\x41\x7f\xee\x7e\xc1\xa6\xef\
+\x3a\x98\x1a\xf4\x13\xae\xfe\x11\x45\xdb\x52\xe4\x23\xef\x29\x9d\
+\xf8\xf1\x1f\xf0\xcd\x84\x11\x97\xbf\xa7\x95\x4d\x66\x1d\xea\x47\
+\x7f\x49\xe1\xc3\xcf\x2d\x6b\xcf\xfe\x43\x4f\x61\xea\x3d\x46\x4e\
+\xa1\x81\x4b\x1f\xdf\xa0\xf8\x40\x2b\xa6\xd5\xdf\x4e\xea\x2e\x3d\
+\x5b\x8d\x2b\x6f\x9c\xb9\xd9\x28\x83\x41\x1b\x55\x07\x2f\x26\xe5\
+\x93\xa7\x8e\x30\xff\xee\x6e\x7c\x1e\x85\xe0\xe2\x63\x1a\x85\x40\
+\x8d\xa1\xf1\x0d\xf2\xef\x7d\x62\x19\xc1\xc0\x3b\xfb\xd0\xb7\x37\
+\x91\x67\x33\x30\xd0\xe3\x27\xfb\xf9\x93\x98\x57\xdf\x9d\xd4\x5d\
+\x78\x66\x1d\xc5\xba\xeb\x29\xbb\xb0\x93\xea\xd7\x53\x04\x13\xa7\
+\x8f\x10\x3c\xfc\x14\x3e\x6f\x0c\xd1\xf1\x88\x5a\x76\xd8\xf5\x8c\
+\x64\x54\xb3\xf6\x95\x53\xcb\x08\x4e\x3d\x9a\xcb\xba\xb2\x18\xe9\
+\x99\x6a\x86\x06\x02\x84\xd6\x36\x52\xb1\xeb\x10\xf1\x50\x90\xd3\
+\x0d\x76\xee\xaa\x8c\xa3\x33\xa8\x38\xf9\xe1\x34\x15\x7b\x5e\x25\
+\x73\xd5\x46\x3a\x5f\x69\x64\x75\x9e\x9b\xeb\x7d\x41\x44\xfb\x43\
+\x92\xbc\x61\x43\x16\x67\xce\x78\x70\xec\xfa\x0d\x8e\xad\xcf\xa7\
+\x9e\x88\xf9\x00\x5d\xbf\xdd\x4e\xe4\xfc\x71\xd6\x56\x67\x21\x27\
+\x6e\x2d\x3d\x99\x73\xe7\xbc\x48\x85\x4e\x65\x4e\xfc\x38\xd2\xfd\
+\x38\xef\x48\x75\xce\xdc\x6c\x8c\xbe\xbe\x00\x91\x68\x82\x12\x67\
+\x1a\x2b\xf2\xf4\x9c\xef\xf0\x21\x5a\xb7\x20\xd7\xd6\x64\x12\x0b\
+\xcb\x74\x7e\x31\xc7\x64\x22\x9b\x0c\x9b\x8d\x99\xee\x4e\x9c\xe6\
+\x38\xa5\xa5\x46\x65\xa7\x2c\xce\xc6\xad\x31\xf1\x79\xa3\x68\xd5\
+\x12\x7a\xa3\x6a\xe9\x0a\xb8\x6d\x76\xfb\x29\xe2\x74\xbb\x1f\xf1\
+\xee\x06\x4e\xd5\x94\x6a\x36\xdb\x0a\x34\x0b\xc3\xe5\x76\xc7\xb0\
+\x58\xd4\xc9\xe1\x4b\xce\xdf\xbf\x6e\xc6\x7f\xf2\x7d\xd5\xc6\x54\
+\xf4\x23\x13\x51\xda\x7b\xa3\x6d\xe2\xe8\x7a\x5c\x8a\x5d\x93\xc5\
+\xc0\x66\x9d\xfa\x4b\x00\xff\xc7\x57\x4b\x58\xf9\x30\x71\x07\x69\
+\x53\x60\x76\xff\x03\xad\x17\x56\x31\x86\x0e\x10\x25\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xc1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x88\x49\x44\x41\x54\x78\xda\x95\x96\x6b\x50\x54\x65\
+\x18\xc7\xff\xe7\xec\x95\x5d\x30\x75\xcc\x5b\x91\x53\x0a\x0a\x52\
+\x26\x26\x1a\x72\x11\xa9\x1c\x27\x09\x53\x59\xc0\x52\x67\xb2\x19\
+\xcd\x69\x26\x3e\x34\x6a\x35\x13\xbb\xcd\x68\x33\xa2\xd6\x87\xc6\
+\xb1\xb1\x51\xa9\x4c\x96\x44\x11\x34\x53\x2c\x0c\x44\x61\x15\xbc\
+\x16\xa0\x72\x59\xc5\x81\x65\x59\x60\x97\xcb\xee\xb9\xec\x39\xbd\
+\xe7\x5d\x5a\x15\xac\xa1\xb3\xfb\xce\x39\xfb\x5e\x9e\xdf\x73\x3f\
+\xcb\x60\x94\xd7\xd8\x2d\x75\x69\x39\x69\xcf\x94\x74\xf7\x73\xc8\
+\x3f\x65\xaf\x72\x7f\x93\x98\xa0\xcc\xeb\xd7\x97\x15\x89\x82\xc4\
+\xaa\x24\x89\x25\x3f\x65\xae\x60\xd9\x8a\x47\xcf\x31\xa3\x11\x3e\
+\xe1\x93\x3a\xd3\x9e\xb5\x33\xac\x63\x9e\x0e\x83\xdd\x2b\xc3\x76\
+\xb7\x1b\x27\x8f\xdc\x38\xeb\xde\xbf\x64\xe9\xf5\x3b\xad\x72\xa3\
+\xdd\x09\x87\xe3\x01\x3e\x2a\x51\xe7\x49\xd6\xe5\x5b\xfe\x17\x60\
+\x92\xf9\x96\x29\x2f\x33\xdc\xaa\x1b\x17\x86\x9b\x2e\x89\x9e\x50\
+\xb3\x12\xae\x37\x75\xe3\xf8\xa1\xba\x52\x39\x7f\x41\x5a\x7d\x4b\
+\x07\x1c\xf7\x5a\x90\x72\x00\x16\xfc\xbc\xdc\x3c\x6a\xc0\xe4\x1d\
+\x0d\xa6\x9d\xab\xa6\x58\x75\x86\x30\x54\xbb\x65\x4c\xf1\x3c\x80\
+\x2c\xc8\x68\x09\x9b\x0c\x35\x24\x5c\xa8\x73\xe0\xea\x86\x69\x68\
+\xb6\xdf\x87\xbb\xbd\x05\xb1\xbb\x3c\x16\x14\xa5\x8d\x0e\x10\xbe\
+\xf3\x8e\xe9\xcb\xf4\xc9\x56\x41\xa7\x47\x6d\x2f\x30\xb1\xcf\x01\
+\xa6\xf2\x47\xba\x36\x10\x97\x89\x06\x76\x22\x06\x78\x01\xa5\x49\
+\x7a\x74\x3a\x1d\x70\xb6\xb5\x62\xde\x9e\x51\x02\x9e\xff\xba\xd9\
+\xf4\xc5\xd2\x09\x56\xaf\x46\x87\x4b\xdd\x12\xc2\x07\xbb\xa0\xb9\
+\x78\x18\x2f\xce\x9e\x03\x86\x61\x70\xe3\xd6\x35\xb4\xc7\xac\x46\
+\x0d\xff\x14\x78\x51\x46\xc1\x2b\x83\x90\xbb\xec\x88\xc9\xf3\x98\
+\x09\xc0\xf2\x9f\x80\x17\xf6\xde\x33\x7d\x9e\x32\xd6\xda\xcb\x6a\
+\x51\xd9\xee\x47\x84\xe8\x82\xd1\xf6\x13\xa6\x4f\x9b\x4e\x9c\xaf\
+\x22\x00\x16\x2c\x23\xa1\xc7\xd5\x83\xdf\xc7\x27\xa0\xac\x37\x14\
+\x9c\x2c\xe3\x78\x74\x2b\x96\x7d\xe5\xda\x29\x1d\x4b\xdf\xfa\xaf\
+\x80\xa8\xef\xda\x4c\x1f\xc7\x8f\xb1\xba\xfc\x2a\x94\xb7\xcb\x88\
+\x96\xbb\x30\xa5\xa1\x14\xcf\x4d\x7d\x16\x76\xbb\x1d\x5a\x8d\x9a\
+\x5a\xc0\xf1\x22\x16\xbd\xba\x00\x4e\x57\x2f\xf2\x7a\xa7\xe1\x42\
+\xbb\x96\x8a\x62\xdc\x1e\x18\xff\x6a\xca\xec\x2f\x5e\x55\x38\x02\
+\x30\xfb\x60\xbb\x29\x67\x81\xd1\x7a\xdf\xcb\xa0\xbc\xc3\x8f\x39\
+\xac\x0b\x31\xf6\xf3\x88\x88\x8c\x80\xa7\xbf\x0f\xcd\x77\x9b\xa1\
+\xd5\x6a\x09\x00\xe0\x39\x1e\x8b\x92\x17\x41\xe4\x79\x74\x39\x7b\
+\xb1\x9d\x40\x6c\xf7\x35\xa4\x28\x58\xa8\xbb\x3d\xd0\xdc\x6c\xc8\
+\xf4\x96\x64\x15\x06\x01\x2f\x17\x38\xb3\x36\xbf\xa4\x3f\x72\xdb\
+\x23\xa1\xec\x1e\x8f\x38\x83\x07\xf3\xda\xce\x23\x2a\x7a\x26\x58\
+\xe2\x16\x77\x77\x3f\x1a\x1a\xeb\xa1\x23\x00\x85\xc0\xf3\x1c\x52\
+\x53\x97\x80\xe3\x38\xa8\x18\x99\x2a\xf8\x61\x23\xc9\x34\xbb\x8a\
+\x42\x54\x2e\x37\xd8\x6b\xf5\xd9\xc2\x2f\x6b\x0a\x28\x60\x5b\x8d\
+\x5b\xee\x15\x24\x9c\x69\xe2\x91\x14\xd6\x87\x94\xfe\x6a\x44\xce\
+\x88\xa0\xc2\x54\xac\x0a\x3d\x9e\x6e\x5c\xb1\xd5\x11\x0b\x74\x54\
+\x27\x41\xe0\x90\x9e\xfe\x16\x01\xf1\x60\x58\x86\xd4\x45\xc0\x11\
+\x9b\xea\x75\xa8\xba\x4d\x1e\x8c\x6a\xb0\x8d\xad\x90\xf6\xa5\x30\
+\x74\x25\xed\x54\x97\x7c\xb1\xcd\x87\x15\x93\x06\x91\xe8\xb1\x21\
+\x7a\xd6\x4c\x22\x87\xa5\xfe\x66\x59\xa2\x91\x4a\x4d\xdd\xa3\x52\
+\x2b\x01\xa6\x1d\x81\x0a\x97\x24\x89\xee\x51\x3e\xec\x10\x64\xe3\
+\x2d\x35\x2a\x88\xbb\x98\xdb\x2d\x90\xf7\x2d\x66\x82\x31\x88\x29\
+\x70\x55\xe4\x47\xb6\x25\x06\x22\xc3\x50\xcd\x94\x45\xb5\x5a\x0d\
+\xce\xe7\x83\x8e\xd4\x03\x15\xc6\x28\xe2\x03\x71\x30\x1a\x8d\x90\
+\x65\xff\xd0\xbc\x62\x6d\x40\xd6\xf4\xf7\x6b\x2a\x51\xfe\x4e\xd2\
+\x63\x41\x8e\xca\x77\x7e\x6a\x8d\xed\xdc\x3e\x24\x3f\xa8\x99\x3e\
+\x24\x04\xbb\x77\xed\x46\x65\x65\x05\xf4\x7a\x1d\xd1\x54\x05\xaf\
+\xd7\x87\xa4\xe4\x64\x6c\xdb\xba\x05\x3e\x1f\x07\x62\x16\xf9\x06\
+\x20\xb4\x8e\x36\xd6\x7c\x86\x33\x19\x3b\x86\x01\x3a\xcd\x45\x71\
+\x3d\xb9\x41\x00\x28\x05\x06\x83\x01\x7b\xf7\x7e\x8b\xab\xb5\x36\
+\xe8\xf4\x7a\x3a\x27\x90\xe0\xce\x9d\xb7\x10\x39\x39\x1f\x10\x98\
+\x37\xb8\xf7\x1f\x40\xf8\x7b\x17\x2c\x38\x9b\x69\x7e\x0c\x30\x8b\
+\x00\x4a\xe2\x3d\x43\x00\x36\x70\x88\x68\x66\x34\xe8\xb1\x7f\xff\
+\x01\xd4\x5d\xb9\x0c\xad\x4e\x47\x05\x29\xe9\x39\x77\xfe\x7c\x6c\
+\xde\xb4\x31\x00\x60\x02\xee\xc4\x10\x60\xea\xba\x3f\x2c\x28\x1b\
+\x0e\x38\xd4\x69\x3e\xbd\xd8\x3b\x04\x60\x82\x56\x28\x2e\x3a\x94\
+\xff\x3d\x6a\x6b\x6b\x69\x16\x29\x6b\xa2\xc8\x23\x76\x7e\x1c\x36\
+\xac\x5f\x47\x53\x35\xb0\x97\xa5\x0a\x29\xd7\xc4\xec\x73\x23\x01\
+\x33\x09\xa0\x2c\x95\x7f\x04\x10\x80\x84\xe8\x43\x70\xf8\x48\x01\
+\x2e\xd7\xd4\x20\xc4\x60\xa4\xc1\x6d\x69\x6e\x46\x56\xf6\x1a\xbc\
+\xbb\x36\x9b\x00\x7c\x23\x5c\x34\x2e\xe3\xd7\x27\x01\x1c\xe6\xf2\
+\xa5\xf2\x13\x00\x06\x58\x0b\x0b\x51\x5d\x7d\x05\x7a\x83\x86\xa6\
+\xad\xbd\xa9\x09\x2b\x33\x4c\xc8\xca\xcc\x20\x19\xc6\x05\x85\x2b\
+\xfb\x43\x8d\x24\xdb\x5e\x3f\x6a\xc1\xb9\xac\x61\x80\x83\x0e\x73\
+\x65\x9a\x9a\x02\xd8\xa0\x8b\x48\x61\x92\xf4\x3c\x7a\xac\x18\x97\
+\x2e\x5d\x26\xa9\x1a\xe8\x39\xa2\x20\x60\x61\x7c\x1c\xb2\x4c\x2b\
+\xe1\x23\x16\xb1\x43\x9a\x2b\x10\xbd\x5e\x01\x58\x47\x02\x22\x0f\
+\x76\x98\x6b\x56\xe8\x03\x16\xb0\x0f\x83\xa6\x1c\x28\x2e\x2e\x85\
+\xcd\x66\x83\x46\xa3\xa5\xf3\xbc\xe0\x47\x3c\x01\xac\x7c\x3b\x9d\
+\x54\xb5\x80\x47\xad\x56\xa9\x48\xc7\x7d\xad\xc0\x82\xdf\xb2\x87\
+\x5b\xd0\x61\x6e\x58\x17\x9a\x2b\xf3\x78\x98\x11\xca\x20\x15\x7c\
+\xfa\xc4\x29\x54\x55\x5d\x24\x8f\x9a\x80\x05\xa2\x80\xe4\xe4\x04\
+\xa4\x2e\x7b\xf3\x49\xaf\x13\x30\x6f\x10\x0b\xca\x86\x59\x30\x27\
+\xbf\xdd\x9c\x9d\x38\x29\x77\x80\xf4\x24\x99\xf4\x77\xc9\x0f\x08\
+\xe4\x4e\xde\x27\x18\xef\xf3\xc0\xe9\xe1\xe1\xf7\x4b\xe0\x94\xc1\
+\x4b\x08\x0d\xd5\xe2\x4f\xde\x80\x01\xaf\x08\x1f\x39\xe3\x13\xfd\
+\xe8\xe3\x24\xf0\x8c\x0a\x7d\x45\x15\x16\xff\x49\xd3\xe3\x80\xd8\
+\x1f\x3a\xcc\x09\x51\x61\xb9\x7d\x9c\x1f\x22\xe9\x31\x02\xf9\xf7\
+\x20\xf8\xfd\xe0\x09\x88\x17\x25\xfa\xe6\xe2\x94\x3b\x11\xce\xfb\
+\x65\x0c\x72\x22\x44\xb2\xd7\x47\x5c\xa4\x00\x78\x32\x04\x72\x4e\
+\x24\x00\x5d\x5d\xbd\xc5\x77\x62\x35\x05\xfc\x0d\x1b\x2c\x7b\x37\
+\x74\x04\x9a\xd0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x05\xbf\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x86\x49\x44\x41\x54\x78\xda\x8d\x96\x7f\x50\x54\x55\
+\x14\xc7\xbf\xf7\xfd\xda\x5d\x16\xf6\x2d\x8b\x20\xa1\x04\xa8\x08\
+\x26\xfe\x98\xd4\x89\x34\xb4\xa2\x2c\x48\xfd\x43\x4d\xb1\x1f\x33\
+\x86\x9a\xba\x4e\x96\xd3\x64\x4d\x39\xd3\xd4\xe4\xa4\x16\x63\xe9\
+\xec\x8a\x9a\x64\xfd\x61\x82\x64\xcd\x60\x31\x93\xd1\x34\x62\x6a\
+\xa3\x36\x92\x18\x2a\x84\x68\x64\x03\x0b\x0b\xbb\xcb\xc2\xee\xbe\
+\x5f\xdd\xf7\x16\x01\x07\xfc\x71\xfe\xd8\xb7\xfb\xee\xb9\xe7\x73\
+\xce\xb9\xe7\x9c\xbb\x04\x77\x11\x7e\xc1\x9e\x3c\x29\x22\x15\x21\
+\xd2\x59\x80\x50\x20\x03\xe2\xd8\xe8\x82\xaf\x15\x30\xc7\x5d\x83\
+\x90\x50\xcd\x0b\xfc\x61\xe9\xd8\xfa\xda\x3b\xd9\x20\x23\xbd\x14\
+\x16\x95\xe6\x44\x02\x1d\x75\xf1\xa9\x29\x4c\xce\xfc\x07\x31\x21\
+\x7b\x34\xc6\x8d\xb1\x41\x34\x71\x51\xfb\x61\x19\xcd\xff\xfa\xd1\
+\x74\xb9\x0d\xf5\xc7\x5b\xd1\x75\xa3\x55\x15\x62\x13\xa6\x45\xaa\
+\xd6\xd7\xdf\x1b\x90\xef\x76\x81\x04\x9c\xf3\xd7\xcd\xc0\xec\xdc\
+\x74\x24\xc1\x0c\x12\x61\x21\x85\x19\x68\x72\x54\x9d\x70\x1a\x78\
+\x93\x0a\x4d\x50\xe0\x63\x64\x9c\xbf\xea\x45\xe5\x47\xc7\x01\x2d\
+\xce\x8d\x1a\xe7\x86\x3b\x03\x0a\x76\x1e\x49\x4a\x1b\xb5\x74\xf5\
+\x96\x27\x30\x56\x03\xd4\x20\x0f\x25\xc2\xe0\xf3\x0b\x1e\xa4\xd9\
+\x04\x98\xd9\x41\xf5\x2b\x5d\x61\xbc\x3e\x3d\x11\xac\xa0\x82\xb1\
+\x4a\x68\x88\x84\x51\xf1\xe9\x29\xb4\xb5\x74\x54\xa2\x7a\xd3\xf3\
+\xc3\x00\x4c\xe1\x3e\x57\xe2\x78\xd1\xb9\xee\xdd\x39\x18\x1b\xe1\
+\x10\xf6\xb3\x08\xcb\x1a\x3c\x7d\x32\xaa\x5a\xfc\x38\xf6\x5c\x06\
+\xc6\xc4\xf2\x60\xa8\x6e\x48\xd5\x90\x5b\xd9\x88\x05\x69\x36\x24\
+\x5a\x38\x98\x38\x02\x93\x4d\x41\xb7\x85\xa0\x64\x6b\x2d\xda\x1b\
+\xbd\x6e\xf5\xc7\x57\x37\x0c\x00\xac\xcb\xca\x72\x82\x81\xc0\xc5\
+\xed\x65\x45\x18\x2d\x11\x74\x75\x52\x0f\xfd\x61\xfc\x13\x90\xa0\
+\x3b\xdd\xe8\x8b\xa0\xf2\xd9\x74\x3c\x14\x6f\x1a\x88\x20\xe7\x9b\
+\x2b\x18\x2f\x0a\x50\x68\xa4\xa9\x71\x3c\xb2\x6c\x26\xc4\x27\x00\
+\x6d\xbc\x86\xb7\x8b\x0f\xc3\x1a\x17\x37\x25\x58\x51\x5c\x1f\x8d\
+\xa0\x60\x97\xb2\x78\xcd\x74\x66\xd9\xec\x49\xb8\xd4\x22\xe3\xa2\
+\x37\x64\x18\x96\xa8\xa7\xba\xe8\x80\xaa\x42\x1a\x81\x95\x03\xc3\
+\x10\xf4\xca\x2a\xf2\x8e\x36\x61\x1c\x4d\x9b\x40\x7f\xeb\x5a\x3a\
+\x68\x8a\xc3\x8c\xc9\xe9\x1c\x2a\x4e\x35\xe0\xe8\xfe\x0b\x2a\xaa\
+\x37\xb2\xc4\x5a\xf4\x75\x1e\xb1\x73\x27\xdc\x5b\xf3\x71\xb6\x29\
+\x82\xeb\x1d\x92\xb1\x89\x19\x72\x3a\x7f\x74\x84\x50\x9c\xed\x30\
+\x3c\xd5\xc1\xba\xb1\x0f\xcf\xb6\xe1\xd1\xe4\x18\x88\x02\x83\xb6\
+\x5e\x19\xba\x2f\x11\xfa\x91\x36\x8a\xc7\xac\x09\x02\x9c\xef\xd5\
+\x40\xeb\x96\xe7\x12\x76\x61\x99\x6b\xe9\x9a\xa9\xce\x59\xd3\x52\
+\x71\xf2\x52\x2f\x2c\xd4\x82\xa2\xd1\x2a\x19\x42\x68\xa0\x07\x9a\
+\x65\x37\xe1\xac\xa7\x0f\x41\xbf\x9f\x56\x11\x87\x64\x31\x16\x93\
+\x86\xa4\x4c\x8f\x96\x25\x04\x7d\x94\xfe\xd8\xe4\x18\x9c\x3e\xd7\
+\x8c\xef\x0f\x36\xb8\x09\x16\xee\x6d\x7e\xbf\xa4\x30\xa3\xc1\xa3\
+\xc0\xdc\x37\x68\xf4\xe4\xcd\xe0\x60\xbe\x13\xcc\x98\x20\x9a\x8c\
+\x27\xe9\x4f\xc7\x67\x75\x1e\xf4\x4a\xaa\xb1\xde\xd7\x13\x40\x41\
+\xd6\x03\xc6\x77\x3d\x7d\x6a\x2c\x90\x61\xd7\xb0\xfd\x9d\x9f\xae\
+\x11\x14\xee\xd6\x36\x1d\x58\x81\xff\x1a\x02\x10\x54\xc6\x50\xfa\
+\xe5\x86\x1f\x02\xc7\x0e\x00\xf4\xbc\x7f\x95\x9f\x4a\x3d\x36\x43\
+\x52\xa2\xe7\x32\x75\x5f\x2d\x18\xde\xac\x2f\x0e\x14\xa3\x0e\x91\
+\x69\xf4\x11\x46\x45\x7c\xa6\x05\x7b\xd6\x1e\x01\xe1\x57\x1e\xd2\
+\xde\xd8\xf6\x34\x6e\xd4\xf5\xc0\xc6\xb3\xa8\x6e\xf1\x81\xb0\xb4\
+\xb1\xba\x3c\x00\x7d\x42\x51\xa0\x86\x82\xa8\x78\x39\x0f\xf3\x52\
+\x62\x0d\x43\x3d\xd4\xf3\xcc\xbd\xa7\x8d\x35\x1d\x40\x18\xaa\xc7\
+\xf1\xb4\x71\x54\x03\x12\x94\x15\x24\x4d\xb6\xa0\x74\x4b\x0d\x48\
+\xcc\xa2\x8f\xb5\xe2\xdd\xaf\x20\xd0\x14\x46\xcd\x75\x3f\x24\x9f\
+\x07\x84\x0c\x7a\xaf\x8b\xa6\x29\x28\x5f\x36\x6b\x64\x40\x34\x44\
+\x03\xa2\x86\x83\x60\x2c\x36\xe4\x67\x8e\x86\x7d\xa2\x19\x65\x6b\
+\x4b\xe9\xfb\xfc\x2d\xda\x5b\x65\x1b\x51\x5e\xdb\x86\x50\x87\xd7\
+\x30\x76\x2f\x80\x9f\x02\xb2\x86\x02\x74\xa1\xd1\x6a\x52\x98\x1a\
+\xe4\x20\xd0\x02\x58\xf1\x64\x2a\x3e\x29\xde\x05\x62\x7e\xe6\x83\
+\xe6\x49\x9b\x96\x64\xdc\x6c\xe9\x02\x09\xa9\x23\x4e\xc4\x91\x00\
+\xd9\xfb\x7e\xa7\xb3\x49\xba\x5d\x4f\x95\x0d\x80\x66\x61\x91\x92\
+\x66\x47\xc3\xce\x6f\xaf\x91\x98\x25\xdb\x5c\xd6\x39\x33\x9c\x7c\
+\x92\x1d\x2a\x6d\x30\x3d\x8f\xc3\x00\x74\xe3\x77\x2b\x1e\x41\x6e\
+\xb2\xd5\x38\x4e\x3d\x45\x13\x47\x00\x0c\x14\x85\xc3\x02\xa9\xc3\
+\x87\xe0\x6f\xe7\xdd\x24\x6e\x79\x49\x1e\x93\xe0\x38\x21\xe6\xcf\
+\x84\xd4\x1e\x80\x16\x96\x46\x04\xfc\xf0\x52\x2e\xa6\x27\x58\xc0\
+\xd2\x8a\xd2\x1b\x2a\x7d\xcf\x99\x11\x01\x84\x16\x0a\x9f\x2c\xc2\
+\x57\x73\x0e\x6a\xa7\x77\x6e\x74\x16\x2d\x2f\x51\x6c\x4f\xcd\x66\
+\x58\xda\x40\x72\x60\x78\x14\x3a\xa0\xea\xc5\x5c\x3c\x3c\xea\xde\
+\x00\x4e\x8c\x81\x22\xcb\xf0\xff\x7c\x4a\x0d\x96\xbf\x19\x9d\xbf\
+\x71\xab\xdc\x39\x60\xd8\x8b\x8e\xc7\x73\x21\xf7\x86\xa0\xf4\x45\
+\x6e\x83\xdc\x17\x80\x56\x12\x6b\x11\xc0\xc5\x98\xe1\xfd\xf5\x0c\
+\xdd\xaf\x4c\x09\x1c\x70\xd6\x0f\xb4\x6e\xec\x9a\x52\x17\x9f\xe8\
+\x70\x8a\x53\xb3\x21\xf9\xfb\xa0\x84\x06\x21\x3a\xe0\xcb\xc5\x33\
+\x91\x14\x13\xbd\xd1\xda\xe9\xec\x59\x75\xec\x52\x14\xc0\x44\x9b\
+\x93\x35\x0b\xe0\x6d\x16\xf8\xfe\xbc\x0c\xc9\xe3\x75\xf7\xec\x5f\
+\x37\x38\xae\x6f\x89\x75\xc3\x17\x47\x78\x87\x63\xa9\x98\x3d\x9e\
+\xd6\x74\x04\x32\x85\x68\xb4\x73\xf5\xf2\x63\x04\x0b\xe6\x65\xa6\
+\xd0\x66\x64\x50\xf5\x57\x6b\x7f\x75\xa9\xb4\x29\x09\x38\x6a\x9c\
+\x31\x09\xf0\x5d\xfe\x1b\x92\xd7\x5b\x19\x74\xad\x1e\x7e\xe1\xdc\
+\x12\xdb\x6b\x07\x5d\xe0\x59\xa7\x98\x39\x91\x36\x8d\x00\x55\x52\
+\x68\xda\x02\xf4\xf0\xcc\x60\xad\x62\xbf\x96\x0a\xd9\xd7\x09\xce\
+\x62\xa5\xe3\x82\x36\x18\x4d\xa9\xaf\xf1\x2a\x9d\x78\x8a\xdb\xbf\
+\x7b\xe5\x5d\xae\xcc\x7e\x11\x37\x1f\xca\x51\x25\xa9\x8e\x13\xed\
+\x8c\x29\xc9\x01\x93\xd9\x6a\x54\x07\xfa\xef\x07\x7d\x96\x6b\x14\
+\x1c\xa6\x23\x24\xdc\xee\xa5\xb0\x6e\x95\xe1\xf9\x69\xbe\x1d\x2f\
+\xdc\xc7\xa5\x3f\x44\xec\x9b\xcb\xf3\x34\x16\x45\x34\x49\x05\xf4\
+\x3c\x32\x88\xc9\x1c\x4d\x4d\x38\xa4\xe7\x9e\x4e\x4a\x52\x4d\x14\
+\x1c\xee\xde\xb1\xfc\x8e\x7f\x5b\xfe\x07\x18\xed\x7e\x8c\x94\xe3\
+\xa5\x2c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\x60\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x06\x27\x49\x44\x41\x54\x78\xda\xb5\x95\x7b\x6c\x53\x55\
+\x1c\xc7\xbf\xb7\xb7\xdd\xda\x8d\xae\xa3\x6b\xb7\x76\x6c\xec\xd1\
+\x6d\xcc\x6d\x0c\x71\x63\x4a\xc0\x31\x1e\x3a\x5e\x63\x0b\x44\x32\
+\xc7\x4b\x74\x60\x10\xd4\x88\x68\x34\x22\x0c\x21\x26\x12\x27\x28\
+\x26\x60\x08\x26\x3a\xe6\x04\x41\x05\x22\xd0\x11\xc7\x30\x03\x2a\
+\xdb\x00\x81\xc1\x06\x74\xdd\x8b\xb5\xb4\x6b\x57\x6e\xbb\xde\xbe\
+\xee\xbd\x9e\xd5\x68\x34\x1b\xf2\x87\xf1\xa4\x69\x9a\xde\x73\xee\
+\xe7\x77\xbe\xbf\xef\xf7\x1c\x0a\xff\xf3\xa0\xfe\xfc\x51\x74\x6c\
+\x20\x5f\x2e\x13\x7d\x97\xa5\xa4\x93\xc5\x22\x0a\x41\x5e\xc0\x4d\
+\x07\xd7\xe5\x62\xf9\xe7\x1a\x4b\x55\x2d\xa3\x2d\x2e\x3b\x63\x3f\
+\x94\xab\x0a\x5b\xca\x43\x40\x30\x28\xe0\x57\x4b\xa0\xfa\x6c\x89\
+\x6a\xd3\x08\xc0\xb4\xa3\xd6\x8a\xf9\x69\xd2\xda\x25\xc9\x32\xf8\
+\x38\x01\xe4\x03\x8a\x3c\x09\x23\x5f\x3f\xf6\xb0\x38\x79\xd7\xbb\
+\xec\xfc\x92\xd8\x6f\xfe\xbe\x70\xfa\x51\xab\x7c\x51\x86\x8c\x59\
+\x90\x28\x0d\xcd\x3f\xd5\xc7\xe2\x94\xd1\x37\xb5\xb1\x4c\x6d\xf8\
+\x07\x60\xfa\x61\xcb\x98\x7c\xad\xc4\xb5\x36\x27\x0a\x56\x9f\x80\
+\xe1\xea\x59\x52\xbd\x94\x00\x86\x17\x46\x85\x51\xf8\xa6\x83\x81\
+\xa1\x37\x10\xd3\xb4\x54\xe3\xf8\x73\xe1\x9c\xef\xcd\x2d\x3b\x0b\
+\x95\x79\xae\x20\xd9\x2d\xd9\xc1\x47\x06\xa7\xbe\xbe\x2c\x6e\xee\
+\x08\x89\xa6\xd5\xf5\xef\xaf\x9e\xad\xac\x1c\x82\x08\x12\xf2\xf2\
+\x13\x77\x18\xb4\xf4\xf8\xaf\x2d\x78\x4c\x96\x9b\xaf\x8d\x00\x61\
+\xc1\xeb\xe3\xf0\x7e\x83\xfd\xf5\xd6\x55\x09\x9f\x0d\x2f\x2a\xa8\
+\xb9\x97\x5f\x9a\x1d\xd9\x3c\x27\x31\x12\x3e\x52\xc8\x69\xa3\x1b\
+\x0d\x46\x56\x61\xa8\x88\x67\x46\x00\xca\x4f\x5a\x98\x37\xa7\x28\
+\xe5\x0f\x88\x86\xbe\x00\x8f\x6d\x8d\xf6\xaf\x2e\xad\x4c\x78\x61\
+\x66\x5d\x5f\xc7\x7b\x45\xea\x0c\xf2\x7e\x48\x68\x0a\x9f\x34\x0d\
+\x34\x1f\x5f\x1c\x5f\x10\x92\xa7\xae\xf7\x52\xf5\x6c\xf5\x14\x37\
+\x4f\x61\xd0\x13\xc4\xc7\xe7\x9d\xb5\x86\x15\xe3\x96\x8f\xda\xe4\
+\x37\x1a\xad\xc2\xfc\xcc\x68\x52\x29\x69\xaa\x8d\x45\xcd\xc5\xc1\
+\xe2\xcb\x2f\xa7\xd4\x4f\xda\x6b\xda\xbc\xb3\x44\xb3\x9d\x17\x89\
+\x10\x2e\xa6\xb0\xb3\xc1\x6a\x3f\x5d\x9e\xa0\x7a\x62\x5f\x57\xfe\
+\xa2\xc7\xc7\x34\x17\x25\x47\x81\x23\xd5\xd7\x5e\x71\xe0\xfa\x3d\
+\x9f\xa2\xf9\xa5\x24\x66\x54\x40\xa5\xde\x2c\x2c\xcd\x55\x82\x27\
+\x5a\xb4\x0d\xb0\x38\xd8\x34\x58\x70\x65\x7d\x6a\x73\xee\xe7\xc6\
+\xaa\xea\xc5\xf1\x5b\xfd\xa4\xca\x61\xc0\x87\x7a\x0b\x1a\x56\x25\
+\x51\x4f\xed\xef\xbc\xf4\xd1\xc2\xf8\x29\x1e\x1e\x70\xb2\x01\xec\
+\x6a\xb0\xd6\x5e\x5a\xab\x1b\xb5\xfa\x10\x60\xf5\x49\x02\x98\x34\
+\x16\x1c\x01\x18\x1d\x5e\xec\xff\xd9\x56\x7c\x63\x63\x46\x7d\xd6\
+\xae\xdb\x9b\x77\x2d\x49\xd8\xee\x23\x46\x0b\x97\x50\xd8\x75\xc6\
+\x72\xae\x77\xc0\xbf\x76\x6d\x91\xb2\x23\x5b\x23\x27\x6d\x15\x50\
+\xd3\x3c\x80\x6b\xbd\x5e\xc5\xd5\x0d\x69\xcc\x43\x01\x65\x75\x26\
+\xa6\xb2\x50\x23\xf7\x0f\xdb\x33\xc8\xe3\x83\x63\x7d\x5f\x5d\x7f\
+\x23\xf3\x85\xa2\x03\x77\x3b\x36\xcf\x1d\x97\xe1\x21\x60\x11\x99\
+\xb8\xfd\x44\xdf\xb7\xac\x8f\x8f\xdb\x52\x36\x7e\x66\x37\x0b\xdc\
+\x1b\x64\x71\xae\xd5\xfe\x75\xeb\x6b\x19\xab\xfe\x35\x68\x53\x76\
+\xb7\xef\x7f\xab\x24\xa1\x52\x42\xd1\xc4\xa2\x40\x9b\x99\xc1\x17\
+\xfa\xfb\xfd\x8b\x0b\xd5\xf1\x4a\x95\x1c\xb6\x00\x09\xd0\x6f\x76\
+\x38\x2d\xee\x53\x13\xb3\xa2\xe7\xc5\x6a\xa3\xe0\x27\x9d\x37\x5c\
+\x30\x07\xb8\x40\x30\x83\x48\xfb\x81\x24\x8c\x5e\xa1\x51\x85\x83\
+\xf5\xf3\xb0\xd9\xbc\x26\xa2\xe8\xba\x1b\xef\xe6\xe8\x43\x80\xac\
+\x1d\x37\xc6\xe4\xa4\x45\xb8\x9e\x9e\x1c\x8b\x7b\x6e\x0e\x24\x0a\
+\x50\x49\x69\x38\xbc\x3c\xee\x13\xa1\xdd\x6e\x3f\x3a\x5a\x2d\x2d\
+\x24\xd9\x31\x15\x0b\x93\x53\x3a\x87\x04\x0c\x10\x33\x98\x6e\xda\
+\xbe\x16\xd3\xf4\xf3\xc5\xd3\xd4\x92\xb8\xd8\x08\xf4\xbb\x79\xe2\
+\x36\x20\x82\x98\xa5\xf9\x96\x1d\xa6\x4e\xf7\xa1\x5b\x5b\x72\xcb\
+\x43\x49\xce\xa8\xba\x52\x21\x91\x85\xd5\x8e\xcf\x54\x23\x2a\x3a\
+\x0c\x02\x99\x24\x22\xd6\xb4\x74\x33\xb0\x9a\x06\x89\x74\xc2\xe6\
+\xb4\x74\xc5\x8e\x98\xe4\xb1\xf0\x10\x70\xdb\x85\x1e\xa7\xdf\xc7\
+\xdb\x97\x2f\x4e\xd5\x75\xb8\x11\xea\x9f\x88\x64\x68\x78\xdd\xb0\
+\x59\x62\x22\x69\xdc\x6c\xb5\xc0\x66\xf5\x4c\xfe\xeb\x2c\xca\x7c\
+\xff\x72\x01\xc7\xf3\xdb\x24\x52\xf1\x5c\x02\xc3\x90\x7d\xc8\x49\
+\xd3\xa2\x4f\x3b\x76\xe4\x55\xa5\xbe\xd3\x6c\x2b\x5e\xa8\x53\xf5\
+\x7b\x05\x58\xbb\xdd\xb0\xdd\xb5\x1a\x75\x99\x4a\x9d\x22\x69\x2c\
+\x7c\x24\x3f\xe6\x3b\x4e\x38\x7a\xec\xd7\xc2\x23\x65\xb9\x69\x79\
+\x5a\x08\x62\x80\x26\x3d\xbd\xf1\x4b\xf7\x11\x0a\x8f\x18\xba\x37\
+\x2f\x96\x67\x4e\x8a\xab\x13\x69\xa2\x10\x08\x02\xc6\x5f\x8c\x2c\
+\xe7\xe3\x8e\x14\x96\xa4\xaf\xb0\xb0\x14\xc4\x62\x1a\xb7\xce\xb4\
+\xdb\x8d\x1f\x4f\x55\xa5\xbd\x7d\xb1\x5a\x9d\xa5\xdd\x38\x36\x56\
+\x0e\x8a\x28\x70\xa7\xc9\x84\x47\x02\xd2\x37\x5d\x70\x16\x96\x65\
+\x2a\x8c\x83\x1c\x1e\x74\x0d\x82\x31\xd9\x36\x11\x19\x4a\x0a\x4a\
+\xb3\x67\xdc\x67\x02\xf0\x31\x7e\xdc\xbf\xd2\x5d\xd3\xf9\xc9\xb4\
+\x95\xa9\x1b\xcf\xe7\x69\x26\xc4\xb5\x84\x6b\x15\xa0\x88\x64\xe6\
+\xd6\xde\x7f\x07\x24\xbf\x7a\x6e\x5b\x76\x41\xc2\x16\x97\x5c\x4e\
+\x8e\x63\x1e\xe6\xa6\xbb\x30\xed\x9e\x4e\xa5\xac\x6f\xbc\xa0\x5b\
+\x30\x71\x2a\xeb\x21\x00\x97\x0f\x8e\xcb\x5d\x5b\x3a\xf7\xcc\xd8\
+\x9e\xf2\xea\xb9\x27\x13\x73\xb4\x06\x4e\xf5\x07\xc0\xfa\x28\x40\
+\xca\x86\xb3\x42\x5e\x59\x0e\xee\x38\x82\xf0\x93\x66\xb3\x5d\x96\
+\xd7\xba\xf6\xce\xda\x93\xf4\xf2\xcf\x06\xe5\x33\xd9\x4f\x92\xee\
+\x82\x73\xfa\xc1\x5c\xed\xac\x21\xff\xaf\x4c\x5a\xd7\x90\x37\x2e\
+\x3b\xbe\xc5\xa3\x56\x84\x9a\xce\xb4\x76\x3f\x1c\x90\xb8\xa6\xbe\
+\x6a\x42\x41\xd2\x56\x73\xa4\x3c\xe4\x0c\x4f\x53\xfb\x83\xee\x7d\
+\xb3\xa3\x87\x9f\x8d\xaf\xd4\x9f\x8e\x9a\x9a\x59\xcc\x4b\xc5\x44\
+\x6b\x1a\xae\xfa\xab\xf6\x9e\x2f\xe7\xaa\x12\x2b\xf5\xd5\x9a\x02\
+\xdd\x46\x77\x64\x04\x28\x12\xaa\xa1\xb3\x6d\xa6\x87\x02\x92\xd6\
+\xe8\x85\xf8\x79\xb9\xb0\x30\x41\x70\xed\x66\xf0\x56\xfb\xb2\xbe\
+\x2f\xe7\x85\x2e\x9d\xc4\x17\x4f\x2d\x17\x25\x8d\xab\xa1\x89\x8b\
+\x42\x61\x32\xda\xc0\x9a\xfa\xfb\xe5\x6a\x45\x7c\xcc\x74\x1d\xfa\
+\x19\x0e\x82\xd5\x05\xbe\xbd\xeb\xc0\xa8\x00\xcd\xca\x9f\xaa\x12\
+\xf2\x92\xb7\xf6\xcb\xe4\x10\xf9\x39\x70\x86\xb6\x07\xe6\x83\x0b\
+\xa3\xff\x3e\x47\xbb\xfa\x34\x43\x3f\x9e\x2e\x47\x84\x24\x74\xfb\
+\x4d\x4a\x8d\x80\xc3\x15\x84\xc9\xe2\x0f\x1d\x2d\x68\xed\x00\xb1\
+\x5d\xd4\x08\x40\x6c\xc5\x71\x4a\x2a\x97\xf1\x11\xb3\xb2\x60\x1b\
+\x14\x40\xb7\x77\x41\x64\xb3\x2f\xb3\xd4\x96\xfe\xe3\xca\xd4\xae\
+\x38\x91\x42\x42\xdf\xc9\x4d\x4c\x87\x20\x8f\x0c\xc9\x48\x11\x92\
+\xc8\xed\x06\x7d\xbb\x0f\x94\x97\x5d\x6e\x3e\xb8\xa8\x76\x04\x40\
+\x5d\xfe\xc3\x8c\x30\xb9\xb4\xd1\xcb\x89\x49\xa3\xc8\xf6\x19\xa6\
+\xcf\x7a\x78\x49\xe2\x68\x3b\x8d\x7d\xfe\x98\x82\xd8\xeb\xb0\x10\
+\x26\x79\x16\x52\x19\x10\xe4\x40\x79\xdc\x7a\x88\x25\xaf\x58\xeb\
+\x4a\x3b\x43\xf2\x3d\x2a\x07\xff\x75\xfc\x0e\xcb\xb2\xdb\xdf\xee\
+\x48\xf6\x4f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x28\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xef\x49\x44\x41\x54\x78\xda\xb5\x55\x5b\x6c\x14\x65\
+\x14\xfe\xfe\xbd\x5f\x59\xba\xbd\xb0\xd0\x46\x2e\x5b\xda\x95\x76\
+\x0b\x0a\xb5\x50\x79\x31\x5a\x62\x54\x68\x14\x4d\x80\x37\x4d\xd1\
+\x10\x8b\xc1\xc4\xa8\x21\x04\x34\xbe\xa8\x0f\x2a\x2a\x89\x0f\x98\
+\xa8\x51\x6c\x34\xfa\xe0\x03\xa0\x56\x25\x01\xe9\x85\x02\x0f\x60\
+\x70\x5b\x4a\x0b\x52\xb1\x4b\xb7\xbb\xdb\xdd\xd9\x99\x9d\xcb\x3f\
+\x9e\x7f\x0a\xba\x6a\x2b\x4a\x74\x92\x93\xb3\x73\x66\xe7\xfb\xce\
+\xf9\xce\xf9\xcf\x30\xfc\xcf\x17\x2b\xbd\x59\xbd\xe6\xce\x77\xc9\
+\x3d\x46\x96\x25\x4b\xf5\xf6\x7c\x1f\xfd\xcf\x08\x08\xbc\x8e\x5c\
+\x82\x40\xad\xd8\x1d\x2d\xad\x5f\xd8\x6c\xac\x82\xee\x5b\x5b\x56\
+\xb7\x86\x4d\xd3\x6c\xe8\xef\xeb\x39\x7a\xd3\x04\x04\xb8\x93\x73\
+\x33\x30\x70\xa2\x67\xe7\xf5\x18\x01\x8f\x19\x86\x7e\x30\x10\x08\
+\x76\x94\x95\x95\x63\x6c\xec\xd2\x8e\xfe\xbe\xde\xbd\x37\x45\x50\
+\x73\x4b\xd3\x33\x8b\x16\x86\xa3\xc7\x8e\x1e\xd9\x26\xee\xeb\x63\
+\x2b\x6a\x7c\x3e\xc7\x97\x2d\x2d\x6b\x96\xc5\x62\x75\x48\xa7\x33\
+\x38\x7c\xf8\x10\xfa\x7a\x8f\xb3\x7f\x4d\xa0\xab\x5d\xed\x4a\xe1\
+\x62\xdd\xb7\xdf\x25\x5e\x5d\xff\x40\xeb\x66\xe6\xec\xe8\x6a\x8c\
+\xaf\x36\x37\x3e\x78\x1f\xe4\x62\x11\xc9\x89\x09\x64\xd3\x29\x04\
+\x03\x01\x9c\x39\x7b\xb6\x87\x5e\x39\x48\x92\x39\x18\x63\xb0\xd9\
+\x6c\x4e\xf2\xfb\x07\x4e\xf4\x8d\xcc\x48\xa0\xca\x9f\x2e\xe1\xfc\
+\xf8\x27\xcc\x3c\xd2\xc8\x90\x71\x73\x73\x4e\xd2\x1d\x78\x64\xff\
+\xca\xe6\x83\x1d\xa1\xa0\xaf\xca\x1f\xf0\x43\xd3\x74\xa4\x52\x57\
+\xe1\xf7\x07\xd1\xdc\xdc\x8c\x48\x24\x82\x48\x75\x35\x52\xc9\xa4\
+\x15\x1f\x1e\x19\xc5\x50\x22\x21\x71\xc3\x78\x7c\x60\xa0\xff\xc0\
+\x1f\x08\x8a\x85\xbd\xbb\xb8\xfe\xde\x6e\x64\x07\x9d\x6c\x9c\xc1\
+\xac\xe2\xf0\x54\xaf\xc2\xb3\xcf\x2f\xb8\xe7\xeb\xee\x91\x6e\x97\
+\x93\xc1\xe1\x70\xe0\xa1\x8d\x1b\x11\x8d\xd6\x22\x27\xe5\x51\x90\
+\x0a\xc8\xe7\xf2\x90\x55\x15\x8c\x1b\x70\x38\x9d\xf0\xb8\x5d\x24\
+\x5f\x2f\x06\x07\x07\xbb\x4f\x9e\x3c\xd1\x56\x42\xf0\xd6\x73\xba\
+\xfe\xfa\xcb\xf6\xf3\x49\xd8\x13\x2e\x18\x0d\x2a\xcc\xc5\xf3\xb9\
+\x27\xf0\xc4\xda\x58\xec\xc0\x96\x48\x24\xd4\xd9\xb1\x75\x2b\x72\
+\x79\x09\x99\xa9\x3c\x82\x3e\x1f\x5c\x1e\x37\x0a\x05\x41\x92\x43\
+\x6e\x6a\x0a\x53\xe4\xe5\x82\x8c\xf9\xf3\xe7\x21\x9b\xc9\xa2\xaf\
+\xaf\x67\xec\xd4\xa9\x81\x1a\x8b\x40\x91\xde\xd8\x6e\xf2\x0f\xb7\
+\x61\xea\xdc\xad\x2c\x0d\xf0\x72\x06\x67\x68\xd5\x50\x36\xb7\x61\
+\xcb\x5d\x77\x77\xf5\x77\x76\x6e\x65\x63\xe3\x49\x98\x86\x81\x70\
+\x45\x05\xaa\x2a\x2b\xe0\xf1\x78\x90\x97\x24\x4c\x4e\xa4\x70\x55\
+\xf4\x27\x9b\x85\x54\xc8\x21\x9f\xcf\x23\xe0\x23\x49\x55\x1d\xe7\
+\xce\xfd\xb0\x8f\x48\x3a\xa9\x07\x9f\x57\x72\xe3\xf4\x76\xd3\x3c\
+\xf6\x14\xc7\x65\xd5\xce\xaa\x25\xb7\x7f\xfd\x8e\x78\xfc\xc0\xa3\
+\x1b\xda\xd7\xb7\xeb\x24\x43\x51\x53\x11\x0a\x85\x50\x51\x59\x89\
+\xaa\xaa\x4a\x04\xa8\xd9\x0a\x55\x90\xa4\x1e\xfc\xfc\xcb\x38\xd2\
+\x93\x93\x90\x84\x74\x14\x2b\x14\x24\xf8\xa9\xca\x49\x8a\xa5\xd3\
+\x69\x9f\x35\x45\xaa\xfc\x51\x35\xe7\xe9\x85\x60\x72\x85\xdb\x1d\
+\xfa\xf1\x83\xf7\x4f\x5f\x78\x73\xdf\x19\xed\xfe\x0d\xeb\x70\x69\
+\xf4\x32\x82\xc1\x80\x05\x5a\x56\x1e\x46\xa4\x6a\x1e\x42\x73\x83\
+\x90\x15\x15\xe3\x57\xae\x60\x7c\xfc\x0a\x32\x99\x0c\xc9\x24\x41\
+\x91\x0b\x50\x14\xc5\x22\x9a\x4b\x09\x8d\x8e\x8e\xbe\x32\xe3\x4c\
+\x57\xd7\xc4\xee\x6d\x5b\xb7\xf6\x90\x56\xd4\x60\xb3\x33\x78\xa9\
+\x6c\x9f\xd7\x87\x39\xf4\x52\x59\xb8\x8c\x7e\x7b\x49\x06\x95\x32\
+\x4f\x63\x22\x95\xc2\x14\xf5\x41\x51\x08\x9c\x46\x5a\x91\x15\x22\
+\x97\x61\xa3\x13\xa0\x28\xf2\xc5\x19\x09\xe2\x8d\xcb\x5f\x5a\x71\
+\xfb\x6d\xbb\x72\xa4\xa9\xdb\xed\xa1\x09\x71\xc3\xe5\x72\xc3\x4b\
+\xc0\x7e\xbf\x97\xa6\xca\x09\x5d\x37\xac\x4c\xa5\x02\x4d\x53\x41\
+\x41\xb1\x28\x93\x15\x51\x54\x94\x69\x4f\xa6\x8a\x29\x9b\x89\x60\
+\x79\x7c\xf9\x0b\x4b\xeb\x63\x7b\x44\x26\x2e\x0b\xdc\x05\x27\x8d\
+\xa2\x93\x80\xed\x64\x0e\x1b\x83\x61\x72\xe8\xd4\x9b\x62\xd1\x20\
+\x20\xd9\x02\xb3\x40\x35\x0d\x1a\x79\x8d\xbc\x4a\x7e\x46\x82\xa6\
+\xc6\xa6\x17\x49\xef\xdd\x22\x7b\x07\x81\xbb\x9c\x2e\xca\xda\x4e\
+\xe0\x0e\xd8\x6d\x36\xeb\x3f\xdc\x34\x61\x50\x15\xba\xa1\x13\x91\
+\x66\x49\x66\x81\x0a\xaf\x4f\xc7\x66\xad\x20\x1e\x6f\x7a\x3a\x1c\
+\x2e\x7f\x8d\x31\x1b\x65\xee\x98\xce\x9a\x08\x68\x2d\xc0\x46\x31\
+\xd0\x8a\xa0\x55\x01\x4e\x87\xcc\x22\xd1\x89\x80\xc6\x58\x4c\x9c\
+\x2e\xc0\xaf\x99\xa1\xcd\x42\xd0\xd0\xd0\xb8\x84\x74\x1e\x0e\x06\
+\x83\x16\xa8\xdd\x2e\x48\xa6\x09\xc4\xfe\x11\x2f\x99\x24\x11\x37\
+\xa9\x12\x01\x6c\x70\x22\xd2\xc8\x0b\x42\x02\x16\x31\xf2\xf4\xec\
+\x9b\x59\x37\xe3\xb2\x65\x8d\x12\x11\xf8\xac\xac\x4b\x4c\x54\x25\
+\x2e\x53\x18\x55\xc0\x39\xb7\x4c\x80\x96\x9a\x20\xa6\xf8\xc3\xb3\
+\x12\xc4\xea\x63\x6d\xd4\xdc\xaf\xdc\x1e\x2f\xae\x6d\x4d\xcb\x0b\
+\x79\xa6\x19\x4c\x4b\xa6\x69\xa9\x7e\x27\xe1\xd7\x48\xa9\x27\x72\
+\x62\x30\xe1\xfb\xdb\xdd\x5e\xb7\xb4\xee\x63\x6a\xf4\x26\xb1\xcc\
+\x7e\x23\x28\xb9\x4a\x09\x0c\x92\x89\x81\x5b\x71\xa5\xa8\xd0\x6f\
+\xb6\x92\x08\x4e\xdd\xf0\xe3\x51\x1b\xad\x1d\xa3\x33\xb0\xc0\xe1\
+\x72\x80\x99\x25\x15\x88\x49\xa2\x26\x30\xc6\x45\x31\x16\xb9\x20\
+\x53\x64\x59\xe8\xb7\x79\x68\x78\xa8\xcb\x5a\x76\x37\x22\x10\x57\
+\x74\x49\xf4\x6d\xaa\xe0\x49\x27\x9d\x09\x87\xdd\xfe\x97\xe7\x02\
+\x58\x8c\x24\x8d\xa6\x4c\x44\xf5\xe7\x87\xcf\xff\x74\xfd\xd9\x3f\
+\xfe\xfc\x45\x17\x2d\xf6\x52\xa2\x7b\x28\xd5\x4d\x04\xb2\x50\x7c\
+\x23\xac\x46\x0a\x89\x0c\xa3\x9b\x62\xef\x5c\x18\x1d\xf9\xec\xcf\
+\xef\xfd\x0a\xdd\x4a\xa9\xd9\xd3\xee\x61\x30\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xa6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x6d\x49\x44\x41\x54\x78\xda\xed\x55\x5f\x6c\x14\x45\
+\x1c\xfe\xe6\x2a\x57\xe1\x90\xd6\xf4\xb4\x74\xcf\x82\xb6\x80\xa4\
+\x4d\xab\x91\x77\x12\x1e\xaa\x0f\x7d\x80\x07\x03\xd5\x50\x4d\xac\
+\x85\x34\x31\x21\xf2\x40\x34\x31\x06\x79\x30\x21\xa9\x3c\x18\x8d\
+\x2f\x62\x08\x3e\xa8\x2f\x0a\x21\xfc\x49\x8f\x52\x48\xff\x41\x4a\
+\x4b\xe9\xd9\xa6\x42\x20\x15\xd9\xbd\xf4\xb0\x94\xeb\xf5\x76\x76\
+\x76\x76\x77\xfc\xcd\x1d\x26\x1a\xb7\xad\x18\x79\x21\x4c\xf2\xcb\
+\xee\xcc\xfc\xe6\xfb\xbe\xdf\x37\x33\xbb\x0c\x0f\xb9\xb1\x47\x9f\
+\xa0\xe6\xe3\xe1\xe4\xcd\x03\x9b\x9a\xc2\xe6\x2a\xde\x38\x9e\x9c\
+\xf9\x6e\x6b\xd3\x62\xeb\x17\x25\x78\xee\xa3\xab\xdf\x3f\xbf\x66\
+\xc5\x8e\xbe\x5d\xeb\x43\xf3\xaa\x3b\x7a\xd4\x5c\x3a\xf3\x43\xf6\
+\xd8\x8e\x96\x07\x26\x58\x77\x70\x62\xac\xf3\xad\x17\x1b\xfa\xae\
+\xcf\xa2\x73\x73\x3c\x34\xaf\xee\x60\x4a\xad\xa8\x2c\xc3\xb5\x9f\
+\x06\x52\x73\xc7\x5b\x1a\xff\x35\xc1\xba\xce\x49\xf3\xf3\xd6\xf5\
+\x86\x2a\x89\xa0\xf3\xec\x6f\xe8\x69\x59\x13\x9a\xb7\xe1\xc0\xa8\
+\x8a\xd7\x57\xe1\xde\xb4\x8d\x5b\x27\xfa\xac\xf9\xd3\xad\x89\x25\
+\x09\x36\x1e\xba\x6e\x1e\xda\x59\x6b\x08\x9a\xea\xbd\xe3\x61\x68\
+\x24\x8d\xa9\xf1\xcc\x82\x36\xc6\xeb\x57\x43\x3a\x1e\xb2\xb3\x2e\
+\x7e\x3f\xdb\x6b\xf1\xae\xb6\xc4\x82\x04\x75\x5f\xde\x30\x3f\x7b\
+\xfd\x05\xc3\xd1\xe0\xd3\x12\x5e\x10\xa0\xd9\x88\x22\xbe\x9c\x41\
+\xfa\xa0\x3e\x20\x28\x5c\x0a\x8f\x3a\xbf\xdc\xe3\x38\xdc\x3f\x03\
+\x57\x78\x70\xfc\x00\xb9\xbb\x36\xf8\xf9\x01\x4b\x5e\xe8\x48\xfc\
+\x8d\xa0\xfe\xeb\xdb\xa5\xb1\x28\xbb\xb1\xbf\xc9\x48\xc8\x08\xd0\
+\x9b\xf1\x68\x34\x80\x70\x15\x96\x53\x9f\xa8\x20\x1c\x1f\x8e\x4b\
+\x04\x52\xc2\x91\x0a\xb6\xeb\x21\xc7\x7d\x64\x66\x04\x8d\x2b\xe4\
+\x5d\x49\x73\x01\x38\x91\x06\xc3\x23\xa6\xe2\xf3\xb5\xb8\xb8\x57\
+\xb0\x97\x8e\x5a\xf1\xb2\x18\xbb\xf3\xc5\xab\xab\x31\x36\x07\x5c\
+\xcd\x7a\x88\x28\x05\x49\x0a\x1d\x59\x24\xd1\x0b\xf3\x64\x83\xeb\
+\xf9\xe0\x24\xdf\x11\x7e\x31\x6c\x52\x4e\xa5\xd9\x42\xc2\x76\x28\
+\x97\xc6\x84\xef\x83\x45\x22\x50\x83\x17\x01\xce\x9f\x61\x75\xdf\
+\x58\xea\xc7\x37\xab\xd0\x9d\x06\x7e\xe5\x04\x4e\xda\x3d\x2a\x57\
+\x78\xaa\x00\xe2\xea\x77\xad\x9e\x08\xb9\x4b\x04\x9c\x08\x48\xbd\
+\xa3\x6d\x21\x50\x9b\x9e\xb6\xa3\x89\x74\xdf\x87\x22\x71\x88\x90\
+\x31\xd1\x28\xd4\xa9\x33\x60\x0d\x47\x6e\x6f\x7d\x65\x6d\xec\x58\
+\xeb\xcb\xe5\xe8\x4a\x7b\x08\x7c\x45\x41\x0b\x49\xb5\x77\xdf\x0a\
+\x87\x80\x85\x5b\x24\xd0\xe0\xdc\x51\x70\xb9\x44\x5e\xab\x77\x74\
+\x9f\x88\x89\x48\x0b\x63\x8c\xc0\x4b\x09\x7c\x24\x05\x64\xac\x6d\
+\xac\xb8\xb9\x53\x0d\x15\xab\x22\x63\xfb\x5e\xab\xc6\x39\xcb\x85\
+\xd0\x16\xe9\x72\xbd\xa2\x7a\xbb\x60\x95\xb6\x42\xdb\x50\x54\x5f\
+\x00\xa6\x1c\xae\x9f\x5a\x80\xde\xa0\x48\x09\x05\xd9\x33\xa0\xed\
+\x99\x6f\xa4\x3d\x48\xb1\xbf\x1c\x4f\xa3\xbc\xfc\x09\xf3\x83\xe6\
+\xb5\xe8\xba\xe5\x14\xd4\x49\xa1\x4f\x0c\x01\x06\xac\x00\x5a\x00\
+\xd4\xc1\x35\x81\xc2\x3c\xe7\x10\x79\x59\x18\xa3\xc2\x01\xba\x37\
+\xac\xff\x12\x14\xcf\x25\x08\xdc\xfa\xc7\x31\xad\xfd\x74\xc2\xa8\
+\xa8\x88\x9a\xef\x51\x25\x49\x53\x42\xd2\x26\x4e\x4c\x64\x30\xf5\
+\xb3\xb9\xe0\x3d\x10\x46\x25\x55\xe7\x82\x05\x3e\x4a\x2e\xa7\xe0\
+\xdb\xd9\x84\x1a\xdc\x63\x2d\x7a\x93\x6b\xf6\x8f\x9a\x7b\xb7\x6f\
+\x30\x2e\x58\x02\x93\xe3\xd3\x48\xed\xd9\x18\x9a\xb7\xb2\xbd\x5b\
+\xe5\x8d\x67\xc1\x72\x1c\xcb\xae\x5c\xb1\x44\xcf\xee\xa5\x6f\xf2\
+\x9f\xad\xfa\xc3\x21\xf3\x93\x77\xea\x8d\xc3\xe7\xd3\xe8\x6f\xaf\
+\x0d\xcd\x7b\xf2\xdd\x6e\x25\x9e\x2e\x47\xe9\xf0\xa8\xe5\x9c\x6b\
+\x4b\x84\xe5\x2c\xfa\x35\x4d\xbc\x3f\x38\x56\x59\x15\x6b\x18\xd9\
+\xd7\x18\x9a\x17\x6b\x39\xa1\x90\xbd\x9b\xca\x9f\x7e\xbb\x71\x21\
+\x8c\x25\xff\x07\x55\x1d\x3d\xc9\xf4\x57\x5b\x42\xbf\xf9\x4f\x35\
+\x7f\x9b\xcc\x9d\x6c\xfd\xef\xff\x83\xff\xa3\x3d\x26\x58\xb2\xfd\
+\x01\x59\x54\x12\xee\xf0\x3d\x86\x03\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x03\xe9\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xb0\x49\x44\x41\x54\x78\xda\xad\x95\x6b\x6c\x14\x55\
+\x14\xc7\xff\x33\xbb\xf3\xd8\x4e\xbb\x90\x92\x7e\x30\x71\xbb\xdd\
+\xbe\xb1\x3c\x5c\xdb\x2f\x20\xa5\x8d\x34\x10\x1a\x1e\x35\x52\x32\
+\x35\x8d\x42\x49\x14\x9b\x48\x30\x12\x3f\x60\x30\x10\x13\x85\x8a\
+\xd5\x8d\xac\x48\x70\xc5\x40\xf0\x5e\x52\x44\x0d\x86\x2f\x24\x24\
+\x24\xab\x51\x7c\xf0\x30\xda\x48\x4c\x08\x6e\x84\x18\x09\xa0\x2c\
+\x6c\x77\x3a\x0f\xcf\x9d\x55\x2b\x95\x42\x5b\xfb\x4f\x6e\xe6\xce\
+\xcc\x99\xf3\xbb\xff\x73\xee\xcd\x48\x18\xa5\x86\xa3\x7a\xaa\x29\
+\xf2\x40\xcf\x57\x17\x07\xdf\xfb\x61\x65\x6e\x1d\xfe\xa7\xa4\x7f\
+\xdf\xd4\x7f\xa2\xb2\x6d\xed\xcf\x98\x91\xe0\x75\x64\xec\xe9\xd8\
+\x32\xb0\x9b\x9f\x7f\xdc\xea\x9a\x12\x40\x21\x79\xaf\xa9\x04\x4f\
+\xe3\xfb\xec\x49\x84\xa4\x30\x22\xda\x5a\x6c\x3a\x90\xe4\x99\x1e\
+\x7b\xd2\x10\x1f\x50\xff\x11\x25\x5f\xd6\x6b\xaa\xc1\xaf\xf1\x45\
+\xfa\x17\x64\x7f\x2a\x43\xd9\xe2\xf3\xd0\x4b\x3c\xc4\x42\x6b\xb0\
+\x71\xef\x2e\x7e\xb9\xd7\x99\x14\x44\x9a\xf5\xb1\x9e\xda\xb2\x74\
+\x7d\x8f\xa2\x9e\xc6\x97\xe9\x9f\xb1\xa3\xf9\x82\x0f\x9d\xd7\xd8\
+\xe6\x2c\x49\x7f\x2e\xbb\xb7\x42\x68\x08\x77\x63\x7d\x22\xc1\xaf\
+\x6d\xc2\x84\x21\xd2\x93\xdf\x36\x7a\x9d\xf1\x52\x9c\xcd\x9e\xc0\
+\xa5\xc3\x8d\x48\xae\x3d\xe5\x03\xa2\xa5\x73\x07\xd6\x64\x2e\xac\
+\xba\x79\x55\x82\xaa\x6a\x98\x5b\xda\x85\xa7\x5e\x4b\xf0\xdf\x37\
+\x4f\x0c\x22\xd5\xb1\xa2\x54\xcb\x6c\xf4\x54\x46\x65\xdc\xba\xae\
+\xe0\x78\x47\x93\x73\x29\x73\x25\x1d\x59\xfa\x5b\xcb\xc2\x37\x6e\
+\x60\x28\x2b\xc1\x72\x5c\xe8\xaa\x8e\x5a\xf7\x09\x6c\x48\xed\xe4\
+\x43\x5b\xc7\x0f\xf1\x57\x1b\xdb\x57\xc4\x16\x35\x05\xcc\x68\x54\
+\x82\x1d\x70\xe0\x21\x80\x7c\x9e\xe6\x37\x81\xbc\x43\x21\x9e\x8c\
+\x61\x82\xa8\x04\xa9\xf7\x4c\x6c\xd8\xfd\x26\x77\xb6\x8f\x0f\xf2\
+\xcf\x2e\xba\x7f\x57\x88\xb5\xcc\x0f\x9a\xb1\x48\x10\x39\xcb\x03\
+\x1c\xc0\x72\x65\x38\x34\x75\x5d\x1a\x14\x63\xd3\x44\x09\x14\x91\
+\x93\x4e\x3c\xff\x76\x82\xa3\xff\xde\x90\xdb\xce\x41\xd9\xeb\x2a\
+\x7b\x64\x9e\x6e\x96\x97\xcb\xb4\x72\x99\x12\x16\x92\x3b\xe2\x4a\
+\x2e\xc4\xd5\x21\x94\x22\x9c\x58\x8f\xe2\x85\x64\x92\xe3\xad\xbb\
+\x43\xa4\xd1\x0f\x66\xbc\x12\x64\xf3\x9b\x8b\xcc\xca\x98\x02\x8b\
+\x9c\xd8\xe4\xc4\xa6\xe4\xc2\x42\xde\x2d\xc4\x38\x44\x56\x74\x1d\
+\x33\x9d\x15\x78\xb1\xff\x1d\x8e\xbd\x63\x43\xa4\x3b\x3d\x2c\xde\
+\x16\x60\x0b\x9a\x0d\xb3\xb2\x52\x41\x6e\x58\xf2\xcb\xe5\x27\x77\
+\x0a\xa5\x12\x65\x13\xb3\xa0\xa2\xa3\xce\x5e\x8e\xad\xfd\x7b\x38\
+\xf6\xdd\x19\x22\x8d\x45\xd6\x36\x83\x2d\x68\x0d\x9b\x15\x55\x1a\
+\x86\xc8\x89\x67\x0b\x27\xd4\x6f\xfc\xdd\x13\x09\x2e\x91\x34\x4d\
+\x45\xd5\x70\x3b\x5e\xdd\xf9\x2e\xc7\xc1\xff\x42\xc6\x04\x08\xc9\
+\xcf\x81\x35\x2f\x22\x48\xb5\x46\x4e\x08\xe2\x8d\x24\xf7\x5c\x8f\
+\xfa\x42\x50\x8a\xd3\x09\x52\x6d\x2d\x46\xdf\x8e\xf7\x39\x0e\xdd\
+\x0e\xb9\x2b\xc0\xd7\xb3\x60\x0f\xb7\x85\xcd\x68\xad\xe6\xf7\xc4\
+\xa1\x6d\x4b\x28\x3f\xb9\x23\x5c\x08\x47\xe4\x44\x40\x2a\xf2\x6d\
+\x48\xf4\xed\xe7\x38\x3c\x02\xb9\x37\x40\xe8\x69\xb0\xa6\x25\x86\
+\x19\xab\x29\x86\x4d\x5d\x17\xbb\xc9\xa2\x4f\x25\x77\xa4\x64\x1e\
+\xd9\xd3\x42\x2a\xa2\xb9\x56\x24\xfb\x3e\xe0\x38\x52\x80\x8c\x0f\
+\x20\xb4\x0e\x2c\xde\x6e\x98\xe5\x35\x06\x2c\xbb\x70\x4e\x44\x72\
+\x51\x36\x04\x08\x26\xf6\x02\xd9\x52\x54\x15\xb1\x1b\x0b\x91\xdc\
+\xce\x38\x8e\xa2\x6b\xfc\x00\xa1\x6e\xb0\x39\x2b\x0c\xb3\xa2\xd6\
+\xc0\xb0\x2d\xca\x45\x2b\x54\x24\x9c\x3a\x76\xc5\x3f\xe9\x25\xd3\
+\x83\x98\x76\x9f\x8e\x92\xb0\x8a\x87\x66\xb4\x62\x4f\xdf\x91\x03\
+\x13\x03\x08\x75\x81\x35\xac\x34\xa8\x27\x05\x27\x81\x80\x8c\xcf\
+\x3e\xfd\x15\xd9\xef\xb0\x1c\x32\x32\xe4\xac\x93\xa2\x86\x68\x3c\
+\x06\xd5\x37\x36\x09\xad\x06\xab\xeb\x20\x27\xf5\x86\x5f\xa7\x73\
+\xe9\xab\xb8\x9c\xb6\xe3\x18\xc0\x99\xd1\xa1\x93\x03\x08\x75\x82\
+\xd5\x2c\x33\xcc\xaa\x78\x31\x2e\xfe\x98\xc3\x20\xff\x63\x23\x3e\
+\x44\x62\xea\x00\x42\x1d\x60\xd5\xab\x0c\x73\x5a\xa9\x8a\x6f\x52\
+\xd7\x5e\x22\xc0\xcb\x53\x0b\xf8\x0b\x32\xb3\xbb\xd8\x1c\x3c\x94\
+\x3d\x43\x25\x8a\x4f\x3d\x40\x68\x35\xf6\xd3\x2f\x64\x0e\x18\x1e\
+\x1c\xfd\xea\x4f\x0b\x82\x72\x48\x51\x5a\x84\xbe\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x5f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x26\x49\x44\x41\x54\x78\xda\xd5\x95\x6d\x4c\x5b\x55\
+\x18\xc7\xff\xa7\x2f\x56\x46\x20\x82\x85\xb6\x40\xc8\x3a\x66\x16\
+\xd1\x0f\x86\x19\xbf\x90\x4d\x53\x12\xed\xca\x8b\x26\xa0\x10\xf9\
+\x80\x09\x49\x3f\x20\x99\x18\x31\x11\x33\xc1\xe0\x5c\xbf\x2c\x53\
+\xf6\x81\x08\x0c\xc4\xc0\x40\xb0\x24\xd0\x0c\x3e\xf9\x12\x63\x42\
+\x42\xdd\x06\xc9\x9c\xbc\x8c\xb6\xf2\x12\xa0\x2f\x2b\x42\x4b\xdf\
+\x6e\xdb\xe3\x39\x17\xc7\x82\x1d\x92\x48\xf6\xc1\x93\xdc\xdc\x93\
+\x7b\xef\x39\xbf\xf3\xfc\x9f\xff\xf3\x5c\x82\xc7\x3c\xc8\x63\x07\
+\x74\x76\x76\x5a\x54\x2a\x55\xa9\x20\x08\x20\xe4\x21\x8f\xcf\x3d\
+\x1e\x8f\xd9\x68\x34\xbe\x79\x24\xc0\xe8\xe8\x28\x95\xcb\xe5\xf0\
+\xf9\x7c\x09\x80\x78\x3c\x8e\xaa\xaa\xaa\x23\x45\x49\xcc\x66\x33\
+\xdd\xda\xda\x42\x24\x12\xd9\xff\x82\x01\x94\x4a\x25\x2a\x2a\x2a\
+\xc8\xf5\xbe\x6f\x3f\x67\x8f\x3e\xfe\x0f\xfb\x7f\x45\x86\x86\x86\
+\xa8\xd7\xeb\x45\x30\x18\xdc\x17\x01\x1f\x59\x59\x59\xa8\xac\xac\
+\x24\xd3\xb7\xee\x50\x55\x8e\x1a\x32\x96\x32\x22\x39\x3c\xa0\x78\
+\x9c\x22\x46\xe3\xb0\x2f\x2e\x81\x0c\x0e\x0e\xd2\xb5\xb5\x35\x11\
+\xf0\xcf\x91\x97\x97\x07\xa7\xd3\x79\xe2\xe5\x33\x45\xf6\xdc\x13\
+\x39\x68\xf9\xf2\x1a\x84\xd8\xbf\x03\xe8\xdf\x77\xd3\x07\xb5\x98\
+\xbd\xbb\x08\xd2\xdf\xdf\x4f\xed\x76\x3b\xc2\xe1\x70\xc2\xc7\xf9\
+\xf9\xf9\x58\x5d\x5d\xd5\x16\xe9\xf4\x8e\xcc\xa7\x53\xf1\xe1\x4f\
+\xeb\x20\xaa\x5c\x10\x76\xba\x03\x01\x44\x82\xb8\x73\x19\x97\x75\
+\x1a\xfc\xb1\xbc\x01\xd2\xdb\xdb\x4b\xe7\xe7\xe7\x13\x24\xa2\x94\
+\xa2\xa0\xa0\x00\x4b\x4b\x4b\xda\xd7\x5e\x2d\x71\x64\xab\xd3\x70\
+\xf1\x17\x27\xe4\x19\x59\xec\xe5\xc1\x00\xa6\x21\x04\xf7\x1a\x2e\
+\x9c\x55\x63\xd1\xbe\x0a\xd2\xdd\xdd\x4d\x67\x66\x66\x10\x0a\x85\
+\xf6\x01\xb8\x83\x0a\x0b\x0b\xe1\x70\x38\xb4\x06\x7d\x31\x03\x64\
+\xe0\xea\x4d\x2f\x92\xd4\xd9\x62\x04\xe4\x80\x12\xa2\x6c\x8f\x80\
+\x73\x0d\xef\xbd\x98\x86\x05\xdb\x0a\x48\x47\x47\x07\x9d\x9c\x9c\
+\x4c\x70\x11\x07\xe8\x74\x3a\x30\xf9\xb4\xa5\xc5\x6f\x38\xb2\x35\
+\xe9\xe8\x9d\x0d\x21\xfe\x94\x1a\x01\x21\x06\x7f\x38\xf6\x48\x40\
+\x4a\x92\x1c\x51\xd7\x2a\xde\x3f\x9d\x8a\xd9\x05\x06\x68\x6b\x6b\
+\xa3\x6e\xb7\x1b\x3c\xd1\x0f\x22\xe0\xf2\x64\x64\x64\x40\xa3\xd1\
+\x60\x65\x65\x45\x5b\x62\x78\xdd\x71\x4c\x01\x7c\xf1\x1b\x90\x96\
+\x77\x8a\xd1\x63\x07\x46\x00\x89\x04\x5e\xdb\x02\xde\x3d\x25\xc0\
+\xe5\xdd\x01\x31\x99\x4c\xb4\xb6\xb6\x16\xd1\x68\x54\x04\xf0\xcd\
+\xf9\x25\x93\xc9\xd0\xd3\xd3\x83\xf5\xf5\x75\x6d\xb1\xbe\xcc\x81\
+\x78\x08\xdf\x6d\x2a\xa1\x64\x00\x1a\x7f\xf4\xe9\x77\x53\x20\x85\
+\xc7\x36\x8f\xb7\xd2\xef\xc3\xed\x65\xc5\xdb\xda\xda\x4a\x6b\x6a\
+\x6a\x60\xb5\x5a\x61\xb3\xd9\xf6\xec\xc9\x13\xdc\xd7\xd7\xc7\x6d\
+\xaa\x35\x9c\x2b\x75\x44\x02\x7e\xfc\x2c\x3d\x09\xd5\x33\x27\x0f\
+\x05\x38\xef\x2d\xe2\x15\x6a\xc3\xfd\x4d\x16\x41\x73\x73\x33\xad\
+\xae\xae\xc6\xdc\xdc\x1c\xca\xca\xca\x44\xbb\x4e\x4d\x4d\x89\x55\
+\x3c\x30\x30\xb0\x0b\x60\x11\xf8\xb6\x3c\xb8\x9d\xf2\x1c\x72\x0b\
+\x5e\x62\x0a\x1d\x0c\x90\x48\xa5\x58\xbe\x6d\xc5\x69\xff\xef\xf8\
+\xd3\xc7\x8c\xd3\xd4\xd4\x44\x59\xb5\xc2\xe5\x72\x89\xba\x73\x99\
+\x98\x2c\xe2\x7c\x78\x78\x58\x2c\x34\x06\xb0\x13\x99\x04\xd3\xb7\
+\x7e\x45\x38\x10\xc4\x61\x43\x71\x2c\x09\x85\x67\xcf\xe0\xce\xf4\
+\x5d\x90\xc6\xc6\x46\x5a\x5e\x5e\x8e\x40\x20\x20\x3a\x87\x03\x24\
+\x2c\x51\xbc\x01\x8e\x8c\x8c\xf0\x8e\x9a\xfe\xfc\xb3\x2f\x78\x55\
+\xb9\xd9\x50\x28\x9e\xe0\x4d\x8a\x25\x99\x8a\xae\xe3\xb9\xda\xd5\
+\x85\xad\x61\x17\x5f\x03\xde\x4a\xd8\x73\x21\x22\xe0\xe6\xa4\x15\
+\xa4\xa1\xa1\x81\x72\x69\xfc\x7e\xff\xbe\x3a\xe0\x1f\x5b\x2c\x16\
+\xb4\xb7\xb7\x93\xb7\x2b\xdf\x39\x4f\x63\xb1\x36\x7e\x00\xbe\x69\
+\x24\x22\x6c\x37\xb5\x7c\x94\xea\xf7\xfb\x20\x08\x51\x66\x90\xdd\
+\x56\x7f\xad\xfd\xeb\x6d\xb9\x5c\x9a\xca\xe7\x52\x76\x48\x89\x4c\
+\x66\x24\xf5\xf5\xf5\xd4\x60\x30\x24\xb4\x6b\x0e\x98\x98\x98\x40\
+\x57\x57\x57\x82\x1f\xcf\xe9\x4a\x7e\xe8\x37\xf7\xe9\x3c\x6e\x0f\
+\x2b\xd0\x20\x8b\x3e\xc8\x7a\x10\xc5\xa5\x4f\x2e\xfd\x78\xe3\x7b\
+\x4b\xd1\xbe\xa4\xd7\xd5\xd5\x51\xbd\x5e\x2f\x02\x1e\xd4\x80\xa8\
+\xa3\x42\x81\xb1\xb1\x31\xb0\x5e\xb5\x07\xa8\x33\x9e\xa7\x6a\x8d\
+\x5a\x34\xc2\x45\xd3\xa7\x0f\xab\x97\x57\x36\x6b\x11\x2d\x17\x3e\
+\x63\xeb\x9e\x84\x6b\x63\x03\x6d\xed\x57\xc4\x75\x84\x9d\xde\x92\
+\x99\x99\x59\xca\x35\x4d\x49\x49\x41\x72\x72\xb2\x98\x83\x0d\xf6\
+\xd1\xe6\xe6\xa6\x79\x7c\x7c\x7c\xef\x8f\x76\xe5\xf2\x55\x7a\xfc\
+\x78\x0e\x76\x76\x42\xd8\xde\xf6\x31\x50\x08\x31\xf6\x27\x8c\x44\
+\xa2\xac\xcb\xc6\x20\x95\x4a\x44\x98\xed\x9e\x0d\xdf\x5c\xef\xd9\
+\x05\x1c\x6a\x89\x23\x8e\xff\x3f\xe0\x2f\x0b\x84\xff\x25\xc3\xd1\
+\x97\x54\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xb0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x77\x49\x44\x41\x54\x78\xda\x95\x55\x0d\x4c\x55\x65\
+\x18\x7e\xce\xb9\x87\x0b\x22\x78\x41\xd8\x55\x02\x25\x53\x74\xe2\
+\xcf\x6c\x96\xae\xd0\x9a\xff\xd6\x1a\xa1\x4b\x57\xe4\x48\x33\x5a\
+\x98\x6b\xac\x66\xcb\x42\x5b\x2b\x7f\x58\x9a\xa3\xa5\x6d\x96\xe6\
+\xcf\x56\x99\x8b\xdc\xd2\xdc\x82\xc4\x24\x51\xf9\x93\x19\x08\xe2\
+\xf5\x02\x17\x2e\x70\xe1\x5e\xb8\xdc\xbf\x73\xcf\x7f\xef\x39\x26\
+\x13\x81\x9a\xdf\xdd\x77\xef\x39\xe7\x7e\xdf\xfb\x7c\xef\xf3\x3c\
+\xef\x7b\x18\x8c\x32\xf6\x15\x5f\xd4\x34\x95\x81\xac\xa8\xd0\xe8\
+\x9e\xa5\xc9\x30\x0c\x58\x06\xf0\xf2\x2a\x4c\xf4\x60\x40\xe0\xe1\
+\xf1\xfa\x60\x77\xfa\x51\xf1\xc5\x9b\xcc\x48\x71\x98\xff\x02\x58\
+\x97\x31\xd7\xb8\x96\x44\x15\xbe\x70\x08\x81\xb0\x8c\xa0\x20\xa1\
+\x2f\x18\x44\xbf\x5f\x01\x1f\x16\x61\xeb\xee\x42\x73\x97\x07\x02\
+\xcf\x8c\x08\x32\x2a\x40\xe1\xe9\x0b\xda\xcb\xcf\xcc\xc3\x64\x6b\
+\x3c\x65\xa0\x21\x14\x12\xe1\x0f\x2b\xf0\xf1\x3c\x7c\xfe\x00\x5c\
+\x41\x11\x12\xdd\x37\xba\xdc\x28\xa9\xbd\x89\xa7\xa7\x4f\x45\x45\
+\xb3\x03\x65\xbb\x5e\x67\x1e\x1a\x20\x20\xf1\x04\x60\xa2\x13\x4b\
+\x08\x8b\x01\x84\x29\x0b\x4f\x50\x82\xa4\xaa\x68\xec\xe8\x43\x93\
+\xc3\x81\xec\x45\xb3\x51\x7c\xed\x0e\x6e\x38\x5c\x43\x40\x06\x2f\
+\x96\x9e\x76\x67\xa5\xcf\x8c\x5b\x32\x81\x53\x72\x26\x46\x98\x63\
+\x3a\x06\x44\xae\x37\x1c\x46\xb8\x47\x45\xba\x59\xc2\x96\x15\x09\
+\x08\xd3\x3d\x1f\x0c\xc1\xcf\x2b\x44\x97\x06\x51\x91\xd0\xd4\xe1\
+\xc6\x35\x9b\x1d\x3b\xb2\x57\x42\x11\x65\x14\x9e\xa9\x40\x63\x7b\
+\xcf\x20\x08\xb3\xa1\x46\xb2\xa4\x45\xe3\xe8\xf3\x29\xdc\xda\x69\
+\x51\x80\x5b\x04\x1c\x32\x40\x74\x1b\x82\x4e\x89\x05\x6e\xba\x15\
+\xec\xfe\xb6\x01\x6c\x5b\x33\x34\x49\x82\xaa\x28\xd0\x54\xcd\x38\
+\x98\xd7\xe3\xc4\xfa\xec\x05\xd8\x93\xb3\x14\xce\x7e\x3f\x6e\xb5\
+\xf6\xe0\xfc\x75\x1b\x6a\xec\x9d\x06\x08\x53\x78\x47\xa9\xdc\x92\
+\xca\x3e\x59\xe5\x07\xec\x21\x80\x8c\x83\x31\x34\x15\xda\xaf\x50\
+\x00\x3f\xfd\x26\x47\x02\xdd\x21\x19\x3e\x9b\x0f\x5b\x33\xc6\x22\
+\x48\xe8\xb2\xa8\x80\xd5\x48\x83\x76\x0f\xfe\xa8\x77\x18\x00\x03\
+\xbe\x00\x02\xb4\xd1\xe1\xec\x46\x71\xa5\x1d\xbf\x55\x35\x81\x59\
+\x7f\x99\x3f\x5c\x30\x37\x2a\xb7\x82\x00\x52\xa3\xe9\x44\x14\xd0\
+\x2b\x00\x09\x14\xb4\x37\x00\x70\x64\x47\x72\x25\xe2\xe9\xbf\x5f\
+\xae\xf4\xe3\xd4\xea\x18\xf0\x64\x5d\x5d\x60\x9d\xa2\x20\x69\x51\
+\x52\xd7\x6c\x64\xe3\xa7\xd3\x04\x34\xd1\xb8\xae\xbe\xdd\x89\x16\
+\x67\x0f\x98\xd5\x25\x81\x0f\xb6\xcf\x8f\xde\x73\x47\x60\x70\xd1\
+\x1e\x0e\xf7\x78\xf9\xbd\x92\x88\xab\x13\xe2\xd8\x13\x2f\xcd\xb5\
+\x58\x5b\x82\x80\x89\x36\x68\xf4\xf5\x67\xc3\x00\x5c\xa7\x4a\x0c\
+\xe5\xa8\x48\x40\x4c\x11\x55\x12\x4d\x85\x68\xd3\x68\xca\x90\x04\
+\x01\x45\x3b\x57\xa2\xbe\xad\x13\x45\x67\x2b\xef\x8a\xfc\xc2\xf9\
+\x81\xb7\x29\xed\x60\xd9\x9a\x84\x63\x83\xa2\x1f\x77\x2d\xde\xb7\
+\xd6\x7a\xe9\xa7\x5e\xc0\xc2\xdc\xa5\xee\x52\xb5\x07\xbf\x66\x8e\
+\x33\x36\x69\x2c\x4b\x85\x26\x41\x14\x49\x13\x49\x46\x48\x77\x18\
+\xe9\xe3\xf6\x86\x61\x19\x17\x89\x6b\xb7\x3b\xb0\xf7\xc7\xf2\xd1\
+\x6d\xfa\x5e\x69\x9f\x2b\x6f\x51\xbc\xf5\x9b\x56\x0d\x56\xb3\x06\
+\x39\x86\xc5\xc5\x33\x0e\x9c\xdd\x98\x34\xb8\x46\x56\x58\x08\xaa\
+\x80\xa0\x2c\x40\x08\x30\x90\xb4\x30\x01\xf0\x48\x1a\x1f\x8f\xcb\
+\xb7\x1c\xd8\x76\xf4\xfc\xc8\x00\x2f\x16\xf7\x1e\x3b\x92\x99\xf8\
+\xda\x61\x07\xd0\xe2\x97\xc1\x26\x70\xf8\xbb\xd4\x03\xf1\xca\x55\
+\x44\xc8\x3c\xb4\x7b\x1e\xd7\x77\x93\x9b\x14\x4d\xa7\x88\x84\x22\
+\xaa\x24\x49\x40\xc9\xd7\xd9\xa8\xb6\x39\xb1\xa9\xe8\xe7\xe1\x00\
+\x93\x3e\x6f\xff\xf0\x5c\x5e\xf2\xae\x43\xad\x44\x89\x53\xc2\xd8\
+\x44\x33\xda\x6a\x42\xd8\x22\xdb\x91\x9f\x33\x0d\x26\x86\x54\xd7\
+\x68\x9b\x99\x6c\x4c\xba\x70\x0a\x43\x5a\x30\x64\x04\x09\x32\x09\
+\xdf\xeb\x0f\x62\x56\xaa\x15\x97\xeb\xdb\xb1\x66\xf7\xc9\x07\x00\
+\xe6\x97\xc5\x6d\xda\x9e\xde\x98\xb4\xd0\x3a\xf1\x48\x9d\x00\xab\
+\xc5\x0c\xf7\x8d\x10\x36\xab\xcd\xc8\xdf\x38\x83\xc4\x54\x8d\xda\
+\x8c\x00\x87\x48\xd2\x40\x24\x10\xba\x41\x94\x0e\x28\x33\x08\xea\
+\x1a\xf8\x78\xa4\x3d\x12\x8f\x3a\x5b\x27\x96\x17\x7c\xf7\x00\x40\
+\x5e\xd3\xbb\x87\xb6\x3e\xba\xff\xa4\xcb\x84\x2e\xaf\x0c\x8e\x33\
+\x23\xea\xfb\x32\x58\x62\xbd\x43\x96\x69\xff\x76\x56\x46\xf7\x97\
+\x5e\x8d\xe4\x28\xfd\x21\x43\xd9\x49\x64\xc1\xd2\xaf\xb2\xa8\x85\
+\x74\x63\x55\xc1\xf1\xa1\x00\xcf\x9e\x70\x7d\x32\x31\x3d\x61\xe7\
+\x0d\x2a\x06\x81\xe1\x10\x68\xea\xc7\x47\x31\x3d\xd8\xb0\x66\xd2\
+\x50\x00\x0a\x66\x36\x73\x14\x4c\xa2\xb6\xcd\x51\xad\x70\x24\x85\
+\x4a\x58\x26\xa3\x9d\x24\x50\xd1\x54\x36\x77\x60\xf5\x8e\x07\x00\
+\x9e\x38\xd8\x59\x28\x8e\x1f\xf3\x7e\x6b\x17\x6d\x94\x23\xa0\xf4\
+\x0d\xe0\xd3\xd9\x02\x36\x64\xa6\x0c\x33\x82\xc9\x64\x22\x17\xd1\
+\x3a\xfa\x44\x90\x18\x3a\x4b\x3a\x81\x22\xd5\x42\x62\xec\x28\x00\
+\x58\x74\x2e\x95\x49\x18\x97\x92\x9e\x91\xda\x6d\xf1\x94\xdb\xf2\
+\x57\x65\xa0\xc7\xc3\xe3\x87\xdf\x1b\x30\xfa\x18\x1a\x42\xa5\x4f\
+\x49\x51\x16\x6e\xb6\x13\x45\xc3\x00\xf4\xe5\xcb\x4a\x0f\x2e\xd9\
+\x34\xe7\xb9\xf6\xeb\x2d\x53\xb6\x2d\x8c\x46\xee\xba\x39\xe8\xf3\
+\x87\x46\x0d\xaf\x9f\x5a\x26\x01\x18\x43\x7c\x6a\x2b\x54\xde\xc9\
+\x71\xb1\xa8\xa2\x0c\x86\x01\x4c\xcb\xaf\xbd\xf4\xce\xc7\x8f\x2f\
+\x3e\x51\x27\xc2\x2d\x70\xb0\x74\x06\xf0\x6a\xa0\x16\x6f\x6c\x5c\
+\x30\xe2\xb9\x55\x72\x92\xa2\x43\x90\x45\x4d\x2a\x4b\xa6\xe0\xc0\
+\x53\x13\x9c\x10\x1f\x83\x2a\xaa\xe4\xa1\x22\x67\xfe\x35\x2f\x37\
+\x2f\xed\x7a\xad\x10\x8f\x9a\x72\x72\x8d\x85\xfc\xae\x98\xb1\xa0\
+\xad\x9c\x04\xf4\x8e\x7c\x7a\xe2\xdb\x48\x41\xaf\x38\xc3\x55\xf4\
+\x0e\x97\xa9\x91\x1d\xcb\x41\x03\x51\xb4\x7c\xfb\x7d\x36\x1d\xbb\
+\xae\xe2\xa9\xc7\xb2\xa6\x56\x74\x49\xb1\x70\x37\x7a\xc8\xdc\xfa\
+\x53\x16\xcb\x06\x9a\x50\x7a\x60\x29\x1e\x76\xe8\xef\x86\x79\xb9\
+\xfb\xef\xcb\x20\xf9\xcb\xe8\xb4\xcd\x8b\xab\xfd\xd3\x67\xcd\xec\
+\xae\x77\x12\x80\xee\xef\x48\xbc\x15\xd3\x82\x82\xcd\xb3\x1f\x1a\
+\xc0\xa0\xfc\x95\xcf\x86\x6a\x60\x9a\x71\x60\xb2\x9a\x94\x72\x41\
+\x1b\x9f\x38\x95\x72\x85\xb9\xbf\x16\x6c\x1c\xbd\x28\x06\xbb\xcf\
+\xff\x0f\x8d\x8a\x84\xa1\xee\x7a\x6f\xfc\x03\x0c\xd8\xd3\x26\xba\
+\x32\x67\xc3\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x21\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\xe8\x49\x44\x41\x54\x78\xda\xb5\x95\x5f\x48\x53\x51\
+\x1c\xc7\x7f\xe7\xdc\xcd\xac\x76\x9d\xa5\x9b\xde\x6d\xb4\x81\xa2\
+\x8b\x8a\xca\x3f\x25\x46\x65\xd8\x4b\x04\xbd\x44\x14\xf6\xd0\x9f\
+\x87\x7a\x91\x20\x02\xa3\x87\x5e\x7a\x2b\x24\x0a\x7b\x10\x02\xa3\
+\x17\xf3\x25\x22\xa3\x22\x30\xb1\x12\xc9\x5a\x52\x94\xa0\xe8\x42\
+\x65\x7f\x74\xce\x3f\x73\x2b\x53\xb7\x7b\xfa\x9d\x7b\x37\x4d\xcb\
+\x31\xb7\xf5\x63\xdc\xb3\x73\x77\xee\xf7\xf3\xfb\x7d\x7f\xe7\xdc\
+\x11\xf8\xcf\x41\xf8\xe5\x66\x6f\xf0\x2e\x0e\x97\x62\x37\x59\x2a\
+\x62\x4b\x71\xe7\xea\x36\xf1\x32\xb9\xf1\x69\xb2\xb1\x4c\xd2\x5d\
+\xe4\x77\x04\x0a\x20\x27\xab\x1e\x0d\x8a\x94\x88\xac\x7e\x77\x78\
+\x43\xb7\x39\x80\x95\x99\x74\xc0\x58\xf2\x99\xff\xab\x12\x82\x17\
+\x87\x27\x04\x0a\x60\x8f\x59\x84\x85\x68\xea\x24\x45\x8b\x62\xcf\
+\x6a\xb1\x94\x0f\xee\xa0\x0a\x28\x91\x44\x88\x60\x09\x3f\x16\x64\
+\x08\xfe\x0a\xa7\x94\xbd\x98\xa9\x81\x8d\x5a\x0a\x02\x96\xd0\xe3\
+\x45\xc0\xf5\xf7\x13\xac\xcc\xa2\x43\xef\x19\x74\x0d\x06\xe0\x56\
+\x95\x31\x25\x40\x5d\x87\x0f\x2a\x0b\xf5\xd8\x0b\x02\x0e\x17\x5a\
+\x74\xad\x6b\x9c\x95\x6f\xc9\x02\x19\x2d\xea\x76\xa6\x07\xb0\xb7\
+\x00\x01\x68\xd1\xc7\x91\x19\x20\x75\x6f\x7c\xac\xc4\x9a\x85\x9d\
+\x67\xf0\x79\x78\x46\xf1\x90\x61\x35\x0c\x96\xb6\x1d\x21\xf1\x45\
+\x19\x53\x17\xd1\xe8\x7c\x17\xea\x09\x08\xe8\x41\x3d\x72\xa5\xdd\
+\xcb\x4a\x6c\xd9\x8a\x45\x7c\x8b\x09\x94\x42\x30\xc2\x40\x46\xf9\
+\x9f\x61\x59\x11\x0f\xcc\xa1\x02\x5d\x45\x1d\xb7\xa4\x7e\x1d\x51\
+\x20\xeb\x05\x5c\x2c\xcb\x20\xe2\x48\x38\x60\x68\x1a\xc8\x85\x17\
+\x2e\xb6\xd5\xb6\x09\xa6\xe6\x65\x98\xc5\x45\x4e\xf4\x4d\x96\x13\
+\xcb\x7c\x65\xf0\x1c\x24\xdc\x30\xdc\x6e\x5d\x06\x40\xff\x00\x02\
+\xaa\x9a\x9c\xac\xd8\x9e\xcb\x0b\x05\xcf\x68\x08\xb4\x23\xa3\x29\
+\xf5\x20\x6c\xcd\x07\x53\x9e\x0e\x93\x23\xd0\xdf\xe7\x07\x72\xf0\
+\xfe\x00\x2b\xb0\x1b\x94\x12\xdd\xee\x19\x78\x70\x38\x1b\x4c\xb9\
+\x62\x52\xe2\x1e\x7f\x10\xce\xb5\x4d\x83\xd9\x9c\xa5\x54\xef\xec\
+\x1b\x07\x52\xd9\xd8\xc7\xac\xc5\x46\x05\xe0\x75\x05\xa0\xf9\x48\
+\x8e\xb2\x78\x3e\x76\xde\x13\x8c\x0c\x41\x6d\x52\xcd\xcb\x09\x90\
+\x2c\x7a\x05\x30\xdc\xef\x03\x52\x5a\xff\x95\xd9\x76\x4a\xc0\xb0\
+\xb1\x13\xbe\x10\xb8\xf1\x66\x38\x89\xd7\x06\x6f\x97\x06\x2f\x66\
+\x4c\x36\xc7\x88\x16\x61\xa3\x87\xbe\x78\x55\x40\xde\x76\x13\xc8\
+\xf3\x61\xa5\x4b\x94\xd2\x35\x4a\x2f\x0f\x99\xef\x10\xfc\xd0\x0c\
+\x0d\x8c\x7d\xf3\xa8\x00\x7d\xa1\x7a\xb8\x58\xaa\xaf\xd2\x58\x35\
+\x54\xdd\x7e\x81\x41\xd5\xa2\xf6\x4c\x9b\xe1\x50\xec\x87\x78\x10\
+\xb6\xa2\x2f\x44\xa0\xab\x8a\xf3\x98\xfd\xee\xeb\x56\x66\xd6\xda\
+\xd7\x6d\x38\x54\xff\x21\xf5\xf7\x83\x1a\x0a\x62\x69\xd1\xe2\x79\
+\xe3\xe2\x53\x9d\xbd\xea\x1f\xc0\xb2\x4e\x2c\x46\xd7\xf0\xbd\xea\
+\x7d\x09\x1f\x25\xd3\x89\x96\x93\xd4\x68\x68\xd9\x50\x61\x07\x58\
+\x08\x23\x50\x80\xc0\xd3\xb7\xef\x46\x1f\xd7\x1c\x88\x6b\xd7\x5a\
+\xbc\xcd\x3f\xde\x7c\x8a\x98\xa4\x47\xda\xdd\x45\xca\x7c\xee\x59\
+\x47\xf7\xd8\x93\xd3\x15\x69\x03\xf0\xc8\x3d\xf6\xb0\x81\x48\x52\
+\x2d\x2d\xdf\x01\x91\xd6\x57\x0e\x7f\xeb\xd9\xf2\xb4\x02\x78\x6c\
+\x3e\xda\xd4\x20\x58\x2c\xb5\x11\x97\xab\x73\xf2\xf9\xf9\xfd\x69\
+\x07\x44\x21\xf5\x38\x18\x10\x70\x26\xde\xba\xdf\x57\x4f\x21\x3b\
+\xad\x96\xab\x2f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x04\x80\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x47\x49\x44\x41\x54\x78\xda\xa5\x96\x6b\x6c\x14\x55\
+\x14\xc7\xff\x33\xb3\x5b\xd4\x58\x65\x95\x40\xd4\x44\x3f\xf8\xf8\
+\xa0\xc6\x10\x4c\xf8\xe0\x2b\x41\x2b\x3e\x88\xb5\x68\x30\x50\x62\
+\x89\x20\xc6\x0f\x04\x8d\x06\x03\xb2\xab\xa2\xb5\x82\x51\x62\x23\
+\x51\x13\x4d\x29\x62\xb5\xa8\x54\x49\xd4\x4a\xb6\xa0\x89\xa1\xda\
+\x16\x94\x98\xda\x17\x6b\xc5\xdd\xee\xd2\x96\x6e\xbb\xec\xee\xec\
+\xbc\xef\xf5\xdc\xd9\x6d\xe9\x32\x6d\x03\xf5\x4e\x66\xe7\xb9\xf7\
+\x37\xe7\xff\x3f\xe7\xcc\x48\x98\x34\xde\x69\xfa\x99\x73\x26\xc1\
+\x76\x18\x38\xe7\x80\x24\x41\x86\xd8\xd0\x56\x02\x52\x1a\x83\x42\
+\x27\xce\x18\x1a\x92\xa9\x34\xfa\xe3\x19\xb4\xee\x7c\x46\xc2\x0c\
+\x43\x3a\x17\xb0\xe2\xce\xdb\xdc\x7d\xbf\x5f\x41\x4e\xb5\x90\xd6\
+\x73\xc8\xea\x36\x54\xc3\xc2\xa8\xaa\x62\x2c\xe3\x40\xd3\x4d\x44\
+\x06\x4f\xa1\xef\x54\x12\x86\x26\xcd\x08\x29\xba\xb0\xe3\xab\xc3\
+\x7c\xe5\x3d\x0b\x71\xed\xfc\x80\x7b\xcc\x69\xc9\xe5\x4c\x64\x74\
+\x07\x69\x4d\x43\x3a\x93\xc5\x90\x6a\xc2\xa2\xe3\xee\xa1\x11\x84\
+\x7f\xef\xc2\x1d\x37\x5d\x8f\xd6\xbe\x28\x7e\x7a\x73\xad\x74\x41\
+\x00\xc7\xb2\xa0\xc1\x26\x80\x42\x4f\x6c\x41\x37\xb3\xd0\x29\x8a\
+\x24\x45\x65\x31\x86\xee\x81\x51\xf4\x44\xa3\xa8\xbc\xeb\x56\x34\
+\xb5\xfd\x8d\x3f\xa3\x43\x53\x42\x8a\x4e\xd4\x34\x1e\xe6\xab\x97\
+\x14\x00\x8e\x43\x21\x30\x98\x50\xa0\xeb\x3a\x34\x35\x87\x8c\xe6\
+\x90\x5c\x1c\xa6\x63\xa1\x67\x60\x04\x6d\x91\x7e\x84\x2a\x97\xc2\
+\x31\x6d\xec\xf8\xb6\x15\xdd\xb1\x61\x0f\xa4\xe8\xa0\xba\xa1\x85\
+\x3f\x59\xb6\x08\x17\xe7\x7e\xc5\xdc\xc6\x65\xee\xb9\xd4\xca\xef\
+\xf1\x48\x75\x16\xcc\x76\xc0\x08\xca\x19\xcf\x9f\x4f\xc6\xf1\x44\
+\xe5\x62\xbc\x55\x75\x2f\xe2\x63\x19\xf4\x9e\x1c\x46\xf3\x1f\x11\
+\x1c\xeb\x4f\x14\x41\x8a\x00\xaf\x7f\xde\xc2\xd7\xdc\xb7\xa8\x10\
+\x81\x0e\xc6\x14\x91\x48\xe0\xb4\x6a\x94\x59\x2a\x99\x6d\x9b\x0e\
+\x64\x4e\x1e\xc4\x92\x38\xd4\x19\x75\x01\x67\xd2\x59\x64\x1d\x8e\
+\x68\x7c\x10\x4d\xed\xfd\xf8\xa1\xa3\x07\x5d\x1f\x3d\x2f\x79\x00\
+\xa1\xcf\xc2\xfc\xe9\xfb\x6f\x2f\x00\x4c\x02\xe4\x2f\x8b\x14\x75\
+\x0a\x10\x61\xb0\x90\x48\x25\x2f\xc2\xc7\xfb\xdc\xeb\x99\x0c\x47\
+\x96\x9b\xee\xfe\xd1\x13\x09\xfc\x13\x1f\x46\xef\xc7\x2f\x78\x01\
+\x9b\xea\x7e\xe4\x1b\x96\x2d\xf6\x48\xf4\x68\x75\x6e\x22\x5e\x2a\
+\x14\xe4\xed\xb1\x68\x15\xb2\x71\x5a\x6d\x58\x86\x81\xda\x57\x96\
+\xa2\xf3\xdf\x04\x6a\xbf\x6b\xc7\xc9\xba\x4d\x5e\xc0\xc6\x5d\x07\
+\xf8\x8b\x2b\xee\x76\x23\xb0\x69\x16\x93\xb2\xa5\xa4\x70\x8d\x17\
+\x6e\xe6\xb2\x4c\x85\x66\xc1\x34\x2d\x30\x8b\xb2\x4c\x64\x18\x65\
+\xdc\x48\x4a\xc7\xe5\x97\xcd\x41\xdb\x89\x01\x6c\x6f\xfc\x05\xb1\
+\x4f\x5f\xf2\x02\xd6\xef\x6c\xe0\xc1\xd5\x0f\xe5\x25\x82\x90\x82\
+\x81\x89\xa2\xa3\x1f\xdf\xa4\xfb\x6c\x47\x86\xc1\x0c\xa8\xb6\x01\
+\x23\x2b\xc1\xe2\x3a\x01\x34\x5c\x75\x45\x00\x47\x7a\xa3\xa4\x44\
+\x33\x12\x7b\x37\x7b\x01\xab\x6a\xea\xf9\xf6\x75\xe5\x1e\x89\xca\
+\xdf\xc8\xe5\xcd\x1e\xcf\x0c\xf1\x2f\xca\x26\x87\x0b\x89\x88\x4e\
+\x52\x59\x96\x81\xf0\x87\x95\x38\x1a\x89\xe3\xa9\xda\xfd\x18\x6a\
+\xd8\xe2\x05\x94\x87\x3e\xe1\xef\x6f\x78\xcc\x8d\x20\xa9\xea\x50\
+\xc4\x24\x34\xad\x8f\x64\x51\x24\x39\x9f\x4e\xa4\x99\xac\x50\x44\
+\xe4\xba\x43\xab\x46\x5e\xd8\x64\xfc\xe9\x8c\x8a\x5b\xae\x9b\x8f\
+\x23\x9d\x31\x2c\xaf\xd9\x8b\xd3\x5f\x6c\xf5\x02\x96\x6c\xad\xe3\
+\xf5\x1b\x2b\x5c\xc0\x68\x36\xe7\x3e\xb2\x78\x6a\xce\x98\x7b\xab\
+\x9f\x84\x9a\x43\x30\x53\x18\xe3\x07\x2e\x12\x40\x5b\x82\x2a\x3c\
+\x48\x6b\xb8\xf1\xea\x00\x8e\x47\x12\x28\x0b\xee\x46\x72\x5f\x70\
+\x7a\x80\x9c\xfc\x06\x0b\x0e\xac\x9b\x90\x68\x79\x8d\x76\xd6\x68\
+\xd2\x47\xa2\xea\x76\x73\x97\x32\x0a\x6e\xd3\x95\x49\x22\x13\x2d\
+\xbb\x2a\xa8\x85\x0c\xe2\x81\xe0\x1e\x8c\x7e\x19\x3c\xbf\x08\x26\
+\x0f\xd1\xc1\x4b\x4a\x7c\x34\x99\x45\x6d\xdb\x47\xd2\xf9\xc8\x0a\
+\x46\xac\x7c\x3b\xb9\x32\x70\x09\xda\xfb\x06\xf0\x60\x68\x0f\xc6\
+\x66\x03\x10\x43\x51\x14\xca\x22\x02\xd0\xe2\x27\x33\x84\x4a\x42\
+\x40\x93\x6a\x61\x5e\xe9\x79\x02\xa6\x93\xa8\x78\x14\x37\x4e\x91\
+\xd0\xe1\xda\x0a\x74\xc5\x48\xa2\xff\x13\xc1\xd9\x09\xc9\x5f\xba\
+\x41\x72\xcd\x17\x6d\xc4\xc1\x35\x73\x4b\xd1\x41\x11\x4c\x0b\xb8\
+\xf9\xd9\xf7\x78\xf3\xb6\xaa\x09\x80\x34\x05\xc0\x2d\x01\xca\x24\
+\x47\x20\x28\x45\x15\x26\xc3\xe7\xf3\x41\xa3\x26\xb8\x20\x70\x29\
+\x3a\xa8\x92\x85\xc9\x33\x02\xce\x2d\xb4\x87\x5f\x4b\x15\x3f\x3d\
+\xe9\xed\x86\x20\x2a\xce\xcd\x2a\x7a\x8f\xdb\x26\x7e\xab\xaf\xc2\
+\x5f\x24\x51\xd9\x96\xdd\x48\x7d\x1d\xf2\x02\xe6\x3d\xfe\x2a\x3f\
+\xf6\xc1\x73\x13\xaf\xcc\xd9\x0c\xf1\x6e\x58\xb8\xfe\x5d\x8c\xec\
+\xdf\xe6\x05\x94\x96\xbf\xcc\xbb\xeb\x37\xcf\x7a\xf2\xf1\x71\xc3\
+\xaa\x6a\xe8\x07\xdf\x9e\x1a\x20\xb6\x16\x17\x1f\x2b\xfc\x82\x26\
+\x15\x9f\x39\x12\x75\xd7\xf1\x31\x0e\xf8\x0f\x7f\x52\x9c\x37\x52\
+\x7b\xdf\x74\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x6e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x35\x49\x44\x41\x54\x78\xda\xad\x55\x6b\x50\x94\x55\
+\x18\x7e\xce\xf7\xed\x2e\x82\x1b\x20\xb7\x5d\xc0\x85\xbd\xc8\x25\
+\x21\x14\xb5\xb4\x52\x21\x2d\xc6\x4b\x36\x8e\x26\xe6\x98\xd5\x94\
+\x3f\x72\x6a\x26\x6f\x4c\x3f\x6c\x92\xfc\xa5\x8d\xe3\x8c\x4d\x97\
+\x89\x71\x9c\x2e\x34\x94\x0d\xd6\x4c\x98\x39\x95\x8a\x60\x88\xd4\
+\x08\x38\xc2\x4a\xc0\x72\x59\x16\x58\x58\x0c\x17\xf6\xfa\x7d\xdf\
+\xe9\xdd\x35\x49\x13\x19\x6d\x3c\xb3\x67\x66\xe7\xcc\xf9\x9e\xe7\
+\x7d\x9f\xf3\x3c\xe7\x30\x3c\xc0\xf1\xec\x89\x01\xad\x5f\x46\x5f\
+\x6a\x8c\x18\xed\x18\x95\x3b\x34\x22\x5b\xc1\x1e\x14\x78\xd1\x71\
+\x07\x63\x22\x94\x9d\x0b\xe3\x20\x08\x02\xda\xdd\x01\x54\x36\x8d\
+\x06\x27\x08\x96\x1f\xeb\xad\xe6\x1c\xb4\x8b\x57\x09\x9c\x55\xfd\
+\xbc\xd1\x30\x7a\x3f\x04\xcf\x54\xda\xf9\xf6\xc7\xe3\xe1\x92\x80\
+\xd1\x20\x87\x5a\x25\xa0\xaa\xd1\x85\x30\x41\x41\x79\x77\xeb\x7c\
+\x53\x54\x76\x56\xa2\x06\xed\xc3\x01\x34\xf5\x7a\xe0\x0b\xf2\x4e\
+\xc6\x50\x25\x02\x3f\x9d\xde\x6c\x3c\x39\x15\xf8\xb2\x8a\x6e\x5e\
+\x52\x90\x88\xc1\x20\xe0\xf2\x73\x88\x02\x83\x73\x2c\x88\xba\x96\
+\xbf\x7c\xac\xf0\xf3\xce\xfd\xd9\x86\xe9\x6f\xaf\xcf\x89\x45\x8f\
+\x57\x41\x0c\x31\xc7\x47\x00\x23\x3e\x09\xf6\xeb\x12\x9a\xed\xe3\
+\x68\xb1\x7b\x21\x32\xf6\x11\x7d\x57\x4a\xdd\xbb\xce\xbe\x6c\xe6\
+\x37\xc1\x97\x7c\x69\xe3\xbb\x9f\x4a\xc2\x50\x40\xc0\x70\x40\x0e\
+\x83\x7b\x02\x0a\x4e\x5f\x1a\x06\x15\x28\xb2\x82\xcf\x3a\xd3\xa5\
+\xa0\xdc\x95\x96\xae\xc5\x7c\x53\x34\xb4\x22\x03\x27\xad\x64\x82\
+\x90\x68\x26\x68\x42\x84\x02\x3a\xae\xf9\xd0\x43\xb3\xad\xdf\x0f\
+\xe7\x88\x1f\x84\x93\xc7\x44\xa1\x79\xc7\x32\x1d\x9c\x92\x80\x11\
+\x02\x67\x84\x38\x46\xe0\xe7\x7e\x1f\x02\x13\x90\x70\xee\x15\x8b\
+\x2b\x2c\xd1\xd2\x23\x6d\x4c\x96\xf8\xfb\x5c\x60\xbb\xcd\xa6\x87\
+\x30\x2b\x45\x0b\x92\x06\x0a\x11\x29\x44\xa2\xa2\x5d\x1a\x51\x80\
+\x8a\x50\xe3\x23\x18\x46\xc7\x25\x54\xd4\x38\xb0\x6b\xc5\x4c\x92\
+\x85\x91\x2c\x37\xc0\xc7\x89\xa4\xa6\xc1\x49\x5d\x20\xa5\x66\x6b\
+\x66\x7f\x08\xfb\x36\x17\x2d\xfe\xc4\xaa\x0d\x4a\x28\x13\x45\xbe\
+\x29\xcd\x14\x0b\x4b\xea\xf4\x09\x22\xfa\x4d\xb4\x5f\x73\xa1\x1f\
+\x4f\x2c\xd4\x23\x4a\x23\x86\xbb\xbd\xb1\x2e\xe3\xb7\x8b\xfd\x10\
+\xb9\x30\xb3\xf6\x8d\xec\xbe\x9b\x98\x93\xda\x74\xe1\x07\x57\xb4\
+\x8a\x82\x32\x2a\x6a\x53\x9a\x39\x1a\x59\xc6\x58\x28\xa4\x99\xdb\
+\x1b\xc4\x05\x02\x5f\xb4\x28\x19\xd3\xa7\xa9\xc2\xe0\xe1\xca\xfd\
+\x12\xea\xeb\xfb\x09\x8c\x19\x2e\xbe\x95\x63\xbf\x15\x6b\xca\x1c\
+\x3c\x76\xa8\x59\x45\xb8\x95\x1a\xb5\xf8\x9c\xc1\x12\x0b\x6b\xd3\
+\x10\x66\xe7\x25\x21\x59\x17\x09\x85\xb4\x13\x42\x95\x7b\x65\x34\
+\xd4\xf5\x85\xba\xf8\xae\xa1\x24\x6f\xdd\x7f\x31\xee\x29\x68\xf3\
+\xf6\x37\x1a\xbd\x5e\xc9\xb6\xa1\xc8\x00\x97\xa0\x06\xfe\xa9\xdc\
+\x4b\xb2\x5c\xac\xee\x41\xd6\x5c\x1d\xda\x2f\x3b\xd1\xb8\x67\x1e\
+\xbb\x6f\x82\xb9\xfb\x1a\xc4\x40\x90\x4b\xeb\x57\xa5\x41\x15\x15\
+\x41\xd6\x95\x11\xf2\x9f\xc7\x2b\xa1\xb1\xa6\x0b\x96\xfc\x14\x58\
+\xd2\xa2\x51\x5f\xdb\x0b\x8f\xdb\x97\xda\xf8\xce\x02\xc7\x3d\x13\
+\xe4\xbd\x5b\x2f\x06\x02\xb2\xb4\x6e\xb5\x09\x2a\x6d\x24\xfa\xdc\
+\x32\xd9\x97\x93\xe6\x32\x5a\xaa\x6d\x30\xce\x49\x46\xa6\x31\x06\
+\x31\x1a\x86\x4b\x56\x17\x6c\x56\x67\x69\x73\xe9\xa2\xf7\xee\x89\
+\x20\x77\xcf\x79\xd1\xef\x57\xa4\xb5\xab\xcd\x10\x08\xdc\x31\x2e\
+\x23\x40\xba\xfb\x3c\x12\xda\xcf\xdb\x10\x33\x73\x06\x66\xcf\xd5\
+\x43\x17\x25\x84\x1d\xd6\xe6\xf0\xa0\xb5\xd6\x66\xbb\xb2\xff\x49\
+\xf3\x1d\x04\x0f\x97\x54\xf7\xc9\x0a\x4f\x61\x0a\xab\xa5\x95\x83\
+\x74\x78\x27\x25\x59\xee\x2c\x5a\x99\x91\xaa\x8e\x21\xf0\x51\x89\
+\x42\xc7\xe1\xf5\xc9\xe8\x22\x70\x8a\x62\x3e\xc9\x74\x69\xc1\x8a\
+\x6c\x44\xd1\x91\x08\x84\x21\xd1\x6a\xed\x0f\xad\x68\x39\xb0\xf8\
+\xb6\xa2\x59\xd6\xce\xb3\x0d\xb3\x72\x75\x0b\x72\xe7\xe8\x31\x34\
+\x38\x06\xdf\x98\x1f\x3d\xb6\x51\x68\xc8\xe3\xb3\x1e\x35\xc0\xe9\
+\x0e\xde\xa8\x9c\xae\x0e\xc7\xf9\x76\x4a\xa8\x90\xde\x7a\xb0\xa0\
+\x27\x6b\xc7\x99\xd2\x18\xb3\x7e\xaf\x3e\x23\x0e\x33\x28\x7c\x64\
+\x29\x34\xd7\x76\xc3\xeb\x72\x6f\xb1\x1e\x2a\x2c\x9f\x20\xc8\x7c\
+\xf3\x17\x9e\x94\xa1\x03\x4b\x8e\x85\x48\xd7\x42\x28\xb5\x89\x5a\
+\x11\xd1\x6a\xba\x1e\x5c\x01\x4a\x17\x43\x90\xe4\x19\xa8\xfb\x33\
+\x74\xb6\xe9\xd6\xc3\xcb\x7b\xc2\x5d\x6f\xff\x55\xe4\x9c\x49\xfa\
+\xc5\x19\x50\xab\x19\xd4\x14\xdf\x11\xbb\x1b\xd7\xae\xf4\x96\x5f\
+\xfd\xf0\xe9\x2d\xb7\x49\x94\xf1\xfa\xa9\x42\xba\x5c\xce\x44\x19\
+\x75\x88\x34\xc6\xd3\x0a\x25\x37\xe4\x73\xfa\x68\xdc\x3a\x08\x6f\
+\xaf\x13\x4c\x25\x1a\xdb\x3e\x2e\xea\xbe\xb5\xfd\xcc\x6d\xa7\x0e\
+\x69\xf4\x71\x3b\xa2\x73\x93\xc1\x29\x30\x4a\x50\xc6\xb5\x6a\x2b\
+\xda\xca\xfe\x7d\x67\x26\xfe\x58\xb6\x9d\xa4\x52\xf9\x01\x22\x2a\
+\x89\x7a\xc4\x04\x75\x42\x24\x42\x37\xda\x58\x43\x27\xe4\xeb\xde\
+\xd8\x8e\xb2\x95\x93\xbe\x0f\xe6\x57\xab\x78\x74\x61\x0e\x15\x20\
+\xd0\x64\x70\xd7\x75\x40\xf1\x78\xcd\x1d\x9f\xae\xb2\x4d\xea\x22\
+\xd3\xd6\x13\xd9\x74\xf9\xb4\x4e\x5b\x9a\x4b\x7a\x13\x67\xd7\x30\
+\x4d\xc7\xf6\xae\xa3\x6b\x0e\x4f\x46\x60\x7a\xad\xaa\x54\x48\x8a\
+\xdb\x1b\x31\x3b\x35\xd4\x38\x02\x6d\x83\x90\x1d\x83\xfb\x6c\x47\
+\xd7\xec\xbd\xab\x4d\x0d\x2f\x7d\x5f\xae\x4a\x4f\xdd\xcc\x2c\xf1\
+\xe0\x43\xe3\x90\x9b\x3a\x7e\xec\x29\x5f\xbb\xfa\x6e\x96\x36\xbc\
+\x78\x9c\x6b\xe6\x67\x81\x93\xe3\x98\xdb\x8f\xc0\x1f\x57\x1b\x7b\
+\xbf\x58\x9b\x3f\x05\xc1\xf1\x48\xf8\x83\x1e\xb6\x24\x1f\x3c\x42\
+\x0d\x7e\xba\x01\xf6\x8a\xe2\xbb\x66\xc6\xb0\xb9\xf2\x05\x24\x25\
+\x54\xb0\x3c\x23\x78\x73\x17\xe0\x1c\xaa\xee\xfd\xea\xf9\xc2\x29\
+\x83\x96\xb2\xf1\xd8\x2e\x45\x9f\x78\x30\xb4\x81\x0d\x0c\x5d\x76\
+\x7c\x53\x9c\x87\x29\x86\xbe\xf8\xeb\x2e\x75\x6a\x72\xba\xdc\x37\
+\x68\x77\x1c\x2b\x36\xdc\x71\xc8\x93\x7e\xb4\xa1\x22\xf4\x34\xb6\
+\x0c\x7c\xbb\x29\x07\xff\x73\xfc\x0d\x00\x8c\x46\x7b\xe9\x3c\xa8\
+\xcb\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x75\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x3c\x49\x44\x41\x54\x78\xda\xa5\x94\x7b\x54\x93\x65\
+\x1c\xc7\xbf\xbb\xbd\x32\xc6\x7c\x77\x61\x1b\xb0\x0d\x96\x97\x71\
+\x91\x04\x35\x31\xf1\x6e\x5e\x48\x21\x2f\x94\x4e\x53\xce\x11\x35\
+\xcb\x34\xeb\x18\x9d\x0c\x2f\x99\x9e\x2c\x24\xc4\x02\xbc\x71\x11\
+\x51\x26\x02\x06\x94\x9e\x0c\x4d\x3a\x48\x42\xe6\x0e\x13\x45\x50\
+\x2e\x02\x03\x04\x44\xb6\x31\x06\xe3\xb6\x5e\x2a\x3d\x87\xe4\xa2\
+\xf5\xfc\xf7\xbe\xe7\x79\xbe\x9f\xe7\xf7\xfd\x3e\xbf\x1f\x0d\xff\
+\x63\x15\xe4\xdf\x8c\x95\x38\x88\xd7\x97\x14\x95\xc6\xfb\x05\xcc\
+\x5b\x3f\xd0\x1e\xda\x7f\x15\x4f\x4b\xcd\x2a\x74\x56\x48\xbd\xc4\
+\x62\x7b\x08\x05\x02\xe4\xe6\x14\x04\x2d\x0a\x98\x97\x34\x28\x20\
+\x3e\x4e\x9d\x6e\xb1\xb4\xbb\xbf\xb7\x39\xd8\x63\x38\xf1\xd3\x89\
+\x69\x1b\x7b\x18\x5d\xc7\x05\x02\x3e\xc4\xf6\x22\x48\x9d\x24\xa8\
+\x2c\xab\xba\x30\x63\xf6\x34\xff\x01\x01\x27\xe3\x53\xe2\x1b\x5b\
+\xea\xd7\xd9\xb2\x6d\xc1\xe3\x09\xb0\x66\xf5\x9b\xc3\x56\x76\xfc\
+\x58\xa2\x8e\x6d\x67\x23\xe5\xf3\x79\x70\x90\x88\x21\xa0\xaa\x30\
+\xb7\x99\xcb\xcb\x4a\xcb\xce\x2e\x0d\x0c\xd8\xd9\x0f\x10\x7f\x22\
+\x39\xc8\xdc\xd5\x96\x28\xb4\x17\x40\x28\xb4\x07\x8b\xc5\x40\xde\
+\xd5\x02\xee\xce\x3d\xdb\x4d\x43\x41\x62\x62\xe2\x92\xed\xb8\x9c\
+\x55\x22\xb1\x08\x62\x91\x10\x62\x89\x04\x02\x3e\x09\x75\x52\x7a\
+\xca\x86\x4d\x6b\x55\xfd\x2c\x4a\x4c\x48\xd6\x48\x15\xb2\x09\x24\
+\xc9\x85\x90\xba\x95\x56\x53\xac\x5e\x16\xb8\x78\xf5\x70\x95\x44\
+\x86\xc7\x6c\x17\xcb\xc5\xe1\x7c\x1e\x1f\x12\x2a\x0f\xb1\x44\x04\
+\x01\x8f\x87\xb3\x67\xd2\xa3\x83\x37\xae\xdd\xd2\xcf\x8a\xd4\x73\
+\x99\x1d\x9e\x2f\xbb\x8d\x10\x89\xec\xd1\x66\x6e\x47\xec\x91\x04\
+\xe9\xbe\x03\xbb\xea\x86\x02\x84\x85\x45\x16\x70\x79\x5c\x1f\x92\
+\x12\x15\x90\x14\x44\xf2\x0f\x84\x2f\x40\xd4\xa1\x68\xef\x67\xbc\
+\x0e\x0d\xd9\x3b\x71\xfe\xe2\xb9\xc7\x95\xae\xca\x49\x11\x11\x87\
+\xc1\x66\xb2\x9d\x29\x48\xcd\x40\xe2\xa1\x3b\xf6\x3a\x39\xca\x1c\
+\x6b\x2d\x96\x0e\x70\x46\xda\x81\x4f\xf2\xc0\xa3\xb2\x70\xa4\x2c\
+\x73\x74\x12\xe3\xee\xed\x7b\xc7\x06\x0d\xf3\xd0\x37\xd1\x6a\x77\
+\x2f\x37\x55\xce\xe5\x1c\x58\x7b\xac\xce\x5f\x1f\xdc\xdf\x0f\xf2\
+\x6e\xf0\xe6\x55\x7e\x4b\xfd\x93\x5d\x95\x63\x90\x91\xf9\x03\xd8\
+\x6c\x36\x08\x82\x00\xc9\x25\xe1\x28\x95\x50\xc1\x4b\x50\xab\xab\
+\x35\x0d\xf9\x5a\x22\x23\xa3\xd4\x9e\xe3\x3d\x55\x97\xb3\xaf\xa0\
+\x5b\xaf\x97\x87\x1f\xf9\x4e\xd7\xf7\x7f\xc7\x47\x21\x81\x3e\xb3\
+\x66\xa6\x8d\x1a\x3d\x0a\xdf\x67\x64\xc2\x64\xd0\xc3\xc6\x86\xab\
+\x36\x34\xb6\x7c\x42\x0a\xc8\x4e\x77\xaf\x71\x0d\x32\xb9\x03\xcc\
+\xad\xe6\xe1\x1b\x2d\x3c\xfc\xb0\x7a\x92\xcf\x44\xd5\x2f\x99\xe9\
+\x28\x9c\xbc\xed\x3c\x47\xfb\xd3\xf2\xf7\x17\x8e\x83\x8d\x9d\x1d\
+\xb2\xb2\xb2\xf0\xf8\x91\x01\xd1\x31\x87\xfa\xe9\x7c\x1a\xb2\x7b\
+\xcf\xd4\x99\x53\x3f\x6f\x35\x18\x9f\xaf\x93\x3f\xdb\xfc\x41\x9c\
+\x35\xe0\xc3\xe0\x1e\xca\x63\xc2\xd8\x8c\x00\x4e\x1d\x32\x2e\x66\
+\xc3\x62\xb1\x54\x45\x44\x1c\x54\x0c\x74\x26\xfa\x68\xac\x95\x4e\
+\xc9\x3f\x17\xc0\xef\x5c\x6d\xdc\x7c\xa5\x5d\x30\xe8\xa0\x44\x7b\
+\xa1\xc9\xfb\x1d\xe4\x9d\x0b\x5d\x71\x27\xbe\x25\x06\x3b\xf3\xc5\
+\xde\x03\x0d\x2c\x82\x28\x1f\x16\xf0\x46\x52\xa9\x7a\xb6\xa7\x58\
+\x45\xb0\x09\xb4\x77\x75\x83\x41\xa3\xa3\xbc\xaa\x05\xd5\x8f\xcc\
+\xd0\x1b\xbb\xf3\x7b\x8d\xc6\xa8\xbc\x50\xdf\x33\x83\x9d\x1f\x12\
+\xb0\xe0\x88\x56\xb7\xc4\x57\x2e\x6d\xa7\x33\x41\xb0\xe8\x60\x31\
+\x18\xc8\xd7\xd6\xa2\x87\x2a\x85\xc7\xb3\x45\x93\xa9\x03\xba\x5a\
+\x03\x3a\x9b\xf5\x1d\x37\x76\xcf\x62\xbf\x10\x20\x30\x56\x5b\xed\
+\xe9\xe1\x28\xa7\xe6\x06\x46\x30\xe9\xe0\xda\x32\x91\x73\xbd\x12\
+\x8d\xcd\xed\xf5\x7e\x73\xc6\x3a\xd6\x34\x99\xa1\x74\xe2\xa2\xa8\
+\x46\x8f\xd2\xba\x56\x98\x1f\x3c\x44\xe1\xfe\xb9\xb4\x61\x01\x93\
+\x43\xaf\xc8\x85\x42\x4e\xf5\xec\x99\x4a\xe8\x29\xbf\x19\x74\x1a\
+\x75\x7b\x06\x34\x9a\x07\xc8\x7c\xc7\x9b\xf6\x5a\xd4\x2d\x9a\xeb\
+\x4b\x64\x6f\x45\x5b\x37\x48\x16\x0d\x3e\x63\x44\x28\xae\x31\xa0\
+\xf8\x61\x2b\x4c\x15\xf5\x28\xfa\x17\xa4\xdf\x87\xd7\xb6\x1f\x65\
+\x0e\x32\x7e\xcd\x2b\xbe\x63\x61\xea\xb2\x52\x5d\xcc\x00\x9d\x41\
+\x43\x76\xa6\x06\x37\xbe\x9a\xff\x74\xef\xeb\x47\xb5\x37\x03\x17\
+\xba\x4d\x4c\xba\x56\x09\x07\x0e\xf1\x37\x44\x67\x40\xc9\x43\x13\
+\x5a\x4a\xaa\x50\x1c\xb6\x90\xf6\x0c\xc0\x75\x53\xea\x2a\xf7\x71\
+\xce\xc9\x2e\xe3\x5d\x60\xee\xe8\x85\x2d\xe5\x79\xaf\xb5\x17\xb9\
+\x97\x0a\xab\x4d\x8f\x5b\xdd\xcb\xe2\x56\x9a\x9f\xec\x9d\xf6\xe5\
+\xf5\x49\x52\x39\xf9\xc7\x82\xe9\xa3\x91\x94\x57\x09\xb1\x2d\x81\
+\x29\x14\xe4\x6e\x9d\x01\xa5\xf5\x26\x34\xde\xa9\xc0\xbd\xf0\x45\
+\xb4\xa7\x00\x97\x35\x89\x2b\xc7\x78\x8d\x3e\xab\xf0\x74\x41\x5b\
+\x9f\x38\x9b\x89\x4e\x73\x27\xae\x9e\xcf\xd5\xd5\x9e\x0e\x92\x0f\
+\x94\xd1\xe4\x3d\x39\x2a\x67\x85\x50\xed\x3f\x47\x89\x93\x54\x25\
+\x22\x1b\x16\x5e\x55\x52\xf3\x87\x0a\xfd\x7e\x43\x1b\x74\x85\xf7\
+\x51\x11\xe9\x4f\xa3\x39\xad\x48\x08\xf3\x59\xe0\x15\x62\xe1\x70\
+\xc1\xb4\x82\x9a\x29\x04\x3a\x8c\x66\x14\x5e\xd6\xa8\xab\x93\xde\
+\x1e\x72\x5c\x7b\x7f\x7c\x49\xa5\x18\x2b\x51\x2f\xf1\xf3\x40\xc2\
+\xb5\x72\x88\x46\x10\xf0\x55\x8a\x70\x87\x82\x94\x53\x8f\xa0\xec\
+\xe2\x6f\xbb\x68\xde\xbb\xb3\xad\x84\x8b\x0c\x04\xac\xe0\xb0\x19\
+\x30\xd5\x1b\x50\x91\x7f\x2b\xa5\x3e\x75\x83\x6a\xb8\x1e\xe9\x5b\
+\x9e\x5b\xb3\x54\x2e\x6e\x4e\xea\xb7\xfc\xc7\x23\x3e\xb7\x1c\x7c\
+\x16\x01\x37\x19\x89\xa2\xd2\x26\x68\xb3\xf3\xb7\xd0\xe4\x6b\x4f\
+\xe5\x92\x53\xbc\xa7\xb3\x6d\x98\xe8\x6e\xd4\xa3\x41\x5b\xb2\xb5\
+\x2e\x25\x38\xea\x79\xc4\x9f\xe6\xb7\x31\x5d\xa5\xf0\x90\xa9\x57\
+\x2e\x9f\x80\x26\xa3\x05\x0f\xea\x8c\xf8\x39\x2d\x4f\x57\x7e\x62\
+\x85\xfc\xaf\x0c\x9c\x83\x4e\xe5\x32\x47\x92\xd3\x3b\x9b\x1f\x2f\
+\xd3\xa9\xd7\x65\xbc\x88\xf8\x93\xa5\x08\x4a\x5e\x26\x73\x95\x26\
+\xdb\x4b\x48\x1b\xcd\xaf\xb7\xaf\x55\x27\xad\x99\xd1\xf7\xff\x4f\
+\x77\x06\xf5\x4d\xcf\x98\x46\x0e\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x05\x2c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xf3\x49\x44\x41\x54\x78\xda\x95\x95\x7b\x6c\x14\x55\
+\x14\xc6\xbf\xbb\xcf\x96\x76\x61\xe9\x16\xd4\x56\x62\xa5\x81\x34\
+\xa5\x62\x00\xb1\x12\x1e\x49\x2d\x09\xb1\x18\xa0\x40\x89\xa0\xfe\
+\x69\x52\x45\xd0\x04\x83\x11\xe4\x15\x91\x87\x89\x10\x21\xb1\x31\
+\x51\x13\x48\x0c\x44\x54\x44\x89\x46\x49\x70\x85\x56\x85\x8a\x3c\
+\x34\x94\x67\x69\x0b\x5d\x68\x69\x77\xbb\x3b\xcf\x9d\xdd\xb9\xd7\
+\x33\xb3\xdb\x6d\x71\x8b\xd6\x3b\xb9\xb3\x93\xbd\xe7\x9e\xdf\xf9\
+\xce\x39\x73\x87\x61\x18\xa3\xa1\xa1\x41\x30\xc6\x50\x5f\x5f\xcf\
+\x86\x63\x3f\x78\xfc\xe7\x86\x60\x30\x28\x2a\x2a\x2a\x20\x49\x12\
+\xda\xda\xda\x50\x55\x55\xf5\xbf\x20\xff\x6a\x7c\xeb\xd6\x2d\x51\
+\x54\x54\x84\xdd\xbb\x77\xa3\xb2\xb2\x12\x33\x67\xce\x44\x28\x14\
+\x42\x71\x71\xf1\xb0\x21\xf7\x35\xbc\x7e\xed\xb2\x18\x5f\x3a\xd1\
+\x7e\xde\xb1\x63\x07\xa6\x4f\x9f\x8e\xea\xea\x6a\xc8\x52\x04\x3d\
+\x61\x09\x8f\x96\x3c\x32\x2c\x88\x6d\xc4\x0f\x2d\x10\xcc\x3f\x0e\
+\xd0\x3b\xd1\x6a\x4c\x84\x5a\xb9\x13\x15\xc5\x80\x61\x18\xf0\x78\
+\x3c\x19\xe3\x44\x22\x0e\xb7\xdb\x6b\x3f\x9f\x6c\xfc\x19\xfa\xe7\
+\x2b\x30\x6d\xbc\x0f\x05\x05\x01\xc8\xd1\xdb\xf0\xad\xbe\x91\x05\
+\x65\xfc\x8b\x45\x02\x55\x2f\x83\xf5\x36\x01\x42\xc5\xc5\xf6\x7c\
+\x74\x17\xd6\xe3\xc9\x09\x39\xe8\xba\xdb\x03\x87\xc3\x49\xff\xa7\
+\x8d\x69\xbb\x83\x99\xf0\x8f\x2d\x45\xf0\xf8\x77\xe8\xfa\x71\x2d\
+\x5e\x98\xfd\x30\xbc\x85\x05\x40\x2c\x0e\xb9\xfd\x3c\x7c\xab\xae\
+\xb3\x2c\x00\x9b\x36\x07\x68\x3d\x02\x8c\x2a\xc4\x6f\x2d\x01\x1c\
+\xe9\xae\x45\xf5\xe4\x11\x88\x28\x1a\x99\x38\xb2\x64\xe7\xe4\x3f\
+\x80\x93\xbf\x34\xa2\xa4\x63\x0f\x5e\xa9\x21\xa9\x8e\x3c\x0a\x82\
+\x43\xbe\x79\x89\x54\x64\x01\x6a\x05\x9b\x3a\x1b\xb8\x7d\x0a\xf0\
+\x07\xd0\x7a\x93\xe3\x8d\x8f\x25\xa8\x4a\x0f\x7c\x5e\x2f\xb9\xa7\
+\xf0\x49\x84\xc7\xcd\xe1\x37\xef\x80\x1b\x2a\x0c\x91\x8b\x48\x4c\
+\xc6\x47\x8b\xe3\x08\x4c\x09\x50\x6a\x39\x60\x92\xd1\xb5\x4e\xb0\
+\x57\xef\xfc\x03\xf0\xe5\x62\xc1\x1e\x9f\x01\x84\x9a\x29\xb4\x51\
+\x40\x1e\x47\xe8\x6a\x3b\x7e\xfd\xb3\x0b\x85\x39\x6e\x72\xce\xe0\
+\xe1\x49\x14\x68\x17\xb1\x92\xfd\x80\x15\xb3\xc6\x40\x33\x38\x62\
+\x7a\x02\x7d\x72\x12\x51\x29\x8e\xb0\xa2\xa3\x4f\xa3\x49\xd0\xe6\
+\x9d\xcf\x0f\x01\x78\xec\x09\x02\xfc\x01\xb8\x7d\x56\xc9\x81\x31\
+\x39\x80\x8f\xa6\xa0\xf4\x70\x83\x26\xa5\x2a\x5c\x80\xe5\xc1\x1a\
+\x1c\x78\xad\xca\xde\x68\x26\x4c\x84\x25\x0d\xdd\x51\x19\x1d\x11\
+\x09\xa1\xbb\x31\x1c\x3b\x7f\x1d\x8a\x66\xe0\xe8\xe6\x17\xd9\x20\
+\xc0\x12\xc1\xca\x27\x53\x8a\x2e\x10\x80\x72\x69\xa5\x24\x69\x4d\
+\x9e\xb2\x70\xd1\xaf\x8b\x40\x52\x2b\x9e\xbb\xfc\x0e\x0e\xbe\xfe\
+\x34\x38\x37\xa1\x11\x20\x22\x25\xa0\xa8\x3a\x7a\x65\x05\x9d\x3d\
+\x2a\xce\xb4\x76\x62\xcd\xe2\xa7\xb0\x79\x7f\x10\x1f\xae\x5a\xc0\
+\x06\x00\x65\x65\x40\x77\x0b\x15\x6b\x04\x06\x5a\x26\x1d\x82\x93\
+\xa7\x0a\x2d\xdd\x40\xdd\xb9\x4d\x38\xf4\xe6\x5c\x70\x72\xce\x69\
+\x5d\x37\x4d\x44\xe5\x04\x64\x4a\x51\x44\xd6\x71\xe2\x4a\x3b\xd6\
+\x2e\x9a\x85\xae\x68\x0c\xef\x7e\xd6\x88\xbd\x2b\xe7\xb3\x14\x60\
+\x7c\x29\xa5\xe0\x2a\xf9\xc9\x1d\x00\xf4\x0f\xa7\x49\x0a\xa8\x16\
+\xbd\xd7\xf0\xec\xc5\x4d\x38\xba\x76\x9e\x0d\x30\xd3\x6d\xab\xc7\
+\x19\xa2\xba\x0e\xd5\xd0\x71\xb5\xb3\x17\x7f\xdd\xec\x46\xb4\x4f\
+\x43\x67\x58\x41\xb8\x4f\x22\x05\x5f\x2d\x15\x6c\x1c\xb5\x5a\x5f\
+\xdb\xbd\x00\x2e\x52\x8f\x1e\x91\x92\x23\x77\xe0\x99\x33\xeb\xf1\
+\xfd\xc6\xf9\x04\x48\xda\x00\xdb\x8c\x96\x34\x93\x43\x8d\x6a\x90\
+\xe3\x49\x84\x75\x0d\xbd\x61\x15\x52\xd2\xc4\x9e\x43\x41\x0b\x50\
+\x27\x58\xd1\x58\x02\x74\x50\xb4\x69\x80\x48\x3b\xb7\xa6\x9b\x6e\
+\x2e\x97\xad\xb0\xea\xec\x06\xfc\xb4\x65\xa1\x0d\x88\x5b\x4b\xfd\
+\x85\x24\x29\xb2\x61\x42\xa6\xce\x92\x65\xab\xa3\x54\x24\x84\x89\
+\x8d\xfb\x8f\xf1\x14\xe0\x41\x3f\x01\x6e\x93\x02\xef\x10\x29\xa2\
+\x1a\x78\xa9\xa3\xee\x5e\xc2\xac\xdf\xd7\xa1\x71\x5b\x1d\xe2\xc9\
+\x24\x92\xf6\xa2\xb0\x5e\x91\x4c\xb9\x74\x8d\x43\x49\x68\x08\xcb\
+\x1a\xf2\x68\xcf\x4b\x1f\x1c\x26\xc0\x61\x02\x8c\xa6\xe2\x2a\xe1\
+\x81\xb7\x96\x0d\x6a\x65\xa7\xf5\xa2\x91\x82\xde\x16\x4c\x3e\xbd\
+\x11\xcd\xdb\x6a\xa1\xe9\x86\x0d\x70\x39\x5c\x04\xa0\x35\x97\x00\
+\x3d\x12\x88\x41\xd7\x4d\x3a\xda\x55\x04\xfc\x39\x58\xb4\xf5\xa0\
+\x05\x58\x26\xd8\x28\x5a\x95\x63\xe4\x3f\xfb\x58\xc8\x28\xe8\x69\
+\xc1\xa4\xa6\xf5\x68\x7e\x6f\x29\x12\x49\x02\xa4\x8b\x20\xe8\x72\
+\x09\x02\xd1\x99\xe5\xa4\x9c\xf1\x24\x41\xb8\x8e\x42\x5f\x3e\xe6\
+\x6d\xd8\x97\x06\xe4\xb3\x14\xc0\xe9\x4c\xef\x12\xfd\xbb\xa9\xc8\
+\x48\x29\x53\x6e\x60\xd2\x89\x75\x38\xfb\xfe\xd2\x8c\x82\x4c\x0c\
+\x56\xa2\xc8\xc4\x65\xa9\xb1\xfb\x43\x60\x64\xbe\x1b\x35\x6f\x7f\
+\x42\x80\xaf\x97\x51\x10\x96\xb8\xbe\x21\x0f\x36\x4b\xbe\xdd\x51\
+\xd1\x4b\x28\x3b\xbd\x1d\x17\x76\x65\x03\xfa\x87\xad\x86\x2e\x41\
+\x80\xd1\x23\x73\x31\x2f\x03\xb0\xb2\x67\x46\x70\xcf\xf7\xa7\xbf\
+\x93\x2c\x05\x8c\x22\x8c\xb6\xa0\xfc\xd4\x76\x9c\xdb\xb5\xe4\xbe\
+\x00\x6e\x72\x1b\xc3\x28\xd5\x85\x23\xf3\x31\xf7\xad\x4f\x53\x29\
+\xb2\x1c\x31\x25\x44\x37\xc7\xd0\x00\x0b\x1c\x6f\x45\x49\xd3\x56\
+\x5c\xd9\xbb\x1c\xca\x10\x00\x4e\x47\x0b\xbd\x73\x76\x57\x39\x38\
+\xc7\x43\x01\x3f\xe6\xac\x69\xe0\x4c\x50\x9b\x62\x4a\x09\x39\x30\
+\xb2\x3f\xa0\x19\x00\x8d\xb8\x17\x79\x5b\x8a\xa1\x1c\x58\x8d\xe1\
+\x8e\x85\x5b\xf6\xa5\x5c\x7e\xb3\x6d\xaa\xe0\x5d\xe2\x1e\x01\x03\
+\x0c\x06\x9f\x53\x43\x2c\xaf\x1c\xb5\xdf\x96\x62\xc6\xdc\x09\x50\
+\x55\x0d\xce\x41\x41\x08\x4a\xa1\xc7\xe5\x1c\xd4\x23\x02\xb9\xb9\
+\x5e\x71\xfc\xf8\xb9\xc4\xdf\x44\xc4\x6b\x94\x6a\x10\x0a\xf2\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x1e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xe5\x49\x44\x41\x54\x78\xda\xad\x95\x6d\x4c\x5b\x65\
+\x18\x86\xef\xd3\xaf\x33\x3a\xca\xca\x47\x1c\x2b\xfd\x64\xd0\x8d\
+\x95\x8f\x98\x42\xfc\x61\x1a\x96\x40\xe6\x92\xb1\x2c\x03\xdd\x50\
+\x08\x3f\x98\x66\x89\xb2\xa9\x71\x51\xe3\xe2\xd4\x88\xba\xb8\x64\
+\x1a\x11\x17\x5d\xb6\x1f\x0b\x0e\x17\xb3\x18\x13\xf7\x63\x34\x46\
+\x43\xc2\x42\xd8\xfc\xa1\x18\x23\x03\x3a\xe0\xb4\xd0\x96\x8f\x42\
+\x69\x7b\xda\x5a\x7a\x7c\xce\x69\x68\x33\x15\x37\x06\x27\x69\xd2\
+\xbc\xa7\xbd\xaf\xf7\xbd\xef\xe7\x79\x5e\x06\x9b\xf4\x5c\xbd\x76\
+\xdd\xa1\xd5\x6e\x73\xf2\x3c\xcf\x42\x00\x9a\x0e\x1f\x64\xc4\x75\
+\x66\x33\xc4\x2f\x5e\xbe\xd2\x55\xeb\x78\xb2\x23\x2f\x57\x8b\x81\
+\xc1\xdb\xe0\x23\x11\x34\x1f\x69\xdc\x38\xa0\xfb\xcb\x4b\xea\xac\
+\x2d\x5b\x46\x0e\x35\xec\xd7\x6b\x34\x1a\x4c\xcf\x78\xf1\xeb\xf0\
+\x1f\x58\x5a\x5a\x42\x5b\xcb\xd1\x8d\x01\xce\x7f\xda\x5d\x5f\x5a\
+\x52\xe2\x7c\x6a\xdf\x5e\xac\xac\x08\x88\xc6\x62\x98\x9c\xe2\x30\
+\xc5\x79\xe0\xf7\xf9\xf0\x7c\x7b\xdb\xa3\x03\x3a\x3b\x3f\xee\x3a\
+\xd0\xb0\xbf\xa3\xdc\xb6\x1b\xd1\x68\x0c\xc1\xe5\x65\x08\xe4\xfb\
+\xec\xdc\x3c\xdc\x9e\x19\x70\x1c\x87\x17\x8f\x1f\x5b\x3f\xe0\xbd\
+\xce\xb3\x6a\x96\x55\x8d\xb4\xb5\x3e\xa7\xd7\x6a\x73\x10\x89\x44\
+\x11\x0c\x2e\x22\x99\x94\x41\x2e\x67\x30\x3f\x1f\x80\xd7\x3f\x0b\
+\xd7\x98\x0b\x27\x4f\x1c\x5f\x1f\xe0\xcd\xb7\xce\xd4\xef\x29\x2b\
+\x73\x36\x35\x1e\x44\x92\x2c\x59\x5c\x0c\x22\x14\x09\x83\x61\x52\
+\x12\x32\x19\x83\x39\x02\x88\xa7\x18\xfd\xf3\x2e\x4e\x9d\x3a\xf9\
+\xf0\x80\x97\x5e\x7e\xad\xeb\xc8\xd3\x8d\x1d\xd5\xf6\x2a\xf0\x7c\
+\x1c\x3e\x9f\x1f\x7f\x25\x12\x69\xf1\x14\x40\x06\xbf\x77\x16\x1e\
+\xaf\x17\x93\x13\xf7\xf0\xf6\xe9\x37\x32\x80\x57\x5e\x7d\xbd\xb3\
+\xa0\xa0\xe0\xb4\xbd\xfa\x71\xa8\xb3\xd4\xe4\x67\x32\xfd\x27\xb7\
+\xdb\x83\xca\xca\x0a\x18\x0c\x3a\xaa\x8e\x10\x7c\x7e\x3f\xbd\x17\
+\xee\x13\x5f\xfd\xed\xb4\x87\xc4\xdd\x53\x98\xa1\x1c\x3e\x78\xff\
+\x4c\x06\xf0\xe1\x47\xe7\x84\x96\x96\xa3\xd8\xba\x35\x1b\x39\x39\
+\x9a\x34\x40\x2e\x93\x63\x6c\xdc\x05\x8d\x26\x9b\xbc\x0e\x61\x6e\
+\x61\x01\x0c\x09\xfd\xd7\xb1\x45\x00\x37\xc1\x61\xfc\x9e\x8b\x6c\
+\x9a\xc5\xf9\x73\x67\x33\x80\x8b\x5f\x5d\x12\xf4\x46\x23\x14\x72\
+\x05\x4a\xac\x3b\xc9\xe3\x14\x40\xa5\x54\xa2\xe7\xea\x35\x58\xcc\
+\x26\xec\xd0\x15\xd2\x8a\xb0\xa6\xab\x72\xb9\x0c\x63\x77\xc7\x31\
+\x32\x3a\x8a\xe5\x60\x10\x9f\x77\x7d\x92\x01\xb4\x1f\x7b\x41\x60\
+\xd9\x2c\x54\xd7\x54\xa3\xaa\xb2\x92\xea\x7a\x25\x05\x50\xa9\xf0\
+\x45\xf7\x05\x94\x93\x45\xa5\x56\x2b\xad\x27\xd7\xcc\x49\x02\x90\
+\xb8\xf8\xe1\xf9\x08\x6d\xfa\x42\x06\xd0\xda\xd6\x2e\xa8\x54\x72\
+\x58\x77\xdb\x50\xb6\x6b\xd7\x7d\x80\xde\xde\xaf\x51\xb6\xa7\x1c\
+\xc5\xc5\xc5\x54\x8e\x6b\x03\x44\x8b\x5c\x2e\x17\x5c\xe3\xa3\x88\
+\xc7\x13\xe8\xb9\x72\x39\x03\x68\x7e\xb6\x55\x10\x43\x2b\xdc\xae\
+\x43\xa1\x5e\x97\x16\x52\x28\x14\x18\xba\x35\x80\x9d\xa5\x56\x98\
+\x2d\x0f\x06\x4c\x90\xff\x62\x05\x89\x45\xf0\x4d\x6f\x4f\x06\x70\
+\xb8\xe9\x19\x21\x49\xc1\x6a\xb2\x35\xc8\xd6\x6c\x83\x90\x5c\xad\
+\x22\x39\x38\xf7\x04\x2c\xa6\x62\x98\xcc\x96\x07\x02\x44\xf1\x29\
+\x6e\x52\xfa\xfe\xdd\xf5\x6f\x33\x80\x03\x0d\x87\x7e\x27\xaa\x4d\
+\xdc\xb1\x52\xa9\x90\xda\x5e\x7a\x49\xa7\x0a\x85\x82\x54\xa2\x66\
+\x18\x8d\x26\x24\xa8\xf6\xff\x0f\xc0\x91\xb8\xc7\xe3\xa6\x3c\x14\
+\xb8\xf1\xc3\xf7\x0f\xdf\x68\x75\x75\xfb\xee\x18\x8c\x06\xfb\x63\
+\xdb\x77\x48\xf9\x08\xab\x3b\xf8\x07\xc0\x3b\xed\x81\xd7\x3b\x23\
+\x75\x75\x5f\xdf\xcd\xf5\x8d\x8a\xda\xbd\x75\xef\xaa\xd5\xea\x77\
+\x2c\x16\x33\x59\xc5\xfc\x0b\xc2\x30\x32\x04\x16\xfc\x58\xa0\x5e\
+\x49\x24\x05\xfc\xf4\x63\xdf\xfa\x87\x9d\xc3\x51\xab\x27\xa1\x11\
+\xbd\xde\xa0\x56\xb0\xac\x94\xd5\x2a\x46\x46\x76\x06\x97\x97\x10\
+\xa6\x1e\x88\xd1\xe8\xee\xef\xff\xf9\xd1\xc7\x75\x4d\xcd\x13\xce\
+\xdc\xbc\xfc\x7a\x1a\x2f\x69\x88\x98\x57\x24\x1c\xa2\x1e\xe0\x11\
+\x0e\x47\x30\x30\xd0\xbf\xb1\x0b\x87\x20\x27\x94\x2c\xfb\x99\x4e\
+\xa7\x23\x91\x94\x4c\x94\xc4\xe3\xf1\x98\x74\xa3\x0d\x0e\xde\xda\
+\xf8\x95\x69\xb7\xd7\x18\x29\x8b\xfe\xa2\xa2\x22\x53\x16\xcd\x31\
+\x3e\x1c\x96\x00\x81\x40\x00\x43\x43\x83\x9b\x77\xe9\x57\x54\x54\
+\xf5\xe6\xe7\xe7\x37\xe7\xe6\xe6\x81\x8f\x46\x30\x47\x97\xce\x9d\
+\x5f\x6e\x6f\x1e\x40\x7c\x6c\xb6\x72\x87\x52\xa9\x74\x52\x16\xac\
+\xd8\x2f\xc3\xc3\xbf\x49\xda\x7f\x03\xbe\x7e\xb0\x28\x44\x83\xd6\
+\x3c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xb1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x78\x49\x44\x41\x54\x78\xda\xa5\x96\x6b\x48\x93\x51\
+\x18\xc7\xff\xe7\x7d\x37\x33\x8d\xcc\x72\x6a\x11\x96\x95\x78\x2b\
+\x67\xae\x2c\xac\x28\xb2\xab\x11\x41\x57\x97\xd4\xa7\x32\xa9\x3e\
+\x04\x92\x85\x45\x58\x9f\xa2\x88\xa8\xe8\x42\x51\x7d\x29\x27\x41\
+\x14\x15\xdd\xec\x9e\x51\xd8\x45\xd3\xbc\x34\x2b\x95\xdc\xa6\x0d\
+\x97\xb3\xe5\xe6\x2e\x9e\xce\xd9\x94\xf6\xaa\xe5\x9c\x0f\xec\xc3\
+\xce\xfb\xec\xff\x7b\x9f\xe7\x7f\xce\x73\x46\xd0\x1d\xea\x7b\xcd\
+\x34\x26\x44\x06\x57\x17\x86\x14\xa2\x00\xd4\x99\x9d\xd0\x2c\x8f\
+\x24\xfc\x3b\xe9\x79\xb0\xaf\xc4\x48\x33\x13\x42\xd1\xe1\xa0\x43\
+\x02\xc8\x05\x82\xab\xd5\x26\x1c\x9b\x1f\x2e\x05\xec\x79\xd6\x42\
+\x57\xc7\x8f\x86\x79\x88\x25\x70\xc0\x8d\x2a\x13\x4e\xa6\xf7\xaa\
+\x60\xf7\x63\x3d\x5d\x93\x18\x86\x36\x17\xfd\xbb\xe8\x15\xc4\x47\
+\x80\x4c\x24\xb8\x5e\x69\xc2\xe9\xc5\xbd\x00\xb9\xc5\x7a\xba\x4e\
+\xa9\x40\x5b\xa7\xab\x8f\xf0\xaf\x4e\x07\xe4\xac\xb9\x84\x0c\x0c\
+\x92\xb1\x0a\x6e\x55\xb7\xe1\xec\xb2\x71\x52\xc0\xa2\x4b\xda\xc6\
+\xec\x39\x91\x51\x21\xc1\x01\xcc\xe8\xbf\x3e\x70\x51\xe3\x2f\x3b\
+\x2e\xbc\xd4\xc3\xd2\x49\x99\x89\xdd\x94\x7f\x58\xc5\x1f\xf1\x9c\
+\x37\xdb\xe3\xa4\x00\x1e\xe9\xe7\x6b\xea\xd7\xcf\x0c\x9f\x18\x15\
+\x16\x0c\xa7\x97\x17\x5c\x93\x52\x8a\xcb\xaf\x0c\xd6\xc6\xe6\x8e\
+\xc8\x77\xb9\x49\xed\xbe\x7a\xd2\xa7\xe2\x99\xc7\x2b\xae\xae\x4d\
+\x8d\xd8\x98\x14\x15\x02\xbb\xd3\x1b\x42\x58\x65\x6c\xfb\xbd\x6e\
+\x86\x56\xf7\x3b\xab\x2c\x2f\xb9\xd0\x2f\x00\x8f\x19\x47\xcb\x0a\
+\x33\x54\x0a\xb5\x2a\x3a\x14\x2e\xea\x69\x87\xa7\xff\x84\x99\x08\
+\xdc\xff\xd8\x8c\x92\xca\x9f\xea\xf2\x7d\xaa\x22\xbf\x00\x3c\x12\
+\x0f\x96\xee\x9c\x9d\x10\x7a\x6a\xee\xd4\xb1\x2c\xa9\x0b\xad\x36\
+\xb6\xbb\x18\x68\x44\x00\x41\x20\xfb\xdc\x2d\x35\xa0\xb6\xa1\xed\
+\x60\xf9\xfe\xd4\x02\xbf\x00\x3c\xa6\x15\x94\x66\xca\x82\x65\x1a\
+\x65\xf2\x78\x04\xca\x45\xf7\x1a\x05\x75\x57\xc2\x9b\x57\xa7\xfd\
+\x81\x56\x7d\x7b\x51\x45\xc1\x2c\xb5\x5f\x00\x1e\xf1\xf9\x25\xe7\
+\xd2\x94\xe1\xdb\x02\x23\xc6\xc0\xc6\x8c\x27\x5e\x3f\x0c\x18\x26\
+\xc3\xeb\x17\x5f\xe0\xb4\x39\x16\x54\x1c\x4a\x7b\x3e\x68\x40\x7c\
+\xfe\xcb\x4c\xc5\xe8\xe1\x9a\xf4\x79\x93\xa0\x35\x3b\x20\x78\x6d\
+\x4d\x51\x2e\x40\xfb\xc9\x00\xb3\xde\x5c\x54\x75\x78\xde\xe0\x2b\
+\x88\xcb\x7d\xaa\x56\x28\x82\x0a\x37\x2c\x8b\xc5\xb3\x26\x1b\x64\
+\x5e\x99\x22\x73\xfa\xeb\x27\x1d\x13\x37\x69\x6a\x8e\x2d\xdc\x38\
+\x68\x0f\x62\x77\x3d\x5a\x32\x26\x2c\xe8\xc1\xfa\x8c\x38\x14\x37\
+\x58\x99\x38\x71\xef\x22\x8f\xb8\x80\x46\x26\x6e\x31\x98\x34\xb5\
+\x27\x16\xff\x57\xbc\x5f\x40\xcc\xce\x87\x13\x04\x91\x34\xa8\xd7\
+\x25\xe3\x95\xc1\xe6\x3e\xfa\x3d\x49\x02\x7b\x73\x5d\x55\x13\x7e\
+\xeb\x4c\x1a\xed\xe9\xa5\x03\x8a\xf7\x01\x4c\xc9\xb9\x3b\x91\x89\
+\xd4\x67\x67\x4d\xc7\x03\xd6\x16\x7e\x98\x7b\xce\x3b\xa1\x04\x86\
+\x0f\xf5\x70\xb4\x5b\x34\xda\xb3\x19\x3e\x89\x4b\x00\x93\xb6\xde\
+\x89\x26\xa2\xf8\x6d\xcb\xa6\x14\xdc\x6f\x64\xe2\x7c\xaa\x12\x4f\
+\x06\x65\xe2\xc6\xb7\x5a\x38\xad\xf6\x33\x5f\xcf\xaf\xd8\xe1\xab\
+\xb8\x04\x10\xb5\xf9\xba\x65\x6b\x76\x5a\xf0\xed\x6f\x9d\xa0\xdd\
+\xe2\x7c\xd3\xd8\xed\x2e\xfc\x74\x8b\x5b\xd9\xda\xc0\xe3\x94\x37\
+\x54\xce\x7c\xaa\xbf\xb4\x4a\x3a\xec\xd2\x0e\xbc\xa0\x23\x95\xd1\
+\xd0\xb5\xda\x20\x08\x9e\x65\x27\x9b\xaa\x39\xaa\x51\xb0\x5a\x6c\
+\x4c\x5c\xf0\xe9\x8d\x65\x4c\xfc\xca\xcd\x6a\xbc\x3f\x92\x2e\x05\
+\xa4\xe6\x3f\xa1\x41\x29\x93\xa1\x33\xda\xdc\x83\x8d\x07\xed\xf2\
+\x40\xa8\xaf\xb7\x0d\x17\x64\x00\x7b\x59\x1d\x9a\xce\x65\x48\x01\
+\xaa\xbd\xc5\x74\x98\x32\x06\x4d\x46\x2b\x04\x9f\xef\xaf\xfe\x4a\
+\x10\xe0\x28\xfb\x0c\xdd\x85\x95\x52\x40\x4a\x5e\x31\x15\xa7\xc7\
+\xe2\x7b\x4b\x87\xfb\x9f\x81\xbf\x41\x59\x2b\x69\x79\x0d\x0c\x17\
+\x7b\x79\x30\x4e\x5d\x44\x31\x3c\x10\x0e\x47\x97\xef\x17\x70\xbf\
+\x3d\x22\x10\xac\x1d\x68\xb9\x96\xe5\x56\xf9\x03\xb7\xb8\x51\x28\
+\x1d\x72\x6e\xf9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x05\xfa\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xc1\x49\x44\x41\x54\x78\xda\x85\x56\x6b\x6c\x14\x55\
+\x14\xfe\xe6\xb1\xbb\xdd\x3e\xa0\xf4\xb1\xa5\x50\xa0\x8b\x08\x62\
+\x02\x15\x42\x40\x68\x88\x81\x0a\xf2\x50\xc1\x28\x8f\x82\xa2\x21\
+\x90\x02\xc5\x10\x7f\x98\xc8\x4f\x63\xf8\xa3\x09\x18\x6c\x23\x10\
+\x12\x89\x0a\x02\x86\x84\x80\x12\x45\xc1\x52\xc1\x17\xd0\x16\x21\
+\x22\xd8\xb0\x80\x74\x4b\xb7\x65\x4b\xa1\xfb\x9a\x9d\x99\xeb\x77\
+\x67\xb6\x05\x83\xc8\x4d\x66\x67\xee\xcc\x3d\xdf\x77\xce\x77\xce\
+\xb9\x77\x15\xfc\xcf\x98\xb8\xef\xe6\xcc\x49\xa5\xde\xc5\x59\x1e\
+\x6d\x76\x65\xa1\x1a\xcc\xd1\x14\x74\x9b\x02\x67\xba\x6d\x14\xea\
+\x22\xf4\x43\xd8\x3c\x1a\x4f\x59\xfb\x7f\x5d\x54\x72\xfc\x61\x18\
+\xca\x7f\x02\xef\x69\x9f\x50\x9c\xa7\x9f\xda\x3a\x35\xd7\x3f\xba\
+\x30\x0b\xe7\xbb\x2d\x3c\x96\xc3\xa5\x16\xc1\x7b\x05\xb2\xf8\x38\
+\xd4\x23\x10\x32\x80\x1b\xdd\x49\x1c\x0b\xa7\x13\xcd\xed\x46\xe5\
+\xd9\x65\xa5\xcd\x8f\x24\x78\xe6\xcb\xf6\xba\x3d\xb3\x06\xd5\x1a\
+\x8a\x8e\xf2\x01\x1a\x60\x03\x0d\xb7\x2c\x24\x6d\x09\x2c\xd0\x6b\
+\x29\x50\x68\xc5\x29\x7c\xfc\xfc\xb8\x07\x08\xe8\x02\x0d\xe1\x14\
+\x36\x9f\x8f\xd7\x1f\x5f\x54\xb2\xfe\xa1\x04\x6f\x35\x76\xee\xdd\
+\x5c\x59\xb0\x44\xbe\x16\xbc\x14\x55\x38\xef\xbb\x12\x36\x7e\xba\
+\x2d\x40\x85\xfa\x0d\x24\xc1\x14\xbf\x0d\x93\x0e\x40\x08\x78\x55\
+\x20\xca\x75\x2b\x1b\xbb\xf7\x9d\xac\x1e\xba\xf4\x01\x82\xe9\x5f\
+\xfc\x5d\xd7\xf8\x4a\x69\x6d\x5a\x62\xd2\x45\x8d\x97\x4a\x0f\x13\
+\xd4\xdc\xc3\xe7\x23\x11\x13\xba\x72\xcf\x1f\xb9\x2c\x4e\xf0\x59\
+\x39\x36\x0c\x4a\x67\x49\x46\xa1\xa0\x27\x99\x46\xcd\x8f\x3d\xf5\
+\x8d\xcb\xcb\xd6\xf7\x13\x8c\xfe\x28\x34\xe1\xfb\xa5\x25\x4d\x25\
+\x03\x7c\x54\x44\x40\x25\x90\x57\x57\xf1\x57\x8f\x85\x14\xbd\x6b\
+\x4d\x00\x1e\xf5\xdf\xe1\x12\x13\x53\x19\x01\x55\x43\x9c\x13\x8d\
+\xeb\x6c\x92\xe8\x5c\xd4\xd8\x91\xc2\x7b\x27\x7b\x26\x5e\x58\x57\
+\xde\xec\xd8\x6c\x3d\xd3\x15\x5f\x37\x3e\xdf\x6f\xd8\x2e\xb8\x94\
+\xa2\xc7\x04\x4e\x44\xdd\xd0\xd5\xfb\x90\x45\xe6\x27\x49\xef\x2b\
+\xb3\x6d\xe8\x72\x4a\xbb\x70\x1a\xc8\x51\x5c\x92\x7c\x46\xfe\xf6\
+\x2f\xd1\xc4\xa7\x0b\xca\xb2\x95\xb1\x5b\x2e\xcd\x7c\x7f\x4e\xc9\
+\xb1\x67\x47\xe4\xc8\x7c\x82\xb9\x42\x36\xad\x9a\x58\x2d\x82\x21\
+\xf7\x83\x0b\x27\xdf\xce\x83\xc5\x6b\x10\xdf\x57\xf8\xd1\x2f\x8f\
+\xb0\x65\x54\x7c\x96\xa1\xf1\xdb\xb9\xae\x14\x36\x1e\xeb\xac\x52\
+\x9e\xfa\xf0\xcf\x6d\xbb\x5e\x1b\x59\x53\x40\xf6\x00\xeb\xef\x7c\
+\x0c\x28\xf0\x28\xf0\x33\xc1\xed\xf4\xaa\x23\xad\x20\x2d\xf5\x85\
+\x24\x74\x93\x9b\x26\xd8\x9c\x7c\x82\x33\x4a\x09\xee\x02\xcb\x6f\
+\xb6\x73\x17\x9c\x67\x53\xab\xe5\x5f\xb5\x6f\x57\x26\x7f\x7c\xf9\
+\xca\x07\x4b\x46\x05\xdb\x62\x26\xc6\x64\x41\x36\x10\xf2\x49\x70\
+\x99\xba\x0f\xa4\x3c\xa1\x94\x8d\xbb\x2c\x4d\xb5\x4f\x7b\x82\xa7\
+\x08\xb4\xb0\x40\x43\x8c\x4c\x52\x12\x49\x2a\x89\xe4\xb3\xbc\x1b\
+\x9c\xe7\x31\xf4\x0d\x0d\x91\x90\x52\xf5\xc9\x15\xb1\x7a\xce\x30\
+\xb4\xf6\x5a\x4e\x82\x06\xf1\xc3\x0b\xf4\x2e\xd7\xeb\xca\xd3\x46\
+\xa2\x73\x31\x1a\x32\x42\x45\xb8\x51\x18\xf4\x72\x6a\x9e\x82\x22\
+\xdd\x8d\xce\x95\x49\x92\x21\x53\x4d\x02\xdd\x74\x6a\xe5\xa1\x36\
+\x28\x4b\x0f\x5c\x13\x33\x26\x95\x22\x92\xb4\x1c\xe3\x14\x8d\xa7\
+\xd3\x78\x1a\x45\x36\x6d\x97\x24\x46\xa9\x0e\x47\xd3\x30\xfb\x72\
+\x92\x59\x27\xbb\xf9\x26\xb3\x3d\xaf\x50\x87\x87\x19\x4a\x5b\x6e\
+\x2e\xd8\x7b\xf8\x86\xdd\xbf\xf3\xe7\x2e\x28\x6f\x1c\xba\x21\x26\
+\x8d\x0b\x20\x92\x30\x21\x2c\x37\xfc\xf9\xf9\x2a\xc6\x0f\xd0\x09\
+\xe8\x36\x9a\x04\xf5\x30\x73\xe7\xee\xa4\xb1\xab\xdd\x64\x49\x2a\
+\xb0\x2d\x38\x5e\x27\xe8\xf1\xc2\x62\x0d\xd3\x06\xea\x48\x71\xae\
+\xd2\xa6\xa5\xd7\xc6\xce\xb0\x8d\xae\xcb\x11\x28\xd3\xb7\x5e\x14\
+\x2f\xcd\x0b\x22\x12\xb3\x9c\x1e\xb0\x6c\x99\x60\x1b\xef\x04\xbd\
+\xf4\x5c\xb8\x65\xc9\xa1\x93\xe0\x42\x4f\x1a\x3b\xdb\xd2\xf0\xb1\
+\x94\x65\xb1\x98\x32\x12\xb6\xf2\x13\x79\x1a\x56\x0f\xd1\x91\x90\
+\xfd\xc0\xb5\x5f\xb3\x29\x5b\x62\x36\x7e\x3b\x45\x89\xc6\xbd\x7b\
+\xf6\x4a\xcd\x8a\x71\xc1\xd6\xa8\xe1\x34\x92\x2c\x41\x06\x83\x19\
+\xf9\x0a\xaa\x8a\x18\x85\x2d\x9c\xf7\x7e\x36\xc7\xa6\xd6\x24\xc2\
+\x31\x97\xd4\x16\x6e\xf5\xa4\xe9\xc4\x73\x25\x1e\xcc\x67\x14\x71\
+\x46\xa5\xf3\xdd\xc9\xa8\x89\x69\x45\x3e\x54\x6d\x6d\x09\x29\x65\
+\xeb\x1a\xb7\xbd\xbe\xaa\xa2\xa6\xc7\x52\xdd\x7a\x96\x32\xf1\x5e\
+\x9e\x0d\xac\x1d\xe6\x83\xe1\x74\xa7\x82\xd3\xf4\x7e\xc7\x35\x03\
+\xbe\x4c\x25\xd9\x99\xf2\x34\x99\x4c\x9f\x57\xa0\xee\x49\xbf\x13\
+\x71\x84\x39\xf9\xf6\x96\x89\x32\xcd\xc2\xa6\xdd\x97\xb6\x2b\x23\
+\x6a\x1b\x66\x56\x4c\x19\x76\xac\x74\x74\x00\xa6\x69\x39\xa1\x1b\
+\x04\x18\xc1\x92\xdd\x50\xee\x45\x9a\x20\xdc\xc3\xb0\xa6\x25\x89\
+\xdc\x4c\x93\x59\x70\x09\x9c\x3c\x70\x7d\x0f\x0d\xb6\x8c\xcb\xc2\
+\xe8\x3c\x1d\x1b\x2f\xc6\x70\xba\x93\xb9\xb9\xd2\x09\xd1\x11\xad\
+\x72\xfa\x34\xf8\xe6\x89\xf8\xbc\xea\x0a\x3f\x55\xa2\xa1\x8d\x24\
+\x5d\x9c\x13\xd0\xf1\x62\xb1\xd7\x91\x66\x49\x53\x0c\x8a\x14\x5c\
+\xe9\x6b\xa8\xbe\xba\xb7\x9d\x68\x0c\xfe\x0c\xce\xd5\x10\x25\x51\
+\xb4\xd7\x76\x16\x18\x67\x5a\x13\xa1\xfa\x19\xd9\x0e\xc1\xf0\x55\
+\xdf\x4d\x08\x8c\x2a\x6a\x0a\x3e\x3d\x12\x86\x91\x46\x92\x60\xb3\
+\xa9\xeb\x8a\xa1\x5e\xac\xf9\x3d\x8e\x4e\x1a\xa9\x8a\x2b\x89\x6d\
+\x65\x3a\x97\x38\xa6\xe5\x6e\x0f\x32\x1f\x4e\x2f\xc8\x32\x65\x6f\
+\xd8\x7f\x84\x81\xee\x3b\x13\xaf\xee\x98\xd5\xdc\xbf\x8d\x0d\x79\
+\xf5\x48\xdd\x90\xc9\x23\x6b\x03\x63\x02\x88\x33\xcb\xd3\x03\x1a\
+\xd6\x96\xfb\x30\xf7\xc4\x5d\x67\x6f\x12\x8e\xde\x70\x92\x6e\x3b\
+\x15\x44\x40\x33\x43\x6a\xbb\x84\x96\xa6\x42\x5c\xbf\x05\xed\x5a\
+\x7b\xfd\xf5\x5d\x73\xef\x6d\xd7\x7d\xa3\xa4\xfa\xf0\xde\xc2\x8a\
+\xe0\x92\xa2\xb1\x83\x69\x60\xa2\xba\xcc\x83\xcf\x43\x49\x24\x0d\
+\x17\x50\x02\xc9\xbb\x69\xba\x84\x92\x48\xbe\x4b\xb3\x2f\x04\x9b\
+\x45\xb9\xda\x05\xed\x46\x78\x5f\xdb\x67\xcf\x3f\x78\xe0\xf4\x8d\
+\xc1\xcb\x0e\xd6\xf9\x06\x07\x6a\xf3\xc6\x0f\x87\x29\x0f\x01\xba\
+\x66\xb2\xd6\x1d\x40\x3b\x53\x41\x7d\x39\x70\xca\x9a\x64\x29\x1e\
+\x46\xad\x6d\xd0\x6e\xdf\xae\x0f\xef\x5e\xf0\xf0\x23\xb3\x6f\x04\
+\xaa\x0f\x4e\xa0\x4b\xa7\xbc\xc3\x4b\xfc\x6a\x59\x31\x44\xae\xcf\
+\xd1\xd9\x26\x91\x69\x09\xa7\x21\xe5\x56\x2e\xee\x24\xa1\xdf\xbc\
+\x05\x35\x12\x49\x10\xa9\xb2\x63\xcf\xc2\x47\x1f\xfa\xf7\x8f\xa2\
+\x45\x07\x66\xb2\x31\x16\x43\xd5\x67\x2b\xb9\xb9\x41\xe1\xf3\xb8\
+\x46\x09\x1e\x1a\x46\x2a\x84\x54\xea\x28\x34\x6d\x7f\xe7\xfe\x97\
+\x1f\xfa\xb7\xe5\x1f\xbb\x04\x50\x27\xa1\x8d\x10\x16\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xcc\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x93\x49\x44\x41\x54\x78\xda\xa5\x56\x7d\x4c\x95\x55\
+\x1c\x7e\xde\x7b\xdf\x7b\x19\xa0\x34\x4d\x4b\xc6\x20\x66\x34\x0b\
+\xcc\x12\x84\x24\xdb\x4a\x24\x44\x72\xd1\x46\x89\xc9\x47\xab\x88\
+\xc5\x6a\xb8\x11\x99\x25\x92\x08\xb6\x02\x69\xce\x2d\x61\xd4\x1f\
+\x4d\x33\xbc\x7c\x38\xdc\xc8\x65\xd0\x07\x8d\x4a\xae\x04\x6b\x46\
+\xba\xc4\x8f\x0b\x02\x11\x86\x81\x70\xef\x7b\xdf\x8f\x73\xfa\x9d\
+\xf7\x66\x35\x93\xaf\x3a\xdb\x6f\xe7\xbd\xe7\x9c\xf7\x79\x7e\xf7\
+\x39\xef\xf9\x3d\x47\xc2\x0d\x2d\xd9\xd1\xcf\x3d\x6e\x15\x9a\xaa\
+\x83\x51\x18\xaa\x06\xa6\xe9\xd0\x35\x03\x86\xd7\xf7\x2c\xc6\xa0\
+\xeb\xe6\x33\x53\x0d\x30\xa6\xf9\xd6\x1b\x06\x21\x30\x0c\x3a\xb2\
+\xa5\xeb\x78\xd2\x8d\x04\x09\x87\xfb\xf8\xf6\x75\xc1\xb8\xe2\x65\
+\x30\x74\x40\x65\x0c\x5c\xe7\xd0\xc0\xa1\x1a\x0c\xaa\xe6\xeb\x35\
+\xc6\xe1\xd5\x99\x39\xef\xa1\x79\x2f\x8d\x6b\x92\x05\x27\x0e\x34\
+\x63\xf8\xe8\xb3\x53\x13\x24\xd6\xf6\xf1\x94\xe5\x0b\xe1\x1a\x27\
+\x48\xca\x48\x55\xe9\x45\x01\x48\xcf\xba\x4a\x3d\x85\xc2\xc4\xb8\
+\x01\x4d\x13\x84\x86\x19\x9a\x20\xb3\x58\x31\xda\xee\xc4\x50\xfd\
+\x34\x04\x49\x8e\xcb\x3d\xb2\xc7\xbd\x60\x89\xbf\x25\xd8\xe6\x2f\
+\x83\x91\x2c\x86\x4e\x32\xe8\x82\x80\x64\xa2\xbf\x65\x90\x34\x9a\
+\x90\xc8\x4b\x63\x42\x32\x02\x77\x4f\x4e\x62\xf0\x57\xf7\xd0\x35\
+\x8f\x7a\x75\xd8\x91\x1d\x35\x25\x81\x68\x6d\x4d\xad\x2f\x2e\x0e\
+\x0b\xae\xba\x67\x65\x24\x6e\xde\x48\x6b\x53\x3a\xda\x1b\x22\x64\
+\x4c\xc7\x99\x1f\x5d\x50\xae\xb9\xf3\xe2\x1f\x5d\x53\xfd\xcf\x95\
+\x37\x25\x68\xaa\x6f\x8d\xb3\xfb\xfb\x75\x6c\x78\xec\xa1\xbf\xc6\
+\x98\x08\x4e\x41\xd8\x62\x2f\x55\xca\x5a\x37\xff\x95\x4a\x28\x06\
+\x3a\xbf\xeb\xa6\xcd\xd7\x1f\x48\x7d\x32\xd1\x39\x23\x81\x68\x87\
+\x0e\x7e\xca\x1f\x7f\x6a\x3d\x82\xbc\x7b\xc0\x09\x95\x1b\x1c\x9c\
+\x73\x73\xc3\x19\xed\x09\xa7\x10\xb2\x31\x43\x85\x5b\x09\x42\xcb\
+\xe9\x07\x91\x91\xb9\xfe\x5f\x78\x53\x12\x1c\xfe\xf0\xb8\x23\xec\
+\xb6\x2f\x36\xad\x58\x5b\x01\x69\xa0\x02\x01\xea\x36\x53\x19\xc9\
+\x90\x20\xe9\xa2\xb7\x9a\xbf\xc5\xa7\xf6\xcd\x50\x21\x5c\x9e\x84\
+\xba\x8c\x67\x52\xd2\x67\x4d\x20\xda\xfb\xd5\xc7\xf9\x86\x55\x45\
+\x98\x1f\xf5\xbd\x49\x12\xe8\xd9\x45\x1a\x09\x02\x49\xa8\x42\xe0\
+\x2a\x06\xc7\x96\xe3\x93\xfe\x32\xe4\xbe\x90\x72\x53\xac\x69\x09\
+\x3e\xa8\x72\x84\x7a\xb5\x80\xbe\xd8\x3b\x0f\xe2\xee\x65\xb1\xe6\
+\x58\xe0\x44\x09\x2c\x44\x00\x92\xac\xd3\xb5\x11\xce\xe1\x4c\xf8\
+\xc9\xee\xb0\x9c\xbc\xf4\xfe\x39\x13\x88\x56\xb5\xff\x50\xb8\x66\
+\xf8\x35\xde\x1a\x78\x29\x7a\x4b\x7c\x31\xed\xae\xd5\x04\xaf\xed\
+\xda\x4d\x87\x31\xac\xcb\x26\x79\xd3\xf2\xf2\xb3\x2e\x4d\xf5\xfe\
+\x8c\x04\xd7\x5b\x45\xf9\x47\x4d\x6b\xef\xaa\x4d\x8d\xb9\xe3\x4b\
+\x74\x5f\x48\xc0\xe7\x17\x36\x1f\x7b\x75\x5b\xe6\x13\x33\xbd\x37\
+\x6b\x82\x3d\xa5\x35\x4d\x49\x4b\x1b\x53\x57\x2d\x6d\x43\x67\xdf\
+\xc3\x68\xf9\x39\xed\xd8\x1b\x3b\x73\xff\x3f\xc1\x5b\x25\x95\xe1\
+\xba\xae\x37\xfa\x07\x85\x44\x17\xae\x7e\x1e\xb0\x59\xe1\xb6\x86\
+\xa0\xb2\xb9\x10\x12\x1f\xeb\x92\x65\x39\xed\xf5\xe2\x82\xff\x26\
+\x51\x49\xd1\xdb\xa1\x8a\x47\xe9\x4b\xde\x98\x84\xfb\x57\xc7\x63\
+\xde\x29\x09\x16\x7b\x20\xbc\x01\x11\x38\xef\xd7\x8a\xb3\xa7\x4f\
+\xa2\xdb\xf9\x03\xec\x76\x5b\x58\x71\xd9\x6b\x73\xdf\xe4\x57\xf2\
+\x77\xf0\xec\xe7\xb6\x20\x7c\x59\xa4\xf9\x99\xce\x1f\xde\x0e\x6e\
+\xf7\x07\x97\x0d\x9c\x93\x3f\xc3\x24\x0b\x85\xeb\xfc\x4f\xe8\x68\
+\xef\xc0\x3b\xef\xee\x9e\xdb\x67\x5a\x98\xbf\xc3\x11\xb9\xe2\xde\
+\x4d\xe9\x99\xe9\xb0\xf5\xac\x81\x3c\xf1\x2d\x24\xfb\x3c\x70\x1b\
+\x4d\x5a\xe9\x04\x5b\x3d\xf8\x05\x59\xe8\x1d\x2f\xc2\xc9\xb6\x13\
+\x18\x1d\x19\xa9\x2b\xdf\x57\x3a\xfb\x83\x96\x97\x53\xc0\xcb\xf6\
+\x96\x62\xc1\x99\x08\x48\xde\x2b\x94\x39\x21\xcb\x16\x02\xe7\x26\
+\x09\xb7\x30\x58\xed\x5e\x8c\x28\x71\xf8\xaa\xb7\x1c\xed\x2d\xcd\
+\xd8\x5f\x55\x3e\xbb\x52\x91\x9f\x5b\x10\xbb\x38\x34\xc2\x59\xb4\
+\xf9\x2c\xd0\x7f\x00\xb0\xfb\x91\x2c\xb4\x94\x8e\x00\xb7\x51\xc5\
+\xb3\x10\x89\x4c\x0b\x65\x0e\xab\xac\xc0\x39\xf8\x26\x1a\x1a\x2c\
+\xd0\x94\xf1\xb8\x7d\xd5\x7b\x4f\xcd\x48\xf0\x72\x46\x76\xd1\x7d\
+\x31\x31\xa5\x39\x2b\xb7\x12\x18\x21\xf9\x89\xcc\x69\xa9\x90\x87\
+\xc0\xcd\xde\x2a\x08\x28\xec\x54\xf8\x70\x3b\x76\xbd\xb7\x15\x93\
+\xbf\xf5\xee\xac\xac\xa9\x29\x9b\x96\x20\xb9\x6e\xa0\xc7\x3b\x7a\
+\xf5\x96\x45\xd6\x89\x90\x85\x96\x8b\x64\x2c\x86\xe9\xbd\x1a\xd5\
+\x7f\x66\x68\xbe\xfa\xaf\xa9\xe4\x01\xc2\x52\xc9\xf5\x38\x15\x72\
+\xc9\x83\x8b\xae\x28\x8c\x4f\x7a\x06\x34\x49\x1e\x1b\x3a\x92\x35\
+\xb5\xe1\x24\x7e\xdc\xc7\x9f\x8e\x5e\x84\x31\xf2\x64\x95\x4a\xb3\
+\x4e\x65\xc1\x30\x7c\xbd\xf6\xa7\x07\x98\x16\x6a\xce\x31\x33\x01\
+\x95\xac\x93\x52\xa0\x90\xd0\x5e\xff\x35\x86\x1b\xa6\xb1\xcc\x75\
+\x64\xfa\x2f\x3d\xb2\x04\xe7\x7e\xd7\xcd\x2c\xc9\x25\x09\x94\x4c\
+\xdd\x10\xbe\x2b\x99\x46\x23\xcc\x5e\x21\x60\x45\x13\x3d\x33\x7d\
+\x5b\x21\x5f\xf6\x48\x12\x2e\x1f\x6d\xc5\xd0\x74\x04\xe2\xda\xa2\
+\xd0\xb5\x45\x78\x2d\x53\x84\xdf\x0a\x49\x34\xdf\xb5\x85\xae\x26\
+\x5c\x5c\x4f\x74\xd5\x77\x65\x31\xc3\xf0\x49\xa7\xf9\xfc\x5a\x24\
+\x35\x78\xe4\xef\x6b\xcb\x1f\x94\xb9\xb2\x37\x4e\xc4\xcd\x6e\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x75\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x3c\x49\x44\x41\x54\x78\xda\x9d\xd4\x6b\x4c\x5b\x65\
+\x18\x07\xf0\x7f\x4f\x11\xc6\xb8\xc8\x18\x63\x31\xc3\xd2\xb3\x86\
+\x8b\x23\xdb\xb8\x18\x3a\x27\x26\x94\x0d\x36\xe7\x84\x6a\xd8\x40\
+\xb3\x4d\x74\xc6\xc4\x4b\x82\xfb\x60\x62\x34\x26\x9a\xf8\x85\x2f\
+\xce\xcb\x47\x4d\x36\xa3\x31\x21\xf1\xc6\xcc\x66\xb2\xb9\x52\x37\
+\xdc\xb8\x96\xd2\xd9\xb5\x14\x7a\x81\xb6\x50\x37\x0a\xa7\xa5\xf7\
+\x73\x79\x7d\x81\xc4\x5b\x68\x29\x3e\xc9\xf9\x72\xce\xc9\xf3\x3b\
+\xcf\xe5\x3d\x32\xa4\x08\xdd\x9e\xbd\x05\x91\x78\xbc\x1a\x32\x99\
+\x4b\x46\x50\xb0\x53\xb1\xb3\x3f\x3b\x27\xab\xc0\x3b\x35\x77\x2e\
+\x21\x0a\xae\x60\x34\x52\x2d\x48\x92\xfe\xcc\xbc\x57\x9f\x2c\x87\
+\x2c\x15\xf0\xab\xba\xde\x5d\x59\xab\x2a\x99\x35\x5a\x30\xe1\xf0\
+\xfd\x78\xb6\xa7\x5b\x4b\xe6\x9d\xb8\xdd\x7b\x8b\xdb\xae\x7a\xb8\
+\xa0\x42\x5d\x86\xc1\x6f\x74\xb0\x38\xdc\xec\x4b\xc1\x80\x6b\xd3\
+\x80\xb9\xb5\x85\x3c\xa2\x66\x01\x86\xe0\xe2\xc7\x3f\xe1\xc5\x9e\
+\x37\x40\xfc\x3e\xdc\xfa\x4a\x8f\xb2\x66\x35\x76\xe4\x89\x98\x19\
+\xf7\xc0\x76\xd7\xab\x39\x32\x79\x57\x9f\x16\x70\x73\x5f\xad\x56\
+\x92\xa4\xee\x48\x2c\xda\x57\xa4\x2c\x3e\x5f\x77\xec\x31\x80\x44\
+\xd1\xf7\xe9\x15\x68\x3f\x7c\x05\xe4\x0f\x37\xc6\x7f\x18\x06\x7b\
+\xbc\x11\x05\xf2\x10\xdc\x43\x76\xd8\xcc\x1e\x4d\xb3\xd5\x9c\x1e\
+\x60\xef\xea\x24\x6c\xe3\x3e\xf8\x6f\x0e\x62\x7a\xd2\x07\xf5\xc9\
+\x66\x90\xf8\x12\xae\x7f\xa1\xc7\xe1\xf7\xce\x82\xcc\xdb\x71\xa7\
+\xcf\x00\x65\xdb\x61\xe4\x11\x3f\x3c\x83\x76\x4c\x52\xa0\x25\xdd\
+\x0a\x5c\x2f\x9f\x22\x8a\xfd\xbb\x10\x98\x9a\x81\x65\xd4\x8e\x03\
+\x27\x34\x14\x58\x86\xfe\xcb\x01\x68\xde\x7d\x01\xc4\x43\x81\xcb\
+\xe3\x50\xb6\x1e\x42\x1e\xbf\x00\xcf\x88\x83\x02\x5e\x4d\x8b\x2d\
+\x4d\xc0\x71\xa6\x83\x28\x0f\xa8\xb0\x3c\x7b\x1f\x13\xbf\x0c\xa3\
+\xa1\x93\x56\x10\x0b\xa0\xff\xeb\xdb\x68\x7a\xe7\x34\xc8\xec\x34\
+\x4c\x57\x4c\x60\xdb\x9a\xd6\x80\x51\x27\xac\x2b\x33\xb0\x59\xd2\
+\x03\xa6\x9f\x7b\x96\xec\x56\x53\xc0\xc7\x61\xec\xf2\x00\x1a\x4f\
+\x1f\x05\x09\x53\xa0\x77\x18\x4d\x6f\x9f\x02\x71\xda\x60\xba\xfa\
+\xfb\x1a\x10\xa3\x2d\x32\x3a\x61\xa1\x15\x1c\x9d\x4a\x17\xe8\xd4\
+\x92\xdd\xf5\x2a\xf0\x0b\x41\x0c\x5c\xba\x01\xcd\xf3\x4f\x52\x60\
+\x11\xfd\xdf\x8d\xa1\xe9\x2d\x0a\x38\x2c\x30\xe9\x2c\x60\x9f\xa6\
+\x2d\x8a\xcd\xc3\x63\x70\x63\x70\xc2\xa1\x89\xf0\x89\xc6\x87\xb6\
+\xe7\xb7\x85\x62\xbc\xab\xdd\x6e\x7f\x26\x39\xd0\x41\x81\x5a\x0a\
+\x70\x1c\x86\x7e\x1e\x42\x43\x3b\x6d\x51\xc4\x0f\xdd\xf7\x63\x38\
+\xb4\x02\xd8\x2d\xb8\xa3\xb3\xae\x56\x90\x1b\xf2\x61\x76\xc4\x8e\
+\x4b\xa3\x56\xe3\xf1\xfa\xca\x6a\xb6\x24\x1f\x66\x83\x0b\x7b\x0d\
+\x66\x59\x52\xc0\x7e\xb2\x8d\x28\xeb\x54\x74\x33\xa3\x30\xf5\x8f\
+\x63\x3f\xdd\x77\xb2\xcc\xad\x3e\x63\x14\xa5\x90\x66\x67\x10\x15\
+\x18\x6c\x29\x2a\x84\x8c\x5b\x80\x6b\x68\x12\x06\xc7\x1c\xda\x1b\
+\xf6\x40\xca\x62\xe0\x74\xfa\x51\xa6\x1f\x4a\x01\x74\xac\x00\x65\
+\x20\xdc\x22\x64\xd1\x38\x48\xa6\x1c\xc8\xcc\x02\x28\x48\x7f\x19\
+\x6b\x17\x21\x7f\xbd\x3f\x33\x32\x8d\xb9\x40\x10\x07\x1f\x2d\x07\
+\xc9\xce\x84\xdb\xec\x05\x7b\x7d\x20\x39\xe0\xa0\x2d\x2a\xad\xda\
+\x05\x12\x0a\x01\x02\xff\x77\xd2\xf5\x42\x92\x30\x63\x70\xc0\x1f\
+\x4d\xa0\xee\x60\x25\x75\x25\xb8\x4d\x6e\xb0\xba\xdf\x52\x00\x27\
+\xb4\x44\x51\x5e\x04\x44\xc2\x20\x4b\x4b\x40\x3c\x46\xdb\x15\x5f\
+\x1f\x60\x64\x70\xba\x38\x04\x33\xb2\x51\xf3\x78\xc5\xea\x07\xb9\
+\xcd\x73\xa9\x01\xb3\xba\x86\x94\x6d\x63\x20\xf9\xee\x63\xc3\xa0\
+\x9d\x9a\xf4\x72\x88\x66\xe7\xa1\xb6\x82\x7e\x14\xad\xc0\xb5\xc0\
+\xa3\x7c\xc2\x9a\x1c\x98\x50\xb1\xa4\x72\x47\x16\x1d\x6c\x68\x63\
+\x80\x46\x20\x22\x80\x29\x2e\x46\x3e\xe8\xbc\x82\x21\x58\xe6\x02\
+\xa8\x09\x84\x52\x00\x6c\x29\xa9\xd8\x96\xb5\xda\xa2\x4d\x07\x1d\
+\xbe\xd5\x17\x44\x75\x2a\xc0\x58\xaa\x20\x15\xb9\x0f\xac\x6d\xcd\
+\xff\x00\x2c\xf4\x80\xd6\x2e\x87\x93\x03\x63\x25\x25\xa4\x6a\x6b\
+\x26\x1d\x6c\x38\xf9\xf6\xa4\x88\x6b\xf3\x8b\xae\x56\x3e\xc1\x26\
+\x05\x7a\x73\x72\xc6\xdb\x58\x45\xb5\x78\xef\x1e\x18\xb9\x7c\x53\
+\xc9\x43\x09\x01\xdf\xfa\xb9\x0f\x5e\x85\xf4\x7e\x52\xe0\x33\x30\
+\x5d\x47\xd8\xd2\x0b\x25\xe1\x30\x64\x92\x48\x57\x91\x49\x2b\xb9\
+\x20\x4a\xb8\x11\x58\x36\x3e\x25\x24\x6a\xfe\x79\x7f\xdd\x1e\x7c\
+\x9e\x91\x79\xe1\x18\xab\xec\x7a\x70\x89\x83\x5c\x10\x52\x23\xb4\
+\xef\x51\x51\xc4\x40\x38\x6c\xf4\x88\x82\xe6\x35\xfa\x0f\xd8\x10\
+\x58\x89\x1e\x30\xe7\x9f\x28\x2c\x7c\xb3\x6a\xcb\x56\x64\xd0\x81\
+\x33\x82\xf8\xef\xd7\x69\x62\x1e\x22\xec\x7c\x1c\xa6\x04\x7f\x31\
+\x4c\xa4\x73\xff\x4d\x9e\x12\x58\x89\x8f\xc0\x28\x23\x20\xdd\x35\
+\x39\xb9\xda\x22\x86\x51\x66\xd0\x13\x2d\xa7\xa7\x97\xa7\xc9\x03\
+\x92\x64\xb4\x89\xbc\x9e\x9e\xb5\x4f\x5e\x07\x71\x25\xcb\xf1\x27\
+\x2c\xd1\x2a\x37\x78\xc5\xbc\x47\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x05\x5f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x26\x49\x44\x41\x54\x78\xda\x9d\x95\x6b\x4c\x53\x67\
+\x18\xc7\xff\xe7\xd2\x53\x4a\x01\xf1\x56\x41\x54\x2e\x52\x50\xae\
+\x6e\xe8\x70\xce\x65\x23\x0a\x73\x99\x41\x89\x8b\x2c\xdb\xe2\x17\
+\x8d\x2e\xfb\x22\x62\x1c\x3a\xa3\xa2\xdb\x9c\x11\x75\xc4\x25\xc6\
+\x98\x68\xb6\x25\x66\x99\xc9\x64\x66\x53\xe7\x8c\xcc\x6d\x8a\x17\
+\xe2\x74\xd2\x56\xc4\x52\x40\x10\x4a\x69\x29\xb4\xf4\xf4\x76\x2e\
+\x7b\x5a\x63\xb2\x2c\x30\x70\xef\xc9\x9b\x9c\xe4\x9c\xf7\xf9\x3d\
+\xb7\xff\xf3\x32\x98\xe0\x2a\x3a\xb9\x44\xcd\x9a\x9e\x06\x59\x51\
+\xc1\x30\xc0\x4d\xeb\x9d\x4d\x5d\x5b\xdb\x4e\x8c\x77\x8e\x19\xef\
+\x87\x94\xba\x8c\xa2\x90\x2c\x95\x96\xcc\x7f\xe5\xf3\xdd\x4b\xdf\
+\xc4\x48\x68\x08\x56\x8f\x03\x9b\xcf\x9e\xbe\x1e\xaf\x8d\xd9\xd5\
+\x59\xfd\xe0\xd7\xff\x05\x48\x3e\x98\xbe\x6f\x5a\xe2\xf4\x5d\x25\
+\xc6\x45\x58\x32\xb3\x00\xb3\xe3\x13\xe1\x0b\x77\xc0\xaf\xf8\x20\
+\xa9\x32\x9a\xfb\xba\xd0\x33\xec\xc6\xd5\xd6\x76\x30\x2a\xce\x74\
+\x6f\x7d\x58\x39\x61\xc0\x9c\xfa\xec\xbe\xf5\x8b\xdf\x49\xaa\xcc\
+\x2a\x86\xdb\xdf\x85\x61\xd9\x09\x49\x09\xd3\x56\xa3\x47\x38\x86\
+\x85\xc0\xf2\x00\x0b\xe8\x78\x1e\x5f\x9b\x6e\xe2\xfc\x9f\x2d\x8a\
+\xbd\xa6\x9d\x1b\x17\x90\x72\x38\xb3\xe5\xd8\xaa\xdd\x79\xc9\x7a\
+\xa0\x47\x6c\x85\x5e\xa3\xc3\x8d\x5e\x1b\x06\x03\x3e\x94\xa5\xe6\
+\x40\x56\x55\xb8\xe9\xfd\xde\xc0\x13\xac\x4c\xcf\x87\x4f\x0a\x12\
+\x44\xc0\x6f\x4f\xda\xf0\xd5\xb5\x26\xcb\x93\x6d\x8f\x72\xc7\x04\
+\xa4\x1e\x36\xa6\xbe\x51\x50\xd2\xb9\x31\xff\x75\x74\x78\x4d\x88\
+\xd3\xc4\xe2\xcb\x3b\x8d\xb8\xd5\xd6\x7e\x65\x79\xee\xd2\x65\x1f\
+\x14\x2d\x86\x37\x30\x48\x35\x70\x62\xdf\xf9\x73\x23\x2f\xcf\x37\
+\xc6\x55\x2f\x2a\x83\x5f\x92\x11\x2f\x08\xd8\x79\xb5\x01\x4d\xef\
+\x5f\x67\xc6\x04\x24\xd5\xa5\xef\x3f\xb5\xe6\xb3\x1d\x7e\xe5\x11\
+\x22\xc9\xe8\xf7\x0f\xa1\xf6\xfc\xb9\xdb\x03\xdb\x6d\xc5\xef\xfd\
+\xb4\x4e\x5d\x97\x5f\x00\x9b\xd7\x02\xeb\xb0\x03\x67\x9a\xac\x1b\
+\x15\xa0\x6a\xc5\x22\x4d\x4e\x62\x0c\x83\x29\xda\x29\x68\x73\x06\
+\xf1\x7b\xcb\xf0\xa1\x8e\x6a\xcb\xb6\x51\x01\x33\x0e\xa6\xd5\x9e\
+\xae\xdc\xbf\x67\x20\xd0\x0a\x9e\xe1\xd1\x49\xdd\x72\xe8\xca\x85\
+\x8f\xfa\x6b\x6c\x75\xe5\x0d\xab\xd4\xa2\x14\x2f\x1c\x01\x27\xa5\
+\x88\x43\x93\x29\xb4\x9d\x67\x99\x87\x54\x97\x06\x85\x6a\xa3\x90\
+\x4b\x3c\xcb\xd2\x66\xd6\x5b\xab\x4c\xa7\x46\x05\xcc\xac\xcb\xf8\
+\xf4\x8b\xd5\xdb\x76\x32\xaa\x03\x1a\x56\x0b\x8b\xfb\x2e\x8e\x5c\
+\x6e\x1e\x71\x7d\x6c\x8b\x2f\xff\xa1\x82\x00\x22\x9c\x01\x17\xdc\
+\x3e\x15\xd7\x2c\x81\xda\xce\x6a\xf3\xde\xe7\xd2\x01\xd5\x60\xe1\
+\x8a\xc2\xb2\xe6\xd2\xf4\x24\xdc\xb6\x37\xc2\x2b\x0d\x21\x18\x4e\
+\x40\x8f\x6b\x2a\xf4\x5a\x0e\xf9\x33\xbd\x70\x11\xc0\x49\x80\x5b\
+\x0f\xfc\x35\x04\x38\xf8\x5c\x80\xc8\xca\xa8\xcf\x35\x15\x67\xa6\
+\xe5\x4e\x9e\x64\x87\xa2\x70\x88\x04\x3f\x2d\x66\x1a\x26\x73\xe9\
+\xe8\x0b\x3e\xc4\x88\xe4\x85\x57\x04\xae\xb6\x8c\xc8\x02\xcf\x5e\
+\x66\x19\x5c\x64\x19\xe6\x24\xa5\xc5\x37\x61\x1d\xa4\x1e\xce\x69\
+\x4c\x88\x63\x4b\xe6\xcd\x89\x81\x21\x96\xa3\xfe\x57\xa8\x3d\xa9\
+\xa4\xd4\xf8\x0c\x3d\x64\x14\x1a\x8e\xc1\x90\x5f\x41\xa7\x33\x04\
+\x87\x5b\x82\x14\x52\xcf\xd8\xaa\x2d\x95\x13\x02\x44\x56\x66\x7d\
+\x5e\x19\x15\xf0\x00\xb5\xf8\x0b\x86\x44\x0e\x86\x49\x1c\x26\xeb\
+\xf8\xe8\x91\xc8\x2c\x22\xaf\x41\x92\x88\xbe\x0b\x24\x2f\x53\x5f\
+\x10\x8f\x7b\xc3\x76\x4a\x5b\xf2\x84\x00\xff\x00\xc5\x85\x65\x69\
+\xf9\x82\xd4\xf9\x0d\xe9\xc9\x1e\xf2\xda\x03\xaf\x5f\x45\xb7\x2b\
+\x84\xec\x59\x5a\x52\x34\x0b\x85\x48\x02\x85\xd5\x6a\x0f\xa2\xdb\
+\x1e\xde\x67\xdb\x62\xde\x33\x61\xc0\xb3\x55\x71\xf6\x6d\x35\xc3\
+\x30\x02\xa7\x7f\x10\xc3\xa2\x82\xbb\x8f\xc4\x4b\xaa\xca\x2c\xcc\
+\x9b\xab\x9d\x6a\x48\x10\x28\x1a\x9a\xb2\x14\xc9\x1f\xf7\xbd\x68\
+\xaf\xb2\x30\xa3\x02\xd2\x8e\x64\xdf\x90\x14\x59\x43\x07\x29\x74\
+\x95\x15\x38\xbe\xc7\xb6\xa5\xb5\x3c\xf2\xad\xfc\xfb\x0a\x02\xf8\
+\x31\xe8\x77\x61\x38\xa0\xa2\xc5\x2a\xee\xa0\x9c\x1f\xc8\x39\x9e\
+\x67\x2a\x36\xea\x73\x25\x59\x8d\xd6\xa5\xd9\xea\x43\xcb\x26\xd3\
+\xe8\x80\xd5\x64\xa4\x34\x3b\x17\x62\x28\x40\x3a\xe0\x71\xb1\xed\
+\x3e\x2e\xad\xbd\xc0\x3c\x03\xa4\x11\xc0\x29\x0e\xc2\x43\xc5\x35\
+\xdb\xc4\xbd\xa4\xd8\xda\xbc\xe3\x79\x35\x2f\x66\xc6\x1d\x88\x00\
+\x78\x02\xdc\x6d\x1f\x19\x1b\xb0\xf0\xd4\x6b\xea\xab\x59\x7a\x3c\
+\xf6\xf6\x92\x37\x1c\xba\x1c\x21\xf4\x39\xa4\xdd\x34\xf3\x3f\xa9\
+\x38\xbb\x46\x9d\x35\xf5\xa9\xd0\x22\x35\xb0\xd8\x7c\xd1\x08\x0a\
+\x4f\xe4\xf7\xe4\x67\xe8\x53\x64\x02\x08\x1a\x26\x9a\x22\x5b\x95\
+\x79\x74\x80\xf1\x68\xc1\x77\x15\x45\x2f\xad\xed\xf4\xdc\x03\xc7\
+\x72\x50\x64\xa0\xd3\x41\xa0\xfe\xfe\x0f\x8b\xe7\x16\x1c\x9b\x65\
+\x08\xc0\x25\xba\xe0\x11\x55\x98\x3b\xc4\x9f\x59\x46\x5d\x51\x68\
+\xd4\x43\x27\xb0\xd1\xae\xb2\xbb\xc3\xe8\xe8\x0d\x34\x52\x91\x97\
+\x8d\x0a\xc8\x38\x32\x2f\x36\x75\x46\x86\x2f\x35\x29\x84\x40\xd0\
+\xfb\xf4\x07\x9e\x41\x8a\xb0\x00\x2c\x1b\x07\x8f\x64\x8e\xd6\x40\
+\x0c\x2a\xe8\x1e\x0c\xc1\x98\x14\x13\x9d\x3f\x74\x2d\xd0\x65\x24\
+\xa3\xa5\x43\x8c\x68\x44\x67\xdd\x6c\x0e\x8c\xd9\x45\x04\x29\xe5\
+\x05\xed\x2f\x73\x92\x35\x30\xc4\xf1\x88\x84\x2e\xd3\x0d\xa6\xa3\
+\x7b\x21\x2c\xcb\x24\x3a\x29\xea\x6d\x64\x47\x0d\x90\xf5\x61\x51\
+\x46\x6b\x97\x18\x91\xe1\xbb\xa4\xe8\x6f\xc7\xd5\x41\x66\x7d\xce\
+\x6c\x12\xef\x8f\x5a\x81\x2d\x9c\x3e\x45\x43\x73\x88\x47\x82\x9e\
+\x85\x24\x3d\xfd\xce\x91\xf1\x88\xc7\x62\x40\xc6\xc0\x50\x18\xa2\
+\x28\xff\xc5\xb2\xec\x4a\x32\xde\xf3\x6f\x5b\xff\xa9\x03\x12\x59\
+\x2c\xf5\xf7\x06\x12\x52\x59\x8c\x8e\x7b\x6b\xc1\x5c\x7d\xb4\x2e\
+\x1e\x32\x6c\x69\xf7\x39\x39\x8e\x39\x4a\x91\x7c\x43\x86\xbb\xc6\
+\xb2\x31\x61\xa1\x65\x1d\xcd\x51\x35\x34\x51\x69\xf6\x21\x32\xff\
+\xc3\x61\x6c\x20\xc3\x27\xc7\x3b\xf7\x37\xc3\xbe\x73\x37\x8c\xee\
+\xff\x5c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x1e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xe5\x49\x44\x41\x54\x78\xda\xbd\x95\x7d\x4c\xd5\x65\
+\x14\xc7\xbf\xcf\xef\xe5\xbe\xd4\x1a\x17\x62\xe2\x5b\x68\x33\x9b\
+\x82\xa0\x12\xa3\x69\x96\x38\x29\xab\xd5\x2a\x48\x6b\x8d\x0d\x73\
+\x16\xbe\xcc\xc5\x70\xcd\x98\x30\xda\xa4\x56\x7f\xe4\xae\xba\x6c\
+\xb1\xd6\x8b\xb1\xe6\x5c\x2f\xcc\x7f\x4a\x4d\x48\xb1\x9a\x98\x72\
+\xd1\x42\x4a\xd1\xe6\x52\xc8\x5e\xa4\xd9\x95\xfb\x7b\x7b\x4e\xe7\
+\xf7\xbb\x70\x2f\xa8\x51\xd0\xe8\xd9\x9e\xfd\x9e\xdf\xd9\xf3\x3b\
+\x9f\x73\xce\xf3\x3d\xcf\x4f\x60\x8c\x87\x18\x73\x40\xc7\x4b\x8b\
+\x48\xda\x12\xa0\xc1\x56\x01\xa1\x08\x28\x8a\xd8\x35\x73\x63\xd3\
+\x13\xff\x09\xf0\x6d\xed\x3d\x94\xbd\xbc\x10\x90\xbd\x80\x63\xc5\
+\x93\x52\x80\x4b\xdf\x5d\xc0\x85\xb6\x5e\x28\x9a\x48\xcd\xaa\x6e\
+\xee\x1d\x35\xe0\x78\xf5\x02\xca\x79\x76\x09\xd0\xb5\x95\x1d\xfb\
+\xe2\x56\x72\x80\xc9\x4b\x71\xf2\x83\x56\x38\x14\xa8\xc9\xa9\x3d\
+\x50\x37\x6a\x40\xa4\x6a\x3e\xcd\x5e\xfd\x00\x03\xb6\x33\xc0\xdf\
+\x6f\xe6\x7a\x49\x13\x98\xba\x0c\xc7\xde\x68\x85\xaa\x8d\xe2\xa8\
+\xdc\x42\x68\x0a\x44\xdb\x86\x3b\x69\xce\x9a\x87\x40\xa7\x07\x03\
+\x92\x10\x91\x59\xc2\x6b\x67\xe4\x00\x5d\x20\xf2\x66\x04\xe2\xe8\
+\xf3\x05\x94\xb7\xe6\xe1\xeb\x00\x38\x08\x85\x1d\xfb\x42\xbc\xf0\
+\x8d\x20\xf2\xfe\x6c\x35\xc2\xb1\x0f\x03\x10\x47\xd6\xe7\x53\xfe\
+\xda\x47\x21\x4f\xbd\x9e\x04\xf0\x1e\x21\x09\x67\x4f\xa4\x22\x76\
+\x99\x73\x91\x0e\x4f\x02\x51\xff\xe4\xb5\xf4\xd6\x92\x27\xbc\x77\
+\x77\x21\xfb\x9f\xee\x1e\x29\x24\x02\xc1\x89\x10\x87\x2b\xf3\xa9\
+\xe0\x39\x2e\x43\xe7\x96\x78\xa4\x6e\x00\x0a\xa1\xeb\x9b\x71\x30\
+\x02\xe3\x30\xad\x2c\x17\x64\x53\x32\xb2\x7f\x57\x7e\x8e\x55\x41\
+\xa4\x66\x3f\x44\x6b\x65\x01\xdd\x9c\x61\x33\x5d\xf5\xa2\xe1\x70\
+\x60\x9b\x02\x7d\x31\x3f\xb2\xab\xee\x86\x1d\xdd\xc9\x67\x11\xc5\
+\x40\x4f\xaa\x0a\x47\xa6\x19\xfc\x3a\xa8\x71\x48\x20\x66\xf9\x58\
+\x71\xae\x4d\xf5\xf6\xaa\x01\xc2\xf1\x4d\xd3\x20\xbe\x5e\x37\x97\
+\xf2\x5e\x5e\x0c\xc7\x54\x12\x4e\x84\xd7\x75\x0a\x28\xda\x02\x69\
+\x9c\x66\x83\xea\xd9\x15\x48\xfc\x6a\xdf\x84\xec\xd7\xea\x71\x83\
+\xd6\x97\xf0\x7f\xc5\x0e\xa2\x63\xfd\x0a\xa4\x87\x9e\x82\x73\xb9\
+\x9e\xf7\xeb\x50\xfd\x12\x91\x57\xa7\x40\x7c\xb9\x76\x36\xcd\xab\
+\x7b\x04\x7d\x3f\x6d\xe6\x2a\x5c\x7d\x98\xaa\xe7\x76\x00\xac\xf1\
+\xa1\x47\xce\xdf\x82\xe2\x4f\x5f\xc1\x8d\x99\xa9\x5e\xbd\xdd\xd2\
+\x45\xcf\x5d\xc2\xc7\xf7\x57\x22\x77\xce\x83\x90\x3f\xbf\xe5\x95\
+\x5a\x0d\x48\x1c\x0d\x4f\x85\x38\xb4\x3a\x87\xe6\x6f\x2a\x46\xdf\
+\xb9\x2d\xac\x1a\x3f\xae\x1d\x04\x8d\xd3\xd5\x55\xee\x72\xd5\x44\
+\xc3\xa1\x42\x54\xb7\xaf\x43\x60\x52\x5a\x02\x10\x3b\xff\x3b\xea\
+\x72\x37\xa3\xb4\x38\x0b\xe8\xa9\x67\x73\x10\xb6\xa3\xe0\xc8\x36\
+\x06\x1c\x5c\x35\x8b\x16\xbc\x58\x02\xe3\xc7\xad\xd7\xc8\xd4\x2b\
+\x0b\xab\xa1\xf3\x97\x89\x28\xda\xf1\x02\x44\x46\x3a\x82\xba\x0d\
+\xbf\x30\x20\x26\x8c\x4f\x00\xa8\xbb\x07\x86\xf4\xc1\x20\x0d\xd1\
+\xee\x3f\x51\x72\xfb\x61\xbc\xf3\x78\x3d\x5a\xb6\xdf\x0a\xf1\xc5\
+\x33\xd9\xb4\xb0\x76\x29\x8c\xae\xeb\x03\xdc\xe1\x53\x6d\xb4\x5f\
+\xcc\xc4\x7d\xbb\xab\x11\x9a\x35\x89\xa1\x6c\x94\x72\x88\xf6\x49\
+\xd5\x70\xe5\x4c\x0f\x4a\xd2\xf7\x20\xbc\xe4\x3d\x96\x71\x00\x2d\
+\x6f\xb3\x4c\x9b\x57\xce\xa4\xc2\x9a\x65\x30\x7f\xf8\x7b\x80\x5b\
+\x26\x9f\x66\xa1\xf1\xd4\x1d\x28\xff\x6a\x15\x52\xb2\x26\x33\x24\
+\xa9\x22\x52\xd5\xb8\xf3\xd4\x7d\x08\x17\xbd\x0b\xcb\x0c\x42\xd5\
+\x09\x07\x1b\x26\x40\x34\xad\x98\x41\x8b\x36\x3e\x09\xb3\x73\x38\
+\x40\x5c\x59\xba\x66\xa2\xb1\x2b\x1f\xe5\xad\xe5\x48\xc9\x9d\x02\
+\xc5\xb1\x41\x0a\x3b\x3f\xcb\xce\x43\x7b\x11\x5e\xb8\xc3\x73\x4e\
+\xbc\x5b\xd3\x25\x0e\xec\xcc\x80\xf8\x7c\xf9\x74\x5a\x5c\x55\x0a\
+\xb3\x63\xdb\xb0\x80\x21\x90\x33\x79\x28\xff\xbe\x02\x29\xd3\xc7\
+\x23\x76\xf1\x0f\x14\x8b\x4f\x10\xbe\xeb\xfd\x84\x73\x4f\x71\x9c\
+\x41\xf3\x47\x69\x10\xfb\xca\x6e\xa3\xa2\x0d\x65\x30\xdb\x39\x03\
+\x75\x78\x40\x02\xc2\x6a\x6a\xec\x9e\x8b\xa7\x4f\x54\xa0\x2c\xed\
+\x33\x84\x0b\x1a\x60\x59\x49\xe7\x03\x80\xa6\xdd\x21\x88\x3d\x0c\
+\xb8\xb7\xa2\x14\x74\xd2\xbd\xec\xf4\x7f\x04\x0c\x40\x84\x62\x61\
+\xd7\x6f\xf3\xf0\x58\xa8\x0d\x3a\xf7\x87\xa4\xa1\x57\x89\x2b\xb0\
+\xfd\x7b\x53\xb8\x44\x2b\x67\x90\x65\x58\xdc\xed\x1a\x46\xf2\x8b\
+\x76\x21\x1a\x4b\xd8\x71\x3b\xde\xbd\xe3\xae\xfa\x56\xb0\x08\x74\
+\x5d\xf9\x1f\x7e\xfa\x63\x0d\xf8\x0b\x07\x97\x9c\xb2\x2f\x9b\x0b\
+\xfe\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x6d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\x34\x49\x44\x41\x54\x78\xda\xb5\xd4\x59\x48\x14\x71\
+\x1c\x07\xf0\xef\x7f\xb7\x99\x3d\xca\x3d\xdc\x7b\x67\xdd\xd2\x22\
+\xc5\x1e\x2a\x0a\xc9\x2c\x22\x03\xab\x87\x8c\xa0\xa0\x2c\x0a\x82\
+\xec\x12\xdb\xc8\x0a\x89\x2e\x3a\x88\xb0\x8b\xb2\x9b\x28\xd0\x2c\
+\x29\xba\x6f\xca\xd0\x7c\xe8\xa0\xa7\x28\xe8\x25\x82\xcc\x23\xcf\
+\x75\xb7\x75\x67\xd7\xfd\xf5\x77\x33\xa1\x56\xb2\x87\xe6\x0f\x7f\
+\x06\x86\x99\xdf\x67\x7e\xc7\xfc\x19\xfa\x57\x59\xd9\x51\x92\x3c\
+\x1e\x2c\x59\xbc\x90\xfd\xba\x27\x5f\x39\x34\x01\x31\xca\xa3\x9e\
+\xd0\x64\xf4\x44\xcc\x2c\x14\xa6\x58\x28\x02\x04\x23\x02\xfc\x72\
+\xb5\xb6\xfc\xcc\x29\x0c\xb1\x06\x82\x3d\x7b\x5e\x47\x63\x32\x33\
+\xf0\x71\xcf\xb6\x8d\xb9\x93\xbc\x13\x23\x84\xe5\xe8\x6c\x02\x35\
+\x37\x83\xbe\x34\x82\x5a\xdb\x11\x0b\xc8\x60\xdf\x65\xa0\x87\xc0\
+\x6c\x29\x08\xa7\x8f\x9b\xaa\xb6\x08\xb3\xd5\xe6\xe1\xd9\x2a\x53\
+\x92\x59\x65\x4c\x02\xba\xfc\x06\x4d\xe1\xce\x8c\x04\xa0\xa6\xb6\
+\x9e\xb2\xd3\xc7\x42\xed\x5b\x86\x5e\x31\x00\x12\x04\x30\xa3\x81\
+\xa7\x11\x05\x75\x74\x82\xfc\x21\x50\x20\x0c\x7c\xe7\x19\x04\xa2\
+\x88\x45\x45\x04\x0d\x06\x08\xac\x1b\x6c\xb8\x1a\x6a\x83\x08\xd1\
+\x6d\x01\x5a\xbb\xa1\xab\x7e\xc9\x12\x33\xa8\xab\xa7\x29\x2e\x09\
+\x98\x9b\x05\x64\xba\xc0\x9c\x76\xbe\x1d\x1c\x90\x41\x5f\x79\x06\
+\x1d\x81\x01\x80\x05\x7b\x11\xed\x94\xd1\x16\x0c\x42\x6f\x1f\x01\
+\xc1\xa6\x83\xc0\x83\x0b\x29\x4e\x50\x43\x0b\x74\x55\xf5\x89\xc0\
+\xe3\x9a\x5a\xca\xf1\x48\x60\xf9\xd3\x41\xa3\xad\x50\x49\x0e\xbe\
+\x5d\xa0\x70\x84\x03\x0d\xa0\xb6\xee\xdf\x81\xae\x48\x1c\xd0\x26\
+\xf3\xe0\xc9\x5a\x88\x5e\x1b\xc4\x51\x6e\xfe\x2c\x07\x2a\x5f\x24\
+\x02\x0f\x9f\x3e\xa3\x1c\xc9\x0b\xd5\x82\xe9\x40\x5a\x3f\xe0\xe1\
+\x2f\xc8\x1c\xf8\xc2\x81\xf6\xc1\x01\x8d\x49\xcb\x01\x0d\x34\x23\
+\xed\x1c\x90\x40\x4d\xdf\xa0\xab\xa8\x4b\x04\xee\x3d\x7a\x42\x39\
+\x6e\x0f\x84\x45\xb9\xc0\x68\x4b\xfc\xeb\x55\x9e\xa1\x33\xf8\x67\
+\xe0\xd6\xfd\x27\x34\xcd\xed\x82\x76\x49\x1e\x90\x9a\x0c\x55\x8a\
+\xbb\xbf\x44\xf2\x90\x80\xc8\x81\x78\x89\x52\xa5\x9f\x25\xba\x3c\
+\x48\x0f\xaa\x6f\xde\xa1\x19\xbc\xa9\x49\x2b\xe6\x83\xd2\x38\xe0\
+\x95\x7e\x66\xd0\xc3\x81\x86\xbf\x95\x88\x07\xe7\x3d\x10\x3c\x16\
+\x68\x24\x1b\x62\x2d\xed\xd0\x0f\x36\x45\x15\x57\xaf\x51\xae\xc3\
+\x0d\xd3\xea\x05\x1c\xb0\x41\x35\x92\x4f\x92\xcb\xc9\x67\x3e\x0c\
+\x6a\xe4\x53\xd4\x1e\x78\xcd\x81\xdb\x71\x20\x10\x9d\xc7\xa7\x28\
+\xab\x35\x14\x82\xb6\x0f\xb0\xf0\x46\xbb\x4c\x10\x1d\x26\x9e\xa9\
+\x1f\xfa\xeb\x6f\x12\x81\x0b\x55\x57\x69\x96\xd5\x01\x5b\xd1\xe2\
+\xf8\x14\x31\xc9\x0e\x95\xc9\x58\x09\x39\x52\xa1\x3d\x76\xf7\xe1\
+\x9f\x7f\x68\xdb\x9c\xfc\xb5\xfe\x97\xb5\x27\x35\x16\x3d\x44\x2b\
+\x07\x6c\x86\x4e\xd1\x69\xfc\x40\xad\xfe\x6c\xfd\x8d\xb7\x89\xc0\
+\xb9\x4b\x95\x94\x97\x6c\x81\xb7\xb8\xe0\x63\x28\xc3\xbd\x4b\xff\
+\xe0\x5d\xd5\xdf\x8e\x80\xa6\xf1\x59\xae\x68\xe3\xa7\xe5\xa2\x55\
+\x5f\x63\x7f\xff\xf9\xd5\x90\x47\xc5\xe9\xf3\x17\x29\x3d\x33\x13\
+\x33\xa7\x66\x31\xfc\xc7\x35\x10\xec\x58\xf9\x19\x4a\xf5\x7a\x91\
+\x3f\x6f\xae\x32\xc0\xa1\xa3\x27\xc8\x69\x77\x60\x69\xc1\x22\x65\
+\x80\x7d\xfb\x0f\x92\xc5\x6a\xc5\x9a\xc2\x95\xca\x00\x3b\x77\xef\
+\x23\xb3\xd9\x0c\x5f\xf1\x3a\x65\x80\x6d\xdb\x77\x93\xc1\x60\xc4\
+\xd6\xcd\x3e\x65\x80\x2d\xa5\xdb\x69\x84\x4e\x8f\x1d\x3b\x4a\x95\
+\x01\x36\x95\x94\x92\x46\xab\xc1\xfe\xbd\xbb\x94\x01\x36\xf8\x4a\
+\x48\x3d\x6c\x18\x0e\x97\x1d\x50\x06\x58\x57\xe4\x23\xc6\x18\xca\
+\x8f\x1f\x51\x06\x58\xb5\x7a\x7d\x1c\x38\x7b\xfa\x84\x32\x40\xe1\
+\x9a\x22\xea\xbb\xfe\x6f\xe0\x07\x50\x4a\x8c\x28\x35\x87\x80\x9c\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xd0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x97\x49\x44\x41\x54\x78\xda\xad\x94\x0b\x6c\x53\x55\
+\x18\xc7\xff\xf7\xf6\xf6\xb6\xeb\xbb\x23\x40\x02\x53\xe7\x23\x82\
+\x10\x21\xe0\x34\x40\x14\x81\x18\x81\xa9\x64\x04\x24\x62\x34\x0a\
+\xc6\x18\x05\x31\xc1\x31\x4c\x80\xc4\xa0\x26\x10\x26\x0f\xc9\x48\
+\x5c\x00\x43\x78\x0c\x24\x04\x46\x0c\x43\x1e\x6e\x85\x81\x1b\xca\
+\x43\xd8\x18\x93\x81\xdb\x18\x30\xba\x3e\x6f\xd7\xee\xbe\x8f\x5f\
+\x1b\x25\x2a\xb8\xf2\x3a\xc9\xe9\xed\x77\xee\xe9\xff\xf7\x9d\xef\
+\xff\x9d\x72\xb8\xcb\xf1\x4b\x7d\xe3\x4b\x3c\xc7\x4a\x61\x18\xc3\
+\x35\x4d\x87\xa6\x1a\x30\x0d\x03\xb2\x6a\x6e\x56\x0c\x56\x31\xa5\
+\xe8\xf9\xaa\x7f\xee\xe7\xee\x54\xb8\xbe\xee\xbc\xdf\xc2\x19\x57\
+\xa2\xb2\xc5\xd9\xa6\x3a\x11\xd3\x44\x38\x1d\x02\x74\x83\xa1\xbb\
+\x5b\x85\x90\x8c\x23\x57\x0e\xc1\xc1\xa7\x5a\x67\xbe\x3b\xf9\xd1\
+\xbb\x02\x9c\xa8\x6f\xf2\x71\x9a\x1a\xbd\xac\x7b\x21\xe4\xfa\xe1\
+\x75\xf0\x60\x94\xb5\xa6\xa5\x27\x83\x6e\x02\x8a\x01\x5c\x8b\xea\
+\x90\xdb\xdb\xd1\x37\xd1\x9e\xfc\x60\xfe\x74\xd7\x1d\x03\x6a\x6b\
+\x4e\xb1\x88\xad\x1f\x7c\x03\xfc\xe0\x61\x22\x14\xe9\x81\x94\xd4\
+\x91\xd7\xdf\x01\x41\xb4\x00\xa6\x09\x55\x07\x7a\x52\x3a\x82\xdd\
+\x0c\x6d\x27\x9a\xe1\x4d\x5e\x6e\xfb\x74\xf1\xdb\xf9\x59\x01\x35\
+\x07\x4f\x7e\x21\x5b\xed\x8b\xfd\x83\x9e\x00\xc7\x4c\x44\xa5\x1e\
+\x2a\x3f\x83\xcf\x6d\x85\x4d\xb4\x82\xe3\x01\x37\x95\x4a\xa5\xb5\
+\x44\x5c\x45\x28\xae\xa0\x35\xcc\x70\x75\xff\x01\x88\x7c\x6a\x60\
+\x56\xc0\xbe\x5d\xb5\xcc\xfb\xdc\x70\xe4\x7a\x45\x24\x53\x54\x07\
+\x8e\x81\xbc\x45\x7f\x8f\x15\x8d\x6d\x12\x86\x0e\x74\xc3\xeb\xb2\
+\x40\xd6\x4c\xf2\xc5\x44\x30\x24\xa3\x2b\x6a\xe2\x6c\xfd\x1f\xe8\
+\x69\x3e\x56\x91\x15\x50\x59\x79\x9c\x0d\x9d\x3c\x1a\x86\xac\x51\
+\xc4\xa8\xa6\x1c\x65\x6b\xc2\x2d\xf0\x68\x8f\xa9\x78\xcc\x23\x62\
+\x00\xc1\x62\xb4\x16\x91\x0d\x5c\x8f\xa8\x04\x51\xd0\x1e\x62\x68\
+\xd9\xb6\xbe\x77\x0f\x76\x6c\xad\x1e\x26\xfa\x5d\xbf\x3d\x3b\xa9\
+\x00\x72\x52\x83\x40\x6b\x66\x66\x9a\xf0\x89\x22\xae\x76\x2b\x48\
+\x24\x0d\x3c\xdd\x2f\x07\xb0\xf2\x08\x93\xd3\x57\x3a\xbb\x11\x97\
+\x0c\x04\x7b\x04\x1c\x5d\xb5\xa2\x77\xc0\x86\xf2\xaa\x21\xfe\xbe\
+\xbe\xc6\xb1\x45\xa3\xa0\x91\x81\xec\xaf\xdd\x26\x55\x8a\x51\xed\
+\x73\x6d\x02\x9a\xa9\xe6\x12\x9d\xa4\x8b\x9e\xaa\x6c\xe2\x91\xbc\
+\x1c\x44\xa8\x9b\xe2\x9a\x15\xfb\x4b\xd7\xf5\x0e\x58\xb7\xa6\x72\
+\x84\xdd\xed\x3a\x35\x63\xd6\x04\x68\x8a\x4e\x79\xa7\x0b\x44\x1e\
+\x10\x49\x33\x19\x75\x14\x20\x52\xe6\x71\x82\xa7\xc8\x64\x81\xbe\
+\x5f\x6a\x8d\x83\xe7\x05\x02\xd8\xb1\xbd\x64\x51\xf6\x36\x5d\x52\
+\x52\xce\x16\x2d\x7f\x9f\x3a\x27\x6d\x81\x09\x83\x7e\xa1\xeb\x0c\
+\x2a\x85\x8a\x6a\x22\x45\x40\x46\xef\xa4\x6e\x0d\x1d\x37\x92\xb0\
+\xf0\x16\x38\xdd\x36\x9c\x6f\x89\xe2\xd0\xea\xd5\x1d\x59\x01\x0b\
+\x8b\xbf\xdb\x36\xfb\xe3\x57\x66\x3e\xf9\x70\x5f\x02\x30\x28\xb4\
+\xa6\x66\x00\x0c\xb2\x42\x93\xa0\x32\xdd\x83\x58\x4c\x47\x28\x26\
+\x23\xd7\x63\x83\x29\xda\xb1\x71\xd9\x76\x84\x2f\x9e\x99\x97\x15\
+\x30\xb7\xe4\xc7\x51\xa9\xce\x86\x9f\x37\x6c\x9a\x9f\x89\x15\x12\
+\x56\xb5\x5b\x01\xd1\x08\x75\x19\xcf\x21\x27\xc7\x86\xd3\x4d\x51\
+\x6c\xfe\x6c\x09\x8e\xd4\x95\x73\xbd\x02\xc2\xab\x04\x25\x38\xe4\
+\x6b\x31\xd2\xe7\x4d\x54\x6c\xdc\x81\xb5\x65\x73\x90\x6e\xd6\x14\
+\x95\x46\xa6\xd3\xa8\xe9\x27\xdd\x8b\x74\x4c\x96\xc0\x4e\x99\x37\
+\x5e\x8c\x60\xe5\x87\x8b\xe0\x70\xd9\x5e\x38\xfc\xd3\x9a\xda\xff\
+\x05\x5c\x5a\xda\x47\xca\x1f\x14\x76\x5f\x3f\x07\xf8\x66\xef\xc3\
+\xea\x5d\x56\x34\xfd\x7a\x1a\xcb\xcb\x3f\xc2\x40\x8f\x13\x09\xda\
+\x23\xd3\x4c\x5b\x43\xf7\x2e\x03\xde\xb3\xb3\x01\xdf\x97\x96\xd1\
+\x29\xc4\xe9\xd5\x81\x6f\x76\xa5\x75\x6e\x0b\x38\x53\xec\x97\x86\
+\x3d\x13\x75\x73\x13\xbe\x82\xe9\x1c\x8f\xd6\xcf\xc7\xe0\x62\xde\
+\x27\xa8\x38\x3b\xf8\xd5\x8e\x96\x0b\x3f\xe4\x0f\xca\x47\xc1\x8b\
+\x23\x60\xb5\xdb\x20\x93\xfb\xe1\xce\x24\xaa\x77\x1f\x42\x4f\x22\
+\x74\xc9\xee\x74\x14\x04\x8e\x94\xc5\xfe\xd6\xba\x05\x70\x7c\xae\
+\x5f\x2a\x18\x13\x75\x5b\x27\xae\x07\xbc\x93\x80\xdf\xcb\x10\x09\
+\x6c\x41\xa2\xed\x4a\x5d\xfe\x32\x8c\x4e\xef\x29\x9c\xbc\x30\x57\
+\x91\xe5\x12\x55\xd1\x65\x83\x19\x3c\xcf\x71\x11\x8b\x28\x6c\x0d\
+\xd4\xac\xed\xfa\xaf\xde\xbf\x00\x07\x66\x79\xa4\xb1\x2f\x4b\x6e\
+\x5b\xd1\x5e\x8a\x9e\x02\x2e\xac\x40\xb8\x7a\x37\x1a\x9a\xb5\xe4\
+\xb8\x6f\x63\xae\x6c\x0d\x71\xbb\x71\x13\x50\xf9\x86\x5b\x9a\x38\
+\x55\x73\xdb\xa6\x05\xa8\xb8\xf4\xa7\x70\x6e\x05\x82\x81\x2a\x9c\
+\x6c\xb2\x24\x0a\x37\x45\x3c\xf7\x22\x7e\x13\x50\xf1\x9a\x43\x9a\
+\x32\xdb\xef\x76\x14\x55\x03\xb1\xab\x40\xc3\x2a\x74\x06\x6a\x70\
+\xf4\x9c\x35\x31\x63\x47\xf8\x9e\xc5\x33\x80\x6d\x45\xbe\x96\xd7\
+\xe7\x0d\x7e\x5c\x18\x5f\x09\x16\xac\x03\xd7\xb4\x12\xd7\x0e\x9e\
+\xc0\xa1\x46\x57\xe2\x9d\x3d\x5d\xf7\x25\x9e\x01\xac\x9f\xfa\x10\
+\x1b\x59\x38\x12\x23\xde\x7a\x0f\x38\xb6\x14\x1d\x07\x1b\xb0\xf7\
+\xac\x27\x31\xa7\x2a\x78\xdf\xe2\x19\x40\xf1\xc2\x9d\xd1\x31\x5d\
+\x0b\x7c\x43\xfb\x25\xe0\xe5\x92\xd8\x52\xe7\x4d\x14\x57\xdf\x78\
+\x20\xe2\x19\x40\xfa\xa3\x70\x5a\x69\xed\xb8\xf0\x97\x79\x9c\xc5\
+\x86\x05\x87\x6f\xe4\x3f\x28\xf1\xf4\xf8\x13\x62\x6b\x3e\x1b\x79\
+\x27\x5e\xba\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xd7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x9e\x49\x44\x41\x54\x78\xda\xad\x95\x6b\x4c\x1c\x55\
+\x14\xc7\xff\x33\x3b\xb0\xb0\xb0\x2c\x6c\x69\x37\xa5\x2c\x05\xa5\
+\x0f\xde\x0d\x88\x25\x04\x6b\x5b\x6a\x1a\x3f\x1b\x13\x68\xf4\x43\
+\xe3\x97\x6a\x34\x6a\xa3\xa6\xc6\x0f\x98\xa6\xc6\xa8\x6d\xac\x50\
+\x04\x6d\xfa\x4c\xcb\xab\x2d\x01\x14\x90\x02\x62\x95\x96\x42\x51\
+\x6c\x6d\xd9\xb6\x4b\x79\xec\xf2\xd0\x52\xde\xb0\x8f\x79\x7a\x66\
+\x90\x86\x98\xb0\xc5\xe0\x49\xee\xce\xcc\xde\xcc\xf9\xdd\xfb\xff\
+\x9f\x73\x87\xc1\xbf\xe2\xc0\xbb\x1f\xa7\xac\x59\x6b\x7e\x3d\xc8\
+\x18\xb2\xc7\x68\x0a\x36\x0a\x02\x0f\x97\xcb\x83\x89\x47\x63\x7d\
+\x83\x8e\xc1\xe6\xc9\x89\x89\xb7\x4a\x2e\x9e\xf5\x60\x99\xc1\x2c\
+\x7e\xf8\xba\xe0\x44\x69\x74\xec\xfa\x9c\xd5\x96\x70\xac\x5a\x63\
+\x81\xc1\x68\x84\xa4\xc8\x10\x25\x09\x13\xe3\xe3\x18\x1e\x70\xa2\
+\xa7\xbb\x1b\x1d\xad\xed\x07\xcf\x55\x9c\xc9\xfb\x4f\x80\x8a\xb2\
+\x2a\x67\x74\x6c\x54\xa4\x25\x3a\x06\x61\x61\xa1\x50\x64\x85\xfe\
+\x55\xa0\xd0\x45\xa2\x3b\x99\x86\x4e\xc7\xa2\xbf\xaf\x1f\xb7\xda\
+\xda\x70\xb5\xf9\x5a\xf9\xf1\xd3\xc7\x72\x96\x05\x38\x7d\xfc\x7c\
+\x53\xd2\x33\x89\xd9\x11\x1b\x37\x81\xf3\xe3\xc0\x50\x72\x1d\xcb\
+\xc0\x8f\xe6\x44\x1a\x12\x3d\x4b\x04\x93\x15\x06\x2c\xcb\xe1\xe1\
+\xe8\x08\xae\xff\xd0\x84\x86\xef\xeb\x0f\x5e\xa8\x2a\xf5\xb9\x13\
+\xe6\xf0\xa1\xc2\xa4\x8c\xed\x69\xb7\xd6\xc5\x6d\x42\x60\x90\x11\
+\x1c\x2d\xd9\x14\xa0\x83\x8e\x26\x3d\xa2\x0c\xaf\x96\x7c\x1e\xa2\
+\xee\x49\x85\xe8\x38\x1d\x06\xfa\xfa\x50\x7b\xbe\x04\x37\xda\x3a\
+\x43\xeb\x1a\xab\xa7\x96\x04\x9c\x39\x79\xe1\x62\xc6\xf6\xd4\x97\
+\x42\x22\xd6\xd3\xdb\x32\x82\x39\x16\x81\x7e\xac\xaa\x0e\x44\x82\
+\x8d\xba\x45\xda\x05\x41\x54\xa9\xe8\x99\x2c\x01\xab\x63\xe0\x4f\
+\x90\x2b\x55\x95\xa8\x29\xad\x7c\xfb\x52\x4d\x79\xfe\x92\x80\xfa\
+\x9a\xc6\xa9\xd8\xf4\x94\x10\x83\x29\x54\x4b\xea\xc7\x29\x30\xfb\
+\xf9\x6b\x93\xd3\xbc\x88\x49\x9e\xc4\x61\xd4\x95\xab\x12\xa9\x5e\
+\x28\xda\x00\xe3\x0f\xdb\x8d\x76\xb4\x56\x57\x77\x1e\xcd\xff\x22\
+\x7d\x49\xc0\xd5\xd6\xeb\x4a\x64\x62\x22\x74\xfe\xfe\x10\x68\x07\
+\x1e\x51\x81\x9e\xf4\x67\x19\x05\x3c\x59\x44\x17\xd5\x6a\xcd\xec\
+\xf9\xe4\xd0\xcc\xe7\x45\x16\x43\xbd\xfd\x68\x38\x59\x8c\x82\xa2\
+\xaf\x18\x9f\x80\x88\x84\x04\xb0\xb4\xea\x69\x02\xa8\x1e\x30\xff\
+\xf8\xcf\x68\xa9\xe6\x13\xca\x0b\xf7\x34\x2f\x90\x29\x6e\x5e\xc1\
+\x5f\x7d\x03\x68\x3e\xfb\x2d\x0a\x8a\x7d\x00\x9a\x1b\x5b\x94\xe8\
+\xa4\x14\xcc\xe9\x03\xa9\x72\xe4\xc7\xc5\xb5\xf8\x0d\x65\xd1\xaf\
+\x20\x50\x72\x2f\xed\x54\x90\x31\xea\x74\xa0\xa3\xaa\x64\xea\xf0\
+\x91\x4f\x43\x97\x04\xd4\xd6\x34\x0c\xac\x8d\x8b\x8b\xf2\x04\x99\
+\x11\x40\xd2\x73\x3a\x1d\xc9\x23\x83\x59\x44\xd0\xe4\x51\x58\x08\
+\xa2\x04\x2f\x2f\x13\x40\x82\x4b\x62\x31\xfe\xdb\x2f\xb8\x76\xb9\
+\xf6\xf2\x37\x27\x8a\x76\x2f\x09\x28\x3c\x7a\xf2\x83\x1d\xbb\x33\
+\x3f\x1b\xf2\xb7\x50\x65\xb0\x34\x18\xad\xa1\x88\xf3\x58\x22\x99\
+\x24\x11\x24\x19\xbc\x40\xda\xd3\xca\xdd\x34\x5c\xb3\x2e\x4c\x75\
+\xd6\xe2\x52\x59\xcd\xab\x8d\x3f\xd7\x9d\xf3\xd9\x68\xcd\x8d\x3f\
+\x29\x81\x16\x2b\x1e\xea\xcd\x30\x90\xc1\x9c\x8e\x7c\x60\x19\x4d\
+\x28\xd5\x60\x99\xca\x47\x24\xf3\x79\x82\x78\xbd\xd4\x1f\x6a\x97\
+\xd8\xdb\x70\xa5\xae\xe6\xde\xf1\x53\xc5\x9b\x7d\x36\x9a\xfa\xf3\
+\x49\xde\x97\xb9\xbb\x5e\xcc\x2a\x71\xeb\x4d\x18\x66\xcc\xd0\xd3\
+\xfb\x94\x1f\x54\xee\x5a\xfd\x6b\x00\x1a\x82\xc8\x90\x07\x0a\xb8\
+\xd1\x1e\x38\x6e\xb5\x22\x48\x1f\x62\x7b\xe7\xfd\x7d\xf1\x4f\x04\
+\xa8\x91\x7f\xa4\x28\x27\x29\x35\xbe\x94\x33\x86\x63\x58\x32\x61\
+\x16\x01\xe4\x83\x3c\x5f\xa6\x64\x82\x48\x9a\xeb\xdd\x13\x08\x74\
+\x3d\x80\xbd\xeb\x26\xb2\x76\x6c\x83\x5e\xaf\xc7\xb1\xfc\xc2\xc9\
+\x3f\x6e\x77\x95\xde\xbc\xd9\xf5\x86\x4f\x80\x1a\x1f\xbd\x77\x28\
+\x75\x63\xe2\x53\x55\xeb\x22\x2d\x56\xce\x10\x0a\x17\xad\x58\x22\
+\x63\xd5\xee\xe5\xa4\x29\x38\x7b\x7b\x71\xcf\xd6\xd3\x9d\x98\xb0\
+\x25\x3e\x3e\x6d\x33\x1a\xea\x1b\xd0\xf2\x63\x13\x9e\xdd\x9a\x89\
+\xef\xaa\x2b\xcb\x6c\xb6\x3b\xb9\x3e\x01\x0b\xb1\xff\xcd\x0f\x63\
+\x0c\xfa\x80\xbd\xa6\xd5\xa1\x5b\xbd\x6e\xf7\x2a\x72\x64\x6c\xc4\
+\x39\xdc\x31\x3d\x37\xfd\xf9\xb9\xf2\x53\x33\x07\xf6\xe7\xbd\x3c\
+\xe5\x1a\xaf\xb0\xf7\xdc\xc5\xde\xd7\xf6\xc1\xed\x71\xa1\x9d\x4e\
+\xd8\x96\x96\xc6\xb2\x1e\xbb\x3d\xf7\x89\x80\xe5\x44\x66\xd6\x73\
+\x4a\x6e\xee\x2b\xf0\xa3\x13\x60\x92\xbe\x15\x6e\xb7\x07\x77\x6e\
+\xff\x8e\xae\xce\x5f\x4b\x1f\xf4\xf7\xee\x59\x31\x60\x67\xf6\x0b\
+\x56\xde\xcb\x3b\x9e\xdf\x99\xad\xd5\xf2\xec\xcc\x34\x3c\x1e\x37\
+\x7a\xec\xf7\x61\xbf\x7b\x77\xd0\x31\xe4\xb4\xae\x08\xa0\x46\x56\
+\xd6\x36\x2b\x7d\xed\x1c\x49\xc9\x5b\xe8\x38\x97\x31\x37\x33\x0b\
+\x9e\xf7\x60\x78\xd0\x89\x41\xe7\x80\x73\x68\x64\x24\x6a\x45\x00\
+\x35\x32\x32\x32\xad\xa2\x20\x38\xac\x31\xd1\x90\xe8\x90\x72\xb9\
+\x5d\x04\xe1\x31\x3e\x3a\x8a\x87\x7f\x8e\xd8\x56\x0c\x50\x23\x2d\
+\x2d\xdd\x2a\x8a\xa2\x23\x2c\x2c\x8c\x1a\x52\xa6\x7e\xe1\x31\x39\
+\xf6\x88\xe4\x61\x57\x26\xd1\xe2\x48\x4e\xde\x62\xa0\x9d\xd8\x0c\
+\x41\xc1\x51\x33\xd3\x13\xb0\x44\x44\x52\x7a\x0c\xfd\x6f\x80\x85\
+\xd8\xf0\xf4\x86\x6e\x43\x60\x50\x5c\x58\xb8\xf9\xbe\x29\xc0\x5c\
+\xf7\x37\x3d\x5c\x37\xde\x61\x2d\x73\x5d\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x77\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x3e\x49\x44\x41\x54\x78\xda\x9d\x56\xfd\x4f\x5b\x55\
+\x18\x7e\xce\xed\xbd\xb7\xdf\x14\x58\x81\x32\x28\x8c\x29\x20\x38\
+\xc7\x36\xc7\x1c\x22\x14\x86\x88\xf8\xe3\xcc\x70\x89\x89\x31\x26\
+\xc6\x05\xff\x1a\x7f\x80\x2d\x9a\xcc\xc4\xa8\x61\xfc\x30\x13\x63\
+\x74\x25\x26\x83\x99\xb1\xc4\xb2\x04\xb6\x20\xb0\x74\x94\x59\xc6\
+\xb7\xb0\x42\x3f\xb8\x1f\xbd\xc7\xb7\x05\x26\x63\xc5\xad\xbc\xc9\
+\xc9\xb9\x39\x3d\xe7\x79\xce\x79\xde\xe7\xbc\xa7\x0c\xff\x13\xb1\
+\x96\x0e\x1f\x37\xf8\x45\x4d\xd3\x3b\x74\xc3\xa8\xe0\x9c\x83\xd3\
+\x78\xaa\x09\x82\x10\xb2\xcb\xa2\x9f\xfa\x3e\xeb\xa0\x7f\x68\x3f\
+\x0c\x96\x69\x30\xda\xd2\x51\xc7\x75\x3d\xa0\x28\x9a\xa4\x1f\xca\
+\x85\xf5\xed\x5a\x08\xa5\x05\x84\x6c\x3c\x5d\xb6\x19\x5e\xc2\xca\
+\xf0\x3d\x88\xcb\x4f\x90\x67\xb3\x6b\x36\x49\xac\xb7\x0d\xfa\xc7\
+\x5e\x48\xb0\xee\x7b\xaf\x47\xdf\x54\xbb\x51\xe2\x86\xfd\xd3\x4e\
+\x08\x4e\x07\xa0\xa9\x74\x9c\xf8\xb3\x13\xed\x76\x08\x92\x0c\x7d\
+\x23\x8a\xe0\xd7\x3f\x41\x9c\x5b\x46\xb1\xd3\xd5\x9b\x33\xe4\xff\
+\x72\x5f\x82\x8d\xe6\xf6\x6b\x7a\x5c\xe9\xb2\x74\xb5\x42\x3a\x53\
+\x03\x63\x2e\x0c\x63\x65\x09\xd8\x4c\x64\xd8\x0b\x09\x65\xb1\x42\
+\x70\x17\x41\x2c\xf1\xe2\x9f\x3b\xf7\x30\xf3\xfd\x0d\x54\xe7\x1f\
+\xea\xcf\xb9\x35\xf0\xd1\x73\x04\x6b\xcd\xed\x3d\x2c\xae\x74\xcb\
+\x17\x5a\x21\x56\x79\x90\x0c\x4e\xd0\xce\xf5\x94\xd8\x34\x2b\xa3\
+\x92\xc4\x41\x24\x06\xc9\x26\x89\x90\x2a\x6b\xb1\x3a\xfe\x37\x82\
+\x3f\xde\xc0\x1b\xee\x82\x5e\xe7\xf6\x49\xd2\x2b\x57\x9b\xda\xeb\
+\x98\xaa\x8d\x5a\xcf\x37\x43\x28\xcb\x25\xf0\x49\x02\x36\xed\x0f\
+\x9c\x91\x28\x49\x24\x35\x58\x18\x0b\x61\xc3\x1f\xc0\x61\x87\xf3\
+\x84\xeb\xd6\xc0\x58\x1a\x61\xa5\xb1\x4d\xb5\x14\xb9\x25\xf9\x42\
+\x3d\x92\x93\x7f\x65\x07\xbe\x87\xc4\x5c\x73\x0c\x23\xdf\x0e\xc0\
+\x1b\x55\xb4\xe2\xdb\x37\x65\xb6\xd8\xd4\xee\x93\x54\x6d\xd0\xfe\
+\xc5\xfb\x30\x42\x13\x5b\xe0\x99\xcc\x95\x22\xdc\x69\x7b\x81\xf9\
+\xb6\x79\xa9\x67\x29\xc9\x8e\x54\x63\xfc\xab\xeb\x28\xcf\xcd\x6b\
+\x61\xf3\x8d\x6d\x97\x9d\x25\x85\x97\xc4\xe3\x2e\xf0\x84\x02\x24\
+\x35\x6a\xc6\x96\xd9\x53\x58\x4c\x48\xe7\xc1\x88\xac\x02\xf1\x18\
+\xa0\x28\xcf\x12\x98\xcd\x80\x8d\x1c\xe5\x70\x52\x2e\xe8\x5b\x34\
+\xc1\x64\x31\x63\x7c\x38\x8c\x92\x48\xe2\x0a\x9b\x6f\x38\x37\x9d\
+\xdb\x70\xb4\x02\xb6\x24\x8c\xe0\x2a\xe4\xce\x0f\xc1\x4b\x3d\x5b\
+\x24\xa9\x04\xcf\xce\xc1\x88\x45\x68\xe3\x74\x32\x21\x93\xb3\x53\
+\xd2\x50\x67\x62\x30\x66\x17\xa1\xdf\xfc\x05\x52\xd3\x31\xac\xc4\
+\x24\x68\x23\xd3\x21\x36\xd7\xd0\xc6\xf3\xde\x2a\x01\xb7\x00\xfa\
+\xfd\x79\xd8\xae\xf6\xc1\x54\x98\x9f\x9d\xfe\xdb\xa1\xcf\xcc\x62\
+\xe3\x78\x25\xe4\x93\xa5\x48\x30\x19\xcb\x6b\x39\x60\x8f\xcf\x9e\
+\xe3\xf9\xbe\x52\xda\x81\x84\xf5\xfe\x01\xb8\x7e\xfe\x9d\x12\x55\
+\x75\x20\x02\xe5\xc1\x43\xac\x9d\x7e\x1d\xce\x53\xe5\x10\xe9\xa0\
+\x81\xc1\x47\x60\xa1\x77\xde\xe5\xc5\x67\x3c\xd0\x03\x7f\x62\x39\
+\x10\x44\xc1\xe8\x14\xec\xd5\xaf\x1e\x88\x20\x36\x15\xc4\xf2\xa9\
+\x5a\xb8\x4f\x96\x91\xba\x0c\x13\xc3\x0b\x60\x93\x67\x5b\x79\x99\
+\x38\x0b\x43\x51\x31\x73\xff\x31\xca\x1f\x86\xe1\x38\xec\x39\x10\
+\x41\x74\x6e\x01\x8f\x5e\xf1\xa2\xa2\xce\x4b\xde\x60\x18\x0f\x2c\
+\x81\x05\x9c\xee\xe9\x4a\xaf\xb9\x42\x12\x25\xcc\x2c\xac\x61\xdd\
+\x55\x04\x33\xd5\x1f\x9e\xb6\xde\xcb\x07\x23\xfb\x2a\x54\x97\x72\
+\x22\x8b\x38\xe2\xc9\x83\x46\x77\x62\x62\x6a\x2d\xc4\xfe\x90\x1c\
+\x97\x8f\x7a\x6c\x97\x5c\x2e\x4b\xda\x10\x2c\x55\x31\xf9\xb6\x4d\
+\xb3\x62\x40\xda\xd2\x3c\x65\x6b\xfa\x8e\x44\x36\x31\xbd\x18\xbf\
+\xc2\x86\x64\xbb\xcf\x21\x8b\x83\xaf\x95\x3a\xa1\x27\xb3\x45\xcd\
+\x1c\x22\x59\x76\x72\x76\x03\x51\x55\x6f\x49\x9b\xfa\x57\x93\x4d\
+\xad\x2f\x72\x48\x16\xb3\x08\x23\x4b\x69\xf6\x86\x40\x52\x6d\x2a\
+\x3a\x02\x8b\x51\xed\x83\x64\x5c\x4e\x13\xfc\x26\xdb\xea\x44\x60\
+\xb4\xa1\x30\x87\xee\x0c\xcb\x5a\x9d\xdd\x2a\x91\x48\xb8\xb3\xb4\
+\x0e\xaa\xc3\x27\x3a\xd5\xf8\xd8\xd3\x6b\x79\xdd\x64\xee\x29\x34\
+\x4b\xdd\xa7\x5d\x0e\xa8\x06\x3f\x50\x0a\x64\x72\xce\x48\x24\x8a\
+\x25\x45\xeb\x3d\x9f\x54\xfe\x2b\xd7\x3b\xf1\x83\x20\x5f\xf3\x4a\
+\x62\xd7\x9b\x0e\x3b\x92\xf4\x93\xf1\x92\x34\x02\xcd\x35\xd1\xdc\
+\xbb\xd1\x18\xc2\x9a\xde\xff\xb1\xa1\x3e\xff\xe0\xec\xc4\x77\x4c\
+\xea\xb1\x32\xd6\xdd\x48\x24\xb9\x26\x91\x88\x90\xce\xcb\x5e\x2a\
+\xb6\xad\x77\xaa\xf6\x3e\x49\xea\xb8\x4d\xe0\x09\xce\x7b\x3f\xe1\
+\xda\xfe\x4f\xe6\x4e\x5c\x65\xa6\x3a\x95\x23\xe0\x15\x44\xa9\x4a\
+\x96\xe1\x96\x24\x58\x53\x16\xdc\xb5\x28\x41\x56\x5e\xd1\x34\x3c\
+\x50\x55\x84\x0d\x5d\xa3\x6c\xd6\x7f\xc6\x93\x2f\x7e\xf4\x77\xc7\
+\x37\x10\x7c\x74\x82\x8b\x04\xdc\x41\x37\xa3\xc2\x95\xde\x2f\x79\
+\x9c\xce\x45\x6e\x0f\xd1\x62\x3f\x8d\xf4\x7d\x0e\x63\xdf\xbf\x2d\
+\xff\x02\x58\xd2\xb2\xfc\xa2\x0a\xc2\x8b\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x1c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x03\xe3\x49\x44\x41\x54\x78\xda\x95\x95\x6d\x4c\x5b\x55\
+\x18\xc7\xff\xe7\xdc\xde\xde\x8e\x6e\xbc\x88\x5c\x06\x0b\xb8\x8d\
+\xa1\xa2\x86\x3a\x03\x93\x91\x29\x44\x82\xc4\x4d\x36\x9d\x5b\x16\
+\x46\x98\x69\xc8\xd8\x07\x3f\x19\x9d\x89\xc6\xb7\x18\x13\x13\x4d\
+\xf4\x83\xc6\xcd\xc4\xb8\x44\x13\x13\x90\x96\xf1\xb2\x0d\x26\xa9\
+\x8e\xe1\x1c\x6c\x4a\xb6\x6e\x6e\x8e\x97\x41\xa9\x20\x6c\x6c\x50\
+\x56\xfa\x76\x7b\x8f\xa7\xc5\x25\x5c\x92\x5e\xda\x9b\x3c\x1f\x6e\
+\x72\xce\xf3\x3b\xcf\xff\xff\x9c\xe7\x10\x2c\xfb\xca\x9b\x27\xa6\
+\xf2\x64\xa3\xcc\x18\x12\xfa\x28\x0f\x4f\x40\x85\xc7\xa7\x22\xcc\
+\xc2\x58\x25\xd2\x3d\x6d\x3b\xb2\x6c\x64\xe9\xa2\xb2\xa6\x71\x56\
+\x91\xbf\x06\xe5\x39\x49\x70\x2d\xa8\xa0\x24\x7e\x80\x81\x2f\xee\
+\x1a\x9a\x47\xef\xe0\x1c\xee\xf9\x14\x6c\xc9\x4b\x59\x68\xd9\xbe\
+\xd6\xac\x49\x51\xfa\xc3\x28\x7b\xa7\x5c\xc6\x15\xdf\xe2\x89\x48\
+\x02\x00\xa3\x81\xe2\x78\xdf\x34\x5c\xb3\x01\x44\xb6\x6d\xca\x32\
+\xa3\x73\x57\xb6\x36\x45\xc9\xb7\xc3\xac\xa1\x4c\xc6\xb4\x4a\x90\
+\x40\xee\x45\x80\x48\xf1\x93\x63\x12\x01\x89\x82\x71\x7d\x33\x52\
+\x4c\xe8\x5a\x0e\xd8\x72\xf4\x06\x3b\xf8\x5c\x16\xfe\x55\x08\xd7\
+\x11\x3c\x56\x36\x42\xe0\x29\x0c\x3c\x8b\x14\x01\x74\xbb\xb1\x5a\
+\x4e\x82\xaa\x32\xac\x36\x09\xe8\xa8\x5e\x06\x78\xea\xcb\x6b\xac\
+\xa1\x32\x1b\x13\x21\x8a\xaa\x0c\x11\xc5\x0f\x88\x08\xeb\x25\xe7\
+\x71\xe1\x4e\x08\xa7\x6f\x05\xb1\xca\x28\xa0\xb1\x73\x14\xb9\x0f\
+\x3f\xd8\xcb\x54\x26\xf1\x2a\x92\xdb\x5f\xcc\x7a\x54\x03\xd8\xfc\
+\xb9\x93\x35\x54\xe5\xc0\x1d\x16\x30\x3e\xe3\xc7\xd8\x0c\xd7\x53\
+\xc7\x88\x88\x14\x0f\xa5\x4b\x3c\x4c\x10\x79\x19\x2d\x27\x87\x31\
+\xf0\xa6\x45\xb3\x41\xf3\x53\xf8\xe9\x25\x56\xff\x42\x2e\xfe\x09\
+\x45\xce\xc6\xa0\xc6\xa1\x3d\xfd\x3f\x49\xc4\x83\xb6\x53\x23\xb8\
+\xf4\x96\x0e\xe0\xf1\x8f\xff\x60\xf5\xd5\x1b\xe0\x0a\x12\x3c\x9b\
+\x29\xa1\x28\xcd\xa8\xeb\x43\x44\xff\x8b\x77\x83\xe8\x9d\xf2\x43\
+\xe2\x12\x75\xb4\x0f\xc2\xf9\x6e\x51\x6c\x40\xc1\x07\xfd\xcc\xfa\
+\xd2\x46\x8c\x07\x05\xdc\x99\xf6\x60\x6e\xc2\x03\xdd\xcb\xc0\xcd\
+\x4c\xc9\x4e\x46\xba\x9c\xcc\x25\xa2\xe8\x6c\xbf\x8e\xab\x1f\x3e\
+\x1d\x1b\xf0\xc8\xdb\xe7\xd8\xab\xbb\xf3\x31\xea\x13\xa2\xf2\xe8\
+\x19\xbc\xd4\x68\x81\xcb\x69\xe4\x15\x74\xb7\xfe\x85\x6b\x9f\x94\
+\xc6\x06\xe4\x1f\x3e\xc3\x0e\xec\x79\x0c\x83\xfc\xa2\x3d\x9f\x63\
+\xc2\xb6\x0c\x89\xdf\x50\xaa\x23\x11\xd0\x3d\xe9\x83\xc3\xed\x83\
+\x24\x19\xf0\x8b\xdd\x89\xbf\x3f\x2b\x8b\x0d\xc8\x7b\xdd\xc1\xf6\
+\xef\x7b\x02\x23\x0b\x04\xce\xa1\xbb\xf0\xce\x2e\x40\xf7\xc6\x71\
+\x7b\xcc\xa9\x49\xb0\x6c\x4a\x83\x20\x0a\x38\x67\x1f\xc0\x8d\x2f\
+\x2a\x62\x03\x36\xbe\xd6\xc5\xf6\xd5\x58\x30\x74\x8f\x82\xd0\xe8\
+\x7e\xe8\x5d\x35\x72\x3f\x78\x23\x18\x8c\x06\xf4\xd9\x2e\x62\xe8\
+\xab\xaa\xd8\x80\xf5\x87\x4e\xb0\xbd\xb5\x9b\x71\xd5\x43\x51\xbc\
+\x46\x41\x61\x6e\xea\x8a\x5d\x74\xd9\x35\x8b\x3f\xe7\x05\x18\xb9\
+\x44\x03\xb6\x7e\x8c\x1c\xdd\x11\x1b\x90\x6b\x6d\x65\xbb\xeb\x8a\
+\x71\xdd\x4b\x70\x7b\xda\xcb\x25\xf2\xae\x68\xb2\x39\xd5\x8c\x4c\
+\xd9\x0c\xca\x25\xba\xd2\xf4\x3b\x6e\x7e\xb7\x4b\x07\x50\xd7\xc2\
+\x76\x1e\x28\x86\x73\x9e\x45\xc7\x6f\x3c\x03\x2f\x2a\x23\xaf\x92\
+\x8a\x06\x0c\x37\x9d\xc7\xcd\xef\x5f\x8e\x0d\xc8\xd9\xdf\xcc\xaa\
+\xad\x25\xb8\x3c\x47\xa3\xad\x17\xef\xc7\xc2\x2a\x08\xaf\x60\xb4\
+\xf9\x37\x8c\xfd\xb8\x57\x0b\x58\x57\xd3\xd8\xef\x0f\x2a\x0a\x3f\
+\xc5\x56\xc6\x47\xa8\x39\x23\x05\xfe\x10\x01\x8d\x23\x71\x64\x4c\
+\x49\xbc\x57\xd7\x56\x14\x82\x08\x14\x13\xf6\xb3\x18\x6f\xac\xd1\
+\x02\x4a\xde\xef\x61\xc7\xde\x7b\x06\xf3\xfe\x48\x37\x2c\x96\x1b\
+\xef\x5b\x60\x92\x08\xac\x1f\x39\x10\x28\xc8\x03\x15\x04\xcc\xd8\
+\x7e\x85\xdb\x56\xa7\x05\x3c\x79\xf8\x67\x56\x5b\x5f\x0a\x97\x27\
+\x90\xf8\x23\x63\x12\x61\x3f\xd2\x03\x63\x51\x01\xaf\x40\xc0\x6c\
+\x8b\x03\x93\xad\x56\x2d\xc0\xf2\x46\x17\xab\xaa\xdd\x0a\x17\x1f\
+\xcd\x94\x24\xf6\xd2\x47\x7a\xbf\xe7\x58\x0f\x48\xa9\x25\x2a\x91\
+\xd7\x7e\x1a\x53\x1d\x07\xb5\x80\xb4\xca\x23\x4a\xfe\xce\x6d\x82\
+\xb8\x4e\xe6\xc3\x2b\x9c\x80\xb5\x88\xb6\xe6\x58\xdb\x79\x84\xe4\
+\x4c\x08\x92\x84\x60\xdf\x85\xee\x5b\xa7\x1a\x2a\x35\x80\xf4\xed\
+\xdf\xc8\x4c\x51\xbe\x56\x95\xf0\x2b\x46\xbe\x90\xb1\x78\x5e\x81\
+\xfb\x26\x13\xb0\x40\x00\x6a\x28\x00\x84\x42\x61\x22\x18\xd6\xdf\
+\x3e\x79\xc8\xbd\x74\xcd\x7f\x95\x6f\x7b\x28\x8d\x6b\xd6\xa4\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x9f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x66\x49\x44\x41\x54\x78\xda\x8d\x56\x5b\x6c\x14\x55\
+\x18\xfe\xce\xdc\x76\xba\xbb\xb3\xed\xd2\xee\x76\xbb\xbd\xd2\xda\
+\x0b\x02\xb5\x35\x3c\x68\xd4\xe8\x83\xc6\x82\x21\x62\xb0\x04\xe5\
+\x62\xb9\xa4\x42\x41\x45\x09\x21\x31\x41\x14\x63\x7c\xa8\x04\x83\
+\x31\xa6\x82\x1a\x82\x0f\x18\x43\x82\x40\xc0\x40\x78\xd0\x17\x42\
+\x22\x96\xda\x8b\xd0\x00\x2d\xed\x96\xed\xbd\xdd\x76\x77\xf6\x36\
+\x3b\xc7\xb3\x33\xcb\x94\x26\x0d\x78\xb2\xb3\x73\x2e\xff\xff\x7d\
+\xe7\xbf\x9d\x33\x04\xac\x45\xd7\xbe\x4d\x91\x63\x07\x44\x1e\xe0\
+\x38\x80\x10\x36\x9b\x7e\x32\xaf\x05\xc7\x0b\x34\x9a\x79\x27\x53\
+\xd0\xc3\x31\x38\x4e\xfe\x40\x88\xda\xb8\x81\x72\x75\xc5\xe0\x4a\
+\xdc\x26\x78\x1a\xe1\x61\x80\x4c\x5f\x9b\x50\x33\x18\xba\x01\x24\
+\xe6\x39\x91\xee\xce\xa1\x66\xfa\xd4\x7c\x52\x43\x21\xe8\x5d\x41\
+\x10\xb5\xb9\x99\x0a\x2f\x54\x30\x20\x6e\x3e\x01\xd5\xa1\x05\x67\
+\x90\x52\x59\xbf\x72\x19\xb8\x7c\x2f\xc4\xca\x72\x03\x2e\x19\x08\
+\x22\xd1\xd7\x8f\x54\x6f\x07\x44\x66\x78\x96\xdf\x6d\xe2\xa7\x52\
+\xf3\x48\xb4\xab\xf7\x40\x22\xbb\x5a\xa8\xf8\x4c\xa9\x49\xc0\x80\
+\xd3\x00\x34\xa6\x41\x1b\x54\x21\xbd\xb9\x1e\xe2\xd2\x25\x78\x54\
+\x0b\x77\x76\x63\xf6\x97\x93\xc8\x29\x51\xc0\xcb\x62\x06\x9c\x99\
+\x96\xd2\x91\xfc\x7b\x88\x11\xec\xde\x45\x85\x15\x45\x96\xef\x69\
+\x38\xc1\x64\x3c\xb0\x6d\x6d\x02\xb1\x49\xf8\x3f\x4d\x8f\xc7\x31\
+\xd4\x7a\x18\x6e\x25\x06\xc9\x69\x63\x13\xba\x41\x92\xb0\x08\x9e\
+\xf6\x9b\xe0\xf1\x14\xe8\x8c\x1d\xf2\xbe\x8f\xe6\x94\xc3\x61\xa8\
+\x17\x2e\x21\xd5\xd5\xce\x94\xd2\xe4\xcc\xbf\x10\xc0\x2d\xab\x87\
+\xeb\xb5\x06\xf0\x8a\x62\xc9\xde\xfb\xf4\x10\x3c\xee\x04\x04\x29\
+\x6d\x89\x86\x78\xfb\x30\xc8\x6c\xcb\x0e\x2a\xd5\xfb\x0d\xdf\xeb\
+\xfd\x51\xd8\x0e\x1c\xb4\x76\x9e\xec\xea\x41\xec\xc4\x71\x88\x65\
+\x39\x86\xc9\xda\x64\x14\x49\x46\x20\xb9\x65\xf0\x02\x87\xd0\x9d\
+\x09\x38\xb6\xbc\x0b\x67\xed\x32\x33\x04\xcc\x92\x81\x7d\x7b\x51\
+\x58\x99\x6d\x58\x11\xeb\x60\x04\x33\x2c\xc8\xb6\xfa\x02\xe8\xa3\
+\x11\xc8\x9f\xb4\x5a\xbb\x49\x32\xdf\x6a\xa7\x4f\x80\x2f\x70\x00\
+\x71\x1d\x3a\xe7\x83\xf4\xce\x46\xc3\xc5\xc3\xdf\x1f\x87\x9b\x9f\
+\x80\x60\xe3\x11\x66\xd9\x22\x35\x6e\x85\xb3\xae\xd6\xd2\x1d\xdb\
+\xb7\x13\xd9\xf9\x0a\xd4\xce\x11\x90\xd0\xf6\x6d\x54\x5e\x9e\x0f\
+\x3d\x98\x80\xfc\xa5\x49\x40\x67\x67\xa1\x7e\xbc\x1f\x62\x75\x5e\
+\x66\x9c\x80\xb8\xe9\x3d\x70\x45\x85\xc6\x58\x1d\x18\x44\xe2\xa7\
+\x23\xb0\x67\xcb\xc6\x78\xb4\x7b\x18\xbe\xc3\x5f\x43\x70\xb9\x8c\
+\x71\x5f\x4b\x33\xfc\x25\x4e\x44\xbb\xc7\x40\xa6\x9a\x9a\xa8\xbd\
+\x36\x1f\xc4\x53\x07\x71\xe3\x7a\x43\x20\xf6\xf3\x29\x90\xc0\x75\
+\xe6\x2a\xc1\x24\x98\x8a\x42\xd8\xb6\x17\x7c\x69\xb1\x99\x39\x77\
+\xfb\x90\x68\x6b\x85\xc3\xab\x98\xae\x63\x59\x37\x53\x58\x8b\x82\
+\x6d\x5b\xcc\x58\x7c\xd7\x86\xfc\x89\x2e\xa8\x3d\x13\x20\x13\x9b\
+\x37\x53\x47\x11\x4b\xb1\x55\x1b\x20\x3c\xf7\xac\x21\x10\x59\xd7\
+\x08\x4e\x51\x59\x46\x85\x59\xd0\x43\x08\xdc\x1c\x43\xc5\xd9\x4b\
+\x10\x96\x2f\x35\xd6\xa7\x3b\xfe\xc1\xe8\xda\xd5\x28\xac\xca\x05\
+\x71\x29\x20\x76\x27\x82\x93\x3c\xca\xcf\x9c\x35\xd6\x83\x67\xcf\
+\xc3\x76\xe5\x34\xe8\x70\x0c\x64\x7c\xdd\x3a\xea\xf0\x3b\x20\x7d\
+\x70\x10\x5c\x59\xa9\x21\x10\xaa\x5a\x0c\xa1\xd4\x61\x15\x67\xe0\
+\xf6\x24\x2a\xce\x5d\x9e\x23\xb8\xd1\x81\x91\x35\x2b\x51\x54\x9e\
+\x29\x30\x96\x95\x81\xfe\x29\x54\xf7\xdf\x37\x86\x53\xed\x37\xa0\
+\x1f\xfb\x0a\xfa\x58\x1c\x64\xb8\xa1\x81\x2a\x74\x1a\xb6\xd6\xe3\
+\xe0\x33\x00\xa1\x4a\x46\x50\x6c\x9f\xa7\xbc\x20\x41\xb1\xcb\x0a\
+\xec\xe0\xc0\x0c\x6a\xee\xcd\x11\xc4\xdf\x6f\x02\x1c\x3e\x90\x3e\
+\xbf\x9f\x7a\x7c\x76\x88\x7b\x0e\x41\xda\xf4\x96\x09\x50\x53\x03\
+\xd1\x33\x57\x48\x81\xc1\x99\x85\x09\xfc\x4e\xeb\x28\xba\x33\x9c\
+\x44\x6d\x5f\x9f\xe5\x22\x7d\x7f\x0b\x12\xd3\x49\x90\xbb\xbe\x02\
+\xea\xad\x60\x31\x78\x6a\x15\xe4\x6f\x8f\x98\x31\xd8\xf5\x21\xe8\
+\xb5\xf3\x20\xa2\x79\xd0\x05\x82\xe1\x85\x09\x3c\xa6\x1b\x13\xac\
+\x40\xc7\x56\xbc\x82\xaa\x1f\xdb\x8c\x71\xc7\xe6\xad\x78\xa2\xeb\
+\x4f\x04\x87\x22\x20\xb7\x7d\x3e\xea\x2b\x55\x58\x30\x79\x38\x7b\
+\xfe\x35\xbd\x32\x3e\x8e\xe9\xfa\x7a\xd8\x7c\xb2\x19\x83\xf1\xc8\
+\xc2\x04\x6e\xbb\xb1\xde\xc7\x0e\xc5\x4a\x56\x37\x36\xaf\x69\xf6\
+\xf5\xd2\x12\x54\xbb\x04\x0c\x8d\xa8\x20\xb7\xbc\xf9\xb4\x90\x65\
+\x11\x9d\xd5\x20\x1d\xf9\x0e\x12\x2b\x7f\x23\x55\xcf\x5d\x44\x74\
+\xcf\x0e\x48\x8a\xc8\xaa\x5e\x47\x7f\x5e\x39\x96\xfc\x7a\x0a\xe9\
+\xf3\xb2\xb7\x91\x1d\x82\xfd\x3d\x28\x74\xca\x18\x0f\xc5\xe0\xfc\
+\xa6\x0d\x79\x6b\x56\x9b\xee\x39\x7d\x86\xe9\xed\x84\x97\xad\xa5\
+\x37\x46\x6e\x7a\xbc\xb4\xa8\xc0\x69\x54\xa8\x1e\x15\xa0\x74\xb4\
+\xb3\xb4\x33\x03\x1c\x65\x24\xb3\xcd\xdb\x21\x67\x4b\x08\xc6\xe2\
+\x56\x4c\x72\x79\x01\x3c\x3b\x1c\x47\x19\xb8\xe7\xd8\x31\x2c\x7a\
+\xdd\x04\xd7\x22\x11\xb4\x57\xd7\x60\x49\x96\x59\x3f\x03\x53\x8c\
+\xa0\x3b\xcf\x43\x4b\x32\xbe\x84\xc6\x2c\xce\x2d\x81\x72\xf5\x0f\
+\x0b\x4c\x1b\x1b\xc7\xcc\x81\xcf\x11\xbb\x74\x01\x24\xaa\xb2\xa4\
+\xa2\x88\x4b\x32\xa4\x57\x57\xc2\xfb\xc5\x67\x90\x3c\x79\x96\xec\
+\x5f\x75\x2b\xb0\x78\x72\x04\x36\x9e\x33\x2b\x3a\xc4\x5c\xd4\x99\
+\xeb\xa1\x65\x8b\x1c\x56\x36\xa4\xdd\x41\x7d\x65\x50\xae\x5c\xb4\
+\x2c\x79\x5c\xd3\x22\x2a\xba\x9e\x7f\x11\x85\x23\xf7\x91\xc5\x0e\
+\xc1\x07\x58\xb7\xc3\x51\x90\x1b\xee\x3c\x5a\x91\x63\x9f\x77\xf3\
+\x51\x9d\x22\xc9\xd9\x90\x75\xf4\x28\xb2\x56\xaf\x7c\x24\xf8\xc4\
+\x6f\xe7\x30\xdc\xb2\x1b\x05\xba\x06\x91\x70\x0f\x10\x8c\x5f\xaf\
+\xca\x08\xae\x65\x2f\xa2\x4f\xba\x1c\xd6\x64\x66\xd9\xf8\xd3\x98\
+\x35\x9a\x6c\x07\xdf\xb0\x0a\x5c\x55\x25\x6c\x2f\xbf\x64\xa6\xf1\
+\xe5\x2b\x88\xdd\xea\x45\xfc\xe2\x05\xc8\xd1\x28\x5c\x82\x60\xde\
+\x64\x96\xb2\xd9\xe9\x64\x6b\xe4\x77\x87\x8b\x56\x67\xc9\xc8\x15\
+\xa5\x79\x24\xf3\x84\x99\x72\x92\x59\x95\xbe\x6c\x1e\x4c\xd9\x1e\
+\xfe\x30\x78\x58\x27\xd3\xc6\x53\x1a\xba\xd8\xfd\x60\x48\x9d\xb7\
+\xbb\xa8\xc2\xb2\xc2\xa8\x2b\xfa\x48\xbd\xc7\xae\xa5\x3f\x34\x34\
+\xb6\x91\x90\x9e\xc2\x1b\xd1\x30\xf9\x0f\xb9\x00\x6f\xb3\x07\xfe\
+\xe6\x73\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x49\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x10\x49\x44\x41\x54\x78\xda\x85\x95\x59\x6c\x54\x55\
+\x18\xc7\xff\xf7\xce\xb4\xcc\x30\xd3\xa1\xd3\x42\x05\x3b\x1d\x48\
+\x90\x26\x6a\x2c\x52\x64\x13\x63\xf0\x81\x97\x42\x64\x89\x22\x4b\
+\x90\x25\xf0\x02\x1a\x45\xa4\x1a\x85\xc4\x07\x5f\x95\xf8\xa2\x04\
+\x34\x44\x21\xad\xbe\x10\x42\x84\x68\x5d\xba\xa9\xd0\xca\xd2\x4e\
+\x4b\xa1\xd5\xd2\x74\x98\x99\x32\xa5\x30\xfb\xd6\xbb\x1c\xbf\x73\
+\xee\x15\x67\xda\x22\x67\x72\xe7\x4c\xce\x9c\xf3\xff\xdd\x6f\x3d\
+\x12\xcc\xf1\x57\x5f\x3f\x83\x24\x41\xd3\x34\xe8\xba\x0e\xc6\x58\
+\xde\x4c\x7f\x31\x1d\x89\x71\x15\xdd\x77\xd2\x90\x69\xbf\x58\xa7\
+\x87\x31\x0d\x4c\xe3\xb3\xce\x17\x01\x09\x42\xe3\x9d\xed\x6b\x25\
+\xae\x2b\xe5\x03\x7a\xac\x1e\x14\x4b\xb4\x99\x7f\x98\x21\xc2\x1f\
+\x3e\x08\x85\xec\xb8\x86\xc0\xbd\xb4\x71\x8a\xeb\x41\x6c\x82\xd8\
+\xc1\x8c\x33\x8a\x2e\xc1\x39\xda\x33\x19\x30\xd0\xdb\xc7\x5a\x99\
+\x07\x55\xee\x69\xf4\x66\x30\x0f\x19\xb3\x24\x1e\x0e\xd0\x31\x74\
+\x37\x0d\x8b\x6c\x1e\xca\xdb\x67\x0c\x09\x91\xb4\x02\xd7\xed\x0e\
+\xbc\xbb\x73\x5d\x21\xa0\xbf\xe7\xba\x00\x78\x4a\x6d\xc2\x74\x98\
+\x6f\xce\xbf\x13\x19\x55\xfc\xce\xaa\x1a\x82\x63\x19\xee\x49\x31\
+\xec\x45\x16\xc3\x3a\x13\xc0\xd7\x63\x49\x0d\xae\xd0\x25\x1c\xda\
+\xb5\xa1\x10\x70\xc3\xd7\xcb\x5a\xd5\x4a\x54\x95\xdb\x85\xcf\xff\
+\x35\x9b\x1f\x8a\x67\x55\xac\x9c\x5d\x6c\xec\x0b\xa7\xc4\x7c\x25\
+\x94\x83\x6d\x9a\x05\x79\xef\x22\xd4\xa2\x29\x05\xa5\xc1\x4e\xd4\
+\xef\xde\x58\x08\xe8\xeb\xf2\x11\xa0\x8a\x00\x36\xa8\x8c\x99\xe6\
+\x1b\x80\x68\x5a\x43\xdd\x3c\x1b\x5c\x76\x2b\xba\x42\x06\xe0\xc7\
+\x81\x38\xec\x26\x20\xdf\x95\xd1\xd4\x38\xdc\xc1\x0e\xd4\xef\x79\
+\xb5\x10\xd0\x7b\xad\x9b\x00\xe4\x22\xb2\x40\xe3\x36\x93\xb2\xc4\
+\x03\xc7\xcd\x4e\xab\xa8\x9b\x6b\x47\x89\xdd\x82\xae\x11\x03\xd0\
+\x44\x00\xc7\x34\x2b\x8f\xb5\xf0\x91\xc8\x2a\x92\x8b\x73\x40\xa8\
+\x03\xef\xed\xdd\x54\x08\xe8\xb9\x76\x8d\x35\xe7\xaa\xe0\x99\x65\
+\x07\xcf\xb8\x70\x24\x83\x9c\x66\xd8\x9e\xa6\xf4\xdc\xb5\xb0\x1c\
+\x6e\x87\x05\xbe\x70\x5a\xac\x1d\x6f\x0b\x40\xa5\xd0\x30\x33\x20\
+\xcf\x78\x67\x08\x48\x92\x5c\xe4\x0c\x91\x8b\xf6\x4e\xb0\xa0\xe7\
+\xca\x55\xf6\x4b\x8e\x2c\x98\x35\x9d\x62\x40\xb9\x1c\x89\x63\xf3\
+\xb2\x39\xc8\x1f\x51\x8a\x45\xbb\x3f\x81\x62\xab\x8c\x22\x59\x12\
+\xa7\x2d\x16\x09\x27\x5b\xfc\xe8\x0d\x33\xc8\xb4\x96\x8b\x67\xb0\
+\x4c\xfd\x0d\x27\x3e\x3e\x50\x08\xf0\x5d\xbe\xca\x5a\x14\x0f\xca\
+\xcb\xa6\x63\x24\xa1\xa0\x52\xcd\x4c\x09\xf8\x3d\x90\x42\x31\x89\
+\xf2\x83\x56\x9a\x2d\x94\xb3\x5f\xfe\x3c\x88\xeb\xf7\x25\x14\x91\
+\x3f\x23\x77\x93\xa8\x55\x9a\xd1\xf8\xc9\x07\x13\x00\x9d\x9d\xec\
+\xc8\xcd\x52\x54\x3e\x5e\x06\x85\x5c\xb3\xb2\x24\x8d\x1d\x2b\xbc\
+\x93\x00\x7f\x98\x00\x2e\xce\xbd\x63\x91\x65\x7c\xd5\xf4\x37\xba\
+\xc7\x24\x61\x4d\xec\x4e\x02\x4b\xd4\x16\x34\x1c\xfd\xb0\x10\x70\
+\xe9\xd7\x66\x56\x7f\xa3\x02\x4f\x2f\xa8\xa0\x2c\xd2\xf1\xbc\xcd\
+\x08\xa6\x4a\x01\x1c\xa7\x67\xdb\x72\x2f\x64\x12\x68\xbf\x9d\xa4\
+\x56\x41\x6e\x69\x1a\x20\x37\xc9\x04\x30\x24\x7c\x51\x0b\x24\x72\
+\x6d\xf4\x6e\x0c\xcb\xb5\x76\x34\x7e\x76\x78\x02\xa0\xb9\x8d\xed\
+\xbf\x64\x47\xed\x62\xaf\xb0\x80\x17\x9b\x08\x22\x7d\x82\xa3\x71\
+\x9c\xaa\x9b\x8d\xf2\x99\x4e\xb4\xf9\x93\xe2\xd0\xbe\x63\x3e\x38\
+\xcb\x5c\xa2\x07\x89\x38\xf3\x4c\xa2\x1f\x71\xff\x3d\xbc\xe8\xe8\
+\xc0\xe9\x4f\x27\x00\x4e\x7e\x71\x3c\x76\xb1\xe4\x05\x57\xda\xed\
+\x06\x53\xcd\x26\x67\x16\x50\xe8\x4e\x0c\xa7\xd6\x55\x0a\x40\xeb\
+\x70\x42\xa4\xf0\x1b\x9f\x77\xc3\x51\xee\xa4\x6c\x30\x0a\x81\xd7\
+\x83\x4e\x31\xb0\x8c\x05\xf0\x6c\x71\xef\x64\xc0\x91\x83\xef\xa7\
+\x97\xbe\x7e\xc0\x7e\xac\x37\x05\xa7\xbd\x48\xd4\x02\x33\xcb\x67\
+\x24\x14\x45\xe3\x2b\x5e\x78\xe7\xcc\xc0\x4f\xa6\x05\x7b\x8e\x76\
+\xc2\xe9\x76\x3d\xa8\x7a\xfe\x42\xaa\x02\xcc\x67\xb7\x50\x31\x3e\
+\x18\x21\x40\x59\x01\xe0\xd0\xfe\xb7\x1a\xd6\xbc\xb6\x75\xcb\xbe\
+\x26\x15\xd5\x0b\xab\xa0\x6b\xba\xd1\x93\x68\x8b\x14\x0c\x3c\x08\
+\xb4\x7f\x24\x09\x4d\x51\x90\xb6\x3a\x61\x75\x38\x8c\x36\x0d\x5e\
+\x64\x32\x52\x81\x51\xac\x70\xf7\x43\x1a\xf6\x35\x9c\x39\xf3\xcd\
+\xb6\x02\x80\x69\x45\x52\x5a\xb1\xc3\xd1\x9e\xb0\x52\x9f\xb1\x92\
+\x15\xe4\x2a\xdd\x80\x68\xf4\x9d\xc9\x28\x08\x0f\x47\x21\x59\xcc\
+\x76\xcd\xf4\x07\xbd\x48\xa3\x62\xac\xc8\x05\x51\x39\xd6\xec\x3f\
+\xf7\xdd\xf1\xb9\xff\xf5\xd7\xbc\x41\x56\x34\xbe\xbc\x71\xc3\xe6\
+\x3d\xe7\x73\xf0\xd4\x56\x83\x29\x1a\xb9\x58\x37\x2f\x16\x09\xd9\
+\x9c\x82\x31\x02\xf0\x1b\x87\x99\xfd\x9f\x3b\x48\x93\x8b\xa0\x0c\
+\x0d\x61\xb5\x67\x18\xd9\xa1\xbe\xd3\xf4\xf6\xdb\xa7\x04\x98\x90\
+\xef\x9f\x5b\xbf\x73\xcd\xc1\xf3\x63\xf0\xd6\xcc\x83\xae\x72\x80\
+\x2e\xfc\x9c\x25\x0b\x22\x81\x28\x65\x0b\x27\xf0\x35\x59\x5c\x44\
+\x99\x5b\x01\xac\x9c\x9f\x82\x6d\xb0\xad\x85\xc4\x5f\xca\xd7\x9b\
+\x04\x30\x21\xcd\x4b\xb7\xec\x5f\xf5\xf6\xd9\x00\xca\xab\x2b\x49\
+\x4b\x17\xd9\x32\x9e\x55\x10\xf3\xdf\x27\x0b\x48\x58\x32\x3a\x68\
+\x76\x64\x14\xab\x9e\xd0\xa1\xfd\xd9\xd8\x73\xe1\x87\xb3\x35\x13\
+\xb5\xa6\x04\xf0\xf1\x51\xfd\xe1\xcb\xd5\x75\x5b\x17\xef\xfb\x7a\
+\x00\x33\x6b\x16\x40\xb6\xd2\x75\x48\x9d\x32\x1e\x8a\x80\xf1\xe2\
+\x22\x60\x76\x68\x18\xab\x6b\x1d\x50\x3a\x1b\x6e\x92\xf8\x93\x53\
+\xe9\x3c\x14\x60\x42\xba\x57\xad\xdf\x54\xb3\xbb\xe1\x16\x92\xa5\
+\x8f\x41\x76\xd8\x91\x0e\xde\x87\x16\x4b\xc2\x9e\x0c\x63\xed\xd2\
+\x12\x8c\xb6\x7e\xfb\x50\xf1\x47\x02\x4c\x48\xe7\xc2\x45\x4f\x2d\
+\xe9\xd3\xbc\x38\xd7\x17\x43\x98\x6a\xa2\x76\xbe\x03\xae\x54\x3f\
+\x46\xbb\x2e\x76\x91\xf8\xa2\xff\x3b\xff\x48\x80\x09\xd9\x4a\xd3\
+\x9b\xb6\x32\xf7\xf2\x9b\x51\x71\x3f\x5f\x20\xf1\xb3\x24\x7e\xe2\
+\x51\x67\xff\x01\x1a\xee\xd7\x37\xec\xcd\x6f\x79\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x02\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xc9\x49\x44\x41\x54\x78\xda\x95\x95\x6b\x4c\x53\x67\
+\x18\xc7\xff\xe7\xf4\x66\x4b\x6b\xb1\xe5\xaa\x08\x83\x09\x88\x30\
+\x11\xa1\x80\x66\x59\xb2\xb9\x28\x1a\x99\x59\xc0\x80\xbb\xe9\x36\
+\xdc\xe6\x1c\x2e\x0b\xc9\xf6\x81\xc9\x66\x5c\xcc\x12\x37\x97\xe1\
+\xb6\x6c\xba\x19\x63\x76\x91\x99\x18\xe3\x88\x99\xce\xb9\xa8\xe0\
+\xa0\x72\xef\x00\x05\x45\x2e\x4a\x2b\x5b\x81\xf6\xb4\x94\xb6\xe7\
+\xb2\xf7\x1c\x44\x81\x8e\xca\xde\x2f\xed\x79\xcf\x79\xfe\xbf\xe7\
+\x7d\x6e\x2f\x85\x39\xac\x55\x5f\x77\xa9\x43\x54\xf2\x83\xab\xe2\
+\x75\x4f\x69\x14\xb2\xf8\x78\x83\x0a\x82\x00\xf4\x8d\x78\xe1\x61\
+\xb9\x5b\x57\x7a\x98\x0b\x6e\x2f\x5b\x7a\xe5\x8d\x24\xcf\x4c\x5b\
+\xea\x61\xe2\x59\x07\xaf\xe5\x6c\xcd\x8d\xac\xdb\xbc\x22\x14\x76\
+\x62\x6e\x1f\x07\x46\xc6\x39\xc9\x50\x4e\xd3\xd0\x29\x29\x44\xeb\
+\x80\xb3\xed\xa3\xf8\xb2\x91\x2d\xea\x78\x3d\xfc\xe7\xff\x05\x38\
+\x66\x61\x84\xd5\x09\x5a\xb4\x0c\xb1\x70\xfa\x78\xd0\x14\x25\x99\
+\x85\xce\xa3\xc1\x90\x67\x8e\x17\xc0\x93\x9d\xb0\x10\x05\x94\x96\
+\x6a\x64\x5b\xf2\xd1\xad\x0f\x81\xce\x90\x81\x65\x85\x35\x54\x50\
+\xc0\x9b\xa7\x7a\x9b\xde\x5b\x17\x97\x71\xbe\xdf\x0b\x9a\x88\x8a\
+\x5f\x0b\xe4\x37\x4e\x4b\xe1\xc7\x86\x01\x2c\x89\xd2\x63\xa1\x41\
+\x07\x9e\x40\xc4\x7d\x56\xa9\x40\x7e\x8f\x12\x97\x8f\x1b\x0f\x6c\
+\x3e\x64\x2b\x7b\xe8\x09\x8e\x36\x8d\x08\x61\x61\x5a\xd8\x5c\x1c\
+\xf1\x7c\x62\x8f\x26\x61\xb9\xda\xd2\x8d\xb6\x9e\x21\x68\x54\x72\
+\xbc\x90\x9f\x0b\x96\xe3\x26\x5e\xca\x55\xe0\x7f\x3d\x00\x6d\xdb\
+\x47\xf9\x45\x87\x46\xaa\x83\x02\xd2\xf6\xfc\x99\xb3\xff\xb9\xf4\
+\xba\x41\x3f\x0d\x5e\xcc\x28\x26\x01\x14\x46\x47\xdc\xa8\xa9\x69\
+\xc1\xb2\xd4\x04\x24\x27\x2e\x82\xd3\xc3\x62\xcc\xcf\x83\xa7\x95\
+\x88\x74\x5d\xc2\xa6\xfa\xa7\x71\x53\xa3\xaa\x37\xed\xf4\xe6\xce\
+\x0a\x58\x5a\x71\xd1\xb4\xbb\x60\x85\x79\x14\x72\xe2\xc5\x04\x40\
+\x0c\x91\x18\x2a\x31\xc5\x6e\x76\x22\xd9\x2e\x8f\x0f\xf7\x03\x4d\
+\xcb\xc0\xda\xef\x22\xfd\x72\xe1\xe1\x15\xc9\xd7\x99\xec\x1d\xbe\
+\xb2\x59\x01\x49\xe5\x17\x4c\xe5\x05\x19\x66\x86\x56\x10\x51\x48\
+\x08\xc6\xcb\xe3\x6f\xb7\x0f\x1e\x8e\x92\x8e\x2e\x0a\x4f\x15\xa0\
+\x28\x1a\x0e\xe7\x38\x7e\x6b\x1a\x4e\x1f\xdc\x9b\xda\x16\x34\x44\
+\x09\xef\x9e\x33\xed\x2e\x5a\x69\x76\x08\x2a\x0c\x11\xd1\xbb\x0c\
+\x89\x33\x25\xdc\xcb\x85\x98\x52\x0a\x33\x4b\x84\x22\x1b\x4e\xa7\
+\x07\x0d\x4d\x37\xb2\xbb\x3e\x5e\x73\x35\x28\x20\xfe\x9d\x33\xa6\
+\xd2\x82\x2c\x73\x9b\x9d\x85\x52\x46\x63\x6d\xa2\x16\x9d\x36\x07\
+\xac\x8c\x1f\x29\x91\x7a\x74\xdb\xfd\x70\xfb\xb8\x40\x00\x33\x86\
+\xe6\xc6\xeb\xd9\xdd\x9f\xae\x0f\x0e\x88\xdd\xf5\x8b\xa9\xe4\x99\
+\x4c\x73\xc7\x28\xb0\x7a\xb1\x02\xbb\x7e\x6a\x01\x21\x4d\x58\x10\
+\xdd\xb4\x58\x23\xb2\x62\x23\x48\x1f\xf0\x33\x00\x6e\xb4\x12\xc0\
+\xad\xcf\x37\x06\x07\xc4\xec\x3c\x99\xf9\xca\x46\x53\x43\xa7\x93\
+\xe4\xce\x3b\x82\xaa\xc6\x41\x28\xe5\xb4\xf4\x4e\xac\xfb\xd0\xf9\
+\x6a\xe4\xa5\x27\xc0\xcf\x4e\x07\x30\x4e\x37\xda\x9b\x3b\xb3\x7b\
+\xbf\x78\x76\x3a\x20\xaa\xa4\x2a\xca\xf6\x6d\x91\x6d\xf2\x39\x7c\
+\xdb\xf1\xc2\xf2\xed\x6b\x4e\x9c\xeb\xf5\xc0\x61\xed\x47\xfd\x4d\
+\x3b\xe4\x24\x54\xa2\x85\x40\xca\x56\xaf\xd3\xe0\x89\x8c\x64\x02\
+\xe0\xa6\x01\xdc\x2e\x06\xd7\x1a\x3a\x73\x06\xbe\xd9\x6c\x9e\x06\
+\x28\xfd\xc1\x22\x98\x3b\x6f\xdf\xe9\xee\x1b\x8e\x13\x78\x21\x65\
+\xfd\xea\x25\x97\x32\x57\x26\x2e\xe8\x73\xf8\xf0\x47\x6d\x2b\xae\
+\x5b\x5d\x52\x0f\x48\x29\x26\x27\xd0\x11\x40\x6e\xd6\x52\xb0\x53\
+\x4f\x40\xde\xbb\x86\x1d\xe8\x69\xed\x4a\xba\x73\xa4\xb8\x7b\x1a\
+\xe0\xf1\x7d\x35\xc2\xcb\x79\x69\x68\x6e\xef\xc7\xc2\x70\x2d\x14\
+\xf3\xf5\x38\xdd\x61\xc7\xba\x84\x10\xbc\x7f\xf8\x77\x28\xc8\x18\
+\x90\x46\x05\xa9\x57\x8e\x63\x91\x92\xba\x04\x51\x91\xe1\x24\x5c\
+\x0f\x00\x62\x97\x0f\xf5\x0d\xc0\xb2\xe7\xc9\xfb\xba\xf7\xff\x44\
+\x6f\xaf\x3a\x1b\x6b\xca\x58\x1b\xa5\xa6\x31\xc8\x78\x45\x77\xf0\
+\x88\x06\xa8\x3e\x6f\x86\x8f\x13\xa4\x21\x27\x10\x31\x8e\x8c\x85\
+\xf0\xe8\x28\xa4\x3c\x96\x44\x46\x04\x8b\x29\x4d\x0e\x5a\x2e\x83\
+\xed\xda\xcd\xde\x1b\x9f\x6c\x88\x0f\x00\x84\x6d\x39\x92\x69\x48\
+\x7a\xb4\x41\x1d\x61\x24\xe5\xce\x43\xe6\xf5\xa2\xb1\xb6\x11\xf0\
+\x93\xbe\x95\x51\x52\x58\xf4\x11\x11\x30\xc6\x46\xc3\x10\x6e\x90\
+\x4e\x31\x55\x1c\x52\xd3\x51\xe8\xbf\x58\xff\xb6\xfd\x44\x49\x65\
+\x00\x40\x5c\x0b\x9e\x3f\x5a\x19\x96\x95\x51\x4a\x49\x8d\x24\x76\
+\xbe\x4c\x4a\x9c\xcf\x33\x06\xa5\x5a\x43\x66\x12\x2f\x9d\x42\x84\
+\xcd\x5c\x14\x29\x00\xd7\x6d\x2b\xee\xec\xcf\x9b\xa6\x19\x50\xa6\
+\xa1\x2f\x1e\x1b\x08\x59\x9e\x1a\x43\x89\x1a\xf7\x5c\xa4\xa4\x69\
+\x14\x28\xfa\x20\xb9\x34\xd8\x31\x2f\x98\x8e\x8e\xbd\xae\xaa\x57\
+\x2b\x82\x02\xc4\xa5\x2e\xfe\xee\xb6\x2a\x7d\xf9\x22\x69\x08\x89\
+\xde\x0a\xb3\x88\x4b\xd3\x8f\x0c\xbf\xb1\x71\xf8\x2d\x7f\x55\x8d\
+\x9f\xdc\x51\x1c\xf0\xc9\x6c\x5e\x29\x36\x7d\xf5\x21\x22\x22\x3e\
+\xc0\xe2\x18\x49\x24\x00\x22\x8a\x93\xe4\xc3\x36\x08\x58\xef\xee\
+\xf5\x9f\xda\x51\xf1\x5f\x3a\xc1\xaf\xcc\xbc\xcf\xf4\xa4\x0e\xb7\
+\xc2\x68\x7c\x09\xf3\x34\x99\xe0\x43\x08\x48\x34\x21\x89\xf0\xd9\
+\x1b\x31\xfc\xcf\xf7\x38\x57\x56\x19\x4c\xe2\xa1\x77\xf2\xe4\xea\
+\x3b\x9d\x2b\xc8\xec\x75\xe5\xe4\x72\xcb\xd7\xca\xf1\x5a\xcc\x36\
+\x58\xe6\x62\x37\x67\xc0\x99\x8a\xb5\x82\xa3\xdf\xb2\x8f\x5c\xfb\
+\x1b\xc8\x1d\xf7\xd6\x96\xa3\xd6\xda\xb9\xd8\xfd\x0b\x31\xf9\xfe\
+\x28\x7a\xf1\xf6\x84\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x05\xc1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x88\x49\x44\x41\x54\x78\xda\x85\x56\x69\x4c\x54\x57\
+\x14\xfe\xee\x7b\xb3\x0f\xcb\x0c\xb2\x28\x20\x02\x5a\xb1\x10\x6d\
+\x07\x09\x22\x2e\x51\x04\x15\xfb\xa3\x49\xdb\x00\x35\x9a\xb6\xb1\
+\x6a\x02\x36\x98\x46\xab\x4d\xa3\xb5\x36\x36\xb6\x4d\x1b\x1b\x81\
+\xa8\xd1\xa4\x8d\x69\x8b\xd8\xe5\x87\xb1\x2e\x08\xd5\xb6\x28\x22\
+\x42\xda\x8a\x55\x51\x40\xc2\x50\x59\x1c\x90\x65\x86\x99\x79\x4b\
+\xcf\x7b\xc3\xe0\x08\x52\xcf\x64\x72\x67\xde\xbd\xe7\x7c\xe7\x7c\
+\x67\xb9\x8f\xe1\xff\x24\xf5\xcb\x2c\x88\x52\x1e\x44\x79\x25\xad\
+\x09\x2c\x24\x48\x7d\x2c\x0f\x0c\x01\x3c\xd7\x0a\x9e\x9d\xa7\xb5\
+\x02\x0d\xef\x56\x4f\x66\x82\x3d\xf5\x69\xda\x57\x36\xb8\x3d\x35\
+\xfa\xa9\x91\xc6\x58\x5b\x3c\xe2\x52\x22\x10\x6e\x35\xc1\x68\xd2\
+\xa8\xdb\x2e\xa7\x80\xde\x3e\x27\xda\x9b\x7a\xd0\xd1\xd8\x06\xf7\
+\x83\x6e\x17\xf4\xba\x45\xa8\x2f\x6e\x7c\x26\x00\x97\x76\xa0\x04\
+\x9c\xae\x68\x7e\x5e\x06\x92\xe6\x46\xc0\x1c\xa2\x03\x27\x01\x92\
+\x2c\x93\xeb\x8f\xb5\x38\xc6\x20\x71\xc0\xf0\x80\x07\xb7\xff\xee\
+\xc1\xf5\x8a\x5a\x3a\xe4\x29\x95\xea\xb7\x6e\x99\x14\x80\xa5\x97\
+\x95\x07\xc7\x44\xe4\xe7\xac\x9f\x8f\x98\x68\xa2\x83\xf3\x19\x65\
+\xa3\x07\xd9\xe8\x69\x79\x14\x48\xf2\x5b\x90\x18\xec\x9d\x43\xa8\
+\x3c\x7e\x1d\x83\xf6\x9e\x13\x72\x5d\x61\xc1\x04\x00\xed\xe2\xa3\
+\x25\xa6\xa8\xd0\xa2\x82\xc2\x85\x08\xb3\xe8\x21\x8b\x32\x46\x04\
+\x19\xdd\xc3\x12\x06\x69\xed\x1a\x74\x43\x14\x98\xaa\xa0\xd1\x01\
+\x41\x1a\x0e\x51\x41\x1a\x44\x98\x78\x18\x34\xf4\x9c\x67\x70\xf4\
+\xbb\x51\x5e\x76\x05\xce\xae\x47\xa5\xde\x3f\xde\xde\x32\x06\x60\
+\xca\xfe\xda\x26\x8a\x68\x58\xbb\x23\x0b\x33\xa3\xcc\x18\xf2\x8a\
+\xb8\xd7\x27\xc0\x3e\x20\x20\xd2\xac\x85\xc5\xc0\x63\x70\x44\x82\
+\xc3\xe3\x21\xef\xd9\x58\x14\x32\x7d\x44\x0a\x23\x3a\x58\x83\x99\
+\x56\x0d\x82\xb4\x3c\xee\x75\x0d\xe3\xbb\x4f\xab\xc1\xf3\x48\x75\
+\x5e\x78\xb3\x51\x3d\xad\x5d\xfa\x8d\x33\x6b\x7d\x9a\x71\xd5\xa2\
+\x18\xb4\xf5\xb9\x71\xb7\xcf\xab\x86\xad\x6c\x92\x63\xf8\x24\xdd\
+\x82\x60\xf2\xf2\x9d\x9a\x3e\x1f\x35\xe3\x32\x27\x29\x94\x11\x9d\
+\xb3\xac\x5a\xc4\x5b\xf5\x38\x57\x63\x47\xf5\xf1\x7a\x97\xf7\xb7\
+\x37\x4c\xcc\xbc\xba\x3c\x4b\x17\xaa\xaf\xda\xbd\x6b\x19\x6e\x3f\
+\xf4\xa0\x8b\x28\x51\x8c\xfa\xf9\x76\x7b\x44\xec\xb0\x85\x20\x33\
+\x36\x18\xed\x0e\x17\x36\x56\x75\x23\x38\x48\x4b\x1e\xf2\x14\x85\
+\x3c\x06\xa2\xfc\x24\x56\x11\x65\xe6\x90\x34\x45\x87\xbd\x1f\x5f\
+\x84\xe7\x91\x7b\x05\x33\xaf\x39\x79\x68\x7e\xee\x73\x9b\x73\x96\
+\xc4\xa1\xa9\xdb\x43\x65\x1d\x90\x18\x42\x71\x52\x95\x6c\x4b\x0d\
+\xc1\xc2\xb8\x10\x9f\x21\xa2\x2f\xef\xe7\x76\x3c\x18\x14\x90\x98\
+\x18\xaa\x82\xf8\x71\x94\x45\xa1\x2c\x25\x52\x87\xca\xdf\xdb\x71\
+\xfd\x4c\xf3\x61\x66\x58\x73\xb2\x65\xd3\xf6\xcc\x04\x27\xd3\x92\
+\x61\xd9\x6f\x17\x9c\x92\x4c\x0a\xa5\xe9\xbe\x13\xfb\x16\x5b\xc7\
+\x00\xfc\xf2\x4a\x79\x0b\x7a\x86\x45\xcc\x4b\xb6\x40\x16\x14\xef\
+\x03\x81\x18\x4c\xb2\x17\x47\x3e\xbf\xdc\xca\xf4\xb9\x3f\xc8\x85\
+\x1f\x2d\x83\xd7\xed\xdb\xe5\xc8\xb8\x48\x6b\xdb\xa0\x08\xbb\x43\
+\x40\x67\xb3\x03\x47\xf2\xa7\xe1\xe5\x39\xe1\x13\xfa\xb1\xf0\x54\
+\x2b\x8e\xfd\xd2\x85\xa5\x39\xd3\x91\x34\xcd\x00\xde\xdf\x2f\x4a\
+\x5e\xf5\x0c\x65\x1f\x5e\x04\xb3\xae\x3f\x23\x17\x6e\x5b\x08\xf7\
+\x88\xa0\x72\xdf\x4d\xd5\x72\xa3\xcb\x0b\x46\x99\xe3\x89\xaf\xfb\
+\x37\x7a\x51\x36\x09\x80\x22\x4a\x5e\x66\x17\x5f\x46\x4a\xee\x6c\
+\xbc\x38\xdd\x88\x08\x03\x53\x73\xa1\x37\x68\x50\xf6\xc5\x15\xb0\
+\x88\x4d\x17\xe5\xa2\x2d\xa9\x10\x29\x99\x7f\x3d\xf4\xa2\x77\xe8\
+\x71\x92\x39\x02\xb8\xd3\xf0\x2f\x4a\xf3\xa3\x27\x05\xa8\xb7\xf7\
+\x23\xb3\xf8\x2a\xd2\xf2\xe6\x82\xd3\xf0\x08\x0f\xe2\x30\x6f\x0a\
+\x15\x81\x8e\xc7\xc1\x03\xf5\x60\xc1\x6f\x55\xcb\x7b\x77\xa6\xe3\
+\x6a\xa7\x0b\x3d\x03\x12\xb8\x80\x24\x73\xd4\x4c\x4d\xb5\x1d\x38\
+\x58\x10\xfb\x54\x80\x75\xc7\x6f\xa0\xfc\x54\x07\xd2\x5f\x9b\x87\
+\x50\xaa\x2c\x49\xf2\xf5\x45\x44\x08\x87\x05\xd1\x46\xec\xde\x5f\
+\x07\x16\xbe\xf1\x52\x4b\xce\xeb\xc9\x09\xd4\xa8\x6a\x62\x03\x87\
+\x07\x4f\x00\xd7\x2e\xb5\xa1\x64\x6d\xdc\x04\x80\xa8\x4d\x95\x30\
+\x4f\x8f\x44\xf2\x82\x58\x68\x49\x47\x96\x64\x5f\x89\xc8\xbe\x11\
+\x12\xac\x07\x2a\xbf\xbf\xd9\xca\xa6\x16\x5f\x39\x94\x90\x11\xb3\
+\x39\x96\x66\x8f\x24\xc9\x4f\x18\xd1\x68\x39\xd4\x9c\xbb\x47\x00\
+\x33\xc6\x00\xdc\xa2\x17\x86\x25\xdf\x22\x21\xd7\x86\x8c\x9c\x44\
+\x2a\x0e\x41\xed\x68\x04\xa8\x72\x54\x29\x1d\x34\x9b\x5a\x6b\xed\
+\x87\x59\xcc\xf6\x6b\x59\xa6\x30\x53\x55\xe6\xf2\x18\x08\x5e\x29\
+\xf0\x9c\x0a\x50\x75\xba\x19\xa5\x6b\xe3\x55\x80\xaa\x3b\x3d\xc8\
+\x7e\xf5\x27\x2c\xd8\x9e\x8b\x39\xcf\x5b\x20\x50\xde\xe4\x27\x7d\
+\xf2\xcd\x2a\xd2\xbb\xfc\xab\x1d\x4e\x87\x73\x85\x4a\x48\xf4\xce\
+\x06\x67\x7a\x76\xac\x31\x2c\x44\xff\x44\x14\x5a\x4a\xd4\xd9\x1f\
+\x6f\xe1\xe0\xba\x78\x04\xd1\x28\xc8\xde\x70\x1e\x2f\xed\x5a\x89\
+\x69\xe1\x46\x1a\x7c\x13\x8d\xfb\xbd\x77\x0c\xb8\x51\x77\xa1\xc3\
+\xd5\xb9\x3f\xd5\xa4\x02\xc4\xed\xf9\xd3\xc6\xe9\xb5\x0d\xab\x56\
+\xc7\xaa\xfd\xee\x57\xd4\x92\x27\xa7\x2b\xfe\x41\x4f\x73\x97\xfa\
+\xbf\xe0\xfd\xe5\xd0\x29\x03\x4e\x94\x9e\x5a\x51\x6c\x74\x78\x9d\
+\x3b\xdb\x01\xc9\xed\x4d\x6d\xdf\xf3\x42\xe3\x58\x4a\xe3\xf7\x35\
+\x95\x58\xa2\xcd\x45\xd9\xe9\xe1\x70\x2b\x54\x29\xf7\x00\x69\x78\
+\x64\x09\x66\x9a\x92\x1c\x7d\x3d\xd4\x2b\xe3\xf3\x14\x68\x5c\x4f\
+\x0e\x5d\xa8\xeb\x45\x7f\xe7\x70\x69\xdb\x07\x29\x8f\xc7\xb5\x5f\
+\x12\x3f\xbb\x55\x6e\x89\x36\xe5\x67\xd9\xc2\xa8\x2a\x46\xbb\x92\
+\x34\x15\xe5\xc0\x99\x33\x5e\x78\xe5\x0c\x95\x60\x75\xa3\x83\x8c\
+\x3b\x4f\xb4\xbc\x37\x67\xe2\x85\xe3\x97\x59\x07\xee\x96\x68\x8c\
+\x7c\x51\x46\x9a\x15\x31\x54\x6b\x02\x51\xa6\x38\x2d\x8f\xb3\xae\
+\x44\xa7\x8c\x15\x65\x5e\xd9\xa9\xc6\x6b\xeb\xfb\x20\xb8\xc4\xd2\
+\xbb\x5b\x67\x4d\x7e\x65\xfa\x25\xa9\xac\xd5\x26\x80\xd5\x58\xac\
+\x5a\xe3\xec\x38\x03\xa6\x86\xea\xa8\xae\x35\x63\x20\x8a\xf1\x41\
+\x2a\xcf\x07\x8f\x3c\xb8\xd3\x3e\x82\xfe\x3e\xaf\x8b\x76\x17\xdd\
+\x2e\x4c\x78\xf6\xa5\x1f\x28\xc9\xc7\xee\x67\x89\x12\xcb\x23\xb3\
+\x2b\x89\xae\x04\xa3\x71\xf4\xad\xc2\x25\x28\x97\x7e\x2b\x29\x9f\
+\xe7\x39\xb9\xe2\xe6\x86\x19\x93\xbe\xb6\xfc\x07\x95\xf9\x53\xff\
+\xc5\x5e\xa1\xe9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x05\x2b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xf2\x49\x44\x41\x54\x78\xda\xad\x55\x6b\x50\x55\x55\
+\x14\xfe\xf6\x39\xf7\x09\x22\x28\x94\xf8\x88\x37\x23\xe6\x68\x3e\
+\x4a\x21\x15\x09\x47\x45\xa1\x1c\x93\xc6\x61\xa6\x4c\xd1\x48\x1b\
+\xd3\xc0\x17\xc4\x4b\x1e\x4a\x69\x41\x6a\x99\x03\x09\xe3\xd8\xa4\
+\x4e\xd2\xd4\x68\xf1\xd0\xa1\xe4\x9a\x25\x6a\x64\x0a\x3e\x18\xc4\
+\x2e\xa2\x46\x62\xe0\x05\xe1\x3e\xce\xd9\xed\xbb\x2f\xf7\xea\x05\
+\x69\xfa\xc1\x62\x98\xbb\xcf\x5e\x67\xaf\xef\x5b\x6b\x7d\x7b\x1d\
+\x82\x3e\xe6\x93\x36\x24\x5b\x36\x53\x5f\x59\xa2\x93\x28\x85\x3f\
+\xdb\x72\xe3\x0e\xf6\xe0\x30\xeb\x92\xd8\x96\x84\x90\x6e\x22\xa0\
+\x59\x50\x0a\x67\x44\x15\x39\x77\x73\xab\x61\xef\xe3\xf1\x88\x7d\
+\xe1\xbd\xc5\x35\x4f\xe3\x22\x24\x4b\x3d\x32\x24\x33\x85\x6c\xa1\
+\x8f\x62\xda\x17\xf6\xc0\xce\x00\x20\x22\x20\xaa\x04\xfe\x2f\xa8\
+\x08\x64\x13\xd5\xfd\x99\x6d\x08\xe7\xfe\xc9\xfb\x87\x45\x5c\x3a\
+\xf3\xa0\x84\x52\xe2\x07\x99\x62\x50\x8c\x81\x5a\x39\x05\x4e\x70\
+\x89\x20\x2f\x7f\x35\x96\x2e\x98\x12\x0a\x93\xc5\xc0\x3c\x02\x73\
+\xca\x8c\x21\xfb\x85\x6c\x7b\x76\x1c\xa2\x3c\x13\xd2\xbb\x47\x9d\
+\xe2\x59\xb3\x25\xfc\x1d\x9e\x20\xcf\x58\x42\xf9\xc5\x5a\x90\xa5\
+\x87\xc2\xe8\x84\x10\x0b\x03\xe8\x02\x25\xe4\x7f\x93\xfc\x2f\x93\
+\xa9\xcc\x08\x48\xf8\xb1\xf6\x36\xc8\x2b\x5f\x4c\xa3\x43\x7c\x6f\
+\x31\x58\xa5\x83\x2f\xe3\xc3\x98\xf4\x07\xa3\xbd\xbc\x1f\xf7\xc9\
+\x8e\x5c\x6c\xb9\xc9\x76\x87\x20\xe3\xf2\xc5\x0e\x90\xf9\x9f\x85\
+\x52\x8c\x69\x60\x1e\x01\x83\x69\x82\x48\xd0\x70\xb9\x07\x24\x38\
+\xd9\x8f\x8e\x99\xd5\x09\xd9\x3c\xa8\xf1\xa1\x50\x8a\x38\x5f\xd1\
+\xce\xf2\x8a\xc6\x2a\x37\x95\x77\xe1\x53\x9e\x9e\x44\x92\xa4\x01\
+\x0f\x10\x26\x76\x91\x28\x79\x99\x24\xce\x66\x60\xc5\x89\xa2\x88\
+\x7b\x6d\xf7\xe8\x03\xf3\x5f\x09\xbc\x98\xbb\x33\x8b\x1a\x9f\x9f\
+\xfd\x5c\x80\xbb\x97\x7b\xaf\x02\xfa\x25\x0c\x59\x96\x71\xf6\xf6\
+\x01\xa8\x95\x1e\x08\x1b\xf5\x3a\x8c\x96\x4e\x9b\xb2\xfa\x11\x21\
+\xe8\xb8\xd7\x81\xf3\xa7\x2e\x36\xae\xcb\x7a\x2b\x88\x03\xbc\xbf\
+\x29\x67\x77\x64\x54\xc4\xbb\xa3\x47\x7b\xf3\x40\x4e\x07\xd8\x9f\
+\x5a\x74\x43\x49\x5d\x3c\xce\xeb\xcb\xb8\xbe\xa3\xc7\xbe\x83\x05\
+\x81\xa9\x30\x4b\x5d\x8e\xc6\x3b\xa8\x08\x02\x5a\x5a\xee\xa2\xaa\
+\xfc\xa7\xa2\xed\x3b\xd3\x6d\x19\x24\xae\x4d\x8b\x9a\x19\x3e\xbd\
+\x2c\x74\xd6\x0b\xb0\x98\x2d\xce\xb5\x14\x94\xd0\x1b\x6a\x91\xa7\
+\x8b\x82\x56\x6b\xab\x4c\x57\x37\xb0\x6d\x4e\x0d\xbc\x34\x7e\xb0\
+\xc8\xa6\x3e\xb5\x57\xe0\x57\xdd\x39\x9c\xae\x3e\xfb\x76\xc1\xa7\
+\xb9\x85\x0e\xbd\xed\xca\xff\x9c\xae\x4c\x78\x13\x46\xa3\xd1\x89\
+\xbd\x8b\xd2\x1d\xd9\x67\xa6\xe0\xe6\xfd\x5a\x78\x0e\xf1\xe1\x8c\
+\xff\x79\xd8\x0c\x8d\xca\x03\x1f\x47\xde\x02\x95\x25\xae\x7b\xbb\
+\xa9\xd5\x6a\xec\x2f\x3c\x80\xf5\x49\x6b\x88\x2d\xc6\x63\x00\xeb\
+\x12\x57\xb3\x0b\xf7\x28\x03\x81\x0d\x99\x6b\x6d\x3a\x64\x54\xcd\
+\x66\x99\x00\x49\x2f\x1e\xc5\x48\xd7\x71\x48\xaa\x18\x0f\x91\x3d\
+\x47\x06\xc7\x23\x61\xd2\x7e\x56\xaa\x47\x67\x54\x0a\x05\x76\x17\
+\xec\xeb\x0f\x90\x97\x9b\xdf\x96\x9c\x9a\x38\xbc\x6f\xd3\x5a\x3a\
+\xeb\x71\xa8\x6e\x33\xea\xdb\xaa\x50\xbc\xf0\x21\xdf\x2b\xbd\x9e\
+\x8d\xd3\xcd\xc5\x48\x0e\x3b\x89\x11\x2e\x41\xfd\x1a\xfd\xc1\xb6\
+\x82\xd6\x94\xb4\xa4\x11\x7d\x01\x7e\xdb\x94\xb2\x7e\xb2\x24\xdb\
+\xee\x26\x9b\x8b\x50\x8a\x82\xbd\x56\xdc\xcc\x16\x89\xfb\x54\x4c\
+\x86\xdd\xe6\x1e\x68\x55\x1a\xbe\x6f\x55\xb7\x44\x6d\x59\x88\xac\
+\xc9\x3b\xf3\x76\x95\x30\x80\x78\x27\x80\x9c\x8c\x8f\x8a\x17\x2d\
+\x89\x5a\xe1\x1f\x18\x00\x6b\x49\xad\x81\x92\xab\xa6\x60\xf5\xd4\
+\x22\x04\x0d\x0b\x85\x45\x32\x3a\x8d\x0a\x95\xe8\x82\xc3\x57\xd2\
+\x70\xe4\xd2\x76\x7c\x38\x57\x87\x40\x8f\x69\x6c\x96\x49\x68\x6a\
+\xbc\x81\xef\x4a\xcb\x57\xa6\x67\x6f\x2c\xee\x0b\xb0\x3c\x38\xc4\
+\xa7\x64\xce\xfc\xb9\x50\x50\x0d\xf6\x5c\x58\x86\xea\xc6\xaf\xd9\
+\xa5\x02\xf6\xc6\x5c\x86\x87\x76\x04\x93\xa8\xec\xd0\xba\x44\xcd\
+\x58\x53\x19\x04\x63\x4f\x37\x46\x0e\x0d\xc0\x9e\x79\xd7\x61\xa2\
+\x06\x9c\xac\x38\x81\x86\xab\xfa\x70\x06\xa0\x73\x02\x60\x52\x9d\
+\x11\x3c\xce\xf7\xf4\xe2\xc5\x8b\x70\xad\xb5\x06\x29\x95\x31\x8c\
+\x25\x10\x3b\x71\x0b\x62\xc7\x6e\x46\x8f\x55\xf3\x0e\x00\x56\x3e\
+\x41\x83\xba\xd6\x53\xc8\xad\x7e\x8d\xdf\x8d\xb5\xa1\x7b\x10\x11\
+\x14\x87\x6f\x4a\xbf\x45\xc3\x95\x9b\xd3\x99\x44\x6b\x9c\x00\xac\
+\xb6\x6a\xd9\x6a\x9a\x91\x95\x83\x94\x13\x91\x68\x6a\xbf\x04\x95\
+\x52\x8b\xad\x33\x8f\xa1\xd3\x74\x9f\xd5\x56\x03\x9f\xa1\x21\xfc\
+\x3d\xfd\x83\xab\x4c\x9a\x26\xb4\x1b\xff\x46\xc9\xef\x1b\xd1\xcd\
+\xc0\x35\x82\x2b\x0e\xbc\xaa\x47\x46\x7a\x2a\x8a\x0f\xee\x73\xc4\
+\x75\x02\x58\xba\xe4\x0d\x9a\x95\xb3\x0d\xd1\xc5\x3e\x18\xae\xb5\
+\x79\x4d\xac\x77\xac\xb7\xf0\x7f\xda\x0f\x5b\x67\x7d\xcf\xdf\xcb\
+\xac\x8e\xc2\x8d\xd6\x66\x28\x58\x86\x6c\xa6\xf1\x20\x1d\x3d\xc0\
+\xb1\x15\x7a\x64\x65\xa6\xe2\xf0\xd1\x83\x03\x02\xd4\x6d\xd8\xbc\
+\xe1\xd9\x1b\x66\x1d\x76\x94\x25\xa1\xa3\xd3\x6c\xfd\xfa\xf1\x3e\
+\xf8\x79\x8d\x42\xe6\x8c\x52\x7e\xa9\xbe\xac\xcb\xc4\x6d\x43\x13\
+\x1b\x7e\xa2\x4d\x45\xb2\x05\xcb\x5f\x4a\x84\xbf\x72\x26\xf2\x77\
+\xe4\xd7\x1f\x29\x3d\x38\xfe\x89\x00\x31\xf3\x62\x0b\x62\x96\x2c\
+\x7c\xcf\xe7\x19\x7f\x26\x52\x05\x97\xaa\xfd\x23\x6f\x61\x41\x4c\
+\xf2\xc3\xde\xf1\xa1\x76\x04\xb7\x1b\x65\x9f\x5a\x7d\x73\x13\x8e\
+\x97\xfe\xf0\xc9\xf1\xca\xa3\x89\x4f\x04\x98\x3a\x31\x4c\x3d\xd2\
+\x7b\x74\x82\xab\x9b\x36\xce\xdd\xc3\x2d\xac\xcf\xdc\x1b\xd0\x98\
+\xf4\xd1\xd1\x6e\xb8\xd3\x65\xe8\xfe\xf9\xce\xdd\x96\xb8\x0b\x7f\
+\xfc\xe2\xb8\xda\xff\x02\x8a\xc0\x10\xd0\xce\x6f\xe7\x3b\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xbc\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x83\x49\x44\x41\x54\x78\xda\x9d\x56\x09\x4c\x14\x57\
+\x18\xfe\xde\xce\xce\xb2\x87\x2b\x37\x02\x2b\x88\x82\x90\x42\x23\
+\xa0\x9c\x6a\x0b\x68\xa8\x88\x07\xb1\x49\x2d\xa9\xb5\x1a\x6b\x2a\
+\x62\xa5\xc6\xd8\x44\x6d\x35\x8d\x5a\xdb\x7a\xc4\xa2\xe5\x68\xd2\
+\x18\xdb\xd2\x04\xd1\x98\xc6\xb4\xa2\xe0\x81\xb6\xca\x0a\xc6\x8a\
+\x0d\x28\x22\x2e\x4a\x61\x2b\x20\x2b\x2c\xbb\x0b\x3b\xb3\x33\x7d\
+\x33\x5b\x68\x8d\x50\x43\xff\xcc\xbe\x99\xbc\xe3\xfb\xfe\xeb\xfd\
+\xff\x12\xfc\x97\x24\x7e\x99\x06\x97\x90\xab\x09\xf0\xcb\x73\xf4\
+\x59\x9f\x59\xd2\x78\xea\xe1\xe8\xea\x29\x05\xa3\x28\x47\xfd\xa6\
+\xcb\x63\x41\x90\x51\x67\x53\x8e\xc4\x62\xd0\x59\xaf\x09\xf4\x67\
+\x43\xe2\xc2\x10\x16\x1d\x00\x3f\x1f\x2d\xb4\x3a\x96\x2e\x8a\xb0\
+\xdb\x78\xf4\xf4\xda\xd1\xd6\xd4\x85\xf6\x5b\x6d\x70\xfc\xd9\xcd\
+\x41\xad\x4a\x84\x71\x63\xc3\x0b\x09\x48\xf2\x91\x22\x10\x65\x7e\
+\x4a\x6e\x2a\xa2\x62\xfc\xa1\x9b\xc8\x80\xb8\x08\x04\x51\x94\xb0\
+\xe9\x43\xa0\x20\x74\x24\x04\x22\x23\xc2\xd6\xef\x42\x73\x63\x37\
+\x8c\xe5\xb5\x74\x91\x2f\x16\xaf\x6f\xdc\x30\x26\x81\x22\xb5\xe4\
+\xb8\xde\xe0\xbf\x3c\x7b\x65\x02\x82\x82\x74\x74\xd5\x0d\x4a\xb1\
+\xe4\x8d\xd2\xcf\x3a\x48\xa0\xa1\x86\x28\x28\xb8\xc4\x29\x4f\x8a\
+\x04\x66\xb3\x0d\x67\xbe\xbf\x01\x6b\x47\x77\x85\x50\xbb\xfe\xcd\
+\xe7\x08\x54\xe9\xdf\x14\x4d\xf0\xf7\xce\x5f\x91\x9f\x0a\x2f\x2f\
+\x0f\x88\x2e\x01\x0e\x4e\x44\xb7\xdd\x85\xae\x01\x1e\x56\x4e\x00\
+\xc7\x03\x81\xf4\x44\x73\x8b\x05\x11\xb3\x7c\xe1\xeb\xc1\xc2\x5f\
+\xa3\xa0\x84\x04\x84\x51\xe0\xe9\xd3\x21\xfc\x50\x5c\x8b\x81\x6e\
+\x4b\xb1\xb3\x66\xed\x86\x11\x02\x5d\xd6\xb7\xb1\x3c\x87\x5b\xab\
+\xb7\xce\x47\x58\x80\x0e\x36\x8a\x74\xbf\x97\x87\x99\x02\xd3\x73\
+\x74\x13\x91\xad\x90\x06\xa7\xb9\x1f\x3f\xae\x98\x86\xd4\xc2\x46\
+\x04\x47\xfa\x42\x50\x32\x08\xd2\x31\x88\xf0\x51\x42\xc7\x2a\xd1\
+\xd6\x65\xc3\xb1\xcf\x2f\x40\xc9\x22\xce\x76\x76\x55\x03\x71\x6b\
+\x7f\xcc\x99\xf9\x4e\x12\xbb\x60\x4e\x30\x1e\x5a\x38\xb4\xf4\x0e\
+\x51\xef\x48\xbe\x7e\x36\x44\x0a\x86\xa0\xe5\xf6\x63\x34\x6c\x89\
+\x45\x6b\x8f\x1d\x6f\x94\xb5\x22\x34\xc2\x87\x2e\xb8\x63\x14\xe1\
+\xa3\x42\x98\xaf\x0a\x55\x57\x3b\x51\xfd\x5d\x1d\xe7\xac\x59\xad\
+\x22\xfa\x45\xe5\x69\x4a\xbd\xba\x66\xcf\xce\x74\xdc\x79\xc2\xa1\
+\xf9\x61\x3f\x88\x74\x60\x18\x75\xf8\xc3\x45\x1f\x46\x80\xe9\x4e\
+\x2f\x4c\x7b\x12\xe5\xa9\x96\xc7\x03\x78\xfd\x68\x0b\xa2\xe3\x03\
+\xa1\xa4\xa6\x72\x2e\x11\x01\xd4\x9a\x68\x3f\x15\x3e\xde\x55\x03\
+\xde\x3a\x98\x4e\x26\x2c\x39\x51\x92\x9c\x15\x99\x97\xf9\x4a\x28\
+\x1a\x7b\x9c\x30\x9b\xfa\xf0\xc5\xc2\x20\x0c\xf1\x6e\x74\x51\x22\
+\x90\x82\x2d\x59\x40\x5d\x65\xe3\x5d\x98\x3f\xcd\x7b\xc4\xaa\xe6\
+\xae\x3e\xe4\x14\xdd\x45\xca\xab\xa1\x60\xa8\xbb\x38\x5e\x40\x4c\
+\x80\x1a\xd5\xbf\x3c\xc2\xf5\xb3\xf7\x4a\x89\x66\xf1\xc9\x07\xeb\
+\x3f\x9c\x33\xd5\x06\x25\x18\x06\xb8\xd3\xf8\x04\x17\xdf\x8b\xc2\
+\x78\xe4\xae\xd9\x8a\x25\x87\x7f\x47\x6c\xbc\x01\x81\x93\x27\x80\
+\xa7\x96\xe8\x44\x1e\x25\xfb\xaf\x9a\x88\x47\xf6\x49\xb1\x60\xd7\
+\x3c\x38\x07\x05\x4a\xa0\x40\xfd\x6f\x9d\xb8\xb2\x3e\x66\x5c\x04\
+\x92\x74\xf6\xd9\x90\xb1\xa7\x1e\x33\x67\x87\x23\xd8\xa0\xa7\x2e\
+\x03\x0a\x77\x5e\x00\xf1\x5d\x55\x29\x6e\xdc\x32\x1b\x0e\x07\x07\
+\x0f\x0f\x06\x65\xa7\xee\xa1\xf5\x93\xa4\x71\x13\x0c\x4b\xec\xe6\
+\x2a\x24\xcc\x7b\x09\x61\xe1\x5e\x28\xdc\x77\x0d\x64\x52\xde\x65\
+\xb1\xe0\xfd\x78\xf0\x43\x2e\x34\x0e\x08\xa8\x38\x60\x84\x78\x3a\
+\xfb\x7f\x13\xc4\x6f\xad\xc1\x24\x83\x37\x32\x5e\x8b\xc0\xc1\x83\
+\xf5\x20\x13\xd7\x5c\x12\x3f\xdd\x9e\x84\xda\x76\x07\xfa\x79\x05\
+\x7e\x3a\x74\x05\xe2\xcf\x39\xe3\x06\xe6\x04\x0e\x86\xb5\xe7\x69\
+\xa6\xa9\xb1\x74\xed\x2c\xcc\xf2\x53\xe2\xa3\xbd\x75\x20\xfe\xeb\
+\xae\x3c\xc8\xce\x8d\x9e\x4a\x2f\x21\xd4\x1a\x15\x8e\xef\xae\x84\
+\x58\xbd\x7c\x5c\xe0\x2e\x1a\x50\x4d\x56\x05\x0c\x09\x91\x48\xce\
+\x8a\xc2\x10\x75\xb7\xa7\x4a\xc4\x99\xf2\x26\x13\x09\xde\x6c\x2c\
+\x09\x4f\x36\xe4\x19\x82\x75\x50\xd2\xab\x5f\xb6\xe9\x14\xbe\xde\
+\x9f\x01\x9b\x8d\x93\x52\x1f\xee\x82\x43\x5f\x82\xbb\xc0\xd9\x69\
+\x09\xd9\x99\x3d\x7d\x04\x9c\xa7\xe0\x5a\x0a\x1e\xb3\x34\x11\x2f\
+\x27\x04\x82\xa3\xf9\x4d\xe8\xed\xef\xe8\xb4\xa1\xf5\x7a\x47\x29\
+\x09\xdd\x7a\x23\x4d\xe3\xad\xad\x99\x9b\x61\x90\xef\xd4\xb5\x2a\
+\x13\x68\x09\x82\x40\x81\x64\x68\x0a\x2c\xbf\xe9\xc0\xa8\x18\x98\
+\xea\x3a\x46\x62\x54\xd5\xdc\x85\xc5\x05\xe7\x11\x9d\x93\x88\x84\
+\x64\x37\xb8\xa4\x8f\x8a\xee\xfb\xf5\x52\x07\x1c\x16\x7b\xba\x5c\
+\x0b\x42\xb6\xdd\x74\xa6\x64\x86\xb0\x3e\x13\x55\xf2\x2d\x26\x64\
+\xf4\x36\xa1\xd6\xab\xf1\x55\x7e\x05\x9c\xe7\xde\x42\x65\x73\x37\
+\x72\x0a\xaa\x91\xb4\x72\x2e\xe2\x66\xf8\xc2\xf9\x37\x38\x43\xcf\
+\xf7\x5a\x9d\x30\x56\xb7\x73\xed\x9f\xcd\x54\xc9\x48\xd3\x76\xdf\
+\x8e\x05\xcb\xde\xca\x5e\x38\x19\x02\x2f\x79\x45\x1c\x95\x40\xeb\
+\xa9\xc1\xe1\x0d\x15\x30\x96\x2d\x45\xca\xdb\xa7\xb1\x64\x5b\x16\
+\x42\xfc\xd4\xe0\x9c\x82\x7c\x46\x52\x4c\xa1\x04\xce\x54\xfe\x41\
+\xa3\xce\xc5\x3d\xd8\x31\xa3\x61\x44\xd5\x88\xbd\x4d\x45\x9e\x41\
+\xda\xfc\xcc\x14\x3f\xda\xcc\x04\x8c\xc6\xa1\xf3\x54\x63\xff\xba\
+\x13\xf2\xf7\xb2\x1d\x8b\x30\xc5\x97\xa5\x38\x2e\x79\xaf\x64\xb4\
+\x5a\xa5\x40\xb5\xb1\x07\x7d\x66\x7b\xf1\xfd\xed\xd1\xff\x94\xeb\
+\x61\x99\x7e\xa0\xf9\xb8\x77\x90\x76\xf9\xbc\x99\x3e\x34\x06\x22\
+\xcd\x8e\x67\x59\xd4\x3a\x15\xf6\xe5\x9d\xc4\xbb\x07\x97\xc1\x8b\
+\x15\xc1\xf3\x6e\x45\x18\x49\x73\x5a\x69\x2f\xde\xec\x85\xc5\x6c\
+\xaf\x68\xd9\x12\xf5\x7c\xc3\x19\x96\xc8\xc2\xd6\x22\x56\xad\xc8\
+\x9f\x9d\xe4\x8d\x60\xbd\x07\x2d\x5e\xa2\x14\x67\xd9\x05\x12\xc8\
+\xa0\x53\x84\x86\x6a\x2a\xd0\x49\xea\x6e\xb0\x4a\x82\x4e\xeb\x10\
+\xae\xd5\x59\xc0\x0d\x0a\xc5\xf7\x3e\x08\x1f\xbb\x65\x0e\x4b\x74\
+\x69\x5b\x2c\x2f\x88\xf5\xde\x3e\x1e\xec\xf4\x29\x6a\x04\x79\xb2\
+\xd0\xd3\x32\x32\xec\x0a\xe9\x98\x95\x06\xd5\xdc\x47\x7b\xc7\xc3\
+\x41\x58\x7a\x87\x38\xa5\x82\x24\x36\xe5\x85\xbd\xb8\xe9\xff\x5b\
+\x66\x1c\x7d\x94\xe6\x12\x48\x2e\x4d\xdf\x05\x54\xe1\xa9\x1a\x2d\
+\x23\xcf\x3b\x68\x1b\xa5\xda\x9b\x68\xba\x9f\x63\x14\x62\xf9\xed\
+\x35\xa1\x63\xfe\x6d\xf9\x0b\x73\x04\x4d\x24\xaf\xb0\xcc\x5d\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x7c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x43\x49\x44\x41\x54\x78\xda\x7d\x96\x5d\x4c\x5b\x65\
+\x18\xc7\xff\xef\x39\xa5\xb4\x60\x4b\x3f\xd6\xc2\xca\x60\x0d\xb8\
+\x20\x1b\x86\x4c\x87\x8b\x02\xba\xc8\x85\xd3\xe9\x58\x65\x57\x73\
+\x17\x7a\xab\xf1\xca\x8f\xc4\x78\xaf\x31\x99\x57\x1a\x2f\xf5\x4a\
+\x6f\x5c\x9c\xf1\x63\x89\x89\x9a\x45\x8a\xd3\x30\xe6\x98\x65\x20\
+\x2a\x42\xb3\x0a\xa5\x74\xfd\xa0\xdf\xd0\xf3\xfa\x9c\xd3\x53\xce\
+\x47\x8b\x27\x69\x0f\x7d\xdf\xe7\x7d\x7e\xcf\xff\x79\x9e\xf7\x7d\
+\x61\xa0\x27\x3f\xf1\xec\x4f\x70\xda\xc6\x61\x61\xd8\xff\xf9\xbf\
+\x39\xf5\xe1\xea\x7b\xa7\x0a\x29\x57\x0e\x3b\x7e\xf8\x66\x9c\xe5\
+\x26\xce\xdc\x11\x46\x7a\x07\x85\x3e\x0f\x20\xf1\x7d\x7c\x93\x73\
+\xde\x64\x4e\xb1\x37\x8d\xcb\x76\x02\x43\x75\x25\x8d\xea\x5c\x34\
+\xcc\xb6\x43\x53\xbc\xe5\xf4\x00\x50\xa9\x36\x1a\xaa\x81\xf3\xcd\
+\x1c\x39\xa3\xf9\xaa\xa4\xa9\x11\x45\xc0\xd7\x66\xf4\xaf\x0f\xa2\
+\x45\x44\xe5\xfb\xbf\xc0\xb2\x53\xe7\xb9\x75\xa2\x9f\x64\x49\xaa\
+\x4a\x7a\x4b\xba\x45\xe4\xa7\x78\xb3\x00\xdb\xeb\xaf\x1a\xf8\xa5\
+\x4b\x1f\xc0\x3e\x6c\x33\xda\xea\x01\x4c\x40\xf9\xe7\x35\xb0\x8c\
+\x0c\x78\x22\x08\xec\x4a\x06\x07\x7b\xc6\x02\x47\x71\xbe\x0c\xf7\
+\x27\x1f\x19\xa6\x53\x2f\xbd\x0c\xfb\x31\x6b\xcd\x6e\xcf\xaf\xee\
+\x6f\x51\x06\x44\xc1\xd2\xcf\x4f\xf1\xd6\xc7\x0f\x6b\x00\x03\x47\
+\x52\x16\x15\xef\xec\x36\x07\x0c\xc8\xf9\x13\x9a\x17\x5a\x56\x7e\
+\x3d\x06\x96\x0a\x85\xb8\x6d\xb4\xb7\x51\x41\xbd\xe0\x8c\x00\x7f\
+\x48\xcd\x01\x47\x64\x00\xd3\xa2\xd2\x2b\xa1\xc6\x28\xdc\x58\x07\
+\x4b\x4e\x86\x78\xdb\x63\x3d\x3a\x00\x37\x1a\x0b\x55\x14\x97\x59\
+\x73\x40\x3f\xad\xa9\x9a\xda\xb7\x9e\x5a\x91\x21\x3f\xb7\x01\xb6\
+\x35\x79\x8e\xb7\x9f\x0c\x90\xa1\xda\x72\x86\xa2\x51\x20\x64\x98\
+\xba\x32\x8f\xae\xb9\x19\x83\x9f\x8d\x87\x47\xe1\x3e\xfb\x20\x78\
+\x55\x1f\x90\xa4\x31\x64\xc0\xad\x4d\xb0\x04\x01\x1c\x27\x0e\x82\
+\xeb\x53\x24\x1b\xc8\xbd\x4f\x1f\x66\x11\x90\xba\x1a\x41\xd7\xcc\
+\x35\x23\x60\xf4\x14\x5c\xa7\x8f\x82\xd3\xa6\xaa\x15\x9a\x6b\x41\
+\xa2\x16\x58\xf6\x76\x02\x2c\x7e\x76\x92\x77\x1c\xf7\x2b\x91\x70\
+\x6a\x2d\x08\x02\x78\x72\x93\x72\x90\x06\xcf\x17\xc0\x73\xdb\xd8\
+\x9a\x59\x45\xe7\xec\x2c\x75\xcd\xa0\xb2\xb8\xb8\xb0\x88\xf8\x23\
+\x23\xf0\x9d\xa4\xda\x39\xee\x03\xb3\xdb\x01\x97\x07\xcc\xeb\x23\
+\x11\x92\x02\x63\x82\x84\xf4\xef\x29\xb0\x75\x02\xb8\x86\xbb\xc0\
+\x4b\x45\xf0\xd8\x1a\xa4\xf8\x56\x6d\x43\xd5\x15\x10\x30\x71\xeb\
+\x2e\x7c\x5f\x7d\x87\xf6\x47\x47\x14\x40\xfe\xfa\x2c\x12\xcf\x3d\
+\x05\xdf\x70\x80\x02\x93\x6a\x0d\xc1\x25\xa5\xf7\x99\xcf\x07\xd6\
+\x73\x08\xcc\xd6\x8a\xf4\x42\x12\x2c\xf6\xf4\x19\xee\x76\x64\x50\
+\xdd\x48\x28\x06\xb5\x23\x47\x2b\x1c\x23\xc8\xbd\xe5\x04\xac\xaf\
+\xbc\x89\xce\xb7\x5e\x53\xc6\xe2\xef\xbe\x8f\xf2\x87\xef\xc1\xd3\
+\xef\x31\x9e\x20\x6a\xf4\x72\x80\xa2\xdf\x87\x7b\x3b\xa4\x6a\xf9\
+\x80\x9f\x07\x86\x3c\x74\x12\x30\xa5\x25\xf7\xba\x47\x5d\x29\x0b\
+\xc9\xc6\xb2\xe0\xa1\x17\xd1\x7d\xe9\x1d\x65\x2c\xf6\xc6\xdb\x60\
+\x97\x3f\x86\x33\xe0\x54\x02\x37\x74\x5d\x7d\x1d\xbd\x63\x2b\x19\
+\xb0\x25\xff\x41\xde\x3d\x20\x1b\xea\x9d\xeb\x8b\x4d\x39\x4f\x17\
+\x91\x6c\xef\xc5\xe0\x6c\x58\x19\x5e\x3c\x31\x06\x6f\x6e\x0d\x76\
+\x87\xdd\xb8\x7b\x75\x10\x81\x0e\xbc\x68\x74\x1b\x6c\xd1\xdf\xc9\
+\x7b\xfa\x5d\xa4\x40\xb7\x59\x4c\x5b\x9f\x11\x7c\xf1\xdf\x0a\x02\
+\x17\x2f\x2a\xa3\x89\xaf\xbf\x45\xd0\x9a\x85\x68\x11\x1b\x22\xe7\
+\xea\x97\x40\xd9\x58\x8d\xe5\xc1\x22\x3e\x3f\x0f\x1e\xee\xa0\xf4\
+\x71\x6d\x93\xe8\x22\x92\x53\x94\x49\x97\xb0\x14\xa5\x1a\x49\x15\
+\x35\x6d\x56\xf4\x05\x3c\xf0\x7a\xec\xb5\x14\x19\x4e\x54\x75\x7f\
+\x92\xf4\x95\x38\x29\xb8\x4d\x35\xe8\xeb\x76\x50\x0b\x73\x0d\xaf\
+\x03\x88\x44\xb8\x16\x89\xe1\xc9\xc8\x6f\x86\x7d\xf0\xe3\xd0\x71\
+\x9c\x7a\x20\x40\xf5\x34\xdf\x07\x75\x05\xc0\x9f\x49\x52\x70\xd3\
+\xe3\xe3\x47\xba\x1c\xd4\x69\xdc\x60\x50\x07\x59\xc8\xf2\xea\xd2\
+\x3f\x38\x6f\xba\x70\x2e\x13\xf8\x99\xfb\x83\xd8\xe5\x8d\x8d\x51\
+\x53\x00\x2c\xa5\x08\x70\xc3\x7d\x80\x0f\xf8\x1d\x6a\x8a\x1a\x0d\
+\x2d\x24\xf5\xca\xdf\xab\x78\xc1\x04\xf8\x8c\x00\xe7\x82\xbd\x1a\
+\xc0\x24\x44\x56\xb0\x90\x29\x80\xfd\xea\xf2\xf2\xa3\x9e\x76\xed\
+\xb6\x34\x41\x64\xc0\x17\x6b\x77\x31\x15\x89\x18\x1c\x7c\x3a\x74\
+\x0c\x17\x0e\xf5\x10\x40\x6a\x70\x2e\x0f\x88\x34\x36\x4f\x27\x01\
+\x9b\x76\xba\xf9\x43\x2e\x47\x2d\x12\x53\x1e\xe5\x2f\x79\x6b\x24\
+\xd3\x29\x34\x7b\xbc\x4e\x97\x4e\xac\x31\xc5\x2d\xf4\xfa\xa5\x40\
+\x80\x2f\xdb\x9c\xd3\xc3\x6d\xf6\xb1\xce\x56\x2b\xa9\x90\x8c\x72\
+\xeb\x57\x02\xd3\xfd\xd6\x6d\x2c\xde\x18\xba\x9a\x1e\x86\xf5\x9d\
+\x0a\xe6\xca\xa5\xb0\xb2\xf4\x73\xbb\x63\xba\x43\x10\xc6\x5a\x68\
+\xc2\x28\x64\x9f\xff\x32\x60\xba\xf8\x4c\x4d\x24\x77\x64\x4a\xaa\
+\x86\x2f\x94\xf2\xe3\xff\x01\x16\x81\x1c\x46\x2e\x88\xde\x49\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xe2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xa9\x49\x44\x41\x54\x78\xda\xad\x55\x6d\x6c\x53\x55\
+\x18\x7e\xce\xbd\xb7\x5d\xf7\xe9\x60\x9d\x8c\xcd\x7d\xd1\x8d\x01\
+\x03\x2b\x03\xc2\x2a\x12\x97\x38\x20\x04\x22\xba\x18\x13\xb2\x1f\
+\x22\x09\x26\xa0\xc6\x3f\x26\x8a\x19\x81\x04\xb3\xa8\x81\x44\x90\
+\x00\x91\x18\x44\xa3\x18\x35\x1a\x20\x64\x6c\x4e\x32\xdd\x47\xc1\
+\x2d\x63\x80\x4c\xb7\x75\x2c\xfb\xa4\xed\x36\xd7\xac\xdd\xba\xf6\
+\x7e\x1c\xdf\xdb\x96\x8d\xc9\xc2\x86\xd9\x49\x6e\xce\xc9\xb9\xe7\
+\xbc\xcf\xfb\xbc\x1f\xcf\x61\xcb\x4e\x24\x27\x44\x99\xd0\xfe\x64\
+\x12\x16\x49\x02\xe6\x65\x28\x1a\xe0\x1e\x86\x2b\x30\x81\x3c\xb6\
+\xe2\x84\x59\xdd\xb4\x9e\x09\x8c\x03\x1a\x9f\x1f\x00\x81\x01\x9c\
+\xbe\x5f\xae\x73\x17\x2b\xfa\xce\xcc\x97\x67\x8a\x50\x55\xda\x9c\
+\x1f\xfb\x20\xdb\x10\x45\xe0\xaf\x6e\x15\xcc\xf6\xa5\x99\x2f\xb5\
+\x88\x50\xd4\x79\xb2\x1e\x19\x12\x01\xb4\x77\x12\xc0\xda\x33\x49\
+\x7c\x69\xae\x91\x18\x84\xfd\x67\x4c\x25\x8a\x72\xd8\x8d\x99\x7c\
+\x8b\xec\x33\xc6\xa6\x6d\xeb\xf4\x35\x55\x02\xd7\x84\x50\x24\x44\
+\x91\xa1\xbd\x23\x08\xf6\xcc\xc9\x24\x9e\x93\xa7\x03\x68\x74\x69\
+\x02\xc3\x63\x66\x38\x5d\x2f\x82\x29\x41\x28\x8a\x4c\x17\x38\x7d\
+\x32\x54\x39\x3c\x73\x85\x43\xa5\x59\xa3\x19\xe4\x94\xa6\xd2\x9a\
+\xce\x68\xb2\x80\x9c\x82\x46\x64\xa4\x4f\x90\x2d\x23\x44\x41\x80\
+\xa3\x8d\x00\x56\x1e\x4b\xe2\x96\x15\x46\x3a\x14\x40\xff\xe0\x6a\
+\xec\x5e\x5b\x8d\xfc\x45\x74\x57\xc3\x74\x16\x6c\xda\xf4\xd0\xbe\
+\x1e\x92\x86\x3b\xc0\xe7\x35\xcb\xb1\x6a\xcd\x10\x6d\x1b\xd0\xd9\
+\x4a\x00\x79\x47\x08\x20\xdf\x48\xde\x7a\x60\x12\x6a\xb1\x6f\xcd\
+\x1a\xac\x34\x8c\x13\x1b\xe1\xb1\x92\x2e\x32\x0d\x4d\x81\x18\x94\
+\x7d\x75\x1e\x8b\x57\xed\x81\x80\x04\x74\xde\x21\x80\xdc\xf2\x05\
+\x3c\x7b\x75\x14\x82\xb2\x0b\x4b\xe2\x34\x94\x5a\x7c\xb0\xa5\xc4\
+\xc1\xa7\x3c\x5e\x52\x8d\xd4\x43\xbf\xf5\x7b\x70\xec\xf2\x04\x84\
+\xa5\xe9\x94\x47\x33\xba\x9a\x03\x60\xd9\x87\x17\xf0\x25\x05\x06\
+\xfc\xe3\xc9\xc4\xf6\xdc\x3f\xf0\x72\x9a\x0f\x19\x89\x71\x08\x6a\
+\x5a\x88\x3d\x7b\x20\x0e\x72\x28\x6e\xff\xf5\x5c\x00\x85\x1b\x12\
+\x15\xff\x6d\xe7\x08\x2e\x77\x47\xe3\xa7\xe6\x7c\x58\xf2\xc7\xe0\
+\x68\x22\x06\x99\x07\x89\xc1\x3a\x8e\xf1\xd1\xb7\xf0\xd2\xb2\x83\
+\x78\x2d\x4b\x86\x5f\x33\xc2\x2f\x2b\x04\x42\x5d\x49\x4c\x26\xee\
+\x1b\x66\x0f\xe7\x80\x47\xe2\x18\x25\x31\x74\xb9\x86\xf0\xc3\x48\
+\x32\xea\xaa\x4a\xb1\xaa\xb8\x06\x0e\x3b\x39\x99\x7e\x80\x18\xac\
+\x0f\xc0\xe5\xbc\x88\x18\xf6\x14\xce\x6d\xcd\x42\x8b\xdb\x1f\xea\
+\x46\x36\x69\x74\xc6\x9a\x7d\x68\x24\x98\x44\x94\x9c\xfd\x13\xdc\
+\xd9\x86\x8d\x3b\xdf\x46\x7b\xad\x04\x96\xb6\x3f\x81\x67\xad\xd7\
+\x50\xdf\xe4\x40\x91\x75\x0c\xa5\x39\x66\xf4\x7a\x65\xfc\x1f\x59\
+\x32\x91\x98\x7d\xdd\x3a\x80\x3b\x17\xbc\xb0\xed\xde\x84\xde\x46\
+\x11\x2c\x75\xbf\xc4\x53\x0b\x3e\xc5\x16\xeb\x9b\x54\x35\x2a\x64\
+\x41\x0c\x53\x97\xe5\x29\xfe\xb3\x0d\x6a\x3a\x26\x49\xc4\x9a\xc1\
+\x48\x56\x64\x12\xa2\x2f\x4e\xed\x82\x29\xf6\x7b\x30\xf3\x3b\xe0\
+\x45\xaf\x70\x2c\x8e\x0f\x40\xd6\x18\xfa\xae\x5c\xa2\x92\x30\xc1\
+\xb2\x63\x1b\x64\xaf\x9f\xda\x53\x9b\xd5\xb8\x10\x1d\x83\x7b\x35\
+\xd5\xf0\x39\xdd\xc8\x29\x79\x15\x46\x23\x43\xc5\x05\x37\x86\x06\
+\x52\x29\xb8\x36\xfc\x5e\xf2\x09\xdf\x18\x13\xad\x62\xb0\xfc\x75\
+\xc4\xab\x5e\x74\x39\xda\xe0\x49\x7e\x1a\x1b\x8e\x7c\x0b\xd5\xef\
+\x9d\xa5\x3e\x4d\x18\xf9\xe6\x33\xc4\x77\xd7\xa1\xef\x9e\x0b\x8e\
+\xfe\x41\x6c\xaf\x74\xa0\xed\xd6\x28\xea\x4e\x3d\x51\x1b\xca\xde\
+\xa6\x4a\xce\x85\xb1\x7e\x64\x5f\x2a\x03\x62\x13\xd1\xd3\x75\x17\
+\xf6\xca\x8b\xb0\x5d\xd5\xa0\x8e\x0e\x3f\xd2\x3e\x37\xc5\x23\xe9\
+\xd8\x0e\xa4\xe4\x5a\x71\xb7\xb3\x13\x37\x1b\x6a\x90\x7d\xbc\x19\
+\x1e\x6f\x2c\x6e\xbc\x61\x0e\x2b\xd6\xba\x1f\xfd\x5c\x23\x81\x4b\
+\x39\xb7\x0b\x8b\x13\xe3\xd1\xd1\xde\x8a\x36\x77\x00\x99\x47\xeb\
+\xa1\x8d\x8f\x3e\x1a\xc0\x18\x8d\x85\x15\x47\x91\x11\xec\x82\xd3\
+\x39\x88\xa6\x9b\x37\xb0\xe4\x6c\x1f\x5c\x7f\x0f\xa3\xf3\xdd\xb4\
+\x30\x40\xde\x99\x3e\x1e\xa4\xba\x97\x82\x01\x48\x8d\x3f\x53\xdd\
+\x53\xf3\x3c\xbf\x93\xfe\xa8\x24\x70\xb3\xe8\xb8\x9e\x60\xaa\x39\
+\x63\x4b\x05\xfc\xae\x7e\x88\xcf\x95\x82\x2d\x88\xc3\xd0\xad\x1e\
+\x78\x8e\x6f\x08\x03\x58\x4e\x76\x9f\x74\x8e\xf8\xf6\x72\xd1\x00\
+\x18\x8c\xe1\x8b\x4a\x20\x92\x60\x3e\x5d\x9a\xc3\x36\x31\xd5\x75\
+\x0c\x5c\xaf\x3c\x29\x2a\x7c\x8e\x94\x96\xc9\x2a\xbc\x57\xaf\x9f\
+\xc2\x95\xd2\x7d\x93\x37\x73\x4e\xf7\x1e\xf2\x39\x1c\x1f\xf0\xa0\
+\xdf\x40\xc2\x04\x35\x76\xe1\x80\x12\x93\xd8\x23\x04\x27\x0c\x8a\
+\x2e\xd5\xf4\x22\xe9\xd2\xcc\x65\x5d\xa2\x69\x4d\x72\xae\x4b\xb9\
+\xaa\x08\xb2\xe0\x73\x67\x88\xfe\xc1\x54\x85\xeb\x85\x2e\x91\x14\
+\xc4\x94\xa3\x61\xcf\xa1\x88\x1b\x53\x23\x3f\x6d\xa1\x1d\xa6\x84\
+\x42\x7d\x2d\x04\xbd\xef\xdf\xee\x1d\xfe\x78\x2e\x6d\x60\xb5\xa4\
+\xbc\xa7\x4a\xb1\x1f\xe9\xe6\x24\xcd\x7f\xad\xa5\xa3\xdf\x36\xc9\
+\xf6\xc1\x83\x85\x85\xb6\x16\x30\xd1\x1a\xfa\xc1\xb5\x0f\xed\xd7\
+\x1a\x0e\xcc\x05\xc0\x56\xf8\xec\x61\xce\x84\xb2\x48\xc0\x6e\xd9\
+\xed\xf5\xd6\x19\x01\x36\x6f\xd9\x56\x46\xef\xc0\x61\x7d\x9b\x5e\
+\xad\xe2\xea\xaa\x8a\x5f\xe7\x02\x50\xbc\x79\xeb\x0b\xa2\x60\xa8\
+\x0e\x55\x15\x97\xf7\x56\x55\x56\x9c\xbe\xff\xef\x5f\x8c\x07\x06\
+\x91\x52\x36\x0a\x67\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x06\x09\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xd0\x49\x44\x41\x54\x78\xda\xb5\x55\x09\x4c\x14\x57\
+\x18\xfe\xde\xec\xc1\x29\xcb\x51\x11\xe5\x5a\xae\x18\xf1\x42\x28\
+\xd8\x03\x4b\x5a\xc5\x23\x46\xa0\x35\x6a\xb5\xa6\x58\x6b\x6a\x52\
+\xe2\x91\xa6\xad\x16\x93\x9a\x56\xa3\xd5\x52\xb5\x78\x73\x78\x34\
+\x52\xd3\x54\x43\xb0\x5e\xb5\x16\x45\x0a\xad\x07\x14\x8a\x80\x0b\
+\xb8\x07\xa7\xdc\xc7\x1e\xb3\x3b\x3b\x3b\xd3\xb7\x83\xdd\xc4\xa3\
+\x36\x4d\xda\x97\x6c\x66\x76\xde\x7b\xdf\xf7\x5f\xdf\xff\x13\xfc\
+\xcf\x8b\xfc\xdd\x46\xf2\xe9\x36\x55\xb0\xbf\x72\xbb\xda\x4f\x39\
+\xdf\x43\x49\xa2\xc7\x7b\xc9\x21\xd2\xef\x36\x5e\x44\x3f\xeb\x80\
+\x7e\x50\x76\xa9\x6b\x68\x73\x91\x1c\xe5\x17\x2f\x2d\xfe\x63\xf0\
+\x5f\x11\x64\x5e\xed\x2e\x4a\x0c\xf5\x5a\x11\xee\x2d\x47\xbb\xc9\
+\x8e\x60\xb9\x00\x5e\x24\x10\xe8\x71\x87\x83\x87\x91\xc8\xe0\xa9\
+\xf4\x46\x71\xc3\x02\xb8\x93\x01\xb0\x9c\x6c\xb8\x6f\x88\xcd\xba\
+\x9e\x59\x5b\xf4\x4c\x82\x17\x8e\x69\xd5\xf3\xe2\xfc\x74\xf1\x81\
+\x9e\xe8\x37\x5a\xf1\x92\x1f\x83\x30\x2f\x02\x46\x06\x18\xda\x3a\
+\xd1\x58\x57\x8b\x39\xa9\xa9\xe0\x6c\x36\x0c\x58\x45\x34\x58\xfc\
+\x51\xd0\xb8\x05\x53\xc7\x97\x42\xce\xf8\xa0\xa2\x61\xa4\xfa\xea\
+\xaa\xaa\x84\xa7\x12\x3c\x7f\xb4\x59\xbd\x32\x39\x50\xe7\xa3\x64\
+\x10\xab\x14\x30\x33\xd4\xcb\x75\xc8\xca\xf1\x68\x35\xb4\x62\x71\
+\x5a\x1a\x6e\x56\x57\xc3\x64\x32\x49\x17\xdd\x15\x72\x5c\xef\xf1\
+\xc6\xc9\x9a\x4d\x88\x89\x2c\x83\xca\x5d\x89\xb2\x5a\x3b\x86\x87\
+\xb8\xc8\x5f\xd7\xd5\xe9\x5c\x04\x89\x87\x35\xaa\xd9\x33\x02\x86\
+\xa2\x7c\x95\x48\xf1\x05\xa2\xfc\xdd\xc1\xc8\x19\xac\xcf\xda\x88\
+\x9d\x39\xbb\x24\x92\x8e\xf6\x0e\x7c\xb5\x2b\x07\x7b\x72\xf7\xc2\
+\x6c\x36\xe3\xd5\x59\xb3\x50\x5e\x51\x29\xed\xf5\x59\x94\xf8\xa0\
+\x6c\x2e\x52\x12\x04\x98\xed\x1c\xca\xab\x84\x91\xd2\x77\x6b\x55\
+\x2e\x82\x25\x25\x6d\x77\x96\xc6\x05\x24\x84\x33\x3c\x12\x43\xc6\
+\x80\xb7\xf3\xe0\x05\x07\x04\x87\x43\x02\x70\x08\x82\xe4\xc1\xde\
+\x2f\xbf\xc2\xbe\x83\xb9\xb0\x98\x2d\x90\xc9\xe5\xa3\xde\xb1\x2c\
+\x20\xc8\x50\xde\x71\x0d\x37\xad\x05\xf0\xf1\x1d\xc0\x30\x4b\x70\
+\xe3\x3a\x77\xe5\xf7\xec\xbb\xf3\x48\x5c\x4e\x5d\xd8\xaa\x05\xa1\
+\x06\xb9\x8d\x47\xd6\x8c\x00\x6c\xdb\xba\x15\x1f\x65\x67\x8f\x02\
+\x53\x02\x91\x82\x3b\xab\xe7\x71\x02\x81\x7e\xff\xeb\xb7\x79\xe3\
+\x26\x1c\x38\x74\x04\xeb\xca\x96\x21\x32\x66\x00\x76\x81\x83\x46\
+\x27\x40\x77\xcf\x1e\x4f\x52\xf2\xee\xe5\xaf\x9d\x13\xb2\x26\xc9\
+\x53\x40\xd4\xb8\x31\x12\x30\x6b\xb5\x4a\x4f\xe7\xe5\xc7\x09\x0a\
+\x4e\x14\xa2\xa7\xa7\xd7\x05\x2e\x79\x61\xb5\x81\xa7\x06\x1e\xae\
+\xcf\x85\x7a\x72\x3b\x5a\x8d\x06\x1a\x1b\x82\x2b\x25\x6c\x1e\x49\
+\x3f\x63\xd0\xf2\x84\x44\x9c\x7f\x23\xe4\xe1\x25\x91\x5a\x4e\x9f\
+\xa2\xf0\x54\x82\xc7\x3d\x10\x45\x11\x36\x1b\x27\x11\x14\xeb\xce\
+\xc2\x3d\xe2\x26\xb4\x23\x06\x28\x68\x0e\x2b\x6e\x58\x8d\x64\xd1\
+\x77\x7a\x31\xdc\x57\x8e\xfd\x73\x83\x25\x70\x91\x02\xcb\x64\xb2\
+\x47\x6a\xd9\x49\xa0\xd7\xeb\xb1\x7b\xc7\x2e\xec\xf9\x7a\x2f\x8c\
+\x46\xe3\x23\x04\x76\x9e\x07\x78\x82\xfc\xdb\x47\x10\x38\xbd\x11\
+\x4d\x83\xad\x90\x31\x0c\x34\x1a\x1b\xc8\x92\x1f\xda\xc5\x10\x37\
+\x11\x7b\x52\x43\x5c\x80\xd3\x62\x27\x3f\x21\x3e\x86\x92\x76\x77\
+\x75\x41\xdb\xd6\x86\xc1\xa1\x21\x70\x1c\x07\x99\xc8\x80\xa3\x05\
+\xc1\xda\x58\x30\x90\xe1\x9b\x9a\x93\xf0\x9d\xdc\x8a\xfb\xe6\x06\
+\xc8\xe9\xf9\xe6\x06\x4a\x90\x51\xdc\x26\x86\x29\x1d\xe8\x3f\xb6\
+\x05\xa7\xce\x9c\x92\xc0\xc2\x43\x42\x9f\x2a\xfb\xd6\x8e\x76\x58\
+\x2c\x2c\x7a\xfb\xfa\xc0\x38\x18\x14\xd6\x1c\x46\xaf\xb1\x1f\x1b\
+\x12\x3f\x04\xa1\x4a\x5f\x5d\xb2\x12\x6f\xbd\x9e\x84\x5b\xdd\x37\
+\x1e\x12\x70\x20\x29\x05\x1a\x31\x22\x40\x81\xe3\x19\x11\xd4\x5d\
+\x48\xad\x80\xa1\xd2\x75\xe6\x40\xca\x05\xad\x24\x07\xdd\x20\x52\
+\xd2\x1d\x30\x19\xcd\x34\x24\x76\x88\x34\x2a\xab\x2f\x2f\x06\x14\
+\x0e\xe4\x25\x9f\x45\x65\x6b\x05\xce\x0f\x9e\x44\x74\xb4\x1b\x3a\
+\x4c\x9d\x50\x28\x18\x54\x97\x9a\x8d\xe4\xe5\x83\xf5\x5a\x13\x27\
+\x46\xd4\x6c\x8c\x85\x95\x26\x8b\x21\x8c\x64\x2d\x47\x05\xe3\x22\
+\x10\x04\xa9\x64\x9d\x04\x0e\x5e\x80\x82\x51\x60\xf3\xe5\x4d\x88\
+\x9b\xe9\x8b\x9f\x9b\x4b\xe1\x66\x98\x84\x1e\x41\x8f\xac\x37\xd3\
+\x51\xdb\x59\x89\x76\x63\x37\x8d\x29\x50\x79\x7a\x38\x8f\xc4\x7e\
+\x52\x9e\x3f\x2e\x41\xbd\xe6\x8b\x19\x1e\x48\x8a\x0c\x70\x85\xc3\
+\x44\xd5\xfa\x34\x02\x91\x6a\xcf\xcc\x9a\xb1\xf6\xa7\xe5\x78\xe5\
+\xc5\x28\x9a\xd0\x26\x60\xc4\x17\x19\x49\xa9\x12\xb8\x7e\xb8\x8b\
+\x8a\x90\xa0\xa5\xc6\x8a\x3e\x0d\x17\x4f\x22\xd7\x5c\x08\x0b\x4a\
+\x9e\x64\x10\x07\x87\xb1\x2f\x2d\x14\xb9\x1f\x6f\x40\x61\xd1\x31\
+\xf0\x34\x54\x72\xb9\x02\xac\xc5\x42\xdf\x1d\x2e\x02\x25\xdc\xb1\
+\xfe\xdc\xfb\x48\x5f\x34\x0d\x0d\xdd\xb5\xd0\x0c\xdc\x97\x0c\x8a\
+\x54\x05\x41\x3b\xfc\x80\x86\x97\x80\x35\x0b\xa8\x2d\x19\xc9\xd5\
+\xe6\x37\x6d\x90\x5a\x45\x6c\xf6\x2f\x77\xbc\xa7\x84\x26\xa4\xfb\
+\x58\x90\xbd\x30\x06\x2c\x6b\x87\xc2\x4d\x01\xbb\xcd\x2e\x5d\x36\
+\x53\x12\x27\x81\xf3\x70\xd3\x83\x66\xe4\xd4\x7e\x8a\xb8\xa9\x63\
+\xd1\xd0\xd7\xe2\x0a\xa9\xd4\x77\xe8\xab\x95\x82\xd7\xff\x68\xd4\
+\x37\x1f\xd0\x44\xb8\x7a\x51\xd8\xdb\xc5\x2a\xef\x89\x61\x43\x56\
+\x6f\x4f\x1c\x4d\xf1\xc2\x9c\xa9\x41\x74\xb0\x08\x88\x9b\x32\x0d\
+\xb7\xaa\xaa\x68\x3e\xec\xe0\x69\xad\x37\x53\xf0\x9d\xd7\x76\x20\
+\x73\x69\xb2\x64\x7d\x7d\x9f\xd6\xd5\x8e\xa9\x70\x31\xd2\xcf\xa3\
+\xa5\xcc\xac\x6b\x39\xa4\x89\x7c\xa2\x5d\x87\x2c\xff\x5e\xed\x19\
+\x3f\x51\x67\xa6\xd9\xc9\x0c\x77\xe0\xb3\xb4\x28\x3a\x60\x18\xea\
+\x0d\x47\x13\xc6\x80\xd8\x59\x84\xc6\xc7\x20\x63\xff\x6b\x88\x08\
+\x73\xa7\xe0\xf7\xa5\xd2\x74\x56\xde\xa8\x4e\x08\x1a\xcb\x86\x51\
+\xb7\xed\xde\x23\x33\xe6\x91\x3f\x13\x96\x9c\x56\x2b\x62\xd4\x3a\
+\xc7\x84\xe7\xa0\xe8\xec\xc4\xa6\x94\x00\x64\x4c\x1f\x8b\x80\x31\
+\x1e\xb0\xd0\xae\x59\xdd\x54\x85\xe2\xe6\x73\xb8\x3b\x70\x1b\x16\
+\x0c\x42\x35\xc1\x03\x2a\x3a\x9c\x04\x81\x48\x50\xc6\x01\x1e\x4d\
+\x17\x46\x3e\xd7\x9d\x68\xde\xfa\xcc\x91\x39\xe1\xbd\x8b\x45\xe2\
+\xf8\xc0\x15\x9c\xaf\x37\x58\x7d\x0f\xfc\xbd\x81\x60\x3a\xd9\x40\
+\x95\xab\xa4\x43\xa5\xae\x89\x83\x22\x58\x06\x99\xe9\x0e\xe4\x6d\
+\x67\x7b\xfc\x22\x3a\x89\xe7\x38\xe5\x58\xff\x50\x25\x0c\xbf\x59\
+\xac\x0d\xbb\x1b\x3d\x9e\x49\xe0\x5c\x41\x8b\x8e\xab\x04\x1f\x9f\
+\xed\xa2\xca\x67\xbe\x28\x57\x44\x8b\x3e\x5e\xa3\x4d\x89\xb5\x52\
+\x15\xdb\x41\x06\x8d\x97\xc4\x01\xeb\xb7\xbd\xe7\x97\x49\xf2\x57\
+\xaf\x8a\xf1\x23\x44\x5c\x48\x13\x3d\x5b\x5b\xd8\xf2\xce\x3f\x12\
+\xfc\x57\xeb\x4f\xb9\xea\x14\xd1\x24\x3d\x76\xd4\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\xcf\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x02\x96\x49\x44\x41\x54\x78\xda\xad\xd5\x5f\x48\x14\x41\
+\x1c\x07\xf0\xdf\xcc\xdc\xde\xed\x9d\x77\xb7\x67\x82\x22\x11\x27\
+\x3d\x14\x16\x81\x58\x78\x3d\xf5\x54\x84\x4f\x41\x7f\x1f\x12\x0a\
+\x2a\x0d\x45\x2b\x88\x0a\xf2\x0a\xd4\xa0\x1e\x7d\x51\xa1\x1e\xb4\
+\xa0\x30\xa2\x88\xc0\xb0\x28\x08\x22\xcc\x3f\x44\xe4\x91\x84\x21\
+\x69\x79\xc5\x69\x77\xb7\x7a\x7f\xf6\x66\x77\xa7\xd9\x25\x8d\x9e\
+\x6e\x61\xee\xf7\xb0\x2c\xc3\x7e\xf7\xc3\xfc\x76\x66\x16\x81\x83\
+\x52\x0f\x1f\xbf\x09\x35\x1b\x2e\x33\x17\x86\x42\x81\x42\x62\x66\
+\xe1\xd6\xb6\x91\x67\x57\x9c\x64\x51\xb1\x07\x72\x47\x9b\xfa\x49\
+\x63\xed\x59\xe4\x97\x01\x18\x03\x84\x31\xd0\x74\x06\x62\x0f\xdf\
+\xf5\xec\x1a\x7d\x1e\x15\x06\xb4\x4b\xed\x0c\xd5\x55\x03\x14\x8c\
+\xf5\x31\xe2\x76\xc1\xf7\xb7\x9f\x21\xdc\x77\xb7\x68\xbe\x38\x70\
+\xb1\x95\xa1\xda\x4a\x00\xc3\x5c\x1f\xc3\x2e\x02\x3f\xc6\x67\x21\
+\x3c\x70\xaf\x04\xc0\x85\x56\x06\x5b\xca\x39\xc0\xfe\x03\x16\xa7\
+\xbe\x42\xf8\xf6\x7d\x71\x20\x7f\xae\x85\xa1\xb0\x02\x60\x72\x00\
+\x61\xde\x1f\x62\xb7\x28\xfe\x69\x1e\x36\xf5\x0f\x96\x00\x68\x3e\
+\xcd\xd0\xd6\x10\x7f\xb1\x04\x2c\xf1\x0b\x58\x6c\x1a\x88\xaa\xc2\
+\xd8\x87\xf8\xca\x9e\x64\x3a\x28\x0c\xe4\xce\x34\x8f\xa1\x8d\x28\
+\x62\x8e\x8c\x02\x4b\xaa\x00\x2e\x17\xb8\xf9\x72\x7d\x3d\x9b\x1c\
+\xdf\x9f\xd3\x22\xc2\x40\x26\xb2\x7b\x0a\x12\xb3\xf5\x60\x7d\x02\
+\x4c\xec\x84\x9b\x20\x78\x33\x9f\xfa\xb8\x37\x97\xaf\x13\x06\x54\
+\xaf\xff\x05\xae\xf2\xed\x83\x7f\xdf\x18\x64\x0e\xf4\xcd\x2d\x45\
+\x3b\x98\xd1\x23\x0c\xa4\x7d\xc1\x28\x09\x79\xba\xac\x4d\xb6\x56\
+\x5e\x8c\x60\x20\x9e\xec\x6a\x33\xf5\xeb\xa5\x00\x3a\x89\xdf\xdd\
+\xbd\x06\x58\x01\xc6\x57\xd4\x50\x4a\x3d\xdf\x66\xe8\xbd\x25\x00\
+\x94\x9d\x58\xc6\x13\x08\x90\xfd\xac\x75\xcd\xe8\x26\x3c\x59\xcd\
+\xd4\xb6\x18\x74\x46\x18\x48\xf9\x14\x09\x4b\x58\xe5\x2f\x96\xd7\
+\x02\x39\xd3\x2c\x3c\xce\x64\xab\x38\x90\x12\x06\xec\x59\x04\x42\
+\x73\xbc\xed\x35\xd6\x3d\xe1\x52\x9c\xd2\xf4\x2b\x4d\x2b\x6f\x36\
+\x28\x2b\x96\x75\x04\xfc\x2e\x53\x7a\xdd\x08\x75\x58\xf7\x12\x07\
+\x62\x54\x9b\xae\xcf\x67\x77\x38\xc9\x3a\x02\x7e\x96\x29\x15\x7c\
+\x99\x26\x28\x33\x51\x96\x99\x10\x33\xf4\x86\x83\x54\x9b\x28\x19\
+\x20\x52\x8e\x80\x25\x7f\xe8\x0e\x22\xe8\x94\x97\x60\x50\x75\x0a\
+\xf3\x05\xfd\x51\x43\x3e\x7b\xa4\x24\x40\xda\x1b\x3c\x81\x03\xd2\
+\x20\xe6\xbb\xd7\x3e\x2d\x78\x42\xa7\x26\x0c\x2d\xab\x27\xdb\x4d\
+\x7d\x48\x18\x50\x43\xa1\x2e\x52\x29\x47\xed\xe3\xfa\x6f\x79\x38\
+\xf6\xf2\x5b\xaa\xbb\x31\x9f\xbf\x26\x0c\xa4\xca\x94\x1e\xf7\x76\
+\xe5\x2a\xe3\x9b\xcb\x9e\x02\x4f\xc8\x12\x81\x07\x93\x8b\x37\x9a\
+\x0c\xda\x29\xde\x22\x39\xd8\x40\x36\x07\xdf\x93\x6a\x9f\xfd\xdb\
+\xc4\xfc\xa8\x5e\x5d\x50\x61\xf8\xcb\x72\xa4\x95\xd1\x71\x61\xc0\
+\xaa\xb8\x27\x78\xc0\x55\xe1\x19\x46\x01\xc9\x93\x49\x6a\xda\xe4\
+\xd2\xca\xb1\x43\x66\xe1\xa9\x93\xec\x1f\x09\xf6\x06\x28\xd8\xd7\
+\x09\x30\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xb0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x77\x49\x44\x41\x54\x78\xda\xd5\x55\x5b\x4c\x1c\x55\
+\x18\xfe\xce\x99\x99\xdd\xd9\x65\xb9\xb7\x08\x74\x41\x9a\x46\x6c\
+\x51\xa3\x35\x05\x1a\xa4\xc4\x37\xb4\x1a\x42\x62\xa3\x7d\xb0\xad\
+\x6d\x4c\x1b\x4d\xfa\xe0\x25\xa9\xb7\x44\x8d\xe1\xa1\x12\x93\xfa\
+\x40\xfb\x50\x2d\x4a\x93\x62\x4a\xb4\x31\x14\x48\xbd\xa4\x5e\x10\
+\x8a\x29\x08\xbd\xa9\x11\x53\x17\x96\xcb\x82\x5a\xca\x65\x97\x9d\
+\x9d\x39\xc7\x7f\x76\x96\x05\x5a\x9a\xf8\xd2\x18\x4f\xf6\xcc\x99\
+\x9d\x39\xfb\x7d\xff\xff\x7f\xdf\xf9\x97\xe1\x36\x0f\xf6\x9f\x11\
+\x5c\x9a\x6c\xaf\x66\x8c\xef\xd1\xb8\x52\x34\xf5\x77\x76\x59\x4e\
+\xee\x46\x58\x96\x79\xe3\xb6\x80\x90\x68\x35\x25\x3e\xda\x90\xa9\
+\xf5\xfe\x2b\x82\xcb\x93\xed\xdb\x39\x53\x1b\x35\xae\xeb\xd7\x8d\
+\x00\x7e\x9b\xfb\x02\x9d\x7d\x43\xf0\xe4\xb5\xc1\xe5\x63\x10\x42\
+\x00\x92\x3e\x8c\x41\x63\x12\xfe\x14\x05\x45\x1e\x05\x05\x29\x7c\
+\x5e\xe5\xd8\x53\x9c\xa1\x35\xaf\x48\x30\x30\xd1\xa6\x53\xc4\x57\
+\x75\x9e\x92\x3b\x12\xe9\xc5\xd9\xd1\x0f\x31\x6b\x86\xa1\x71\x0d\
+\x1e\x3d\x8c\xaf\x3a\x9a\x50\x5d\x53\x01\x23\x6a\x20\xce\x60\x5f\
+\x69\xb1\xe8\x42\x59\x20\x26\x19\xee\x4d\x57\x70\x7f\x86\x7a\x21\
+\x45\xe3\xe5\xeb\xb3\xb4\xf9\x24\x41\xff\x78\x7b\x3e\xe7\xca\x88\
+\xc2\x14\x7c\x1e\xa8\x43\x30\x3c\x0c\x17\xd7\xc1\x19\x8f\x03\x69\
+\x2e\x03\x5f\xb6\x54\xa3\x76\xd7\x21\x44\xc3\x33\x10\x89\xa0\xa4\
+\x5c\x08\x4f\xc2\x22\x28\x2a\x15\x14\xba\x2f\x5f\xa5\x60\xb5\xce\
+\x0b\x1e\x5e\xe3\x0d\x3a\x04\xa1\x33\xd2\x14\x06\x9a\x06\x5f\x43\
+\xd4\xb4\xa0\x70\x95\xb6\x2f\x56\x4f\xd1\x04\xba\x3b\x24\xaa\xb6\
+\xfe\x04\xae\x44\x08\x58\x26\xc1\x45\xe2\x46\x26\x58\x29\x11\x98\
+\x22\xfe\x25\xd6\x50\x99\xe5\x62\xe7\x47\x3b\x8e\x2a\x8c\x3f\xfb\
+\xf1\xef\x6f\x61\xda\x98\x81\xc2\xb4\x9b\x95\xe2\x02\x33\x53\x51\
+\x04\x06\x8e\xa3\xa2\x7a\x3d\xcc\x98\x19\x2f\x8b\x13\xbb\x74\x34\
+\xa1\x29\x16\x9f\x24\x9e\xc9\x03\xac\x6f\xec\xeb\x99\xae\x89\x56\
+\x5f\xe7\xd8\x19\xb8\x14\xfd\x96\xb6\xd2\xdc\x11\x7c\xdf\xbc\x03\
+\xd5\x3b\x5f\x24\x1d\xc2\xcb\x80\xed\x55\xb0\x85\xb2\x39\x4c\xf6\
+\x7b\xca\x6a\x88\x0d\x84\xbe\x91\xef\x5d\xa0\x1f\x59\x56\xb2\xe6\
+\x2b\x79\x4d\xf3\xc4\x70\xf6\x83\x34\x3c\xb6\xf7\x3b\x18\x91\x6b\
+\x10\x96\x5c\x5e\xa2\xa4\x1a\x8e\x38\xf6\x6a\x67\xc4\xfa\x43\x9d\
+\xf2\xd5\xee\xdd\x48\x75\xa5\xae\x8c\xad\xd0\x66\x5d\x60\x30\x90\
+\x89\xab\x9f\x64\xa0\xa0\xf2\x00\x36\x96\x15\x23\x36\x1f\x73\xca\
+\xc1\x1c\x24\x7b\xb5\xa3\xb7\xe4\xa2\xf8\xf6\xc2\x2e\x86\xba\xe4\
+\x4b\x5d\xbb\xe0\xd3\x96\x13\x28\x04\x2c\xdc\x02\xbf\x0c\xe7\x20\
+\xf5\x84\x17\xaf\xff\xf8\x2b\x1e\x37\xfe\x40\xde\x86\x27\x51\x55\
+\x7f\x04\xd6\xcc\x75\x2a\x81\x13\xa9\x4c\x08\x22\x92\xce\x72\x4c\
+\x10\x27\xf8\xf4\xe2\x09\x79\x72\xe4\x7d\x44\x0c\x03\x8c\x93\x77\
+\x48\x50\xb8\x25\xae\x8c\xe4\xc1\xf7\x59\x1a\x1a\xce\xf5\x63\xb3\
+\x32\x45\x91\x09\xd0\xd9\x42\x9f\xe0\xa8\xdd\xdf\x8a\x07\x4b\xee\
+\x84\x88\x19\x4e\x29\x04\x16\x85\x5d\x52\x26\x8b\xd2\x61\x35\x87\
+\x6a\xe5\xa6\xaa\x6c\x9c\x0b\xf6\x40\x71\x73\xfc\x3c\xe1\x87\xb7\
+\x2d\x07\x47\x7a\xcf\xa3\x82\xff\x09\x93\x4e\x6b\x8c\x44\x90\x71\
+\xe3\x4a\x78\x28\x80\x4a\x5f\x25\xf4\x37\x1a\x81\x39\xca\xc2\xf6\
+\x67\x82\x40\xc8\x25\xae\xa2\x68\xcc\x70\x14\x2c\xeb\x89\x3b\xe6\
+\x8e\xd5\x1f\xf4\xee\xef\x6e\xc6\xba\x8e\x5c\xbc\x73\xf9\x0a\x2a\
+\xd9\x38\x2c\x1b\x98\x39\xc0\xcb\x4a\x47\x4f\x8c\x68\x14\xfe\x9a\
+\x53\xb8\xaf\xa4\x10\xd2\x70\xb2\x90\x09\x70\x16\x3f\xdd\x0c\x96\
+\x11\x83\x32\x6f\x8c\xb0\xc2\x9d\x6b\x5f\x8e\x7a\xd5\xfa\xc6\x6f\
+\x39\x1e\xcd\xb3\x4f\x49\x0c\xf3\x92\x25\x5d\xb1\xd2\xf0\x90\x3e\
+\xcf\xcb\x12\xfc\xb0\xf7\x18\xb4\xf0\x74\x3c\x0b\x87\x80\x7a\x15\
+\x19\xd1\x9a\x9e\x03\x9b\x9a\x83\x3b\xdd\x5b\x1b\x0f\x2f\x67\xdf\
+\x5d\xc1\x7d\xc7\x83\x6b\x36\x93\x31\xca\x1f\xc8\x45\xa6\x3f\x15\
+\xa6\x61\xc5\x4f\xa7\x94\x37\x53\xd9\x59\x68\xd2\x84\xb7\xb0\x0e\
+\x45\x9b\x4a\x09\x91\xb2\x20\xfd\x84\x21\x60\x8d\x4d\x82\x5d\x9b\
+\x85\x9e\x9d\x36\x7e\xa9\xee\xa1\x3c\x87\xe0\xb9\x62\xff\xdb\x47\
+\x03\xc3\xe9\x54\x44\x41\xb3\x20\xd5\x83\x75\x6b\xb3\x90\x53\x9c\
+\x4d\xba\x30\x47\xc4\x84\x1d\x17\x1c\xaf\xa9\x0c\x87\x23\x7e\xbc\
+\xf9\xc8\x61\xf8\x66\xa7\x11\x0b\xfd\x05\x19\x18\x86\x5b\x55\xa0\
+\xa4\xa5\x8c\x0d\x36\x6c\xcd\x5f\xd6\x4d\x4f\xc1\xed\x8f\xa8\xe8\
+\xa1\x46\x91\xaf\xda\x51\x5a\xd4\x21\x08\x2b\x2f\xc3\x8b\xf4\x4c\
+\x2f\xdc\x1a\x8f\x6f\xd7\x5c\x2a\x24\xf5\x2b\xc2\x47\x66\x70\x14\
+\x77\x57\x1e\xc4\x84\xe9\x85\x4e\x06\xd1\x3c\x5e\x9a\xfa\xc9\x40\
+\xd3\xb6\xa7\x96\x9c\xd1\xe5\xa3\x45\x75\x6f\x77\x31\xd6\xa8\x81\
+\xe9\x1a\xa5\xad\xda\x1d\x32\x3e\xa9\x2c\xf4\x5e\x25\xe1\xed\x56\
+\xe8\xa2\x99\x63\x45\xb0\xa5\xec\x05\x0c\xaf\x2a\x81\x9b\x89\x7e\
+\xfa\x0b\xd9\x1d\x6a\x79\xba\xff\x86\x26\xb0\xf2\x68\xd7\x3c\x05\
+\x44\xf0\x0a\x11\x95\x52\xb4\xa5\xaa\xb4\x81\x65\x82\x80\xa2\xa5\
+\xfb\xd5\x22\x1a\xd8\x76\xcf\x8e\xd3\x3d\xfe\x2d\xef\xce\xb5\x3e\
+\x33\x74\x8b\x2e\x73\x7b\xc7\xff\x9f\xe0\x1f\xbf\x22\x06\x24\x70\
+\x01\xbe\x4d\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x22\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\xe9\x49\x44\x41\x54\x78\xda\x9d\x56\x6b\x6c\x53\x65\
+\x18\x7e\xbe\xf6\xb4\x5d\xef\xa7\xed\x56\xba\x75\x1d\xbb\x50\x2e\
+\x9d\x4a\x40\xa3\x3f\x1c\x24\x24\xc4\x7f\xc4\x04\x95\x0d\x13\x60\
+\x9b\x89\x9a\x2c\x42\x14\xff\x29\xa8\xc4\x7f\x5e\xc0\x31\x88\x44\
+\x13\xfc\xe7\x06\xf8\xd7\x7f\x26\x46\x47\xcc\x12\x20\x92\xb1\x0d\
+\x84\xb1\x31\x18\x5b\xef\xf7\x7b\xd7\xcf\xf7\xb4\xdd\x59\x0f\x4e\
+\x49\xfc\x92\xf6\xf4\xbc\x97\xe7\x79\x9f\xf7\xfb\xde\x73\xca\x40\
+\x2b\x39\x30\x38\x4a\x97\x5e\x08\x2a\xfc\xdf\xc5\xe5\x2f\x5a\xa5\
+\x15\xe9\x7b\xcc\xf2\xc3\xc5\x3e\x16\x1f\x18\x18\x55\xbb\xc5\x5e\
+\x95\xcb\xfc\x14\x04\xfe\x14\x54\x65\xdc\x8a\x3f\x85\xd2\x62\x7c\
+\x4c\x22\xe0\x9a\x9d\xad\xca\x98\x54\x01\xdc\x9f\x84\xaa\xd3\xbe\
+\x6e\x32\x97\x40\xeb\x70\x79\xba\x00\xe4\x4b\x60\x36\xbd\x22\xbc\
+\xf0\xe7\x12\x58\xec\xad\x41\xae\xdd\xde\x2c\x27\x48\xc1\x2b\x93\
+\xcb\x24\xb3\x0c\xe6\x34\x41\xe5\x75\xfc\x87\x02\xa2\xca\x14\x51\
+\x9e\x0a\x54\x6e\x55\xbe\x26\x30\x83\x46\x56\x97\x9f\x0e\x80\x45\
+\x25\x82\x67\x36\xc8\xe0\xa5\x5b\x01\x68\x77\xbd\x0c\xc1\xe7\x43\
+\xe6\xfc\x05\xa8\x9a\x8c\x50\x6f\xb2\x2b\x09\x56\x8b\xc9\x50\xfc\
+\x74\x08\x6a\x8f\x07\xea\xf6\x36\x14\x7e\x1f\x87\xb0\xad\x11\x4c\
+\x5f\x25\xc9\xcd\x04\xc1\x22\x83\x03\x5c\xd7\xed\x44\x39\x92\x45\
+\x69\x36\x02\x6d\x4f\x0f\x0c\x43\xef\x54\x25\xfe\xfa\x1b\xd2\xe7\
+\x2e\x40\xd8\x28\x42\xed\x32\x2a\xdb\x42\x95\x17\x67\xaa\xe0\xa6\
+\x4f\x3f\x06\x33\x1a\x90\xa1\x58\x89\x44\xb3\xd5\x41\x24\x02\x32\
+\xb7\xc3\x60\xa1\x81\x7e\xae\x27\x69\xe5\x74\x11\xf9\x5a\x82\xb5\
+\x96\x20\xad\x3c\x91\xa4\x28\x51\xd3\x21\x42\x70\x54\x6d\x65\x02\
+\xcf\xdf\x09\x43\xb7\xab\x07\xa6\x5a\x31\xf5\xb1\x82\xd3\x00\x8d\
+\xdb\x8c\xf4\xdd\x08\x58\xa0\xbf\x9f\x1b\x49\x96\x54\x5d\x99\x24\
+\x67\x89\x55\x22\xb1\x7d\x76\x42\x26\xc9\x51\x62\x62\xe4\x5b\xe8\
+\xda\x49\x09\x55\x96\xfd\x2b\x02\xdd\xee\x1e\x58\x86\xde\x95\xc1\
+\x57\x63\x34\x76\x3d\x74\x6d\x96\x8a\x2d\x79\x2f\x0a\xe6\xef\x3f\
+\xc2\x4d\x9b\x1d\x72\x73\x57\x32\x25\xa4\x09\xa0\x81\x00\xc4\x3a\
+\x80\x2c\x01\xc4\x08\x40\x5a\x86\x3d\xbb\x61\x5d\xc7\xa7\xb5\x35\
+\x40\xef\x31\xcb\xdb\x95\xbc\x1f\x03\x5b\x3a\x72\x84\x5b\xbc\xca\
+\x4d\x5c\xa1\x16\x24\x66\xa3\xd0\xef\xde\x05\x7b\x1d\x50\xec\xfb\
+\x8b\xd4\xca\x0c\xec\xc7\x86\x64\x5b\x9a\xc0\xa3\x04\x6e\x74\x9b\
+\xa0\x15\x1b\x14\x73\x11\x9f\x8b\x83\x2d\x1e\x3e\xcc\xc5\x2e\x51\
+\x71\x12\x79\x32\x86\x62\x30\x86\xd0\xf5\x05\x18\xf7\xee\x45\xcb\
+\x99\x2f\xd6\x9d\xbd\xd8\xd8\x15\xf8\x3f\xf9\x1c\xf6\x6e\x17\x55\
+\x4e\x47\xd4\x6c\x55\x4c\x61\x74\x3e\x09\xf6\xf0\xd0\x21\x6e\xa3\
+\x0d\x44\x31\x8f\x72\x38\x80\x72\x34\x42\x12\x4a\xd5\x53\x44\x1b\
+\xef\x9f\x0a\xc1\xfa\xda\x7e\x78\xce\x7c\xa9\x00\x7f\x7c\xf2\x14\
+\x42\xdf\x5d\x84\xa3\xd3\x0a\x53\xa3\xbe\x5a\xb9\x4a\x0d\x26\x3a\
+\xa0\x6a\x6c\x02\x34\x5a\x44\x16\x88\x60\xfe\xc0\x01\x6e\x37\x66\
+\x50\x8e\x85\xd7\x46\xbf\xa6\x24\x11\xcc\x20\x38\x1b\x87\xf3\xed\
+\x41\xb4\x9e\x3a\xa9\x20\x78\x70\xec\x43\x84\x49\x81\xdb\x67\x87\
+\xce\x20\x28\x87\x51\xe2\xb2\x39\x10\x2e\x98\xc1\xa6\xbc\x5e\xee\
+\xde\x66\xaf\xf9\xd6\xc0\xe3\xa1\x2c\xfc\xf7\xe3\xe8\x1c\xfe\x0a\
+\x8d\xbd\xaf\xaf\xdb\xa2\xfb\xc7\x8e\x23\x72\xf9\x27\x78\xbc\x22\
+\x74\x0d\xff\x24\x79\x44\xf9\x6c\xb2\x6b\x13\x6f\xdd\x22\x2a\x26\
+\x34\xec\x4f\x63\xf9\x51\x0a\x5e\x02\x77\xf6\xbe\x21\x03\xde\x3d\
+\xfa\x41\xe5\xea\x1d\xfe\x5a\xb6\xdd\x3b\x7a\x1c\xa1\xcb\x57\xd0\
+\x4e\xad\x6a\xd0\x29\x49\x1e\xcc\x27\xc0\x6e\x76\x76\xf2\xb6\x4d\
+\x36\xd9\xb8\xb0\x90\x40\x94\xa6\x7a\xeb\xf0\x69\x6c\xe8\x5b\x03\
+\xbf\x4d\xe0\xa1\x4b\x57\xb0\x52\x2e\x63\x0b\xf9\x5c\x75\xbe\x3b\
+\xe4\x0b\x92\xaf\x8b\xce\x7f\x85\xa4\xd6\x8d\xb9\x87\xb4\x07\x37\
+\xda\x3b\x78\x47\x47\x55\xc1\xdc\xa3\x38\xc2\xd1\x1c\xba\xcf\x9e\
+\x46\x73\xdf\x01\x19\x60\xea\xbd\xf7\x09\xe0\x32\x36\xb7\x89\xc8\
+\xe4\x4a\x98\x5f\x4e\xc2\x47\x31\x2d\x75\x31\x13\x7b\x5e\x41\x66\
+\x7a\x1a\x9b\xdd\x16\x18\xb4\x55\x92\xd9\x25\x52\x70\x6d\x63\x3b\
+\xef\x6a\xb3\x62\x8e\x92\x96\xc3\x19\x3c\x37\xf2\x0d\xdc\x07\xab\
+\x89\xc5\x78\x02\x33\x1f\x9d\xc0\x32\x81\x77\xbb\x45\x18\x6a\x2d\
+\x08\xc6\x73\x98\x0d\x24\xf1\xec\xc8\x19\xb4\x1e\xec\xad\xd8\x4a\
+\x14\x3b\xf1\xea\x7e\xa4\xa7\xa6\xe1\x73\x59\x61\xd4\x08\xb8\x4b\
+\x31\x6c\xc2\xb3\x91\x7b\x5b\x2c\x48\xd3\xf3\xfc\xe6\xc3\x28\x9a\
+\xa9\xe7\x3b\xcf\x0d\x13\x78\x1c\x57\xf7\x51\x02\x55\xb5\xbd\x59\
+\x84\x71\x55\x7a\x6d\x9f\xfc\xc9\x2c\xee\x84\x93\xd8\x31\x32\x8c\
+\xb6\x37\xab\x24\x37\x86\x8e\x62\x69\x94\x8a\x69\x34\xc3\xaa\xd5\
+\xe0\x36\xf9\xd9\x1f\xee\x36\xbe\xc5\x65\xa9\x24\xa6\xf2\x45\x5c\
+\x7f\x1c\x85\x9b\xa4\xc7\x26\x6f\x55\xaa\x79\xde\x25\xc2\x44\xc1\
+\x95\x3d\x5a\x1d\xd2\xda\x75\x26\x9c\xc0\xe3\x4c\x0e\x2f\x9c\x3f\
+\x8b\xe0\xf8\x55\x2c\xfe\x78\x09\x3b\x1b\xad\x30\x0b\xea\x6a\x6b\
+\xa3\x29\xb0\xf1\x66\x0f\xf7\x35\x99\xe5\xa4\x24\x91\x4c\xf8\xa3\
+\x95\xdf\x2f\x39\x6d\x30\x6b\x84\xba\xe9\x5f\x23\xe1\x35\x35\xb7\
+\x62\x09\x2c\x66\xf3\xf4\x3a\x67\x78\xd1\x26\x81\x0b\x72\xdc\x64\
+\x82\x08\x7e\x71\xb6\xf0\x1d\x0e\xab\x22\x39\x94\x2b\x40\xc3\x18\
+\x2c\xf5\xe0\x4f\x92\xd4\xd9\xa7\x52\x29\x78\x74\x3a\x58\x84\xfa\
+\x36\x72\x5c\x4b\x55\x09\x46\x5d\x3a\x6d\xaf\x8b\x02\xd6\x4b\x7e\
+\x72\x78\x9e\x9c\x76\x25\x79\xdd\xa3\xa4\x58\x90\x3e\x63\x4c\xba\
+\xf9\xd9\xbe\xa1\xf2\xb7\x45\xa0\xaa\x15\x6f\x2d\xf0\x7f\x05\x59\
+\x07\x53\xb6\x97\xaa\x05\x8d\xed\x8b\x05\xfa\xfe\x06\x70\x77\x62\
+\x0a\x02\xba\x37\x2f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x05\x77\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\x3e\x49\x44\x41\x54\x78\xda\x9d\x96\x0b\x70\x4c\x57\
+\x18\xc7\x7f\x77\x37\x9b\xc7\x46\x04\x09\xa2\x1e\xed\x34\x74\x4a\
+\x55\x51\x74\xea\x35\x43\xc5\x63\x8a\xd2\xa0\x4a\xe9\x50\x94\xd4\
+\x60\x3c\x5a\x8f\xd0\xd1\xd6\xab\x5a\xc3\x44\xa3\xb4\xd5\xc4\xbb\
+\xad\x57\x8d\x21\x33\xe2\x51\x91\x10\x45\xb4\x43\x5e\xe2\xb5\x79\
+\x49\xd8\x20\x9b\xdd\xbd\xd9\xdd\x7b\x4f\xcf\xae\x30\xd2\x4d\xb5\
+\xfa\x9d\xb9\x73\xce\xb9\xf7\x9c\xef\x77\xbf\xff\xf9\xce\xb9\x57\
+\xe1\x31\xfb\x6a\xef\x09\x21\x74\x05\x8f\xa6\x23\x84\x00\x45\xc1\
+\x80\xb7\x92\xb5\x02\xf7\x9c\x3a\x46\x79\xe3\x7e\xb5\x13\xeb\xbd\
+\x4a\xae\x15\xdb\xc8\x58\x33\x45\xe1\x09\xa6\xfc\x1d\x30\xb2\x47\
+\x07\x5f\xdb\x64\x32\xe2\xb0\xbb\xa9\x54\x1d\x54\xa9\x1e\xec\xd5\
+\x6e\x2a\xec\x76\xee\xda\x34\x9c\xaa\x8b\x82\x5b\xa5\xe4\x97\x5a\
+\xa9\x76\x2a\x4f\x84\xd4\x7a\xb0\xea\x97\x63\x62\x74\xef\x8e\xb4\
+\x6a\xd2\xd0\xd7\x17\xb2\x38\x1c\x2e\x6c\xaa\x46\xa5\xd3\x49\xa5\
+\xad\x8a\x32\xbb\x0b\xb7\xec\xe7\x94\xdd\xe1\xc8\x85\x6c\xba\xbf\
+\x10\x4d\x46\xbe\x85\xe3\xcb\x26\x2a\x4f\x05\xd0\xdc\x6e\x9c\x78\
+\x24\xc0\x28\xdf\xd8\x8d\xea\xaa\x42\x95\x51\x58\x65\x54\x6e\x5d\
+\x27\xa7\xa8\x82\x5c\x8b\x85\x31\x3d\xdb\xb3\x37\xf3\x2a\x7f\x5a\
+\xca\xea\x84\xd4\xba\xb1\x7c\xd7\x31\x31\xb6\x4f\x0d\x40\xd3\x64\
+\x08\x3a\x2e\x8c\xa8\xaa\x8a\xd3\xee\xc0\xe6\xd4\xa4\x5c\x02\x97\
+\xe6\x26\xb7\xe8\x0e\x99\x05\xd7\x58\x3c\xa6\x3f\x9a\xcb\xc3\xaa\
+\xfd\x19\xe4\x14\x96\xfb\x41\x6a\x75\xbe\xd8\x9e\x2a\xc6\xf5\xeb\
+\x4c\xfe\x4d\x07\x4b\x36\x65\x48\x80\xe2\x5b\x68\x5d\x68\xe8\x1e\
+\x79\x49\xa8\xd0\x85\x6f\xec\x3d\x6b\x31\xa3\xc6\x74\x63\xc5\xf8\
+\xbe\x14\xdf\xb5\x91\x77\xa3\x9c\xc3\x59\x05\x9c\xbf\x56\x52\x0b\
+\x52\x0b\xf0\xd9\x8e\x54\xf1\xfe\x1b\x9d\x6b\x22\x50\xd1\x75\xa3\
+\xd7\xbf\x8f\xe3\x94\x99\x65\x97\x8b\xed\x71\x69\x18\x24\x30\xa7\
+\xd0\xca\xd1\x4b\x16\x1f\xe0\x7e\x65\x15\x55\x9a\xc0\x52\x7c\x8b\
+\xbd\x67\xaf\x71\xe8\xf7\x5c\xb2\xbf\x9d\xa5\xf8\x01\x16\x6f\x3b\
+\x22\x26\xc5\xbc\x5a\x03\x70\x49\xc0\x83\xc7\xaa\xc3\x41\x66\xe6\
+\x25\x8e\xa7\xe5\x12\xa0\x18\x71\x09\x0f\x0d\xcc\x41\x98\x9a\x47\
+\x10\xdc\xa8\x01\x36\x9b\xa0\x4a\xb8\x7c\x63\xcf\x5d\x29\xe1\x7a\
+\x71\x39\x79\xdf\xcd\xf6\x07\xcc\xdb\x9c\x22\xa6\xbf\xd9\xad\x46\
+\xa2\x33\xf2\xd5\x05\x11\x26\x95\x96\x66\x17\xb7\xcd\xad\x09\x6d\
+\x1c\x45\xb3\x96\x91\x98\xc3\x42\x08\xf0\xd8\xb0\x66\x65\x61\xc9\
+\x3a\x4d\xbe\xd2\x12\x77\x75\x35\xeb\x96\xf4\xe7\xd2\xcd\x12\xd6\
+\x1d\x3c\xcb\x8d\xcd\xf3\xfc\x01\x33\xd6\xff\x2a\xe6\x8c\xec\xe5\
+\x8b\xc0\x23\xf5\xbe\x5f\xe5\x60\xe1\xa2\xed\xb8\xda\xf4\xa3\x6d\
+\xbb\x70\x5a\x34\x0d\x20\xcc\xa4\x51\x58\x68\x47\x09\x0c\xa2\x79\
+\xfb\x28\xce\xef\x3f\x83\x7e\xf5\x0c\x7d\x46\x0e\x21\xbc\x7e\x10\
+\x99\x57\x8a\x58\xb9\x2b\x8d\xc2\x2d\x1f\xfb\x03\x26\xaf\xd9\x2e\
+\xe2\xc7\x0e\x7a\x20\x91\x2c\x47\x8f\x64\xf2\xc3\x49\x9d\x2e\xbd\
+\xdb\xf2\xca\x4b\x66\xa2\xa3\x42\xb8\x7a\xa3\x92\xc0\x00\x23\xa5\
+\xa5\x76\x82\xcd\x01\xb4\x7c\xb9\x11\x1b\xe2\xd6\x32\x2c\xb6\x07\
+\x1d\xda\xb5\x21\x3d\xcf\x22\x95\x38\x4c\xc9\xd6\xf9\xfe\x80\x77\
+\x97\x27\x89\x95\x1f\x0c\xf5\x49\x14\xbf\xf1\x34\xad\xd5\xcb\xd4\
+\xeb\x3d\x89\x1e\x9d\x82\xe8\xd5\x35\x92\xe7\xe4\x98\xb4\x02\x1b\
+\xee\x40\x85\xb0\xf0\x20\x3c\xd5\x82\xa8\x26\x81\x64\x9e\xce\x66\
+\xc5\xd2\x3d\xa4\xee\x9c\xc3\xb9\x82\x62\x26\xac\xdb\x43\xd9\xf6\
+\x05\xfe\x80\xa1\x8b\xbf\x17\x09\xd3\xdf\xf6\x45\x60\xb5\xab\xcc\
+\xfe\x28\x81\xe8\x51\xd3\x78\xbe\xa9\x9d\xa8\x86\x21\x34\x0a\x0c\
+\xc0\x22\x37\x5a\xcf\xe8\x70\xca\x1d\x32\x65\xd1\x89\xac\x6f\x22\
+\x3f\xbf\x88\x0b\xa9\x67\x98\x19\x37\x82\xf4\x4b\x85\x0c\x5f\xbe\
+\x95\xdb\x3b\x17\xf9\x03\xfa\x2c\xda\x2c\x92\x66\x0c\xf3\x01\x2a\
+\xa4\xfe\x53\x26\xae\xe0\xf5\x59\x9f\xd3\x58\x14\x61\x0a\x0a\xa2\
+\x5e\x3d\x13\x5d\xa3\x1b\xa0\xba\x65\xba\xea\x10\x6c\x30\xd0\xcc\
+\x6c\xe0\x72\xee\x0d\x52\x53\xce\x32\x7b\xd6\x28\x2e\x16\x94\xd0\
+\x2f\xfe\x47\xac\x3f\xc5\xff\x33\xe0\x54\x96\x95\xc4\x3d\x7f\x60\
+\x28\x38\xc1\xe0\x45\xab\x09\xd5\xac\x84\xd5\x33\xd0\xb6\x4d\x04\
+\x41\x21\x46\x4c\x32\xbb\x1a\x4b\xc7\xa1\xc2\x40\x48\x00\x9c\x48\
+\xbb\xc0\xb4\x65\xe9\x9c\xdb\x37\x4d\x1e\x21\xb7\x18\x10\x9f\x4c\
+\xc5\xcf\x75\x00\xba\xcf\xde\x24\x76\x7e\x32\xe2\x51\x04\x69\xa9\
+\x19\xf2\x9c\xb1\xf1\xce\xdc\xe1\x14\x5f\xb8\xc9\xb3\x12\xf0\x4c\
+\x64\x30\x66\x09\x08\x0f\x0e\x90\x29\xfc\x60\xfa\xa0\xf7\x92\xd8\
+\x96\x30\x8a\x88\x86\x66\xce\x4a\xb9\x06\x2e\x4e\xe6\xee\x7f\x01\
+\x48\x91\x19\x17\x3b\x83\x2e\x13\xe7\x32\x6c\xf4\x8b\xa8\x76\x88\
+\x08\x85\xfa\x72\x6c\x54\xcd\x9c\x11\x13\x36\x61\x0a\x0c\x65\x43\
+\xa7\x78\x1a\x4c\xbd\xfe\x64\x40\xbb\xa9\x6b\xc5\xe1\xa5\xe3\x1f\
+\x49\xf4\xd0\x8a\x8e\x6d\xa1\xf7\xe0\xc1\xc4\xce\x1c\x4a\x54\x8b\
+\x26\x98\xe5\xe9\xea\xc8\xce\x63\xfe\x8a\xdd\xb4\x8a\x8c\x20\x79\
+\x70\x2a\xee\xec\x14\x2e\x96\x4b\x77\x71\x57\x19\xf0\x6f\x80\xc7\
+\x23\x78\x68\xe9\x27\x33\x49\x39\x74\x8a\xd2\x32\x2b\x2e\xb5\x9a\
+\xb7\x62\x63\x18\x32\x62\x00\x39\x6b\x86\xd1\x67\x60\x24\xbc\xb6\
+\x1e\x56\x47\x91\x92\x25\x18\xa3\x2d\xfd\x6f\x00\x45\xe0\x67\xde\
+\x09\xba\xcc\x1e\x79\xb6\xca\x86\x1b\xa3\x6e\xe0\x7c\x5c\x7d\x62\
+\x92\x0e\xc8\xcf\x60\x34\x7c\xdd\x91\x1d\x27\x35\xc6\x1e\xd0\xfd\
+\x01\x91\xb1\x9f\x8a\xf3\x89\x33\x7d\x1b\x6d\xe1\x37\xbf\x51\x87\
+\x7f\x9f\xe9\x9a\x07\xaf\x7f\xdf\x51\x2b\x2f\x6f\xf9\xd0\x32\x91\
+\xc9\xc7\x25\xc4\xd0\x04\xbe\xec\xcc\xc6\x14\xd4\xa9\xc7\x09\xa9\
+\x13\xf0\xf0\x93\xf9\xb4\x96\xd8\xc3\x48\x5c\xfa\x11\xd9\x92\x90\
+\xe4\x18\x36\xee\xbc\x55\x55\x0b\x10\x36\x74\xa1\xc8\x49\x9a\xff\
+\xbf\x9c\x3f\xb4\x2d\x7d\x23\x59\x90\x95\xce\x95\x83\xc9\x6c\x99\
+\xbf\x7e\x9f\x1f\xc0\x5b\xbb\x85\xf7\x67\x45\x3c\x95\x63\xef\x6f\
+\x8e\x22\x77\xb8\xd7\x66\x55\x24\x50\x79\xcf\xb9\x3b\xf1\x0a\x23\
+\xff\x02\xd5\xb2\xab\x5e\x6a\x85\x0d\x6c\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xe1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x05\xa8\x49\x44\x41\x54\x78\xda\x85\x56\x7b\x4c\x53\x67\
+\x14\xff\xdd\x47\x5b\x68\x0b\xa5\x94\x87\x54\x14\x98\xc8\xe6\x40\
+\x1e\x22\x73\x80\x0a\x66\xd9\x7c\x6c\x73\xfe\xb1\x21\x5b\x66\x84\
+\x85\x2c\x0a\x71\x89\x8b\xc9\x5c\xf6\x8a\x9b\xdb\xc2\x96\x3d\x12\
+\xc3\x23\x8e\xcc\x57\xdc\x90\x2d\x99\x43\xe6\x63\x51\x03\xb3\x80\
+\xc2\x08\xa0\x12\x03\x32\x3a\xb7\x82\xda\x52\xda\x0a\xf4\x71\x6f\
+\xef\xbd\xfb\x7a\xa1\x2a\x32\xf4\x24\xfd\xda\x9c\xef\xde\xf3\xfb\
+\xce\xef\xfc\xce\xf9\x4a\xe1\x21\xa6\x5f\x5f\x57\x20\x08\x52\xb1\
+\x28\x0a\x6b\x45\x41\x4a\x52\x45\xa8\x65\xbf\xcf\xe9\x06\xcd\x50\
+\x66\x9a\x66\xce\x30\x0c\x55\xef\x38\x55\xd6\x32\x57\x0c\xea\xff\
+\x9c\x91\x2f\x1e\xcc\xe0\x7d\x7c\xa7\x36\x56\xaf\x48\x4a\x35\x22\
+\x31\xc9\x80\xc8\x88\x50\x84\x84\xb2\xf2\xbe\xd7\xe3\xc7\x98\xd3\
+\x83\xbf\xcd\x76\x98\xfb\x46\x30\x71\xdb\xc1\x2b\x54\x8a\x9c\xb1\
+\x13\x25\xbd\x8f\x04\x30\x6c\x3c\x50\x45\xd1\x6c\xf9\xd3\x1b\xd2\
+\xb1\x38\xd9\x80\x50\x35\x0b\x4a\xa2\x20\x8a\xd2\x8c\xe7\x68\x9a\
+\x82\x44\x49\xf0\xb8\xfd\xb8\x3e\x68\xc7\xc5\x93\x97\x21\x89\xfe\
+\x6a\x7b\x63\x69\xc5\x9c\x00\x86\x8d\x47\x8e\x85\x19\xf5\x45\x1b\
+\x5e\x48\x45\x74\x8c\x1a\x12\x09\x0c\x12\x97\xa2\xa6\x1e\xa4\xa6\
+\x9f\x96\x24\xd9\x2d\x7f\x07\x36\x28\x02\x64\xb3\xba\x71\xb2\xa9\
+\x0f\xe3\x23\x8e\x06\x7b\xe3\x96\xcd\xb3\x00\x62\x5e\xa9\xaf\xd2\
+\x46\x69\xcb\x8b\x5f\xcd\x82\x4e\xab\x04\xe1\x1c\x1c\xf9\xdc\xe1\
+\x24\x58\xc6\x79\x4c\x0a\x22\x24\xff\xf4\xe9\x09\x53\x61\x2c\x8d\
+\x28\x0d\x03\xbd\x92\x45\x80\x39\x8a\xa1\xe0\x9a\xe0\x50\xff\x63\
+\x37\x26\x46\x27\xaa\xad\x3f\x15\x57\xdc\x05\x88\xdf\xf2\x73\x06\
+\xef\x17\x7b\x4a\xcb\x72\x61\x8c\xd2\xc0\xcd\xf9\x61\x76\x05\xa2\
+\xb1\x88\x51\x33\xb8\x35\xe9\xc7\x38\xc7\x11\x4a\x28\xf9\x05\x99\
+\x2c\xb2\x10\x48\xf8\x45\x20\x96\xd0\x98\x18\xce\x40\x4d\xc0\x46\
+\x46\x27\x71\xa0\xae\x1d\x0a\x96\xce\xb4\x1c\x79\xb9\x57\x06\x88\
+\x29\x6a\xe0\xd6\x6f\x5a\xaa\xc8\xcf\x8c\x83\xc5\xe5\xc3\x0d\xa7\
+\x1f\x12\x0d\x28\xc9\xf2\xf5\xaa\x28\x0c\x38\x39\x1c\xed\xbf\x03\
+\x17\xc9\x46\x20\x7e\xfa\x81\xba\xc9\xe5\x21\x4b\x42\x04\x8b\x78\
+\x9d\x0a\xad\x3d\x37\x71\xea\xf8\x15\xde\xda\x50\xa4\xa4\x16\x94\
+\x34\x16\x28\x34\xca\xe6\xf7\xb7\xaf\xc0\x80\x83\xc3\x98\x57\x9a\
+\x0a\x40\xa0\x39\xaf\x1f\x5f\x16\x46\x23\x52\xa3\x94\x4f\x7c\xbc\
+\xdf\x81\x5f\x07\x26\xa1\x0a\xa5\x89\x4c\x49\xf1\x89\x33\x58\x7a\
+\x49\x0c\x64\x44\x14\x18\x42\x21\x45\xaf\xc4\xde\x9a\x4b\xe0\x27\
+\xb9\x42\x2a\xbe\xb4\xb1\x26\x7f\x55\xd2\xb6\xbc\xec\xf9\x18\x74\
+\xf0\x60\xa6\x5f\xa1\x08\x1d\x0e\x97\x17\x5f\xac\x99\x87\x68\x52\
+\x93\xa0\xb9\xdc\x3c\xf6\x75\xd8\x30\xe4\xe2\xa1\x09\x53\x42\xa1\
+\x60\xe4\x6a\x4b\xd3\x48\x02\x81\x4d\xd6\x2b\xd0\xd6\x35\x8c\xd6\
+\x0b\xe6\x5a\xca\x58\xd2\x34\xb4\xed\x8d\xac\xa4\x09\x28\xe4\x13\
+\x05\x0b\x43\x1a\x08\xb7\x6d\xe3\xd8\xbb\xc6\x88\xd8\xf0\x90\x59\
+\xbd\x32\x68\x9b\xc4\xee\xd3\xc3\x30\xe8\x94\xd0\x47\x6a\xe4\xac\
+\x25\x69\x2a\x23\x89\x44\xd0\x82\x47\xed\xf7\xdd\x66\x2a\xae\xe4\
+\x84\x54\x5e\x91\x0f\x1f\x27\x4c\x29\x64\x4a\x99\x18\xf6\x02\xe7\
+\x4d\x16\xb4\x54\xa4\x60\x61\xa4\x7a\xce\x6e\x3f\xda\x75\x0b\x95\
+\x67\x47\xb0\x3a\x2d\x0a\x7a\x83\x86\xf4\xcc\x14\x90\x4a\xc9\xa0\
+\xba\xaa\x15\xd4\xa2\xb7\xcf\x49\x6f\x6e\xcd\x86\xcf\xe7\x07\x39\
+\x34\x1c\x5e\x11\xd7\x46\xc9\x6f\x96\x42\x4f\x87\x05\xa6\xb7\x96\
+\x60\x01\x51\xd6\xc3\x4d\xc4\xce\x5f\xcc\xb8\x6e\xf5\x20\x6f\x99\
+\x91\xd0\x44\x00\x54\x2c\xf6\x1f\xea\x02\xf5\xc4\xee\x56\x69\xfb\
+\xeb\xe9\x10\x7c\x02\xfa\x9c\x3c\xc6\xdc\x22\x18\x92\x2f\x4b\xb8\
+\x6d\x3d\x3f\x08\xd3\xae\x34\x2c\x34\x3c\x0a\x00\xd8\xfc\x5d\x2f\
+\xda\xfa\x9c\x58\xb7\x29\x15\x4f\x86\x2b\xc0\xa8\x18\x54\x1d\xee\
+\x01\x95\xb0\xeb\x82\xf4\x41\x59\x36\xba\x6f\xbb\x61\xf7\x88\x60\
+\xa7\x35\xc8\x92\x14\xcf\x36\x5d\x85\xe9\x9d\x65\x48\x88\xd2\xce\
+\x19\xb8\xf2\xf7\x41\x7c\x7c\xa8\x1f\x69\x2b\x12\x91\x9a\x61\x84\
+\x8f\x28\x4f\x4f\x54\x96\x15\xab\xc6\x27\x75\x24\x83\x94\xdd\x6d\
+\x43\xeb\x9f\x7f\x3c\xc9\x15\x90\xe7\x7d\x02\x57\x10\x80\xc6\x86\
+\x6e\xb4\xbd\xb7\x1c\x89\xb1\x61\xb3\x02\xb7\x0e\x8c\x62\xdd\x1e\
+\x13\xe6\x27\x1b\x91\xbf\x26\x99\xa8\x8f\xcc\xab\x40\xb7\x13\x9a\
+\x45\xa2\x57\x1d\x91\xeb\xa9\xdf\xfa\xcd\x54\xea\x47\x9d\x35\x29\
+\x19\xf3\xb6\xc5\xc5\x68\x67\x0c\x34\x25\xe1\xb0\xe1\x60\x07\xda\
+\x3f\xcc\x41\xe2\xbc\xf0\xbb\x7e\xcb\xd8\x04\x9e\xfd\xf4\x22\x9c\
+\x1e\x09\xf9\xcf\x2d\xc1\xfc\x38\x1d\x78\x5e\x90\x0b\x1b\xb4\xc0\
+\x20\xbc\x69\x9d\xc0\x40\xef\xad\x5a\x2a\xe3\xb3\xee\x02\x4d\x44\
+\x48\x73\x6e\x4e\x3c\x38\x5e\xb8\x07\x10\xa2\xc0\xe1\xda\x16\x74\
+\xec\x59\x49\x00\xc2\x64\xf1\xbd\xf4\x55\x3b\x4e\x9b\x86\xb1\x7a\
+\xd3\x32\x64\xa6\x1b\x49\x60\x5e\x9e\x59\x0f\x9a\x92\xd4\xaf\xbd\
+\xd3\x82\x49\xa7\xb7\x50\x1e\x15\xe9\x9f\xf7\x70\x2b\x72\xe3\x15\
+\xf2\x90\x9b\xce\x42\x45\x00\xf6\x7f\xdb\x8c\x3f\x2b\xf3\xd0\xd4\
+\x63\xc5\x8e\x4a\x13\x96\xaf\xcb\x42\x41\x61\xb2\x7c\x42\x51\x10\
+\x20\xcd\x8e\x2d\xef\x05\x86\xde\xa5\x76\x0b\x7f\xf9\xdd\x4c\xa5\
+\x0c\x90\xfd\xcd\xd5\x0c\x46\xc9\xf4\x3c\x93\x17\x2f\xf7\xbb\xac\
+\x63\x42\xd1\x81\xda\x3f\x60\x1d\xf8\x17\x11\x8b\x17\x60\x73\x69\
+\x2e\x74\xc4\xc7\xf3\xe2\x0c\x3a\xee\xb7\x40\xf7\x07\x3a\xee\x5c\
+\x9b\x05\x02\x27\x64\x76\xed\x4c\xeb\xbd\x3b\xae\x73\xf6\x5d\xab\
+\x8a\x88\x0e\x2d\x2f\x58\x1a\x03\x9f\x4c\x15\x05\x81\x04\xb2\x39\
+\x3c\x48\x30\xea\xc0\xf9\xf8\x59\x97\xce\xcc\xe0\x24\x6b\x42\x4d\
+\xcb\x15\x2b\x9c\x36\x4f\x75\xe7\x8e\x25\xf7\xc6\x75\xd0\x9e\xaa\
+\x19\x38\x66\x30\x84\x16\xe5\xa7\x1a\xc8\xf0\x92\xe4\xe1\x35\x35\
+\x9e\x25\xcc\x71\x68\x79\x9f\x0e\x8c\x71\x42\x4d\x6b\x9f\x1d\x76\
+\xbb\xa7\xa1\x63\x7b\xca\xec\x0b\x27\x68\xb9\x75\x43\x55\x8c\x12\
+\xe5\xb9\x69\xd1\x88\x26\x73\xde\x1f\x00\x92\x66\x03\xc8\x6c\x90\
+\x85\x25\x81\x6d\xe4\xda\x6c\xbf\x6a\x23\xb4\xa0\xba\xbd\xec\xb1\
+\xb9\xaf\xcc\xa0\xad\x3c\x74\x23\xc3\x2f\x8a\x9d\x7a\x9d\x4a\xb1\
+\xc8\xa8\x46\x8c\x96\x85\x9a\x74\x66\x90\xfb\x00\xd7\x6e\xd2\xf9\
+\xd6\x09\x3f\xfe\x1a\x71\x93\xa9\xeb\xe3\x59\x9a\xce\x31\x6d\x4d\
+\x78\xf4\xa5\x7f\xbf\x15\xfe\xf0\x4f\x81\x28\x52\xc5\x02\x4d\xad\
+\x25\x94\x25\x85\x84\x30\xb2\xdf\xeb\x15\x02\x94\x98\x19\x51\x3a\
+\x43\xd3\x52\x7d\xf3\x6b\x0b\xe7\xfc\xdb\xf2\x1f\xf9\xfb\x63\xb7\
+\x6a\x50\xe2\x8e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x04\xc6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x04\x8d\x49\x44\x41\x54\x78\xda\xd5\x95\x7d\x4c\xd5\x55\
+\x18\xc7\xbf\xe7\xf7\xfb\x5d\x0c\x25\x08\x94\x41\xcb\x50\x13\x41\
+\x0c\xbd\x6d\x6e\x88\x01\x35\x10\x1b\x35\xa8\xdc\xb2\x90\xdc\xaa\
+\xa5\x69\x5b\xb3\x15\xae\x14\x4b\xcb\x66\x6f\xc3\xb5\xfe\x68\x8b\
+\xb4\x25\xad\x91\xd8\x1a\x26\x20\x08\x32\x26\x24\xf1\x22\x2f\x97\
+\x77\xf0\x5e\xde\xe2\x3d\xef\xbd\xdc\x7b\x41\x5e\xee\xbd\xbf\xd3\
+\xf3\x3b\x17\x68\x4b\xff\x24\xb7\x7e\xdb\xd9\x7e\x3b\xcf\x79\x9e\
+\xcf\xf3\x7c\xcf\x73\xce\x61\xf8\x8f\x3f\x76\x4f\x00\x7b\xaf\x8e\
+\x1d\xf1\x56\xd8\x67\x4b\x19\x75\xd6\xc5\x4b\x7f\xdc\x11\xf4\x14\
+\x4b\x2d\x1a\xce\x7c\x55\x1f\x90\xde\x33\xe5\x5e\xd2\x72\x74\x12\
+\x43\x7e\x9b\xb5\x90\xed\x2d\x18\xe2\xfa\x47\x7c\x31\x31\xa3\x82\
+\xe6\x20\x2b\x12\x9c\x2e\x15\x8c\xdf\x99\x15\xa3\xa1\xaa\x77\xd1\
+\x95\x26\x24\x32\xba\x55\xbe\x68\x93\x29\x58\x53\xaf\x0d\xec\xa5\
+\xbc\x01\xae\x5f\xef\x07\xf3\x2c\x51\xbd\x14\x9c\xfe\xea\x1a\xbe\
+\x39\x9e\x80\x4e\xab\x93\x20\xe4\xa0\xba\x85\x83\x44\x0e\xc6\x3e\
+\x0b\x12\x23\x57\xc1\x68\x73\x8b\x64\x16\x3e\x59\x66\xa8\xad\x1b\
+\xc4\xee\xf8\x35\x30\x4e\xb8\x84\x4d\x5b\xdf\x6a\x9a\x00\x7b\xe1\
+\x42\x2f\xdf\x14\x1a\x00\x53\x43\x0b\xfc\x5d\x36\x58\x2c\x0e\x78\
+\x49\x5a\x52\x1c\xfe\xfe\xbe\x98\xdd\x1c\x23\x20\x3a\x9d\x8c\xef\
+\xb2\xae\xe3\xf4\x91\x78\x18\xc6\x6e\x43\x66\xff\x10\x14\x9d\x82\
+\x33\x59\xbf\x23\xf3\x68\x3c\x9a\x47\xa7\xc9\xe6\x01\x74\xf6\x58\
+\xc1\x76\xe5\x18\x79\x68\xd8\x4a\x0c\x34\xb6\xe1\xfc\xbe\x18\x5a\
+\xce\x17\xeb\x4e\xfd\xbe\x0a\x3e\x61\xe1\x42\x17\x0d\xf0\x73\x76\
+\x2d\x4e\x1d\x8e\xc3\x8d\xc1\x29\x21\x81\xc8\xde\x35\x27\x00\xd9\
+\xd9\xf5\xf8\x34\x23\x01\x6d\xa6\x71\xc8\x34\xef\x5a\xbe\x02\xbd\
+\xdd\x16\xb0\x94\xec\x2e\xbe\x36\x2c\x10\x37\x6b\x1a\x70\x2e\x6d\
+\x0b\xa6\x9d\xaa\x60\x78\xeb\x24\xbc\x96\xdb\x86\x80\xc8\x48\xc0\
+\xed\xa6\x20\x32\x7e\xcb\xb9\x81\x53\xe9\xb1\xa8\xe8\x9b\x84\x42\
+\x00\x46\x63\xb4\x6f\x0c\x63\x66\x07\x7a\x3a\x27\xf0\xc3\x2e\x1d\
+\x4e\xb6\xaf\x40\x50\xa0\x1f\x1e\x0e\x26\xc0\x9f\x33\x60\x49\x67\
+\x3a\x78\x48\x78\x20\x8c\xf5\xcd\x88\xe0\xfd\x98\xb4\x4f\xc2\xc7\
+\xd7\x87\x02\x48\x22\xc3\x9b\xeb\x93\xe0\x2d\xab\x02\x70\xe5\x97\
+\x7a\x9c\x7c\x27\x16\x65\x26\x87\x00\x50\x47\x60\xb6\xaa\x08\xf9\
+\xc7\x77\x63\x7a\xc6\xb3\x57\xde\xf7\x29\x38\xf0\xc5\x39\x98\x43\
+\x13\x30\x32\x4e\xfb\xb8\xf3\xdb\x66\x1e\x1c\x1a\x04\xcb\x6d\x15\
+\xb2\x4e\x87\xf2\xbc\x06\x7c\xfc\x6e\x1c\x8a\xbb\xed\xb4\x17\x5a\
+\xdb\xb8\xa8\x22\x2e\xba\xab\xe2\x92\x01\x1f\x1e\x8a\x41\x49\xb7\
+\x6d\x11\x60\x2e\xfb\x15\x45\x27\xd2\xa8\x72\x37\x2d\x53\xb1\x8c\
+\x62\x64\x64\xe5\xa2\xff\xc1\x58\x4c\x98\x09\x90\xf0\x75\x23\x5f\
+\x15\x1e\x04\xb3\x43\x93\x41\x42\x5d\x51\x0b\x8e\xbe\xb5\x1d\x85\
+\x1d\xf3\x41\x16\x3a\x45\xb9\x8b\x8d\x49\x98\x1b\x1a\x04\x1f\x68\
+\x84\xa9\x7f\x12\x11\x9b\xd7\x62\xda\x3a\x0e\x69\xdd\x56\x78\x87\
+\x84\xc0\xda\x35\x0c\xf6\x64\x66\x1d\x7f\x60\xe3\x43\xb0\x38\x9c\
+\x54\x81\x84\x96\xab\x6d\x48\x3f\xb8\x0d\x05\x6d\x14\x44\xf6\x00\
+\x54\x0a\xa4\x49\xd4\x5c\xda\x82\xc3\x07\xa3\x51\xd0\x61\xf7\xb4\
+\x22\x57\x05\x44\xf2\xd2\xa1\xfd\x42\x25\x3e\xf8\xe8\x19\x9c\x6f\
+\xb2\x42\xa1\x4d\xd4\x9a\xcc\xd6\x39\x04\x16\xf3\x79\x35\xbf\x3f\
+\x62\x35\xcc\x76\xa7\xc8\xd2\x78\xad\x03\xfb\xf6\x3f\x81\x92\xd6\
+\x11\x02\x48\x22\x78\xb8\xa5\x13\x95\x7d\x36\x4c\x8d\xc9\x48\x7a\
+\x25\x06\xe5\xf9\xe5\x48\xd8\xe0\x8f\xce\x80\x08\x01\x91\x14\x19\
+\xa6\x8b\x55\x38\x94\xf1\x1c\xf2\x1a\x87\x85\x9f\x96\xc1\x74\x07\
+\x01\xa2\x3f\xa9\xe2\xcb\x36\xad\x86\x95\x00\x12\x01\x86\xaa\xba\
+\xb0\x9f\x00\x17\x1b\x87\xa0\xd3\x00\x92\x02\xbb\xa1\x06\x7d\x5f\
+\xa6\xc0\x3d\xe7\xa4\x86\x52\xe1\xe5\xad\xc3\xda\xf7\x0a\xe1\xa7\
+\x8f\x12\x67\x84\x11\x60\xa8\xe0\x0f\xbc\x7d\xec\x79\xe4\xd4\x0e\
+\x0a\x3f\x3a\x08\x98\x6b\x1f\x00\x8b\x3a\x51\xc1\xe5\x47\xd7\xc0\
+\x6a\xf3\x00\x6e\xd5\x75\x23\x79\xcf\x76\x54\xb6\x8f\x0b\x89\x34\
+\xc0\xf2\xa6\xcb\x38\x7b\x20\x11\x33\xce\xf9\x4e\x21\x29\x5f\xcf\
+\x2a\xc3\xf4\x63\x4f\x2f\x02\xfe\xba\x5c\x8d\xd4\xf4\x64\x14\x37\
+\x8d\x7a\xa4\x25\x00\x6f\xef\x03\xdb\x7a\xac\x9c\xb3\xc8\x75\x98\
+\xb0\xcf\x8a\x85\xf6\x7a\x23\x52\xd2\x1e\x47\x59\x8b\xa7\x54\x4e\
+\x62\xca\x56\x0b\xd4\x5b\x03\x42\x2e\x95\x2a\x90\xe9\xa2\x52\x02\
+\x43\xe0\xf2\x5f\xe9\xb9\x4e\xc8\xcf\x52\x5c\x8b\x3d\xe9\x29\x28\
+\x68\x18\x9c\x97\x88\x46\x2b\x01\xf4\xef\x97\x71\x08\x00\xb5\x14\
+\x91\x67\x0c\x3d\xd8\x96\xbc\x05\x0d\xbd\x76\x71\x5a\xc5\xb9\xd6\
+\x76\x4c\x92\x31\x6b\x30\x21\xfa\x59\x3d\x1a\x7b\x6c\xf3\xbd\x35\
+\x7f\xb9\x51\xc0\xa9\xd2\x5a\xec\x78\x23\x11\xd7\xbb\xad\x9e\x53\
+\x4e\x00\xa9\xd5\x04\x16\x99\x7e\x85\xab\xfa\x50\x38\x48\x22\x2d\
+\x0e\x27\xa3\x6e\x66\x0e\x4e\xea\x8c\x3b\x6f\x4d\x92\x8c\xae\x0d\
+\x26\x7e\xff\x65\x95\x3c\xd5\xb1\xf9\x7c\x34\x28\x33\x74\x81\x6d\
+\x78\xf3\x52\x8d\x12\xa7\x8f\xb2\x59\xe6\xb0\xe0\xc3\xb1\x04\x4f\
+\x9d\x06\xa8\x36\x74\x8b\x38\xc1\x2f\xe7\x96\xd0\x0e\xef\x5c\xd2\
+\xf7\x93\xbb\xbb\x46\x7e\x7a\x71\xe3\xbd\x79\x93\xff\xd7\x80\xbf\
+\x01\x7a\x9b\xe8\xd4\xce\x6c\xfa\x4a\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x05\
+\x00\x35\xbb\x54\
+\x00\x32\
+\x00\x34\x00\x78\x00\x32\x00\x34\
+\x00\x06\
+\x03\x8a\x57\x47\
+\x00\x35\
+\x00\x37\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xc6\x57\x47\
+\x00\x39\
+\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x4c\x57\x47\
+\x00\x31\
+\x00\x39\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xb7\x57\x47\
+\x00\x38\
+\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xb6\x57\x47\
+\x00\x38\
+\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x77\x57\x47\
+\x00\x34\
+\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xab\x57\x47\
+\x00\x37\
+\x00\x38\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x66\x57\x47\
+\x00\x33\
+\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x76\x57\x47\
+\x00\x34\
+\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x48\x57\x47\
+\x00\x31\
+\x00\x35\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x96\x57\x47\
+\x00\x36\
+\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xa7\x57\x47\
+\x00\x37\
+\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xb4\x57\x47\
+\x00\x38\
+\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x05\
+\x00\x35\x57\x47\
+\x00\x32\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x05\
+\x00\x34\x57\x47\
+\x00\x31\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x79\x57\x47\
+\x00\x34\
+\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x93\x57\x47\
+\x00\x36\
+\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x54\x57\x47\
+\x00\x32\
+\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xb8\x57\x47\
+\x00\x38\
+\x00\x35\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x73\x57\x47\
+\x00\x34\
+\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x05\
+\x00\x3b\x57\x47\
+\x00\x38\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x89\x57\x47\
+\x00\x35\
+\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xbc\x57\x47\
+\x00\x38\
+\x00\x39\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x6a\x57\x47\
+\x00\x33\
+\x00\x37\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xa5\x57\x47\
+\x00\x37\
+\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xc7\x57\x47\
+\x00\x39\
+\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x59\x57\x47\
+\x00\x32\
+\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xc9\x57\x47\
+\x00\x39\
+\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x85\x57\x47\
+\x00\x35\
+\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x97\x57\x47\
+\x00\x36\
+\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xb5\x57\x47\
+\x00\x38\
+\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x07\x84\x57\x27\
+\x00\x34\
+\x00\x32\x00\x61\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x74\x57\x47\
+\x00\x34\
+\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xb9\x57\x47\
+\x00\x38\
+\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x63\x57\x47\
+\x00\x33\
+\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x47\x57\x47\
+\x00\x31\
+\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x58\x57\x47\
+\x00\x32\
+\x00\x35\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x56\x57\x47\
+\x00\x32\
+\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x43\x57\x47\
+\x00\x31\
+\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xba\x57\x47\
+\x00\x38\
+\x00\x37\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x94\x57\x47\
+\x00\x36\
+\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x65\x57\x47\
+\x00\x33\
+\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x78\x57\x47\
+\x00\x34\
+\x00\x35\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x95\x57\x47\
+\x00\x36\
+\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x45\x57\x47\
+\x00\x31\
+\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x05\
+\x00\x3c\x57\x47\
+\x00\x39\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xc4\x57\x47\
+\x00\x39\
+\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x6b\x57\x47\
+\x00\x33\
+\x00\x38\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x99\x57\x47\
+\x00\x36\
+\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x4b\x57\x47\
+\x00\x31\
+\x00\x38\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x84\x57\x47\
+\x00\x35\
+\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xa4\x57\x47\
+\x00\x37\
+\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xa6\x57\x47\
+\x00\x37\
+\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x5a\x57\x47\
+\x00\x32\
+\x00\x37\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xa9\x57\x47\
+\x00\x37\
+\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x4a\x57\x47\
+\x00\x31\
+\x00\x37\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x5b\x57\x47\
+\x00\x32\
+\x00\x38\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x8b\x57\x47\
+\x00\x35\
+\x00\x38\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x7a\x57\x47\
+\x00\x34\
+\x00\x37\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x46\x57\x47\
+\x00\x31\
+\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x5c\x57\x47\
+\x00\x32\
+\x00\x39\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xc3\x57\x47\
+\x00\x39\
+\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x83\x57\x47\
+\x00\x35\
+\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xc8\x57\x47\
+\x00\x39\
+\x00\x35\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x05\
+\x00\x3a\x57\x47\
+\x00\x37\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x69\x57\x47\
+\x00\x33\
+\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x44\x57\x47\
+\x00\x31\
+\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x9a\x57\x47\
+\x00\x36\
+\x00\x37\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x86\x57\x47\
+\x00\x35\
+\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x67\x57\x47\
+\x00\x33\
+\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x7c\x57\x47\
+\x00\x34\
+\x00\x39\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x05\
+\x00\x36\x57\x47\
+\x00\x33\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x87\x57\x47\
+\x00\x35\
+\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x64\x57\x47\
+\x00\x33\
+\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x88\x57\x47\
+\x00\x35\
+\x00\x35\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x55\x57\x47\
+\x00\x32\
+\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x05\
+\x00\x39\x57\x47\
+\x00\x36\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xb3\x57\x47\
+\x00\x38\
+\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xc5\x57\x47\
+\x00\x39\
+\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x9c\x57\x47\
+\x00\x36\
+\x00\x39\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xaa\x57\x47\
+\x00\x37\
+\x00\x37\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x7b\x57\x47\
+\x00\x34\
+\x00\x38\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x75\x57\x47\
+\x00\x34\
+\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x49\x57\x47\
+\x00\x31\
+\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xa8\x57\x47\
+\x00\x37\
+\x00\x35\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x05\
+\x00\x37\x57\x47\
+\x00\x34\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x05\
+\x00\x38\x57\x47\
+\x00\x35\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x68\x57\x47\
+\x00\x33\
+\x00\x35\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xa3\x57\x47\
+\x00\x37\
+\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xbb\x57\x47\
+\x00\x38\
+\x00\x38\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x6c\x57\x47\
+\x00\x33\
+\x00\x39\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\xac\x57\x47\
+\x00\x37\
+\x00\x39\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x53\x57\x47\
+\x00\x32\
+\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x98\x57\x47\
+\x00\x36\
+\x00\x35\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x9b\x57\x47\
+\x00\x36\
+\x00\x38\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x03\x8c\x57\x47\
+\x00\x35\
+\x00\x39\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x07\xa7\x57\xc7\
+\x00\x41\
+\x00\x64\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x04\x77\x57\x47\
+\x00\x43\
+\x00\x44\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0b\x29\xb2\x87\
+\x00\x4c\
+\x00\x61\x00\x73\x00\x74\x00\x20\x00\x72\x00\x65\x00\x63\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x04\x90\x86\xc7\
+\x00\x57\
+\x00\x72\x00\x65\x00\x6e\x00\x63\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x00\x30\x5e\xe7\
+\x00\x46\
+\x00\x69\x00\x6c\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x00\x57\x5e\xa7\
+\x00\x48\
+\x00\x69\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0f\x6c\x5e\x67\
+\x00\x41\
+\x00\x6e\x00\x63\x00\x68\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x09\x77\x57\xe7\
+\x00\x53\
+\x00\x61\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x08\x90\xc7\x07\
+\x00\x41\
+\x00\x6c\x00\x61\x00\x72\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x01\x84\x99\x27\
+\x00\x42\
+\x00\x61\x00\x64\x00\x20\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x09\xf6\xfe\xc7\
+\x00\x4d\
+\x00\x75\x00\x73\x00\x69\x00\x63\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0d\xcc\x07\xc7\
+\x00\x44\
+\x00\x61\x00\x6e\x00\x67\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x04\xca\x57\xe7\
+\x00\x4e\
+\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0b\x59\x7a\x27\
+\x00\x42\
+\x00\x6f\x00\x74\x00\x74\x00\x6f\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0f\xd7\x5e\xe7\
+\x00\x47\
+\x00\x69\x00\x66\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x0a\xc7\x57\xc7\
+\x00\x43\
+\x00\x75\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x04\xb2\x5c\xc7\
+\x00\x55\
+\x00\x6e\x00\x64\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x05\xcb\xf1\x47\
+\x00\x4c\
+\x00\x69\x00\x6e\x00\x75\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0c\xf8\xff\x87\
+\x00\x4d\
+\x00\x6f\x00\x76\x00\x69\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0a\xcf\x0e\x27\
+\x00\x4c\
+\x00\x65\x00\x74\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x01\xcc\x57\xe7\
+\x00\x4b\
+\x00\x65\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x08\xb1\x06\x27\
+\x00\x43\
+\x00\x72\x00\x65\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x13\
+\x0a\xa6\xcb\x87\
+\x00\x59\
+\x00\x65\x00\x6c\x00\x6c\x00\x6f\x00\x77\x00\x20\x00\x62\x00\x6f\x00\x6f\x00\x6b\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2e\x00\x70\
+\x00\x6e\x00\x67\
+\x00\x09\
+\x0f\xc1\xc7\x07\
+\x00\x41\
+\x00\x6c\x00\x69\x00\x65\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x08\x31\xcf\x27\
+\x00\x46\
+\x00\x65\x00\x6d\x00\x61\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x0c\x37\xcd\x47\
+\x00\x50\
+\x00\x72\x00\x65\x00\x76\x00\x69\x00\x6f\x00\x75\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x00\x57\xf8\x67\
+\x00\x50\
+\x00\x72\x00\x69\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x01\xf5\xb4\xc7\
+\x00\x46\
+\x00\x6c\x00\x61\x00\x73\x00\x68\x00\x20\x00\x64\x00\x72\x00\x69\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x03\x9c\x99\x27\
+\x00\x52\
+\x00\x65\x00\x64\x00\x20\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x11\
+\x04\x79\xa3\xa7\
+\x00\x53\
+\x00\x68\x00\x6f\x00\x70\x00\x70\x00\x69\x00\x6e\x00\x67\x00\x20\x00\x63\x00\x61\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\
+\x00\x0a\
+\x00\x4c\x4e\x87\
+\x00\x52\
+\x00\x65\x00\x77\x00\x69\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x08\x4e\xc9\x87\
+\x00\x45\
+\x00\x78\x00\x70\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0c\x98\xfa\x47\
+\x00\x50\
+\x00\x61\x00\x75\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x0c\x2a\x2c\x47\
+\x00\x52\
+\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x07\x3c\xc7\xa7\
+\x00\x41\
+\x00\x70\x00\x70\x00\x6c\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\x01\x5e\x07\
+\x00\x43\
+\x00\x6f\x00\x69\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x08\xef\x39\xa7\
+\x00\x42\
+\x00\x6c\x00\x75\x00\x65\x00\x20\x00\x6b\x00\x65\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x08\xa7\x5d\x07\
+\x00\x4c\
+\x00\x61\x00\x73\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x05\x52\x57\x47\
+\x00\x4e\
+\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x03\x50\xe0\x87\
+\x00\x53\
+\x00\x74\x00\x6f\x00\x63\x00\x6b\x00\x20\x00\x67\x00\x72\x00\x61\x00\x70\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x00\xd4\xa7\x07\
+\x00\x52\
+\x00\x61\x00\x64\x00\x69\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x0c\xf8\x57\xc7\
+\x00\x45\
+\x00\x79\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x05\x77\x5d\x27\
+\x00\x4c\
+\x00\x6f\x00\x61\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x05\x99\xdd\x27\
+\x00\x55\
+\x00\x6e\x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x00\x3e\x5a\xa7\
+\x00\x50\
+\x00\x68\x00\x6f\x00\x6e\x00\x65\x00\x20\x00\x6e\x00\x75\x00\x6d\x00\x62\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x0c\x2d\xa2\x27\
+\x00\x50\
+\x00\x69\x00\x63\x00\x74\x00\x75\x00\x72\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0a\xcd\x19\x07\
+\x00\x53\
+\x00\x74\x00\x6f\x00\x70\x00\x20\x00\x73\x00\x69\x00\x67\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x05\x69\x52\xc7\
+\x00\x4c\
+\x00\x6f\x00\x77\x00\x20\x00\x72\x00\x61\x00\x74\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x11\
+\x04\x9e\xe6\xe7\
+\x00\x42\
+\x00\x6c\x00\x75\x00\x65\x00\x20\x00\x62\x00\x6f\x00\x6f\x00\x6b\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\
+\x00\x06\
+\x05\x3e\x57\x47\
+\x00\x4f\
+\x00\x4b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0e\xa7\x92\x47\
+\x00\x59\
+\x00\x65\x00\x6c\x00\x6c\x00\x6f\x00\x77\x00\x20\x00\x70\x00\x69\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x02\x3f\x47\xc7\
+\x00\x41\
+\x00\x70\x00\x70\x00\x6c\x00\x69\x00\x63\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x04\x85\xa3\x87\
+\x00\x41\
+\x00\x6c\x00\x61\x00\x72\x00\x6d\x00\x20\x00\x63\x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\x65\x5e\x27\
+\x00\x44\
+\x00\x6f\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x08\xec\x5c\x07\
+\x00\x54\
+\x00\x61\x00\x78\x00\x69\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x02\x20\x92\x47\
+\x00\x59\
+\x00\x65\x00\x6c\x00\x6c\x00\x6f\x00\x77\x00\x20\x00\x74\x00\x61\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x06\x48\xfa\xa7\
+\x00\x50\
+\x00\x68\x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x05\x9e\xc3\x27\
+\x00\x43\
+\x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x07\x71\xd6\x87\
+\x00\x47\
+\x00\x72\x00\x65\x00\x65\x00\x6e\x00\x20\x00\x74\x00\x61\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x09\xa7\xcd\x47\
+\x00\x46\
+\x00\x69\x00\x72\x00\x73\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x06\xc7\xd8\x67\
+\x00\x41\
+\x00\x62\x00\x6f\x00\x75\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0b\x6b\xd6\x67\
+\x00\x46\
+\x00\x61\x00\x76\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x74\x00\x65\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x09\xcc\x57\xc7\
+\x00\x42\
+\x00\x75\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x00\x95\x15\x27\
+\x00\x54\
+\x00\x72\x00\x61\x00\x63\x00\x6b\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x07\xdb\x10\x87\
+\x00\x41\
+\x00\x64\x00\x64\x00\x72\x00\x65\x00\x73\x00\x73\x00\x20\x00\x62\x00\x6f\x00\x6f\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x06\x06\x42\x27\
+\x00\x48\
+\x00\x69\x00\x73\x00\x74\x00\x6f\x00\x72\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x08\x28\x5d\x27\
+\x00\x4d\
+\x00\x61\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x05\xc3\x57\x47\
+\x00\x55\
+\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x08\x32\x9f\x87\
+\x00\x43\
+\x00\x6f\x00\x6d\x00\x70\x00\x61\x00\x73\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x05\x88\xcb\x27\
+\x00\x47\
+\x00\x6c\x00\x6f\x00\x62\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x00\x6b\xb7\xe7\
+\x00\x50\
+\x00\x69\x00\x6e\x00\x69\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x0f\xc6\x57\xe7\
+\x00\x59\
+\x00\x65\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x08\x39\x6c\x87\
+\x00\x42\
+\x00\x6c\x00\x61\x00\x63\x00\x6b\x00\x20\x00\x74\x00\x61\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0c\xe7\x84\xc7\
+\x00\x43\
+\x00\x6c\x00\x69\x00\x70\x00\x62\x00\x6f\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0f\x07\x5e\xc7\
+\x00\x45\
+\x00\x78\x00\x69\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0f\xf7\xad\x27\
+\x00\x53\
+\x00\x74\x00\x6f\x00\x70\x00\x77\x00\x61\x00\x74\x00\x63\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x04\x48\x98\x07\
+\x00\x47\
+\x00\x6f\x00\x6f\x00\x64\x00\x20\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0e\xca\xaf\xc7\
+\x00\x48\
+\x00\x75\x00\x6e\x00\x67\x00\x75\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x06\xee\xa6\x67\
+\x00\x46\
+\x00\x61\x00\x73\x00\x74\x00\x2d\x00\x66\x00\x6f\x00\x72\x00\x77\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x05\xd0\xa6\xa7\
+\x00\x52\
+\x00\x65\x00\x64\x00\x20\x00\x62\x00\x6f\x00\x6f\x00\x6b\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x07\xff\x5d\x27\
+\x00\x4d\
+\x00\x61\x00\x69\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x08\xd0\x9f\x87\
+\x00\x43\
+\x00\x6f\x00\x6d\x00\x70\x00\x61\x00\x6e\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x00\x98\xe6\x47\
+\x00\x52\
+\x00\x61\x00\x69\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x03\xa4\x66\x07\
+\x00\x44\
+\x00\x69\x00\x73\x00\x61\x00\x73\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x07\xf6\x5f\x27\
+\x00\x45\
+\x00\x2d\x00\x6d\x00\x61\x00\x69\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x08\xed\xb8\x87\
+\x00\x44\
+\x00\x69\x00\x61\x00\x67\x00\x72\x00\x61\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x01\xa2\x93\x27\
+\x00\x42\
+\x00\x6f\x00\x6f\x00\x6b\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x06\x99\x30\x27\
+\x00\x55\
+\x00\x70\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x13\
+\x00\x1b\x03\x07\
+\x00\x50\
+\x00\x72\x00\x65\x00\x76\x00\x69\x00\x6f\x00\x75\x00\x73\x00\x20\x00\x72\x00\x65\x00\x63\x00\x6f\x00\x72\x00\x64\x00\x2e\x00\x70\
+\x00\x6e\x00\x67\
+\x00\x08\
+\x06\xe1\x5e\x27\
+\x00\x44\
+\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0b\xdc\x1b\x47\
+\x00\x48\
+\x00\x65\x00\x6c\x00\x70\x00\x20\x00\x62\x00\x6f\x00\x6f\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x06\x97\xd8\x67\
+\x00\x41\
+\x00\x62\x00\x6f\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x00\x9f\xba\x87\
+\x00\x43\
+\x00\x6f\x00\x6d\x00\x70\x00\x6f\x00\x6e\x00\x65\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x06\x8c\x40\x07\
+\x00\x52\
+\x00\x65\x00\x63\x00\x6f\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x09\x65\xce\x67\
+\x00\x45\
+\x00\x72\x00\x72\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x00\x28\xe3\xc7\
+\x00\x53\
+\x00\x6d\x00\x69\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0d\x8e\x9b\x07\
+\x00\x48\
+\x00\x61\x00\x72\x00\x64\x00\x20\x00\x64\x00\x69\x00\x73\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0a\x6b\x8e\x67\
+\x00\x50\
+\x00\x65\x00\x72\x00\x73\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x06\xcf\x4f\xc7\
+\x00\x52\
+\x00\x65\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x07\x73\xc2\x67\
+\x00\x4d\
+\x00\x65\x00\x73\x00\x73\x00\x61\x00\x67\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0c\xa8\x5d\xc7\
+\x00\x4d\
+\x00\x75\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x16\
+\x0d\x81\x62\x67\
+\x00\x4e\
+\x00\x65\x00\x74\x00\x77\x00\x6f\x00\x72\x00\x6b\x00\x20\x00\x63\x00\x6f\x00\x6e\x00\x6e\x00\x65\x00\x63\x00\x74\x00\x69\x00\x6f\
+\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x00\x46\x5c\x27\
+\x00\x53\
+\x00\x79\x00\x6e\x00\x63\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x09\x28\xe3\xa7\
+\x00\x54\
+\x00\x61\x00\x62\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x04\x24\x52\xc7\
+\x00\x53\
+\x00\x69\x00\x6c\x00\x65\x00\x6e\x00\x63\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x14\
+\x07\xc2\xee\x47\
+\x00\x63\
+\x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2d\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2d\x00\x67\x00\x72\x00\x65\x00\x65\x00\x6e\x00\x2e\
+\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x09\x29\x3d\x67\
+\x00\x4e\
+\x00\x65\x00\x77\x00\x20\x00\x64\x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x02\x1e\x43\xa7\
+\x00\x44\
+\x00\x69\x00\x73\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x09\xdd\x9b\x07\
+\x00\x54\
+\x00\x6f\x00\x6f\x00\x6c\x00\x62\x00\x6f\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x08\x2f\x5e\xc7\
+\x00\x46\
+\x00\x61\x00\x6c\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x01\x93\x98\x07\
+\x00\x52\
+\x00\x65\x00\x64\x00\x20\x00\x73\x00\x74\x00\x61\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0a\xc6\xfd\x87\
+\x00\x4e\
+\x00\x6f\x00\x74\x00\x65\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x00\x47\x5e\xe7\
+\x00\x46\
+\x00\x69\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x05\x4b\x9d\x47\
+\x00\x55\
+\x00\x73\x00\x65\x00\x72\x00\x20\x00\x67\x00\x72\x00\x6f\x00\x75\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0f\x7f\x5e\x07\
+\x00\x44\
+\x00\x69\x00\x61\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x06\x1d\xcc\xe7\
+\x00\x4d\
+\x00\x6f\x00\x62\x00\x69\x00\x6c\x00\x65\x00\x2d\x00\x70\x00\x68\x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0d\xb5\xa0\x87\
+\x00\x4c\
+\x00\x69\x00\x67\x00\x68\x00\x74\x00\x6e\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x0d\x5b\x74\x47\
+\x00\x59\
+\x00\x65\x00\x6c\x00\x6c\x00\x6f\x00\x77\x00\x20\x00\x63\x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x04\xce\x6c\x87\
+\x00\x42\
+\x00\x6c\x00\x61\x00\x63\x00\x6b\x00\x20\x00\x70\x00\x69\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x08\xaf\xda\x07\
+\x00\x55\
+\x00\x70\x00\x64\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0a\xcc\xf7\x27\
+\x00\x46\
+\x00\x69\x00\x6c\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0a\xcc\xfb\x07\
+\x00\x46\
+\x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x08\x1d\x84\xe7\
+\x00\x46\
+\x00\x6f\x00\x72\x00\x77\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x08\xea\x7e\xa7\
+\x00\x49\
+\x00\x6e\x00\x2d\x00\x79\x00\x61\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x11\
+\x0c\x83\x01\x27\
+\x00\x46\
+\x00\x65\x00\x6d\x00\x61\x00\x6c\x00\x65\x00\x20\x00\x73\x00\x79\x00\x6d\x00\x62\x00\x6f\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\
+\x00\x0e\
+\x0b\x30\xc0\x27\
+\x00\x43\
+\x00\x61\x00\x6c\x00\x63\x00\x75\x00\x6c\x00\x61\x00\x74\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x02\x3b\x24\x87\
+\x00\x54\
+\x00\x68\x00\x75\x00\x6d\x00\x62\x00\x73\x00\x20\x00\x75\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x02\xcc\xe7\x27\
+\x00\x57\
+\x00\x61\x00\x6c\x00\x6c\x00\x65\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0c\x92\x5e\xc7\
+\x00\x45\
+\x00\x75\x00\x72\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0c\xf7\x5d\xc7\
+\x00\x4e\
+\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0c\x16\xd6\x87\
+\x00\x47\
+\x00\x72\x00\x65\x00\x65\x00\x6e\x00\x20\x00\x70\x00\x69\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x0a\xcb\x3b\xa7\
+\x00\x52\
+\x00\x65\x00\x64\x00\x20\x00\x74\x00\x61\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x00\xf5\x45\xe7\
+\x00\x57\
+\x00\x61\x00\x72\x00\x6e\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x09\x31\x60\x47\
+\x00\x42\
+\x00\x75\x00\x62\x00\x62\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x07\x76\xc2\x07\
+\x00\x51\
+\x00\x75\x00\x65\x00\x73\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x08\xc8\x5c\x67\
+\x00\x53\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x03\x61\x39\xa7\
+\x00\x42\
+\x00\x6c\x00\x75\x00\x65\x00\x20\x00\x74\x00\x61\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x09\x91\xdd\x27\
+\x00\x33\
+\x00\x64\x00\x20\x00\x62\x00\x61\x00\x72\x00\x20\x00\x63\x00\x68\x00\x61\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0c\xee\xcb\x07\
+\x00\x50\
+\x00\x6c\x00\x61\x00\x79\x00\x2d\x00\x6d\x00\x75\x00\x73\x00\x69\x00\x63\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x12\
+\x07\xeb\xfc\x47\
+\x00\x42\
+\x00\x6c\x00\x61\x00\x63\x00\x6b\x00\x20\x00\x62\x00\x6f\x00\x6f\x00\x6b\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2e\x00\x70\x00\x6e\
+\x00\x67\
+\x00\x0a\
+\x07\x2e\x8f\x87\
+\x00\x50\
+\x00\x65\x00\x6f\x00\x70\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x06\x4e\x5a\xa7\
+\x00\x49\
+\x00\x70\x00\x68\x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x0c\x1a\x9d\x27\
+\x00\x44\
+\x00\x6f\x00\x77\x00\x6e\x00\x6c\x00\x6f\x00\x61\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x0b\x63\x57\xe7\
+\x00\x54\
+\x00\x6f\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0f\x07\xcd\xe7\
+\x00\x41\
+\x00\x63\x00\x63\x00\x6f\x00\x75\x00\x6e\x00\x74\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\xc8\x5d\xc7\
+\x00\x4d\
+\x00\x6f\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x00\x26\x39\x87\
+\x00\x46\
+\x00\x72\x00\x65\x00\x65\x00\x20\x00\x62\x00\x73\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0b\xb2\x5c\x47\
+\x00\x52\
+\x00\x65\x00\x64\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0f\xd2\xdc\x07\
+\x00\x4d\
+\x00\x6f\x00\x64\x00\x69\x00\x66\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0c\xf7\x5c\x07\
+\x00\x54\
+\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x08\x90\x60\x47\
+\x00\x53\
+\x00\x65\x00\x61\x00\x72\x00\x63\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x0d\xb1\x41\x27\
+\x00\x4d\
+\x00\x61\x00\x6c\x00\x65\x00\x20\x00\x73\x00\x79\x00\x6d\x00\x62\x00\x6f\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x08\x0e\x4f\x87\
+\x00\x52\
+\x00\x65\x00\x70\x00\x61\x00\x69\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x02\x5b\x02\xe7\
+\x00\x46\
+\x00\x69\x00\x72\x00\x73\x00\x74\x00\x20\x00\x72\x00\x65\x00\x63\x00\x6f\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0b\xa7\xcf\x47\
+\x00\x45\
+\x00\x6a\x00\x65\x00\x63\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x07\x9e\x5e\x47\
+\x00\x42\
+\x00\x61\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x06\x9c\x4e\x27\
+\x00\x52\
+\x00\x65\x00\x74\x00\x6f\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0d\xcc\x06\x47\
+\x00\x54\
+\x00\x61\x00\x72\x00\x67\x00\x65\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x0d\x7b\x48\x47\
+\x00\x50\
+\x00\x6c\x00\x61\x00\x79\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0c\x9b\xc4\x67\
+\x00\x42\
+\x00\x72\x00\x75\x00\x73\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\xa6\x5e\x67\
+\x00\x42\
+\x00\x6f\x00\x73\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x07\x02\x7a\x47\
+\x00\x47\
+\x00\x6f\x00\x20\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0e\x72\xb5\x67\
+\x00\x4e\
+\x00\x65\x00\x78\x00\x74\x00\x20\x00\x74\x00\x72\x00\x61\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x05\x9e\x5d\x27\
+\x00\x4c\
+\x00\x6f\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x06\x9c\x4f\xa7\
+\x00\x52\
+\x00\x65\x00\x70\x00\x6f\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0c\x47\xe3\x87\
+\x00\x53\
+\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x15\
+\x04\xec\xc6\xc7\
+\x00\x63\
+\x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2d\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2d\x00\x6f\x00\x72\x00\x61\x00\x6e\x00\x67\x00\x65\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0c\xb1\x0f\x07\
+\x00\x44\
+\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\x7c\x5e\x07\
+\x00\x43\
+\x00\x6f\x00\x70\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x05\x7c\xd9\x27\
+\x00\x55\
+\x00\x70\x00\x6c\x00\x6f\x00\x61\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x0e\xd2\x91\xc7\
+\x00\x54\
+\x00\x68\x00\x75\x00\x6d\x00\x62\x00\x73\x00\x20\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x01\x5b\x5f\xa7\
+\x00\x43\
+\x00\x61\x00\x72\x00\x20\x00\x6b\x00\x65\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x07\x56\x2c\x27\
+\x00\x48\
+\x00\x65\x00\x6c\x00\x70\x00\x20\x00\x62\x00\x6f\x00\x6f\x00\x6b\x00\x20\x00\x33\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0c\x33\x5e\x87\
+\x00\x48\
+\x00\x65\x00\x6c\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x00\x90\x49\x27\
+\x00\x46\
+\x00\x6f\x00\x72\x00\x62\x00\x69\x00\x64\x00\x64\x00\x65\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x08\x97\xca\x27\
+\x00\x48\
+\x00\x65\x00\x61\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x08\xb8\x57\xc7\
+\x00\x42\
+\x00\x65\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x06\x70\x3b\xa7\
+\x00\x52\
+\x00\x65\x00\x64\x00\x20\x00\x70\x00\x69\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x0f\xe6\x39\xa7\
+\x00\x42\
+\x00\x6c\x00\x75\x00\x65\x00\x20\x00\x70\x00\x69\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0b\x8b\x2f\x47\
+\x00\x42\
+\x00\x72\x00\x69\x00\x65\x00\x66\x00\x63\x00\x61\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x08\x98\xce\x47\
+\x00\x45\
+\x00\x72\x00\x61\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0b\xf9\xec\x27\
+\x00\x4d\
+\x00\x61\x00\x67\x00\x69\x00\x63\x00\x20\x00\x77\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x03\xb5\x0f\xc7\
+\x00\x43\
+\x00\x61\x00\x6c\x00\x65\x00\x6e\x00\x64\x00\x61\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x11\
+\x0a\xeb\xaa\x27\
+\x00\x4d\
+\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d\x00\x20\x00\x72\x00\x61\x00\x74\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\
+\x00\x0c\
+\x01\xc9\x18\x47\
+\x00\x44\
+\x00\x61\x00\x74\x00\x61\x00\x62\x00\x61\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0b\x63\x5c\x07\
+\x00\x53\
+\x00\x74\x00\x6f\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x03\x5a\x5e\x67\
+\x00\x42\
+\x00\x6c\x00\x6f\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\x38\x5e\xa7\
+\x00\x48\
+\x00\x6f\x00\x6d\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x04\xd2\x5d\x47\
+\x00\x49\
+\x00\x6e\x00\x66\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x0c\xfa\xc6\x67\
+\x00\x50\
+\x00\x65\x00\x72\x00\x63\x00\x65\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\x35\x5e\x67\
+\x00\x42\
+\x00\x6f\x00\x6d\x00\x62\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0a\x59\xd2\x07\
+\x00\x4c\
+\x00\x65\x00\x66\x00\x74\x00\x2d\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x12\
+\x06\x04\xe3\x07\
+\x00\x47\
+\x00\x72\x00\x65\x00\x65\x00\x6e\x00\x20\x00\x62\x00\x6f\x00\x6f\x00\x6b\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2e\x00\x70\x00\x6e\
+\x00\x67\
+\x00\x0c\
+\x03\x89\xd8\xc7\
+\x00\x43\
+\x00\x6f\x00\x6d\x00\x70\x00\x75\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x04\xbb\xba\x07\
+\x00\x48\
+\x00\x6f\x00\x77\x00\x2d\x00\x74\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x0c\xc3\x9f\x27\
+\x00\x43\
+\x00\x6f\x00\x6d\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x00\xa7\x5d\x27\
+\x00\x4c\
+\x00\x69\x00\x73\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x04\xc5\xf1\x47\
+\x00\x4c\
+\x00\x69\x00\x6e\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x05\x4f\x58\x07\
+\x00\x45\
+\x00\x71\x00\x75\x00\x69\x00\x70\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0a\xa8\xfa\x47\
+\x00\x50\
+\x00\x61\x00\x73\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0c\x3f\xfb\x27\
+\x00\x56\
+\x00\x6f\x00\x6c\x00\x75\x00\x6d\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x0a\xc0\x57\xe7\
+\x00\x53\
+\x00\x75\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x09\xab\xc0\x47\
+\x00\x45\
+\x00\x61\x00\x72\x00\x74\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x06\x7f\x4a\x27\
+\x00\x48\
+\x00\x6f\x00\x75\x00\x72\x00\x67\x00\x6c\x00\x61\x00\x73\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0d\x36\xd6\xa7\
+\x00\x54\
+\x00\x65\x00\x72\x00\x6d\x00\x69\x00\x6e\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x02\x8c\x3b\x27\
+\x00\x44\
+\x00\x6f\x00\x6c\x00\x6c\x00\x61\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x14\
+\x07\xfc\x0b\x47\
+\x00\x44\
+\x00\x6f\x00\x77\x00\x6e\x00\x6c\x00\x6f\x00\x61\x00\x64\x00\x73\x00\x20\x00\x66\x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2e\
+\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x02\x7a\x5e\xe7\
+\x00\x46\
+\x00\x6c\x00\x61\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0f\xca\x5c\xc7\
+\x00\x56\
+\x00\x69\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\x60\x5b\x67\
+\x00\x5a\
+\x00\x6f\x00\x6f\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x01\x40\x2f\xe7\
+\x00\x4e\
+\x00\x6f\x00\x2d\x00\x65\x00\x6e\x00\x74\x00\x72\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x00\x7c\x62\x67\
+\x00\x53\
+\x00\x63\x00\x72\x00\x69\x00\x70\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x0e\xb0\x77\xa7\
+\x00\x54\
+\x00\x75\x00\x72\x00\x6e\x00\x20\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0c\x2c\x6a\xa7\
+\x00\x53\
+\x00\x68\x00\x69\x00\x65\x00\x6c\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x0a\x72\x96\x27\
+\x00\x54\
+\x00\x77\x00\x69\x00\x74\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x04\xe2\x57\x47\
+\x00\x47\
+\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x08\x9b\xe0\x47\
+\x00\x54\
+\x00\x72\x00\x61\x00\x73\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0a\x5d\x97\x67\
+\x00\x47\
+\x00\x6f\x00\x20\x00\x66\x00\x6f\x00\x72\x00\x77\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0c\x97\xc7\x07\
+\x00\x41\
+\x00\x6c\x00\x65\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x05\xc4\x36\xc7\
+\x00\x44\
+\x00\x65\x00\x6c\x00\x69\x00\x76\x00\x65\x00\x72\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x03\x17\x80\x27\
+\x00\x53\
+\x00\x63\x00\x68\x00\x65\x00\x64\x00\x75\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x02\x13\x7c\x67\
+\x00\x50\
+\x00\x72\x00\x6f\x00\x62\x00\x6c\x00\x65\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x05\x79\x85\xc7\
+\x00\x50\
+\x00\x69\x00\x65\x00\x20\x00\x63\x00\x68\x00\x61\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x06\x98\xc3\x27\
+\x00\x43\
+\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x03\x33\xfd\x07\
+\x00\x54\
+\x00\x65\x00\x78\x00\x74\x00\x20\x00\x70\x00\x72\x00\x65\x00\x76\x00\x69\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x02\x8c\x5d\xa7\
+\x00\x50\
+\x00\x6c\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0c\x48\x5c\x27\
+\x00\x54\
+\x00\x75\x00\x6e\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct_v1 = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
+\x00\x00\x00\x12\x00\x02\x00\x00\x00\xe3\x00\x00\x00\x64\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x60\x00\x00\x00\x04\
+\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x3e\x15\
+\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x3a\x4e\
+\x00\x00\x05\x18\x00\x00\x00\x00\x00\x01\x00\x01\x3c\x9c\
+\x00\x00\x06\x10\x00\x00\x00\x00\x00\x01\x00\x01\x79\x9f\
+\x00\x00\x06\x20\x00\x00\x00\x00\x00\x01\x00\x01\x7d\xca\
+\x00\x00\x05\x70\x00\x00\x00\x00\x00\x01\x00\x01\x4f\xd4\
+\x00\x00\x04\x9c\x00\x00\x00\x00\x00\x01\x00\x01\x1d\x32\
+\x00\x00\x01\x86\x00\x00\x00\x00\x00\x01\x00\x00\x57\x85\
+\x00\x00\x03\x48\x00\x00\x00\x00\x00\x01\x00\x00\xc1\xc5\
+\x00\x00\x02\xca\x00\x00\x00\x00\x00\x01\x00\x00\xa5\xae\
+\x00\x00\x04\xbe\x00\x00\x00\x00\x00\x01\x00\x01\x27\x88\
+\x00\x00\x03\x36\x00\x00\x00\x00\x00\x01\x00\x00\xbe\xdb\
+\x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x01\x06\x7f\
+\x00\x00\x02\x94\x00\x00\x00\x00\x00\x01\x00\x00\x9b\x9a\
+\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x01\x00\x00\x27\xfc\
+\x00\x00\x05\xec\x00\x00\x00\x00\x00\x01\x00\x01\x6f\x95\
+\x00\x00\x03\xfa\x00\x00\x00\x00\x00\x01\x00\x00\xf4\xdd\
+\x00\x00\x03\x8e\x00\x00\x00\x00\x00\x01\x00\x00\xd6\xce\
+\x00\x00\x00\x46\x00\x00\x00\x00\x00\x01\x00\x00\x07\x8e\
+\x00\x00\x06\x8a\x00\x00\x00\x00\x00\x01\x00\x01\x9a\x7d\
+\x00\x00\x01\x50\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x7a\
+\x00\x00\x05\x5e\x00\x00\x00\x00\x00\x01\x00\x01\x4b\xee\
+\x00\x00\x02\xb8\x00\x00\x00\x00\x00\x01\x00\x00\xa1\x5b\
+\x00\x00\x02\xa6\x00\x00\x00\x00\x00\x01\x00\x00\x9d\x17\
+\x00\x00\x01\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x72\xab\
+\x00\x00\x03\xd6\x00\x00\x00\x00\x00\x01\x00\x00\xea\x9d\
+\x00\x00\x04\x0c\x00\x00\x00\x00\x00\x01\x00\x00\xf9\xb0\
+\x00\x00\x04\x54\x00\x00\x00\x00\x00\x01\x00\x01\x0a\x74\
+\x00\x00\x02\x82\x00\x00\x00\x00\x00\x01\x00\x00\x96\x20\
+\x00\x00\x05\x3a\x00\x00\x00\x00\x00\x01\x00\x01\x44\x2a\
+\x00\x00\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\xb4\xd3\
+\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x1e\x9b\
+\x00\x00\x04\xf4\x00\x00\x00\x00\x00\x01\x00\x01\x33\x13\
+\x00\x00\x06\x30\x00\x00\x00\x00\x00\x01\x00\x01\x83\xb1\
+\x00\x00\x04\xac\x00\x00\x00\x00\x00\x01\x00\x01\x22\xfb\
+\x00\x00\x01\xba\x00\x00\x00\x00\x00\x01\x00\x00\x64\x78\
+\x00\x00\x03\x6a\x00\x00\x00\x00\x00\x01\x00\x00\xcb\xe0\
+\x00\x00\x06\x66\x00\x00\x00\x00\x00\x01\x00\x01\x92\x04\
+\x00\x00\x01\x74\x00\x00\x00\x00\x00\x01\x00\x00\x54\x33\
+\x00\x00\x02\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x8e\x55\
+\x00\x00\x05\xda\x00\x00\x00\x00\x00\x01\x00\x01\x6b\x40\
+\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x24\x10\
+\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x16\x30\
+\x00\x00\x03\x12\x00\x00\x00\x00\x00\x01\x00\x00\xb6\x38\
+\x00\x00\x01\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x41\xe3\
+\x00\x00\x04\x30\x00\x00\x00\x00\x00\x01\x00\x01\x02\x45\
+\x00\x00\x05\xc8\x00\x00\x00\x00\x00\x01\x00\x01\x67\x1b\
+\x00\x00\x05\x06\x00\x00\x00\x00\x00\x01\x00\x01\x37\x6f\
+\x00\x00\x04\x78\x00\x00\x00\x00\x00\x01\x00\x01\x14\x07\
+\x00\x00\x03\xa0\x00\x00\x00\x00\x00\x01\x00\x00\xdd\x21\
+\x00\x00\x02\x14\x00\x00\x00\x00\x00\x01\x00\x00\x7c\x9f\
+\x00\x00\x04\xe2\x00\x00\x00\x00\x00\x01\x00\x01\x2f\xe8\
+\x00\x00\x05\x28\x00\x00\x00\x00\x00\x01\x00\x01\x40\xfe\
+\x00\x00\x05\x4c\x00\x00\x00\x00\x00\x01\x00\x01\x48\xe8\
+\x00\x00\x01\x96\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x38\
+\x00\x00\x00\x22\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x04\x1e\x00\x00\x00\x00\x00\x01\x00\x00\xfd\xff\
+\x00\x00\x06\xc0\x00\x00\x00\x00\x00\x01\x00\x01\xa7\xe8\
+\x00\x00\x01\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x46\x75\
+\x00\x00\x02\xee\x00\x00\x00\x00\x00\x01\x00\x00\xb0\x5d\
+\x00\x00\x03\x24\x00\x00\x00\x00\x00\x01\x00\x00\xba\xec\
+\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x2c\x65\
+\x00\x00\x02\x26\x00\x00\x00\x00\x00\x01\x00\x00\x80\xa6\
+\x00\x00\x06\x9c\x00\x00\x00\x00\x00\x01\x00\x01\x9e\xf3\
+\x00\x00\x03\x7c\x00\x00\x00\x00\x00\x01\x00\x00\xd0\x16\
+\x00\x00\x04\xd0\x00\x00\x00\x00\x00\x01\x00\x01\x2b\xa2\
+\x00\x00\x06\xae\x00\x00\x00\x00\x00\x01\x00\x01\xa3\x56\
+\x00\x00\x05\xa4\x00\x00\x00\x00\x00\x01\x00\x01\x5d\xa8\
+\x00\x00\x06\x42\x00\x00\x00\x00\x00\x01\x00\x01\x88\x49\
+\x00\x00\x03\xb2\x00\x00\x00\x00\x00\x01\x00\x00\xe2\xed\
+\x00\x00\x01\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x68\x71\
+\x00\x00\x03\xc4\x00\x00\x00\x00\x00\x01\x00\x00\xe7\x03\
+\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x30\x01\
+\x00\x00\x05\xfe\x00\x00\x00\x00\x00\x01\x00\x01\x73\xd7\
+\x00\x00\x03\xe8\x00\x00\x00\x00\x00\x01\x00\x00\xef\x27\
+\x00\x00\x05\xb6\x00\x00\x00\x00\x00\x01\x00\x01\x60\xcc\
+\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xf2\
+\x00\x00\x06\x78\x00\x00\x00\x00\x00\x01\x00\x01\x96\x4c\
+\x00\x00\x05\x80\x00\x00\x00\x00\x00\x01\x00\x01\x55\xb2\
+\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x35\x5a\
+\x00\x00\x02\x38\x00\x00\x00\x00\x00\x01\x00\x00\x84\xb2\
+\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x12\x27\
+\x00\x00\x00\x58\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xe0\
+\x00\x00\x01\x62\x00\x00\x00\x00\x00\x01\x00\x00\x50\x34\
+\x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x00\x92\x01\
+\x00\x00\x02\xdc\x00\x00\x00\x00\x00\x01\x00\x00\xab\x84\
+\x00\x00\x06\x54\x00\x00\x00\x00\x00\x01\x00\x01\x8d\x61\
+\x00\x00\x01\xa8\x00\x00\x00\x00\x00\x01\x00\x00\x60\x19\
+\x00\x00\x04\x66\x00\x00\x00\x00\x00\x01\x00\x01\x0f\xa8\
+\x00\x00\x03\x58\x00\x00\x00\x00\x00\x01\x00\x00\xc7\xb6\
+\x00\x00\x05\x92\x00\x00\x00\x00\x00\x01\x00\x01\x59\x4b\
+\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x02\xc2\
+\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\x6c\xa9\
+\x00\x00\x04\x8a\x00\x00\x00\x00\x00\x01\x00\x01\x17\xb7\
+\x00\x00\x02\x02\x00\x00\x00\x00\x00\x01\x00\x00\x76\xea\
+\x00\x00\x02\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x88\xb4\
+\x00\x00\x10\x2a\x00\x00\x00\x00\x00\x01\x00\x03\x63\xd8\
+\x00\x00\x16\xcc\x00\x00\x00\x00\x00\x01\x00\x04\x68\xac\
+\x00\x00\x10\xf6\x00\x00\x00\x00\x00\x01\x00\x03\x88\xe4\
+\x00\x00\x07\x34\x00\x00\x00\x00\x00\x01\x00\x01\xbf\x17\
+\x00\x00\x0b\x3e\x00\x00\x00\x00\x00\x01\x00\x02\x87\x9f\
+\x00\x00\x11\xc6\x00\x00\x00\x00\x00\x01\x00\x03\xa3\x87\
+\x00\x00\x12\xe8\x00\x00\x00\x00\x00\x01\x00\x03\xd1\xa3\
+\x00\x00\x09\xda\x00\x00\x00\x00\x00\x01\x00\x02\x3a\xcc\
+\x00\x00\x07\x4a\x00\x00\x00\x00\x00\x01\x00\x01\xc3\xaa\
+\x00\x00\x09\x58\x00\x00\x00\x00\x00\x01\x00\x02\x2c\x33\
+\x00\x00\x0e\x28\x00\x00\x00\x00\x00\x01\x00\x03\x0f\xd7\
+\x00\x00\x1d\xda\x00\x00\x00\x00\x00\x01\x00\x05\xa4\xd8\
+\x00\x00\x19\xd8\x00\x00\x00\x00\x00\x01\x00\x04\xf4\xd9\
+\x00\x00\x0d\x6a\x00\x00\x00\x00\x00\x01\x00\x02\xe9\x69\
+\x00\x00\x0f\x84\x00\x00\x00\x00\x00\x01\x00\x03\x49\x74\
+\x00\x00\x10\xa4\x00\x00\x00\x00\x00\x01\x00\x03\x79\x54\
+\x00\x00\x1c\x46\x00\x00\x00\x00\x00\x01\x00\x05\x5d\xfb\
+\x00\x00\x0a\xda\x00\x00\x00\x00\x00\x01\x00\x02\x72\x2c\
+\x00\x00\x15\x34\x00\x00\x00\x00\x00\x01\x00\x04\x28\x33\
+\x00\x00\x1d\xbc\x00\x00\x00\x00\x00\x01\x00\x05\xa0\x5d\
+\x00\x00\x19\x80\x00\x00\x00\x00\x00\x01\x00\x04\xe4\x26\
+\x00\x00\x07\xa6\x00\x00\x00\x00\x00\x01\x00\x01\xdb\x5e\
+\x00\x00\x12\xb2\x00\x00\x00\x00\x00\x01\x00\x03\xc7\x85\
+\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x01\x00\x03\x5b\xf3\
+\x00\x00\x1a\xfe\x00\x00\x00\x00\x00\x01\x00\x05\x22\x67\
+\x00\x00\x08\xae\x00\x00\x00\x00\x00\x01\x00\x02\x0f\xb7\
+\x00\x00\x09\x70\x00\x00\x00\x00\x00\x01\x00\x02\x30\x03\
+\x00\x00\x1e\xe8\x00\x00\x00\x00\x00\x01\x00\x05\xd9\x15\
+\x00\x00\x12\x64\x00\x00\x00\x00\x00\x01\x00\x03\xbb\x50\
+\x00\x00\x0c\x92\x00\x00\x00\x00\x00\x01\x00\x02\xc1\xae\
+\x00\x00\x14\x92\x00\x00\x00\x00\x00\x01\x00\x04\x0d\xf4\
+\x00\x00\x0c\x1e\x00\x00\x00\x00\x00\x01\x00\x02\xab\x7a\
+\x00\x00\x17\x88\x00\x00\x00\x00\x00\x01\x00\x04\x8b\xd8\
+\x00\x00\x1d\x7a\x00\x00\x00\x00\x00\x01\x00\x05\x93\x3d\
+\x00\x00\x1d\x32\x00\x00\x00\x00\x00\x01\x00\x05\x89\xb8\
+\x00\x00\x1f\x62\x00\x00\x00\x00\x00\x01\x00\x05\xeb\x3d\
+\x00\x00\x14\xb2\x00\x00\x00\x00\x00\x01\x00\x04\x12\x74\
+\x00\x00\x1e\xca\x00\x00\x00\x00\x00\x01\x00\x05\xd3\x08\
+\x00\x00\x1f\x3c\x00\x00\x00\x00\x00\x01\x00\x05\xe5\xc2\
+\x00\x00\x0a\xb6\x00\x00\x00\x00\x00\x01\x00\x02\x6c\xcb\
+\x00\x00\x1b\x32\x00\x00\x00\x00\x00\x01\x00\x05\x2b\xf2\
+\x00\x00\x15\x9e\x00\x00\x00\x00\x00\x01\x00\x04\x39\xa0\
+\x00\x00\x1b\xf2\x00\x00\x00\x00\x00\x01\x00\x05\x50\xbf\
+\x00\x00\x09\x94\x00\x00\x00\x00\x00\x01\x00\x02\x33\x4f\
+\x00\x00\x0f\x9c\x00\x00\x00\x00\x00\x01\x00\x03\x4c\xe1\
+\x00\x00\x1a\xb8\x00\x00\x00\x00\x00\x01\x00\x05\x18\x50\
+\x00\x00\x11\xf4\x00\x00\x00\x00\x00\x01\x00\x03\xae\x09\
+\x00\x00\x0e\xcc\x00\x00\x00\x00\x00\x01\x00\x03\x2b\x1f\
+\x00\x00\x06\xe6\x00\x00\x00\x00\x00\x01\x00\x01\xae\x5d\
+\x00\x00\x09\xb2\x00\x00\x00\x00\x00\x01\x00\x02\x37\x11\
+\x00\x00\x0c\x42\x00\x00\x00\x00\x00\x01\x00\x02\xb1\xc2\
+\x00\x00\x07\x1a\x00\x00\x00\x00\x00\x01\x00\x01\xba\xd2\
+\x00\x00\x0b\xc2\x00\x00\x00\x00\x00\x01\x00\x02\x9d\x69\
+\x00\x00\x08\x4e\x00\x00\x00\x00\x00\x01\x00\x01\xfc\xd2\
+\x00\x00\x1c\x10\x00\x00\x00\x00\x00\x01\x00\x05\x55\x22\
+\x00\x00\x1c\x5c\x00\x00\x00\x00\x00\x01\x00\x05\x62\x7f\
+\x00\x00\x07\xf6\x00\x00\x00\x00\x00\x01\x00\x01\xea\x31\
+\x00\x00\x13\xa2\x00\x00\x00\x00\x00\x01\x00\x03\xe9\xce\
+\x00\x00\x1b\x5e\x00\x00\x00\x00\x00\x01\x00\x05\x37\xd5\
+\x00\x00\x1e\x48\x00\x00\x00\x00\x00\x01\x00\x05\xb8\xee\
+\x00\x00\x18\xe2\x00\x00\x00\x00\x00\x01\x00\x04\xcf\x62\
+\x00\x00\x0b\xea\x00\x00\x00\x00\x00\x01\x00\x02\xa1\x60\
+\x00\x00\x12\xfe\x00\x00\x00\x00\x00\x01\x00\x03\xd6\x94\
+\x00\x00\x1c\x74\x00\x00\x00\x00\x00\x01\x00\x05\x67\xf1\
+\x00\x00\x0a\xa4\x00\x00\x00\x00\x00\x01\x00\x02\x66\xb1\
+\x00\x00\x0b\xa0\x00\x00\x00\x00\x00\x01\x00\x02\x98\xb9\
+\x00\x00\x0b\x0e\x00\x00\x00\x00\x00\x01\x00\x02\x7d\xc2\
+\x00\x00\x1f\x04\x00\x00\x00\x00\x00\x01\x00\x05\xdb\xe8\
+\x00\x00\x19\x42\x00\x00\x00\x00\x00\x01\x00\x04\xdc\x29\
+\x00\x00\x0e\x10\x00\x00\x00\x00\x00\x01\x00\x03\x09\x2c\
+\x00\x00\x0b\x24\x00\x00\x00\x00\x00\x01\x00\x02\x83\x29\
+\x00\x00\x18\x9a\x00\x00\x00\x00\x00\x01\x00\x04\xc0\x63\
+\x00\x00\x0c\xcc\x00\x00\x00\x00\x00\x01\x00\x02\xcb\x42\
+\x00\x00\x0d\xe2\x00\x00\x00\x00\x00\x01\x00\x02\xfd\xdb\
+\x00\x00\x1e\xac\x00\x00\x00\x00\x00\x01\x00\x05\xce\x22\
+\x00\x00\x08\x64\x00\x00\x00\x00\x00\x01\x00\x02\x01\xa2\
+\x00\x00\x0f\x2c\x00\x00\x00\x00\x00\x01\x00\x03\x3b\xaa\
+\x00\x00\x0a\x5a\x00\x00\x00\x00\x00\x01\x00\x02\x56\x7f\
+\x00\x00\x1b\xc8\x00\x00\x00\x00\x00\x01\x00\x05\x4c\xd2\
+\x00\x00\x0d\xb0\x00\x00\x00\x00\x00\x01\x00\x02\xf3\x3c\
+\x00\x00\x13\x36\x00\x00\x00\x00\x00\x01\x00\x03\xe0\xd5\
+\x00\x00\x1b\x90\x00\x00\x00\x00\x00\x01\x00\x05\x43\xfc\
+\x00\x00\x1b\x48\x00\x00\x00\x00\x00\x01\x00\x05\x32\x10\
+\x00\x00\x0c\xb4\x00\x00\x00\x00\x00\x01\x00\x02\xc5\x9e\
+\x00\x00\x16\x48\x00\x00\x00\x00\x00\x01\x00\x04\x52\x9b\
+\x00\x00\x1d\xa6\x00\x00\x00\x00\x00\x01\x00\x05\x9b\x82\
+\x00\x00\x0c\x66\x00\x00\x00\x00\x00\x01\x00\x02\xb8\xb7\
+\x00\x00\x1a\x24\x00\x00\x00\x00\x00\x01\x00\x05\x03\xda\
+\x00\x00\x19\x2c\x00\x00\x00\x00\x00\x01\x00\x04\xd7\x68\
+\x00\x00\x1c\xf2\x00\x00\x00\x00\x00\x01\x00\x05\x80\x6f\
+\x00\x00\x10\xc4\x00\x00\x00\x00\x00\x01\x00\x03\x7e\x7d\
+\x00\x00\x10\x8c\x00\x00\x00\x00\x00\x01\x00\x03\x73\xba\
+\x00\x00\x1f\x24\x00\x00\x00\x00\x00\x01\x00\x05\xe0\x9c\
+\x00\x00\x10\x0e\x00\x00\x00\x00\x00\x01\x00\x03\x5f\xd1\
+\x00\x00\x17\xdc\x00\x00\x00\x00\x00\x01\x00\x04\x9b\xf2\
+\x00\x00\x18\xb0\x00\x00\x00\x00\x00\x01\x00\x04\xc4\x75\
+\x00\x00\x18\x46\x00\x00\x00\x00\x00\x01\x00\x04\xaf\x1c\
+\x00\x00\x0d\x1c\x00\x00\x00\x00\x00\x01\x00\x02\xdb\xe3\
+\x00\x00\x16\xb6\x00\x00\x00\x00\x00\x01\x00\x04\x64\x8d\
+\x00\x00\x11\x48\x00\x00\x00\x00\x00\x01\x00\x03\x96\xf2\
+\x00\x00\x10\x56\x00\x00\x00\x00\x00\x01\x00\x03\x6a\x30\
+\x00\x00\x0f\x06\x00\x00\x00\x00\x00\x01\x00\x03\x35\xad\
+\x00\x00\x18\x5c\x00\x00\x00\x00\x00\x01\x00\x04\xb4\x62\
+\x00\x00\x16\x2e\x00\x00\x00\x00\x00\x01\x00\x04\x4d\x15\
+\x00\x00\x0a\x42\x00\x00\x00\x00\x00\x01\x00\x02\x53\x4e\
+\x00\x00\x19\x9c\x00\x00\x00\x00\x00\x01\x00\x04\xe8\xd9\
+\x00\x00\x0c\xe4\x00\x00\x00\x00\x00\x01\x00\x02\xd1\xde\
+\x00\x00\x11\x62\x00\x00\x00\x00\x00\x01\x00\x03\x98\xd7\
+\x00\x00\x15\x6a\x00\x00\x00\x00\x00\x01\x00\x04\x30\x4f\
+\x00\x00\x17\xc6\x00\x00\x00\x00\x00\x01\x00\x04\x97\xcc\
+\x00\x00\x06\xd2\x00\x00\x00\x00\x00\x01\x00\x01\xab\x57\
+\x00\x00\x12\x10\x00\x00\x00\x00\x00\x01\x00\x03\xb4\x9a\
+\x00\x00\x0d\x8a\x00\x00\x00\x00\x00\x01\x00\x02\xed\x83\
+\x00\x00\x16\x04\x00\x00\x00\x00\x00\x01\x00\x04\x4a\x10\
+\x00\x00\x0f\xba\x00\x00\x00\x00\x00\x01\x00\x03\x50\x1b\
+\x00\x00\x1d\x4c\x00\x00\x00\x00\x00\x01\x00\x05\x8f\x1b\
+\x00\x00\x0f\x52\x00\x00\x00\x00\x00\x01\x00\x03\x3f\x23\
+\x00\x00\x17\x6e\x00\x00\x00\x00\x00\x01\x00\x04\x87\xb5\
+\x00\x00\x14\x10\x00\x00\x00\x00\x00\x01\x00\x03\xf9\xf8\
+\x00\x00\x0d\xcc\x00\x00\x00\x00\x00\x01\x00\x02\xf9\x1c\
+\x00\x00\x12\x9c\x00\x00\x00\x00\x00\x01\x00\x03\xc3\xb6\
+\x00\x00\x09\x20\x00\x00\x00\x00\x00\x01\x00\x02\x22\x98\
+\x00\x00\x0d\xf4\x00\x00\x00\x00\x00\x01\x00\x03\x02\x4e\
+\x00\x00\x0e\x56\x00\x00\x00\x00\x00\x01\x00\x03\x18\xfb\
+\x00\x00\x09\xf4\x00\x00\x00\x00\x00\x01\x00\x02\x40\xd1\
+\x00\x00\x17\x30\x00\x00\x00\x00\x00\x01\x00\x04\x7b\x3f\
+\x00\x00\x07\x8e\x00\x00\x00\x00\x00\x01\x00\x01\xd4\x97\
+\x00\x00\x19\xf8\x00\x00\x00\x00\x00\x01\x00\x04\xf9\xa6\
+\x00\x00\x1a\x7e\x00\x00\x00\x00\x00\x01\x00\x05\x0f\x2f\
+\x00\x00\x1e\x5a\x00\x00\x00\x00\x00\x01\x00\x05\xbe\xb3\
+\x00\x00\x0a\x8e\x00\x00\x00\x00\x00\x01\x00\x02\x61\x35\
+\x00\x00\x13\xc2\x00\x00\x00\x00\x00\x01\x00\x03\xed\xdb\
+\x00\x00\x08\xc2\x00\x00\x00\x00\x00\x01\x00\x02\x14\x0a\
+\x00\x00\x1a\x10\x00\x00\x00\x00\x00\x01\x00\x04\xfe\x48\
+\x00\x00\x15\x88\x00\x00\x00\x00\x00\x01\x00\x04\x34\x0c\
+\x00\x00\x0f\x68\x00\x00\x00\x00\x00\x01\x00\x03\x44\x3b\
+\x00\x00\x14\x2c\x00\x00\x00\x00\x00\x01\x00\x03\xfd\xea\
+\x00\x00\x0c\x7c\x00\x00\x00\x00\x00\x01\x00\x02\xbc\x98\
+\x00\x00\x0f\xd4\x00\x00\x00\x00\x00\x01\x00\x03\x57\x29\
+\x00\x00\x0a\x70\x00\x00\x00\x00\x00\x01\x00\x02\x5d\x06\
+\x00\x00\x11\xdc\x00\x00\x00\x00\x00\x01\x00\x03\xa9\xfe\
+\x00\x00\x12\x3e\x00\x00\x00\x00\x00\x01\x00\x03\xb6\xd3\
+\x00\x00\x15\x50\x00\x00\x00\x00\x00\x01\x00\x04\x2c\xdc\
+\x00\x00\x10\xde\x00\x00\x00\x00\x00\x01\x00\x03\x84\x97\
+\x00\x00\x07\x7a\x00\x00\x00\x00\x00\x01\x00\x01\xce\x7e\
+\x00\x00\x15\xbc\x00\x00\x00\x00\x00\x01\x00\x04\x3e\xa3\
+\x00\x00\x0d\x04\x00\x00\x00\x00\x00\x01\x00\x02\xd6\x65\
+\x00\x00\x1c\xda\x00\x00\x00\x00\x00\x01\x00\x05\x7a\x71\
+\x00\x00\x0d\x56\x00\x00\x00\x00\x00\x01\x00\x02\xe5\xea\
+\x00\x00\x12\x80\x00\x00\x00\x00\x00\x01\x00\x03\xbf\xd2\
+\x00\x00\x07\xc4\x00\x00\x00\x00\x00\x01\x00\x01\xe0\xcc\
+\x00\x00\x1b\xa6\x00\x00\x00\x00\x00\x01\x00\x05\x49\x28\
+\x00\x00\x1e\x72\x00\x00\x00\x00\x00\x01\x00\x05\xc3\xe2\
+\x00\x00\x11\x2e\x00\x00\x00\x00\x00\x01\x00\x03\x92\x8a\
+\x00\x00\x1e\x2c\x00\x00\x00\x00\x00\x01\x00\x05\xb3\xe8\
+\x00\x00\x08\xdc\x00\x00\x00\x00\x00\x01\x00\x02\x19\x9f\
+\x00\x00\x1c\x94\x00\x00\x00\x00\x00\x01\x00\x05\x6d\x6a\
+\x00\x00\x1c\xc6\x00\x00\x00\x00\x00\x01\x00\x05\x76\xbc\
+\x00\x00\x12\xd0\x00\x00\x00\x00\x00\x01\x00\x03\xcb\xc3\
+\x00\x00\x08\x3a\x00\x00\x00\x00\x00\x01\x00\x01\xf7\xf7\
+\x00\x00\x15\x18\x00\x00\x00\x00\x00\x01\x00\x04\x23\xe3\
+\x00\x00\x13\xdc\x00\x00\x00\x00\x00\x01\x00\x03\xf1\xc2\
+\x00\x00\x13\xf6\x00\x00\x00\x00\x00\x01\x00\x03\xf6\x07\
+\x00\x00\x0b\x80\x00\x00\x00\x00\x00\x01\x00\x02\x93\xc2\
+\x00\x00\x08\x94\x00\x00\x00\x00\x00\x01\x00\x02\x0c\x1d\
+\x00\x00\x1a\xd6\x00\x00\x00\x00\x00\x01\x00\x05\x1e\x18\
+\x00\x00\x06\xf8\x00\x00\x00\x00\x00\x01\x00\x01\xb4\x8a\
+\x00\x00\x14\x70\x00\x00\x00\x00\x00\x01\x00\x04\x08\x43\
+\x00\x00\x08\x0a\x00\x00\x00\x00\x00\x01\x00\x01\xef\xd7\
+\x00\x00\x16\x80\x00\x00\x00\x00\x00\x01\x00\x04\x5a\x70\
+\x00\x00\x1b\x1c\x00\x00\x00\x00\x00\x01\x00\x05\x26\x9a\
+\x00\x00\x0d\x34\x00\x00\x00\x00\x00\x01\x00\x02\xe1\x19\
+\x00\x00\x1a\x5e\x00\x00\x00\x00\x00\x01\x00\x05\x0b\xcd\
+\x00\x00\x17\xae\x00\x00\x00\x00\x00\x01\x00\x04\x92\x16\
+\x00\x00\x16\xea\x00\x00\x00\x00\x00\x01\x00\x04\x6e\x3a\
+\x00\x00\x10\x6c\x00\x00\x00\x00\x00\x01\x00\x03\x6e\x65\
+\x00\x00\x1a\x96\x00\x00\x00\x00\x00\x01\x00\x05\x14\x54\
+\x00\x00\x14\xf8\x00\x00\x00\x00\x00\x01\x00\x04\x1f\x9f\
+\x00\x00\x16\x62\x00\x00\x00\x00\x00\x01\x00\x04\x56\xe3\
+\x00\x00\x0a\x26\x00\x00\x00\x00\x00\x01\x00\x02\x4d\x03\
+\x00\x00\x1e\x12\x00\x00\x00\x00\x00\x01\x00\x05\xae\x9b\
+\x00\x00\x0b\x64\x00\x00\x00\x00\x00\x01\x00\x02\x8e\x18\
+\x00\x00\x19\xc2\x00\x00\x00\x00\x00\x01\x00\x04\xee\xac\
+\x00\x00\x09\x3a\x00\x00\x00\x00\x00\x01\x00\x02\x27\x4c\
+\x00\x00\x1c\xac\x00\x00\x00\x00\x00\x01\x00\x05\x72\x9a\
+\x00\x00\x18\xca\x00\x00\x00\x00\x00\x01\x00\x04\xc9\x24\
+\x00\x00\x1f\x78\x00\x00\x00\x00\x00\x01\x00\x05\xf1\x22\
+\x00\x00\x14\x48\x00\x00\x00\x00\x00\x01\x00\x04\x03\xb0\
+\x00\x00\x14\xcc\x00\x00\x00\x00\x00\x01\x00\x04\x15\xfd\
+\x00\x00\x1e\x94\x00\x00\x00\x00\x00\x01\x00\x05\xc9\xa2\
+\x00\x00\x0a\x0e\x00\x00\x00\x00\x00\x01\x00\x02\x46\xa7\
+\x00\x00\x18\x2e\x00\x00\x00\x00\x00\x01\x00\x04\xab\xca\
+\x00\x00\x11\x7e\x00\x00\x00\x00\x00\x01\x00\x03\x9b\x61\
+\x00\x00\x19\x12\x00\x00\x00\x00\x00\x01\x00\x04\xd2\x01\
+\x00\x00\x1c\x2a\x00\x00\x00\x00\x00\x01\x00\x05\x5a\xd6\
+\x00\x00\x0e\x76\x00\x00\x00\x00\x00\x01\x00\x03\x1c\xec\
+\x00\x00\x15\xe2\x00\x00\x00\x00\x00\x01\x00\x04\x43\x79\
+\x00\x00\x17\x1a\x00\x00\x00\x00\x00\x01\x00\x04\x76\xbc\
+\x00\x00\x14\xe2\x00\x00\x00\x00\x00\x01\x00\x04\x1a\xb7\
+\x00\x00\x0a\xfa\x00\x00\x00\x00\x00\x01\x00\x02\x78\x67\
+\x00\x00\x08\x7c\x00\x00\x00\x00\x00\x01\x00\x02\x07\x00\
+\x00\x00\x1b\x74\x00\x00\x00\x00\x00\x01\x00\x05\x3d\x98\
+\x00\x00\x1d\x12\x00\x00\x00\x00\x00\x01\x00\x05\x85\x3f\
+\x00\x00\x13\x7c\x00\x00\x00\x00\x00\x01\x00\x03\xe8\x94\
+\x00\x00\x18\x10\x00\x00\x00\x00\x00\x01\x00\x04\xa6\x05\
+\x00\x00\x11\x94\x00\x00\x00\x00\x00\x01\x00\x03\xa0\xa8\
+\x00\x00\x11\x0e\x00\x00\x00\x00\x00\x01\x00\x03\x8e\xc4\
+\x00\x00\x17\x4a\x00\x00\x00\x00\x00\x01\x00\x04\x82\x6e\
+\x00\x00\x13\x5c\x00\x00\x00\x00\x00\x01\x00\x03\xe5\x32\
+\x00\x00\x17\xf6\x00\x00\x00\x00\x00\x01\x00\x04\x9f\xe1\
+\x00\x00\x07\xdc\x00\x00\x00\x00\x00\x01\x00\x01\xe4\xdf\
+\x00\x00\x18\x78\x00\x00\x00\x00\x00\x01\x00\x04\xba\x12\
+\x00\x00\x0b\xfc\x00\x00\x00\x00\x00\x01\x00\x02\xa7\x90\
+\x00\x00\x1d\xf4\x00\x00\x00\x00\x00\x01\x00\x05\xa8\xf8\
+\x00\x00\x0e\xec\x00\x00\x00\x00\x00\x01\x00\x03\x30\xef\
+\x00\x00\x19\x5c\x00\x00\x00\x00\x00\x01\x00\x04\xdf\xd5\
+\x00\x00\x0e\x96\x00\x00\x00\x00\x00\x01\x00\x03\x21\x26\
+\x00\x00\x16\x94\x00\x00\x00\x00\x00\x01\x00\x04\x5d\xb5\
+\x00\x00\x07\x60\x00\x00\x00\x00\x00\x01\x00\x01\xc9\x07\
+\x00\x00\x13\x20\x00\x00\x00\x00\x00\x01\x00\x03\xdc\x06\
+\x00\x00\x09\x08\x00\x00\x00\x00\x00\x01\x00\x02\x1d\x05\
+\x00\x00\x0e\x42\x00\x00\x00\x00\x00\x01\x00\x03\x15\x5c\
+\x00\x00\x1d\x90\x00\x00\x00\x00\x00\x01\x00\x05\x96\xae\
+\x00\x00\x17\x00\x00\x00\x00\x00\x00\x01\x00\x04\x73\x07\
+\x00\x00\x08\x24\x00\x00\x00\x00\x00\x01\x00\x01\xf3\x92\
+\x00\x00\x1a\x40\x00\x00\x00\x00\x00\x01\x00\x05\x07\xd9\
+\x00\x00\x0e\xac\x00\x00\x00\x00\x00\x01\x00\x03\x25\xa4\
+"
+
+qt_resource_struct_v2 = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x12\x00\x02\x00\x00\x00\xe3\x00\x00\x00\x64\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x60\x00\x00\x00\x04\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x3e\x15\
+\x00\x00\x01\x6a\x98\x57\x87\xe9\
+\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x3a\x4e\
+\x00\x00\x01\x6a\x98\x57\x87\xf7\
+\x00\x00\x05\x18\x00\x00\x00\x00\x00\x01\x00\x01\x3c\x9c\
+\x00\x00\x01\x6a\x98\x57\x88\x03\
+\x00\x00\x06\x10\x00\x00\x00\x00\x00\x01\x00\x01\x79\x9f\
+\x00\x00\x01\x6a\x98\x57\x88\x11\
+\x00\x00\x06\x20\x00\x00\x00\x00\x00\x01\x00\x01\x7d\xca\
+\x00\x00\x01\x6a\x98\x57\x88\x21\
+\x00\x00\x05\x70\x00\x00\x00\x00\x00\x01\x00\x01\x4f\xd4\
+\x00\x00\x01\x6a\x98\x57\x88\x2f\
+\x00\x00\x04\x9c\x00\x00\x00\x00\x00\x01\x00\x01\x1d\x32\
+\x00\x00\x01\x6a\x98\x57\x88\x3d\
+\x00\x00\x01\x86\x00\x00\x00\x00\x00\x01\x00\x00\x57\x85\
+\x00\x00\x01\x6a\x98\x57\x88\x4a\
+\x00\x00\x03\x48\x00\x00\x00\x00\x00\x01\x00\x00\xc1\xc5\
+\x00\x00\x01\x6a\x98\x57\x88\x58\
+\x00\x00\x02\xca\x00\x00\x00\x00\x00\x01\x00\x00\xa5\xae\
+\x00\x00\x01\x6a\x98\x57\x87\xea\
+\x00\x00\x04\xbe\x00\x00\x00\x00\x00\x01\x00\x01\x27\x88\
+\x00\x00\x01\x6a\x98\x57\x87\xec\
+\x00\x00\x03\x36\x00\x00\x00\x00\x00\x01\x00\x00\xbe\xdb\
+\x00\x00\x01\x6a\x98\x57\x87\xed\
+\x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x01\x06\x7f\
+\x00\x00\x01\x6a\x98\x57\x87\xee\
+\x00\x00\x02\x94\x00\x00\x00\x00\x00\x01\x00\x00\x9b\x9a\
+\x00\x00\x01\x6a\x98\x57\x87\xef\
+\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x01\x00\x00\x27\xfc\
+\x00\x00\x01\x6a\x98\x57\x87\xf0\
+\x00\x00\x05\xec\x00\x00\x00\x00\x00\x01\x00\x01\x6f\x95\
+\x00\x00\x01\x6a\x98\x57\x87\xf2\
+\x00\x00\x03\xfa\x00\x00\x00\x00\x00\x01\x00\x00\xf4\xdd\
+\x00\x00\x01\x6a\x98\x57\x87\xf3\
+\x00\x00\x03\x8e\x00\x00\x00\x00\x00\x01\x00\x00\xd6\xce\
+\x00\x00\x01\x6a\x98\x57\x87\xf4\
+\x00\x00\x00\x46\x00\x00\x00\x00\x00\x01\x00\x00\x07\x8e\
+\x00\x00\x01\x6a\x98\x57\x87\xf5\
+\x00\x00\x06\x8a\x00\x00\x00\x00\x00\x01\x00\x01\x9a\x7d\
+\x00\x00\x01\x6a\x98\x57\x87\xf8\
+\x00\x00\x01\x50\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x7a\
+\x00\x00\x01\x6a\x98\x57\x87\xf9\
+\x00\x00\x05\x5e\x00\x00\x00\x00\x00\x01\x00\x01\x4b\xee\
+\x00\x00\x01\x6a\x98\x57\x87\xfa\
+\x00\x00\x02\xb8\x00\x00\x00\x00\x00\x01\x00\x00\xa1\x5b\
+\x00\x00\x01\x6a\x98\x57\x87\xfc\
+\x00\x00\x02\xa6\x00\x00\x00\x00\x00\x01\x00\x00\x9d\x17\
+\x00\x00\x01\x6a\x98\x57\x87\xfd\
+\x00\x00\x01\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x72\xab\
+\x00\x00\x01\x6a\x98\x57\x87\xfe\
+\x00\x00\x03\xd6\x00\x00\x00\x00\x00\x01\x00\x00\xea\x9d\
+\x00\x00\x01\x6a\x98\x57\x87\xff\
+\x00\x00\x04\x0c\x00\x00\x00\x00\x00\x01\x00\x00\xf9\xb0\
+\x00\x00\x01\x6a\x98\x57\x88\x00\
+\x00\x00\x04\x54\x00\x00\x00\x00\x00\x01\x00\x01\x0a\x74\
+\x00\x00\x01\x6a\x98\x57\x88\x02\
+\x00\x00\x02\x82\x00\x00\x00\x00\x00\x01\x00\x00\x96\x20\
+\x00\x00\x01\x6a\x98\x57\x88\x04\
+\x00\x00\x05\x3a\x00\x00\x00\x00\x00\x01\x00\x01\x44\x2a\
+\x00\x00\x01\x6a\x98\x57\x88\x05\
+\x00\x00\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\xb4\xd3\
+\x00\x00\x01\x6a\x98\x57\x88\x06\
+\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x1e\x9b\
+\x00\x00\x01\x6a\x98\x57\x88\x08\
+\x00\x00\x04\xf4\x00\x00\x00\x00\x00\x01\x00\x01\x33\x13\
+\x00\x00\x01\x6a\x98\x57\x88\x09\
+\x00\x00\x06\x30\x00\x00\x00\x00\x00\x01\x00\x01\x83\xb1\
+\x00\x00\x01\x6a\x98\x57\x88\x0a\
+\x00\x00\x04\xac\x00\x00\x00\x00\x00\x01\x00\x01\x22\xfb\
+\x00\x00\x01\x6a\x98\x57\x88\x0b\
+\x00\x00\x01\xba\x00\x00\x00\x00\x00\x01\x00\x00\x64\x78\
+\x00\x00\x01\x6a\x98\x57\x88\x0d\
+\x00\x00\x03\x6a\x00\x00\x00\x00\x00\x01\x00\x00\xcb\xe0\
+\x00\x00\x01\x6a\x98\x57\x88\x0e\
+\x00\x00\x06\x66\x00\x00\x00\x00\x00\x01\x00\x01\x92\x04\
+\x00\x00\x01\x6a\x98\x57\x88\x10\
+\x00\x00\x01\x74\x00\x00\x00\x00\x00\x01\x00\x00\x54\x33\
+\x00\x00\x01\x6a\x98\x57\x88\x12\
+\x00\x00\x02\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x8e\x55\
+\x00\x00\x01\x6a\x98\x57\x88\x14\
+\x00\x00\x05\xda\x00\x00\x00\x00\x00\x01\x00\x01\x6b\x40\
+\x00\x00\x01\x6a\x98\x57\x88\x15\
+\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x24\x10\
+\x00\x00\x01\x6a\x98\x57\x88\x18\
+\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x16\x30\
+\x00\x00\x01\x6a\x98\x57\x88\x19\
+\x00\x00\x03\x12\x00\x00\x00\x00\x00\x01\x00\x00\xb6\x38\
+\x00\x00\x01\x6a\x98\x57\x88\x1a\
+\x00\x00\x01\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x41\xe3\
+\x00\x00\x01\x6a\x98\x57\x88\x1b\
+\x00\x00\x04\x30\x00\x00\x00\x00\x00\x01\x00\x01\x02\x45\
+\x00\x00\x01\x6a\x98\x57\x88\x1d\
+\x00\x00\x05\xc8\x00\x00\x00\x00\x00\x01\x00\x01\x67\x1b\
+\x00\x00\x01\x6a\x98\x57\x88\x1e\
+\x00\x00\x05\x06\x00\x00\x00\x00\x00\x01\x00\x01\x37\x6f\
+\x00\x00\x01\x6a\x98\x57\x88\x20\
+\x00\x00\x04\x78\x00\x00\x00\x00\x00\x01\x00\x01\x14\x07\
+\x00\x00\x01\x6a\x98\x57\x88\x22\
+\x00\x00\x03\xa0\x00\x00\x00\x00\x00\x01\x00\x00\xdd\x21\
+\x00\x00\x01\x6a\x98\x57\x88\x24\
+\x00\x00\x02\x14\x00\x00\x00\x00\x00\x01\x00\x00\x7c\x9f\
+\x00\x00\x01\x6a\x98\x57\x88\x25\
+\x00\x00\x04\xe2\x00\x00\x00\x00\x00\x01\x00\x01\x2f\xe8\
+\x00\x00\x01\x6a\x98\x57\x88\x26\
+\x00\x00\x05\x28\x00\x00\x00\x00\x00\x01\x00\x01\x40\xfe\
+\x00\x00\x01\x6a\x98\x57\x88\x27\
+\x00\x00\x05\x4c\x00\x00\x00\x00\x00\x01\x00\x01\x48\xe8\
+\x00\x00\x01\x6a\x98\x57\x88\x28\
+\x00\x00\x01\x96\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x38\
+\x00\x00\x01\x6a\x98\x57\x88\x2a\
+\x00\x00\x00\x22\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01\x6a\x98\x57\x88\x2b\
+\x00\x00\x04\x1e\x00\x00\x00\x00\x00\x01\x00\x00\xfd\xff\
+\x00\x00\x01\x6a\x98\x57\x88\x2c\
+\x00\x00\x06\xc0\x00\x00\x00\x00\x00\x01\x00\x01\xa7\xe8\
+\x00\x00\x01\x6a\x98\x57\x88\x2d\
+\x00\x00\x01\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x46\x75\
+\x00\x00\x01\x6a\x98\x57\x88\x30\
+\x00\x00\x02\xee\x00\x00\x00\x00\x00\x01\x00\x00\xb0\x5d\
+\x00\x00\x01\x6a\x98\x57\x88\x31\
+\x00\x00\x03\x24\x00\x00\x00\x00\x00\x01\x00\x00\xba\xec\
+\x00\x00\x01\x6a\x98\x57\x88\x32\
+\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x2c\x65\
+\x00\x00\x01\x6a\x98\x57\x88\x34\
+\x00\x00\x02\x26\x00\x00\x00\x00\x00\x01\x00\x00\x80\xa6\
+\x00\x00\x01\x6a\x98\x57\x88\x35\
+\x00\x00\x06\x9c\x00\x00\x00\x00\x00\x01\x00\x01\x9e\xf3\
+\x00\x00\x01\x6a\x98\x57\x88\x36\
+\x00\x00\x03\x7c\x00\x00\x00\x00\x00\x01\x00\x00\xd0\x16\
+\x00\x00\x01\x6a\x98\x57\x88\x38\
+\x00\x00\x04\xd0\x00\x00\x00\x00\x00\x01\x00\x01\x2b\xa2\
+\x00\x00\x01\x6a\x98\x57\x88\x39\
+\x00\x00\x06\xae\x00\x00\x00\x00\x00\x01\x00\x01\xa3\x56\
+\x00\x00\x01\x6a\x98\x57\x88\x3a\
+\x00\x00\x05\xa4\x00\x00\x00\x00\x00\x01\x00\x01\x5d\xa8\
+\x00\x00\x01\x6a\x98\x57\x88\x3b\
+\x00\x00\x06\x42\x00\x00\x00\x00\x00\x01\x00\x01\x88\x49\
+\x00\x00\x01\x6a\x98\x57\x88\x3e\
+\x00\x00\x03\xb2\x00\x00\x00\x00\x00\x01\x00\x00\xe2\xed\
+\x00\x00\x01\x6a\x98\x57\x88\x3f\
+\x00\x00\x01\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x68\x71\
+\x00\x00\x01\x6a\x98\x57\x88\x40\
+\x00\x00\x03\xc4\x00\x00\x00\x00\x00\x01\x00\x00\xe7\x03\
+\x00\x00\x01\x6a\x98\x57\x88\x41\
+\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x30\x01\
+\x00\x00\x01\x6a\x98\x57\x88\x42\
+\x00\x00\x05\xfe\x00\x00\x00\x00\x00\x01\x00\x01\x73\xd7\
+\x00\x00\x01\x6a\x98\x57\x88\x43\
+\x00\x00\x03\xe8\x00\x00\x00\x00\x00\x01\x00\x00\xef\x27\
+\x00\x00\x01\x6a\x98\x57\x88\x45\
+\x00\x00\x05\xb6\x00\x00\x00\x00\x00\x01\x00\x01\x60\xcc\
+\x00\x00\x01\x6a\x98\x57\x88\x46\
+\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xf2\
+\x00\x00\x01\x6a\x98\x57\x88\x47\
+\x00\x00\x06\x78\x00\x00\x00\x00\x00\x01\x00\x01\x96\x4c\
+\x00\x00\x01\x6a\x98\x57\x88\x48\
+\x00\x00\x05\x80\x00\x00\x00\x00\x00\x01\x00\x01\x55\xb2\
+\x00\x00\x01\x6a\x98\x57\x88\x4b\
+\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x35\x5a\
+\x00\x00\x01\x6a\x98\x57\x88\x4c\
+\x00\x00\x02\x38\x00\x00\x00\x00\x00\x01\x00\x00\x84\xb2\
+\x00\x00\x01\x6a\x98\x57\x88\x4e\
+\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x12\x27\
+\x00\x00\x01\x6a\x98\x57\x88\x4f\
+\x00\x00\x00\x58\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xe0\
+\x00\x00\x01\x6a\x98\x57\x88\x50\
+\x00\x00\x01\x62\x00\x00\x00\x00\x00\x01\x00\x00\x50\x34\
+\x00\x00\x01\x6a\x98\x57\x88\x52\
+\x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x00\x92\x01\
+\x00\x00\x01\x6a\x98\x57\x88\x53\
+\x00\x00\x02\xdc\x00\x00\x00\x00\x00\x01\x00\x00\xab\x84\
+\x00\x00\x01\x6a\x98\x57\x88\x54\
+\x00\x00\x06\x54\x00\x00\x00\x00\x00\x01\x00\x01\x8d\x61\
+\x00\x00\x01\x6a\x98\x57\x88\x55\
+\x00\x00\x01\xa8\x00\x00\x00\x00\x00\x01\x00\x00\x60\x19\
+\x00\x00\x01\x6a\x98\x57\x88\x56\
+\x00\x00\x04\x66\x00\x00\x00\x00\x00\x01\x00\x01\x0f\xa8\
+\x00\x00\x01\x6a\x98\x57\x88\x59\
+\x00\x00\x03\x58\x00\x00\x00\x00\x00\x01\x00\x00\xc7\xb6\
+\x00\x00\x01\x6a\x98\x57\x88\x5a\
+\x00\x00\x05\x92\x00\x00\x00\x00\x00\x01\x00\x01\x59\x4b\
+\x00\x00\x01\x6a\x98\x57\x88\x5b\
+\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x02\xc2\
+\x00\x00\x01\x6a\x98\x57\x88\x5e\
+\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\x6c\xa9\
+\x00\x00\x01\x6a\x98\x57\x88\x5f\
+\x00\x00\x04\x8a\x00\x00\x00\x00\x00\x01\x00\x01\x17\xb7\
+\x00\x00\x01\x6a\x98\x57\x88\x60\
+\x00\x00\x02\x02\x00\x00\x00\x00\x00\x01\x00\x00\x76\xea\
+\x00\x00\x01\x6a\x98\x57\x88\x62\
+\x00\x00\x02\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x88\xb4\
+\x00\x00\x01\x6a\x98\x57\x88\x17\
+\x00\x00\x10\x2a\x00\x00\x00\x00\x00\x01\x00\x03\x63\xd8\
+\x00\x00\x01\x6a\x98\x57\x87\x41\
+\x00\x00\x16\xcc\x00\x00\x00\x00\x00\x01\x00\x04\x68\xac\
+\x00\x00\x01\x6a\x98\x57\x86\xdb\
+\x00\x00\x10\xf6\x00\x00\x00\x00\x00\x01\x00\x03\x88\xe4\
+\x00\x00\x01\x6a\x98\x57\x87\x68\
+\x00\x00\x07\x34\x00\x00\x00\x00\x00\x01\x00\x01\xbf\x17\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x0b\x3e\x00\x00\x00\x00\x00\x01\x00\x02\x87\x9f\
+\x00\x00\x01\x6a\x98\x57\x87\x36\
+\x00\x00\x11\xc6\x00\x00\x00\x00\x00\x01\x00\x03\xa3\x87\
+\x00\x00\x01\x6a\x98\x57\x87\x70\
+\x00\x00\x12\xe8\x00\x00\x00\x00\x00\x01\x00\x03\xd1\xa3\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x09\xda\x00\x00\x00\x00\x00\x01\x00\x02\x3a\xcc\
+\x00\x00\x01\x6a\x98\x57\x87\x5c\
+\x00\x00\x07\x4a\x00\x00\x00\x00\x00\x01\x00\x01\xc3\xaa\
+\x00\x00\x01\x6a\x98\x57\x86\xf2\
+\x00\x00\x09\x58\x00\x00\x00\x00\x00\x01\x00\x02\x2c\x33\
+\x00\x00\x01\x6a\x98\x57\x87\x44\
+\x00\x00\x0e\x28\x00\x00\x00\x00\x00\x01\x00\x03\x0f\xd7\
+\x00\x00\x01\x6a\x98\x57\x87\x3c\
+\x00\x00\x1d\xda\x00\x00\x00\x00\x00\x01\x00\x05\xa4\xd8\
+\x00\x00\x01\x6a\x98\x57\x87\x61\
+\x00\x00\x19\xd8\x00\x00\x00\x00\x00\x01\x00\x04\xf4\xd9\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x0d\x6a\x00\x00\x00\x00\x00\x01\x00\x02\xe9\x69\
+\x00\x00\x01\x6a\x98\x57\x87\x7f\
+\x00\x00\x0f\x84\x00\x00\x00\x00\x00\x01\x00\x03\x49\x74\
+\x00\x00\x01\x6a\x98\x57\x87\x4b\
+\x00\x00\x10\xa4\x00\x00\x00\x00\x00\x01\x00\x03\x79\x54\
+\x00\x00\x01\x6a\x98\x57\x86\x96\
+\x00\x00\x1c\x46\x00\x00\x00\x00\x00\x01\x00\x05\x5d\xfb\
+\x00\x00\x01\x6a\x98\x57\x87\x0c\
+\x00\x00\x0a\xda\x00\x00\x00\x00\x00\x01\x00\x02\x72\x2c\
+\x00\x00\x01\x6a\x98\x57\x87\x49\
+\x00\x00\x15\x34\x00\x00\x00\x00\x00\x01\x00\x04\x28\x33\
+\x00\x00\x01\x6a\x98\x57\x87\x92\
+\x00\x00\x1d\xbc\x00\x00\x00\x00\x00\x01\x00\x05\xa0\x5d\
+\x00\x00\x01\x6a\x98\x57\x87\x2a\
+\x00\x00\x19\x80\x00\x00\x00\x00\x00\x01\x00\x04\xe4\x26\
+\x00\x00\x01\x6a\x98\x57\x86\x8a\
+\x00\x00\x07\xa6\x00\x00\x00\x00\x00\x01\x00\x01\xdb\x5e\
+\x00\x00\x01\x6a\x98\x57\x86\x6a\
+\x00\x00\x12\xb2\x00\x00\x00\x00\x00\x01\x00\x03\xc7\x85\
+\x00\x00\x01\x6a\x98\x57\x87\x51\
+\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x01\x00\x03\x5b\xf3\
+\x00\x00\x01\x6a\x98\x57\x86\x7b\
+\x00\x00\x1a\xfe\x00\x00\x00\x00\x00\x01\x00\x05\x22\x67\
+\x00\x00\x01\x6a\x98\x57\x86\x9e\
+\x00\x00\x08\xae\x00\x00\x00\x00\x00\x01\x00\x02\x0f\xb7\
+\x00\x00\x01\x6a\x98\x57\x87\x00\
+\x00\x00\x09\x70\x00\x00\x00\x00\x00\x01\x00\x02\x30\x03\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x1e\xe8\x00\x00\x00\x00\x00\x01\x00\x05\xd9\x15\
+\x00\x00\x01\x6a\x98\x57\x87\x46\
+\x00\x00\x12\x64\x00\x00\x00\x00\x00\x01\x00\x03\xbb\x50\
+\x00\x00\x01\x6a\x98\x57\x86\xa7\
+\x00\x00\x0c\x92\x00\x00\x00\x00\x00\x01\x00\x02\xc1\xae\
+\x00\x00\x01\x6a\x98\x57\x87\x98\
+\x00\x00\x14\x92\x00\x00\x00\x00\x00\x01\x00\x04\x0d\xf4\
+\x00\x00\x01\x6a\x98\x57\x87\x7b\
+\x00\x00\x0c\x1e\x00\x00\x00\x00\x00\x01\x00\x02\xab\x7a\
+\x00\x00\x01\x6a\x98\x57\x86\x66\
+\x00\x00\x17\x88\x00\x00\x00\x00\x00\x01\x00\x04\x8b\xd8\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x1d\x7a\x00\x00\x00\x00\x00\x01\x00\x05\x93\x3d\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x1d\x32\x00\x00\x00\x00\x00\x01\x00\x05\x89\xb8\
+\x00\x00\x01\x6a\x98\x57\x86\xa9\
+\x00\x00\x1f\x62\x00\x00\x00\x00\x00\x01\x00\x05\xeb\x3d\
+\x00\x00\x01\x6a\x98\x57\x87\x3e\
+\x00\x00\x14\xb2\x00\x00\x00\x00\x00\x01\x00\x04\x12\x74\
+\x00\x00\x01\x6a\x98\x57\x87\x91\
+\x00\x00\x1e\xca\x00\x00\x00\x00\x00\x01\x00\x05\xd3\x08\
+\x00\x00\x01\x6a\x98\x57\x87\x60\
+\x00\x00\x1f\x3c\x00\x00\x00\x00\x00\x01\x00\x05\xe5\xc2\
+\x00\x00\x01\x6a\x98\x57\x87\x77\
+\x00\x00\x0a\xb6\x00\x00\x00\x00\x00\x01\x00\x02\x6c\xcb\
+\x00\x00\x01\x6a\x98\x57\x87\x6a\
+\x00\x00\x1b\x32\x00\x00\x00\x00\x00\x01\x00\x05\x2b\xf2\
+\x00\x00\x01\x6a\x98\x57\x86\x72\
+\x00\x00\x15\x9e\x00\x00\x00\x00\x00\x01\x00\x04\x39\xa0\
+\x00\x00\x01\x6a\x98\x57\x86\x79\
+\x00\x00\x1b\xf2\x00\x00\x00\x00\x00\x01\x00\x05\x50\xbf\
+\x00\x00\x01\x6a\x98\x57\x86\x97\
+\x00\x00\x09\x94\x00\x00\x00\x00\x00\x01\x00\x02\x33\x4f\
+\x00\x00\x01\x6a\x98\x57\x87\x4f\
+\x00\x00\x0f\x9c\x00\x00\x00\x00\x00\x01\x00\x03\x4c\xe1\
+\x00\x00\x01\x6a\x98\x57\x86\xa6\
+\x00\x00\x1a\xb8\x00\x00\x00\x00\x00\x01\x00\x05\x18\x50\
+\x00\x00\x01\x6a\x98\x57\x86\x89\
+\x00\x00\x11\xf4\x00\x00\x00\x00\x00\x01\x00\x03\xae\x09\
+\x00\x00\x01\x6a\x98\x57\x87\x66\
+\x00\x00\x0e\xcc\x00\x00\x00\x00\x00\x01\x00\x03\x2b\x1f\
+\x00\x00\x01\x6a\x98\x57\x86\xe4\
+\x00\x00\x06\xe6\x00\x00\x00\x00\x00\x01\x00\x01\xae\x5d\
+\x00\x00\x01\x6a\x98\x57\x86\x86\
+\x00\x00\x09\xb2\x00\x00\x00\x00\x00\x01\x00\x02\x37\x11\
+\x00\x00\x01\x6a\x98\x57\x87\x65\
+\x00\x00\x0c\x42\x00\x00\x00\x00\x00\x01\x00\x02\xb1\xc2\
+\x00\x00\x01\x6a\x98\x57\x86\x5f\
+\x00\x00\x07\x1a\x00\x00\x00\x00\x00\x01\x00\x01\xba\xd2\
+\x00\x00\x01\x6a\x98\x57\x87\x93\
+\x00\x00\x0b\xc2\x00\x00\x00\x00\x00\x01\x00\x02\x9d\x69\
+\x00\x00\x01\x6a\x98\x57\x86\x74\
+\x00\x00\x08\x4e\x00\x00\x00\x00\x00\x01\x00\x01\xfc\xd2\
+\x00\x00\x01\x6a\x98\x57\x87\x85\
+\x00\x00\x1c\x10\x00\x00\x00\x00\x00\x01\x00\x05\x55\x22\
+\x00\x00\x01\x6a\x98\x57\x86\xf9\
+\x00\x00\x1c\x5c\x00\x00\x00\x00\x00\x01\x00\x05\x62\x7f\
+\x00\x00\x01\x6a\x98\x57\x87\x09\
+\x00\x00\x07\xf6\x00\x00\x00\x00\x00\x01\x00\x01\xea\x31\
+\x00\x00\x01\x6a\x98\x57\x87\x26\
+\x00\x00\x13\xa2\x00\x00\x00\x00\x00\x01\x00\x03\xe9\xce\
+\x00\x00\x01\x6a\x98\x57\x86\x70\
+\x00\x00\x1b\x5e\x00\x00\x00\x00\x00\x01\x00\x05\x37\xd5\
+\x00\x00\x01\x6a\x98\x57\x86\xfd\
+\x00\x00\x1e\x48\x00\x00\x00\x00\x00\x01\x00\x05\xb8\xee\
+\x00\x00\x01\x6a\x98\x57\x86\xe3\
+\x00\x00\x18\xe2\x00\x00\x00\x00\x00\x01\x00\x04\xcf\x62\
+\x00\x00\x01\x6f\x81\x3b\xab\x4b\
+\x00\x00\x0b\xea\x00\x00\x00\x00\x00\x01\x00\x02\xa1\x60\
+\x00\x00\x01\x6a\x98\x57\x87\x2e\
+\x00\x00\x12\xfe\x00\x00\x00\x00\x00\x01\x00\x03\xd6\x94\
+\x00\x00\x01\x6a\x98\x57\x87\x8d\
+\x00\x00\x1c\x74\x00\x00\x00\x00\x00\x01\x00\x05\x67\xf1\
+\x00\x00\x01\x6a\x98\x57\x86\xb5\
+\x00\x00\x0a\xa4\x00\x00\x00\x00\x00\x01\x00\x02\x66\xb1\
+\x00\x00\x01\x6a\x98\x57\x87\x2c\
+\x00\x00\x0b\xa0\x00\x00\x00\x00\x00\x01\x00\x02\x98\xb9\
+\x00\x00\x01\x6a\x98\x57\x87\x10\
+\x00\x00\x0b\x0e\x00\x00\x00\x00\x00\x01\x00\x02\x7d\xc2\
+\x00\x00\x01\x6a\x98\x57\x87\x0d\
+\x00\x00\x1f\x04\x00\x00\x00\x00\x00\x01\x00\x05\xdb\xe8\
+\x00\x00\x01\x6a\x98\x57\x87\x3a\
+\x00\x00\x19\x42\x00\x00\x00\x00\x00\x01\x00\x04\xdc\x29\
+\x00\x00\x01\x6a\x98\x57\x87\x8c\
+\x00\x00\x0e\x10\x00\x00\x00\x00\x00\x01\x00\x03\x09\x2c\
+\x00\x00\x01\x6a\x98\x57\x86\xde\
+\x00\x00\x0b\x24\x00\x00\x00\x00\x00\x01\x00\x02\x83\x29\
+\x00\x00\x01\x6a\x98\x57\x87\x86\
+\x00\x00\x18\x9a\x00\x00\x00\x00\x00\x01\x00\x04\xc0\x63\
+\x00\x00\x01\x6a\x98\x57\x87\x0f\
+\x00\x00\x0c\xcc\x00\x00\x00\x00\x00\x01\x00\x02\xcb\x42\
+\x00\x00\x01\x6a\x98\x57\x86\x8d\
+\x00\x00\x0d\xe2\x00\x00\x00\x00\x00\x01\x00\x02\xfd\xdb\
+\x00\x00\x01\x6a\x98\x57\x87\x89\
+\x00\x00\x1e\xac\x00\x00\x00\x00\x00\x01\x00\x05\xce\x22\
+\x00\x00\x01\x6a\x98\x57\x86\xa2\
+\x00\x00\x08\x64\x00\x00\x00\x00\x00\x01\x00\x02\x01\xa2\
+\x00\x00\x01\x6a\x98\x57\x87\x0b\
+\x00\x00\x0f\x2c\x00\x00\x00\x00\x00\x01\x00\x03\x3b\xaa\
+\x00\x00\x01\x6a\x98\x57\x87\x4d\
+\x00\x00\x0a\x5a\x00\x00\x00\x00\x00\x01\x00\x02\x56\x7f\
+\x00\x00\x01\x6a\x98\x57\x86\x90\
+\x00\x00\x1b\xc8\x00\x00\x00\x00\x00\x01\x00\x05\x4c\xd2\
+\x00\x00\x01\x6a\x98\x57\x86\xe6\
+\x00\x00\x0d\xb0\x00\x00\x00\x00\x00\x01\x00\x02\xf3\x3c\
+\x00\x00\x01\x6a\x98\x57\x86\xf5\
+\x00\x00\x13\x36\x00\x00\x00\x00\x00\x01\x00\x03\xe0\xd5\
+\x00\x00\x01\x6a\x98\x57\x87\x1a\
+\x00\x00\x1b\x90\x00\x00\x00\x00\x00\x01\x00\x05\x43\xfc\
+\x00\x00\x01\x6a\x98\x57\x86\x7a\
+\x00\x00\x1b\x48\x00\x00\x00\x00\x00\x01\x00\x05\x32\x10\
+\x00\x00\x01\x6a\x98\x57\x86\xf6\
+\x00\x00\x0c\xb4\x00\x00\x00\x00\x00\x01\x00\x02\xc5\x9e\
+\x00\x00\x01\x6a\x98\x57\x87\x38\
+\x00\x00\x16\x48\x00\x00\x00\x00\x00\x01\x00\x04\x52\x9b\
+\x00\x00\x01\x6a\x98\x57\x86\xff\
+\x00\x00\x1d\xa6\x00\x00\x00\x00\x00\x01\x00\x05\x9b\x82\
+\x00\x00\x01\x6a\x98\x57\x87\x9a\
+\x00\x00\x0c\x66\x00\x00\x00\x00\x00\x01\x00\x02\xb8\xb7\
+\x00\x00\x01\x6a\x98\x57\x86\xaa\
+\x00\x00\x1a\x24\x00\x00\x00\x00\x00\x01\x00\x05\x03\xda\
+\x00\x00\x01\x6a\x98\x57\x87\x50\
+\x00\x00\x19\x2c\x00\x00\x00\x00\x00\x01\x00\x04\xd7\x68\
+\x00\x00\x01\x6a\x98\x57\x86\x99\
+\x00\x00\x1c\xf2\x00\x00\x00\x00\x00\x01\x00\x05\x80\x6f\
+\x00\x00\x01\x6a\x98\x57\x86\xf8\
+\x00\x00\x10\xc4\x00\x00\x00\x00\x00\x01\x00\x03\x7e\x7d\
+\x00\x00\x01\x6a\x98\x57\x87\x4c\
+\x00\x00\x10\x8c\x00\x00\x00\x00\x00\x01\x00\x03\x73\xba\
+\x00\x00\x01\x6a\x98\x57\x86\x57\
+\x00\x00\x1f\x24\x00\x00\x00\x00\x00\x01\x00\x05\xe0\x9c\
+\x00\x00\x01\x6a\x98\x57\x86\x8e\
+\x00\x00\x10\x0e\x00\x00\x00\x00\x00\x01\x00\x03\x5f\xd1\
+\x00\x00\x01\x6a\x98\x57\x87\x87\
+\x00\x00\x17\xdc\x00\x00\x00\x00\x00\x01\x00\x04\x9b\xf2\
+\x00\x00\x01\x6a\x98\x57\x87\x5b\
+\x00\x00\x18\xb0\x00\x00\x00\x00\x00\x01\x00\x04\xc4\x75\
+\x00\x00\x01\x6a\x98\x57\x87\x5a\
+\x00\x00\x18\x46\x00\x00\x00\x00\x00\x01\x00\x04\xaf\x1c\
+\x00\x00\x01\x6a\x98\x57\x86\x7d\
+\x00\x00\x0d\x1c\x00\x00\x00\x00\x00\x01\x00\x02\xdb\xe3\
+\x00\x00\x01\x6a\x98\x57\x86\x58\
+\x00\x00\x16\xb6\x00\x00\x00\x00\x00\x01\x00\x04\x64\x8d\
+\x00\x00\x01\x6a\x98\x57\x87\x1d\
+\x00\x00\x11\x48\x00\x00\x00\x00\x00\x01\x00\x03\x96\xf2\
+\x00\x00\x01\x6a\x98\x57\x87\x57\
+\x00\x00\x10\x56\x00\x00\x00\x00\x00\x01\x00\x03\x6a\x30\
+\x00\x00\x01\x6a\x98\x57\x86\xac\
+\x00\x00\x0f\x06\x00\x00\x00\x00\x00\x01\x00\x03\x35\xad\
+\x00\x00\x01\x6a\x98\x57\x86\xc1\
+\x00\x00\x18\x5c\x00\x00\x00\x00\x00\x01\x00\x04\xb4\x62\
+\x00\x00\x01\x6a\x98\x57\x86\xe0\
+\x00\x00\x16\x2e\x00\x00\x00\x00\x00\x01\x00\x04\x4d\x15\
+\x00\x00\x01\x6a\x98\x57\x87\x32\
+\x00\x00\x0a\x42\x00\x00\x00\x00\x00\x01\x00\x02\x53\x4e\
+\x00\x00\x01\x6a\x98\x57\x86\x68\
+\x00\x00\x19\x9c\x00\x00\x00\x00\x00\x01\x00\x04\xe8\xd9\
+\x00\x00\x01\x6a\x98\x57\x86\xee\
+\x00\x00\x0c\xe4\x00\x00\x00\x00\x00\x01\x00\x02\xd1\xde\
+\x00\x00\x01\x6a\x98\x57\x86\xe8\
+\x00\x00\x11\x62\x00\x00\x00\x00\x00\x01\x00\x03\x98\xd7\
+\x00\x00\x01\x6a\x98\x57\x87\x19\
+\x00\x00\x15\x6a\x00\x00\x00\x00\x00\x01\x00\x04\x30\x4f\
+\x00\x00\x01\x6a\x98\x57\x87\x48\
+\x00\x00\x17\xc6\x00\x00\x00\x00\x00\x01\x00\x04\x97\xcc\
+\x00\x00\x01\x6a\x98\x57\x86\x69\
+\x00\x00\x06\xd2\x00\x00\x00\x00\x00\x01\x00\x01\xab\x57\
+\x00\x00\x01\x6a\x98\x57\x86\x5b\
+\x00\x00\x12\x10\x00\x00\x00\x00\x00\x01\x00\x03\xb4\x9a\
+\x00\x00\x01\x6f\x81\x3e\x71\xed\
+\x00\x00\x0d\x8a\x00\x00\x00\x00\x00\x01\x00\x02\xed\x83\
+\x00\x00\x01\x6a\x98\x57\x86\x5c\
+\x00\x00\x16\x04\x00\x00\x00\x00\x00\x01\x00\x04\x4a\x10\
+\x00\x00\x01\x6a\x98\x57\x86\x6d\
+\x00\x00\x0f\xba\x00\x00\x00\x00\x00\x01\x00\x03\x50\x1b\
+\x00\x00\x01\x6a\x98\x57\x86\xb0\
+\x00\x00\x1d\x4c\x00\x00\x00\x00\x00\x01\x00\x05\x8f\x1b\
+\x00\x00\x01\x6a\x98\x57\x86\xae\
+\x00\x00\x0f\x52\x00\x00\x00\x00\x00\x01\x00\x03\x3f\x23\
+\x00\x00\x01\x6a\x98\x57\x87\x13\
+\x00\x00\x17\x6e\x00\x00\x00\x00\x00\x01\x00\x04\x87\xb5\
+\x00\x00\x01\x6a\x98\x57\x87\x58\
+\x00\x00\x14\x10\x00\x00\x00\x00\x00\x01\x00\x03\xf9\xf8\
+\x00\x00\x01\x6a\x98\x57\x86\xd4\
+\x00\x00\x0d\xcc\x00\x00\x00\x00\x00\x01\x00\x02\xf9\x1c\
+\x00\x00\x01\x6a\x98\x57\x87\x16\
+\x00\x00\x12\x9c\x00\x00\x00\x00\x00\x01\x00\x03\xc3\xb6\
+\x00\x00\x01\x6a\x98\x57\x86\xbf\
+\x00\x00\x09\x20\x00\x00\x00\x00\x00\x01\x00\x02\x22\x98\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x0d\xf4\x00\x00\x00\x00\x00\x01\x00\x03\x02\x4e\
+\x00\x00\x01\x6a\x98\x57\x86\x95\
+\x00\x00\x0e\x56\x00\x00\x00\x00\x00\x01\x00\x03\x18\xfb\
+\x00\x00\x01\x6a\x98\x57\x86\x71\
+\x00\x00\x09\xf4\x00\x00\x00\x00\x00\x01\x00\x02\x40\xd1\
+\x00\x00\x01\x6a\x98\x57\x86\xbc\
+\x00\x00\x17\x30\x00\x00\x00\x00\x00\x01\x00\x04\x7b\x3f\
+\x00\x00\x01\x6a\x98\x57\x87\x62\
+\x00\x00\x07\x8e\x00\x00\x00\x00\x00\x01\x00\x01\xd4\x97\
+\x00\x00\x01\x6a\x98\x57\x86\x60\
+\x00\x00\x19\xf8\x00\x00\x00\x00\x00\x01\x00\x04\xf9\xa6\
+\x00\x00\x01\x6a\x98\x57\x86\xed\
+\x00\x00\x1a\x7e\x00\x00\x00\x00\x00\x01\x00\x05\x0f\x2f\
+\x00\x00\x01\x6a\x98\x57\x86\xb6\
+\x00\x00\x1e\x5a\x00\x00\x00\x00\x00\x01\x00\x05\xbe\xb3\
+\x00\x00\x01\x6a\x98\x57\x87\x80\
+\x00\x00\x0a\x8e\x00\x00\x00\x00\x00\x01\x00\x02\x61\x35\
+\x00\x00\x01\x6a\x98\x57\x87\x03\
+\x00\x00\x13\xc2\x00\x00\x00\x00\x00\x01\x00\x03\xed\xdb\
+\x00\x00\x01\x6a\x98\x57\x87\x8a\
+\x00\x00\x08\xc2\x00\x00\x00\x00\x00\x01\x00\x02\x14\x0a\
+\x00\x00\x01\x6a\x98\x57\x86\x9a\
+\x00\x00\x1a\x10\x00\x00\x00\x00\x00\x01\x00\x04\xfe\x48\
+\x00\x00\x01\x6a\x98\x57\x86\x6c\
+\x00\x00\x15\x88\x00\x00\x00\x00\x00\x01\x00\x04\x34\x0c\
+\x00\x00\x01\x6a\x98\x57\x87\x5e\
+\x00\x00\x0f\x68\x00\x00\x00\x00\x00\x01\x00\x03\x44\x3b\
+\x00\x00\x01\x6a\x98\x57\x86\x93\
+\x00\x00\x14\x2c\x00\x00\x00\x00\x00\x01\x00\x03\xfd\xea\
+\x00\x00\x01\x6a\x98\x57\x86\xfc\
+\x00\x00\x0c\x7c\x00\x00\x00\x00\x00\x01\x00\x02\xbc\x98\
+\x00\x00\x01\x6a\x98\x57\x87\x75\
+\x00\x00\x0f\xd4\x00\x00\x00\x00\x00\x01\x00\x03\x57\x29\
+\x00\x00\x01\x6a\x98\x57\x86\xa3\
+\x00\x00\x0a\x70\x00\x00\x00\x00\x00\x01\x00\x02\x5d\x06\
+\x00\x00\x01\x6a\x98\x57\x86\x75\
+\x00\x00\x11\xdc\x00\x00\x00\x00\x00\x01\x00\x03\xa9\xfe\
+\x00\x00\x01\x6a\x98\x57\x87\x71\
+\x00\x00\x12\x3e\x00\x00\x00\x00\x00\x01\x00\x03\xb6\xd3\
+\x00\x00\x01\x6a\x98\x57\x87\x25\
+\x00\x00\x15\x50\x00\x00\x00\x00\x00\x01\x00\x04\x2c\xdc\
+\x00\x00\x01\x6a\x98\x57\x86\x83\
+\x00\x00\x10\xde\x00\x00\x00\x00\x00\x01\x00\x03\x84\x97\
+\x00\x00\x01\x6a\x98\x57\x86\xb8\
+\x00\x00\x07\x7a\x00\x00\x00\x00\x00\x01\x00\x01\xce\x7e\
+\x00\x00\x01\x6a\x98\x57\x87\x5d\
+\x00\x00\x15\xbc\x00\x00\x00\x00\x00\x01\x00\x04\x3e\xa3\
+\x00\x00\x01\x6a\x98\x57\x86\x55\
+\x00\x00\x0d\x04\x00\x00\x00\x00\x00\x01\x00\x02\xd6\x65\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x1c\xda\x00\x00\x00\x00\x00\x01\x00\x05\x7a\x71\
+\x00\x00\x01\x6a\x98\x57\x86\xb1\
+\x00\x00\x0d\x56\x00\x00\x00\x00\x00\x01\x00\x02\xe5\xea\
+\x00\x00\x01\x6a\x98\x57\x86\x84\
+\x00\x00\x12\x80\x00\x00\x00\x00\x00\x01\x00\x03\xbf\xd2\
+\x00\x00\x01\x6a\x98\x57\x87\x7c\
+\x00\x00\x07\xc4\x00\x00\x00\x00\x00\x01\x00\x01\xe0\xcc\
+\x00\x00\x01\x6a\x98\x57\x87\x20\
+\x00\x00\x1b\xa6\x00\x00\x00\x00\x00\x01\x00\x05\x49\x28\
+\x00\x00\x01\x6a\x98\x57\x87\x05\
+\x00\x00\x1e\x72\x00\x00\x00\x00\x00\x01\x00\x05\xc3\xe2\
+\x00\x00\x01\x6a\x98\x57\x86\xe1\
+\x00\x00\x11\x2e\x00\x00\x00\x00\x00\x01\x00\x03\x92\x8a\
+\x00\x00\x01\x6a\x98\x57\x87\x35\
+\x00\x00\x1e\x2c\x00\x00\x00\x00\x00\x01\x00\x05\xb3\xe8\
+\x00\x00\x01\x6a\x98\x57\x87\x83\
+\x00\x00\x08\xdc\x00\x00\x00\x00\x00\x01\x00\x02\x19\x9f\
+\x00\x00\x01\x6a\x98\x57\x87\x95\
+\x00\x00\x1c\x94\x00\x00\x00\x00\x00\x01\x00\x05\x6d\x6a\
+\x00\x00\x01\x6a\x98\x57\x87\x30\
+\x00\x00\x1c\xc6\x00\x00\x00\x00\x00\x01\x00\x05\x76\xbc\
+\x00\x00\x01\x6a\x98\x57\x87\x6f\
+\x00\x00\x12\xd0\x00\x00\x00\x00\x00\x01\x00\x03\xcb\xc3\
+\x00\x00\x01\x6a\x98\x57\x87\x2d\
+\x00\x00\x08\x3a\x00\x00\x00\x00\x00\x01\x00\x01\xf7\xf7\
+\x00\x00\x01\x6a\x98\x57\x86\x9b\
+\x00\x00\x15\x18\x00\x00\x00\x00\x00\x01\x00\x04\x23\xe3\
+\x00\x00\x01\x6a\x98\x57\x87\x53\
+\x00\x00\x13\xdc\x00\x00\x00\x00\x00\x01\x00\x03\xf1\xc2\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x13\xf6\x00\x00\x00\x00\x00\x01\x00\x03\xf6\x07\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x0b\x80\x00\x00\x00\x00\x00\x01\x00\x02\x93\xc2\
+\x00\x00\x01\x6a\x98\x57\x87\x6b\
+\x00\x00\x08\x94\x00\x00\x00\x00\x00\x01\x00\x02\x0c\x1d\
+\x00\x00\x01\x6a\x98\x57\x87\x06\
+\x00\x00\x1a\xd6\x00\x00\x00\x00\x00\x01\x00\x05\x1e\x18\
+\x00\x00\x01\x6a\x98\x57\x87\x18\
+\x00\x00\x06\xf8\x00\x00\x00\x00\x00\x01\x00\x01\xb4\x8a\
+\x00\x00\x01\x6a\x98\x57\x87\x02\
+\x00\x00\x14\x70\x00\x00\x00\x00\x00\x01\x00\x04\x08\x43\
+\x00\x00\x01\x6a\x98\x57\x86\x87\
+\x00\x00\x08\x0a\x00\x00\x00\x00\x00\x01\x00\x01\xef\xd7\
+\x00\x00\x01\x6a\x98\x57\x86\x7e\
+\x00\x00\x16\x80\x00\x00\x00\x00\x00\x01\x00\x04\x5a\x70\
+\x00\x00\x01\x6a\x98\x57\x87\x7d\
+\x00\x00\x1b\x1c\x00\x00\x00\x00\x00\x01\x00\x05\x26\x9a\
+\x00\x00\x01\x6a\x98\x57\x87\x6d\
+\x00\x00\x0d\x34\x00\x00\x00\x00\x00\x01\x00\x02\xe1\x19\
+\x00\x00\x01\x6a\x98\x57\x86\xc2\
+\x00\x00\x1a\x5e\x00\x00\x00\x00\x00\x01\x00\x05\x0b\xcd\
+\x00\x00\x01\x6a\x98\x57\x86\x80\
+\x00\x00\x17\xae\x00\x00\x00\x00\x00\x01\x00\x04\x92\x16\
+\x00\x00\x01\x6a\x98\x57\x86\xb3\
+\x00\x00\x16\xea\x00\x00\x00\x00\x00\x01\x00\x04\x6e\x3a\
+\x00\x00\x01\x6a\x98\x57\x87\x54\
+\x00\x00\x10\x6c\x00\x00\x00\x00\x00\x01\x00\x03\x6e\x65\
+\x00\x00\x01\x6a\x98\x57\x86\xf0\
+\x00\x00\x1a\x96\x00\x00\x00\x00\x00\x01\x00\x05\x14\x54\
+\x00\x00\x01\x6a\x98\x57\x87\x12\
+\x00\x00\x14\xf8\x00\x00\x00\x00\x00\x01\x00\x04\x1f\x9f\
+\x00\x00\x01\x6a\x98\x57\x86\xe7\
+\x00\x00\x16\x62\x00\x00\x00\x00\x00\x01\x00\x04\x56\xe3\
+\x00\x00\x01\x6a\x98\x57\x86\xad\
+\x00\x00\x0a\x26\x00\x00\x00\x00\x00\x01\x00\x02\x4d\x03\
+\x00\x00\x01\x6a\x98\x57\x87\x56\
+\x00\x00\x1e\x12\x00\x00\x00\x00\x00\x01\x00\x05\xae\x9b\
+\x00\x00\x01\x6a\x98\x57\x87\x64\
+\x00\x00\x0b\x64\x00\x00\x00\x00\x00\x01\x00\x02\x8e\x18\
+\x00\x00\x01\x6a\x98\x57\x87\x39\
+\x00\x00\x19\xc2\x00\x00\x00\x00\x00\x01\x00\x04\xee\xac\
+\x00\x00\x01\x6a\x98\x57\x86\xf1\
+\x00\x00\x09\x3a\x00\x00\x00\x00\x00\x01\x00\x02\x27\x4c\
+\x00\x00\x01\x6a\x98\x57\x87\x43\
+\x00\x00\x1c\xac\x00\x00\x00\x00\x00\x01\x00\x05\x72\x9a\
+\x00\x00\x01\x6a\x98\x57\x87\x90\
+\x00\x00\x18\xca\x00\x00\x00\x00\x00\x01\x00\x04\xc9\x24\
+\x00\x00\x01\x6a\x98\x57\x87\x69\
+\x00\x00\x1f\x78\x00\x00\x00\x00\x00\x01\x00\x05\xf1\x22\
+\x00\x00\x01\x6a\x98\x57\x87\x81\
+\x00\x00\x14\x48\x00\x00\x00\x00\x00\x01\x00\x04\x03\xb0\
+\x00\x00\x01\x6a\x98\x57\x86\xc3\
+\x00\x00\x14\xcc\x00\x00\x00\x00\x00\x01\x00\x04\x15\xfd\
+\x00\x00\x01\x6a\x98\x57\x86\xb9\
+\x00\x00\x1e\x94\x00\x00\x00\x00\x00\x01\x00\x05\xc9\xa2\
+\x00\x00\x01\x6a\x98\x57\x86\x62\
+\x00\x00\x0a\x0e\x00\x00\x00\x00\x00\x01\x00\x02\x46\xa7\
+\x00\x00\x01\x6a\x98\x57\x87\x31\
+\x00\x00\x18\x2e\x00\x00\x00\x00\x00\x01\x00\x04\xab\xca\
+\x00\x00\x01\x6a\x98\x57\x86\x82\
+\x00\x00\x11\x7e\x00\x00\x00\x00\x00\x01\x00\x03\x9b\x61\
+\x00\x00\x01\x6a\x98\x57\x87\x21\
+\x00\x00\x19\x12\x00\x00\x00\x00\x00\x01\x00\x04\xd2\x01\
+\x00\x00\x01\x6a\x98\x57\x86\xa0\
+\x00\x00\x1c\x2a\x00\x00\x00\x00\x00\x01\x00\x05\x5a\xd6\
+\x00\x00\x01\x6a\x98\x57\x86\x92\
+\x00\x00\x0e\x76\x00\x00\x00\x00\x00\x01\x00\x03\x1c\xec\
+\x00\x00\x01\x6a\x98\x57\x86\x8b\
+\x00\x00\x15\xe2\x00\x00\x00\x00\x00\x01\x00\x04\x43\x79\
+\x00\x00\x01\x6a\x98\x57\x87\x3d\
+\x00\x00\x17\x1a\x00\x00\x00\x00\x00\x01\x00\x04\x76\xbc\
+\x00\x00\x01\x6a\x98\x57\x87\x79\
+\x00\x00\x14\xe2\x00\x00\x00\x00\x00\x01\x00\x04\x1a\xb7\
+\x00\x00\x01\x6a\x98\x57\x87\x29\
+\x00\x00\x0a\xfa\x00\x00\x00\x00\x00\x01\x00\x02\x78\x67\
+\x00\x00\x01\x6a\x98\x57\x86\xbd\
+\x00\x00\x08\x7c\x00\x00\x00\x00\x00\x01\x00\x02\x07\x00\
+\x00\x00\x01\x6a\x98\x57\x87\x1f\
+\x00\x00\x1b\x74\x00\x00\x00\x00\x00\x01\x00\x05\x3d\x98\
+\x00\x00\x01\x6a\x98\x57\x87\x34\
+\x00\x00\x1d\x12\x00\x00\x00\x00\x00\x01\x00\x05\x85\x3f\
+\x00\x00\x01\x6a\x98\x57\x87\x76\
+\x00\x00\x13\x7c\x00\x00\x00\x00\x00\x01\x00\x03\xe8\x94\
+\x00\x00\x01\x6a\x9d\x15\xb9\x29\
+\x00\x00\x18\x10\x00\x00\x00\x00\x00\x01\x00\x04\xa6\x05\
+\x00\x00\x01\x6a\x98\x57\x87\x3f\
+\x00\x00\x11\x94\x00\x00\x00\x00\x00\x01\x00\x03\xa0\xa8\
+\x00\x00\x01\x6a\x98\x57\x87\x23\
+\x00\x00\x11\x0e\x00\x00\x00\x00\x00\x01\x00\x03\x8e\xc4\
+\x00\x00\x01\x6a\x98\x57\x86\xeb\
+\x00\x00\x17\x4a\x00\x00\x00\x00\x00\x01\x00\x04\x82\x6e\
+\x00\x00\x01\x6a\x98\x57\x87\x15\
+\x00\x00\x13\x5c\x00\x00\x00\x00\x00\x01\x00\x03\xe5\x32\
+\x00\x00\x01\x6a\x98\x57\x87\x08\
+\x00\x00\x17\xf6\x00\x00\x00\x00\x00\x01\x00\x04\x9f\xe1\
+\x00\x00\x01\x6a\x98\x57\x87\x73\
+\x00\x00\x07\xdc\x00\x00\x00\x00\x00\x01\x00\x01\xe4\xdf\
+\x00\x00\x01\x6a\x98\x57\x86\x9d\
+\x00\x00\x18\x78\x00\x00\x00\x00\x00\x01\x00\x04\xba\x12\
+\x00\x00\x01\x6a\x98\x57\x87\x27\
+\x00\x00\x0b\xfc\x00\x00\x00\x00\x00\x01\x00\x02\xa7\x90\
+\x00\x00\x01\x6a\x98\x57\x87\x96\
+\x00\x00\x1d\xf4\x00\x00\x00\x00\x00\x01\x00\x05\xa8\xf8\
+\x00\x00\x01\x6a\x98\x57\x87\x82\
+\x00\x00\x0e\xec\x00\x00\x00\x00\x00\x01\x00\x03\x30\xef\
+\x00\x00\x01\x6a\x98\x57\x86\xfb\
+\x00\x00\x19\x5c\x00\x00\x00\x00\x00\x01\x00\x04\xdf\xd5\
+\x00\x00\x01\x6a\x98\x57\x87\x7a\
+\x00\x00\x0e\x96\x00\x00\x00\x00\x00\x01\x00\x03\x21\x26\
+\x00\x00\x01\x6a\x98\x57\x86\xba\
+\x00\x00\x16\x94\x00\x00\x00\x00\x00\x01\x00\x04\x5d\xb5\
+\x00\x00\x01\x6a\x98\x57\x86\x59\
+\x00\x00\x07\x60\x00\x00\x00\x00\x00\x01\x00\x01\xc9\x07\
+\x00\x00\x01\x6a\x98\x57\x86\x65\
+\x00\x00\x13\x20\x00\x00\x00\x00\x00\x01\x00\x03\xdc\x06\
+\x00\x00\x01\x6a\x98\x57\x86\xa4\
+\x00\x00\x09\x08\x00\x00\x00\x00\x00\x01\x00\x02\x1d\x05\
+\x00\x00\x01\x6a\x98\x57\x86\x63\
+\x00\x00\x0e\x42\x00\x00\x00\x00\x00\x01\x00\x03\x15\x5c\
+\x00\x00\x01\x6a\x98\x57\x87\x99\
+\x00\x00\x1d\x90\x00\x00\x00\x00\x00\x01\x00\x05\x96\xae\
+\x00\x00\x01\x6a\x98\x57\x87\x8e\
+\x00\x00\x17\x00\x00\x00\x00\x00\x00\x01\x00\x04\x73\x07\
+\x00\x00\x01\x6a\x98\x57\x87\x1c\
+\x00\x00\x08\x24\x00\x00\x00\x00\x00\x01\x00\x01\xf3\x92\
+\x00\x00\x01\x6a\x98\x57\x86\xdd\
+\x00\x00\x1a\x40\x00\x00\x00\x00\x00\x01\x00\x05\x07\xd9\
+\x00\x00\x01\x6a\x98\x57\x86\x77\
+\x00\x00\x0e\xac\x00\x00\x00\x00\x00\x01\x00\x03\x25\xa4\
+\x00\x00\x01\x6a\x98\x57\x87\x6e\
+"
+
+qt_version = [int(v) for v in QtCore.qVersion().split(".")]
+if qt_version < [5, 8, 0]:
+    rcc_version = 1
+    qt_resource_struct = qt_resource_struct_v1
+else:
+    rcc_version = 2
+    qt_resource_struct = qt_resource_struct_v2
+
+
+def qInitResources():
+    QtCore.qRegisterResourceData(
+        rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data
+    )
+
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(
+        rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data
+    )
+
+
+qInitResources()
diff --git a/UI/file_version_info.txt b/UI/file_version_info.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1c53f45b5cd76fe9e0dbba118211fca425d02756
--- /dev/null
+++ b/UI/file_version_info.txt
@@ -0,0 +1,43 @@
+# UTF-8
+#
+# For more details about fixed file info 'ffi' see:
+# http://msdn.microsoft.com/en-us/library/ms646997.aspx
+VSVersionInfo(
+  ffi=FixedFileInfo(
+    # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
+    # Set not needed items to zero 0.
+    filevers=(1, 23, 0, 0),
+    prodvers=(1, 23, 0, 0),
+    # Contains a bitmask that specifies the valid bits 'flags'r
+    mask=0x3f,
+    # Contains a bitmask that specifies the Boolean attributes of the file.
+    flags=0x0,
+    # The operating system for which this file was designed.
+    # 0x4 - NT and there is no need to change it.
+    OS=0x40004,
+    # The general type of file.
+    # 0x1 - the file is an application.
+    fileType=0x1,
+    # The function of the file.
+    # 0x0 - the function is not defined for this fileType
+    subtype=0x0,
+    # Creation date and time stamp.
+    date=(0, 0)
+    ),
+  kids=[
+    StringFileInfo(
+      [
+      StringTable(
+        u'040904B0',
+        [StringStruct(u'CompanyName', u'Genesis HydroTech LLC'),
+        StringStruct(u'FileDescription', u'QRevInt'),
+        StringStruct(u'FileVersion', u'1.23'),
+        StringStruct(u'InternalName', u'QRevInt'),
+        StringStruct(u'LegalCopyright', u'CC0 1.0'),
+        StringStruct(u'OriginalFilename', u'QRevInt.Exe'),
+        StringStruct(u'ProductName', u'QRevInt'),
+        StringStruct(u'ProductVersion', u'1.23')])
+      ]), 
+    VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
+  ]
+)
diff --git a/UI/images/1.png b/UI/images/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..c26460a373aad32e3115497b57c63e3bf5ddfe7b
Binary files /dev/null and b/UI/images/1.png differ
diff --git a/UI/images/10.png b/UI/images/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..53be30874d19bce3476872b235f751ebe2d187aa
Binary files /dev/null and b/UI/images/10.png differ
diff --git a/UI/images/11.png b/UI/images/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..98308ce0531909c470622a29744e7fc03a3266e5
Binary files /dev/null and b/UI/images/11.png differ
diff --git a/UI/images/12.png b/UI/images/12.png
new file mode 100644
index 0000000000000000000000000000000000000000..5445e11be71cc8c84d3003e9cf29182a7c2a4119
Binary files /dev/null and b/UI/images/12.png differ
diff --git a/UI/images/13.png b/UI/images/13.png
new file mode 100644
index 0000000000000000000000000000000000000000..18664c32726286f154351ad3ed21c452fcbdbf56
Binary files /dev/null and b/UI/images/13.png differ
diff --git a/UI/images/14.png b/UI/images/14.png
new file mode 100644
index 0000000000000000000000000000000000000000..a97992b75f4ef4be0e612fa40888f40e57582b89
Binary files /dev/null and b/UI/images/14.png differ
diff --git a/UI/images/15.png b/UI/images/15.png
new file mode 100644
index 0000000000000000000000000000000000000000..b649ebc2b9b4f46ec023a519438540a0110c5ac2
Binary files /dev/null and b/UI/images/15.png differ
diff --git a/UI/images/16.png b/UI/images/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c16e26268ff9a0a38f5f43094bae488e3f9acaf
Binary files /dev/null and b/UI/images/16.png differ
diff --git a/UI/images/17.png b/UI/images/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..886df26523e3af9eeacc124ae090859421e75188
Binary files /dev/null and b/UI/images/17.png differ
diff --git a/UI/images/18.png b/UI/images/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..10a5ebb65759bbea4b6c5ad31ccbada8285fcfdd
Binary files /dev/null and b/UI/images/18.png differ
diff --git a/UI/images/19.png b/UI/images/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..964197e734ab3152daf4e2ac1c56a019794caf25
Binary files /dev/null and b/UI/images/19.png differ
diff --git a/UI/images/2.png b/UI/images/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..37e2e3fdd8dfc3e909a669557094767a3c0f53f7
Binary files /dev/null and b/UI/images/2.png differ
diff --git a/UI/images/20.png b/UI/images/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4106cea5c4404ab4205c1afd67263d09c9f766e
Binary files /dev/null and b/UI/images/20.png differ
diff --git a/UI/images/21.png b/UI/images/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b92d08c923f297cd9822df7d8cad5a2c6b1cc6b
Binary files /dev/null and b/UI/images/21.png differ
diff --git a/UI/images/22.png b/UI/images/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2895a16a1bba820c742f00a45bbb3bdef5748ae
Binary files /dev/null and b/UI/images/22.png differ
diff --git a/UI/images/23.png b/UI/images/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c9f7f481ad20048fc0d6836aab48ca5f2825e63
Binary files /dev/null and b/UI/images/23.png differ
diff --git a/UI/images/25.png b/UI/images/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..035c57e4cd3e89d2de6563369a2d2edf3215d692
Binary files /dev/null and b/UI/images/25.png differ
diff --git a/UI/images/26.png b/UI/images/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..ddfcb9612af3e8925243f672dd983cc5b1afaae3
Binary files /dev/null and b/UI/images/26.png differ
diff --git a/UI/images/27.png b/UI/images/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..3203cf46e995eb4a49527e0e3fff45d5e7f2e234
Binary files /dev/null and b/UI/images/27.png differ
diff --git a/UI/images/28.png b/UI/images/28.png
new file mode 100644
index 0000000000000000000000000000000000000000..754e753df623a9f4ce3b212226b3cb0a3690484f
Binary files /dev/null and b/UI/images/28.png differ
diff --git a/UI/images/29.png b/UI/images/29.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f77f2c54e418be6c348a38d9955f41c2333c69b
Binary files /dev/null and b/UI/images/29.png differ
diff --git a/UI/images/3.png b/UI/images/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..6af9ef7e8e8681eebea3cec686dbb26818dd478e
Binary files /dev/null and b/UI/images/3.png differ
diff --git a/UI/images/30.png b/UI/images/30.png
new file mode 100644
index 0000000000000000000000000000000000000000..5925300697e1e6d6b90fbc92d4095e3607ea0e24
Binary files /dev/null and b/UI/images/30.png differ
diff --git a/UI/images/31.png b/UI/images/31.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a70c149bc554e3ff5685da36ecc70f8681a451a
Binary files /dev/null and b/UI/images/31.png differ
diff --git a/UI/images/32.png b/UI/images/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..353bbc8e266b0a61e33aa388657d98a051930a16
Binary files /dev/null and b/UI/images/32.png differ
diff --git a/UI/images/33.png b/UI/images/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..df5b49dc48778c7a14fae5fc8d79e311cc1206bb
Binary files /dev/null and b/UI/images/33.png differ
diff --git a/UI/images/34.png b/UI/images/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..35249f190a294f854ab2e914cf5283e75e17be8b
Binary files /dev/null and b/UI/images/34.png differ
diff --git a/UI/images/35.png b/UI/images/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..4861d6ef6a2d1e29e7dd175eb8527c1153f07f1e
Binary files /dev/null and b/UI/images/35.png differ
diff --git a/UI/images/36.png b/UI/images/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..cae6deba0114e1ca193cede1afcd3aae83f67606
Binary files /dev/null and b/UI/images/36.png differ
diff --git a/UI/images/37.png b/UI/images/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c5307fea75fbb91539bac4b36f7fa6d09c23cf7
Binary files /dev/null and b/UI/images/37.png differ
diff --git a/UI/images/38.png b/UI/images/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..e5f4d178b0b2f8aed16a945acc4832e780882e2f
Binary files /dev/null and b/UI/images/38.png differ
diff --git a/UI/images/39.png b/UI/images/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..101defa2020bc5075bf88d820cc8d7fda74dc718
Binary files /dev/null and b/UI/images/39.png differ
diff --git a/UI/images/4.png b/UI/images/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0d0bbb2b9d9465847806c331a681f58cbb7dbc3
Binary files /dev/null and b/UI/images/4.png differ
diff --git a/UI/images/40.png b/UI/images/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..b526dddb6b370c5d18f67fb020ed927bd120ffd7
Binary files /dev/null and b/UI/images/40.png differ
diff --git a/UI/images/41.png b/UI/images/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..ec393ba136abe994eccfef76798fc1782cb8ae10
Binary files /dev/null and b/UI/images/41.png differ
diff --git a/UI/images/42.png b/UI/images/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..a50c1f3432a821324c2d78a4a163d88ca128c47e
Binary files /dev/null and b/UI/images/42.png differ
diff --git a/UI/images/42a.png b/UI/images/42a.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d3bc8524781cb40c2847edd1c0730f815548963
Binary files /dev/null and b/UI/images/42a.png differ
diff --git a/UI/images/43.png b/UI/images/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f66e9011db736449f1b63a71d0042dfb124ff48
Binary files /dev/null and b/UI/images/43.png differ
diff --git a/UI/images/44.png b/UI/images/44.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa282f3f4c06beb3ee20dbbda508c44b04b39856
Binary files /dev/null and b/UI/images/44.png differ
diff --git a/UI/images/45.png b/UI/images/45.png
new file mode 100644
index 0000000000000000000000000000000000000000..c516e63da7997dcd2dbe059bfa81b5edf6c20298
Binary files /dev/null and b/UI/images/45.png differ
diff --git a/UI/images/46.png b/UI/images/46.png
new file mode 100644
index 0000000000000000000000000000000000000000..0daf68a23af09f2a8688454fd12137578bb86f27
Binary files /dev/null and b/UI/images/46.png differ
diff --git a/UI/images/47.png b/UI/images/47.png
new file mode 100644
index 0000000000000000000000000000000000000000..97cd4bfc8162b35862bdd22bbd862af6291aa26b
Binary files /dev/null and b/UI/images/47.png differ
diff --git a/UI/images/48.png b/UI/images/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..192483fc907a0a41db99b6d20cd9f0a67b6391ba
Binary files /dev/null and b/UI/images/48.png differ
diff --git a/UI/images/49.png b/UI/images/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8c2311dc4ad80a8d48adb4a58e34cf42a4971c5
Binary files /dev/null and b/UI/images/49.png differ
diff --git a/UI/images/5.png b/UI/images/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce21344b21ca4ce51187ed814dcab53d022444e8
Binary files /dev/null and b/UI/images/5.png differ
diff --git a/UI/images/50.png b/UI/images/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f58bdda742e20c164897eb701c08920e2d17ceb
Binary files /dev/null and b/UI/images/50.png differ
diff --git a/UI/images/51.png b/UI/images/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c6a02303786c4971eb33314f6b4184557bafc06
Binary files /dev/null and b/UI/images/51.png differ
diff --git a/UI/images/52.png b/UI/images/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c6bd273effd3048d0fa3ce3e1cf2184a6115bc7
Binary files /dev/null and b/UI/images/52.png differ
diff --git a/UI/images/53.png b/UI/images/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..520c3d40f0cd674361a67d16629fa5c2c771e49b
Binary files /dev/null and b/UI/images/53.png differ
diff --git a/UI/images/54.png b/UI/images/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..35c933972011f55404ba9ba47fedb615baf215aa
Binary files /dev/null and b/UI/images/54.png differ
diff --git a/UI/images/55.png b/UI/images/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..27901af8b88c4bb8ef18bb75ae23366b9d8f6b90
Binary files /dev/null and b/UI/images/55.png differ
diff --git a/UI/images/56.png b/UI/images/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2e33678f21ef203cedbe6cb9c92846550a987e1
Binary files /dev/null and b/UI/images/56.png differ
diff --git a/UI/images/57.png b/UI/images/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9d992e318767a7dfca6f1de143bd6405898d5b9
Binary files /dev/null and b/UI/images/57.png differ
diff --git a/UI/images/58.png b/UI/images/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..e13e1ef3305e990f92b746858f729a0d87b4bea8
Binary files /dev/null and b/UI/images/58.png differ
diff --git a/UI/images/59.png b/UI/images/59.png
new file mode 100644
index 0000000000000000000000000000000000000000..18699f478f55eb4474131d1f1c6f8f968c78c5f5
Binary files /dev/null and b/UI/images/59.png differ
diff --git a/UI/images/6.png b/UI/images/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7c575cb0532c44146747de7bf3dcd49aea2730b
Binary files /dev/null and b/UI/images/6.png differ
diff --git a/UI/images/60.png b/UI/images/60.png
new file mode 100644
index 0000000000000000000000000000000000000000..10292562b4d6eca97d14602904d690f412d0ed7d
Binary files /dev/null and b/UI/images/60.png differ
diff --git a/UI/images/61.png b/UI/images/61.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c7c188f3f79bb6452e4f1754ecf56ed08ebbb05
Binary files /dev/null and b/UI/images/61.png differ
diff --git a/UI/images/62.png b/UI/images/62.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b88376d0ffdf5df0f07facdeef0a148068565e6
Binary files /dev/null and b/UI/images/62.png differ
diff --git a/UI/images/63.png b/UI/images/63.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c2e82b38a6c673f4a2d395a66d7f83bd211770b
Binary files /dev/null and b/UI/images/63.png differ
diff --git a/UI/images/64.png b/UI/images/64.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c60460b2766eaeec5d424f67932f8747abf927a
Binary files /dev/null and b/UI/images/64.png differ
diff --git a/UI/images/65.png b/UI/images/65.png
new file mode 100644
index 0000000000000000000000000000000000000000..42dcbbe860b35a2342e5f7bf386a95344eb1b613
Binary files /dev/null and b/UI/images/65.png differ
diff --git a/UI/images/66.png b/UI/images/66.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f7cbc09f60b7ba0aa7f8a3a9d079395b174074c
Binary files /dev/null and b/UI/images/66.png differ
diff --git a/UI/images/67.png b/UI/images/67.png
new file mode 100644
index 0000000000000000000000000000000000000000..825683a83c83a8902bd5f5a3041bd8267b66bfd7
Binary files /dev/null and b/UI/images/67.png differ
diff --git a/UI/images/68.png b/UI/images/68.png
new file mode 100644
index 0000000000000000000000000000000000000000..117e81a7543b6b9ee72b42b7719d4148e6c381f4
Binary files /dev/null and b/UI/images/68.png differ
diff --git a/UI/images/69.png b/UI/images/69.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d77fb24a8f030e9b8216bbefe5357e0a40ab975
Binary files /dev/null and b/UI/images/69.png differ
diff --git a/UI/images/7.png b/UI/images/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..78d2d79c9dadd129b9ba2e25b3eed42e60c3b22a
Binary files /dev/null and b/UI/images/7.png differ
diff --git a/UI/images/70.png b/UI/images/70.png
new file mode 100644
index 0000000000000000000000000000000000000000..6de79100bf58f7c45526fcc473927ec020c3ff69
Binary files /dev/null and b/UI/images/70.png differ
diff --git a/UI/images/71.png b/UI/images/71.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e0cd76df41cee35e722f8bddace650385d2a6a8
Binary files /dev/null and b/UI/images/71.png differ
diff --git a/UI/images/72.png b/UI/images/72.png
new file mode 100644
index 0000000000000000000000000000000000000000..b080c6204ab32fad6a5ecc899b152e5bda55f6bd
Binary files /dev/null and b/UI/images/72.png differ
diff --git a/UI/images/73.png b/UI/images/73.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d866e821626b1bbf0deb89e87824fb8b1aba3d8
Binary files /dev/null and b/UI/images/73.png differ
diff --git a/UI/images/74.png b/UI/images/74.png
new file mode 100644
index 0000000000000000000000000000000000000000..ec8c40789055a26a386e13b1ffe054a4432a5823
Binary files /dev/null and b/UI/images/74.png differ
diff --git a/UI/images/75.png b/UI/images/75.png
new file mode 100644
index 0000000000000000000000000000000000000000..2166de55bc90465facb8a6da6f9e74dd83e836fd
Binary files /dev/null and b/UI/images/75.png differ
diff --git a/UI/images/76.png b/UI/images/76.png
new file mode 100644
index 0000000000000000000000000000000000000000..be3894d850b7ec365f551dce6afd66776995d909
Binary files /dev/null and b/UI/images/76.png differ
diff --git a/UI/images/77.png b/UI/images/77.png
new file mode 100644
index 0000000000000000000000000000000000000000..696a793be15bc000e7943c27ec932015df96263a
Binary files /dev/null and b/UI/images/77.png differ
diff --git a/UI/images/78.png b/UI/images/78.png
new file mode 100644
index 0000000000000000000000000000000000000000..b63f66cd96e2a8906ec84ea227f36a2b418af258
Binary files /dev/null and b/UI/images/78.png differ
diff --git a/UI/images/79.png b/UI/images/79.png
new file mode 100644
index 0000000000000000000000000000000000000000..36517163f10ad3e85a60468aa45580b56b9cacd9
Binary files /dev/null and b/UI/images/79.png differ
diff --git a/UI/images/8.png b/UI/images/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ec2c6ff1f97de6a6e83dce30104fa8c4d280617
Binary files /dev/null and b/UI/images/8.png differ
diff --git a/UI/images/80.png b/UI/images/80.png
new file mode 100644
index 0000000000000000000000000000000000000000..2096e7777e6c90c0d374c0ebb7fd4a7ccd272d38
Binary files /dev/null and b/UI/images/80.png differ
diff --git a/UI/images/81.png b/UI/images/81.png
new file mode 100644
index 0000000000000000000000000000000000000000..919b50eb20f951371ee14bd097065dda4030d5ff
Binary files /dev/null and b/UI/images/81.png differ
diff --git a/UI/images/82.png b/UI/images/82.png
new file mode 100644
index 0000000000000000000000000000000000000000..b0342703c9a92c05b361e6d5ba53ed1a6a8fba15
Binary files /dev/null and b/UI/images/82.png differ
diff --git a/UI/images/83.png b/UI/images/83.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0ab6beef5fecba3e1bcd5865088c748facee75f
Binary files /dev/null and b/UI/images/83.png differ
diff --git a/UI/images/84.png b/UI/images/84.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2f873d3e5c10c5f887c2b9c21923478a179fe05
Binary files /dev/null and b/UI/images/84.png differ
diff --git a/UI/images/85.png b/UI/images/85.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b470aecaa6a7c26f8c5cb698838e070a31dc721
Binary files /dev/null and b/UI/images/85.png differ
diff --git a/UI/images/86.png b/UI/images/86.png
new file mode 100644
index 0000000000000000000000000000000000000000..235e6ef2b8e8b5f8d08bd40e346adc74c2c68775
Binary files /dev/null and b/UI/images/86.png differ
diff --git a/UI/images/87.png b/UI/images/87.png
new file mode 100644
index 0000000000000000000000000000000000000000..ebd87dba080e0036603841c3912ed8e5623bd594
Binary files /dev/null and b/UI/images/87.png differ
diff --git a/UI/images/88.png b/UI/images/88.png
new file mode 100644
index 0000000000000000000000000000000000000000..7fa96c179c8faae61e382494653f9806a7c37233
Binary files /dev/null and b/UI/images/88.png differ
diff --git a/UI/images/89.png b/UI/images/89.png
new file mode 100644
index 0000000000000000000000000000000000000000..9197c5bda8e38f7a22870265fea00915f88d8efb
Binary files /dev/null and b/UI/images/89.png differ
diff --git a/UI/images/9.png b/UI/images/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc33e38fdb65060a1eabcf9c518450d09eee7261
Binary files /dev/null and b/UI/images/9.png differ
diff --git a/UI/images/90.png b/UI/images/90.png
new file mode 100644
index 0000000000000000000000000000000000000000..4222b5e7648a4abe204976f8f805e6b323b898ff
Binary files /dev/null and b/UI/images/90.png differ
diff --git a/UI/images/91.png b/UI/images/91.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba901e7e57457ae136ec60343f6932ea197415ac
Binary files /dev/null and b/UI/images/91.png differ
diff --git a/UI/images/92.png b/UI/images/92.png
new file mode 100644
index 0000000000000000000000000000000000000000..862d8d759b6a8eb7e1fb4a574615c720e083de2a
Binary files /dev/null and b/UI/images/92.png differ
diff --git a/UI/images/93.png b/UI/images/93.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb5bd3ee8d9a9eca0b52157136deaf94d9dcb6a1
Binary files /dev/null and b/UI/images/93.png differ
diff --git a/UI/images/94.png b/UI/images/94.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0943619d658fd745277c6d9dc7ef02040e6ef36
Binary files /dev/null and b/UI/images/94.png differ
diff --git a/UI/images/95.png b/UI/images/95.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8c04f77a05d5361c5c874f739b6f96c5c88ce76
Binary files /dev/null and b/UI/images/95.png differ
diff --git a/UI/images/96.png b/UI/images/96.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7a06992a8ec8a0e06b0e8c2b34604800b58e776
Binary files /dev/null and b/UI/images/96.png differ
diff --git a/UI/pyinstaller_custom.bat b/UI/pyinstaller_custom.bat
new file mode 100644
index 0000000000000000000000000000000000000000..d03de380b85be78a28744674659dd3713d25a781
--- /dev/null
+++ b/UI/pyinstaller_custom.bat
@@ -0,0 +1 @@
+pyinstaller -F -w QRev.py --hidden-import=statsmodels.tsa.statespace._kalman_filter --hidden-import=statsmodels.tsa.statespace._kalman_smoother --hidden-import=statsmodels.tsa.statespace._representation --hidden-import=statsmodels.tsa.statespace._simulation_smoother --hidden-import=statsmodels.tsa.statespace._statespace --hidden-import=statsmodels.tsa.statespace._tools --hidden-import=statsmodels.tsa.statespace._filters._conventional --hidden-import=statsmodels.tsa.statespace._filters._inversions --hidden-import=statsmodels.tsa.statespace._filters._univariate --hidden-import=statsmodels.tsa.statespace._smoothers._alternative --hidden-import=statsmodels.tsa.statespace._smoothers._classical --hidden-import=statsmodels.tsa.statespace._smoothers._conventional --hidden-import=statsmodels.tsa.statespace._smoothers._univariate
\ No newline at end of file
diff --git a/UI/qrev_spec.bat b/UI/qrev_spec.bat
new file mode 100644
index 0000000000000000000000000000000000000000..0ef3e781dc70c9a9f921a5d5b2733faf0fa138eb
--- /dev/null
+++ b/UI/qrev_spec.bat
@@ -0,0 +1 @@
+pyinstaller QRev.spec
diff --git a/UI/selectFile.py b/UI/selectFile.py
new file mode 100644
index 0000000000000000000000000000000000000000..23cf4e914c9aff38fb8c7f610e290b6f6b8e3ec4
--- /dev/null
+++ b/UI/selectFile.py
@@ -0,0 +1,278 @@
+import os
+import datetime as datetime
+from PyQt5 import QtWidgets
+from Classes.stickysettings import StickySettings as SSet
+from UI import wSelectFile
+
+
+class OpenMeasurementDialog(QtWidgets.QDialog, wSelectFile.Ui_selectFile):
+    """Dialog to allow users to select measurement files for processing.
+
+    Parameters
+    ----------
+    wSelectFile.Ui_selectFile : QDialog
+        Dialog window with options for users
+
+    Attributes
+    ----------
+    settings: dict
+        Dictionary used to store user defined settings.
+    fullName: list
+        Full name of files including path.
+    fileName: list
+        List of one or more fileNames to be processed.
+    pathName: str
+        Path to folder containing files.
+    type: str
+        Type of file (SonTek, TRDI, QRev).
+    checked: bool
+        Switch for TRDI files (True: load only checked, False: load all).
+    """
+
+    def __init__(self, parent=None):
+        """Initializes settings and connections.
+
+        Parameters
+        ----------
+        parent
+            Identifies parent GUI.
+        """
+
+        super(OpenMeasurementDialog, self).__init__(parent)
+        self.setupUi(self)
+
+        # Create settings object which contains the default folder
+        self.settings = SSet(parent.settingsFile)
+
+        # Create connections for buttons
+        self.pbSonTek.clicked.connect(self.select_sontek)
+        self.pbTRDI.clicked.connect(self.select_trdi)
+        self.pbQRev.clicked.connect(self.select_qrev)
+        self.pbCancel.clicked.connect(self.cancel)
+
+        # Initialize parameters
+        self.fullName = []
+        self.fileName = []
+        self.pathName = []
+        self.type = ""
+        self.checked = False
+
+    def default_folder(self):
+        """Returns default folder.
+
+        Returns the folder stored in settings or if no folder is stored, then
+        the current working folder is returned.
+        """
+        try:
+            folder = self.settings.get("Folder")
+            if not folder:
+                folder = os.getcwd()
+        except KeyError:
+            self.settings.new("Folder", os.getcwd())
+            folder = self.settings.get("Folder")
+        return folder
+
+    def process_names(self):
+        """Parses fullnames into filenames and pathnames and sets default
+        folder.
+        """
+        # Parse filenames and pathname from fullName
+        if isinstance(self.fullName, str):
+            self.pathName, self.fileName = os.path.split(self.fullName)
+        else:
+            self.fileName = []
+            for file in self.fullName:
+                self.pathName, fileTemp = os.path.split(file)
+                self.fileName.append(fileTemp)
+
+        # Update the folder setting
+        self.settings.set("Folder", self.pathName)
+
+    def select_sontek(self):
+        """Get filenames and pathname for SonTek Matlab transect files
+
+        Allows the user to select one or more SonTek Matlab transect files for
+        processing. The selected folder becomes the default folder for
+        subsequent selectFile requests.
+        """
+
+        # Get the current folder setting.
+        folder = self.default_folder()
+
+        # Get the full names (path + file) of the selected files
+        self.fullName = QtWidgets.QFileDialog.getOpenFileNames(
+            self, self.tr("Open File"), folder, self.tr("SonTek Matlab File (*.mat)")
+        )[0]
+
+        # Initialize parameters
+        self.type = ""
+        self.checked = False
+
+        # Process fullName if selection was made
+        if self.fullName:
+            self.process_names()
+            self.type = "SonTek"
+        self.close()
+
+    def select_trdi(self):
+        """Get filenames and pathname for TRDI mmt file
+
+        Allows the user to select a TRDI mmt file for processing.
+        The selected folder becomes the default folder for subsequent
+        selectFile requests.
+        """
+
+        # Get the current folder setting.
+        folder = self.default_folder()
+
+        # Get the full names (path + file) of the selected files
+        self.fullName = QtWidgets.QFileDialog.getOpenFileNames(
+            self, self.tr("Open File"), folder, self.tr("TRDI mmt File (*.mmt)")
+        )[0]
+
+        # Initialize parameters
+        self.type = ""
+        self.checked = self.cbTRDI.isChecked()
+
+        # Process fullName if selection was made
+        if self.fullName:
+            self.type = "TRDI"
+            self.process_names()
+        self.close()
+
+    def select_qrev(self):
+        """Get filename and pathname of QRev file.
+
+        Allows the user to select a QRev file for viewing or
+        reprocessing. The selected folder becomes the default
+        folder for subsequent selectFile requests.
+        """
+
+        # Get the current folder setting.
+        folder = self.default_folder()
+
+        # Get the full names (path + file) of the selected file
+        self.fullName = QtWidgets.QFileDialog.getOpenFileName(
+            self, self.tr("Open File"), folder, self.tr("QRev File (*_QRev.mat)")
+        )[0]
+
+        # Initialize parameters
+        self.type = ""
+        self.checked = False
+
+        # Process fullName if selection was made
+        if self.fullName:
+            self.type = "QRev"
+            self.process_names()
+        self.close()
+
+    def cancel(self):
+        """Close dialog."""
+        self.type = ""
+        self.close()
+
+
+class SaveDialog(QtWidgets.QDialog):
+    """Dialog to allow users to specify file for saving (_QRev.mat or figure)
+
+    Parameters
+    ----------
+    wSelectFile.Ui_selectFile : QDialog
+        Dialog window with options for users
+
+    Attributes
+    ----------
+    full_Name: str
+        Filename with path to save file.
+    """
+
+    def __init__(self, group=None, save_type="QRev", parent=None):
+        """Initializes settings and connections.
+
+        Parameters
+        ----------
+        parent: QRev
+            Identifies parent GUI.
+        group: str
+            group number if split initiation
+        save_type: str
+            Indicates type of save
+        """
+        super(SaveDialog, self).__init__(parent)
+        # self.setupUi(self)
+        self.full_Name = None
+        self.file_extension = None
+        # Create settings object which contains the default folder
+        settings = SSet(parent.settingsFile)
+        folder = ""
+        title = ""
+        file_name = ""
+        filetype = ""
+
+        # Get the current folder setting.
+        if parent is not None:
+            if len(parent.path) > 0:
+                folder = parent.path
+            else:
+                folder = self.default_folder(settings)
+        version = str(int(round(float(parent.QRev_version[-4:]) * 100)))
+        # Create default file name
+        if save_type == "QRev":
+            if group is None:
+                file_name = os.path.join(
+                    folder,
+                    datetime.datetime.today().strftime(
+                        "%Y%m%d_%H%M%S_" + version + "_QRev.mat"
+                    ),
+                )
+            else:
+                file_name = os.path.join(
+                    folder,
+                    datetime.datetime.today().strftime(
+                        "%Y%m%d_%H%M%S_" + group + "_" + version + "_QRev.mat"
+                    ),
+                )
+            title = self.tr("Save File")
+            filetype = self.tr("QRev File (*_QRev.mat)")
+
+        elif save_type == "fig":
+            file_name = folder + "/" + folder.split("/")[-1]
+            title = self.tr("Save figure")
+            filetype = f"PNG (*.png);;JPEG (*.jpeg);;PDF (*.pdf);;SVG (*.svg);;{self.tr('All Files')} (*)"
+
+        elif save_type == "MAP":
+            file_name = folder + "/MAP_" + folder.split("/")[-1]
+            title = self.tr("Save MAP")
+            filetype = (
+                f"{self.tr('csv (separator: semicolon)')}( *.csv);;"
+                f"{self.tr('text (separator: space)')}(*.txt);;"
+                f"{self.tr('All Files')} (*)"
+            )
+        # Get the full names (path + file) of the selected file
+        file_save = QtWidgets.QFileDialog.getSaveFileName(
+            self, title, file_name, filetype
+        )
+
+        if file_save is not None:
+            self.full_Name, file_type = file_save
+            file_extension = file_type.split("*")[-1][:-1]
+            if len(self.full_Name) > 0:
+                self.file_extension = file_extension
+                if self.full_Name[-len(file_extension) :] != file_extension:
+                    self.full_Name = self.full_Name + file_extension
+
+    @staticmethod
+    def default_folder(settings):
+        """Returns default folder.
+
+        Returns the folder stored in settings or if no folder is stored,
+        then the current working folder is returned.
+        """
+        try:
+            folder = settings.get("Folder")
+            if not folder:
+                folder = os.getcwd()
+        except KeyError:
+            settings.new("Folder", os.getcwd())
+            folder = settings.get("Folder")
+        return folder
diff --git a/UI/wComment.py b/UI/wComment.py
new file mode 100644
index 0000000000000000000000000000000000000000..b6b5f0664f3472a5f8e163661d7504e08b111370
--- /dev/null
+++ b/UI/wComment.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wComment.ui'
+#
+# Created by: PyQt5 UI code generator 5.9.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_Comment(object):
+    def setupUi(self, Comment):
+        Comment.setObjectName("Comment")
+        Comment.setWindowModality(QtCore.Qt.ApplicationModal)
+        Comment.resize(643, 172)
+        self.buttonBox = QtWidgets.QDialogButtonBox(Comment)
+        self.buttonBox.setGeometry(QtCore.QRect(270, 120, 341, 32))
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.text_edit_comment = QtWidgets.QPlainTextEdit(Comment)
+        self.text_edit_comment.setGeometry(QtCore.QRect(10, 10, 611, 101))
+        self.text_edit_comment.setObjectName("text_edit_comment")
+
+        self.retranslateUi(Comment)
+        self.buttonBox.accepted.connect(Comment.accept)
+        self.buttonBox.rejected.connect(Comment.reject)
+        QtCore.QMetaObject.connectSlotsByName(Comment)
+
+    def retranslateUi(self, Comment):
+        _translate = QtCore.QCoreApplication.translate
+        Comment.setWindowTitle(_translate("Comment", "Enter Comment"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    Comment = QtWidgets.QDialog()
+    ui = Ui_Comment()
+    ui.setupUi(Comment)
+    Comment.show()
+    sys.exit(app.exec_())
diff --git a/UI/wComment.ui b/UI/wComment.ui
new file mode 100644
index 0000000000000000000000000000000000000000..d26650c2989bc9eb91fddf64ef57540f46f9a63e
--- /dev/null
+++ b/UI/wComment.ui
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Comment</class>
+ <widget class="QDialog" name="Comment">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>643</width>
+    <height>172</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Enter Comment</string>
+  </property>
+  <widget class="QDialogButtonBox" name="buttonBox">
+   <property name="geometry">
+    <rect>
+     <x>270</x>
+     <y>120</y>
+     <width>341</width>
+     <height>32</height>
+    </rect>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Horizontal</enum>
+   </property>
+   <property name="standardButtons">
+    <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+   </property>
+  </widget>
+  <widget class="QPlainTextEdit" name="text_edit_comment">
+   <property name="geometry">
+    <rect>
+     <x>10</x>
+     <y>10</y>
+     <width>611</width>
+     <height>101</height>
+    </rect>
+   </property>
+  </widget>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Comment</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Comment</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wCommenti_2_py.bat b/UI/wCommenti_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..022ac35d1653b9695d08b6919243ae0a274a3a72
--- /dev/null
+++ b/UI/wCommenti_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wComment.ui -o wComment.py
diff --git a/UI/wCompSel.ui b/UI/wCompSel.ui
new file mode 100644
index 0000000000000000000000000000000000000000..710410a81fea128b3bc761e3d5491c920ec687b3
--- /dev/null
+++ b/UI/wCompSel.ui
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>hoffset</class>
+ <widget class="QDialog" name="hoffset">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>342</width>
+    <height>155</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Heading Offset</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="hoffset_label">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string>Heading Offset</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1,2">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="ed_hoffset">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+            </font>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_hoffset">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Apply To:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_all">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>All Transects</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_transect">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Transect Only</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>hoffset</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>hoffset</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wDisclaimer.py b/UI/wDisclaimer.py
new file mode 100644
index 0000000000000000000000000000000000000000..34d31ec7f016e1ef56afe60833e8564940f730ce
--- /dev/null
+++ b/UI/wDisclaimer.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wDisclaimer.ui'
+#
+# Created by: PyQt5 UI code generator 5.13.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_Disclaimer(object):
+    def setupUi(self, Disclaimer):
+        Disclaimer.setObjectName("Disclaimer")
+        Disclaimer.resize(879, 586)
+        self.gridLayout = QtWidgets.QGridLayout(Disclaimer)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.disclaimer_title = QtWidgets.QLabel(Disclaimer)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.disclaimer_title.setFont(font)
+        self.disclaimer_title.setObjectName("disclaimer_title")
+        self.verticalLayout.addWidget(self.disclaimer_title)
+        self.disclaimer_and_license_text = QtWidgets.QTextEdit(Disclaimer)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.disclaimer_and_license_text.setFont(font)
+        self.disclaimer_and_license_text.setInputMethodHints(QtCore.Qt.ImhNone)
+        self.disclaimer_and_license_text.setReadOnly(True)
+        self.disclaimer_and_license_text.setTextInteractionFlags(
+            QtCore.Qt.NoTextInteraction
+        )
+        self.disclaimer_and_license_text.setObjectName("disclaimer_and_license_text")
+        self.verticalLayout.addWidget(self.disclaimer_and_license_text)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem)
+        self.label = QtWidgets.QLabel(Disclaimer)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setItalic(False)
+        font.setWeight(75)
+        self.label.setFont(font)
+        self.label.setObjectName("label")
+        self.horizontalLayout.addWidget(self.label)
+        self.buttonBox = QtWidgets.QDialogButtonBox(Disclaimer)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.buttonBox.setFont(font)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.No | QtWidgets.QDialogButtonBox.Yes
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.horizontalLayout.addWidget(self.buttonBox)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+
+        self.retranslateUi(Disclaimer)
+        self.buttonBox.accepted.connect(Disclaimer.accept)
+        self.buttonBox.rejected.connect(Disclaimer.reject)
+        QtCore.QMetaObject.connectSlotsByName(Disclaimer)
+
+    def retranslateUi(self, Disclaimer):
+        _translate = QtCore.QCoreApplication.translate
+        Disclaimer.setWindowTitle(
+            _translate("Disclaimer", "Disclaimer and License Acceptance")
+        )
+        self.disclaimer_title.setText(
+            _translate("Disclaimer", "Disclaimer and License ")
+        )
+        self.disclaimer_and_license_text.setHtml(
+            _translate(
+                "Disclaimer",
+                '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">\n'
+                '<html><head><meta name="qrichtext" content="1" /><style type="text/css">\n'
+                "p, li { white-space: pre-wrap; }\n"
+                "</style></head><body style=\" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+                '<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">DISCLAIMER</span><br />This software (QRevInt) is a fork of QRev, which was originally approved for release by the U.S. Geological Survey (USGS), IP-118174. Genesis HydroTech LLC through funding from various international agencies is working to improve and expand the capabilities and features available in QRevInt. While Genesis HydroTech LLC makes every effort to deliver high quality products, Genesis HydroTech LLC does not guarantee that the product is free from defects. QRevInt is provided “as is,&quot; and you use the software at your own risk. Genesis HydroTech LLC and contributing agencies make no warranties as to performance, merchantability, fitness for a particular purpose, or any other warranties whether expressed or implied. No oral or written communication from or information provided by Genesis HydroTech LLC or contributing agencies shall create a warranty. Under no circumstances shall Genesis HydroTech LLC or the contributing agencies be liable for direct, indirect, special, incidental, or consequential damages resulting from the use, misuse, or inability to use this software, even if Genesis HydroTech LLC or the contributing agencies have been advised of the possibility of such damages.<br /><br /><span style=" font-weight:600;">LICENSE</span><br />Unless otherwise noted, this project is in the public domain in the United States because it contains materials that originally came from the United States Geological Survey, an agency of the United States Department of Interior. For more information, see the official USGS copyright policy at https://www.usgs.gov/information-policies-and-instructions/copyrights-and-credits. Additionally, Genesis HydroTech LLC waives copyright and related rights in the work worldwide through the CC0 1.0 Universal public domain dedication.<br /><br />QRevInt includes several open-source software packages. These open-source packages are governed by the terms and conditions of the applicable open-source license, and you are bound by the terms and conditions of the applicable open-source license in connection with your use and distribution of the open-source software in this product. <br /><br /><span style=" font-weight:600;">Copyright / License - CC0 1.0</span>: The person who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. You can copy, modify, distribute, and perform the work, even for commercial purposes, all without asking permission. <br /><br />In no way are the patent or trademark rights of any person affected by CC0, nor are the rights that other persons may have in the work or in how the work is used, such as publicity or privacy rights.<br /><br />Unless expressly stated otherwise, the person who associated a work with this deed makes no warranties about the work, and disclaims liability for all uses of the work, to the fullest extent permitted by applicable law.<br /><br />When using or citing the work, you should not imply endorsement by the author or the affirmer.<br /><br /><span style=" font-weight:600;">Publicity or privacy</span>: The use of a work free of known copyright restrictions may be otherwise regulated or limited. The work or its use may be subject to personal data protection laws, publicity, image, or privacy rights that allow a person to control how their voice, image or likeness is used, or other restrictions or limitations under applicable law.<br /><br /><span style=" font-weight:600;">Endorsement</span>: In some jurisdictions, wrongfully implying that an author, publisher or anyone else endorses your use of a work may be unlawful. </p></body></html>',
+            )
+        )
+        self.label.setText(
+            _translate("Disclaimer", "Do you agree to the disclaimer and license?")
+        )
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    Disclaimer = QtWidgets.QDialog()
+    ui = Ui_Disclaimer()
+    ui.setupUi(Disclaimer)
+    Disclaimer.show()
+    sys.exit(app.exec_())
diff --git a/UI/wDisclaimer.ui b/UI/wDisclaimer.ui
new file mode 100644
index 0000000000000000000000000000000000000000..739d19d869f2c36cdf6fc990f3680a85cc5d9242
--- /dev/null
+++ b/UI/wDisclaimer.ui
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Disclaimer</class>
+ <widget class="QDialog" name="Disclaimer">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>879</width>
+    <height>586</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Disclaimer and License Acceptance</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QLabel" name="disclaimer_title">
+       <property name="font">
+        <font>
+         <pointsize>12</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="text">
+        <string>Disclaimer and License </string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QTextEdit" name="disclaimer_and_license_text">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+        </font>
+       </property>
+       <property name="inputMethodHints">
+        <set>Qt::ImhNone</set>
+       </property>
+       <property name="readOnly">
+        <bool>true</bool>
+       </property>
+       <property name="html">
+        <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;DISCLAIMER&lt;/span&gt;&lt;br /&gt;This software (QRevInt) is a fork of QRev, which was originally approved for release by the U.S. Geological Survey (USGS), IP-118174. Genesis HydroTech LLC through funding from various international agencies is working to improve and expand the capabilities and features available in QRevInt. While Genesis HydroTech LLC makes every effort to deliver high quality products, Genesis HydroTech LLC does not guarantee that the product is free from defects. QRevInt is provided “as is,&amp;quot; and you use the software at your own risk. Genesis HydroTech LLC and contributing agencies make no warranties as to performance, merchantability, fitness for a particular purpose, or any other warranties whether expressed or implied. No oral or written communication from or information provided by Genesis HydroTech LLC or contributing agencies shall create a warranty. Under no circumstances shall Genesis HydroTech LLC or the contributing agencies be liable for direct, indirect, special, incidental, or consequential damages resulting from the use, misuse, or inability to use this software, even if Genesis HydroTech LLC or the contributing agencies have been advised of the possibility of such damages.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;LICENSE&lt;/span&gt;&lt;br /&gt;Unless otherwise noted, this project is in the public domain in the United States because it contains materials that originally came from the United States Geological Survey, an agency of the United States Department of Interior. For more information, see the official USGS copyright policy at https://www.usgs.gov/information-policies-and-instructions/copyrights-and-credits. Additionally, Genesis HydroTech LLC waives copyright and related rights in the work worldwide through the CC0 1.0 Universal public domain dedication.&lt;br /&gt;&lt;br /&gt;QRevInt includes several open-source software packages. These open-source packages are governed by the terms and conditions of the applicable open-source license, and you are bound by the terms and conditions of the applicable open-source license in connection with your use and distribution of the open-source software in this product. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Copyright / License - CC0 1.0&lt;/span&gt;: The person who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. You can copy, modify, distribute, and perform the work, even for commercial purposes, all without asking permission. &lt;br /&gt;&lt;br /&gt;In no way are the patent or trademark rights of any person affected by CC0, nor are the rights that other persons may have in the work or in how the work is used, such as publicity or privacy rights.&lt;br /&gt;&lt;br /&gt;Unless expressly stated otherwise, the person who associated a work with this deed makes no warranties about the work, and disclaims liability for all uses of the work, to the fullest extent permitted by applicable law.&lt;br /&gt;&lt;br /&gt;When using or citing the work, you should not imply endorsement by the author or the affirmer.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Publicity or privacy&lt;/span&gt;: The use of a work free of known copyright restrictions may be otherwise regulated or limited. The work or its use may be subject to personal data protection laws, publicity, image, or privacy rights that allow a person to control how their voice, image or likeness is used, or other restrictions or limitations under applicable law.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Endorsement&lt;/span&gt;: In some jurisdictions, wrongfully implying that an author, publisher or anyone else endorses your use of a work may be unlawful. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+       </property>
+       <property name="textInteractionFlags">
+        <set>Qt::NoTextInteraction</set>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="font">
+          <font>
+           <pointsize>12</pointsize>
+          </font>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QLabel" name="label">
+         <property name="font">
+          <font>
+           <pointsize>12</pointsize>
+           <weight>75</weight>
+           <italic>false</italic>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>Do you agree to the disclaimer and license?</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QDialogButtonBox" name="buttonBox">
+         <property name="font">
+          <font>
+           <pointsize>12</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="standardButtons">
+          <set>QDialogButtonBox::No|QDialogButtonBox::Yes</set>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Disclaimer</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Disclaimer</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wDraft.py b/UI/wDraft.py
new file mode 100644
index 0000000000000000000000000000000000000000..15c16b60a1b2e87ac5d0b053df96919f56dba758
--- /dev/null
+++ b/UI/wDraft.py
@@ -0,0 +1,135 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wDraft.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_draft(object):
+    def setupUi(self, draft):
+        draft.setObjectName("draft")
+        draft.resize(342, 155)
+        self.gridLayout_2 = QtWidgets.QGridLayout(draft)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        spacerItem = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.draft_label = QtWidgets.QLabel(draft)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.draft_label.setFont(font)
+        self.draft_label.setObjectName("draft_label")
+        self.horizontalLayout_2.addWidget(self.draft_label)
+        spacerItem2 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem3 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem3)
+        self.ed_draft = QtWidgets.QLineEdit(draft)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_draft.setFont(font)
+        self.ed_draft.setObjectName("ed_draft")
+        self.horizontalLayout.addWidget(self.ed_draft)
+        self.draft_units = QtWidgets.QLabel(draft)
+        self.draft_units.setObjectName("draft_units")
+        self.horizontalLayout.addWidget(self.draft_units)
+        spacerItem4 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem4)
+        self.horizontalLayout.setStretch(0, 2)
+        self.horizontalLayout.setStretch(1, 1)
+        self.horizontalLayout.setStretch(3, 2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        spacerItem5 = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem5)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+        self.gb_hoffset = QtWidgets.QGroupBox(draft)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_hoffset.setFont(font)
+        self.gb_hoffset.setObjectName("gb_hoffset")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_hoffset)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_all = QtWidgets.QRadioButton(self.gb_hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_all.setFont(font)
+        self.rb_all.setChecked(True)
+        self.rb_all.setObjectName("rb_all")
+        self.verticalLayout.addWidget(self.rb_all)
+        self.rb_transect = QtWidgets.QRadioButton(self.gb_hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_transect.setFont(font)
+        self.rb_transect.setObjectName("rb_transect")
+        self.verticalLayout.addWidget(self.rb_transect)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout_3.addWidget(self.gb_hoffset)
+        self.gridLayout_2.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(draft)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
+
+        self.retranslateUi(draft)
+        self.buttonBox.accepted.connect(draft.accept)
+        self.buttonBox.rejected.connect(draft.reject)
+        QtCore.QMetaObject.connectSlotsByName(draft)
+
+    def retranslateUi(self, draft):
+        _translate = QtCore.QCoreApplication.translate
+        draft.setWindowTitle(_translate("draft", "Draft"))
+        self.draft_label.setText(_translate("draft", "Draft"))
+        self.draft_units.setText(_translate("draft", "ft"))
+        self.gb_hoffset.setTitle(_translate("draft", "Apply To:"))
+        self.rb_all.setText(_translate("draft", "All Transects"))
+        self.rb_transect.setText(_translate("draft", "Transect Only"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    draft = QtWidgets.QDialog()
+    ui = Ui_draft()
+    ui.setupUi(draft)
+    draft.show()
+    sys.exit(app.exec_())
diff --git a/UI/wDraft.ui b/UI/wDraft.ui
new file mode 100644
index 0000000000000000000000000000000000000000..e13996362cf1a0d63f7d9a1cc4cb9d91f5e9ca4a
--- /dev/null
+++ b/UI/wDraft.ui
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>draft</class>
+ <widget class="QDialog" name="draft">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>342</width>
+    <height>155</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Draft</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="draft_label">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string>Draft</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1,0,2">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="ed_draft">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+            </font>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="draft_units">
+           <property name="text">
+            <string>ft</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_hoffset">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Apply To:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_all">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>All Transects</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_transect">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Transect Only</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>draft</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>draft</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wDraft_2_py.bat b/UI/wDraft_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..7b479290031c9a1c8aadecb03571747907eca97c
--- /dev/null
+++ b/UI/wDraft_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wDraft.ui -o wDraft.py
diff --git a/UI/wEdgeDist.py b/UI/wEdgeDist.py
new file mode 100644
index 0000000000000000000000000000000000000000..38dfa868d3343e4292879f697b7d5e6376832573
--- /dev/null
+++ b/UI/wEdgeDist.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wEdgeDist.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_edge_dist(object):
+    def setupUi(self, edge_dist):
+        edge_dist.setObjectName("edge_dist")
+        edge_dist.resize(236, 120)
+        self.gridLayout_2 = QtWidgets.QGridLayout(edge_dist)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        spacerItem = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.edge_dist_label = QtWidgets.QLabel(edge_dist)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.edge_dist_label.setFont(font)
+        self.edge_dist_label.setObjectName("edge_dist_label")
+        self.horizontalLayout_2.addWidget(self.edge_dist_label)
+        spacerItem2 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem3 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem3)
+        self.ed_edge_dist = QtWidgets.QLineEdit(edge_dist)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_edge_dist.setFont(font)
+        self.ed_edge_dist.setObjectName("ed_edge_dist")
+        self.horizontalLayout.addWidget(self.ed_edge_dist)
+        spacerItem4 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem4)
+        self.horizontalLayout.setStretch(0, 2)
+        self.horizontalLayout.setStretch(1, 1)
+        self.horizontalLayout.setStretch(2, 2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        spacerItem5 = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem5)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+        self.gb_apply_to = QtWidgets.QGroupBox(edge_dist)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_apply_to.setFont(font)
+        self.gb_apply_to.setObjectName("gb_apply_to")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_apply_to)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_all = QtWidgets.QRadioButton(self.gb_apply_to)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_all.setFont(font)
+        self.rb_all.setChecked(True)
+        self.rb_all.setObjectName("rb_all")
+        self.verticalLayout.addWidget(self.rb_all)
+        self.rb_transect = QtWidgets.QRadioButton(self.gb_apply_to)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_transect.setFont(font)
+        self.rb_transect.setObjectName("rb_transect")
+        self.verticalLayout.addWidget(self.rb_transect)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout_3.addWidget(self.gb_apply_to)
+        self.gridLayout_2.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(edge_dist)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
+
+        self.retranslateUi(edge_dist)
+        self.buttonBox.accepted.connect(edge_dist.accept)
+        self.buttonBox.rejected.connect(edge_dist.reject)
+        QtCore.QMetaObject.connectSlotsByName(edge_dist)
+
+    def retranslateUi(self, edge_dist):
+        _translate = QtCore.QCoreApplication.translate
+        edge_dist.setWindowTitle(_translate("edge_dist", "Edge Distance"))
+        self.edge_dist_label.setText(_translate("edge_dist", "Distance to Edge"))
+        self.gb_apply_to.setTitle(_translate("edge_dist", "Apply To:"))
+        self.rb_all.setText(_translate("edge_dist", "All Transects"))
+        self.rb_transect.setText(_translate("edge_dist", "Transect Only"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    edge_dist = QtWidgets.QDialog()
+    ui = Ui_edge_dist()
+    ui.setupUi(edge_dist)
+    edge_dist.show()
+    sys.exit(app.exec_())
diff --git a/UI/wEdgeDist.ui b/UI/wEdgeDist.ui
new file mode 100644
index 0000000000000000000000000000000000000000..518bde036c6510fd1783ae7927d8d315fcbf37da
--- /dev/null
+++ b/UI/wEdgeDist.ui
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>edge_dist</class>
+ <widget class="QDialog" name="edge_dist">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>258</width>
+    <height>133</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Edge Distance</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="edge_dist_label">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+             <weight>50</weight>
+             <bold>false</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string>Distance to Edge</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1,2">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="ed_edge_dist">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+            </font>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_apply_to">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Apply To:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_all">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>All Transects</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_transect">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Transect Only</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>edge_dist</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>edge_dist</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wEdgeDist_2_py.bat b/UI/wEdgeDist_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..7360a800002c47fea566f4d1f99edc3cd84096a9
--- /dev/null
+++ b/UI/wEdgeDist_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wEdgeDist.ui -o wEdgeDist.py
diff --git a/UI/wEdgeEns.py b/UI/wEdgeEns.py
new file mode 100644
index 0000000000000000000000000000000000000000..7375fc2a20ff4e231a718392ab5117267657a0a4
--- /dev/null
+++ b/UI/wEdgeEns.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wEdgeEns.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_edge_ens(object):
+    def setupUi(self, edge_ens):
+        edge_ens.setObjectName("edge_ens")
+        edge_ens.resize(277, 120)
+        self.gridLayout_2 = QtWidgets.QGridLayout(edge_ens)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        spacerItem = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.edge_ens_label = QtWidgets.QLabel(edge_ens)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.edge_ens_label.setFont(font)
+        self.edge_ens_label.setObjectName("edge_ens_label")
+        self.horizontalLayout_2.addWidget(self.edge_ens_label)
+        spacerItem2 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem3 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem3)
+        self.ed_edge_ens = QtWidgets.QLineEdit(edge_ens)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_edge_ens.setFont(font)
+        self.ed_edge_ens.setObjectName("ed_edge_ens")
+        self.horizontalLayout.addWidget(self.ed_edge_ens)
+        spacerItem4 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem4)
+        self.horizontalLayout.setStretch(0, 2)
+        self.horizontalLayout.setStretch(1, 1)
+        self.horizontalLayout.setStretch(2, 2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        spacerItem5 = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem5)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+        self.gb_apply_to = QtWidgets.QGroupBox(edge_ens)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_apply_to.setFont(font)
+        self.gb_apply_to.setObjectName("gb_apply_to")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_apply_to)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_all = QtWidgets.QRadioButton(self.gb_apply_to)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_all.setFont(font)
+        self.rb_all.setChecked(True)
+        self.rb_all.setObjectName("rb_all")
+        self.verticalLayout.addWidget(self.rb_all)
+        self.rb_transect = QtWidgets.QRadioButton(self.gb_apply_to)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_transect.setFont(font)
+        self.rb_transect.setObjectName("rb_transect")
+        self.verticalLayout.addWidget(self.rb_transect)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout_3.addWidget(self.gb_apply_to)
+        self.gridLayout_2.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(edge_ens)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
+
+        self.retranslateUi(edge_ens)
+        self.buttonBox.accepted.connect(edge_ens.accept)
+        self.buttonBox.rejected.connect(edge_ens.reject)
+        QtCore.QMetaObject.connectSlotsByName(edge_ens)
+
+    def retranslateUi(self, edge_ens):
+        _translate = QtCore.QCoreApplication.translate
+        edge_ens.setWindowTitle(_translate("edge_ens", "Edge Ensembles"))
+        self.edge_ens_label.setText(_translate("edge_ens", "Number of Edge Ensembles"))
+        self.gb_apply_to.setTitle(_translate("edge_ens", "Apply To:"))
+        self.rb_all.setText(_translate("edge_ens", "All Transects"))
+        self.rb_transect.setText(_translate("edge_ens", "Transect Only"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    edge_ens = QtWidgets.QDialog()
+    ui = Ui_edge_ens()
+    ui.setupUi(edge_ens)
+    edge_ens.show()
+    sys.exit(app.exec_())
diff --git a/UI/wEdgeEns.ui b/UI/wEdgeEns.ui
new file mode 100644
index 0000000000000000000000000000000000000000..b5f787a5ac020560f894323654ed6debb1dac43a
--- /dev/null
+++ b/UI/wEdgeEns.ui
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>edge_ens</class>
+ <widget class="QDialog" name="edge_ens">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>277</width>
+    <height>120</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Edge Ensembles</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="edge_ens_label">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+             <weight>50</weight>
+             <bold>false</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string>Number of Edge Ensembles</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1,2">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="ed_edge_ens">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+            </font>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_apply_to">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Apply To:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_all">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>All Transects</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_transect">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Transect Only</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>edge_ens</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>edge_ens</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wEdgeEns_2_py.bat b/UI/wEdgeEns_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..a4e33e324c9d29070ac3bd52aab2d94306157c9d
--- /dev/null
+++ b/UI/wEdgeEns_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wEdgeEns.ui -o wEdgeEns.py
diff --git a/UI/wEdgeType.py b/UI/wEdgeType.py
new file mode 100644
index 0000000000000000000000000000000000000000..4f74083bf34ca88a3856d955dfc8f3144fa2dd25
--- /dev/null
+++ b/UI/wEdgeType.py
@@ -0,0 +1,166 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wEdgeType.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_edge_type(object):
+    def setupUi(self, edge_type):
+        edge_type.setObjectName("edge_type")
+        edge_type.resize(298, 193)
+        self.gridLayout_2 = QtWidgets.QGridLayout(edge_type)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.gb_edge_type = QtWidgets.QGroupBox(edge_type)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_edge_type.setFont(font)
+        self.gb_edge_type.setObjectName("gb_edge_type")
+        self.gridLayout_3 = QtWidgets.QGridLayout(self.gb_edge_type)
+        self.gridLayout_3.setObjectName("gridLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.rb_triangular = QtWidgets.QRadioButton(self.gb_edge_type)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_triangular.setFont(font)
+        self.rb_triangular.setObjectName("rb_triangular")
+        self.verticalLayout_2.addWidget(self.rb_triangular)
+        self.rb_rectangular = QtWidgets.QRadioButton(self.gb_edge_type)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_rectangular.setFont(font)
+        self.rb_rectangular.setObjectName("rb_rectangular")
+        self.verticalLayout_2.addWidget(self.rb_rectangular)
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        self.rb_custom = QtWidgets.QRadioButton(self.gb_edge_type)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_custom.setFont(font)
+        self.rb_custom.setObjectName("rb_custom")
+        self.horizontalLayout_4.addWidget(self.rb_custom)
+        self.ed_custom = QtWidgets.QLineEdit(self.gb_edge_type)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_custom.setFont(font)
+        self.ed_custom.setObjectName("ed_custom")
+        self.horizontalLayout_4.addWidget(self.ed_custom)
+        spacerItem = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_4.addItem(spacerItem)
+        self.horizontalLayout_4.setStretch(0, 1)
+        self.horizontalLayout_4.setStretch(1, 1)
+        self.horizontalLayout_4.setStretch(2, 3)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_4)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setSpacing(8)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.rb_user = QtWidgets.QRadioButton(self.gb_edge_type)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_user.setFont(font)
+        self.rb_user.setObjectName("rb_user")
+        self.horizontalLayout_2.addWidget(self.rb_user)
+        self.ed_q_user = QtWidgets.QLineEdit(self.gb_edge_type)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_q_user.setFont(font)
+        self.ed_q_user.setObjectName("ed_q_user")
+        self.horizontalLayout_2.addWidget(self.ed_q_user)
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.horizontalLayout_2.setStretch(0, 1)
+        self.horizontalLayout_2.setStretch(1, 1)
+        self.horizontalLayout_2.setStretch(2, 3)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.gridLayout_3.addLayout(self.verticalLayout_2, 0, 0, 1, 1)
+        self.horizontalLayout.addWidget(self.gb_edge_type)
+        self.gb_apply_to = QtWidgets.QGroupBox(edge_type)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_apply_to.setFont(font)
+        self.gb_apply_to.setObjectName("gb_apply_to")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_apply_to)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_all = QtWidgets.QRadioButton(self.gb_apply_to)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_all.setFont(font)
+        self.rb_all.setChecked(True)
+        self.rb_all.setObjectName("rb_all")
+        self.verticalLayout.addWidget(self.rb_all)
+        self.rb_transect = QtWidgets.QRadioButton(self.gb_apply_to)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_transect.setFont(font)
+        self.rb_transect.setObjectName("rb_transect")
+        self.verticalLayout.addWidget(self.rb_transect)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout.addWidget(self.gb_apply_to)
+        self.horizontalLayout.setStretch(0, 2)
+        self.horizontalLayout.setStretch(1, 1)
+        self.verticalLayout_3.addLayout(self.horizontalLayout)
+        self.buttonBox = QtWidgets.QDialogButtonBox(edge_type)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.verticalLayout_3.addWidget(self.buttonBox)
+        self.gridLayout_2.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
+
+        self.retranslateUi(edge_type)
+        self.buttonBox.accepted.connect(edge_type.accept)
+        self.buttonBox.rejected.connect(edge_type.reject)
+        QtCore.QMetaObject.connectSlotsByName(edge_type)
+
+    def retranslateUi(self, edge_type):
+        _translate = QtCore.QCoreApplication.translate
+        edge_type.setWindowTitle(_translate("edge_type", "Edge Type"))
+        self.gb_edge_type.setTitle(_translate("edge_type", "Edge Type"))
+        self.rb_triangular.setText(_translate("edge_type", "Triangular (0.3535)"))
+        self.rb_rectangular.setText(_translate("edge_type", "Rectangular (0.91)"))
+        self.rb_custom.setText(_translate("edge_type", "Custom"))
+        self.rb_user.setText(_translate("edge_type", "User Q"))
+        self.gb_apply_to.setTitle(_translate("edge_type", "Apply To:"))
+        self.rb_all.setText(_translate("edge_type", "All Transects"))
+        self.rb_transect.setText(_translate("edge_type", "Transect Only"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    edge_type = QtWidgets.QDialog()
+    ui = Ui_edge_type()
+    ui.setupUi(edge_type)
+    edge_type.show()
+    sys.exit(app.exec_())
diff --git a/UI/wEdgeType.ui b/UI/wEdgeType.ui
new file mode 100644
index 0000000000000000000000000000000000000000..c224e765189597a430b3f5b656e9f98dc1e238ff
--- /dev/null
+++ b/UI/wEdgeType.ui
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>edge_type</class>
+ <widget class="QDialog" name="edge_type">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>298</width>
+    <height>193</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Edge Type</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1">
+       <item>
+        <widget class="QGroupBox" name="gb_edge_type">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="title">
+          <string>Edge Type</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_3">
+          <item row="0" column="0">
+           <layout class="QVBoxLayout" name="verticalLayout_2">
+            <item>
+             <widget class="QRadioButton" name="rb_triangular">
+              <property name="font">
+               <font>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Triangular (0.3535)</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_rectangular">
+              <property name="font">
+               <font>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Rectangular (0.91)</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <layout class="QHBoxLayout" name="horizontalLayout_4" stretch="1,1,3">
+              <item>
+               <widget class="QRadioButton" name="rb_custom">
+                <property name="font">
+                 <font>
+                  <weight>50</weight>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Custom</string>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLineEdit" name="ed_custom">
+                <property name="font">
+                 <font>
+                  <weight>50</weight>
+                  <bold>false</bold>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <spacer name="horizontalSpacer_3">
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+                <property name="sizeHint" stdset="0">
+                 <size>
+                  <width>40</width>
+                  <height>20</height>
+                 </size>
+                </property>
+               </spacer>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="1,1,3">
+              <property name="spacing">
+               <number>8</number>
+              </property>
+              <item>
+               <widget class="QRadioButton" name="rb_user">
+                <property name="font">
+                 <font>
+                  <weight>50</weight>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>User Q</string>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLineEdit" name="ed_q_user">
+                <property name="font">
+                 <font>
+                  <weight>50</weight>
+                  <bold>false</bold>
+                 </font>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <spacer name="horizontalSpacer">
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+                <property name="sizeHint" stdset="0">
+                 <size>
+                  <width>40</width>
+                  <height>20</height>
+                 </size>
+                </property>
+               </spacer>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="gb_apply_to">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="title">
+          <string>Apply To:</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout">
+          <item row="0" column="0">
+           <layout class="QVBoxLayout" name="verticalLayout">
+            <item>
+             <widget class="QRadioButton" name="rb_all">
+              <property name="font">
+               <font>
+                <pointsize>10</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>All Transects</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_transect">
+              <property name="font">
+               <font>
+                <pointsize>10</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Transect Only</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>edge_type</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>edge_type</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wEdgeType_2_py.bat b/UI/wEdgeType_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..485ececb9257d53a6f7bf3005fd8a973d4db9b70
--- /dev/null
+++ b/UI/wEdgeType_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wEdgeType.ui -o wEdgeType.py
diff --git a/UI/wHOffset.py b/UI/wHOffset.py
new file mode 100644
index 0000000000000000000000000000000000000000..6cfb31979959b87c46e1d76d86aded789f3736f0
--- /dev/null
+++ b/UI/wHOffset.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wHOffset.ui'
+#
+# Created by: PyQt5 UI code generator 5.10.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_hoffset(object):
+    def setupUi(self, hoffset):
+        hoffset.setObjectName("hoffset")
+        hoffset.resize(342, 155)
+        self.gridLayout_2 = QtWidgets.QGridLayout(hoffset)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        spacerItem = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.hoffset_label = QtWidgets.QLabel(hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.hoffset_label.setFont(font)
+        self.hoffset_label.setObjectName("hoffset_label")
+        self.horizontalLayout_2.addWidget(self.hoffset_label)
+        spacerItem2 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem3 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem3)
+        self.ed_hoffset = QtWidgets.QLineEdit(hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_hoffset.setFont(font)
+        self.ed_hoffset.setObjectName("ed_hoffset")
+        self.horizontalLayout.addWidget(self.ed_hoffset)
+        spacerItem4 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem4)
+        self.horizontalLayout.setStretch(0, 2)
+        self.horizontalLayout.setStretch(1, 1)
+        self.horizontalLayout.setStretch(2, 2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        spacerItem5 = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem5)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+        self.gb_hoffset = QtWidgets.QGroupBox(hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_hoffset.setFont(font)
+        self.gb_hoffset.setObjectName("gb_hoffset")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_hoffset)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_all = QtWidgets.QRadioButton(self.gb_hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_all.setFont(font)
+        self.rb_all.setChecked(True)
+        self.rb_all.setObjectName("rb_all")
+        self.verticalLayout.addWidget(self.rb_all)
+        self.rb_transect = QtWidgets.QRadioButton(self.gb_hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_transect.setFont(font)
+        self.rb_transect.setObjectName("rb_transect")
+        self.verticalLayout.addWidget(self.rb_transect)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout_3.addWidget(self.gb_hoffset)
+        self.gridLayout_2.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(hoffset)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
+
+        self.retranslateUi(hoffset)
+        self.buttonBox.accepted.connect(hoffset.accept)
+        self.buttonBox.rejected.connect(hoffset.reject)
+        QtCore.QMetaObject.connectSlotsByName(hoffset)
+
+    def retranslateUi(self, hoffset):
+        _translate = QtCore.QCoreApplication.translate
+        hoffset.setWindowTitle(_translate("hoffset", "Heading Offset"))
+        self.hoffset_label.setText(_translate("hoffset", "Heading Offset"))
+        self.gb_hoffset.setTitle(_translate("hoffset", "Apply To:"))
+        self.rb_all.setText(_translate("hoffset", "All Transects"))
+        self.rb_transect.setText(_translate("hoffset", "Transect Only"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    hoffset = QtWidgets.QDialog()
+    ui = Ui_hoffset()
+    ui.setupUi(hoffset)
+    hoffset.show()
+    sys.exit(app.exec_())
diff --git a/UI/wHOffset.ui b/UI/wHOffset.ui
new file mode 100644
index 0000000000000000000000000000000000000000..f141f0cf8d35e4327cc810edbeadf432666a9f41
--- /dev/null
+++ b/UI/wHOffset.ui
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>hoffset</class>
+ <widget class="QDialog" name="hoffset">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>342</width>
+    <height>155</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Heading Offset</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="hoffset_label">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string>Heading Offset</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1,2">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="ed_hoffset">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+            </font>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_hoffset">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Apply To:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_all">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>All Transects</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_transect">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Transect Only</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>hoffset</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>hoffset</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wHOffset_2_py.bat b/UI/wHOffset_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..fd63067b12bfbfbe96a929a4d30eedfc54d1a7db
--- /dev/null
+++ b/UI/wHOffset_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wHOffset.ui -o wHOffset.py
diff --git a/UI/wHSource.py b/UI/wHSource.py
new file mode 100644
index 0000000000000000000000000000000000000000..8f1e9ff3b8322adeaf0af486cf8dc375528f5490
--- /dev/null
+++ b/UI/wHSource.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wHSource.ui'
+#
+# Created by: PyQt5 UI code generator 5.13.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_h_source(object):
+    def setupUi(self, h_source):
+        h_source.setObjectName("h_source")
+        h_source.resize(343, 195)
+        self.gridLayout_2 = QtWidgets.QGridLayout(h_source)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.gb_source = QtWidgets.QGroupBox(h_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_source.setFont(font)
+        self.gb_source.setObjectName("gb_source")
+        self.gridLayout_3 = QtWidgets.QGridLayout(self.gb_source)
+        self.gridLayout_3.setObjectName("gridLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.rb_internal = QtWidgets.QRadioButton(self.gb_source)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_internal.setFont(font)
+        self.rb_internal.setObjectName("rb_internal")
+        self.verticalLayout_2.addWidget(self.rb_internal)
+        self.rb_external = QtWidgets.QRadioButton(self.gb_source)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_external.setFont(font)
+        self.rb_external.setObjectName("rb_external")
+        self.verticalLayout_2.addWidget(self.rb_external)
+        self.rb_no_compass = QtWidgets.QRadioButton(self.gb_source)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_no_compass.setFont(font)
+        self.rb_no_compass.setObjectName("rb_no_compass")
+        self.verticalLayout_2.addWidget(self.rb_no_compass)
+        self.gridLayout_3.addLayout(self.verticalLayout_2, 0, 0, 1, 1)
+        self.horizontalLayout.addWidget(self.gb_source)
+        self.gb_h_source = QtWidgets.QGroupBox(h_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_h_source.setFont(font)
+        self.gb_h_source.setObjectName("gb_h_source")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_h_source)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_all = QtWidgets.QRadioButton(self.gb_h_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_all.setFont(font)
+        self.rb_all.setChecked(True)
+        self.rb_all.setObjectName("rb_all")
+        self.verticalLayout.addWidget(self.rb_all)
+        self.rb_transect = QtWidgets.QRadioButton(self.gb_h_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_transect.setFont(font)
+        self.rb_transect.setObjectName("rb_transect")
+        self.verticalLayout.addWidget(self.rb_transect)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout.addWidget(self.gb_h_source)
+        self.gridLayout_2.addLayout(self.horizontalLayout, 0, 0, 1, 1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(h_source)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
+
+        self.retranslateUi(h_source)
+        self.buttonBox.accepted.connect(h_source.accept)
+        self.buttonBox.rejected.connect(h_source.reject)
+        QtCore.QMetaObject.connectSlotsByName(h_source)
+
+    def retranslateUi(self, h_source):
+        _translate = QtCore.QCoreApplication.translate
+        h_source.setWindowTitle(_translate("h_source", "Heading Source"))
+        self.gb_source.setTitle(_translate("h_source", "Heading Source"))
+        self.rb_internal.setText(_translate("h_source", "Internal"))
+        self.rb_external.setText(_translate("h_source", "External"))
+        self.rb_no_compass.setText(_translate("h_source", "Turn off"))
+        self.gb_h_source.setTitle(_translate("h_source", "Apply To:"))
+        self.rb_all.setText(_translate("h_source", "All Transects"))
+        self.rb_transect.setText(_translate("h_source", "Transect Only"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    h_source = QtWidgets.QDialog()
+    ui = Ui_h_source()
+    ui.setupUi(h_source)
+    h_source.show()
+    sys.exit(app.exec_())
diff --git a/UI/wHSource.ui b/UI/wHSource.ui
new file mode 100644
index 0000000000000000000000000000000000000000..5809f81b5f795fe4626115f599c65cc47d1c2674
--- /dev/null
+++ b/UI/wHSource.ui
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>h_source</class>
+ <widget class="QDialog" name="h_source">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>343</width>
+    <height>195</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Heading Source</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QGroupBox" name="gb_source">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Heading Source</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout_3">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout_2">
+          <item>
+           <widget class="QRadioButton" name="rb_internal">
+            <property name="font">
+             <font>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Internal</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_external">
+            <property name="font">
+             <font>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>External</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_no_compass">
+            <property name="font">
+             <font>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Turn off</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_h_source">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Apply To:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_all">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>All Transects</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_transect">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Transect Only</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>h_source</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>h_source</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wHSource_2_py.bat b/UI/wHSource_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..452532f7badd53620204997a967732f3142aadad
--- /dev/null
+++ b/UI/wHSource_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wHSource.ui -o wHSource.py
diff --git a/UI/wLoading.py b/UI/wLoading.py
new file mode 100644
index 0000000000000000000000000000000000000000..86ef92a089c4bc46e71b48cc0ee89a50d532e82f
--- /dev/null
+++ b/UI/wLoading.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wLoading.ui'
+#
+# Created by: PyQt5 UI code generator 5.9.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_Loading_Message(object):
+    def setupUi(self, Loading_Message):
+        Loading_Message.setObjectName("Loading_Message")
+        Loading_Message.setEnabled(True)
+        Loading_Message.resize(541, 174)
+        icon = QtGui.QIcon()
+        icon.addPixmap(
+            QtGui.QPixmap(":/images/24x24/Info.png"),
+            QtGui.QIcon.Normal,
+            QtGui.QIcon.Off,
+        )
+        Loading_Message.setWindowIcon(icon)
+        self.message = QtWidgets.QLabel(Loading_Message)
+        self.message.setGeometry(QtCore.QRect(30, 0, 461, 171))
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.message.setFont(font)
+        self.message.setObjectName("message")
+
+        self.retranslateUi(Loading_Message)
+        QtCore.QMetaObject.connectSlotsByName(Loading_Message)
+
+    def retranslateUi(self, Loading_Message):
+        _translate = QtCore.QCoreApplication.translate
+        Loading_Message.setWindowTitle(
+            _translate("Loading_Message", "Loading Measurement")
+        )
+        self.message.setText(
+            _translate(
+                "Loading_Message",
+                '<html><head/><body><p align="center">QRev is loading and processing the measurement files.<br/></p><p align="center">This window will close automatically </p><p align="center">when the processing is complete</p></body></html>',
+            )
+        )
+
+
+import dsm_rc
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    Loading_Message = QtWidgets.QDialog()
+    ui = Ui_Loading_Message()
+    ui.setupUi(Loading_Message)
+    Loading_Message.show()
+    sys.exit(app.exec_())
diff --git a/UI/wLoading.ui b/UI/wLoading.ui
new file mode 100644
index 0000000000000000000000000000000000000000..932be974759ad00ae72b3a00c3cfeb950cea691a
--- /dev/null
+++ b/UI/wLoading.ui
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Loading_Message</class>
+ <widget class="QDialog" name="Loading_Message">
+  <property name="enabled">
+   <bool>true</bool>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>541</width>
+    <height>174</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Loading Measurement</string>
+  </property>
+  <property name="windowIcon">
+   <iconset resource="dsm.qrc">
+    <normaloff>:/images/24x24/Info.png</normaloff>:/images/24x24/Info.png</iconset>
+  </property>
+  <widget class="QLabel" name="message">
+   <property name="geometry">
+    <rect>
+     <x>30</x>
+     <y>0</y>
+     <width>461</width>
+     <height>171</height>
+    </rect>
+   </property>
+   <property name="font">
+    <font>
+     <pointsize>12</pointsize>
+     <weight>75</weight>
+     <bold>true</bold>
+    </font>
+   </property>
+   <property name="text">
+    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;QRev is loading and processing the measurement files.&lt;br/&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;This window will close automatically &lt;/p&gt;&lt;p align=&quot;center&quot;&gt;when the processing is complete&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+   </property>
+  </widget>
+ </widget>
+ <resources>
+  <include location="dsm.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/UI/wLoading_2_py.bat b/UI/wLoading_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..2ae57ad2a5a356d6d14c06a775894972e92a91c7
--- /dev/null
+++ b/UI/wLoading_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wLoading.ui -o wLoading.py
diff --git a/UI/wMagVar.py b/UI/wMagVar.py
new file mode 100644
index 0000000000000000000000000000000000000000..310ab00c97dcfc17645b0683cf7ea56214037221
--- /dev/null
+++ b/UI/wMagVar.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wMagVar.ui'
+#
+# Created by: PyQt5 UI code generator 5.10.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_mag_var(object):
+    def setupUi(self, mag_var):
+        mag_var.setObjectName("mag_var")
+        mag_var.resize(342, 155)
+        self.gridLayout_2 = QtWidgets.QGridLayout(mag_var)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        spacerItem = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.magvar_label = QtWidgets.QLabel(mag_var)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.magvar_label.setFont(font)
+        self.magvar_label.setObjectName("magvar_label")
+        self.horizontalLayout_2.addWidget(self.magvar_label)
+        spacerItem2 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem3 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem3)
+        self.ed_magvar = QtWidgets.QLineEdit(mag_var)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_magvar.setFont(font)
+        self.ed_magvar.setObjectName("ed_magvar")
+        self.horizontalLayout.addWidget(self.ed_magvar)
+        spacerItem4 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem4)
+        self.horizontalLayout.setStretch(0, 2)
+        self.horizontalLayout.setStretch(1, 1)
+        self.horizontalLayout.setStretch(2, 2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        spacerItem5 = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem5)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+        self.gb_magvar = QtWidgets.QGroupBox(mag_var)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_magvar.setFont(font)
+        self.gb_magvar.setObjectName("gb_magvar")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_magvar)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_all = QtWidgets.QRadioButton(self.gb_magvar)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_all.setFont(font)
+        self.rb_all.setChecked(True)
+        self.rb_all.setObjectName("rb_all")
+        self.verticalLayout.addWidget(self.rb_all)
+        self.rb_transect = QtWidgets.QRadioButton(self.gb_magvar)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_transect.setFont(font)
+        self.rb_transect.setObjectName("rb_transect")
+        self.verticalLayout.addWidget(self.rb_transect)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout_3.addWidget(self.gb_magvar)
+        self.gridLayout_2.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(mag_var)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
+
+        self.retranslateUi(mag_var)
+        self.buttonBox.accepted.connect(mag_var.accept)
+        self.buttonBox.rejected.connect(mag_var.reject)
+        QtCore.QMetaObject.connectSlotsByName(mag_var)
+
+    def retranslateUi(self, mag_var):
+        _translate = QtCore.QCoreApplication.translate
+        mag_var.setWindowTitle(_translate("mag_var", "Magnetic Variation"))
+        self.magvar_label.setText(_translate("mag_var", "Magnetic Variation"))
+        self.gb_magvar.setTitle(_translate("mag_var", "Apply To:"))
+        self.rb_all.setText(_translate("mag_var", "All Transects"))
+        self.rb_transect.setText(_translate("mag_var", "Transect Only"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    mag_var = QtWidgets.QDialog()
+    ui = Ui_mag_var()
+    ui.setupUi(mag_var)
+    mag_var.show()
+    sys.exit(app.exec_())
diff --git a/UI/wMagVar.ui b/UI/wMagVar.ui
new file mode 100644
index 0000000000000000000000000000000000000000..249ee9ef1e3ca123b95fb5f45cee23deb8f82047
--- /dev/null
+++ b/UI/wMagVar.ui
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mag_var</class>
+ <widget class="QDialog" name="mag_var">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>342</width>
+    <height>155</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Magnetic Variation</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="magvar_label">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string>Magnetic Variation</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1,2">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="ed_magvar">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+            </font>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_magvar">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Apply To:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_all">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>All Transects</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_transect">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Transect Only</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>mag_var</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>mag_var</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wMagVar_2_py.bat b/UI/wMagVar_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..f761c49a8b0924c3bd5de9d26d0f09d01a9a81e1
--- /dev/null
+++ b/UI/wMagVar_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wMagVar.ui -o wMagVar.py
diff --git a/UI/wOptions.py b/UI/wOptions.py
new file mode 100644
index 0000000000000000000000000000000000000000..b9667cbc74848f139d0259894424ca2f4cb5d42b
--- /dev/null
+++ b/UI/wOptions.py
@@ -0,0 +1,344 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wOptions.ui'
+#
+# Created by: PyQt5 UI code generator 5.13.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_Options(object):
+    def setupUi(self, Options):
+        Options.setObjectName("Options")
+        Options.resize(414, 982)
+        Options.setMaximumSize(QtCore.QSize(16777215, 1080))
+        self.verticalLayout_10 = QtWidgets.QVBoxLayout(Options)
+        self.verticalLayout_10.setObjectName("verticalLayout_10")
+        self.scrollArea = QtWidgets.QScrollArea(Options)
+        self.scrollArea.setWidgetResizable(True)
+        self.scrollArea.setObjectName("scrollArea")
+        self.scrollAreaWidgetContents = QtWidgets.QWidget()
+        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 394, 929))
+        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
+        self.gridLayout = QtWidgets.QGridLayout(self.scrollAreaWidgetContents)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.gb_units = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_units.setFont(font)
+        self.gb_units.setObjectName("gb_units")
+        self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.gb_units)
+        self.verticalLayout_8.setContentsMargins(-1, 5, 11, 5)
+        self.verticalLayout_8.setSpacing(5)
+        self.verticalLayout_8.setObjectName("verticalLayout_8")
+        self.rb_english = QtWidgets.QRadioButton(self.gb_units)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_english.setFont(font)
+        self.rb_english.setChecked(True)
+        self.rb_english.setObjectName("rb_english")
+        self.verticalLayout_8.addWidget(self.rb_english)
+        self.rb_si = QtWidgets.QRadioButton(self.gb_units)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_si.setFont(font)
+        self.rb_si.setObjectName("rb_si")
+        self.verticalLayout_8.addWidget(self.rb_si)
+        self.verticalLayout_3.addWidget(self.gb_units)
+        self.gb_axis = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_axis.setFont(font)
+        self.gb_axis.setObjectName("gb_axis")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.gb_axis)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.rb_opt_ensembles = QtWidgets.QRadioButton(self.gb_axis)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_opt_ensembles.setFont(font)
+        self.rb_opt_ensembles.setChecked(True)
+        self.rb_opt_ensembles.setObjectName("rb_opt_ensembles")
+        self.verticalLayout_2.addWidget(self.rb_opt_ensembles)
+        self.rb_opt_length = QtWidgets.QRadioButton(self.gb_axis)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_opt_length.setFont(font)
+        self.rb_opt_length.setObjectName("rb_opt_length")
+        self.verticalLayout_2.addWidget(self.rb_opt_length)
+        self.rb_opt_time = QtWidgets.QRadioButton(self.gb_axis)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_opt_time.setFont(font)
+        self.rb_opt_time.setObjectName("rb_opt_time")
+        self.verticalLayout_2.addWidget(self.rb_opt_time)
+        self.verticalLayout_3.addWidget(self.gb_axis)
+        self.gb_color_map = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_color_map.setFont(font)
+        self.gb_color_map.setObjectName("gb_color_map")
+        self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.gb_color_map)
+        self.verticalLayout_7.setContentsMargins(-1, 5, -1, 5)
+        self.verticalLayout_7.setSpacing(5)
+        self.verticalLayout_7.setObjectName("verticalLayout_7")
+        self.rb_viridis = QtWidgets.QRadioButton(self.gb_color_map)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_viridis.setFont(font)
+        self.rb_viridis.setChecked(True)
+        self.rb_viridis.setObjectName("rb_viridis")
+        self.verticalLayout_7.addWidget(self.rb_viridis)
+        self.rb_jet = QtWidgets.QRadioButton(self.gb_color_map)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_jet.setFont(font)
+        self.rb_jet.setObjectName("rb_jet")
+        self.verticalLayout_7.addWidget(self.rb_jet)
+        self.verticalLayout_3.addWidget(self.gb_color_map)
+        self.gb_save_options = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_save_options.setFont(font)
+        self.gb_save_options.setObjectName("gb_save_options")
+        self.verticalLayout = QtWidgets.QVBoxLayout(self.gb_save_options)
+        self.verticalLayout.setContentsMargins(-1, 5, -1, 5)
+        self.verticalLayout.setSpacing(5)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_All = QtWidgets.QRadioButton(self.gb_save_options)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_All.setFont(font)
+        self.rb_All.setChecked(True)
+        self.rb_All.setObjectName("rb_All")
+        self.verticalLayout.addWidget(self.rb_All)
+        self.rb_checked = QtWidgets.QRadioButton(self.gb_save_options)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_checked.setFont(font)
+        self.rb_checked.setObjectName("rb_checked")
+        self.verticalLayout.addWidget(self.rb_checked)
+        self.line = QtWidgets.QFrame(self.gb_save_options)
+        self.line.setFrameShape(QtWidgets.QFrame.HLine)
+        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
+        self.line.setObjectName("line")
+        self.verticalLayout.addWidget(self.line)
+        self.cb_rating = QtWidgets.QCheckBox(self.gb_save_options)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_rating.setFont(font)
+        self.cb_rating.setObjectName("cb_rating")
+        self.verticalLayout.addWidget(self.cb_rating)
+        self.line_2 = QtWidgets.QFrame(self.gb_save_options)
+        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
+        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
+        self.line_2.setObjectName("line_2")
+        self.verticalLayout.addWidget(self.line_2)
+        self.cb_stylesheet = QtWidgets.QCheckBox(self.gb_save_options)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_stylesheet.setFont(font)
+        self.cb_stylesheet.setObjectName("cb_stylesheet")
+        self.verticalLayout.addWidget(self.cb_stylesheet)
+        self.line_3 = QtWidgets.QFrame(self.gb_save_options)
+        self.line_3.setFrameShape(QtWidgets.QFrame.HLine)
+        self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken)
+        self.line_3.setObjectName("line_3")
+        self.verticalLayout.addWidget(self.line_3)
+        self.cb_xs_export = QtWidgets.QCheckBox(self.gb_save_options)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_xs_export.setFont(font)
+        self.cb_xs_export.setChecked(True)
+        self.cb_xs_export.setObjectName("cb_xs_export")
+        self.verticalLayout.addWidget(self.cb_xs_export)
+        self.verticalLayout_3.addWidget(self.gb_save_options)
+        self.gb_extrap_weighted = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_extrap_weighted.setFont(font)
+        self.gb_extrap_weighted.setObjectName("gb_extrap_weighted")
+        self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.gb_extrap_weighted)
+        self.verticalLayout_6.setContentsMargins(-1, 5, -1, 5)
+        self.verticalLayout_6.setSpacing(5)
+        self.verticalLayout_6.setObjectName("verticalLayout_6")
+        self.cb_weighted_extrap = QtWidgets.QCheckBox(self.gb_extrap_weighted)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_weighted_extrap.setFont(font)
+        self.cb_weighted_extrap.setObjectName("cb_weighted_extrap")
+        self.verticalLayout_6.addWidget(self.cb_weighted_extrap)
+        self.verticalLayout_3.addWidget(self.gb_extrap_weighted)
+        self.gb_filters = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_filters.setFont(font)
+        self.gb_filters.setObjectName("gb_filters")
+        self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.gb_filters)
+        self.verticalLayout_5.setContentsMargins(-1, 5, -1, 5)
+        self.verticalLayout_5.setSpacing(5)
+        self.verticalLayout_5.setObjectName("verticalLayout_5")
+        self.rb_filter_transect = QtWidgets.QRadioButton(self.gb_filters)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_filter_transect.setFont(font)
+        self.rb_filter_transect.setChecked(True)
+        self.rb_filter_transect.setObjectName("rb_filter_transect")
+        self.verticalLayout_5.addWidget(self.rb_filter_transect)
+        self.rb_filter_meas = QtWidgets.QRadioButton(self.gb_filters)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_filter_meas.setFont(font)
+        self.rb_filter_meas.setObjectName("rb_filter_meas")
+        self.verticalLayout_5.addWidget(self.rb_filter_meas)
+        self.verticalLayout_3.addWidget(self.gb_filters)
+        self.gb_uncertainty = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_uncertainty.setFont(font)
+        self.gb_uncertainty.setObjectName("gb_uncertainty")
+        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.gb_uncertainty)
+        self.verticalLayout_4.setContentsMargins(-1, 0, -1, 0)
+        self.verticalLayout_4.setSpacing(0)
+        self.verticalLayout_4.setObjectName("verticalLayout_4")
+        self.rb_qrev_u = QtWidgets.QRadioButton(self.gb_uncertainty)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_qrev_u.setFont(font)
+        self.rb_qrev_u.setChecked(True)
+        self.rb_qrev_u.setObjectName("rb_qrev_u")
+        self.verticalLayout_4.addWidget(self.rb_qrev_u)
+        self.rb_oursin_u = QtWidgets.QRadioButton(self.gb_uncertainty)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_oursin_u.setFont(font)
+        self.rb_oursin_u.setObjectName("rb_oursin_u")
+        self.verticalLayout_4.addWidget(self.rb_oursin_u)
+        self.verticalLayout_3.addWidget(self.gb_uncertainty)
+        self.gb_moving_bed_option = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_moving_bed_option.setFont(font)
+        self.gb_moving_bed_option.setObjectName("gb_moving_bed_option")
+        self.verticalLayout_9 = QtWidgets.QVBoxLayout(self.gb_moving_bed_option)
+        self.verticalLayout_9.setObjectName("verticalLayout_9")
+        self.cb_allow_manual_no_mb = QtWidgets.QCheckBox(self.gb_moving_bed_option)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.cb_allow_manual_no_mb.setFont(font)
+        self.cb_allow_manual_no_mb.setObjectName("cb_allow_manual_no_mb")
+        self.verticalLayout_9.addWidget(self.cb_allow_manual_no_mb)
+        self.verticalLayout_3.addWidget(self.gb_moving_bed_option)
+        self.gridLayout.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
+        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
+        self.verticalLayout_10.addWidget(self.scrollArea)
+        self.buttonBox = QtWidgets.QDialogButtonBox(Options)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.buttonBox.setFont(font)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.verticalLayout_10.addWidget(self.buttonBox)
+
+        self.retranslateUi(Options)
+        self.buttonBox.accepted.connect(Options.accept)
+        self.buttonBox.rejected.connect(Options.reject)
+        QtCore.QMetaObject.connectSlotsByName(Options)
+
+    def retranslateUi(self, Options):
+        _translate = QtCore.QCoreApplication.translate
+        Options.setWindowTitle(_translate("Options", "Dialog"))
+        self.gb_units.setTitle(_translate("Options", "Units"))
+        self.rb_english.setText(_translate("Options", "English"))
+        self.rb_si.setText(_translate("Options", "SI"))
+        self.gb_axis.setTitle(_translate("Options", "Default X-Axis"))
+        self.rb_opt_ensembles.setText(_translate("Options", "Ensembles"))
+        self.rb_opt_length.setText(_translate("Options", "Length"))
+        self.rb_opt_time.setText(_translate("Options", "Time"))
+        self.gb_color_map.setTitle(_translate("Options", "Color Map"))
+        self.rb_viridis.setText(_translate("Options", "viridis"))
+        self.rb_jet.setText(_translate("Options", "jet"))
+        self.gb_save_options.setTitle(_translate("Options", "Save Options"))
+        self.rb_All.setText(_translate("Options", "All Transects"))
+        self.rb_checked.setText(_translate("Options", "Only Checked Transects"))
+        self.cb_rating.setText(_translate("Options", "Prompt for rating on save"))
+        self.cb_stylesheet.setText(_translate("Options", "Save style sheet with data"))
+        self.cb_xs_export.setText(_translate("Options", "Export Mean Cross-Section"))
+        self.gb_extrap_weighted.setTitle(_translate("Options", "Extrapolation"))
+        self.cb_weighted_extrap.setText(_translate("Options", "Discharge weighted"))
+        self.gb_filters.setTitle(_translate("Options", "WT, BT Filters"))
+        self.rb_filter_transect.setText(_translate("Options", "By Transect"))
+        self.rb_filter_meas.setText(_translate("Options", "By Measurement"))
+        self.gb_uncertainty.setTitle(_translate("Options", "Uncertainty"))
+        self.rb_qrev_u.setText(_translate("Options", "QRev Original"))
+        self.rb_oursin_u.setText(_translate("Options", "Oursin"))
+        self.gb_moving_bed_option.setTitle(_translate("Options", "Moving Bed"))
+        self.cb_allow_manual_no_mb.setText(
+            _translate("Options", "Allow observed no moving-bed")
+        )
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    Options = QtWidgets.QDialog()
+    ui = Ui_Options()
+    ui.setupUi(Options)
+    Options.show()
+    sys.exit(app.exec_())
diff --git a/UI/wOptions.ui b/UI/wOptions.ui
new file mode 100644
index 0000000000000000000000000000000000000000..b3b780dee314bae0ccb303f1beeb00eaa85a78f8
--- /dev/null
+++ b/UI/wOptions.ui
@@ -0,0 +1,573 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Options</class>
+ <widget class="QDialog" name="Options">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>414</width>
+    <height>982</height>
+   </rect>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>16777215</width>
+    <height>1080</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_10">
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>394</width>
+        <height>929</height>
+       </rect>
+      </property>
+      <layout class="QGridLayout" name="gridLayout">
+       <item row="0" column="0">
+        <layout class="QVBoxLayout" name="verticalLayout_3">
+         <item>
+          <widget class="QGroupBox" name="gb_units">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="title">
+            <string>Units</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_8">
+            <property name="spacing">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="rightMargin">
+             <number>11</number>
+            </property>
+            <property name="bottomMargin">
+             <number>5</number>
+            </property>
+            <item>
+             <widget class="QRadioButton" name="rb_english">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>English</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_si">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>SI</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="gb_axis">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="title">
+            <string>Default X-Axis</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_2">
+            <item>
+             <widget class="QRadioButton" name="rb_opt_ensembles">
+              <property name="font">
+               <font>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Ensembles</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_opt_length">
+              <property name="font">
+               <font>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Length</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_opt_time">
+              <property name="font">
+               <font>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Time</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="gb_color_map">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="title">
+            <string>Color Map</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_7">
+            <property name="spacing">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="bottomMargin">
+             <number>5</number>
+            </property>
+            <item>
+             <widget class="QRadioButton" name="rb_viridis">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>viridis</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_jet">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>jet</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="gb_save_options">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="title">
+            <string>Save Options</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout">
+            <property name="spacing">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="bottomMargin">
+             <number>5</number>
+            </property>
+            <item>
+             <widget class="QRadioButton" name="rb_All">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>All Transects</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_checked">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Only Checked Transects</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="Line" name="line">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="cb_rating">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Prompt for rating on save</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="Line" name="line_2">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="cb_stylesheet">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Save style sheet with data</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="Line" name="line_3">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="cb_xs_export">
+              <property name="font">
+               <font>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Export Mean Cross-Section</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="gb_extrap_weighted">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="title">
+            <string>Extrapolation</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_6">
+            <property name="spacing">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="bottomMargin">
+             <number>5</number>
+            </property>
+            <item>
+             <widget class="QCheckBox" name="cb_weighted_extrap">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Discharge weighted</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="gb_filters">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="title">
+            <string>WT, BT Filters</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_5">
+            <property name="spacing">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="bottomMargin">
+             <number>5</number>
+            </property>
+            <item>
+             <widget class="QRadioButton" name="rb_filter_transect">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>By Transect</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_filter_meas">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>By Measurement</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="gb_uncertainty">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="title">
+            <string>Uncertainty</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_4">
+            <property name="spacing">
+             <number>0</number>
+            </property>
+            <property name="topMargin">
+             <number>0</number>
+            </property>
+            <property name="bottomMargin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QRadioButton" name="rb_qrev_u">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>QRev Original</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_oursin_u">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Oursin</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="gb_moving_bed_option">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="title">
+            <string>Moving Bed</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_9">
+            <item>
+             <widget class="QCheckBox" name="cb_allow_manual_no_mb">
+              <property name="font">
+               <font>
+                <pointsize>12</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Allow observed no moving-bed</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="font">
+      <font>
+       <pointsize>12</pointsize>
+      </font>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Options</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Options</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wOptions_2_py.bat b/UI/wOptions_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..992a01a3361d0ab9fa69e1bbc231468497637e85
--- /dev/null
+++ b/UI/wOptions_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wOptions.ui -o wOptions.py
diff --git a/UI/wRIVRS_Demo.py b/UI/wRIVRS_Demo.py
new file mode 100644
index 0000000000000000000000000000000000000000..b8662385493fd72bfe9a78c355057f047ab82247
--- /dev/null
+++ b/UI/wRIVRS_Demo.py
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wRIVRS_Demo.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_RIVRS_Demo(object):
+    def setupUi(self, RIVRS_Demo):
+        RIVRS_Demo.setObjectName("RIVRS_Demo")
+        RIVRS_Demo.resize(1164, 689)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        RIVRS_Demo.setFont(font)
+        self.centralwidget = QtWidgets.QWidget(RIVRS_Demo)
+        self.centralwidget.setObjectName("centralwidget")
+        self.gridLayout_3 = QtWidgets.QGridLayout(self.centralwidget)
+        self.gridLayout_3.setObjectName("gridLayout_3")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.pb_load = QtWidgets.QPushButton(self.centralwidget)
+        self.pb_load.setObjectName("pb_load")
+        self.verticalLayout.addWidget(self.pb_load)
+        self.gb_load = QtWidgets.QGroupBox(self.centralwidget)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_load.setFont(font)
+        self.gb_load.setObjectName("gb_load")
+        self.gridLayout_2 = QtWidgets.QGridLayout(self.gb_load)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.table_original = QtWidgets.QTableWidget(self.gb_load)
+        self.table_original.setObjectName("table_original")
+        self.table_original.setColumnCount(0)
+        self.table_original.setRowCount(0)
+        self.gridLayout_2.addWidget(self.table_original, 0, 0, 1, 1)
+        self.verticalLayout.addWidget(self.gb_load)
+        self.pb_qrev = QtWidgets.QPushButton(self.centralwidget)
+        self.pb_qrev.setEnabled(False)
+        self.pb_qrev.setObjectName("pb_qrev")
+        self.verticalLayout.addWidget(self.pb_qrev)
+        self.gb_ressults = QtWidgets.QGroupBox(self.centralwidget)
+        self.gb_ressults.setObjectName("gb_ressults")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_ressults)
+        self.gridLayout.setObjectName("gridLayout")
+        self.table_processed = QtWidgets.QTableWidget(self.gb_ressults)
+        self.table_processed.setObjectName("table_processed")
+        self.table_processed.setColumnCount(0)
+        self.table_processed.setRowCount(0)
+        self.gridLayout.addWidget(self.table_processed, 0, 0, 1, 1)
+        self.verticalLayout.addWidget(self.gb_ressults)
+        self.gridLayout_3.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        RIVRS_Demo.setCentralWidget(self.centralwidget)
+        self.statusbar = QtWidgets.QStatusBar(RIVRS_Demo)
+        self.statusbar.setObjectName("statusbar")
+        RIVRS_Demo.setStatusBar(self.statusbar)
+
+        self.retranslateUi(RIVRS_Demo)
+        QtCore.QMetaObject.connectSlotsByName(RIVRS_Demo)
+
+    def retranslateUi(self, RIVRS_Demo):
+        _translate = QtCore.QCoreApplication.translate
+        RIVRS_Demo.setWindowTitle(_translate("RIVRS_Demo", "RIVRS_Demo"))
+        self.pb_load.setText(_translate("RIVRS_Demo", "Load Data"))
+        self.gb_load.setTitle(_translate("RIVRS_Demo", "Loaded Data"))
+        self.pb_qrev.setText(_translate("RIVRS_Demo", "Run QRev"))
+        self.gb_ressults.setTitle(_translate("RIVRS_Demo", "Final Measurements"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    RIVRS_Demo = QtWidgets.QMainWindow()
+    ui = Ui_RIVRS_Demo()
+    ui.setupUi(RIVRS_Demo)
+    RIVRS_Demo.show()
+    sys.exit(app.exec_())
diff --git a/UI/wRIVRS_Demo.ui b/UI/wRIVRS_Demo.ui
new file mode 100644
index 0000000000000000000000000000000000000000..1387112ac88ccfa34c16711ffd701d5658db51d2
--- /dev/null
+++ b/UI/wRIVRS_Demo.ui
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>RIVRS_Demo</class>
+ <widget class="QMainWindow" name="RIVRS_Demo">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>1164</width>
+    <height>689</height>
+   </rect>
+  </property>
+  <property name="font">
+   <font>
+    <pointsize>12</pointsize>
+    <weight>75</weight>
+    <bold>true</bold>
+   </font>
+  </property>
+  <property name="windowTitle">
+   <string>RIVRS_Demo</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QGridLayout" name="gridLayout_3">
+    <item row="0" column="0">
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <item>
+       <widget class="QPushButton" name="pb_load">
+        <property name="text">
+         <string>Load Data</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QGroupBox" name="gb_load">
+        <property name="font">
+         <font>
+          <pointsize>12</pointsize>
+          <weight>75</weight>
+          <bold>true</bold>
+         </font>
+        </property>
+        <property name="title">
+         <string>Loaded Data</string>
+        </property>
+        <layout class="QGridLayout" name="gridLayout_2">
+         <item row="0" column="0">
+          <widget class="QTableWidget" name="table_original"/>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pb_qrev">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="text">
+         <string>Run QRev</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QGroupBox" name="gb_ressults">
+        <property name="title">
+         <string>Final Measurements</string>
+        </property>
+        <layout class="QGridLayout" name="gridLayout">
+         <item row="0" column="0">
+          <widget class="QTableWidget" name="table_processed"/>
+         </item>
+        </layout>
+       </widget>
+      </item>
+     </layout>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/UI/wRIVRS_Demo_2_py.bat b/UI/wRIVRS_Demo_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..d82b141ea4f9ca3b2b7106c692e08fcf1db89005
--- /dev/null
+++ b/UI/wRIVRS_Demo_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wRIVRS_Demo.ui -o wRIVRS_Demo.py
diff --git a/UI/wRating.py b/UI/wRating.py
new file mode 100644
index 0000000000000000000000000000000000000000..db03b604fa73639932deabee4448a5da235c9d97
--- /dev/null
+++ b/UI/wRating.py
@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wRating.ui'
+#
+# Created by: PyQt5 UI code generator 5.13.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_rating(object):
+    def setupUi(self, rating):
+        rating.setObjectName("rating")
+        rating.resize(556, 246)
+        self.gridLayout_2 = QtWidgets.QGridLayout(rating)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.txt_rating_msg = QtWidgets.QLabel(rating)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.txt_rating_msg.setFont(font)
+        self.txt_rating_msg.setWordWrap(True)
+        self.txt_rating_msg.setObjectName("txt_rating_msg")
+        self.verticalLayout_2.addWidget(self.txt_rating_msg)
+        spacerItem = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.Uncertainty_label = QtWidgets.QLabel(rating)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.Uncertainty_label.setFont(font)
+        self.Uncertainty_label.setObjectName("Uncertainty_label")
+        self.horizontalLayout_2.addWidget(self.Uncertainty_label)
+        spacerItem2 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem3 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem3)
+        self.uncertainty_value = QtWidgets.QLabel(rating)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.uncertainty_value.setFont(font)
+        self.uncertainty_value.setText("")
+        self.uncertainty_value.setObjectName("uncertainty_value")
+        self.horizontalLayout.addWidget(self.uncertainty_value)
+        self.uncertainty_units = QtWidgets.QLabel(rating)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.uncertainty_units.setFont(font)
+        self.uncertainty_units.setObjectName("uncertainty_units")
+        self.horizontalLayout.addWidget(self.uncertainty_units)
+        spacerItem4 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem4)
+        self.horizontalLayout.setStretch(0, 2)
+        self.horizontalLayout.setStretch(3, 2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        spacerItem5 = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem5)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+        self.gb_rating = QtWidgets.QGroupBox(rating)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_rating.setFont(font)
+        self.gb_rating.setObjectName("gb_rating")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_rating)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_excellent = QtWidgets.QRadioButton(self.gb_rating)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_excellent.setFont(font)
+        self.rb_excellent.setChecked(True)
+        self.rb_excellent.setObjectName("rb_excellent")
+        self.verticalLayout.addWidget(self.rb_excellent)
+        self.rb_good = QtWidgets.QRadioButton(self.gb_rating)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_good.setFont(font)
+        self.rb_good.setObjectName("rb_good")
+        self.verticalLayout.addWidget(self.rb_good)
+        self.rb_fair = QtWidgets.QRadioButton(self.gb_rating)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_fair.setFont(font)
+        self.rb_fair.setObjectName("rb_fair")
+        self.verticalLayout.addWidget(self.rb_fair)
+        self.rb_poor = QtWidgets.QRadioButton(self.gb_rating)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_poor.setFont(font)
+        self.rb_poor.setObjectName("rb_poor")
+        self.verticalLayout.addWidget(self.rb_poor)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout_3.addWidget(self.gb_rating)
+        self.gridLayout_2.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(rating)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        self.buttonBox.setFont(font)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
+
+        self.retranslateUi(rating)
+        self.buttonBox.accepted.connect(rating.accept)
+        self.buttonBox.rejected.connect(rating.reject)
+        QtCore.QMetaObject.connectSlotsByName(rating)
+
+    def retranslateUi(self, rating):
+        _translate = QtCore.QCoreApplication.translate
+        rating.setWindowTitle(_translate("rating", "Rating"))
+        self.txt_rating_msg.setText(
+            _translate(
+                "rating",
+                '<html><head/><body><p><span style=" font-weight:600;">IMPORTANT:</span> The rating for a measurement should include the uncertainty of the stage associated with the measurement in addition to the uncertainty of the discharge.</p></body></html>',
+            )
+        )
+        self.Uncertainty_label.setText(
+            _translate("rating", "QRev Estimated Uncertainty")
+        )
+        self.uncertainty_units.setText(_translate("rating", "%"))
+        self.gb_rating.setTitle(_translate("rating", "Rating:"))
+        self.rb_excellent.setText(_translate("rating", "Excellent (< 3%)"))
+        self.rb_good.setText(_translate("rating", "Good (3 - 5 %)"))
+        self.rb_fair.setText(_translate("rating", "Fair (5 - 8 %)"))
+        self.rb_poor.setText(_translate("rating", "Poor (> 8 %)"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    rating = QtWidgets.QDialog()
+    ui = Ui_rating()
+    ui.setupUi(rating)
+    rating.show()
+    sys.exit(app.exec_())
diff --git a/UI/wRating.ui b/UI/wRating.ui
new file mode 100644
index 0000000000000000000000000000000000000000..796f3842723690e628c52ebf98518624aeb12450
--- /dev/null
+++ b/UI/wRating.ui
@@ -0,0 +1,295 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>rating</class>
+ <widget class="QDialog" name="rating">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>556</width>
+    <height>246</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Rating</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <widget class="QLabel" name="txt_rating_msg">
+         <property name="font">
+          <font>
+           <pointsize>12</pointsize>
+          </font>
+         </property>
+         <property name="text">
+          <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;IMPORTANT:&lt;/span&gt; The rating for a measurement should include the uncertainty of the stage associated with the measurement in addition to the uncertainty of the discharge.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="Uncertainty_label">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string>QRev Estimated Uncertainty</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,0,0,2">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="uncertainty_value">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+            </font>
+           </property>
+           <property name="text">
+            <string/>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="uncertainty_units">
+           <property name="font">
+            <font>
+             <pointsize>12</pointsize>
+            </font>
+           </property>
+           <property name="text">
+            <string>%</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_rating">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Rating:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_excellent">
+            <property name="font">
+             <font>
+              <pointsize>12</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Excellent (&lt; 3%)</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_good">
+            <property name="font">
+             <font>
+              <pointsize>12</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Good (3 - 5 %)</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_fair">
+            <property name="font">
+             <font>
+              <pointsize>12</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Fair (5 - 8 %)</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_poor">
+            <property name="font">
+             <font>
+              <pointsize>12</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Poor (&gt; 8 %)</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="font">
+      <font>
+       <pointsize>12</pointsize>
+      </font>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>rating</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>rating</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wRating_2_py.bat b/UI/wRating_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..3da3deaaeddf13c7fefabf531590b8e5347d5d85
--- /dev/null
+++ b/UI/wRating_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wRating.ui -o wRating.py
diff --git a/UI/wSOSSource.py b/UI/wSOSSource.py
new file mode 100644
index 0000000000000000000000000000000000000000..4a0ae5af43d7677070d5c4534418f98deefb71f9
--- /dev/null
+++ b/UI/wSOSSource.py
@@ -0,0 +1,132 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wSOSSource.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_sos_source(object):
+    def setupUi(self, sos_source):
+        sos_source.setObjectName("sos_source")
+        sos_source.resize(360, 158)
+        self.gridLayout_2 = QtWidgets.QGridLayout(sos_source)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.gb_source = QtWidgets.QGroupBox(sos_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_source.setFont(font)
+        self.gb_source.setObjectName("gb_source")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.gb_source)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.rb_internal = QtWidgets.QRadioButton(self.gb_source)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_internal.setFont(font)
+        self.rb_internal.setObjectName("rb_internal")
+        self.verticalLayout_2.addWidget(self.rb_internal)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setSpacing(8)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.rb_user = QtWidgets.QRadioButton(self.gb_source)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_user.setFont(font)
+        self.rb_user.setObjectName("rb_user")
+        self.horizontalLayout_2.addWidget(self.rb_user)
+        self.ed_sos_user = QtWidgets.QLineEdit(self.gb_source)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.ed_sos_user.setFont(font)
+        self.ed_sos_user.setObjectName("ed_sos_user")
+        self.horizontalLayout_2.addWidget(self.ed_sos_user)
+        spacerItem = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2.setStretch(0, 1)
+        self.horizontalLayout_2.setStretch(1, 1)
+        self.horizontalLayout_2.setStretch(2, 3)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.verticalLayout_2.setStretch(0, 4)
+        self.verticalLayout_2.setStretch(1, 4)
+        self.horizontalLayout.addWidget(self.gb_source)
+        self.gb_sos_source = QtWidgets.QGroupBox(sos_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_sos_source.setFont(font)
+        self.gb_sos_source.setObjectName("gb_sos_source")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_sos_source)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_all = QtWidgets.QRadioButton(self.gb_sos_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_all.setFont(font)
+        self.rb_all.setChecked(True)
+        self.rb_all.setObjectName("rb_all")
+        self.verticalLayout.addWidget(self.rb_all)
+        self.rb_transect = QtWidgets.QRadioButton(self.gb_sos_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_transect.setFont(font)
+        self.rb_transect.setObjectName("rb_transect")
+        self.verticalLayout.addWidget(self.rb_transect)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout.addWidget(self.gb_sos_source)
+        self.horizontalLayout.setStretch(0, 1)
+        self.horizontalLayout.setStretch(1, 1)
+        self.verticalLayout_3.addLayout(self.horizontalLayout)
+        self.buttonBox = QtWidgets.QDialogButtonBox(sos_source)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.verticalLayout_3.addWidget(self.buttonBox)
+        self.gridLayout_2.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
+
+        self.retranslateUi(sos_source)
+        self.buttonBox.accepted.connect(sos_source.accept)
+        self.buttonBox.rejected.connect(sos_source.reject)
+        QtCore.QMetaObject.connectSlotsByName(sos_source)
+
+    def retranslateUi(self, sos_source):
+        _translate = QtCore.QCoreApplication.translate
+        sos_source.setWindowTitle(_translate("sos_source", "Speed of Sound Source"))
+        self.gb_source.setTitle(_translate("sos_source", "Speed of Sound Source"))
+        self.rb_internal.setText(_translate("sos_source", " Internal (ADCP)"))
+        self.rb_user.setText(_translate("sos_source", "User (m/s)"))
+        self.gb_sos_source.setTitle(_translate("sos_source", "Apply To:"))
+        self.rb_all.setText(_translate("sos_source", "All Transects"))
+        self.rb_transect.setText(_translate("sos_source", "Transect Only"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    sos_source = QtWidgets.QDialog()
+    ui = Ui_sos_source()
+    ui.setupUi(sos_source)
+    sos_source.show()
+    sys.exit(app.exec_())
diff --git a/UI/wSOSSource.ui b/UI/wSOSSource.ui
new file mode 100644
index 0000000000000000000000000000000000000000..7b01ce58b63a6bb86d11e2db51d99ca2570842f0
--- /dev/null
+++ b/UI/wSOSSource.ui
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>sos_source</class>
+ <widget class="QDialog" name="sos_source">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>360</width>
+    <height>158</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Speed of Sound Source</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1">
+       <item>
+        <widget class="QGroupBox" name="gb_source">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="title">
+          <string>Speed of Sound Source</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_2" stretch="4,4">
+          <item>
+           <widget class="QRadioButton" name="rb_internal">
+            <property name="font">
+             <font>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string> Internal (ADCP)</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="1,1,3">
+            <property name="spacing">
+             <number>8</number>
+            </property>
+            <item>
+             <widget class="QRadioButton" name="rb_user">
+              <property name="font">
+               <font>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>User (m/s)</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLineEdit" name="ed_sos_user">
+              <property name="font">
+               <font>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="gb_sos_source">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="title">
+          <string>Apply To:</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout">
+          <item row="0" column="0">
+           <layout class="QVBoxLayout" name="verticalLayout">
+            <item>
+             <widget class="QRadioButton" name="rb_all">
+              <property name="font">
+               <font>
+                <pointsize>10</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>All Transects</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_transect">
+              <property name="font">
+               <font>
+                <pointsize>10</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Transect Only</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>sos_source</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>sos_source</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wSOSSource_2_py.bat b/UI/wSOSSource_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..4e89d4563a3d4d7f87bd7b8c7d04a2fd96b42fd7
--- /dev/null
+++ b/UI/wSOSSource_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wSOSSource.ui -o wSOSSource.py
diff --git a/UI/wSalinity.py b/UI/wSalinity.py
new file mode 100644
index 0000000000000000000000000000000000000000..775c40ea63a9c370208e90b32c1cc732cca70021
--- /dev/null
+++ b/UI/wSalinity.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wSalinity.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_salinity(object):
+    def setupUi(self, salinity):
+        salinity.setObjectName("salinity")
+        salinity.resize(342, 155)
+        self.gridLayout_2 = QtWidgets.QGridLayout(salinity)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        spacerItem = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.salinity_label = QtWidgets.QLabel(salinity)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.salinity_label.setFont(font)
+        self.salinity_label.setObjectName("salinity_label")
+        self.horizontalLayout_2.addWidget(self.salinity_label)
+        spacerItem2 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem3 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem3)
+        self.ed_salinity = QtWidgets.QLineEdit(salinity)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_salinity.setFont(font)
+        self.ed_salinity.setObjectName("ed_salinity")
+        self.horizontalLayout.addWidget(self.ed_salinity)
+        spacerItem4 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem4)
+        self.horizontalLayout.setStretch(0, 2)
+        self.horizontalLayout.setStretch(1, 1)
+        self.horizontalLayout.setStretch(2, 2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        spacerItem5 = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem5)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+        self.gb_magvar = QtWidgets.QGroupBox(salinity)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_magvar.setFont(font)
+        self.gb_magvar.setObjectName("gb_magvar")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_magvar)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_all = QtWidgets.QRadioButton(self.gb_magvar)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_all.setFont(font)
+        self.rb_all.setChecked(True)
+        self.rb_all.setObjectName("rb_all")
+        self.verticalLayout.addWidget(self.rb_all)
+        self.rb_transect = QtWidgets.QRadioButton(self.gb_magvar)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_transect.setFont(font)
+        self.rb_transect.setObjectName("rb_transect")
+        self.verticalLayout.addWidget(self.rb_transect)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout_3.addWidget(self.gb_magvar)
+        self.gridLayout_2.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(salinity)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
+
+        self.retranslateUi(salinity)
+        self.buttonBox.accepted.connect(salinity.accept)
+        self.buttonBox.rejected.connect(salinity.reject)
+        QtCore.QMetaObject.connectSlotsByName(salinity)
+
+    def retranslateUi(self, salinity):
+        _translate = QtCore.QCoreApplication.translate
+        salinity.setWindowTitle(_translate("salinity", "Salinity"))
+        self.salinity_label.setText(_translate("salinity", "Salinity (ppt)"))
+        self.gb_magvar.setTitle(_translate("salinity", "Apply To:"))
+        self.rb_all.setText(_translate("salinity", "All Transects"))
+        self.rb_transect.setText(_translate("salinity", "Transect Only"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    salinity = QtWidgets.QDialog()
+    ui = Ui_salinity()
+    ui.setupUi(salinity)
+    salinity.show()
+    sys.exit(app.exec_())
diff --git a/UI/wSalinity.ui b/UI/wSalinity.ui
new file mode 100644
index 0000000000000000000000000000000000000000..7203516cc3532d96cac77838f59ce3b5978e5aad
--- /dev/null
+++ b/UI/wSalinity.ui
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>salinity</class>
+ <widget class="QDialog" name="salinity">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>342</width>
+    <height>155</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Salinity</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="salinity_label">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string>Salinity (ppt)</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1,2">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="ed_salinity">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+            </font>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_magvar">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Apply To:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_all">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>All Transects</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_transect">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Transect Only</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>salinity</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>salinity</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wSalinity_2_py.bat b/UI/wSalinity_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..31f46ffb94d0f07977e3504c3d6bc9a7cfa1eb4d
--- /dev/null
+++ b/UI/wSalinity_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wSalinity.ui -o wSalinity.py
diff --git a/UI/wSelectFile.py b/UI/wSelectFile.py
new file mode 100644
index 0000000000000000000000000000000000000000..6bc2130309e8847fd39bb7099ecf44c9463a7eb9
--- /dev/null
+++ b/UI/wSelectFile.py
@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wSelectFile.ui'
+#
+# Created by: PyQt5 UI code generator 5.6
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_selectFile(object):
+    def setupUi(self, selectFile):
+        selectFile.setObjectName("selectFile")
+        selectFile.setWindowModality(QtCore.Qt.ApplicationModal)
+        selectFile.resize(308, 326)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        selectFile.setFont(font)
+        self.gridLayout = QtWidgets.QGridLayout(selectFile)
+        self.gridLayout.setVerticalSpacing(20)
+        self.gridLayout.setObjectName("gridLayout")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.cbTRDI = QtWidgets.QCheckBox(selectFile)
+        sizePolicy = QtWidgets.QSizePolicy(
+            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
+        )
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.cbTRDI.sizePolicy().hasHeightForWidth())
+        self.cbTRDI.setSizePolicy(sizePolicy)
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.cbTRDI.setFont(font)
+        self.cbTRDI.setLayoutDirection(QtCore.Qt.LeftToRight)
+        self.cbTRDI.setObjectName("cbTRDI")
+        self.horizontalLayout.addWidget(self.cbTRDI)
+        self.pbTRDI = QtWidgets.QPushButton(selectFile)
+        sizePolicy = QtWidgets.QSizePolicy(
+            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
+        )
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.pbTRDI.sizePolicy().hasHeightForWidth())
+        self.pbTRDI.setSizePolicy(sizePolicy)
+        self.pbTRDI.setMinimumSize(QtCore.QSize(0, 40))
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.pbTRDI.setFont(font)
+        self.pbTRDI.setAutoFillBackground(False)
+        self.pbTRDI.setObjectName("pbTRDI")
+        self.horizontalLayout.addWidget(self.pbTRDI)
+        self.gridLayout.addLayout(self.horizontalLayout, 4, 0, 1, 1)
+        spacerItem = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.gridLayout.addItem(spacerItem, 6, 0, 1, 1)
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_3.addItem(spacerItem1)
+        self.pbQRev = QtWidgets.QPushButton(selectFile)
+        sizePolicy = QtWidgets.QSizePolicy(
+            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
+        )
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.pbQRev.sizePolicy().hasHeightForWidth())
+        self.pbQRev.setSizePolicy(sizePolicy)
+        self.pbQRev.setMinimumSize(QtCore.QSize(0, 40))
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.pbQRev.setFont(font)
+        self.pbQRev.setObjectName("pbQRev")
+        self.horizontalLayout_3.addWidget(self.pbQRev)
+        self.gridLayout.addLayout(self.horizontalLayout_3, 5, 0, 1, 1)
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        spacerItem2 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_4.addItem(spacerItem2)
+        self.pbCancel = QtWidgets.QPushButton(selectFile)
+        sizePolicy = QtWidgets.QSizePolicy(
+            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
+        )
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.pbCancel.sizePolicy().hasHeightForWidth())
+        self.pbCancel.setSizePolicy(sizePolicy)
+        self.pbCancel.setMinimumSize(QtCore.QSize(0, 40))
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.pbCancel.setFont(font)
+        self.pbCancel.setObjectName("pbCancel")
+        self.horizontalLayout_4.addWidget(self.pbCancel)
+        self.gridLayout.addLayout(self.horizontalLayout_4, 7, 0, 1, 1)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem3 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem3)
+        self.pbSonTek = QtWidgets.QPushButton(selectFile)
+        sizePolicy = QtWidgets.QSizePolicy(
+            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
+        )
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.pbSonTek.sizePolicy().hasHeightForWidth())
+        self.pbSonTek.setSizePolicy(sizePolicy)
+        self.pbSonTek.setMinimumSize(QtCore.QSize(0, 40))
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.pbSonTek.setFont(font)
+        self.pbSonTek.setObjectName("pbSonTek")
+        self.horizontalLayout_2.addWidget(self.pbSonTek)
+        self.gridLayout.addLayout(self.horizontalLayout_2, 3, 0, 1, 1)
+        self.pbHelp = QtWidgets.QPushButton(selectFile)
+        self.pbHelp.setMinimumSize(QtCore.QSize(40, 40))
+        self.pbHelp.setMaximumSize(QtCore.QSize(40, 40))
+        font = QtGui.QFont()
+        font.setPointSize(14)
+        font.setBold(True)
+        font.setWeight(75)
+        self.pbHelp.setFont(font)
+        self.pbHelp.setObjectName("pbHelp")
+        self.gridLayout.addWidget(self.pbHelp, 1, 0, 1, 1, QtCore.Qt.AlignRight)
+
+        self.retranslateUi(selectFile)
+        QtCore.QMetaObject.connectSlotsByName(selectFile)
+        selectFile.setTabOrder(self.pbSonTek, self.pbTRDI)
+        selectFile.setTabOrder(self.pbTRDI, self.cbTRDI)
+        selectFile.setTabOrder(self.cbTRDI, self.pbQRev)
+        selectFile.setTabOrder(self.pbQRev, self.pbCancel)
+        selectFile.setTabOrder(self.pbCancel, self.pbHelp)
+
+    def retranslateUi(self, selectFile):
+        _translate = QtCore.QCoreApplication.translate
+        selectFile.setWindowTitle(_translate("selectFile", "Select File(s)"))
+        self.cbTRDI.setText(_translate("selectFile", "Checked Only"))
+        self.pbTRDI.setText(_translate("selectFile", "TRDI"))
+        self.pbQRev.setText(_translate("selectFile", "QRev"))
+        self.pbCancel.setText(_translate("selectFile", "Cancel"))
+        self.pbSonTek.setText(_translate("selectFile", "SonTek"))
+        self.pbHelp.setText(_translate("selectFile", "?"))
diff --git a/UI/wSelectFile.ui b/UI/wSelectFile.ui
new file mode 100644
index 0000000000000000000000000000000000000000..0b7b1ac5828668bab0ee755f08e584c8e0ebb76e
--- /dev/null
+++ b/UI/wSelectFile.ui
@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>selectFile</class>
+ <widget class="QDialog" name="selectFile">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>308</width>
+    <height>326</height>
+   </rect>
+  </property>
+  <property name="font">
+   <font>
+    <pointsize>10</pointsize>
+    <weight>50</weight>
+    <bold>false</bold>
+   </font>
+  </property>
+  <property name="windowTitle">
+   <string>Select File(s)</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="verticalSpacing">
+    <number>20</number>
+   </property>
+   <item row="4" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QCheckBox" name="cbTRDI">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="font">
+        <font>
+         <pointsize>12</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="layoutDirection">
+        <enum>Qt::LeftToRight</enum>
+       </property>
+       <property name="text">
+        <string>Checked Only</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pbTRDI">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>40</height>
+        </size>
+       </property>
+       <property name="font">
+        <font>
+         <pointsize>12</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="autoFillBackground">
+        <bool>false</bool>
+       </property>
+       <property name="text">
+        <string>TRDI</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="6" column="0">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="5" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <spacer name="horizontalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pbQRev">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>40</height>
+        </size>
+       </property>
+       <property name="font">
+        <font>
+         <pointsize>12</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="text">
+        <string>QRev</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="7" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_4">
+     <item>
+      <spacer name="horizontalSpacer_3">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pbCancel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>40</height>
+        </size>
+       </property>
+       <property name="font">
+        <font>
+         <pointsize>12</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="text">
+        <string>Cancel</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="3" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pbSonTek">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>40</height>
+        </size>
+       </property>
+       <property name="font">
+        <font>
+         <pointsize>12</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="text">
+        <string>SonTek</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0" alignment="Qt::AlignRight">
+    <widget class="QPushButton" name="pbHelp">
+     <property name="minimumSize">
+      <size>
+       <width>40</width>
+       <height>40</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>40</width>
+       <height>40</height>
+      </size>
+     </property>
+     <property name="font">
+      <font>
+       <pointsize>14</pointsize>
+       <weight>75</weight>
+       <bold>true</bold>
+      </font>
+     </property>
+     <property name="text">
+      <string>?</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>pbSonTek</tabstop>
+  <tabstop>pbTRDI</tabstop>
+  <tabstop>cbTRDI</tabstop>
+  <tabstop>pbQRev</tabstop>
+  <tabstop>pbCancel</tabstop>
+  <tabstop>pbHelp</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/UI/wStartEdge.py b/UI/wStartEdge.py
new file mode 100644
index 0000000000000000000000000000000000000000..20b7f78d3ad6f907b8820cb3604f0adb93f49b34
--- /dev/null
+++ b/UI/wStartEdge.py
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wStartEdge.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_start_edge(object):
+    def setupUi(self, start_edge):
+        start_edge.setObjectName("start_edge")
+        start_edge.resize(146, 120)
+        self.gridLayout_2 = QtWidgets.QGridLayout(start_edge)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.gb_start_edge = QtWidgets.QGroupBox(start_edge)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_start_edge.setFont(font)
+        self.gb_start_edge.setObjectName("gb_start_edge")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_start_edge)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_left = QtWidgets.QRadioButton(self.gb_start_edge)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_left.setFont(font)
+        self.rb_left.setChecked(True)
+        self.rb_left.setObjectName("rb_left")
+        self.verticalLayout.addWidget(self.rb_left)
+        self.rb_right = QtWidgets.QRadioButton(self.gb_start_edge)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_right.setFont(font)
+        self.rb_right.setObjectName("rb_right")
+        self.verticalLayout.addWidget(self.rb_right)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout.addWidget(self.gb_start_edge)
+        self.horizontalLayout.setStretch(0, 1)
+        self.verticalLayout_3.addLayout(self.horizontalLayout)
+        self.buttonBox = QtWidgets.QDialogButtonBox(start_edge)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.verticalLayout_3.addWidget(self.buttonBox)
+        self.gridLayout_2.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
+
+        self.retranslateUi(start_edge)
+        self.buttonBox.accepted.connect(start_edge.accept)
+        self.buttonBox.rejected.connect(start_edge.reject)
+        QtCore.QMetaObject.connectSlotsByName(start_edge)
+
+    def retranslateUi(self, start_edge):
+        _translate = QtCore.QCoreApplication.translate
+        start_edge.setWindowTitle(_translate("start_edge", "Start Edge"))
+        self.gb_start_edge.setTitle(_translate("start_edge", "Start Edge:"))
+        self.rb_left.setText(_translate("start_edge", "Left"))
+        self.rb_right.setText(_translate("start_edge", "Right"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    start_edge = QtWidgets.QDialog()
+    ui = Ui_start_edge()
+    ui.setupUi(start_edge)
+    start_edge.show()
+    sys.exit(app.exec_())
diff --git a/UI/wStartEdge.ui b/UI/wStartEdge.ui
new file mode 100644
index 0000000000000000000000000000000000000000..bea8c6eacc2f0ff06b5dd3400d093987d3bd2464
--- /dev/null
+++ b/UI/wStartEdge.ui
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>start_edge</class>
+ <widget class="QDialog" name="start_edge">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>146</width>
+    <height>120</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Start Edge</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout" stretch="1">
+       <item>
+        <widget class="QGroupBox" name="gb_start_edge">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="title">
+          <string>Start Edge:</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout">
+          <item row="0" column="0">
+           <layout class="QVBoxLayout" name="verticalLayout">
+            <item>
+             <widget class="QRadioButton" name="rb_left">
+              <property name="font">
+               <font>
+                <pointsize>10</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Left</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_right">
+              <property name="font">
+               <font>
+                <pointsize>10</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Right</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>start_edge</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>start_edge</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wStartEdge_2_py.bat b/UI/wStartEdge_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..adfc6ac26c3fd42631e99ca74a0e0a42171a29fd
--- /dev/null
+++ b/UI/wStartEdge_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wStartEdge.ui -o wStartEdge.py
diff --git a/UI/wSubsection.py b/UI/wSubsection.py
new file mode 100644
index 0000000000000000000000000000000000000000..2d4bc10d294ae26b00f7f76506a2483b88752f94
--- /dev/null
+++ b/UI/wSubsection.py
@@ -0,0 +1,152 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wSubsection.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_subsection(object):
+    def setupUi(self, subsection):
+        subsection.setObjectName("subsection")
+        subsection.resize(420, 155)
+        self.gridLayout_2 = QtWidgets.QGridLayout(subsection)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        spacerItem = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.subsection_label = QtWidgets.QLabel(subsection)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.subsection_label.setFont(font)
+        self.subsection_label.setObjectName("subsection_label")
+        self.horizontalLayout_2.addWidget(self.subsection_label)
+        spacerItem2 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.start_label = QtWidgets.QLabel(subsection)
+        self.start_label.setAlignment(
+            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter
+        )
+        self.start_label.setObjectName("start_label")
+        self.horizontalLayout.addWidget(self.start_label)
+        self.start_value = QtWidgets.QLineEdit(subsection)
+        self.start_value.setObjectName("start_value")
+        self.horizontalLayout.addWidget(self.start_value)
+        self.start_units = QtWidgets.QLabel(subsection)
+        self.start_units.setObjectName("start_units")
+        self.horizontalLayout.addWidget(self.start_units)
+        self.end_lable = QtWidgets.QLabel(subsection)
+        self.end_lable.setAlignment(
+            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter
+        )
+        self.end_lable.setObjectName("end_lable")
+        self.horizontalLayout.addWidget(self.end_lable)
+        self.end_value = QtWidgets.QLineEdit(subsection)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.end_value.setFont(font)
+        self.end_value.setObjectName("end_value")
+        self.horizontalLayout.addWidget(self.end_value)
+        self.end_units = QtWidgets.QLabel(subsection)
+        self.end_units.setObjectName("end_units")
+        self.horizontalLayout.addWidget(self.end_units)
+        self.horizontalLayout.setStretch(0, 2)
+        self.horizontalLayout.setStretch(1, 1)
+        self.horizontalLayout.setStretch(3, 2)
+        self.horizontalLayout.setStretch(4, 1)
+        self.horizontalLayout.setStretch(5, 1)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        spacerItem3 = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem3)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+        self.gb_hoffset = QtWidgets.QGroupBox(subsection)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_hoffset.setFont(font)
+        self.gb_hoffset.setObjectName("gb_hoffset")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_hoffset)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_new = QtWidgets.QRadioButton(self.gb_hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_new.setFont(font)
+        self.rb_new.setChecked(True)
+        self.rb_new.setObjectName("rb_new")
+        self.verticalLayout.addWidget(self.rb_new)
+        self.rb_default = QtWidgets.QRadioButton(self.gb_hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_default.setFont(font)
+        self.rb_default.setObjectName("rb_default")
+        self.verticalLayout.addWidget(self.rb_default)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout_3.addWidget(self.gb_hoffset)
+        self.gridLayout_2.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(subsection)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
+
+        self.retranslateUi(subsection)
+        self.buttonBox.accepted.connect(subsection.accept)
+        self.buttonBox.rejected.connect(subsection.reject)
+        QtCore.QMetaObject.connectSlotsByName(subsection)
+
+    def retranslateUi(self, subsection):
+        _translate = QtCore.QCoreApplication.translate
+        subsection.setWindowTitle(_translate("subsection", "Extrap Subsection"))
+        self.subsection_label.setText(
+            _translate("subsection", "Subsection in Percentage")
+        )
+        self.start_label.setText(_translate("subsection", "Start"))
+        self.start_units.setText(_translate("subsection", "%"))
+        self.end_lable.setText(_translate("subsection", "End"))
+        self.end_units.setText(_translate("subsection", "%"))
+        self.gb_hoffset.setTitle(_translate("subsection", "Apply To:"))
+        self.rb_new.setText(_translate("subsection", "Apply"))
+        self.rb_default.setText(_translate("subsection", "Default (0 / 100 %)"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    subsection = QtWidgets.QDialog()
+    ui = Ui_subsection()
+    ui.setupUi(subsection)
+    subsection.show()
+    sys.exit(app.exec_())
diff --git a/UI/wSubsection.ui b/UI/wSubsection.ui
new file mode 100644
index 0000000000000000000000000000000000000000..1e1802f3d5fc673874e7e77b7eaeb5b18f938a61
--- /dev/null
+++ b/UI/wSubsection.ui
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>subsection</class>
+ <widget class="QDialog" name="subsection">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>420</width>
+    <height>155</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Extrap Subsection</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="subsection_label">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string>Subsection in Percentage</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1,0,2,1,1">
+         <item>
+          <widget class="QLabel" name="start_label">
+           <property name="text">
+            <string>Start</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="start_value"/>
+         </item>
+         <item>
+          <widget class="QLabel" name="start_units">
+           <property name="text">
+            <string>%</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="end_lable">
+           <property name="text">
+            <string>End</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="end_value">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+            </font>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="end_units">
+           <property name="text">
+            <string>%</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_hoffset">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Apply To:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_new">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Apply</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_default">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Default (0 / 100 %)</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>subsection</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>subsection</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wSubsection_2_py.bat b/UI/wSubsection_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..01f536d1be8941638388b4ad2fc07129a99a07a9
--- /dev/null
+++ b/UI/wSubsection_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wSubsection.ui -o wSubsection.py
diff --git a/UI/wTempSource.py b/UI/wTempSource.py
new file mode 100644
index 0000000000000000000000000000000000000000..36266670535be121503cf3f0cb1979302f1710a0
--- /dev/null
+++ b/UI/wTempSource.py
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wTempSource.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_temp_source(object):
+    def setupUi(self, temp_source):
+        temp_source.setObjectName("temp_source")
+        temp_source.resize(355, 162)
+        self.gridLayout_2 = QtWidgets.QGridLayout(temp_source)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.gb_source = QtWidgets.QGroupBox(temp_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_source.setFont(font)
+        self.gb_source.setObjectName("gb_source")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.gb_source)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.rb_internal = QtWidgets.QRadioButton(self.gb_source)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_internal.setFont(font)
+        self.rb_internal.setObjectName("rb_internal")
+        self.verticalLayout_2.addWidget(self.rb_internal)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.rb_user = QtWidgets.QRadioButton(self.gb_source)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_user.setFont(font)
+        self.rb_user.setObjectName("rb_user")
+        self.horizontalLayout_2.addWidget(self.rb_user)
+        self.ed_user_temp = QtWidgets.QLineEdit(self.gb_source)
+        self.ed_user_temp.setObjectName("ed_user_temp")
+        self.horizontalLayout_2.addWidget(self.ed_user_temp)
+        spacerItem = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2.setStretch(0, 1)
+        self.horizontalLayout_2.setStretch(1, 1)
+        self.horizontalLayout_2.setStretch(2, 3)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout.addWidget(self.gb_source)
+        self.gb_h_source = QtWidgets.QGroupBox(temp_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_h_source.setFont(font)
+        self.gb_h_source.setObjectName("gb_h_source")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_h_source)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_all = QtWidgets.QRadioButton(self.gb_h_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_all.setFont(font)
+        self.rb_all.setChecked(True)
+        self.rb_all.setObjectName("rb_all")
+        self.verticalLayout.addWidget(self.rb_all)
+        self.rb_transect = QtWidgets.QRadioButton(self.gb_h_source)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_transect.setFont(font)
+        self.rb_transect.setObjectName("rb_transect")
+        self.verticalLayout.addWidget(self.rb_transect)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout.addWidget(self.gb_h_source)
+        self.horizontalLayout.setStretch(0, 1)
+        self.horizontalLayout.setStretch(1, 1)
+        self.verticalLayout_3.addLayout(self.horizontalLayout)
+        self.buttonBox = QtWidgets.QDialogButtonBox(temp_source)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.verticalLayout_3.addWidget(self.buttonBox)
+        self.gridLayout_2.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
+
+        self.retranslateUi(temp_source)
+        self.buttonBox.accepted.connect(temp_source.accept)
+        self.buttonBox.rejected.connect(temp_source.reject)
+        QtCore.QMetaObject.connectSlotsByName(temp_source)
+
+    def retranslateUi(self, temp_source):
+        _translate = QtCore.QCoreApplication.translate
+        temp_source.setWindowTitle(_translate("temp_source", "Temperature Source"))
+        self.gb_source.setTitle(_translate("temp_source", "Temperature Source"))
+        self.rb_internal.setText(_translate("temp_source", "Internal"))
+        self.rb_user.setText(_translate("temp_source", "User (C)"))
+        self.gb_h_source.setTitle(_translate("temp_source", "Apply To:"))
+        self.rb_all.setText(_translate("temp_source", "All Transects"))
+        self.rb_transect.setText(_translate("temp_source", "Transect Only"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    temp_source = QtWidgets.QDialog()
+    ui = Ui_temp_source()
+    ui.setupUi(temp_source)
+    temp_source.show()
+    sys.exit(app.exec_())
diff --git a/UI/wTempSource.ui b/UI/wTempSource.ui
new file mode 100644
index 0000000000000000000000000000000000000000..f8efc5fc4b74ca74838ab77f4d29d31e51de40fb
--- /dev/null
+++ b/UI/wTempSource.ui
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>temp_source</class>
+ <widget class="QDialog" name="temp_source">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>355</width>
+    <height>162</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Temperature Source</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1">
+       <item>
+        <widget class="QGroupBox" name="gb_source">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="title">
+          <string>Temperature Source</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_2">
+          <item>
+           <widget class="QRadioButton" name="rb_internal">
+            <property name="font">
+             <font>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Internal</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="1,1,3">
+            <item>
+             <widget class="QRadioButton" name="rb_user">
+              <property name="font">
+               <font>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>User (C)</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLineEdit" name="ed_user_temp"/>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="gb_h_source">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="title">
+          <string>Apply To:</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout">
+          <item row="0" column="0">
+           <layout class="QVBoxLayout" name="verticalLayout">
+            <item>
+             <widget class="QRadioButton" name="rb_all">
+              <property name="font">
+               <font>
+                <pointsize>10</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>All Transects</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rb_transect">
+              <property name="font">
+               <font>
+                <pointsize>10</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Transect Only</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>temp_source</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>temp_source</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wTempSource_2_py.bat b/UI/wTempSource_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..edcb3ae630e1b0ccbec173f5c9f77e8d118c3ccb
--- /dev/null
+++ b/UI/wTempSource_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wTempSource.ui -o wTempSource.py
diff --git a/UI/wThreshold.py b/UI/wThreshold.py
new file mode 100644
index 0000000000000000000000000000000000000000..38bda037c94610dc591a5e74247828ad04ad42c3
--- /dev/null
+++ b/UI/wThreshold.py
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wThreshold.ui'
+#
+# Created by: PyQt5 UI code generator 5.12.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_threshold(object):
+    def setupUi(self, threshold):
+        threshold.setObjectName("threshold")
+        threshold.resize(420, 155)
+        self.gridLayout_2 = QtWidgets.QGridLayout(threshold)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        spacerItem = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem1 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.threshold_label = QtWidgets.QLabel(threshold)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.threshold_label.setFont(font)
+        self.threshold_label.setObjectName("threshold_label")
+        self.horizontalLayout_2.addWidget(self.threshold_label)
+        spacerItem2 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout_2.addItem(spacerItem2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem3 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem3)
+        self.ed_threshold = QtWidgets.QLineEdit(threshold)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.ed_threshold.setFont(font)
+        self.ed_threshold.setObjectName("ed_threshold")
+        self.horizontalLayout.addWidget(self.ed_threshold)
+        self.threshold_units = QtWidgets.QLabel(threshold)
+        self.threshold_units.setObjectName("threshold_units")
+        self.horizontalLayout.addWidget(self.threshold_units)
+        spacerItem4 = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem4)
+        self.horizontalLayout.setStretch(0, 2)
+        self.horizontalLayout.setStretch(1, 1)
+        self.horizontalLayout.setStretch(3, 2)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        spacerItem5 = QtWidgets.QSpacerItem(
+            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding
+        )
+        self.verticalLayout_2.addItem(spacerItem5)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+        self.gb_hoffset = QtWidgets.QGroupBox(threshold)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.gb_hoffset.setFont(font)
+        self.gb_hoffset.setObjectName("gb_hoffset")
+        self.gridLayout = QtWidgets.QGridLayout(self.gb_hoffset)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.rb_new = QtWidgets.QRadioButton(self.gb_hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_new.setFont(font)
+        self.rb_new.setChecked(True)
+        self.rb_new.setObjectName("rb_new")
+        self.verticalLayout.addWidget(self.rb_new)
+        self.rb_default = QtWidgets.QRadioButton(self.gb_hoffset)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.rb_default.setFont(font)
+        self.rb_default.setObjectName("rb_default")
+        self.verticalLayout.addWidget(self.rb_default)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+        self.horizontalLayout_3.addWidget(self.gb_hoffset)
+        self.gridLayout_2.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(threshold)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
+
+        self.retranslateUi(threshold)
+        self.buttonBox.accepted.connect(threshold.accept)
+        self.buttonBox.rejected.connect(threshold.reject)
+        QtCore.QMetaObject.connectSlotsByName(threshold)
+
+    def retranslateUi(self, threshold):
+        _translate = QtCore.QCoreApplication.translate
+        threshold.setWindowTitle(_translate("threshold", "Extrap Threshold"))
+        self.threshold_label.setText(
+            _translate("threshold", "Percentage of Points Threshold")
+        )
+        self.threshold_units.setText(_translate("threshold", "%"))
+        self.gb_hoffset.setTitle(_translate("threshold", "Apply To:"))
+        self.rb_new.setText(_translate("threshold", "Apply"))
+        self.rb_default.setText(_translate("threshold", "Default (20%)"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    threshold = QtWidgets.QDialog()
+    ui = Ui_threshold()
+    ui.setupUi(threshold)
+    threshold.show()
+    sys.exit(app.exec_())
diff --git a/UI/wThreshold.ui b/UI/wThreshold.ui
new file mode 100644
index 0000000000000000000000000000000000000000..98b1f11b5c998017fb729fcab9380fc23361ff8d
--- /dev/null
+++ b/UI/wThreshold.ui
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>threshold</class>
+ <widget class="QDialog" name="threshold">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>420</width>
+    <height>155</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Extrap Threshold</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="threshold_label">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string>Percentage of Points Threshold</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1,0,2">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="ed_threshold">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+            </font>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="threshold_units">
+           <property name="text">
+            <string>%</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="gb_hoffset">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="title">
+        <string>Apply To:</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rb_new">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Apply</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rb_default">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="text">
+             <string>Default (20%)</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>threshold</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>threshold</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wThreshold_2_py.bat b/UI/wThreshold_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..9e35f245d3492d729f0653aa3d6289b5477952e2
--- /dev/null
+++ b/UI/wThreshold_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wThreshold.ui -o wThreshold.py
diff --git a/UI/wTransects2Use.py b/UI/wTransects2Use.py
new file mode 100644
index 0000000000000000000000000000000000000000..a086905994458eda45dff57f418c602d7f8896a6
--- /dev/null
+++ b/UI/wTransects2Use.py
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'wTransects2Use.ui'
+#
+# Created by: PyQt5 UI code generator 5.13.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_Transects2Use(object):
+    def setupUi(self, Transects2Use):
+        Transects2Use.setObjectName("Transects2Use")
+        Transects2Use.setWindowModality(QtCore.Qt.ApplicationModal)
+        Transects2Use.resize(864, 270)
+        self.gridLayout = QtWidgets.QGridLayout(Transects2Use)
+        self.gridLayout.setObjectName("gridLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.tableSelect = QtWidgets.QTableWidget(Transects2Use)
+        self.tableSelect.setObjectName("tableSelect")
+        self.tableSelect.setColumnCount(0)
+        self.tableSelect.setRowCount(0)
+        self.verticalLayout.addWidget(self.tableSelect)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.pb_check_all = QtWidgets.QPushButton(Transects2Use)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.pb_check_all.setFont(font)
+        self.pb_check_all.setObjectName("pb_check_all")
+        self.horizontalLayout.addWidget(self.pb_check_all)
+        self.pb_uncheck_all = QtWidgets.QPushButton(Transects2Use)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.pb_uncheck_all.setFont(font)
+        self.pb_uncheck_all.setObjectName("pb_uncheck_all")
+        self.horizontalLayout.addWidget(self.pb_uncheck_all)
+        spacerItem = QtWidgets.QSpacerItem(
+            40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum
+        )
+        self.horizontalLayout.addItem(spacerItem)
+        self.buttonBox = QtWidgets.QDialogButtonBox(Transects2Use)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.buttonBox.setFont(font)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(
+            QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
+        )
+        self.buttonBox.setObjectName("buttonBox")
+        self.horizontalLayout.addWidget(self.buttonBox)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+
+        self.retranslateUi(Transects2Use)
+        self.buttonBox.accepted.connect(Transects2Use.accept)
+        self.buttonBox.rejected.connect(Transects2Use.reject)
+        QtCore.QMetaObject.connectSlotsByName(Transects2Use)
+
+    def retranslateUi(self, Transects2Use):
+        _translate = QtCore.QCoreApplication.translate
+        Transects2Use.setWindowTitle(_translate("Transects2Use", "Transects to Use"))
+        self.pb_check_all.setText(_translate("Transects2Use", "Check All"))
+        self.pb_uncheck_all.setText(_translate("Transects2Use", "Uncheck All"))
+
+
+if __name__ == "__main__":
+    import sys
+
+    app = QtWidgets.QApplication(sys.argv)
+    Transects2Use = QtWidgets.QDialog()
+    ui = Ui_Transects2Use()
+    ui.setupUi(Transects2Use)
+    Transects2Use.show()
+    sys.exit(app.exec_())
diff --git a/UI/wTransects2Use.ui b/UI/wTransects2Use.ui
new file mode 100644
index 0000000000000000000000000000000000000000..d7634e7080ea4d907f46cb74693d2c70edeba3fc
--- /dev/null
+++ b/UI/wTransects2Use.ui
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Transects2Use</class>
+ <widget class="QDialog" name="Transects2Use">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>864</width>
+    <height>270</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Transects to Use</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QTableWidget" name="tableSelect"/>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QPushButton" name="pb_check_all">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+          </font>
+         </property>
+         <property name="text">
+          <string>Check All</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="pb_uncheck_all">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+          </font>
+         </property>
+         <property name="text">
+          <string>Uncheck All</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QDialogButtonBox" name="buttonBox">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+          </font>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="standardButtons">
+          <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Transects2Use</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Transects2Use</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/UI/wTransects2Use_2_py.bat b/UI/wTransects2Use_2_py.bat
new file mode 100644
index 0000000000000000000000000000000000000000..efb4564b8ec5589e671989f367228b586415c7dc
--- /dev/null
+++ b/UI/wTransects2Use_2_py.bat
@@ -0,0 +1 @@
+pyuic5 -x wTransects2Use.ui -o wTransects2Use.py
diff --git a/common_functions.py b/common_functions.py
deleted file mode 100644
index 9e637a2dc4f5fdb85e5265feae2ae2095ac77af9..0000000000000000000000000000000000000000
--- a/common_functions.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Created on Thu Feb 10 15:36:04 2022
-
-@author: blais
-"""
-import math
-import numpy as np 
-import matplotlib.pyplot as plt
-from scipy.optimize.minpack import curve_fit
-from math import log10, floor
-
-def show_figure(fig):
-    dummy = plt.figure()
-    new_manager = dummy.canvas.manager
-    new_manager.canvas.figure = fig
-    fig.set_canvas(new_manager.canvas)
-
-
-def haversine(coord1, coord2):
-    R = 6372800  # Earth radius in meters
-    lat1, lon1 = coord1
-    lat2, lon2 = coord2
-    
-    phi1, phi2 = math.radians(lat1), math.radians(lat2) 
-    dphi       = math.radians(lat2 - lat1)
-    dlambda    = math.radians(lon2 - lon1)
-    
-    a = math.sin(dphi/2)**2 + \
-        math.cos(phi1)*math.cos(phi2)*math.sin(dlambda/2)**2
-    
-    return 2*R*math.atan2(math.sqrt(a), math.sqrt(1 - a))
-   
-def interpolation(data1, data2, data1_interp_value, style='linear'):
-    funcs = {'linear': lambda x, a, b: a * x + b,
-             'power': lambda x, a, b: a * x**b,
-             'power_rectangular': lambda x, a: a * x**0.1,
-             'power_triangular': lambda x, a: a * x**0.41}
-    valid = ~(np.isnan(data2) | np.isinf(data2))
-    if np.isnan(data2[valid]).all():
-        value = np.nan
-    elif len(data2[valid])==1:
-            value = data2[valid]
-    else:
-        try:
-            popt, _ = curve_fit(funcs[style], data1[valid], data2[valid], maxfev=1000)
-            value = funcs[style](data1_interp_value, *popt)
-        except Exception:
-                value = np.nan
-    return value
-
-def round_it(x, sig):
-    return round(x, sig - int(floor(log10(abs(x)))) - 1)
\ No newline at end of file
diff --git a/open_functions.py b/open_functions.py
index b62614082b2ddbe5732a89aba4ad3edaa918de03..a83cd121ccd08dbc70309acd58a086b6594641f6 100644
--- a/open_functions.py
+++ b/open_functions.py
@@ -14,11 +14,13 @@ import tkinter.filedialog
 import numpy as np
 import warnings
 import sys
+import scipy.io as sio
 
 # ========================================
 # Internal imports
 # ========================================
 from Classes.Measurement import Measurement
+from Classes.Oursin import Oursin
 
 
 # =============================================================================
@@ -31,7 +33,8 @@ def select_file(path_window=None):
     root = tk.Tk()
     root.withdraw()
     root.attributes("-topmost", True)
-    path_meas = tk.filedialog.askopenfilenames(parent=root, initialdir=path_window)
+    path_meas = tk.filedialog.askopenfilenames(parent=root, initialdir=path_window, title='Select ADCP file',
+                                               filetypes=[('ADCP data', '.mat .mmt')])
     if path_meas:
         keys = [elem.split('.')[-1].split('.')[0] for elem in path_meas]
         name_folders = [path_meas[0].split('/')[-2].split('.')[0]][0]
@@ -47,58 +50,94 @@ def select_file(path_window=None):
         return fileName, type_meas, name_folders
     else:
         warnings.warn('No file selected - end')
-        sys.exit()
-
+        return None, None, None
 
 def select_directory(path_window=None):
-    if not path_window:
-        path_window = os.getcwd()
     # Open a window to select a folder which contains measurements
     root = tk.Tk()
     root.withdraw()
     root.attributes("-topmost", True)
-    path_folder = tk.filedialog.askdirectory(parent=root, initialdir=path_window,
-                                             title='Select folder')
+    path_folder = tk.filedialog.askdirectory(parent=root, initialdir=path_window, title='Select folder')
     if path_folder:
-        if os.path.exists(path_folder + '/measurement_data.csv') and \
-                os.path.exists(path_folder + '/transects_data.csv'):
-            return path_folder
-        else:
-            path_folder = '\\'.join(path_folder.split('/'))
-            path_folders = np.array(glob.glob(path_folder + "/*"))
-            name_folders = np.array([os.path.basename((x)) for x in path_folders])
-            excluded_folders = [s.find('.') == -1 for s in name_folders]
-            path_folders = path_folders[excluded_folders]
-            name_folders = name_folders[excluded_folders]
-
-            type_meas = list()
-            path_meas = list()
-            name_meas = list()
-
-            for id_meas in range(len(path_folders)):
-                list_files = os.listdir(path_folders[id_meas])
-                exte_files = list([i.split('.', 1)[-1] for i in list_files])
-                if 'mmt' in exte_files or 'mat' in exte_files:
-                    if 'mmt' in exte_files:
-                        type_meas.append('TRDI')
-                        loca_meas = exte_files.index("mmt")  # index of the measurement file
-                        ind_meas = [i for i, x in enumerate(exte_files) if x == "PD0"]  # transects index
-                        fileName = list_files[loca_meas]
-                        path_meas.append(os.path.join(path_folders[id_meas], fileName))
+        # ADCP folders path
+        path_folder = '\\'.join(path_folder.split('/'))
+        path_folders = np.array(glob.glob(path_folder + "/*"))
+        # path_folders = [f.path for f in os.scandir(path_folder) if f.is_dir()]
+        # Load their name
+        name_folders = np.array([os.path.basename(x) for x in path_folders])
+
+        # only for testing
+        # path_test = []
+        # for id_meas in range(len(path_folders)):
+        #     path_test.extend([f.path for f in os.scandir(path_folders[id_meas]) if f.is_dir()])
+        # path_folders = path_test
+        # name_folders = np.array([os.path.basename(x) for x in path_folders])
+        name_parent = [i.split('\\')[-2] for i in path_folders]
+
+        # Exclude files
+        excluded_folders = [s.find('.') == -1 for s in name_folders]
+        path_folders = path_folders[excluded_folders]
+        name_folders = name_folders[excluded_folders]
+
+        # Open measurement
+        type_meas = list()
+        path_meas = list()
+        name_meas = list()
+        no_adcp = list()
+        for id_meas in range(len(path_folders)):
+            list_files = os.listdir(path_folders[id_meas])
+            exte_files = list([i.split('.', 1)[-1] for i in list_files])
+            if 'mmt' in exte_files or 'mat' in exte_files:
+                if 'mat' in exte_files:
+                    loca_meas = [i for i, s in enumerate(exte_files) if "mat" in s]  # transects index
+                    fileNameRaw = [(list_files[x]) for x in loca_meas]
+                    qrev_data = False
+                    path_qrev_meas = []
+                    for name in fileNameRaw:
+                        path = os.path.join(path_folders[id_meas], name)
+                        mat_data = sio.loadmat(path, struct_as_record=False, squeeze_me=True)
+                        if 'version' in mat_data:
+                            path_qrev_meas.append(os.path.join(path_folders[id_meas], name))
+                            qrev_data = True
+                    if qrev_data:
+                        recent_time = None
+                        recent_id = 0
+                        for i in range(len(path_qrev_meas)):
+                            qrev_time = os.path.getmtime(path_qrev_meas[i])
+                            if recent_time is None or qrev_time < recent_time:
+                                recent_time = qrev_time
+                                recent_id = i
+                        path = path_qrev_meas[recent_id]
+                        mat_data = sio.loadmat(path, struct_as_record=False, squeeze_me=True)
+                        print('QRev file')
+                        type_meas.append('QRev')
                         name_meas.append(name_folders[id_meas])
+                        path_meas.append(mat_data)
 
-                    elif 'mat' in exte_files:
+                    else:
+                        print('SonTek file')
                         type_meas.append('SonTek')
-                        loca_meas = [i for i, s in enumerate(exte_files) if "mat" in s]  # transects index
-                        fileNameRaw = [(list_files[x]) for x in loca_meas]
                         fileName = [s for i, s in enumerate(fileNameRaw)
                                     if "QRev.mat" not in s]
-                        path_meas.append([os.path.join(path_folders[id_meas], fileName[x]) for x in range(len(fileName))])
                         name_meas.append(name_folders[id_meas])
-            return path_meas, type_meas, name_meas
+                        path_meas.append(
+                            [os.path.join(path_folders[id_meas], fileName[x]) for x in
+                             range(len(fileName))])
+
+                else:
+                    print('TRDI file')
+                    type_meas.append('TRDI')
+                    loca_meas = exte_files.index("mmt")  # index of the measurement file
+                    fileName = list_files[loca_meas]
+                    path_meas.append(os.path.join(path_folders[id_meas], fileName))
+                    name_meas.append(name_folders[id_meas])
+            else:
+                no_adcp.append(name_folders[id_meas])
+                print(f"No ADCP : {name_folders[id_meas]}")
+        return path_folder, path_meas, type_meas, name_meas, no_adcp, name_parent
     else:
         warnings.warn('No folder selected - end')
-        sys.exit()
+        return None, None, None, None, None, None
 
 
 def open_measurement(path_meas, type_meas, apply_settings=False, navigation_reference=None,
@@ -106,7 +145,8 @@ def open_measurement(path_meas, type_meas, apply_settings=False, navigation_refe
                      use_measurement_thresholds=False):
     # Open measurement
     meas = Measurement(in_file=path_meas, source=type_meas, proc_type='QRev', run_oursin=run_oursin,
-                       use_weighted=use_weighted, use_measurement_thresholds=use_measurement_thresholds)
+                       use_weighted=use_weighted, use_measurement_thresholds=use_measurement_thresholds,
+                       gps_quality_threshold=1)
 
     if apply_settings:
         if navigation_reference == 'GPS':
@@ -116,7 +156,7 @@ def open_measurement(path_meas, type_meas, apply_settings=False, navigation_refe
         meas, checked_transect, navigation_reference = new_settings(meas,
                                                                     navigation_reference,
                                                                     checked_transect,
-                                                                    extrap_velocity)
+                                                                    extrap_velocity, run_oursin)
     else:
         if meas.current_settings()['NavRef'] == 'bt_vel':
             navigation_reference = 'BT'
@@ -127,14 +167,15 @@ def open_measurement(path_meas, type_meas, apply_settings=False, navigation_refe
     return meas, checked_transect, navigation_reference
 
 
-def new_settings(meas, navigation_reference_user=None, checked_transect_user=None, extrap_velocity=False):
+def new_settings(meas, navigation_reference_user=None, checked_transect_user=None, extrap_velocity=False,
+                 run_oursin=False):
     # Apply settings
     settings = meas.current_settings()
 
     settings_change = False
 
     # Default Navigation reference
-    if navigation_reference_user == None:
+    if navigation_reference_user is None:
         if meas.current_settings()['NavRef'] == 'bt_vel':
             navigation_reference = 'BT'
         elif meas.current_settings()['NavRef'] == 'gga_vel' or meas.current_settings()['NavRef'] == 'vtg_vel':
@@ -172,5 +213,8 @@ def new_settings(meas, navigation_reference_user=None, checked_transect_user=Non
 
     if settings_change:
         meas.apply_settings(settings)
+        if run_oursin:
+            meas.oursin = Oursin()
+            meas.oursin.compute_oursin(meas)
 
     return meas, checked_transect_idx, navigation_reference
diff --git a/path_file.txt b/path_file.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5c2e903c42a160559a4d444cbb515cef21981dc6
--- /dev/null
+++ b/path_file.txt
@@ -0,0 +1 @@
+C:\Users\blaise.calmel\Documents\20_Data\2023_Tathy_Congo
\ No newline at end of file
diff --git a/qrevint_22_06_22/Classes/InstrumentData.py b/qrevint_22_06_22/Classes/InstrumentData.py
deleted file mode 100644
index cffa41bdba8fdc6e7bf81e327fd57203561d2358..0000000000000000000000000000000000000000
--- a/qrevint_22_06_22/Classes/InstrumentData.py
+++ /dev/null
@@ -1,268 +0,0 @@
-import numpy as np
-from Classes.TransformationMatrix import TransformationMatrix
-
-
-class InstrumentData(object):
-    """Container for characteristics of the ADCP used to make the measurement
-
-    Attributes
-    ----------
-    serial_num: str
-        Serial number of ADCP.
-    manufacturer: str
-        Name of manufacturer.
-    model: str
-        Model name of ADCP.
-    firmware: str
-        Firmware version in the ADCP.
-    frequency_khz:
-        Frequency or frequencies used by ADCP.
-    beam_angle_deg:
-        Angle of the beams from vertical in degrees.
-    beam_pattern:
-        Pattern of the beam angles, concave or convex.
-    t_matrix: TransformationMatrix
-        Object of TransformationMatrix.
-    configuration_commands:
-        Commands used to configure the instrument.
-    """
-     
-    def __init__(self):
-        """Constructor initializes the variables to None.
-        """
-
-        self.serial_num = None  # Serial number of ADCP
-        self.manufacturer = None  # manufacturer of ADCP (SonTek, TRDI)
-        self.model = None  # model of ADCP (Rio Grande, StreamPro, RiverRay, M9, S5)
-        self.firmware = None  # firmware version
-        self.frequency_khz = None  # frquency of ADCP (could be "Multi")
-        self.beam_angle_deg = None  # angle of beam from vertical
-        self.beam_pattern = None  # pattern of beams
-        self.t_matrix = None  # object of TransformationMatrix
-        self.configuration_commands = np.array([])  # configuration commands sent to ADCP
-        
-    def populate_data(self, manufacturer, raw_data, mmt_transect=None, mmt=None):
-        """Manages method calls for different manufacturers.
-
-        Parameters
-        ----------
-        manufacturer: str
-            Name of manufacturer.
-        raw_data: object
-            Object of Pd0TRDI for TRDI or Object of MatSonTek for SonTek
-        mmt_transect: MMT_Transect
-            Object of Transect (mmt object)
-        mmt: MMT_TRDI
-            Object of MMT_TRDI
-        """
-
-        # Process based on manufacturer
-        if manufacturer == 'TRDI':
-            self.manufacturer = manufacturer
-            self.trdi(pd0=raw_data, mmt_transect=mmt_transect, mmt=mmt)
-        elif manufacturer == 'SonTek':
-            self.manufacturer = manufacturer
-            self.sontek(rs=raw_data)
-        elif manufacturer == 'Nortek':
-            self.manufacturer = manufacturer
-            self.nortek(rs=raw_data)
-
-    def trdi(self, pd0, mmt_transect, mmt):
-        """Populates the variables with data from TRDI ADCPs.
-
-        Parameters
-        ----------
-        pd0: Pd0TRDI
-            Object of Pd0TRDI
-        mmt_transect: MMT_Transect
-            Object of MMT_Transect
-        mmt: MMT_Transect
-            Object of MMT_Transect
-        """
-
-        # Instrument frequency
-        self.frequency_khz = pd0.Inst.freq[0]
-
-        # Firmware
-        self.firmware = pd0.Inst.firm_ver[0]
-
-        # Instrument beam angle and pattern
-        self.beam_angle_deg = pd0.Inst.beam_ang[0]
-        self.beam_pattern = pd0.Inst.pat[0]
-
-        # Instrument characteristics
-        mmt_site = getattr(mmt, 'site_info')
-        mmt_config = getattr(mmt_transect, 'active_config')
-
-        self.serial_num = mmt_site['ADCPSerialNmb']
-
-        # Determine TRDI model
-        num = float(self.firmware)
-        model_switch = np.floor(num)
-
-        if model_switch == 10:
-            self.model = 'Rio Grande'
-            if 'Fixed_Commands' in mmt_config.keys():
-                self.configuration_commands = np.append(self.configuration_commands, 'Fixed')
-                self.configuration_commands = np.append(self.configuration_commands, mmt_config['Fixed_Commands'])
-
-        elif model_switch == 31:
-            self.model = 'StreamPro'
-            self.frequency_khz = 2000
-            if 'Fixed_Commands_StreamPro' in mmt_config.keys():
-                self.configuration_commands = np.append(self.configuration_commands, 'Fixed')
-                self.configuration_commands = np.append(self.configuration_commands,
-                                                        mmt_config['Fixed_Commands_StreamPro'])
-
-        elif model_switch == 44:
-            self.model = 'RiverRay'
-            if 'Fixed_Commands_RiverRay' in mmt_config.keys():
-                self.configuration_commands = np.append(self.configuration_commands, 'Fixed')
-                self.configuration_commands = np.append(self.configuration_commands,
-                                                        mmt_config['Fixed_Commands_RiverRay'])
-
-        elif model_switch == 56:
-            self.model = 'RiverPro'
-            if pd0.Cfg.n_beams[0] < 5:
-                if 'RG_Test' in mmt.qaqc.keys():
-                    idx = mmt.qaqc['RG_Test'][0].find('RioPro')
-                    if idx != -1:
-                        self.model = 'RioPro'
-
-            if 'Fixed_Commands_RiverPro' in mmt_config.keys():
-                self.configuration_commands = np.append(self.configuration_commands, 'Fixed')
-                self.configuration_commands = np.append(self.configuration_commands,
-                                                        mmt_config['Fixed_Commands_RiverPro'])
-            else:
-                self.configuration_commands = np.append(self.configuration_commands, 'Fixed')
-                self.configuration_commands = np.append(self.configuration_commands, ' ')
-
-        else:
-            self.model = 'Unknown'
-            if 'Fixed_Commands' in mmt_config.keys():
-                self.configuration_commands = np.append(self.configuration_commands, 'Fixed')
-                self.configuration_commands = np.append(self.configuration_commands, mmt_config['Fixed_Commands'])
-
-        if 'Wizard_Commands' in mmt_config.keys():
-            self.configuration_commands = np.append(self.configuration_commands, ['Wizard'])
-            self.configuration_commands = np.append(self.configuration_commands,
-                                                    mmt_config['Wizard_Commands'])
-
-        if 'User_Commands' in mmt_config.keys():
-            self.configuration_commands = np.append(self.configuration_commands, ['User'])
-            self.configuration_commands = np.append(self.configuration_commands,
-                                                    mmt_config['User_Commands'])
-
-        # Obtain transformation matrix from one of the available sources
-        if not np.isnan(pd0.Inst.t_matrix[0, 0]):
-            self.t_matrix = TransformationMatrix()
-            self.t_matrix.populate_data(manufacturer='TRDI', model='pd0', data_in=pd0)
-        elif self.model == 'RiverRay':
-            self.t_matrix = TransformationMatrix()
-            self.t_matrix.populate_data(manufacturer='TRDI', model=self.model, data_in='Nominal')
-        else:
-            if isinstance(mmt.qaqc, dict) and len(mmt.qaqc) > 0:
-                if 'RG_Test' in mmt.qaqc.keys():
-
-                    self.t_matrix = TransformationMatrix()
-                    self.t_matrix.populate_data(manufacturer='TRDI', model=self.model, data_in=mmt.qaqc['RG_Test'][0])
-
-                elif 'Compass_Calibration' in mmt.qaqc.keys():
-
-                    self.t_matrix = TransformationMatrix()
-                    self.t_matrix.populate_data(manufacturer='TRDI',
-                                                model=self.model,
-                                                data_in=mmt.qaqc['Compass_Calibration'][0])
-
-                elif 'Compass_Eval_Timestamp' in mmt.qaqc.keys():
-
-                    self.t_matrix = TransformationMatrix()
-                    self.t_matrix.populate_data(manufacturer='TRDI',
-                                                model=self.model,
-                                                data_in=mmt.qaqc['Compass_Evaluation'][0])
-
-                else:
-                    self.t_matrix = TransformationMatrix()
-                    self.t_matrix.populate_data(manufacturer='TRDI',
-                                                model=self.model,
-                                                data_in='Nominal')
-            else:
-                self.t_matrix = TransformationMatrix()
-                self.t_matrix.populate_data(manufacturer='TRDI',
-                                            model=self.model,
-                                            data_in='Nominal')
-
-    def sontek(self, rs):
-        """Populates the variables with data from SonTek ADCPs.
-
-        Parameters
-        ----------
-        rs: MatSonTek
-        """
-
-        self.serial_num = rs.System.SerialNumber
-        self.frequency_khz = rs.Transformation_Matrices.Frequency
-        if self.frequency_khz[2] > 0:
-            self.model = 'M9'
-        elif hasattr(rs.WaterTrack, 'Vel_Expected_StdDev'):
-            self.model = 'RS5'
-        else:
-            self.model = 'S5'
-        if hasattr(rs, 'SystemHW'):
-            revision = str(rs.SystemHW.FirmwareRevision)
-            if len(revision) < 2:
-                revision = '0' + revision
-            self.firmware = str(rs.SystemHW.FirmwareVersion) + '.' + revision
-        else:
-            self.firmware = ''
-        self.beam_angle_deg = 25
-        self.beam_pattern = 'Convex'
-        self.t_matrix = TransformationMatrix()
-        self.t_matrix.populate_data('SonTek', data_in=rs.Transformation_Matrices.Matrix)
-        self.configuration_commands = None
-
-    def nortek(self, rs):
-        self.serial_num = rs.System.SerialNumber
-        self.frequency_khz = rs.Transformation_Matrices.Frequency
-        self.model = rs.System.InstrumentModel
-        if hasattr(rs, 'SystemHW'):
-            revision = str(rs.SystemHW.FirmwareRevision)
-            if len(revision) < 2:
-                revision = '0' + revision
-            self.firmware = str(rs.SystemHW.FirmwareVersion) + '.' + revision
-        else:
-            self.firmware = ''
-        self.beam_angle_deg = 25
-        self.beam_pattern = 'Convex'
-        self.t_matrix = TransformationMatrix()
-        self.t_matrix.populate_data('SonTek', data_in=rs.Transformation_Matrices.Matrix)
-        self.configuration_commands = None
-
-    def populate_from_qrev_mat(self, transect):
-        """Populates the object using data from previously saved QRev Matlab file.
-
-        Parameters
-       ----------
-       transect: mat_struct
-           Matlab data structure obtained from sio.loadmat
-       """
-
-        self.serial_num = str(transect.adcp.serialNum)
-        self.manufacturer = transect.adcp.manufacturer
-        self.model = transect.adcp.model
-        self.firmware = transect.adcp.firmware
-        self.frequency_khz = transect.adcp.frequency_hz
-        self.beam_angle_deg = transect.adcp.beamAngle_deg
-        self.beam_pattern = transect.adcp.beamPattern
-        self.t_matrix = TransformationMatrix()
-        self.t_matrix.populate_from_qrev_mat(transect.adcp.tMatrix)
-
-        if len(transect.adcp.configurationCommands) > 0:
-            self.configuration_commands = []
-            for command in transect.adcp.configurationCommands:
-                if type(command) == str:
-                    self.configuration_commands.append(command)
-            self.configuration_commands = np.array(self.configuration_commands)
-
-        else:
-            self.configuration_commands = None
diff --git a/qrevint_22_06_22/Classes/MMT_TRDI.py b/qrevint_22_06_22/Classes/MMT_TRDI.py
deleted file mode 100644
index 10b96762aac85803040ed92dedaf3be0fa54a9d8..0000000000000000000000000000000000000000
--- a/qrevint_22_06_22/Classes/MMT_TRDI.py
+++ /dev/null
@@ -1,539 +0,0 @@
-import os
-import re
-import xmltodict
-import numpy as np
-
-
-class MMTtrdi(object):
-    """Class to read and store data from a WinRiver 2 mmt file.
-
-    Attributes
-    ----------
-    project: dict
-        Dictionary of measurement information
-    site_info: dict
-        Dictionary of site information
-    transects: list
-        List of Transect objects containing information for each discharge transect
-    summary: dict
-        Dictionary of measurement summary for each available boat velocity reference
-    qaqc: dict
-        Dictionary of premeasurement tests, calibrations, and evaluations
-    mbt_transects: list
-        List of Transect objects containing information for each moving-bed test transect
-    path: str
-        Path for mmt file and associated files
-    """
-
-    def __init__(self, mmt_file):
-        """Initialize instance variables and reads mmt file.
-
-        Parameters
-        ----------
-        mmt_file: str
-            Full filename including path of mmt file.
-        """
-
-        # Intialize instance variables
-        self.project = {}
-        self.site_info = {}
-        self.transects = []
-        self.summary = {}
-        self.qaqc = {}
-        self.mbt_transects = []
-        self.path = None
-
-        # Process mmt file
-        self.process_mmt(mmt_file)
-
-    def process_mmt(self, mmt_file):
-        """Method to read and process the mmt file.
-
-        Parameters
-        ----------
-        mmt_file: str
-            Full filename including path of mmt file.
-        """
-
-        # Open the file and convert to an ordered dictionary tree
-        with open(mmt_file, 'r', encoding='utf-8') as fd:
-            xml_data = fd.read()
-            clean_xml_data = ''
-            remove_re = re.compile(u'[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F%]')
-            for line in xml_data:
-                new_line, count = remove_re.subn('', line)
-                clean_xml_data = clean_xml_data + new_line
-
-            win_river = xmltodict.parse(clean_xml_data)
-        # UnicodeDecodeError
-        win_river = win_river['WinRiver']
-
-        self.path = os.path.split(mmt_file)[0]
-
-        # Process project settings
-        self.project['Name'] = win_river['Project']['@Name']
-        self.project['Version'] = win_river['Project']['@Version']
-        if 'Locked' in win_river['Project'].keys():
-            self.project['Locked'] = win_river['Project']['Locked']
-        else:
-            self.project['Locked'] = None
-
-        # Process site information
-        siteinfo_keys = win_river['Project']['Site_Information'].keys()
-
-        # Iterate through all of the keys and values of site info
-        for x in siteinfo_keys:
-            site_data = win_river['Project']['Site_Information'][x]
-            if site_data is not None:
-                # Remove @ symbol from properties
-                if '@' in x:
-                    x = x[1:]
-                if x == 'Water_Temperature':
-                    self.site_info[x] = float(site_data)
-                    # -32768 used to denote no data
-                    if self.site_info[x] < -100:
-                        self.site_info[x] = ''
-                else:
-                    self.site_info[x] = site_data
-            else:
-                self.site_info[x] = ''
-        if 'Transect' in win_river['Project']['Site_Discharge'].keys():
-            trans = win_river['Project']['Site_Discharge']['Transect']
-
-            # Create a Transect class for each transect found under Site_Discharge
-            if type(trans) == list:
-                for i in range(len(trans)):
-                    if 'File' in trans[i]:
-                        self.transects.append(MMTtransect(trans[i]))
-            else:
-                self.transects = [MMTtransect(trans)]
-
-            # Discharge Summary
-            if 'Discharge_Summary' in win_river['Project']['Site_Discharge'].keys():
-                discharge_summary = win_river['Project']['Site_Discharge']['Discharge_Summary']
-
-                self.summary['NONE'] = self.mmtqsum(discharge_summary['None'])
-                self.summary['BT'] = self.mmtqsum(discharge_summary['BottomTrack'])
-                self.summary['GGA'] = self.mmtqsum(discharge_summary['GGA'])
-                self.summary['VTG'] = self.mmtqsum(discharge_summary['VTG'])
-
-        # QA_QC
-        if 'QA_QC' in win_river['Project'].keys():
-            qaqc = win_river['Project']['QA_QC']
-            for qaqc_type, data in qaqc.items():
-                # Parse qaqc data from dictionary if the type is a test, cal, or eval
-                if qaqc_type in ['RG_Test', 'Compass_Calibration', 'Compass_Evaluation']:
-                    # There could be multiple tests of the same type so they are stored in a list
-                    time_stamp = qaqc_type + '_TimeStamp'
-                    if not isinstance(data['TestResult'], list):
-                        self.qaqc[qaqc_type] = [data['TestResult']['Text']]
-                        self.qaqc[time_stamp] = [data['TestResult']['TimeStamp']]
-                    else:
-                        self.qaqc[qaqc_type] = []
-                        self.qaqc[time_stamp] = []
-                        for result in data['TestResult']:
-                            self.qaqc[qaqc_type].append(result['Text'])
-                            self.qaqc[time_stamp].append(result['TimeStamp'])
-
-                if qaqc_type == 'Moving_Bed_Test':
-                    if 'Transect' in data.keys():
-                        self.moving_bed_test(data)
-
-    def moving_bed_test(self, mb_data):
-        """Method to parse data from moving-bed test dictionary.
-
-        Parameters
-        ----------
-        mb_data: dict
-            Dictionary containing moving-bed test information
-        """
-
-        transects = mb_data['Transect']
-
-        # If only one transect make it a list
-        if not isinstance(transects, list):
-            transects = [transects]
-
-        # Process each transect dictionary
-        for tsect in transects:
-            transect = MMTtransect(tsect)
-
-            # Determine type of moving-bed test
-            if '@MBTType' in tsect:
-                if tsect['@MBTType'] == '0':
-                    transect.moving_bed_type = 'Loop'
-                elif tsect['@MBTType'] == '1':
-                    transect.moving_bed_type = 'Stationary'
-            else:
-                # Use the file name to determine the moving-bed test type
-                file_name = transect.Files[0]
-                fidx = file_name.rfind('.')
-                if file_name[fidx-3:fidx] == 'SBT':
-                    transect.moving_bed_type = 'Stationary'
-                elif file_name[fidx-3:fidx] == 'LBT':
-                    transect.moving_bed_type = 'Loop'
-                else:
-                    # If type can't be determined process as stationary
-                    transect.moving_bed_type = 'Stationary'
-
-            self.mbt_transects.append(transect)
-
-    @staticmethod
-    def mmtqsum(data):
-        """Method to parse the MMT Q summary data.
-
-        Parameters
-        ----------
-        data: dict
-            A summary dictionary from mmt file.
-
-        Returns
-        -------
-        sum_dict: dict
-            Dictionary of summary with a couple of key names changed.
-        """
-        
-        sum_dict = {
-            'Use': [],
-            'Begin_Left': [],
-            'FileName': [],
-            'LeftEdgeSlopeCoeff': [],
-            'RightEdgeSlopeCoeff': []
-            }
-
-        # Iterate through each transect
-        for transect in data.values():
-            # Iterate through each key and val in the transect summary
-            for key2, val2 in transect.items():
-                # Append value from transect to appropriate key
-                if key2 == 'UseInSummary':
-                    sum_dict['Use'].append(float(val2))
-                elif key2 == "BeginLeft":
-                    sum_dict['Begin_Left'].append(float(val2))
-                elif key2 == 'FileName':
-                    sum_dict['FileName'].append(val2)
-                elif key2 == 'LeftEdgeSlopeCoeff':
-                    sum_dict['LeftEdgeSlopeCoeff'].append(float(val2))
-                elif key2 == 'RightEdgeSlopeCoeff':
-                    sum_dict['RightEdgeSlopeCoeff'].append(float(val2))
-                else:
-                    # If the key has not been specified use key from transect summary
-                    if key2 not in sum_dict:
-                        sum_dict[key2] = []
-                    try:
-                        sum_dict[key2].append(float(val2))
-                    except ValueError:
-                        sum_dict[key2].append(np.nan)
-        return sum_dict
-
-
-class MMTtransect(object):
-    """Class to hold properties of MMT transect dictionary attributes.
-
-    Attributes
-    ----------
-    Checked: int
-    Files: list
-    Notes: list
-    """
-
-    def __init__(self, trans):
-        """Constructor immediately begins extraction of data"""
-
-        self.Checked = int(trans['@Checked'])
-        self.Files = []
-        self.Notes = []
-        self.field_config = None
-        self.active_config = None
-        self.moving_bed_type = None
-
-        files = trans['File']
-
-        # Create File classes for each file associated with transect
-        if type(files) is list:
-            for file in files:
-                self.Files.append(file['#text'])
-        else:
-            self.Files.append(files['#text'])
-
-        # Create Note classes for each file associated with transect
-        if 'Note' in trans.keys():
-            note = trans['Note']
-            if type(note) is list:
-                for n in note:
-                    if type(trans['File']) is list:
-                        self.Notes.append(self.note_dict(n, trans['File'][0]['@TransectNmb']))
-                    else:
-                        self.Notes.append(self.note_dict(n, trans['File']['@TransectNmb']))
-            else:
-                if type(trans['File']) is list:
-                    self.Notes.append(self.note_dict(note, trans['File'][0]['@TransectNmb']))
-                else:
-                    self.Notes.append(self.note_dict(note, trans['File']['@TransectNmb']))
-
-        # Create configuration dictionaries for each config attribute
-        if type(trans['Configuration']) is list:
-            for config in trans['Configuration']:
-                if int(config['@Checked']) == 0:
-                    self.field_config = self.parse_config(config)
-                if int(config['@Checked']) == 1:
-                    self.active_config = self.parse_config(config)
-        else:
-            if int(trans['Configuration']['@Checked']) == 0:
-                self.field_config = self.parse_config(trans['Configuration'])
-            if int(trans['Configuration']['@Checked']) == 1:
-                self.active_config = self.parse_config(trans['Configuration'])
-
-        # Assign active config to field config if there is no field config
-        if self.field_config is None:
-            self.field_config = self.active_config
-
-    def set_moving_bed_type(self, mvb_type):
-        """Setter for moving bed type in the case of MBT Transects
-
-        Parameters
-        ----------
-        mvb_type: str
-            Type of moving-bed test.
-        """
-
-        self.moving_bed_type = mvb_type
-
-    @staticmethod
-    def parse_config(config):
-        """Method to parse configuration file from mmt xml.
-
-        Parameters
-        ----------
-        config: dict
-            Dictionary of configuration settings
-
-        Returns
-        -------
-        config_dict: dict
-            Processed dictionary of configuration settings
-        """
-
-        # Initialize dictionary for configuration
-        config_dict = {}
-
-        # Store all instrument commands
-        command_groups = config['Commands']
-        for group in command_groups.keys():
-            config_dict[group] = []
-            for key, command in command_groups[group].items():
-                if key != '@Status':
-                    config_dict[group].append(command)
-
-        # Depth sounder configuration
-        if 'Use_Depth_Sounder_In_Processing' in config['Depth_Sounder'].keys():
-            if config['Depth_Sounder']['Use_Depth_Sounder_In_Processing']['#text'] == "YES":
-                config_dict['DS_Use_Process'] = 1
-            else:
-                config_dict['DS_Use_Process'] = 0
-        else:
-            config_dict['DS_Use_Process'] = -1
-
-        config_dict['DS_Transducer_Depth'] = float(config['Depth_Sounder']['Depth_Sounder_Transducer_Depth']['#text'])
-        config_dict['DS_Transducer_Offset'] = float(config['Depth_Sounder']['Depth_Sounder_Transducer_Offset']['#text'])
-
-        if config['Depth_Sounder']['Depth_Sounder_Correct_Speed_of_Sound']['#text'] == 'YES':
-            config_dict['DS_Cor_Spd_Sound'] = 1
-        else:
-            config_dict['DS_Cor_Spd_Sound'] = 0
-
-        config_dict['DS_Scale_Factor'] = float(config['Depth_Sounder']['Depth_Sounder_Scale_Factor']['#text'])
-
-        # External heading configuration
-        config_dict['Ext_Heading_Offset'] = float(config['Ext_Heading']['Offset']['#text'])
-
-        if 'Use_Ext_Heading' in config['Ext_Heading'].keys():
-            if config['Ext_Heading']['Use_Ext_Heading']['#text'] == 'NO':
-                config_dict['Ext_Heading_Use'] = False
-            else:
-                config_dict['Ext_Heading_Use'] = True
-        else:
-            config_dict['Ext_Heading_Use'] = False
-
-        # GPS configuration
-        if 'GPS' in config.keys():
-            config_dict['GPS_Time_Delay'] = config['GPS']['Time_Delay']['#text']
-
-        # Discharge settings
-        config_dict['Q_Top_Method'] = float(config['Discharge']['Top_Discharge_Estimate']['#text'])
-        config_dict['Q_Bottom_Method'] = float(config['Discharge']['Bottom_Discharge_Estimate']['#text'])
-        config_dict['Q_Power_Curve_Coeff'] = float(config['Discharge']['Power_Curve_Coef']['#text'])
-        config_dict['Q_Cut_Top_Bins'] = float(config['Discharge']['Cut_Top_Bins']['#text'])
-        config_dict['Q_Bins_Above_Sidelobe'] = float(config['Discharge']['Cut_Bins_Above_Sidelobe']['#text'])
-        config_dict['Q_Left_Edge_Type'] = float(config['Discharge']['River_Left_Edge_Type']['#text'])
-        config_dict['Q_Left_Edge_Coeff'] = float(config['Discharge']['Left_Edge_Slope_Coeff']['#text'])
-        config_dict['Q_Right_Edge_Type'] = float(config['Discharge']['River_Right_Edge_Type']['#text'])
-        config_dict['Q_Right_Edge_Coeff'] = float(config['Discharge']['Right_Edge_Slope_Coeff']['#text'])
-        config_dict['Q_Shore_Pings_Avg'] = float(config['Discharge']['Shore_Pings_Avg']['#text'])
-
-        # Edge estimate settings
-        config_dict['Edge_Begin_Shore_Distance'] = config['Edge_Estimates']['Begin_Shore_Distance']['#text']
-        config_dict['Edge_End_Shore_Distance'] = float(config['Edge_Estimates']['End_Shore_Distance']['#text'])
-        if config['Edge_Estimates']['Begin_Left_Bank']['#text'] == 'YES':
-            config_dict['Edge_Begin_Left_Bank'] = 1
-        else:
-            config_dict['Edge_Begin_Left_Bank'] = 0
-
-        # Check for user discharge feature in mmt file
-        if 'Begin_Manual_Discharge' in config['Edge_Estimates']:
-            config_dict['Edge_Begin_Manual_Discharge'] = float(config['Edge_Estimates']['Begin_Manual_Discharge']['#text'])
-            config_dict['Edge_Begin_Method_Distance'] = \
-                config['Edge_Estimates']['Begin_Edge_Discharge_Method_Distance']['#text']
-            config_dict['Edge_End_Manual_Discharge'] = float(config['Edge_Estimates']['End_Manual_Discharge']['#text'])
-            config_dict['Edge_End_Method_Distance'] = \
-                config['Edge_Estimates']['End_Edge_Discharge_Method_Distance']['#text']
-
-        # Offsets
-        for key in config['Offsets'].keys():
-            if key == 'ADCP_Transducer_Depth':
-                child = "Offsets_Transducer_Depth"
-            else:
-                child = "Offsets_" + key
-
-            config_dict[child] = float(config['Offsets'][key]['#text'])
-
-        # Processing settings
-        for key in config['Processing'].keys():
-            if key == 'Use_3_Beam_Solution_For_BT':
-                child = 'Proc_Use_3_Beam_BT'
-            elif key == 'Use_3_Beam_Solution_For_WT':
-                child = 'Proc_Use_3_Beam_WT'
-            elif key == 'BT_Error_Velocity_Threshold':
-                child = 'Proc_BT_Error_Vel_Threshold'
-            elif key == 'WT_Error_Velocity_Threshold':
-                child = 'Proc_WT_Error_Velocity_Threshold'
-            elif key == 'BT_Up_Velocity_Threshold':
-                child = 'Proc_BT_Up_Vel_Threshold'
-            elif key == 'WT_Up_Velocity_Threshold':
-                child = 'Proc_WT_Up_Vel_Threshold'
-            elif key == 'Fixed_Speed_Of_Sound':
-                child = 'Proc_Fixed_Speed_Of_Sound'
-            elif key == 'Mark_Below_Bottom_Bad':
-                child = 'Proc_Mark_Below_Bottom_Bad'
-            elif key == 'Use_Weighted_Mean':
-                child = 'Proc_Use_Weighted_Mean'
-            elif key == 'Absorption':
-                child = 'Proc_Absorption'
-            else:
-                child = 'Proc_' + key
-
-            # Try to cast to float otherwise assign 1 or 0 based on string value
-            try:
-                config_dict[child] = float(config['Processing'][key]['#text'])
-            except ValueError:
-                if config['Processing'][key]['#text'] == 'YES':
-                    config_dict[child] = 1
-                else:
-                    config_dict[child] = 0
-
-            # Recording
-            config_dict['Rec_Filename_Prefix'] = config['Recording']['Filename_Prefix']['#text']
-            config_dict['Rec_Output_Directory'] = config['Recording']['Output_Directory']['#text']
-
-            if 'Root_Directory' in config['Recording'].keys():
-                if '#text' in config['Recording']['Root_Directory']:
-                    config_dict['Rec_Root_Directory'] = config['Recording']['Root_Directory']['#text']
-                else:
-                    config_dict['Rec_Root_Directory'] = None
-            else:
-                config_dict['Rec_Root_Directory'] = None
-
-            if config['Recording']['MeasurmentNmb'] is None:
-                config_dict['Rec_MeasNmb'] = config['Recording']['MeasurmentNmb']
-            else:
-                config_dict['Rec_MeasNmb'] = config['Recording']['MeasurmentNmb']
-            config_dict['Rec_GPS'] = config['Recording']['GPS_Recording']['#text']
-            config_dict['Rec_DS'] = config['Recording']['DS_Recording']['#text']
-            config_dict['Rec_EH'] = config['Recording']['EH_Recording']['#text']
-            config_dict['Rec_ASCII_Output'] = config['Recording']['ASCII_Output_Recording']['#text']
-            config_dict['Rec_Max_File_Size'] = float(config['Recording']['Maximum_File_Size']['#text'])
-            config_dict['Rec_Next_Transect_Number'] = float(config['Recording']['Next_Transect_Number']['#text'])
-            config_dict['Rec_Add_Date_Time'] = float(config['Recording']['Add_Date_Time']['#text'])
-            config_dict['Rec_Use_Delimiter'] = config['Recording']['Use_Delimiter']['#text']
-            config_dict['Rec_Delimiter'] = config['Recording']['Custom_Delimiter']['#text']
-            config_dict['Rec_Prefix'] = config['Recording']['Use_Prefix']['#text']
-            config_dict['Rec_Use_MeasNmb'] = config['Recording']['Use_MeasurementNmb']['#text']
-            config_dict['Rec_Use_TransectNmb'] = config['Recording']['Use_TransectNmb']['#text']
-            config_dict['Rec_Use_SequenceNmb'] = config['Recording']['Use_SequenceNmb']['#text']
-
-            # Wizard settings
-            config_dict['Wiz_ADCP_Type'] = float(config['Wizard_Info']['ADCP_Type'])
-            config_dict['Wiz_Firmware'] = float(config['Wizard_Info']['ADCP_FW_Version'])
-            config_dict['Wiz_Use_Ext_Heading'] = config['Wizard_Info']['Use_Ext_Heading']
-            config_dict['Wiz_Use_GPS'] = config['Wizard_Info']['Use_GPS']
-            config_dict['Wiz_Use_DS'] = config['Wizard_Info']['Use_Depth_Sounder']
-            config_dict['Wiz_Max_Water_Depth'] = float(config['Wizard_Info']['Max_Water_Depth'])
-            config_dict['Wiz_Max_Water_Speed'] = float(config['Wizard_Info']['Max_Water_Speed'])
-            config_dict['Wiz_Max_Boat_Space'] = float(config['Wizard_Info']['Max_Boat_Speed'])
-            config_dict['Wiz_Material'] = float(config['Wizard_Info']['Material'])
-            config_dict['Wiz_Water_Mode'] = float(config['Wizard_Info']['Water_Mode'])
-            config_dict['Wiz_Bottom_Mode'] = float(config['Wizard_Info']['Bottom_Mode'])
-            config_dict['Wiz_Beam_Angle'] = float(config['Wizard_Info']['Beam_Angle'])
-            config_dict['Wiz_Pressure_Sensor'] = config['Wizard_Info']['Pressure_Sensor']
-            config_dict['Wiz_Water_Mode_13'] = float(config['Wizard_Info']['Water_Mode_13_Avail'])
-            config_dict['Wiz_StreamPro_Default'] = float(config['Wizard_Info']['Use_StreamPro_Def_Cfg'])
-            config_dict['Wiz_StreamPro_Bin_Size'] = float(config['Wizard_Info']['StreamPro_Bin_Size'])
-            config_dict['Wiz_StreamPro_Bin_Number'] = float(config['Wizard_Info']['StreamPro_Bin_Num'])
-
-            if 'Use_GPS_Internal' in config['Wizard_Info'].keys():
-                config_dict['Wiz_Use_GPS_Internal'] = config['Wizard_Info']['Use_GPS_Internal']
-            if 'Internal_GPS_Baud_Rate_Index' in config['Wizard_Info'].keys():
-                config_dict['Wiz_Internal_GPS_Baud_Rate_Index'] = float(config['Wizard_Info']
-                                                                        ['Internal_GPS_Baud_Rate_Index'])
-
-        return config_dict
-
-    @staticmethod
-    def file_dict(file):
-        """Create dictionary for file information.
-
-        Parameters
-        ----------
-        file: dict
-            Dictionary for file from mmt
-
-        Returns
-        -------
-        transect_file: dict
-            Dictionary of transect file information
-                Path: str
-                    Full filename of transect including path
-                File: str
-                    Filename of transect
-                Number: str
-                    Transect number assigned in WinRiver 2
-        """
-
-        transect_file = {'Path': file['@PathName'], 'File': file['#text'], 'Number': file['@TransectNmb']}
-        return transect_file
-
-    @staticmethod
-    def note_dict(note, number):
-        """Create dictionary for notes.
-
-        Parameters
-        ----------
-        note: dict
-            Dictionary from mmt for notes
-        number: str
-            Transect number
-
-        Returns
-        -------
-        note_dict_out: dict
-            Dictionary for note information
-                NoteFileNo: str
-                    Transect number associated with the note
-                NoteDate: str
-                    Date note was entered
-                NoteText: str
-                    Text of note
-        """
-
-        note_dict_out = {'NoteFileNo': number, 'NoteDate': note['@TimeStamp'], 'NoteText': note['@Text']}
-        return note_dict_out
diff --git a/qrevint_22_06_22/Classes/Measurement.py b/qrevint_22_06_22/Classes/Measurement.py
deleted file mode 100644
index ebcba8f2eabe7bf7f1527288e2c451be60919784..0000000000000000000000000000000000000000
--- a/qrevint_22_06_22/Classes/Measurement.py
+++ /dev/null
@@ -1,3961 +0,0 @@
-import os
-import datetime
-import numpy as np
-import xml.etree.ElementTree as ETree
-from xml.dom.minidom import parseString
-from Classes.MMT_TRDI import MMTtrdi
-from Classes.TransectData import TransectData
-from Classes.PreMeasurement import PreMeasurement
-from Classes.MovingBedTests import MovingBedTests
-from Classes.QComp import QComp
-from Classes.MatSonTek import MatSonTek
-from Classes.ComputeExtrap import ComputeExtrap
-from Classes.ExtrapQSensitivity import ExtrapQSensitivity
-from Classes.Uncertainty import Uncertainty
-from Classes.QAData import QAData
-from Classes.BoatStructure import BoatStructure
-from Classes.BoatData import BoatData
-from Classes.WaterData import WaterData
-from Classes.Oursin import Oursin
-from Classes.Pd0TRDI_2 import Pd0TRDI
-from MiscLibs.common_functions import cart2pol, pol2cart, rad2azdeg, nans, azdeg2rad
-# from profilehooks import profile, timecall
-
-
-class Measurement(object):
-    """Class to hold all measurement details.
-
-    Attributes
-    ----------
-    station_name: str
-        Station name
-    station_number: str
-        Station number
-    meas_number: str
-        Measurement number
-    persons: str
-        Persons collecting and/or processing the measurement
-    transects: list
-        List of transect objects of TransectData
-    mb_tests: list
-        List of moving-bed test objects of MovingBedTests
-    system_tst: list
-        List of system test objects of PreMeasurement
-    compass_cal: list
-        List of compass calibration objects of PreMeasurement
-    compass_eval: list
-        List of compass evaluation objects of PreMeasurement
-    extrap_fit: ComputeExtrap
-        Object of ComputeExtrap
-    processing: str
-        Type of processing, default QRev
-    discharge: list
-        List of discharge objects of QComp
-    uncertainty: Uncertainty
-        Object of Uncertainty
-    initial_settings: dict
-        Dictionary of all initial processing settings
-    qa: QAData
-        Object of QAData
-    user_rating: str
-        Optional user rating
-    comments: list
-        List of all user supplied comments
-    ext_temp_chk: dict
-        Dictionary of external temperature readings
-    use_weighted: bool
-        Indicates the setting for use_weighted to be used for reprocessing
-    use_ping_type: bool
-        Indicates if ping types should be used in BT and WT filters
-    use_measurement_thresholds: bool
-        Indicates if the entire measurement should be used to set filter thresholds
-    stage_start_m: float
-        Stage at start of measurement
-    stage_end_m: float
-        Stage at end of measurement
-    stage_meas_m: float
-        Stage assigned to measurement
-    """
-
-    # @profile
-    def __init__(self, in_file, source, proc_type='QRev', checked=False, run_oursin=False, use_weighted=False,
-                 use_measurement_thresholds=False, use_ping_type=True, min_transects=2, min_duration=720):
-        """Initialize instance variables and initiate processing of measurement
-        data.
-
-        Parameters
-        ----------
-        in_file: str or list or dict
-            String containing fullname of mmt file for TRDI data, dict for
-            QRev data, or list of files for SonTek
-        source: str
-            Source of data. TRDI, SonTek, QRev
-        proc_type: str
-            Type of processing. QRev, None, Original
-        checked: bool
-            Boolean to determine if only checked transects should be load for
-            TRDI data.
-        run_oursin: bool
-            Determines if the Oursin uncertainty model should be run
-        use_weighted: bool
-            Specifies if discharge weighted medians are used for extrapolation
-        use_measurement_thresholds: bool
-            Specifies if filters are based on a transect or whole measurement
-        use_ping_type: bool
-            Specifies if filters are based on ping type and frequency
-        min_transects: int
-            Minimum number of transects required to pass QA
-        min_duration: float
-            Minimum duration in seconds of all transects to pass QA
-        """
-
-        self.use_ping_type = use_ping_type
-        self.use_measurement_thresholds = use_measurement_thresholds
-        self.run_oursin = run_oursin
-        self.min_transects = min_transects
-        self.min_duration = min_duration
-        self.station_name = None
-        self.station_number = None
-        self.persons = ''
-        self.meas_number = ''
-        self.transects = []
-        self.mb_tests = []
-        self.system_tst = []
-        self.compass_cal = []
-        self.compass_eval = []
-        self.extrap_fit = None
-        self.processing = None
-        self.discharge = []
-        self.uncertainty = None
-        self.initial_settings = None
-        self.qa = None
-        self.user_rating = 'Not Rated'
-        self.comments = []
-        self.ext_temp_chk = {'user': np.nan, 'units': 'C', 'adcp': np.nan, 'user_orig': np.nan, 'adcp_orig': np.nan}
-        self.checked_transect_idx = []
-        self.oursin = None
-        self.use_weighted = use_weighted
-        self.observed_no_moving_bed = False
-        self.stage_meas_m = 0
-        self.stage_end_m = 0
-        self.stage_start_m = 0
-
-        # Load data from selected source
-        if source == 'QRev':
-            self.load_qrev_mat(mat_data=in_file)
-            if proc_type == 'QRev':
-                # Apply QRev default settings
-                self.run_oursin = run_oursin
-                self.use_weighted = use_weighted
-                self.use_measurement_thresholds = use_measurement_thresholds
-                settings = self.current_settings()
-                settings['WTEnsInterpolation'] = 'abba'
-                settings['WTCellInterpolation'] = 'abba'
-                settings['Processing'] = 'QRev'
-                settings['UseMeasurementThresholds'] = use_measurement_thresholds
-                self.apply_settings(settings)
-
-        else:
-            if source == 'TRDI':
-                self.load_trdi(in_file, checked=checked)
-
-            elif source == 'SonTek':
-                self.load_sontek(in_file)
-
-            elif source == 'Nortek':
-                self.load_sontek(in_file)
-
-            # Process data
-            if len(self.transects) > 0:
-
-                # Save initial settings
-                self.initial_settings = self.current_settings()
-
-                # Process moving-bed tests
-                if len(self.mb_tests) > 0:
-                    # Get navigation reference
-                    select = self.initial_settings['NavRef']
-                    ref = None
-                    if select == 'bt_vel':
-                        ref = 'BT'
-                    elif select == 'gga_vel':
-                        ref = 'GGA'
-                    elif select == 'vtg_vel':
-                        ref = 'VTG'
-                    self.mb_tests = MovingBedTests.auto_use_2_correct(
-                        moving_bed_tests=self.mb_tests, boat_ref=ref)
-
-                # Set processing type
-                if proc_type == 'QRev':
-                    # Apply QRev default settings
-                    settings = self.qrev_default_settings(check_user_excluded_dist=True, use_weighted=use_weighted)
-                    settings['Processing'] = 'QRev'
-                    settings['UseMeasurementThresholds'] = use_measurement_thresholds
-                    settings['UsePingType'] = self.use_ping_type
-                    self.apply_settings(settings)
-
-                elif proc_type == 'None':
-                    # Processing with no filters and interpolation
-                    settings = self.no_filter_interp_settings(self)
-                    settings['Processing'] = 'None'
-                    self.apply_settings(settings)
-
-                elif proc_type == 'Original':
-                    # Processing for original settings
-                    # from manufacturer software
-                    for transect in self.transects:
-                        q = QComp()
-                        q.populate_data(data_in=transect,
-                                        moving_bed_data=self.mb_tests)
-                        self.discharge.append(q)
-                self.uncertainty = Uncertainty()
-                self.uncertainty.compute_uncertainty(self)
-
-                self.qa = QAData(self)
-
-    def load_trdi(self, mmt_file, transect_type='Q', checked=False):
-        """Method to load TRDI data.
-
-        Parameters
-        ----------
-        mmt_file: str
-            Full pathname to mmt file.
-        transect_type: str
-            Type of data (Q: discharge, MB: moving-bed test
-        checked: bool
-            Determines if all files are loaded (False) or only checked (True)
-        """
-
-        # Read mmt file
-        mmt = MMTtrdi(mmt_file)
-
-        # Get properties if they exist, otherwise set them as blank strings
-        self.station_name = str(mmt.site_info['Name'])
-        self.station_number = str(mmt.site_info['Number'])
-        self.persons = str(mmt.site_info['Party'])
-        self.meas_number = str(mmt.site_info['MeasurementNmb'])
-
-        # Get stage readings, if available. Note: mmt stage is always in m.
-        if mmt.site_info['Use_Inside_Gage_Height'] == '1':
-            stage = float(mmt.site_info['Inside_Gage_Height'])
-        else:
-            stage = float(mmt.site_info['Outside_Gage_Height'])
-
-        self.stage_start_m = stage
-        change = float(mmt.site_info['Gage_Height_Change'])
-        self.stage_end_m = stage + change
-        self.stage_meas_m = (self.stage_start_m + self.stage_end_m) / 2.
-
-        # Initialize processing variable
-        self.processing = 'WR2'
-
-        if len(mmt.transects) > 0:
-            # Create transect objects for  TRDI data
-            self.transects = self.allocate_transects(mmt=mmt,
-                                                     transect_type=transect_type,
-                                                     checked=checked)
-
-            self.checked_transect_idx = self.checked_transects(self)
-
-            # Create object for pre-measurement tests
-            if isinstance(mmt.qaqc, dict) or isinstance(mmt.mbt_transects, list):
-                self.qaqc_trdi(mmt)
-
-            # Save comments from mmt file in comments
-            self.comments.append('MMT Remarks: ' + mmt.site_info['Remarks'])
-
-            for t in range(len(self.transects)):
-                notes = getattr(mmt.transects[t], 'Notes')
-                for note in notes:
-                    note_text = ' File: ' + note['NoteFileNo'] + ' ' \
-                                + note['NoteDate'] + ': ' + note['NoteText']
-                    self.comments.append(note_text)
-
-            # Get external temperature
-            if type(mmt.site_info['Water_Temperature']) is float:
-                self.ext_temp_chk['user'] = mmt.site_info['Water_Temperature']
-                self.ext_temp_chk['units'] = 'C'
-                self.ext_temp_chk['user_orig'] = mmt.site_info['Water_Temperature']
-
-            # Initialize thresholds settings dictionary
-            threshold_settings = dict()
-            threshold_settings['wt_settings'] = {}
-            threshold_settings['bt_settings'] = {}
-            threshold_settings['depth_settings'] = {}
-
-            # Select reference transect use first checked or if none then first transect
-            if len(self.checked_transect_idx) > 0:
-                ref_transect = self.checked_transect_idx[0]
-            else:
-                ref_transect = 0
-
-            # Water track filter threshold settings
-            threshold_settings['wt_settings']['beam'] = \
-                self.set_num_beam_wt_threshold_trdi(mmt.transects[ref_transect])
-            threshold_settings['wt_settings']['difference'] = 'Manual'
-            threshold_settings['wt_settings']['difference_threshold'] = \
-                mmt.transects[ref_transect].active_config['Proc_WT_Error_Velocity_Threshold']
-            threshold_settings['wt_settings']['vertical'] = 'Manual'
-            threshold_settings['wt_settings']['vertical_threshold'] = \
-                mmt.transects[ref_transect].active_config['Proc_WT_Up_Vel_Threshold']
-
-            # Bottom track filter threshold settings
-            threshold_settings['bt_settings']['beam'] = \
-                self.set_num_beam_bt_threshold_trdi(mmt.transects[ref_transect])
-            threshold_settings['bt_settings']['difference'] = 'Manual'
-            threshold_settings['bt_settings']['difference_threshold'] = \
-                mmt.transects[ref_transect].active_config['Proc_BT_Error_Vel_Threshold']
-            threshold_settings['bt_settings']['vertical'] = 'Manual'
-            threshold_settings['bt_settings']['vertical_threshold'] = \
-                mmt.transects[ref_transect].active_config['Proc_BT_Up_Vel_Threshold']
-
-            # Depth filter and averaging settings
-            threshold_settings['depth_settings']['depth_weighting'] = \
-                self.set_depth_weighting_trdi(mmt.transects[ref_transect])
-            threshold_settings['depth_settings']['depth_valid_method'] = 'TRDI'
-            threshold_settings['depth_settings']['depth_screening'] = \
-                self.set_depth_screening_trdi(mmt.transects[ref_transect])
-
-            # Determine reference used in WR2 if available
-            reference = 'BT'
-            if 'Reference' in mmt.site_info.keys():
-                reference = mmt.site_info['Reference']
-                if reference == 'BT':
-                    target = 'bt_vel'
-                elif reference == 'GGA':
-                    target = 'gga_vel'
-                elif reference == 'VTG':
-                    target = 'vtg_vel'
-                else:
-                    target = 'bt_vel'
-
-                for transect in self.transects:
-                    if getattr(transect.boat_vel, target) is None:
-                        reference = 'BT'
-
-            # Convert to earth coordinates
-            for transect_idx, transect in enumerate(self.transects):
-                # Convert to earth coordinates
-                transect.change_coord_sys(new_coord_sys='Earth')
-
-                # Set navigation reference
-                transect.change_nav_reference(update=False, new_nav_ref=reference)
-
-                # Apply WR2 thresholds
-                self.thresholds_trdi(transect, threshold_settings)
-
-                # Apply boat interpolations
-                transect.boat_interpolations(update=False,
-                                             target='BT',
-                                             method='None')
-                if transect.gps is not None:
-                    transect.boat_interpolations(update=False,
-                                                 target='GPS',
-                                                 method='HoldLast')
-
-                # Update water data for changes in boat velocity
-                transect.update_water()
-
-                # Filter water data
-                transect.w_vel.apply_filter(transect=transect, wt_depth=True)
-
-                # Interpolate water data
-                transect.w_vel.apply_interpolation(transect=transect,
-                                                   ens_interp='None',
-                                                   cells_interp='None')
-
-                # Apply speed of sound computations as required
-                mmt_sos_method = mmt.transects[transect_idx].active_config[
-                    'Proc_Speed_of_Sound_Correction']
-
-                # Speed of sound computed based on user supplied values
-                if mmt_sos_method == 1:
-                    salinity = mmt.transects[transect_idx].active_config['Proc_Salinity']
-                    transect.change_sos(parameter='salinity', selected='user', salinity=salinity)
-                elif mmt_sos_method == 2:
-                    # Speed of sound set by user
-                    speed = mmt.transects[transect_idx].active_config[
-                        'Proc_Fixed_Speed_Of_Sound']
-                    transect.change_sos(parameter='sosSrc',
-                                        selected='user',
-                                        speed=speed)
-
-    def qaqc_trdi(self, mmt):
-        """Processes qaqc test, calibrations, and evaluations
-        
-        Parameters
-        ----------
-        mmt: MMTtrdi
-            Object of MMT_TRDI
-        """
-
-        # ADCP Test
-        if 'RG_Test' in mmt.qaqc:
-            for n in range(len(mmt.qaqc['RG_Test'])):
-                p_m = PreMeasurement()
-                p_m.populate_data(mmt.qaqc['RG_Test_TimeStamp'][n],
-                                  mmt.qaqc['RG_Test'][n], 'TST')
-                self.system_tst.append(p_m)
-
-        # Compass calibration
-        if 'Compass_Calibration' in mmt.qaqc:
-            for n in range(len(mmt.qaqc['Compass_Calibration'])):
-                cc = PreMeasurement()
-                cc.populate_data(mmt.qaqc['Compass_Calibration_TimeStamp'][n],
-                                 mmt.qaqc['Compass_Calibration'][n], 'TCC')
-                self.compass_cal.append(cc)
-            
-        # Compass evaluation
-        if 'Compass_Evaluation' in mmt.qaqc:
-            for n in range(len(mmt.qaqc['Compass_Evaluation'])):
-                ce = PreMeasurement()
-                ce.populate_data(mmt.qaqc['Compass_Evaluation_TimeStamp'][n],
-                                 mmt.qaqc['Compass_Evaluation'][n], 'TCC')
-                self.compass_eval.append(ce)
-
-        # Check for moving-bed tests
-        if len(mmt.mbt_transects) > 0:
-            
-            # Create transect objects
-            transects = self.allocate_transects(mmt, transect_type='MB')
-
-            # Process moving-bed tests
-            if len(transects) > 0:
-                self.mb_tests = []
-                for n in range(len(transects)):
-
-                    # Create moving-bed test object
-                    mb_test = MovingBedTests()
-                    mb_test.populate_data('TRDI', transects[n],
-                                          mmt.mbt_transects[n].moving_bed_type)
-                    
-                    # Save notes from mmt files in comments
-                    notes = getattr(mmt.mbt_transects[n], 'Notes')
-                    for note in notes:
-                        note_text = ' File: ' + note['NoteFileNo'] + ' ' \
-                                    + note['NoteDate'] + ': ' + note['NoteText']
-                        self.comments.append(note_text)
-
-                    self.mb_tests.append(mb_test)
-
-    @staticmethod
-    def thresholds_trdi(transect, settings):
-        """Retrieve and apply manual filter settings from mmt file
-
-        Parameters
-        ----------
-        transect: TransectData
-            Object of TransectData
-        settings: dict
-            Threshold settings computed before processing
-        """
-
-        # Apply WT settings
-        transect.w_vel.apply_filter(transect, **settings['wt_settings'])
-
-        # Apply BT settings
-        transect.boat_vel.bt_vel.apply_filter(transect, **settings[
-            'bt_settings'])
-
-        # Apply depth settings
-        transect.depths.bt_depths.valid_data_method = settings[
-            'depth_settings']['depth_valid_method']
-        transect.depths.depth_filter(transect=transect, filter_method=settings[
-            'depth_settings']['depth_screening'])
-        transect.depths.bt_depths.compute_avg_bt_depth(method=settings[
-            'depth_settings']['depth_weighting'])
-
-        # Apply composite depths as per setting stored in transect
-        # from TransectData
-        transect.depths.composite_depths(transect)
-
-    def load_sontek(self, fullnames):
-        """Coordinates reading of all SonTek data files.
-
-        Parameters
-        ----------
-        fullnames: list
-            File names including path for all discharge transects converted
-            to Matlab files.
-        """
-
-        # Initialize variables
-        rsdata = None
-        pathname = None
-
-        for file in fullnames:
-            # Read data file
-            rsdata = MatSonTek(file)
-            pathname, file_name = os.path.split(file)
-
-            if hasattr(rsdata, 'BottomTrack'):
-                # Create transect objects for each discharge transect
-                self.transects.append(TransectData())
-                self.transects[-1].sontek(rsdata, file_name)
-            else:
-                self.comments.append(file + ' is incomplete and is not included in measurement processing')
-
-        # Identify checked transects
-        self.checked_transect_idx = self.checked_transects(self)
-
-        # Site information pulled from last file
-        if hasattr(rsdata, 'SiteInfo'):
-            if hasattr(rsdata.SiteInfo, 'Site_Name'):
-                if len(rsdata.SiteInfo.Site_Name) > 0:
-                    self.station_name = rsdata.SiteInfo.Site_Name
-                else:
-                    self.station_name = ''
-            if hasattr(rsdata.SiteInfo, 'Station_Number'):
-                if len(rsdata.SiteInfo.Station_Number) > 0:
-                    self.station_number = rsdata.SiteInfo.Station_Number
-                else:
-                    self.station_number = ''
-            if hasattr(rsdata.SiteInfo, 'Meas_Number'):
-                if len(rsdata.SiteInfo.Meas_Number) > 0:
-                    self.meas_number = rsdata.SiteInfo.Meas_Number
-            if hasattr(rsdata.SiteInfo, 'Party'):
-                if len(rsdata.SiteInfo.Party) > 0:
-                    self.persons = rsdata.SiteInfo.Party
-
-            if hasattr(rsdata.SiteInfo, 'Comments'):
-                if len(rsdata.SiteInfo.Comments) > 0:
-                    self.comments.append('RS Comments: ' + rsdata.SiteInfo.Comments)
-
-            # Although units imply meters the data are actually stored as m / 10,000
-            if hasattr(rsdata.Setup, 'startGaugeHeight'):
-                self.stage_start_m = rsdata.Setup.startGaugeHeight / 10000.
-
-            if hasattr(rsdata.Setup, 'endGaugeHeight'):
-                self.stage_end_m = rsdata.Setup.endGaugeHeight / 10000.
-
-            self.stage_meas_m = (self.stage_start_m + self.stage_end_m) / 2.
-
-
-        self.qaqc_sontek(pathname)
-
-        for transect in self.transects:
-            transect.change_coord_sys(new_coord_sys='Earth')
-            transect.change_nav_reference(
-                update=False,
-                new_nav_ref=self.transects[self.checked_transect_idx[0]].boat_vel.selected)
-            transect.boat_interpolations(update=False,
-                                         target='BT',
-                                         method='Hold9')
-            transect.boat_interpolations(update=False,
-                                         target='GPS',
-                                         method='None')
-            transect.apply_averaging_method(setting='Simple')
-            transect.process_depths(update=False,
-                                    interpolation_method='HoldLast')
-            transect.update_water()
-
-            # Filter water data
-            transect.w_vel.apply_filter(transect=transect, wt_depth=True)
-
-            # Interpolate water data
-            transect.w_vel.apply_interpolation(transect=transect,
-                                               ens_interp='None',
-                                               cells_interp='None')
-            transect.w_vel.apply_interpolation(transect=transect,
-                                               ens_interp='None',
-                                               cells_interp='TRDI')
-
-            if transect.sensors.speed_of_sound_mps.selected == 'user':
-                transect.sensors.speed_of_sound_mps.selected = 'internal'
-                transect.change_sos(parameter='sosSrc',
-                                    selected='user',
-                                    speed=transect.sensors.speed_of_sound_mps.user.data)
-            elif transect.sensors.salinity_ppt.selected == 'user':
-                transect.change_sos(parameter='salinity',
-                                    selected='user',
-                                    salinity=transect.sensors.salinity_ppt.user.data)
-            elif transect.sensors.temperature_deg_c.selected == 'user':
-                transect.change_sos(parameter='temperature',
-                                    selected='user',
-                                    temperature=transect.sensors.temperature_deg_c.user.data)
-
-    def qaqc_sontek(self, pathname):
-        """Reads and stores system tests, compass calibrations,
-        and moving-bed tests.
-
-        Parameters
-        ----------
-        pathname: str
-            Path to discharge transect files.
-        """
-
-        # Compass Calibration
-        compass_cal_folder = os.path.join(pathname, 'CompassCal')
-        time_stamp = None
-        if os.path.isdir(compass_cal_folder):
-            for file in os.listdir(compass_cal_folder):
-                valid_file = False
-                # G3 compasses
-                if file.endswith('.ccal'):
-                    time_stamp = file.split('_')
-                    time_stamp = time_stamp[0] + '_' + time_stamp[1]
-                    valid_file = True
-
-                # G2 compasses
-                elif file.endswith('.txt'):
-                    prefix, _ = os.path.splitext(file)
-                    time_stamp = prefix.split('l')[1]
-                    valid_file = True
-
-                if valid_file:
-                    with open(os.path.join(compass_cal_folder, file)) as f:
-                        cal_data = f.read()
-                        cal = PreMeasurement()
-                        cal.populate_data(time_stamp, cal_data, 'SCC')
-                        self.compass_cal.append(cal)
-
-        # System Test
-        system_test_folder = os.path.join(pathname, 'SystemTest')
-        if os.path.isdir(system_test_folder):
-            for file in os.listdir(system_test_folder):
-                # Find system test files.
-                if file.startswith('SystemTest'):
-                    with open(os.path.join(system_test_folder, file)) as f:
-                        test_data = f.read()
-                        test_data = test_data.replace('\x00', '')
-                    time_stamp = file[10:24]
-                    sys_test = PreMeasurement()
-                    sys_test.populate_data(time_stamp=time_stamp,
-                                           data_in=test_data,
-                                           data_type='SST')
-                    self.system_tst.append(sys_test)
-
-        # Moving-bed tests
-        self.sontek_moving_bed_tests(pathname)
-
-    def sontek_moving_bed_tests(self, pathname):
-        """Locates and processes SonTek moving-bed tests.
-
-        Searches the pathname for Matlab files that start with Loop or SMBA.
-        Processes these files as moving bed tests.
-
-        Parameters
-        ----------
-        pathname: str
-            Path to discharge transect files.
-        """
-        for file in os.listdir(pathname):
-            # Find moving-bed test files.
-            if file.endswith('.mat'):
-                # Process Loop test
-                if file.lower().startswith('loop'):
-                    self.mb_tests.append(MovingBedTests())
-                    self.mb_tests[-1].populate_data(source='SonTek',
-                                                    file=os.path.join(pathname, file),
-                                                    test_type='Loop')
-                # Process Stationary test
-                elif file.lower().startswith('smba'):
-                    self.mb_tests.append(MovingBedTests())
-                    self.mb_tests[-1].populate_data(source='SonTek',
-                                                    file=os.path.join(pathname, file),
-                                                    test_type='Stationary')
-
-    def load_qrev_mat(self, mat_data):
-        """Loads and coordinates the mapping of existing QRev Matlab files
-        into Python instance variables.
-
-        Parameters
-        ----------
-        mat_data: dict
-            Dictionary containing Matlab data.
-        """
-
-        meas_struct = mat_data['meas_struct']
-
-        # Assign data from meas_struct to associated instance variables
-        # in Measurement and associated objects.
-        if len(meas_struct.stationName) > 0:
-            self.station_name = meas_struct.stationName
-        if len(meas_struct.stationNumber) > 0:
-            self.station_number = meas_struct.stationNumber
-        if hasattr(meas_struct, 'meas_number'):
-            if len(meas_struct.meas_number) == 0:
-                self.meas_number = ''
-            else:
-                self.meas_number = meas_struct.meas_number
-        if hasattr(meas_struct, 'persons'):
-            if len(meas_struct.persons) == 0:
-                self.persons = ''
-            else:
-                self.persons = meas_struct.persons
-        if hasattr(meas_struct, 'stage_start_m'):
-            self.stage_start_m = meas_struct.stage_start_m
-        if hasattr(meas_struct, 'stage_end_m'):
-            self.stage_end_m = meas_struct.stage_end_m
-        if hasattr(meas_struct, 'stage_meas_m'):
-            self.stage_meas_m = meas_struct.stage_meas_m
-        self.processing = meas_struct.processing
-        if type(meas_struct.comments) == np.ndarray:
-            self.comments = meas_struct.comments.tolist()
-
-            # Needed to handle comments with blank lines
-            for n, comment in enumerate(self.comments):
-                if type(comment) is not str:
-                    new_comment = ''
-                    for item in comment:
-                        if len(item.strip()) > 0:
-                            new_comment = new_comment + item
-                        else:
-                            new_comment = new_comment + '\n'
-                    self.comments[n] = new_comment
-        else:
-            self.comments = [meas_struct.comments]
-
-        # Check to make sure all comments are str
-        for n, comment in enumerate(self.comments):
-            if type(comment) is np.ndarray:
-                # Using comment =... didn't work but self.comments[n] does
-                self.comments[2] = np.array2string(comment)
-
-        if hasattr(meas_struct, 'userRating'):
-            self.user_rating = meas_struct.userRating
-        else:
-            self.user_rating = ''
-
-        self.initial_settings = vars(meas_struct.initialSettings)
-
-        # Update initial settings to agree with Python definitions
-        nav_dict = {'btVel': 'bt_vel', 'ggaVel': 'gga_vel', 'vtgVel': 'vtg_vel',
-                    'bt_vel': 'bt_vel', 'gga_vel': 'gga_vel', 'vtg_vel': 'vtg_vel'}
-        self.initial_settings['NavRef'] = nav_dict[self.initial_settings['NavRef']]
-
-        on_off_dict = {'Off': False, 'On': True, 0: False, 1: True}
-        self.initial_settings['WTwtDepthFilter'] = on_off_dict[self.initial_settings['WTwtDepthFilter']]
-
-        if type(self.initial_settings['WTsnrFilter']) is np.ndarray:
-            self.initial_settings['WTsnrFilter'] = 'Off'
-
-        nav_dict = {'btDepths': 'bt_depths', 'vbDepths': 'vb_depths', 'dsDepths': 'ds_depths',
-                    'bt_depths': 'bt_depths', 'vb_depths': 'vb_depths', 'ds_depths': 'ds_depths'}
-        self.initial_settings['depthReference'] = nav_dict[self.initial_settings['depthReference']]
-
-        self.ext_temp_chk = {'user': meas_struct.extTempChk.user,
-                             'units': meas_struct.extTempChk.units,
-                             'adcp': meas_struct.extTempChk.adcp}
-
-        if hasattr(meas_struct.extTempChk, 'user_orig'):
-            self.ext_temp_chk['user_orig'] = meas_struct.extTempChk.user_orig
-        else:
-            self.ext_temp_chk['user_orig'] = meas_struct.extTempChk.user
-
-        if hasattr(meas_struct.extTempChk, 'adcp_orig'):
-            self.ext_temp_chk['adcp_orig'] = meas_struct.extTempChk.adcp_orig
-        else:
-            self.ext_temp_chk['adcp_orig'] = meas_struct.extTempChk.adcp
-
-        if type(self.ext_temp_chk['user']) is str:
-            self.ext_temp_chk['user'] = np.nan
-        if type(self.ext_temp_chk['adcp']) is str:
-            self.ext_temp_chk['adcp'] = np.nan
-        if type(self.ext_temp_chk['user']) is np.ndarray:
-            self.ext_temp_chk['user'] = np.nan
-        if type(self.ext_temp_chk['adcp']) is np.ndarray:
-            self.ext_temp_chk['adcp'] = np.nan
-        if type(self.ext_temp_chk['user_orig']) is str:
-            self.ext_temp_chk['user_orig'] = np.nan
-        if type(self.ext_temp_chk['adcp_orig']) is str:
-            self.ext_temp_chk['adcp_orig'] = np.nan
-        if type(self.ext_temp_chk['user_orig']) is np.ndarray:
-            self.ext_temp_chk['user_orig'] = np.nan
-        if type(self.ext_temp_chk['adcp_orig']) is np.ndarray:
-            self.ext_temp_chk['adcp_orig'] = np.nan
-
-        self.system_tst = PreMeasurement.sys_test_qrev_mat_in(meas_struct)
-
-        # no compass cal compassCal is mat_struct with len(data) = 0
-        try:
-            self.compass_cal = PreMeasurement.cc_qrev_mat_in(meas_struct)
-        except AttributeError:
-            self.compass_cal = []
-
-        try:
-            self.compass_eval = PreMeasurement.ce_qrev_mat_in(meas_struct)
-        except AttributeError:
-            self.compass_eval = []
-
-        self.transects = TransectData.qrev_mat_in(meas_struct)
-        self.mb_tests = MovingBedTests.qrev_mat_in(meas_struct)
-        self.extrap_fit = ComputeExtrap()
-        self.extrap_fit.populate_from_qrev_mat(meas_struct)
-
-        self.discharge = QComp.qrev_mat_in(meas_struct)
-
-        # For compatibility with older QRev.mat files that didn't have this feature
-        for n in range(len(self.transects)):
-            if len(self.discharge[n].left_idx) == 0:
-                self.discharge[n].left_idx = self.discharge[n].edge_ensembles(edge_loc='left',
-                                                                              transect=self.transects[n])
-
-            if len(self.discharge[n].right_idx) == 0:
-                self.discharge[n].right_idx = self.discharge[n].edge_ensembles(edge_loc='right',
-                                                                               transect=self.transects[n])
-
-            if type(self.discharge[n].correction_factor) is list:
-                self.discharge[n].correction_factor = self.discharge[n].total / self.discharge[n].total_uncorrected
-
-        # Identify checked transects
-        self.checked_transect_idx = self.checked_transects(self)
-
-        if hasattr(meas_struct, 'observed_no_moving_bed'):
-            self.observed_no_moving_bed = meas_struct.observed_no_moving_bed
-        else:
-            self.observed_no_moving_bed = False
-
-        self.uncertainty = Uncertainty()
-        self.uncertainty.populate_from_qrev_mat(meas_struct)
-        self.qa = QAData(self, mat_struct=meas_struct, compute=False)
-        if hasattr(meas_struct, 'run_oursin'):
-            self.run_oursin = meas_struct.run_oursin
-        else:
-            self.run_oursin = False
-        if hasattr(meas_struct, 'oursin'):
-            self.oursin = Oursin()
-            self.oursin.populate_from_qrev_mat(meas_struct=meas_struct)
-        else:
-            self.oursin = None
-
-        self.use_weighted = self.extrap_fit.use_weighted
-        self.use_measurement_thresholds = \
-            self.transects[self.checked_transect_idx[0]].boat_vel.bt_vel.use_measurement_thresholds
-
-    def create_filter_composites(self):
-        """Create composite for water and bottom track difference and vertical velocities and compute the thresholds
-        using these composites.
-        """
-
-        # Initialize dictionaries
-        wt_d = {}
-        wt_w = {}
-        bt_d = {}
-        bt_w = {}
-
-        # Create composite arrays for all checked transects
-        for transect in self.transects:
-            if transect.checked:
-                bt_freq = transect.boat_vel.bt_vel.frequency_khz.astype(int).astype(str)
-                freq = np.unique(bt_freq)
-                for f in freq:
-                    if f in bt_d:
-                        bt_d[f] = np.hstack((bt_d[f], transect.boat_vel.bt_vel.d_mps[bt_freq == f]))
-                        bt_w[f] = np.hstack((bt_w[f], transect.boat_vel.bt_vel.w_mps[bt_freq == f]))
-                    else:
-                        bt_d[f] = transect.boat_vel.bt_vel.d_mps[bt_freq == f]
-                        bt_w[f] = transect.boat_vel.bt_vel.w_mps[bt_freq == f]
-
-                if transect.w_vel.ping_type.size > 0:
-                    # Identify the ping types used in the transect
-                    p_types = np.unique(transect.w_vel.ping_type)
-                    # Composite for each ping type
-                    for p_type in p_types:
-                        if p_type in wt_d:
-                            wt_d[p_type] = np.hstack(
-                                (wt_d[p_type], transect.w_vel.d_mps[np.logical_and(transect.w_vel.ping_type == p_type,
-                                                                                   transect.w_vel.cells_above_sl)]))
-                            wt_w[p_type] = np.hstack(
-                                (wt_d[p_type], transect.w_vel.w_mps[np.logical_and(transect.w_vel.ping_type == p_type,
-                                                                                   transect.w_vel.cells_above_sl)]))
-                        else:
-                            wt_d[p_type] = transect.w_vel.d_mps[np.logical_and(transect.w_vel.ping_type == p_type,
-                                                                               transect.w_vel.cells_above_sl)]
-                            wt_w[p_type] = transect.w_vel.w_mps[np.logical_and(transect.w_vel.ping_type == p_type,
-                                                                               transect.w_vel.cells_above_sl)]
-                else:
-                    p_types = np.array(['U'])
-                    for p_type in p_types:
-                        if p_type in wt_d:
-                            wt_d[p_type] = np.hstack((wt_d[p_type],
-                                                      transect.w_vel.d_mps[transect.w_vel.cells_above_sl]))
-                            wt_w[p_type] = np.hstack((wt_d[p_type],
-                                                      transect.w_vel.w_mps[transect.w_vel.cells_above_sl]))
-                        else:
-                            wt_d[p_type] = transect.w_vel.d_mps[transect.w_vel.cells_above_sl]
-                            wt_w[p_type] = transect.w_vel.w_mps[transect.w_vel.cells_above_sl]
-
-        # Compute thresholds based on composite arrays
-
-        # Water track
-        wt_d_meas_thresholds = {}
-        wt_w_meas_thresholds = {}
-        for p_type in wt_d.keys():
-            wt_d_meas_thresholds[p_type] = WaterData.meas_iqr_filter(wt_d[p_type], multiplier=5)
-            wt_w_meas_thresholds[p_type] = WaterData.meas_iqr_filter(wt_w[p_type], multiplier=5)
-
-        # Bottom track
-        bt_d_meas_thresholds = {}
-        bt_w_meas_thresholds = {}
-        for freq in bt_d.keys():
-            bt_d_meas_thresholds[freq] = BoatData.iqr_filter(bt_d[freq])
-            bt_w_meas_thresholds[freq] = BoatData.iqr_filter(bt_w[freq])
-
-        # Assign threshold to each transect
-        for transect in self.transects:
-            transect.w_vel.d_meas_thresholds = wt_d_meas_thresholds
-            transect.w_vel.w_meas_thresholds = wt_w_meas_thresholds
-            transect.boat_vel.bt_vel.d_meas_thresholds = bt_d_meas_thresholds
-            transect.boat_vel.bt_vel.w_meas_thresholds = bt_w_meas_thresholds
-
-        if len(self.mb_tests) > 0:
-            for test in self.mb_tests:
-                transect = test.transect
-                transect.w_vel.d_meas_thresholds = wt_d_meas_thresholds
-                transect.w_vel.w_meas_thresholds = wt_w_meas_thresholds
-                transect.boat_vel.bt_vel.d_meas_thresholds = bt_d_meas_thresholds
-                transect.boat_vel.bt_vel.w_meas_thresholds = bt_w_meas_thresholds
-
-    @staticmethod
-    def set_num_beam_wt_threshold_trdi(mmt_transect):
-        """Get number of beams to use in processing for WT from mmt file
-        
-        Parameters
-        ----------
-        mmt_transect: MMT_Transect
-            Object of MMT_Transect
-        
-        Returns
-        -------
-        num_3_beam_wt_Out: int
-        """
-
-        use_3_beam_wt = mmt_transect.active_config['Proc_Use_3_Beam_WT']
-        if use_3_beam_wt == 0:
-            num_beam_wt_out = 4
-        else:
-            num_beam_wt_out = 3
-            
-        return num_beam_wt_out
-
-    @staticmethod
-    def set_num_beam_bt_threshold_trdi(mmt_transect):
-        """Get number of beams to use in processing for BT from mmt file
-
-        Parameters
-        ----------
-        mmt_transect: MMT_Transect
-            Object of MMT_Transect
-
-        Returns
-        -------
-        num_3_beam_WT_Out: int
-        """
-
-        use_3_beam_bt = mmt_transect.active_config['Proc_Use_3_Beam_BT']
-        if use_3_beam_bt == 0:
-            num_beam_bt_out = 4
-        else:
-            num_beam_bt_out = 3
-
-        return num_beam_bt_out
-
-    @staticmethod
-    def set_depth_weighting_trdi(mmt_transect):
-        """Get the average depth method from mmt
-        
-        Parameters
-        ----------
-        mmt_transect: MMT_Transect
-            Object of MMT_Transect
-        
-        Returns
-        -------
-        depth_weighting_setting: str
-            Method to compute mean depth
-        """
-
-        depth_weighting = mmt_transect.active_config['Proc_Use_Weighted_Mean_Depth']
-        
-        if depth_weighting == 0:
-            depth_weighting_setting = 'Simple'
-        else:
-            depth_weighting_setting = 'IDW'
-
-        return depth_weighting_setting
-
-    @staticmethod
-    def set_depth_screening_trdi(mmt_transect):
-        """Get the depth screening setting from mmt
-        
-        Parameters
-        ----------
-        mmt_transect: MMT_Transect
-            Object of MMT_Transect
-        
-        Returns
-        -------
-        depth_screening_setting: str
-            Type of depth screening to use
-        """
-
-        depth_screen = mmt_transect.active_config['Proc_Screen_Depth']
-        if depth_screen == 0:
-            depth_screening_setting = 'None'
-        else:
-            depth_screening_setting = 'TRDI'
-        
-        return depth_screening_setting
-        
-    def change_sos(self, transect_idx=None, parameter=None, salinity=None, temperature=None, selected=None, speed=None):
-        """Applies a change in speed of sound to one or all transects
-        and update the discharge and uncertainty computations
-        
-        Parameters
-        ----------
-        transect_idx: int
-            Index of transect to change
-        parameter: str
-            Speed of sound parameter to be changed ('temperatureSrc', 'temperature', 'salinity', 'sosSrc')
-        salinity: float
-            Salinity in ppt
-        temperature: float
-            Temperature in deg C
-        selected: str
-            Selected speed of sound ('internal', 'computed', 'user') or temperature ('internal', 'user')
-        speed: float
-            Manually supplied speed of sound for 'user' source
-        """
-        
-        s = self.current_settings()
-        if transect_idx is None:
-            # Apply to all transects
-            for transect in self.transects:
-                transect.change_sos(parameter=parameter,
-                                    salinity=salinity,
-                                    temperature=temperature,
-                                    selected=selected,
-                                    speed=speed)
-        else:
-            # Apply to a single transect
-            self.transects[transect_idx].change_sos(parameter=parameter,
-                                                    salinity=salinity,
-                                                    temperature=temperature,
-                                                    selected=selected,
-                                                    speed=speed)
-        # Reapply settings to newly adjusted data
-        self.apply_settings(s)
-
-    def change_magvar(self, magvar, transect_idx=None):
-        """Coordinates changing the magnetic variation.
-
-        Parameters
-        ----------
-        magvar: float
-            Magnetic variation
-        transect_idx: int
-            Index of transect to which the change is applied. None is all transects.
-        """
-
-        # Get current settings
-        s = self.current_settings()
-
-        # Initialize variables
-        n_transects = len(self.transects)
-        recompute = False
-        n = 0
-
-        # If the internal compass is used the recompute is necessary
-        while n < n_transects and recompute is False:
-            if self.transects[n].sensors.heading_deg.selected == 'internal':
-                recompute = True
-            n += 1
-
-        # Apply change
-        if transect_idx is None:
-            # Apply change to all transects
-            for transect in self.transects:
-                transect.change_mag_var(magvar)
-
-            # Apply change to moving-bed tests
-            if len(self.mb_tests) > 0:
-                for test in self.mb_tests:
-                    old_magvar = test.transect.sensors.heading_deg.internal.mag_var_deg
-                    test.transect.change_mag_var(magvar)
-                    test.magvar_change(magvar, old_magvar)
-        else:
-            self.transects[transect_idx].change_mag_var(magvar)
-
-        # Recompute is specified
-        if recompute:
-            self.apply_settings(s)
-        else:
-            self.qa.compass_qa(self)
-            self.qa.check_compass_settings(self)
-
-    def change_h_offset(self, h_offset, transect_idx=None):
-        """Coordinates changing the heading offset for external heading.
-
-        Parameters
-        ----------
-        h_offset: float
-            Heading offset
-        transect_idx: int
-            Index of transect to which the change is applied. None is all transects.
-        """
-
-        # Get current settings
-        s = self.current_settings()
-
-        # Initialize variables
-        n_transects = len(self.transects)
-        recompute = False
-        n = 0
-
-        # If external compass is used then a recompute is necessary
-        while n < n_transects and recompute is False:
-            if self.transects[n].sensors.heading_deg.selected == 'external':
-                recompute = True
-            n += 1
-
-        # Apply change
-        if transect_idx is None:
-            for transect in self.transects:
-                transect.change_offset(h_offset)
-
-            # Apply change to moving-bed tests
-            if len(self.mb_tests) > 0:
-                for test in self.mb_tests:
-                    old_h_offset = test.transect.sensors.heading_deg.external.align_correction_deg
-                    test.transect.change_offset(h_offset)
-                    test.h_offset_change(h_offset, old_h_offset)
-        else:
-            self.transects[transect_idx].change_offset(h_offset)
-
-        # Rcompute is specified
-        if recompute:
-            self.apply_settings(s)
-        else:
-            self.qa.compass_qa(self)
-            self.qa.check_compass_settings(self)
-
-    def change_h_source(self, h_source, transect_idx=None):
-        """Coordinates changing the heading source.
-
-        Parameters
-        ----------
-        h_source: str
-            Heading source (internal or external)
-        transect_idx: int
-            Index of transect to which the change is applied. None is all transects.
-        """
-
-        # Get current settings
-        s = self.current_settings()
-
-        # Apply change
-        if transect_idx is None:
-            for transect in self.transects:
-                transect.change_heading_source(h_source)
-
-            # Apply change to moving-bed tests
-            if len(self.mb_tests) > 0:
-                for test in self.mb_tests:
-                    test.transect.change_heading_source(h_source)
-                    test.process_mb_test(source=test.transect.adcp.manufacturer)
-                settings = self.current_settings()
-                select = settings['NavRef']
-                ref = None
-                if select == 'bt_vel':
-                    ref = 'BT'
-                elif select == 'gga_vel':
-                    ref = 'GGA'
-                elif select == 'vtg_vel':
-                    ref = 'VTG'
-                self.mb_tests = MovingBedTests.auto_use_2_correct(
-                    moving_bed_tests=self.mb_tests, boat_ref=ref)
-
-        else:
-            self.transects[transect_idx].change_heading_source(h_source)
-
-        self.apply_settings(s)
-
-    def change_draft(self, draft, transect_idx=None):
-        """Coordinates changing the ADCP draft.
-
-        Parameters
-        ----------
-        draft: float
-            Draft of ADCP in m
-        transect_idx: int
-            Index of transect to which the change is applied. None is all transects.
-        """
-
-        # Get current settings
-        s = self.current_settings()
-
-        # Apply change
-        if transect_idx is None:
-            for transect in self.transects:
-                transect.change_draft(draft)
-        else:
-            self.transects[transect_idx].change_draft(draft)
-
-        self.apply_settings(s)
-
-    @staticmethod
-    def h_external_valid(meas):
-        """Determine if valid external heading data is included in the measurement.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of Measurement
-        """
-
-        external = False
-        for transect in meas.transects:
-            if transect.sensors.heading_deg.external is not None:
-                external = True
-                break
-        return external
-
-    # @profile
-    def apply_settings(self, settings, force_abba=True):
-        """Applies reference, filter, and interpolation settings.
-        
-        Parameters
-        ----------
-        settings: dict
-            Dictionary of reference, filter, and interpolation settings
-        force_abba: bool
-            Allows the above, below, before, after interpolation to be applied even when the data use another approach.
-        """
-
-        self.use_ping_type = settings['UsePingType']
-
-        # If SonTek data does not have ping type identified, determine ping types
-        if self.transects[0].w_vel.ping_type.size == 1 and self.transects[0].adcp.manufacturer == 'SonTek':
-            for transect in self.transects:
-                ping_type = TransectData.sontek_ping_type(transect.w_vel.corr, transect.w_vel.frequency)
-                transect.w_vel.ping_type = np.tile(np.array([ping_type]), (transect.w_vel.corr.shape[1], 1))
-
-        # If the measurement thresholds have not been computed, compute them
-        if not self.transects[0].w_vel.d_meas_thresholds:
-            self.create_filter_composites()
-
-        # Apply settings to moving-bed tests:
-        if len(self.mb_tests) > 0:
-            self.apply_settings_to_movingbed(settings, force_abba=True)
-
-        # Apply settings to discharge transects
-        for transect in self.transects:
-
-            if not settings['UsePingType']:
-                transect.w_vel.ping_type = np.tile('U', transect.w_vel.ping_type.shape)
-                transect.boat_vel.bt_vel.frequency_khz = np.tile(0, transect.boat_vel.bt_vel.frequency_khz.shape)
-
-            # Moving-boat ensembles
-            if 'Processing' in settings.keys():
-                transect.change_q_ensembles(proc_method=settings['Processing'])
-                self.processing = settings['Processing']
-
-            # Navigation reference
-            if transect.boat_vel.selected != settings['NavRef']:
-                transect.change_nav_reference(update=False, new_nav_ref=settings['NavRef'])
-                if len(self.mb_tests) > 0:
-                    self.mb_tests = MovingBedTests.auto_use_2_correct(
-                        moving_bed_tests=self.mb_tests,
-                        boat_ref=settings['NavRef'])
-
-            # Changing the nav reference applies the current setting for
-            # Composite tracks, check to see if a change is needed
-            if transect.boat_vel.composite != settings['CompTracks']:
-                transect.composite_tracks(update=False, setting=settings['CompTracks'])
-
-            # Set difference velocity BT filter
-            bt_kwargs = {}
-            if settings['BTdFilter'] == 'Manual':
-                bt_kwargs['difference'] = settings['BTdFilter']
-                bt_kwargs['difference_threshold'] = settings['BTdFilterThreshold']
-            else:
-                bt_kwargs['difference'] = settings['BTdFilter']
-
-            # Set vertical velocity BT filter
-            if settings['BTwFilter'] == 'Manual':
-                bt_kwargs['vertical'] = settings['BTwFilter']
-                bt_kwargs['vertical_threshold'] = settings['BTwFilterThreshold']
-            else:
-                bt_kwargs['vertical'] = settings['BTwFilter']
-
-            # Apply beam filter
-                bt_kwargs['beam'] = settings['BTbeamFilter']
-
-            # Apply smooth filter
-                bt_kwargs['other'] = settings['BTsmoothFilter']
-
-            transect.boat_vel.bt_vel.use_measurement_thresholds = settings['UseMeasurementThresholds']
-
-            # Apply BT settings
-            transect.boat_filters(update=False, **bt_kwargs)
-
-            # BT Interpolation
-            transect.boat_interpolations(update=False,
-                                         target='BT',
-                                         method=settings['BTInterpolation'])
-
-            # GPS filter settings
-            if transect.gps is not None:
-                gga_kwargs = {}
-                if transect.boat_vel.gga_vel is not None:
-                    # GGA
-                    gga_kwargs['differential'] = settings['ggaDiffQualFilter']
-                    if settings['ggaAltitudeFilter'] == 'Manual':
-                        gga_kwargs['altitude'] = settings['ggaAltitudeFilter']
-                        gga_kwargs['altitude_threshold'] = settings['ggaAltitudeFilterChange']
-                    else:
-                        gga_kwargs['altitude'] = settings['ggaAltitudeFilter']
-
-                    # Set GGA HDOP Filter
-                    if settings['GPSHDOPFilter'] == 'Manual':
-                        gga_kwargs['hdop'] = settings['GPSHDOPFilter']
-                        gga_kwargs['hdop_max_threshold'] = settings['GPSHDOPFilterMax']
-                        gga_kwargs['hdop_change_threshold'] = settings['GPSHDOPFilterChange']
-                    else:
-                        gga_kwargs['hdop'] = settings['GPSHDOPFilter']
-
-                    gga_kwargs['other'] = settings['GPSSmoothFilter']
-                    # Apply GGA filters
-                    transect.gps_filters(update=False, **gga_kwargs)
-
-                if transect.boat_vel.vtg_vel is not None:
-                    vtg_kwargs = {}
-                    if settings['GPSHDOPFilter'] == 'Manual':
-                        vtg_kwargs['hdop'] = settings['GPSHDOPFilter']
-                        vtg_kwargs['hdop_max_threshold'] = settings['GPSHDOPFilterMax']
-                        vtg_kwargs['hdop_change_threshold'] = settings['GPSHDOPFilterChange']
-                        vtg_kwargs['other'] = settings['GPSSmoothFilter']
-                    else:
-                        vtg_kwargs['hdop'] = settings['GPSHDOPFilter']
-                        vtg_kwargs['other'] = settings['GPSSmoothFilter']
-
-                    # Apply VTG filters
-                    transect.gps_filters(update=False, **vtg_kwargs)
-
-                transect.boat_interpolations(update=False,
-                                             target='GPS',
-                                             method=settings['GPSInterpolation'])
-
-            # Set depth reference
-            transect.set_depth_reference(update=False, setting=settings['depthReference'])
-
-            transect.process_depths(update=True,
-                                    filter_method=settings['depthFilterType'],
-                                    interpolation_method=settings['depthInterpolation'],
-                                    composite_setting=settings['depthComposite'],
-                                    avg_method=settings['depthAvgMethod'],
-                                    valid_method=settings['depthValidMethod'])
-
-            # Set WT difference velocity filter
-            wt_kwargs = {}
-            if settings['WTdFilter'] == 'Manual':
-                wt_kwargs['difference'] = settings['WTdFilter']
-                wt_kwargs['difference_threshold'] = settings['WTdFilterThreshold']
-            else:
-                wt_kwargs['difference'] = settings['WTdFilter']
-
-            # Set WT vertical velocity filter
-            if settings['WTwFilter'] == 'Manual':
-                wt_kwargs['vertical'] = settings['WTwFilter']
-                wt_kwargs['vertical_threshold'] = settings['WTwFilterThreshold']
-            else:
-                wt_kwargs['vertical'] = settings['WTwFilter']
-
-            wt_kwargs['beam'] = settings['WTbeamFilter']
-            wt_kwargs['other'] = settings['WTsmoothFilter']
-            wt_kwargs['snr'] = settings['WTsnrFilter']
-            wt_kwargs['wt_depth'] = settings['WTwtDepthFilter']
-            wt_kwargs['excluded'] = settings['WTExcludedDistance']
-
-            # Data loaded from old QRev.mat files will be set to use this new interpolation method. When reprocessing
-            # any data the interpolation method should be 'abba'
-            if force_abba:
-                transect.w_vel.interpolate_cells = 'abba'
-                transect.w_vel.interpolate_ens = 'abba'
-                settings['WTEnsInterpolation'] = 'abba'
-                settings['WTCellInterpolation'] = 'abba'
-
-            transect.w_vel.use_measurement_thresholds = settings['UseMeasurementThresholds']
-            if transect.w_vel.ping_type.size == 0 and transect.adcp.manufacturer == 'SonTek':
-                # Correlation and frequency can be used to determine ping type
-                transect.w_vel.ping_type = TransectData.sontek_ping_type(corr=transect.w_vel.corr,
-                                                                         freq=transect.w_vel.frequency)
-
-            transect.w_vel.apply_filter(transect=transect, **wt_kwargs)
-
-            # Edge methods
-            transect.edges.rec_edge_method = settings['edgeRecEdgeMethod']
-            transect.edges.vel_method = settings['edgeVelMethod']
-
-        if settings['UseWeighted'] and not self.use_weighted:
-            if self.extrap_fit.norm_data[-1].weights is None:
-                # Compute normalized data for each transect to obtain the weights
-                self.extrap_fit.process_profiles(self.transects, self.extrap_fit.norm_data[-1].data_type,
-                                                 use_weighted=settings['UseWeighted'])
-
-        self.use_weighted = settings['UseWeighted']
-
-        if len(self.checked_transect_idx) > 0:
-            ref_transect = self.checked_transect_idx[0]
-        else:
-            ref_transect = 0
-
-        if self.transects[ref_transect].w_vel.interpolate_cells == 'TRDI':
-            if self.extrap_fit is None:
-                self.extrap_fit = ComputeExtrap()
-                self.extrap_fit.populate_data(transects=self.transects, compute_sensitivity=False,
-                                              use_weighted=settings['UseWeighted'])
-                self.change_extrapolation(self.extrap_fit.fit_method, compute_q=False,
-                                          use_weighted=settings['UseWeighted'])
-            elif self.extrap_fit.fit_method == 'Automatic':
-                self.change_extrapolation(self.extrap_fit.fit_method, compute_q=False,
-                                          use_weighted=settings['UseWeighted'])
-            else:
-                if 'extrapTop' not in settings.keys():
-                    settings['extrapTop'] = self.extrap_fit.sel_fit[-1].top_method
-                    settings['extrapBot'] = self.extrap_fit.sel_fit[-1].bot_method
-                    settings['extrapExp'] = self.extrap_fit.sel_fit[-1].exponent
-
-            self.change_extrapolation(self.extrap_fit.fit_method,
-                                      top=settings['extrapTop'],
-                                      bot=settings['extrapBot'],
-                                      exp=settings['extrapExp'],
-                                      compute_q=False,
-                                      use_weighted=settings['UseWeighted'])
-
-        for transect in self.transects:
-
-            # Water track interpolations
-            transect.w_vel.apply_interpolation(transect=transect,
-                                               ens_interp=settings['WTEnsInterpolation'],
-                                               cells_interp=settings['WTCellInterpolation'])
-
-        if self.extrap_fit is None:
-            self.extrap_fit = ComputeExtrap()
-            self.extrap_fit.populate_data(transects=self.transects, compute_sensitivity=False,
-                                          use_weighted=settings['UseWeighted'])
-            self.change_extrapolation(self.extrap_fit.fit_method, compute_q=False,
-                                      use_weighted=settings['UseWeighted'])
-        elif self.extrap_fit.fit_method == 'Automatic':
-            self.change_extrapolation(self.extrap_fit.fit_method, compute_q=False,
-                                      use_weighted=settings['UseWeighted'])
-        else:
-            if 'extrapTop' not in settings.keys():
-                settings['extrapTop'] = self.extrap_fit.sel_fit[-1].top_method
-                settings['extrapBot'] = self.extrap_fit.sel_fit[-1].bot_method
-                settings['extrapExp'] = self.extrap_fit.sel_fit[-1].exponent
-
-        self.change_extrapolation(self.extrap_fit.fit_method,
-                                  top=settings['extrapTop'],
-                                  bot=settings['extrapBot'],
-                                  exp=settings['extrapExp'],
-                                  compute_q=False,
-                                  use_weighted=settings['UseWeighted'])
-
-        self.extrap_fit.q_sensitivity = ExtrapQSensitivity()
-        self.extrap_fit.q_sensitivity.populate_data(transects=self.transects,
-                                                    extrap_fits=self.extrap_fit.sel_fit)
-
-        self.compute_discharge()
-
-        self.compute_uncertainty()
-
-    def apply_settings_to_movingbed(self, settings, force_abba=True):
-        """Applies reference, filter, and interpolation settings.
-
-        Parameters
-        ----------
-        settings: dict
-            Dictionary of reference, filter, and interpolation settings
-        force_abba: bool
-            Allows the above, below, before, after interpolation to be applied even when the data use another approach.
-        """
-
-        self.use_ping_type = settings['UsePingType']
-        # If SonTek data does not have ping type identified, determine ping types
-        if self.mb_tests[0].transect.w_vel.ping_type.size == 1 and self.transects[0].adcp.manufacturer == 'SonTek':
-            for test in self.mb_tests:
-                transect = test.transect
-                ping_type = TransectData.sontek_ping_type(transect.w_vel.corr, transect.w_vel.frequency)
-                transect.w_vel.ping_type = np.tile(np.array([ping_type]), (transect.w_vel.corr.shape[1], 1))
-
-        for test in self.mb_tests:
-            transect = test.transect
-
-            if not settings['UsePingType']:
-                transect.w_vel.ping_type = np.tile('U', transect.w_vel.ping_type.shape)
-                transect.boat_vel.bt_vel.frequency_khz = np.tile(0, transect.boat_vel.bt_vel.frequency_khz.shape)
-
-            # Moving-boat ensembles
-            if 'Processing' in settings.keys():
-                transect.change_q_ensembles(proc_method=settings['Processing'])
-                self.processing = settings['Processing']
-
-            # Set difference velocity BT filter
-            bt_kwargs = {}
-            if settings['BTdFilter'] == 'Manual':
-                bt_kwargs['difference'] = settings['BTdFilter']
-                bt_kwargs['difference_threshold'] = settings['BTdFilterThreshold']
-            else:
-                bt_kwargs['difference'] = settings['BTdFilter']
-
-            # Set vertical velocity BT filter
-            if settings['BTwFilter'] == 'Manual':
-                bt_kwargs['vertical'] = settings['BTwFilter']
-                bt_kwargs['vertical_threshold'] = settings['BTwFilterThreshold']
-            else:
-                bt_kwargs['vertical'] = settings['BTwFilter']
-
-                # Apply beam filter
-                bt_kwargs['beam'] = settings['BTbeamFilter']
-
-                # Apply smooth filter
-                bt_kwargs['other'] = settings['BTsmoothFilter']
-
-            transect.boat_vel.bt_vel.use_measurement_thresholds = settings['UseMeasurementThresholds']
-
-            # Apply BT settings
-            transect.boat_filters(update=False, **bt_kwargs)
-
-            # Don't interpolate for stationary tests
-            if test.type == 'Loop':
-                # BT Interpolation
-                transect.boat_interpolations(update=False,
-                                             target='BT',
-                                             method=settings['BTInterpolation'])
-
-            # GPS filter settings
-            if transect.gps is not None:
-                gga_kwargs = {}
-                if transect.boat_vel.gga_vel is not None:
-                    # GGA
-                    gga_kwargs['differential'] = settings['ggaDiffQualFilter']
-                    if settings['ggaAltitudeFilter'] == 'Manual':
-                        gga_kwargs['altitude'] = settings['ggaAltitudeFilter']
-                        gga_kwargs['altitude_threshold'] = settings['ggaAltitudeFilterChange']
-                    else:
-                        gga_kwargs['altitude'] = settings['ggaAltitudeFilter']
-
-                    # Set GGA HDOP Filter
-                    if settings['GPSHDOPFilter'] == 'Manual':
-                        gga_kwargs['hdop'] = settings['GPSHDOPFilter']
-                        gga_kwargs['hdop_max_threshold'] = settings['GPSHDOPFilterMax']
-                        gga_kwargs['hdop_change_threshold'] = settings['GPSHDOPFilterChange']
-                    else:
-                        gga_kwargs['hdop'] = settings['GPSHDOPFilter']
-
-                    gga_kwargs['other'] = settings['GPSSmoothFilter']
-                    # Apply GGA filters
-                    transect.gps_filters(update=False, **gga_kwargs)
-
-                if transect.boat_vel.vtg_vel is not None:
-                    vtg_kwargs = {}
-                    if settings['GPSHDOPFilter'] == 'Manual':
-                        vtg_kwargs['hdop'] = settings['GPSHDOPFilter']
-                        vtg_kwargs['hdop_max_threshold'] = settings['GPSHDOPFilterMax']
-                        vtg_kwargs['hdop_change_threshold'] = settings['GPSHDOPFilterChange']
-                        vtg_kwargs['other'] = settings['GPSSmoothFilter']
-                    else:
-                        vtg_kwargs['hdop'] = settings['GPSHDOPFilter']
-                        vtg_kwargs['other'] = settings['GPSSmoothFilter']
-
-                    # Apply VTG filters
-                    transect.gps_filters(update=False, **vtg_kwargs)
-
-                # Don't interpolate for stationary tests
-                if test.type == 'Loop':
-                    transect.boat_interpolations(update=False,
-                                                 target='GPS',
-                                                 method=settings['GPSInterpolation'])
-
-            # Set depth reference
-            transect.set_depth_reference(update=False, setting=settings['depthReference'])
-            transect.process_depths(update=False,
-                                    filter_method=settings['depthFilterType'],
-                                    interpolation_method=settings['depthInterpolation'],
-                                    composite_setting=settings['depthComposite'],
-                                    avg_method=settings['depthAvgMethod'],
-                                    valid_method=settings['depthValidMethod'])
-
-            # Set WT difference velocity filter
-            wt_kwargs = {}
-            if settings['WTdFilter'] == 'Manual':
-                wt_kwargs['difference'] = settings['WTdFilter']
-                wt_kwargs['difference_threshold'] = settings['WTdFilterThreshold']
-            else:
-                wt_kwargs['difference'] = settings['WTdFilter']
-
-            # Set WT vertical velocity filter
-            if settings['WTwFilter'] == 'Manual':
-                wt_kwargs['vertical'] = settings['WTwFilter']
-                wt_kwargs['vertical_threshold'] = settings['WTwFilterThreshold']
-            else:
-                wt_kwargs['vertical'] = settings['WTwFilter']
-
-            wt_kwargs['beam'] = settings['WTbeamFilter']
-            wt_kwargs['other'] = settings['WTsmoothFilter']
-            wt_kwargs['snr'] = settings['WTsnrFilter']
-            wt_kwargs['wt_depth'] = settings['WTwtDepthFilter']
-            wt_kwargs['excluded'] = settings['WTExcludedDistance']
-
-            # Data loaded from old QRev.mat files will be set to use this new interpolation method. When reprocessing
-            # any data the interpolation method should be 'abba'
-            if force_abba:
-                transect.w_vel.interpolate_cells = 'abba'
-                transect.w_vel.interpolate_ens = 'abba'
-                settings['WTEnsInterpolation'] = 'abba'
-                settings['WTCellInterpolation'] = 'abba'
-
-            transect.w_vel.use_measurement_thresholds = settings['UseMeasurementThresholds']
-            if transect.w_vel.ping_type.size == 0 and transect.adcp.manufacturer == 'SonTek':
-                # Correlation and frequency can be used to determine ping type
-                transect.w_vel.ping_type = TransectData.sontek_ping_type(corr=transect.w_vel.corr,
-                                                                         freq=transect.w_vel.frequency)
-
-            transect.w_vel.apply_filter(transect=transect, **wt_kwargs)
-
-            transect.w_vel.apply_interpolation(transect=transect,
-                                               ens_interp=settings['WTEnsInterpolation'],
-                                               cells_interp=settings['WTCellInterpolation'])
-
-            test.process_mb_test(source=self.transects[0].adcp.manufacturer)
-
-    def current_settings(self):
-        """Saves the current settings for a measurement. Since all settings
-        in QRev are consistent among all transects in a measurement only the
-        settings from the first transect are saved
-        """
-
-        settings = {}
-
-        if len(self.checked_transect_idx) > 0:
-            ref_transect = self.checked_transect_idx[0]
-        else:
-            ref_transect = 0
-        transect = self.transects[ref_transect]
-        
-        # Navigation reference
-        settings['NavRef'] = transect.boat_vel.selected
-        
-        # Composite tracks
-        settings['CompTracks'] = transect.boat_vel.composite
-        
-        # Water track settings
-        settings['WTbeamFilter'] = transect.w_vel.beam_filter
-        settings['WTdFilter'] = transect.w_vel.d_filter
-        settings['WTdFilterThreshold'] = transect.w_vel.d_filter_thresholds
-        settings['WTwFilter'] = transect.w_vel.w_filter
-        settings['WTwFilterThreshold'] = transect.w_vel.w_filter_thresholds
-        settings['WTsmoothFilter'] = transect.w_vel.smooth_filter
-        settings['WTsnrFilter'] = transect.w_vel.snr_filter
-        settings['WTwtDepthFilter'] = transect.w_vel.wt_depth_filter
-        settings['WTEnsInterpolation'] = transect.w_vel.interpolate_ens
-        settings['WTCellInterpolation'] = transect.w_vel.interpolate_cells
-        settings['WTExcludedDistance'] = transect.w_vel.excluded_dist_m
-        
-        # Bottom track settings
-        settings['BTbeamFilter'] = transect.boat_vel.bt_vel.beam_filter
-        settings['BTdFilter'] = transect.boat_vel.bt_vel.d_filter
-        settings['BTdFilterThreshold'] = transect.boat_vel.bt_vel.d_filter_thresholds
-        settings['BTwFilter'] = transect.boat_vel.bt_vel.w_filter
-        settings['BTwFilterThreshold'] = transect.boat_vel.bt_vel.w_filter_thresholds
-        settings['BTsmoothFilter'] = transect.boat_vel.bt_vel.smooth_filter
-        settings['BTInterpolation'] = transect.boat_vel.bt_vel.interpolate
-        
-        # Gps Settings
-        # if transect.gps is not None:
-
-        gga_present = False
-        for idx in self.checked_transect_idx:
-            if self.transects[idx].boat_vel.gga_vel is not None:
-                gga_present = True
-                transect = self.transects[idx]
-                break
-
-        # GGA settings
-        if gga_present:
-            settings['ggaDiffQualFilter'] = transect.boat_vel.gga_vel.gps_diff_qual_filter
-            settings['ggaAltitudeFilter'] = transect.boat_vel.gga_vel.gps_altitude_filter
-            settings['ggaAltitudeFilterChange'] = \
-                transect.boat_vel.gga_vel.gps_altitude_filter_change
-            settings['GPSHDOPFilter'] = transect.boat_vel.gga_vel.gps_HDOP_filter
-            settings['GPSHDOPFilterMax'] = transect.boat_vel.gga_vel.gps_HDOP_filter_max
-            settings['GPSHDOPFilterChange'] = transect.boat_vel.gga_vel.gps_HDOP_filter_change
-            settings['GPSSmoothFilter'] = transect.boat_vel.gga_vel.smooth_filter
-            settings['GPSInterpolation'] = transect.boat_vel.gga_vel.interpolate
-        else:
-            settings['ggaDiffQualFilter'] = 1
-            settings['ggaAltitudeFilter'] = 'Off'
-            settings['ggaAltitudeFilterChange'] = []
-
-            settings['ggaSmoothFilter'] = 'Off'
-            if 'GPSInterpolation' not in settings.keys():
-                settings['GPSInterpolation'] = 'None'
-            if 'GPSHDOPFilter' not in settings.keys():
-                settings['GPSHDOPFilter'] = 'Off'
-                settings['GPSHDOPFilterMax'] = []
-                settings['GPSHDOPFilterChange'] = []
-            if 'GPSSmoothFilter' not in settings.keys():
-                settings['GPSSmoothFilter'] = 'Off'
-
-        # VTG settings
-        vtg_present = False
-        for idx in self.checked_transect_idx:
-            if self.transects[idx].boat_vel.vtg_vel is not None:
-                vtg_present = True
-                transect = self.transects[idx]
-                break
-
-        if vtg_present:
-            settings['GPSHDOPFilter'] = transect.boat_vel.vtg_vel.gps_HDOP_filter
-            settings['GPSHDOPFilterMax'] = transect.boat_vel.vtg_vel.gps_HDOP_filter_max
-            settings['GPSHDOPFilterChange'] = transect.boat_vel.vtg_vel.gps_HDOP_filter_change
-            settings['GPSSmoothFilter'] = transect.boat_vel.vtg_vel.smooth_filter
-            settings['GPSInterpolation'] = transect.boat_vel.vtg_vel.interpolate
-
-        # Depth Settings
-        settings['depthAvgMethod'] = transect.depths.bt_depths.avg_method
-        settings['depthValidMethod'] = transect.depths.bt_depths.valid_data_method
-        
-        # Depth settings are always applied to all available depth sources.
-        # Only those saved in the bt_depths are used here but are applied to all sources
-        settings['depthFilterType'] = transect.depths.bt_depths.filter_type
-        settings['depthReference'] = transect.depths.selected
-        settings['depthComposite'] = transect.depths.composite
-        select = getattr(transect.depths, transect.depths.selected)
-        settings['depthInterpolation'] = select.interp_type
-        
-        # Extrap Settings
-        if self.extrap_fit is None:
-            settings['extrapTop'] = transect.extrap.top_method
-            settings['extrapBot'] = transect.extrap.bot_method
-            settings['extrapExp'] = transect.extrap.exponent
-        else:
-            settings['extrapTop'] = self.extrap_fit.sel_fit[-1].top_method
-            settings['extrapBot'] = self.extrap_fit.sel_fit[-1].bot_method
-            settings['extrapExp'] = self.extrap_fit.sel_fit[-1].exponent
-
-        # Use of self.use_weighted allows a QRev mat file to be loaded and initially processed with the settings from
-        # the QRev file but upon reprocessing the self.use_weights will be set to the options setting for use_weights
-        settings['UseWeighted'] = self.use_weighted
-
-        # Edge Settings
-        settings['edgeVelMethod'] = transect.edges.vel_method
-        settings['edgeRecEdgeMethod'] = transect.edges.rec_edge_method
-
-        settings['UseMeasurementThresholds'] = transect.w_vel.use_measurement_thresholds
-        settings['UsePingType'] = self.use_ping_type
-
-        return settings
-
-    def qrev_default_settings(self, check_user_excluded_dist=False, use_weighted=False):
-        """QRev default and filter settings for a measurement.
-        """
-
-        settings = dict()
-
-        if len(self.checked_transect_idx) > 0:
-            ref_transect = self.checked_transect_idx[0]
-        else:
-            ref_transect = 0
-
-        # Navigation reference
-        settings['NavRef'] = self.transects[ref_transect].boat_vel.selected
-
-        # Composite tracks
-        settings['CompTracks'] = 'Off'
-
-        # Water track filter settings
-        settings['WTbeamFilter'] = -1
-        settings['WTdFilter'] = 'Auto'
-        settings['WTdFilterThreshold'] = np.nan
-        settings['WTwFilter'] = 'Auto'
-        settings['WTwFilterThreshold'] = np.nan
-        settings['WTsmoothFilter'] = 'Off'
-
-        if self.transects[ref_transect].adcp.manufacturer == 'TRDI':
-            settings['WTsnrFilter'] = 'Off'
-        else:
-            settings['WTsnrFilter'] = 'Auto'
-
-        if check_user_excluded_dist:
-            temp = [x.w_vel for x in self.transects]
-            excluded_dist = np.nanmin([x.excluded_dist_m for x in temp])
-        else:
-            excluded_dist = 0
-        if excluded_dist < 0.158 and self.transects[ref_transect].adcp.model == 'M9':
-            settings['WTExcludedDistance'] = 0.16
-        elif excluded_dist < 0.248 and self.transects[ref_transect].adcp.model == 'RioPro':
-            settings['WTExcludedDistance'] = 0.25
-        else:
-            settings['WTExcludedDistance'] = excluded_dist
-
-        # Bottom track filter settings
-        settings['BTbeamFilter'] = -1
-        settings['BTdFilter'] = 'Auto'
-        settings['BTdFilterThreshold'] = np.nan
-        settings['BTwFilter'] = 'Auto'
-        settings['BTwFilterThreshold'] = np.nan
-        settings['BTsmoothFilter'] = 'Off'
-
-        # GGA Filter settings
-        settings['ggaDiffQualFilter'] = 2
-        settings['ggaAltitudeFilter'] = 'Auto'
-        settings['ggaAltitudeFilterChange'] = np.nan
-
-        # VTG filter settings
-        settings['vtgsmoothFilter'] = 'Off'
-
-        # GGA and VTG filter settings
-        settings['GPSHDOPFilter'] = 'Auto'
-        settings['GPSHDOPFilterMax'] = np.nan
-        settings['GPSHDOPFilterChange'] = np.nan
-        settings['GPSSmoothFilter'] = 'Off'
-
-        # Depth Averaging
-        settings['depthAvgMethod'] = 'IDW'
-        settings['depthValidMethod'] = 'QRev'
-
-        # Depth Reference
-
-        # Default to 4 beam depth average
-        settings['depthReference'] = 'bt_depths'
-        # Depth settings
-        settings['depthFilterType'] = 'Smooth'
-        settings['depthComposite'] = 'Off'
-        for transect in self.transects:
-            if transect.checked:
-
-                if transect.depths.vb_depths is not None or transect.depths.ds_depths is not None:
-                    settings['depthComposite'] = 'On'
-                    break
-                else:
-                    settings['depthComposite'] = 'Off'
-                    break
-
-        # Interpolation settings
-        settings = self.qrev_default_interpolation_methods(settings)
-
-        # Edge settings
-        settings['edgeVelMethod'] = 'MeasMag'
-        settings['edgeRecEdgeMethod'] = 'Fixed'
-
-        # Extrapolation Settings
-        settings['extrapTop'] = 'Power'
-        settings['extrapBot'] = 'Power'
-        settings['extrapExp'] = 0.1667
-        settings['UseWeighted'] = use_weighted
-
-        settings['UseMeasurementThresholds'] = False
-        settings['UsePingType'] = True
-
-        return settings
-
-    def update_qa(self):
-        self.qa = QAData(self)
-
-    @staticmethod
-    def no_filter_interp_settings(self):
-        """Settings to turn off all filters and interpolations.
-
-        Returns
-        -------
-        settings: dict
-            Dictionary of all processing settings.
-        """
-
-        settings = dict()
-        if len(self.checked_transect_idx) > 0:
-            ref_transect = self.checked_transect_idx[0]
-        else:
-            ref_transect = 0
-
-        settings['NavRef'] = self.transects[ref_transect].boatVel.selected
-
-        # Composite tracks
-        settings['CompTracks'] = 'Off'
-
-        # Water track filter settings
-        settings['WTbeamFilter'] = 3
-        settings['WTdFilter'] = 'Off'
-        settings['WTdFilterThreshold'] = np.nan
-        settings['WTwFilter'] = 'Off'
-        settings['WTwFilterThreshold'] = np.nan
-        settings['WTsmoothFilter'] = 'Off'
-        settings['WTsnrFilter'] = 'Off'
-
-        temp = [x.w_vel for x in self.transects]
-        excluded_dist = np.nanmin([x.excluded_dist_m for x in temp])
-
-        settings['WTExcludedDistance'] = excluded_dist
-
-        # Bottom track filter settings
-        settings['BTbeamFilter'] = 3
-        settings['BTdFilter'] = 'Off'
-        settings['BTdFilterThreshold'] = np.nan
-        settings['BTwFilter'] = 'Off'
-        settings['BTwFilterThreshold'] = np.nan
-        settings['BTsmoothFilter'] = 'Off'
-
-        # GGA filter settings
-        settings['ggaDiffQualFilter'] = 1
-        settings['ggaAltitudeFilter'] = 'Off'
-        settings['ggaAltitudeFilterChange'] = np.nan
-
-        # VTG filter settings
-        settings['vtgsmoothFilter'] = 'Off'
-
-        # GGA and VTG filter settings
-        settings['GPSHDOPFilter'] = 'Off'
-        settings['GPSHDOPFilterMax'] = np.nan
-        settings['GPSHDOPFilterChange'] = np.nan
-        settings['GPSSmoothFilter'] = 'Off'
-
-        # Depth Averaging
-        settings['depthAvgMethod'] = 'IDW'
-        settings['depthValidMethod'] = 'QRev'
-
-        # Depth Reference
-
-        # Default to 4 beam depth average
-        settings['depthReference'] = 'btDepths'
-        # Depth settings
-        settings['depthFilterType'] = 'None'
-        settings['depthComposite'] = 'Off'
-
-        # Interpolation settings
-        settings['BTInterpolation'] = 'None'
-        settings['WTEnsInterpolation'] = 'None'
-        settings['WTCellInterpolation'] = 'None'
-        settings['GPSInterpolation'] = 'None'
-        settings['depthInterpolation'] = 'None'
-        settings['WTwtDepthFilter'] = 'Off'
-
-        # Edge Settings
-        settings['edgeVelMethod'] = 'MeasMag'
-        # settings['edgeVelMethod'] = 'Profile'
-        settings['edgeRecEdgeMethod'] = 'Fixed'
-
-        return settings
-
-    def selected_transects_changed(self, selected_transects_idx):
-        """Handle changes in the transects selected for computing discharge.
-
-        Parameters
-        ----------
-        selected_transects_idx: list
-            List of indices of the transects used to compute discharge
-        """
-
-        # Update transect settings
-        self.checked_transect_idx = []
-        for n in range(len(self.transects)):
-            if n in selected_transects_idx:
-                self.transects[n].checked = True
-                self.checked_transect_idx.append(n)
-            else:
-                self.transects[n].checked = False
-
-        # Update computations
-        self.create_filter_composites()
-        settings = self.current_settings()
-        self.apply_settings(settings=settings)
-
-    def compute_discharge(self):
-        """Computes the discharge for all transects in the measurement.
-        """
-
-        self.discharge = []
-        for transect in self.transects:
-            q = QComp()
-            q.populate_data(data_in=transect, moving_bed_data=self.mb_tests)
-            self.discharge.append(q)
-
-    def compute_uncertainty(self):
-        """Computes uncertainty using QRev model and Oursin model if selected.
-        """
-
-        self.uncertainty = Uncertainty()
-        self.uncertainty.compute_uncertainty(self)
-        self.qa = QAData(self)
-
-        if self.run_oursin:
-            if self.oursin is None:
-                self.oursin = Oursin()
-                user_advanced_settings = None
-                u_measurement_user = None
-            else:
-                user_advanced_settings = self.oursin.user_advanced_settings
-                u_measurement_user = self.oursin.u_measurement_user
-                self.oursin = Oursin()
-            self.oursin.compute_oursin(self,
-                                       user_advanced_settings=user_advanced_settings,
-                                       u_measurement_user=u_measurement_user)
-
-    @staticmethod
-    def compute_edi(meas, selected_idx, percents):
-        """Computes the locations and vertical properties for the user selected transect and
-        flow percentages.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        selected_idx: int
-            Index of selected transect
-        percents: list
-            List of selected flow percents
-        """
-
-        # Get transect and discharge data
-        transect = meas.transects[selected_idx]
-        discharge = meas.discharge[selected_idx]
-
-        # Sort the percents in ascending order
-        percents.sort()
-
-        # Compute cumulative discharge
-        q_cum = np.nancumsum(discharge.middle_ens + discharge.top_ens + discharge.bottom_ens)
-
-        # Adjust for moving-bed conditions
-        q_cum = q_cum * discharge.correction_factor
-
-        # Adjust q for starting edge
-        if transect.start_edge == 'Left':
-            q_cum = q_cum + discharge.left
-            q_cum[-1] = q_cum[-1] + discharge.right
-            start_dist = transect.edges.left.distance_m
-        else:
-            q_cum = q_cum + discharge.right
-            q_cum[-1] = q_cum[-1] + discharge.left
-            start_dist = transect.edges.right.distance_m
-
-        # Determine ensemble at each percent
-        ensembles = []
-        q_target = []
-        for percent in percents:
-            q_target.append(q_cum[-1] * percent / 100)
-            if q_target[-1] > 0:
-                ensembles.append(np.where(q_cum > q_target[-1])[0][0])
-            if q_target[-1] < 0:
-                ensembles.append(np.where(q_cum < q_target[-1])[0][0])
-
-        # Compute distance from start bank
-        boat_vel_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
-        track_x = np.nancumsum(boat_vel_selected.u_processed_mps[transect.in_transect_idx] *
-                               transect.date_time.ens_duration_sec[transect.in_transect_idx])
-        track_y = np.nancumsum(boat_vel_selected.v_processed_mps[transect.in_transect_idx] *
-                               transect.date_time.ens_duration_sec[transect.in_transect_idx])
-
-        dist = np.sqrt(track_x ** 2 + track_y ** 2) + start_dist
-
-        # Initialize variables for computing vertical data
-        n_pts_in_avg = int(len(q_cum) * 0.01)
-        depth_selected = getattr(transect.depths, transect.depths.selected)
-        q_actual = []
-        distance = []
-        lat = []
-        lon = []
-        depth = []
-        velocity = []
-
-        # Compute data for each vertical
-        for ensemble in ensembles:
-            q_actual.append(q_cum[ensemble])
-            distance.append(dist[ensemble])
-            # Report lat and lon if available
-            try:
-                lat.append(transect.gps.gga_lat_ens_deg[ensemble])
-                lon.append(transect.gps.gga_lon_ens_deg[ensemble])
-            except (ValueError, AttributeError, TypeError):
-                lat.append('')
-                lon.append('')
-            depth.append(depth_selected.depth_processed_m[ensemble])
-
-            # The velocity is an average velocity for ensembles +/- 1% of the total ensembles
-            # about the selected ensemble
-            u = np.nanmean(transect.w_vel.u_processed_mps[:, ensemble - n_pts_in_avg: ensemble + n_pts_in_avg + 1], 1)
-            v = np.nanmean(transect.w_vel.v_processed_mps[:, ensemble - n_pts_in_avg: ensemble + n_pts_in_avg + 1], 1)
-            velocity.append(np.sqrt(np.nanmean(u)**2 + np.nanmean(v)**2))
-
-        # Save computed results in a dictionary
-        edi_results = {'percent': percents, 'target_q': q_target, 'actual_q': q_actual, 'distance': distance,
-                       'depth': depth, 'velocity': velocity, 'lat': lat, 'lon': lon}
-        return edi_results
-
-    @staticmethod
-    def qrev_default_interpolation_methods(settings):
-        """Adds QRev default interpolation settings to existing settings data structure
-
-        Parameters
-        ----------
-        settings: dict
-            Dictionary of reference and filter settings
-
-        Returns
-        -------
-        settings: dict
-            Dictionary with reference, filter, and interpolation settings
-        """
-
-        settings['BTInterpolation'] = 'Linear'
-        settings['WTEnsInterpolation'] = 'abba'
-        settings['WTCellInterpolation'] = 'abba'
-        settings['GPSInterpolation'] = 'Linear'
-        settings['depthInterpolation'] = 'Linear'
-        settings['WTwtDepthFilter'] = 'On'
-
-        return settings
-
-    def change_extrapolation(self, method, top=None, bot=None, exp=None, extents=None, threshold=None, compute_q=True,
-                             use_weighted=False):
-        """Applies the selected extrapolation method to each transect.
-
-        Parameters
-        ----------
-        method: str
-            Method of computation Automatic or Manual
-        top: str
-            Top extrapolation method
-        bot: str
-            Bottom extrapolation method
-        exp: float
-            Exponent for power or no slip methods
-        threshold: float
-            Threshold as a percent for determining if a median is valid
-        extents: list
-            Percent of discharge, does not account for transect direction
-        compute_q: bool
-            Specifies if the discharge should be computed
-        use_weighted: bool
-            Specifies is discharge weighting is used
-        """
-
-        if top is None:
-            top = self.extrap_fit.sel_fit[-1].top_method
-        if bot is None:
-            bot = self.extrap_fit.sel_fit[-1].bot_method
-        if exp is None:
-            exp = self.extrap_fit.sel_fit[-1].exponent
-        if extents is not None:
-            self.extrap_fit.subsection = extents
-        if threshold is not None:
-            self.extrap_fit.threshold = threshold
-
-        data_type = self.extrap_fit.norm_data[-1].data_type
-        if data_type is None:
-            data_type = 'q'
-
-        if method == 'Manual':
-            self.extrap_fit.fit_method = 'Manual'
-            for transect in self.transects:
-                transect.extrap.set_extrap_data(top=top, bot=bot, exp=exp)
-            self.extrap_fit.process_profiles(transects=self.transects, data_type=data_type, use_weighted=use_weighted)
-        else:
-            self.extrap_fit.fit_method = 'Automatic'
-            self.extrap_fit.process_profiles(transects=self.transects, data_type=data_type, use_weighted=use_weighted)
-            for transect in self.transects:
-                transect.extrap.set_extrap_data(top=self.extrap_fit.sel_fit[-1].top_method,
-                                                bot=self.extrap_fit.sel_fit[-1].bot_method,
-                                                exp=self.extrap_fit.sel_fit[-1].exponent)
-
-        if compute_q:
-            self.extrap_fit.q_sensitivity = ExtrapQSensitivity()
-            self.extrap_fit.q_sensitivity.populate_data(transects=self.transects,
-                                                        extrap_fits=self.extrap_fit.sel_fit)
-
-            self.compute_discharge()
-
-    @staticmethod
-    def measurement_duration(self):
-        """Computes the duration of the measurement.
-        """
-
-        duration = 0
-        for transect in self.transects:
-            if transect.checked:
-                duration += transect.date_time.transect_duration_sec
-        return duration
-
-    @staticmethod
-    def mean_discharges(self):
-        """Computes the mean discharge for the measurement.
-        """
-
-        # Initialize lists
-        total_q = []
-        uncorrected_q = []
-        top_q = []
-        bot_q = []
-        mid_q = []
-        left_q = []
-        right_q = []
-        int_cells_q = []
-        int_ensembles_q = []
-
-        for n, transect in enumerate(self.transects):
-            if transect.checked:
-                total_q.append(self.discharge[n].total)
-                uncorrected_q.append(self.discharge[n].total_uncorrected)
-                top_q.append(self.discharge[n].top)
-                mid_q.append(self.discharge[n].middle)
-                bot_q.append(self.discharge[n].bottom)
-                left_q.append(self.discharge[n].left)
-                right_q.append(self.discharge[n].right)
-                int_cells_q.append(self.discharge[n].int_cells)
-                int_ensembles_q.append(self.discharge[n].int_ens)
-
-        discharge = {'total_mean': np.nanmean(total_q),
-                     'uncorrected_mean': np.nanmean(uncorrected_q),
-                     'top_mean': np.nanmean(top_q),
-                     'mid_mean': np.nanmean(mid_q),
-                     'bot_mean': np.nanmean(bot_q),
-                     'left_mean': np.nanmean(left_q),
-                     'right_mean': np.nanmean(right_q),
-                     'int_cells_mean': np.nanmean(int_cells_q),
-                     'int_ensembles_mean': np.nanmean(int_ensembles_q)}
-
-        return discharge
-
-    @staticmethod
-    def compute_measurement_properties(self):
-        """Computes characteristics of the transects and measurement that assist in evaluating the consistency
-        of the transects.
-
-        Returns
-        -------
-        trans_prop: dict
-        Dictionary of transect properties
-            width: float
-                width in m
-            width_cov: float
-                coefficient of variation of width in percent
-            area: float
-                cross sectional area in m**2
-            area_cov: float
-                coefficient of variation of are in percent
-            avg_boat_speed: float
-                average boat speed in mps
-            avg_boat_course: float
-                average boat course in degrees
-            avg_water_speed: float
-                average water speed in mps
-            avg_water_dir: float
-                average water direction in degrees
-            avg_depth: float
-                average depth in m
-            max_depth: float
-                maximum depth in m
-            max_water_speed: float
-                99th percentile of water speed in mps
-        """
-
-        # Initialize variables
-        checked_idx = np.array([], dtype=int)
-        n_transects = len(self.transects)
-        trans_prop = {'width': np.array([np.nan] * (n_transects + 1)),
-                      'width_cov': np.array([np.nan] * (n_transects + 1)),
-                      'area': np.array([np.nan] * (n_transects + 1)),
-                      'area_cov': np.array([np.nan] * (n_transects + 1)),
-                      'avg_boat_speed': np.array([np.nan] * (n_transects + 1)),
-                      'avg_boat_course': np.array([np.nan] * n_transects),
-                      'avg_water_speed': np.array([np.nan] * (n_transects + 1)),
-                      'avg_water_dir': np.array([np.nan] * (n_transects + 1)),
-                      'avg_depth': np.array([np.nan] * (n_transects + 1)),
-                      'max_depth': np.array([np.nan] * (n_transects + 1)),
-                      'max_water_speed': np.array([np.nan] * (n_transects + 1))}
-
-        # Process each transect
-        for n, transect in enumerate(self.transects):
-
-            # Compute boat track properties
-            boat_track = BoatStructure.compute_boat_track(transect)
-
-            # Get boat speeds
-            in_transect_idx = transect.in_transect_idx
-            if getattr(transect.boat_vel, transect.boat_vel.selected) is not None:
-                boat_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
-                u_boat = boat_selected.u_processed_mps[in_transect_idx]
-                v_boat = boat_selected.v_processed_mps[in_transect_idx]
-            else:
-                u_boat = nans(transect.boat_vel.bt_vel.u_processed_mps[in_transect_idx].shape)
-                v_boat = nans(transect.boat_vel.bt_vel.v_processed_mps[in_transect_idx].shape)
-
-            if np.logical_not(np.all(np.isnan(boat_track['track_x_m']))):
-
-                # Compute boat course and mean speed
-                [course_radians, dmg] = cart2pol(boat_track['track_x_m'][-1], boat_track['track_y_m'][-1])
-                trans_prop['avg_boat_course'][n] = rad2azdeg(course_radians)
-                trans_prop['avg_boat_speed'][n] = np.nanmean(np.sqrt(u_boat**2 + v_boat**2))
-
-                # Compute width
-                trans_prop['width'][n] = np.nansum([dmg, transect.edges.left.distance_m,
-                                                    transect.edges.right.distance_m])
-
-                # Project the shiptrack onto a line from the beginning to end of the transect
-                unit_x, unit_y = pol2cart(course_radians, 1)
-                bt = np.array([boat_track['track_x_m'], boat_track['track_y_m']]).T
-                dot_prod = bt @ np.array([unit_x, unit_y])
-                projected_x = dot_prod * unit_x
-                projected_y = dot_prod * unit_y
-                station = np.sqrt(projected_x**2 + projected_y**2)
-
-                # Get selected depth object
-                depth = getattr(transect.depths, transect.depths.selected)
-                depth_a = np.copy(depth.depth_processed_m)
-                depth_a[np.isnan(depth_a)] = 0
-                # Compute area of the moving-boat portion of the cross section using trapezoidal integration.
-                # This method is consistent with AreaComp but is different from QRev in Matlab
-                area_moving_boat = np.abs(np.trapz(depth_a[in_transect_idx], station[in_transect_idx]))
-
-                # Compute area of left edge
-                edge_type = transect.edges.left.type
-                coef = 1
-                if edge_type == 'Triangular':
-                    coef = 0.5
-                elif edge_type == 'Rectangular':
-                    coef = 1.0
-                elif edge_type == 'Custom':
-                    coef = 0.5 + (transect.edges.left.cust_coef - 0.3535)
-                elif edge_type == 'User Q':
-                    coef = 0.5
-                edge_idx = QComp.edge_ensembles('left', transect)
-                edge_depth = np.nanmean(depth.depth_processed_m[edge_idx])
-                area_left = edge_depth * transect.edges.left.distance_m * coef
-
-                # Compute area of right edge
-                edge_type = transect.edges.right.type
-                if edge_type == 'Triangular':
-                    coef = 0.5
-                elif edge_type == 'Rectangular':
-                    coef = 1.0
-                elif edge_type == 'Custom':
-                    coef = 0.5 + (transect.edges.right.cust_coef - 0.3535)
-                elif edge_type == 'User Q':
-                    coef = 0.5
-                edge_idx = QComp.edge_ensembles('right', transect)
-                edge_depth = np.nanmean(depth.depth_processed_m[edge_idx])
-                area_right = edge_depth * transect.edges.right.distance_m * coef
-
-                # Compute total cross sectional area
-                trans_prop['area'][n] = np.nansum([area_left, area_moving_boat, area_right])
-
-                # Compute average water speed
-                trans_prop['avg_water_speed'][n] = self.discharge[n].total / trans_prop['area'][n]
-
-                # Compute flow direction using discharge weighting
-                u_water = transect.w_vel.u_processed_mps[:, in_transect_idx]
-                v_water = transect.w_vel.v_processed_mps[:, in_transect_idx]
-                weight = np.abs(self.discharge[n].middle_cells)
-                u = np.nansum(np.nansum(u_water * weight)) / np.nansum(np.nansum(weight))
-                v = np.nansum(np.nansum(v_water * weight)) / np.nansum(np.nansum(weight))
-                trans_prop['avg_water_dir'][n] = np.arctan2(u, v) * 180 / np.pi
-                if trans_prop['avg_water_dir'][n] < 0:
-                    trans_prop['avg_water_dir'][n] = trans_prop['avg_water_dir'][n] + 360
-
-                # Compute average and max depth
-                # This is a deviation from QRev in Matlab which simply averaged all the depths
-                trans_prop['avg_depth'][n] = trans_prop['area'][n] / trans_prop['width'][n]
-                trans_prop['max_depth'][n] = np.nanmax(depth.depth_processed_m[in_transect_idx])
-
-                # Compute max water speed using the 99th percentile
-                water_speed = np.sqrt(u_water**2 + v_water**2)
-                trans_prop['max_water_speed'][n] = np.nanpercentile(water_speed, 99)
-                if transect.checked:
-                    checked_idx = np.append(checked_idx, n)
-
-            # Only transects used for discharge are included in measurement properties
-            if len(checked_idx) > 0:
-                n = n_transects
-                trans_prop['width'][n] = np.nanmean(trans_prop['width'][checked_idx])
-                trans_prop['width_cov'][n] = (np.nanstd(trans_prop['width'][checked_idx], ddof=1) /
-                                              trans_prop['width'][n]) * 100
-                trans_prop['area'][n] = np.nanmean(trans_prop['area'][checked_idx])
-                trans_prop['area_cov'][n] = (np.nanstd(trans_prop['area'][checked_idx], ddof=1) /
-                                             trans_prop['area'][n]) * 100
-                trans_prop['avg_boat_speed'][n] = np.nanmean(trans_prop['avg_boat_speed'][checked_idx])
-                trans_prop['avg_water_speed'][n] = np.nanmean(trans_prop['avg_water_speed'][checked_idx])
-                trans_prop['avg_depth'][n] = np.nanmean(trans_prop['avg_depth'][checked_idx])
-                trans_prop['max_depth'][n] = np.nanmax(trans_prop['max_depth'][checked_idx])
-                trans_prop['max_water_speed'][n] = np.nanmax(trans_prop['max_water_speed'][checked_idx])
-
-                # Compute average water direction using vector coordinates to avoid the problem of averaging
-                # fluctuations that cross zero degrees
-                x_coord = []
-                y_coord = []
-                for idx in checked_idx:
-                    water_dir_rad = azdeg2rad(trans_prop['avg_water_dir'][idx])
-                    x, y = pol2cart(water_dir_rad, 1)
-                    x_coord.append(x)
-                    y_coord.append(y)
-                avg_water_dir_rad, _ = cart2pol(np.mean(x_coord), np.mean(y_coord))
-                trans_prop['avg_water_dir'][n] = rad2azdeg(avg_water_dir_rad)
-
-        return trans_prop
-
-    @staticmethod
-    def checked_transects(meas):
-        """Create a list of indices of the checked transects.
-        """
-
-        checked_transect_idx = []
-        for n in range(len(meas.transects)):
-            if meas.transects[n].checked:
-                checked_transect_idx.append(n)
-        return checked_transect_idx
-
-    @staticmethod
-    def compute_time_series(meas, variable=None):
-        """Computes the time series using serial time for any variable.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        variable: np.ndarray()
-            Data for which the time series is requested
-        """
-
-        # Initialize variables
-        data = np.array([])
-        serial_time = np.array([])
-        idx_transects = Measurement.checked_transects(meas)
-
-        # Process transects
-        for idx in idx_transects:
-            if variable == 'Temperature':
-                data = np.append(data, meas.transects[idx].sensors.temperature_deg_c.internal.data)
-            ens_cum_time = np.nancumsum(meas.transects[idx].date_time.ens_duration_sec)
-            ens_time = meas.transects[idx].date_time.start_serial_time + ens_cum_time
-            serial_time = np.append(serial_time, ens_time)
-
-        return data, serial_time
-
-    def xml_output(self, version, file_name):
-        channel = ETree.Element('Channel', QRevFilename=os.path.basename(file_name[:-4]), QRevVersion=version)
-
-        # (2) SiteInformation Node
-        if self.station_name or self.station_number:
-            site_info = ETree.SubElement(channel, 'SiteInformation')
-
-            # (3) StationName Node
-            if self.station_name:
-                ETree.SubElement(site_info, 'StationName', type='char').text = self.station_name
-
-            # (3) SiteID Node
-            if type(self.station_number) is str:
-                ETree.SubElement(site_info, 'SiteID', type='char').text = self.station_number
-            else:
-                ETree.SubElement(site_info, 'SiteID', type='char').text = str(self.station_number)
-
-            # (3) Persons
-            ETree.SubElement(site_info, 'Persons', type='char').text = self.persons
-
-            # (3) Measurement Number
-            ETree.SubElement(site_info, 'MeasurementNumber', type='char').text = self.meas_number
-
-            # (3) Stage start
-            temp = self.stage_start_m
-            ETree.SubElement(site_info, 'StageStart', type='double', unitsCode='m').text = '{:.5f}'.format(temp)
-
-            # (4) Stage start
-            temp = self.stage_end_m
-            ETree.SubElement(site_info, 'StageEnd', type='double', unitsCode='m').text = '{:.5f}'.format(temp)
-
-            # (3) Stage start
-            temp = self.stage_meas_m
-            ETree.SubElement(site_info, 'StageMeasurement', type='double', unitsCode='m').text = '{:.5f}'.format(temp)
-
-        # (2) QA Node
-        qa = ETree.SubElement(channel, 'QA')
-
-        # (3) DiagnosticTestResult Node
-        if len(self.system_tst) > 0:
-            last_test = self.system_tst[-1].data
-            failed_idx = last_test.count('FAIL')
-            if failed_idx == 0:
-                test_result = 'Pass'
-            else:
-                test_result = str(failed_idx) + ' Failed'
-        else:
-            test_result = 'None'
-        ETree.SubElement(qa, 'DiagnosticTestResult', type='char').text = test_result
-
-        # (3) CompassCalibrationResult Node
-        try:
-            last_eval = self.compass_eval[-1]
-            # StreamPro, RR
-            idx = last_eval.data.find('Typical Heading Error: <')
-            if idx == (-1):
-                # Rio Grande
-                idx = last_eval.data.find('>>> Total error:')
-                if idx != (-1):
-                    idx_start = idx + 17
-                    idx_end = idx_start + 10
-                    comp_error = last_eval.data[idx_start:idx_end]
-                    comp_error = ''.join([n for n in comp_error if n.isdigit() or n == '.'])
-                else:
-                    comp_error = ''
-            else:
-                # StreamPro, RR
-                idx_start = idx + 24
-                idx_end = idx_start + 10
-                comp_error = last_eval.data[idx_start:idx_end]
-                comp_error = ''.join([n for n in comp_error if n.isdigit() or n == '.'])
-
-            # Evaluation could not be determined
-            if not comp_error:
-                ETree.SubElement(qa, 'CompassCalibrationResult', type='char').text = 'Yes'
-            elif comp_error == '':
-                ETree.SubElement(qa, 'CompassCalibrationResult', type='char').text = 'No'
-            else:
-                ETree.SubElement(qa, 'CompassCalibrationResult', type='char').text = 'Max ' + comp_error
-
-        except (IndexError, TypeError, AttributeError):
-            try:
-                if len(self.compass_cal) > 0:
-                    ETree.SubElement(qa, 'CompassCalibrationResult', type='char').text = 'Yes'
-                else:
-                    ETree.SubElement(qa, 'CompassCalibrationResult', type='char').text = 'No'
-            except (IndexError, TypeError):
-                ETree.SubElement(qa, 'CompassCalibrationResult', type='char').text = 'No'
-
-        # (3) MovingBedTestType Node
-        if not self.mb_tests:
-            ETree.SubElement(qa, 'MovingBedTestType', type='char').text = 'None'
-        else:
-            selected_idx = [i for (i, val) in enumerate(self.mb_tests) if val.selected is True]
-            if len(selected_idx) >= 1:
-                temp = self.mb_tests[selected_idx[0]].type
-            else:
-                temp = self.mb_tests[-1].type
-            ETree.SubElement(qa, 'MovingBedTestType', type='char').text = str(temp)
-
-            # MovingBedTestResult Node
-            temp = 'Unknown'
-            for idx in selected_idx:
-                if self.mb_tests[idx].moving_bed == 'Yes':
-                    temp = 'Yes'
-                    break
-                elif self.mb_tests[idx].moving_bed == 'No':
-                    temp = 'No'
-
-            ETree.SubElement(qa, 'MovingBedTestResult', type='char').text = temp
-
-        # (3) DiagnosticTest and Text Node
-        if self.system_tst:
-            test_text = ''
-            for test in self.system_tst:
-                test_text += test.data
-            diag_test = ETree.SubElement(qa, 'DiagnosticTest')
-            ETree.SubElement(diag_test, 'Text', type='char').text = test_text
-
-        # (3) CompassCalibration and Text Node
-        compass_text = ''
-        try:
-            for each in self.compass_cal:
-                if self.transects[self.checked_transect_idx[0]].adcp.manufacturer == 'SonTek':
-                    idx = each.data.find('CAL_TIME')
-                    compass_text += each.data[idx:]
-                else:
-                    compass_text += each.data
-        except (IndexError, TypeError, AttributeError):
-            pass
-        try:
-            for each in self.compass_eval:
-                if self.transects[self.checked_transect_idx[0]].adcp.manufacturer == 'SonTek':
-                    idx = each.data.find('CAL_TIME')
-                    compass_text += each.data[idx:]
-                else:
-                    compass_text += each.data
-        except (IndexError, TypeError, AttributeError):
-            pass
-
-        if len(compass_text) > 0:
-            comp_cal = ETree.SubElement(qa, 'CompassCalibration')
-            ETree.SubElement(comp_cal, 'Text', type='char').text = compass_text
-
-        # (3) MovingBedTest Node
-        if self.mb_tests:
-            for each in self.mb_tests:
-                mbt = ETree.SubElement(qa, 'MovingBedTest')
-
-                # (4) Filename Node
-                ETree.SubElement(mbt, 'Filename', type='char').text = each.transect.file_name
-
-                # (4) TestType Node
-                ETree.SubElement(mbt, 'TestType', type='char').text = each.type
-
-                # (4) Duration Node
-                ETree.SubElement(mbt, 'Duration', type='double',
-                                 unitsCode='sec').text = '{:.2f}'.format(each.duration_sec)
-
-                # (4) PercentInvalidBT Node
-                ETree.SubElement(mbt, 'PercentInvalidBT', type='double').text = '{:.4f}'.format(each.percent_invalid_bt)
-
-                # (4) HeadingDifference Node
-                if each.compass_diff_deg:
-                    temp = '{:.2f}'.format(each.compass_diff_deg)
-                else:
-                    temp = ''
-                ETree.SubElement(mbt, 'HeadingDifference', type='double', unitsCode='deg').text = temp
-
-                # (4) MeanFlowDirection Node
-                if each.flow_dir:
-                    temp = '{:.2f}'.format(each.flow_dir)
-                else:
-                    temp = ''
-                ETree.SubElement(mbt, 'MeanFlowDirection', type='double', unitsCode='deg').text = temp
-
-                # (4) MovingBedDirection Node
-                if each.mb_dir:
-                    temp = '{:.2f}'.format(each.mb_dir)
-                else:
-                    temp = ''
-                ETree.SubElement(mbt, 'MovingBedDirection', type='double', unitsCode='deg').text = temp
-
-                # (4) DistanceUpstream Node
-                ETree.SubElement(mbt, 'DistanceUpstream', type='double', unitsCode='m').text = \
-                    '{:.4f}'.format(each.dist_us_m)
-
-                # (4) MeanFlowSpeed Node
-                ETree.SubElement(mbt, 'MeanFlowSpeed', type='double', unitsCode='mps').text = \
-                    '{:.4f}'.format(each.flow_spd_mps)
-
-                # (4) MovingBedSpeed Node
-                ETree.SubElement(mbt, 'MovingBedSpeed', type='double', unitsCode='mps').text = \
-                    '{:.4f}'.format(each.mb_spd_mps)
-
-                # (4) PercentMovingBed Node
-                ETree.SubElement(mbt, 'PercentMovingBed', type='double').text = '{:.2f}'.format(each.percent_mb)
-
-                # (4) TestQuality Node
-                ETree.SubElement(mbt, 'TestQuality', type='char').text = each.test_quality
-
-                # (4) MovingBedPresent Node
-                ETree.SubElement(mbt, 'MovingBedPresent', type='char').text = each.moving_bed
-
-                # (4) UseToCorrect Node
-                if each.use_2_correct:
-                    ETree.SubElement(mbt, 'UseToCorrect', type='char').text = 'Yes'
-                else:
-                    ETree.SubElement(mbt, 'UseToCorrect', type='char').text = 'No'
-
-                # (4) UserValid Node
-                if each.user_valid:
-                    ETree.SubElement(mbt, 'UserValid', type='char').text = 'Yes'
-                else:
-                    ETree.SubElement(mbt, 'UserValid', type='char').text = 'No'
-
-                # (4) Message Node
-                if len(each.messages) > 0:
-                    str_out = ''
-                    for message in each.messages:
-                        str_out = str_out + message + '; '
-                    ETree.SubElement(mbt, 'Message', type='char').text = str_out
-
-        # (3) TemperatureCheck Node
-        temp_check = ETree.SubElement(qa, 'TemperatureCheck')
-
-        # (4) VerificationTemperature Node
-        if not np.isnan(self.ext_temp_chk['user']):
-            ETree.SubElement(temp_check, 'VerificationTemperature', type='double', unitsCode='degC').text = \
-                '{:.2f}'.format(self.ext_temp_chk['user'])
-
-        # (4) InstrumentTemperature Node
-        if not np.isnan(self.ext_temp_chk['adcp']):
-            ETree.SubElement(temp_check, 'InstrumentTemperature', type='double',
-                             unitsCode='degC').text = '{:.2f}'.format(self.ext_temp_chk['adcp'])
-
-        # (4) TemperatureChange Node:
-        temp_all = np.array([np.nan])
-        for each in self.transects:
-            # Check for situation where user has entered a constant temperature
-            temperature_selected = getattr(each.sensors.temperature_deg_c, each.sensors.temperature_deg_c.selected)
-            temperature = temperature_selected.data
-            if each.sensors.temperature_deg_c.selected != 'user':
-                # Temperatures for ADCP.
-                temp_all = np.concatenate((temp_all, temperature))
-            else:
-                # User specified constant temperature.
-                # Concatenate a matrix of size of internal data with repeated user values.
-                user_arr = np.tile(each.sensors.temperature_deg_c.user.data,
-                                   (np.size(each.sensors.temperature_deg_c.internal.data)))
-                temp_all = np.concatenate((temp_all, user_arr))
-
-        t_range = np.nanmax(temp_all) - np.nanmin(temp_all)
-        ETree.SubElement(temp_check, 'TemperatureChange', type='double',
-                         unitsCode='degC').text = '{:.2f}'.format(t_range)
-
-        # (3) QRev_Message Node
-        qa_check_keys = ['bt_vel', 'compass', 'depths', 'edges', 'extrapolation', 'gga_vel', 'movingbed', 'system_tst',
-                         'temperature', 'transects', 'user', 'vtg_vel', 'w_vel']
-
-        # For each qa check retrieve messages
-        messages = []
-        for key in qa_check_keys:
-            qa_type = getattr(self.qa, key)
-            if qa_type['messages']:
-                for message in qa_type['messages']:
-                    if type(message) is str:
-                        if message[:3].isupper():
-                            messages.append([message, 1])
-                        else:
-                            messages.append([message, 2])
-                    else:
-                        messages.append(message)
-
-        # Sort messages with warning at top
-        messages.sort(key=lambda x: x[1])
-
-        if len(messages) > 0:
-            temp = ''
-            for message in messages:
-                temp = temp + message[0]
-            ETree.SubElement(qa, 'QRev_Message', type='char').text = temp
-
-        # (2) Instrument Node
-        instrument = ETree.SubElement(channel, 'Instrument')
-
-        # (3) Manufacturer Node
-        ETree.SubElement(instrument, 'Manufacturer', type='char').text = \
-            self.transects[self.checked_transect_idx[0]].adcp.manufacturer
-
-        # (3) Model Node
-        ETree.SubElement(instrument, 'Model', type='char').text = \
-            self.transects[self.checked_transect_idx[0]].adcp.model
-
-        # (3) SerialNumber Node
-        sn = self.transects[self.checked_transect_idx[0]].adcp.serial_num
-        ETree.SubElement(instrument, 'SerialNumber', type='char').text = str(sn)
-
-        # (3) FirmwareVersion Node
-        ver = self.transects[self.checked_transect_idx[0]].adcp.firmware
-        ETree.SubElement(instrument, 'FirmwareVersion', type='char').text = str(ver)
-
-        # (3) Frequency Node
-        freq = self.transects[self.checked_transect_idx[0]].adcp.frequency_khz
-        if type(freq) == np.ndarray:
-            freq = "Multi"
-        ETree.SubElement(instrument, 'Frequency', type='char', unitsCode='kHz').text = str(freq)
-
-        # (3) BeamAngle Node
-        ang = self.transects[self.checked_transect_idx[0]].adcp.beam_angle_deg
-        ETree.SubElement(instrument, 'BeamAngle', type='double', unitsCode='deg').text = '{:.1f}'.format(ang)
-
-        # (3) BlankingDistance Node
-        w_vel = []
-        for each in self.transects:
-            w_vel.append(each.w_vel)
-        blank = []
-        for each in w_vel:
-            blank.append(each.blanking_distance_m)
-        if isinstance(blank[0], float):
-            temp = np.mean(blank)
-            if self.transects[self.checked_transect_idx[0]].w_vel.excluded_dist_m > temp:
-                temp = self.transects[self.checked_transect_idx[0]].w_vel.excluded_dist_m
-        else:
-            temp = self.transects[self.checked_transect_idx[0]].w_vel.excluded_dist_m
-        ETree.SubElement(instrument, 'BlankingDistance', type='double', unitsCode='m').text = '{:.4f}'.format(temp)
-
-        # (3) InstrumentConfiguration Node
-        commands = ''
-        if self.transects[self.checked_transect_idx[0]].adcp.configuration_commands is not None:
-            for each in self.transects[self.checked_transect_idx[0]].adcp.configuration_commands:
-                if type(each) is str:
-                    commands += each + '  '
-            ETree.SubElement(instrument, 'InstrumentConfiguration', type='char').text = commands
-
-        # (2) Processing Node
-        processing = ETree.SubElement(channel, 'Processing')
-
-        # (3) SoftwareVersion Node
-        ETree.SubElement(processing, 'SoftwareVersion', type='char').text = version
-
-        # (3) Type Node
-        ETree.SubElement(processing, 'Type', type='char').text = self.processing
-
-        # (3) AreaComputationMethod Node
-        ETree.SubElement(processing, 'AreaComputationMethod', type='char').text = 'Parallel'
-
-        # (3) Navigation Node
-        navigation = ETree.SubElement(processing, 'Navigation')
-
-        # (4) Reference Node
-        ETree.SubElement(navigation, 'Reference', type='char').text = \
-            self.transects[self.checked_transect_idx[0]].w_vel.nav_ref
-
-        # (4) CompositeTrack
-        ETree.SubElement(navigation, 'CompositeTrack', type='char').text = \
-            self.transects[self.checked_transect_idx[0]].boat_vel.composite
-
-        # (4) MagneticVariation Node
-        mag_var = self.transects[self.checked_transect_idx[0]].sensors.heading_deg.internal.mag_var_deg
-        ETree.SubElement(navigation, 'MagneticVariation', type='double',
-                         unitsCode='deg').text = '{:.2f}'.format(mag_var)
-
-        # (4) BeamFilter
-        nav_data = getattr(self.transects[self.checked_transect_idx[0]].boat_vel,
-                           self.transects[self.checked_transect_idx[0]].boat_vel.selected)
-        temp = nav_data.beam_filter
-        if temp < 0:
-            temp = 'Auto'
-        else:
-            temp = str(temp)
-        ETree.SubElement(navigation, 'BeamFilter', type='char').text = temp
-
-        # (4) ErrorVelocityFilter Node
-        evf = nav_data.d_filter
-        if evf == 'Manual':
-            evf = '{:.4f}'.format(nav_data.d_filter_thresholds)
-        ETree.SubElement(navigation, 'ErrorVelocityFilter', type='char', unitsCode='mps').text = evf
-
-        # (4) VerticalVelocityFilter Node
-        vvf = nav_data.w_filter
-        if vvf == 'Manual':
-            vvf = '{:.4f}'.format(nav_data.w_filter_thresholds)
-        ETree.SubElement(navigation, 'VerticalVelocityFilter', type='char', unitsCode='mps').text = vvf
-
-        # (4) Use measurement thresholds
-        temp = nav_data.use_measurement_thresholds
-        if temp:
-            temp = 'Yes'
-        else:
-            temp = 'No'
-        ETree.SubElement(navigation, 'UseMeasurementThresholds', type='char').text = temp
-
-        # (4) OtherFilter Node
-        o_f = nav_data.smooth_filter
-        ETree.SubElement(navigation, 'OtherFilter', type='char').text = o_f
-
-        # (4) GPSDifferentialQualityFilter Node
-        temp = nav_data.gps_diff_qual_filter
-        if temp:
-            if isinstance(temp, int) or isinstance(temp, float):
-                temp = str(temp)
-            ETree.SubElement(navigation, 'GPSDifferentialQualityFilter', type='char').text = temp
-
-        # (4) GPSAltitudeFilter Node
-        temp = nav_data.gps_altitude_filter
-        if temp:
-            if temp == 'Manual':
-                temp = self.transects[self.checked_transect_idx[0]].boat_vel.gps_altitude_filter_change
-            ETree.SubElement(navigation, 'GPSAltitudeFilter', type='char', unitsCode='m').text = str(temp)
-
-        # (4) HDOPChangeFilter
-        temp = nav_data.gps_HDOP_filter
-        if temp:
-            if temp == 'Manual':
-                temp = '{:.2f}'.format(self.transects[self.checked_transect_idx[0]].boat_vel.gps_hdop_filter_change)
-            ETree.SubElement(navigation, 'HDOPChangeFilter', type='char').text = temp
-
-        # (4) HDOPThresholdFilter
-        temp = nav_data.gps_HDOP_filter
-        if temp:
-            if temp == 'Manual':
-                temp = '{:.2f}'.format(self.transects[self.checked_transect_idx[0]].boat_vel.gps_HDOP_filter_max)
-            ETree.SubElement(navigation, 'HDOPThresholdFilter', type='char').text = temp
-
-        # (4) InterpolationType Node
-        temp = nav_data.interpolate
-        ETree.SubElement(navigation, 'InterpolationType', type='char').text = temp
-
-        # (3) Depth Node
-        depth = ETree.SubElement(processing, 'Depth')
-
-        # (4) Reference Node
-        if self.transects[self.checked_transect_idx[0]].depths.selected == 'bt_depths':
-            temp = 'BT'
-        elif self.transects[self.checked_transect_idx[0]].depths.selected == 'vb_depths':
-            temp = 'VB'
-        elif self.transects[self.checked_transect_idx[0]].depths.selected == 'ds_depths':
-            temp = 'DS'
-        ETree.SubElement(depth, 'Reference', type='char').text = temp
-
-        # (4) CompositeDepth Node
-        ETree.SubElement(depth, 'CompositeDepth', type='char').text = \
-            self.transects[self.checked_transect_idx[0]].depths.composite
-
-        # (4) ADCPDepth Node
-        depth_data = getattr(self.transects[self.checked_transect_idx[0]].depths,
-                             self.transects[self.checked_transect_idx[0]].depths.selected)
-        temp = depth_data.draft_use_m
-        ETree.SubElement(depth, 'ADCPDepth', type='double', unitsCode='m').text = '{:.4f}'.format(temp)
-
-        # (4) ADCPDepthConsistent Node
-        drafts = []
-        for transect in self.transects:
-            if transect.checked:
-                transect_depth = getattr(transect.depths, transect.depths.selected)
-                drafts.append(transect_depth.draft_use_m)
-        unique_drafts = set(drafts)
-        num_drafts = len(unique_drafts)
-        if num_drafts > 1:
-            temp = 'No'
-        else:
-            temp = 'Yes'
-        ETree.SubElement(depth, 'ADCPDepthConsistent', type='boolean').text = temp
-
-        # (4) FilterType Node
-        temp = depth_data.filter_type
-        ETree.SubElement(depth, 'FilterType', type='char').text = temp
-
-        # (4) InterpolationType Node
-        temp = depth_data.interp_type
-        ETree.SubElement(depth, 'InterpolationType', type='char').text = temp
-
-        # (4) AveragingMethod Node
-        temp = depth_data.avg_method
-        ETree.SubElement(depth, 'AveragingMethod', type='char').text = temp
-
-        # (4) ValidDataMethod Node
-        temp = depth_data.valid_data_method
-        ETree.SubElement(depth, 'ValidDataMethod', type='char').text = temp
-
-        # (3) WaterTrack Node
-        water_track = ETree.SubElement(processing, 'WaterTrack')
-
-        # (4) ExcludedDistance Node
-        temp = self.transects[self.checked_transect_idx[0]].w_vel.excluded_dist_m
-        ETree.SubElement(water_track, 'ExcludedDistance', type='double', unitsCode='m').text = '{:.4f}'.format(temp)
-
-        # (4) BeamFilter Node
-        temp = self.transects[self.checked_transect_idx[0]].w_vel.beam_filter
-        if temp < 0:
-            temp = 'Auto'
-        else:
-            temp = str(temp)
-        ETree.SubElement(water_track, 'BeamFilter', type='char').text = temp
-
-        # (4) ErrorVelocityFilter Node
-        temp = self.transects[self.checked_transect_idx[0]].w_vel.d_filter
-        if temp == 'Manual':
-            temp = '{:.4f}'.format(self.transects[self.checked_transect_idx[0]].w_vel.d_filter_thresholds)
-        ETree.SubElement(water_track, 'ErrorVelocityFilter', type='char', unitsCode='mps').text = temp
-
-        # (4) VerticalVelocityFilter Node
-        temp = self.transects[self.checked_transect_idx[0]].w_vel.w_filter
-        if temp == 'Manual':
-            temp = '{:.4f}'.format(self.transects[self.checked_transect_idx[0]].w_vel.w_filter_thresholds)
-        ETree.SubElement(water_track, 'VerticalVelocityFilter', type='char', unitsCode='mps').text = temp
-
-        # (4) Use measurement thresholds
-        temp = self.transects[self.checked_transect_idx[0]].w_vel.use_measurement_thresholds
-        if temp:
-            temp = 'Yes'
-        else:
-            temp = 'No'
-        ETree.SubElement(water_track, 'UseMeasurementThresholds', type='char').text = temp
-
-        # (4) OtherFilter Node
-        temp = self.transects[self.checked_transect_idx[0]].w_vel.smooth_filter
-        ETree.SubElement(water_track, 'OtherFilter', type='char').text = temp
-
-        # (4) SNRFilter Node
-        temp = self.transects[self.checked_transect_idx[0]].w_vel.snr_filter
-        ETree.SubElement(water_track, 'SNRFilter', type='char').text = temp
-
-        # (4) CellInterpolation Node
-        temp = self.transects[self.checked_transect_idx[0]].w_vel.interpolate_cells
-        ETree.SubElement(water_track, 'CellInterpolation', type='char').text = temp
-
-        # (4) EnsembleInterpolation Node
-        temp = self.transects[self.checked_transect_idx[0]].w_vel.interpolate_ens
-        ETree.SubElement(water_track, 'EnsembleInterpolation', type='char').text = temp
-
-        # (3) Edge Node
-        edge = ETree.SubElement(processing, 'Edge')
-
-        # (4) RectangularEdgeMethod Node
-        temp = self.transects[self.checked_transect_idx[0]].edges.rec_edge_method
-        ETree.SubElement(edge, 'RectangularEdgeMethod', type='char').text = temp
-
-        # (4) VelocityMethod Node
-        temp = self.transects[self.checked_transect_idx[0]].edges.vel_method
-        ETree.SubElement(edge, 'VelocityMethod', type='char').text = temp
-
-        # (4) LeftType Node
-        typ = []
-        for n in self.transects:
-            if n.checked:
-                typ.append(n.edges.left.type)
-        unique_type = set(typ)
-        num_types = len(unique_type)
-        if num_types > 1:
-            temp = 'Varies'
-        else:
-            temp = typ[0]
-        ETree.SubElement(edge, 'LeftType', type='char').text = temp
-
-        # LeftEdgeCoefficient
-        if temp == 'User Q':
-            temp = 'N/A'
-        elif temp == 'Varies':
-            temp = 'N/A'
-        else:
-            coef = []
-            for transect in self.transects:
-                if transect.checked:
-                    coef.append(QComp.edge_coef('left', transect))
-            num_coef = len(set(coef))
-            if num_coef > 1:
-                temp = 'Varies'
-            else:
-                temp = '{:.4f}'.format(coef[0])
-        ETree.SubElement(edge, 'LeftEdgeCoefficient', type='char').text = temp
-
-        # (4) RightType Node
-        typ = []
-        for n in self.transects:
-            if n.checked:
-                typ.append(n.edges.right.type)
-        unique_type = set(typ)
-        num_types = len(unique_type)
-        if num_types > 1:
-            temp = 'Varies'
-        else:
-            temp = typ[0]
-        ETree.SubElement(edge, 'RightType', type='char').text = temp
-
-        # RightEdgeCoefficient
-        if temp == 'User Q':
-            temp = 'N/A'
-        elif temp == 'Varies':
-            temp = 'N/A'
-        else:
-            coef = []
-            for transect in self.transects:
-                if transect.checked:
-                    coef.append(QComp.edge_coef('right', transect))
-            num_coef = len(set(coef))
-            if num_coef > 1:
-                temp = 'Varies'
-            else:
-                temp = '{:.4f}'.format(coef[0])
-        ETree.SubElement(edge, 'RightEdgeCoefficient', type='char').text = temp
-
-        # (3) Extrapolation Node
-        extrap = ETree.SubElement(processing, 'Extrapolation')
-
-        # (4) TopMethod Node
-        temp = self.transects[self.checked_transect_idx[0]].extrap.top_method
-        ETree.SubElement(extrap, 'TopMethod', type='char').text = temp
-
-        # (4) BottomMethod Node
-        temp = self.transects[self.checked_transect_idx[0]].extrap.bot_method
-        ETree.SubElement(extrap, 'BottomMethod', type='char').text = temp
-
-        # (4) Exponent Node
-        temp = self.transects[self.checked_transect_idx[0]].extrap.exponent
-        ETree.SubElement(extrap, 'Exponent', type='double').text = '{:.4f}'.format(temp)
-
-        # (4) Discharge weighted medians
-        temp = self.extrap_fit.use_weighted
-        if temp:
-            temp = 'Yes'
-        else:
-            temp = 'No'
-        ETree.SubElement(extrap, 'UseWeighted', type='char').text = temp
-
-        # (3) Sensor Node
-        sensor = ETree.SubElement(processing, 'Sensor')
-
-        # (4) TemperatureSource Node
-        temp = []
-        for n in self.transects:
-            if n.checked:
-                # k+=1
-                temp.append(n.sensors.temperature_deg_c.selected)
-        sources = len(set(temp))
-        if sources > 1:
-            temp = 'Varies'
-        else:
-            temp = temp[0]
-        ETree.SubElement(sensor, 'TemperatureSource', type='char').text = temp
-
-        # (4) Salinity
-        temp = np.array([])
-        for transect in self.transects:
-            if transect.checked:
-                sal_selected = getattr(transect.sensors.salinity_ppt, transect.sensors.salinity_ppt.selected)
-                temp = np.append(temp, sal_selected.data)
-        values = np.unique(temp)
-        if len(values) > 1:
-            temp = 'Varies'
-        else:
-            temp = '{:2.1f}'.format(values[0])
-        ETree.SubElement(sensor, 'Salinity', type='char', unitsCode='ppt').text = temp
-
-        # (4) SpeedofSound Node
-        temp = []
-        for n in self.transects:
-            if n.checked:
-                temp.append(n.sensors.speed_of_sound_mps.selected)
-        sources = len(set(temp))
-        if sources > 1:
-            temp = 'Varies'
-        else:
-            temp = temp[0]
-        if temp == 'internal':
-            temp = 'ADCP'
-        ETree.SubElement(sensor, 'SpeedofSound', type='char', unitsCode='mps').text = temp
-
-        # (2) Transect Node
-        other_prop = self.compute_measurement_properties(self)
-        for n in range(len(self.transects)):
-            if self.transects[n].checked:
-                transect = ETree.SubElement(channel, 'Transect')
-
-                # (3) Filename Node
-                temp = self.transects[n].file_name
-                ETree.SubElement(transect, 'Filename', type='char').text = temp
-
-                # (3) StartDateTime Node
-                temp = int(self.transects[n].date_time.start_serial_time)
-                temp = datetime.datetime.utcfromtimestamp(temp).strftime('%m/%d/%Y %H:%M:%S')
-                ETree.SubElement(transect, 'StartDateTime', type='char').text = temp
-
-                # (3) EndDateTime Node
-                temp = int(self.transects[n].date_time.end_serial_time)
-                temp = datetime.datetime.utcfromtimestamp(temp).strftime('%m/%d/%Y %H:%M:%S')
-                ETree.SubElement(transect, 'EndDateTime', type='char').text = temp
-
-                # (3) Discharge Node
-                t_q = ETree.SubElement(transect, 'Discharge')
-
-                # (4) Top Node
-                temp = self.discharge[n].top
-                ETree.SubElement(t_q, 'Top', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-                # (4) Middle Node
-                temp = self.discharge[n].middle
-                ETree.SubElement(t_q, 'Middle', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-                # (4) Bottom Node
-                temp = self.discharge[n].bottom
-                ETree.SubElement(t_q, 'Bottom', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-                # (4) Left Node
-                temp = self.discharge[n].left
-                ETree.SubElement(t_q, 'Left', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-                # (4) Right Node
-                temp = self.discharge[n].right
-                ETree.SubElement(t_q, 'Right', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-                # (4) Total Node
-                temp = self.discharge[n].total
-                ETree.SubElement(t_q, 'Total', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-                # (4) MovingBedPercentCorrection Node
-                temp = ((self.discharge[n].total / self.discharge[n].total_uncorrected) - 1) * 100
-                ETree.SubElement(t_q, 'MovingBedPercentCorrection', type='double').text = '{:.2f}'.format(temp)
-
-                # (3) Edge Node
-                t_edge = ETree.SubElement(transect, 'Edge')
-
-                # (4) StartEdge Node
-                temp = self.transects[n].start_edge
-                ETree.SubElement(t_edge, 'StartEdge', type='char').text = temp
-
-                # (4) RectangularEdgeMethod Node
-                temp = self.transects[n].edges.rec_edge_method
-                ETree.SubElement(t_edge, 'RectangularEdgeMethod', type='char').text = temp
-
-                # (4) VelocityMethod Node
-                temp = self.transects[n].edges.vel_method
-                ETree.SubElement(t_edge, 'VelocityMethod', type='char').text = temp
-
-                # (4) LeftType Node
-                temp = self.transects[n].edges.left.type
-                ETree.SubElement(t_edge, 'LeftType', type='char').text = temp
-
-                # (4) LeftEdgeCoefficient Node
-                if temp == 'User Q':
-                    temp = ''
-                else:
-                    temp = '{:.4f}'.format(QComp.edge_coef('left', self.transects[n]))
-                ETree.SubElement(t_edge, 'LeftEdgeCoefficient', type='double').text = temp
-
-                # (4) LeftDistance Node
-                temp = '{:.4f}'.format(self.transects[n].edges.left.distance_m)
-                ETree.SubElement(t_edge, 'LeftDistance', type='double', unitsCode='m').text = temp
-
-                # (4) LeftNumberEnsembles
-                temp = '{:.0f}'.format(self.transects[n].edges.left.number_ensembles)
-                ETree.SubElement(t_edge, 'LeftNumberEnsembles', type='double').text = temp
-
-                # (4) RightType Node
-                temp = self.transects[n].edges.right.type
-                ETree.SubElement(t_edge, 'RightType', type='char').text = temp
-
-                # (4) RightEdgeCoefficient Node
-                if temp == 'User Q':
-                    temp = ''
-                else:
-                    temp = '{:.4f}'.format(QComp.edge_coef('right', self.transects[n]))
-                ETree.SubElement(t_edge, 'RightEdgeCoefficient', type='double').text = temp
-
-                # (4) RightDistance Node
-                temp = '{:.4f}'.format(self.transects[n].edges.right.distance_m)
-                ETree.SubElement(t_edge, 'RightDistance', type='double', unitsCode='m').text = temp
-
-                # (4) RightNumberEnsembles Node
-                temp = '{:.0f}'.format(self.transects[n].edges.right.number_ensembles)
-                ETree.SubElement(t_edge, 'RightNumberEnsembles', type='double').text = temp
-
-                # (3) Sensor Node
-                t_sensor = ETree.SubElement(transect, 'Sensor')
-
-                # (4) TemperatureSource Node
-                temp = self.transects[n].sensors.temperature_deg_c.selected
-                ETree.SubElement(t_sensor, 'TemperatureSource', type='char').text = temp
-
-                # (4) MeanTemperature Node
-                dat = getattr(self.transects[n].sensors.temperature_deg_c,
-                              self.transects[n].sensors.temperature_deg_c.selected)
-                temp = np.nanmean(dat.data)
-                temp = '{:.2f}'.format(temp)
-                ETree.SubElement(t_sensor, 'MeanTemperature', type='double', unitsCode='degC').text = temp
-
-                # (4) MeanSalinity
-                sal_data = getattr(self.transects[n].sensors.salinity_ppt,
-                                   self.transects[n].sensors.salinity_ppt.selected)
-                temp = '{:.0f}'.format(np.nanmean(sal_data.data))
-                ETree.SubElement(t_sensor, 'MeanSalinity', type='double', unitsCode='ppt').text = temp
-
-                # (4) SpeedofSoundSource Node
-                sos_selected = getattr(self.transects[n].sensors.speed_of_sound_mps,
-                                       self.transects[n].sensors.speed_of_sound_mps.selected)
-                temp = sos_selected.source
-                ETree.SubElement(t_sensor, 'SpeedofSoundSource', type='char').text = temp
-
-                # (4) SpeedofSound
-                sos_data = getattr(self.transects[n].sensors.speed_of_sound_mps,
-                                   self.transects[n].sensors.speed_of_sound_mps.selected)
-                temp = '{:.4f}'.format(np.nanmean(sos_data.data))
-                ETree.SubElement(t_sensor, 'SpeedofSound', type='double', unitsCode='mps').text = temp
-
-                # (3) Other Node
-                t_other = ETree.SubElement(transect, 'Other')
-
-                # (4) Duration Node
-                temp = '{:.2f}'.format(self.transects[n].date_time.transect_duration_sec)
-                ETree.SubElement(t_other, 'Duration', type='double', unitsCode='sec').text = temp
-
-                # (4) Width
-                temp = other_prop['width'][n]
-                ETree.SubElement(t_other, 'Width', type='double', unitsCode='m').text = '{:.4f}'.format(temp)
-
-                # (4) Area
-                temp = other_prop['area'][n]
-                ETree.SubElement(t_other, 'Area', type='double', unitsCode='sqm').text = '{:.4f}'.format(temp)
-
-                # (4) MeanBoatSpeed
-                temp = other_prop['avg_boat_speed'][n]
-                ETree.SubElement(t_other, 'MeanBoatSpeed', type='double', unitsCode='mps').text = '{:.4f}'.format(temp)
-
-                # (4) QoverA
-                temp = other_prop['avg_water_speed'][n]
-                ETree.SubElement(t_other, 'QoverA', type='double', unitsCode='mps').text = '{:.4f}'.format(temp)
-
-                # (4) CourseMadeGood
-                temp = other_prop['avg_boat_course'][n]
-                ETree.SubElement(t_other, 'CourseMadeGood', type='double', unitsCode='deg').text = '{:.2f}'.format(temp)
-
-                # (4) MeanFlowDirection
-                temp = other_prop['avg_water_dir'][n]
-                ETree.SubElement(t_other, 'MeanFlowDirection', type='double',
-                                 unitsCode='deg').text = '{:.2f}'.format(temp)
-
-                # (4) NumberofEnsembles
-                temp = len(self.transects[n].boat_vel.bt_vel.u_processed_mps)
-                ETree.SubElement(t_other, 'NumberofEnsembles', type='integer').text = str(temp)
-
-                # (4) PercentInvalidBins
-                valid_ens, valid_cells = TransectData.raw_valid_data(self.transects[n])
-                temp = (1 - (np.nansum(np.nansum(valid_cells))
-                             / np.nansum(np.nansum(self.transects[n].w_vel.cells_above_sl)))) * 100
-                ETree.SubElement(t_other, 'PercentInvalidBins', type='double').text = '{:.2f}'.format(temp)
-
-                # (4) PercentInvalidEnsembles
-                temp = (1 - (np.nansum(valid_ens) / len(self.transects[n].boat_vel.bt_vel.u_processed_mps))) * 100
-                ETree.SubElement(t_other, 'PercentInvalidEns', type='double').text = '{:.2f}'.format(temp)
-
-                pitch_source_selected = getattr(self.transects[n].sensors.pitch_deg,
-                                                self.transects[n].sensors.pitch_deg.selected)
-                roll_source_selected = getattr(self.transects[n].sensors.roll_deg,
-                                               self.transects[n].sensors.roll_deg.selected)
-
-                # (4) MeanPitch
-                temp = np.nanmean(pitch_source_selected.data)
-                ETree.SubElement(t_other, 'MeanPitch', type='double', unitsCode='deg').text = '{:.2f}'.format(temp)
-
-                # (4) MeanRoll
-                temp = np.nanmean(roll_source_selected.data)
-                ETree.SubElement(t_other, 'MeanRoll', type='double', unitsCode='deg').text = '{:.2f}'.format(temp)
-
-                # (4) PitchStdDev
-                temp = np.nanstd(pitch_source_selected.data, ddof=1)
-                ETree.SubElement(t_other, 'PitchStdDev', type='double', unitsCode='deg').text = '{:.2f}'.format(temp)
-
-                # (4) RollStdDev
-                temp = np.nanstd(roll_source_selected.data, ddof=1)
-                ETree.SubElement(t_other, 'RollStdDev', type='double', unitsCode='deg').text = '{:.2f}'.format(temp)
-
-                # (4) ADCPDepth
-                depth_source_selected = getattr(self.transects[n].depths,
-                                                self.transects[n].depths.selected)
-                temp = depth_source_selected.draft_use_m
-                ETree.SubElement(t_other, 'ADCPDepth', type='double', unitsCode='m').text = '{:.4f}'.format(temp)
-
-        # (2) ChannelSummary Node
-        summary = ETree.SubElement(channel, 'ChannelSummary')
-
-        # (3) Discharge Node
-        s_q = ETree.SubElement(summary, 'Discharge')
-        discharge = self.mean_discharges(self)
-
-        # (4) Top
-        temp = discharge['top_mean']
-        ETree.SubElement(s_q, 'Top', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-        # (4) Middle
-        temp = discharge['mid_mean']
-        ETree.SubElement(s_q, 'Middle', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-        # (4) Bottom
-        temp = discharge['bot_mean']
-        ETree.SubElement(s_q, 'Bottom', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-        # (4) Left
-        temp = discharge['left_mean']
-        ETree.SubElement(s_q, 'Left', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-        # (4) Right
-        temp = discharge['right_mean']
-        ETree.SubElement(s_q, 'Right', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-        # (4) Total
-        temp = discharge['total_mean']
-        ETree.SubElement(s_q, 'Total', type='double', unitsCode='cms').text = '{:.5f}'.format(temp)
-
-        # (4) MovingBedPercentCorrection
-        temp = ((discharge['total_mean'] / discharge['uncorrected_mean']) - 1) * 100
-        ETree.SubElement(s_q, 'MovingBedPercentCorrection', type='double').text = '{:.2f}'.format(temp)
-
-        # (3) Uncertainty Node
-        s_u = ETree.SubElement(summary, 'Uncertainty')
-        if self.run_oursin:
-            u_total = self.oursin.u_measurement_user['total_95'][0]
-            u_model = 'OURSIN'
-        else:
-            u_total = self.uncertainty.total_95_user
-            u_model = 'QRevUA'
-
-        if not np.isnan(temp):
-            ETree.SubElement(s_u, 'Total', type='double').text = '{:.1f}'.format(u_total)
-            ETree.SubElement(s_u, 'Model', type='char').text = u_model
-
-        # (3) QRev_UA Uncertainty Node
-        if self.uncertainty is not None:
-            s_qu = ETree.SubElement(summary, 'QRevUAUncertainty')
-            uncertainty = self.uncertainty
-
-            # (4) COV Node
-            temp = uncertainty.cov
-            if not np.isnan(temp):
-                ETree.SubElement(s_qu, 'COV', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) AutoRandom Node
-            temp = uncertainty.cov_95
-            if not np.isnan(temp):
-                ETree.SubElement(s_qu, 'AutoRandom', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) AutoInvalidData Node
-            temp = uncertainty.invalid_95
-            ETree.SubElement(s_qu, 'AutoInvalidData', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) AutoEdge Node
-            temp = uncertainty.edges_95
-            ETree.SubElement(s_qu, 'AutoEdge', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) AutoExtrapolation Node
-            temp = uncertainty.extrapolation_95
-            ETree.SubElement(s_qu, 'AutoExtrapolation', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) AutoMovingBed
-            temp = uncertainty.moving_bed_95
-            ETree.SubElement(s_qu, 'AutoMovingBed', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) AutoSystematic
-            temp = uncertainty.systematic
-            ETree.SubElement(s_qu, 'AutoSystematic', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) AutoTotal
-            temp = uncertainty.total_95
-            if not np.isnan(temp):
-                ETree.SubElement(s_qu, 'AutoTotal', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) UserRandom Node
-            user_random = uncertainty.cov_95_user
-            if user_random:
-                ETree.SubElement(s_qu, 'UserRandom', type='double').text = '{:.1f}'.format(user_random)
-
-            # (4) UserInvalidData Node
-            user_invalid = uncertainty.invalid_95_user
-            if user_invalid:
-                ETree.SubElement(s_qu, 'UserInvalidData', type='double').text = '{:.1f}'.format(user_invalid)
-
-            # (4) UserEdge
-            user_edge = uncertainty.edges_95_user
-            if user_edge:
-                ETree.SubElement(s_qu, 'UserEdge', type='double').text = '{:.1f}'.format(user_edge)
-
-            # (4) UserExtrapolation
-            user_extrap = uncertainty.extrapolation_95_user
-            if user_extrap:
-                ETree.SubElement(s_qu, 'UserExtrapolation', type='double').text = '{:.1f}'.format(user_extrap)
-
-            # (4) UserMovingBed
-            user_mb = uncertainty.moving_bed_95_user
-            if user_mb:
-                ETree.SubElement(s_qu, 'UserMovingBed', type='double').text = '{:.1f}'.format(user_mb)
-
-            # (4) UserSystematic
-            user_systematic = uncertainty.systematic_user
-            if user_systematic:
-                ETree.SubElement(s_qu, 'UserSystematic', type='double').text = '{:.1f}'.format(user_systematic)
-
-            # (4) UserTotal Node
-            temp = uncertainty.total_95_user
-            if not np.isnan(temp):
-                ETree.SubElement(s_qu, 'UserTotal', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) Random
-            if user_random:
-                temp = user_random
-            else:
-                temp = uncertainty.cov_95
-            if not np.isnan(temp):
-                ETree.SubElement(s_qu, 'Random', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) InvalidData
-            if user_invalid:
-                temp = user_invalid
-            else:
-                temp = uncertainty.invalid_95
-            ETree.SubElement(s_qu, 'InvalidData', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) Edge
-            if user_edge:
-                temp = user_edge
-            else:
-                temp = uncertainty.edges_95
-            ETree.SubElement(s_qu, 'Edge', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) Extrapolation
-            if user_extrap:
-                temp = user_extrap
-            else:
-                temp = uncertainty.extrapolation_95
-            ETree.SubElement(s_qu, 'Extrapolation', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) MovingBed
-            if user_mb:
-                temp = user_mb
-            else:
-                temp = uncertainty.moving_bed_95
-            ETree.SubElement(s_qu, 'MovingBed', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) Systematic
-            if user_systematic:
-                temp = user_systematic
-            else:
-                temp = uncertainty.systematic
-            ETree.SubElement(s_qu, 'Systematic', type='double').text = '{:.1f}'.format(temp)
-
-            # (4) UserTotal Node
-            temp = uncertainty.total_95_user
-            if not np.isnan(temp):
-                ETree.SubElement(s_qu, 'Total', type='double').text = '{:.1f}'.format(temp)
-
-        # Oursin Uncertainty Node
-        if self.oursin is not None:
-            # (3) Uncertainty Node
-            s_ou = ETree.SubElement(summary, 'OursinUncertainty')
-            oursin = self.oursin
-
-            # (4) System Node
-            temp = oursin.u_measurement['u_syst'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'System', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Compass Node
-            temp = oursin.u_measurement['u_compass'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'Compass', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Moving-bed Node
-            temp = oursin.u_measurement['u_movbed'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'MovingBed', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Ensembles Node
-            temp = oursin.u_measurement['u_ens'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'Ensembles', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Measured Node
-            temp = oursin.u_measurement['u_meas'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'Measured', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Top Node
-            temp = oursin.u_measurement['u_top'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'Top', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Bottom Node
-            temp = oursin.u_measurement['u_bot'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'Bottom', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Left Node
-            temp = oursin.u_measurement['u_left'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'Left', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Bottom Node
-            temp = oursin.u_measurement['u_right'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'Right', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Invalid Boat Node
-            temp = oursin.u_measurement['u_boat'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'InvalidBoat', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Invalid Depth Node
-            temp = oursin.u_measurement['u_depth'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'InvalidDepth', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Invalid Water Node
-            temp = oursin.u_measurement['u_water'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'InvalidWater', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) COV Node
-            temp = oursin.u_measurement['u_cov'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'COV', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Auto Total 95% Node
-            temp = oursin.u_measurement['total_95'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'AutoTotal95', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Extrapolation Power/Power Minimum
-            temp = oursin.default_advanced_settings['exp_pp_min']
-            if type(temp) is float:
-                ETree.SubElement(s_ou, 'ExtrapPPMin', type='double').text = '{:.2f}'.format(temp)
-            else:
-                ETree.SubElement(s_ou, 'ExtrapPPMin', type='char').text = temp
-
-            # (4) Extrapolation Power/Power Maximum
-            temp = oursin.default_advanced_settings['exp_pp_max']
-            if type(temp) is float:
-                ETree.SubElement(s_ou, 'ExtrapPPMax', type='double').text = '{:.2f}'.format(temp)
-            else:
-                ETree.SubElement(s_ou, 'ExtrapPPMax', type='char').text = temp
-
-            # (4) Extrapolation No Slip Minimum
-            temp = oursin.default_advanced_settings['exp_ns_min']
-            if type(temp) is float:
-                ETree.SubElement(s_ou, 'ExtrapNSMin', type='double').text = '{:.2f}'.format(temp)
-            else:
-                ETree.SubElement(s_ou, 'ExtrapNSMin', type='char').text = temp
-
-            # (4) Extrapolation No Slip Maximum
-            temp = oursin.default_advanced_settings['exp_ns_max']
-            if type(temp) is float:
-                ETree.SubElement(s_ou, 'ExtrapNSMax', type='double').text = '{:.2f}'.format(temp)
-            else:
-                ETree.SubElement(s_ou, 'ExtrapNSMax', type='char').text = temp
-
-            # (4) Draft error in m
-            temp = oursin.default_advanced_settings['draft_error_m']
-            if type(temp) is float:
-                ETree.SubElement(s_ou, 'DraftErrorm', type='double').text = '{:.2f}'.format(temp)
-            else:
-                ETree.SubElement(s_ou, 'DraftErrorm', type='char').text = temp
-
-            # (4) Bin size error in percent
-            temp = oursin.default_advanced_settings['dzi_prct']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'BinErrorPer', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Right edge distance error in percent
-            temp = oursin.default_advanced_settings['right_edge_dist_prct']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'REdgeDistErrorPer', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Left edge distance error in percent
-            temp = oursin.default_advanced_settings['left_edge_dist_prct']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'LEdgeDistErrorPer', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) GGA Boat Velocity Error in mps
-            temp = oursin.default_advanced_settings['gga_boat_mps']
-            if type(temp) is float:
-                ETree.SubElement(s_ou, 'GGABoatVelErrormps', type='double').text = '{:.2f}'.format(temp)
-            else:
-                ETree.SubElement(s_ou, 'GGABoatVelErrormps', type='char').text = temp
-
-            # (4) VTG Boat Velocity Error in mps
-            temp = oursin.default_advanced_settings['vtg_boat_mps']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'VTGBoatVelErrormps', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Compass Error in deg
-            temp = oursin.default_advanced_settings['compass_error_deg']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'CompassErrordeg', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Bayesian COV prior in percent
-            temp = oursin.default_advanced_settings['cov_prior']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'BayesCOVPriorper', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Bayesian COV prior uncertaint in percent
-            temp = oursin.default_advanced_settings['cov_prior_u']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'BayesCOVPriorUncertaintyper', type='double').text = '{:.2f}'.format(temp)
-
-            # User
-
-            # (4) System Node
-            temp = oursin.u_measurement_user['u_syst'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'SystemUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Compass Node
-            temp = oursin.u_measurement_user['u_compass'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'CompassUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Moving-bed Node
-            temp = oursin.u_measurement_user['u_movbed'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'MovingBedUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Ensembles Node
-            temp = oursin.u_measurement_user['u_ens'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'EnsemblesUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Measured Node
-            temp = oursin.u_measurement_user['u_meas'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'MeasuredUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Top Node
-            temp = oursin.u_measurement_user['u_top'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'TopUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Bottom Node
-            temp = oursin.u_measurement_user['u_bot'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'BottomUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Left Node
-            temp = oursin.u_measurement_user['u_left'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'LeftUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Bottom Node
-            temp = oursin.u_measurement_user['u_right'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'RightUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Invalid Boat Node
-            temp = oursin.u_measurement_user['u_boat'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'InvalidBoatUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Invalid Depth Node
-            temp = oursin.u_measurement_user['u_depth'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'InvalidDepthUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Invalid Water Node
-            temp = oursin.u_measurement_user['u_water'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'InvalidWaterUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Auto Total 95% Node
-            temp = oursin.u_measurement_user['total_95'][0]
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'AutoTotal95User', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Extrapolation Power/Power Minimum
-            temp = oursin.user_advanced_settings['exp_pp_min_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'ExtrapPPMinUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Extrapolation Power/Power Maximum
-            temp = oursin.user_advanced_settings['exp_pp_max_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'ExtrapPPMaxUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Extrapolation No Slip Minimum
-            temp = oursin.user_advanced_settings['exp_ns_min_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'ExtrapNSMinUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Extrapolation No Slip Maximum
-            temp = oursin.user_advanced_settings['exp_ns_max_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'ExtrapNSMaxUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Draft error in m
-            temp = oursin.user_advanced_settings['draft_error_m_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'DraftErrormUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Bin size error in percent
-            temp = oursin.user_advanced_settings['dzi_prct_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'BinErrorperUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Right edge distance error in percent
-            temp = oursin.user_advanced_settings['right_edge_dist_prct_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'REdgeDistErrorperUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Left edge distance error in percent
-            temp = oursin.user_advanced_settings['left_edge_dist_prct_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'LEdgeDistErrorperUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) GGA Boat Velocity Error in mps
-            temp = oursin.user_advanced_settings['gga_boat_mps_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'GGABoatVelErrormpsUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) VTG Boat Velocity Error in mps
-            temp = oursin.user_advanced_settings['vtg_boat_mps_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'VTGBoatVelErrormpsUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Compass Error in deg
-            temp = oursin.user_advanced_settings['compass_error_deg_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'CompassErrordegUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Bayesian COV prior in percent
-            temp = oursin.user_advanced_settings['cov_prior_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'BayesCOVPriorperUser', type='double').text = '{:.2f}'.format(temp)
-
-            # (4) Bayesian COV prior uncertaint in percent
-            temp = oursin.user_advanced_settings['cov_prior_u_user']
-            if not np.isnan(temp):
-                ETree.SubElement(s_ou, 'BayesCOVPriorUncertaintyperUser', type='double').text = '{:.2f}'.format(temp)
-
-        # (3) Other Node
-        s_o = ETree.SubElement(summary, 'Other')
-
-        # (4) MeanWidth
-        temp = other_prop['width'][-1]
-        ETree.SubElement(s_o, 'MeanWidth', type='double', unitsCode='m').text = '{:.4f}'.format(temp)
-
-        # (4) WidthCOV
-        temp = other_prop['width_cov'][-1]
-        if not np.isnan(temp):
-            ETree.SubElement(s_o, 'WidthCOV', type='double').text = '{:.4f}'.format(temp)
-
-        # (4) MeanArea
-        temp = other_prop['area'][-1]
-        ETree.SubElement(s_o, 'MeanArea', type='double', unitsCode='sqm').text = '{:.4f}'.format(temp)
-
-        # (4) AreaCOV
-        temp = other_prop['area_cov'][-1]
-        if not np.isnan(temp):
-            ETree.SubElement(s_o, 'AreaCOV', type='double').text = '{:.2f}'.format(temp)
-
-        # (4) MeanBoatSpeed
-        temp = other_prop['avg_boat_speed'][-1]
-        ETree.SubElement(s_o, 'MeanBoatSpeed', type='double', unitsCode='mps').text = '{:.4f}'.format(temp)
-
-        # (4) MeanQoverA
-        temp = other_prop['avg_water_speed'][-1]
-        ETree.SubElement(s_o, 'MeanQoverA', type='double', unitsCode='mps').text = '{:.4f}'.format(temp)
-
-        # (4) MeanCourseMadeGood
-        temp = other_prop['avg_boat_course'][-1]
-        ETree.SubElement(s_o, 'MeanCourseMadeGood', type='double', unitsCode='deg').text = '{:.2f}'.format(temp)
-
-        # (4) MeanFlowDirection
-        temp = other_prop['avg_water_dir'][-1]
-        ETree.SubElement(s_o, 'MeanFlowDirection', type='double', unitsCode='deg').text = '{:.2f}'.format(temp)
-
-        # (4) MeanDepth
-        temp = other_prop['avg_depth'][-1]
-        ETree.SubElement(s_o, 'MeanDepth', type='double', unitsCode='m').text = '{:.4f}'.format(temp)
-
-        # (4) MaximumDepth
-        temp = other_prop['max_depth'][-1]
-        ETree.SubElement(s_o, 'MaximumDepth', type='double', unitsCode='m').text = '{:.4f}'.format(temp)
-
-        # (4) MaximumWaterSpeed
-        temp = other_prop['max_water_speed'][-1]
-        ETree.SubElement(s_o, 'MaximumWaterSpeed', type='double', unitsCode='mps').text = '{:.4f}'.format(temp)
-
-        # (4) NumberofTransects
-        temp = len(self.checked_transects(self))
-        ETree.SubElement(s_o, 'NumberofTransects', type='integer').text = str(temp)
-
-        # (4) Duration
-        temp = self.measurement_duration(self)
-        ETree.SubElement(s_o, 'Duration', type='double', unitsCode='sec').text = '{:.2f}'.format(temp)
-
-        # (4) LeftQPer
-        temp = 100 * discharge['left_mean'] / discharge['total_mean']
-        ETree.SubElement(s_o, 'LeftQPer', type='double').text = '{:.2f}'.format(temp)
-
-        # (4) RightQPer
-        temp = 100 * discharge['right_mean'] / discharge['total_mean']
-        ETree.SubElement(s_o, 'RightQPer', type='double').text = '{:.2f}'.format(temp)
-
-        # (4) InvalidCellsQPer
-        temp = 100 * discharge['int_cells_mean'] / discharge['total_mean']
-        ETree.SubElement(s_o, 'InvalidCellsQPer', type='double').text = '{:.2f}'.format(temp)
-
-        # (4) InvalidEnsQPer
-        temp = 100 * discharge['int_ensembles_mean'] / discharge['total_mean']
-        ETree.SubElement(s_o, 'InvalidEnsQPer', type='double').text = '{:.2f}'.format(temp)
-
-        # (4) UserRating
-        if self.user_rating:
-            temp = self.user_rating
-        else:
-            temp = 'Not Rated'
-        ETree.SubElement(s_o, 'UserRating', type='char').text = temp
-
-        # (4) DischargePPDefault
-        temp = self.extrap_fit.q_sensitivity.q_pp_mean
-        ETree.SubElement(s_o, 'DischargePPDefault', type='double').text = '{:.2f}'.format(temp)
-
-        # (2) UserComment
-        if len(self.comments) > 1:
-            temp = ''
-            for comment in self.comments:
-                temp = temp + comment.replace('\n', ' |||') + ' |||'
-            ETree.SubElement(channel, 'UserComment', type='char').text = temp
-
-        # Create xml output file
-        with open(file_name, 'wb') as xml_file:
-            # Create binary coded output file
-            et = ETree.ElementTree(channel)
-            root = et.getroot()
-            xml_out = ETree.tostring(root)
-            # Add stylesheet instructions
-            xml_out = b'<?xml-stylesheet type= "text/xsl" href="QRevStylesheet.xsl"?>' + xml_out
-            # Add tabs to make output more readable and apply utf-8 encoding
-            xml_out = parseString(xml_out).toprettyxml(encoding='utf-8')
-            # Write file
-            xml_file.write(xml_out)
-
-    @staticmethod
-    def add_transect(mmt, filename, index, transect_type):
-        """Processes a pd0 file into a TransectData object.
-
-        Parameters
-        ----------
-        mmt: MMTtrdi
-            Object of MMTtrdi
-        filename: str
-            Pd0 filename to be processed
-        index: int
-            Index to file in the mmt
-        transect_type: str
-            Indicates type of transect discharge (Q), or moving_bed (MB)
-
-        Returns
-        -------
-        transect: TransectData
-            Object of TransectData
-        """
-        pd0_data = Pd0TRDI(filename)
-
-        if transect_type == 'MB':
-            mmt_transect = mmt.mbt_transects[index]
-        else:
-            mmt_transect = mmt.transects[index]
-
-        transect = TransectData()
-        transect.trdi(mmt=mmt,
-                      mmt_transect=mmt_transect,
-                      pd0_data=pd0_data)
-        return transect
-
-    def allocate_transects(self, mmt, transect_type='Q', checked=False):
-        """Method to load transect data. Changed from Matlab approach by Greg to allow possibility
-        of multi-thread approach.
-
-        Parameters
-        ----------
-        mmt: MMT_TRDI
-            Object of MMT_TRDI
-        transect_type: str
-            Type of transect (Q: discharge or MB: moving-bed test)
-        checked: bool
-            Determines if all files are loaded (False) or only checked files (True)
-        """
-
-        file_names = []
-        file_idx = []
-
-        # Setup processing for discharge or moving-bed transects
-        if transect_type == 'Q':
-            # Identify discharge transect files to load
-            if checked:
-                for idx, transect in enumerate(mmt.transects):
-                    if transect.Checked == 1:
-                        file_names.append(transect.Files[0])
-                        file_idx.append(idx)
-
-            else:
-                file_names = [transect.Files[0] for transect in mmt.transects]
-                file_idx = list(range(0, len(file_names)))
-
-        elif transect_type == 'MB':
-            file_names = [transect.Files[0] for transect in mmt.mbt_transects]
-            file_idx = list(range(0, len(file_names)))
-
-        # Determine if any files are missing
-        valid_files = []
-        valid_indices = []
-        for index, name in enumerate(file_names):
-            fullname = os.path.join(mmt.path, name)
-            if os.path.exists(fullname):
-                valid_files.append(fullname)
-                valid_indices.append(file_idx[index])
-
-        transects = []
-        num = len(valid_indices)
-
-        for k in range(num):
-            temp = self.add_transect(mmt, valid_files[k], valid_indices[k], transect_type)
-            if temp.w_vel is not None:
-                transects.append(temp)
-
-        return transects
-
-
-if __name__ == '__main__':
-    pass
diff --git a/qrevint_22_06_22/Classes/PreMeasurement.py b/qrevint_22_06_22/Classes/PreMeasurement.py
deleted file mode 100644
index ed2b5c5d4fb3998880cb6cd06f8ecfa8019a6574..0000000000000000000000000000000000000000
--- a/qrevint_22_06_22/Classes/PreMeasurement.py
+++ /dev/null
@@ -1,430 +0,0 @@
-import re
-import copy
-import numpy as np
-
-
-class PreMeasurement(object):
-    """Stores tests, calibrations, and evaluations conducted prior ot measurement.
-
-    Attributes
-    ----------
-    time_stamp: str
-        Time and date of test
-    data: str
-        Raw data from test
-    result: dict
-        Dictionary of test results. Varies by test.
-    """
-    
-    def __init__(self):
-        """Initialize instance variables."""
-
-        self.time_stamp = None
-        self.data = None
-        self.result = {}
-        
-    def populate_data(self, time_stamp, data_in, data_type):
-        """Coordinates storing of test, calibration, and evaluation data.
-
-        Parameters
-        ----------
-        time_stamp: str
-            Time and date text.
-        data_in: str
-            Raw data from test
-        data_type: str
-            Type of data, C-compass, TST-TRDI test, SST-SonTek test
-        """
-
-        # Store time stamp and data
-        self.time_stamp = time_stamp
-        self.data = data_in
-
-        # Process data depending on data type and store result
-        if data_type[1] == 'C':
-            self.compass_read()
-        elif data_type == 'TST':
-            self.sys_test_read()
-            self.pt3_data()
-        elif data_type == 'SST':
-            self.sys_test_read()
-
-    def compass_read(self):
-        """Method for getting compass evaluation data"""
-
-        # Match regex for compass evaluation error:
-        splits = re.split('(Total error:|Double Cycle Errors:|Error from calibration:)', self.data)
-        if len(splits) > 1:
-            error = float(re.search('\d+\.*\d*', splits[-1])[0])
-        else:
-            error = 'N/A'
-        self.result['compass'] = {'error': error}
-
-    @staticmethod
-    def cc_qrev_mat_in(meas_struct):
-        """Processes the Matlab data structure to obtain a list of Premeasurement objects containing compass calibration
-           data from the Matlab data structure.
-
-       Parameters
-       ----------
-       meas_struct: mat_struct
-           Matlab data structure obtained from sio.loadmat
-
-       Returns
-       -------
-       cc: list
-           List of Premeasurement data objects
-       """
-        cc = []
-        if hasattr(meas_struct, 'compassCal'):
-            if type(meas_struct.compassCal) is np.ndarray:
-                for cal in meas_struct.compassCal:
-                    pm = PreMeasurement()
-                    pm.compass_populate_from_qrev_mat(cal)
-                    cc.append(pm)
-            elif len(meas_struct.compassCal.data) > 0:
-                pm = PreMeasurement()
-                pm.compass_populate_from_qrev_mat(meas_struct.compassCal)
-                cc.append(pm)
-
-        return cc
-
-    @staticmethod
-    def ce_qrev_mat_in(meas_struct):
-        """Processes the Matlab data structure to obtain a list of Premeasurement objects containing compass evaluation
-           data from the Matlab data structure.
-
-       Parameters
-       ----------
-       meas_struct: mat_struct
-           Matlab data structure obtained from sio.loadmat
-
-       Returns
-       -------
-       ce: list
-           List of Premeasurement data objects
-       """
-        ce = []
-        if hasattr(meas_struct, 'compassEval'):
-            if type(meas_struct.compassEval) is np.ndarray:
-                for comp_eval in meas_struct.compassEval:
-                    pm = PreMeasurement()
-                    pm.compass_populate_from_qrev_mat(comp_eval)
-                    ce.append(pm)
-            elif len(meas_struct.compassEval.data) > 0:
-                pm = PreMeasurement()
-                pm.compass_populate_from_qrev_mat(meas_struct.compassEval)
-                ce.append(pm)
-        return ce
-
-    def compass_populate_from_qrev_mat(self, data_in):
-        """Populated Premeasurement instance variables with data from QRev Matlab file.
-
-        Parameters
-        ----------
-        data_in: mat_struct
-            mat_struct_object containing compass cal/eval data
-        """
-        self.data = data_in.data
-        self.time_stamp = data_in.timeStamp
-        if hasattr(data_in, 'result'):
-            self.result = {'compass': {'error': data_in.result.compass.error}}
-        else:
-            # Match regex for compass evaluation error:
-            splits = re.split('(Total error:|Double Cycle Errors:|Error from calibration:)', self.data)
-            if len(splits) > 1:
-                error = float(re.search('\d+\.*\d*', splits[-1])[0])
-            else:
-                error = 'N/A'
-            self.result['compass'] = {'error': error}
-            
-    def sys_test_read(self):
-        """Method for reading the system test data"""
-        if self.data is not None:
-            # Match regex for number of tests and number of failures
-            num_tests = re.findall('(Fail|FAIL|F A I L|Pass|PASS|NOT DETECTED|P A S S)', self.data)
-            num_fails = re.findall('(Fail|FAIL|F A I L)', self.data)
-
-            # Store results
-            self.result = {'sysTest': {'n_tests': len(num_tests)}}
-            self.result['sysTest']['n_failed'] = len(num_fails)
-        else:
-            self.result = {'sysTest': {'n_tests': None}}
-            self.result['sysTest']['n_failed'] = None
-
-    @staticmethod
-    def sys_test_qrev_mat_in(meas_struct):
-        """Processes the Matlab data structure to obtain a list of Premeasurement objects containing system test data
-           from the Matlab data structure.
-
-           Parameters
-           ----------
-           meas_struct: mat_struct
-               Matlab data structure obtained from sio.loadmat
-
-           Returns
-           -------
-           system_tst: list
-               List of Premeasurement data objects
-           """
-        system_tst = []
-        if hasattr(meas_struct, 'sysTest'):
-            try:
-                if type(meas_struct.sysTest) == np.ndarray:
-                    for test in meas_struct.sysTest:
-                        tst = PreMeasurement()
-                        tst.sys_tst_populate_from_qrev_mat(test)
-                        system_tst.append(tst)
-                elif len(meas_struct.sysTest.data) > 0:
-                    tst = PreMeasurement()
-                    tst.sys_tst_populate_from_qrev_mat(meas_struct.sysTest)
-                    system_tst.append(tst)
-            except AttributeError:
-                pass
-        return system_tst
-
-    def sys_tst_populate_from_qrev_mat(self, test_in):
-        """Populated Premeasurement instance variables with data from QRev Matlab file.
-
-        Parameters
-        ----------
-        test_in: mat_struct
-            mat_struct_object containing system test data
-        """
-        try:
-            self.data = test_in.data
-            self.time_stamp = test_in.timeStamp
-            self.result = {'sysTest': {'n_failed': test_in.result.sysTest.nFailed}}
-            self.result['sysTest']['n_tests'] = test_in.result.sysTest.nTests
-
-            if hasattr(test_in.result, 'pt3'):
-                data_types = {'corr_table': np.array([]), 'sdc': np.array([]), 'cdc': np.array([]),
-                              'noise_floor': np.array([])}
-                test_types = {'high_wide': data_types.copy(), 'high_narrow': data_types.copy(),
-                              'low_wide': data_types.copy(),
-                              'low_narrow': data_types.copy()}
-                pt3 = {'hard_limit': copy.deepcopy(test_types), 'linear': copy.deepcopy(test_types)}
-                if hasattr(test_in.result.pt3, 'hardLimit'):
-                    if hasattr(test_in.result.pt3.hardLimit, 'hw'):
-                        pt3['hard_limit']['high_wide']['corr_table'] = test_in.result.pt3.hardLimit.hw.corrTable
-                        pt3['hard_limit']['high_wide']['sdc'] = test_in.result.pt3.hardLimit.hw.sdc
-                        pt3['hard_limit']['high_wide']['cdc'] = test_in.result.pt3.hardLimit.hw.cdc
-                        pt3['hard_limit']['high_wide']['noise_floor'] = test_in.result.pt3.hardLimit.hw.noiseFloor
-                    if hasattr(test_in.result.pt3.hardLimit, 'lw'):
-                        pt3['hard_limit']['low_wide']['corr_table'] = test_in.result.pt3.hardLimit.lw.corrTable
-                        pt3['hard_limit']['low_wide']['sdc'] = test_in.result.pt3.hardLimit.lw.sdc
-                        pt3['hard_limit']['low_wide']['cdc'] = test_in.result.pt3.hardLimit.lw.cdc
-                        pt3['hard_limit']['low_wide']['noise_floor'] = test_in.result.pt3.hardLimit.lw.noiseFloor
-                    if hasattr(test_in.result.pt3.hardLimit, 'hn'):
-                        pt3['hard_limit']['high_narrow']['corr_table'] = test_in.result.pt3.hardLimit.hn.corrTable
-                        pt3['hard_limit']['high_narrow']['sdc'] = test_in.result.pt3.hardLimit.hn.sdc
-                        pt3['hard_limit']['high_narrow']['cdc'] = test_in.result.pt3.hardLimit.hn.cdc
-                        pt3['hard_limit']['high_narrow']['noise_floor'] = test_in.result.pt3.hardLimit.hn.noiseFloor
-                    if hasattr(test_in.result.pt3.hardLimit, 'ln'):
-                        pt3['hard_limit']['low_narrow']['corr_table'] = test_in.result.pt3.hardLimit.ln.corrTable
-                        pt3['hard_limit']['low_narrow']['sdc'] = test_in.result.pt3.hardLimit.ln.sdc
-                        pt3['hard_limit']['low_narrow']['cdc'] = test_in.result.pt3.hardLimit.ln.cdc
-                        pt3['hard_limit']['low_narrow']['noise_floor'] = test_in.result.pt3.hardLimit.ln.noiseFloor
-                if hasattr(test_in.result.pt3, 'linear'):
-                    if hasattr(test_in.result.pt3.linear, 'hw'):
-                        pt3['linear']['high_wide']['corr_table'] = test_in.result.pt3.linear.hw.corrTable
-                        pt3['linear']['high_wide']['noise_floor'] = test_in.result.pt3.linear.hw.noiseFloor
-                    if hasattr(test_in.result.pt3.linear, 'lw'):
-                        pt3['linear']['low_wide']['corr_table'] = test_in.result.pt3.linear.lw.corrTable
-                        pt3['linear']['low_wide']['noise_floor'] = test_in.result.pt3.linear.lw.noiseFloor
-                    if hasattr(test_in.result.pt3.linear, 'hn'):
-                        pt3['linear']['high_narrow']['corr_table'] = test_in.result.pt3.linear.hn.corrTable
-                        pt3['linear']['high_narrow']['noise_floor'] = test_in.result.pt3.linear.hn.noiseFloor
-                    if hasattr(test_in.result.pt3.linear, 'ln'):
-                        pt3['linear']['low_narrow']['corr_table'] = test_in.result.pt3.linear.ln.corrTable
-                        pt3['linear']['low_narrow']['noise_floor'] = test_in.result.pt3.linear.ln.noiseFloor
-
-                self.result['pt3'] = pt3
-        except AttributeError:
-            # Match regex for number of tests and number of failures
-            num_tests = re.findall('(Fail|FAIL|F A I L|Pass|PASS|NOT DETECTED|P A S S)', test_in.data)
-            num_fails = re.findall('(Fail|FAIL|F A I L)', test_in.data)
-
-            # Store results
-            self.result = {'sysTest': {'n_tests': len(num_tests)}}
-            self.result['sysTest']['n_failed'] = len(num_fails)
-
-    def pt3_data(self):
-        """Method for processing the data in the correlation matrices."""
-        try:
-            data_types = {'corr_table': np.array([]), 'sdc': np.array([]), 'cdc': np.array([]),
-                          'noise_floor': np.array([])}
-            test_types = {'high_wide': data_types.copy(), 'high_narrow': data_types.copy(),
-                          'low_wide': data_types.copy(),
-                          'low_narrow': data_types.copy()}
-            pt3 = {'hard_limit': copy.deepcopy(test_types), 'linear': copy.deepcopy(test_types)}
-
-            # Match regex for correlation tables
-            matches = re.findall('Lag.*?0', self.data, re.DOTALL)
-
-            # Count the number or correlation tables to process
-            correl_count = 0
-            for match in matches:
-                bm1_matches = re.findall('Bm1', match)
-                correl_count += len(bm1_matches)
-
-            # Correlation table match
-            lag_matches = re.findall('Lag.*?^\s*$', self.data, re.MULTILINE | re.DOTALL)
-
-            # Sin match
-            sin_match = re.findall('((Sin|SIN).*?^\s*$)', self.data, re.MULTILINE | re.DOTALL)[0][0]
-            sin_array = np.array(re.findall('\d+\.*\d*', sin_match), dtype=int)
-
-            # Cos match
-            cos_match = re.findall('((Cos|COS).*?^\s*$)', self.data, re.MULTILINE | re.DOTALL)[0][0]
-            cos_array = np.array(re.findall('\d+\.*\d*', cos_match), dtype=int)
-
-            # RSSI match
-            rssi_array = np.array([])
-            rssi_matches = re.findall('RSSI.*?^\s*$', self.data, re.MULTILINE | re.DOTALL)
-            for rssi_match in rssi_matches:
-                rssi_array = np.hstack((rssi_array, np.array(re.findall('\d+\.*\d*', rssi_match), dtype=int)))
-
-            # Process each set of correlation tables
-            for n, lag_match in enumerate(lag_matches):
-
-                # Count the Bm1 string to know how many tables to read
-                bm_count = len(re.findall('Bm1', lag_match))
-
-                # Extract the table into list
-                numbers = re.findall('\d+\.*\d*', lag_match)
-
-                # Create array from data in table
-                corr_data = np.array(numbers[(bm_count * 4):(bm_count * 44)],
-                                     dtype=int).reshape([8, (bm_count * 4) + 1])[:, 1::]
-
-                # Only one pt3 test. Typical of Rio Grande and Streampro
-                if bm_count == 1:
-
-                    # Assign matrix slices to corresponding variables
-                    # corr_hlimit_hgain_wband = corr_data
-                    pt3['hard_limit']['high_wide']['corr_table'] = corr_data
-                    pt3['hard_limit']['high_wide']['sdc'] = sin_array[0:4]
-                    pt3['hard_limit']['high_wide']['cdc'] = cos_array[0:4]
-                    pt3['hard_limit']['high_wide']['noise_floor'] = rssi_array[0:4]
-
-                # 4 tests arranged in groups of 2. All data are hard limited.
-                elif bm_count == 2 and correl_count == 4:
-
-                    # Hard limited wide bandwidth (n=0)
-                    if n == 0:
-
-                        pt3['hard_limit']['high_wide']['corr_table'] = corr_data[:, 0:4]
-                        pt3['hard_limit']['high_wide']['sdc'] = sin_array[n * 4: (n + 1) * 4]
-                        pt3['hard_limit']['high_wide']['cdc'] = cos_array[n * 4: (n + 1) * 4]
-                        pt3['hard_limit']['high_wide']['noise_floor'] = rssi_array[n * 4: (n + 1) * 4]
-
-                        pt3['hard_limit']['low_wide']['corr_table'] = corr_data[:, 4::]
-                        pt3['hard_limit']['low_wide']['sdc'] = sin_array[(n + 1) * 4: (n + 2) * 4]
-                        pt3['hard_limit']['low_wide']['cdc'] = cos_array[(n + 1) * 4: (n + 2) * 4]
-                        pt3['hard_limit']['low_wide']['noise_floor'] = rssi_array[(n + 1) * 4: (n + 2) * 4]
-
-                    # Hard limited narrow bandwidth (n=1)
-                    elif n == 1:
-
-                        pt3['hard_limit']['high_narrow']['corr_table'] = corr_data[:, 0:4]
-                        pt3['hard_limit']['high_narrow']['sdc'] = sin_array[(n + 1) * 4: (n + 2) * 4]
-                        pt3['hard_limit']['high_narrow']['cdc'] = cos_array[(n + 1) * 4: (n + 2) * 4]
-                        pt3['hard_limit']['high_narrow']['noise_floor'] = rssi_array[(n + 1) * 4: (n + 2) * 4]
-
-                        pt3['hard_limit']['low_narrow']['corr_table'] = corr_data[:, 4::]
-                        pt3['hard_limit']['low_narrow']['sdc'] = sin_array[(n + 2) * 4: (n + 3) * 4]
-                        pt3['hard_limit']['low_narrow']['cdc'] = cos_array[(n + 2) * 4: (n + 3) * 4]
-                        pt3['hard_limit']['low_narrow']['noise_floor'] = rssi_array[(n + 2) * 4: (n + 3) * 4]
-
-                # 8 tests arranged in sets of 2. The linear is 1st followed by the hard limit.
-                elif bm_count == 2 and correl_count == 8:
-
-                    # Hard limit bandwidth (n=0)
-                    if n == 0:
-
-                        pt3['hard_limit']['high_wide']['corr_table'] = corr_data[:, 0:4]
-                        pt3['hard_limit']['high_wide']['sdc'] = sin_array[n * 4: (n + 1) * 4]
-                        pt3['hard_limit']['high_wide']['cdc'] = cos_array[n * 4: (n + 1) * 4]
-                        pt3['hard_limit']['high_wide']['noise_floor'] = rssi_array[n * 4: (n + 1) * 4]
-
-                        pt3['hard_limit']['low_wide']['corr_table'] = corr_data[:, 4::]
-                        pt3['hard_limit']['low_wide']['sdc'] = sin_array[(n + 1) * 4: (n + 2) * 4]
-                        pt3['hard_limit']['low_wide']['cdc'] = cos_array[(n + 1) * 4: (n + 2) * 4]
-                        pt3['hard_limit']['low_wide']['noise_floor'] = rssi_array[(n + 1) * 4: (n + 2) * 4]
-
-                    # Hard limit narrow bandwidth (n=1)
-                    elif n == 1:
-
-                        pt3['hard_limit']['high_narrow']['corr_table'] = corr_data[:, 0:4]
-                        pt3['hard_limit']['high_narrow']['sdc'] = sin_array[(n + 1) * 4: (n + 2) * 4]
-                        pt3['hard_limit']['high_narrow']['cdc'] = cos_array[(n + 1) * 4: (n + 2) * 4]
-                        pt3['hard_limit']['high_narrow']['noise_floor'] = rssi_array[(n + 1) * 4: (n + 2) * 4]
-
-                        pt3['hard_limit']['low_narrow']['corr_table'] = corr_data[:, 4::]
-                        pt3['hard_limit']['low_narrow']['sdc'] = sin_array[(n + 2) * 4: (n + 3) * 4]
-                        pt3['hard_limit']['low_narrow']['cdc'] = cos_array[(n + 2) * 4: (n + 3) * 4]
-                        pt3['hard_limit']['low_narrow']['noise_floor'] = rssi_array[(n + 2) * 4: (n + 3) * 4]
-
-                    # Linear wide bandwidth (n=2)
-                    elif n == 2:
-
-                        pt3['linear']['high_wide']['corr_table'] = corr_data[:, 0:4]
-                        pt3['linear']['high_wide']['noise_floor'] = rssi_array[(n + 2) * 4: (n + 3) * 4]
-
-                        pt3['linear']['low_wide']['corr_table'] = corr_data[:, 4::]
-                        pt3['linear']['low_wide']['noise_floor'] = rssi_array[(n + 3) * 4: (n + 4) * 4]
-
-                    # Linear narrow bandwidth (n=3)
-                    elif n == 3:
-
-                        pt3['linear']['high_narrow']['corr_table'] = corr_data[:, 0:4]
-                        pt3['linear']['high_narrow']['noise_floor'] = rssi_array[(n + 3) * 4: (n + 4) * 4]
-
-                        pt3['linear']['low_narrow']['corr_table'] = corr_data[:, 4::]
-                        pt3['linear']['low_narrow']['noise_floor'] = rssi_array[(n + 4) * 4: (n + 5) * 4]
-
-                # 8 tests in groups of 4. Hard limit is the first group then the linear.
-                elif bm_count == 4:
-
-                    # Hard limit data (n=0)
-                    if n == 0:
-
-                        pt3['hard_limit']['high_wide']['corr_table'] = corr_data[:, 0:4]
-                        pt3['hard_limit']['high_wide']['sdc'] = sin_array[n * 4: (n + 1) * 4]
-                        pt3['hard_limit']['high_wide']['cdc'] = cos_array[n * 4: (n + 1) * 4]
-                        pt3['hard_limit']['high_wide']['noise_floor'] = rssi_array[n * 4: (n + 1) * 4]
-
-                        pt3['hard_limit']['low_wide']['corr_table'] = corr_data[:, 4:8]
-                        pt3['hard_limit']['low_wide']['sdc'] = sin_array[(n + 1) * 4: (n + 2) * 4]
-                        pt3['hard_limit']['low_wide']['cdc'] = cos_array[(n + 1) * 4: (n + 2) * 4]
-                        pt3['hard_limit']['low_wide']['noise_floor'] = rssi_array[(n + 1) * 4: (n + 2) * 4]
-
-                        pt3['hard_limit']['high_narrow']['corr_table'] = corr_data[:, 8:12]
-                        pt3['hard_limit']['high_narrow']['sdc'] = sin_array[(n + 2) * 4: (n + 3) * 4]
-                        pt3['hard_limit']['high_narrow']['cdc'] = cos_array[(n + 2) * 4: (n + 3) * 4]
-                        pt3['hard_limit']['high_narrow']['noise_floor'] = rssi_array[(n + 2) * 4: (n + 3) * 4]
-
-                        pt3['hard_limit']['low_narrow']['corr_table'] = corr_data[:, 12::]
-                        pt3['hard_limit']['low_narrow']['sdc'] = sin_array[(n + 3) * 4: (n + 4) * 4]
-                        pt3['hard_limit']['low_narrow']['cdc'] = cos_array[(n + 3) * 4: (n + 4) * 4]
-                        pt3['hard_limit']['low_narrow']['noise_floor'] = rssi_array[(n + 3) * 4: (n + 4) * 4]
-
-                    # Linear data (n=1)
-                    else:
-                        pt3['linear']['high_wide']['corr_table'] = corr_data[:, 0:4]
-                        pt3['linear']['high_wide']['noise_floor'] = rssi_array[(n + 3) * 4: (n + 4) * 4]
-
-                        pt3['linear']['low_wide']['corr_table'] = corr_data[:, 4:8]
-                        pt3['linear']['low_wide']['noise_floor'] = rssi_array[(n + 4) * 4: (n + 5) * 4]
-
-                        pt3['linear']['high_narrow']['corr_table'] = corr_data[:, 8:12]
-                        pt3['linear']['high_narrow']['noise_floor'] = rssi_array[(n + 5) * 4: (n + 6) * 4]
-
-                        pt3['linear']['low_narrow']['corr_table'] = corr_data[:, 12::]
-                        pt3['linear']['low_narrow']['noise_floor'] = rssi_array[(n + 6) * 4: (n + 7) * 4]
-            self.result['pt3'] = pt3
-        except Exception:
-            pass
-        #     pt3 = None
-        # self.result['pt3'] = pt3
diff --git a/qrevint_22_06_22/Classes/Python2Matlab.py b/qrevint_22_06_22/Classes/Python2Matlab.py
deleted file mode 100644
index 13d957081c6f6c251ce56748f87321e4a296dba6..0000000000000000000000000000000000000000
--- a/qrevint_22_06_22/Classes/Python2Matlab.py
+++ /dev/null
@@ -1,725 +0,0 @@
-import numpy as np
-import pandas as pd
-import scipy.io as sio
-import copy as copy
-from Classes.PreMeasurement import PreMeasurement
-
-
-class Python2Matlab(object):
-    """Converts python meas class to QRev for Matlab structure.
-
-    Attributes
-    ----------
-    matlab_dict: dict
-        Dictionary of Matlab structures
-    """
-
-    def __init__(self, meas, checked):
-        """Initialize dictionaries and convert Python data to Matlab structures.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        # Create Python to Matlab variable name conversion dictionary
-        py_2_mat_dict = self.create_py_2_mat_dict()
-
-        # Initialize Matlab dictionary
-        self.matlab_dict = dict()
-
-        # Apply conversion of Python data to be compatible with Matlab conventions
-        meas_mat = self.data2matlab(meas)
-
-        checked_idx = np.array(checked)
-        checked_idx_meas = np.copy(checked_idx)
-        np.append(checked_idx_meas, len(meas_mat.extrap_fit.sel_fit)-1)
-
-        # Convert Python data structure to Matlab
-        self.matlab_dict['stationName'] = meas_mat.station_name
-        if self.matlab_dict['stationName'] is None:
-            self.matlab_dict['stationName'] = ''
-        self.matlab_dict['stationNumber'] = meas_mat.station_number
-        if self.matlab_dict['stationNumber'] is None:
-            self.matlab_dict['stationNumber'] = ''
-        self.matlab_dict['persons'] = meas_mat.persons
-        self.matlab_dict['meas_number'] = meas_mat.meas_number
-        self.matlab_dict['stage_start_m'] = meas_mat.stage_start_m
-        self.matlab_dict['stage_end_m'] = meas_mat.stage_end_m
-        self.matlab_dict['stage_meas_m'] = meas_mat.stage_meas_m
-        self.matlab_dict['processing'] = meas_mat.processing
-        self.matlab_dict['extTempChk'] = meas_mat.ext_temp_chk
-        self.matlab_dict['userRating'] = meas_mat.user_rating
-        self.matlab_dict['initialSettings'] = meas_mat.initial_settings
-        self.matlab_dict['comments'] = self.comment2struct(meas_mat.comments)
-        self.matlab_dict['compassCal'] = self.listobj2struct(meas_mat.compass_cal, py_2_mat_dict)
-        self.matlab_dict['compassEval'] = self.listobj2struct(meas_mat.compass_eval, py_2_mat_dict)
-        self.matlab_dict['sysTest'] = self.listobj2struct(meas_mat.system_tst, py_2_mat_dict)
-        discharge = np.copy(meas_mat.discharge)
-        discharge_sel = [discharge[i] for i in checked_idx]
-        self.matlab_dict['discharge'] = self.listobj2struct(discharge_sel, py_2_mat_dict)
-        transects = np.copy(meas_mat.transects)
-        transects_sel = [transects[i] for i in checked_idx]
-        self.matlab_dict['transects'] = self.listobj2struct(transects_sel, py_2_mat_dict)
-        extrap = copy.deepcopy(meas_mat.extrap_fit)
-        self.matlab_dict['extrapFit'] = self.listobj2struct([extrap], py_2_mat_dict)
-        # Check for multiple moving-bed tests
-        if type(meas_mat.mb_tests) == list:
-            mb_tests = self.listobj2struct(meas_mat.mb_tests, py_2_mat_dict)
-        else:
-            mb_tests = self.obj2dict(meas_mat.mb_tests, py_2_mat_dict)
-        if len(mb_tests) == 0:
-            mb_tests = np.array([])
-
-        self.matlab_dict['mbTests'] = mb_tests
-
-        self.matlab_dict['observed_no_moving_bed'] = meas_mat.observed_no_moving_bed
-
-        self.matlab_dict['uncertainty'] = self.listobj2struct([meas_mat.uncertainty], py_2_mat_dict)
-        self.matlab_dict['qa'] = self.listobj2struct([meas_mat.qa], py_2_mat_dict)
-        self.matlab_dict['run_oursin'] = meas_mat.run_oursin
-        if meas_mat.oursin is not None:
-            self.matlab_dict['oursin'] = self.listobj2struct([meas_mat.oursin], py_2_mat_dict)
-
-
-    @staticmethod
-    def listobj2struct(list_in, new_key_dict=None):
-        """Converts a list of objects to a structured array.
-
-        Parameters
-        ----------
-        list_in: list
-            List of objects
-        new_key_dict: dict
-            Dictionary to translate python variable names to Matlab variable names
-
-        Returns
-        -------
-        struct: np.array
-            Structured array
-        """
-
-        # Verify that list_in exists
-        if list_in:
-
-            # Create data type for each variable in object
-            keys = list(vars(list_in[0]).keys())
-            data_type = []
-            for key in keys:
-                if new_key_dict is not None and key in new_key_dict:
-                    if new_key_dict[key] is None:
-                        data_type.append((np.nan, list))
-                    else:
-                        data_type.append((new_key_dict[key], list))
-                else:
-                    data_type.append((key, list))
-
-            # Create structured array based on data type and length of list
-            dt = np.dtype(data_type)
-            struct = np.zeros((len(list_in),), dt)
-
-            # Populate the structure with data from the objects
-            for n, item in enumerate(list_in):
-
-                if type(item) is list:
-                    # If item is a list apply recursion
-                    struct = Python2Matlab.listobj2struct(item, new_key_dict)
-                else:
-                    # If item is not a list convert it to a dictionary
-                    new_dict = Python2Matlab.obj2dict(item, new_key_dict)
-                    # Change name for consistency with Matlab is necessary
-                    for key in new_dict:
-                        if new_key_dict is not None and key in new_key_dict:
-                            struct[new_key_dict[key]][n] = new_dict[key]
-                        else:
-                            struct[key][n] = new_dict[key]
-        else:
-            struct = np.array([np.nan])
-
-        return struct
-
-    @staticmethod
-    def change_dict_keys(dict_in, new_key_dict):
-        """Recursively changes the name of dictionary keys and checks for str data types and converts them to arrays.
-
-        Parameters
-        ----------
-        dict_in: dict
-            Dictionary with keys that need a name change
-        new_key_dict: dict
-            Dictionary to cross reference existing key to new key names
-        """
-
-        dict_out = dict()
-
-        for key in dict_in:
-            # Iterate on nested dictionaries
-            if type(dict_in[key]) is dict:
-                dict_in[key] = Python2Matlab.change_dict_keys(dict_in[key], new_key_dict)
-
-            # If a list contains a str variable, such as messages, convert the string to an array
-            if type(dict_in[key]) is list:
-                for line in range(len(dict_in[key])):
-                    if type(line) == str:
-                        for col in range(len(dict_in[key][line])):
-                            if type(dict_in[key][line][col]) is str:
-                                dict_in[key][line][col] = np.array([list(dict_in[key][line][col])])
-
-            # Change key if needed
-            if new_key_dict is not None and key in new_key_dict:
-                dict_out[new_key_dict[key]] = dict_in[key]
-            else:
-                dict_out[key] = dict_in[key]
-
-        return dict_out
-
-    @staticmethod
-    def obj2dict(obj, new_key_dict=None):
-        """Converts object variables to dictionaries. Works recursively to all levels of objects.
-
-        Parameters
-        ----------
-        obj: object
-            Object of some class
-        new_key_dict: dict
-            Dictionary to translate python variable names to Matlab variable names
-
-        Returns
-        -------
-        obj_dict: dict
-            Dictionary of all object variables
-        """
-        obj_dict = vars(obj)
-        new_dict = dict()
-        for key in obj_dict:
-
-            # If variable is another object convert to dictionary recursively
-            if str(type(obj_dict[key]))[8:13] == 'Class':
-                obj_dict[key] = Python2Matlab.obj2dict(obj_dict[key], new_key_dict)
-
-            # If variable is a list of objects convert to dictionary
-            elif type(obj_dict[key]) is list and len(obj_dict[key]) > 0 \
-                    and str(type(obj_dict[key][0]))[8:13] == 'Class':
-                obj_dict[key] = Python2Matlab.listobj2struct(obj_dict[key], new_key_dict)
-
-            elif type(obj_dict[key]) is dict:
-                obj_dict[key] = Python2Matlab.change_dict_keys(obj_dict[key], new_key_dict)
-
-            elif type(obj_dict[key]) is pd.DataFrame:
-                obj_dict[key] = obj_dict[key].to_numpy()
-
-            # If variable is None rename as necessary and convert None to empty list
-            if obj_dict[key] is None:
-                if new_key_dict is not None and key in new_key_dict:
-                    new_dict[new_key_dict[key]] = []
-                else:
-                    new_dict[key] = []
-            # If variable is not None rename as necessary
-            elif new_key_dict is not None and key in new_key_dict:
-                new_dict[new_key_dict[key]] = obj_dict[key]
-            else:
-                new_dict[key] = obj_dict[key]
-
-        return new_dict
-
-    @staticmethod
-    def comment2struct(comments):
-        """Convert comments to a structure.
-
-        Parameters
-        ----------
-        comments: list
-            List of comments
-
-        Returns
-        -------
-        struct: np.ndarray
-            Array of comments
-
-        """
-        struct = np.zeros((len(comments),), dtype=np.object)
-        cell = np.zeros((1,), dtype=np.object)
-        for n, line in enumerate(comments):
-            cell[0] = line
-            struct[n] = np.copy(cell)
-        return struct
-
-    @staticmethod
-    def listobj2dict(list_in, new_key_dict=None):
-        """Converts list of objects to list of dictionaries. Works recursively to all levels of objects.
-
-        Parameters
-        ----------
-        list_in: list
-            List of objects of some class
-        new_key_dict: dict
-            Dictionary to translate python variable names to Matlab variable names
-
-        Returns
-        -------
-        new_list: list
-            List of dictionaries
-        """
-        new_list = []
-        for obj in list_in:
-            new_list.append(Python2Matlab.obj2dict(obj, new_key_dict))
-        return new_list
-
-    @staticmethod
-    def create_py_2_mat_dict():
-        """Creates a dictionary to cross reference Python names with Matlab names
-
-        Returns
-        -------
-        py_2_mat_dict: dict
-            Dictionary of python key to Matlab variable
-        """
-
-        py_2_mat_dict = {'Python': 'Matlab',
-                         'align_correction_deg': 'alignCorrection_deg',
-                         'altitude_ens_m': 'altitudeEns_m',
-                         'avg_method': 'avgMethod',
-                         'beam_angle_deg': 'beamAngle_deg',
-                         'beam_filter': 'beamFilter',
-                         'beam_pattern': 'beamPattern',
-                         'blanking_distance_m': 'blankingDistance_m',
-                         'boat_vel': 'boatVel',
-                         'bot_diff': 'botdiff',
-                         'bot_method': 'botMethod',
-                         'bot_method_auto': 'botMethodAuto',
-                         'bot_method_orig': 'botMethodOrig',
-                         'bot_r2': 'botrsqr',
-                         'bottom_ens': 'bottomEns',
-                         'bottom_mode': 'bottomMode',
-                         'bt_depths': 'btDepths',
-                         'bt_vel': 'btVel',
-                         'cell_depth_normalized': 'cellDepthNormalized',
-                         'cells_above_sl': 'cellsAboveSL',
-                         'cells_above_sl_bt': 'cellsAboveSLbt',
-                         'compass_cal': 'compassCal',
-                         'compass_diff_deg': 'compassDiff_deg',
-                         'compass_eval': 'compassEval',
-                         'configuration_commands': 'configurationCommands',
-                         'coord_sys': 'coordSys',
-                         'corr_table': 'corrTable',
-                         'correction_factor': 'correctionFactor',
-                         'cov_95': 'cov95',
-                         'cov_95_user': 'cov95User',
-                         'cust_coef': 'custCoef',
-                         'd_filter': 'dFilter',
-                         'd_filter_thresholds': 'dFilterThreshold',
-                         'data_extent': 'dataExtent',
-                         'data_orig': 'dataOrig',
-                         'data_type': 'dataType',
-                         'date_time': 'dateTime',
-                         'depth_beams_m': 'depthBeams_m',
-                         'depth_cell_depth_m': 'depthCellDepth_m',
-                         'depth_cell_depth_orig_m': 'depthCellDepthOrig_m',
-                         'depth_cell_size_m': 'depthCellSize_m',
-                         'depth_cell_size_orig_m': 'depthCellSizeOrig_m',
-                         'depth_depth_m': 'depthCellDepth_m',
-                         'depth_source_ens': 'depthSourceEns',
-                         'depth_freq_kHz': 'depthFreq_Hz',
-                         'depth_invalid_index': 'depthInvalidIndex',
-                         'depth_orig_m': 'depthOrig_m',
-                         'depth_processed_m': 'depthProcessed_m',
-                         'depth_source': 'depthSource',
-                         'depths': 'depths',
-                         'diff_qual_ens': 'diffQualEns',
-                         'dist_us_m': 'distUS_m',
-                         'distance_m': 'dist_m',
-                         'draft_orig_m': 'draftOrig_m',
-                         'draft_use_m': 'draftUse_m',
-                         'ds_depths': 'dsDepths',
-                         'edges_95': 'edges95',
-                         'edges_95_user': 'edges95User',
-                         'end_serial_time': 'endSerialTime',
-                         'ens_duration_sec': 'ensDuration_sec',
-                         'excluded_dist_m': 'excludedDist',
-                         'exp_method': 'expMethod',
-                         'exponent_95_ci': 'exponent95confint',
-                         'exponent_auto': 'exponentAuto',
-                         'exponent_orig': 'exponentOrig',
-                         'ext_gga_altitude_m': 'extGGAAltitude_m',
-                         'ext_gga_differential': 'extGGADifferential',
-                         'ext_gga_hdop': 'extGGAHDOP',
-                         'ext_gga_lat_deg': 'extGGALat_deg',
-                         'ext_gga_lon_deg': 'extGGALon_deg',
-                         'ext_gga_num_sats': 'extGGANumSats',
-                         'ext_gga_serial_time': 'extGGASerialTime',
-                         'ext_gga_utc': 'extGGAUTC',
-                         'ext_temp_chk': 'extTempChk',
-                         'ext_vtg_course_deg': 'extVTGCourse_deg',
-                         'ext_vtg_speed_mps': 'extVTGSpeed_mps',
-                         'extrap_fit': 'extrapFit',
-                         'extrapolation_95': 'extrapolation95',
-                         'extrapolation_95_user': 'extrapolation95User',
-                         'file_name': 'fileName',
-                         'filter_type': 'filterType',
-                         'fit_method': 'fitMethod',
-                         'fit_r2': 'fitrsqr',
-                         'flow_dir_deg': 'flowDir_deg',
-                         'flow_dir': 'flowDir_deg',
-                         'flow_spd_mps': 'flowSpd_mps',
-                         'frequency_khz': 'frequency_hz',
-                         'gga_lat_ens_deg': 'ggaLatEns_deg',
-                         'gga_lon_ens_deg': 'ggaLonEns_deg',
-                         'gga_position_method': 'ggaPositionMethod',
-                         'gga_serial_time_ens': 'ggaSerialTimeEns',
-                         'gga_vel': 'ggaVel',
-                         'gga_velocity_ens_mps': 'ggaVelocityEns_mps',
-                         'gga_velocity_method': 'ggaVelocityMethod',
-                         'gps_HDOP_filter': 'gpsHDOPFilter',
-                         'gps_HDOP_filter_change': 'gpsHDOPFilterChange',
-                         'gps_HDOP_filter_max': 'gpsHDOPFilterMax',
-                         'gps_altitude_filter': 'gpsAltitudeFilter',
-                         'gps_altitude_filter_change': 'gpsAltitudeFilterChange',
-                         'gps_diff_qual_filter': 'gpsDiffQualFilter',
-                         'hard_limit': 'hardLimit',
-                         'hdop_ens': 'hdopEns',
-                         'high_narrow': 'hn',
-                         'high_wide': 'hw',
-                         'in_transect_idx': 'inTransectIdx',
-                         'initial_settings': 'initialSettings',
-                         'int_cells': 'intCells',
-                         'int_ens': 'intEns',
-                         'interp_type': 'interpType',
-                         'interpolate_cells': 'interpolateCells',
-                         'interpolate_ens': 'interpolateEns',
-                         'invalid_95': 'invalid95',
-                         'invalid_index': 'invalidIndex',
-                         'invalid_95_user': 'invalid95User',
-                         'left_idx': 'leftidx',
-                         'low_narrow': 'ln',
-                         'low_wide': 'lw',
-                         'mag_error': 'magError',
-                         'mag_var_orig_deg': 'magVarOrig_deg',
-                         'mag_var_deg': 'magVar_deg',
-                         'man_bot': 'manBot',
-                         'man_exp': 'manExp',
-                         'man_top': 'manTop',
-                         'mb_dir': 'mbDir_deg',
-                         'mb_spd_mps': 'mbSpd_mps',
-                         'mb_tests': 'mbTests',
-                         'meas': 'meas_struct',
-                         'middle_cells': 'middleCells',
-                         'middle_ens': 'middleEns',
-                         'moving_bed': 'movingBed',
-                         'moving_bed_95': 'movingBed95',
-                         'moving_bed_95_user': 'movingBed95User',
-                         'n_failed': 'nFailed',
-                         'n_tests': 'nTests',
-                         'nav_ref': 'navRef',
-                         'near_bed_speed_mps': 'nearBedSpeed_mps',
-                         'noise_floor': 'noiseFloor',
-                         'norm_data': 'normData',
-                         'ns_exp': 'nsExponent',
-                         'ns_exponent': 'nsexponent',
-                         'num_invalid': 'numInvalid',
-                         'num_sats_ens': 'numSatsEns',
-                         'number_ensembles': 'numEns2Avg',
-                         'orig_coord_sys': 'origCoordSys',
-                         'orig_ref': 'origNavRef',
-                         'orig_nav_ref': 'origNavRef',
-                         'orig_sys': 'origCoordSys',
-                         'original_data': 'originalData',
-                         'per_good_ens': 'perGoodEns',
-                         'percent_invalid_bt': 'percentInvalidBT',
-                         'percent_mb': 'percentMB',
-                         'pitch_limit': 'pitchLimit',
-                         'pp_exp': 'ppExponent',
-                         'pp_exponent': 'ppexponent',
-                         'processed_source': 'processedSource',
-                         'q_cns_mean': 'qCNSmean',
-                         'q_cns_opt_mean': 'qCNSoptmean',
-                         'q_cns_opt_per_diff': 'qCNSoptperdiff',
-                         'q_cns_per_diff': 'qCNSperdiff',
-                         'q_man_mean': 'qManmean',
-                         'q_man_per_diff': 'qManperdiff',
-                         'q_3p_ns_mean': 'q3pNSmean',
-                         'q_3p_ns_opt_mean': 'q3pNSoptmean',
-                         'q_3p_ns_opt_per_diff': 'q3pNSoptperdiff',
-                         'q_3p_ns_per_diff': 'q3pNSperdiff',
-                         'q_pp_mean': 'qPPmean',
-                         'q_pp_opt_mean': 'qPPoptmean',
-                         'q_pp_opt_per_diff': 'qPPoptperdiff',
-                         'q_pp_per_diff': 'qPPperdiff',
-                         'q_run_threshold_caution': 'qRunThresholdCaution',
-                         'q_run_threshold_warning': 'qRunThresholdWarning',
-                         'q_sensitivity': 'qSensitivity',
-                         'q_total_threshold_caution': 'qTotalThresholdWarning',
-                         'q_total_threshold_warning': 'qTotalThresholdCaution',
-                         'raw_gga_altitude_m': 'rawGGAAltitude_m',
-                         'raw_gga_delta_time': 'rawGGADeltaTime',
-                         'raw_gga_differential': 'rawGGADifferential',
-                         'raw_gga_hdop': 'rawGGAHDOP',
-                         'raw_gga_lat_deg': 'rawGGALat_deg',
-                         'raw_gga_lon_deg': 'rawGGALon_deg',
-                         'raw_gga_serial_time': 'rawGGASerialTime',
-                         'raw_gga_utc': 'rawGGAUTC',
-                         'raw_gga_num_sats': 'rawGGANumSats',
-                         'raw_vel_mps': 'rawVel_mps',
-                         'raw_vtg_course_deg': 'rawVTGCourse_deg',
-                         'raw_vtg_delta_time': 'rawVTGDeltaTime',
-                         'raw_vtg_mode_indicator': 'rawVTGModeIndicator',
-                         'raw_vtg_speed_mps': 'rawVTGSpeed_mps',
-                         'rec_edge_method': 'recEdgeMethod',
-                         'right_idx': 'rightidx',
-                         'roll_limit': 'rollLimit',
-                         'rssi_units': 'rssiUnits',
-                         'sel_fit': 'selFit',
-                         'serial_num': 'serialNum',
-                         'sl_lag_effect_m': 'slLagEffect_m',
-                         'sl_cutoff_number': 'slCutoffNum',
-                         'sl_cutoff_percent': 'slCutoffPer',
-                         'sl_cutoff_type': 'slCutoffType',
-                         'sl_cutoff_m': 'slCutoff_m',
-                         'smooth_depth': 'smoothDepth',
-                         'smooth_filter': 'smoothFilter',
-                         'smooth_lower_limit': 'smoothLowerLimit',
-                         'smooth_speed': 'smoothSpeed',
-                         'smooth_upper_limit': 'smoothUpperLimit',
-                         'snr_filter': 'snrFilter',
-                         'speed_of_sound_mps': 'speedOfSound_mps',
-                         'snr_rng': 'snrRng',
-                         'start_edge': 'startEdge',
-                         'start_serial_time': 'startSerialTime',
-                         'station_name': 'stationName',
-                         'station_number': 'stationNumber',
-                         'stationary_cs_track': 'stationaryCSTrack',
-                         'stationary_mb_vel': 'stationaryMBVel',
-                         'stationary_us_track': 'stationaryUSTrack',
-                         'system_test': 'sysTest',
-                         'system_tst': 'systemTest',
-                         'systematic_user': 'systematicUser',
-                         't_matrix': 'tMatrix',
-                         'temperature': 'temperature',
-                         'temperature_deg_c': 'temperature_degC',
-                         'test_quality': 'testQuality',
-                         'time_stamp': 'timeStamp',
-                         'top_ens': 'topEns',
-                         'top_fit_r2': 'topfitr2',
-                         'top_max_diff': 'topmaxdiff',
-                         'top_method': 'topMethod',
-                         'top_method_auto': 'topMethodAuto',
-                         'top_method_orig': 'topMethodOrig',
-                         'top_r2': 'topr2',
-                         'total_95': 'total95',
-                         'total_uncorrected': 'totalUncorrected',
-                         'total_95_user': 'total95User',
-                         'transect_duration_sec': 'transectDuration_sec',
-                         'u_auto': 'uAuto',
-                         'u_processed_mps': 'uProcessed_mps',
-                         'u_earth_no_ref_mps': 'uEarthNoRef_mps',
-                         'unit_normalized_z': 'unitNormalizedz',
-                         'unit_normalized': 'unitNormalized',
-                         'unit_normalized_25': 'unitNormalized25',
-                         'unit_normalized_75': 'unitNormalized75',
-                         'unit_normalized_med': 'unitNormalizedMed',
-                         'unit_normalized_no': 'unitNormalizedNo',
-                         'use_2_correct': 'use2Correct',
-                         'user_discharge_cms': 'userQ_cms',
-                         'user_rating': 'userRating',
-                         'user_valid': 'userValid',
-                         'utm_ens_m': 'UTMEns_m',
-                         'v_processed_mps': 'vProcessed_mps',
-                         'v_earth_no_ref_mps': 'vEarthNoRef_mps',
-                         'valid_beams': 'validBeams',
-                         'valid_data': 'validData',
-                         'valid_data_method': 'validDataMethod',
-                         'vb_depths': 'vbDepths',
-                         'vel_method': 'velMethod',
-                         'vtg_vel': 'vtgVel',
-                         'vtg_velocity_ens_mps': 'vtgVelocityEns_mps',
-                         'vtg_velocity_method': 'vtgVelocityMethod',
-                         'w_filter': 'wFilter',
-                         'w_filter_thresholds': 'wFilterThreshold',
-                         'w_vel': 'wVel',
-                         'water_mode': 'waterMode',
-                         'wt_depth_filter': 'wtDepthFilter',
-                         'z_auto': 'zAuto',
-                         'all_invalid': 'allInvalid',
-                         'q_max_run': 'qMaxRun',
-                         'q_max_run_caution': 'qRunCaution',
-                         'q_max_run_warning': 'qRunWarning',
-                         'q_total': 'qTotal',
-                         'q_total_caution': 'qTotalCaution',
-                         'q_total_warning': 'qTotalWarning',
-                         'sta_name': 'staName',
-                         'sta_number': 'staNumber',
-                         'left_q': 'leftQ',
-                         'left_q_idx': 'leftQIdx',
-                         'right_q': 'rightQ',
-                         'right_q_idx': 'rightQIdx',
-                         'left_sign': 'leftSign',
-                         'right_sign': 'rightSign',
-                         'right_dist_moved_idx': 'rightDistMovedIdx',
-                         'left_dist_moved_idx': 'leftDistMovedIdx',
-                         'left_zero': 'leftzero',
-                         'left_zero_idx': 'leftZeroIdx',
-                         'right_zero': 'rightzero',
-                         'right_zero_idx': 'rightZeroIdx',
-                         'left_type': 'leftType',
-                         'right_type': 'rightType',
-                         'pitch_mean_warning_idx': 'pitchMeanWarningIdx',
-                         'pitch_mean_caution_idx': 'pitchMeanCautionIdx',
-                         'pitch_std_caution_idx': 'pitchStdCautionIdx',
-                         'roll_mean_warning_idx': 'rollMeanWarningIdx',
-                         'roll_mean_caution_idx': 'rollMeanCautionIdx',
-                         'roll_std_caution_idx': 'rollStdCautionIdx',
-                         'magvar_idx': 'magvarIdx',
-                         'mag_error_idx': 'magErrorIdx',
-                         'invalid_transect_left_idx': 'invalidTransLeftIdx',
-                         'invalid_transect_right_idx': 'invalidTransRightIdx',
-                         }
-        return py_2_mat_dict
-
-    @staticmethod
-    def save_matlab_file(meas, file_name, version, checked=None):
-        """Saves the measurement class and all data into a Matlab file using the variable names and structure
-        from the QRev Matlab version.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        file_name: str
-            File name of saved Matlab file
-        version: str
-            QRev version
-        checked: list
-            Identifies which transects should be saved.
-        """
-
-        if checked is None:
-            checked = list(range(len(meas.transects)))
-
-        # Convert Python objects to Matlab structure
-        mat_struct = {'meas_struct': Python2Matlab(meas, checked).matlab_dict, 'version': version}
-        sio.savemat(file_name=file_name,
-                    mdict=mat_struct,
-                    appendmat=True,
-                    format='5',
-                    long_field_names=True,
-                    do_compression=True,
-                    oned_as='row')
-
-    @staticmethod
-    def data2matlab(meas):
-        """Apply changes to the Python data to replicate QRev for Matlab conventions.
-
-        Parameters
-        ----------
-        meas: Measurement
-            object of class Measurement
-
-        Returns
-        -------
-        meas_mat: Measurement
-            Deepcopy of meas with changes to replicate QRev for Matlab conventions
-        """
-
-        # Make copy to prevent changing Python meas data
-        meas_mat = copy.deepcopy(meas)
-
-        # Process changes for each transect
-        for transect in meas_mat.transects:
-            transect = Python2Matlab.reconfigure_transect(transect)
-
-        # Process changes for each moving-bed test transect
-        if len(meas.mb_tests) > 0:
-            for test in meas_mat.mb_tests:
-                test.transect = Python2Matlab.reconfigure_transect(test.transect)
-
-        # Adjust 1-D array to be row based
-        for fit in meas_mat.extrap_fit.sel_fit:
-            if fit.u is None:
-                fit.u = np.nan
-                fit.z = np.nan
-            else:
-                fit.u = fit.u.reshape(-1, 1)
-                fit.u_auto = fit.u_auto.reshape(-1, 1)
-                fit.z = fit.z.reshape(-1, 1)
-                fit.z_auto = fit.z_auto.reshape(-1, 1)
-
-        # Adjust norm_data indices from 0 base to 1 base
-        for dat in meas_mat.extrap_fit.norm_data:
-            dat.valid_data = dat.valid_data + 1
-
-        # If system tests, compass calibrations, or compass evaluations don't exist create empty objects
-        if len(meas_mat.system_tst) == 0:
-            meas_mat.system_tst = [PreMeasurement()]
-        if len(meas_mat.compass_eval) == 0:
-            meas_mat.compass_eval = [PreMeasurement()]
-        if len(meas_mat.compass_cal) == 0:
-            meas_mat.compass_cal = [PreMeasurement()]
-
-        # If only one moving-bed test change from list to MovingBedTest object
-        if len(meas_mat.mb_tests) == 1:
-            meas_mat.mb_tests = meas_mat.mb_tests[0]
-            # Convert message to cell array for Matlab
-            if len(meas_mat.mb_tests.messages) > 0:
-                meas_mat.mb_tests.messages = np.array(meas_mat.mb_tests.messages).astype(np.object)
-
-        # Fix user and adcp temperature for QRev Matlab
-        if np.isnan(meas_mat.ext_temp_chk['user']):
-            meas_mat.ext_temp_chk['user'] = ''
-        if np.isnan(meas_mat.ext_temp_chk['adcp']):
-            meas_mat.ext_temp_chk['adcp'] = ''
-
-        return meas_mat
-
-    @staticmethod
-    def reconfigure_transect(transect):
-        """Changes variable names, rearranges arrays, and adjusts time for consistency with original QRev Matlab output.
-
-        Parameters
-        ----------
-        transect: TransectData
-            Object of TransectData
-
-        Returns
-        -------
-        transect: TransectData
-            Revised object of TransectData
-        """
-
-        # Change selected boat velocity identification
-        if transect.boat_vel.selected == 'bt_vel':
-            transect.boat_vel.selected = 'btVel'
-        elif transect.boat_vel.selected == 'gga_vel':
-            transect.boat_vel.selected = 'ggaVel'
-        elif transect.boat_vel.selected == 'vtg_vel':
-            transect.boat_vel.selected = 'vtgVel'
-
-        # Change selected depth identification
-        if transect.depths.selected == 'bt_depths':
-            transect.depths.selected = 'btDepths'
-        elif transect.depths.selected == 'vb_depths':
-            transect.depths.selected = 'vbDepths'
-        elif transect.depths.selected == 'ds_depths':
-            transect.depths.selected = 'dsDepths'
-
-        # Adjust in transect number for 1 base rather than 0 base
-        transect.in_transect_idx = transect.in_transect_idx + 1
-
-        # Adjust arrangement of 3-D arrays for consistency with Matlab
-        transect.w_vel.raw_vel_mps = np.moveaxis(transect.w_vel.raw_vel_mps, 0, 2)
-        transect.w_vel.corr = np.moveaxis(transect.w_vel.corr, 0, 2)
-        transect.w_vel.rssi = np.moveaxis(transect.w_vel.rssi, 0, 2)
-        transect.w_vel.valid_data = np.moveaxis(transect.w_vel.valid_data, 0, 2)
-        if len(transect.adcp.t_matrix.matrix.shape) == 3:
-            transect.adcp.t_matrix.matrix = np.moveaxis(transect.adcp.t_matrix.matrix, 2, 0)
-
-        # Adjust 2-D array to be row based
-        if transect.adcp.configuration_commands is not None:
-            transect.adcp.configuration_commands = transect.adcp.configuration_commands.reshape(-1, 1)
-
-        # Adjust serial time to Matlab convention
-        seconds_day = 86400
-        time_correction = 719529.0000000003
-        transect.date_time.start_serial_time = (transect.date_time.start_serial_time / seconds_day) \
-            + time_correction
-        transect.date_time.end_serial_time = (transect.date_time.end_serial_time / seconds_day) + time_correction
-        return transect
diff --git a/qrevint_22_06_22/Classes/QAData.py b/qrevint_22_06_22/Classes/QAData.py
deleted file mode 100644
index 05c49d727c4b921d6baad0ef36f844c87351cf29..0000000000000000000000000000000000000000
--- a/qrevint_22_06_22/Classes/QAData.py
+++ /dev/null
@@ -1,2525 +0,0 @@
-import copy
-import numpy as np
-from Classes.Uncertainty import Uncertainty
-from Classes.QComp import QComp
-from Classes.MovingBedTests import MovingBedTests
-from Classes.TransectData import TransectData
-
-
-class QAData(object):
-    """Evaluates and stores quality assurance characteristics and messages.
-
-    Attributes
-    ----------
-    q_run_threshold_caution: int
-        Caution threshold for interpolated discharge for a run of invalid ensembles, in percent.
-    q_run_threshold_warning: int
-        Warning threshold for interpolated discharge for a run of invalid ensembles, in percent.
-    q_total_threshold_caution: int
-        Caution threshold for total interpolated discharge for invalid ensembles, in percent.
-    q_total_threshold_warning: int
-        Warning threshold for total interpolated discharge for invalid ensembles, in percent.
-    transects: dict
-        Dictionary of quality assurance checks for transects
-    system_tst: dict
-        Dictionary of quality assurance checks on the system test(s)
-    compass: dict
-        Dictionary of quality assurance checks on compass calibration and evaluations
-    temperature: dict
-        Dictionary of quality assurance checks on temperature comparions and variation
-    movingbed: dict
-        Dictionary of quality assurance checks on moving-bed tests
-    user: dict
-        Dictionary of quality assurance checks on user input data
-    boat: dict
-        Dictionary of quality assurance checks on boat velocities
-    bt_vel: dict
-        Dictionary of quality assurance checks on bottom track velocities
-    gga_vel: dict
-        Dictionary of quality assurance checks on gga boat velocities
-    vtg_vel: dict
-        Dictionary of quality assurance checks on vtg boat velocities
-    w_vel: dict
-        Dictionary of quality assurance checks on water track velocities
-    extrapolation: dict
-        Dictionary of quality assurance checks on extrapolations
-    edges: dict
-        Dictionary of quality assurance checks on edges
-    """
-
-    def __init__(self, meas, mat_struct=None, compute=True):
-        """Checks the measurement for all quality assurance issues.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        # Set default thresholds
-        self.q_run_threshold_caution = 3
-        self.q_run_threshold_warning = 5
-        self.q_total_threshold_caution = 10
-        self.q_total_threshold_warning = 25
-
-        # Initialize instance variables
-        self.transects = dict()
-        self.system_tst = dict()
-        self.compass = dict()
-        self.temperature = dict()
-        self.movingbed = dict()
-        self.user = dict()
-        self.depths = dict()
-        self.boat = dict()
-        self.bt_vel = dict()
-        self.gga_vel = dict()
-        self.vtg_vel = dict()
-        self.w_vel = dict()
-        self.extrapolation = dict()
-        self.edges = dict()
-        self.settings_dict = dict()
-        self.settings_dict['tab_compass'] = 'Default'
-        self.settings_dict['tab_tempsal'] = 'Default'
-        self.settings_dict['tab_mbt'] = 'Default'
-        self.settings_dict['tab_bt'] = 'Default'
-        self.settings_dict['tab_gps'] = 'Default'
-        self.settings_dict['tab_depth'] = 'Default'
-        self.settings_dict['tab_wt'] = 'Default'
-        self.settings_dict['tab_extrap'] = 'Default'
-        self.settings_dict['tab_edges'] = 'Default'
-
-        if compute:
-            # Apply QA checks
-            self.transects_qa(meas)
-            self.system_tst_qa(meas)
-            self.compass_qa(meas)
-            self.temperature_qa(meas)
-            self.moving_bed_qa(meas)
-            self.user_qa(meas)
-            self.depths_qa(meas)
-            self.boat_qa(meas)
-            self.water_qa(meas)
-            self.extrapolation_qa(meas)
-            self.edges_qa(meas)
-            self.check_bt_setting(meas)
-            self.check_wt_settings(meas)
-            self.check_depth_settings(meas)
-            self.check_gps_settings(meas)
-            self.check_edge_settings(meas)
-            self.check_extrap_settings(meas)
-            self.check_tempsal_settings(meas)
-            self.check_mbt_settings(meas)
-            self.check_compass_settings(meas)
-            if meas.oursin is not None:
-                self.check_oursin(meas)
-        else:
-            self.populate_from_qrev_mat(meas, mat_struct)
-
-    def populate_from_qrev_mat(self, meas, meas_struct):
-        """Populates the object using data from previously saved QRev Matlab file.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of Measurement
-        meas_struct: mat_struct
-           Matlab data structure obtained from sio.loadmat
-        """
-
-        # Generate a new QA object using the measurement data and the current QA code.
-        # When QA checks from the current QA are not available from old QRev files, these
-        # checks will be included to supplement the old QRev file data.
-        new_qa = QAData(meas)
-        if hasattr(meas_struct, 'qa'):
-            # Set default thresholds
-            self.q_run_threshold_caution = meas_struct.qa.qRunThresholdCaution
-            self.q_run_threshold_warning = meas_struct.qa.qRunThresholdWarning
-            if hasattr(meas_struct.qa, 'qTotalThresholdCaution'):
-                self.q_total_threshold_caution = meas_struct.qa.qTotalThresholdCaution
-            else:
-                self.q_total_threshold_caution = 10
-            self.q_total_threshold_warning = meas_struct.qa.qTotalThresholdWarning
-
-            # Initialize instance variables
-            self.transects = dict()
-            self.transects['duration'] = meas_struct.qa.transects.duration
-            self.transects['messages'] = self.make_list(meas_struct.qa.transects.messages)
-            self.transects['number'] = meas_struct.qa.transects.number
-            self.transects['recip'] = meas_struct.qa.transects.recip
-            self.transects['sign'] = meas_struct.qa.transects.sign
-            self.transects['status'] = meas_struct.qa.transects.status
-            self.transects['uncertainty'] = meas_struct.qa.transects.uncertainty
-            self.system_tst = dict()
-            self.system_tst['messages'] = self.make_list(meas_struct.qa.systemTest.messages)
-            self.system_tst['status'] = meas_struct.qa.systemTest.status
-            self.compass = dict()
-            self.compass['messages'] = self.make_list(meas_struct.qa.compass.messages)
-            self.compass['status'] = meas_struct.qa.compass.status
-            if hasattr(meas_struct.qa.compass, 'status1'):
-                self.compass['status1'] = meas_struct.qa.compass.status1
-                self.compass['status2'] = meas_struct.qa.compass.status2
-            else:
-                self.compass['status1'] = 'good'
-                self.compass['status2'] = 'good'
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.compass, 'magvar'):
-                self.compass['magvar'] = meas_struct.qa.compass.magvar
-            else:
-                self.compass['magvar'] = new_qa.compass['magvar']
-                self.compass['status'] = new_qa.compass['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.compass, 'magvarIdx'):
-                self.compass['magvar_idx'] = self.make_array(meas_struct.qa.compass.magvarIdx)
-            else:
-                self.compass['magvar_idx'] = new_qa.compass['magvar_idx']
-                self.compass['status'] = new_qa.compass['status']
-
-            # Changed mag_error_idx from bool to int array in QRevPy
-            self.compass['mag_error_idx'] = new_qa.compass['mag_error_idx']
-            self.compass['status'] = new_qa.compass['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.compass, 'pitchMeanWarningIdx'):
-                self.compass['pitch_mean_warning_idx'] = self.make_array(meas_struct.qa.compass.pitchMeanWarningIdx)
-            else:
-                self.compass['pitch_mean_warning_idx'] = new_qa.compass['pitch_mean_warning_idx']
-                self.compass['status'] = new_qa.compass['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.compass, 'rollMeanWarningIdx'):
-                self.compass['roll_mean_warning_idx'] = self.make_array(meas_struct.qa.compass.rollMeanWarningIdx)
-            else:
-                self.compass['roll_mean_warning_idx'] = new_qa.compass['roll_mean_warning_idx']
-                self.compass['status'] = new_qa.compass['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.compass, 'pitchMeanCautionIdx'):
-                self.compass['pitch_mean_caution_idx'] = self.make_array(meas_struct.qa.compass.pitchMeanCautionIdx)
-            else:
-                self.compass['pitch_mean_caution_idx'] = new_qa.compass['pitch_mean_caution_idx']
-                self.compass['status'] = new_qa.compass['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.compass, 'rollMeanCautionIdx'):
-                self.compass['roll_mean_caution_idx'] = self.make_array(meas_struct.qa.compass.rollMeanCautionIdx)
-            else:
-                self.compass['roll_mean_caution_idx'] = new_qa.compass['roll_mean_caution_idx']
-                self.compass['status'] = new_qa.compass['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.compass, 'pitchStdCautionIdx'):
-                self.compass['pitch_std_caution_idx'] = self.make_array(meas_struct.qa.compass.pitchStdCautionIdx)
-            else:
-                self.compass['pitch_std_caution_idx'] = new_qa.compass['pitch_std_caution_idx']
-                self.compass['status'] = new_qa.compass['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.compass, 'rollStdCautionIdx'):
-                self.compass['roll_std_caution_idx'] = self.make_array(meas_struct.qa.compass.rollStdCautionIdx)
-            else:
-                self.compass['roll_std_caution_idx'] = new_qa.compass['roll_std_caution_idx']
-                self.compass['status'] = new_qa.compass['status']
-
-            self.temperature = dict()
-            self.temperature['messages'] = self.make_list(meas_struct.qa.temperature.messages)
-            self.temperature['status'] = meas_struct.qa.temperature.status
-            self.movingbed = dict()
-            self.movingbed['messages'] = self.make_list(meas_struct.qa.movingbed.messages)
-            self.movingbed['status'] = meas_struct.qa.movingbed.status
-            self.movingbed['code'] = meas_struct.qa.movingbed.code
-            self.user = dict()
-            self.user['messages'] = self.make_list(meas_struct.qa.user.messages)
-            self.user['sta_name'] = bool(meas_struct.qa.user.staName)
-            self.user['sta_number'] = bool(meas_struct.qa.user.staNumber)
-            self.user['status'] = meas_struct.qa.user.status
-
-            # If QA check not available, get check from new QA
-            self.depths = self.create_qa_dict(self, meas_struct.qa.depths)
-            if 'draft' not in self.depths:
-                self.depths['draft'] = new_qa.depths['draft']
-                self.depths['status'] = new_qa.depths['status']
-
-            if 'all_invalid' not in self.depths:
-                self.depths['all_invalid'] = new_qa.depths['all_invalid']
-                self.depths['status'] = new_qa.depths['status']
-
-            # If QA check not available, get check from new QA
-            self.bt_vel = self.create_qa_dict(self, meas_struct.qa.btVel, ndim=2)
-            if 'all_invalid' not in self.bt_vel:
-                self.bt_vel['all_invalid'] = new_qa.bt_vel['all_invalid']
-                self.bt_vel['status'] = new_qa.bt_vel['status']
-
-            # If QA check not available, get check from new QA
-            self.gga_vel = self.create_qa_dict(self, meas_struct.qa.ggaVel, ndim=2)
-            if 'all_invalid' not in self.gga_vel:
-                self.gga_vel['all_invalid'] = new_qa.gga_vel['all_invalid']
-            if 'lag_status' not in self.gga_vel:
-                self.gga_vel['lag_status'] = new_qa.gga_vel['lag_status']
-                self.gga_vel['status'] = new_qa.gga_vel['status']
-
-            # If QA check not available, get check from new QA
-            self.vtg_vel = self.create_qa_dict(self, meas_struct.qa.vtgVel, ndim=2)
-            if 'all_invalid' not in self.vtg_vel:
-                self.vtg_vel['all_invalid'] = new_qa.vtg_vel['all_invalid']
-            if 'lag_status' not in self.vtg_vel:
-                self.vtg_vel['lag_status'] = new_qa.vtg_vel['lag_status']
-                self.vtg_vel['status'] = new_qa.vtg_vel['status']
-
-            # If QA check not available, get check from new QA
-            self.w_vel = self.create_qa_dict(self, meas_struct.qa.wVel, ndim=2)
-            if 'all_invalid' not in self.w_vel:
-                self.w_vel['all_invalid'] = new_qa.w_vel['all_invalid']
-                self.w_vel['status'] = new_qa.w_vel['status']
-
-            self.extrapolation = dict()
-            self.extrapolation['messages'] = self.make_list(meas_struct.qa.extrapolation.messages)
-            self.extrapolation['status'] = meas_struct.qa.extrapolation.status
-            self.edges = dict()
-            self.edges['messages'] = self.make_list(meas_struct.qa.edges.messages)
-            self.edges['status'] = meas_struct.qa.edges.status
-            self.edges['left_q'] = meas_struct.qa.edges.leftQ
-            self.edges['right_q'] = meas_struct.qa.edges.rightQ
-            self.edges['left_sign'] = meas_struct.qa.edges.leftSign
-            self.edges['right_sign'] = meas_struct.qa.edges.rightSign
-            self.edges['left_zero'] = meas_struct.qa.edges.leftzero
-            self.edges['right_zero'] = meas_struct.qa.edges.rightzero
-            self.edges['left_type'] = meas_struct.qa.edges.leftType
-            self.edges['right_type'] = meas_struct.qa.edges.rightType
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.edges, 'rightDistMovedIdx'):
-                self.edges['right_dist_moved_idx'] = self.make_array(meas_struct.qa.edges.rightDistMovedIdx)
-            else:
-                self.edges['right_dist_moved_idx'] = new_qa.edges['right_dist_moved_idx']
-                self.edges['status'] = new_qa.edges['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.edges, 'leftDistMovedIdx'):
-                self.edges['left_dist_moved_idx'] = self.make_array(meas_struct.qa.edges.leftDistMovedIdx)
-            else:
-                self.edges['left_dist_moved_idx'] = new_qa.edges['left_dist_moved_idx']
-                self.edges['status'] = new_qa.edges['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.edges, 'leftQIdx'):
-                self.edges['left_q_idx'] = self.make_array(meas_struct.qa.edges.leftQIdx)
-            else:
-                self.edges['left_q_idx'] = new_qa.edges['left_q_idx']
-                self.edges['status'] = new_qa.edges['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.edges, 'rightQIdx'):
-                self.edges['right_q_idx'] = self.make_array(meas_struct.qa.edges.rightQIdx)
-            else:
-                self.edges['right_q_idx'] = new_qa.edges['right_q_idx']
-                self.edges['status'] = new_qa.edges['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.edges, 'leftZeroIdx'):
-                self.edges['left_zero_idx'] = self.make_array(meas_struct.qa.edges.leftZeroIdx)
-            else:
-                self.edges['left_zero_idx'] = new_qa.edges['left_zero_idx']
-                self.edges['status'] = new_qa.edges['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.edges, 'rightZeroIdx'):
-                self.edges['right_zero_idx'] = self.make_array(meas_struct.qa.edges.rightZeroIdx)
-            else:
-                self.edges['right_zero_idx'] = new_qa.edges['right_zero_idx']
-                self.edges['status'] = new_qa.edges['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.edges, 'invalid_transect_left_idx'):
-                self.edges['invalid_transect_left_idx'] = \
-                    self.make_array(meas_struct.qa.edges.invalid_transect_left_idx)
-            elif hasattr(meas_struct.qa.edges, 'invalidTransLeftIdx'):
-                self.edges['invalid_transect_left_idx'] = \
-                    self.make_array(meas_struct.qa.edges.invalidTransLeftIdx)
-            else:
-                self.edges['invalid_transect_left_idx'] = new_qa.edges['invalid_transect_left_idx']
-                self.edges['status'] = new_qa.edges['status']
-
-            # If QA check not available, get check from new QA
-            if hasattr(meas_struct.qa.edges, 'invalid_transect_right_idx'):
-                self.edges['invalid_transect_right_idx'] = \
-                    self.make_array(meas_struct.qa.edges.invalid_transect_right_idx)
-            elif hasattr(meas_struct.qa, 'invalidTransRightIdx'):
-                self.edges['invalid_transect_right_idx'] = \
-                    self.make_array(meas_struct.qa.edges.invalidTransRightIdx)
-            else:
-                self.edges['invalid_transect_right_idx'] = new_qa.edges['invalid_transect_right_idx']
-                self.edges['status'] = new_qa.edges['status']
-
-            if hasattr(meas_struct.qa, 'settings_dict'):
-                self.settings_dict = dict()
-                try:
-                    self.settings_dict['tab_compass'] = \
-                        meas_struct.qa.settings_dict.tab_compass
-                except AttributeError:
-                    self.settings_dict['tab_compass'] = \
-                        new_qa.settings_dict['tab_compass']
-
-                try:
-                    self.settings_dict['tab_tempsal'] = \
-                        meas_struct.qa.settings_dict.tab_tempsal
-                except AttributeError:
-                    self.settings_dict['tab_tempsal'] = \
-                        new_qa.settings_dict['tab_tempsal']
-
-                try:
-                    self.settings_dict['tab_mbt'] = \
-                        meas_struct.qa.settings_dict.tab_mbt
-                except AttributeError:
-                    self.settings_dict['tab_mbt'] = \
-                        new_qa.settings_dict['tab_mbt']
-
-                try:
-                    self.settings_dict['tab_bt'] = \
-                        meas_struct.qa.settings_dict.tab_bt
-                except AttributeError:
-                    self.settings_dict['tab_bt'] = \
-                        new_qa.settings_dict['tab_bt']
-
-                try:
-                    self.settings_dict['tab_gps'] = \
-                        meas_struct.qa.settings_dict.tab_gps
-                except AttributeError:
-                    self.settings_dict['tab_gps'] = \
-                        new_qa.settings_dict['tab_gps']
-
-                try:
-                    self.settings_dict['tab_depth'] = \
-                        meas_struct.qa.settings_dict.tab_depth
-                except AttributeError:
-                    self.settings_dict['tab_depth'] = \
-                        new_qa.settings_dict['tab_depth']
-
-                try:
-                    self.settings_dict['tab_wt'] = \
-                        meas_struct.qa.settings_dict.tab_wt
-                except AttributeError:
-                    self.settings_dict['tab_wt'] = \
-                        new_qa.settings_dict['tab_wt']
-
-                try:
-                    self.settings_dict['tab_extrap'] = \
-                        meas_struct.qa.settings_dict.tab_extrap
-                except AttributeError:
-                    self.settings_dict['tab_extrap'] = \
-                        new_qa.settings_dict['tab_extrap']
-
-                try:
-                    self.settings_dict['tab_edges'] = \
-                        meas_struct.qa.settings_dict.tab_edges
-                except AttributeError:
-                    self.settings_dict['tab_edges'] = \
-                        new_qa.settings_dict['tab_edges']
-
-    @staticmethod
-    def create_qa_dict(self, mat_data, ndim=1):
-        """Creates the dictionary used to store QA checks associated with the percent of discharge estimated
-        by interpolation. This dictionary is used by BT, GPS, Depth, and WT.
-
-        Parameters
-        ----------
-        self: QAData
-            Object of QAData
-        mat_data: mat_struct
-            Matlab data from QRev file
-        ndim: int
-            Number of dimensions in data
-        """
-
-        # Initialize dictionary
-        qa_dict = dict()
-
-        # Populate dictionary from Matlab data
-        qa_dict['messages'] = QAData.make_list(mat_data.messages)
-
-        # allInvalid not available in older QRev data
-        if hasattr(mat_data, 'allInvalid'):
-            qa_dict['all_invalid'] = self.make_array(mat_data.allInvalid, 1).astype(bool)
-
-        qa_dict['q_max_run_caution'] = self.make_array(mat_data.qRunCaution, ndim).astype(bool)
-        qa_dict['q_max_run_warning'] = self.make_array(mat_data.qRunWarning, ndim).astype(bool)
-        if hasattr(mat_data, 'qTotalCaution'):
-            qa_dict['q_total_caution'] = self.make_array(mat_data.qTotalCaution, ndim).astype(bool)
-        else:
-            qa_dict['q_total_caution'] = self.make_array(mat_data.qTotalWarning, ndim).astype(bool)
-        qa_dict['q_total_warning'] = self.make_array(mat_data.qTotalWarning, ndim).astype(bool)
-        qa_dict['status'] = mat_data.status
-
-        # q_max_run and q_total not available in older QRev data
-        try:
-            qa_dict['q_max_run'] = self.make_array(mat_data.qMaxRun, ndim)
-            qa_dict['q_total'] = self.make_array(mat_data.qTotal, ndim)
-        except AttributeError:
-            qa_dict['q_max_run'] = np.tile(np.nan, (len(mat_data.qRunCaution), 6))
-            qa_dict['q_total'] = np.tile(np.nan, (len(mat_data.qRunCaution), 6))
-        return qa_dict
-
-    @staticmethod
-    def make_array(num_in, ndim=1):
-        """Ensures that num_in is an array and if not makes it an array.
-
-        num_in: any
-            Any value or array
-        """
-
-        if type(num_in) is np.ndarray:
-            if len(num_in.shape) < 2 and ndim > 1:
-                num_in = np.reshape(num_in, (1, num_in.shape[0]))
-                return num_in
-            else:
-                return num_in
-        else:
-            return np.array([num_in])
-
-    @staticmethod
-    def make_list(array_in):
-        """Converts a string or array to a list.
-
-        Parameters
-        ----------
-        array_in: any
-            Data to be converted to list.
-
-        Returns
-        -------
-        list_out: list
-            List of array_in data
-        """
-
-        list_out = []
-        # Convert string to list
-        if type(array_in) is str:
-            list_out = [array_in]
-        else:
-            # Empty array
-            if array_in.size == 0:
-                list_out = []
-            # Single message with integer codes at end
-            elif array_in.size == 3:
-                if type(array_in[1]) is int or len(array_in[1].strip()) == 1:
-                    temp = array_in.tolist()
-                    if len(temp) > 0:
-                        internal_list = []
-                        for item in temp:
-                            internal_list.append(item)
-                        list_out = [internal_list]
-                else:
-                    list_out = array_in.tolist()
-            # Either multiple messages with or without integer codes
-            else:
-                list_out = array_in.tolist()
-
-        return list_out
-
-    def transects_qa(self, meas):
-        """Apply quality checks to transects
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        # Assume good results
-        self.transects['status'] = 'good'
-
-        # Initialize keys
-        self.transects['messages'] = []
-        self.transects['recip'] = 0
-        self.transects['sign'] = 0
-        self.transects['duration'] = 0
-        self.transects['number'] = 0
-        self.transects['uncertainty'] = 0
-
-        # Initialize lists
-        checked = []
-        discharges = []
-        start_edge = []
-
-        # Populate lists
-        for n in range(len(meas.transects)):
-            checked.append(meas.transects[n].checked)
-            if meas.transects[n].checked:
-                discharges.append(meas.discharge[n])
-                start_edge.append(meas.transects[n].start_edge)
-
-        num_checked = np.nansum(np.asarray(checked))
-
-        # Check duration
-        total_duration = 0
-        if num_checked >= 1:
-            for transect in meas.transects:
-                if transect.checked:
-                    total_duration += transect.date_time.transect_duration_sec
-
-        # Check duration against USGS policy
-        if total_duration < meas.min_duration:
-            self.transects['status'] = 'caution'
-            text = 'Transects: Duration of selected transects is less than ' + str(meas.min_duration) + ' seconds;'
-            self.transects['messages'].append([text, 2, 0])
-            self.transects['duration'] = 1
-
-        # Check transects for missing ensembles
-        for transect in meas.transects:
-            if transect.checked:
-
-                # Determine number of missing ensembles
-                if transect.adcp.manufacturer == 'SonTek':
-                    # Determine number of missing ensembles for SonTek data
-                    idx_missing = np.where(transect.date_time.ens_duration_sec > 1.5)[0]
-                    if len(idx_missing) > 0:
-                        average_ensemble_duration = (np.nansum(transect.date_time.ens_duration_sec)
-                                                     - np.nansum(transect.date_time.ens_duration_sec[idx_missing])) \
-                                                     / (len(transect.date_time.ens_duration_sec) - len(idx_missing))
-                        num_missing = np.round(np.nansum(transect.date_time.ens_duration_sec[idx_missing])
-                                               / average_ensemble_duration) - len(idx_missing)
-                    else:
-                        num_missing = 0
-                else:
-                    # Determine number of lost ensembles for TRDI data
-                    idx_missing = np.where(np.isnan(transect.date_time.ens_duration_sec))[0]
-                    num_missing = len(idx_missing) - 1
-
-                # Save caution message
-                if num_missing > 0:
-                    self.transects['messages'].append(['Transects: ' + str(transect.file_name) + ' is missing '
-                                                       + str(int(num_missing)) + ' ensembles;', 2, 0])
-                    self.transects['status'] = 'caution'
-
-        # Check number of transects checked
-        if num_checked == 0:
-            # No transects selected
-            self.transects['status'] = 'warning'
-            self.transects['messages'].append(['TRANSECTS: No transects selected;', 1, 0])
-            self.transects['number'] = 2
-        elif num_checked == 1:
-            # Only one transect selected
-            self.transects['status'] = 'caution'
-            self.transects['messages'].append(['Transects: Only one transect selected;', 2, 0])
-            self.transects['number'] = 2
-        else:
-            self.transects['number'] = num_checked
-            if num_checked == 2:
-                # Only 2 transects selected
-                cov, _ = Uncertainty.uncertainty_q_random(discharges, 'total')
-                # Check uncertainty
-                if cov > 2:
-                    self.transects['status'] = 'caution'
-                    self.transects['messages'].append(
-                        ['Transects: Uncertainty would be reduced by additional transects;', 2, 0])
-
-            if num_checked < meas.min_transects:
-                self.transects['status'] = 'caution'
-                text = 'Transects: Number of transects is below the required minimum of ' \
-                       + str(meas.min_transects) + ';'
-                self.transects['messages'].append([text, 2, 0])
-
-            # Check for consistent sign
-            q_positive = []
-            for q in discharges:
-                if q.total >= 0:
-                    q_positive.append(True)
-                else:
-                    q_positive.append(False)
-            if len(np.unique(q_positive)) > 1:
-                self.transects['status'] = 'warning'
-                self.transects['messages'].append(
-                    ['TRANSECTS: Sign of total Q is not consistent. One or more start banks may be incorrect;', 1, 0])
-
-            # Check for reciprocal transects
-            num_left = start_edge.count('Left')
-            num_right = start_edge.count('Right')
-
-            if not num_left == num_right:
-                self.transects['status'] = 'warning'
-                self.transects['messages'].append(['TRANSECTS: Transects selected are not reciprocal transects;', 1, 0])
-
-        # Check for zero discharge transects
-        q_zero = False
-        for q in discharges:
-            if q.total == 0:
-                q_zero = True
-        if q_zero:
-            self.transects['status'] = 'warning'
-            self.transects['messages'].append(['TRANSECTS: One or more transects have zero Q;', 1, 0])
-
-    def system_tst_qa(self, meas):
-        """Apply QA checks to system test.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.system_tst['messages'] = []
-        self.system_tst['status'] = 'good'
-
-        # Determine if a system test was recorded
-        if not meas.system_tst:
-            # No system test data recorded
-            self.system_tst['status'] = 'warning'
-            self.system_tst['messages'].append(['SYSTEM TEST: No system test;', 1, 3])
-        else:
-
-            pt3_fail = False
-            num_tests_with_failure = 0
-
-            for test in meas.system_tst:
-                if hasattr(test, 'result'):
-
-                    # Check for presence of pt3 test
-                    if 'pt3' in test.result and test.result['pt3'] is not None:
-
-                        # Check hard_limit, high gain, wide bandwidth
-                        if 'hard_limit' in test.result['pt3']:
-                            if 'high_wide' in test.result['pt3']['hard_limit']:
-                                corr_table = test.result['pt3']['hard_limit']['high_wide']['corr_table']
-                                if len(corr_table) > 0:
-                                    # All lags past lag 2 should be less than 50% of lag 0
-                                    qa_threshold = corr_table[0, :] * 0.5
-                                    all_lag_check = np.greater(corr_table[3::, :], qa_threshold)
-
-                                    # Lag 7 should be less than 25% of lag 0
-                                    lag_7_check = np.greater(corr_table[7, :], corr_table[0, :] * 0.25)
-
-                                    # If either condition is met for any beam the test fails
-                                    if np.sum(np.sum(all_lag_check)) + np.sum(lag_7_check) > 1:
-                                        pt3_fail = True
-
-                    if test.result['sysTest']['n_failed'] is not None and test.result['sysTest']['n_failed'] > 0:
-                        num_tests_with_failure += 1
-
-            # pt3 test failure message
-            if pt3_fail:
-                self.system_tst['status'] = 'caution'
-                self.system_tst['messages'].append(
-                    ['System Test: One or more PT3 tests in the system test indicate potential EMI;', 2, 3])
-
-            # Check for failed tests
-            if num_tests_with_failure == len(meas.system_tst):
-                # All tests had a failure
-                self.system_tst['status'] = 'warning'
-                self.system_tst['messages'].append(
-                    ['SYSTEM TEST: All system test sets have at least one test that failed;', 1, 3])
-            elif num_tests_with_failure > 0:
-                self.system_tst['status'] = 'caution'
-                self.system_tst['messages'].append(
-                    ['System Test: One or more system test sets have at least one test that failed;', 2, 3])
-
-    def compass_qa(self, meas):
-        """Apply QA checks to compass calibration and evaluation.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.compass['messages'] = []
-
-        checked = []
-        for transect in meas.transects:
-            checked.append(transect.checked)
-
-        if np.any(checked):
-            heading = np.unique(meas.transects[checked.index(1)].sensors.heading_deg.internal.data)
-        else:
-            heading = np.array([0])
-
-        # Initialize variable as if ADCP has no compass
-        self.compass['status'] = 'inactive'
-        self.compass['status1'] = 'good'
-        self.compass['status2'] = 'good'
-        self.compass['magvar'] = 0
-        self.compass['magvar_idx'] = []
-        self.compass['mag_error_idx'] = []
-        self.compass['pitch_mean_warning_idx'] = []
-        self.compass['pitch_mean_caution_idx'] = []
-        self.compass['pitch_std_caution_idx'] = []
-        self.compass['roll_mean_warning_idx'] = []
-        self.compass['roll_mean_caution_idx'] = []
-        self.compass['roll_std_caution_idx'] = []
-
-        if len(heading) > 1 and np.any(np.not_equal(heading, 0)):
-            # ADCP has a compass
-            # A compass calibration is required if a loop test or GPS are used
-
-            # Check for loop test
-            loop = False
-            for test in meas.mb_tests:
-                if test.type == 'Loop':
-                    loop = True
-
-            # Check for GPS data
-            gps = False
-            if meas.transects[checked.index(True)].boat_vel.gga_vel is not None or \
-                    meas.transects[checked.index(True)].boat_vel.vtg_vel is not None:
-                gps = True
-
-            if gps or loop:
-                # Compass calibration is required
-
-                # Determine the ADCP manufacturer
-                if meas.transects[checked.index(True)].adcp.manufacturer == 'SonTek':
-                    # SonTek ADCP
-                    if len(meas.compass_cal) == 0:
-                        # No compass calibration
-                        self.compass['status1'] = 'warning'
-                        self.compass['messages'].append(['COMPASS: No compass calibration;', 1, 4])
-                    elif meas.compass_cal[-1].result['compass']['error'] == 'N/A':
-                        # If the error cannot be decoded from the calibration assume the calibration is good
-                        self.compass['status1'] = 'good'
-                    else:
-                        if meas.compass_cal[-1].result['compass']['error'] <= 0.2:
-                            self.compass['status1'] = 'good'
-                        else:
-                            self.compass['status1'] = 'caution'
-                            self.compass['messages'].append(['Compass: Calibration result > 0.2 deg;', 2, 4])
-
-                elif meas.transects[checked.index(True)].adcp.manufacturer == 'TRDI':
-                    # TRDI ADCP
-                    if len(meas.compass_cal) == 0:
-                        # No compass calibration
-                        if len(meas.compass_eval) == 0:
-                            # No calibration or evaluation
-                            self.compass['status1'] = 'warning'
-                            self.compass['messages'].append(['COMPASS: No compass calibration or evaluation;', 1, 4])
-                        else:
-                            # No calibration but an evaluation was completed
-                            self.compass['status1'] = 'caution'
-                            self.compass['messages'].append(['Compass: No compass calibration;', 2, 4])
-                    else:
-                        # Compass was calibrated
-                        if len(meas.compass_eval) == 0:
-                            # No compass evaluation
-                            self.compass['status1'] = 'caution'
-                            self.compass['messages'].append(['Compass: No compass evaluation;', 2, 4])
-                        else:
-                            # Check results of evaluation
-                            try:
-                                if float(meas.compass_eval[-1].result['compass']['error']) <= 1:
-                                    self.compass['status1'] = 'good'
-                                else:
-                                    self.compass['status1'] = 'caution'
-                                    self.compass['messages'].append(['Compass: Evaluation result > 1 deg;', 2, 4])
-                            except ValueError:
-                                self.compass['status1'] = 'good'
-            else:
-                # Compass not required
-                if len(meas.compass_cal) == 0 and len(meas.compass_eval) == 0:
-                    # No compass calibration or evaluation
-                    self.compass['status1'] = 'default'
-                else:
-                    # Compass was calibrated and evaluated
-                    self.compass['status1'] = 'good'
-
-            # Check for consistent magvar and pitch and roll mean and variation
-            magvar = []
-            align = []
-            mag_error_exceeded = []
-            pitch_mean = []
-            pitch_std = []
-            pitch_exceeded = []
-            roll_mean = []
-            roll_std = []
-            roll_exceeded = []
-            transect_idx = []
-            for n, transect in enumerate(meas.transects):
-                if transect.checked:
-                    transect_idx.append(n)
-                    heading_source_selected = getattr(
-                        transect.sensors.heading_deg, transect.sensors.heading_deg.selected)
-                    pitch_source_selected = getattr(transect.sensors.pitch_deg, transect.sensors.pitch_deg.selected)
-                    roll_source_selected = getattr(transect.sensors.roll_deg, transect.sensors.roll_deg.selected)
-
-                    magvar.append(transect.sensors.heading_deg.internal.mag_var_deg)
-                    if transect.sensors.heading_deg.external is not None:
-                        align.append(transect.sensors.heading_deg.external.align_correction_deg)
-
-                    pitch_mean.append(np.nanmean(pitch_source_selected.data))
-                    pitch_std.append(np.nanstd(pitch_source_selected.data, ddof=1))
-                    roll_mean.append(np.nanmean(roll_source_selected.data))
-                    roll_std.append(np.nanstd(roll_source_selected.data, ddof=1))
-
-                    # SonTek G3 compass provides pitch, roll, and magnetic error parameters that can be checked
-                    if transect.adcp.manufacturer == 'SonTek':
-                        if heading_source_selected.pitch_limit is not None:
-                            # Check for bug in SonTek data where pitch and roll was n x 3 use n x 1
-                            if len(pitch_source_selected.data.shape) == 1:
-                                pitch_data = pitch_source_selected.data
-                            else:
-                                pitch_data = pitch_source_selected.data[:, 0]
-                            idx_max = np.where(pitch_data > heading_source_selected.pitch_limit[0])[0]
-                            idx_min = np.where(pitch_data < heading_source_selected.pitch_limit[1])[0]
-                            if len(idx_max) > 0 or len(idx_min) > 0:
-                                pitch_exceeded.append(True)
-                            else:
-                                pitch_exceeded.append(False)
-
-                        if heading_source_selected.roll_limit is not None:
-                            if len(roll_source_selected.data.shape) == 1:
-                                roll_data = roll_source_selected.data
-                            else:
-                                roll_data = roll_source_selected.data[:, 0]
-                            idx_max = np.where(roll_data > heading_source_selected.pitch_limit[0])[0]
-                            idx_min = np.where(roll_data < heading_source_selected.pitch_limit[1])[0]
-                            if len(idx_max) > 0 or len(idx_min) > 0:
-                                roll_exceeded.append(True)
-                            else:
-                                roll_exceeded.append(False)
-
-                        if heading_source_selected.mag_error is not None:
-                            idx_max = np.where(heading_source_selected.mag_error > 2)[0]
-                            if len(idx_max) > 0:
-                                mag_error_exceeded.append(n)
-            # Check magvar consistency
-            if len(np.unique(magvar)) > 1:
-                self.compass['status2'] = 'caution'
-                self.compass['messages'].append(
-                    ['Compass: Magnetic variation is not consistent among transects;', 2, 4])
-                self.compass['magvar'] = 1
-
-            # Check magvar consistency
-            if len(np.unique(align)) > 1:
-                self.compass['status2'] = 'caution'
-                self.compass['messages'].append(
-                    ['Compass: Heading offset is not consistent among transects;', 2, 4])
-                self.compass['align'] = 1
-
-            # Check that magvar was set if GPS data are available
-            if gps:
-                if 0 in magvar:
-                    self.compass['status2'] = 'warning'
-                    self.compass['messages'].append(
-                        ['COMPASS: Magnetic variation is 0 and GPS data are present;', 1, 4])
-                    self.compass['magvar'] = 2
-                    self.compass['magvar_idx'] = np.where(np.array(magvar) == 0)[0].tolist()
-
-            # Check pitch mean
-            if np.any(np.asarray(np.abs(pitch_mean)) > 8):
-                self.compass['status2'] = 'warning'
-                self.compass['messages'].append(['PITCH: One or more transects have a mean pitch > 8 deg;', 1, 4])
-                temp = np.where(np.abs(pitch_mean) > 8)[0]
-                if len(temp) > 0:
-                    self.compass['pitch_mean_warning_idx'] = np.array(transect_idx)[temp]
-                else:
-                    self.compass['pitch_mean_warning_idx'] = []
-
-            elif np.any(np.asarray(np.abs(pitch_mean)) > 4):
-                if self.compass['status2'] == 'good':
-                    self.compass['status2'] = 'caution'
-                self.compass['messages'].append(['Pitch: One or more transects have a mean pitch > 4 deg;', 2, 4])
-                temp = np.where(np.abs(pitch_mean) > 4)[0]
-                if len(temp) > 0:
-                    self.compass['pitch_mean_caution_idx'] = np.array(transect_idx)[temp]
-                else:
-                    self.compass['pitch_mean_caution_idx'] = []
-
-            # Check roll mean
-            if np.any(np.asarray(np.abs(roll_mean)) > 8):
-                self.compass['status2'] = 'warning'
-                self.compass['messages'].append(['ROLL: One or more transects have a mean roll > 8 deg;', 1, 4])
-                temp = np.where(np.abs(roll_mean) > 8)[0]
-                if len(temp) > 0:
-                    self.compass['roll_mean_warning_idx'] = np.array(transect_idx)[temp]
-                else:
-                    self.compass['roll_mean_warning_idx'] = []
-
-            elif np.any(np.asarray(np.abs(roll_mean)) > 4):
-                if self.compass['status2'] == 'good':
-                    self.compass['status2'] = 'caution'
-                self.compass['messages'].append(['Roll: One or more transects have a mean roll > 4 deg;', 2, 4])
-                temp = np.where(np.abs(roll_mean) > 4)[0]
-                if len(temp) > 0:
-                    self.compass['roll_mean_caution_idx'] = np.array(transect_idx)[temp]
-                else:
-                    self.compass['roll_mean_caution_idx'] = []
-
-            # Check pitch standard deviation
-            if np.any(np.asarray(pitch_std) > 5):
-                if self.compass['status2'] == 'good':
-                    self.compass['status2'] = 'caution'
-                self.compass['messages'].append(['Pitch: One or more transects have a pitch std dev > 5 deg;', 2, 4])
-                temp = np.where(np.abs(pitch_std) > 5)[0]
-                if len(temp) > 0:
-                    self.compass['pitch_std_caution_idx'] = np.array(transect_idx)[temp]
-                else:
-                    self.compass['pitch_std_caution_idx'] = []
-
-            # Check roll standard deviation
-            if np.any(np.asarray(roll_std) > 5):
-                if self.compass['status2'] == 'good':
-                    self.compass['status2'] = 'caution'
-                self.compass['messages'].append(['Roll: One or more transects have a roll std dev > 5 deg;', 2, 4])
-                temp = np.where(np.abs(roll_std) > 5)[0]
-                if len(temp) > 0:
-                    self.compass['roll_std_caution_idx'] = np.array(transect_idx)[temp]
-                else:
-                    self.compass['roll_std_caution_idx'] = []
-
-            # Additional checks for SonTek G3 compass
-            if meas.transects[checked.index(True)].adcp.manufacturer == 'SonTek':
-                # Check if pitch limits were exceeded
-                if any(pitch_exceeded):
-                    if self.compass['status2'] == 'good':
-                        self.compass['status2'] = 'caution'
-                    self.compass['messages'].append(
-                        ['Compass: One or more transects have pitch exceeding calibration limits;', 2, 4])
-
-                # Check if roll limits were exceeded
-                if any(roll_exceeded):
-                    if self.compass['status2'] == 'good':
-                        self.compass['status2'] = 'caution'
-                    self.compass['messages'].append(
-                        ['Compass: One or more transects have roll exceeding calibration limits;', 2, 4])
-
-                # Check if magnetic error was exceeded
-                self.compass['mag_error_idx'] = []
-                if len(mag_error_exceeded) > 0:
-                    self.compass['mag_error_idx'] = np.array(mag_error_exceeded)
-                    if self.compass['status2'] == 'good':
-                        self.compass['status2'] = 'caution'
-                    self.compass['messages'].append(
-                        ['Compass: One or more transects have a change in mag field exceeding 2%;', 2, 4])
-
-            if self.compass['status1'] == 'warning' or self.compass['status2'] == 'warning':
-                self.compass['status'] = 'warning'
-            elif self.compass['status1'] == 'caution' or self.compass['status2'] == 'caution':
-                self.compass['status'] = 'caution'
-            else:
-                self.compass['status'] = 'good'
-
-    def temperature_qa(self, meas):
-        """Apply QA checks to temperature.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.temperature['messages'] = []
-        check = [0, 0]
-
-        # Create array of all temperatures
-        temp = np.array([])
-        checked = []
-        for transect in meas.transects:
-            if transect.checked:
-                checked.append(transect.checked)
-                temp_selected = getattr(transect.sensors.temperature_deg_c, transect.sensors.temperature_deg_c.selected)
-                if len(temp) == 0:
-                    temp = temp_selected.data
-                else:
-                    temp = np.hstack((temp, temp_selected.data))
-
-        # Check temperature range
-        if np.any(checked):
-            temp_range = np.nanmax(temp) - np.nanmin(temp)
-        else:
-            temp_range = 0
-
-        if temp_range > 2:
-            check[0] = 3
-            self.temperature['messages'].append(['TEMPERATURE: Temperature range is '
-                                                 + '{:3.1f}'.format(temp_range)
-                                                 + ' degrees C which is greater than 2 degrees;', 1, 5])
-        elif temp_range > 1:
-            check[0] = 2
-            self.temperature['messages'].append(['Temperature: Temperature range is '
-                                                 + '{:3.1f}'.format(temp_range)
-                                                 + ' degrees C which is greater than 1 degree;', 2, 5])
-        else:
-            check[0] = 1
-
-        # Check for independent temperature reading
-        if 'user' in meas.ext_temp_chk:
-            try:
-                user = float(meas.ext_temp_chk['user'])
-            except (ValueError, TypeError):
-                user = None
-            if user is None or np.isnan(user):
-                # No independent temperature reading
-                check[1] = 2
-                self.temperature['messages'].append(['Temperature: No independent temperature reading;', 2, 5])
-            elif not np.isnan(meas.ext_temp_chk['adcp']):
-                # Compare user to manually entered ADCP temperature
-                diff = np.abs(user - meas.ext_temp_chk['adcp'])
-                if diff < 2:
-                    check[1] = 1
-                else:
-                    check[1] = 3
-                    self.temperature['messages'].append(
-                        ['TEMPERATURE: The difference between ADCP and reference is > 2:  '
-                         + '{:3.1f}'.format(diff) + ' C;', 1, 5])
-            else:
-                # Compare user to mean of all temperature data
-                diff = np.abs(user - np.nanmean(temp))
-                if diff < 2:
-                    check[1] = 1
-                else:
-                    check[1] = 3
-                    self.temperature['messages'].append(
-                        ['TEMPERATURE: The difference between ADCP and reference is > 2:  '
-                         + '{:3.1f}'.format(diff) + ' C;', 1, 5])
-
-        # Assign temperature status
-        max_check = max(check)
-        if max_check == 1:
-            self.temperature['status'] = 'good'
-        elif max_check == 2:
-            self.temperature['status'] = 'caution'
-        elif max_check == 3:
-            self.temperature['status'] = 'warning'
-
-    def moving_bed_qa(self, meas):
-        """Applies quality checks to moving-bed tests.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.movingbed['messages'] = []
-        self.movingbed['code'] = 0
-
-        # Are there moving-bed tests?
-        if len(meas.mb_tests) < 1:
-            if meas.observed_no_moving_bed:
-                self.movingbed['messages'].append(['Moving-Bed Test: Visually observed no moving bed;', 2, 6])
-                self.movingbed['status'] = 'caution'
-                self.movingbed['code'] = 2
-            else:
-                # No moving-bed test
-                self.movingbed['messages'].append(['MOVING-BED TEST: No moving bed test;', 1, 6])
-                self.movingbed['status'] = 'warning'
-                self.movingbed['code'] = 3
-
-        else:
-            # Moving-bed tests available
-            mb_data = meas.mb_tests
-
-            user_valid_test = []
-            file_names = []
-            idx_selected = []
-            test_quality = []
-            mb_tests = []
-            mb = []
-            mb_test_type = []
-            loop = []
-            use_2_correct = []
-            gps_diff1 = False
-            gps_diff2 = False
-
-            for n, test in enumerate(mb_data):
-                # Are tests valid according to the user
-                if test.user_valid:
-                    user_valid_test.append(True)
-                    file_names.append(test.transect.file_name)
-                    if test.type == 'Loop' and not test.test_quality == 'Errors':
-                        loop.append(test.moving_bed)
-                    if not np.isnan(test.gps_percent_mb):
-                        if np.abs(test.bt_percent_mb - test.gps_percent_mb) > 2:
-                            gps_diff2 = True
-                        if np.logical_xor(test.bt_percent_mb >= 1, test.gps_percent_mb >= 1):
-                            gps_diff1 = True
-                    # Selected test
-                    if test.selected:
-                        idx_selected.append(n)
-                        test_quality.append(test.test_quality)
-                        mb_tests.append(test)
-                        mb.append(test.moving_bed)
-                        mb_test_type.append(test.type)
-                        use_2_correct.append(test.use_2_correct)
-                else:
-                    user_valid_test.append(False)
-
-            if not any(user_valid_test):
-                # No valid test according to user
-                self.movingbed['messages'].append(['MOVING-BED TEST: No valid moving-bed test based on user input;',
-                                                   1, 6])
-                self.movingbed['status'] = 'warning'
-                self.movingbed['code'] = 3
-            else:
-                # Check for duplicate valid moving-bed tests
-                if len(np.unique(file_names)) < len(file_names):
-                    self.movingbed['messages'].append([
-                        'MOVING-BED TEST: Duplicate moving-bed test files marked valid;', 1, 6])
-                    self.movingbed['status'] = 'warning'
-                    self.movingbed['code'] = 3
-
-            if self.movingbed['code'] == 0:
-                # Check test quality
-                if len(test_quality) > 0 and sum(np.array(test_quality) == 'Good') > 0:
-                    self.movingbed['status'] = 'good'
-                    self.movingbed['code'] = 1
-
-                    # Check if there is a moving-bed
-                    if 'Yes' in mb:
-
-                        # Moving-bed present
-                        self.movingbed['messages'].append(
-                            ['Moving-Bed Test: A moving-bed is present.', 2, 6])
-                        self.movingbed['code'] = 2
-                        self.movingbed['status'] = 'caution'
-                        if meas.transects[meas.checked_transect_idx[0]].boat_vel.composite == 'On':
-                            self.movingbed['messages'].append(
-                                ['Moving-Bed: Use of composite tracks could cause inaccurate results.', 2, 6])
-
-                        if meas.transects[meas.checked_transect_idx[0]].boat_vel.selected == 'bt_vel':
-                            if any(use_2_correct):
-                                self.movingbed['messages'].append(
-                                    ['Moving-Bed: BT based moving-bed correction applied.', 2, 6])
-                            else:
-                                self.movingbed['messages'].append(
-                                    ['MOVING-BED: Moving-bed present and BT used, but no correction applied.', 1, 6])
-                                self.movingbed['code'] = 3
-                                self.movingbed['status'] = 'warning'
-                        elif meas.transects[meas.checked_transect_idx[0]].boat_vel.selected == 'gga_vel':
-                            self.movingbed['messages'].append(
-                                ['Moving-Bed: GGA used.', 2, 6])
-                        elif meas.transects[meas.checked_transect_idx[0]].boat_vel.selected == 'vtg_vel':
-                            self.movingbed['messages'].append(
-                                ['Moving-Bed: VTG used.', 2, 6])
-
-                        # Check for test type
-                        if sum(np.array(mb_test_type) == 'Stationary'):
-                            # Check for GPS or 3 stationary tests
-                            if len(mb_tests) < 3:
-                                gps = []
-                                for transect in meas.transects:
-                                    if transect.checked:
-                                        if transect.gps is None:
-                                            gps.append(False)
-                                        else:
-                                            gps.append(True)
-                                if not all(gps):
-                                    # GPS not available for all selected transects
-                                    self.movingbed['messages'].append([
-                                        'Moving-Bed Test: '
-                                        + 'Less than 3 stationary tests available for moving-bed correction;',
-                                        2, 6])
-
-                elif len(test_quality) > 0 and sum(np.array(test_quality) == 'Warnings') > 0:
-                    # Quality check has warnings
-                    self.movingbed['messages'].append(['Moving-Bed Test: The moving-bed test(s) has warnings, '
-                                                       + 'please review tests to determine validity;', 2, 6])
-                    self.movingbed['status'] = 'caution'
-                    self.movingbed['code'] = 2
-
-                elif len(test_quality) > 0 and sum(np.array(test_quality) == 'Manual') > 0:
-                    # Manual override used
-                    self.movingbed['messages'].append(['MOVING-BED TEST: '
-                                                       + 'The user has manually forced the use of some tests;', 1, 6])
-                    self.movingbed['status'] = 'warning'
-                    self.movingbed['code'] = 3
-
-                else:
-                    # Test has critical errors
-                    self.movingbed['messages'].append(['MOVING-BED TEST: The moving-bed test(s) have critical errors '
-                                                       + 'and will not be used;', 1, 6])
-                    self.movingbed['status'] = 'warning'
-                    self.movingbed['code'] = 3
-
-                # Check multiple loops for consistency
-                if len(np.unique(loop)) > 1:
-                    self.movingbed['messages'].append(['Moving-Bed Test: Results of valid loops are not consistent, '
-                                                       + 'review moving-bed tests;', 2, 6])
-                    if self.movingbed['code'] < 3:
-                        self.movingbed['code'] = 2
-                        self.movingbed['status'] = 'caution'
-
-                # Notify of differences in results of test between BT and GPS
-                if gps_diff2:
-                    self.movingbed['messages'].append(['Moving-Bed Test: Bottom track and '
-                                                      'GPS results differ by more than 2%.', 2, 6])
-                    if self.movingbed['code'] < 3:
-                        self.movingbed['code'] = 2
-                        self.movingbed['status'] = 'caution'
-
-                if gps_diff1:
-                    self.movingbed['messages'].append(['Moving-Bed Test: Bottom track and GPS results do not agree.',
-                                                      2, 6])
-                    if self.movingbed['code'] < 3:
-                        self.movingbed['code'] = 2
-                        self.movingbed['status'] = 'caution'
-
-        self.check_mbt_settings(meas)
-
-    def user_qa(self, meas):
-        """Apply quality checks to user input data.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.user['messages'] = []
-        self.user['status'] = 'good'
-
-        # Check for Station Name
-        self.user['sta_name'] = False
-        if meas.station_name is None or len(meas.station_name.strip()) < 1:
-            self.user['messages'].append(['Site Info: Station name not entered;', 2, 2])
-            self.user['status'] = 'caution'
-            self.user['sta_name'] = True
-
-        # Check for Station Number
-        self.user['sta_number'] = False
-        try:
-            if meas.station_number is None or len(meas.station_number.strip()) < 1:
-                self.user['messages'].append(['Site Info: Station number not entered;', 2, 2])
-                self.user['status'] = 'caution'
-                self.user['sta_number'] = True
-        except AttributeError:
-            self.user['messages'].append(['Site Info: Station number not entered;', 2, 2])
-            self.user['status'] = 'caution'
-            self.user['sta_number'] = True
-
-    def depths_qa(self, meas):
-        """Apply quality checks to depth data.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        # Initialize variables
-        n_transects = len(meas.transects)
-        self.depths['q_total'] = np.tile(np.nan, n_transects)
-        self.depths['q_max_run'] = np.tile(np.nan, n_transects)
-        self.depths['q_total_caution'] = np.tile(False, n_transects)
-        self.depths['q_max_run_caution'] = np.tile(False, n_transects)
-        self.depths['q_total_warning'] = np.tile(False, n_transects)
-        self.depths['q_max_run_warning'] = np.tile(False, n_transects)
-        self.depths['all_invalid'] = np.tile(False, n_transects)
-        self.depths['messages'] = []
-        self.depths['status'] = 'good'
-        self.depths['draft'] = 0
-        checked = []
-        drafts = []
-        for n, transect in enumerate(meas.transects):
-            checked.append(transect.checked)
-            if transect.checked:
-                in_transect_idx = transect.in_transect_idx
-
-                depths_selected = getattr(transect.depths, transect.depths.selected)
-                drafts.append(depths_selected.draft_use_m)
-
-                # Determine valid measured depths
-                if transect.depths.composite:
-                    depth_na = depths_selected.depth_source_ens[in_transect_idx] != 'NA'
-                    depth_in = depths_selected.depth_source_ens[in_transect_idx] != 'IN'
-                    depth_valid = np.all(np.vstack((depth_na, depth_in)), 0)
-                else:
-                    depth_valid_temp = depths_selected.valid_data[in_transect_idx]
-                    depth_nan = depths_selected.depth_processed_m[in_transect_idx] != np.nan
-                    depth_valid = np.all(np.vstack((depth_nan, depth_valid_temp)), 0)
-
-                if not np.any(depth_valid):
-                    self.depths['all_invalid'][n] = True
-
-                # Compute QA characteristics
-                q_total, q_max_run, number_invalid_ensembles = QAData.invalid_qa(depth_valid, meas.discharge[n])
-                self.depths['q_total'][n] = q_total
-                self.depths['q_max_run'][n] = q_max_run
-
-                # Compute percentage compared to total
-                if meas.discharge[n].total == 0.0:
-                    q_total_percent = np.nan
-                    q_max_run_percent = np.nan
-                else:
-                    q_total_percent = np.abs((q_total / meas.discharge[n].total) * 100)
-                    q_max_run_percent = np.abs((q_max_run / meas.discharge[n].total) * 100)
-
-                # Apply total interpolated discharge threshold
-                if q_total_percent > self.q_total_threshold_warning:
-                    self.depths['q_total_warning'][n] = True
-                elif q_total_percent > self.q_total_threshold_caution:
-                    self.depths['q_total_caution'][n] = True
-
-                # Apply interpolated discharge run thresholds
-                if q_max_run_percent > self.q_run_threshold_warning:
-                    self.depths['q_max_run_warning'][n] = True
-                elif q_max_run_percent > self.q_run_threshold_caution:
-                    self.depths['q_max_run_caution'][n] = True
-
-        if checked:
-
-            # Create array of all unique draft values
-            draft_check = np.unique(np.round(drafts, 2))
-
-            # Check draft consistency
-            if len(draft_check) > 1:
-                self.depths['status'] = 'caution'
-                self.depths['draft'] = 1
-                self.depths['messages'].append(['Depth: Transducer depth is not consistent among transects;', 2, 10])
-
-            # Check for zero draft
-            if np.any(np.less(draft_check, 0.01)):
-                self.depths['status'] = 'warning'
-                self.depths['draft'] = 2
-                self.depths['messages'].append(['DEPTH: Transducer depth is too shallow, likely 0;', 1, 10])
-
-            # Check consecutive interpolated discharge criteria
-            if np.any(self.depths['q_max_run_warning']):
-                self.depths['messages'].append(['DEPTH: Int. Q for consecutive invalid ensembles exceeds '
-                                                + '%2.0f' % self.q_run_threshold_warning + '%;', 1, 10])
-                self.depths['status'] = 'warning'
-            elif np.any(self.depths['q_max_run_caution']):
-                self.depths['messages'].append(['Depth: Int. Q for consecutive invalid ensembles exceeds '
-                                                + '%2.0f' % self.q_run_threshold_caution + '%;', 2, 10])
-                self.depths['status'] = 'caution'
-
-            # Check total interpolated discharge criteria
-            if np.any(self.depths['q_total_warning']):
-                self.depths['messages'].append(['DEPTH: Int. Q for invalid ensembles in a transect exceeds '
-                                                + '%2.0f' % self.q_total_threshold_warning + '%;', 1, 10])
-                self.depths['status'] = 'warning'
-            elif np.any(self.depths['q_total_caution']):
-                self.depths['messages'].append(['Depth: Int. Q for invalid ensembles in a transect exceeds '
-                                                + '%2.0f' % self.q_total_threshold_caution + '%;', 2, 10])
-                self.depths['status'] = 'caution'
-
-            # Check if all depths are invalid
-            if np.any(self.depths['all_invalid']):
-                self.depths['messages'].append(['DEPTH: There are no valid depths for one or more transects.', 2, 10])
-                self.depths['status'] = 'warning'
-
-        else:
-            self.depths['status'] = 'inactive'
-
-    def boat_qa(self, meas):
-        """Apply quality checks to boat data.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        # Initialize variables
-        n_transects = len(meas.transects)
-        data_type = {'BT': {'class': 'bt_vel', 'warning': 'BT-', 'caution': 'bt-',
-                            'filter': [('All: ', 0), ('Original: ', 1), ('ErrorVel: ', 2),
-                                       ('VertVel: ', 3), ('Other: ', 4), ('3Beams: ', 5)]},
-                     'GGA': {'class': 'gga_vel', 'warning': 'GGA-', 'caution': 'gga-',
-                             'filter': [('All: ', 0), ('Original: ', 1), ('DGPS: ', 2),
-                                        ('Altitude: ', 3), ('Other: ', 4), ('HDOP: ', 5)]},
-                     'VTG': {'class': 'vtg_vel', 'warning': 'VTG-', 'caution': 'vtg-',
-                             'filter': [('All: ', 0), ('Original: ', 1), ('Other: ', 4), ('HDOP: ', 5)]}}
-        self.boat['messages'] = []
-
-        for dt_key, dt_value in data_type.items():
-            boat = getattr(self, dt_value['class'])
-
-            # Initialize dictionaries for each data type
-            boat['q_total_caution'] = np.tile(False, (n_transects, 6))
-            boat['q_max_run_caution'] = np.tile(False, (n_transects, 6))
-            boat['q_total_warning'] = np.tile(False, (n_transects, 6))
-            boat['q_max_run_warning'] = np.tile(False, (n_transects, 6))
-            boat['all_invalid'] = np.tile(False, n_transects)
-            boat['q_total'] = np.tile(np.nan, (n_transects, 6))
-            boat['q_max_run'] = np.tile(np.nan, (n_transects, 6))
-            boat['messages'] = []
-            status_switch = 0
-            avg_speed_check = 0
-
-            # Check the results of each filter
-            for dt_filter in dt_value['filter']:
-                boat['status'] = 'inactive'
-
-                # Quality check each transect
-                for n, transect in enumerate(meas.transects):
-
-                    # Evaluate on transects used in the discharge computation
-                    if transect.checked:
-
-                        in_transect_idx = transect.in_transect_idx
-
-                        # Check to see if data are available for the data_type
-                        if getattr(transect.boat_vel, dt_value['class']) is not None:
-                            boat['status'] = 'good'
-
-                            # Compute quality characteristics
-                            valid = getattr(transect.boat_vel, dt_value['class']).valid_data[dt_filter[1],
-                                                                                             in_transect_idx]
-                            q_total, q_max_run, number_invalid_ens = QAData.invalid_qa(valid, meas.discharge[n])
-                            boat['q_total'][n, dt_filter[1]] = q_total
-                            boat['q_max_run'][n, dt_filter[1]] = q_max_run
-
-                            # Compute percentage compared to total
-                            if meas.discharge[n].total == 0.0:
-                                q_total_percent = np.nan
-                                q_max_run_percent = np.nan
-                            else:
-                                q_total_percent = np.abs((q_total / meas.discharge[n].total) * 100)
-                                q_max_run_percent = np.abs((q_max_run / meas.discharge[n].total) * 100)
-
-                            # Check if all invalid
-                            if dt_filter[1] == 0 and not np.any(valid):
-                                boat['all_invalid'][n] = True
-
-                            # Apply total interpolated discharge threshold
-                            if q_total_percent > self.q_total_threshold_warning:
-                                boat['q_total_warning'][n, dt_filter[1]] = True
-                            elif q_total_percent > self.q_total_threshold_caution:
-                                boat['q_total_caution'][n, dt_filter[1]] = True
-
-                            # Apply interpolated discharge run thresholds
-                            if q_max_run_percent > self.q_run_threshold_warning:
-                                boat['q_max_run_warning'][n, dt_filter[1]] = True
-                            elif q_max_run_percent > self.q_run_threshold_caution:
-                                boat['q_max_run_caution'][n, dt_filter[1]] = True
-
-                            # Check boat velocity for vtg data
-                            if dt_key == 'VTG' and transect.boat_vel.selected == 'vtg_vel' and avg_speed_check == 0:
-                                if transect.boat_vel.vtg_vel.u_mps is not None:
-                                    avg_speed = np.nanmean((transect.boat_vel.vtg_vel.u_mps ** 2
-                                                            + transect.boat_vel.vtg_vel.v_mps ** 2) ** 0.5)
-                                    if avg_speed < 0.24:
-                                        boat['q_total_caution'][n, 2] = True
-                                        if status_switch < 1:
-                                            status_switch = 1
-                                        boat['messages'].append(
-                                            ['vtg-AvgSpeed: VTG data may not be accurate for average boat speed '
-                                             'less than' + '0.24 m/s (0.8 ft/s);', 2, 8])
-                                        avg_speed_check = 1
-
-                # Create message for consecutive invalid discharge
-                if boat['q_max_run_warning'][:, dt_filter[1]].any():
-                    if dt_key == 'BT':
-                        module_code = 7
-                    else:
-                        module_code = 8
-                    boat['messages'].append(
-                        [dt_value['warning'] + dt_filter[0] +
-                         'Int. Q for consecutive invalid ensembles exceeds ' +
-                         '%3.1f' % self.q_run_threshold_warning + '%;', 1, module_code])
-                    status_switch = 2
-                elif boat['q_max_run_caution'][:, dt_filter[1]].any():
-                    if dt_key == 'BT':
-                        module_code = 7
-                    else:
-                        module_code = 8
-                    boat['messages'].append(
-                        [dt_value['caution'] + dt_filter[0] +
-                         'Int. Q for consecutive invalid ensembles exceeds ' +
-                         '%3.1f' % self.q_run_threshold_caution + '%;', 2, module_code])
-                    if status_switch < 1:
-                        status_switch = 1
-
-                # Create message for total invalid discharge
-                if boat['q_total_warning'][:, dt_filter[1]].any():
-                    if dt_key == 'BT':
-                        module_code = 7
-                    else:
-                        module_code = 8
-                    boat['messages'].append(
-                        [dt_value['warning'] + dt_filter[0] +
-                         'Int. Q for invalid ensembles in a transect exceeds ' +
-                         '%3.1f' % self.q_total_threshold_warning + '%;', 1, module_code])
-                    status_switch = 2
-                elif boat['q_total_caution'][:, dt_filter[1]].any():
-                    if dt_key == 'BT':
-                        module_code = 7
-                    else:
-                        module_code = 8
-                    boat['messages'].append(
-                        [dt_value['caution'] + dt_filter[0] +
-                         'Int. Q for invalid ensembles in a transect exceeds ' +
-                         '%3.1f' % self.q_total_threshold_caution + '%;', 2, module_code])
-                    if status_switch < 1:
-                        status_switch = 1
-
-            # Create message for all data invalid
-            if boat['all_invalid'].any():
-                boat['status'] = 'warning'
-                if dt_key == 'BT':
-                    module_code = 7
-                else:
-                    module_code = 8
-                boat['messages'].append(
-                    [dt_value['warning'] + dt_value['filter'][0][0] +
-                     'There are no valid data for one or more transects.;', 1, module_code])
-
-            # Set status
-            if status_switch == 2:
-                boat['status'] = 'warning'
-            elif status_switch == 1:
-                boat['status'] = 'caution'
-
-            setattr(self, dt_value['class'], boat)
-
-        lag_gga = []
-        lag_vtg = []
-        self.gga_vel['lag_status'] = 'good'
-        self.vtg_vel['lag_status'] = 'good'
-        for transect in meas.transects:
-            gga, vtg = TransectData.compute_gps_lag(transect)
-            if gga is not None:
-                lag_gga.append(gga)
-            if vtg is not None:
-                lag_vtg.append(vtg)
-        if len(lag_gga) > 0:
-            if np.mean(np.abs(lag_gga)) > 10:
-                self.gga_vel['messages'].append(['GGA: BT and GGA do not appear to be sychronized', 1, 8])
-                if self.gga_vel['status'] != 'warning':
-                    self.gga_vel['status'] = 'warning'
-                    self.gga_vel['lag_status'] = 'warning'
-            elif np.mean(np.abs(lag_gga)) > 2:
-                self.gga_vel['messages'].append(['gga: Lag between BT and GGA > 2 sec', 2, 8])
-                if self.gga_vel['status'] != 'warning':
-                    self.gga_vel['status'] = 'caution'
-                    self.gga_vel['lag_status'] = 'caution'
-        if len(lag_vtg) > 0:
-            if np.mean(np.abs(lag_vtg)) > 10:
-                self.vtg_vel['messages'].append(['VTG: BT and VTG do not appear to be sychronized', 1, 8])
-                if self.vtg_vel['status'] != 'warning':
-                    self.vtg_vel['status'] = 'warning'
-                    self.vtg_vel['lag status'] = 'warning'
-            elif np.mean(np.abs(lag_vtg)) > 2:
-                self.vtg_vel['messages'].append(['vtg: Lag between BT and VTG > 2 sec', 2, 8])
-                if self.vtg_vel['status'] != 'warning':
-                    self.vtg_vel['status'] = 'caution'
-                    self.vtg_vel['lag_status'] = 'caution'
-
-    def water_qa(self, meas):
-        """Apply quality checks to water data.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        # Initialize filter labels and indices
-        prefix = ['All: ', 'Original: ', 'ErrorVel: ', 'VertVel: ', 'Other: ', '3Beams: ', 'SNR:']
-        if meas.transects[0].adcp.manufacturer == 'TRDI':
-            filter_index = [0, 1, 2, 3, 4, 5]
-        else:
-            filter_index = [0, 1, 2, 3, 4, 5, 7]
-
-        n_transects = len(meas.transects)
-        n_filters = len(filter_index) + 1
-        # Initialize dictionaries for each data type
-        self.w_vel['q_total_caution'] = np.tile(False, (n_transects, n_filters))
-        self.w_vel['q_max_run_caution'] = np.tile(False, (n_transects, n_filters))
-        self.w_vel['q_total_warning'] = np.tile(False, (n_transects, n_filters))
-        self.w_vel['q_max_run_warning'] = np.tile(False, (n_transects, n_filters))
-        self.w_vel['all_invalid'] = np.tile(False, n_transects)
-        self.w_vel['q_total'] = np.tile(np.nan, (n_transects, n_filters))
-        self.w_vel['q_max_run'] = np.tile(np.nan, (n_transects, n_filters))
-        self.w_vel['messages'] = []
-        status_switch = 0
-
-        # TODO if meas had a property checked as list it would save creating that list multiple times
-        checked = []
-        for transect in meas.transects:
-            checked.append(transect.checked)
-
-        # At least one transect is being used to compute discharge
-        if any(checked):
-            # Loop through filters
-            for prefix_idx, filter_idx in enumerate(filter_index):
-                # Loop through transects
-                for n, transect in enumerate(meas.transects):
-                    if transect.checked:
-                        valid_original = np.any(transect.w_vel.valid_data[1, :, transect.in_transect_idx].T, 0)
-
-                        # Determine what data each filter have marked invalid. Original invalid data are excluded
-                        valid = np.any(transect.w_vel.valid_data[filter_idx, :, transect.in_transect_idx].T, 0)
-                        if filter_idx > 1:
-                            valid_int = valid.astype(int) - valid_original.astype(int)
-                            valid = valid_int != -1
-
-                        # Check if all data are invalid
-                        if filter_idx == 0:
-                            if np.nansum(valid.astype(int)) < 1:
-                                self.w_vel['all_invalid'][n] = True
-                        # TODO seems like the rest of this should be under else of all invalid or multiple messages
-                        # generated.
-
-                        # Compute characteristics
-                        q_total, q_max_run, number_invalid_ens = QAData.invalid_qa(valid, meas.discharge[n])
-                        self.w_vel['q_total'][n, filter_idx] = q_total
-                        self.w_vel['q_max_run'][n, filter_idx] = q_max_run
-
-                        # Compute percentage compared to total
-                        if meas.discharge[n].total == 0.0:
-                            q_total_percent = np.nan
-                            q_max_run_percent = np.nan
-                        else:
-                            q_total_percent = np.abs((q_total / meas.discharge[n].total) * 100)
-                            q_max_run_percent = np.abs((q_max_run / meas.discharge[n].total) * 100)
-
-                        # Check total invalid discharge in ensembles for warning
-                        if q_total_percent > self.q_total_threshold_warning:
-                            self.w_vel['q_total_warning'][n, filter_idx] = True
-
-                        # Apply run or cluster thresholds
-                        if q_max_run_percent > self.q_run_threshold_warning:
-                            self.w_vel['q_max_run_warning'][n, filter_idx] = True
-                        elif q_max_run_percent > self.q_run_threshold_caution:
-                            self.w_vel['q_max_run_caution'][n, filter_idx] = True
-
-                        # Compute percent discharge interpolated for both cells and ensembles
-                        # This approach doesn't exclude original data
-                        valid_cells = transect.w_vel.valid_data[filter_idx, :, transect.in_transect_idx].T
-                        q_invalid_total = np.nansum(meas.discharge[n].middle_cells[np.logical_not(valid_cells)]) \
-                            + np.nansum(meas.discharge[n].top_ens[np.logical_not(valid)]) \
-                            + np.nansum(meas.discharge[n].bottom_ens[np.logical_not(valid)])
-                        q_invalid_total_percent = (q_invalid_total / meas.discharge[n].total) * 100
-
-                        if q_invalid_total_percent > self.q_total_threshold_caution:
-                            self.w_vel['q_total_caution'][n, filter_idx] = True
-
-                # Generate messages for ensemble run or clusters
-                if np.any(self.w_vel['q_max_run_warning'][:, filter_idx]):
-                    self.w_vel['messages'].append(['WT-' + prefix[prefix_idx]
-                                                   + 'Int. Q for consecutive invalid ensembles exceeds '
-                                                   + '%3.0f' % self.q_run_threshold_warning
-                                                   + '%;', 1, 11])
-                    status_switch = 2
-                elif np.any(self.w_vel['q_max_run_caution'][:, filter_idx]):
-                    self.w_vel['messages'].append(['wt-' + prefix[prefix_idx]
-                                                   + 'Int. Q for consecutive invalid ensembles exceeds '
-                                                   + '%3.0f' % self.q_run_threshold_caution
-                                                   + '%;', 2, 11])
-                    if status_switch < 1:
-                        status_switch = 1
-
-                # Generate message for total_invalid Q
-                if np.any(self.w_vel['q_total_warning'][:, filter_idx]):
-                    self.w_vel['messages'].append(['WT-' + prefix[prefix_idx]
-                                                   + 'Int. Q for invalid cells and ensembles in a transect exceeds '
-                                                   + '%3.0f' % self.q_total_threshold_warning
-                                                   + '%;', 1, 11])
-                    status_switch = 2
-                elif np.any(self.w_vel['q_total_caution'][:, filter_idx]):
-                    self.w_vel['messages'].append(['wt-' + prefix[prefix_idx]
-                                                   + 'Int. Q for invalid cells and ensembles in a transect exceeds '
-                                                   + '%3.0f' % self.q_total_threshold_caution
-                                                   + '%;', 2, 11])
-                    if status_switch < 1:
-                        status_switch = 1
-
-            # Generate message for all invalid
-            if np.any(self.w_vel['all_invalid']):
-                self.w_vel['messages'].append(['WT-' + prefix[0] + 'There are no valid data for one or more transects.',
-                                               1, 11])
-                status_switch = 2
-
-            # Set status
-            self.w_vel['status'] = 'good'
-            if status_switch == 2:
-                self.w_vel['status'] = 'warning'
-            elif status_switch == 1:
-                self.w_vel['status'] = 'caution'
-        else:
-            self.w_vel['status'] = 'inactive'
-
-    def extrapolation_qa(self, meas):
-        """Apply quality checks to extrapolation methods
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.extrapolation['messages'] = []
-
-        checked = []
-        discharges = []
-        for n, transect in enumerate(meas.transects):
-            checked.append(transect.checked)
-            if transect.checked:
-                discharges.append(meas.discharge[n])
-
-        if any(checked):
-            self.extrapolation['status'] = 'good'
-            extrap_uncertainty = Uncertainty.uncertainty_extrapolation(meas, discharges)
-
-            if np.abs(extrap_uncertainty) > 2:
-                self.extrapolation['messages'].append(['Extrapolation: The extrapolation uncertainty is more than '
-                                                       + '2 percent;', 2, 12])
-                self.extrapolation['messages'].append(['    Carefully review the extrapolation;', 2, 12])
-                self.extrapolation['status'] = 'caution'
-        else:
-            self.extrapolation['status'] = 'inactive'
-
-    def edges_qa(self, meas):
-        """Apply quality checks to edge estimates
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        # Initialize variables
-        self.edges['messages'] = []
-        checked = []
-        left_q = []
-        right_q = []
-        total_q = []
-        edge_dist_left = []
-        edge_dist_right = []
-        dist_moved_left = []
-        dist_moved_right = []
-        dist_made_good = []
-        left_type = []
-        right_type = []
-        transect_idx = []
-
-        for n, transect in enumerate(meas.transects):
-            checked.append(transect.checked)
-
-            if transect.checked:
-                left_q.append(meas.discharge[n].left)
-                right_q.append(meas.discharge[n].right)
-                total_q.append(meas.discharge[n].total)
-                dmr, dml, dmg = QAData.edge_distance_moved(transect)
-                dist_moved_right.append(dmr)
-                dist_moved_left.append(dml)
-                dist_made_good.append(dmg)
-                edge_dist_left.append(transect.edges.left.distance_m)
-                edge_dist_right.append(transect.edges.right.distance_m)
-                left_type.append(transect.edges.left.type)
-                right_type.append(transect.edges.right.type)
-                transect_idx.append(n)
-
-        if any(checked):
-            # Set default status to good
-            self.edges['status'] = 'good'
-
-            mean_total_q = np.nanmean(total_q)
-
-            # Check left edge q > 5%
-            self.edges['left_q'] = 0
-
-            left_q_percent = (np.nanmean(left_q) / mean_total_q) * 100
-            temp_idx = np.where(left_q / mean_total_q > 0.05)[0]
-            if len(temp_idx) > 0:
-                self.edges['left_q_idx'] = np.array(transect_idx)[temp_idx]
-            else:
-                self.edges['left_q_idx'] = []
-            if np.abs(left_q_percent) > 5:
-                self.edges['status'] = 'caution'
-                self.edges['messages'].append(['Edges: Left edge Q is greater than 5%;', 1, 13])
-                self.edges['left_q'] = 1
-            elif len(self.edges['left_q_idx']) > 0:
-                self.edges['status'] = 'caution'
-                self.edges['messages'].append(
-                    ['Edges: One or more transects have a left edge Q greater than 5%;', 1, 13])
-                self.edges['left_q'] = 1
-
-            # Check right edge q > 5%
-            self.edges['right_q'] = 0
-            right_q_percent = (np.nanmean(right_q) / mean_total_q) * 100
-            temp_idx = np.where(right_q / mean_total_q > 0.05)[0]
-            if len(temp_idx) > 0:
-                self.edges['right_q_idx'] = np.array(transect_idx)[temp_idx]
-            else:
-                self.edges['right_q_idx'] = []
-            if np.abs(right_q_percent) > 5:
-                self.edges['status'] = 'caution'
-                self.edges['messages'].append(['Edges: Right edge Q is greater than 5%;', 1, 13])
-                self.edges['right_q'] = 1
-            elif len(self.edges['right_q_idx']) > 0:
-                self.edges['status'] = 'caution'
-                self.edges['messages'].append(
-                    ['Edges: One or more transects have a right edge Q greater than 5%;', 1, 13])
-                self.edges['right_q'] = 1
-
-            # Check for consistent sign
-            q_positive = []
-            self.edges['left_sign'] = 0
-            for q in left_q:
-                if q >= 0:
-                    q_positive.append(True)
-                else:
-                    q_positive.append(False)
-            if len(np.unique(q_positive)) > 1 and left_q_percent > 0.5:
-                self.edges['status'] = 'caution'
-                self.edges['messages'].append(['Edges: Sign of left edge Q is not consistent;', 2, 13])
-                self.edges['left_sign'] = 1
-
-            q_positive = []
-            self.edges['right_sign'] = 0
-            for q in right_q:
-                if q >= 0:
-                    q_positive.append(True)
-                else:
-                    q_positive.append(False)
-            if len(np.unique(q_positive)) > 1 and right_q_percent > 0.5:
-                self.edges['status'] = 'caution'
-                self.edges['messages'].append(['Edges: Sign of right edge Q is not consistent;', 2, 13])
-                self.edges['right_sign'] = 1
-
-            # Check distance moved
-            dmg_5_percent = 0.05 * np.nanmean(dist_made_good)
-            avg_right_edge_dist = np.nanmean(edge_dist_right)
-            right_threshold = np.nanmin([dmg_5_percent, avg_right_edge_dist])
-            temp_idx = np.where(dist_moved_right > right_threshold)[0]
-            if len(temp_idx) > 0:
-                self.edges['right_dist_moved_idx'] = np.array(transect_idx)[temp_idx]
-                self.edges['status'] = 'caution'
-                self.edges['messages'].append(['Edges: Excessive boat movement in right edge ensembles;', 2, 13])
-            else:
-                self.edges['right_dist_moved_idx'] = []
-
-            avg_left_edge_dist = np.nanmean(edge_dist_left)
-            left_threshold = np.nanmin([dmg_5_percent, avg_left_edge_dist])
-            temp_idx = np.where(dist_moved_left > left_threshold)[0]
-            if len(temp_idx) > 0:
-                self.edges['left_dist_moved_idx'] = np.array(transect_idx)[temp_idx]
-                self.edges['status'] = 'caution'
-                self.edges['messages'].append(['Edges: Excessive boat movement in left edge ensembles;', 2, 13])
-            else:
-                self.edges['left_dist_moved_idx'] = []
-
-            # Check for edge ensembles marked invalid due to excluded distance
-            self.edges['invalid_transect_left_idx'] = []
-            self.edges['invalid_transect_right_idx'] = []
-            for n, transect in enumerate(meas.transects):
-                if transect.checked:
-                    ens_invalid = np.nansum(transect.w_vel.valid_data[0, :, :], 0) > 0
-                    ens_cells_above_sl = np.nansum(transect.w_vel.cells_above_sl, 0) > 0
-                    ens_invalid = np.logical_not(np.logical_and(ens_invalid, ens_cells_above_sl))
-                    if np.any(ens_invalid):
-                        if transect.start_edge == 'Left':
-                            invalid_left = ens_invalid[0:int(transect.edges.left.number_ensembles)]
-                            invalid_right = ens_invalid[-int(transect.edges.right.number_ensembles):]
-                        else:
-                            invalid_right = ens_invalid[0:int(transect.edges.right.number_ensembles)]
-                            invalid_left = ens_invalid[-int(transect.edges.left.number_ensembles):]
-                        if len(invalid_left) > 0:
-                            left_invalid_percent = sum(invalid_left) / len(invalid_left)
-                        else:
-                            left_invalid_percent = 0
-                        if len(invalid_right) > 0:
-                            right_invalid_percent = sum(invalid_right) / len(invalid_right)
-                        else:
-                            right_invalid_percent = 0
-                        max_invalid_percent = max([left_invalid_percent, right_invalid_percent]) * 100
-                        if max_invalid_percent > 25:
-                            self.edges['status'] = 'caution'
-                            if np.any(invalid_left):
-                                self.edges['invalid_transect_left_idx'].append(n)
-                            if np.any(invalid_right):
-                                self.edges['invalid_transect_right_idx'].append(n)
-
-            if len(self.edges['invalid_transect_left_idx']) > 0 or len(self.edges['invalid_transect_right_idx']) > 0:
-                self.edges['messages'].append(['Edges: The percent of invalid ensembles exceeds 25% in' +
-                                               ' one or more transects.', 2, 13])
-
-            # Check edges for zero discharge
-            self.edges['left_zero'] = 0
-            temp_idx = np.where(np.round(left_q, 4) == 0)[0]
-            if len(temp_idx) > 0:
-                self.edges['left_zero_idx'] = np.array(transect_idx)[temp_idx]
-                self.edges['status'] = 'warning'
-                self.edges['messages'].append(['EDGES: Left edge has zero Q;', 1, 13])
-                self.edges['left_zero'] = 2
-            else:
-                self.edges['left_zero_idx'] = []
-
-            self.edges['right_zero'] = 0
-            temp_idx = np.where(np.round(right_q, 4) == 0)[0]
-            if len(temp_idx) > 0:
-                self.edges['right_zero_idx'] = np.array(transect_idx)[temp_idx]
-                self.edges['status'] = 'warning'
-                self.edges['messages'].append(['EDGES: Right edge has zero Q;', 1, 13])
-                self.edges['right_zero'] = 2
-            else:
-                self.edges['right_zero_idx'] = []
-
-            # Check consistent edge type
-            self.edges['left_type'] = 0
-            if len(np.unique(left_type)) > 1:
-                self.edges['status'] = 'warning'
-                self.edges['messages'].append(['EDGES: Left edge type is not consistent;', 1, 13])
-                self.edges['left_type'] = 2
-
-            self.edges['right_type'] = 0
-            if len(np.unique(right_type)) > 1:
-                self.edges['status'] = 'warning'
-                self.edges['messages'].append(['EDGES: Right edge type is not consistent;', 1, 13])
-                self.edges['right_type'] = 2
-        else:
-            self.edges['status'] = 'inactive'
-
-    @staticmethod
-    def invalid_qa(valid, discharge):
-        """Computes the total invalid discharge in ensembles that have invalid data. The function also computes
-        the maximum run or cluster of ensembles with the maximum interpolated discharge.
-
-        Parameters
-        ----------
-        valid: np.array(bool)
-            Array identifying valid and invalid ensembles.
-        discharge: QComp
-            Object of class QComp
-
-        Returns
-        -------
-        q_invalid_total: float
-            Total interpolated discharge in invalid ensembles
-        q_invalid_max_run: float
-            Maximum interpolated discharge in a run or cluster of invalid ensembles
-        ens_invalid: int
-            Total number of invalid ensembles
-        """
-
-        # Create bool for invalid data
-        invalid = np.logical_not(valid)
-        q_invalid_total = np.nansum(discharge.middle_ens[invalid]) + np.nansum(discharge.top_ens[invalid]) \
-            + np.nansum(discharge.bottom_ens[invalid])
-
-        # Compute total number of invalid ensembles
-        ens_invalid = np.sum(invalid)
-
-        # Compute the indices of where changes occur
-
-        valid_int = np.insert(valid.astype(int), 0, -1)
-        valid_int = np.append(valid_int, -1)
-        valid_run = np.where(np.diff(valid_int) != 0)[0]
-        run_length = np.diff(valid_run)
-        run_length0 = run_length[(valid[0] == 1)::2]
-
-        n_runs = len(run_length0)
-
-        if valid[0]:
-            n_start = 1
-        else:
-            n_start = 0
-
-        n_end = len(valid_run) - 1
-
-        if n_runs > 1:
-            m = 0
-            q_invalid_run = []
-            for n in range(n_start, n_end, 2):
-                m += 1
-                idx_start = valid_run[n]
-                idx_end = valid_run[n + 1]
-                q_invalid_run.append(np.nansum(discharge.middle_ens[idx_start:idx_end])
-                                     + np.nansum(discharge.top_ens[idx_start:idx_end])
-                                     + np.nansum(discharge.bottom_ens[idx_start:idx_end]))
-
-            # Determine the maximum discharge in a single run
-            q_invalid_max_run = np.nanmax(np.abs(q_invalid_run))
-
-        else:
-            q_invalid_max_run = 0.0
-
-        return q_invalid_total, q_invalid_max_run, ens_invalid
-
-    @staticmethod
-    def edge_distance_moved(transect):
-        """Computes the boat movement during edge ensemble collection.
-
-        Parameters
-        ----------
-        transect: Transect
-            Object of class Transect
-
-        Returns
-        -------
-        right_dist_moved: float
-            Distance in m moved during collection of right edge samples
-        left_dist_moved: float
-            Distance in m moved during collection of left edge samples
-        dmg: float
-            Distance made good for the entire transect
-        """
-
-        boat_selected = getattr(transect.boat_vel, transect.boat_vel.selected)
-        ens_duration = transect.date_time.ens_duration_sec
-
-        # Get boat velocities
-        if boat_selected is not None:
-            u_processed = boat_selected.u_processed_mps
-            v_processed = boat_selected.v_processed_mps
-        else:
-            u_processed = np.tile(np.nan, transect.boat_vel.bt_vel.u_processed_mps.shape)
-            v_processed = np.tile(np.nan, transect.boat_vel.bt_vel.v_processed_mps.shape)
-
-        # Compute boat coordinates
-        x_processed = np.nancumsum(u_processed * ens_duration)
-        y_processed = np.nancumsum(v_processed * ens_duration)
-        dmg = (x_processed[-1] ** 2 + y_processed[-1] ** 2) ** 0.5
-
-        # Compute left distance moved
-        # TODO should be a dist moved function
-        left_edge_idx = QComp.edge_ensembles('left', transect)
-        if len(left_edge_idx) > 0:
-            boat_x = x_processed[left_edge_idx[-1]] - x_processed[left_edge_idx[0]]
-            boat_y = y_processed[left_edge_idx[-1]] - y_processed[left_edge_idx[0]]
-            left_dist_moved = (boat_x ** 2 + boat_y ** 2) ** 0.5
-        else:
-            left_dist_moved = np.nan
-
-        # Compute right distance moved
-        right_edge_idx = QComp.edge_ensembles('right', transect)
-        if len(right_edge_idx) > 0:
-            boat_x = x_processed[right_edge_idx[-1]] - x_processed[right_edge_idx[0]]
-            boat_y = y_processed[right_edge_idx[-1]] - y_processed[right_edge_idx[0]]
-            right_dist_moved = (boat_x ** 2 + boat_y ** 2) ** 0.5
-        else:
-            right_dist_moved = np.nan
-
-        return right_dist_moved, left_dist_moved, dmg
-    
-    # check for user changes
-    def check_bt_setting(self, meas):
-        """Checks the bt settings to see if they are still on the default
-                        settings.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.settings_dict['tab_bt'] = 'Default'
-
-        s = meas.current_settings()
-        d = meas.qrev_default_settings()
-
-        if s['BTbeamFilter'] != d['BTbeamFilter']:
-            self.bt_vel['messages'].append(['BT: User modified default beam setting.', 3, 8])
-            self.settings_dict['tab_bt'] = 'Custom'
-
-        if s['BTdFilter'] != d['BTdFilter']:
-            self.bt_vel['messages'].append(['BT: User modified default error velocity filter.', 3, 8])
-            self.settings_dict['tab_bt'] = 'Custom'
-
-        if s['BTwFilter'] != d['BTwFilter']:
-            self.bt_vel['messages'].append(['BT: User modified default vertical velocity filter.', 3, 8])
-            self.settings_dict['tab_bt'] = 'Custom'
-
-        if s['BTsmoothFilter'] != d['BTsmoothFilter']:
-            self.bt_vel['messages'].append(['BT: User modified default smooth filter.', 3, 8])
-            self.settings_dict['tab_bt'] = 'Custom'
-
-    def check_wt_settings(self, meas):
-        """Checks the wt settings to see if they are still on the default
-                settings.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.settings_dict['tab_wt'] = 'Default'
-
-        s = meas.current_settings()
-        d = meas.qrev_default_settings()
-
-        if round(s['WTExcludedDistance'], 2) != round(d['WTExcludedDistance'], 2):
-            self.w_vel['messages'].append(['WT: User modified excluded distance.', 3, 11])
-            self.settings_dict['tab_wt'] = 'Custom'
-
-        if s['WTbeamFilter'] != d['WTbeamFilter']:
-            self.w_vel['messages'].append(['WT: User modified default beam setting.', 3, 11])
-            self.settings_dict['tab_wt'] = 'Custom'
-
-        if s['WTdFilter'] != d['WTdFilter']:
-            self.w_vel['messages'].append(['WT: User modified default error velocity filter.', 3, 11])
-            self.settings_dict['tab_wt'] = 'Custom'
-
-        if s['WTwFilter'] != d['WTwFilter']:
-            self.w_vel['messages'].append(['WT: User modified default vertical velocity filter.', 3, 11])
-            self.settings_dict['tab_wt'] = 'Custom'
-
-        if s['WTsnrFilter'] != d['WTsnrFilter']:
-            self.w_vel['messages'].append(['WT: User modified default SNR filter.', 3, 11])
-            self.settings_dict['tab_wt'] = 'Custom'
-
-    def check_extrap_settings(self, meas):
-        """Checks the extrap to see if they are still on the default
-        settings.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.settings_dict['tab_extrap'] = 'Default'
-
-        # Check fit parameters
-        if meas.extrap_fit.sel_fit[0].fit_method != 'Automatic':
-            self.settings_dict['tab_extrap'] = 'Custom'
-            self.extrapolation['messages'].append(['Extrapolation: User modified default automatic setting.', 3, 12])
-
-        # Check data parameters
-        if meas.extrap_fit.sel_fit[-1].data_type.lower() != 'q':
-            self.settings_dict['tab_extrap'] = 'Custom'
-            self.extrapolation['messages'].append(['Extrapolation: User modified data type ', 3, 12])
-
-        if meas.extrap_fit.threshold != 20:
-            self.settings_dict['tab_extrap'] = 'Custom'
-            self.extrapolation['messages'].append(['Extrapolation: User modified default threshold.', 3, 12])
-
-        if meas.extrap_fit.subsection[0] != 0 or meas.extrap_fit.subsection[1] != 100:
-            self.settings_dict['tab_extrap'] = 'Custom'
-            self.extrapolation['messages'].append(['Extrapolation: User modified subsectioning', 3, 12])
-
-    def check_tempsal_settings(self, meas):
-        """Checks the temp and salinity settings to see if they are still on
-        the default settings.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.settings_dict['tab_tempsal'] = 'Default'
-
-        t_source_change = False
-        salinity_change = False
-        s_sound_change = False
-        t_user_change = False
-        t_adcp_change = False
-
-        if not all(np.isnan([meas.ext_temp_chk['user'], meas.ext_temp_chk['user_orig']])):
-            if meas.ext_temp_chk['user'] != meas.ext_temp_chk['user_orig']:
-                t_user_change = True
-
-        if not all(np.isnan([meas.ext_temp_chk['adcp'], meas.ext_temp_chk['adcp_orig']])):
-            if meas.ext_temp_chk['adcp'] != meas.ext_temp_chk['adcp_orig']:
-                t_adcp_change = True
-
-        # Check each checked transect
-        for idx in meas.checked_transect_idx:
-            transect = meas.transects[idx]
-
-            # Temperature source
-            if transect.sensors.temperature_deg_c.selected != 'internal':
-                t_source_change = True
-
-            if transect.sensors.salinity_ppt.selected != 'internal':
-                sal = getattr(transect.sensors.salinity_ppt, transect.sensors.salinity_ppt.selected)
-                if np.all(np.equal(sal.data, transect.sensors.salinity_ppt.internal.data)):
-                    salinity_change = False
-                else:
-                    salinity_change = True
-
-            # Speed of Sound
-            if transect.sensors.speed_of_sound_mps.selected != 'internal':
-                s_sound_change = True
-
-        # Report condition and messages
-        if any([t_source_change, salinity_change, s_sound_change, t_adcp_change, t_user_change]):
-            self.settings_dict['tab_tempsal'] = 'Custom'
-            
-            if t_source_change:
-                self.temperature['messages'].append(['Temperature: User modified temperature source.', 3, 5])
-
-            if s_sound_change:
-                self.temperature['messages'].append(['Temperature: User modified speed of sound source.', 3, 5])
-
-            if t_user_change:
-                self.temperature['messages'].append(['Temperature: User modified independent temperature.', 3, 5])
-
-            if t_adcp_change:
-                self.temperature['messages'].append(['Temperature: User modified ADCP temperature.', 3, 5])
-         
-    def check_gps_settings(self, meas):
-        """Checks the gps settings to see if they are still on the default
-        settings.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        gps = False
-        self.settings_dict['tab_gps'] = 'Default'
-
-        # Check for transects with gga or vtg data
-        for idx in meas.checked_transect_idx:
-            transect = meas.transects[idx]
-            if transect.boat_vel.gga_vel is not None or transect.boat_vel.gga_vel is not None:
-                gps = True
-                break
-
-        # If gga or vtg data exist check settings
-        if gps:
-
-            s = meas.current_settings()
-            d = meas.qrev_default_settings()
-
-            if s['ggaDiffQualFilter'] != d['ggaDiffQualFilter']:
-                self.gga_vel['messages'].append(['GPS: User modified default quality setting.', 3, 8])
-                self.settings_dict['tab_gps'] = 'Custom'
-
-            if s['ggaAltitudeFilter'] != d['ggaAltitudeFilter']:
-                self.gga_vel['messages'].append(['GPS: User modified default altitude filter.', 3, 8])
-                self.settings_dict['tab_gps'] = 'Custom'
-
-            if s['GPSHDOPFilter'] != d['GPSHDOPFilter']:
-                self.gga_vel['messages'].append(['GPS: User modified default HDOP filter.', 3, 8])
-                self.settings_dict['tab_gps'] = 'Custom'
-
-            if s['GPSSmoothFilter'] != d['GPSSmoothFilter']:
-                self.gga_vel['messages'].append(['GPS: User modified default smooth filter.', 3, 8])
-                self.settings_dict['tab_gps'] = 'Custom'
-
-    def check_depth_settings(self, meas):
-        """Checks the depth settings to see if they are still on the default
-                settings.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.settings_dict['tab_depth'] = 'Default'
-
-        s = meas.current_settings()
-        d = meas.qrev_default_settings()
-
-        if s['depthReference'] != d['depthReference']:
-            self.depths['messages'].append(['Depths: User modified '
-                                            'depth reference.', 3, 10])
-            self.settings_dict['tab_depth'] = 'Custom'
-
-        if s['depthComposite'] != d['depthComposite']:
-            self.depths['messages'].append(['Depths: User modified '
-                                            'depth reference.', 3, 10])
-            self.settings_dict['tab_depth'] = 'Custom'
-
-        if s['depthAvgMethod'] != d['depthAvgMethod']:
-            self.depths['messages'].append(['Depths: User modified '
-                                            'averaging method.', 3, 10])
-            self.settings_dict['tab_depth'] = 'Custom'
-
-        if s['depthFilterType'] != d['depthFilterType']:
-            self.depths['messages'].append(['Depths: User modified '
-                                            'filter type.', 3, 10])
-            self.settings_dict['tab_depth'] = 'Custom'
-
-        for idx in meas.checked_transect_idx:
-            transect = meas.transects[idx]
-            if transect.depths.bt_depths.draft_orig_m != transect.depths.bt_depths.draft_use_m:
-                self.depths['messages'].append(['Depths: User modified '
-                                                'draft.', 3, 10])
-                self.settings_dict['tab_depth'] = 'Custom'
-                break
-
-    def check_edge_settings(self, meas):
-        """Checks the edge settings to see if they are still on the original
-                settings.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        start_edge_change = False
-        left_edge_type_change = False
-        left_edge_dist_change = False
-        left_edge_ens_change = False
-        left_edge_q_change = False
-        left_edge_coef_change = False
-        right_edge_type_change = False
-        right_edge_dist_change = False
-        right_edge_ens_change = False
-        right_edge_q_change = False
-        right_edge_coef_change = False
-
-        for idx in meas.checked_transect_idx:
-            transect = meas.transects[idx]
-
-            if transect.start_edge != transect.orig_start_edge:
-                start_edge_change = True
-
-            if transect.edges.left.type != transect.edges.left.orig_type:
-                left_edge_type_change = True
-
-            if transect.edges.left.distance_m != transect.edges.left.orig_distance_m:
-                left_edge_dist_change = True
-
-            if transect.edges.left.number_ensembles != transect.edges.left.orig_number_ensembles:
-                left_edge_ens_change = True
-
-            if transect.edges.left.user_discharge_cms != transect.edges.left.orig_user_discharge_cms:
-                left_edge_q_change = True
-
-            if transect.edges.left.cust_coef != transect.edges.left.orig_cust_coef:
-                left_edge_coef_change = True
-
-            if transect.edges.right.type != transect.edges.right.orig_type:
-                right_edge_type_change = True
-
-            if transect.edges.right.distance_m != transect.edges.right.orig_distance_m:
-                right_edge_dist_change = True
-
-            if transect.edges.right.number_ensembles != transect.edges.right.orig_number_ensembles:
-                right_edge_ens_change = True
-
-            if transect.edges.right.user_discharge_cms != transect.edges.right.orig_user_discharge_cms:
-                right_edge_q_change = True
-
-            if transect.edges.right.cust_coef != transect.edges.right.orig_cust_coef:
-                right_edge_coef_change = True
-
-        if any([start_edge_change, left_edge_type_change, left_edge_dist_change, left_edge_ens_change,
-                left_edge_q_change, left_edge_coef_change, right_edge_type_change, right_edge_dist_change,
-                right_edge_ens_change, right_edge_q_change, right_edge_coef_change]):
-            self.settings_dict['tab_edges'] = 'Custom'
-
-            if start_edge_change:
-                self.edges['messages'].append(['Edges: User modified start edge.', 3, 10])
-            if left_edge_type_change:
-                self.edges['messages'].append(['Edges: User modified left edge type.', 3, 10])
-            if left_edge_dist_change:
-                self.edges['messages'].append(['Edges: User modified left edge distance.', 3, 10])
-            if left_edge_ens_change:
-                self.edges['messages'].append(['Edges: User modified left number of ensembles.', 3, 10])
-            if left_edge_q_change:
-                self.edges['messages'].append(['Edges: User modified left user discharge.', 3, 10])
-            if left_edge_coef_change:
-                self.edges['messages'].append(['Edges: User modified left custom coefficient.', 3, 10])
-            if right_edge_type_change:
-                self.edges['messages'].append(['Edges: User modified right edge type.', 3, 10])
-            if right_edge_dist_change:
-                self.edges['messages'].append(['Edges: User modified right edge distance.', 3, 10])
-            if right_edge_ens_change:
-                self.edges['messages'].append(['Edges: User modified right number of ensembles.', 3, 10])
-            if right_edge_q_change:
-                self.edges['messages'].append(['Edges: User modified right user discharge.', 3, 10])
-            if right_edge_coef_change:
-                self.edges['messages'].append(['Edges: User modified right custom coefficient.', 3, 10])
-        else:
-            self.settings_dict['tab_edges'] = 'Default'
-
-    def check_mbt_settings(self, meas):
-        """Checks the mbt settings to see if they are still on the original
-                settings.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        # if there are mb tests check for user changes
-        if len(meas.mb_tests) >= 1:
-            mbt = meas.mb_tests
-
-            mb_user_valid = []
-            mb_used = []
-
-            auto = copy.deepcopy(mbt)
-            auto = MovingBedTests.auto_use_2_correct(auto)
-
-            for n in range(len(mbt)):
-
-                if mbt[n].user_valid:
-                    mb_user_valid.append(False)
-                else:
-                    mb_user_valid.append(True)
-
-                if mbt[n].use_2_correct != auto[n].use_2_correct and \
-                        meas.transects[meas.checked_transect_idx[0]].boat_vel.selected == 'bt_vel':
-                    mb_used.append(True)
-                else:
-                    mb_used.append(False)
-
-            self.settings_dict['tab_mbt'] = 'Default'
-            if any(mb_user_valid):
-                self.settings_dict['tab_mbt'] = 'Custom'
-                self.movingbed['messages'].append(['Moving-Bed Test: '
-                                                   'User modified '
-                                                   'valid test settings.', 3, 6])
-            if any(mb_used):
-                self.settings_dict['tab_mbt'] = 'Custom'
-                self.movingbed['messages'].append(['Moving-Bed Test: '
-                                                   'User modified '
-                                                   'use to correct settings.', 3, 6])
-
-        if meas.observed_no_moving_bed:
-            self.settings_dict['tab_mbt'] = 'Custom'
-
-    def check_compass_settings(self, meas):
-        """Checks the compass settings for changes.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.settings_dict['tab_compass'] = 'Default'
-
-        magvar_change = False
-        align_change = False
-
-        # Check each checked transect
-        for idx in meas.checked_transect_idx:
-            transect = meas.transects[idx]
-
-            # Magvar
-            if transect.sensors.heading_deg.internal.mag_var_deg != \
-                    transect.sensors.heading_deg.internal.mag_var_orig_deg:
-                magvar_change = True
-
-            # Heading offset
-            if transect.sensors.heading_deg.external is not None:
-                if transect.sensors.heading_deg.external.align_correction_deg != \
-                        transect.sensors.heading_deg.external.align_correction_orig_deg:
-                    align_change = True
-
-        # Report condition and messages
-        if any([magvar_change, align_change]):
-            self.settings_dict['tab_compass'] = 'Custom'
-
-            if magvar_change:
-                self.compass['messages'].append(['Compass: User modified magnetic variation.', 3, 4])
-
-            if align_change:
-                self.compass['messages'].append(['Compass: User modified heading offset.', 3, 4])
-
-    def check_oursin(self, meas):
-        """Checks the compass settings for changes.
-
-        Parameters
-        ----------
-        meas: Measurement
-            Object of class Measurement
-        """
-
-        self.settings_dict['tab_uncertainty_2_advanced'] = 'Default'
-        self.settings_dict['tab_uncertainty'] = 'Default'
-
-        for key in meas.oursin.user_advanced_settings.keys():
-            if not np.isnan(meas.oursin.user_advanced_settings[key]):
-                self.settings_dict['tab_uncertainty_2_advanced'] = 'Custom'
-                self.settings_dict['tab_uncertainty'] = 'Custom'
-                break
-
-        for key in meas.oursin.user_specified_u.keys():
-            if not np.isnan(meas.oursin.user_specified_u[key]):
-                self.settings_dict['tab_uncertainty'] = 'Custom'
-                break
diff --git a/qrevint_22_06_22/DischargeFunctions/bottom_discharge_extrapolation.cp39-win_amd64.pyd b/qrevint_22_06_22/DischargeFunctions/bottom_discharge_extrapolation.cp39-win_amd64.pyd
deleted file mode 100644
index 046f35e897397e7efc156ce63b9ea8ceeba837b3..0000000000000000000000000000000000000000
Binary files a/qrevint_22_06_22/DischargeFunctions/bottom_discharge_extrapolation.cp39-win_amd64.pyd and /dev/null differ
diff --git a/qrevint_22_06_22/DischargeFunctions/top_discharge_extrapolation.cp39-win_amd64.pyd b/qrevint_22_06_22/DischargeFunctions/top_discharge_extrapolation.cp39-win_amd64.pyd
deleted file mode 100644
index 04600e7b2c4a54a2a5bc83211b22464e4e339763..0000000000000000000000000000000000000000
Binary files a/qrevint_22_06_22/DischargeFunctions/top_discharge_extrapolation.cp39-win_amd64.pyd and /dev/null differ
diff --git a/qrevint_22_06_22/MiscLibs/bayes_cov_compiled.cp39-win_amd64.pyd b/qrevint_22_06_22/MiscLibs/bayes_cov_compiled.cp39-win_amd64.pyd
deleted file mode 100644
index 0f8fe8e893cbccb7a46623aeecc6897ec6038cf8..0000000000000000000000000000000000000000
Binary files a/qrevint_22_06_22/MiscLibs/bayes_cov_compiled.cp39-win_amd64.pyd and /dev/null differ
diff --git a/qrevint_22_06_22/MiscLibs/robust_loess_compiled.cp39-win_amd64.pyd b/qrevint_22_06_22/MiscLibs/robust_loess_compiled.cp39-win_amd64.pyd
deleted file mode 100644
index 08116c4f307289f31802a023b62e0e224158b185..0000000000000000000000000000000000000000
Binary files a/qrevint_22_06_22/MiscLibs/robust_loess_compiled.cp39-win_amd64.pyd and /dev/null differ
diff --git a/qrevint_22_06_22/MiscLibs/run_iqr.cp39-win_amd64.pyd b/qrevint_22_06_22/MiscLibs/run_iqr.cp39-win_amd64.pyd
deleted file mode 100644
index cb919a42c9407054e036f49c7f05488f19e29365..0000000000000000000000000000000000000000
Binary files a/qrevint_22_06_22/MiscLibs/run_iqr.cp39-win_amd64.pyd and /dev/null differ
diff --git a/qrevint_22_06_22/path_file.txt b/qrevint_22_06_22/path_file.txt
deleted file mode 100644
index d64a9fe4fd8d4d4f8d4b0b5ea3441044a0501b9f..0000000000000000000000000000000000000000
--- a/qrevint_22_06_22/path_file.txt
+++ /dev/null
@@ -1 +0,0 @@
-C:\Users\blaise.calmel\Documents\3_Aide_Jessica\4_Data_script\Grenoble_Campus\20220406_Campus\ADCP
\ No newline at end of file
diff --git a/qrevint_22_06_22/requirements.txt b/qrevint_22_06_22/requirements.txt
deleted file mode 100644
index fa736a65096321ebe443780e01304fb5fbcdff95..0000000000000000000000000000000000000000
--- a/qrevint_22_06_22/requirements.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-cycler==0.11.0
-fonttools==4.33.3
-joblib==1.1.0
-kiwisolver==1.4.2
-llvmlite==0.38.1
-matplotlib==3.5.2
-numba==0.55.2
-numpy==1.22.4
-packaging==21.3
-pandas==1.4.2
-patsy==0.5.2
-Pillow==9.1.1
-profilehooks==1.12.0
-pyparsing==3.0.9
-PyQt5==5.15.6
-PyQt5-Qt5==5.15.2
-PyQt5-sip==12.11.0
-python-dateutil==2.8.2
-pytz==2022.1
-scikit-learn==1.1.1
-scipy==1.8.1
-seaborn==0.11.2
-six==1.16.0
-sklearn==0.0
-statsmodels==0.13.2
-threadpoolctl==3.1.0
-utm==0.7.0
-xmltodict==0.13.0
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3a88432ae630acdd53b81b164208ab218c287e93
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,36 @@
+contourpy==1.0.7
+cycler==0.11.0
+et-xmlfile==1.1.0
+fonttools==4.39.0
+importlib-resources==5.12.0
+joblib==1.2.0
+kiwisolver==1.4.4
+llvmlite==0.39.1
+matplotlib==3.3.4
+numba==0.56.4
+numpy==1.23.5
+openpyxl==3.1.2
+packaging==23.0
+pandas==1.5.3
+patsy==0.5.3
+Pillow==9.4.0
+profilehooks==1.12.0
+properscoring==0.1
+pyparsing==3.0.9
+PyQt5==5.15.4
+PyQt5-Qt5==5.15.2
+PyQt5-sip==12.11.1
+python-dateutil==2.8.2
+pytz==2022.7.1
+scikit-learn==1.2.2
+scipy==1.10.1
+seaborn==0.12.2
+sigfig==1.3.2
+simplekml==1.3.6
+six==1.16.0
+sortedcontainers==2.4.0
+statsmodels==0.13.5
+threadpoolctl==3.1.0
+utm==0.7.0
+xmltodict==0.13.0
+zipp==3.15.0
diff --git a/run_MAP.py b/run_MAP.py
index cfe4123ab16a2eaddccd9a4cda52e8a3943fca0d..f8ba5a81b68fb617dbc5d70abee0560653f4bf74 100644
--- a/run_MAP.py
+++ b/run_MAP.py
@@ -10,23 +10,26 @@ Created on Fri Feb  4 12:02:22 2022
 import sys
 import numpy as np
 import os
+import time
+import pandas as pd
+
 
 if "PYCHARM_HOSTED" in os.environ:
     import matplotlib as mpl
     mpl.use('Qt5Agg')
 
 path_cwd = os.getcwd()
-sys.path.insert(0, path_cwd +'\\qrevint_22_06_22')
+# sys.path.insert(0, path_cwd +'\\qrevint_22_06_22')
 
 #========================================
 # Internal imports
 #========================================
-from open_functions import select_file, open_measurement, new_settings
-from MAP_class import MAP
-
-
+from open_functions import select_file, open_measurement, new_settings, select_directory
+from UI.MplCanvas import MplCanvas
+from UI.WTContour import WTContour
+from UI.MapTrack import Maptrack
 # =============================================================================
-# SETTINGS       
+# SETTINGS
 # =============================================================================
 """SETTINGS
         ----------
@@ -61,79 +64,159 @@ interp_option = True
 track_section = True
 plot = True
 
-run_default = input('--- Use default settings ([y]/n) : ')
-if run_default.lower() == 'n':
-    print('===== GENERAL SETTINGS =====')
-    input_checked_transect = input('Selected transects (int separated by spaces) : ')
-    if input_checked_transect:
-        checked_transect_user = list(np.unique(list(map(int, input_checked_transect.split()))))
-    input_navigation_reference = input('Chose navigation reference (BT/GPS) : ')
-    if input_navigation_reference :
-        navigation_reference_user = input_navigation_reference.upper()
-    input_horizontal_node = input('Select MAP\'s mesh length (m) : ')
-    if input_horizontal_node.isnumeric():
-        node_horizontal_user = float(input_horizontal_node)
-    input_vertical_node = input('Select MAP\'s mesh depth (m) : ')
-    if input_horizontal_node.isnumeric():
-        node_vertical_user = float(input_vertical_node)
-    run_advanced = input('--- Use default advanced settings ([y]/n) : ')
-    if run_advanced.lower() == 'n':
-        print('===== ADVANCED SETTINGS =====')
-        input_edge_constant = input('Use constant mesh size for edges ([True]/False) : ')
-        if input_edge_constant.lower() == 'false':
-            edge_constant = False
-        input_extrap_option = input('Apply extrapolation ([True]/False) : ')
-        if input_extrap_option.lower() == 'false':
-            extrap_option = False
-        input_interp_option = input('Apply interpolation ([True]/False) : ')
-        if input_interp_option.lower() == 'false':
-            interp_option = False
-        input_track_section = input('Compute average cross-section on boat track ([True]/False) : ')
-        if input_track_section.lower() == 'false':
-            track_section = False
-        input_plot = input('Plot graphes ([True]/False) : ')
-        if input_plot.lower() == 'false':
-            plot = False
+units = {'L': 1, 'Q': 1, 'A': 1, 'V': 1, 'label_L': '(m)', 'label_Q': '(m3/s)', 'label_A': '(m2)',
+                 'label_V': '(m/s)',
+                 'ID': 'SI'}
+
+with open(os.getcwd()+'\\path_file.txt', 'r') as f:
+    path_window = f.readlines(0)
 
 
+# path_results = r'C:\Users\blaise.calmel\Documents\2_QRev_updates\6_Update_qrev\Results'
+path_results = path_cwd + '\Results'
+if not os.path.exists(path_results):
+    os.makedirs(path_results)
+
 # =============================================================================
-# Open measurement
+# Open folder
 # =============================================================================
-with open(os.getcwd()+'\\qrevint_22_06_22\\path_file.txt', 'r') as f:
-    path_window = f.readlines(0)
-
-path_meas, type_meas, name_meas = select_file(path_window)
+time_start = time.time()
+data = {'Parent': [], 'Name': [], 'Meas Q': [], 'MAP Q': [], 'Q diff': []}
+path_folder, path_meas, type_meas, name_meas, no_adcp, name_parent = select_directory()
+for i in range(len(path_meas)):
+    print(f'============== Meas {i} on {len(path_meas)} ==============')
+    print(f'TTTTTTTTT Running for : {time.strftime("%H:%M:%S", time.gmtime(time.time() - time_start))} TTTTTTTTT')
+    print(f'+++++++++++++ {path_meas[i]} +++++++++++++')
+    try:
+        meas, checked_transect, navigation_reference = open_measurement(path_meas[i], type_meas[i], apply_settings=True,
+                                                                        navigation_reference=navigation_reference_user,
+                                                                        checked_transect=checked_transect_user,
+                                                                        extrap_velocity=True, run_oursin=True)
+    except Exception:
+        meas = None
+
+    if meas is not None:
+        if all(deg == 0 for deg in meas.transects[meas.checked_transect_idx[0]].sensors.heading_deg.internal.data):
+            map_profile = None
+        else:
+            try:
+                map_profile = meas.map
+            except Exception:
+                map_profile = None
+
+        if map_profile is not None:
+            data['Parent'].append(name_parent[i])
+            data['Name'].append(name_meas[i])
+            data['Meas Q'].append(meas.mean_discharges(meas)['total_mean'])
+            data['MAP Q'].append(map_profile.total_discharge)
+            if meas.mean_discharges(meas)['total_mean'] != 0:
+                per_diff = (map_profile.total_discharge - meas.mean_discharges(meas)['total_mean']) / \
+                           meas.mean_discharges(meas)['total_mean']
+            else:
+                per_diff = np.nan
+            data['Q diff'].append(per_diff)
+            df = pd.DataFrame(data)
+            df.to_csv(path_results+'/data_map.csv', sep=';', encoding='utf-8')
+
+            # Save MAP Water Contour
+            vy = map_profile.secondary_velocity
+            quiver_label = "Secondary velocity"
+            data_quiver = {'x': map_profile.distance_cells_center,
+                           'z': map_profile.depth_cells_center,
+                           'vy': vy,
+                           'vz': map_profile.vertical_velocity,
+                           'scale': 0.1,
+                           'label': quiver_label}
+            bed_profiles = {'x': map_profile.acs_distance, 'depth': map_profile.depth_by_transect}
+
+            map_wt_contour_canvas = MplCanvas(width=15, height=3, dpi=240)
+            map_wt_contour_fig = WTContour(canvas=map_wt_contour_canvas)
+            map_wt_contour_fig.create(transect=map_profile,
+                                       units=units,
+                                       data_type='Primary velocity',
+                                       data_quiver=data_quiver,
+                                       bed_profiles=bed_profiles,
+                                       color_map='viridis',
+                                       x_axis_type="MAP")
+            map_wt_contour_fig.fig.subplots_adjust(left=0.08, bottom=0.2, right=1.05, top=0.97, wspace=0.02, hspace=0)
+
+            map_wt_contour_fig.fig.savefig(path_results + '\\MAP_Profile_' + name_meas[i] + '.png', dpi=300,
+                                           bbox_inches='tight')
+
+            # Save MAP ShipTrack
+            settings = meas.current_settings()
+            map_shiptrack_canvas = MplCanvas(width=4, height=3, dpi=80)
+            map_shiptrack_fig = Maptrack(canvas=map_shiptrack_canvas)
+            map_shiptrack_fig.create(map_data=map_profile, units=units, nav_ref=settings['NavRef'])
+            map_shiptrack_fig.fig.savefig(path_results + '\\MAP_Shiptrack_' + name_meas[i] + '.png', dpi=300,
+                                           bbox_inches='tight')
+
+df = pd.read_csv(path_results+'/data_map.csv', sep=';')
+df['Q diff'] = df['Q diff']*100
+np.median(df['Q diff'])
+np.quantile(df['Q diff'], 0.75)
+np.quantile(df['Q diff'], 0.25)
+
+import matplotlib.pyplot as plt
+
+markersize_set = 14
+elinewidth_set = 7
+widths_ge = 0.24
+widths_chau = 0.35
+linewidth_set = 3
+fontsize_choice = 24
+plt.rcParams.update({'font.size': fontsize_choice})
+plt.rc('legend', **{'fontsize': fontsize_choice - 1})
+plt.rc('axes', axisbelow=True)
+
+fig, ax = plt.subplots(1, 1, figsize=(20, 18),gridspec_kw={'hspace': 0.3, 'wspace': 0.0})
+boxplot = df.boxplot(column='Q diff', by='Parent', ax=ax, flierprops=dict(marker='.', markerfacecolor=u'#1f77b4',
+                     markersize=markersize_set, linewidth=linewidth_set, linestyle='none'),
+                     whiskerprops=dict(color=u'#1f77b4'), patch_artist=True, notch=False, return_type="dict")
+
+for box in boxplot[0]['boxes']:
+    box.set(color=u'#1f77b4', linewidth=linewidth_set)  # change outline color
+    box.set(facecolor='skyblue')  # change fill color
+    # box.set_linewidth(linewidth_set)
+
+for box in boxplot[0]['medians']:
+    box.set_color(color=u'#1f77b4')
+    box.set_linewidth(linewidth_set)
+ax.set_ylim(-10, 10)
+ax.set_xlabel('Data name', fontsize=fontsize_choice)
+ax.set_ylabel('QRevInt - MAP Q difference (%)', fontsize=fontsize_choice)
+ax.set_title("")
+fig.suptitle('')
+fig.savefig(path_results + '\\MAP_test.png', dpi=300, bbox_inches='tight')
+
+df_sort = df.sort_values('Q diff')
 
-if isinstance(path_meas, list):
-    path_parent = '\\'.join(path_meas[0].split('/')[:-3])
-else:
-    path_parent = '\\'.join(path_meas.split('/')[:-3])
 
-with open(path_cwd + '\\qrevint_22_06_22\\path_file.txt', 'w') as f:
-    f.write(path_parent)
+# =============================================================================
+# Open measurement
+# =============================================================================
+path_meas, type_meas, name_meas = select_file()
 
-# path_results : Indicates the path to save graphics
-path_results = path_parent + '\\Results'
-if not os.path.exists(path_results):
-    os.makedirs(path_results)
 
 # open ADCP measurement, apply QRevInt filters and user's setting
 meas, checked_transect, navigation_reference = open_measurement(path_meas, type_meas, apply_settings=True,
                                                                 navigation_reference=navigation_reference_user,
                                                                 checked_transect=checked_transect_user,
-                                                                extrap_velocity=True)
+                                                                extrap_velocity=True, run_oursin=True)
+
 
 # Optional : Apply new settings (navigation reference / checked transect) without opening meas again
-# meas, checked_transect, navigation_reference = new_settings(meas, navigation_reference_user, checked_transect_user, extrap_velocity=True)
+meas, checked_transect, navigation_reference = new_settings(meas, navigation_reference_user, checked_transect_user, extrap_velocity=True)
 
 # =============================================================================
 # Run MAP
 # =============================================================================
-from MAP_class import MAP
-average_profile = MAP()
-average_profile.populate_data(meas, node_horizontal_user, node_vertical_user, edge_constant=edge_constant,
-                   extrap_option=extrap_option, interp_option=interp_option, track_section=track_section,
-                   plot=plot, name_meas=name_meas, path_results=path_results)
-print(path_results)
-print(average_profile.total_discharge)
-print(meas.mean_discharges(meas)['total_mean'])
\ No newline at end of file
+from Classes.MAP import MAP
+map_profile = MAP()
+map_profile.populate_data(meas,
+                          node_horizontal_user,
+                          node_vertical_user,
+                          extrap_option=True,
+                          edges_option=True,
+                          interp_option=False,
+                          n_burn=None)