diff --git a/Ccs/.ipyloadcfg.py b/Ccs/.ipyloadcfg.py
index d4501c23e13f2904b4f0b30ecf7c5573aae6c1ae..61b437061d98f6647ec4114bb132399c822b5167 100644
--- a/Ccs/.ipyloadcfg.py
+++ b/Ccs/.ipyloadcfg.py
@@ -9,6 +9,8 @@ import dbus.service
 import logging
 import ccs_function_lib as cfl
 
+sys.path.append(cfl.cfg.get('paths', 'ccs'))
+
 # gi.require_version('Gtk', '3.0')
 
 # import confignator
diff --git a/Ccs/DBus_Basic.py b/Ccs/DBus_Basic.py
index cc8dd3b521be317ddabe8a7e6ce2f55f07c402cf..aa36a7f065fd24d99b1dfa9824160b76830df674 100644
--- a/Ccs/DBus_Basic.py
+++ b/Ccs/DBus_Basic.py
@@ -124,6 +124,10 @@ class MessageListener(dbus.service.Object):
             result = method_to_call(*args, **kwargs)
         except Exception as e:
             result = str(e)
+
+        if result is None:
+            return
+
         result = self.python_to_dbus(result, user_console=user_console)
         return result
 
diff --git a/Ccs/calibrations_SMILE.py b/Ccs/calibrations_SMILE.py
new file mode 100644
index 0000000000000000000000000000000000000000..62bab04c32b84a0d5aec7a82ebd2f677d0759b5f
--- /dev/null
+++ b/Ccs/calibrations_SMILE.py
@@ -0,0 +1,600 @@
+"""
+Calibration functions and utilities for raw/engineering conversions in SMILE
+
+Data from SMILE-IWF-PL-UM-147-d0-3_SXI_EBox_User_Manual (ID 5233)
+"""
+
+import os
+import numpy as np
+import scipy as sp
+
+# constants
+T_ZERO = 273.15
+
+# common ADC coefficients
+ADC_INPRNG = 7.34783  # V
+ADC_OFFSET = -1.69565  # V
+
+# FEE HK gains/offsets
+FEE_CCD2TsA_gain = 0.013772489
+FEE_CCD2TsA_offset = 542.131358
+FEE_CCD4TsB_gain = 0.013680992
+FEE_CCD4TsB_offset = 525.103894
+
+
+class Dpu:
+
+    _unit = "V"
+
+    ADC_P3V9 = "HK_ADC_P3V9"
+    ADC_P3V3 = "HK_ADC_P3V3"
+    ADC_P3V3_LVDS = "HK_ADC_P3V3_LVDS"
+    ADC_P2V5 = "HK_ADC_P2V5"
+    ADC_P1V8 = "HK_ADC_P1V8"
+    ADC_P1V2 = "HK_ADC_P1V2"
+    ADC_REF = "HK_ADC_REF"
+
+
+K_DPU = {
+    Dpu.ADC_P3V9: 2,
+    Dpu.ADC_P3V3: 1,
+    Dpu.ADC_P3V3_LVDS: 1,
+    Dpu.ADC_P2V5: 1,
+    Dpu.ADC_P1V8: 1,
+    Dpu.ADC_P1V2: 1,
+    Dpu.ADC_REF: 1
+}
+
+
+class Temp:
+
+    _unit = "degC"
+
+    ADC_TEMP1 = "HK_ADC_TEMP1"
+    ADC_TEMP_FEE = "HK_ADC_TEMP_FEE"
+    ADC_TEMP_CCD = "HK_ADC_TEMP_CCD"
+    ADC_PSU_TEMP = "HK_ADC_PSU_TEMP"
+
+
+# Signal specific coefficients
+class V_T0:
+    CCD = 2.5650
+    TEMP1 = 2.5770
+    FEE = 1.2800
+
+
+class K_T:
+    CCD = 0.00385
+    TEMP1 = 0.00385
+    FEE = 0.00385
+
+
+# interpolation table for nominal operation CCD temperature
+# (degC, ADC_V, ADU_dec, ADU_hex)
+CCD_TEMP_TABLE = [
+    (-140.0, 1.125, 6288, 0x1890),
+    (-135.0, 1.178, 6407, 0x1906),
+    (-130.0, 1.231, 6524, 0x197C),
+    (-125.0, 1.283, 6642, 0x19F1),
+    (-120.0, 1.336, 6759, 0x1A66),
+    (-115.0, 1.388, 6876, 0x1ADB),
+    (-110.0, 1.440, 6992, 0x1B50),
+    (-105.0, 1.493, 7109, 0x1BC4),
+    (-100.0, 1.545, 7225, 0x1C38),
+    (-95.0, 1.596, 7340, 0x1CAC),
+    (-90.0, 1.648, 7456, 0x1D1F),
+    (-85.0, 1.700, 7571, 0x1D92),
+    (-80.0, 1.751, 7686, 0x1E05),
+    (-75.0, 1.803, 7800, 0x1E78),
+    (-70.0, 1.854, 7915, 0x1EEA),
+    (-65.0, 1.905, 8029, 0x1F5D),
+    (-60.0, 1.957, 8143, 0x1FCF),
+    (-55.0, 2.008, 8257, 0x2040),
+    (-50.0, 2.059, 8371, 0x20B2),
+    (-45.0, 2.109, 8484, 0x2123),
+    (-40.0, 2.160, 8597, 0x2195),
+    (-35.0, 2.211, 8710, 0x2206),
+    (-30.0, 2.261, 8823, 0x2276),
+    (-25.0, 2.312, 8936, 0x22E7),
+    (-20.0, 2.362, 9048, 0x2358)
+]
+
+# interpolation table for PSU temperature
+# (degC, ADC_V, ADU_dec, ADU_hex)
+PSU_TEMP = [
+    (-50.0, 3.237, 10998, 0x2AF6),
+    (-40.0, 3.187, 10887, 0x2A86),
+    (-20.0, 2.960, 10380, 0x288C),
+    (0.0, 2.487, 9326, 0x246D),
+    (20.0, 1.816, 7830, 0x1E95),
+    (25.0, 1.643, 7444, 0x1D13),
+    (40.0, 1.169, 6387, 0x18F3),
+    (60.0, 0.703, 5348, 0x14E4),
+    (80.0, 0.417, 4710, 0x1266),
+    (90.0, 0.323, 4501, 0x1194),
+    (100.0, 0.252, 4343, 0x10F6)
+]
+
+
+class Psu:
+
+    _unit = "A"
+
+    ADC_I_FEE_ANA = "HK_ADC_I_FEE_ANA"
+    ADC_I_FEE_DIG = "HK_ADC_I_FEE_DIG"
+    ADC_I_DPU = "HK_ADC_I_DPU"
+    ADC_I_RSE = "HK_ADC_I_RSE"
+    ADC_I_HEATER = "HK_ADC_I_HEATER"
+
+
+K_PSU = {
+    Psu.ADC_I_FEE_ANA: 0.3058,
+    Psu.ADC_I_FEE_DIG: 0.1528,
+    Psu.ADC_I_DPU: 0.4913,
+    Psu.ADC_I_RSE: 0.844,
+    Psu.ADC_I_HEATER: 0.4349
+}
+
+PSU_OFFSET = {
+    Psu.ADC_I_FEE_ANA: 0,
+    Psu.ADC_I_FEE_DIG: 0,
+    Psu.ADC_I_DPU: 0,
+    Psu.ADC_I_RSE: 0,
+    Psu.ADC_I_HEATER: -0.3701
+}
+
+
+class Rse:
+
+    _unit = "degC"
+
+    RSE_MOTOR_TEMP = "HK_RSE_MOTOR_TEMP"
+    RSE_ELEC_TEMP = "HK_RSE_ELEC_TEMP"
+
+
+# fit polynomial of degree POLY_DEG through CCD ADU-degC relation (operational range)
+_ccd_temp_adu_array = np.array(CCD_TEMP_TABLE).T  # (degC, ADC_V, ADU_dec, ADU_hex)
+POLY_DEG = 4
+_ccd_temp_fit_adu = np.polynomial.polynomial.Polynomial.fit(_ccd_temp_adu_array[2], _ccd_temp_adu_array[0],
+                                                            POLY_DEG).convert()
+_ccd_temp_fit_adu_inv = np.polynomial.polynomial.Polynomial.fit(_ccd_temp_adu_array[0], _ccd_temp_adu_array[2],
+                                                                POLY_DEG).convert()
+
+# cubic-spline interpolation of PSU ADU-degC relation (nominal values)
+_psu_temp_adu_array = np.array(PSU_TEMP).T  # (degC, ADC_V, ADU_dec, ADU_hex)
+_psu_temp_interp = sp.interpolate.interp1d(_psu_temp_adu_array[2], _psu_temp_adu_array[0],
+                                           kind='cubic', fill_value='extrapolate')
+_psu_temp_interp_inv = sp.interpolate.interp1d(_psu_temp_adu_array[0], _psu_temp_adu_array[2], kind='cubic',
+                                               fill_value='extrapolate')
+
+
+def t_ccd_adu_to_deg_oper(adu, warn=True):
+    if not ((_ccd_temp_adu_array[2].min() <= adu) & (adu <= _ccd_temp_adu_array[2].max())).all() and warn:
+        print('WARNING! Value(s) outside operational range ({:.0f}-{:.0f})!'.format(_ccd_temp_adu_array[2].min(),
+                                                                                    _ccd_temp_adu_array[2].max()))
+    return _ccd_temp_fit_adu(adu)
+
+
+def t_ccd_deg_to_adu_oper(t, warn=True):
+    if not ((_ccd_temp_adu_array[0].min() <= t) & (t <= _ccd_temp_adu_array[0].max())).all() and warn:
+        print('WARNING! Value(s) outside operational range ({} - {})!'.format(_ccd_temp_adu_array[0].min(),
+                                                                              _ccd_temp_adu_array[0].max()))
+    return np.rint(_ccd_temp_fit_adu_inv(t)).astype(int)
+
+
+def t_ccd_adu_to_deg_nonoper(adu):
+    return (adu * ADC_INPRNG / (2 ** 14 - 1) + ADC_OFFSET - V_T0.CCD) / (V_T0.CCD * K_T.CCD)
+
+
+def t_ccd_deg_to_adu_nonoper(t):
+    return np.rint(((t * V_T0.CCD * K_T.CCD - ADC_OFFSET + V_T0.CCD) * (2 ** 14 - 1)) / ADC_INPRNG).astype(int)
+
+
+def t_ccd_adu_to_deg(adu):
+    return np.where(adu <= _ccd_temp_adu_array[2].max(), t_ccd_adu_to_deg_oper(adu, warn=False), t_ccd_adu_to_deg_nonoper(adu))
+
+
+def t_ccd_deg_to_adu(t):
+    return np.where(t <= _ccd_temp_adu_array[0].max(), t_ccd_deg_to_adu_oper(t, warn=False), t_ccd_deg_to_adu_nonoper(t))
+
+
+def t_temp1_adu_to_deg(adu):
+    return (adu * ADC_INPRNG / (2 ** 14 - 1) + ADC_OFFSET - V_T0.TEMP1) / (V_T0.TEMP1 * K_T.TEMP1)
+
+
+def t_temp1_deg_to_adu(t):
+    return np.rint(((t * V_T0.TEMP1 * K_T.TEMP1 - ADC_OFFSET + V_T0.TEMP1) * (2 ** 14 - 1)) / ADC_INPRNG).astype(int)
+
+
+def t_fee_adu_to_deg(adu):
+    return (adu * ADC_INPRNG / (2 ** 14 - 1) + ADC_OFFSET - V_T0.FEE) / (V_T0.FEE * K_T.FEE)
+
+
+def t_fee_deg_to_adu(t):
+    return np.rint(((t * V_T0.FEE * K_T.FEE - ADC_OFFSET + V_T0.FEE) * (2 ** 14 - 1)) / ADC_INPRNG).astype(int)
+
+
+def t_rse_adu_to_deg(adu):
+    return (3.908 - np.sqrt(17.59246 - (76.56 / (4096 / adu - 1)))) / 0.00116
+
+
+def t_rse_deg_to_adu(t):
+    return np.rint(4096 / (76.56 / (17.59246 - (3.908 - 0.00116 * t) ** 2) + 1)).astype(int)
+
+
+def t_psu_adu_to_deg(adu):
+    return _psu_temp_interp(adu)
+
+
+def t_psu_deg_to_adu(t):
+    return _psu_temp_interp_inv(t)
+
+
+def t_adu_to_deg(adu, signal):
+    if signal == Temp.ADC_TEMP_CCD:
+        t = t_ccd_adu_to_deg(adu)
+    elif signal == Temp.ADC_TEMP1:
+        t = t_temp1_adu_to_deg(adu)
+    elif signal == Temp.ADC_TEMP_FEE:
+        t = t_fee_adu_to_deg(adu)
+    elif signal == Temp.ADC_PSU_TEMP:
+        t = t_psu_adu_to_deg(adu)
+    elif signal in (Rse.RSE_MOTOR_TEMP, Rse.RSE_ELEC_TEMP):
+        t = t_rse_adu_to_deg(adu)
+    else:
+        raise ValueError("Unknown signal '{}'".format(signal))
+
+    return t
+
+
+def t_deg_to_adu(t, signal):
+    if signal == Temp.ADC_TEMP_CCD:
+        adu = t_ccd_deg_to_adu(t)
+    elif signal == Temp.ADC_TEMP1:
+        adu = t_temp1_deg_to_adu(t)
+    elif signal == Temp.ADC_TEMP_FEE:
+        adu = t_fee_deg_to_adu(t)
+    elif signal == Temp.ADC_PSU_TEMP:
+        adu = t_psu_deg_to_adu(t)
+    elif signal in (Rse.RSE_MOTOR_TEMP, Rse.RSE_ELEC_TEMP):
+        adu = t_rse_deg_to_adu(t)
+    else:
+        raise ValueError("Unknown signal '{}'".format(signal))
+
+    return adu
+
+
+def u_dpu_adu_to_volt(adu, signal):
+    return ((adu * ADC_INPRNG) / (2 ** 14 - 1) + ADC_OFFSET) * K_DPU[signal]
+
+
+def u_dpu_volt_to_adu(u, signal):
+    return np.rint(((u / K_DPU[signal] - ADC_OFFSET) * (2 ** 14 - 1)) / ADC_INPRNG).astype(int)
+
+
+def i_psu_adu_to_amp(adu, signal):
+    return ((adu * ADC_INPRNG) / (2 ** 14 - 1) + ADC_OFFSET) * K_PSU[signal] + PSU_OFFSET[signal]
+
+
+def i_psu_amp_to_adu(i, signal):
+    return np.rint((((i - PSU_OFFSET[signal]) / K_PSU[signal] - ADC_OFFSET) * (2 ** 14 - 1)) / ADC_INPRNG).astype(int)
+
+
+def calibrate(adu, signal):
+    """
+
+    :param adu:
+    :param signal:
+    :return:
+    """
+
+    if signal in SIGNAL_IASW_DBS:
+        signal = SIGNAL_IASW_DBS[signal]
+
+    if signal in Dpu.__dict__.values():
+        x = u_dpu_adu_to_volt(adu, signal)
+    elif signal in Temp.__dict__.values() or signal in Rse.__dict__.values():
+        x = t_adu_to_deg(adu, signal)
+    elif signal in Psu.__dict__.values():
+        x = i_psu_adu_to_amp(adu, signal)
+    else:
+        raise ValueError("Unknown signal '{}'".format(signal))
+
+    return x
+
+
+def decalibrate(x, signal):
+    """
+
+    :param x:
+    :param signal:
+    :return:
+    """
+
+    if signal in SIGNAL_IASW_DBS:
+        signal = SIGNAL_IASW_DBS[signal]
+
+    if signal in Dpu.__dict__.values():
+        adu = u_dpu_volt_to_adu(x, signal)
+    elif signal in Temp.__dict__.values() or signal in Rse.__dict__.values():
+        adu = t_deg_to_adu(x, signal)
+    elif signal in Psu.__dict__.values():
+        adu = i_psu_amp_to_adu(x, signal)
+    else:
+        raise ValueError("Unknown signal '{}'".format(signal))
+
+    return adu
+
+
+class CalibrationTables:
+    # default ADC limits
+    BOUND_L = 0
+    BOUND_U = 0x3FFE
+
+    BOUND_RSE_L = 0x01
+    BOUND_RSE_U = 0xCD
+
+    def __init__(self):
+
+        # temperatures
+        # x = np.linspace(self.BOUND_L, self.BOUND_U, 60, dtype=int)
+        self.temperature = {}
+        for sig in vars(Temp):
+            # CCD TEMP
+            if sig == 'ADC_TEMP_CCD':
+                label = getattr(Temp, sig)
+                lmts = getattr(Limits, sig)
+                x = np.linspace(6000, 11700, 60, dtype=int)
+                self.temperature[label] = np.array([x, t_adu_to_deg(x, label)])
+            # PSU TEMP
+            elif sig == 'ADC_PSU_TEMP':
+                label = getattr(Temp, sig)
+                lmts = getattr(Limits, sig)
+                x = np.linspace(int(lmts[0]*0.9), 11650, 50, dtype=int)
+                self.temperature[label] = np.array([x, t_adu_to_deg(x, label)])
+            elif sig.startswith('ADC'):
+                label = getattr(Temp, sig)
+                lmts = getattr(Limits, sig)
+                x = np.linspace(int(lmts[0]*0.9), int(lmts[-1]*1.1), 50, dtype=int)
+                self.temperature[label] = np.array([x, t_adu_to_deg(x, label)])
+
+        x = np.linspace(self.BOUND_RSE_L, self.BOUND_RSE_U, 50, dtype=int)
+        for sig in vars(Rse):
+            if sig.startswith('RSE'):
+                label = getattr(Rse, sig)
+                self.temperature[label] = np.array([x, t_adu_to_deg(x, label)])
+
+        x = np.linspace(self.BOUND_L, self.BOUND_U, 2, dtype=int)  # two points suffice for linear voltage and current calibrations
+        # voltages
+        self.voltage = {}
+        for sig in vars(Dpu):
+            if sig.startswith('ADC'):
+                label = getattr(Dpu, sig)
+                self.voltage[label] = np.array([x, u_dpu_adu_to_volt(x, label)])
+
+        # currents
+        self.current = {}
+        for sig in vars(Psu):
+            if sig.startswith('ADC'):
+                label = getattr(Psu, sig)
+                self.current[label] = np.array([x, i_psu_adu_to_amp(x, label)])
+
+    def write_to_files(self, path):
+
+        for k in self.temperature:
+            np.savetxt(os.path.join(path, k + '.dat'), self.temperature[k].T, header=k, fmt=('%5d', '%6.1f'))
+
+        for k in self.voltage:
+            np.savetxt(os.path.join(path, k + '.dat'), self.voltage[k].T, header=k, fmt=('%5d', '%6.3f'))
+
+        for k in self.current:
+            np.savetxt(os.path.join(path, k + '.dat'), self.current[k].T, header=k, fmt=('%5d', '%6.3f'))
+
+        print("Calibration tables written to {}".format(path))
+
+    def _plot(self, signal, xmin=BOUND_L, xmax=BOUND_U):
+
+        if 'plt' not in globals():
+            raise ModuleNotFoundError("This only works in stand-alone mode")
+
+        sig = signal[3:]
+
+        if sig in vars(Dpu):
+            xy = self.voltage[signal]
+            ylabel = 'Voltage [V]'
+        elif sig in vars(Temp):
+            xy = self.temperature[signal]
+            ylabel = 'Temperature [°C]'
+        elif sig in vars(Psu):
+            xy = self.current[signal]
+            ylabel = 'Current [A]'
+        else:
+            raise ValueError("Unknown signal '{}'".format(sig))
+
+        xref = np.linspace(xmin, xmax, 1000)
+        yref = calibrate(xref, signal)
+
+        limits = np.array((np.array(getattr(Limits, sig)), calibrate(np.array(getattr(Limits, sig)), signal))).T
+        print(limits)
+        fl, wl, wu, fu = limits
+        plt.axvspan(xmin, fl[0], alpha=0.25, color='red')
+        plt.axvspan(fl[0], wl[0], alpha=0.5, color='orange')
+        plt.axvspan(wu[0], fu[0], alpha=0.5, color='orange')
+        plt.axvspan(fu[0], xmax, alpha=0.25, color='red')
+
+        for i in limits:
+            plt.axhline(i[1], ls=':', color='grey')
+
+        plt.plot(xref, yref, color='grey', lw=0.5)
+        plt.plot(*xy, 'k.', label=signal, ms=4)
+        # plt.legend()
+        plt.xlabel('ADU')
+        plt.ylabel(ylabel)
+        plt.title(signal)
+        plt.grid(True)
+        plt.show()
+
+
+class Limits:
+    # raw operational limits (FAIL_L, WARN_L, WARN_U, FAIL_U)
+    ADC_P3V9 = (0x1D8D, 0x1E67, 0x2119, 0x21F3)
+    ADC_P3V3 = (0x27A2, 0x2912, 0x2DF2, 0x2F62)
+    ADC_P3V3_LVDS = (0x27A2, 0x2912, 0x2DF2, 0x2F62)
+    ADC_P2V5 = (0x215D, 0x2274, 0x26A1, 0x27B8)
+    ADC_P1V8 = (0x1BE0, 0x1CA9, 0x203A, 0x2103)
+    ADC_P1V2 = (0x172C, 0x17B2, 0x1ABE, 0x1B43)
+    ADC_REF = (0x215D, 0x2274, 0x26A1, 0x27B8)
+    ADC_TEMP1 = (0x210F, 0x2259, 0x2B37, 0x2C12)
+    ADC_TEMP_FEE = (0x17EA, 0x188E, 0x1CFD, 0x1D6B)
+    ADC_TEMP_CCD = (0x1968, 0x19DD, 0x1D20, 0x1D93)
+    ADC_I_FEE_ANA = (0xDC4, 0xDC4, 0x1D70, 0x1ECE)
+    ADC_I_FEE_DIG = (0xDC4, 0xDC4, 0x20FB, 0x22B4)
+    ADC_I_DPU = (0xDC4, 0xDC4, 0x20B7, 0x2269)
+    ADC_I_RSE = (0xDC4, 0xDC4, 0x1EA8, 0x2025)
+    ADC_I_HEATER = (0x152E, 0x152E, 0x23B2, 0x24F2)
+    ADC_PSU_TEMP = (0x12A5, 0x13E4, 0x298C, 0x2B08)
+
+    # raw upper RSE limits
+    RSE_MOTOR_TEMP = 0x96
+    RSE_ELEC_TEMP = 0x96
+
+    # raw ambient CCD limits
+    ADC_TEMP_CCD_AMB = (0x1968, 0x19DD, 0x29DB, 0x2A49)
+
+
+class LimitTables:
+
+    def __init__(self):
+
+        # temperatures
+        self.temperature = {}
+        for sig in vars(Temp):
+            if sig.startswith('ADC'):
+                label = getattr(Temp, sig)
+                adu_limits = np.array(getattr(Limits, sig))
+                self.temperature[label] = np.array([adu_limits, t_adu_to_deg(adu_limits, label)])
+
+        for sig in vars(Rse):
+            if sig.startswith('RSE'):
+                label = getattr(Rse, sig)
+                adu_limits = np.array(getattr(Limits, sig))
+                self.temperature[label] = np.array([adu_limits, t_adu_to_deg(adu_limits, label)])
+
+        # voltages
+        self.voltage = {}
+        for sig in vars(Dpu):
+            if sig.startswith('ADC'):
+                label = getattr(Dpu, sig)
+                adu_limits = np.array(getattr(Limits, sig))
+                self.voltage[label] = np.array([adu_limits, u_dpu_adu_to_volt(adu_limits, label)])
+
+        # currents
+        self.current = {}
+        for sig in vars(Psu):
+            if sig.startswith('ADC'):
+                label = getattr(Psu, sig)
+                adu_limits = np.array(getattr(Limits, sig))
+                self.current[label] = np.array([adu_limits, i_psu_adu_to_amp(adu_limits, label)])
+
+
+# lookup table for DBS vs IASW naming
+SIGNAL_IASW_DBS = {
+    "AdcP3V9": Dpu.ADC_P3V9,
+    "AdcP3V3": Dpu.ADC_P3V3,
+    "AdcP3V3LVDS": Dpu.ADC_P3V3_LVDS,
+    "AdcP2V5": Dpu.ADC_P2V5,
+    "AdcP1V8": Dpu.ADC_P1V8,
+    "AdcP1V2": Dpu.ADC_P1V2,
+    "AdcRef": Dpu.ADC_REF,
+    "AdcTemp1": Temp.ADC_TEMP1,
+    "AdcTempFee": Temp.ADC_TEMP_FEE,
+    "AdcTempCcd": Temp.ADC_TEMP_CCD,
+    "AdcPsuTemp": Temp.ADC_PSU_TEMP,
+    "AdcIFeeAna": Psu.ADC_I_FEE_ANA,
+    "AdcIFeeDig": Psu.ADC_I_FEE_DIG,
+    "AdcIDpu": Psu.ADC_I_DPU,
+    "AdcIRse": Psu.ADC_I_RSE,
+    "AdcIHeater": Psu.ADC_I_HEATER,
+    "RseMotorTemp": Rse.RSE_MOTOR_TEMP,
+    "RseElecTemp": Rse.RSE_ELEC_TEMP
+}
+
+SIGNAL_DBS_IASW = {SIGNAL_IASW_DBS[k]: k for k in SIGNAL_IASW_DBS}
+
+
+def cal_pt1000(temp):
+    return cal_ptx(temp, 1000)
+
+
+def cal_pt2000(temp):
+    return cal_ptx(temp, 2000)
+
+
+def cal_ptx(temp, R0):
+    """
+    Standard DIN EN 60751 PTX transfer curve (-200 - 850°C)
+
+    :param temp: temperature in °C
+    :return: resistance in Ohm
+    """
+    A = 3.9083e-3
+    B = -5.775e-7
+    C = -4.183e-12
+
+    def subzero():
+        return R0 * (1 + A*temp + B*temp**2 + C*(temp - 100)*temp**3)
+
+    def abovezero():
+        return R0 * (1 + A*temp + B*temp**2)
+
+    if (np.array(temp) < -200).any() or (np.array(temp) > 850).any():
+        print("WARNING: Value(s) outside calibrated range (-200 - 850°C)!")
+
+    return np.where(temp > 0, abovezero(), subzero())
+
+
+_ptx = np.arange(-200, 851)
+_pty = cal_pt1000(_ptx)
+_pt1000_curve_inv = sp.interpolate.interp1d(_pty, _ptx, kind='cubic', fill_value='extrapolate')  # inverse PT1000 curve for Ohm to °C conversion
+
+
+def t_ccd_fee_adu_to_deg(adu, ccd):
+    """
+    For CCD temperature reported in FEE HK. Uses PT1000!
+
+    :param adu:
+    :param ccd:
+    :return:
+    """
+    if ccd == 2:
+        return _pt1000_curve_inv(adu * FEE_CCD2TsA_gain + FEE_CCD2TsA_offset)
+    elif ccd == 4:
+        return _pt1000_curve_inv(adu * FEE_CCD4TsB_gain + FEE_CCD4TsB_offset)
+    else:
+        raise ValueError("CCD must be either 2 or 4!")
+
+
+def t_ccd_fee_deg_to_adu(t, ccd):
+    """
+    For CCD temperature reported in FEE HK
+
+    :param t:
+    :param ccd:
+    :return:
+    """
+    if ccd == 2:
+        return np.rint((cal_pt1000(t) - FEE_CCD2TsA_offset) / FEE_CCD2TsA_gain).astype(int)
+    elif ccd == 4:
+        return np.rint((cal_pt1000(t) - FEE_CCD4TsB_offset) / FEE_CCD4TsB_gain).astype(int)
+    else:
+        raise ValueError("CCD must be either 2 or 4!")
+
+
+if __name__ == '__main__':
+
+    import matplotlib.pyplot as plt
+
+    ct = CalibrationTables()
+    ct._plot(Temp.ADC_TEMP_CCD)
+    # ct.write_to_files('/home/marko/space/CCS/calibrations')
+    lmt = LimitTables()
diff --git a/Ccs/ccs.py b/Ccs/ccs.py
index 3f2bcb6b81a98931f81084593281f7a98cc7898a..9c03ba4b8df2b73a9c4481ad1bcdd835ec79ed85 100755
--- a/Ccs/ccs.py
+++ b/Ccs/ccs.py
@@ -33,7 +33,7 @@ def run():
         for fname in files_to_open:
             win.open_file(fname)
     else:
-        win.open_file(os.path.join(confignator.get_option('paths', 'ccs'), 'getting_started.py'))
+        win.open_file(os.path.join(confignator.get_option('paths', 'ccs'), 'scripts/connection_setup.py'))
 
     bus_name = cfg.get('ccs-dbus_names', 'editor')
     DBus_Basic.MessageListener(win, bus_name, *sys.argv)
diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py
index 8754bb285b1a83fa962890b8e8ca4d009f405815..9536e4c41a9fb1b01cbc11e23847b4fa72ff1cdc 100644
--- a/Ccs/ccs_function_lib.py
+++ b/Ccs/ccs_function_lib.py
@@ -1,3 +1,7 @@
+"""
+Utility functions for packet handling in CCS
+"""
+
 import gi
 gi.require_version('Gtk', '3.0')
 # gi.require_version('Notify', '0.7')
@@ -16,6 +20,7 @@ import time
 import dbus
 import socket
 import os
+from pathlib import Path
 import glob
 import numpy as np
 import logging.handlers
@@ -31,6 +36,8 @@ import importlib
 cfg = confignator.get_config(check_interpolation=False)
 
 PCPREFIX = 'packet_config_'
+CFG_SECT_PLOT_PARAMETERS = 'ccs-plot_parameters'
+CFG_SECT_DECODE_PARAMETERS = 'ccs-decode_parameters'
 
 # Set up logger
 CFL_LOGGER_NAME = 'cfl'
@@ -52,48 +59,68 @@ except SQLOperationalError as err:
     logger.critical(err)
     sys.exit()
 
+# MIB caches to reduce SQL load
+_pcf_cache = {}
+_cap_cache = {}
+_txp_cache = {}
+
 project = cfg.get('ccs-database', 'project')
 pc = importlib.import_module(PCPREFIX + str(project).upper())
 
-PUS_VERSION, TMHeader, TCHeader, PHeader, TM_HEADER_LEN, TC_HEADER_LEN, P_HEADER_LEN, PEC_LEN, MAX_PKT_LEN, timepack, \
-    timecal, calc_timestamp, CUC_OFFSET, CUC_EPOCH, crc, PLM_PKT_PREFIX_TC_SEND, PLM_PKT_SUFFIX, FMT_TYPE_PARAM = \
-    [pc.PUS_VERSION, pc.TMHeader, pc.TCHeader, pc.PHeader,
-     pc.TM_HEADER_LEN, pc.TC_HEADER_LEN, pc.P_HEADER_LEN, pc.PEC_LEN,
-     pc.MAX_PKT_LEN, pc.timepack, pc.timecal, pc.calc_timestamp,
-     pc.CUC_OFFSET, pc.CUC_EPOCH, pc.puscrc, pc.PLM_PKT_PREFIX_TC_SEND, pc.PLM_PKT_SUFFIX, pc.FMT_TYPE_PARAM]
+# project specific parameters, must be present in all packet_config_* files
+try:
+    PUS_VERSION, TMHeader, TCHeader, PHeader, TM_HEADER_LEN, TC_HEADER_LEN, P_HEADER_LEN, PEC_LEN, MAX_PKT_LEN, timepack, \
+        timecal, calc_timestamp, CUC_OFFSET, CUC_EPOCH, crc, PLM_PKT_PREFIX_TC_SEND, PLM_PKT_SUFFIX, FMT_TYPE_PARAM = \
+        [pc.PUS_VERSION, pc.TMHeader, pc.TCHeader, pc.PHeader,
+         pc.TM_HEADER_LEN, pc.TC_HEADER_LEN, pc.P_HEADER_LEN, pc.PEC_LEN,
+         pc.MAX_PKT_LEN, pc.timepack, pc.timecal, pc.calc_timestamp,
+         pc.CUC_OFFSET, pc.CUC_EPOCH, pc.puscrc, pc.PLM_PKT_PREFIX_TC_SEND, pc.PLM_PKT_SUFFIX, pc.FMT_TYPE_PARAM]
 
-SREC_MAX_BYTES_PER_LINE = 250
+    s13_unpack_data_header = pc.s13_unpack_data_header
+    SPW_PROTOCOL_IDS_R = {pc.SPW_PROTOCOL_IDS[key]: key for key in pc.SPW_PROTOCOL_IDS}
+
+    tmtc = pc.TMTC
+    tsync_flag = pc.TSYNC_FLAG
+
+except AttributeError as err:
+    logger.critical(err)
+    raise err
 
+SREC_MAX_BYTES_PER_LINE = 250
+SEG_HEADER_FMT = '>III'
+SEG_HEADER_LEN = struct.calcsize(SEG_HEADER_FMT)
+SEG_SPARE_LEN = 2
+SEG_CRC_LEN = 2
 
 pid_offset = int(cfg.get('ccs-misc', 'pid_offset'))
 
 fmtlist = {'INT8': 'b', 'UINT8': 'B', 'INT16': 'h', 'UINT16': 'H', 'INT32': 'i', 'UINT32': 'I', 'INT64': 'q',
-           'UINT64': 'Q', 'FLOAT': 'f', 'DOUBLE': 'd', 'INT24': 'i24', 'UINT24': 'I24', 'bit*': 'bit'}
+           'UINT64': 'Q', 'FLOAT': 'f', 'DOUBLE': 'd', 'INT24': 'i24', 'UINT24': 'I24', 'uint*': 'uint',
+           'ascii*': 'ascii', 'oct*': 'oct'}
 
-personal_fmtlist = ['uint', 'ascii', 'oct']
+personal_fmtlist = []
 
 fmtlengthlist = {'b': 1, 'B': 1, 'h': 2, 'H': 2, 'i': 4, 'I': 4, 'q': 8,
                  'Q': 8, 'f': 4, 'd': 8, 'i24': 3, 'I24': 3}
 
-# get format and offset of HK SID
-SID_FORMAT = {1: '>B', 2: '>H', 4: '>I'}
-_sidfmt = scoped_session_idb.execute('SELECT PIC_PI1_OFF,PIC_PI1_WID FROM mib_smile_sxi.pic where PIC_TYPE=3 and PIC_STYPE=25').fetchall()
-if len(_sidfmt) != 0:
-    SID_OFFSET, SID_BITSIZE = _sidfmt[0]
-    SID_SIZE = int(SID_BITSIZE / 8)
-else:
-    SID_SIZE = 2
-    SID_OFFSET = TM_HEADER_LEN
-    logger.warning('HK SID definition not found in MIB, using default: OFFSET={}, SIZE={}!'.format(SID_OFFSET, SID_SIZE))
+# get format and offset of SIDs/discriminants
+SID_FORMAT = {8: '>B', 16: '>H', 32: '>I'}
+try:
+    _sidfmt = scoped_session_idb.execute('SELECT PIC_TYPE,PIC_STYPE,PIC_APID,PIC_PI1_OFF,PIC_PI1_WID FROM pic').fetchall()
+    if len(_sidfmt) != 0:
+        SID_LUT = {tuple(k[:3]): tuple(k[3:]) for k in _sidfmt}
+    else:
+        SID_LUT = {}
+        logger.warning('SID definitions not found in MIB!')
+except SQLOperationalError:
+    _sidfmt = scoped_session_idb.execute('SELECT PIC_TYPE,PIC_STYPE,PIC_PI1_OFF,PIC_PI1_WID FROM pic').fetchall()
+    SID_LUT = {tuple([*k[:2], None]): tuple(k[2:]) for k in _sidfmt}
+    logger.warning('MIB structure not fully compatible, no APID in PIC for SID format definition.')
+
 
 # get names of TC parameters that carry data pool IDs, i.e. have CPC_CATEG=P
 DATA_POOL_ID_PARAMETERS = [par[0] for par in scoped_session_idb.execute('SELECT cpc_pname FROM cpc WHERE cpc_categ="P"').fetchall()]
 
-# create local look-up tables for data pool items from MIB
-_pid_query = scoped_session_idb.execute('SELECT pcf_pid, pcf_descr FROM pcf WHERE pcf_pid IS NOT NULL').fetchall()
-DP_IDS_TO_ITEMS = {int(k[0]): k[1] for k in _pid_query}
-DP_ITEMS_TO_IDS = {k[1]: int(k[0]) for k in _pid_query}
-
 
 counters = {}  # keeps track of PUS TC packet sequence counters (one per APID)
 
@@ -102,7 +129,11 @@ if cfg.has_section('ccs-user_defined_packets'):
 else:
     user_tm_decoders = {}
 
-# Notify.init('cfl')
+
+def _reset_mib_caches():
+    _pcf_cache.clear()
+    _cap_cache.clear()
+    _txp_cache.clear()
 
 
 def _add_log_socket_handler():
@@ -124,23 +155,35 @@ def _remove_log_socket_handlers():
 
 
 def set_scoped_session_idb_version(idb_version=None):
+    """
+
+    :param idb_version:
+    """
     global scoped_session_idb
     scoped_session_idb.close()
     scoped_session_idb = scoped_session_maker('idb', idb_version=idb_version)
+
+    _reset_mib_caches()
+
     logger.info('MIB SQL reconnect ({})'.format(idb_version))
 
 
 def get_scoped_session_storage():
+    """
+
+    :return:
+    """
     return scoped_session_maker('storage')
 
 
 def start_app(file_path, wd, *args, console=False, **kwargs):
     """
-    @param file_path:
-    @param wd:
-    @param args:
-    @param console:
-    @param kwargs:
+    
+    :param file_path:
+    :param wd:
+    :param args:
+    :param console:
+    :param kwargs:
     """
     # gui argument only used for poolmanager since it does not have an automatic gui
     if not os.path.isfile(file_path):
@@ -167,7 +210,8 @@ def start_app(file_path, wd, *args, console=False, **kwargs):
 def start_pv(pool_name=None, console=False, **kwargs):
     """
     Gets the path of the Startfile for the Poolviewer and executes it
-    :param console: If False will be run in Console, otherwise will be run in seperate Environment
+    
+    :param console: If False will be run in Console, otherwise will be run in separate Environment
     :return:
     """
 
@@ -183,7 +227,8 @@ def start_pv(pool_name=None, console=False, **kwargs):
 def start_pmgr(gui=True, console=False, **kwargs):
     """
     Gets the path of the Startfile for the Poolmanager and executes it
-    :param console: If False will be run in Console, otherwise will be run in seperate Environment
+    
+    :param console: If False will be run in Console, otherwise will be run in separate Environment
     :return:
     """
 
@@ -201,7 +246,8 @@ def start_pmgr(gui=True, console=False, **kwargs):
 def start_editor(*files, console=False, **kwargs):
     """
     Gets the path of the Startfile for the Editor and executes it
-    :param console: If False will be run in Console, otherwise will be run in seperate Environment
+    
+    :param console: If False will be run in Console, otherwise will be run in separate Environment
     :return:
     """
 
@@ -216,7 +262,8 @@ def start_editor(*files, console=False, **kwargs):
 def start_monitor(pool_name=None, parameter_set=None, console=False, **kwargs):
     """
     Gets the path of the Startfile for the Monitor and executes it
-    :param console: If False will be run in Console, otherwise will be run in seperate Environment
+    
+    :param console: If False will be run in Console, otherwise will be run in separate Environment
     :return:
     """
 
@@ -236,10 +283,10 @@ def start_monitor(pool_name=None, parameter_set=None, console=False, **kwargs):
 def start_plotter(pool_name=None, console=False, **kwargs):
     """
     Gets the path of the Startfile for the Plotter and executes it
-    :param console: If False will be run in Console, otherwise will be run in seperate Environment
+    
+    :param console: If False will be run in Console, otherwise will be run in separate Environment
     :return:
     """
-
     directory = cfg.get('paths', 'ccs')
     file_path = os.path.join(directory, 'plotter.py')
 
@@ -248,34 +295,69 @@ def start_plotter(pool_name=None, console=False, **kwargs):
     else:
         start_app(file_path, directory, console=console, **kwargs)
 
-
 def start_tst(console=False, **kwargs):
+    """
+
+    :param console:
+    :param kwargs:
+    """
     directory = cfg.get('paths', 'tst')
     file_path = os.path.join(directory, 'tst/main.py')
     start_app(file_path, directory, console=console, **kwargs)
 
 
 def start_progress_view(console=False, **kwargs):
+    """
+
+    :param console:
+    :param kwargs:
+    """
     directory = cfg.get('paths', 'tst')
     file_path = os.path.join(directory, 'progress_view/progress_view.py')
     start_app(file_path, directory, console=console, **kwargs)
 
 
 def start_log_viewer(console=False, **kwargs):
+    """
+
+    :param console:
+    :param kwargs:
+    """
     directory = cfg.get('paths', 'tst')
     file_path = os.path.join(directory, 'log_viewer/log_viewer.py')
     start_app(file_path, directory, console=console, **kwargs)
 
 
 def start_config_editor(console=False, **kwargs):
+    """
+
+    :param console:
+    :param kwargs:
+    """
     file_path = cfg.get('start-module', 'config-editor')
     directory = os.path.dirname(file_path)
     start_app(file_path, directory, console=console, **kwargs)
 
 
+def start_tst(console=False, **kwargs):
+    """
+
+    :param console:
+    :param kwargs:
+    """
+    file_path = os.path.join(cfg.get('paths', 'base'), 'start_tst')
+    directory = os.path.dirname(file_path)
+    start_app(file_path, directory, console=console, **kwargs)
+
+
 # This sets up a logging client for the already running TCP-logging Server,
 # The logger is returned with the given name an can be used like a normal logger
 def start_logging(name):
+    """
+
+    :param name:
+    :return:
+    """
     level = cfg.get('ccs-logging', 'level')
     loglevel = getattr(logging, level.upper())
 
@@ -292,8 +374,14 @@ def start_logging(name):
 
 # This returns a dbus connection to a given Application-Name
 def dbus_connection(name, instance=1):
+    """
+
+    :param name:
+    :param instance:
+    :return:
+    """
     if instance == 0:
-        logger.error('No instance of {} found.'.format(name))
+        logger.warning('No instance of {} found.'.format(name))
         return False
 
     if not instance:
@@ -302,9 +390,11 @@ def dbus_connection(name, instance=1):
     dbus_type = dbus.SessionBus()
     try:
         Bus_Name = cfg.get('ccs-dbus_names', name)
-    except:
+    except (ValueError, confignator.config.configparser.NoOptionError):
         logger.warning(str(name) + ' is not a valid DBUS name.')
         logger.warning(str(name) + ' not found in config file.')
+        raise NameError('"{}" is not a valid module name'.format(name))
+
     Bus_Name += str(instance)
 
     try:
@@ -312,12 +402,18 @@ def dbus_connection(name, instance=1):
         return dbuscon
     except:
         # print('Please start ' + str(name) + ' if it is not running')
-        logger.warning('Connection to ' + str(name) + ' is not possible.')
+        logger.info('Connection to ' + str(name) + ' is not possible.')
         return False
 
 
 # Returns True if application is running or False if not
 def is_open(name, instance=1):
+    """
+
+    :param name:
+    :param instance:
+    :return:
+    """
     dbus_type = dbus.SessionBus()
     try:
         # dbus_connection(name, instance)
@@ -326,16 +422,17 @@ def is_open(name, instance=1):
         dbus_type.get_object(Bus_Name, '/MessageListener')
         return True
     except Exception as err:
-        logger.info(err)
+        logger.debug(err)
         return False
 
 
 def show_functions(conn, filter=None):
     """
     Show all available functions for a CCS application
-    @param conn: A Dbus connection
-    @param filter: A string which filters the results
-    @return: A list of available functions
+    
+    :param conn: A Dbus connection
+    :param filter: A string which filters the results
+    :return: A list of available functions
     """
     '''
     if app_nbr and not isinstance(app_nbr, int):
@@ -361,9 +458,10 @@ def ConnectionCheck(dbus_con, argument=None):
     """
     The user friendly version to use the ConnectionCheck method exported by all CCS applications via DBus, checks if the
     connection is made
-    @param dbus_con: A Dbus connection
-    @param argument: An argument which can be sent for testing purposes
-    @return: If the connection is made
+    
+    :param dbus_con: A Dbus connection
+    :param argument: An argument which can be sent for testing purposes
+    :return: If the connection is made
     """
     argument = python_to_dbus(argument, True)
 
@@ -381,11 +479,12 @@ def Functions(dbus_con, function_name, *args, **kwargs):
     """
     The user friendly version to use the Functions method exported by all CCS applications via DBus, lets one call all
     Functions in a CCS application
-    @param dbus_con: A Dbus connection
-    @param function_name: The function to call as a string
-    @param args: The arguments for the function
-    @param kwargs: The keyword arguments for the function as as Dict
-    @return:
+
+    :param dbus_con: A Dbus connection
+    :param function_name: The function to call as a string
+    :param args: The arguments for the function
+    :param kwargs: The keyword arguments for the function as as Dict
+    :return:
     """
     args = (python_to_dbus(value, True) for value in args)
 
@@ -402,10 +501,11 @@ def Variables(dbus_con, variable_name, *args):
     """
     The user friendly version to use the Variables method exported by all CCS applications via DBus, lets one change and
     get all Variables of a CCs application
-    @param dbus_con: A Dbus connection
-    @param variable_name: The variable
-    @param args: The value to change the variable to, if nothing is given the value of the Variable is returned
-    @return: Either the variable value or None if Variable was changed
+
+    :param dbus_con: A Dbus connection
+    :param variable_name: The variable
+    :param args: The value to change the variable to, if nothing is given the value of the Variable is returned
+    :return: Either the variable value or None if Variable was changed
     """
     args = (python_to_dbus(value, True) for value in args)
 
@@ -419,11 +519,12 @@ def Dictionaries(dbus_con, dictionary_name, *args):
     """
     The user friendly version to use the Dictionaries method exported by all CCS applications via DBus, lets one change
     and get values or the entire Dictionary for all availabe Dictionaries of a CCS application
-    @param dbus_con: A Dbus connection
-    @param dictionary_name: The dictionary name
-    @param args: A key of the dictionary to get the corresponding value, or a key and a value to change the value for a
+
+    :param dbus_con: A Dbus connection
+    :param dictionary_name: The dictionary name
+    :param args: A key of the dictionary to get the corresponding value, or a key and a value to change the value for a
     key, if not given the entire dictionary is returned
-    @return: The entire dictionary, a value for a given key or None if a value was changed
+    :return: The entire dictionary, a value for a given key or None if a value was changed
     """
     args = (python_to_dbus(value, True) for value in args)
 
@@ -436,8 +537,9 @@ def Dictionaries(dbus_con, dictionary_name, *args):
 def dict_to_dbus_kwargs(arguments={}, user_console = False):
     """
     Converts a dictionary to kwargs dbus does understand and if necessary and requested changes NoneType to 'NoneType'
-    @param arguments: The to converting dictionary
-    @return: The dbus Dictionary which simulates the kwargs
+
+    :param arguments: The to converting dictionary
+    :return: The dbus Dictionary which simulates the kwargs
     """
     if user_console:
         for key in arguments.keys():
@@ -450,10 +552,11 @@ def dict_to_dbus_kwargs(arguments={}, user_console = False):
 # Converts dbus types to python types
 def dbus_to_python(data, user_console=False):
     """
-    Convets dbus Types to Python Types
-    @param data: Dbus Type variables or containers
-    @param user_console: Flag to check for NoneType arguments
-    @return: Same data as python variables or containers
+    Converts DBus types to Python types
+
+    :param data: Dbus Type variables or containers
+    :param user_console: Flag to check for NoneType arguments
+    :return: Same data as python variables or containers
     """
     # NoneType string is transformed to a python None type
     if user_console and data == 'NoneType':
@@ -487,9 +590,10 @@ def dbus_to_python(data, user_console=False):
 def python_to_dbus(data, user_console=False):
     """
     Converts Python Types to Dbus Types, only containers, since 'normal' data types are converted automatically by dbus
-    @param data: Dbus Type variables or containers
-    @param user_console: Flag to check for NoneType arguments
-    @return: Same data for python variables, same data for container types as dbus containers
+
+    :param data: Dbus Type variables or containers
+    :param user_console: Flag to check for NoneType arguments
+    :return: Same data for python variables, same data for container types as dbus containers
     """
 
     if user_console and data is None:
@@ -512,15 +616,28 @@ def python_to_dbus(data, user_console=False):
 def convert_to_python(func):
     """
     The Function dbus_to_python can be used as a decorator where all return values are changed to python types
-    @param func: The function where the decorator should be used
-    @return: The wrapped function
+
+    :param func: The function where the decorator should be used
+    :return: The wrapped function
     """
     def wrapper(*args, **kwargs):
+        """
+
+        :param args:
+        :param kwargs:
+        :return:
+        """
         return dbus_to_python(func(*args, **kwargs))
     return wrapper
 
 
 def set_monitor(pool_name=None, param_set=None):
+    """
+
+    :param pool_name:
+    :param param_set:
+    :return:
+    """
     if is_open('monitor'):
         monitor = dbus_connection('monitor', communication['monitor'])
     else:
@@ -565,26 +682,47 @@ def set_monitor(pool_name=None, param_set=None):
 
 
 def user_tm_decoders_func():
+    """
 
+    :return:
+    """
     if cfg.has_section('ccs-user_defined_packets'):
-        user_tm_decoders = {k: json.loads(cfg['ccs-user_defined_packets'][k])
-                                 for k in cfg['ccs-user_defined_packets']}
+        user_tm_decoders = {k: json.loads(cfg['ccs-user_defined_packets'][k]) for k in cfg['ccs-user_defined_packets']}
     else:
         user_tm_decoders = {}
-
     return user_tm_decoders
 
 
-# TM formatted
-#
-#  Return a formatted string containing all the decoded source data of TM packet _tm_
-#  @param tm TM packet bytestring
-def Tmformatted(tm, separator='\n', sort_by_name=False, textmode=True, UDEF=False):
-    sourcedata, tmtcnames = Tmdata(tm, UDEF=UDEF)
+def Tmformatted(tm, separator='\n', sort_by_name=False, textmode=True, udef=False, nocal=False, floatfmt=None):
+    """
+    Return a formatted string containing all the decoded source data of TM packet _tm_
+
+    :param tm:
+    :param separator:
+    :param sort_by_name:
+    :param textmode:
+    :param udef:
+    :param nocal:
+    :return:
+    """
+    sourcedata, tmtcnames = Tmdata(tm, udef=udef, floatfmt=floatfmt)
     tmtcname = " / ".join(tmtcnames)
+
+    if nocal:
+        # check if packet size is variable (because of different returned data structure)
+        if not isinstance(sourcedata[0][-1], tuple):
+            def _get_val_func(x):
+                return [str(x[2]), str(x[4]), '']
+        else:
+            def _get_val_func(x):
+                return [str(x[2]), str(x[4][0]), '']
+    else:
+        def _get_val_func(x):
+            return [str(x[2]), str(x[0]), none_to_empty(x[1])]
+
     if textmode:
         if sourcedata is not None:
-            formattedlist = ['{}:  {} {}'.format(i[2], i[0], none_to_empty(i[1])) for i in sourcedata]
+            formattedlist = ['{}:  {} {}'.format(*_get_val_func(i)) for i in sourcedata]
             if sort_by_name:
                 formattedlist.sort()
         else:
@@ -593,14 +731,13 @@ def Tmformatted(tm, separator='\n', sort_by_name=False, textmode=True, UDEF=Fals
     else:
         if sourcedata is not None:
             try:
-                formattedlist = [[str(i[2]), str(i[0]), none_to_empty(i[1]),
-                                parameter_tooltip_text(i[-1][0])] for i in sourcedata]
-            # For variable length packets:
-            except:
-                formattedlist = [[str(i[2]), str(i[0]), none_to_empty(i[1]),
-                                parameter_tooltip_text(i[-1])] for i in sourcedata]
+                formattedlist = [[*_get_val_func(i), parameter_tooltip_text(i[-1][0])] for i in sourcedata]
+            # for variable length packets
+            except (IndexError, TypeError):
+                formattedlist = [[*_get_val_func(i), parameter_tooltip_text(i[-1])] for i in sourcedata]
         else:
             formattedlist = [[]]
+
         return formattedlist, tmtcname
 
 
@@ -609,21 +746,24 @@ def Tmformatted(tm, separator='\n', sort_by_name=False, textmode=True, UDEF=Fals
 #
 #  Decode source data field of TM packet
 #  @param tm TM packet bytestring
-def Tmdata(tm, UDEF=False, *args):
-    tmdata = None
-    tmname = None
+def Tmdata(tm, udef=False, floatfmt=None):
+    """
+
+    :param tm:
+    :param udef:
+    :return:
+    """
     tpsd = None
     params = None
     dbcon = scoped_session_idb
 
-    # This will be used to first check if an UDEF exists and used this to decode, if not the ÍDB will be checked
-    if UDEF:
+    # check if a UDEF exists and use to decode, if not the IDB will be checked
+    if udef:
         try:
-            # with poolmgr.lock:
             header, data, crc = Tmread(tm)
-            # data = tm_list[-2]
             st, sst, apid = header.SERV_TYPE, header.SERV_SUB_TYPE, header.APID
             que = 'SELECT pic_pi1_off,pic_pi1_wid from pic where pic_type=%s and pic_stype=%s' % (st, sst)
+            # que = 'SELECT pic_pi1_off,pic_pi1_wid from pic where pic_type=%s and pic_stype=%s and pic_apid=%s' % (st, sst, apid)
             dbres = dbcon.execute(que)
             pi1, pi1w = dbres.fetchall()[0]
 
@@ -631,41 +771,46 @@ def Tmdata(tm, UDEF=False, *args):
             tag = '{}-{}-{}-{}'.format(st, sst, apid, pi1val)
             user_label, params = user_tm_decoders[tag]
             spid = None
-            #o = data.unpack(','.join([ptt[i[4]][i[5]] for i in params]))
-            if len(params[0]) == 9: #Length of a parameter which should be decoded acording to given position
+
+            # Length of a parameter which should be decoded acording to given position
+            if len(params[0]) == 9:
                 vals_params = decode_pus(data, params)
-            else: #Decode according to given order, length is then 11
+            # Decode according to given order, length is then 11
+            else:
                 vals_params = read_variable_pckt(data, params)
 
-            tmdata = [(get_calibrated(i[0], j[0]), i[6], i[1], pidfmt(i[7]), j) for i, j in zip(params, vals_params)]
+            tmdata = [(get_calibrated(i[0], j[0], floatfmt=floatfmt), i[6], i[1], pidfmt(i[7]), j) for i, j in zip(params, vals_params)]
             tmname = ['USER DEFINED: {}'.format(user_label)]
 
             return tmdata, tmname
-        except:
-            logger.info('UDEF could not be found, search in IDB')
+
+        except Exception as err:
+            logger.info('UDEF could not be found, search in IDB ({})'.format(err))
+        finally:
+            dbcon.close()
 
     try:
 
         if (tm[0] >> 4) & 1:
-            return Tcdata(tm, *args)
-        # with poolmgr.lock:
+            return Tcdata(tm)
+
         header, data, crc = Tmread(tm)
-        # data = tm_list[-2]
         st, sst, apid = header.SERV_TYPE, header.SERV_SUB_TYPE, header.APID
         que = 'SELECT pic_pi1_off,pic_pi1_wid from pic where pic_type=%s and pic_stype=%s' % (st, sst)
         dbres = dbcon.execute(que)
         pi1, pi1w = dbres.fetchall()[0]
+
         if pi1 != -1:
-            #print(tm[pi1:pi1 + pi1w])
-            # pi1val = Bits(tm)[pi1 * 8:pi1 * 8 + pi1w].uint
             pi1val = int.from_bytes(tm[pi1:pi1 + pi1w//8], 'big')
             que = 'SELECT pid_spid,pid_tpsd,pid_dfhsize from pid where pid_type=%s and pid_stype=%s and ' \
                   'pid_apid=%s and pid_pi1_val=%s' % (st, sst, apid, pi1val)
         else:
             que = 'SELECT pid_spid,pid_tpsd,pid_dfhsize from pid where pid_type=%s and pid_stype=%s and ' \
                   'pid_apid=%s' % (st, sst, apid)
+
         dbres = dbcon.execute(que)
         fetch = dbres.fetchall()
+
         # if APID or SID does not match:
         if len(fetch) != 0:
             spid, tpsd, dfhsize = fetch[0]
@@ -685,6 +830,8 @@ def Tmdata(tm, UDEF=False, *args):
             if params is None:
                 dbres = dbcon.execute(que)
                 spid, tpsd, dfhsize = dbres.fetchall()[0]
+
+        # TODO: proper handling of super-commutated parameters
         if tpsd == -1 and params is None:
             que = 'SELECT pcf.pcf_name,pcf.pcf_descr,plf_offby,plf_offbi,pcf.pcf_ptc,pcf.pcf_pfc,\
             pcf.pcf_unit,pcf.pcf_pid,pcf.pcf_width FROM plf LEFT JOIN pcf ON plf.plf_name=pcf.pcf_name WHERE \
@@ -692,20 +839,19 @@ def Tmdata(tm, UDEF=False, *args):
             ORDER BY plf_offby,plf_offbi'.format(spid)
             dbres = dbcon.execute(que)
             params = dbres.fetchall()
-            #o = data.unpack(','.join([ptt[i[4]][i[5]] for i in params]))
             vals_params = decode_pus(data, params)
-            tmdata = [(get_calibrated(i[0], j[0]), i[6], i[1], pidfmt(i[7]), j) for i, j in zip(params, vals_params)]
+            tmdata = [(get_calibrated(i[0], j[0], floatfmt=floatfmt), i[6], i[1], pidfmt(i[7]), j) for i, j in zip(params, vals_params)]
 
         elif params is not None:
-            #o = data.unpack(','.join([ptt[i[4]][i[5]] for i in params]))
-
-            if len(params[0]) == 9: #Length of a parameter which should be decoded acording to given position
+            # Length of a parameter which should be decoded according to given position
+            if len(params[0]) == 9:
                 vals_params = decode_pus(data, params)
-            else: #Decode according to given order, length is then 11
+            # Decode according to given order, length is then 11
+            else:
                 vals_params = read_variable_pckt(data, params)
 
-            #vals_params = decode_pus(data, params)
-            tmdata = [(get_calibrated(i[0], j[0]), i[6], i[1], pidfmt(i[7]), j) for i, j in zip(params, vals_params)]
+            tmdata = [(get_calibrated(i[0], j[0], floatfmt=floatfmt), i[6], i[1], pidfmt(i[7]), j) for i, j in zip(params, vals_params)]
+
         else:
             que = 'SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_curtx,pcf.pcf_width,\
             pcf.pcf_unit,pcf.pcf_pid,vpd_pos,vpd_grpsize,vpd_fixrep from vpd left join pcf on \
@@ -715,7 +861,7 @@ def Tmdata(tm, UDEF=False, *args):
             params_in = dbres.fetchall()
 
             vals_params = read_variable_pckt(data, params_in)
-            tmdata = [(get_calibrated(i[0], j), i[6], i[1], pidfmt(i[7]), j) for j, i in vals_params]
+            tmdata = [(get_calibrated(i[0], j, floatfmt=floatfmt), i[6], i[1], pidfmt(i[7]), j) for j, i in vals_params]
             # tmdata = [(get_calibrated(i[0], j[0]), i[6], i[1], pidfmt(i[7]), j) for i, j in zip(params, vals_params)]
 
         if spid is not None:
@@ -723,15 +869,154 @@ def Tmdata(tm, UDEF=False, *args):
             tmname = dbres.fetchall()[0]
         else:
             tmname = ['USER DEFINED: {}'.format(user_label)]
+
     except Exception as failure:
         raise Exception('Packet data decoding failed: ' + str(failure))
-        # logger.info('Packet data decoding failed.' + str(failure))
+
     finally:
         dbcon.close()
+
     return tmdata, tmname
 
 
+def read_pus(data):
+    """
+    Read single PUS packet from buffer
+
+    @param data: has to be peekable
+    @return: single PUS packet as byte string or *None*
+    """
+    pus_size = data.peek(10)
+
+    if len(pus_size) >= 6:
+        pus_size = pus_size[4:6]
+    elif 0 < len(pus_size) < 6:
+        start_pos = data.tell()
+        pus_size = data.read(6)[4:6]
+        data.seek(start_pos)
+    elif len(pus_size) == 0:
+        return
+
+    # packet size is header size (6) + pus size field + 1
+    pckt_size = int.from_bytes(pus_size, 'big') + 7
+    return data.read(pckt_size)
+
+
+def extract_pus(data):
+    """
+
+    @param data:
+    @return:
+    """
+    pckts = []
+    if isinstance(data, bytes):
+        data = io.BufferedReader(io.BytesIO(data))
+
+    while True:
+        pckt = read_pus(data)
+        if pckt is not None:
+            pckts.append(pckt)
+        else:
+            break
+    return pckts
+
+
+def extract_pus_brute_search(data, filename=None, trashcnt=None):
+    """
+
+    :param data:
+    :param filename:
+    :param trashcnt:
+    :return:
+    """
+    pckts = []
+    if trashcnt is None:
+        trashcnt = {filename: 0}  # dummy counter if no trashcnt dict is given
+
+    if isinstance(data, bytes):
+        data = io.BufferedReader(io.BytesIO(data))
+    elif isinstance(data, io.BufferedReader):
+        pass
+    else:
+        raise TypeError('Cannot handle input of type {}'.format(type(data)))
+
+    while True:
+        pos = data.tell()
+        pckt = read_pus(data)
+        if pckt is not None:
+            if not crc_check(pckt):
+                pckts.append(pckt)
+            else:
+                data.seek(pos + 1)
+                trashcnt[filename] += 1
+        else:
+            break
+
+    return pckts
+
+
+def unpack_pus(pckt, use_pktlen=False, logger=logger):
+    """
+    Decode PUS and return header parameters and data field
+
+    :param pckt:
+    :param use_pktlen: whether to use packet length info in header or just take all of the data after the header as payload
+    :param logger:
+    :return:
+    """
+    try:
+        tmtc = pckt[0] >> 4 & 1
+        dhead = pckt[0] >> 3 & 1
+
+        if tmtc == 0 and dhead == 1 and (len(pckt) >= TM_HEADER_LEN):
+            header = TMHeader()
+            header.bin[:] = pckt[:TM_HEADER_LEN]
+            if not use_pktlen:
+                data = pckt[TM_HEADER_LEN:-PEC_LEN]
+                crc = pckt[-PEC_LEN:]
+            else:
+                data = pckt[TM_HEADER_LEN:header.bits.PKT_LEN + 7 - PEC_LEN]
+                crc = pckt[header.bits.PKT_LEN + 7 - PEC_LEN:header.bits.PKT_LEN + 7]
+
+        elif tmtc == 1 and dhead == 1 and (len(pckt) >= TC_HEADER_LEN):
+            header = TCHeader()
+            header.bin[:] = pckt[:TC_HEADER_LEN]
+            if not use_pktlen:
+                data = pckt[TC_HEADER_LEN:-PEC_LEN]
+                crc = pckt[-PEC_LEN:]
+            else:
+                data = pckt[TC_HEADER_LEN:header.bits.PKT_LEN + 7 - PEC_LEN]
+                crc = pckt[header.bits.PKT_LEN + 7 - PEC_LEN:header.bits.PKT_LEN + 7]
+
+        else:
+            header = PHeader()
+            header.bin[:P_HEADER_LEN] = pckt[:P_HEADER_LEN]
+            if not use_pktlen:
+                data = pckt[P_HEADER_LEN:]
+            else:
+                data = pckt[P_HEADER_LEN:header.bits.PKT_LEN + 7]
+            crc = None
+
+        head_pars = header.bits
+
+    except Exception as err:
+        logger.warning('Error unpacking PUS packet: {}\n{}'.format(pckt, err))
+        head_pars = None
+        data = None
+        crc = None
+
+    finally:
+        return head_pars, data, crc
+
+
 def decode_pus(tm_data, parameters, decode_tc=False):
+    """
+
+    :param tm_data:
+    :param parameters:
+    :param decode_tc:
+    :return:
+    """
     # checkedfmts = [fmtcheck(i[1]) for i in idb]
     # if not any(checkedfmts):
     # fmts = []
@@ -767,18 +1052,26 @@ def decode_pus(tm_data, parameters, decode_tc=False):
 #  @param pos Input The BytePosition in the input bytes
 #  @param offbi
 def read_stream(stream, fmt, pos=None, offbi=0):
+    """
+
+    :param stream:
+    :param fmt:
+    :param pos:
+    :param offbi:
+    :return:
+    """
     if pos is not None:
         stream.seek(int(pos))
 
-    data = stream.read(csize(fmt, offbi))
+    readsize = csize(fmt, offbi)
+    data = stream.read(readsize)
+
     if not data:
         raise BufferError('No data left to read from [{}]!'.format(fmt))
 
     if fmt == 'I24':
-        # x = struct.unpack('>I', b'\x00' + data)[0]
         x = int.from_bytes(data, 'big')
     elif fmt == 'i24':
-        # x = struct.unpack('>i', data + b'\x00')[0] >> 8
         x = int.from_bytes(data, 'big', signed=True)
     # for bit-sized unsigned parameters:
     elif fmt.startswith('uint'):
@@ -790,7 +1083,11 @@ def read_stream(stream, fmt, pos=None, offbi=0):
         x = struct.unpack('>{}s'.format(fmt[3:]), data)[0]
     elif fmt.startswith('ascii'):
         x = struct.unpack('>{}s'.format(fmt[5:]), data)[0]
-        x = x.decode()
+        try:
+            x = x.decode('ascii')
+        except UnicodeDecodeError as err:
+            logger.warning(err)
+            x = x.decode('utf-8', errors='replace')
     elif fmt == timepack[0]:
         x = timecal(data)
     else:
@@ -799,13 +1096,20 @@ def read_stream(stream, fmt, pos=None, offbi=0):
     return x
 
 
-##
-#  csize
-#
-#  Returns the Amount of Bytes for the input format
-#  @param fmt Input String that defines the format
-#  @param offbi
-def csize(fmt, offbi=0):
+def csize(fmt, offbi=0, bitsize=False):
+    """
+    Returns the amount of bytes required for the input format
+
+    :param fmt: Input String that defines the format
+    :param offbi:
+    :return:
+    """
+
+    if bitsize:
+        bits = 8
+    else:
+        bits = 1
+
     if fmt in ('i24', 'I24'):
         return 3
     elif fmt.startswith('uint'):
@@ -817,7 +1121,10 @@ def csize(fmt, offbi=0):
     elif fmt.startswith('ascii'):
         return int(fmt[5:])
     else:
-        return struct.calcsize(fmt)
+        try:
+            return struct.calcsize(fmt)
+        except struct.error:
+            raise NotImplementedError(fmt)
 
 
 ##
@@ -826,6 +1133,11 @@ def csize(fmt, offbi=0):
 # Returns the format of the input bytes for TM (list has to be formated the correct way)
 # @param parameters Input List of one parameter
 def parameter_ptt_type_tm(par):
+    """
+
+    :param par:
+    :return:
+    """
     return ptt(par[4], par[5])
 
 
@@ -835,6 +1147,11 @@ def parameter_ptt_type_tm(par):
 # Returns the format of the input bytes for TC (list has to be formated the correct way)
 # @param parameters Input List of one parameter
 def parameter_ptt_type_tc_read(par):
+    """
+
+    :param par:
+    :return:
+    """
     if par[2] is None:
         return ptt('SPARE_visible', par[5])
     else:
@@ -847,11 +1164,30 @@ def parameter_ptt_type_tc_read(par):
 #  Return empty string "" if input is _None_, else return input string
 #  @param s Input string
 def none_to_empty(s):
+    """
+
+    :param s:
+    :return:
+    """
     return '' if s is None else s
 
 
+def str_to_int(itr):
+    """
+
+    :param itr:
+    :return:
+    """
+    return int(itr) if itr.lower() != 'none' else None
+
+
 def Tm_header_formatted(tm, detailed=False):
-    '''unpack APID, SEQCNT, PKTLEN, TYPE, STYPE, SOURCEID'''
+    """
+
+    :param tm:
+    :param detailed:
+    :return:
+    """
 
     # if len(tm) < TC_HEADER_LEN:
     #     return 'Cannot decode header - packet has only {} bytes!'.format(len(tm))
@@ -878,27 +1214,47 @@ def Tm_header_formatted(tm, detailed=False):
         return 'APID:{}|SEQ:{}|LEN:{}|TYPE:{}|STYPE:{}|CUC:{}{}'.format(
             head.APID, head.PKT_SEQ_CNT, head.PKT_LEN, head.SERV_TYPE, head.SERV_SUB_TYPE, mkcucstring(tm), details)
 
+
+def spw_header_formatted(spw_header):
+    """
+
+    :param spw_header:
+    :return:
+    """
+    buf = spw_header.__class__.__name__ + '\n\n'
+    buf += spw_header.raw.hex()
+    return buf
+
+
 def get_header_parameters_detailed(pckt):
     """
     Return values of all header elements
+
     :param pckt:
     """
     head = Tmread(pckt)[0]
     hparams = [(x[0], getattr(head, x[0])) for x in head._fields_]
     return hparams
 
+
 ##
 # CUC timestring
 #
 #  Generate timestring (seconds.microseconds) with (un-)synchronised flag (U/S) appended from TM packet (header data)
 #  @param tml List of decoded TM packet header parameters or TM packet
 def mkcucstring(tml):
+    """
+
+    :param tml:
+    :return:
+    """
     return timecal(tml[CUC_OFFSET:CUC_OFFSET+timepack[1]], string=True)
 
 
 def get_cuc_now():
     """
     Returns the current UTC time in seconds since the reference epoch
+
     :return:
     """
     cuc = datetime.datetime.now(datetime.timezone.utc) - CUC_EPOCH
@@ -908,6 +1264,7 @@ def get_cuc_now():
 def utc_to_cuc(utc):
     """
     Returns the time provided in seconds since the reference epoch
+
     :param utc: ISO formatted date-time string or timezone aware datetime object
     :return:
     """
@@ -921,6 +1278,7 @@ def utc_to_cuc(utc):
 def cuc_to_utc(cuc):
     """
     Returns the UTC date-time corresponding to the provided second offset from the reference epoch
+
     :param cuc: Seconds since the reference epoch
     :return:
     """
@@ -928,25 +1286,59 @@ def cuc_to_utc(cuc):
     return utc.isoformat()
 
 
-##
-#  Parametertooltiptext
-#
-#  Takes numerical value and returns corresponding hex and decimal values as a string.
-#  Intended for parameter view tooltips.
+def cuc_time_str(head, logger=logger):
+    """
+    Return PUS header timestamp as string
 
-def parameter_tooltip_text(x):
-    if isinstance(x, int):
-        h = hex(x)[2:].upper()
-        if np.sign(x) == -1:
-            h = h.replace('x', '-') + '(THIS IS WRONG!)'
+    :param head: TMHeader instance
+    :param logger:
+    :return:
+    """
+    try:
+        if head.PKT_TYPE == 0 and head.SEC_HEAD_FLAG == 1:
+            if head.TIMESYNC in tsync_flag:
+                return '{:.6f}{}'.format(head.CTIME + head.FTIME / timepack[2], tsync_flag[head.TIMESYNC])
+            else:
+                logger.warning('Unknown timesync flag value {} in packet {}'.format(head.TIMESYNC, head.raw[:4].hex()))
+                return '{:.6f}{}'.format(head.CTIME + head.FTIME / timepack[2], 'U')
+        else:
+            return ''
+    except Exception as err:
+        logger.info(err)
+        return ''
+
+
+##
+#  Parametertooltiptext
+#
+#  Takes numerical value and returns corresponding hex and decimal values as a string.
+#  Intended for parameter view tooltips.
+def parameter_tooltip_text(x):
+    """
+
+    :param x:
+    :return:
+    """
+    if isinstance(x, int):
+        h = hex(x)[2:].upper()
+        if np.sign(x) == -1:
+            h = hex(x)[3:].upper()
     elif isinstance(x, float):
         h = struct.pack('>f', x).hex().upper()
+    elif isinstance(x, bytes):
+        return x.hex().upper()
     else:
-        h = str(x)
-    return 'HEX: {}\nDEC: {}'.format(h, x)
+        # h = str(x)
+        return str(x)
+    return 'HEX: 0x{}\nDEC: {}'.format(h, x)
 
 
-def Tcdata(tm, *args):
+def Tcdata(tm):
+    """
+
+    :param tm:
+    :return:
+    """
     header, data, crc = Tmread(tm)
     st, sst, apid = header.SERV_TYPE, header.SERV_SUB_TYPE, header.APID
     dbcon = scoped_session_idb
@@ -998,6 +1390,13 @@ def Tcdata(tm, *args):
     dbcon.close()
     tcnames = list({x[1] for x in params})
 
+    # return if no TC can be unambiguously assigned
+    _npars = {x[4] for x in params}
+    if len(tcnames) and len(_npars) > 1:
+        tcdata = None
+        tcnames.append("\n\nAmbiguous packet type - cannot decode.")
+        return tcdata, tcnames
+
     # select one parameter set if IFSW and DBS have entry
     if len(tcnames) > 1:
         params = params[::len(tcnames)]
@@ -1033,7 +1432,7 @@ def Tcdata(tm, *args):
         #outlist = []
         #datastream = BitStream(data)
         try:
-            vals_params = read_variable_pckt(data, params)
+            vals_params = read_variable_pckt(data, params, tc=True)
         except IndexError:
             vals_params = None
     if vals_params:
@@ -1054,39 +1453,40 @@ def Tmread(pckt):
     :param pckt:
     :return:
     """
-    try:
-        tmtc = pckt[0] >> 4 & 1
-        dhead = pckt[0] >> 3 & 1
-
-        if tmtc == 0 and dhead == 1 and (len(pckt) >= TM_HEADER_LEN):
-            header = TMHeader()
-            header.bin[:] = pckt[:TM_HEADER_LEN]
-            data = pckt[TM_HEADER_LEN:-PEC_LEN]
-            crc = pckt[-PEC_LEN:]
-
-        elif tmtc == 1 and dhead == 1 and (len(pckt) >= TC_HEADER_LEN):
-            header = TCHeader()
-            header.bin[:] = pckt[:TC_HEADER_LEN]
-            data = pckt[TC_HEADER_LEN:-PEC_LEN]
-            crc = pckt[-PEC_LEN:]
-
-        else:
-            header = TCHeader()
-            header.bin[:P_HEADER_LEN] = pckt[:P_HEADER_LEN]
-            data = pckt[P_HEADER_LEN:]
-            crc = None
-
-        head_pars = header.bits
-
-    except Exception as err:
-        # print('Error unpacking packet: {}\n{}'.format(pckt, err))
-        logger.warning('Error unpacking packet: {}\n{}'.format(pckt, err))
-        head_pars = None
-        data = None
-        crc = None
-
-    finally:
-        return head_pars, data, crc
+    return unpack_pus(pckt)
+    # try:
+    #     tmtc = pckt[0] >> 4 & 1
+    #     dhead = pckt[0] >> 3 & 1
+    #
+    #     if tmtc == 0 and dhead == 1 and (len(pckt) >= TM_HEADER_LEN):
+    #         header = TMHeader()
+    #         header.bin[:] = pckt[:TM_HEADER_LEN]
+    #         data = pckt[TM_HEADER_LEN:-PEC_LEN]
+    #         crc = pckt[-PEC_LEN:]
+    #
+    #     elif tmtc == 1 and dhead == 1 and (len(pckt) >= TC_HEADER_LEN):
+    #         header = TCHeader()
+    #         header.bin[:] = pckt[:TC_HEADER_LEN]
+    #         data = pckt[TC_HEADER_LEN:-PEC_LEN]
+    #         crc = pckt[-PEC_LEN:]
+    #
+    #     else:
+    #         header = TCHeader()
+    #         header.bin[:P_HEADER_LEN] = pckt[:P_HEADER_LEN]
+    #         data = pckt[P_HEADER_LEN:]
+    #         crc = None
+    #
+    #     head_pars = header.bits
+    #
+    # except Exception as err:
+    #     # print('Error unpacking packet: {}\n{}'.format(pckt, err))
+    #     logger.warning('Error unpacking packet: {}\n{}'.format(pckt, err))
+    #     head_pars = None
+    #     data = None
+    #     crc = None
+    #
+    # finally:
+    #     return head_pars, data, crc
 
 
 ##
@@ -1094,6 +1494,12 @@ def Tmread(pckt):
 #  @param inbytes   bytestring or bitstring object to be converted
 #  @param separator string by which the hex doublettes are joined, default=' '
 def prettyhex(inbytes, separator=' '):
+    """
+
+    :param inbytes:
+    :param separator:
+    :return:
+    """
     if not isinstance(inbytes, bytes):
         inbytes = inbytes.bytes
     return separator.join(['%02X' % x for x in inbytes])
@@ -1109,6 +1515,15 @@ def prettyhex(inbytes, separator=' '):
 #  @param outlist list of decoded source data parameter values
 #  @param parlist list of decoded source data parameter properties
 def read_varpack(data, parameters, paramid, outlist, parlist):
+    """
+
+    :param data:
+    :param parameters:
+    :param paramid:
+    :param outlist:
+    :param parlist:
+    :return:
+    """
     while paramid < len(parameters):
         fmt = ptt(parameters[paramid][2], parameters[paramid][3])
         if parameters[paramid][2] == 11:  # TODO: handle deduced parameter types
@@ -1143,9 +1558,10 @@ def read_varpack(data, parameters, paramid, outlist, parlist):
     return outlist, parlist
 
 
-def read_variable_pckt(tm_data, parameters):
+def read_variable_pckt(tm_data, parameters, tc=False):
     """
     Read parameters from a variable length packet
+
     :param tm_data:
     :param parameters:
     :return:
@@ -1153,17 +1569,20 @@ def read_variable_pckt(tm_data, parameters):
     tms = io.BytesIO(tm_data)
     result = []
 
-    result = read_stream_recursive(tms, parameters, decoded=result)
+    result = read_stream_recursive(tms, parameters, decoded=result, tc=tc)
 
     return result
 
 
-def read_stream_recursive(tms, parameters, decoded=None):
+def read_stream_recursive(tms, parameters, decoded=None, bit_off=0, tc=False):
     """
     Recursively operating function for decoding variable length packets
+
     :param tms:
     :param parameters:
     :param decoded:
+    :param bit_off:
+    :param tc:
     :return:
     """
 
@@ -1176,35 +1595,51 @@ def read_stream_recursive(tms, parameters, decoded=None):
             continue
         grp = par[-2]
 
-        if grp is None:  # None happens for UDFP, would give error using None
+        if grp is None:  # None happens for UDEF
             grp = 0
 
         fmt = ptt(par[2], par[3])
         if fmt == 'deduced':
             raise NotImplementedError('Deduced parameter type PTC=11')
-            # if 'ptype' in locals():
-            #     fmt = ptype_values[ptype]
-            # else:
-            #     # print('No format deduced for parameter, aborting.')
-            #     logger.warning('No format deduced for parameter, aborting.')
-            #     return decoded
-        value = read_stream(tms, fmt)
 
-        if par[0] in ptype_parameters:
-            ptype = value
+        fixrep = par[-1]
+
+        # don't use fixrep in case of a TC, since it is only defined for TMs
+        if grp and fixrep and not tc:
+            value = fixrep
+            logger.debug('{} with fixrep={} used'.format(par[1], value))
+        else:
+            bits = par[5]
+            unaligned = bits % 8
+
+            value = read_stream(tms, fmt, offbi=bit_off)
+
+            bit_off = (bit_off + unaligned) % 8
+            # re-read byte if read position is bit-offset after previous parameter
+            if bit_off:
+                tms.seek(tms.tell() - 1)
+
+            decoded.append((value, par))
 
-        decoded.append((value, par))
         if grp != 0:
             skip = grp
             rep = value
             while rep > 0:
-                decoded = read_stream_recursive(tms, parameters[par_idx + 1:par_idx + 1 + grp], decoded)
+                decoded = read_stream_recursive(tms, parameters[par_idx + 1:par_idx + 1 + grp], decoded, bit_off=bit_off, tc=tc)
                 rep -= 1
 
     return decoded
 
 
 def tc_param_alias_reverse(paf, cca, val, pname=None):
+    """
+
+    :param paf:
+    :param cca:
+    :param val:
+    :param pname:
+    :return:
+    """
     if paf is not None:
         dbcon = scoped_session_idb
         que = 'SELECT pas_altxt from pas where pas_numbr="%s" and pas_alval="%s"' % (paf, val)
@@ -1230,28 +1665,47 @@ def tc_param_alias_reverse(paf, cca, val, pname=None):
 
 
 def get_pid_name(pid):
-    if isinstance(pid, str):
-        return pid
-    # que = 'SELECT pcf_descr from pcf where pcf_pid="{}"'.format(pid)
-    # dbcon = scoped_session_idb
-    # fetch = dbcon.execute(que).fetchall()
-    # dbcon.close()
-    # if len(fetch) != 0:
-    #     return fetch[0][0]
-    if pid in DP_IDS_TO_ITEMS:
-        return DP_IDS_TO_ITEMS[pid]
-    else:
-        logger.warning('Unknown datapool ID: {}'.format(pid))
-        return pid
+    """
+
+    :param pid:
+    :return:
+    """
+    # if isinstance(pid, str):
+    #     return pid
+    if isinstance(pid, int):
+        pids = [pid]
+
+    try:
+        names = [DP_IDS_TO_ITEMS[p] for p in pids]
+    except KeyError as err:
+        logger.warning('Unknown datapool ID')
+        raise err
+
+    # if pid in DP_IDS_TO_ITEMS:
+    #     return DP_IDS_TO_ITEMS[pid]
+    # else:
+    #     logger.warning('Unknown datapool ID: {}'.format(pid))
+    #     return pid
+    return names if len(names) > 1 else names[0]
 
 
 ##
 #  Format PID from I-DB value to int
 def pidfmt(val):
+    """
+
+    :param val:
+    :return:
+    """
     return int(val - pid_offset) if val is not None else None
 
 
 def pidfmt_reverse(val):
+    """
+
+    :param val:
+    :return:
+    """
     return int(val + pid_offset) if val is not None else None
 
 
@@ -1259,17 +1713,37 @@ def pidfmt_reverse(val):
 #  Calibrate raw parameter values
 #  @param pcf_name PCF_NAME
 #  @param rawval   Raw value of the parameter
-def get_calibrated(pcf_name, rawval, properties=None, numerical=False, dbcon=None):
+def get_calibrated(pcf_name, rawval, properties=None, numerical=False, dbcon=None, nocal=False, floatfmt=None):
+    """
+
+    :param pcf_name:
+    :param rawval:
+    :param properties:
+    :param numerical:
+    :param dbcon:
+    :param nocal:
+    :return:
+    """
     if properties is None:
-        dbcon = scoped_session_idb
-        que = 'SELECT pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_categ,pcf.pcf_curtx from pcf where pcf_name="%s"' % pcf_name
-        dbres = dbcon.execute(que)
-        fetch = dbres.fetchall()
-        dbcon.close()
-        if len(fetch) == 0:
-            return rawval[0]
 
-        ptc, pfc, categ, curtx = fetch[0]
+        # cache
+        if pcf_name in _pcf_cache:
+            if _pcf_cache[pcf_name] is None:
+                return rawval if isinstance(rawval, (int, float, str, bytes)) else rawval[0]
+            else:
+                ptc, pfc, categ, curtx = _pcf_cache[pcf_name]
+
+        else:
+            que = 'SELECT pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_categ,pcf.pcf_curtx from pcf where pcf_name="%s"' % pcf_name
+            dbres = scoped_session_idb.execute(que)
+            fetch = dbres.fetchall()
+            scoped_session_idb.close()
+            if len(fetch) == 0:
+                _pcf_cache[pcf_name] = None
+                return rawval if isinstance(rawval, (int, float, str, bytes)) else rawval[0]
+
+            ptc, pfc, categ, curtx = fetch[0]
+            _pcf_cache[pcf_name] = (ptc, pfc, categ, curtx)
 
     else:
         ptc, pfc, categ, curtx = properties
@@ -1277,23 +1751,33 @@ def get_calibrated(pcf_name, rawval, properties=None, numerical=False, dbcon=Non
     try:
         type_par = ptt(ptc, pfc)
     except NotImplementedError:
-        type_par = None
+        try:
+            return rawval if isinstance(rawval, (int, float)) else rawval[0]
+        except IndexError:
+            return rawval
 
     if type_par == timepack[0]:
-        #return timecal(rawval, 'uint:32,uint:15,uint:1')
         return timecal(rawval)
+    # elif categ == 'T' or type_par.startswith('ascii'):
+    #     return rawval
+    elif type_par.startswith('oct'):
+        return rawval.hex().upper()
     elif curtx is None:
         try:
-            return rawval if isinstance(rawval, int) else rawval[0]
-        except:
+            return rawval if isinstance(rawval, (int, float)) else rawval[0]
+        except IndexError:
             return rawval
     elif curtx is not None and categ == 'N':
-        # print('CALIBRATED!')
-        return get_cap_yval(pcf_name, rawval)
+        if nocal:
+            return rawval
+        else:
+            return get_cap_yval(pcf_name, rawval) if floatfmt is None else format(get_cap_yval(pcf_name, rawval), floatfmt)
     elif curtx is not None and categ == 'S':
-        if numerical:
+        if numerical or nocal:
             return rawval
         return get_txp_altxt(pcf_name, rawval)
+    else:
+        return rawval
 
 
 ##
@@ -1303,18 +1787,47 @@ def get_calibrated(pcf_name, rawval, properties=None, numerical=False, dbcon=Non
 #  @param pcf_name PCF_NAME
 #  @param xval     Raw value of the parameter
 def get_cap_yval(pcf_name, xval, properties=None, dbcon=None):
-    dbcon = scoped_session_idb
-    que = 'SELECT cap.cap_xvals,cap.cap_yvals from pcf left join cap on pcf.pcf_curtx=cap.cap_numbr\
-            where pcf.pcf_name="%s"' % pcf_name
-    dbres = dbcon.execute(que)
-    try:
-        xvals, yvals = np.array([x for x in zip(*dbres.fetchall())], dtype=float)
-        yval = np.interp(xval, xvals, yvals)
-    except IndexError:
-        yval = xval
-    finally:
-        dbcon.close()
-    return format(yval, 'g')
+    """
+
+    :param pcf_name:
+    :param xval:
+    :param properties:
+    :param dbcon:
+    :return:
+    """
+
+    # cache
+    if pcf_name in _cap_cache:
+        if _cap_cache[pcf_name] is None:
+            return xval
+        xvals, yvals = _cap_cache[pcf_name]
+
+    else:
+        que = 'SELECT cap.cap_xvals,cap.cap_yvals from pcf left join cap on pcf.pcf_curtx=cap.cap_numbr\
+                where pcf.pcf_name="%s"' % pcf_name
+        dbres = scoped_session_idb.execute(que)
+
+        try:
+            xvals, yvals = np.array([x for x in zip(*dbres.fetchall())], dtype=float)
+            if np.isnan(xvals).any() or np.isnan(yvals).any():
+                logger.error('Error in CAP support points for {}'.format(pcf_name))
+                _cap_cache[pcf_name] = None
+                return xval
+            sortidx = xvals.argsort()
+            xvals, yvals = xvals[sortidx], yvals[sortidx]  # make sure value pairs are sorted in x-ascending order
+            _cap_cache[pcf_name] = (xvals, yvals)
+        except IndexError:
+            return xval
+        finally:
+            scoped_session_idb.close()
+
+    yval = np.interp(xval, xvals, yvals, left=np.nan, right=np.nan)  # return NAN if outside defined calibration range
+
+    # if yval == np.nan:
+    #     logger.info('Calibration of {} failed. Value {} outside calibrated range {}-{}'.format(pcf_name, xval, xvals.min(), xvals.max()))
+
+    return yval  # format(yval, 'g')
+
 
 ##
 #  Textual calibration
@@ -1323,12 +1836,26 @@ def get_cap_yval(pcf_name, xval, properties=None, dbcon=None):
 #  @param pcf_name PCF_NAME
 #  @param alval    Raw value of the parameter
 def get_txp_altxt(pcf_name, alval, dbcon=None):
+    """
+
+    :param pcf_name:
+    :param alval:
+    :param dbcon:
+    :return:
+    """
+
+    # cache
+    if (pcf_name, alval) in _txp_cache:
+        altxt = _txp_cache[(pcf_name, alval)]
+        return altxt
+
     dbcon = scoped_session_idb
     que = 'SELECT txp.txp_altxt from pcf left join txp on pcf.pcf_curtx=txp.txp_numbr where\
             pcf.pcf_name="%s" and txp.txp_from=%s' % (pcf_name, alval if isinstance(alval, int) else alval[0])
     dbres = dbcon.execute(que)
     try:
         altxt, = dbres.fetchall()[0]
+        _txp_cache[(pcf_name, alval)] = altxt
     except IndexError:
         altxt = alval
     finally:
@@ -1345,8 +1872,16 @@ def get_txp_altxt(pcf_name, alval, dbcon=None):
 #  @param mode      Save as "binary" file or "hex" values with one packet per line
 #  @param st_filter Save only packets of this service type
 def Tmdump(filename, tmlist, mode='hex', st_filter=None, check_crc=False):
+    """
+
+    :param filename:
+    :param tmlist:
+    :param mode:
+    :param st_filter:
+    :param check_crc:
+    """
     if st_filter is not None:
-        tmlist = Tm_filter_st(tmlist, *st_filter)
+        tmlist = Tm_filter_st(tmlist, **st_filter)
 
     if check_crc:
         tmlist = (tm for tm in tmlist if not crc_check(tm))
@@ -1367,39 +1902,44 @@ def Tmdump(filename, tmlist, mode='hex', st_filter=None, check_crc=False):
         for tm in tmlist:
             try:
                 txtlist.append(Tmformatted(tm, separator='; '))
-            except:
+            except Exception as err:
+                # logger.warning(err)
                 txtlist.append(Tm_header_formatted(tm) + '; ' + str(tm[TM_HEADER_LEN:]))
         with open(filename, 'w') as f:
             f.write('\n'.join(txtlist))
 
 
-##
-#  Filter by service (sub-)type
-#
-#  Return list of TM packets filtered by service type and sub-type
-#  @param tmlist List of TM packets
-#  @param st     Service type
-#  @param        Service sub-type
-def Tm_filter_st(tmlist, st=None, sst=None, apid=None, sid=None, time_from=None, time_to=None, eventId=None,
-                 procId=None):
-    """From tmlist return list of packets with specified st,sst"""
-    # stsst=pack('2*uint:8',st,sst).bytes
-    # filtered=[tmlist[i] for i in np.argwhere([a==stsst for a in [i[7:9] for i in tmlist]]).flatten()]
-    if (st is not None) and (sst is not None):
-        tmlist = [tm for tm in tmlist if ((tm[7], tm[8]) == (st, sst))]
-
-    if sid is not None:
-        tmlist = [tm for tm in list(tmlist) if (tm[TM_HEADER_LEN] == sid or tm[TM_HEADER_LEN] + tm[TM_HEADER_LEN + 1] == sid)] # two possibilities for SID because of  different definition (length) for SMILE and CHEOPS
+def Tm_filter_st(tmlist, st=None, sst=None, apid=None, sid=None, time_from=None, time_to=None):
+    """
+    From tmlist return list of packets that match the specified criteria
+
+    :param tmlist:
+    :param st:
+    :param sst:
+    :param apid:
+    :param sid:
+    :param time_from:
+    :param time_to:
+    :return:
+    """
+
+    if st is not None:
+        tmlist = [tm for tm in tmlist if tm[7] == st]
+
+    if sst is not None:
+        tmlist = [tm for tm in tmlist if tm[8] == sst]
 
     if apid is not None:
-        tmlist = [tm for tm in list(tmlist) if ((struct.unpack('>H', tm[:2])[0] & 2047) == (apid))]
+        # tmlist = [tm for tm in list(tmlist) if ((struct.unpack('>H', tm[:2])[0] & 2047) == apid)]
+        tmlist = [tm for tm in list(tmlist) if (int.from_bytes(tm[:2], 'big') & 0x7FF) == apid]
 
-    if eventId is not None:
-        tmlist = [tm for tm in list(tmlist) if (struct.unpack('>H', tm[TM_HEADER_LEN:TM_HEADER_LEN + 2])[0] == eventId)]
+    if sid:
+        if st is None or sst is None or apid is None:
+            raise ValueError('Must provide st, sst and apid if filtering by sid')
 
-    if procId is not None:
-        tmlist = [tm for tm in list(tmlist) if
-                  (struct.unpack('>H', tm[TM_HEADER_LEN + 2:TM_HEADER_LEN + 4])[0] == procId)]
+        sid_offset, sid_bitlen = get_sid(st, sst, apid)
+        tobyte = sid_offset + sid_bitlen // 8
+        tmlist = [tm for tm in list(tmlist) if int.from_bytes(tm[sid_offset:tobyte], 'big') == sid]
 
     if time_from is not None:
         tmlist = [tm for tm in list(tmlist) if (time_from <= get_cuctime(tm))]
@@ -1410,6 +1950,66 @@ def Tm_filter_st(tmlist, st=None, sst=None, apid=None, sid=None, time_from=None,
     return tmlist
 
 
+def filter_rows(rows, st=None, sst=None, apid=None, sid=None, time_from=None, time_to=None, idx_from=None, idx_to=None,
+                tmtc=None, get_last=False):
+    """
+    Filter SQL query object by any of the given arguments, return filtered query.
+
+    :param rows:
+    :param st:
+    :param sst:
+    :param apid:
+    :param sid:
+    :param time_from:
+    :param time_to:
+    :param idx_from:
+    :param idx_to:
+    :param tmtc:
+    :param get_last:
+    """
+
+    if st is not None:
+        rows = rows.filter(DbTelemetry.stc == st)
+
+    if sst is not None:
+        rows = rows.filter(DbTelemetry.sst == sst)
+
+    if apid is not None:
+        rows = rows.filter(DbTelemetry.apid == apid)
+
+    if sid:
+        if st is None or sst is None or apid is None:
+            raise ValueError('Must provide st, sst and apid if filtering by sid')
+
+        sid_offset, sid_bitlen = get_sid(st, sst, apid)
+        if sid_offset != -1:
+            sid_size = sid_bitlen // 8
+            rows = rows.filter(
+                func.mid(DbTelemetry.data, sid_offset - TM_HEADER_LEN + 1, sid_size) == sid.to_bytes(sid_size, 'big'))
+        else:
+            logger.error('SID ({}) not applicable for {}-{}-{}'.format(sid, st, sst, apid))
+
+    if time_from is not None:
+        rows = rows.filter(func.left(DbTelemetry.timestamp, func.length(DbTelemetry.timestamp) - 1) >= time_from)
+
+    if time_to is not None:
+        rows = rows.filter(func.left(DbTelemetry.timestamp, func.length(DbTelemetry.timestamp) - 1) <= time_to)
+
+    if idx_from is not None:
+        rows = rows.filter(DbTelemetry.idx >= idx_from)
+
+    if idx_to is not None:
+        rows = rows.filter(DbTelemetry.idx <= idx_to)
+
+    if tmtc is not None:
+        rows = rows.filter(DbTelemetry.is_tm == tmtc)
+
+    if get_last:
+        rows = rows.order_by(DbTelemetry.idx.desc()).first()
+
+    return rows
+
+
 ##
 #  CRC check
 #
@@ -1417,12 +2017,20 @@ def Tm_filter_st(tmlist, st=None, sst=None, apid=None, sid=None, time_from=None,
 #  @param packet TM/TC packet or any bytestring or bitstring object to be CRCed.
 def crc_check(packet):
     """
-    This function returns True if the CRC result is non-zero
+    This function returns *True* if the CRC result is non-zero
+
+    :param packet:
+    :return:
     """
     return bool(crc(packet))
 
 
 def get_cuctime(tml):
+    """
+
+    :param tml:
+    :return:
+    """
     cuc_timestamp = None
     if tml is not None:
         if isinstance(tml, bytes):
@@ -1457,8 +2065,20 @@ def get_cuctime(tml):
     return cuc_timestamp
 
 
-def get_pool_rows(pool_name, dbcon=None):
-    dbcon = scoped_session_storage
+def get_pool_rows(pool_name, check_existence=False):
+    """
+
+    :param pool_name:
+    :param check_existence:
+    :return:
+    """
+    dbcon = scoped_session_storage()
+
+    if check_existence:
+        check = dbcon.query(DbTelemetryPool).filter(DbTelemetryPool.pool_name == pool_name)
+        if not check.count():
+            dbcon.close()
+            raise ValueError('Pool "{}" does not exist.'.format(pool_name))
 
     rows = dbcon.query(
         DbTelemetry
@@ -1474,14 +2094,28 @@ def get_pool_rows(pool_name, dbcon=None):
     return rows
 
 
-#  get values of parameter from HK packets
-def get_param_values(tmlist=None, hk=None, param=None, last=0, numerical=False):
+# get values of parameter from HK packets
+def get_param_values(tmlist=None, hk=None, param=None, last=0, numerical=False, tmfilter=True, pool_name=None, mk_array=True, nocal=False):
+    """
 
+    :param tmlist:
+    :param hk:
+    :param param:
+    :param last:
+    :param numerical:
+    :param tmfilter:
+    :param pool_name:
+    :param mk_array:
+    :param nocal:
+    :return:
+    """
     if param is None:
         return
 
-    # with self.poolmgr.lock:
-    dbcon = scoped_session_idb
+    if tmlist is None and pool_name is not None:
+        tmlist = get_pool_rows(pool_name, check_existence=True)
+
+    dbcon = scoped_session_idb()
     if hk is None:
         que = 'SELECT plf.plf_name,plf.plf_spid,plf.plf_offby,plf.plf_offbi,pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_unit,\
                    pcf.pcf_descr,pid.pid_apid,pid.pid_type,pid.pid_stype,pid.pid_descr,pid.pid_pi1_val from pcf\
@@ -1490,112 +2124,126 @@ def get_param_values(tmlist=None, hk=None, param=None, last=0, numerical=False):
         dbres = dbcon.execute(que)
         name, spid, offby, offbi, ptc, pfc, unit, descr, apid, st, sst, hk, sid = dbres.fetchall()[0]
         if not isinstance(tmlist, list):
-            tmlist = tmlist.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst, DbTelemetry.apid == apid,
-                                   func.mid(DbTelemetry.data, SID_OFFSET - TM_HEADER_LEN + 1, SID_SIZE) == struct.pack(SID_FORMAT[SID_SIZE], sid)).order_by(
-                DbTelemetry.idx.desc())
-            if tmlist is not None:
+            tmlist_rows = filter_rows(tmlist, st=st, sst=sst, apid=apid, sid=sid)
+            if tmlist_rows is not None:
                 if last > 1:
-                    tmlist_filt = [tm.raw for tm in tmlist[:last]]
+                    tmlist = [tm.raw for tm in tmlist_rows.yield_per(1000)[-last:]]
                 else:
-                    tmlist_filt = [tmlist.first().raw]
+                    tmlist = [tmlist_rows.order_by(DbTelemetry.idx.desc()).first().raw]
             else:
-                tmlist_filt = []
+                tmlist = []
         else:
-            if (st, sst) == (3, 25):
-                tmlist_filt = Hk_filter(tmlist, st, sst, apid, sid)[-last:]
-            else:
-                tmlist_filt = Tm_filter_st(tmlist, st=st, sst=sst, apid=apid)[-last:]
-        #ufmt = ptt['hk'][ptc][pfc]
+            sid = None if sid == 0 else sid
+
         ufmt = ptt(ptc, pfc)
+
     elif hk != 'User defined' and not hk.startswith('UDEF|'):
-        if not isinstance(param, int):
-            pass  # param=self.get_pid(param)
         que = 'SELECT pid_descr, pid_type,pid_stype,pid_pi1_val,pid_apid,plf.plf_name,plf.plf_spid,plf.plf_offby,plf.plf_offbi,\
                    pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_unit,pcf.pcf_descr,pcf.pcf_pid from pid left join plf on\
                    pid.pid_spid=plf.plf_spid left join pcf on plf.plf_name=pcf.pcf_name where\
                    pcf.pcf_descr="%s" and pid.pid_descr="%s"' % (param, hk)
         dbres = dbcon.execute(que)
         hkdescr, st, sst, sid, apid, name, spid, offby, offbi, ptc, pfc, unit, descr, pid = dbres.fetchall()[0]
-        if sid == 0:
-            sid = None
-        tmlist_filt = Tm_filter_st(tmlist, st=st, sst=sst, apid=apid, sid=sid)[-last:]
-        #ufmt = ptt['hk'][ptc][pfc]
+
+        sid = None if sid == 0 else sid
         ufmt = ptt(ptc, pfc)
 
     elif hk.startswith('UDEF|'):
-        label = hk.strip('UDEF|')
+        label = hk.replace('UDEF|', '')
         hkref = [k for k in user_tm_decoders if user_tm_decoders[k][0] == label][0]
         pktinfo = user_tm_decoders[hkref][1]
         parinfo = [x for x in pktinfo if x[1] == param][0]
         pktkey = hkref.split('-')
 
+        st = int(pktkey[0])
+        sst = int(pktkey[1])
         apid = int(pktkey[2]) if pktkey[2] != 'None' else None
-        sid = int(pktkey[3])
-        name, descr, _, offbi, ptc, pfc, unit, _, bitlen = parinfo
-
-        offby = sum(
-            [x[-1] for x in pktinfo[:pktinfo.index(parinfo)]]) // 8 + TM_HEADER_LEN  # +TM_HEADER_LEN for header!
-        st = 3
-        sst = 25
-        tmlist_filt = Hk_filter(tmlist, st, sst, apid, sid)[-last:]
-        #ufmt = ptt['hk'][ptc][pfc]
+        sid = int(pktkey[3]) if pktkey[3] != 'None' else None
+        # name, descr, _, offbi, ptc, pfc, unit, _, bitlen = parinfo
+        _, descr, ptc, pfc, curtx, bitlen, _, _, _, _, _ = parinfo
+        unit = None
+        name = None
+        offbi = 0
+
+        offby = sum([x[5] for x in pktinfo[:pktinfo.index(parinfo)]]) // 8 + TM_HEADER_LEN  # +TM_HEADER_LEN for header
+        # tmlist_filt = Tm_filter_st(tmlist, st, sst, apid, sid)[-last:] if tmfilter else tmlist[-last:]
         ufmt = ptt(ptc, pfc)
+
     else:
-        userpar = json.loads(cfg['ccs-plot_parameters'][param])
-        if ('SID' not in userpar.keys()) or (userpar['SID'] is None):
-            tmlist_filt = Tm_filter_st(tmlist, userpar['ST'], userpar['SST'], apid=userpar['APID'])[-last:]
-        else:
-            tmlist_filt = Tm_filter_st(tmlist, userpar['ST'], userpar['SST'], apid=userpar['APID'],
-                                            sid=userpar['SID'])[-last:]
+        userpar = json.loads(cfg[CFG_SECT_PLOT_PARAMETERS][param])
+        st = int(userpar['ST'])
+        sst = int(userpar['SST'])
+        apid = int(userpar['APID'])
+        sid = None if (('SID' not in userpar) or (userpar['SID'] is None)) else int(userpar['SID'])
+        # tmlist_filt = Tm_filter_st(tmlist, userpar['ST'], userpar['SST'], apid=userpar['APID'], sid=sid)[-last:] if tmfilter else tmlist[-last:]
         offby, ufmt = userpar['bytepos'], userpar['format']
-        if 'offbi' in userpar:
-            offbi = userpar['offbi']
-        else:
-            offbi = 0
+        offbi = userpar['offbi'] if 'offbi' in userpar else 0
         descr, unit, name = param, None, None
 
     bylen = csize(ufmt)
-    #print(tmlist_filt)
-    #tms = io.BytesIO(tmlist_filt)
+    tmlist_filt = Tm_filter_st(tmlist, st=st, sst=sst, apid=apid, sid=sid)[-last:] if tmfilter else tmlist[-last:]
+
     if name is not None:
         que = 'SELECT pcf.pcf_categ,pcf.pcf_curtx from pcf where pcf_name="%s"' % name
         dbres = dbcon.execute(que)
         fetch = dbres.fetchall()
+
+        if not fetch:
+            logger.error('Parameter {} not found in MIB.'.format(name))
+            return
+
         categ, curtx = fetch[0]
         xy = [(get_cuctime(tm),
                get_calibrated(name, read_stream(io.BytesIO(tm[offby:offby + bylen]), ufmt, offbi=offbi),
-                                   properties=[ptc, pfc, categ, curtx], numerical=numerical)) for tm in tmlist_filt]
+                              properties=[ptc, pfc, categ, curtx], numerical=numerical, nocal=True)) for tm in tmlist_filt]  # no calibration here, done below on array
 
     else:
         xy = [(get_cuctime(tm), read_stream(io.BytesIO(tm[offby:offby + bylen]), ufmt, offbi=offbi)) for tm in tmlist_filt]
+
     dbcon.close()
+
+    if not mk_array:
+        return xy, (descr, unit)
+
     try:
-        return np.array(np.array(xy).T, dtype='float'), (descr, unit)
-    except ValueError:
+        arr = np.array(np.array(xy).T, dtype='float')
+        # calibrate y values
+        if not nocal and name is not None:
+            get_cap_yval(name, arr[1, 0])  # calibrate one value to get name into _cap_cache
+            if _cap_cache[name] is None:
+                return arr, (descr, unit)
+            xvals, yvals = _cap_cache[name]
+            arr[1, :] = np.interp(arr[1, :], xvals, yvals, left=np.nan, right=np.nan)
+        return arr, (descr, unit)
+
+    except (ValueError, IndexError):
         return np.array(xy, dtype='float, U32'), (descr, unit)
 
 
-##
-#  Filter HK TMs by SID and APID
-#  @param tmlist List of TM(3,25) packets
-#  @param apid   APID by which to filter
-#  @param sid    SID by which to filter
 def Hk_filter(tmlist, st, sst, apid=None, sid=None):
-    # hks=self.Tm_filter_st(tmlist,3,25)
-    # hkfiltered=[tm for tm in hks if ccs.Tmread(tm)[3]==apid and tm[16]==sid]
+    """
 
-    if apid in (None, '') and sid not in (0, None):
-        return [tm for tm in tmlist if (
-                len(tm) > TM_HEADER_LEN and (tm[7], tm[8], tm[TM_HEADER_LEN]) == (st, sst, sid))]
-    elif sid not in (0, None):
-        return [tm for tm in tmlist if (
-                len(tm) > TM_HEADER_LEN and (tm[7], tm[8], struct.unpack('>H', tm[:2])[0] & 0b0000011111111111,
-                                             tm[TM_HEADER_LEN]) == (st, sst, apid, sid))]
+    :param tmlist:
+    :param st:
+    :param sst:
+    :param apid:
+    :param sid:
+    :return:
+    """
+    # if apid in (None, '') and sid not in (0, None):
+    #     return [tm for tm in tmlist if (
+    #             len(tm) > TM_HEADER_LEN and (tm[7], tm[8], tm[TM_HEADER_LEN]) == (st, sst, sid))]
+    # elif sid not in (0, None):
+    #     return [tm for tm in tmlist if (
+    #             len(tm) > TM_HEADER_LEN and (tm[7], tm[8], struct.unpack('>H', tm[:2])[0] & 0b0000011111111111,
+    #                                          tm[TM_HEADER_LEN]) == (st, sst, apid, sid))]
+    return Tm_filter_st(tmlist, st=st, sst=sst, apid=apid, sid=sid)
 
 
 def show_extracted_packet():
     """
-    Get packet data selected in poolviewer
+    Get packet data selected in Pool Viewer
+
     :return:
     """
     pv = dbus_connection('poolviewer', communication['poolviewer'])
@@ -1607,13 +2255,18 @@ def show_extracted_packet():
 
 
 def packet_selection():
-    """Alias for show_extracted_packet call"""
+    """
+    Alias for show_extracted_packet call
+
+    :return:
+    """
     return show_extracted_packet()
 
 
 def get_module_handle(module_name, instance=1, timeout=5):
     """
     Try getting the DBUS proxy object for the module_name module for timeout seconds.
+
     :param module_name:
     :param instance:
     :param timeout:
@@ -1622,6 +2275,8 @@ def get_module_handle(module_name, instance=1, timeout=5):
     if instance is None:
         instance = communication[module_name]
 
+    module = None
+
     t1 = time.time()
     while (time.time() - t1) < timeout:
         try:
@@ -1630,9 +2285,9 @@ def get_module_handle(module_name, instance=1, timeout=5):
             if module:
                 break
             else:
-                time.sleep(1.)
+                time.sleep(.2)
         except dbus.DBusException as err:
-            logger.warning(err)
+            logger.info(err)
             module = False
             time.sleep(0.5)
 
@@ -1643,10 +2298,54 @@ def get_module_handle(module_name, instance=1, timeout=5):
         return False
 
 
+def _get_ccs_dbus_names(exclude=None):
+    if exclude is None:
+        exclude = []
+
+    dbus_names = dbus.SessionBus().list_names()
+    ccs_names = [cfg['ccs-dbus_names'][mod] for mod in cfg['ccs-dbus_names'] if mod not in exclude]
+    ccs_modules = [mod for mod in dbus_names if mod.startswith(tuple(ccs_names))]
+
+    return ccs_modules
+
+
+def _quit_module(module_name, instance=1):
+    mod = get_module_handle(module_name, instance=instance)
+
+    if not mod:
+        logger.error('{}{} not found on DBus').format(module_name, instance)
+        return False
+
+    try:
+        mod.Functions('quit_func')
+        return True
+    except Exception as err:
+        logger.exception(err)
+        return False
+
+
+def _close_modules():
+    dbus_names = _get_ccs_dbus_names(exclude=['editor'])
+    while dbus_names:
+        print(dbus_names)
+        for module in dbus_names:
+            _, name, iid = module.split('.')
+            success = _quit_module(name, int(iid.replace('communication', '')))
+            if success:
+                logger.info('Closed {}'.format(module))
+            else:
+                logger.error('Could not close {}'.format(module))
+
+        dbus_names = _get_ccs_dbus_names(exclude=['editor'])
+
+    logger.info('Closed all modules')
+
+
 def connect(pool_name, host, port, protocol='PUS', is_server=False, timeout=10, delete_abandoned=False, try_delete=True,
             pckt_filter=None, options='', drop_rx=False, drop_tx=False):
     """
     Accessibility function for 'connect' in pus_datapool
+
     :param pool_name:
     :param host:
     :param port:
@@ -1685,9 +2384,11 @@ def connect(pool_name, host, port, protocol='PUS', is_server=False, timeout=10,
                                                                                  'override_with_options': '1'})})
 
 
-def connect_tc(pool_name, host, port, protocol='PUS', drop_rx=True, timeout=10, is_server=False, options=''):
+def connect_tc(pool_name, host, port, protocol='PUS', drop_rx=True, timeout=10, is_server=False, use_socket=None,
+               options=''):
     """
     Accessibility function for 'connect_tc' in pus_datapool
+
     :param pool_name:
     :param host:
     :param port:
@@ -1695,6 +2396,7 @@ def connect_tc(pool_name, host, port, protocol='PUS', drop_rx=True, timeout=10,
     :param protocol:
     :param timeout:
     :param is_server:
+    :param use_socket:
     :param options:
     :return:
     """
@@ -1707,7 +2409,8 @@ def connect_tc(pool_name, host, port, protocol='PUS', drop_rx=True, timeout=10,
                        'is_server': is_server,
                        'timeout': timeout,
                        'options': options,
-                       'drop_rx': drop_rx})
+                       'drop_rx': drop_rx,
+                       'use_socket': use_socket})
 
     pmgr.Functions('connect_tc', pool_name, host, port, {'kwargs': dbus.Dictionary({'options': kwarguments,
                                                                                     'override_with_options': '1'})})
@@ -1716,9 +2419,6 @@ def connect_tc(pool_name, host, port, protocol='PUS', drop_rx=True, timeout=10,
 ##
 #  TC send (DB)
 #
-#  Send a telecommand over _cncsocket_ to DPU/SEM. This function uses the I-DB to generate the properly formatted
-#  PUS packet. The TC is specified with the CCF_DESCR string (case sensitive!) _cmd_, followed by the corresponding
-#  number of arguments. The default TC acknowledgement behaviour can be overridden by passing the _ack_ argument.
 #  @param cmd       CCF_DESCR string of the TC to be issued
 #  @param args      Parameters required by the TC specified with _cmd_
 #  @param ack       Override the I-DB TC acknowledment value (4-bit binary string, e.g., '0b1011')
@@ -1726,10 +2426,28 @@ def connect_tc(pool_name, host, port, protocol='PUS', drop_rx=True, timeout=10,
 #  @param sleep     Idle time in seconds after the packet has been sent. Useful if function is called repeatedly in a
 #  loop to prevent too many packets are being sent over the socket in a too short time interval.
 def Tcsend_DB(cmd, *args, ack=None, pool_name=None, sleep=0., no_check=False, pkt_time=False, **kwargs):
-
-    pmgr = dbus_connection('poolmanager', communication['poolmanager'])
-    if not pmgr:
-        return
+    """
+    Build and send a TC packet whose structure is defined in the MIB. Note that for repeating parameter groups
+    the arguments are interleaved, e.g., ParID1, ParVal1, ParID2, ParVal2,... Use the function *interleave_lists*
+    to create a list ordered that way.
+
+    :param cmd: command name as specified in *CCF_DESCR*
+    :type cmd: str
+    :param args: unpacked list of (calibrated) TC parameter values, order is as specified in the MIB
+    :param ack: override acknowledge flags in PUS header
+    :type ack: int
+    :param pool_name:
+    :param sleep:
+    :param no_check:
+    :param pkt_time:
+    :param kwargs:
+    :return:
+    """
+    t1 = time.time()
+
+    pmgr = dbus_connection('poolmanager', communication['poolmanager'])
+    if not pmgr:
+        return
 
     try:
         tc, (st, sst, apid) = Tcbuild(cmd, *args, ack=ack, no_check=no_check, **kwargs)
@@ -1739,25 +2457,44 @@ def Tcsend_DB(cmd, *args, ack=None, pool_name=None, sleep=0., no_check=False, pk
     if pool_name is None:
         pool_name = pmgr.Variables('tc_name')
 
-    return _tcsend_common(tc, apid, st, sst, sleep=sleep, pool_name=pool_name, pkt_time=pkt_time)
+    sent = _tcsend_common(tc, apid, st, sst, pool_name=pool_name, pkt_time=pkt_time)
+
+    dt = time.time() - t1
+    time.sleep(max(sleep - dt, 0))
+
+    return sent
 
 
 ##
 #  Generate TC
-#
-#  Create TC bitstring for _cmd_ with corresponding parameters
-#  @param cmd  CCF_DESCR string of the requested TC
-#  @param args Parameters required by the cmd
-#  @param ack  Override the I-DB TC acknowledment value (4-bit binary string, e.g., '0b1011')
 def Tcbuild(cmd, *args, sdid=0, ack=None, no_check=False, hack_value=None, source_data_only=False, **kwargs):
+    """
+    Create TC bytestring for CMD with corresponding parameters
+
+    :param cmd: CCF_DESCR string of the requested TC
+    :param args: Parameters required by the cmd
+    :param sdid:
+    :param ack: Override the I-DB TC acknowledment value (4-bit binary, e.g., 0b1011)
+    :param no_check:
+    :param hack_value:
+    :param source_data_only:
+    :param kwargs:
+    :return:
+    """
     # with self.poolmgr.lock:
-    que = 'SELECT ccf_type,ccf_stype,ccf_apid,ccf_npars,cdf.cdf_grpsize,cdf.cdf_eltype,cdf.cdf_ellen,' \
-          'cdf.cdf_value,cpc.cpc_ptc,cpc.cpc_pfc,cpc.cpc_descr,cpc.cpc_pname FROM ccf LEFT JOIN cdf ON ' \
-          'cdf.cdf_cname=ccf.ccf_cname LEFT JOIN cpc ON cpc.cpc_pname=cdf.cdf_pname ' \
-          'WHERE BINARY ccf_descr="%s"' % cmd
-    dbcon = scoped_session_idb
-    params = dbcon.execute(que).fetchall()
-    dbcon.close()
+    # que = 'SELECT ccf_type,ccf_stype,ccf_apid,ccf_npars,cdf.cdf_grpsize,cdf.cdf_eltype,cdf.cdf_ellen,' \
+    #       'cdf.cdf_value,cpc.cpc_ptc,cpc.cpc_pfc,cpc.cpc_descr,cpc.cpc_pname FROM ccf LEFT JOIN cdf ON ' \
+    #       'cdf.cdf_cname=ccf.ccf_cname LEFT JOIN cpc ON cpc.cpc_pname=cdf.cdf_pname ' \
+    #       'WHERE BINARY ccf_descr="%s"' % cmd
+    # dbcon = scoped_session_idb
+    # params = dbcon.execute(que).fetchall()
+    # dbcon.close()
+
+    try:
+        params = _get_tc_params(cmd)
+    except SQLOperationalError:
+        scoped_session_idb.close()
+        params = _get_tc_params(cmd)
 
     try:
         st, sst, apid, npars = params[0][:4]
@@ -1772,6 +2509,9 @@ def Tcbuild(cmd, *args, sdid=0, ack=None, no_check=False, hack_value=None, sourc
     if npars == 0:
         pdata = b''
 
+        if source_data_only:
+            return pdata
+
     else:
         # check for padded parameters
         padded, = np.where(np.array([i[5] for i in params]) == 'A')
@@ -1818,6 +2558,9 @@ def Tcbuild(cmd, *args, sdid=0, ack=None, no_check=False, hack_value=None, sourc
 
             pdata = fix + var + fix2
 
+            if source_data_only:
+                return pdata
+
         else:
             if hack_value is None:
                 values = [tc_param_alias(p[-1], v, no_check=no_check) for p, v in zip_no_pad(params, args)]
@@ -1832,7 +2575,32 @@ def Tcbuild(cmd, *args, sdid=0, ack=None, no_check=False, hack_value=None, sourc
     return Tcpack(st=st, sst=sst, apid=int(apid), data=pdata, sdid=sdid, ack=ack, **kwargs), (st, sst, apid)
 
 
+def _get_tc_params(cmd, paf_cal=False):
+
+    if paf_cal:
+        que = 'SELECT ccf_type,ccf_stype,ccf_apid,ccf_npars,cdf.cdf_grpsize,cdf.cdf_eltype,cdf.cdf_ellen,' \
+              'cdf.cdf_value,cpc.cpc_ptc,cpc.cpc_pfc,cpc.cpc_descr,cpc.cpc_pname,cpc.cpc_pafref FROM ccf LEFT JOIN cdf ON ' \
+              'cdf.cdf_cname=ccf.ccf_cname LEFT JOIN cpc ON cpc.cpc_pname=cdf.cdf_pname ' \
+              'WHERE BINARY ccf_descr="%s"' % cmd
+    else:
+        que = 'SELECT ccf_type,ccf_stype,ccf_apid,ccf_npars,cdf.cdf_grpsize,cdf.cdf_eltype,cdf.cdf_ellen,' \
+              'cdf.cdf_value,cpc.cpc_ptc,cpc.cpc_pfc,cpc.cpc_descr,cpc.cpc_pname FROM ccf LEFT JOIN cdf ON ' \
+              'cdf.cdf_cname=ccf.ccf_cname LEFT JOIN cpc ON cpc.cpc_pname=cdf.cdf_pname ' \
+              'WHERE BINARY ccf_descr="%s"' % cmd
+
+    params = scoped_session_idb.execute(que).fetchall()
+    scoped_session_idb.close()
+    return params
+
+
 def encode_pus(params, *values, params_as_fmt_string=False):
+    """
+
+    :param params:
+    :param values:
+    :param params_as_fmt_string:
+    :return:
+    """
     if params_as_fmt_string or isinstance(params, str):
         return struct.pack(params, *values)
 
@@ -1868,7 +2636,14 @@ def encode_pus(params, *values, params_as_fmt_string=False):
 
 
 def pack_bytes(fmt, value, bitbuffer=0, offbit=0):
+    """
 
+    :param fmt:
+    :param value:
+    :param bitbuffer:
+    :param offbit:
+    :return:
+    """
     if fmt == 'I24':
         x = value.to_bytes(3, 'big')
 
@@ -1913,8 +2688,9 @@ def pack_bytes(fmt, value, bitbuffer=0, offbit=0):
 def date_to_cuc_bytes(date, sync=None):
     """
     Create CUC time bytes from date string.
-    @param date: date as ISO formatted string
-    @param sync: CUC sync flag, if None sync byte is omitted
+
+    :param date: date as ISO formatted string
+    :param sync: CUC sync flag, if None sync byte is omitted
     """
     if sync in [1, True]:
         sync = 'S'
@@ -1936,6 +2712,11 @@ def date_to_cuc_bytes(date, sync=None):
 # Returns the format of the input bytes for TC (list has to be formated the correct way)
 # @param parameters Input List of one parameter
 def parameter_ptt_type_tc(par):
+    """
+
+    :param par:
+    :return:
+    """
     return ptt(par[-4], par[-3])
 
 
@@ -1947,6 +2728,12 @@ def parameter_ptt_type_tc(par):
 #  @param sst  Service sub-type
 #  @param apid APID of TC
 def Tcack(cmd):
+    """
+    Get type acknowledgement type for give service (sub-)type and APID from I-DB
+
+    :param cmd:
+    :return:
+    """
     que = 'SELECT ccf_ack FROM ccf WHERE BINARY ccf_descr="{}"'.format(cmd)
     dbcon = scoped_session_idb
     ack = int(dbcon.execute(que).fetchall()[0][0])
@@ -1960,25 +2747,40 @@ def Tcack(cmd):
 #  @param param CPC_PNAME
 #  @param val   Parameter value
 def tc_param_alias(param, val, no_check=False):
-    que = 'SELECT cpc_prfref,cpc_ccaref,cpc_pafref,cpc_descr from cpc where cpc_pname="%s"' % param
+    """
+    Numerical/textual calibration and range check for value val of parameter param
+
+    :param param:
+    :param val:
+    :param no_check:
+    :return:
+    """
+    que = 'SELECT cpc_prfref,cpc_ccaref,cpc_pafref,cpc_descr,cpc_categ from cpc where cpc_pname="%s"' % param
     dbcon = scoped_session_idb
-    prf, cca, paf, pdesc = dbcon.execute(que).fetchall()[0]
+    prf, cca, paf, pdesc, categ = dbcon.execute(que).fetchall()[0]
     # this is a workaround for datapool items not being present in PAF/PAS table # DEPRECATED!
     # if param in ['DPP70004', 'DPP70043']:  # DataItemID in TC(211,1)
     #     val = get_pid(val)
     # else:
     #     pass
 
+    # check if parameter holds a data pool ID (categ=P) and look up numerical value in case it is given as string
+    if categ == 'P' and isinstance(val, str):
+        try:
+            val = DP_ITEMS_TO_IDS[val]
+        except KeyError:
+            raise KeyError('Unknown data pool item "{}"'.format(val))
+
     if (not no_check) and (prf is not None):
         in_range, error = tc_param_in_range(prf, val, pdesc)
         if not in_range:
             raise ValueError('Range check failed\n{}'.format(error))
         else:
             # subtract offset from PID to be compatible with IASW (CHEOPS only)
-            if param in ['DPP70004', 'DPP70043']:
+            if categ == 'P':
                 val -= pid_offset
     else:
-        if param in ['DPP70004', 'DPP70043']:
+        if categ == 'P':
             val -= pid_offset
 
     if paf is not None:
@@ -2014,50 +2816,48 @@ def tc_param_alias(param, val, no_check=False):
 
         return val
 
+
 ##
 #  Get PID
-#
-#  Translates name of Data pool variable to corresponding ID, based on I-DB entry
-#  @param paramname Name of the Data pool variables
+#  Translates name of data pool variable to corresponding ID, based on DP_ITEMS_TO_IDS look-up table
+#  @param paramname Name of the data pool variables
 def get_pid(parnames):
-    if isinstance(parnames, int):
-        return parnames
-    elif not isinstance(parnames, list):
+    """
+
+    :param parnames:
+    :return:
+    """
+    # if isinstance(parnames, int):
+    #     return parnames
+    if isinstance(parnames, str):
         parnames = [parnames]
 
-    if len(set(parnames)) != len(parnames):
-        msg = "Duplicate parameters will be ignored! {}".format(set([p for p in parnames if parnames.count(p) > 1]))
-        logger.warning(msg)
-        # print(msg)
+    # if len(set(parnames)) != len(parnames):
+    #     msg = "Duplicate parameters will be ignored! {}".format(set([p for p in parnames if parnames.count(p) > 1]))
+    #     logger.warning(msg)
 
-    que = 'SELECT pcf_descr,pcf_pid from pcf where BINARY pcf_descr in ({})'.format(', '.join(['"{}"'.format(p) for p in parnames]))
-    dbcon = scoped_session_idb
-    fetch = dbcon.execute(que).fetchall()
-    dbcon.close()
+    pids = [DP_ITEMS_TO_IDS[parname] for parname in parnames]
+
+    return pids if len(pids) > 1 else pids[0]
 
-    if len(fetch) == 1 and len(parnames) == 1:
-        return int(fetch[0][1]) if fetch[0][1] is not None else None  # not since IDBv2.1: - 212010000
-
-    elif len(fetch) >= 1:
-        descr, pid = zip(*fetch)
-        nopcf = [name for name in parnames if name not in descr]
-        if nopcf:
-            raise NameError("The following parameters are not in the database: {}".format(nopcf))
-        nopid = [name for name, p in fetch if p is None]
-        if nopid:
-            msg = "The following parameters have no PID: {}".format(nopid)
-            logger.warning(msg)
-            # print(msg)
-        sort_order = [parnames.index(d) for d in descr]
-        descr, pid = zip(*[x for _, x in sorted(zip(sort_order, fetch), key=lambda x: x[0])])
-        return descr, pid
 
+def get_sid(st, sst, apid):
+    """
+
+    :param st:
+    :param sst:
+    :param apid:
+    :return:
+    """
+    if (st, sst, apid) in SID_LUT:
+        return SID_LUT[(st, sst, apid)]
     else:
-        msg = 'Unknown datapool item(s) {}'.format(parnames)
-        # raise NameError(msg)
-        logger.error(msg)
-        # print(msg)
-        return None
+        try:
+            logger.warning('APID {} not known'.format(apid))
+            return SID_LUT[(st, sst, None)]
+        except KeyError:
+            return
+
 
 ##
 #  Parameter range check
@@ -2067,6 +2867,13 @@ def get_pid(parnames):
 #  @param val   Parameter value
 #  @param pdesc Parameter DESCR
 def tc_param_in_range(prf, val, pdesc):
+    """
+
+    :param prf:
+    :param val:
+    :param pdesc:
+    :return:
+    """
     que = 'SELECT prf_dspfmt,prf_radix,prv_minval,prv_maxval FROM prv INNER JOIN prf ON prf_numbr=prv_numbr WHERE prv_numbr="{}"'.format(prf)
     dbcon = scoped_session_idb
     prfs = dbcon.execute(que).fetchall()
@@ -2101,6 +2908,12 @@ def tc_param_in_range(prf, val, pdesc):
 #  @param params List of TC parameter properties
 #  @param args   List of supplied parameter values
 def zip_no_pad(params, args):
+    """
+
+    :param params:
+    :param args:
+    :return:
+    """
     # [params.pop(i) for i, j in enumerate(params) if j[-4] in ['SPARE', 'PAD']]
     params = [param for param in params if param[5] not in ['A', 'F']]
     return zip(params, args)
@@ -2124,8 +2937,29 @@ def zip_no_pad(params, args):
 #  @param destid  source/destination ID
 #  @param data    application data
 def Tmpack(data=b'', apid=321, st=1, sst=1, destid=0, version=0, typ=0, timestamp=0, dhead=1, gflags=0b11,
-           sc=None, tmv=PUS_VERSION, pktl=None, chksm=None, **kwargs):
+           sc=None, tmv=PUS_VERSION, tref_stat=0, msg_type_cnt=0, pktl=None, chksm=None, **kwargs):
+    """
+    Create TM packet conforming to PUS
 
+    :param data:
+    :param apid:
+    :param st:
+    :param sst:
+    :param destid:
+    :param version:
+    :param typ:
+    :param timestamp:
+    :param dhead:
+    :param gflags:
+    :param sc:
+    :param tmv:
+    :param tref_stat:
+    :param msg_type_cnt:
+    :param pktl:
+    :param chksm:
+    :param kwargs:
+    :return:
+    """
     if pktl is None:
         # pktl = len(data) * 8 + (TC_HEADER_LEN + PEC_LEN - 7)  # 7=-1(convention)+6(datahead)+2(CRC) # len(data) *8, data in bytes has to be bits
         pktl = len(data) + (TM_HEADER_LEN + PEC_LEN - 7)
@@ -2137,7 +2971,8 @@ def Tmpack(data=b'', apid=321, st=1, sst=1, destid=0, version=0, typ=0, timestam
             counters[int(str(apid))] += 1  # 0 is not allowed for seq cnt
 
     tm = PUSpack(version=version, typ=typ, dhead=dhead, apid=apid, gflags=gflags, sc=sc, pktl=pktl,
-                      tmv=tmv, st=st, sst=sst, sdid=destid, timestamp=timestamp, data=data, **kwargs)
+                 tmv=tmv, st=st, sst=sst, sdid=destid, timestamp=timestamp, tref_stat=tref_stat,
+                 msg_type_cnt=msg_type_cnt, data=data, **kwargs)
 
     if chksm is None:
         chksm = crc(tm)
@@ -2165,6 +3000,26 @@ def Tmpack(data=b'', apid=321, st=1, sst=1, destid=0, version=0, typ=0, timestam
 #  @param data    application data
 def Tcpack(data=b'', apid=0x14c, st=1, sst=1, sdid=0, version=0, typ=1, dhead=1, gflags=0b11, sc=None,
            tmv=PUS_VERSION, ack=0b1001, pktl=None, chksm=None, **kwargs):
+    """
+    Create TC packet conforming to PUS
+
+    :param data:
+    :param apid:
+    :param st:
+    :param sst:
+    :param sdid:
+    :param version:
+    :param typ:
+    :param dhead:
+    :param gflags:
+    :param sc:
+    :param tmv:
+    :param ack:
+    :param pktl:
+    :param chksm:
+    :param kwargs:
+    :return:
+    """
     if pktl is None:
         pktl = len(data) + (TC_HEADER_LEN + PEC_LEN - 7)  # 7=-1(convention)+6(datahead)+2(CRC)
 
@@ -2174,7 +3029,7 @@ def Tcpack(data=b'', apid=0x14c, st=1, sst=1, sdid=0, version=0, typ=1, dhead=1,
             sc += 1
             counters[int(str(apid))] += 1  # 0 is not allowed for seq cnt
     tc = PUSpack(version=version, typ=typ, dhead=dhead, apid=int(str(apid), 0), gflags=int(str(gflags), 0),
-                      sc=sc, pktl=pktl, tmv=tmv, ack=int(str(ack), 0), st=st, sst=sst, sdid=sdid, data=data, **kwargs)
+                 sc=sc, pktl=pktl, tmv=tmv, ack=int(str(ack), 0), st=st, sst=sst, sdid=sdid, data=data, **kwargs)
 
     if chksm is None:
         chksm = crc(tc)
@@ -2187,7 +3042,6 @@ def Tcpack(data=b'', apid=0x14c, st=1, sst=1, sdid=0, version=0, typ=1, dhead=1,
 ##
 #  Generate PUS packet
 #
-#  Create Bitstring conforming to PUS with no CRC appended, for details see PUS documentation
 #  @param version version number
 #  @param typ     packet type (TC/TM)
 #  @param dhead   data field header flag
@@ -2203,6 +3057,28 @@ def Tcpack(data=b'', apid=0x14c, st=1, sst=1, sdid=0, version=0, typ=1, dhead=1,
 #  @param data    application data
 def PUSpack(version=0, typ=0, dhead=0, apid=0, gflags=0b11, sc=0, pktl=0,
             tmv=PUS_VERSION, ack=0, st=0, sst=0, sdid=0, tref_stat=0, msg_type_cnt=0, timestamp=0, data=b'', **kwargs):
+    """
+    Create bytestring conforming to PUS with no CRC appended, for details see PUS documentation
+
+    :param version:
+    :param typ:
+    :param dhead:
+    :param apid:
+    :param gflags:
+    :param sc:
+    :param pktl:
+    :param tmv:
+    :param ack:
+    :param st:
+    :param sst:
+    :param sdid:
+    :param tref_stat:
+    :param msg_type_cnt:
+    :param timestamp:
+    :param data:
+    :param kwargs:
+    :return:
+    """
     if typ == 1 and dhead == 1:
         header = TCHeader()
     elif typ == 0 and dhead == 1:
@@ -2218,26 +3094,54 @@ def PUSpack(version=0, typ=0, dhead=0, apid=0, gflags=0b11, sc=0, pktl=0,
     header.bits.PKT_SEQ_CNT = sc
     header.bits.PKT_LEN = pktl
 
-    if typ == 1 and dhead == 1:
-        header.bits.CCSDS_SEC_HEAD_FLAG = 0
-        header.bits.PUS_VERSION = tmv
-        header.bits.ACK = ack
-        header.bits.SERV_TYPE = st
-        header.bits.SERV_SUB_TYPE = sst
-        header.bits.SOURCE_ID = sdid
-
-    if typ == 0 and dhead == 1:
-        header.bits.SPARE1 = 0
-        header.bits.PUS_VERSION = tmv
-        header.bits.SPARE2 = tref_stat
-        header.bits.SERV_TYPE = st
-        header.bits.SERV_SUB_TYPE = sst
-        header.bits.DEST_ID = sdid
-        ctime, ftime, sync = calc_timestamp(timestamp)
-        header.bits.CTIME = ctime
-        header.bits.FTIME = ftime
-        header.bits.TIMESYNC = sync
-        header.bits.SPARE = 0
+    # PUS-A
+    if PUS_VERSION == 1:
+        if typ == 1 and dhead == 1:
+            header.bits.CCSDS_SEC_HEAD_FLAG = 0
+            header.bits.PUS_VERSION = tmv
+            header.bits.ACK = ack
+            header.bits.SERV_TYPE = st
+            header.bits.SERV_SUB_TYPE = sst
+            header.bits.SOURCE_ID = sdid
+
+        elif typ == 0 and dhead == 1:
+            header.bits.SPARE1 = 0
+            header.bits.PUS_VERSION = tmv
+            header.bits.SPARE2 = 0
+            header.bits.SERV_TYPE = st
+            header.bits.SERV_SUB_TYPE = sst
+            header.bits.DEST_ID = sdid
+            ctime, ftime, sync = calc_timestamp(timestamp)
+            sync = 0 if sync is None else sync
+            header.bits.CTIME = ctime
+            header.bits.FTIME = ftime
+            header.bits.TIMESYNC = sync
+            # header.bits.SPARE = 0
+
+    # PUS-C
+    elif PUS_VERSION == 2:
+        if typ == 1 and dhead == 1:
+            header.bits.PUS_VERSION = tmv
+            header.bits.ACK = ack
+            header.bits.SERV_TYPE = st
+            header.bits.SERV_SUB_TYPE = sst
+            header.bits.SOURCE_ID = sdid
+
+        elif typ == 0 and dhead == 1:
+            header.bits.PUS_VERSION = tmv
+            header.bits.SC_REFTIME = tref_stat
+            header.bits.SERV_TYPE = st
+            header.bits.SERV_SUB_TYPE = sst
+            header.bits.MSG_TYPE_CNT = msg_type_cnt
+            header.bits.DEST_ID = sdid
+            ctime, ftime, sync = calc_timestamp(timestamp)
+            sync = 0 if sync is None else sync
+            header.bits.CTIME = ctime
+            header.bits.FTIME = ftime
+            header.bits.TIMESYNC = sync
+
+    else:
+        raise NotImplementedError('Invalid PUS version: {}'.format(PUS_VERSION))
 
     return bytes(header.bin) + data
 
@@ -2254,6 +3158,19 @@ def PUSpack(version=0, typ=0, dhead=0, apid=0, gflags=0b11, sc=0, pktl=0,
 #  @param grpsize Parameter group size
 #  @param repfac  Number of parameter (group) repetitions
 def build_packstr_11(st, sst, apid, params, varpos, grpsize, repfac, *args, no_check=False):
+    """
+
+    :param st:
+    :param sst:
+    :param apid:
+    :param params:
+    :param varpos:
+    :param grpsize:
+    :param repfac:
+    :param args:
+    :param no_check:
+    :return:
+    """
     ptypeindex = [i[-1] == FMT_TYPE_PARAM for i in params].index(True)  # check where fmt type defining parameter is
     ptype = args[varpos + ptypeindex::grpsize]
     args2 = list(args)
@@ -2306,8 +3223,8 @@ def _tcsend_common(tc_bytes, apid, st, sst, sleep=0., pool_name='LIVE', pkt_time
     # More specific Logging format that is compatible with the TST
     log_dict = dict([('st', st),('sst', sst),('ssc', ssc),('apid', apid),('timestamp', t)])
     json_string = '{} {}'.format('#SENT TC', json.dumps(log_dict))
-    logger.info(json_string)
-    time.sleep(sleep)
+    logger.debug(json_string)
+    # time.sleep(sleep)
     return apid, ssc, t
 
 
@@ -2316,6 +3233,12 @@ def _tcsend_common(tc_bytes, apid, st, sst, sleep=0., pool_name='LIVE', pkt_time
 #   @param string: <boolean> if true the CUC timestamp is returned as a string, otherwise as a float
 #   @return: <CUC> timestamp or None if failing
 def get_last_pckt_time(pool_name='LIVE', string=True):
+    """
+
+    :param pool_name:
+    :param string:
+    :return:
+    """
     pmgr = dbus_connection('poolmanager', communication['poolmanager'])
 
     if not pmgr:
@@ -2347,7 +3270,6 @@ def get_last_pckt_time(pool_name='LIVE', string=True):
         DbTelemetry.idx.desc()
     ).first()
     dbcon.close()
-
     if row is not None:
         packet = row.raw
     else:
@@ -2385,22 +3307,37 @@ def _has_tc_connection(pool_name, pmgr_handle):
         return False
 
 
-def Tcsend_bytes(tc_bytes, pool_name='LIVE'):
-
+def _get_pmgr_handle(tc_pool=None):
     pmgr = dbus_connection('poolmanager', communication['poolmanager'])
 
     if not pmgr:
         return False
 
     # check if pool is connected
-    if not _has_tc_connection(pool_name, pmgr):
+    if tc_pool is not None and not _has_tc_connection(tc_pool, pmgr):
         return False
 
+    return pmgr
+
+
+def Tcsend_bytes(tc_bytes, pool_name='LIVE', pmgr_handle=None):
+    """
+
+    :param tc_bytes:
+    :param pool_name:
+    :param pmgr_handle:
+    :return:
+    """
+    if not pmgr_handle:
+        pmgr = _get_pmgr_handle(pool_name)
+    else:
+        pmgr = pmgr_handle
+
     # Tell dbus with signature = that you send a byte array (ay), otherwise does not allow null bytes
     try:
         pmgr.Functions('tc_send', pool_name, tc_bytes, signature='ssay')
         return True
-    except dbus.DBusException:
+    except (dbus.DBusException, AttributeError):
         logger.error('Failed to send packet of length {} to {}!'.format(len(tc_bytes), pool_name))
         return False
     # logger.debug(msg)
@@ -2413,23 +3350,43 @@ def Tcsend_bytes(tc_bytes, pool_name='LIVE'):
 #  Send command to C&C socket
 #  @param pool_name Name of the pool bound to the socket for CnC/TC communication
 #  @param cmd         Command string to be sent to C&C socket
-def CnCsend(cmd, pool_name=None):
-    global counters  # One can only Change variable as global since we are static
+def CnCsend(cmd, pool_name=None, apid=1804):
+    """
 
-    pmgr = dbus_connection('poolmanager', communication['poolmanager'])
+    :param cmd:
+    :param pool_name:
+    :param apid:
+    :return:
+    """
+    global counters  # One can only Change variable as global since we are static
+    # pmgr = dbus_connection('poolmanager', communication['poolmanager'])
+    pmgr = get_module_handle('poolmanager')
     if pool_name is None:
         pool_name = pmgr.Variables('tc_name')
 
-    packed_data = CnCpack(data=cmd, sc=counters.setdefault(1804, 1))
+    pid = (apid >> 4) & 0x7F
+    cat = apid & 0xF
+    packed_data = CnCpack(data=cmd, pid=pid, cat=cat, sc=counters.setdefault(apid, 1))
 
-    logger.info('[CNC sent:]' + str(packed_data))
     received = pmgr.Functions('socket_send_packed_data', packed_data, pool_name, signature='says')
-    if received is not None:
-        counters[1804] += 1
-        received = bytes(received)  # convert dbus type to python type
-    logger.info('[CNC response:]' + str(received))
+    logger.info('[CNC sent:]' + str(packed_data))
+
+    try:
+        msg = bytes(received)
+    except TypeError as err:
+        logger.error(err)
+        return
+
+    if msg:
+        counters[apid] += 1
+        try:
+            msg = msg.decode('ascii', errors='replace')
+        except Exception as err:
+            logger.error(err)
+            return
 
-    return received
+        logger.info('[CNC response:] ' + msg)
+        return msg
 
 
 ##
@@ -2445,6 +3402,21 @@ def CnCsend(cmd, pool_name=None):
 #  @param gflags  Segmentation flags
 #  @param sc      Sequence counter
 def CnCpack(data=b'', version=0b011, typ=1, dhead=0, pid=112, cat=12, gflags=0b11, sc=0):
+    """
+
+    :param data:
+    :param version:
+    :param typ:
+    :param dhead:
+    :param pid:
+    :param cat:
+    :param gflags:
+    :param sc:
+    :return:
+    """
+    if isinstance(data, str):
+        data = data.encode('ascii')
+
     header = PHeader()
     header.bits.PKT_VERS_NUM = version
     header.bits.PKT_TYPE = typ
@@ -2454,7 +3426,7 @@ def CnCpack(data=b'', version=0b011, typ=1, dhead=0, pid=112, cat=12, gflags=0b1
     header.bits.PKT_SEQ_CNT = sc
     header.bits.PKT_LEN = len(data) - 1
 
-    return bytes(header.bin) + data.encode()
+    return bytes(header.bin) + data
 
 
 ##
@@ -2464,6 +3436,12 @@ def CnCpack(data=b'', version=0b011, typ=1, dhead=0, pid=112, cat=12, gflags=0b1
 #  @param data      Bytestring to be sent to socket
 #  @param pool_name Name of pool bound to Python socket for CnC/TC communication
 def Datasend(data, pool_name):
+    """
+
+    :param data:
+    :param pool_name:
+    :return:
+    """
     pmgr = dbus_connection('poolmanager', communication['poolmanager'])
 
     if not pmgr:
@@ -2480,6 +3458,14 @@ def Datasend(data, pool_name):
 #  @param param OCF_NAME
 #  @param val   Parameter value
 def Tm_limits_check(param, val, user_limit: dict = None, dbcon=None):
+    """
+
+    :param param:
+    :param val:
+    :param user_limit:
+    :param dbcon:
+    :return:
+    """
     if user_limit is not None:
         val = float(val)
         limits = [user_limit[i][0] <= val <= user_limit[i][1] for i in user_limit]
@@ -2522,6 +3508,12 @@ def Tm_limits_check(param, val, user_limit: dict = None, dbcon=None):
 #  @param string input string
 #  @param fmt    format specifier for conversion, 'I' for int, 'R' for float
 def str_to_num(string, fmt=None):
+    """
+
+    :param string:
+    :param fmt:
+    :return:
+    """
     if fmt == 'I':
         num = int(string)
     elif fmt == 'R':
@@ -2535,64 +3527,120 @@ def calc_param_crc(cmd, *args, no_check=False, hack_value=None):
     """
     Calculates the CRC over the packet source data (excluding the checksum parameter).
     Uses the same CRC algo as packet CRC and assumes the checksum is at the end of the packet source data.
-    @param cmd:
-    @param args:
-    @param no_check:
-    @param hack_value:
-    @return:
+
+    :param cmd:
+    :param args:
+    :param no_check:
+    :param hack_value:
+    :return:
     """
     pdata = Tcbuild(cmd, *args, no_check=no_check, hack_value=hack_value, source_data_only=True)
     return crc(pdata[:-PEC_LEN])
 
 
-def tc_load_to_memory(data, memid, mempos, slicesize=1000, sleep=0., ack=None, pool_name='LIVE'):
+def load_to_memory(data, memid, memaddr, max_pkt_size=1000, sleep=0.125, ack=0b1001, pool_name='LIVE', tcname=None,
+                   progress=True, calc_crc=True, byte_align=4):
     """
-    Function for loading large data to DPU memory. Splits the input _data_ into slices and sequentially sends them
-    to the specified location _memid_, _mempos_ by repeatedly calling the _Tcsend_DB_ function until
-    all _data_ is transferred.
+    Function for loading data to DPU memory. Splits the input _data_ into slices and sequentially sends them
+    to the specified location _memid_, _mempos_ by repeatedly calling the _Tcsend_bytes_ function until
+    all _data_ is transferred. Data is zero-padded if not aligned to _byte_align_ bytes.
 
-    :param data:  Data to be sent to memory. Can be a path to a file or bytestring or struct object
-    :param memid: Memory that data is sent to (e.g. 'DPU_RAM')
-    :param mempos: Memory start address the data should be patched to
-    :param slicesize: Size in bytes of the individual data slices, max=1000
-    :param sleep: Idle time in seconds between sending the individual TC packets
-    :param ack: Override the I-DB TC acknowledment value (4-bit binary string, e.g., '0b1011')
-    :param pool_name: connection through which to send the data
+    :param data:
+    :param memid:
+    :param memaddr:
+    :param max_pkt_size:
+    :param sleep:
+    :param ack:
+    :param pool_name:
+    :param tcname:
+    :param progress:
+    :param calc_crc:
+    :param byte_align:
     :return:
     """
+
     if not isinstance(data, bytes):
         if isinstance(data, str):
             data = open(data, 'rb').read()
         else:
-            data = data.bytes
+            raise TypeError('Data is not bytes or str')
+
+    if byte_align and (len(data) % byte_align):
+        logger.warning('Data is not {}-byte aligned, padding.'.format(byte_align))
+        data += bytes(byte_align - (len(data) % byte_align))
+
+    # get service 6,2 info from MIB
+    apid, memid_ref, fmt, endspares = _get_upload_service_info(tcname)
+    pkt_overhead = TC_HEADER_LEN + struct.calcsize(fmt) + len(endspares) + PEC_LEN
+    payload_len = max_pkt_size - pkt_overhead
 
-    cmd = get_tc_descr_from_stsst(6, 2)[0]
+    memid = get_mem_id(memid, memid_ref)
 
-    slices = [data[i:i + slicesize] for i in range(0, len(data), slicesize)]
-    if slicesize > 1000:
-        logger.warning('SLICESIZE > 1000 bytes, this is not gonna work!')
-    slicount = 1
+    # get permanent pmgr handle to avoid requesting one for each packet
+    pmgr = _get_pmgr_handle(tc_pool=pool_name)
+
+    data_size = len(data)
+    startaddr = memaddr
+
+    upload_bytes = b''
+    pcnt = 0
+    ptot = None
+
+    slices = [data[i:i + payload_len] for i in range(0, len(data), payload_len)]
+    if (payload_len + pkt_overhead) > MAX_PKT_LEN:
+        logger.warning('PKTSIZE > {} bytes, this might not work!'.format(MAX_PKT_LEN))
 
     for sli in slices:
         t1 = time.time()
-        parts = struct.unpack(len(sli) * 'B', sli)
-        Tcsend_DB(cmd, memid, mempos, len(parts), *parts, ack=ack, pool_name=pool_name)
-        sys.stdout.write('%i / %i packets sent to {}\r'.format(slicount, len(slices), memid))
-        logger.info('%i / %i packets sent to {}'.format(slicount, len(slices), memid))
-        slicount += 1
+
+        # create PUS packet
+        packetdata = struct.pack(fmt, memid, startaddr, len(sli)) + sli + endspares
+        seq_cnt = counters.setdefault(apid, 0)
+        puspckt = Tcpack(data=packetdata, st=6, sst=2, apid=apid, sc=seq_cnt, ack=ack)
+
+        if len(puspckt) > MAX_PKT_LEN:
+            logger.warning('Packet length ({}) exceeding MAX_PKT_LEN of {} bytes!'.format(len(puspckt), MAX_PKT_LEN))
+
+        Tcsend_bytes(puspckt, pool_name=pool_name, pmgr_handle=pmgr)
+        # collect all uploaded segments for CRC at the end
+        upload_bytes += sli
+        pcnt += 1
+
+        if progress:
+            if ptot is None:
+                ptot = int(np.ceil(data_size / len(sli)))  # packets needed to transfer data
+            print('{}/{} packets sent\r'.format(pcnt, ptot), end='')
+
         dt = time.time() - t1
-        if dt < sleep:
-            time.sleep(sleep - dt)
+        time.sleep(max(sleep - dt, 0))
 
-    return len(data)
+        startaddr += len(sli)
+        counters[apid] += 1
+
+    print('\nUpload finished, {} bytes sent in {} packets.'.format(len(upload_bytes), pcnt))
+
+    if calc_crc:
+        # return total length of uploaded data  and CRC over entire uploaded data
+        return len(upload_bytes), crc(upload_bytes)
 
 
 def get_tc_descr_from_stsst(st, sst):
-    res = scoped_session_idb.execute('SELECT ccf_descr FROM mib_smile_sxi.ccf where ccf_type={} and ccf_stype={}'.format(st, sst)).fetchall()
+    """
+
+    :param st:
+    :param sst:
+    :return:
+    """
+    res = scoped_session_idb.execute('SELECT ccf_descr FROM ccf where ccf_type={} and ccf_stype={}'.format(st, sst)).fetchall()
     return [x[0] for x in res]
 
 
 def bin_to_hex(fname, outfile):
+    """
+
+    :param fname:
+    :param outfile:
+    """
     # bash alternative: hexdump -e '16/1 "%3.2X"' fname > outfile
     bindata = open(fname, 'rb').read()
     buf = prettyhex(bindata)
@@ -2602,81 +3650,653 @@ def bin_to_hex(fname, outfile):
         logger.info('Wrote {} bytes as HEX-ASCII to {}.'.format(len(bindata), outfile))
 
 
-def source_to_srec(data, outfile, memaddr=0x40180000, header=None, bytes_per_line=32):
+def get_mem_id(memid, memid_ref):
     """
-    Generate srec file from source data
-    :param data:
-    :param outfile:
-    :param memaddr:
-    :param header:
-    :param bytes_per_line:
+
+    :param memid:
+    :param memid_ref:
     :return:
     """
+    if not isinstance(memid, int):
+        dbcon = scoped_session_idb
+        dbres = dbcon.execute('SELECT pas_alval from pas where pas_numbr="{}" and pas_altxt="{}"'.format(memid_ref, memid))
+        try:
+            memid, = dbres.fetchall()[0]
+        except IndexError:
+            que = 'SELECT pas_altxt from pas where pas_numbr="{}"'.format(memid_ref)
+            alvals = [x[0] for x in dbcon.execute(que).fetchall()]
+            raise ValueError('Invalid MemID "{}". Allowed values are: {}.'.format(memid, ', '.join(alvals)))
+        finally:
+            dbcon.close()
+        memid = int(memid)
 
-    def srec_chksum(x):
-        return sum(bytes.fromhex(x)) & 0xff ^ 0xff
+    return memid
 
-    if bytes_per_line > SREC_MAX_BYTES_PER_LINE:
-        logger.error("Maximum number of bytes per line is {}!".format(SREC_MAX_BYTES_PER_LINE))
-        return
 
-    if isinstance(data, str):
-        with open(data, 'r') as fd:
-            textdata = fd.read()
-        data = bytes.fromhex(textdata.replace('\n', ' '))
+#######################################################
+##
+#  Convert srec file to sequence of PUS packets (TM6,2) and save them in hex-files or send them to socket _tcsend_
+#  @param fname        Input srec file
+#  @param outname      Root name ouf the output files, if _None_, _fname_ is used
+#  @param memid        Memory ID packets are destined to, number or name (e.g. "DPU_RAM")
+#  @param memaddr      Memory start address where packets are patched to
+#  @param segid        Segment ID
+#  @param tcsend       Name of pool bound to TC socket to send the packets to, files are created instead if _False_
+#  @param linesperpack Number of lines in srec file to concatenate in one PUS packet
+#  @param pcount       Initial sequence counter for packets
+#  @param sleep        Timeout after each packet if packets are sent directly to socket
+def srectohex(fname, memid, memaddr, segid, tcsend=False, outname=None, linesperpack=61, pcount=0, sleep=0.,
+              source_only=False, add_memaddr_to_source=False):
+    """
 
-    if header is None:
-        fname = outfile.split('/')[-1][-60:]
-        header = 'S0{:02X}{:}'.format(len(fname.encode()) + 3, fname.encode().hex().upper())
-        header += '{:02X}'.format(srec_chksum(header[2:]))
+    :param fname:
+    :param memid:
+    :param memaddr:
+    :param segid:
+    :param tcsend:
+    :param outname:
+    :param linesperpack:
+    :param pcount:
+    :param sleep:
+    :param source_only:
+    :param add_memaddr_to_source:
+    :return:
+    """
+    source_list = []
+    if outname is None:
+        outname = fname.replace('.srec', '')
 
-    datalen = len(data)
-    data = io.BytesIO(data)
+    # get service 6,2 info from MIB
+    apid, memid_ref, fmt, endspares = _get_upload_service_info()
 
-    sreclist = []
-    terminator = 'S705{:08X}'.format(memaddr)
-    terminator += '{:02X}'.format(srec_chksum(terminator[2:]))
+    if not isinstance(memid, int):
+        dbcon = scoped_session_idb
+        dbres = dbcon.execute('SELECT pas_alval from pas where pas_numbr="{}" and pas_altxt="{}"'.format(memid_ref, memid))
+        try:
+            memid, = dbres.fetchall()[0]
+        except IndexError:
+            raise ValueError('MemID "{}" does not exist. Aborting.'.format(memid))
+        finally:
+            dbcon.close()
+        memid = int(memid)
 
-    while data.tell() < datalen:
-        chunk = data.read(bytes_per_line)
-        chunklen = len(chunk)
-        line = '{:02X}{:08X}{:}'.format(chunklen + 5, memaddr, chunk.hex().upper())
-        # add chksum according to SREC standard
-        line = 'S3' + line + '{:02X}'.format(srec_chksum(line))
-        sreclist.append(line)
-        memaddr += chunklen
+    f = open(fname, 'r').readlines()[1:]
+    lines = [p[12:-3] for p in f]
+    startaddr = int(f[0][4:12], 16)
 
-    with open(outfile, 'w') as fd:
-        fd.write(header + '\n')
-        fd.write('\n'.join(sreclist) + '\n')
-        fd.write(terminator)
+    # npacks=len(lines)//int(linesperpack)
+    if not isinstance(pcount, int):
+        pcount = 0
 
-    # print('Data written to file: "{}"'.format(outfile))
-    logger.info('Data written to file: "{}"'.format(outfile))
+    linecount = 0
+    while linecount < len(f) - 1:
 
-"""
-Test Function to get tm and tc from database tm
-"""
-def get_acute_tm_tc(description=None):
+        t1 = time.time()
 
-    if description is None:
-        test = scoped_session_idb.execute("SELECT * FROM smile_data_storage.tm "
-                                          "WHERE smile_data_storage.tm.pool_id = 40;").fetchall()
+        linepacklist = []
+        for n in range(linesperpack):
+            if linecount >= (len(lines) - 1):
+                break
+            linepacklist.append(lines[linecount])
+            linelength = len(lines[linecount]) // 2
+            if int(f[linecount + 1][4:12], 16) != (int(f[linecount][4:12], 16) + linelength):
+                linecount += 1
+                newstartaddr = int(f[linecount][4:12], 16)
+                break
+            else:
+                linecount += 1
+                newstartaddr = int(f[linecount][4:12], 16)
+
+        linepack = bytes.fromhex(''.join(linepacklist))
+        dlen = len(linepack)
+        data = struct.pack(SEG_HEADER_FMT, segid, startaddr, dlen // 4) + linepack + bytes(SEG_SPARE_LEN)
+        data = data + crc(data).to_bytes(SEG_CRC_LEN, 'big')
+        if source_only:
+            if add_memaddr_to_source:
+                source_list.append(prettyhex(memaddr.to_bytes(4, 'big') + data))
+            else:
+                source_list.append(prettyhex(data))
+            startaddr = newstartaddr
+            memaddr += len(data)
+            continue
+        packetdata = struct.pack('>HII', memid, memaddr, len(data)) + data
+        PUS = Tcpack(data=packetdata, st=6, sst=2, sc=pcount, apid=apid, ack=0b1001)
+        if len(PUS) > 1024:
+            logger.warning('Packet length ({:}) exceeding 1024 bytes!'.format(len(PUS)))
+        if tcsend:
+            Tcsend_bytes(PUS, pool_name=tcsend)
+            dt = time.time() - t1
+            time.sleep(max(sleep - dt, 0))
+        else:
+            with open(outname + '%04i.tc' % pcount, 'w') as ofile:
+                # ofile.write(PUS.hex.upper())
+                ofile.write(prettyhex(PUS))
+        startaddr = newstartaddr
+        # startaddr += dlen
+        memaddr += len(data)
+        pcount += 1
+    if source_only:
+        if add_memaddr_to_source:
+            source_list.append(prettyhex(memaddr.to_bytes(4, 'big') + bytes(12)))
+        else:
+            source_list.append(prettyhex(bytes(12)))
+        with open(outname + '_source.TC', 'w') as fd:
+            fd.write('\n'.join(source_list))
+        return
+    packetdata = struct.pack('>HII', memid, memaddr, 12) + bytes(12)
+    PUS = Tcpack(data=packetdata, st=6, sst=2, sc=pcount, apid=apid, ack=0b1001)
+    if tcsend:
+        Tcsend_bytes(PUS, pool_name=tcsend)
     else:
-        test = scoped_session_idb.execute("SELECT * FROM smile_data_storage.tm "
-                                          "WHERE smile_data_storage.tm.pool_id = 40;").fetchall()
+        with open(outname + '%04i.tc' % pcount, 'w') as ofile:
+            # ofile.write(PUS.hex.upper())
+            ofile.write(prettyhex(PUS))
 
-"""
-Test function ends
-"""
 
-def get_tc_list(ccf_descr=None):
+def srectosrecmod(input_srec, output_srec, imageaddr=0x40180000, linesperpack=61):
+    """
+    Repack source data from srec file into 'DBS structure' and save it to new srec file.
 
-    if ccf_descr is None:
-        cmds = scoped_session_idb.execute('SELECT ccf_cname, ccf_descr, ccf_descr2, ccf_type, ccf_stype, ccf_npars, '
-                                          'cpc_descr, cpc_dispfmt, cdf_eltype, cpc_pname, cdf_value, cpc_inter, '
-                                          'cpc_radix FROM ccf LEFT JOIN cdf ON cdf.cdf_cname=ccf.ccf_cname '
-                                          'LEFT JOIN cpc ON cpc.cpc_pname=cdf.cdf_pname '
+    :param input_srec:
+    :param output_srec:
+    :param imageaddr:
+    :param linesperpack:
+    :return:
+    """
+    # get source data from original srec and add memory address
+    srectohex(input_srec, outname='srec_binary', memaddr=0xDEADBEEF, source_only=True, linesperpack=linesperpack)
+
+    # write source data to new srec
+    source_to_srec('srec_binary_source.TC', output_srec, memaddr=imageaddr)
+
+
+def srec_to_s6(fname, memid, memaddr, segid, tcname=None, linesperpack=50, max_pkt_size=MAX_PKT_LEN, image_crc=True):
+    # get service 6,2 info from MIB
+    apid, memid_ref, fmt, endspares = _get_upload_service_info(tcname)
+    pkt_overhead = TC_HEADER_LEN + struct.calcsize(fmt) + SEG_HEADER_LEN + SEG_SPARE_LEN + SEG_CRC_LEN + len(
+        endspares) + PEC_LEN
+    payload_len = max_pkt_size - pkt_overhead
+
+    memid = get_mem_id(memid, memid_ref)
+
+    pckts = []
+
+    f = open(fname, 'r').readlines()[1:]
+    lines = [p[12:-3] for p in f]
+    data_size = len(''.join(lines)) // 2
+    startaddr = int(f[0][4:12], 16)
+
+    upload_bytes = b''
+    linecount = 0
+    bcnt = 0
+    pcnt = 0
+    ptot = None
+
+    while linecount < len(f) - 1:
+
+        t1 = time.time()
+
+        linepacklist = []
+        for n in range(linesperpack):
+            if linecount >= (len(lines) - 1):
+                break
+
+            if (len(''.join(linepacklist)) + len(lines[linecount])) // 2 > payload_len:  # ensure max_pkt_size
+                break
+
+            linepacklist.append(lines[linecount])
+            linelength = len(lines[linecount]) // 2
+            if int(f[linecount + 1][4:12], 16) != (int(f[linecount][4:12], 16) + linelength):
+                linecount += 1
+                newstartaddr = int(f[linecount][4:12], 16)
+                break
+            else:
+                linecount += 1
+                newstartaddr = int(f[linecount][4:12], 16)
+
+        linepack = bytes.fromhex(''.join(linepacklist))
+        dlen = len(linepack)
+        bcnt += dlen
+        # segment header, see IWF DBS HW SW ICD
+        data = struct.pack(SEG_HEADER_FMT, segid, startaddr, dlen // 4) + linepack + bytes(SEG_SPARE_LEN)
+        data = data + crc(data).to_bytes(SEG_CRC_LEN, 'big')
+
+        # create PUS packet
+        packetdata = struct.pack(fmt, memid, memaddr, len(data)) + data + endspares
+        seq_cnt = counters.setdefault(apid, 0)
+        puspckt = Tcpack(data=packetdata, st=6, sst=2, apid=apid, sc=seq_cnt, ack=0b1001)
+
+        if len(puspckt) > MAX_PKT_LEN:
+            logger.warning('Packet length ({}) exceeding MAX_PKT_LEN of {} bytes!'.format(len(puspckt), MAX_PKT_LEN))
+
+        pckts.append(puspckt)
+
+        # collect all uploaded segments for CRC at the end
+        upload_bytes += data
+        pcnt += 1
+
+        startaddr = newstartaddr
+        memaddr += len(data)
+        counters[apid] += 1
+
+    packetdata = struct.pack(fmt, memid, memaddr, 12) + bytes(12) + endspares
+    puspckt = Tcpack(data=packetdata, st=6, sst=2, apid=apid, sc=counters[apid], ack=0b1001)
+    counters[apid] += 1
+    pckts.append(puspckt)
+
+    if image_crc:
+        # return total length of uploaded data (without termination segment) and CRC over entire image, including segment headers
+        return pckts, len(upload_bytes), crc(upload_bytes)
+
+    return pckts
+
+
+def upload_srec(fname, memid, memaddr, segid, pool_name='LIVE', tcname=None, linesperpack=50, sleep=0.125,
+                max_pkt_size=MAX_PKT_LEN, progress=True, image_crc=True):
+    """
+    Upload data from an SREC file to _memid_ via S6,2
+
+    :param fname:
+    :param memid:
+    :param memaddr:
+    :param segid:
+    :param pool_name:
+    :param tcname:
+    :param linesperpack:
+    :param sleep:
+    :param max_pkt_size:
+    :param progress:
+    :param image_crc:
+    """
+    # get service 6,2 info from MIB
+    apid, memid_ref, fmt, endspares = _get_upload_service_info(tcname)
+    pkt_overhead = TC_HEADER_LEN + struct.calcsize(fmt) + SEG_HEADER_LEN + SEG_SPARE_LEN + SEG_CRC_LEN + len(endspares) + PEC_LEN
+    payload_len = max_pkt_size - pkt_overhead
+
+    memid = get_mem_id(memid, memid_ref)
+
+    # get permanent pmgr handle to avoid requesting one for each packet
+    pmgr = _get_pmgr_handle(tc_pool=pool_name)
+
+    f = open(fname, 'r').readlines()[1:]
+    lines = [p[12:-3] for p in f]
+    data_size = len(''.join(lines)) // 2
+    startaddr = int(f[0][4:12], 16)
+
+    upload_bytes = b''
+    linecount = 0
+    bcnt = 0
+    pcnt = 0
+    ptot = None
+
+    while linecount < len(f) - 1:
+
+        t1 = time.time()
+
+        linepacklist = []
+        for n in range(linesperpack):
+            if linecount >= (len(lines) - 1):
+                break
+
+            if (len(''.join(linepacklist)) + len(lines[linecount])) // 2 > payload_len:  # ensure max_pkt_size
+                break
+
+            linepacklist.append(lines[linecount])
+            linelength = len(lines[linecount]) // 2
+            if int(f[linecount + 1][4:12], 16) != (int(f[linecount][4:12], 16) + linelength):
+                linecount += 1
+                newstartaddr = int(f[linecount][4:12], 16)
+                break
+            else:
+                linecount += 1
+                newstartaddr = int(f[linecount][4:12], 16)
+
+        linepack = bytes.fromhex(''.join(linepacklist))
+        dlen = len(linepack)
+        bcnt += dlen
+        # segment header, see IWF DBS HW SW ICD
+        data = struct.pack(SEG_HEADER_FMT, segid, startaddr, dlen // 4) + linepack + bytes(SEG_SPARE_LEN)
+        data = data + crc(data).to_bytes(SEG_CRC_LEN, 'big')
+
+        # create PUS packet
+        packetdata = struct.pack(fmt, memid, memaddr, len(data)) + data + endspares
+        seq_cnt = counters.setdefault(apid, 0)
+        puspckt = Tcpack(data=packetdata, st=6, sst=2, apid=apid, sc=seq_cnt, ack=0b1001)
+
+        if len(puspckt) > MAX_PKT_LEN:
+            logger.warning('Packet length ({}) exceeding MAX_PKT_LEN of {} bytes!'.format(len(puspckt), MAX_PKT_LEN))
+
+        Tcsend_bytes(puspckt, pool_name=pool_name, pmgr_handle=pmgr)
+        # collect all uploaded segments for CRC at the end
+        upload_bytes += data
+        pcnt += 1
+
+        if progress:
+            if ptot is None:
+                ptot = int(np.ceil(data_size / dlen))  # packets needed to transfer SREC payload
+            print('{}/{} packets sent\r'.format(pcnt, ptot), end='')
+
+        dt = time.time() - t1
+        time.sleep(max(sleep - dt, 0))
+
+        startaddr = newstartaddr
+        memaddr += len(data)
+        counters[apid] += 1
+
+    # send all-zero termination segment of length 12
+    packetdata = struct.pack(fmt, memid, memaddr, 12) + bytes(12) + endspares
+    puspckt = Tcpack(data=packetdata, st=6, sst=2, apid=apid, sc=counters[apid], ack=0b1001)
+    Tcsend_bytes(puspckt, pool_name=pool_name, pmgr_handle=pmgr)
+    counters[apid] += 1
+
+    print('\nUpload finished, {} bytes sent in {}(+1) packets.'.format(bcnt, pcnt))
+
+    if image_crc:
+        # return total length of uploaded data (without termination segment) and CRC over entire image, including segment headers
+        return len(upload_bytes), crc(upload_bytes)
+
+
+def segment_data(data, segid, addr, seglen=480):
+    """
+    Split data into segments (as defined in IWF DPU HW SW ICD) with segment header and CRC.
+    Segment data has to be two-word aligned.
+
+    :param data:
+    :param segid:
+    :param addr:
+    :param seglen:
+    :return: list of segments
+    """
+
+    if isinstance(data, str):
+        data = open(data, 'rb').read()
+
+    if not isinstance(data, bytes):
+        raise TypeError
+        
+    datalen = len(data)
+    if datalen % 4:
+        raise ValueError('Data length is not two-word aligned')
+    data = io.BytesIO(data)
+    
+    segments = []
+    segaddr = addr
+    
+    while data.tell() < datalen:
+        chunk = data.read(seglen - (SEG_HEADER_LEN + SEG_SPARE_LEN + SEG_CRC_LEN))
+        chunklen = len(chunk)
+
+        if chunklen % 4:
+            raise ValueError('Segment data length is not two-word aligned')
+            
+        sdata = struct.pack(SEG_HEADER_FMT, segid, segaddr, chunklen // 4) + chunk + bytes(SEG_SPARE_LEN)
+        sdata += crc(sdata).to_bytes(SEG_CRC_LEN, 'big')
+        segments.append(sdata)
+        segaddr += chunklen
+
+    # add 12 byte termination segment
+    segments.append(bytes(SEG_HEADER_LEN))
+    
+    return segments
+
+
+def source_to_srec(data, outfile, memaddr, header=None, bytes_per_line=32, skip_bytes=0):
+    """
+
+    :param data:
+    :param outfile:
+    :param memaddr:
+    :param header:
+    :param bytes_per_line:
+    :param skip_bytes:
+    :return:
+    """
+
+    def srec_chksum(x):
+        """
+
+        :param x:
+        :return:
+        """
+        return sum(bytes.fromhex(x)) & 0xff ^ 0xff
+
+    if bytes_per_line > SREC_MAX_BYTES_PER_LINE:
+        raise ValueError("Maximum number of bytes per line is {}!".format(SREC_MAX_BYTES_PER_LINE))
+
+    if isinstance(data, str):
+        data = open(data, 'rb').read()
+        
+    if not isinstance(data, bytes):
+        raise TypeError
+
+    data = data[skip_bytes:]
+
+    if header is None:
+        fname = outfile.split('/')[-1][-60:]
+        header = 'S0{:02X}0000{:}'.format(len(fname.encode('ascii')) + 3, fname.encode('ascii').ljust(24).hex().upper())
+        header += '{:02X}'.format(srec_chksum(header[2:]))
+
+    datalen = len(data)
+    data = io.BytesIO(data)
+
+    sreclist = []
+    terminator = 'S705{:08X}'.format(memaddr)
+    terminator += '{:02X}'.format(srec_chksum(terminator[2:]))
+
+    while data.tell() < datalen:
+        chunk = data.read(bytes_per_line)
+        chunklen = len(chunk)
+        line = '{:02X}{:08X}{:}'.format(chunklen + 5, memaddr, chunk.hex().upper())
+        # add chksum according to SREC standard
+        line = 'S3' + line + '{:02X}'.format(srec_chksum(line))
+        sreclist.append(line)
+        memaddr += chunklen
+
+    with open(outfile, 'w') as fd:
+        fd.write(header + '\n')
+        fd.write('\n'.join(sreclist) + '\n')
+        fd.write(terminator)
+
+    print('Data written to file: "{}", skipped first {} bytes.'.format(outfile, skip_bytes))
+    logger.info('Data written to file: "{}", skipped first {} bytes.'.format(outfile, skip_bytes))
+
+
+def srec_direct(fname, memid, pool_name='LIVE', max_pkt_size=MAX_PKT_LEN, tcname=None, sleep=0.125, progress=True,
+                image_crc=True, byte_align=2, ack=0b1001, dryrun=False):
+    """
+    Upload data from SREC file directly to memory _memid_, no additional segment headers (like for DBS) are added.
+
+    :param fname:
+    :param memid:
+    :param pool_name:
+    :param max_pkt_size:
+    :param tcname:
+    :param sleep:
+    :param progress:
+    :param image_crc:
+    :param byte_align:
+    :param ack:
+    :param dryrun:
+    :return:
+    """
+    if dryrun:
+        print('DRYRUN -- NO PACKETS ARE BEING SENT!')
+
+    # get service 6,2 info from MIB
+    apid, memid_ref, fmt, endspares = _get_upload_service_info(tcname)
+    pkt_overhead = TC_HEADER_LEN + struct.calcsize(fmt) + len(endspares) + PEC_LEN
+    payload_len = max_pkt_size - pkt_overhead
+
+    memid = get_mem_id(memid, memid_ref)
+
+    # get permanent pmgr handle to avoid requesting one for each packet
+    if not dryrun:
+        pmgr = _get_pmgr_handle(tc_pool=pool_name)
+
+    upload_bytes = b''
+    bcnt = 0
+    pcnt = 0
+    ptot = None
+
+    f = open(fname, 'r').readlines()[1:-1]  # omit header and footer line
+    lines = [p[12:-3] for p in f]
+    data_size = len(''.join(lines)) // 2
+    memaddr = int(f[0][4:12], 16)
+
+    linecount = 0
+    nextlinelength = len(lines[linecount]) // 2
+    while linecount < len(f) - 1:
+
+        t1 = time.time()
+
+        linepacklist = []
+        packlen = 0
+        while (packlen + nextlinelength) <= payload_len:
+            if linecount >= (len(lines) - 1):
+                break
+            linepacklist.append(lines[linecount])
+            linelength = len(lines[linecount]) // 2
+            packlen += linelength
+            if int(f[linecount + 1][4:12], 16) != (int(f[linecount][4:12], 16) + linelength):
+                linecount += 1
+                newstartaddr = int(f[linecount][4:12], 16)
+                break
+            else:
+                linecount += 1
+                newstartaddr = int(f[linecount][4:12], 16)
+
+            nextlinelength = len(lines[linecount]) // 2
+
+        data = bytes.fromhex(''.join(linepacklist))
+
+        dlen = len(data)
+        bcnt += dlen
+
+        # create PUS packet
+        packetdata = struct.pack(fmt, memid, memaddr, len(data)) + data + endspares
+        seq_cnt = counters.setdefault(apid, 0)
+        puspckt = Tcpack(data=packetdata, st=6, sst=2, apid=apid, sc=seq_cnt, ack=ack)
+
+        if len(puspckt) > MAX_PKT_LEN:
+            logger.warning('Packet length ({}) exceeding MAX_PKT_LEN of {} bytes!'.format(len(puspckt), MAX_PKT_LEN))
+
+        if not dryrun:
+            Tcsend_bytes(puspckt, pool_name=pool_name, pmgr_handle=pmgr)
+
+        # collect all uploaded segments for CRC at the end
+        upload_bytes += data
+        pcnt += 1
+
+        if progress:
+            if ptot is None:
+                ptot = int(np.ceil(data_size / dlen))  # packets needed to transfer SREC payload
+            print('{}/{} packets sent\r'.format(pcnt, ptot), end='')
+
+        dt = time.time() - t1
+        time.sleep(max(sleep - dt, 0))
+
+        if data == b'':
+            print('No data left, exit upload.')
+            return
+
+        memaddr = newstartaddr
+        if not dryrun:
+            counters[apid] += 1
+
+    # check if entire data is x-byte-aligned
+    if len(upload_bytes) % byte_align:
+        padding = byte_align - (len(upload_bytes) % byte_align)
+        print('\nData is not {}-byte aligned. Sending padding data ({})'.format(byte_align, padding))
+
+        # create PUS packet
+        packetdata = struct.pack(fmt, memid, memaddr, padding) + bytes(padding) + endspares
+        seq_cnt = counters.setdefault(apid, 0)
+        puspckt = Tcpack(data=packetdata, st=6, sst=2, apid=apid, sc=seq_cnt, ack=ack)
+
+        if not dryrun:
+            Tcsend_bytes(puspckt, pool_name=pool_name, pmgr_handle=pmgr)
+            counters[apid] += 1
+
+        memaddr += padding
+        upload_bytes += bytes(padding)
+        bcnt += padding
+        pcnt += 1
+
+    print('\nUpload finished, {} bytes sent in {} packets.'.format(bcnt, pcnt))
+
+    if image_crc:
+        # return total length of uploaded data (without termination segment) and CRC over entire image, including segment headers
+        return len(upload_bytes), crc(upload_bytes)
+
+
+def _get_upload_service_info(tcname=None):
+    """
+    Get info about service 6,2 from MIB
+
+    :param tcname:
+    :return:
+    """
+    if tcname is None:
+        cmd = get_tc_descr_from_stsst(6, 2)[0]
+    else:
+        cmd = tcname
+
+    params = _get_tc_params(cmd, paf_cal=True)
+
+    apid = params[0][2]
+
+    # try to find paf_ref for MEMID
+    try:
+        memid_ref = [p[-1] for p in params if p[-1] is not None][0]
+    except KeyError:
+        memid_ref = None
+
+    # get format info for fixed block
+    fmt = '>'
+    idx = 0
+    for par in params:
+        fmt += ptt(*par[8:10])
+        if par[4] != 0:
+            idx = params.index(par)
+            break
+
+    # check for spares after variable part
+    endspares = b''
+    for par in params[idx:]:
+        if par[5] == 'A':
+            endspares += bytes(par[6] // 8)
+
+    return apid, memid_ref, fmt, endspares
+
+"""
+Test Function to get tm and tc from database tm
+"""
+def get_acute_tm_tc(description=None):
+
+    if description is None:
+        test = scoped_session_idb.execute("SELECT * FROM smile_data_storage.tm "
+                                          "WHERE smile_data_storage.tm.pool_id = 40;").fetchall()
+    else:
+        test = scoped_session_idb.execute("SELECT * FROM smile_data_storage.tm "
+                                          "WHERE smile_data_storage.tm.pool_id = 40;").fetchall()
+
+"""
+Test function ends
+"""
+
+
+
+def get_tc_list(ccf_descr=None):
+    """
+
+    :param ccf_descr:
+    :return:
+    """
+    if ccf_descr is None:
+        cmds = scoped_session_idb.execute('SELECT ccf_cname, ccf_descr, ccf_descr2, ccf_type, ccf_stype, ccf_npars, '
+                                          'cpc_descr, cpc_dispfmt, cdf_eltype, cpc_pname, cdf_value, cpc_inter, '
+                                          'cpc_radix FROM ccf LEFT JOIN cdf ON cdf.cdf_cname=ccf.ccf_cname '
+                                          'LEFT JOIN cpc ON cpc.cpc_pname=cdf.cdf_pname '
                                           'ORDER BY SUBSTRING(ccf_cname, 1, 2), ccf_type, ccf_stype, ccf_cname').fetchall()
     else:
         cmds = scoped_session_idb.execute('SELECT ccf_cname, ccf_descr, ccf_descr2, ccf_type, ccf_stype, ccf_npars, '
@@ -2696,7 +4316,11 @@ def get_tc_list(ccf_descr=None):
 
 
 def get_tc_calibration_and_parameters(ccf_descr=None):
+    """
 
+    :param ccf_descr:
+    :return:
+    """
     if ccf_descr is None:
         calibrations = scoped_session_idb.execute('SELECT ccf_cname, ccf_descr, cdf_eltype, cdf_descr, cdf_ellen, '
                                                   'cdf_value, cdf_pname, cpc_descr, cpc_categ, cpc_ptc, '
@@ -2728,9 +4352,16 @@ def get_tc_calibration_and_parameters(ccf_descr=None):
     return calibrations_dict
 
 
-def get_tm_parameter_list(st, sst, apid, pi1val):
-    que = 'SELECT pid_spid, pid_tpsd FROM pid WHERE pid_type={} AND pid_stype={} AND pid_apid={} AND pid_pi1_val={}'.format(st, sst, apid, pi1val)
-    spid, tpsd = scoped_session_idb.execute(que).fetchall()[0]
+def get_tm_parameter_list(st, sst, apid=None, pi1val=0):
+    """
+
+    :param st:
+    :param sst:
+    :param apid:
+    :param pi1val:
+    :return:
+    """
+    spid, tpsd = _get_spid(st, sst, apid=apid, pi1val=pi1val)
 
     if tpsd == -1:
         que = 'SELECT plf_name, pcf_descr, plf_offby, pcf_ptc, pcf_pfc FROM plf LEFT JOIN pcf ON plf_name=pcf_name WHERE plf_spid={} ORDER BY plf_offby, plf_offbi'.format(spid)
@@ -2743,14 +4374,24 @@ def get_tm_parameter_list(st, sst, apid, pi1val):
 
 
 def get_tm_parameter_info(pname):
-    que = 'SELECT ocp_lvalu, ocp_hvalu, ocp_type, txp_from, txp_altxt FROM pcf LEFT JOIN ocp ON pcf_name=ocp_name LEFT JOIN txp ON pcf_curtx=txp_numbr WHERE pcf_name="{}" ORDER BY txp_from, ocp_pos'.format(pname)
+    """
+
+    :param pname:
+    :return:
+    """
+    que = 'SELECT ocp_lvalu, ocp_hvalu, ocp_type, txp_from, txp_altxt FROM pcf LEFT JOIN ocp ON pcf_name=ocp_name ' \
+          'LEFT JOIN txp ON pcf_curtx=txp_numbr WHERE pcf_name="{}" ORDER BY txp_from, ocp_pos'.format(pname)
     res = scoped_session_idb.execute(que).fetchall()
 
     return res
 
-#
 
 def get_tm_id(pcf_descr=None):
+    """
+
+    :param pcf_descr:
+    :return:
+    """
     if pcf_descr is None:
         tms = scoped_session_idb.execute('SELECT pid_type, pid_stype, pid_apid, pid_pi1_val, pid_descr, pid_tpsd, '
                                          'pid_spid, pcf_name, pcf_descr, pcf_curtx, txp_from, txp_altxt, plf_offby,'
@@ -2795,24 +4436,87 @@ def get_tm_id(pcf_descr=None):
     return tms_dict
 
 
-def get_data_pool_items(pcf_descr=None, src_file=None):
+def get_tm_parameter_sizes(st, sst, apid=None, pi1val=0):
+    """
+    Returns a list of parameters and their sizes. For variable length TMs only the first fixed part is considered.
+
+    :param st:
+    :param sst:
+    :param apid:
+    :param pi1val:
+    :return:
+    """
+
+    spid, tpsd = _get_spid(st, sst, apid=apid, pi1val=pi1val)
+
+    if tpsd == -1:
+        que = 'SELECT plf_name, pcf_descr, pcf_ptc, pcf_pfc, NULL FROM plf LEFT JOIN pcf ON plf_name=pcf_name WHERE plf_spid={} ORDER BY plf_offby, plf_offbi'.format(spid)
+    else:
+        que = 'SELECT vpd_name, pcf_descr, pcf_ptc, pcf_pfc, vpd_grpsize FROM vpd LEFT JOIN pcf ON vpd_name=pcf_name WHERE vpd_tpsd={} ORDER BY vpd_pos'.format(tpsd)
+
+    res = scoped_session_idb.execute(que).fetchall()
+
+    pinfo = []
+    for p in res:
+        pinfo.append((p[1], csize(ptt(*p[2:4]))))
+        # break after first "counter" parameter
+        if p[-1] != 0:
+            break
+
+    return pinfo
+
+
+def _get_spid(st, sst, apid=None, pi1val=0):
+    """
+
+    :param st:
+    :param sst:
+    :param apid:
+    :param pi1val:
+    :return:
+    """
+    if apid is None:
+        apid = ''
+    else:
+        apid = ' AND pid_apid={}'.format(apid)
+
+    que = 'SELECT pid_spid, pid_tpsd FROM pid WHERE pid_type={} AND pid_stype={}{} AND pid_pi1_val={}'.format(st, sst, apid, pi1val)
+    spid, tpsd = scoped_session_idb.execute(que).fetchall()[0]
+
+    return spid, tpsd
+
+
+def get_data_pool_items(pcf_descr=None, src_file=None, as_dict=False):
+    """
+
+    :param pcf_descr:
+    :param src_file:
+    :param as_dict:
+    :return:
+    """
     if not isinstance(src_file, (str, type(None))):
         raise TypeError('src_file must be str, is {}.'.format(type(src_file)))
 
     if src_file:
         with open(src_file, 'r') as fd:
-            lines = fd.readlines()
+            lines = fd.readlines()[2:]  # skip first two header rows
         data_pool = []
         for line in lines:
             if not line.startswith('#'):
                 dp_item = line.strip().split('|')
                 # check for format
-                if len(dp_item) == 6:
-                    data_pool.append(dp_item[:2][::-1] + dp_item[2:])
+                if len(dp_item) == 9:
+                    data_pool.append(dp_item[:2][::-1] + [dp_item[2]] + [dp_item[4]] + dp_item[6:8])  # PID, NAME, TYPE, MULT, VALUE, DESCR
                 else:
                     raise ValueError('Wrong format of input line in {}.'.format(src_file))
 
-        return data_pool
+        if as_dict:
+            data_pool_dict = {int(row[0]): {'descr': row[1], 'fmt': fmtlist[row[2]]} for row in data_pool if row[2] in fmtlist}
+            if len(data_pool_dict) != len(data_pool):
+                logger.warning('Data pool items were rejected because of unknown format ({})'.format(len(data_pool) - len(data_pool_dict)))
+            return data_pool_dict
+        else:
+            return data_pool, src_file
 
     elif pcf_descr is None and not src_file:
         data_pool = scoped_session_idb.execute('SELECT pcf_pid, pcf_descr, pcf_ptc, pcf_pfc '
@@ -2824,14 +4528,28 @@ def get_data_pool_items(pcf_descr=None, src_file=None):
 
     scoped_session_idb.close()
 
-    data_pool_dict = {}
+    if not as_dict:
+        return data_pool, src_file
 
-    for row in data_pool:
-        data_pool_dict.setdefault(row[0:4], []).append(row[5:])
+    data_pool_dict = {int(row[0]): {'descr': row[1], 'fmt': ptt(row[2], row[3])} for row in data_pool}
+
+    # for row in data_pool:
+    #     data_pool_dict.setdefault(row[0:4], []).append(row[5:])
 
     return data_pool_dict
 
 
+def get_dp_fmt_info(dp_name):
+    """
+
+    :param dp_name:
+    :return:
+    """
+    que = 'SELECT pcf_name FROM pcf where pcf_pid is not NULL and pcf_descr="{}"'.format(dp_name)
+    mib_name = scoped_session_idb.execute(que).fetchall()[0]
+    return mib_name
+
+
 # def get_dp_items(source='mib'):
 #     fmt = {3: {4: 'UINT8', 12: 'UINT16', 14: 'UINT32'}, 4: {4: 'INT8', 12: 'INT16', 14: 'INT32'}, 5: {1: 'FLOAT'}, 9: {18: 'CUC'}, 7: {1: '1OCT'}}
 #
@@ -2844,9 +4562,18 @@ def get_data_pool_items(pcf_descr=None, src_file=None):
 
 
 def make_tc_template(ccf_descr, pool_name='LIVE', preamble='cfl.Tcsend_DB', options='', comment=True, add_parcfg=False):
+    """
+
+    :param ccf_descr:
+    :param pool_name:
+    :param preamble:
+    :param options:
+    :param comment:
+    :param add_parcfg:
+    :return:
+    """
     try:
         cmd, pars = list(get_tc_list(ccf_descr).items())[0]
-        # print("pars: ", pars)
     except IndexError:
         raise IndexError('"{}" not found in IDB.'.format(ccf_descr))
     # print(tc_template(cmd, pars, pool_name=pool_name, preamble=preamble, options=options, comment=True))
@@ -2854,6 +4581,17 @@ def make_tc_template(ccf_descr, pool_name='LIVE', preamble='cfl.Tcsend_DB', opti
 
 
 def tc_template(cmd, pars, pool_name='LIVE', preamble='cfl.Tcsend_DB', options='', comment=True, add_parcfg=False):
+    """
+
+    :param cmd:
+    :param pars:
+    :param pool_name:
+    :param preamble:
+    :param options:
+    :param comment:
+    :param add_parcfg:
+    :return:
+    """
     if comment:
         commentstr = "# TC({},{}): {} [{}]\n# {}\n".format(*cmd[3:], cmd[1], cmd[0], cmd[2])
         newline = '\n'
@@ -2891,6 +4629,7 @@ def tc_template(cmd, pars, pool_name='LIVE', preamble='cfl.Tcsend_DB', options='
 def parsinfo_to_str(pars, separator=None):
     """
     Return list of editable parameter names based on get_tc_list info
+
     :param pars:
     :param separator:
     :return:
@@ -2904,6 +4643,7 @@ def parsinfo_to_str(pars, separator=None):
 def on_open_univie_clicked(button):
     """
     Called by all applications, and called by the univie button to set up the starting options
+
     :param button:
     :return:
     """
@@ -2915,6 +4655,7 @@ def on_open_univie_clicked(button):
 def about_dialog(parent=None, action=None):
     """
     Called by the Univie Button, option About, pops up the Credits Window
+
     :param parent: Instance of the calling Gtk Window, for the Gtk.Dialog
     :param action: Simply the calling button
     :return:
@@ -2944,14 +4685,15 @@ def about_dialog(parent=None, action=None):
 
 def change_communication_func(main_instance=None,new_main=None,new_main_nbr=None,application=None,application_nbr=1,parentwin=None):
     """
-    Called by the Univie button, option Communication, Used to change the main_application for each project
+    Called by the UVIE button, option Communication. Used to change the main_application for each project
     (main_instance), also possible to only change main communication for one application
+
     :param new_main:The new main_application to be called every time in the future
     :param new_main_nbr: The instance of the new main_application
     :param application:The application to change the main communication for, None if chang for all
-    :param application_nbr:The instance of :param application
-    :param main_instance:The project in which the changes should accure
-    :param parentwin:Instance of a Gtk.Window for the Gtk.Dialog, None if called from a command line
+    :param application_nbr:The instance of *application*
+    :param main_instance:The project in which the changes should apply
+    :param parentwin:Instance of a Gtk.Window for the Gtk.Dialog, *None* if called from a command line
     :return:
     """
     save_com = {}
@@ -2998,6 +4740,7 @@ def change_communication_func(main_instance=None,new_main=None,new_main_nbr=None
 def change_main_communication(new_main, new_main_nbr, main_instance, own_bus_name=None):
     """
     Changes the main_communication for the entire main_instance (project)
+
     :param new_main: The new main_application to be called every time in the future
     :param new_main_nbr: The instance of the new main_application
     :param main_instance: The application to change the main communication for, None if chang for all
@@ -3019,67 +4762,30 @@ def change_main_communication(new_main, new_main_nbr, main_instance, own_bus_nam
     return
 
 
-def add_decode_parameter(label=None, format=None, bytepos=None, parentwin=None):
+def add_decode_parameter(parentwin=None):  # , label=None, fmt=None, bytepos=None):
     """
-    Add a Parameter which can be used in the User Defined Package, only defined by the format and can therefore only be
+    Add a parameter which can be used in a User DEFined packet, only defined by the format and can therefore only be
     used if the package is decoded in the given order
-    :param label: Name of the parameter
-    :param format: The format of the Parameter given as the actual String or the location in the ptt definition
-    :param bytepos: The offset where a parameter is located in a packet
+
     :param parentwin: For graphical usage
     :return:
     """
 
-    pos = None
-    fmt = None
-
-    if format and label:
-        #if label in cfg['ccs-plot_parameters']:
-        #    print('Please choose a different name for the parameter, can not exist as plot and decode parameter')
-        #    return
-        if isinstance(format, str):
-            try:
-                dummy = ptt_reverse(format)
-                fmt = format
-            except NotImplementedError:
-                if format not in fmtlist.keys():
-                    logger.error('Please give a correct Format')
-                    return
-                else:
-                    fmt = fmtlist[format]
-        elif isinstance(format, (list, tuple)):
-            if len(format) == 2:
-                try:
-                    fmt = ptt(format[0], format[1])
-                except NotImplementedError:
-                    logger.error('Give valid location of format')
-                    return
-            else:
-                logger.error('Please give a correct PTC/PFC format tuple')
-                return
-
-        if bytepos:
-            pos = bytepos
-
-    elif parentwin is not None:
+    if parentwin is not None:
         dialog = TmParameterDecoderDialog(parent=parentwin)
 
         response = dialog.run()
         if response == Gtk.ResponseType.OK:
             label = dialog.label.get_text()
-            #if label in cfg['ccs-plot_parameters']:
-            #    print('Please choose a different name for the parameter, can not exist as plot and decode parameter')
-            #    dialog.destroy()
-            #    return
-            pos = dialog.bytepos.get_active_text()
             fmt = dialog.format.get_active_text()
             if fmt in fmtlist:
                 fmt = fmtlist[fmt]
-                if fmt == 'bit':
+                if fmt in ('uint', 'ascii', 'oct'):
                     fmt += str(dialog.bitlen.get_text())
 
             else:
                 fmt += str(dialog.bitlen.get_text())
+                fmt = fmt.replace('*', '')
                 if fmt.upper() in fmtlist:
                     fmt = fmtlist[fmt.upper()]
             dialog.destroy()
@@ -3088,63 +4794,33 @@ def add_decode_parameter(label=None, format=None, bytepos=None, parentwin=None):
             return
 
     else:
-        logger.error('Please give a Format')
+        logger.error('Please give a valid format')
         return
 
-    # If a position was found the parameter will be stored in user_decoder layer in cfg
-    leng = None
-    if pos:
-        if fmt in fmtlengthlist:
-            leng = fmtlengthlist[fmt]
-        elif fmt.startswith(('bit', 'oct')):
-            len_test = int(fmt[3:])
-            if len_test % 8 == 0:
-                leng = len_test
-        elif fmt.startswith('uint'):
-            len_test = int(fmt[4:])
-            if len_test % 8 == 0:
-                leng = len_test
-        elif fmt.startswith('ascii'):
-            len_test = int(fmt[5:])
-            if len_test % 8 == 0:
-                leng = len_test
-        else:
-            # print('Something went wrong')
-            logger.error('Failed generating UDEF Parameter')
-            return
-
-        if leng:
-            dump = {'bytepos': str(pos), 'bytelen': str(leng), 'format': str(fmt)}
-            cfg.save_option_to_file('ccs-user_decoders', label, json.dumps(dump))
-        else:
-            dump = {'bytepos': str(pos), 'format': str(fmt)}
-            cfg.save_option_to_file('ccs-user_decoders', label, json.dumps(dump))
-    else:
-        cfg['ccs-decode_parameters'][label] = json.dumps(('format', str(fmt)))
-        cfg.save_option_to_file('ccs-decode_parameters', label, json.dumps(('format', str(fmt))))
+    cfg.save_option_to_file('ccs-decode_parameters', label, json.dumps({'format': str(fmt)}))
 
     if fmt:
-        return fmt
+        return {'format': str(fmt)}
     else:
         return
 
 
-# Let one add an additional User defined Package
-# Which can than be decoded
-def add_tm_decoder(label=None, st=None, sst=None, apid=None, sid=None, parameters=None, idb_pos=False, parentwin=None):
+def add_tm_decoder(label=None, st=None, sst=None, apid=None, sid=None, parameters=None, parentwin=None):
     """
-    Add decoding info for TM not defined in IDB
-    @param label: Name of new defined packet
-    @param st: Service Type
-    @param sst: Sub Service Type
-    @param apid:
-    @param sid:
-    @param parameters: list of parameters
-    @param idb_pos: False decode in given order, True decode in given/IBD given positiontm
-    @return:
+    Add User DEFined packet with decoding info for TM not defined in IDB
+
+    :param label: Name of new defined packet
+    :param st: Service Type
+    :param sst: Sub Service Type
+    :param apid:
+    :param sid:
+    :param parameters: list of parameters
+    :param parentwin:
+    :return:
     """
 
     if label and st and sst and apid:
+        sid = sid if sid else 0
         tag = '{}-{}-{}-{}'.format(st, sst, apid, sid)
 
     elif parentwin is not None:
@@ -3152,14 +4828,10 @@ def add_tm_decoder(label=None, st=None, sst=None, apid=None, sid=None, parameter
 
         response = dialog.run()
         if response == Gtk.ResponseType.OK:
-            slots = dialog.get_content_area().get_children()[0].get_children()[1].get_children()
-            parameters_name = []
-            model = slots[0].get_children()[1].get_child().get_model()
-            parameters_name.append([par[1] for par in model])
-            parameters = parameters_name[0]
-            tag = '{}-{}-{}-{}'.format(dialog.st.get_text(), dialog.sst.get_text(), dialog.apid.get_text(), dialog.sid.get_text())
+            parameters = [par for par in dialog.parameter_list]
+            sid = dialog.sid.get_text() if dialog.sid.get_text() else 0
+            tag = '{}-{}-{}-{}'.format(dialog.st.get_text(), dialog.sst.get_text(), dialog.apid.get_text(), sid)
             label = dialog.label.get_text()
-            idb_pos = dialog.idb_position.get_active()
             dialog.destroy()
         else:
             dialog.destroy()
@@ -3167,144 +4839,124 @@ def add_tm_decoder(label=None, st=None, sst=None, apid=None, sid=None, parameter
     else:
         logger.error('Please give: label, st, sst and apid')
         return
-    dbcon = scoped_session_idb
 
-    if sid is not None:
-        parameters = ['Sid'] + parameters
-    if None in parameters: # Check if a User defined Parameter was selected
-        parameters_descr = []
-        parameters_descr.append([par[0] for par in model])
-        parameters_descr = parameters_descr[0]
-
-        # The values of the Parameters which are in the database can be found via SQL, the UD parameters have to be looked up in the config file
-        params = []
-        i =0
-        if idb_pos: #Parameters should be decoded by there position given in the IDB or config file
-
-            while i < len(parameters_descr): # Check for each parameter if it is User-defined or IDB
-                if parameters[i] is not None: # If parameter is in IDB get its values with SQL Query
-                    que = 'SELECT DISTINCT pcf.pcf_name,pcf.pcf_descr,plf_offby,plf_offbi,pcf.pcf_ptc,pcf.pcf_pfc,\
-                        pcf.pcf_unit,pcf.pcf_pid,pcf.pcf_width FROM plf LEFT JOIN pcf ON plf.plf_name=pcf.pcf_name  \
-                        WHERE pcf_name ="%s"' %parameters[i]
-
-                    dbres = dbcon.execute(que)
-                    params_value = dbres.fetchall()
-                    params.append(params_value[0])
-                else: # Parameter is User Defined get the values from the config file
-                    try:
-                        params_values = json.loads(cfg['ccs-user_decoders'][parameters_descr[i]])
-                    except:
-                        # print('Parameter: {} can only be decoded in given order'.format(parameters_descr[i]))
-                        logger.info('Parameter: {} can only be decoded in given order'.format(parameters_descr[i]))
-                        return
-                    ptt_value = ptt_reverse(params_values['format'])
-                    params_value = ['user_defined', parameters_descr[i],
-                                    params_values['bytepos'] if 'bytepos' in params_values else None,
-                                    params_values['bytelen'] if 'bytelen' in params_values else None,
-                                    ptt_value[0], ptt_value[1],
-                                    None, None, None]
-                    params.append(tuple(params_value))
-                i += 1
-
-        else: #Parameters will be decoded in the given order
-            while i < len(parameters_descr):  # Check for each parameter if it is User-defined or IDB
-                if parameters[i] is not None:  # If parameter is in IDB get its values with SQL Query
-                    #que = 'SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_curtx, \
-                    #        pcf.pcf_width,pcf.pcf_unit,pcf.pcf_pid,vpd_pos,vpd_grpsize,vpd_fixrep from vpd  \
-                    #        left join pcf on vpd.vpd_name=pcf.pcf_name WHERE pcf_name ="%s"' % parameters[i]
-
-
-                    # Most parameters do not have an entry in the vpd table, therefore most of the time the query
-                    # would give no result. But what would be needed would be 3 entries with null at the end. This
-                    # is done manually here.
-                    # Furthermore this means that parameters are only treathed as fixed parameters
-
-                    que = 'SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_curtx, \
-                            pcf.pcf_width,pcf.pcf_unit,pcf.pcf_pid,null,null,null from pcf \
-                            WHERE pcf_name ="%s"' % parameters[i]
-
-                    dbres = dbcon.execute(que)
-                    params_value = dbres.fetchall()
-                    params.append(params_value[0])
-
-                else:  # Parameter is User Defined get the values from the config file
-                    try: # Check where parameter is defined
-                        params_values = json.loads(cfg['ccs-user_decoders'][parameters_descr[i]])
-                        format = 'bit' + params_values['bytelen']
-                        ptt_value = ptt_reverse(format)
-                    except:
-                        params_values = json.loads(cfg['ccs-decode_parameters'][parameters_descr[i]])
-                        ptt_value = ptt_reverse(params_values['format'])
-
-                    params_value = ['user_defined', parameters_descr[i], ptt_value[0],
-                                    ptt_value[1], None, None, None, None, None, None, None]
-
-                    params.append(tuple(params_value))
-                i += 1
+    if not parameters:
+        logger.warning('No parameters given, cannot create custom TM')
+        return
+
+    params = [_parameter_decoding_info(par, check_curtx=True) for par in parameters]
+    logger.debug('Created custom TM decoder {} with parameters: {}'.format(label, [x[1] for x in params]))
+    user_tm_decoders[tag] = (label, params)
+
+    if not cfg.has_section('ccs-user_defined_packets'):
+        cfg.add_section('ccs-user_defined_packets')
+    cfg.save_option_to_file('ccs-user_defined_packets', tag, json.dumps((label, [tuple(x) for x in params])))
+
+    return label
+
+
+def _parameter_decoding_info(param, check_curtx=False):
+    """
+    Return parameter info tuple used for TM decoding
+
+    :param param:
+    :return:
+    """
+
+    if param[1] not in ['user_defined', 'user_defined_nopos', 'dp_item']:
+        que = 'SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_curtx,pcf.pcf_width,pcf.pcf_unit,' \
+              'pcf.pcf_pid,null,null,null from pcf WHERE pcf_name ="{}"'.format(param[1])
+        dinfo = scoped_session_idb.execute(que).fetchall()[0]
+
+    elif param[1] == 'user_defined':
+        fmt = json.loads(cfg[CFG_SECT_PLOT_PARAMETERS][param[0]])['format']
+        ptc, pfc = ptt_reverse(fmt)
+        dinfo = [param[1], param[0], ptc, pfc, None, csize(fmt) * 8, None, None, None, None, None]
+
+    elif param[1] == 'user_defined_nopos':
+        fmt = json.loads(cfg[CFG_SECT_DECODE_PARAMETERS][param[0]])['format']
+        ptc, pfc = ptt_reverse(fmt)
+        dinfo = [param[1], param[0], ptc, pfc, None, csize(fmt) * 8, None, None, None, None, None]
+
+    elif param[1] == 'dp_item':
+        if isinstance(param[0], int):
+            dp_id = param[0]
+            dp_descr = DP_IDS_TO_ITEMS[param[0]]
+        else:
+            dp_id = DP_ITEMS_TO_IDS[param[0].split(' ')[0]]  # strip IDs in parentheses if present from parameter dialog model
+            dp_descr = DP_IDS_TO_ITEMS[dp_id]
+
+        if check_curtx:
+            try:
+                que = 'SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_curtx,pcf.pcf_width,pcf.pcf_unit,' \
+                      'pcf.pcf_pid,null,null,null from pcf WHERE pcf_pid ="{}"'.format(dp_id)
+                dinfo = scoped_session_idb.execute(que).fetchall()[0]
+                return dinfo
+            except IndexError:
+                logger.debug('PID {} not in MIB.'.format(dp_id))
+
+        ptc, pfc = ptt_reverse(_dp_items[dp_id]['fmt'])
+        dinfo = [param[1], dp_descr, ptc, pfc, None, csize(_dp_items[dp_id]['fmt']) * 8, None, None, None, None, None]
 
     else:
-        if idb_pos: #Parameters should be decoded by there position given in the IDB or config file
-            # Check if the User used the PCF Name to describe the parameters or the PCF DESCR
-            if 'DPT' in parameters[0]:
-                que = 'SELECT DISTINCT pcf.pcf_name,pcf.pcf_descr,plf_offby,plf_offbi,pcf.pcf_ptc,pcf.pcf_pfc,\
-                    pcf.pcf_unit,pcf.pcf_pid,pcf.pcf_width FROM plf LEFT JOIN pcf ON plf.plf_name=pcf.pcf_name WHERE \
-                    pcf_name in {} ORDER BY FIELD({},'.format(tuple(parameters), 'pcf_name')\
-                    + str(tuple(parameters))[1:]
+        logger.warning('Info for parameter "{}" cannot be obtained'.format(param[0]))
+        dinfo = None
 
-                dbres = dbcon.execute(que)
-                params = dbres.fetchall()
+    return dinfo
 
-            else:
-                que = 'SELECT DISTINCT pcf.pcf_name,pcf.pcf_descr,plf_offby,plf_offbi,pcf.pcf_ptc,pcf.pcf_pfc,\
-                    pcf.pcf_unit,pcf.pcf_pid,pcf.pcf_width FROM plf LEFT JOIN pcf ON plf.plf_name=pcf.pcf_name WHERE \
-                    pcf_descr in {} ORDER BY FIELD({},'.format(tuple(parameters), 'pcf_descr')\
-                    + str(tuple(parameters))[1:]
 
-                dbres = dbcon.execute(que)
-                params = dbres.fetchall()
-        else: #Parameters will be decoded in the given order
-            # Check if the User used the PCF Name to describe the parameters or the PCF DESCR
-            if 'DPT' in parameters[0]:
-                #que = 'SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_curtx, \
-                #        pcf.pcf_width,pcf.pcf_unit,pcf.pcf_pid,vpd_pos,vpd_grpsize,vpd_fixrep from vpd left join pcf on \
-                #        vpd.vpd_name=pcf.pcf_name WHERE pcf_name in {} ORDER BY FIELD({},'.format(tuple(parameters),
-                #        'pcf_name') + str(tuple(parameters))[1:]
-
-                que = 'SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_curtx, \
-                        pcf.pcf_width,pcf.pcf_unit,pcf.pcf_pid, null,null,null from pcf WHERE pcf_name in {} \
-                        ORDER BY FIELD({},'.format(tuple(parameters), 'pcf_name') + str(tuple(parameters))[1:]
+def create_hk_decoder(sid, *dp_ids, apid=None):
+    """
+    Create a decoder to interpret custom HK packets not defined in the MIB
 
-                dbres = dbcon.execute(que)
-                params = dbres.fetchall()
+    :param sid: SID of the custom HK
+    :param dp_ids: list of parameters in the custom HK
+    :param apid: APID of the custom HK packet
+    :return:
+
+    """
+    parameters = [(dp_id, 'dp_item') for dp_id in dp_ids]
+
+    if apid is None:
+        que = 'SELECT pic_apid FROM pic WHERE pic_type=3 AND pic_stype=25'
+        res = scoped_session_idb.execute(que).fetchall()
+        apid = int(res[0][0])
 
-            else:
-                #que = 'SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_curtx, \
-                #        pcf.pcf_width,pcf.pcf_unit,pcf.pcf_pid,vpd_pos,vpd_grpsize,vpd_fixrep from vpd left join pcf on \
-                #        vpd.vpd_name=pcf.pcf_name WHERE pcf_descr in {} ORDER BY FIELD({},'.format(tuple(parameters),
-                #        'pcf_descr') + str(tuple(parameters))[1:]
 
-                que = 'SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_ptc,pcf.pcf_pfc,pcf.pcf_curtx, \
-                        pcf.pcf_width,pcf.pcf_unit,pcf.pcf_pid,null,null,null from pcf WHERE pcf_descr in {} \
-                        ORDER BY FIELD({},'.format(tuple(parameters), 'pcf_descr') + str(tuple(parameters))[1:]
+    sid_off, sid_width = SID_LUT[(3, 25, apid)]
 
-                dbres = dbcon.execute(que)
-                parmas = dbres.fetchall()
+    que = 'SELECT plf_name, pcf_descr FROM pid left join plf on PLF_SPID=PID_SPID left join pcf on ' \
+                'PCF_NAME=PLF_NAME where PID_TYPE=3 and PID_STYPE=25 and PID_APID={} and plf_offby={}'.format(apid, sid_off)
+    sid_name, sid_descr = scoped_session_idb.execute(que).fetchall()[0]
 
-    # print('Created custom TM decoder {} with parameters: {}'.format(label, [x[1] for x in params]))
-    logger.debug('Created custom TM decoder {} with parameters: {}'.format(label, [x[1] for x in params]))
-    user_tm_decoders[tag] = (label, params)
-    dbcon.close()
+    if sid_off != TM_HEADER_LEN:
+        logger.warning('Inconsistent definition of SID parameter')
 
-    if not cfg.has_section('ccs-user_defined_packets'):
-        cfg.add_section('ccs-user_defined_packets')
-    cfg.save_option_to_file('ccs-user_defined_packets', tag, json.dumps((label, [tuple(x) for x in params])))
+    parameters = [(sid_descr, sid_name)] + parameters
+    label = add_tm_decoder(label='HK_{}'.format(sid), st=3, sst=25, apid=apid, parameters=parameters, sid=sid)
+    return label
 
 
-# Add a User defined Parameter
-def add_user_parameter(parameter=None, apid=None, st=None, sst=None, sid=None, bytepos=None, fmt=None, offbi=None, bitlen=None, parentwin=None):
+def add_user_parameter(parameter=None, apid=None, st=None, sst=None, sid=None, bytepos=None, fmt=None, offbi=None,
+                       bitlen=None, parentwin=None):
+    """
+    Add a stand-alone (i.e. with positional info) User DEFined parameter
+
+    :param parameter:
+    :param apid:
+    :param st:
+    :param sst:
+    :param sid:
+    :param bytepos:
+    :param fmt:
+    :param offbi:
+    :param bitlen:
+    :param parentwin:
+    :return:
+    """
     # If a Gtk Parent Window is given, open the Dialog window to specify the details for the parameter
     if parentwin is not None:
-        dialog = AddUserParamerterDialog(parent=parentwin)
+        dialog = UserParameterDialog(parent=parentwin)
 
         response = dialog.run()
         if response == Gtk.ResponseType.OK:
@@ -3318,15 +4970,16 @@ def add_user_parameter(parameter=None, apid=None, st=None, sst=None, sid=None, b
                 offbi = int(offbi, 0) if offbi != '' else 0
 
                 bytepos, fmt = int(dialog.bytepos.get_text(), 0), fmtlist[dialog.format.get_active_text()]
-                if fmt == 'bit':
+                if fmt in ('uint', 'ascii', 'oct'):
                     fmt += dialog.bitlen.get_text()
-            except:
+            except Exception as err:
+                logger.error(err)
                 dialog.destroy()
                 return None
 
-            if not cfg.has_section('ccs-plot_parameters'):
-                cfg.add_section('ccs-plot_parameters')
-            cfg.save_option_to_file('ccs-plot_parameters', label, json.dumps(
+            if not cfg.has_section(CFG_SECT_PLOT_PARAMETERS):
+                cfg.add_section(CFG_SECT_PLOT_PARAMETERS)
+            cfg.save_option_to_file(CFG_SECT_PLOT_PARAMETERS, label, json.dumps(
                 {'APID': apid, 'ST': st, 'SST': sst, 'SID': sid, 'bytepos': bytepos, 'format': fmt, 'offbi': offbi}))
 
             dialog.destroy()
@@ -3335,16 +4988,16 @@ def add_user_parameter(parameter=None, apid=None, st=None, sst=None, sid=None, b
         dialog.destroy()
         return
 
-    # Else If parameter is given as the name of the parameter the others have to exist as well and the parameter is created
+    # Else if parameter is given the others have to exist as well and the parameter is created
     if isinstance(parameter, str):
         label = parameter
         if isinstance(apid, int) and isinstance(st, int) and isinstance(sst, int) and isinstance(bytepos, int) and fmt:
-            if fmt == 'bit':
+            if fmt in ('uint', 'ascii', 'oct'):
                 if bitlen:
                     fmt += bitlen
                 else:
                     # print('Please give a bitlen (Amount of Bits) if fmt (Parameter Type) is set to "bit"')
-                    logger.error('Parameter could not be created, no bitlen was given, while fmt was set to  "bit"')
+                    logger.error('Parameter could not be created, no length was given.')
                     return
 
             if not isinstance(sid,int):
@@ -3355,7 +5008,7 @@ def add_user_parameter(parameter=None, apid=None, st=None, sst=None, sid=None, b
             # print('Please give all neaded parameters in the correct format')
             logger.error('Parameter could not be created, because not all specifications were given correctly')
             return
-    # Esle if the Parameter is given as a Dictionary get all the needed informations and create the parameter
+    # Else if the Parameter is given as a Dictionary get all the needed informations and create the parameter
     elif isinstance(parameter, dict):
         label = parameter['label']
         apid = parameter['apid']
@@ -3364,12 +5017,12 @@ def add_user_parameter(parameter=None, apid=None, st=None, sst=None, sid=None, b
         byteps = parameter['bytepos']
         fmt = parameter['fmt']
         if isinstance(label, str) and isinstance(apid, int) and isinstance(st, int) and isinstance(sst, int) and isinstance(bytepos, int) and fmt:
-            if fmt == 'bit':
+            if fmt in ('uint', 'ascii', 'oct'):
                 if bitlen:
                     fmt += bitlen
                 else:
                     # print('Please give a bitlen (Amount of Bits) if fmt (Parameter Type) is set to "bit"')
-                    logger.error('Parameter could not be created, no bitlen was given, while fmt was set to "bit"')
+                    logger.error('Parameter could not be created, no length was given.')
                     return
 
             if not isinstance(parameter['sid'], int):
@@ -3385,10 +5038,10 @@ def add_user_parameter(parameter=None, apid=None, st=None, sst=None, sid=None, b
         logger.error('Please give all arameters correctly')
         return
     # Add the created Parameter to the config file egse.cfg
-    if not cfg.has_section('ccs-plot_parameters'):
-        cfg.add_section('ccs-plot_parameters')
+    if not cfg.has_section(CFG_SECT_PLOT_PARAMETERS):
+        cfg.add_section(CFG_SECT_PLOT_PARAMETERS)
 
-    cfg.save_option_to_file('ccs-plot_parameters', label, json.dumps(
+    cfg.save_option_to_file(CFG_SECT_PLOT_PARAMETERS, label, json.dumps(
         {'APID': apid, 'ST': st, 'SST': sst, 'SID': sid, 'bytepos': bytepos, 'format': fmt, 'offbi': offbi}))
 
     return label, apid, st, sst, sid, bytepos, fmt, offbi
@@ -3396,43 +5049,51 @@ def add_user_parameter(parameter=None, apid=None, st=None, sst=None, sid=None, b
 
 # Removes a user defined Parameter
 def remove_user_parameter(parname=None, parentwin=None):
+    """
+
+    :param parname:
+    :param parentwin:
+    :return:
+    """
     # If a Parameter is given delete the parameter
-    if parname and cfg.has_option('ccs-plot_parameters', parname):
-        cfg.remove_option_from_file('ccs-plot_parameters', parname)
+    if parname and cfg.has_option(CFG_SECT_PLOT_PARAMETERS, parname):
+        cfg.remove_option_from_file(CFG_SECT_PLOT_PARAMETERS, parname)
 
         return parname
 
     # Else if a Parent Gtk window is given open the dialog to select a parameter
-    elif parentwin is not None:
-        dialog = RemoveUserParameterDialog(cfg, parentwin)
-        response = dialog.run()
-        if response == Gtk.ResponseType.OK:
-            param = dialog.remove_name.get_active_text()
-
-            cfg.remove_option_from_file('ccs-plot_parameters', param)
-
-            return param
-
-        else:
-            dialog.destroy()
-
-        return
+    # elif parentwin is not None:
+    #     dialog = RemoveUserParameterDialog(cfg, parentwin)
+    #     response = dialog.run()
+    #     if response == Gtk.ResponseType.OK:
+    #         param = dialog.remove_name.get_active_text()
+    #
+    #         cfg.remove_option_from_file(CFG_SECT_PLOT_PARAMETERS, param)
+    #
+    #         return param
+    #
+    #     else:
+    #         dialog.destroy()
+    #
+    #     return
 
     elif parname is not None:
-        logger.error('Selected User Defined Paramter could not be found, please select a new one.')
-        return
-
-    else:
-        return
+        logger.error('Unknown parameter {}. Cannot remove.'.format(parname))
 
 
 # Edit an existing user defined Parameter
-def edit_user_parameter(parentwin = None, parname = None):
+def edit_user_parameter(parentwin=None, parname=None):
+    """
+
+    :param parentwin:
+    :param parname:
+    :return:
+    """
 
-    # If a Existing Parameter is given, open same Window as for adding a parameter, but pass along the existing information
-    # Simply overwrite the existing parameter with the new one
-    if parname and cfg.has_option('ccs-plot_parameters', parname):
-        dialog = AddUserParamerterDialog(parentwin, parname)
+    # if an existing parameter is given, open same window as for adding a parameter, but pass along the existing information
+    # simply overwrite the existing parameter with the new one
+    if parname and cfg.has_option(CFG_SECT_PLOT_PARAMETERS, parname):
+        dialog = UserParameterDialog(parentwin, parname)
         response = dialog.run()
         if response == Gtk.ResponseType.OK:
             try:
@@ -3445,16 +5106,19 @@ def edit_user_parameter(parentwin = None, parname = None):
                 offbi = int(offbi, 0) if offbi != '' else 0
 
                 bytepos, fmt = int(dialog.bytepos.get_text(), 0), fmtlist[dialog.format.get_active_text()]
-                if fmt == 'bit':
+                if fmt in ('uint', 'ascii', 'oct'):
                     fmt += dialog.bitlen.get_text()
             except ValueError as error:
                 logger.error(error)
                 dialog.destroy()
-                return None
+                return
 
-            if not cfg.has_section('ccs-plot_parameters'):
-                cfg.add_section('ccs-plot_parameters')
-            cfg.save_option_to_file('ccs-plot_parameters', label, json.dumps(
+            if label != parname:
+                cfg.remove_option_from_file(CFG_SECT_PLOT_PARAMETERS, parname)
+
+            if not cfg.has_section(CFG_SECT_PLOT_PARAMETERS):
+                cfg.add_section(CFG_SECT_PLOT_PARAMETERS)
+            cfg.save_option_to_file(CFG_SECT_PLOT_PARAMETERS, label, json.dumps(
                 {'APID': apid, 'ST': st, 'SST': sst, 'SID': sid, 'bytepos': bytepos, 'format': fmt, 'offbi': offbi}))
 
             dialog.destroy()
@@ -3462,33 +5126,36 @@ def edit_user_parameter(parentwin = None, parname = None):
             return label, apid, st, sst, sid, bytepos, fmt, offbi
         else:
             dialog.destroy()
-            return None
+            return
 
     # Else Open a Window to select a parameter and call the same function again with an existing parameter
     # The upper code will be executed
     else:
-        if parname is not None:
-            logger.warning('Selected User Defined Paramter could not be found please select a new one')
-
-        dialog = EditUserParameterDialog(cfg, parentwin)
-        response = dialog.run()
-        if response == Gtk.ResponseType.OK:
-            param = dialog.edit_name.get_active_text()
-            dialog.destroy()
-            ret = edit_user_parameter(parentwin, param)
-            if ret:
-                label, apid, st, sst, sid, bytepos, fmt, offbi = ret
-                return label, apid, st, sst, sid, bytepos, fmt, offbi
-            else:
-                return
-        else:
-            dialog.destroy()
-            return
+        logger.error('Unknown parameter {}'.format(parname))
+        return
+        # if parname is not None:
+        #     logger.warning('User defined parameter "{}" could not be found, please select a new one'.format(parname))
+        #
+        # dialog = EditUserParameterDialog(cfg, parentwin)
+        # response = dialog.run()
+        # if response == Gtk.ResponseType.OK:
+        #     param = dialog.edit_name.get_active_text()
+        #     dialog.destroy()
+        #     ret = edit_user_parameter(parentwin, param)
+        #     if ret:
+        #         label, apid, st, sst, sid, bytepos, fmt, offbi = ret
+        #         return label, apid, st, sst, sid, bytepos, fmt, offbi
+        #     else:
+        #         return
+        # else:
+        #     dialog.destroy()
+        #     return
 
 
 def read_plm_gateway_data(raw):
     """
     Interprets raw data from SMILE SXI PLM SpW Gateway data port (5000) and returns SpW packet(s) plus decoded PLM header data (see H8823-UM-HVS-0001)
+
     :param raw: binary data as received from PLM Gateway
     :return:
     """
@@ -3502,6 +5169,7 @@ def read_plm_gateway_data(raw):
 def pack_plm_gateway_data(raw):
     """
     Pack data for TC to SMILE SXI PLM SpW Gateway data port (5000) (see H8823-UM-HVS-0001)
+
     :param raw: binary SpW packet
     :return:
     """
@@ -3535,7 +5203,14 @@ def get_spw_from_plm_gw(sock_plm, sock_gnd, strip_spw=4):
 
 
 def setup_gw_spw_routing(gw_hp, gnd_hp, tc_hp=None, spw_head=b'\xfe\x02\x00\x00'):
+    """
+    A router for the single-port HVS SpW Brick that handles the HVS and SpW protocol for the CCS
 
+    :param gw_hp:
+    :param gnd_hp:
+    :param tc_hp:
+    :param spw_head:
+    """
     gw = socket.socket()
     gw.settimeout(10)
     gw.connect(gw_hp)
@@ -3592,6 +5267,179 @@ def setup_gw_spw_routing(gw_hp, gnd_hp, tc_hp=None, spw_head=b'\xfe\x02\x00\x00'
     gw.close()
 
 
+def _gresb_unpack(raw, hdr_endianess='big'):
+    pid = raw[0]
+    pktlen = int.from_bytes(raw[1:4], hdr_endianess)
+    return raw[4:], pktlen, pid
+
+
+def _gresb_pack(pkt, protocol_id=0, hdr_endianess='big'):
+    return protocol_id.to_bytes(1, hdr_endianess) + len(pkt).to_bytes(3, hdr_endianess) + pkt
+
+
+def get_gresb_pkt(gresb, gnd_s, hdr_endianess='big'):
+    """
+
+    :param gresb:
+    :param gnd_s:
+    :param hdr_endianess:
+    """
+    data = b''
+    while len(data) < 4:
+        data += gresb.recv(4 - len(data))
+
+    spwdata, plen, pid = _gresb_unpack(data, hdr_endianess=hdr_endianess)
+    while len(spwdata) < plen:
+        spwdata += gresb.recv(plen - len(spwdata))
+
+    gnd_s.send(spwdata)
+
+    logger.debug(plen, len(spwdata), spwdata.hex())
+    print(plen, len(spwdata), spwdata.hex())
+
+
+def setup_gresb_routing(gresb_hp, gnd_hp, tc_hp=None, protocol_id=0, hdr_endianess='big'):
+    """
+    Handle GRESB protocol for CCS
+
+    :param gresb_hp:
+    :param gnd_hp:
+    :param tc_hp:
+    :param protocol_id:
+    :param hdr_endianess:
+    """
+    gresb = socket.socket()
+    gresb.settimeout(10)
+    gresb.connect(gresb_hp)
+
+    gnd = socket.socket()
+    gnd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+    gnd.bind(gnd_hp)
+    gnd.listen()
+
+    if tc_hp is not None:
+        tcsock = socket.socket()
+        tcsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+        tcsock.bind(tc_hp)
+        tcsock.listen()
+    else:
+        tcsock = gnd
+
+    while gresb.fileno() > 0:
+        logger.info(gresb, gnd)
+        gnd_s, addr = gnd.accept()
+        tc_s, addr2 = tcsock.accept()
+
+        while True:
+            try:
+                print('START')
+                r, w, e = select.select([gresb, tc_s], [], [])
+                print(r)
+                for sockfd in r:
+                    if sockfd == gresb:
+                        while select.select([gresb], [], [], 0)[0]:
+                            get_gresb_pkt(gresb, gnd_s, hdr_endianess=hdr_endianess)
+                    elif sockfd == tc_s:
+                        while select.select([tc_s], [], [], 0)[0]:
+                            rawtc = tc_s.recv(1024)
+                            if rawtc == b'':
+                                raise socket.error('Lost connection to port '.format(tc_s.getsockname()))
+                            else:
+                                logger.info('# TC:', rawtc)
+                                print('# TC:', rawtc)
+                                msg = _gresb_pack(rawtc, protocol_id=protocol_id, hdr_endianess=hdr_endianess)
+                                print(gresb)
+                                gresb.send(msg)
+                                print(msg)
+
+            except socket.timeout:
+                continue
+            except socket.error:
+                gnd_s.close()
+                tc_s.close()
+                logger.info('Closed TM/TC ports. Reopening...')
+                break
+            print('########')
+        time.sleep(1)
+
+    gnd.close()
+    tcsock.close()
+    gresb.close()
+
+
+def extract_spw(stream):
+    """
+    Read SpW packets from a byte stream
+
+    :param stream:
+    :return:
+    """
+
+    pkt_size_stream = b''
+    pckts = []
+    headers = []
+
+    while True:
+        pkt_size_stream += stream.read(2)
+        if len(pkt_size_stream) < 2:
+            break
+        tla, pid = pkt_size_stream[:2]
+        logger.debug('{}, {}'.format(tla, pid))
+
+        # if (tla == pc.SPW_DPU_LOGICAL_ADDRESS) and (pid in SPW_PROTOCOL_IDS_R):
+        if pid in SPW_PROTOCOL_IDS_R:
+            buf = pkt_size_stream
+        else:
+            pkt_size_stream = pkt_size_stream[1:]
+            continue
+
+        if SPW_PROTOCOL_IDS_R[pid] == "FEEDATA":
+            header = pc.FeeDataTransferHeader()
+        elif SPW_PROTOCOL_IDS_R[pid] == "RMAP":
+            while len(buf) < 3:
+                instruction = stream.read(1)
+                if not instruction:
+                    return pckts, buf
+                buf += instruction
+
+            instruction = buf[2]
+
+            if (instruction >> 6) & 1:
+                header = pc.RMapCommandHeader()
+            elif (instruction >> 5) & 0b11 == 0b01:
+                header = pc.RMapReplyWriteHeader()
+            elif (instruction >> 5) & 0b11 == 0b00:
+                header = pc.RMapReplyReadHeader()
+
+        hsize = header.__class__.bits.size
+
+        while len(buf) < hsize:
+            buf += stream.read(hsize - len(buf))
+
+        header.bin[:] = buf[:hsize]
+
+        if SPW_PROTOCOL_IDS_R[pid] == "FEEDATA":
+            pktsize = header.bits.DATA_LEN
+        elif (header.bits.PKT_TYPE == 1 and header.bits.WRITE == 0) or (
+                header.bits.PKT_TYPE == 0 and header.bits.WRITE == 1):
+            pktsize = hsize
+        else:
+            pktsize = hsize + header.bits.DATA_LEN + pc.RMAP_PEC_LEN  # TODO: no data CRC from FEEsim?
+
+        while len(buf) < pktsize:
+            data = stream.read(pktsize - len(buf))
+            if not data:
+                return headers, pckts, pkt_size_stream
+            buf += data
+
+        buf = buf[:pktsize]
+        pkt_size_stream = buf[pktsize:]
+        pckts.append(buf)
+        headers.append(header)
+
+    return headers, pckts, pkt_size_stream
+
+
 ##
 #  Save pool
 #
@@ -3602,6 +5450,13 @@ def setup_gw_spw_routing(gw_hp, gnd_hp, tc_hp=None, spw_head=b'\xfe\x02\x00\x00'
 #  @param mode      Type of the saved file. _binary_ or _hex_
 #  @param st_filter Packets of that service type will be saved
 def savepool(filename, pool_name, mode='binary', st_filter=None):
+    """
+
+    :param filename:
+    :param pool_name:
+    :param mode:
+    :param st_filter:
+    """
     # get new session for saving process
     logger.info('Saving pool content to disk...')
     tmlist = list(get_packets_from_pool(pool_name))
@@ -3610,14 +5465,15 @@ def savepool(filename, pool_name, mode='binary', st_filter=None):
     logger.info('Pool {} saved as {} in {} mode'.format(pool_name, filename, mode.upper()))
 
 
-def get_packets_from_pool(pool_name, indices=[], st=None, sst=None, apid=None, **kwargs):
+def get_packets_from_pool(pool_name, indices=None, st=None, sst=None, apid=None, **kwargs):
     """
-    @param pool_name:
-    @param indices:
-    @param st:
-    @param sst:
-    @param apid:
-    @return:
+
+    :param pool_name:
+    :param indices:
+    :param st:
+    :param sst:
+    :param apid:
+    :return:
     """
     new_session = scoped_session_storage
 
@@ -3630,54 +5486,424 @@ def get_packets_from_pool(pool_name, indices=[], st=None, sst=None, apid=None, *
         DbTelemetryPool.pool_name == pool_name
     )
 
-    if len(indices) != 0:
-        rows = rows.filter(
-            DbTelemetry.idx.in_(indices)
-        )
+    if indices is not None and len(indices) > 0:
+        rows = rows.filter(
+            DbTelemetry.idx.in_(indices)
+        )
+
+    if st is not None:
+        rows = rows.filter(DbTelemetry.stc == st)
+    if sst is not None:
+        rows = rows.filter(DbTelemetry.sst == sst)
+    if apid is not None:
+        rows = rows.filter(DbTelemetry.apid == apid)
+
+    ret = [row.raw for row in rows.yield_per(1000)]
+    new_session.close()
+    return ret
+
+
+def add_tst_import_paths():
+    """
+    Include all paths to TST files that could potentially be used.
+
+    :return:
+    """
+    # Add general tst path
+    sys.path.append(cfg.get('paths', 'tst'))
+    # Add all subfolders
+    sys.path.append(cfg.get('paths', 'tst') + '/codeblockreusefeature')
+    sys.path.append(cfg.get('paths', 'tst') + '/config_editor')
+    sys.path.append(cfg.get('paths', 'tst') + '/confignator')
+    sys.path.append(cfg.get('paths', 'tst') + '/doc')
+    sys.path.append(cfg.get('paths', 'tst') + '/icon_univie')
+    sys.path.append(cfg.get('paths', 'tst') + '/images')
+    sys.path.append(cfg.get('paths', 'tst') + '/log_viewer')
+    sys.path.append(cfg.get('paths', 'tst') + '/notes')
+    sys.path.append(cfg.get('paths', 'tst') + '/progress_view')
+    sys.path.append(cfg.get('paths', 'tst') + '/sketch_desk')
+    sys.path.append(cfg.get('paths', 'tst') + '/test_specs')
+    sys.path.append(cfg.get('paths', 'tst') + '/testing_library')
+    # insert this to import the tst view.py, not the one in .local folder
+    sys.path.insert(0, cfg.get('paths', 'tst') + '/tst')
+
+
+def interleave_lists(*args):
+    """
+
+    :param args:
+    :return:
+    """
+    if len({len(x) for x in args}) > 1:
+        logger.warning('Iterables are not of the same length, result will be truncated to the shortest input!')
+    return [i for j in zip(*args) for i in j]
+
+
+def create_format_model():
+    """
+
+    :return:
+    """
+    store = Gtk.ListStore(str)
+    for fmt in fmtlist.keys():
+        if fmt != 'bit*':
+            store.append([fmt])
+    for pers in personal_fmtlist:
+        store.append([pers])
+    return store
+
+
+def _get_displayed_pool_path(pool_name=None):
+    """
+    Try to get name of pool currently displayed in poolviewer or loaded in current poolmanager session
+
+    :param pool_name:
+    :return:
+    """
+
+    if pool_name is None:
+        pv = get_module_handle('poolviewer', timeout=1)
+
+        if not pv:
+            return
+
+        return str(pv.Variables('active_pool_info')[0])
+
+    pmgr = get_module_handle('poolmanager', timeout=1)
+    if not pmgr:
+        return
+
+    pools = pmgr.Dictionaries('loaded_pools')
+    if pool_name in pools:
+        return str(pools[pool_name][0])
+    else:
+        return
+
+
+def collect_13(pool_name, starttime=None, endtime=None, startidx=None, endidx=None, join=True, collect_all=False,
+               sdu=None, verbose=True):
+    """
+    Collect and group S13 down transfer packet trains
+
+    :param pool_name:
+    :param starttime:
+    :param endtime:
+    :param startidx:
+    :param endidx:
+    :param join:
+    :param collect_all:
+    :param sdu:
+    :param verbose:
+    :return:
+    """
+    if not os.path.isfile(pool_name):
+        logger.debug('{} is not a file, looking it up in DB'.format(pool_name))
+        # try fetching pool info from pools opened in viewer
+        # pname = _get_displayed_pool_path(pool_name)
+        # if pname:
+        #     pool_name = pname
+
+    rows = get_pool_rows(pool_name, check_existence=True)
+
+    # if starttime is None:
+    #     starttime = 0
+
+    # if start is not None:
+    #     starttime = float(rows.filter(DbTelemetry.idx == start).first().timestamp[:-1])
+
+    # if endtime is None:
+    #     endtime = get_last_pckt_time(pool_name, string=False)
+
+    # if end is not None:
+    #     endtime = float(rows.filter(DbTelemetry.idx == end).first().timestamp[:-1])
+
+    # if starttime is None or endtime is None:
+    #     raise ValueError('Specify start(time) and end(time)!')
+
+    ces = {}
+    # faster method to collect already completed TM13 transfers
+    tm_bounds = rows.filter(DbTelemetry.stc == 13, DbTelemetry.sst.in_([1, 3])).order_by(DbTelemetry.idx)
+
+    if starttime is not None:
+        tm_bounds = tm_bounds.filter(func.left(DbTelemetry.timestamp, func.length(DbTelemetry.timestamp) - 1) >= starttime)
+
+    if endtime is not None:
+        tm_bounds = tm_bounds.filter(func.left(DbTelemetry.timestamp, func.length(DbTelemetry.timestamp) - 1) <= endtime)
+
+    if startidx is not None:
+        tm_bounds = tm_bounds.filter(DbTelemetry.idx >= startidx)
+
+    if endidx is not None:
+        tm_bounds = tm_bounds.filter(DbTelemetry.idx <= endidx)
+
+    if sdu:
+        tm_bounds = tm_bounds.filter(func.left(DbTelemetry.data, 1) == sdu.to_bytes(SDU_PAR_LENGTH, 'big'))
+
+    # quit if no start and end packet are found
+    if tm_bounds.count() < 2:
+        return {None: None}
+
+    tm_132 = rows.filter(DbTelemetry.stc == 13, DbTelemetry.sst == 2).order_by(DbTelemetry.idx)
+
+    if starttime is not None:
+        tm_132 = tm_132.filter(func.left(DbTelemetry.timestamp, func.length(DbTelemetry.timestamp) - 1) >= starttime)
+
+    if endtime is not None:
+        tm_132 = tm_132.filter(func.left(DbTelemetry.timestamp, func.length(DbTelemetry.timestamp) - 1) <= endtime)
+
+    if startidx is not None:
+        tm_132 = tm_132.filter(DbTelemetry.idx >= startidx)
+
+    if endidx is not None:
+        tm_132 = tm_132.filter(DbTelemetry.idx <= endidx)
+
+    if sdu:
+        tm_132 = tm_132.filter(func.left(DbTelemetry.data, 1) == sdu.to_bytes(SDU_PAR_LENGTH, 'big'))
+
+    # make sure to start with a 13,1
+    while tm_bounds[0].sst != 1:
+        tm_bounds = tm_bounds[1:]
+        if len(tm_bounds) < 2:
+            return {None: None}
+    # and end with a 13,3
+    while tm_bounds[-1].sst != 3:
+        tm_bounds = tm_bounds[:-1]
+        if len(tm_bounds) < 2:
+            return {None: None}
+
+    if not collect_all:
+        tm_bounds = tm_bounds[:2]
+    else:
+        tm_bounds = tm_bounds[:]  # cast Query to list if not list already
+
+    # check for out of order 1s and 3s TODO: there can be short transfers with only TM13,1 and no TM13,3
+    idcs = [i.sst for i in tm_bounds]
+    outoforder = []
+    for i in range(len(idcs) - 1):
+        if idcs[i + 1] == idcs[i]:
+            if idcs[i] == 1:
+                outoforder.append(i)
+            elif idcs[i] == 3:
+                outoforder.append(i + 1)
+    dels = 0
+    for i in outoforder:
+        del tm_bounds[i - dels]
+        dels += 1
+    # check if start/end (1/3) strictly alternating
+    if not np.diff([i.sst for i in tm_bounds]).all():
+        print('Detected inconsistent transfers')
+        return {None: None}
+
+    k = 0
+    n = len(tm_bounds)
+    cnt = 0
+    while k < n - 1:
+        i, j = tm_bounds[k:k + 2]
+        if i.sst == j.sst:
+            k += 1
+            logger.warning('Identical consecutive SSTs found (idx={})'.format(i.idx))
+            continue
+        else:
+            pkts = [a.raw[S13_HEADER_LEN_TOTAL:-PEC_LEN] for a in tm_132.filter(DbTelemetry.idx > i.idx, DbTelemetry.idx < j.idx)]
+            if join:
+                ces[float(i.timestamp[:-1])] = i.raw[S13_HEADER_LEN_TOTAL:-PEC_LEN] + b''.join(pkts) + j.raw[S13_HEADER_LEN_TOTAL:-PEC_LEN]
+            else:
+                ces[float(i.timestamp[:-1])] = [i.raw[S13_HEADER_LEN_TOTAL:-PEC_LEN]] + [b''.join(pkts)] + [j.raw[S13_HEADER_LEN_TOTAL:-PEC_LEN]]
+            k += 2
+
+        cnt += 1
+        if verbose:
+            print('Collected {} of {} S13 transfers.'.format(cnt, n // 2), end='\r')
+
+    # for (i, j) in zip(tm_bounds[::2], tm_bounds[1::2]):
+    #     pkts = [a.raw[21:-2] for a in tm_132.filter(DbTelemetry.idx > i.idx, DbTelemetry.idx < j.idx)]
+    #     if join:
+    #         ces[float(i.timestamp[:-1])] = i.raw[21:-2] + b''.join(pkts) + j.raw[21:-2]
+    #     else:
+    #         ces[float(i.timestamp[:-1])] = [i.raw[21:-2]] + [b''.join(pkts)] + [j.raw[21:-2]]
+
+    return ces
+
+
+def dump_large_data(pool_name, starttime=0, endtime=None, outdir="", dump_all=False, sdu=None, startidx=None,
+                    endidx=None, verbose=True):
+    """
+    Dump S13 down transfer data to disk. For pools loaded from a file, pool_name must be the absolute path of that file.
+
+    :param pool_name:
+    :param starttime:
+    :param endtime:
+    :param outdir:
+    :param dump_all:
+    :param sdu:
+    :param startidx:
+    :param endidx:
+    :param verbose:
+    """
+
+    if not os.path.exists(outdir):
+        raise FileNotFoundError('Directory "{}" does not exist'.format(outdir))
 
-    if st is not None:
-        rows = rows.filter(DbTelemetry.stc == st)
-    if sst is not None:
-        rows = rows.filter(DbTelemetry.sst == sst)
-    if apid is not None:
-        rows = rows.filter(DbTelemetry.apid == apid)
+    filedict = {}
+    ldt_dict = collect_13(pool_name, starttime=starttime, endtime=endtime, join=True, collect_all=dump_all,
+                          startidx=startidx, endidx=endidx, sdu=sdu, verbose=verbose)
 
-    ret = [row.raw for row in rows.yield_per(1000)]
-    new_session.close()
-    return ret
+    ldt_cnt = 0
+    for i, buf in enumerate(ldt_dict, 1):
+        if ldt_dict[buf] is None:
+            continue
+
+        try:
+            obsid, ctime, ftime, ctr = s13_unpack_data_header(ldt_dict[buf])
+        except ValueError as err:
+            logger.error('Incompatible definition of S13 data header.')
+            raise err
 
+        fname = os.path.join(outdir, "LDT_{:03d}_{:010d}_{:06d}.ce".format(obsid, ctime, ctr))
 
-def add_tst_import_paths():
+        with open(fname, "wb") as fdesc:
+            fdesc.write(ldt_dict[buf])
+            filedict[buf] = fdesc.name
+            ldt_cnt += 1
+
+    if ldt_cnt != 0:
+        logger.info('Dumped {} CEs to {}'.format(ldt_cnt, outdir))
+    logger.debug('{} CEs found'.format(ldt_cnt))
+    # print('Dumped {} CEs to {}'.format(ldt_cnt, outdir))
+
+    return filedict
+
+
+class DbTools:
     """
-    Include all paths to TST files that could potentially be used.
+    SQL database management helpers
     """
-    # Add general tst path
-    sys.path.append(cfg.get('paths', 'tst'))
-    # Add all subfolders
-    sys.path.append(cfg.get('paths', 'tst') + '/codeblockreusefeature')
-    sys.path.append(cfg.get('paths', 'tst') + '/config_editor')
-    sys.path.append(cfg.get('paths', 'tst') + '/confignator')
-    sys.path.append(cfg.get('paths', 'tst') + '/doc')
-    sys.path.append(cfg.get('paths', 'tst') + '/icon_univie')
-    sys.path.append(cfg.get('paths', 'tst') + '/images')
-    sys.path.append(cfg.get('paths', 'tst') + '/log_viewer')
-    sys.path.append(cfg.get('paths', 'tst') + '/notes')
-    sys.path.append(cfg.get('paths', 'tst') + '/progress_view')
-    sys.path.append(cfg.get('paths', 'tst') + '/sketch_desk')
-    sys.path.append(cfg.get('paths', 'tst') + '/test_specs')
-    sys.path.append(cfg.get('paths', 'tst') + '/testing_library')
-    # insert this to import the tst view.py, not the one in .local folder
-    sys.path.insert(0, cfg.get('paths', 'tst') + '/tst')
 
+    @staticmethod
+    def recover_from_db(pool_name=None, iid=None, dump=False):
+        """
+        Recover TMTC packets not stored on disk from DB
+        @param pool_name:
+        @param iid:
+        @param dump:
+        @return:
+        """
+        new_session = scoped_session_storage
+        if pool_name:
+            rows = new_session.query(
+                DbTelemetry).join(
+                DbTelemetryPool, DbTelemetry.pool_id == DbTelemetryPool.iid).filter(
+                DbTelemetryPool.pool_name == pool_name)
+        elif iid:
+            rows = new_session.query(
+                DbTelemetry).join(
+                DbTelemetryPool, DbTelemetry.pool_id == DbTelemetryPool.iid).filter(
+                DbTelemetryPool.iid == iid)
+        else:
+            logger.error('Must give pool_name or iid')
+            return None
+
+        if dump:
+            with open(dump, 'wb') as fdesc:
+                fdesc.write(b''.join([row.raw for row in rows]))
+        new_session.close()
+        return rows
 
-def interleave_lists(*args):
-    if len({len(x) for x in args}) > 1:
-        logger.warning('Iterables are not of the same length, result will be truncated to the shortest input!')
-    return [i for j in zip(*args) for i in j]
+    @staticmethod
+    def clear_from_db(pool_name, answer=''):
+        """
+        Remove pool pool_name from DB
+        @param pool_name:
+        @param answer:
+        @return:
+        """
+        # answer = ''
+        while answer.lower() not in ['yes', 'no', 'y', 'n']:
+            answer = input("Clear pool\n >{}<\nfrom DB? (yes/no)\n".format(pool_name))
+        if answer.lower() in ['yes', 'y']:
+            new_session = scoped_session_storage
+            indb = new_session.execute('select * from tm_pool where pool_name="{}"'.format(pool_name))
+            if len(indb.fetchall()) == 0:
+                logger.error('POOL\n >{}<\nNOT IN DB!'.format(pool_name))
+                return
+            new_session.execute(
+                'delete tm from tm inner join tm_pool on tm.pool_id=tm_pool.iid where tm_pool.pool_name="{}"'.format(
+                    pool_name))
+            new_session.execute('delete tm_pool from tm_pool where tm_pool.pool_name="{}"'.format(pool_name))
+            # new_session.flush()
+            new_session.commit()
+            new_session.close()
+            logger.info('DELETED POOL\n >{}<\nFROM DB'.format(pool_name))
+        return
+
+    @staticmethod
+    def _clear_db():
+        """
+        Delete all pools from DB
+        @return:
+        """
+        answer = ''
+        while answer.lower() not in ['yes', 'no', 'y', 'n']:
+            answer = input(" > > > Clear all TMTC data from DB? < < < (yes/no)\n".upper())
+        if answer.lower() in ['yes', 'y']:
+            new_session = scoped_session_storage
+            new_session.execute('delete tm from tm inner join tm_pool on tm.pool_id=tm_pool.iid')
+            new_session.execute('delete tm_pool from tm_pool')
+            # new_session.flush()
+            new_session.commit()
+            new_session.close()
+            logger.info('>>> DELETED ALL POOLS FROM DB <<<')
+        return
 
+    @staticmethod
+    def _purge_db_logs(date=None):
+        """
+        Purge binary MySQL logs before _date_
+        @param date: ISO formatted date string; defaults to now, if None
+        """
+        if date is None:
+            now = datetime.datetime.now()
+            date = datetime.datetime.strftime(now, '%Y-%m-%d %H:%M:%S')
+        new_session = scoped_session_storage
+        new_session.execute('PURGE BINARY LOGS BEFORE "{:s}"'.format(date))
+        new_session.close()
+
+    @staticmethod
+    def delete_abandoned_rows(timestamp=None):
+        new_session = scoped_session_storage
+        try:
+            if timestamp is None:
+                new_session.execute(
+                    'DELETE tm FROM tm INNER JOIN tm_pool ON tm.pool_id=tm_pool.iid WHERE \
+                    tm_pool.pool_name LIKE "---TO-BE-DELETED%"')
+                new_session.execute(
+                    'DELETE rmap_tm FROM rmap_tm INNER JOIN tm_pool ON rmap_tm.pool_id=tm_pool.iid WHERE \
+                    tm_pool.pool_name LIKE "---TO-BE-DELETED%"')
+                new_session.execute(
+                    'DELETE feedata_tm FROM feedata_tm INNER JOIN tm_pool ON feedata_tm.pool_id=tm_pool.iid WHERE \
+                    tm_pool.pool_name LIKE "---TO-BE-DELETED%"')
+                new_session.execute('DELETE tm_pool FROM tm_pool WHERE tm_pool.pool_name LIKE "---TO-BE-DELETED%"')
+            else:
+                new_session.execute(
+                    'DELETE tm FROM tm INNER JOIN tm_pool ON tm.pool_id=tm_pool.iid WHERE \
+                    tm_pool.pool_name="---TO-BE-DELETED{}"'.format(timestamp))
+                new_session.execute('DELETE tm_pool FROM tm_pool WHERE tm_pool.pool_name="---TO-BE-DELETED{}"'.format(
+                    timestamp))
+
+            new_session.commit()
+            return 0
+        except Exception as err:
+            logger.error("Error trying to delete old DB rows: {}".format(err))
+            new_session.rollback()
+            return 1
+        finally:
+            new_session.close()
 
-class TestReport:
 
+class TestReport:
+    """
+    Provides functions for interactive test reporting
+    """
     def __init__(self, filename, version, idb_version, gui=False, delimiter='|'):
         super(TestReport, self).__init__()
         self.specfile = filename
@@ -3704,7 +5930,12 @@ class TestReport:
                 self.step_rowid[items[0]] = i
 
     def execute_step(self, step, ask=True):
+        """
 
+        :param step:
+        :param ask:
+        :return:
+        """
         if not ask:
             return
 
@@ -3741,7 +5972,11 @@ class TestReport:
             return
 
     def verify_step(self, step):
+        """
 
+        :param step:
+        :return:
+        """
         try:
             ver_msg = '{}:\n{}'.format(step.upper(), self.report[self.step_rowid[str(step)]][2])
             if self.gui:
@@ -3772,25 +6007,36 @@ class TestReport:
 
         self.report[self.step_rowid[str(step)]][3] = result
 
-    def export(self, reportdir=None):
-        if reportdir is None:
-            reportfile = self.specfile.replace('.csv_PIPE', '-TR-{:03d}.csv_PIPE'.format(self.version)).replace('/testspec/', '/testrep/')
-        else:
-            reportdir += '/' if not reportdir.endswith('/') else ''
-            reportfile = reportdir + self.specfile.split('/')[-1].replace('.csv_PIPE', '-TR-{:03d}.csv_PIPE'.format(self.version))
+    def export(self, reportdir=None, reportfile=None):
+        """
+
+        :param reportdir:
+        :param reportfile:
+        """
+        if reportfile is None:
+            if reportdir is None:
+                reportfile = self.specfile.replace('.csv_PIPE', '-TR-{:03d}.csv_PIPE'.format(self.version)).replace('/testspec/', '/testrep/')
+            else:
+                reportdir += '/' if not reportdir.endswith('/') else ''
+                reportfile = reportdir + self.specfile.split('/')[-1].replace('.csv_PIPE', '-TR-{:03d}.csv_PIPE'.format(self.version))
 
         self.report[1][3] += ' TR-{:03d}, MIB v{}'.format(self.version, self.idb_version)
         self.report[2][3] = time.strftime('%Y-%m-%d')
 
         buf = '\n'.join([self.delimiter.join(self.report[line]) for line in range(len(self.report))])
 
+        Path(os.path.dirname(reportfile)).mkdir(parents=True, exist_ok=True)  # create directory if it does not exist
+
         with open(reportfile, 'w') as fd:
             fd.write(buf + '\n')
         logger.info('Report written to {}.'.format(reportfile))
+        print('Report written to {}.'.format(reportfile))
 
 
 class TestReportGUI(Gtk.MessageDialog):
-
+    """
+    GUI for the TestReport class
+    """
     def __init__(self, testlabel, message):
         super(TestReportGUI, self).__init__(title=testlabel,
                                             buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
@@ -3816,7 +6062,9 @@ class TestReportGUI(Gtk.MessageDialog):
 
 
 class TestExecGUI(Gtk.MessageDialog):
-
+    """
+    Dialog window to confirm test step execution
+    """
     def __init__(self, testlabel, message):
         super(TestExecGUI, self).__init__(title=testlabel,
                                           buttons=(# Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
@@ -3837,8 +6085,11 @@ class TestExecGUI(Gtk.MessageDialog):
 
 
 class TmParameterDecoderDialog(Gtk.Dialog):
+    """
+    Interface to define custom paramters
+    """
     def __init__(self, parent=None):
-        Gtk.Dialog.__init__(self, "Add User Decoder Parameter", parent, 0,
+        Gtk.Dialog.__init__(self, "Add User Parameter", parent, 0,
                             buttons=(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
 
         self.set_border_width(5)
@@ -3850,21 +6101,22 @@ class TmParameterDecoderDialog(Gtk.Dialog):
         bytebox = Gtk.HBox()
 
         self.format = Gtk.ComboBoxText()
-        self.format.set_model(self.create_format_model())
+        self.format.set_model(create_format_model())
         self.format.set_tooltip_text('Format type')
         self.format.connect('changed', self.bitlen_active)
+        self.format.connect('changed', self.check_ok_sensitive, ok_button)
+        # self.offbi = Gtk.Entry()
+        # self.offbi.set_placeholder_text('Bit offset')
+        # self.offbi.set_tooltip_text('Bit offset from byte alignment')
+        # self.offbi.set_sensitive(False)
         self.bitlen = Gtk.Entry()
-        self.bitlen.set_placeholder_text('BitLength')
-        self.bitlen.set_tooltip_text('Length in bits')
+        self.bitlen.set_placeholder_text('Length')
+        self.bitlen.set_tooltip_text('Length in bits (for uint*) or bytes (ascii*, oct*)')
         self.bitlen.set_sensitive(False)
-        self.bytepos = Gtk.Entry()
-        self.bytepos.set_placeholder_text('Byte Offset')
-        self.bytepos.set_tooltip_text('(Optional) Including {} ({} for TCs) header bytes, e.g. byte 0 in source data -> offset={}'
-                                      .format(TM_HEADER_LEN, TC_HEADER_LEN, TM_HEADER_LEN))
 
         bytebox.pack_start(self.format, 0, 0, 0)
+        # bytebox.pack_start(self.offbi, 0, 0, 0)
         bytebox.pack_start(self.bitlen, 0, 0, 0)
-        bytebox.pack_start(self.bytepos, 0, 0, 0)
         bytebox.set_spacing(5)
 
         self.label = Gtk.Entry()
@@ -3877,30 +6129,38 @@ class TmParameterDecoderDialog(Gtk.Dialog):
 
         self.show_all()
 
-    def create_format_model(self):
-        store = Gtk.ListStore(str)
-        for fmt in fmtlist.keys():
-            store.append([fmt])
-        for pers in personal_fmtlist:
-            store.append([pers])
-        return store
-
     def check_ok_sensitive(self, unused_widget, button):
-        if len(self.label.get_text()) == 0:
+        """
+
+        :param unused_widget:
+        :param button:
+        """
+        if len(self.label.get_text()) == 0 or not self.format.get_active_text():
             button.set_sensitive(False)
         else:
             button.set_sensitive(True)
 
     def bitlen_active(self, widget):
-        if widget.get_active_text() == 'bit*' or widget.get_active_text() not in fmtlist.keys():
+        """
+
+        :param widget:
+        """
+        if widget.get_active_text().endswith('*'):
             self.bitlen.set_sensitive(True)
+            # if widget.get_active_text().startswith(('ascii', 'oct')):
+            #     self.offbi.set_sensitive(False)
+            # else:
+            #     self.offbi.set_sensitive(True)
         else:
             self.bitlen.set_sensitive(False)
 
 
 class TmDecoderDialog(Gtk.Dialog):
+    """
+    Interface to define custom packet structures
+    """
     def __init__(self, logger, parameter_set=None, parent=None):
-        Gtk.Dialog.__init__(self, "Build User Defined Packet", parent, 0)
+        Gtk.Dialog.__init__(self, "Build User Defined Packet Structure", parent, 0)
         self.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
 
         # self.set_default_size(780,560)
@@ -3924,6 +6184,11 @@ class TmDecoderDialog(Gtk.Dialog):
         self.show_all()
 
     def create_view(self, parameter_set=None):
+        """
+
+        :param parameter_set:
+        :return:
+        """
         parameter_view = self.create_param_view()
         packet = None
 
@@ -3941,17 +6206,19 @@ class TmDecoderDialog(Gtk.Dialog):
         self.apid.set_placeholder_text('APID')
         self.st.set_placeholder_text('Service Type')
         self.sst.set_placeholder_text('Service Subtype')
-        self.label.set_placeholder_text('Label for the current configuration')
+        self.label.set_placeholder_text('Label')
+        self.label.set_tooltip_text('Label for the current configuration')
 
         self.sid = Gtk.Entry()
         self.sid.set_placeholder_text('SID')
+        self.sid.set_tooltip_text('Discriminant, only applicable if ST and SST have a SID defined in the MIB.')
 
         self.apid.connect('changed', self.check_entry)
         self.st.connect('changed', self.check_entry)
         self.sst.connect('changed', self.check_entry)
         self.label.connect('changed', self.check_entry)
 
-        entrybox.pack_start(self.label,0, 0, 0)
+        entrybox.pack_start(self.label, 0, 0, 0)
         entrybox.pack_start(self.apid, 0, 0, 0)
         entrybox.pack_start(self.st, 0, 0, 0)
         entrybox.pack_start(self.sst, 0, 0, 0)
@@ -3960,15 +6227,15 @@ class TmDecoderDialog(Gtk.Dialog):
         entrybox.set_homogeneous(True)
         entrybox.set_spacing(5)
 
-        decisionbox = Gtk.HBox()
-
-        self.given_poition = Gtk.RadioButton.new_with_label_from_widget(None, 'Local')
-        self.given_poition.set_tooltip_text('Decode in given order')
-        self.idb_position = Gtk.RadioButton.new_with_label_from_widget(self.given_poition, 'IDB')
-        self.idb_position.set_tooltip_text('Decode by parameter position given in IDB')
-
-        decisionbox.pack_start(self.given_poition, 0, 0, 0)
-        decisionbox.pack_start(self.idb_position, 0, 0, 0)
+        # decisionbox = Gtk.HBox()
+        #
+        # self.given_poition = Gtk.RadioButton.new_with_label_from_widget(None, 'Local')
+        # self.given_poition.set_tooltip_text('Decode in given order')
+        # self.idb_position = Gtk.RadioButton.new_with_label_from_widget(self.given_poition, 'IDB')
+        # self.idb_position.set_tooltip_text('Decode by parameter position given in IDB')
+        #
+        # decisionbox.pack_start(self.given_poition, 0, 0, 0)
+        # decisionbox.pack_start(self.idb_position, 0, 0, 0)
 
         if parameter_set is not None:
 
@@ -4004,19 +6271,22 @@ class TmDecoderDialog(Gtk.Dialog):
             slot = self.create_slot()
             slotbox.pack_start(slot, 1, 1, 0)
 
-        note = Gtk.Label(label="Note: User-Defined_IDB parameter can only be used if IDB order is chosen, "
-                               "User-Defined_Local only for Local order")
+        # note = Gtk.Label(label="Note: User-Defined_IDB parameter can only be used if IDB order is chosen, User-Defined_Local only for Local order")
 
         box = Gtk.VBox()
         box.pack_start(parameter_view, 1, 1, 5)
-        box.pack_start(note, 0,0,0)
+        # box.pack_start(note, 0,0,0)
         box.pack_start(slotbox, 1, 1, 2)
-        box.pack_start(decisionbox, 1, 1, 2)
+        # box.pack_start(decisionbox, 1, 1, 2)
         box.pack_start(entrybox, 0, 0, 3)
 
         return box
 
     def create_param_view(self):
+        """
+
+        :return:
+        """
         self.treeview = Gtk.TreeView(self.create_parameter_model())
 
         self.treeview.append_column(Gtk.TreeViewColumn("Parameters", Gtk.CellRendererText(), text=0))
@@ -4035,8 +6305,14 @@ class TmDecoderDialog(Gtk.Dialog):
         return sw
 
     def create_slot(self, group=None):
+        """
+
+        :param group:
+        :return:
+        """
         self.parameter_list = Gtk.ListStore(str, str)
         treeview = Gtk.TreeView(self.parameter_list)
+        treeview.set_reorderable(True)
 
         treeview.append_column(Gtk.TreeViewColumn("Parameters", Gtk.CellRendererText(), text=0))
         hidden_column = Gtk.TreeViewColumn("PCF_NAME", Gtk.CellRendererText(), text=1)
@@ -4072,6 +6348,11 @@ class TmDecoderDialog(Gtk.Dialog):
         return vbox
 
     def name_to_descr(self, name):
+        """
+
+        :param name:
+        :return:
+        """
         dbcon = self.session_factory_idb
         dbres = dbcon.execute('SELECT pcf_descr, pcf_name FROM pcf WHERE pcf_name="{}"'.format(name))
         name = dbres.fetchall()
@@ -4081,37 +6362,103 @@ class TmDecoderDialog(Gtk.Dialog):
         else:
             return None, None
 
+    # def create_parameter_model_old(self):
+    #     parameter_model = Gtk.TreeStore(str, str)
+    #
+    #     dbcon = self.session_factory_idb
+    #     #dbres = dbcon.execute('SELECT pid_descr,pid_spid from pid where pid_type=3 and pid_stype=25')
+    #     dbres = dbcon.execute('SELECT pid_descr,pid_spid from pid order by pid_type,pid_pi1_val')
+    #     hks = dbres.fetchall()
+    #     for hk in hks:
+    #         it = parameter_model.append(None, [hk[0], None])
+    #         dbres = dbcon.execute('SELECT pcf.pcf_descr, pcf.pcf_name from pcf left join plf on\
+    #          pcf.pcf_name=plf.plf_name left join pid on plf.plf_spid=pid.pid_spid where pid.pid_spid={}'.format(hk[1]))
+    #         params = dbres.fetchall()
+    #         [parameter_model.append(it, [par[0], par[1]]) for par in params]
+    #     dbcon.close()
+    #     self.useriter_IDB = parameter_model.append(None, ['User-defined_IDB', None])
+    #     self.useriter_local = parameter_model.append(None, ['User-defined_local', None])
+    #     for userpar in self.cfg['ccs-user_decoders']:
+    #         parameter_model.append(self.useriter_IDB, [userpar, None])
+    #     for userpar in self.cfg['ccs-decode_parameters']:
+    #         parameter_model.append(self.useriter_local, [userpar, None])
+    #
+    #     return parameter_model
+
     def create_parameter_model(self):
+        """
+
+        :return:
+        """
         parameter_model = Gtk.TreeStore(str, str)
+        self.store = parameter_model
 
         dbcon = self.session_factory_idb
-        #dbres = dbcon.execute('SELECT pid_descr,pid_spid from pid where pid_type=3 and pid_stype=25')
-        dbres = dbcon.execute('SELECT pid_descr,pid_spid from pid order by pid_type,pid_pi1_val')
+        dbres = dbcon.execute('SELECT pid_descr,pid_spid,pid_type from pid order by pid_type,pid_stype,pid_pi1_val')
         hks = dbres.fetchall()
+
+        topleveliters = {}
         for hk in hks:
-            it = parameter_model.append(None, [hk[0], None])
-            dbres = dbcon.execute('SELECT pcf.pcf_descr, pcf.pcf_name from pcf left join plf on\
-             pcf.pcf_name=plf.plf_name left join pid on plf.plf_spid=pid.pid_spid where pid.pid_spid={}'.format(hk[1]))
+
+            if not hk[2] in topleveliters:
+                serv = parameter_model.append(None, ['Service ' + str(hk[2]), None])
+                topleveliters[hk[2]] = serv
+
+            it = parameter_model.append(topleveliters[hk[2]], [hk[0], None])
+
+            dbres = dbcon.execute('SELECT pcf.pcf_descr, pcf.pcf_name from pcf left join plf on pcf.pcf_name=plf.plf_name left join pid on \
+                                   plf.plf_spid=pid.pid_spid where pid.pid_spid={} ORDER BY pcf.pcf_descr'.format(hk[1]))
             params = dbres.fetchall()
-            [parameter_model.append(it, [par[0], par[1]]) for par in params]
+            for par in params:
+                parameter_model.append(it, [*par])
+
         dbcon.close()
-        self.useriter_IDB = parameter_model.append(None, ['User-defined_IDB', None])
-        self.useriter_local = parameter_model.append(None, ['User-defined_local', None])
-        for userpar in self.cfg['ccs-user_decoders']:
-            parameter_model.append(self.useriter_IDB, [userpar, None])
-        for userpar in self.cfg['ccs-decode_parameters']:
-            parameter_model.append(self.useriter_local, [userpar, None])
+
+        # # add user defined PACKETS
+        # self.user_tm_decoders = user_tm_decoders_func()
+        # topit = parameter_model.append(None, ['UDEF'])
+        # for hk in self.user_tm_decoders:
+        #     it = parameter_model.append(topit, ['UDEF|{}'.format(self.user_tm_decoders[hk][0])])
+        #     for par in self.user_tm_decoders[hk][1]:
+        #         parameter_model.append(it, [par[1]])
+
+        # add data pool items
+        self.useriter = parameter_model.append(None, ['Data pool', None])
+        for dp in _dp_items:
+            dp_item = '{} ({})'.format(_dp_items[dp]['descr'], dp)
+            parameter_model.append(self.useriter, [dp_item, 'dp_item'])
+
+        # add user defined PARAMETERS with positional info
+        self.useriter = parameter_model.append(None, ['User defined', None])
+        for userpar in self.cfg[CFG_SECT_PLOT_PARAMETERS]:
+            parameter_model.append(self.useriter, [userpar, 'user_defined'])
+
+        # add user defined PARAMETERS without positional info
+        for userpar in self.cfg[CFG_SECT_DECODE_PARAMETERS]:
+            parameter_model.append(self.useriter, [userpar, 'user_defined_nopos'])
 
         return parameter_model
 
     def add_parameter(self, widget, listmodel):
+        """
+
+        :param widget:
+        :param listmodel:
+        :return:
+        """
         par_model, par_iter = self.treeview.get_selection().get_selected()
-        hk = par_model[par_iter].parent[0]
+        if par_model[par_iter][1] is None:
+            return
+
+        # hk = par_model[par_iter].parent[0]
+
         if par_model[par_iter].parent is None:
             return
-        elif hk not in ['User-defined_IDB', 'User-defined_local']:
-            param = par_model[par_iter]
-            listmodel.append([*param])
+
+        # elif hk not in ['User-defined_IDB', 'User-defined_local']:
+        #     param = par_model[par_iter]
+        #     listmodel.append([*param])
+
         else:
             param = par_model[par_iter]
             listmodel.append([*param])
@@ -4119,6 +6466,12 @@ class TmDecoderDialog(Gtk.Dialog):
         return
 
     def remove_parameter(self, widget, listview):
+        """
+
+        :param widget:
+        :param listview:
+        :return:
+        """
         model, modeliter = listview.get_selection().get_selected()
 
         if modeliter is None:
@@ -4128,6 +6481,10 @@ class TmDecoderDialog(Gtk.Dialog):
         return
 
     def check_entry(self, widget):
+        """
+
+        :param widget:
+        """
         if self.apid.get_text_length() and self.st.get_text_length() and self.sst.get_text_length \
                 and self.label.get_text_length():
             self.ok_button.set_sensitive(True)
@@ -4135,9 +6492,12 @@ class TmDecoderDialog(Gtk.Dialog):
             self.ok_button.set_sensitive(False)
 
 
-class AddUserParamerterDialog(Gtk.MessageDialog):
+class UserParameterDialog(Gtk.MessageDialog):
+    """
+    Interface to edit a user-defined parameter
+    """
     def __init__(self, parent=None, edit=None):
-        Gtk.Dialog.__init__(self, "Add User Parameter", parent, 0,
+        Gtk.Dialog.__init__(self, "Edit User Parameter", parent, 0,
                             buttons=(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
 
         self.cfg = cfg
@@ -4153,11 +6513,14 @@ class AddUserParamerterDialog(Gtk.MessageDialog):
         self.st = Gtk.Entry()
         self.sst = Gtk.Entry()
         self.apid.set_placeholder_text('APID')
+        self.apid.connect('changed', self.check_entry, ok_button)
         self.st.set_placeholder_text('Service Type')
+        self.st.connect('changed', self.check_entry, ok_button)
         self.sst.set_placeholder_text('Service Subtype')
+        self.sst.connect('changed', self.check_entry, ok_button)
         self.sid = Gtk.Entry()
         self.sid.set_placeholder_text('SID')
-        self.sid.set_tooltip_text('First byte in source data (optional)')
+        self.sid.set_tooltip_text('Discriminant (i.e. PI1VAL)')
 
         hbox.pack_start(self.apid, 0, 0, 0)
         hbox.pack_start(self.st, 0, 0, 0)
@@ -4170,18 +6533,20 @@ class AddUserParamerterDialog(Gtk.MessageDialog):
 
         self.bytepos = Gtk.Entry()
         self.bytepos.set_placeholder_text('Byte Offset')
-        self.bytepos.set_tooltip_text('Including {} ({} for TCs) header bytes, e.g. byte 0 in source data -> offset={}'
+        self.bytepos.set_tooltip_text('Including {} ({} for TCs) header bytes, e.g. byte 0 in TM source data -> offset={}'
                                       .format(TM_HEADER_LEN, TC_HEADER_LEN, TM_HEADER_LEN))
+        self.bytepos.connect('changed', self.check_entry, ok_button)
         self.format = Gtk.ComboBoxText()
-        self.format.set_model(self.create_format_model())
+        self.format.set_model(create_format_model())
         self.format.set_tooltip_text('Format type')
         self.format.connect('changed', self.bitlen_active)
         self.offbi = Gtk.Entry()
         self.offbi.set_placeholder_text('Bit Offset')
         self.offbi.set_tooltip_text('Bit Offset (optional)')
+        self.offbi.set_sensitive(False)
         self.bitlen = Gtk.Entry()
-        self.bitlen.set_placeholder_text('Bitlength')
-        self.bitlen.set_tooltip_text('Length in bits')
+        self.bitlen.set_placeholder_text('Length')
+        self.bitlen.set_tooltip_text('Length in bits (for uint*) and bytes (ascii*, oct*)')
         self.bitlen.set_sensitive(False)
 
         bytebox.pack_start(self.bytepos, 0, 0, 0)
@@ -4192,7 +6557,7 @@ class AddUserParamerterDialog(Gtk.MessageDialog):
 
         self.label = Gtk.Entry()
         self.label.set_placeholder_text('Parameter Label')
-        self.label.connect('changed', self.check_ok_sensitive, ok_button)
+        self.label.connect('changed', self.check_entry, ok_button)
 
         box.pack_start(self.label, 0, 0, 0)
         box.pack_end(bytebox, 0, 0, 0)
@@ -4200,7 +6565,7 @@ class AddUserParamerterDialog(Gtk.MessageDialog):
         box.set_spacing(10)
 
         if edit is not None:
-            pars = json.loads(self.cfg['ccs-plot_parameters'][edit])
+            pars = json.loads(self.cfg[CFG_SECT_PLOT_PARAMETERS][edit])
             self.label.set_text(edit)
             if 'ST' in pars:
                 self.st.set_text(str(pars['ST']))
@@ -4215,9 +6580,11 @@ class AddUserParamerterDialog(Gtk.MessageDialog):
             if 'format' in pars:
                 fmt_dict = {a: b for b, a in fmtlist.items()}
                 fmt = pars['format']
-                if fmt.startswith('bit'):
-                    self.bitlen.set_text(fmt.strip('bit'))
-                    fmt = 'bit'
+                for fk in ('uint', 'ascii', 'oct'):
+                    if fmt.startswith(fk):
+                        self.bitlen.set_text(fmt.replace(fk, ''))
+                        fmt = fk
+                        break
                 model = self.format.get_model()
                 it = [row.iter for row in model if row[0] == fmt_dict[fmt]][0]
                 self.format.set_active_iter(it)
@@ -4226,114 +6593,123 @@ class AddUserParamerterDialog(Gtk.MessageDialog):
 
         self.show_all()
 
-    def create_format_model(self):
-        store = Gtk.ListStore(str)
-        for fmt in fmtlist.keys():
-            store.append([fmt])
-        return store
+    def check_entry(self, widget, ok_button):
+        """
 
-    def check_ok_sensitive(self, unused_widget, button):
-        if len(self.label.get_text()) == 0:
-            button.set_sensitive(False)
+        :param widget:
+        :param ok_button:
+        """
+        if self.apid.get_text_length() and self.st.get_text_length() and self.sst.get_text_length \
+                and self.label.get_text_length() and self.bytepos.get_text_length():
+            ok_button.set_sensitive(True)
         else:
-            button.set_sensitive(True)
+            ok_button.set_sensitive(False)
 
     def bitlen_active(self, widget):
-        if widget.get_active_text() == 'bit*':
+        """
+
+        :param widget:
+        """
+        if widget.get_active_text() == 'uint*':
             self.bitlen.set_sensitive(True)
             self.offbi.set_sensitive(True)
+        elif widget.get_active_text() in ('ascii*', 'oct*'):
+            self.bitlen.set_sensitive(True)
+            self.offbi.set_sensitive(False)
         else:
             self.bitlen.set_sensitive(False)
             self.offbi.set_sensitive(False)
 
 
-class RemoveUserParameterDialog(Gtk.Dialog):
-    def __init__(self, cfg, parent=None):
-        Gtk.Dialog.__init__(self, "Remove User Defined Parameter", parent, 0)
-        self.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
-
-        self.cfg = cfg
-
-        box = self.get_content_area()
-
-        self.ok_button = self.get_widget_for_response(Gtk.ResponseType.OK)
-        self.ok_button.set_sensitive(False)
-
-
-        self.remove_name = Gtk.ComboBoxText.new_with_entry()
-        self.remove_name.set_tooltip_text('Parameter')
-        self.remove_name_entry = self.remove_name.get_child()
-        self.remove_name_entry.set_placeholder_text('Label')
-        self.remove_name_entry.set_width_chars(5)
-        self.remove_name.connect('changed', self.fill_remove_mask)
-
-        self.remove_name.set_model(self.create_remove_model())
-
-        box.pack_start(self.remove_name, 0, 0, 0)
-
-        self.show_all()
-
-    def create_remove_model(self):
-        model = Gtk.ListStore(str)
-
-        for decoder in self.cfg['ccs-plot_parameters'].keys():
-            model.append([decoder])
-        return model
-
-    def fill_remove_mask(self, widget):
-        decoder = widget.get_active_text()
-
-        if self.cfg.has_option('ccs-plot_parameters', decoder):
-            self.ok_button.set_sensitive(True)
-        else:
-            self.ok_button.set_sensitive(False)
-
-
-class EditUserParameterDialog(Gtk.Dialog):
-    def __init__(self, cfg, parent=None):
-        Gtk.Dialog.__init__(self, "Edit User Defined Parameter", parent, 0)
-        self.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
-
-        self.cfg = cfg
-
-        box = self.get_content_area()
-
-        self.ok_button = self.get_widget_for_response(Gtk.ResponseType.OK)
-        self.ok_button.set_sensitive(False)
-
-        self.edit_name = Gtk.ComboBoxText.new_with_entry()
-        self.edit_name.set_tooltip_text('Parameter')
-        self.edit_name_entry = self.edit_name.get_child()
-        self.edit_name_entry.set_placeholder_text('Label')
-        self.edit_name_entry.set_width_chars(5)
-        self.edit_name.connect('changed', self.fill_edit_mask)
-
-        self.edit_name.set_model(self.create_edit_model())
-
-        box.pack_start(self.edit_name, 0, 0, 0)
-
-        self.show_all()
-
-    def create_edit_model(self):
-        model = Gtk.ListStore(str)
-
-        for decoder in self.cfg['ccs-plot_parameters'].keys():
-            model.append([decoder])
-        return model
+# class RemoveUserParameterDialog(Gtk.Dialog):
+#     def __init__(self, cfg, parent=None):
+#         Gtk.Dialog.__init__(self, "Remove User Defined Parameter", parent, 0)
+#         self.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
+#
+#         self.cfg = cfg
+#
+#         box = self.get_content_area()
+#
+#         self.ok_button = self.get_widget_for_response(Gtk.ResponseType.OK)
+#         self.ok_button.set_sensitive(False)
+#
+#         self.remove_name = Gtk.ComboBoxText.new_with_entry()
+#         self.remove_name.set_tooltip_text('Parameter')
+#         self.remove_name_entry = self.remove_name.get_child()
+#         self.remove_name_entry.set_placeholder_text('Label')
+#         self.remove_name_entry.set_width_chars(5)
+#         self.remove_name.connect('changed', self.fill_remove_mask)
+#
+#         self.remove_name.set_model(self.create_remove_model())
+#
+#         box.pack_start(self.remove_name, 0, 0, 0)
+#
+#         self.show_all()
+#
+#     def create_remove_model(self):
+#         model = Gtk.ListStore(str)
+#
+#         for decoder in self.cfg[CFG_SECT_PLOT_PARAMETERS].keys():
+#             model.append([decoder])
+#         return model
+#
+#     def fill_remove_mask(self, widget):
+#         decoder = widget.get_active_text()
+#
+#         if self.cfg.has_option(CFG_SECT_PLOT_PARAMETERS, decoder):
+#             self.ok_button.set_sensitive(True)
+#         else:
+#             self.ok_button.set_sensitive(False)
 
-    def fill_edit_mask(self, widget):
-        decoder = widget.get_active_text()
 
-        if self.cfg.has_option('ccs-plot_parameters', decoder):
-            self.ok_button.set_sensitive(True)
-        else:
-            self.ok_button.set_sensitive(False)
+# class EditUserParameterDialog(Gtk.Dialog):
+#     def __init__(self, cfg, parent=None):
+#         Gtk.Dialog.__init__(self, "Edit User Defined Parameter", parent, 0)
+#         self.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
+#
+#         self.cfg = cfg
+#
+#         box = self.get_content_area()
+#
+#         self.ok_button = self.get_widget_for_response(Gtk.ResponseType.OK)
+#         self.ok_button.set_sensitive(False)
+#
+#         self.edit_name = Gtk.ComboBoxText.new_with_entry()
+#         self.edit_name.set_tooltip_text('Parameter')
+#         self.edit_name_entry = self.edit_name.get_child()
+#         self.edit_name_entry.set_placeholder_text('Label')
+#         self.edit_name_entry.set_width_chars(5)
+#         self.edit_name.connect('changed', self.fill_edit_mask)
+#
+#         self.edit_name.set_model(self.create_edit_model())
+#
+#         box.pack_start(self.edit_name, 0, 0, 0)
+#
+#         self.show_all()
+#
+#     def create_edit_model(self):
+#         model = Gtk.ListStore(str)
+#
+#         for decoder in self.cfg[CFG_SECT_PLOT_PARAMETERS].keys():
+#             model.append([decoder])
+#         return model
+#
+#     def fill_edit_mask(self, widget):
+#         decoder = widget.get_active_text()
+#
+#         if self.cfg.has_option(CFG_SECT_PLOT_PARAMETERS, decoder):
+#             self.ok_button.set_sensitive(True)
+#         else:
+#             self.ok_button.set_sensitive(False)
 
 
 class ChangeCommunicationDialog(Gtk.Dialog):
+    """
+    This dialog is used to manage the main_communication in the CCS via a GUI
+    """
     def __init__(self, cfg, main_instance, parent=None):
         """
-        This Dialog is used to manage the main_communication in the CCS with a GUI
+
         :param cfg: Is the config file
         :param main_instance: Is the project name
         :param parent: Given Gtk.Window instance
@@ -4369,7 +6745,8 @@ class ChangeCommunicationDialog(Gtk.Dialog):
     def setup_change_box(self):
         """
         Sets up the main Box in which the change happens
-        :return: A Gtk.Box
+
+        :return: a Gtk.Box
         """
         main_box = Gtk.HBox()
 
@@ -4386,7 +6763,7 @@ class ChangeCommunicationDialog(Gtk.Dialog):
 
             #Start each Changing box here
             communication_entry = Gtk.ComboBox.new_with_model(entry_list)
-            communication_entry.set_title(name) #Give the boxes names to seperate them
+            communication_entry.set_title(name) #Give the boxes names to separate them
             communication_entry.connect('changed', self.main_com_changed)
 
             # Necessary for Combobox but not importent for program
@@ -4406,6 +6783,7 @@ class ChangeCommunicationDialog(Gtk.Dialog):
     def get_entry_list(self, app):
         """
         Returns a List of all active instance of the given application in this main_instance (project)
+
         :param app: application name (poolviewer,...)
         :return: liststore and listplace
         """
@@ -4433,6 +6811,7 @@ class ChangeCommunicationDialog(Gtk.Dialog):
     def main_com_changed(self, widget):
         """
         Is called when some connection is changed
+
         :param widget:
         :return:
         """
@@ -4448,6 +6827,7 @@ class ChangeCommunicationDialog(Gtk.Dialog):
     def get_tick_box(self):
         """
         Creates the Check Button
+
         :return: a Gtk.Box
         """
         main_box = Gtk.VBox()
@@ -4463,7 +6843,7 @@ class ChangeCommunicationDialog(Gtk.Dialog):
 
 class ProjectDialog(Gtk.Dialog):
     """
-    Dialog that pops up at CCS/TST startup to allow for project and IDB configuration
+    Dialog that optionally pops up at CCS/TST start-up to allow for project and IDB configuration
     """
 
     def __init__(self):
@@ -4517,7 +6897,7 @@ class ProjectDialog(Gtk.Dialog):
         for p in projects:
             project_selection.append(p, p)
 
-        set_as = cfg.get.get_option('ccs-database', 'project')
+        set_as = cfg.get('ccs-database', 'project')
         project_selection.set_active_id(set_as)
 
         return project_selection
@@ -4532,7 +6912,7 @@ class ProjectDialog(Gtk.Dialog):
         for m in mibs:
             idb_selection.append(m, m)
 
-        set_as = cfg.get('ccs-database', 'idb_schema')
+        set_as = cfg.get('database', 'mib-schema')
         idb_selection.set_active_id(set_as)
 
         return idb_selection
@@ -4540,8 +6920,8 @@ class ProjectDialog(Gtk.Dialog):
     def _write_config(self, widget, data):
         if data == 1:
 
-            self.cfg.save_option_to_file('ccs-database', 'project', self.project_selection.get_active_text())
-            self.cfg.save_option_to_file('ccs-database', 'idb_schema', self.idb_selection.get_active_text())
+            self.cfg.save_option_to_file('project', 'name', self.project_selection.get_active_text())
+            self.cfg.save_option_to_file('database', 'mib-schema', self.idb_selection.get_active_text())
 
             self.destroy()
             Gtk.main_quit()
@@ -4549,3 +6929,35 @@ class ProjectDialog(Gtk.Dialog):
         else:
             self.close()
             sys.exit()
+
+
+# some default variable definitions that require functions defined above
+
+# create local look-up tables for data pool items from MIB
+try:
+    DP_ITEMS_SRC_FILE = cfg.get('database', 'datapool-items')
+    if DP_ITEMS_SRC_FILE:
+        # get DP from file
+        _dp_items = get_data_pool_items(src_file=DP_ITEMS_SRC_FILE, as_dict=True)
+    else:
+        raise ValueError
+except (FileNotFoundError, ValueError, confignator.config.configparser.NoOptionError):
+    if 'DP_ITEMS_SRC_FILE' not in locals():
+        DP_ITEMS_SRC_FILE = None
+    logger.warning('Could not load data pool from file: {}. Using MIB instead.'.format(DP_ITEMS_SRC_FILE))
+    _dp_items = get_data_pool_items(as_dict=True)
+finally:
+    # DP_IDS_TO_ITEMS = {int(k[0]): k[1] for k in _dp_items}
+    DP_IDS_TO_ITEMS = {k: _dp_items[k]['descr'] for k in _dp_items}
+    DP_ITEMS_TO_IDS = {_dp_items[k]['descr']: k for k in _dp_items}
+
+# S13 header/offset info
+try:
+    _s13_info = get_tm_parameter_sizes(13, 1)
+    SDU_PAR_LENGTH = _s13_info[0][-1]
+    # length of PUS + source header in S13 packets (i.e. data to be removed when collecting S13)
+    S13_HEADER_LEN_TOTAL = TM_HEADER_LEN + sum([p[-1] for p in _s13_info])
+except (SQLOperationalError, NotImplementedError, IndexError):
+    logger.warning('Could not get S13 info from MIB, using default values')
+    SDU_PAR_LENGTH = 1
+    S13_HEADER_LEN_TOTAL = 21
diff --git a/Ccs/ccs_main_config.cfg b/Ccs/ccs_main_config.cfg
index 71048821335a83505e70f8b241c66af4b6cf0436..704709b3590cdb29359e7373d468e921cca51ddf 100644
--- a/Ccs/ccs_main_config.cfg
+++ b/Ccs/ccs_main_config.cfg
@@ -32,6 +32,10 @@ editor_host =
 editor_ul_port = 4242
 editor_dl_port = 4343
 ifsw_path = ../../../IFSW/
+ce_exec =
+# pec_mode = ignore, warn, discard
+pec_mode = warn
+viewer_cell_pad = 1
 
 [ccs-pus_connection]
 target_ip = 10.0.0.1
diff --git a/Ccs/communication.py b/Ccs/communication.py
new file mode 100644
index 0000000000000000000000000000000000000000..576ab8ab44474fc419c63fe78f37ba2bd5c6bfd7
--- /dev/null
+++ b/Ccs/communication.py
@@ -0,0 +1,330 @@
+#!/usr/bin/env python3
+
+"""
+General purpose socket communication utilities
+
+"""
+import queue
+import select
+import socket
+import threading
+import time
+
+
+class Connector:
+    """
+    Utility class for bidirectional socket handling
+    """
+
+    RECV_NBYTES = 4096
+
+    def __init__(self, host, port, is_server=False, response_to=2, recv_nbytes_min=0, save_to_file=None, msgdecoding='hex', resp_decoder=None):
+
+        self.sock_timeout = 10
+        self.response_to = response_to
+        self.host = host
+        self.port = port
+        self.isserver = is_server
+        self.recv_nbytes_min = recv_nbytes_min
+        self.msgdecoding = msgdecoding
+        self.resp_decoder = resp_decoder
+
+        self.conn = None
+        self.log = []
+        self._storagefd = None
+
+        self.receiver = None
+
+        self._startup(save_to_file)
+
+    def _startup(self, save_to):
+
+        self.setup_port()
+        if save_to is not None:
+            self.setup_storage(save_to)
+
+    def setup_storage(self, fname):
+        self._storagefd = open(fname, 'w')
+
+    def setup_port(self):
+
+        self.sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self.sockfd.settimeout(self.sock_timeout)
+
+        if self.isserver:
+            self.sockfd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+            self.sockfd.bind((self.host, self.port))
+            self.sockfd.listen()
+            print('Listening for connections on {}:{}'.format(self.host, self.port))
+
+    def _connect(self):
+
+        if self.isserver:
+            self.conn, addr = self.sockfd.accept()
+            print('Got connection on {}:{}'.format(self.host, self.port))
+        else:
+            self.sockfd.connect((self.host, self.port))
+            self.conn = self.sockfd
+            print('Connected to {}:{}'.format(self.host, self.port))
+
+        self.conn.settimeout(self.response_to)
+
+    def _close(self, servershtdwn):
+        if self.conn.fileno() != -1:
+            self.conn.close()
+            print('Closed connection to {}:{}'.format(self.host, self.port))
+
+        if servershtdwn and self.sockfd.fileno() != -1:
+            print('Closing server {}'.format(self.sockfd.getsockname()))
+            self.sockfd.close()
+
+    def connect(self):
+        if self.conn is not None and self.conn.fileno() < 0:
+            self.setup_port()
+        self._connect()
+
+    def close(self):
+        self._close(False)
+
+    def close_server(self):
+        if self.isserver:
+            self._close(True)
+        else:
+            print('Not a server')
+
+    def close_storage(self):
+        if self._storagefd is None:
+            print('No file to close')
+            return
+
+        self._storagefd.close()
+        self._storagefd = None
+
+    def dump_log(self, fname, hexsep=''):
+        log = '\n'.join(['{:.3f}\t{}\t{}'.format(t, _msgdecoder(msg, self.msgdecoding, sep=hexsep), _msgdecoder(resp, self.msgdecoding, sep=hexsep)) for (t, msg, resp) in self.log])
+        with open(fname, 'w') as fd:
+            fd.write(log)
+
+    def send(self, msg, rx=True, output=False):
+
+        if hasattr(msg, 'raw'):
+            msg = msg.raw
+
+        if self.conn is not None:
+            self.conn.sendall(msg)
+            t = time.time()
+
+            resp = b''
+            if rx:
+                resp += self._recv_response()
+
+            self.log.append((t, msg, resp))
+
+            if self._storagefd is not None:
+                self._storagefd.write('{:.3f}\t{}\t{}\n'.format(t, _msgdecoder(msg, self.msgdecoding), _msgdecoder(resp, self.msgdecoding)))
+                self._storagefd.flush()
+
+            if output:
+                print('{:.3f}: SENT {} | RECV: {}'.format(t, _msgdecoder(msg, self.msgdecoding), _msgdecoder(resp, self.msgdecoding)))
+
+            return resp if self.resp_decoder is None else self.resp_decoder(resp)
+
+        else:
+            print('Not connected!')
+
+    def recv(self, nbytes=None):
+
+        if nbytes is None and self.recv_nbytes_min != 0:
+            nbytes = self.recv_nbytes_min
+        elif nbytes is None:
+            nbytes = self.RECV_NBYTES
+
+        return self.conn.recv(nbytes)
+
+    def _recv_response(self):
+
+        data = b''
+
+        try:
+            if self.recv_nbytes_min != 0:
+                while len(data) < self.recv_nbytes_min:
+                    data += self.conn.recv(self.recv_nbytes_min - len(data))
+            else:
+                data += self.conn.recv(self.RECV_NBYTES)
+        except Exception as err:
+            print('No/invalid response ({})'.format(err))
+        finally:
+            return data
+
+    def set_response_to(self, seconds):
+        self.conn.settimeout(seconds)
+        self.response_to = seconds
+
+    def start_receiver(self, procfunc=None, outfile=None, ofmode='w'):
+        """
+
+        :param procfunc:
+        :param outfile:
+        :param ofmode:
+        :return:
+        """
+        if self.conn is None:
+            print('No connection')
+            return
+
+        if self.receiver is None:
+            self.receiver = Receiver([self.conn], procfunc=procfunc, outfile=outfile, ofmode=ofmode)
+            self.receiver.start()
+        else:
+            print('Receiver already initialised')
+
+    def stop_receiver(self):
+        if self.receiver is None:
+            print('No receiver to stop')
+            return
+
+        self.receiver.stop()
+        self.receiver = None
+
+
+class Receiver:
+    """
+    Reads and processes data from sockets
+    """
+
+    RECV_BYTES = 4096
+    SEL_TIMEOUT = 2
+    RECV_BUF_SIZE = 1024**3
+
+    def __init__(self, sockfds, procfunc=None, recv_buf_size=RECV_BUF_SIZE, outfile=None, ofmode='w'):
+
+        self.sockfds = sockfds
+        self.recvd_data_buf = queue.Queue(recv_buf_size)
+        self._procfunc = procfunc
+        self._recv_thread = None
+        self._proc_thread = None
+        self.proc_data = []
+
+        if outfile is not None:
+            self.proc_data_fd = open(outfile, ofmode)
+        else:
+            self.proc_data_fd = None
+
+        self._isrunning = False
+
+    def start(self):
+        if (self._recv_thread is None) or (not self._recv_thread.is_alive()):
+            self._start_recv()
+        else:
+            print('Recv already running!')
+
+        if self._procfunc is not None:
+            if (self._proc_thread is None) or (not self._proc_thread.is_alive()):
+                self._start_processing()
+
+    def stop(self):
+        self._isrunning = False
+
+    def _start_recv(self):
+        self._isrunning = True
+        self._recv_thread = threading.Thread(target=self._recv_worker, name='recv_worker')
+        # self._recv_thread.daemon = True
+        self._recv_thread.start()
+
+    def _recv_worker(self):
+
+        for sockfd in self.sockfds:
+            if sockfd is not None:
+                print('Receiving from socket {}:{}'.format(*sockfd.getpeername()))
+            else:
+                self.sockfds.remove(sockfd)
+
+        while self._isrunning:
+            try:
+                rd, wr, er = select.select(self.sockfds, [], self.sockfds, self.SEL_TIMEOUT)
+                for sock in rd:
+                    self.recvd_data_buf.put((time.time(), sock.recv(self.RECV_BYTES)))
+                    # print(self.recvd_data.get())
+
+                for sock in er:
+                    print('Error in {}'.format(sock.getpeername()))
+                    self.sockfds.remove(sock)
+                    if not self.sockfds:
+                        self.stop()
+
+            except socket.timeout:
+                continue
+
+            except (ValueError, OSError):
+                self.stop()
+                break
+
+        # for sockfd in self.sockfds:
+        #     print('Stopped receiving from socket {}:{}'.format(*sockfd.getpeername()))
+        print('Receiving stopped')
+
+    def _start_processing(self):
+        self._proc_thread = threading.Thread(target=self._proc_worker, name='proc_worker')
+        self._proc_thread.daemon = True
+        self._proc_thread.start()
+
+    def _proc_worker(self):
+        while self._isrunning:
+            try:
+                t, data = self.recvd_data_buf.get(timeout=1)
+                procdata = self._procfunc(data, ts=t)
+                self.proc_data.append(procdata)
+
+                if self.proc_data_fd is not None:
+                    try:
+                        self.proc_data_fd.write(str(procdata))
+                    except Exception as err:
+                        self.proc_data_fd.write('# {} #\n'.format(err))
+                        continue
+                    finally:
+                        self.proc_data_fd.flush()
+
+            except queue.Empty:
+                continue
+            except Exception as err:
+                print('Processing error:', err)
+                self._isrunning = False
+
+        print('Processing stopped')
+        self.proc_data_fd.close()
+
+
+def _msgdecoder(msg, fmt, sep=''):
+    if fmt == 'hex':
+        return hexify(msg, sep=sep)
+    elif fmt == 'ascii':
+        return toascii(msg)
+    else:
+        raise NotImplementedError('Unknown decoding style {}'.format(fmt))
+
+
+def hexify(bs, sep=''):
+    if bs is None:
+        bs = b''
+    return bs.hex().upper() if sep == '' else bs.hex(sep).upper()
+
+
+def toascii(bs, errors='replace'):
+    return bs.decode('ascii', errors=errors)
+
+
+def proc_func_generic(data, ts=None):
+    """
+    Generic function that takes data and returns it in a list. Example function to process raw data from Receiver input queue recvd_data_buf for proc_data storage.
+
+    :param data: raw data
+    :param ts: timestamp from input queue associated with the raw data
+    :return:
+    """
+
+    if ts is None:
+        ts = ''
+    else:
+        ts = '{:.6f}'.format(ts)
+
+    return [ts, str(data)]
diff --git a/Ccs/database/tm_db.py b/Ccs/database/tm_db.py
index 8d14fe4c0bf9937637c2dca11c9b7d05cba8d1a4..9cf45e01e0e3a523f0ae61cc26cb83cb06e795d5 100644
--- a/Ccs/database/tm_db.py
+++ b/Ccs/database/tm_db.py
@@ -10,6 +10,7 @@ from sqlalchemy import (
     Column, Integer, Boolean, Unicode, Index, UniqueConstraint, ForeignKey, create_engine, engine)
 from sqlalchemy.dialects.mysql import VARBINARY
 from sqlalchemy.orm import sessionmaker, relationship, scoped_session
+from sqlalchemy.sql import text
 # from sqlalchemy.orm.session import Session
 
 # Use for SQlite
@@ -232,8 +233,6 @@ class FEEDataTelemetryPool(FEEDATA_BASE):  # type: ignore
 def gen_mysql_conn_str(user=config_db.user, pw=config_db.pw, host=config_db.host, schema=''):
     return engine.url.URL.create(drivername='mysql', username=user, password=pw, host=host, database=schema)
 
-#SQLSOCKET=''
-
 
 def create_storage_db(protocol='PUS', force=False):
     if protocol.upper() not in ['PUS', 'RMAP', 'FEEDATA', 'ALL']:
@@ -243,8 +242,8 @@ def create_storage_db(protocol='PUS', force=False):
         print('Creating schema "{}" for {} data storage...'.format(config_db.storage_schema_name, protocol.upper()))
         _engine = create_engine(gen_mysql_conn_str(), echo="-v" in sys.argv)
         if force:
-            _engine.execute('DROP SCHEMA IF EXISTS {}'.format(config_db.storage_schema_name))
-        _engine.execute('CREATE SCHEMA IF NOT EXISTS {}'.format(config_db.storage_schema_name))
+            _engine.execute(text('DROP SCHEMA IF EXISTS {}'.format(config_db.storage_schema_name)))
+        _engine.execute(text('CREATE SCHEMA IF NOT EXISTS {}'.format(config_db.storage_schema_name)))
         _engine.dispose()
         _engine = create_engine(gen_mysql_conn_str(schema=config_db.storage_schema_name), echo="-v" in sys.argv)
         for protocol in protocols:
@@ -254,8 +253,8 @@ def create_storage_db(protocol='PUS', force=False):
         print('Creating schema "{}" for {} data storage...'.format(config_db.storage_schema_name, protocol.upper()))
         _engine = create_engine(gen_mysql_conn_str(), echo="-v" in sys.argv)
         if force:
-            _engine.execute('DROP SCHEMA IF EXISTS {}'.format(config_db.storage_schema_name))
-        _engine.execute('CREATE SCHEMA IF NOT EXISTS {}'.format(config_db.storage_schema_name))
+            _engine.execute(text('DROP SCHEMA IF EXISTS {}'.format(config_db.storage_schema_name)))
+        _engine.execute(text('CREATE SCHEMA IF NOT EXISTS {}'.format(config_db.storage_schema_name)))
         _engine.dispose()
         _engine = create_engine(gen_mysql_conn_str(schema=config_db.storage_schema_name), echo="-v" in sys.argv)
         protocols[protocol.upper()][1].metadata.create_all(_engine)
@@ -281,9 +280,19 @@ def scoped_session_maker(db_schema, idb_version=None):
     _engine = create_engine(gen_mysql_conn_str(schema=schema), echo="-v" in sys.argv, pool_size=15)
     session_factory = sessionmaker(bind=_engine)
     scoped_session_factory = scoped_session(session_factory)
+    #scoped_session_factory = scoped_session_v2(session_factory)
     return scoped_session_factory
 
 
+class scoped_session_v2(scoped_session):
+    """
+    Wrapper class to cast SQL query statement string to TextClause before execution, as this is required since SQLAlchemy 2.0.
+    """
+
+    def execute(self, x, *args, **kwargs):
+        return super().execute(text(x), *args, **kwargs)
+
+
 # def load_telemetry_file(dummy: str) -> None:
 #     '''Loads a telemetry dumpfile in the database, populating
 #     the tm_pool and tm tables.
diff --git a/Ccs/decompression.py b/Ccs/decompression.py
new file mode 100644
index 0000000000000000000000000000000000000000..7966865cbfd2248a0ca50452d7df71eb4f260398
--- /dev/null
+++ b/Ccs/decompression.py
@@ -0,0 +1,194 @@
+import logging
+import numpy as np
+import os
+import subprocess
+import threading
+import time
+import astropy.io.fits as pyfits
+
+import confignator
+import ccs_function_lib as cfl
+
+cfg = confignator.get_config(check_interpolation=False)
+logger = cfl.start_logging('Decompression')
+# logger.setLevel(getattr(logging, cfg.get('ccs-logging', 'level').upper()))
+
+CE_COLLECT_TIMEOUT = 1
+LDT_MINIMUM_CE_GAP = 0.001
+
+ce_decompressors = {}
+
+
+def create_fits(header=None, filename=None):
+    hdulist = pyfits.HDUList()
+    hdu = pyfits.PrimaryHDU()
+    hdu.header = header
+    hdulist.append(hdu)
+
+    imagette_hdu = pyfits.ImageHDU()
+    stack_hdu = pyfits.ImageHDU()
+    margins = pyfits.ImageHDU()
+
+    hdulist.append(imagette_hdu)
+    hdulist.append(stack_hdu)
+    hdulist.append(margins)
+
+    if filename:
+        with open(filename, "wb") as fd:
+            hdulist.writeto(fd)
+
+    return hdulist
+
+
+def build_fits(basefits, newfits):
+    base = pyfits.open(basefits)
+    new = pyfits.open(newfits)
+    for hdu in range(len(base)):
+        base[hdu].data = np.concatenate([base[hdu].data, new[hdu].data])
+    base.writeto(basefits, overwrite=True)
+
+
+def convert_fullframe_to_cheopssim(fname):
+    """
+    Convert a fullframe (1076x1033) FITS to CHEOPS-SIM format
+    @param fname: Input FITS file
+    """
+    d = pyfits.open(fname)
+    full = np.array(np.round(d[0].data), dtype=np.uint16)
+    win_dict = {"SubArray": full[:, :1024, 28:28+1024],
+                "OverscanLeftImage": full[:, :1024, :4],
+                "BlankLeftImage": full[:, :1024, 4:4+8],
+                "DarkLeftImage": full[:, :1024, 12:28],
+                "DarkRightImage": full[:, :1024, 1052:1052+16],
+                "BlankRightImage": full[:, :1024, 1068:],
+                "DarkTopImage": full[:, 1024:-6, 28:-24],
+                "OverscanTopImage": full[:, -6:, 28:-24]}
+
+    hdulist = pyfits.HDUList()
+    hdulist.append(pyfits.PrimaryHDU())
+
+    for win in win_dict:
+        hdu = pyfits.ImageHDU(data=win_dict[win], name=win)
+        hdulist.append(hdu)
+
+    hdulist.append(pyfits.BinTableHDU(name="ImageMetaData"))
+
+    hdulist.writeto(fname[:-5] + '_CHEOPSSIM.fits')
+
+
+def ce_decompress(outdir, pool_name=None, sdu=None, starttime=None, endtime=None, startidx=None, endidx=None,
+                  ce_exec=None):
+    decomp = CeDecompress(outdir, pool_name=pool_name, sdu=sdu, starttime=starttime, endtime=endtime, startidx=startidx,
+                          endidx=endidx, ce_exec=ce_exec)
+    decomp.start()
+
+
+def ce_decompress_stop(name=None):
+
+    if name is not None:
+        ce_decompressors[name].stop()
+    else:
+        for p in ce_decompressors:
+            ce_decompressors[p].stop()
+
+
+class CeDecompress:
+
+    def __init__(self, outdir, pool_name=None, sdu=None, starttime=None, endtime=None, startidx=None, endidx=None,
+                 ce_exec=None):
+        self.outdir = outdir
+        self.pool_name = pool_name
+        self.sdu = sdu
+        self.starttime = starttime
+        self.endtime = endtime
+        self.startidx = startidx
+        self.endidx = endidx
+
+        self.init_time = int(time.time())
+
+        if ce_exec is None:
+            try:
+                self.ce_exec = cfg.get('ccs-misc', 'ce_exec')
+            except (ValueError, confignator.config.configparser.NoOptionError) as err:
+                raise err
+        else:
+            self.ce_exec = ce_exec
+
+        # check if decompression is executable
+        if not os.access(self.ce_exec, os.X_OK):
+            raise PermissionError('"{}" is not executable.'.format(self.ce_exec))
+
+        self.ce_decompression_on = False
+        self.ce_thread = None
+        self.last_ce_time = 0
+        self.ce_collect_timeout = CE_COLLECT_TIMEOUT
+        self.ldt_minimum_ce_gap = LDT_MINIMUM_CE_GAP
+
+        global ce_decompressors
+        ce_decompressors[self.init_time] = self
+
+    def _ce_decompress(self):
+        checkdir = os.path.dirname(self.outdir)
+        if not os.path.exists(checkdir) and checkdir != "":
+            os.mkdir(checkdir)
+
+        thread = threading.Thread(target=self._ce_decompress_worker, name="CeDecompression")
+        thread.daemon = True
+        self.ce_thread = thread
+        if self.starttime is not None:
+            self.last_ce_time = self.starttime
+        self.ce_decompression_on = True
+
+        try:
+            thread.start()
+            logger.info('Started CeDecompress [{}]...'.format(self.init_time))
+        except Exception as err:
+            logger.error(err)
+            self.ce_decompression_on = False
+            raise err
+
+        return thread
+
+    def _ce_decompress_worker(self):
+
+        def decompress(cefile):
+            logger.info("Decompressing {}".format(cefile))
+            fitspath = cefile[:-2] + 'fits'
+            if os.path.isfile(fitspath):
+                subprocess.run(["rm", fitspath])
+            subprocess.run([self.ce_exec, cefile, fitspath], stdout=open(cefile[:-2] + 'log', 'w'))
+
+        # first, get all TM13s already complete in pool
+        try:
+            filedict = cfl.dump_large_data(pool_name=self.pool_name, starttime=self.last_ce_time, endtime=self.endtime,
+                                           outdir=self.outdir, dump_all=True, sdu=self.sdu, startidx=self.startidx,
+                                           endidx=self.endidx)
+            for ce in filedict:
+                self.last_ce_time = ce
+                decompress(filedict[ce])
+        except (ValueError, TypeError, AttributeError) as err:
+            ce_decompressors.pop(self.init_time)
+            raise err
+
+        while self.ce_decompression_on:
+            filedict = cfl.dump_large_data(pool_name=self.pool_name, starttime=self.last_ce_time, endtime=self.endtime,
+                                           outdir=self.outdir, dump_all=False, sdu=self.sdu, startidx=self.startidx,
+                                           endidx=self.endidx)
+            if len(filedict) == 0:
+                time.sleep(self.ce_collect_timeout)
+                continue
+            self.last_ce_time, cefile = list(filedict.items())[0]
+            decompress(cefile)
+            self.last_ce_time += self.ldt_minimum_ce_gap
+            time.sleep(self.ce_collect_timeout)
+        logger.info('CeDecompress stopped [{}].'.format(self.init_time))
+        ce_decompressors.pop(self.init_time)
+
+    def start(self):
+        self._ce_decompress()
+
+    def stop(self):
+        self.ce_decompression_on = False
+
+    def reset(self, timestamp=0):
+        self.last_ce_time = timestamp
diff --git a/Ccs/editor.py b/Ccs/editor.py
index d3387d985a29b690696628587ca7da68f54c3160..ff9e48f9d2989d17309e46c947f948f757c9d592 100644
--- a/Ccs/editor.py
+++ b/Ccs/editor.py
@@ -34,6 +34,8 @@ action_folder = cfg.get('ccs-paths', 'actions')
 scripts = glob.glob(os.path.join(cfg.get('paths', 'ccs'), "scripts/*.py"))
 script_actions = '\n'.join(["<menuitem action='{}' />".format(os.path.split(script)[-1][:-3]) for script in scripts])
 
+LOG_UPDT_PER = 2000  # ms
+
 UI_INFO = """
 <ui>
   <menubar name='MenuBar'>
@@ -55,18 +57,23 @@ UI_INFO = """
       <menuitem action='EditPaste' />
       <separator />
       <menuitem action='EditFind' />
+      <menuitem action='EditComment' />
       <separator />
       <menuitem action='EditPreferences' />
+      <menuitem action='EditStyle' />
     </menu>
     <menu action='ModulesMenu'>
       <menuitem action='Poolviewer' />
       <menuitem action='Poolmanager' />
       <menuitem action='Plotter' />
       <menuitem action='Monitor' />
+      <menuitem action='TST' />
     </menu>
     <menu action='ToolsMenu'>
       <menuitem action='ActionButtons' />
+      <menuitem action='ReconnectSQL' />
       <menuitem action='RestartTerminal' />
+      <menuitem action='ClearLog' />
     </menu>
     <menu action='ScriptsMenu'>
         {}    
@@ -81,23 +88,23 @@ UI_INFO = """
 VTE_VERSION = "{}.{}.{}".format(Vte.MAJOR_VERSION, Vte.MINOR_VERSION, Vte.MICRO_VERSION)
 
 
-class SearchDialog(Gtk.Dialog):
-    def __init__(self, parent):
-        Gtk.Dialog.__init__(self, "Search", parent,
-                            Gtk.DialogFlags.MODAL, buttons=(Gtk.STOCK_FIND, Gtk.ResponseType.OK,
-                                                            Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
-
-        box = self.get_content_area()
-        box.set_spacing(5)
-        box.set_homogeneous(True)
-
-        label = Gtk.Label("Insert text you want to search for:")
-        box.add(label)
-
-        self.entry = Gtk.Entry()
-        box.add(self.entry)
-
-        self.show_all()
+# class SearchDialog(Gtk.Dialog):
+#     def __init__(self, parent):
+#         Gtk.Dialog.__init__(self, "Search", parent,
+#                             Gtk.DialogFlags.MODAL, buttons=(Gtk.STOCK_FIND, Gtk.ResponseType.OK,
+#                                                             Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
+#
+#         box = self.get_content_area()
+#         box.set_spacing(5)
+#         box.set_homogeneous(True)
+#
+#         label = Gtk.Label("Insert text you want to search for:")
+#         box.add(label)
+#
+#         self.entry = Gtk.Entry()
+#         box.add(self.entry)
+#
+#         self.show_all()
 
 
 class IPythonTerminal(Vte.Terminal):
@@ -134,7 +141,8 @@ class IPythonTerminal(Vte.Terminal):
             else:
                 return self.feed_child(msg, len(msg))
         else:
-            return self.feed_child_binary(msg.encode())
+            msg_enc = msg.encode('utf-8') if msg is not None else msg
+            return self.feed_child(msg_enc)
 
 
 class CcsEditor(Gtk.Window):
@@ -161,26 +169,37 @@ class CcsEditor(Gtk.Window):
         self.add(self.paned)
 
         self.grid = Gtk.Grid()
+        self.grid.connect('key-release-event', self._kill_search)
         self.paned.add1(self.grid)
 
         menubar = self.create_menus()
         self.grid.attach(menubar, 0, 0, 3, 1)
 
+        toolbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
         toolbar = self.create_toolbar()
-        self.grid.attach(toolbar, 0, 1, 2, 1)
+        toolbox.pack_start(toolbar, 1, 1, 0)
+        self.univie_box = self.create_univie_box()
+        toolbox.pack_end(self.univie_box, 0, 0, 0)
+        self.grid.attach(toolbox, 0, 1, 3, 1)
+
+        self.search_context = None
+        self.editor_notebook = Gtk.Notebook()
+        self.editor_notebook.set_scrollable(True)
+        self.editor_notebook.connect('switch-page', self._set_search_context)
 
         self.searchbar = self.create_searchbar()
         self.grid.attach(self.searchbar, 0, 2, 3, 1)
 
-        self.univie_box = self.create_univie_box()
-        self.grid.attach(self.univie_box, 2, 1, 1, 1)
-
         self.sourcemarks = {}
         self.create_mark_attributes()
 
-        self.editor_notebook = Gtk.Notebook(scrollable=True)
         self.grid.attach(self.editor_notebook, 0, 3, 3, 1)
 
+        if self.cfg.has_option('ccs-editor', 'color_scheme'):
+            self._update_style_schemes(self.cfg.get('ccs-editor', 'color_scheme'))
+        else:
+            self.style_scheme = None
+
         self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
 
         # self.connect('size-allocate', self.paned_check_resize)
@@ -198,9 +217,10 @@ class CcsEditor(Gtk.Window):
         self.nb.append_page(self.logwin, tab_label=Gtk.Label(label='Log', angle=270))
         self.paned.add2(self.nb)
 
-        self.log_file = None  # save the shown text from the log file tab
-        # Update the log-file view window every 2 seconds
-        GLib.timeout_add(2000, self.switch_notebook_page, self.logwin, self.logwintext, self.logbuffer)
+        self.log_file = None
+        self.log_file_text = None  # save the shown text from the log file tab
+        # Update the log-file view window every LOG_UPDT_PER milliseconds
+        GLib.timeout_add(LOG_UPDT_PER, self.switch_notebook_page, self.logwin, self.logwintext, self.logbuffer)
 
         self.ipython_view.connect("size-allocate", self.console_autoscroll, self.ipython_view)
 
@@ -216,9 +236,20 @@ class CcsEditor(Gtk.Window):
         self.connect("delete-event", self.quit_func)
         # self.connect("delete-event", self.tcpserver_shutdown)
         self.connect('key-press-event', self.key_pressed)
-        # self.open_file("startpv.py")
+
+        # self._apply_css(cssfile='style.css')
         self.show_all()
 
+    def _apply_css(self, cssfile=None, data=None):
+        style_provider = Gtk.CssProvider()
+        if data is not None:
+            style_provider.load_from_data(data)
+        if cssfile is not None:
+            style_provider.load_from_path(cssfile)
+        Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),
+                                                 style_provider,
+                                                 Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
+
     def timeout(self, sec):
         print(self.cfg['ccs-database']['commit_interval'])
         print('PAUSE')
@@ -268,7 +299,6 @@ class CcsEditor(Gtk.Window):
         @return: -
         """
 
-        ######
         # This function exists in every app, but is different here, be careful!
 
         self.my_bus_name = My_Bus_Name
@@ -321,10 +351,9 @@ class CcsEditor(Gtk.Window):
                                          " = dbus.SessionBus().get_object('" + str(My_Bus_Name) +
                                          "', '/MessageListener')")
 
-        #####
         # Connect to all running applications for terminal
         our_con = []
-        #Search for all applications
+        # Search for all applications
         for service in dbus.SessionBus().list_names():
             if service.startswith('com'):
                 our_con.append(service)
@@ -382,7 +411,6 @@ class CcsEditor(Gtk.Window):
                             self._to_console_via_socket("editor" + str(service[-1]) +
                                                         " = dbus.SessionBus().get_object('" + str(service) +
                                                         "', '/MessageListener')")
-        return
 
     def restart_terminal(self):
 
@@ -402,9 +430,9 @@ class CcsEditor(Gtk.Window):
 
         self.ipython_view.connect("size-allocate", self.console_autoscroll, self.ipython_view)
 
-        self.ed_host, self.ed_port = self.cfg.get('ccs-misc', 'editor_host'), int(self.cfg.get('ccs-misc', 'editor_ul_port'))  # Get standart port
+        self.ed_host, self.ed_port = self.cfg.get('ccs-misc', 'editor_host'), int(self.cfg.get('ccs-misc', 'editor_ul_port'))  # Get standard port
 
-        # Connect to standart port if possible otherwise use a random alternative
+        # Connect to standard port if possible otherwise use a random alternative
         try:
             self.setup_editor_socket(self.ed_host, self.ed_port)
         except OSError:
@@ -530,63 +558,21 @@ class CcsEditor(Gtk.Window):
         while self.is_editor_socket_active:
             self.console_sock, addr = sock_csl.accept()
             line = self.console_sock.recv(2**16).decode()
-            # if line.startswith('exec:'):
-            #     exec(line.strip('exec:'))
-            # elif line.startswith('get:'):
-            #     buf = pickle.dumps(line.strip('get:'))
-            #     self.console_sock.sendall(buf)
-            # else:
-            #     workaround for IP5
-            #     for line in line.split('\n'):
-            #         while 1:
-            #             if self.feed_ready:
-            #                 GLib.idle_add(self.process_line_idle, line)
-            #                 # self.feed_ready = False
-            #                 break
-            #             else:
-            #                 time.sleep(0.01)
             GLib.idle_add(self.process_line_idle, line)
-            self.console_sock.sendall(b'ACK ' + line.encode()[:1020])
+            self.console_sock.sendall(b'ACK ' + line.encode()[:60])
             self.console_sock.close()
         sock_csl.close()
 
     def process_line_idle(self, line):
-        # self.ipython_view.text_buffer.insert_at_cursor(line, len(line))
-        # self.ipython_view._processLine()
-        # line += '\n'
-        # print(line)
         if not line.endswith('\n'):
             line += '\n'
-        # if line.count('\n') > 1:
-        #     self.ipython_view.feed_child('%cpaste\n', len('%cpaste\n'))
-        #     time.sleep(0.01)
-        #     line += '\n--\n'
-        # if len(line.split('\n')) > 2:
         if line.count('\n') > 2:
-            if VTE_VERSION < '0.52.3':
-                self.ipython_view.feed_child('%cpaste\n', 8)
-                time.sleep(0.2)  # wait for interpreter to return before feeding new code
-                self.ipython_view.feed_child(line, len(line))
-                self.ipython_view.feed_child('--\n', 3)
-            else:
-                self.ipython_view.feed_child_binary('%cpaste\n'.encode())
-                time.sleep(0.2)  # wait for interpreter to return before feeding new code
-                self.ipython_view.feed_child_binary(line.encode())
-                self.ipython_view.feed_child_binary('--\n'.encode())
-            # self.ipython_view.feed_child('%cpaste\n'+line+'--\n', len(line)+11)
-            # for line in line.split('\n'):
-            #     while 1:
-            #         if self.feed_ready:
-            #             self.feed_ready = False
-            #             self.ipython_view.feed_child(line+'\n', len(line)+1)
-            #             break
-            #         else:
-            #             time.sleep(0.01)
+            self.ipython_view.feed_child_compat('%cpaste\n')
+            time.sleep(0.2)  # wait for interpreter to return before feeding new code
+            self.ipython_view.feed_child_compat(line)
+            self.ipython_view.feed_child_compat('--\n')
         else:
-            if VTE_VERSION < '0.52.3':
-                self.ipython_view.feed_child(line, len(line))
-            else:
-                self.ipython_view.feed_child_binary(line.encode())
+            self.ipython_view.feed_child_compat(line)
 
     def create_mark_attributes(self):
         self.mark_play = GtkSource.MarkAttributes()
@@ -641,6 +627,7 @@ class CcsEditor(Gtk.Window):
 
         action = Gtk.Action(name="FileSaveAs", label="_Save As", tooltip=None, stock_id=Gtk.STOCK_SAVE_AS)
         action.connect("activate", self.on_menu_file_saveas)
+        action_group.add_action_with_accel(action, "<control><shift>S")
         action_group.add_action(action)
 
         action = Gtk.Action(name="FileQuit", label="_Quit", tooltip=None, stock_id=Gtk.STOCK_QUIT)
@@ -675,46 +662,42 @@ class CcsEditor(Gtk.Window):
         action.connect("activate", self.on_search_clicked)
         action_group.add_action_with_accel(action, "<control>F")
 
-        action = Gtk.Action(name="EditPreferences", label="_Preferences", tooltip=None, stock_id=Gtk.STOCK_PREFERENCES)
+        action = Gtk.Action(name="EditComment", label="Comment Lines", tooltip=None)
+        action.connect("activate", self._on_comment_lines)
+        action_group.add_action_with_accel(action, "<control>T")
+
+        action = Gtk.Action(name="EditPreferences", label="Preferences", tooltip=None, stock_id=Gtk.STOCK_PREFERENCES)
         action.connect("activate", cfl.start_config_editor)
         action_group.add_action(action)
 
-    # def create_pool_menu(self, action_group):
-    #     action = Gtk.Action(name="PoolMenu", label="_Pool", tooltip=None, stock_id=None, sensitive=False)
-    #     action_group.add_action(action)
-    #
-    #     action = Gtk.Action(name="SelectConfig", label="_Select Configuration", tooltip=None, stock_id=None)
-    #     action.connect("activate", self._on_select_pool_config)
-    #     action_group.add_action(action)
-    #
-    #     action = Gtk.Action(name="EditConfig", label="_Edit Configuration", tooltip=None, stock_id=None)
-    #     action.connect("activate", self._on_edit_pool_config)
-    #     action_group.add_action(action)
-    #
-    #     action = Gtk.Action(name="CreateConfig", label="_Create Configuration", tooltip=None, stock_id=None)
-    #     action.connect("activate", self._on_create_pool_config)
-    #     action_group.add_action(action)
+        action = Gtk.Action(name="EditStyle", label="Set Editor Style", tooltip=None)
+        action.connect("activate", self._on_set_style)
+        action_group.add_action(action)
 
     def create_modules_menu(self, action_group):
         action = Gtk.Action(name="ModulesMenu", label="_Modules", tooltip=None, stock_id=None)
         action_group.add_action(action)
 
-        action = Gtk.Action(name="Poolviewer", label="_Start Poolviewer", tooltip=None, stock_id=None)
+        action = Gtk.Action(name="Poolviewer", label="_Poolviewer", tooltip=None, stock_id=None)
         action.connect("activate", self._on_start_poolviewer)
         action_group.add_action(action)
 
-        action = Gtk.Action(name="Poolmanager", label="_Start Poolmanager", tooltip=None, stock_id=None)
+        action = Gtk.Action(name="Poolmanager", label="_Poolmanager", tooltip=None, stock_id=None)
         action.connect("activate", self._on_start_poolmanager)
         action_group.add_action(action)
 
-        action = Gtk.Action(name="Plotter", label="_Start Plotter", tooltip=None, stock_id=None)
+        action = Gtk.Action(name="Plotter", label="_Plotter", tooltip=None, stock_id=None)
         action.connect("activate", self._on_start_plotter)
         action_group.add_action(action)
 
-        action = Gtk.Action(name="Monitor", label="_Start Monitor", tooltip=None, stock_id=None)
+        action = Gtk.Action(name="Monitor", label="_Monitor", tooltip=None, stock_id=None)
         action.connect("activate", self._on_start_monitor)
         action_group.add_action(action)
 
+        action = Gtk.Action(name="TST", label="_Test Specification Tool", tooltip=None, stock_id=None)
+        action.connect("activate", self._on_start_tst)
+        action_group.add_action(action)
+
     def create_tools_menu(self, action_group):
         action = Gtk.Action(name="ToolsMenu", label="_Tools", tooltip=None, stock_id=None)
         action_group.add_action(action)
@@ -723,10 +706,19 @@ class CcsEditor(Gtk.Window):
         action.connect("activate", self._on_show_action_window)
         action_group.add_action(action)
 
+        action = Gtk.Action(name="ReconnectSQL", label="_Reconnect SQL",
+                            tooltip="Reconnect, in case 'SQL server has gone away'", stock_id=None)
+        action.connect("activate", self._on_reconnect_sql)
+        action_group.add_action(action)
+
         action = Gtk.Action(name="RestartTerminal", label="_Restart Terminal", tooltip=None, stock_id=None)
         action.connect("activate", self._on_restart_terminal)
         action_group.add_action(action)
 
+        action = Gtk.Action(name="ClearLog", label="_Clear Log", tooltip=None, stock_id=None)
+        action.connect("activate", self._on_clear_log)
+        action_group.add_action(action)
+
     def create_scripts_menu(self, action_group):
         action = Gtk.Action(name="ScriptsMenu", label="_Scripts", tooltip=None, stock_id=None)
         action_group.add_action(action)
@@ -770,58 +762,71 @@ class CcsEditor(Gtk.Window):
     def _on_menu_file_new(self, widget=None, filename=None):
         self.notebook_open_tab()
 
-    # def _on_select_pool_config(self, action):
-    #     print('TODO')
-    #
-    # def _on_edit_pool_config(self, action):
-    #     print('TODO')
-    #
-    # def _on_create_pool_config(self, action):
-    #     cfg_dialog = config_dialog.CreateConfig(self)
-    #     response = cfg_dialog.run()
-    #
-    #     config = cfg_dialog.get_config()
-    #     cfg_dialog.destroy()
-    #
-    #     if response == Gtk.ResponseType.CANCEL:
-    #         return
-    #
-    #     dialog = Gtk.FileChooserDialog(title="Save file as", parent=None,
-    #                                    action=Gtk.FileChooserAction.SAVE)
-    #     dialog.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
-    #                        Gtk.STOCK_SAVE, Gtk.ResponseType.OK)
-    #
-    #     dialog.set_transient_for(self)
-    #
-    #     response = dialog.run()
-    #
-    #     if response == Gtk.ResponseType.OK:
-    #         filename = dialog.get_filename()
-    #         with open(filename, 'w') as fdesc:
-    #             config.write(fdesc)
-    #             fdesc.close()
-    #
-    #     dialog.destroy()
+    def _on_comment_lines(self, widget=None):
+        view = self._get_active_view()
+        textbuffer = view.get_buffer()
+
+        hs = textbuffer.get_has_selection()
+
+        if hs:
+            x, y = textbuffer.get_selection_bounds()
+
+            # remember selected part for re-selection at the end
+            ix = x.get_offset()
+            iyl, iyo = y.get_line(), y.get_line_offset()
+
+            x.set_line_offset(0)
+            tt = x.get_text(y)
+            lnlist = tt.split('\n')
+            if all([ln.startswith('#') for ln in lnlist]):
+                newbuf = []
+                for ln in lnlist:
+                    newbuf.append(ln[1:])
+                tr = '\n'.join(newbuf)
+                ix -= 1
+                iyo -= 1
+            else:
+                tr = '#' + tt.replace('\n', '\n#')
+                ix += 1
+                iyo += 1
+
+        else:
+            x = textbuffer.get_iter_at_mark(textbuffer.get_insert())
+            x.set_line_offset(0)
+            y = x.copy()
+            y.forward_to_line_end()
+            tt = x.get_text(y)
+
+            if tt.startswith('#'):
+                tr = tt[1:]
+            else:
+                tr = '#' + tt
+
+        textbuffer.delete(x, y)
+        textbuffer.insert(x, tr, len(tr))
+
+        if hs:
+            x = textbuffer.get_iter_at_offset(ix)
+            y = textbuffer.get_iter_at_line_offset(iyl, iyo)
+            textbuffer.select_range(x, y)
 
     def _on_start_poolviewer(self, action):
         cfl.start_pv()
-        return
 
     def _on_start_poolmanager(self, action):
         cfl.start_pmgr()
-        return
 
     def _on_start_plotter(self, action):
         cfl.start_plotter()
-        return
 
     def _on_start_monitor(self, action):
         cfl.start_monitor()
-        return
+
+    def _on_start_tst(self, action):
+        cfl.start_tst()
 
     def _on_open_poolmanager_gui(self, action):
         cfl.start_pmgr()
-        return
 
     def _on_show_action_window(self, action):
         if hasattr(self, 'action_button_window'):
@@ -830,9 +835,11 @@ class CcsEditor(Gtk.Window):
                 return
         self.action_button_window = ActionWindow(self)
 
+    def _on_reconnect_sql(self, action):
+        self._to_console('cfl.scoped_session_idb.close()')
+
     def _on_restart_terminal(self, action):
         self.restart_terminal()
-        return
 
     def _on_open_script(self, action, filename):
         if os.path.isfile(filename):
@@ -843,16 +850,17 @@ class CcsEditor(Gtk.Window):
 
     def _on_select_about_dialog(self, action):
         cfl.about_dialog(self)
-        return
 
     def _get_active_view(self):
         nbpage = self.editor_notebook.get_current_page()
         scrolled_window = self.editor_notebook.get_nth_page(nbpage)
+
+        if scrolled_window is None:
+            return
+
         view = scrolled_window.get_child()
         return view
 
-    """ TODO: unsaved buffer warning on delete/destroy """
-
     def notebook_open_tab(self, filename=None):
 
         label = Gtk.Label()
@@ -875,6 +883,7 @@ class CcsEditor(Gtk.Window):
 
         sourceview = self.create_textview(filename)
         self.editor_notebook.append_page(sourceview, hbox)
+        self.editor_notebook.set_tab_reorderable(sourceview, True)
 
         button.connect("clicked", self._notebook_close_tab, sourceview)
 
@@ -1036,7 +1045,7 @@ class CcsEditor(Gtk.Window):
 
     def add_file_dialog_filters(self, dialog):
         filter_py = Gtk.FileFilter()
-        filter_py.set_name("All Python Files")
+        filter_py.set_name("Python Files")
         filter_py.add_mime_type("text/x-python")
         dialog.add_filter(filter_py)
 
@@ -1114,28 +1123,21 @@ class CcsEditor(Gtk.Window):
         # button_reload_config.connect("clicked", self.reload_config)
         # toolbar.add(button_reload_config)
 
-        toolbar.add(Gtk.SeparatorToolItem())
-
-        # button_reset_ns = Gtk.ToolButton()
-        # button_reset_ns.set_icon_name("edit-clear")
-        # button_reset_ns.set_tooltip_text('Reset console namespace')
-        # button_reset_ns.connect('clicked', self.reset_ns)
-        # toolbar.add(button_reset_ns)
-
         return toolbar
 
     def create_action_buttons(self, toolbar, targets, nbutt=10):
         for n in range(nbutt):
             button_action = Gtk.ToolButton()
 
-            button_img_path = os.path.join(pixmap_folder, self.cfg.get('ccs-actions', 'action{}_img'.format(n + 1)))
-            try:
-                pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(button_img_path, 36, 36)
-            except:
-                self.logger.warning('Could not load image {}'.format(button_img_path))
-                pixmap_path = os.path.join(pixmap_folder, 'action.png')
-                pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(pixmap_path, 36, 36)
-            icon = Gtk.Image.new_from_pixbuf(pixbuf)
+            # button_img_path = os.path.join(pixmap_folder, self.cfg.get('ccs-actions', 'action{}_img'.format(n + 1)))
+            # try:
+            #     pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(button_img_path, 36, 36)
+            # except:
+            #     self.logger.warning('Could not load image {}'.format(button_img_path))
+            #     pixmap_path = os.path.join(pixmap_folder, 'action.png')
+            #     pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(pixmap_path, 36, 36)
+            # icon = Gtk.Image.new_from_pixbuf(pixbuf)
+            icon = self._get_toolbutton_icon(self.cfg.get('ccs-actions', 'action{}_img'.format(n + 1)))
             button_action.set_icon_widget(icon)
             button_action.set_name('action{}'.format(n + 1))
             button_action.set_tooltip_text(os.path.join(action_folder, self.cfg.get('ccs-actions', 'action{}'.format(n + 1))))
@@ -1157,18 +1159,25 @@ class CcsEditor(Gtk.Window):
 
         widget.set_tooltip_text(filename)
 
-    def action_context_menu(self, action):
+    def action_context_menu(self, action_button):
+        action = action_button.get_name()
         menu = Gtk.Menu()
 
         item = Gtk.MenuItem(label='Open action script file')
         item.connect('activate', self.show_action_script, action)
         menu.append(item)
+        item1 = Gtk.MenuItem(label='Set action script file')
+        item1.connect('activate', self._set_action_button_script, action_button)
+        menu.append(item1)
+        item2 = Gtk.MenuItem(label='Set button icon')
+        item2.connect('activate', self._set_action_button_icon, action_button)
+        menu.append(item2)
         return menu
 
     def show_action_context(self, widget, event):
         if event.button != 3:
             return
-        menu = self.action_context_menu(widget.get_name())
+        menu = self.action_context_menu(widget)
         menu.show_all()
         menu.popup(None, None, None, None, 3, event.time)
 
@@ -1176,7 +1185,58 @@ class CcsEditor(Gtk.Window):
         if action is None:
             return
         self.open_file(os.path.join(action_folder, self.cfg.get('ccs-actions', action)))
-        return
+
+    def _set_action_button_script(self, widget, action):
+        if action is None:
+            return
+
+        dialog = Gtk.FileChooserDialog('Select action script')
+        dialog.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK)
+        self.add_file_dialog_filters(dialog)
+        resp = dialog.run()
+
+        if resp == Gtk.ResponseType.OK:
+            fname = dialog.get_filename()
+            action.set_tooltip_text(fname)
+            if os.path.dirname(fname) == action_folder:
+                fname = os.path.basename(fname)
+
+            self.cfg.save_option_to_file('ccs-actions', action.get_name(), fname)
+
+        dialog.destroy()
+
+    def _set_action_button_icon(self, widget, action):
+        if action is None:
+            return
+
+        dialog = Gtk.FileChooserDialog(title='Select action icon')
+        dialog.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK)
+        resp = dialog.run()
+        if resp == Gtk.ResponseType.OK:
+            fname = dialog.get_filename()
+            if os.path.dirname(fname) == pixmap_folder:
+                fname = os.path.basename(fname)
+            icon = self._get_toolbutton_icon(fname)
+            action.set_icon_widget(icon)
+            action.show_all()
+            self.cfg.save_option_to_file('ccs-actions', action.get_name() + '_img', fname)
+
+        dialog.destroy()
+
+    def _get_toolbutton_icon(self, icon_path):
+        button_img_path = os.path.join(pixmap_folder, icon_path)
+
+        try:
+            pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(button_img_path, 36, 36)
+        except Exception as err:
+            self.logger.debug(err)
+            self.logger.warning('Could not load image {}'.format(button_img_path))
+            pixmap_path = os.path.join(pixmap_folder, 'action.png')
+            pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(pixmap_path, 36, 36)
+
+        icon = Gtk.Image.new_from_pixbuf(pixbuf)
+
+        return icon
 
     def open_file(self, filename):
 
@@ -1246,40 +1306,96 @@ class CcsEditor(Gtk.Window):
         searchbar = Gtk.SearchBar.new()
         searchbar.set_search_mode(False)
         searchbar.set_show_close_button(True)
-        searchentry = Gtk.SearchEntry(width_chars=30)
+        self.searchentry = Gtk.SearchEntry(width_chars=40)
+
+        # self.searchentry.connect('search-changed', self.search_and_mark)
+        self.searchentry.connect('search-changed', self._on_search_changed)
+        self.searchentry.connect('activate', self._on_search_next2)
+        # self.searchentry.connect('next-match', self._on_search_next)
+        self.searchentry.connect('next-match', self._on_search_next2)
+        # self.searchentry.connect('previous-match', self._on_search_previous)
+        self.searchentry.connect('previous-match', self._on_search_prev2)
 
-        searchentry.connect('search-changed', self.search_and_mark)
-        searchentry.connect('next-match', self._on_search_next, searchentry)
-        searchentry.connect('previous-match', self._on_search_previous, searchentry)
+        self._init_search_settings()
 
         next = Gtk.Button.new_from_icon_name('go-down-symbolic', Gtk.IconSize.BUTTON)
-        next.connect('clicked', self._on_search_next, searchentry)
+        next.connect('clicked', self._on_search_next2)
         prev = Gtk.Button.new_from_icon_name('go-up-symbolic', Gtk.IconSize.BUTTON)
-        prev.connect('clicked', self._on_search_previous, searchentry)
+        prev.connect('clicked', self._on_search_prev2)
+
+        csens = Gtk.CheckButton.new_with_label('match case')
+        csens.connect('toggled', self._set_case_sensitive)
 
         hbox = Gtk.HBox()
         searchbar.add(hbox)
-        hbox.pack_start(searchentry, 0, 0, 0)
+        hbox.pack_start(self.searchentry, 1, 1, 4)
         hbox.pack_start(prev, 0, 0, 0)
         hbox.pack_start(next, 0, 0, 0)
+        hbox.pack_start(csens, 0, 0, 6)
 
         return searchbar
 
+    def _set_case_sensitive(self, widget):
+        self.search_settings.set_case_sensitive(widget.get_active())
+
+    def _on_search_changed(self, widget):
+        self.findtext(start_offset=0)
+
+    def _on_search_next2(self, widget):
+        self.findtext()
+
+    def _on_search_prev2(self, *args):
+        self.findtext(start_offset=0, back=True)
+
+    def _init_search_settings(self):
+        self.search_settings = GtkSource.SearchSettings()
+        self.search_settings.set_case_sensitive(False)
+        self.search_settings.set_wrap_around(True)
+        self.searchentry.bind_property('text', self.search_settings, 'search-text')
+
+    def _set_search_context(self, notebook, nbchild, nbpage, *args):
+        self.current_view = nbchild.get_child()
+        self.current_buffer = self.current_view.get_buffer()
+        self.search_context = GtkSource.SearchContext.new(self.current_buffer, self.search_settings)
+
+    def findtext(self, start_offset=1, back=False):
+        buf = self.current_buffer
+        insert = buf.get_iter_at_mark(buf.get_insert())
+        insert.forward_chars(start_offset)
+
+        if not back:
+            match, start_iter, end_iter, wrapped = self.search_context.forward2(insert)
+        else:
+            match, start_iter, end_iter, wrapped = self.search_context.backward2(insert)
+
+        if match:
+            buf.place_cursor(start_iter)
+            buf.move_mark(buf.get_selection_bound(), end_iter)
+            self.current_view.scroll_to_mark(buf.get_insert(), 0.25, True, 0.5, 0.5)
+            return True
+        else:
+            buf.place_cursor(buf.get_iter_at_mark(buf.get_insert()))
+
+    def _kill_search(self, widget, evt, *args):
+        if evt.keyval == Gdk.KEY_Escape:
+            self.searchentry.delete_text(0, -1)
+            self.searchbar.set_search_mode(False)
+
     def create_textview(self, filename=None):
         scrolledwindow = Gtk.ScrolledWindow()
         scrolledwindow.set_hexpand(True)
         scrolledwindow.set_vexpand(True)
 
-        textview = GtkSource.View(buffer=GtkSource.Buffer())
+        textview = GtkSource.View()
+        textview.set_buffer(GtkSource.Buffer())
 
         textview.set_wrap_mode(Gtk.WrapMode.WORD)
 
-        # textview.set_properties(insert_spaces_instead_of_tabs=True)
+        textview.set_properties(insert_spaces_instead_of_tabs=True)
         textview.set_properties(show_line_numbers=True)
         textview.set_properties(auto_indent=True)
         # textview.set_properties(highlight_current_line = True)
-        # textview.set_properties(monospace = True)
-        textview.modify_font(Pango.FontDescription('monospace 10'))
+        textview.set_properties(monospace=True)
         textview.set_properties(tab_width=4)
         textview.set_show_line_marks(True)
         textview.connect('line-mark-activated', self.line_mark_activated)
@@ -1297,7 +1413,7 @@ class CcsEditor(Gtk.Window):
                                            GtkSource.SpaceTypeFlags.NEWLINE)
             drawer.set_enable_matrix(True)
 
-        textview.modify_font(Pango.FontDescription('monospace ' + str(self.cfg['ccs-editor']['font_size'])))
+        self._apply_css(data='grid textview {{font-size :{}pt}}'.format(self.cfg['ccs-editor']['font_size']).encode())
 
         textview.set_mark_attributes("play", self.mark_play, 1)
         textview.set_mark_attributes("break", self.mark_break, 2)
@@ -1308,6 +1424,9 @@ class CcsEditor(Gtk.Window):
 
         textbuffer.set_language(language)
 
+        if self.style_scheme is not None:
+            textbuffer.set_style_scheme(self.style_scheme)
+
         scrolledwindow.add(textview)
 
         return scrolledwindow
@@ -1318,25 +1437,30 @@ class CcsEditor(Gtk.Window):
         manage communication
         :return:
         """
-        univie_box = Gtk.HBox()
+        univie_box = Gtk.Toolbar()
         univie_button = Gtk.ToolButton()
         # button_run_nextline.set_icon_name("media-playback-start-symbolic")
         pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(os.path.join(pixmap_folder, 'Icon_Space_blau_en.png'), 48, 48)
         icon = Gtk.Image.new_from_pixbuf(pixbuf)
         univie_button.set_icon_widget(icon)
-        univie_button.set_tooltip_text('Applications and About')
+        univie_button.set_tooltip_text('Application Drawer')
         univie_button.connect("clicked", self.on_univie_button)
         univie_box.add(univie_button)
 
         # Popover creates the popup menu over the button and lets one use multiple buttons for the same one
         self.popover = Gtk.Popover()
         # Add the different Starting Options
-        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
+        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5, margin=4)
         for name in self.cfg['ccs-dbus_names']:
-            start_button = Gtk.Button.new_with_label("Start " + name.capitalize())  # + '   ')
+            start_button = Gtk.Button.new_with_label("Start " + name.capitalize())
             start_button.connect("clicked", cfl.on_open_univie_clicked)
             vbox.pack_start(start_button, True, True, 0)
 
+        # Add the TST option
+        conn_button = Gtk.Button.new_with_label('Test Specification Tool')
+        conn_button.connect("clicked", cfl.start_tst)
+        vbox.pack_start(conn_button, True, True, 0)
+
         # Add the manage connections option
         conn_button = Gtk.Button.new_with_label('Communication')
         conn_button.connect("clicked", self.on_communication_dialog)
@@ -1352,12 +1476,30 @@ class CcsEditor(Gtk.Window):
         about_button.connect("clicked", self._on_select_about_dialog)
         vbox.pack_start(about_button, True, True, 10)
 
+        # Add the close modules button
+        kill_button = Gtk.Button.new_with_label('Close modules')
+        kill_button.connect("clicked", self._close_modules_cmd)
+        vbox.pack_start(kill_button, True, True, 0)
+
         self.popover.add(vbox)
         self.popover.set_position(Gtk.PositionType.BOTTOM)
         self.popover.set_relative_to(univie_button)
 
         return univie_box
 
+    def _close_modules_cmd(self, *args):
+        dialog = Gtk.MessageDialog()
+        dialog.add_buttons(Gtk.STOCK_NO, Gtk.ResponseType.NO, Gtk.STOCK_YES, Gtk.ResponseType.YES,)
+        dialog.set_markup('<b>Close all modules?</b>')
+        response = dialog.run()
+        if response == Gtk.ResponseType.YES:
+            dialog.destroy()
+        else:
+            dialog.destroy()
+            return
+
+        self._to_console('cfl._close_modules()')
+
     def on_univie_button(self, action):
         """
         Adds the Popover menu to the UNIVIE Button
@@ -1420,8 +1562,6 @@ class CcsEditor(Gtk.Window):
 
         """ dump line into console """
         line = textbuffer.get_text(begin, end, True)
-        # self.ipython_view.text_buffer.insert_at_cursor(line, len(line))
-        # self.ipython_view._processLine()
         self._to_console(line)
 
         return iter
@@ -1435,25 +1575,21 @@ class CcsEditor(Gtk.Window):
             mark = self.sourcemarks[textbuffer]
             start = textbuffer.get_iter_at_mark(mark)
         else:
-            start = textbuffer.get_start_iter()  # init
-
-        #start = textbuffer.get_iter_at_line(iter.get_line())
-        #end = textbuffer.get_end_iter()
+            start = textbuffer.get_start_iter()
+            self._set_play_mark(view, start)
+            mark = self.sourcemarks[textbuffer]
 
-        stop = start.copy()
-        bp = textbuffer.forward_iter_to_source_mark(stop, "break")  #TODO
+        # bp = textbuffer.forward_iter_to_source_mark(stop, "break")
+        bp = mark.next()  # only works if no category is given!?
 
-        if bp is False:
-            stop = textbuffer.get_end_iter()#end
+        if bp is not None:
+            stop = textbuffer.get_iter_at_mark(bp)
+        else:
+            stop = textbuffer.get_end_iter()
 
         """ dump line into console """
         line = textbuffer.get_text(start, stop, True)
-        line += str('\n\n')
-
-        # self.ipython_view.text_buffer.insert_at_cursor(line, len(line))
-        # self.ipython_view._processLine()
-        #self._to_console(line, editor_read=True)
-        self._to_console_via_socket(line)
+        self._to_console(line)
 
         self._set_play_mark(view, stop)
 
@@ -1473,16 +1609,10 @@ class CcsEditor(Gtk.Window):
 
         """ dump line into console """
         line = textbuffer.get_text(start, end, True)
-        line += str('\n\n')
-
-        # self.ipython_view.text_buffer.insert_at_cursor(line, len(line))
-        # self.ipython_view._processLine()
-        #self._to_console(line, editor_read=True)
-        self._to_console_via_socket(line)
+        self._to_console(line)
 
         self._set_play_mark(view, end)
 
-
     def _to_console_via_socket(self, buf):
         '''
         This function sends data to the IPython Terminal, It uses a socket connection for this, in some cases more
@@ -1498,149 +1628,93 @@ class CcsEditor(Gtk.Window):
         editor_sock.close()
         return ack
 
-    #TODO: Very interesting behaviour by the editor console if every execution is done by the '_to_console' command,
-    # at the beginnig everything works fine, run all and run line by line, if a function is executed the same is true,
-    # but not if the function is first executed by run all and than by run line per line... the console just deletes
-    # the command befor it is executed, run all is now executed via socket everything works fine, changes would just be
-    # a visual plus, and the addvatage to use the built in command to communicate with the console,
-    # #### Additionally: using python 3.8 or newer, _to_console function does not yet work... but _to_conosle_via_socket
-    # works for every version, therefore it is used as long no solution is found
-
-
-    def _to_console(self, buf, execute=True, editor_read=False):
+    def _to_console(self, buf, execute=True, editor_read=False, protect_input=False):
         '''
         This function sends data to the IPython Terminal, Gtk.VteTerminal has a built in function to do this
         @param buf: String that should be sent
         @return: acknowledgment from the IPython Terminal
         '''
-        shown_length = 10   # This is the length execution line in the terminal has if no code was given
+        if protect_input:
+            shown_length = 10   # This is the length execution line in the terminal has if no code was given
 
-        last_row_pos = self.ipython_view.get_cursor_position()  # Get the last row
-        # Get the text that is written in the last row
-        terminal_text = self.ipython_view.get_text_range(last_row_pos[1], 0, last_row_pos[1] + 1, -1, None)[0]
-        entry_length = len(terminal_text)
+            last_row_pos = self.ipython_view.get_cursor_position()  # Get the last row
+            # Get the text that is written in the last row
+            terminal_text = self.ipython_view.get_text_range(last_row_pos[1], 0, last_row_pos[1] + 1, -1, None)[0]
+            entry_length = len(terminal_text)
 
-        # Check if code is entered into the terminal which was not executed yet
-        if len(terminal_text) > shown_length:
-            saved_text = terminal_text[8:-2]
-        else:
-            saved_text = ''
+            # Check if code is entered into the terminal which was not executed yet
+            if len(terminal_text) > shown_length:
+                saved_text = terminal_text[8:-2]
+            else:
+                saved_text = ''
 
-        # If code was entered delete it, otherwise the new command would be added at the end
-        while entry_length > shown_length:
-            self.ipython_view.feed_child_compat('\b', len('\b'))
-            shown_length += 1
+            # If code was entered delete it, otherwise the new command would be added at the end
+            while entry_length > shown_length:
+                self.ipython_view.feed_child_compat('\b', len('\b'))
+                shown_length += 1
+        else:
+            saved_text = None
 
         if not buf.endswith('\n'):
             buf += '\n'
 
         if buf.count('\n') > 2:
-            self.ipython_view.feed_child_compat('%cpaste\n')
+            self.ipython_view.feed_child_compat('%cpaste -q\n')
             time.sleep(0.2)
             self.ipython_view.feed_child_compat(buf)
-            ack = self.ipython_view.feed_child_compat('--\n', 3)
-
-            # if VTE_VERSION < '0.52.3':
-            #     self.ipython_view.feed_child('%cpaste\n', 8)
-            #     time.sleep(0.2)  # wait for interpreter to return before feeding new code
-            #     self.ipython_view.feed_child(buf, len(buf))
-            #     ack = self.ipython_view.feed_child('--\n', 3)
-            # else:
-            #     self.ipython_view.feed_child_binary('%cpaste\n'.encode())
-            #     time.sleep(0.2)  # wait for interpreter to return before feeding new code
-            #     self.ipython_view.feed_child_binary(buf.encode())
-            #     ack = self.ipython_view.feed_child_binary('--\n'.encode())
+            ack = self.ipython_view.feed_child_compat('--\n')
         else:
             ack = self.ipython_view.feed_child_compat(buf)
 
-            # if VTE_VERSION < '0.52.3':
-            #     ack = self.ipython_view.feed_child(buf, len(buf))
-            # else:
-            #     ack = self.ipython_view.feed_child_binary(buf.encode())
-
-        # execute = '\n'  # Without this command would be written to terminal but not executed
-        # ack = self.ipython_view.feed_child(buf + execute, len(buf + execute))
-
         # Write the previously deleted code back to the terminal
         if saved_text:
             self.ipython_view.feed_child_compat(saved_text, len(saved_text))
 
-        #editor_sock = socket.socket()
-        #editor_sock.connect((self.ed_host, self.ed_port))
-        #editor_sock.send(buf.encode())
-        #ack = editor_sock.recv(1024)
-        #editor_sock.close()
-
         return ack
 
     def on_search_clicked(self, widget):
         self.searchbar.set_search_mode(not self.searchbar.get_search_mode())
         if self.searchbar.get_search_mode():
             self.searchbar.get_child().get_child().get_children()[1].get_children()[0].get_children()[0].grab_focus()
-        '''
-        view = self._get_active_view()
-        textbuffer = view.get_buffer()
-
-        tag_clear = textbuffer.create_tag(background='white')
-        textbuffer.apply_tag(tag_clear, *textbuffer.get_bounds())
-
-        dialog = SearchDialog(self)
 
-        response = dialog.run()
-
-        if response == Gtk.ResponseType.OK:
-            cursor_mark = textbuffer.get_insert()
-            start = textbuffer.get_iter_at_mark(cursor_mark)
-
-            if start.get_offset() == textbuffer.get_char_count():
-                start = textbuffer.get_start_iter()
-
-            self.search_and_mark(textbuffer, dialog.entry.get_text(), start)
-
-        dialog.destroy()
-        '''
-
-    def search_and_mark(self, searchentry, start=None, direction='next'):
-        searchtext = searchentry.get_text()
-        view = self._get_active_view()
-        textbuffer = view.get_buffer()
-        if start == None:
-            start, end = textbuffer.get_bounds()
-        else:
-            start = textbuffer.get_iter_at_mark(start)
-            end = textbuffer.get_end_iter()
-        # tag_found = textbuffer.create_tag(background='limegreen')#, foreground='black')
-
-        if direction == 'next':
-            found = start.forward_search(searchtext, 0)
-        else:
-            found = start.backward_search(searchtext, 0)
-
-        if found:
-            start, end = found
-            textbuffer.select_range(start, end)
-            if direction == 'next':
-                last_search_pos = textbuffer.create_mark('last_search_pos', end, False)
-            else:
-                last_search_pos = textbuffer.create_mark('last_search_pos', start, False)
-            # textbuffer.apply_tag(tag_found, match_start, match_end)
-            # view.scroll_to_iter(match_start,0.,False,0,0)
-            view.scroll_mark_onscreen(last_search_pos)
-        return
-
-    def _on_search_next(self, widget, searchentry, last_search_pos=None):
-        view = self._get_active_view()
-        textbuffer = view.get_buffer()
-        last_search_pos = textbuffer.get_mark('last_search_pos')
-        self.search_and_mark(searchentry=searchentry, start=last_search_pos, direction='next')
-        return
-
-    def _on_search_previous(self, widget, searchentry, last_search_pos=None):
-        view = self._get_active_view()
-        textbuffer = view.get_buffer()
-        last_search_pos = textbuffer.get_mark('last_search_pos')
-        self.search_and_mark(searchentry=searchentry, start=last_search_pos, direction='prev')
-        return
+    # def search_and_mark(self, widget=None, start=None, direction='next'):
+    #     searchtext = self.searchentry.get_text()
+    #     view = self._get_active_view()
+    #     textbuffer = view.get_buffer()
+    #     if start is None:
+    #         start, end = textbuffer.get_bounds()
+    #     else:
+    #         start = textbuffer.get_iter_at_mark(start)
+    #         end = textbuffer.get_end_iter()
+    #     # tag_found = textbuffer.create_tag(background='limegreen')#, foreground='black')
+    #
+    #     if direction == 'next':
+    #         found = start.forward_search(searchtext, 0)
+    #     else:
+    #         found = start.backward_search(searchtext, 0)
+    #
+    #     if found:
+    #         start, end = found
+    #         textbuffer.select_range(start, end)
+    #         if direction == 'next':
+    #             last_search_pos = textbuffer.create_mark('last_search_pos', end, False)
+    #         else:
+    #             last_search_pos = textbuffer.create_mark('last_search_pos', start, False)
+    #         # textbuffer.apply_tag(tag_found, match_start, match_end)
+    #         # view.scroll_to_iter(match_start,0.,False,0,0)
+    #         view.scroll_mark_onscreen(last_search_pos)
+
+    # def _on_search_next(self, widget, *args):
+    #     view = self._get_active_view()
+    #     textbuffer = view.get_buffer()
+    #     last_search_pos = textbuffer.get_mark('last_search_pos')
+    #     self.search_and_mark(start=last_search_pos, direction='next')
+
+    # def _on_search_previous(self, widget, *args):
+    #     view = self._get_active_view()
+    #     textbuffer = view.get_buffer()
+    #     last_search_pos = textbuffer.get_mark('last_search_pos')
+    #     self.search_and_mark(start=last_search_pos, direction='prev')
 
     def on_button_action(self, widget):
         action_name = widget.get_name()
@@ -1698,27 +1772,60 @@ class CcsEditor(Gtk.Window):
         filelist = glob.glob(os.path.join(self.logdir, '*.log'))
         filelist.sort(reverse=True)
         if not filelist:
-            self.logger.info('No log files to track!')
+            self.logger.warning('No log files to track!')
             return True
-        with open(filelist[0], 'r') as fd:
+        self.log_file = filelist[0]
+        with open(self.log_file, 'r') as fd:
             file = fd.read()
-        if self.log_file is None:
+        if self.log_file_text is None:
             logwin.remove(logwin.get_child())
-            buffer.set_text('CCS Applications Log ({}):\n'.format(os.path.basename(filelist[0])))
+            buffer.set_text('CCS Applications Log ({}):\n'.format(os.path.basename(self.log_file)))
             end = buffer.get_end_iter()
             buffer.insert(end, '\n')
             end = buffer.get_end_iter()
             buffer.insert(end, file)
             logwin.add(view)
         else:
-            new_text = file[len(self.log_file):]
+            new_text = file[len(self.log_file_text):]
             if new_text:
                 end = buffer.get_end_iter()
                 buffer.insert(end, new_text)
 
-        self.log_file = file
+        self.log_file_text = file
         return True
 
+    def _on_clear_log(self, *args):
+        try:
+            with open(self.log_file, 'w') as fd:
+                fd.write('{}.000: Log truncated\n'.format(time.strftime('%Y-%m-%d %H:%M:%S')))
+            self.log_file_text = None
+            self.switch_notebook_page(self.logwin, self.logwintext, self.logbuffer)
+        except Exception as err:
+            self.logger.error(err)
+
+    def _on_set_style(self, widget):
+        dialog = StyleChooserDialog(scheme=self.style_scheme)
+
+        response = dialog.run()
+        if response == Gtk.ResponseType.OK:
+            style = dialog.styleschemechooser.get_style_scheme().get_id()
+            style_manager = GtkSource.StyleSchemeManager.get_default()
+            scheme = style_manager.get_scheme(style)
+            self._update_style_schemes(scheme)
+            self.cfg.save_option_to_file('ccs-editor', 'color_scheme', style)
+
+        dialog.destroy()
+
+    def _update_style_schemes(self, scheme):
+        if isinstance(scheme, str):
+            style_manager = GtkSource.StyleSchemeManager.get_default()
+            scheme = style_manager.get_scheme(scheme)
+
+        self.style_scheme = scheme
+        for tab in self.editor_notebook:
+            buf = tab.get_child().get_buffer()
+            buf.set_style_scheme(scheme)
+
 
 class UnsavedBufferDialog(Gtk.MessageDialog):
     def __init__(self, parent=None, msg=None):
@@ -1769,6 +1876,23 @@ class ActionWindow(Gtk.Window):
         self.show_all()
 
 
+class StyleChooserDialog(Gtk.Dialog):
+
+    def __init__(self, scheme=None):
+        super(StyleChooserDialog, self).__init__(title='Choose Style', use_header_bar=True)
+
+        self.styleschemechooser = GtkSource.StyleSchemeChooserWidget()
+
+        if scheme is not None:
+            self.styleschemechooser.set_style_scheme(scheme)
+
+        self.get_content_area().add(self.styleschemechooser)
+
+        self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK)
+
+        self.show_all()
+
+
 if __name__ == "__main__":
 
     DBusGMainLoop(set_as_default=True)
diff --git a/Ccs/iwf_egse.py b/Ccs/iwf_egse.py
new file mode 100644
index 0000000000000000000000000000000000000000..e4a21b834f5c7f9634c1738a89957e9e84ea769e
--- /dev/null
+++ b/Ccs/iwf_egse.py
@@ -0,0 +1,384 @@
+"""
+IWF EGSE communication library
+
+Ref: SMILE-IWF-PL-IF-048
+"""
+import numpy as np
+
+PORT = 8089
+
+EOP = b'\x0D\x0A'  # CR/LF
+
+ERRORCODE = {
+    b'\x30': 'Command OK',
+    b'\x31': 'Parameter 1 NOT OK',
+    b'\x32': 'Parameter 2 NOT OK',
+    b'\x33': 'Parameter 3 NOT OK',
+    b'\x34': 'Parameter 4 NOT OK',
+    b'\x35': 'Parameter 5 NOT OK',
+    b'\x36': 'Parameter 6 NOT OK',
+    b'\x37': 'Command NOT ALLOWED',
+    b'\x38': 'Command lenght NOT OK',
+    b'\x39': 'Command UNKNOWN'
+}
+
+RESPONSE_ID = {
+    b's': ('currentStatus', 10),
+    b'x': ('execReset', 4),
+    b'a': ('settledNewDelay', 4),
+    b'b': ('handledErrorInjection', 4),
+    b'c': ('settledRSERegValue', 4),
+    b'd': ('receivedRSEData', 28),
+    b'e': ('changedPSUReportPeriod', 4),
+    b'f': ('settledPSUOK', 4),
+    b'g': ('settledPSUAnalogueValue', 4),
+    b'h': ('settledPWM', 4),
+    b'k': ('newPSUStatus', 26),
+    b'm': ('changedFEEReportPeriod', 4),
+    b'n': ('newFEEStatus', 13),
+    b'p': ('newFEEPWRStatus', 11),
+    b'q': ('settledMaxLoads', 4),
+    b'r': ('settledRSMEndSwitch', 4),
+    b't': ('newRSMStatus', 13),
+    b'u': ('newPSUEBOXStatus', 9),
+    b'v': ('changedFEEPWRReportPeriod', 4),
+    b'w': ('changedRSEReportPeriod', 4)
+}
+
+
+# load calibration curve for CCD temperature to PWM set point
+try:
+    _pwm_t_cal = np.loadtxt('ccd_pwm_t_cal.dat', unpack=True)
+except FileNotFoundError:
+    _pwm_t_cal = None
+
+
+class Command:
+
+    # GENERAL
+    @staticmethod
+    def get_status():
+        """
+        The general status of the IWF EGSE is requested with this command.
+
+        :return:
+        """
+
+        return 'S'.encode('ascii') + EOP
+
+    @staticmethod
+    def reset():
+        """
+        The FPGA in the IWF_EGSE is reset.
+
+        :return:
+        """
+
+        return 'X'.encode('ascii') + EOP
+
+    ### DPU EGSE Interface ###
+    # RSE
+    @staticmethod
+    def set_new_delay(delay):
+        """
+        RSE Interface
+        With this command the delay between the received command and the generated response can be changed. (The default value after power-on is 2 baud)
+
+        :param delay: Contains the 2Byte Unsigned-Integer as ASCII coded hexadecimal value to set
+        :return:
+        """
+
+        delay = _hexasciify(delay, 4)
+
+        return 'A'.encode('ascii') + delay.encode('ascii') + EOP
+
+    @staticmethod
+    def inject_errors(error_type, apply_to, num_errors, error_reg, error_resp, byte_sel):
+        """
+        With this command errors can be injected to the serial communication RSE - DPU (it can be used to abort the error injection, too).
+
+        :param error_type: Selects the error type to inject
+        :param apply_to: Selects when to apply error injection
+        :param num_errors: Selects the number of errors to inject. Use '-1' to inject the error endless. Contains the 4Byte Signed-Integer as ASCII coded hexadecimal number.
+        :param error_reg: Contains the defined address as 1Byte Unsigned-Integer as ASCII coded hexadecimal. Only used, if ApplyTO is 'defined address only'
+        :param error_resp: Contains the error response as 1Byte Unsigned-Integer as ASCII coded hexadecimal. Only used, if ErrorType is “send an error response”
+        :param byte_sel: Selects the bytes to inject frame or parity errors
+        :return:
+        """
+
+        error_type = _hexasciify(error_type, 1)
+        apply_to = _hexasciify(apply_to, 1)
+        num_errors = _hexasciify(num_errors, 4, signed=True)
+        error_reg = _hexasciify(error_reg, 2)
+        error_resp = _hexasciify(error_resp, 2)
+        byte_sel = _hexasciify(byte_sel, 1)
+
+        params = ''.join([error_type, apply_to, num_errors, error_reg, error_resp, byte_sel])
+
+        return 'B'.encode('ascii') + params.encode('ascii') + EOP
+
+    @staticmethod
+    def set_rse_reg_value(register_address, value):
+        """
+        A new value is set to a register address in the myRIO FPGA.
+
+        :param register_address: Contains the 1Byte Unsigned-Integer as ASCII coded hexadecimal address of the register
+        :param value:  Contains the 1Byte Unsigned-Integer as ASCII coded hexadecimal value to set
+        :return:
+        """
+
+        register_address = _hexasciify(register_address, 2)
+        value = _hexasciify(value, 2)
+
+        params = ''.join([register_address, value])
+
+        return 'C'.encode('ascii') + params.encode('ascii') + EOP
+
+    # PSU
+    @staticmethod
+    def change_psu_report_period(newperiod):
+        """
+        The default report period of 1 second can be changed with this command.
+
+        :param newperiod: Contains the new period in ms as 2Byte Unsigned-Integer as ASCII coded hexadecimal
+        :return:
+        """
+
+        newperiod = _hexasciify(newperiod, 4)
+
+        return 'E'.encode('ascii') + newperiod.encode('ascii') + EOP
+
+    @staticmethod
+    def set_psu_ok_signal(ok_signal, output):
+        """
+        The output of an IWF_EGSE_xxx_OK signal is set as selected with this command.
+
+        :param ok_signal: Selects the signal
+        :param output: Selects the value
+        :return:
+        """
+
+        ok_signal = _hexasciify(ok_signal, 1)
+        output = _hexasciify(output, 1)
+
+        params = ''.join([ok_signal, output])
+
+        return 'F'.encode('ascii') + params.encode('ascii') + EOP
+
+    @staticmethod
+    def set_psu_analogue_value(i_signal, output):
+        """
+        The analogue output IWF_EGSE_I_xxx is set as selected with this command.
+
+        :param i_signal: Selects the signal
+        :param output: Selects the value (lower 12Bits are used). Value as digital value in the range from 0 (≙ 0V) to 3276 (≙ 4V)
+        :return:
+        """
+
+        ok_signal = _hexasciify(i_signal, 1)
+        output = _hexasciify(output, 4)
+
+        params = ''.join([ok_signal, output])
+
+        return 'G'.encode('ascii') + params.encode('ascii') + EOP
+
+    @staticmethod
+    def set_pwm(thermistor, value):
+        """
+        The PWM for the OTA thermistor or CDD thermistor is as selected with this command. If no command is sent after a power-up, the PWM_MODE “automatic” is used by default.
+
+        :param thermistor: Selects the thermistor
+        :param value: Sets the current value for the PWM in thousandth (0 ≙ 0‰, 4000 ≙ 1000‰) as 2Byte Unsigned Integer, if mode is manual
+        :return:
+        """
+
+        thermistor = _hexasciify(thermistor, 1)
+        spare = '0'
+        value = _hexasciify(value, 4)
+
+        params = ''.join([thermistor, spare, value])
+
+        return 'H'.encode('ascii') + params.encode('ascii') + EOP
+
+    # FEE
+    @staticmethod
+    def change_fee_report_period(new_period):
+        """
+        The default report period of 1 second can be changed with this command.
+
+        :param new_period: Contains the new period in ms as 2Byte Unsigned Int as ASCII coded hexadecimal
+        :return:
+        """
+
+        new_period = _hexasciify(new_period, 4)
+
+        return 'M'.encode('ascii') + new_period.encode('ascii') + EOP
+
+    ### EBOX EGSE Interface ###
+    # FEE Power
+    @staticmethod
+    def set_max_loads(ccd_max, an1_max, an2_max, an3_max, clk_max, dig_spw_max, dig_fpga_max):
+        """
+        The maximum loads at the LoadSim can be enabled or disabled with this command. If they are disabled, the nominal loads are active.
+
+        :param ccd_max: Enables or disables the maximum load for IWF_EGSE_FEE_CCD
+        :param an1_max: Enables or disables the maximum load for IWF_EGSE_FEE_AN1
+        :param an2_max: Enables or disables the maximum load for IWF_EGSE_FEE_AN2
+        :param an3_max: Enables or disables the maximum load for IWF_EGSE_FEE_AN3
+        :param clk_max: Enables or disables the maximum load for IWF_EGSE_FEE_CLK
+        :param dig_spw_max: Enables or disables the maximum load for IWF_EGSE_FEE_DIG_SPW
+        :param dig_fpga_max: Enables or disables the maximum load for IWF_EGSE_FEE_DIG_FPGA
+        :return:
+        """
+
+        spare = '0'
+
+        ccd_max = _hexasciify(ccd_max, 1)
+        an1_max = _hexasciify(an1_max, 1)
+        an2_max = _hexasciify(an2_max, 1)
+        an3_max = _hexasciify(an3_max, 1)
+        clk_max = _hexasciify(clk_max, 1)
+        dig_spw_max = _hexasciify(dig_spw_max, 1)
+        dig_fpga_max = _hexasciify(dig_fpga_max, 1)
+
+        params = ''.join([spare, ccd_max, an1_max, an2_max, an3_max, clk_max, dig_spw_max, dig_fpga_max])
+
+        return 'Q'.encode('ascii') + params.encode('ascii') + EOP
+
+    @staticmethod
+    def change_fee_pwr_report_period(new_period):
+        """
+        The default report period of 1 second can be changed with this command.
+
+        :param new_period: Contains the new period in ms as 2Byte Unsigned Int as ASCII coded hexadecimal
+        :return:
+        """
+
+        new_period = _hexasciify(new_period, 4)
+
+        return 'V'.encode('ascii') + new_period.encode('ascii') + EOP
+
+    # RSM
+    @staticmethod
+    def change_rsm_report_period(new_period):
+        """
+        The default report period of 1 second can be changed with this command.
+
+        :param new_period: Contains the new period in ms as 2Byte Unsigned Int as ASCII coded hexadecimal
+        :return:
+        """
+
+        new_period = _hexasciify(new_period, 4)
+
+        return 'W'.encode('ascii') + new_period.encode('ascii') + EOP
+
+    @staticmethod
+    def set_rsm_end_switch(open_pos, close_pos):
+        """
+        The end switches (open or close) can be set with this command.
+
+        :param open_pos: Enables or disables the signal IWF_EGSE_OPEN_POS
+        :param close_pos: Enables or disables the signal IWF_EGSE_CLOSE_POS
+        :return:
+        """
+
+        open_pos = _hexasciify(open_pos, 1)
+        close_pos = _hexasciify(close_pos, 1)
+
+        params = ''.join([open_pos, close_pos])
+
+        return 'R'.encode('ascii') + params.encode('ascii') + EOP
+
+
+class Response:
+    pass
+
+
+def _hexasciify(value, nchars, signed=False):
+    """
+    Returns an int as a hexadecimal string of length *nchars*
+
+    :param value:
+    :param nchars:
+    :return:
+    """
+    if isinstance(value, int):
+        if signed:
+            return value.to_bytes(nchars // 2, 'big', signed=True).hex().upper()
+        else:
+            return '{:0{nc}X}'.format(value, nc=nchars)
+    else:
+        return value
+
+
+class Signal:
+
+    EGSE_PSU_OK = 1
+    EGSE_FEE_DIG_OK = 2
+    EGSE_RSE_OK = 3
+    EGSE_PIN_PULL_OK = 4
+    EGSE_FEE_ANA_OK = 5
+
+    EGSE_I_FEE = 1
+    EGSE_I_PSU = 2
+    EGSE_I_HEATER = 3
+    EGSE_I_RSE = 4
+
+    FEE_Thermistor = 1
+    CDD_Thermistor = 2
+
+
+def response_proc_func(rawdata):
+    pkts = rawdata.split(EOP)
+    pkts.remove(b'')
+    proc_pkts = [(RESPONSE_ID.get(pkt[0:1], 'UKNOWN'), pkt.decode('ascii', errors='replace')) for pkt in pkts]
+    return proc_pkts
+
+
+def ccd_pwm_from_temp(t, cal_file=None):
+    """
+    Calculate the pwm value for EGSE command set_pwm from temperature *t*, according to pwm_t_cal
+
+    :param t:
+    :param cal_file:
+    :return:
+    """
+
+    if cal_file is not None:
+        cal = np.loadtxt(cal_file, unpack=True)
+        pwm = np.round(np.interp(t, *cal, left=-1, right=-1))
+
+    else:
+        if _pwm_t_cal is not None:
+            pwm = np.round(np.interp(t, *_pwm_t_cal, left=-1, right=-1))
+        else:
+            print('No calibration curve defined')
+            return
+
+    if isinstance(pwm, np.ndarray):
+        return np.array(pwm, dtype=int)
+    else:
+        return int(pwm)
+
+
+def adu_to_ana_adcihtr(adu):
+    """
+    Calculate the 'analogue' value IWF_EGSE_I_HEATER needed for set_psu_analogue_value that corresponds to the equivalent digital HK ADU value
+
+    :param adu:
+    :return:
+    """
+
+    # this has linear behaviour
+    adu_min = 3950
+    adu_max = 12650
+    ana_min = 0
+    ana_max = 3276
+
+    if adu < adu_min:
+        return adu_min
+    elif adu > adu_max:
+        return adu_max
+    else:
+        return ((adu - adu_min) / (adu_max - adu_min)) * (ana_max - ana_min)
+
diff --git a/Ccs/log_server.py b/Ccs/log_server.py
index 1d71757cc8ccbe66e4c855cfc9748bc752c8795c..36b7af180612984f80c35d12ee9efe7125ff4a32 100644
--- a/Ccs/log_server.py
+++ b/Ccs/log_server.py
@@ -143,7 +143,7 @@ def main():
         tcpserver.serve_until_stopped(cfg)
         logger.info('TCP-server for logging shutting down')
     # Catch exception if log_server is already running and address/port is already in use
-    except OSError:
+    except OSError as err:
         logger.info('TCP-server for logging seems to be already running.')
     except Exception as err:
         raise err
diff --git a/Ccs/monitor.py b/Ccs/monitor.py
index 8f440ee2fe2b06e4565f9e291ec8fc7aa0b9846e..ab52b9f5976109ebbf0dede13e3e35e10839c292 100644
--- a/Ccs/monitor.py
+++ b/Ccs/monitor.py
@@ -12,7 +12,7 @@ gi.require_version('Gtk', '3.0')
 
 from gi.repository import Gtk, Gdk, GLib, GdkPixbuf
 from database.tm_db import DbTelemetryPool, DbTelemetry, scoped_session_maker
-from sqlalchemy.sql.expression import func
+# from sqlalchemy.sql.expression import func
 import ccs_function_lib as cfl
 
 cfg = confignator.get_config(check_interpolation=False)
@@ -25,11 +25,11 @@ class ParameterMonitor(Gtk.Window):
     limit_colors = {0: "green", 1: "orange", 2: "red"}
     alarm_colors = {'red': Gdk.RGBA(1, 0, 0, 1), 'orange': Gdk.RGBA(1, 0.647059, 0, 1),
                     'green': Gdk.RGBA(0.913725, 0.913725, 0.913725, 1.)}
-    parameter_types = {"S": "s", "N": ".3G"}
+    # parameter_types = {"S": "s", "N": ".3G"}
 
     def __init__(self, pool_name=None, parameter_set=None, interval=INTERVAL, max_age=MAX_AGE, user_limits=None):
-
-        Gtk.Window.__init__(self, title="Parameter Monitor - {} - {}".format(pool_name, parameter_set))
+        super(ParameterMonitor, self).__init__(title="Parameter Monitor - {} - {}".format(pool_name, parameter_set))
+        # Gtk.Window.__init__(self, title="Parameter Monitor - {} - {}".format(pool_name, parameter_set))
         self.set_border_width(10)
         self.set_resizable(True)
 
@@ -54,8 +54,7 @@ class ParameterMonitor(Gtk.Window):
 
         self.events = {'Error LOW': [(5, 2), 0], 'Error MEDIUM': [(5, 3), 0], 'Error HIGH': [(5, 4), 0]}
         self.evt_reset_values = {'Error LOW': 0, 'Error MEDIUM': 0, 'Error HIGH': 0}
-        # self.box = Gtk.VBox()
-        # self.menubar = Gtk.MenuBar()
+        self.evt_pkt_idx_last = 0  # last packet idx up to which the evts were counted
 
         self.grid = Gtk.Grid()
         self.grid.set_column_homogeneous(True)
@@ -64,10 +63,12 @@ class ParameterMonitor(Gtk.Window):
         hbox = Gtk.HBox()
         self.add(hbox)
 
+        self._res_evt_cnt_callback = None
         self.evt_cnt = self.create_event_counter()
         self.evt_check_enabled = True
         self.evt_check_tocnt = 0
 
+        self.pool_id = None  # used to track "clear pool" events
         self.pool_name = pool_name
         self.parameter_set = parameter_set
         self.parameters = {}
@@ -78,8 +79,8 @@ class ParameterMonitor(Gtk.Window):
         hbox.pack_start(self.grid, 1, 1, 0)
 
         # Add Univie Button
-        univie_box = self.create_univie_box()
-        hbox.pack_start(univie_box, 0, 1, 0)
+        # univie_box = self.create_univie_box()
+        # hbox.pack_start(univie_box, 0, 1, 0)
 
         hbox.set_spacing(20)
 
@@ -95,7 +96,8 @@ class ParameterMonitor(Gtk.Window):
 
     def check_for_pools(self):
         try:
-            poolmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
+            # poolmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
+            poolmgr = cfl.get_module_handle('poolmanager')
             pools = poolmgr.Functions('loaded_pools_export_func')
             if len(pools) == 1:
                 pool_name = pools[0][0]
@@ -151,9 +153,11 @@ class ParameterMonitor(Gtk.Window):
             evt_cnt.pack_start(box, 0, 0, 0)
 
         reset_button = Gtk.Button(label='Reset')
-        reset_button.connect('clicked', self.reset_evt_cnt)
+        reset_button.set_tooltip_text('Reset warning threshold to current # of evt pkts')
+        self._res_evt_cnt_callback = reset_button.connect('clicked', self.reset_evt_cnt)
 
-        set_button = Gtk.Button(label='Set Parameter')
+        set_button = Gtk.Button(label='Set Parameters')
+        set_button.set_tooltip_text('Select/create set of monitored parameters')
         set_button.connect('clicked', self.add_evt_cnt)
 
         evt_cnt.pack_start(reset_button, 0, 0, 0)
@@ -182,9 +186,9 @@ class ParameterMonitor(Gtk.Window):
         # Popover creates the popup menu over the button and lets one use multiple buttons for the same one
         self.popover = Gtk.Popover()
         # Add the different Starting Options
-        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
+        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5, margin=4)
         for name in self.cfg['ccs-dbus_names']:
-            start_button = Gtk.Button.new_with_label("Start " + name.capitalize() + '   ')
+            start_button = Gtk.Button.new_with_label("Start " + name.capitalize())
             start_button.connect("clicked", cfl.on_open_univie_clicked)
             vbox.pack_start(start_button, False, True, 0)
 
@@ -233,9 +237,13 @@ class ParameterMonitor(Gtk.Window):
         self.pdescr = {x[0]: x[1] for x in descrs}
         if self.cfg.has_option('ccs-monitor_parameter_sets', parameter_set):
             parameters = json.loads(self.cfg['ccs-monitor_parameter_sets'][parameter_set])
-            self.setup_grid(parameters)
+            try:
+                self.parameter_set = parameter_set
+                self.setup_grid(parameters)
+            except KeyError as err:
+                self.logger.error('Failed to load parameter set "{}" ({})'.format(parameter_set, err))
         else:
-            self.logger.warning('Parameter set "{}" does not exist'.format(parameter_set))
+            self.logger.error('Parameter set "{}" does not exist'.format(parameter_set))
 
     def setup_grid(self, parameters):
 
@@ -246,39 +254,76 @@ class ParameterMonitor(Gtk.Window):
         for ncol, col in enumerate(parameters):
             for nrow, parameter in enumerate(col):
                 box = Gtk.HBox()
-                parameter, *pktid = eval(parameter)
-                box.pktid = tuple(pktid)
-                dbres = dbcon.execute('SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_categ,pcf.pcf_unit,ocf.ocf_nbool,\
-                                    ocp.ocp_lvalu,ocp.ocp_hvalu from pcf left join ocf on pcf.pcf_name=ocf.ocf_name\
-                                    left join ocp on ocf_name=ocp_name where pcf.pcf_name="{}"'.format(parameter))
+                parinfo = eval(parameter)
+                if len(parinfo) == 2:
+                    parameter, pktid = parinfo[0], eval(parinfo[1])
+                else:
+                    parameter, *pktid = parinfo
+
+                if parameter.startswith('UDEF:'):
+                    box.pktid = tuple(pktid)
+                    parameter, udtype = parameter.split(':')[1:]
+                    if udtype == 'dp_item':
+                        dbres = dbcon.execute('SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_categ,pcf.pcf_unit,ocf.ocf_nbool,\
+                                                ocp.ocp_lvalu,ocp.ocp_hvalu from pcf left join ocf on pcf.pcf_name=ocf.ocf_name\
+                                                left join ocp on ocf_name=ocp_name where pcf.pcf_descr="{}" and pcf_pid is not NULL'.format(parameter))
+                        boxdata = dbres.fetchall()
+                        if not boxdata:
+                            udid = '{}:{}'.format(udtype, cfl.DP_ITEMS_TO_IDS[parameter])
+                            boxdata = [[udid, parameter, 'N', None, None, None, None]]
+                    elif udtype in ['user_defined', 'user_defined_nopos']:
+                        udid = '{}:{}'.format(udtype, parameter)
+                        boxdata = [[udid, parameter, 'N', None, None, None, None]]
+                    else:
+                        dbres = dbcon.execute('SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_categ,pcf.pcf_unit,ocf.ocf_nbool,\
+                                                ocp.ocp_lvalu,ocp.ocp_hvalu from pcf left join ocf on pcf.pcf_name=ocf.ocf_name\
+                                                left join ocp on ocf_name=ocp_name where pcf.pcf_name="{}"'.format(udtype))
+                        boxdata = dbres.fetchall()
+
+                elif parameter.startswith('user_defined'):
+                    udtype, parameter = parameter.split(':')
+                    box.pktid = ((pktid['bytepos'], pktid['offbi'], pktid['format']), pktid['ST'], pktid['SST'],
+                                 pktid['APID'], pktid['SID'], None, None)
+                    udid = '{}:{}'.format(udtype, parameter)
+                    boxdata = [[udid, parameter, 'N', None, None, None, None]]
+
+                else:
+                    box.pktid = tuple(pktid)
+                    udtype, parameter = parameter.split(':')
+                    dbres = dbcon.execute('SELECT pcf.pcf_name,pcf.pcf_descr,pcf.pcf_categ,pcf.pcf_unit,ocf.ocf_nbool,\
+                                        ocp.ocp_lvalu,ocp.ocp_hvalu from pcf left join ocf on pcf.pcf_name=ocf.ocf_name\
+                                        left join ocp on ocf_name=ocp_name where pcf.pcf_name="{}"'.format(parameter))
+                    boxdata = dbres.fetchall()
 
-                boxdata = dbres.fetchall()
                 try:
                     nlims = boxdata[0][-3]
                     if nlims in (1, None):
-                        box.param_id, plabel, box.format, unit, _, lolim, hilim = boxdata[0]
+                        box.param_id, plabel, categ, unit, _, lolim, hilim = boxdata[0]
                         hardlim = (lolim, hilim)
                         softlim = (None, None)
                     else:
-                        box.param_id, plabel, box.format, unit = boxdata[0][:4]
+                        box.param_id, plabel, categ, unit = boxdata[0][:4]
                         softlim, hardlim = [(x[-2], x[-1]) for x in boxdata]
+                    box.format = self.get_fstr(box.param_id, plabel, categ=categ)
                 except IndexError:
                     self.logger.error('Parameter {} does not exist - cannot add!'.format(parameter))
                     continue
+
                 # override with user defined limits
-                if self.pdescr.get(parameter) in self.user_limits:
+                if self.pdescr.get(parameter, parameter) in self.user_limits:
                     try:
-                        softlim = self.user_limits[self.pdescr[parameter]]['soft']
+                        softlim = self.user_limits[self.pdescr.get(parameter, parameter)]['soft']
                     except KeyError:
                         softlim = (None, None)
-                    hardlim = self.user_limits[self.pdescr[parameter]]['hard']
+                    hardlim = self.user_limits[self.pdescr.get(parameter, parameter)]['hard']
 
                 box.limits = (softlim, hardlim)
 
                 pname, pvalue = Gtk.Label(), Gtk.TextView()
-                pname.set_markup('<span size="large" weight="bold">{} [{}]</span>'.format(plabel, unit))
+                unit_txt = '[{}]'.format(unit) if unit is not None else ''
+                pname.set_markup('<span size="large" weight="bold">{} {}</span>'.format(plabel, unit_txt))
                 pname.set_xalign(0)
-                pname.set_tooltip_text(box.param_id)
+                pname.set_tooltip_text(box.param_id.split(':')[-1])
 
                 buf = Gtk.TextBuffer()
                 buf.insert_markup(buf.get_start_iter(),
@@ -312,8 +357,11 @@ class ParameterMonitor(Gtk.Window):
 
         self.monitored_pkts = {self.parameters[k]['pktid']: {'pkttime': 0, 'reftime': time.time(), 'data': None} for k in self.parameters}
 
+        # LUT for user defined parameter names by pktid
+        self.pname_from_pktid = {self.parameters[k]['pktid']: k.split(':')[-1] for k in self.parameters}
+
+        self.set_title("Parameter Monitor - {} - {}".format(self.pool_name, self.parameter_set))
         self.grid.show_all()
-        return
 
     def update_parameter_view(self, interval=INTERVAL, max_age=MAX_AGE):
         self.interval = interval
@@ -332,25 +380,23 @@ class ParameterMonitor(Gtk.Window):
             start = time.time()
             self.update_parameters_worker()
             dt = time.time() - start
-            # print(dt)
+            # print('#', threading.enumerate(), dt)
+            if dt > self.interval:
+                self.logger.warning('Monitoring cycle takes longer than requested interval ({:.3f} > {:.3f})!'.format(dt, self.interval))
+                # self.disable_evt_cnt()
             time.sleep(self.interval - min(self.interval, dt))
 
     def update_parameters_worker(self):
         rows = cfl.get_pool_rows(self.pool_name)
 
-        if self.evt_check_enabled:
-            ctime = time.time()
-            self.check_evts(rows)
-            cdt = time.time() - ctime
-            # disable check_evts if it causes too much delay
-            if cdt > 0.7 * self.interval:
-                self.evt_check_tocnt += 1
-                if self.evt_check_tocnt > 5:
-                    self.disable_evt_cnt()
+        try:
+            pool_id = rows.first().pool_id  # keep track of monitored pool
+        except AttributeError:
+            self.logger.debug('No rows in pool yet')
+            return
 
         for pktid in self.monitored_pkts:
             pktinfo = self.get_last_pkt_with_id(rows, pktid)
-
             if pktinfo is None:
                 continue
 
@@ -359,8 +405,18 @@ class ParameterMonitor(Gtk.Window):
                 self.monitored_pkts[pktid]['reftime'] = time.time()
                 self.monitored_pkts[pktid]['pkttime'] = pkttime
 
-                tm = cfl.Tmdata(pkt)[0]
-                self.monitored_pkts[pktid]['data'] = {par[4][1][0]: par[0] for par in tm}
+                if isinstance(pktid[0], tuple):
+                    pname = self.pname_from_pktid[pktid]
+                    xy, par = cfl.get_param_values(tmlist=[pkt], hk='User defined', param=pname, last=1, tmfilter=False, mk_array=False)
+                    udtype = 'user_defined'
+                    self.monitored_pkts[pktid]['data'] = {'{}:{}'.format(udtype, par[0]): xy[0][1]}
+                else:
+                    try:
+                        tm = cfl.Tmdata(pkt)[0]
+                        self.monitored_pkts[pktid]['data'] = {self.get_param_id(par): par[0] for par in tm}
+                    except Exception as err:
+                        self.logger.info('{} {}'.format(err, pktid))
+                        continue
 
         checktime = time.time()
         for pname in self.parameters:
@@ -399,13 +455,36 @@ class ParameterMonitor(Gtk.Window):
                                       '<span size="large" foreground="{}" weight="bold">{}</span>'.format(
                                           self.parameters[par]['alarm'], '--'), -1)
                 else:
-                    buf.insert_markup(buf.get_start_iter(),
-                                      '<span size="large" foreground="{}" weight="bold">{:{fstr}}</span>'.format(
-                                          self.parameters[par]['alarm'], self.parameters[par]['value'],
-                                          fstr=self.parameter_types[self.parameters[par]['format']]), -1)
+                    val = self.parameters[par]['value']
+                    if isinstance(val, bytes):
+                        txt = '<span size="large" foreground="{}" weight="bold">0x{}</span>'.format(
+                            self.parameters[par]['alarm'], val.hex().upper())
+                    else:
+                        txt = '<span size="large" foreground="{}" weight="bold">{:{fstr}}</span>'.format(
+                            self.parameters[par]['alarm'], val, fstr=self.parameters[par]['format'])
+
+                    buf.insert_markup(buf.get_start_iter(), txt, -1)
 
         GLib.idle_add(updt_buf)
 
+        if self.evt_check_enabled:
+            ctime = time.time()
+            self.check_evts(rows, incremental=True)
+            cdt = time.time() - ctime
+            # disable check_evts if it causes too much delay
+            if cdt > (0.7 * self.interval):
+                self.evt_check_tocnt += 1
+                if self.evt_check_tocnt > 5:
+                    self.disable_evt_cnt()
+
+        if (pool_id != self.pool_id) and (self.pool_id is not None):
+            self.logger.warning('Monitored pool has changed ({})'.format(pool_id))
+            self.evt_pkt_idx_last = 0
+            self.events = {'Error LOW': [(5, 2), 0], 'Error MEDIUM': [(5, 3), 0], 'Error HIGH': [(5, 4), 0]}
+            self.evt_reset_values = {'Error LOW': 0, 'Error MEDIUM': 0, 'Error HIGH': 0}
+
+        self.pool_id = pool_id
+
         # def updt_bg_color():
         #     alarms = [self.parameters[x]['alarm'] for x in self.parameters.keys()]
         #     if alarms.count('red'):
@@ -425,25 +504,62 @@ class ParameterMonitor(Gtk.Window):
         # GLib.idle_add(updt_bg_color)
         # return
 
-    def get_last_pkt_with_id(self, rows, pktid):
+    def get_last_pkt_with_id(self, rows, pktid, pidx=0):
         spid, st, sst, apid, pi1, pi1off, pi1wid = pktid
-        if pi1off != -1:
-            rows = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst, DbTelemetry.apid == apid,
-                               func.mid(DbTelemetry.data, pi1off - cfl.TM_HEADER_LEN + 1, pi1wid // 8) == pi1.to_bytes(
-                                pi1wid // 8, 'big')).order_by(DbTelemetry.idx.desc()).first()
+        if pi1off != -1:  # and (pi1off is not None):
+            # rows = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst, DbTelemetry.apid == apid,
+            #                    func.mid(DbTelemetry.data, pi1off - cfl.TM_HEADER_LEN + 1, pi1wid // 8) == pi1.to_bytes(
+            #                     pi1wid // 8, 'big'), DbTelemetry.idx>=pidx).order_by(DbTelemetry.idx.desc()).first()
+            rows = cfl.filter_rows(rows, st=st, sst=sst, apid=apid, sid=pi1, idx_from=pidx).order_by(DbTelemetry.idx.desc()).first()
         else:
-            rows = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst, DbTelemetry.apid == apid).order_by(DbTelemetry.idx.desc()).first()
-
+            # rows = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst, DbTelemetry.apid == apid, DbTelemetry.idx>=pidx).order_by(DbTelemetry.idx.desc()).first()
+            rows = cfl.filter_rows(rows, st=st, sst=sst, apid=apid, idx_from=pidx).order_by(DbTelemetry.idx.desc()).first()
         if rows is None:
             return
 
         return float(rows.timestamp[:-1]), rows.raw
 
-    def pckt_counter(self, rows, st, sst):
-        npckts = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst).count()
+    def get_param_id(self, pinfo):
+        """
+        Get param_id from parinfo as returned by Tmdata for look-up in monitored packets data
+        @param par:
+        """
+        par = pinfo[4][1]
+
+        if par[0] == 'dp_item':
+            return '{}:{}'.format(par[0], cfl.DP_ITEMS_TO_IDS[par[1]])
+        elif par[0] in ['user_defined', 'user_defined_nopos']:
+            return '{}:{}'.format(par[0], par[1])
+        else:
+            return par[0]
+
+    def get_fstr(self, param_id, name, categ=None):
+
+        if categ == 'S':
+            return 's'
+
+        udtype = param_id.split(':')[0]
+        pinfo = cfl._parameter_decoding_info((name, udtype), check_curtx=True)
+
+        ptc, pfc = pinfo[2:4]
+        curtx = pinfo[4]
+
+        if ptc in [7]:
+            return ''
+        elif ptc in [5, 9]:
+            return '.13G'
+        elif ptc in [8]:
+            return 's'
+        elif curtx is not None:  # numerically calibrated
+            return '.7G'
+        else:
+            return 'd'
+
+    def pckt_counter(self, rows, st, sst, pidx=0):
+        npckts = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst, DbTelemetry.idx > pidx).count()
         return npckts
 
-    def check_evts(self, rows):
+    def check_evts(self, rows, incremental=True):
         def updt_buf(buf, evt):
             buf.delete(*buf.get_bounds())
             buf.insert_markup(buf.get_start_iter(),
@@ -454,18 +570,23 @@ class ParameterMonitor(Gtk.Window):
         for event in self.evt_cnt.get_children()[:-2]:
             evt = event.get_children()[0].get_text()
 
-            self.events[evt][1] = self.pckt_counter(rows, *self.events[evt][0])
+            if incremental:
+                self.events[evt][1] += self.pckt_counter(rows, *self.events[evt][0], pidx=self.evt_pkt_idx_last)
+            else:
+                self.events[evt][1] = self.pckt_counter(rows, *self.events[evt][0])
 
             buf = event.get_children()[1].get_buffer()
 
             GLib.idle_add(updt_buf, buf, evt)
 
-        def updt_bg_color():
-            if self.events['Error HIGH'][1] > self.evt_reset_values['Error HIGH']:
-                self.override_background_color(Gtk.StateType.NORMAL, self.alarm_colors['red'])
-                self.present()
-            elif self.events['Error MEDIUM'][1] > self.evt_reset_values['Error MEDIUM']:
-                self.override_background_color(Gtk.StateType.NORMAL, self.alarm_colors['orange'])
+        self.evt_pkt_idx_last = rows.order_by(DbTelemetry.idx.desc()).first().idx
+
+        # def updt_bg_color():
+        #     if self.events['Error HIGH'][1] > self.evt_reset_values['Error HIGH']:
+        #         self.override_background_color(Gtk.StateType.NORMAL, self.alarm_colors['red'])
+        #         self.present()
+        #     elif self.events['Error MEDIUM'][1] > self.evt_reset_values['Error MEDIUM']:
+        #         self.override_background_color(Gtk.StateType.NORMAL, self.alarm_colors['orange'])
 
         # GLib.idle_add(updt_bg_color)
 
@@ -494,9 +615,33 @@ class ParameterMonitor(Gtk.Window):
 
         rbutton = self.evt_cnt.get_children()[-2]
         rbutton.set_label('Count EVTs')
-        rbutton.set_tooltip_text('Event counting has been disabled because of heavy load, probably because of a too large pool.\nClick to force count update.')
+        rbutton.set_tooltip_text('Event counting has been disabled because of heavy load, probably because of a too large pool. Click to force count update.')
+        rbutton.disconnect(self._res_evt_cnt_callback)
+        self._res_evt_cnt_callback = rbutton.connect('clicked', self.reenable_evt_cnt)
         self.logger.warning('Counting events takes too long - disabling.')
 
+    def reenable_evt_cnt(self, widget):
+        self.evt_check_enabled = True
+        self.evt_check_tocnt = 0
+
+        def updt_buf(cbuf, cevt):
+            cbuf.delete(*cbuf.get_bounds())
+            cbuf.insert_markup(cbuf.get_start_iter(), '<span size="large" foreground="{}" weight="bold">{}</span>'.format(
+                'black', self.events[cevt][1]), -1)
+
+        for evt in self.evt_cnt.get_children()[:-2]:
+            evt.set_sensitive(True)
+            buf = evt.get_children()[1]
+
+            GLib.idle_add(updt_buf, buf.get_buffer(), evt.get_children()[0].get_text())
+
+        widget.set_label('Reset')
+        widget.set_tooltip_text('Reset warning threshold to current # of evt pkts')
+        widget.disconnect(self._res_evt_cnt_callback)
+        self._res_evt_cnt_callback = widget.connect('clicked', self.reset_evt_cnt)
+
+        self.logger.info('Event counting re-enabled')
+
     def add_evt_cnt(self, widget=None):
         self.monitor_setup()
 
@@ -510,9 +655,9 @@ class ParameterMonitor(Gtk.Window):
 
     def monitor_setup(self, parameter_set=None, nslots=3):
         if parameter_set is not None:
-            parameters = json.loads(self.cfg['ccs-monitor_parameter_sets'][parameter_set])
-            self.setup_grid(parameters)
-
+            # parameters = json.loads(self.cfg['ccs-monitor_parameter_sets'][parameter_set])
+            # self.setup_grid(parameters)
+            self.set_parameter_view(parameter_set)
             return
 
         dialog = MonitorSetupDialog(logger=self.logger, nslots=nslots, parameter_set=parameter_set, parent=self)
@@ -530,8 +675,8 @@ class ParameterMonitor(Gtk.Window):
             parameter_set = dialog.label.get_active_text()
             self.cfg.save_option_to_file('ccs-monitor_parameter_sets', parameter_set, json.dumps(parameters))
 
+            self.parameter_set = parameter_set
             self.setup_grid(parameters)
-            # self.set_pool(self.pool_name)
             dialog.destroy()
 
         else:
@@ -784,6 +929,7 @@ class MonitorSetupDialog(Gtk.Dialog):
     def create_slot(self, group=None):
         parameter_list = Gtk.ListStore(str, str)
         treeview = Gtk.TreeView(model=parameter_list)
+        treeview.set_reorderable(True)
 
         treeview.append_column(Gtk.TreeViewColumn("Parameters", Gtk.CellRendererText(), text=0))
         hidden_column = Gtk.TreeViewColumn("ID", Gtk.CellRendererText(), text=1)
@@ -837,6 +983,7 @@ class MonitorSetupDialog(Gtk.Dialog):
         hks = dbres.fetchall()
 
         topleveliters = {}
+        # packets in MIB
         for hk in hks:
 
             if not hk[2] in topleveliters:
@@ -853,13 +1000,33 @@ class MonitorSetupDialog(Gtk.Dialog):
 
             params = dbres.fetchall()
 
-            [parameter_model.append(it, [par[0], str(par[1:])]) for par in params]
+            for par in params:
+                parameter_model.append(it, [par[0], str(['MIB:' + par[1]] + list(par[2:]))])
 
         dbcon.close()
 
+        # UDEF packets
+        udpkts = self.monitor.cfg['ccs-user_defined_packets']
+        self.useriter = parameter_model.append(None, ['UDEF packets', None])
+        for userpacket in udpkts:
+            st, sst, apid, sid = map(cfl.str_to_int, userpacket.split('-'))
+            sidinfo = cfl.get_sid(st, sst, apid)
+            if sidinfo is None:
+                self.logger.error('UDEF packet {} not compatible with SID definitions'.format(userpacket))
+                continue
+            sid_off, sid_bitlen = sidinfo
+            pktdef = json.loads(udpkts[userpacket])
+            pktiter = parameter_model.append(self.useriter, [pktdef[0], None])
+            for userpar in pktdef[1]:
+                name = 'UDEF:{}:{}'.format(userpar[1], userpar[0])
+                parameter_model.append(pktiter, [userpar[1], str([name, None, st, sst, apid, sid, sid_off, sid_bitlen])])
+
+        # user-defined stand-alone ("plot") parameters
         self.useriter = parameter_model.append(None, ['User defined', None])
         for userpar in self.monitor.cfg['ccs-plot_parameters']:
-            parameter_model.append(self.useriter, [userpar, None])
+            name = 'user_defined:{}'.format(userpar)
+            parameter_model.append(self.useriter, [userpar, str([name,
+                                                                 self.monitor.cfg['ccs-plot_parameters'][userpar]])])
 
         return parameter_model
 
@@ -903,22 +1070,17 @@ class MonitorSetupDialog(Gtk.Dialog):
             for slots in param_set:
                 i += 1
                 pnames = {eval(par)[0]: par for par in slots}
-                if len(pnames) > 1:
-                    dbres = dbcon.execute('SELECT pcf.pcf_descr, pcf.pcf_name FROM pcf where pcf.pcf_name in {}'.format(tuple(pnames)))
-                    params = dbres.fetchall()
 
-                elif len(pnames) == 1:
-                    dbres = dbcon.execute('SELECT pcf.pcf_descr, pcf.pcf_name FROM pcf where pcf.pcf_name="{}"'.format(pnames[0]))
-                    params = dbres.fetchall()
-                else:
-                    continue
-
-                for par in params:
-                    self.slots[i][3].append([par[0], pnames[par[1]]])
+                for par in pnames:
+                    try:
+                        self.slots[i][3].append([par.split(':')[1], pnames[par]])
+                    except Exception as err:
+                        self.logger.error('Incompatible parameter {} in set {}'.format(par, entry))
+                        continue
             dbcon.close()
 
         else:
-            self.logger.info('Given Set name could not be found in config File')
+            self.logger.error('Parameter set {} not found'.format(entry))
 
 
 if __name__ == "__main__":
@@ -936,7 +1098,6 @@ if __name__ == "__main__":
             sys.argv.remove(arg)
 
     if len(sys.argv) == 2:
-        win.pool_name = sys.argv[1]
         is_pool = win.set_pool(sys.argv[1])
 
     elif len(sys.argv) >= 3:
@@ -944,14 +1105,15 @@ if __name__ == "__main__":
         if len(sys.argv) > 3:
             win.logger.warning('Too many arguments, ignoring {}'.format(sys.argv[3:]))
 
-        win.pool_name = sys.argv[1]
-        win.parameter_set = sys.argv[2]
-        win.set_parameter_view(win.parameter_set)
-        is_pool = win.set_pool(win.pool_name)
+        win.set_parameter_view(sys.argv[2])
+        is_pool = win.set_pool(sys.argv[1])
 
     elif len(sys.argv) == 1:
         is_pool = win.check_for_pools()
 
+    else:
+        is_pool = 0
+
     if is_pool == 0:
         win.quit_func()
         sys.exit()
diff --git a/Ccs/packet_config_ATHENA.py b/Ccs/packet_config_ATHENA.py
new file mode 100644
index 0000000000000000000000000000000000000000..ac3ba9472baa15124ea7009b4873e825ffefeda0
--- /dev/null
+++ b/Ccs/packet_config_ATHENA.py
@@ -0,0 +1,389 @@
+"""
+PUS & SpW packet header structure definitions and utility functions
+
+PUS-C for ATHENA
+
+Author: Marko Mecina (MM)
+"""
+
+### TBD ###
+import ctypes
+import datetime
+import struct
+import numpy as np
+
+import crcmod
+from s2k_partypes import ptt
+
+
+# ID of the parameter format type defining parameter
+FMT_TYPE_PARAM = ''
+
+# pre/suffixes for TM/TC packets from/to PLMSIM
+# PLM_PKT_PREFIX = b'tc PUS_TC '
+PLM_PKT_PREFIX_TC_SEND = b'tc PUS_TC '
+PLM_PKT_PREFIX_TC = b'TM PUS_TC '
+PLM_PKT_PREFIX_TM = b'TM PUS_TM '
+PLM_PKT_SUFFIX = b'\r\n'
+
+# CRC methods
+puscrc = crcmod.predefined.mkPredefinedCrcFun('crc-ccitt-false')
+rmapcrc = crcmod.mkCrcFun(0x107, rev=True, initCrc=0, xorOut=0)
+PEC_LEN = 2  # in bytes
+RMAP_PEC_LEN = 1
+
+# PUS packet structure definition
+PUS_PKT_VERS_NUM = 0  # 0 for space packets
+PUS_VERSION = 2  # PUS-C = 2
+MAX_PKT_LEN = 1024  # TBD
+
+TMTC = {0: 'TM', 1: 'TC'}
+TSYNC_FLAG = {0: 'U', 1: 'S'}
+
+PRIMARY_HEADER = [
+    ("PKT_VERS_NUM", ctypes.c_uint16, 3),
+    ("PKT_TYPE", ctypes.c_uint16, 1),
+    ("SEC_HEAD_FLAG", ctypes.c_uint16, 1),
+    ("APID", ctypes.c_uint16, 11),
+    ("SEQ_FLAGS", ctypes.c_uint16, 2),
+    ("PKT_SEQ_CNT", ctypes.c_uint16, 14),
+    ("PKT_LEN", ctypes.c_uint16, 16)
+]
+
+TM_SECONDARY_HEADER = [
+    ("PUS_VERSION", ctypes.c_uint8, 4),
+    ("SC_REFTIME", ctypes.c_uint8, 4),
+    ("SERV_TYPE", ctypes.c_uint8, 8),
+    ("SERV_SUB_TYPE", ctypes.c_uint8, 8),
+    ("MSG_TYPE_CNT", ctypes.c_uint16, 16),
+    ("DEST_ID", ctypes.c_uint16, 16),
+    ("CTIME", ctypes.c_uint32, 32),
+    ("FTIME", ctypes.c_uint16, 16),
+    ("TIMESYNC", ctypes.c_uint8, 8)
+]
+
+TC_SECONDARY_HEADER = [
+    ("PUS_VERSION", ctypes.c_uint8, 4),
+    ("ACK", ctypes.c_uint8, 4),
+    ("SERV_TYPE", ctypes.c_uint8, 8),
+    ("SERV_SUB_TYPE", ctypes.c_uint8, 8),
+    ("SOURCE_ID", ctypes.c_uint16, 16)
+]
+
+# [format of time stamp, amount of bytes of time stamp including sync byte(s), fine time resolution, length of extra sync flag in bytes]
+timepack = [ptt(9, 17), 7, 2**16, 1]
+CUC_EPOCH = datetime.datetime(2022, 1, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.utc)
+
+
+def timecal(data, string=False, checkft=False):
+    """
+    This function takes a CUC time bytestring and must return the time as a *str* if *string* is True, or as a float otherwise.
+
+    :param data: CUC time bytestring
+    :param string:
+    :param checkft:
+    :return:
+    """
+    if not isinstance(data, bytes):
+        try:
+            return data[0]
+        except (IndexError, TypeError):
+            return data
+
+    if len(data) == timepack[1]:
+        sync_byte = True
+    elif len(data) == timepack[1] - timepack[3]:
+        sync_byte = False
+    else:
+        raise ValueError('Wrong length of time stamp data ({} bytes)'.format(len(data)))
+
+    data = int.from_bytes(data, 'big')
+
+    if sync_byte:
+        coarse = data >> 24
+        fine = ((data >> 8) & 0xffff) / timepack[2]
+    else:
+        coarse = data >> 16
+        fine = (data & 0xffff) / timepack[2]
+
+    # check for fine time overflow
+    if checkft and (fine > timepack[2]):
+        raise ValueError('Fine time is greater than resolution {} > {}!'.format(fine, timepack[2]))
+
+    if string:
+        if sync_byte:
+            sync = 'S' if (data & 0xff) == 1 else 'U'
+        else:
+            sync = ''
+        return '{:.6f}{}'.format(coarse + fine, sync)
+
+    else:
+        return coarse + fine
+
+
+def calc_timestamp(time, sync=None, return_bytes=False):
+    """
+    This function must return the CUC time as a bytestring if *return_bytes* is *True*, or a tuple of integers for ctime, ftime, and sync otherwise.
+
+    :param time: CUC time as float or str
+    :param sync:
+    :param return_bytes:
+    :return:
+    """
+    if isinstance(time, (float, int)):
+        ctime = int(time)
+        ftime = round(time % 1 * timepack[2])
+        if ftime == timepack[2]:
+            ctime += 1
+            ftime = 0
+
+    elif isinstance(time, str):
+        if time[-1].upper() in ['U', 'S']:
+            t = float(time[:-1])
+        else:
+            t = float(time)
+        ctime = int(t)
+        ftime = round(t % 1 * timepack[2])
+        if ftime == timepack[2]:
+            ctime += 1
+            ftime = 0
+        sync = 1 if time[-1].upper() == 'S' else 0
+
+    elif isinstance(time, bytes):
+        if len(time) not in [timepack[1], timepack[1] - timepack[3]]:
+            raise ValueError(
+                'Bytestring size ({}) does not match length specified in format ({})'.format(len(time), timepack[1]))
+        ctime = int.from_bytes(time[:4], 'big')
+        ftime = int.from_bytes(time[4:7], 'big')
+        if len(time) == timepack[1]:
+            sync = time[-1]
+        else:
+            sync = None
+
+    else:
+        raise TypeError('Unsupported input for time ({})'.format(type(time)))
+
+    if return_bytes:
+        if sync is None or sync is False:
+            return ctime.to_bytes(4, 'big') + ftime.to_bytes(3, 'big')
+        else:
+            return ctime.to_bytes(4, 'big') + ftime.to_bytes(3, 'big') + sync.to_bytes(1, 'big')
+    else:
+        return ctime, ftime, sync
+
+
+class RawGetterSetter:
+
+    @property
+    def raw(self):
+        return bytes(self.bin)
+
+    @raw.setter
+    def raw(self, rawdata):
+        self.bin[:] = rawdata
+
+
+class PHeaderBits(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype, bits) for label, ctype, bits in PRIMARY_HEADER]
+
+
+P_HEADER_LEN = ctypes.sizeof(PHeaderBits)
+
+
+class PHeader(ctypes.Union, RawGetterSetter):
+    _pack_ = 1
+    _fields_ = [
+        ('bits', PHeaderBits),
+        ('bin', ctypes.c_ubyte * P_HEADER_LEN)
+    ]
+
+
+class TMHeaderBits(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype, bits) for label, ctype, bits in PRIMARY_HEADER + TM_SECONDARY_HEADER]
+
+
+TM_HEADER_LEN = ctypes.sizeof(TMHeaderBits)
+
+
+class TMHeader(ctypes.Union, RawGetterSetter):
+    _pack_ = 1
+    _fields_ = [
+        ('bits', TMHeaderBits),
+        ('bin', ctypes.c_ubyte * TM_HEADER_LEN)
+    ]
+
+    def __init__(self):
+        super(TMHeader, self).__init__()
+        self.bits.PKT_VERS_NUM = PUS_PKT_VERS_NUM
+        self.bits.PKT_TYPE = 0
+        self.bits.PUS_VERSION = PUS_VERSION
+
+
+class TCHeaderBits(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype, bits) for label, ctype, bits in PRIMARY_HEADER + TC_SECONDARY_HEADER]
+
+
+TC_HEADER_LEN = ctypes.sizeof(TCHeaderBits)
+
+
+class TCHeader(ctypes.Union, RawGetterSetter):
+    _pack_ = 1
+    _fields_ = [
+        ('bits', TCHeaderBits),
+        ('bin', ctypes.c_ubyte * TC_HEADER_LEN)
+    ]
+
+    def __init__(self, *args, **kw):
+        super(TCHeader, self).__init__(*args, **kw)
+        self.bits.PKT_VERS_NUM = PUS_PKT_VERS_NUM
+        self.bits.PKT_TYPE = 1
+        self.bits.PUS_VERSION = PUS_VERSION
+
+
+CUC_OFFSET = TMHeaderBits.CTIME.offset
+
+SPW_PROTOCOL_IDS = {
+    "RMAP": 0x01,
+    "CCSDS": 0x02
+}
+
+# RMAP packet structure definitions
+
+RMAP_MAX_PKT_LEN = 2 ** 15
+SPW_DPU_LOGICAL_ADDRESS = 0x50
+SPW_FEE_LOGICAL_ADDRESS = 0x51
+SPW_FEE_KEY = 0xD1  # application authorisation key
+
+RMAP_COMMAND_HEADER = [
+    ("TARGET_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("PROTOCOL_ID", ctypes.c_uint32, 8),
+    ("PKT_TYPE", ctypes.c_uint32, 2),
+    ("WRITE", ctypes.c_uint32, 1),
+    ("VERIFY", ctypes.c_uint32, 1),
+    ("REPLY", ctypes.c_uint32, 1),
+    ("INCREMENT", ctypes.c_uint32, 1),
+    ("REPLY_ADDR_LEN", ctypes.c_uint32, 2),
+    ("KEY", ctypes.c_uint32, 8),
+    ("INIT_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("TRANSACTION_ID", ctypes.c_uint32, 16),
+    ("EXT_ADDR", ctypes.c_uint32, 8),
+    ("ADDR", ctypes.c_uint32, 32),
+    ("DATA_LEN", ctypes.c_uint32, 24),
+    ("HEADER_CRC", ctypes.c_uint32, 8)
+]
+
+RMAP_REPLY_WRITE_HEADER = [
+    ("INIT_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("PROTOCOL_ID", ctypes.c_uint32, 8),
+    ("PKT_TYPE", ctypes.c_uint32, 2),
+    ("WRITE", ctypes.c_uint32, 1),
+    ("VERIFY", ctypes.c_uint32, 1),
+    ("REPLY", ctypes.c_uint32, 1),
+    ("INCREMENT", ctypes.c_uint32, 1),
+    ("REPLY_ADDR_LEN", ctypes.c_uint32, 2),
+    ("STATUS", ctypes.c_uint32, 8),
+    ("TARGET_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("TRANSACTION_ID", ctypes.c_uint32, 16),
+    ("HEADER_CRC", ctypes.c_uint32, 8)
+]
+
+RMAP_REPLY_READ_HEADER = [
+    ("INIT_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("PROTOCOL_ID", ctypes.c_uint32, 8),
+    ("PKT_TYPE", ctypes.c_uint32, 2),
+    ("WRITE", ctypes.c_uint32, 1),
+    ("VERIFY", ctypes.c_uint32, 1),
+    ("REPLY", ctypes.c_uint32, 1),
+    ("INCREMENT", ctypes.c_uint32, 1),
+    ("REPLY_ADDR_LEN", ctypes.c_uint32, 2),
+    ("STATUS", ctypes.c_uint32, 8),
+    ("TARGET_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("TRANSACTION_ID", ctypes.c_uint32, 16),
+    ("RESERVED", ctypes.c_uint32, 8),
+    ("DATA_LEN", ctypes.c_uint32, 24),
+    ("HEADER_CRC", ctypes.c_uint32, 8)
+]
+
+
+class RMapCommandHeaderBits(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype, bits) for label, ctype, bits in RMAP_COMMAND_HEADER]
+
+
+RMAP_COMMAND_HEADER_LEN = ctypes.sizeof(RMapCommandHeaderBits)  # sum([x[2] for x in RMAP_COMMAND_HEADER]) // 8
+
+
+class RMapCommandHeader(ctypes.Union, RawGetterSetter):
+    _pack_ = 1
+    _fields_ = [
+        ('bits', RMapCommandHeaderBits),
+        ('bin', ctypes.c_ubyte * RMAP_COMMAND_HEADER_LEN)
+    ]
+
+    def __init__(self, *args, **kw):
+        super(RMapCommandHeader, self).__init__(*args, **kw)
+        self.bits.PROTOCOL_ID = SPW_PROTOCOL_IDS["RMAP"]
+        self.bits.PKT_TYPE = 1
+
+
+class RMapReplyWriteHeaderBits(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype, bits) for label, ctype, bits in RMAP_REPLY_WRITE_HEADER]
+
+
+RMAP_REPLY_WRITE_HEADER_LEN = ctypes.sizeof(
+    RMapReplyWriteHeaderBits)  # sum([x[2] for x in RMAP_REPLY_WRITE_HEADER]) // 8
+
+
+class RMapReplyWriteHeader(ctypes.Union, RawGetterSetter):
+    _pack_ = 1
+    _fields_ = [
+        ('bits', RMapReplyWriteHeaderBits),
+        ('bin', ctypes.c_ubyte * RMAP_REPLY_WRITE_HEADER_LEN)
+    ]
+
+    def __init__(self, *args, **kw):
+        super(RMapReplyWriteHeader, self).__init__(*args, **kw)
+        self.bits.PROTOCOL_ID = SPW_PROTOCOL_IDS["RMAP"]
+        self.bits.PKT_TYPE = 0
+        self.bits.WRITE = 1
+        self.bits.REPLY = 1
+
+
+class RMapReplyReadHeaderBits(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype, bits) for label, ctype, bits in RMAP_REPLY_READ_HEADER]
+
+
+RMAP_REPLY_READ_HEADER_LEN = ctypes.sizeof(RMapReplyReadHeaderBits)  # sum([x[2] for x in RMAP_REPLY_READ_HEADER]) // 8
+
+
+class RMapReplyReadHeader(ctypes.Union, RawGetterSetter):
+    _pack_ = 1
+    _fields_ = [
+        ('bits', RMapReplyReadHeaderBits),
+        ('bin', ctypes.c_ubyte * RMAP_REPLY_READ_HEADER_LEN)
+    ]
+
+    def __init__(self, *args, **kw):
+        super(RMapReplyReadHeader, self).__init__(*args, **kw)
+        self.bits.PROTOCOL_ID = SPW_PROTOCOL_IDS["RMAP"]
+        self.bits.PKT_TYPE = 0
+        self.bits.WRITE = 0
+        self.bits.VERIFY = 0
+        self.bits.REPLY = 1
+
+
+# S13 data header format, using python struct conventions
+S13_FMT_OBSID = 'I'
+S13_FMT_TIME = 'I'
+S13_FMT_FTIME = 'H'
+S13_FMT_COUNTER = 'H'
+_S13_HEADER_FMT = S13_FMT_OBSID + S13_FMT_TIME + S13_FMT_FTIME + S13_FMT_COUNTER
+
+
+def s13_unpack_data_header(buf):
+    return struct.unpack('>' + _S13_HEADER_FMT, buf[:struct.calcsize(_S13_HEADER_FMT)])
diff --git a/Ccs/packet_config_ATHENA_DE.py b/Ccs/packet_config_ATHENA_DE.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e659830b8801d3eaef8802db3d992aadf05f244
--- /dev/null
+++ b/Ccs/packet_config_ATHENA_DE.py
@@ -0,0 +1,602 @@
+"""
+Utility functions for communication with ATHENA detector electronics
+
+Ref.: WFI_IAAT_ICD_141210_0001
+      WFI_FP_DesignReport_draft_04Aug21
+
+Author: Marko Mecina (UVIE)
+"""
+
+import ctypes
+from packet_config_ATHENA import RawGetterSetter
+
+
+class EppStates:
+    """
+    EPP FSM states
+    """
+    INIT = 0xFF00
+    STANDBY = 0xFFF0
+    PROGRAM = 0xFF80
+    OGEN = 0xFF8A
+    NGEN = 0xFF8B
+    DIAG_OGEN = 0xFFFA
+    DIAG_NGEN = 0xFFFB
+    DIAG = 0xFFFC
+    WORK = 0xFFFF
+
+
+# dict of states
+EPP_STATES = {k: EppStates.__dict__[k] for k in EppStates.__dict__ if not k.startswith('_')}
+
+
+class IfAddr:
+    """
+    FP interface addresses
+    """
+    HK = 0x33
+    CMD = 0x34
+    SCI = 0x35
+    ECHO = 0x20
+
+
+IF_ADDR = {k: IfAddr.__dict__[k] for k in IfAddr.__dict__ if not k.startswith('_')}
+
+
+class CmdDir:
+    """
+    Write/request ID
+    """
+    SEND = 0x4182
+    RECV = 0xC003
+
+
+# HK & command interface
+
+STRUCT_CMD_PKT = [
+    ("ifaddr", ctypes.c_uint8),
+    ("addr", ctypes.c_uint16),
+    ("txrx", ctypes.c_uint16),
+    ("cmddata", ctypes.c_uint16)
+]
+
+
+class CommandBaseStruct(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype) for label, ctype in STRUCT_CMD_PKT]
+
+    def __init__(self):
+        super(CommandBaseStruct).__init__()
+
+
+CMD_LEN = ctypes.sizeof(CommandBaseStruct)
+ACK_LEN = 3
+SCI_CMD_LEN = 2
+
+
+class CommandBase(ctypes.Union, RawGetterSetter):
+    """
+    Base class for command packets
+    """
+    _pack_ = 1
+    _fields_ = [
+        ('items', CommandBaseStruct),
+        ('bin', ctypes.c_ubyte * CMD_LEN)
+    ]
+
+
+class HkCmdSend(CommandBase):
+
+    def __init__(self, addr, data):
+        super(HkCmdSend).__init__()
+        self.items.ifaddr = IfAddr.HK
+        self.items.addr = addr
+        self.items.txrx = CmdDir.SEND
+        self.items.cmddata = data
+
+
+class HkCmdRecv(CommandBase):
+
+    def __init__(self, addr):
+        super(HkCmdRecv).__init__()
+        self.items.ifaddr = IfAddr.HK
+        self.items.addr = addr
+        self.items.txrx = CmdDir.RECV
+        self.items.cmddata = 0
+
+
+class CmdSend(CommandBase):
+
+    def __init__(self, addr, data):
+        super(CmdSend).__init__()
+        self.items.ifaddr = IfAddr.CMD
+        self.items.addr = addr
+        self.items.txrx = CmdDir.SEND
+        self.items.cmddata = data
+
+
+class CmdRecv(CommandBase):
+
+    def __init__(self, addr):
+        super(CmdRecv).__init__()
+        self.items.ifaddr = IfAddr.CMD
+        self.items.addr = addr
+        self.items.txrx = CmdDir.RECV
+        self.items.cmddata = 0
+
+
+class Ack:
+
+    def __init__(self, raw=bytes(ACK_LEN)):
+        self._raw = raw
+        # self._val = int.from_bytes(raw, 'big')
+
+    def __str__(self):
+        return self._raw.hex().upper()
+
+    @property
+    def ifaddr(self):
+        return self._raw[0]
+
+    @ifaddr.setter
+    def ifaddr(self, addr):
+        self._raw = addr.to_bytes(1, 'big') + self._raw[1:]
+
+    @property
+    def data(self):
+        return self._raw[1:]
+        # return self._val & 0xFFFF
+
+    @data.setter
+    def data(self, d):
+        self._raw = self._raw[:1] + d[:2]
+
+
+class HkPkt:
+
+    def __init__(self, raw):
+        self._raw = raw
+
+    @property
+    def ifaddr(self):
+        return self._raw[0]
+
+
+# Science interface
+EVT_PKT_ELEMENT_LEN = 6  # length of event packet element (timestamp, header, pixel, footer) in bytes
+STRUCT_EVT_PIX = {  # name, bitsize, bitoffset (LSB)
+    "FRAME_N": (8, 40),
+    "ENERGY": (14, 26),
+    "LINE_N": (9, 17),
+    "PIXEL_N": (9, 8),
+    "PFLAGS": (8, 0)
+}
+
+
+class PixProcFlags:
+    """
+    Flags indicating processing steps
+    """
+    PT = 0b10000000
+    T2 = 0b01000000
+    T1 = 0b00100000
+    BM = 0b00010000
+    LT = 0b00001000
+    UT = 0b00000100
+    HP = 0b00000010
+    DP = 0b00000001
+
+
+STRUCT_EVT_HEADER = {
+    "FRAME_N": (8, 40),
+    "HEADER": (32, 8),
+    "INDICTR": (8, 0)
+}
+
+STRUCT_EVT_TIMESTAMP = {
+    "FRAME_N": (8, 40),
+    "SPARE": (2, 38),
+    "SEC": (24, 14),
+    "SUBSEC": (14, 0)
+}
+
+# TBD
+STRUCT_EVT_FOOTER = {}
+
+
+class EvtPktBase:
+    """
+    Base class for event packet elements
+    """
+
+    def __init__(self, byt):
+        assert len(byt) == EVT_PKT_ELEMENT_LEN
+        self._raw = byt
+        self._val = int.from_bytes(byt, 'big')
+
+    @property
+    def raw(self):
+        return self._raw
+
+    @property
+    def frame_n(self):
+        return _shift_mask(self._val, STRUCT_EVT_PIX["FRAME_N"])
+
+
+class EvtPix(EvtPktBase):
+    """
+    Event Pixel element
+    """
+
+    def __init__(self, raw):
+        super(EvtPix, self).__init__(raw)
+
+    @property
+    def energy(self):
+        return _shift_mask(self._val, STRUCT_EVT_PIX["ENERGY"])
+
+    @property
+    def line_n(self):
+        return _shift_mask(self._val, STRUCT_EVT_PIX["LINE_N"])
+
+    @property
+    def pixel_n(self):
+        return _shift_mask(self._val, STRUCT_EVT_PIX["PIXEL_N"])
+
+    @property
+    def pflags(self):
+        return _shift_mask(self._val, STRUCT_EVT_PIX["PFLAGS"])
+
+    @property
+    def pflags_PT(self):
+        return (_shift_mask(self._val, STRUCT_EVT_PIX["PFLAGS"]) & PixProcFlags.PT) >> 7
+
+    @property
+    def pflags_T2(self):
+        return (_shift_mask(self._val, STRUCT_EVT_PIX["PFLAGS"]) & PixProcFlags.T2) >> 6
+
+    @property
+    def pflags_T1(self):
+        return (_shift_mask(self._val, STRUCT_EVT_PIX["PFLAGS"]) & PixProcFlags.T1) >> 5
+
+    @property
+    def pflags_BM(self):
+        return (_shift_mask(self._val, STRUCT_EVT_PIX["PFLAGS"]) & PixProcFlags.BM) >> 4
+
+    @property
+    def pflags_LT(self):
+        return (_shift_mask(self._val, STRUCT_EVT_PIX["PFLAGS"]) & PixProcFlags.LT) >> 3
+
+    @property
+    def pflags_UT(self):
+        return (_shift_mask(self._val, STRUCT_EVT_PIX["PFLAGS"]) & PixProcFlags.UT) >> 2
+
+    @property
+    def pflags_HP(self):
+        return (_shift_mask(self._val, STRUCT_EVT_PIX["PFLAGS"]) & PixProcFlags.HP) >> 1
+
+    @property
+    def pflags_DP(self):
+        return _shift_mask(self._val, STRUCT_EVT_PIX["PFLAGS"]) & PixProcFlags.DP
+
+
+class EvtHeader(EvtPktBase):
+    """
+    *EventPacket* header
+    """
+
+    def __init__(self, raw):
+        super(EvtHeader, self).__init__(raw)
+
+    @property
+    def header(self):
+        return _shift_mask(self._val, STRUCT_EVT_HEADER["HEADER"])
+
+    @property
+    def header_indicator(self):
+        return _shift_mask(self._val, STRUCT_EVT_HEADER["INDICTR"])
+
+
+class EvtFooter(EvtPktBase):
+    """
+    *EventPacket* footer
+    """
+
+    def __init__(self, raw):
+        super(EvtFooter, self).__init__(raw)
+
+    @property
+    def foo(self):
+        return
+
+
+class EvtTimestamp(EvtPktBase):
+    """
+    *EventPacket* time stamp structure
+    """
+
+    def __init__(self, raw):
+        super(EvtTimestamp, self).__init__(raw)
+
+    @property
+    def spare(self):
+        return _shift_mask(self._val, STRUCT_EVT_TIMESTAMP["SPARE"])
+
+    @property
+    def seconds(self):
+        return _shift_mask(self._val, STRUCT_EVT_TIMESTAMP["SEC"])
+
+    @property
+    def subseconds(self):
+        return _shift_mask(self._val, STRUCT_EVT_TIMESTAMP["SUBSEC"])
+
+
+def _shift_mask(x, bs_os):
+    """
+    Shift and mask packet element to obtain parameter value.
+    
+    :param x: integer value of entire packet element (6 bytes)
+    :type x: int 
+    :param bs_os: size and offset (from LSB) of parameter in bits
+    :type bs_os: tuple
+    :return: 
+    """
+    return (x >> bs_os[1]) & (2 ** bs_os[0] - 1)
+
+
+class EventPacket:
+    """
+    FP science event packet
+    """
+
+    def __init__(self, raw, process=True):
+        self._raw = raw
+        self._len = len(raw)
+        self.pixels_list_proc = None
+
+        self.timestamp = EvtTimestamp(raw[:EVT_PKT_ELEMENT_LEN])
+        self.header = EvtHeader(raw[EVT_PKT_ELEMENT_LEN:2 * EVT_PKT_ELEMENT_LEN])
+        # self._pixels_block = raw[2 * EVT_PKT_ELEMENT_LEN:-EVT_PKT_ELEMENT_LEN]  # if footer is present
+        self._pixels_block = raw[2 * EVT_PKT_ELEMENT_LEN:]
+        self.pixels_list = [self._pixels_block[i:i + EVT_PKT_ELEMENT_LEN] for i in
+                            range(0, len(self._pixels_block), EVT_PKT_ELEMENT_LEN)]
+        # self.footer = EvtFooter(raw[-EVT_PKT_ELEMENT_LEN:])
+
+        if process:
+            self._process_pixels()
+
+    def _process_pixels(self):
+        self.pixels_list_proc = [EvtPix(pix) for pix in self.pixels_list]
+
+
+# delay = 0xXX * sys_clk period
+SCI_DELAY_CONT = 0x00  # continuous transmission
+SCI_DELAY_NOTX = 0xFF  # no transmission
+
+
+class SciCmd:
+
+    def __init__(self, delay):
+        assert 0 <= delay < 256
+        self._raw = ((IfAddr.SCI << 8) + delay).to_bytes(SCI_CMD_LEN, 'big')
+
+    @property
+    def raw(self):
+        return self._raw
+
+    @raw.setter
+    def raw(self, rawdata):
+        self._raw = rawdata
+
+    @property
+    def ifaddr(self):
+        return self._raw[0]
+
+    @property
+    def delay(self):
+        return self._raw[1]
+
+
+def read_de_pkt(pkt, process=True):
+
+    assert isinstance(pkt, (bytes, bytearray))
+
+    p = None
+
+    if pkt[0] == IfAddr.HK:
+        if len(pkt) == ACK_LEN:
+            p = Ack(pkt)
+        elif len(pkt) == CMD_LEN:
+            p = CommandBase(pkt)
+        else:
+            p = HkPkt(pkt)
+    elif pkt[0] == IfAddr.CMD:
+        if len(pkt) == ACK_LEN:
+            p = Ack(pkt)
+        elif len(pkt) == CMD_LEN:
+            p = CommandBase(pkt)
+    elif pkt[0] == IfAddr.SCI and len(pkt) == SCI_CMD_LEN:
+        p = SciCmd(pkt)
+    elif pkt[0] == IfAddr.ECHO:
+        p = pkt
+    elif pkt[0] == IfAddr.SCI and len(pkt[1:]) % EVT_PKT_ELEMENT_LEN == 0:
+        p = EventPacket(pkt[1:], process=process)
+
+    if p is None:
+        raise NotImplementedError('Unknown interface ID {}'.format(pkt[0]))
+
+    return p
+
+
+def split_de_dump(data, de_pkt_size):
+
+    assert isinstance(data, bytes)
+
+    return [data[i:i+de_pkt_size] for i in range(0, len(data), de_pkt_size)]
+
+
+# PCM Registers [TBC]
+PCM_MODE = (0x0000, False, 0x0000)
+PCM_CMD = (0x0000, False, 0x0000)
+PCM_SERIAL_NO = (0x0000, False, 0x0000)
+PCM_HW_VERSION = (0x0000, False, 0x0000)
+PCM_SW_VERSION = (0x0000, False, 0x0000)
+PCM_STATUS = (0x0000, False, 0x0000)
+PCM_PWR_STATUS = (0x0000, False, 0x0000)
+PCM_V_SET_SWA_VSUB = (0x0000, False, 0x0000)
+PCM_V_SET_SWA_A_HI = (0x0000, False, 0x0000)
+PCM_V_SET_SWA_A_LO = (0x0000, False, 0x0000)
+PCM_V_SET_SWA_B_HI = (0x0000, False, 0x0000)
+PCM_V_SET_SWA_B_LO = (0x0000, False, 0x0000)
+PCM_V_SET_SWA_C_HI = (0x0000, False, 0x0000)
+PCM_V_SET_SWA_C_LO = (0x0000, False, 0x0000)
+PCM_V_SET_VRS_VREF = (0x0000, False, 0x0000)
+PCM_V_SET_VRS_VSSS = (0x0000, False, 0x0000)
+PCM_V_SET_VRS_NGATE_SF = (0x0000, False, 0x0000)
+PCM_V_SET_VRS_PGATE_SF = (0x0000, False, 0x0000)
+PCM_V_SET_DFT_DS = (0x0000, False, 0x0000)
+PCM_V_SET_DFT_IS = (0x0000, False, 0x0000)
+PCM_V_SET_DFT_OS = (0x0000, False, 0x0000)
+PCM_V_SET_DFT_R1 = (0x0000, False, 0x0000)
+PCM_V_SET_DFT_R2 = (0x0000, False, 0x0000)
+PCM_V_SET_DFT_BC = (0x0000, False, 0x0000)
+PCM_V_SET_DFT_BC_IGR = (0x0000, False, 0x0000)
+PCM_V_SET_DFT_TEMP_P = (0x0000, False, 0x0000)
+
+# HK Registers [TBC]
+HK_PCM_TEMPERATURE = (0x0000, False, 0x0000)
+HK_V_ACT_PCM_P5V = (0x0000, False, 0x0000)
+HK_I_ACT_PCM_P5V = (0x0000, False, 0x0000)
+HK_V_ACT_PCM_N5V = (0x0000, False, 0x0000)
+HK_I_ACT_PCM_N5V = (0x0000, False, 0x0000)
+HK_V_ACT_SWA_DVDD = (0x0000, False, 0x0000)
+HK_I_ACT_SWA_DVDD = (0x0000, False, 0x0000)
+HK_V_ACT_SWA_VSUB = (0x0000, False, 0x0000)
+HK_I_ACT_SWA_VSUB = (0x0000, False, 0x0000)
+HK_V_ACT_SWA_A_HI = (0x0000, False, 0x0000)
+HK_I_ACT_SWA_A_HI = (0x0000, False, 0x0000)
+HK_V_ACT_SWA_A_LO = (0x0000, False, 0x0000)
+HK_I_ACT_SWA_A_LO = (0x0000, False, 0x0000)
+HK_V_ACT_SWA_B_HI = (0x0000, False, 0x0000)
+HK_I_ACT_SWA_B_HI = (0x0000, False, 0x0000)
+HK_V_ACT_SWA_B_LO = (0x0000, False, 0x0000)
+HK_I_ACT_SWA_B_LO = (0x0000, False, 0x0000)
+HK_V_ACT_SWA_C_HI = (0x0000, False, 0x0000)
+HK_I_ACT_SWA_C_HI = (0x0000, False, 0x0000)
+HK_V_ACT_SWA_C_LO = (0x0000, False, 0x0000)
+HK_I_ACT_SWA_C_LO = (0x0000, False, 0x0000)
+HK_V_ACT_VRS_AVDD = (0x0000, False, 0x0000)
+HK_I_ACT_VRS_AVDD = (0x0000, False, 0x0000)
+HK_V_ACT_VRS_AVSS = (0x0000, False, 0x0000)
+HK_I_ACT_VRS_AVSS = (0x0000, False, 0x0000)
+HK_V_ACT_VRS_DVDD = (0x0000, False, 0x0000)
+HK_I_ACT_VRS_DVDD = (0x0000, False, 0x0000)
+HK_V_ACT_VRS_DVSS = (0x0000, False, 0x0000)
+HK_I_ACT_VRS_DVSS = (0x0000, False, 0x0000)
+HK_V_ACT_VRS_TVDD = (0x0000, False, 0x0000)
+HK_I_ACT_VRS_TVDD = (0x0000, False, 0x0000)
+HK_V_ACT_VRS_TVSS = (0x0000, False, 0x0000)
+HK_I_ACT_VRS_TVSS = (0x0000, False, 0x0000)
+HK_V_ACT_VRS_VREF = (0x0000, False, 0x0000)
+HK_I_ACT_VRS_VREF = (0x0000, False, 0x0000)
+HK_V_ACT_VRS_VSSS = (0x0000, False, 0x0000)
+HK_I_ACT_VRS_VSSS = (0x0000, False, 0x0000)
+HK_V_ACT_VRS_NGATE_SF = (0x0000, False, 0x0000)
+HK_I_ACT_VRS_NGATE_SF = (0x0000, False, 0x0000)
+HK_V_ACT_VRS_PGATE_SF = (0x0000, False, 0x0000)
+HK_I_ACT_VRS_PGATE_SF = (0x0000, False, 0x0000)
+HK_V_ACT_DFT_DS = (0x0000, False, 0x0000)
+HK_I_ACT_DFT_DS = (0x0000, False, 0x0000)
+HK_V_ACT_DFT_IS = (0x0000, False, 0x0000)
+HK_I_ACT_DFT_IS = (0x0000, False, 0x0000)
+HK_V_ACT_DFT_OS = (0x0000, False, 0x0000)
+HK_I_ACT_DFT_OS = (0x0000, False, 0x0000)
+HK_V_ACT_DFT_R1 = (0x0000, False, 0x0000)
+# HK_V_ACT_DFT_R1 = (0x0000, False, 0x0000)
+HK_I_ACT_DFT_R1 = (0x0000, False, 0x0000)
+HK_V_ACT_DFT_R2 = (0x0000, False, 0x0000)
+HK_I_ACT_DFT_R2 = (0x0000, False, 0x0000)
+HK_V_ACT_DFT_BC = (0x0000, False, 0x0000)
+HK_I_ACT_DFT_BC = (0x0000, False, 0x0000)
+HK_V_ACT_DFT_BC_IGR = (0x0000, False, 0x0000)
+HK_I_ACT_DFT_BC_IGR = (0x0000, False, 0x0000)
+HK_V_ACT_DFT_TEMP_GUARD = (0x0000, False, 0x0000)
+HK_I_ACT_DFT_TEMP_GUARD = (0x0000, False, 0x0000)
+HK_V_ACT_DFT_TEMP_P = (0x0000, False, 0x0000)
+
+# Sequencer Registers [TBC]
+SEQ_VER_SPI_MEM = (0x0000, False, 0x0000)
+SEQ_INIT_LEN = (0x0000, False, 0x0000)
+SEQ_INIT_PATCH_LEN = (0x0000, False, 0x0000)
+SEQ_LINE_LEN = (0x0000, False, 0x0000)
+SEQ_LINE_PATCH_LEN = (0x0000, False, 0x0000)
+SEQ_CMD_ACK = (0x0000, False, 0x0000)
+SEQ_MODE = (0x0000, False, 0x0000)
+SEQ_CMD = (0x0000, False, 0x0000)
+SEQ_STARTLINE = (0x0000, False, 0x0000)
+SEQ_STOPLINE = (0x0000, False, 0x0000)
+SEQ_ERROR_CODE = (0x0000, False, 0x0000)
+SEQ_PMEM_A = (0x0000, False, 0x0000)
+SEQ_PMEM_B = (0x0000, False, 0x0000)
+SEQ_LMEM = (0x0000, False, 0x0000)
+
+# EPP registers [TBC]
+EPP_UPPER_THRHLD = (0x0000, False, 0x0000)
+EPP_LOWER_THRHLD = (0x0000, False, 0x0000)
+EPP_PFU_MASK = (0x0000, False, 0x0000)
+EPP_MODE = (0x0000, False, 0x0000)
+EPP_DIAG_RATIO = (0x0000, False, 0x0000)
+EPP_SELECT = (0x0000, False, 0x0000)
+EPP_PFU_SWITCH = (0x0000, False, 0x0000)
+EPP_MLT = (0x0000, False, 0x0000)
+EPP_MHT = (0x0000, False, 0x0000)
+EPP_LTP_SIGMA1 = (0x0000, False, 0x0000)
+EPP_LTP_SIGMA2 = (0x0000, False, 0x0000)
+EPP_PCU_OFFSET_ADDR = (0x0000, False, 0x0000)
+EPP_EFU_OFFSET_ADDR = (0x0000, False, 0x0000)
+EPP_SLICE_SELECT = (0x0000, False, 0x0000)
+EPP_STARTLINE = (0x0000, False, 0x0000)
+EPP_STOPPLINE = (0x0000, False, 0x0000)
+EPP_CTCU_R1 = (0x0000, False, 0x0000)
+EPP_CTCU_R2 = (0x0000, False, 0x0000)
+EPP_CMD = (0x0000, False, 0x0000)
+EPP_PFU_BYPASS = (0x0000, False, 0x0000)
+MSD_TAB_DELAY = (0x0000, False, 0x0000)
+MSD_SPW_DIV = (0x0000, False, 0x0000)
+MSD_SPW_PKG_SIZE = (0x0000, False, 0x0000)
+MSD_ETH_PWR_ADDR_ = (0x0000, False, 0x0000)
+MSD_ETH_BURST_SIZE_ = (0x0000, False, 0x0000)
+MSD_ETH_SELECT_SLICE_ = (0x0000, False, 0x0000)
+MSD_ETH_SELECT_MODULE_ = (0x0000, False, 0x0000)
+MSD_ETH_MAC_SOURCE_0_ = (0x0000, False, 0x0000)
+MSD_ETH_MAC_SOURCE_1_ = (0x0000, False, 0x0000)
+MSD_ETH_MAC_SOURCE_2_ = (0x0000, False, 0x0000)
+MSD_ETH_MAC_DESTIN_0_ = (0x0000, False, 0x0000)
+MSD_ETH_MAC_DESTIN_1_ = (0x0000, False, 0x0000)
+MSD_ETH_MAC_DESTIN_2_ = (0x0000, False, 0x0000)
+MSD_ETH_IP_SOURCE_0_ = (0x0000, False, 0x0000)
+MSD_ETH_IP_SOURCE_1_ = (0x0000, False, 0x0000)
+MSD_ETH_IP_DESTIN_0_ = (0x0000, False, 0x0000)
+MSD_ETH_IP_DESTIN_1_ = (0x0000, False, 0x0000)
+MSD_ETH_UDP_SOURCE_ = (0x0000, False, 0x0000)
+MSD_ETH_UDP_DESTIN_ = (0x0000, False, 0x0000)
+
+# EPP SUB-registers [TBC]
+SRAM_FIFO3_SLICE0 = (0x0000, False, 0x0000)
+SRAM_FIFO3_SLICE1 = (0x0000, False, 0x0000)
+SRAM_FIFO3_SLICE2 = (0x0000, False, 0x0000)
+SRAM_FIFO3_SLICE3 = (0x0000, False, 0x0000)
+SRAM_FIFO3_SLICE4 = (0x0000, False, 0x0000)
+SRAM_FIFO3_SLICE5 = (0x0000, False, 0x0000)
+SRAM_FIFO3_SLICE6 = (0x0000, False, 0x0000)
+SRAM_FIFO3_SLICE7 = (0x0000, False, 0x0000)
+SRAM_FIFO2_SLICE0 = (0x0000, False, 0x0000)
+SRAM_FIFO2_SLICE1 = (0x0000, False, 0x0000)
+SRAM_FIFO2_SLICE2 = (0x0000, False, 0x0000)
+SRAM_FIFO2_SLICE3 = (0x0000, False, 0x0000)
+SRAM_FIFO2_SLICE4 = (0x0000, False, 0x0000)
+SRAM_FIFO2_SLICE5 = (0x0000, False, 0x0000)
+SRAM_FIFO2_SLICE6 = (0x0000, False, 0x0000)
+SRAM_FIFO2_SLICE7 = (0x0000, False, 0x0000)
+DIAG_GOOD_RAM = (0x0000, False, 0x0000)
+DIAG_BAD_RAM = (0x0000, False, 0x0000)
diff --git a/Ccs/packet_config_CHEOPS.py b/Ccs/packet_config_CHEOPS.py
index f5388d9668dc7e3424e44e7fa6685eeb9016fc54..d7268ae0abf297dc299c04cdf670d4405733af6f 100644
--- a/Ccs/packet_config_CHEOPS.py
+++ b/Ccs/packet_config_CHEOPS.py
@@ -8,6 +8,8 @@ Author: Marko Mecina (MM)
 
 import ctypes
 import datetime
+import struct
+
 from s2k_partypes import ptt
 import crcmod
 
@@ -28,9 +30,15 @@ rmapcrc = crcmod.mkCrcFun(0x107, rev=True, initCrc=0, xorOut=0)
 PEC_LEN = 2  # in bytes
 RMAP_PEC_LEN = 1
 
+# PUS packet structure definition
+
+PUS_PKT_VERS_NUM = 0  # 0 for space packets
 PUS_VERSION = 1
 MAX_PKT_LEN = 1024  # bytes
 
+TMTC = {0: 'TM', 1: 'TC'}
+TSYNC_FLAG = {0: 'U', 1: 'S', 5: 'S'}
+
 PRIMARY_HEADER = [
     ("PKT_VERS_NUM", ctypes.c_uint16, 3),
     ("PKT_TYPE", ctypes.c_uint16, 1),
@@ -126,6 +134,16 @@ def calc_timestamp(time, sync=0, return_bytes=False):
 # TM_HEADER_LEN = sum([x[2] for x in PRIMARY_HEADER + TM_SECONDARY_HEADER]) // 8
 # TC_HEADER_LEN = sum([x[2] for x in PRIMARY_HEADER + TC_SECONDARY_HEADER]) // 8
 
+class RawGetterSetter:
+
+    @property
+    def raw(self):
+        return bytes(self.bin)
+
+    @raw.setter
+    def raw(self, rawdata):
+        self.bin[:] = rawdata
+
 
 class PHeaderBits(ctypes.BigEndianStructure):
     _pack_ = 1
@@ -135,7 +153,7 @@ class PHeaderBits(ctypes.BigEndianStructure):
 P_HEADER_LEN = ctypes.sizeof(PHeaderBits)
 
 
-class PHeader(ctypes.Union):
+class PHeader(ctypes.Union, RawGetterSetter):
     _pack_ = 1
     _fields_ = [
         ('bits', PHeaderBits),
@@ -151,13 +169,19 @@ class TMHeaderBits(ctypes.BigEndianStructure):
 TM_HEADER_LEN = ctypes.sizeof(TMHeaderBits)
 
 
-class TMHeader(ctypes.Union):
+class TMHeader(ctypes.Union, RawGetterSetter):
     _pack_ = 1
     _fields_ = [
         ('bits', TMHeaderBits),
         ('bin', ctypes.c_ubyte * TM_HEADER_LEN)
     ]
 
+    def __init__(self):
+        super(TMHeader, self).__init__()
+        self.bits.PKT_VERS_NUM = PUS_PKT_VERS_NUM
+        self.bits.PKT_TYPE = 0
+        self.bits.PUS_VERSION = PUS_VERSION
+
 
 class TCHeaderBits(ctypes.BigEndianStructure):
     _pack_ = 1
@@ -167,13 +191,19 @@ class TCHeaderBits(ctypes.BigEndianStructure):
 TC_HEADER_LEN = ctypes.sizeof(TCHeaderBits)
 
 
-class TCHeader(ctypes.Union):
+class TCHeader(ctypes.Union, RawGetterSetter):
     _pack_ = 1
     _fields_ = [
         ('bits', TCHeaderBits),
         ('bin', ctypes.c_ubyte * TC_HEADER_LEN)
     ]
 
+    def __init__(self, *args, **kw):
+        super(TCHeader, self).__init__(*args, **kw)
+        self.bits.PKT_VERS_NUM = PUS_PKT_VERS_NUM
+        self.bits.PKT_TYPE = 1
+        self.bits.PUS_VERSION = PUS_VERSION
+
 
 CUC_OFFSET = TMHeaderBits.CTIME.offset
 
@@ -183,18 +213,6 @@ SPW_PROTOCOL_IDS = {
     "CCSDS": 0x02
 }
 
-
-class RawGetterSetter:
-
-    @property
-    def raw(self):
-        return bytes(self.bin)
-
-    @raw.setter
-    def raw(self, rawdata):
-        self.bin[:] = rawdata
-
-
 # RMAP packet structure definitions
 
 RMAP_MAX_PKT_LEN = 2 ** 15
@@ -271,13 +289,19 @@ FEEDATA_TRANSFER_HEADER = [
 
 
 class RMapCommandHeaderBits(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype, bits) for label, ctype, bits in RMAP_COMMAND_HEADER]
 
     def __init__(self):
         raise NotImplementedError('Not available in project CHEOPS')
 
 
+RMAP_COMMAND_HEADER_LEN = ctypes.sizeof(RMapCommandHeaderBits)  # sum([x[2] for x in RMAP_COMMAND_HEADER]) // 8
+
+
 class RMapCommandHeader(ctypes.Union, RawGetterSetter):
 
+
     def __init__(self):
         raise NotImplementedError('Not available in project CHEOPS')
 
@@ -357,3 +381,15 @@ class EventDetectionData(ctypes.Union):
 
     def __init__(self):
         raise NotImplementedError('Not available in project CHEOPS')
+
+
+# S13 data header format, using python struct conventions
+S13_FMT_OBSID = 'I'
+S13_FMT_TIME = 'I'
+S13_FMT_FTIME = 'H'
+S13_FMT_COUNTER = 'H'
+_S13_HEADER_FMT = S13_FMT_OBSID + S13_FMT_TIME + S13_FMT_FTIME + S13_FMT_COUNTER
+
+
+def s13_unpack_data_header(buf):
+    return struct.unpack('>' + _S13_HEADER_FMT, buf[:struct.calcsize(_S13_HEADER_FMT)])
diff --git a/Ccs/packet_config_SMILE.py b/Ccs/packet_config_SMILE.py
index 9034adf2c07917dd9dcfdfae8ea4636d3a3b3fa9..ed9753fbf7e808f38181382f363670ce53c50f9b 100644
--- a/Ccs/packet_config_SMILE.py
+++ b/Ccs/packet_config_SMILE.py
@@ -8,6 +8,7 @@ Author: Marko Mecina (MM)
 
 import ctypes
 import datetime
+import struct
 import numpy as np
 
 import crcmod
@@ -33,7 +34,10 @@ RMAP_PEC_LEN = 1
 
 PUS_PKT_VERS_NUM = 0  # 0 for space packets
 PUS_VERSION = 1
-MAX_PKT_LEN = 1024  # bytes
+MAX_PKT_LEN = 886  # 886 for TMs [EID-1298], 504 for TCs [EID-1361]
+
+TMTC = {0: 'TM', 1: 'TC'}
+TSYNC_FLAG = {0: 'U', 5: 'S'}
 
 PRIMARY_HEADER = [
     ("PKT_VERS_NUM", ctypes.c_uint16, 3),
@@ -71,7 +75,7 @@ timepack = [ptt(9, 18), 8, 1e6, 1]
 CUC_EPOCH = datetime.datetime(2018, 1, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.utc)
 
 
-def timecal(data, string=False):
+def timecal(data, string=False, checkft=False):
     if not isinstance(data, bytes):
         try:
             return data[0]
@@ -94,6 +98,10 @@ def timecal(data, string=False):
         coarse = data >> 24
         fine = (data & 0xffffff) / timepack[2]
 
+    # check for fine time overflow
+    if checkft and (fine > timepack[2]):
+        raise ValueError('Fine time is greater than resolution {} > {}!'.format(fine, timepack[2]))
+
     if string:
         if sync_byte:
             sync = 'S' if (data & 0xff) == 0b101 else 'U'
@@ -239,51 +247,51 @@ SPW_FEE_LOGICAL_ADDRESS = 0x51
 SPW_FEE_KEY = 0xD1  # application authorisation key
 
 RMAP_COMMAND_HEADER = [
-    ("TARGET_LOGICAL_ADDR", ctypes.c_uint8, 8),
-    ("PROTOCOL_ID", ctypes.c_uint8, 8),
-    ("PKT_TYPE", ctypes.c_uint8, 2),
-    ("WRITE", ctypes.c_uint8, 1),
-    ("VERIFY", ctypes.c_uint8, 1),
-    ("REPLY", ctypes.c_uint8, 1),
-    ("INCREMENT", ctypes.c_uint8, 1),
-    ("REPLY_ADDR_LEN", ctypes.c_uint8, 2),
-    ("KEY", ctypes.c_uint8, 8),
-    ("INIT_LOGICAL_ADDR", ctypes.c_uint8, 8),
-    ("TRANSACTION_ID", ctypes.c_uint16, 16),
-    ("EXT_ADDR", ctypes.c_uint8, 8),
+    ("TARGET_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("PROTOCOL_ID", ctypes.c_uint32, 8),
+    ("PKT_TYPE", ctypes.c_uint32, 2),
+    ("WRITE", ctypes.c_uint32, 1),
+    ("VERIFY", ctypes.c_uint32, 1),
+    ("REPLY", ctypes.c_uint32, 1),
+    ("INCREMENT", ctypes.c_uint32, 1),
+    ("REPLY_ADDR_LEN", ctypes.c_uint32, 2),
+    ("KEY", ctypes.c_uint32, 8),
+    ("INIT_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("TRANSACTION_ID", ctypes.c_uint32, 16),
+    ("EXT_ADDR", ctypes.c_uint32, 8),
     ("ADDR", ctypes.c_uint32, 32),
     ("DATA_LEN", ctypes.c_uint32, 24),
     ("HEADER_CRC", ctypes.c_uint32, 8)
 ]
 
 RMAP_REPLY_WRITE_HEADER = [
-    ("INIT_LOGICAL_ADDR", ctypes.c_uint8, 8),
-    ("PROTOCOL_ID", ctypes.c_uint8, 8),
-    ("PKT_TYPE", ctypes.c_uint8, 2),
-    ("WRITE", ctypes.c_uint8, 1),
-    ("VERIFY", ctypes.c_uint8, 1),
-    ("REPLY", ctypes.c_uint8, 1),
-    ("INCREMENT", ctypes.c_uint8, 1),
-    ("REPLY_ADDR_LEN", ctypes.c_uint8, 2),
-    ("STATUS", ctypes.c_uint8, 8),
-    ("TARGET_LOGICAL_ADDR", ctypes.c_uint8, 8),
-    ("TRANSACTION_ID", ctypes.c_uint16, 16),
-    ("HEADER_CRC", ctypes.c_uint8, 8)
+    ("INIT_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("PROTOCOL_ID", ctypes.c_uint32, 8),
+    ("PKT_TYPE", ctypes.c_uint32, 2),
+    ("WRITE", ctypes.c_uint32, 1),
+    ("VERIFY", ctypes.c_uint32, 1),
+    ("REPLY", ctypes.c_uint32, 1),
+    ("INCREMENT", ctypes.c_uint32, 1),
+    ("REPLY_ADDR_LEN", ctypes.c_uint32, 2),
+    ("STATUS", ctypes.c_uint32, 8),
+    ("TARGET_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("TRANSACTION_ID", ctypes.c_uint32, 16),
+    ("HEADER_CRC", ctypes.c_uint32, 8)
 ]
 
 RMAP_REPLY_READ_HEADER = [
-    ("INIT_LOGICAL_ADDR", ctypes.c_uint8, 8),
-    ("PROTOCOL_ID", ctypes.c_uint8, 8),
-    ("PKT_TYPE", ctypes.c_uint8, 2),
-    ("WRITE", ctypes.c_uint8, 1),
-    ("VERIFY", ctypes.c_uint8, 1),
-    ("REPLY", ctypes.c_uint8, 1),
-    ("INCREMENT", ctypes.c_uint8, 1),
-    ("REPLY_ADDR_LEN", ctypes.c_uint8, 2),
-    ("STATUS", ctypes.c_uint8, 8),
-    ("TARGET_LOGICAL_ADDR", ctypes.c_uint8, 8),
-    ("TRANSACTION_ID", ctypes.c_uint16, 16),
-    ("RESERVED", ctypes.c_uint8, 8),
+    ("INIT_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("PROTOCOL_ID", ctypes.c_uint32, 8),
+    ("PKT_TYPE", ctypes.c_uint32, 2),
+    ("WRITE", ctypes.c_uint32, 1),
+    ("VERIFY", ctypes.c_uint32, 1),
+    ("REPLY", ctypes.c_uint32, 1),
+    ("INCREMENT", ctypes.c_uint32, 1),
+    ("REPLY_ADDR_LEN", ctypes.c_uint32, 2),
+    ("STATUS", ctypes.c_uint32, 8),
+    ("TARGET_LOGICAL_ADDR", ctypes.c_uint32, 8),
+    ("TRANSACTION_ID", ctypes.c_uint32, 16),
+    ("RESERVED", ctypes.c_uint32, 8),
     ("DATA_LEN", ctypes.c_uint32, 24),
     ("HEADER_CRC", ctypes.c_uint32, 8)
 ]
@@ -291,16 +299,16 @@ RMAP_REPLY_READ_HEADER = [
 # FEEDATA packet structure definitions
 
 FEEDATA_TRANSFER_HEADER = [
-    ("INIT_LOGICAL_ADDR", ctypes.c_uint8, 8),
-    ("PROTOCOL_ID", ctypes.c_uint8, 8),
+    ("INIT_LOGICAL_ADDR", ctypes.c_uint16, 8),
+    ("PROTOCOL_ID", ctypes.c_uint16, 8),
     ("DATA_LEN", ctypes.c_uint16, 16),
-    ("RESERVED1", ctypes.c_uint8, 4),
-    ("MODE", ctypes.c_uint8, 4),
-    ("LAST_PKT", ctypes.c_uint8, 1),
-    ("CCDSIDE", ctypes.c_uint8, 2),
-    ("CCD", ctypes.c_uint8, 1),
-    ("RESERVED2", ctypes.c_uint8, 2),
-    ("PKT_TYPE", ctypes.c_uint8, 2),
+    ("RESERVED1", ctypes.c_uint16, 4),
+    ("MODE", ctypes.c_uint16, 4),
+    ("LAST_PKT", ctypes.c_uint16, 1),
+    ("CCDSIDE", ctypes.c_uint16, 2),
+    ("CCD", ctypes.c_uint16, 1),
+    ("RESERVED2", ctypes.c_uint16, 2),
+    ("PKT_TYPE", ctypes.c_uint16, 2),
     ("FRAME_CNT", ctypes.c_uint16, 16),
     ("SEQ_CNT", ctypes.c_uint16, 16)
 ]
@@ -411,160 +419,174 @@ class FeeDataTransferHeader(ctypes.Union):
 #########################
 
 # look-up table for FEE parameters (DP IDs & internal IDs) (20220908)
-fee_id = {'vstart': {'pid': 345544373, 'idx': 1},
-          'vend': {'pid': 345544372, 'idx': 2},
-          'charge_injection_width': {'pid': 345544348, 'idx': 3},
-          'charge_injection_gap': {'pid': 345544347, 'idx': 4},
-          'parallel_toi_period': {'pid': 345544366, 'idx': 5},
-          'parallel_clk_overlap': {'pid': 345544365, 'idx': 6},
-          'n_final_dump': {'pid': 345544363, 'idx': 7},
-          'h_end': {'pid': 345544359, 'idx': 8},
-          'packet_size': {'pid': 345544364, 'idx': 9},
-          'int_period': {'pid': 345544362, 'idx': 10},
-          'readout_node_sel': {'pid': 345544368, 'idx': 11},
-          'h_start': {'pid': 345544360, 'idx': 12},
-          'ccd2_e_pix_threshold': {'pid': 345544327, 'idx': 13},
-          'ccd2_f_pix_threshold': {'pid': 345544328, 'idx': 14},
-          'ccd4_e_pix_threshold': {'pid': 345544334, 'idx': 15},
-          'ccd4_f_pix_threshold': {'pid': 345544335, 'idx': 16},
-          'full_sun_pix_threshold': {'pid': 345544358, 'idx': 17},
-          'ccd1_readout': {'pid': 345544325, 'idx': 18},
-          'ccd2_readout': {'pid': 345544329, 'idx': 19},
-          'charge_injection': {'pid': 345544346, 'idx': 20},
-          'tri_level_clk': {'pid': 345544371, 'idx': 21},
-          'img_clk_dir': {'pid': 345544361, 'idx': 22},
-          'reg_clk_dir': {'pid': 345544369, 'idx': 23},
-          'sync_sel': {'pid': 345544370, 'idx': 24},
-          'digitise_en': {'pid': 345544353, 'idx': 25},
-          'correction_bypass': {'pid': 345544351, 'idx': 26},
-          'dg_en': {'pid': 345544352, 'idx': 27},
-          'clear_full_sun_counters': {'pid': 345544350, 'idx': 28},
-          'edu_wandering_mask_en': {'pid': 345544354, 'idx': 29},
-          'ccd2_vod_config': {'pid': 345544331, 'idx': 30},
-          'ccd4_vod_config': {'pid': 345544337, 'idx': 31},
-          'ccd2_vrd_config': {'pid': 345544332, 'idx': 32},
-          'ccd4_vrd_config': {'pid': 345544338, 'idx': 33},
-          'ccd2_vgd_config': {'pid': 345544330, 'idx': 34},
-          'ccd4_vgd_config': {'pid': 345544336, 'idx': 35},
-          'ccd_vog_config': {'pid': 345544345, 'idx': 36},
-          'event_detection': {'pid': 345544355, 'idx': 37},
-          'clear_error_flag': {'pid': 345544349, 'idx': 38},
-          'event_pkt_limit': {'pid': 345544356, 'idx': 39},
-          'execute_op': {'pid': 345544357, 'idx': 40},
-          'ccd_mode_config': {'pid': 345544342, 'idx': 41},
-          'ccd_mode2_config': {'pid': 345544341, 'idx': 42},
-          'pix_offset': {'pid': 345544367, 'idx': 43}}
-
+# fee_id = {'vstart': {'pid': 345544373, 'idx': 1},
+#           'vend': {'pid': 345544372, 'idx': 2},
+#           'charge_injection_width': {'pid': 345544348, 'idx': 3},
+#           'charge_injection_gap': {'pid': 345544347, 'idx': 4},
+#           'parallel_toi_period': {'pid': 345544366, 'idx': 5},
+#           'parallel_clk_overlap': {'pid': 345544365, 'idx': 6},
+#           'n_final_dump': {'pid': 345544363, 'idx': 7},
+#           'h_end': {'pid': 345544359, 'idx': 8},
+#           'packet_size': {'pid': 345544364, 'idx': 9},
+#           'int_period': {'pid': 345544362, 'idx': 10},
+#           'readout_node_sel': {'pid': 345544368, 'idx': 11},
+#           'h_start': {'pid': 345544360, 'idx': 12},
+#           'ccd2_e_pix_threshold': {'pid': 345544327, 'idx': 13},
+#           'ccd2_f_pix_threshold': {'pid': 345544328, 'idx': 14},
+#           'ccd4_e_pix_threshold': {'pid': 345544334, 'idx': 15},
+#           'ccd4_f_pix_threshold': {'pid': 345544335, 'idx': 16},
+#           'full_sun_pix_threshold': {'pid': 345544358, 'idx': 17},
+#           'ccd1_readout': {'pid': 345544325, 'idx': 18},
+#           'ccd2_readout': {'pid': 345544329, 'idx': 19},
+#           'charge_injection': {'pid': 345544346, 'idx': 20},
+#           'tri_level_clk': {'pid': 345544371, 'idx': 21},
+#           'img_clk_dir': {'pid': 345544361, 'idx': 22},
+#           'reg_clk_dir': {'pid': 345544369, 'idx': 23},
+#           'sync_sel': {'pid': 345544370, 'idx': 24},
+#           'digitise_en': {'pid': 345544353, 'idx': 25},
+#           'correction_bypass': {'pid': 345544351, 'idx': 26},
+#           'dg_en': {'pid': 345544352, 'idx': 27},
+#           'clear_full_sun_counters': {'pid': 345544350, 'idx': 28},
+#           'edu_wandering_mask_en': {'pid': 345544354, 'idx': 29},
+#           'ccd2_vod_config': {'pid': 345544331, 'idx': 30},
+#           'ccd4_vod_config': {'pid': 345544337, 'idx': 31},
+#           'ccd2_vrd_config': {'pid': 345544332, 'idx': 32},
+#           'ccd4_vrd_config': {'pid': 345544338, 'idx': 33},
+#           'ccd2_vgd_config': {'pid': 345544330, 'idx': 34},
+#           'ccd4_vgd_config': {'pid': 345544336, 'idx': 35},
+#           'ccd_vog_config': {'pid': 345544345, 'idx': 36},
+#           'event_detection': {'pid': 345544355, 'idx': 37},
+#           'clear_error_flag': {'pid': 345544349, 'idx': 38},
+#           'event_pkt_limit': {'pid': 345544356, 'idx': 39},
+#           'execute_op': {'pid': 345544357, 'idx': 40},
+#           'ccd_mode_config': {'pid': 345544342, 'idx': 41},
+#           'ccd_mode2_config': {'pid': 345544341, 'idx': 42},
+#           'pix_offset': {'pid': 345544367, 'idx': 43}}
+
+
+# TODO: the FEE related parameters might need an update
 # FEE RW registers (SMILE-MSSL-PL-Register_map_v0.20)
+class FeeCfgReg:
+    FEE_CFG_REG_0 = 0x00000000
+    FEE_CFG_REG_1 = 0x00000004
+    FEE_CFG_REG_2 = 0x00000008
+    FEE_CFG_REG_3 = 0x0000000C
+    FEE_CFG_REG_4 = 0x00000010
+    FEE_CFG_REG_5 = 0x00000014
+    FEE_CFG_REG_6 = 0x00000018  # unused
+    FEE_CFG_REG_7 = 0x0000001C  # unused
+    FEE_CFG_REG_8 = 0x00000020  # unused
+    FEE_CFG_REG_9 = 0x00000024  # unused
+    FEE_CFG_REG_10 = 0x00000028  # unused
+    FEE_CFG_REG_11 = 0x0000002C  # unused
+    FEE_CFG_REG_12 = 0x00000030  # unused
+    FEE_CFG_REG_13 = 0x00000034  # unused
+    FEE_CFG_REG_14 = 0x00000038
+    FEE_CFG_REG_15 = 0x0000003C
+    FEE_CFG_REG_16 = 0x00000040
+    FEE_CFG_REG_17 = 0x00000044
+    FEE_CFG_REG_18 = 0x00000048
+    FEE_CFG_REG_19 = 0x0000004C
+    FEE_CFG_REG_20 = 0x00000050
+    FEE_CFG_REG_21 = 0x00000054
+    FEE_CFG_REG_22 = 0x00000058
+    FEE_CFG_REG_23 = 0x0000005C
+    FEE_CFG_REG_24 = 0x00000060
+    FEE_CFG_REG_25 = 0x00000064
+    FEE_CFG_REG_26 = 0x00000068
 
-FEE_CFG_REG_0 = 0x00000000
-FEE_CFG_REG_1 = 0x00000004
-FEE_CFG_REG_2 = 0x00000008
-FEE_CFG_REG_3 = 0x0000000C
-FEE_CFG_REG_4 = 0x00000010
-FEE_CFG_REG_5 = 0x00000014
-FEE_CFG_REG_6 = 0x00000018  # unused
-FEE_CFG_REG_7 = 0x0000001C  # unused
-FEE_CFG_REG_8 = 0x00000020  # unused
-FEE_CFG_REG_9 = 0x00000024  # unused
-FEE_CFG_REG_10 = 0x00000028  # unused
-FEE_CFG_REG_11 = 0x0000002C  # unused
-FEE_CFG_REG_12 = 0x00000030  # unused
-FEE_CFG_REG_13 = 0x00000034  # unused
-FEE_CFG_REG_14 = 0x00000038
-FEE_CFG_REG_15 = 0x0000003C
-FEE_CFG_REG_16 = 0x00000040
-FEE_CFG_REG_17 = 0x00000044
-FEE_CFG_REG_18 = 0x00000048
-FEE_CFG_REG_19 = 0x0000004C
-FEE_CFG_REG_20 = 0x00000050
-FEE_CFG_REG_21 = 0x00000054
-FEE_CFG_REG_22 = 0x00000058
-FEE_CFG_REG_23 = 0x0000005C
-FEE_CFG_REG_24 = 0x00000060
-FEE_CFG_REG_25 = 0x00000064
-FEE_CFG_REG_26 = 0x00000068
 
 # FEE  RO registers (SMILE-MSSL-PL-Register_map_v0.20)
+class FeeHkReg:
+    FEE_HK_REG_0 = 0x00000700  # reserved
+    FEE_HK_REG_1 = 0x00000704  # reserved
+    FEE_HK_REG_2 = 0x00000708  # reserved
+    FEE_HK_REG_3 = 0x0000070C  # reserved
+    FEE_HK_REG_4 = 0x00000710
+    FEE_HK_REG_5 = 0x00000714
+    FEE_HK_REG_6 = 0x00000718
+    FEE_HK_REG_7 = 0x0000071C
+    FEE_HK_REG_8 = 0x00000720
+    FEE_HK_REG_9 = 0x00000724
+    FEE_HK_REG_10 = 0x00000728
+    FEE_HK_REG_11 = 0x0000072C
+    FEE_HK_REG_12 = 0x00000730
+    FEE_HK_REG_13 = 0x00000734
+    FEE_HK_REG_14 = 0x00000738
+    FEE_HK_REG_15 = 0x0000073C
+    FEE_HK_REG_16 = 0x00000740
+    FEE_HK_REG_17 = 0x00000744
+    FEE_HK_REG_18 = 0x00000748
+    FEE_HK_REG_19 = 0x0000074C
+    FEE_HK_REG_20 = 0x00000750
+    FEE_HK_REG_21 = 0x00000754
+    FEE_HK_REG_22 = 0x00000758
+    FEE_HK_REG_23 = 0x0000075C
+    FEE_HK_REG_24 = 0x00000760  # reserved
+    FEE_HK_REG_25 = 0x00000764  # reserved
+    FEE_HK_REG_26 = 0x00000768  # reserved
+    FEE_HK_REG_27 = 0x0000076C  # reserved
+    FEE_HK_REG_28 = 0x00000770  # reserved
+    FEE_HK_REG_29 = 0x00000774  # reserved
+    FEE_HK_REG_30 = 0x00000778  # reserved
+    FEE_HK_REG_31 = 0x0000077C  # reserved
+    FEE_HK_REG_32 = 0x00000780
+    FEE_HK_REG_33 = 0x00000784
+    FEE_HK_REG_34 = 0x00000788
+    FEE_HK_REG_35 = 0x0000078C
+    FEE_HK_REG_36 = 0x00000790
+    FEE_HK_REG_37 = 0x00000794
 
-FEE_HK_REG_0 = 0x00000700  # reserved
-FEE_HK_REG_1 = 0x00000704  # reserved
-FEE_HK_REG_2 = 0x00000708  # reserved
-FEE_HK_REG_3 = 0x0000070C  # reserved
-FEE_HK_REG_4 = 0x00000710
-FEE_HK_REG_5 = 0x00000714
-FEE_HK_REG_6 = 0x00000718
-FEE_HK_REG_7 = 0x0000071C
-FEE_HK_REG_8 = 0x00000720
-FEE_HK_REG_9 = 0x00000724
-FEE_HK_REG_10 = 0x00000728
-FEE_HK_REG_11 = 0x0000072C
-FEE_HK_REG_12 = 0x00000730
-FEE_HK_REG_13 = 0x00000734
-FEE_HK_REG_14 = 0x00000738
-FEE_HK_REG_15 = 0x0000073C
-FEE_HK_REG_16 = 0x00000740
-FEE_HK_REG_17 = 0x00000744
-FEE_HK_REG_18 = 0x00000748
-FEE_HK_REG_19 = 0x0000074C
-FEE_HK_REG_20 = 0x00000750
-FEE_HK_REG_21 = 0x00000754
-FEE_HK_REG_22 = 0x00000758
-FEE_HK_REG_23 = 0x0000075C
-FEE_HK_REG_24 = 0x00000760  # reserved
-FEE_HK_REG_25 = 0x00000764  # reserved
-FEE_HK_REG_26 = 0x00000768  # reserved
-FEE_HK_REG_27 = 0x0000076C  # reserved
-FEE_HK_REG_28 = 0x00000770  # reserved
-FEE_HK_REG_29 = 0x00000774  # reserved
-FEE_HK_REG_30 = 0x00000778  # reserved
-FEE_HK_REG_31 = 0x0000077C  # reserved
-FEE_HK_REG_32 = 0x00000780
-FEE_HK_REG_33 = 0x00000784
-FEE_HK_REG_34 = 0x00000788
-FEE_HK_REG_35 = 0x0000078C
-FEE_HK_REG_36 = 0x00000790
-FEE_HK_REG_37 = 0x00000794
 
 # FEE modes
 # see MSSL-SMILE-SXI-IRD-0001  Draft A.14, req. MSSL-IF-17
 # also SMILE-MSSL-PL-Register_map_v0.22, as the IRD does not list all modes
+class FeeMode:
+    FEE_MODE_ID_ON = 0x0  # the thing is switched on
+    FEE_MODE_ID_FTP = 0x1  # frame transfer pattern
+    FEE_MODE_ID_STBY = 0x2  # stand-by-mode
+    FEE_MODE_ID_FT = 0x3  # frame transfer
+    FEE_MODE_ID_FF = 0x4  # full frame
+    FEE_CMD__ID_IMM_ON = 0x8  # immediate on-mode, this is a command, not a mode
+    FEE_MODE_ID_FFSIM = 0x9  # full frame simulation simulation
+    FEE_MODE_ID_EVSIM = 0xA  # event detection simulation
+    FEE_MODE_ID_PTP1 = 0xB  # parallel trap pump mode 1
+    FEE_MODE_ID_PTP2 = 0xC  # parallel trap pump mode 2
+    FEE_MODE_ID_STP1 = 0xD  # serial trap pump mode 1
+    FEE_MODE_ID_STP2 = 0xE  # serial trap pump mode 2
+
+
+class FeeMode2:
+    FEE_MODE2_NOBIN = 0x1  # no binning mode
+    FEE_MODE2_BIN6 = 0x2  # 6x6 binning mode
+    FEE_MODE2_BIN24 = 0x3  # 24x4 binning mode
 
-FEE_MODE_ID_ON = 0x0  # the thing is switched on
-FEE_MODE_ID_FTP = 0x1  # frame transfer pattern
-FEE_MODE_ID_STBY = 0x2  # stand-by-mode
-FEE_MODE_ID_FT = 0x3  # frame transfer
-FEE_MODE_ID_FF = 0x4  # full frame
-FEE_CMD__ID_IMM_ON = 0x8  # immediate on-mode, this is a command, not a mode
-FEE_MODE_ID_FFSIM = 0x9  # full frame simulation simulation
-FEE_MODE_ID_EVSIM = 0xA  # event detection simulation
-FEE_MODE_ID_PTP1 = 0xB  # parallel trap pump mode 1
-FEE_MODE_ID_PTP2 = 0xC  # parallel trap pump mode 2
-FEE_MODE_ID_STP1 = 0xD  # serial trap pump mode 1
-FEE_MODE_ID_STP2 = 0xE  # serial trap pump mode 2
-
-FEE_MODE2_NOBIN = 0x1  # no binning mode
-FEE_MODE2_BIN6 = 0x2  # 6x6 binning mode
-FEE_MODE2_BIN24 = 0x3  # 24x4 binning mode
 
 # these identifiy the bits in the readout node selection register
-FEE_READOUT_NODE_E2 = 0b0010
-FEE_READOUT_NODE_F2 = 0b0001
-FEE_READOUT_NODE_E4 = 0b1000
-FEE_READOUT_NODE_F4 = 0b0100
+class FeeReadoutNode:
+    FEE_READOUT_NODE_E2 = 0b0010
+    FEE_READOUT_NODE_F2 = 0b0001
+    FEE_READOUT_NODE_E4 = 0b1000
+    FEE_READOUT_NODE_F4 = 0b0100
+
 
 # see MSSL-SMILE-SXI-IRD-0001 Draft A.14, req. MSSL-IF-108
-FEE_CCD_SIDE_F = 0x0  # left side
-FEE_CCD_SIDE_E = 0x1  # right side
-FEE_CCD_INTERLEAVED = 0x2  # F and E inverleaved
+class FeeCcdSide:
+    FEE_CCD_SIDE_F = 0x0  # left side
+    FEE_CCD_SIDE_E = 0x1  # right side
+    FEE_CCD_INTERLEAVED = 0x2  # F and E inverleaved
+
 
-FEE_CCD_ID_2 = 0x0
-FEE_CCD_ID_4 = 0x1
+class FeeCcdId:
+    FEE_CCD_ID_2 = 0x0
+    FEE_CCD_ID_4 = 0x1
 
-FEE_PKT_TYPE_DATA = 0x0  # any data
-FEE_PKT_TYPE_EV_DET = 0x1  # event detection
-FEE_PKT_TYPE_HK = 0x2  # housekeeping
-FEE_PKT_TYPE_WMASK = 0x3  # wandering mask packet
+
+class FeePktType:
+    FEE_PKT_TYPE_DATA = 0x0  # any data
+    FEE_PKT_TYPE_EV_DET = 0x1  # event detection
+    FEE_PKT_TYPE_HK = 0x2  # housekeeping
+    FEE_PKT_TYPE_WMASK = 0x3  # wandering mask packet
 
 
 class RMapCommandWrite(RMapCommandHeader):
@@ -660,26 +682,26 @@ class FeeDataTransfer(FeeDataTransferHeader):
     - bits 1:0 = packet type: 0 = data packet, 1 = Event detection packet, 2 = housekeeping packet
     """
 
-    _modes = {FEE_MODE_ID_ON: "On Mode",
-              FEE_MODE_ID_FTP: "Frame Transfer Pattern",
-              FEE_MODE_ID_STBY: "Stand-By-Mode",
-              FEE_MODE_ID_FT: "Frame Transfer",
-              FEE_MODE_ID_FF: "Full Frame",
-              FEE_MODE_ID_FFSIM: "Full frame simulation",
-              FEE_MODE_ID_EVSIM: "Event detection simulation",
-              FEE_MODE_ID_PTP1: "Parallel trap pumping mode 1",
-              FEE_MODE_ID_PTP2: "Parallel trap pumping mode 2",
-              FEE_MODE_ID_STP1: "Serial trap pumping mode 1",
-              FEE_MODE_ID_STP2: "Serial trap pumping mode 2"}
-    _ccd_sides = {FEE_CCD_SIDE_F: "left side (F)",
-                  FEE_CCD_SIDE_E: "right side (E)",
-                  FEE_CCD_INTERLEAVED: "F&E interleaved"}
-    _ccds = {FEE_CCD_ID_2: "CCD2",
-             FEE_CCD_ID_4: "CCD4"}
-    _pkt_types = {FEE_PKT_TYPE_DATA: "Data",
-                  FEE_PKT_TYPE_EV_DET: "Event detection",
-                  FEE_PKT_TYPE_HK: "Housekeeping",
-                  FEE_PKT_TYPE_WMASK: "Wandering mask"}
+    _modes = {FeeMode.FEE_MODE_ID_ON: "On Mode",
+              FeeMode.FEE_MODE_ID_FTP: "Frame Transfer Pattern",
+              FeeMode.FEE_MODE_ID_STBY: "Stand-By-Mode",
+              FeeMode.FEE_MODE_ID_FT: "Frame Transfer",
+              FeeMode.FEE_MODE_ID_FF: "Full Frame",
+              FeeMode.FEE_MODE_ID_FFSIM: "Full frame simulation",
+              FeeMode.FEE_MODE_ID_EVSIM: "Event detection simulation",
+              FeeMode.FEE_MODE_ID_PTP1: "Parallel trap pumping mode 1",
+              FeeMode.FEE_MODE_ID_PTP2: "Parallel trap pumping mode 2",
+              FeeMode.FEE_MODE_ID_STP1: "Serial trap pumping mode 1",
+              FeeMode.FEE_MODE_ID_STP2: "Serial trap pumping mode 2"}
+    _ccd_sides = {FeeCcdSide.FEE_CCD_SIDE_F: "left side (F)",
+                  FeeCcdSide.FEE_CCD_SIDE_E: "right side (E)",
+                  FeeCcdSide.FEE_CCD_INTERLEAVED: "F&E interleaved"}
+    _ccds = {FeeCcdId.FEE_CCD_ID_2: "CCD2",
+             FeeCcdId.FEE_CCD_ID_4: "CCD4"}
+    _pkt_types = {FeePktType.FEE_PKT_TYPE_DATA: "Data",
+                  FeePktType.FEE_PKT_TYPE_EV_DET: "Event detection",
+                  FeePktType.FEE_PKT_TYPE_HK: "Housekeeping",
+                  FeePktType.FEE_PKT_TYPE_WMASK: "Wandering mask"}
 
     _DATA_HK_STRUCT = []
 
@@ -734,13 +756,13 @@ class FeeDataTransfer(FeeDataTransferHeader):
                                  self.bits.PKT_TYPE] if self.bits.PKT_TYPE in self._pkt_types else self.bits.PKT_TYPE}
 
     def set_evt_data(self):
-        if self.bits.PKT_TYPE == FEE_PKT_TYPE_EV_DET:
+        if self.bits.PKT_TYPE == FeePktType.FEE_PKT_TYPE_EV_DET:
             evtdata = EventDetectionData()
             evtdata.bin[:] = self.data
+            # structure according to MSSL-SMILE-SXI-IRD-0001
             self.evt_data = {"COLUMN": evtdata.bits.column,
                              "ROW": evtdata.bits.row,
-                             "IMAGE": np.array(evtdata.bits.array)[
-                                      ::-1]}  # structure according to MSSL-SMILE-SXI-IRD-0001
+                             "IMAGE": np.array(evtdata.bits.array)[::-1]}
         else:
             self.evt_data = None
 
@@ -760,3 +782,15 @@ class EventDetectionData(ctypes.Union):
         ("bits", EventDetectionFields),
         ("bin", ctypes.c_ubyte * ctypes.sizeof(EventDetectionFields))
     ]
+
+
+# S13 data header format, using python struct conventions
+S13_FMT_OBSID = 'I'
+S13_FMT_TIME = 'I'
+S13_FMT_FTIME = 'H'
+S13_FMT_COUNTER = 'H'
+_S13_HEADER_FMT = S13_FMT_OBSID + S13_FMT_TIME + S13_FMT_FTIME + S13_FMT_COUNTER
+
+
+def s13_unpack_data_header(buf):
+    return struct.unpack('>' + _S13_HEADER_FMT, buf[:struct.calcsize(_S13_HEADER_FMT)])
diff --git a/Ccs/plotter.py b/Ccs/plotter.py
index 1193a65012be3976e2e788f75670c2bd5e32b6b0..0e609da229b6f0321428b58c752f948a973be7b4 100644
--- a/Ccs/plotter.py
+++ b/Ccs/plotter.py
@@ -1,4 +1,6 @@
 import json
+import os.path
+from packaging import version
 import struct
 import threading
 import time
@@ -31,6 +33,8 @@ from sqlalchemy.sql.expression import func
 
 import importlib
 
+MPL_VERSION = version.parse(matplotlib._get_version())
+
 cfg = confignator.get_config(check_interpolation=False)
 
 project = 'packet_config_{}'.format(cfg.get('ccs-database', 'project'))
@@ -42,7 +46,6 @@ gi.require_version('Notify', '0.7')
 from gi.repository import Gtk, Gdk, GdkPixbuf, GLib, Notify  # NOQA
 
 # from event_storm_squasher import delayed
-# import logging.handlers
 
 ActivePoolInfo = NamedTuple(
     'ActivePoolInfo', [
@@ -51,14 +54,15 @@ ActivePoolInfo = NamedTuple(
         ('pool_name', str),
         ('live', bool)])
 
-fmtlist = {'INT8': 'b', 'UINT8': 'B', 'INT16': 'h', 'UINT16': 'H', 'INT32': 'i', 'UINT32': 'I', 'INT64': 'q',
-           'UINT64': 'Q', 'FLOAT': 'f', 'DOUBLE': 'd', 'INT24': 'i24', 'UINT24': 'I24', 'bit*': 'bit'}
+# fmtlist = {'INT8': 'b', 'UINT8': 'B', 'INT16': 'h', 'UINT16': 'H', 'INT32': 'i', 'UINT32': 'I', 'INT64': 'q',
+#            'UINT64': 'Q', 'FLOAT': 'f', 'DOUBLE': 'd', 'INT24': 'i24', 'UINT24': 'I24', 'bit*': 'bit'}
+
+# pi1_length_in_bits = {8: 'B', 16: 'H'}
 
 
 class PlotViewer(Gtk.Window):
 
-    def __init__(self, loaded_pool=None, parent=None, poolmgr=None, given_cfg=None, refresh_rate=1, parameters={},
-                 start_live=False, logger=None):
+    def __init__(self, loaded_pool=None, refresh_rate=1, parameters=None, start_live=False, **kwargs):
         Gtk.Window.__init__(self)
 
         Notify.init('PlotViewer')
@@ -69,28 +73,39 @@ class PlotViewer(Gtk.Window):
         self.parameter_limits = set()
 
         self.data_dict = {}
+        self.data_dict_info = {}  # row idx of last data point in data_dict
         self.max_datapoints = 0
+        self.data_min_idx = None
+        self.data_max_idx = None
+        self.pi1_lut = {}
+
+        self._pkt_buffer = {}  # local store for TM packets extracted from SQL DB, for speedup
 
         self.cfg = confignator.get_config()
 
         # Set up the logger
         self.logger = cfl.start_logging('ParameterPlotter')
 
-        # Specify which Pool should be used
-        if loaded_pool is not None:
-            self.loaded_pool = loaded_pool
-        else:
-            self.loaded_pool = None
-
         self.refresh_rate = refresh_rate
 
-        if not self.cfg.has_section('ccs-plot_parameters'):
-            self.cfg.add_section('ccs-plot_parameters')
-        self.user_parameters = self.cfg['ccs-plot_parameters']
+        if not self.cfg.has_section(cfl.CFG_SECT_PLOT_PARAMETERS):
+            self.cfg.add_section(cfl.CFG_SECT_PLOT_PARAMETERS)
+        self.user_parameters = self.cfg[cfl.CFG_SECT_PLOT_PARAMETERS]
 
         self.session_factory_idb = scoped_session_maker('idb')
         self.session_factory_storage = scoped_session_maker('storage')
 
+        # load specified pool
+        if loaded_pool is not None and isinstance(loaded_pool, str):
+            res = self.session_factory_storage.execute('SELECT * FROM tm_pool WHERE pool_name="{}"'.format(loaded_pool))
+            try:
+                iid, filename, protocol, modtime = res.fetchall()[0]
+                self.loaded_pool = ActivePoolInfo(filename, modtime, filename, bool(not filename.count('/')))
+            except IndexError:
+                self.logger.error('Could not load pool {}'.format(loaded_pool))
+        else:
+            self.loaded_pool = None
+
         box = Gtk.VBox()
         self.add(box)
 
@@ -99,7 +114,7 @@ class PlotViewer(Gtk.Window):
         self.user_tm_decoders = cfl.user_tm_decoders_func()
 
         self.canvas = self.create_canvas()
-        toolbar = self.create_toolbar(self.loaded_pool)
+        toolbar = self.create_toolbar()  # self.loaded_pool)
 
         param_view = self.create_param_view()
 
@@ -107,7 +122,7 @@ class PlotViewer(Gtk.Window):
         box.pack_start(hbox, 1, 1, 0)
 
         hbox.pack_start(self.canvas, 1, 1, 0)
-        hbox.pack_start(param_view, 1, 1, 0)
+        hbox.pack_start(param_view, 0, 0, 0)
 
         navbar = self._create_navbar()
         box.pack_start(navbar, 0, 0, 0)
@@ -119,6 +134,9 @@ class PlotViewer(Gtk.Window):
         # self.connect('delete-event', self.write_cfg)
         self.connect('delete-event', self.live_plot_off)
 
+        if parameters is None:
+            parameters = {}
+
         self.plot_parameters = parameters
         if len(parameters) != 0:
             for hk in parameters:
@@ -128,9 +146,9 @@ class PlotViewer(Gtk.Window):
         self.live_plot_switch.set_active(start_live)
         self.show_all()
 
-        self.pool_selector.set_active_iter(self.pool_selector_pools.get_iter(0))
+        # self.pool_selector.set_active_iter(self.pool_selector_pools.get_iter(0))
 
-    def create_toolbar(self, pool_info=None):
+    def create_toolbar(self):  #, pool_info=None):
         toolbar = Gtk.HBox()
 
         # if pool_selector is not None:
@@ -148,10 +166,10 @@ class PlotViewer(Gtk.Window):
         self.pool_selector = Gtk.ComboBoxText(tooltip_text='Select Pool to Plot')
         self.pool_selector_pools = Gtk.ListStore(str, int, str, bool)
 
-        self.pool_selector_pools.append(['Select Pool', 0, 'Select Pool', False])
+        if self.loaded_pool is not None and isinstance(self.loaded_pool, ActivePoolInfo):
+            self.pool_selector_pools.append([*self.loaded_pool])
 
         self.pool_selector.set_model(self.pool_selector_pools)
-        #self.pool_selector.set_entry_text_column(2)
         self.pool_selector.connect('changed', self.pool_changed)
 
         toolbar.pack_start(self.pool_selector, 0, 0, 0)
@@ -185,17 +203,40 @@ class PlotViewer(Gtk.Window):
         self.show_limits.connect("toggled", self._toggle_limits)
         toolbar.pack_start(self.show_limits, 0, 0, 0)
 
+        self.calibrate = Gtk.CheckButton(label='Cal', active=True)
+        self.calibrate.set_tooltip_text('Plot engineering values, if available')
+        # self.calibrate.connect("toggled", self._toggle_limits)
+        toolbar.pack_start(self.calibrate, 0, 0, 0)
+
         toolbar.pack_start(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 0)
 
-        max_data_label = Gtk.Label(label='NMAX:')
-        max_data_label.set_tooltip_text('At most ~NMAX data points plotted (0 for unlimited)')
+        max_data_label = Gtk.Label(label='#')
+        max_data_label.set_tooltip_text('Plot at most ~NMAX data points (0 for unlimited), between MIN and MAX packet indices.')
         self.max_data = Gtk.Entry()
         self.max_data.set_width_chars(6)
-        self.max_data.connect('activate', self._set_max_datapoints)
-        self.max_data.set_tooltip_text('0')
+        self.max_data.set_alignment(1)
+        self.max_data.set_placeholder_text('NMAX')
+        self.max_data.set_input_purpose(Gtk.InputPurpose.DIGITS)
+        # self.max_data.connect('activate', self._set_max_datapoints)
+        self.max_data.set_tooltip_text('At most ~NMAX data points plotted (0 for unlimited)')
         toolbar.pack_start(max_data_label, 0, 0, 3)
         toolbar.pack_start(self.max_data, 0, 0, 0)
 
+        self.min_idx = Gtk.Entry()
+        self.min_idx.set_width_chars(7)
+        self.min_idx.set_alignment(1)
+        self.min_idx.set_placeholder_text('MIN')
+        self.min_idx.set_input_purpose(Gtk.InputPurpose.DIGITS)
+        self.min_idx.set_tooltip_text('Get parameters starting from packet index')
+        self.max_idx = Gtk.Entry()
+        self.max_idx.set_width_chars(7)
+        self.max_idx.set_alignment(1)
+        self.max_idx.set_placeholder_text('MAX')
+        self.max_idx.set_input_purpose(Gtk.InputPurpose.DIGITS)
+        self.max_idx.set_tooltip_text('Get parameters up to packet index')
+        toolbar.pack_start(self.min_idx, 0, 0, 0)
+        toolbar.pack_start(self.max_idx, 0, 0, 0)
+
         toolbar.pack_start(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 0)
 
         self.live_plot_switch = Gtk.Switch()
@@ -228,8 +269,11 @@ class PlotViewer(Gtk.Window):
         return canvas
 
     def _create_navbar(self):
-        # navbar = NavigationToolbarX(self.canvas, self)
-        navbar = NavigationToolbar(self.canvas, self)
+        # window argument to be removed
+        if MPL_VERSION < version.parse('3.6.0'):
+            navbar = NavigationToolbar(self.canvas, self)
+        else:
+            navbar = NavigationToolbar(self.canvas)
 
         limits = Gtk.HBox()
         self.xmin = Gtk.Entry()
@@ -366,7 +410,7 @@ class PlotViewer(Gtk.Window):
 
         # add user defined PARAMETERS
         self.useriter = parameter_model.append(None, ['User defined'])
-        for userpar in self.cfg['ccs-plot_parameters']:
+        for userpar in self.cfg[cfl.CFG_SECT_PLOT_PARAMETERS]:
             parameter_model.append(self.useriter, [userpar])
 
         return parameter_model
@@ -414,8 +458,10 @@ class PlotViewer(Gtk.Window):
         # Or check between which Pools should be selected
         all_pools = None
         if cfl.is_open('poolmanager'):
-            pmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
-            all_pools = cfl.Dictionaries(pmgr, 'loaded_pools')
+            # pmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
+            pmgr = cfl.get_module_handle('poolmanager', instance=cfl.communication['poolmanager'])
+            all_pools = pmgr.Dictionaries('loaded_pools')
+            # all_pools = cfl.Dictionaries(pmgr, 'loaded_pools')
             #if not all_pools:
             #    found_pools = None
             #elif len(active_pool) == 1:
@@ -426,8 +472,10 @@ class PlotViewer(Gtk.Window):
             #    found_pools = list(all_pools.keys())
 
         elif cfl.is_open('poolviewer'):
-            pv = cfl.dbus_connection('poolviewer', cfl.communication['poolviewer'])
-            all_pools = cfl.Variables(pv, 'active_pool_info')
+            # pv = cfl.dbus_connection('poolviewer', cfl.communication['poolviewer'])
+            pv = cfl.get_module_handle('poolviewer', instance=cfl.communication['poolviewer'])
+            all_pools = pv.Variables('active_pool_info')
+            # all_pools = cfl.Variables(pv, 'active_pool_info')
             #if all_pools:
                 #loaded_pool = ActivePoolInfo(active_pool[0],active_pool[1],active_pool[2],active_pool[3])
             #    found_pools = all_pools[2]
@@ -456,7 +504,7 @@ class PlotViewer(Gtk.Window):
                         i += 1
                     if pool_info == tuple(found_pool):  # Check if pools match
                         x = True    # If at least one entry matches to the pool it is not necessary to add
-                    count +=1
+                    count += 1
                 if not x:   # Add a pool if it is not already in the model (liststore)
                     model.append([pool_info[0], pool_info[1], pool_info[2], pool_info[3]])
 
@@ -484,7 +532,7 @@ class PlotViewer(Gtk.Window):
     def add_user_parameter(self, widget, treeview):
         parameter_model = treeview.get_model()
 
-        param_values = cfl.add_user_parameter(parentwin = self)
+        param_values = cfl.add_user_parameter(parentwin=self)
 
         if param_values:
             label, apid, st, sst, sid, bytepos, fmt, offbi = param_values
@@ -497,45 +545,55 @@ class PlotViewer(Gtk.Window):
 
         selection = treeview.get_selection()
         model, parpath = selection.get_selected_rows()
-        parameter_model = treeview.get_model()
+        # parameter_model = treeview.get_model()
 
         try:
-            parent = model[parpath].parent[0]  # Check if selection is an object or the parent tab is selected
-            parname = model[parpath][0]
-            param_values = cfl.remove_user_parameter(parname)
+            if model[parpath].parent is not None and model[parpath].parent[0] == 'User defined':  # Check if selection is an object or the parent tab is selected
+                parname = model[parpath][0]
+                param_values = cfl.remove_user_parameter(parname)
+            else:
+                param_values = None
 
-        except:
-            param_values = cfl.remove_user_parameter(parentwin=self)
+        except Exception as err:
+            self.logger.warning(err)
+            # param_values = cfl.remove_user_parameter(parentwin=self)
+            return
 
         if param_values:
             parameter_model = self.treeview.get_model()
             self.user_parameters.pop(param_values)
             parameter_model.remove(self.useriter)
             self.useriter = self.store.append(None, ['User defined'])
-            for userpar in self.cfg['ccs-plot_parameters']:
+            for userpar in self.cfg[cfl.CFG_SECT_PLOT_PARAMETERS]:
                 parameter_model.append(self.useriter, [userpar])
 
-        return
-
     def edit_user_parameter(self, widget, treeview):
         selection = treeview.get_selection()
         model, parpath = selection.get_selected_rows()
+
         try:
-            parent = model[parpath].parent[0]  # Check if selection is an object or the parent tab is selected
-            parname = model[parpath][0]
-            param_values = cfl.edit_user_parameter(self, parname)
-            if param_values:
-                label, apid, st, sst, sid, bytepos, fmt, offbi = param_values
-                self.user_parameters[label] = json.dumps(
-                    {'APID': apid, 'ST': st, 'SST': sst, 'SID': sid, 'bytepos': bytepos, 'format': fmt, 'offbi': offbi})
-        except:
-            param_values = cfl.edit_user_parameter(self)
-            if param_values:
-                label, apid, st, sst, sid, bytepos, fmt, offbi = param_values
-                self.user_parameters[label] = json.dumps(
-                    {'APID': apid, 'ST': st, 'SST': sst, 'SID': sid, 'bytepos': bytepos, 'format': fmt, 'offbi': offbi})
+            if model[parpath].parent is not None and model[parpath].parent[0] == 'User defined':  # Check if selection is an object or the parent tab is selected
+                parname = model[parpath][0]
+                param_values = cfl.edit_user_parameter(self, parname)
+                if param_values:
+                    self.user_parameters.pop(parname)
+                    label, apid, st, sst, sid, bytepos, fmt, offbi = param_values
+                    self.user_parameters[label] = json.dumps(
+                        {'APID': apid, 'ST': st, 'SST': sst, 'SID': sid, 'bytepos': bytepos, 'format': fmt, 'offbi': offbi})
 
-        return
+                    model[parpath][0] = label
+
+            else:
+                return
+                # param_values = cfl.edit_user_parameter(self)
+                # if param_values:
+                #     label, apid, st, sst, sid, bytepos, fmt, offbi = param_values
+                #     self.user_parameters[label] = json.dumps(
+                #         {'APID': apid, 'ST': st, 'SST': sst, 'SID': sid, 'bytepos': bytepos, 'format': fmt, 'offbi': offbi})
+
+        except Exception as err:
+            self.logger.warning(err)
+            return
 
     def create_univie_box(self):
         """
@@ -557,16 +615,16 @@ class PlotViewer(Gtk.Window):
         # Popover creates the popup menu over the button and lets one use multiple buttons for the same one
         self.popover = Gtk.Popover()
         # Add the different Starting Options
-        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
+        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5, margin=4)
         for name in self.cfg['ccs-dbus_names']:
-            start_button = Gtk.Button.new_with_label("Start " + name.capitalize() + '   ')
+            start_button = Gtk.Button.new_with_label("Start " + name.capitalize())
             start_button.connect("clicked", cfl.on_open_univie_clicked)
-            vbox.pack_start(start_button, False, True, 10)
+            vbox.pack_start(start_button, False, True, 0)
 
         # Add the manage connections option
         conn_button = Gtk.Button.new_with_label('Communication')
         conn_button.connect("clicked", self.on_communication_dialog)
-        vbox.pack_start(conn_button, False, True, 10)
+        vbox.pack_start(conn_button, False, True, 0)
 
         # Add the option to see the Credits
         about_button = Gtk.Button.new_with_label('About')
@@ -598,99 +656,160 @@ class PlotViewer(Gtk.Window):
     def get_active_pool_name(self):
         return self.pool_selector.get_active_text()
 
-    def sid_position_query(self, st, sst, sid):
-        length_in_bits = {8: 'B', 16: 'H'}
+    def sid_position_query(self, st, sst, apid, sid):
 
-        sid_search = b''
-
-        dbcon = self.session_factory_idb
-        que = 'SELECT PIC_PI1_OFF, PIC_PI1_WID FROM pic WHERE PIC_TYPE ="{}" AND PIC_STYPE ="{}"'.format(st, sst)
-        dbres = dbcon.execute(que)
-        sid_offset, sid_length = dbres.fetchall()[0]
+        if (st, sst, apid) in self.pi1_lut:
+            sid_offset, sid_bitlen = self.pi1_lut[(st, sst, apid)]
+        else:
+            # dbcon = self.session_factory_idb
+            # que = 'SELECT PIC_PI1_OFF, PIC_PI1_WID FROM pic WHERE PIC_TYPE ="{}" AND PIC_STYPE ="{}" AND PIC_APID ="{}"'.format(st, sst, apid)
+            # dbres = dbcon.execute(que)
+            # sid_offset, sid_bitlen = dbres.fetchall()[0]
+            # dbcon.close()
+            sidinfo = cfl.get_sid(st, sst, apid)
+            if sidinfo:
+                sid_offset, sid_bitlen = sidinfo
+                self.pi1_lut[(st, sst, apid)] = (sid_offset, sid_bitlen)
+            else:
+                return
 
         if sid_offset == -1 or sid == 0:
-            return b'%'
-
-        i = 0
-        while i < sid_offset:
-            i += 1
-            sid_search += b'_'
+            return
 
-        sid_search += struct.pack('>' + length_in_bits[sid_length], sid)
-        sid_search += b'%'
+        # sid_search = b''
+        # i = 0
+        # while i < sid_offset:
+        #     i += 1
+        #     sid_search += b'_'
+        #
+        # sid_search += struct.pack('>' + pi1_length_in_bits[sid_length], sid)
+        # sid_search += b'%'
 
-        dbcon.close()
-        return sid_search
+        return sid_offset, sid_bitlen // 8
 
     def plot_parameter(self, widget=None, parameter=None):
+
+        nocal = not self.calibrate.get_active()
+
         if parameter is not None:
             hk, parameter = parameter
         else:
             selection = self.treeview.get_selection()
             model, treepath = selection.get_selected()
+
+            if treepath is None:
+                return
+
             parameter = model[treepath][0]
+
+            if model[treepath].parent is None:
+                return
+
             hk = model[treepath].parent[0]
 
-        # pool_name = self.loaded_pool.pool_name
         rows = cfl.get_pool_rows(self.loaded_pool.filename)
+        rows = self.set_plot_range(rows)
+
         dbcon = self.session_factory_idb
 
         if hk != 'User defined' and not hk.startswith('UDEF|'):
-            que = 'SELECT pid_type,pid_stype,pid_pi1_val FROM pid LEFT JOIN plf ON pid.pid_spid=plf.plf_spid LEFT JOIN pcf ' \
-                  'ON plf.plf_name=pcf.pcf_name WHERE pcf.pcf_descr="{}" AND pid.pid_descr="{}"'.format(parameter, hk)
-            dbres = dbcon.execute(que)
-            st, sst, sid = dbres.fetchall()[0]
-
-            rows = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst,
-                               DbTelemetry.raw.like(self.sid_position_query(st, sst, sid)))
-            #if sid == 0:
-            #    rows = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst)
-            #else:
-            #    rows = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst, DbTelemetry.data.like(struct.pack('>B', sid) + b'%'))
+            que = 'SELECT pid_type,pid_stype,pid_pi1_val,pid_apid FROM pid LEFT JOIN plf ON pid.pid_spid=plf.plf_spid ' \
+                  'LEFT JOIN pcf ON plf.plf_name=pcf.pcf_name WHERE pcf.pcf_descr="{}" AND ' \
+                  'pid.pid_descr="{}"'.format(parameter, hk)
+            dbres = dbcon.execute(que).fetchall()
+
+            if not dbres:
+                self.logger.error('{} is not a valid parameter.'.format(parameter))
+                return
+
+            st, sst, sid, apid = dbres[0]
 
         elif hk.startswith('UDEF|'):
-            label = hk.strip('UDEF|')
+            label = hk.replace('UDEF|', '')
             tag = [k for k in self.user_tm_decoders if self.user_tm_decoders[k][0] == label][0]
             pktinfo = tag.split('-')
             st = int(pktinfo[0])
             sst = int(pktinfo[1])
-            sid = int(pktinfo[3])
-            #rows = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst,
-            #                   DbTelemetry.data.like(struct.pack('>B', sid) + b'%'))#
-            rows = rows.filter(DbTelemetry.stc == st, DbTelemetry.sst == sst,
-                               DbTelemetry.data.like(self.sid_position_query(st, sst, sid)))
+            apid = int(pktinfo[2]) if pktinfo[2] != 'None' else None
+            sid = int(pktinfo[3]) if pktinfo[3] != 'None' else None
+
         else:
-            userpar = json.loads(self.cfg['ccs-plot_parameters'][parameter])
-            rows = rows.filter(DbTelemetry.stc == userpar['ST'], DbTelemetry.sst == userpar['SST'],
-                               DbTelemetry.apid == userpar['APID'])
+            userpar = json.loads(self.cfg[cfl.CFG_SECT_PLOT_PARAMETERS][parameter])
+            st, sst, apid = userpar['ST'], userpar['SST'], userpar['APID']
+
             if 'SID' in userpar and userpar['SID']:
-                #rows = rows.filter(DbTelemetry.data.like(struct.pack('>B', int(userpar['SID'])) + b'%'))
-                rows = rows.filter(DbTelemetry.raw.like(self.sid_position_query(userpar['ST'], userpar['SST'], userpar['SID'])))
+                sid = userpar['SID']
+            else:
+                sid = None
+
+        if self.sid_position_query(st, sst, apid, sid) is None:
+            if sid:
+                self.logger.error('{}: SID not applicable.'.format(parameter))
+                return
+
+            sid = None
+
+        rows = cfl.filter_rows(rows, st=st, sst=sst, apid=apid, sid=sid)
+
         if not self.filter_tl2.get_active():
-            rows = rows.filter(func.left(DbTelemetry.timestamp, func.length(DbTelemetry.timestamp) - 1) > 2.)
+            rows = cfl.filter_rows(rows, time_from=2.)
+            # rows = rows.filter(func.left(DbTelemetry.timestamp, func.length(DbTelemetry.timestamp) - 1) > 2.)
+
         try:
-            #xy, (descr, unit) = cfl.get_param_values(rows.yield_per(1000).raw, hk, parameter, numerical=True)  ######yield per and the for loop do not work, no idea why not
-            xy, (descr, unit) = cfl.get_param_values([row.raw for row in rows.yield_per(1000)], hk, parameter,
-                                                     numerical=True)
+            # TODO: speedup?
+            if hk in self._pkt_buffer:
+                bufidx, pkts = self._pkt_buffer[hk]
+
+                rows = cfl.filter_rows(rows, idx_from=bufidx+1)
+                if rows.first() is not None:
+                    bufidx = rows.order_by(DbTelemetry.idx.desc()).first().idx
+                    pkts += [row.raw for row in rows.yield_per(1000)]
+                    self._pkt_buffer[hk] = (bufidx, pkts)
+
+            else:
+                pkts = [row.raw for row in rows.yield_per(1000)]
+                if len(pkts) > 0:
+                    bufidx = rows.order_by(DbTelemetry.idx.desc()).first().idx
+                    self._pkt_buffer[hk] = (bufidx, pkts)
+
+            xy, (descr, unit) = cfl.get_param_values(pkts, hk=hk, param=parameter,
+                                                     numerical=True, tmfilter=False, nocal=nocal)
 
             if len(xy) == 0:
                 return
-        except ValueError:
-            Notify.Notification.new("Can't plot {}".format(parameter)).show()
+
+        except (ValueError, TypeError) as err:
+            self.logger.debug(err)
+            self.logger.error("Can't plot {}".format(parameter))
             return
 
+        # store packet info for update worker
         self.data_dict[hk + ':' + descr] = xy
+        self.data_dict_info[hk + ':' + descr] = {}
+        self.data_dict_info[hk + ':' + descr]['idx_last'] = bufidx
+        # self.data_dict_info[hk + ':' + descr]['idx_last'] = rows.order_by(DbTelemetry.idx.desc()).first().idx
+        self.data_dict_info[hk + ':' + descr]['st'] = st
+        self.data_dict_info[hk + ':' + descr]['sst'] = sst
+        self.data_dict_info[hk + ':' + descr]['apid'] = apid
+        self.data_dict_info[hk + ':' + descr]['sid'] = sid
+
         # npoints = self.count_datapoints(self.subplot.get_xlim(), self.subplot.get_ylim())
         # if npoints > self.max_datapoints > 0:
         #     xy = xy.T[::npoints // self.max_datapoints + 1].T
         self.subplot.autoscale(enable=not self.scaley.get_active(), axis='y')
-        if self.plot_diff.get_active():
-            x, y = xy
-            x1 = x[1:]
-            dy = np.diff(y)
-            line = self.subplot.plot(x1, dy, marker='.', label=descr, gid=hk)
-        else:
-            line = self.subplot.plot(*xy, marker='.', label=descr, gid=hk)
+
+        try:
+            if self.plot_diff.get_active():
+                x, y = xy
+                x1 = x[1:]
+                dy = np.diff(y)
+                line = self.subplot.plot(x1, dy, marker='.', label=descr, gid=hk)
+            else:
+                line = self.subplot.plot(*xy, marker='.', label=descr, gid=hk)
+        except TypeError:
+            self.logger.error("Can't plot data of type {}".format(xy.dtype[1]))
+            return
+
         self.reduce_datapoints(self.subplot.get_xlim(), self.subplot.get_ylim(), fulldata=False)
 
         # draw limits if available
@@ -701,7 +820,6 @@ class PlotViewer(Gtk.Window):
         limits = dbres.fetchall()
         dbcon.close()
 
-
         try:
             nlims = limits[0][-3]
             if nlims is not None:
@@ -725,25 +843,36 @@ class PlotViewer(Gtk.Window):
                     limitline.set_visible(show_limits)
                     self.parameter_limits.add(limitline)
         except IndexError:
-            #self.logger.error('Parameter {} does not exist - cannot add!'.format(parameter))
             self.logger.info('Parameter {} does not have limits to plot'.format(parameter))
-            #return
 
         # self.subplot.fill_between([-1e9,1e9],[1,1],[2,2],facecolor='orange',alpha=0.5,hatch='/')
         # self.subplot.fill_between([-1e9,1e9],2,10,facecolor='red',alpha=0.5)
 
-        self.subplot.legend(loc=2,
-                            framealpha=0.5)  # bbox_to_anchor=(0., 1.02, 1., .102),mode="expand", borderaxespad=0)
+        self.subplot.legend(loc=2, framealpha=0.5)  # bbox_to_anchor=(0.,1.02,1.,.102),mode="expand", borderaxespad=0)
         if self.subplot.get_legend() is not None:
             self.subplot.get_legend().set_visible(self.show_legend.get_active())
 
         self.subplot.set_ylabel('[{}]'.format(unit))
-        # print('#################' + descr + '####################')
         self.canvas.draw()
-        # except IndexError:
-        #    print('nothing to plot')
-        # except NameError:
-        #    print('unknown plotting error')
+
+    def set_plot_range(self, rows):
+        try:
+            self.data_min_idx = int(self.min_idx.get_text())
+            rows = rows.filter(DbTelemetry.idx >= self.data_min_idx)
+        except (TypeError, ValueError):
+            self.data_min_idx = None
+        try:
+            self.data_max_idx = int(self.max_idx.get_text())
+            rows = rows.filter(DbTelemetry.idx <= self.data_max_idx)
+        except (TypeError, ValueError):
+            self.data_max_idx = None
+
+        try:
+            self.max_datapoints = int(self.max_data.get_text())
+        except (TypeError, ValueError):
+            self.max_datapoints = 0
+
+        return rows
 
     def _toggle_limits(self, widget=None):
         if widget.get_active():
@@ -754,35 +883,37 @@ class PlotViewer(Gtk.Window):
                 line.set_visible(0)
         self.canvas.draw()
 
-    def _set_max_datapoints(self, widget=None):
-        try:
-            n = int(widget.get_text())
-            if n < 0:
-                widget.set_text('0')
-                n = 0
-        except ValueError:
-            if widget.get_text() == '':
-                n = 0
-                widget.set_text('0')
-            else:
-                widget.set_text('0')
-                return
-        self.max_datapoints = n
+    # def _set_max_datapoints(self, widget=None):
+    #     try:
+    #         n = int(widget.get_text())
+    #         if n < 0:
+    #             widget.set_text('0')
+    #             n = 0
+    #     except (TypeError, ValueError):
+    #         if widget.get_text() == '':
+    #             n = 0
+    #             widget.set_text('0')
+    #         else:
+    #             widget.set_text('0')
+    #             return
+    #     self.max_datapoints = n
 
     def reduce_datapoints(self, xlim, ylim, fulldata=True):
+
         ax = self.canvas.figure.get_axes()[0]
 
-        n_datapoints = self.count_datapoints(xlim, ylim)
-        if n_datapoints > self.max_datapoints > 0:
-            red_fac = n_datapoints // self.max_datapoints + 1
-            for line in ax.lines:
-                if not line.get_label().startswith('_lim_'):
-                    x, y = self.data_dict[line.get_gid() + ':' + line.get_label()]
-                    if self.plot_diff.get_active():
-                        x = x[1:]
-                        y = np.diff(y)
-                    line.set_xdata(x[::red_fac])
-                    line.set_ydata(y[::red_fac])
+        if self.max_datapoints > 0:
+            n_datapoints = self.count_datapoints(xlim, ylim)
+            if n_datapoints > self.max_datapoints:
+                red_fac = n_datapoints // self.max_datapoints + 1
+                for line in ax.lines:
+                    if not line.get_label().startswith('_lim_'):
+                        x, y = self.data_dict[line.get_gid() + ':' + line.get_label()]
+                        if self.plot_diff.get_active():
+                            x = x[1:]
+                            y = np.diff(y)
+                        line.set_xdata(x[::red_fac])
+                        line.set_ydata(y[::red_fac])
         elif fulldata:
             for line in ax.lines:
                 if not line.get_label().startswith('_lim_'):
@@ -804,6 +935,7 @@ class PlotViewer(Gtk.Window):
 
     def clear_parameter(self, widget):
         self.data_dict.clear()
+        self.data_dict_info.clear()
         self.parameter_limits.clear()
         self.subplot.clear()
         self.subplot.grid()
@@ -816,38 +948,35 @@ class PlotViewer(Gtk.Window):
 
     def update_plot_worker(self, plot=None, parameter=None):
         # pool_name = self.pool_box.get_active_text()
-        rows = cfl.get_pool_rows(self.loaded_pool.filename).filter(DbTelemetry.stc == 3, DbTelemetry.sst == 25)
+        rows = cfl.get_pool_rows(self.loaded_pool.filename)
+        rows = self.set_plot_range(rows)
         # xmin, xmax = self.subplot.get_xlim()
         lines = self.subplot.lines
 
+        nocal = not self.calibrate.get_active()
+
         for line in lines:
             parameter = line.get_label()
             if not parameter.startswith('_lim_'):
                 hk = line.get_gid()
 
                 xold, yold = self.data_dict[hk + ':' + parameter]
-                time_last = round(float(xold[-1]), 6)  # np.float64 not properly understood in sql comparison below
-                new_rows = rows.filter(
-                    func.left(DbTelemetry.timestamp, func.length(DbTelemetry.timestamp) - 1) > time_last)
+                # time_last = round(float(xold[-1]), 6)  # np.float64 not properly understood in sql comparison below
+                # new_rows = rows.filter(func.left(DbTelemetry.timestamp, func.length(DbTelemetry.timestamp) - 1) > time_last)
+                pinfo = self.data_dict_info[hk + ':' + parameter]
+                new_rows = cfl.filter_rows(rows, st=pinfo['st'], sst=pinfo['sst'], apid=pinfo['apid'],
+                                           sid=pinfo['sid'], idx_from=pinfo['idx_last'] + 1)
+
                 try:
-                    xnew, ynew = cfl.get_param_values([row.raw for row in new_rows], hk, parameter,
-                                                           numerical=True)[0]
+                    # xnew, ynew = cfl.get_param_values([row.raw for row in new_rows], hk, parameter, numerical=True)[0]
+                    xnew, ynew = cfl.get_param_values([row.raw for row in new_rows], hk, parameter, numerical=True, tmfilter=False, nocal=nocal)[0]
+                    idx_new = new_rows.order_by(DbTelemetry.idx.desc()).first().idx
                 except ValueError:
                     continue
 
                 xy = np.stack([np.append(xold, xnew), np.append(yold, ynew)], -1).T
                 self.data_dict[hk + ':' + parameter] = xy
-
-                # line.set_data(xy)
-
-                # npoints = xy.shape[1]
-                # if npoints > self.max_datapoints > 0:
-                #     line.set_data(xy.T[::npoints//self.max_datapoints].T)
-                # else:
-                #     line.set_data(xy)
-                # line.set_xdata(np.append(xold, xnew))
-                # line.set_ydata(np.append(yold, ynew))
-                # self.subplot.draw_artist(line)
+                self.data_dict_info[hk + ':' + parameter]['idx_last'] = idx_new
 
         self.reduce_datapoints(self.subplot.get_xlim(), self.subplot.get_ylim())
 
@@ -909,9 +1038,12 @@ class PlotViewer(Gtk.Window):
 
     def update_plot(self):
         while self.liveplot:
+            t1 = time.time()
             # GLib.idle_add(self.update_plot_worker, priority=GLib.PRIORITY_HIGH)
             self.update_plot_worker()
-            time.sleep(self.refresh_rate)
+            dt = self.refresh_rate - (time.time() - t1)
+            if dt > 0:
+                time.sleep(dt)
 
     def set_refresh_rate(self, rate):
         self.refresh_rate = rate
@@ -1033,7 +1165,8 @@ class PlotViewer(Gtk.Window):
         #if self.loaded_pool:
         #    return
         if cfl.is_open('poolviewer'):
-            pv = cfl.dbus_connection('poolviewer', cfl.communication['poolviewer'])
+            # pv = cfl.dbus_connection('poolviewer', cfl.communication['poolviewer'])
+            pv = cfl.get_module_handle('poolviewer')
             active_pool = cfl.Variables(pv, 'active_pool_info')
             #active_pool = pv.Variables('active_pool_info')
             if active_pool and active_pool[0]:
@@ -1045,7 +1178,8 @@ class PlotViewer(Gtk.Window):
             #    self.loaded_pool = None
 
         elif cfl.is_open('poolmanager'):
-            pmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
+            # pmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
+            pmgr = cfl.get_module_handle('poolmanager')
             active_pool = cfl.Dictionaries(pmgr, 'loaded_pools')
             #active_pool = pmgr.Dictionaries('loaded_pools')
             #if not active_pool:
@@ -1071,12 +1205,11 @@ class PlotViewer(Gtk.Window):
 
         if self.loaded_pool:
             #self.update_pool_view()
-            self.pool_changed(self.pool_selector, self.loaded_pool)
+            self.pool_changed(self.pool_selector, pool=True) #self.loaded_pool)
 
         #if self.loaded_pool:
         #    self.select_pool(pool=self.loaded_pool)
 
-
     def quit_func(self, *args):
         # Try to tell terminal in the editor that the variable is not longer availabe
         for service in dbus.SessionBus().list_names():
@@ -1128,7 +1261,7 @@ class PlotViewer(Gtk.Window):
             # Both are not in the same project do not change
 
             if not conn.Variables('main_instance') == self.main_instance:
-                self.logger.warning('Application {} is not in the same project as {}: Can not communicate'.format(
+                self.logger.error('Application {} is not in the same project as {}: Can not communicate'.format(
                     self.my_bus_name, self.cfg['ccs-dbus_names'][application] + str(instance)))
                 return
 
@@ -1184,8 +1317,6 @@ class PlotViewer(Gtk.Window):
                                      " = dbus.SessionBus().get_object('" + str(My_Bus_Name) +
                                      "', '/MessageListener')")
 
-
-        #####
         # Get the prev loaded Pools form Viewer and Manager if none is given
         self.update_pool_view()
         self.get_prev_loaded_pools()
@@ -1263,117 +1394,6 @@ class NavigationToolbarX(NavigationToolbar):
 
         self.push_current()
         self.release(event)
-'''
-class UserParameterDialog(Gtk.MessageDialog):
-    def __init__(self, parent=None, edit=None):
-        Gtk.Dialog.__init__(self, "Add User Parameter", parent, 0,
-                            buttons=(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
-
-        self.set_border_width(5)
-
-        box = self.get_content_area()
-        ok_button = self.get_action_area().get_children()[0]
-        ok_button.set_sensitive(False)
-
-        hbox = Gtk.HBox()
-
-        self.apid = Gtk.Entry()
-        self.st = Gtk.Entry()
-        self.sst = Gtk.Entry()
-        self.apid.set_placeholder_text('APID')
-        self.st.set_placeholder_text('Service Type')
-        self.sst.set_placeholder_text('Service Subtype')
-        self.sid = Gtk.Entry()
-        self.sid.set_placeholder_text('SID')
-        self.sid.set_tooltip_text('First byte in source data (optional)')
-
-        hbox.pack_start(self.apid, 0, 0, 0)
-        hbox.pack_start(self.st, 0, 0, 0)
-        hbox.pack_start(self.sst, 0, 0, 0)
-        hbox.pack_start(self.sid, 0, 0, 0)
-        hbox.set_homogeneous(True)
-        hbox.set_spacing(5)
-
-        bytebox = Gtk.HBox()
-
-        self.bytepos = Gtk.Entry()
-        self.bytepos.set_placeholder_text('Byte Offset')
-        self.bytepos.set_tooltip_text('Including {} ({} for TCs) header bytes, e.g. byte 0 in source data -> offset={}'
-                                      .format(TM_HEADER_LEN, TC_HEADER_LEN, TM_HEADER_LEN))
-        self.format = Gtk.ComboBoxText()
-        self.format.set_model(self.create_format_model())
-        self.format.set_tooltip_text('Format type')
-        self.format.connect('changed', self.bitlen_active)
-        self.offbi = Gtk.Entry()
-        self.offbi.set_placeholder_text('Bit Offset')
-        self.offbi.set_tooltip_text('Bit Offset (optional)')
-        self.bitlen = Gtk.Entry()
-        self.bitlen.set_placeholder_text('Bitlength')
-        self.bitlen.set_tooltip_text('Length in bits')
-        self.bitlen.set_sensitive(False)
-
-        bytebox.pack_start(self.bytepos, 0, 0, 0)
-        bytebox.pack_start(self.format, 0, 0, 0)
-        bytebox.pack_start(self.offbi, 0, 0, 0)
-        bytebox.pack_start(self.bitlen, 0, 0, 0)
-        bytebox.set_spacing(5)
-
-        self.label = Gtk.Entry()
-        self.label.set_placeholder_text('Parameter Label')
-        self.label.connect('changed', self.check_ok_sensitive, ok_button)
-
-        box.pack_start(self.label, 0, 0, 0)
-        box.pack_end(bytebox, 0, 0, 0)
-        box.pack_end(hbox, 0, 0, 0)
-        box.set_spacing(10)
-
-        if edit is not None:
-            pars = json.loads(parent.cfg['plot_parameters'][edit])
-            self.label.set_text(edit)
-            if 'ST' in pars:
-                self.st.set_text(str(pars['ST']))
-            if 'SST' in pars:
-                self.sst.set_text(str(pars['SST']))
-            if 'APID' in pars:
-                self.apid.set_text(str(pars['APID']))
-            if 'SID' in pars and pars['SID'] is not None:
-                self.sid.set_text(str(pars['SID']))
-            if 'bytepos' in pars:
-                self.bytepos.set_text(str(pars['bytepos']))
-            if 'format' in pars:
-                fmt_dict = {a: b for b, a in fmtlist.items()}
-                fmt = pars['format']
-                if fmt.startswith('bit'):
-                    self.bitlen.set_text(fmt.strip('bit'))
-                    fmt = 'bit'
-                model = self.format.get_model()
-                it = [row.iter for row in model if row[0] == fmt_dict[fmt]][0]
-                self.format.set_active_iter(it)
-            if 'offbi' in pars:
-                self.offbi.set_text(str(pars['offbi']))
-
-        self.show_all()
-
-    def create_format_model(self):
-        store = Gtk.ListStore(str)
-        for fmt in fmtlist.keys():
-            store.append([fmt])
-        return store
-
-    def check_ok_sensitive(self, unused_widget, button):
-        if len(self.label.get_text()) == 0:
-            button.set_sensitive(False)
-        else:
-            button.set_sensitive(True)
-
-    def bitlen_active(self, widget):
-        if widget.get_active_text() == 'bit*':
-            self.bitlen.set_sensitive(True)
-            self.offbi.set_sensitive(True)
-        else:
-            self.bitlen.set_sensitive(False)
-            self.offbi.set_sensitive(False)
-'''
 
 
 class DataWindow(Gtk.Window):
@@ -1396,7 +1416,7 @@ class SelectPoolDialog(Gtk.Dialog):
         self.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
 
         self.explain_label = Gtk.Label()
-        self.explain_label.set_text("Please select one of the shown Pools to Plot ")
+        self.explain_label.set_text("Please select one of the shown pools to plot.")
 
         self.set_border_width(5)
 
@@ -1418,7 +1438,7 @@ class SelectPoolDialog(Gtk.Dialog):
 
         else:
             self.label = Gtk.Label()
-            self.label.set_text("No Pools could be found")
+            self.label.set_text("No pools could be found")
             ok_button.set_sensitive(False)
 
         box.pack_start(self.explain_label, 0, 0, 0)
@@ -1432,7 +1452,8 @@ class SelectPoolDialog(Gtk.Dialog):
         # Or check between which Pools should be selected
 
         if cfl.is_open('poolmanager'):
-            pmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
+            # pmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
+            pmgr = cfl.get_module_handle('poolmanager')
             self.all_pools = pmgr.Dictionaries('loaded_pools')
             if not self.all_pools:
                 self.loaded_pool = None
@@ -1444,7 +1465,8 @@ class SelectPoolDialog(Gtk.Dialog):
                 self.loaded_pool = list(self.all_pools.keys())
 
         elif cfl.is_open('poolviewer'):
-            pv = cfl.dbus_connection('poolviewer', cfl.communication['poolmanager'])
+            # pv = cfl.dbus_connection('poolviewer', cfl.communication['poolmanager'])
+            pv = cfl.get_module_handle('poolviewer')
             self.all_pools = pv.Variables('active_pool_info')
             if self.all_pools:
                 #loaded_pool = ActivePoolInfo(active_pool[0],active_pool[1],active_pool[2],active_pool[3])
@@ -1487,17 +1509,13 @@ if __name__ == "__main__":
 
     # Important to tell Dbus that Gtk loop can be used before the first dbus command
     DBusGMainLoop(set_as_default=True)
-
     if pool:
         win = PlotViewer(loaded_pool=pool)
     else:
         win = PlotViewer()
-
     Bus_Name = cfg.get('ccs-dbus_names', 'plotter')
     # DBusGMainLoop(set_as_default=True)
     DBus_Basic.MessageListener(win, Bus_Name, *sys.argv)
-
     win.connect("delete-event", win.quit_func)
     win.show_all()
-
     Gtk.main()
\ No newline at end of file
diff --git a/Ccs/poolview_sql.py b/Ccs/poolview_sql.py
index c08344cdeb82a6c2986bdd808d1c31545824488b..25069f778e751db239ff860be4e96ac1901b75a4 100644
--- a/Ccs/poolview_sql.py
+++ b/Ccs/poolview_sql.py
@@ -1,3 +1,4 @@
+import io
 import os
 import importlib
 import json
@@ -22,7 +23,7 @@ matplotlib.use('Gtk3Cairo')
 
 gi.require_version('Gtk', '3.0')
 gi.require_version('Notify', '0.7')
-from gi.repository import Gtk, Gdk, GdkPixbuf, GLib, Notify  # NOQA
+from gi.repository import Gtk, Gdk, GdkPixbuf, GLib, Notify, Pango  # NOQA
 
 from event_storm_squasher import delayed
 
@@ -49,49 +50,49 @@ ActivePoolInfo = NamedTuple(
         ('pool_name', str),
         ('live', bool)])
 
-fmtlist = {'INT8': 'b', 'UINT8': 'B', 'INT16': 'h', 'UINT16': 'H', 'INT32': 'i', 'UINT32': 'I', 'INT64': 'q',
-           'UINT64': 'Q', 'FLOAT': 'f', 'DOUBLE': 'd', 'INT24': 'i24', 'UINT24': 'I24', 'bit*': 'bit'}
+# fmtlist = {'INT8': 'b', 'UINT8': 'B', 'INT16': 'h', 'UINT16': 'H', 'INT32': 'i', 'UINT32': 'I', 'INT64': 'q',
+#            'UINT64': 'Q', 'FLOAT': 'f', 'DOUBLE': 'd', 'INT24': 'i24', 'UINT24': 'I24', 'bit*': 'bit'}
 
 Telemetry = {'PUS': DbTelemetry, 'RMAP': RMapTelemetry, 'FEE': FEEDataTelemetry}
 
 
 class TMPoolView(Gtk.Window):
-    # (label, data columnt alignment)
+    # (label, data column alignment)
 
     column_labels = {'PUS': [('#', 1), ('TM/TC', 1), ("APID", 1), ("SEQ", 1), ("len-7", 1), ("ST", 1), ("SST", 1),
                              ("Dest ID", 1), ("Time", 1), ("Data", 0)],
-                     'RMAP': [('#', 1), ('R/W', 1), ('Verify data', 1), ('Reply', 1), ('Key', 1), ('Transaction ID', 1),
-                              ('Address', 1), ('Data Length', 1), ('Raw', 0)],
-                     'FEE': [('#', 1), ('Type', 1), ('Frame cnt', 1), ('Seq cnt', 1), ('Raw', 0)]}
+                     'RMAP': [('#', 1), ('TYPE', 1), ('R/W', 1), ('VERIFY', 1), ('REPLY', 1), ('INCR', 1),
+                              ('KEY/STAT', 1), ('TA ID', 1), ('ADDRESS', 1), ('DATALEN', 1), ('RAW', 0)],
+                     'FEE': [('#', 1), ('TYPE', 1), ('FRAME CNT', 1), ('SEQ', 1), ('RAW', 0)]}
 
     tm_columns = {'PUS': {'#': [DbTelemetry.idx, 0, None], 'TM/TC': [DbTelemetry.is_tm, 0, None],
                           "APID": [DbTelemetry.apid, 0, None], "SEQ": [DbTelemetry.seq, 0, None],
                           "len-7": [DbTelemetry.len_7, 0, None], "ST": [DbTelemetry.stc, 0, None],
                           "SST": [DbTelemetry.sst, 0, None], "Dest ID": [DbTelemetry.destID, 0, None],
                           "Time": [DbTelemetry.timestamp, 0, None], "Data": [DbTelemetry.data, 0, None]},
-                  'RMAP': {'#': [RMapTelemetry.idx, 0, None], 'R/W': [RMapTelemetry.write, 0, None],
-                           "Verify data": [RMapTelemetry.verify, 0, None], "Reply": [RMapTelemetry.reply, 0, None],
-                           "Key": [RMapTelemetry.keystat, 0, None], "Transaction ID": [RMapTelemetry.taid, 0, None],
-                           "Address": [RMapTelemetry.addr, 0, None], "Data Length": [RMapTelemetry.datalen, 0, None],
-                           "Raw": [RMapTelemetry.raw, 0, None]},
-                  'FEE': {'#': [FEEDataTelemetry.idx, 0, None], 'Type': [FEEDataTelemetry.type, 0, None],
-                          "Frame cnt": [FEEDataTelemetry.framecnt, 0, None],
-                          "Seq cnt": [FEEDataTelemetry.seqcnt, 0, None],
-                          "Raw": [FEEDataTelemetry.raw, 0, None]}}
+                  'RMAP': {'#': [RMapTelemetry.idx, 0, None], 'TYPE': [RMapTelemetry.cmd, 0, None],
+                           'R/W': [RMapTelemetry.write, 0, None], "VERIFY": [RMapTelemetry.verify, 0, None],
+                           "REPLY": [RMapTelemetry.reply, 0, None], 'INCR': [RMapTelemetry.increment, 0, None],
+                           "KEY": [RMapTelemetry.keystat, 0, None], "TA ID": [RMapTelemetry.taid, 0, None],
+                           "ADDRESS": [RMapTelemetry.addr, 0, None], "DATALEN": [RMapTelemetry.datalen, 0, None],
+                           "RAW": [RMapTelemetry.raw, 0, None]},
+                  'FEE': {'#': [FEEDataTelemetry.idx, 0, None], 'TYPE': [FEEDataTelemetry.type, 0, None],
+                          "FRAME CNT": [FEEDataTelemetry.framecnt, 0, None],
+                          "SEQ": [FEEDataTelemetry.seqcnt, 0, None],
+                          "RAW": [FEEDataTelemetry.raw, 0, None]}}
 
     sort_order_dict = {0: Gtk.SortType.ASCENDING, 1: Gtk.SortType.ASCENDING, 2: Gtk.SortType.DESCENDING}
     filter_rules = {}
     rule_box = None
     tmtc = {0: 'TM', 1: 'TC'}
     w_r = {0: 'R', 1: 'W'}
-    autoscroll = 1
-    autoselect = 1
+    cmd_repl = {0: 'rep', 1: 'cmd'}
     sort_order = Gtk.SortType.ASCENDING
     pckt_queue = None
     queues = {}
     row_colour = ''
     colour_filters = {}
-    active_pool_info = None  # type: Union[None, ActivePoolInfo]
+    # active_pool_info = None  # type: Union[None, ActivePoolInfo]
     decoding_type = 'PUS'
     live_signal = {True: '[LIVE]', False: None}
     currently_selected = set()
@@ -111,12 +112,15 @@ class TMPoolView(Gtk.Window):
     shown_limit = 0
     only_scroll = False
 
+    CELLPAD_MAGIC = float(cfg['ccs-misc']['viewer_cell_pad'])
+
     def __init__(self, cfg=cfg, pool_name=None, cfilters='default', standalone=False):
         Gtk.Window.__init__(self, title="Pool View", default_height=800, default_width=1100)
 
         self.refresh_treeview_active = False
         self.cnt = 0
-        self.active_pool_info = ActivePoolInfo(None, None, None, None)
+        # self.active_pool_info = ActivePoolInfo(None, None, None, None)
+        self.active_pool_info = ActivePoolInfo('', 0, '', False)
         self.set_border_width(2)
         self.set_resizable(True)
         self.set_default_size(1150, 1280)
@@ -128,6 +132,9 @@ class TMPoolView(Gtk.Window):
         # self.cfg = confignator.get_config()
         self.cfg = cfg
 
+        self.autoscroll = 1
+        self.autoselect = 1
+
         self.paned = Gtk.Paned(orientation=Gtk.Orientation.HORIZONTAL, wide_handle=True, position=400)
 
         self.statusbar = Gtk.Statusbar()
@@ -571,9 +578,14 @@ class TMPoolView(Gtk.Window):
         self.adj = scrollbar.get_adjustment()
         # get size of tmpool
 
-        if self.active_pool_info.pool_name is not None:
+        if self.active_pool_info.pool_name not in (None, ''):
             self.adj.set_upper(self.count_current_pool_rows())
-        self.adj.set_page_size(25)
+        height = self.treeview.get_allocated_height()
+        column = self.treeview.get_column(0)
+        cell_pad = column.get_cells()[0].get_padding()[1]
+        cell = column.cell_get_size()[-1] + cell_pad * self.CELLPAD_MAGIC
+        nlines = height // cell
+        self.adj.set_page_size(nlines)
         scrollbar.connect('value_changed', self._on_scrollbar_changed, self.adj, False)
         scrollbar.connect('button-press-event', self.scroll_bar)
         # scrollbar.connect('value_changed', self.reselect_rows)
@@ -595,7 +607,7 @@ class TMPoolView(Gtk.Window):
     def create_treeview_columns(self):
         for i, (column_title, align) in enumerate(self.column_labels[self.decoding_type]):
             render = Gtk.CellRendererText(xalign=align)
-            if column_title == "Data":
+            if column_title in ('Data', 'RAW'):
                 render.set_property('font', 'Monospace')
 
             column = Gtk.TreeViewColumn(column_title, render, text=i)
@@ -624,7 +636,11 @@ class TMPoolView(Gtk.Window):
     def set_number_of_treeview_rows(self, widget=None, allocation=None):
         # alloc = widget.get_allocation()
         height = self.treeview.get_allocated_height()
-        cell = 25  #self.treeview.get_columns()[0].cell_get_size()[-1] + 2
+        # height = self.treeview.get_visible_rect().height
+        # cell = 25
+        column = self.treeview.get_column(0)
+        cell_pad = column.get_cells()[0].get_padding()[1]
+        cell = column.cell_get_size()[-1] + cell_pad * self.CELLPAD_MAGIC
         nlines = height // cell
         self.adj.set_page_size(nlines - 1)
         # self._scroll_treeview()
@@ -861,9 +877,6 @@ class TMPoolView(Gtk.Window):
         #print('TIME:::', time.time()-starttime)
         self.treeview.thaw_child_notify()
 
-
-        return
-
     def _filter_rows(self, rows):
         
         def f_rule(x):
@@ -875,7 +888,7 @@ class TMPoolView(Gtk.Window):
                 return x[0] < x[2]
             elif x[1] == '>':
                 return x[0] > x[2]
-            
+
         # for fid in self.filter_rules:
         #     ff = self.filter_rules[fid]
         #     if ff[1] == '==':
@@ -976,116 +989,6 @@ class TMPoolView(Gtk.Window):
             #print(something, self.shown_offset, self.shown_upper_limit)
         self.treeview.thaw_child_notify()   # Tell GTk to reload
 
-        '''
-        # ndel = len(self.pool_liststore)
-        unfiltered_rows = dbrows[2]
-        sorted = dbrows[1]
-        dbrows = dbrows[0]
-        if not dbrows:
-            return
-
-        self.shown_lock.acquire()
-        #self.treeview.freeze_child_notify()
-        #self.pool_liststore.clear()
-
-        if self.shown_diff or self.shown_diff == 0:
-            if self.shown_diff > 0:
-                self.treeview.freeze_child_notify()
-                self.pool_liststore.clear()
-                if sorted:
-                    dbrows = unfiltered_rows.offset(self.shown_offset + self.shown_limit - self.shown_buffer).limit(self.shown_diff)
-                else:
-                    dbrows = unfiltered_rows.filter(DbTelemetry.idx > (self.shown_offset + self.shown_limit - self.shown_buffer)).limit(
-                        self.shown_diff)
-
-                #for row in self.pool_liststore:
-                #    if row[0] == range(self.shown_upper_limit, self.shown_upper_limit - self.shown_diff):
-                #        self.pool_liststore.remove(row.iter)
-
-                if self.shown_offset > self.shown_buffer:
-                    del self.shown_all_rows[0:self.shown_diff]
-
-                x = 0
-                for tm_row in self.shown_all_rows:
-                    if x in range(self.shown_offset + self.shown_diff - self.shown_upper_limit,
-                                  self.shown_offset + self.shown_diff + int(
-                                      self.adj.get_page_size()) - self.shown_upper_limit):
-                        self.pool_liststore.append(tm_row)
-                    x += 1
-
-                if not self.dbrows_list:
-                    t_shown_rows = threading.Thread(target=self.update_shown_buffer)
-                    t_shown_rows.daemon = True
-                    t_shown_rows.start()
-
-                self.dbrows_list.append([dbrows, self.shown_diff])
-                self.treeview.thaw_child_notify()
-
-            elif self.shown_diff == 0:
-                pass
-
-            else:
-                self.treeview.freeze_child_notify()
-                self.pool_liststore.clear()
-                if sorted:
-                    if self.shown_upper_limit > abs(self.shown_diff):
-                        dbrows = unfiltered_rows.offset((self.shown_upper_limit + self.shown_diff)).limit(
-                            self.shown_diff * -1)
-                    else:
-                        dbrows = unfiltered_rows.offset(0).limit(self.shown_diff * -1)
-                else:
-                    if self.shown_upper_limit > abs(self.shown_diff):
-                        dbrows = unfiltered_rows.filter(
-                            DbTelemetry.idx > (self.shown_upper_limit + self.shown_diff)).limit(
-                            self.shown_diff * -1)
-                    else:
-                        dbrows = unfiltered_rows.filter(DbTelemetry.idx > 0).limit(self.shown_diff * -1)
-
-                #for row in self.pool_liststore:
-                #    if row[0] == range(self.offset + self.shown_limit - self.shown_buffer + self.shown_diff,
-                #                       self.offset + self.shown_limit - self.shown_buffer):
-                #        self.pool_liststore.remove(row.iter)
-
-                self.shown_all_rows = self.shown_all_rows[:self.shown_diff]
-
-                if not self.dbrows_list:
-                    t_shown_rows = threading.Thread(target=self.update_shown_buffer)
-                    t_shown_rows.daemon = True
-                    t_shown_rows.start()
-
-                x = 0
-                for tm_row in self.shown_all_rows:
-                    if x in range(self.shown_offset + self.shown_diff - self.shown_upper_limit,
-                                  self.shown_offset + self.shown_diff + int(self.adj.get_page_size()) - self.shown_upper_limit):
-                        self.pool_liststore.append(tm_row)
-                    #if x in range(self.shown_offset + self.shown_diff - self.shown_upper_limit,
-                    #              self.shown_offset - self.shown_upper_limit):
-                        #self.pool_liststore.insert(0, tm_row)
-                    x += 1
-                self.dbrows_list.append([dbrows, self.shown_diff])
-                self.treeview.thaw_child_notify()
-
-            self.shown_offset = 0 if self.shown_offset < 0 else self.shown_offset + self.shown_diff
-            self.shown_upper_limit = 0 if (self.shown_offset - self.shown_buffer) < 0 else self.shown_offset -self.shown_buffer
-            #thread1 = threading.Thread(target=self.update_shown_buffer, kwargs={'rows': dbrows})
-            #thread1.daemon = True
-            #thread1.start()
-
-        else:
-            self.treeview.freeze_child_notify()
-            self.pool_liststore.clear()
-            self.reload_all_shown_rows(dbrows)
-            self.dbrows_list = []
-            self.treeview.thaw_child_notify()
-        #print(time.time()-starttime)
-        # del self.pool_liststore[:ndel]
-        #self.treeview.thaw_child_notify()
-        self.shown_lock.release()
-        self.loaded = 1
-        return
-        '''
-        return
-
     def reload_all_shown_rows(self, dbrows):
         """
         Reload all Packages (shown and in buffer) from the Database
@@ -1316,7 +1219,6 @@ class TMPoolView(Gtk.Window):
             #new_session.close()
             self.shown_lock.release()
 
-
         '''
         running = True
         self.shown_lock.acquire()
@@ -1352,13 +1254,12 @@ class TMPoolView(Gtk.Window):
                 print(2)
         self.dbrows_list = []
         '''
-        return
 
     def format_loaded_rows(self, dbrows):
         '''
         This function converts every packet into a readable form
-        @param dbrows: The rows gotten from SQL query
-        @return: Same Rows in readable form
+        @param dbrows: The rows from SQL query
+        @return: rows in readable form
         '''
 
         tm_rows = []
@@ -1369,18 +1270,25 @@ class TMPoolView(Gtk.Window):
                 tm_rows.append(tm_row)
         elif self.decoding_type == 'RMAP':
             for tm in dbrows:
-                tm_row = [tm.idx, self.w_r[tm.write], tm.verify, tm.reply, tm.keystat, tm.taid, tm.addr, tm.datalen,
-                          tm.raw.hex()]
+                tm_row = [tm.idx, self.cmd_repl[tm.cmd], self.w_r[tm.write], int(tm.verify), int(tm.reply),
+                          int(tm.increment), '0x{:02X}'.format(tm.keystat), tm.taid, self._addr_fmt_hex_str(tm.addr),
+                          tm.datalen, tm.raw.hex()]
                 tm_rows.append(tm_row)
         elif self.decoding_type == 'FEE':
             for tm in dbrows:
                 tm_row = [tm.idx, tm.type, tm.framecnt, tm.seqcnt, tm.raw.hex()]
                 tm_rows.append(tm_row)
         else:
-            self.logger.error('Error in format_loaded_rows_poolviewer, given Format is not valid')
-
+            self.logger.error('Unsupported packet format!')
         return tm_rows
 
+    @staticmethod
+    def _addr_fmt_hex_str(x):
+        if x is not None:
+            return '0x{:08X}'.format(x)
+        else:
+            return ''
+
     def tree_selection_changed(self, selection):
         mode = selection.get_mode()
         model, treepaths = selection.get_selected_rows()
@@ -1647,12 +1555,11 @@ class TMPoolView(Gtk.Window):
         if self.decoding_type == 'PUS':
             return Gtk.ListStore('guint', str, 'guint', 'guint', 'guint', 'guint', 'guint', 'guint', str, str)
         elif self.decoding_type == 'RMAP':
-            return Gtk.ListStore('guint', str, bool, bool, 'guint', 'guint', 'guint', 'guint', str)
+            return Gtk.ListStore('guint', str, str, 'guint', 'guint', 'guint', str, 'guint', str, 'guint', str)
         elif self.decoding_type == 'FEE':
             return Gtk.ListStore('guint', 'guint', 'guint', 'guint', str)
         else:
             self.logger.error('Decoding Type is an unknown value')
-            return
 
     def set_keybinds(self):
 
@@ -1676,9 +1583,12 @@ class TMPoolView(Gtk.Window):
 
         self.pool_selector.set_model(pool_names)
 
-        cell = Gtk.CellRendererText(foreground='red')
-        self.pool_selector.pack_start(cell, 0)
-        self.pool_selector.add_attribute(cell, 'text', 1)
+        type_cell = Gtk.CellRendererText(foreground='gray', style=Pango.Style.ITALIC)
+        self.pool_selector.pack_start(type_cell, 0)
+        self.pool_selector.add_attribute(type_cell, 'text', 2)
+        state_cell = Gtk.CellRendererText(foreground='red')
+        self.pool_selector.pack_start(state_cell, 0)
+        self.pool_selector.add_attribute(state_cell, 'text', 1)
 
         self.pool_selector.connect('changed', self.select_pool)
 
@@ -2096,7 +2006,6 @@ class TMPoolView(Gtk.Window):
                 type = new_session.query(DbTelemetryPool).filter(DbTelemetryPool.pool_name == pool_name)
                 self.Active_Pool_Info_append([pool_name, type.modification_time, pool_name, False])
 
-
             new_session.close()
 
         self.update_columns()
@@ -2111,7 +2020,6 @@ class TMPoolView(Gtk.Window):
         self.adj.set_value(0)
         self._on_scrollbar_changed(adj=self.adj)
 
-
         # queue = self.queues[pool_name]
         #
         # if queue is not None:
@@ -2160,16 +2068,26 @@ class TMPoolView(Gtk.Window):
         # Popover creates the popup menu over the button and lets one use multiple buttons for the same one
         self.popover = Gtk.Popover()
         # Add the different Starting Options
-        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
+        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5, margin=4)
         for name in self.cfg['ccs-dbus_names']:
-            start_button = Gtk.Button.new_with_label("Start " + name.capitalize() + '   ')
+            start_button = Gtk.Button.new_with_label("Start " + name.capitalize())
             start_button.connect("clicked", cfl.on_open_univie_clicked)
-            vbox.pack_start(start_button, False, True, 10)
+            vbox.pack_start(start_button, False, True, 0)
+
+        # Add the TST option
+        conn_button = Gtk.Button.new_with_label('Test Specification Tool')
+        conn_button.connect("clicked", cfl.start_tst)
+        vbox.pack_start(conn_button, True, True, 0)
 
         # Add the manage connections option
         conn_button = Gtk.Button.new_with_label('Communication')
         conn_button.connect("clicked", self.on_communication_dialog)
-        vbox.pack_start(conn_button, False, True, 10)
+        vbox.pack_start(conn_button, True, True, 0)
+
+        # Add the configuration manager option
+        conn_button = Gtk.Button.new_with_label('Preferences')
+        conn_button.connect("clicked", cfl.start_config_editor)
+        vbox.pack_start(conn_button, True, True, 0)
 
         # Add the option to see the Credits
         about_button = Gtk.Button.new_with_label('About')
@@ -2214,7 +2132,7 @@ class TMPoolView(Gtk.Window):
         changed = False
         #self.select_pool(False, new_pool=pool_name)
         model = self.pool_selector.get_model()
-        #It will check all entries in the Pool selector and change to the one if possible
+        # It will check all entries in the Pool selector and change to the one if possible
         count = 0
         while count < len(model):
             value = model.get_value(model.get_iter(count), 0)  # Get the value
@@ -2236,7 +2154,6 @@ class TMPoolView(Gtk.Window):
             cfl.Functions(poolmgr, 'loaded_pools_func', self.active_pool_info.pool_name, self.active_pool_info)
         return
 
-
     def create_tm_data_viewer(self):
         box = Gtk.VBox()
 
@@ -2247,18 +2164,25 @@ class TMPoolView(Gtk.Window):
 
         self.rawswitch = Gtk.CheckButton.new_with_label('Decode Source Data')
         self.rawswitch.connect('toggled', self.set_tm_data_view, None, True)
-        # self.sortswitch = Gtk.CheckButton.new_with_label('Sort by Name')
-        # self.sortswitch.connect('toggled', self.set_tm_data_view, )
-        #switchbox = Gtk.Box(Gtk.Orientation.HORIZONTAL)
-        switchbox = Gtk.HBox()
+        self.rawswitch.connect('toggled', self._update_user_tm_decoders)
+        switchbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
         switchbox.pack_start(self.rawswitch, 0, 0, 0)
-        # switchbox.pack_end(self.sortswitch, 0, 0, 0)
+
+        self.calibrated_switch = Gtk.CheckButton.new_with_label('Calibrated')
+        self.calibrated_switch.set_sensitive(False)
+        self.calibrated_switch.connect('toggled', self.set_tm_data_view, None, True)
+        self.rawswitch.connect('toggled', self._enable_calibrated_switch)
+
+        switchbox.pack_start(self.calibrated_switch, 0, 0, 0)
+
+        ctrlbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
+        ctrlbox.pack_start(switchbox, 0, 0, 0)
 
         self.hexview = Gtk.Label()
         self.hexview.set_selectable(True)
-        switchbox.pack_end(self.hexview, 1, 1, 0)
+        ctrlbox.pack_end(self.hexview, 1, 1, 0)
 
-        box.pack_start(switchbox, 0, 0, 3)
+        box.pack_start(ctrlbox, 0, 0, 3)
 
         scrolled_header_view = Gtk.ScrolledWindow()
         scrolled_header_view.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER)
@@ -2276,11 +2200,27 @@ class TMPoolView(Gtk.Window):
 
         return box
 
+    def _enable_calibrated_switch(self, *args):
+        if self.rawswitch.get_active():
+            self.calibrated_switch.set_sensitive(True)
+            self.calibrated_switch.set_active(True)
+        else:
+            self.calibrated_switch.set_sensitive(False)
+            self.calibrated_switch.set_active(False)
+
     def create_tm_data_viewer_list(self, decode=False, create=False):
         tm_data_model = Gtk.ListStore(str, str, str, str)
         if create:
             listview = Gtk.TreeView()
             listview.set_model(tm_data_model)
+
+            # Set up Drag and Drop
+            listview.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
+            listview.drag_source_set_target_list(None)
+            listview.drag_source_add_text_targets()
+
+            listview.connect("drag-data-get", self.on_drag_tmdata_get)
+
         else:
             listview = self.tm_data_view
             for c in listview.get_columns():
@@ -2306,7 +2246,7 @@ class TMPoolView(Gtk.Window):
             listview.set_tooltip_column(3)
 
         else:
-            for i, column_title in enumerate(['bytepos', 'hex', 'decimal', 'ascii']):
+            for i, column_title in enumerate(['BYTEPOS', 'HEX', 'DEC', 'ASCII']):
                 render = Gtk.CellRendererText()
                 column = Gtk.TreeViewColumn(column_title, render, text=i)
                 # column.set_cell_data_func(render, self.text_colour2)
@@ -2316,26 +2256,35 @@ class TMPoolView(Gtk.Window):
         if create:
             return listview
 
+    def on_drag_tmdata_get(self, treeview, drag_context, selection_data, info, time, *args):
+        treeselection = treeview.get_selection()
+        model, my_iter = treeselection.get_selected()
+        selection_data.set_text('{} = {}'.format(*model[my_iter][:2]), -1)
+
     def create_decoder_bar(self):
         box = Gtk.VBox()
 
         box1 = Gtk.HBox()
-        package_button = Gtk.Button(label = 'Add Package to Decode')
+        package_button = Gtk.Button(label='Create TM Structure')
         package_button.set_image(Gtk.Image.new_from_icon_name('list-add', Gtk.IconSize.MENU))
-        package_button.set_tooltip_text('Add User Defined Package to Decode')
+        package_button.set_tooltip_text('Create user defined TM packet structure')
         package_button.set_always_show_image(True)
 
-        parameter_button = Gtk.Button()
+        parameter_button = Gtk.Button(label='Create Parameter')
         parameter_button.set_image(Gtk.Image.new_from_icon_name('list-add', Gtk.IconSize.MENU))
-        parameter_button.set_tooltip_text('Add User Defined Parameter to use in Package')
+        parameter_button.set_tooltip_text('Create user defined parameter')
         parameter_button.set_always_show_image(True)
 
+        decode_udef_check = Gtk.CheckButton.new_with_label('UDEF')
+        decode_udef_check.set_tooltip_text('Force decoding with custom packet structures')
+
         package_button.connect('clicked', self.add_new_user_package)
         parameter_button.connect('clicked', self.add_decode_parameter)
+        decode_udef_check.connect('toggled', self.set_decoding_order)
 
         box1.pack_start(package_button, 0, 0, 0)
         box1.pack_start(parameter_button, 0, 0, 0)
-
+        box1.pack_start(decode_udef_check, 0, 0, 2)
 
         box2 = Gtk.HBox()
 
@@ -2343,37 +2292,32 @@ class TMPoolView(Gtk.Window):
         decoder_name.set_tooltip_text('Label')
         decoder_name_entry = decoder_name.get_child()
         decoder_name_entry.set_placeholder_text('Label')
-        decoder_name_entry.set_width_chars(5)
+        decoder_name_entry.set_width_chars(10)
 
         decoder_name.set_model(self.create_decoder_model())
 
         bytepos = Gtk.Entry()
-        bytepos.set_placeholder_text('Offset+{}'.format(TM_HEADER_LEN))
-        bytepos.set_tooltip_text('Offset+{}'.format(TM_HEADER_LEN))
-        bytepos.set_width_chars(5)
+        bytepos.set_placeholder_text('Offset')  # +{}'.format(TM_HEADER_LEN))
+        bytepos.set_tooltip_text('Offset')  # +{}'.format(TM_HEADER_LEN))
+        bytepos.set_width_chars(7)
 
         bytelength = Gtk.Entry()
         bytelength.set_placeholder_text('Length')
         bytelength.set_tooltip_text('Length')
-        bytelength.set_width_chars(5)
+        bytelength.set_width_chars(7)
 
         add_button = Gtk.Button(label=' Decoder')
         add_button.set_image(Gtk.Image.new_from_icon_name('list-add', Gtk.IconSize.MENU))
+        add_button.set_tooltip_text('Add byte decoder')
         add_button.set_always_show_image(True)
 
-        decode_udef_check = Gtk.CheckButton.new_with_label('UDEF')
-        decode_udef_check.set_tooltip_text('Use User-defined Packets first for Decoding')
-
         decoder_name.connect('changed', self.fill_decoder_mask, bytepos, bytelength)
         add_button.connect('clicked', self.add_decoder, decoder_name, bytepos, bytelength)
-        decode_udef_check.connect('toggled', self.set_decoding_order)
 
-
-        box2.pack_start(decoder_name, 0, 0, 0)
-        box2.pack_start(bytepos, 0, 0, 1)
-        box2.pack_start(bytelength, 0, 0, 1)
+        box2.pack_start(decoder_name, 0, 1, 0)
+        box2.pack_start(bytepos, 0, 0, 0)
+        box2.pack_start(bytelength, 0, 0, 0)
         box2.pack_start(add_button, 0, 0, 0)
-        box2.pack_start(decode_udef_check, 0, 0, 0)
 
         box.pack_start(box1, 0, 0, 0)
         box.pack_start(box2, 0, 0, 0)
@@ -2398,8 +2342,6 @@ class TMPoolView(Gtk.Window):
 
         self.set_tm_data_view()
 
-        return
-
     def create_decoder_model(self):
         model = Gtk.ListStore(str)
 
@@ -2420,17 +2362,17 @@ class TMPoolView(Gtk.Window):
         # if not self.cfg.has_option('user_decoders',decoder):
         #    return
 
-        if self.cfg.has_option('ccs-plot_parameters', decoder):
-            data = json.loads(self.cfg['ccs-plot_parameters'][decoder])
+        if self.cfg.has_option('ccs-user_decoders', decoder):
+            data = json.loads(self.cfg['ccs-user_decoders'][decoder])
 
             bytepos.set_text(str(data['bytepos']))
-            bytelen.set_text(str(struct.calcsize(data['format'])))
+            bytelen.set_text(str(data['bytelen']))
 
     def add_decoder(self, widget, decoder_name, byteoffset, bytelength):
         try:
-            label, bytepos, bytelen = decoder_name.get_active_text(), int(byteoffset.get_text()), int(
-                bytelength.get_text())
-        except:
+            label, bytepos, bytelen = decoder_name.get_active_text(), int(byteoffset.get_text()), int(bytelength.get_text())
+        except Exception as err:
+            self.logger.info(err)
             return
 
         if label in (None, ''):
@@ -2446,7 +2388,7 @@ class TMPoolView(Gtk.Window):
 
         box = Gtk.HBox()
 
-        name = Gtk.Label(decoder_name.get_active_text())
+        name = Gtk.Label(label=decoder_name.get_active_text())
         name.set_tooltip_text('bytes {}-{}'.format(bytepos, bytepos + bytelen - 1))
         hexa = Gtk.Label()
         uint = Gtk.Label()
@@ -2476,7 +2418,7 @@ class TMPoolView(Gtk.Window):
         self.show_all()
 
     def set_decoder_view(self, tm):
-        decoders = self.decoder_box.get_children()[1:]
+        decoders = self.decoder_box.get_children()[0].get_children()[2:]
 
         for decoder in decoders:
             try:
@@ -2487,7 +2429,8 @@ class TMPoolView(Gtk.Window):
                 hexa.set_label(byts.hex().upper())
                 uint.set_label(str(int.from_bytes(byts, 'big')))
                 bina.set_label(bin(int.from_bytes(byts, 'big'))[2:])
-            except:
+            except Exception as err:
+                self.logger.info(err)
                 hexa.set_label('###')
                 uint.set_label('###')
                 bina.set_label('###')
@@ -2497,17 +2440,23 @@ class TMPoolView(Gtk.Window):
             model, treepath = widget.get_selected_rows()
             if treepath:
                 value = model[treepath[0]][3]
-                #print(list(model[treepath[0]]))
-                #print(value)
-                #print(type(value))
                 self.hexview.set_text(value)
 
+    def _update_user_tm_decoders(self, widget):
+        if widget.get_active():
+            importlib.reload(cfl)
+
     @delayed(10)
-    def set_tm_data_view(self, selection=None, event=None, change_columns=False):
-        if not self.active_pool_info or not self.decoding_type == 'PUS':
-            self.logger.info('Can not decode parameters for RMAP or FEE data packets')
+    def set_tm_data_view(self, selection=None, event=None, change_columns=False, floatfmt='.7G'):
+        if not self.active_pool_info:
+            self.logger.warning('No active pool')
+            return
+
+        if self.decoding_type != 'PUS' and self.rawswitch.get_active():
+            self.logger.info('Cannot decode parameters for RMAP or FEE data packets')
             buf = Gtk.TextBuffer(text='Parameter view not available for non-PUS packets')
             self.tm_header_view.set_buffer(buf)
+            self.tm_data_view.get_model().clear()
             return
 
         if change_columns:
@@ -2548,7 +2497,6 @@ class TMPoolView(Gtk.Window):
             self.last_decoded_row = rowidx
 
         tm_index = model[treepath[0]][0]
-        # tm_index = self.active_row
         new_session = self.session_factory_storage
         raw = new_session.query(
             Telemetry[self.decoding_type].raw
@@ -2563,35 +2511,41 @@ class TMPoolView(Gtk.Window):
             new_session.close()
             return
         tm = raw[0]
-        # new_session.commit()
         new_session.close()
         self.set_decoder_view(tm)
 
         if self.rawswitch.get_active():
             self.tm_header_view.set_monospace(False)
             datamodel.clear()
+            nocalibration = not self.calibrated_switch.get_active()
             try:
-                # buf = Gtk.TextBuffer(text=self.ccs.Tmformatted(tm, sort_by_name=self.sortswitch.get_active()))
                 if self.UDEF:
-                    data = cfl.Tmformatted(tm, textmode=False, UDEF=True)
+                    data = cfl.Tmformatted(tm, textmode=False, udef=True, nocal=nocalibration, floatfmt=floatfmt)
                     buf = Gtk.TextBuffer(text=cfl.Tm_header_formatted(tm) + '\n{}\n'.format(data[1]))
                     self._feed_tm_data_view_model(datamodel, data[0])
                 else:
-                    data = cfl.Tmformatted(tm, textmode=False)
+                    data = cfl.Tmformatted(tm, textmode=False, nocal=nocalibration, floatfmt=floatfmt)
                     buf = Gtk.TextBuffer(text=cfl.Tm_header_formatted(tm) + '\n{}\n'.format(data[1]))
                     self._feed_tm_data_view_model(datamodel, data[0])
 
             except Exception as error:
                 buf = Gtk.TextBuffer(text='Error in decoding packet data:\n{}\n'.format(error))
-                # print(traceback.format_exc())
 
         else:
             self.tm_header_view.set_monospace(False)
-            head = cfl.Tm_header_formatted(tm, detailed=True)
-            headlen = TC_HEADER_LEN if (tm[0] >> 4 & 1) else TM_HEADER_LEN
+
+            if self.decoding_type != 'PUS':
+                tmio = io.BytesIO(tm)
+                headers, _, _ = cfl.extract_spw(tmio)
+                header = headers[0].raw
+                headlen = len(header)
+                head = cfl.spw_header_formatted(headers[0])
+            else:
+                head = cfl.Tm_header_formatted(tm, detailed=True)
+                headlen = TC_HEADER_LEN if (tm[0] >> 4 & 1) else TM_HEADER_LEN
 
             tmsource = tm[headlen:]
-            byteview = [[str(n + headlen), '{:02X}'.format(i), str(i), ascii(chr(i)).strip("'")] for n, i in enumerate(tmsource[:-PEC_LEN])]
+            byteview = [[str(n + headlen), '{:02X}'.format(i), str(i), ascii(chr(i)).strip("'")] for n, i in enumerate(tmsource[:])]
             self._feed_tm_data_view_model(datamodel, byteview)
             buf = Gtk.TextBuffer(text=head + '\n')
 
@@ -2919,9 +2873,7 @@ class TMPoolView(Gtk.Window):
         else:
             # If not PUS open all other possible types but show RMAP
             for packet_type in Telemetry:
-                if packet_type == 'PUS':
-                    pass
-                elif packet_type == 'RMAP':
+                if packet_type == 'RMAP':
                     model = self.pool_selector.get_model()
                     iter = model.append([self.active_pool_info.pool_name, self.live_signal[self.active_pool_info.live], packet_type])
                     self.pool_selector.set_active_iter(iter)   # Always show the RMAP pool when created
@@ -2938,9 +2890,10 @@ class TMPoolView(Gtk.Window):
             self.stop_butt.set_sensitive(True)
         else:
             self.stop_butt.set_sensitive(False)
-        refresh_rate = 1
 
-        GLib.timeout_add(refresh_rate * 1000, self.show_data_rate, refresh_rate, instance, priority=GLib.PRIORITY_DEFAULT)
+        refresh_rate = 1  # in Hz
+
+        GLib.timeout_add(1000 / refresh_rate, self.show_data_rate, refresh_rate, instance, priority=GLib.PRIORITY_DEFAULT)
         return True
 
     def collect_packet_data(self, widget):
@@ -3055,11 +3008,7 @@ class TMPoolView(Gtk.Window):
         res = self.session_factory_storage.execute(que)
         return [row[1] for row in res]
 
-    def plot_parameters(self, widget=None, parameters={}, start_live=False):
-        #if self.active_pool_info is None:
-        #    self.logger.warning('Cannot open plot window without pool!')
-        #    print('Cannot open plot window without pool!')
-        #    return
+    def plot_parameters(self, widget=None, parameters=None, start_live=False):
 
         cfl.start_plotter(pool_name=self.active_pool_info.pool_name)
 
@@ -3225,10 +3174,7 @@ class TMPoolView(Gtk.Window):
             # cnt = rows.count()
             cnt = rows.order_by(Telemetry[self.decoding_type].idx.desc()).first().idx
             # print(cnt)
-            rows = rows.filter(Telemetry[self.decoding_type].idx > (cnt - 100)).offset(100 - 25
-                                                                     ).limit(
-                25
-            ).all()
+            rows = rows.filter(Telemetry[self.decoding_type].idx > (cnt - 100)).offset(100 - 25).limit(25).all()
             # rr=[row for row in rows]
             self.logger.info('fetched', rows[-1].idx, cnt, 'at', time.time())
             dbcon.close()
@@ -3265,9 +3211,10 @@ class TMPoolView(Gtk.Window):
             instance = 1
         try:
             pmgr = cfl.dbus_connection('poolmanager', instance)
-            trashbytes, tc_data_rate, data_rate = pmgr.Functions('calc_data_rate', self.active_pool_info.filename, refresh_rate)
+            trashbytes, tc_data_rate, data_rate, tc_rx_bytes = pmgr.Functions('calc_data_rate', self.active_pool_info.filename, refresh_rate)
             self.statusbar.push(0, 'Trash: {:d} B | TC: {:7.3f} KiB/s | TM: {:7.3f} KiB/s'.format(
                 trashbytes, tc_data_rate/1024, data_rate/1024))
+            self.statusbar.set_tooltip_text('TCRX: {:d} B | TC: {:7.3f} kbps | TM: {:7.3f} kbps'.format(tc_rx_bytes, tc_data_rate/1000*8, data_rate/1000*8))
         except Exception as err:
             self.logger.debug(err)
 
@@ -3314,8 +3261,7 @@ class ExtractionDialog(Gtk.MessageDialog):
 class SavePoolDialog(Gtk.FileChooserDialog):
     def __init__(self, parent=None, decoding_type='PUS'):
         super(SavePoolDialog, self).__init__(title="Save packets", parent=parent, action=Gtk.FileChooserAction.SAVE)
-        self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
-                                                      Gtk.STOCK_SAVE, Gtk.ResponseType.OK)
+        self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.OK)
 
         # self.set_transient_for(parent)
 
diff --git a/Ccs/pus_datapool.py b/Ccs/pus_datapool.py
index 4f8506843d161d1b496f4893b75b854afc536d9e..af08b64e69da8493fd43552753110e12a7e378b7 100644
--- a/Ccs/pus_datapool.py
+++ b/Ccs/pus_datapool.py
@@ -30,6 +30,7 @@ from typing import NamedTuple
 from collections import deque
 from database.tm_db import DbTelemetryPool, DbTelemetry, scoped_session_maker, FEEDataTelemetry, RMapTelemetry
 import importlib
+from sqlalchemy.exc import OperationalError as SQLOperationalError
 
 
 cfg = confignator.get_config(check_interpolation=False)
@@ -42,19 +43,23 @@ TMHeader, TCHeader, PHeader, TM_HEADER_LEN, TC_HEADER_LEN, P_HEADER_LEN, PEC_LEN
      packet_config.TC_HEADER_LEN, packet_config.P_HEADER_LEN, packet_config.PEC_LEN, packet_config.MAX_PKT_LEN,
      packet_config.timepack, packet_config.timecal]
 
-RMapCommandHeader, RMapReplyWriteHeader, RMapReplyReadHeader = packet_config.RMapCommandHeader, \
-                                                               packet_config.RMapReplyWriteHeader, \
-                                                               packet_config.RMapReplyReadHeader
+# RMAP and FEE protocols are only supported in SMILE
+if project.endswith('SMILE'):
+    RMapCommandHeader, RMapReplyWriteHeader, RMapReplyReadHeader = packet_config.RMapCommandHeader, \
+                                                                   packet_config.RMapReplyWriteHeader, \
+                                                                   packet_config.RMapReplyReadHeader
 
-RMAP_COMMAND_HEADER_LEN, RMAP_REPLY_WRITE_HEADER_LEN, RMAP_REPLY_READ_HEADER_LEN, RMAP_PEC_LEN = \
-    packet_config.RMAP_COMMAND_HEADER_LEN, packet_config.RMAP_REPLY_WRITE_HEADER_LEN, \
-    packet_config.RMAP_REPLY_READ_HEADER_LEN, packet_config.RMAP_PEC_LEN
+    RMAP_COMMAND_HEADER_LEN, RMAP_REPLY_WRITE_HEADER_LEN, RMAP_REPLY_READ_HEADER_LEN, RMAP_PEC_LEN = \
+        packet_config.RMAP_COMMAND_HEADER_LEN, packet_config.RMAP_REPLY_WRITE_HEADER_LEN, \
+        packet_config.RMAP_REPLY_READ_HEADER_LEN, packet_config.RMAP_PEC_LEN
 
 PLM_PKT_PREFIX_TM = packet_config.PLM_PKT_PREFIX_TM
 PLM_PKT_PREFIX_TC = packet_config.PLM_PKT_PREFIX_TC
 PLM_PKT_PREFIX_TC_SEND = packet_config.PLM_PKT_PREFIX_TC_SEND
 PLM_PKT_SUFFIX = packet_config.PLM_PKT_SUFFIX
 
+SOCK_TO_LIMIT = 900  # number of tm_recv socket timeouts before SQL session reconnect
+
 communication = {}
 for name in cfg['ccs-dbus_names']:
     communication[name] = 0
@@ -74,9 +79,6 @@ def get_scoped_session_factory():
 class DatapoolManager:
     # pecmodes = ['ignore', 'warn', 'discard']
 
-    # defaults
-    pecmode = 'warn'
-
     # crcfunc = packet_config.puscrc
     # crcfunc_rmap = packet_config.rmapcrc
 
@@ -89,8 +91,10 @@ class DatapoolManager:
     PROTOCOL_IDS = {packet_config.SPW_PROTOCOL_IDS[key]: key for key in packet_config.SPW_PROTOCOL_IDS}
     # MAX_PKT_LEN = packet_config.RMAP_MAX_PKT_LEN
 
-    tmtc = {0: 'TM', 1: 'TC'}
-    tsync_flag = {0: 'U', 1: 'S', 5: 'S'}
+    tmtc = cfl.tmtc
+    tsync_flag = cfl.tsync_flag
+    # tmtc = {0: 'TM', 1: 'TC'}
+    # tsync_flag = {0: 'U', 1: 'S', 5: 'S'}
 
     lock = threading.Lock()
     own_gui = None
@@ -108,6 +112,7 @@ class DatapoolManager:
         self.cfg = confignator.get_config()
 
         self.commit_interval = float(self.cfg['ccs-database']['commit_interval'])
+        self.pecmode = self.cfg['ccs-misc']['pec_mode'].lower()
 
         # Set up the logger
         self.logger = cfl.start_logging('PoolManager')
@@ -127,6 +132,7 @@ class DatapoolManager:
         self.pool_rows = {}  # entries in MySQL "tm_pool" table
         self.databuflen = 0
         self.tc_databuflen = 0
+        self.tc_databuflen_rx = 0  # counts the received bytes on the TC connection, if drop_rx=True
         self.trashbytes = {None: 0}
         self.state = {}
         self.filtered_pckts = {}
@@ -230,7 +236,7 @@ class DatapoolManager:
             # new_session.flush()
             new_session.commit()
             new_session.close()
-            self.lo('DELETED POOL\n >{}<\nFROM DB'.format(pool_name))
+            self.logger.info('DELETED POOL\n >{}<\nFROM DB'.format(pool_name))
         return
 
     def _clear_db(self):
@@ -285,9 +291,11 @@ class DatapoolManager:
                     timestamp))
 
             new_session.commit()
+            return 0
         except Exception as err:
             self.logger.error("Error trying to delete old DB rows: {}".format(err))
             new_session.rollback()
+            return 1
         finally:
             new_session.close()
 
@@ -406,7 +414,7 @@ class DatapoolManager:
             self.logger.warning('"{}" is not a supported protocol, aborting.'.format(protocol))
             return
 
-        self.logger.info('Recording from new connection {}:{} to pool "{}" using {} protocol.'.format(host, port, protocol, pool_name))
+        self.logger.info('Recording from new connection {}:{} to pool "{}" using {} protocol.'.format(host, port, pool_name, protocol))
         new_session = self.session_factory_storage
         while True:
             dbrow = new_session.query(DbTelemetryPool).filter(DbTelemetryPool.pool_name == pool_name).first()
@@ -456,7 +464,7 @@ class DatapoolManager:
         return
 
     def connect_tc(self, pool_name, host, port, protocol='PUS', drop_rx=True, timeout=10, is_server=False, options='',
-                   override_with_options=False):
+                   override_with_options=False, use_socket=None):
 
         # override variables that are set in the options string
         if bool(override_with_options):
@@ -466,32 +474,46 @@ class DatapoolManager:
             drop_rx = override.get('drop_rx', drop_rx)
             timeout = override.get('timeout', timeout)
             is_server = override.get('is_server', is_server)
+            use_socket = override.get('use_socket', use_socket)
             # options = override.get('options', options)
 
-        if is_server:
-            socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            socketserver.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-            socketserver.settimeout(timeout)
-            socketserver.bind((host, port))
-            socketserver.listen()
-            try:
-                sockfd, addr = socketserver.accept()
-            except socket.timeout:
-                socketserver.close()
-                self.logger.error("Connection timeout, no client has connected to {}:{}".format(host, port))
-                return
+        if use_socket is not None:
+            if isinstance(use_socket, socket.socket):
+                sockfd = use_socket
+            elif isinstance(use_socket, str):
+                try:
+                    sockfd = self.connections[use_socket]['socket']
+                except KeyError:
+                    self.logger.error('No existing socket found for "{}"'.format(use_socket))
+                    raise KeyError('No existing socket found for "{}"'.format(use_socket))
+            else:
+                self.logger.error('use_socket must be of type str or socket')
+                raise TypeError('use_socket must be of type str or socket')
         else:
-            sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            sockfd.settimeout(timeout)
+            if is_server:
+                socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+                socketserver.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+                socketserver.settimeout(timeout)
+                socketserver.bind((host, port))
+                socketserver.listen()
+                try:
+                    sockfd, addr = socketserver.accept()
+                except socket.timeout:
+                    socketserver.close()
+                    self.logger.error("Connection timeout, no client has connected to {}:{}".format(host, port))
+                    return
+            else:
+                sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+                sockfd.settimeout(timeout)
 
-            if pool_name in self.tc_connections:
-                self.logger.warning('Pool "{}" already has TC connection to {}!'.format(pool_name, self.tc_connections[pool_name]['socket'].getpeername()))
-                return
-            try:
-                sockfd.connect((host, port))
-            except ConnectionRefusedError:
-                self.logger.error("Connection to {}:{} refused".format(host, port))
-                return
+                if pool_name in self.tc_connections:
+                    self.logger.warning('Pool "{}" already has TC connection to {}!'.format(pool_name, self.tc_connections[pool_name]['socket'].getpeername()))
+                    return
+                try:
+                    sockfd.connect((host, port))
+                except ConnectionRefusedError:
+                    self.logger.error("Connection to {}:{} refused".format(host, port))
+                    return
 
         self.tc_sock = sockfd
         self.tc_name = pool_name
@@ -648,16 +670,17 @@ class DatapoolManager:
         # if not pool_name in self.state:
         #     start_new = True
 
-        new_session = self.session_factory_storage
+        new_session = self.session_factory_storage()
+        _tocnt = 0  # timeout counter
+        creation_time = round(time.time())
 
         # If no TC Pool has been started start new one
         if start_new:
             pool_row = DbTelemetryPool(
                 pool_name=pool_name,
-                modification_time=time.time(),
+                modification_time=creation_time,
                 protocol=protocol)
             new_session.add(pool_row)
-            # new_session.flush()
             new_session.commit()
             self.trashbytes[pool_name] = 0
             self.state[pool_name] = 1
@@ -706,6 +729,7 @@ class DatapoolManager:
         # set short timeout to commit last packet, in case no further one is received
         sockfd.settimeout(1.)
 
+        checkcrc = True if self.pecmode in ('warn', 'discard') else False
         pkt_size_stream = b''
         while self.connections[pool_name]['recording']:
             if sockfd.fileno() < 0:
@@ -771,29 +795,30 @@ class DatapoolManager:
                             break
                         buf += d
 
-                    while self.crc_check(buf):
-                        buf = buf[1:] + tail
-                        self.trashbytes[pool_name] += 1
-                        while len(buf) < 6:
-                            buf += sockfd.recv(6 - len(buf))
-                        pkt_len = struct.unpack('>4xH', buf[:6])[0] + 7
-                        if pkt_len > MAX_PKT_LEN:
-                            tail = b''
-                            continue
-                        while pkt_len > len(buf):
-                            buf += sockfd.recv(pkt_len - len(buf))
-                        if pkt_len < len(buf):
-                            tail = buf[pkt_len:]
-                            buf = buf[:pkt_len]
-                        else:
-                            tail = b''
+                    # if self.pecmode == 'discard':
+                    # process if wrong CRC?
+                    # while self.crc_check(buf):
+                    #     buf = buf[1:] + tail
+                    #     self.trashbytes[pool_name] += 1
+                    #     while len(buf) < 6:
+                    #         buf += sockfd.recv(6 - len(buf))
+                    #     pkt_len = struct.unpack('>4xH', buf[:6])[0] + 7
+                    #     if pkt_len > MAX_PKT_LEN:
+                    #         tail = b''
+                    #         continue
+                    #     while pkt_len > len(buf):
+                    #         buf += sockfd.recv(pkt_len - len(buf))
+                    #     if pkt_len < len(buf):
+                    #         tail = buf[pkt_len:]
+                    #         buf = buf[:pkt_len]
+                    #     else:
+                    #         tail = b''
+
                     pkt_size_stream = tail
 
-                # buf = sockfd.recv(self.pckt_size_max)
                 if not buf:
                     break
-                with self.lock:
-                    self.databuflen += len(buf)
+
                 if not drop_rx:
                     if pckt_filter:
                         for pkt in self.extract_pus(buf):
@@ -802,27 +827,47 @@ class DatapoolManager:
                                 self.filtered_pckts[pool_name].append(buf)
                             else:
                                 self.decode_tmdump_and_process_packets_internal(pkt, process_tm, pckt_decoded=tm,
-                                                                                checkcrc=False)
+                                                                                checkcrc=checkcrc)
                     else:
-                        self.decode_tmdump_and_process_packets_internal(buf, process_tm, checkcrc=False)
+                        self.decode_tmdump_and_process_packets_internal(buf, process_tm, checkcrc=checkcrc)
+
+                    _tocnt = 0
+
+                with self.lock:
+                    self.databuflen += len(buf)
+
             except socket.timeout as e:
-                self.logger.info('Socket timeout ({}:{})'.format(host, port))
+                # self.logger.debug('Socket timeout ({}:{})'.format(host, port))
+                # reconnect SQL session handle after x socket timeouts to avoid SQL timeout
+                _tocnt += 1
                 new_session.commit()
-                continue
+                if _tocnt > SOCK_TO_LIMIT:
+                    new_session.close()
+                    pool_row = new_session.query(DbTelemetryPool).filter(DbTelemetryPool.pool_name == pool_name,
+                                                                         DbTelemetryPool.modification_time == creation_time).first()
+                    self.logger.debug('SQL session reconnected, SOCK_SQL_TO_LIMIT reached ({})'.format(SOCK_TO_LIMIT))
+                    _tocnt = 0
+            except SQLOperationalError as e:
+                self.logger.warning(e)
+                new_session.close()
+                pool_row = new_session.query(DbTelemetryPool).filter(DbTelemetryPool.pool_name == pool_name,
+                                                                     DbTelemetryPool.modification_time == creation_time).first()
+                pkt_size_stream = buf + pkt_size_stream  # re-read buffer in next loop since DB insertion has failed
             except socket.error as e:
                 self.logger.error('Socket error ({}:{})'.format(host, port))
                 self.logger.exception(e)
-                # self.logger.error('ERROR: socket error')
-                self.connections[pool_name]['recording'] = False
                 break
             except struct.error as e:
                 self.logger.error('Lost connection to {}:{}'.format(host, port))
                 self.logger.exception(e)
-                self.connections[pool_name]['recording'] = False
                 break
-        # if self.state[pool_row.pool_name] % 10 != 0:
+            except Exception as e:
+                self.logger.exception(e)
+                break
+
         new_session.commit()
         new_session.close()
+        self.connections[pool_name]['recording'] = False
         self.logger.warning('Disconnected from ' + str(host) + ':' + str(port))
         sockfd.close()
 
@@ -929,7 +974,7 @@ class DatapoolManager:
                     buf = ack
 
                 # PUS, just read packets and discard them
-                else:
+                elif protocol.lower() == 'pus':
                     pkt_size_stream = sockfd.recv(6)
                     while len(pkt_size_stream) < 6:
                         data = sockfd.recv(1)
@@ -945,10 +990,14 @@ class DatapoolManager:
                             break
                         buf += d
 
+                # any other protocol, just read from socket and discard
+                else:
+                    buf = sockfd.recv(1024)
+
                 with self.lock:
-                    self.databuflen += len(buf)
+                    self.tc_databuflen_rx += len(buf)
             except socket.timeout:
-                self.logger.info('Socket timeout {}:{} [TC RX]'.format(host, port))
+                self.logger.debug('Socket timeout {}:{} [TC RX]'.format(host, port))
                 continue
             except socket.error:
                 self.logger.error('Socket error')
@@ -979,26 +1028,12 @@ class DatapoolManager:
         else:
             buf_to_send = buf
 
-        self.logger.debug('tc_send: pool_name = {}'.format(pool_name))
-        self.logger.debug('tc_send: buf = {}'.format(buf_to_send))
-
         if pool_name not in self.loaded_pools:
             self.logger.warning("Cannot add TC to {}. Pool not loaded.".format(pool_name))
             return
         # self.logger.debug('tc_send: tc_connections = {}'.format(self.tc_connections))
 
-        try:
-            self.tc_connections[pool_name]['socket'].send(buf_to_send)
-        except Exception as err:
-            self.logger.error('Failed to send packet of length {} to {} [{}].'.format(
-                len(buf_to_send), pool_name, self.tc_connections[pool_name]['socket'].getpeername()))
-            return
-
-        with self.lock:
-            self.tc_databuflen += len(buf_to_send)
-
-        new_session = self.session_factory_storage
-
+        new_session = self.session_factory_storage()
         pool_row = new_session.query(DbTelemetryPool).filter(DbTelemetryPool.pool_name == pool_name).first()
 
         # TC normally just take the information which pool it is from the first Row, But if a Pool is given with only
@@ -1023,6 +1058,19 @@ class DatapoolManager:
             self.state[pool_name] = 1
             self.last_commit_time = time.time()
 
+        try:
+            self.tc_connections[pool_name]['socket'].send(buf_to_send)
+        except Exception as err:
+            self.logger.error('Failed to send packet of length {} to {} [{}].'.format(
+                len(buf_to_send), pool_name, self.tc_connections[pool_name]['socket'].getpeername()))
+            return
+
+        self.logger.debug('tc_send: pool_name = {}'.format(pool_name))
+        self.logger.debug('tc_send: buf = {}'.format(buf_to_send))
+
+        with self.lock:
+            self.tc_databuflen += len(buf_to_send)
+
         def process_tm(tmd, tm_raw):
             tm = tmd[0]
 
@@ -1052,35 +1100,31 @@ class DatapoolManager:
             self.state[pool_row.pool_name] += 1
             new_session.commit()
 
-        self.decode_tmdump_and_process_packets_internal(buf, process_tm)
+        if self.tc_connections[pool_name]['protocol'].upper() in ('PUS', 'PLMSIM'):
+            checkcrc = True
+            self.decode_tmdump_and_process_packets_internal(buf, process_tm, checkcrc=checkcrc)
+
+        # if TC is not PUS, also handle it properly
+        elif self.tc_connections[pool_name]['protocol'].upper() == 'SPW':
+            buf = io.BytesIO(buf)
+            headers, pkts, _ = self.extract_spw(buf)
+            for header, pkt in zip(headers, pkts):
+                self.process_rmap(header, pkt, pool_name, pool_row=pool_row)
+        else:
+            self.logger.warning('Unknown TC protocol, cannot store {} in DB'.format(buf))
         new_session.close()
-        return
 
     def crc_check(self, pckt):
-        # return bool(self.crcfunc(pckt))
-        return bool(packet_config.puscrc(pckt))
+        return cfl.crc_check(pckt)
 
     def read_pus(self, data):
         """
         Read single PUS packet from buffer
 
-        @param data: has to be seekable
+        @param data: has to be peekable
         @return: single PUS packet as byte string or _None_
         """
-        pus_size = data.peek(10)
-
-        if len(pus_size) >= 6:
-            pus_size = pus_size[4:6]
-        elif 0 < len(pus_size) < 6:
-            start_pos = data.tell()
-            pus_size = data.read(6)[4:6]
-            data.seek(start_pos)
-        elif len(pus_size) == 0:
-            return
-
-        # packet size is header size (6) + pus size field + 1
-        pckt_size = int.from_bytes(pus_size, 'big') + 7
-        return data.read(pckt_size)
+        return cfl.read_pus(data)
 
     def extract_pus(self, data):
         """
@@ -1088,17 +1132,7 @@ class DatapoolManager:
         @param data:
         @return:
         """
-        pckts = []
-        if isinstance(data, bytes):
-            data = io.BufferedReader(io.BytesIO(data))
-
-        while True:
-            pckt = self.read_pus(data)
-            if pckt is not None:
-                pckts.append(pckt)
-            else:
-                break
-        return pckts
+        return cfl.extract_pus(data)
 
     def extract_pus_brute_search(self, data, filename=None):
         """
@@ -1107,79 +1141,25 @@ class DatapoolManager:
         @param filename:
         @return:
         """
-
-        pckts = []
-        if isinstance(data, bytes):
-            data = io.BufferedReader(io.BytesIO(data))
-        elif isinstance(data, io.BufferedReader):
-            pass
-        else:
-            raise TypeError('Cannot handle input of type {}'.format(type(data)))
-
-        while True:
-            pos = data.tell()
-            pckt = self.read_pus(data)
-            if pckt is not None:
-                if not self.crc_check(pckt):
-                    pckts.append(pckt)
-                else:
-                    data.seek(pos + 1)
-                    if filename is not None:
-                        self.trashbytes[filename] += 1
-            else:
-                break
-
-        return pckts
+        return cfl.extract_pus_brute_search(data, filename=filename, trashcnt=self.trashbytes)
 
     # @staticmethod
     def unpack_pus(self, pckt):
         """
         Decode PUS and return header parameters and data field
+
         :param pckt:
         :return:
         """
-        try:
-            tmtc = pckt[0] >> 4 & 1
-            dhead = pckt[0] >> 3 & 1
-
-            if tmtc == 0 and dhead == 1 and (len(pckt) >= TM_HEADER_LEN):
-                header = TMHeader()
-                header.bin[:] = pckt[:TM_HEADER_LEN]
-                data = pckt[TM_HEADER_LEN:-PEC_LEN]
-                crc = pckt[-PEC_LEN:]
-
-            elif tmtc == 1 and dhead == 1 and (len(pckt) >= TC_HEADER_LEN):
-                header = TCHeader()
-                header.bin[:] = pckt[:TC_HEADER_LEN]
-                data = pckt[TC_HEADER_LEN:-PEC_LEN]
-                crc = pckt[-PEC_LEN:]
-
-            else:
-                header = PHeader()
-                header.bin[:P_HEADER_LEN] = pckt[:P_HEADER_LEN]
-                data = pckt[P_HEADER_LEN:]
-                crc = None
-
-            head_pars = header.bits
-
-        except Exception as err:
-            self.logger.warning('Error unpacking PUS packet: {}\n{}'.format(pckt, err))
-            head_pars = None
-            data = None
-            crc = None
-
-        finally:
-            return head_pars, data, crc
+        return cfl.unpack_pus(pckt, logger=self.logger)
 
     def cuc_time_str(self, head):
-        try:
-            if head.PKT_TYPE == 0 and head.SEC_HEAD_FLAG == 1:
-                return '{:.6f}{}'.format(head.CTIME + head.FTIME / timepack[2], self.tsync_flag[head.TIMESYNC])
-            else:
-                return ''
-        except Exception as err:
-            self.logger.info(err)
-            return ''
+        """
+
+        :param head:
+        :return:
+        """
+        return cfl.cuc_time_str(head, logger=self.logger)
 
     def decode_tmdump_and_process_packets(self, filename, processor, brute=False):
         buf = open(filename, 'rb').read()
@@ -1192,8 +1172,6 @@ class DatapoolManager:
             processor(pckt_decoded, buf)
             return
 
-        decode = self.unpack_pus
-
         if brute:
             pckts = self.extract_pus_brute_search(buf, filename=filename)
             checkcrc = False  # CRC already performed during brute_search
@@ -1201,26 +1179,27 @@ class DatapoolManager:
             pckts = self.extract_pus(buf)
 
         for pckt in pckts:
+            # this CRC only works for PUS packets
             if checkcrc:
-                if self.crc_check(pckt):
+                calc = cfl.crc(pckt)
+                if calc:
+                    chk = int.from_bytes(pckt[-PEC_LEN:], 'big')
                     if self.pecmode == 'warn':
                         if len(pckt) > 7:
-                            self.logger.info(
-                                'decode_tmdump_and_process_packets_internal: [CRC error]: packet with seq nr ' + str(
-                                    int(pckt[5:7].hex(), 16)) + '\n')
+                            self.logger.warning('[CRC error]: is {:0{plen}X}, calc {:0{plen}X} [{}...]'.format(chk, calc, pckt[:6].hex().upper(), plen=PEC_LEN * 2))
                         else:
-                            self.logger.info('INVALID packet -- too short' + '\n')
+                            self.logger.warning('INVALID packet -- too short: {}'.format(pckt.hex().upper()))
                     elif self.pecmode == 'discard':
                         if len(pckt) > 7:
-                            self.logger.info(
-                                '[CRC error]: packet with seq nr ' + str(int(pckt[5:7].hex(), 16)) + ' (discarded)\n')
+                            self.logger.warning('[CRC error]: is {:0{plen}X}, calc {:0{plen}X}'.format(chk, calc, plen=PEC_LEN*2))
+                            self.logger.warning('[CRC error]: packet discarded: {}'.format(pckt.hex().upper()))
                         else:
-                            self.logger.info('INVALID packet -- too short' + '\n')
+                            self.logger.warning('INVALID packet -- too short: {}'.format(pckt.hex().upper()))
                         continue
 
-            pckt_decoded = decode(pckt)
+            pckt_decoded = self.unpack_pus(pckt)
             if pckt_decoded == (None, None, None):
-                self.logger.warning('Could not interpret bytestream: {}. DISCARDING DATA'.format(pckt.hex()))
+                self.logger.warning('Could not interpret packet: {}. DISCARDING DATA'.format(pckt.hex().upper()))
                 continue
             elif isinstance(pckt_decoded[0]._b_base_, PHeader):
                 self.logger.info('Non-PUS packet received: {}'.format(pckt))
@@ -1239,7 +1218,6 @@ class DatapoolManager:
 
         if protocol == 'PUS':
             buf = buf.read()
-            decode = self.unpack_pus
             if brute:
                 pckts = self.extract_pus_brute_search(buf, filename=filename)
                 checkcrc = False  # CRC already performed during brute_search
@@ -1266,7 +1244,7 @@ class DatapoolManager:
                                 self.logger.info('INVALID packet -- too short' + '\n')
                             continue
 
-                pcktdicts.append(processor(decode(pckt), pckt))
+                pcktdicts.append(processor(self.unpack_pus(pckt), pckt))
                 pcktcount += 1
                 if pcktcount % bulk_insert_size == 0:
                     new_session.execute(DbTelemetry.__table__.insert(), pcktdicts)
@@ -1543,20 +1521,20 @@ class DatapoolManager:
     def socket_send_packed_data(self, packdata, poolname):
         cncsocket = self.tc_connections[poolname]['socket']
         cncsocket.send(packdata)
-        received = None
+        received = b''
         try:
             received = cncsocket.recv(MAX_PKT_LEN)
             # self.logger.info.write(logtf(self.tnow()) + ' ' + recv[6:].decode() + ' [CnC]\n')
-            self.logger.info(received.decode(errors='replace') + ' [CnC]')
+            self.logger.info(received.decode('utf-8', errors='replace') + ' [CnC]')
             # logfile.flush()
             # s.close()
             # self.counters[1804] += 1
         except socket.timeout:
-            self.logger.error('Got a timeout')
-            self.logger.exception(socket.timeout)
+            # self.logger.error('Got a timeout')
+            self.logger.error(socket.timeout)
 
         # Dbus does not like original data type
-        if received is not None:
+        if received:
             received = dbus.ByteArray(received)
 
         return received
@@ -1575,7 +1553,7 @@ class DatapoolManager:
                     trashbytes = 0
             else:
                 trashbytes = 0
-            return [trashbytes, tc_data_rate, data_rate]
+            return [trashbytes, tc_data_rate, data_rate, self.tc_databuflen_rx]
 
     def spw_receiver_del_old_pool(self, pool_name, try_delete=True, delete_abandoned=True):
         new_session = self.session_factory_storage
@@ -1653,7 +1631,6 @@ class DatapoolManager:
                     return
 
                 pid, header, buf, pkt_size_stream = self.read_spw_from_socket(sockfd, pkt_size_stream)
-
                 if buf is None and pkt_size_stream is not None:
                     self.trashbytes[pool_name] += 1
                     continue
@@ -1732,7 +1709,7 @@ class DatapoolManager:
                 header.bits.PKT_TYPE == 0 and header.bits.WRITE == 1):
             pktsize = hsize
         else:
-            pktsize = hsize + header.bits.DATA_LEN + RMAP_PEC_LEN
+            pktsize = hsize + header.bits.DATA_LEN + RMAP_PEC_LEN  # TODO: data CRC from FEEsim?
 
         while len(buf) < pktsize:
             d = sockfd.recv(pktsize - len(buf))
@@ -1745,10 +1722,15 @@ class DatapoolManager:
 
         return pid, header, buf, pkt_size_stream
 
-    def process_rmap(self, header, raw, pool_name, db_insert=True):
+    def process_rmap(self, header, raw, pool_name, pool_row=None, db_insert=True):
+        dbsession = self.session_factory_storage
         pkt = header.bits
+        if pool_row is not None:
+            pool_id = pool_row.iid
+        else:
+            pool_id = self.pool_rows[pool_name].iid
         newdbrow = RMapTelemetry(
-            pool_id=self.pool_rows[pool_name].iid,
+            pool_id=pool_id,
             idx=self.state[pool_name],
             cmd=pkt.PKT_TYPE,
             write=pkt.WRITE,
@@ -1765,11 +1747,12 @@ class DatapoolManager:
             self.state[pool_name] += 1
             return newdbrow
 
-        self.session_factory_storage.add(newdbrow)
+        dbsession.add(newdbrow)
         self.state[pool_name] += 1
+        self.logger.debug('feed: {}'.format(newdbrow.raw.hex()))
         now = time.time()
         if (now - self.last_commit_time) > self.commit_interval:
-            self.session_factory_storage.commit()
+            dbsession.commit()
             self.last_commit_time = now
 
     def process_feedata(self, header, raw, pool_name):
@@ -1807,7 +1790,7 @@ class DatapoolManager:
                 break
             tla, pid = pkt_size_stream[:2]
 
-            if (tla == self.TLA) and (pid in self.PROTOCOL_IDS):
+            if pid in self.PROTOCOL_IDS:
                 buf = pkt_size_stream
             else:
                 pkt_size_stream = pkt_size_stream[1:]
@@ -1849,7 +1832,7 @@ class DatapoolManager:
             while len(buf) < pktsize:
                 data = stream.read(pktsize - len(buf))
                 if not data:
-                    return pckts, pkt_size_stream
+                    return headers, pckts, pkt_size_stream
                 buf += data
 
             buf = buf[:pktsize]
@@ -2189,16 +2172,16 @@ class PUSDatapoolManagerGUI(Gtk.ApplicationWindow):
         # Popover creates the popup menu over the button and lets one use multiple buttons for the same one
         self.popover = Gtk.Popover()
         # Add the different Starting Options
-        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
+        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5, margin=4)
         for name in self.cfg['ccs-dbus_names']:
-            start_button = Gtk.Button.new_with_label("Start " + name.capitalize() + '   ')
+            start_button = Gtk.Button.new_with_label("Start " + name.capitalize())
             start_button.connect("clicked", cfl.on_open_univie_clicked)
-            vbox.pack_start(start_button, False, True, 10)
+            vbox.pack_start(start_button, False, True, 0)
 
         # Add the manage connections option
         conn_button = Gtk.Button.new_with_label('Communication')
         conn_button.connect("clicked", self.on_communication_dialog)
-        vbox.pack_start(conn_button, False, True, 10)
+        vbox.pack_start(conn_button, False, True, 0)
 
         # Add the option to see the Credits
         about_button = Gtk.Button.new_with_label('About')
@@ -2573,6 +2556,21 @@ def run():
     Gtk.main()
 
 
+def _start_new_pmgr(*args):
+    dialog = Gtk.MessageDialog()
+    dialog.add_buttons(Gtk.STOCK_NO, Gtk.ResponseType.NO, Gtk.STOCK_YES, Gtk.ResponseType.YES,)
+    dialog.set_title('Poolmanager')
+    dialog.set_markup('A poolmanager instance is already running. Start another one?')
+    response = dialog.run()
+
+    if response == Gtk.ResponseType.YES:
+        dialog.destroy()
+        return True
+    else:
+        dialog.destroy()
+        return False
+
+
 if __name__ == "__main__":
 
     # Important to tell Dbus that Gtk loop can be used before the first dbus command
@@ -2586,6 +2584,12 @@ if __name__ == "__main__":
     # Check all dbus connections to find all running poolmanagers
     for service in dbus.SessionBus().list_names():
         if service.startswith(cfg['ccs-dbus_names']['poolmanager']):
+
+            # ask if new pmgr should be started if one is already running
+            start_new = _start_new_pmgr()
+            if not start_new:
+                sys.exit()
+
             managers.append(service)
             break
 
@@ -2633,69 +2637,3 @@ if __name__ == "__main__":
         # If no poolmanager with given instance name is found start a new poolmanager
         if startnew:
             run()
-
-'''
-    # Check if Poolmanager is already running
-    if cfl.is_open('poolmanager', cfl.communication['poolmanager']):
-        pmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
-        gui = pmgr.Variables('gui_running')
-        running = True
-    else:
-        running = False
-    #try:
-    #    dbus_type = dbus.SessionBus()
-    #    Bus_Name = cfg.get('ccs-dbus_names', 'poolmanager')
-    #    dbus_type.get_object(Bus_Name, '/MessageListener')
-    #    running = True
-    #except:
-    #    running = False
-
-    # If argument --gui is given and if poolmanager is not running start manager with GUI
-    if not '--nogui' in sys.argv and not running:
-        #sys.argv.remove('--gui')
-        pm = PUSDatapoolManager()
-
-        # pm.connect_to(label='new tm', host='127.0.0.1', port=5570, kind='TM')
-        # pm.connect_to(label='new tc', host='127.0.0.1', port=5571, kind='TC')
-        #signal.signal(signal.SIGINT, signal.SIG_DFL)
-
-        Bus_Name = cfg.get('ccs-dbus_names', 'poolmanager')
-        #DBusGMainLoop(set_as_default=True)
-        DBus_Basic.MessageListener(pm, Bus_Name, *sys.argv)
-
-        pm.start_gui()
-
-        Gtk.main()
-
-    # If Manager is not running start it without a GUI
-    elif not running:
-        Bus_Name = cfg.get('ccs-dbus_names', 'poolmanager')
-        #DBusGMainLoop(set_as_default=True)
-        pv = PUSDatapoolManager()
-        DBus_Basic.MessageListener(pv, Bus_Name, *sys.argv)
-
-        Gtk.main()
-
-    # If Manager is running and argument --background is given do nothing and keep Poolmanager running without a GUI
-    # Do the same if a GUI is already running (prevents 2 GUIs)
-    elif running and gui:
-        #sys.argv.remove('--gui')
-        pm = PUSDatapoolManager()
-
-        # pm.connect_to(label='new tm', host='127.0.0.1', port=5570, kind='TM')
-        # pm.connect_to(label='new tc', host='127.0.0.1', port=5571, kind='TC')
-        #signal.signal(signal.SIGINT, signal.SIG_DFL)
-
-        Bus_Name = cfg.get('ccs-dbus_names', 'poolmanager')
-        #DBusGMainLoop(set_as_default=True)
-        DBus_Basic.MessageListener(pm, Bus_Name, *sys.argv)
-
-        pm.start_gui()
-
-        Gtk.main()
-
-    # If Manager is Running and nothing else is given open the GUI
-    else:
-        pmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
-        pmgr.Functions('start_gui')
-'''
diff --git a/Ccs/scripts/connection_setup.py b/Ccs/scripts/connection_setup.py
index 7cf45b7f2bdfeda939c6cee62ca66dbf529959b7..2e76052d6cc4431111fb65dd5e15568ddf11c2cf 100644
--- a/Ccs/scripts/connection_setup.py
+++ b/Ccs/scripts/connection_setup.py
@@ -11,5 +11,5 @@ cfl.connect_tc('LIVE', '', 5571, protocol='PUS')
 cfl.start_pv()
 
 #! CCS.BREAKPOINT
+### Monitor ###
 cfl.start_monitor('LIVE')
-# cfl.set_monitor('LIVE')
diff --git a/Ccs/scripts/iwf_egse_template.py b/Ccs/scripts/iwf_egse_template.py
new file mode 100644
index 0000000000000000000000000000000000000000..fe29d0297e37361d6267ff5dba6f7d3de377f13c
--- /dev/null
+++ b/Ccs/scripts/iwf_egse_template.py
@@ -0,0 +1,38 @@
+import communication as com
+import iwf_egse as iwf
+
+econ = com.Connector('', iwf.PORT, msgdecoding='ascii')
+econ.connect()
+
+def save_egse_tm(data, ts=None):
+    if data.startswith(b'k'):
+        htr=int(data[12:16].decode(),16)
+        msg='{}\t{}\t{}({:.3f} V)\n'.format(ts, data.decode(),htr,htr/4095*5)
+    else:
+        msg='{}\t{}'.format(ts, data.decode())
+    return msg
+
+econ.start_receiver(procfunc=save_egse_tm, outfile='egselog.dat')
+
+econ.send(iwf.Command.get_status(), rx=False)
+econ.send(iwf.Command.set_psu_ok_signal(1,1), rx=False)  # set IWF_EGSE_PSU_OK = 1
+econ.send(iwf.Command.set_psu_ok_signal(3,1), rx=False)  # set IWF_EGSE_RSE_OK = 1
+econ.send(iwf.Command.set_psu_ok_signal(4,1), rx=False)  # set IWF_EGSE_PIN_PULL_OK = 1
+econ.send(iwf.Command.set_rsm_end_switch(1,1), rx=False)  # set IWF_EGSE_CLOSE_POS = 1; response 'R7' -> only for EBOX
+econ.send(iwf.Command.set_psu_analogue_value(iwf.Signal.EGSE_I_HEATER, 2000), rx=False)  # set IWF_EGSE_I_HEATER
+econ.send(iwf.Command.set_pwm(2, 1663), rx=False)  # set CCD Thermistor
+
+econ.send(iwf.Command.inject_errors(6,0,3,0,11,0), rx=False)  # inject RSE error
+
+import time
+cfl.Tcsend_DB('SASW ModHkPeriodCmd', 101, 1, pool_name='LIVE')
+for i in range(0,4001,1):
+    t=time.time()
+    econ.send(iwf.Command.set_pwm(2, i), rx=False)
+    print(i,t)
+    time.sleep(1-(time.time()-t))
+econ.send(iwf.Command.set_pwm(2, 0), rx=False)
+cfl.Tcsend_DB('SASW ModHkPeriodCmd', 101, 40, pool_name='LIVE')
+
+for i in range(1,5):
+    econ.send(iwf.Command.set_psu_analogue_value(i, 0), rx=False)
diff --git a/Ccs/scripts/tc_templates_v1.3.0_20220808.py b/Ccs/scripts/tc_templates_v1.3.0_20220808.py
deleted file mode 100644
index 6760815af0decda08b9c4b83454328519fb4d669..0000000000000000000000000000000000000000
--- a/Ccs/scripts/tc_templates_v1.3.0_20220808.py
+++ /dev/null
@@ -1,796 +0,0 @@
-# SMILE TC templates generated from schema mib_smile_sxi (VDF:1.1.2)
-# Date: 2022-08-12
-
-# TC(3,1): SASW CreHkCmd [KSC50052]
-# Create a Housekeeping Parameter Report Structure
-SidNoCal = None  # KSP50190
-Period = None  # KSP50173
-NParam = None  # KSP50171
-ParamId = None  # KSP50172
-cfl.Tcsend_DB('SASW CreHkCmd', SidNoCal, Period, NParam, ParamId, pool_name='PLM')
-
-
-# TC(3,3): SASW DelHkCmd [KSC50053]
-# Delete a Housekeeping or Diagnostic Parameter Report Structure
-SidNoCal = None  # KSP50190
-cfl.Tcsend_DB('SASW DelHkCmd', SidNoCal, pool_name='PLM')
-
-
-# TC(3,5): SASW EnbHkCmd [KSC50054]
-# Enable Periodic Generation of a Housekeeping Parameter Report St
-SidNoCal = None  # KSP50190
-cfl.Tcsend_DB('SASW EnbHkCmd', SidNoCal, pool_name='PLM')
-
-
-# TC(3,6): SASW DisHkCmd [KSC50055]
-# Disable Periodic Generation of a Housekeeping Parameter Report S
-SidNoCal = None  # KSP50190
-cfl.Tcsend_DB('SASW DisHkCmd', SidNoCal, pool_name='PLM')
-
-
-# TC(3,9): SASW RepStructHkCmd [KSC50056]
-# Report Housekeeping Parameter Report Structure
-SidNoCal = None  # KSP50190
-cfl.Tcsend_DB('SASW RepStructHkCmd', SidNoCal, pool_name='PLM')
-
-
-# TC(3,128): SASW ReqHkRepCmd [KSC50060]
-# Request a Housekeeping Report
-SidNoCal = None  # KSP50190
-cfl.Tcsend_DB('SASW ReqHkRepCmd', SidNoCal, pool_name='PLM')
-
-
-# TC(3,131): SASW ModHkPeriodCmd [KSC50061]
-# Modify the Period of Housekeeping Parameter Report Structures
-SidNoCal = None  # KSP50190
-Period = None  # KSP50173
-cfl.Tcsend_DB('SASW ModHkPeriodCmd', SidNoCal, Period, pool_name='PLM')
-
-
-# TC(5,5): SASW EnbCmd [KSC50137]
-# Enable Generation of Event Identifiers
-NEvtId = None  # KSP50048
-EvtId = None  # KSP50043
-cfl.Tcsend_DB('SASW EnbCmd', NEvtId, EvtId, pool_name='PLM')
-
-
-# TC(5,6): SASW DisCmd [KSC50138]
-# Disable Generation of Event Identifiers
-NEvtId = None  # KSP50048
-EvtId = None  # KSP50043
-cfl.Tcsend_DB('SASW DisCmd', NEvtId, EvtId, pool_name='PLM')
-
-
-# TC(6,2): SASW LoadCmd [KSC50139]
-# Load Memory using Absolute Addresses
-WriteMemoryId = None  # KSP50203
-StartAddress = None  # KSP50202
-BlockLength = None  # KSP50199
-BlockData = None  # KSP50198
-cfl.Tcsend_DB('SASW LoadCmd', WriteMemoryId, StartAddress, BlockLength, BlockData, pool_name='PLM')
-
-
-# TC(6,5): SASW DumpCmd [KSC50140]
-# Dump Memory using Absolute Addresses
-ReadMemoryId = None  # KSP50201
-StartAddress = None  # KSP50202
-BlockLength = None  # KSP50199
-cfl.Tcsend_DB('SASW DumpCmd', ReadMemoryId, StartAddress, BlockLength, pool_name='PLM')
-
-
-# TC(9,128): SASW TimeUpdt [KSC50142]
-# Update Time
-ObtTime = None  # KSP50372
-cfl.Tcsend_DB('SASW TimeUpdt', ObtTime, pool_name='PLM')
-
-
-# TC(13,8): SASW DownAbortCmd [KSC50147]
-# Abort Downlink
-SduId = None  # KSP50195
-cfl.Tcsend_DB('SASW DownAbortCmd', SduId, pool_name='PLM')
-
-
-# TC(13,9): SASW UpFirstCmd [KSC50148]
-# First Uplink Part
-SduId = None  # KSP50195
-SduSeqNmb = None  # KSP50196
-SduDataPartLength = None  # KSP50194
-SduDataPart = None  # KSP50193
-cfl.Tcsend_DB('SASW UpFirstCmd', SduId, SduSeqNmb, SduDataPartLength, SduDataPart, pool_name='PLM')
-
-
-# TC(13,10): SASW UpInterCmd [KSC50149]
-# Intermediate Uplink Part
-SduId = None  # KSP50195
-SduSeqNmb = None  # KSP50196
-SduDataPartLength = None  # KSP50194
-SduDataPart = None  # KSP50193
-cfl.Tcsend_DB('SASW UpInterCmd', SduId, SduSeqNmb, SduDataPartLength, SduDataPart, pool_name='PLM')
-
-
-# TC(13,11): SASW UpLastCmd [KSC50150]
-# Last Uplink Part
-SduId = None  # KSP50195
-SduSeqNmb = None  # KSP50196
-SduDataPartLength = None  # KSP50194
-SduDataPart = None  # KSP50193
-cfl.Tcsend_DB('SASW UpLastCmd', SduId, SduSeqNmb, SduDataPartLength, SduDataPart, pool_name='PLM')
-
-
-# TC(13,129): SASW StartDownCmd [KSC50152]
-# Trigger Large Packet Down-Transfer
-SduId = None  # KSP50195
-cfl.Tcsend_DB('SASW StartDownCmd', SduId, pool_name='PLM')
-
-
-# TC(17,1): SASW AreYouAliveCmd [KSC50153]
-# Perform Are-You-Alive Connection Test
-cfl.Tcsend_DB('SASW AreYouAliveCmd', pool_name='PLM')
-
-
-# TC(20,1): SASW RepParamValuesCmd [KSC50155]
-# Report Parameter Values
-ParamSetId = None  # KSP50281
-cfl.Tcsend_DB('SASW RepParamValuesCmd', ParamSetId, pool_name='PLM')
-
-
-# TC(20,3): SASW SetParValAdcRngsCmd [KSC50159]
-# Set Parameter Values for ADC Ranges
-# ParamSetId = ADC_RANGES  # KSP50281 [NOT EDITABLE]
-P3V9WarnLowerLimit = None  # KSP50278
-P3V9AlarmLowerLimit = None  # KSP50276
-P3V9WarnUpperLimit = None  # KSP50279
-P3V9AlarmUpperLimit = None  # KSP50277
-P3V3WarnLowerLimit = None  # KSP50270
-P3V3AlarmLowerLimit = None  # KSP50268
-P3V3WarnUpperLimit = None  # KSP50271
-P3V3AlarmUpperLimit = None  # KSP50269
-P3V3_LVDSWarnLowerLimit = None  # KSP50274
-P3V3_LVDSAlarmLowerLimit = None  # KSP50272
-P3V3_LVDSWarnUpperLimit = None  # KSP50275
-P3V3_LVDSAlarmUpperLimit = None  # KSP50273
-P2V5WarnLowerLimit = None  # KSP50266
-P2V5AlarmLowerLimit = None  # KSP50264
-P2V5WarnUpperLimit = None  # KSP50267
-P2V5AlarmUpperLimit = None  # KSP50265
-P1V8WarnLowerLimit = None  # KSP50262
-P1V8AlarmLowerLimit = None  # KSP50260
-P1V8WarnUpperLimit = None  # KSP50263
-P1V8AlarmUpperLimit = None  # KSP50261
-P1V2WarnLowerLimit = None  # KSP50258
-P1V2AlarmLowerLimit = None  # KSP50256
-P1V2WarnUpperLimit = None  # KSP50259
-P1V2AlarmUpperLimit = None  # KSP50257
-RefWarnLowerLimit = None  # KSP50284
-RefAlarmLowerLimit = None  # KSP50282
-RefWarnUpperLimit = None  # KSP50285
-RefAlarmUpperLimit = None  # KSP50283
-TEMP1WarnLowerLimit = None  # KSP50291
-TEMP1AlarmLowerLimit = None  # KSP50289
-TEMP1WarnUpperLimit = None  # KSP50292
-TEMP1AlarmUpperLimit = None  # KSP50290
-TEMP_FEEWarnLowerLimit = None  # KSP50299
-TEMP_FEEAlarmLowerLimit = None  # KSP50297
-TEMP_FEEWarnUpperLimit = None  # KSP50300
-TEMP_FEEAlarmUpperLimit = None  # KSP50298
-TEMP_CCDWarnLowerLimit = None  # KSP50295
-TEMP_CCDAlarmLowerLimit = None  # KSP50293
-TEMP_CCDWarnUpperLimit = None  # KSP50296
-TEMP_CCDAlarmUpperLimit = None  # KSP50294
-I_FEE_ANAWarnLowerLimit = None  # KSP50237
-I_FEE_ANAAlarmLowerLimit = None  # KSP50235
-I_FEE_ANAWarnUpperLimit = None  # KSP50238
-I_FEE_ANAAlarmUpperLimit = None  # KSP50236
-I_FEE_DIGWarnLowerLimit = None  # KSP50241
-I_FEE_DIGAlarmLowerLimit = None  # KSP50239
-I_FEE_DIGWarnUpperLimit = None  # KSP50242
-I_FEE_DIGAlarmUpperLimit = None  # KSP50240
-I_DPUWarnLowerLimit = None  # KSP50233
-I_DPUAlarmLowerLimit = None  # KSP50231
-I_DPUWarnUpperLimit = None  # KSP50234
-I_DPUAlarmUpperLimit = None  # KSP50232
-I_RSEWarnLowerLimit = None  # KSP50249
-I_RSEAlarmLowerLimit = None  # KSP50247
-I_RSEWarnUpperLimit = None  # KSP50250
-I_RSEAlarmUpperLimit = None  # KSP50248
-I_HEATERWarnLowerLimit = None  # KSP50245
-I_HEATERAlarmLowerLimit = None  # KSP50243
-I_HEATERWarnUpperLimit = None  # KSP50246
-I_HEATERAlarmUpperLimit = None  # KSP50244
-TEMP_PSUWarnLowerLimit = None  # KSP50303
-TEMP_PSUAlarmLowerLimit = None  # KSP50301
-TEMP_PSUWarnUpperLimit = None  # KSP50304
-TEMP_PSUAlarmUpperLimit = None  # KSP50302
-ADCParamCrc = None  # KSP50225
-cfl.Tcsend_DB('SASW SetParValAdcRngsCmd', P3V9WarnLowerLimit, P3V9AlarmLowerLimit, P3V9WarnUpperLimit, P3V9AlarmUpperLimit, P3V3WarnLowerLimit, P3V3AlarmLowerLimit, P3V3WarnUpperLimit, P3V3AlarmUpperLimit, P3V3_LVDSWarnLowerLimit, P3V3_LVDSAlarmLowerLimit, P3V3_LVDSWarnUpperLimit, P3V3_LVDSAlarmUpperLimit, P2V5WarnLowerLimit, P2V5AlarmLowerLimit, P2V5WarnUpperLimit, P2V5AlarmUpperLimit, P1V8WarnLowerLimit, P1V8AlarmLowerLimit, P1V8WarnUpperLimit, P1V8AlarmUpperLimit, P1V2WarnLowerLimit, P1V2AlarmLowerLimit, P1V2WarnUpperLimit, P1V2AlarmUpperLimit, RefWarnLowerLimit, RefAlarmLowerLimit, RefWarnUpperLimit, RefAlarmUpperLimit, TEMP1WarnLowerLimit, TEMP1AlarmLowerLimit, TEMP1WarnUpperLimit, TEMP1AlarmUpperLimit, TEMP_FEEWarnLowerLimit, TEMP_FEEAlarmLowerLimit, TEMP_FEEWarnUpperLimit, TEMP_FEEAlarmUpperLimit, TEMP_CCDWarnLowerLimit, TEMP_CCDAlarmLowerLimit, TEMP_CCDWarnUpperLimit, TEMP_CCDAlarmUpperLimit, I_FEE_ANAWarnLowerLimit, I_FEE_ANAAlarmLowerLimit, I_FEE_ANAWarnUpperLimit, I_FEE_ANAAlarmUpperLimit, I_FEE_DIGWarnLowerLimit, I_FEE_DIGAlarmLowerLimit, I_FEE_DIGWarnUpperLimit, I_FEE_DIGAlarmUpperLimit, I_DPUWarnLowerLimit, I_DPUAlarmLowerLimit, I_DPUWarnUpperLimit, I_DPUAlarmUpperLimit, I_RSEWarnLowerLimit, I_RSEAlarmLowerLimit, I_RSEWarnUpperLimit, I_RSEAlarmUpperLimit, I_HEATERWarnLowerLimit, I_HEATERAlarmLowerLimit, I_HEATERWarnUpperLimit, I_HEATERAlarmUpperLimit, TEMP_PSUWarnLowerLimit, TEMP_PSUAlarmLowerLimit, TEMP_PSUWarnUpperLimit, TEMP_PSUAlarmUpperLimit, ADCParamCrc, pool_name='PLM')
-
-
-# TC(20,3): SASW SetParValHeatCtlCmd [KSC50160]
-# Set Parameter Values for Heater Control of IASW
-# ParamSetId = HEAT_CTRL_IASW  # KSP50281 [NOT EDITABLE]
-HctrlParExecPer = None  # KSP50229
-HctrlParMaxDeltaVoltage = None  # KSP50444
-HctrlParVctrlLowerVolt = None  # KSP50448
-HctrlParVctrlUpperVolt = None  # KSP50449
-HctrlParTempRefLL = None  # KSP50446
-HctrlParTempRefUL = None  # KSP50447
-HctrlParTempRef = None  # KSP50230
-HctrlParCoeffP = None  # KSP50228
-HctrlParCoeffI = None  # KSP50443
-HctrlParOffset = None  # KSP50445
-ADCParamCrc = None  # KSP50225
-cfl.Tcsend_DB('SASW SetParValHeatCtlCmd', HctrlParExecPer, HctrlParMaxDeltaVoltage, HctrlParVctrlLowerVolt, HctrlParVctrlUpperVolt, HctrlParTempRefLL, HctrlParTempRefUL, HctrlParTempRef, HctrlParCoeffP, HctrlParCoeffI, HctrlParOffset, ADCParamCrc, pool_name='PLM')
-
-
-# TC(20,3): SASW SetParValRseParCmd [KSC50161]
-# Set Parameter Values for RSE Parameters
-# ParamSetId = RSE_PARAM  # KSP50281 [NOT EDITABLE]
-MotorCurr = None  # KSP50255
-SettlingTime = None  # KSP50288
-ChopDutyCyc = None  # KSP50226
-MaxMotorTemp = None  # KSP50253
-MaxElecTemp = None  # KSP50251
-MaxSteps = None  # KSP50254
-RseConfig = None  # KSP50286
-MaxMotorCurr = None  # KSP50252
-EmergencySteps = None  # KSP50227
-ParamCrc = None  # KSP50280
-cfl.Tcsend_DB('SASW SetParValRseParCmd', MotorCurr, SettlingTime, ChopDutyCyc, MaxMotorTemp, MaxElecTemp, MaxSteps, RseConfig, MaxMotorCurr, EmergencySteps, ParamCrc, pool_name='PLM')
-
-
-# TC(20,128): SASW ParamLoadArmCmd [KSC50162]
-# Arm Parameter Load
-cfl.Tcsend_DB('SASW ParamLoadArmCmd', pool_name='PLM')
-
-
-# TC(20,129): SASW ParamLoadDisarmCmd [KSC50163]
-# Disarm Parameter Load
-cfl.Tcsend_DB('SASW ParamLoadDisarmCmd', pool_name='PLM')
-
-
-# TC(191,1): SASW FdCheckEnbGlobCmd [KSC50164]
-# Globally EnableFdChecks
-cfl.Tcsend_DB('SASW FdCheckEnbGlobCmd', pool_name='PLM')
-
-
-# TC(191,2): SASW FdCheckDisGlobCmd [KSC50165]
-# Globally Disable FdChecks
-cfl.Tcsend_DB('SASW FdCheckDisGlobCmd', pool_name='PLM')
-
-
-# TC(191,3): SASW FdCheckEnbCmd [KSC50166]
-# Enable FdCheck
-FdChkId = None  # KSP50073
-cfl.Tcsend_DB('SASW FdCheckEnbCmd', FdChkId, pool_name='PLM')
-
-
-# TC(191,4): SASW FdCheckDisCmd [KSC50167]
-# Disable FdCheck
-FdChkId = None  # KSP50073
-cfl.Tcsend_DB('SASW FdCheckDisCmd', FdChkId, pool_name='PLM')
-
-
-# TC(191,5): SASW FdRecovEnbGlobCmd [KSC50168]
-# Globally Enable Recovery Procedures
-cfl.Tcsend_DB('SASW FdRecovEnbGlobCmd', pool_name='PLM')
-
-
-# TC(191,6): SASW FdRecovDisGlobCmd [KSC50169]
-# Globally Disable Recovery Procedures
-cfl.Tcsend_DB('SASW FdRecovDisGlobCmd', pool_name='PLM')
-
-
-# TC(191,7): SASW FdRecovEnbCmd [KSC50170]
-# Enable Recovery Procedure
-FdChkId = None  # KSP50073
-cfl.Tcsend_DB('SASW FdRecovEnbCmd', FdChkId, pool_name='PLM')
-
-
-# TC(191,8): SASW FdRecovDisCmd [KSC50171]
-# Disable Recovery Procedure
-FdChkId = None  # KSP50073
-cfl.Tcsend_DB('SASW FdRecovDisCmd', FdChkId, pool_name='PLM')
-
-
-# TC(193,1): SASW IaModePreSciCmd [KSC50172]
-# Prepare Science
-cfl.Tcsend_DB('SASW IaModePreSciCmd', pool_name='PLM')
-
-
-# TC(193,2): SASW IaModeStrtSciCmd [KSC50173]
-# Start Science
-cfl.Tcsend_DB('SASW IaModeStrtSciCmd', pool_name='PLM')
-
-
-# TC(193,3): SASW IaModeStpSciCmd [KSC50174]
-# Stop Science
-cfl.Tcsend_DB('SASW IaModeStpSciCmd', pool_name='PLM')
-
-
-# TC(193,4): SASW IaModeGotoStbyCmd [KSC50175]
-# Goto Standby
-cfl.Tcsend_DB('SASW IaModeGotoStbyCmd', pool_name='PLM')
-
-
-# TC(193,5): SASW IaModeStrtManCmd [KSC50176]
-# Start Manual FEE Mode
-cfl.Tcsend_DB('SASW IaModeStrtManCmd', pool_name='PLM')
-
-
-# TC(193,6): SASW IaModeContrSwOffCmd [KSC50177]
-# Controlled Switch-Off IASW
-cfl.Tcsend_DB('SASW IaModeContrSwOffCmd', pool_name='PLM')
-
-
-# TC(194,1): SASW AlgoStrtCmd [KSC50222]
-# Start Algorithm
-AlgoId = None  # KSP50004
-cfl.Tcsend_DB('SASW AlgoStrtCmd', AlgoId, pool_name='PLM')
-
-
-# TC(194,2): SASW AlgoStopCmd [KSC50180]
-# Stop Algorithm
-AlgoId = None  # KSP50004
-cfl.Tcsend_DB('SASW AlgoStopCmd', AlgoId, pool_name='PLM')
-
-
-# TC(194,3): SASW AlgoSuspCmd [KSC50181]
-# Suspend Algorithm
-AlgoId = None  # KSP50004
-cfl.Tcsend_DB('SASW AlgoSuspCmd', AlgoId, pool_name='PLM')
-
-
-# TC(194,4): SASW AlgoResCmd [KSC50182]
-# Resume Algorithm
-AlgoId = None  # KSP50004
-cfl.Tcsend_DB('SASW AlgoResCmd', AlgoId, pool_name='PLM')
-
-
-# TC(197,2): SASW BootRepGenCmd [KSC50184]
-# Generate Boot Report
-DpuMemoryId = None  # KSP50007
-StartAddress = None  # KSP50017
-cfl.Tcsend_DB('SASW BootRepGenCmd', DpuMemoryId, StartAddress, pool_name='PLM')
-
-
-# TC(198,1): SASW ProcStrCmd_FEE_IN_A [KSC50212]
-# FEE_IN_ALL_SYNC_PR Procedure Start Cmd
-# ProcId = FEE_IN_ALL_SYNC_  # KSP50317 [NOT EDITABLE]
-cfl.Tcsend_DB('SASW ProcStrCmd_FEE_IN_A', pool_name='PLM')
-
-
-# TC(198,1): SASW ProcStrCmd_FEE_IN_S [KSC50213]
-# FEE_IN_SYNC_PR Procedure Start Cmd
-# ProcId = FEE_IN_SYNC_PR  # KSP50317 [NOT EDITABLE]
-ProcFeeNParams = None  # KSP50318
-ProcFeeParamId = None  # KSP50450
-cfl.Tcsend_DB('SASW ProcStrCmd_FEE_IN_S', ProcFeeNParams, ProcFeeParamId, pool_name='PLM')
-
-
-# TC(198,1): SASW ProcStrCmd_FEE_OUT_ [KSC50214]
-# FEE_OUT_SYNC_PR Procedure Start Cmd
-# ProcId = FEE_OUT_SYNC_PR  # KSP50317 [NOT EDITABLE]
-ProcFeeNParams = None  # KSP50318
-ProcFeeParamId = None  # KSP50450
-ProcFeeParamValue = None  # KSP50451
-cfl.Tcsend_DB('SASW ProcStrCmd_FEE_OUT_', ProcFeeNParams, ProcFeeParamId, ProcFeeParamValue, pool_name='PLM')
-
-
-# TC(198,1): SASW ProcStrCmd_RSE_CONF [KSC50215]
-# RSE_CONFIG_PR Procedure Start Cmd
-# ProcId = RSE_CONFIG_PR  # KSP50317 [NOT EDITABLE]
-ProcRseCmdId = None  # KSP50452
-cfl.Tcsend_DB('SASW ProcStrCmd_RSE_CONF', ProcRseCmdId, pool_name='PLM')
-
-
-# TC(198,1): SASW ProcStrCmd_RSE_STAT [KSC50216]
-# RSE_STATUS_PR Procedure Start Cmd
-# ProcId = RSE_STATUS_PR  # KSP50317 [NOT EDITABLE]
-cfl.Tcsend_DB('SASW ProcStrCmd_RSE_STAT', pool_name='PLM')
-
-
-# TC(198,2): SASW ProcStpCmd_FEE_IN_A [KSC50217]
-# FEE_IN_ALL_SYNC_PR Procedure Stop Cmd
-# ProcId = FEE_IN_ALL_SYNC_  # KSP50317 [NOT EDITABLE]
-cfl.Tcsend_DB('SASW ProcStpCmd_FEE_IN_A', pool_name='PLM')
-
-
-# TC(198,2): SASW ProcStpCmd_FEE_IN_S [KSC50218]
-# FEE_IN_SYNC_PR Procedure Stop Cmd
-# ProcId = FEE_IN_SYNC_PR  # KSP50317 [NOT EDITABLE]
-cfl.Tcsend_DB('SASW ProcStpCmd_FEE_IN_S', pool_name='PLM')
-
-
-# TC(198,2): SASW ProcStpCmd_FEE_OUT_ [KSC50219]
-# FEE_OUT_SYNC_PR Procedure Stop Cmd
-# ProcId = FEE_OUT_SYNC_PR  # KSP50317 [NOT EDITABLE]
-cfl.Tcsend_DB('SASW ProcStpCmd_FEE_OUT_', pool_name='PLM')
-
-
-# TC(198,2): SASW ProcStpCmd_RSE_CONF [KSC50220]
-# RSE_CONFIG_PR Procedure Stop Cmd
-# ProcId = RSE_CONFIG_PR  # KSP50317 [NOT EDITABLE]
-cfl.Tcsend_DB('SASW ProcStpCmd_RSE_CONF', pool_name='PLM')
-
-
-# TC(198,2): SASW ProcStpCmd_RSE_STAT [KSC50221]
-# RSE_STATUS_PR Procedure Stop Cmd
-# ProcId = RSE_STATUS_PR  # KSP50317 [NOT EDITABLE]
-cfl.Tcsend_DB('SASW ProcStpCmd_RSE_STAT', pool_name='PLM')
-
-
-# TC(210,1): SASW ResetDpuSafeCmd [KSC50187]
-# Reset DPU to SAFE
-cfl.Tcsend_DB('SASW ResetDpuSafeCmd', pool_name='PLM')
-
-
-# TC(210,2): SASW WatchdogEnbCmd [KSC50188]
-# Enable Watchdog
-cfl.Tcsend_DB('SASW WatchdogEnbCmd', pool_name='PLM')
-
-
-# TC(210,3): SASW WatchdogDisCmd [KSC50189]
-# Disable Watchdog
-cfl.Tcsend_DB('SASW WatchdogDisCmd', pool_name='PLM')
-
-
-# TC(210,6): SASW LoadRegisterCmd [KSC50190]
-# Load Register
-RegAddr = None  # KSP50204
-RegData = None  # KSP50205
-VerifAddr = None  # KSP50206
-VerifMask = None  # KSP50207
-cfl.Tcsend_DB('SASW LoadRegisterCmd', RegAddr, RegData, VerifAddr, VerifMask, pool_name='PLM')
-
-
-# TC(210,7): SASW LoadRegisterArmCmd [KSC50191]
-# Arm Load Register
-cfl.Tcsend_DB('SASW LoadRegisterArmCmd', pool_name='PLM')
-
-
-# TC(210,8): SASW LoadRegisterDisarmC [KSC50192]
-# Disarm Load Register
-cfl.Tcsend_DB('SASW LoadRegisterDisarmC', pool_name='PLM')
-
-
-# TC(211,1): SASW ParamUpdtBoolCmd [KSC50193]
-# Update Parameter of type Boolean
-# ParamType = PAR_BOOL  # KSP50215 [NOT EDITABLE]
-NParams = None  # KSP50209
-ParamId = None  # KSP50210
-ArrayElemId = None  # KSP50208
-ParamValueBool = None  # KSP50216
-cfl.Tcsend_DB('SASW ParamUpdtBoolCmd', NParams, ParamId, ArrayElemId, ParamValueBool, pool_name='PLM')
-
-
-# TC(211,1): SASW ParamUpdtInt8Cmd [KSC50194]
-# Update Parameter of type INT8
-# ParamType = PAR_INT8  # KSP50215 [NOT EDITABLE]
-NParams = None  # KSP50209
-ParamId = None  # KSP50210
-ArrayElemId = None  # KSP50208
-ParamValueInt8 = None  # KSP50221
-cfl.Tcsend_DB('SASW ParamUpdtInt8Cmd', NParams, ParamId, ArrayElemId, ParamValueInt8, pool_name='PLM')
-
-
-# TC(211,1): SASW ParamUpdtInt16Cmd [KSC50195]
-# Update Parameter of type INT16
-# ParamType = PAR_INT16  # KSP50215 [NOT EDITABLE]
-NParams = None  # KSP50209
-ParamId = None  # KSP50210
-ArrayElemId = None  # KSP50208
-ParamValueInt16 = None  # KSP50219
-cfl.Tcsend_DB('SASW ParamUpdtInt16Cmd', NParams, ParamId, ArrayElemId, ParamValueInt16, pool_name='PLM')
-
-
-# TC(211,1): SASW ParamUpdtInt32Cmd [KSC50196]
-# Update Parameter of type INT32
-# ParamType = PAR_INT32  # KSP50215 [NOT EDITABLE]
-NParams = None  # KSP50209
-ParamId = None  # KSP50210
-ArrayElemId = None  # KSP50208
-ParamValueInt32 = None  # KSP50220
-cfl.Tcsend_DB('SASW ParamUpdtInt32Cmd', NParams, ParamId, ArrayElemId, ParamValueInt32, pool_name='PLM')
-
-
-# TC(211,1): SASW ParamUpdtUint8Cmd [KSC50197]
-# Update Parameter of type UINT8
-# ParamType = PAR_UINT8  # KSP50215 [NOT EDITABLE]
-NParams = None  # KSP50209
-ParamId = None  # KSP50210
-ArrayElemId = None  # KSP50208
-ParamValueUint8 = None  # KSP50224
-cfl.Tcsend_DB('SASW ParamUpdtUint8Cmd', NParams, ParamId, ArrayElemId, ParamValueUint8, pool_name='PLM')
-
-
-# TC(211,1): SASW ParamUpdtUint16Cmd [KSC50198]
-# Update Parameter of type UINT16
-# ParamType = PAR_UINT16  # KSP50215 [NOT EDITABLE]
-NParams = None  # KSP50209
-ParamId = None  # KSP50210
-ArrayElemId = None  # KSP50208
-ParamValueUint16 = None  # KSP50222
-cfl.Tcsend_DB('SASW ParamUpdtUint16Cmd', NParams, ParamId, ArrayElemId, ParamValueUint16, pool_name='PLM')
-
-
-# TC(211,1): SASW ParamUpdtUint32Cmd [KSC50199]
-# Update Parameter of type UINT32
-# ParamType = PAR_UINT32  # KSP50215 [NOT EDITABLE]
-NParams = None  # KSP50209
-ParamId = None  # KSP50210
-ArrayElemId = None  # KSP50208
-ParamValueUint32 = None  # KSP50223
-cfl.Tcsend_DB('SASW ParamUpdtUint32Cmd', NParams, ParamId, ArrayElemId, ParamValueUint32, pool_name='PLM')
-
-
-# TC(211,1): SASW ParamUpdtFloatCmd [KSC50200]
-# Update Parameter of type FLOAT
-# ParamType = PAR_FLOAT  # KSP50215 [NOT EDITABLE]
-NParams = None  # KSP50209
-ParamId = None  # KSP50210
-ArrayElemId = None  # KSP50208
-ParamValueFloat = None  # KSP50218
-cfl.Tcsend_DB('SASW ParamUpdtFloatCmd', NParams, ParamId, ArrayElemId, ParamValueFloat, pool_name='PLM')
-
-
-# TC(211,1): SASW ParamUpdtCucCmd [KSC50201]
-# Update Parameter of type CUC
-# ParamType = PAR_CUC  # KSP50215 [NOT EDITABLE]
-NParams = None  # KSP50209
-ParamId = None  # KSP50210
-ArrayElemId = None  # KSP50208
-ParamValueCuc = None  # KSP50217
-cfl.Tcsend_DB('SASW ParamUpdtCucCmd', NParams, ParamId, ArrayElemId, ParamValueCuc, pool_name='PLM')
-
-
-# TC(212,1): SASW CopyCmd [KSC50202]
-# Copy Data
-SrcMemId = None  # KSP50022
-SrcAddress = None  # KSP50021
-DataSize = None  # KSP50019
-TrgtMemId = None  # KSP50024
-TrgtAddress = None  # KSP50023
-cfl.Tcsend_DB('SASW CopyCmd', SrcMemId, SrcAddress, DataSize, TrgtMemId, TrgtAddress, pool_name='PLM')
-
-
-# TC(212,2): SASW ComprCmd [KSC50203]
-# Compress Data
-SrcMemId = None  # KSP50022
-SrcAddress = None  # KSP50021
-DataSize = None  # KSP50019
-ComprConfig = None  # KSP50018
-TrgtMemId = None  # KSP50024
-TrgtAddress = None  # KSP50023
-cfl.Tcsend_DB('SASW ComprCmd', SrcMemId, SrcAddress, DataSize, ComprConfig, TrgtMemId, TrgtAddress, pool_name='PLM')
-
-
-# TC(212,3): SASW DecomprCmd [KSC50204]
-# Decompress Data
-SrcMemId = None  # KSP50022
-SrcAddress = None  # KSP50021
-DataSize = None  # KSP50019
-DecomprConfig = None  # KSP50020
-TrgtMemId = None  # KSP50024
-TrgtAddress = None  # KSP50023
-cfl.Tcsend_DB('SASW DecomprCmd', SrcMemId, SrcAddress, DataSize, DecomprConfig, TrgtMemId, TrgtAddress, pool_name='PLM')
-
-
-# TC(213,1): SASW SchedSegmCmd [KSC50205]
-# Schedule Program Segment
-SegmAddress = None  # KSP50197
-cfl.Tcsend_DB('SASW SchedSegmCmd', SegmAddress, pool_name='PLM')
-
-
-# TC(3,131): DBS_TC_SET_HKREP_FREQ [KTC40001]
-# Set Housekeeping Reporting Frequency
-HK_REP_SID = 100  # KTP40001
-HK_REP_PER = 32  # KTP40002
-cfl.Tcsend_DB('DBS_TC_SET_HKREP_FREQ', HK_REP_SID, HK_REP_PER, pool_name='PLM')
-
-
-# TC(5,5): DBS_TC_ENABLE_EVENT [KTC40002]
-# Enables one or more event reports
-EVENT_REP_CNT = 1  # KTP40010
-EVENT_ID = "EVT_MEM_COR_RAM"  # KTP40011
-cfl.Tcsend_DB('DBS_TC_ENABLE_EVENT', EVENT_REP_CNT, EVENT_ID, pool_name='PLM')
-
-
-# TC(5,6): DBS_TC_DISABLE_EVENT [KTC40003]
-# Disables one or more event reports
-EVENT_REP_CNT = 1  # KTP40010
-EVENT_ID = "EVT_MEM_COR_RAM"  # KTP40011
-cfl.Tcsend_DB('DBS_TC_DISABLE_EVENT', EVENT_REP_CNT, EVENT_ID, pool_name='PLM')
-
-
-# TC(6,2): DBS_TC_LOAD_MEMORY [KTC40004]
-# Load data to the onboard memory
-WR_MEM_MID = "DPU_RAM"  # KTP40030
-WR_START_ADDR = 0x60000000  # KTP40031
-WR_BLOCK_LEN = 4  # KTP40032
-WR_BLOC_DATA = 0x00  # KTP40033
-cfl.Tcsend_DB('DBS_TC_LOAD_MEMORY', WR_MEM_MID, WR_START_ADDR, WR_BLOCK_LEN, WR_BLOC_DATA, pool_name='PLM')
-
-
-# TC(6,5): DBS_TC_DUMP_MEMORY [KTC40005]
-# Dump data from the onboard memory
-RD_MEM_MID = "DPU_RAM"  # KTP40050
-RD_START_ADDR = 0x60000000  # KTP40051
-RD_BLOCK_LEN = 4  # KTP40052
-cfl.Tcsend_DB('DBS_TC_DUMP_MEMORY', RD_MEM_MID, RD_START_ADDR, RD_BLOCK_LEN, pool_name='PLM')
-
-
-# TC(6,9): DBS_TC_CHECK_MEMORY [KTC40006]
-# Check the onboard memory
-CH_MEM_MID = "DPU_RAM"  # KTP40060
-CH_START_ADDR = 0x60000000  # KTP40061
-CH_BLOCK_LEN = 4  # KTP40062
-cfl.Tcsend_DB('DBS_TC_CHECK_MEMORY', CH_MEM_MID, CH_START_ADDR, CH_BLOCK_LEN, pool_name='PLM')
-
-
-# TC(6,129): DBS_TC_CLEAR_MEMORY [KTC40007]
-# Clear a section of the the RAM
-# CLR_MEM_MID = DPU_RAM  # KTP40070 [NOT EDITABLE]
-CLR_START_ADDR = 0x60040000  # KTP40071
-CLR_BLOCK_LEN = 33554432  # KTP40072
-cfl.Tcsend_DB('DBS_TC_CLEAR_MEMORY', CLR_START_ADDR, CLR_BLOCK_LEN, pool_name='PLM')
-
-
-# TC(9,128): DBS_TC_UPDATE_TIME [KTC40008]
-# Set the onboard time
-DPU_NEW_TIMESTAMP = 0  # KTP40080
-cfl.Tcsend_DB('DBS_TC_UPDATE_TIME', DPU_NEW_TIMESTAMP, pool_name='PLM')
-
-
-# TC(17,1): DBS_TC_TEST_CONNECTION [KTC40009]
-# Test the connection to the DPU
-cfl.Tcsend_DB('DBS_TC_TEST_CONNECTION', pool_name='PLM')
-
-
-# TC(20,1): DBS_TC_DUMP_PARAMETERS [KTC40010]
-# Dump parameters
-PARAM_SID = "ADC_RANGES"  # KTP40100
-cfl.Tcsend_DB('DBS_TC_DUMP_PARAMETERS', PARAM_SID, pool_name='PLM')
-
-
-# TC(20,3): DBS_TC_PARLOAD_ADCRANGES [KTC40011]
-# Load parameterset for ADC ranges
-# PARAM_SID = ADC_RANGES  # KTP40100 [NOT EDITABLE]
-P3V9_WARN_LOWER_RANGE = 0  # KTP40110
-P3V9_FAIL_LOWER_RANGE = 0  # KTP40111
-P3V9_WARN_UPPER_RANGE = 16382  # KTP40112
-P3V9_FAIL_UPPER_RANGE = 16382  # KTP40113
-P3V3_WARN_LOWER_RANGE = 0  # KTP40114
-P3V3_FAIL_LOWER_RANGE = 0  # KTP40115
-P3V3_WARN_UPPER_RANGE = 16382  # KTP40116
-P3V3_FAIL_UPPER_RANGE = 16382  # KTP40117
-P3V3_LVDS_WARN_LOWER_RAN = 0  # KTP40118
-P3V3_LVDS_FAIL_LOWER_RAN = 0  # KTP40119
-P3V3_LVDS_WARN_UPPER_RAN = 16382  # KTP40120
-P3V3_LVDS_FAIL_UPPER_RAN = 16382  # KTP40121
-P2V5_WARN_LOWER_RANGE = 0  # KTP40122
-P2V5_FAIL_LOWER_RANGE = 0  # KTP40123
-P2V5_WARN_UPPER_RANGE = 16382  # KTP40124
-P2V5_FAIL_UPPER_RANGE = 16382  # KTP40125
-P1V8_WARN_LOWER_RANGE = 0  # KTP40126
-P1V8_FAIL_LOWER_RANGE = 0  # KTP40127
-P1V8_WARN_UPPER_RANGE = 16382  # KTP40128
-P1V8_FAIL_UPPER_RANGE = 16382  # KTP40129
-P1V2_WARN_LOWER_RANGE = 0  # KTP40130
-P1V2_FAIL_LOWER_RANGE = 0  # KTP40131
-P1V2_WARN_UPPER_RANGE = 16382  # KTP40132
-P1V2_FAIL_UPPER_RANGE = 16382  # KTP40133
-REF_WARN_LOWER_RANGE = 0  # KTP40134
-REF_FAIL_LOWER_RANGE = 0  # KTP40135
-REF_WARN_UPPER_RANGE = 16382  # KTP40136
-REF_FAIL_UPPER_RANGE = 16382  # KTP40137
-TEMP1_WARN_LOWER_RANGE = 0  # KTP40138
-TEMP1_FAIL_LOWER_RANGE = 0  # KTP40139
-TEMP1_WARN_UPPER_RANGE = 16382  # KTP40140
-TEMP1_FAIL_UPPER_RANGE = 16382  # KTP40141
-TEMP_FEE_WARN_LOWER_RANG = 0  # KTP40142
-TEMP_FEE_FAIL_LOWER_RANG = 0  # KTP40143
-TEMP_FEE_WARN_UPPER_RANG = 16382  # KTP40144
-TEMP_FEE_FAIL_UPPER_RANG = 16382  # KTP40145
-TEMP_CDD_WARN_LOWER_RANG = 0  # KTP40146
-TEMP_CDD_FAIL_LOWER_RANG = 0  # KTP40147
-TEMP_CDD_WARN_UPPER_RANG = 16382  # KTP40148
-TEMP_CDD_FAIL_UPPER_RANG = 16382  # KTP40149
-I_FEE_ANA_WARN_LOWER_RAN = 0  # KTP40150
-I_FEE_ANA_FAIL_LOWER_RAN = 0  # KTP40151
-I_FEE_ANA_WARN_UPPER_RAN = 16382  # KTP40152
-I_FEE_ANA_FAIL_UPPER_RAN = 16382  # KTP40153
-I_FEE_DIG_WARN_LOWER_RAN = 0  # KTP40154
-I_FEE_DIG_FAIL_LOWER_RAN = 0  # KTP40155
-I_FEE_DIG_WARN_UPPER_RAN = 16382  # KTP40156
-I_FEE_DIG_FAIL_UPPER_RAN = 16382  # KTP40157
-I_DPU_WARN_LOWER_RANGE = 0  # KTP40158
-I_DPU_FAIL_LOWER_RANGE = 0  # KTP40159
-I_DPU_WARN_UPPER_RANGE = 16382  # KTP40160
-I_DPU_FAIL_UPPER_RANGE = 16382  # KTP40161
-I_RSE_WARN_LOWER_RANGE = 0  # KTP40162
-I_RSE_FAIL_LOWER_RANGE = 0  # KTP40163
-I_RSE_WARN_UPPER_RANGE = 16382  # KTP40164
-I_RSE_FAIL_UPPER_RANGE = 16382  # KTP40165
-I_HEATER_WARN_LOWER_RANG = 0  # KTP40166
-I_HEATER_FAIL_LOWER_RANG = 0  # KTP40167
-I_HEATER_WARN_UPPER_RANG = 16382  # KTP40168
-I_HEATER_FAIL_UPPER_RANG = 16382  # KTP40169
-TEMP_PSU_WARN_LOWER_RANG = 0  # KTP40170
-TEMP_PSU_FAIL_LOWER_RANG = 0  # KTP40171
-TEMP_PSU_WARN_UPPER_RANG = 16382  # KTP40172
-TEMP_PSU_FAIL_UPPER_RANG = 16382  # KTP40173
-PARAM_CRC = 0  # KTP40174
-cfl.Tcsend_DB('DBS_TC_PARLOAD_ADCRANGES', P3V9_WARN_LOWER_RANGE, P3V9_FAIL_LOWER_RANGE, P3V9_WARN_UPPER_RANGE, P3V9_FAIL_UPPER_RANGE, P3V3_WARN_LOWER_RANGE, P3V3_FAIL_LOWER_RANGE, P3V3_WARN_UPPER_RANGE, P3V3_FAIL_UPPER_RANGE, P3V3_LVDS_WARN_LOWER_RAN, P3V3_LVDS_FAIL_LOWER_RAN, P3V3_LVDS_WARN_UPPER_RAN, P3V3_LVDS_FAIL_UPPER_RAN, P2V5_WARN_LOWER_RANGE, P2V5_FAIL_LOWER_RANGE, P2V5_WARN_UPPER_RANGE, P2V5_FAIL_UPPER_RANGE, P1V8_WARN_LOWER_RANGE, P1V8_FAIL_LOWER_RANGE, P1V8_WARN_UPPER_RANGE, P1V8_FAIL_UPPER_RANGE, P1V2_WARN_LOWER_RANGE, P1V2_FAIL_LOWER_RANGE, P1V2_WARN_UPPER_RANGE, P1V2_FAIL_UPPER_RANGE, REF_WARN_LOWER_RANGE, REF_FAIL_LOWER_RANGE, REF_WARN_UPPER_RANGE, REF_FAIL_UPPER_RANGE, TEMP1_WARN_LOWER_RANGE, TEMP1_FAIL_LOWER_RANGE, TEMP1_WARN_UPPER_RANGE, TEMP1_FAIL_UPPER_RANGE, TEMP_FEE_WARN_LOWER_RANG, TEMP_FEE_FAIL_LOWER_RANG, TEMP_FEE_WARN_UPPER_RANG, TEMP_FEE_FAIL_UPPER_RANG, TEMP_CDD_WARN_LOWER_RANG, TEMP_CDD_FAIL_LOWER_RANG, TEMP_CDD_WARN_UPPER_RANG, TEMP_CDD_FAIL_UPPER_RANG, I_FEE_ANA_WARN_LOWER_RAN, I_FEE_ANA_FAIL_LOWER_RAN, I_FEE_ANA_WARN_UPPER_RAN, I_FEE_ANA_FAIL_UPPER_RAN, I_FEE_DIG_WARN_LOWER_RAN, I_FEE_DIG_FAIL_LOWER_RAN, I_FEE_DIG_WARN_UPPER_RAN, I_FEE_DIG_FAIL_UPPER_RAN, I_DPU_WARN_LOWER_RANGE, I_DPU_FAIL_LOWER_RANGE, I_DPU_WARN_UPPER_RANGE, I_DPU_FAIL_UPPER_RANGE, I_RSE_WARN_LOWER_RANGE, I_RSE_FAIL_LOWER_RANGE, I_RSE_WARN_UPPER_RANGE, I_RSE_FAIL_UPPER_RANGE, I_HEATER_WARN_LOWER_RANG, I_HEATER_FAIL_LOWER_RANG, I_HEATER_WARN_UPPER_RANG, I_HEATER_FAIL_UPPER_RANG, TEMP_PSU_WARN_LOWER_RANG, TEMP_PSU_FAIL_LOWER_RANG, TEMP_PSU_WARN_UPPER_RANG, TEMP_PSU_FAIL_UPPER_RANG, PARAM_CRC, pool_name='PLM')
-
-
-# TC(20,3): DBS_TC_PARLOAD_RSEPARAM [KTC40012]
-# Load parameterset for RSE
-# PARAM_SID = RSE_PARAM  # KTP40100 [NOT EDITABLE]
-MOTOR_CUR = 0  # KTP40190
-SETTL_TIME = 0  # KTP40191
-CHOP_DUTY = 0  # KTP40192
-MAX_MOTOR_TEMP = 0  # KTP40193
-MAX_ELEC_TEMP = 0  # KTP40194
-MAX_STEPS = 0  # KTP40195
-RSE_CONFIG = 0  # KTP40196
-MAX_MOTOR_CUR = 0  # KTP40197
-EMERGENCY_STEPS = 0  # KTP40198
-PARAM_CRC = 0  # KTP40174
-cfl.Tcsend_DB('DBS_TC_PARLOAD_RSEPARAM', MOTOR_CUR, SETTL_TIME, CHOP_DUTY, MAX_MOTOR_TEMP, MAX_ELEC_TEMP, MAX_STEPS, RSE_CONFIG, MAX_MOTOR_CUR, EMERGENCY_STEPS, PARAM_CRC, pool_name='PLM')
-
-
-# TC(20,128): DBS_TC_PARLOAD_ARM [KTC40013]
-# Arm the software for loading of parameters to the MRAM
-cfl.Tcsend_DB('DBS_TC_PARLOAD_ARM', pool_name='PLM')
-
-
-# TC(20,129): DBS_TC_PARLOAD_DISARM [KTC40014]
-# Disarm the software for loading of parameters
-cfl.Tcsend_DB('DBS_TC_PARLOAD_DISARM', pool_name='PLM')
-
-
-# TC(210,1): DBS_TC_RESET_TO_SAFE [KTC40015]
-# Reset the DPU (and go to SAFE mode)
-cfl.Tcsend_DB('DBS_TC_RESET_TO_SAFE', pool_name='PLM')
-
-
-# TC(210,2): DBS_TC_ENABLE_WATCHDOG [KTC40016]
-# Enable the watchdog of the DPU
-cfl.Tcsend_DB('DBS_TC_ENABLE_WATCHDOG', pool_name='PLM')
-
-
-# TC(210,3): DBS_TC_DISABLE_WATCHDOG [KTC40017]
-# DISable the watchdog of the DPU
-cfl.Tcsend_DB('DBS_TC_DISABLE_WATCHDOG', pool_name='PLM')
-
-
-# TC(210,4): DBS_TC_BOOT_IASW [KTC40018]
-# Start the Application Software
-SW_MEM_MID = "DPU_RAM"  # KTP40260
-SW_IMG_ADDR = 0x00000000  # KTP40261
-SW_START_ADDR = 0x60040000  # KTP40262
-SW_FREE1 = 0x00000000  # KTP40263
-SW_FREE2 = 0x00000000  # KTP40264
-SW_FREE3 = 0x00000000  # KTP40265
-SW_FREE4 = 0x00000000  # KTP40266
-SW_FREE5 = 0x00000000  # KTP40267
-cfl.Tcsend_DB('DBS_TC_BOOT_IASW', SW_MEM_MID, SW_IMG_ADDR, SW_START_ADDR, SW_FREE1, SW_FREE2, SW_FREE3, SW_FREE4, SW_FREE5, pool_name='PLM')
-
-
-# TC(210,6): DBS_TC_LOAD_REGISTER [KTC40019]
-# Load data to the registers in the GR712RC or FPGA
-LR_REG_ADDR = 0x20000000  # KTP40280
-LR_REG_DATA = 0x0  # KTP40281
-LR_VERI_ADDR = 0x20000000  # KTP40282
-LR_VERI_MASK = 0xFFFFFFFF  # KTP40283
-cfl.Tcsend_DB('DBS_TC_LOAD_REGISTER', LR_REG_ADDR, LR_REG_DATA, LR_VERI_ADDR, LR_VERI_MASK, pool_name='PLM')
-
-
-# TC(210,7): DBS_TC_LOAD_REG_ARM [KTC40020]
-# Arm the software for loading into a register
-cfl.Tcsend_DB('DBS_TC_LOAD_REG_ARM', pool_name='PLM')
-
-
-# TC(210,8): DBS_TC_LOAD_REG_DISARM [KTC40021]
-# Disarm the software for loading into a register
-cfl.Tcsend_DB('DBS_TC_LOAD_REG_DISARM', pool_name='PLM')
diff --git a/Ccs/scripts/time_updt.py b/Ccs/scripts/time_updt.py
new file mode 100644
index 0000000000000000000000000000000000000000..56810af0bbd80ab6b41497a060ca823eb0a59519
--- /dev/null
+++ b/Ccs/scripts/time_updt.py
@@ -0,0 +1,21 @@
+# Periodically send a PUS TC(9,128) time update packet in a background task
+
+import threading
+
+def timetick(period):
+    global t_updt
+    print('START TIMETICK')
+    while t_updt:
+        ObtTime = cfl.get_cuc_now()
+        cfl.Tcbuild('SASW TimeUpdt', ObtTime, pool_name='LIVE', ack=0, sleep=period)
+    print('STOP TIMETICK')
+
+
+PERIOD = 1  # time tick period in seconds
+
+t_updt = True
+t = threading.Thread(target=timetick, args=[PERIOD])
+t.start()
+
+#! CCS.BREAKPOINT
+t_updt = False
\ No newline at end of file
diff --git a/Ccs/scripts/upload_IASW.py b/Ccs/scripts/upload_IASW.py
new file mode 100644
index 0000000000000000000000000000000000000000..d770f79d753f9d42c755fca8fda72b5246c49af9
--- /dev/null
+++ b/Ccs/scripts/upload_IASW.py
@@ -0,0 +1,31 @@
+# Template for uploading the IASW binary to DPU via SREC file
+
+# convert the IASW binary to SREC format
+binary = '/home/marko/space/CCS/aux/flightos'  # IASW binary
+srecfile = '/home/marko/space/CCS/aux/flightos.srec'  # SREC filename
+start_addr = 0x60040000  # start address of IASW in RAM
+
+cfl.source_to_srec(binary, srecfile, start_addr, skip_bytes=65536)
+
+# upload the SREC content to DPU
+memid = 'MEM_WR_MRAM'  # memory ID, 'DPU_MRAM' or 'MEM_WR_MRAM', depending on whether DBS or IASW S6 is used
+mem_addr = 0x40000000  # address where the data is uploaded to
+segid = 0x200B0101  # ID for data segments, see DBS UM
+
+#pkts, size, chksm = cfl.srec_to_s6(srecfile, memid, mem_addr, segid, max_pkt_size=504)
+cfl.upload_srec(srecfile, memid, mem_addr, segid, pool_name='LIVE', max_pkt_size=504, progress=True)  # optionally, provide the name of the TC that shall be used for upload, e.g., tcname='DBS_TC_LOAD_MEMORY'
+
+#! CCS.BREAKPOINT
+# upload the SREC content directly without segmentation
+srecfile = '/path/to/srec'  # SREC filename
+memid = 'EEPROM'
+tc_cmd = 'SES CMD_Memory_Load'
+dlen, dcrc = cfl.srec_direct(srecfile, memid, pool_name='LIVE', max_pkt_size=200, tcname=tc_cmd, sleep=0.125, byte_align=2)
+
+
+#! CCS.BREAKPOINT
+# The upload command will block the console while the packets are being sent. Run it in a thread to avoid that.
+import threading
+
+thread = threading.Thread(target=cfl.upload_srec, args=[srecfile, memid, mem_addr, segid], kwargs={'pool_name':'LIVE','max_pkt_size':504, 'progress':True})
+thread.start()
diff --git a/Ccs/tools/gresb_router.py b/Ccs/tools/gresb_router.py
new file mode 100755
index 0000000000000000000000000000000000000000..c2a0e8e4c2b5232d19480167c998f4d567ba97ab
--- /dev/null
+++ b/Ccs/tools/gresb_router.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+
+"""
+Handle packets prepended with GRESB header
+"""
+
+import sys
+sys.path.insert(0, '..')
+
+from ccs_function_lib import setup_gresb_routing
+
+if __name__ == "__main__":
+
+    if len(sys.argv) < 3:
+        print("USAGE: ./gresb_router.py <GRESB host:port> <TM host:port> [<TC host:port>]")
+        sys.exit()
+
+    gw, tm = sys.argv[1:3]
+
+    gw_hp = (gw.split(":")[0], int(gw.split(":")[1]))
+    tm_hp = (tm.split(":")[0], int(tm.split(":")[1]))
+
+    if len(sys.argv) == 4:
+        tc = sys.argv[3]
+        tc_hp = (tc.split(":")[0], int(tc.split(":")[1]))
+    else:
+        tc = None
+        tc_hp = None
+
+    print("Routing between GRESB:{} and TM:{},TC:{}. Adding/removing 4-byte GRESB header".format(gw, tm, tc))
+    setup_gresb_routing(gw_hp, tm_hp, tc_hp=tc_hp)
diff --git a/Ccs/tools/import_mib.py b/Ccs/tools/import_mib.py
index b1514bd705aaf5ad914ddb7acc0e9c11082e79f2..6c985af34b6a2f5357b2673a6a5fa9fb73093e46 100755
--- a/Ccs/tools/import_mib.py
+++ b/Ccs/tools/import_mib.py
@@ -11,6 +11,7 @@ import getpass
 
 from sqlalchemy import create_engine
 from sqlalchemy.orm import sessionmaker
+from sqlalchemy.sql import text
 
 
 sdir = os.path.dirname(os.path.abspath(__file__))
@@ -62,11 +63,11 @@ def create_schema():
 
     # delete database schema
     print('...drop schema {}'.format(DBNAME))
-    s.execute('DROP SCHEMA IF EXISTS {}'.format(DBNAME))
+    s.execute(text('DROP SCHEMA IF EXISTS {}'.format(DBNAME)))
 
     # create database schema
     print('...create schema {}'.format(DBNAME))
-    s.execute(open(WBSQL).read())
+    s.execute(text(open(WBSQL).read()))
     s.close()
 
 
@@ -86,7 +87,7 @@ def import_mib():
         rows = [('"' + i.replace('\t', '","').strip() + '"').replace('""', 'DEFAULT') for i in mfile]
         try:
             for row in rows:
-                s.execute('INSERT IGNORE INTO {} VALUES ({})'.format(fn[:-4], row))  # IGNORE truncates too long strings
+                s.execute(text('INSERT IGNORE INTO {} VALUES ({})'.format(fn[:-4], row)))  # IGNORE truncates too long strings
         except Exception as err:
             s.rollback()
             s.close()
@@ -95,24 +96,39 @@ def import_mib():
     s.commit()
     s.close()
 
-    print('...DONE!')
-
 
 if __name__ == '__main__':
 
+    do_import = True
+
     if '-c' in sys.argv:
         MIBDIR = '/home/user/space/mib'  # directory containing the SCOS2000 *.dat files
         DBNAME = 'mib_schema_test'  # SQL schema name to be created
         DBURL = 'mysql://user:password@127.0.0.1'  # credentials of MySQL account
-    elif len(sys.argv) > 1:
+
+    elif '--dummy' in sys.argv:
+        sys.argv.remove('--dummy')
+        DBNAME, dbuser = sys.argv[-2:]
+        dbpw = getpass.getpass()
+        DBURL = 'mysql://{}:{}@127.0.0.1'.format(dbuser, dbpw)
+        do_import = False
+
+    elif len(sys.argv) > 3:
         MIBDIR, DBNAME, dbuser = sys.argv[1:4]
         dbpw = getpass.getpass()
         DBURL = 'mysql://{}:{}@127.0.0.1'.format(dbuser, dbpw)
+
     else:
         print('USAGE: ./import_mib.py <MIBDIR> <DBSCHEMA> <DBUSERNAME> [-c]\n'
-              'Options:\n\t-c\tUse configuration in script, any command line arguments will be ignored')
+              'Options:\n\t-c\tUse configuration in script, any command line arguments will be ignored.\n'
+              '\t--dummy\tCreate empty MIB structure only. Omit <MIBDIR> argument.')
+
         sys.exit()
 
     generate_wbsql()
     create_schema()
-    import_mib()
+
+    if do_import:
+        import_mib()
+
+    print('...DONE!')
diff --git a/Ccs/tools/simulators/picontrtest.py b/Ccs/tools/simulators/picontrtest.py
new file mode 100644
index 0000000000000000000000000000000000000000..8cb584c11157f5f3ee06a55720dbe704f5ad7291
--- /dev/null
+++ b/Ccs/tools/simulators/picontrtest.py
@@ -0,0 +1,164 @@
+import matplotlib.pyplot as plt
+import numpy as np
+import sys
+
+sys.path.insert(0, '../..')
+import thermal_control as tmc
+import thermal_model as tmo
+
+T_REF = -116.
+PI_ALGO = 1
+
+OFFSET = 30
+COEFFP = 50
+COEFFI = 0.001
+EXEC_PER = 40
+
+MODSTEP = 5
+
+save = 0
+sufx = '_addheat'
+showpwr = 1
+
+mod = tmo.ThermalModel(-125, record=True, step=MODSTEP)
+mod.sigma_T = 0.0005
+mod.mass = 3.
+mod.rad_area = .25
+mod.T0 = -125
+mod.t_l = 60
+mod.t_d = 5
+
+mod.set_delay_func(tmo.sigmoid)
+# plt.plot(mod.heat_distr)
+
+tctrl = tmc.ThermalController(T_REF, COEFFP, COEFFI, OFFSET, EXEC_PER, model=mod, pi=PI_ALGO, deltaTmax=1)
+tctrl.MAXDELTAVOLTAGE = 0.2
+
+hours = 42
+NCTRLSTEPS = int(hours * 3600 / (EXEC_PER / 8))  # int(sys.argv[2])
+modstepsperctrl = int(EXEC_PER / 8 / MODSTEP)
+
+print('run thctrl for {} steps, with {} s period ({} s)'.format(NCTRLSTEPS, EXEC_PER / 8, NCTRLSTEPS * EXEC_PER / 8))
+print('{} model iterations per control step'.format(modstepsperctrl))
+
+simlog = []
+t = 0
+TINIT = mod.T0
+Toffset = 0
+glitches = ()#tmo.rng.choice(range(NCTRLSTEPS), 10)
+drift = 1
+
+for i in range(NCTRLSTEPS):
+    for j in range(modstepsperctrl):
+        mod.evolve(t)
+        t += MODSTEP
+
+    # insert T glitches at random positions
+    if i in glitches:
+        if i % 2:
+            tctrl._step(t, with_model=True, glitch=20)
+        else:
+            tctrl._step(t, with_model=True, glitch=-20)
+    else:
+        tctrl._step(t, with_model=True, glitch=Toffset)
+
+    # sudden T offset for some time
+    # if int(t) == 40000:
+    #     print(t)
+    #     mod.inst_heat = 2.5
+    # if int(t) == 80000:
+    #     print(t)
+    #     mod.inst_heat = 1
+    # if int(t) == 100000:
+    #     print(t)
+    #     mod.inst_heat = 0
+
+    # if int(t) == 50000:
+    #     print(t)
+    #     Toffset = 2
+    #
+    # if int(t) == 51800:
+    #     print(t)
+    #     Toffset = 0
+
+    if i % 1000 == 0:
+        print(i, 'steps of', NCTRLSTEPS)
+
+    # drift in equilibrium temperature
+    if drift:
+        mod.T0 = TINIT * (1 - 0.05 * np.cos(1 * i * 2 * np.pi / NCTRLSTEPS))
+
+    simlog.append((t, mod.T0, mod.T, mod.htr_pwr, mod.inst_heat))
+
+simlog = np.array(simlog).T
+print(mod.T0)
+
+r = np.array(tctrl.log).T
+mr = np.array(mod.log).T
+
+if not showpwr:
+    fig, ax = plt.subplots(2, 1, sharex=True, gridspec_kw={'height_ratios': [2, 1]}, figsize=(10, 6))
+    ax1, ax2 = ax
+
+    ax1.plot(r[0], r[2], color='tab:blue', label='$T$')
+    ax1.axhline(T_REF, c='grey', ls='--', label=r'$T_\mathrm{ref}$')
+    ax1.tick_params(bottom=False)
+    ax1.set_ylim((-118, -114))
+    ax1.grid()
+    # ax1.plot(simlog[0], simlog[2], color='tab:pink', ls='--', alpha=1, label=r'$T_\mathrm{act}$')
+    ax1.set_ylabel('temperature [°C]')
+    ax1.legend()
+    ax2.plot(r[0], r[3], color='tab:orange', label=r'$V_\mathrm{ctrl}$')
+    ax2.set_xlabel('time [s]')
+    ax2.set_ylabel(r'$U_\mathrm{ctrl}$ [V]')
+    ax2.set_ylim((0, 3))
+    ax2.grid()
+else:
+    fig, ax = plt.subplots(4, 1, sharex=True, gridspec_kw={'height_ratios': [2, 1, 1, 1]}, figsize=(12, 9))
+    ax1, ax2, ax3, ax4 = ax
+
+    ax1.plot(r[0], r[2], color='tab:blue', label='$T$')
+    ax1.plot(simlog[0], simlog[2], color='blue', alpha=.2, label=r'$T_\mathrm{mod}$')
+    ax1.axhline(T_REF, c='grey', ls='--', label=r'$T_\mathrm{ref}$')
+    ax1.tick_params(bottom=False)
+    ax1.set_ylim((-118, -114))
+    ax1.grid()
+    ax11 = ax1.twinx()
+    ax11.set_ylabel('$T_0$ [°C]', color='tab:green')
+    ax11.plot(simlog[0], simlog[1], color='tab:green', ls='--', alpha=0.5)
+    ax11.tick_params(axis='y', colors='tab:green')
+    ax1.set_ylabel('temperature [°C]')
+    ax1.legend()
+    ax2.plot(r[0], r[3], color='tab:orange', label=r'$V_\mathrm{ctrl}$')
+    ax2.set_ylabel(r'$U_\mathrm{ctrl}$ [V]')
+    ax2.set_ylim((0, 3))
+    ax2.tick_params(bottom=False)
+    ax2.grid()
+    ax3.plot(simlog[0], simlog[3], color='tab:red', ls='--', alpha=1, label='htr')
+    ax3.plot(simlog[0], simlog[4], color='tab:purple', ls='--', alpha=1, label='inst')
+    ax3.plot(mr[0], mr[3], color='tab:cyan', ls='--', alpha=1, label='cool')
+    ax3.set_ylabel('$P$ [W]')
+    ax3.set_ylim((-1, 10))
+    ax3.tick_params(bottom=False)
+    ax3.grid()
+    ax3.legend()
+    if PI_ALGO:
+        ax4.axhline(OFFSET, color='tab:brown', label='O', zorder=0)
+        ax4.plot(r[0], r[5], color='tab:pink', label='P', zorder=2)
+        ax4.plot(r[0], r[4], color='tab:olive', label='I', zorder=1)
+        ax4.legend()
+    ax4.set_ylabel('percentage')
+    ax4.set_xlabel('time [s]')
+    ax4.grid()
+
+plt.tight_layout()
+fig.subplots_adjust(hspace=0.075)
+
+if save:
+    plt.savefig('/home/marko/space/smile/OBSW/Documentation/htrctrlsim/picrtl_sim_{:.0f}s_p{:d}_i{:.5f}{}.pdf'.format(EXEC_PER / 8, COEFFP, COEFFI, sufx))
+    plt.savefig('/home/marko/space/smile/OBSW/Documentation/htrctrlsim/picrtl_sim_{:.0f}s_p{:d}_i{:.5f}{}.png'.format(EXEC_PER / 8, COEFFP, COEFFI, sufx), dpi=200)
+
+plt.show()
+
+# tctrl.save_log(fname)
+# print('END, data saved to {}'.format(fname), time.time())
diff --git a/Ccs/tools/simulators/thermal_control.py b/Ccs/tools/simulators/thermal_control.py
new file mode 100644
index 0000000000000000000000000000000000000000..a32b8eb78e78b510164df4a4dfcb22e60d319663
--- /dev/null
+++ b/Ccs/tools/simulators/thermal_control.py
@@ -0,0 +1,144 @@
+"""
+SMILE PI thermal control algorithm, Python implementation
+"""
+
+import numpy as np
+import time
+import threading
+
+
+def vctrl_ana_to_dig(v):
+    return int(v * 1024 / 3.3)
+
+
+class ThermalController:
+
+    ASW_PERIOD_MS = 125.
+
+    VCTRLLOWERVOLT = 0.4
+    VCTRLUPPERVOLT = 2.8
+    MAXDELTAVOLTAGE = 0.2
+
+    def __init__(self, temp_ref, coeffP, coeffI, offset, exec_per, model=None, pi=True, deltaTmax=1.):
+
+        self.tempRef = temp_ref
+        self.coeffP = coeffP
+        self.coeffI = coeffI
+        self.offset = offset
+
+        self.temp = temp_ref
+        self.voltCtrl = self.VCTRLLOWERVOLT
+        self.voltCtrlUint16 = vctrl_ana_to_dig(self.voltCtrl)
+
+        self.tempOld = temp_ref
+        self.integOld = 0
+        self.voltCtrlOld = self.VCTRLLOWERVOLT
+
+        self.hctrl_par_exec_per = exec_per
+        self._algo_active = False
+
+        if pi:
+            self.calc_vctrl = self.do_pi_vctrl
+        else:
+            self.calc_vctrl = self.on_off_vctrl
+
+        self.deltaTmax = deltaTmax
+
+        self.model = model
+        self.log = []
+
+        self._thread = None
+
+    def set_temp_ref(self, temp):
+        self.tempRef = temp
+
+    def do_pi_vctrl(self, temp):
+
+        deltaTime = self.hctrl_par_exec_per * self.ASW_PERIOD_MS / 1000
+        integ = self.integOld + deltaTime * (self.tempRef - self.tempOld)
+        voltCtrlRel = self.offset + self.coeffP * (self.tempRef - temp) + self.coeffI * integ
+
+        if voltCtrlRel < 0:
+            self.voltCtrl = self.VCTRLLOWERVOLT
+        elif voltCtrlRel > 100:
+            self.voltCtrl = self.VCTRLUPPERVOLT
+        else:
+            self.voltCtrl = self.VCTRLLOWERVOLT + (voltCtrlRel / 100) * (self.VCTRLUPPERVOLT - self.VCTRLLOWERVOLT)
+
+        if (self.voltCtrl - self.voltCtrlOld) > self.MAXDELTAVOLTAGE:
+            self.voltCtrl = self.voltCtrlOld + self.MAXDELTAVOLTAGE
+        elif (self.voltCtrlOld - self.voltCtrl) > self.MAXDELTAVOLTAGE:
+            self.voltCtrl = self.voltCtrlOld - self.MAXDELTAVOLTAGE
+
+        self.tempOld = temp
+        self.integOld = integ
+        self.voltCtrlOld = self.voltCtrl
+
+        self.voltCtrlUint16 = vctrl_ana_to_dig(self.voltCtrl)
+
+    def on_off_vctrl(self, temp):
+
+        if temp > self.tempRef + self.deltaTmax:
+            v = self.voltCtrl - self.MAXDELTAVOLTAGE
+        elif temp < self.tempRef - self.deltaTmax:
+            v = self.voltCtrl + self.MAXDELTAVOLTAGE
+        else:
+            v = self.voltCtrl
+
+        if v > self.VCTRLUPPERVOLT:
+            self.voltCtrl = self.VCTRLUPPERVOLT
+        elif v < self.VCTRLLOWERVOLT:
+            self.voltCtrl = self.VCTRLLOWERVOLT
+        else:
+            self.voltCtrl = v
+
+    def start_algo(self):
+
+        if self._thread is not None and self._thread.is_alive():
+            print('TTC algo already running')
+            return
+
+        self._thread = threading.Thread(target=self._algo_worker, name='TTCALGO')
+        # self._thread.daemon = True
+        self._algo_active = True
+        self._thread.start()
+
+    def _algo_worker(self):
+        print('TTC algo started (period = {:.1f}s)'.format(self.ASW_PERIOD_MS / 1000 * self.hctrl_par_exec_per))
+        while self._algo_active:
+            try:
+                t1 = time.time()
+
+                if self.model is not None:
+                    self._step(t1, with_model=True)
+
+                else:
+                    self._step(t1, with_model=False)
+
+                dt = (self.ASW_PERIOD_MS / 1000 * self.hctrl_par_exec_per) - (time.time() - t1)
+                if dt > 0:
+                    time.sleep(dt)
+
+            except Exception as err:
+                print(err)
+                self.stop_algo()
+
+        print('TTC algo stopped')
+
+    def _step(self, t1, with_model=True, glitch=0):
+        if with_model:
+            self.temp = self.model.T_noisy + glitch
+            self.calc_vctrl(self.temp)
+            self.model.set_heater_power(vctrl=self.voltCtrl)
+
+            self.log.append((t1, self.tempRef, self.temp, self.voltCtrl, self.coeffI * self.integOld, self.coeffP * (self.tempRef - self.temp)))
+            
+        else:
+            self.calc_vctrl(self.temp)
+
+    def stop_algo(self):
+        self._algo_active = False
+
+    def save_log(self, fname):
+        np.savetxt(fname, np.array(self.log), header='time\tT_ref\tT\tV_ctrl\tcI*integ\tcP*(T_ref-T)')
+
diff --git a/Ccs/tools/simulators/thermal_model.py b/Ccs/tools/simulators/thermal_model.py
new file mode 100644
index 0000000000000000000000000000000000000000..d4c7aad7bf84a106940ec665fe4566c38969bfc0
--- /dev/null
+++ b/Ccs/tools/simulators/thermal_model.py
@@ -0,0 +1,331 @@
+"""
+Simple SMILE SXI thermal model for thermal control closed loop testing
+"""
+
+import threading
+import time
+import struct
+
+import numpy as np
+import communication as com
+import iwf_egse as iwf
+import calibrations_SMILE as cal
+
+from ccs_function_lib import get_pool_rows, filter_rows
+
+SIGMA_SB = 5.6703744191844314e-08
+TZERO = 273.15
+
+VCTRL_MIN = 0.4
+VCTRL_MAX = 2.9
+VHTR_MIN = 0.
+VHTR_MAX = 14.
+
+# linfit = np.polynomial.polynomial.Polynomial.fit((VCTRL_MIN, VCTRL_MAX), (VHTR_MIN, VHTR_MAX), 1)
+# a0, a1 = linfit.convert().coef
+
+rng = np.random.default_rng()
+
+
+def ctok(t):
+    return t + TZERO
+
+
+def ktoc(t):
+    return t - TZERO
+    
+
+def normalise(y):
+    return (y - y.min()) / (y.max() - y.min())
+
+
+def exp_norm(n, a, b):
+    x = np.linspace(a, b, n)
+    y = 1 - np.exp(1 / x)
+    yn = normalise(y)
+    return yn
+
+
+def log_norm(n, a, b):
+    x = np.linspace(a, b, n)
+    y = np.log(x)
+    yn = normalise(y)
+    return yn
+
+
+def sigmoid(n, a, b):
+    x = np.linspace(-b, b, n)
+    y = x / (1 + np.abs(x))
+    yn = normalise(y)
+    return yn
+
+
+def heat_kernel(n, a, b):
+    x = np.linspace(a, b, n)
+    y = 1 / x * np.exp(-1 / (b*x))
+    yn = normalise(y)
+    return yn
+
+
+def onoff(n, a, b):
+    return np.array([0., 1.])
+
+
+def cp_al(T):
+    """
+    Calculate specific heat capacity of Aluminium 6061-T6 at a given temperature between 4 an 300 K. From https://trc.nist.gov/cryogenics/materials/6061%20Aluminum/6061_T6Aluminum_rev.htm
+
+    :param T: Temperature in Kelvin
+    :return:
+    """
+    a = 46.6467
+    b = -314.292
+    c = 866.662
+    d = -1298.3
+    e = 1162.27
+    f = -637.795
+    g = 210.351
+    h = -38.3094
+    i = 2.96344
+
+    return 10**(a+b*(np.log10(T)) + c*(np.log10(T))**2 + d*(np.log10(T))**3 + e*(np.log10(T))**4 + f*(np.log10(T))**5 + g*(np.log10(T))**6 + h*(np.log10(T))**7 + i*(np.log10(T))**8)
+
+
+def k_al(T):
+    """
+    Calculate thermal conductivity of Aluminium 6061-T6 at a given temperature between 4 an 300 K. From https://trc.nist.gov/cryogenics/materials/6061%20Aluminum/6061_T6Aluminum_rev.htm
+
+    :param T: Temperature in Kelvin
+    :return:
+    """
+    a = 0.07918
+    b = 1.0957
+    c = -0.07277
+    d = 0.08084
+    e = 0.02803
+    f = -0.09464
+    g = 0.04179
+    h = -0.00571
+    i = 0
+
+    return 10**(a+b*(np.log10(T)) + c*(np.log10(T))**2 + d*(np.log10(T))**3 + e*(np.log10(T))**4 + f*(np.log10(T))**5 + g*(np.log10(T))**6 + h*(np.log10(T))**7 + i*(np.log10(T))**8)
+
+
+def vctrl_to_vhtr(vctrl):
+    """
+    Calculate heater voltage from control voltage; linear behaviour
+
+    :param vctrl:
+    :return:
+    """
+
+    if vctrl < VCTRL_MIN:
+        return VHTR_MIN
+    elif vctrl > VCTRL_MAX:
+        return VHTR_MAX
+    else:
+        return ((vctrl - VCTRL_MIN) / (VCTRL_MAX - VCTRL_MIN)) * (VHTR_MAX - VHTR_MIN)
+
+
+class ThermalModel:
+
+    sigma_T = 0.001  # relative noise of T reading (Gaussian)
+
+    htr_eff = 0.95  # heater efficiency
+    R_htr = 22.75  # heater resistance [Ohm]
+    epsilon = 0.9  # emissivity of radiator
+    # cp = 800.  # specific heat capacity of radiator [J/kg/K]
+    mass = 3.  # radiator thermal mass [kg] (500x500x~4mm) 2700kg/m³
+    rad_area = 0.25  # effective radiator area [m²]
+    T0 = -130.  # equilibrium temperature with heater off; is -130°C due to background sources
+    
+    t_l = 10.  # thermal lag, after which the heat input per cycle is fully accounted for in T, in seconds
+    t_d = 1.  # dead time, before T is affected by heating
+    f_k = 2.5  # "thermal conductivity" factor; the higher, the steeper T responds to the heater input, must be strictly larger than 1.
+
+    # Note.- Maximum voltage at the heater in case of failure should be less than 55V, considering a heater resistance of 22.75Ohms and maximum rating current of 2.5Amp.
+    # Note .- the definition of the control strategy for the heater power supply is:
+    # When, Vcontrol > 3.1V =>	14V ≤ Vheater ≤ 15V; Vcontrol ≤ 0.2V =>	Vheater = 0V
+
+    def __init__(self, T_init, step=.1, speedup=1, record=False, delay_func=sigmoid):
+
+        self.T = T_init
+
+        self.step = step
+        self.speedup = speedup
+
+        # "thermal conductivity"
+        self.set_delay_func(delay_func)  # normalised distribution function for delay behaviour
+
+        self.htr_pwr = 0
+        self.htr_cur = 0
+
+        self.inst_heat = 0  # additional, immediate heat input (e.g., from CCD, etc.)
+
+        self._evolving = False
+        self.record = record
+        self.log = []
+        self._thread = None
+
+    @property
+    def T_noisy(self):
+        return rng.normal(self.T, ctok(self.T) * self.sigma_T)
+
+    def calc_delay_factors(self, n):
+        if self.t_l > 0:
+            n0 = int(round(n * (self.t_d / self.t_l)))
+        else:
+            n0 = 0
+        
+        df = np.diff(self._delay_func(n-n0+1, 1, self.f_k))
+        assert df.sum().round(3) == 1.  # make sure energy is conserved
+
+        return np.concatenate([np.zeros(n0), df])
+
+    def set_delay_func(self, func):
+        self._delay_func = func
+
+        n = max(1, int(round(self.t_l / self.step)))
+        self.heat_distr = self.calc_delay_factors(n)
+        self.heat_pipe = np.zeros(len(self.heat_distr))
+
+    def evolve(self, t1):
+
+        self.T, heatpwr, coolpwr = self.calc_t_new()
+
+        if self.record:
+            self.log.append((t1, self.T, heatpwr, coolpwr))
+
+    def cool(self):
+        return self.rad_area * self.epsilon * SIGMA_SB * (ctok(self.T)**4 - ctok(self.T0)**4)
+
+    def heat(self):
+        self.heat_pipe += self.htr_pwr * self.heat_distr
+        addheat = self.heat_pipe[0] + self.inst_heat
+        #print(self.heat_pipe, self.heat_pipe.sum(), self.htr_pwr,self.inst_heat)
+        self.heat_pipe = np.roll(self.heat_pipe, -1)
+        self.heat_pipe[-1] = 0
+        return addheat
+
+    def calc_t_new(self):
+        heatpwr = self.heat()
+        coolpwr = self.cool()
+        return self.T + ((heatpwr - coolpwr) * self.step) / (cp_al(ctok(self.T)) * self.mass), heatpwr, coolpwr
+
+    def start(self):
+
+        if self._thread is not None and self._thread.is_alive():
+            print('Model already running')
+            return
+
+        self._evolving = True
+        self._thread = threading.Thread(target=self._stepper, name='stepper_thread')
+        self._thread.daemon = True
+        self._thread.start()
+
+    def _stepper(self):
+        print('Started T simulation (step = {} s)'.format(self.step))
+        while self._evolving:
+            t1 = time.time()
+            self.evolve(t1)
+            dt = time.time() - t1
+            if (self.step/self.speedup - dt) > 0:
+                time.sleep(self.step - dt)
+            else:
+                print('Step execution time exceeding step period! ({})'.format(dt))
+
+        print('T simulation terminated')
+
+    def stop(self):
+        self._evolving = False
+
+    def set_heater_power(self, vctrl=None, ihtr=None):
+
+        if vctrl is not None:
+            vhtr = vctrl_to_vhtr(vctrl)
+            self.htr_pwr = (vhtr**2 / self.R_htr) * self.htr_eff
+            self.htr_cur = vhtr / self.R_htr
+
+        elif ihtr is not None:
+            self.htr_pwr = ihtr**2 * self.R_htr * self.htr_eff
+            self.htr_cur = ihtr
+
+
+class ThermalLoopConnector(com.Connector):
+
+    def __init__(self, model, *args, pool_name='LIVE', apid=321, sid=3, cal_file=None, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.model = model  # ThermalModel instance
+        self.connect()
+        self.pool_name = pool_name
+        self.apid = apid
+        self.sid = sid
+        self.cal_file = cal_file
+        self.update_period = None
+        self._updating = False
+        # self.start_receiver()
+
+    @property
+    def pwm(self):
+        return iwf.ccd_pwm_from_temp(self.model.T, cal_file=self.cal_file)
+
+    def set_ccd_pwm(self):
+        cmd = iwf.Command.set_pwm(iwf.Signal.CDD_Thermistor, self.pwm)
+        self.send(cmd, rx=False)
+
+    @property
+    def adc_i_heater(self):
+        return cal.decalibrate(self.model.htr_cur, cal.Psu.ADC_I_HEATER)
+
+    def set_adc_i_heater(self):
+        htr_signal = iwf.adu_to_ana_adcihtr(self.adc_i_heater)
+        cmd = iwf.Command.set_psu_analogue_value(iwf.Signal.EGSE_I_HEATER, htr_signal)
+        self.send(cmd, rx=False)
+
+    def start_updating(self, period):
+        self._updating = True
+        self.update_period = period
+        self._update_thread = threading.Thread(target=self._update_worker, name='update_worker')
+        self._update_thread.start()
+
+    def _update_worker(self):
+
+        print('Started updating PWM with a period of {} seconds'.format(self.update_period))
+        while self._updating:
+            try:
+                t1 = time.time()
+
+                self.update_model()  # update model with current htr_pwr
+
+                self.set_ccd_pwm()  # update ADC_TEMP_CCD
+                self.set_adc_i_heater()  # update ADC_I_HEATER
+
+                time.sleep(self.update_period - (t1 - time.time()))
+
+            except Exception as err:
+                print(err)
+                self._updating = False
+
+        print('Stopped updating PWM')
+
+    def stop_updating(self):
+        self._updating = False
+
+    def update_model(self):
+        vctrl = self.get_vctrl()
+        if vctrl is not None:
+            self.model.set_heater_power(vctrl=vctrl)
+        else:
+            print('Failed to get VCTRL from TM')
+
+    def get_vctrl(self):
+        hk = filter_rows(get_pool_rows(self.pool_name), st=3, sst=25, apid=self.apid, sid=self.sid, get_last=True)
+        if hk is not None:
+            vctrl, = struct.unpack('>f', hk.raw[20:24])
+            return vctrl
+
+
+if __name__ == '__main__':
+
+    mod = ThermalModel(-90)
+    tmc = ThermalLoopConnector(mod, '', 8089)
diff --git a/Makefile b/Makefile
index 6401c894aa139aa7c3f46a318175896c5344af19..46c240446587dddd0dcda1aed5696245a4a9e65f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
-.PHONY: confignator ccs-storage codeblockreusefeature install-testlib python-requirements db-user database-dev-env databases
+.PHONY: confignator ccs-storage codeblockreusefeature install-testlib python-requirements db-user database-dev-env databases startmenu-entries
 
-install: python-requirements confignator ccs-storage codeblockreusefeature
+install: python-requirements confignator ccs-storage codeblockreusefeature startmenu-entries
 
 databases: ccs-storage codeblockreusefeature
 
@@ -11,7 +11,7 @@ python-requirements:
 	@echo "+-----------------------------+"
 	@echo "| installing Python modules   |"
 	@echo "+-----------------------------+"
-		if [ -z $VIRTUAL_ENV ]; then pip install --user -U -r $(CURDIR)/requirements.txt; else pip install -U -r $(CURDIR)/requirements.txt; fi
+		if [ -z $(VIRTUAL_ENV) ]; then pip install --user --break-system-packages -U -r $(CURDIR)/requirements.txt; else pip install -U -r $(CURDIR)/requirements.txt; fi
 	@echo "+-----------------------------+"
 	@echo "| installed Python modules    |"
 	@echo "+-----------------------------+"
@@ -22,7 +22,7 @@ confignator:
 	@echo "| installing confignator Python package |"
 	@echo "+---------------------------------------+"
 		$(MAKE) build -C $(CURDIR)/Tst/confignator
-	    if [ -z $VIRTUAL_ENV ]; then pip install --user -U --force-reinstall $(CURDIR)/Tst/confignator/dist/*.whl; else pip install -U --force-reinstall $(CURDIR)/Tst/confignator/dist/*.whl; fi
+	    if [ -z $(VIRTUAL_ENV) ]; then pip install --user --break-system-packages -U --force-reinstall $(CURDIR)/Tst/confignator/dist/*.whl; else pip install -U --force-reinstall $(CURDIR)/Tst/confignator/dist/*.whl; fi
 		$(MAKE) build-doc -C $(CURDIR)/Tst/confignator
 	@echo "+--------------------------------------+"
 	@echo "| installed confignator Python package |"
@@ -69,8 +69,21 @@ install-testlib:
 	@echo "+----------------------------------+"
 	@echo
 
+startmenu-entries:
+	@echo "+-----------------------------------+"
+	@echo "| creating application menu entries |"
+	@echo "+-----------------------------------+"
+	    ./gen_desktop_files.sh $(CURDIR)
+	    mv ccs.desktop $(HOME)/.local/share/applications/
+	    mv tst.desktop $(HOME)/.local/share/applications/
+	@echo "+----------------------------------+"
+	@echo "| created application menu entries |"
+	@echo "+----------------------------------+"
+	@echo
+
 set-start-scripts-permissions:
 	@echo "+-----------------------------------------------------+"
 	@echo "| setting permissions for the start scripts (execute) |"
 	@echo "+-----------------------------------------------------+"
 	    $(MAKE) all -C $(CURDIR)/Tst/
+
diff --git a/README b/README
index b4057b071d4916d2ef0614dc83c7d5a0bc1dae12..6536d14255b9919b3e614fdb64aa88dfe68be1be 100644
--- a/README
+++ b/README
@@ -7,7 +7,7 @@ This file documents the required steps to get the UVIE EGSE software up and runn
 2) Required packages/devtools
     - make
     - gtk3
-    - gtksourceview3 [<=3.24.11-1]
+    - gtksourceview3
     - python-pip
     - python-gobject
     - dbus-python
@@ -33,6 +33,9 @@ This file documents the required steps to get the UVIE EGSE software up and runn
    'make python-requirements' in the CCS base directory or use 'pip install [--user] -r requirements.txt'.
    If using a venv, it must have been created using the --system-site-packages option.
    For more details, see requirements.txt
+   Since Python 3.11, pip --user installs of packages are denied by default to avoid conflicts with
+   system-managed packages - the recommended solution is to use a venv. Alternatively, installing in
+   local userspace is still possible by passing the --break-system-packages flag.
 
 
 # INSTALLATION
diff --git a/Tst/codeblockreusefeature/add_dummy_data.py b/Tst/codeblockreusefeature/add_dummy_data.py
index 35dd3ab8a5158dc698a153edb90a9a276f0c7d2a..aabdf1bc6b4e85dce57e38e7ff91db668848d08e 100644
--- a/Tst/codeblockreusefeature/add_dummy_data.py
+++ b/Tst/codeblockreusefeature/add_dummy_data.py
@@ -26,14 +26,18 @@ def dummy_data_code_block():
                   description="Increase the HK Frequency",
                   comment="Increase the Frequncy to 1 HK per second",
                   command_code="cfl.Tcsend_DB('SASW ModHkPeriodCmd', 1, 8, pool_name='new_tmtc_pool')"),
-        Pre_Post_Con(type="pre",
-                  name="None",
-                  description="No Pre-Condition needed",
-                  condition="logger.info('No pre-conditions have been given')\nsuccess = True"),
-        Pre_Post_Con(type="post",
+        # Pre_Post_Con(type="pre",
+        #           name="None",
+        #           description="No Pre-Condition needed",
+        #           condition="logger.info('No pre-conditions have been given')\nsuccess = True"),
+        # Pre_Post_Con(type="post",
+        #              name="None",
+        #              description="No Post-Condition needed",
+        #              condition="logger.info('No post-conditions have been given')\nsuccess = True")
+        Pre_Post_Con(type=None,
                      name="None",
-                     description="No Post-Condition needed",
-                     condition="logger.info('No post-conditions have been given')\nsuccess = True")
+                     description="No pre/post-condition needed",
+                     condition="logger.info('No pre/post-conditions have been given')\nsuccess = True")
 
     ])
 
diff --git a/Tst/codeblockreusefeature/codeblockreuse.py b/Tst/codeblockreusefeature/codeblockreuse.py
index 4a643bb9751b2a7758bfa0cd0c13e70554524527..3bd1a25d500a4d90a295faa4f6dd2ffd5470eaa4 100755
--- a/Tst/codeblockreusefeature/codeblockreuse.py
+++ b/Tst/codeblockreusefeature/codeblockreuse.py
@@ -391,7 +391,7 @@ class CBRSearch(Gtk.Box):
         # self.popover_filter_columns.add(self.listbox_columns)
 
         # search field
-        self.input_field = Gtk.Entry()
+        self.input_field = Gtk.SearchEntry()
         self.pack_start(self.input_field, False, False, 0)
         self.input_buffer = Gtk.EntryBuffer()
         self.input_field.set_buffer(self.input_buffer)
diff --git a/Tst/codeblockreusefeature/db_interaction.py b/Tst/codeblockreusefeature/db_interaction.py
index 170030bc9aeef746f967acedda80f8973e2cb96f..1afcc6373d8047eb0d0fa4705df412a529195b78 100644
--- a/Tst/codeblockreusefeature/db_interaction.py
+++ b/Tst/codeblockreusefeature/db_interaction.py
@@ -42,8 +42,8 @@ def query_code_types():
         session.expunge_all()
     return data
 
-# -------------- Pre-Post Condition -------------------
 
+# -------------- Pre-Post Condition -------------------
 def write_into_pre_post_con(code_type, name, description, code_block):
     # Check if the name already exists
     data = get_pre_post_con(code_type)
@@ -64,11 +64,13 @@ def delete_db_row_pre_post(id):
 
 def get_pre_post_con(code_type):
     with db_schema.session_scope() as session:
-        data = session.query(Pre_Post_Con).filter(Pre_Post_Con.type.contains(code_type)).all()
+        if code_type is None:
+            data = session.query(Pre_Post_Con).all()
+        else:
+            data = session.query(Pre_Post_Con).filter(Pre_Post_Con.type.contains(code_type)).all()
         session.expunge_all()
     return data
 
 
-
 if __name__ == '__main__':
     query_code_types()
diff --git a/Tst/config_editor/config_editor.py b/Tst/config_editor/config_editor.py
index b07382c92079767a94bded2aee94117317b1b7ce..968f9cd9dbcdb6b193232bf5d15563bacdc65a49 100644
--- a/Tst/config_editor/config_editor.py
+++ b/Tst/config_editor/config_editor.py
@@ -73,6 +73,8 @@ module_logger.setLevel(level=logging.WARNING)
 
 SHOW_MERGE_PAGE = confignator.get_bool_option('config-editor-general', 'show-merge-page')
 
+FILE_CHOOSER_OPTIONS = ['basic-cfg', 'docu', 'log-file', 'datapool-items']
+
 
 def create_console_handler(frmt=logging_format):
     """
@@ -612,10 +614,17 @@ class OptionLine:
         self.set_data()
 
         self.option_entry.connect('changed', self.on_entry_edited)
-        if section == 'paths':
+
+        # add file chooser buttons for selected options
+        if 'paths' in section and option not in FILE_CHOOSER_OPTIONS:
+            self.btn_choose_dir = Gtk.Button.new_from_icon_name('document-open-symbolic', Gtk.IconSize.BUTTON)
+            self.btn_choose_dir.set_tooltip_text('Choose a path')
+            self.btn_choose_dir.connect('clicked', self.on_choose_dir, True)
+
+        elif option in FILE_CHOOSER_OPTIONS:
             self.btn_choose_dir = Gtk.Button.new_from_icon_name('document-open-symbolic', Gtk.IconSize.BUTTON)
             self.btn_choose_dir.set_tooltip_text('Choose a path')
-            self.btn_choose_dir.connect('clicked', self.on_choose_dir)
+            self.btn_choose_dir.connect('clicked', self.on_choose_dir, False)
 
     def get_entry_text(self):
         """ Get the current text of the entry field """
@@ -644,12 +653,17 @@ class OptionLine:
         self.set_label_text()
         self.set_entry_text()
 
-    def on_choose_dir(self, button):
+    def on_choose_dir(self, button, choose_dir):
         """ Event when the button to open a FileChooserDialog was clicked """
-        dialog = Gtk.FileChooserDialog('Please choose a file',
-                                       None,
-                                       Gtk.FileChooserAction.SELECT_FOLDER,
-                                       (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
+        if choose_dir:
+            dialog = Gtk.FileChooserDialog('Please choose a directory', None,
+                                           Gtk.FileChooserAction.SELECT_FOLDER,
+                                           (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
+        else:
+            dialog = Gtk.FileChooserDialog('Please choose a file',
+                                           None, 0,
+                                           (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
+
         response = dialog.run()
         if response == Gtk.ResponseType.OK:
             path = dialog.get_filename()
diff --git a/Tst/confignator/confignator/config.py b/Tst/confignator/confignator/config.py
index 1a9e7a48361e6b5ff7060120c43011075cd53eed..806a60e20e1d083ab590b3b19969ed51c679593d 100755
--- a/Tst/confignator/confignator/config.py
+++ b/Tst/confignator/confignator/config.py
@@ -415,19 +415,18 @@ class Config(configparser.ConfigParser):
         :param str option: option name (case insensitive)
         :param str value: value which should be saved
         """
-        # find the file where the option is from
+        # find the file where the section/option is from
         occurrence = []
         for file in self.files:
             tempcfg = get_config(file_path=file, load_basic_files=False, load_denoted_files=False, check_interpolation=False)
-            found = tempcfg.has_option(section=section, option=option)
+            found = tempcfg.has_section(section=section)
             if found is True:
                 occurrence.append(file)
         if len(occurrence) == 0:
-            self.logger.warning('No configuration files with the entry [{}[{}] found'.format(section, option))
-            # ToDo: should it be saved as a new section & option? In which file?
-            self.logger.critical('# ToDo: should it be saved as a new section & option?')
+            self.logger.error('No configuration files with section [{}] found. Saving not possible.'.format(section))
+            # self.logger.error('should it be saved as a new section & option?')
         elif len(occurrence) > 1:
-            self.logger.error('Found the entry [{}][{}] in more than one configuration file. Saving not possible. Occurrences in: {}'.format(section, option, occurrence))
+            self.logger.error('Found section [{}] in more than one configuration file. Saving not possible. Occurrences in: {}'.format(section, occurrence))
         elif len(occurrence) == 1:
             # load the config (only the specified file, no other)
             tempcfg = get_config(file_path=occurrence[0], load_basic_files=False, load_denoted_files=False, check_interpolation=False)
diff --git a/Tst/json_to_barescript.py b/Tst/json_to_barescript.py
index 7015b9329ac92115b5d00c529feb66a8caac0bde..87b13f388f72c6a35c397ad5a1b090e1165b0aca 100755
--- a/Tst/json_to_barescript.py
+++ b/Tst/json_to_barescript.py
@@ -13,8 +13,10 @@ import os
 import json
 import sys
 
+MIB_VERSION = '1.5'
 
-def run(jfile, outfile):
+
+def run(jfile, outfile, reportfunc=False, specfile=None):
 
     if os.path.isfile(jfile):
         data = json.load(open(jfile, 'r'))
@@ -32,28 +34,52 @@ def run(jfile, outfile):
     script += '# Software Version: ' + data['_iasw_version'] + '\n'
     script += '# Author: UVIE\n# Date: {}\n'.format(date)
     script += '#--------------------------------------------\n\n'
-    script += '# COMMENT: {}\n\n\n'.format(data['_comment'])
-
-    script += '# Precond.\n# {}\n'.format(data['_precon_descr'])
+    script += '# COMMENT: {}\n\n\n'.format(data['_comment'].replace('\n', '\n# '))
+
+    if reportfunc:
+        if specfile is None:
+            specfile = '{}-TS-{}.csv_PIPE'.format(data['_name'], data['_spec_version'])
+        script += 'specfile = "{}"\n'.format(specfile)
+        script += 'rep_version = 1\n'
+        script += 'mib_version = "{}"\n'.format(MIB_VERSION)
+        script += 'ask_tc_exec = True\n'
+        script += 'report = cfl.TestReport(specfile, rep_version, mib_version, gui=True)\n\n'
+
+    script += '# Precond.\n# {}\n#! CCS.BREAKPOINT\n\n'.format(data['_precon_descr'])
     # script += '{}\n\n\n'.format(data['_precon_code'].strip())  # Add the precondition code
 
     for step in data['sequences'][0]['steps']:
         comment = '# COMMENT: {}\n'.format(step['_step_comment'].strip()) if step['_step_comment'] != '' else ''
+        cmd_code = step['_command_code'].strip()
+        cmd_code += '\n' if cmd_code else ''
+
+        if reportfunc:
+            step_tag = 'Step {}'.format(step['_step_number'])
+            exec_step = 'report.execute_step("{}", ask=ask_tc_exec)\n'.format(step_tag)
+            verif_step = 'report.verify_step("{}")\n'.format(step_tag)
+        else:
+            exec_step = ''
+            verif_step = ''
 
         txt = '# STEP {}\n' \
               '# {}\n' \
-              '{}\n' \
-              '# VERIFICATION: {}\n{}\n\n'.format(step['_step_number'], step['_description'].strip(),
-                                                  step['_command_code'].strip(),
-                                                  step['_verification_description'].strip(),
-                                                  # step['_verification_code'].strip(), # Add verification code
-                                                  comment)
+              '{}' \
+              '{}' \
+              '# VERIFICATION: {}\n{}{}\n#! CCS.BREAKPOINT\n\n'.format(step['_step_number'], step['_description'].strip(), exec_step,
+                                                                      cmd_code,
+                                                                      step['_verification_description'].strip(),
+                                                                      verif_step,
+                                                                      # step['_verification_code'].strip(), # Add verification code
+                                                                      comment)
 
         script += txt
 
     script += '# Postcond.\n# {}\n'.format(data['_postcon_descr'])
     # script += data['_postcon_code'].strip()  # Add the postcondition code
 
+    if reportfunc:
+        script += '\nreport.export()\n\n'
+
     if outfile[-1] == '/':  # If path is given not the actual filename
         outfile = outfile + data['_name'] + '-TS' + '-'.join(data['_spec_version']) + '.py'
 
@@ -70,4 +96,4 @@ if __name__ == '__main__':
         outputfile = os.getcwd() + '/'
         #outputfile = '/'.join(json_file_path[:-len(json_file_path.split('/')[-1])-1]) + '/'  # This would take the json File path
 
-    run(json_file_path, outputfile)
+    run(json_file_path, outputfile, reportfunc=False)
diff --git a/Tst/json_to_csv.py b/Tst/json_to_csv.py
index cb57d96c6cb02c87ffbd5de9dccc6d14a8a8331b..366d6d62996de380ef7fab7f023402b345c34a66 100755
--- a/Tst/json_to_csv.py
+++ b/Tst/json_to_csv.py
@@ -14,21 +14,23 @@ def run(jfile, outfile):
         data = json.loads(jfile)
 
     header = 'Item|Description|Verification|TestResult'
-    name = '{}|{}|Test spec. version: {}| IASW-{}'.format(data['_name'], data['_description'], data['_spec_version'], data['_iasw_version'])
+    name = '{}|{}|Test spec. version: {}| IASW-{}'.format(data['_name'], replace_newline(data['_description']),
+                                                          data['_spec_version'], data['_iasw_version'])
     # Date from last time the json file was changed + current date
     date = 'Date||{}|'.format(datetime.datetime.now().strftime('%Y-%m-%d'))
-    testcomment = 'Comment|{}||'.format(data['_comment'])
-    precond = 'Precond.|{}||'.format(data['_precon_descr'])
-    postcond = 'Postcond.|{}||'.format(data['_postcon_descr'])
+    testcomment = 'Comment|{}||'.format(replace_newline(data['_comment']))
+    precond = 'Precond.|{}||'.format(replace_newline(data['_precon_descr']))
+    postcond = 'Postcond.|{}||'.format(replace_newline(data['_postcon_descr']))
     steps = []
 
     for step in data['sequences'][0]['steps']:
 
-        line = 'Step {}|{}|{}|'.format(step['_step_number'], step['_description'], step['_verification_description'])
+        line = 'Step {}|{}|{}|'.format(step['_step_number'], replace_newline(step['_description']),
+                                       replace_newline(step['_verification_description']))
         steps.append(line)
 
         if step['_step_comment'] != '':
-            comment = 'Comment|{}||'.format(step['_step_comment'])
+            comment = 'Comment|{}||'.format(replace_newline(step['_step_comment']))
             steps.append(comment)
 
     if outfile[-1] == '/':  # If only path is given but no filename
@@ -43,6 +45,10 @@ def run(jfile, outfile):
         fd.write(buf)
 
 
+def replace_newline(txt):
+    return txt.replace('\n', '; ')
+
+
 if __name__ == '__main__':
     json_file_path = sys.argv[1]
 
@@ -50,6 +56,5 @@ if __name__ == '__main__':
         outputfile = sys.argv[2]
     else:  # If no filename is given take the working directory path, filename is used from the json file
         outputfile = os.getcwd() + '/'
-        # outputfile = '/'.join(json_file_path[:-len(json_file_path.split('/')[-1])-1]) + '/'  # This would take the json File path
 
     run(json_file_path, outputfile)
diff --git a/Tst/tst/app_menu.xml b/Tst/tst/app_menu.xml
index db4430cda43cef0e45de5b163370e3fb6d4efb5a..c5c6d64ee193faa83ca1d241f0ce66256ef9ec43 100644
--- a/Tst/tst/app_menu.xml
+++ b/Tst/tst/app_menu.xml
@@ -6,11 +6,13 @@
             <section>
                 <item>
                     <attribute name="label" translatable="yes">New</attribute>
-                    <attribute name="action">win.make_new_test</attribute>
+                    <attribute name="action">win.makenewtest</attribute>
+                    <attribute name="accel">&lt;Primary&gt;n</attribute>
                 </item>
                 <item>
                     <attribute name="label" translatable="yes">Open</attribute>
                     <attribute name="action">win.open</attribute>
+                    <attribute name="accel">&lt;Primary&gt;o</attribute>
                 </item>
                 <item>
                     <attribute name="label" translatable="yes">Save</attribute>
@@ -19,7 +21,8 @@
                 </item>
                 <item>
                     <attribute name="label" translatable="yes">Save as</attribute>
-                    <attribute name="action">win.save_as</attribute>
+                    <attribute name="action">win.saveas</attribute>
+                    <attribute name="accel">&lt;Shift&gt;&lt;Primary&gt;s</attribute>
                 </item>
                 <item>
                     <attribute name="label" translatable="yes">Import CSV</attribute>
@@ -95,10 +98,10 @@
                     <attribute name="label" translatable="yes">Show JSON of the model</attribute>
                     <attribute name="action">win.model_viewer_toggle_hide</attribute>
                 </item>
-                <item>
+<!--                <item>
                     <attribute name="label" translatable="yes">Apply CSS</attribute>
                     <attribute name="action">win.apply_css</attribute>
-                </item>
+                </item>-->
                 <item>
                     <attribute name="label" translatable="yes">About</attribute>
                     <attribute name="action">win.about_us</attribute>
diff --git a/Tst/tst/data_pool_tab.py b/Tst/tst/data_pool_tab.py
index 5a7ba38e3f34acb95d3197c113a653456eb7040e..f94182f9414f62f879119fda9a4ea5f6354729fc 100644
--- a/Tst/tst/data_pool_tab.py
+++ b/Tst/tst/data_pool_tab.py
@@ -11,34 +11,39 @@ sys.path.append(confignator.get_option('paths', 'ccs'))
 import ccs_function_lib as cfl
 import s2k_partypes as s2k
 
-try:
-    DP_ITEMS_SRC_FILE = confignator.get_option('database', 'datapool-items')
-except confignator.config.configparser.NoOptionError:
-    DP_ITEMS_SRC_FILE = None
 
 logger = logging.getLogger()
+DP_ITEMS_SRC_FILE = cfl.DP_ITEMS_SRC_FILE
 
 
 def reload_dp_data():
     global DP_ITEMS_SRC_FILE
-    global dictionary_of_data_pool
+    # global dictionary_of_data_pool
     global list_of_data_pool
     global data_pool_sublist
 
     try:
-        dictionary_of_data_pool = cfl.get_data_pool_items(src_file=DP_ITEMS_SRC_FILE)
+        list_of_data_pool, _src = cfl.get_data_pool_items(src_file=DP_ITEMS_SRC_FILE)
     except (FileNotFoundError, ValueError):
         logger.warning('Could not load data pool from file: {}. Using MIB instead.'.format(DP_ITEMS_SRC_FILE))
-        dictionary_of_data_pool = cfl.get_data_pool_items()
+        list_of_data_pool, _src = cfl.get_data_pool_items()
 
-    if not isinstance(dictionary_of_data_pool, list):
-        list_of_data_pool = list(dictionary_of_data_pool.keys())
+    # check if DP items are from MIB or CSV
+    if not _src:
         data_pool_sublist = get_data_pool_sublist()
     else:
-        data_pool_sublist = dictionary_of_data_pool
+        data_pool_sublist = list_of_data_pool
+
+    # if not isinstance(list_of_data_pool, list):
+    #     data_pool_sublist = get_data_pool_sublist()
+    # else:
+    #     data_pool_sublist = dictionary_of_data_pool
 
 
 def get_data_pool_sublist():
+
+    data_pool_sublist.clear()  # clear content from previously selected MIB
+
     for counter in list_of_data_pool:
         pcf_pid = str(int(counter[0]))  # cast PID to int in case data type is wrong in MIB SQL (e.g. in CHEOPS)
         pcf_descr = str(counter[1])
@@ -57,16 +62,21 @@ def get_data_pool_sublist():
 
 data_pool_sublist = []
 try:
-    dictionary_of_data_pool = cfl.get_data_pool_items(src_file=DP_ITEMS_SRC_FILE)
+    list_of_data_pool, _src = cfl.get_data_pool_items(src_file=DP_ITEMS_SRC_FILE)
 except (FileNotFoundError, ValueError):
     logger.warning('Could not load data pool from file: {}. Using MIB instead.'.format(DP_ITEMS_SRC_FILE))
-    dictionary_of_data_pool = cfl.get_data_pool_items()
+    list_of_data_pool, _src = cfl.get_data_pool_items()
 
-if not isinstance(dictionary_of_data_pool, list):
-    list_of_data_pool = list(dictionary_of_data_pool.keys())
+# check if DP items are from MIB or CSV
+if not _src:
     data_pool_sublist = get_data_pool_sublist()
 else:
-    data_pool_sublist = dictionary_of_data_pool
+    data_pool_sublist = list_of_data_pool
+
+# if not isinstance(list_of_data_pool, list):
+#     data_pool_sublist = get_data_pool_sublist()
+# else:
+#     data_pool_sublist = list_of_data_pool
 
 
 class DataPoolTable(Gtk.Grid):
@@ -84,26 +94,24 @@ class DataPoolTable(Gtk.Grid):
         # setting the filter function
         self.data_pool_filter.set_visible_func(self.data_pool_filter_func)
 
-        self.pid = None
-
-        # Create ListStores for the ComboBoxes
-        # self.pid_liststore = Gtk.ListStore(str)
-        # for pid_ref in pid_list:
-        #     self.pid_liststore.append([pid_ref, ])
-        # self.current_filter_type = None
+        # filter entry
+        self.filter_entry = Gtk.SearchEntry()
+        self.filter_entry.connect('search-changed', self.do_filter)
+        self.attach(self.filter_entry, 0, 0, 8, 1)
 
         # creating the treeview, making it use the filter a model, adding columns
         self.treeview = Gtk.TreeView.new_with_model(Gtk.TreeModelSort(self.data_pool_filter))
-        for i, column_title in enumerate(["PID", "NAME", "DATATYPE", "MULT", "PAR/VAR", "DESCR"]):
+        for i, column_title in enumerate(["PID", "NAME", "DATATYPE", "MULT", "VALUE", "DESCR"]):
             renderer = Gtk.CellRendererText()
             column = Gtk.TreeViewColumn(column_title, renderer, text=i)
+
+            if column_title == "VALUE":
+                column.set_fixed_width(200)
+
             column.set_sort_column_id(i)
+            column.set_resizable(True)
             self.treeview.append_column(column)
 
-        # Handle selection
-        self.selected_row = self.treeview.get_selection()
-        #self.selected_row.connect("changed", self.item_selected)
-
         # setting up layout, treeview in scrollwindow
         self.scrollable_treelist = Gtk.ScrolledWindow()
         self.scrollable_treelist.set_vexpand(True)
@@ -125,43 +133,29 @@ class DataPoolTable(Gtk.Grid):
 
         self.show_all()
 
+    def do_filter(self, widget, *args):
+        self.current_filter_data_pool = widget.get_text()
+        self.data_pool_filter.refilter()
+
     def on_treeview_clicked(self, widget, event):
         if event.button == 3:
             self.rcl_menu.popup_at_pointer()
 
-    def copy_cell_content(self, cell_idx):
+    def copy_cell_content(self, cell_idx, as_string=False):
         treeselection = self.treeview.get_selection()
         model, it = treeselection.get_selected()
         if model is not None and it is not None:
-            self.clipboard.set_text(model[it][cell_idx], -1)
-
-    def on_pid_combo_changed(self, combo):
-        combo_iter = combo.get_active_iter()
-        if combo_iter is not None:
-            model = combo.get_model()
-            number = model[combo_iter][0]
-            self.current_filter_data_pool = int(number)
-
-        self.data_pool_filter.refilter()
-
-    def on_clear_button_clicked(self, widget):
-        self.current_filter_data_pool = None
-        self.data_pool_filter.refilter()
-
-    def item_selected(self, selection):
-        model, row = selection.get_selected()
-        if row is not None:
-            self.pid = model[row][:2]
+            if as_string:
+                self.clipboard.set_text('"{}"'.format(model[it][cell_idx]), -1)
+            else:
+                self.clipboard.set_text(model[it][cell_idx], -1)
 
     def data_pool_filter_func(self, model, iter, data):
-
-        if (
-                self.current_filter_data_pool is None
-                or self.current_filter_data_pool == "None"
-        ):
+        if not self.current_filter_data_pool:
             return True
         else:
-            return model[iter][0] == self.current_filter_data_pool
+            # match search string in PID, NAME, DESCR columns
+            return ' '.join([*model[iter][:2], model[iter][5]]).lower().count(self.current_filter_data_pool.lower())
 
     def on_drag_data_get(self, treeview, drag_context, selection_data, info, time, *args):
         treeselection = treeview.get_selection()
@@ -180,11 +174,18 @@ class TreeRightClickMenu(Gtk.Menu):
         entry_2 = Gtk.MenuItem('Copy NAME')
         self.attach(entry_2, 0, 1, 1, 2)
         entry_2.show()
+        entry_3 = Gtk.MenuItem('Copy NAME as string')
+        self.attach(entry_3, 0, 1, 2, 3)
+        entry_3.show()
         entry_1.connect('activate', self.on_copy_pid, cruf)
         entry_2.connect('activate', self.on_copy_name, cruf)
+        entry_3.connect('activate', self.on_copy_name_as_string, cruf)
 
     def on_copy_pid(self, menu_item, cruf, *args):
         cruf.copy_cell_content(0)
 
     def on_copy_name(self, menu_item, cruf, *args):
         cruf.copy_cell_content(1)
+
+    def on_copy_name_as_string(self, menu_item, cruf, *args):
+        cruf.copy_cell_content(1, as_string=True)
diff --git a/Tst/tst/generator.py b/Tst/tst/generator.py
index 76cea11cc7052c70841ef6a309f303c575afdead..f3821b635353d5ae1ceb841dcaef3db6c971eb61 100644
--- a/Tst/tst/generator.py
+++ b/Tst/tst/generator.py
@@ -33,7 +33,7 @@ def create_file_name(name):
     :param str name: the name which should be transformed into a valid file name
     """
     assert isinstance(name, str)
-    file_name = name.replace(' ', '_')
+    file_name = name.replace(' ', '_').replace('-', '_')
     file_name = file_name.lower()
 
     return file_name
@@ -51,7 +51,7 @@ def create_class_name(name):
     """ Take the name of the test specification and make a valid python class name out of it
     :param str name: the name of the test specification"""
     assert isinstance(name, str)
-    class_name = name.replace(' ', '')
+    class_name = name.replace(' ', '').replace('-', '_')
     return class_name
 
 
diff --git a/Tst/tst/generator_templates/co_step.py b/Tst/tst/generator_templates/co_step.py
index 87902bf120cea252302a5ec6237357e3198d54d3..d1cb1e93c06c24372887a742910d9a7625653e00 100644
--- a/Tst/tst/generator_templates/co_step.py
+++ b/Tst/tst/generator_templates/co_step.py
@@ -22,8 +22,8 @@
             step_end_cuc = cfl.get_last_pckt_time(pool_name=pool_name, string=False)
             report.command_step_end(step_param=param, step_end_cuc=step_end_cuc, step_id=step_id)
 
-        summary =self.step_verification(pool_name=pool_name, step_start_cuc=step_start_cuc, param=param, summary=summary,
-                                        ver_file=${testSpecFileName}_verification, ver_class="${testSpecClassName}Verification",
-                                        ver_func="step_${testStepNumber}", step_id=step_id)
+        summary = self.step_verification(pool_name=pool_name, step_start_cuc=step_start_cuc, param=param, summary=summary,
+                                         ver_file=${testSpecFileName}_verification, ver_class="${testSpecClassName}Verification",
+                                         ver_func="step_${testStepNumber}", step_id=step_id)
 
         return summary
diff --git a/Tst/tst/generator_templates/run_header.py b/Tst/tst/generator_templates/run_header.py
index e10e981135bfade378433e2c52df90505533ef86..d9540f3b5bd84c31809895e37a07f053069f69f3 100644
--- a/Tst/tst/generator_templates/run_header.py
+++ b/Tst/tst/generator_templates/run_header.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-# this script should provide an easy way to execute single steps of the test IASW_1_DB
+# this script should provide an easy way to execute single steps of a test
 import logging
 import threading
 import os
@@ -27,12 +27,15 @@ import ${testSpecFileName}_verification
 importlib.reload(${testSpecFileName}_command)
 importlib.reload(${testSpecFileName}_verification)
 
-# create a instance of the test and the verification
+# create an instance of the test and the verification
 testinstance = ${testSpecFileName}_command.${testSpecClassName}(do_verification=True)
 verification_instance = ${testSpecFileName}_verification.${testSpecClassName}Verification()
 
-# define the pool name
-pool_name = 'new_tmtc_pool'
+# SETUP
+pool_name = 'LIVE'
+save_pool = False
+verify_offline = False
+interactive = False
 
 #! CCS.BREAKPOINT
 # run the whole test
@@ -40,13 +43,13 @@ threading.Thread(target=testinstance.run,
                  kwargs={'pool_name': pool_name},
                  daemon=True).start()
 
-if False:
+if save_pool:
     # Save the pool to a file
     threading.Thread(target=testinstance.save_pool_in_file,
                      kwargs={'pool_name': pool_name,
                              'save_pool': True},
                      daemon=True).start()
-if False:
+if verify_offline:
     # do Verification of command log file and saved pool
     threading.Thread(target=verification_instance.verify,
                      kwargs={'command_log_file':'logs_test_runs/Simple_Example_command_cmd.log',
@@ -58,6 +61,6 @@ if False:
 # Run the test step by step
 
 #! CCS.BREAKPOINT
-if False:
+if interactive:
     # Pre-Conditions: $TestPreconDescription
     threading.Thread(target=testinstance.establish_preconditions, kwargs={'pool_name': pool_name}, daemon=True).start()
diff --git a/Tst/tst/style/style.css b/Tst/tst/style/style.css
index 11ddedc1717e66c1d0edc5609b439b3638b3e9ff..94f5ee789c24229bd667c3b4266bf2e075ef36ae 100644
--- a/Tst/tst/style/style.css
+++ b/Tst/tst/style/style.css
@@ -126,4 +126,14 @@
 }
 .highlight-2 {
     border-color: orange;
-}
\ No newline at end of file
+}
+
+.board {
+    background-color: @bg_color;
+}
+.text-view {
+    padding: 3px;
+}
+/*.cond-dialog label{
+    font-weight: bold;
+}*/
\ No newline at end of file
diff --git a/Tst/tst/tc_management.py b/Tst/tst/tc_management.py
index 8ea27a8253efe574a71022fd6026d97e0f5fa8c1..2254902bff689efb4b986d056fa99829ab569d5f 100644
--- a/Tst/tst/tc_management.py
+++ b/Tst/tst/tc_management.py
@@ -198,16 +198,27 @@ class TcTable(Gtk.Grid):
         self.scrollable_treelist = Gtk.ScrolledWindow()
         self.scrollable_treelist.set_vexpand(True)
         self.scrollable_treelist.set_hexpand(True)
-        self.attach(self.scrollable_treelist, 0, 1, 8, 10)
+        self.paned = Gtk.Paned(orientation=Gtk.Orientation.VERTICAL)
+        self.paned.set_wide_handle(True)
+        self.paned.set_position(int(cfl.cfg['tst-preferences']['main-window-height']) * 0.6)
+        # self.attach(self.scrollable_treelist, 0, 1, 8, 10)
+        self.attach(self.paned, 0, 1, 8, 10)
 
+        self.grid = Gtk.Grid()
+        self.paned.add1(self.grid)
+        # self.paned.add1(self.scrollable_treelist)
+
+        self.grid.attach(self.scrollable_treelist, 0, 1, 8, 10)
         self.scrollable_treelist.add(self.treeview)
 
         self.command_entry = Gtk.Entry()
         self.command_entry.set_placeholder_text("<Command Variables>")
-        self.attach_next_to(self.command_entry, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 8, 1)
+        self.command_entry.set_editable(False)
+        self.grid.attach_next_to(self.command_entry, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 8, 1)
 
         self.variable_box = CommandDescriptionBox()
-        self.attach_next_to(self.variable_box, self.command_entry, Gtk.PositionType.BOTTOM, 8, 5)
+        # self.attach_next_to(self.variable_box, self.command_entry, Gtk.PositionType.BOTTOM, 8, 5)
+        self.paned.add2(self.variable_box)
 
         # Set up Drag and Drop
         self.treeview.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
diff --git a/Tst/tst/tm_management.py b/Tst/tst/tm_management.py
index 7105be0617a1124a92f33d442c839116bb8aa9a5..a6c6d5b09172a5cfa429458c8f970a058ddb2565 100644
--- a/Tst/tst/tm_management.py
+++ b/Tst/tst/tm_management.py
@@ -120,7 +120,13 @@ class TmTable(Gtk.Grid):
         self.scrollable_treelist = Gtk.ScrolledWindow()
         self.scrollable_treelist.set_vexpand(True)
         self.scrollable_treelist.set_hexpand(True)
-        self.attach(self.scrollable_treelist, 0, 1, 8, 10)
+        self.paned = Gtk.Paned(orientation=Gtk.Orientation.VERTICAL)
+        self.paned.set_wide_handle(True)
+        self.paned.set_position(int(cfl.cfg['tst-preferences']['main-window-height']) * 0.6)
+        # self.attach(self.scrollable_treelist, 0, 1, 8, 10)
+        self.attach(self.paned, 0, 1, 8, 10)
+
+        self.paned.add1(self.scrollable_treelist)
 
         self.scrollable_treelist.add(self.treeview)
 
@@ -129,7 +135,8 @@ class TmTable(Gtk.Grid):
         # self.attach_next_to(self.telemetry_entry, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 8, 1)
 
         self.secondary_box = TmSecondaryTable()
-        self.attach_next_to(self.secondary_box, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 8, 5)
+        # self.attach_next_to(self.secondary_box, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 8, 5)
+        self.paned.add2(self.secondary_box)
 
         # Set up Drag and Drop
         self.treeview.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
diff --git a/Tst/tst/tst.py b/Tst/tst/tst.py
index 8dda45f38447b94a3e4a4fa9dbca1e2b311f5fe7..dd5d03f0c892f787e0e118263b4c5568919d7395 100755
--- a/Tst/tst/tst.py
+++ b/Tst/tst/tst.py
@@ -201,7 +201,7 @@ class TstAppWindow(Gtk.ApplicationWindow):
         self.product_paths = []
 
         # actions
-        action = Gio.SimpleAction.new('make_new_test', None)
+        action = Gio.SimpleAction.new('makenewtest', None)
         action.connect('activate', self.on_new_test)
         self.add_action(action)
 
@@ -213,7 +213,7 @@ class TstAppWindow(Gtk.ApplicationWindow):
         action.connect('activate', self.on_save)
         self.add_action(action)
 
-        action = Gio.SimpleAction.new('save_as', None)
+        action = Gio.SimpleAction.new('saveas', None)
         action.connect('activate', self.on_save_as)
         self.add_action(action)
 
@@ -265,15 +265,29 @@ class TstAppWindow(Gtk.ApplicationWindow):
         self.btn_save.set_icon_name('document-save')
         self.btn_save.set_tooltip_text('Save')
         self.btn_save.connect('clicked', self.on_save)
+        self.btn_save_as = Gtk.ToolButton()
+        self.btn_save_as.set_icon_name('document-save-as')
+        self.btn_save_as.set_tooltip_text('Save as')
+        self.btn_save_as.connect('clicked', self.on_save_as)
         # self.btn_show_model_viewer = Gtk.ToolButton()
         # self.btn_show_model_viewer.set_icon_name('accessories-dictionary-symbolic')
         # self.btn_show_model_viewer.set_tooltip_text('Show/hide model viewer')
         # self.btn_show_model_viewer.connect('clicked', self.model_viewer_toggle_hide)
-        self.btn_generate_products = Gtk.ToolButton()
-        self.btn_generate_products.set_label('Generate scripts')
-        self.btn_generate_products.set_icon_name('text-x-python')
-        self.btn_generate_products.set_tooltip_text('Generate command.py, verification.py and manually.py')
-        self.btn_generate_products.connect('clicked', self.on_generate_products)
+        self.btn_export_csv = Gtk.ToolButton()
+        self.btn_export_csv.set_label('Export to CSV')
+        self.btn_export_csv.set_icon_name('text-csv')
+        self.btn_export_csv.set_tooltip_text('Export current spec to CSV')
+        self.btn_export_csv.connect('clicked', self.on_generate_csv)
+        # self.btn_generate_products = Gtk.ToolButton()
+        # self.btn_generate_products.set_label('Generate scripts')
+        # self.btn_generate_products.set_icon_name('text-x-python')
+        # self.btn_generate_products.set_tooltip_text('Generate command.py, verification.py and manually.py')
+        # self.btn_generate_products.connect('clicked', self.on_generate_products)
+        self.btn_generate_script = Gtk.ToolButton()
+        self.btn_generate_script.set_label('Generate scripts')
+        self.btn_generate_script.set_icon_name('text-x-python')
+        self.btn_generate_script.set_tooltip_text('Generate Python script of the current test')
+        self.btn_generate_script.connect('clicked', self.on_generate_barescript)
 
         self.btn_start_ccs_editor = Gtk.ToolButton()
         self.btn_start_ccs_editor.set_label('Start CCS')
@@ -294,10 +308,13 @@ class TstAppWindow(Gtk.ApplicationWindow):
         self.toolbar.insert(self.btn_new_file, 0)
         self.toolbar.insert(self.btn_open_file, 1)
         self.toolbar.insert(self.btn_save, 2)
+        self.toolbar.insert(self.btn_save_as, 3)
         # self.toolbar.insert(self.btn_show_model_viewer, 2)
-        self.toolbar.insert(self.btn_generate_products, 3)
-        self.toolbar.insert(self.btn_start_ccs_editor, 4)
-        self.toolbar.insert(self.btn_open_progress_view, 5)
+        self.toolbar.insert(self.btn_export_csv, 4)
+        # self.toolbar.insert(self.btn_generate_products, 5)
+        self.toolbar.insert(self.btn_generate_script, 5)
+        self.toolbar.insert(self.btn_start_ccs_editor, 6)
+        self.toolbar.insert(self.btn_open_progress_view, 7)
         
         # IDB chooser
         self.idb_chooser = Gtk.ToolButton()
@@ -307,12 +324,12 @@ class TstAppWindow(Gtk.ApplicationWindow):
         self.idb_chooser.set_label_widget(label)
         self.idb_chooser.set_tooltip_text('Select IDB')
         self.idb_chooser.connect('clicked', self.on_set_idb_version)
-        self.toolbar.insert(self.idb_chooser, 6)
+        self.toolbar.insert(self.idb_chooser, 8)
 
         # separator
         sepa = Gtk.SeparatorToolItem()
         sepa.set_expand(True)
-        self.toolbar.insert(sepa, 7)
+        self.toolbar.insert(sepa, 9)
 
         # logo
         self.unilogo = Gtk.ToolButton()
@@ -321,7 +338,7 @@ class TstAppWindow(Gtk.ApplicationWindow):
         icon = Gtk.Image.new_from_pixbuf(pixbuf)
         self.unilogo.set_icon_widget(icon)
         self.unilogo.connect('clicked', self.on_about)
-        self.toolbar.insert(self.unilogo, 8)
+        self.toolbar.insert(self.unilogo, 10)
         self.box.pack_start(self.toolbar, False, True, 0)
         
         self.info_bar = None
@@ -332,6 +349,7 @@ class TstAppWindow(Gtk.ApplicationWindow):
 
         # add the notebook for the test specifications
         self.notebook = Gtk.Notebook()
+        self.notebook.set_scrollable(True)
         self.notebook.connect('switch-page', self.update_model_viewer)
         self.work_desk.pack1(self.notebook)
 
@@ -489,6 +507,8 @@ class TstAppWindow(Gtk.ApplicationWindow):
             label_text = 'New test'
         label = self.notebook_page_label(label_text=label_text)
         page_index = self.notebook.append_page(child=test_instance.view, tab_label=label)
+        self.notebook.set_tab_reorderable(test_instance.view, True)
+
         # reload the data of the widgets, in order to display it
         test_instance.view.update_widget_data()
         self.show_all()
@@ -500,10 +520,11 @@ class TstAppWindow(Gtk.ApplicationWindow):
         label = Gtk.Label()
         label.set_text(label_text)
         btn_close = Gtk.Button.new_from_icon_name('window-close-symbolic', Gtk.IconSize.BUTTON)
-        btn_close.set_tooltip_text('Close')
+        btn_close.set_tooltip_text('close')
+        btn_close.set_relief(Gtk.ReliefStyle.NONE)
         btn_close.connect('clicked', self.on_close_clicked)
         box.pack_start(label, True, True, 0)
-        box.pack_start(btn_close, True, True, 0)
+        box.pack_start(btn_close, True, True, 3)
         box.show_all()
         return box
 
@@ -649,6 +670,10 @@ class TstAppWindow(Gtk.ApplicationWindow):
 
     def save_as_file_dialog(self):
         current_test = self.current_test_instance()
+
+        if current_test is None:
+            return
+
         current_name = self.current_model().name
         current_model = self.current_model()
         dialog = Gtk.FileChooserDialog('Please choose a file',
@@ -874,13 +899,13 @@ class TstAppWindow(Gtk.ApplicationWindow):
         """
         Generates a compact python test file without all the additional stuff from on_generate_scripts
         """
-        dialog = Gtk.FileChooserDialog(
-            title="Save script as", parent=self, action=Gtk.FileChooserAction.SAVE)
-        dialog.add_buttons(
-            Gtk.STOCK_CANCEL,
-            Gtk.ResponseType.CANCEL,
-            Gtk.STOCK_SAVE,
-            Gtk.ResponseType.OK, )
+        # dialog = Gtk.FileChooserDialog(
+        #     title="Save script as", parent=self, action=Gtk.FileChooserAction.SAVE)
+        # dialog.add_buttons(
+        #     Gtk.STOCK_CANCEL,
+        #     Gtk.ResponseType.CANCEL,
+        #     Gtk.STOCK_SAVE,
+        #     Gtk.ResponseType.OK, )
 
         if self.current_test_instance():
             # current_json_filename = self.current_test_instance().filename
@@ -889,22 +914,22 @@ class TstAppWindow(Gtk.ApplicationWindow):
             logger.error('Small Script can not be generated without JSON file')
             return
 
+        dialog = ScriptExportDialog()
+
         outfile_basic = '{}-TS-{}.py'.format(current_model.name, current_model.spec_version)
         dialog.set_current_name(outfile_basic)
         dialog.set_current_folder(cfg.get('tst-history', 'last-folder'))
+        dialog.set_do_overwrite_confirmation(True)
 
         response = dialog.run()
-        while response == Gtk.ResponseType.OK:
-            if os.path.exists(dialog.get_filename()):
-                if not self.existing_file_dialog(dialog.get_filename()):
-                    response = dialog.run()
-                    continue
-            json_to_barescript.run(current_model.encode_to_json(), dialog.get_filename())
+        if response == Gtk.ResponseType.OK:
+            report = dialog.report.get_active()
+            spec = dialog.csvspec.get_filename()
+
+            json_to_barescript.run(current_model.encode_to_json(), dialog.get_filename(), reportfunc=report, specfile=spec)
             cfg.save_option_to_file('tst-history', 'last-folder', dialog.get_current_folder())
-            break
 
         dialog.destroy()
-        return
 
     def on_generate_csv(self, *args):
         """
@@ -928,16 +953,18 @@ class TstAppWindow(Gtk.ApplicationWindow):
         outfile_basic = '{}-TS-{}.csv_PIPE'.format(current_model.name, current_model.spec_version)
         dialog.set_current_name(outfile_basic)
         dialog.set_current_folder(cfg.get('tst-history', 'last-folder'))
+        dialog.set_do_overwrite_confirmation(True)
 
         response = dialog.run()
-        while response == Gtk.ResponseType.OK:
-            if os.path.exists(dialog.get_filename()):
-                if not self.existing_file_dialog(dialog.get_filename()):
-                    response = dialog.run()
-                    continue
+        if response == Gtk.ResponseType.OK:
+            # while response == Gtk.ResponseType.OK:
+            #     if os.path.exists(dialog.get_filename()):
+            #         if not self.existing_file_dialog(dialog.get_filename()):
+            #             response = dialog.run()
+            #             continue
             json_to_csv.run(current_model.encode_to_json(), dialog.get_filename())
             cfg.save_option_to_file('tst-history', 'last-folder', dialog.get_current_folder())
-            break
+            # break
 
         dialog.destroy()
         return
@@ -1104,8 +1131,8 @@ class TstAppWindow(Gtk.ApplicationWindow):
         about_dialog.set_program_name('Test Specification Tool')
         about_dialog.set_copyright('UVIE 08/2022')
         about_dialog.set_license_type(Gtk.License.MPL_2_0)
-        about_dialog.present()
-        return
+        about_dialog.run()
+        about_dialog.destroy()
 
     def on_set_idb_version(self, widget):
         self.reconnect_mib()
@@ -1255,5 +1282,40 @@ def run():
     applica.run()
 
 
+class ScriptExportDialog(Gtk.FileChooserDialog):
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(title="Save script as", action=Gtk.FileChooserAction.SAVE)
+        self.add_buttons(
+            Gtk.STOCK_CANCEL,
+            Gtk.ResponseType.CANCEL,
+            Gtk.STOCK_SAVE,
+            Gtk.ResponseType.OK, )
+
+        area = self.get_content_area()
+        hbox = Gtk.HBox()
+        hbox.set_border_width(10)
+
+        self.report = Gtk.CheckButton.new_with_label('Reporting')
+        self.report.set_tooltip_text('Add interactive reporting')
+        self.report.connect('toggled', self.check_report)
+
+        self.csvspec = Gtk.FileChooserButton()
+        self.csvspec.set_tooltip_text('Select corresponding CSV spec file')
+        self.csvspec.set_sensitive(False)
+
+        hbox.pack_start(self.report, 0, 0, 0)
+        hbox.pack_start(self.csvspec, 1, 1, 0)
+        area.add(hbox)
+
+        self.show_all()
+
+    def check_report(self, widget, *args):
+        if widget.get_active():
+            self.csvspec.set_sensitive(True)
+        else:
+            self.csvspec.set_sensitive(False)
+
+
 if __name__ == '__main__':
     run()
diff --git a/Tst/tst/view.py b/Tst/tst/view.py
index 0ea3e581ba6ef849b20f25a7d7bdd7dbf7673849..e7955a38d5b99b59e67fa97f5399fdbf2590e065 100644
--- a/Tst/tst/view.py
+++ b/Tst/tst/view.py
@@ -16,14 +16,11 @@ import toolbox
 import cairo
 import sys
 
-
 import confignator
 ccs_path = confignator.get_option('paths', 'ccs')
 sys.path.append(ccs_path)
-sys.path.append(os.path.join(confignator.get_option("paths", "Tst"), "testing_library/testlib"))
 
 import ccs_function_lib as cfl
-import tm
 
 lm = GtkSource.LanguageManager()
 lngg = lm.get_language('python')
@@ -79,7 +76,7 @@ class Board(Gtk.Box):
         * a instance of a grid is added
         * drag and drop is set up
         """
-        #assert isinstance(model, data_model.TestSpecification)
+        # assert isinstance(model, data_model.TestSpecification)
         self.model = model
         self.app = app
         self._filename = filename
@@ -89,16 +86,15 @@ class Board(Gtk.Box):
         # Save Button in TST clicked for first time, Always do save_as to not overwrite something, used in tst.py
         self._ask_overwrite = True
 
-        Gtk.Box.__init__(self)
+        # Gtk.Box.__init__(self)
+        super(Board, self).__init__()
         self.set_orientation(Gtk.Orientation.VERTICAL)
 
         # test meta data
-        self.test_meta_data_box = Gtk.Box()
+        self.test_meta_data_box = Gtk.Box(margin=5)
         self.test_meta_data_box.set_orientation(Gtk.Orientation.HORIZONTAL)
-        self.test_meta_data_labels = Gtk.Box()
-        self.test_meta_data_labels.set_orientation(Gtk.Orientation.VERTICAL)
-        self.test_meta_data_entries = Gtk.Box()
-        self.test_meta_data_entries.set_orientation(Gtk.Orientation.VERTICAL)
+
+        self.test_meta_data_info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
         self.test_meta_data_pre_post_con = Gtk.Box()
         self.test_meta_data_pre_post_con.set_orientation(Gtk.Orientation.VERTICAL)
         self.test_meta_data_pre_post_con_edit = Gtk.Box()
@@ -106,87 +102,98 @@ class Board(Gtk.Box):
         # name of the test
         self.test_meta_data_name_label = Gtk.Label()
         self.test_meta_data_name_label.set_text('Name of the test:')
-        self.test_meta_data_labels.pack_start(self.test_meta_data_name_label, True, True, 0)
-        self.test_meta_data_name = Gtk.Entry()
-        self.test_meta_data_name.set_placeholder_text('< name of the test>')
-        self.test_meta_data_entries.pack_start(self.test_meta_data_name, True, True, 0)
+        self.test_meta_data_name = Gtk.Entry(width_chars=25)
+        self.test_meta_data_name.set_placeholder_text('< name of the test >')
+        self.test_meta_data_name_box = Gtk.Box(spacing=5, orientation=Gtk.Orientation.HORIZONTAL)
+        self.test_meta_data_name_box.pack_start(self.test_meta_data_name_label, False, False, 4)
+        self.test_meta_data_name_box.pack_end(self.test_meta_data_name, False, False, 0)
+        self.test_meta_data_info.pack_start(self.test_meta_data_name_box, True, True, 0)
         # test description
         self.test_meta_data_desc_label = Gtk.Label()
-        self.test_meta_data_desc_label.set_text('Description of the test:')
-        self.test_meta_data_labels.pack_start(self.test_meta_data_desc_label, True, True, 0)
-        self.test_meta_data_desc = Gtk.Entry()
-        self.test_meta_data_desc.set_placeholder_text('< description of the test>')
-        self.test_meta_data_entries.pack_start(self.test_meta_data_desc, True, True, 0)
+        self.test_meta_data_desc_label.set_text('Short description:')
+        self.test_meta_data_desc = Gtk.Entry(width_chars=25)
+        self.test_meta_data_desc.set_placeholder_text('< description of the test >')
+        self.test_meta_data_desc_box = Gtk.Box(spacing=5, orientation=Gtk.Orientation.HORIZONTAL)
+        self.test_meta_data_desc_box.pack_start(self.test_meta_data_desc_label, False, False, 4)
+        self.test_meta_data_desc_box.pack_end(self.test_meta_data_desc, False, False, 0)
+        self.test_meta_data_info.pack_start(self.test_meta_data_desc_box, True, True, 0)
         # spec_version
         self.test_meta_data_spec_version_label = Gtk.Label()
-        self.test_meta_data_spec_version_label.set_text('Spec Version:')
-        self.test_meta_data_labels.pack_start(self.test_meta_data_spec_version_label, True, True, 0)
-        self.test_meta_data_spec_version = Gtk.Entry()
+        self.test_meta_data_spec_version_label.set_text('Spec. version:')
+        self.test_meta_data_spec_version = Gtk.Entry(width_chars=25)
         self.test_meta_data_spec_version.set_placeholder_text('< spec version >')
-        self.test_meta_data_entries.pack_start(self.test_meta_data_spec_version, True, True, 0)
+        self.test_meta_data_spec_box = Gtk.Box(spacing=5, orientation=Gtk.Orientation.HORIZONTAL)
+        self.test_meta_data_spec_box.pack_start(self.test_meta_data_spec_version_label, False, False, 4)
+        self.test_meta_data_spec_box.pack_end(self.test_meta_data_spec_version, False, False, 0)
+        self.test_meta_data_info.pack_start(self.test_meta_data_spec_box, True, True, 0)
         # IASW Software Version
         self.test_meta_data_iasw_version_label = Gtk.Label()
-        self.test_meta_data_iasw_version_label.set_text('IASW Version:')
-        self.test_meta_data_labels.pack_start(self.test_meta_data_iasw_version_label, True, True, 0)
-        self.test_meta_data_iasw_version = Gtk.Entry()
+        self.test_meta_data_iasw_version_label.set_text('IASW version:')
+        self.test_meta_data_iasw_version = Gtk.Entry(width_chars=25)
         self.test_meta_data_iasw_version.set_placeholder_text('< IASW version >')
-        self.test_meta_data_entries.pack_start(self.test_meta_data_iasw_version, True, True, 0)
+        self.test_meta_data_iasw_box = Gtk.Box(spacing=5, orientation=Gtk.Orientation.HORIZONTAL)
+        self.test_meta_data_iasw_box.pack_start(self.test_meta_data_iasw_version_label, False, False, 4)
+        self.test_meta_data_iasw_box.pack_end(self.test_meta_data_iasw_version, False, False, 0)
+        self.test_meta_data_info.pack_start(self.test_meta_data_iasw_box, True, True, 0)
         # checkbox for locking the step numbers
         self.test_is_locked_label = Gtk.Label()
         self.test_is_locked_label.set_text(_('Lock step enumeration:'))
-        self.test_meta_data_labels.pack_start(self.test_is_locked_label, True, True, 0)
         self.text_meta_data_test_is_locked = Gtk.CheckButton()
-        self.test_meta_data_entries.pack_start(self.text_meta_data_test_is_locked, True, True, 0)
+        self.test_meta_data_is_locked_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
+        self.test_meta_data_is_locked_box.pack_start(self.test_is_locked_label, False, False, 4)
+        self.test_meta_data_is_locked_box.pack_start(self.text_meta_data_test_is_locked, True, True, 4)
+        self.test_meta_data_info.pack_start(self.test_meta_data_is_locked_box, True, True, 15)
 
         # Add pre post condition selections
         # Pre conditions
         self.precon_selection_label = Gtk.Label()
-        self.precon_selection_label.set_text('Pre-Conditions:')
+        self.precon_selection_label.set_text('Pre-conditions:')
         self.precon_selection = Gtk.ComboBoxText()
         self.set_precon_model()
         self.precon_selection.connect("changed", self.on_precon_changed)
         # Post conditions
         self.postcon_selection_label = Gtk.Label()
-        self.postcon_selection_label.set_text('Post-Conditions:')
+        self.postcon_selection_label.set_text('Post-conditions:')
         self.postcon_selection = Gtk.ComboBoxText()
         self.set_postcon_model()
         self.postcon_selection.connect("changed", self.on_postcon_changed)
-
-        # add to pre post box
-        self.test_meta_data_pre_post_con.pack_start(self.precon_selection_label, False, True, 0)
-        self.test_meta_data_pre_post_con.pack_start(self.precon_selection, False, True, 0)
-        self.test_meta_data_pre_post_con.pack_start(self.postcon_selection_label, False, True, 0)
-        self.test_meta_data_pre_post_con.pack_start(self.postcon_selection, False, True, 0)
-        self.test_meta_data_box.set_spacing(20)
-
         # Add Edit Buttons
         self.precon_edit_button = Gtk.Button.new_with_label('Edit')
         self.precon_edit_button.connect("clicked", self.precon_edit_clicked)
         self.postcon_edit_button = Gtk.Button.new_with_label('Edit')
         self.postcon_edit_button.connect("clicked", self.postcon_edit_clicked)
+        precon_line = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
+        precon_line.pack_start(self.precon_selection, False, True, 0)
+        precon_line.pack_start(self.precon_edit_button, False, True, 0)
+
+        postcon_line = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
+        postcon_line.pack_start(self.postcon_selection, False, True, 0)
+        postcon_line.pack_start(self.postcon_edit_button, False, True, 0)
 
-        self.test_meta_data_pre_post_con_edit.pack_start(self.precon_edit_button, False, True, 17)
-        self.test_meta_data_pre_post_con_edit.pack_start(self.postcon_edit_button, False, True, 0)
+        # add to pre post box
+        self.test_meta_data_pre_post_con.pack_start(self.precon_selection_label, False, True, 0)
+        self.test_meta_data_pre_post_con.pack_start(precon_line, False, True, 2)
+        self.test_meta_data_pre_post_con.pack_start(self.postcon_selection_label, False, True, 2)
+        self.test_meta_data_pre_post_con.pack_start(postcon_line, False, True, 0)
+        self.test_meta_data_box.set_spacing(20)
 
-        self.test_comment_box = Gtk.Box()
+        self.test_comment_box = Gtk.Box(spacing=2)
         self.test_comment_box.set_orientation(Gtk.Orientation.VERTICAL)
-        self.lbl_box_comment = Gtk.Box()
-        self.lbl_box_comment.set_orientation(Gtk.Orientation.HORIZONTAL)
-        self.label_comment = Gtk.Label.new()
-        self.label_comment.set_text(_('Test Comment:'))
-        self.lbl_box_comment.pack_start(self.label_comment, False, False, 0)
+        self.label_comment = Gtk.Label()
+        self.label_comment.set_halign(Gtk.Align.START)
+        self.label_comment.set_text(_('Test comment:'))
         # Make the area where the real command is entered
         self.comment_scrolled_window = Gtk.ScrolledWindow()
         # self.comment_scrolled_window.set_size_request(200, 100)
         self.test_meta_data_comment = Gtk.TextView.new()
+        Gtk.StyleContext.add_class(self.test_meta_data_comment.get_style_context(), 'text-view')
         self.comment_scrolled_window.add(self.test_meta_data_comment)
 
-        self.test_comment_box.pack_start(self.lbl_box_comment, False, False, 0)
+        self.test_comment_box.pack_start(self.label_comment, False, False, 0)
         self.test_comment_box.pack_start(self.comment_scrolled_window, True, True, 0)
 
         # add the meta data
-        self.test_meta_data_box.pack_start(self.test_meta_data_labels, False, True, 0)
-        self.test_meta_data_box.pack_start(self.test_meta_data_entries, False, True, 0)
+        self.test_meta_data_box.pack_start(self.test_meta_data_info, False, True, 0)
         self.test_meta_data_box.pack_start(self.test_meta_data_pre_post_con, False, True, 0)
         self.test_meta_data_box.pack_start(self.test_meta_data_pre_post_con_edit, False, True, 0)
         self.test_meta_data_box.pack_start(self.test_comment_box, True, True, 0)
@@ -242,6 +249,8 @@ class Board(Gtk.Box):
         self.text_meta_data_test_is_locked.connect('toggled', self.on_test_locked_toggled)
         self.test_meta_data_comment.get_buffer().connect('changed', self.on_comment_change)
 
+        Gtk.StyleContext.add_class(self.get_style_context(), 'board')
+
     @property
     def test_is_locked(self):
         return self._test_is_locked
@@ -373,7 +382,7 @@ class Board(Gtk.Box):
         self.app.update_model_viewer()
 
     def set_precon_model(self, active_name=None):
-        section_dict = db_interaction.get_pre_post_con('pre')
+        section_dict = db_interaction.get_pre_post_con(None)
         active_nbr = 0
         for count, condition in enumerate(section_dict):
             self.precon_selection.append_text(condition.name)
@@ -389,20 +398,16 @@ class Board(Gtk.Box):
         # update the model
         self.model.precon_name = precon_name
         # Set the Precon Description
-        section_dict = db_interaction.get_pre_post_con('pre')
+        section_dict = db_interaction.get_pre_post_con(None)
         for condition in section_dict:
             if condition.name == precon_name:
                 self.model.precon_descr = condition.description
                 self.model.precon_code = condition.condition
         # update the data model viewer
         self.app.update_model_viewer()
-        #current_model = self.app.current_model()
-        #if current_model:
-        #    current_model.precon = precon_name
-        return
 
     def set_postcon_model(self, active_name=None):
-        section_dict = db_interaction.get_pre_post_con('post')
+        section_dict = db_interaction.get_pre_post_con(None)
         active_nbr = 0
         for count, condition in enumerate(section_dict):
             self.postcon_selection.append_text(condition.name)
@@ -418,19 +423,13 @@ class Board(Gtk.Box):
         # update the model
         self.model.postcon_name = postcon_name
         # Set the Postcon Description
-        section_dict = db_interaction.get_pre_post_con('post')
+        section_dict = db_interaction.get_pre_post_con(None)
         for condition in section_dict:
             if condition.name == postcon_name:
                 self.model.postcon_descr = condition.description
                 self.model.postcon_code = condition.condition
         # update the data model viewer
         self.app.update_model_viewer()
-        #current_model = self.app.current_model()
-        #if current_model:
-        #    current_model.postcon = postcon_name
-        return
-
-
 
     def precon_edit_clicked(self, widget):
         dialog = Edit_Pre_Post_Con_Dialog(self, 'pre', self.precon_selection.get_active())
@@ -634,12 +633,6 @@ class StepWidget(Gtk.EventBox):
         self.btn_execute_step.set_tooltip_text(_('Execute step'))
         self.btn_execute_step.connect('clicked', self.on_execute_step)
 
-        # TODO: find better suited icon for execute verification button
-        self.btn_execute_verification = Gtk.ToolButton()
-        self.btn_execute_verification.set_icon_name("media-playback-start-symbolic-down")
-        self.btn_execute_verification.set_tooltip_text(_("Execute Verification"))
-        self.btn_execute_verification.connect("clicked", self.on_execute_verification)
-
         self.text_label_event_box = Gtk.EventBox()
         self.text_label_event_box.set_visible_window(False)
         self.text_label_event_box.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
@@ -659,7 +652,6 @@ class StepWidget(Gtk.EventBox):
         self.tbox.pack_end(self.btn_delete_step, False, False, 0)
         self.tbox.pack_end(self.is_active, False, False, 0)
         self.tbox.pack_end(self.btn_execute_step, False, False, 0)
-        self.tbox.pack_end(self.btn_execute_verification, False, False, 0)
 
         self.vbox.pack_start(self.tbox, True, True, 0)
 
@@ -690,8 +682,9 @@ class StepWidget(Gtk.EventBox):
         # self.desc_scrolled_window.set_size_request(50, 100)
         # self.detail_box.pack_start(self.desc_scrolled_window, False, True, 0)
         self.desc_text_view = Gtk.TextView.new()
+        Gtk.StyleContext.add_class(self.desc_text_view.get_style_context(), 'text-view')
         self.desc_text_view.set_wrap_mode(Gtk.WrapMode.WORD)
-        self.desc_text_view.set_accepts_tab(False)
+        # self.desc_text_view.set_accepts_tab(False)
         self.desc_scrolled_window.add(self.desc_text_view)
         self.desc_text_buffer = self.desc_text_view.get_buffer()
 
@@ -706,6 +699,7 @@ class StepWidget(Gtk.EventBox):
         self.step_comment_scrolled_window = Gtk.ScrolledWindow()
         # self.step_comment_scrolled_window.set_size_request(200, 100)
         self.step_comment_view = GtkSource.View()
+        Gtk.StyleContext.add_class(self.step_comment_view.get_style_context(), 'text-view')
         self.step_comment_view.set_wrap_mode(Gtk.WrapMode.WORD)
         self.step_comment_view.set_show_line_numbers(False)
         self.step_comment_scrolled_window.add(self.step_comment_view)
@@ -769,18 +763,19 @@ class StepWidget(Gtk.EventBox):
         self.whole_verification_box.set_column_homogeneous(True)
 
         # Left side of the verification area, where the verification-commands a entered
-        # Make the label, inside a own Box to show it on the left side
+        # Make the label, inside an own Box to show it on the left side
         self.lbl_box_verification = Gtk.Box()
         self.lbl_box_verification.set_orientation(Gtk.Orientation.HORIZONTAL)
         self.verification_label = Gtk.Label.new()
-        self.verification_label.set_text(_('Verification'))
-        #self.btn_exec_verification = Gtk.Button.new_from_icon_name(icon_name='media-playback-start', size=Gtk.IconSize.BUTTON)
-        #self.btn_exec_verification.connect('clicked', self.on_exec_verification)
+        self.verification_label.set_text(_('Verification Code'))
+        self.verification_label.set_tooltip_text(_('The verification code-block must define a variable "result" that is TRUE/FALSE'))
+        # self.btn_exec_verification = Gtk.Button.new_from_icon_name(icon_name='media-playback-start', size=Gtk.IconSize.BUTTON)
+        # self.btn_exec_verification.connect('clicked', self.on_exec_verification)
         self.lbl_box_verification.pack_start(self.verification_label, False, False, 0)
         # self.lbl_box_verification.pack_start(self.btn_exec_verification, False, False, 0)
-        #self.detail_box.pack_start(self.lbl_box_verification, True, True, 0)
+        # self.detail_box.pack_start(self.lbl_box_verification, True, True, 0)
         self.verification_scrolled_window = Gtk.ScrolledWindow()
-        self.verification_scrolled_window.set_size_request(50, 200)
+        #self.verification_scrolled_window.set_size_request(50, 100)
         self.verification_view = GtkSource.View()
         self.verification_view.set_auto_indent(True)
         self.verification_view.set_show_line_numbers(True)
@@ -805,6 +800,7 @@ class StepWidget(Gtk.EventBox):
         self.verification_description_scrolled_window = Gtk.ScrolledWindow()
         #self.verification_comment_scrolled_window.set_size_request(200, 100)
         self.verification_description_view = GtkSource.View()
+        Gtk.StyleContext.add_class(self.verification_description_view.get_style_context(), 'text-view')
         self.verification_description_view.set_show_line_numbers(False)
         self.verification_description_view.set_wrap_mode(Gtk.WrapMode.WORD)
         self.verification_description_scrolled_window.add(self.verification_description_view)
@@ -1309,7 +1305,6 @@ class StepWidget(Gtk.EventBox):
         # Connect to the editor and send the commands to the terminal via D-Bus
         ed = cfl.dbus_connection('editor')
         cfl.Functions(ed, '_to_console_via_socket', commands)
-
         #import editor
         #x = editor.CcsEditor()
         #x._to_console_via_socket(commands)
@@ -1317,33 +1312,9 @@ class StepWidget(Gtk.EventBox):
     def on_exec_verification(self, button):
         # get the code of the commands out of the buffer of the widget
         verification = self.get_verification_from_widget()
-
-        # Check if CCS is open
-        if not cfl.is_open('editor'):
-            print('CCS-Editor has to be started first')
-            logger.info('CCS-Editor has to be running if a step should be executed')
-            return
         #ack = misc.to_console_via_socket(verification)
         #print(ack)
 
-    def on_execute_verification(self, *args):
-        if not cfl.is_open("editor"):
-            print('CCS-Editor has to be started first')
-            logger.info('CCS-Editor has to be running if a step should be executed')
-            return
-
-        commands = str(self.get_verification_from_widget())
-
-        if len(commands) == 0:
-            return
-
-        # execute_function = exec(commands)
-        # print(execute_function)
-
-
-        ed = cfl.dbus_connection("editor")
-        cfl.Functions(ed, "_to_console_via_socket", commands)
-
     def on_execute_step(self, *args):
         if not cfl.is_open('editor'):
             print('CCS-Editor has to be started first')
@@ -1351,20 +1322,12 @@ class StepWidget(Gtk.EventBox):
             return
 
         commands = str(self.get_commands_from_widget())
-        commands2 = str(self.get_verification_from_widget())
-
 
         if len(commands) == 0:
             return
 
-        # if len(commands2) == 0:
-        #    return
-
-        # verification.read_verification(commands2)
-
         ed = cfl.dbus_connection('editor')
         cfl.Functions(ed, '_to_console_via_socket', commands)
-        # cfl.Functions(ed, '_to_console_via_socket', commands2)
 
     def on_toggle_detail(self, toolbutton, *args):
         """
@@ -1676,8 +1639,8 @@ class StepRightClickMenu(Gtk.Menu):
 
 class Edit_Pre_Post_Con_Dialog(Gtk.Dialog):
     def __init__(self, parent, pre_post, selection):
-        #Gtk.Dialog.__init__(self, title='PRE-Conditions', transient_for=parent, flags=0)
-        Gtk.Dialog.__init__(self, title=pre_post.upper() + ' -Conditions')
+        # Gtk.Dialog.__init__(self, title=pre_post.upper() + ' -Conditions')
+        super(Edit_Pre_Post_Con_Dialog, self).__init__(title=pre_post.upper() + '-conditions')
         self.add_buttons(
             Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK
         )
@@ -1686,7 +1649,8 @@ class Edit_Pre_Post_Con_Dialog(Gtk.Dialog):
         self.win = parent
         self.file_path = os.path.join(confignator.get_option('paths', 'tst'),
                                       'tst/generator_templates/co_'+pre_post+'_condition_entry.py')
-        self.pre_post = pre_post
+        # self.pre_post = pre_post
+        self.pre_post = None
 
         self.make_section_dict()
 
@@ -1695,14 +1659,15 @@ class Edit_Pre_Post_Con_Dialog(Gtk.Dialog):
         self.show_all()
 
     def make_section_dict(self):
-        if self.pre_post == 'pre':
-            self.section_dict = db_interaction.get_pre_post_con('pre')
-        else:
-            self.section_dict = db_interaction.get_pre_post_con('post')
+        # if self.pre_post == 'pre':
+        #     self.section_dict = db_interaction.get_pre_post_con('pre')
+        # else:
+        #     self.section_dict = db_interaction.get_pre_post_con('post')
+        self.section_dict = db_interaction.get_pre_post_con(None)
 
     def view(self):
-        self.main_box = Gtk.Box()
-        self.main_box.set_orientation(Gtk.Orientation.VERTICAL)
+        # self.main_box = Gtk.Box()
+        # self.main_box.set_orientation(Gtk.Orientation.VERTICAL)
 
         self.selection_box = Gtk.Box()
         self.selection_box.set_orientation(Gtk.Orientation.HORIZONTAL)
@@ -1727,13 +1692,18 @@ class Edit_Pre_Post_Con_Dialog(Gtk.Dialog):
         self.selection_box.pack_start(self.delete_button, False, True, 0)
 
         box = self.get_content_area()
-        box.pack_start(self.selection_box, False, True, 0)
+        # Gtk.StyleContext.add_class(box.get_style_context(), 'cond-dialog')
+        # box.set_margin_top(5)
+        # box.set_margin_bottom(5)
+        # box.set_margin_left(5)
+        # box.set_margin_right(5)
+        box.pack_start(self.selection_box, False, True, 3)
         box.pack_start(self.descr_lbl_box, False, False, 0)
         box.pack_start(self.descr_scrolled_window, False, False, 0)
         box.pack_start(self.con_lbl_box, False, False, 0)
         box.pack_start(self.con_scrolled_window, True, True, 0)
-        #box.add(self.selection_box)
-        #box.pack_end(self.scrolled_window, True, True, 0)
+        # box.add(self.selection_box)
+        # box.pack_end(self.scrolled_window, True, True, 0)
 
     def make_con_sections_model(self):
         for condition in self.section_dict:
@@ -1791,7 +1761,7 @@ class Edit_Pre_Post_Con_Dialog(Gtk.Dialog):
         # Label in a Box to have it on the left boarder
         self.descr_lbl_box = Gtk.HBox()
         descr_lbl = Gtk.Label()
-        descr_lbl.set_text('Description: ')
+        descr_lbl.set_text('Description')
         self.descr_lbl_box.pack_start(descr_lbl, False, False, 0)
 
         # a scrollbar for the child widget (that is going to be the textview)
@@ -1815,11 +1785,11 @@ class Edit_Pre_Post_Con_Dialog(Gtk.Dialog):
         # Label in a Box to have it on the left boarder
         self.con_lbl_box = Gtk.HBox()
         con_lbl = Gtk.Label()
-        con_lbl.set_text('Condition: ')
+        con_lbl.set_text('Condition')
         self.con_lbl_box.pack_start(con_lbl, False, False, 0)
 
         self.con_scrolled_window = Gtk.ScrolledWindow()
-        self.con_scrolled_window.set_tooltip_text('Set variable "success" to True/False, to check if {}-Conditon is fulfilled'.format(self.pre_post.upper()))
+        self.con_scrolled_window.set_tooltip_text('Set variable "success" to True/False to check if conditon is fulfilled')
         #self.commands_scrolled_window.set_size_request(50, 100)
         self.con_view = GtkSource.View()
         self.con_view.set_auto_indent(True)
@@ -1832,12 +1802,3 @@ class Edit_Pre_Post_Con_Dialog(Gtk.Dialog):
         self.con_buffer.set_language(lngg)
         # self.commands_buffer.set_style_scheme(self.board.current_scheme)
         self.con_scrolled_window.add(self.con_view)
-
-        #box = self.get_content_area()
-        #box.add(self.selection_box)
-
-        return
-
-
-
-
diff --git a/ccd_pwm_t_cal.dat b/ccd_pwm_t_cal.dat
new file mode 100644
index 0000000000000000000000000000000000000000..ea103518306473d9aa215a585ad8d2118e4eca78
--- /dev/null
+++ b/ccd_pwm_t_cal.dat
@@ -0,0 +1,972 @@
+# calibration curve for CCD temperature to PWM set point (IWF EGSE) compatible with actual MIB calibrations
+-52.5  3987
+-52.4  3975
+-52.3  3958
+-52.2  3940
+-52.1  3925
+-52.0  3915
+-51.9  3905
+-51.8  3892
+-51.7  3880
+-51.6  3865
+-51.5  3849
+-51.4  3841
+-51.3  3828
+-51.2  3814
+-51.1  3804
+-51.0  3791
+-50.9  3774
+-50.8  3760
+-50.7  3752
+-50.6  3738
+-50.5  3721
+-50.4  3711
+-50.3  3700
+-50.2  3688
+-50.1  3677
+-50.0  3663
+-49.9  3652
+-49.8  3639
+-49.7  3624
+-49.6  3613
+-49.5  3601
+-49.4  3588
+-49.3  3577
+-49.2  3569
+-49.1  3556
+-49.0  3542
+-48.9  3534
+-48.8  3525
+-48.7  3509
+-48.6  3495
+-48.5  3485
+-48.4  3474
+-48.3  3461
+-48.2  3449
+-48.1  3440
+-48.0  3428
+-47.9  3421
+-47.8  3414
+-47.7  3406
+-47.6  3392
+-47.5  3377
+-47.4  3366
+-47.3  3357
+-47.2  3347
+-47.1  3336
+-47.0  3327
+-46.9  3315
+-46.8  3305
+-46.7  3297
+-46.6  3290
+-46.5  3279
+-46.4  3268
+-46.3  3257
+-46.2  3248
+-46.1  3238
+-46.0  3228
+-45.9  3219
+-45.8  3210
+-45.7  3202
+-45.6  3191
+-45.5  3183
+-45.4  3174
+-45.3  3164
+-45.2  3156
+-45.1  3146
+-45.0  3138
+-44.9  3130
+-44.8  3123
+-44.7  3116
+-44.6  3106
+-44.5  3095
+-44.4  3087
+-44.3  3080
+-44.2  3071
+-44.1  3063
+-44.0  3055
+-43.9  3049
+-43.8  3040
+-43.7  3030
+-43.6  3021
+-43.5  3012
+-43.4  3005
+-43.3  2998
+-43.2  2991
+-43.1  2980
+-43.0  2971
+-42.9  2964
+-42.8  2958
+-42.7  2950
+-42.6  2941
+-42.5  2935
+-42.4  2927
+-42.3  2920
+-42.2  2912
+-42.1  2906
+-42.0  2897
+-41.9  2888
+-41.8  2881
+-41.7  2876
+-41.6  2869
+-41.5  2861
+-41.4  2855
+-41.3  2849
+-41.2  2844
+-41.1  2837
+-41.0  2832
+-40.9  2824
+-40.8  2815
+-40.7  2806
+-40.6  2799
+-40.5  2793
+-40.4  2784
+-40.3  2777
+-40.2  2772
+-40.1  2766
+-40.0  2760
+-39.9  2754
+-39.8  2747
+-39.7  2739
+-39.6  2732
+-39.5  2727
+-39.4  2720
+-39.3  2713
+-39.2  2707
+-39.1  2703
+-39.0  2698
+-38.9  2691
+-38.8  2685
+-38.7  2679
+-38.6  2674
+-38.5  2667
+-38.4  2661
+-38.3  2656
+-38.2  2649
+-38.1  2643
+-38.0  2637
+-37.9  2631
+-37.8  2624
+-37.7  2618
+-37.6  2612
+-37.5  2607
+-37.4  2602
+-37.3  2595
+-37.2  2592
+-37.1  2588
+-37.0  2582
+-36.9  2576
+-36.8  2572
+-36.7  2566
+-36.6  2560
+-36.5  2553
+-36.4  2547
+-36.3  2542
+-36.2  2537
+-36.1  2533
+-36.0  2529
+-35.9  2525
+-35.8  2520
+-35.7  2515
+-35.6  2510
+-35.5  2504
+-35.4  2498
+-35.3  2494
+-35.2  2489
+-35.1  2482
+-35.0  2477
+-34.9  2474
+-34.8  2470
+-34.7  2466
+-34.6  2461
+-34.5  2457
+-34.4  2452
+-34.3  2446
+-34.2  2441
+-34.1  2437
+-34.0  2432
+-33.9  2427
+-33.8  2423
+-33.7  2419
+-33.6  2414
+-33.5  2408
+-33.4  2403
+-33.3  2399
+-33.2  2395
+-33.1  2390
+-33.0  2385
+-32.9  2382
+-32.8  2379
+-32.7  2375
+-32.6  2370
+-32.5  2367
+-32.4  2362
+-32.3  2359
+-32.2  2354
+-32.1  2350
+-32.0  2346
+-31.9  2342
+-31.8  2337
+-31.7  2334
+-31.6  2329
+-31.5  2324
+-31.4  2320
+-31.3  2317
+-31.2  2312
+-31.1  2308
+-31.0  2305
+-30.9  2302
+-30.8  2298
+-30.7  2294
+-30.6  2291
+-30.5  2287
+-30.4  2283
+-30.3  2279
+-30.2  2275
+-30.1  2273
+-30.0  2268
+-29.9  2265
+-29.8  2262
+-29.7  2258
+-29.6  2254
+-29.5  2251
+-29.4  2248
+-29.3  2244
+-29.2  2239
+-29.1  2236
+-29.0  2233
+-28.9  2230
+-28.8  2226
+-28.7  2222
+-28.6  2219
+-28.5  2217
+-28.4  2214
+-28.3  2211
+-28.2  2208
+-28.1  2205
+-28.0  2202
+-27.9  2198
+-27.8  2195
+-27.7  2193
+-27.6  2189
+-27.5  2186
+-27.4  2183
+-27.3  2178
+-27.2  2175
+-27.1  2172
+-27.0  2170
+-26.9  2166
+-26.8  2163
+-26.7  2160
+-26.6  2157
+-26.5  2154
+-26.4  2151
+-26.3  2149
+-26.2  2146
+-26.1  2142
+-26.0  2139
+-25.9  2137
+-25.8  2134
+-25.7  2131
+-25.6  2128
+-25.5  2126
+-25.4  2123
+-25.3  2120
+-25.2  2117
+-25.1  2115
+-25.0  2112
+-24.9  2110
+-24.8  2107
+-24.7  2105
+-24.6  2102
+-24.5  2100
+-24.4  2097
+-24.3  2095
+-24.2  2093
+-24.1  2090
+-24.0  2086
+-23.9  2084
+-23.8  2081
+-23.7  2079
+-23.6  2076
+-23.5  2073
+-23.4  2071
+-23.3  2068
+-23.2  2066
+-23.1  2064
+-23.0  2061
+-22.9  2059
+-22.8  2057
+-22.7  2054
+-22.6  2052
+-22.5  2050
+-22.4  2048
+-22.3  2045
+-22.2  2043
+-22.1  2041
+-22.0  2038
+-21.9  2036
+-21.8  2034
+-21.7  2032
+-21.6  2030
+-21.5  2028
+-21.4  2025
+-21.3  2022
+-21.2  2020
+-21.1  2018
+-21.0  2016
+-20.9  2014
+-20.8  2011
+-20.7  2009
+-20.6  2007
+-20.5  2002
+-20.4  1999
+-20.3  1994
+-20.2  1993
+-20.1  1994
+-20.0  1988
+-19.9  1983
+-19.8  1982
+-19.7  1980
+-19.6  1977
+-19.5  1976
+-19.4  1974
+-19.3  1972
+-19.2  1970
+-19.1  1968
+-19.0  1966
+-18.9  1965
+-18.8  1963
+-18.7  1960
+-18.6  1958
+-18.5  1957
+-18.4  1955
+-18.3  1954
+-18.2  1952
+-18.1  1950
+-18.0  1948
+-17.9  1947
+-17.8  1945
+-17.7  1943
+-17.6  1941
+-17.5  1940
+-17.4  1939
+-17.3  1937
+-17.2  1935
+-17.1  1934
+-17.0  1932
+-16.9  1931
+-16.8  1929
+-16.7  1927
+-16.6  1926
+-16.5  1924
+-16.4  1923
+-16.3  1921
+-16.2  1919
+-16.1  1918
+-16.0  1916
+-15.9  1914
+-15.8  1913
+-15.7  1911
+-15.6  1909
+-15.5  1908
+-15.4  1907
+-15.3  1905
+-15.2  1903
+-15.1  1902
+-15.0  1901
+-14.9  1899
+-14.8  1898
+-14.7  1896
+-14.6  1895
+-14.5  1894
+-14.4  1892
+-14.3  1891
+-14.2  1889
+-14.1  1888
+-14.0  1887
+-13.9  1885
+-13.8  1884
+-13.7  1882
+-13.6  1881
+-13.5  1880
+-13.4  1879
+-13.3  1878
+-13.2  1876
+-13.1  1874
+-13.0  1873
+-12.9  1872
+-12.8  1871
+-12.7  1869
+-12.6  1868
+-12.5  1867
+-12.4  1865
+-12.3  1864
+-12.2  1863
+-12.1  1862
+-12.0  1861
+-11.9  1859
+-11.8  1858
+-11.7  1857
+-11.6  1856
+-11.5  1855
+-11.4  1854
+-11.3  1852
+-11.2  1851
+-11.1  1850
+-11.0  1849
+-10.9  1848
+-10.8  1846
+-10.7  1845
+-10.6  1844
+-10.5  1843
+-10.4  1842
+-10.3  1840
+-10.2  1839
+-10.1  1838
+-10.0  1837
+ -9.9  1836
+ -9.8  1835
+ -9.7  1834
+ -9.6  1833
+ -9.5  1832
+ -9.4  1831
+ -9.3  1829
+ -9.2  1828
+ -9.1  1827
+ -8.9  1826
+ -8.8  1824
+ -8.7  1823
+ -8.6  1822
+ -8.5  1821
+ -8.4  1820
+ -8.3  1819
+ -8.2  1818
+ -8.1  1817
+ -8.0  1816
+ -7.9  1815
+ -7.8  1814
+ -7.7  1813
+ -7.6  1812
+ -7.5  1811
+ -7.4  1810
+ -7.3  1809
+ -7.2  1808
+ -7.0  1807
+ -6.9  1806
+ -6.8  1804
+ -6.7  1803
+ -6.5  1802
+ -6.4  1801
+ -6.3  1800
+ -6.2  1799
+ -6.1  1798
+ -6.0  1797
+ -5.9  1796
+ -5.8  1795
+ -5.7  1794
+ -5.5  1793
+ -5.4  1792
+ -5.3  1791
+ -5.2  1790
+ -5.1  1789
+ -5.0  1788
+ -4.8  1786
+ -4.6  1785
+ -4.5  1784
+ -4.4  1783
+ -4.3  1782
+ -4.2  1781
+ -4.0  1780
+ -3.9  1779
+ -3.8  1778
+ -3.7  1777
+ -3.5  1776
+ -3.4  1775
+ -3.3  1774
+ -3.2  1773
+ -3.0  1772
+ -2.9  1771
+ -2.8  1770
+ -2.7  1769
+ -2.5  1768
+ -2.4  1767
+ -2.3  1766
+ -2.1  1765
+ -2.0  1764
+ -1.8  1763
+ -1.7  1762
+ -1.6  1761
+ -1.4  1760
+ -1.3  1759
+ -1.2  1758
+ -1.0  1757
+ -0.9  1756
+ -0.8  1755
+ -0.6  1754
+ -0.4  1753
+ -0.3  1752
+ -0.2  1751
+  0.0  1750
+  0.1  1749
+  0.3  1748
+  0.5  1747
+  0.6  1746
+  0.8  1745
+  0.9  1744
+  1.1  1743
+  1.2  1742
+  1.4  1741
+  1.6  1740
+  1.7  1739
+  1.9  1738
+  2.1  1737
+  2.2  1736
+  2.4  1735
+  2.6  1734
+  2.7  1733
+  2.9  1732
+  3.1  1731
+  3.2  1730
+  3.4  1729
+  3.6  1728
+  3.7  1727
+  3.9  1726
+  4.1  1725
+  4.3  1724
+  4.5  1723
+  4.6  1722
+  4.8  1721
+  5.0  1720
+  5.2  1719
+  5.4  1718
+  5.6  1717
+  5.8  1716
+  6.0  1715
+  6.1  1714
+  6.3  1713
+  6.5  1712
+  6.7  1711
+  6.9  1710
+  7.1  1709
+  7.3  1708
+  7.5  1707
+  7.7  1706
+  7.9  1705
+  8.1  1704
+  8.3  1703
+  8.5  1702
+  8.7  1701
+  8.9  1700
+  9.1  1699
+  9.3  1698
+  9.6  1697
+  9.8  1696
+ 10.0  1695
+ 10.2  1694
+ 10.5  1693
+ 10.6  1692
+ 10.9  1691
+ 11.1  1690
+ 11.3  1689
+ 11.6  1688
+ 11.8  1687
+ 12.0  1686
+ 12.3  1685
+ 12.5  1684
+ 12.8  1683
+ 13.0  1682
+ 13.2  1681
+ 13.5  1680
+ 13.7  1679
+ 14.0  1678
+ 14.2  1677
+ 14.5  1676
+ 14.8  1675
+ 15.0  1674
+ 15.3  1673
+ 15.5  1672
+ 15.8  1671
+ 16.0  1670
+ 16.3  1669
+ 16.5  1668
+ 16.8  1667
+ 17.1  1666
+ 17.4  1665
+ 17.6  1664
+ 17.9  1663
+ 18.2  1662
+ 18.5  1661
+ 18.7  1660
+ 19.0  1659
+ 19.3  1658
+ 19.5  1657
+ 19.8  1656
+ 20.1  1655
+ 20.4  1654
+ 20.7  1653
+ 21.0  1652
+ 21.3  1651
+ 21.5  1650
+ 21.8  1649
+ 22.1  1648
+ 22.4  1647
+ 22.7  1646
+ 22.9  1645
+ 23.3  1644
+ 23.5  1643
+ 23.9  1642
+ 24.1  1641
+ 24.4  1640
+ 24.7  1639
+ 25.0  1638
+ 25.3  1637
+ 25.6  1636
+ 25.9  1635
+ 26.2  1634
+ 26.5  1633
+ 26.9  1632
+ 27.2  1631
+ 27.4  1630
+ 27.8  1629
+ 28.0  1628
+ 28.4  1627
+ 28.7  1626
+ 29.0  1625
+ 29.3  1624
+ 29.6  1623
+ 29.9  1622
+ 30.3  1621
+ 30.6  1620
+ 30.9  1619
+ 31.2  1618
+ 31.5  1617
+ 31.9  1616
+ 32.2  1615
+ 32.5  1614
+ 32.8  1613
+ 33.1  1612
+ 33.4  1611
+ 33.7  1610
+ 34.0  1609
+ 34.3  1608
+ 34.7  1607
+ 35.0  1606
+ 35.3  1605
+ 35.6  1604
+ 35.9  1603
+ 36.2  1602
+ 36.5  1601
+ 36.8  1600
+ 37.2  1599
+ 37.4  1598
+ 37.8  1597
+ 38.1  1596
+ 38.4  1595
+ 38.7  1594
+ 39.0  1593
+ 39.3  1592
+ 39.6  1591
+ 39.9  1590
+ 40.3  1589
+ 40.6  1588
+ 40.9  1587
+ 41.2  1586
+ 41.5  1585
+ 41.8  1584
+ 42.1  1583
+ 42.4  1582
+ 42.8  1581
+ 43.0  1580
+ 43.3  1579
+ 43.7  1578
+ 44.0  1577
+ 44.3  1576
+ 44.6  1575
+ 44.9  1574
+ 45.2  1573
+ 45.5  1572
+ 45.7  1571
+ 46.1  1570
+ 46.3  1569
+ 46.7  1568
+ 46.9  1567
+ 47.2  1566
+ 47.5  1565
+ 47.8  1564
+ 48.1  1563
+ 48.4  1562
+ 48.7  1561
+ 49.0  1560
+ 49.3  1559
+ 49.6  1558
+ 49.8  1557
+ 50.1  1556
+ 50.4  1555
+ 50.7  1554
+ 51.0  1553
+ 51.2  1552
+ 51.6  1551
+ 51.8  1550
+ 52.1  1549
+ 52.4  1548
+ 52.7  1547
+ 53.0  1546
+ 53.2  1545
+ 53.6  1544
+ 53.8  1543
+ 54.1  1542
+ 54.4  1541
+ 54.6  1540
+ 54.9  1539
+ 55.2  1538
+ 55.5  1537
+ 55.7  1536
+ 56.0  1535
+ 56.3  1534
+ 56.6  1533
+ 56.8  1532
+ 57.1  1531
+ 57.3  1530
+ 57.6  1529
+ 57.9  1528
+ 58.1  1527
+ 58.4  1526
+ 58.6  1525
+ 58.9  1524
+ 59.2  1523
+ 59.5  1522
+ 59.7  1521
+ 60.0  1520
+ 60.2  1519
+ 60.4  1518
+ 60.7  1517
+ 61.0  1516
+ 61.2  1515
+ 61.5  1514
+ 61.7  1513
+ 62.0  1512
+ 62.2  1511
+ 62.5  1510
+ 62.7  1509
+ 63.0  1508
+ 63.2  1507
+ 63.5  1506
+ 63.7  1505
+ 63.9  1504
+ 64.1  1503
+ 64.4  1502
+ 64.6  1501
+ 64.9  1500
+ 65.1  1499
+ 65.3  1498
+ 65.5  1497
+ 65.8  1496
+ 66.0  1495
+ 66.2  1494
+ 66.4  1493
+ 66.7  1492
+ 66.9  1491
+ 67.1  1490
+ 67.3  1489
+ 67.5  1488
+ 67.7  1487
+ 68.0  1486
+ 68.2  1485
+ 68.4  1484
+ 68.6  1483
+ 68.8  1482
+ 69.0  1481
+ 69.2  1480
+ 69.5  1479
+ 69.7  1478
+ 69.9  1477
+ 70.1  1476
+ 70.3  1475
+ 70.5  1474
+ 70.7  1473
+ 70.9  1472
+ 71.1  1471
+ 71.3  1470
+ 71.5  1469
+ 71.7  1468
+ 71.9  1467
+ 72.1  1466
+ 72.3  1465
+ 72.5  1464
+ 72.7  1463
+ 72.9  1462
+ 73.1  1461
+ 73.3  1460
+ 73.5  1459
+ 73.7  1458
+ 73.9  1457
+ 74.0  1456
+ 74.2  1455
+ 74.4  1454
+ 74.6  1453
+ 74.8  1452
+ 75.0  1451
+ 75.2  1450
+ 75.4  1449
+ 75.5  1448
+ 75.8  1447
+ 76.0  1446
+ 76.1  1445
+ 76.3  1444
+ 76.5  1443
+ 76.7  1442
+ 76.9  1441
+ 77.0  1440
+ 77.2  1439
+ 77.4  1438
+ 77.6  1437
+ 77.7  1436
+ 77.9  1435
+ 78.1  1434
+ 78.2  1433
+ 78.4  1432
+ 78.6  1431
+ 78.7  1430
+ 78.9  1429
+ 79.1  1428
+ 79.2  1427
+ 79.4  1426
+ 79.5  1425
+ 79.7  1424
+ 79.9  1423
+ 80.0  1422
+ 80.2  1421
+ 80.3  1420
+ 80.4  1419
+ 80.6  1418
+ 80.7  1417
+ 80.9  1416
+ 81.0  1415
+ 81.2  1414
+ 81.3  1413
+ 81.4  1412
+ 81.6  1411
+ 81.8  1410
+ 81.9  1409
+ 82.0  1408
+ 82.2  1407
+ 82.3  1406
+ 82.4  1405
+ 82.6  1404
+ 82.7  1403
+ 82.9  1402
+ 83.0  1401
+ 83.1  1400
+ 83.2  1399
+ 83.4  1398
+ 83.5  1397
+ 83.6  1396
+ 83.8  1395
+ 83.9  1394
+ 84.0  1393
+ 84.2  1392
+ 84.3  1391
+ 84.4  1390
+ 84.5  1389
+ 84.7  1388
+ 84.8  1387
+ 84.9  1386
+ 85.0  1385
+ 85.1  1384
+ 85.3  1383
+ 85.4  1382
+ 85.5  1381
+ 85.6  1380
+ 85.7  1379
+ 85.9  1377
+ 86.1  1376
+ 86.2  1375
+ 86.3  1374
+ 86.4  1373
+ 86.5  1372
+ 86.6  1371
+ 86.8  1370
+ 86.9  1368
+ 87.1  1367
+ 87.2  1366
+ 87.3  1365
+ 87.4  1364
+ 87.5  1363
+ 87.6  1362
+ 87.7  1361
+ 87.8  1360
+ 87.9  1359
+ 88.0  1358
+ 88.1  1357
+ 88.2  1356
+ 88.3  1354
+ 88.5  1353
+ 88.6  1352
+ 88.7  1351
+ 88.8  1349
+ 88.9  1348
+ 89.0  1347
+ 89.1  1346
+ 89.2  1345
+ 89.3  1343
+ 89.4  1342
+ 89.5  1341
+ 89.6  1340
+ 89.7  1339
+ 89.8  1337
+ 89.9  1336
+ 90.0  1335
+ 90.1  1334
+ 90.2  1332
+ 90.3  1331
+ 90.4  1329
+ 90.5  1328
+ 90.6  1326
+ 90.7  1325
+ 90.8  1323
+ 90.9  1321
+ 91.0  1320
+ 91.1  1319
+ 91.2  1318
+ 91.3  1316
+ 91.4  1314
+ 91.5  1313
+ 91.6  1311
+ 91.7  1309
+ 91.8  1307
+ 91.9  1306
+ 92.0  1304
+ 92.1  1303
+ 92.2  1301
+ 92.3  1299
+ 92.4  1297
+ 92.5  1295
+ 92.6  1294
+ 92.7  1292
+ 92.8  1290
+ 92.9  1287
+ 93.0  1285
+ 93.1  1283
+ 93.2  1281
+ 93.3  1279
+ 93.4  1276
+ 93.5  1274
+ 93.6  1272
+ 93.7  1269
+ 93.8  1266
+ 93.9  1263
+ 94.0  1260
+ 94.1  1257
+ 94.2  1254
+ 94.3  1250
+ 94.4  1245
+ 94.5  1241
+ 94.6  1237
+ 94.7  1233
+ 94.8  1228
+ 94.9  1223
+ 95.0  1219
+ 95.1  1213
+ 95.2  1209
+ 95.3  1201
diff --git a/doc/shared/bibliography.bib b/doc/shared/bibliography.bib
new file mode 100755
index 0000000000000000000000000000000000000000..25e001cdf264a982c0c9d69c653ceab8bdfc1e06
--- /dev/null
+++ b/doc/shared/bibliography.bib
@@ -0,0 +1,105 @@
+@book{SPARCv8,
+	title		= "The SPARC Architecture Manual Version 8",
+	organization	= "SPARC International, Inc.",
+	year		= "1991, 1992",
+	version		= "Revision SAV080SI9308",
+}
+
+@book{MPPB,
+	title		= "Massively Parallel Processor Breadboarding Datasheet",
+	organization	= "Recore Systems BV",
+	year		= "2016",
+	version		= "4.02",
+}
+
+@book{ECSS40C,
+	title		= "ECSS-E-ST-40C Space engineering - Software",
+	organization	= "European Space Agency",
+	year		= "2009",
+	publisher	= "ESA Requirements and Standards Division",
+}
+
+@book{ECSSM40C,
+	title		= "ECSS-M-ST-40C Space project management - Configuration and information management",
+	organization	= "European Space Agency",
+	year		= "2009",
+	publisher	= "ESA Requirements and Standards Division",
+}
+
+@book{ECSS80C,
+	title		= "ECSS-Q-ST-80C Space product assurance - Software product assurance",
+	organization	= "European Space Agency",
+	year		= "2009",
+	publisher	= "ESA Requirements and Standards Division",
+}
+
+@book{ECSSQ1009C,
+	title		= "ECSS-Q-ST-10-09C Space product assurance - Nonconformance control system",
+	organization	= "European Space Agency",
+	year		= "2009",
+	publisher	= "ESA Requirements and Standards Division",
+}
+
+@book{XenUsrGuide,
+	title		= "Xentium User Guide",
+	organization	= "Recore Systems BV",
+	year		= "2016",
+}
+
+@book{leanosPQA,
+	title		= "LeanOS Product Quality Assurance Plan",
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{leanosSRS,
+	title		= "LeanOS Software Requirements Specification",
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{leanosADD,
+	title		= "LeanOS Architectural Design Document",
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{leanosTP,
+	title		= "LeanOS Test Plan",
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{leanosTS,
+	title		= {LeanOS Test Specification},
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{leanosUM,
+	title		= {LeanOS User Manual},
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{ssdpOS,
+	title		= "A Lightweight Operating System for the SSDP",
+	year		= "2016",
+	author		= {Armin Luntzer and Franz Kerschbaum and Roland Ottensamer and Christian Reimers},
+	url		= {https://indico.esa.int/indico/event/102/session/28/contribution/26}
+}
+
+@article{BASKET,
+	author = {Luntzer, Armin and Ottensamer, Roland and Kerschbaum, Franz},
+	title = {BASKET on-board software library},
+	journal = {Proc. SPIE},
+	volume = {9152},
+	pages = {91522S-91522S-8},
+	year = {2014},
+}
diff --git a/doc/shared/bibliography_egse.bib b/doc/shared/bibliography_egse.bib
new file mode 100755
index 0000000000000000000000000000000000000000..17d11d6d975c4bcdd338f5d53b979f00faa06abe
--- /dev/null
+++ b/doc/shared/bibliography_egse.bib
@@ -0,0 +1,1088 @@
+@book{SPARCv8,
+	title		= "The SPARC Architecture Manual Version 8",
+	organization	= "SPARC International, Inc.",
+	year		= "1991, 1992",
+	version		= "Revision SAV080SI9308",
+}
+
+@book{MPPB,
+	title		= "Massively Parallel Processor Breadboarding Datasheet",
+	organization	= "Recore Systems BV",
+	year		= "2016",
+	version		= "4.02",
+}
+
+@book{ECSS40C,
+	title		= "ECSS-E-ST-40C Space engineering - Software",
+	organization	= "European Space Agency",
+	year		= "2009",
+	publisher	= "ESA Requirements and Standards Division",
+}
+
+@book{ECSSM40C,
+	title		= "ECSS-M-ST-40C Space project management - Configuration and information management",
+	organization	= "European Space Agency",
+	year		= "2009",
+	publisher	= "ESA Requirements and Standards Division",
+}
+
+@book{ECSS80C,
+	title		= "ECSS-Q-ST-80C Space product assurance - Software product assurance",
+	organization	= "European Space Agency",
+	year		= "2009",
+	publisher	= "ESA Requirements and Standards Division",
+}
+
+@book{ECSSQ1009C,
+	title		= "ECSS-Q-ST-10-09C Space product assurance - Nonconformance control system",
+	organization	= "European Space Agency",
+	year		= "2009",
+	publisher	= "ESA Requirements and Standards Division",
+}
+
+@book{XenUsrGuide,
+	title		= "Xentium User Guide",
+	organization	= "Recore Systems BV",
+	year		= "2016",
+}
+
+@book{leanosPQA,
+	title		= "LeanOS Product Quality Assurance Plan",
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{leanosSRS,
+	title		= "LeanOS Software Requirements Specification",
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{leanosADD,
+	title		= "LeanOS Architectural Design Document",
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{leanosTP,
+	title		= "LeanOS Test Plan",
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{leanosTS,
+	title		= {LeanOS Test Specification},
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{leanosUM,
+	title		= {LeanOS User Manual},
+	organization	= "University of Vienna",
+	year		= "2017",
+	version		= "1.0",
+}
+
+@book{ssdpOS,
+	title		= "A Lightweight Operating System for the SSDP",
+	year		= "2016",
+	author		= {Armin Luntzer and Franz Kerschbaum and Roland Ottensamer and Christian Reimers},
+	url		= {https://indico.esa.int/indico/event/102/session/28/contribution/26}
+}
+
+@article{BASKET,
+	author = {Luntzer, Armin and Ottensamer, Roland and Kerschbaum, Franz},
+	title = {BASKET on-board software library},
+	journal = {Proc. SPIE},
+	volume = {9152},
+	pages = {91522S-91522S-8},
+	year = {2014},
+}
+
+@book{ECSSE41C,
+  title   = "ECSS-E-ST-70-41C, Ground Systems and Operations – Telemetry and Telecommand Packet Utilization Standard",
+  organization  = "European Space Agency",
+  year    = "2016",
+  publisher = "ESA Requirements and Standards Division",
+  keywords    = "applicable"
+}
+
+@book{ATHENATRS,
+	title		= "WFI-UVIE-TRS-15-0001, Application Software Requirements Specification",
+	organization	= "University of Vienna",
+	year		= "2022",
+	version		= "1.0",
+	keywords 	= "applicable"
+}
+
+@INPROCEEDINGS{Tinetti_2017,
+       author = {{Tinetti}, G. and {Drossart}, P. and {Eccleston}, P. and {Hartogh}, P. and
+         {Leconte}, J. and {Micela}, G. and {Ollivier}, M. and {Pilbratt}, G. and
+         {Puig}, L. and {Heske}, A. and {Turrini}, D. and {Vandenbussche}, B. and
+         {Wolkenberg}, P. and {Ariel Consortium}},
+        title = "{The science of ARIEL}",
+    booktitle = {European Planetary Science Congress},
+         year = 2017,
+        month = sep,
+          eid = {EPSC2017-713},
+        pages = {EPSC2017-713},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2017EPSC...11..713T},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2007Natur.448..169T,
+       author = {{Tinetti}, Giovanna and {Vidal-Madjar}, Alfred and {Liang}, Mao-Chang and
+         {Beaulieu}, Jean-Philippe and {Yung}, Yuk and {Carey}, Sean and
+         {Barber}, Robert J. and {Tennyson}, Jonathan and {Ribas}, Ignasi and
+         {Allard}, Nicole and {Ballester}, Gilda E. and {Sing}, David K. and
+         {Selsis}, Franck},
+        title = "{Water vapour in the atmosphere of a transiting extrasolar planet}",
+      journal = {Nature},
+         year = 2007,
+        month = jul,
+       volume = {448},
+       number = {7150},
+        pages = {169-171},
+          doi = {10.1038/nature06002},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2007Natur.448..169T},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2005Natur.434..740D,
+       author = {{Deming}, Drake and {Seager}, Sara and {Richardson}, L. Jeremy and
+         {Harrington}, Joseph},
+        title = "{Infrared radiation from an extrasolar planet}",
+      journal = {Nature},
+     keywords = {Astrophysics},
+         year = 2005,
+        month = mar,
+       volume = {434},
+       number = {7034},
+        pages = {740-743},
+          doi = {10.1038/nature03507},
+archivePrefix = {arXiv},
+       eprint = {astro-ph/0503554},
+ primaryClass = {astro-ph},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2005Natur.434..740D},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2007Natur.447..183K,
+       author = {{Knutson}, Heather A. and {Charbonneau}, David and {Allen}, Lori E. and
+         {Fortney}, Jonathan J. and {Agol}, Eric and {Cowan}, Nicolas B. and
+         {Showman}, Adam P. and {Cooper}, Curtis S. and {Megeath}, S. Thomas},
+        title = "{A map of the day-night contrast of the extrasolar planet HD 189733b}",
+      journal = {Nature},
+     keywords = {Astrophysics},
+         year = 2007,
+        month = may,
+       volume = {447},
+       number = {7141},
+        pages = {183-186},
+          doi = {10.1038/nature05782},
+archivePrefix = {arXiv},
+       eprint = {0705.0993},
+ primaryClass = {astro-ph},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2007Natur.447..183K},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2012ApJ...747L..20M,
+       author = {{Majeau}, Carl and {Agol}, Eric and {Cowan}, Nicolas B.},
+        title = "{A Two-dimensional Infrared Map of the Extrasolar Planet HD 189733b}",
+      journal = {apjl},
+     keywords = {infrared: planetary systems, methods: observational, techniques: photometric, Astrophysics - Earth and Planetary Astrophysics},
+         year = 2012,
+        month = mar,
+       volume = {747},
+       number = {2},
+          eid = {L20},
+        pages = {L20},
+          doi = {10.1088/2041-8205/747/2/L20},
+archivePrefix = {arXiv},
+       eprint = {1202.1883},
+ primaryClass = {astro-ph.EP},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2012ApJ...747L..20M},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2013ApJ...768..121A,
+       author = {{Apai}, D{\'a}niel and {Radigan}, Jacqueline and {Buenzli}, Esther and
+         {Burrows}, Adam and {Reid}, Iain Neill and {Jayawardhana}, Ray},
+        title = "{HST Spectral Mapping of L/T Transition Brown Dwarfs Reveals Cloud Thickness Variations}",
+      journal = {apj},
+     keywords = {brown dwarfs, planetary systems, planets and satellites: individual: Jupiter, stars: atmospheres, stars: low-mass, starspots, Astrophysics - Earth and Planetary Astrophysics, Astrophysics - Solar and Stellar Astrophysics},
+         year = 2013,
+        month = may,
+       volume = {768},
+       number = {2},
+          eid = {121},
+        pages = {121},
+          doi = {10.1088/0004-637X/768/2/121},
+archivePrefix = {arXiv},
+       eprint = {1303.4151},
+ primaryClass = {astro-ph.EP},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2013ApJ...768..121A},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@INPROCEEDINGS{2014SPIE.9143E..4OO,
+       author = {{Ottensamer}, Roland and {Rataj}, Miroslaw and {Schrader}, Jan-Rutger and
+         {Ferstl}, Roman and {G{\"u}del}, Manuel and {Kerschbaum}, Franz and
+         {Luntzer}, Armin},
+        title = "{EChO fine guidance sensor design and architecture}",
+    booktitle = {Space Telescopes and Instrumentation 2014: Optical, Infrared, and Millimeter Wave},
+         year = 2014,
+       series = {Society of Photo-Optical Instrumentation Engineers (SPIE) Conference Series},
+       volume = {9143},
+        month = aug,
+          eid = {91434O},
+        pages = {91434O},
+          doi = {10.1117/12.2056475},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2014SPIE.9143E..4OO},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2018ExA....46....1F,
+       author = {{Focardi}, M. and {Pace}, E. and {Farina}, M. and {Di Giorgio}, A.~M. and
+         {Ferrer}, J. Colom{\'e} and {Ribas}, I. and {Roig}, C. Sierra and
+         {Bote}, L. Gesa and {Morales}, J.~C. and {Amiaux}, J. and {Cara}, C. and
+         {Augur{\'e}s}, J.~L. and {Pascale}, E. and {Morgante}, G. and
+         {Da Deppo}, V. and {Pancrazzi}, M. and {Noce}, V. and {Pezzuto}, S. and
+         {Frericks}, M. and {Zwart}, F. and {Bishop}, G. and {Middleton}, K. and
+         {Eccleston}, P. and {Micela}, G. and {Tinetti}, G.},
+        title = "{The ARIEL Instrument Control Unit design. For the M4 Mission Selection Review of the ESA's Cosmic Vision Program}",
+      journal = {Experimental Astronomy},
+     keywords = {Exoplanets atmospheres, Infrared spectrometer, Payload electronics, Instrument control unit, On-Board SW, Astrophysics - Instrumentation and Methods for Astrophysics, Astrophysics - Earth and Planetary Astrophysics},
+         year = 2018,
+        month = nov,
+       volume = {46},
+       number = {1},
+        pages = {1-30},
+          doi = {10.1007/s10686-017-9560-3},
+archivePrefix = {arXiv},
+       eprint = {1705.09777},
+ primaryClass = {astro-ph.IM},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2018ExA....46....1F},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2019PASP..131i4401Z,
+       author = {{Zellem}, Robert T. and {Swain}, Mark R. and {Cowan}, Nicolas B. and
+         {Bryden}, Geoffrey and {Komacek}, Thaddeus D. and {Colavita}, Mark and
+         {Ardila}, David and {Roudier}, Gael M. and {Fortney}, Jonathan J. and
+         {Bean}, Jacob and {Line}, Michael R. and {Griffith}, Caitlin A. and
+         {Shkolnik}, Evgenya L. and {Kreidberg}, Laura and {Moses}, Julianne I. and
+         {Showman}, Adam P. and {Stevenson}, Kevin B. and {Wong}, Andre and
+         {Chapman}, John W. and {Ciardi}, David R. and {Howard}, Andrew W. and
+         {Kataria}, Tiffany and {Kempton}, Eliza M. -R. and {Latham}, David and
+         {Mahadevan}, Suvrath and {Mel{\'e}ndez}, Jorge and {Parmentier}, Vivien},
+        title = "{Constraining Exoplanet Metallicities and Aerosols with the Contribution to ARIEL Spectroscopy of Exoplanets (CASE)}",
+      journal = {PASP},
+     keywords = {Astrophysics - Earth and Planetary Astrophysics, Astrophysics - Instrumentation and Methods for Astrophysics},
+         year = 2019,
+        month = sep,
+       volume = {131},
+       number = {1003},
+        pages = {094401},
+          doi = {10.1088/1538-3873/ab2d54},
+archivePrefix = {arXiv},
+       eprint = {1906.02820},
+ primaryClass = {astro-ph.EP},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2019PASP..131i4401Z},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2007ApJ...655..564K,
+       author = {{Knutson}, Heather A. and {Charbonneau}, David and {Noyes}, Robert W. and
+         {Brown}, Timothy M. and {Gilliland}, Ronald L.},
+        title = "{Using Stellar Limb-Darkening to Refine the Properties of HD 209458b}",
+      journal = {apj},
+     keywords = {Stars: Binaries: Eclipsing, Stars: Planetary Systems, Stars: Individual: Henry Draper Number: HD 209458, Techniques: Photometric, Astrophysics},
+         year = 2007,
+        month = jan,
+       volume = {655},
+       number = {1},
+        pages = {564-575},
+          doi = {10.1086/510111},
+archivePrefix = {arXiv},
+       eprint = {astro-ph/0603542},
+ primaryClass = {astro-ph},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2007ApJ...655..564K},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2008ApJ...686.1341C,
+       author = {{Charbonneau}, David and {Knutson}, Heather A. and {Barman}, Travis and
+         {Allen}, Lori E. and {Mayor}, Michel and {Megeath}, S. Thomas and
+         {Queloz}, Didier and {Udry}, St{\'e}phane},
+        title = "{The Broadband Infrared Emission Spectrum of the Exoplanet HD 189733b}",
+      journal = {apj},
+     keywords = {binaries: eclipsing, infrared: stars, planetary systems, stars: individual: HD 189733, techniques: photometric, Astrophysics},
+         year = 2008,
+        month = oct,
+       volume = {686},
+       number = {2},
+        pages = {1341-1348},
+          doi = {10.1086/591635},
+archivePrefix = {arXiv},
+       eprint = {0802.0845},
+ primaryClass = {astro-ph},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2008ApJ...686.1341C},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{1983PASP...95..163K,
+       author = {{King}, I.~R.},
+        title = "{Accuracy of measurement of star images on a pixel array.}",
+      journal = {PASP},
+     keywords = {Astrometry, Brightness, Signal To Noise Ratios, Stellar Luminosity, Stellar Spectrophotometry, Vidicons, Accuracy, Algorithms, Least Squares Method, Poisson Density Functions, Astronomy},
+         year = 1983,
+        month = feb,
+       volume = {95},
+        pages = {163-168},
+          doi = {10.1086/131139},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/1983PASP...95..163K},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2000PASP..112.1360A,
+       author = {{Anderson}, Jay and {King}, Ivan R.},
+        title = "{Toward High-Precision Astrometry with WFPC2. I. Deriving an Accurate Point-Spread Function}",
+      journal = {PASP},
+     keywords = {Astrometry, Methods: Data Analysis, Techniques: Image Processing, Techniques: Photometric, Astrophysics},
+         year = 2000,
+        month = oct,
+       volume = {112},
+       number = {776},
+        pages = {1360-1382},
+          doi = {10.1086/316632},
+archivePrefix = {arXiv},
+       eprint = {astro-ph/0006325},
+ primaryClass = {astro-ph},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2000PASP..112.1360A},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2013PASP..125..580M,
+       author = {{Mendez}, Rene A. and {Silva}, Jorge F. and {Lobos}, Rodrigo},
+        title = "{Analysis and Interpretation of the Cram{\'e}r-Rao Lower-Bound in Astrometry: One-Dimensional Case}",
+      journal = {PASP},
+     keywords = {Astrophysics - Instrumentation and Methods for Astrophysics, Astrophysics - Astrophysics of Galaxies, Astrophysics - Solar and Stellar Astrophysics},
+         year = 2013,
+        month = may,
+       volume = {125},
+       number = {927},
+        pages = {580},
+          doi = {10.1086/671126},
+archivePrefix = {arXiv},
+       eprint = {1304.6361},
+ primaryClass = {astro-ph.IM},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2013PASP..125..580M},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@BOOK{Astrophysics_of_exoplanetary_Atmospheres,
+	author = {Valerio Bozza, Luigi Manchini, Alessandro Sozzetti},
+	title = {Astrophysics of Exoplanetary Atmospheres},
+	publisher = {Springer Nature},
+	year = {2018}
+}
+
+@ARTICLE{2018A&A...616A..95E,
+       author = {{Espinosa}, Sebastian and {Silva}, Jorge F. and {Mendez}, Rene A. and
+         {Lobos}, Rodrigo and {Orchard}, Marcos},
+        title = "{Optimality of the maximum likelihood estimator in astrometry}",
+      journal = {aap},
+     keywords = {astrometry, methods: statistical, methods: analytical, Astrophysics - Instrumentation and Methods for Astrophysics, Astrophysics - Solar and Stellar Astrophysics, Physics - Data Analysis, Statistics and Probability, Physics - Instrumentation and Detectors},
+         year = 2018,
+        month = aug,
+       volume = {616},
+          eid = {A95},
+        pages = {A95},
+          doi = {10.1051/0004-6361/201732537},
+archivePrefix = {arXiv},
+       eprint = {1805.03673},
+ primaryClass = {astro-ph.IM},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2018A&A...616A..95E},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2009OptCo.282.1526C,
+       author = {{Chen}, Hongli and {Rao}, Changhui},
+        title = "{Accuracy analysis on centroid estimation algorithm limited by photon noise for point object}",
+      journal = {Optics Communications},
+         year = 2009,
+        month = apr,
+       volume = {282},
+       number = {8},
+        pages = {1526-1530},
+          doi = {10.1016/j.optcom.2008.12.046},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2009OptCo.282.1526C},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{2006MNRAS.371..323T,
+       author = {{Thomas}, S. and {Fusco}, T. and {Tokovinin}, A. and {Nicolle}, M. and
+         {Michau}, V. and {Rousset}, G.},
+        title = "{Comparison of centroid computation algorithms in a Shack-Hartmann sensor}",
+      journal = {mnras},
+     keywords = {turbulence, instrumentation: adaptive optics},
+         year = 2006,
+        month = sep,
+       volume = {371},
+       number = {1},
+        pages = {323-336},
+          doi = {10.1111/j.1365-2966.2006.10661.x},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2006MNRAS.371..323T},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@book{ARIEL-RAL-PL-DD-001,
+       author = {Eccleston, Paul},
+        title = "{ARIEL Payload Design Description}",
+         year = {2017},
+        month = {Feb}
+}
+
+@Article{doi:10.1117/12.508409,
+author = { Anton S. Tremsin,John V. Vallerga,Oswald H. W. Siegmund,Jeff S. Hull},
+title = {Centroiding algorithms and spatial resolution of photon counting detectors with cross-strip anodes},
+journal = {Proc.SPIE},
+volume = {5164},
+number = {},
+pages = {5164 - 5164 - 12},
+year = {2003},
+doi = {10.1117/12.508409},
+URL = {https://doi.org/10.1117/12.508409},
+eprint = {}
+}
+
+@Article{doi:10.1117/12.506483,
+author = { Lisa A. Poyneer,Kai  La Fortune,Carri  Chan},
+title = {Scene-based wavefront sensing for remote imaging},
+journal = {Proc.SPIE},
+volume = {5162},
+number = {},
+pages = {5162 - 5162 - 12},
+year = {2003},
+doi = {10.1117/12.506483},
+URL = {https://doi.org/10.1117/12.506483},
+eprint = {}
+}
+
+@Article{Willert1991,
+author="Willert, C. E.
+and Gharib, M.",
+title="Digital particle image velocimetry",
+journal="Experiments in Fluids",
+year="1991",
+month="Jan",
+day="01",
+volume="10",
+number="4",
+pages="181--193",
+abstract="Digital particle image velocimetry (DPIV) is the digital counterpart of conventional laser speckle velocitmetry (LSV) and particle image velocimetry (PIV) techniques. In this novel, two-dimensional technique, digitally recorded video images are analyzed computationally, removing both the photographic and opto-mechanical processing steps inherent to PIV and LSV. The directional ambiguity generally associated with PIV and LSV is resolved by implementing local spatial cross-correlations between two sequential single-exposed particle images. The images are recorded at video rate (30 Hz or slower) which currently limits the application of the technique to low speed flows until digital, high resolution video systems with higher framing rates become more economically feasible. Sequential imaging makes it possible to study unsteady phenomena like the temporal evolution of a vortex ring described in this paper. The spatial velocity measurements are compared with data obtained by direct measurement of the separation of individual particle pairs. Recovered velocity data are used to compute the spatial and temporal vorticity distribution and the circulation of the vortex ring.",
+issn="1432-1114",
+doi="10.1007/BF00190388",
+url="https://doi.org/10.1007/BF00190388"
+}
+
+@Mastersthesis{Ferstl,
+author = {Roman Ferstl},
+title = {Optimised Cenrtroiding of Stars for Space Applications},
+school = {University of Vienna, Institute for Astrophysics},
+year = {2016}
+}
+
+@Book{Num.Meth,
+author = {Whilliam H. Press and Saul A. Teukolsky and William T. Vetterling and Brian P. Flannery},
+title = {Numerical Recipes, Third Edition},
+publisher = {Cambridge University Press},
+year = {2007}
+}
+
+@Article{Roh,
+author = {Kyung-Wan Roh and Tae-Kyoung Uhm and Ji-Yeon Kim and Sung-Kie Youn and Jun Ho Lee},
+title = {Noise-Insensitive Centroiding Algorithm for a Shack-Hartmann Sensor},
+journal = {J. Korean Phy. Soc.},
+volume = {52},
+number = {1},
+pages = {160-169},
+year = {2008},
+doi = {10.3938/jkps.52.160},
+URL = {https://doi.org/10.3938/jkps.52.160}
+}
+
+@article{Ottensamer,
+author = { Roland  Ottensamer,Miroslaw  Rataj,Jan-Rutger  Schrader,Roman  Ferstl,Manuel  Güdel,Franz  Kerschbaum,Armin  Luntzer},
+title = {EChO fine guidance sensor design and architecture},
+journal = {Proc.SPIE},
+volume = {9143},
+number = {},
+pages = {9143 - 9143 - 10},
+year = {2014},
+doi = {10.1117/12.2056475},
+URL = {https://doi.org/10.1117/12.2056475},
+eprint = {}
+}
+
+@ARTICLE{Zhaoming,
+   author = {{Ma}, Z. and {Bernstein}, G. and {Weinstein}, A. and {Sholl}, M.
+	},
+    title = "{Diagnosing Space Telescope Misalignment and Jitter Using Stellar Images}",
+  journal = {PASP},
+archivePrefix = "arXiv",
+   eprint = {0809.2954},
+     year = 2008,
+    month = dec,
+   volume = 120,
+    pages = {1307},
+      doi = {10.1086/595724},
+   adsurl = {http://adsabs.harvard.edu/abs/2008PASP..120.1307M},
+  adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@ARTICLE{Deppo,
+author = { Vania  Da Deppo,Kevin  Middleton,Mauro  Focardi,Gianluca  Morgante,Emanuele  Pace,Riccardo  Claudi,Giuseppina  Micela},
+title = {Design of an afocal telescope for the ARIEL mission},
+journal = {Proc.SPIE},
+volume = {9904},
+number = {},
+pages = {9904 - 9904 - 14},
+year = {2016},
+doi = {10.1117/12.2230969},
+URL = {https://doi.org/10.1117/12.2230969},
+eprint = {}
+}
+
+@ARTICLE{Cessa,
+author = { Andrea  Fortier,Thomas  Beck,Willy  Benz,Christopher  Broeg,Virginie  Cessa,David  Ehrenreich,Nicolas  Thomas},
+title = {CHEOPS: a space telescope for ultra-high precision photometry of exoplanet transits},
+journal = {Proc.SPIE},
+volume = {9143},
+number = {},
+pages = {9143 - 9143 - 12},
+year = {2014},
+doi = {10.1117/12.2056687},
+URL = {https://doi.org/10.1117/12.2056687},
+eprint = {}
+}
+
+@ARTICLE{Nelan,
+author = { Edmund P. Nelan,Olivia L. Lupie,Barbara  McArthur,G. Fritz Benedict,Otto G. Franz,Larry H. Wasserman,Linda  Abramowicz-Reed,Russell B. Makidon,Lauretta  Nagel},
+title = {Fine guidance sensors aboard the Hubble Space Telescope: the scientific capabilities of these interferometers},
+journal = {Proc.SPIE},
+volume = {3350},
+number = {},
+pages = {3350 - 3350 - 11},
+year = {1998},
+doi = {10.1117/12.317121},
+URL = {https://doi.org/10.1117/12.317121},
+eprint = {}
+}
+
+@article{Benedict,
+  author={G. Fritz Benedict and Barbara E. McArthur and Edmund P. Nelan and Thomas E. Harrison},
+  title={Astrometry with Hubble Space Telescope Fine Guidance Sensors—A Review},
+  journal={Publications of the Astronomical Society of the Pacific},
+  volume={129},
+  number={971},
+  pages={012001},
+  url={http://stacks.iop.org/1538-3873/129/i=971/a=012001},
+  year={2017},
+  abstract={Over the last 20 years, Hubble Space Telescope Fine Guidance Sensor interferometric astrometry has produced precise and accurate parallaxes of astrophysical interesting stars and mass estimates for stellar companions. We review parallax results, and binary star and exoplanet mass determinations, and compare a subset of these parallaxes with preliminary ##IMG## [http://ej.iop.org/images/1538-3873/129/971/012001/paspaa46f2ieqn1.gif] {${Gaia}$} results. The approach to single-field relative astrometry described herein may continue to have value for targets fainter than the ##IMG## [http://ej.iop.org/images/1538-3873/129/971/012001/paspaa46f2ieqn2.gif] {${Gaia}$} limit in the coming era of 20–30 m telescopes.}
+}
+
+@ARTICLE{Hasan,
+   author = {{Hasan}, H. and {Burrows}, C.~J.},
+    title = "{Telescope Image Modeling (TIM)}",
+  journal = {PASP},
+ keywords = {Computer Programs, Computerized Simulation, Hubble Space Telescope, Images, Utilization, Autocorrelation, Data Sampling, Optical Equipment, Pixels, Point Spread Functions},
+     year = 1995,
+    month = mar,
+   volume = 107,
+    pages = {289-298},
+      doi = {10.1086/133552},
+   adsurl = {http://adsabs.harvard.edu/abs/1995PASP..107..289H},
+  adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@article{Turner,
+author = {Turner, H. H.},
+title = {On the Systematic Errors of Measures on Photographic Plates},
+journal = {Monthly Notices of the Royal Astronomical Society},
+volume = {56},
+number = {6},
+pages = {310-315},
+year = {1896},
+doi = {10.1093/mnras/56.6.310},
+URL = {http://dx.doi.org/10.1093/mnras/56.6.310},
+eprint = {/oup/backfile/content_public/journal/mnras/56/6/10.1093/mnras/56.6.310/2/mnras56-0310.pdf}
+}
+
+@article{Whitford,
+author = {Whitford,A. E.  and Kron,G. E. },
+title = {Photoelectric Guiding of Astronomical Telescopes},
+journal = {Review of Scientific Instruments},
+volume = {8},
+number = {3},
+pages = {78-82},
+year = {1937},
+doi = {10.1063/1.1752245},
+URL = {https://doi.org/10.1063/1.1752245},
+eprint = {https://doi.org/10.1063/1.1752245}
+}
+
+@ARTICLE{Liebe, 
+author={C. C. Liebe}, 
+journal={IEEE Aerospace and Electronic Systems Magazine}, 
+title={Pattern recognition of star constellations for spacecraft applications}, 
+year={1992}, 
+volume={7}, 
+number={6}, 
+pages={34-41}, 
+doi={10.1109/62.145117}, 
+ISSN={0885-8985}, 
+month={June}
+}
+
+@INPROCEEDINGS{Jorgensen,
+   author = {{J{\o}rgensen}, J.~L.},
+    title = "{Closed Loop AOCS Testing of an Autonomous Star Tracker}",
+booktitle = {Spacecraft Guidance, Navigation and Control Systems},
+     year = 2000,
+   series = {ESA Special Publication},
+   volume = 425,
+   editor = {{Sch{\"u}rmann}, B.},
+    month = feb,
+    pages = {587},
+   adsurl = {http://adsabs.harvard.edu/abs/2000ESASP.425..587J},
+  adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@article{HUANG2016105,
+title = {Modeling and calibration of pointing errors with alt-az telescope},
+journal = {New Astronomy},
+volume = {47},
+pages = {105 - 110},
+year = {2016},
+issn = {1384-1076},
+doi = {https://doi.org/10.1016/j.newast.2016.02.007},
+url = {http://www.sciencedirect.com/science/article/pii/S1384107616000191},
+author = {Long Huang and Wenli Ma and Jinlong Huang},
+keywords = {Pointing error, Alt-az telescope, Error analysis, SPRM}
+}
+
+@article{Subedi,
+author = { Hari  Subedi,Peter  Varnai,N. Jeremy  Kasdin},
+title = {Adaptive estimation of line-of-sight jitter disturbance},
+journal = {Proc.SPIE},
+volume = {10400},
+number = {},
+pages = {10400 - 10400 - 8},
+year = {2017},
+doi = {10.1117/12.2273419},
+URL = {https://doi.org/10.1117/12.2273419},
+eprint = {}
+}
+
+@article{Hyde,
+author = { Tristram T. Hyde,Kong Q. Ha,John D. Johnston,Joseph M. Howard,Gary E. Mosier},
+title = {Integrated modeling activities for the James Webb Space Telescope: optical jitter analysis},
+journal = {Proc.SPIE},
+volume = {5487},
+number = {},
+pages = {5487 - 5487 - 12},
+year = {2004},
+doi = {10.1117/12.551806},
+URL = {https://doi.org/10.1117/12.551806},
+eprint = {}
+}
+
+@ARTICLE{Rodeghiero,
+author = {{Rodeghiero}, G. and {Pott}, J.-U. and {Arcidiacono}, C. and {Massari}, D. and {Gl{\"u}ck}, M. and {Riechert}, H. and {Gendron}, E.},
+title = "{The impact of ELT distortions and instabilities on future astrometric observations}",
+journal = {mnras},
+archivePrefix = "arXiv",
+eprint = {1806.01327},
+primaryClass = "astro-ph.IM",
+keywords = {astrometry},
+year = 2018,
+month = sep,
+volume = 479,
+pages = {1974-1985},
+doi = {10.1093/mnras/sty1426},
+adsurl = {http://adsabs.harvard.edu/abs/2018MNRAS.479.1974R},
+adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@article{Szeto,
+author = {Szeto, Kei and Roberts, Scott and Gedig, Mike and Austin, Glenn and Lagally, Christie and Patrick, Steven and Tsang, Dominic and Macmartin, Douglas and Sirota, Mark and Stepp, Larry and Thompson, Peter},
+year = {2008},
+month = {08},
+pages = {},
+title = {TMT Telescope Structure System - Design and Development Progress Report},
+volume = {7012},
+booktitle = {Proc SPIE}
+}
+
+@article{Kan,
+author = { Frank W. Kan,Andrew T. Sarawit,Shawn P. Callahan,Mike L. Pollard},
+title = {New finite element models and seismic analyses of the telescopes at W.M. Keck Observatory},
+journal = {Proc.SPIE},
+volume = {9145},
+number = {},
+pages = {9145 - 9145 - 16},
+year = {2014},
+doi = {10.1117/12.2057329},
+URL = {https://doi.org/10.1117/12.2057329},
+eprint = {}
+}
+
+@article{Dressel,
+author = {Dressel, L},
+year = {2012},
+month = {07},
+pages = {14-},
+title = {Breathing, Position Drift, and PSF Variations on the UVIS Detector},
+booktitle = {Space Telescope WFC Instrument Science Report}
+}
+
+@ARTICLE{Howell,
+   author = {{Howell}, S.~B. and {Sobeck}, C. and {Haas}, M. and {Still}, M. and 
+	{Barclay}, T. and {Mullally}, F. and {Troeltzsch}, J. and {Aigrain}, S. and 
+	{Bryson}, S.~T. and {Caldwell}, D. and {Chaplin}, W.~J. and 
+	{Cochran}, W.~D. and {Huber}, D. and {Marcy}, G.~W. and {Miglio}, A. and 
+	{Najita}, J.~R. and {Smith}, M. and {Twicken}, J.~D. and {Fortney}, J.~J.
+	},
+    title = "{The K2 Mission: Characterization and Early Results}",
+  journal = {PASP},
+archivePrefix = "arXiv",
+   eprint = {1402.5163},
+ primaryClass = "astro-ph.IM",
+     year = 2014,
+    month = apr,
+   volume = 126,
+    pages = {398},
+      doi = {10.1086/676406},
+   adsurl = {http://adsabs.harvard.edu/abs/2014PASP..126..398H},
+  adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@article{Nelan,
+   author = {{Nelan}, E.~P. and {Lupie}, O.~L. and {McArthur}, B. and {Benedict}, G.~F. and 
+	{Franz}, O.~G. and {Wasserman}, L.~H. and {Abramowicz-Reed}, L. and 
+	{Makidon}, R.~B. and {Nagel}, L.},
+    title = "{Fine guidance sensors aboard the Hubble Space Telescope: the scientific capabilities of these interferometers}",
+booktitle = {Astronomical Interferometry},
+     year = 1998,
+   series = {procspie},
+   volume = 3350,
+   editor = {{Reasenberg}, R.~D.},
+    month = jul,
+    pages = {237-247},
+      doi = {10.1117/12.317121},
+   adsurl = {http://adsabs.harvard.edu/abs/1998SPIE.3350..237N},
+  adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@article{Maszkiewicz,
+author = { Michael  Maszkiewicz},
+title = {Near- infrared imager and slitless spectrograph (NIRISS): a new instrument on James Webb Space Telescope (JWST)},
+journal = {Proc.SPIE},
+volume = {10564},
+number = {},
+pages = {10564 - 10564 - 6},
+year = {2017},
+doi = {10.1117/12.2309161},
+URL = {https://doi.org/10.1117/12.2309161},
+eprint = {}
+}
+
+@article{Doyon,
+author = { René  Doyon,John B. Hutchings,Mathilde  Beaulieu,Loic  Albert,David  Lafrenière,Chris  Willott,Driss  Touahri,Neil  Rowlands,Micheal  Maszkiewicz,Alex W. Fullerton,Kevin  Volk,André R. Martel,Pierre  Chayer,Anand  Sivaramakrishnan,Roberto  Abraham,Laura  Ferrarese,Ray  Jayawardhana,Doug  Johnstone,Michael  Meyer,Judith L. Pipher,Marcin  Sawicki},
+title = {The JWST Fine Guidance Sensor (FGS) and Near-Infrared Imager and Slitless Spectrograph (NIRISS)},
+journal = {Proc.SPIE},
+volume = {8442},
+number = {},
+pages = {8442 - 8442 - 13},
+year = {2012},
+doi = {10.1117/12.926578},
+URL = {https://doi.org/10.1117/12.926578},
+eprint = {}
+}
+
+@article{Zheng,
+author = { Sheng Hai  Zheng,Clinton  Evans},
+title = {Optical design of the JWST fine guider sensor},
+journal = {Proc.SPIE},
+volume = {7786},
+number = {},
+pages = {7786 - 7786 - 8},
+year = {2010},
+doi = {10.1117/12.859705},
+URL = {https://doi.org/10.1117/12.859705},
+eprint = {}
+}
+
+@article{Maszkiewicz17,
+author = { M.  Maszkiewicz},
+title = {James Webb space telescope (JWST): fine guidance sensor and tunable filter imager optical design overview and status},
+journal = {Proc.SPIE},
+volume = {10565},
+number = {},
+pages = {10565 - 10565 - 5},
+year = {2017},
+doi = {10.1117/12.2309243},
+URL = {https://doi.org/10.1117/12.2309243},
+eprint = {}
+}
+
+@article{Clampin,
+author = {Mark  Clampin},
+title = {Overview of the James Webb Space Telescope observatory},
+journal = {Proc.SPIE},
+volume = {8146},
+number = {},
+pages = {8146 - 8146 - 10},
+year = {2011},
+doi = {10.1117/12.897446},
+URL = {https://doi.org/10.1117/12.897446},
+eprint = {}
+}
+
+@article{Puig,
+author = { L.  Puig,G. L. Pilbratt,A.  Heske,I.  Escudero Sanz,P.-E.  Crouzet},
+title = {ARIEL: an ESA M4 mission candidate},
+journal = {Proc.SPIE},
+volume = {9904},
+number = {},
+pages = {9904 - 9904 - 9},
+year = {2016},
+doi = {10.1117/12.2230964},
+URL = {https://doi.org/10.1117/12.2230964},
+eprint = {}
+}
+
+@Book{ARIEL_Proposal,
+author = {{ARIEL Science Study Team}},
+title = {ARIEL: The Atmospheric Remote-Sensing
+Infrared Exoplanet Large-survey, Mission Proposal},
+year = {2015}
+}
+
+@article{Focardi,
+author = { M.  Focardi,E.  Pace,J.  Colomé,I.  Ribas,M.  Rataj,R.  Ottensamer,M.  Farina,A. M.  Di Giorgio,P.  Wawer,M.  Pancrazzi,V.  Noce,S.  Pezzuto,G.  Morgante,B.  Artigues,C.  Sierra-Roig,L.  Gesa,P.  Eccleston,M.  Crook,G.  Micela},
+title = {The Atmospheric Remote-sensing Infrared Exoplanets Large-survey (ARIEL) payload electronic subsystems},
+journal = {Proc.SPIE},
+volume = {9904},
+number = {},
+pages = {9904 - 9904 - 16},
+year = {2016},
+doi = {10.1117/12.2231683},
+URL = {https://doi.org/10.1117/12.2231683},
+eprint = {}
+}
+
+@Book{ARIEL_yellow_book,
+author = {{ARIEL Science Study Team}},
+title = {ARIEL Assessment Study Report, ESA/SCI(2017)2
+Issue 2.0},
+year = {2017}
+}
+
+@Book{Cheops,
+author = {{The CHEOPS Study Team}},
+title = {CHEOPS Definition Study Report (Red Book)},
+year = {2013}
+}
+
+@Book{Ott,
+author = {T Ott, A Benoit, P Van den Braembussche},
+title = {ESA pointing error engineering handbook, ESSB-HB-E-003-Issue1},
+year = {2011}
+}
+
+@Book{ELT,
+author = {{The E-ELT Project Office}},
+title = {E-ELT Construction Proposal},
+year = {2014}
+}
+
+@inproceedings{Vyas,
+author = {Akondi Vyas and M. B. Roopashree and B. Raghavendra Prasad},
+title = {{Noise reduction in the centroiding of laser guide star spot pattern using thresholded Zernike reconstructor}},
+volume = {7736},
+booktitle = {Adaptive Optics Systems II},
+editor = {Brent L. Ellerbroek and Michael Hart and Norbert Hubin and Peter L. Wizinowich},
+organization = {International Society for Optics and Photonics},
+publisher = {SPIE},
+pages = {1556 -- 1565},
+keywords = {Shack Hartmann sensor, Laser guide star, centroiding, Zernike reconstructor},
+year = {2010},
+doi = {10.1117/12.856640},
+URL = {https://doi.org/10.1117/12.856640}
+}
+
+@article{Vyas_Vohnsen,
+author = {Akondi, Vyas and Vohnsen, Brian},
+year = {2013},
+month = {07},
+pages = {434-443},
+title = {Myopic aberrations: Impact of centroiding noise in Hartmann Shack wavefront sensing},
+volume = {33},
+journal = {Ophthalmic \& physiological optics : the journal of the British College of Ophthalmic Opticians (Optometrists)},
+doi = {10.1111/opo.12076}
+}
+
+@article{Baker:07,
+author = {K. L. Baker and M. M. Moallem},
+journal = {Opt. Express},
+number = {8},
+pages = {5147--5159},
+publisher = {OSA},
+title = {Iteratively weighted centroiding for Shack-Hartmann wave-front sensors},
+volume = {15},
+month = {Apr},
+year = {2007},
+url = {http://www.opticsexpress.org/abstract.cfm?URI=oe-15-8-5147},
+doi = {10.1364/OE.15.005147},
+}
+
+
+@ARTICLE{2013ApJ...768..121A,
+       author = {{Apai}, D{\'a}niel and {Radigan}, Jacqueline and {Buenzli}, Esther and
+         {Burrows}, Adam and {Reid}, Iain Neill and {Jayawardhana}, Ray},
+        title = "{HST Spectral Mapping of L/T Transition Brown Dwarfs Reveals Cloud Thickness Variations}",
+      journal = {\apj},
+     keywords = {brown dwarfs, planetary systems, planets and satellites: individual: Jupiter, stars: atmospheres, stars: low-mass, starspots, Astrophysics - Earth and Planetary Astrophysics, Astrophysics - Solar and Stellar Astrophysics},
+         year = 2013,
+        month = may,
+       volume = {768},
+       number = {2},
+          eid = {121},
+        pages = {121},
+          doi = {10.1088/0004-637X/768/2/121},
+archivePrefix = {arXiv},
+       eprint = {1303.4151},
+ primaryClass = {astro-ph.EP},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2013ApJ...768..121A},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@Book{ARIEL_red_book,
+author = {{ARIEL Science Study Team}},
+title = {ARIEL Definition Study Report, ESA/SCI(2020)1
+Issue 8.4},
+year = {2020}
+}
+
+@article{Winick:86,
+author = {Kim A. Winick},
+journal = {J. Opt. Soc. Am. A},
+keywords = {Algorithms; Arrays; Charge coupled devices; Statistics; Turbulence},
+number = {11},
+pages = {1809--1815},
+publisher = {OSA},
+title = {Cram\'{e}r--Rao lower bounds on the performance of charge-coupled-device optical position estimators},
+volume = {3},
+month = {Nov},
+year = {1986},
+url = {http://josaa.osa.org/abstract.cfm?URI=josaa-3-11-1809},
+doi = {10.1364/JOSAA.3.001809},
+abstract = {The problem of optically estimating an object's position by using a charge-coupled device (CCD) array composed of square pixels $\Delta$x on a side is analyzed. The object's image spot at the CCD is assumed to have a Gaussian intensity profile with a 1/e point at a radial distance of 2$\sigma$s from the peak, and the CCD noise is modeled as Poisson-distributed, dark-current shot noise. A two-dimensional Cram\'{e}r--Rao bound is developed and used to determine a lower limit for the mean-squared error of any unbiased position estimator, and the maximum-likelihood estimator is also derived. For the one-dimensional position-estimation problem the lower bound is shown to be minimum for a pixel-to-image size ratio $\Delta$x/$\sigma$s of between 1 and 2 over a wide range of signal-to-noise ratios. Similarly for the two-dimensional problem, the optimum ratio is shown to lie between 1.5 and 2.5. As is customary in direct detection systems, it is also observed that the lower bound is a function of both the signal power and noise power separately and not just of their ratio. Finally, the maximum-likelihood estimator is shown to be independent of the signal and noise powers at high signal-to-noise ratios.},
+}
+
+@InProceedings{10.1007/978-1-4471-2386-6_13,
+author="Yu, Ping
+and Yang, You
+and Gan, Yan",
+editor="Zhu, Rongbo
+and Ma, Yan",
+title="Experiment Analysis on the Bubble Sort Algorithm and Its Improved Algorithms",
+booktitle="Information Engineering and Applications",
+year="2012",
+publisher="Springer London",
+address="London",
+pages="95--102",
+abstract="Sorting is the basic problem of computer science. After the introduction of four bubble sorting algorithm: traditional, marked flag, two-way bubble and alternate, the time and space complexity of these algorithms were summarized. They are all   O(n2) and  O(1). The performances of these algorithms were verified by programming. The result was that non-traditional sorting algorithms were time cost-less than traditional when the random degree of input sequence was low, otherwise the traditional was time cost-less. The experiment shows three approximate relationships. One is four algorithms' time cost and input scale could be characterized by an exponential curve. The second is the traditional algorithm's time cost and random degree could be described by a horizontal line. The last is the non-traditional algorithms' time cost and random degree could be depicted by a line with the slope of 40{\textordmasculine}.",
+isbn="978-1-4471-2386-6"
+}
+
+@ARTICLE{1995STECF..22...20F,
+       author = {{Freudling}, W.},
+        title = "{WFPC 2 hot pixels and image restoration}",
+      journal = {Space Telescope European Coordinating Facility Newsletter},
+         year = 1995,
+        month = feb,
+       volume = {22},
+        pages = {20},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/1995STECF..22...20F},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+@inproceedings{Eccleston,
+author = {Paul Eccleston and Giovanna Tinetti and Jean-Philippe Beaulieu and Manuel Güdel and Paul Hartogh and Giuseppina Micela and Michiel Min and Miroslaw Rataj and Tom Ray and Ignasi Ribas and Bart Vandenbussche and Jean-Louis Auguères and Georgia Bishop and Vania Da Deppo and Mauro Focardi and Thomas Hunt and Giuseppe Malaguti and Kevin Middleton and Gianluca Morgante and Marc Ollivier and Emanuele Pace and Enzo Pascale and William Taylor},
+title = {{An integrated payload design for the Atmospheric Remote-sensing Infrared Exoplanet Large-survey (ARIEL)}},
+volume = {9904},
+booktitle = {Space Telescopes and Instrumentation 2016: Optical, Infrared, and Millimeter Wave},
+editor = {Howard A. MacEwen and Giovanni G. Fazio and Makenzie Lystrup and Natalie Batalha and Nicholas Siegler and Edward C. Tong},
+organization = {International Society for Optics and Photonics},
+publisher = {SPIE},
+pages = {1015 -- 1030},
+keywords = {Astronomy, Instrumentation, Exoplanets, Spectroscopy, Space, Transit, Telescope, Atmosphere},
+year = {2016},
+doi = {10.1117/12.2232878},
+URL = {https://doi.org/10.1117/12.2232878}
+}
+
+@inproceedings{Rataj,
+author = {Miroslaw Rataj and Piotr Wawer and Konrad Skup and Mateusz Sobiecki},
+title = {{Design of fine guidance system (FGS) for ARIEL mission}},
+volume = {11176},
+booktitle = {Photonics Applications in Astronomy, Communications, Industry, and High-Energy Physics Experiments 2019},
+editor = {Ryszard S. Romaniuk and Maciej Linczuk},
+organization = {International Society for Optics and Photonics},
+publisher = {SPIE},
+pages = {1007 -- 1013},
+keywords = {: satellite guiding systems, space precision photometry, exoplanets},
+year = {2019},
+doi = {10.1117/12.2536800},
+URL = {https://doi.org/10.1117/12.2536800}
+}
+
+
+@article{herschel_pacs,
+author = {Belbachir, Ahmed and Bischof, Horst and Roland, Ottensamer and Kerschbaum, Franz and Reimers, Christian},
+year = {2005},
+month = {08},
+pages = {},
+title = {On-board Data Processing to Lower Bandwidth Requirements on an Infrared Astronomy Satellite: Case of Herschel-PACS Camera},
+volume = {2005},
+journal = {EURASIP Journal on Advances in Signal Processing},
+doi = {10.1155/ASP.2005.2585}
+}
+
+@ARTICLE{Anderson,
+       author = {{Anderson}, Jay and {King}, Ivan R.},
+        title = "{Toward High-Precision Astrometry with WFPC2. I. Deriving an Accurate Point-Spread Function}",
+      journal = {PASP},
+     keywords = {Astrometry, Methods: Data Analysis, Techniques: Image Processing, Techniques: Photometric, Astrophysics},
+         year = 2000,
+        month = oct,
+       volume = {112},
+       number = {776},
+        pages = {1360-1382},
+          doi = {10.1086/316632},
+archivePrefix = {arXiv},
+       eprint = {astro-ph/0006325},
+ primaryClass = {astro-ph},
+       adsurl = {https://ui.adsabs.harvard.edu/abs/2000PASP..112.1360A},
+      adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
diff --git a/doc/shared/fonts/MyriadPro-SemiCondensed-bold-italic.otf b/doc/shared/fonts/MyriadPro-SemiCondensed-bold-italic.otf
new file mode 100644
index 0000000000000000000000000000000000000000..b61bd8d018393a529c54af5e2300853ff92301f1
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-SemiCondensed-bold-italic.otf differ
diff --git a/doc/shared/fonts/MyriadPro-SemiCondensed-bold.otf b/doc/shared/fonts/MyriadPro-SemiCondensed-bold.otf
new file mode 100644
index 0000000000000000000000000000000000000000..873793250080483d1eee82e309f92e00c7c185e8
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-SemiCondensed-bold.otf differ
diff --git a/doc/shared/fonts/MyriadPro-SemiCondensed-italic.otf b/doc/shared/fonts/MyriadPro-SemiCondensed-italic.otf
new file mode 100644
index 0000000000000000000000000000000000000000..af10b8943636dd0eabf7fba37955728713d81636
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-SemiCondensed-italic.otf differ
diff --git a/doc/shared/fonts/MyriadPro-SemiCondensed-light.otf b/doc/shared/fonts/MyriadPro-SemiCondensed-light.otf
new file mode 100644
index 0000000000000000000000000000000000000000..56e85155435e987a506120e321abb54481c596b6
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-SemiCondensed-light.otf differ
diff --git a/doc/shared/fonts/MyriadPro-SemiCondensed-regular.otf b/doc/shared/fonts/MyriadPro-SemiCondensed-regular.otf
new file mode 100644
index 0000000000000000000000000000000000000000..f5179751c2ad565caeaee3b64671440f59831af3
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-SemiCondensed-regular.otf differ
diff --git a/doc/shared/fonts/MyriadPro-SemiCondensed-semibold.otf b/doc/shared/fonts/MyriadPro-SemiCondensed-semibold.otf
new file mode 100644
index 0000000000000000000000000000000000000000..64152039f0652add1f3f5af6263c6b856340216a
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-SemiCondensed-semibold.otf differ
diff --git a/doc/shared/fonts/MyriadPro-bold-italic.otf b/doc/shared/fonts/MyriadPro-bold-italic.otf
new file mode 100644
index 0000000000000000000000000000000000000000..79d2aab35f501e58a0fd2be75d90e207dc3383cd
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-bold-italic.otf differ
diff --git a/doc/shared/fonts/MyriadPro-bold.otf b/doc/shared/fonts/MyriadPro-bold.otf
new file mode 100644
index 0000000000000000000000000000000000000000..a4c78b0b3d3c46f5411fb4a2dc7a3f3a7ce4c45d
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-bold.otf differ
diff --git a/doc/shared/fonts/MyriadPro-italic.otf b/doc/shared/fonts/MyriadPro-italic.otf
new file mode 100644
index 0000000000000000000000000000000000000000..700c9de5e61a3823cc5c9560d706b2526a8fb58f
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-italic.otf differ
diff --git a/doc/shared/fonts/MyriadPro-light-italic.otf b/doc/shared/fonts/MyriadPro-light-italic.otf
new file mode 100644
index 0000000000000000000000000000000000000000..afa672ee30fab2f3fa2e8660ddd1a8b5f7ddd64e
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-light-italic.otf differ
diff --git a/doc/shared/fonts/MyriadPro-light.otf b/doc/shared/fonts/MyriadPro-light.otf
new file mode 100644
index 0000000000000000000000000000000000000000..629b7cfb90f2b263c04fae3c4e4c600bb0383bf1
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-light.otf differ
diff --git a/doc/shared/fonts/MyriadPro-regular.otf b/doc/shared/fonts/MyriadPro-regular.otf
new file mode 100644
index 0000000000000000000000000000000000000000..57a953b54a4b34cdd4150d068fd987476f2ed37e
Binary files /dev/null and b/doc/shared/fonts/MyriadPro-regular.otf differ
diff --git a/doc/shared/glossary.tex b/doc/shared/glossary.tex
new file mode 100755
index 0000000000000000000000000000000000000000..4e944371634a507f6cd7970672708f4d012c4bc7
--- /dev/null
+++ b/doc/shared/glossary.tex
@@ -0,0 +1,347 @@
+\usepackage[xindy, nopostdot, numberedsection, style=super, section, toc, acronyms, nogroupskip]{glossaries}
+\usepackage{xparse}
+
+\setlength{\glsdescwidth}{0.8\textwidth}
+\renewcommand{\glsnamefont}[1]{\textbf{#1}}
+
+% label, acronym, name, description
+\DeclareDocumentCommand{\newdualentry}{ m m m m } {
+	\newglossaryentry{gls-#1}{
+	name={#3 (\gls{#1})},
+	description={#4}, nonumberlist
+	}
+	\newglossaryentry{#1}{
+		type=\acronymtype,
+		name={#2},
+		first={#3 (#2)},
+		firstplural={#3s (#2s)},
+		see={[Glossary:]{\gls{gls-#1}}},
+		description=\glslink{gls-#1}{#3},
+		nonumberlist
+	}%
+}
+%%% \gls{ABBREV} to point at Acronym/Abbreviation index
+%%% \gls{gls-ABBREV} to point to glossary
+
+\makeglossaries
+\newdualentry{ADC}%
+  {ADC}%
+  {Analog to Digital Converter}%
+  {An Analog to Digital Converter is a system that converts an analog signal
+   into a quantized digital signal. Its counterpart is the \gls{DAC}.}%
+
+\newdualentry{API}%
+  {API}%
+  {Application Programming Interface}%
+  {The Application Programming Interface defines how a developer can write
+   a program that requests services from an operating system or application.
+   \glspl{API} are implemented by function calls composed of verbs and nouns,
+   i.e. a function to execute on an object.}%
+
+\newdualentry{BSP}%
+  {BSP}%
+  {Board Support Package}%
+  {A Board Support Package is the implementation of a specific interface defined
+   by the abstract layer of an operating system that enables the latter to run
+   on the particular hardware platform.}%
+
+\newdualentry{CPU}%
+  {CPU}%
+  {Central Processing Unit}%
+  {The Central Processing Unit is the electronic circuitry that interprets
+  instructions of a computer program and performs control logic, arithmetic,
+  and input/output operations specified by the instructions. It maintains
+  high-level control of peripheral components, such as memory and other devices.}%
+
+\newdualentry{DAC}%
+  {DAC}%
+  {Digital to Analog Converter}%
+  {A Digital to Analog Converter is a system that converts a quantized digital
+   signal into an analog signal. Its counterpart is the \gls{ADC}.}%
+
+\newdualentry{DMA}%
+  {DMA}%
+  {Direct Memory Access}%
+  {Direct Memory Access is a feature of a computer system that allows hardware
+   subsystems to access main system \gls{gls-RAM} directly, thereby bypassing
+   the \gls{gls-CPU}.}%
+
+\newacronym{DRD}{DRD}{Document Requirements Definition}
+
+\newdualentry{DSP}%
+  {DSP}%
+  {Digital Signal Processor}%
+  {A Digital Signal Processor is a specialised processor with its architecture %
+   targeting the operational needs of digital signal processing.}%
+
+\newglossaryentry{Doxygen}{
+  name={Doxygen},
+  description={Doxygen is a documentation generator for writing software %
+   	       reference documentation.},
+  nonumberlist
+  }
+
+\newdualentry{ELF}%
+  {ELF}%
+  {Executable and Linkable Format}%
+  {The Executable and Linkable Format is a common standard file format for
+   executables, object code, shared libraries, and core dumps.}%
+
+\newacronym{FDIR}{FDIR}{Fault Detection, Isolation and Recovery}
+
+\newdualentry{FIFO}%
+  {FIFO}%
+  {First In - First Out}%
+  {In FIFO processing, the "head" element of a queue is processed first.
+   Once complete, the element is removed and the next element in line becomes
+   the new queue head.}%
+
+\newdualentry{FPU}%
+  {FPU}%
+  {Floating Point Unit}%
+  {A co-processor unit that specialises in floating-point calculations.}%
+
+\newdualentry{ILP}%
+  {ILP}%
+  {Instruction Level Parallelism}%
+  {Instruction-level parallelism (ILP) is a measure of how many instructions in
+   a computer program can be executed simultaneously by the \gls{CPU}.}%
+
+\newdualentry{ISR}%
+  {ISR}%
+  {Interrupt Service Routine}%
+  {An Interrupt Service Routine is a function that handles the actions needed
+   to service an interrupt.}%
+
+\newacronym{FSW}{FSW}{Flight Software}
+
+\newdualentry{GCC}%
+  {GCC}%
+  {GNU Compiler Collection}%
+  {The GNU Compiler Collection is a compiler system produced by the
+   GNU project. It is part of the GNU toolchain collection of programming
+   tools.}%
+
+\newglossaryentry{GNU}{
+  name={GNU},
+  description={GNU is a recursive acronym that stands for "GNU's Not Unix!".
+	      The GNU project is a free software collaboration project announced
+	      in 1987. Users are free to run GNU-licensed software, share, copy,
+	      distribute, study and modify it. GNU software guarantees these
+	      freedom-rights legally via its license and is thefore free
+      	      software.},
+  nonumberlist
+}
+
+\newglossaryentry{LEON2}{
+  name={LEON2},
+  description={The LEON2 is a synthesisable VHDL model of a 32-bit processor
+	       compliant with the SPARC V8 architecture. It is highly
+	       configurable and particularly suitable for \gls{SoC} designs.
+	       Its source code is available under the GNU LGPL license},
+  nonumberlist
+  }
+
+\newglossaryentry{LEON3}{
+  name={LEON3},
+  description={The LEON3 is an updated version of the \gls{LEON2}, changes
+	       include \gls{gls-SMP} support and a deeper instruction pipeline},
+  nonumberlist
+  }
+
+\newglossaryentry{LEON3-FT}{
+  name={LEON3-FT},
+  description={The LEON3-FT is a fault-tolerant version of the \gls{LEON3}.
+  	       Changes to the base version include autonomous error handling,
+       	       cache locking and different cache replacement strategies.},
+  nonumberlist
+  }
+
+\newdualentry{MMU}%
+  {MMU}%
+  {Memory Management Unit}%
+  {A Memory Management Unit performs address space translation between physical
+   and virtual memory pages and protects unprivileged access to certain memory
+   regions.}%
+
+\newdualentry{MPPB}%
+  {MPPB}%
+  {Massively Parallel Processor Breadboarding system}%
+  {The Massively Parallel Processor Breadboarding system is a proof-of-concept %
+   design for a space-hardened, fault-tolerant multi-DSP system with various %
+   subsystems to build a powerful digital signal processing system with a high %
+   data throughput. Its distinguishing features are the \gls{gls-NoC} and the
+   \gls{Xentium} \glspl{DSP} controlled by a \gls{LEON2} processor.
+   It was developed under ESA contract 21986 by Recore Systems B.V.}%
+
+\newacronym{NCR}{NCR}{Non-Conformance Reports}
+
+\newdualentry{NGAPP}%
+  {NGAPP}%
+  {Next Generation Astronomy Processing Platform}%
+  {Next Generation Astronomy Processing Platform was an evaluation of the
+   \gls{MPPB} performed in a joint effort of RUAG Space Austria and the
+   Department of Astrophysics of the University of Vienna.
+   The project was funded under ESA contract 40000107815/13/NL/EL/f.}%
+
+\newdualentry{NoC}%
+  {NoC}%
+  {Network On Chip}%
+  {A Network On Chip is a communication system on an integrated circuit that
+   applies (packet based) networking to on-chip communication. It offers
+   improvements over more conventional bus interconnects and is more scalable
+   and power efficient in complex \gls{gls-SoC} desgins.}%
+
+\newacronym{NRB}{NRB}{Nonconformance Review Board}
+
+\newacronym{PA}{PA}{Product Assurance}
+
+\newacronym{PAM}{PAM}{Product Assurance Manager}
+
+\newdualentry{POSIX}
+  {POSIX}
+  {Portable Operating System Interface}
+  {The Portable Operating System Interface is a family of standards specified
+   by the IEEE Computer Society for maintaining compatibility between
+   operating systems.}%
+
+\newdualentry{PUS}
+  {PUS}
+  {Packet Utilisation Standard}
+  {The Packet Utilisation Standard addresses the end-to-end transport of telemetry
+   and telecommand data between user applications on the ground and applications
+   onboard a satellite. See also ECSS-E-70-41A.}%
+
+\newdualentry{RAM}%
+  {RAM}%
+  {Random-Access Memory}%
+  {Random-Access Memory is a type of memory where each memory cell may be
+   accessed directly via their memory addresses.}%
+
+\newacronym{RID}{RID}{Review Item Discrepancy}
+
+\newdualentry{RISC}%
+  {RISC}%
+  {Reduced Instruction Set Computing}%
+  {RISC is a \gls{CPU} design strategy that intends to improve performance by
+   combining a simplified instruction set with a microprocessor architecture
+   that is capable of executing an instruction in a smaller number of clock
+   cycles.}%
+
+\newdualentry{RMAP}%
+  {RMAP}%
+  {Remote Memory Access Protocol}%
+  {The Remote Memory Access Protocol is a form of \gls{SpaceWire} communication
+   that transparently communicates writes to memory mapped regions between
+   different hardware devices.}%
+
+
+\newdualentry{RR}%
+  {RR}%
+  {Round Robin}%
+  {Round Robin is a scheduling algorithm where time slices are assigned in equal
+   poritions and in circular order. In the context of threads, priorities are
+   usually only used to control re-scheduling order when a mutex is accessed by
+   a thread.}%
+
+\newacronym{RSA}{RSA}{RUAG Space Austria}
+
+\newacronym{SCF}{SCF}{Software Configuration File}
+
+\newacronym{SDD}{SDD}{Software Design Document}
+
+\newacronym{SDP}{SDP}{Software Development Plan}
+
+\newdualentry{SMP}%
+  {SMP}%
+  {Symmetric Multiprocessing}%
+  {Symmetric Multiprocessing denotes computer architectures, where two or more
+   identical processors are connected to the same periphery and are controlled
+   by the same operating system instance.}%
+
+\newacronym{SPAMR}{SPAMR}{Software Product Assurance Milestone Report}
+
+\newacronym{SPR}{SPR}{Software Problems Reports}
+
+\newacronym{SSS}{SSS}{System Software Specification}
+
+\newacronym{SRD}{SRD}{Software Release Document}
+
+\newacronym{SRS}{SRS}{Software Requirement Specification}
+
+\newdualentry{SoC}%
+  {SoC}%
+  {System On Chip}%
+  {A System On Chip is an integrated circuit that combines all components of a %
+   computer or other electronic system into a single chip.}%
+
+\newglossaryentry{SpaceWire}{
+  name={SpaceWire},
+  description={SpaceWire is a spacecraft communication network based in part
+               on the IEEE 1355 standard of communications.},
+  nonumberlist
+  }
+
+\newglossaryentry{SPARC}{
+  name={SPARC},
+  description={SPARC ("scalable processor architecture") is a \gls{gls-RISC}
+  	       instruction set architecture developed by Sun Microsystems in
+	       the 1980s. The distinct feature of SPARC processors is the high
+	       number of \gls{gls-CPU} registers that are accessed similarly to
+	       stack variables via ``sliding windows''.},
+  nonumberlist
+  }
+
+
+\newacronym{SQ}{SQ}{Software Quality}
+
+\newacronym{SQAM}{SQAM}{Software Quality Assurance Manager}
+
+\newdualentry{SSDP} % label
+  {SSDP}            % abbreviation
+  {Scalable Sensor Data Processor}  % long form
+  {The Scalable Sensor Data Processor (SSDP) is a next generation on-board %
+   data processing mixed-signal ASIC, envisaged to be used in future scientific %
+   payloads requiring high-performance on-board processing capabilities. %
+   It is built opon a heterogeneous multicore architecture, combining two %
+   \gls{Xentium} \gls{DSP} cores with a general-purpose \gls{LEON3-FT} control %
+   processor in a \gls{gls-NoC}.} % description
+
+\newacronym{SQA}{SQA}{Software Quality Assurance}
+
+\newdualentry{TCM}%
+  {TCM}%
+  {Tightly-Coupled Memory}%
+  {Tightly-Coupled Memory is the local data memory that is directly accessible %
+   by a Xentium's load/store unit. It can be viewed as a completely %
+   program-controlled data cache.}%
+
+
+\newacronym{TP}{TP}{Test Plan}
+\newacronym{TS}{TS}{Test Specification}
+
+\newacronym{UVIE}{UVIE}{University of Vienna}
+
+\newdualentry{VLIW}%
+  {VLIW}%
+  {Very Long Instruction Word}%
+  {Very Long Instruction Word is a processor architecture design concept that
+   exploits \gls{gls-ILP}. This approach allows higher performance at a smaller
+   silicone footprint compared to serialised instruction processors, as no
+   instruction re-ordering logic to exploit superscalar capabilities of the
+   processor must be integrated on the chip, but requires either code to be
+   tuned manually or a very sophisticated compiler to exploit the full potential
+   of the processor.}%
+
+\newglossaryentry{Xentium}{
+  name={Xentium},
+  description={The Xentium is a high performance \gls{gls-VLIW} \gls{DSP} core.
+               It operates 10 parallel execution slots supporting 32/40 bit
+	       scalar and two 16-bit element vector operations.},
+  nonumberlist
+  }
+
+
+% do not remove
+\glsresetall
+\makeglossaries
diff --git a/doc/shared/glossary_egse.tex b/doc/shared/glossary_egse.tex
new file mode 100755
index 0000000000000000000000000000000000000000..9d0f8af670a530c5619c97a404e0fe767c5c93cc
--- /dev/null
+++ b/doc/shared/glossary_egse.tex
@@ -0,0 +1,291 @@
+\usepackage[xindy, nopostdot, numberedsection, style=super, section, toc, acronyms, nogroupskip]{glossaries}
+\usepackage{xparse}
+
+\setlength{\glsdescwidth}{0.8\textwidth}
+\renewcommand{\glsnamefont}[1]{\textbf{#1}}
+
+% label, acronym, name, description
+\DeclareDocumentCommand{\newdualentry}{ m m m m } {
+	\newglossaryentry{gls-#1}{
+	name={#3 (\gls{#1})},
+	description={#4}, nonumberlist
+	}
+	\newglossaryentry{#1}{
+		type=\acronymtype,
+		name={#2},
+		first={#3 (#2)},
+		firstplural={#3s (#2s)},
+		see={[Glossary:]{\gls{gls-#1}}},
+		description=\glslink{gls-#1}{#3},
+		nonumberlist
+	}%
+}
+%%% \gls{ABBREV} to point at Acronym/Abbreviation index
+%%% \gls{gls-ABBREV} to point to glossary
+
+\makeglossaries
+\newacronym{FGS}{FGS}{Fine Guidance Sensor}%
+
+\newacronym{ARIEL}{ARIEL}{Atmospheric Remote-sensing Exoplanet Large-survey}
+  
+\newacronym{AIRS}{AIRS}{ARIEL Infrared Spectrometer}
+
+
+
+\newacronym{NIRSpec}{NIRSpec}{Near Infrared Spectrometer}
+
+\newacronym{VISPhot}{VISPhot}{Visible Photometer}
+
+% see also: https://www.cosmos.esa.int/web/athena/acronyms
+
+\newacronym{ATHENA}{ATHENA}{Advanced Telescope for High-Energy Astrophysics}
+
+\newacronym{WFI}{WFI}{Wide-Field Imager}
+
+\newacronym{CPM}{CPM}{Central Processing Module}
+
+\newacronym{DE}{DE}{Detector Electronics}
+
+\newacronym{RMAP}{RMAP}{Remote Memory Access Protocol}
+
+\newglossaryentry{Doxygen}{
+  name={Doxygen},
+  description={Doxygen is a documentation generator for writing software %
+   	       reference documentation.},
+  nonumberlist
+  }
+
+%### A ###
+\newacronym{ADC}{ADC}{Analog/Digital Converter}
+
+\newacronym{AIB}{AIB}{Analog Interface Board}
+
+\newacronym{AIT/V}{AIT/V}{Assembly, Integration and Testing / Verification}
+
+\newacronym{AIV}{AIV}{Assembly, Integration and Verification}
+
+\newacronym{API}{API}{Application Programming Interface}
+
+\newacronym{AOCS}{AOCS}{Attitude and Orientation Control System}
+
+%### C ###
+\newacronym{CAS}{CAS}{Chinese Academy of Sciences}
+
+\newacronym{CCD}{CCD}{Charge-Coupled Device}
+
+\newacronym{CDR}{CDR}{Critical Design Review}
+
+\newacronym{CEE}{CEE}{Centroid Estimation Error}
+
+\newacronym{CIDL}{CIDL}{Configurable Items Data List}
+
+\newacronym{CoG}{CoG}{Center of Gravity}
+
+\newacronym{CFEE}{CFEE}{Cold Front End Electronics}
+
+\newacronym{CPU}{CPU}{Central Processing Unit}%
+
+\newacronym{CR}{CR}{Cramer-Rao}
+
+%### D ###
+\newacronym{DPU}{DPU}{Data Processing Unit}
+
+\newacronym{DCU}{DCU}{Detector Control Unit}
+
+%### E ###
+\newacronym{ECSS}{ECSS}{European Coordination for Space Standardization}
+
+\newacronym{EDAC}{EDAC}{Error Detection and Correction}
+
+\newacronym{EGSE}{EGSE}{Electronic Ground Support Equipment}
+
+\newacronym{EM}{EM}{Engineering Model}
+
+\newacronym{EQM}{EQM}{Engineering Qualification Model}
+
+%### F ###
+\newacronym{FCE}{FCE}{FGS Control Electronics}
+
+\newacronym{FCE SW}{FCE SW}{FCE Software} 
+
+\newacronym{FDIR}{FDIR}{Fault Detection, Isolation and Recovery}
+
+\newacronym{FEE}{FEE}{Front-End Electronics}
+
+\newacronym{FPM}{FPM}{Focal Plane Module}
+
+\newacronym{FPA}{FPA}{Focal Plane Assembly}
+
+\newacronym{FPGA}{FPGA}{Field-programmable Gate Array}
+
+\newacronym{FSW}{FSW}{Flight Software}
+
+\newacronym{FOV}{FOV}{Field of View}
+
+%### G ###
+\newacronym{GS}{GS}{Ground Segment}
+
+\newacronym{GSW}{GSW}{Ground (Segment) Software}
+
+%### H ###
+
+\newacronym{HK}{HK}{Housekeeping}
+
+%### I ###
+\newacronym{IASW}{IASW}{Instrument Application Software}
+
+\newacronym{ICD}{ICD}{Interface Control Document}
+
+\newacronym{ICU}{ICU}{Instrument Control Unit}
+
+\newacronym{IFSW}{IFSW}{Instrument Flight Software}
+
+\newacronym{ISR}{ISR}{Interrupt Service Routine}%
+
+\newacronym{IWC}{IWC}{Intensity Weighted Centroiding}
+
+\newacronym{IWCoG}{IWCoG}{Iterative Weighted Center of Gravity}
+
+\newacronym{IWF}{IWF}{Institut für Weltraumforschung (Space Research Institute), Graz}
+
+%### L ###
+\newacronym{LoS}{LoS}{Line of Sight}%
+
+%### M ###
+\newacronym{MMU}{MMU}{Memory Management Unit}%
+
+\newacronym{MTL}{MTL}{Mission TimeLine}
+ 
+%### O ###
+\newacronym{OBC}{OBC}{On-Board Computer}
+
+\newacronym{OBMP}{OBMP}{On-Board Macro Procedures}
+
+\newacronym{OS}{OS}{Operating System}
+
+%### P ###
+\newacronym{PA}{PA}{Product Assurance}
+
+\newacronym{PAM}{PAM}{Product Assurance Manager}
+
+\newacronym{PDR}{PDR}{Preliminary Design Review}
+
+\newacronym{PES}{PES}{Pointing Error Sources}
+
+\newacronym{PEC}{PEC}{Pointing Error Contributor}
+
+\newacronym{PI}{PI}{Principal Investigator}
+
+\newacronym{PLM}{PLM}{Payload Module}
+
+\newacronym{PLMCU}{PLMCU}{PayLoad Management \& Control Unit}
+
+\newacronym{PSF}{PSF}{Point Spread Function}
+
+\newacronym{PSU}{PSU}{Power Supply Unit}
+
+\newacronym{PDU}{PDU}{Power Distribution Unit}
+
+\newacronym{PTR}{PTR}{Post Test Review}
+
+\newacronym{PUS}{PUS}{Packet Utilisation Standard}
+
+%### Q ###
+\newacronym{QA}{QA}{Quality Assurance}
+
+\newacronym{QAR}{QAR}{Qualification and Acceptance Review}
+
+%### R ###
+\newacronym{RISC}{RISC}{Reduced Instruction Set Computing}%
+  
+\newacronym{ROI}{ROI}{Region of Interest}
+
+\newacronym{RPE}{RPE}{Relative Performance Error}
+
+\newacronym{RTU}{RTU}{Remote Terminal Unit}
+%### S ###
+\newacronym{SCA}{SCA}{Sensor Chip Assembly}
+
+\newacronym{SCF}{SCF}{Software Configuration File}
+
+\newacronym{SDD}{SDD}{Software Design Document}
+
+\newacronym{SDP}{SDP}{Software Development Plan}
+
+\newacronym{SDU}{SDU}{Service Data Unit}
+
+\newacronym{SDE}{SDE}{Service Data Entity}
+
+\newacronym{SPAMR}{SPAMR}{Software Product Assurance Milestone Report}
+
+\newglossaryentry{SPARC}{
+  name={SPARC},
+  description={SPARC ("scalable processor architecture") is a \gls{RISC}
+           instruction set architecture developed by Sun Microsystems in
+         the 1980s. The distinct feature of SPARC processors is the high
+         number of \gls{CPU} registers that are accessed similarly to
+         stack variables via ``sliding windows''.},
+  nonumberlist
+  }
+
+\newacronym{SPR}{SPR}{Software Problems Reports}
+
+\newacronym{SSS}{SSS}{System Software Specification}
+
+\newacronym{SRD}{SRD}{Software Release Document}
+
+\newacronym{SRR}{SRR}{System Requirements Review}
+
+\newacronym{SRS}{SRS}{Software Requirement Specification}
+
+\newacronym{SpW}{SpW}{SpaceWire}
+
+\newglossaryentry{SpaceWire}{
+  name={SpaceWire},
+  description={SpaceWire is a spacecraft communication network based in part
+               on the IEEE 1355 standard of communications.},
+  nonumberlist
+  }
+
+\newacronym{SQ}{SQ}{Software Quality}
+
+\newacronym{SQAM}{SQAM}{Software Quality Assurance Manager}
+
+\newacronym{SQA}{SQA}{Software Quality Assurance}
+
+%### T ###
+\newacronym{TP}{TP}{Test Plan}
+
+\newacronym{TRR}{TRR}{Test Readiness Review}
+
+\newacronym{TS}{TS}{Test Specification}
+
+%### U ###
+\newacronym{UVIE}{UVIE}{University of Vienna}
+
+\newacronym{WCoG}{WCoG}{Weighted Center of Gravity}
+
+\newacronym{WFEE}{WFEE}{Warm Front End Electronics}
+
+\newacronym{WFE}{WFE}{Wavefront Error}
+
+\newacronym{AKE}{AKE}{Absolute Knowledge Error}
+
+\newacronym{APE}{APE}{Absolute Performance Error}
+
+\newacronym{MKE}{MKE}{Mean Knowledge Error}
+
+\newacronym{MPE}{MPE}{Mean Performance Error}
+
+\newacronym{RKE}{RKE}{Relative Knowledge Error}
+
+\newacronym{KDE}{KDE}{Knowledge Drift Error}
+
+\newacronym{PDE}{PDE}{Performance Drift Error}
+
+\newacronym{KRE}{KRE}{Knowledge Reproducibility Error}
+
+\newacronym{PRE}{PRE}{Performance Reproducibility Error}
+% do not remove
+\glsresetall
+\makeglossaries
diff --git a/doc/shared/images/ccs_logo_2.png b/doc/shared/images/ccs_logo_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ce2b1527ea71697b4df116ac4272c1f5427c398
Binary files /dev/null and b/doc/shared/images/ccs_logo_2.png differ
diff --git a/doc/shared/images/config_editor.png b/doc/shared/images/config_editor.png
new file mode 100644
index 0000000000000000000000000000000000000000..23158a06348c38fcb3e95629d5fa4a7a93f082bd
Binary files /dev/null and b/doc/shared/images/config_editor.png differ
diff --git a/doc/shared/images/datapool.png b/doc/shared/images/datapool.png
new file mode 100644
index 0000000000000000000000000000000000000000..79e964793b858d665414e81bf13faf760fceedab
Binary files /dev/null and b/doc/shared/images/datapool.png differ
diff --git a/doc/shared/images/editor.png b/doc/shared/images/editor.png
new file mode 100644
index 0000000000000000000000000000000000000000..b62fd4de1eee9c8162e100d3ebf6f67b5c91df92
Binary files /dev/null and b/doc/shared/images/editor.png differ
diff --git a/doc/shared/images/editor_appdrawer.png b/doc/shared/images/editor_appdrawer.png
new file mode 100644
index 0000000000000000000000000000000000000000..043019e8980d187feda2f816ab8078e8d5d90697
Binary files /dev/null and b/doc/shared/images/editor_appdrawer.png differ
diff --git a/doc/shared/images/editor_log.png b/doc/shared/images/editor_log.png
new file mode 100644
index 0000000000000000000000000000000000000000..42bcfd52bb92684cffed053b668f79c81c4add04
Binary files /dev/null and b/doc/shared/images/editor_log.png differ
diff --git a/doc/shared/images/pmgr.png b/doc/shared/images/pmgr.png
new file mode 100644
index 0000000000000000000000000000000000000000..604b5b4cead2d8f7e85f629b908898ad775f154b
Binary files /dev/null and b/doc/shared/images/pmgr.png differ
diff --git a/doc/shared/images/pvdec.png b/doc/shared/images/pvdec.png
new file mode 100644
index 0000000000000000000000000000000000000000..44fe26873220c77d859df3f15650ef4893e4f9eb
Binary files /dev/null and b/doc/shared/images/pvdec.png differ
diff --git a/doc/shared/images/pvraw.png b/doc/shared/images/pvraw.png
new file mode 100644
index 0000000000000000000000000000000000000000..d28c55d142abd0e2828b4aa823f6be1e29615984
Binary files /dev/null and b/doc/shared/images/pvraw.png differ
diff --git a/doc/shared/images/tctab.png b/doc/shared/images/tctab.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed8695913cb7c65264c5332c14aba5c002e73334
Binary files /dev/null and b/doc/shared/images/tctab.png differ
diff --git a/doc/shared/images/tmtab.png b/doc/shared/images/tmtab.png
new file mode 100644
index 0000000000000000000000000000000000000000..737d87557c49e32f10767d85527040a93f280d75
Binary files /dev/null and b/doc/shared/images/tmtab.png differ
diff --git a/doc/shared/images/tst.png b/doc/shared/images/tst.png
new file mode 100644
index 0000000000000000000000000000000000000000..3443eccdcb65c27798e8b766e3114a13577c54cd
Binary files /dev/null and b/doc/shared/images/tst.png differ
diff --git a/doc/shared/images/tst_snips.png b/doc/shared/images/tst_snips.png
new file mode 100644
index 0000000000000000000000000000000000000000..21595959abfd04e2b970ae24b60d62100bf94aaa
Binary files /dev/null and b/doc/shared/images/tst_snips.png differ
diff --git a/doc/shared/images/uni_logo_astrophysik_cmyk.eps b/doc/shared/images/uni_logo_astrophysik_cmyk.eps
new file mode 100644
index 0000000000000000000000000000000000000000..2304ecc7eeccc47f3da7d97c54f119e48619ca99
--- /dev/null
+++ b/doc/shared/images/uni_logo_astrophysik_cmyk.eps
@@ -0,0 +1,7890 @@
+%!PS-Adobe-3.1 EPSF-3.0
+%ADO_DSC_Encoding: MacOS Roman
+%%Title: Uni-Astrophysik-Logo-CMYK.eps
+%%Creator: Adobe Illustrator(R) 14.0
+%%For: Grafik 1
+%%CreationDate: 27.05.13
+%%BoundingBox: 0 0 295 105
+%%HiResBoundingBox: 0 0 294.3677 104.6392
+%%CropBox: 0 0 294.3677 104.6392
+%%LanguageLevel: 2
+%%DocumentData: Clean7Bit
+%ADOBeginClientInjection: DocumentHeader "AI11EPS"
+%%AI8_CreatorVersion: 14.0.0
%AI9_PrintingDataBegin
%ADO_BuildNumber: Adobe Illustrator(R) 14.0.0 x367 R agm 4.4890 ct 5.1541
%ADO_ContainsXMP: MainFirst
+%ADOEndClientInjection: DocumentHeader "AI11EPS"
+%%Pages: 1
+%%DocumentNeededResources: 
+%%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0
+%%+ procset Adobe_CoolType_Utility_T42 1.0 0
+%%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0
+%%+ procset Adobe_CoolType_Core 2.31 0
+%%+ procset Adobe_AGM_Core 2.0 0
+%%+ procset Adobe_AGM_Utils 1.0 0
+%%DocumentFonts: 
+%%DocumentNeededFonts: 
+%%DocumentNeededFeatures: 
+%%DocumentSuppliedFeatures: 
+%%DocumentProcessColors:  Cyan Magenta Black
+%%DocumentCustomColors: 
+%%CMYKCustomColor: 
+%%RGBCustomColor: 
+%%EndComments
+                                                                                                                                                                                                                                     
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+%%BeginDefaults
+%%ViewingOrientation: 1 0 0 1
+%%EndDefaults
+%%BeginProlog
+%%BeginResource: procset Adobe_AGM_Utils 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved.
+systemdict/setpacking known
+{currentpacking	true setpacking}if
+userdict/Adobe_AGM_Utils 75 dict dup begin put
+/bdf
+{bind def}bind def
+/nd{null def}bdf
+/xdf
+{exch def}bdf
+/ldf 
+{load def}bdf
+/ddf
+{put}bdf	
+/xddf
+{3 -1 roll put}bdf	
+/xpt
+{exch put}bdf
+/ndf
+{
+	exch dup where{
+		pop pop pop
+	}{
+		xdf
+	}ifelse
+}def
+/cdndf
+{
+	exch dup currentdict exch known{
+		pop pop
+	}{
+		exch def
+	}ifelse
+}def
+/gx
+{get exec}bdf
+/ps_level
+	/languagelevel where{
+		pop systemdict/languagelevel gx
+	}{
+		1
+	}ifelse
+def
+/level2 
+	ps_level 2 ge
+def
+/level3 
+	ps_level 3 ge
+def
+/ps_version
+	{version cvr}stopped{-1}if
+def
+/set_gvm
+{currentglobal exch setglobal}bdf
+/reset_gvm
+{setglobal}bdf
+/makereadonlyarray
+{
+	/packedarray where{pop packedarray
+	}{
+		array astore readonly}ifelse
+}bdf
+/map_reserved_ink_name
+{
+	dup type/stringtype eq{
+		dup/Red eq{
+			pop(_Red_)
+		}{
+			dup/Green eq{
+				pop(_Green_)
+			}{
+				dup/Blue eq{
+					pop(_Blue_)
+				}{
+					dup()cvn eq{
+						pop(Process)
+					}if
+				}ifelse
+			}ifelse
+		}ifelse
+	}if
+}bdf
+/AGMUTIL_GSTATE 22 dict def
+/get_gstate
+{
+	AGMUTIL_GSTATE begin
+	/AGMUTIL_GSTATE_clr_spc currentcolorspace def
+	/AGMUTIL_GSTATE_clr_indx 0 def
+	/AGMUTIL_GSTATE_clr_comps 12 array def
+	mark currentcolor counttomark
+		{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put
+		/AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop
+	/AGMUTIL_GSTATE_fnt rootfont def
+	/AGMUTIL_GSTATE_lw currentlinewidth def
+	/AGMUTIL_GSTATE_lc currentlinecap def
+	/AGMUTIL_GSTATE_lj currentlinejoin def
+	/AGMUTIL_GSTATE_ml currentmiterlimit def
+	currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf
+	/AGMUTIL_GSTATE_sa currentstrokeadjust def
+	/AGMUTIL_GSTATE_clr_rnd currentcolorrendering def
+	/AGMUTIL_GSTATE_op currentoverprint def
+	/AGMUTIL_GSTATE_bg currentblackgeneration cvlit def
+	/AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def
+	currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf
+		cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf
+	/AGMUTIL_GSTATE_ht currenthalftone def
+	/AGMUTIL_GSTATE_flt currentflat def
+	end
+}def
+/set_gstate
+{
+	AGMUTIL_GSTATE begin
+	AGMUTIL_GSTATE_clr_spc setcolorspace
+	AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get
+	/AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor
+	AGMUTIL_GSTATE_fnt setfont
+	AGMUTIL_GSTATE_lw setlinewidth
+	AGMUTIL_GSTATE_lc setlinecap
+	AGMUTIL_GSTATE_lj setlinejoin
+	AGMUTIL_GSTATE_ml setmiterlimit
+	AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash
+	AGMUTIL_GSTATE_sa setstrokeadjust
+	AGMUTIL_GSTATE_clr_rnd setcolorrendering
+	AGMUTIL_GSTATE_op setoverprint
+	AGMUTIL_GSTATE_bg cvx setblackgeneration
+	AGMUTIL_GSTATE_ucr cvx setundercolorremoval
+	AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx
+		AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer
+	AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or
+		{
+		currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne
+			{
+			 mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark
+			}if
+		}{
+		AGMUTIL_GSTATE_ht sethalftone
+		}ifelse
+	AGMUTIL_GSTATE_flt setflat
+	end
+}def
+/get_gstate_and_matrix
+{
+	AGMUTIL_GSTATE begin
+	/AGMUTIL_GSTATE_ctm matrix currentmatrix def
+	end
+	get_gstate
+}def
+/set_gstate_and_matrix
+{
+	set_gstate
+	AGMUTIL_GSTATE begin
+	AGMUTIL_GSTATE_ctm setmatrix
+	end
+}def
+/AGMUTIL_str256 256 string def
+/AGMUTIL_src256 256 string def
+/AGMUTIL_dst64 64 string def
+/AGMUTIL_srcLen nd
+/AGMUTIL_ndx nd
+/AGMUTIL_cpd nd
+/capture_cpd{
+	//Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf
+}def
+/thold_halftone
+{
+	level3
+		{sethalftone currenthalftone}
+		{
+			dup/HalftoneType get 3 eq
+			{
+				sethalftone currenthalftone
+			}{
+				begin
+				Width Height mul{
+					Thresholds read{pop}if
+				}repeat
+				end
+				currenthalftone
+			}ifelse
+		}ifelse
+}def 
+/rdcmntline
+{
+	currentfile AGMUTIL_str256 readline pop
+	(%)anchorsearch{pop}if
+}bdf
+/filter_cmyk
+{	
+	dup type/filetype ne{
+		exch()/SubFileDecode filter
+	}{
+		exch pop
+	}
+	ifelse
+	[
+	exch
+	{
+		AGMUTIL_src256 readstring pop
+		dup length/AGMUTIL_srcLen exch def
+		/AGMUTIL_ndx 0 def
+		AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{
+			1 index exch get
+			AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put
+			/AGMUTIL_ndx AGMUTIL_ndx 1 add def
+		}for
+		pop
+		AGMUTIL_dst64 0 AGMUTIL_ndx getinterval
+	}
+	bind
+	/exec cvx
+	]cvx
+}bdf
+/filter_indexed_devn
+{
+	cvi Names length mul names_index add Lookup exch get
+}bdf
+/filter_devn
+{	
+	4 dict begin
+	/srcStr xdf
+	/dstStr xdf
+	dup type/filetype ne{
+		0()/SubFileDecode filter
+	}if
+	[
+	exch
+		[
+			/devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx
+			currentdict/srcStr get/readstring cvx/pop cvx
+			/dup cvx/length cvx 0/gt cvx[
+				Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx
+				names_index Names length currentdict/srcStr get length 1 sub{
+					1/index cvx/exch cvx/get cvx
+					currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx
+					Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx
+				}for
+				currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx
+			]cvx/if cvx
+			/end cvx
+		]cvx
+		bind
+		/exec cvx
+	]cvx
+	end
+}bdf
+/AGMUTIL_imagefile nd
+/read_image_file
+{
+	AGMUTIL_imagefile 0 setfileposition
+	10 dict begin
+	/imageDict xdf
+	/imbufLen Width BitsPerComponent mul 7 add 8 idiv def
+	/imbufIdx 0 def
+	/origDataSource imageDict/DataSource get def
+	/origMultipleDataSources imageDict/MultipleDataSources get def
+	/origDecode imageDict/Decode get def
+	/dstDataStr imageDict/Width get colorSpaceElemCnt mul string def
+	imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+	{
+		/imbufCnt imageDict/DataSource get length def
+		/imbufs imbufCnt array def
+		0 1 imbufCnt 1 sub{
+			/imbufIdx xdf
+			imbufs imbufIdx imbufLen string put
+			imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put
+		}for
+		DeviceN_PS2{
+			imageDict begin
+		 	/DataSource[DataSource/devn_sep_datasource cvx]cvx def
+			/MultipleDataSources false def
+			/Decode[0 1]def
+			end
+		}if
+	}{
+		/imbuf imbufLen string def
+		Indexed_DeviceN level3 not and DeviceN_NoneName or{
+			/srcDataStrs[imageDict begin
+				currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse
+				{
+					Width Decode length 2 div mul cvi string
+				}repeat
+				end]def		
+			imageDict begin
+		 	/DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def
+			/Decode[0 1]def
+			end
+		}{
+			imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put
+			imageDict/Decode[0 1]put
+		}ifelse
+	}ifelse
+	imageDict exch
+	load exec
+	imageDict/DataSource origDataSource put
+	imageDict/MultipleDataSources origMultipleDataSources put
+	imageDict/Decode origDecode put	
+	end
+}bdf
+/write_image_file
+{
+	begin
+	{(AGMUTIL_imagefile)(w+)file}stopped{
+		false
+	}{
+		Adobe_AGM_Utils/AGMUTIL_imagefile xddf 
+		2 dict begin
+		/imbufLen Width BitsPerComponent mul 7 add 8 idiv def
+		MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{
+			/imbuf imbufLen string def
+		}if
+		1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{
+			pop
+			MultipleDataSources{
+			 	0 1 DataSource length 1 sub{
+					DataSource type dup
+					/arraytype eq{
+						pop DataSource exch gx
+					}{
+						/filetype eq{
+							DataSource exch get imbuf readstring pop
+						}{
+							DataSource exch get
+						}ifelse
+					}ifelse
+					AGMUTIL_imagefile exch writestring
+				}for
+			}{
+				DataSource type dup
+				/arraytype eq{
+					pop DataSource exec
+				}{
+					/filetype eq{
+						DataSource imbuf readstring pop
+					}{
+						DataSource
+					}ifelse
+				}ifelse
+				AGMUTIL_imagefile exch writestring
+			}ifelse
+		}for
+		end
+		true
+	}ifelse
+	end
+}bdf
+/close_image_file
+{
+	AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile
+}def
+statusdict/product known userdict/AGMP_current_show known not and{
+	/pstr statusdict/product get def
+	pstr(HP LaserJet 2200)eq 	
+	pstr(HP LaserJet 4000 Series)eq or
+	pstr(HP LaserJet 4050 Series )eq or
+	pstr(HP LaserJet 8000 Series)eq or
+	pstr(HP LaserJet 8100 Series)eq or
+	pstr(HP LaserJet 8150 Series)eq or
+	pstr(HP LaserJet 5000 Series)eq or
+	pstr(HP LaserJet 5100 Series)eq or
+	pstr(HP Color LaserJet 4500)eq or
+	pstr(HP Color LaserJet 4600)eq or
+	pstr(HP LaserJet 5Si)eq or
+	pstr(HP LaserJet 1200 Series)eq or
+	pstr(HP LaserJet 1300 Series)eq or
+	pstr(HP LaserJet 4100 Series)eq or 
+	{
+ 		userdict/AGMP_current_show/show load put
+		userdict/show{
+		 currentcolorspace 0 get
+		 /Pattern eq
+		 {false charpath f}
+		 {AGMP_current_show}ifelse
+		}put
+	}if
+	currentdict/pstr undef
+}if
+/consumeimagedata
+{
+	begin
+	AGMIMG_init_common
+	currentdict/MultipleDataSources known not
+		{/MultipleDataSources false def}if
+	MultipleDataSources
+		{
+		DataSource 0 get type
+		dup/filetype eq
+			{
+			1 dict begin
+			/flushbuffer Width cvi string def
+			1 1 Height cvi
+				{
+				pop
+				0 1 DataSource length 1 sub
+					{
+					DataSource exch get
+					flushbuffer readstring pop pop
+					}for
+				}for
+			end
+			}if
+		dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and
+			{
+			Width Height mul cvi
+				{
+				0 1 DataSource length 1 sub
+					{dup DataSource exch gx length exch 0 ne{pop}if}for
+				dup 0 eq
+					{pop exit}if
+				sub dup 0 le
+					{exit}if
+				}loop
+			pop
+			}if		
+		}
+		{
+		/DataSource load type 
+		dup/filetype eq
+			{
+			1 dict begin
+			/flushbuffer Width Decode length 2 idiv mul cvi string def
+			1 1 Height{pop DataSource flushbuffer readstring pop pop}for
+			end
+			}if
+		dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and
+			{
+				Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul
+					{
+					DataSource length dup 0 eq
+						{pop exit}if
+					sub dup 0 le
+						{exit}if
+					}loop
+				pop
+			}if
+		}ifelse
+	end
+}bdf
+/addprocs
+{
+	 2{/exec load}repeat
+	 3 1 roll
+	 [5 1 roll]bind cvx
+}def
+/modify_halftone_xfer
+{
+	currenthalftone dup length dict copy begin
+	 currentdict 2 index known{
+	 	1 index load dup length dict copy begin
+		currentdict/TransferFunction known{
+			/TransferFunction load
+		}{
+			currenttransfer
+		}ifelse
+		 addprocs/TransferFunction xdf 
+		 currentdict end def
+		currentdict end sethalftone
+	}{
+		currentdict/TransferFunction known{
+			/TransferFunction load 
+		}{
+			currenttransfer
+		}ifelse
+		addprocs/TransferFunction xdf
+		currentdict end sethalftone		
+		pop
+	}ifelse
+}def
+/clonearray
+{
+	dup xcheck exch
+	dup length array exch
+	Adobe_AGM_Core/AGMCORE_tmp -1 ddf 
+	{
+	Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf 
+	dup type/dicttype eq
+		{
+			Adobe_AGM_Core/AGMCORE_tmp get
+			exch
+			clonedict
+			Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf 
+		}if
+	dup type/arraytype eq
+		{
+			Adobe_AGM_Core/AGMCORE_tmp get exch
+			clonearray
+			Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf 
+		}if
+	exch dup
+	Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put
+	}forall
+	exch{cvx}if
+}bdf
+/clonedict
+{
+	dup length dict
+	begin
+	{
+		dup type/dicttype eq
+			{clonedict}if
+		dup type/arraytype eq
+			{clonearray}if
+		def
+	}forall
+	currentdict
+	end
+}bdf
+/DeviceN_PS2
+{
+	/currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and
+}bdf
+/Indexed_DeviceN
+{
+	/indexed_colorspace_dict AGMCORE_gget dup null ne{
+		dup/CSDBase known{
+			/CSDBase get/CSD get_res/Names known 
+		}{
+			pop false
+		}ifelse
+	}{
+		pop false
+	}ifelse
+}bdf
+/DeviceN_NoneName
+{	
+	/Names where{
+		pop
+		false Names
+		{
+			(None)eq or
+		}forall
+	}{
+		false
+	}ifelse
+}bdf
+/DeviceN_PS2_inRip_seps
+{
+	/AGMCORE_in_rip_sep where
+	{
+		pop dup type dup/arraytype eq exch/packedarraytype eq or
+		{
+			dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and
+			{
+				/currentcolorspace exch AGMCORE_gput
+				false
+			}{
+				true
+			}ifelse
+		}{
+			true
+		}ifelse
+	}{
+		true
+	}ifelse
+}bdf
+/base_colorspace_type
+{
+	dup type/arraytype eq{0 get}if
+}bdf
+/currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse
+{
+	/pdfmark_5{cleartomark}bind def
+}{
+	/pdfmark_5{pdfmark}bind def
+}ifelse
+/ReadBypdfmark_5
+{
+	currentfile exch 0 exch/SubFileDecode filter
+	/currentdistillerparams where 
+	{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse
+	{flushfile cleartomark}
+	{/PUT pdfmark}ifelse 	
+}bdf
+/ReadBypdfmark_5_string
+{
+	2 dict begin
+	/makerString exch def string/tmpString exch def
+	{
+		currentfile tmpString readline not{pop exit}if
+		makerString anchorsearch
+		{
+			pop pop cleartomark exit
+		}{
+			3 copy/PUT pdfmark_5 pop 2 copy(\n)/PUT pdfmark_5
+		}ifelse
+	}loop
+	end
+}bdf
+/xpdfm
+{
+	{
+		dup 0 get/Label eq
+		{
+			aload length[exch 1 add 1 roll/PAGELABEL
+		}{
+			aload pop
+			[{ThisPage}<<5 -2 roll>>/PUT
+		}ifelse
+		pdfmark_5
+	}forall
+}bdf
+/lmt{
+	dup 2 index le{exch}if pop dup 2 index ge{exch}if pop
+}bdf
+/int{
+	dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul exch pop add exch pop
+}bdf
+/ds{
+	Adobe_AGM_Utils begin
+}bdf
+/dt{
+	currentdict Adobe_AGM_Utils eq{
+		end
+	}if
+}bdf
+systemdict/setpacking known
+{setpacking}if
+%%EndResource
+%%BeginResource: procset Adobe_AGM_Core 2.0 0
+%%Version: 2.0 0
+%%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved.
+systemdict/setpacking known
+{
+	currentpacking
+	true setpacking
+}if
+userdict/Adobe_AGM_Core 209 dict dup begin put
+/Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def
+/AGMCORE_str256 256 string def
+/AGMCORE_save nd
+/AGMCORE_graphicsave nd
+/AGMCORE_c 0 def
+/AGMCORE_m 0 def
+/AGMCORE_y 0 def
+/AGMCORE_k 0 def
+/AGMCORE_cmykbuf 4 array def
+/AGMCORE_screen[currentscreen]cvx def
+/AGMCORE_tmp 0 def
+/AGMCORE_&setgray nd
+/AGMCORE_&setcolor nd
+/AGMCORE_&setcolorspace nd
+/AGMCORE_&setcmykcolor nd
+/AGMCORE_cyan_plate nd
+/AGMCORE_magenta_plate nd
+/AGMCORE_yellow_plate nd
+/AGMCORE_black_plate nd
+/AGMCORE_plate_ndx nd
+/AGMCORE_get_ink_data nd
+/AGMCORE_is_cmyk_sep nd
+/AGMCORE_host_sep nd
+/AGMCORE_avoid_L2_sep_space nd
+/AGMCORE_distilling nd
+/AGMCORE_composite_job nd
+/AGMCORE_producing_seps nd
+/AGMCORE_ps_level -1 def
+/AGMCORE_ps_version -1 def
+/AGMCORE_environ_ok nd
+/AGMCORE_CSD_cache 0 dict def
+/AGMCORE_currentoverprint false def
+/AGMCORE_deltaX nd
+/AGMCORE_deltaY nd
+/AGMCORE_name nd
+/AGMCORE_sep_special nd
+/AGMCORE_err_strings 4 dict def
+/AGMCORE_cur_err nd
+/AGMCORE_current_spot_alias false def
+/AGMCORE_inverting false def
+/AGMCORE_feature_dictCount nd
+/AGMCORE_feature_opCount nd
+/AGMCORE_feature_ctm nd
+/AGMCORE_ConvertToProcess false def
+/AGMCORE_Default_CTM matrix def
+/AGMCORE_Default_PageSize nd
+/AGMCORE_Default_flatness nd
+/AGMCORE_currentbg nd
+/AGMCORE_currentucr nd
+/AGMCORE_pattern_paint_type 0 def
+/knockout_unitsq nd
+currentglobal true setglobal
+[/CSA/Gradient/Procedure]
+{
+	/Generic/Category findresource dup length dict copy/Category defineresource pop
+}forall
+setglobal
+/AGMCORE_key_known
+{
+	where{
+		/Adobe_AGM_Core_Id known
+	}{
+		false
+	}ifelse
+}ndf
+/flushinput
+{
+	save
+	2 dict begin
+	/CompareBuffer 3 -1 roll def
+	/readbuffer 256 string def
+	mark
+	{
+	currentfile readbuffer{readline}stopped
+		{cleartomark mark}
+		{
+		not
+			{pop exit}
+		if
+		CompareBuffer eq
+			{exit}
+		if
+		}ifelse
+	}loop
+	cleartomark
+	end
+	restore
+}bdf
+/getspotfunction
+{
+	AGMCORE_screen exch pop exch pop
+	dup type/dicttype eq{
+		dup/HalftoneType get 1 eq{
+			/SpotFunction get
+		}{
+			dup/HalftoneType get 2 eq{
+				/GraySpotFunction get
+			}{
+				pop
+				{
+					abs exch abs 2 copy add 1 gt{
+						1 sub dup mul exch 1 sub dup mul add 1 sub
+					}{
+						dup mul exch dup mul add 1 exch sub
+					}ifelse
+				}bind
+			}ifelse
+		}ifelse
+	}if
+}def
+/np
+{newpath}bdf
+/clp_npth
+{clip np}def
+/eoclp_npth
+{eoclip np}def
+/npth_clp
+{np clip}def
+/graphic_setup
+{
+	/AGMCORE_graphicsave save store
+	concat
+	0 setgray
+	0 setlinecap
+	0 setlinejoin
+	1 setlinewidth
+	[]0 setdash
+	10 setmiterlimit
+	np
+	false setoverprint
+	false setstrokeadjust
+	//Adobe_AGM_Core/spot_alias gx
+	/Adobe_AGM_Image where{
+		pop
+		Adobe_AGM_Image/spot_alias 2 copy known{
+			gx
+		}{
+			pop pop
+		}ifelse
+	}if
+	/sep_colorspace_dict null AGMCORE_gput
+	100 dict begin
+	/dictstackcount countdictstack def
+	/showpage{}def
+	mark
+}def
+/graphic_cleanup
+{
+	cleartomark
+	dictstackcount 1 countdictstack 1 sub{end}for
+	end
+	AGMCORE_graphicsave restore
+}def
+/compose_error_msg
+{
+	grestoreall initgraphics	
+	/Helvetica findfont 10 scalefont setfont
+	/AGMCORE_deltaY 100 def
+	/AGMCORE_deltaX 310 def
+	clippath pathbbox np pop pop 36 add exch 36 add exch moveto
+	0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto
+	0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath
+	0 AGMCORE_&setgray
+	gsave 1 AGMCORE_&setgray fill grestore 
+	1 setlinewidth gsave stroke grestore
+	currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto
+	/AGMCORE_deltaY 12 def
+	/AGMCORE_tmp 0 def
+	AGMCORE_err_strings exch get
+		{
+		dup 32 eq
+			{
+			pop
+			AGMCORE_str256 0 AGMCORE_tmp getinterval
+			stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt
+				{
+				currentpoint AGMCORE_deltaY sub exch pop
+				clippath pathbbox pop pop pop 44 add exch moveto
+				}if
+			AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show
+			0 1 AGMCORE_str256 length 1 sub
+				{
+				AGMCORE_str256 exch 0 put
+				}for
+			/AGMCORE_tmp 0 def
+			}{
+				AGMCORE_str256 exch AGMCORE_tmp xpt
+				/AGMCORE_tmp AGMCORE_tmp 1 add def
+			}ifelse
+		}forall
+}bdf
+/AGMCORE_CMYKDeviceNColorspaces[
+	[/Separation/None/DeviceCMYK{0 0 0}]
+	[/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind]
+	[/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind]
+	[/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind]
+	[/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind]
+	[/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind]
+	[/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind]
+	[/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind]
+	[/Separation(Cyan)/DeviceCMYK{0 0 0}]
+	[/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind]
+	[/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind]
+	[/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind]
+	[/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}]
+	[/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind]
+	[/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}]
+	[/DeviceCMYK]
+]def
+/ds{
+	Adobe_AGM_Core begin
+	/currentdistillerparams where
+		{
+		pop currentdistillerparams/CoreDistVersion get 5000 lt
+			{<</DetectBlends false>>setdistillerparams}if
+		}if	
+	/AGMCORE_ps_version xdf
+	/AGMCORE_ps_level xdf
+	errordict/AGM_handleerror known not{
+		errordict/AGM_handleerror errordict/handleerror get put
+		errordict/handleerror{
+			Adobe_AGM_Core begin
+			$error/newerror get AGMCORE_cur_err null ne and{
+				$error/newerror false put
+				AGMCORE_cur_err compose_error_msg
+			}if
+			$error/newerror true put
+			end
+			errordict/AGM_handleerror get exec
+			}bind put
+		}if
+	/AGMCORE_environ_ok 
+		ps_level AGMCORE_ps_level ge
+		ps_version AGMCORE_ps_version ge and 
+		AGMCORE_ps_level -1 eq or
+	def
+	AGMCORE_environ_ok not
+		{/AGMCORE_cur_err/AGMCORE_bad_environ def}if
+	/AGMCORE_&setgray systemdict/setgray get def
+	level2{
+		/AGMCORE_&setcolor systemdict/setcolor get def
+		/AGMCORE_&setcolorspace systemdict/setcolorspace get def
+	}if
+	/AGMCORE_currentbg currentblackgeneration def
+	/AGMCORE_currentucr currentundercolorremoval def
+	/AGMCORE_Default_flatness currentflat def
+	/AGMCORE_distilling
+		/product where{
+			pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and
+		}{
+			false
+		}ifelse
+	def
+	/AGMCORE_GSTATE AGMCORE_key_known not{
+		/AGMCORE_GSTATE 21 dict def
+		/AGMCORE_tmpmatrix matrix def
+		/AGMCORE_gstack 32 array def
+		/AGMCORE_gstackptr 0 def
+		/AGMCORE_gstacksaveptr 0 def
+		/AGMCORE_gstackframekeys 14 def
+		/AGMCORE_&gsave/gsave ldf
+		/AGMCORE_&grestore/grestore ldf
+		/AGMCORE_&grestoreall/grestoreall ldf
+		/AGMCORE_&save/save ldf
+		/AGMCORE_&setoverprint/setoverprint ldf
+		/AGMCORE_gdictcopy{
+			begin
+			{def}forall
+			end
+		}def
+		/AGMCORE_gput{
+			AGMCORE_gstack AGMCORE_gstackptr get
+			3 1 roll
+			put
+		}def
+		/AGMCORE_gget{
+			AGMCORE_gstack AGMCORE_gstackptr get
+			exch
+			get
+		}def
+		/gsave{
+			AGMCORE_&gsave
+			AGMCORE_gstack AGMCORE_gstackptr get
+			AGMCORE_gstackptr 1 add
+			dup 32 ge{limitcheck}if
+			/AGMCORE_gstackptr exch store
+			AGMCORE_gstack AGMCORE_gstackptr get
+			AGMCORE_gdictcopy
+		}def
+		/grestore{
+			AGMCORE_&grestore
+			AGMCORE_gstackptr 1 sub
+			dup AGMCORE_gstacksaveptr lt{1 add}if
+			dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known
+				{/AGMCORE_currentoverprint get setoverprint}{pop}ifelse
+			/AGMCORE_gstackptr exch store
+		}def
+		/grestoreall{
+			AGMCORE_&grestoreall
+			/AGMCORE_gstackptr AGMCORE_gstacksaveptr store 
+		}def
+		/save{
+			AGMCORE_&save
+			AGMCORE_gstack AGMCORE_gstackptr get
+			AGMCORE_gstackptr 1 add
+			dup 32 ge{limitcheck}if
+			/AGMCORE_gstackptr exch store
+			/AGMCORE_gstacksaveptr AGMCORE_gstackptr store
+			AGMCORE_gstack AGMCORE_gstackptr get
+			AGMCORE_gdictcopy
+		}def
+		/setoverprint{
+			dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint
+		}def	
+		0 1 AGMCORE_gstack length 1 sub{
+				AGMCORE_gstack exch AGMCORE_gstackframekeys dict put
+		}for
+	}if
+	level3/AGMCORE_&sysshfill AGMCORE_key_known not and
+	{
+		/AGMCORE_&sysshfill systemdict/shfill get def
+		/AGMCORE_&sysmakepattern systemdict/makepattern get def
+		/AGMCORE_&usrmakepattern/makepattern load def
+	}if
+	/currentcmykcolor[0 0 0 0]AGMCORE_gput
+	/currentstrokeadjust false AGMCORE_gput
+	/currentcolorspace[/DeviceGray]AGMCORE_gput
+	/sep_tint 0 AGMCORE_gput
+	/devicen_tints[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]AGMCORE_gput
+	/sep_colorspace_dict null AGMCORE_gput
+	/devicen_colorspace_dict null AGMCORE_gput
+	/indexed_colorspace_dict null AGMCORE_gput
+	/currentcolor_intent()AGMCORE_gput
+	/customcolor_tint 1 AGMCORE_gput
+	/absolute_colorimetric_crd null AGMCORE_gput
+	/relative_colorimetric_crd null AGMCORE_gput
+	/saturation_crd null AGMCORE_gput
+	/perceptual_crd null AGMCORE_gput
+	currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf
+		 cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf
+	<<
+	/MaxPatternItem currentsystemparams/MaxPatternCache get
+	>>
+	setuserparams
+	end
+}def
+/ps
+{
+	/setcmykcolor where{
+		pop
+		Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put
+	}if
+	Adobe_AGM_Core begin
+	/setcmykcolor
+	{
+		4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput
+		1 sub 4 1 roll
+		3{
+			3 index add neg dup 0 lt{
+				pop 0
+			}if
+			3 1 roll
+		}repeat
+		setrgbcolor pop
+	}ndf
+	/currentcmykcolor
+	{
+		/currentcmykcolor AGMCORE_gget aload pop
+	}ndf
+	/setoverprint
+	{pop}ndf
+	/currentoverprint
+	{false}ndf
+	/AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def
+	/AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def
+	/AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def
+	/AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def
+	/AGMCORE_plate_ndx 
+		AGMCORE_cyan_plate{
+			0
+		}{
+			AGMCORE_magenta_plate{
+				1
+			}{
+				AGMCORE_yellow_plate{
+					2
+				}{
+					AGMCORE_black_plate{
+						3
+					}{
+						4
+					}ifelse
+				}ifelse
+			}ifelse
+		}ifelse
+		def
+	/AGMCORE_have_reported_unsupported_color_space false def
+	/AGMCORE_report_unsupported_color_space
+	{
+		AGMCORE_have_reported_unsupported_color_space false eq
+		{
+			(Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)==
+			Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf
+		}if
+	}def
+	/AGMCORE_composite_job
+		AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def
+	/AGMCORE_in_rip_sep
+		/AGMCORE_in_rip_sep where{
+			pop AGMCORE_in_rip_sep
+		}{
+			AGMCORE_distilling 
+			{
+				false
+			}{
+				userdict/Adobe_AGM_OnHost_Seps known{
+					false
+				}{
+					level2{
+						currentpagedevice/Separations 2 copy known{
+							get
+						}{
+							pop pop false
+						}ifelse
+					}{
+						false
+					}ifelse
+				}ifelse
+			}ifelse
+		}ifelse
+	def
+	/AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def
+	/AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def
+	/AGM_preserve_spots 
+		/AGM_preserve_spots where{
+			pop AGM_preserve_spots
+		}{
+			AGMCORE_distilling AGMCORE_producing_seps or
+		}ifelse
+	def
+	/AGM_is_distiller_preserving_spotimages
+	{
+		currentdistillerparams/PreserveOverprintSettings known
+		{
+			currentdistillerparams/PreserveOverprintSettings get
+				{
+					currentdistillerparams/ColorConversionStrategy known
+					{
+						currentdistillerparams/ColorConversionStrategy get
+						/sRGB ne
+					}{
+						true
+					}ifelse
+				}{
+					false
+				}ifelse
+		}{
+			false
+		}ifelse
+	}def
+	/convert_spot_to_process where{pop}{
+		/convert_spot_to_process
+		{
+			//Adobe_AGM_Core begin
+			dup map_alias{
+				/Name get exch pop
+			}if
+			dup dup(None)eq exch(All)eq or
+				{
+				pop false
+				}{
+				AGMCORE_host_sep
+				{
+					gsave
+					1 0 0 0 setcmykcolor currentgray 1 exch sub
+					0 1 0 0 setcmykcolor currentgray 1 exch sub
+					0 0 1 0 setcmykcolor currentgray 1 exch sub
+					0 0 0 1 setcmykcolor currentgray 1 exch sub
+					add add add 0 eq
+					{
+						pop false
+					}{
+						false setoverprint
+						current_spot_alias false set_spot_alias
+						1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor
+						set_spot_alias
+						currentgray 1 ne
+					}ifelse
+					grestore
+				}{
+					AGMCORE_distilling
+					{
+						pop AGM_is_distiller_preserving_spotimages not
+					}{
+						//Adobe_AGM_Core/AGMCORE_name xddf
+						false
+						//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq
+						AGMUTIL_cpd/OverrideSeparations known and
+						{
+							AGMUTIL_cpd/OverrideSeparations get
+							{
+								/HqnSpots/ProcSet resourcestatus
+								{
+									pop pop pop true
+								}if
+							}if
+						}if					
+						{
+							AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not
+						}{
+							gsave
+							[/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace
+							false
+							AGMUTIL_cpd/SeparationColorNames 2 copy known
+							{
+								get
+								{AGMCORE_name eq or}forall
+								not
+							}{
+								pop pop pop true
+							}ifelse
+							grestore
+						}ifelse
+					}ifelse
+				}ifelse
+			}ifelse
+			end
+		}def
+	}ifelse
+	/convert_to_process where{pop}{
+		/convert_to_process
+		{
+			dup length 0 eq
+				{
+				pop false
+				}{
+				AGMCORE_host_sep
+				{
+				dup true exch
+					{
+					dup(Cyan)eq exch
+					dup(Magenta)eq 3 -1 roll or exch
+					dup(Yellow)eq 3 -1 roll or exch
+					dup(Black)eq 3 -1 roll or
+						{pop}
+						{convert_spot_to_process and}ifelse
+					}
+				forall
+					{
+					true exch
+						{
+						dup(Cyan)eq exch
+						dup(Magenta)eq 3 -1 roll or exch
+						dup(Yellow)eq 3 -1 roll or exch
+						(Black)eq or and
+						}forall
+						not
+					}{pop false}ifelse
+				}{
+				false exch
+					{
+					/PhotoshopDuotoneList where{pop false}{true}ifelse
+						{
+						dup(Cyan)eq exch
+						dup(Magenta)eq 3 -1 roll or exch
+						dup(Yellow)eq 3 -1 roll or exch
+						dup(Black)eq 3 -1 roll or
+						{pop}
+						{convert_spot_to_process or}ifelse
+						}
+						{
+						convert_spot_to_process or
+						}
+					ifelse
+					}
+				forall
+				}ifelse
+			}ifelse
+		}def
+	}ifelse	
+	/AGMCORE_avoid_L2_sep_space 
+		version cvr 2012 lt 
+		level2 and 
+		AGMCORE_producing_seps not and
+	def
+	/AGMCORE_is_cmyk_sep
+		AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or
+	def
+	/AGM_avoid_0_cmyk where{
+		pop AGM_avoid_0_cmyk
+	}{
+		AGM_preserve_spots 
+		userdict/Adobe_AGM_OnHost_Seps known 
+		userdict/Adobe_AGM_InRip_Seps known or
+		not and
+	}ifelse
+	{
+		/setcmykcolor[
+			{
+				4 copy add add add 0 eq currentoverprint and{
+					pop 0.0005
+				}if
+			}/exec cvx
+			/AGMCORE_&setcmykcolor load dup type/operatortype ne{
+				/exec cvx
+			}if
+		]cvx def
+	}if
+	/AGMCORE_IsSeparationAProcessColor
+		{
+		dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or
+		}def
+	AGMCORE_host_sep{
+		/setcolortransfer
+		{
+			AGMCORE_cyan_plate{
+				pop pop pop
+			}{
+			 	AGMCORE_magenta_plate{
+			 		4 3 roll pop pop pop
+			 	}{
+			 		AGMCORE_yellow_plate{
+			 			4 2 roll pop pop pop
+			 		}{
+			 			4 1 roll pop pop pop
+			 		}ifelse
+			 	}ifelse
+			}ifelse
+			settransfer 
+		}	
+		def
+		/AGMCORE_get_ink_data
+			AGMCORE_cyan_plate{
+				{pop pop pop}
+			}{
+			 	AGMCORE_magenta_plate{
+			 		{4 3 roll pop pop pop}
+			 	}{
+			 		AGMCORE_yellow_plate{
+			 			{4 2 roll pop pop pop}
+			 		}{
+			 			{4 1 roll pop pop pop}
+			 		}ifelse
+			 	}ifelse
+			}ifelse
+		def
+		/AGMCORE_RemoveProcessColorNames
+			{
+			1 dict begin
+			/filtername
+				{
+				dup/Cyan eq 1 index(Cyan)eq or
+					{pop(_cyan_)}if
+				dup/Magenta eq 1 index(Magenta)eq or
+					{pop(_magenta_)}if
+				dup/Yellow eq 1 index(Yellow)eq or
+					{pop(_yellow_)}if
+				dup/Black eq 1 index(Black)eq or
+					{pop(_black_)}if
+				}def
+			dup type/arraytype eq
+				{[exch{filtername}forall]}
+				{filtername}ifelse
+			end
+			}def
+		level3{
+			/AGMCORE_IsCurrentColor
+				{
+				dup AGMCORE_IsSeparationAProcessColor
+					{
+					AGMCORE_plate_ndx 0 eq
+						{dup(Cyan)eq exch/Cyan eq or}if
+					AGMCORE_plate_ndx 1 eq
+						{dup(Magenta)eq exch/Magenta eq or}if
+					AGMCORE_plate_ndx 2 eq
+						{dup(Yellow)eq exch/Yellow eq or}if
+					AGMCORE_plate_ndx 3 eq
+						{dup(Black)eq exch/Black eq or}if
+					AGMCORE_plate_ndx 4 eq
+						{pop false}if
+					}{
+					gsave
+					false setoverprint
+					current_spot_alias false set_spot_alias
+					1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor
+					set_spot_alias
+					currentgray 1 ne
+					grestore
+					}ifelse
+				}def
+			/AGMCORE_filter_functiondatasource
+				{	
+				5 dict begin
+				/data_in xdf
+				data_in type/stringtype eq
+					{
+					/ncomp xdf
+					/comp xdf
+					/string_out data_in length ncomp idiv string def
+					0 ncomp data_in length 1 sub
+						{
+						string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put
+						}for
+					string_out
+					}{
+					string/string_in xdf
+					/string_out 1 string def
+					/component xdf
+					[
+					data_in string_in/readstring cvx
+						[component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx
+						[/pop cvx()]cvx/ifelse cvx
+					]cvx/ReusableStreamDecode filter
+				}ifelse
+				end
+				}def
+			/AGMCORE_separateShadingFunction
+				{
+				2 dict begin
+				/paint? xdf
+				/channel xdf
+				dup type/dicttype eq
+					{
+					begin
+					FunctionType 0 eq
+						{
+						/DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def
+						currentdict/Decode known
+							{/Decode Decode channel 2 mul 2 getinterval def}if
+						paint? not
+							{/Decode[1 1]def}if
+						}if
+					FunctionType 2 eq
+						{
+						paint?
+							{
+							/C0[C0 channel get 1 exch sub]def
+							/C1[C1 channel get 1 exch sub]def
+							}{
+							/C0[1]def
+							/C1[1]def
+							}ifelse			
+						}if
+					FunctionType 3 eq
+						{
+						/Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def			
+						}if
+					currentdict/Range known
+						{/Range[0 1]def}if
+					currentdict
+					end}{
+					channel get 0 paint? AGMCORE_separateShadingFunction
+					}ifelse
+				end
+				}def
+			/AGMCORE_separateShading
+				{
+				3 -1 roll begin
+				currentdict/Function known
+					{
+					currentdict/Background known
+						{[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if
+					Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf
+					/ColorSpace[/DeviceGray]def
+					}{
+					ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq
+						{
+						/ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def
+						}{
+						ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put
+						}ifelse
+					ColorSpace 0 get/Separation eq
+						{
+							{
+								[1/exch cvx/sub cvx]cvx
+							}{
+								[/pop cvx 1]cvx
+							}ifelse
+							ColorSpace 3 3 -1 roll put
+							pop
+						}{
+							{
+								[exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx
+							}{
+								pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx
+							}ifelse
+							ColorSpace 3 3 -1 roll bind put
+						}ifelse
+					ColorSpace 2/DeviceGray put																		
+					}ifelse
+				end
+				}def
+			/AGMCORE_separateShadingDict
+				{
+				dup/ColorSpace get
+				dup type/arraytype ne
+					{[exch]}if
+				dup 0 get/DeviceCMYK eq
+					{
+					exch begin 
+					currentdict
+					AGMCORE_cyan_plate
+						{0 true}if
+					AGMCORE_magenta_plate
+						{1 true}if
+					AGMCORE_yellow_plate
+						{2 true}if
+					AGMCORE_black_plate
+						{3 true}if
+					AGMCORE_plate_ndx 4 eq
+						{0 false}if		
+					dup not currentoverprint and
+						{/AGMCORE_ignoreshade true def}if
+					AGMCORE_separateShading
+					currentdict
+					end exch
+					}if
+				dup 0 get/Separation eq
+					{
+					exch begin
+					ColorSpace 1 get dup/None ne exch/All ne and
+						{
+						ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and
+							{
+							ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq 
+								{
+								/ColorSpace
+									[
+									/Separation
+									ColorSpace 1 get
+									/DeviceGray
+										[
+										ColorSpace 3 get/exec cvx
+										4 AGMCORE_plate_ndx sub -1/roll cvx
+										4 1/roll cvx
+										3[/pop cvx]cvx/repeat cvx
+										1/exch cvx/sub cvx
+										]cvx									
+									]def
+								}{
+								AGMCORE_report_unsupported_color_space
+								AGMCORE_black_plate not
+									{
+									currentdict 0 false AGMCORE_separateShading
+									}if
+								}ifelse
+							}{
+							currentdict ColorSpace 1 get AGMCORE_IsCurrentColor
+							0 exch 
+							dup not currentoverprint and
+								{/AGMCORE_ignoreshade true def}if
+							AGMCORE_separateShading
+							}ifelse	
+						}if			
+					currentdict
+					end exch
+					}if
+				dup 0 get/DeviceN eq
+					{
+					exch begin
+					ColorSpace 1 get convert_to_process
+						{
+						ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq 
+							{
+							/ColorSpace
+								[
+								/DeviceN
+								ColorSpace 1 get
+								/DeviceGray
+									[
+									ColorSpace 3 get/exec cvx
+									4 AGMCORE_plate_ndx sub -1/roll cvx
+									4 1/roll cvx
+									3[/pop cvx]cvx/repeat cvx
+									1/exch cvx/sub cvx
+									]cvx									
+								]def
+							}{
+							AGMCORE_report_unsupported_color_space
+							AGMCORE_black_plate not
+								{
+								currentdict 0 false AGMCORE_separateShading
+								/ColorSpace[/DeviceGray]def
+								}if
+							}ifelse
+						}{
+						currentdict
+						false -1 ColorSpace 1 get
+							{
+							AGMCORE_IsCurrentColor
+								{
+								1 add
+								exch pop true exch exit
+								}if
+							1 add
+							}forall
+						exch 
+						dup not currentoverprint and
+							{/AGMCORE_ignoreshade true def}if
+						AGMCORE_separateShading
+						}ifelse
+					currentdict
+					end exch
+					}if
+				dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not
+					{
+					exch begin
+					ColorSpace dup type/arraytype eq
+						{0 get}if
+					/DeviceGray ne
+						{
+						AGMCORE_report_unsupported_color_space
+						AGMCORE_black_plate not
+							{
+							ColorSpace 0 get/CIEBasedA eq
+								{
+								/ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def
+								}if
+							ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or
+								{
+								/ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def
+								}if
+							ColorSpace 0 get/CIEBasedDEFG eq
+								{
+								/ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def
+								}if
+							currentdict 0 false AGMCORE_separateShading
+							}if
+						}if
+					currentdict
+					end exch
+					}if
+				pop
+				dup/AGMCORE_ignoreshade known
+					{
+					begin
+					/ColorSpace[/Separation(None)/DeviceGray{}]def
+					currentdict end
+					}if
+				}def
+			/shfill
+				{
+				AGMCORE_separateShadingDict 
+				dup/AGMCORE_ignoreshade known
+					{pop}
+					{AGMCORE_&sysshfill}ifelse
+				}def
+			/makepattern
+				{
+				exch
+				dup/PatternType get 2 eq
+					{
+					clonedict
+					begin
+					/Shading Shading AGMCORE_separateShadingDict def
+					Shading/AGMCORE_ignoreshade known
+					currentdict end exch
+					{pop<</PatternType 1/PaintProc{pop}/BBox[0 0 1 1]/XStep 1/YStep 1/PaintType 1/TilingType 3>>}if
+					exch AGMCORE_&sysmakepattern
+					}{
+					exch AGMCORE_&usrmakepattern
+					}ifelse
+				}def
+		}if
+	}if
+	AGMCORE_in_rip_sep{
+		/setcustomcolor
+		{
+			exch aload pop
+			dup 7 1 roll inRip_spot_has_ink not	{
+				4{4 index mul 4 1 roll}
+				repeat
+				/DeviceCMYK setcolorspace
+				6 -2 roll pop pop
+			}{
+				//Adobe_AGM_Core begin
+					/AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf
+				end
+				[/Separation 4 -1 roll/DeviceCMYK
+				{dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul}
+				]
+				setcolorspace
+			}ifelse
+			setcolor
+		}ndf
+		/setseparationgray
+		{
+			[/Separation(All)/DeviceGray{}]setcolorspace_opt
+			1 exch sub setcolor
+		}ndf
+	}{
+		/setseparationgray
+		{
+			AGMCORE_&setgray
+		}ndf
+	}ifelse
+	/findcmykcustomcolor
+	{
+		5 makereadonlyarray
+	}ndf
+	/setcustomcolor
+	{
+		exch aload pop pop
+		4{4 index mul 4 1 roll}repeat
+		setcmykcolor pop
+	}ndf
+	/has_color
+		/colorimage where{
+			AGMCORE_producing_seps{
+				pop true
+			}{
+				systemdict eq
+			}ifelse
+		}{
+			false
+		}ifelse
+	def
+	/map_index
+	{
+		1 index mul exch getinterval{255 div}forall
+	}bdf
+	/map_indexed_devn
+	{
+		Lookup Names length 3 -1 roll cvi map_index
+	}bdf
+	/n_color_components
+	{
+		base_colorspace_type
+		dup/DeviceGray eq{
+			pop 1
+		}{
+			/DeviceCMYK eq{
+				4
+			}{
+				3
+			}ifelse
+		}ifelse
+	}bdf
+	level2{
+		/mo/moveto ldf
+		/li/lineto ldf
+		/cv/curveto ldf
+		/knockout_unitsq
+		{
+			1 setgray
+			0 0 1 1 rectfill
+		}def
+		level2/setcolorspace AGMCORE_key_known not and{
+			/AGMCORE_&&&setcolorspace/setcolorspace ldf
+			/AGMCORE_ReplaceMappedColor
+			{
+				dup type dup/arraytype eq exch/packedarraytype eq or
+				{
+					/AGMCORE_SpotAliasAry2 where{
+						begin
+						dup 0 get dup/Separation eq
+						{
+							pop
+							dup length array copy
+							dup dup 1 get
+							current_spot_alias
+							{
+								dup map_alias
+								{
+									false set_spot_alias
+									dup 1 exch setsepcolorspace
+									true set_spot_alias
+									begin
+									/sep_colorspace_dict currentdict AGMCORE_gput
+									pop pop	pop
+									[
+										/Separation Name 
+										CSA map_csa
+										MappedCSA 
+										/sep_colorspace_proc load
+									]
+									dup Name
+									end
+								}if
+							}if
+							map_reserved_ink_name 1 xpt
+						}{
+							/DeviceN eq 
+							{
+								dup length array copy
+								dup dup 1 get[
+									exch{
+										current_spot_alias{
+											dup map_alias{
+												/Name get exch pop
+											}if
+										}if
+										map_reserved_ink_name
+									}forall 
+								]1 xpt
+							}if
+						}ifelse
+						end
+					}if
+				}if
+			}def
+			/setcolorspace
+			{
+				dup type dup/arraytype eq exch/packedarraytype eq or
+				{
+					dup 0 get/Indexed eq
+					{
+						AGMCORE_distilling
+						{
+							/PhotoshopDuotoneList where
+							{
+								pop false
+							}{
+								true
+							}ifelse
+						}{
+							true
+						}ifelse
+						{
+							aload pop 3 -1 roll
+							AGMCORE_ReplaceMappedColor
+							3 1 roll 4 array astore
+						}if
+					}{
+						AGMCORE_ReplaceMappedColor
+					}ifelse
+				}if
+				DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if
+			}def
+		}if	
+	}{
+		/adj
+		{
+			currentstrokeadjust{
+				transform
+				0.25 sub round 0.25 add exch
+				0.25 sub round 0.25 add exch
+				itransform
+			}if
+		}def
+		/mo{
+			adj moveto
+		}def
+		/li{
+			adj lineto
+		}def
+		/cv{
+			6 2 roll adj
+			6 2 roll adj
+			6 2 roll adj curveto
+		}def
+		/knockout_unitsq
+		{
+			1 setgray
+			8 8 1[8 0 0 8 0 0]{<ffffffffffffffff>}image
+		}def
+		/currentstrokeadjust{
+			/currentstrokeadjust AGMCORE_gget
+		}def
+		/setstrokeadjust{
+			/currentstrokeadjust exch AGMCORE_gput
+		}def
+		/setcolorspace
+		{
+			/currentcolorspace exch AGMCORE_gput
+		}def
+		/currentcolorspace
+		{
+			/currentcolorspace AGMCORE_gget
+		}def
+		/setcolor_devicecolor
+		{
+			base_colorspace_type
+			dup/DeviceGray eq{
+				pop setgray
+			}{
+				/DeviceCMYK eq{
+					setcmykcolor
+				}{
+					setrgbcolor
+				}ifelse
+			}ifelse
+		}def
+		/setcolor
+		{
+			currentcolorspace 0 get
+			dup/DeviceGray ne{
+				dup/DeviceCMYK ne{
+					dup/DeviceRGB ne{
+						dup/Separation eq{
+							pop
+							currentcolorspace 3 gx
+							currentcolorspace 2 get
+						}{
+							dup/Indexed eq{
+								pop
+								currentcolorspace 3 get dup type/stringtype eq{
+									currentcolorspace 1 get n_color_components
+									3 -1 roll map_index
+								}{
+									exec
+								}ifelse
+								currentcolorspace 1 get
+							}{
+								/AGMCORE_cur_err/AGMCORE_invalid_color_space def
+								AGMCORE_invalid_color_space
+							}ifelse
+						}ifelse
+					}if
+				}if
+			}if
+			setcolor_devicecolor
+		}def
+	}ifelse
+	/sop/setoverprint ldf
+	/lw/setlinewidth ldf
+	/lc/setlinecap ldf
+	/lj/setlinejoin ldf
+	/ml/setmiterlimit ldf
+	/dsh/setdash ldf
+	/sadj/setstrokeadjust ldf
+	/gry/setgray ldf
+	/rgb/setrgbcolor ldf
+	/cmyk[
+		/currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx
+		/setcmykcolor load dup type/operatortype ne{/exec cvx}if
+	]cvx bdf
+	level3 AGMCORE_host_sep not and{
+		/nzopmsc{
+			6 dict begin
+			/kk exch def
+			/yy exch def
+			/mm exch def
+			/cc exch def
+			/sum 0 def
+			cc 0 ne{/sum sum 2#1000 or def cc}if
+			mm 0 ne{/sum sum 2#0100 or def mm}if
+			yy 0 ne{/sum sum 2#0010 or def yy}if
+			kk 0 ne{/sum sum 2#0001 or def kk}if
+			AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace
+			sum 0 eq{0}if
+			end
+			setcolor
+		}bdf
+	}{
+		/nzopmsc/cmyk ldf
+	}ifelse
+	/sep/setsepcolor ldf
+	/devn/setdevicencolor ldf
+	/idx/setindexedcolor ldf
+	/colr/setcolor ldf
+	/csacrd/set_csa_crd ldf
+	/sepcs/setsepcolorspace ldf
+	/devncs/setdevicencolorspace ldf
+	/idxcs/setindexedcolorspace ldf
+	/cp/closepath ldf
+	/clp/clp_npth ldf
+	/eclp/eoclp_npth ldf
+	/f/fill ldf
+	/ef/eofill ldf
+	/@/stroke ldf
+	/nclp/npth_clp ldf
+	/gset/graphic_setup ldf
+	/gcln/graphic_cleanup ldf
+	/ct/concat ldf
+	/cf/currentfile ldf
+	/fl/filter ldf
+	/rs/readstring ldf
+	/AGMCORE_def_ht currenthalftone def
+	/clonedict Adobe_AGM_Utils begin/clonedict load end def
+	/clonearray Adobe_AGM_Utils begin/clonearray load end def
+	currentdict{
+		dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{
+			bind
+		}if
+		def
+	}forall
+	/getrampcolor
+	{
+		/indx exch def
+		0 1 NumComp 1 sub
+		{
+			dup
+			Samples exch get
+			dup type/stringtype eq{indx get}if
+			exch
+			Scaling exch get aload pop
+			3 1 roll
+			mul add
+		}for
+		ColorSpaceFamily/Separation eq 
+		{sep}
+		{
+			ColorSpaceFamily/DeviceN eq
+			{devn}{setcolor}ifelse
+		}ifelse
+	}bdf
+	/sssetbackground{
+		aload pop 
+		ColorSpaceFamily/Separation eq 
+		{sep}
+		{
+			ColorSpaceFamily/DeviceN eq
+			{devn}{setcolor}ifelse
+		}ifelse	
+	}bdf
+	/RadialShade
+	{
+		40 dict begin
+		/ColorSpaceFamily xdf
+		/background xdf
+		/ext1 xdf
+		/ext0 xdf
+		/BBox xdf
+		/r2 xdf
+		/c2y xdf
+		/c2x xdf
+		/r1 xdf
+		/c1y xdf
+		/c1x xdf
+		/rampdict xdf
+		/setinkoverprint where{pop/setinkoverprint{pop}def}if
+		gsave
+		BBox length 0 gt
+		{
+			np
+			BBox 0 get BBox 1 get moveto
+			BBox 2 get BBox 0 get sub 0 rlineto
+			0 BBox 3 get BBox 1 get sub rlineto
+			BBox 2 get BBox 0 get sub neg 0 rlineto
+			closepath
+			clip
+			np
+		}if
+		c1x c2x eq
+		{
+			c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse
+		}{
+			/slope c2y c1y sub c2x c1x sub div def
+			/theta slope 1 atan def
+			c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if
+			c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if
+		}ifelse
+		gsave
+		clippath
+		c1x c1y translate
+		theta rotate
+		-90 rotate
+		{pathbbox}stopped
+		{0 0 0 0}if
+		/yMax xdf
+		/xMax xdf
+		/yMin xdf
+		/xMin xdf
+		grestore
+		xMax xMin eq yMax yMin eq or
+		{
+			grestore
+			end
+		}{
+			/max{2 copy gt{pop}{exch pop}ifelse}bdf
+			/min{2 copy lt{pop}{exch pop}ifelse}bdf
+			rampdict begin
+			40 dict begin
+			background length 0 gt{background sssetbackground gsave clippath fill grestore}if
+			gsave
+			c1x c1y translate
+			theta rotate
+			-90 rotate
+			/c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def
+			/c1y 0 def
+			/c1x 0 def
+			/c2x 0 def
+			ext0
+			{
+				0 getrampcolor
+				c2y r2 add r1 sub 0.0001 lt
+				{
+					c1x c1y r1 360 0 arcn
+					pathbbox
+					/aymax exch def
+					/axmax exch def
+					/aymin exch def
+					/axmin exch def
+					/bxMin xMin axmin min def
+					/byMin yMin aymin min def
+					/bxMax xMax axmax max def
+					/byMax yMax aymax max def
+					bxMin byMin moveto
+					bxMax byMin lineto
+					bxMax byMax lineto
+					bxMin byMax lineto
+					bxMin byMin lineto
+					eofill
+				}{
+					c2y r1 add r2 le
+					{
+						c1x c1y r1 0 360 arc
+						fill
+					}
+					{
+						c2x c2y r2 0 360 arc fill
+						r1 r2 eq
+						{
+							/p1x r1 neg def
+							/p1y c1y def
+							/p2x r1 def
+							/p2y c1y def
+							p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto
+							fill
+						}{
+							/AA r2 r1 sub c2y div def
+							AA -1 eq
+							{/theta 89.99 def}
+							{/theta AA 1 AA dup mul sub sqrt div 1 atan def}
+							ifelse
+							/SS1 90 theta add dup sin exch cos div def
+							/p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def
+							/p1y p1x SS1 div neg def
+							/SS2 90 theta sub dup sin exch cos div def
+							/p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def
+							/p2y p2x SS2 div neg def
+							r1 r2 gt
+							{
+								/L1maxX p1x yMin p1y sub SS1 div add def
+								/L2maxX p2x yMin p2y sub SS2 div add def
+							}{
+								/L1maxX 0 def
+								/L2maxX 0 def
+							}ifelse
+							p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto
+							L1maxX L1maxX p1x sub SS1 mul p1y add lineto
+							fill
+						}ifelse
+					}ifelse
+				}ifelse
+			}if
+		c1x c2x sub dup mul
+		c1y c2y sub dup mul
+		add 0.5 exp
+		0 dtransform
+		dup mul exch dup mul add 0.5 exp 72 div
+		0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+		72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+		1 index 1 index lt{exch}if pop
+		/hires xdf
+		hires mul
+		/numpix xdf
+		/numsteps NumSamples def
+		/rampIndxInc 1 def
+		/subsampling false def
+		numpix 0 ne
+		{
+			NumSamples numpix div 0.5 gt
+			{
+				/numsteps numpix 2 div round cvi dup 1 le{pop 2}if def
+				/rampIndxInc NumSamples 1 sub numsteps div def
+				/subsampling true def
+			}if
+		}if
+		/xInc c2x c1x sub numsteps div def
+		/yInc c2y c1y sub numsteps div def
+		/rInc r2 r1 sub numsteps div def
+		/cx c1x def
+		/cy c1y def
+		/radius r1 def
+		np
+		xInc 0 eq yInc 0 eq rInc 0 eq and and
+		{
+			0 getrampcolor
+			cx cy radius 0 360 arc
+			stroke
+			NumSamples 1 sub getrampcolor
+			cx cy radius 72 hires div add 0 360 arc
+			0 setlinewidth
+			stroke
+		}{
+			0
+			numsteps
+			{
+				dup
+				subsampling{round cvi}if
+				getrampcolor
+				cx cy radius 0 360 arc
+				/cx cx xInc add def
+				/cy cy yInc add def
+				/radius radius rInc add def
+				cx cy radius 360 0 arcn
+				eofill
+				rampIndxInc add
+			}repeat
+			pop
+		}ifelse
+		ext1
+		{
+			c2y r2 add r1 lt
+			{
+				c2x c2y r2 0 360 arc
+				fill
+			}{
+				c2y r1 add r2 sub 0.0001 le
+				{
+					c2x c2y r2 360 0 arcn
+					pathbbox
+					/aymax exch def
+					/axmax exch def
+					/aymin exch def
+					/axmin exch def
+					/bxMin xMin axmin min def
+					/byMin yMin aymin min def
+					/bxMax xMax axmax max def
+					/byMax yMax aymax max def
+					bxMin byMin moveto
+					bxMax byMin lineto
+					bxMax byMax lineto
+					bxMin byMax lineto
+					bxMin byMin lineto
+					eofill
+				}{
+					c2x c2y r2 0 360 arc fill
+					r1 r2 eq
+					{
+						/p1x r2 neg def
+						/p1y c2y def
+						/p2x r2 def
+						/p2y c2y def
+						p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto
+						fill
+					}{
+						/AA r2 r1 sub c2y div def
+						AA -1 eq
+						{/theta 89.99 def}
+						{/theta AA 1 AA dup mul sub sqrt div 1 atan def}
+						ifelse
+						/SS1 90 theta add dup sin exch cos div def
+						/p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def
+						/p1y c2y p1x SS1 div sub def
+						/SS2 90 theta sub dup sin exch cos div def
+						/p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def
+						/p2y c2y p2x SS2 div sub def
+						r1 r2 lt
+						{
+							/L1maxX p1x yMax p1y sub SS1 div add def
+							/L2maxX p2x yMax p2y sub SS2 div add def
+						}{
+							/L1maxX 0 def
+							/L2maxX 0 def
+						}ifelse
+						p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto
+						L1maxX L1maxX p1x sub SS1 mul p1y add lineto
+						fill
+					}ifelse
+				}ifelse
+			}ifelse
+		}if
+		grestore
+		grestore
+		end
+		end
+		end
+		}ifelse
+	}bdf
+	/GenStrips
+	{
+		40 dict begin
+		/ColorSpaceFamily xdf
+		/background xdf
+		/ext1 xdf
+		/ext0 xdf
+		/BBox xdf
+		/y2 xdf
+		/x2 xdf
+		/y1 xdf
+		/x1 xdf
+		/rampdict xdf
+		/setinkoverprint where{pop/setinkoverprint{pop}def}if
+		gsave
+		BBox length 0 gt
+		{
+			np
+			BBox 0 get BBox 1 get moveto
+			BBox 2 get BBox 0 get sub 0 rlineto
+			0 BBox 3 get BBox 1 get sub rlineto
+			BBox 2 get BBox 0 get sub neg 0 rlineto
+			closepath
+			clip
+			np
+		}if
+		x1 x2 eq
+		{
+			y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse
+		}{
+			/slope y2 y1 sub x2 x1 sub div def
+			/theta slope 1 atan def
+			x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if
+			x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if
+		}
+		ifelse
+		gsave
+		clippath
+		x1 y1 translate
+		theta rotate
+		{pathbbox}stopped
+		{0 0 0 0}if
+		/yMax exch def
+		/xMax exch def
+		/yMin exch def
+		/xMin exch def
+		grestore
+		xMax xMin eq yMax yMin eq or
+		{
+			grestore
+			end
+		}{
+			rampdict begin
+			20 dict begin
+			background length 0 gt{background sssetbackground gsave clippath fill grestore}if
+			gsave
+			x1 y1 translate
+			theta rotate
+			/xStart 0 def
+			/xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def
+			/ySpan yMax yMin sub def
+			/numsteps NumSamples def
+			/rampIndxInc 1 def
+			/subsampling false def
+			xStart 0 transform
+			xEnd 0 transform
+			3 -1 roll
+			sub dup mul
+			3 1 roll
+			sub dup mul
+			add 0.5 exp 72 div
+			0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+			72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+			1 index 1 index lt{exch}if pop
+			mul
+			/numpix xdf
+			numpix 0 ne
+			{
+				NumSamples numpix div 0.5 gt
+				{
+					/numsteps numpix 2 div round cvi dup 1 le{pop 2}if def
+					/rampIndxInc NumSamples 1 sub numsteps div def
+					/subsampling true def
+				}if
+			}if
+			ext0
+			{
+				0 getrampcolor
+				xMin xStart lt
+				{
+					xMin yMin xMin neg ySpan rectfill
+				}if
+			}if
+			/xInc xEnd xStart sub numsteps div def
+			/x xStart def
+			0
+			numsteps
+			{
+				dup
+				subsampling{round cvi}if
+				getrampcolor
+				x yMin xInc ySpan rectfill
+				/x x xInc add def
+				rampIndxInc add
+			}repeat
+			pop
+			ext1{
+				xMax xEnd gt
+				{
+					xEnd yMin xMax xEnd sub ySpan rectfill
+				}if
+			}if
+			grestore
+			grestore
+			end
+			end
+			end
+		}ifelse
+	}bdf
+}def
+/pt
+{
+	end
+}def
+/dt{
+}def
+/pgsv{
+	//Adobe_AGM_Core/AGMCORE_save save put
+}def
+/pgrs{
+	//Adobe_AGM_Core/AGMCORE_save get restore
+}def
+systemdict/findcolorrendering known{
+	/findcolorrendering systemdict/findcolorrendering get def
+}if
+systemdict/setcolorrendering known{
+	/setcolorrendering systemdict/setcolorrendering get def
+}if
+/test_cmyk_color_plate
+{
+	gsave
+	setcmykcolor currentgray 1 ne
+	grestore
+}def
+/inRip_spot_has_ink
+{
+	dup//Adobe_AGM_Core/AGMCORE_name xddf
+	convert_spot_to_process not
+}def
+/map255_to_range
+{
+	1 index sub
+	3 -1 roll 255 div mul add
+}def
+/set_csa_crd
+{
+	/sep_colorspace_dict null AGMCORE_gput
+	begin
+		CSA get_csa_by_name setcolorspace_opt
+		set_crd
+	end
+}
+def
+/map_csa
+{
+	currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse
+	{pop}{get_csa_by_name/MappedCSA xdf}ifelse
+}def
+/setsepcolor
+{
+	/sep_colorspace_dict AGMCORE_gget begin
+		dup/sep_tint exch AGMCORE_gput
+		TintProc
+	end
+}def
+/setdevicencolor
+{
+	/devicen_colorspace_dict AGMCORE_gget begin
+		Names length copy
+		Names length 1 sub -1 0
+		{
+			/devicen_tints AGMCORE_gget 3 1 roll xpt
+		}for
+		TintProc
+	end
+}def
+/sep_colorspace_proc
+{
+	/AGMCORE_tmp exch store
+	/sep_colorspace_dict AGMCORE_gget begin
+	currentdict/Components known{
+		Components aload pop 
+		TintMethod/Lab eq{
+			2{AGMCORE_tmp mul NComponents 1 roll}repeat
+			LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll
+		}{
+			TintMethod/Subtractive eq{
+				NComponents{
+					AGMCORE_tmp mul NComponents 1 roll
+				}repeat
+			}{
+				NComponents{
+					1 sub AGMCORE_tmp mul 1 add NComponents 1 roll
+				}repeat
+			}ifelse
+		}ifelse
+	}{
+		ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get
+		aload pop
+	}ifelse
+	end
+}def
+/sep_colorspace_gray_proc
+{
+	/AGMCORE_tmp exch store
+	/sep_colorspace_dict AGMCORE_gget begin
+	GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get
+	end
+}def
+/sep_proc_name
+{
+	dup 0 get 
+	dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{
+		pop[/DeviceGray]
+		/sep_colorspace_gray_proc
+	}{
+		/sep_colorspace_proc
+	}ifelse
+}def
+/setsepcolorspace
+{
+	current_spot_alias{
+		dup begin
+			Name map_alias{
+				exch pop
+			}if
+		end
+	}if
+	dup/sep_colorspace_dict exch AGMCORE_gput
+	begin
+	CSA map_csa
+	/AGMCORE_sep_special Name dup()eq exch(All)eq or store
+	AGMCORE_avoid_L2_sep_space{
+		[/Indexed MappedCSA sep_proc_name 255 exch 
+			{255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx 
+		]setcolorspace_opt
+		/TintProc{
+			255 mul round cvi setcolor
+		}bdf
+	}{
+		MappedCSA 0 get/DeviceCMYK eq 
+		currentdict/Components known and 
+		AGMCORE_sep_special not and{
+			/TintProc[
+				Components aload pop Name findcmykcustomcolor 
+				/exch cvx/setcustomcolor cvx
+			]cvx bdf
+		}{
+ 			AGMCORE_host_sep Name(All)eq and{
+ 				/TintProc{
+					1 exch sub setseparationgray 
+				}bdf
+ 			}{
+				AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and 
+				AGMCORE_host_sep or
+				Name()eq and{
+					/TintProc[
+						MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{
+							cvx/setcmykcolor cvx
+						}{
+							cvx/setgray cvx
+						}ifelse
+					]cvx bdf
+				}{
+					AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{
+	 					/TintProc[
+							/dup cvx
+							MappedCSA sep_proc_name cvx exch
+							0 get/DeviceGray eq{
+								1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx
+							}if
+							/Name cvx/findcmykcustomcolor cvx/exch cvx
+							AGMCORE_host_sep{
+								AGMCORE_is_cmyk_sep
+								/Name cvx 
+								/AGMCORE_IsSeparationAProcessColor load/exec cvx
+								/not cvx/and cvx 
+							}{
+								Name inRip_spot_has_ink not
+							}ifelse
+							[
+		 						/pop cvx 1
+							]cvx/if cvx
+							/setcustomcolor cvx
+						]cvx bdf
+ 					}{
+						/TintProc{setcolor}bdf
+						[/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt
+					}ifelse
+				}ifelse
+			}ifelse
+		}ifelse
+	}ifelse
+	set_crd
+	setsepcolor
+	end
+}def
+/additive_blend
+{
+ 	3 dict begin
+ 	/numarrays xdf
+ 	/numcolors xdf
+ 	0 1 numcolors 1 sub
+ 		{
+ 		/c1 xdf
+ 		1
+ 		0 1 numarrays 1 sub
+ 			{
+			1 exch add/index cvx
+ 			c1/get cvx/mul cvx
+ 			}for
+ 		numarrays 1 add 1/roll cvx 
+ 		}for
+ 	numarrays[/pop cvx]cvx/repeat cvx
+ 	end
+}def
+/subtractive_blend
+{
+	3 dict begin
+	/numarrays xdf
+	/numcolors xdf
+	0 1 numcolors 1 sub
+		{
+		/c1 xdf
+		1 1
+		0 1 numarrays 1 sub
+			{
+			1 3 3 -1 roll add/index cvx 
+			c1/get cvx/sub cvx/mul cvx
+			}for
+		/sub cvx
+		numarrays 1 add 1/roll cvx
+		}for
+	numarrays[/pop cvx]cvx/repeat cvx
+	end
+}def
+/exec_tint_transform
+{
+	/TintProc[
+		/TintTransform cvx/setcolor cvx
+	]cvx bdf
+	MappedCSA setcolorspace_opt
+}bdf
+/devn_makecustomcolor
+{
+	2 dict begin
+	/names_index xdf
+	/Names xdf
+	1 1 1 1 Names names_index get findcmykcustomcolor
+	/devicen_tints AGMCORE_gget names_index get setcustomcolor
+	Names length{pop}repeat
+	end
+}bdf
+/setdevicencolorspace
+{
+	dup/AliasedColorants known{false}{true}ifelse 
+	current_spot_alias and{
+		7 dict begin
+		/names_index 0 def
+		dup/names_len exch/Names get length def
+		/new_names names_len array def
+		/new_LookupTables names_len array def
+		/alias_cnt 0 def
+		dup/Names get
+		{
+			dup map_alias{
+				exch pop
+				dup/ColorLookup known{
+					dup begin
+					new_LookupTables names_index ColorLookup put
+					end
+				}{
+					dup/Components known{
+						dup begin
+						new_LookupTables names_index Components put
+						end
+					}{
+						dup begin
+						new_LookupTables names_index[null null null null]put
+						end
+					}ifelse
+				}ifelse
+				new_names names_index 3 -1 roll/Name get put
+				/alias_cnt alias_cnt 1 add def 
+			}{
+				/name xdf				
+				new_names names_index name put
+				dup/LookupTables known{
+					dup begin
+					new_LookupTables names_index LookupTables names_index get put
+					end
+				}{
+					dup begin
+					new_LookupTables names_index[null null null null]put
+					end
+				}ifelse
+			}ifelse
+			/names_index names_index 1 add def 
+		}forall
+		alias_cnt 0 gt{
+			/AliasedColorants true def
+			/lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def
+			0 1 names_len 1 sub{
+				/names_index xdf
+				new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{
+					/AliasedColorants false def
+					exit
+				}{
+					new_LookupTables names_index get 0 get null eq{
+						dup/Names get names_index get/name xdf
+						name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq
+						or or or not{
+							/AliasedColorants false def
+							exit
+						}if
+					}if
+				}ifelse
+			}for
+			lut_entry_len 1 eq{
+				/AliasedColorants false def
+			}if
+			AliasedColorants{
+				dup begin
+				/Names new_names def
+				/LookupTables new_LookupTables def
+				/AliasedColorants true def
+				/NComponents lut_entry_len def
+				/TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def
+				/MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def
+				currentdict/TTTablesIdx known not{
+					/TTTablesIdx -1 def
+				}if
+				end
+			}if
+		}if
+		end
+	}if
+	dup/devicen_colorspace_dict exch AGMCORE_gput
+	begin
+	currentdict/AliasedColorants known{
+		AliasedColorants
+	}{
+		false
+	}ifelse
+	dup not{
+		CSA map_csa
+	}if
+	/TintTransform load type/nulltype eq or{
+		/TintTransform[
+			0 1 Names length 1 sub
+				{
+				/TTTablesIdx TTTablesIdx 1 add def
+				dup LookupTables exch get dup 0 get null eq
+					{
+					1 index
+					Names exch get
+					dup(Cyan)eq
+						{
+						pop exch
+						LookupTables length exch sub
+						/index cvx
+						0 0 0
+						}
+						{
+						dup(Magenta)eq
+							{
+							pop exch
+							LookupTables length exch sub
+							/index cvx
+							0/exch cvx 0 0
+							}{
+							(Yellow)eq
+								{
+								exch
+								LookupTables length exch sub
+								/index cvx
+								0 0 3 -1/roll cvx 0
+								}{
+								exch
+								LookupTables length exch sub
+								/index cvx
+								0 0 0 4 -1/roll cvx
+								}ifelse
+							}ifelse
+						}ifelse
+					5 -1/roll cvx/astore cvx
+					}{
+					dup length 1 sub
+					LookupTables length 4 -1 roll sub 1 add
+					/index cvx/mul cvx/round cvx/cvi cvx/get cvx
+					}ifelse
+					Names length TTTablesIdx add 1 add 1/roll cvx
+				}for
+			Names length[/pop cvx]cvx/repeat cvx
+			NComponents Names length
+ 			TintMethod/Subtractive eq
+ 				{
+ 				subtractive_blend
+ 				}{
+ 				additive_blend
+ 				}ifelse
+		]cvx bdf
+	}if
+	AGMCORE_host_sep{
+		Names convert_to_process{
+			exec_tint_transform
+		}
+		{	
+			currentdict/AliasedColorants known{
+				AliasedColorants not
+			}{
+				false
+			}ifelse
+			5 dict begin
+			/AvoidAliasedColorants xdf
+			/painted? false def
+			/names_index 0 def
+			/names_len Names length def
+			AvoidAliasedColorants{
+				/currentspotalias current_spot_alias def
+				false set_spot_alias
+			}if
+			Names{
+				AGMCORE_is_cmyk_sep{
+					dup(Cyan)eq AGMCORE_cyan_plate and exch
+					dup(Magenta)eq AGMCORE_magenta_plate and exch
+					dup(Yellow)eq AGMCORE_yellow_plate and exch
+					(Black)eq AGMCORE_black_plate and or or or{
+						/devicen_colorspace_dict AGMCORE_gget/TintProc[
+							Names names_index/devn_makecustomcolor cvx
+						]cvx ddf
+						/painted? true def
+					}if
+					painted?{exit}if
+				}{
+					0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{
+					/devicen_colorspace_dict AGMCORE_gget/TintProc[
+						Names names_index/devn_makecustomcolor cvx
+					]cvx ddf
+					/painted? true def
+					exit
+					}if
+				}ifelse
+				/names_index names_index 1 add def
+			}forall
+			AvoidAliasedColorants{
+				currentspotalias set_spot_alias
+			}if
+			painted?{
+				/devicen_colorspace_dict AGMCORE_gget/names_index names_index put
+			}{
+				/devicen_colorspace_dict AGMCORE_gget/TintProc[
+					names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx
+ 					0 0 0 0/setcmykcolor cvx
+				]cvx ddf
+			}ifelse
+			end
+		}ifelse
+	}
+	{
+		AGMCORE_in_rip_sep{
+			Names convert_to_process not
+		}{
+			level3
+		}ifelse
+		{
+			[/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt
+			/TintProc level3 not AGMCORE_in_rip_sep and{
+				[
+					Names/length cvx[/pop cvx]cvx/repeat cvx
+				]cvx bdf
+			}{
+				{setcolor}bdf
+			}ifelse
+		}{
+			exec_tint_transform
+		}ifelse
+	}ifelse
+	set_crd
+	/AliasedColorants false def
+	end
+}def
+/setindexedcolorspace
+{
+	dup/indexed_colorspace_dict exch AGMCORE_gput
+	begin
+		currentdict/CSDBase known{
+			CSDBase/CSD get_res begin
+			currentdict/Names known{
+				currentdict devncs
+			}{
+				1 currentdict sepcs
+			}ifelse
+			AGMCORE_host_sep{
+				4 dict begin
+				/compCnt/Names where{pop Names length}{1}ifelse def
+				/NewLookup HiVal 1 add string def
+				0 1 HiVal{
+					/tableIndex xdf
+					Lookup dup type/stringtype eq{
+						compCnt tableIndex map_index
+					}{
+						exec
+					}ifelse
+					/Names where{
+						pop setdevicencolor
+					}{
+						setsepcolor
+					}ifelse
+					currentgray
+					tableIndex exch
+					255 mul cvi 
+					NewLookup 3 1 roll put
+				}for
+				[/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt
+				end
+			}{
+				level3
+				{
+					currentdict/Names known{
+						[/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt
+					}{
+						[/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt
+					}ifelse
+				}{
+				[/Indexed MappedCSA HiVal
+					[
+					currentdict/Names known{
+						Lookup dup type/stringtype eq
+							{/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx}
+							{/exec cvx}ifelse
+							/TintTransform load/exec cvx
+					}{
+						Lookup dup type/stringtype eq
+							{/exch cvx/get cvx 255/div cvx}
+							{/exec cvx}ifelse
+							CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx
+					}ifelse
+					]cvx
+				]setcolorspace_opt
+				}ifelse
+			}ifelse
+			end
+			set_crd
+		}
+		{
+			CSA map_csa
+			AGMCORE_host_sep level2 not and{
+				0 0 0 0 setcmykcolor
+			}{
+				[/Indexed MappedCSA 
+				level2 not has_color not and{
+					dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{
+						pop[/DeviceGray]
+					}if
+					HiVal GrayLookup
+				}{
+					HiVal 
+					currentdict/RangeArray known{
+						{
+							/indexed_colorspace_dict AGMCORE_gget begin
+							Lookup exch 
+							dup HiVal gt{
+								pop HiVal
+							}if
+							NComponents mul NComponents getinterval{}forall
+							NComponents 1 sub -1 0{
+								RangeArray exch 2 mul 2 getinterval aload pop map255_to_range
+								NComponents 1 roll
+							}for
+							end
+						}bind
+					}{
+						Lookup
+					}ifelse
+				}ifelse
+				]setcolorspace_opt
+				set_crd
+			}ifelse
+		}ifelse
+	end
+}def
+/setindexedcolor
+{
+	AGMCORE_host_sep{
+		/indexed_colorspace_dict AGMCORE_gget
+		begin
+		currentdict/CSDBase known{
+			CSDBase/CSD get_res begin
+			currentdict/Names known{
+				map_indexed_devn
+				devn
+			}
+			{
+				Lookup 1 3 -1 roll map_index
+				sep
+			}ifelse
+			end
+		}{
+			Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll
+			map_index
+			MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse
+		}ifelse
+		end
+	}{
+		level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{
+			/indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin
+			map_indexed_devn
+			devn
+			end
+		}
+		{
+			setcolor
+		}ifelse
+	}ifelse
+}def
+/ignoreimagedata
+{
+	currentoverprint not{
+		gsave
+		dup clonedict begin
+		1 setgray
+		/Decode[0 1]def
+		/DataSource<FF>def
+		/MultipleDataSources false def
+		/BitsPerComponent 8 def
+		currentdict end
+		systemdict/image gx
+		grestore
+		}if
+	consumeimagedata
+}def
+/add_res
+{
+	dup/CSD eq{
+		pop 
+		//Adobe_AGM_Core begin
+		/AGMCORE_CSD_cache load 3 1 roll put
+		end
+	}{
+		defineresource pop
+	}ifelse
+}def
+/del_res
+{
+	{
+		aload pop exch
+		dup/CSD eq{
+			pop 
+			{//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall
+		}{
+			exch
+			{1 index undefineresource}forall
+			pop
+		}ifelse
+	}forall
+}def
+/get_res
+{
+	dup/CSD eq{
+		pop
+		dup type dup/nametype eq exch/stringtype eq or{
+			AGMCORE_CSD_cache exch get
+		}if
+	}{
+		findresource
+	}ifelse
+}def
+/get_csa_by_name
+{
+	dup type dup/nametype eq exch/stringtype eq or{
+		/CSA get_res
+	}if
+}def
+/paintproc_buf_init
+{
+	/count get 0 0 put
+}def
+/paintproc_buf_next
+{
+	dup/count get dup 0 get
+	dup 3 1 roll
+	1 add 0 xpt
+	get				
+}def
+/cachepaintproc_compress
+{
+	5 dict begin
+	currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def
+	/ppdict 20 dict def
+	/string_size 16000 def
+	/readbuffer string_size string def
+	currentglobal true setglobal 
+	ppdict 1 array dup 0 1 put/count xpt
+	setglobal
+	/LZWFilter 
+	{
+		exch
+		dup length 0 eq{
+			pop
+		}{
+			ppdict dup length 1 sub 3 -1 roll put
+		}ifelse
+		{string_size}{0}ifelse string
+	}/LZWEncode filter def
+	{		
+		ReadFilter readbuffer readstring
+		exch LZWFilter exch writestring
+		not{exit}if
+	}loop
+	LZWFilter closefile
+	ppdict				
+	end
+}def
+/cachepaintproc
+{
+	2 dict begin
+	currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def
+	/ppdict 20 dict def
+	currentglobal true setglobal 
+	ppdict 1 array dup 0 1 put/count xpt
+	setglobal
+	{
+		ReadFilter 16000 string readstring exch
+		ppdict dup length 1 sub 3 -1 roll put
+		not{exit}if
+	}loop
+	ppdict dup dup length 1 sub()put					
+	end	
+}def
+/make_pattern
+{
+	exch clonedict exch
+	dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform
+	exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub
+	exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub
+	matrix translate exch matrix concatmatrix
+			 1 index begin
+		BBox 0 get XStep div cvi XStep mul/xshift exch neg def
+		BBox 1 get YStep div cvi YStep mul/yshift exch neg def
+		BBox 0 get xshift add
+		BBox 1 get yshift add
+		BBox 2 get xshift add
+		BBox 3 get yshift add
+		4 array astore
+		/BBox exch def
+		[xshift yshift/translate load null/exec load]dup
+		3/PaintProc load put cvx/PaintProc exch def
+		end
+	gsave 0 setgray
+	makepattern
+	grestore
+}def
+/set_pattern
+{
+	dup/PatternType get 1 eq{
+		dup/PaintType get 1 eq{
+			currentoverprint sop[/DeviceGray]setcolorspace 0 setgray
+		}if
+	}if
+	setpattern
+}def
+/setcolorspace_opt
+{
+	dup currentcolorspace eq{pop}{setcolorspace}ifelse
+}def
+/updatecolorrendering
+{
+	currentcolorrendering/RenderingIntent known{
+		currentcolorrendering/RenderingIntent get
+	}
+	{
+		Intent/AbsoluteColorimetric eq 
+		{
+			/absolute_colorimetric_crd AGMCORE_gget dup null eq
+		}
+		{
+			Intent/RelativeColorimetric eq
+			{
+				/relative_colorimetric_crd AGMCORE_gget dup null eq
+			}
+			{
+				Intent/Saturation eq
+				{
+					/saturation_crd AGMCORE_gget dup null eq
+				}
+				{
+					/perceptual_crd AGMCORE_gget dup null eq
+				}ifelse
+			}ifelse
+		}ifelse
+		{
+			pop null	
+		}
+		{
+			/RenderingIntent known{null}{Intent}ifelse
+		}ifelse
+	}ifelse
+	Intent ne{
+		Intent/ColorRendering{findresource}stopped
+		{
+			pop pop systemdict/findcolorrendering known
+			{
+ 				Intent findcolorrendering
+ 				{
+ 					/ColorRendering findresource true exch
+ 				}
+ 				{
+ 					/ColorRendering findresource
+					product(Xerox Phaser 5400)ne
+					exch
+ 				}ifelse
+				dup Intent/AbsoluteColorimetric eq 
+				{
+					/absolute_colorimetric_crd exch AGMCORE_gput
+				}
+				{
+					Intent/RelativeColorimetric eq
+					{
+						/relative_colorimetric_crd exch AGMCORE_gput
+					}
+					{
+						Intent/Saturation eq
+						{
+							/saturation_crd exch AGMCORE_gput
+						}
+						{
+							Intent/Perceptual eq
+							{
+								/perceptual_crd exch AGMCORE_gput
+							}
+							{
+								pop
+							}ifelse
+						}ifelse
+					}ifelse
+				}ifelse
+				1 index{exch}{pop}ifelse
+			}
+			{false}ifelse
+		}
+		{true}ifelse
+		{
+			dup begin
+			currentdict/TransformPQR known{
+				currentdict/TransformPQR get aload pop
+				3{{}eq 3 1 roll}repeat or or
+			}
+			{true}ifelse
+			currentdict/MatrixPQR known{
+				currentdict/MatrixPQR get aload pop
+				1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll
+				0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll
+				0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq
+				and and and and and and and and
+			}
+			{true}ifelse
+			end
+			or
+			{
+				clonedict begin
+				/TransformPQR[
+					{4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div
+					3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind
+					{4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div
+					3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind
+					{4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div
+					3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind
+				]def
+				/MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def
+				/RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def
+				currentdict end
+			}if
+			setcolorrendering_opt
+		}if		
+	}if
+}def
+/set_crd
+{
+	AGMCORE_host_sep not level2 and{
+		currentdict/ColorRendering known{
+			ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if
+		}{
+			currentdict/Intent known{
+				updatecolorrendering
+			}if
+		}ifelse
+		currentcolorspace dup type/arraytype eq
+			{0 get}if
+		/DeviceRGB eq
+			{
+			currentdict/UCR known
+				{/UCR}{/AGMCORE_currentucr}ifelse
+			load setundercolorremoval
+			currentdict/BG known 
+				{/BG}{/AGMCORE_currentbg}ifelse
+			load setblackgeneration
+			}if
+	}if
+}def
+/set_ucrbg
+{
+	dup null eq{pop/AGMCORE_currentbg load}{/Procedure get_res}ifelse setblackgeneration
+	dup null eq{pop/AGMCORE_currentucr load}{/Procedure get_res}ifelse setundercolorremoval
+}def
+/setcolorrendering_opt
+{
+	dup currentcolorrendering eq{
+		pop
+	}{
+		product(HP Color LaserJet 2605)anchorsearch{
+			pop pop pop
+		}{
+			pop
+			clonedict
+			begin
+				/Intent Intent def
+				currentdict
+			end
+			setcolorrendering
+		}ifelse
+	}ifelse
+}def
+/cpaint_gcomp
+{
+	convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf
+	//Adobe_AGM_Core/AGMCORE_ConvertToProcess get not
+	{
+		(%end_cpaint_gcomp)flushinput
+	}if
+}def
+/cpaint_gsep
+{
+	//Adobe_AGM_Core/AGMCORE_ConvertToProcess get
+	{	
+		(%end_cpaint_gsep)flushinput
+	}if
+}def
+/cpaint_gend
+{np}def
+/T1_path
+{
+	currentfile token pop currentfile token pop mo
+	{
+		currentfile token pop dup type/stringtype eq
+			{pop exit}if 
+		0 exch rlineto 
+		currentfile token pop dup type/stringtype eq
+			{pop exit}if 
+		0 rlineto
+	}loop
+}def
+/T1_gsave
+	level3
+	{/clipsave}
+	{/gsave}ifelse
+	load def
+/T1_grestore
+	level3
+	{/cliprestore}
+	{/grestore}ifelse 
+	load def
+/set_spot_alias_ary
+{
+	dup inherit_aliases
+	//Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf
+}def
+/set_spot_normalization_ary
+{
+	dup inherit_aliases
+	dup length
+	/AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if
+	array
+	//Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf
+	/AGMCORE_SpotAliasAry where{
+		pop
+		AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval
+		AGMCORE_SpotAliasAry length
+	}{0}ifelse
+	AGMCORE_SpotAliasAry2 3 1 roll exch putinterval
+	true set_spot_alias
+}def
+/inherit_aliases
+{
+	{dup/Name get map_alias{/CSD put}{pop}ifelse}forall
+}def
+/set_spot_alias
+{
+	/AGMCORE_SpotAliasAry2 where{
+		/AGMCORE_current_spot_alias 3 -1 roll put
+	}{
+		pop
+	}ifelse
+}def
+/current_spot_alias
+{
+	/AGMCORE_SpotAliasAry2 where{
+		/AGMCORE_current_spot_alias get
+	}{
+		false
+	}ifelse
+}def
+/map_alias
+{
+	/AGMCORE_SpotAliasAry2 where{
+		begin
+			/AGMCORE_name xdf
+			false	
+			AGMCORE_SpotAliasAry2{
+				dup/Name get AGMCORE_name eq{
+					/CSD get/CSD get_res
+					exch pop true
+					exit
+				}{
+					pop
+				}ifelse
+			}forall
+		end
+	}{
+		pop false
+	}ifelse
+}bdf
+/spot_alias
+{
+	true set_spot_alias
+	/AGMCORE_&setcustomcolor AGMCORE_key_known not{
+		//Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put
+	}if
+	/customcolor_tint 1 AGMCORE_gput
+	//Adobe_AGM_Core begin
+	/setcustomcolor
+	{
+		//Adobe_AGM_Core begin
+		dup/customcolor_tint exch AGMCORE_gput
+		1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not
+		current_spot_alias and{1 index 4 get map_alias}{false}ifelse
+		{
+			false set_spot_alias
+			/sep_colorspace_dict AGMCORE_gget null ne
+			{/sep_colorspace_dict AGMCORE_gget/ForeignContent known not}{false}ifelse
+			3 1 roll 2 index{
+				exch pop/sep_tint AGMCORE_gget exch
+			}if
+			mark 3 1 roll
+			setsepcolorspace
+			counttomark 0 ne{
+				setsepcolor
+			}if
+			pop
+			not{/sep_tint 1.0 AGMCORE_gput/sep_colorspace_dict AGMCORE_gget/ForeignContent true put}if
+			pop
+			true set_spot_alias
+		}{
+			AGMCORE_&setcustomcolor
+		}ifelse
+		end
+	}bdf
+	end
+}def
+/begin_feature
+{
+	Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put
+	count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put
+	{Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if
+}def
+/end_feature
+{
+	2 dict begin
+	/spd/setpagedevice load def
+	/setpagedevice{get_gstate spd set_gstate}def
+	stopped{$error/newerror false put}if
+	end
+	count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse
+	countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse
+	{Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if
+}def
+/set_negative
+{
+	//Adobe_AGM_Core begin
+	/AGMCORE_inverting exch def
+	level2{
+		currentpagedevice/NegativePrint known AGMCORE_distilling not and{
+			currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{
+				true begin_feature true{
+						<</NegativePrint//Adobe_AGM_Core/AGMCORE_inverting get>>setpagedevice
+				}end_feature
+			}if
+			/AGMCORE_inverting false def
+		}if
+	}if
+	AGMCORE_inverting{
+		[{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer
+ 		AGMCORE_distilling{
+ 			erasepage
+ 		}{
+ 			gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse
+ 			/AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore
+ 		}ifelse
+	}if
+	end
+}def
+/lw_save_restore_override{
+	/md where{
+		pop
+		md begin
+		initializepage
+		/initializepage{}def
+		/pmSVsetup{}def
+		/endp{}def
+		/pse{}def
+		/psb{}def
+		/orig_showpage where
+			{pop}
+			{/orig_showpage/showpage load def}
+		ifelse
+		/showpage{orig_showpage gR}def
+		end
+	}if
+}def
+/pscript_showpage_override{
+	/NTPSOct95 where
+	{
+		begin
+		showpage
+		save
+		/showpage/restore load def
+		/restore{exch pop}def
+		end
+	}if
+}def
+/driver_media_override
+{
+	/md where{
+		pop
+		md/initializepage known{
+			md/initializepage{}put
+		}if
+		md/rC known{
+			md/rC{4{pop}repeat}put
+		}if
+	}if
+	/mysetup where{
+		/mysetup[1 0 0 1 0 0]put
+	}if
+	Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put
+	level2
+		{Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if
+}def
+/capture_mysetup
+{
+	/Pscript_Win_Data where{
+		pop
+		Pscript_Win_Data/mysetup known{
+			Adobe_AGM_Core/save_mysetup Pscript_Win_Data/mysetup get put
+		}if
+	}if
+}def
+/restore_mysetup
+{
+	/Pscript_Win_Data where{
+		pop
+		Pscript_Win_Data/mysetup known{
+			Adobe_AGM_Core/save_mysetup known{
+				Pscript_Win_Data/mysetup Adobe_AGM_Core/save_mysetup get put
+				Adobe_AGM_Core/save_mysetup undef
+			}if
+		}if
+	}if
+}def
+/driver_check_media_override
+{
+ 	/PrepsDict where
+ 		{pop}
+		{
+		Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne
+		Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq
+			{
+			Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and
+			Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and
+			}if
+			{
+			Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix
+			}if
+		}ifelse
+}def
+AGMCORE_err_strings begin
+	/AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def
+	/AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def
+	/AGMCORE_invalid_color_space(This job contains an invalid color space. )def
+end
+/set_def_ht
+{AGMCORE_def_ht sethalftone}def
+/set_def_flat
+{AGMCORE_Default_flatness setflat}def
+end
+systemdict/setpacking known
+{setpacking}if
+%%EndResource
+%%BeginResource: procset Adobe_CoolType_Core 2.31 0
%%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved.
%%Version: 2.31 0
10 dict begin
/Adobe_CoolType_Passthru currentdict def
/Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def
Adobe_CoolType_Core_Defined
	{/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def}
if
userdict/Adobe_CoolType_Core 70 dict dup begin put
/Adobe_CoolType_Version 2.31 def
/Level2?
	systemdict/languagelevel known dup
		{pop systemdict/languagelevel get 2 ge}
	if def
Level2? not
	{
	/currentglobal false def
	/setglobal/pop load def
	/gcheck{pop false}bind def
	/currentpacking false def
	/setpacking/pop load def
	/SharedFontDirectory 0 dict def
	}
if
currentpacking
true setpacking
currentglobal false setglobal
userdict/Adobe_CoolType_Data 2 copy known not
	{2 copy 10 dict put}
if
get
	 begin
	/@opStackCountByLevel 32 dict def
	/@opStackLevel 0 def
	/@dictStackCountByLevel 32 dict def
	/@dictStackLevel 0 def
	 end
setglobal
currentglobal true setglobal
userdict/Adobe_CoolType_GVMFonts known not
	{userdict/Adobe_CoolType_GVMFonts 10 dict put}
if
setglobal
currentglobal false setglobal
userdict/Adobe_CoolType_LVMFonts known not
	{userdict/Adobe_CoolType_LVMFonts 10 dict put}
if
setglobal
/ct_VMDictPut
	{
	dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse
	3 1 roll put
	}bind def
/ct_VMDictUndef
	{
	dup Adobe_CoolType_GVMFonts exch known
		{Adobe_CoolType_GVMFonts exch undef}
		{
			dup Adobe_CoolType_LVMFonts exch known
			{Adobe_CoolType_LVMFonts exch undef}
			{pop}
			ifelse
		}ifelse
	}bind def
/ct_str1 1 string def
/ct_xshow
{
	/_ct_na exch def
	/_ct_i 0 def
	currentpoint
	/_ct_y exch def
	/_ct_x exch def
	{
		pop pop
		ct_str1 exch 0 exch put
		ct_str1 show
		{_ct_na _ct_i get}stopped 
		{pop pop}
		{
			_ct_x _ct_y moveto
			0
			rmoveto
		}
		ifelse
		/_ct_i _ct_i 1 add def
		currentpoint
		/_ct_y exch def
		/_ct_x exch def
	}
	exch
	@cshow
}bind def
/ct_yshow
{
	/_ct_na exch def
	/_ct_i 0 def
	currentpoint
	/_ct_y exch def
	/_ct_x exch def
	{
		pop pop
		ct_str1 exch 0 exch put
		ct_str1 show
		{_ct_na _ct_i get}stopped 
		{pop pop}
		{
			_ct_x _ct_y moveto
			0 exch
			rmoveto
		}
		ifelse
		/_ct_i _ct_i 1 add def
		currentpoint
		/_ct_y exch def
		/_ct_x exch def
	}
	exch
	@cshow
}bind def
/ct_xyshow
{
	/_ct_na exch def
	/_ct_i 0 def
	currentpoint
	/_ct_y exch def
	/_ct_x exch def
	{
		pop pop
		ct_str1 exch 0 exch put
		ct_str1 show
		{_ct_na _ct_i get}stopped 
		{pop pop}
		{
			{_ct_na _ct_i 1 add get}stopped 
			{pop pop pop}
			{
				_ct_x _ct_y moveto
				rmoveto
			}
			ifelse
		}
		ifelse
		/_ct_i _ct_i 2 add def
		currentpoint
		/_ct_y exch def
		/_ct_x exch def
	}
	exch
	@cshow
}bind def
/xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def
/ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def
/xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def
currentglobal true setglobal
/ct_T3Defs
{
/BuildChar
{
	1 index/Encoding get exch get
	1 index/BuildGlyph get exec
}bind def
/BuildGlyph
{
	exch begin
	GlyphProcs exch get exec
	end
}bind def
}bind def
setglobal
/@_SaveStackLevels
	{
	Adobe_CoolType_Data
		begin
		/@vmState currentglobal def false setglobal
		@opStackCountByLevel
		@opStackLevel
		2 copy known not
			{
			2 copy
			3 dict dup/args
			7 index
			5 add array put
			put get
			}
			{
			get dup/args get dup length 3 index lt
				{
				dup length 5 add array exch
				1 index exch 0 exch putinterval
				1 index exch/args exch put
				}
				{pop}
			ifelse
			}
		ifelse
			begin
			count 1 sub
			1 index lt
				{pop count}
			if
			dup/argCount exch def
			dup 0 gt
				{
				args exch 0 exch getinterval 
			astore pop
				}
				{pop}
			ifelse
			count
			/restCount exch def
			end
		/@opStackLevel @opStackLevel 1 add def
		countdictstack 1 sub
		@dictStackCountByLevel exch @dictStackLevel exch put
		/@dictStackLevel @dictStackLevel 1 add def
		@vmState setglobal
		end
	}bind def
/@_RestoreStackLevels
	{
	Adobe_CoolType_Data
		begin
		/@opStackLevel @opStackLevel 1 sub def
		@opStackCountByLevel @opStackLevel get
			begin
			count restCount sub dup 0 gt
				{{pop}repeat}
				{pop}
			ifelse
			args 0 argCount getinterval{}forall
			end
		/@dictStackLevel @dictStackLevel 1 sub def
		@dictStackCountByLevel @dictStackLevel get
		end
	countdictstack exch sub dup 0 gt
		{{end}repeat}
		{pop}
	ifelse
	}bind def
/@_PopStackLevels
	{
	Adobe_CoolType_Data
		begin
		/@opStackLevel @opStackLevel 1 sub def
		/@dictStackLevel @dictStackLevel 1 sub def
		end
	}bind def
/@Raise
	{
	exch cvx exch errordict exch get exec
	stop
	}bind def
/@ReRaise
	{
	cvx $error/errorname get errordict exch get exec
	stop
	}bind def
/@Stopped
	{
	0 @#Stopped
	}bind def
/@#Stopped
	{
	@_SaveStackLevels
	stopped
		{@_RestoreStackLevels true}
		{@_PopStackLevels false}
	ifelse
	}bind def
/@Arg
	{
	Adobe_CoolType_Data
		begin
		@opStackCountByLevel @opStackLevel 1 sub get
		begin
		args exch
		argCount 1 sub exch sub get
		end
		end
	}bind def
currentglobal true setglobal
/CTHasResourceForAllBug
	Level2?
		{
		1 dict dup
				/@shouldNotDisappearDictValue true def
				Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put
				begin
				count @_SaveStackLevels
					{(*){pop stop}128 string/Category resourceforall}
				stopped pop
				@_RestoreStackLevels
				currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll
					{
						 /@shouldNotDisappearDictValue known
								{
										 {
												end
												currentdict 1 index eq
													{pop exit}
												if
										 }
									 loop
								}
						 if
					}
					{
						 pop
						 end
					}
				ifelse
		}
		{false}
	ifelse
	def
true setglobal
/CTHasResourceStatusBug
	Level2?
		{
		mark
			{/steveamerige/Category resourcestatus}
		stopped
			{cleartomark true}
			{cleartomark currentglobal not}
		ifelse
		}
		{false}
	ifelse
	def
setglobal
/CTResourceStatus
		{
		mark 3 1 roll
		/Category findresource
			begin
			({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec
				{cleartomark false}
				{{3 2 roll pop true}{cleartomark false}ifelse}
			ifelse
			end
		}bind def
/CTWorkAroundBugs
	{
	Level2?
		{
		/cid_PreLoad/ProcSet resourcestatus
			{
			pop pop
			currentglobal
			mark
				{
				(*)
					{
					dup/CMap CTHasResourceStatusBug
						{CTResourceStatus}
						{resourcestatus}
					ifelse
						{
						pop dup 0 eq exch 1 eq or
							{
							dup/CMap findresource gcheck setglobal
							/CMap undefineresource
							}
							{
							pop CTHasResourceForAllBug
								{exit}
								{stop}
							ifelse
							}
						ifelse
						}
						{pop}
					ifelse
					}
				128 string/CMap resourceforall
				}
			stopped
				{cleartomark}
			stopped pop
			setglobal
			}
		if
		}
	if
	}bind def
/ds
	{
	Adobe_CoolType_Core
		begin
		CTWorkAroundBugs
		/mo/moveto load def
		/nf/newencodedfont load def
		/msf{makefont setfont}bind def
		/uf{dup undefinefont ct_VMDictUndef}bind def
		/ur/undefineresource load def
		/chp/charpath load def
		/awsh/awidthshow load def
		/wsh/widthshow load def
		/ash/ashow load def
		/@xshow/xshow load def
		/@yshow/yshow load def
		/@xyshow/xyshow load def
		/@cshow/cshow load def
		/sh/show load def
		/rp/repeat load def
		/.n/.notdef def
		end
		currentglobal false setglobal
	 userdict/Adobe_CoolType_Data 2 copy known not
		 {2 copy 10 dict put}
		if
		get
		begin
		/AddWidths? false def
		/CC 0 def
		/charcode 2 string def
		/@opStackCountByLevel 32 dict def
		/@opStackLevel 0 def
		/@dictStackCountByLevel 32 dict def
		/@dictStackLevel 0 def
		/InVMFontsByCMap 10 dict def
		/InVMDeepCopiedFonts 10 dict def
		end
		setglobal
	}bind def
/dt
	{
	currentdict Adobe_CoolType_Core eq
		{end}
	if
	}bind def
/ps
	{
	Adobe_CoolType_Core begin
	Adobe_CoolType_GVMFonts begin
	Adobe_CoolType_LVMFonts begin
	SharedFontDirectory begin
	}bind def
/pt
	{
	end
	end
	end
	end
	}bind def
/unload
	{
	systemdict/languagelevel known
		{
		systemdict/languagelevel get 2 ge
			{
			userdict/Adobe_CoolType_Core 2 copy known
				{undef}
				{pop pop}
			ifelse
			}
		if
		}
	if
	}bind def
/ndf
	{
	1 index where
		{pop pop pop}
		{dup xcheck{bind}if def}
	ifelse
	}def
/findfont systemdict
	begin
	userdict
		begin
		/globaldict where{/globaldict get begin}if
			dup where pop exch get
		/globaldict where{pop end}if
		end
	end
Adobe_CoolType_Core_Defined
	{/systemfindfont exch def}
	{
	/findfont 1 index def
	/systemfindfont exch def
	}
ifelse
/undefinefont
	{pop}ndf
/copyfont
	{
	currentglobal 3 1 roll
	1 index gcheck setglobal
	dup null eq{0}{dup length}ifelse
	2 index length add 1 add dict
		begin
		exch
			{
			1 index/FID eq
				{pop pop}
				{def}
			ifelse
			}
		forall
		dup null eq
			{pop}
			{{def}forall}
		ifelse
		currentdict
		end
	exch setglobal
	}bind def
/copyarray
	{
	currentglobal exch
	dup gcheck setglobal
	dup length array copy
	exch setglobal
	}bind def
/newencodedfont
	{
	currentglobal
		{
		SharedFontDirectory 3 index known
			{SharedFontDirectory 3 index get/FontReferenced known}
			{false}
		ifelse
		}
		{
		FontDirectory 3 index known
			{FontDirectory 3 index get/FontReferenced known}
			{
			SharedFontDirectory 3 index known
				{SharedFontDirectory 3 index get/FontReferenced known}
				{false}
			ifelse
			}
		ifelse
		}
	ifelse
	dup
		{
		3 index findfont/FontReferenced get
		2 index dup type/nametype eq
			{findfont}
		if ne
			{pop false}
		if
		}
	if
	dup
		{
		1 index dup type/nametype eq
			{findfont}
		 if
		dup/CharStrings known
			{
			/CharStrings get length
			4 index findfont/CharStrings get length
			ne
				{
				pop false
				}
			if 
			}
			{pop}
			ifelse
		}
	if
		{
		pop
		1 index findfont
		/Encoding get exch
		0 1 255
			{2 copy get 3 index 3 1 roll put}
		for
		pop pop pop
		}
		{
		currentglobal
	 4 1 roll
		dup type/nametype eq
		 {findfont}
	 if
	 dup gcheck setglobal
		dup dup maxlength 2 add dict
			begin
			exch
				{
				1 index/FID ne
				2 index/Encoding ne and
					{def}
					{pop pop}
				ifelse
				}
			forall
			/FontReferenced exch def
			/Encoding exch dup length array copy def
			/FontName 1 index dup type/stringtype eq{cvn}if def dup
			currentdict
			end
		definefont ct_VMDictPut
		setglobal
		}
	ifelse
	}bind def
/SetSubstituteStrategy
	{
	$SubstituteFont
		begin
		dup type/dicttype ne
			{0 dict}
		if
		currentdict/$Strategies known
			{
			exch $Strategies exch 
			2 copy known
				{
				get
				2 copy maxlength exch maxlength add dict
					begin
					{def}forall
					{def}forall
					currentdict
					dup/$Init known
						{dup/$Init get exec}
					if
					end
				/$Strategy exch def
				}
				{pop pop pop}
			ifelse
			}
			{pop pop}
		ifelse
		end
	}bind def
/scff
	{
	$SubstituteFont
		begin
		dup type/stringtype eq
			{dup length exch}
			{null}
		ifelse
		/$sname exch def
		/$slen exch def
		/$inVMIndex
			$sname null eq
				{
				1 index $str cvs
				dup length $slen sub $slen getinterval cvn
				}
				{$sname}
			ifelse def
		end
		{findfont}
	@Stopped
		{
		dup length 8 add string exch
		1 index 0(BadFont:)putinterval
		1 index exch 8 exch dup length string cvs putinterval cvn
			{findfont}
		@Stopped
			{pop/Courier findfont}
		if
		}
	if
	$SubstituteFont
		begin
		/$sname null def
		/$slen 0 def
		/$inVMIndex null def
		end
	}bind def
/isWidthsOnlyFont
	{
	dup/WidthsOnly known
		{pop pop true}
		{
		dup/FDepVector known
			{/FDepVector get{isWidthsOnlyFont dup{exit}if}forall}
			{
			dup/FDArray known
				{/FDArray get{isWidthsOnlyFont dup{exit}if}forall}
				{pop}
			ifelse
			}
		ifelse
		}
	ifelse
	}bind def
/ct_StyleDicts 4 dict dup begin
		 /Adobe-Japan1 4 dict dup begin
					 Level2?
								{
								/Serif
								/HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus
								{pop pop/HeiseiMin-W3}
								{
							/CIDFont/Category resourcestatus
							{
								pop pop
								/HeiseiMin-W3/CIDFont resourcestatus
								{pop pop/HeiseiMin-W3}
								{/Ryumin-Light}
								ifelse
							}
							{/Ryumin-Light}
							ifelse
								}
								ifelse
								def
								/SansSerif
								/HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus
								{pop pop/HeiseiKakuGo-W5}
								{
							/CIDFont/Category resourcestatus
							{
								pop pop
								/HeiseiKakuGo-W5/CIDFont resourcestatus
								{pop pop/HeiseiKakuGo-W5}
								{/GothicBBB-Medium}
								ifelse
							}
							{/GothicBBB-Medium}
							ifelse
								}
								ifelse
								def
								/HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus
								{pop pop/HeiseiMaruGo-W4}
								{
							/CIDFont/Category resourcestatus
							{
								pop pop
								/HeiseiMaruGo-W4/CIDFont resourcestatus
								{pop pop/HeiseiMaruGo-W4}
								{
									/Jun101-Light-RKSJ-H/Font resourcestatus
									{pop pop/Jun101-Light}
									{SansSerif}
									ifelse
								}
								ifelse
							}
							{
								/Jun101-Light-RKSJ-H/Font resourcestatus
								{pop pop/Jun101-Light}
								{SansSerif}
								ifelse
							}
							ifelse
								}
								ifelse
								/RoundSansSerif exch def
								/Default Serif def
								}
								{
								/Serif/Ryumin-Light def
								/SansSerif/GothicBBB-Medium def
								{
								(fonts/Jun101-Light-83pv-RKSJ-H)status
								}stopped
								{pop}{
										 {pop pop pop pop/Jun101-Light}
										 {SansSerif}
										 ifelse
										 /RoundSansSerif exch def
								}ifelse
								/Default Serif def
								}
					 ifelse
		 end
		 def
		 /Adobe-Korea1 4 dict dup begin
					/Serif/HYSMyeongJo-Medium def
					/SansSerif/HYGoThic-Medium def
					/RoundSansSerif SansSerif def
					/Default Serif def
		 end
		 def
		 /Adobe-GB1 4 dict dup begin
					/Serif/STSong-Light def
					/SansSerif/STHeiti-Regular def
					/RoundSansSerif SansSerif def
					/Default Serif def
		 end
		 def
		 /Adobe-CNS1 4 dict dup begin
					/Serif/MKai-Medium def
					/SansSerif/MHei-Medium def
					/RoundSansSerif SansSerif def
					/Default Serif def
		 end
		 def
end
def
Level2?{currentglobal true setglobal}if
/ct_BoldRomanWidthProc 
	{
	stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth
	0 0
	}bind def
/ct_Type0WidthProc 
	{
	 dup stringwidth 0 0 moveto 
	 2 index true charpath pathbbox
	 0 -1 
	 7 index 2 div .88 
	 setcachedevice2
	 pop
	0 0
	}bind def
/ct_Type0WMode1WidthProc 
	{
	 dup stringwidth 
	 pop 2 div neg -0.88
	2 copy
	moveto 
	0 -1
	 5 -1 roll true charpath pathbbox
	 setcachedevice
	}bind def
/cHexEncoding
[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12
/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25
/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38
/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B
/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E
/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71
/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84
/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97
/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA
/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD
/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0
/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3
/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6
/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def
/ct_BoldBaseFont 
	 11 dict begin
		/FontType 3 def
		/FontMatrix[1 0 0 1 0 0]def
		/FontBBox[0 0 1 1]def
		/Encoding cHexEncoding def 
		/_setwidthProc/ct_BoldRomanWidthProc load def
		/_bcstr1 1 string def
		/BuildChar
		{
			exch begin
				_basefont setfont
				_bcstr1 dup 0 4 -1 roll put
				dup 
				_setwidthProc
				3 copy 
				moveto				
				show
				_basefonto setfont
				moveto
				show
			end
		}bind def
		 currentdict
	 end 
def
systemdict/composefont known
{
/ct_DefineIdentity-H
{
	/Identity-H/CMap resourcestatus
	{
		pop pop
	}
	{
		/CIDInit/ProcSet findresource begin
		 12 dict begin
		 begincmap
		 /CIDSystemInfo 3 dict dup begin
			 /Registry(Adobe)def
			 /Ordering(Identity)def
			 /Supplement 0 def
		 end def
		 /CMapName/Identity-H def
		 /CMapVersion 1.000 def
		 /CMapType 1 def
		 1 begincodespacerange
		 <0000><FFFF>
		 endcodespacerange
		 1 begincidrange
		 <0000><FFFF>0
		 endcidrange
		 endcmap
		 CMapName currentdict/CMap defineresource pop
		 end
		 end
	 }
	 ifelse
}
def
/ct_BoldBaseCIDFont 
	 11 dict begin
		/CIDFontType 1 def
		/CIDFontName/ct_BoldBaseCIDFont def
		/FontMatrix[1 0 0 1 0 0]def
		/FontBBox[0 0 1 1]def
		/_setwidthProc/ct_Type0WidthProc load def
		/_bcstr2 2 string def
		/BuildGlyph
		{
			exch begin		 
				_basefont setfont
				_bcstr2 1 2 index 256 mod put
				_bcstr2 0 3 -1 roll 256 idiv put
				_bcstr2 dup _setwidthProc		 
				3 copy 
				moveto
				show
				_basefonto setfont
				moveto
				show
			end
		}bind def
		 currentdict
	 end 
def
}if
Level2?{setglobal}if
/ct_CopyFont{
	{
		1 index/FID ne 2 index/UniqueID ne and
		{def}{pop pop}ifelse
	}forall
}bind def
/ct_Type0CopyFont 
{
	exch
	dup length dict
	begin
	ct_CopyFont
	[
	exch
	FDepVector 
	{
		 dup/FontType get 0 eq
		{	
		1 index ct_Type0CopyFont 
		/_ctType0 exch definefont
		}
		{
		/_ctBaseFont exch
		2 index exec
		}
		 ifelse 
		 exch
	}
	forall 
	pop
	]				
	/FDepVector exch def
	currentdict
	end
}bind def
/ct_MakeBoldFont
{
	 dup/ct_SyntheticBold known
	{
		dup length 3 add dict begin 
		ct_CopyFont 
		/ct_StrokeWidth .03 0 FontMatrix idtransform pop def 
		/ct_SyntheticBold true def
		currentdict 
		end 
		definefont
	}
	{
		dup dup length 3 add dict
		begin
			ct_CopyFont
			/PaintType 2 def
			/StrokeWidth .03 0 FontMatrix idtransform pop def
			/dummybold currentdict
		end
		definefont
		dup/FontType get dup 9 ge exch 11 le and 
		{
			ct_BoldBaseCIDFont
			dup length 3 add dict copy begin
			dup/CIDSystemInfo get/CIDSystemInfo exch def
			ct_DefineIdentity-H
			/_Type0Identity/Identity-H 3 -1 roll[exch]composefont
			/_basefont exch def
			/_Type0Identity/Identity-H 3 -1 roll[exch]composefont
			/_basefonto exch def
			currentdict
			end
			/CIDFont defineresource
		}
		{
			ct_BoldBaseFont
			dup length 3 add dict copy begin
			/_basefont exch def
			/_basefonto exch def
			currentdict
			end
			definefont
		}
		ifelse
	}
	ifelse
}bind def
/ct_MakeBold{
	1 index 
	1 index
	findfont
	currentglobal 5 1 roll
	dup gcheck setglobal
		dup
		 /FontType get 0 eq
			{
				dup/WMode known{dup/WMode get 1 eq}{false}ifelse
				version length 4 ge
				and
					{version 0 4 getinterval cvi 2015 ge}
					{true}
				ifelse 
					{/ct_Type0WidthProc}
					{/ct_Type0WMode1WidthProc}
				ifelse
				ct_BoldBaseFont/_setwidthProc 3 -1 roll load put
						{ct_MakeBoldFont}ct_Type0CopyFont definefont
			}
			{
				dup/_fauxfont known not 1 index/SubstMaster known not and
				{
					 ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put
					 ct_MakeBoldFont 
				}
				{
				2 index 2 index eq
					{exch pop	}
					{
						dup length dict begin
						ct_CopyFont
						currentdict
						end
						definefont 
					}
				ifelse
				}
			ifelse
			}
		 ifelse
		 pop pop pop
		 setglobal
}bind def
/?str1 256 string def
/?set
	{
	$SubstituteFont
		begin
		/$substituteFound false def
		/$fontname 1 index def
		/$doSmartSub false def
		end
	dup
	 findfont
	$SubstituteFont
		begin
		$substituteFound
			{false}
			{
			dup/FontName known
				{
				dup/FontName get $fontname eq
				1 index/DistillerFauxFont known not and
				/currentdistillerparams where
					{pop false 2 index isWidthsOnlyFont not and}
				if
				}
				{false}
			ifelse
			}
		ifelse
		exch pop
		/$doSmartSub true def
		end
		{
		5 1 roll pop pop pop pop
		findfont
		}
		{
		1 index
		findfont
		dup/FontType get 3 eq
		{
			6 1 roll pop pop pop pop pop false
		}
		{pop true}
		ifelse
		{
		$SubstituteFont
		begin
		pop pop
		/$styleArray 1 index def
		/$regOrdering 2 index def
		pop pop
		0 1 $styleArray length 1 sub
		{
			$styleArray exch get
			ct_StyleDicts $regOrdering
			2 copy known
			{
				get
				exch 2 copy known not
				{pop/Default}
				if
				get
				dup type/nametype eq
				{
				?str1 cvs length dup 1 add exch
				?str1 exch(-)putinterval
				exch dup length exch ?str1 exch 3 index exch putinterval
				add ?str1 exch 0 exch getinterval cvn
				}
				{
				pop pop/Unknown
				}
				ifelse
			}
			{
				pop pop pop pop/Unknown
			}
			ifelse
		}
		for
		end
		findfont 
		}if
		}
	ifelse
	currentglobal false setglobal 3 1 roll
	null copyfont definefont pop
	setglobal
	}bind def
setpacking
userdict/$SubstituteFont 25 dict put
1 dict
	begin
	/SubstituteFont
		dup $error exch 2 copy known
			{get}
			{pop pop{pop/Courier}bind}
		ifelse def
	/currentdistillerparams where dup
		{
		pop pop
		currentdistillerparams/CannotEmbedFontPolicy 2 copy known
			{get/Error eq}
			{pop pop false}
		ifelse
		}
	if not
		{
		countdictstack array dictstack 0 get
			begin
			userdict
				begin
				$SubstituteFont
					begin
					/$str 128 string def
					/$fontpat 128 string def
					/$slen 0 def
					/$sname null def
					/$match false def
					/$fontname null def
					/$substituteFound false def
					/$inVMIndex null def
					/$doSmartSub true def
					/$depth 0 def
					/$fontname null def
					/$italicangle 26.5 def
					/$dstack null def
					/$Strategies 10 dict dup
						begin
						/$Type3Underprint
							{
							currentglobal exch false setglobal
							11 dict
								begin
								/UseFont exch
									$WMode 0 ne
										{
										dup length dict copy
										dup/WMode $WMode put
										/UseFont exch definefont
										}
									if def
								/FontName $fontname dup type/stringtype eq{cvn}if def
								/FontType 3 def
								/FontMatrix[.001 0 0 .001 0 0]def
								/Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def
								/FontBBox[0 0 0 0]def
								/CCInfo 7 dict dup
									begin
									/cc null def
									/x 0 def
									/y 0 def
									end def
								/BuildChar
									{
									exch
										begin
										CCInfo
											begin
											1 string dup 0 3 index put exch pop
											/cc exch def
											UseFont 1000 scalefont setfont
											cc stringwidth/y exch def/x exch def
											x y setcharwidth
											$SubstituteFont/$Strategy get/$Underprint get exec
											0 0 moveto cc show
											x y moveto
											end
										end
									}bind def
								currentdict
								end
							exch setglobal
							}bind def
						/$GetaTint
							2 dict dup
								begin
								/$BuildFont
									{
									dup/WMode known
										{dup/WMode get}
										{0}
									ifelse
									/$WMode exch def
									$fontname exch
									dup/FontName known
										{
										dup/FontName get
										dup type/stringtype eq{cvn}if
										}
										{/unnamedfont}
									ifelse
									exch
									Adobe_CoolType_Data/InVMDeepCopiedFonts get
									1 index/FontName get known
										{
										pop
										Adobe_CoolType_Data/InVMDeepCopiedFonts get
										1 index get
										null copyfont
										}
										{$deepcopyfont}
									ifelse
									exch 1 index exch/FontBasedOn exch put
									dup/FontName $fontname dup type/stringtype eq{cvn}if put
									definefont
									Adobe_CoolType_Data/InVMDeepCopiedFonts get
										begin
										dup/FontBasedOn get 1 index def
										end
									}bind def
								/$Underprint
									{
									gsave
									x abs y abs gt
										{/y 1000 def}
										{/x -1000 def 500 120 translate}
									ifelse
									Level2?
										{
										[/Separation(All)/DeviceCMYK{0 0 0 1 pop}]
										setcolorspace
										}
										{0 setgray}
									ifelse
									10 setlinewidth
									x .8 mul
									[7 3]
										{
										y mul 8 div 120 sub x 10 div exch moveto
										0 y 4 div neg rlineto
										dup 0 rlineto
										0 y 4 div rlineto
										closepath
										gsave
										Level2?
											{.2 setcolor}
											{.8 setgray}
										ifelse
										fill grestore
										stroke
										}
									forall
									pop
									grestore
									}bind def
								end def
						/$Oblique
							1 dict dup
								begin
								/$BuildFont
									{
									currentglobal exch dup gcheck setglobal
									null copyfont
										begin
										/FontBasedOn
										currentdict/FontName known
											{
											FontName
											dup type/stringtype eq{cvn}if
											}
											{/unnamedfont}
										ifelse
										def
										/FontName $fontname dup type/stringtype eq{cvn}if def
										/currentdistillerparams where
											{pop}
											{
											/FontInfo currentdict/FontInfo known
												{FontInfo null copyfont}
												{2 dict}
											ifelse
											dup
												begin
												/ItalicAngle $italicangle def
												/FontMatrix FontMatrix
												[1 0 ItalicAngle dup sin exch cos div 1 0 0]
												matrix concatmatrix readonly
												end
											4 2 roll def
											def
											}
										ifelse
										FontName currentdict
										end
									definefont
									exch setglobal
									}bind def
								end def
						/$None
							1 dict dup
								begin
								/$BuildFont{}bind def
								end def
						end def
					/$Oblique SetSubstituteStrategy
					/$findfontByEnum
						{
						dup type/stringtype eq{cvn}if
						dup/$fontname exch def
						$sname null eq
							{$str cvs dup length $slen sub $slen getinterval}
							{pop $sname}
						ifelse
						$fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval
						/$match false def
						$SubstituteFont/$dstack countdictstack array dictstack put
						mark
							{
							$fontpat 0 $slen 7 add getinterval
								{/$match exch def exit}
							$str filenameforall
							}
						stopped
							{
							cleardictstack
							currentdict
							true
							$SubstituteFont/$dstack get
								{
								exch
									{
									1 index eq
										{pop false}
										{true}
									ifelse
									}
									{begin false}
								ifelse
								}
							forall
							pop
							}
						if
						cleartomark
						/$slen 0 def
						$match false ne
							{$match(fonts/)anchorsearch pop pop cvn}
							{/Courier}
						ifelse
						}bind def
					/$ROS 1 dict dup
						begin
						/Adobe 4 dict dup
							begin
							/Japan1 [/Ryumin-Light/HeiseiMin-W3
										 /GothicBBB-Medium/HeiseiKakuGo-W5
										 /HeiseiMaruGo-W4/Jun101-Light]def
							/Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def
							/GB1	 [/STSong-Light/STHeiti-Regular]def
							/CNS1	[/MKai-Medium/MHei-Medium]def
							end def
						end def
					/$cmapname null def
					/$deepcopyfont
						{
						dup/FontType get 0 eq
							{
							1 dict dup/FontName/copied put copyfont
								begin
								/FDepVector FDepVector copyarray
								0 1 2 index length 1 sub
									{
									2 copy get $deepcopyfont
									dup/FontName/copied put
									/copied exch definefont
									3 copy put pop pop
									}
								for
								def
								currentdict
								end
							}
							{$Strategies/$Type3Underprint get exec}
						ifelse
						}bind def
					/$buildfontname
						{
						dup/CIDFont findresource/CIDSystemInfo get
							begin
							Registry length Ordering length Supplement 8 string cvs
							3 copy length 2 add add add string
							dup 5 1 roll dup 0 Registry putinterval
							dup 4 index(-)putinterval
							dup 4 index 1 add Ordering putinterval
							4 2 roll add 1 add 2 copy(-)putinterval
							end
						1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch
						anchorsearch
							{pop pop 3 2 roll putinterval cvn/$cmapname exch def}
							{pop pop pop pop pop}
						ifelse
						length
						$str 1 index(-)putinterval 1 add
						$str 1 index $cmapname $fontpat cvs putinterval
						$cmapname length add
						$str exch 0 exch getinterval cvn
						}bind def
					/$findfontByROS
						{
						/$fontname exch def
						$ROS Registry 2 copy known
							{
							get Ordering 2 copy known
								{get}
								{pop pop[]}
							ifelse
							}
							{pop pop[]}
						ifelse
						false exch
							{
							dup/CIDFont resourcestatus
								{
								pop pop
								save
								1 index/CIDFont findresource
								dup/WidthsOnly known
									{dup/WidthsOnly get}
									{false}
								ifelse
								exch pop
								exch restore
									{pop}
									{exch pop true exit}
								ifelse
								}
								{pop}
							ifelse
							}
						forall
							{$str cvs $buildfontname}
							{
							false(*)
								{
								save exch
								dup/CIDFont findresource
								dup/WidthsOnly known
									{dup/WidthsOnly get not}
									{true}
								ifelse
								exch/CIDSystemInfo get
								dup/Registry get Registry eq
								exch/Ordering get Ordering eq and and
									{exch restore exch pop true exit}
									{pop restore}
								ifelse
								}
							$str/CIDFont resourceforall
								{$buildfontname}
								{$fontname $findfontByEnum}
							ifelse
							}
						ifelse
						}bind def
					end
				end
				currentdict/$error known currentdict/languagelevel known and dup
					{pop $error/SubstituteFont known}
				if
				dup
					{$error}
					{Adobe_CoolType_Core}
				ifelse
				begin
					{
					/SubstituteFont
					/CMap/Category resourcestatus
						{
						pop pop
						{
						$SubstituteFont
							begin
							/$substituteFound true def
							dup length $slen gt
							$sname null ne or
							$slen 0 gt and
								{
								$sname null eq
									{dup $str cvs dup length $slen sub $slen getinterval cvn}
									{$sname}
								ifelse
								Adobe_CoolType_Data/InVMFontsByCMap get
								1 index 2 copy known
									{
									get
									false exch
										{
										pop
										currentglobal
											{
											GlobalFontDirectory 1 index known
												{exch pop true exit}
												{pop}
											ifelse
											}
											{
											FontDirectory 1 index known
												{exch pop true exit}
												{
												GlobalFontDirectory 1 index known
													{exch pop true exit}
													{pop}
												ifelse
												}
											ifelse
											}
										ifelse
										}
									forall
									}
									{pop pop false}
								ifelse
									{
									exch pop exch pop
									}
									{
									dup/CMap resourcestatus
										{
										pop pop
										dup/$cmapname exch def
										/CMap findresource/CIDSystemInfo get{def}forall
										$findfontByROS
										}
										{
										128 string cvs
										dup(-)search
											{
											3 1 roll search
												{
												3 1 roll pop
													{dup cvi}
												stopped
													{pop pop pop pop pop $findfontByEnum}
													{
													4 2 roll pop pop
													exch length
													exch
													2 index length
													2 index
													sub
													exch 1 sub -1 0
														{
														$str cvs dup length
														4 index
														0
														4 index
														4 3 roll add
														getinterval
														exch 1 index exch 3 index exch
														putinterval
														dup/CMap resourcestatus
															{
															pop pop
															4 1 roll pop pop pop
															dup/$cmapname exch def
															/CMap findresource/CIDSystemInfo get{def}forall
															$findfontByROS
															true exit
															}
															{pop}
														ifelse
														}
													for
													dup type/booleantype eq
														{pop}
														{pop pop pop $findfontByEnum}
													ifelse
													}
												ifelse
												}
												{pop pop pop $findfontByEnum}
											ifelse
											}
											{pop pop $findfontByEnum}
										ifelse
										}
									ifelse
									}
								ifelse
								}
								{//SubstituteFont exec}
							ifelse
							/$slen 0 def
							end
						}
						}
						{
						{
						$SubstituteFont
							begin
							/$substituteFound true def
							dup length $slen gt
							$sname null ne or
							$slen 0 gt and
								{$findfontByEnum}
								{//SubstituteFont exec}
							ifelse
							end
						}
						}
					ifelse
					bind readonly def
					Adobe_CoolType_Core/scfindfont/systemfindfont load put
					}
					{
					/scfindfont
						{
						$SubstituteFont
							begin
							dup systemfindfont
							dup/FontName known
								{dup/FontName get dup 3 index ne}
								{/noname true}
							ifelse
							dup
								{
								/$origfontnamefound 2 index def
								/$origfontname 4 index def/$substituteFound true def
								}
							if
							exch pop
								{
								$slen 0 gt
								$sname null ne
								3 index length $slen gt or and
									{
									pop dup $findfontByEnum findfont
									dup maxlength 1 add dict
										begin
											{1 index/FID eq{pop pop}{def}ifelse}
										forall
										currentdict
										end
									definefont
									dup/FontName known{dup/FontName get}{null}ifelse
									$origfontnamefound ne
										{
										$origfontname $str cvs print
										( substitution revised, using )print
										dup/FontName known
											{dup/FontName get}{(unspecified font)}
										ifelse
										$str cvs print(.\n)print
										}
									if
									}
									{exch pop}
								ifelse
								}
								{exch pop}
							ifelse
							end
						}bind def
					}
				ifelse
				end
			end
		Adobe_CoolType_Core_Defined not
			{
			Adobe_CoolType_Core/findfont
				{
				$SubstituteFont
					begin
					$depth 0 eq
						{
						/$fontname 1 index dup type/stringtype ne{$str cvs}if def
						/$substituteFound false def
						}
					if
					/$depth $depth 1 add def
					end
				scfindfont
				$SubstituteFont
					begin
					/$depth $depth 1 sub def
					$substituteFound $depth 0 eq and
						{
						$inVMIndex null ne
							{dup $inVMIndex $AddInVMFont}
						if
						$doSmartSub
							{
							currentdict/$Strategy known
								{$Strategy/$BuildFont get exec}
							if
							}
						if
						}
					if
					end
				}bind put
			}
		if
		}
	if
	end
/$AddInVMFont
	{
	exch/FontName 2 copy known
		{
		get
		1 dict dup begin exch 1 index gcheck def end exch
		Adobe_CoolType_Data/InVMFontsByCMap get exch
		$DictAdd
		}
		{pop pop pop}
	ifelse
	}bind def
/$DictAdd
	{
	2 copy known not
		{2 copy 4 index length dict put}
	if
	Level2? not
		{
		2 copy get dup maxlength exch length 4 index length add lt
		2 copy get dup length 4 index length add exch maxlength 1 index lt
			{
			2 mul dict
				begin
				2 copy get{forall}def
				2 copy currentdict put
				end
			}
			{pop}
		ifelse
		}
	if
	get
		begin
			{def}
		forall
		end
	}bind def
end
end
%%EndResource
currentglobal true setglobal
%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0
%%Copyright: Copyright 1987-2006 Adobe Systems Incorporated.
%%Version: 1.23 0
systemdict/languagelevel known dup
	{currentglobal false setglobal}
	{false}
ifelse
exch
userdict/Adobe_CoolType_Utility 2 copy known
	{2 copy get dup maxlength 27 add dict copy}
	{27 dict}
ifelse put
Adobe_CoolType_Utility
	begin
	/@eexecStartData
		 <BAB431EA07F209EB8C4348311481D9D3F76E3D15246555577D87BC510ED54E
		 118C39697FA9F6DB58128E60EB8A12FA24D7CDD2FA94D221FA9EC8DA3E5E6A1C
		 4ACECC8C2D39C54E7C946031DD156C3A6B4A09AD29E1867A>def
	/@recognizeCIDFont null def
	/ct_Level2? exch def
	/ct_Clone? 1183615869 internaldict dup
			/CCRun known not
			exch/eCCRun known not
			ct_Level2? and or def
ct_Level2?
	{globaldict begin currentglobal true setglobal}
if
	/ct_AddStdCIDMap
		ct_Level2?
			{{
				mark
				Adobe_CoolType_Utility/@recognizeCIDFont currentdict put
					{
					((Hex)57 StartData
					 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0
					 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60
					 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8
					 cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec
					}
				stopped
					{
					 cleartomark
					 Adobe_CoolType_Utility/@recognizeCIDFont get
					 countdictstack dup array dictstack
					 exch 1 sub -1 0
						 {
						 2 copy get 3 index eq
								{1 index length exch sub 1 sub{end}repeat exit}
								{pop}
						 ifelse
						 }
					 for
					 pop pop
					 Adobe_CoolType_Utility/@eexecStartData get eexec
					}
					{cleartomark}
				ifelse
			}}
			{{
				Adobe_CoolType_Utility/@eexecStartData get eexec
			}}
		ifelse bind def
userdict/cid_extensions known
dup{cid_extensions/cid_UpdateDB known and}if
	{
	 cid_extensions
	 begin
	/cid_GetCIDSystemInfo
		{
		 1 index type/stringtype eq
			{exch cvn exch}
		 if
		 cid_extensions
			 begin
			 dup load 2 index known
				{
				 2 copy
				 cid_GetStatusInfo
				 dup null ne
					{
					 1 index load
					 3 index get
					 dup null eq
						 {pop pop cid_UpdateDB}
						 {
						 exch
						 1 index/Created get eq
							 {exch pop exch pop}
							 {pop cid_UpdateDB}
						 ifelse
						 }
					 ifelse
					}
					{pop cid_UpdateDB}
				 ifelse
				}
				{cid_UpdateDB}
			 ifelse
			 end
		}bind def
	 end
	}
if
ct_Level2?
	{end setglobal}
if
	/ct_UseNativeCapability? systemdict/composefont known def
	/ct_MakeOCF 35 dict def
	/ct_Vars 25 dict def
	/ct_GlyphDirProcs 6 dict def
	/ct_BuildCharDict 15 dict dup
		begin
		/charcode 2 string def
		/dst_string 1500 string def
		/nullstring()def
		/usewidths? true def
		end def
	ct_Level2?{setglobal}{pop}ifelse
	ct_GlyphDirProcs
		begin
		/GetGlyphDirectory
			{
			systemdict/languagelevel known
				{pop/CIDFont findresource/GlyphDirectory get}
				{
				1 index/CIDFont findresource/GlyphDirectory
				get dup type/dicttype eq
					{
					dup dup maxlength exch length sub 2 index lt
						{
						dup length 2 index add dict copy 2 index
						/CIDFont findresource/GlyphDirectory 2 index put
						}
					if
					}
				if
				exch pop exch pop
				}
			ifelse
			+
			}def
		/+
			{
			systemdict/languagelevel known
				{
				currentglobal false setglobal
				3 dict begin
					/vm exch def
				}
				{1 dict begin}
			ifelse
			/$ exch def
			systemdict/languagelevel known
				{
				vm setglobal
				/gvm currentglobal def
				$ gcheck setglobal
				}
			if
			?{$ begin}if
			}def
		/?{$ type/dicttype eq}def
		/|{
			userdict/Adobe_CoolType_Data known
				{
			Adobe_CoolType_Data/AddWidths? known
				{
				 currentdict Adobe_CoolType_Data
					begin
					 begin
						AddWidths?
								{
								Adobe_CoolType_Data/CC 3 index put
								?{def}{$ 3 1 roll put}ifelse
								CC charcode exch 1 index 0 2 index 256 idiv put
								1 index exch 1 exch 256 mod put
								stringwidth 2 array astore
								currentfont/Widths get exch CC exch put
								}
								{?{def}{$ 3 1 roll put}ifelse}
							ifelse
					end
				end
				}
				{?{def}{$ 3 1 roll put}ifelse}	ifelse
				}
				{?{def}{$ 3 1 roll put}ifelse}
			ifelse
			}def
		/!
			{
			?{end}if
			systemdict/languagelevel known
				{gvm setglobal}
			if
			end
			}def
		/:{string currentfile exch readstring pop}executeonly def
		end
	ct_MakeOCF
		begin
		/ct_cHexEncoding
		[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12
		/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25
		/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38
		/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B
		/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E
		/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71
		/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84
		/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97
		/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA
		/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD
		/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0
		/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3
		/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6
		/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def
		/ct_CID_STR_SIZE 8000 def
		/ct_mkocfStr100 100 string def
		/ct_defaultFontMtx[.001 0 0 .001 0 0]def
		/ct_1000Mtx[1000 0 0 1000 0 0]def
		/ct_raise{exch cvx exch errordict exch get exec stop}bind def
		/ct_reraise
			{cvx $error/errorname get(Error: )print dup(						 )cvs print
					errordict exch get exec stop
			}bind def
		/ct_cvnsi
			{
			1 index add 1 sub 1 exch 0 4 1 roll
				{
				2 index exch get
				exch 8 bitshift
				add
				}
			for
			exch pop
			}bind def
		/ct_GetInterval
			{
			Adobe_CoolType_Utility/ct_BuildCharDict get
				begin
				/dst_index 0 def
				dup dst_string length gt
					{dup string/dst_string exch def}
				if
				1 index ct_CID_STR_SIZE idiv
				/arrayIndex exch def
				2 index arrayIndex get
				2 index
				arrayIndex ct_CID_STR_SIZE mul
				sub
					{
					dup 3 index add 2 index length le
						{
						2 index getinterval
						dst_string dst_index 2 index putinterval
						length dst_index add/dst_index exch def
						exit
						}
						{
						1 index length 1 index sub
						dup 4 1 roll
						getinterval
						dst_string dst_index 2 index putinterval
						pop dup dst_index add/dst_index exch def
						sub
						/arrayIndex arrayIndex 1 add def
						2 index dup length arrayIndex gt
							 {arrayIndex get}
							 {
							 pop
							 exit
							 }
						ifelse
						0
						}
					ifelse
					}
				loop
				pop pop pop
				dst_string 0 dst_index getinterval
				end
			}bind def
		ct_Level2?
			{
			/ct_resourcestatus
			currentglobal mark true setglobal
				{/unknowninstancename/Category resourcestatus}
			stopped
				{cleartomark setglobal true}
				{cleartomark currentglobal not exch setglobal}
			ifelse
				{
					{
					mark 3 1 roll/Category findresource
						begin
						ct_Vars/vm currentglobal put
						({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec
							{cleartomark false}
							{{3 2 roll pop true}{cleartomark false}ifelse}
						ifelse
						ct_Vars/vm get setglobal
						end
					}
				}
				{{resourcestatus}}
			ifelse bind def
			/CIDFont/Category ct_resourcestatus
				{pop pop}
				{
				currentglobal true setglobal
				/Generic/Category findresource
				dup length dict copy
				dup/InstanceType/dicttype put
				/CIDFont exch/Category defineresource pop
				setglobal
				}
			ifelse
			ct_UseNativeCapability?
				{
				/CIDInit/ProcSet findresource begin
				12 dict begin
				begincmap
				/CIDSystemInfo 3 dict dup begin
				 /Registry(Adobe)def
				 /Ordering(Identity)def
				 /Supplement 0 def
				end def
				/CMapName/Identity-H def
				/CMapVersion 1.000 def
				/CMapType 1 def
				1 begincodespacerange
				<0000><FFFF>
				endcodespacerange
				1 begincidrange
				<0000><FFFF>0
				endcidrange
				endcmap
				CMapName currentdict/CMap defineresource pop
				end
				end
				}
			if
			}
			{
			/ct_Category 2 dict begin
			/CIDFont 10 dict def
			/ProcSet	2 dict def
			currentdict
			end
			def
			/defineresource
				{
				ct_Category 1 index 2 copy known
					{
					get
					dup dup maxlength exch length eq
						{
						dup length 10 add dict copy
						ct_Category 2 index 2 index put
						}
					if
					3 index 3 index put
					pop exch pop
					}
					{pop pop/defineresource/undefined ct_raise}
				ifelse
				}bind def
			/findresource
				{
				ct_Category 1 index 2 copy known
					{
					get
					2 index 2 copy known
						{get 3 1 roll pop pop}
						{pop pop/findresource/undefinedresource ct_raise}
					ifelse
					}
					{pop pop/findresource/undefined ct_raise}
				ifelse
				}bind def
			/resourcestatus
				{
				ct_Category 1 index 2 copy known
					{
					get
					2 index known
					exch pop exch pop
						{
						0 -1 true
						}
						{
						false
						}
					ifelse
					}
					{pop pop/findresource/undefined ct_raise}
				ifelse
				}bind def
			/ct_resourcestatus/resourcestatus load def
			}
		ifelse
		/ct_CIDInit 2 dict
			begin
			/ct_cidfont_stream_init
				{
					{
					dup(Binary)eq
						{
						pop
						null
						currentfile
						ct_Level2?
							{
								{cid_BYTE_COUNT()/SubFileDecode filter}
							stopped
								{pop pop pop}
							if
							}
						if
						/readstring load
						exit
						}
					if
					dup(Hex)eq
						{
						pop
						currentfile
						ct_Level2?
							{
								{null exch/ASCIIHexDecode filter/readstring}
							stopped
								{pop exch pop(>)exch/readhexstring}
							if
							}
							{(>)exch/readhexstring}
						ifelse
						load
						exit
						}
					if
					/StartData/typecheck ct_raise
					}
				loop
				cid_BYTE_COUNT ct_CID_STR_SIZE le
					{
					2 copy cid_BYTE_COUNT string exch exec
					pop
					1 array dup
					3 -1 roll
					0 exch put
					}
					{
					cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi
					dup array exch 2 sub 0 exch 1 exch
						{
						2 copy
						5 index
						ct_CID_STR_SIZE
						string
						6 index exec
						pop
						put
						pop
						}
					for
					2 index
					cid_BYTE_COUNT ct_CID_STR_SIZE mod string
					3 index exec
					pop
					1 index exch
					1 index length 1 sub
					exch put
					}
				ifelse
				cid_CIDFONT exch/GlyphData exch put
				2 index null eq
					{
					pop pop pop
					}
					{
					pop/readstring load
					1 string exch
						{
						3 copy exec
						pop
						dup length 0 eq
							{
							pop pop pop pop pop
							true exit
							}
						if
						4 index
						eq
							{
							pop pop pop pop
							false exit
							}
						if
						}
					loop
					pop
					}
				ifelse
				}bind def
			/StartData
				{
				mark
					{
					currentdict
					dup/FDArray get 0 get/FontMatrix get
					0 get 0.001 eq
						{
						dup/CDevProc known not
							{
							/CDevProc 1183615869 internaldict/stdCDevProc 2 copy known
								{get}
								{
								pop pop
								{pop pop pop pop pop 0 -1000 7 index 2 div 880}
								}
							ifelse
							def
							}
						if
						}
						{
						/CDevProc
							{
							 pop pop pop pop pop
							 0
							 1 cid_temp/cid_CIDFONT get
							/FDArray get 0 get
							/FontMatrix get 0 get div
							 7 index 2 div
							 1 index 0.88 mul
							}def
						}
					ifelse
					/cid_temp 15 dict def
					cid_temp
						begin
						/cid_CIDFONT exch def
						3 copy pop
						dup/cid_BYTE_COUNT exch def 0 gt
							{
							ct_cidfont_stream_init
							FDArray
								{
								/Private get
								dup/SubrMapOffset known
									{
									begin
									/Subrs SubrCount array def
									Subrs
									SubrMapOffset
									SubrCount
									SDBytes
									ct_Level2?
										{
										currentdict dup/SubrMapOffset undef
										dup/SubrCount undef
										/SDBytes undef
										}
									if
									end
									/cid_SD_BYTES exch def
									/cid_SUBR_COUNT exch def
									/cid_SUBR_MAP_OFFSET exch def
									/cid_SUBRS exch def
									cid_SUBR_COUNT 0 gt
										{
										GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval
										0 cid_SD_BYTES ct_cvnsi
										0 1 cid_SUBR_COUNT 1 sub
											{
											exch 1 index
											1 add
											cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add
											GlyphData exch cid_SD_BYTES ct_GetInterval
											0 cid_SD_BYTES ct_cvnsi
											cid_SUBRS 4 2 roll
											GlyphData exch
											4 index
											1 index
											sub
											ct_GetInterval
											dup length string copy put
											}
										for
										pop
										}
									if
									}
									{pop}
								ifelse
								}
							forall
							}
						if
						cleartomark pop pop
						end
					CIDFontName currentdict/CIDFont defineresource pop
					end end
					}
				stopped
					{cleartomark/StartData ct_reraise}
				if
				}bind def
			currentdict
			end def
		/ct_saveCIDInit
			{
			/CIDInit/ProcSet ct_resourcestatus
				{true}
				{/CIDInitC/ProcSet ct_resourcestatus}
			ifelse
				{
				pop pop
				/CIDInit/ProcSet findresource
				ct_UseNativeCapability?
					{pop null}
					{/CIDInit ct_CIDInit/ProcSet defineresource pop}
				ifelse
				}
				{/CIDInit ct_CIDInit/ProcSet defineresource pop null}
			ifelse
			ct_Vars exch/ct_oldCIDInit exch put
			}bind def
		/ct_restoreCIDInit
			{
			ct_Vars/ct_oldCIDInit get dup null ne
				{/CIDInit exch/ProcSet defineresource pop}
				{pop}
			ifelse
			}bind def
		/ct_BuildCharSetUp
			{
			1 index
				begin
				CIDFont
					begin
					Adobe_CoolType_Utility/ct_BuildCharDict get
						begin
						/ct_dfCharCode exch def
						/ct_dfDict exch def
						CIDFirstByte ct_dfCharCode add
						dup CIDCount ge
							{pop 0}
						if
						/cid exch def
							{
							GlyphDirectory cid 2 copy known
								{get}
								{pop pop nullstring}
							ifelse
							dup length FDBytes sub 0 gt
								{
								dup
								FDBytes 0 ne
									{0 FDBytes ct_cvnsi}
									{pop 0}
								ifelse
								/fdIndex exch def
								dup length FDBytes sub FDBytes exch getinterval
								/charstring exch def
								exit
								}
								{
								pop
								cid 0 eq
									{/charstring nullstring def exit}
								if
								/cid 0 def
								}
							ifelse
							}
						loop
			}def
		/ct_SetCacheDevice
			{
			0 0 moveto
			dup stringwidth
			3 -1 roll
			true charpath
			pathbbox
			0 -1000
			7 index 2 div 880
			setcachedevice2
			0 0 moveto
			}def
		/ct_CloneSetCacheProc
			{
			1 eq
				{
				stringwidth
				pop -2 div -880
				0 -1000 setcharwidth
				moveto
				}
				{
				usewidths?
					{
					currentfont/Widths get cid
					2 copy known
						{get exch pop aload pop}
						{pop pop stringwidth}
					ifelse
					}
					{stringwidth}
				ifelse
				setcharwidth
				0 0 moveto
				}
			ifelse
			}def
		/ct_Type3ShowCharString
			{
			ct_FDDict fdIndex 2 copy known
				{get}
				{
				currentglobal 3 1 roll
				1 index gcheck setglobal
				ct_Type1FontTemplate dup maxlength dict copy
					begin
					FDArray fdIndex get
					dup/FontMatrix 2 copy known
						{get}
						{pop pop ct_defaultFontMtx}
					ifelse
					/FontMatrix exch dup length array copy def
					/Private get
					/Private exch def
					/Widths rootfont/Widths get def
					/CharStrings 1 dict dup/.notdef
						<d841272cf18f54fc13>dup length string copy put def
					currentdict
					end
				/ct_Type1Font exch definefont
				dup 5 1 roll put
				setglobal
				}
			ifelse
			dup/CharStrings get 1 index/Encoding get
			ct_dfCharCode get charstring put
			rootfont/WMode 2 copy known
				{get}
				{pop pop 0}
			ifelse
			exch
			1000 scalefont setfont
			ct_str1 0 ct_dfCharCode put
			ct_str1 exch ct_dfSetCacheProc
			ct_SyntheticBold
				{
				currentpoint
				ct_str1 show
				newpath
				moveto
				ct_str1 true charpath
				ct_StrokeWidth setlinewidth
				stroke
				}
				{ct_str1 show}
			ifelse
			}def
		/ct_Type4ShowCharString
			{
			ct_dfDict ct_dfCharCode charstring
			FDArray fdIndex get
			dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not
				{ct_1000Mtx matrix concatmatrix concat}
				{pop}
			ifelse
			/Private get
			Adobe_CoolType_Utility/ct_Level2? get not
				{
				ct_dfDict/Private
				3 -1 roll
					{put}
				1183615869 internaldict/superexec get exec
				}
			if
			1183615869 internaldict
			Adobe_CoolType_Utility/ct_Level2? get
				{1 index}
				{3 index/Private get mark 6 1 roll}
			ifelse
			dup/RunInt known
				{/RunInt get}
				{pop/CCRun}
			ifelse
			get exec
			Adobe_CoolType_Utility/ct_Level2? get not
				{cleartomark}
			if
			}bind def
		/ct_BuildCharIncremental
			{
				{
				Adobe_CoolType_Utility/ct_MakeOCF get begin
				ct_BuildCharSetUp
				ct_ShowCharString
				}
			stopped
				{stop}
			if
			end
			end
			end
			end
			}bind def
		/BaseFontNameStr(BF00)def
		/ct_Type1FontTemplate 14 dict
			begin
			/FontType 1 def
			/FontMatrix [0.001 0 0 0.001 0 0]def
			/FontBBox [-250 -250 1250 1250]def
			/Encoding ct_cHexEncoding def
			/PaintType 0 def
			currentdict
			end def
		/BaseFontTemplate 11 dict
			begin
			/FontMatrix [0.001 0 0 0.001 0 0]def
			/FontBBox [-250 -250 1250 1250]def
			/Encoding ct_cHexEncoding def
			/BuildChar/ct_BuildCharIncremental load def
			ct_Clone?
				{
				/FontType 3 def
				/ct_ShowCharString/ct_Type3ShowCharString load def
				/ct_dfSetCacheProc/ct_CloneSetCacheProc load def
				/ct_SyntheticBold false def
				/ct_StrokeWidth 1 def
				}
				{
				/FontType 4 def
				/Private 1 dict dup/lenIV 4 put def
				/CharStrings 1 dict dup/.notdef<d841272cf18f54fc13>put def
				/PaintType 0 def
				/ct_ShowCharString/ct_Type4ShowCharString load def
				}
			ifelse
			/ct_str1 1 string def
			currentdict
			end def
		/BaseFontDictSize BaseFontTemplate length 5 add def
		/ct_matrixeq
			{
			true 0 1 5
				{
				dup 4 index exch get exch 3 index exch get eq and
				dup not
					{exit}
				if
				}
			for
			exch pop exch pop
			}bind def
		/ct_makeocf
			{
			15 dict
				begin
				exch/WMode exch def
				exch/FontName exch def
				/FontType 0 def
				/FMapType 2 def
			dup/FontMatrix known
				{dup/FontMatrix get/FontMatrix exch def}
				{/FontMatrix matrix def}
			ifelse
				/bfCount 1 index/CIDCount get 256 idiv 1 add
					dup 256 gt{pop 256}if def
				/Encoding
					256 array 0 1 bfCount 1 sub{2 copy dup put pop}for
					bfCount 1 255{2 copy bfCount put pop}for
					def
				/FDepVector bfCount dup 256 lt{1 add}if array def
				BaseFontTemplate BaseFontDictSize dict copy
					begin
					/CIDFont exch def
					CIDFont/FontBBox known
						{CIDFont/FontBBox get/FontBBox exch def}
					if
					CIDFont/CDevProc known
						{CIDFont/CDevProc get/CDevProc exch def}
					if
					currentdict
					end
				BaseFontNameStr 3(0)putinterval
				0 1 bfCount dup 256 eq{1 sub}if
					{
					FDepVector exch
					2 index BaseFontDictSize dict copy
						begin
						dup/CIDFirstByte exch 256 mul def
						FontType 3 eq
							{/ct_FDDict 2 dict def}
						if
						currentdict
						end
					1 index 16
					BaseFontNameStr 2 2 getinterval cvrs pop
					BaseFontNameStr exch definefont
					put
					}
				for
				ct_Clone?
					{/Widths 1 index/CIDFont get/GlyphDirectory get length dict def}
				if
				FontName
				currentdict
				end
			definefont
			ct_Clone?
				{
				gsave
				dup 1000 scalefont setfont
				ct_BuildCharDict
					begin
					/usewidths? false def
					currentfont/Widths get
						begin
						exch/CIDFont get/GlyphDirectory get
							{
							pop
							dup charcode exch 1 index 0 2 index 256 idiv put
							1 index exch 1 exch 256 mod put
							stringwidth 2 array astore def
							}
						forall
						end
					/usewidths? true def
					end
				grestore
				}
				{exch pop}
			ifelse
			}bind def
		currentglobal true setglobal
		/ct_ComposeFont
			{
			ct_UseNativeCapability?
				{				
				2 index/CMap ct_resourcestatus
					{pop pop exch pop}
					{
					/CIDInit/ProcSet findresource
						begin
						12 dict
							begin
							begincmap
							/CMapName 3 index def
							/CMapVersion 1.000 def
							/CMapType 1 def
							exch/WMode exch def
							/CIDSystemInfo 3 dict dup
								begin
								/Registry(Adobe)def
								/Ordering
								CMapName ct_mkocfStr100 cvs
								(Adobe-)search
									{
									pop pop
									(-)search
										{
										dup length string copy
										exch pop exch pop
										}
										{pop(Identity)}
									ifelse
									}
									{pop (Identity)}
								ifelse
								def
								/Supplement 0 def
								end def
							1 begincodespacerange
							<0000><FFFF>
							endcodespacerange
							1 begincidrange
							<0000><FFFF>0
							endcidrange
							endcmap
							CMapName currentdict/CMap defineresource pop
							end
						end
					}
				ifelse
				composefont
				}
				{
				3 2 roll pop
				0 get/CIDFont findresource
				ct_makeocf
				}
			ifelse
			}bind def
			setglobal
		/ct_MakeIdentity
			{
			ct_UseNativeCapability?
				{
				1 index/CMap ct_resourcestatus
					{pop pop}
					{
					/CIDInit/ProcSet findresource begin
					12 dict begin
					begincmap
					/CMapName 2 index def
					/CMapVersion 1.000 def
					/CMapType 1 def
					/CIDSystemInfo 3 dict dup
						begin
						/Registry(Adobe)def
						/Ordering
						CMapName ct_mkocfStr100 cvs
						(Adobe-)search
							{
							pop pop
							(-)search
								{dup length string copy exch pop exch pop}
								{pop(Identity)}
							ifelse
							}
							{pop(Identity)}
						ifelse
						def
						/Supplement 0 def
						end def
					1 begincodespacerange
					<0000><FFFF>
					endcodespacerange
					1 begincidrange
					<0000><FFFF>0
					endcidrange
					endcmap
					CMapName currentdict/CMap defineresource pop
					end
					end
					}
				ifelse
				composefont
				}
				{
				exch pop
				0 get/CIDFont findresource
				ct_makeocf
				}
			ifelse
			}bind def
		currentdict readonly pop
		end
	end
%%EndResource
setglobal
%%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0
%%Copyright: Copyright 1987-2004 Adobe Systems Incorporated.
%%Version: 1.0 0
userdict/ct_T42Dict 15 dict put
ct_T42Dict begin
/Is2015?
{
 version
 cvi
 2015
 ge
}bind def
/AllocGlyphStorage
{
 Is2015?
 {	
	pop
 }
 {
	{string}forall
 }ifelse
}bind def
/Type42DictBegin
{
25 dict begin
 /FontName exch def
 /CharStrings 256 dict 
begin
	 /.notdef 0 def
	 currentdict 
end def
 /Encoding exch def
 /PaintType 0 def
 /FontType 42 def
 /FontMatrix[1 0 0 1 0 0]def
 4 array astore cvx/FontBBox exch def
 /sfnts
}bind def
/Type42DictEnd 
{
 currentdict dup/FontName get exch definefont end
ct_T42Dict exch
dup/FontName get exch put
}bind def
/RD{string currentfile exch readstring pop}executeonly def
/PrepFor2015
{
Is2015?
{		 
	/GlyphDirectory 
	 16
	 dict def
	 sfnts 0 get
	 dup
	 2 index
	(glyx)
	 putinterval
	 2 index 
	(locx)
	 putinterval
	 pop
	 pop
}
{
	 pop
	 pop
}ifelse			
}bind def
/AddT42Char
{
Is2015?
{
	/GlyphDirectory get 
	begin
	def
	end
	pop
	pop
}
{
	/sfnts get
	4 index
	get
	3 index
 2 index
	putinterval
	pop
	pop
	pop
	pop
}ifelse
}bind def
/T0AddT42Mtx2
{
/CIDFont findresource/Metrics2 get begin def end
}bind def
end
%%EndResource
currentglobal true setglobal
%%BeginFile: MMFauxFont.prc
%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. 
%%All Rights Reserved.
userdict /ct_EuroDict 10 dict put
ct_EuroDict begin
/ct_CopyFont 
{
    { 1 index /FID ne {def} {pop pop} ifelse} forall
} def
/ct_GetGlyphOutline
{
   gsave
   initmatrix newpath
   exch findfont dup 
   length 1 add dict 
   begin 
		ct_CopyFont 
		/Encoding Encoding dup length array copy 
		dup
		4 -1 roll
		0 exch put   
		def
		currentdict
   end
   /ct_EuroFont exch definefont
   1000 scalefont setfont
   0 0 moveto
   [
       <00> stringwidth 
       <00> false charpath
       pathbbox
       [
       {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall
   grestore
   counttomark 8 add
}
def
/ct_MakeGlyphProc
{
   ] cvx
   /ct_PSBuildGlyph cvx
   ] cvx
} def
/ct_PSBuildGlyph 
{ 
 	gsave 
	8 -1 roll pop 
	7 1 roll 
        6 -2 roll ct_FontMatrix transform 6 2 roll
        4 -2 roll ct_FontMatrix transform 4 2 roll
        ct_FontMatrix transform 
	currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse  
	dup  9 1 roll 
	{  
		currentdict /StrokeWidth 2 copy known  
		{   
			get 2 div   
			0 ct_FontMatrix dtransform pop
			5 1 roll  
			4 -1 roll 4 index sub   
			4 1 roll   
			3 -1 roll 4 index sub  
			3 1 roll   
			exch 4 index add exch  
			4 index add  
			5 -1 roll pop  
		}  
		{	 
			pop pop 
		}  
		ifelse  
	}       
    if  
	setcachedevice  
        ct_FontMatrix concat
        ct_PSPathOps begin 
		exec 
	end 
	{  
		currentdict /StrokeWidth 2 copy known  
			{ get }  
			{ pop pop 0 }  
  	    ifelse  
		setlinewidth stroke  
	}  
	{   
	    fill  
	}  
	ifelse  
    grestore
} def 
/ct_PSPathOps 4 dict dup begin 
	/m {moveto} def 
	/l {lineto} def 
	/c {curveto} def 
	/cp {closepath} def 
end 
def 
/ct_matrix1000 [1000 0 0 1000 0 0] def
/ct_AddGlyphProc  
{
   2 index findfont dup length 4 add dict 
   begin 
	ct_CopyFont 
	/CharStrings CharStrings dup length 1 add dict copy
      begin
         3 1 roll def  
         currentdict 
      end 
      def
      /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def
      /ct_PSBuildGlyph /ct_PSBuildGlyph load def
      /ct_PSPathOps /ct_PSPathOps load def
      currentdict
   end
   definefont pop
}
def
systemdict /languagelevel known
{
	/ct_AddGlyphToPrinterFont {
		2 copy
		ct_GetGlyphOutline 3 add -1 roll restore 
		ct_MakeGlyphProc 
		ct_AddGlyphProc
	} def
}
{
	/ct_AddGlyphToPrinterFont {
	    pop pop restore
		Adobe_CTFauxDict /$$$FONTNAME get
		/Euro
		Adobe_CTFauxDict /$$$SUBSTITUTEBASE get
		ct_EuroDict exch get
		ct_AddGlyphProc
	} def
} ifelse
/AdobeSansMM 
{ 
556 0 24 -19 541 703 
	{ 
	541 628 m 
	510 669 442 703 354 703 c 
	201 703 117 607 101 444 c 
	50 444 l 
	25 372 l 
	97 372 l 
	97 301 l 
	49 301 l 
	24 229 l 
	103 229 l 
	124 67 209 -19 350 -19 c 
	435 -19 501 25 509 32 c 
	509 131 l 
	492 105 417 60 343 60 c 
	267 60 204 127 197 229 c 
	406 229 l 
	430 301 l 
	191 301 l 
	191 372 l 
	455 372 l 
	479 444 l 
	194 444 l 
	201 531 245 624 348 624 c 
	433 624 484 583 509 534 c 
	cp 
	556 0 m 
	}
ct_PSBuildGlyph
} def
/AdobeSerifMM 
{ 
500 0 10 -12 484 692 
	{ 
	347 298 m 
	171 298 l 
	170 310 170 322 170 335 c 
	170 362 l 
	362 362 l 
	374 403 l 
	172 403 l 
	184 580 244 642 308 642 c 
	380 642 434 574 457 457 c 
	481 462 l 
	474 691 l 
	449 691 l 
	433 670 429 657 410 657 c 
	394 657 360 692 299 692 c 
	204 692 94 604 73 403 c 
	22 403 l 
	10 362 l 
	70 362 l 
	69 352 69 341 69 330 c 
	69 319 69 308 70 298 c 
	22 298 l 
	10 257 l 
	73 257 l 
	97 57 216 -12 295 -12 c 
	364 -12 427 25 484 123 c 
	458 142 l 
	425 101 384 37 316 37 c 
	256 37 189 84 173 257 c 
	335 257 l 
	cp 
	500 0 m 
	} 
ct_PSBuildGlyph 
} def 
end		
%%EndFile
setglobal
Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end
%%BeginResource: procset Adobe_AGM_Image 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved.
+systemdict/setpacking known
+{
+	currentpacking
+	true setpacking
+}if
+userdict/Adobe_AGM_Image 71 dict dup begin put
+/Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def
+/nd{
+	null def
+}bind def
+/AGMIMG_&image nd
+/AGMIMG_&colorimage nd
+/AGMIMG_&imagemask nd
+/AGMIMG_mbuf()def
+/AGMIMG_ybuf()def
+/AGMIMG_kbuf()def
+/AGMIMG_c 0 def
+/AGMIMG_m 0 def
+/AGMIMG_y 0 def
+/AGMIMG_k 0 def
+/AGMIMG_tmp nd
+/AGMIMG_imagestring0 nd
+/AGMIMG_imagestring1 nd
+/AGMIMG_imagestring2 nd
+/AGMIMG_imagestring3 nd
+/AGMIMG_imagestring4 nd
+/AGMIMG_imagestring5 nd
+/AGMIMG_cnt nd
+/AGMIMG_fsave nd
+/AGMIMG_colorAry nd
+/AGMIMG_override nd
+/AGMIMG_name nd
+/AGMIMG_maskSource nd
+/AGMIMG_flushfilters nd
+/invert_image_samples nd
+/knockout_image_samples	nd
+/img nd
+/sepimg nd
+/devnimg nd
+/idximg nd
+/ds
+{
+	Adobe_AGM_Core begin
+	Adobe_AGM_Image begin
+	/AGMIMG_&image systemdict/image get def
+	/AGMIMG_&imagemask systemdict/imagemask get def
+	/colorimage where{
+		pop
+		/AGMIMG_&colorimage/colorimage ldf
+	}if
+	end
+	end
+}def
+/ps
+{
+	Adobe_AGM_Image begin
+	/AGMIMG_ccimage_exists{/customcolorimage where 
+		{
+			pop
+			/Adobe_AGM_OnHost_Seps where
+			{
+			pop false
+			}{
+			/Adobe_AGM_InRip_Seps where
+				{
+				pop false
+				}{
+					true
+				}ifelse
+			}ifelse
+			}{
+			false
+		}ifelse 
+	}bdf
+	level2{
+		/invert_image_samples
+		{
+			Adobe_AGM_Image/AGMIMG_tmp Decode length ddf
+			/Decode[Decode 1 get Decode 0 get]def
+		}def
+		/knockout_image_samples
+		{
+			Operator/imagemask ne{
+				/Decode[1 1]def
+			}if
+		}def
+	}{	
+		/invert_image_samples
+		{
+			{1 exch sub}currenttransfer addprocs settransfer
+		}def
+		/knockout_image_samples
+		{
+			{pop 1}currenttransfer addprocs settransfer
+		}def
+	}ifelse
+	/img/imageormask ldf
+	/sepimg/sep_imageormask ldf
+	/devnimg/devn_imageormask ldf
+	/idximg/indexed_imageormask ldf
+	/_ctype 7 def
+	currentdict{
+		dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{
+			bind
+		}if
+		def
+	}forall
+}def
+/pt
+{
+	end
+}def
+/dt
+{
+}def
+/AGMIMG_flushfilters
+{
+	dup type/arraytype ne
+		{1 array astore}if
+	dup 0 get currentfile ne
+		{dup 0 get flushfile}if
+		{
+		dup type/filetype eq
+			{
+			dup status 1 index currentfile ne and
+				{closefile}
+				{pop}
+			ifelse
+			}{pop}ifelse
+		}forall
+}def
+/AGMIMG_init_common
+{
+	currentdict/T known{/ImageType/T ldf currentdict/T undef}if
+	currentdict/W known{/Width/W ldf currentdict/W undef}if
+	currentdict/H known{/Height/H ldf currentdict/H undef}if
+	currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if
+	currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if
+	currentdict/D known{/Decode/D ldf currentdict/D undef}if
+	currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if
+	currentdict/O known{
+		/Operator/O load 1 eq{
+			/imagemask
+		}{
+			/O load 2 eq{
+				/image 
+			}{
+				/colorimage
+			}ifelse
+		}ifelse
+		def
+		currentdict/O undef
+	}if
+	currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if
+	currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if
+	currentdict/I known{/Interpolate/I ldf currentdict/I undef}if
+	currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if
+	/DataSource load xcheck not{
+		DataSource type/arraytype eq{
+			DataSource 0 get type/filetype eq{
+				/_Filters DataSource def
+				currentdict/MultipleDataSources known not{
+					/DataSource DataSource dup length 1 sub get def 
+				}if
+			}if
+		}if
+		currentdict/MultipleDataSources known not{
+			/MultipleDataSources DataSource type/arraytype eq{
+				DataSource length 1 gt
+			}
+			{false}ifelse def
+		}if
+	}if
+	/NComponents Decode length 2 div def
+	currentdict/SkipImageProc known not{/SkipImageProc{false}def}if
+}bdf
+/imageormask_sys
+{
+	begin
+		AGMIMG_init_common
+		save mark
+		level2{
+			currentdict
+			Operator/imagemask eq{
+				AGMIMG_&imagemask
+			}{
+				use_mask{
+					process_mask AGMIMG_&image
+				}{
+					AGMIMG_&image
+				}ifelse
+			}ifelse
+		}{
+			Width Height
+			Operator/imagemask eq{
+				Decode 0 get 1 eq Decode 1 get 0 eq	and
+				ImageMatrix/DataSource load
+				AGMIMG_&imagemask
+			}{
+				BitsPerComponent ImageMatrix/DataSource load
+				AGMIMG_&image
+			}ifelse
+		}ifelse
+		currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+		cleartomark restore
+	end
+}def
+/overprint_plate
+{
+	currentoverprint{
+		0 get dup type/nametype eq{
+			dup/DeviceGray eq{
+				pop AGMCORE_black_plate not
+			}{
+				/DeviceCMYK eq{
+					AGMCORE_is_cmyk_sep not
+				}if
+			}ifelse
+		}{
+			false exch
+			{
+				 AGMOHS_sepink eq or
+			}forall
+			not
+		}ifelse
+	}{
+		pop false
+	}ifelse
+}def
+/process_mask
+{
+	level3{
+		dup begin
+		/ImageType 1 def
+		end
+		4 dict begin
+			/DataDict exch def
+			/ImageType 3 def
+			/InterleaveType 3 def
+			/MaskDict 9 dict begin
+				/ImageType 1 def
+				/Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def
+				/Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def
+				/ImageMatrix[Width 0 0 Height neg 0 Height]def
+				/NComponents 1 def
+				/BitsPerComponent 1 def
+				/Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def
+				/DataSource Adobe_AGM_Core/AGMIMG_maskSource get def
+			currentdict end def
+		currentdict end
+	}if
+}def
+/use_mask
+{
+	dup/Mask known	{dup/Mask get}{false}ifelse
+}def
+/imageormask
+{
+	begin
+		AGMIMG_init_common
+		SkipImageProc{
+			currentdict consumeimagedata
+		}
+		{
+			save mark
+			level2 AGMCORE_host_sep not and{
+				currentdict
+				Operator/imagemask eq DeviceN_PS2 not and{
+					imagemask
+				}{
+					AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{
+						[/Separation/Black/DeviceGray{}]setcolorspace
+						/Decode[Decode 1 get Decode 0 get]def
+					}if
+					use_mask{
+						process_mask image
+					}{
+						DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and 
+						{
+							Names convert_to_process not{
+								2 dict begin
+								/imageDict xdf
+								/names_index 0 def
+								gsave
+								imageDict write_image_file{
+									Names{
+										dup(None)ne{
+											[/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace
+											Operator imageDict read_image_file
+											names_index 0 eq{true setoverprint}if
+											/names_index names_index 1 add def
+										}{
+											pop
+										}ifelse
+									}forall
+									close_image_file
+								}if
+								grestore
+								end
+							}{
+								Operator/imagemask eq{
+									imagemask
+								}{
+									image
+								}ifelse
+							}ifelse
+						}{
+							Operator/imagemask eq{
+								imagemask
+							}{
+								image
+							}ifelse
+						}ifelse
+					}ifelse
+				}ifelse
+			}{
+				Width Height
+				Operator/imagemask eq{
+					Decode 0 get 1 eq Decode 1 get 0 eq	and
+					ImageMatrix/DataSource load
+					/Adobe_AGM_OnHost_Seps where{
+						pop imagemask
+					}{
+						currentgray 1 ne{
+							currentdict imageormask_sys
+						}{
+							currentoverprint not{
+								1 AGMCORE_&setgray
+								currentdict imageormask_sys
+							}{
+								currentdict ignoreimagedata
+							}ifelse				 		
+						}ifelse
+					}ifelse
+				}{
+					BitsPerComponent ImageMatrix 
+					MultipleDataSources{
+						0 1 NComponents 1 sub{
+							DataSource exch get
+						}for
+					}{
+						/DataSource load
+					}ifelse
+					Operator/colorimage eq{
+						AGMCORE_host_sep{
+							MultipleDataSources level2 or NComponents 4 eq and{
+								AGMCORE_is_cmyk_sep{
+									MultipleDataSources{
+										/DataSource DataSource 0 get xcheck
+											{
+											[
+											DataSource 0 get/exec cvx
+											DataSource 1 get/exec cvx
+											DataSource 2 get/exec cvx
+											DataSource 3 get/exec cvx
+											/AGMCORE_get_ink_data cvx
+											]cvx
+											}{
+											DataSource aload pop AGMCORE_get_ink_data
+											}ifelse def
+									}{
+										/DataSource 
+										Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul 
+										/DataSource load
+										filter_cmyk 0()/SubFileDecode filter def
+									}ifelse
+									/Decode[Decode 0 get Decode 1 get]def
+									/MultipleDataSources false def
+									/NComponents 1 def
+									/Operator/image def
+									invert_image_samples
+						 			1 AGMCORE_&setgray
+									currentdict imageormask_sys
+								}{
+									currentoverprint not Operator/imagemask eq and{
+ 			 							1 AGMCORE_&setgray
+ 			 							currentdict imageormask_sys
+ 			 						}{
+ 			 							currentdict ignoreimagedata
+ 			 						}ifelse
+								}ifelse
+							}{	
+								MultipleDataSources NComponents AGMIMG_&colorimage						
+							}ifelse
+						}{
+							true NComponents colorimage
+						}ifelse
+					}{
+						Operator/image eq{
+							AGMCORE_host_sep{
+								/DoImage true def
+								currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse
+								{
+									AGMCORE_black_plate not Operator/imagemask ne and{
+										/DoImage false def
+										currentdict ignoreimagedata
+					 				}if
+								}if
+						 		1 AGMCORE_&setgray
+								DoImage
+									{currentdict imageormask_sys}if
+							}{
+								use_mask{
+									process_mask image
+								}{
+									image
+								}ifelse
+							}ifelse
+						}{
+							Operator/knockout eq{
+								pop pop pop pop pop
+								currentcolorspace overprint_plate not{
+									knockout_unitsq
+								}if
+							}if
+						}ifelse
+					}ifelse
+				}ifelse
+			}ifelse
+			cleartomark restore
+		}ifelse
+		currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+	end
+}def
+/sep_imageormask
+{
+ 	/sep_colorspace_dict AGMCORE_gget begin
+	CSA map_csa
+	begin
+	AGMIMG_init_common
+	SkipImageProc{
+		currentdict consumeimagedata
+	}{
+		save mark 
+		AGMCORE_avoid_L2_sep_space{
+			/Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def
+		}if
+ 		AGMIMG_ccimage_exists 
+		MappedCSA 0 get/DeviceCMYK eq and
+		currentdict/Components known and 
+		Name()ne and 
+		Name(All)ne and 
+		Operator/image eq and
+		AGMCORE_producing_seps not and
+		level2 not and
+		{
+			Width Height BitsPerComponent ImageMatrix 
+			[
+			/DataSource load/exec cvx
+			{
+				0 1 2 index length 1 sub{
+					1 index exch
+					2 copy get 255 xor put
+				}for
+			}/exec cvx
+			]cvx bind
+			MappedCSA 0 get/DeviceCMYK eq{
+				Components aload pop
+			}{
+				0 0 0 Components aload pop 1 exch sub
+			}ifelse
+			Name findcmykcustomcolor
+			customcolorimage
+		}{
+			AGMCORE_producing_seps not{
+				level2{
+ 					//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{
+						[/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt
+						/sep_tint AGMCORE_gget setcolor
+					}if
+					currentdict imageormask
+				}{
+					currentdict
+					Operator/imagemask eq{
+						imageormask
+					}{
+						sep_imageormask_lev1
+					}ifelse
+				}ifelse
+ 			}{
+				AGMCORE_host_sep{
+					Operator/knockout eq{
+						currentdict/ImageMatrix get concat
+						knockout_unitsq
+					}{
+						currentgray 1 ne{
+ 							AGMCORE_is_cmyk_sep Name(All)ne and{
+ 								level2{
+ 									Name AGMCORE_IsSeparationAProcessColor 
+ 									{
+ 										Operator/imagemask eq{
+ 											//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
+ 												/sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor
+ 											}if
+ 										}{
+											invert_image_samples
+ 										}ifelse
+	 								}{
+	 									//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
+	 										[/Separation Name[/DeviceGray]
+	 										{
+	 											sep_colorspace_proc AGMCORE_get_ink_data
+												1 exch sub
+	 										}bind
+											]AGMCORE_&setcolorspace
+											/sep_tint AGMCORE_gget AGMCORE_&setcolor
+										}if
+ 									}ifelse
+ 									currentdict imageormask_sys
+	 							}{
+	 								currentdict
+									Operator/imagemask eq{
+										imageormask_sys
+									}{
+										sep_image_lev1_sep
+									}ifelse
+	 							}ifelse
+ 							}{
+ 								Operator/imagemask ne{
+									invert_image_samples
+ 								}if
+		 						currentdict imageormask_sys
+ 							}ifelse
+ 						}{
+ 							currentoverprint not Name(All)eq or Operator/imagemask eq and{
+								currentdict imageormask_sys 
+								}{
+								currentoverprint not
+									{
+ 									gsave 
+ 									knockout_unitsq
+ 									grestore
+									}if
+								currentdict consumeimagedata 
+		 					}ifelse
+ 						}ifelse
+		 			}ifelse
+ 				}{
+					//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
+						currentcolorspace 0 get/Separation ne{
+							[/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt
+							/sep_tint AGMCORE_gget setcolor
+						}if
+					}if
+					currentoverprint 
+					MappedCSA 0 get/DeviceCMYK eq and 
+					Name AGMCORE_IsSeparationAProcessColor not and
+					//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse 
+					Name(All)ne and{
+						imageormask_l2_overprint
+					}{
+						currentdict imageormask
+ 					}ifelse
+				}ifelse
+			}ifelse
+		}ifelse
+		cleartomark restore
+	}ifelse
+	currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+	end
+	end
+}def
+/colorSpaceElemCnt
+{
+	mark currentcolor counttomark dup 2 add 1 roll cleartomark
+}bdf
+/devn_sep_datasource
+{
+	1 dict begin
+	/dataSource xdf
+	[
+		0 1 dataSource length 1 sub{
+			dup currentdict/dataSource get/exch cvx/get cvx/exec cvx
+			/exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx
+		}for
+	]cvx bind
+	end
+}bdf		
+/devn_alt_datasource
+{
+	11 dict begin
+	/convProc xdf
+	/origcolorSpaceElemCnt xdf
+	/origMultipleDataSources xdf
+	/origBitsPerComponent xdf
+	/origDecode xdf
+	/origDataSource xdf
+	/dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def
+	/DataSource origMultipleDataSources
+		{
+			[
+			BitsPerComponent 8 idiv origDecode length 2 idiv mul string
+			0 1 origDecode length 2 idiv 1 sub
+				{
+				dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch
+				origDataSource exch get 0()/SubFileDecode filter
+				BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx
+				}for 
+			]bind cvx
+		}{origDataSource}ifelse 0()/SubFileDecode filter def		
+	[
+		origcolorSpaceElemCnt string
+		0 2 origDecode length 2 sub
+			{
+			dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div
+			1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx
+			}for
+		/convProc load/exec cvx
+		origcolorSpaceElemCnt 1 sub -1 0
+			{
+			/dup cvx 2/add cvx/index cvx
+			3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx
+			}for
+	]bind cvx 0()/SubFileDecode filter
+	end
+}bdf
+/devn_imageormask
+{
+ 	/devicen_colorspace_dict AGMCORE_gget begin
+	CSA map_csa
+	2 dict begin
+	dup
+	/srcDataStrs[3 -1 roll begin
+		AGMIMG_init_common
+		currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse
+		{
+			Width Decode length 2 div mul cvi
+			{
+				dup 65535 gt{1 add 2 div cvi}{exit}ifelse
+			}loop
+			string
+		}repeat
+		end]def
+	/dstDataStr srcDataStrs 0 get length string def
+	begin
+	AGMIMG_init_common
+	SkipImageProc{
+		currentdict consumeimagedata
+	}{
+		save mark 
+		AGMCORE_producing_seps not{
+			level3 not{
+				Operator/imagemask ne{
+					/DataSource[[
+						DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+						colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get 
+						devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def				
+					/MultipleDataSources true def
+					/Decode colorSpaceElemCnt[exch{0 1}repeat]def
+				}if
+			}if
+			currentdict imageormask
+ 		}{
+			AGMCORE_host_sep{
+				Names convert_to_process{
+					CSA get_csa_by_name 0 get/DeviceCMYK eq{
+						/DataSource
+							Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul 
+							DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+							4/devicen_colorspace_dict AGMCORE_gget/TintTransform get 
+							devn_alt_datasource
+						filter_cmyk 0()/SubFileDecode filter def
+						/MultipleDataSources false def
+						/Decode[1 0]def
+						/DeviceGray setcolorspace
+			 			currentdict imageormask_sys
+ 					}{
+						AGMCORE_report_unsupported_color_space
+						AGMCORE_black_plate{
+							/DataSource
+								DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+								CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get
+								devn_alt_datasource
+							/MultipleDataSources false def
+							/Decode colorSpaceElemCnt[exch{0 1}repeat]def
+				 			currentdict imageormask_sys
+				 		}{
+	 						gsave 
+	 						knockout_unitsq
+	 						grestore
+							currentdict consumeimagedata 
+						}ifelse
+ 					}ifelse
+				}
+				{	
+					/devicen_colorspace_dict AGMCORE_gget/names_index known{
+	 					Operator/imagemask ne{
+	 						MultipleDataSources{
+		 						/DataSource[DataSource devn_sep_datasource/exec cvx]cvx def
+								/MultipleDataSources false def
+	 						}{
+								/DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def
+	 						}ifelse
+							invert_image_samples
+	 					}if
+			 			currentdict imageormask_sys
+	 				}{
+	 					currentoverprint not Operator/imagemask eq and{
+							currentdict imageormask_sys 
+							}{
+							currentoverprint not
+								{
+	 							gsave 
+	 							knockout_unitsq
+	 							grestore
+								}if
+							currentdict consumeimagedata 
+			 			}ifelse
+	 				}ifelse
+	 			}ifelse
+ 			}{
+				currentdict imageormask
+			}ifelse
+		}ifelse
+		cleartomark restore
+	}ifelse
+	currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+	end
+	end
+	end
+}def
+/imageormask_l2_overprint
+{
+	currentdict
+	currentcmykcolor add add add 0 eq{
+		currentdict consumeimagedata
+	}{
+		level3{			
+			currentcmykcolor 
+			/AGMIMG_k xdf 
+			/AGMIMG_y xdf 
+			/AGMIMG_m xdf 
+			/AGMIMG_c xdf
+			Operator/imagemask eq{
+				[/DeviceN[
+				AGMIMG_c 0 ne{/Cyan}if
+				AGMIMG_m 0 ne{/Magenta}if
+				AGMIMG_y 0 ne{/Yellow}if
+				AGMIMG_k 0 ne{/Black}if
+				]/DeviceCMYK{}]setcolorspace
+				AGMIMG_c 0 ne{AGMIMG_c}if
+				AGMIMG_m 0 ne{AGMIMG_m}if
+				AGMIMG_y 0 ne{AGMIMG_y}if
+				AGMIMG_k 0 ne{AGMIMG_k}if
+				setcolor			
+			}{	
+				/Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def
+				[/Indexed 				
+					[
+						/DeviceN[
+							AGMIMG_c 0 ne{/Cyan}if
+							AGMIMG_m 0 ne{/Magenta}if
+							AGMIMG_y 0 ne{/Yellow}if
+							AGMIMG_k 0 ne{/Black}if
+						]
+						/DeviceCMYK{
+							AGMIMG_k 0 eq{0}if
+							AGMIMG_y 0 eq{0 exch}if
+							AGMIMG_m 0 eq{0 3 1 roll}if
+							AGMIMG_c 0 eq{0 4 1 roll}if						
+						}
+					]
+					255
+					{
+						255 div 
+						mark exch
+						dup	dup dup
+						AGMIMG_k 0 ne{
+							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop		
+							counttomark 1 roll
+						}{
+							pop
+						}ifelse
+						AGMIMG_y 0 ne{
+							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop		
+							counttomark 1 roll
+						}{
+							pop
+						}ifelse
+						AGMIMG_m 0 ne{
+							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop		
+							counttomark 1 roll
+						}{
+							pop
+						}ifelse
+						AGMIMG_c 0 ne{
+							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop		
+							counttomark 1 roll
+						}{
+							pop
+						}ifelse
+						counttomark 1 add -1 roll pop
+					}
+				]setcolorspace
+			}ifelse
+			imageormask_sys
+		}{
+	write_image_file{
+		currentcmykcolor
+		0 ne{
+			[/Separation/Black/DeviceGray{}]setcolorspace
+			gsave
+			/Black
+			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx]
+			cvx modify_halftone_xfer
+			Operator currentdict read_image_file
+			grestore
+		}if
+		0 ne{
+			[/Separation/Yellow/DeviceGray{}]setcolorspace
+			gsave
+			/Yellow
+			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx]
+			cvx modify_halftone_xfer
+			Operator currentdict read_image_file
+			grestore
+		}if
+		0 ne{
+			[/Separation/Magenta/DeviceGray{}]setcolorspace
+			gsave
+			/Magenta
+			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx]
+			cvx modify_halftone_xfer
+			Operator currentdict read_image_file
+			grestore
+		}if
+		0 ne{
+			[/Separation/Cyan/DeviceGray{}]setcolorspace
+			gsave
+			/Cyan 
+			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx]
+			cvx modify_halftone_xfer
+			Operator currentdict read_image_file
+			grestore
+		}if
+				close_image_file
+			}{
+				imageormask
+			}ifelse
+		}ifelse
+	}ifelse
+}def
+/indexed_imageormask
+{
+	begin
+		AGMIMG_init_common
+		save mark 
+ 		currentdict
+ 		AGMCORE_host_sep{
+			Operator/knockout eq{
+				/indexed_colorspace_dict AGMCORE_gget dup/CSA known{
+					/CSA get get_csa_by_name
+				}{
+					/Names get
+				}ifelse
+				overprint_plate not{
+					knockout_unitsq
+				}if
+			}{
+				Indexed_DeviceN{
+					/devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{
+			 			indexed_image_lev2_sep
+					}{
+						currentoverprint not{
+							knockout_unitsq
+			 			}if
+			 			currentdict consumeimagedata
+					}ifelse
+				}{
+		 			AGMCORE_is_cmyk_sep{
+						Operator/imagemask eq{
+							imageormask_sys
+						}{
+							level2{
+								indexed_image_lev2_sep
+							}{
+								indexed_image_lev1_sep
+							}ifelse
+						}ifelse
+					}{
+						currentoverprint not{
+							knockout_unitsq
+			 			}if
+			 			currentdict consumeimagedata
+					}ifelse
+				}ifelse
+			}ifelse
+ 		}{
+			level2{
+				Indexed_DeviceN{
+					/indexed_colorspace_dict AGMCORE_gget begin
+				}{
+					/indexed_colorspace_dict AGMCORE_gget dup null ne
+					{
+						begin
+						currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse
+						get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and
+						AGMCORE_in_rip_sep and{
+							[/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup]
+							setcolorspace
+						}if
+						end
+					}
+					{pop}ifelse
+				}ifelse
+				imageormask
+				Indexed_DeviceN{
+					end
+				}if
+			}{
+				Operator/imagemask eq{
+					imageormask
+				}{
+					indexed_imageormask_lev1
+				}ifelse
+			}ifelse
+ 		}ifelse
+		cleartomark restore
+	currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+	end
+}def
+/indexed_image_lev2_sep
+{
+	/indexed_colorspace_dict AGMCORE_gget begin
+	begin
+		Indexed_DeviceN not{
+			currentcolorspace 
+			dup 1/DeviceGray put
+			dup 3
+			currentcolorspace 2 get 1 add string
+			0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub
+			{
+			dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put
+			}for 
+			put	setcolorspace
+		}if
+		currentdict 
+		Operator/imagemask eq{
+			AGMIMG_&imagemask
+		}{
+			use_mask{
+				process_mask AGMIMG_&image
+			}{
+				AGMIMG_&image
+			}ifelse
+		}ifelse
+	end end
+}def
+ /OPIimage
+ {
+ 	dup type/dicttype ne{
+ 		10 dict begin
+ 			/DataSource xdf
+ 			/ImageMatrix xdf
+ 			/BitsPerComponent xdf
+ 			/Height xdf
+ 			/Width xdf
+ 			/ImageType 1 def
+ 			/Decode[0 1 def]
+ 			currentdict
+ 		end
+ 	}if
+ 	dup begin
+ 		/NComponents 1 cdndf
+ 		/MultipleDataSources false cdndf
+ 		/SkipImageProc{false}cdndf
+ 		/Decode[
+ 				0 
+ 				currentcolorspace 0 get/Indexed eq{
+ 					2 BitsPerComponent exp 1 sub
+ 				}{
+ 					1
+ 				}ifelse
+ 		]cdndf
+ 		/Operator/image cdndf
+ 	end
+ 	/sep_colorspace_dict AGMCORE_gget null eq{
+ 		imageormask
+ 	}{
+ 		gsave
+ 		dup begin invert_image_samples end
+ 		sep_imageormask
+ 		grestore
+ 	}ifelse
+ }def
+/cachemask_level2
+{
+	3 dict begin
+	/LZWEncode filter/WriteFilter xdf
+	/readBuffer 256 string def
+	/ReadFilter
+		currentfile
+		0(%EndMask)/SubFileDecode filter
+		/ASCII85Decode filter
+		/RunLengthDecode filter
+	def
+	{
+		ReadFilter readBuffer readstring exch
+		WriteFilter exch writestring
+		not{exit}if
+	}loop
+	WriteFilter closefile
+	end
+}def
+/spot_alias
+{
+	/mapto_sep_imageormask 
+	{
+		dup type/dicttype ne{
+			12 dict begin
+				/ImageType 1 def
+				/DataSource xdf
+				/ImageMatrix xdf
+				/BitsPerComponent xdf
+				/Height xdf
+				/Width xdf
+				/MultipleDataSources false def
+		}{
+			begin
+		}ifelse
+				/Decode[/customcolor_tint AGMCORE_gget 0]def
+				/Operator/image def
+				/SkipImageProc{false}def
+				currentdict 
+			end
+		sep_imageormask
+	}bdf
+	/customcolorimage
+	{
+		Adobe_AGM_Image/AGMIMG_colorAry xddf
+		/customcolor_tint AGMCORE_gget
+		<<
+			/Name AGMIMG_colorAry 4 get
+			/CSA[/DeviceCMYK]
+			/TintMethod/Subtractive
+			/TintProc null
+			/MappedCSA null
+			/NComponents 4 
+			/Components[AGMIMG_colorAry aload pop pop]
+		>>
+		setsepcolorspace
+		mapto_sep_imageormask
+	}ndf
+	Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put
+	/customcolorimage
+	{
+		Adobe_AGM_Image/AGMIMG_override false put
+		current_spot_alias{dup 4 get map_alias}{false}ifelse
+		{
+			false set_spot_alias
+			/customcolor_tint AGMCORE_gget exch setsepcolorspace
+			pop
+			mapto_sep_imageormask
+			true set_spot_alias
+		}{
+			//Adobe_AGM_Image/AGMIMG_&customcolorimage get exec
+		}ifelse			
+	}bdf
+}def
+/snap_to_device
+{
+	6 dict begin
+	matrix currentmatrix
+	dup 0 get 0 eq 1 index 3 get 0 eq and
+	1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop
+	{
+		1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def
+		0 0 transform
+		AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch
+		AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch
+		itransform/AGMIMG_llY exch def/AGMIMG_llX exch def
+		1 1 transform
+		AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch
+		AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch
+		itransform/AGMIMG_urY exch def/AGMIMG_urX exch def			
+		[AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat
+	}{
+	}ifelse
+	end
+}def
+level2 not{
+	/colorbuf
+	{
+		0 1 2 index length 1 sub{
+			dup 2 index exch get 
+			255 exch sub 
+			2 index 
+			3 1 roll 
+			put
+		}for
+	}def
+	/tint_image_to_color
+	{
+		begin
+			Width Height BitsPerComponent ImageMatrix 
+			/DataSource load
+		end
+		Adobe_AGM_Image begin
+			/AGMIMG_mbuf 0 string def
+			/AGMIMG_ybuf 0 string def
+			/AGMIMG_kbuf 0 string def
+			{
+				colorbuf dup length AGMIMG_mbuf length ne
+					{
+					dup length dup dup
+					/AGMIMG_mbuf exch string def
+					/AGMIMG_ybuf exch string def
+					/AGMIMG_kbuf exch string def
+					}if
+				dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop
+			}
+			addprocs
+			{AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage	
+		end
+	}def			
+	/sep_imageormask_lev1
+	{
+		begin
+			MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{
+				{
+					255 mul round cvi GrayLookup exch get
+				}currenttransfer addprocs settransfer
+				currentdict imageormask
+			}{
+				/sep_colorspace_dict AGMCORE_gget/Components known{
+					MappedCSA 0 get/DeviceCMYK eq{
+						Components aload pop
+					}{
+						0 0 0 Components aload pop 1 exch sub
+					}ifelse
+					Adobe_AGM_Image/AGMIMG_k xddf 
+					Adobe_AGM_Image/AGMIMG_y xddf 
+					Adobe_AGM_Image/AGMIMG_m xddf 
+					Adobe_AGM_Image/AGMIMG_c xddf 
+					AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{
+						{AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer
+						currentdict imageormask
+					}{
+						currentcolortransfer
+						{AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll
+						{AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll
+						{AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll
+						{AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll
+						setcolortransfer
+						currentdict tint_image_to_color
+					}ifelse
+				}{
+					MappedCSA 0 get/DeviceGray eq{
+						{255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer
+						currentdict imageormask
+					}{
+						MappedCSA 0 get/DeviceCMYK eq{
+							currentcolortransfer
+							{255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll
+							{255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll
+							{255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll
+							{255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll
+							setcolortransfer 
+							currentdict tint_image_to_color
+						}{
+							currentcolortransfer
+							{pop 1}exch addprocs 4 1 roll
+							{255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll
+							{255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll
+							{255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll
+							setcolortransfer 
+							currentdict tint_image_to_color
+						}ifelse
+					}ifelse
+				}ifelse
+			}ifelse
+		end
+	}def
+	/sep_image_lev1_sep
+	{
+		begin
+			/sep_colorspace_dict AGMCORE_gget/Components known{
+				Components aload pop
+				Adobe_AGM_Image/AGMIMG_k xddf 
+				Adobe_AGM_Image/AGMIMG_y xddf 
+				Adobe_AGM_Image/AGMIMG_m xddf 
+				Adobe_AGM_Image/AGMIMG_c xddf 
+				{AGMIMG_c mul 1 exch sub}
+				{AGMIMG_m mul 1 exch sub}
+				{AGMIMG_y mul 1 exch sub}
+				{AGMIMG_k mul 1 exch sub}
+			}{
+				{255 mul round cvi ColorLookup exch get 0 get 1 exch sub}
+				{255 mul round cvi ColorLookup exch get 1 get 1 exch sub}
+				{255 mul round cvi ColorLookup exch get 2 get 1 exch sub}
+				{255 mul round cvi ColorLookup exch get 3 get 1 exch sub}
+			}ifelse
+			AGMCORE_get_ink_data currenttransfer addprocs settransfer
+			currentdict imageormask_sys
+		end
+	}def
+	/indexed_imageormask_lev1
+	{
+		/indexed_colorspace_dict AGMCORE_gget begin
+		begin
+			currentdict
+			MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{
+				{HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer
+				imageormask
+			}{
+				MappedCSA 0 get/DeviceGray eq{
+					{HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer
+					imageormask
+				}{
+					MappedCSA 0 get/DeviceCMYK eq{
+						currentcolortransfer
+						{4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+						{4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+						{4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+						{4 mul HiVal mul round cvi		 Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+						setcolortransfer 
+						tint_image_to_color
+					}{
+						currentcolortransfer
+						{pop 1}exch addprocs 4 1 roll
+						{3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll
+						{3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll
+						{3 mul HiVal mul round cvi 		Lookup exch get HiVal div}exch addprocs 4 1 roll
+						setcolortransfer 
+						tint_image_to_color
+					}ifelse
+				}ifelse
+			}ifelse
+		end end
+	}def
+	/indexed_image_lev1_sep
+	{
+		/indexed_colorspace_dict AGMCORE_gget begin
+		begin
+			{4 mul HiVal mul round cvi		 Lookup exch get HiVal div 1 exch sub}
+			{4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}
+			{4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}
+			{4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}
+			AGMCORE_get_ink_data currenttransfer addprocs settransfer
+			currentdict imageormask_sys
+		end end
+	}def
+}if
+end
+systemdict/setpacking known
+{setpacking}if
+%%EndResource
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndProlog
+%%BeginSetup
+Adobe_AGM_Utils begin
+2 2010 Adobe_AGM_Core/ds gx
+Adobe_CoolType_Core/ds get exec
Adobe_AGM_Image/ds gx
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndSetup
+%%Page: 1 1
+%%EndPageComments
+%%BeginPageSetup
+%ADOBeginClientInjection: PageSetup Start "AI11EPS"
+%AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0
+%ADOEndClientInjection: PageSetup Start "AI11EPS"
+Adobe_AGM_Utils begin
+Adobe_AGM_Core/ps gx
+Adobe_AGM_Utils/capture_cpd gx
+Adobe_CoolType_Core/ps get exec
Adobe_AGM_Image/ps gx
+%ADOBeginClientInjection: PageSetup End "AI11EPS"
+/currentdistillerparams where
{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse
{ userdict /AI11_PDFMark5 /cleartomark load put
userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put}
{ userdict /AI11_PDFMark5 /pdfmark load put
userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse
[/NamespacePush AI11_PDFMark5
[/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5
[{ai_metadata_stream_123}
currentfile 0 (%  &&end XMP packet marker&&)
/SubFileDecode filter AI11_ReadMetadata_PDFMark5
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:05:41        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:dc="http://purl.org/dc/elements/1.1/">
+         <dc:format>application/postscript</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">Uni-Astrophysik-Logo-CMYK</rdf:li>
+            </rdf:Alt>
+         </dc:title>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+         <xmp:MetadataDate>2013-05-27T10:25:46+02:00</xmp:MetadataDate>
+         <xmp:ModifyDate>2013-05-27T10:25:46+02:00</xmp:ModifyDate>
+         <xmp:CreateDate>2013-05-27T10:25:46+02:00</xmp:CreateDate>
+         <xmp:CreatorTool>Adobe Illustrator CS4</xmp:CreatorTool>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>256</xmpGImg:width>
+                  <xmpGImg:height>92</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAXAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYqw7Xda0&#xA;EeZpNP18Us4reM2kc6NJbyTSFzIWQBlYqqqF5dN/EVVSv8rPNC317f6UgAgjRLqCFCxW3JCpNCvP&#xA;dU9Ukxr2Fe1KlXouBXYq7FWJfmhrPnDSPKr3flSyN9qfrIjosbTOkJB5SLEu7kEKPka9sytHjxyn&#xA;UzQcbV5MkYXAWU18oX2t3/lnTrzXLUWWrTwhru2AK8Hqf2WqVqKHienTKs8YxmRE3FswylKAMhUk&#xA;4yptdirsVdiqA1nX9F0S0N5q99DY2w6STuEqR2UHdj7DfJ48Upmoi2E8kYC5Gna/c6na6HqFzpcA&#xA;udSht5ZLK3atJJlQlFNKE1btXHEAZAS2FrkJESY86Yx+U+veeNZ0G4uPN+nmwvEuGS35xNbu8YUG&#xA;rRPuKNUA9/oqcnW48cJAYzYr3uPo8mScbmKN+5k2m+YdD1O6urXTr6G8nseAu0gcSemZOXEMVqKn&#xA;g22Y88UogEirciOSMiQDdJhlbN2KuxVL5PMOhx6vDoz38A1acM0ViHUzFVUsTwHxAcVO5ywYpcPF&#xA;Xp72Byx4uG/V3JhlbNLPM2vWvl/y/qGtXW8NjC0xStC7AfAgPi7UUfPLMOMzmIjq15cghEyPR5ro&#xA;35Uavr2paJ548w69LLqolt9S/R4jDW0KBhMlvEC/w8RtyHfffqdjk1sYCWOEfTuL6+9wIaOUzHJO&#xA;Xq2NdPcnLee/Oo/NseVhodfL3Gv6QEcnLj6Hqet6xIi4iT4KU9vtbZT+Wx+Bx8Xq7m38xk8fg4fR&#xA;3/BrzJ57866d+Zmk+XbHQ/rGh3npC4vjHIzcZGpLIsiHgghG7Bh+sHHFpscsJmZeofj7Vy6jJHMI&#xA;iNxP4+x6LmA5zsVdiqV63qMkEtjYW8qw3epTGKORhy4IiNLI4U7E0XiK7cmFa9MVSGPzNNp3nGLR&#xA;Li9lvbW4Jgd7mOJHhuPTjljKvCsatHIJQlGWofvvirMgQRUbg9DiqV+YNU+pW8EEMqx31/MlrZ8g&#xA;GIaRgGcL39NKt4du+Kpdrmg+T7HRLu71ayW5gijL3N1IpnuSOhb1d5a79iKdqYqxzyNZ6XNqGsaD&#xA;cuZpbAxTWd9HM8M81ncRiWL1DEyFzGrAEn+bCqXflk2kt+Y/mVtKlknszGSJ5WVzI5lBkZSgA4F6&#xA;8fbfFXrOBXYq7FWM/mF53h8maANZmtGvIhMkLxI4Rh6gajAkGu69MyNLp/Flw3Tj6nOMUeIi0Jef&#xA;mLHa/lsvndtPcxNDDcfUBIvPhNKsY+OlNlfl09snHS3m8O/ixlqaxeJTHrT8811XS7WTy75dvNZ1&#xA;eZXkudNt2+C1jWV40M84RgrSKnJV4/wrfLs7hkeOQjHv7/cGiPaHEBwRMpd3d7y15e/PSGfzLF5c&#xA;8z6FceXNRnZY4TM/qRl3+zz5JEyhzspAYe/fHL2dUOOEhMLi7QufBOJiWU+evzC0zylFaRSQS6hq&#xA;2ov6Wm6XbUMsz1A/2K1IFaHfoDmNptKct9IjmXI1GpGKupPIMeb81fNun61pmn+YfJU+nw6tPHbW&#xA;lxBdxXQ9SSgCniiJXqTVxt8syPycJRJhO+Hypo/OTjICcK4vO3m//OR2uzarqWlWcuk31jHp095A&#xA;lzcRhIrpWaIF7dq/EP3dfpGZ/ZeLhBNg3Xw583A7UycRAoir+PLk9htPzFnubLV7t/LerafHpVlL&#xA;eqdShFssxiUsYkYNIAxpmqOloxHFE8Rrbd2g1ViR4ZDhF77JVon5vJr/AJUm1y18t395AL79GtZW&#xA;YFzMR6IleRlAUBAGC9epy3JoeCfCZAbXvs1w1vHDiESd6236PLfyB81z+X7HXWj0LVNZNw9vxOm2&#xA;4mRDGJNpG5LxJ57UBzY9pYfEMfVGPPmXXdnZvDEvTKXLkHr+qfmpb6f580zyg2mSvcakkMi3PMKI&#xA;xNyqGTiTVeHjmrhozLEcl8naz1YjlGOubOswnLeeeXPzfh13VfMGnW2jXBl0CG4lcRusrztbuUWO&#xA;KMAEtJQ099sz8uh4IxJl9VOFj1omZAA+m3lGjeZpofz4vddn0DU2mdHb9ER24e+j52yqGMRZaDia&#xA;1r0ObPJhvTCIlH33tzdZDNWpMjGXurfk+ifL2ry6vpEGoy2Fzpjzc62V4npzpwkZPjXty48h7HND&#xA;lhwSqwfc7zFPjjdEe95P/wA5D+Z9ZTy7e6Euj3MemyS23PWSV+rydJfTA615qPuzZ9mYY8QlxC99&#xA;nW9p5ZcBjwmtt0+8jfmBr03l2xW78sXlva2ulLONUkZBBN6FuGUrQVAlp8O2U6jTR4zUhZly+Lfp&#xA;9RIwFxP08/gnv5a/mFD550m61KCxksYra4+rASOH5MEVyQQF6cxlGr0vgyAu27S6kZokgUifzB87&#xA;W/kzy+dantXvIxMkJhjYI37yu9SD4ZHTac5ZcINMtTnGKPERaVa3+advpX5f6f5yk055YL/0j9US&#xA;UB0WYMVPIrQ9BXbLcejMspx3ya8mrEcQyVzY15i/5yN0jTLawNjpMmoXtzbRXd3besI0tkmQSIrS&#xA;BJOTcWBNFoK9a7ZkYuy5SJs0Aa97jZe04xAoWSL9z1myuHuLK3uHT03mjSRoweXEsoJXlQVpXrTN&#xA;XIUSHZxNhJfMei6bq+p6ba6hD60PG4dRVlZWX0yCrKQRgSxK18peWLfzlqt1qqyy2Vo0EdlFMk0t&#xA;uH9BJHeWTgY2pzAVXbbfbphVlDxeRktJLu1NtHGmzPpsnpSMxNAi/VWRmZm2A6k7YFYtcwTXN7Df&#xA;m/liiiWVBLM73FpauZIniiN0edJQ0RZ5asqsAhqNmKojzd5g8yQeTdUa/hs7q0kgNvJdWsgYAT/u&#xA;gVBarH4614r407Yq8eXzdemSQrK9oZbZbaWeJQ8rqkCW6q1WjHHhHT2qTuaYoZ/+SVt+iG1HUNUt&#xA;bm2S6jgFjdPbz+k8R5s55hSlNkNSflil6lJ5o0YhVs511G5kbhHaWjxySk0LbjkoQADcuQB44Fb0&#xA;/wAwRXOpSaXc201jqKR+usE3AiSLlxLxvGzqwBIBFQR4YqmuKvNP+ciI0f8ALG8ZhUx3FsyHwPqB&#xA;f1Mc2HZZ/fD3FwO0h+5PwSfXv/WZYv8Atm2X/J+LLsX+OfE/cWnL/in+aP0J7/zj9pdrZfljp08S&#xA;BZr957i5cftMJmiX7o41GUdpzJzEd1N3ZsQMIPfbB/8AnKi2hR/Ld6ihbo/WojMNmKJ6TIK/5LMS&#xA;Pnmb2OT6h02/S4fa43iff+hFfnrF5i0Pz15f882dobvTdMijjkoKqsiSyOyyUB4CRJKBvH3yHZxh&#xA;PFLGTRLPtAThkjkAsBlHlT89/IHmWe2s7rnpmoOy+jFeqpiM1DT05lqoPYF+Ne2Y+bs7LjBI3Hk5&#xA;GHtHFkIB2Pmx3/nJEodR8lxtQ87uf4SKggNbg/ry/srlP3D9LR2p9UPf+p6p54/5QvX/APtm3f8A&#xA;yYfNbpv7yP8AWH3ux1H93L+qfuee/wDOMacfy/vDWvPU5m/5IQD+GZ3a/wDej+r+kuD2T/dH+t+g&#xA;Jf8A84tQgeW9amru94iEf6kQP/G+WdsH1x9zHsgeg+9R81/+tLeXv+YeP/k3Phw/4nL8dyM3+Nx9&#xA;363uWaZ27wT8iP8AyaHnT/Wn/wCos5u+0f7mH46Om7P/AL6f46o3y3MZv+cmvMDkUItClB/kQ26f&#xA;8a5DKK0cff8ArZ4j/hcvd+p7dmnds8t/5yQ/8ls//MZb/wDG2bLsr+++Bdf2n/c/EJ/orKv5N2LM&#xA;Qqr5diLMdgALEbnKJ/4wf6/6W7H/AHA/qfoYr/zjEhX8v70no+qTMP8AkRAP4Zk9r/3o/q/pLi9k&#xA;/wB0f636Ai/+ckP/ACWz/wDMZb/8bZHsr+++BbO0/wC5+IY3+Y0Ih/5x08vIDWsOmvU/5cPP/jbM&#xA;jSm9XL/OcfVD/BY+6LP/AMnPLlhpH5daQsUKiXUbZLy8kIHKVrhfUHMjqFRgo9swddlMsp8jXyc3&#xA;Q4hDEK6i/mzcAAUHTMNy0k81TvYWsetRuA+nkj0WUsJhMVj9IFd1Zn48W3A77Yqg9GbVLkXF7Zan&#xA;YSTXkgnubNFNxHGwjWIIsqSI2yxqGYrua7DFUrk0zU9Y1p9S1fTxd2lm721tZ2MkY+JTwkeZ5vQZ&#xA;+fTiGpx23qalWSx+YNJt0WKZJdPRAFAuIJIYlA6AS8fRp8mwKhtQ8veVfMWl3MMcVpMt1G0YvIFi&#xA;dkLdHV17ht+uKvnvy15buG8922iXlq1xJbXLC6tFKVkW3q7oDIyJRlQ9W6YUPo8eYbKOi3MFzaEb&#xA;H1beXgvzlRXiH/BYEsY8zeZooNf0W+0W6tdUnuGl08WCSoWPq0dmDqSF+KNAS3T6ThViker6pL+c&#xA;VlbXEDafc+u0klsZFmVBLaRBwGX4T6iQDttXxxV7NgV5l/zkXN6f5ZXKUr61zbpWvSj86/8AC5se&#xA;yx+++Bdf2mf3J+CUa8Qf+cZYv+2bZf8AJ+LLcX+OfE/cWrL/AIp8B+hk/wCRDl/yp0InsLlf+Bu5&#xA;R/DMbtH+/l8PuDkdnf3Mfj95YF/zlX/vN5a/17z9UOZ3Y38Xw/S4XbH8Px/Q9d1Dzp5bsPMtt5av&#xA;7lYNRvoPXt1losbqXMYTkT9tiDxXvTNXHTzlAzA2DtJZ4CYgTuXkP/OQnk7ynHFpf6FsoYPNWoXi&#xA;Qx2doqo88UivVmiSgr6nEB6V3p8tp2Znmb4j6AOrq+0sENuEesnos/5yEiuNOg8hSXbNMbD1Vup+&#xA;vJ0FsSSfFuDHD2YRI5K6/tXtK4+HfT9j2DzfcQXPkPW7i3kWWCbS7qSGVDVWR7dirKR1BBzVYARl&#xA;iD/OH3uzzkHFIj+afuec/wDOOAlm/LLVok3c6hcpENhu1rBTf5nM/tTbMPcPvLg9l/3R95+4IH/n&#xA;FzUbcaXrmkuwS9iuEuDExoxRk9Mnid/hZKH5jJ9rxNxl0YdkzHDKPW0H+a9+fLP53+XfMt+jfosw&#xA;xAzAEgKrSRzUoN2jWQPT3GS0UfE00oDmx1k/D1EZnk9X1P8AMvyNYaJJq7azaz2yx8444Jo5JZTS&#xA;ojjjDci56U7d6ZrYaTLKXDwl2U9XjjHi4hTyL/nHaW7l8/eapbyE295IjtcwMCrRyNc1dCDuCrbZ&#xA;tO1ABijXL9jrOzCTkmTz/ai9Au47H/nJnV0vSIHvI3htuRoGZoYnTc8ftKm3vtkMkb0YroyxyrVy&#xA;vr+x7zmldy8n/wCcl5HX8u4VU0D6jArDxHpyt+sZs+yR+9P9X9TrO1T+6+P62TeXrJ9U/J7TrC2Y&#xA;GW88vxW0ZqKc3sxHv8mO+Y+SXDqCT0n+lycceLAAOsP0PNf+cdfO2iaTpupeWNZuY9Nvku2uIPrT&#xA;CIPyRY5I6vQB0aLoTU126HNh2pp5SInEWK6Ov7MzxiDCWxvqr/8AORHnbSdR8vp5f0eZdQlimju9&#xA;Snt2WWKCJSY0V3UkB3kdaD+owdmaeUZcctugZdp6gSjwx36lv8yJUl/5x18vMnQQaYhr4pBxP4jB&#xA;pRWrl/nfeuqP+Cx90XqX5cyJJ+X/AJaZDUDS7NSfdYEU/iM1uqH72X9Y/e7HS/3Uf6o+5kWUN6W+&#xA;Yg/6NDJG8vpXNpKyRqzvwiuo3chVBZqKpNAK4qlN4ll5muPSsoo/Rtj/AKVqU1urSJIP90RLMvJX&#xA;HVyR8I26n4VUnh8vTLqq6FZXYdIFE2rajH68VzGHPNVMyzlWml324fCm/wDKCVeW/mV5n0i+1dLL&#xA;y/bQWum6ceMdzboqPNKuxk5qASq0ou/+V32UM3/LO28z6pozapqtnb6rbMSlnJORFfEKfjdLjgWY&#xA;V+H4nG46imKVO203SZvzRm1BL6TQ10+BFnN1NG9wbuVGQRq87XEbfuiOhbagHsq9KSDXlUPbajBd&#xA;wkVX14fjb/nrC6IP+ReBXnHnHU7iT80vKttfR28Etq6u5hlMopK9ByZki4n4OlPpwqhrmN5v+cgk&#xA;aJTIqGNnK7hQLIAk06b4q9lwKl2u+XtF1+x+oaxaJeWnMSejJXjzWoB2I6VyzHllA3E0WGTHGYqQ&#xA;sKUvlPy7L5eHl2SxjbRAqoLHf0+KOJFHWuzgHrhGaYnx36u9BwxMeGvSidF0TStE0+PTtKtltLGI&#xA;sY4ErxUuxZqVJ6k1yOTJKZuRsphAQFRFBLfN3lvyZq1tFdeaba2ltrAOY57t/TjiEnHmSxZQK8F6&#xA;5Zgy5ImoE2e5hmxY5C5gUO9b5m/L7yb5nkSXXNKhu50HFZ/iil49lMkTI5ArsCccWpyY/pNIy6bH&#xA;k+oWs8tflx5I8s3BudF0mK1uSOP1hmkmlAOxCvM0jKD3ocOXVZMgqRsIxaXHjNxFJnr3l7RNf09t&#xA;O1mzjvbNiH9KQdGFQGVhRlahIqprlePLKBuJotmTFGYqQsJPo35YeRdFiuotO0sRR3tvJZ3KtLPK&#xA;Ggm/vI/3rvQNTemW5NZlnVnkb6NWPSY4XQ57Jr5f8saB5dtZLXRbJLG3lf1ZIo+VC9AvL4ieyjKs&#xA;uaWQ3I2248UYCoikl1P8pfy81PVH1W70aM38rF5ZopJoeTN9pmWJ0Uk9zTfLoa3LEcIls0z0WKR4&#xA;jHdOdU8qeXNV0iPSNR0+G606FVSGCRa+mEHFeDfaUhdqg1yqGacZcQNFunhhKPCRYYVrfkv8t/y7&#xA;0W8822PlyOe500RyRpJNLIeTSqishnaZUZS1aha5mY9RmzyGMy2P46OHkwYcETMR5fjqmP5Vy+Wd&#xA;b0ybzhpejJpV5q8swu2EhlkkKykszsQo+J/i2GV6wTgfDMuIRbdIYTj4gFGSbeZ/y68l+aJ47jXN&#xA;Lju7iJeCThpIpOINQpeJo2IHYE5Vh1WTGKiabM2lx5N5C0y0Hy9o+g2JsdJtxbWpdpWTk7ku1AWL&#xA;SFmJ2HfK8mWUzcjZZ48UYCojZrX/AC1oXmGzSy1qzS9tY5BMkUlaCRVZQ2xHZyMcWWUDcTRXJijM&#xA;VIWEVp+n2enWMFjZRCC0tkEcEK1oqKKACuRlIyNnmyjERFDkx3zD+Vn5f+Yb032raNFNdt/eTxtL&#xA;A7nxcwvHzPu2X4tZlgKjLZoy6PFM3KO6tD+W/kaHRX0WLRrdNMldZJoAG/eOlSrSPXm5Wu3JsB1e&#xA;Uy4uLdkNLjEeGhTH/wA1rzyr5W8i2UN9oSaposVzDbQ6cJDEsdI5CjA0avHhSnvl+ijPJkJEqlXN&#xA;o1koY8YuNxuqZR5HvLG98n6Rd2FoLCyntY3t7JW5iJCvwpyoK0zG1ESMhBNm3IwSBgCBQpPMpbkm&#xA;1vzRpmlsLYzRNqUpVLe1dwgLSV4mRjsifCSSe3QE0BVYaPy/GnLDZ2Gv6odVviZRHb3JhtVBPKSd&#xA;40FfTVm2HOrEgV3rhVJvzO8z2nlvSD5O0SRnu7gGTV7125TN6u7+o/VpZq1Ynou3QiirAPIPk648&#xA;06/FZDkllFSW/nX9iIHoCf2n6L9/QHFD6D81a9p/lDyrJdRxqiW0a2+n2w+yZOPGJAKjYUqfYHAl&#xA;g/5F3ourbW5r25SW8vrkPIjsPUclSXYoexL4Sr0Z/LWhly8dottKxq0tqWtpCfd4DGx+/ArzfQfL&#xA;C3/5w6zc3Qa6s9JRKG4Pq1klhVI1YvUmi8iPlhV6laafYWSstnbRWytuwhRYwabb8QMCsT8wfmpo&#xA;2mapLo2nWN9r+sQf702elwmb0a/79fZV+Qr70zLxaOUo8RIjHzcTLq4xPCAZS8kv8ufnZoOpa4mg&#xA;atYXnl7WZWVIba/j4B3f7CBtmDN25KAexyzL2fKMeKJEo+TDFr4SlwyBjLzZL5x876B5SsI7vVpH&#xA;5Tv6dpaQL6k88n8sabfeSB77jMfBp5ZTUXIz6iOIXJisX51RQ6tZafrXljV9I/SUiQ2E08IId5CA&#xA;ARVSDvuF5EeGZJ7PuJMZRlXNxhrwJASjKN8nmf8AzkL5p07V9e0mytVuY5dLuLq3vPWjZImZJI1D&#xA;Rdef2W3Htmx7MwmESTW9Ov7TyiUgBe1vY7H81vLl9pmr6jb21/8AV9FgNzciS2MTPGKn90JCoY/D&#xA;3IzUy0UwQCR6vN2sdXExJAPp8klvP+cgfI9v5di1lUuna5lkitdPKxid/SpykIDsqR1alWNT2Bpl&#xA;0ezMhnw7e9pPaWMQ4t9+iNm/Oryja+XtK1W9EyXerx+paaPAonu2HMxj4VIWjMvwliK/OuQHZ+Qz&#xA;MRyj16Mzr4CIJ5y6dVl1+bF/pts1/rHk7WLLS1AZrsLDKUXu0sauGjA98I0QkajOJkstYYi5QkAy&#xA;vR/Neha3oja1pFyt9YqrMTFs4KCpRkfiVf2an3ZizwyhLhkKLkY80Zx4omwxLSvz28kalplxfxpe&#xA;xCGSO3htnhVp7meUMVit44nkLsOO9aAVG+ZU+zskSBt+r3uNDtDHKJO/6/cg7j897DTLqJfMPlvW&#xA;NEs7huMF5dW9FPc8lJB27heRyY7OMh6JRkfIsD2iIn1RlEeYTb80tRsdS/KTWr6wnS5s7i0EkE8Z&#xA;5Kyl13ByrRxMc8Qedt2rkJYJEcqYR+Wf5j+X/Kv5Z6HZGG61TWbv61P+jLCP1plQXUq83FQEWid9&#xA;/bMzV6WeXNI7CIrc+5w9Jqo48MRuZG9h72UeVvz18sazrUeh31pdaJqsrCOKG8QBWkb7MfIGqs3b&#xA;kor88xs3Z04R4gRKPk5GLtCEpcJBjLzTLTfzY0S989SeS3s7q01aJ5kLziMROYl5qYyrsxEkY5iq&#xA;jbK56KQx+JYMWyOsicnh0RJm+YblsHj/ADe8snzBrelSJNDb+Xkd9T1Vwv1ZODKnAcSZGcyMUCha&#xA;kjauZv5GfDGX87kOrh/nYcUh/N5nok9z+etvFaDVl8ray/l0nbV/RVUK1pzClqcD2JYVy0dnEnh4&#xA;48fc1ntAAcXDLh70/wDMP5peXtB8r6Z5mu7e8fTdVKC29KJfUHqxtKnNXdKclQ9CcoxaOc5mAIuL&#xA;dl1cIQEzdSYf+f8AeQ6v+Uun6rAGjgubizvI45AOYSaFyqtxLKGAk3oTmV2bHgzmJ7iHF7RPHgEh&#xA;5Fn/AOXMSR/l/wCWlQUB0uzYjru8CM3X3OYOqP72X9Y/e5ulH7qP9UfcgpvzQ8vDzefKdlDd6lqy&#xA;UFx9TjV4oTUBvVkZ0C8Kjkeg6fa2ywaOfh+IaEfNgdXHxOAWZeSp5fg1y30GC75Wl+L2Jbu69cPB&#xA;IzyoGYvKPXVqdAPTUAAAUGYjlJBbnyhrsT6iuj6d6catIy215FFdpGlSXmhpDGB1b94/TqBvhVLP&#xA;+VfeUPOtgmoaJqAt5nB5RvFAsq8SVCyR25iVa9eTKWI74qyPyjosnkTQpobnT/XVec99qdrLG3JU&#xA;qeUizegyqifsry7+JwK8r/NHzt/izXILbTS0umWoCWihSGklkpzfiRyrWige3vhQ9o8o+SdN0jyr&#xA;aaReWsNzIB614JUWRWnehc/ECDxoFB8AMCUy/wAO2ce9lPc2LfsiCZjGPlDJ6kP/AAmKu0TQY9Ll&#xA;v5zM1zdajOJ57iRUVzxjWNVPAKtAFr06k4qmmKpJc33k7yubia7u7PSWv5Wup2nlSJppSAGf42BY&#xA;0Wm2XCOTJVAyrZpMsePmRG3gn/OQfm/ypr8ujXOgXBuryyaVJb6KN1iCniyIJWChyrAkca03zd9m&#xA;YJwEhIUC6btLPCdGJshPPz1u9Z0Lz55T80zWhutL05IuQUERfWUmaSVAx5cGZOPCo7d6HKezoxni&#xA;nAGifube0ZShlhOrA+9nvl780/y085S2dstxGNQWVJrWxv4/TlWddkMbNWMyCu3BycwcujzYrPTv&#xA;Dm4tXhy0OvcWIf8AOQ0KzeZPIMLEhZLydCR1o0toMyuzDUMnu/W43aQueP3/AKnpv5hf8oD5l/7Z&#xA;V9/1DPmv0397H+sPvc/U/wB1L+qfueY/842+UtGk8r3Ou3drFc389y8EMkqh/ThjVfhTkDx5OzE0&#xA;67Zse1c8uMRB2p1/ZeGPAZEb2kP5D21p5k/MnW/MdzBHxs0MlhAFCpCZpOMXpqAAPTiQquXdoyOP&#xA;DGA682ns4DJllM9OT6ImhhnheGZFlhlUpJG4DKysKFWB2IIzRA1uHeEW+ePyyZtB/OPzH5OtXKaV&#xA;qBu4Iod2VDEGkhah7pHyX3ze6v16eOQ/UKdJpPRqJYxyNr/+cXvL9lcXer65cRrJcWXpW9izb+mZ&#xA;QxlZQejFVVa+FR3wdr5SAIjrzXsnECTI9OT23zrodnrnlTVdMu0V457aTiWFeEiqWjkHujgMM1Gn&#xA;yGEwR3u3z4xOBie588/l9rV1c/kr560iVi0GnrDNb134i6Y8lHtyhr8yc3upxgajHLv/AEOj0uQn&#xA;T5I936Xp3/OOmhWdl+XkGppGv1vVZppJpafEVhlaFEJ8B6ZIHvmu7UyE5eHpF2HZmMDFfWTFv+cp&#xA;NOtkTQNWjUR33Oa3aZdmZFCugLDf4G5cfmcyex5H1R6OP2vAemXVT/O/T7zRNa8sfmNYrWdTBHfE&#xA;fCGmiHqRlqf78QMjewAw9nyE4yxHzR2hEwlHKHsGtecdN0/yTcea43D2S2Yu7YttzMigwp83ZlX6&#xA;c1WPAZZODrdO0yZ4xx8fSreE6z5G121/Iw6oIZJ9W1m/j1fWmAJk+q8JPT5AblVLrIfDka9M3UNR&#xA;E6nh/hiKHv8Axs6bJp5DTcX8UjZ9343Zt5H/ADv/AC+1Ty/aaHrjLps620dncQXMdbSQBBG3FxyV&#xA;UYdpKU6b5h6js/LGZlHfe/Ny9Pr8UoiMttq8vx71H/nJNbRfy10hbPh9TGo24tvSoY/TFrPw4U24&#xA;8elMPZV+Mb50fvCO1K8IVysfcVn5xRCH8i9IhBqI105AT34w0w6E3qZf533rrRWmA9yD0/8AM2XV&#xA;vL/lfyF5Muki1y50+1tr/VJf3aWgit1EqxcuJkmHE/Z6dt91lLScMpZcg9Nmh37/AHMIavijHFjP&#xA;qoWe7b73qXkjyJoXk/S/qWmoXnlIe9vpaGeeTc8pG8BU8R0Hzqc12o1MssrPy7nY4NPHEKHz70To&#xA;n/KHWH/bOi/5MDMdveD69ruq3muXtheus9pDZSRW0UsaERrFbmRDHUVVuQ+0NzhQ9Y/LHS9Nvvy7&#xA;0YXtrFccVm4GVFYr/pEm6kio+jAlCfmzpv6P8i3z2d3dRxs0KSW7TPLGytKop+99RlHsjD7sVYH+&#xA;SflM6p5hOr3EdbLSqPGSNmuT/dj/AGH29uh4+OFD6AwJdirsVWTtIsEjRLzkVSUTxYDYfThHNBfP&#xA;f5A2WleafMWv6z5mEeqa9G0TwJdgSFQ5f1JEjeo+Eqqig+DoKVzedpSljhGMNo+X4/tdJ2bGOScp&#xA;T3l5/j+xV/5yi1nTn/QmiW80bXdqZZ7m3T7USOqLFypsOQrt1p7YOyMZ9UjyKe1sg9MRze1X+seW&#xA;bjUoPLl/JBPc6lbtcQ2Uyh0mhQ0agYFG8ePgCegOaiOOYHGOhdtKcCeA9ejxP8/Py18o6Lpllq2g&#xA;2wsNVurxbdbG3J4zB1Y1jh34srBfsUG/StM3HZuryTJjI2AObqO0dLCAEoiiTyd+dLXenar+XNxq&#xA;zMZLVEN7Me8kL25mNT3746CpDII9f2p15MZYzLpz+x7J+YJB8geZSDUHSb0gj/mGfNTpv72P9Yfe&#xA;7TU/3Uv6p+5hv/ON/wD5LZP+Yy4/41zL7V/vvgHG7M/ufiWF/lIF8ifmxrPlbVmFsl+pi0+aSirK&#xA;Vk5W9D0/eRs1N/tfD1zL1v77AJx6c/0uHov3OYwl15fofQN5eWtlay3d3KkFtAhkmmkIVERRUsxP&#xA;QDNHGJJoc3dykALPJ4H+T9lL5o/NzXvO0UbLpMEtwbWVlI5POSkab9xCSzeG3jm710vDwRx/xbfZ&#xA;+10uiHiZ5ZP4d/x8lH/nF7X7S3u9W0S4cRzX3pz2PLYSNCGEyKT1YK6txHapw9r4iQJDpzR2TlAJ&#xA;ievL9L2T8xPM9h5b8n6lqV3KqN6LxWkZO8lxIpEaKO9TufAVPbNVpcJyZAA7TU5hjxkn8F4X5M8t&#xA;3WlfkX5w1q8UwrrKQraq4oWigfij/J3lYD5Vzc58olqYRH8LqMGIx085H+J6n/zj/P6n5V6SnGno&#xA;vdJWvWtzI9f+HzW9pD98fh9zsezj+5Hx+9iP/OVDL+h9AWo5G4nIXuQEWp/HMrsf6pfBxu1/pj73&#xA;p/nPylb+YvJV75fNGMtuFtJG/ZmiAaFiR/lqK07VzXYM5x5BPzdhnwjJjMXgPkTUdY836fon5YXE&#xA;ciWlhfS3WrSHYiygIcQt3r6ruu/Q8PDN3qIxxGWYcyKHv/H6XSaeUsojhPIHf3d348n0drevaJ5f&#xA;soZ9UnSzs5ZY7WN2FIw8myA02Vdup2AzQY8Upmo7nm77JkjAXI0GB/mr+V3kG68satrTWcOmaha2&#xA;0tzHfW9IQ0iKWVXRfgf1Gov2eRrsa5naPWZRMRuwS4Ws0mIwMqogPKNeg1SH/nHXQjfl+MutepZK&#xA;9arbmC4C0r2LBmHsc2WMxOrlX839IddkEhpY3/O/Wzj857tn/I7QJAAouTp/JetAbVnpXbuMw9BH&#xA;/CZeV/e5eul/g8fOvuQXmj8q21v8uvLXmny4hj8yafpNg8i2/wAL3CxW6Gq8aH1o6fCRuacf5cnh&#xA;1nBllCf0GR+G/wBzDNo+PFGcPrER8dvvZl+Tf5rQ+cNN/R+ouI/Mlkn+kpQL68a0HroAAAamjqOh&#xA;9jmJrtH4RsfQfscvQ6wZY0frH4tmF75b0tbaZ7NHsZODkfU3aFSaH7USH0n/ANkpzXue8O1Tzhq9&#xA;9qGoaXNNFc6fFYzQ2wMcZMYjtyeUcgHIMaENvvU4UPUPy2vpdL8kaVa6jZXUNI3kSdYTNGySyNIh&#xA;/ceoy/C4+2q4EqX5p31lq3kS7h0yeO9mea2jWKBg782nQBeK1INTSmKsi8keWYvLflq00xQPXVfU&#xA;u3H7U77ua7Vp9kewGKp7irsVdirsVYDrX5IeRNU1ltYEVxp9+8nrSyWMxh5SEkl6UbiTXfhTM7H2&#xA;hljHh2I83CnoMcpcW4Pkj2/KX8v30J9Fk0pXs5JRcSyM8hnecAgStPy9Qt8Z/apv0plf53LxcV7s&#xA;/wAni4eGtvx1QWp/kj+X9/b2sRtbi3lslEdrdRXU5mRASwUNI0mwZqjbbttk4doZYk7jfyYT0GIg&#xA;bcvNGaD+VXlTSdRi1Rxc6rqcAC217qc7XUkQBqPTDURSD0IWo7ZHJrZyHDtEeWzPHo4RPFvKXed0&#xA;083eS/Lvm3TlsNbtvXijbnDIrFJI3pTkjruPcdD3yrBqJ4jcS2ZsEMgqQSzSfyw0LTtKutKN7qV7&#xA;YXVs1k1vd3kskaQvTksSDiidKVUdMsnrJSkJVEEG9g1w0kYx4bJFVuU38q+U9F8raV+i9HiaKz9R&#xA;pQju0h5PSu7EntlWbNLJLilzbcOGOOPDHkpeafI/lbzTAkWuWCXRhr6E1Wjmjr/JIhVwO9K09sOH&#xA;UTxn0mkZtPDIPULSCX8nPLt1GLfU9T1nU9PUqRp15qEz29E6DiOJ/HLxr5jcCIPeBu0HQwOxMiO4&#xA;yNMw0zS9K0XTo7LT7eKxsLdTwijARFHUk/rJOYs5ymbJsuVCEYCgKDwP/nHzyroXmTyvrlnrFsLi&#xA;OO7gkgkBZJYpBG1HjkQqyN8j883faeaWOcTE9HTdm4Y5ISEh1elJ+Snk2S9iu9Vlv9baD/eeLU7u&#xA;S4jQbUUL8NV26GozX/yhkqo1H3Bz/wAhjJuVy95ZZrvl3Sdc0SfRL+HlptwqJJDGTH8MbBlClaUo&#xA;VHTMXHllCXEObk5MUZx4TyWeWPLGkeWdIj0nSY2isYmd0R3aQgueTfE1T1w5s0skuKXNcWKOOPDH&#xA;kgfOP5f+WPOCWqa7A862Rc2/CR46GTjyrwIr9gZPBqZ4r4erDPpoZa4hyTm7urHSdLlurhxDY2EL&#xA;SSud+MUS1J+hRlMQZSocy2yIiLPIPNPyL0Y3EWt+ebmAQXPma8mltYwB+7thKzUH+tITXx4g5se0&#xA;clcOMfwD7XX9nwviyH+M/YzzzX5Q0HzVpf6M1u3Nxaq4ljCu8bJIqlQ6lCNwGPXbMHDnljlcebm5&#xA;sMcgqQ2YvZfkf5LtzClzLf6lZW7B4NOvbp5LVCOlIlCAgeBzJl2jkPKge8Ddx46DGOdkdxOzIvNX&#xA;kXy35o0y20zVrdnsbRxJBBC7QqrKhRaBCuwViAMow6ieMmUeZb82nhkFSGwQvmf8uPL/AJi8sWHl&#xA;q7e4h0zTmhNuIJFEhEETQorPIslRxb51yWHVyxzMxVlhm0sZwEDdBOfL+i2uh6LZaRaPJJbWMSwQ&#xA;vKVMhVdhyKhBX6Mqy5DORkerdjxiEREdGI335LeU7jzSfM9pPe6XqhkEwaxkjijEo+04Vo33f9sd&#xA;G7jc5lR18xDgIEh5uLLQQM+MExPkzq3uLe4iE1vKk0TV4yRsGU0NDQio2IpmC5qVahoflLVSJr20&#xA;s7mSdjAtwyxmR2WoaNZB8RI4MCAexxVNpJYYQnqOsYZgiciFBZtlUV7nsMVQVyfL89xFJdfVJbmC&#xA;ZY4Xl9NnSfqqKW3WTwA3xVGz3EECepPIsUdQvN2CirGiip7kmgxVDfprRvW9D6/b+t6noel6qcvV&#xA;rT0+Na8q9uuKuGt6Mbj6sL+3NzyKeh6qc+SmhXjWtQe2Kr73VNNseH127htfUNI/WkSPkR4ciK9c&#xA;Vbl1HT4SRNdRRlY/WYPIq0irTman7NTSvTFVBdf0JjGF1K1JlIWICaMlidgF+LfFVK61i5gvWtVs&#xA;JJDyhWBxJCvqrIf3rorMGpAKFtu+2KoqfVtKgnNvPewRXAHIwvKivQ9+JNaYqtGtaMbR7wX9ubSN&#xA;uElx6qemrbHiXrxB3xVcdV0sWQvjeQCyPS69RPS60+3Xj198VUzruiKkUh1C2Ec9fQczR0ehoeBr&#xA;8VPbFXDXdEKSuNQtikFDOwmjonI8RzNfhqdt8VXLrOjtHLIt9bmODj67iVKJ6honM1+HkeleuKql&#xA;nqWnXoY2d1DchNmMMiyU+fEnFVt0y3elzG1ZZ1nhf0WRgVfkp40atN/nkomiES5PK/yA8qa75Wg1&#xA;e01sQQveyRSWcMc8MzP6PqJMR6TOfhain3zY9paiGUx4TdW67s7TzxgiQq3rfrwGc24kX1wokMXI&#xA;cwhJAbj1oSCK5rHZOWeF3kjSRWkioJUBBK1FRyHao3xVoXVsbb60JkNqU9UT8h6fp05c+XTjTeuK&#xA;qFtq+lXTMlrewTugq6xSo5A8SFJpirzz84W1HzJ5ci0by9qOnrZ3coOqXct3CgEaMpWNd96t8Tf6&#xA;tO+Z2hyY8cuKfTk4Wtx5MkeGPXmzbTrnyzomnW+kQ31tBDp0MVusbzRqyqqgJyqRuw398xJzMpGR&#xA;5ly4QEQAOQTS4ube2hae4lSGFN3lkYIoqabsaAZBk6a4t4YxJNKkcZKqHdgoJY0UVPck7Yq3LPBE&#xA;UEsixmVgkYYgcnIJCrXqaA7Yqhn1rR0tY7t7+3W1lJWK4aVBGxFQQrk8Sdjiq6DVtLuI0kgvIJY5&#xA;JPRjdJEZWkpy4Ag7tTenXFVeWaGFOczrGlVXk5CirEKoqe5YgDFWM/lgEHkiwCGo53Na/wA31qUs&#xA;PoOKpHc6Wt/5X0fT/rL2zXWtXbQXUJo6P6t5NG6n2oD74VV11y5upbLy/r4+r+YLC+tZVYUEd5Ek&#xA;oAni7b/tKOh/BVQn0JtVtvOdtabX0OpJd2Djqt1FbxSJT5t8P04FTWz1SDzZNoLxAfVIol1W+QdF&#xA;mUmKCI/KYSN848VQvkqC6a71c/o23mtv05fv9deQeqhExFVjMbdOP84xVjty63P6Y8uvaRW8Ws61&#xA;dxQazOaxxzclfioUFvVP7FSoJ79sKsm8w2Ws6Tq9xrkNgmt6VLYJaX9o7AXKRxFizR8gVdWVyWTq&#xA;xwK3pz6ZqXnWzureMNY3Hl5Wt4nUU9KS5VgpQ16ADbFW/LWm6d/jjzaPqsNIZbAwj01+Am1B+Hbb&#xA;ffbFUn816rdtrDeY7WC6lh8u3CxwtEhMDwLVNQJatK/Fx9vT98Kp7+YUOm3XlKS+SKKUyy2DR3HF&#xA;SzI93DSjUrQqcCq/mfQdRWTTNQ0C1tpJdKnknbTJKQxz+pH6ZKsBxWRR9ljiqUt9b1uw07VvL9gk&#xA;F3omoXDXeiXREatcEMsw5rVfUVpCyN0qa4qilutH1nyXrNwmlrZXNql9HdWsqIXiugheWjAUNSwb&#xA;kOuKpRrlpaw/kvaywwRpNJZaUXZVClyZbc/EwFTU4VTPzrDcf4H1k3OmW9k8noVWCQSep+/T7R9O&#xA;LxwK35bK6v5xutUe3j0u50mFtPn00b3DGRhIJZSAq+nQfu+Na9a9sVS3Qbu98p2NpqR53HlPUwst&#xA;yCeT6fPKd3A/3w5PxD9k7/Mq2/o2Wm+XvMkBUw2WqXcdxIDVfq2oXcsbvy3qA7IwxVW9Z7XzfZea&#xA;3kK2Or3M+kPU/AsKALauO1Hmgdq+DjFVd7qWPyyZI0lbUPNl08oWFS0y20v7SjY1js41Hb4qYqh/&#xA;L96YvKHmTy9KksUujQXK20c4Kymzmjd7csD4Cq/RiqG8sKmrap5fs5LWPS5dAs4bleR5T3cUtuIl&#xA;MRAC+l/P8RNdqDFU8/RWl/8AKxfS+pwel+h+Xp+mnHl9apWlKVpgVD6fDcN5x8zxw6Zb3kH1mzLv&#xA;NIEKf6HF9lTHJXx6jFWVa5pcWraNe6bLThdwvFU9iykBv9id8VefMLvzj5T03RQ7R3tpaTTXtGow&#xA;u7OttAr0/nmrJ/scKp9oeqp5o1DRL8UMVjY/XbhR0F3c1t1X/YCOf7xgVi9qjx+VvIy21ukrDVJe&#xA;FuxEaMa3GxPFqfdhVk/mfSG1TTdMsLqAaVJcakpJs5AWV1glZJVcLH8QZQenbAqXz+Ybz6tF5a8x&#xA;gJrkN9ppimoBFfQDUIP30XblT7advvoqvg/Rn1nUf0F+mv0Z68v179H+h9U9av770fW/f15Vr6Hf&#xA;phVPZP8ADv1by19X5fUvrKfoj0KcOf1WXhz5fFx9Ln7164Fb8z/4c/SOifpGv6T+uJ+ivT4+tzqO&#xA;fX/dfH7f4fFTFV/lr9D/AF/Xv0f6vrfXj+kPVpx9f0k/u6fs8adcVQvkb/CvLWv0Byr9fl+vc6f3&#xA;tf8Adf8AxVWvD6cVS/Rfqn6Uvf0X+mfq/wClZvrnH6t9V+s+v+++1+99Ll1p2xVbN/gv/DHmX656&#xA;/wCjf0ldfXvV4+p9b5LX6tx3/vKenXevtirrn0eE/L9PfVfqsX6Wp9X4+n6X+7Of7z1PT+39X+Lx&#xA;3xVNNP8A8Nf4qsvqPP61+hR9S9On1b6h6ycaftcuXGntiqtpX6J/xH5l+p+v+kq2v6Rrx4cvq49H&#xA;0a/5HXl3xVU0P9A/4Qh9Dl+hvqz+p9Y+3wofW9an7deXP3riqRv/AId/5VpZ+p+kP0H/AKP6HLh9&#xA;b4/WV+r1/Z48uFP8mmKpx5lr9f076v8ApL6/Sb0f0b6PH0/3fqet9Z/cU+zTlv8Ay4qlMf6K+r2H&#xA;6G/Sv131bvn9V9L1/V5r9a+ufW/3NefH7X+w2xVMbD/D/wDhLUvR9f6pxu/0p6n+9XrUb6x6lf8A&#xA;dn4dKfDTFUHrP+Gv+VZ2/wBY+tfoH6rY+j6XH6z6fOL0Ovw8q8eX04qo6v8AVf8AC2r/AKc/TP1H&#xA;jB6vr/VvWp6u3oeltXlTlXtSmKplf/oL/HGn+n6/6e+rv6n1bjw+q12+t124cvsd64qifL36E/wj&#xA;b+ny/Q/1duX13jX0t+fq/sU617YqlA/wd/yrOfj6v+GPSn49PV9P1mp6df8AL+xX2riq/wAy/wCE&#xA;f+VdxfX/AFf8P+ja+h6P9/x5J6PGv7XSvtXFU1X9D/4msqep9a/R8n1Dp9W9H1E9T0/+LPsV/wAn&#xA;FUr1/wDw5/iK7+sfWfr/AOhp/r31fj6f1Krfb5f7s5V4f0xVQuP8LfVfKHpfW/rvCH9B+hx+t+j6&#xA;K8vWr8Pp8KerXbFU4H6J/wAeNT1v0v8AoteX2fQ+rfWGp/lepzr7UxVJJ/qv+Idb/R/6a+t+pF+k&#xA;vqf1X0+foL6fH1vj/u6dMVZzirFPJv8Ahj9NeZf0P6v1z66P0n6nHj6nxf3XHfhz59f2uWKt+Qf8&#xA;M+nrP6C9Xh+kp/rPrcaepUf3PH/dPXhX3xVjsP8Ah/8Awl5W+p/pin16X9EU+p/XPX5TV9X1/wBx&#xA;x+1T2phVPh/daX+lv0t6/wCl1+rfWvqXqep6D8ef1X936FOXT4uXtgVFecv8M+rov6Xp9e/SNt+i&#xA;eFPW9b1k+zX/AHX/AL89v8rjir//2Q==</xmpGImg:image>
+               </rdf:li>
+            </rdf:Alt>
+         </xmp:Thumbnails>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+            xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
+         <xmpMM:InstanceID>xmp.iid:0780117407206811994C9C34F45CB20B</xmpMM:InstanceID>
+         <xmpMM:DocumentID>xmp.did:0780117407206811994C9C34F45CB20B</xmpMM:DocumentID>
+         <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID>
+         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+         <xmpMM:DerivedFrom rdf:parseType="Resource">
+            <stRef:instanceID>uuid:e7b4fc01-5a51-2045-9af3-a27d25aafae9</stRef:instanceID>
+            <stRef:documentID>xmp.did:018011740720681197A5C711CB152FC3</stRef:documentID>
+            <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID>
+            <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+         </xmpMM:DerivedFrom>
+         <xmpMM:History>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:D27F11740720681191099C3B601C4548</stEvt:instanceID>
+                  <stEvt:when>2008-04-17T14:19:15+05:30</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F97F1174072068118D4ED246B3ADB1C6</stEvt:instanceID>
+                  <stEvt:when>2008-05-15T16:23:06-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FA7F1174072068118D4ED246B3ADB1C6</stEvt:instanceID>
+                  <stEvt:when>2008-05-15T17:10:45-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:EF7F117407206811A46CA4519D24356B</stEvt:instanceID>
+                  <stEvt:when>2008-05-15T22:53:33-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F07F117407206811A46CA4519D24356B</stEvt:instanceID>
+                  <stEvt:when>2008-05-15T23:07:07-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F117407206811BDDDFD38D0CF24DD</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T10:35:43-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F97F117407206811BDDDFD38D0CF24DD</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T10:40:59-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FA7F117407206811BDDDFD38D0CF24DD</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T11:26:55-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FB7F117407206811BDDDFD38D0CF24DD</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T11:29:01-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FC7F117407206811BDDDFD38D0CF24DD</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T11:29:20-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FD7F117407206811BDDDFD38D0CF24DD</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T11:30:54-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FE7F117407206811BDDDFD38D0CF24DD</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T11:31:22-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:B233668C16206811BDDDFD38D0CF24DD</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T12:23:46-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:B333668C16206811BDDDFD38D0CF24DD</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T13:27:54-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:B433668C16206811BDDDFD38D0CF24DD</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T13:46:13-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F11740720681197C1BF14D1759E83</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T15:47:57-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F87F11740720681197C1BF14D1759E83</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T15:51:06-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F97F11740720681197C1BF14D1759E83</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T15:52:22-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FA7F117407206811B628E3BF27C8C41B</stEvt:instanceID>
+                  <stEvt:when>2008-05-22T13:28:01-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FF7F117407206811B628E3BF27C8C41B</stEvt:instanceID>
+                  <stEvt:when>2008-05-22T16:23:53-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:07C3BD25102DDD1181B594070CEB88D9</stEvt:instanceID>
+                  <stEvt:when>2008-05-28T16:45:26-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F87F1174072068119098B097FDA39BEF</stEvt:instanceID>
+                  <stEvt:when>2008-06-02T13:25:25-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F117407206811BB1DBF8F242B6F84</stEvt:instanceID>
+                  <stEvt:when>2008-06-09T14:58:36-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F97F117407206811ACAFB8DA80854E76</stEvt:instanceID>
+                  <stEvt:when>2008-06-11T14:31:27-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:0180117407206811834383CD3A8D2303</stEvt:instanceID>
+                  <stEvt:when>2008-06-11T22:37:35-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:01E540664A3DDD11BD33D3EB8D3A1068</stEvt:instanceID>
+                  <stEvt:when>2008-06-18T22:24:01+07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:6B6AE2A5723EDD11A6F1BABF7C5A7A51</stEvt:instanceID>
+                  <stEvt:when>2008-06-19T20:30:34-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:4092E9E2EA41DD1182ECEC1AE8587645</stEvt:instanceID>
+                  <stEvt:when>2008-06-24T16:20:02+02:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:E6A26685200711689FE8CB9EA85C5459</stEvt:instanceID>
+                  <stEvt:when>2008-06-26T05:49:50-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F79456976A48DD1194DA8463B7D22218</stEvt:instanceID>
+                  <stEvt:when>2008-07-02T12:12:23-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FA7F117407206811B1A49BC4792F6CFA</stEvt:instanceID>
+                  <stEvt:when>2008-07-21T18:23:38+05:30</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:498BDF92CE5CDD11805FF6297D832673</stEvt:instanceID>
+                  <stEvt:when>2008-07-28T10:56:58-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:4A8BDF92CE5CDD11805FF6297D832673</stEvt:instanceID>
+                  <stEvt:when>2008-07-28T10:57:16-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F1174072068118DBB8F5DDEBEE9D6</stEvt:instanceID>
+                  <stEvt:when>2008-09-29T21:06:48-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F87F1174072068118DBB8F5DDEBEE9D6</stEvt:instanceID>
+                  <stEvt:when>2008-09-29T21:07:22-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:2A40717309206811B1BE94AF60EC0B71</stEvt:instanceID>
+                  <stEvt:when>2008-08-04T10:59:11+07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:CA07664B0C206811B1BE94AF60EC0B71</stEvt:instanceID>
+                  <stEvt:when>2008-08-04T10:59:23+07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:018011740720681197A5C711CB152FC3</stEvt:instanceID>
+                  <stEvt:when>2013-05-24T10:09:28+02:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:0780117407206811994C9C34F45CB20B</stEvt:instanceID>
+                  <stEvt:when>2013-05-27T10:25:46+02:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpMM:History>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+         <illustrator:StartupProfile>Print</illustrator:StartupProfile>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>296.999959</stDim:w>
+            <stDim:h>210.001652</stDim:h>
+            <stDim:unit>Millimeters</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:PlateNames>
+            <rdf:Seq>
+               <rdf:li>Cyan</rdf:li>
+               <rdf:li>Magenta</rdf:li>
+               <rdf:li>Black</rdf:li>
+            </rdf:Seq>
+         </xmpTPg:PlateNames>
+         <xmpTPg:SwatchGroups>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Standard-Farbfeldgruppe</xmpG:groupName>
+                  <xmpG:groupType>0</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>Weiß</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>Schwarz</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>100.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=65</xmpG:swatchName>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:tint>100.000000</xmpG:tint>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>65.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=100 M=45 Y=0 K=14</xmpG:swatchName>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:tint>100.000000</xmpG:tint>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>45.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>14.000000</xmpG:black>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpTPg:SwatchGroups>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+         <pdf:Producer>Adobe PDF library 9.00</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>
%  &&end XMP packet marker&&
[{ai_metadata_stream_123}
<</Type /Metadata /Subtype /XML>>
/PUT AI11_PDFMark5
[/Document
1 dict begin /Metadata {ai_metadata_stream_123} def
currentdict end /BDC AI11_PDFMark5
+%ADOEndClientInjection: PageSetup End "AI11EPS"
+%%EndPageSetup
+1 -1 scale 0 -104.639 translate
+pgsv
+[1 0 0 1 0 0 ]ct
+gsave
+np
+gsave
+0 0 mo
+0 104.639 li
+294.368 104.639 li
+294.368 0 li
+cp
+clp
+[1 0 0 1 0 0 ]ct
+95.2983 63.8853 mo
+94.5405 64.02 93.7754 64.1636 93.002 64.3159 cv
+92.2275 64.4683 91.4619 64.6626 90.7046 64.8999 cv
+89.9478 65.1353 89.2744 65.4556 88.686 65.8628 cv
+88.0972 66.2681 87.6265 66.7759 87.2725 67.3843 cv
+86.9199 67.9927 86.7427 68.77 86.7427 69.7173 cv
+86.7427 71.3062 87.1968 72.5063 88.105 73.3179 cv
+89.0132 74.1294 90.0229 74.5356 91.1338 74.5356 cv
+92.4131 74.5356 93.582 74.1802 94.6421 73.4692 cv
+95.7017 72.7593 96.5176 71.9321 97.0903 70.9849 cv
+97.292 63.3774 li
+96.7197 63.5796 96.0552 63.7495 95.2983 63.8853 cv
+cp
+88.9741 52.0166 mo
+90.2593 51.6099 91.5776 51.4072 92.9307 51.4072 cv
+94.1479 51.4072 95.2642 51.585 96.2813 51.9404 cv
+97.2974 52.2949 98.1655 52.8027 98.8853 53.4624 cv
+99.6045 54.1206 100.169 54.9165 100.581 55.8452 cv
+100.991 56.7769 101.197 57.7974 101.197 58.9136 cv
+101.197 60.8413 101.164 62.7612 101.096 64.6704 cv
+101.028 66.5806 100.995 68.6001 100.995 70.7319 cv
+100.995 71.1362 101.002 71.5669 101.02 72.0249 cv
+101.036 72.4819 101.112 72.8872 101.248 73.2427 cv
+101.383 73.5972 101.578 73.8931 101.832 74.1294 cv
+102.084 74.3667 102.465 74.4849 102.972 74.4849 cv
+103.141 74.4849 103.319 74.4761 103.505 74.4585 cv
+103.69 74.4429 103.868 74.3823 104.038 74.2817 cv
+104.038 75.3979 li
+103.665 75.5669 103.201 75.7017 102.643 75.8022 cv
+102.084 75.9038 101.467 75.9546 100.792 75.9546 cv
+99.6934 75.9546 98.8535 75.6772 98.27 75.1187 cv
+97.687 74.5601 97.3442 73.8423 97.2412 72.9634 cv
+96.0278 74.1802 94.8315 75.0767 93.6523 75.6509 cv
+92.4731 76.2251 91.0249 76.5142 89.3062 76.5142 cv
+88.4634 76.5142 87.6377 76.395 86.8296 76.1577 cv
+86.021 75.9214 85.3047 75.5337 84.6816 74.9917 cv
+84.0581 74.4507 83.5522 73.7993 83.1646 73.0386 cv
+82.7769 72.2769 82.584 71.4077 82.584 70.4272 cv
+82.584 68.3979 83.2153 66.8257 84.479 65.7114 cv
+85.7427 64.5942 87.4868 63.8511 89.7109 63.478 cv
+91.5303 63.1753 92.9536 62.9136 93.9814 62.6929 cv
+95.0093 62.4731 95.7671 62.2446 96.2554 62.0083 cv
+96.7437 61.771 97.0391 61.4917 97.1401 61.1714 cv
+97.2412 60.8501 97.292 60.4351 97.292 59.9292 cv
+97.292 59.0835 97.1904 58.272 96.9878 57.4946 cv
+96.7852 56.7163 96.4634 56.0405 96.0244 55.4653 cv
+95.5845 54.8901 95.0103 54.4253 94.2998 54.0698 cv
+93.5894 53.7153 92.7275 53.5366 91.7134 53.5366 cv
+90.3608 53.5366 89.1011 53.8423 87.9346 54.4517 cv
+86.7681 55.0601 85.8975 55.9048 85.3228 56.9878 cv
+84.7646 56.9878 li
+84.7646 54.3501 li
+86.2861 53.1997 87.6895 52.4219 88.9741 52.0166 cv
+cp
+false sop
+/0 
+[/DeviceCMYK] /CSA add_res
+1 .45 0 .14 cmyk
+f
+107.004 72.4048 mo
+107.359 72.811 107.782 73.1919 108.272 73.5464 cv
+108.762 73.9009 109.32 74.1978 109.947 74.4331 cv
+110.572 74.6714 111.24 74.7886 111.95 74.7886 cv
+112.591 74.7886 113.209 74.688 113.801 74.4849 cv
+114.392 74.2817 114.917 73.9946 115.373 73.6235 cv
+115.83 73.2505 116.192 72.7778 116.464 72.2017 cv
+116.734 71.6274 116.869 70.9683 116.869 70.2241 cv
+116.869 69.1763 116.573 68.3735 115.982 67.8149 cv
+115.39 67.2563 114.655 66.8003 113.775 66.4448 cv
+112.896 66.0903 111.933 65.7788 110.884 65.5083 cv
+109.836 65.2378 108.873 64.8569 107.994 64.3667 cv
+107.114 63.8765 106.378 63.2251 105.787 62.4136 cv
+105.196 61.603 104.9 60.4858 104.9 59.0669 cv
+104.9 57.9507 105.085 56.9282 105.458 55.9966 cv
+105.83 55.0688 106.371 54.2661 107.081 53.5884 cv
+107.791 52.9136 108.67 52.3799 109.718 51.9912 cv
+110.766 51.6025 111.966 51.4072 113.319 51.4072 cv
+114.569 51.4072 115.627 51.5767 116.489 51.9141 cv
+117.351 52.2539 118.17 52.5586 118.949 52.8281 cv
+118.678 53.3345 118.424 53.9614 118.188 54.7046 cv
+117.951 55.4487 117.799 56.0229 117.731 56.4282 cv
+117.123 56.4282 li
+116.852 55.6177 116.328 54.8901 115.55 54.2485 cv
+114.772 53.6069 113.809 53.2837 112.66 53.2837 cv
+112.152 53.2837 111.646 53.3687 111.138 53.5366 cv
+110.631 53.7065 110.174 53.9614 109.769 54.2993 cv
+109.363 54.6372 109.025 55.0767 108.755 55.6177 cv
+108.483 56.1587 108.349 56.8003 108.349 57.5454 cv
+108.349 58.6265 108.644 59.4644 109.236 60.0552 cv
+109.828 60.647 110.563 61.1128 111.442 61.4507 cv
+112.321 61.7896 113.286 62.0845 114.333 62.3374 cv
+115.381 62.5903 116.345 62.9458 117.224 63.4028 cv
+118.103 63.8589 118.838 64.4927 119.431 65.3042 cv
+120.021 66.1157 120.318 67.2319 120.318 68.6519 cv
+120.318 69.6333 120.106 70.5962 119.684 71.5435 cv
+119.261 72.4897 118.652 73.3442 117.858 74.104 cv
+117.063 74.8647 116.108 75.4575 114.993 75.8784 cv
+113.876 76.3022 112.609 76.5142 111.189 76.5142 cv
+109.633 76.5142 108.332 76.3608 107.283 76.0571 cv
+106.235 75.7524 105.356 75.3979 104.646 74.9917 cv
+104.849 74.5522 105.06 73.9517 105.28 73.1919 cv
+105.5 72.4312 105.61 71.7964 105.61 71.2896 cv
+106.218 71.2896 li
+106.387 71.6274 106.649 71.9995 107.004 72.4048 cv
+cp
+f
+128.561 45.1177 mo
+128.459 46.4038 128.383 47.6626 128.333 48.8965 cv
+128.282 50.1313 128.222 51.3745 128.155 52.625 cv
+128.527 52.625 129.22 52.6162 130.234 52.5996 cv
+131.249 52.582 132.347 52.542 133.531 52.4727 cv
+133.498 52.5742 133.48 52.7607 133.48 53.0308 cv
+133.48 53.5366 li
+133.48 54.0942 li
+133.48 54.3325 133.498 54.5015 133.531 54.603 cv
+133.091 54.5688 132.635 54.5454 132.162 54.5269 cv
+131.688 54.5112 131.181 54.5015 130.64 54.5015 cv
+128.155 54.5015 li
+128.121 54.6372 128.079 55.1782 128.028 56.1245 cv
+127.978 57.0718 127.935 58.1958 127.901 59.4985 cv
+127.868 60.7993 127.842 62.1597 127.825 63.5796 cv
+127.808 64.9995 127.8 66.2681 127.8 67.3843 cv
+127.8 68.3315 127.825 69.2603 127.876 70.1733 cv
+127.926 71.0864 128.087 71.9067 128.357 72.6333 cv
+128.628 73.3608 129.033 73.9438 129.575 74.3823 cv
+130.116 74.8237 130.894 75.0425 131.908 75.0425 cv
+132.178 75.0425 132.542 75.0093 132.999 74.9409 cv
+133.455 74.8735 133.852 74.7886 134.191 74.688 cv
+134.191 75.9038 li
+133.615 76.0063 132.981 76.1333 132.289 76.2847 cv
+131.595 76.438 130.927 76.5142 130.285 76.5142 cv
+128.155 76.5142 126.583 75.9888 125.568 74.9409 cv
+124.554 73.8931 124.046 72.354 124.046 70.3247 cv
+124.046 69.4116 124.063 68.4243 124.098 67.3589 cv
+124.131 66.2935 124.174 65.1274 124.224 63.8589 cv
+124.275 62.5903 124.317 61.189 124.351 59.6499 cv
+124.384 58.1128 124.401 56.396 124.401 54.5015 cv
+122.778 54.5015 li
+122.508 54.5015 122.221 54.5112 121.917 54.5269 cv
+121.612 54.5454 121.291 54.5688 120.953 54.603 cv
+120.986 54.3999 121.012 54.2056 121.029 54.019 cv
+121.046 53.8335 121.054 53.6382 121.054 53.436 cv
+121.054 53.2681 121.046 53.0981 121.029 52.9282 cv
+121.012 52.7607 120.986 52.5928 120.953 52.4219 cv
+122.475 52.5244 123.59 52.5742 124.3 52.5742 cv
+124.267 51.8984 124.241 51.0522 124.224 50.0376 cv
+124.207 49.0229 124.165 47.9756 124.098 46.8936 cv
+128.307 45.1177 li
+128.561 45.1177 li
+cp
+f
+147.354 55.5161 mo
+146.864 55.3472 146.365 55.2632 145.858 55.2632 cv
+145.046 55.2632 144.319 55.4487 143.677 55.8208 cv
+143.035 56.1919 142.493 56.6909 142.054 57.3169 cv
+141.615 57.9429 141.276 58.686 141.04 59.5483 cv
+140.803 60.4106 140.685 61.3325 140.685 62.313 cv
+140.685 67.8901 li
+140.685 70.1567 140.692 71.8901 140.71 73.0894 cv
+140.727 74.2905 140.786 75.2622 140.888 76.0063 cv
+140.211 75.938 139.535 75.9038 138.859 75.9038 cv
+138.115 75.9038 137.405 75.938 136.729 76.0063 cv
+136.83 74.8569 136.889 73.2925 136.906 71.314 cv
+136.923 69.3364 136.932 66.9106 136.932 64.0366 cv
+136.932 62.4136 li
+136.932 61.0952 136.923 59.5737 136.906 57.8491 cv
+136.889 56.1245 136.83 54.145 136.729 51.9141 cv
+137.1 51.9824 137.456 52.041 137.793 52.0928 cv
+138.132 52.1426 138.487 52.168 138.859 52.168 cv
+139.163 52.168 139.484 52.1426 139.823 52.0928 cv
+140.16 52.041 140.515 51.9824 140.888 51.9141 cv
+140.752 53.1323 140.676 54.0942 140.66 54.8062 cv
+140.642 55.5161 140.635 56.1919 140.635 56.8345 cv
+140.736 56.8862 li
+142.73 53.2339 144.962 51.4072 147.43 51.4072 cv
+147.734 51.4072 147.996 51.4243 148.216 51.458 cv
+148.436 51.4922 148.715 51.5767 149.053 51.7114 cv
+148.884 52.1172 148.782 52.7354 148.749 53.563 cv
+148.715 54.3921 148.698 55.144 148.698 55.8208 cv
+148.344 56.0737 li
+148.173 55.8716 147.844 55.686 147.354 55.5161 cv
+cp
+f
+152.247 68.145 mo
+152.501 69.4624 152.932 70.6382 153.54 71.6704 cv
+154.148 72.7017 154.959 73.521 155.974 74.1294 cv
+156.988 74.7378 158.238 75.0425 159.727 75.0425 cv
+161.213 75.0425 162.465 74.7378 163.48 74.1294 cv
+164.494 73.521 165.305 72.7017 165.915 71.6704 cv
+166.523 70.6382 166.954 69.4624 167.208 68.145 cv
+167.46 66.8257 167.587 65.4556 167.587 64.0366 cv
+167.587 62.6167 167.46 61.2466 167.208 59.9292 cv
+166.954 58.6099 166.523 57.436 165.915 56.4038 cv
+165.305 55.3726 164.494 54.5522 163.48 53.9429 cv
+162.465 53.3345 161.213 53.0308 159.727 53.0308 cv
+158.238 53.0308 156.988 53.3345 155.974 53.9429 cv
+154.959 54.5522 154.148 55.3726 153.54 56.4038 cv
+152.932 57.436 152.501 58.6099 152.247 59.9292 cv
+151.993 61.2466 151.868 62.6167 151.868 64.0366 cv
+151.868 65.4556 151.993 66.8257 152.247 68.145 cv
+cp
+148.494 58.1782 mo
+149.22 56.5728 150.175 55.271 151.359 54.2729 cv
+152.543 53.2759 153.87 52.5488 155.338 52.0928 cv
+156.81 51.6357 158.272 51.4072 159.727 51.4072 cv
+161.213 51.4072 162.684 51.6357 164.138 52.0928 cv
+165.592 52.5488 166.912 53.2759 168.094 54.2729 cv
+169.278 55.271 170.232 56.5728 170.961 58.1782 cv
+171.687 59.7856 172.049 61.7378 172.049 64.0366 cv
+172.049 66.3364 171.687 68.2896 170.961 69.894 cv
+170.232 71.5015 169.278 72.8022 168.094 73.7993 cv
+166.912 74.7974 165.592 75.4995 164.138 75.9038 cv
+162.684 76.3101 161.213 76.5142 159.727 76.5142 cv
+158.272 76.5142 156.81 76.3101 155.338 75.9038 cv
+153.87 75.4995 152.543 74.7974 151.359 73.7993 cv
+150.175 72.8022 149.22 71.5015 148.494 69.894 cv
+147.766 68.2896 147.403 66.3364 147.403 64.0366 cv
+147.403 61.7378 147.766 59.7856 148.494 58.1782 cv
+cp
+f
+192.543 58.812 mo
+192.12 57.4946 191.581 56.438 190.92 55.6421 cv
+190.26 54.8491 189.507 54.2993 188.664 53.9927 cv
+187.818 53.689 186.988 53.5366 186.176 53.5366 cv
+184.825 53.5366 183.667 53.8247 182.704 54.3999 cv
+181.741 54.9761 180.954 55.7446 180.344 56.7075 cv
+179.737 57.6714 179.295 58.8052 179.027 60.106 cv
+178.755 61.4087 178.62 62.7856 178.62 64.2397 cv
+178.62 71.272 181.088 74.7886 186.025 74.7886 cv
+187.244 74.7886 188.298 74.5093 189.196 73.9517 cv
+190.09 73.394 190.834 72.6157 191.426 71.6187 cv
+192.018 70.6226 192.458 69.4556 192.745 68.1196 cv
+193.032 66.7837 193.176 65.354 193.176 63.8335 cv
+193.176 61.8052 192.966 60.1313 192.543 58.812 cv
+cp
+174.842 62.9204 mo
+174.826 61.5688 174.799 60.2251 174.766 58.8882 cv
+174.732 57.5532 174.69 56.2759 174.64 55.0601 cv
+174.588 53.8423 174.53 52.7949 174.462 51.9141 cv
+175.409 52.084 176.169 52.168 176.744 52.168 cv
+177.319 52.168 178.08 52.084 179.027 51.9141 cv
+178.891 52.7949 178.79 53.6382 178.721 54.4517 cv
+178.654 55.2632 178.62 56.0737 178.62 56.8862 cv
+178.721 56.8862 li
+178.958 56.3462 179.295 55.7612 179.737 55.1353 cv
+180.176 54.5112 180.742 53.9175 181.435 53.3608 cv
+182.127 52.8027 182.964 52.3369 183.946 51.9658 cv
+184.926 51.5938 186.043 51.4072 187.293 51.4072 cv
+188.579 51.4072 189.845 51.6528 191.098 52.1426 cv
+192.348 52.6348 193.455 53.3853 194.419 54.3999 cv
+195.382 55.4146 196.161 56.7075 196.752 58.2798 cv
+197.342 59.853 197.64 61.7212 197.64 63.8853 cv
+197.64 66.0483 197.319 67.9243 196.676 69.5142 cv
+196.034 71.104 195.197 72.4224 194.167 73.4692 cv
+193.133 74.5181 191.959 75.2876 190.641 75.7788 cv
+189.322 76.2671 188.003 76.5142 186.685 76.5142 cv
+182.964 76.5142 180.311 74.9067 178.721 71.6948 cv
+178.62 71.6948 li
+178.62 74.8901 li
+178.62 75.9722 178.628 77.1802 178.646 78.5161 cv
+178.663 79.8521 178.688 81.1802 178.721 82.4985 cv
+178.755 83.8159 178.798 85.0767 178.849 86.2769 cv
+178.9 87.4761 178.958 88.4995 179.027 89.3442 cv
+178.08 89.1753 177.319 89.0913 176.744 89.0913 cv
+176.169 89.0913 175.409 89.1753 174.462 89.3442 cv
+174.53 88.4995 174.588 87.4761 174.64 86.2769 cv
+174.69 85.0767 174.732 83.8159 174.766 82.4985 cv
+174.799 81.1802 174.826 79.8521 174.842 78.5161 cv
+174.859 77.1802 174.868 75.9722 174.868 74.8901 cv
+174.868 66.6743 li
+174.868 65.5249 174.859 64.2739 174.842 62.9204 cv
+cp
+f
+200.81 52.6201 mo
+200.792 51.2681 200.767 49.9316 200.735 48.6118 cv
+200.7 47.2939 200.659 46.0347 200.607 44.834 cv
+200.557 43.6343 200.498 42.6108 200.429 41.7646 cv
+201.375 41.9351 202.136 42.019 202.712 42.019 cv
+203.287 42.019 204.047 41.9351 204.994 41.7646 cv
+204.925 42.6108 204.868 43.625 204.816 44.8086 cv
+204.766 45.9927 204.723 47.2354 204.69 48.5356 cv
+204.656 49.8389 204.63 51.1489 204.615 52.4678 cv
+204.596 53.7866 204.588 51.0015 204.588 52.1172 cv
+204.588 55.9731 li
+204.69 55.9731 li
+205.639 54.519 206.776 53.394 208.098 52.5996 cv
+209.42 51.8052 210.998 51.4072 212.831 51.4072 cv
+213.78 51.4072 214.738 51.543 215.704 51.813 cv
+216.67 52.084 217.545 52.5488 218.325 53.2075 cv
+219.104 53.8677 219.741 54.7642 220.232 55.897 cv
+220.723 57.0298 220.971 58.4751 220.971 60.2339 cv
+220.971 61.688 220.936 63.1831 220.869 64.7212 cv
+220.801 66.2593 220.767 67.8901 220.767 69.6157 cv
+220.767 72.9136 li
+220.767 73.4536 220.775 73.9858 220.793 74.5093 cv
+220.809 75.0347 220.835 75.5337 220.869 76.0063 cv
+220.185 75.938 219.466 75.9038 218.713 75.9038 cv
+217.994 75.9038 217.292 75.938 216.608 76.0063 cv
+216.676 74.2485 216.751 72.439 216.837 70.5796 cv
+216.921 68.7202 216.963 66.8101 216.963 64.8481 cv
+216.963 61.7534 li
+216.963 59.2192 216.472 57.3003 215.494 55.9966 cv
+214.511 54.6968 213.16 54.0435 211.436 54.0435 cv
+209.068 54.0435 207.335 54.7729 206.237 56.2261 cv
+205.137 57.6812 204.588 59.7251 204.588 62.3638 cv
+204.588 63.3091 204.596 64.4087 204.615 65.6597 cv
+204.63 66.9106 204.656 68.1694 204.69 69.438 cv
+204.723 70.7056 204.766 71.9321 204.816 73.1147 cv
+204.868 74.2993 204.925 75.2622 204.994 76.0063 cv
+204.215 75.938 203.454 75.9038 202.712 75.9038 cv
+201.967 75.9038 201.207 75.938 200.429 76.0063 cv
+200.498 75.228 200.557 74.2485 200.607 73.064 cv
+200.659 71.8804 200.7 70.6304 200.735 69.312 cv
+200.767 67.9927 200.792 66.6577 200.81 65.3042 cv
+200.826 63.9526 200.835 62.7017 200.835 61.5522 cv
+200.835 52.3711 li
+200.835 51.2217 200.826 53.9731 200.81 52.6201 cv
+cp
+f
+230.552 72.1851 mo
+229.959 70.7319 229.327 69.2017 228.65 67.5952 cv
+227.972 65.9888 227.281 64.3491 226.571 62.6753 cv
+225.861 61.0015 225.192 59.4302 224.567 57.9585 cv
+223.941 56.4878 223.391 55.1948 222.917 54.0786 cv
+222.445 52.9624 222.09 52.1348 221.853 51.5928 cv
+222.292 51.6606 222.699 51.7197 223.07 51.7715 cv
+223.442 51.8213 223.814 51.8467 224.186 51.8467 cv
+224.558 51.8467 224.929 51.8213 225.302 51.7715 cv
+225.674 51.7197 226.081 51.6606 226.519 51.5928 cv
+227.568 54.8403 228.734 58.0522 230.019 61.231 cv
+231.303 64.4087 232.656 67.689 234.077 71.0698 cv
+235.497 68.0933 236.857 64.9165 238.16 61.5347 cv
+239.461 58.1538 240.62 54.8403 241.633 51.5928 cv
+242.31 51.7627 242.867 51.8467 243.308 51.8467 cv
+243.747 51.8467 244.754 51.6426 245.432 51.4727 cv
+245.195 51.9473 244.814 52.751 244.292 53.8823 cv
+243.766 55.0161 243.141 56.3677 242.414 57.9399 cv
+241.687 59.5112 240.892 61.2544 240.03 63.1646 cv
+239.167 65.0747 238.289 67.0366 237.393 69.0474 cv
+236.497 71.0601 235.61 73.0542 234.73 75.0317 cv
+233.851 77.0103 233.04 78.8862 232.295 80.6616 cv
+231.552 82.436 230.901 84.0425 230.343 85.48 cv
+229.786 86.9155 229.371 88.0581 229.101 88.9028 cv
+228.423 88.7339 227.398 88.77 226.925 88.77 cv
+226.451 88.77 225.876 88.854 225.201 89.0229 cv
+227.871 84.5933 229.953 80.2222 231.81 75.7935 cv
+231.439 74.8804 231.143 73.6401 230.552 72.1851 cv
+cp
+f
+247.193 72.4048 mo
+247.547 72.811 247.97 73.1919 248.461 73.5464 cv
+248.952 73.9009 249.509 74.1978 250.135 74.4331 cv
+250.76 74.6714 251.428 74.7886 252.137 74.7886 cv
+252.78 74.7886 253.398 74.688 253.99 74.4849 cv
+254.581 74.2817 255.105 73.9946 255.561 73.6235 cv
+256.019 73.2505 256.38 72.7778 256.652 72.2017 cv
+256.922 71.6274 257.058 70.9683 257.058 70.2241 cv
+257.058 69.1763 256.761 68.3735 256.169 67.8149 cv
+255.579 67.2563 254.843 66.8003 253.964 66.4448 cv
+253.084 66.0903 252.121 65.7788 251.073 65.5083 cv
+250.024 65.2378 249.061 64.8569 248.182 64.3667 cv
+247.302 63.8765 246.568 63.2251 245.976 62.4136 cv
+245.384 61.603 245.088 60.4858 245.088 59.0669 cv
+245.088 57.9507 245.274 56.9282 245.647 55.9966 cv
+246.018 55.0688 246.56 54.2661 247.27 53.5884 cv
+247.979 52.9136 248.858 52.3799 249.907 51.9912 cv
+250.956 51.6025 252.156 51.4072 253.507 51.4072 cv
+254.757 51.4072 255.815 51.5767 256.678 51.9141 cv
+257.54 52.2539 258.359 52.5586 259.137 52.8281 cv
+258.868 53.3345 258.612 53.9614 258.376 54.7046 cv
+258.14 55.4487 257.988 56.0229 257.92 56.4282 cv
+257.312 56.4282 li
+257.041 55.6177 256.516 54.8901 255.739 54.2485 cv
+254.961 53.6069 253.997 53.2837 252.849 53.2837 cv
+252.341 53.2837 251.834 53.3687 251.327 53.5366 cv
+250.82 53.7065 250.363 53.9614 249.958 54.2993 cv
+249.551 54.6372 249.212 55.0767 248.944 55.6177 cv
+248.672 56.1587 248.537 56.8003 248.537 57.5454 cv
+248.537 58.6265 248.833 59.4644 249.425 60.0552 cv
+250.016 60.647 250.751 61.1128 251.631 61.4507 cv
+252.51 61.7896 253.473 62.0845 254.522 62.3374 cv
+255.57 62.5903 256.534 62.9458 257.413 63.4028 cv
+258.291 63.8589 259.027 64.4927 259.619 65.3042 cv
+260.21 66.1157 260.506 67.2319 260.506 68.6519 cv
+260.506 69.6333 260.295 70.5962 259.873 71.5435 cv
+259.45 72.4897 258.841 73.3442 258.046 74.104 cv
+257.252 74.8647 256.297 75.4575 255.181 75.8784 cv
+254.066 76.3022 252.797 76.5142 251.378 76.5142 cv
+249.823 76.5142 248.52 76.3608 247.472 76.0571 cv
+246.423 75.7524 245.545 75.3979 244.836 74.9917 cv
+245.038 74.5522 245.249 73.9517 245.469 73.1919 cv
+245.688 72.4312 245.799 71.7964 245.799 71.2896 cv
+246.407 71.2896 li
+246.577 71.6274 246.837 71.9995 247.193 72.4048 cv
+cp
+f
+263.497 56.6069 mo
+263.446 54.9321 263.335 53.3687 263.168 51.9141 cv
+264.113 52.084 264.875 52.168 265.449 52.168 cv
+266.024 52.168 266.785 52.084 267.731 51.9141 cv
+267.563 53.3687 267.453 54.9321 267.402 56.6069 cv
+267.351 58.2798 267.326 59.8774 267.326 61.3979 cv
+267.326 66.6743 li
+267.326 68.1958 267.351 69.7925 267.402 71.4673 cv
+267.453 73.1401 267.563 74.6538 267.731 76.0063 cv
+266.954 75.938 266.193 75.9038 265.449 75.9038 cv
+264.706 75.9038 263.944 75.938 263.168 76.0063 cv
+263.335 74.6538 263.446 73.1401 263.497 71.4673 cv
+263.548 69.7925 263.573 68.1958 263.573 66.6743 cv
+263.573 61.3979 li
+263.573 59.8774 263.548 58.2798 263.497 56.6069 cv
+cp
+f
+20.1577 79.6313 mo
+17.4487 84.1069 li
+17.5288 64.8237 li
+19.9761 61.9937 li
+20.1577 79.6313 li
+cp
+0 0 0 .65 cmyk
+f
+.7929 lw
+0 lc
+1 lj
+3.86369 ml
+[] 0 dsh
+true sadj
+20.1577 79.6313 mo
+17.4487 84.1069 li
+17.5288 64.8237 li
+19.9761 61.9937 li
+20.1577 79.6313 li
+cp
+@
+55.1387 3.91748 mo
+55.3809 4.58105 55.4814 4.97363 55.5889 5.67139 cv
+55.7031 6.41602 55.7231 6.84912 55.6787 7.60107 cv
+56.6826 7.33545 li
+56.7568 6.62158 56.7515 6.20654 56.6567 5.49463 cv
+56.5649 4.80029 56.4663 4.4082 56.2188 3.75293 cv
+55.1387 3.91748 li
+cp
+ef
+54.4448 .541016 mo
+56.8579 .541016 58.8091 2.45898 58.8091 4.82471 cv
+58.8091 5.89648 58.4404 6.42285 57.8057 6.9541 cv
+57.8057 6.9541 58.1216 4.68408 57.519 3.2583 cv
+56.5396 .942871 54.4448 .541016 54.4448 .541016 cv
+cp
+ef
+0 lj
+58.8799 4.39502 mo
+59.5991 4.87793 60.1196 5.39404 60.1196 6.05713 cv
+60.1196 7.62158 57.6367 8.98291 54.6865 8.98291 cv
+51.7358 8.98291 49.3442 7.71484 49.3442 6.15039 cv
+49.3442 5.6709 49.5532 5.21924 49.9653 4.82373 cv
+@
+56.8359 22.2305 mo
+56.8296 16.5498 li
+57.5088 15.5674 58.2866 14.353 59.2515 12.9521 cv
+58.3975 12.5386 57.5239 12.1396 56.6367 11.7964 cv
+56.6401 8.8208 li
+58.5278 8.50635 59.2974 7.84717 59.9702 6.84863 cv
+59.8496 20.1914 li
+59.8325 21.1313 58.5889 21.9165 56.8359 22.2305 cv
+cp
+f
+56.8359 22.2305 mo
+56.8296 16.5498 li
+57.5088 15.5674 58.2866 14.353 59.2515 12.9521 cv
+58.3975 12.5386 57.5239 12.1396 56.6367 11.7964 cv
+56.6401 8.8208 li
+58.5278 8.50635 59.2974 7.84717 59.9702 6.84863 cv
+59.8496 20.1914 li
+59.8325 21.1313 58.5889 21.9165 56.8359 22.2305 cv
+cp
+@
+20.5801 55.813 mo
+34.6724 37.2148 li
+41.5444 40.479 li
+28.5801 59.6157 li
+20.5801 55.813 li
+cp
+ef
+1 lj
+20.5801 55.813 mo
+34.6724 37.2148 li
+41.5444 40.479 li
+28.5801 59.6157 li
+20.5801 55.813 li
+cp
+@
+0 lj
+20.4688 79.7554 mo
+34.5664 83.4624 li
+@
+44.0337 16.0063 mo
+44.4668 17.1919 44.647 17.894 44.8384 19.1416 cv
+45.043 20.4736 45.0791 21.248 44.9995 22.5933 cv
+46.7944 22.1177 li
+46.9272 20.8403 46.917 20.0986 46.7485 18.8262 cv
+46.5845 17.5845 46.4082 16.8833 45.9653 15.7114 cv
+44.0337 16.0063 li
+cp
+ef
+42.4033 9.60742 mo
+46.7183 9.60742 50.2075 13.0371 50.2075 17.2681 cv
+50.2075 19.1836 49.4009 20.2485 48.2656 21.1987 cv
+48.2656 21.1987 48.9785 17.0161 47.9004 14.4673 cv
+46.1494 10.3257 42.4033 9.60742 42.4033 9.60742 cv
+cp
+ef
+11.3457 82.4976 mo
+15.5054 83.5503 li
+15.5054 78.0327 li
+15.3906 76.9263 14.6699 76.1401 13.5781 75.9312 cv
+12.6753 75.7583 11.6826 75.7847 11.3457 76.6851 cv
+11.3457 82.4976 li
+cp
+ef
+11.3457 82.4976 mo
+15.5054 83.5503 li
+15.5054 78.0327 li
+15.3906 76.9263 14.6699 76.1401 13.5781 75.9312 cv
+12.6753 75.7583 11.6826 75.7847 11.3457 76.6851 cv
+11.3457 82.4976 li
+cp
+@
+11.4507 72.9097 mo
+15.6104 73.9624 li
+15.6104 68.4448 li
+15.5327 67.3354 14.7813 66.5171 13.6831 66.3433 cv
+12.7544 66.1968 11.8726 66.2651 11.4614 67.2778 cv
+11.4507 72.9097 li
+cp
+ef
+11.4507 72.9097 mo
+15.6104 73.9624 li
+15.6104 68.4448 li
+15.5327 67.3354 14.7813 66.5171 13.6831 66.3433 cv
+12.7544 66.1968 11.8726 66.2651 11.4614 67.2778 cv
+11.4507 72.9097 li
+cp
+@
+34.5664 83.4624 mo
+34.5664 67.147 li
+37.4399 62.4321 li
+37.4067 64.6401 li
+49.7397 43.4272 li
+49.3438 54.5327 li
+37.373 78.3784 li
+34.5664 83.4624 li
+cp
+f
+1 lj
+34.5664 83.4624 mo
+34.5664 67.147 li
+37.4399 62.4321 li
+37.4067 64.6401 li
+49.7397 43.4272 li
+49.3438 54.5327 li
+37.373 78.3784 li
+34.5664 83.4624 li
+cp
+@
+17.4033 65.2524 mo
+9.44482 63.2192 li
+9.47266 81.9419 li
+17.4312 84.0991 li
+17.4033 65.2524 li
+cp
+@
+10.124 47.0195 mo
+10.1118 49.4321 li
+19.1953 48.2681 li
+10.124 47.0195 li
+cp
+ef
+10.124 47.0195 mo
+10.1118 49.4321 li
+19.1953 48.2681 li
+10.124 47.0195 li
+cp
+@
+0 lj
+12.0928 25.4766 mo
+12.0928 30.8628 li
+20.606 32.7461 li
+@
+1 lj
+24.7813 28.0142 mo
+12.0898 25.5049 li
+12.9961 22.2236 14.0371 20.646 16.7573 19.353 cv
+17.5635 18.9692 17.8481 18.77 18.9399 18.6611 cv
+31.4009 20.8696 li
+@
+66.9019 48.3276 mo
+68.8491 42.8408 li
+69.2212 37.3511 li
+71.4575 33.5674 li
+71.4526 45.9087 li
+66.9321 58.7212 li
+66.9019 48.3276 li
+cp
+ef
+66.9019 48.3276 mo
+68.8491 42.8408 li
+69.2212 37.3511 li
+71.4575 33.5674 li
+71.4526 45.9087 li
+66.9321 58.7212 li
+66.9019 48.3276 li
+cp
+@
+0 lj
+11.6821 44.9946 mo
+7.27881 43.7349 li
+7.38721 35.3628 li
+@
+67.0254 58.7212 mo
+49.3125 54.5737 li
+@
+20.4951 37.8135 mo
+20.4976 32.7266 li
+49.6553 38.9331 li
+@
+32.6992 19.5693 mo
+20.4951 32.8203 li
+@
+50.2402 16.7466 mo
+51.1475 17.4912 51.856 18.5488 51.856 19.4902 cv
+51.856 22.1777 47.5815 24.3569 42.3086 24.3569 cv
+37.0352 24.3569 32.7607 22.1777 32.7607 19.4902 cv
+32.7607 18.4277 33.4111 17.4448 34.562 16.6445 cv
+@
+71.2666 32.9814 mo
+69.5933 36.8862 li
+52.5488 33.6147 li
+52.5488 33.6147 52.9946 30.4644 54.064 28.687 cv
+54.9805 27.1646 57.1689 25.3286 57.1689 25.3286 cv
+@
+75.6421 28.2134 mo
+75.915 28.9609 76.0288 29.4033 76.1494 30.1899 cv
+76.2783 31.0298 76.3008 31.5176 76.251 32.3657 cv
+77.3823 32.0659 li
+77.4663 31.2607 77.46 30.7935 77.3535 29.9907 cv
+77.25 29.2085 77.1387 28.7661 76.8599 28.0278 cv
+75.6421 28.2134 li
+cp
+ef
+74.5884 24.3677 mo
+77.3086 24.3677 79.5078 26.5293 79.5078 29.1963 cv
+79.5078 30.4038 79.0391 31.0122 78.3232 31.6108 cv
+78.3232 31.6108 78.7334 29.0376 78.0537 27.4307 cv
+76.9502 24.8198 74.5884 24.3677 74.5884 24.3677 cv
+cp
+ef
+79.5127 28.624 mo
+80.3105 29.1655 80.7861 29.8477 80.7861 30.5884 cv
+80.7861 32.3516 78.0903 33.7813 74.7646 33.7813 cv
+71.439 33.7813 68.7427 32.3516 68.7427 30.5884 cv
+68.7427 30.0479 69.1338 29.2261 69.5977 28.7798 cv
+@
+11.5034 15.4673 mo
+11.7563 16.1597 11.8618 16.5693 11.9731 17.2974 cv
+12.0928 18.0752 12.1138 18.5273 12.0674 19.312 cv
+13.1152 19.0347 li
+13.1929 18.2896 13.187 17.8564 13.0884 17.1133 cv
+12.9927 16.3882 12.8896 15.979 12.6313 15.2954 cv
+11.5034 15.4673 li
+cp
+ef
+10.7974 11.8696 mo
+13.3164 11.8696 15.353 13.8716 15.353 16.3413 cv
+15.353 17.4595 14.875 18.0313 14.2124 18.5854 cv
+14.2124 18.5854 14.6357 16.1948 14.0063 14.7065 cv
+12.9844 12.2891 10.7974 11.8696 10.7974 11.8696 cv
+cp
+ef
+15.3862 15.917 mo
+16.1157 16.4165 16.5498 17.0439 16.5498 17.7246 cv
+16.5498 19.3579 14.0532 20.6816 10.9731 20.6816 cv
+7.89355 20.6816 5.39697 19.3579 5.39697 17.7246 cv
+5.39697 17.2241 5.81104 16.5737 6.24121 16.1602 cv
+@
+49.5513 6.99365 mo
+49.5513 10.0747 li
+@
+76.7607 46.1313 mo
+76.1909 46.2266 75.4248 46.3232 74.7959 46.3232 cv
+73.4243 46.3232 72.1602 46.0806 71.1475 45.6709 cv
+@
+76.5439 33.811 mo
+78.2886 33.5376 79.6392 32.5933 80.3306 31.7124 cv
+80.3262 44.2959 li
+79.647 45.1611 78.271 45.834 76.5693 46.1172 cv
+76.5439 33.811 li
+cp
+ef
+76.5439 33.811 mo
+78.2886 33.5376 79.6392 32.5933 80.3306 31.7124 cv
+80.3262 44.2959 li
+79.647 45.1611 78.271 45.834 76.5693 46.1172 cv
+76.5439 33.811 li
+cp
+@
+1 lj
+12.1084 60.0269 mo
+9.44775 63.1548 li
+17.2803 65.103 li
+19.9585 61.9097 li
+12.1084 60.0269 li
+cp
+@
+0 lj
+6.23145 16.3413 mo
+6.23145 13.8716 8.27344 11.8696 10.7925 11.8696 cv
+13.3115 11.8696 15.353 13.8716 15.353 16.3413 cv
+15.353 18.811 13.3867 19.5591 10.8682 19.5591 cv
+8.34912 19.5591 6.23145 18.811 6.23145 16.3413 cv
+cp
+@
+69.6582 29.1963 mo
+69.6582 26.5293 71.8628 24.3677 74.583 24.3677 cv
+77.3032 24.3677 79.5078 26.5293 79.5078 29.1963 cv
+79.5078 31.8628 77.3774 32.6548 74.6577 32.6548 cv
+71.9375 32.6548 69.6582 31.8628 69.6582 29.1963 cv
+cp
+@
+1 lj
+10.1392 46.9868 mo
+19.2993 48.2334 li
+25.1064 41.1377 li
+16.4009 39.8755 li
+10.1392 46.9868 li
+cp
+@
+34.5928 37.2153 mo
+28.4355 37.1929 li
+12.98 55.8608 li
+20.4976 55.813 li
+34.5928 37.2153 li
+cp
+@
+0 lj
+34.5815 17.2681 mo
+34.5815 13.0371 38.0796 9.60742 42.3945 9.60742 cv
+46.71 9.60742 50.2075 13.0371 50.2075 17.2681 cv
+50.2075 21.4985 46.9131 23.0483 42.5981 23.0483 cv
+38.2832 23.0483 34.5815 21.4985 34.5815 17.2681 cv
+cp
+@
+50.0703 4.82471 mo
+50.0703 2.45898 52.0264 .541016 54.4395 .541016 cv
+56.853 .541016 58.8091 2.45898 58.8091 4.82471 cv
+58.8091 7.19092 56.9819 7.92773 54.5688 7.92773 cv
+52.1558 7.92773 50.0703 7.19092 50.0703 4.82471 cv
+cp
+@
+58.3354 23.5361 mo
+57.2495 25.4185 li
+59.3296 25.7329 li
+59.3296 13.0884 li
+52.6353 22.4546 li
+58.3354 23.5361 li
+cp
+ef
+58.3354 23.5361 mo
+57.2495 25.4185 li
+59.3296 25.7329 li
+59.3296 13.0884 li
+52.6353 22.4546 li
+58.3354 23.5361 li
+cp
+@
+32.9648 24.6113 mo
+20.4951 32.6997 li
+@
+5.69727 18.6333 mo
+5.69727 30.1709 li
+5.76807 31.5161 7.86865 32.5288 10.2368 32.8462 cv
+@
+16.5493 17.6948 mo
+16.5498 19.207 14.7217 20.396 12.0396 20.6104 cv
+12.0986 25.0864 li
+13.2764 22.0244 13.9844 20.7012 16.5723 19.4404 cv
+16.5493 17.6948 li
+cp
+ef
+.269 lw
+3.86371 ml
+16.5493 17.6948 mo
+16.5498 19.207 14.7217 20.396 12.0396 20.6104 cv
+12.0986 25.0864 li
+13.2764 22.0244 13.9844 20.7012 16.5723 19.4404 cv
+16.5493 17.6948 li
+cp
+@
+.7929 lw
+3.86369 ml
+45.3882 10.2515 mo
+48.1533 10.0786 49.8613 10.1177 52.6353 10.6851 cv
+55.3442 11.2393 56.8652 11.79 59.3184 13.0537 cv
+@
+44.5605 27.7783 mo
+43.9355 27.8442 42.9712 27.9204 42.3086 27.9204 cv
+37.5688 27.9204 33.6221 26.7124 32.8745 24.4048 cv
+32.9048 20.3105 li
+@
+69.4961 42.6304 mo
+52.5977 39.2607 li
+@
+49.5884 44.708 mo
+66.9019 48.4302 li
+@
+1 lj
+12.0942 30.8452 mo
+7.38184 35.4355 li
+20.0044 38.3481 li
+@
+0 lj
+10.2974 49.3306 mo
+5.771 54.4106 li
+@
+57.646 25.4663 mo
+69.9614 27.5391 li
+@
+52.5815 33.6646 mo
+52.5815 39.708 li
+49.6055 44.4146 li
+49.6055 39.0322 li
+44.2476 27.832 li
+44.2432 24.2568 li
+48.2031 23.8413 51.2681 22.1763 51.7803 20.1055 cv
+51.7446 24.4663 li
+58.3691 23.5015 li
+57.3647 25.3198 li
+57.3647 25.3198 54.9805 27.1646 54.064 28.687 cv
+52.9946 30.4644 52.4995 33.7505 52.4995 33.7505 cv
+52.5815 33.6646 li
+cp
+f
+52.5815 33.6646 mo
+52.5815 39.708 li
+49.6055 44.4146 li
+49.6055 39.0322 li
+44.2476 27.832 li
+44.2432 24.2568 li
+48.2031 23.8413 51.2681 22.1763 51.7803 20.1055 cv
+51.7446 24.4663 li
+58.3691 23.5015 li
+57.3647 25.3198 li
+57.3647 25.3198 54.9805 27.1646 54.064 28.687 cv
+52.9946 30.4644 52.4995 33.7505 52.4995 33.7505 cv
+52.5815 33.6646 li
+cp
+@
+27.2905 38.3916 mo
+20.6743 37.7275 li
+18.3037 40.1958 li
+@
+49.583 44.1479 mo
+41.0215 41.2271 li
+@
+18.8667 63.2593 mo
+34.2651 67.2847 li
+@
+.422363 58.437 mo
+11.02 61.2085 li
+@
+1 lj
+34.5132 67.0366 mo
+37.3696 62.3071 li
+4.28418 53.9995 li
+.400879 58.3569 li
+.396484 73.7437 li
+9.2959 76.3433 li
+@
+10.2666 97.4194 mo
+10.2666 97.8071 10.2607 98.2319 10.2485 98.6919 cv
+10.2358 99.1558 10.1919 99.6157 10.1172 100.078 cv
+10.043 100.541 9.91797 100.982 9.74268 101.407 cv
+9.58057 101.833 9.3501 102.206 9.05029 102.531 cv
+8.75049 102.855 8.36377 103.118 7.88916 103.315 cv
+7.42773 103.517 6.85352 103.617 6.1665 103.617 cv
+5.46826 103.617 4.88232 103.536 4.40723 103.373 cv
+3.93262 103.199 3.53955 102.967 3.22852 102.68 cv
+2.91602 102.38 2.67236 102.039 2.49756 101.651 cv
+2.33594 101.25 2.21729 100.839 2.14258 100.414 cv
+2.06787 99.979 2.02393 99.5337 2.01074 99.0864 cv
+1.99805 98.6245 1.9917 98.1821 1.9917 97.7573 cv
+1.9917 97.0581 1.99805 96.3843 2.01074 95.7339 cv
+2.02393 95.0854 2.04248 94.481 2.06787 93.9185 cv
+2.09229 93.356 2.11719 92.8579 2.14258 92.4224 cv
+2.16748 91.9722 2.19141 91.6099 2.21729 91.3345 cv
+1.80518 91.4106 li
+1.68066 91.4224 1.5498 91.4282 1.41211 91.4282 cv
+1.26221 91.4282 1.1001 91.4224 .925293 91.4106 cv
+.438477 91.3345 li
+.462891 91.897 .48877 92.5825 .513184 93.395 cv
+.538086 94.2056 .550293 95.1353 .550293 96.1841 cv
+.550293 96.6587 .531738 97.1265 .494629 97.5874 cv
+.469238 98.0366 .45752 98.5552 .45752 99.1421 cv
+.45752 100.976 .881836 102.318 1.73047 103.167 cv
+2.5791 104.017 3.93896 104.441 5.81152 104.441 cv
+6.66016 104.441 7.40869 104.321 8.05762 104.083 cv
+8.71924 103.847 9.2749 103.498 9.72461 103.038 cv
+10.1733 102.574 10.5166 102.013 10.7539 101.35 cv
+11.0039 100.69 11.1343 99.9399 11.1465 99.104 cv
+11.1592 98.4185 11.1777 97.7124 11.2036 96.9888 cv
+11.2783 94.855 li
+11.3027 94.1567 11.3345 93.5073 11.3716 92.9087 cv
+11.4087 92.2964 11.4463 91.7729 11.4844 91.3345 cv
+11.2715 91.397 11.085 91.4282 10.9214 91.4282 cv
+10.7979 91.4282 10.6729 91.4224 10.5479 91.4106 cv
+10.1543 91.3345 li
+10.2046 91.6968 10.2358 92.3599 10.2485 93.3208 cv
+10.2607 94.2808 10.2666 95.647 10.2666 97.4194 cv
+cp
+25.6177 104.441 mo
+25.8804 104.441 li
+25.8804 103.823 li
+25.8804 103.523 25.874 103.173 25.8613 102.774 cv
+25.8613 102.361 25.8555 101.925 25.8433 101.463 cv
+25.8433 100.988 25.8364 100.521 25.8242 100.06 cv
+25.8242 98.731 li
+25.8242 97.606 li
+25.8242 97.2446 25.8364 96.7642 25.8613 96.1646 cv
+25.9365 94.3315 li
+25.9746 93.7065 26.0049 93.1196 26.0303 92.5708 cv
+26.0679 92.022 26.0986 91.6099 26.1235 91.3345 cv
+25.874 91.397 25.6743 91.4282 25.5249 91.4282 cv
+25.3496 91.4282 25.1372 91.397 24.8882 91.3345 cv
+24.9502 92.4341 24.9883 93.606 25 94.855 cv
+25.0254 96.0903 25.0381 97.3638 25.0381 98.6733 cv
+25.0381 101.22 li
+24.4639 100.647 23.7896 99.9536 23.0156 99.1421 cv
+22.2544 98.3179 21.4434 97.4507 20.582 96.5396 cv
+19.7339 95.6157 18.8726 94.686 17.999 93.7505 cv
+17.1377 92.8013 16.3267 91.9165 15.5649 91.0923 cv
+15.2656 91.0923 li
+15.2905 91.5161 15.3022 92.1597 15.3022 93.022 cv
+15.3149 93.8823 15.3213 94.9116 15.3213 96.1089 cv
+15.3213 96.52 15.3149 96.9888 15.3022 97.5132 cv
+15.2905 98.0366 15.272 98.5737 15.2466 99.1235 cv
+15.2339 99.6733 15.209 100.221 15.1724 100.77 cv
+15.0972 102.305 li
+15.0718 102.768 15.0405 103.167 15.0034 103.503 cv
+14.979 103.84 14.9536 104.072 14.9287 104.197 cv
+15.1411 104.172 15.3721 104.159 15.6216 104.159 cv
+15.8589 104.159 16.0767 104.172 16.2759 104.197 cv
+16.2632 104.097 16.2515 103.909 16.2393 103.634 cv
+16.2012 102.643 li
+16.1641 101.425 li
+16.127 100.135 li
+16.127 99.7104 16.1206 99.3042 16.1079 98.9175 cv
+16.1079 97.9438 li
+16.1079 96.9331 16.1138 96.1333 16.127 95.5464 cv
+16.1392 94.9604 16.1514 94.4946 16.1641 94.1431 cv
+17.7866 95.8657 19.4092 97.6011 21.0313 99.3472 cv
+22.6543 101.083 24.1826 102.78 25.6177 104.441 cv
+cp
+29.6436 96.1841 mo
+29.6436 99.4048 li
+29.6436 100.228 29.6245 101.04 29.5869 101.837 cv
+29.5615 102.636 29.5308 103.423 29.4932 104.197 cv
+29.7803 104.172 30.0859 104.159 30.4106 104.159 cv
+30.7358 104.159 31.04 104.172 31.3276 104.197 cv
+31.2163 101.837 li
+31.1909 101.04 31.1782 100.228 31.1782 99.4048 cv
+31.1782 96.1841 li
+31.1782 95.3599 31.1909 94.5552 31.2163 93.77 cv
+31.3276 91.3345 li
+30.8604 91.4106 li
+30.7104 91.4224 30.5601 91.4282 30.4106 91.4282 cv
+30.2607 91.4282 30.1113 91.4224 29.9619 91.4106 cv
+29.4932 91.3345 li
+29.5308 92.1597 29.5615 92.9712 29.5869 93.77 cv
+29.6245 94.5552 29.6436 95.3599 29.6436 96.1841 cv
+cp
+38.5537 104.197 mo
+38.7163 104.172 38.9219 104.159 39.1724 104.159 cv
+39.3848 104.159 39.5898 104.172 39.79 104.197 cv
+40.6138 102.063 41.4746 99.9272 42.3735 97.7944 cv
+43.272 95.6587 44.208 93.5073 45.1821 91.3345 cv
+44.9072 91.397 44.6758 91.4282 44.4888 91.4282 cv
+44.3018 91.4282 44.0703 91.397 43.7959 91.3345 cv
+43.6597 91.7476 43.4902 92.2329 43.291 92.7954 cv
+43.0913 93.356 42.8662 93.9614 42.6167 94.6108 cv
+41.8677 96.6519 li
+41.606 97.3521 41.3374 98.0435 41.0625 98.731 cv
+40.8008 99.4048 40.5391 100.06 40.2764 100.696 cv
+40.0142 101.32 39.771 101.887 39.5469 102.399 cv
+39.1475 101.451 38.7539 100.496 38.3677 99.5337 cv
+37.2256 96.6909 li
+36.8628 95.7534 36.5137 94.8364 36.1768 93.936 cv
+35.8521 93.0278 35.5527 92.1597 35.2783 91.3345 cv
+34.7729 91.4106 li
+34.6104 91.4224 34.4541 91.4282 34.3052 91.4282 cv
+34.1543 91.4282 33.999 91.4224 33.8364 91.4106 cv
+33.3311 91.3345 li
+33.7803 92.4106 34.2485 93.5454 34.7354 94.7437 cv
+35.2344 95.9399 35.7148 97.1138 36.1768 98.2622 cv
+36.6514 99.4106 37.0938 100.501 37.5059 101.54 cv
+38.5537 104.197 li
+cp
+47.3345 96.1646 mo
+47.3345 99.3862 li
+47.3345 100.209 47.3159 101.021 47.2778 101.819 cv
+47.2529 102.606 47.2222 103.398 47.1846 104.197 cv
+47.7588 104.172 48.3271 104.159 48.8882 104.159 cv
+50.5918 104.159 li
+52.2769 104.159 li
+52.8384 104.159 53.3999 104.172 53.9619 104.197 cv
+53.9243 104.072 53.9053 103.909 53.9053 103.71 cv
+53.9053 103.429 li
+53.918 103.315 53.9365 103.217 53.9619 103.128 cv
+53.6621 103.193 53.3062 103.243 52.894 103.28 cv
+51.6025 103.354 li
+51.1533 103.366 50.6919 103.373 50.2178 103.373 cv
+48.9067 103.373 li
+48.8945 103.134 48.8823 102.788 48.8696 102.324 cv
+48.8696 100.566 li
+48.8696 99.4409 li
+48.8696 98.7114 li
+48.8696 98.2251 li
+48.8823 98.0874 48.8882 97.9624 48.8882 97.8511 cv
+49.1128 97.8511 49.4126 97.856 49.7861 97.8687 cv
+50.1733 97.8687 50.5791 97.8745 51.0039 97.8872 cv
+51.4399 97.8872 51.8711 97.8989 52.2949 97.9243 cv
+52.7324 97.9497 53.1128 97.9819 53.4375 98.019 cv
+53.3999 97.8325 53.3809 97.646 53.3809 97.4585 cv
+53.3809 97.2583 53.3999 97.064 53.4375 96.8784 cv
+52.5576 96.9507 li
+52.2578 96.9644 51.9268 96.9829 51.5649 97.0083 cv
+50.3672 97.0454 li
+49.9302 97.0581 49.437 97.064 48.8882 97.064 cv
+48.8882 96.8276 48.8823 96.4761 48.8696 96.0151 cv
+48.8696 94.5913 li
+48.8696 94.1313 48.876 93.7183 48.8882 93.356 cv
+48.9126 92.9946 48.9312 92.6157 48.9443 92.2134 cv
+49.5562 92.2134 50.0796 92.2271 50.5171 92.2524 cv
+50.9531 92.2642 51.3525 92.2837 51.7148 92.3081 cv
+52.7632 92.3833 li
+53.8677 92.4585 li
+53.8311 92.271 53.8115 92.0845 53.8115 91.897 cv
+53.8115 91.7104 53.8311 91.5229 53.8677 91.3345 cv
+52.2021 91.4106 li
+51.6528 91.4224 51.0967 91.4282 50.5356 91.4282 cv
+49.9746 91.4282 49.4126 91.4224 48.8506 91.4106 cv
+47.1846 91.3345 li
+47.2222 92.1333 47.2529 92.9341 47.2778 93.731 cv
+47.3159 94.5298 47.3345 95.3403 47.3345 96.1646 cv
+cp
+56.6948 96.1841 mo
+56.6948 99.4048 li
+56.6948 100.228 56.6763 101.04 56.6382 101.837 cv
+56.6133 102.636 56.583 103.423 56.5454 104.197 cv
+56.8325 104.172 57.1377 104.159 57.4619 104.159 cv
+57.7866 104.159 58.0923 104.172 58.3794 104.197 cv
+58.2671 101.837 li
+58.2422 101.04 58.2305 100.228 58.2305 99.4048 cv
+58.2305 98.0366 li
+58.9409 98.0366 li
+59.3403 98.4487 59.7778 98.9536 60.252 99.5532 cv
+60.7388 100.141 61.2129 100.734 61.6748 101.333 cv
+62.1357 101.931 62.5542 102.494 62.9287 103.018 cv
+63.3159 103.542 63.603 103.935 63.7896 104.197 cv
+63.9648 104.172 64.146 104.159 64.333 104.159 cv
+64.8755 104.159 li
+65.437 104.159 li
+65.625 104.159 65.812 104.172 65.999 104.197 cv
+65.8242 104.023 65.5933 103.766 65.3062 103.429 cv
+65.0195 103.092 64.7139 102.723 64.3892 102.324 cv
+63.3779 101.051 li
+63.0288 100.602 62.6914 100.177 62.3672 99.7788 cv
+61.4873 98.6558 li
+60.8696 97.8687 li
+61.2319 97.8188 61.6313 97.7183 62.0679 97.5688 cv
+62.5166 97.4077 62.9346 97.1899 63.3223 96.9136 cv
+63.7085 96.6274 64.0332 96.272 64.2959 95.8472 cv
+64.5698 95.4097 64.707 94.8921 64.707 94.2944 cv
+64.707 93.731 64.6011 93.2632 64.3892 92.8901 cv
+64.189 92.5142 63.9082 92.2134 63.5464 91.9907 cv
+63.1973 91.7534 62.7856 91.5845 62.311 91.4849 cv
+61.8369 91.3853 61.3379 91.3345 60.8135 91.3345 cv
+60.4521 91.3345 60.0952 91.354 59.7461 91.3911 cv
+59.3975 91.4165 59.041 91.4282 58.6797 91.4282 cv
+58.3174 91.4282 57.9614 91.4224 57.6118 91.4106 cv
+56.5454 91.3345 li
+56.583 92.1597 56.6133 92.9712 56.6382 93.77 cv
+56.6763 94.5552 56.6948 95.3599 56.6948 96.1841 cv
+cp
+58.2305 97.2524 mo
+58.2305 96.1841 li
+58.2305 95.5112 58.2422 94.8364 58.2671 94.1616 cv
+58.3418 92.1216 li
+58.542 92.0972 58.7852 92.0776 59.0723 92.0649 cv
+59.3589 92.0415 59.7212 92.0278 60.1587 92.0278 cv
+60.4824 92.0278 60.8135 92.0649 61.1509 92.1401 cv
+61.4873 92.2036 61.7998 92.3276 62.0864 92.5142 cv
+62.3735 92.7017 62.6045 92.9575 62.7793 93.2817 cv
+62.9663 93.5942 63.0601 93.9927 63.0601 94.481 cv
+63.0601 95.0415 62.9409 95.5112 62.7041 95.8853 cv
+62.4795 96.2466 62.1924 96.5396 61.8428 96.7642 cv
+61.4937 96.9771 61.1074 97.1265 60.6826 97.2144 cv
+60.2705 97.3003 59.8711 97.3442 59.4844 97.3442 cv
+59.2344 97.3442 59.0039 97.3384 58.7915 97.3267 cv
+58.5923 97.313 58.4048 97.2886 58.2305 97.2524 cv
+cp
+67.7212 101.763 mo
+67.4966 101.763 li
+67.4595 102.125 67.416 102.424 67.3652 102.663 cv
+67.3281 102.885 67.2534 103.142 67.1416 103.429 cv
+67.4658 103.692 67.8652 103.928 68.3389 104.14 cv
+68.8262 104.339 69.4561 104.441 70.2295 104.441 cv
+70.9541 104.441 71.5967 104.339 72.1577 104.14 cv
+72.7319 103.928 73.2129 103.634 73.5996 103.262 cv
+73.999 102.875 74.2983 102.424 74.498 101.912 cv
+74.7104 101.401 74.8164 100.859 74.8164 100.285 cv
+74.8164 99.5981 74.6665 99.0474 74.3672 98.6362 cv
+74.0801 98.2251 73.7178 97.8872 73.2817 97.6265 cv
+72.8447 97.3638 72.3701 97.146 71.8589 96.9692 cv
+71.3594 96.7837 70.8911 96.5757 70.4546 96.353 cv
+70.0171 96.1147 69.6494 95.8286 69.3501 95.4917 cv
+69.063 95.1548 68.9194 94.6919 68.9194 94.106 cv
+68.9194 93.77 68.9756 93.4565 69.0879 93.1685 cv
+69.2129 92.8823 69.3813 92.6392 69.5938 92.4399 cv
+69.8174 92.2271 70.0742 92.0649 70.3608 91.9536 cv
+70.6606 91.8423 70.9849 91.7837 71.335 91.7837 cv
+71.6836 91.7837 71.9839 91.8481 72.2329 91.9722 cv
+72.4824 92.0845 72.6948 92.2271 72.8696 92.4028 cv
+73.0566 92.5767 73.2007 92.772 73.2998 92.9829 cv
+73.4121 93.1821 73.5 93.3696 73.562 93.5454 cv
+73.7866 93.5454 li
+73.8618 93.1821 73.937 92.8823 74.0112 92.645 cv
+74.0859 92.4106 74.1802 92.1841 74.292 91.9722 cv
+73.918 91.6724 73.5122 91.4536 73.0757 91.3159 cv
+72.6387 91.1675 72.1206 91.0923 71.522 91.0923 cv
+70.8979 91.0923 70.3364 91.1792 69.8369 91.354 cv
+69.3379 91.5288 68.9077 91.7729 68.5444 92.0845 cv
+68.1958 92.397 67.9272 92.772 67.7402 93.2075 cv
+67.5522 93.6313 67.4595 94.106 67.4595 94.6304 cv
+67.4595 95.3657 67.6021 95.9526 67.8896 96.3901 cv
+68.1895 96.8276 68.5571 97.1899 68.9941 97.4741 cv
+69.4312 97.7505 69.8989 97.9819 70.3979 98.1694 cv
+70.9102 98.356 71.3843 98.5601 71.8218 98.7866 cv
+72.2583 99.0112 72.6196 99.2915 72.9067 99.6294 cv
+73.2065 99.9653 73.3564 100.419 73.3564 100.995 cv
+73.3564 101.369 73.2939 101.726 73.1689 102.063 cv
+73.0444 102.385 72.8628 102.674 72.626 102.923 cv
+72.4014 103.16 72.1206 103.354 71.7837 103.503 cv
+71.4585 103.642 71.0913 103.71 70.6787 103.71 cv
+70.2803 103.71 69.9175 103.654 69.5938 103.542 cv
+69.269 103.417 68.9819 103.262 68.7324 103.074 cv
+68.4951 102.885 68.2891 102.68 68.1147 102.456 cv
+67.9526 102.218 67.8208 101.988 67.7212 101.763 cv
+cp
+77.4932 96.1841 mo
+77.4932 99.4048 li
+77.4932 100.228 77.4746 101.04 77.4375 101.837 cv
+77.4126 102.636 77.3809 103.423 77.3442 104.197 cv
+77.6309 104.172 77.9365 104.159 78.2612 104.159 cv
+78.5859 104.159 78.8916 104.172 79.1782 104.197 cv
+79.0664 101.837 li
+79.041 101.04 79.0293 100.228 79.0293 99.4048 cv
+79.0293 96.1841 li
+79.0293 95.3599 79.041 94.5552 79.0664 93.77 cv
+79.1782 91.3345 li
+78.7104 91.4106 li
+78.561 91.4224 78.4111 91.4282 78.2612 91.4282 cv
+78.1113 91.4282 77.9614 91.4224 77.812 91.4106 cv
+77.3442 91.3345 li
+77.3809 92.1597 77.4126 92.9712 77.4375 93.77 cv
+77.4746 94.5552 77.4932 95.3599 77.4932 96.1841 cv
+cp
+85.3008 96.1841 mo
+85.3008 99.4048 li
+85.3008 100.228 85.2813 101.04 85.2441 101.837 cv
+85.2188 102.636 85.1875 103.423 85.1509 104.197 cv
+85.438 104.172 85.7427 104.159 86.0679 104.159 cv
+86.3921 104.159 86.6978 104.172 86.9849 104.197 cv
+86.873 101.837 li
+86.8477 101.04 86.835 100.228 86.835 99.4048 cv
+86.835 96.1841 li
+86.835 94.8862 86.854 93.5942 86.8916 92.3081 cv
+87.2153 92.3081 87.5527 92.3159 87.9023 92.3276 cv
+88.2642 92.3276 88.6201 92.3403 88.9702 92.3657 cv
+89.332 92.3774 89.6748 92.397 89.9995 92.4224 cv
+90.3359 92.4478 90.6362 92.4771 90.8979 92.5142 cv
+90.835 92.2886 90.8037 92.0972 90.8037 91.936 cv
+90.8037 91.7837 90.835 91.5845 90.8979 91.3345 cv
+88.4829 91.4106 li
+87.6963 91.4224 86.8916 91.4282 86.0679 91.4282 cv
+85.2441 91.4282 84.4395 91.4224 83.6523 91.4106 cv
+81.2378 91.3345 li
+81.3003 91.5845 81.3315 91.7778 81.3315 91.9165 cv
+81.3315 92.0913 81.3003 92.2886 81.2378 92.5142 cv
+81.5005 92.4771 81.793 92.4478 82.1177 92.4224 cv
+82.4546 92.397 82.7979 92.3774 83.1475 92.3657 cv
+83.5088 92.3403 83.8652 92.3276 84.2144 92.3276 cv
+84.5762 92.3159 84.9194 92.3081 85.2441 92.3081 cv
+85.2813 93.5942 85.3008 94.8862 85.3008 96.1841 cv
+cp
+94.7173 89.0142 mo
+94.7173 89.2759 94.8105 89.5005 94.998 89.688 cv
+95.1846 89.8755 95.4097 89.9692 95.6714 89.9692 cv
+95.9341 89.9692 96.1577 89.8755 96.3452 89.688 cv
+96.5322 89.5005 96.6265 89.2759 96.6265 89.0142 cv
+96.6265 88.7524 96.5322 88.5259 96.3452 88.3403 cv
+96.1577 88.1528 95.9341 88.0601 95.6714 88.0601 cv
+95.4097 88.0601 95.1846 88.1528 94.998 88.3403 cv
+94.8105 88.5259 94.7173 88.7524 94.7173 89.0142 cv
+cp
+98.4053 89.0142 mo
+98.4053 89.2759 98.498 89.5005 98.6855 89.688 cv
+98.8726 89.8755 99.0981 89.9692 99.3594 89.9692 cv
+99.6221 89.9692 99.8467 89.8755 100.033 89.688 cv
+100.22 89.5005 100.314 89.2759 100.314 89.0142 cv
+100.314 88.7524 100.22 88.5259 100.033 88.3403 cv
+99.8467 88.1528 99.6221 88.0601 99.3594 88.0601 cv
+99.0981 88.0601 98.8726 88.1528 98.6855 88.3403 cv
+98.498 88.5259 98.4053 88.7524 98.4053 89.0142 cv
+cp
+97.1885 93.6177 mo
+99.2656 98.3735 li
+98.2173 98.4126 li
+97.1694 98.4126 li
+96.8447 98.4126 96.5083 98.4067 96.1577 98.3931 cv
+95.8091 98.3813 95.4722 98.3735 95.1475 98.3735 cv
+97.1885 93.6177 li
+cp
+97.8057 91.0923 mo
+97.4502 91.0923 li
+96.4771 93.3267 95.5093 95.521 94.5488 97.6821 cv
+93.5874 99.8403 92.6016 102.013 91.5908 104.197 cv
+91.8027 104.172 92.0337 104.159 92.2827 104.159 cv
+92.5332 104.159 92.7637 104.172 92.9756 104.197 cv
+93.1377 103.623 93.3813 102.899 93.7056 102.025 cv
+94.0303 101.14 94.3926 100.209 94.7915 99.2358 cv
+95.1782 99.2222 95.5591 99.2163 95.9341 99.2163 cv
+96.3081 99.2056 96.689 99.1987 97.0757 99.1987 cv
+97.4873 99.1987 97.8994 99.2056 98.311 99.2163 cv
+98.7231 99.2163 99.1289 99.2222 99.5278 99.2358 cv
+100.052 100.547 li
+100.239 100.995 100.421 101.445 100.595 101.894 cv
+100.783 102.331 100.951 102.754 101.101 103.167 cv
+101.25 103.566 101.369 103.909 101.456 104.197 cv
+101.631 104.172 101.793 104.159 101.943 104.159 cv
+102.448 104.159 li
+102.935 104.159 li
+103.097 104.159 103.266 104.172 103.44 104.197 cv
+103.279 103.897 103.066 103.46 102.805 102.885 cv
+102.555 102.312 102.268 101.663 101.943 100.938 cv
+100.932 98.5601 li
+99.8467 95.9956 li
+98.7788 93.4507 li
+97.8057 91.0923 li
+cp
+108.195 96.1841 mo
+108.195 99.4048 li
+108.195 100.228 108.178 101.04 108.139 101.837 cv
+108.115 102.636 108.083 103.423 108.046 104.197 cv
+108.333 104.172 108.639 104.159 108.963 104.159 cv
+109.288 104.159 109.594 104.172 109.881 104.197 cv
+109.769 101.837 li
+109.743 101.04 109.731 100.228 109.731 99.4048 cv
+109.731 96.1841 li
+109.731 94.8862 109.75 93.5942 109.787 92.3081 cv
+110.112 92.3081 110.448 92.3159 110.798 92.3276 cv
+111.16 92.3276 111.515 92.3403 111.865 92.3657 cv
+112.227 92.3774 112.57 92.397 112.895 92.4224 cv
+113.232 92.4478 113.531 92.4771 113.793 92.5142 cv
+113.73 92.2886 113.7 92.0972 113.7 91.936 cv
+113.7 91.7837 113.73 91.5845 113.793 91.3345 cv
+111.379 91.4106 li
+110.592 91.4224 109.787 91.4282 108.963 91.4282 cv
+108.139 91.4282 107.334 91.4224 106.548 91.4106 cv
+104.133 91.3345 li
+104.196 91.5845 104.228 91.7778 104.228 91.9165 cv
+104.228 92.0913 104.196 92.2886 104.133 92.5142 cv
+104.395 92.4771 104.689 92.4478 105.013 92.4224 cv
+105.35 92.397 105.694 92.3774 106.043 92.3657 cv
+106.405 92.3403 106.76 92.3276 107.11 92.3276 cv
+107.472 92.3159 107.815 92.3081 108.139 92.3081 cv
+108.178 93.5942 108.195 94.8862 108.195 96.1841 cv
+cp
+115.591 101.763 mo
+115.366 101.763 li
+115.329 102.125 115.284 102.424 115.235 102.663 cv
+115.197 102.885 115.122 103.142 115.01 103.429 cv
+115.335 103.692 115.734 103.928 116.208 104.14 cv
+116.695 104.339 117.325 104.441 118.099 104.441 cv
+118.823 104.441 119.466 104.339 120.027 104.14 cv
+120.602 103.928 121.082 103.634 121.469 103.262 cv
+121.869 102.875 122.168 102.424 122.368 101.912 cv
+122.58 101.401 122.686 100.859 122.686 100.285 cv
+122.686 99.5981 122.536 99.0474 122.237 98.6362 cv
+121.95 98.2251 121.588 97.8872 121.151 97.6265 cv
+120.714 97.3638 120.24 97.146 119.729 96.9692 cv
+119.229 96.7837 118.761 96.5757 118.323 96.353 cv
+117.887 96.1147 117.519 95.8286 117.219 95.4917 cv
+116.932 95.1548 116.789 94.6919 116.789 94.106 cv
+116.789 93.77 116.844 93.4565 116.957 93.1685 cv
+117.082 92.8823 117.25 92.6392 117.462 92.4399 cv
+117.687 92.2271 117.943 92.0649 118.23 91.9536 cv
+118.53 91.8423 118.854 91.7837 119.204 91.7837 cv
+119.553 91.7837 119.853 91.8481 120.103 91.9722 cv
+120.352 92.0845 120.564 92.2271 120.738 92.4028 cv
+120.926 92.5767 121.069 92.772 121.169 92.9829 cv
+121.282 93.1821 121.37 93.3696 121.432 93.5454 cv
+121.656 93.5454 li
+121.73 93.1821 121.805 92.8823 121.881 92.645 cv
+121.956 92.4106 122.049 92.1841 122.162 91.9722 cv
+121.787 91.6724 121.382 91.4536 120.945 91.3159 cv
+120.508 91.1675 119.99 91.0923 119.391 91.0923 cv
+118.768 91.0923 118.205 91.1792 117.706 91.354 cv
+117.207 91.5288 116.776 91.7729 116.415 92.0845 cv
+116.064 92.397 115.797 92.772 115.609 93.2075 cv
+115.422 93.6313 115.329 94.106 115.329 94.6304 cv
+115.329 95.3657 115.472 95.9526 115.759 96.3901 cv
+116.059 96.8276 116.427 97.1899 116.864 97.4741 cv
+117.301 97.7505 117.769 97.9819 118.268 98.1694 cv
+118.779 98.356 119.254 98.5601 119.69 98.7866 cv
+120.127 99.0112 120.49 99.2915 120.776 99.6294 cv
+121.075 99.9653 121.226 100.419 121.226 100.995 cv
+121.226 101.369 121.163 101.726 121.038 102.063 cv
+120.914 102.385 120.732 102.674 120.496 102.923 cv
+120.271 103.16 119.99 103.354 119.653 103.503 cv
+119.329 103.642 118.961 103.71 118.548 103.71 cv
+118.149 103.71 117.787 103.654 117.462 103.542 cv
+117.138 103.417 116.851 103.262 116.602 103.074 cv
+116.364 102.885 116.158 102.68 115.983 102.456 cv
+115.822 102.218 115.69 101.988 115.591 101.763 cv
+cp
+124.951 101.763 mo
+124.726 101.763 li
+124.689 102.125 124.645 102.424 124.596 102.663 cv
+124.558 102.885 124.483 103.142 124.371 103.429 cv
+124.695 103.692 125.095 103.928 125.569 104.14 cv
+126.056 104.339 126.686 104.441 127.46 104.441 cv
+128.184 104.441 128.826 104.339 129.388 104.14 cv
+129.962 103.928 130.442 103.634 130.83 103.262 cv
+131.229 102.875 131.528 102.424 131.728 101.912 cv
+131.94 101.401 132.046 100.859 132.046 100.285 cv
+132.046 99.5981 131.897 99.0474 131.598 98.6362 cv
+131.31 98.2251 130.948 97.8872 130.511 97.6265 cv
+130.074 97.3638 129.601 97.146 129.089 96.9692 cv
+128.588 96.7837 128.121 96.5757 127.684 96.353 cv
+127.247 96.1147 126.879 95.8286 126.58 95.4917 cv
+126.292 95.1548 126.149 94.6919 126.149 94.106 cv
+126.149 93.77 126.206 93.4565 126.317 93.1685 cv
+126.443 92.8823 126.611 92.6392 126.823 92.4399 cv
+127.048 92.2271 127.304 92.0649 127.59 91.9536 cv
+127.89 91.8423 128.214 91.7837 128.564 91.7837 cv
+128.914 91.7837 129.213 91.8481 129.462 91.9722 cv
+129.712 92.0845 129.925 92.2271 130.099 92.4028 cv
+130.286 92.5767 130.43 92.772 130.53 92.9829 cv
+130.642 93.1821 130.729 93.3696 130.792 93.5454 cv
+131.017 93.5454 li
+131.091 93.1821 131.166 92.8823 131.241 92.645 cv
+131.316 92.4106 131.409 92.1841 131.521 91.9722 cv
+131.147 91.6724 130.742 91.4536 130.306 91.3159 cv
+129.868 91.1675 129.351 91.0923 128.751 91.0923 cv
+128.127 91.0923 127.565 91.1792 127.066 91.354 cv
+126.567 91.5288 126.137 91.7729 125.775 92.0845 cv
+125.425 92.397 125.157 92.772 124.97 93.2075 cv
+124.783 93.6313 124.689 94.106 124.689 94.6304 cv
+124.689 95.3657 124.833 95.9526 125.12 96.3901 cv
+125.419 96.8276 125.787 97.1899 126.225 97.4741 cv
+126.661 97.7505 127.129 97.9819 127.628 98.1694 cv
+128.14 98.356 128.615 98.5601 129.051 98.7866 cv
+129.487 99.0112 129.85 99.2915 130.137 99.6294 cv
+130.436 99.9653 130.586 100.419 130.586 100.995 cv
+130.586 101.369 130.523 101.726 130.399 102.063 cv
+130.274 102.385 130.093 102.674 129.855 102.923 cv
+129.631 103.16 129.351 103.354 129.014 103.503 cv
+128.689 103.642 128.321 103.71 127.909 103.71 cv
+127.51 103.71 127.147 103.654 126.823 103.542 cv
+126.499 103.417 126.212 103.262 125.962 103.074 cv
+125.725 102.885 125.519 102.68 125.344 102.456 cv
+125.182 102.218 125.051 101.988 124.951 101.763 cv
+cp
+137.326 96.1841 mo
+137.326 99.4048 li
+137.326 100.228 137.307 101.04 137.27 101.837 cv
+137.244 102.636 137.213 103.423 137.175 104.197 cv
+137.462 104.172 137.769 104.159 138.094 104.159 cv
+138.417 104.159 138.723 104.172 139.01 104.197 cv
+138.898 101.837 li
+138.874 101.04 138.861 100.228 138.861 99.4048 cv
+138.861 96.1841 li
+138.861 94.8862 138.88 93.5942 138.917 92.3081 cv
+139.241 92.3081 139.578 92.3159 139.928 92.3276 cv
+140.29 92.3276 140.645 92.3403 140.995 92.3657 cv
+141.357 92.3774 141.701 92.397 142.024 92.4224 cv
+142.361 92.4478 142.661 92.4771 142.924 92.5142 cv
+142.86 92.2886 142.83 92.0972 142.83 91.936 cv
+142.83 91.7837 142.86 91.5845 142.924 91.3345 cv
+140.508 91.4106 li
+139.722 91.4224 138.917 91.4282 138.094 91.4282 cv
+137.27 91.4282 136.464 91.4224 135.678 91.4106 cv
+133.263 91.3345 li
+133.326 91.5845 133.356 91.7778 133.356 91.9165 cv
+133.356 92.0913 133.326 92.2886 133.263 92.5142 cv
+133.525 92.4771 133.819 92.4478 134.143 92.4224 cv
+134.48 92.397 134.823 92.3774 135.173 92.3657 cv
+135.535 92.3403 135.891 92.3276 136.24 92.3276 cv
+136.602 92.3159 136.945 92.3081 137.27 92.3081 cv
+137.307 93.5942 137.326 94.8862 137.326 96.1841 cv
+cp
+145.132 96.1646 mo
+145.132 99.3862 li
+145.132 100.209 145.113 101.021 145.076 101.819 cv
+145.051 102.606 145.02 103.398 144.983 104.197 cv
+145.557 104.172 146.125 104.159 146.686 104.159 cv
+148.39 104.159 li
+150.076 104.159 li
+150.636 104.159 151.197 104.172 151.759 104.197 cv
+151.722 104.072 151.703 103.909 151.703 103.71 cv
+151.703 103.429 li
+151.715 103.315 151.734 103.217 151.759 103.128 cv
+151.458 103.193 151.103 103.243 150.691 103.28 cv
+149.401 103.354 li
+148.952 103.366 148.49 103.373 148.015 103.373 cv
+146.705 103.373 li
+146.693 103.134 146.68 102.788 146.669 102.324 cv
+146.669 100.566 li
+146.669 99.4409 li
+146.669 98.7114 li
+146.669 98.2251 li
+146.68 98.0874 146.686 97.9624 146.686 97.8511 cv
+146.912 97.8511 147.21 97.856 147.584 97.8687 cv
+147.971 97.8687 148.378 97.8745 148.801 97.8872 cv
+149.238 97.8872 149.669 97.8989 150.094 97.9243 cv
+150.531 97.9497 150.912 97.9819 151.236 98.019 cv
+151.197 97.8325 151.178 97.646 151.178 97.4585 cv
+151.178 97.2583 151.197 97.064 151.236 96.8784 cv
+150.355 96.9507 li
+150.056 96.9644 149.725 96.9829 149.363 97.0083 cv
+148.165 97.0454 li
+147.728 97.0581 147.236 97.064 146.686 97.064 cv
+146.686 96.8276 146.68 96.4761 146.669 96.0151 cv
+146.669 94.5913 li
+146.669 94.1313 146.674 93.7183 146.686 93.356 cv
+146.711 92.9946 146.73 92.6157 146.742 92.2134 cv
+147.354 92.2134 147.878 92.2271 148.314 92.2524 cv
+148.75 92.2642 149.15 92.2837 149.514 92.3081 cv
+150.561 92.3833 li
+151.664 92.4585 li
+151.626 92.271 151.61 92.0845 151.61 91.897 cv
+151.61 91.7104 151.626 91.5229 151.664 91.3345 cv
+149.999 91.4106 li
+149.45 91.4224 148.896 91.4282 148.333 91.4282 cv
+147.772 91.4282 147.21 91.4224 146.648 91.4106 cv
+144.983 91.3345 li
+145.02 92.1333 145.051 92.9341 145.076 93.731 cv
+145.113 94.5298 145.132 95.3403 145.132 96.1646 cv
+cp
+154.493 96.1841 mo
+154.493 99.4048 li
+154.493 100.228 154.473 101.04 154.435 101.837 cv
+154.412 102.636 154.378 103.423 154.343 104.197 cv
+154.628 104.172 154.937 104.159 155.26 104.159 cv
+155.583 104.159 155.891 104.172 156.177 104.197 cv
+156.064 101.837 li
+156.04 101.04 156.027 100.228 156.027 99.4048 cv
+156.027 98.0366 li
+156.738 98.0366 li
+157.14 98.4487 157.575 98.9536 158.05 99.5532 cv
+158.538 100.141 159.009 100.734 159.472 101.333 cv
+159.933 101.931 160.353 102.494 160.727 103.018 cv
+161.113 103.542 161.402 103.935 161.587 104.197 cv
+161.761 104.172 161.943 104.159 162.13 104.159 cv
+162.673 104.159 li
+163.234 104.159 li
+163.422 104.159 163.609 104.172 163.795 104.197 cv
+163.622 104.023 163.391 103.766 163.105 103.429 cv
+162.817 103.092 162.511 102.723 162.187 102.324 cv
+161.175 101.051 li
+160.826 100.602 160.489 100.177 160.165 99.7788 cv
+159.285 98.6558 li
+158.667 97.8687 li
+159.029 97.8188 159.427 97.7183 159.865 97.5688 cv
+160.314 97.4077 160.733 97.1899 161.121 96.9136 cv
+161.506 96.6274 161.831 96.272 162.092 95.8472 cv
+162.367 95.4097 162.503 94.8921 162.503 94.2944 cv
+162.503 93.731 162.4 93.2632 162.187 92.8901 cv
+161.988 92.5142 161.706 92.2134 161.343 91.9907 cv
+160.996 91.7534 160.583 91.5845 160.109 91.4849 cv
+159.634 91.3853 159.134 91.3345 158.612 91.3345 cv
+158.25 91.3345 157.892 91.354 157.544 91.3911 cv
+157.195 91.4165 156.837 91.4282 156.476 91.4282 cv
+156.115 91.4282 155.759 91.4224 155.409 91.4106 cv
+154.343 91.3345 li
+154.378 92.1597 154.412 92.9712 154.435 93.77 cv
+154.473 94.5552 154.493 95.3599 154.493 96.1841 cv
+cp
+156.027 97.2524 mo
+156.027 96.1841 li
+156.027 95.5112 156.04 94.8364 156.064 94.1616 cv
+156.14 92.1216 li
+156.337 92.0972 156.583 92.0776 156.869 92.0649 cv
+157.157 92.0415 157.519 92.0278 157.956 92.0278 cv
+158.281 92.0278 158.612 92.0649 158.948 92.1401 cv
+159.285 92.2036 159.597 92.3276 159.883 92.5142 cv
+160.169 92.7017 160.402 92.9575 160.578 93.2817 cv
+160.763 93.5942 160.856 93.9927 160.856 94.481 cv
+160.856 95.0415 160.739 95.5112 160.502 95.8853 cv
+160.276 96.2466 159.992 96.5396 159.64 96.7642 cv
+159.291 96.9771 158.904 97.1265 158.478 97.2144 cv
+158.068 97.3003 157.667 97.3442 157.281 97.3442 cv
+157.032 97.3442 156.801 97.3384 156.589 97.3267 cv
+156.389 97.313 156.203 97.2886 156.027 97.2524 cv
+cp
+176.471 104.441 mo
+176.732 104.441 li
+176.732 103.823 li
+176.732 103.523 176.726 103.173 176.714 102.774 cv
+176.714 102.361 176.708 101.925 176.695 101.463 cv
+176.695 100.988 176.689 100.521 176.676 100.06 cv
+176.676 98.731 li
+176.676 97.606 li
+176.676 97.2446 176.689 96.7642 176.714 96.1646 cv
+176.789 94.3315 li
+176.826 93.7065 176.857 93.1196 176.88 92.5708 cv
+176.919 92.022 176.951 91.6099 176.976 91.3345 cv
+176.726 91.397 176.527 91.4282 176.376 91.4282 cv
+176.201 91.4282 175.99 91.397 175.74 91.3345 cv
+175.802 92.4341 175.84 93.606 175.852 94.855 cv
+175.876 96.0903 175.89 97.3638 175.89 98.6733 cv
+175.89 101.22 li
+175.315 100.647 174.642 99.9536 173.869 99.1421 cv
+173.107 98.3179 172.296 97.4507 171.435 96.5396 cv
+170.585 95.6157 169.724 94.686 168.851 93.7505 cv
+167.99 92.8013 167.177 91.9165 166.417 91.0923 cv
+166.117 91.0923 li
+166.143 91.5161 166.155 92.1597 166.155 93.022 cv
+166.168 93.8823 166.173 94.9116 166.173 96.1089 cv
+166.173 96.52 166.168 96.9888 166.155 97.5132 cv
+166.143 98.0366 166.124 98.5737 166.099 99.1235 cv
+166.087 99.6733 166.062 100.221 166.023 100.77 cv
+165.949 102.305 li
+165.925 102.768 165.894 103.167 165.857 103.503 cv
+165.832 103.84 165.806 104.072 165.782 104.197 cv
+165.994 104.172 166.224 104.159 166.474 104.159 cv
+166.709 104.159 166.928 104.172 167.128 104.197 cv
+167.117 104.097 167.103 103.909 167.091 103.634 cv
+167.054 102.643 li
+167.017 101.425 li
+166.978 100.135 li
+166.978 99.7104 166.972 99.3042 166.96 98.9175 cv
+166.96 97.9438 li
+166.96 96.9331 166.966 96.1333 166.978 95.5464 cv
+166.992 94.9604 167.003 94.4946 167.017 94.1431 cv
+168.64 95.8657 170.262 97.6011 171.884 99.3472 cv
+173.506 101.083 175.036 102.78 176.471 104.441 cv
+cp
+182.947 104.197 mo
+183.146 104.172 183.365 104.159 183.602 104.159 cv
+183.841 104.159 184.059 104.172 184.258 104.197 cv
+184.875 102.361 li
+185.568 100.302 li
+186.281 98.2251 li
+186.517 97.5386 186.736 96.895 186.935 96.2964 cv
+187.149 95.6987 187.335 95.1597 187.497 94.686 cv
+187.91 93.5259 li
+188.583 95.3989 189.175 97.2144 189.724 98.9731 cv
+190.273 100.722 190.828 102.463 191.39 104.197 cv
+191.591 104.172 191.802 104.159 192.027 104.159 cv
+192.251 104.159 192.462 104.172 192.666 104.197 cv
+192.777 103.897 192.945 103.41 193.169 102.737 cv
+193.957 100.433 li
+194.255 99.5737 194.56 98.6675 194.875 97.7183 cv
+195.791 95.0229 li
+196.595 92.7583 li
+196.833 92.0972 197.015 91.6235 197.138 91.3345 cv
+196.802 91.4106 li
+196.701 91.4224 196.595 91.4282 196.482 91.4282 cv
+196.373 91.4282 196.259 91.4224 196.146 91.4106 cv
+195.828 91.3345 li
+195.765 91.6099 195.648 92.0337 195.474 92.6079 cv
+195.31 93.1821 195.117 93.8394 194.892 94.5728 cv
+194.679 95.2983 194.449 96.0649 194.199 96.8784 cv
+193.962 97.6753 193.726 98.4429 193.488 99.1802 cv
+192.869 101.146 li
+192.476 102.417 li
+191.972 101.07 li
+191.333 99.1421 li
+190.587 96.9136 li
+189.875 94.686 li
+189.257 92.7202 li
+189.083 92.1333 188.951 91.6724 188.864 91.3345 cv
+188.615 91.397 188.408 91.4282 188.248 91.4282 cv
+188.084 91.4282 187.877 91.397 187.628 91.3345 cv
+187.552 91.647 187.427 92.0972 187.255 92.6831 cv
+187.08 93.2573 186.88 93.9009 186.656 94.6108 cv
+186.429 95.312 186.187 96.0464 185.925 96.8208 cv
+185.662 97.5942 185.413 98.3442 185.176 99.0669 cv
+184.519 101.034 li
+184.052 102.417 li
+183.003 99.2358 li
+182.181 96.5396 li
+181.931 95.6782 181.694 94.8364 181.469 94.0122 cv
+181.244 93.1763 181.013 92.2837 180.777 91.3345 cv
+180.309 91.4106 li
+180.158 91.4224 180.001 91.4282 179.841 91.4282 cv
+179.677 91.4282 179.522 91.4224 179.373 91.4106 cv
+178.904 91.3345 li
+179.029 91.6587 179.198 92.1597 179.41 92.8345 cv
+179.634 93.5073 179.878 94.269 180.138 95.1167 cv
+180.964 97.7769 li
+181.787 100.433 li
+182.048 101.283 182.281 102.044 182.48 102.717 cv
+182.947 104.197 li
+cp
+200.414 98.3735 mo
+200.738 98.3735 201.076 98.3813 201.425 98.3931 cv
+201.775 98.4067 202.111 98.4126 202.437 98.4126 cv
+203.484 98.4126 li
+204.533 98.3735 li
+202.455 93.6177 li
+200.414 98.3735 li
+cp
+208.707 104.197 mo
+208.533 104.172 208.367 104.159 208.203 104.159 cv
+207.716 104.159 li
+207.21 104.159 li
+207.06 104.159 206.898 104.172 206.724 104.197 cv
+206.636 103.909 206.517 103.566 206.367 103.167 cv
+206.218 102.754 206.05 102.331 205.863 101.894 cv
+205.687 101.445 205.505 100.995 205.32 100.547 cv
+204.796 99.2358 li
+204.396 99.2222 203.99 99.2163 203.58 99.2163 cv
+203.167 99.2056 202.755 99.1987 202.343 99.1987 cv
+201.957 99.1987 201.574 99.2056 201.201 99.2163 cv
+200.826 99.2163 200.445 99.2222 200.058 99.2358 cv
+199.66 100.209 199.298 101.14 198.972 102.025 cv
+198.648 102.899 198.404 103.623 198.244 104.197 cv
+198.029 104.172 197.8 104.159 197.55 104.159 cv
+197.3 104.159 197.07 104.172 196.857 104.197 cv
+197.869 102.013 198.855 99.8403 199.816 97.6821 cv
+200.777 95.521 201.744 93.3267 202.716 91.0923 cv
+203.074 91.0923 li
+204.046 93.4507 li
+205.115 95.9956 li
+206.199 98.5601 li
+207.21 100.938 li
+207.537 101.663 207.822 102.312 208.072 102.885 cv
+208.333 103.46 208.546 103.897 208.707 104.197 cv
+cp
+210.861 96.1841 mo
+210.861 99.4048 li
+210.861 100.228 210.841 101.04 210.806 101.837 cv
+210.779 102.636 210.748 103.423 210.71 104.197 cv
+210.998 104.172 211.304 104.159 211.628 104.159 cv
+211.955 104.159 212.259 104.172 212.546 104.197 cv
+212.433 101.837 li
+212.408 101.04 212.396 100.228 212.396 99.4048 cv
+212.396 98.0366 li
+213.109 98.0366 li
+213.507 98.4487 213.945 98.9536 214.417 99.5532 cv
+214.904 100.141 215.378 100.734 215.841 101.333 cv
+216.302 101.931 216.72 102.494 217.095 103.018 cv
+217.48 103.542 217.769 103.935 217.957 104.197 cv
+218.13 104.172 218.312 104.159 218.498 104.159 cv
+219.041 104.159 li
+219.603 104.159 li
+219.789 104.159 219.978 104.172 220.166 104.197 cv
+219.99 104.023 219.759 103.766 219.472 103.429 cv
+219.185 103.092 218.878 102.723 218.554 102.324 cv
+217.544 101.051 li
+217.195 100.602 216.857 100.177 216.533 99.7788 cv
+215.654 98.6558 li
+215.037 97.8687 li
+215.398 97.8188 215.796 97.7183 216.236 97.5688 cv
+216.683 97.4077 217.101 97.1899 217.486 96.9136 cv
+217.875 96.6274 218.201 96.272 218.46 95.8472 cv
+218.736 95.4097 218.873 94.8921 218.873 94.2944 cv
+218.873 93.731 218.767 93.2632 218.554 92.8901 cv
+218.355 92.5142 218.074 92.2134 217.712 91.9907 cv
+217.363 91.7534 216.951 91.5845 216.476 91.4849 cv
+216.001 91.3853 215.503 91.3345 214.978 91.3345 cv
+214.617 91.3345 214.263 91.354 213.914 91.3911 cv
+213.562 91.4165 213.207 91.4282 212.845 91.4282 cv
+212.482 91.4282 212.128 91.4224 211.779 91.4106 cv
+210.71 91.3345 li
+210.748 92.1597 210.779 92.9712 210.806 93.77 cv
+210.841 94.5552 210.861 95.3599 210.861 96.1841 cv
+cp
+212.396 97.2524 mo
+212.396 96.1841 li
+212.396 95.5112 212.408 94.8364 212.433 94.1616 cv
+212.507 92.1216 li
+212.708 92.0972 212.951 92.0776 213.238 92.0649 cv
+213.525 92.0415 213.888 92.0278 214.324 92.0278 cv
+214.648 92.0278 214.978 92.0649 215.316 92.1401 cv
+215.654 92.2036 215.966 92.3276 216.251 92.5142 cv
+216.539 92.7017 216.771 92.9575 216.945 93.2817 cv
+217.132 93.5942 217.226 93.9927 217.226 94.481 cv
+217.226 95.0415 217.109 95.5112 216.871 95.8853 cv
+216.646 96.2466 216.357 96.5396 216.009 96.7642 cv
+215.662 96.9771 215.273 97.1265 214.849 97.2144 cv
+214.435 97.3003 214.037 97.3442 213.65 97.3442 cv
+213.4 97.3442 213.169 97.3384 212.958 97.3267 cv
+212.757 97.313 212.57 97.2886 212.396 97.2524 cv
+cp
+224.564 96.1841 mo
+224.564 99.4048 li
+224.564 100.228 224.544 101.04 224.509 101.837 cv
+224.484 102.636 224.453 103.423 224.416 104.197 cv
+224.701 104.172 225.009 104.159 225.333 104.159 cv
+225.658 104.159 225.962 104.172 226.25 104.197 cv
+226.138 101.837 li
+226.111 101.04 226.099 100.228 226.099 99.4048 cv
+226.099 96.1841 li
+226.099 94.8862 226.119 93.5942 226.156 92.3081 cv
+226.48 92.3081 226.818 92.3159 227.166 92.3276 cv
+227.529 92.3276 227.884 92.3403 228.234 92.3657 cv
+228.595 92.3774 228.939 92.397 229.265 92.4224 cv
+229.601 92.4478 229.9 92.4771 230.164 92.5142 cv
+230.099 92.2886 230.068 92.0972 230.068 91.936 cv
+230.068 91.7837 230.099 91.5845 230.164 91.3345 cv
+227.748 91.4106 li
+226.96 91.4224 226.156 91.4282 225.333 91.4282 cv
+224.509 91.4282 223.703 91.4224 222.916 91.4106 cv
+220.503 91.3345 li
+220.564 91.5845 220.595 91.7778 220.595 91.9165 cv
+220.595 92.0913 220.564 92.2886 220.503 92.5142 cv
+220.765 92.4771 221.058 92.4478 221.382 92.4224 cv
+221.72 92.397 222.062 92.3774 222.412 92.3657 cv
+222.773 92.3403 223.128 92.3276 223.478 92.3276 cv
+223.841 92.3159 224.183 92.3081 224.509 92.3081 cv
+224.544 93.5942 224.564 94.8862 224.564 96.1841 cv
+cp
+232.371 96.1646 mo
+232.371 99.3862 li
+232.371 100.209 232.353 101.021 232.316 101.819 cv
+232.291 102.606 232.259 103.398 232.22 104.197 cv
+232.796 104.172 233.363 104.159 233.925 104.159 cv
+235.628 104.159 li
+237.314 104.159 li
+237.875 104.159 238.437 104.172 238.998 104.197 cv
+238.962 104.072 238.943 103.909 238.943 103.71 cv
+238.943 103.429 li
+238.955 103.315 238.974 103.217 238.998 103.128 cv
+238.699 103.193 238.343 103.243 237.931 103.28 cv
+236.64 103.354 li
+236.191 103.366 235.728 103.373 235.255 103.373 cv
+233.943 103.373 li
+233.931 103.134 233.919 102.788 233.906 102.324 cv
+233.906 100.566 li
+233.906 99.4409 li
+233.906 98.7114 li
+233.906 98.2251 li
+233.919 98.0874 233.925 97.9624 233.925 97.8511 cv
+234.15 97.8511 234.449 97.856 234.824 97.8687 cv
+235.21 97.8687 235.617 97.8745 236.041 97.8872 cv
+236.476 97.8872 236.908 97.8989 237.332 97.9243 cv
+237.769 97.9497 238.15 97.9819 238.474 98.019 cv
+238.437 97.8325 238.417 97.646 238.417 97.4585 cv
+238.417 97.2583 238.437 97.064 238.474 96.8784 cv
+237.595 96.9507 li
+237.294 96.9644 236.964 96.9829 236.603 97.0083 cv
+235.404 97.0454 li
+234.966 97.0581 234.474 97.064 233.925 97.064 cv
+233.925 96.8276 233.919 96.4761 233.906 96.0151 cv
+233.906 94.5913 li
+233.906 94.1313 233.912 93.7183 233.925 93.356 cv
+233.951 92.9946 233.968 92.6157 233.98 92.2134 cv
+234.593 92.2134 235.119 92.2271 235.554 92.2524 cv
+235.992 92.2642 236.39 92.2837 236.751 92.3081 cv
+237.8 92.3833 li
+238.904 92.4585 li
+238.869 92.271 238.849 92.0845 238.849 91.897 cv
+238.849 91.7104 238.869 91.5229 238.904 91.3345 cv
+237.24 91.4106 li
+236.689 91.4224 236.132 91.4282 235.572 91.4282 cv
+235.011 91.4282 234.449 91.4224 233.888 91.4106 cv
+232.22 91.3345 li
+232.259 92.1333 232.291 92.9341 232.316 93.731 cv
+232.353 94.5298 232.371 95.3403 232.371 96.1646 cv
+cp
+ef
+250.511 104.389 mo
+250.716 104.364 250.939 104.351 251.183 104.351 cv
+251.425 104.351 251.648 104.364 251.851 104.389 cv
+252.484 102.515 li
+253.191 100.408 li
+253.919 98.2827 li
+254.587 96.3101 li
+255.164 94.6655 li
+255.585 93.478 li
+256.275 95.3931 256.88 97.2505 257.443 99.0474 cv
+258.003 100.835 258.57 102.617 259.144 104.389 cv
+259.349 104.364 259.568 104.351 259.796 104.351 cv
+260.025 104.351 260.242 104.364 260.447 104.389 cv
+260.562 104.083 260.734 103.586 260.964 102.897 cv
+261.767 100.543 li
+262.074 99.6626 262.386 98.7368 262.707 97.7671 cv
+263.644 95.0093 li
+264.466 92.6929 li
+264.708 92.0161 264.894 91.5327 265.021 91.2388 cv
+264.677 91.3149 li
+264.576 91.3276 264.466 91.3345 264.351 91.3345 cv
+264.238 91.3345 264.123 91.3276 264.007 91.3149 cv
+263.683 91.2388 li
+263.619 91.52 263.498 91.9546 263.318 92.5405 cv
+263.152 93.1274 262.953 93.7993 262.726 94.5503 cv
+262.507 95.2915 262.271 96.0757 262.017 96.9048 cv
+261.775 97.7222 261.531 98.5063 261.291 99.2612 cv
+260.658 101.27 li
+260.255 102.572 li
+259.74 101.193 li
+259.087 99.2222 li
+258.322 96.9429 li
+257.595 94.6655 li
+256.962 92.6548 li
+256.785 92.0552 256.65 91.5835 256.56 91.2388 cv
+256.306 91.3013 256.095 91.3345 255.929 91.3345 cv
+255.763 91.3345 255.552 91.3013 255.298 91.2388 cv
+255.22 91.5571 255.093 92.0161 254.916 92.6177 cv
+254.302 94.5874 li
+254.074 95.3042 253.824 96.0571 253.556 96.8491 cv
+252.789 99.146 li
+252.119 101.155 li
+251.642 102.572 li
+250.57 99.3169 li
+249.726 96.5601 li
+249.472 95.6802 249.23 94.8198 248.998 93.9771 cv
+248.769 93.1216 248.533 92.2075 248.291 91.2388 cv
+247.812 91.3149 li
+247.66 91.3276 247.501 91.3345 247.335 91.3345 cv
+247.169 91.3345 247.009 91.3276 246.857 91.3149 cv
+246.378 91.2388 li
+246.505 91.5708 246.677 92.0815 246.894 92.77 cv
+247.125 93.4585 247.373 94.2388 247.64 95.106 cv
+248.482 97.8247 li
+249.324 100.543 li
+249.593 101.41 249.83 102.188 250.035 102.877 cv
+250.511 104.389 li
+cp
+267.148 96.1978 mo
+267.148 99.4888 li
+267.148 100.332 267.128 101.162 267.089 101.977 cv
+267.064 102.793 267.033 103.598 266.994 104.389 cv
+267.289 104.364 267.599 104.351 267.931 104.351 cv
+268.263 104.351 268.576 104.364 268.871 104.389 cv
+268.753 101.977 li
+268.728 101.162 268.716 100.332 268.716 99.4888 cv
+268.716 96.1978 li
+268.716 95.354 268.728 94.5317 268.753 93.7271 cv
+268.871 91.2388 li
+268.39 91.3149 li
+268.238 91.3276 268.085 91.3345 267.931 91.3345 cv
+267.779 91.3345 267.625 91.3276 267.472 91.3149 cv
+266.994 91.2388 li
+267.033 92.0815 267.064 92.9106 267.089 93.7271 cv
+267.128 94.5317 267.148 95.354 267.148 96.1978 cv
+cp
+272.468 96.1782 mo
+272.468 99.4692 li
+272.468 100.312 272.449 101.144 272.412 101.958 cv
+272.386 102.762 272.355 103.574 272.316 104.389 cv
+272.904 104.364 273.482 104.351 274.056 104.351 cv
+275.798 104.351 li
+277.523 104.351 li
+278.095 104.351 278.671 104.364 279.246 104.389 cv
+279.207 104.263 279.187 104.097 279.187 103.891 cv
+279.187 103.606 li
+279.201 103.49 279.22 103.388 279.246 103.298 cv
+278.939 103.362 278.576 103.414 278.154 103.452 cv
+276.833 103.529 li
+276.375 103.542 275.902 103.547 275.417 103.547 cv
+274.076 103.547 li
+274.039 102.476 li
+274.039 100.676 li
+274.039 99.5259 li
+274.039 98.7827 li
+274.039 98.2827 li
+274.05 98.144 274.056 98.0151 274.056 97.8989 cv
+274.287 97.8989 274.593 97.9067 274.976 97.9185 cv
+275.373 97.9185 275.787 97.9263 276.22 97.939 cv
+276.667 97.939 277.107 97.9507 277.541 97.9771 cv
+277.988 98.0034 278.378 98.0347 278.71 98.0728 cv
+278.671 97.8804 278.652 97.6909 278.652 97.4985 cv
+278.652 97.2935 278.671 97.0952 278.71 96.9048 cv
+277.81 96.981 li
+277.501 96.9946 277.166 97.0142 276.796 97.0396 cv
+275.57 97.0767 li
+275.123 97.0894 274.619 97.0952 274.056 97.0952 cv
+274.039 96.0249 li
+274.039 94.5688 li
+274.039 94.0962 274.044 93.6763 274.056 93.3071 cv
+274.082 92.937 274.103 92.5464 274.115 92.1392 cv
+274.74 92.1392 275.277 92.1509 275.724 92.1763 cv
+276.169 92.1899 276.576 92.2075 276.947 92.2329 cv
+278.021 92.3101 li
+279.15 92.3872 li
+279.111 92.1958 279.091 92.0044 279.091 91.813 cv
+279.091 91.6235 279.111 91.4302 279.15 91.2388 cv
+277.445 91.3149 li
+276.886 91.3276 276.318 91.3345 275.744 91.3345 cv
+275.167 91.3345 274.593 91.3276 274.019 91.3149 cv
+272.316 91.2388 li
+272.355 92.0552 272.386 92.8726 272.412 93.689 cv
+272.449 94.5054 272.468 95.3345 272.468 96.1782 cv
+cp
+292.818 104.639 mo
+293.083 104.639 li
+293.083 104.007 li
+293.083 103.701 293.078 103.342 293.066 102.935 cv
+293.066 102.515 293.06 102.068 293.046 101.595 cv
+293.046 101.111 293.041 100.632 293.029 100.161 cv
+293.029 98.8003 li
+293.029 97.6538 li
+293.029 97.2817 293.041 96.7915 293.066 96.1782 cv
+293.144 94.3022 li
+293.24 92.5024 li
+293.333 91.2388 li
+293.078 91.3013 292.875 91.3345 292.722 91.3345 cv
+292.542 91.3345 292.326 91.3013 292.072 91.2388 cv
+292.134 92.3618 292.173 93.563 292.185 94.8384 cv
+292.21 96.1021 292.224 97.4028 292.224 98.7437 cv
+292.224 101.347 li
+291.636 100.759 290.947 100.051 290.156 99.2222 cv
+289.376 98.3794 288.548 97.4917 287.667 96.5601 cv
+286.8 95.6157 285.919 94.6655 285.027 93.7085 cv
+284.144 92.7388 283.316 91.8325 282.539 90.9907 cv
+282.23 90.9907 li
+282.257 91.4243 282.269 92.0815 282.269 92.9614 cv
+282.283 93.8433 282.289 94.896 282.289 96.1206 cv
+282.289 96.5415 282.283 97.02 282.269 97.5552 cv
+282.257 98.0913 282.238 98.6411 282.212 99.2026 cv
+282.199 99.7642 282.173 100.326 282.136 100.887 cv
+282.06 102.458 li
+282.035 102.928 282.001 103.336 281.964 103.682 cv
+281.939 104.026 281.912 104.263 281.886 104.389 cv
+282.103 104.364 282.339 104.351 282.595 104.351 cv
+282.837 104.351 283.06 104.364 283.265 104.389 cv
+283.251 104.287 283.24 104.097 283.226 103.815 cv
+283.189 102.8 li
+283.15 101.557 li
+283.113 100.236 li
+283.113 99.8022 283.105 99.3882 283.093 98.9917 cv
+283.093 97.9976 li
+283.093 96.9624 283.099 96.144 283.113 95.5464 cv
+283.15 94.1099 li
+284.808 95.8716 286.468 97.646 288.126 99.4312 cv
+289.787 101.206 291.349 102.941 292.818 104.639 cv
+cp
+ef
+98.5605 18.9941 mo
+98.5098 17.3203 98.3999 15.7568 98.231 14.3022 cv
+99.1772 14.4722 99.938 14.5562 100.513 14.5562 cv
+101.088 14.5562 101.849 14.4722 102.796 14.3022 cv
+102.625 15.7568 102.517 17.3203 102.466 18.9941 cv
+102.415 20.6675 102.39 22.2651 102.39 23.7871 cv
+102.39 29.0615 li
+102.39 30.583 102.415 32.1812 102.466 33.8545 cv
+102.517 35.5283 102.625 37.0415 102.796 38.3936 cv
+102.017 38.3257 101.256 38.2925 100.513 38.2925 cv
+99.7695 38.2925 99.0083 38.3257 98.231 38.3936 cv
+98.3999 37.0415 98.5098 35.5283 98.5605 33.8545 cv
+98.6113 32.1812 98.6362 30.583 98.6362 29.0615 cv
+98.6362 23.7871 li
+98.6362 22.2651 98.6113 20.6675 98.5605 18.9941 cv
+cp
+98.687 3.65186 mo
+99.1948 3.14502 99.8032 2.89111 100.513 2.89111 cv
+101.224 2.89111 101.832 3.14502 102.339 3.65186 cv
+102.847 4.15918 103.1 4.76807 103.1 5.47803 cv
+103.1 6.1875 102.847 6.79639 102.339 7.30322 cv
+101.832 7.81055 101.224 8.06445 100.513 8.06445 cv
+99.8032 8.06445 99.1948 7.81055 98.687 7.30322 cv
+98.1802 6.79639 97.9268 6.1875 97.9268 5.47803 cv
+97.9268 4.76807 98.1802 4.15918 98.687 3.65186 cv
+cp
+1 .45 0 .14 cmyk
+f
+123.285 18.3853 mo
+122.305 17.084 120.952 16.4331 119.228 16.4331 cv
+116.861 16.4331 115.127 17.1602 114.029 18.6133 cv
+112.93 20.0679 112.381 22.1133 112.381 24.7505 cv
+112.381 29.0615 li
+112.381 30.583 112.406 32.1812 112.457 33.8545 cv
+112.508 35.5283 112.617 37.0415 112.787 38.3936 cv
+112.009 38.3257 111.248 38.2925 110.505 38.2925 cv
+109.76 38.2925 108.999 38.3257 108.222 38.3936 cv
+108.391 37.0415 108.501 35.5283 108.552 33.8545 cv
+108.603 32.1812 108.628 30.583 108.628 29.0615 cv
+108.628 23.7871 li
+108.628 22.2651 108.603 20.6675 108.552 18.9941 cv
+108.501 17.3203 108.391 15.7568 108.222 14.3022 cv
+109.168 14.4722 109.929 14.5562 110.505 14.5562 cv
+110.775 14.5562 111.07 14.5313 111.392 14.48 cv
+111.713 14.4292 112.093 14.3706 112.533 14.3022 cv
+112.432 15.6553 112.381 17.0078 112.381 18.3599 cv
+112.482 18.3599 li
+113.432 16.9063 114.568 15.7817 115.891 14.9873 cv
+117.214 14.1934 118.791 13.7954 120.623 13.7954 cv
+121.572 13.7954 122.53 13.9312 123.497 14.2012 cv
+124.464 14.4722 125.337 14.9365 126.117 15.5962 cv
+126.896 16.2554 127.533 17.1514 128.025 18.2837 cv
+128.516 19.417 128.763 20.8623 128.763 22.6201 cv
+128.763 24.0747 128.729 25.5708 128.662 27.1084 cv
+128.593 28.6479 128.56 30.2788 128.56 32.0034 cv
+128.56 35.2998 li
+128.56 35.8408 128.568 36.3735 128.585 36.8975 cv
+128.602 37.4219 128.627 37.9204 128.662 38.3936 cv
+127.977 38.3257 127.259 38.2925 126.506 38.2925 cv
+125.786 38.2925 125.085 38.3257 124.401 38.3936 cv
+124.469 36.6357 124.545 34.8262 124.63 32.9668 cv
+124.713 31.1079 124.756 29.1968 124.756 27.2354 cv
+124.756 24.1421 li
+124.756 21.6055 124.265 19.6875 123.285 18.3853 cv
+cp
+f
+134.458 34.7925 mo
+134.813 35.1982 135.235 35.5786 135.726 35.9336 cv
+136.216 36.2891 136.773 36.585 137.399 36.8213 cv
+138.024 37.0586 138.693 37.1763 139.403 37.1763 cv
+140.045 37.1763 140.662 37.0752 141.254 36.8716 cv
+141.846 36.6694 142.37 36.3828 142.827 36.0098 cv
+143.283 35.6382 143.646 35.165 143.917 34.5894 cv
+144.187 34.0151 144.322 33.356 144.322 32.6118 cv
+144.322 31.564 144.026 30.7603 143.435 30.2031 cv
+142.843 29.6445 142.108 29.1885 141.229 28.8335 cv
+140.349 28.478 139.386 28.166 138.338 27.895 cv
+137.29 27.6245 136.326 27.2446 135.447 26.7534 cv
+134.567 26.2642 133.832 25.6123 133.241 24.8013 cv
+132.648 23.9897 132.354 22.8735 132.354 21.4536 cv
+132.354 20.3379 132.539 19.3154 132.911 18.3853 cv
+133.283 17.4556 133.824 16.6528 134.534 15.9761 cv
+135.244 15.3003 136.123 14.7676 137.171 14.3789 cv
+138.219 13.9902 139.419 13.7954 140.772 13.7954 cv
+142.023 13.7954 143.08 13.9648 143.942 14.3022 cv
+144.805 14.6411 145.624 14.9448 146.402 15.2158 cv
+146.131 15.7231 145.877 16.3486 145.642 17.0923 cv
+145.404 17.8359 145.251 18.4106 145.185 18.8169 cv
+144.576 18.8169 li
+144.305 18.0054 143.781 17.2783 143.004 16.6353 cv
+142.226 15.9937 141.262 15.6724 140.113 15.6724 cv
+139.605 15.6724 139.099 15.7568 138.591 15.9253 cv
+138.084 16.0952 137.627 16.3486 137.222 16.6865 cv
+136.816 17.0249 136.478 17.4648 136.208 18.0054 cv
+135.937 18.5459 135.802 19.189 135.802 19.9321 cv
+135.802 21.0151 136.097 21.8521 136.689 22.4424 cv
+137.28 23.0347 138.016 23.5 138.896 23.8374 cv
+139.774 24.1758 140.738 24.4712 141.787 24.7251 cv
+142.834 24.979 143.797 25.334 144.677 25.79 cv
+145.556 26.2466 146.291 26.8804 146.883 27.6919 cv
+147.474 28.5034 147.771 29.6191 147.771 31.0396 cv
+147.771 32.021 147.56 32.9844 147.137 33.9302 cv
+146.714 34.8774 146.105 35.7305 145.312 36.4917 cv
+144.517 37.2524 143.562 37.8447 142.446 38.2671 cv
+141.33 38.689 140.063 38.9004 138.642 38.9004 cv
+137.086 38.9004 135.785 38.7485 134.737 38.4443 cv
+133.688 38.1396 132.81 37.7847 132.1 37.3789 cv
+132.302 36.9399 132.514 36.3394 132.733 35.5786 cv
+132.953 34.8179 133.063 34.1836 133.063 33.6768 cv
+133.672 33.6768 li
+133.84 34.0151 134.103 34.3867 134.458 34.7925 cv
+cp
+f
+156.375 7.50684 mo
+156.274 8.7915 156.198 10.0508 156.146 11.2852 cv
+156.096 12.5195 156.037 13.7622 155.968 15.0127 cv
+156.34 15.0127 157.034 15.0049 158.048 14.9873 cv
+159.063 14.9707 160.161 14.9287 161.344 14.8604 cv
+161.31 14.9619 161.294 15.1484 161.294 15.4185 cv
+161.294 15.9253 li
+161.294 16.4834 li
+161.294 16.7207 161.31 16.8892 161.344 16.9907 cv
+160.906 16.9575 160.449 16.9321 159.975 16.9146 cv
+159.501 16.8979 158.996 16.8892 158.454 16.8892 cv
+155.968 16.8892 li
+155.935 17.0249 155.893 17.5659 155.843 18.5122 cv
+155.792 19.459 155.75 20.584 155.715 21.8848 cv
+155.681 23.1875 155.656 24.5479 155.639 25.9678 cv
+155.622 27.3882 155.614 28.6563 155.614 29.772 cv
+155.614 30.7188 155.639 31.6479 155.69 32.5605 cv
+155.742 33.4741 155.901 34.2939 156.172 35.021 cv
+156.442 35.748 156.848 36.3315 157.388 36.7705 cv
+157.929 37.21 158.708 37.4302 159.722 37.4302 cv
+159.993 37.4302 160.355 37.3965 160.813 37.3286 cv
+161.269 37.2607 161.666 37.1763 162.004 37.0752 cv
+162.004 38.2925 li
+161.429 38.3936 160.796 38.5205 160.102 38.6724 cv
+159.409 38.8247 158.741 38.9004 158.098 38.9004 cv
+155.968 38.9004 154.398 38.376 153.382 37.3286 cv
+152.368 36.2803 151.861 34.7422 151.861 32.7134 cv
+151.861 31.8003 151.877 30.8115 151.911 29.7456 cv
+151.945 28.6812 151.987 27.5146 152.039 26.2466 cv
+152.089 24.979 152.13 23.5762 152.166 22.0366 cv
+152.198 20.499 152.216 18.7832 152.216 16.8892 cv
+150.593 16.8892 li
+150.322 16.8892 150.035 16.8979 149.73 16.9146 cv
+149.427 16.9321 149.105 16.9575 148.768 16.9907 cv
+148.801 16.7876 148.827 16.5938 148.843 16.4077 cv
+148.861 16.2222 148.87 16.0273 148.87 15.8242 cv
+148.87 15.6553 148.861 15.4868 148.843 15.3169 cv
+148.827 15.1484 148.801 14.9795 148.768 14.8101 cv
+150.288 14.9111 151.405 14.9619 152.115 14.9619 cv
+152.081 14.2861 152.054 13.4404 152.039 12.4263 cv
+152.021 11.4116 151.979 10.3638 151.911 9.28125 cv
+156.122 7.50684 li
+156.375 7.50684 li
+cp
+f
+164.907 18.9941 mo
+164.856 17.3203 164.746 15.7568 164.578 14.3022 cv
+165.524 14.4722 166.285 14.5562 166.86 14.5562 cv
+167.434 14.5562 168.196 14.4722 169.143 14.3022 cv
+168.973 15.7568 168.864 17.3203 168.812 18.9941 cv
+168.762 20.6675 168.736 22.2651 168.736 23.7871 cv
+168.736 29.0615 li
+168.736 30.583 168.762 32.1812 168.812 33.8545 cv
+168.864 35.5283 168.973 37.0415 169.143 38.3936 cv
+168.363 38.3257 167.603 38.2925 166.86 38.2925 cv
+166.116 38.2925 165.355 38.3257 164.578 38.3936 cv
+164.746 37.0415 164.856 35.5283 164.907 33.8545 cv
+164.958 32.1812 164.983 30.583 164.983 29.0615 cv
+164.983 23.7871 li
+164.983 22.2651 164.958 20.6675 164.907 18.9941 cv
+cp
+165.034 3.65186 mo
+165.542 3.14502 166.15 2.89111 166.86 2.89111 cv
+167.571 2.89111 168.178 3.14502 168.686 3.65186 cv
+169.193 4.15918 169.446 4.76807 169.446 5.47803 cv
+169.446 6.1875 169.193 6.79639 168.686 7.30322 cv
+168.178 7.81055 167.571 8.06445 166.86 8.06445 cv
+166.15 8.06445 165.542 7.81055 165.034 7.30322 cv
+164.527 6.79639 164.274 6.1875 164.274 5.47803 cv
+164.274 4.76807 164.527 4.15918 165.034 3.65186 cv
+cp
+f
+179.185 7.50684 mo
+179.083 8.7915 179.006 10.0508 178.957 11.2852 cv
+178.906 12.5195 178.847 13.7622 178.778 15.0127 cv
+179.15 15.0127 179.844 15.0049 180.858 14.9873 cv
+181.872 14.9707 182.97 14.9287 184.155 14.8604 cv
+184.121 14.9619 184.103 15.1484 184.103 15.4185 cv
+184.103 15.9253 li
+184.103 16.4834 li
+184.103 16.7207 184.121 16.8892 184.155 16.9907 cv
+183.714 16.9575 183.259 16.9321 182.785 16.9146 cv
+182.311 16.8979 181.804 16.8892 181.264 16.8892 cv
+178.778 16.8892 li
+178.745 17.0249 178.703 17.5659 178.652 18.5122 cv
+178.602 19.459 178.558 20.584 178.526 21.8848 cv
+178.492 23.1875 178.466 24.5479 178.45 25.9678 cv
+178.432 27.3882 178.423 28.6563 178.423 29.772 cv
+178.423 30.7188 178.45 31.6479 178.5 32.5605 cv
+178.55 33.4741 178.71 34.2939 178.981 35.021 cv
+179.251 35.748 179.657 36.3315 180.199 36.7705 cv
+180.739 37.21 181.517 37.4302 182.532 37.4302 cv
+182.803 37.4302 183.166 37.3965 183.623 37.3286 cv
+184.079 37.2607 184.476 37.1763 184.815 37.0752 cv
+184.815 38.2925 li
+184.239 38.3936 183.605 38.5205 182.913 38.6724 cv
+182.219 38.8247 181.551 38.9004 180.909 38.9004 cv
+178.778 38.9004 177.206 38.376 176.192 37.3286 cv
+175.178 36.2803 174.669 34.7422 174.669 32.7134 cv
+174.669 31.8003 174.687 30.8115 174.721 29.7456 cv
+174.754 28.6812 174.797 27.5146 174.848 26.2466 cv
+174.899 24.979 174.941 23.5762 174.975 22.0366 cv
+175.007 20.499 175.025 18.7832 175.025 16.8892 cv
+173.403 16.8892 li
+173.131 16.8892 172.845 16.8979 172.541 16.9146 cv
+172.236 16.9321 171.915 16.9575 171.578 16.9907 cv
+171.611 16.7876 171.635 16.5938 171.653 16.4077 cv
+171.668 16.2222 171.679 16.0273 171.679 15.8242 cv
+171.679 15.6553 171.668 15.4868 171.653 15.3169 cv
+171.635 15.1484 171.611 14.9795 171.578 14.8101 cv
+173.098 14.9111 174.215 14.9619 174.925 14.9619 cv
+174.891 14.2861 174.865 13.4404 174.848 12.4263 cv
+174.832 11.4116 174.789 10.3638 174.721 9.28125 cv
+178.931 7.50684 li
+179.185 7.50684 li
+cp
+f
+187.217 26.1455 mo
+187.269 24.8774 187.294 23.6182 187.294 22.3667 cv
+187.294 21.1836 187.286 19.8989 187.269 18.5122 cv
+187.251 17.1265 187.226 15.7231 187.194 14.3022 cv
+188.038 14.4722 188.748 14.5562 189.323 14.5562 cv
+189.864 14.5562 190.557 14.4722 191.403 14.3022 cv
+191.233 16.3311 191.106 18.5552 191.022 20.9722 cv
+190.938 23.3896 190.895 25.8662 190.895 28.4023 cv
+190.895 30.1606 191.048 31.5049 191.352 32.4341 cv
+191.656 33.3643 192.028 34.0659 192.467 34.5386 cv
+192.94 35.0801 193.541 35.5283 194.268 35.8833 cv
+194.996 36.2383 195.848 36.4155 196.831 36.4155 cv
+198.25 36.4155 199.432 36.103 200.379 35.4775 cv
+201.326 34.8521 202.018 34.0825 202.459 33.1694 cv
+202.695 32.5947 202.881 32.1045 203.017 31.6987 cv
+203.152 31.293 203.262 30.7529 203.346 30.0757 cv
+203.43 29.3999 203.481 28.4868 203.498 27.3374 cv
+203.515 26.188 203.524 24.6157 203.524 22.6201 cv
+203.524 18.3599 li
+203.524 17.6162 203.515 16.9063 203.498 16.2295 cv
+203.481 15.5537 203.457 14.9111 203.422 14.3022 cv
+203.794 14.3706 204.15 14.4292 204.487 14.48 cv
+204.826 14.5313 205.181 14.5562 205.553 14.5562 cv
+205.924 14.5562 206.28 14.5313 206.619 14.48 cv
+206.956 14.4292 207.294 14.3706 207.632 14.3022 cv
+207.462 16.9399 207.361 19.4839 207.329 21.9355 cv
+207.294 24.3877 207.278 26.9824 207.278 29.7207 cv
+207.278 31.2422 207.294 32.731 207.329 34.1836 cv
+207.361 35.6382 207.412 37.0415 207.48 38.3936 cv
+206.804 38.3257 206.144 38.2925 205.501 38.2925 cv
+204.86 38.2925 204.2 38.3257 203.524 38.3936 cv
+203.558 38.0894 203.583 37.7686 203.601 37.4302 cv
+203.618 37.0923 203.625 36.7373 203.625 36.3652 cv
+203.625 34.1836 li
+203.524 34.1836 li
+202.644 35.8071 201.512 36.9985 200.126 37.7593 cv
+198.74 38.5205 197.235 38.9004 195.612 38.9004 cv
+192.974 38.9004 190.904 38.1997 189.399 36.7964 cv
+187.893 35.3931 187.142 33.3726 187.142 30.7354 cv
+187.142 28.9434 187.167 27.4131 187.217 26.1455 cv
+cp
+f
+218.095 7.50684 mo
+217.994 8.7915 217.918 10.0508 217.867 11.2852 cv
+217.816 12.5195 217.756 13.7622 217.69 15.0127 cv
+218.062 15.0127 218.755 15.0049 219.769 14.9873 cv
+220.784 14.9707 221.882 14.9287 223.066 14.8604 cv
+223.033 14.9619 223.014 15.1484 223.014 15.4185 cv
+223.014 15.9253 li
+223.014 16.4834 li
+223.014 16.7207 223.033 16.8892 223.066 16.9907 cv
+222.625 16.9575 222.169 16.9321 221.697 16.9146 cv
+221.223 16.8979 220.715 16.8892 220.175 16.8892 cv
+217.69 16.8892 li
+217.656 17.0249 217.614 17.5659 217.563 18.5122 cv
+217.511 19.459 217.469 20.584 217.435 21.8848 cv
+217.402 23.1875 217.377 24.5479 217.36 25.9678 cv
+217.341 27.3882 217.334 28.6563 217.334 29.772 cv
+217.334 30.7188 217.36 31.6479 217.412 32.5605 cv
+217.461 33.4741 217.622 34.2939 217.892 35.021 cv
+218.164 35.748 218.568 36.3315 219.111 36.7705 cv
+219.651 37.21 220.428 37.4302 221.443 37.4302 cv
+221.712 37.4302 222.078 37.3965 222.534 37.3286 cv
+222.99 37.2607 223.387 37.1763 223.725 37.0752 cv
+223.725 38.2925 li
+223.15 38.3936 222.516 38.5205 221.822 38.6724 cv
+221.129 38.8247 220.462 38.9004 219.82 38.9004 cv
+217.69 38.9004 216.118 38.376 215.104 37.3286 cv
+214.089 36.2803 213.582 34.7422 213.582 32.7134 cv
+213.582 31.8003 213.598 30.8115 213.632 29.7456 cv
+213.665 28.6812 213.708 27.5146 213.758 26.2466 cv
+213.81 24.979 213.851 23.5762 213.886 22.0366 cv
+213.919 20.499 213.936 18.7832 213.936 16.8892 cv
+212.313 16.8892 li
+212.042 16.8892 211.755 16.8979 211.452 16.9146 cv
+211.148 16.9321 210.826 16.9575 210.489 16.9907 cv
+210.521 16.7876 210.546 16.5938 210.564 16.4077 cv
+210.581 16.2222 210.588 16.0273 210.588 15.8242 cv
+210.588 15.6553 210.581 15.4868 210.564 15.3169 cv
+210.546 15.1484 210.521 14.9795 210.489 14.8101 cv
+212.01 14.9111 213.125 14.9619 213.834 14.9619 cv
+213.8 14.2861 213.777 13.4404 213.758 12.4263 cv
+213.741 11.4116 213.7 10.3638 213.632 9.28125 cv
+217.842 7.50684 li
+218.095 7.50684 li
+cp
+f
+243.685 3.60107 mo
+242.941 3.60107 242.307 3.74561 241.783 4.03223 cv
+241.258 4.31982 240.828 4.69189 240.491 5.14795 cv
+240.152 5.60449 239.907 6.13721 239.754 6.74609 cv
+239.602 7.354 239.526 7.99658 239.526 8.67236 cv
+239.526 9.28125 239.59 10.1611 239.719 11.3101 cv
+239.846 12.46 240.002 13.5591 240.185 14.6069 cv
+241.065 14.6069 241.936 14.5991 242.797 14.5815 cv
+243.66 14.5649 244.529 14.5562 245.41 14.5562 cv
+245.375 14.7261 245.35 14.8945 245.333 15.0635 cv
+245.316 15.2329 245.308 15.4019 245.308 15.5708 cv
+245.308 15.7407 245.316 15.9092 245.333 16.0781 cv
+245.35 16.2471 245.375 16.4165 245.41 16.585 cv
+244.529 16.5518 243.66 16.5176 242.797 16.4834 cv
+241.936 16.4502 241.065 16.4331 240.185 16.4331 cv
+240.185 20.1187 240.194 23.7783 240.211 27.4131 cv
+240.227 31.0479 240.288 34.7085 240.389 38.3936 cv
+240.012 38.3257 239.636 38.2925 239.26 38.2925 cv
+238.883 38.2925 238.525 38.2925 238.181 38.2925 cv
+237.463 38.2925 236.712 38.3257 235.924 38.3936 cv
+236.162 34.7085 236.297 31.0649 236.332 27.4639 cv
+236.365 23.8633 236.381 20.186 236.381 16.4331 cv
+235.774 16.4331 235.165 16.4502 234.555 16.4834 cv
+233.948 16.5176 233.338 16.5518 232.73 16.585 cv
+232.764 16.4165 232.789 16.2471 232.806 16.0781 cv
+232.823 15.9092 232.832 15.7407 232.832 15.5708 cv
+232.832 15.4019 232.823 15.2329 232.806 15.0635 cv
+232.789 14.8945 232.764 14.7261 232.73 14.5562 cv
+233.338 14.5562 233.957 14.5649 234.582 14.5815 cv
+235.207 14.5991 235.807 14.6069 236.381 14.6069 cv
+236.381 13.6265 236.484 12.5615 236.686 11.4116 cv
+236.889 10.2627 237.185 9.12988 237.574 8.01367 cv
+237.962 6.89795 238.427 5.84131 238.968 4.84375 cv
+239.508 3.84668 240.118 3.00977 240.794 2.33301 cv
+241.403 1.72461 242.171 1.18457 243.102 .710449 cv
+244.032 .237305 244.987 0 245.968 0 cv
+246.339 0 246.677 .0507813 246.982 .152344 cv
+246.947 .82959 246.905 1.50537 246.855 2.18066 cv
+246.803 2.85791 246.779 3.53369 246.779 4.20947 cv
+246.474 4.36182 li
+245.663 3.85498 244.734 3.60107 243.685 3.60107 cv
+cp
+f
+261.181 4.15918 mo
+261.69 3.65186 262.295 3.39844 263.007 3.39844 cv
+263.717 3.39844 264.326 3.65186 264.833 4.15918 cv
+265.339 4.6665 265.594 5.2749 265.594 5.98486 cv
+265.594 6.69531 265.339 7.30322 264.833 7.81055 cv
+264.326 8.31787 263.717 8.57129 263.007 8.57129 cv
+262.295 8.57129 261.69 8.31787 261.181 7.81055 cv
+260.674 7.30322 260.419 6.69531 260.419 5.98486 cv
+260.419 5.2749 260.674 4.6665 261.181 4.15918 cv
+cp
+251.192 4.15918 mo
+251.697 3.65186 252.306 3.39844 253.016 3.39844 cv
+253.726 3.39844 254.335 3.65186 254.841 4.15918 cv
+255.349 4.6665 255.602 5.2749 255.602 5.98486 cv
+255.602 6.69531 255.349 7.30322 254.841 7.81055 cv
+254.335 8.31787 253.726 8.57129 253.016 8.57129 cv
+252.306 8.57129 251.697 8.31787 251.192 7.81055 cv
+250.683 7.30322 250.43 6.69531 250.43 5.98486 cv
+250.43 5.2749 250.683 4.6665 251.192 4.15918 cv
+cp
+247.818 26.1455 mo
+247.869 24.8774 247.893 23.6182 247.893 22.3667 cv
+247.893 21.1836 247.885 19.8989 247.869 18.5122 cv
+247.85 17.1265 247.825 15.7231 247.792 14.3022 cv
+248.637 14.4722 249.347 14.5562 249.921 14.5562 cv
+250.462 14.5562 251.156 14.4722 252.001 14.3022 cv
+251.832 16.3311 251.704 18.5552 251.623 20.9722 cv
+251.536 23.3896 251.494 25.8662 251.494 28.4023 cv
+251.494 30.1606 251.646 31.5049 251.951 32.4341 cv
+252.254 33.3643 252.627 34.0659 253.068 34.5386 cv
+253.539 35.0801 254.138 35.5283 254.867 35.8833 cv
+255.594 36.2383 256.447 36.4155 257.428 36.4155 cv
+258.848 36.4155 260.031 36.103 260.98 35.4775 cv
+261.923 34.8521 262.617 34.0825 263.057 33.1694 cv
+263.294 32.5947 263.48 32.1045 263.616 31.6987 cv
+263.751 31.293 263.861 30.7529 263.946 30.0757 cv
+264.031 29.3999 264.08 28.4868 264.098 27.3374 cv
+264.114 26.188 264.125 24.6157 264.125 22.6201 cv
+264.125 18.3599 li
+264.125 17.6162 264.114 16.9063 264.098 16.2295 cv
+264.08 15.5537 264.055 14.9111 264.023 14.3022 cv
+264.393 14.3706 264.749 14.4292 265.087 14.48 cv
+265.424 14.5313 265.78 14.5562 266.152 14.5562 cv
+266.523 14.5562 266.878 14.5313 267.216 14.48 cv
+267.554 14.4292 267.893 14.3706 268.231 14.3022 cv
+268.062 16.9399 267.96 19.4839 267.926 21.9355 cv
+267.893 24.3877 267.876 26.9824 267.876 29.7207 cv
+267.876 31.2422 267.893 32.731 267.926 34.1836 cv
+267.96 35.6382 268.01 37.0415 268.078 38.3936 cv
+267.402 38.3257 266.744 38.2925 266.101 38.2925 cv
+265.459 38.2925 264.798 38.3257 264.125 38.3936 cv
+264.156 38.0894 264.182 37.7686 264.198 37.4302 cv
+264.216 37.0923 264.224 36.7373 264.224 36.3652 cv
+264.224 34.1836 li
+264.125 34.1836 li
+263.243 35.8071 262.111 36.9985 260.724 37.7593 cv
+259.336 38.5205 257.833 38.9004 256.212 38.9004 cv
+253.575 38.9004 251.502 38.1997 250 36.7964 cv
+248.492 35.3931 247.74 33.3726 247.74 30.7354 cv
+247.74 28.9434 247.766 27.4131 247.818 26.1455 cv
+cp
+f
+283.94 18.0352 mo
+283.437 17.8618 282.926 17.7749 282.406 17.7749 cv
+281.575 17.7749 280.829 17.9658 280.17 18.3472 cv
+279.511 18.729 278.957 19.2397 278.506 19.8809 cv
+278.055 20.5229 277.708 21.2852 277.466 22.1689 cv
+277.223 23.0527 277.102 23.998 277.102 25.0029 cv
+277.102 30.7231 li
+277.102 33.0459 277.111 34.2559 277.128 35.4858 cv
+277.145 36.7168 277.207 37.7139 277.31 38.4761 cv
+276.617 38.4063 275.923 38.3721 275.23 38.3721 cv
+274.467 38.3721 273.74 38.4063 273.046 38.4761 cv
+273.15 37.2979 273.21 36.2607 273.228 34.2329 cv
+273.246 32.2051 273.254 29.7178 273.254 26.771 cv
+273.254 25.1069 li
+273.254 23.7549 273.246 22.1948 273.228 20.4268 cv
+273.21 18.6592 273.15 16.6309 273.046 14.3428 cv
+273.427 14.4126 273.792 14.4731 274.138 14.5249 cv
+274.484 14.5771 274.848 14.603 275.23 14.603 cv
+275.542 14.603 275.872 14.5771 276.218 14.5249 cv
+276.564 14.4731 276.928 14.4126 277.31 14.3428 cv
+277.171 15.5908 277.093 16.5791 277.077 17.3071 cv
+277.058 18.0352 277.05 18.729 277.05 19.3872 cv
+277.154 19.439 li
+279.2 15.6948 281.487 13.8228 284.018 13.8228 cv
+284.331 13.8228 284.598 13.8408 284.825 13.875 cv
+285.049 13.9097 285.335 13.9971 285.682 14.1348 cv
+285.508 14.5508 285.405 15.1841 285.371 16.0332 cv
+285.335 16.8828 285.318 17.6538 285.318 18.3472 cv
+284.955 18.6069 li
+284.781 18.3989 284.442 18.209 283.94 18.0352 cv
+cp
+f
+273.125 52.7031 mo
+273.108 51.3164 273.082 50.144 273.047 48.7915 cv
+273.013 47.4399 272.969 46.1489 272.917 44.918 cv
+272.866 43.688 272.805 42.6387 272.736 41.772 cv
+273.706 41.9458 274.486 42.0317 275.076 42.0317 cv
+275.665 42.0317 276.445 41.9458 277.416 41.772 cv
+277.346 42.6387 277.286 43.688 277.234 44.918 cv
+277.182 46.1489 277.138 47.4399 277.104 48.7915 cv
+277.069 50.144 277.042 51.3164 277.026 52.7031 cv
+277.008 54.0903 277 51.3711 277 52.5498 cv
+277 62.0132 li
+277 62.6724 277.208 63.0015 277.624 63.0015 cv
+277.901 63.0015 278.204 62.8804 278.534 62.6372 cv
+278.863 62.395 279.236 62.1177 279.652 61.8052 cv
+279.963 61.563 280.492 61.0952 281.238 60.4009 cv
+281.983 59.7075 282.815 58.9028 283.734 57.9829 cv
+284.652 57.0649 285.597 56.0854 286.568 55.0454 cv
+287.538 54.0054 288.421 53.0171 289.219 52.0811 cv
+289.913 52.2549 290.572 52.3418 291.196 52.3418 cv
+291.577 52.3418 291.958 52.3154 292.339 52.2637 cv
+292.721 52.2119 293.206 52.1514 293.795 52.0811 cv
+291.612 53.8491 289.523 55.5913 287.53 57.3071 cv
+285.536 59.0239 283.638 60.7651 281.835 62.5337 cv
+283.812 64.9253 285.848 67.3169 287.946 69.7095 cv
+290.042 72.1011 292.184 74.4595 294.368 76.7808 cv
+293.778 76.7114 293.25 76.6772 292.782 76.6772 cv
+292.314 76.6772 291.854 76.6772 291.404 76.6772 cv
+291.022 76.6772 290.606 76.6772 290.156 76.6772 cv
+289.705 76.6772 289.237 76.7114 288.751 76.7808 cv
+287.989 75.9155 287.122 74.9009 286.152 73.7388 cv
+285.181 72.5776 284.219 71.4253 283.266 70.2817 cv
+282.312 69.1372 281.402 68.063 280.536 67.0571 cv
+279.668 66.0522 278.923 65.2202 278.299 64.561 cv
+278.196 64.4233 278.074 64.3013 277.936 64.1978 cv
+277.796 64.0933 277.658 64.0415 277.52 64.0415 cv
+277.172 64.0415 277 64.2485 277 64.6646 cv
+277 67.7856 li
+277 69.3452 277.026 70.8618 277.078 72.3354 cv
+277.129 73.8091 277.242 75.2915 277.416 76.7808 cv
+276.618 76.7114 275.837 76.6772 275.076 76.6772 cv
+274.313 76.6772 273.533 76.7114 272.736 76.7808 cv
+272.805 75.9839 272.866 74.979 272.917 73.7651 cv
+272.969 72.5522 273.013 71.269 273.047 69.9175 cv
+273.082 68.5649 273.108 67.1958 273.125 65.8091 cv
+273.143 64.4233 273.152 63.1401 273.152 61.9614 cv
+273.152 52.5498 li
+273.152 51.3711 273.143 54.0903 273.125 52.7031 cv
+cp
+f
+%ADOBeginClientInjection: EndPageContent "AI11EPS"
+userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse
+%ADOEndClientInjection: EndPageContent "AI11EPS"
+grestore
+grestore
+pgrs
+%%PageTrailer
+%ADOBeginClientInjection: PageTrailer Start "AI11EPS"
+[/EMC AI11_PDFMark5
[/NamespacePop AI11_PDFMark5
+%ADOEndClientInjection: PageTrailer Start "AI11EPS"
+[
+[/CSA [/0 ]]
+] del_res
+Adobe_AGM_Image/pt gx
+Adobe_CoolType_Core/pt get exec
Adobe_AGM_Core/pt gx
+currentdict Adobe_AGM_Utils eq {end} if
+%%Trailer
+Adobe_AGM_Image/dt get exec
+Adobe_CoolType_Core/dt get exec
Adobe_AGM_Core/dt get exec
+%%EOF
+%AI9_PrintingDataEnd

userdict /AI9_read_buffer 256 string put
userdict begin
/ai9_skip_data
{
	mark
	{
		currentfile AI9_read_buffer { readline } stopped
		{
		}
		{
			not
			{
				exit
			} if
			(%AI9_PrivateDataEnd) eq
			{
				exit
			} if
		} ifelse
	} loop
	cleartomark
} def
end
userdict /ai9_skip_data get exec
%AI9_PrivateDataBegin
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: Adobe Illustrator(R) 14.0
%%AI8_CreatorVersion: 14.0.0
%%For: (Grafik 1) ()
%%Title: (Uni-Astrophysik-Logo-CMYK.eps)
%%CreationDate: 27.05.13 10:25
%%Canvassize: 16383
%AI9_DataStream
%Gb"-6H'98ZOXKo1n/_'AR7Y$6SA5SI2/ALjO&hKKf'8iphVPLm2N'&)`1r:1WZLi2+8?-b,2UN;1+BVk9UJFD:BU`M_r8Y^*C'DJ
%ouHMcI/WcV2qK/Of2"&)[MLQLMjX'hO,Nh]O8d>WIsCS@]$=jn'e<UFZG]d*>rnItKb*k)g7$`:[i\t,s8L8ucbKJOnb&C?^:X49
%mc156IX6#*LK>QMIei8up6ShsfC*%Zrk8-Te^*8WpM\s&\c;HhrN"6\G.Ck.B\cbAhnOU6orl)Zs0$?)rUdt)$tTAQ[e3GR[74>H
%n2lb^ro*O^n%X>Cldk9hYCHPcrV8PM6iIFBs37%ZTA(0h0%eaeRpZ0d0?0U^oO=M7RGu2HDuT?Kn]UX@Ir>;``ICYQ-gccjo>7rN
%L5;+2J4b!9C5kXSClisBIf(k6IeDN@Dq[-uqYclos5PK^q+i*I"j2&]aqEE9QC9F8NL-e!Sne5aS+kgSHhI1D%X;sd11%JZ/p":H
%ohVaJL(EV(Hs&fb(Ug\G0'T)]9-ZiS&T\/6V>>U`hYcm:c+j4a:!)_1+$P2PmWUM!^OH'Kk2kmWkMNrNpGUAVK_DtO?i%r1I/iWZ
%VgnR4p+m0Be^#a/qTFq,^NnF3M*?FhmaX8RaT1)p?`NUVY<IC+k&Xa:+5_MHq<c355D:`=TA%5uI.`7RTDArprnB@Rrpf#u`?)du
%.:/>,g[_E5dRO#qbLlfXg-VmW?atdX8Ja8-lllJmL>N!u6#6%[[_R@alaBpprmTV?hL>5KG;=[@GG!`@h%rn2(PVj@hf2eRs&Jk:
%FgukskKe'1n-?<8IIkY=:7I\ZrhdC!m_dX8+5atXZj$?%lSn4]D/I#ap^R0rJ&f=2a1qY?HB8+*l;o'3m5B0j:%Kn59DRl)n%N^i
%qR]NF^]4#j++F+7r:oRCO8o(=iZCD$/:Va2p]((Shn8sdPD^O_lIG4XrVN(nYCH<*c%l!grqgWJJ,B&djf>lJro@a.mFsh<\Y)0q
%L[h#-rsq>BqrYA)]D'@&qHs5OkOZ<0Da(i/s1\O$e`VF3s7,FDhmL5UIJDdG]8tj`\Tmf+l\kf:lI33Q^S(+J&$J0&+C3\C>J9h-
%LX0m&^&%]j[m+-1J+X9Vi8r]8g4QT_BV*TMX3\Or*:1q*YJ8QS?[__3*=V-*+26EU!jk\P+)^s7Y@6+3]"%b3rHH#gprAF;hruY?
%oBi#sJ,ANe[r4KYpZC;s(&Sn4"V:PL^$+)C^k]])5f:$Yh(QPCY#X,&>N6lVQ>^NG&&75;SQpXfn$mZ9mbQW95/$gdGAgjW^#g./
%pYW]5ZhlY,rg[!_L\LiFn_MsghY4uI:k&B.e*"3DhnAj1+5/ij5Lpa3bAZ9eppr%bjB:1VoFDdR'*6s;rqF`u=#F<:9n3/u4[/?S
%D)ZpoGjNL??bAA8?N"narF,KuhgKhDp"RKsIsUYFJ,8Zneb_:4?[Tbe$i:UD7r2g-\@DOlr/:B=\]qVJ2OaZDrTY/FB5cP.[f']m
%XT\F>`K.aErWG(lf!>$RA+-UF4+I2FduGcI;MF_a>.8a3ZHQda?NM:(:&J*GC:Wsp,^?8Y8me.`d.MVPQ=+3R>1WLO$U)kN/%bdG
%EgP<6.AjlAN/.0[9?EG?YZC$:5?,+Y\`Q#gj4$T_%DH#,eSSHjk794SHsdi4l'1J8jm-,VE3a@V>tVQl/uD*U9m^/@nM]2!<h'k/
%(0BTI?_sfZ,sZ2*f#RLED?$H9-J+[l]ImF]fH)]d*l0/bS82Ke,j5f@KAiIar>-I_&=iX]SbF+";">?nM'\F/n/:CBZRZ3N*EVpE
%cdFmNn)r`Fm`A+tmOs\09-hpuBi@MX[f*$sqq[SjcOE(KgmZuqrS4K4foiRE+"^P!9/X2$;p%kWX-0=mHQb#mM][fqMUf"'\[gmD
%`s"]Pi;^pF23oaFPtSrVYp:k49>KPl3%XdCReEB8B">XrEeagQ$!O3uX&`sc"\W_Z[1Z[MXnYq%/%1`)HF^UG=8,d?31eJGGl$^*
%[SiK6-g'3u'mF4n=mCDcG<"A:m7gEjf$[0nWCBfr%FnN]D(A8i06]A`2m#/CX]?m]PuM3!`>;V0_3OK\?(2WIJa7^6%`=HN:-%Hu
%?+)(5ks!q2WOceNEg:BLSN4[=%_:Y`9hW-7;g6^)n1'`k@u<#;kb;p'b[$^WRs+#Fd*BQ@6O5;Hj6uqP)qF9J9uT%Kh?VpJB6Wh4
%g*g=?lEX&83:Er^Dj&LBqs%q&NOJB)FqEH:l+UKhP!MoZL\ZOW<Noi=4?*$OgYd*u0b7?"X7_E\pm8UVb3];-Yo_qDG0BQ0Ej\j2
%=:G19fp'-!Be"*P@4]EZ5AhlMbL0&<k>L`XFOlJ"f&6R6F1L:.\J-Za9>V=P">81+qQ\$t`o.[_NMkPV?\(Pa#]OrtaVHn<7Fl/l
%CM[5\9&jrOqaBL1!C"Q2s$3(GZS\P$hoZtF-9R:GMu`k68o:E3P$:M[TRI.3$H</D"-4Z7]Do`4cOC@KGE49:kaue>.O^pVqjShl
%qI$kf/PQj3pN7rs<V!/cWPkJ5.L,pVZa@GTXd2D5NeRCe!%WY''9GobcP;e(V/XOY&se?MM%%TJM)W4&V2YXG3/GR[G"#Pu78FLK
%,>41D3O5a-&u#Yc,Ru^]b-2">dN?SZ,k7#$-UOD\G9Y[r:^7'XJhqG&P2*HB0ojcP^uF+cU)ODV<J38qfLT<fA[OpHRR'6!`3a:p
%d6_?mNo`'[cFRg=P*sC&0a<`^g>&DrAsuP^=X8VUmZut>e6':PC$ZV'Da@OMToBC)Z-mk?n3GajjJK2kdTB\>_OUY3jgi2tQ0H?!
%0DtD`g7UU*R+&'T=WT2-O(duX/pHVj[Np3HUtcq@,e.(uq*iKWDQ0+'2?fou_no1cJU30R1(3#mgc#_LZ/a0YbAoh34"Z)*YN8q\
%'<R59=&l(JOgIO1&rB8W/s3e7qJs7caMQH.8IjUI2g3C3+0NB=g*mXhf?9Bp5<lFPj8>,lQb\Y8;S;XuS)TLYOQYAjI(='+7D/u/
%b$sc1nBRZJW0s1[USNgI//9bgf#O:*rL2G],u=6Y'-DIf.F[[r:7RlWh)CO?C<u[^2EL4DT]jV27ht(hO1WQ'78duso@!s>"Zp*k
%)5*6VWW@6dH-V=IbO"<+IaaY2\'gVl.,;$GWV+NDhM0VQe@qW`YISCTFjn(mc?8kYHQ0W4bp)lJ)L'bLlZ)7">upBg?l-2<cTW86
%_BG]RM%@rW9W_?Gb,#PhVTR#m`?-nrTCJ"&V]P3QR:#IEAKLT4GoSC/D5roAQeHX@Sjei4;g'bAKoF3`-0ZB#NK#RnV_3t*?T%Nf
%B>\RJ<UOjLilWsbTHbr1Zoi#Qa:`3F"?@]GDMQqn5]n.W!#^b!?okea3s4+XDG:c`6!/&/!jYj7s6pLP$c#OO3C=HL)r&N/ag"S$
%KE?$>&=gk\$?A1brLe;#E0#pLc5"dlal\+j7J]SX17*ThEZnfA24#7L``tAUhe?MqB@qk8J9+'qbolCP9F>%a<9Bgc.V2PY'[qPK
%jm#+A5$DjD@ci.Mjn;R5cD8'*>L%$Rro%<]WH:o2.qfL?KZ6:tEf]!8a#.gq`\E!N7-#%`a<U,83riajVJq75i#^PO0EBc%[-?=O
%2n6sMDJe%W't5r7i-X7e*qq)Lc&0.&#.NANDD$]k-K/j@\>7l:KV`YF:*X.PY%b59mHE&AgX:3!VE6_BpSOL/G@7poB;[<kNKp31
%#Ig\Q"WSUY=U&ff%@iHUl-K+c^)aX)gc@9;#%S1I^G7iBi!7bQE7E\$E=,a'qg&dn+c=BLE?sRY+?+P`D2;Iah[D\u"[?Z5@&FX.
%b$aF@q[?,u,a"9Vdi13q+qGAWV0b4<.9rm=.kU__k5*)&ZYO@Igtb\9APKa=2J#]6N;i)PPQOBh/n&&0Q@pPJ[[7fg+NljSR&;n5
%=4cBO5uNn0Y1bWSrXmj-8_i@/aVMZR5bP&mGn]@[au;R^\3m+o&jZj.lqVNl"35p**r#o/iP[=(=2:L[S:^Nh0StoX0QSq`*KW2c
%?QcLj`>misR=R^p&<IK7A-/;&h!*C.gYO&L-Lu=5]$4rAj6#JuNS@T[ERJ,CHhEgcV;^5YqlXigfdqOXK,'P3dbpTA[R-IQIb:bs
%``4i5Z]Zl*!ck)m#>%&B,6,`XhK:!k.EnGeFQHt20j)hjb5,b'L=ib^h^o)UN]go(k0BN&:3+%9e#M5X;i<ZLlJG9fSV)1:?j]LL
%TY9-]*!0:OBe6'^L^kpbMX%CHPQZUWM$PCdW.Ng2>iJa=.4gtD%+9uB9nFXT_YV-W@JrFo'oNJKW48!n>ea`N)hh`4YuGTaaX*TD
%d[64arWFF(#VjqeY.-nt7YI05NGVEZRXj`t"Ik?dN5V3#$47e)&_rJDK=pT3`#[oY<%JD@<'1ORJU&?&A6@a1=pgVqF#B17K\QuI
%i#%3&W*\oD"ZbpSp2-&XmPS'`;g+_d;[J5;foY4BMV09teDMB#js^i@Pr@9s;+CVF@&RgEhcYl'ft8jJJoYV1MaR)MgD?QQ.G#oI
%o,euhYL[&KHb$MSZSoE*J!k/ea^0Q&r5+64A7O8sor`)Scf`koFQpXoQep9*oDH1S4tgO6"4lfdS$g\Y=Y!4t>;idKfosW6A<J)Z
%Kg^5aN+?E)mj_SJQ=L1]bkMjKi]"gs.+YKu)ilXs!\3@%iGs?=0rJ#5]mRX#$-C%fk)jZk@,aQg`a3pI:?6fD$%+G<m)<Bt5V!(Y
%,sa%C\2(AahDGUK@3>Ihaqcr#g7U8%$4lBQ:Ap,p`JDh<^ue0C:i:L+]c&n2n2HQFI(`HR557Uf`#4<`d7i:h[%hcPFkDLYFu7=h
%*dYu/gt?DRRrT$oobd>I[+*>A_?\u*@j:Mk7P[tn[h^a,O+B9)g7m?#^p?8G\!7#gba5lKeO7[li.U'N5NgN$d*pu?UrAP)\e$Vb
%_j7_VJ.c)$I6HT@H,R&]c4`6`k4_"6(sMlt?p6Fhj+-UtdH.pT^\S/(c=_=9*D\0J1q5u:lkK&!Q$cmm45c?5j["IB49.#.#Ko<@
%aNg`N*V@N-$>,9O))*dW!63fsN;2#*1+M%$.]!rVLkIW8+`<r/@0CUp+Og[k@3jd](]J\tn;l+-I=*dI90&d.A&WE6dsfu:8,')J
%C(W5tle7^_o?VEON)m",U8<Ss$GDTHQE`V)nl)oOQ&Vk_U<K?/c62o6,64)<EE(Yh"QCaih^o(Rh4V2rbl^RV-lgmioFHR(87[XQ
%7odJNG?n;o\OS12Xi>`oj4K91OqFub$4<d]#'CW<3f7T"i2dJ)KbP5!:BJRj;.LNC,.FXp>d4@&%4^Y=PZ+4l5gCf\m$bi2i8kY.
%jrnCH1!4\W&p'$E/HnL@,,1?niUF)a`K_"L"kYC6,J-CGAAp>O+t%TUFRP<0?6M!Q+bP-%a7p<)p`,@b*09V0O7C8Na#F+RITC`3
%n@?Bu#/=u,Hck8A0rJ(MZYApN5CZ>r(j9UU*UJq<2&9!X'hdTLPfn#!+QMN1SnQ@'cTgLQr'RNXAp7o#i2MCm2P&QCC(*[p_*oO`
%c<`+3SJUdC==BjT_R0ZJ"X'r5"7=DMF.cplSlA>r%5&\qCNShD3:2X+!FcqP#Q,Ll[I)1&@OXP%)1'=0*BLP,:L7#t)2m:l)2jLl
%iZ;*k)uNoSn>t!`LPknZNT&3t\bL//a8sOqNq+2pZkd_7R<l'l*\(dRP^V>k]l2om@Q)g**NSo]>'/X)Nl>h/o2[;L<opQ52kGVN
%3a9eb@"ZefV.]DJZ[(erD-m(fmH;7##+o&N1CJPA@=NA,q-&#i@X2k\\\[G5+5c!`Jdq`U?ugb*ODc]29+ER\E"7B`W[&bA>/hYc
%q)%-.hmHbdiHbaRP)l:JFLB"IF8f;)k.qtf]/:r4FKKHNqrZVW"V9cY1u"+-M'_WAhq[[>`\Zq)e6r%:YO?Zpj-fR%dSds([d^'B
%T=CDWrUmPA%[QM-8,_aK_[Wd;+*M>i^Iaq*7+pA!Sibj1C"(_#b8CeO#9Js5.5&\R?*)@B>p#uohCR;HSN*t%:S$_JS58\NP(s"0
%#/@tP$A\%K3:1mCSQciQOO!:H]a?.DW,N^"dG#?n2_"+NUS*r%E3.uFLVillL%YBNH@*Nol3+g\_//O6Qu>^_G:"knb'L\2/g9OL
%2o.3%GJ#HbL*=.&^i!0)>K53"9lYOt`Fi4;I"cK/kc-06@csd(#lY1Xf..!;b-_M*FhKY[.fqt@!T7_g8d#.&b(U*/i`YM,KXdf(
%dT$RSd$d7q*RY(=On-!1TL-36OEB`d"ejX>ZT0$Zq157XhomPRgg3NafTc&G!@-0ID^CN$]%BIST%_/JAbGOa)+Y2pW2o]DbhI4B
%o8eG#&XhO=pl)mFN4SIkql1I)ADPagWY[Y.gjsLL!.*>Z=--El]FH5;=PiVF.-kYG`.lf$^S'TT`i._9E;8s\Pl'F&PcE?2"@^(d
%(SqC9d&U&^R55N]]K8QoPIX?]K3Xa0.!IClh(tD5$WBMYED3Q`bg1?_cOE&spfH#(1S8o0n@?Bu"s7ULDoiDnZ4-sMiTDOo7^m`J
%kCEd4k<8SsA(,l6$Htbt`2:Vq_eXA;(\G()FJOQLHpJSE/NUhRci]lek8hpuD:-+HLN\bpZrrXJCs_qgd(Wo8Q>hVF"7fS21_2ut
%<EjTEhlPboK6u=.G8bU\a18(FWt3I+Rh+-F*g1KWGOaWaXu?RgHbU3\Y6X%cBMbbo;6A^7D/&=Z$&65r]RrU=>H^#r2/.<9"XL!3
%lm9W\<fV3[#[.@$eec9pS;]c0ih2T-5[;O$8=2n)GRQP&?o\_/3N#EjTd*Y[a[e7a;8)o@`>ng)_:6oRM`J?5okDC8>&dPcdSj$u
%L];HcWP+\h+((b0koRf<TnT`FSRX0]EtMosN,cRp&MI$:H8B%jGZ3.D4.5dq;DJK\7lk_sd\1J7#?/b2hf(CV'Pu_)437;O;#*Im
%>kZS4FfAsha8U&KQ?W\:D@WBZ<`7c"b`LG)cFKO%PgtI.!o(*4S@H/nXYuWXHJ(kp4f>ER;cY!M"NP2%l7j/61ZBk(oUI1q1)1Ie
%:Tg3QOIot"+6!7<l:L74kr\)Lnq1QccSI.R!?i((O\q!^mg'[13-#41acf@V#7MIaoeZ(cK^F%sdc3(DnSZW4oD#,&R(mm8F`*Cg
%IEoI]Z`[f`F\TA@l.3$uebVG,=ngOa%"Wbi=WN[*hd\]iLMJ^*C+QmoY&VG:i?GV<X9(#MN(`=@mnCSeEf\D\iBi>[o`]"*)X$i)
%B@Po\#+W&Z'6T"-,HgVr*QRX+4`D)'VW_U(k(NVWO58C!0%"LATC-(K].!u6jO2pqf+9!a`EM67bQJ!Z5?a*.IM[oBB4\s:HL&ES
%4+HU%;`JLSYKD)O0,F!2H+*4JcJ=0foUa.M&2r*p6V`tsilERuZ^o3heW2FFg4nA^j:prnUE#\JL^m*c:9XYl[nuei=q:(O[**IH
%K`D\m]!+HJeTcr(Hs,2Ich@(t[dBVRGV5B:dCh$agU,QVkiRmoZOK[a#h+!eZM"%ZO6L!B#833N9duR[R',E.[eneAZFq\uIH-2k
%dR&?I`(LY:/a#"dd-^#*FMZTG/Uu%TcB,1^A<emZJ\IdW`q5XL04U8%l_MWu[E=khmae_H1,pQb[>8\VbB8EZh<^?fKR6YLg;R75
%Qr6JDSXA6niO?kfC\_Sm6b+GnEO<dHBB_1p8&iiWZ.:G-7'Ac?QQF;7LI\PboPh@/j80;MDF;'2`127Ha9.U5GuQif^KA%Xq[5pI
%CR2S%M//Ebl6'[J!gZt\=/0#s'%J*uNIoY.6E0`j#2*])RV%+b'U;-28]9@L2DUIu1lFbS0Z8\p&O8lr,n5u+Ld&U?5"!@,E-`;;
%UL(m,=Q1.1T^nqL=*uac2';=.XH5t8WN,R9XqC>7pcf.KAp)#a^811@9@tb,$LE[$4aC8_6%YjYNPu>+fNq%r(%$.s2if":aR5OM
%%h._7p,RELf?kZr$XC$ZR=UB"#-X8Z;5)Ym2LWdA1:-ppZT8rc6Xq]!cNhaAh5mnZXFKB-DLE5E#N_2RH.8+f3n(V/\,+RP6U=30
%*M!%Y);:^^,I:tl9](E#SB<0%"XU"tS)-LGI<`oBX:P93^:PtPno[W_4cZY-,:dB,6>pq5*;V[cA`[<OR@S0O,`k5P8Y;QL]2$ep
%3[#San/_,Km2oJ9eoCB'U[4%1giG3^!VhGfn[E(NaH-AVQO_Rir-QC(&jrNes1NI&FkhGi!?m<K"?ZeGSf=Ii*t4:<'ehg0JkgMb
%Utc:&+o\Fk`Z?RtdK24b#T>0=VI$eAml7R9[[eAh`X:##1Vhs&9B54MCtG'I&61a'ik3;;72:6%cNGS34nW]4!70)n@Dkp3<1Up[
%X1)e2=&n/-l*N7DDMf;qkHS$C@1?@+#&QGN*f)L4;Yt0qYPh.cjX8^[IN7UY>l-)(50L@[Ep^2<q^g?J&\2V?Oe*NiMehh8]CP;o
%H1nC'HWQfP/'m(;5GEA`)%6.s"ae7@*GapX$hfM_HcCZ.JH^C\:jJ'tH&b^HN_k"]:jJ'tH";TNZV0B4-1[Q:iQIJKHjJ'o&>&J:
%4Qf)qqWV?a5(nF]US32:Pk_(>*X:q+LEl\+U>br>rio=KO2lXY4iis/Y+k]Z5pdi1')b3L#tpKMOMe>'Ut\:<p5n$_D[G';mEXGb
%-rXX8@7p*KR<b:G=&A>.r-mo=rD4S?J$DKSAg8Dbl"WBE?LC@P#A)+3@ZETampGhfFh]$NAa])8(]7l,N3S>FN\5g$2/)gdis3[A
%PL4l'$*8X-?A7(u^k61IBdPY/=@`>JVk7caVAjGc?Kg*DEj4Or)[T<pX1b_X!_;Z$3ThR@O"M3/(S59dCl!r%VI\2$j:[Vs*hp-n
%2Hg^)j_LRqr3B;7@K"P1,j.9XDfJF,Qjg4Q5kg.<(NLt:VoMB:T>jBE0-P=[#DjD(UR(9]!GrH[LT"m*+="cE)AL8Ki#+d86:aQW
%a^U"d3A/ZeM,&tN>c-OJ<RtZ)#E#X'Zo3s<`mNeuD2tCAEC-%OQH-i83*@=nqr;@@*,UeO"J]R"2+41L\6C.I>NBIW*:8l@7FFk!
%ajDZ=L<3K-ATG.PhHf#_CD9pE!aD-L>F)GEN'rDqH#<d,,dT!4Tj&`Tbk!=n87ktkd!C^6.pC3',)>fL&\bWDBsB54>`3`M2;:T[
%bc;$T;_u_nG/hMX/9<F%B:O*#9KS`8FlLC<]UjD;q`C?qYs[R<Rpl04*5,VX@[*/n+GT.8dE:\*U,_Vo/"ThqZO>+FHIiMrl\=P%
%n6`JBj_.fc>rc;'pWbRqLp6Of(2ncj@IY29GO`>,`HP/&C+G2MJXm(((RsT2]q<99ct:nfQ56C8H;f`;JXd,-?BBS0Z[4q*CkHpG
%OJ>*"[l>>hfbKj+lu1\<j*pB#\F\Y(JNNm[&AVp"+W)2Al^60"3iBN2bisSIe(d"HFMH+8DB3f0?Y@]e1Wr]W/gqU6>Z:1fbL.^G
%</SYlE'WkOl`"%)3V^cp?1sM\SgK`T?)baP=(_ETS/Yl,:iqOS2o&sVm!8ZpF]t`c4pl*R!9J1Xab(`b;U!,qoPcheA'U*AH(^O1
%ncK@a_Iaj3dHl0mNr!G5Y+'%bW7g*<7UOF(Xgs(2D/Su0S+YlBijS*3)fa\uSSN!Vo&(@-if*W_O=Q*V3TJpQjO,3Lc8?Z"i7KK'
%81#%"K4,:O_io3$qeY[sHFcCTcSaS@;q^77:7m3[E^86;8,&'3E=ApepBLR]GN]FG7EicZg'LN^&pQ=,U*+29Z"JDia21"?0K\F^
%3R8dg[Njm2IZL8lMUR2nbjfA9rB&bpQ/hBpVap(>Jr:^TFp!3=.aKh(cOCqBBTA>1/'!^KUSlr<T-NOid0"h&$[<L)\A:Cj`>f$j
%Y0/Qi8>C;$-*'Dl^3a8*WL/=dhqB$V/`BjWqJ0':*fAK.(pA!3B#jPJSXjd<,Bbb1eEht[9\@S<,C._Be*lerH2%M,,!d1a5n;'s
%7td`aF)a1lk6q5N2u"KMi,lW7\(0<VAK0<Tp?=1!k2^Qr/S:'RJm03FlTbL]U>.9bE2u?;'n'IJi<Y2?'+U?@s"OX/m$2_!$&0;B
%GH:Gl<P+jVDclCq.RFYY?.CV5&X:hGaspg3"'Y6hFk*Xo(=cA]:Gn).A0hu$m2][ODceq5]elcZ)H76TXEoc(H".P(>nn?M'[>tZ
%I_7(8pf:g,=,JEKMAusmnNg2Q5^0e]YB:j#S^XN(W"Z.m"[EdbN/D4IV5^9[(p=bnJjf$_3DTtf2s1H-VoUm\*'ra%3QIX7kaWj[
%Qu`D$;rep>fUb3\$+(Qag[#J*Ert:p*5&ObldZTWnTeeXo.\tp4LDA=(iF^Bg:3\I!YZ;UQhW;S?Tn;!l39q&2n1^[7Ud\YM0QiN
%5(Yo]<rAJ?Vph?=/Z;H=4eC^N'@3'@4mu3d']5g55K2Y7I^8Aj'44ns;FV[=h.7pNE,gbmkH+R+DD4?@:;*FYLZ[>'JO:k%]p1<j
%2W@Tdl5\))#H2=[M.*RAj%0(^(c$ekXJ.XCA?OoVblmtb+eLR;F%1B!Ls?=IBdQ\gQ83%Q@6WH/6[>mq(pn[o2`tObZ_s9?S^3E\
%6Z'RRG6"$hJ.'\LNdOJX8"0Ml;qhql!dSSq^m0>\Co;uBHTcG1"(^T]-dTb+`d!nfGnbFb+2p1IR9V4@C<,=c8AZ[bR.j&rKZb;3
%nB+6`9?>7h)[ciI:N7ukR$*hOh49CKBno>U+8+ua]Q\hNH05EKU+XicR?\M;:jhRT4P#:?$BM.kCI5Y8e_PNbO>jdpY1/@m5NW0_
%G0WI]X#0pIMRsC8^h`*q1qt=qT!jm^#M.h@EunM791_>65-X3'5$Io!95PIMleUnU?5hE!>@'c\h@83././g.elEJu6(A*e(.;::
%A3l/#+Vmgr&n&gTG9\iF,.`Zi3f:%P)<]45BH>(C4a`Y'YBrO0%,pi37N(_EJk5-n'YtbXF?O5iV?lfbct?)"22"jnH$A5baY?tQ
%n44]%&o*,>8K"(kKO5mUdM4"W5W6>2#_/[)BaJ2`CJm)6MaH7[9mSp;d"9]*U&RKHCbL&`AL_h$Y/XrGQU<u!)*P@^mM3&q]R*7*
%TKdhG@_QZ"Iq9(H]b*@/i"lBs^pS1rLMARma]HV\(06HZEYM?/74h!#@bCOl<f'UNLpu1$c3t-$+2GSGmc**?,f$JUD?fobQJNM5
%WiUuDO(.(NGc0@GeeP`W@5bKsBhOg*Yp3^K`0,p*&R,n!7*J4>'J_,Tq/RaO&19pa9\89G)NAYuSnj:;7oj5hUCg;f-*9dGQ*OUt
%=3Xb$.E?n?Nu+S+DUJf]=ZB?6O^Gh%H#E+beJ!1!6A$3pgW7n,<B:.:>;rjmM9VuTE\N[:!&rTR.`bE0$6ss)7m$=+&LFP=C#UOQ
%cQ[=iU[7T:/*/4>X-h15#4Y0marXoX3D5r'9B.U9`E]Q')qXJ3^[,s-%@8eJ4KI?pS"[ckZK=.Qr84fOLR?H,NomXnS5*Qm]0GH=
%RLaAJ/[tUDjfb]#c:\4Z'%Clh(@P)7!I:J4,:JJ3,Z7LG+heQ87S2U[*Jto6csXp2n-S"c^a"@o!-]PW"5![["C_V1^50a6m-TG5
%h;l1<J-on(qe0pBAe-678(uc5$IaW9,-(j#XmfCAaeO647fkOl>:c6)SS"4O]M^nn<6lsM#4E#+PD4\[L.kLcE_/^ECcLUA.\6*s
%i<8C;`#'XWs4g=[p9CAWa@nRd4\+erHoAV$r6-X;eS-<N0':e.O-[.[bb76`[es,_fY-b)/;J[7/Q)W/Wui(X0L'g\?0`*TM:.+N
%(XZPAN@@D>4+EChQRT@-,^Th=cjLpJPDs!sDSO3hHu?&UQS.'6l!;Oqc`_-Jo/Wu_@VbP`$stmZ>.toc%A@"Z=c`KdB+R6$MoF'r
%)/Rd[WB)[jAG,<2OXSCaS!PAYp*W*$U_+,aiuP"Qqc0He*N.NTdGe]D`aJWJ_lfnFq@8/85i=#F=a-1>Y3=%MbeUUO&=m:ia,J\7
%?ZqjmRq&>^.:/Ud^oFG6"*WARWBGZ-bk_g6^s'sH.XJdb1kBJj&=&hsF[n"_-e5(2n(,C>Uo(PF$!X`aDtfLMe8D^g<3GJ&8]O3I
%:T7(U!o2=G:$\"fqmfBAW;!+D(&)lQS9EMK-[J!9oTT\$j^Qe8mhc\JW.qm,?*gCh`eLRi4P'$>)CC"GZ*8R1J9FPCm3]Yg((\<I
%j#V%q`&o?kk0A're^]2TP'EY<T,\\`-"nej+g.KFpCMZE7e*g:M%uDY,bGl0WW5^=@jm5aN;1'7`0BFsXP6!2"oub%P[3575@$PB
%@WN?^pG7s'i0qOkCa[OgcQb$T773.WVn3p7(*h%tmQ`@GfeT_dRK7@^6S;ut7E$]g1J;*$o4jlKnf7'R#L^iJipa&Oo;+@o4Z3//
%l'`JdLTi.e"fSIK\_:<N1%=i2'I`@iM;XM7>m]^/D_&t6aL]crWodf(_BYYK$r!d1!M=E^"\K^HE`:VOAMcF1+aT&fi1b+s$?Qf)
%k@3`uLp"0%9S[`RoQ\<\oZl6("s=+6[mQV^j1`dHh`k"6X8\oYAQMW%o>r0qQZR>pq2Yo,+8Rn4Cpj>U:%DsN*08;[$5S#^)=G["
%!AUPYnGZpYiJP'<U.[IENEsP6ESB.^IK$Rcem^0FQ(hr)9[/3'LIXI"mqguoVS:Wk*0!JGY4(tSjmQF]mYfQtcC.OfS3Q>=Vlf[K
%Hp28t"%76@Tn"<;`^55B!!pH:Z*82u02bh9f$9B9l3aBSXf8NZHXuffk^h!>L-fA=_VQ/p$d@G2kVTX>a22gHR%tIZ42i7p_'CE5
%_&N*lM]L/!4?!Za^gbsk2^V82;gY-SHkta1E"cYS1;nD.h5qPN_[cs^dFbnQ#ESit:'SI)#B,?En2Dg2XhpX;<tJ*29@N8pAiCXm
%q#*KK_i)alpB?C%q*<$nGq!OD:qGI-O\/!bdMKtXr&<NkNkaV?&R?"=>f+Fp@k)/p)eNU9kAc3Q"+kLrK:K$IGBEJ',kd)O-o5oo
%[BBHL^sHOd$q7=[e&*WDN,9!&*1\0InpN4AaftA(E(HmO5.5p$_<YNUb/g?eB5I%^QouJTi\2kna4@H!nn5&Z(`R[Qfl^%0pD`0f
%.D;,-+8%n03a,RW/oqTk[<(`b.E/@uJ0u0)jdQ&#D=BfV2@28`oC(L5)B[5ReoU?R/:<.\#:2@q7W2A<f6hsHmna:YG>[q?8T)94
%7R^!SY*URI="1`2/W,>O:u&TIEAWbQ-?:u,:Ia><qV%OXQIDoRNK_IO`mqq'1K@ptXu(`"b'5)`@*(,C>gpkW&:9s(?lK5/-2]\!
%bPhquiF"\@A,-)Q8L6T+b_B)g<m32,5/*D^4T+!m+0!*49H!/$).U+60p$Jt9$4uG4Yc;j3-7hJH,E^r9(Gfj$+e;id%*0.F#PIb
%m[RjR\p4Rpj5<!T`nr4,YYuO5TD%ce($Eh\,oK:X2*t*5oH[=qU\-HQDc*jHR$QQ9@.ohr[[3*qN'DS9AL_h&Y076'G.f=d[npu2
%lg.)XEr^T,oNq7-'##f,LNk*4rS_5*],\OQH$Y+D>ID]F9=N2"Iu=c-#'Q]M5eDRFcA,R2)W!h590<>u3TlN;JBPYMF#O89_A&Z7
%%%.)4==Hh^Ffe#Bd+6E,2=?T<YJKdo@Wk<+>2)h_0da1C;d#%c(ADboMcmkg->:L4LHSrp\8u(d^E:hl0>#g9Sm7!h!6t485RJfe
%pnG#*lI)I--2tYlkJ0&r_heA:drT3(GE;@`1#?t()@c0oRkuk?1;02s@-qKM)4B7*jr6Z`.n@(-3Gum1X!`8RmkG9g/<J-9fR/a7
%#\#'6?(5s<";SUHn=j_F%jkdJ%p*;%k9q32aiO(CUg#OgHAMYifp>T'fFP/Mr;gB<QdmtX)LPTB`T//7)`k`iqq(Yep2pN[)W,N)
%6h6NJ]6*0O4RjQ8HfmX8r3s2Mr=2/>Me6!7+_`S?Ab]IU^7g>E[#<t`;=h2hCsQ5N_l)=m4sI*`s2`m&+<J)sOhU3tPC@M"UXo8g
%Xn@t(4>,+MRYNL35'FVYp[cU()R9;aFg:<qfkr_i2R*k;E,O1YV^?lB%!AITq0M89=3W_=juESV-Zge=;t9oc^"A]E3p>Whmigg#
%V3HYm/:@dbY+;+k+L>;P]SGQ"FU8qt(%ITZp4.''Ii,,)hEuC+=NiAt_ePC%QJlj:qBbNUnBZFGC&Dj-V*T:RNBE]"U7V/OQj20/
%;bb4Ns7?'JBasKT7aP@.41$X3<CY"^]GW=k;%(!<f?nPK%UY1#\ai4#NhRts<&.pnLsaY+0>3dW7d7aZHo4OO\J`BMeL9a!DoADr
%,P]/"UpFEO1oI+AkcT:tk>a`q)=?k:X=IPXAh?658plUXQn:dKY1,/C(r@a)l^Xkq:-H-[r]5Ls):4Bgk-:7ui>pNP7:lBQbs]4%
%+#[Ia&+SjAruu`EY82aV\23,c8aQP_aOCoO7Np@'N58&%+I8dYch!d*r(V]]VR+B3l71(rAaAbuF&MD'SMG?^Pc9:\"Yp7%<\gS'
%!7+CrYuQ^q2\1J%AUk'm;uhj0\aj]dl/B`sbiV_ER,o&PEYjBqe"%Bh4b6pXf!$R]hXg[aG6g(@jaKjK(l=T^L9j\JT0/@F.1\J\
%bj(hIl,K>SR3>YB+XK3\;=K8Jck^ifbYbmh(bnjbE\M!S=oB"FnGO<oqu%saK*pG.69!`X,MTiLoTM4i5QT@T5Z3KUOjAEY8eS=`
%3c063TCjec#L`+1eNX;8":+AW7d^lM4%-@#6D3F6h[o<>!e6-km6Fm.<66ljdVp#T6eRf8Q/#$$H&5#afI\sNm\lQ%H=BcJ>$XWs
%Xe1f0FNm@mjp5@=[j22@Yf,TC-SC=+\>F;(gcP*f:4VL@-F$4'-Pg+&fih!:=PsT$EIVa-H.9/'p-$*]O8HL91@_XhP?>[?m/)kQ
%Z'HS'3F]M,P@TLkUGlQG\<V)Ihe]b)cKS/DblaQjmA7B7f$U02[u/tV>DDQIIb?m1Cu"R):;0k&SSF12BC?$Ym++NcHYK&GBR;kg
%^9;_Reo#oE/'k=XlG=R3\ITDIl'`VOn&%oX,K623,<i)oV`k%7i-p=AA.sfg:#q>@M*s#<>"Xmtkn3.]BaPHFgk^Q_,uroQ'dQUE
%72Q_l.=8Na90"t`WYJ@4dAR)&)]15/?/oZOB-NQ?Jha;3LCooF=C`4RlW1lE(Sf.\A]k^mR7-'!%WK+^B?i9lG(N;@:f9*nH9N$;
%H;lq1,r7BYA0bsCme5fES>8.Ua?QAKGDgaF_R[W*8=T26@_QZ"J!pQ`6KBrS^^R7b7>Dpd7+ocC&6a0'GC##R-=?>DVBHaQ8*'jQ
%R#MN<M8:1F!as8C7S^79;01!:)9R2ln&SHR7I$6[2/<[SaaYU.p_nW:6i'`^n9mMdpcGh(6Pe-$9kAE0-Qk9_AJ1?PU+E7L+joU;
%46kOJ*):9KLs/?5*u4`Gg#(?Q2qku+W8o%U[3#eY1;aho%pWrE5[e8>G-@'S6@!G[8\5iODc,*L\X=n9lE))51K+diStB0W*s0BV
%gFj(E0/@-(4D_`""/Zt(82to[r.3XYUT'aeQW#X]Y4E_.CoTEm2V%\I2Ut/t&!,j8S5UJt9ub*2q%!.?WXc!<bmBdJ\#RN3jG)g(
%]S<=31-Cf*n5#>[nA-r`k/hmTru)e<3BLA_"jK0+1ff3?*k/Lf%i1Q!O(B\#pVCM3k.Y8=2k<a$PBUHFQKsEF/k)u,b%q9=HCa\U
%V6iK.X^!If^8QaJO8"N]PVT(NR=]qb-.M7$A_(,PKMi<sEfY)_V%6qJGW[6tF\D?oU!G)U/t9bpbE!.aeN!.\^0Do+G7[)VN6jC@
%k/b(!hD=uS:i,1)TDm4c,Vg9V_if+2E[+W"[[lj*Eb;nn?1)UFRI5!s_]A/Jm=r!5`6(%BMMu`#orW^6DpdAk;nfhcgl)Bh*=eTZ
%)tRl)c>lJ/BU;/?ls@!#)/QMf1>'A%I(FuY""78!;L0aNdYLYcd0KjH^oXaEN%L.`;3+A4FMN$:p<@*JP^';BG#1G!SgKif"$W4[
%CSD'Qa%Ef\eJ-s(-4#NC7k,itbY?.h8%^a@Ga?e2*UDCX?Z>oCCkT!@p$or'5J@$bq<`rU?G%-#`UOK$=5Ul%$N9)_e+_bumanX+
%It%"R6U)XJnrkE3>daV1pO>!V\$B8#i6VaZB`IjWgFrT5OoF_l>l=0P?iJ)dnMShp#P5g!RP3\iBTg1X,l>2uhe9"a99ANGo#mH6
%jNH9,.jRaqHaNeIL\AU"2q04%nb]SOKhON>hqWJ2AQrpVaPkRVj`pmF-AdsFHe;XdcTMh<\]i6[LR5Z."sWu?aLfUsF`R_q=WQi-
%U".Dj[0B]T9m*RBfDPa80&Z5?@Hp4[*hXHnDo]]S0=rr;h5+EZHL#$T'h5A5/9;>4870]VD<.RJgA/pfmN:Rgk]MXmPI`uGBln\D
%L3`!r>u0+4q5sH?;_NUtPDfJ?hqE"Y9&$YCf'#Io(TA41Hstj<Leh?oNGU6`NC/u>)qu(8A^jhM]6#4MJc'O8VtMR=ID\^+IS8pd
%b2WAsnMttCZkOHPKNe@1f(L&s[gcP]+[^=Y%FPkB>%:3AFZg9dh"as4kQ"YUJXFVlBLaPRP+6C&%(7aZ7Wt,X[m3sJQrA>8d->1[
%$PI.H1.(Q27Z26A>2mTiAaf^a0XkpW4pSGAp\UgP@+@\[dCN#TBe,kIj)*nc!M]";FuEb&gGd[(`$QG]qj5f%X!oh9*!;PqnbX+n
%'5Ac"]<qRG]!1aHp/!]Ef%0oZ%jR>INE!p@qQPOZ&2.>3Q<r_C>G3OVS>"?-?,:B)<&$Ck?YV7QYP<>]TZ3.?Jt'Q.YC`ZM^qQ\h
%YS;;d4+XW+J+V9@]))'pp?h1lDa/\qp#uu'5Ad2<^HhP*oB@V=s62J7)diU,ilB[&=0Gt\s8F*(IXVHCIrb(/[@7,>q]Ci.qhc"+
%1`e<@FVRs_OEkt*Ebn5p:.:D$cp"E<TY'+dU4[%(52MS<H%$+e7BRSWP*M9c.1AVr%_NF9kh>r[95>l_6^o!-A-[t]>2?%j3a)sZ
%n7ts:W<%fq6=O.L\KGmc:S7pGp\<aI?!d^,TJ=2.>nGC9gk3'%14DPoi6J3o%2?Q&RZ,a^,h?f7doHn-[GKpVF)?VA>5!q//Wk75
%"%ZZ'6j==^"VD[]p,p=%$4ZbVY5=YTdNRQ)fX=?"LV6GLK',c,S2N!>fPE:iD##C`nIfc0?jVP^K8`(MU5e>*g>WM$38@dC8![9C
%<JaEo3GF>t&PpWS]t-ehNX!7Q-.#h2?b]]jH2C9B/'^_b\ghaT4q>2mg=N_q7`8DEK&``55^VaaZ6<b6F-6MQT-?4ud,69RegV!3
%EJ<$,=3<7kMZ@FI4M?`nAaQ4G"b9ge9a&aFBQME</7&*!^[W8sr&Z+6-HX\8^l-[Y?*r#><47dYRX.@T>68]?G4N$W=eakmUZYk3
%Rf,LK7b_ef6B$VTD(qden"g,'k^:a$"mTpaXc?S=?<-7k#agNt!AGj8T^A7_GrIQkc>`ro#etC?#+hY<H/sPORQnW$+,*s=#hj5u
%S%)Z[\A2UYGWIS;'ABrh"(=cM+OfL/a2S=>,AbEY21Irs;-jH$]n"&PmIVq,$,4)sIgi]8RUlm?f8]9^FdV^TAK[TFMMdK?f$1u<
%Z[@AdV7p(;fK]QIR@M7(7]bo]@q@:@$0S=m#uEOJIDXLnoBeBB$Vj#5B*_`E5#J[gN<?ZMlsb/d]\_NgmoH_/b!BC(oYlKc=MC00
%eWfAH=6-ZM[K\MVKr0>/ZIP6r8m<uL+ElK/iV,.=%5i1&QRahI0MUt;P<CLb2&T/li&B`IB/F<I*[-T(%-6rD"*s7k5TW.fPG`ES
%NX6-FpV^h$_J?H'5VmK*Qn9Gs"W8&mRgRpPr;5#TEPL+Hk\1>5;Zduj:6b:4KbBgY[%;Oc]=LMpkC:,?!tW<HhXEKY6tokPZ";DH
%!O=oh>I\mFOse&<fZeZJK<fK`pZ$H"iP7\u(pQe^gMc-fYTEPDs4\&!8ma\QWK"f6#NHA`T)UB[H._cD;8?bTm9OXLqdp_;^>_'r
%\2,hN07N_Ne]P6]NRKcPUI6/`[K2RFSbdB(K(')6i.93k./N"[9r2:[2*Iu(gZ)eP#oKM_'NBga)-QOC@%0CliKM`LfK<)U5NVeR
%4I[!AGlZVWldMYl_(W.W[m3\]k(VfiXR.@)3ms6&OIKbi@@,D5c.%Oo.IH5G:O(??e?trg;\lc=+W2i14=rQRO\VEX?66])e;4@a
%D^)a#<UVm(fVG+-lOMTP2`@rf-V*GI1uV#iYr"7)7(jOrhQ$(t"AM_`8Xq4nZ1OGW'cDdl\OK8N)i6MS;.fBFnCp",667%JOdl,)
%P53i6S],RJ:+[9oZgmkl;f?M>MN+1'[@-3qX5^o5R`H&MV4Sp74@%aSXjrr_db:8,h3hTOMOS*k-pX$h1%M]Y7WMufZ3X(E]Ne@A
%8p#bg"r\CjBf0m!"<4P%9p^$*9;b35d'a;iW9]QfQeQ\'$@-h=mk":*mBJ\o\"EKQ*#Xpq_-7B@c1,N$XI@%Bm(eM6+2lES.s5K>
%G3<g#hd?/k[X\">a^T,$fP2a,?>ClS?>1`Q?>1`Q?>1`Q?@>;lkk?nI+g3^9+g3^9+g3^9+g3^9-Ef:jeX3;_r)r+[b7M5O`RVG1
%aDM/6#NI[rMVg+CUFNe(iJ'i5OS/DOLHF-5'5nKhp#6DdI['+%o#hcY]aeS\Q`ERcOL5[f[r]RODct!W!pos1\H1*<ZII.`g<#Cc
%s"9DC3mR.YhLF')4m7kF+QGa-h1i"pr>6i>?%1-+bjP?C\c!<8MC#GT@Dat#j(it]!AZh<gXRAsalDu%<=)qH/%VP-D&shco*:Z+
%pu.bo+(hs0-k;3h[`.WH2Z4i1\/G/5'=QdJ'RY"F@#=8YC?tqgT3k7(;n!S/G'_aZgqHo]$m%QN@-nEJm]0uid-c((`.ibd]?OQp
%23XRj8h8OoBLib@H%k)!i+e$ir2VVt@Cg8*1[kg.`G*LhcF%Y;1#!rR2L1mHVU.*+[fJ\>A2iR`<VB00+AZ3ak7`%EA5sRR^NJ98
%E&"sNo;Ae(XlKRGG4XPY:DosR7!ILr-4dt?](G'd?B^ohHr.Bk78#;UZT__hp.Pl<N^U:qO=P1LgWoO+=LeeBad?a!%*o=7?a_g4
%0BPb&AR2TGFb#=u5k"&9[sqF_.DCZi:56R1*ne9[L(/QM%;o55RL<snqVE4iVur[l^eg#c\hj6hVJ:<YG8J&,Z+QA[e.cU@B;Z6b
%YXBfR[30YHn,]*H0,HmZb`)ZR+R[S*CNFGqGNXHgXaC.800E:Z"(YF%@QX7!3(rId=1ae9Jk%R5s-,&-7LkNfOUZ=CX/1J/$39Y8
%3,(U^,:fdsn#0p(i=urd$>f56ZDW/kDXa`oJ=%K()Y/)ZIY71oJ=gZ#>T;3"_PG#]dnY'(!"4<j"WRVe/Rg@G/@rJrWp'M@7$t'a
%^_R(4!86*LFU@mE%1mO\C:5uG*t0Z^)?B;Fi<CEo1'>%&'D@8rBuC#:'lApc3!'H1J8._42Mq2\6HBq3VpS(QhA01;GY9:b(a*r,
%Q3Nl`lR9.KA1qK?aGB'8_QBP,N/8k&R-/42!sCBp$''T&jsiMbJDDDY[=qsfi*<)_l6U!1j;p!]%>[%NYmAT07Ouo]P39MO$o,ne
%`s#L<W\h#qi7:YGU#V/J6F'0*g@kB]'99h9X$A"*8-.e9QNeqG!<>b)1_5CB]%'$G!`'NMN^,LS!?qr2-G1lhg9iLA-VFP]VURl@
%FSZ<hd22kG:#c3VM:qs5Xk#).QV.FP!*R4.D8]DM!E;%7=KCJ)M"!E>+LX]f%4ir,!tf@E9MA2pJ2ZK-h)MAthtEC1!oU8$DJC@3
%>p6R^TP8*"5r^.f=rqTmn4Z6Si!hUV;[Ln.U"rZ`5nW6*EYHtrG:d7j;?]m[eHV1a07`9gf+%6!9.'NI\A,Db)[ZHUe:8?=nm6M7
%ik77=k''[t"al5:(c!:]Aq5_?0,%XR"j4K<aGm+@m+,(E%s=#fD3B&&#&NMP)!,N`i;_mX(rWn6M`&YAGlmLf9fsh15/AUYf8U2)
%'uDF.=3Y`IiD/I1!Fh0E^lq<\Y?p?!JsEUDDdQ_YXp#pg&Hhp3!&_/<EX^$4i@bbl<$TCrrMG,mG46;5dQ24F6A]sIUacgQla[7O
%O^h%W_k<&K2%X.2A]!X:6"5peDs\_XaF(Hu<U7!mn+F0seoBLm+D)Kn-)0Hf6o]"YJ\!hs2^NM#ign:[NF%FW$gXb(NW>KlfL_Ic
%bVL$";_h8s@TuKCpfM7'D8@cG7Gh?XWo^lB$faf'aa#_ON3.h#EcSMg=S,(SQZkI,ZN2L9=YPeW>gg^.6,/Z)I?hd.7SG",h)!:Q
%!8EJm"76abhl'RVN3@p*"JX?s'A>5<B<I_,N_G+hI=^$0l[l9B67"O!gVMZ1J-1I2#)G2g].Rb!EUe04JUf.]BL67-4C8nmg;#tg
%V32D0Mh"(,&BU#f_]W2d!57&Y#7qgO!YK^\]%%?qaN%>7-*mj&_JS>`%ZI!8(hu?B/IMIbbB/2)")'Qc`<%"<-'Mhu,)>51h=@sG
%>omir2ljkpQenuXMoZ*Ei^86HLr1\`!RWg)8Alb)@gSn!K!ntu=2e*r)$HoeehneTlV7+tX'<9]=-F@Tf7gh4ARq;nmsH,3,gclX
%kaCT.8-6*l>T4R/G&uK@o>SfG7]^p]TEA-H76!9/"4)V`l'*Q)--cbJC2]$#We/q.Eli=b(_IAVM*r&3Lr^^cP.GiVW*-hNO$t8d
%K0;1qV,=FJPg2sQ,j<*j/*WHeA8H!)#"D"YVb_75_?[BLm^=Kf?j"AqFBOQY`Q=5d:1+>VEAHM+lW+9&EtVP1"*";b)FPMW':X_V
%7$)Fi)b="3"REg^<kT5O-!"D`3u_^IC@hdnn]]tT28Gr+Kd=@k!/oJFT5^ai"VGW<f<%.</E?l;pr'ucOQ.C=8L'0Lq:qs#Uu8)h
%0:+/2QRZ7S=N1sUmhUXa+[BBQ5WOT\`^5@'H;%k3Vh#\;Yd:q)[Vt/.Q=C-L3NgOT>S]mBM3dj$L=?8r)h>G*-8W.<Lb\DB9'ZNl
%)afo48:Uh>]nfoEMF-Ar(T2$m<4rJ$+9LBX9oB.R5a4pHdTOa6!:`mo7j[C0>HP1oWfnQj7`Mi2m8=W26rjVdL<uS)QmhN#-7asA
%@>S@mdP>7b>rrZck.5q85u*+"KEejsMD89+XDH3qfjG<,QZA=>3GouF-WOqZ@ZonoX&H?*[DbgoC$KL-J]Alh;SG#m<*;Y7AXN+j
%c'M*ujdNHsYdASZ&=oo^`V]X;_IS#n>G#_p@3nbjLhQc;![Ert>K3%@dJ38-.-_U:SEodPg9QT)NL[)kHa3nr&R">9+/#L&81<7c
%!s2eCrDL*2OM0ujeFR$TS.J2ga;>J.d4NfN;'9p6)=Jgp2DHfTa@`CqK4"rKJRe'TaXZ4\756\U#2'Qu*=ppnAoYK0Jl=:m8bJ0W
%9@04D]_&6==klZ4DNu46@muI^Eilu?"#FK>o_?cLVhC0)*J^\OT(f5s_;\cH0[,5#/<\Pb7LZlg((e?]JY3>qa2&@mj:^Nb4PCq#
%b>(G@.H+m)+bPbjku<>g2O<BX4kGKj2rZ#o4Z$!s8?!RAM,A67\2]SR&UfoJK5-)si$h2'f*9:(J[NLY]UO^7MU7fEmQ-G;WuQZ&
%5sT>oncd5]J`nV6JP.332fb+;jEWr?+l\NiD)b!5Ell/+ZuW#I3E7(NM's%__Q6BCP`#B`a\5+ZcEFN[)mE=2I$RqT0ei/MPE&DV
%>XY9b?=W[O:eR)j17=J&/l@o^RT3[%<13?LM0S4rdB_j=:?s)kUToJs-I>TnEJ%$=PfUOt(lN>iT4Qd.[OCeOjUV%hFsT?pa\2lV
%Y-.(fkneAenD^0PfgAHCXuIqm6P>FP;=/p1q^UVm*$#ql_FlAL[.sJ?Co=l7rH;H;gaE7dZ>/;_ltelNj*?bM-O,W$KK%4>#Pt&]
%@Kgs+2dg>_Yo(R\#INV;B545P_HSm,A2;k2",S8+TEe&g_J=F8d,+>Zm(U+4]F9;mM[6ME-<0J#h8mFU\=`k[L_@u>/;e7-5ZC=d
%/@N#,<5g85Wd6&OL+&U=VIAJ8^=_Xp0Y+50]nh$P4$BP=VXo6jk[>/T&Y0_JCDBmSXnkr:-0R)$chf3_)I'Y$(`2]fPRr2B,&un!
%!:N]A%jrsD-cdac;<6B]/7OU`767*>'FK-6!SrIP?_@KM#`E8NeV!/Ko"`J*.#&u_6)]@](5eG]80ji1d0Dh`GeO9QL.,A<^->tX
%ofH3^)_jb6F.U'0*ph]+Dq8>Y'2oeC-b!9SN!l9W5\-"-fqpZ8Qb$@jJPJ.1E/Sn_$'4Mo\4.7l>?6A%oN!:.^h/s'`"gDO<VmUY
%4ZqF+U^'JP?T]"t<F/'gjI4L^\'\3sM""<`/Di1G;0"m<H[gsrpqneC]muHD]WUB@F!eQ+*S/Vt=re3o+IL9f6OePn8GI`am#<Do
%JCZ3*Ji7);Mb&h.Uer6^=lO+'V(_/S_dP9O*Nc>2&qu.g5O-mqq_8O-/$9h*=+"eCm'YY%Tnuh2PM.B>3?b?W9IU(RJLh8'q\3ZP
%'513:k=!WE.Lpb9,),hPW@<S5Y1`Y6W#mEJbN"31+3(afI3+!dF'rGjWal63&cshH-i)1`%gjc^r36s=mHYnAUMGu1W8o:).A5'T
%4%#b[!]!tq)c7S_TI5OX*T1*B@;06qJsrYEmn-I2XBBBB?50?b:.E"^+\!eE+=8gsAFagCd:l,J('F+?<]]_L(U[Bi/ulSB+Y4'*
%=*W!!Bu^eoD@i]N@b6oG?j_qjc/VDI%B;JJe-O>EU0hF8eGY)Dot6O!n4&Ail2a5SMu`ZPF:ehW%\P5lT'JYYi5V#_#<n7N>1(:k
%ZK<9,QqZXZd"j<t_1M+P)fEG+W@JCa&^gU'bF<=55ZC_m:E+!j-JA-`cmAI<SZpSQc/gXbR"U$^#9QUh%hm;i,7CBDmt:Z\>dcf8
%4)n!&=\S4+d2SYJ5`EVW'N9B(MSYWI1jY`661bVfp4o^Z\;YTEU(&1`A/R4=&sWU;=m31!E.'C_Me$29.%qWTE.4$J.!GqS)oXK<
%%4"dV)W,L=f38hk6m.0fHkL!`/HLiim",BL3`Q6+531(OlqqN9S73C#5oSs=C9BiA?ulf/,>s.50mPda1Me1J5Xb!'LfI`'XTM9L
%B4ClBp"]]fAM>/CW>S.ZeG`OW[?<ODSfY=WP:1ZbW]DJ^*SN\7M?C-+\,uFkN;hXF%r\N.L.))s[+hB]EKpht"-4(YI$DPs-orI_
%fBCK<a'2oaf^'85&@(AlRVhEIb#ph8R%m,7<r!U`OH!ACL`6@K'A,QTL,2hGm]CBT`>SNfZm.jg)8:Sep#:n.]JQ;3cn-N=IRJu@
%NcHK2TnkkQWnGhD,$sdjqhqt#*3GQ1V3nc+p)mbmNiU;0'H[odZa'X/(HqIK,\c<UOXM.bofM8Dr$,h*'tb:ihN0/;M_ND[*["o!
%*it2V4DM[3X#$g"!a8U[6S*H.^u"RSn''%?h2!L5b!no]D8[d#n??;d&S[n25aD:+5jWie<MF/@oC]dC%:h>@L]]Cno`c-d)DeY>
%@Z.7&7^R7E`rK06P0)-(f`aX@Emfm/X:bD=,SYYL3e^[HJXlhHo"$I?&-PlBjq7g4PN?c##4^T'F\Pbt78Ir3T07IB<?l9*H";0+
%R(M?+$`Hd3H5O?6oV+5M4<JB<JKD)@[1'bO+9u?Ka:_f7\]a9t!/U^#&G8TdGp)[ib$aN9Z5%'4_KILRWf^K[:\<q8#KGUjZmiqh
%Y7rbc:rf$_&8:otZ=^%>jM4?'\8=*o'DWU*m+Q>O@U&/\<3>lR'Jdr\8pHc,CCtuf>s7b1)XAUJcug!:QaeXlHg-08Ft@s-$*,gR
%,A0L:("0:AQu#"[U(G:E:qFCCRT1Z,W)*b1eP=%2O72Wi5qhrQG!<@6h)L4*!]Z!t@n]o?WeF>LdP97V!D/!\Z4.CuQNK_,.qhr-
%]XWlrJ\LQj70fqq&JZV^<K-3RS/-Bc+NU-e)eFt\%*am^2E^%bA,0-cX;FIp4_Wi*6jbT2`BG#,Ln.(Ucn[-Z3r#M_!3?ap-NNdV
%\Cnm^`J;_3TgnY]cqBeYIA.Rj6C'<2iX"NThB0Be:ojq&ic&hSCh"?[OW);nJOjE)&#)f'-'=!mA"2&nBJ#;37>LrI'=3t0O0&>b
%4BNl&Y0IlqEqs;5Cb?Fn6H$H;AdI4!Jdoei&a2f&q^p"`l6_;\MEMN9$Yc8Y0bA>\3AfH,]ub&nJsme2Wsa&M<"MtojFaOm(3Feb
%<F9_]56aS.WaS>VlD!KUE6+/"#=P+OZt2f2DNQLdXd/FZ5,h\=oP\tS<:q-G"/LKU[=QQGVh5l!P7/Y$]J;^TB73YT%kA)_%!%@7
%ncXe@=IOR.U*`J8<XEAY$08oN0P3/HP6Dm54=/)7&j)56HD+hK58s^fl#g"R\X?i/0:D/B3CuW`Jp,i&3J]4TEtE;><bYV>7o/a-
%"'7uAL>QA!-qm4V(dM+dYb:Z_;ecY4lo0GqX/\?TKpu+EN=3nGiFQ/o2LN#78YoM@bU<pVKdR71'sm$_3Lb+Le7%*RUe4f=e_P=6
%6d/KZ4dn?U#R6pCnka*?ODR498/Quk,*EA/S3i>0;*C:D7HXf&Wj:XYBc.m?M/?MeZ+<@d5Z4D/7DY0;&lhbNeZ,(&W(aIC8RQ5k
%U5k",FM%`]V6W#_>uYDL"&!AL.gcRV156tuGD'0Fb)sq''_2DO(3Uf;1scgDC_-_Y&4Alu8I9Jg0C6lF0-%uY;.fmH=5(l?E=+E-
%e,\PQ<&Y+Rr)b_1o?"M``7-2]@Rj,"\t!\@J.b8O<hO97OH\.<\hopnNSKS2</ZPlR.;Jm/'/5J:q)9.2n13fVO9^BOOF]K/U'H3
%A48(\n9g@0.%VoeX,npT*pG)b&1upOqtn!<2mXS+qHE0AWP_f:=WFu]Fs)Yk$SsdVZ!/:R+TOn\?@NLs\H,KA\r:foj9>adE#>OQ
%%_/GcM<)eTcRY#?\#U)]O-kNnFkD79%=jR:<^C3(7fnL:3ZB@W.R_tr"L_O3+Z!%p5Tl[*NJIe/U>SB_jrie(Y?%P(p-;%oB?a*h
%PAEZbcCq+QR5f:R"A2-$8qc/29`k>1&RuEFX]TuaU-9<4,^(Q6S$OdY$0/hT6!i_cE79>J(:+G]PC-K26b=ABl@i/hF=US>Z&Ftc
%["q,>72gb7[0lc4%&ATQf1n6,5k6)9X88P&:/27/%=[<n8cfF;USXPs$A,:X@'!MU`5EQ<<=_3s:g,o+?';!!W=6r^D(8/d@Y*R4
%+<ZuCW-V1s>I2+L;%8f"GqU=G8We1UN)$ZF!.9fE/.19pjC%':>$8Bo`SR\j?3R$lnmH2GfI\A@bo0t6\i(%c9Q/[SBetVZSWR"_
%irKuX+HW#b!R):b\r%[PBDh`W+a9k2bNoQA1TL6t'g75E8rl52)B1%iJ(O`'<ebief)(<fFBHI1*s\hZ,Zi8(7&C!^@/H/?7Gc?n
%2>SIS&'7\i_lG&9/8BE%@a"*6r=BPeY@=jB`54PA(2Jh-;U&4%/_%if9Qn(E0WZcK[eZ,k%^r_FLTod=lQB6,X%4SeE1*(M/7<Id
%gtGD!GB?G*7s&&=gZ/p+A2c#;Qmm]>8e</?$`/F<-2i'hpG1fb@sDqY/9)s#dLO4hBs^iQJt1A=%`clW]OLO]U8tTV65Or1`J!a5
%9(!TWgb]dEPYjPJSK0&DLfP`>cs%m'9HT&RS4I.d"R`CfQ;7nQd*sdHa$gu,ebYuq(SlUaD'4&I43Ks4TkgSQ8l.)d1k2K^X6`8l
%(4:mq`h![/Y=*$qf\e`,4)q^J4:JA45nRC=ga]21'DmJcc_EP`@T!G+,T$"Z1pr.l&P-q@HV]b0>YKMsL)ED(@I;9Y5%"`@_@Hd;
%!B*,r$h>^'M9RWXC]lQr7`%TgC,'q]$aMNW0De]n):2J81F^E"7cY!En1ml049-\hbLCq.1e]^(+j4S))T7AfOh:-V)(aaPi$`!4
%,@J%P$hDd9[/o6L4iTobiF1Zli%&?[23=>'5-:n''M(N$`J[n;9EaQ\EQqO--j7t?`3m1\a:_(K'UQ!OU/CHHi#XL:mQD,BD0p-*
%d]VmW?Q3SS1A`BrYZaH3"./\Dpp77e8fCjZ9S)1PR)k$'clJ<e:/^*1l3n[F"\qNA'Cu@nJX%:P%Z+j6"#g48Rt);#_Bt?ljX$+S
%G==\S>mRRRa0JSCbuX)Ehug?Nbb"*O!;HU-*3ruS!Ek7-Tk\"TFYpC6-Xon(dT8<h"uXU$6?[&=Jdql7!/TbD'=YHkgaq4_%-T!H
%idaN)OC!58G**!I?\g,#l=G5qW\1>M&-rk6%:iI4!;4>3\;gWZ)d%\E/n&`*3KcglrnW4/@Ur8r*[p#'C3Y&$52V0:V"E2g:c[3P
%\E9^jVlngJZ@Qq8S)b5N[rYqNcl@$T1:SA^JoOVG;6DbNe1V"/\>#k\5^<uuLi8prFRXBL<AnM9U?bqlJhhfU3A4C`GK8'C4ds47
%E^?M@,(uG)/>u3`B(7A!$X46TGN28VWe0mORV;q]3Tp(D*Dl!O65s5Re6Qn$I;o;iT2?)LZqtK[;S4OKqlC)$-j.7K@MafJ<0lM=
%,tbMO1.jZB4B!1aM&Lrs#6*,4Li>&=7EHIe&49gF4Kh&!\Ue#\e:?/de'R,Ui.<6-8V4C%#TN/s`oGc6D#;^lKHq`ZDO7o,HK'bh
%U_Uu2&f;]=704,_3G]ef+WMs?"ptacZrQAq^@J.9Zs_C.i^T.]Lgu6V<M)\+(o9\91iVZ0I?iadbY3'g#nqtn:d6=\H)Z\:i,;gV
%=%OMT:S(pF8F@lQ:rHl<*eYSNQW3P_.coE\T_`ZS6dTG2c%50P$OZm8Z8U,&rW;,U`>@`nLb+?If39L9p'<q/!JV;7c!aN9YdQ7H
%!uc[m#EmLr89cEn(E(3%"A,g?;8+Tt9*7o\&/IbrIur=7Tl\Y4>9r+!9$Q"+P1@Cq<6Y8:AU1OEJ4'U/KcYr!.4qiqp["f3r#()&
%$%h/l>TFGT'fpjba<KIF#rt6pRs\4p_?PlO;a%iK>=]Ma"K`4gKcCl">s./$lkYuq:"Rdi01p^1!^Qlb]Ec/DduYUSI6pJ:8Hprg
%'GohDVQd!E-6IQ!Ur/&S*t&di5WO#++r/$+$i,$^P/jgTe::QZ5S+b;U^:dfPXr[PU)^Ke0pfZ[E`(_n.d&nXL]/ge3<[Ap[i/qO
%6O98\'1GK%NMo-1dH0ekWn-o(+D64pXD%A;d"dr&a)"V]oX4u`gbh?N-raA*a#R-W3bTOn^C!rc8M.dd(\d31Ka'Rj>>3K$G+1u2
%GtA&hoEs,>4`EQ.o+M1("@^VYf(oL0]Bk&XpPWRe"EG8JN:t(;9S-PT6knrSVCckqhlc%,Xi!]&3DqKRaA.:$?Cc,)cgK5(2Xh<@
%4221A3e/4".;6,,8+\=oD:=+Vm@#G6N),S=olpX;4hq,lf\XPjG;Wi+k['=n,H$e$(rV862;Lp&#e8\38CnL5S*9/R?@P5Jd^(Fu
%-VTYsplH[2"G&G9b>d!im`?0>2N\`X&BmYl)>!a%?R'M9p["?AVIfkr<n>eU-!V>$0*%o,*M=AW4H@9Z8oR5b.KkW_PLsCE1NBXg
%rGM/j_cT5+cQJj,cfD$Di1>o>a9qK,o>&QJ7_!R[29T'ue+u4k]5(LM4!?>0,18<'6<(;Q(`dDFDSs)V"cY6sPoY2*%e)Ts*FhAt
%7j+;9(M_Jo&t5(!a@27pTY9OMDAuq.NH:%WH9Y"SIX7$hi70tSVK_E<n.<SoYO$ut-%Og[7sY';=8r8G>!\NX!-AN-=WuEP[W;m1
%F`'Rtf(Ug+gm8m3r_;.n$X#u$*>A!*o:+<I_FC!tf!lI-"L"5Dee`9Nrh;@&R*d+eb7'@bR2UtullGT*c`d\JH&LKrRQMj$qLuaY
%W5hY&64'aJAMU]PH"nF;qtFq;s,F-]*;0N;<9C'.OUjcagnG's9$`S$,q/h'V12"uq&1/>P1-gN?-*9^250AW:eltX2)J6!9sDUL
%Ai&4/RO_Xna$KmdRL((%K8,BgL:K;3&ait>J?_g/BL"PmLe5h5J`%_?j9uA\";Qh5!7Oj.*iOeD!ijW;-Oa\APaR?<]O.ucP-[./
%d,D),:bDSO^+=k>D*6'a9jh),faujB1$1odTT3qq%!%gk!`:1D6nU%:1Hlod"TeZ,P8o`>X4@Z@q$>h)lo:[f5ReNOg?#JLj&&jQ
%!=fQr#[g3oW^Rgk.#sAm:RC1O&tJK04&7_OQ2qta\rNe5=uUE$#YX3HHjOX4eX@CA9nk"rS]i`(T!e&VW_MdD==(OsQ8LL5T^WeC
%&lFH%@rek5ZrOXW2\;&$#-,lK?LUYJ"%Qn/<WtGfAgP$Ie!#X[[E'VM-B)k#k3%XRUHsWD1d;O;^lnuT=+NHL$4)O>8[qDojOlsa
%AC)h1oE.+ra@OHO'E_p`,f1@4njTZh\4dQd9dE"*RIBkRLWpHaHrp(%&5jkXNd@ta!8iP?A.d]V)`3#Hd$jUE/(Q/@"EL[[4)\[E
%S1VKJ5s\Q<&'ub%]jH[:.TbjMRlpe9j+K](b!h;J_Y4b-';Si8]O:[n?h%\g_NjUoZZ>T!UP(Eo(4\54o8Ds\b]lCkP,iP3f\Fo'
%7/G<s=fH/^=4sj4F5J*27p)(S20OY%-DFH"%:>G+I1ef.e'f^A<[@penE>Eh`-Q9n\:NrY1"XM87h_`kJ@1</s,ce>Sep`C]ZJ\Z
%&79J`(`.a>W!`$K!Rl;1YjM\OO!JASfKbI;`i,*Tdq),#.n3e(Kt+Dgn,oKfcFO'?-qTL^EjL)UNmJp*d6*l';ij8,*4hIRX<>Ad
%"]9g:;gA"\V6BNl44O<@[)aC@pQPcBX<'CokWH@NMd1,Za$to-K(fWdM%\Aj4T@8t+KHo6"<=B.1uHZE?@iqAfg]Sq>8i;hlMBQF
%O!HM#Rn+-FBURgJnjgb4E,8(*HCP&!*)elj*X$I)_):87bsNB\M'0)C0X2`fD>MtaV/e`+.*LXqh'8%.]f0%',N$CPjn<ONQ0@KZ
%:@BWi-j@.o>qSA5U*Ad!pen&hrJs!i?>iFW:]ato!p:iF>.BQ+XT6(LEOlP>+A3F).slX%5ug_b`;_AN!15CLDr\dlb)7'"aJhb(
%"1<abUKj.F-=^V?/H5a8h[.bGba6pM.E[K`NVofN!*^hB/snnT^KL*Fk5k(O\Oh;Wbb;odLm'.UK/0^YZ5A[&QHje%,$nD3E?Mn)
%O?&LD*#^lo&jlgjISj5P7a@+^bisej-Gf03%W3K5;3E?2SfFQVarK\eLI5"C::';@L!u</aIF[iW?1/c`>QaUkf/fg7LL"@fAo]#
%3Dgi9#Ct$Aluo+2q=,Z6H$-Ut*8MMWbQo<V3TGWlji2D-ZpCtD<NNe4`$l]Dhd=t,H6ru('*.8X=+(QDSr7V"3i4e\,,]",i>,*M
%B2d+bRZkehb*'\R+HTLb1ldlgG_&,:aYKbnQ3Q&^Ea;8%"ebrl7SBlo^k`.k%e3q-R@<kiUlcs4+%"Sa.t%[X(PtcW=mh=37*.tM
%_FFcDT*7Og]ir;B]Wrp,hAA6eSJb"a5R^e`OY3&`"uuE4OP)>sf!$F?L1IEBN'LpF)eB;L:'*/k(PH!a>#jYU+L!+7de!Ab.Om)J
%e&mn>%6GXgOH1r<nsQ5;Kp5Y4#dcW"e:QW]2p)M+$h\=$TW74@*'U"jZ4//GG#9+t1f.UtQpF^jLb?aa&=ATDSCBf7[hf1&ZEhSD
%RRK+%>X[##5V+Hh&tskB[s#%`6Job?jETsf:0`TNd(W\8./-BZ=nm]p+%0%+r\Pa=i+11;+'Fe],;BIFmRJ^hD3XWX+?dSr,+5rJ
%m$L8Va@-t$I0!7bLOH="Bg=#g=l%`Yl>^=&]/XIt43p_<SJkiZ.7Ck%+p0#,XAuW%"njcYrM8N-C3GnS%lOHliJ$dk46A[KF'h0c
%j@#Vo,h_oJ3L;PHJM8!^$0r?311Ui/rI2d[ZW8`(d,8GO@cgha3e@_6"4g2`1uWTrk1UuX5ZB1\c6%4'OGsYjn:/7=]9Skf*Z.s9
%(]jc&n=nSJ3pHTt*4p/dS.\9f>=bdZ`3/8.^T#s_^Hb3--:\K&WZt@Z5\%gFY%,A.l[HR13,!U_=`@HAZR13NGT+qc.O^m@6iomc
%;;N%TiCnA3]:BtE$C6c9M=+%O=f/KX0\&VQ"VJ^]2%n<#-9Yc:/f5Q4.o9,"'#;;40H7=m'IR?qe-Zo<8CWtXEE*g6;_6?!_K-</
%9[%9G<7-\g<j(^kcc-PWasUA5_t-K4<$4_g8^&<'(61eAG>[&"P9n`M&2Aj#W0TEN?Oq9H(6e=9"&:Ej6tmbpAR!ce-%rN*1D*R8
%9*5:,LZ3H?5o,T),\#&5m6N+P(ikS6hh=I85eh-6]2Z1[GFu1rkWI+AB)ES5QGJ/:7,`;u;JY>]DSi+>^fiB@1IJW`@M0u!+sRJf
%59XdIH&QI>,B<Yg6X@A^!ULb.:!+/Wa#&'(Wqb=a1=?\HP(d<i:)<*n4Bfj5DTEG`1D;(-ZOE]J,\jqd,k.K[LXi,49MeoO\kXJI
%NV1JX2Ka_@1i`7X6n%H6!K]U"/;(ngOUF/g*%4)U,ncs;7ML#)f+j-*OX6<MP]fr\dX\4uJ9,"77Cl!i2A$s66dfB-N`fW6@pQmR
%<A?4adZGf5U(C\<cm5pK<-Jn`)2gQg0c!P(E7.#!Yc`haU!R9_"#6*u..&eP@]mo5D=G*8LG=#cmu]#%>:"4e=;MH")V_"K)i,78
%O[YqZTB.A('S&oGQ)'Njq<K@O3[[r;PXU,/'.jF9#6cHfi(9\i(F_/"MKX:mEibDjaU3@n+%OJ@kZs%=>HTK%Mdh7N-7f@4WWkBn
%7IO]6HEJb8A#EBGJE"O^Lm]Z;;d5'Y\rBgn>g"SCkCMhGH`8jKad=lB?IhDfS8B#s7PS5&BJKX+E5Poo')l'hhYG-KmOW'Q*2-#:
%$7,#,l\Spf.BuEC[c94-NuM49#`HfAl3bbRFaibsaXF?U"sg`+h!C7O\j^Ylp<O**MO4U@WM[D4C')bRYU!NW:P%\J8=(\PMm/Pl
%)3:?"IDF:\mmQPj(Tj\&!N<q=kIQaI9h%R<:a]"RE$XJOI!d+nd,+N!4VDg#,<CtU1$ZgG0ISD#9uElLE3BSrH'7J=*IEDDU8*'n
%7"uG^*MjR_?,KE8)'K0:.,>\Al;/;TEImG5jT,G'SEP-P&<[?1V#`4pQ)WpAGA7*^U5sF>lLD_gn5EU9g+aYO'6/9K%4mt1*mQO\
%Zn<7&1j"Y4.Rc.^Ze$5q-ri'F6"hY+.e(<^IS2-uOM8aL-?YCFmU8lU04CS3J=1]F\q"Orm,OCJ4p,ehrs!MicA#3Xj<,u/Z6/<T
%fhN5_(?bUel\_bK^`0u#[1b97]/7mV@P1>OnC[g3AJmHrM;6:B0H`+TI+^d1C-`l[40SXS89'c)4'AZP4U`)O04r)=>F6hPkEr6R
%DKkRB<'Zh>?l3O%SE%M.cbp'>X\n@a#)X\9>r)"2UOuPe@?d,ZUk@UEA$jV[bG+6"#GNM,W;*'>lkI^4!3K0'iQmO<`6RmJ<,_+I
%B=?A[R<QWi+d/4f,ku3+28%!^h%KOMZ5>ga2JuXt=j/NcU]q1b1Zl9&!5QO.=:q'ZQpsji&@0bI.m6=aU]!M"Laod)h+>=GP*\/>
%&;5kVT"BA*&\Fu*OX6?!b*pqooCo>S988W1Op#apJR0!f!9ld!$aUKuV6ZlZQ(0l'cSPVE2D,nV05b8H$5]sh-cK1HWR>$5-q<Zo
%JldN&;Z5900cC6:oQi<o=77;1_8h,*YR&7`:N[[ta$W8e<(R1_/=JE,\RiE'_n1Y@3Pm;g-V0[VE6VRc)stL1nO-&=eBcYkcXa3s
%'`5<l^AB>W+=&+-5!^t(%<\5=<U;Kd5b-Ck-SLq/(Uea2]Jr$s6N@L%`"(krc#q8=11#\`bckX?mu$nVE(K,'keWI2+K$34+DM)d
%N!W!t-n,`5ia>Krj;qWh4NU/%$sB+'B9*(Ie$9]$_+iVa[V@h6HBO?,>*t+K>1Z/Q][D=lm?#mB-#>EC^rJQi(q1&f-NtFUZ#1>%
%fflYN68@VqJCcH3.NM($:juNsP9f,ch;`]/D\Sq)F=bU]9WBB-aHhG!f#/i.haCJLTr=S)_07[eZ+R+g>KK/BF-(h\^FF6+1O`8c
%_#m]5o/t1`$oqXa#3+PJ7q,`YQA?>g8->D6(WeqCf(7)G0#%=e6Bk8Rht:)QS_pE>O,dnDNc+7b91GI7*>"H]L1r*2rl?p%-s=.8
%C\"lcWTPe'LmWN_SelF]<&&/6MY%@g=rcOB5_A;-Qm+48OFdW%U.5gbhWS"\<oVo>X()Ms+6V;rB#+/Z/6)bmKd]+B)dC@oJ7$(q
%T3.<=C!!m?Tj-PhA(C_0SQ!hlM2S6[iD!+7!h\l87X@PT<MV7"Xl6Zb-*!oe\2-6d[R?]+71NM3PoB?3.s;R<=m'RD"U9j"K&'S(
%!,ah0?unPKWj87BC)'f+'A;kg8*4^N@^`hMi&[b006@g6;&!&^M%4[?pW[k8hal8Ha]hQu47c[_>hnnt`T]k-LC-Q2qtWo#1(b=6
%nuA6?$$_2%%k8>S_Xbs1c9\bsZC2paOmGE!"unAQ<OWWgWrl4-iraS#88CE)$/pCXNQH+i=RClQPT,/9\h)eBZ/ddI%XRh:G!WC$
%+r=?U>+;6k^*c<_JA[K3\pW$>&=q@QE*fCGiA,2b`+kqe_FrFK/p"X-#Hp.";$G:i\)+jVOQAs^j;#Gi3XSXRL'UYRLG+<"lf'4!
%JtJAm=iDk@TsX.alR=2(DnmjBJh4Do3EhOj&'OA]lFA)^!c1,nBs-L;44T5619Pd$*WaGhjK.gc,7n]0X>n_[PWe%Jn&3=65*COL
%_4ZT.YK<0j<?9-7J](:c#DNr7h02juLr!WEK`,>R>4F&S:i,_k9H<=q1iO;[?W/FM+K#-#h[IM(V?JV0c=R&Ep@C"9T',D?k.5pd
%,^9oeZD$6F,gR"^/:"OlIQu2.O>l]`.LY'.^qJ`,b]&-jRUum'VI-oj5sVRF,7uSkI"A_8%NQ.U\19,nG96$1NT>aS]#0D;7pkXS
%%S?9594H#Z=Qfog.7EDcp9AH!nrZm&J]cQ^Y$Fb4]NaL:A1b9Zi<V6m06n[<"2M+7h:1g[:%^R\0pBql!@sK`E2EXkK$&3Q!A_]Q
%@FL+\$tI(5fGEOdCSE0@;Bk?#;*SJ7lP0dP0b5`4XUrm;.LjH:?8WQ1*!m$7*j1l$$F^s+DA]<7)<-Gh)5mTP*jtf9,T7?8jt"I!
%?5IGB6%Rck!@7eM'YGGZ0cJW<eg`3G=>R95@S`Mj;2BO+=Gb9@l?8nGDG*B%r3cV`Fb&@>J,lOnr5#JV?3?,HG_m,^^EsG*ejrip
%_.mL[GHPGGIiaHp5dB<if=F+QAfuE@MjB)N:od-KTiIV.5IEl1;`6!c*;u2a_Z:Q_.:MK</_R088&.-nkHjK1T2>U/UjaMl%!;`0
%@jROGcR-mnH!F`U@nej5Yf9D<:-bP>_!83B"einB77>FI#/ZN?U'(PD,^Gode'Bo)DE/&>*V_N!Fpk-%?e=C4$KbBC\55pKBqUYI
%O_>R2-R*?"6Bq-X),W-<Ku7M2MiD,s]20m.EFjRg*KmC3IJZnD.qfX!J`EUm6]=Z^6*O?/`+3j('a_EA4\Ti>U-hUK0hPK9O'9DN
%.(rM_NY&#f<m9^;CfDL5h3-\F0:#f2.4,Wp4g/1N9\6OW?rIU+iA"`7NhPac6X:R3a](6^n<VDn'PNZ'Z->Nmj0"6+ZpboVPTP!D
%ij$:Pkh"sNOZ5P^WQo;S>TjnQ_DHi\lPJ5_$#ud'<0Oj10#f/)S!NFK:sC1u_B+Y4U;Y:&&Z:bKbg(nj%9SL@+7!*%CGW*naB'i#
%$qj->a`Ca2Y9k$aejN2[.LcZ/L^CHJ9*S7#N/XbT#uUY'FBFQGS]K6H/Ndb<FH8HikR'':Lb@99;n1=6l^SP4Bhh5:CVgK69f34Y
%3Y+*uM)P'@,"@!0,\uV3icc%\,pn@"7.issM)!UV@?FSNU9L7WM00Gb1(ZnXo]iINKQ%DH>iBu8%>1R3.)Mf3JD/!.V<FGjh'8JX
%l)m)[loJ9eDZuilM)d:,"XJ47HAtlikiCOh1_^Ri5`2WEa5Qe7+^tNbLqsPm\o?IJh.$I$%JHb06q/Ip".^tI=h'l\6F0T3'1HjI
%'HtmP.!fU+$^]C@*:rr2SQIS^Y<:^ACsiLV'?.qBq3tIE6nHK8B/4*4m-(Fb`!Abg',7/t^`rAT[o->kE0t+/$<kGpK]GJDHBlG]
%]cbDk1=(E:7Lb6.o<SZh.09qj"@][c:?%9\UD-bI5j92_JPMM0UB@_]J*ug4Od!ZqT^2Zl-KNP`E]D/!1(XNo?M&UmGD:ef;-)gg
%H>P(c;<-(ie4!&Gnm&Y%=qQ^6k&dl!f]2!>U6Q+M(:f`ZgtUl`%pWM)BVr<m"'!6c^*[;U.;>H=-"LO/7Uku\c:[00Pp,5#iR"!j
%Q]VJbGnULeHls3KAY`7t<4mOFhA$=\QBu"`,eBY5BsN>9YmrX^nmUI^WqEr:flZ*r]0"fS4+JHY'Of]"&Mlnu.RP"AW1AXEM6L'o
%g1f25KYE;S-!EaU9Ot]8^>"=VO-0*%23(oUU7;=59>jq6D',b7q9i8j+f^NP^r1<M-Kf_"MGn(1G):SjO(i%4>CeD'SW>NQ;?I9>
%*pXTPN+Y7H-XnY0/76MqA%.@4fiM+/.F)2p.YEOmT=ujK_B6KT.5..;F<Ce[FN>X?.dRs_\Tkdl&`Y(]0=d$0fnC&P2Uka(5@c_j
%LgdYANo[:N^,j@TOdp#LU3gr-IuZW3UZI^q)HXL`Q4:#0o)mALC>hPr5CR6Ji./,U7JJ8HU2lBl5-0=!'5JFYo`NUjL0:dD!SRbj
%QqM%%Snpg-4a@p%dQlBj3a0!B`8'T/@\")<;0[B9kc:CpVE<eCe!2p)V]Le-F?.S&Pr7185V,:*S;AeAp3rH]"jcE>,s_JB('J0Z
%QVac>F1426W>!67^%qjS=2!pe#Gr+'_Kk;5P^`gl+Ut=U?\Y^1mf$?s"a+uG/sF\,+r?7bmR&+I>jB,Ai;!t]gX#]+DC:<e?m=S6
%Wp9k*)oJU`/QkB5><s'lY>R/lZBAW)XTg3Xc!;G?WYZ<khGU_O1a$b6V;Kk(Z6g.E9P[NLYs"LY@:p4__njbh9^KA.@NE5h*12QV
%r2gLkNfo?%A#BO*_V^%q@NcuPa1>,lo+7TO&oAZ7jakVuUr^%NZ5WUD2T0K(S]OoZ^^cS`aJ_1^VLYK1JXYjN06L9&LVLll-k1ut
%IB)%Y)D3]V]7)T!-*)@Qr&$oQo@Cit\=Uc51(->KR%@G5]%)"!6&STcl;UiTGZ"'@"-G37&>FC[(*EN7HgeB_7riF&IKBEK0/Aa2
%##N<&@eUN:Ouf&f\lcF"8$ldHBP7t5N=cHgJ7)$PT/f,VhWDk=YN:mH=]LT_/@#R]JL-^P+HZ?-\M%=(I/2E0.-Vf.Mnfc@#7f%`
%Gt*k8pZrhZDgj]KCp"bj`M[j"H902eFMl,[V]?`r#Ju*L7m$DJG5B5X!cFn)2`S5u',3oWX,Z_M5A6W]CCNTa27U?Hib$^"`FdYj
%*^6UQTB^j94D^PD5'3jGc=-]Tl4QY/A_>XBTU-9o349X=Eb]bM2o]!Tbcl4r)*$0RCo8'%EoW\I^X,*l,$nrQf*e07l.c]8kL0j#
%9msF:5,VL%HfDq0U@Bf/B(=M;1N8q/0PJC>C$',coB'1bGFE6!bd6UO)Wra?@WU`/A,A+$Re"2fXM[/F.^*O(D;j,RjCM(n#cY"<
%co:[\Hqu40*'8)GF$[oV@i>^9oP'e[_!q#3F-"QS00p`KQi>XAd!RZl<#.,pCsQOd7)7$G;(QY$Q9Ye<l#"AQ9]$ueFdQQt"Q%eS
%'F^#HQ%<?+qDZ=36,qlf\JGr$cn4CMd=oScXD?JBF$n=<qS6"!jU.ocCGVWRL>:C;>r],NCA=el1fTRLQj97p7nENYkdg<enu""s
%`G5?VD7$1m6/sNG=!N5'a3MSSZhGP"AiHpY]+fi:o%,qAQ4u?s7"2Vp*+uR'1Re%<+W830ihF_$YJW+T(A./o)uBp7Y\ie5%[rU$
%K8t]9Ta8!=#J9j<e[AV*:Zq_oOYs]dbImE$YVE&$E/t/Ajqu9^,FF][0--K\-gt^l!0QEKiu&:<=HX]gIIrYa3Infq.t*q5V5l)b
%ClU:qa![*8`b]8@8[V\?CK^()'/d/E3BM'Dc/1]RIGrgba`<ts[EqH5YPnUpk+6H-k5(`lZMm2N&<H$ZbC&U!5X"1`oEt>`k)[_*
%Q]UaRYn/pqd^PLc^"?F5rHgc1Dk8=mcQ/Tc(,lMNES.c0W=4f0Zg]uC^pVEeWgL6fQrIW8/KDkf-$mZN.QD@iY+,#pk05=kZZ9kh
%J!Q7&]`9(r480QTPJH2iK'X4J_Q8^K6K9W3B$`U%9$VYCIN[r+eOQ?GU\e`G$5ab@n:*."Z"Gm&)M`G-=_e(O@AZ]LDb4ON/0d"t
%KgB4`r4=Eu]5VSYIlD$2/iF3Y3r3Ia"D,$loiLO8TUm[?O#7_)RI@3JUl0f*`Z-Y'[Dan#6Pq_N3<CYlJ"PTERfH%GON\YVeta((
%*$.39#6l8nf]_MFm'+%(`A+UF4&%'P`]7FuB&'56`kpZd=j=@j-U@II%,,<ji/I%X5I)*/+<./cePrR&et66%";[#V+noi%LiQO,
%\8U`[mfbQaNWn38)eUf\D];O!L<\644BaG"c+No8ghJcO$bU[jlXnr8*21d+FNIP0BsGo5l81knCU9<1X_eu4)[a@h)p<%Z*Al@f
%AR-1"-.DshDD'nWY`I!0+XtaF`b.%0_sM;P/&WM)hu;qCd&Tfd]t."dX';J6pT(:Dc(8H>X_tgm?Mtd`]t4$oD2DTTk#uncGqJJc
%=pHK1NF\H>`0uf6S7]@X88:pV%B,OF[$Y"GTAE7.>"VonA`Zt!FI6YY<'+T),e9qCL=JuNC8Q24'>[/$`YK63AuU]J<4%dp[?204
%Fu%kOM0":p]4O+\8F#&&RbtdbJKr9h$]0V?N5To-ibFch1ECKmFg@9Dfgs.'8_k@Xo5#b,Y"]rX,apVi;OcpObuE<"UtC#-BEu)V
%c(s.fq7Et4he#dU8-3cefsmH7]TBe]TA2tX?:p"Pj^>?=+a(AYA3H*;4d*J6b48l&&AF5ghFo_DVPH0"f:.WbUH.kFl1<.fqiR]P
%AcdH4dsjb"TID#1PT!XS9/)G]BSmgh#U;/p'Lq.!ejqSJa>c![+%F0l)F>'2ab^>p'E]eBVW^HI+JUB_d?NH(Om$K$Gr14>7RTS3
%Jg*qRO``E*6V3K-p.8I7V5:*<'OI1MdP;AUBh6!taM]n]A_PioCLh/q,]+IZ2^:XL9i7IYr6C*t:K,iB.0)1K(=X$6C.]&>Pq*bD
%)`:'G7KepDi^uo_V@gYAVR08h"DU=YC.)=,.7:L4Z>02!"8Su0WN6\7XgS5]3jGi=YZFa)X=4t:PSS%lOKB6K)i0t@A^Emme!fiB
%9d-s2Am7pbXXOB3-5nfe0\;P`>9dA(Pdm2,SC\J.CP_L<Ac%o/In_Z5&`LNkaC%r,E4pAP>ir8eLH)<(\>lgddUHH3g,P:?C^NJ2
%'ocH4Qs>oN*0I@>8mF9n0LpdPRj+=R29rXJB1q3i.0Va^)qpMnD2OI9#a[G<:7H:&,LWP#RFRTECKn?WU%-hNK3^,M]-&l@.RuQE
%>rsBSgD%RH&^P;"m5?898*##d;SPq'i3n)R>A<jR7H+pLi\@.eJL'fBHu_Sh\LGZ`,2bR-p=tmd*g)P%b"]@!W>A"):KK0anDDbg
%o2$L?-)<[J]%mq]DG#28b'l8q_OG#o,JrJ8On,B>GuORP.?cq>W4l;[]cklh7K0tL(#K^j*tt;cMUgT;CJXHk[(jDN@/e\Ko2&],
%Tu,^<lYe6L2bF(/PRA<W/^Q%8YdRrUXLLR&%)R[\$,c<@X+_B[MDgD-G\ECp(b6O[^$`hM_A.\I(X6t;_pTET@Oo\Y)pNsSA&UN5
%Kg(qO5t9"PCf#Ul>lg/*'==d6X=^)#W3t&)b0hp#Z<HUk=Vg.k&i.^P1M[?Hbdb(*JiBaLEIKoMDB9M?BpROgQ02kIneitS1K#?/
%K*jsR'oMkZS&L>P$6T5ZEpTGi;R;nA8Els_RAOR^Vift7bsG:pP#@44FSu@Y,CNqFV+=WEcJI+6VB/o>3Gh/qXf9Cme8AKco<tS(
%f2@ZF.a9hNkn`sXP$MfBdCL:G`ETCOf2UmJC\Y=0rgMPk9bkL!dTl_T/QKB:IU,>,Y*Z.m;Sm_2j63PD3DFpm;(\B:DGO3iB<<(K
%R-QK.8dqi#&bWid<%_?P3Vn$_=:tn*)bC:]`duE5mcNTXJL4<e:"P,Ge!SM2W[:\D4_dZ)Wi8TJU0lI#\n^M>2&3Jfe[Cph>\c1/
%>'aOMD6T^kfSJP>LcS[;a)%m?=]6DZSa'BWTl!KHD4U+L5U3G2-9%Y]f2/G^lIi;i^73=,2>-T2[.g"MI;9Pq7b%Hm6@hj"_+!n1
%rq)LMiKBqo0.Vh'`=JFfM'In8D=tl69Oh#JZ)R]S:l-/hP\d<p2K^Li1bG3nQVF=#[AoYt1/:cKF%"WdW<(^P$XGD:3gUt+.$_4U
%9imTURgQ,>C9#I_X%d`f&LH&+lKag$m'>'p@e6<D>t_qM7I+iW$F5gXnnt;3O_?KrIAN@sdS,O4-I=T5D;&,QWL:NMbk,VH"Kfce
%)C-4Y;j,_/0+CgMRRp@$#uo/[X(GPd=:/+[h5cq\[Zj1gN/K8o?nj\/e\Uf&R*'T[dbIB?>G"SJP'GSPd2P[?CSq(gP6BJa'Fp9:
%Rq[aq;ApA#+'XSb,>"/["O(JXk%Iq23sG9UAC6OXdQnL\.pI.%?L&^;[[A[.P$$I4_JQ19NhlA,dt$0Z_s<JDqr_lE/$DN\?;,rg
%V+ZlF<]AL3)[Y7Dak\1ui6@MVV=a?X#o]f,.r"<6Y8fVtEF2Fp+%_tE8[<93j,^#(2q.]ZJcP,T!sV'o9hBrEnc_aeKCo9Q9sKDL
%/Amj.6VHj@.1EI^6t.8ud?LM1.q:;lTes_C7YEUeU)P?J*$\?&:"bT)5Y+gIUa8.OPUIE91MKIR1dt;3"BCoM.rC]?q^#N;jBpJp
%ats987\jeMaP&19i2g\TN6(:C8FSITHL;UC=VLmOaosZ!Kpjbb,D&@"`/Osf8574%[IQot;G9g4V@eBWL)<lg2JQ3#W[UHg'WtUa
%Ej[$GeWA'kbA9$^\]2S"ed-[ULk7MG_a^HA>,l*BnZk#-B+'l9%Ipe;TsYJ0[\eH,rCUu1;7Mp<gka>4LaZP-^2C(&h*;aZ+eUb<
%[au5UCJ+@rOS]th"1CT#7g'&9ie1#D_\(#.&UD<lOQ'Hk`IU9a;p)AAqUcL<Cahr9Le]i3.U,N2:!LkI3bDScF.M=QJiIC1`j78m
%fou_I-R:`&3][g#D+^4VaI]P,Uc-1kf?(0J#dcLd>ar%&9o7L71"eG$ZOj,/1S*Q;2;>S-D,VU%6qVZ_m-]HnDc=lh.K%rK#TaQk
%D@-n57>aUrN(9\)gG6lF6037Kb6+I#QD4!Lg<U-^dAqlI,N@0^6Iee%lS\7b$W>ZYU=pgnghj=aVQBLp$1NLNGZ.^lN<o>FYe2,q
%4sGR7PY5p%X,i.B2[.s*ddA\)pnhSL>?lW/&H+j`IoY<R9F&>/R,8J++-GK"b4R]HrC;_F1^aLE9+.gQ6a0CmTNU'C=U:^(1ne&Y
%@C-_9ZYW"(^r&\tLloOdXU5a/=qn*=(!Z:blRH<OMIm:?C\W?XNg8U;QL/?$pfLT+A6q0i<F2J(MPOC`A?iq,m?=W?`DE"W;asB\
%N0IgdQ>UCPH!+>_Al_$k=_;9A,Ybms9tSVD]-L.HHqq#pc:Cg(OTI`6;EsoB"^3;te1<L7;OFCc`2Hi,W*'t:=[K)jCoLF%WE$iM
%Ut/JV.TEHt<3ss$=Ac)!!NTh3X!LKOf``-XO@/luMLO9kV6tZC[5Oc%[OC&l$QH9a]e.FErGo-t3`M2V8BnP1l!!Y#9qAo(RWroL
%]Va!2W$Yk=^TSsUf+=BTBc`)Y[H-XSV!`Q*\g;csGJ,N@WWgmO%9fed[&?IDOtF7PiFjiue5T-\;-7S50obBTbo9/0Sd'43/`!?;
%NN&cr<D0j%/TK;R_eP$?[H4esKt%m4].+2+;;H$-Qs3MkRigD7$sTbc2UEX`W0WDkS2JjDR_!5!1tDl'TW-\SW:?/X1&e$k>Z3ZN
%I[.H47Cne.h2'A4W[;%N4`?n<hP)@SWd<QYdU-2nYc/_S:24`6Q*@5p321QJej[5Y6#f;0E?NKX&9)GY4g'Z/2Us&,8s;tLb-lc\
%>-5uY/nS$JF'NRgU!23>n6@@8\Y'Abe.>od2`f;4D5rt`.%W?I;&_Qr%A>e!DMlk"jm,sCma`f:"Z3sho?Hr8D_J<_0!Baa3mqUI
%fF@k"nE6G5(XqW@^4#[0Q^:coR=jDCIQ[OhKAZ_-:LF.tk3W>$I"$?iGBn7XG5KI2J,&<u\,UbuFY/)(P/k/Ir9hJY`V\O5rqD'&
%5J+Tl><:dAa31Nm[hmZk]06)j+0Y.qJ&D<BrUSD@rq>(kg\p8YLVNkmlcX?`r`61KrPRWg5G)50csqR9s$3OViAc+A?hdm\q^2?3
%r$MGiKJsK5D"=(noCD;)O-AIu*kg*Bo]*pP%mSoFI\m&5#CiXaIsgkS],rZ>^H+IVna>C$c`Z^hrcEG[mJ2fF1p5`'WUG30<fUGV
%OuVU=:O%q;=]PCLQ[aMZpA)\RQY1Q9a^)W*dXucA[l5CHcS(kqrUf.'j?B17EgMjW9&Ep&\=NIK[hnKt>YUi_rS^\0n&V8nHQKj`
%FllKsrP]l(5.lApH$4V1ms+lmhXfj<FUGgQ^6uZ_N88=HMbLT5hEH[FZ,n9Ep'H6?rV,b6mS9AC[/UNkE/,cfR(R'\\GcEnr8QK&
%Z`B#KHfi1:%rVGkPMbf+Mt7H\B=BPnp!_1Y`V&j8[sI&O^ZD=GH$XQ1rpK+t??1MSK>6I^ltn_tk;QI$\,Z!E+#!*6%)\dLpWFmn
%<fc)joUkV*(bgI8Y\&DKa==qVlg0buj?HECo*?;Jb'&CY7s:)6q=iroq=c,f+Fh)8]Y=9S_AV\+OO*J#hq%bclagcuO?KsgAY$Tu
%btf.bB6Q:Mf'L5?R%LT%i.9]lO0RHSamAcG8+hg9Dr1G7o3SQ-?!.T]DD1I-I!9RSH2\KoKune]5GkUes*0KV@.O<qO#<l_n4!7U
%^W;kX)nq-]lCm=:^PLYD7="bh9sk-'E-q<-O4.1<D;RCX0(8dcG.A+0pqldNh=6ahLP[r2TT@TbJ%E/gi<!A,LQ%m#-eD;`MpM+t
%O*#FUK%AfUpWkM,5Q#7X.7?sc5kJUN6f!s$%rLf*]0[UNq<i`<SDTmmI(4VUcZaE9AkXe[(inirqoNceE6b44V#Yagfpo"Q&%CGE
%\@T16T,]H3;^Za.J"HspX6Z6nmk4(Sf;p.5#U#0,gZ?u)o[19icGOQ.a5,h'r-)fB04*LAr9k0Ec-nV`V6_6@%G,jIo@LVRnEqsm
%G@s-Yd!*B+*rNu2jdrJ"qR>F(Z7@!?du<O-1<fI%e>'UDS)?5PDf>+3mCg4#I\XTcf6GIjnb+:C^Rq70p\jKIR(ZRN^:AX+p\/jT
%hjY$Qm&%BRH!]pp]tM%eGP=:8R-i_C]t:c&m[dO%cS'a[^:8WuL*-&pc+1<M=(g"2>]sg=S(t-TB5]Ff9Xb0$_tOPmYKBhS\c(d5
%S#`##IbCo<T=go;rJL:_=1$**\mNkY/(tY>d9bVb]Y1tfrR/rt$i(3,E_Y:mC&9dTb?`T2BLD1/Y%`5ED82rrBkuEEc9D/us7cKf
%Nu,;*oA]?=a+*.LXtO\-lr`MiWWbT7r7Oo$DEib3S3cC4SjAQIIQrJ!n/6=YSdL$eP;h08$=A$u'YY%5BM[T&]]Gneq#7IdX+.lG
%H[g&4JYH"Km*>G2-s8bh$&X_l)rFD?Qa^2u0"],:gZrnKFh.6eXij1'Y?LlMQERiHbjEC(NAM/iD)'d*[IN^hDJn<3$0Uc[cHcI[
%eY+nWr,d+2H2#L3FN5>f5.dKQb]eIb1M`bPfsSro&d*-/k0h_S\UXP:^&=c$c.7Iu[i+'&GkUjnT;PJ!H2DUjLKtVSIG0rY2B-A"
%^"^Ca&,p;_Q0MI&o.g%MQVZAmrd0"frV%Dj?Yiu!A`^S<_u!"^FFMK4Z>jaV3aY._PrMo=qr14sfa'b`SFQ+7N17HhT)JQWh1lH6
%G-g3Nr2$oL:R2+;GVVIGNV344/+oYQ@X5*a_[b7+H.pj+^+N^W-$QUHh%sMU4se[]+#DYKC1gb:gV(;-C\H35>l+,c@:-LH2(\HD
%lQ1HZg2F!<aS[9oj_<>MRpI[`?b^L%4MG[9?T5Ygetg@t?c5+EMei`BDuJho,g!t$qK;\KF'D`2rSG)%0='\dkEDqE]!7m9mJH'Z
%YNE@Vn+/tcS\'MAIgZ-q_h%YT*P*m)]:46=q&Wq!#/\*g6o>EsY.hi<0./`M;mC*A-9`mbZJAR9h_qW0\ncKD:0,YbG:&ZFX>$me
%$bJFcl@3#&c!%!Y14Pb,D"NMO_#2p[(#ogFlML5o^YN0LQq?tKIKJr[MX^iUPru%*pIe%pgJNfgUF2i,EAZA!fQNC<#6CP?pmqET
%`FQOIS34g?,k6<\JD:'Bb/S&X[]^0s2k[5Np4TJMmNN[f*)Fn:g-J[7@trel9r5tbNOq*8G1>/nP3_i!^V@:,H$R"2&BVBQoA/)D
%e,+A+!)7f"3R5HbJ$g/'\T#jS8TB0g56#5M<g+mib)XqZGPGa.ZTmfsfcuM5o;+!N-]^\NTsFh)JA9p3?,-Dg66V3Q)=L?7&,F9\
%L2D]45/mZ["fkh=CJ4$Z4W[LJL<R2@='&VQ-en2`5&RUm\XK!M^a%\5#ulHG:Sn1mR/A.4?3"_m;H>kW!,@-P[P%X2GfrT1!;2ua
%kPtGLlJglJ"+L&EXT.qdo'1&&XOo-c5N[3:-tK4_0L%"HaRg;%Eb4#RbAGq20_TrugFm?7E=LRk`G@T/@*9@m-VMP6ai/&u^@%;n
%>b;Gbk.A`l4Bk&#2_56?4*,i58@eVfB0C_<Eh9o-7bM\A4AVi-mTRd)"q178Db6S)Y/Su+af]JP4.3/JCiVAooZ+<(l\hf^0<QqQ
%2fY`s:OMXdpW_bibK%?XlA6&NP&"UT#!;<d2,53l\B+q*hUZaOT$TYXH'E1E4uE(0G&8=IIeiu@X0_DUG8JkTIldI@LGkp*-QFlX
%#<?&bd4G2TorWF,4(Nu/@b]MIaU$_RYBc>hACoDFh3:'j?J93#F"oV@2VYqG9En%rIK>i6-=6c#p&!L%MgnOB@_]Z_`tD](5[?N>
%pKh-3?^shCYpYRfq4DQ]::HqZ-ThIQHp,$<cHaa#]_eq)+u"8Ji@,<:DUTEr_)qA"s"e"kl>&#Dp#'b7HU5\_nk6]FH[0i2o*4YB
%45o.d)jAm9gREE9f+B)%n6X9Vs'cQ/\G0Kbh7Fa,n/R[nJ"HToq42%L]0!X\B^aF1+$OX"q46BFX1UJ=%t&U1pi<ZOEd'=ql+_L#
%QfRN0o%hup<2e.&&+-<e`_kTV@CFDU3I`epR-AOpCZrg1%'q7!n!?:ofiJ1+<BA>.9DQ#78l(0O1]:$kD,]0;@@I/#Vo(X@92>1+
%G(U:2_2>_pFI4G_%m:dkbk*jI[=)^aLM?D'[a8I,QU6J\@&;NL2=JZ6@A^f]Y,utr3_To?GuQiK#1I2=(P!l#LRJ,g]=%_;>4J6@
%@In:h.Q<o*O48rs=Q4T.Wnb<)4s/\@9C@JZpAg7roA*Jbr.;lM6?a7n40SLZhe_5c%aK=g=*sY]2h/O=f>Z;;T.Ve"hJ>XhQt60_
%Nj3SNna:!006+J"_jAtn0>>36^7;@,FaNZ-`S')=%>\SJ1EN,uq\.&uHYW1j;55KkOF(=+ReM.k?M'g]]GjgZ1VKQlT1`u1bu_>8
%1dV,U4-]bn,sTSf?caB:f-C.UaMO_I8CRCSgL<OHVi:=55r%9cY1Ckph#Vs`H'^0!qL*;fA86ndP+_7W/^h#R>-R,Sg3I&6kV"%/
%bjsRq'6^W;e(O-Mh2h"Wm\\="?!8'l_e9":^)$Y,0p[F5@-9c*"MfdGij\bQf(@ef7EedCXYlWEiJY3O0qu.*lhm.;As]sQ-_"Z@
%X6cOl'B8ec52F8C2gKq%4F&#E?MCI,9K[U,N4s^&Gooh2e9LOjC?og\:EFr)I6;cs:Ys-UT1hA87Mm>l[ejeaK5;VshT(`P1$!`k
%H.T:'*K;4<:-Nt'iV%UQOM9OEqI/?Ym=k4UoPF5=$g0YIX8R'YF`m<%WUG%Rq888;o(So#A@YHa`T>RW[fbMoIfKA%pD9_df4)F!
%:L?"\cJ.VAESL5fqDFnfG.$;pHia*4HdHU?]'VemLZl/1qt2"UgEUW`jR(F?bbq6DYF`R35MTRM>^n'Nji(<,a'J[`o@;0R2cgf>
%?eo&$rT`P=m.uLZ;f3,fIGQ$'PJPY)/,<a$5]1P\_b[<qq8LYYIJN<Kh&6mhiM,0Ns-O^Mn//p[:An:ZR-3b-HsNk.*?+M2C#_t;
%hsRD#F"oFg?i94;0kWEF/lkbqKQu%EDn.SbZ[1UUR&=^rMVUeUSe;1VO-o=U9\G`nG)tDEELT+/Zc?qV\BQ)(RBdq&ELTJOd=BXn
%DGrh@_Dchsk%6]GfKF-D.CdW4CsAS(1AqB/:u><7CBm_8V_"M2`,^Am_QVia'ou+Igl#i^gYsnmZ=,D\Z"4oqD&:TehBQ5WU9Q/,
%EU,R0O-J/Jmd9W2o'W\oQg95pqn7'cGO>X5T'G1C(SKKj^%8#sZu+\b2r/4lAaA+Z:OUs+hj/,'j8Rhl:2TP%O*(!,kgU*!:-JL7
%Rr?W&PRCf&J(\sn-Atdho`_e@(>.g2Dk.\-\a8_<2%/]2e*sP2(gGHrjHo*ao#m=pP&6i\2rB,bro+DdiqDC!7SDF;:&hut9tq)Q
%i8]1W.Ja,#dOPh1]^J+@m%(JbF3]e>ps%;33IQ7'N88cC2jnP<4bgd`HoLjqrd"<_"6*TLqVg>Q9n/o[0@k4:#-ZMurpU]QQO.GT
%d;m]U%r6Q]Og;qIgTL?03socaVZLX-IuumqYlbL*Y"epZXRW-5dG*)"HWXbgCMYN&nV&u9GN(Ek5@9$F4Di^:qqJIK]<eP&hcrq>
%D!T1VHb$o?K*ruQHZs`o]l2g"keCD0D34A$E6cAM2if<o-%1"2ro3&,`W,pVEIC%,Wa7aPiR+jN"P)fKn,=N+pu`+_DKs<V^Y/GG
%j-i.'Rr!gpD3>XH[;W@;4BgS=pQA$Rm3RfWf1u<e-''t:R.lJ.CYnLl'p#4r@c-)"]UQW7o&'b&SYmr^oT]!.]&Uo/aR3rCqeA(=
%b`pERSkKqSqCJkuh`fhEpYe_FiE\b_pBiH5P6A@GT<oh6mj;1HHa'ogLB$CM0Z^-+a-Q>;\gPN?gYe(br3=7G5'i%Ee]$o?05nV;
%\GC1C_j`O:lVBT=EAt8Op0ih!$<)%B4AIW!dBm[t$;@u^!6+[Bhqm>H3JVO:\[-MUp+G7ZjkICpH^A[>nh%D"P>15<kjn,OBtN^'
%9ieIM9qQ@plg9,7^!F1^q,Z?en+5pp^0fd\qouH3RdSFYlaJ\-%o!'VDuP-*rE$N4$d9W*o*Hn(%KCD:kFZu.YCHEBQZq?C>TNan
%4[8f/0=PT_/nH;VF7I/eoli@cJ%n)?+TLg=T?I96,6'HS*WQ$2?f[RR+[>lXC&7"d5Q'!hs8Dt>LMs$^n)#*)V.10E8;B\^*..#C
%iOaa1\Eg6j7b[46$T8uRI;jj/j't&2ZMlgEQdN<`o%+*ohoQ-&m=/F%A%Xu&iV)X*jb8)!j*o%HnNia5+0GSCP91;*Z,n/B_th%n
%REcfoc$i24Q/gL7F-o<2O,\ARnF,fUN&rZCgVa$Jeqq?db<,L:m#+$8VPM+no7M#;Ke*bis#]V.-i>qmY2Kk'5;Z1/a2,rkJhb<S
%ZNb'rj",]SL]+t4kP<K$H=Cjt-Ves/A<'#r4OG7?,+"X_r*K6pj?sc?mPkW0_o).mVk'Ej<i=-qp_`Url&N)or_VI]9Cg(mrj[$t
%/%#cGAI?"6%aSEGVoN:_D,,j58J`Z,4>G$s)&Yt/a5`\,`of&H\X_F\cY_+Kqr.EJ3%rCpar0B-A)CFEo;4W_$HL_QW;W$aZV17_
%*hh>)fsYe)7:pBrG+Fo;@<0,*a"_ZqiAfr[`]GeVWuYh/^->@$d:ITIRDbq[m1\N"1a_N^m8E->`%6?*PK\%$H!(,:cKoqqZV$iY
%H0emJXSh5*#Ph_Np^R40qS2?d3P=O1s5_R[700<?BO\b(@1N;_%7ftc,tf%abX=Sa41*.M53@OWjlB,U`a!A(7Fq2X=f4rZ7I9@&
%2:22+rqBdj^N0,(h];^pJ''9(qh^fo?Oiqqr'.&sDo:=R3I5rSq4uHL%M,"=d58.Xg1)cV/sF2q4\Ufi_j?TPAf4dM#AiJ"7&.tW
%_W,1?QEc%=*97<?ZI[(lpX)p9].s9,E=/C(;jMZBMK8U\oVTTq3<+[)VD9eU)dQ-/NsiL/2T^D^%i<!0nhQs$<4j!df9)".Gr1O.
%QTM+GJ@r+V3<)87;ciauZJ3>r/DH,r161q>@nVoS&>*Oq_k%qYY3ok%iJ74B34XY2$P-E2^V425(>fdbY1(]A(X)JUGS=jk8:LP`
%c?ZE?nnj^W@i(Fq[]D!MTD+263c?i[*+d7U4?fjR"P:3%`R,a=d!o+;/k-na1P^T+Q&fG'0=LLYcgb:h[eq%0[M6ogDes(Y]/oc;
%NUM0C;uFB?qO-p/B5__&]/Vo9]=PTO6$'IF:MrD0s7,Ss2`FgQj0XouipV@[pe<,CW08Usgl(5hh2CLQ8U0KkRqMG+Gj\>=L&^q%
%hrO.#s."=PB?/#:.SGJR=_sSj[Zc\@DBkqE"jVK?*l-T`Hh3^cF+]n,s+ZS^nb147cP2ZDbo<pRhf-W"@60e/o$?'C=C9q3\G^$L
%7[39$Batq[[`-5E\9'%?\(4RH=5QF'pIjuER?EnhQ<.9na:n9#IpuPs4GI0Pq*DNrY!,JD')/Q1c^._beYh21=WQAR3O+^WXGZgW
%3;HjHYTh5cLt6RWEbes*59%OI3isL8"K.5VAi3b^2d&@tO*7K++6NK/E#r&Xkk%;9dUbO[XheDiH2cdJ&!e,^dGp2%K1_&(k4rud
%P:)jb[!+N#Sb=er5'UYAF#*,MQHa:*_ZV4-f/Z&rnT@J$HB<4C!FIKh6!3rSE]a)ra:?%'$4G1BX?SV/^h#)FY*QBTAC%s0"O#CQ
%14_L#MoFY1KC:;u=@r;ao7"J&k]0hm#HW>_Hn9XK=n9/6fOUeIAa<LoV",NG<k(GR]LJ!JEIK+C:e$>tF3l87Z3te:Z6e%\-8[pM
%.6ja^7f*)%DK@ptCGbJANGEpgo1rX]T:+k>[]YrE<gL94m\L@aHH3]9/s=Ph@i=[lnE&&/oY9)r:DF]Ap=18AI/DsW:D\M]TZHK"
%B(V8$H%WO#1TkNFm:ZFsRbqOaa\)("D_B><%Y+?b6?^rsn)&V9rDm:,PPmGbrr29\LT??Lhm,&E^HK=G0BqoaG4t+&%Y*g;VraDN
%)dK^EXQNAC^<H#Hh>bN2<"(t*Gk:k"md/1?T>13Nfh_!*!p`QmdllT^KD@:n*G!*WqnBu=F$9D1H1U$&(Zun0#`DKX8$3eG#1!;B
%4;h>f(1=@G"1eu9G6]m"9Ls=d:iMf"q)$a3=&'cYID%\U8,%8B>dinnie$[JY[>aM_oeRFLC]bu-d>l*^+eZ+d</3C&_B3F<qTq[
%hUsI3&?A:U4'?c5JK5YiPAF,qn#8R;=<!hnJ?]=57-dhJ,\"s6s38SRE=5q%9.\_6ZKtItoK6'BSql9E1A*6<ndt6q-[JI.F!"6O
%+J#+Af(HTu:@`Tq:3;(7pA2-P`Dsl0]ms-XmCc0r@Ks/tU/_`QGM>&d'a(3!CHFa9HeK,KW"WMW3.Ml.;_3]#_'>uo:P#Z>K.r-b
%5Ou2@K"Dj8&M"_PY(Mj.FD^(@=h1R+qA^aWeD\gX<mQ8<fEs6AlI+J<LC#/JV(=T;&Ve/bia.j<aD0i7#=Y`VGH\Li!XCk^;:-h4
%Yac/G%U]b'Y(?kq-6K'GL(.;BCB")=pu-A#g%=J>m`_j#!MkE&<ad>^`K9I,NC$8J0$GIhl(m/XQm#[MUV#)%2e]0C>m5,m;E^9_
%DSroWIS,j`cJ&B()JPV1-B:s/$Q&P?*25E?!-q$td0sDdBEASg\$q=nbcn+`8!uYHo.O0rYPGZ0f[rfgSYOMOMX(']BG>#Qq?k,s
%qmG-hk6LUP:k>P?@&_f.E&]@s--J^ar>0P^YN1XB0/&`&%p-d/-Tb+!r+7oac`h))mcDWYV)rt-kWJ5N#%aNN<Xi\6%u/NoFl:`P
%]-kmt-Q-&VqHRo>]G'=_]q4_Q)UMFC+iGR3I1/8\q*A1#QioP-o8FUg:W%Mm6,N3VS>%/AAccET6_#Au_j@E3J2CE`p%X'X+k?ls
%+bc:"cDa'h,!g[<p>F4BqZ.frr*V[(KWhS`oakH05lVCJ)Do^DWd_(>+^4R3/*=edNAf"SZ,K2u25&?(WnfKkeT7eR.\n5JY!tS8
%]k'&R_q1+^50=(/:Xh@XX;[H9LVkHABFHN9-5RD4$\3V"%i-*9Q=b2S0s`a;+ue+MS?m?0MR]Ed;ML@n6^TJN4t@/a5"s#&4sQ4k
%U8\]g2;An0fJ&1TA_EG*)J)^Cj!iH1)NHM#@XY^"9Mt9d6iaUH,4AQ0bA7YiLZTs/pFfjC()[H4:SU."T%j_24nI!,/gC%:aQ`;t
%B-.RBaiD+;BX'<N`rIIiopuHI,kb][mlNK3^rF(j+Q,`iS.8imL7f2<&.9jhln&=W:4kuMa^S+Td.6M!#a28bIBY+&=,11=j&Rfm
%lIk%;QP+Mn_TSSMlX<+`mWeRq8m)okm"/BAF#\H%Hms'nS/?sdIofF1[JuW[B(egI;)j=Y0MQ-)[dYL5he@;1Deb5I.'b]%5;Z1'
%e4QU9BP"0`WJGc>Z<dJJ3R-6EoJB$8:+!Y!3#F>4PhK,p?)HF/TMU\/$KTA(EH1&n$4/HH(J(0/n_,gU,+g(Ag*`RmnseDkM?3Ep
%fUV`2ktj95fg&L-6ogda\;ULZ?qaTTZ:!tc4D<uRp1^T%,P,dNGp'h4S5tZhGN<I:*](^kl,_`g+QU%Z&?/1ea0].NfNIj%\D-$9
%:@:V5Ne[m$HI/\Gh$B3BqiS^%"h$0]MdgG_p1[9fr5@i5`'fn\,u]Y9gB!!>[s7gE=c`CoTH\*B3cI8)2FTSJ3q>DGPJp$@<EOm<
%pEL`2\E3l_Pn+5Eai^%7bsB7W@P/?6[<^lV%nj9uh-MYuj8t0=o%:7'(_B]DO+8pK5!!OG5[`MS3j'*K!gn&)aiN0UHIPMh1<!=F
%.2*R.LtJWJM=Qs%3bZ7@c]^C,kq^PT9fe?I(jbmQs%2`S4i<.!<8+):Q1Ug]M)=>>j99F%m>Q@g3_T;$(/ku^?1RJR3CT502=%IF
%9YDF:-,4EJA$HVoD:0d6L?IerHC93dhQ=G9(C`SY9O3FW@Y/TW<V9jq!1UlOpem-j/X[:&?&g[6jK)6Da`83?8"Er?_f3luU#+[a
%HYB0;*"GO0`-p6eeESVYX7Vf;Q'g)^IO0:&XT!"]hjStbT%-9H_;HhE07*Dm>mb]:C7!F+CEpGuT<H/_fG'iK$ff$s_`32/_o8V<
%4!.=)T,,G;lrPo$*NoA)oJ9NL5Cd<Za^JVFMrOi>Pb5CV$h>V@8:f'QU4]DlOlu(%,1sD"-oP/b6e=8"dXlCZjX9r"V_3;mbak?&
%P@q18]M-XV1ah_Q/gGVIjY"\X`!/>l7J7:i7"\VhcO"jn?=m@#dHWTT+)[L6ToW7m(eYCl]'s<ZZdi^GA9XI!gR)f]D/teACau$[
%<0WCXaQtt=f:'B2ghrP%VC+EE3C'?u\3/[ra\RHIb[QcbYT`,P=,mVP?stO>%C+?O#2D)qL.gkjhRKTh0#mY'+u<!VLfZ'm9;TX%
%3p_j1?^sUV&HDfL<#-5cUZ*7K$B-Sg\a,F8cIbb"P5!s:@2X,.ISeXMa@-n^gkk+O;+r0n<U^=1"-30-.iiWPD8(853XStkV<Icp
%V3b!q*b@=,\B'gLf.X"1M%Wms4V82TYi2%.]gY.b0feH1Yo7kont%-[1<Y(.nm[M+r0i6r,EM*KJ1`7iLdBO4hGWY!Se%^+=N'!P
%3c#3NoL-8/ej=!g^Vkl-)i@nWOU)8d1)B'G-eYc7'lc.^;\:qR\^"K<q?9Jlk&a).N5Jk9*^2Q8&3[M4U>Q#FQ&:OffEL(tSW/V(
%5<YC?28Qq`Y4=N&JruRn]kqlf-c^l;M*+[X02$Wenn$uja<Z(DoAXYn7lDH4.K=Y2'=#E$O?TpRiY^+10\r?.i`Y9SLhDB,47XC/
%)g`RCdk&o5QM8(:#E@\oECI/<`g'+GVN*^1Xil]5,kbOo%j2KdSMUd_dAr>*HM)uFP9Ba2cG"Vt1Aq6;aJlIfW120(&re[ln;55f
%/8=e1.o6k_.+8#'SJaG1oqn"'(Q/'3Z3e.j-Y<Q46.:c8@V'P):HH&7B&*0\E%H8aZW0aI^2.b=k7ud'#J5_CpK/Y,^=tQ+$/'),
%4=f+5CK,E0OI13'?rg0dKK?k>Vh0[ZK^A+Ok<3.LhTrZYPYNOUBG,/4q#iO,VU+mb:^KiR\T/*'k=0#'<MZor(mWF:#hd#cb@<>6
%%'QJc&`BFQ((M%Fk-K/(+^oS*4F-9d'p7m4Sal>4fm?"P[.#P;B.J>4P[MuR9tk:o[L%3<FC,aTae/n6=nBL1+.1M9^Um"%00;tB
%[2Cf(%Ok;;F,sWG-kjgFA"4o5"f*U#<,k`S%KJ>^8h(2lKBX#YRjaeA!2fm11@!p7fhrMo$Auqp\QAq`)LP]R!H/Gd,&&hBJ8kaH
%,Z"c(9b14KqhB'%d1i6;]oo%$+UPBNRueH,Q3sV:qNN?3P<r=E-5pn.")q1-#f1mYMs"dA]:J<)^'t5!TT<Z,rX<"Y?954Zl38'.
%=f-fV(dOL::7bRM9Mf;fj@!\2.Kd`5j<TFu5&BK():C8*#6`H^g<p$>$`6i)Ysl]c+H.Y1PL3df_(4M%]%+NYPPRRB.a;Q`BWNs$
%kMlpEV9^-?rR_4nBu!L18#JS;c^=t^f]sQog$)!e&ClTh:-T7'F.H)Ai3F[["1&C#$<qO1!@FY1lMAK;=(^*_j..hJ*2f,LqpUbe
%?J&1ZA57=fmkd%MK,%(75r9=793KK?$,jg/DD)F^N':HTE(S'DnghCtcAf%G=.`/ELR*_-qK+6uBltA/5N*<Bj637V7WR"JcX9C^
%g";G1*8<#L!95'uCnNUuEYZ\NSK?cgbq]OlfRNu/)CgPU#W@PX.Z9>hB-i'GR@LCaN!+M6CI+S@aTPa_aNc4*cG4or/nZfJ:IVo5
%<eC;fnSp5a@G%BIBV"]l[]i8WT+A_AD)?\jYr&8^gsQde<JWOn>>`#,q7@stP^PC'f)Y60[pmEUoOJI"24Bi)in6IgYR3!4Gar=_
%06&Geftn5'_MY)nDd;ud[<uMq0FOLN*6^Z#.g"UnhMQ68`2&2q^V::7p+dij238P=Pro;*8F1.u63DCD"@"URA6d7UmBKB!^b:6X
%DsM@OX:0F``YCrRiFn/kGbXuifQ1G`db$]IaN3VSb[+$IgVHB.1pCOrTlV"3Rb32t&F.<FJMFJ@+r&s='!Uga13@1fB$)JSr9!Xj
%M6ZL1oDDK%BD4NZAG>HP50nG,FSUI1mRKX.?'l9TRj:BV(<.K-!<&H9!_k_//+33CF::[GTNupjB[RBa8IK57#Ap;8*Q-PQ_YP_!
%D8il<#qg?B?7e2jAYN[>Y$>lbZ+--X.CYVVrc%RLU%HgmdHh)fckTb9A??Jf\I>]or-):fqgTP4AoZ"^]-Y`Dbi?bI3arXo=jVYr
%h,1/=/sR?9iX`.iF+h.s.NWU3@oU6/2S5!;BDcu76jq&#-ZZscRIlg9RS(7@6m;I%4^d@2N<*h_-h(8Y%h(Bog%K5I[^O(c.Pm+g
%&9LKU`jF%l0fl2"(>6.34[Wfe=HAFTF(`JFB8;/7ECZabnjHsc"`U<#p,2)p7#`O`-uVrqLB-h3_Od:eW8b9-do.InR&Mh#&EMko
%V7B[bmLd#CaX-XWO,qc%&tB;N+U%ASi#h:-KMTanUqNiWG0p@13/3VYE_AZM^8PkFMlml+K*DcQ/6r=&WHkAralT22+b5GWA,(F@
%:8X<F@5Hb3kp,Y3Lf>$Y!c]8?k?a=Hf0Q=S%iC_a1m9X=,IFm3?hRq(R/Pj3H@0+18f(%%*eLCW`s(/6[a8q):F!A!9L_2j;HpuG
%;d+u')psS1VgK0hj!ZA+QR[]kF.MHBA!U0\TT[]5d$r0*8.'?p)j/MANe3#.*2NP91d(TLQ6'(aaq$N+\arM\%4(?#Mh;]E]0A+O
%Q+W]%j?.gmCdZEHMU,F:??A!IXhob,3;R9Y2.B$s$S$V`$2Z=b=rcn^d]:]VgBkpPWc)%Fb04gD:E1[:C,?05a;Y<SUf.:SE>CVc
%hobO?.l.3ObF2_]NmMV=8BD($P@=kW(`^c/Ru]O%\_9slK7MihW<qYD(W*LWH+q6`U?'/mHOgK7dCgfrO8S18]lCP9f]=3aT\kM_
%kBa6oaS-:.Zb<"RL/^B/L>mUf^1XWZ85p=dc]Z.1]!%`H]lIIgVR!<L8ru0SP2K+k+K@*P1MT#M!_u`&FiXP`(&re:Y6$$V[sI?S
%T(JSKVi/N\?REj\-mW4)fbc87(mg%;+;=q`I(9@)f`?=I)+B+nOqr[PL9T-s`T8`IAG9(D9_2NEeTCB1]$?kbPOe'OEmJqI\'2"*
%c\;iP0mJW9Q3rJP_(@mdOYK?XZYXr@nms-b?eM7+@\m1\/QX$1i"OEYD:p6'+0Oer/3[D#\s#D&H_,VK*N.cJ*HqcGE6BCE!$QtE
%ks]GB\J8#KHtDU9YO&i^(51o(jp!d_^Ir`C%;(0[R5%5H&5iK<-:l5$31YN>"h#J\#Z@);,V@0j$e]\2\p(rg`/prk8H9;j:q$-e
%CSnre1VPsrEKT&H_X%>09-?A`$?tI"OMgFAJh!O6fTBDLchW-sYbB1&E/nE>X*.>663(f3$Vn7uK+B@HmYDr/e8&&6VGmC0@IOgG
%V_cm[g-mo6LQ@%WC3''r&s[V-knU5r7A:OT(hr!$mul5^KXuP`P+Fd;gJGDU_?M@&8Y,DnoUMV"IHJEeOQ@.C5p+/_'&`+bp\!LJ
%=[PYnG8`/\YrC?tL\HGS63]Tc;qME!"QatL,:aeMD];WVgFoZEpta>umNhRubWCTH^=$Yl3[p.(!;\1-Aoo4\]6$p$?"g4`5+,W#
%o)+3*EVADA4a6G7]m+Fe^PL_*%^60l+*%D]B_W3%pq=6!aHR]rm:<^i*UuHe;r&t`fSt=bETZ`7WW.qHV/%h:qn_snJ7F9c7R'oj
%TJJ($%J>U4!:%oj=h367gp)lV-.hQAd4Iia#^":-Fj*"4,m.Ze>ZSmM<XuF;^g_nnKK(.!iT?!b3!H-O0pY2:,?j5-,m:TJTJ>ho
%PuF(fU]Q-^3i]#5:A+u3&3)ZdC@<XM1;KMC@Qs/BH1Jm[cg-\<EAHo=4d;@nU,0d-AQcZ(TCRQR5q6(t&0Sf!24>r5gBIagg8R7\
%/D7q.<Uam8G8_=5"12o.POa::e#fB<5BM)^)J&OPZ,&,;Ap[thOJG_l<Cj+B/HsL,%kADS_a"<6rBO,t?;uYG$-Hf^]MrAS!+$\*
%]d1VffOC"DOCA5VrR=^:q>$4;>#M-$L588pgk8-'JVUN::X3We6QgIGMN:)p"SB[\Jll!,lkUpCTo:GY)m])ZCPp:K^!S[M8::"+
%^sJ4;Z\$O<ULl+n!.N#j>O4Sp%#:7#T+V0Ac$p6tgm\9"K5G#.!*'7bl4]a>)E:9m&fj*?^H?lN>KDeSae-M:.`]Zn%NnW8Ac&,:
%&j(nUFkJ08.,CfSBL]Zg6QJ$?k=,Mc$fjc*,)JiobdfJMM-GSER>[Y(Do^D0neifq%^F8mP+<qh\H,KHZ,u1Jo+\=m*P`Pcf0apA
%b\rLDc8^tM=?'e]p3>S9?rkW/&WR5T@$8U-T-K[q*I?!@"ZmZE(D0OBSn592<K15Ncgud<Ls5A%fcU>!#ip4gct)uOckUZW3Z*Do
%imDDVe^j/\E>8_OjIG8_d@"B?C*bll91Gn2Q+?D+@%hrYpiS5cT=^<TKmW@LoX%8&[n2T?PH3OpMHpmUD2p&>;.og>>PT6hPf]]#
%W'P$C,U5+aUd$P"GRr2ArcGH%Y<8FtE0d)7aL>;o@N/*'!AIdUp`DkHlleW/@Rc#UHB_5hm5^-X^\&R%!NOQcJgq$FnlNl>Rkh4#
%cW%_;_!m'j:dsk%G3J/67fmWP.&Y4Y7*[E_G1@C^$P?oY7iUa3p9*D0rAU<XKQG/m$r'u;3R'7u-'//'`C98/E+Y/Lc4R?B#eJCF
%9I^.kZe7)6:YA](KJj'2e+!j6;g?j9B8`#eYGq!O$>?(ZAVPSClH)Ar_)*`k67^=O?K*(2$q`j``LrZnL$s-E-lU>!&4t`7e"F:5
%nd_M"\F.r"6NW/qD$5a\+qte$F.I14R(1sR9ed@fPh"OoOpJaY5b`dc!A]uD_P/#<hWQA]%Z*b.5pF<Q,TIh%jG>0-);-6iZ2f/@
%a50\Nb(nueoqmt/TJ8F6-MOoGPh&BsD>#b`,J'X<J%.N_5'`RBiPgX2mNi4+]R8jJK^r%;?r(JVTeq5t"nptTXV!+oO3cJ';mD[?
%YionJ.Y+13\_Qp"`%W0*3=k&J57Sh"(\iql7>'d@D%PZfFV\3+^pr<2+jZmE])QaVrd+6HUUWV&QcrRlFoB&jru/!QV*Bd(CDcAh
%TNkNsA<7\P0hhEBT>kTJK-_&s>o[V1:-8P;>ZQ4_eq<r`m=%Z=N7^<(B0S4J9rRdo^RHcF#G#<U>`eH/qL;"1'K\;>M*X<eiIZ4@
%R,hY[gmt/JP\.Lfb4mC@0AFkPj>U/1Aa#CSP]KYJcsWJ.>,`N/,=+?n;6iU`RfTU#V&SJ]i.\R67&E7X:O6&.XQe6o/hrVg2A,c3
%e*a.Oi49S#aadmKNTQU"(akN=<4`'r\VTU%<Yi<&a7qXm(q-Rdl'hm^[U@BTmRI#>i_p)f(c,]8a8-CF+?L3jBSHG%Ju`O'$.jPt
%S7uKRSobn!<YhGie9(XP8e\SX9ZL#&(@[mD7/Th$4J.hVR#Yb6dP,n5=cBS)($URS>F(OBMId-/hTA5kP_k4(EVZ%69O[;V?7#GY
%Am)6AK&e6CpfViUE)V?[2$.,YO^V@k=325P>["<UBa2<H$I%=-'eMaASgm_GnnYB[gal1+OrpE0mVQ!:K4cbG@TAYFU@Mh"OoqU$
%!l7Fi=7Vi7cA)0b6(KVu$$,\A>h"u=#KWlB"e#52I'B=.A1t2Pqt6<h=E>OWB-:a#59r6CR%C+p)T?ZPH@8G<K^agJ'NMK=0jnUY
%!9S,%dsSrf7%KOa\uRF4@C6JJ8p64-2^eZ?d%Y*#0`sS30=fNt,O4c^fc3t/b>[9@G+,$-m4us;^iFG?U[b9O/lU%lp^IS%EY9?[
%k5#NVE%gr7:!AW-mP&-@#llQDB'o3OJVQ<u\HCD$e6R#]rY8,78D*?'%-njg%r-13o+[ffN=9TK2CS)mMgW$J(0`K_C-PWE;dP`W
%e44S5</)rh<+e7Yr@B")?W-'-62GUkclLD\=g>&CLY2fJ:oOe7ReP)G(g7@d1C'sAnFTIu2@[U]]MX@!.JXZ5(g'`$.F%!!7R:"9
%Z8u8WmWLl@^R3<P]%:?X;K&,4[gLr8KSI,\_a+_"fU>9JI6*(foB+!$(T?to?apn*4&irJEE#nr%KK9:UXqBtR/;`)T@_4'YUF>m
%`sl.a7=N%nDR`67>^<iQj#qn)AVO"ERJJFpfXU-%-KWsZhdlbV5=#HB3U8_>DqEX@.P2u"6e&5CG\pSRB;L"Y(uf@i6P.UBY^<X+
%?Ybb?N,*XT$t^Vj$M4dQQnrL5XJs[=?.HM3hDJ-@jR:[`qU;]IAO2?DXa66\Kn7;_27-oiAV###BffC?GJe)([;[_a6:\.sid[m?
%_[M\l4!&%UX,1TreJ(_/[S[oj"Z9R&3hCik*j7q0c3iNEA3.WrjSP#V\C++(@V-F:eob0S[b_opR<J@MQDK6a;]K/ip3GrodQ&4V
%9IiGe>n0D60<h25MJV4`DP6(lEu0PR1.j8<->dj(8QGInA^;TehJ"Yq75O.0dhcuh0k)!bZ%m\6$"<t87KGUH8:A`(inGAD"$dW[
%f$"oe>q?HOr%9f)RLhg'k($S1;6Btt0\3o&aeoon)J.OBZ1;-mJEi)K::a`uVc2t1Z);\GV:q7Yob1C9I^Pe3]co;Nc[\lb^IZqh
%PbHd(9[=b\>p*<7eDgDRTP>'/m635Ohnq(B5jB!`<A!8jmeI?ud>V,mEKHrA*)JLL=dK$%H?ZSS<`Y"*im;b)=X!Ak3_$5U6cF)b
%<jCft\W]NO%@jQ!5u>"O"&P*aVu[(h`#%`NU>[7RcP678pBkgiPs[Y\):*sDc^fRF4Y+X[<0'NBg^$qZoAiZCRDnA;IjJ'WA`/"g
%HU9KD$BCW[2<j1$`CVGkX39-RMF'ijs/.P&+*&o#Z]0T'Ht#mB(5UP#S_=tk'2LL4(LP*`VtML:)*K74-S[1pZobnelV><``"%T1
%13I7+lk\V="NJC]]T0*&<pTH3J=d2!G"ft/)(D4gK-<8:4e``bY2`%W#OT9X7&9?mA3sP>Gs?QsI=AIJ0c68RM"*7]g4E17N4&cD
%\pV%Y@9Q!Hb6=Q@J;#t&]&&Ss=T_)u#REkt;'f[l,g2V2lVeruXhmB*h?Jgf!A_9?g+IrfX*Dp_701O+pLJ98<KPNF/U0O7.`FpB
%Oatl2HiS+QZB@8*N'bB40LBGek>Yn:ra`,TDY"'3\YaWN$mA'&>uBS%RRS>UB7<=Fm(7ATX<b80&+h4c)LPjR7km?IIqHKr,XP$^
%ZHB2;TnkMGYX]UEUrja;S.EFR@YmN#C$uYa,j[Mn4]cW#C!"GI,2h\<G8)AMM+@!E$KtV<[Zd>`Y^lE=)W?p-l9_/B/pTo,O:!bN
%`8>#F5!@$eNI_m%%D<6?@[!#dPAs4UP5_m"iBhfhF#]Oq,S1EPQ].1i46KlNWmBLkG1fZM:W=3_'.Y^`raIl"j351n7b6;Bh(FFf
%A8C;R9dtkM?;IJ]00dYJhW'N=*Z:$)%q]=B3[T26o,c'9r0_(MDn)Aj+1:WL@ug!r=Rj+\rYVA@Nsn@>75Z?;oT8R:T>QSfO9o*"
%T<A]/-S)1M<7T&i"O5*57]t$QBn68CitRbeD_^4W-aX\<,_m@t[s(C7FX5+6.KEkr)p%:c&e'_B!!Zp#(8H*t#cUZ/8n6T0;ACA<
%TOVUMGaW@eO>;Ytp70/@F,MPAVpK(6"%"?^;):mKSjTFaD6`EG%XXjk[:KWWZH5p2Aah74o/`C]0<r3e^:]H>NBo-M/=.A1c]pEh
%6qmBAL?]V0CfV!KAq\MDQTL+J'Vaf9+1[S*<M,ktcBXd$0/Opd(:'J(/;"F@j$?I=*Kp;I5ai+E@fY]7i,FKf&j"RZ',]6!6.]'%
%%`t[E,UEaJ)8+b>8^[b*9Aq'3*jOuNHXr6X$p6N`(b'^%9U9%Y;r[ClZP#Dn_F,?kgNsR1XnQPGkb#BM56hU6h2@*]&a*IGj.=;(
%qiWl_,g=TIjF2JK2O*Lp@ih'mNYR9r;sPdjKAQ2;X<4Wg'0s'W*3:jN2h8NXhk.t+P(WdJS4j67XQp\SBA[!#r8GQTgPbfP79a[g
%4Qp-:h;$l3De`;`q<$[lbP-4iB=QjIe+IM!DrgEUc&:nshu<37]:1>MmbaPUM:]/s[jP6!hHg,"q!-i\G;luqSc.U.mSNrU4#%QN
%gP:JZA1S%&/8Or_r;laf[*de]CgoIOnZF;A>roCMh]66@4sT&d_D)C$(5GfK#h=&oFqb&9<!akU"3;gN/]XfsUbihZb9/R<,qMbf
%^%Xi,da],;X6$uhF\^R);+eDBf&Z*n1gLHd\MhsE#1P?(I_Ls;J7[>1Jj'L$lHg`9S`Bge.6T/7>R_sE5sZSl/q`Lk.%$\h\Q546
%:DMBC7.(ORQm!#-/[3`=d,IS92:c\/N8bRuJ?W_WW"9Me^("7N@SMWP(5\UeV3[M-*LD(lW,tN@,][`.OZNM_*g<(i/P$[^?JIuO
%6OF;4IV7)^ECbjt?o!>"MMtV^7maY7oh`o$d4o0C3$]!oEu^O:[(NA[85,-/b$%j]k6;cDnX)c75g.-,l_9h^V[#]qrg-`>0d.t^
%>2mnj4"O7$?AB++*A_Oc.*!G?"#E?6oK/cN'HsjIX-SVlYXRYjd-\mlJ]nHhBsNaV"*JE3F!1aOB-s>EI@s_`KY$joA&`_X9bTX;
%@Bh>UnqBSUVX?H<*KIMh/BKj!,c4E_(BoPP7gfYLeiHN*=P^mYWVUl]-B#@U$Y09)(=ED?:5(flN&(`CdT%jDHcgqh'Y+fSpR#)[
%8;L\bh4\46"k]Zh,;L?&m8dcL6p_/gdt!$>#<2pneM'2sfJm/'V&'R.da9@rn2G):?rCYR1SjXe&uQknb*!YQp6LnFNO6l4T$h@N
%)U(sQ9d'Z[;/\2==ldpR$1ncdVKC$+%*m$f;^%5N'8lE:=[W\<0H8AEBZP`M.N+CC\<U^C![ce*pH]gF$K<5[/"\557&[?"=jPQk
%%SK.m2EW'b&Dbp'k\CR?4'T"o[n?p:14"!B6_TEK<MBD(W?Ha^i>[[Y7K!Oo%=pWsXCqrIT=UFM.\ki9l'N/pOt0E($(iq,*>`j\
%WbZ%1VTh<+-)-$d.I>SQ`B?c*qk?f\,Li%#(=bOcFWdrIQ;1AK=KDV1Q@*2/ofQ91jL=HFndNI<:\ALLIMI0^8B!q8U]"RFjAaHX
%ADtj^(T,l\/TtZLFk$5"MfL$[bX^hb*Q:VY1DDT%=B[Q>n":eR*iAUiGt$]qFr*cclasAj]riPK91Fc5X@n:K0L\H86m2cqo,/R&
%>S/ZrjJ'ej_<-Jji[U,m:_2j?T]^-hARcmS?VFmt$4XlLi]r&aUOGci>/\]NAo.Y3%;M@768mGB6L>PIl_:B]r%sf*bi-Ph.7dIW
%AC&K*PYi:i-,m#Ug(C4`bI-UY.Q?I?raGfL6DChT?cu2QeM)Oh[H2?_l==.tW1'3i;GGNXq0h<ss54_0M%.b^eY]NO)Gj%kr>jOi
%BX!N-Kr@`M`;sqP0M\<*>-u"*G!eX%86IgdXhhDJjT*I^PIfE[UTZ7Q1L8^:gBDFt])XFQ(`55;>GWY9!OV3Q^)T$e>le(i*nVfX
%O7(S3N0]']n0PVrTdb,1%!V-7&>:63ps?qsO$\R9S9.f+i8uII9>g*nbURKBBSkO09!,o[=(7"<e"O:REdpn*N4?."l0]oNE"f(%
%X>2n^dNoJW;3t[),%ui\nk@Go1UfoB*.1;ph5<WB9s"PZ2@uV9L,An)#W"^nP"JqJi4>EkB""\6/Qgh5P*R%_<EmaH73Sn3FBQ?b
%1Z[Z1K^k4J`]Gf*afFp4l!3<^-^mD3f0N\nY8/:@#B$KB'\Gt,noU7@ef=ns=C`8+"ihoU#F:X7&E]D>(euR-L>Of-0\B2WcB?^0
%'n_-=KZ1UgkJ",ZE:Q'_O$$c<Y):#X)Cpbp>F:VrO^r%(oJoB!Q;EW7)+Ym%.YAm1a[``u1D4\u%WQL_"--6qCd@o%3_^#4Wg;oh
%aY4-:,28LV$0asi2>\L]fM=%7BjbL)SX#^[.F';PO_$XD?!W(+Bb8&"`'dW_ARl%@M:D;#6nQu"nG*/s&nI(Of_q*d@K9BbZ&*2!
%(jlp<Pd@1k!36Iha<=NMl?to62RMA,YV"J"-m)u&@"[rW@@KR!hC36m.q.nNLt,!RTEgMmn6X\LMm\[9ZV.+9X0fQn`>*7s.n^!#
%Je#65hEo1NG>&Uf<-6!U<\D2)ClYp_9$ebafc@D($Z0H'1F-KDQV(MYn02&7aG9t1>U,A/W:k?=S/)RB:-TM>[_+693C?p]fP-(;
%T[FF/4L\R;LOb4.-T`pk1i'?6EQaL_"MI,rGV>T8>k\Q=Z$5-Y-idD3Ul93rY,0+8_OiPQ\.(O]mr8iSD/oV7d@9V64;6Ucc=H-p
%d,kA#-WBmr<sBf6@up,]UXdJ5TTW)oC?6&bUV[<]_jM_,RS$Q4JM;XkjR6>&(bY*lj5e7tXMjQ=`QM".8;gb*n.@&SbZf$bR6=LL
%('JXZ(;s8ZZnRUV(lf>?%@YP"Ol6iO7%b06=cA!O6KON[NC?Kl[fB_]JCCT\"Ic(ObMm18q`-fi@?V9RNQ781VL]J%5M!h_OX*U-
%V^%f]T^"Y:%@:T#*=-Q&\q>-(mXq<%K`+i'<>c3=&;uSA%6TYPjKn&Pi6"XDg&\It,DsHk*eX\on-3pnJs&5"PMGHEVc-ccCs6_F
%*fm_e3F,8Q2USR$7":@$$o+\NLM[['s3[l')G#SE)9aVImiB*G#Yu*7j,P0.DLp1N3p-4tG7[.;]?2e""9u<!ctW'<gcQgSgsNgP
%D^k9Z(8[b394o87$5QtD4^ocK7Xa$`E<N%i_5h8`MB^ZGBU(&N1Pd59,s[B<"ajK76XH,$.DF8_T[BaPl!T\6moZG)b]#%8I`RN$
%;JMgf7.=BH".$6ZfbB#^h@qT8fcQ<RKRftJ;M/(u%6Zrc!AOW-"17n5,qA\(0o9;tbDkR[*Ln+j[jN'Vf[ncd3$/tEGoE8VHZl!q
%PL.8UJqh$P:30OT0Ij=>Wgt\H-0%dMcg'E'Q129crP$__[ZmjFWoP,8;t7$)!rNm\7'Bf=$P82t0.0/qlq18uOr[eY)gktFI'P*\
%Z2>_%6*Q7k?6<.*(02o<fNItX03&;6+@%.5"JZW!06&f^QDIh/RG7cS!^E6`WjsWUaI%b'i!Jo&'CZ0n5tNT"iB=tKK@d6^*3Bj?
%fa7;#J/L=+YLl7]0I@hAlb1qQ4\'glr4]]g/V+9="qM\.lt0L;U`i7ZL/b)#i48(7_t#J-<HEu$,W-AEQ?^VAc)$P"8^Gb=R`'k.
%!]/0Cl:Asg:^b!Yp1i$%\Ai=t#7u#']e]&(omMm1/Pa\t34P0+[ZeVR\Ra^N"ctF0QXE9j2;4"UG"&7U6db;>;lE7sCa_cpmg.=I
%+WrK&2#3$lTQ"c+P,@eV>31`:S>YX-')7QB<&e+S'I4PU#Y2^jPMa=Zj=*nIecrBhfWD*8UF%c?!&f*pJRdL[TRm7>oW,'^<EP:/
%Z`m'_e`I8Q"[KS'!K84gJ]S1j"`_5SKsMDS&C;DE;JdhhAB*6*Ba,D=Z9Mj.7E<?8h[&#R-fqXIPu\<__L/C&HHhiApm'$oXg$g\
%!Hr$>3!?o%EiKTB"38i;AsS/Pi$m%EbK.Llr.q9kTd4tui`%SK:h;<MGF38Q&u)laBW5;@Gh;<;"<%7UR33Q0f:4j,G/TPP$hRsX
%[KYic_kAajP/[Rc,.;-e,)d;s3VcN4J)ic*Ep"!&`6OA:_A?1n2DN(q_R'X7a93PM_+6g7#[Y+]aZRUQ9;i=P"t?-@2`C['\6=5Y
%EH0O?j7406++i]^</AC[?,b4]8-3p:h*[GJj5Obef0utk&0?^fB%gZ/.]"2KgL>;TLYi*h(HX)H6d0/FI<bNlj0CMn\;d`nFQ@J#
%Oaqpuk03/CK+@)k].`+h#]P*=I+"eZ4(Ib#.nT:?bV+'5-J7cAW1_73'Ya0)bp%6G,1'SJFQV#.Ou"WqL)a/l:,C$ZE:pd3F@`Ep
%pS5HXSC+=Pl*)ad5-G%mk9(Up--@o&Gj)AX'3N(@KsVP5%\s9eT#_BBh@d>#dKZSN9<6]HG`6?$NiO;t(RRhI(LV[4#BE:,aiRL;
%MPN3_Xk9!*HB1RJZP?;a"8/6Q^]"JA#S15TgSl/IZRq9LK.@)-o]0W*$!)g=f7')=2&"Y164(+(BgBCaY9oO)!Q4t"*V]]-<Z'X,
%YM!96_D+f8NU6)-jrASYgo;d+b6S!MJII7J:8G?2C-W!:%UM])lu7>9=HJ)]+'sKc,<qDMO_<&+`EQ`"_)Ma9[Ukkbp`7"/S<4A2
%Fa,PlOg2du1iHrG7_mV!cM/UH0^o?8K%($d)"q]Gl"r`4+KB,j0T]LLPlX7D57CeE),JM$6Tm)=PVB+FZ.kon8knT>klo]J)a=L`
%E@";ia<2&FLPSA(A&ss>CHb!;1*No\Kq8tP&sthMppc8XS`:bFEF]aD[QM%V5fRfG4lFeo(92AYO&^!(MiH[MR^C?l)?>gceT&n>
%EHYLS8+o4%TBlQQQ"FOW6'.kmiDJE%cap(UVEl*IR0`iK1K2sohc4<i(2>uZ>6M!gA&T)q(aZi2L_1`+E!O8na[C2"WY\D\bG$fF
%U6Y!g[ZPn!SK]8diWMc-<$7$cfWelI5%PZ`Ta4C<C7`m#ZSeV&PZ=`B!sH`maIhK<V#I8-ae9Vcjbbg>`E[/q7.eQ`i*Zmq>M!bR
%Ca'XV+Ym,6p)+E6.[<Rm:0NO?0_-ZlZdEH+D$D4ZFmQI@'eJ^Q((mYPmb#=mQ&7.f,j1o%CfH=Eee5c8dqJgiL*=*O3EZ-ZP"cqt
%YK>>k2*L\9U5h$'r"PX#/8b<0&0$/RW[AnoV@hZ5E$oV;LrO^'Y0MPH(d])ci5C2,#&YilFteh(-u0KIJrU!`@(J)\dA`g+>fA5K
%7>Rfp(fgX3e/Uj@Lkf.Li[E@28OnUAWNTZ07oj));?6QJAdrU'UA]=N'TV2"d;hYE40W]Yh*2UmYi%?"IG[G/#of:5dZp<,-rHA^
%n7=m#67$0U&U/h=+m`(UfL%cOEhlgpRB[&+5sJkE.V>U_+`1>K>.Z"[;AY:lU^`u&j!:lkEaMlc+;4Ud5dl&oq`U;2>^M79*9JTe
%%S][jFl_q)pV=.T@-\\i?0[$&9fQ77\Ico)C1Z[C!58q!`+lYd3aM1fQ/>A;C@$]-\;OYrDAmt8_N?RCnBt$E$H`TM@":]p#(#51
%0^d0Ef'"tTM(U?V;iQ(jZIiC7,8rW9l?;+/Kj&GL?]J__L))WVZ.[Z:+I5ZgXKW7.TI(pu&Ed0=q/d52Hf4b(6(Psh"ZKrA:k/qO
%o,UP%SO!nrYONH.FG@WiH-J^6*l<6Jf[<,Y3\l8M&t2@]Q)\H;%@+gBnS6_WE(EZRF'5QN@7SRK9C=)XoFb&eKqN,gD3U^"S4X^X
%%gFTa<WQ-2<hEibFPc=c->!k'L4M1q#quU3pu:T@7cYi2G]UGO+u5BVKhNAj"0QQuWc;!Q&1irWaNpuE.1RN=_:+g\\5028]?57\
%4b-DFN[6M.Me9m=6bK9tBo.7T)c.`D]+MkNeJ^SE5`[%_iq\.?!CT<X"_Jt&5#))9;<ds[PNu_tr%[Dk9bIQ7>!\W!$r7N1Lj=8s
%Jh;Yh3`5t-J0:!hLbo6`gf"2[1$H3Gq_,1YTZ`NPLh&uf5OY\bbd;agUdW0J/mLZ;3kFd&km^YKprM'5EZ>P"QU9O4-ln%4@@8I8
%0sF(Y+JQE1X?ucBJcUWeAhHRRYMW1sQ!mkO-.$?`SPg.%VKpF(+BL5H,"BAI(rfAYC]N:u/@&=s('Z_G/qCf*X9BBQC_BQf6g=hu
%NTtd3h2/h#*QeH"8#Wt9e-7!ELIqk,^*e+)5Yg+FFn',."su#+f(d<8lN0Hi")5?GY*-TO&VinK&HEq7Hiies)!_2LT`+uO1fZ9%
%jr8as6@oD8K2_pg1]JSOA)3D8)Sd"4X(X%l+br@J3]6gI2.f11I-"H4WK)*SA;D(6bVFOf"&)*AJaL7>;TAsNoMH\Y#0R18CsYEX
%:!C>GYXU'1m9'4#7kQNX9%O;+TE@Kl,Hf2I,8u/O)\F]JV_K/HAn3f7_*nTu(M'GBZJ`BVin#nc?jq#rn;1US6GVX1`Bf.-SaoCP
%iCVgqiHV%Ln@N\/n&A$=2PaRs83b+R;GAn+at+!i+u@[*?pqt5$#@h#V"YiZ%Kho2_NKraL:(;UXCJ8g2&ZN0P[ZjHd2aCoKmA\Y
%K]t?)M)A-?Rlmjj77uD7E;0cq.)X<?.[Z@J\`PWNBb6C!S_g8Z>U?T5;:tO"5%9rAo>;B[9M7i0<5de+QIaSJBGciI9!I-mP6t<(
%M+]R@'X54SN0!%b#(_sT[:3*o;<]!.b"h+<Y/5,Y-a-.,+Hh7!Su&LRG:4rjc3b$i[Q3F]S0+sXK[oiRdA2Ab$1EQ20K&U,>0_pe
%'*]ea:kRS+F$N4=4jONCc-YLs=m$u<KU1=+\O(p^U?Z_nqPU*Ie<.g+:d@]CO5L#3pgdH%@dT*-Za^MWIcs7!nH8%&Np14;e.J:H
%]'@u!l&"=Y.S45V%1D[qeEi;4M?Jd2AF'*P'fk5WKDgsLSHSN/Q/J!&/Im>V'4u*uH:L=HC(,TGr<Y*(P<o(M`+!9#mKP6&PETYB
%k9&Q/F)skBl[\cQnO9(++V$7*he=%/5Z*:K)dHGn'j08D6BKSoE8ablF0=$a(f`FS("hMO]b78>BY`dpD*5Yd^Wrk\?n9#cN0:L'
%Z,IMG;KQgG]@at/ZbRgj=<i_`;88.02h:jtJlq*cI=4@G-h/#h,2kBZ^;62%!O[=,?`BYiVbt2RA#cm6:>8HZUZOTd\b$cdJuu.s
%4Xnh/#f.t9UT)*gCl)N*%:HKM8LH'Z8@rd4&Upi:#b4$kZ1_A/qH[s]I2eBHMiKr;TdPa6n4M)[8Z/s33HMQeV,Gs39ReDBaCl_e
%djr_Sq@(-m"LB"&#5OOEf/n#-A=@l%$p+V`)O-I1BI\AnlN=6I-<FZU:+#K4&/59CNOT0rClV-d@Z]mI@*k3=2G!WbbdT.D>(/Ik
%eY*5sN!um^csjkmYFm=&HAX3j12Gf[i__8ER9dQEZOJZZI`CR;['$:70ZtFmW1[*s!g?WT#s]!S#S3->lOdlS=Xdc%AL>D6Jqh`b
%SKr>6ONBssT#Ee5ogN#-DKH<cB5M)4"!Jaj=T`3d12B*gEkUgiFZ$VmefC2#0Mk%[Prn=>mB%Vqeq-NG`Cb;C*]8P>@"C"\F/m/E
%YZ>_-o!KKr4tF=+iLj6j4Tp]S`g9"dkV="=1:gSmZVkBrV$43N0sM7oo"hbiRAIc_nns#$St0$fY?A\'^j@Yu`((.k"hkOoZ:^*F
%Nk]Vf9$uL;$MNEb''mcW&gcYfYX4P6!YBiH0CtGL"@0243hD7Y(,3[#*L\N]hQ(LeKe^;?-(VVPH+.nE/>=>5!*^?6A7c%OCkKag
%ofSC_fuC"!q0fW(V.a0UkdBo2D<qA>8s(BUQrVBCYD`'s'o0X&fn<=DE]Q6=p,!^+h,-N;.]Q%jWS<F(0F>iimF:dZQ:g.JMt@B$
%SFBKDQT(aEKoE'r/sr\\'Ca0&lGJ]I<S]LaKdbT-m?UVnNkJ#8$/tr`r)EeJe+W'C*g0ea:`)a#H3;;Q'WWQ7]PfiDV)!B049q#$
%pr[km0"14jlul-V,Ub)B>91VN-6tV?+FO\9mP_AH#EUg9dr8rV"Ci23li+o($\r:h8af6u*_^i7U*r`*[XtP<fI;`odZJ$;L$P!g
%/@\hJoN:/k]9r9&0%l+>-FG8,Sp=h1#48t`1T#)4p_CS080&i!9Qu^@SZ[pq[j><!jY9:./r%iW0EVPO#l:Z3;dfTu7DV7-$Lo!B
%6)</>Bj!,+D:OlS&K/9M;0JO3S!#9?gBZuR_ST+=/:BpbR+"h]W2ser^Xd:Wa25L7i7iEO3(B)Tj3VIn28$MfK]GnUbQ,`g<Ah)%
%0)4F+j=VCr*;Z*u)(5Y`KA1UG?nAj=b)f',M4KH,(T6.$4W0%h&C8DG_-tCQjAINnm]Z7#^g!S?&@8Mtmg_T3-%SLR#hS36CLJ67
%YQ[PTeH+?:R(T]p*l(iUB*#itJlO=ZItgp1p^\-e:U+Z0*<A;'=Hg@c_%S$/7PX+geWP"oYafd61a9G9SCk#a9ZLDn=9sA?3b=Q:
%.h`;N7AN:@chnbYK"JrrQ'"WuN9%>gf9>R;5Z]`R<WbLN6lD)<@7p5H5QcZRLsut+gh2nGM>i"GW[J71)uLF/JDj$h^/J'(K_,Zb
%!_lXVf4>H=f:]j?C8?N%\GN^(N^D-=p_pXaW?gQ&@*OX-WsY$,NG`u0aMpYcUAl6Dc!^sJ.uso*?BmkFM-'lq1uWTH[H"@DGZ'k%
%CZ).KDBb>pWu";4VT-J=O*3or5k3eYM5<_#OH<Eu\Vr15BH<&@b'lh_JP/!0;$9uNY!+f`0O)mh65(;G:Wm>6Yk(U@[t^AN"XTK"
%+h49$U7C:#kFh(m:GGh5*Sp%GYWsrE\\d8i]KY8s_Qr\_1oj/0G#\C"!)'P2#c#3M-4TcMj/#@S+RKO@&*[(V$2.cRLL]!(PYmkZ
%o?jV!!3X^(3PfF8iN!&MNK\D+)5r<NUV@G2,?m8\eXX8+q#QjBX=WglmMn_(1t5VC&;JfXA79RFK7I:%B@<H721_Iro)Sl"6=\68
%E)bg?O+qg3Au_tt?u@6Dr+WDD]Hac:0W^-3$KG_$_SH"7[)@;K+ZSa_%mXQ^eZ*!X-"'n]/\mJm*YB5)=2QMN/W1r[P@+CZIXR:i
%6n$3K,OUp^-"69Eo]S)2^GY`D1qX%`/k*WoPo@_$s3D^$/Y7D'VD^Zf8[;3>BWS_Lg_ef^^cnbn!.$4t_nshFNlZ#[a1BT-!P$'m
%Xjq\,^`TX1jJB\,Ln0E7GSUH78uuTU!6BKIDKVCY!:l6,13P\Z+d9&4mK3T:XB(1Pc]<4(6e!g+KJubfGpqXg`St/9.%_WF1XddR
%F^.>g95UW\%a7r5PXeZm&mCjD>fH0u@(K6e%5G1e=%IX0Vc#X)(+a2iG@Lb@Yn5<D!&%E+9it/qXFe_">RB'r=S`RV`($%b%Bgqe
%;f`gS<hC'Q-7`5L29b:bp07&@CGCEs%7'aqfQ';Z?]$_g&tJFOPu9t`=_n0Hi"0sWOhsDf,mB990L,dE1A,X]66FeEF`aM=arJdd
%KlsCtbRr.NQ?CFhaMQPkPB9)@211U8AKKtP-mDV_q@l8;FAS?8Rl*`0Ckqg8/<O_t&seT2I3tt2c&+Paf0aJ-HB"nH=Yg)j>X@oV
%Xc-_q(`?"#K3Nt2LFkD%Pq6NJLTZN*<?Df="7-=TA#&#eLcH:6[aj1G$_HMqer"<P_.5-L)0AL7<CoMG'*\f0DAGL$#5TO8^:2sU
%P`etnN2X4@@h=(n(TLF8BN!GgJKE?%/:n/_'OCK4.&mTu?4/RNJ#aX-.8CL7:"/\b,8V'77l6$\E&V-+$WG!j&h=3S:=%P%7d,fZ
%.nCibe^t*:kecZh=Qi]j9JmY\.NT?(NgQ`B9]O@,*%WZ1q6<ZcS`Sq*eI0L$@:1q>/-G@#HOqu^3g/cmdL<#X$dC-GTo'fKQ/4"=
%W$IaP>\j4>W`,\/1#AoU/M7*YIXWG?M1tXg5QN+m2*95dI;4[.:b\)tq;W2@JfDRW[n:<[jV+?mMsa3&=@G0:Y'qY4d&'un^tLt;
%mheC"PrF_2:Z5aoFEesdXZ%^:Ll`;(3NmEc0'<MaCNM80N<;$pJ1l.r\s1XRa+8^f+Tii.aMhK'j@j2OR)Up?7Uhd_UG4f\Ml:S4
%bu9SGR[;&)LS,/o%?d95mUBVrH9@L1O9lJ*`)\C3,R)5m:GW<CGmL#&6gkc/Lebd'PXuu<,D&ml8o2r#J0GhN1M$NkhpE!pOrW_;
%^SY'[@uY:SDMh,D7nsE>2H`K]`-N-h+Q^:8;D]dr!(ES"A^ii_:'@?olaU3O1N(L4Na,Lk$"W+u,Jou9'L]>sllk%35D!rZ#mQY;
%a4.2R2)<Fp$FC?n6!0b!A?AG>Ck3i'"^1A?1lWKtlVK\Vfecb(`b_\0]ZHH;jm"Y+V:,X&@8(Tm3fZ&A5K;"dkK)jr4t6iI6sjWc
%dA6m6cB(WEeYFpqV3&(B=\k2'=uKXHn_bm\%^_D@(20^0oFYljH$q;4],)[XdY3WD8lMXn]q#dGAliKuBZhTc?qTo'.JN1NJ+&:[
%]<6a_Po'OU6hp\?nQ$t\!'#Eda:WBl!agT.M-s!'\j3uu3(F]_+Tong,Dm0t<3.7b[Gs2%Us:,(#^QX/!eF5M+<o@:.&HDeo\0:8
%E)LR29XU>P:!s<C.M:^W6:`F+QQT(pGnjI-k?D:U=)nOb$>/qIZGU3>B2\uOo_J1t&"sWt12BX9#a(<W"Ek'VFujB#K'gfFYaWN3
%UR\(kTJC9^@)8[*JLl>SY5MmdYtd;J3rj#@B&s+6@+c^DEEE"_'O]@O:J)r;A&ji7KfP$Zk,;:E4'FnRS_5/-(4e*'apnJpbaLo/
%A`,hrPtM4:@],-Sb$8*r[iQ,BNAPaBk_JeGFTONOW[7(4BsAL,%grS46J1#am[I^2;N%g/4q#o_Gss&+EY$Mb_AqWE%)(pU7"X+K
%l)8ZlCP=Vh-pLB#5p1V[/LH\gRDU9meLK*P,q!tD0O]sg=@UTN=)qtbnSs*)V/Ecbb]?M_0[U3V"Ees.3]8gB$u@1D4\5IX236:3
%MRh1s7U-$"./)8e=ZRt`E2YU.X#+'2-W#OZ@]]drStZR_Q61<c18t:l8GT/deS,>4!+;BI<Jd/\r68eafP*Am:4T;T^]g'Y*\4%i
%3u$*h4$lGjN@jJQb4ktu!eJKZfTJ6><4d-,06fo&`Q03rL[:`jk/"KV)'db>$7;T!cH/0_3AN<tbohS7+Ia1a6A;-RLkQ\'_l+_L
%&;#Ug\3,V;$Z8R<kY#l6KI[!+"Wc[A#,bCg8L9mu_,^:6UB*fF'OWM]Wos*`r[]il0aG8g<6d]@m!tS@G/cR9!=X+`%'.-A)%VBC
%\4fF0`3,.i3Z9%%E5=WaR6_*/WjM!+dtgJOd^pFZ#9c65bpQFQ'Pu<]-N\0[qJB-B%\WtUE3BfKS:@ELOMjQh00#KG)aoEQi?a*h
%2$,:41W9C@ihN)QSJDre:$XdClk`#2+Y)Nk7eLh0K*Di&a(0<C<Ii/B>p!`(_GJDil(bEh;LJ"L3*7")9H+;f[uD5PQqq\M@Hes6
%r&#mn%XAds@=s)_[#rd6WY/0kf,.Mf5RI2c\\pp0JfCk$Xth.c"JmRN1,Xt79q?VVpoLW.m$pKO!Cn=)*nE8nQr?*J2/`:J89>FV
%'0Q1T_^#oT(*q?UV63^!(3pdfH^JLg^X@&[`)<VJYA#Ih(Bs9X[frTD!t]t.[(.k*_.31)D,YB&9#g?jQHC_*8M1srg<iTkZ*^E#
%S\dPR1.9@l=&LZf4%Ou,0c:`na%R:=?4etZnhq7!j:&#hA((!DC0Vm8eWO!-o)ZN3Xt&6qgLmkpMW9eX/?I)q!2S^1j?dZ5l0i^S
%Z$1eqjK*e:Lf%d/Z_>$qk%!m^-%KA6%mWm)XZC.5^d)pJ[8GSP5(Zd`X!XY$j+9=g_B'OQlrJ9SaFc+,f?>ocecc%-i1M6F6hfFm
%Fc:.Lf/S@el-N)Re=8g`)oc`;JjPnp+fGIHWaio3Td4Y$@Y-EB:GEE"6GmVI;<Ke2R`G^jM[DG+WIO,)c3;Hm@_e;?BAC@?bs'_F
%1FcuM>K-&5H>T*^i`<3B[RD*28K"Rn*pQip0UQZ5V1q'\+XNBAX7?[Qmg[6;a#$up!RRE5eG/17Hc1os=fjZ:Y7:4s9.1QYlDm[3
%XlkcgHpgD$#XR!mEcf05og9XsWgi$ca/%i)n3d`7i9A<s_oCT=kTXlo;[Q[\W:g1Xb6.bH81npBaOn;Vdd^7<'eH*'$br/$\6qYE
%i'WeYd3'"V5b1S+)',G=RJFEK.0tj1$Pi/?%3GUDKI$YsdAq.W;Cte:P#sXP&J_6:K\D>tEk:N:M?D_77mZU,q;TUQNE$Mi,Whah
%0l%7kE(\g2/76Pj+bu05*Oqc>-932?%)$o1ND?112Mh5c.A:F29U"s^AThPa5e)UF>!_3'(iP^V-V_oUVuT(=I!\a>_"nJni/R#O
%0d"hZni3aTL:[^W1SFi3mDQ6$GEqWOOb"tBK;o0hVIiI0MK0uc<8gSP&V)]GqgM9,0.?-/AO7QjY0,P;0jq*5F_V*%l:?Xd"rsu@
%I>sR,,\%%)d.kd5.10&!pD(JEYZipWBG)dMV()5^qs)?[ajF0@RA1k/!C((#dA?Jj>k+'`!+`LkE)u(#nGLE]X&B4ZJ:U`E=*OM9
%1@AP5-;E'(FU'69p/*\4.&bPTMgeC_gb?3iLFB^ieDNjQo&81T8#;QQ@e!<S0WWsQlN;hr1D;q9Je6:)9F57VDC2:@.h$gJE!H7J
%hfEF$+$dtp;UQL^FdQZlpG#E?&g1Icd?Id.+OE_l:l@RumUs10A;C_(+dV0,$CN<[^j'X,kecBK[H:SohuJ#J+NG7dE6PZH:-kTM
%V!/nN!T7(<AV+!eGrt)p&1m"b,/AlD#H%rRbu4Zpf.0D=R5'X@OH/i<r>li8UtAYEfJAM2-s873a]ONI+J-r*<=l)A#r)E!#r&gp
%>U([1VPk?IA8s=qJLP1"&<VgnKEOtbI$pe']^!,%"hkXSTJ;![a\Lq^&4lLpQoi0scqIBR(-FiJ8ONX_1GG'AM#&pURFDb@dPW74
%SQ@f^KVW$1#DP(*9+9.&?_X6Z`5)dL"<\JBmOQ`=;596K)790G_]cEQ2+&[NP1(b4),Rr\bn97Xnm9gi!6NA,\YmpcAS=,IN5]1(
%\VfVQMsD5+G*Qm[g_4sO:X#;uD@[aQ$mEQ<R>;JjAr[_FNXq,*2Ok4`1GJIL&b8(.-k1n#)hqp5?(jU9l4IESA!9k`1Br?.5tVZD
%CcQ;^fQ6!g5Z0V.f`2:#V_Z(RKtP*f2VbApVCGN)4(/ZXC(3(pYON@;?0JDjQ`At+3nQ6Y!=sd]:kh:mj9a8U[*4+m.[bh[cduQ%
%TU?i&&orn6D6W3-r$FB^l?t!*)aHim7P;4Z+W$n-63Cs:,1[%`@<ZlP@841@%aN\i/t$F6f0D/1JfkcBW^[TV&_],leO2<rp*[QW
%p0,UdW!,Hc4cu9Q;'%/`!+/l>2eZMV6$#Du=ahkp%2mM66k+mLi.ch6&ZbJ"Ve]FT]%YL`0@1Ud25:Mi,)5.cL>*90;,Va8njWlo
%6:XI=@`o`X*hQGH8Xr%d5`?>=E<)LbaS;M##2DH,hN^hr%Bj^R$&QX"#7@W'\E1AX<BVbGUSW\L=kSM-@]@I-YZu`Sk0g.e=EPAK
%:tQpG(KldQl'b42?_OiCL!fE*aAts604_3MJ>*Z=4sPGr`95<;f+ih/&fltWf3J-0'Ze14L.$C4r.7bA@^/cT[Ws2'93h[qnoVga
%6,^R/:.]6F&:/tARP^a49TN=,g!'5&SoTH/g*lGqEI_#gAY[1:%W>t:nshuZAaWr`A.nX)o>(VNbQ_9ijHpL@U@Rl^rcZ<u?n*VR
%^R:ICje6e)ht=7UVjciW\;M,5d]+n&GR,Z"P"8RD<8J\\9?[^llZt<cR&R"&U`E<K11t;!+*%9_-L;uI(S<K.+cMR_e0I&Kjl%U-
%V-aSaA)ZRgF?Cl85oU#DAR`M,4E&+AZ8pG<8XS29`g;b_q?bP`-HRgg$`(eBn=:_6)D,5K)H.as:GRr(8H`"-N<EQH.c%?s8)c=$
%HjW$PK`L"jWES4B)iYAD.U&YJ8(n)EY4\&nG@H,^<@epJ+]:mZY-&.5jJ9%?HsEsNGT0SHNN(Ee*Mt5<e7h6rXNlJ36,](`3jpR*
%f;o5[SqWDRfZ(-D;LNg:+r8[aj3<2h8j"*A'U;+?"t$^TTM-[Y/5r&c<TXc0R,H.%'u8pAFo.p)-JEbYP9Z4[&q[!tOT:Q=%M+!I
%&7a*R:Ps3oas,8Z>\-BgKg`@WXk\h#afej[Eis+'6hRYp]1,>\e=`$`kYC7s\rELIU[#W_9QC;_P]GXRS3uR`C5eX?"1,@A*G@p8
%4tjTA$IthcZ[/cF.R["O1g@aQ-PuDF^gnuk%"]Lc_s175W%=M!B9"Cu.S+ZI=H.2?2'ibB%'Mu<"Ch]'^T&9m&A$Ji5EaYp08^Br
%.SWZE^P_$iUuJ1V&[iZ/iAj`Eb`KR%CWJ?sk;RX95)gq$AI('X=;N&)CLM^J,8X=t'C(BUPf_eai0:8BP-S@L"VmHPG06">\'9g1
%Of[Y%J#co`!)eDrK-d(QGi7shaA6Se_o2TW!!8>'a)G=P`<f8gg4Z4)p]UCsXu`.?<N@5BaC$?f2[B\"?c/.fTHiRJWE_KeS#SHH
%=&F3IV*pS'%+H)Q/.4FARdmU9DK,_@CX9(<l3m_``sBSL6\Vr7COQ^]aHGCKq=T;P.Pg"bc8;36i+p4EU-KHUBPq8c3_6IH&;[)i
%U2^BiTapr,!5@T_;S!#''SS8A)TtP)/Zn"4XA8pc&9\"ZWU;_'$5f6p5Z>"aNo\dp'<$d+<PUo"Lu:FY#$^@aA7QGZ4mVtfjY/IJ
%U($"J4`,Dclf,caC#\Vk8@\h9MDYb*TIT>o'u1&5dHXtYL#RrolD&C\6:rC*NO#>*A.p:Wdq`8?AUgu^;!JS/;QD9dl-PMQ<Z0*j
%A:\]Z3[ZW"=9-M_0UXhu)BKP<CaQ%^W]GkSCn_pb:Wgl`TfAX@+*LYQR'1^eSALXmR[BcK3A#G9]-rAl]bk])\Je"1TN%e1(3O)W
%8ce81_NRp`Mur0i\ZXXhK.NA=gKr1V/A5.sa?acXpu)tX2TlYCVcg,I)e1df@LqAa2%O/6#U0?noRBRQ3f7a(X\XWg5[TuB@Z-E9
%+aHQg!md8l7iQ;![F#]1Y!iGOD8(toj=/)a.\:k,P?dC[dJspmfYZeU3__jGK7W52JCgr&V.3l/eL=s%>-t&RXt_fL"T!6QA!Q:>
%WKI:$EOZ7`\>Bo!6Cpak6057Ulc"M@"dtR[57"tjrL@IE3@+M&TlR`d&BRLbS[]6(Kt=faG9P">@cW[RiE:.tb2h*+/9h@u%5(>^
%MDYkSTePVFAW9Jb%LW=gW2m]r%??uaF4+#\0?5ODB4BtMUU%f;ceb-C[#lVN_uC0b%g";*M:rbh/Vr6LfO+dsU&Z'Jf&@as_07Ee
%a`e3_d<dc1p?**O<@X7LKT3V21"4ThX"#XOaN01YLaOTgRA'll+kr-QqgaZ=Ad+6=LOuI@N]b1&Y$>oL!U^F4U4=<_<X@s0A]-Gg
%+fIcU8J_H7b)j9#+G7TR\n#mX7!CXF,N5-*l"1*coc-I&G<ATS.3k62/tHAl-I4.1#(o%AD9_h>KpiA"DbD$]!ZMs<8ZX&-:(pGo
%C^P]IAI\o@o%XJ$+i'#[OU0T?fe\4WlZF)77nC0W%!(U2!<8qn.@nS?*.uT$$B#I.9S8!e?(sS3%-\:M%dY%'^JYoq+1I(fB4YZK
%L3$TR1'eX0#K"ebfo:R`_elt0+NIO#%rd9^_DgF8;Ca_^NJ$&j#]eWAZOeK]ZZTVPJ.Tn#S[;D=d2k2IEY12X1k8C:&r7.?iKliP
%4*r>@mDM^\r7"G?l^/[RInn:T'S[)a5]@,\:,XK8_%!07Z0n*3eu3RR[U]+nE"Mq;I`Qu@!6&RE9$j#cCt/fa"9pC@LRfPSG)>MB
%.MUq(3mbY^7tuX0e_7rm+FC@WJd=XJl&Og$ZmmEO2Am0ElB1$-9OMe,6un1-_.pd@+D0t$m')74J?hkYVP!kj8SR,WLl$7_J0;o>
%Q2*OZ3nTS9M[GdbS2%h1-%#d0;K2He(!Udu6GZ"L%.')I$=ffpq&'3Vl-a0;:N5,b!&?$Z<8+AEPHm3MJR\F'cqfu<$G/I$J"a[J
%G)A:*7-hGC.aoW"rI@D!/+G1S`$N_lOuQ<l>\4D$Kqli<;`s")2I/7S0@G2P>*tO8&N0fXP'BUOIYI^F1m:k];CY_4>r*nhXoa\&
%:]`pAj+^\[\*>7%]d:lq>^XDsVh7V"0L;*2+B4hXK1T4Ki4<M4(-03,_F'/H6cb1=Y[VUY7=f/L:Mkn+n?6r4<fIbi,RBp0iL(!)
%K"Ue66=M0a;Y]pH6QP!M3eFK_#c[jnRC"DD;>P]0BB=hZH_u961I(i*&h?r)2<8D.238Y,<j(<%gge[,b9'9Cefu8?1h@TG/ufnT
%%7@-"lQnmcD7W4n-qbF(NSDX7hYmo9%)Wgka/*7]4"fSe@O)ocipDd#m3cOVgSk/8Ik+hgG&ZUZ.0Ed&rS"JI=eS"]WYWFJ'[R+:
%418ahYu:HX!<0t++R:H2N5]_JG1iQ;r)8(#;0hBcKIi^N'Su``h]R'uBr-tGHag9WHN(A:M4(`YBc7m6cfI.b5L]@CIs&j@R/`*3
%5p#n%?Yo77`_%F44l&WB098@m[&$h_rnHI##=91H[K]0=M6WkQ5Di&39)RS?>"fIWU.l7.XRN)LMq`O=h+4!Y?[a^Eg"5j`cZRcD
%CDq"l-k%R:9Ym:=X=,gUHH>V.[+5Ri>R<8\/3,hAT_[MkJrJG0UY-@NK*YSqAI3Wcbdj6*:</=Kd@@Z:WBBm=S2n6]3#AL:*Z`!j
%:qR4u,>?gU1mGf'@%sACIX4gmi5mR@m]5iAMA`*sW6+.ZjN\!pLr!h-`Eoo^[b)%5+]PVN>6Aq0muIl5&'r>kX:s)qgGbQ,dc#-k
%q1q.:8Jm2/%,FM-j=\GIes\+-cRkH;$*9?H$HRFM?lR3<hBXaDS\t@WM.H[_8=.4Z=R&/!^FQ(^aPj6q`.1:ag##.?fEiF*6LJ,5
%?7HRD<IsT`2+Lb)6$(O%f5:8]X4Q/PUX;0#*'HD+-.&;L5IC!i*W-[&*C3gH*@47*FesG#pjj'*@WV%06i+@n5a-_OrbiaL&`f/7
%5OlW<K&6cJ<5EJu%O;adi!JHXGd[?Rh$uekk]Ejk0'<`%UMFnl<1.#^j_J@HDKUs4dNGDV7P<U+<[B^*7N3Qb1E"]._rQFT[\'Xs
%r<VD^WeSZp1-MN7!&.?3]X*]\1^]l_I=tf^c-Jr%:P+E55B7cIL@I`Z4:$ARO5M\,2dcP/+#l'$5WbIu,4p\T0uA0&BuPJ,/:[]Y
%J^,'0"@):8rutMQpMX.`.BU*qKk=W1Me'\]b"]VAK_>Hd42M\N_YR6cD?tZA7d'N""*N+dZ_?8s4M_]dX(lfS_P[+Jckel^R/[.R
%@)uIM!Nn+bBaPp6'!ih\OhsWkI_NsX<#(g6]>8EZRo:<1&Lq3%,QJj'.RA+\T?'01:tVC0m"-iF1`:@$c@E(Ha`_K446.GRSr'TY
%_^@u@<<A=eC+Rcg;PL3NM.hAPh*V5H-\5J+AP>j(h0opph0qgYS[PNO=[kSoUE@VWrF!cg"o_/`T$*t]Zg2<gND"9GktG6_r#.$-
%.58m2RpR.e#/iII*$qM;d>2m@`J#uC:?5MoM\a(9:tP1?.A-Z>*d^Ngda@;467Km\#VF[a8:ZSX76HEc-M0_"^mB2t,8/.&kEss6
%Jm'AS$rrGr5)PAsf9:d6dSiM^L9)(G9NdC\bQnm3(fCB1#Y'C58E=\fjr]c$$^<,s06(M/TVW:,"i5e44Mg,#m_e9>q+N0"GIUU[
%1'o#ddVCo9SP-FmTe`X$RLL=bKSR:WDhgGHi/_;C=rFoA#Zb9,O?@[u,S(,HF.t?5Mj'_l"FSt$%,:d`O6B,3D2*?jkjHqcX6b<$
%duN;k!dCH\'QjN6KL&R\1]3G^48neAl2UIT_>i>_.K;td3eJgZPQq`QlOl=#A>#qgTeE:X\s0DN1#'k^.>gfrr4nH?Q1AR@^>Lj:
%:b5K@]dn^W\_k4.IX!,7_^LZ_f5P]0Kd<U;Qu^5N,_DH'I2HD7d[lXFj=UUU,l@c]M6;TS`ItP]3[?1Ig"'`=EKto&U\fb1"I8F-
%i:KRGTe=#g.)eTaK8T[@HH6,'#i1+l>gPc]%?oOIpWNe'6DHZCTa)Q4&K)3OM8G`U5-SSG;>q="Y'(qf9?rQkpB7GTpt7;e%qK\V
%WVKupnpqtW+9/eg\,lk1%)rG\IKSN_d":/>aFro6_%W4Lg0e88"@GK*e7At8a=`ug7?a>$\E(P-U6K1gU@8XIP@mnS4I%6X+h&6J
%CJm]p-+A'^l%Q7C)H+C-3C0>hOg58tS"hOVC>88DFaUpB3eTljl0[A_7%Fc.W9e.1q?Cir4sQm/j?KcQ/"M(I"O&Lnc.T>k"E$#9
%=kb<25kk?db7[3$C-WY"[L+/l0l2VPJq(rg+@<_*/<H^YFAC0G3Eo3h1220maQ@S]]i-%Hr>Ga*&i#D8"L:5bj=,+#[UFt1_C-Eb
%hE)YN*Mo<!mn&psi\rmf3,BRq9c_((?h#%oUWP17'nAN%ngiUq.eb5BoT$'Vjh#=`?hTpp4a=XWRkjbWd70b&hI-0?pHt9kK9hq>
%[OR8K^/FI'Zh\54H7O?UQ`p)M&nYF>T`aGn`O/C3H#V_+4CB5)rCUq;fB`J-$8$@nZ^5^Nc_=u.`qKeES*I[g\bj_QeB>i.6!Ip1
%Wu(0fX-]H%5I+F?n;>IgZ1&;do,aCOH7f0\2.PluV;g%'V&6DUmY;D'<J]mYR"NR.ASoe5]1<ag2E`4U!CpbR+UaQ03H-!nn74J+
%_ODbpS0=Ri&Foi8)f4<@-,[V30ng/a9*2aD#[fSn*'j'POp=uR^a7&[_Y@#?pq-RE^Huc:[O@HPrL;8s[_G@05_`kS72Ytp#s[A?
%&YX-a,KY*jMNAomqgmd[XneNc8!NgNNXZN_K_C0s%h&q-[htfuN95)2PQ.J81^&0A5D)'W*8,``ETn)=&kS=-XUgaccC\j6+->Mq
%>_.MZ3s@Z#$SS;pA:GnL8;4B7\H\Ql*0tY*$]@H;%EAT<2)8_a*:hTj@>(mq.#X$uZJRZt@G*D0!?dL[[Y13O.J:3jl)-O3,u"T'
%#=:=ZDt:Ib6m@G*Pk@1+QC0?lKl[7QNWNbrI`W(hj&L-Jdj4o<V4Q:T_Y7IJd."l!*'Z-G6%tD=dK`Yt9MLj;P"mPlc+BJV%R,:>
%[X`!GZkh@S%UE^'XDH6nS+!oX&Yr@J:T5#[T$AM4TJo(50M>A1)Ck]"KU!"lOU6N/rFngtCB5D'l2FECAO'Us=Rq-[TE0]VqJL@,
%4AEBl,`"2q:529!C'c(*RuLea<#AH!6.,F]*0P'AZE19Rc\-%dJ=H[Ueg5PJPT,qkWY'&9#WWTB"a>%1F/66G$;pLN!b=cPe[1K;
%$^8bN&V)'8eIk.JpX<ORq=Z&^[E&S5Gi3OcWW0c[8/V2ZP+9(VNtCSC@)Ke_A@c/;4[b9oAg@4=-^VRR]k4i(GaC&S?p6;bqnf?7
%Jmp^!K*l3\W*:T1;fc?TNs%tg$4:943#%,]49@X".;+S](mKESr>RdN_)V>B_C^mZ-N&Ul"V]fmUi/NWSIn@&in\$dJCV^`i"\n/
%27iOh%2Gib*_1f^[:R(UEr1tKJS!S_<+2/;UCG"-*hK&g93F[iS]KoGRm;S'R#GG!3h4q-)hVgaK$N&Af7hq^qWW$:NC3:cVM49M
%Q@S$)j.UN2\k0ng#*<9I-Kn7B0[KpUFuV!+-esfjm8+F$/_2ceR?8J9-QtW(&<>[#Mel56dO>,Ni"lY$:(k8)fBu^p/8d@%ReC>k
%.:P*sP"F;9AuOUWWCN$9A_]EdjK-CLa!A_9G"j3j6V@K2j"jV'68J\B7Z9YpFo,g;_#a1m!0]e-^m6B`6C2aY8RpZ_aBVdm[meKd
%FY;>V"mK^/9YmkFF!I#`Q(`&NrAXolB9DdF%u]id<!dPs%TA`++^A.9$;:,[TFB#KjIe>"iiabJLqUDO#)1A+M)a1c5tBp7LJAUK
%Fot@&nXu<DM<.?C!IqZMJ8S/1Os#N3arK2cj=oprp]6q\m0>Per.I<*;`jabJD6`O^9MCSbj[Pl1@uW7Jj:?N`1#qf?SJjT;f^lK
%=DD#%_76Zl4L?m5&31m<5aC7i%<Nm_L9g#NL!3!5FI!&?U5["f#\TFa"@[k=WZj(8J"R%FVm93*8J1)dd&Ki9bQP`1fsBj\[GZS1
%fsWUdT2?jN3L-,;34Ap-AR+qt2<CF&NsW=_1:jM#<(.C4LodjQ-IUY3\!HYBo*(;dfMe(N8D^Aj=6PR65!iOe,S3Fn[&UQVMR:Qq
%*I7^I$mR=*3de'cQ<"$`UH,T^iVVu#R"]+[\OCds3!ogF^pDV#!\ouPP>/YpR4E9iBUH(kLD($i4jkVT93B,UI0f(&/14oG3CcX$
%Gb?bQ&;0:Y=MSo$"X&'.Z1c!9$&oLF5k(Q-O8KF5rW?Fu.K0Eo@&fH(a+%P0R_KnZs#*GloRE?%[NO!7e9uu)2o7V>X3iO+F=`1m
%+^-bfk[9L#e#*pZ-?0Hma^F>q9O%*EGq1QV<+CA(<,bF"6!ME3+Ys`b;NhhBij:u0P8N<'Mb31]2el5CLgAc"%,?[7r1$T.&G7MU
%4qKMD<atu:+i0kL*#6QM'I]q-`EMfr!Y@JgR,@s2NccIf"_X&GV;a,Ub]HdaA6uBgI?D[2#UA3X'II*,+lIg?+49Y14:.%rhtnZQ
%3E3=VH5OI?ZEH"=%;;hA&i?S@n%mr`K=!*ogni@bk_]l1_bi`ZQ!I@&b7G>.ab,1_kqaRO7s:'BlG=(QO$3-i0NG78)b#(fq[^d$
%>7Z,b4A7R/$2=k\cbiOpT%;hV6'6u'r2pL(9caN<+G1BZr^8"[SJNZDOE6+t`X\A*0UmTP5Yt*-j#DrWmOhTV8i3^_(ZBMS0oGdk
%.ncci`R2%7:eY9o-TUPj5Ac.?Bbsh_T,eUNP!!3Mj\Htm0.;k@Q?bEQPtfWM&Ltsla_phj`tN/$i>GMNdSgW=;E:Xkn,VG_TrRku
%Cf9/M#iRhI@C?IYi@pLX5n^?F>al%dSg^[]aIgOuapG/$"]fK>l,bsm_iB>lJd"W&'X0Qk_su%mA8U7h3\G43Zp@jfUL]sr(0Z!M
%)-=F.Q`CXV'>X[5bg@e!<ME"hrAK`hco(uPed*s[p_k2m\;u3q*gp&\i_]/uTP$&*iFf_j+@s<^9'^$P*D^dJR7Qg@BDBVm+l=6;
%rI?nGp`gV&S;rXMM.RKK5h[h$N5e0;Vea>)O[:2A6F/uI`ahUI#XdVhhdAoZ).4$"\gd1=1MpI@H(ScLGjQ%T"C"g/^*Y.lTrm9<
%o!s24!?$07hhY5hBR,5#ACiY*AY=1_+fkRWp5bL4,DT-2_@J&JUl5()h#o0fQ.'W3)X6KMPTjte!(^9)+UOAnp(bETWf.cjq!^)$
%RjbK^/=8%YkqL>C;*hP`3mf4CHQZ;i3"Uo!N(L*+/ca>L8Qm7+JP!p+IMNM3RAhT[/fWV'S^B*-`^3$T\]sW0\1C&SSZ4+IJ#Ol[
%\AP)`F:Sr3B)5VJ^@GLJ,JIWoV"TX-]]=KW8P_*?U'8Et.>).SrjrRGbUJPa/--Fg6A[$G16j)WiOigMnS:\^H[s#l(c)$!^a,$V
%5hhBgK>J*u$1^l*QA"]8M_4Ep9t%Zr25+eBRI1+DdKSf0NYI%n+B&WYP_fNVa,G?2_G^3q"c=;YhS\@ZOhfKd)Bc3L7;ngWW'l(R
%aHFd*)eDVn7KCVn'oCNCNg!^YF>b"bV&Y/Q63-ucVBlo'+S$57RfO5nN?['j+MPbFa.f@A!/Rj.S-di,W!=IW.PXZLAmfBe7Gs-"
%8sj0V@%^n+8s)G,,S9&X^O)(THkRb-aT,?R3>pInS=CKiVi?$EMK*7rAh+2h:NNN_:#a9eG>6=7Y35Tja,ubB]5[(6.7]NDciJq7
%O7[]66"$k<!\jN,m#DV[1c^2'$rB5=i@J'Q:E&.+&?AJIf"etA)9t'0/4`mKaB(sm-6Y#S"9>qA$'6&ko,*-E9j&?%@GNXdR\b'`
%qWAFm5;7b8Xq#Z&%L!`Y=[6cd#Y.oDB08LE@$&jVH20Fo9+Vat1ec&QWY:DF`G'`3E'kKi2&9j7gEQNVjcJ6*_=>AVHtSg%S[B"X
%abD>;bNOmHeRP9.P7a@g*`LcUm9L)5>s(Rc1C`S3"].c2#oa.n"du!)`Xr;\.&B9f#uX'U=;69t@B)"m-<j1k@d9Dqrh4hf><JF^
%%L#\uT'>NGR?5lW>m@1_TZeUU&n?MRZ`lp/o,JFHPM$iH^g.J3BZ:'k95#^RW<Ec"O1"@Ys)&2.SqlaElC,uc)1S'rC]!&J1O&q9
%j:!Sanfq_#Uo[h:mk?aN[Ar`oOO+Mr@;1CBaW1HSK]tg^X[J;gQ;6*b%"aBc;8uSLTZ$AR?rQh#b;]UVm_pB9]%\dLcq"2nB``;T
%!B5fF&\FBK$OHL^`6DM#"F*a.CEQ3l;VA$P-!262PGeVG1qFG(<"2UY&uR4PjN%W!UFD$Vp/7Y^iUn.dGdb`Q<Z%%adTOYJML_h,
%E;VbN;)fO7D4-o#L*D&e@=[;aU5sK^ObH2(Wdi&3.O9X*crB40>@OE8.FVb(7%LT=a?*-en/"u^;OVo(+%7"\11Q/n>gaC]flO0<
%8%RCdaE6U?>s.+oEoc[[aqDh$J>P^c'L![:$(IG68K*R`:&j/DB-%pm#X=49OaOg'V:?Ae%$gAj&lao$EL3?'.)\Ve?31'pgUBNM
%YQ$,o#]=i+HERnj$0S"[jJVJZr&0_"adp@V;ou[Q)Bm%(NGF-,A>JUr0/d8o^$QC5eWI?bbh<=KUjrGL1M"!%181!>+HB.L\7?c`
%6"0sX:g4T`_8FE]3&R>F[fqMH=LD%N"#%*<FGA^M.If0:$[J?GJrB]iR5(t!1b>F6"\Tt%!dhdQNVI4/C)L9'X3A,Ke\5",gFTo^
%K/\J3L:Q%%Pa27f"lb7Ro;`;tKFHX\&Me]uDI6MWIA(6J1Si]jRB/<Ir'a$*QPn@=/\8[?-qJH.'igkNWkQ]qPGn=N$)B41Y(&b>
%IA*e4G=eG\`E!^Keb72uQ5B/9p[tW&gR^!Z=nXkMU;K[\Ku)1hIcK,1!k9X9KF!T9:CH.:Me@q+ihNCTnbDdJ59420Zrk"Zl!-pV
%e+.eYKFpaK[u;p\G"LrJjf"\%qU-spa018\eO?J+Ok)sZh]o>r>lON,jB2/SmFG`gh6O_=pc[%g%Jfhj^%gr@,^en<o4<=>g%S&5
%ij8*9o3ZAqUNSfJTl0*ZIf3RC5M,RE%=n/uo5t''g%T.\0/o/)U]g%J0&&:hOJn&P9IZtei+]Zh!05j2.#<XA<!C337[8ZKm?_-u
%r&n!`TQ`hi#!m<9C'00A7MQ/*YY0,3B:[14O+q"^<2;kQg*]&5$@;Jp`<%:J;D%\&o99X$_KMmpGk`9dL)=s?MEqcFX(:jiWnj"(
%OEc?1G&dA*LLj_,L8ZRgVo+_@#a*l*l3L6p<$<F4@'E8oP&nuY-PpWDlRB3]U7)G#hQ<gi98RC6[#A;e8roiUFSBol/`Kp"h?%:*
%eQdo0_n$5[#,BmFG69MOq*$:Nr;41`e#dG&!E%:!8$@3?>u/KV)):hgPSZ!$*TZroAlQ]m="?#K<<'"A[ASG6hKd)WK,<:a=/$a,
%KUnnPDNaqPn:!nd5riuR'oB)1)cG=agih]0[ri$rTY)cDMEO<=:6oJTSF4Z\fH$9#5DR\()&t77l&O%9nVC)Z+^0X<4As5!"OeaG
%:;-b!SMH.U[5e6$.hU2h!BDANTrN2)&W3:0PEZ]D\jIP7GXT1K9t;TDIH5hT("I!/baLp@SOeT*OqP(til%bmS20Dkj7ep=W+n(R
%%=Z3iN^Qr.JUX@:&W4/QfMB`9Eb(=_c"'U]9."G*^d\7Jk9J%`8:IkcbRJ.d[!tiXKO>c$s$jjcEh1g(%OJJ5#'Qg;'6oBZ8NFc_
%6&"I6j[^-0=IDM1,VMQ>'0!26.4'W/n5BIcE**bd.d5;$gS/6*'Q$N=m4.;of%;idesSgi!h6P4Ub&@toTX$?d]!dYn2D%i`(abB
%LF9"YEo&6-TF>aO,:8L@=JR>%7c`<G\KQQ>10'A,_#qstJ[@`Zd?t+Z8*V7'H@o,Tc#:[CcM>SD";XO.-@'hl`K1X%faCCMU*GmH
%Z[g"#/HBX?kY6[r[ns2$LbJ6[#5&YS,Ej`H"rrgc!N#.:dkKmo_A%$d/^ef?3\SX/C-p=GoE^6b69WBmB*$[*I^AeXnc0u*LVRQD
%r6^31j?K>c.?o,/V#6BD9*oV^AQ#mGE$@V_6(Q(UN9&FJ?&NRi'u\4>%$2tHBaeh.mi\IaUeG3f%"SJR.'!sR1*NnH:Cj;WU!2Ha
%FB1@a%n/@dIO]Z27BeGd9-(WpOSY(K"1tS6T`H37Qk2Q9_n*`7dYXUrUCdX7i/,NPaT5[L!XJ!=A29)^l-(P@Pu>%6\ZO-?87+lK
%d"'P';`\GjUWX"!07qJF0sT,`#<4=5fMM?-6<L,4a8c7-<DseFD+b3^i<1,-3="<?'(B97B,<;iaPT6A0+:=Mn@E_lqf7<4]c@-'
%5k`[k`.E\uCa`+\I40b(V.W7#0g\uJ$Ij&U;*6k,CE,)q_D>c=<]U2b_JruqY&)rI'VDE;VAFfBT2@&34+mhUPSXm^A]Os,IB^i;
%#:#3=Ro\Ik&JPdcqUl#]k0ocXo)2%\#WC,M?o/R:&09>[:Satt-dmZN5\Lk-.<2q7Mb/N-#]].W:'Fr0>krMsDUW.AD]F@"R8t0P
%<<a(f),,u#pBW8'68Y+tN8cKr8chW<HGoV0;^c<74.o0UjTpc9VHuqOn1F8V)0CbS;*aR=2]u[9<B8j%n<,j;16=F35X*SNS@W%D
%&nQ9r33na@7`m]a>tQ!<arkOo#'GHl.(P@GVC#ac3-?Gd0U-IqiV\q1O]de`Cr".XqIIFa'p^;13XZg/ON6$O(iUEa-j@EuZo3Kk
%1+20#F(DYRF5K1j&E!fs&&J,PcEic)j!lX=s%E2+A1Q[<SA-"$7)3Id**A,6kWgK*KT\3V[2JiPH$U1MKu7J`RgX5Y!(s$b=$Zdr
%@NK6cVrZ$SGp.g/9c8EjA5*Hbd"Kp-E3<rSMA0&]g"R4l*JkDJk0q9$P[B)-o$abB&/.VM6\[jhUp)D7`SQjd?k@X;2>Bd\;5Ol"
%]\t-US]gt0)q4:4koe!&XB('L^dNI\OaU#L#`8VWE[dOE.pQ0N+9Y.FK)^sURY&D]du[Z#/%cK33$"=g0$K[eBAt)FdhNRi,KHb"
%WB)I3CC-%-\:R)):bb:7B]'M@*/8'j6rT$*[K8Qb(^V7Q)%jNG1/DI[-qP=b`A4O>iRfbd.PafSPX,W7pade^N)K-S74:Y7B+i`p
%P`Zg=.WM2dE"&Fr)m\?&>oo[mWpZc.e<%<Ld4_kTOQdJ5!+[G,ATKK_UdI`4W$fV.N$+pD-;+LNr#cp#6j_sDQNg8RVBj&&"2"pM
%U*7l/aG1%#K)"Kt!RJi^Od1AUfnH4:"86&j'$YqkM1/;kBuE@Of-J4R-m'2p)Cr`aG`.tT9;.QpPVXJM']aO,N]+`Liug(FINhF$
%C/V&SS5O/COHHciU)J"[&l6k"@Qngh,KlRKHV'%='I9j)GXR_C$.g.P.S:N`J-9fN-q?r`@ZMtETs%7*3(5EUj(_2H7(G9;4ZT?F
%`9F<7E!`hDiApt+=bQ$NF5CndT,CPK!,p=8Vd0:$K.MH7Xr1bF,.puCLOc<N]+:&?'QEQ`-oM3tX";#[\3mO_)Vki@4uSUt3!sTQ
%.&XM6qWZ]EOiW20dC"ib75U5Y!*P5"Psbg;T@=2D#cJ]R0<s8P&LeqE+YOCY!)aCqhc%UtX=&k`l8fLgi29Q&^*s#ZbK7.#$jBN4
%-d>,\<?9e[`^$=+8lM[M&`3%X"%m7rQ&6,TN[jY-irRQ$/`BKF?&$i]5TQVUhu\7:Qu%d0m\$N^fd*g<<6?,s==/hR<!i""AIMpW
%[MUnk8F-t)_-p#eRI:3d8-YoAP(D2[196AqA!ng=[rf<AUP3:e5dc?j4RUX7O?r]r9LaFb&0gF:%`.?I]cb3hV276iO?"(i&e+E,
%@p>&fV9Jp-^bJ*7=p!<lLg`J4VHXmQ^QLf!M>Tnql4CEo<%&Mck7k'E#b-4X*2Gugg`FCA\;YPrU&i>(PK:aSKgAU?AD/P1D\-mu
%_N\#UG7&1l6B$e^@,Q^;J47n8<"%*@$H5!Gn:E[L);bLo3%cT0@s.nm#(#qW::Qg$::D+#>:^l8Qd`>,^s9/U#Vm5$3s4l4OJ-)h
%@gE:(;`-hQThopRC^C!91QjNjdE7!"ON3Kl,R'auma>RDTVLh*-OXS[o>K_rF]#S^A;\_n`3mh2ZpFFsgemm9'ZLEI("4I1D1bc0
%?rS$F'C21E'^%SkhF%ubQdB/GK>Fm5:Mshk*g2ori8P%%L-.c#8fHIJFPG,S5o6iFS1Lh7nneL.(E#CgSK%"\s1mlN*b*bd8m?h2
%^_m-#bFoo1[%^5u][srS/^C[keh<Q\A6$I5'iG2<#uO;&nUq=5P_\!=cnpJ&Jp2c;OCaL`!&r0,c%99+eKNMmXs66$i7VKo,I@gK
%FF`$Ur)T.n-6Y,MArFRNV$t8#;$\mW-&<db=G3$Yc3rhsS.H[,bdJnA9s;o`99Jn$&_87)M1hfM=!0qTP7igEVe[tL$U%"(Iup7U
%m)\f!W#SCT&>NX815L`;ApEf'!3QUjH)H&#A-M#*3L^B&Pr&g#\>dt`b-4=am'&L%c<c^X&9Oj'.C-!)"2bPdOlP*6OD-Og[W"N+
%E@HP]1:$1[6p6KX!,Drg&eGBi/7)[4"!uVZ`$7n:9SRg9i"4"-O5[p,Rp[3N)?DPU87)_60qE0g-pgC9c'9u;3iSe=7H8>"@&O)c
%;`2R>O*,U?gJ>;MF;]5D`.*T'<V_GU+;Du9`7\P4_Y4\o%K`S^\QY8ifnB*q8PlP;#g]Zr(\<#*7[eZQ271Q^;BB7Z2;77^eI!8H
%_(%=RT%4@&$_Z!rY+T+"E&Qa6P/:eob`l(PeO#;eV">6/,e8qtV1o[.(PYis99ToO&:%YRdU>MLpccO7+!mR-_M>%2idCD+XLBf*
%qcigA#)"G=JDs"AfALP^k6KcJq<7)Hd/[q`U#;=aId1m0e9'.&"5FesCe0SoaZp9U:^6fm,ZB5NdR_J<r1mRYU!LX%_eG//HjqW+
%_oO61LY)Wk5,E`d=GhlLiY`Rg+ec\sOq^(p7U^J3'`B8q%7%-+Y=RdsjR+^$6DK3T%:MaM[l@bT<>mN20fUEbP.;;'&g_L)d91,(
%hFI>%A8YqI[3Wa<*-"O0JW7PoX]/g&=<o,7HjF@NEu&C*,K"5hHN@Gf]hQq1FG<u,*VNo"J>M6tm,P%_IYJIfPT5D@(*oQq.kQB)
%C(d;#GIFYAINae?KAAHm4j56S;P%R=*0,4'Vr**AUJrBi=`M:Yo;TrBA*=?&._<p8VKB^A6EHmS^,^]\8fB9qQPLI(40/?"/Dfsc
%%AX-]5NaIr)*a,]%lH]2Z.S_@d?rO:F^XkbrQ*/N(i`E*+nd>\Nl)I!Rikhsc2l45OLel!!i@/%gVMsHZS#t`7</Tu/0M//W%c_2
%8,tms'TsM'oTF\OY+Vc_3&;]b+dY:gJRP:knIIM#Q.oT7NY!LAZ40_t'Hu#Cr.0J=g"aEGD5hsC/IlfhaIA&;S9'[#9q@eKaf#4e
%&tQt-U-Ub\)?_N;PO+N(k__WI$-!gdFD*E:-"l2i5!sFfL%PeYpgI*P]`:H]fEAp.a@Zm\KB>e:eKoujPB9YA8fHmSA%Y=!H<k8%
%l73&*.BF%-aQ7q.6uttA\-:kSVgBPO(oL,h%qJN+!Bb3SokUS"Ea=&<iJLdOL/gZPA!Nqe^7l7d<b'lJp]b#eT-O"\ZWE.SMWeM;
%;d_smM!9_EJL9S%^a*J*B1D<#Q:YLP/t@op-'Tha%QRuHPp.0N+N!@uI14'"1KYqh;ofYAa-P?^VBZaeP+>D`"kIjIO.*n=5Gb^<
%jQ-DF?7h[<YV+9;Ws_RP4>%I1'W,h6,o?!,J`17_,b6V/)O.p6!c1;BMh7]9QDH1:,,/TG\TSgA8#H=oJn6Img5DV4EJ$V,;i6&2
%%]SK)`0'!PBUfL:2@I8H+F\/T(9-d,2l_EJIZ:R\U!U^#>0OHT":/R2`@a$i[GhV`);nI&)7K^pqgmS!#7RT,_O$bS4rUj5&O[l4
%I3D@b/Fr)I8kKng%S>>!0kq>amL4h6*UJW#6eHQUG#,F;i:\d$kDKkFlSJ\E8T7"a^<Yo*a>cfED[?K;7Bcn@h4fqG\0<7<pM$Y"
%]?ZL9WC(/?>^S;RX)\;-&*L;4OB]i_"NFok+9A$C:0?%T'L1(-lr';:V_BuNU3><2_naB=rTFuV:Q:;BA;hYY<hik+W$)RA8%E?u
%a>?kM1]?P@i2dK@_/`tGl!M:MWc[,bpj3EU)kF!q^4B.076o(U+>8uh.!2AjP.YJEGiZ))0%l^FUoL2J15h@&I`#_M-PP%+P&.]b
%BRpkICo"3XE!N\jf@OE`lPj-GYYVLFH<U]:fT/\#1PBX`p_K1.M^b5)NT!bGNu6O$Q3Se=$jp8[_p+%D6AWO>G]!gtQ*!W3c%=p"
%O]FpT%X/]>cfU*5'si-M&e18ui9g1H\)Rl:%l\mgj[IG<f\&=LOLm\:[Fop0M0"ndMob),B'T:dGMAG"'9,]+Z/+j0(k@P8]Gk,?
%i^P&R)Te2?ie)=kN.23;\g9G>TS%tjq4>,U&>K\u<=.G7)NYZP"*/h0"..ta!Hpub(Qc0JZ3Jdk*=X!Fi@G2beYGdN^itsKH4p81
%E*25aYWR1LG4^7QVBF"E#H!3'/ig:q3^Z=mgn.`2rGa2Tq6J,0B$`ss3EM=R-:A!S@B2+CG66Zn%WI.-V<\8<VOI]=bUsdaE;+)Z
%V%_-"=IBI"6Ui:d.q"]G1l<%mS:(4%1F"_l<>j)ben\ksp1M;B+`dj6-R4>@11_U.,$6f]-9-tCJs/0s8gtj85U`EUh6GZ/P`AS'
%SI?i-fNg1!b'B$GANA1#P-`#hJK%FHWiqMpI,"Y5Gqae#54hQ8&,Sq:mp\1=(t+HLWFX*3(Dl`ek;2ZCf#[a:ABQoWjdGI^l+7GK
%<2\0LL7EBHd3l*:2'`m_R201k`"',9:Yt*813.6STRV(CP7a"+@Pl4_8@t%p]<+]O7U9W-cbN&=S63ij$A4E'SZ,.u@lgE%G%k>c
%@fdd.F"uRE+[N'Um;,Jq^'oW%G;0Xkb#"*:."?3KYbB9S]R<J^0A&Hc+KQ#%MQO8UK8D'oknen&7_'KH(cC-7_lnZ*bQa,Mfc-4i
%g"?_iQ/dGaYQ\%SVTC'RT4XG&_SI<_(Z;l!q0K7j3XOh)PQgVoe_.0fO!s"A>[>a_`h"X?f;]I4.@dK]_I]*T*]3,2$uH$!J"#OK
%k(-JM6QVJ'o'_>5TT?*f3RVb5FG:@3cZ"Q"[1XLWrG@tNEs]Rkcr.HFFYbuafuM-@'Ol(tU[nI8&$-(CY/;-?"%XSh)[u/M/R<tR
%_G_;cH'TUL=<&\:>/9Z"Q\fCGmX$Nak-[_.86lVT2Y%8B9+89]Na]b5H(i:h/B1D1+Nb7VYoNHAUkpcS'O/cr4%C2K)JpZCFsT"b
%!3"t"h`8M;e_4St"kVbXWeSeZAUrF,;N>1U/<n"&@IkqCd:nWr<Xp5CA8N_L-8:f7ZFX`_!'a`ObF,ne0i?;aDaU<P?&&9p[qdJ^
%8dLQn.u-I:IO:tg5ZjWH(8\7m^RuDl2-o&eionph>6>r:\]"e*0XnlI0lC0&,\_ul<rkJC,9<>-1*rklBG'StkTVa$=8)rM5<_kD
%;ohrQ2BV4%)2BsD&0c94mOg1ZO;1t.Q;Y_nTo>[cMJ0HV^cP@>R!"7T7-jgIC*+Z!Br5<YEX4cK/#snO"_;hg`E";bf&R:a2gL+Y
%OE''O>?%;>)+!CDp?*R=<-VW/EeYN?gr@5!@$2QtU+7Nf<@AMbL/:G)bem<;dQN9#3Ln1tbhtU#]"C_`,X=BkU1n/FKTUmB/dU<*
%9N-*?F9Jodi`BtlRVp7n1[q]H%+Q\-b)@2!=<[2#cC+LmL'/]!]&;(?,iG_L3pU/r+B3U6A&0B4`p++<.!G\+(J@([:t?K.Ap6"g
%SVK8kIAq)1o@D@JYUj=N,-D@^6"D=n?#c\[4Ju2AmVe<mdaG+EFR2DrIArWQUKhq-dJl*2;GI)%ITrooLs\-"J.i6<9G)X1(F*j6
%GiS:_K2PA?\UX5(.l@43d@<:B042iYHhH$?r>$h^#JQ**beQ:^g]*]q`=amWG0iq.G86^0,t=bXIpr'M,#UC%U+5_fLS6pmC/o.?
%@D,s6Wd+@JHU.7'7Fr>j7umd-m8oCr\tehel9iZ\&ZVRT\MLGgq4lRf+#VfOgc%Cd@AVYWpSaT3$@S<p[E;gP;6*b;%F6[\8ZkQN
%@[hUI7I8sX/!aqh9#E0uT)N](g+5,h&+e8T,a4Xhb75_C@:JVjom('t<sfOmpalX$(rqcNoRH\_TT4J&]4#0HAi9K2PQ[W`iVtYG
%p1H8<3F7ujR]p02Vj>l*cuKAf;q!j,<DiNu3UWLqiShIDNU&;^BKGe3cYD)B)A\LUEuTSM^!M[MLjjJ_IIUO39<lr<-"$@`AO5i\
%9\&98r]d'>q,kk]V;f:-ofM??:ToT9p$Iad]/*#1kg&oTB:nUBZi9-;6Td6S2,/@*HN(?Qm`0ZCLF)QZ40,73o;NaY8t;M[=Zg/W
%J?WjJA5cFJl#bfK&*-\<_bS2FN==uIk>Ba$OA2Y9@nZ'69S;^'c@;qgI]W+!-rboc>+FD<d:AOe-kNiFps5FsB@D[[DZi?J2ntWj
%`lS'QV>=8IIL%ZN.WltH1r5nK6.>.R8$@N^!3@Y.s&KP"aHc?G+kD,8r%I1geT.cA^;q$^Qu5bkjrn*5`4,e3SRs,S=_)D<XT)G.
%;&$;h.ST"E`BsHC?IpFO)9Z"F'sB6e?1%[*r*ZR)C68p0XXE_JRclG$QMAOb?(^*gj_ngc6CaZ4.5n^I@:<FM[G!b6$<87KhP)k6
%U(NlpkAQ81P11:XoLWk=7'r/]2c3*>9H6"_Ku`YS$)*)Q+2-XJfB>Y;^Fh`u@U/M09WhoB=Ki76m`]=W]@^S/,W6C;VVflk#*u5h
%DHk*B0Ol"t$c`%%aW32QJT>qfnCG@#Q2THA%#(SMLZ^%`UsJB9(h1);M-]U+A"9I>Si`D70\W/n*QQ8!qS0[0$XKDAoPGD&WBc[H
%H0jV2\)DO/lVCuKrC"h[/<W5ldO:X0(OIsZ*Ei2DdGlH-`$:nr?)GhJXdKlLG.oCT3NWu'eQ^?YXCR6K=t0K2InoS>,bkRKrJK3?
%AA+ES\&Nkc^1@M=/W,RG!M8E=`P<bZJ*Xl9rFo)La1#Zfk2,!;4AAiD94#pcd$n_?m5IP,Qjc:I-e7Hflka@^'_+C.npp&YPajTH
%4PT*0LBQ#@7MP;uibc`e<M*[KDWchS:E)X/3"k<h@M)m*p([>ILLh-lGL=SW%tpRsk5`j"nuT"_;#]lM4$kfZJae@:W5_hBTNXII
%C5.q"?A-krhq^0&-KO?FQ]_=ZmddilY<o$94;>JuiFP9lh^[_cZ&EBf.#a!*+'7nLc"UKYg@(Xac.\8ds2ro"SuleC.U2B=QbN@H
%ZrG4J?b(MZmZ'A"_u6"YrP_pohlaBR%h5:iEe:+82e)e\q)41Y.(rpj`]fa$C.jb0gWC=*hi!QEl";D-IkQf6Y9`\JOGL(;[No>]
%"F^'s0jVHI$?K#%:]J<?r!+-(@_/>I)F%Pf+2<Jnr2U]"FA5UI\.-$P!UM"q4I[$u['.K1=5udmW_k@g[cDF]^icGdGdVk1>!;jI
%If=*TpbUS!X4?8!;g9:7H^a^=<SCNTa596.k3kqeY?$]m<qo+/^n5?6:g^=GY?$]k6;%7-X<)pdCq5Sn]XiL'>!8J=nfaq9@>_6@
%+0W\F5FS^h)F+30mf$u!pcDbFm,.M#s4-o72j&pfgQKXYnRIq$IeEL2;;6m"CAW7`IJa^Enul[&ciHR(+Jl6DnI<3@kQ%r921<-+
%55I9e34>LndF^LrUk:.58(@f?c)^*heb&B=bLKro++FK=Il2ZPSU0[AI&m9^qtQXo`;4mrjOO#[bS"]pSf^13rQnoR+0X7V?U@Ne
%eZ9i`.BXf$Pc@TLD%_pf%<1j@k)WU87mF$$?,hn'<C[kj!)\aNX8;,WnS8'u'A<5_q;]fZm]Yc6^JVC=?bnp48`U3DL\fbgaK+i@
%W"jdSr:iS4L[f-VGdVtt&jl/mB)AfLjAZ48]RjsEGX*^-nJB4_"QAib!Vtb-+HC=O:(5RkabVCjYls$u>!QCG+FbMTJ$jh));P2@
%!qJ:]]t`d]n#HWQ^Q:j"p\,tr<t!)'/,Z,*@"5$[`-aFn]UD*7#q>[O1P%NSUJ[>!$VB+Gk=E^u2NU/[#,8(D8B)9a?p'?j?7d>(
%QB;,M*rfs]q(m9nX!QhF]EU9DgO&p$6ce0G/bBAOo&"9iZ!L^%IaAR6^"PbYm3'/sN;RJE5p-NHR]2ECXBD^f:i(bokjGMMj44.V
%:U+pt<Hh,[(D<1bWr_;3!:n:f?O\--%$Q/uJGbDLO7N2)o=nHorZ2\LIpWh6[=A\Im.9KLnma!XEL-XY-BK&,B)dZnA1EJ:`AWIJ
%qX;gXr`3$"1]Nrte$,o&Z:N;)6,([:pCFPYm2o_7\U=@QSo;tXIUu"A&$q\m,h_APQ!_K9rS,IG.YO+`DJ@`t$.DSJ[L&FkWGB82
%N2imB6ZDkMks^`rdgs,`a-hr6Pbd7T.fIs&$)rN,XP\nWIYuAHViskOTL=Lt`Dg+F]LI+/Y%tY$@VjN$IOC$C-f_s@hL)U$Q3NDB
%X:66kVf))`n`.2MB%ZECWP81+=!DL,0:>KDHQV5adK4leDs!+=s/&)]rnQD;,s5K*5>E53[^I/3lf#9;]S_c-s,AUJI=?G=GG_mO
%:Z8cuNUJJ7KAU/KIXc88Y2FN9r7D.$QeL?3rBDfA?E$Hpp]gTXX:-'@s86d]G#Q*K.X1pgT6e%ms'(?M^P]DqS))4UY&f'FMn*3<
%lTu3HZD-:ncE^a!Th#5hd@_m5>t)/[rmu1Zq0F@]kPAHiC*E(Dc*.n9"M:J0\<-PnP[IgG/_JZA9ko0LUW)]=df55Q/RFkAX.RA7
%A:Ds4Gap-]_c0WdK'Bl23\Wj68R#,`:5]1t<0"+r^U.FcrO\nYhgu8_hR%(%_$8et".p:@4-DOO+2.FAqWbic4Q(]1T?@k]T6%>`
%Of_]#Z/^W;D=t*KE\.W=\\99TET*UU^DAYQ^=aK4L@6o7lAs.XUJRt7Ql0]8,!F;$#tu`dc&N#>eb[&N_"&T&PZfW1$I(e3.;J[1
%XHs(7Ro4skdgRM6gO/rS>b]TD(S9crIi-Z5+?3atbgc#kM")N&bI(6`Gb^bf-m4F3,'cs[*@?[H_$uk3Hh4G.GjX&QO+QoB)RZ;`
%n!.3TK\uSnpo!r`:\%A/P*qrlo9I=$[9e;2]1c%0dAmf(d=Y#*qO\kf7&X0XZWEEB=Z-V4U"`orGkHZM@jTmrGa6Gg7/t+4[F-O;
%Wa_1g<W[/qMXM<2r)f:sCW4F^[E(31NRk/TI+,\k'#J_(dcg?RleU1+8-=#'XsEZ+o?N,CMcIsf/$2Y"2a^j]l7Z5RMAHNB7`X1-
%X+&r+oIMC/RBk*,Pl3%t=7Oe+HbEar:">a*Glpi94LooFXW5j03Ys=@M$-%<H\.Im`*<VcURcRI6g"LLRJLlaD`#+Q=e+#KjUuY)
%^+g7K3c\%&SNp-B]]+G?Ds/A*'1b68jb;J$.\!fhfMlHcM=$.Lcc*X\bEg)!GV?epH@o"%E&,LM;^h/1)@O9g/08dceHf7'r=X5m
%UkAL4LY\PXn-k;hXmoZE)h0biMiD>h_&TCCJm[<gHZa=7Gtfs#?4`;&2\F]@qOO/tSq0&n)7rq5g4+-/H]1<lpsnoDnkHNFCAtu1
%WMBBdkj1..>2d;UmGoeiF0k`$#nA;R`Ql+dYrukN(ea$B($]MEe.TI\GfTK7GBu/en?&98(N7">OVh_b#36:jm%T+oY?76ZI1i:\
%pSe,5j>phPKiV@Ck\Ru$+,O@NqnL,D`NRXC'YbfQZCt2R'tYuY]IeHF1S4C,Jb-ftntg`15hdi=D$44U'Tjb,J8P(cPqNlAhdX4S
%='2+mErQ$omT\J[pM+t.2YF7oW?PXr6lks[9rlBp;A;jUlZk,UZ`A>%qEq(d&&lsK*H*@dh\Q!*nON1T9hs`u7&=o%2.(8QMSmfM
%YD8$bc'MU_=ZgWp.0gLr(R%!rFStu0B;\Y0GXG.uW@GF!m4^?VQ[Bsnr8)GL'J$YeUZrD#'?"nW2;ch)SfV7KoF!8N&'fhhE$g;X
%Ik`V;Lg^Sha]8:p2gRaqaOTk-g?QEd(L-Yqo\`PfGZ+NdFL]]=_k;M^<G\pKaml:t$dk;JW%7lW]<lSPf.VLis23Ta+b\\/SJNYi
%a#0$_)OP.6%JJO1bPU\!k.V/V[\;oq``(pnf21Q):QJ#R%)kskWbXdUT"g/ln/6Ou9X<S@4YGR<PH&Ea:Q8!qQ1kg,Yk=[M5<L^Y
%o[IeE2q=c:I!338k'jul[*rH<f)<iH+9`>R40H$W"YU=Kq`c\;Lr8MMmR#TBk1TA)a84co?pDYLV2\t%l3\8tlZG10d*f1#g<;L^
%e\Z43O=ro3C=)iaF;L1tJg"n[)_N"WI0,63XifLMfIJkL-*QaU;Q[RZJ,Z@nWn^s)qqe0X<&GF.F+hK^Wql?)R#L;O>UeG(?XR&t
%=E^^HAuSo&@SQ;uZ3-t9BMQXIPHQo`WqlL.XACKKlS0tlp[r.A1j--S8MtZ)X@]pI2<I\[m'.baE7'BlID+@7%9Y2tk`p_L()p7.
%5YncUOa8V$]7$*)HM>(l6gTU;>K))U%q+bF'-FZ1GJH,C6ZK\XW9"2F(;>VX'Q7IjBqLGnlUj[lqlOI)N+m7e:JPtXnt%BNRZSt1
%03CC1$&WECV-9Y+YfbHqs6@Qu"P(HADi;m<9bHMO/o7oXXd_e(o9K2Rrn`PR<,;Jr7lQu'!7BtUV#<cbg'g\:a8aYHaTt&j9>sB]
%;*!NYP[=Xc?7gYR)skYqQIp3%C9VU3V!H$8q3m\F7^:_ujkFPgXF@bAH+,c4cJ%VUmCO:Qa7MPoYLZTo0@.,E>o[Fu^G8(DVaCEI
%hPB-aVJ@M98'uuXi>?=XEEp\+@ajt;/CWa8Ek"D^D72ia8^LamiA15Of6lU<R#lcM;^`Ar@URQBs!>bQ?;+-*l3Vr;oBE4MeZ7;0
%]p9a6WCBd-4N+uV;d6e5WT<g<bc<ZjrSh[t'hFP,&6a_3f1-C;qS#+lejAg,d;u'^]ucV$]NVAc#Sqk$DhB"1#U)\k\2rcgNE*"G
%@E46?R^m1.f^qtE%t!/MYuM8gNm#dsLmcb%Jmnthr:$ddfaJWE,8]Pl]Kfo;58E9C0Rq(Hs)coOhn_dmoS2fgR'5:;^)GsR*?:5,
%_PLuu<TfF!O[ME[H4&0SqSD^+F23M(-$q`Ace_K7\@LV)""('igg'dAJTjjDJ+`FR5='[fc7ooF@_OE]cO8T_CL^4?a#qe;_rVf]
%;Y&DNbI:)<,%=@9`Mp](j"jiP/Vjl-:$oA??C*-/GH,gJFQI>#%DGXZJ,[=hCUJJo=;GONZ6WQME$^uRH,c8\4h,%9XhZrS3k-`A
%6kSk;Z%a\(=-Wi%SgsFF.FpAST;sn[:)h1L9"nLfMAE"a]oaelTGje;or_EfL+&C,g_?7>Hu3h"/lRhtMdE4fV0]FDXh\'M'#fC(
%U1D';DbBhW'I#BGBBf80Z<G:4bs0SV;=I?M(uIEZ/bDG(d@no=C36j5qH1nlOq0pGqqAf'[JTN);J8WgHld/1d0I=<g?UcC2e(1'
%E;YiH61@N#\joW&WPQ&2#+WD5YDFi/XP?gJ-jC9;r0.C<'TW^_g.f<<(biL"n-0MYfM<Y#0gsuN8ISHS`$U3e*G-!dhr=-!Bls&p
%Lr)H]LF=,,oamt;^$`l#43,ugGX<r,fknMg^8j)S\#!:,Y$)^Mh.quq">R_[)M?/+OVBnkU9#G=(=l$n-3$t<etXdQ%es?VmtY=X
%U7C:MD6:M'1ptN30%[kXqJEpn\`8#X5ZGrDh]%38Ai],!p=8;X=7>%e:ru'"gZ*ej(FKs(QiV:Pb/hJ-nl3(W6c%a6AgED1od^b8
%X%m51otj)_V!\t9KWHU@.TVGfm6-QWM-;B;1JGR$\q@9\40#uSh;:Ab-q'AYTm/9:b`9F14T-CF4a!^Qn"2dg6lC:6K\R'4V8s+n
%YNs;N!tI%<<%A]t%3Rha;lDMW9rTPi/=$>f;Vs:)iO^-@-pp,_WO&Jio@7/QAiA5F,X'=-=uZGZo\Sr8eFq,O\X+4$S:W@JO9\h!
%qg@.'d?gO66*E&R9M#EBc%g-t4a*W/\e"U@Y9)-HHC!jWbB>Pd8he9q5IQ"LZrA"fFG^.M>%)rS5m8//L/%ni>CjXQPjLD-_;Hoh
%9Y4:R%)ijXFM:ZCX__is];sF[gfUfS2P!TSWqiO=7!&5E7k)]CI@T"PhN+Y)A_7<+5uSKXj7F"".8Gb^^<fLR&S7V;(4But@UQEn
%OX9**N4$ptcaHiRiUUMULtJlAbUu%1%SFK6-c(rEKKe:?AOp;D>o%(gr;auX.orJI4922rO2[PaHR],XAe_:m5[!U']`G$Z\67])
%3rDk:Ih<T'^[AmlOnVRaSQ)h!^"F%@6&5_39?Km>=])$!&a:PlJ,*Z9o3]0o+bCDD,qn?j10#eEHSDLR"K]Bi*$Mpt^>a3GgG,7<
%mmQ>Kq__2=,M'<Eb.rpfCbB]SNnO>i#L09kje>5^E#!3lcP+7JCS$HLa&8Z]VRdMuDHiCH(u1<BF$'_ab?3Smpb9>PDL$7Ws*eii
%T@cr8fBO=:LP>WJk]UicDJCq*bU4?JXOGF:COBRXFCSn.=C'SX34ZM!D\_Wo]!ge?<PoYTPXb@fp3ob^ZaP+DS69'bX#8HH450U'
%Hu3kI[-eaaDPlk]%sQWk%.?/S>[AjiPKCrDY,6A\cUE2(2A]`)0/f9Pc^/A++u,E6=*GTmTplS!/(SqqQSmX497JQg^)MoAn!*4/
%Ss@!oh)kN#nAE;r8LA`6^X7#2L!-m#a5#e166fX)c-F:4\Z(SC]9,'I<pnH0IOfbhq9Da%ek5BIma;Wjb_(>;G"frSM/5K6rN`l=
%3r+g%&RB9bY3rKniboK;Z<OeBUZmI'q+^-60j`g&][,KD7cNk!WS,.7_*"714;c\.9<#Eb0q3VRpM"e&1O5G4GcdC!ZgI:<`BkaJ
%Lqa[;fC*l)\7J[.ceJ-PRnjF2X6nY`.D@j2W6]p/V07nI^7bMTCQ$pXqFKCF4M+ik<=4rOg#]odH+Wuo\S0ahNB9:'05RVoNsf]!
%@j/J?3"sbQ:O;^r?+F5hB'/\oIFZ$mWPk<n0%gJ@*l7YiHnD\42#_B@c8?PM?+)q!j"#;MH8W<VG5G]6],AAZC0)m)0q]7sAfOJ7
%_0T`7<\R<"l,RKg+\D:lG#qNoa7ln2q5&r'kj1_YX]Tgf7C>sSOgoEf[UmhCB30+Hno%1iep"WKAo@P\=/MO(>CptS/$g`VlZ66Q
%omU&po58hfnb2S/.pC&f_kOmDZmf2kL!n^A#;4aO:oBV?:rkHVR5p_]?IMkd]uI'\?!*^,WKZ]3g$IPmcBn3OIe$4e\iDoYg<<m,
%UeVs<c.'S!_HuLqe&CUMm*#!?n]gI?qYO'hX^I$RC-0N/lEOW_;bGV"r<59dB((c3DeVC([JB(?Q1;h;]L&QB,ee`0cCUklpY36d
%HMugP=P.u08h8ti`O[?2De<lF?$3?F;qX2#n@\Yi`!_L'7cK?4bH7aK[\TdcD0&#@Z(VlBSe^Rg]!ck3*(ui=2d>*:)-P).]_`*:
%^-7Ee-\@D-8JY7PH"nA1?>aMP2P#,tN\8n$PbjeL=0Kq!hSJblck2k0?numa;V0YQ;;5".;[tm3-^ifeD!-*4o7B$D?ckI0rN#Qs
%/p"Mh.-f+&D(]m64t#LG@gt?E-#<<^]5F[[]6oat4;hLdoO0!tHK"7(2]h"NB^0OC*(F#t(>`''HQ+P<&:^0bDUc[D>^(A=GT3'5
%`N;W&/lQR#/TAnOLBDC>Hu$&OW^Ui7U+CKYd58p[Dg$F'@bYhnrhJC]\p,1OS_7[_hj.3]T=2)t`T='==)^+/Br+SuWqU:A-X6E%
%\o[Xq,ec+9XFCYUUUE?fIB2HVXG-CXc!0U^iUP*EhZ.MT;P"ct`.uH?_&epj;b*\<9XrkdIT*Jc8]*`<Qq=/ucAsJ#nIQ*&hd<RX
%fG".Mh(L-ja,r)4OhFC^??Mb=8%IFJo]QAd6h&lg-ao7b'6u*0+7C:5:7BP]1ZAu%W34I;'UH]h*ki:,qu*#;Q"<Ud\#JDu[7[;u
%4M8Y[7T&4l]<ei3a=XN`e+=Dc\Y#j?nWUYoGe18a,dCAlgAB@q1,[lCf$80qm=WZs6hTU,1o7+9&ijh*buI6haQtMcl;h!U[l&J?
%Ru-JDat;YmnjpFbRh\%k6Lbc':qW9OQ/EVX\Z3qLAQJ%C^.8LZ*k+A/(Y8,ZG(;de8)j/klHuafC>%P.>NuCBfWNGugb8*'4$lBi
%Dg<lIUMn_/OSG-A&tH_C,e)qQ_EM$;\UgDd_)tT0do71q'#VM\T$Xt1dQTf-XT\*FVUEsL9bp_JbWPj/Lr-2P?WPqST^H=5;5XqL
%ZG_[=?s8S9?'^*l>/JmZ?n?)aZZt!f:&BkBRKj54*$Gm@$46t*(Pc;C^<;AB]0p],(F*oLq4+%Y"Oi\%2qoh`D=#^!8P8DUmc@h-
%Dgu<jW@D)U@9VnaJa%]^(TD[pKo;T=Xq,rRTnug+WmN$QEBWO=$IMFA):*?d[&o^&5.@uTA#=-5V>rgk3l]TS'%GQLCPMP3a*-;&
%6%$l>@@h.5dMOlYY#e15A?SSlodi`*U9>q$T0e.+IFk>?TDV`EgcjstRU.AI^f9`W.@J2-?+\RhO&&ShW6nug;;Zhle+.rJDDQ!u
%AY2Y_D<i`u-dIFl\i`aD<$c[/GJ>AueX]n)*(lclm8S+AWqs4;hmaFb1oDl;GXg\?9XYGk9=aBNairJ5E\KPdIeJ6>59U\Y6;gEH
%fSD"aiGt`2YY6=fp"9h7:N_@4[$.pFKg[s"Ts'Vk04+#-;YoFCD,N#J#;f)"LK!#0m.J<PSWV`2rF0lWP.pWf8!W,`e8]Q1]KWqh
%5LoS<PZr4h2.'EFRVqG5gq_KrP:rp69_okCfuc-'M!*k#$cNmu?0><W15rnK3'Bme+1I<:g\$t1m4-g)Us.*,XjkY._[G/$e+hrm
%A)F>J`2,l4CSc_An1bfZ,g!kPafl*YWj2efSR-V(ft5/AnU0lbK-8J40,YPcF`$K_?la#2%85(283A^g<nuT1p2ep5n#eIccdr$R
%>rd?e`9%q;bfS!TgHN3NU3ha*fHmBSj3hL_<Dm*71B5Zs=<d#;8Ja%`Yk[L@2+'h;6-2sPZM04?<Gp_k?hku.^\u9u_sDY\^::J]
%+P3W7SiTi@7mZjj>[+u2R'qWAaHg<37C2hMC_F?Ro9)(E<sIn='.Zc>m1"$==ZU=K'r4_mlB=h/W2&dU\!%C+\t.)o\mBB_)s?pc
%d.5dG7GBNiU=C<F:4MW,qtQ/"3e[KQ3kHQfB21/FgNDA(U]?%b]$.[eQ6m[Mm418BFZD7L>HbCtBlUWKd-<:/]p\oYfS//Ko\mV)
%NTIhN<n\!dkOI'\gZ,VFG5Cnt^1ak5l@`V2[VcS>h4:$=>P4#F1:2t[n]\nkd=p8=NU(@(&><7.=I2UaK#sSUj5-la(_5uf]642Z
%S?):W[QN8m&_InaL"gW>_1D+lZ[L6QLa"7X8)#]K19\#DOdic>iU#i4reo[LM7p@-F$:qXdYH5q](].D)n2HY\h)I@[F8!^]`uYY
%/^4C>h=6ERLIR2ffKBp"Q!1`@M^hI?ldn#eAo7'[1)[C2BkD'qnZI$(3H]A258Ob[Pa'tD2-oid1D+ThW*R=njf3NAH5VQ`;N)NY
%%/+VLZ6=FqhECsSpPN#JmU+429k8/Nn!Nh;T\URP#^5\8LYVMfBebr30=9Dto?/#D-\lIW_KZWlFuQdTe%=3Brd8UmZH8lr`7i)_
%c]9=@i.sG!`c@?'ZoAE`9@U[TMqRq#Mei<>:3uLBhUO!tB1$i[,J,KekdtC>#JHEUn#r*!@`M\mm\fe`qLt=%UW3/sN-,ptZ.a:i
%MXm8,0@&:g]._.B]?QiB[>"@cGc3C[fPD1>Ds4i?RQIu:WFiCcgLmuHWD!Wk^KD*uGd3Y/CAYUg:0?Pg`]0Q(fq">?Z$,a4=_[Uu
%*-A6"eut@]AbPO;Hac1?h.rk2[FC!)_>tg<5[\>b.am7#++FtUeK(t8o5DrQ-bF0HL2N`to1N"ton;'l*?<=2/ekLZ40dr:B#;EE
%DmruC(DO2;,6X6lVn)-4L\YVYg<,bf=QKA,[4eQaYPeN<eOhh\[JQc2Gr@%BM'[=?hL%oUVQ0&@]g++I/+mLu95@T@S?M/IgI/VP
%<pg+04C2,?$iB+&M`"T'*a6(Dm2T/>W/**fodI1dH[G@\]:OpK<cKc>EuE;M9V#_cC:`Jb4,PrjV7<t<Ioqku,<61]&Bi1YMWic(
%\a]TNfJM9peBuClQYtLoDe+aKH]>Fe>Wcr,>44C*D_l%,JTN:h@]<K)OPMB+*Me[==u._Gb([SK*u0QdEgW?M?JT`_5N\D4#j-hC
%:'s>BYnhQ?V!bP_j-PM6:ePDR5ZF9<Wp7m1K&f+S`0[@Y`32Ja9C"P.(U[#[RsX:f9Y<C2?&qc$Mt,&@>eg-j/<FSPHTjBWlSn'r
%WJ/#grBol2A:g4qYkmfh[t8@=V=@3A`@`qUs6%Ed"L:%ZbG6bELq'nd5*qg%0`se=`N=N,+&hJQ.GI"sGE#D_Z5@1WBbuX@_*O0<
%W\g9FbaemrR8C+_c;l%=Q<%bhd\VgVdBaQ@rA`Kc:)iA+VjkjONQI2td;PgYbd50o9I2p#993:qL%;KT%F:F"a_OnHL>+DU`l7r-
%a+]CiiO5dh:n?"C\`r^<AnpL6]aZj1]^thTHWt[V3r1][Gl7R$4`TB+Y1u`N5<YC-9cRDq0Z0H0>Q()*F14fqS!da@h>L;[b,%^q
%0s\)Sk_8F0(Z&cd5A#+_QKA?H-;dK!4AOtge[qg96L&7.?dO!qK(GVY>KaS,9%o0Sbj8BEe4'7<l!R]=cK,X_Bem<,23s)8+$n"i
%Xb66#RaShaCL4QnNR#bI6A7SA2m+KNNrDUd_c8'`XZeNuc,ul2@UJq4@VbK>O2M_`k,,T0WKF^fnF>mj/pjgHS;Yu-_-GiBpM5*O
%_J&C,.0bXD[7)XX)GJi)j-c/,GB7UMOdtje$AqMn5T4!9q'ZTPleQo(r%VbVV,,^@)E4!j,\hG,PfDJ^Xb#-7M=Wp5*"1&aeu%n2
%H<-_7DVmclhFU]hp1M72e"E8cMsLNalQH,@VZ23"(U-qD2LiC0E?i2;km2T\CkW3TGB9*[p"/&^-mGiYXgPiYErTRIj*Y"7k,Pt[
%krDCm5t5+X&o/f)_d)ih_O8'iZaNZI,7U+b<jg`BgfP'jhP[XJZ!FuTb>%A?\D]k'>!;dCNYePAnP/D2ogR+D]2+d6SBi?MBl12r
%nk\IsOfc:FQh'k0iVl..\94fo+"1_a]2^IA`3GR[Ma!H.go%iqgKt$7?W]A3m+q)i[hi7@I1_maENA\bopb5YU,Q3Xj\@/Z?*<?T
%D2kC8ZP,J3B\B[NOUkLM^)&;*%(QI..LYXUY*%^/\[rW8\2j.LLtl3Q6d5.CII_f(U/gf(0@i`'I7%]%+e>,1Q)>V<6'LW2o]OO*
%CY>iE_e+(=C+>"neLeLq8sSsY&rkJ3'3h5\b@0@p7+\XO'9Q\!(gA)s"l7G"%VMr`$!A[W@<T<>C+<F02O8[V#9fZQ:);\mh1url
%ICdkLTJ8U>UV@(ud^#4"n62E?\FTD\*"MG8Z?HtiEN?Y!>g?WAP4PBa`N-OrYndclo@jXSZcBRfRZ4J.5$cQi5[`YO`oL[\<T!2f
%Vjr`9'Aa!]Uta&,?Y`?M+3X(g?[g+C935UD$hh[R#P;:r0TV9Ho32S]q\.<Og(io'k%=%mH'uaU9mS1XGC47)bZ>/^->#d-bA2q>
%8$k7bZ#S`mHsFEH8\N=(RhNaHpBhb(ca*[r`<WbTP''q;]%>.gHs$6.9-(+a7cFf&NE3I91h^$!<;.eFaQ+GL1WB0A]qhiYlPFbL
%l[a>EMB%NpJ"4F0PYX;rj;=sA)gp;@=9fZ9af!DZ>dfo$(GdBtj.VPp-55';-+,*qd$*_dj5Ns'$7M#Tmfe>*DOoRkrBWKE4WI+a
%e%,;IgP,!B#Ifrd:WDKIbIK]/*E@;J=Y!jV+2]S7R-!H%jO3Jmggs[Qqj(9#)eWlj`7b$m-pF-RcJH5.Nl57.fc5ieS6sl3&W[?B
%^HOFq/<7(O/dhlTaGjEs_p)1)qQ(#>^%3NjmaC&n'@aB7B'f0JG$aOce%&^gSJ%C_iR(nRHh:(t/m_JYZS-MO3YHK'?$i8Ph6#JN
%`I0%Z=1t+M_i\kim8V/S<hFPC*Br.i-#6S]SVq3[^&%4LQs;;O`ibj1:&W#\kI)1Jf5kR4*UUsP"Lm/N=g)uhgYmHBAaUX\PIO;1
%H<$*]Y?;gDlBfLQS4<4YQc8Rdcrtu$5d(kQ?su-H[auRMLE_-pjPRZ+j@28@=Urq*Tch$qPK[pjNgo!n9?fE]Kq#VWBJ$:U=a=fb
%[Yp]9CWL9a*L?+dHYr:&d7Ts?lt`;;h?j^=5*8W@;dQWOT=>qj.^cdpG^5ad.pFB9p@A2\9-'AMk5D;D\N!r6`VqA?M#hgVU?f@H
%NSRdmb:,G4iLX3'G4FEM8Xs.$l_B=/r'TR(s2Ma%<u6;@7%A7#bnNZ49Wl^e'Y\+C2i.k^mNZ^m1c(m6SY/(l`;S/S%G4G9Wr@KK
%!r'9$&&,-h1tgiaf[BqBa<8kAH?8'N!_.MsS\mDU+Ig!gOJd:W$lRF8^CXmDn^E4_Ssq)N0Do/%V1/(V#R/L4]p"4Pq50<.Q3IJl
%ptt0'NTN=kk,deFolL9R7"]'OIoR<kDPpU!5+S-V4nY3[K\$f.hgZL9r3p!l$u,k$AD6!8_tFM2%GrnTJQ.%_fS!W,Ug>V@+g1.q
%U.=)=O<nTfe)>8Y^-rS'pYOK:=MURTa!@Df-NVjn^Q?CtnD8FdK]W"O":,UWQ9BOh`?t`i#s4$AT89c<lu:AHs6`h85Z'`Q0,2(J
%\(]ln9uCc/Wg2]Y!\g878)TUp`+J-;[?D/2bJ9/Cj5KXp'X9!W5sARPBV3Nna%mdV91?Tc:O'SIq"jB^1%YCRN(/GQ#GEj2+hp2"
%&D:u?#=b*UV8\,>C-fp[[cfSX%DdU)[m^Ean4\,H8u(X-1T#3]<FRmnYoGj.&XIUR&ecq;&qj%'EP-S9=ME9-kOr`bOo4:(YqrT_
%QWL^4<?-q>70<uP[N;St/gfE[De!$JU\:>[#?^h3-/;$b9EI@EoB"VBrgP$^>.o5hc^2h[^Vnb(:<(`(fN':k61CW#q7>e#+IH:,
%5Q=Z,^gF#Mr%!)9s.B<+BCEOspJQ+3naF6*_BTfRY-]Z;hIF8d?q%b,/,#Zg6G6J/KoljUB,jnh)CU,^7-0haNT#2@5o<VJE7@(l
%>o-%pegnD5cc97?01anurJ7^+cc_oXfoq24kUQs-50Q8R:Yb,mZh)r80V:Dhqt>6LGC.k4[I@"rQG$U&6LS%;6/P/PCCH^`eBi]X
%`_^OH>hbk/iP?[&8/4/TYn0+uWn&89#7%@)r@\%J>^YE^O.M/<n,$O42LeMe?fYl6mhtC;,]NJfR2d-+/;-"srI,$J[%8G,_^?&[
%6g$h39+?6J7kr8[jIW>;]m>l\MDN)L&,o8_cR;%uX&9L&2fdCYqG&dt`9KSM1L=2R>+CGTBb84,#T.u)q@Q#'9:X;Pia'rm#8Gmm
%.)f_d#rG-O?'cnlcHFY(_#c.*R4SttkJ%t0Pm]h@)/2"@@XbUq=3kdHQ20+Hg"Fo2VN/E*`mWgt*kXH@r^JOVp!o7<3d^%-4Dp0$
%/a'Hab5"[!<h!AYZ5uK5p!)UG`;J]D8:5N&j`,!VqX&tu3qlGbY<Lbg7qZ$6a.m^&n$AbqAPZ7eQd;S.H(j_'*uYTjYpVT!I5G"!
%5HX-`7sD$BX*d4\+68@4I]I9kH^U"@]tUe"PFAPch-SiU)_94rd^s%mH=<>Gf0<Rifo+Y]8T$Pr>Yo'2G"&j6^H%h/,\E')Hb3=n
%iUVM^qQB]bbZIr?h+#)lfJjJ&b\\g#`\A"!h6Vj"CS#6Ae]/!XG!`$kpY46L09sP?W7u%2Y&'%ld(j@$ZB*-'L9k;J?PYkaT,T*H
%om+!Pd?!tD]oRr^)r7a%b_<1"AC!`KhRqYbM+="O2ej(O2WDCh>oK962q3)cGG>E.7q54sQt\K?&oT_`R%2o(oP)g&R*&3rYP2qa
%R/T(WUttbdkudAr(l=<Gek3Qf`iA+J4)96_[Dq*'lI3q))Eki5Ed)G_gPo*AB$fnakgG-qI=9PMd>^lfV!mqj(Fpl*W)5j=2s[#M
%qG'lXa4ABcR[rkQeZ!Wg6V3gaN>g>";VG.!ZI+<Ha[i2(=h_&H)f8M/2g\iFI&NS-BlkqFfss%VcUP*=599E4FE8`,7\<l^fR'\m
%UR-u1#OeU8UPG9%PqR'u]=f,R>q@S/Zl9bGdRd%eWu#RK]c/iSc]t$$]^=D9=RP$pF&^`aHSmhs=)sXo\NXN2`oE,F]hH11o?,).
%VmG6>DCDJUDot8A7`jZC0u;-)\Q.>HH"&6Y_5hL6AN@Hi+!5PENF".b]66M0UGJ$%8)fN59s8:PjV+(reuhI+GPB!D^/(NT\G^ZA
%]B\!]<nWtQFK&-a=CeL;?P_3VfA@YBD"Msl;X`B(Nd%QT]c%(;2a/LOj6Ps7?=Ri2m;.)e5?plXoka8:Z?"j3dGp#":H-ee8A';N
%+#]@iS_@!17X+P#Bl7d%\TagVmBKuW$D*2gc`T4HRXHOX_nP\ZFXPqUdCkh<l`7qHbFX]"mQYSdUGuVla85Ve]Zp+`oV80d2G/h_
%NP>?r/+:*1*beT\6HrhT,q=<j\/ml+*UV>>q5LZ+/8t9!e9RN#)dU'L#X0T(?2,&g1p(Qj=uL]%:Id=foYk]sL)SSh=/Il;8%PaK
%RTW1TdCFFqU(oL8Wr;k7BDTgEBVURP`3O3d\N1ZIl0-1cLM:W_IBII11;^SJj)ej3Zm(r5G&sL^"H?D<RV?rM_Tafn)dQHf&eRSm
%=#8_(8Ya%'aQu`uBLOiVVI%U+<7%QVBs_2BGu^Jc[mq[&2U'JTnt]Do3(uf=GHC(X3Z4(NK9s?]3]j`p3cS/*kkk)O:bA=4Hi'IP
%IYtVgDnA!D@(k6M5$s4*R$c.nrVGm6OggXO?D#<JNCTm^='ClEZ1krg1K-Eg>56bEXeX,\IHpk++b)?ebZOW:PW!MYkkfOI[^)q+
%Is\MO\(H-KR5&K)J#mUqg#m-`F(04T[)$\L-GR'QDbk#(^2SCrN\,@tf]gZSEM_96k&T/.a*QXPn)?:tU]')!bUtID1Y1UbVtcPU
%VXN9cc%F_^hm\YZ>5GK%[VNn*O1COVIUA!c*A3e/hem5Lb5;/o(,&X)Nd(AK4Y]"&ol6ktg\'(QNS!pl[^J5op7JV>W:jhLU!Hqa
%;d!J!n]/9r[2=0NHZIb@Q#AJ#V<G);4Sc?=PA7ik)TLQ0VZrGaDC7YZ,ldZS0B$bBWh[+?P?C\mg3Cejlel8Vo*mP#b\1J?4Vo%!
%k7dcU`3\7_>kTRu5MhP%(2.X1,@l/sUU8ACl=8Q/nj,V5F.qc=aC?a\qP<n*]1dPRRSINdbjRQW8YO2=D[FuU2Bged>70('T._hS
%9FL8F[U*m#8gZUOD1-4GhJSW9SN`$:j3Vj2oPW/<^ZaFN3(,s2&U>oi<ml*d2Mr`_d'(jOE21FXd#g]?3cEKfTgirJ-H=f"P4ThQ
%W^ip&dXNt!ND`9Ae*!O?L7@Rti+9$/UEog4BiO;K6MeH32_)hq1"OO^NJ\$[)#YD-o\[.*OZ;G%LYcNH)GL]VFEb$/UEidF)o^\&
%BGNAB8]RiWY2;A?9eOA+k2Ng39Y%3)\J!crI7d]'?`qu;mlst#I#rFt\OB\\q.!$;bH@uEBr[-F3=6X;<cY=RA1eP9CQTW%?Q<F?
%C]CY;S%:bFauXb[lh`3?l(qQ[itPLuiblL+9YFPJ2a1aUj3"R#A\H?WAFh>;EV[Z1?<&mK,-]ri+Bsa&Lqt[p\5:-?,hQFLrkZdt
%K0PC5'!ns5m0A?OBOrDNgeZ\*d\\;$I!QnV9L,7fc1nW_Ek>l&Tb/8<FA?4OE>'?n[`s&erW#6uldV)DFm@B1MKC?'V<c^.+Pj^k
%D/rV_g!M#+5al`0/MC>mSYmeTJ&opA1>cShPG<QH2\L%iOT+IUK)YTeO$11*j2(M&,`VI8+b\Ir!L#D=qGiA9=gJrcZ3F:*cD3\f
%qGoI/%(Z8![?u1SA[Ud&j$[M%gA(I)q(poLhM#oi+Y!5BB3n5<\D)Z!IAHmRFg@V'DUrm:hT:*9^8tu..FMN%\5a&8@*n"q$(PDS
%dsLMcefhrP$1?97\b.u^6dD6+krj7RM:'%R]AKb:HX+mjSW>p`B]2mK#,eYrSa8KseJgR`ni!1S8$]I`;2%fNd&=U0jFge:/iL9n
%=uiWICI#QmN1_2bcFjb5D6OJeFT-!#6?MXD[a-_Re^XMda\D%&g\JU*@[-kioL!bEfr(>O-'M3(G@g'DQ1_/7jumh01Xj&+o!r3'
%h;DQdcH?(;qprQj**;;ueN*Qt@5`4!d7"h&1JY(@oNG!EA)RU1+(@OjL?NO/&E=/.?oMrh*sQ!Xoo$i<h!!FtQ&V8&^Ho"O?Lr9Q
%9+'ukP.&B>2qu"k[i8+7@DfCB7gCcgr=5\JAB&e$+jGCJp-"^2im1cb%EurVo;/?kHiJ8aP>Cq?XM&BGi#U1@k3@-IZZ?(:p1G5)
%:3<JM5j'fV8:7o^'O(K$_;Zo3^LIEtnUZ;21Y-L)T\Q]-.JX2u40B">047ij;d&:7o%\]i2nZH%o>+&CEs<MJl@*utY3R`#A"=V,
%RJj..g0m1uoe+4k\^L7Jl+#dQ7J(6!QSR2hT^@"iC[(R(UJLBaOFZ/6=#O.#?>N]?hg]qC4@P\,A%Pc^'3?NmmC@cprqtG0+.F*J
%q$:NSkj5B-Jn+UJ1I?#rE&5?FHL@,tQYE9N=N-2?6rJ&L=.\=O6ZjXu>CPJ"4L+9@*FTt6[a,P.^BrB^LM,i3Hn!b5A/+h4BU=^J
%AB:DqrjE!!?[kNII>f(2&f_o7_t7I]I5]0t@'O2ergZ`CIjY?^jHeG=Qd,<`@sM/\Ygm=c_s7-ta#?#sP`H53koI(He+Sa!,i?''
%IGVi;hRf*sWbbU>^MI_n3CAQT>Yi>:O%q<@s$7`m537dSTZJ+$Mt^4u84sSZouo#E0j2=.V_@[$mc/]X#2dF&3k'?0XnuhuP+^O6
%i@H7,C^JinPAITbK1rQ_$V>WU;hFJ5'L-Gt'gi@G,e<ct2Nqsp04Ad$o1#B!7D#k]l9(BI_n7/Vi/:&,,#=K,eJ`n=,%kX4]?a#q
%OHlu]NQ^/L+0tcO>+W1q79DhtHOXT-)N'\FI'^`=;!S[hf32$K>0oQbA"r&+6O;/.jdi=urLCE.H&VS5+5EJsm0idUWBD,mLla7_
%XFkI>+pibVIT\Y#*^$g-l$TCWp]]j(G?CVU44/,Qhge2U""7I%:?S>F4Ub`k1iA=9Z0&qubk2W=qN8irf2%\IZP,@_SiVYDZ7M%_
%FO]9TC,5.jJPh8:_[o2m>o06rN9F(.GrG-Z0u#s@FkUupM@P%<.4XXrDs_+QA^-sA]bQeqA+TBEQc,a=M?!&k"g-M:,B%,VH9)e_
%kOh=$M/tgE\c]L/5auTAiq)6oeFWTZ0@9H?<7Z%Vpq/u$o6tYAUl2d_:5LboDQ5@1_iQ&)dujFSgMhu/#*ioEBA`7P&L-/V3A]/a
%L;_Dl0--rmPbU)WVn4olj"Yk22ZuY:Bd(TSM-9`HUE&[.c-^q+of3Y4['HSig;o@78>tnP3EiX;2pSEV^sU*#p#9Z2hYX%=kB"!_
%gBH4#iuAN9r:o(ueMH,ABJ)F_gu?P=`-Y&X*J`!Ep&A[n4dY1gQ?CS&^cN)aU&bRBF]YuE6jm011nk4Hd=IN1dCZaRrc=\0f(WaA
%l*3C==neL.EFQmbE"_!WA[9aR=W2DM3h.arfTUOVnWmME)7,;)[]BQhn<^nMI[s5g#"iL^rgr$H1$LHO"b&0]lN_dH^(?E44#3)F
%mPF^5J!hBVQgSSIq[l[&WJq$<9qsE6`u-5X:E>.4(dH=:+V5W)MF'JcH(R;rhs!>O]KF$"^qj&[Wto%*f=(eFU<a93o[GYeI>4Q$
%%c7/u[)Vk8d84UZB"OGQ%3I/Ihp8aI@^+tUqe'7`n\R`*(f"pfPL_]0_`5i\pXpsW([doREL[@+rM3;bp,ZcTU"jTF0-l6sp2t(e
%f].Z=7fC:'MMJ>[*!u7M@N:^)b$OR:$H&5\$bZ6mj%/aC4?:4SpA"/5[d"Gd^E7:FgRZT)_VLe(CHZ1J#)TtN,k7.6)Nd8-bsD)O
%LA,fEn)qTj)4%<(iH-;CRYh]9m?r=77N'\Kk,C)D[(X"-8?X#KR*(>Jhb4L*Ri]*u7Gmhq.u/!'JBRW^qs'nmrErQP2pp>81n`\9
%<ZV24`m-%b,_!e&`C,Y60o.g2(Rp%nYVOjqbJ$%opf9(X/_KLs9kke?N*S'taDuD:5<J1KI[[3<kSZ'Ymebo-V`t(L@f>B*kEjdr
%?)X>>Dsm1l$p(BCZ@!-fcGddZkXI=^p74Q04+iPMGm-3M;a8D5\uFA7$g,g\cCi@e"dd?)S"2jsPPUTdTpqT=f?4q7,):&Z#2P5S
%_1cpnAnTIF>Asa+FL.Ugh!1_Wkf,5m07tll(/*f:c-DuW4>oEZXr!0^,K&lnd4:EVmHH@pdkcPEJmARSBqhHudepoJ'>sC;Y)MSc
%q[S@o1b/H!0FeN!oKKt<kOsfS?0:1Z1`EU'msY'*6k<T#\Y>5,*ug@Op@dCQ&*Fg-qEDVrK?]Fo)R_i`qW;A7%:7qJj_F_-%,^]Z
%`MYO=o5TfPC=\UrV9E@"$RO%,U,A9-6:"LccXI2[58FS0Onc2<_'"Z*NMdYR=W)$iHe%P`6aN,f2DEgd*soKV@??lCc[8lRYp?qU
%F5->pUj:("e+M2C%Yp!H?Ci#CdSim'W?ITuZ5ItV_SZTDLL?NiO3R"]lb(H^@5R<#Q%bH/hTBPIn*=_7#j"B%VTaJ#3ABc<^2EBu
%CQ^>4b%'J/Z[%;Cp[+:Z1PpVU_8N#"I<_ir:)1C<Aq=NVdV']S>d8'`*oG:h1%5S3n\(N\s)P&N[$mST2E_@Y[O=9["+Tse]0k$o
%Fad5Gk4J87)Zr;aMVub0^'/T;q$kU/CVS-;M4'&+rTJ>3[^$=hDoqT*/Mgt#_<,8*n/^g6=I7gJ\S7eU(RZ]*^36Srpan-_hEBC"
%FLj@C=?dsmCR?Y7B(I$EZf5!"45"L34'ul9La`G=5M5/?'8Ca74u`8_bF,j:g&P\;C4()e]t^`[<q`C"0H-^rO!3YN7e,X]X(i&9
%Q.sms]dW%7QQX^M^(s7ZRr;h>Rq\$T<n\66D@GoFjiFRK8TPs2o&PC7QTSCi;m0fSOf,sTL%6=toOG\&B:b6"R/HFG`QUCW<$dZk
%js8$-;4Zqh;*QCJo6n\if8&5XFPj"=A,fkBbe,_pc#,@iB]&^ZDN:Q%D+'YVNWKSlA9q2>jWjXoQ&D"oAk]1RRHJXr)>ds":2+ln
%qY[/!=]66@h6AtLs-8hE<ENd\VaY4>-oEXa+!+gP;'4\coUNgs2h+uM,*V9g^FsMfnH0c#&`']W)VTWk11T!hb?JM=L,NM'R?isr
%00dc8A<E9nkPorqHHrbU*2Mfo$TB/kLP>2j<CbFQQ>\$WH$\9@&7N+1pL*%.!+_IfPPF7ZC*FO7/uS_/\f.?(?eXaSF(0HNUnR03
%J3E'K80FC>?!8A!Cb0[:@^b4-]XifLB#c,qR9)=$?>jF^?'[N4,?&j$&bO)e,$!=`c","cTmCq&CQSZVOO8cPpM#1MX3$.7=&oo3
%2`i+!nbQbmabQ?""b#RoWq528aKntk+)Y,4lK[s!@'s>3"qJ_0Rns]=C(f.toAP#C:uRt?X3QJ>XZJ!MEN@B?Rp.1H-2DLCO4AbW
%bPgP?NTt!%gcEMe><]A7$uTW2Oaa6X9]S%`E_&mb_p<sE,3Re\n*d;g`IMe081^Bmc>cV)48j`j%*9`^3f;!g*+oGC>[rm)1Lf;*
%;`#cO9fIlfa#dqICo0T_+8pLp/E6Khf/X'jEXAXIHQGCVjr1,XUWfaBlo"Efbq(A$M2k<DL:^fI?GdZ/3;.\RI;pI*Xem!ja'%d*
%9Z]fuj/aL<o$Z)C/iIpDkp:nY<7@9OAj'H5G]#CG^/]KT>3#.:j#/G6T?T"T1fpB2)6)cVIKN!D2,>_R]W[:D<sN(@80T(AOo"A$
%lQIU-3N7HXa[gjRFYt&9(hXR$WQ5l[4sLf;X<Jl(is[F?4e`QbMX0:+R9h^mi?4oUVtBWYfC8=Yf5MuMDDE5:FXeBkq.E1hX<JBs
%ijl-Q'lO%pbPmOHf%h.h/!ie\bA.YD)=B_P$9,f$n/k2TRqs/cW1WJ&&e&hZOOm:"Q2'uhC96]^MXZ%>CjU5`=u8(_$U_Hj(<$:Y
%A.1B0ZJC*fbZL"d7@afh2Yui,(XB,I]Uk?`@X72go95Y6oBMoA/Vc.)*.i<T!ddK4(L?&r:AUQR!F&g#^&@BaLPN'>>WVN>kN+5M
%iUbC!gcp/Ko(fC07m5tKErTCNbI6ArSm;8<rkc)>rpSSX2tsbi05fT2'7tR<!]rI6Tg*+r3;%?t-=r`69@=fVVpk7_g-8?iajI/]
%m.Tc%m@1ZV3W#b%GN-\^l^t(df\,*$Z]a/$CeakAETR2==W)BQDZ=eLe[1COSFP"-Vn25iUUaL)2nip*\C"hGqtSuBlqBC%!d=(c
%XCO8r3V(RH5JCJh:<TlB%itLMs*Q^Vg$S%*XL!to1[I<_^H_Cd^[/U]pL`,Lhp1Z1pW)=Y+2*'fl.)cfHh^P4l\fI!rM,una&DXI
%<`dOq.A!.QptW':SeJ.kmn*CmB@)J.p`4WT=m&OC5nL^E[%t$0IXW,FW3^<\"%$o&'(!Uc=\I(2FQ]":X%D]H+/(`124<=AlK`sL
%AU^m%PF<;X3\ScG[+A<$P+0sEA3s"U!S4)MS`CQl_EGRh3(.d^2C*')/eHVnYDM&Y\A$qs1oH2ceFcQ$q_kY2aO'V)mkleDe*$BA
%)6'I@7/sdUpZ:\pl&CLrL:[q45W@HG]:WoNrRkTpc)-u+#D?ERX37@Z=<D.sCq<1r_9r.cHoBfV>e9lG5#0G$Rq.GL*,3/]2I16*
%oZg455IONLh5$b,<!_/I2VgPWnq,P:PPd8"=0=*DDGi)mY4&P@Rr2+Vh8%[7"g[A>g"Jdup=3a'9fcQ`H<6P02bCO$@n0Ua9fFMf
%DG%>4-*ldTVtBE(F@g2]flWF2e$UF$cDI(QIM8HLQHZ3F*GTIfiI,:d9p7/1RnYhha-OiE)]<D?-bc<k\p`tu_V'#eF0&E.9fG)A
%HI^\jP6UM`=`H@U,]Cdq%/^I<kpDOJ^@o-qCq;WuOVMHVc0$a\aJPH6)+b`R<Ar[G9WloVdnRu]S(`pAGm3\:;?2(B`>0rZ1qeh!
%Ga$:thAcV2T>&U]m(LZQT;V@ffmgcJYpoX%QY4kIlD@2j_tN?8`mKM6.IC"d&e[3mEs7JQ.*tU`R$.,)D,MTW)G1>@FI2;TVY2kn
%m$OEp6>`'%9keVj`Dd1#A"RA??(OA<_8Z6hd5ggqpCWC`3o#.Oe(B&VAM//LRapV>kr*`gSZ@;cq0q&Q:$jQW@o0>V^c$Dc1:`,c
%dL?PFQlVfh)Vluh<`aL[%-]N'dn2Krc.uW_+uX&t2KpXgb\hO3FIPA6I@J^LDOC%ZbDd7d\Z3q<0XD:0Gb2m6Q%^W7\WK;JIHU1r
%V4BV1'L/LAH-i4%DX?=Er'VGDPinGMpd'aY6R%uNk%>N+&)nFr?g,6[,OBB#+>W</<7>1rPD=;5nm=S&F>TTq78p+eGuALXC&X^)
%G<YFNZ)\ZMjcO:Q4S[iJ-pQ5:pp%Z_:k#WW&`'bqRn<KXP52W#.g-jrB9WMMdiUQpT\ci87`cjdm]GIQEg3h&p5,3So5iSFfV$1:
%Bg!S.'5R&b)GdHJpM"bM!AW5!)As4/r+q-"Z^c56h9,VY[W69#f3'iX-cTH'aM]$YTUr->:Q(oqqu-Ic1/hZDj2E=$nY(,TY,[,J
%s21Dl0&j]ks1q$]Wi(."d!0DAEC*-_("Kk13%Lp?+QG$-X]e1#QZ,iV_o6(b*t1\N=NJC,Ht1#NHoN72@?:YAkmhn\^N*M=]7!r%
%$,IARm9@8+LV$]WO%W`qJ8!ZqDC(kEk2m<dl]ekp5#L[2\,8+RdG_7#QS]sPA3V+&B(^L>O1W@mg^UB#NpN\*'5O4g9k)C)m<*AW
%XWMAnR'S\=d#m1,qb+"2c$XWVg5h>&G]R=ToO;sG36j_Ok#dTKN3e[pcC;d,?#8pgdrSqfP*jh_Q'l$l]LDDG-RCM/?;V8iP@N56
%oW^C]0u0q,qS!D4@iCNKFS*fK;,&n-@RJS2qMUkR4&&)]F.&K:FSaX_%/$$'Hb>WANt&Xb6^!gsT(t2mI.(.?I(W8ge$KB)oM1pm
%BbqEk+);AT&ln`t"N(Pb&g-R7%u=6H\8H4[Y:9bTA^QN[$ak?B<_f"%G#qb6C7!ed($2sn:+]2J\.&!*qa0ZkkB+l$g1QF]G!BIR
%`dk/Rq)PU,8qXIABB?Y'"UG@<dnKaI&H.^\G4!NP9CL.!`NA#>>rqWOpNp[G/tLb,GQ5nMQQ*@4f@;t,m^r&bfp+MXdBa'2$0.^n
%2mXOj^NrIr\'EgS5MF;9><DESd)4[$\Z)UdL[Fa-e(lJKE6"k(iI1V!o!IZ1jH2:3il&4Z^\Z=9k3hb(V^::bS,-!sQ@i8Q<)_CP
%>Wq`?_:4Me^&E?LmqI4&Ni.rX9Wkb=G?gPa[%Ef\rFkdql6BDjA2t\qG4+UM8KV5"Jdidg3S-pAHSq8hQZ)>PhsO26BRT*#]liRN
%ZGDQ5`4_Q.dAr&gko[V8a.XlE50CTXmBp88jlf5'cKZX!j5KWk?G??q8h[KnJ+bSqIPUmqP;%KX34%."r@-&mgVq\*o)-Yijb_G&
%#)p'3qX]ckM,!h(n(LX41HK=$g=']+gGA37OjOUHS+N38NmerslXDb:E,kqsp1'^49l-86+dnpb1`fgXF\9I1l''gBP1h`WZ0D.c
%3j[2+4/XmX:eT65fqDDEO)D$TMuUT+77,@5A_i>FSm3HiD,,b]m*aTAHl@!N/\8Z0[79$/_HdqT9PH%MC\5=LhXlMr[+:8]RacF@
%nR>Gfe8fl*QHj+o2KjaY?%-tj7,N9<H+[e4r_s1gp@SH_YNOPGT3ko)n]'B`lbb1l%`h,.BjMkGj`u<#R7ah8-ZQ4ugqJs--G->q
%Wb_S2nieYKr@48W!aN/>mA*p*;tIujBeAAQiasT(PO2lYTTKO5elPogl?=qQ_H^63Nr81b.#$?Xf38mUVVPa.XQI!qlcj7qc9L2s
%a*rD7XXa&1=9-27p=nTtaHYOW8'a;hmMoI_O_h+k`=d%@AnNkNP[i5q<9GBndRaA\S#`l3a)e*IhNY<BIJ$WR[s#Se_"WThUiPU?
%Y%FI2c>.,VkPUM+rQWmgM)p9O@AL*s`%EhR$oY;IcI(&+g)5O&E0]O.Ci1lOn4!%6QV6c!gjV9lmF[GI2J'+tFQ#g>U$gPsZN,dC
%!"Q/!1+be.:_)EBkk"mYJ4"AXa6h!,A-!1b!R*&6/tN5+1^B+Cl[<CHp/#=TL,g.W]3#j,cl>=;f`&2WdsfT>)uUbW7C)uLjo@jk
%H!a^);l2C;".8s9ANo.T>.uHCn;_>.2!)p3nfM\j2eH(bO#5sff9'o-:&-&IA@@#oHrIbe,86liPrIeDmuRC=BZ`9I5Op:nndXkk
%\P,r9go>lrePdil>;RujG^<H+j_I6^^5CW@"8hp(WXZ@X?b^Dk/#Wn7XfpVkED$,qlSlGVhnEhm:$Cn%gF>$_'48DUhdkf;=W;)t
%IJr;<ngaM4c&N3hQE)>/qT[4E>*2*pAllaT,7>B2VtTeQ]sJC+`P26God2HFeScNM5UQ3tS%YId&ZY`mlSgO=EE6*2i>XR4;g)V%
%k^E*rRpGh?qS\`elSk$TD3Km[TWd6hZg^9rW+P\pS#tsNN.TnV?b]0HP3M6`f8jhR3U[@Kop\)Om/3pJlSmRlZ8QrtAJ3lj1K*u%
%f5H8>R<A2G]/(-oo^s06L./kX?a"(n_W`L<m-?Shmr]q)rFU9HMjV.f?bb7pf3(T.;LSLArmi?"*3""en%O7W2in[=$MsVD\81!Z
%="ERVG@L7oKDY2`BdYjL+5]tErSf4=YKrrr*+OEqB&l,!NOF8IBOAO-Out38XJ2oU1`lX8glo7_r2g"ZI./E,]8#qRqT\^mpS/#f
%hq,'HgS<K^If&Xe(8N[u+5[F.:[IAUHp>=g8PJ`U2iPdl/Co\s1a@.R^4&5_p/kB\aV\3qY?stgRakJ]l+VVQ`LJA:[W#Tgfj4QB
%Y1f\"rKah`%IEC>+RaFVIJmc%oinpJhnHC88#YNo?bcOe_e39RZEGh0f5KH/S9OXq<on/F^4*E+]10<_^AIcO%WiVo.IFaNhh6'm
%])'[S$TG`%hu<#/r>f*)k@of[\O9f>7(=Rdp"O]_i(.4iR2D'/!*QJ.he^,*[+FF:qTVck<K=_6?bcRa8%\VWa^]rR=nV[g9c&CL
%L7(u^C1(D`5r-[4IJr`#*-^>baKD(S5:?3uS';pbAoXt)+]eC;ecb^9A<r0tqn_?LO3tO:n"c];#d<mIl)*:iJbLC'M`kk`30q39
%B?ttIoAISGV4Tg"j,fb&e&E)+\)5bV5B$3Od@KaII4N(I>PDsqp[sND[gj3YO5Dne&FugO&)TKrIBtp,BmjdckndQPHh[E&ZQK25
%rciDAfVsqPO'_a1Z+0N%XUBourk)@:5C<(#o)F#]reP?>^%TXogL'E\YO?\-XrV63VVQ$+??s2/A+SHdgUV'+?G-17_7;N!DUsm*
%h1'dpI=6A,m9bVj>rZ^TrHn&5h&GfYJ,&F$kI9W7IJWf7q0M,Vq+p[cogcL:*BdXJ]36<Plfn*.a+(fbo[J>=p@blMIHG^EI;o5C
%_tD96kNCI?^V;tfpoQT'^:84R`l6r[?[KO(=6j5]If&iE48/&gqrmnN6dP)MhqdUrG@IH2rJ`U;V]K\U45I`7p@dt+\*qX,UY/mr
%891cOBh0nlo[bHP0=hO<Iscf6*Ete'TB+=bk/`AekBDBIZru/m^YBpGi*<;"lVlEXN5fA2NkW2Jki%a&B+KLg[WU\udf04:d"aRG
%DidQeHUnWPs*=0n]nL^=S"H(3\:3DZrVK*B_f+F/hnScn0=$'F\NYIVGIFiR\R]X'QKH<CUjY4,+5-Y(G3%)8.rQN9J`cZu^E:%1
%q:jBU?81(+ildgP[P(r>mpEYJDPOn-T"EDk](aa9oC-N4<n_1-1E5d%Ub_@%5QC&pqDYSB_T1!<j9mmf4aOAQq;L@Lpm5@WSI_2\
%g-$m"rE6W,NLEeNp#?m`&RPAH9"a7DO+r.PA$d9R*GI_5T?R[SrHa':rJU]$js2D"Tqe3;4oOLDgRI0@.pH(-QT&,5m'U<_d`E^u
%Y8k/trOP"7o\IR2Hge^m`R``)3%'U*rFo#CRpWZ)H*q5]+3n\5Is?*\qomcVn>GYPktgE[-P+LV5@!)<J#EkWqY,^5LYF0TiONj\
%eMAQc/:AC`s6B="lqdDbNcWb.HG:+@r(<Su@*Qa85JR6a$/j@G`k;<1$2h2PG:UG`5>Gb4IJrmEG4lH]j_$cl2g^=Le'Ti28KlIH
%U=hVN`o*OBj=Pd:HfqPAg\ro'c6!QV/<X1d4+o8*+Ld_Sl#:qGP_JaZs&Ai.H2QIn?f`fQ_Voq;iePdn:L(E9pXd]e)qW^1-'XAQ
%R+m&.Fct=$YrmL&b&8MWH5p.<fKXQ)`*k=1+*S40^&$oUp?rC`INJLOnrl"V$Jrr&-=LrjkKi>Soiu[4<rp_:gM@NUSSRr9NHfQ&
%>?P;/@iN)Md8maWNs[O6rJ<.DO%f3:\4>TgTCK*7rl`FqQ[es9qk$Z+`#!c%E&^Y%_RiU$pb.iUk%4Ad+3oUVGuEaR](H!+hMCq+
%3a#+JkOuTe^[qe,U^'&7UY^YlE[DA<pYkeUc^2EFq=)ChmdPk<SiXXA\bt[Nf8&OuIU(Ygqt9I!S^Ctt?/"`hKB6k6b)>:J6r+DD
%5>L8J%mBiJqm)'\53@>Yqi8F/`C#%8Il?1T@>HR1hsF:.H^5mLD;28*7IL(&VIq-,gWM8u+"@SDH`-[6"O+V%S:3NH*;\:Yo?['e
%j+$P'd%i8]fT"oOV<WN&aP;c7*4E2)gNGqZhjjWAbgrWJJ,<Jq137"_Va'#7%i7GMr,foJ3dgm35f6gH<DnuqIs'r4ApNXjdg])?
%c>VY1DGomWQ_0iKlsWsj$(3f"k3e&2Z^kkjSt[OiL*Pjn6mGAR3<F8ak43TVEU<*(Ld$=\8f[2F#OI\1[6Nd3?hW1m4o[^>lT^DX
%O$h\?)oA2V\nS?RpfP0ho'+T3DeD8+a<_"uQ2^1#c,du0Q,gJl.eei-T0@;cn>.hWhCiA+>hmJV0NT<&2,U)9+54u#@$AXP+h.G2
%qqs5TrRO1\:S1o+Yp;RVIO13uEpK@PT/N^e^]!lSU\[oBYhZh;A&29R4c[Yrh0NgaN17'nl;Vk\[,/dAY9+h@b!fu%bf,0_^-#>3
%U^#?3+.[Z<nR1C7oNB1%a(mR99$7mHRbR:@onN%88b*dH>smm?M#$E293<0048*pto@@IbP.k5WI2_/k035bMI.s&DOS3GSqOF9@
%fkaGBiH`-DjkkR+9mDgZ@BB&Y>JnPuS?Fhs4h+iSO,oc<\'cU254;!g1%dJ6F:6BbIfCj5_24;ObGWk5P<Kp2739R09aFsBk"!5c
%TBg2!f'W40^EbpLYNND%I69K5qT]U?m#/o&`(dc8kN9U1++u5u4>diae0XJen>FV'-^.DAee$h9)hs9F=c<m-Jq,VproV!oAmp5>
%)h!hlB`)#k9!'*O)re]uX^t60XQ.5):@!oHHHjKEF)q0!`l)XIF!#Gg-k$T`jt5WDDn".+e^G&+bm4$L>tg^)g6'5Dag44L+hf&2
%HL9]]/-BtQl*oqnp>"2V?]XMo=8k'ka7=g:MWq<N**iolhZ!EGfWmKF@lG3m_ZUs+I_Jnoa,[kq[OdFRT8l\n]i,1"j4MYsagl)R
%%l(MOkKUrI*5SnJ45m$?I:@k%(D+PT0C8I/baQH"#KN]?^;S!&%e4pfnl?5_:B-T[J(qLmIeFbqS=YAcj=dio\9@ZFehYE&f1oU#
%+Mf\8N,/*H)))<'p.V's\\$sn3IEp#A`<^Am#TBr^L[M[IX^?GilM#NM:[5qC^ckegA8g$n\m&5<3TJp>)le']Wo!Y+'L`]b),iW
%mJU@2*T5`GF8=-t\'Og4f\R\\/uYr?("2[4Y.;i]$oPIf279P,=eW*;Wi9k&a9moD;b_,N$F^(HgJh)jX`1<r[S8WeiETDqCn#0S
%bB)O,2RZ=;[AdML29*(aBr3eYbK>c\;b_,)0WQt;D+lan@4aWP)q6\\]Lnf)-JA5!Vgg7Fi8uE#D7ADo&7dbHk2$EPVL'm9.=nC9
%)?gAEc98c*q*%LW&6XRNf8^I)TW95RlIlR?'V_,I%-4U:]Z6q+[Ck\la?>PQX5b,hm]V&_9c/^[E7YKmq#8XUQ4Vm3n#&;QD:r:!
%A&h?"4+!F>3+ad-5Q+f:SL:O"7b\UF]Dmb8I03#a@l(#:?:>,8Y`ZQd0iW>I'*'[#r!RSgXc;-8opc`nQ5\5bm'.;=U)3h'fsR\k
%M?BttgWd#]eUaj75<lgZG5L#YJ,f-)^r`ukf=!;:2s.rS2kR:$Hi*O9g]-HWV9aKQ5JI*gj1sm]>8Q^E?bbI/95jPg^Nk0VAD"S3
%U<^NIF47XggdTm(aH:gil*'O?qeLuTSp>JCY@@6B(9U"fs6,gH?e8)fqtJguOnF^Ibp2O%?bCZqI^6V,DuJ=rmjIXH=3La*Z(1#+
%Hg+>>5&of7gM[mX?J`3&o4[3^P@\njmpA5aG3&4hMf8'Uhtm?HDd1gG4Frj_iP"he5DmeJ=mDXEH%Rn+johUF[r:Ah?e1;<G0@%\
%g,f'Ac;-+%X<51+DQTNnIf;I&^TVSREUXapG7/m[[smU/ok+0`c,\Ge:OG=d):GRhD/Rl"V;)X"E(9B$]Qb%Vjdj`9F>^^V)?+R4
%a2>+',MsTujP/5Dmc0A&34?B:T=@M6oO%X47@gAma7U2gr<d?-[13([qUd717K+Z.a?*FXnCmi%?qe:@,X1@oaH%t3s*hK>g6)E*
%CFX<sEU+'W:%;k=m_QL7H09PnqZWaI4mWMoq?\fC]tHs)K6b/,E4")?dGqZ"g,ldQ5h]!0%t$P,Im2ep-ff6TmQ@V[DVf^NdX6Nh
%j-sLth;(Y3`67Wb,5W%gA!aW1rV"G!^HW`eE94RPp>=)p.R$oW@_[kb\/6L<q&+Y8:*WLP:Qcb'Nu36c*:`gmm2oV\oud**Dsq&E
%roVG9hPT,L-8NH$o["7uOU"(_32GcGqoZpT^WOsiokg/k:TC)^qSAJlrThLXH+e:t\Gt/ZUC?>YoC?^A^%>t1qA"T)o\XR<LX;fE
%J!VCO@Ut`'q05QiIfHb\s*C9@m<*^Hgs0&nc20G"p4qhseI,qnjia-#O)Q[<h%(A<Qqq<Z/Nod.2>Ku,/^D'p-a`$sf.XT\PF4t^
%#4cIDc(2nSQfcc4Z+6BNBg+,op,SXhBg,7[4HEDOG#?E7@jrM).#8jQ_C'YMc><Hk&cE?]gOjAol"Ymf.elMQ"b#,BpElHC[ulB[
%'\AtJh!>RAmd,QB-S@o]eUn0GY=#kTlUgo!B!@U]R,;f)!"q+F_/o=V2oN+2Y2ra(hE)YNoc_Z#:>RHtD\VtgD$0glN3FnNBLY&K
%Z1d7lYL"K.$(:>-nO^1\bBYk'I:ViB\9%Y>k0r%Tm`FD3R;]^Z9eW9Q3fC/dG3@*?BUq[uY]^.mk1<a9pp^XN\"C<Y*]CiEGJ4Bb
%Fu\9P"h3?E:[?'SYKL&)4c+KuR=DSFP^UV"Ci1fieml2MGs8>JG^p9Ee"!0G3&#i<h(Qt0@Rs!k`'laOLDSi[%j:$jF,8H*Qb--s
%hu/MCEhB7LkLgD"D;RcBK%"pM9Xtp+\+7i!mtk4C?,h`=fb!>T^OGS[nTfQ^*-O\OioF6i3uE_)rKr<fY2.mhbFdO;(@cT-48@gX
%T@`Lki#(c!/;%I!cak*V^&>4s*'UGWNFNJ`/WF8PT9fp4\F]Q$`3C1.nmp<,h@8>aWAsVNkAmK*q]`YTZ=B)A@ce6*(Sc?kJl?jM
%ITu4sG2I]i5q1WpiCLBRINOC%/(AZapX@G7Qgnp@d`q:XbOB*@4Li]t6ok(bTgSG>BDML/)Ii[/_ftkG3P9f(SHi[FH.Ga'If"8U
%3Ik;II^^S#]mg!0=_dd/e,4`eR=+5kf:SJ$]WWjbqWE2(F77JlhToO=;,s9Z%#+>o\IDXgl4FCqnb1$!Q3([Hkq][8e_uS87$Tu_
%B%MmqqVpNO<#JI8]DT#(U/sgjqR%1(M(cc8k>gISI8uZ'nO`\i]h,n_1VT0/Guj)LI^p:9#[Xd\/8fn'2D_H-(#7$7QC0=N&XRo)
%`S$g+Y*UKn<SZ&^;*CM#q<Id8bi4q:q<F5U\U*[&n:=*bX#jN?o_%M:!bR)p21o1_:sphZ)g^pgDpWI#L7UKY:B`';k6]Z?n*FkJ
%D%/q\rQi(ZUjqG)o*4B`Fm$"<>FiD+BiEhaLGt9p_.`R(cZ18>'^ji7jB&@>D:SX^pA+6n[boV:DI<=g*bmL[[?t[AiiNON@hlhC
%p:bltCS;=fNORI\nNi:,X<3rm]m\kU0>G6VIb3BMEoI"O:QNF.GOapSkCUIhpDuhscM]6gVt/;b]lPs8_7ieLjQjG;M+-_,EV\4e
%K+Gp$QV9d.`@'1n,T,op<;PuCs.ottqJRai26kNBJ$@%(q,`P?\+V6MjN"uR9`C=1A`(6P1W*C.&Usbh%JHPE:=o'H3(2:JRFNPl
%nYfX=oi&oK*P:oG%:,%PDhO&Ir4?(Vs#G>eQY8DZ*fSpE7i<bTL0nSSX7K0JNSWiYi26#\45O?EcGMtd2q$#K+`NXB.ThCraCV!6
%qL5Q&DTQ8:Ed-SILPToQ,9m9SAN83Z-T%cJqoJ(/;ciD/#7NB"iCR#?nCmTZpD;]Y/F5G%X^2XYS[ee6=,'t`^Mh#;jZg!HRE0oT
%5J%Kn?J?h2-@U,?e('*ArI:GFqphIkF^n`_rq%Q30s)HViZ\'QrqQ9m&%EDlhu<T#Vk$ohrV#!73?\>Pr;Z9DVE82.p-@l4s5<t6
%H+eCfo'<cWhB"Ak&+"[I47ZkH_RCVRrn72=cf\*-^A[eWdf;PF\b"bUV$!V+aKmPtZbIP@k%@W*n5&pG*J\.jKqI=^[Gnt*s8U.>
%[8uLHrK%!P5CWA,pt(/tl[V-;o>&g>MZ[negtfA:9iH8*SLs5[Wj8+sX4dXtf@nqXRtYYC"Pd-AG3epS'6p3"%TKmmCuC>;B@H>9
%0jARbZEjeY`qZg]L<ionB%n/dJA#q]NV+r(VV%sh59gYEDRQ^H'/7'qe]jt./"?>=5:5<fVX<_^A(id2au5`lkh?"D!BB$Ak9j5o
%<@KR8/LD0?npG*8pitJVRg([ma,e"Bj3(Jheo'&E>DB8=^Z..c\(R"Jl\uj7PNH`<Al4m>0*L4O(Y[-b<pds9$CpV&ca=EN4oX71
%3*pE)i%pD]^p38_VC2r04QA`>B8QdMc5:n5ORTqJRUWVBcBV\ABaQjP^H'qJJ9VE$?#A<$D@("cYd3u[DRp7^kML?M?.YJA.6j]/
%.N->MWe[sNVCH+mdrZnnlhiSTk@#D@90D<sZg])(.T:PE1mQ%,DR4Kqht+p(?%o3SO`u&KoWPY(.#Z4Z@]KR2X#A/@Ege'#g&dHf
%2_44_Ib"4/ASV]l4;sJb%Oq<H[GcH5L=9g>IEM?>;RV%CcL2UimeiS;`,8a/bJX&m4B2/?k[[RR_QkaOS`sA`C"gf=%u4j3enfN>
%4G5\Tg420<;F9Zo&5mU.^=Qg$9ta\2NBGbA`Y.9lg<.>q^PQO^2T+_U#$%NFaH`U^6akL"b-J/VWETH12S:I2]ro3qGZ`uuS:^EH
%k&Cilg63XGg(K`#5k(?TOZhea%<)^U>L`jU/dt\u3<U_!86Ag6CJB&Wn^AYWD<lq<[djQMHS'kMre?m(^]tb#fTIrE:Oa<(:]kJl
%137r&njm=1gL%5C1?/Le4I0/;9J,F1gS0].5uqVkQTa@`\gZYX91f^eCNOD^@J";Z$l>"HS_k,dQEIN6.Lh^0+[oJRJK%ZlI'4-P
%__,$+YhC<h>6q%/GfqbS0JX_S[lb=RWJUTsO.Nr@2;kV`TIq2a`dbm+$*m&6;Ah)=4QSV"ms-7Vhedk*rU'*peM`)*AF/fW_^#U7
%>6<LcLiL@YIj2#daQ.*N!JR&H^M<>2V_^c:W)L0Mb&,kLaJMr9jqCX[Wo9fhXl,62O)r3%RGkjR!*`HDI6@DmEep?+-Y+gGr,j=N
%E:=d%l*%Il/2GJm;eQ^3]32M;0$e[;,qX)4ZeUkhs2RM)g!sram;t4o^dDl&ml%W'@oEI>m9uRI=a<+^Pg5@/iUkh2#j*;+b]qGe
%$Ub9))Y=_G:n,$AUhuVuhguLH@5`]eXe-pc+:n)<Yi\l$gQmNBfQ0<h[]9\uC`B=]TH2*^9cO6ULD8\jF_g:_!j!tiV"T=adTTUT
%N$#%aC-l+Y#a]3fQin;^;5WU"KMZM]]dl8lB]j)Vd=AG6lRRP9cA%fr.qK?)WE6p2Q6i?p\A/%&fX<#G.;[Tc1\9,J&S;D6"YY3[
%KK,'CIo*:#>m0MVFd=A$U=efPfh],Z*X+[lB]S2oDR^Shkj1S=n$pCX0;m@;[1$^n/k,s.lrS*TO&V^HH(=Jh8Xj*L3Qr.(*6JMH
%D^o!p5Dd[9:HD=;<nM3D2=5rL.:@)]0/#b!iq=8E3'g\$i/^:5Wl97/=OE6ZH0d,>=.\8.SuDms15*#'eL5\l\:G]%HcjMPXRm\%
%)Nl%8>i^aiFRkaNCc^L+^KOoYXjE^Ra6XtW^GVOqX'A4el#^,Q5h?`(.G6&I;WDLY.^2r=9F6a5qN(E0Y/erZF8/?pb,*_BP<%CJ
%)5Qd)(1j=\.EphFhenJAY?E<$(d\dHjK&rrlNJ$"SS_Y5M5=[(D,Vq+LJ6Yc`=p9E!b<\%\h(1#J?=AY#D-kU,M]nSHM&C>OI5kX
%X:$P&W$Ya@k8["q#64oai60m.Q1YC==T@1f68lV;!-9@LFgrdn?%K#:UCNCN_ugTL4_jd'GWE`_2@ZnGUR'fbZ=jF(aZbB.cJNuk
%%N]si&-m[pEbOCg9grOP@C=L\9$"pcNXrdR4&U[=j,?&I&5R[F<BMV\Z4NB,@B2Kp's52O!BC2NP&?a3GRoj&N(m)6FD0dgr)(ss
%E8u#=#6`iI3DhU6UoA,q$;`N3rcpP)b/&@FPKu+;HTDc6.]>P^kXJEKBgE4t$KqW%49SUhB1jBP!3\(UEjiW23Mc%qSL57l:aJn?
%C`tg3`V&p<C?=T(M7F26',.R*&KZR?+M;'NQ_lgSE*d:A4XlY;erB*S-WLr!5.82d;\dg5L60QadfVS-VLm<M/$FoTJ#;oUS$9?_
%(+=e^q5>ahFV(99*iF+k8%e0Q9)*194oPFZQAVXcp\6?39!N?\-HQ3n`qD/NR@pH*^eOi!!l19j:BCNt%0@j4$6[;X!5/51$eare
%#_$1-bD"^j+X]uDE:O.u!9[GiQf,:13]t(kDH"ZKn@!F*fgSdM*J8m>l5Et2=#[.1PsS8c)ZHmsT&pn"O.\AUB"D5?n_Edo5"HbB
%LB.]t;i;+k%SX72<1,9F7gZ*4/a$;"/$;25Z!l"4!$VC3!.X5_=\*1]QlbBK<>\lfH?'OP#DcFE-#nK\DI^1N<aPB)CCBES*d=%S
%GL#Z?D*!e!]"0''[=oSmNC2C]4n.0AP@,KnDA3YWrL73]!166D[tkh3UH0,CBN1+BW_'L8<9,MS%ZMH7$^hRX^`RZf+EB=H$L-e(
%04/m'7V\IPc0/?e'GWr"e79P7.XAsRWI1%OF\F%DeWrY6:*kp^44j$S$PEA"<>e&4WOg:,L$VhT,p5bOgtG(_Gq.EdjWh\gT'%0k
%T#(iL**g<\rrG]rL4Y!PGYVWQTsUq'*_IMlS8GcsI]\>Eg_7U-qB/0++:P)Jgc3tWdpVH#S>m-@:$r3V!RUp\AD0pLlD?/V8C@c`
%6C:q)?S*Fu_2ZLr)U;R;:dMV:Pt&aj6I<>^)j-1PQi(0S1nTGJ#4r,[09cruCf[2?2.,s)Jj,Mer-inu_=n#4U"34`FAL(q;K[bY
%#K0W0-;4Y=?0_0C(Z.VG.3TMeJec.[RKcIAYG<U,1t3tf]`)*%;A=S`eTAb)c8D=gefN/JQ`W->a-#9<4da5K.5-`JPpR/eD5K4#
%i>$WO;D.prM2g1e*dL/=oh<2QfDC8kWYDkS:jo#LgE77*\g^3^8UmH<!0l,ZcLc3Olif*WOql%`l#kA[5;k>X1r4dD&rFtN0,kh_
%bI/,q,19gCQH:,n!X6&EN[2REp49HRWcP?1+^QO9,,:DghD*,$8QN:hLg`Q:$IB:80*1XLP^fn+)[:ou+CYU+$jCPL9FINtIjllZ
%/]'!Y7NJj#:Kd`I)C+CW`ql5NUnCkn(:kd[q+XL)YF59!G!aBc4CC=j;l$j"EaSA`>,3'fi,p\Yq7?k'!2LdV99sE<+0-i3&7fR)
%brR?cQ-'-@<8R9k'^`?\171n_SNa!&])Ek.H1A]ao)mYNrD!"X,+k,8YlN7I']'-)ll-Mj<XJjB"Jd`*N'mhSG/4@M<<IZ[04ibt
%hZJ#aDCT1D/NX/jGspp['l$]U&:+gWfa.37X:^79.otjmY/27;o41\M?3)YbM!D'JSLm/#!-*]+C0d:tT%N#;nS*XG&FrOl9B]+F
%h5H4(,S.h"2*sTG5V.m:6#0,TUn]6'(DGNRA7J!dK6GT:PYOn4<!7?(+DcQCTSM<d8kc7VqfQp:MH]E`WMs:4D&O^ZTK%J/D(5=9
%Bm?KP9e("Fb`I(qe)B#<k"nD;^u>+,=#4)KK_!X62-#56q@mKN"2n,N+hGZ-QB9[t^0r-6l>7rN&?c^e3Zq`F/!HQ6$\&J!dSbTX
%$;kT9TY96e:(22??26A3Rp`tJY4-a<NDO%gA\h\gXkEtF9t8uUcA4D%V@(WTM,2bC8\Cr\?8,I(+D?k'>Wl5*>e\u#"9t0bA>"[E
%">,@]d:62enWI*h8`LHmm&fA:Su%9tYO3N\!+K`kAK%dlH&WfU`;K]$pjFYc2,'*0!tp9<1;!d?S'>IL!$LW\CK;,ZC6aPPA[6Fp
%hC>MnGU>"O%3W<(*DEIeO!dID"B@tf@Y><fUN^jI@"8qc;'dtrH&BE9b(pX;Q>V=?Z2cVEP!bBia<#1qQ9"I[XE*l<"!\:!FWj/s
%'*KPAVH&c.0/1&jM6-#e9-3AC^5ul0d]3dS[oIZ)_N\M_JT*loj^5&WjjL?SS<Qf[o>XYX?+rA-PO6J0QBcK\N_0Rn00sd_&)n1b
%49^Q#JT7DnQ(HJ2[a9QYW>L`da&=9A+p6o!+lSS\<<35/$h/$9F'-4XY]kR+N%tOI!eM,j1G0Ml82>h^`*GhAa\0M_)@W\IV<CHV
%_=:UY6V:iWrbn@Bec%m%4A5a)QVFT+.m6i:]i!<5YEiUHAY??(lbRWe:JfT/8L=TH%3%/!qV1!Q<B+\;p2IZG.B.nU$e54gYmM:V
%ppKTk\"2;-f2,6IXELEWY@UIJc<7Dt$`?c3^Efc@gM7\NLpm%$K@-hul<%MbC#g^0S;N(j<J2fGTio'.IenGlVP1H7hDLU\VQ/B=
%Lul=E%UKfH=_#)IU0\LrE.?.YC_6XkgVN1&AIj&WklR+dEp_D2VDZ'5'l_rMb#=tF!9.!#+hMS_mc5P:W>o-P7c0tIge`5Dje9*o
%!Xb,q#&oY.M7+"lAsX#gb[6R^g&l>.S>UL8p3ir@KaZf$/;%W"<WXc#fR1BS2??om410`C:!%gXM$oE>Bkp%M$P`pY:^Z#c%cq7B
%Z><I<ZNh%SRWL"[JAX55+IDmkr\1B&*sXh[/NE!)^k&5\Z71&i<SK!mG/TqfEPSeFm1?WC&.;.c-)m4BYsZ<f/"GG5`0_MM"<eu8
%`qu2j8m#`u^9kb`aNd!=U,t>M8?Q1\*Zu=IM]*]uC34T5B`cM8`fN@6=sjPDVJSt%,&=SheMWn3J8m>tJMRAeC(5'bnl>u?4ojlZ
%"3f5&h=IA*\&8[aG1#T%:/9T.1KT@8ak33V_4X>LD1pD]n3-Cd,_"Kqc#cQnkqi*"=Ac)BX0aJ1>LW*M^+=qSP\auI?s-$:"(cYs
%qOXLL;%Eb[nsEt2;Q^_5210n^XC-Pp_[uG[/./[q.7h@4"C!nn4;$*Pl:n8GK,dHUJ)?dQ,[uM1BXuHM\h[`TaH*o1,sH[uWq@Qq
%jFYo4IBW3k[)Q^aW`g"kd`a4!C$4fgiois\?qYJWVgYj)=VNLU-=3b&2;c9OlY#G_D:beM$23Qk+r!f/;Ga?70o]+f&KlK2hN1WQ
%DO_@k_pee+[,D"83@1dZ35MjI@0[]nmAF6AYm)[Zg<5FZ`#XVTn)]Q3ku=B*+3uPQjl6ZfV]lnpOWpr=hhr<dB,.[(c9.b3[_.F2
%E>'OVa*ih(+ko`H,t!/jfQ5go=6A\/+S"q6.%G5p8<I<Hh??\)(0#D6p\pXm59K!%3N?)M6o>"^Lcn9BP^0Mk<SNCh:.'m=P=Va/
%#'g.ZA<^,C@U1Lr/0<U]X+R_i[lX5IoCqG0?gBIA1S&:/8(6/3Vm7-]*JpX+e,*HOLTM)nWY")sX#+f,B^2V43fgY5GX0.fG_cJf
%`-q3t?9"r^\smpTN4Q&g=9]ms&t,XWK>^\_+IK'!GteNQ5XGCW(rqa#7&t#Lj@89kW!-i^Bm#tMhLnSE(-o+4gruusS_>(4AjSXq
%l>S%\bCfO6,Eurqb/gPKj@[Q,a/:+"`/u7LAD`:n'k\8d0$ZT=B"#F0_/U88QH,OgG9Q?d=fKY*Cq9kM5q/<sK#GQ"TQ%b^S:CcQ
%2m;\+[^JqS.cWC3ge>L%oaci^%hRJfp`H&[K^eQM%94iYn8f?$!B1ti+$^[JenIAk+OPe]J.HqO@tna5L_KlcC0EX,$;lq=(uooT
%Sb<$T19<1H$3Gs!6P*c>.;an1aTPDo8[)KH#fa]haTcd)s4"`c3V\*SE@5gJOGhg>l0*Z-BNu*J!iSrk7[-5@8C1M(GVY)tMVDq"
%:e?,SXMe6KgCd&[UE1tL&u.,]@ItD5Y*P1T?;_L52ORT/`-$bnb0%TY>O+D,BrtVBgA14Z"LgE"7J6Mi7!R(Tg-R$):2EQ;^(J,7
%pM)QC6I%-m6BB`hC(2B=+T01?&H?'B+R68SSuRd'.8frXN`ni(fHsN0n/fg8$M.rr^K8;k=NSrEG1ODZ@;!tCKD-;#?!cdtH;Y2J
%>,R6:b[Q+$g&Q<<paF<F6mM-1ZM#4?L^cXZ'kEgC&gKXs==)5qNhiO16TH3],s3YRHPJ(Cg=;K%+\PTF+=Y#//'%5UV_$m4gX:rU
%aN>E;>m49nrrGSr6b+X&`Y6`(GR`4,`eD2:%I8f8j<$t!6-,*8r^m*G\<3A7G>@1'`PNV")D&(&KMB>_!8GV(2B!MIXHMK[65iHp
%7KRc>&[tdQe,k*J^mA?eZl6L2ibCa::3]Rs<S,'ccg/i+_15440WM#dY:p"LQm#M[Q>NE2IeSB(#j"diet]^qGCd=b29?5#&e`.0
%/W:^K<"3CE*iMWP!X,\1JsW&96no,b88%q45[`WB+q]k,Nhe^?>U8NA#9qERRhRkM[Zuu)`!qbi-6>e?7+ou@>&?8H]qthV!='6*
%0kG\`_;HJ,8G\)]k&l\Z=UGC(PTCirA%XM<YB<eHiD+2;^\YRl$.5%u:!5qU:1GVa;t:mJ5X_WS5ZHMk,T(3N"RS(VDcP/S)3=hZ
%kX7"De8p.?SfDGAV1n"N2_YRonDXJA6p:`@J.C1*eRm,M"N-'W>CpVMdPC_^-]8H8aQdt*K#2)\pCNst2d6u:V3?-UEZQIqA/TS@
%7"1&]O3do+28*c0l_>nLG)4Y".d*0YWi#+S[7E.l3/]e>Q+BQ*hnpT&/5T(7Z/?pc&(QAgl@DRU^#T\lJt:EW/Mp<L"4`TrF/4Ho
%'$NToS:B4j-.!CDQope=)mPH-Ll]J"&d-L)b&"J_1EhETLj%Mg)E.j>)L.YiCo`SR%&3.k]GG"9mPRIC(fMB$fOJSW+q0'BMq%ms
%l]/DmL@ZACdr[;U_T;#f;^aU.Ro0;B$]$k9'G+deSkp8be$rY5i/\Vc\ud3m1>Jk50N6NuROr3aLI;<(>Z6O+fl*=HjoCMPPeo(Q
%3"M6f7bSYTY@66TSc[ar"?mUEQj,N<!X.s8&;C[Lp_;Ln[ED&I!V>"-+Psp2OQN@WL%Fa)[@6..9uXb7kor"cQPok-c;h/?1oiK+
%?+H/X:*Z^1Gie089Yl83V@uP2K+!8BnH79s/ai6o;EilXfMi.g+hQPe1_(de)Z$no10>iJ8NU^-<Y=Jn.9L`I"tpm=Y2'NVi,V+#
%6)d2=`&YVQ;!Z=/7H%%,Lk6c=+\8Qr1'l`(i+1U(:P%i]!b#?FD4<f21nYEK[?>!``-PN83pSOWRD0%TON:0')9`o"&e24$M?nVW
%&4DQ]Ic=WiP6(?07)NKbPTm@KGT78-FPO>DKJ5]b8@:(_Vm&YgdXY.QAJPEuF$`PF'Thm^]I,GB/_t]<:MJ+,\nD_pT*D:Ep0%[L
%36;[kbjT[+;lE?oV\t/3&n'6:75>`mTE.Eme)YmWj@f&q2"AelK)MZ*pILf-a?:cIM@LQ'bB;JsPTcDk9If!MW6d9NLa+'&c8E;]
%[8EaNTL;&$ZkBWs/&\NK>$U/5+i-1i'G>9&Qps>EHIkEMC!B9^n8^nL,Jb:OQc%FB_>KiP$5oloePOU:<7!B&V%g%.!b$ZA<NXY+
%(>a5iKHe?+(,0o67/Vn$?Qj[?j0*1&LCb]M@fcSg^0*p]3H80.>u`Ds@!DeLG=<,bW'RpP)5N#A.?^,L6kI7ZRtqS!O3,fpM*_V`
%pmR;Li"Cs4Y1:IQ7!QKt>8(>,9*UC`GC$'c0oS?D?90&6)s/!67$4_U&PinW5j<@F_%=h6M?jCoXI/#L&dHXEUFHHW=`O:;--kjn
%,\:N"mjYm/X?(ce/2:RO@%:Jo',hLn/)@?Cn0r<a0dHro/"1$"bWi@Q:&%97*g/<WeWNUfU,<5j!tbY]I>nN`WbF6i)DRn%Y9b$%
%#9K/P7j8?GJk!N,BF$9%c+$`9U_\`9YX6f#)-Qsd_b<mI25(]q"tD@-hbVQA*h\]Z(KZK3cHn3h\iIZG!&5dlZ9emL6?<PY[7'oM
%4n'`FF5a.W2-)gaF\<@+/ZB7O&A3f#i/r'SC?.#+GA/p5\"gj!.87,RjB6cMMFik[*4,h.kn&6idHj.\7]@!`l5HB.?cX#3g'!nB
%7"@'s>9JB!'OofN8$TohE7IsYA6i7DBg@Yc<3=Zb8-iNh>Z+MoT5'2EBr"3R0RB@,,[*-r<"hUr_n;,8e!BsOFU3t)A]c7.UZ<[W
%N,^/^L0>8eg6TQR%MG-s5U_'OKI7<Q,PmZU&E)j'kTY:l%O*%+$f\K)`So`h05AVgU-I(o6:j!f^BLo(\@&(:bqi&n:`0[j@GZh%
%TWKOmc>Si;VE,;,`<6H@c#Is@2CHS-SH3-$$fO#7<%TRWpC]qOB,\mlVf.smU]>\*?7gFN&AZoYaME`2h>s@l"KN:_rU;g)"^C'6
%3DNNDS&,(%?N=L3KLDh^o!uu"8>@GRV."reNiM5g#RbPsBs_r?d<#d9TKg;NRYED\E4hL1[Jj.<XGg+1Y`b_(1W;r-g#5&%GfFG%
%)]E#F%cVjLEfaMF6otSb(1QL%h@<M!`@"ZA@29DOF6f,Xh1B'%Q^E,)iG7'QRRu^3_Jb&PgX>DD9O$0pj^PM0/1r6O4WqrPKN4lL
%P6$8.>,BhT9@6K8.hSW]=N.cOBFC+A/kt-=m1Fd`+LjS:^QDfk5LjG?3_$$M8U@8[0F1<h>pH\]'$V[Y(QJ`2YBCB;=U!\qj[C0s
%-@hA``bgl3@2HL-,^_lt(oQR8[5UW,'Z!e5joDEm3_PnDKG%8n;0VM&MGH5ZblQB2l;;-@S1BS$cstKD+LIeS8TV%fD6q\6;A_D6
%>dKCoXO<gCL^6o#mbkX7l7hHOVahH<;#tA]I7BF_r9gR^.4!.=&i1s[<-kZ:K%mT,3P^=5Kqp_1[\=DQUcC[ciuo\m!R`eC]Z'Ym
%5W%;%ZfZQFc'lg`l@oOs8j^aj"%4]*.;Or"VnG<*c!bTc4c``eg_<qW;q;pH;lUC^X>t/Y_FJ+e*"K!4]Y0[iLBFBZ5:"JS$T`02
%8=BXV@'!!nRKH"c^C!PRcEtH36I$QaB3VrRc5]EWjR$[,*2oc;W'\p;Ju#KY%&R`[(s/^c8\Y?-4R&XmE!CI/UrEmPP!t^Kc#Fmr
%?)sDOa6QW<n.rDtCk4u4C=XB5NO"#!22CR9M`bbbLJegEe'`5X<<tN]?(M:+j=h\W%:LD.M0N0<I#C&Cr':HuX(KVeWmG,o8XdP8
%eQu_5*+0u`#A5\4[P#L5b&f=t;eks.,gG:XP49Wg2??ZbX!Z'lU8Hb61^=jD]I[b,MeSS4Y)-Wg<40o4k-+lhD'VSRPNK)D)K_`G
%F1_b=?QgGM,Xi?f@aZ6(oI4EK<GJG]UcAEC(licK'"(nY!&/7"OOBMDT5]"3VG:0,\PKX>$>Rc%<&PK^k(l^BQ'+'2Lau2c2b3`"
%3\d/jV2p_*2j_?;>n2s"ZIUjN%\IC1Rk/K<'Bb+*]K)\E7@#lf4n2]s05o.`F5LPSF2V^W#RPct32VS@UJfs=OQ3cB;=?VfqX6c5
%*&,?QF<Mcq3<qs:!:pae%u;(G-#q5f=NPp5<&%I>,0e'E3C%8QMMZBl,UUe_=@eqa7&6333/?ro8o[In"0@`?E(uk?/8LtbaIM:-
%OW9"@3QJ`t2epF(_lcPlUQ@KkSR[1hQ8s^`B0p*!S0QV.C[,IV"(haYnjVQb-#b\(jj?T@"_m*=70fg9'/Sf:1I[H6WH4`5@PS@k
%F-MPdVs,%]3X8b<]0h"5dPR0!e;:tl9\W42"&'\s+a"8+nW\a_\K4/&k;Z2&-e*Peb_j7MR(%oA/PVfU';/=5Eeq92H36`V4q^nR
%A)E/L"V<O9.4M68^AT_l^f]VD)I:%<01d*;hSLr!&)CdT_0Aa"?a>HO7qMiX;;(S+f89MVbmEo5VTl#ua>K14-?!T2[Q='^0k/R-
%h'%D-Eq%h!)([fa1RMd1V9p5i=C]bn&=DX6?cREn*@Ua'V*H0!RMZj2/4;+EK;fjtO@$(K1c;,s9a3$dJoeBBT5m8ddl?;Co<3im
%:NHkVOld[G-XWF"FdeYt>MrC""l6$]dEUHQb@"$m<L(D[d=fornVn_H0`1$:<>5ZjHs8*2gg-,lK:Z+('SSnG\3_^_eP7X3h,jcc
%nhT*P*J!#W%0,IY5ts[Am%qi>S2Y!G+4oq_H/<Z$^XeKm6BaO.?c_O-RhVV:nBpuG=p%X%+4>F2eD_=CMrit;(X<,:p1RR&O=&YX
%&aL/&lTD7)5mkSbY6c*fDT?\>i;G>7r]MrD:]<SGjS-%eCYaPO`t(:]1jg[WMNW:':mP:0*Nd=AIIo3?[TD$P+X$]cOP^9K$L\#2
%$9>O-'lT0%3/9=Lla]M_a[>($Z_dHe#q>[%Nu1]9[f(Q/P<lpjLG]@@g**Q[k7E"#+"u.`!C4]""k:amn\A2!"B;A_DG3rC$UC_B
%&-.NQ5qF0JNMKRh=B;l`T!/5TImBiRQXpq'c#%/Dp.%p_`m0GJLl:2M'>t4in.SI!9!Y>q.3\7k4`q"5BF4JCV49(<Jt1l>3q6Nc
%/.9KJ+LLTGWiS;X^Gm[brKn=P1WQEmhhrWL"D#N"@3jksQ8BadPt!HHU!WE3@C-9*8IJ*#&eaXHbim^]Ti!/_6Fqdk]7a)bmfs+.
%Qeo%G+X>q\*2gTt,m^;Y.B]%G6r\Gm7@=.LUC!"tY#[P<#7'2dM%``$AS84Sk*680YZsi_"\@ek&u)m#8dA%k._Rd*DW,?6e?Y(I
%U<hXGnl!A6Rn$?0>$qahi^g!g<WS8<ij,2AMFV^-khs8M;)[7h5V2qK$`uXIYH]^M2'Uu[69C<7@+HU%&8fL:7!TXc4=,s:!Qmm+
%-nmR$"6`:Lf<r@DgWQ>Ps4ujhqjb!L8F[GR2$@H^gfRH-4)rCsU;3B%/B#c42$Of1\-9nP)'7973HhWdmm-6dG?]4%mn=R:<LihK
%4j-#>rc_)dFE74Q'(=nNei5C'1J;/sDu7D@mMVIH\cSQSKDM8NiYTE?6![Usc.$5%!eeR_ME4lb9LP)0R>kE#g/rWTa9I<4)^>o+
%4cq/1NpUg"8s<6Z0A45C0p<\(d9AsD$CB^m@&a2dBR@Bp*J5./A$-_^aU3G2eMc9i;@8soYhB[n/$5AQ4^elBZJe,iXGPb!_Bhdh
%=.)/k?kniVS6g"rSBE'FijZ]_!j%Un&E"1K[M8mDKqpi\`8Y?]G95?XAJ/-q]+d2b(IJbul:>\=pj7b_(Y#-d982^_o'*E90?^S6
%=CJ@X.?Tt,i>'O\="MKgNFflV*q%pG4r>+r-o'-Oj>7M%+iA%BK;!*@@Z^do<h7`oORPe7<Qu)G6p%nT=;YchrI[umeV8B5l@Ytd
%8;L;nPZb8iZ\<3U51>2kb/B;<T=jlf9^VH0`>OE7W3CC02!EBo9hR1)b@jFN@n%FGB!e!b?WS/7<>VL5h,SPgC0;*N]6Imaa"13=
%cm!oE]sk:lnQiu"B3G.SFJc)upA_*B?h2Q4WZC,*3C!+Bmi#rI(#6rK-e;UE)hlZPLOrjJnf>m7%`r==#,O7o7qM?kCEU`aiO`"T
%Z4P(Nc9sk-]Tho8q?f_=$qbQMmTLCLLq=0CSR)Ep)A*\klTZsU&51`ETrLuA5\-WU1C,+R6F9+IT5;\]"Of3D:uUrU'&uD`\,biS
%LP[X6A@XQa2S"u3A-N4_ATF>$UUm\aN*EPfJuQkpG:'u7'$5.41E)Gi>8Gr`3!'VTX^q>0UEigJ6/k:G#N\'IYhfZkg*nTsC;G_0
%,?-]P,a=iWc/0p</Pl[EgS.:P1mY!O7h<:n(#=%l%VE['fUo)t8K;Rpa]-c)X;9o8E$)$:5XkEf&:t`e<[q[`qa:`_85=cM)c?.,
%VA%pKP`9?Y?B8R/+pdcL'%d1_fc6_1e\2#>&mnuiVJ/Q7+@/2FQmd0u^:FsJnpe_Q-D;R<gk`g+'GOuNV9c#JkrRd48<+L#*;.C/
%Q1m7cgP"XQNic?<LpbXC?qYjDOJL$n.M2`qMOK3r$[E,qlE2mnC80:GaJcLS&*E"*oNdNIcERaK2Bo5.'Y<]9'+BN:/]D[BllQQ!
%3Yh1#pucWYR*Q&NAXn+!^_V\4Nad00=<4PU-dciI&t)n(P;-`F#4_-sXlM".V[Dp7<7-XL,tRl=K[F@Ej:KJF&@2CK$K2Ik62^:)
%NYhC=XH;s=<1M)dR+Ojf\!9pZ_If49(&TlA=2JYE/@HXoo/M'S)Bon!`k5i^I4W'(LLVVkOS.q5'b\2_3mj-.L.8l&T_9H#ckD5k
%[9LPPdJk@G^:,0tH_auVOg6q]CWP#!F-.:."D/Xu[d:sVR,q?9M@`VrNL"PWL]QNglI,aQbR$TITaQ:SVM5Nc3">S_EQht_1g9Ho
%nPk(nq)a7d=WFG!CR\I-1_:t(O_B+Qm7/i\;bEH_Mo7;5Kc"5C?PLsL>fWp,D5CVU2RVbE&]**X:g"=NPe8/7cF:tL'"F2_'%@6K
%FrgI'":1l$<`3-d_HI9EXH5c(%MaM]!k[S%M:]\/R?*"*$&F3[T.3r<%H$W3;CoqGE;3eqp870:*`K-]S+k@>F\KP.ZA5l01f#9=
%d%N:fd@L>gYkV;=l:5CqBOc>V"@IT)?o"%dHN1uVSS`[&$nmB&p3>7-FI53k8ABamU^0QL9/)Sj2IaR:1BKh/1a/3o<YU*0EdL#O
%0<.(9'Is_(.3dtH4ids7Io2<C$u,]PT,rfbCtJm6:.`39'!NjNg'BuU2R7q;PkR4^i@-Vr@%/oN=+`B8@YT]RNc&Dn(h,`q's):q
%,uJ`B<5Y5`U97J'UUCA/_rQ,3d\/Q_m9'i=L*hIj)aN-*QE&[3pAc"d=sVA7n7dd\ker1N&DA-q+Q/VfGJ+&M#s@*Lb?tOW/</+/
%X[)fL&T\+CQafnX:.jgYn.84:G\EW]RhnGgrg,/RQ3u?=Ubb_pg<3^5?sE_0X"'fJU8,'1.bDd?=@aq,>+'6Dnp1W%mpRRJQN3a.
%X>*6s!_.1?$<98G^`Goieo$Jn+OA!+"]U55OS#XpU_,nPlp%aWU9@e#"N`6=bhp.D<e\UMH47u#AM4(X+H<cQH\$p.9S#`DnO*J6
%k6e(E)7#d<WT9JEX-HGql5BZ4mS:phB+J,o1rkPTVIeI(BGKfOgSZh:1Sdi<RT,+CeS,^ZR=-RoK$J=s.9`W@3?(lA7^=SRKpjnp
%ADFU-*f)ah+8>BnkZPj^X>.p1Cq:]mBj\[+8bV?B[$ER$r=<(Fhijl4X4-,gVMkb$6ETC'>&@Z<Q:+5,JuS&Ij1o%o>[51E7Rt?4
%WMD3_YG`,JqO#/%;8]]<X=DcL4>$NFVf]2BpIc;1fa"KWil#p*l9[\bR&3Ie]Vdn$dSjl"@AL/NmJ.JQ2POlb,ia9r?r7PgPFXkY
%K!7YZK[(P<m&<6M<r3]3)DONS)Is"_\<TT^;:L2OLBBr_Lo0Q('pfP')I4>K/BDAOWQ?(*JkQI=[[K-NHc=:!7)(b(AFE\HQ??@L
%BM5\_"S59)1a!H3-dgq4Zm5E<(SAak7UW&0>["8?b1pR["s](mG)pOUnaQ\'nh3rUK2:`A%L\l+6;*ammhB"m?G9)EnWL.>m/DE8
%NKb:mVd(Zo+BI+1pT,ZM.0SNYUgHH7.aC/:1q#TB/lX:KfbFDU0o(H")3j&oSBKo*&@'ZlFb8soY`5Y?qhqm;]"'A*7Wen.=!Kac
%"gA!ZUXI69r9U+:nMnnZo(EhTG:'qfHJkH`Z>Sns"tC<m>H8d]"HPdJR0-J5GW(?9lmm8J`T/UtT9YSk]//CZ9/EUJIjU^B*V)(B
%ENpD,QlV!NVmJB+*#m.)BpELMi>;S"[2Pd]cC0uKKK;OJ\rp`#B&f*(G$9upM;Y`t2(Uo!:VUTo<\hZiPucOK->Q62PdV(qW)eP&
%R>[hrll^1_Wtn(IgIeLJ;+F=E,g<FTZoEYnh5,/e;L3JBR@!#q[jTC85u^-&VIE/-reE)4B+UVaoZU.+_7PtSZ&a"u;b@ZWgQ4$E
%-HP!Sh'6Z9XnZBP5#O_p&B<NA&hDA66ouWL3XnKW)c;fV>!p]UW!W)K3[$h],"^DlEd"P"=B>agS=(baC?iss3b^q"-EnMR^\A@T
%Z8>#f$\_1-1he07dD8AG5JS7%$OF!)N4L0G@)Sk2(pb(\ohk.d'V=d3bd8&5(+R79H")F]AnGd)KLbb@&&48XbH-tiC5OpV7+\Op
%HcVAW5,!WfZLc!Mr%F=Fm2b#>RmQ<=lZob,;phRsJoQU;'C0#mU=dF),OsnN,\Rc7k.i//XhmG`h'PM_83pn9`sfriVdG>YmoTk:
%MJ5/-+Yt)!TQZ-0dSKqRKcHQ^;gHea@hN.hXLs]A>D`n6H\sYFQL7@]m5/d?L"/eo>U;7u0GaCPaF@o-Z.H9BYJfmp7bq3AV_NV[
%VV=ZHhJk?UeJ>U?Bkggra7jFb55B\(@V$oA(;%Y>>"A\S<ECK?e1PA&/Tmd\U1TNt8ZGfh.2)"sV4JHLpOS'bdT-hB"RBu`^T,X1
%!amQ-0I,Sh1$h\H2Ht=@QE3nl`!*$PFt#>f&:m=;jFNn2Ll1S)2%BS\q#?=SEao7m81!bNB[7<kl9"P[q$d3n$F*d\Z>,!?=ir@4
%*6BUG3Ur<PqY'$071R'Xg7sOqi,sWs%C)$.X;S+)e6t[GEs$#%Ll8>>!4$E<MQ-Z#+c+6g:b>Q>NY"*_ZVL,7d$o^M]<.?k(jW<n
%0Ur.J<<`U5,Vp)FVGEpS!L"Q,6n22-A]t//=[Q0l_eKY^p44o[:?#raOHOYKMl+iF?.ljj@nfP\UeqmMCbPlOROS(5VBPE1jWLE/
%m`7XEe;BoK,SUp/HH]FWP1]t7K\;SN!@_IZ=NUKP6458N,Z]<o=+m7e!&;co$A?p9`3,lL_%'n-Sc])qm%%Y,.mPY$2)O#J4@$8-
%KW^$%*<Cj)1A$qF(7dn-9dK<2JF#c+)@=I1@'+O$hT92s7"+5PPWgWh[X'W>U+;0EFiFfSAXQs4$8NgdV?^O4>aYg(Y=&re@7Wiu
%+[fKJPUmP9k:H<r&l9<2e3g)M!ELA,!t@di$QR?00FK;E=@r`t'LKr/%T&T73j"FS9nXh7-EK]9.Ei2]D422j#Rji`"Hi/)/qVW6
%Ce!]sY]MN@$khejC8o_3K/"`")l](e9A0&38R%Ho8in_m^hr-16Y%o[9NQrnS[An,6/i.>PO1.,6.H%iiR2_p@Fho.m^:Vh"AJ*4
%e7f[RYB7bk;-XJ_KR%4O;G,_cL/O:EI?($M(Q'uS+8RZpULYpIQ]i=/g#nk>K@d@F_rkd6?VrdSm0/#Kk_.;Lj_Ae8DKEehO%1$0
%*Rg]f/^03Qa!OB.e4lpSf:jAj@IW&[Nu:VV#]o'b:_1k%6IljufZ+?<X=H>T8\a=3C;CI8R4o$'$6DcF^'eZ73CKnOp0a\Wfgq\7
%Z,f3,?6f+NA7!]Z)_`T)E*AuhK52`_abf];.YK1sBX@.-fb5W?IC\uL]^]te-QW0&kCb2hT*hpY=\IPoBb@nonSl](pKcIHe&(o9
%PjhH+'cd5k+%GRuXu\8^R??2P<OF<e-sagEYQP'CL0F<pLUC;^XfE`]K)?P?[8sl3=Yf=V=o@$%O$X23+JT,m!6j%@o0O6Y'Uh9r
%6,j]mS"9Yk"8;qoQ,/a'ZMYH\(*n@RnlO%cbb%cC)b3g%UA)>jqj2u8mg-#(]ET.F1>dZhks?G9JqX[4OMe0<Ur_3,;("dI3@gEo
%89]iS]#+Cl$kS^X#(T^J4,W6R*b)nb8<QCV`%j\2TYc$G>29RL,lnV\_GY8<Bi.ljgeR`U&q\lXqJSiq+^/fjerjSb,o0'A\K;>r
%F<R`-M,H`8A0n$j:1)I%WQ"9t#lL=)m3V""!Z:1NQ\-c]3,t<TE^R-n`Oh->+<a:"*?3*q1@^*2#GAOc+]u>A$-1LnLq#6X4qb`C
%Cn9C)Pj5&G5.g-H-(c]Ok"^`&5pNdkH4VEA8_MDqP?R'^,i-]2HZ@6*2JG-6*/ok3^u=WVpeE=7V\99YeOo"]#:u5IPpPDsMs:Vl
%MATpX8$XrXm8tHkdWEE$-X#gsp8UfUTm/0K=*=u2+_5dCOJ?om,&)tEDNrf@;2r>tL2shhYs^cab]<t]2`\](m/R0CLg):BN*ZL7
%[&)Q$1`tT:CJqtRA=Z=I5[KbT'>=RC%)$)f#cj2q3\LI]3j?jI^/ZEA=.nq#!0ON?R*)]qMK6<q.T-;e]%Ocpg+koI3%Cg5?`>?t
%"CGrOkltNH$ekf08PcR-75g*\-7*#%0+osJ0uAZZ9EPemM%WjCAN[ME;N=C"^+-Gu-cj<k'Q0arHNp_&1.8.q7[S'bbC.^^W7<qE
%B[2/M'(RpEE.FDD\@$8d(+PEO=p,WlBVn4)F@Xu')1j.f&_$2A6(P/'!egR1J/"6W!L'r7/f(J;hK=@Qh?tH,-1K8gJ<dFOr\IIO
%$P5_s!c>kG%S0YM\k-liHjj=P5bsbW+J]QY(r%)Ko[?[n'*o;8M$!bk3$J4`]X<l+!Wq=C(BsjiRkBm/g/9A@PQk="\a4D#=Pc+0
%E9&U]Wlk*a>E*=]fY&a_`UTp@/VkVp2DeM?_Y:nVcD6#9cdN6=%]3NfO<b@tqcl[YnCB(<-:k*)Kd-N_-/,qL5mk's,m$qrZCNfU
%&u6/N(.OMmQ%fm,^`#Cmb[:TA<+;#S!U#R`pT54)",mOsXR.Ps'BF^98S3.Z!.Y6.[X$=i*3i7b?32<SUt,;gX=]G"S\=FW1iY+(
%@"hYV8n(ttNq6MC.obD#`YVUa(<%mD?N@-0[k`qTPdmPCQ7=9D6D)XdJM=e<$TV*=-8AJb't%3".+h_spn$!k[^Gb[`_7?)p0,Te
%![9*n1/LNloH5m?%)++^@^/`H/Pn<Z`/8XBLMBI6Em<r)7,Zdnm8N.6.RNS8*?mp$Bc89]YW*iD2./cr50soHI3$HVL.A0d!:3T0
%`)1R"5Z;&:':N)Q9gcEF=/.f8l)$".XC/2qdRi'qWHnk#bO-!ZR6\ThP/MN(BX[\hY$uK3.HXdLjrT1E:ZNgUW?)1u<+,u0@>h(/
%$D-d@VC#u``QH&K@hCrK^uYn9Th\6X]1)jkAT;05FBXc2R$]XF&`DAVNG1`@8`:kI8qUrR`3diq)!ite6Bl&>r?ls7Y^R`</1LuV
%;$UO=Cn40(<eReKiYfio=>Dt\XC)U1MNC-0D7-$Kp/DdF[34-HR'pgodO_b.k]J6*7]MIX<UN\`7`%um`#WfA8.ebf+Hdg]Iq`,>
%7V&X@Tb"pEB1gUA`ugW]SWAHgV2:GNOGZaM2h3^&Zot.9!rm':Rh;3g;qkPHFO7"T<?^C9kRMNX6jFIbfS_g93\2NDCbkJ]6@9t[
%L#!@QSLM_SQ:BbA+_HlSeDWd`L_^0e8RgVd"JcX!FsHh\g[$U;jafRRW?Hd_ehPVW*!*FKOTqKpO#4(;K6\h=[AAFCA8a"ob;LG/
%5s&e]%1!ni8'!UCK1MhI^nfPoeQt+Lf>LCf_<S*5/cIB8,X,4"!WQu38dS2j]hnPfbt?acAMZ9FqLnP#4el;@K22O[l"Pcd$a;>>
%'O'AK6BJWR1qlfFg=B_Q"[l%D0\Wj?9iG`?S.$.t:6IXN_UQD((6Js#+hAZ!-Z.=%Snb\&GT&#OOl#iN0F"rrq%0lI8.2Q.9?)il
%oA?MP?E;SB6Em9e-^mqP/P\p18`bD9"g'IHCo.Y0<FIt)dM9cYl)GM70"WF6UB/T7b^_">djK_-$f&AN'l9_jR_Y_^-'CdN)lFA6
%#mWbaR*AQ%Kga%t#^.F?V3OV&6j@aB<ue+d;*"n2$-C_T][GP)g8G,k+;3iI#[3%j[uQhp_7-3T4<)g#Li(tpDPrfX6mEXej8tED
%41(n76oIjI?241)2db;46'YpLNU_:DJGIMoO\Tr>$+6%e;+)bo`2T4;%[LgAarX`tTXj5]F[]Ns,LqrmPG=r^FU^XW,`WKXVcXcQ
%U:$\M)h#8mNBhO3!%+M*4gWe@W`;ojPZC6R84G`f&?3GIR.0K8N4Ec!aRX_=#Ct]0#1$GO4gN=m=.C<*ZkJ=!X8A>:MDlXM`Ck=Z
%;>1/\QiJCW>K>l;V><5UJWFZP)QFV;4TlW*D6U%S)j@DOCltbOW-U(jI&$q2<'/>2L/fN_4_1se>oLfAiDBWd[W;!"[A^3B-1KJ'
%BqT$h?OjJE[b3o=WOA,;`'2_fn^g@D![(B?)=jh<K?/QI5qq,,a2V;Ahc;"EN7B7B,qE7,X:COW0rCUmHE@ei6eb0WgEn_cDp*K&
%mJCW87,phmjlX5J_&sS?87,?Mj*P?ORf66#bE!l*HF&e0KGF(51[tc*UE>_,[rmn&DqGT!DM"@XQEH0%QLm2Q]jlE"\s>elJ1rXK
%]?K+3&@0ZLI%.$$B,%S;b`,=\`ICaaE<ptIKdK=Q*)B`V+r],X5b-J9$<\,`LpH#]82:jcML;@TbA]s4"&a/O2aPGr&<hh"C?l.V
%.Ilgo38NP1P30qR("m#j3Q3>Y_#cEH>2dP%jT]oW)BTtPJ4-Bnb10>Zgqt+3]0u5Ph'dju0Hu$JqTmOlh'?-D4['%\;V#tKP)%[4
%GDGVf<[aiNqD'1);qh`D6,e)l@!BMC.&iDZR#"TgV8$HV!qoA>p60)(_(/Z%bM$!dl2W3Q9#8Os8-1/(cp4B_-`F`qm:/VFGd(F/
%YmHAe;2DU3F'>YNR".">Z.`&hB2.$6Ys"V-!_D,rP=n1]=RS4OmWR60;.9erj":#9@Ti>6Vfe7?&r(N@9PKQk'g]380GI_L1)_Nb
%3<?,&\plc;<;4]%L^UUMj6_Vq/LZ3soHn66)1i^Ih<@'K`Nf#s,-=^'i^R4Ddem,+9Aka_A7RLI>u]$]-tpTa>)'F%Z-?-:1SoIo
%X;fsm6JbXEML]q_j(32H)sP-aVbgG>]Dr5fWD(QGn2NYkm#\244oeGQ;_<\?[jQt]LquI=er!2ZXH`dHO+^(XeH"@G@89^]54i:5
%<s^&KK&U?WD&->WC>#k6rqBe7#md4Z+-LbZof]SG1r@T3]jU.\Cfk5#a-f))>NrdP:"HBQ]_YsE0=5ifj=hg0:`oNf2XlUA#6T.<
%H>ir/n7"T!%`@6Q_i"l`[$&,16(u[)i(?@Ol&I(-BEWuhm'\g]O-#DgS.#%QE-L<58,@usD=W$_>O=#(h35VfZDSU@7ajV^Ph5/J
%XpHXdbE!=b.RE,r!l@&'dYcc0qOVeNES;pq&;bn`^()"`cI?#Y$O<&!Fa]$!_c@4I9BicQE+_QZV7Doo<mrBZLFL#VXQfet`)p'o
%<F['b.VhEKnN[KPT%<e5#0.L[2Thi<*PGFOrHXpQ>5Iun/o52QPS0'%&1>%6D:OBVStu3_9oqE!l3A.Fe2Y^H^mcm^+)"ONS+qVu
%=tQT<ZqV/VALXtlI4I('58PP:;M)^r'aC"U9'o6:5%hf:ZCOch/Fs!$W\fRf>%K>dXqS,h@$Ell-c\sfD/aS+E9C'5+\;NGnFEf\
%;g/MJ(WnpU&0cLlE%1is6Q@0oAO&YmG@L'+Z.OVioSlI'+Q@q!cpC(!,,:h%Si#bkM?#O])Qdc1.ZlSEQ(e?!C[:su%K#n\,B_B[
%'>E'JDI?M0=o].mIP?QY@PsC3[PE7af[IOV96lQN(:CYdB[0RZWNI[.*Vtl83`.p@6HQMHIjQ=mlJ;rGO`)^CqqcbB@AVJF+XD`&
%M$+^2L\iEHOpI9@.;_ODLf7!MFX(EW:r"$T&D0>0/7C,S]Xf$.-A8!BUXJWAGb*?Y:B-"])]tn7:me]!U0t:F_Dpl:%e`j;p'ec`
%iXCm@j9q$Ai+=RK1L(Qt;"cZSi7/RfZEtNETWW6UY[Ds7.*45+53R',Kej*+A%I7B*7=#Lm[\aaU%3?sEjITTD%ZtA;$96QGUdmC
%M8!rYZL3=;Us<r?h6<#.E/(^1Ffg3,4AsK2.ZLP<c>_8E&;RAK_bka#jh>\5kUC<+[D<YcPp1Q$?T>)"n3-Gu-U@6Vk:kR%e-BYe
%PESpS`tG-W(c@/D'WKMRqSJAu.G,PdiE3-#>OmJh6c*-%0>*0?B^g^#NO`!n<:GSt\P#m)EJ5Y7fk>K+W!Htu)4C<;f`J+nS`-M<
%bDKfW)(oJ8KH[?O*!O?^<\B=j_bo;s,'JPoHkbP7[BJ(,?b&*X_D6UcJd#L8+Dc'3rP`=R!Q[C_J2(pgHGfgr=(:ZTH\e-1',a5V
%C*]o,[Uh&Yh*d?e93."=N`hN0O-p*G@F*.S;QEJTs'E4VR7BAGpU!9C`j?$QOSn(j<ibg2H$j'abs=rIJj15X;Iq.T:'sO.Nme<b
%$iY)f)nX-YIlN=g8CV&:LKDlsS,D6T\&$rTrbu+?8OcO+3:9XBMgZfE_c]jVLc%m(i@$59KU%BU*9DuF1rrd,V*3WIUT?9V54[,O
%o9]cCMico'Q\o1uC8B+K+?g>^\L)#Ea)6dfkF?YAmS+&1I4@I;0>%Y:<22+ZZJ%#do7`rME@hA[EJ8ai1g?!CnB.ci+EN6<Q't9#
%=*PJ92Sg+<;H5Rmh`t7&WG*Y2U#68RF?-nK;0sWd'Qo+2;&^"JE7EcZ1e^ADiBRO@6=KA;K/PL@,Po8K;fc#"&OAd"K.jm;PQOE_
%36o4bVo0BXZ-&.kOScmFX1gf@L1<H#Qls]D*"ne##o9&i(rpBA'n,'2(c#GXl3:82k/8(]!r,f%\+GBLg(;A%jpSAs!bJFl$O7=Q
%**[gLW%tODlei,RU1kd\_V&cY5j7:SH#[eWUR4s2AgS>LIPkU>=*PU7.l(1N)1jB5/%c:mS>+S:jt;#2/OAcUEDN3A1b^3/?r0ST
%WC3I=Qq4/3)b_O?WoZX#+'mif/S)$Ra?61I4>ESg$m/tRN9<ZMFpXn$q,[lgnujfNn9"e!DcFfm,(r^mP^m=J%DELH7?h@Kl;f;<
%"#:-"nTqP@9V![=7W#ns:9eDul`1mLHGd1.O6@aFY]P;nLQpjXpY't+iQj]TMhJ96+h/o[CQQn;Xs=&-1d53pOW:)5=?W%K?kHFT
%Fq]R)6<_WDJe]f*6Hm4HXCD*6aM>Z%U.0eq8cU\W5kD01$dBKV8L=16QE=83/W@NR;GBl,Z4NI4;/qS5Od(F9I<V,@VC>W#=k,O;
%Y6:(.+GL:U!_h@Hl3S4^YVK>)^e1hqJ^oAVpKmc2aM:D-&i-\;&C&"rXC,Km(tP7`X(nAG-^KgXJn:e=D&YdZ^*('Dnc=h#EG>gr
%c@T3/&I+&o78pFHZW76>9u4]GHKM(YUgO4tM*IG]74_JZ<`?48@YYXK6J1KXUgWj<RY'(B0a0'H8J@TAkE;%,/46pHbeW4Q$7hp-
%)-C-`;e]>b19cS.VA)@m)-GNSiSH!c$_&bOJft5SB;LfR=f!@'$!9>-'!O,rd0-NZULF:*#)`di4W"j:A1TThMdVW1(DF"YA'H>p
%^`oH!<#r6MZ(6TJ&iUOVA*LPB@8YK0n-C@K@A?faL^@16d?YL\YQ0fE^#5;DeVC`c*%Hr+#A#`\T:u'^Ue<Ec6h7D\Z]3GmOafej
%:p8!g1Os(EjWLh0UgZ+U.f3='_P3N_D3H2DE/GBV1Cf=."e47tYq<*BgOW'H`J2f>l)of(cp8qe:R+ud*gO"qaN1)+0J^8%H^.]B
%9"moV1F-==9N[L^`n<,8FV.duB%ggLA_L^I"iUf[=6J9`+Js"%g*Ldp\mG(F+Ea)fQ[k=/cP;@U1cg0OU:h+BUl1D1A_]=YGp]+h
%846V#pS!^lrU1mo:EntbG0/841=n.Hf9bkjpmlM"Kk**A!!sMc7XC:FZO-\TD0f:'(b);K&l+D5NZ0]%"gtgRm7`ou#,JFQ,7";(
%<LOUHBL'+2+42n_;h_l:OA'/a&:tH+D@Bu8.S]*RZlBb\1R]^:aZB\M*(?IWiuq,qB(EXJkO3q!)d5IbgAd?7/Ve$-<=d+1X)+RS
%o;D&R]5D"1C3hTM`^it!m"WMi#e)eQ=*E1?Ni/f%]ItWN7AES\doA&+(,i4;*AG$L@Hscr:ak:cgoDD-Ej'MNjBe[F_KMgFV+iV1
%[c=Zg.2W,QSK?8":")16-6k%c(JKq7ELUB0d0+)P_PmV87+>0bQrc,mKKLG+ZLus1AI7?J,Y])#G$u!3FM^aC8!*.3,Y%<)-,LEM
%hAE3o!N_C4=VP>(@04A;_E>Cd$+;(_8qkNm6T$0cEckCl1_?SkZ"i247kI">jJgOV<@?3Fj]^<_!:UV)<_G_bF0,1Qfk@;B;]X&h
%_QX-\o381?Ud2r<5Ra$97Hf8XhubX6-^@/ic?3;Y4$nHsKbUYH0L4,%U*Fq4"L[pWr-NqtpU-.<:eJq)kVrT2/hM/M-SZ+0hq@4*
%MH&mb?J;c#1BGnW%1V-0gO-,cC^`]L_s:T-)U8Zh/EGA'Uh0;'%+Ij-2%F0INELcl=I+N?eUl8UGT's.bbY)cQ%H;I->0)`Cou,F
%>FFr";cke1H"E,3C-.QXWH)Hp]./W?Km^%bGZWV.6/?KX>uR[L'ikH&>c"7tf_kka%Mh^89r4Ze]9Y<eB[]71`idjJBW&]<GRJ*9
%9o(_r&^4"n\^McR3#<`5Uuo@u*fRN/N)YVH#5"^Sn!RAN_`L@3*jAO&P8#LaUspd.!n,.?%V18_W]e)G.`J&[MRB`r:3;["@OpO?
%->nY9^el\N,hX9G`#Jp"J^$)fX!'k`5tkk:Vi8bJ*/U%m<%c#MC_JEe9[s\/(&>mE+BfJWo42@>M8su$ekW/#iduE#)NBHMBV#<P
%2+f'leAuFbW/iZV74H5`WWr%+[RP_X`g6I%>Iu5uFpJa7B,V'tCip2D[i:E0,luc)6l[jLm?HI+&nC`7<AHgCjZ[IU;;<P$\X^Oj
%0_$bL:RKY:,u0jPl+_$fX4@>!hIfY/M%ieT5,jh.J1>)J9l<`J(I24[.aE+o5d67hN.MX;ONs;f4qr;tg,e:_f5`T\[Bf><L%8tt
%[IQmSe2aJ*8R>m`I^_-*n5en7@l2D`Q!bi7$+DO>=E/oZAc.A837<Obg29gAXHdAHXUpntN!uG^2'*"sO\;\=b`p?K/;gfs":ViS
%%%j6T\lP7ds$egZE-Fa1/gO:eY%%$t:hf%1X/deW*Y;=k$3le("g'7K7UuKL+Ec:MZ:*@Q'$.&fV;;pfa]TjT0eD9Ufh+%G)-t[C
%(bp7_:r<?aEpZJ-1c4H;A@4e1<io]c;UarF8`h$HKnlo@3`3AjigVW-*S*]37ff:.O?(t@\09@qZf$_8#i^UQ[i6GHfgM;PkoT6.
%a\#*9n(QVsX[J-[JiJQSH%Qc%%\,N%=g>UkcpD(a)m?'=L%nrTlP-s%>;Boj#sjiactPb@\JVC->,1Pkg+%fW_MFGp-=?dk>Mllq
%3KdtH"SiOQdo,p2;f\Dpn3p[mWBiir#9cPF=/bdjC(ON(W+Q,#p37U$`:fg.<W+HHg#7bVNdY0%nM#>45:^K)O>aJOCJNXmoo2Z$
%,@1,9(`S-FoaOI]Jk1<ZaDC9IHNV^BT&+*((gjTFL;LK0%qhhZ\G(*48k1=f-"e/gI7)9>Lb*hPDf_c<L&*^,[&+6<+AVr>l<?X/
%iT9j9PrtR84l6RBVUtW8?*%)9[o*Ogf^D?/Xkf,7](J!i:(=Q/eo!1=?S>t-`aSA):k&SCNjPLp!?&"H>CUuCdbb[Jr=);eUM]sh
%c_'7CqAVqMcai^-+Pi3?l<E>p=`_L84#bQU)\CaPf%_s?O'Wa[:KH)p&'L>?\&/g/Xh)'N930kFXkFb/PNmmcf(6J]mY:#^F7tsg
%L8rRFbbVk%hOp:n`>`\<>Be8XF>k=dAD0q*S&d4&"`*=>W4_5h=NVS^n*d?lc#D;\oaNd[&atq_L)7S+:g&:c$JJJqqV)TSO7bFS
%lAH7C)/"?LHY33cfHX,ZpJoi(/7n*b5b>HrZ<i,?IO+EjO7W'S1Qg\=,aP%p2df_6bi#_aa&A/tLAeP9DlgYRA,>(\\q&:,$fZ(V
%mo&%nNFVU^^(JiDV)t6cKdkTYOdTbkZ.1d@c]ZhT^(Il-nd4TN53LtT1pt[EXM2):eKX[G1NGQlC%\Tj#K@H%<8T*\(_bV\=`ML8
%XM1s(qT;k_=23@_^0uX'#D#6j_q#eKVXuffIosgVrW]*VZ_\D'be@X#KEB1ToeS0Iqkh*X\&jVp['t2)/F@:!>C5+,BQ'ijY5Y;t
%^!.;\h:`gfGg%1Ki/:#&J@%6JNB#,qg=s9jJno.?1NW"VHTT0^qU45\.%7U<L4te;ccR3'@<9kkPW+&#Q]5c1DqkCkUJ'\XLmDR%
%Du=orDd.MIkB$GMT^qeCUqA!Eb*tRUVp_M@qK(g[YF;jXDH.U%Tt]b)04V&$9q:TP<o8FmEhB&>mEHX9)lFt:3RZbDD3mgD\strl
%h)n<\b7<(]AaKq>4cSiO'c*s_;Hql0'"ge_,EL)0PP-mtK3NbniG)$^)n&[Z07='cb#_74)or.cIAq/;W_rC<oaU1]]1Z&ZIT"[k
%^)cWY[DNLogYmp@g%A+9T(dER2\aukq4`3Z7Va6c%n'TchI931bYRj]9a/,-!#8%s3RJ/SI+OuKnCk<E+TeIC(klj\%*eOa8jkR<
%liEJWI')"i7<su/$5Tr,%ia78LkOFrWk6Tq<5gR_\1aap>:j@fHZTK,jX"N?`pP^@:CBC&C:4ffJ9D.#)dL4=*RMZ*FpC;)gpoNK
%\s;#^$sF:S,9CLW$ot7*.B:Sp7Q5K86.MOihgk3GP!9r=$C.XY#*;%9>_53;KfBA._PCc045#giT!s:_Gir7SZ4>HqW\/+A%algd
%]!+*G%RKH0^+M`"e@@(*E2/=[^$B,%&s,TQc4"G(^\jZ-%chZD+@?\n`$'pQ`XkPL;bZ>&hO\bn2oP9,@BS_2LrI!O?0i>"%!IFg
%_HP_#m#dEt!ZROUK'CNA$60g+FrC&1`>2sQ3t)*NQ)3l+P5Z@NUYOn.ks'M%d%r$Z?V:[#rCnm&[_BB"if5/f:bKiRAPM>H@ZEm\
%!g\#@l",qt1fWBCgBRSIgNfgDBHg5ckD07;1FtX1@u,T?0JlaO90.!rUq5tF\kihtUJca(%;"A_9j[tgg"PhAeQHpH#EWS>>jpkK
%I:t?9NfdBmYJFrS6jhi6^&U'p>HS#G[[;ae[JS0!"*1\SiTAk0lmWl"(cd-=,:[J*l2ftoBt(T8YRJbQ=UZE<m$of^!taXt/M7Vd
%WLR/h.\mX$Om[>-WH5_EGHCjgN9W]H(M7C>([<f[f@uEn`7];23PP7Q#)Up&)Hl%6/m]=kXZH'uh?$@\b2@LF@S_r.@"@$kDeukL
%#$R6QW4E2JUF*;GQ.H59*Kb:'D#f0Q]N)aDd<!#]OB8S?,Z=BQ[$1-4M0<;TklG9kA\&aGV(i*9&;BCfqDV_\bu%dnJ\""b6/_k*
%*,TTTko68H%qD\L"sQ4bN$8(8bUT>9=,ZFi5(`GiK2PMk-.iE&cPMqica)WD.r+Q,7rogmo[D]BcVf'5jNpV^e#ld"HgmB-@Kl_g
%2fRVKGeWr]c3U\e;B:RoNu-OV5,V>)bN:(D#ciDS%KW3%UBF%MINJB1(Ip<fgd%O(8+`)(fXTb_i<$>)D&\j*\%XZ/PYflde;!<n
%CgM#*`p]ubno2e&K,L`4$o@Ij=_(I"f2Z.XFf,;_g"t&U6,(!$`B<TFO$&MK5Q,J.%@LAr:?URO)=)Pj%_-%jY#0ah!.k/5E_qM;
%S6PFuLuq.4YciqPg38GMbg22MhkNfEjcP%!595QXl7);(/o8cAAGWg>1k-nD`k9SObE2:sj]+IIW&Tk23g$[e]N95IrdE>Nd-FG*
%V:Mj5OXVre.`a]9O1%M!86XQ&Bl;Lmf)2Z5V-.-">&1B4^=I)5?Wtu;$i)9se@nl*B7=12qArX?/W]i$qJfO"9"OJXXgbNFlYS0]
%*?Zq4HT'I"[C<7Cm**tN7,"&G]f2Pr/n"\D(B/CoAVC<oF(3R3"(mF^9g9br1.aEVqmsP7L9UTFdhC@iZC,':WaA_OrIo&LDdgc5
%gK<[/GbY,5Tp#QBO^M\DFhku_bTQ/ZUADB`%SZ/]nkt^W\>:K5O+\dPVG#<!<*kp!E_rFQP3kBY'@iE9]X'!e1`HH</=IfQ$>3o)
%06?,=Pf8uJ%aZ-=d,&K*!*Mkr[.?$cG$`1!kNt?b\[8!<m6#b"Ok(sMA<:dZgNe,\_M!hQQL)8la7i#?5FHDBo?aHA2Y7PQ#g29`
%oUn"="%%qda?6c%Q]Wuo1+#A,h^N/Y5B"k.GYPbdCTYgR(7/*`Z&;.;o,<ZY)AYC8Q)1VedUjX[fQk3>'Z(_4kiTGG?m.*,"8:k:
%,6MKD?[0MidkAAUcesjd+2V36oXTW3g)nk.D!T"9/F+\b=YWt39*-^s8\g=>#QRb,8k!<lgNfAD#mcJP2bO2RBhA<?[<d<895q^Z
%Kc:+[]B(<on>0c$[1B]pG0E'SV+nX7?jR2k$,IkYjs1'AT<i=V64fE&1].&-P([4N=U6Y(<D*/V;9?2cYj7kR=S$0H,[sW#b=CX!
%Y>5]Ia2dL%NTj%W1MjO%K9!s_s!(C1!b!R+qO#l\V,;M4#HPE/RL`J@m@BBrDXF&R#CA,D4T2WK\S'=5p\L*rfn,\G"k\AHk$_2=
%]jYFrLP15Credp=`4'+LO['E>LF^4Oie?,alA2\)EJe[)KY?4@jB!nE_hn95<s3VO0&0?,*$$2`=+4[MAVbUX,/E&Do![.M8/N=,
%e$=15@ek:toD<c/j-M"gpPc<9J,25k&t"Oi<dYo"Li.NO9d\PDCe-V$Ne4d'o-;e:39NfG&BEB]'_-<Hed^;?MQ^M4jYX0"j6Nc^
%bP@8c*lTeo7fm\;F%=n<LGBnqb21eg`^r^[Z@c$6Gi_EsW_o%V"1_JLNisT&KD5H"6$@@U4C@oH*FghY1P>&-KS+7Lg&%Hch[ZrE
%TLQsh"PG`>KBsISOM)`ZG-)lKmVQjcLp?]KIBb!*^"E.g6L6jE#q<gL;-e=A_B!cM[b@Acq_K[$;T/\1#B2S&"PBuo/S7,Qbo&&]
%^A_N8jnqXlZULT72\+7i,TS+Gge$e$Z6T0BoUHp.j=3oPN9E=:U14I=1m%BmG7LfdF7ja#,d;UWlpr8F3iq[=IW4D>*=5Cj@4Aia
%rhEPf*ls<:AM)>d^.UQ#NmFG&;.Y!CL$?E4_XKV$AkVtX:P^)rQW/2M"$]_-,c@HPZQk#adR0D=lb,_9GQc<=$i7:P?LLO0>ut$+
%)"$fR2HSBj41^G*`T7U;Y%,'KkFdFmrRb].&R=dHHtO09iqa!/`,5T>k3ZtaLY(;?*/s[h3bMK@I3Uhf^9NKtj%cD.NVGO=cou#2
%@[PCle/2Ntq$i7:=*u#1F*DYK`7OOYMWleRlQ$Fj,iKGDa#DX8,tDDN7S\u>Lf9e=Lp-R8d-?XpK5p4e;K=&W!#%LsHlX<Y(p^1e
%^>=KpIDsfbP`i-CH:Al]hiQmar9?toU%ip]#HNrBY<O8!G>RSq@-:$dCnEMtNcAFW&0eiKUL<H\aM"'EHlZ/6hW^0XiDIFm!.0d^
%jqTq4e>o4i,I-FtrOT#mi7J)(-$E4;*M5W>SPXhWqkB@G+5)^G:CmPMHlN$L+:0?j]b2SpMHNH&*B\"jSa_N@2^jTEV^oX`PGT++
%9'DH(*37&UPd%8ODp1Z07$O?]4s_>J"@X%#PR-**'>*-SBM`RS318D0EjfX!eTIY!3r3PS-1hqU0$7XO#QVQe0Mt^MrPfF+9VPI#
%,jC+0-E]C^+]F/hNOVg/^l?a9*>7]H:h0,sN!+\&ZKtaWW6>'6ER3ejP3/P`;CMW,X!p2+V$,$?>[]@=a5epMDP9$p^nO_Q@@dr?
%;!-k*#H&oB(*NqPE)b#bac>j2h;:pq8*^NNH5B_^Al@WAOG,9RPV@me0G-C7P^n^)g*AI'!E20U:aohtY3J1k,Y8'c>,5/U8dX-)
%1Y,*]j/O!l4h5,@Zs-3rJ/g='P7frB&+cX=+n=$!%k8mtK=BjFmI,`Tqg2g]IFcAo)&=]8SmLg\^@?FGN!++RhdR0*^)C,3+T&\+
%bVtNG+QZ:_F'T)7@9ls3q7KDjH3^il\k$WilUI853o?!&T5ZR%f8%(HE)#A]KT0d]4AWDQP8];$?3#'O#2)_I"=/f]bGhUENZo"3
%R?ZF"%1=L/Cf-Tq-;jmfa5J@Cib(?bjl5@IqX/uWEatk4eCi"l;L3Ma)a.EF2c:FA7&0s=?fl,R_*@memua"'\L-];WC1('"t_6j
%c5j'(=6eB'E+K.#Edup4ZB&BXnHrJT%1<3mAkis3AB17PF8SV+"Jc/\UT'J3/eb4O9*pE3]M54*5[7ojF9=1%KCR;f8sFUfQ]G*<
%'NY0ojiKOiMUUPt%T=f&_7Z_2YSCsq"I0VoK!Ki!V$'2/'g\\7X^GjS-7'#>1HM*n)<#1pc3]hlLTPO+:u5/D^t^Ec<(^EkBlD+X
%rd(TDq.<M+j:!@j.<.8$%o76:]FZkJ--R,'][&8h.]J[+15nYu"RK741cV`oaD5%;quMWM9T2E:"ADf*_c05j`*0<<#,9%hZ+-$C
%N.cI!f1fJh!M*5oA(XII4KOUlnl<Yg^;A1RZ%"DnhDmn]kWr)Vs"k5p3VL=f#0s>3k=-_j>`9M$eXnsBTQXOu:IiK:am%l3>LM<@
%[jCL0mqnU&anN6hNobWBk>:s1IQEn\HRgVMCG@8TCbmLd/Fm(sSEA[=@LrO;HC.3Z:_:j57g[6K<(%/a&o$_bo0@M>jIS(8U_q]6
%Wrg3Wm:n;J#9&[FgohK>'ti;a9BJCa3HH"M<o&=G5B$H4jP&o*7=4;Hq*l,G,/aCFAXd3U%"O;)7>][]Y46%"+sNA`BpA<&(5ifu
%;5,lQ/4r0nL]r\LhJEkhRRa?>^SE+Wk<#rh*-5"4buaHhl$5,?!??3hD&O_G\u`V7UI;2Q>)>@6=rVP:,>prqNm]N-2n!sq'"3%L
%2R[mq?C6#&p-XI&BlB-l;0jDJ;$&(r_n[0m>#'uu-Lh0uRl*_+-ujFK80E_XY<(WJ*n:K%Fji0>R.`T0Z8!IpQW45.G-%16Qph=C
%%)$%G!jY9Iq]C00RLRV#8o%c=M\:TZTp5O7K2P%WT<rNF>,(YZ`Lhh24DM6kOdmePf/QP(P'`FsHC9YIc8=t5'"gls:Vs3d&%q\$
%0`R*C/cI#ud<$U3O)(lb,#ESooX=*\@KNC5PnnpK_A7^N$Y*cqO_V1*W<<$;Ma3-OMOqUW"Y`YY638GW[j-YT:r<,&A)q]rN,V'T
%6(]L6[EcjlQ5RP&G=3N](gc!<LBg'KV'Z\]Y;tTEHVj5b![W`"'&cb$-ilE-M3\uC-ZU9M(\^6iU%H4_"ke)TLJiHT%Wt"r3^t+N
%(?eK3&,U$o+(h;nR1hCRqiD"$;f+N;^-D43VZS6\YGC<'4JbDk*Fco+9)G8#k"o6ZiMKFT-Y>%\V8Lmn8j=E<3i!qoEa,s/M!Y\$
%4L2aTF(Ic]$pQV5Ucu+]+Ehdh.j.\"lMEit7Ijq.a;&I2^"mV/Zj7K*ie)&YGqOuq-Lj(j*f;-]?&q'EPH'[u479BI?(%1J]ccn6
%H?_Gk$ek@9`oTJ(S!k,g_9+`D=2EAO]EI*uRIfJ;\Da$(:esAb%n*4Ff]QYsjf<L4GCHus?E\9j"1_LL%92-ROj-dS\AP0?cJWt"
%FundYU-G^:OEM#f7lSd/Rk_RSD?7q"Qf:oAfMrJn3PPmAo8h&`<Sg_!o<jf?&e&P'4BknD"ZEUC_R"eNN-:de&&QI>SD#rk^2`$Z
%3<C)3ORtdTS45FHrWjMm:S$HSlDt6j(+Z=Q'i2pB_P#^^X3kOK!'Eb\Fph@opj;:&J:o!Km^;mlS9Djlf?P\ZlQ.`BJrIfE$qd3s
%1Dq.)545MJK8Jf*\N&S.jiG`:m(n^WjZr\t2Ue/a1t6^o8J3^(Ktn'fK$.n.$fLV9g_O?fM1CQ<,rUjXWYr$Nle*G;dK,IuY9JWj
%'6hN!r/D@RN^H*74_t>7fi5'peu:ZN_L4:j(-]fuD4h`Ulh*.4\JCM/>T4%ecXG@6]7GL>GFAi2Eh(7r"ho`7>Qf(g*@4Tc[[[DS
%6bTg*"Co;1M$,pKj*hdYJ0e`dpI0.X&Cc[nfB7NG%dp(=?Z%K(fo(%W,NYMJ[]9JHagJA6/)OI]E5)(Po%*Dr/\&fg[oqN,B!M/1
%7pBob)U7Qu[Z6cuRid*d4%n5$jLc/Pq0XQXXL63'._CH#p;Z$Z02jef7Xhu%4aR[i:0b-tH#M[RXl-KG]mfCC"ABhbqWac=Ygl,*
%KrO5gO_3p<l2Eq?:kC4jjFsS8+qW.E\;(]Y;oJF2LJl"E6]&mk"BSmb]c;!lLXO1c&#Fr]*_J)EL@Dd&\Ein9G7Q!/Zr)#X-"'cS
%gd?pS;C;):QfX]@-io5g7#<r)h=27,%G\!/bnAr]`oA0H@KKJH73LuDAOTU>JRg[PHCp[Ba#?%HD,64FU$@HFV?ZB0]":$P&Q.21
%F\j9*fghs%4:me_7kRD#<X5I\m1)b(RN:O,T_*':n.2RNdNe%mF=b3:P^o$oaVV+9*fB0"S#STW/(b(p\$-c!<>61[(EUhaRer5*
%72UIA]6T%a5H1ePi8OZ,5hJV>V0Q*@k/tnPrKDcB11ZZ4&8NGRp^TQ`OVRj=s6]eW`)Jk^r^fL191h\N2R*$*--Z=OdZ*$H.6VSA
%:J-7=pjms[>k_"qnq^L'Mu"e5S,-C?:BeP$ObM&:]0]q5m?9$P@(P1SDP'<JqYdG;#oI,`P`.Dq5gGbT5ZJ)Z=>du,bOgT1p"DS]
%+HB^.@uemIF8$*%oMMJ`H9.DfMUY=jWkb!1PqRIWiQO5Y'#<gIe'+!2c'*s^Z`F%@5[7p0RO8[dXr2<P,\!V7X)deW%YEaB]6R;k
%gcUFLOojE$M9&L]ah<lrZs"hoaISN:UM@R0oYR*2@!,3gVK,IV:?'X"XgrN$I[AkNWQp=G7HYqD`TBa5kG1^bK#;<)MAe`L%'$PZ
%3=3"RBMRo*kG4^\9E[?t/I072%W<=<np4`(b;koTE'UL17',#^b&$sph]5R`aE.ObY!S3U@XYc(2b2In'pmmbl4DBfQ>i]r\\]hS
%c\o<?==X$(^[(QQ')5,7;bA)d*[mWBZ('"EV]MEGN7>qH+Bca<JRa!T&ft;e9$NY\pNbQ5`hh6fR;@0m"3.\J"77@b*+^DVGoZ\3
%Q`K;Mc>]Y@?W`2D)J;L_m"<:;i'+T-=0gejj+/ApJaWmcl:E-5Gp)lfLIYGfH8->4c+/MSjnKYgD"gjaa!;f+:8JR_Y&G!R;,n_/
%5j@/mTC9Ap[t^^:ja\3Y0F$AeP5]?/OhgJ;+^q<ujf0gfTuUZ"*-)$8F"SWs#Nqel0tRnDSLSlHH@B1!bh'Uf`h*^N1]Zqfbss.#
%]Ele&=JP_X)kGV#5id%U/@h5#SEuCAc<PAA8K#$']#.%dLt:o>($/Uu4JC:-)E%83#4d/d8RD_^oYmpY4dc,KXfGQB>P"D#1r9^0
%*`/D/$GLp9epM\PK<FEV"!+W)_ZOqjmh^W++8VCIU@+'S#X?>V,c;<]'`/]D!#tCfHse:d&F%IE*j&HRh0j9kM?>hC'WMWZ$OPq;
%NtV_<;s6W:QDP0`g=@"/8T>MqE/>;K5cA&<?q>uXdM6-'>bjG1*"l^#DNF4dDKfVWXrF@\^_B&k43l$h'EniGe)qr#`>!J*pW*k#
%UR;.YfT^'/O9WXq'Ue5oG*MM!3Lp3ELppeIc7fKo9=JHFqVC'[^B1qjgUdlb?&1a?k9eWN"/Iue>Em,mL.s[CAGVk144_!X$R:c6
%Fq7AQ+Oe?*4PODeE*XBi#i/.[#r`s<56AB$8L:>@DNWLV%RZ5lmVLPfGf/*2U_q0qXVe:V1NAhq0,c]tAXN"S#F_]6]F-QP%==pu
%XZeeDMiVPXmfRcIUZb`BQFiWXm\@DI`q\eKL\:RHJ+r'.rn!J;Q3D?U0G3;'6?i'*,PF91-40_B`gEtqU]uG_;T+DOS!!M#hnEXb
%6u[mrE<jn>o=Y/Z\IRslAuI!a>1E1Ee%%r,T+d(R&VVJh"T'()B&>CFjN.;i`gD=dD[upg3qaIPA/.iC^W^O(DW6bumDife5>egA
%9^U`"KKUd;pM9k_hu_p#n(njGeE:K-63(eFq/k.rL%h.,FbY,^`nI/"eLAX:r6>==A?%aIO9gn;qJ-t^,;u(Ma_%nJe:tHRl^a,i
%/klf(rE(^%WS]]=[l^$f^`FnY]Ua,f/0H&d\6)-6(da'Kb(kj5`Yl]rUT!rsN7Em7I^&!Z-uSE9E2\3qArB(62hL&lEl'@.bj`[!
%7]bmSK*Oqe3X@Uf!S8p2i%ZH&Ah`99/fX[_9N%29i/t!,8i6E5k"S0;72U-M&e)N#CD1/H\;FRTONN;-+(&=c;ps*RWn8-:j,/l9
%Dg@^=24Jt2<G4Q')D^Q5:ugj+KBY=lNS/51R>C(B0a7U8=mn4lbad=*#9R&"S>dhR''48&c<mUA4A.)oocR.+Le=N_h93hkdak!/
%&34U;1@^2lF(gQWL*"6OMB/6IS:kUK0fKCM;k"WO'WVsQ^<1B#mK=sV^Ph970R5bG?N<VlKN1\kg:0(E*Q4\+5R9'0ZRU&U:467i
%OpBok^bl&3fI[JaaG?S[<fA`O%p>/I@S.IoN+\#sA?79N6AT=ZDibOskCjZKD%@AbEA5WV+5BF;**B]klSWN%71KF6A_rSA,?U*>
%aoEfl?;`-o:!2iSp]=I\Vpc(Jm6E7cDK!)a>Jfk0P`#F\fG*][OK(e%QX:?G)'hbNU]iGhY#BEh6k1U$;!S0\@aB9`E3kqm9tLV1
%*pL8i=j.j(n,3L+8&*LOH_qJbI+@l4+2mU!hAoFFalou'Bb;N:CS-okpfLm!M+3kJUF(Y^_B3,k(nIY`KsCK33pQ)[P'$ob[!(@G
%_bbDiN8`FH[#QX4(j_8WSqY7*\AI69p")IUCPG!46DO"f-nSM`mVkaTJ4Gk*:nr>h#\J>b(XiX:,[g1j5\e,5G[ZXGdT_32\(E;g
%`fck`rf#*TanRl*bJbN1&eGbSN)Tt##<m]N*KSi\_2Q-<3]DT5)D1+^VYT`;CEu@Mj8OotZ&Eo]6._pQXR+P<Y=>A,#'I(Id;C9>
%EECHL6]UG^DqpWGgf]k;NcfHAa[1E"liLqgT(DZ10\He)?^n2ZoJD;p1Vh"6+($c[X.SM.<-=6o%mu@TT-!$l(*5/,(j"ZJn15Jm
%3=XnC>C\37'(3L%Ls$qP4=8Of]^UPf(Qf,28+b2hVNj3GR7=ScfZ6S>/PR>2CBnun/-![-^=K0nWN$:T:2d?5,9sHc*h`Wi3dfp;
%)U%^\1EZ1XaQXnmHWlH_Z*l@!FGWJ,E%V/.Qh@>iZOW@l.Th_!69T!u\g%e[q$(sI2a^uqL,[K@U^_LSs3>bIG%^/ODCBDZ,X7gN
%EJ_9mL!Tjn%C<9f>KTA+!n@SR;-U4nl29Zsp;0KR*7-Y5b#^$)$@d%jm\"a1Ae+tlgd]"mIDg+Ie;d^ZZt"+s0$1P(-P2NdP<pKh
%.G2d^1%)@VgS,^./"Lq3EhL7Ee$I#\5+e`,-O8u)UPi8,aCs9E^8T%Fh1SMEGTuDZI^(kk!1TZl,?\ma.sB'scOe1hF%^2V2i2Y>
%28j25@Y!SFE'!Sedhu-[3YtZC8bZg\AWI+"XL!/B5jQ'Pro!`=4i%jU+p*i(40d>#LbIC^VH;!X7QaTfK!:Wi*uSk:qqX2D%bdaf
%Ba>"/h%mUWe@\9]M:1"i4VA86p)E9(>L-MobuWQ.W%4t$rP$EOrI#o3[dB'd(+bG[/aG0Qf$\'k_AHMS,JE$h6u*_7L5`,.Bo@#l
%enE&;X8!X=Q&;KI7Z5`7mV+m.h7D/5g,2FF]\J`j?)8<sqbA_6Q1qG\rKl&7ia>/ne.G8"9W8Y6drh]!oe]Aj$;)iY/#5_L[YZN9
%CDi6a=*38_rt+c(W]^@)M.!4MA&pk!kqBm'E*+h]*Q515a8XBej`N]GE"YD\"![V&Iu#D8p%9IP464QATo5];N&IIfj9\7(kC)F;
%&3]K#G>)==X"N!7&*dP6R.O-3_ZF4Mns!>t5AQ.X.M?mPFb>8gqVr,XI.X/\Q6\mk7\)reLhPJgEJdYun-kH3"h0'iB,TL`q@Vj6
%Th@\#+NjFKVuRna&>+7FeA:UR*=ME1U>dOmrUnR?#HmOdN%RZclTIIp5@O'4;;t%t+aSRM6a$18f/l<a\J/NU,,ZsJmi2IP&tTI(
%kt]9mB`F&Q.86[&n+aaMF<jO79k.cAZ*&/PH2OW^bU>H4_L+l;8B?A$lC#\&lZZHB/&q3)!H?m.g'>DO7o<0*e`&uQ:4$`3WWg@_
%qUSc$fYbIQBb$"8,)H+uA]1rLVb<qRYbEWGWr0$gr4:s.aPZDb:,dA+3(8LkXj(t%UPR!K$/9)(Lubbl2#--7>I#6&BGnS-W4;O9
%m^i4[mq<sGC.1^FEju[-h+=<Cr4FO2#C@pCYjP>$[,!8-ZeR9$*!_"aUX?Kg,lR?QdK_Vu^k)JB64Vh!7#!iQC6rTsKBAIN1#FFW
%DsgN):s<ToK=&"Klp2UC#`r!dXMdT06*gpBB3S:O(5Q7I:oGECGbE6j^4RTJ!7Q6^6\Y&'>h!B-.PRlu,(CqO[3Wnmq"2so3qAj;
%`Kk)>`0)hg4Wic-r0at^Fk+urh`#SS2h1[8L<[.kr;n`UB43SNCp4qfKnbV.goH3?<Tu3QmOQ.8GV'?(7[=\U%]$-M=;QJ-2bosW
%,qoYoIX<6\jn./dhmGia.l%@>1i=lO@[1sH=e<[fX1$r!Xl-g#-@bdOrqcLVI/WsBK]pN?Nj!s((XaUoYKnXW^)kUMSrNXEDgs=a
%^\sWd51"fYj72eLs0;2\i#f`5rVq*ps82g=JnBD.A<t&D'Xd?P7O#q2/o&pX"I0T>/M/0K$i(?L13tmVX&*A1C;(@PS,71Ij;B;R
%CK!,e(I)me;,p[9;F6fdLQ=(p6\GlYp%qL?Q*cu$LW%THH^#RM;(p<RDYfl<IQJbr?d]pqX4BD840@10cT@Ao[g**%m)pAF)Yceq
%lYUH4_Re3bW6_NbWf@IDeZ8s=PasI:@J3SD_ngbZL`9n9/6YM\4E%FgGmBK(dRQH#mS%gHOGa9L3"!Jo\0ieg&+]YTmE-5r[c*\N
%7\/'BYGZLT&Z%4mjuEm_M`bjiS::2@ZDrS#GULk:G\f4tN/ik4]ii>=^T^'CF$C;WT(T#TT'hUkjDBo6L,).1V_Mk\BKlqaK)IU(
%RK=^?R;K<2npads+9qEX#TYoj-7[L=":*rBLjJ0)Q1OOpSROnVo=X@89X->G\7>Es[mNIYdIS=tk()4X'M-I1[kA'ZXT-Ao>+<&!
%?GFfjGfP]6KC([W](dFN]DW]'X;15kP@C?tpWY_>`).6t;55r<#oNJ72mSUL@>hcs<SVDnJ9DdjA7U,^+eBd_nmGHt]bN"$6Gg&5
%<J*__)sNL4R]sK_(:N?;a;B3*-`BJSHUVOJCT>'ce+GtQD.f1G2/e#%B\%=(D1Y^mQH?82KN*NM?i(;g4j\U$?$%K+2r3[op"J_O
%fPa:)K>NB'Y$;&n>ih>[mndS8RY4$[3n$J#OuD+8p4h=(Cq+W^[Gf[RP#tj3?,C6fbn<k=SWan;k3<6'#g'Y\Pl&&R@8([(R7Q;8
%rI)prVKa-dP#Btg"bj3*3=m)%7*VR%qp7ciU>fWh4u]loNNoN[)lY2[G"[^P86284VT+BL<:N,rLpsT1lmh%B<OH5OBCsj+U-2qB
%(0W,kJNCmi>1I8==M'=\(as-^`j[/@""N9^bjI5t7F]>N&L(FUm&NsuKZsguNk?f"brs=o?)4&Ol$]`B1AIc5WD*#7L)rNjOL(lk
%,]q!KSsO_GFlK6@9GqhF+\^-.X2AhrXSrk*<d#her3@r[U:3d;rY:$.m.^#<N"+1[Z$e+-.p8LuffAsr$4FG;O/eH0hbh/,a3\6O
%'01;*9I229jAOLFS\'TlT](L:0K+&SbA#1'WG67BNo*%V.[\%8#4U-Ii")_K&^&S^Ph8.m,U>'nolUP7=8$&O-#nR7Y5)&ppnIJs
%UZID/j[u?gSYBYA4UrFidNR8@YA1Ns9i3PQJ4'esqlJ8]U@!d$HmW,^MFCNCDAe-ITe>5*DnWD.hr'QS4[r'&(-WJ5-_1Kb_Olk!
%I0=_Z'678BR!!sb!uQ(rY\5:0l`B6D^<oKe!+;I%dKQ:K1'H./&Bs=/?\+`TC15d3iAl]++P5W)H`@`5[X8_mZ`Kp<\8utRJh%iV
%_4to+q%ZLhn"-_^igo"Ecs<S[BSUM2=i(C,]Np"Z.[aVe\]X<lc:R*0Gka.-U>^=6luK%T"k=1rB)-J-`j:#CLpj.q`]s69W$J6@
%N>o[8!edpAXZ->?+`J6&e%[\^aUs<?cV%K>U!G?A3h*k*]2/akd(sCMD+%"4cI%KbKY:"Z*"i:-a9h@B.ShC,b@*2G_HU*prs`R!
%/..Y1'Vnh)5JIq,,S.]8L=&q6>MQUPc?u<LX`#,.&+6T\nVVXE?.+Mq.$i+VS.2l1Vof*S%"?geGZH\O60K=[4\.=.1RFhH+lWjZ
%cO<OET*&fe+b:<&=!B-;gE-]U?p_[Rr]q#-'krceX?,:["+MaKIsTT8:fh.c9Q377SNK`UfX^r@Y3I`hY-QO^'?n0"4F-5Z>u.Va
%31[9McZaZs1COXP=Ur0Ll69ZpS^7Oq>OsI#$OL&(Pb-Wp%eWA(6o\_<E>^jN,,=Ak]oT%mM(0&Wa'cd$hirkkVn.b'".j6Wd%XYH
%<_!f.*d91I-4b+=T-Li^pY?s+i^*#j`^ojm_LC^t+DkaAP&kl['28$`jte*LJN:A>;p/=TWk5f@3(*4YQV^m_kC`SB[a.8cB)8_P
%l)P:o!\VG$#ePi]egTJ([rJ/_N=9*XD:*9o?SP?X2n,s=)`nL*@\,rU'1:bE.$hCQ\X8Jb_hJ=B5b!d6O#/F@2OI"2Artsp(A^A?
%]S:oKCg'#2ZZ]5l+G]$@'H_2W.m$$pmS=pO'Gs^f.)aFSec6:+B'&=6oIX">3ii"E%kqP+;edNs6?3SNe5A]`d_Makg)S9nW`>jc
%3@&FeIYp.=Dr-Di#=+k^4MC.G5,G4:i_:"1OMD%.3KQlR2aoSgpt9NY$Jh*t5,hbn"-$X/@q<MHeG>`@970Z'`$A6Jc(aBhNamkT
%&AO]FQ_Vh+D]QSImQ*%(TZ!=l$PMo"V1?@W^0kpn'JhlB:b%6BU^DgHa4oFPrJWcg0abHS\T+l3Yk,]a+C517mu[-c+kiH1-r.>\
%gBUK#+J`'+A-*T[>QDaU,jB!/mX@r(gIF-87,?4oH(*Q-V(?V2FEu*P$\A5'MJX8(32mLn"Ys]G>)@\tC)O$-#e0lF9@^;+S<3p_
%1"q**&5B,ikf4J[8hf#Od<uE\bpJ"]Zc0ZXX?7fJW]Ek4o[.@LpDYh:jP[dAGR"3^K"tQ:+L@jgHpPFIKSE4UT-91;)T!/-,p6.A
%O$ae26m1/3]Kp9(TuZ[<!Wt3#@!,JXp);3I[PcU)3T#[E%CVI<p@dr?En`&/Rb8(hXku"d"nJ\6d*PeK@dljJXVZ",Aa>$b<Bqn4
%WYt#]2o^HCoY`3]1QAFbAJsM0__`B^<V3Yh&_>,22&2W%ZiKVl#<`=-(i^Z&s#jt+p3u,dq.*[M[kDGIN;Xm=2LJ`7"(<i!K\'$K
%!JDclUjP=I9ETpc,L%Y_!"a:`"Buoe<(+['G=cZ#n#1n+r6dApKY7>M.JVV4@M>pt:!rE3,>1'JUb`WL\I-TtZXj8kZ:eeI$rK(P
%OEGd4'h.T3G0&0Ta'E/EA5F*(c-X*3IT"M$IH_\Z3sH\`[qlM$>dosd8+)n[8A#GOBar_I,,Y[r9_ZGB7070\^aY*$A$DDF-GGa?
%Y3"(iU5^iuFM+fW8k5Vs6HO]naeKG2%XX>&,nSG@qfS-P-F3kZiX"kJZSEe7[RR\!X+kNXP7R!q`rdn?4$AQ=g7c;IiBk7-Kf2[-
%^9X].6B%*]fCV`[m+3<8=#nN_,O!pd6]LQ`/(ZC_*>sFT@]MIQ+X+$>rI'Q$*ksFM.34q.=%_!LqYDCHR#S-A]4a+GYq+e`"(LOL
%3#E)qce%Eb?c`J]'F>oKQ3uKcNme8U?<j8*C3[FW`&+o*jj1M?9rOJ3W&5_i&6+!SZ66(QP&CpF(B,(*%*@Ah9,PM7@M!1//D=^L
%,dBgejf0um#E4Z>8.T$L&a`eUs1uH;jRt9qS"lV/S^$2g#IPNd>.!@>+Y6-A?d7X>>k]sWI<npm"PQ5Uln$U7Ym9*]YbbF=_(PD`
%#";nblA:,CXQjj<-P.N_)=]>Xp)m+F+LSbX/D,q8me59q3-4O(H]D5Z31HVP'4@Sd2O1k[G:KQV)q-?_HrHhq-Lh!6UE09bRKJ^_
%GY%9glLVPL-f/k2n0\e.D6=.Y`u'guLJ^-Rf#m;&Ur-2Ve^/`+DPqq//+D.&QgAib#6@ATN!NlZ<h(mQN^iFU3FJ8H[_eJI9FcNK
%EB?Fs?Z&;0pB7R5ef:ghXI7j>6O",*rYcCTMebt<?GM#r"i]f2]>P-VZtN8>JZ?-(Nh6qG7Z%?L)7OH]R?Yt\<7t["lWqWsN&`>h
%V,4srV&]oY<4ZR*>SKn'p5RFSkI-!eT#PY2o^p1kHF1%bj$mA;Bs)_O3f''LG!(FN:6Fk(aTbf@F@.RI[@i?'loR]WB0Ul9HhJj4
%-FDYUi^Wfn[jMto,nkIsHasGo'_iAKe%6X@gk>$OZnK!W1KZSn`Cu=s9>1V<[`'0[g-"WmYg$]u`$>?!qQ>)N@#)$GZm&WlMH*f'
%?46MVk"XD9CL_[==Z<-:-tb;R8F/6(12k8.1Tm'iKA%0Ak@*3iC[DV'DONM:9qG_CN>'pQEJ$</0M,g1J3`(<7>a-I6Na*#_a;te
%-/3$n4R[aP2FqLB,O342A[n+8T3<*=gEpE=gMC]\2Aq]qZ_&(l_B.;mhGNLZ&Dp@e=I(mm;A;Y-iK/5]'>mN+>NnC7NFDRYT@_TH
%1oiHK+gsirU'9s?D-2F"hl09g(Tq;lAjhGf=Z.O$^1sri=FC!(C]GU][1+&j6B@]H)cYagS3.`K^t;Fm))a`4Ze`d.=\(;a2AV%l
%])+7!32ZS#))f:u]-kL.FYd3u%J-0PnhP'6)0sspW+mVeij*E'HfM>/fJ^X,,.;?p3%L?G_AZbpWePACc,!qdIFYP']PJP:;dAG,
%MEZ22S%gQ0L7G#!9%/PWpLN#jA)"H.^7LHX5hcJR*55%R%HuTmEkQ9.f'gnUC`B0#*_3YB+9Il-A(r@(n@FGJFT"h/%>oH-bEtXG
%9=6o3bD(]?o1ZU;7^dHGZ*8.s-n#f'%1r1+8bNT,kM&Q$%;YU]Z0e$0DK91?2dj_k1RU2_1/Gn!/*<5V[#>qhCo4FqRneFBAD8YC
%b5p*aNr"n@d"S@7rXp>]"M%m*%2>c:ag10%53+<!d.NJo[7dBjc(t!*/bspfgT85`ZhJ"]FHJ7iWs4[V.Di4g_NqpZY/s5e2&VT`
%ZgSToc$J/'D"a7ULkn?P=gMIORl.gU8XMB.5D]e-*BmTWX7qr`_o4iT12DE)FsjV.m?qM9!1V$:bo-SXCL:\ug7ZQh)9;.c)J75i
%C-aUjfO*C<^`2ZGINp0M8Ia91OD`Wnp2j'NWVYV80+#8Oe-44/o5@WemT\j!kDl4!Bm2P8CH)cYnLPg]Q/Md8r5qZBB%Qc5AL2Nl
%o=i@OpHD5`bj28Y\WH7/r#P1FSW./=gpcKgNF.h)P0k<:"!A9VG/eC1@Q>R&#l]4i3nT]:1/(/WcNobG8W8?<0oYVQF9i\YaQ#*A
%RgNjQeOVKq1!5o?cluB3JC%UT6aSKeX<+UV(_<7??NkVtgBSejEuomEJ[!Y\'DW$_!g#1c,Xfu-ITHg4afDT*n:R\-k>XOiKfm+;
%hP(p<`)TmD)Lt(48eX8lU6oCpgmf=uCCXl"I_mKMZR\$ceDEO=8"/Qp'h;Xb6i>4m4VnhmO@r/j-t4+kSb"ZkAKTlTWYY[mTBCV+
%:h8pC=!S?#]IgU5L%VbjSF!>3"4F,F^gBF5FLbY1HB7**^mKY*:D#'<&KW6(Zm$H.51-hm$ekD[)_0k4gNSY\Y5Na*>Qr:$.,b\"
%LE@nU+ClPNm8M7*)K(AhHo(h3"#+5e?`/7Vm^+l[-PnS%h]C$;L!';1]FZN>B-%.b1R3'IBi*6KVQBaJo;;D]lqrJH>3!>^7e1jc
%[Pm_;aG:XW[*%"Ni/G.Ukg6ulQ<(c+,fE/&\i5!#d6!)]?iX"UDOm=+!r))I7u3f^./ESS*&l?MS/%h>)#VWrb0,U[430.k:#0GC
%A61=7pq#6PD]-f-'P+!cRF^!c[^H2VIEm3bDnl4W@2f9="gH!7>*V/'#(i()GZ6%J(t`QC2>''UO`\jD`tuU93Vk._Bpud)O2AsK
%MM82LDBb^+3+5`idG>ZG-IO,XR-2jK^0#Wfe_p&ujd92c4g/O&Yk;334k3U)<E2O:6a6']iG>M[`*ZaA0rKP$Ylh_$WO>!To'lT*
%"Pr7*I'BhgJAa7.*UOtjN]:$GLO\k@9_3R@?NOAXlV,$G#>rZqj\#SOkVh;3"H\VS5FYma!29de>R:q8-rfa`?jNSSX<W;g#aL=g
%i*B#AT=bJSQ'C+]KY,@;gtm]g,[8ri!(u>:`gP9<8<Vb3dM+JMc@h.11LXeJR?0-`'D<),2daJV)YLe$-:718];hj=DLOMV^gmWJ
%DJkNLeGQp>,.Se.hM5o7m$63m"L,eK=ud8YmE":--3-njHE23"es,qOh?4t?h8nYOR(!EMZTA3?.*7qYJC1:V9`T4h05&-i6]n,k
%B>SalPjM.H89-%n/=[#doArW49;l`8!ak%+ad7N,TPJ?='(@b4Tf`&_mR)]WgQuk8q_kttDULg]7fkZYP8E2\DN;I/"/>(08Pe[[
%[QM\KWVb:f,2D"rEndJ*:%>]`#ksG+\"*eK1mpm0KT0gr_C])km6eCqe#&K$]\Q";q[i2\[[PBpE*&[L97#H+[h/oa]Ct[(MBp@'
%k+r^l,p8tr]EiR<!4f`Jdp*XBMm/?27G(^e&V)9C)dWXi<%><m@@F`?HP*,Z3%cl$*;YDQ(BG)R.[D#^%X5p!NW^IU44oRHl#Qdj
%8=1WJ)ho_K,=r=9BH!DZ5`9N\+[BWIJK-u\UmK-lG&*8Zdt(-u/C[!Wq[9)U:%k#E+#&EBlqS\DV).Z&:7,&+"0t,l=M7)4p#F-R
%[f$LM$%G:]jA4EP$@fpAhKC=6;8k8p#9GLOrHd4p^f$`8-hVe/'rgUG#cg-FignHp41Q&Ue2)@af)A5^"`,rk(kbB[!*-Mi;-9;F
%Gnb3uZX$)l./]k\ClcFu9-ed%L4!gP4W&N50*Hb@-J*g,$rgi_0.[I[*L!,;@&E\[k3T0R7[b>If\)c8ISM$H*+pdF88A(*b&!h/
%BV<`(m1U=1S@'#m*tRn]Mh]2Y;JCt?lQGbKcGt+qKlP-2pC^F5MYS0*MD[Ak2aV(@aJ_ac81W$LhiTuY^e.!tlQkHj&]!#V4Mn0K
%2-u94F:5u3q:"`jSAO((,7+M7clZGTA(oRe:NaII\?=lr)9`;FCJN3tV7^j:>,]\2=QcB$j.'DB4[msBj/i5#PKE?W^dgbBI2&A6
%'elb$KY,Sq$`mXlp.@9D@(/[&C[)o-TA@dORoe,g4mo>!XQf+Womkr%3IkQA17(."+=foir16V5EnZn[L$[X1VKHmP@9U?EN4:U,
%'cod[FdK0R7@M#;N3/iO=6ea%;2V6s5T(@$&6=[+`/_IOk2MC^9="&s2eT;j"&`H*J,%jYgtR8-_2n3laAPeu6N\`[.9opt7JZS<
%XT9DM];K']EOm.cAPfSG.E;g;ZN?OiIlk]<r`u?:(&:Ud,t(^\3L/a?OgGD8Nif9s'EDqIpM-E<iood;jp.(BcTCM&G3-;)g-*N)
%]rX67*^a+J7-h2nNuic*fW@i\*UU84JR)#tf?OUFLN%V\)2V-;A,=RCSb+Z)kNspGO".m04nACAp\Se6Z"G6@#[3[Ndn$bKo@Y,>
%%>fa@+)r%Wf&85N>INq\gCeI8-GBN/RRHC*A=`TmIA(f/ku[5X!3&(X<K$80n+/Q^-6t9;!EeCdEIXM8e"fCJ0gY124.e@?3*_jH
%#=L"di&&&J)ots/V:m+jf;BuRP\o6m:g'NP.)H!`]Pti-B/Drh--B5M!WnKB,`\*_fOqPtL<q,m73a01&$"jF#o[sIrBpL.PX[jX
%LnS;#I?g3W>.6@bRLZQ/i844m1XC/g_"_frI=V3+1,j6!5TGsaiqAEk_o0ZrSB@7t<e0Q/KQOVZ(2\i4rlN'"Oa7T#="M_9oRbNq
%0+?F.UgSRN64t(pGtkF]nJLoJ??8V!LsYN%&W_UHLe#;rnK>Vjit:h6\)(^O8"]t-&J$'e9,0QWQt!_!Ol.GJ1C#DN6up=<_p=AQ
%DiaGb88B&<ql2":lZ=M\+MXN"6C9ar!G%.hHCuEJT]RZp%XJ+b(KC]'pc&.@&bJW8$@6O45n@tsN3\'W,W/N@aVFFb[7<NVK-!9_
%Pj51POP;Vo%XNZD8+gI+oH<hQ]\3jAO>EiFkg2U+1(s92GL0hRm5Zp&YjKPFG3(F!#AKR^Tb2:)h=hD*O=Mk;W#bL17F\/-#7!E-
%5%Pc8#<dU9e*dcmOT-eX`sd9U,"m-(cpKWnIHI1-YZ$r"Nd:\F=[$=:r*.]%/*9.W0"m0Q*p!$(]j&E;Lo<c=MKob3)S9K#iWQUR
%>[6P5=](6>mBB*t*;A*0O1<4O_iB*1O[e,Y8;%prR-FS7M`ZV4BAEl?<u6A?\??TU!(&lP'SmSs79]d$KI_SC.tGI^ZV?iAko5)E
%(*cot>r@XKh<9l8kO^_J48B`fTL*>2\GOUj0I11nn'uCg+>dG+jF]D&ltp_&A)BBm+%/Ao^Hs"]fs-Tk3V]lJ'Z#k/]G:@sK8T.'
%&K913rnsi)b4Gd*#NJ]VgD!HK<aUtWW-H6]Efoagki02=1tf[Y;f'AL\C9FqiZCRW$Q9l^+Mr6omD1$e"c`9^OfR"Qs*,]IIj?T)
%+)+gh!$NH@mJ:P^mN`r<GPHeqFLod*Iun)YjpD?L47Zf5Y8]mhEFs-[">2bAVlQ8CO!=QhMQH6eYQH!ni*pG("@,LEV>uPW+:20O
%OGu[/KL]cc3M`dXT2YhGFZ*eK72GE3K]HL$4CXmCe=f/BNeV^B<,<G.hO,p4kpgm*8U!5?lOhIl+f!b03'-!!jKTrKY:8]76C;?C
%_at[b=&?m0SXaMeT'(dnO"Y3HmeiGANk0]g])2Gbq!?N^XK0oGXZOLDVT2^,mA3*Ka3=:n(Qr)X@@i-pV_q>D<_og5bm%re;b293
%MUtJI=U/U%>-2CSqRi\Ict!PlS+73cSPFYHBhd=sl?3TDKds?6-R800)iL]KGDbY>ceFYr7hmPZ7in_=hf#^_SqV=;R]1G-24s,Y
%<LbOQ<7Ri9HfPQ+n!>`S_Re3bWR'mse9Q-b@eNDEU;Qbc(hj[f'O%1rK[('l&+V0B9N6VMOUjA9OGqmp_<#ouTSs:Y5`TlS+\,fM
%a09fa9-)OmA#3/"Pk/?WJj[4EBGr^1lQD+M#A>T0$&Bf,%\Jms^6h[]3KPln:9cr]HCqES8W-qdY8"2Q,QtC#1[+I:M`,-Yr5]]c
%%9)UT+nihnGEX(H/T"3,7sN]iV!RZs1!u_NS*:bV<!S;d@hCGWI9juG'Ru:a?_QC%6Gn6hQWPgUnj3+rk:Ng:`X]o`:@?s1H<p`I
%:e?PH$O:a[[V']?aQ7.r3_2HU;LbVXJ/o^(31CepHH'k+jqUXnDdO..($,7S0rEo7?h`B]V!Lg]`k[a/)4,-7c1G`9A]UN0`qt!j
%W,gK-5Eh!,fV,2p99R"_o'9*71:#iS'5TOg4>11l-$Jrhf]s0k#J&pMD=?r)C?>$`:='2M"hbs9,EB&62:]odO8IdfbNn7*7gF*"
%]fDjVDtHCU@]rlh:DA5M^mKWb6=R0Cm[ZSqKqKR=*JEppUPbXoVXP+?)i8SrFd?a(hrN)?&3ri]$flpLBrFV$X%l.mJUiN49l&ep
%G`^cXs,LB6M&#`MdU>jF&i^Fo`bXk?k=Ro)Z4Did!q1P+).!tf!0Q:1et^f>s3>hD:\iN/asdY<:NlmVJDW3'_`T*[q]>3(DcNfV
%7f]4`b#3CTaj77Sa`VECj?90P/?*@5:PV)Rd2i-uC(d1W')11`F!`/:4.N&i+Y`0Q4c6NWM(fCtW%%m[T,`sA1fDdNOou2(cL!li
%\*38HSCuiLSEb"-JuI^eF92drk,f`h'28MMr&4\4\F][T01901U;Hf-WK%MR7^j@DYK,Ho6!Qd7XP5o'S'g0GX513Kp&n%sKfr#V
%On(W"i&-sK^8Dp?mPUDM%I\GgYK1"+53/M!-.:V/rW;mp69rJ38#IA9dp45KAB\DA:7bAiZ\sCE-_V-c0h/RR!SRD?265=:F!5d@
%`!JZX+p_Ug[^S^sBt/X$HZ#TI*",'^Wk=T<lG-@Xj3%o#d+j]\AC6<<*FYDicq.(`FT@r\CaJ=F)E%V+?h+"i"ZO.4o#ooZ0d+RC
%%KOU5oXCTr#WmM\"UJF2[([^hr_:*I:<*@Xh5Sup,cj;840i"!!SD-$]s(V]JOMVgR.?A'c%`Uh43u@al-jGMGe4&;3bGXaE?QFh
%ai=nJq'st(nP1K'AV39l7_;h%^n5c2\-%%&3$($NRRBEe#NUQXqANse;ci%_i2n\P26XSs2S^cOVHR?I5ln4sf-P%!S_,[WD#9$B
%,4dXWkp41>1p>%,2,99F,B!WT?t2.X/BS[BoB8/$j4.JsVE9]#+(W.7Fj8d!Cd*crB+r-\Mm%lFnsA:*h'9BR0:gRD"=#*M&D<n]
%\Z[Rs9kQIja]C@=V-Z](a0>J'Vm`M(^st>,+mQ"nJ*61&F;7$44-0<$a"b=MP5Er/(HmQ</O_iJgVe`I[nQI9,Fq'r<?H5Ed7us)
%lbSR1H3[epj0"u!+BD!!E4].46S9E@i\EfM?.%3gp/iCjpBA.'SkJB^[0`>ISsS.n?##h_Ue:\:?r4_SGX`\?J+S#:^D5UPg&Ys.
%l>qg1$8H-8DBcrP;/BJlLKL$[/[/:VONYM5CpXQVV5]E$eWQV3lhWrXXtT#I8t`Z_7Ha6BpFYd9BhOBL(O,0oEYY2baQMPdQ,A$P
%fO*ZrV@%=Oj_[7u_)l"n"Yh@479gc]cI0Am&7n40;7^M0np]If-hlqH52FoBRP)n4!8+`m+6V2gpaSZ%5-tW6]@3nXW,Z5&0s%\Q
%')#`tC?Qtl?I3h_U,s&/['++0WMKbAY6m'%2GL<!s1#B='%t'iZ%6\uq@"d4f,k<&B5lXOT@9F?Y`I*5omcp2o7IrQ7I'/V?^,[E
%It.Lhqg\KuYCH6,qnMps]>+/Cj1kNZ5Q'.%J,6pproL?`qTJ>Vp[A.Sk?n8L?iK]TJ,K/007Wu!5Q1%X^]*I>ro"t!q+q%gli2A3
%jm/Q=o'8O=o0<69f<>5Hhu<0G!-s#+QiHJtJ,A^6jd5uPIF/UV~>
%AI9_PrivateDataEnd
diff --git a/doc/shared/images/uni_logo_farbe_02.eps b/doc/shared/images/uni_logo_farbe_02.eps
new file mode 100644
index 0000000000000000000000000000000000000000..3f27c5f4598871b3f36a5ce631d8fa898d677e41
--- /dev/null
+++ b/doc/shared/images/uni_logo_farbe_02.eps
@@ -0,0 +1 @@
+%!PS-Adobe-2.0 EPSF-1.2
%%Title: RZ Logo Uni CMYK FARB_OK_FH.eps
%%Creator: FreeHand MX 11.0.2
%%CreationDate: 19.09.2006 9:50 Uhr
%%BoundingBox: 0 0 211 58
%%FHPathName:Grafik 1 OS X:Auftr�ge in Arbeit:Universit�t Wien:RZ Uni:RZ Uni Logo Wien:RZ Uni Logos:RZ Uni Logo CMYK FARB_OK_06:RZ Logo Uni CMYK FARB_OK_FH.eps
%ALDOriginalFile:Grafik 1 OS X:Auftr�ge in Arbeit:Universit�t Wien:RZ Uni:RZ Uni Logo Wien:RZ Uni Logos:RZ Uni Logo CMYK FARB_OK_06:RZ Logo Uni CMYK FARB_OK_FH.eps
%ALDBoundingBox: -187 -391 408 451
%%FHPageNum:1
%%DocumentSuppliedResources: procset Altsys_header 4 0
%%ColorUsage: Color
%%DocumentProcessColors: Cyan Magenta Yellow Black
%%CMYKProcessColor: 0 0 0 0.65 (0c 0m 0y 65k)
%%+ 1 0.45 0 0.14 (100c 45m 0y 14k)
%%EndComments
%%BeginAGDEmbeddedDoc: version 1.0
%:s8W,W5t==$^::es!!%XaGQH=-GC1.EqZXXAKHjJX;P[AC5-ua[
%:s8Tk7MP)(a;*Y\gpQ,qY&eY6H;@+TlZp6sANZ]Ge!YSD0#pf^@8aeeF<)BA=>sKk-1XFmj\U01Gn+ZRemiQcLj;smU4'U!uR@Tn>h3G@1?5b%K8ZpKA8LJ4YnK_g^/l/ZW&ST+4`W,!`]``&&1duGII&0DtLGY?2SYUV1;pF:OS'#GZ>uH$<?XBNcR;?Q^:eKh@s-u+BAD4UVV73Gd?#=/\S]5O$P]#5$I6"9ioDrg@1&]DUcDrpQ
%:?U+Dc=SbR/UOC/G%O5kPW$,kL;TSn:d91cgH<]Z*kmZf<;ju,lFHei8)C/Jkm;`/,$f>"9+nidZP@5c^ntc\V%K2.JCKa%XQ(t`f@"h]/WBW+Hl\7QIMuG)g/=e"0oc/Zad%IjM>Nm-t5@n+)B.B>=Jh8AM8Yf-r8nAG5PqB%>O\T%OP3PqEOo?j"5PbmbQ))Q#'iM37<)'AFeW=N<[<Q$e/E[?9D`Q67=42VJ`UrHGXTN..b3k4k
%:OU@6f.7LMOk.RAi]S;.U^3X?mg(\8[s4io3f&NhW%^c06T0$c>miZoU9p#'H43__Xk"$1,[5au6cp6!^V$,39](j;o#aJV7XW6MT=0LI*f1(`T7o%H6:2Grds*FuW^&!Tbe4<$^35)a\OhK!uUVr\&Z(0Abs*Jg]I)qMa\c4=.o#jCj7^s+"s(h>HJ5Q"EUfk/8`\E@IDin6YKB6'KS.oOQ^h-@NW61<5BdJh_`IegC2)-[B?:_Z.
%:b`r&N1_r/aNac]ih=EZ7ObGTG<2Ndk2@OY(8fDmdWe-Er=tK70Po;[9W)3c\bYc[(6*I%Sp6.&53V(TLWd-$*WC0br.Ka&41M'@]=p+^@VE3-e<8lAkl:VS^GGtT+V;@@WSW^q5W0'&#3d=(q/QI<J-SlnRrJ;3H+A+AR:LRT%5B.l`,.!$2)O`HY8LkW4&W5uKUNFt]ag=GlhO7oHi5EPkR(P<hl_pHdTbFT]8$PdZeA<>Y's2$D
%:EBhY:Ie&dn\fd,-e9bY/*n#*n[T8R`NL6ad)gMCIaM:BCP'j"QHm:M7RS(i$Q;VL\bV3bEBq88<T&f(qdFZdrX7sj&1HgQQ1;E94D;2Qa8_Wp+O161S';q>oUpa/_Gr5ZSdG0V$icM$1o:i#NTO[ST]I@kH<\u"F]sQ&pdefp-V$$=d["bu3jL#>5%K<Mo53.s(,c)2&E5SZ3B<"jYUu!1sV_WCgs)aMi1PA(jR`'3&'>Cc;-r.<@
%::[!9cH1.Y0K>s,Q'Z]1T3MJ5i24+=2.d)qTGoa7>['jl#Vt+#9VJ;a7o00i6+)T?P/^iMKOr'I\cfopoY.'PZ6c[rJ)C^iX5As7-3q>sK*W\J@Tm4[\#k5r'nTTa#OLlINm_48[Cjci5L[$(f=qHQ-^5]p7%Oh=a.AqLk+YItf++`lD_rZ+0&WkEAQNqD:C2O,YL'%M.XMj3QXpCEm'8lC\+u%c`I`B(e:ODgNn(h(-HP\[=GUUF.
%:,t_?W6/^r+TVT1/!l%Mr8X54HGE6L4A@O,k0CMA%;[:OM\/6M"4dil<)C7E8&bpPpPamb!i2.)7\UB74^7V02D^5DO,#OLFK>@3F..Q+dRVHF4f1B=A"/ITSLX`&H,]<mM;MIc5*_Z+q+I*UmkpWS*o9_AX`HB</0>HaHK."o_iad@M+q9iM;Eg[<H!i\rC*fbfTa(!?@hVI9;I>Tq"`p][e>tRj/TQ._XhR>tR8^b234XD/h\.b+
%:p@e-I3FfFsPHUmsCCJP-5)aTPj422lH'7oDYKsnp4:DUJ)K+^7d$WDK,gE$'Asi4<Ct/6Wq6%*.:6^B"rha9.rG&B4PO'Qo$LOOSW\gUldkEYERa=:A(V1sA3(^,mbqQc\/K#WaC25sG=Bj@^G!ua/bM"hAQ"lMgFgk3&>g`b3jkA,neKD7]9@E:SKN.M?;@34k;Ol[[2E4Q\Ul;[!@]JfDURR3K1;?qO="nB)YE<X8l0m[]IfZK&
%:MGRM=7N,(;B-fUtf?TN-?'`s]7ofGHSDq7R;5]C1JSH2Wr=,)_8YbP@BrpA\d6u8E<8uu-6IaRaGtb8](XW_6bu%;DeXkgRl:IBB_;C4C*bkfb.^8AGM!hk'*#7bkZ!=/":g)c)b3L3O,Z(S0:f(U[Ng59eUEQ9($k1i^8&UVDqes5,r4c,:SXg0&k>S!b*"8\P0[kDad,/$uKZIknbS*`lSsW-\abB?)0Op^$MB#Y=T%?^\J._J1
%:m@?pl1fcZde?[g<TlQp%_E;*<9)><>WWtI4Y[VoWnXUsB?SY\8^=I&Jbl>%ap7$tX94oa4Y8:Jgfd768`05$VBl;D,h9U*7nIh348NuN!1V>"U2T&_[SRZ)RI:[^&8D^m.0=;&GRSb[@du%JiS?<sXYY9?@V#[Q^GJ8dm%@#r`,'b!/]Q?`BQIgON+O7W%%5TP6hF3Ud>\U=N2qZ"</s57$9(FTEH,l;qlSX)FU=2'<%*OkoMoR`?
%:<*F1i\Tam(j]s%Q]8GZTc16mC:#>8m&Y4Cn?>;#ihDN_bX-T(jB`HH]q7iKSf#dK#+F,oO][TDP<t7E>kA]F:%VAh?]UL37F3n)@LTM>XGDe$@G9lW8QBs3SeFIp0a["WD%EqX*n-2;iX?M0;_`>c;IL^RbG/uJL[66dF4!eWUI'7:%n)S&]eVr>aBu^2?$>c&F`XgQ-hSWsPHIQP#/i\I4%Oj)!od)SS/M9d'9;5o]mbXWq3gjdM
%:p-,Mmq^2c0]jDQPJ/$"$],IN3YkZ.K*#\.(i1TX#<rZgs#Ur8nP_74<%C^(H,;$!2KWJmPFGMfN.lKEb8dO_ELWEC7Yi+%`**TSk6rTe]Bg+]&RYm_I`dAf/=sCtd<Bk1@eb)h:RF<1ehqH^c-b>p?F(_$gGLW%(5F8-[7<J0lOBjmnSX*`]1Rd$>"hrU,.??WYE&$ea4MT>(P2B3';edE">."n2(@jc=opi,LH.MWilUl<&l7YMg
%:Ylo<[Q>k5h-p3]?io7#(Dp\0?<U6)e@9jOW?'ACBACbn<WNJJY^kH-EL"@G3>[5_8%D#FB/5=^LgdnoYY%b2E)6@U#lUkem@t#.u\ei(SK@eL'\8\Lc)g'?5C0bm4XD<itCEDf1cak/Oe[=!iS6nG^?IprOTgRHOF=jk7?&L;9CQY^aA_+8BFU^.WFmq0)s6L/tq\O4#dEX]7HI]$<rPcXbr[dC3/*hM@FZjE<CSuf@Df?S#-Ei7t
%:H++>,=8*08ras]lhQX5e^WX4f_7JK6?0Q[/[!mEN*TtG%J_-kN3;7gV)g&c1e[k`o@9r?C])K[[hITt;9Qc=uJo`=:_L#fUi[6:'K<F3/MY4C_*a2[t#I:Ln=P(Tp.pX;:o;d)kcOiD:"*gFF7/[!$DpXb=Slr>$cRc0`;d%_%=P&%*f-jR'k@>h:fr+=R:_i0.o6Z+m0<A>Y\f(Mi?,Q\XGF@DNp8(&VlBS(/=H/&X4_1R.-!l,K
%:JMYUOcjr>3G2Yd&`W*'@7VBuWC2>H%X%"c.>)m_/l[%2O=!)*p_-mk%Id2rOg?W\([CfN*>1(3u<fhI+`4Au]?)^oQ=MO^^I#*[qU>Q^`!A5G+pBFp\[VB*K=]j:UZED_\f,C_@ocY5rp&:j!/uEcDcaMfB1u$&=f:"P7ZmKS!N^dScPZ";.WBe$=?'fG#pS>R#k8LJb/PQsS:$FY3BDs=1Wi8E9hVqKk?:>9J>=_hW1_&$c]hb5N
%:1$tge(^?@1BlAX$T#FsoiFSIhZ:jj:]qth28_8a'7q+/"%4-$gmtS1`]f?GBp#4Y!R@usD<p7J[R%U`O0h\V#"N`/oO0b],qaWl>7eAK2mI"'p2C:mEBpt3s`Xtk4-5sc%12HQl`IIa]^YYpfJ*h7,1mbmo.@o%sP'!/DRU/s8BLoGq^Qs2Ca^d?V5U9DA.`E8;\<JmJ%"*3@=c%2i*8qYOKT#Le_=Wbs&aMo!qtc]-ZPm:rY)5N+
%:l7kH+,#1("Vo3DI\S:MHg<tALD=VJr>KepA6>>/q`cR<%H(U)\W]$_,VVR_tjP7UMb^19F8#<FEF\347q#YFK%cQ2MZ#FK`%4@IgNLu)Ig\2^tVLK)bStg9Lr>R%8e!Q/a&$=QQc5&=8PAJH5Z8!H-0qXgM6T<ie_S>hg`,@_S`-KZI,Bi!P6N+HIr=Lj#53>$ZLR;`3.rh!BGLb'/BsQ=$lr+:mhb@/O1Kj\EXF<*Lo`JG/Wh8i$
%:+T@Et@Dmoh,Bi)UTtZ#;9o*NQ.K$BV^ki6R8k`k/4oL4OSYhD/"&0S+%o$PR2Up.7'\'ST8W;=cB$KMO]X<(7q`hdi?a';7m>*E+Du+/DZ>QM"KLg'^QAMQL#/WD#$QMc%C!tEcf9@>9TZL@prQ<!Gp6RWWTGbh>%Q3Bj#nnC$`=^uM9Kpi2a$.+RU8`DgC(P/Q5FTF.()1&E99L.`:"*Lp:f[C;(sfTj%n9[FKE(]>dr=!4`:?22
%:O]3E^P0.Q0CHUjQrAgWG3q7H#737&Qg3G'YlGarXY#^BJ,KXH7?UtL+=Gl-c+Sg,'8P<%]M+F(b+!+d26h8#^nBf]QP!i+=e]7#`^I@-0hO)"B*YS5I"V5<2'(rjre]:c^8=/9)DG;DSYll,;2+WO*/L\p`M+G-u'-8SE+Q:[dGRfZt6G[rEeh'6uX_7-FImp>K_)(%[,`^R"e8ZEQhYI\Q7k5d'j!f5E#XhSKHL\Y'kG2Q4f0UW/
%:O8g/jDqcJHEWA3D*C01T9u]lH(Lb<W2HH*b``[F2)fMuTAn^Ydar/<]1Qma;Shj9W0dCDskp^@Jpsp[@030O@VHKX%0%tZd#M1279G7NbHH)=sC8u7"GJcL5S4@h`4q\M=_:R9LM*31@74UoRH54/;JOjTR$U/8LO`5lOZ23s(q&U/tG(S&WQUj+7>`%"n.M(iY*)u&qZta[H]$cc?TpeQY\Pq-cS]6f:4`=f4:'g8JM$gLW9pm?Q
%:PU[P6S!!3b\.$ZSK7lNZnFRm9etp43XXu1()o/Ga*l=`W$1P=J`MMWQn2/'_WN.VE-]i#Iek4c;_Nml\/TI%-RDtOt0Xo!tmLpk9^C):cEt&F#rY1ZCQW1r#?1.4]3s5l?Wl$ot+YF4@-7n[n\!>!JH,hJVV5E]30j16R!iK81-12PWA;4pB9X^akAenU6?t'H8qpP(peQn9jZ>(gX\K\FW"BuMD)6!_L^q4V!;SS6I:Y,\>*%e$p
%:m8&/9<:s8Zaf0Z>G9OBW9DCFF%OpSY\I*.0$n3d2_7+Og;F3:Z[m<$MkidVi;H6@VEp?!dech6*mXT5F)b@Cfc`(T38O(_%<#J60GnE6$IR-jbImNmHMaHFN=&bNp6rMS*n<k5G6n^T2&G=^08?>:eS=1R?BR0A0+%iG8H@hM>c#:-`3)pBZ.fUV7k9G4iT_%nmY4]K"`%pH1J%h9R08D#J`-tSLHZ#C0U]KN7H#ktY0@Wm/A/\$O
%:Wf33EaK3jLd7hnHC"tPO2+'bVdUo27<9(f_:Yjjh`Ui:`j%Vb<+b^hAk,buin?[(GSKhdu\XZgqRX+N0"%c,pD0<muf-FRrHuKg4aHa^7fgtAu%,P`0b'aGVZO5Zn7R;<Rreoh^Hd2(<\*2=,PI7tZhnj9Q&$fo$A@E>Y>D(2Vo$qSH$?]O@+W&qr)+a!jNs_rqRA)I-r+ddKD%gIFk=/!+1CQH^I*Jc^<peHN$bNfK/mH0YF&GnT
%:(,S\;/\4n=Q7]>NqKb\HH4W8T<2ek2Iq$P'R;0,A8[f\uUIIOp^X+1h9Y*6)WnpO6o[=HJW0+'1eWF*a$pJE:MK/piTc.:E5K'Sh?Z'<L6Y6-rYl-JKQ#(qac\H`X?(=M7g*<T5>&tCBG99&Hb`JflQ'$;C"l=!)l<$%l`XRL.)L5Q)gEJB7,P\4"cEa:;LAmWqRUqpf)BV/`;Mh8lltSFZI?%UNoB8]Np9ce>>u]9`XgRjl"G8_B
%:$YP,%E^n^")53R4ZXtSU@kX;#"6G1r*_ZEnZE(PK4WBGKb*1#C:$'p>,IIt&__W\VW=Ai[pQp.r%3@*!q,Uk<PkWX90h[@kl9,Ade@FQhUJLi%Uob`T.t#YZBu;jGHd%79gG5-K\jdmGd<"0(c[]!`[IC^!&Q8(fKngh#c/UBVm4l;l_P3C:>@il)Z,]j%gY$(_beeT,Z3lLoUC0t$<JH8I"Z>Ve';XI;DoC=/*[?(uIGrcD2.orO
%:>HUM@5)%ZB`CQW+"s,R=+l._<9mXNP&S^c(n4:'Io_3PpNl;>gj6Ii$rKC,A0Gs%qF^g&rLX%(AfcGD+F[Gq#QY;NSaDe$^1[23@qdO*%qb"jonELr^nK<t:qi`RA\?1>6hc5c#n-\"n!Q]MPm_f^FBE6KDIgYWj#EaK.KG"[8a'fPJ]Fh&kM"KI\@YI#?$^!0X4+&q=7n3FcpeK_'N6%h>eXY;%O>4]l^(8YSEHhiQe=)Hj#goRF
%:LQNdGn"/ck>eW/FOWOK:His;.p@B0!#6'.[8[mXD^)(K\!H_2F'5?";;#P!RH]dGpbmquZY1r.hI]D/:kBsA6gNN*LqU+Z,T4i@KOn+)9c&\^eeTu$)B_HHrCT[:'s(@2`?Z4O8H33i_-/p<JoQNQ!5dapY8VtfNSj:VXOiTX[c[s:&n^D=8m("CE$,tpJq'/YNUO5)_G97'^rV)C<X0:`Cp9*6aR>2d?o49=j5Q!m*frW#%(11uV
%:`Z3K]>I?2J(,eX2L/J[2)fpgpTb0c6Weuf+c@1Ml&cY*^T/H/[WBNok1[!HtjL#>Fcg<4'qstTc?3ip$.m5=Y&\dFW7AeB4bl),VZ@?_e`+9j.7!$kXNB(lb@ueYW-CTqABk#_^4;253U5#9"R"D\ZB8eg2#-ju9]d8UDXO[O=D&4B=E&'1l/ONppI7S]&?)IHG25dNZrE'H.Ip,nQN*Ipn=T*U\osn2K3E$$J6QMhmhZZM\`MuL'
%:*Hr.]q]DeuXBiB(GMt8s(4:abb\UfL;@c_qbkYa(dK@X%hT(&+d;"XRQYFZ(9tXIFF2>`5S<o5G-l[5aNM2Pm]"[`OYQ:0;SY2WGK0`IDbn.n=9WX2c@7cjBBc?R1-"+_GiQ.Q[:H)7klmFZQE@;@c_&JNcCpXhABhY6Jaf:=lZ*5t)Z8&>!I?hgl'UflVp!q8bPEAo@%htO_Td/"S9G,9<o::d2EB\@=W&$28fjia#0P]<=I-EtS
%:gRQu&k,7_X9r:pkT5A$0ZXi`MjC47pl5,kech5iThU0E3]aY=olL6Sb_ab+-h=A<Nf#'UDs.pHN=8kdDmlj'-":[GkLm`b@[6j3rQkAp$)6;Uq@VYB^Y6810$.BmFSC!eV,\YU`H(#hb8PNK(e>/s6P9tF9R^.WUda0V8O+86nS%6A(&lk.lZK;M?\(2o!cPEteWbhJaEe4*f>DJZsA=0qTSFpS`7"mTf62/XQE+n>DD#(&Oqh1-u
%:37@=9beOo4qR868g,e36M;#ge\&#1co]gJ,^%De(?"thYlXl!?^[Q4(hc+2nfDKO:B)Q.HZYmirh3?0q`F]:CS)nX@bj)<_K!SOViD@cH_Q6lZG2fah.a0A7_4gB40PbhaNp*I+[3B3GI>T8afjiV(DfB6\:5RZ*_&B^9G;OeQ[4ukWCs67l1&#3gm^"Xtl_#k!Sd.;#.V^=Fo_<J9%df2g`d"T0-Y&n0&N(&RG--P?r4=rdOm@i3
%:\=51lZdCZN3SbAj-`aO-Ea5Ir%lKELg6fW,Cs6DBQm]0o:YD+Hk/PV/QA)8/mmFpZ09^@R;[[#mqp7/>hX_(1?#JTIqjT=8E'00Q4Xc8/D]")$D<!>1RL>.WW2@LE)Y9$P?`Q*IKnYM3/fXC[2Wb_n6PY`p`-?Dc_^3<YpGXNI`r#(G\AWX$?cOJ4HbrFP`-B[X78[O,RpG.h,KF@5UXa%W77i].2@-\^&CQ(#3rbiKfX*\l!XSi^
%:0j5NK1"pYa9^$93>V(r7mM4Y+UJJ5HLaoqc8rTt.@3"-M(VVI;j3XMVn6I&j,OKB*''!32#EBK/K($!n1d:Yr&sm=V>MAXKD%)EFZ)BDJPF,O"&sL>alEli0(qRV`/hoPl)fSfST^U2YPcDq\IgHUWHV")D1NDXEQ1T1;^Gn!:DB)Z0hr?+)D%_E1oA"=rq\(8.e!RVP<NXuBl4u:TRTs<:aMu_?@oes9j1Cf+1":kWd-o.cWOf)j
%:V$T<R;*u>KYD0UbkMae^bMg3H*f`3r&B;q@fa^MrImagjN9>8A*)eXrI.p6,lSR3M[l"[Qca8iNg+(f[RUX!Kiffmug>OlfY+)fen3$QpetjJ=:aU%-k,bsGI.ok-[3t*dq7H^bE6pM)X_fJfeMbi:dPEO`)3'p>>^m1mlR'D-h%#4$[o#;$T[pN-<U8A__R_XjF`#F8[U<AGR-K!E'b45[NN#"Zj&#*[2sAu<Wc`/g@9m*\Gn'S:
%:]"Z4r[Ui_LRd.Ka2ajgYL8jm%&_63_)g%o2ShsSc4n-1>FmU=;q>op9O`gWV6s$;_5)=%1$Voqn+>TkC)g(IXe[g3?@9kt<\phl7G%"ZL#Du,mlp^*]Nrd9kgCSK`lOCFS@b&&=C11E0B0irb=jU%"m]:3gOA=6sqhdB*?$A8f.)=f8jkl`3Gdc(Il[dA6XD9IL^OF#1p1@TcRFD>&?@(Rta')/#e.]l,:3_Do1uuH0FmWgMkP%/.
%:?,)VHmE`@m`OZO<d<0K`C`K!-*`Ehta0?,Vhk2KjmAsDkWr)eURdpF/If3I$FYN,BKQSm6gQsU>703r`YDk!E2W.-E05o4&Ek)qN9#kaF?0,^'[JXjAFqj7'dNlS&HoW7'=*nB(TiO/$qsuc13l\1B*G8eda3+5.QLjEeeod4VY0E!eaIZ0^0n04aN[si.?)bJ=EIN&7Yc\XM>plq\P??GaVReCmLLV&^0^7Ur3-M12M68`#-oBB,
%:qpRE*bB;OYg6UH9g(1Ss[6:mFZid[&[A1-Qg<&&pgu#n1;;*J3XLc0_M<E9IesV!:f>TAd=mL4M1^j3A.f8;H5#'Y3,gE8,=75%2Yb4cn*'2pi$_HX&R)WbZ+nb%p,=GMsl>G.`dK![5f%2]h?"^LH*ipkTjCctb@EhQ'3`?%e'/V]0Oo5Ji]rYC=*t.E"/aM]F]$=_i4\^$(OL5.P]e3]$n2Ng"HGe>:Zu`?Q=+:VD3`"<a'fQI%
%:J9;<3>q+qSo4q0pL5<obL7fp'&\7P;2rrR5X4DEeKlpZDlahmp?-Kn.?qR2so3LN&o&_#"HFFuj[N0dKXu,?o->Pb_dCfR=euq_X>sh`G:tCosRSmGUbo2@l2F<N*6L$5=A"m`BqRVT4+%&+Wl`'R+cIX\r0%Wk[2?hu+dF'[Bl8HU2Sju"KnK=7rgp`"uC\;;1KtUV>HaB<Wfq:JtpFncbnRgL@A[kXQ*=^:4N@S^=9Y<+3Lr<-B
%:Fd#hkqQ5Hoh(7m'Klu4o\oopXeSSJDI3eatVDfKTP.\,>cukgXlak!N\o*jWrLS/faguq7Wb^o5'`S^F\'%"pnlYoNkdoNKFkpP9?%7rYrK26YbIVjPdFEAt4,UXN_6h&7:jfnM%D(u:C0_?P=P'0U?,KdrK</j$'4"nh,i\Bf>e#)t7L;5p8_7b;YDd8*#clN6b/1_Zb.8X'>n=9EFT9J8VJpB_K9@IEiL6$_.oQgLF>[o6pjZaG
%:Ct*p3h5/r*%G)ZKI`$"0C,rqQV*2t)X4n?/Golot%?EH]--*T[#*RJg?;`!pm7GbMb1[N_;q-EHd%@*s/bW/DWf>R)d5eY0EF3i$%@AT*J?aGuEbhF11:=A6XrOKt!!R"^iC`*>0q-6LknUAPDM!Bc(NAJM0DJV_NiQZ9$>SG]+C*Ui!qV#)j(d=51%3"J>j4ik@h\NPA!Cg-(\@"!:ia5kjun0DOs]dGKu<WEE_h"nB7MKbRpg!c
%:a8Q5AO/^plj.Y9"Ae1d=3b.#"s.VJm'BWWTM9GALLcq84Zk8WHQc%VFn[NscZP#':P`3sO``tAVjk0d'gB:ugJm2I=EYX$bcb)R$U\K'9be<O(MMoKk^Nq#[4brPK50h41cS!'6fJO?Jf0hmKNjub$=0Y*l'F?)1\&/0;q7'\8#l]bB:pQr++7^LB\?b@GbWFV\=5N`Rr_bUY.G!tqO06<ar4DIuH7uE`YDRiO-+L7AW\H9*a2q$X
%:dlSt'&r_?Iq7-!@'dY3%l->W`f5]NN7^(.[?H9D(Q-?pJdO>>'O(Q3:`>4d[X+eFZAsVFW*=>Tm'Do>9hJEu".)qEA>u7=I_;YVG:is]W:lEofTkJNO/:&S8k`Q;h%3C-GD&&q\.\Z@T1KZKR$\^eJA't%?:iJO^WBL3AJ,W_)qKF:ohKsfB1P:h)\>Go7*d9o!;BQ`TO$\<22(WSD2[[.F,>^c[CP[RtfiU6,+pngP:h$;,=u&F6
%:UJP'<4;Oqo:^aFB7Y0rl;Z(/9$9HGlD(SkJr1-D]fHD712o]9'P:FYWs%lOM]*BNEGT@Qjm>8I\X0L;q)Y-i,(+WYV\dSc1)D%KCMh67NY^"M^'\rMB;q:J.;;D@+3o9pkL]5*Krr#\Ne:FTG4&Anu#E-(Z7+$g$/9/a$@0@%S+aIitTUgRi-(h;+iLn(\>c-*h`6/i'PP.nB9-e89N(YEhe[6jc6"F79PFOl?c0-Rej<Ce^q=LL]
%:Cie\9WU_9S]1p6W2)<_YGN97)N[6G5roZ)u/u&e#3f9q=OF(k-(>g'cgq?^lUu;sIVPZ-!lO\)pVI7OC;97"aL*_SAWRNS_=324Ne0q9RW.)g5^<R^dRSjeZSj!E\d.S::9_jgMhHqI>^cV`1\VcnS<=msX(inJOceH#NLn)$9YiK@*Ee_,7M'6Kr>^,6gNkuDdnd8/O6hVn@&ZeI!nf<iUUd'GGr:U2t2kO\3eIO[""sA0^)R5,8
%:$tRDL7'IgMe1t55j:sd28#E<$O8KJ@YtU./>1-gdo%G?-EUh-UaOALmLTDJ%)gOf!Z$7!dqGpTB/i.^IC"&'P,D/I$Aod<agE_!iUK$?[1gGgKUGL+k:r-;hOSeQTk/^MuV9!HG(4t(=H=E&gBiDEBg'"RK.Z9:$Zch.K>]$'P2tP3tU/3?]Y2W#W/618-VN7WG\nWPs6L1NOBb??+obYi7WN/+Cflm^fWfa7sh]d-k/M'mUY@m(r
%:]cf0*-O=HikC(F!(5esa/Wb8:\.T0!jK0V:c"ppN9Jr5uX=o_KU7c->A4F(eMBVWaA7Wsg6>l^RN2N#HHu]]PPGfd.*m<eIOnH@EQB.gHD]L]-/?$oZD36WMM`EQCZ4h8)Cdk:S,7bpoef!>(]1nF$jTRucrXmgtBa?H3Jm*JI40epBQf>#kaSKW`;nXE<[:^,<HF-,lYf0^ZLe7KqcUCpB=(PGYmE^rTp(t/kC)jd4`,>^OWD-'@
%:h='&5fl]?@@ShJ`pZ0dmkcpJqHLVQ?lV`l$h#jAFl6'm&9pTO;'Jc;.LX9+>OS,Fc+_c:b\ZIe4fpM3KRM(C;e`"SsE=3qER&OCqA?CeUL`0:(Z:+Sj[X`EF22N__?7YX*Iae:64ON$D'5]&_+.T?caT9g]Qa01[;l#KAAWFDfY31rDBGX"baAb\YdcbgA+UU9t6CP"Y;`RR7[]MDRAo!Ljr@UDFZ(RE_rB8U-Xr25u3-s].,dt^H
%:c9DK?@Pb\_V#(1on61eCNGFcGWG$T<aabM8:a8o@^Hk>66`a*/;fAKT@qU:m:pBo=aQWB$TU*XH1R0kfYbK61A@16n`.A?LH5,UcI;Hj)l]Eesd3kWZd0j9NC*TP5.&9qSTu:O-InP.CW;dmh^Rk-pf"\)=rq1ModBAYcapoS0'ND$u!$lu"gDgC)r7qQJ8n`.'9\!7(Uq`Y/>fP.C'1aUpiYB&U7C&sE6C4c@dZXk@28i/t8bOWJ
%:p`@Q/+qUd4-W?/U3eaPmMifdaCP6kT6-;]?&8I#H>Pg4=ZMG?&X-'C::.Y@1(!@?)FTT\.?("kU%*;HE@X1uV,l>$dE^S(#nh6*[Ese56;,AdOY=A)W=6@TRL@%Ogq^Y\qfKBbeC\^9Z("FZTq0kc6BLQjkgp/#BbhN!m'iK4^`H!j,$F?7a;OE(O19PH_1K*YfD:nD]q'E_jF6=dLr$V^tf4lci;rbJ6jm257WF4(L,Y-<P8\u&u
%:&>dhK7rlt"XR(EKad_jcR&PtX,2'Cc<iV:]Ubd*4mp`+3RHb?=1jrl8<$P>,K95p_D*u/%iCMdr.]='eT-/:Q>?G%o#Z@!o=(4ILHIP8R8Pgj:TXRS6F%[gTLu*(Hra(95T7N6.XcVQuF8fJ44_)dPcT/bKp&X@S=sc8E2K*Tq#^YZX4j$PMA1EPpHTNPYTk\*f/K+r(ob"4^V>EeCfiV(oqjp;EIWL/X2kmdG7jtX8<pk<"V@gtp
%:Y<OWn8#Gu=8&D<]=K+dH<r>1lKXD(c,?(R[d:]B;&ZS<,iJA_fG_/sEj/V7&E:N9u6*:"])dF@fKN6igiaUE89$GeL1UoEG4'&>CWBm5f[!DsXWKF0gG.=pM1TXLD6f:l>%>%c/A.U@nm>P$S+5p+g]h0iSjh@n-p]oo.2&`Er\9R<D;(CXDFkMe.`':IuND)4-=2j?o_C@DuV*0aTlnMV=@!QrAH6*^Kb2nD@3-luRr]LaJ]_#n/
%:p?.]C:s44*,I)YU,DP?pMo6BQ*C1Q#H3"X;#9re6#:+K;=5kuVj!3r$@rD3K^>OCU\WLp*nO1]o$_d+.EW3lWnlga[`LWEQs(hd(e]:_f"2o\pR8V.o1(s-7)U:*jl61W.*/+=&"n;g1Z.onK<%ItT7_J=tF(FS+^PMo/-WV^AdfnoXO(E(i/t?-&$7h0C`OTR)Z-j1>2<[2n)h/>JeL7@r9q63@BJjjAC;LNe.(9G^eAs.F2pqNo
%:mYhNJ`fh\uA8:?LS:>\g.i#_I+6S-Mc5PCP>p#X+R#4o4cm!+<.5=bW7/ZXN=J\JQ/[t,,o5pR(0_B6Fc@8TKAFfRUDk'$5NmNq-3'Xj:&sqkU1[RCrYQ'mB4O;^H3[S0SRjZ_)+(pLM_@1^Jn,.hua#JaPOf<6c&82#+65:Kq'QGMVQqFQ7\>)*<3\Ns-nn/4c`.D1gp,@fn2Q%8P:o`Y@R.A\b9R&-eno)HH]RlE'R&LP2@=t!t
%:3:l1f=K+ceIN+3O%B4YN,?++m38:/4<[nrk$#pc\mu;Lc_em>g(1ZGQJ&EA*r+1Zf(&F7%cLuH7`?i:Wm"Fhq$@.?33=,ua5)6K$q[dLubLHQgp(bj8M6>(FBQEFG3[P!/dnA562EJG?dFC*oLRR,M#()k*ZHP*pV?60/f#J.AC1M)6T89&h!?hdkIuN$4%h1%:JCn?Qe-bZ"fF'ne[+m^\7e0P\B[[`Qh:r7/[<`thLK0FG!-?h=
%:OXbIt/&ZnDc5`7PSqp=S-6Q9I]Ig;l3-FBlKIAgV#u9;?a408WEU$D6KF@rXrA=^$oe\Y1UN&bFaIf!<BrAcQBt5"W43^`6VWsbml.I!eU..F#>Bq!^Cmp_9;[6fPnnB85.@AL"VhWst$7B*!.;).%Hf.>;(EnN8:b*<7ifsC"F(B$83_itNM\Tt@<9T!K`26fi7GV+:Bgd19LoPS(B6MZG5Pu7/^3ZNlA`aKdPjW!P='j>>[<`@3
%:.WFgK2R9TZVVFQ9=QL;n?#+8:]X:V_EU)ZfKW:06oCEPu^,n[3BR4Bh/#TGHdr:",chG,!V5('Mp$5(Q(#@V:25@3eB\MdPE@Q;*ca^%2ZsVC-4&/PlJf0IE$-p89QtCYc'\(RA&u(G)1In<Cbs?IN:KXXTQg569T9u'r"u/@!_9riD,NeS&=DEY[3Z*kjeaHqGJm":V@ON6:je-eSiC(jH=B]_I-UqBB@R5])\qlaH<7KF=?iOoU
%:WT&[VqOcSGVVm3^L^kNPeGGj]](d82Gt0)?C+>Me@\t'N8+`e'=JeREf%X[Hh1i50)OY@*N9IHg,=KO_3EHbTLE?1$(M't1/o$#Man$(WP4H1-k#A*2&EER>6I[E^ck`MkrM2b/:0iJ8oL2F_H&Cg9o@*nLNTfDT&8I#hC79b<%sLkK@).ljF#Y5WkP:2OhDkL-7>,J:NoObq5`U+KHG%&`fTuk@,?')p`c6b>KW%aEb<Pe-a$LtV
%:1!>TG,?#'8j*FqL@C_>j[m*>Us7ZX2lKNhd3?@A6,>eYYVSn'i2R`odloe4'%I%YV<t^qdru<Bk[DfF4lZ(pVk?)>P.<DHUm-&1$o6a9Xo4=2Gg:B>bV;@oB>"M_:F`kBrMPo;IA'*ZKQN*%,31+atAgmAos2Q4#Yf>FoQp)2h)fY7p5i>of*0Pr)2VC(BIPq8>3of.a=OH(?38e"oDmMmj69W2$^5KcR+c+M8]o.DTdh2,lf_aAp
%:%Kn'E6U],@nB^QYLf+)MX*H@I5t(V\pj^X+&cM!(hN`5>XO^XXd,2/;,1l76^]"cgSL"Egr>q*3o]d[4j0AFa,!RJ@JFcr4\cjK:;b(j>feWg5C1M'q0VYQUTpo+=[Z75gQI.d!Bj34>.a%-SpLaCijGRiugZqLbdKTtl?;P3$fJ^[\/s1skg`Q-24eUi0HZ,.Kb@uW:gkL*h]g-ha=aJQQ7>1-lQeho,m6Z'd*te"[(kfr;T4fXX
%:8&5'8#hQ-i.h$Cr)@'>S+s=9,%N_)Js/UKcE:aQFU"<Zl]Trm(/KJeLpL*b8i\G;cqRQl#YMYVYDTH.JheK@nCe#`0dL_e>fV7iBqM=WHCQ;*Eq?.D*/&><,3W7,G_Y(I4k4ia_q#-2>1XUo`Br/b"o!A,r@7,7.,H&]<NNg-"R%n'H^C\u]-?&4BT+DdK'6E#I7]H:&f+9a'SVjY"%e*ICYHZf"*%96FNZ&'Y2_kkOe"2sPl!Fq<
%:;_.S$i+KckX%&tVP&RYs8!p?M>;!e@]*c\6[6)7fe\Ks[pCXk0R1_<`q'j0m5)#UIRAp6T<4rAu)<X-+6A46$VC$R3@S[X7FF+S(jtciCELC,leho1.h3>UUY%u$`Ir=7'2r-ToDF.H0qHf88DM)mNmZH.r`tOVOh\^TuR>V.P,*\IoVqF$@9J>.$US,9rL>]k9j6"E^T<U@pphtE!k]qRW%Rb1JP\9Q-KY@C34O\Z:_"lYUe@NrQ
%:bg]4a?CmaCVh.F6W73p@7Dio?'>bhTK]dJ"K`C]K]K]YUn7Qr5.dmuH&74c.]EeIknC8&7R&MMb&_;@:]G6sj)[EYm"m,Dr1CfqR5tfP@J^ZE>R&NT433]@^?>:1=O&p*:f^jq[1?J$/#;5hh8&6*<kkH&(b57eh#lEU*I:(n>%clMK@]"&96$T5tn5f&4:k\"Rj[7n#77='HoSVl#M"m2u_rgt)&T(:#<1[ToE:@j#GRgXJ$T&l.
%:^TgYq135to>t^X4P>459:A)<scEFC1N_WK,8_6umYA:'%9]q,d-MaRPf]_\'%>\\eAr_J3jjb%W;[++ZVYbF&XOnn\_L6Si<Esb+*g)$[\%6PYkUI=^^*;+OhqI'T8I!tRf1&lQ?mXrPd8s9Xr&C3Q_P]_tqYuHU$*>pd``[fH-;c/[DVVm_Yd'g1<aeK<paZcZ$o+[VZ9,q4&&;ub8(/O=.T<<P&5iE5B$Y.NLq;t.gCT]#.aD]P
%:<<q@W7]AS5Cig\#W]hb-g$k#\W_;G;)m^7FQ\;U>2hW5.moDmpI;`uRa6+"72$WLCW.+&BcW%:i31.&\mPk/6=QWf2r+nL4$Z-&)CK`AZ[%PnVJe@P'Fj)n3N/0MjG["$E16,\7=\Yh_XM?ASXD0o-f6sT5c*bD)@TR]Caum1pF<;IfOtL"+<75pN<+M?c]YPEK1ZfZEUs3D:U"H"%<Ii/Eg#gA?p'MukcbOW+m?]''2e=m>T`C^h
%:e^"=0kI$[@XY1mQe5BaA\LmKl_2[-EkkHA4G)R*a[(F::fV],4"pEso$V?2C\fQ]\c*B&uNP)A:%LDro`\+9R.GJD>]/1#HATW:0(1B/o9\"HJK2*6@p95tU8r#+V&2TUK(F%H0NTgd64c>,o&CcXV.hV=+C<WWbOTbPLM9FD`S*j4MreBms<ml,'rP(2@hlTp@7/hQDAgk+OH7U+7rpf-le383:gtj!Q1/=%gkQ,dDVQPqId[o,t
%:A5!i;<QII*r=O!+`.E$?],9Kg7[2nXC;tCoJS%:Zq\%kr4lEX7B7tL*>`"m64UU0(*l(4(]WIa&EH(e"\>k[j#]_N*(L.[pSVr-8dEQ8a0#.)cT3ME"K>J0P9i5@c9lm!tTDt-R>T\dC.m0E=%A+j8X:M1^:Sb8a2NVDu*QF5p\pCqW]&pTL\kdE2FLCmYOa;PVPYb(GPIdmp\^;RL9"I\<qrmkpQhllfd4"9Tl)4-L3gG#<C/d.e
%:N9,lAaV,]H+m.Yt0LKhV'3fV!M+Ifo;,Hu?^CZUW`/&S$GT\?qKV7[$IYe^q2o9J&6c?pH<FVghVX$e?IFtN]WS^c#qT9#pWKFZdq\.BO]#%cC]7SoPe"r.)4^O,8C"m'_Y=6[f^9fuoI;=m8S>tm_`!"kNI8)adT?FGt`.E$^9p\E^#+-W6Hh<-)HOgU$'\%fi?Qo:5k!l_-=W>C'FQ74DQZ0Uu4RDOm_=?EK_Yu)piW,j-??:!K
%:B-FjH%efe6`pkR+@;gsiEik(0)gg5<Ogilg"ilZ'JI-(%C2a67-*G)f"m]L6nL!"YErQNf2g3#jjr`W.[o\r)Ls+!c?g.b3F3$Vl+dI.VEt4nE<auWuRWcQCg,O5L$-\L?kVrsTn".N%2)<]p+(D;!+XlQ[%]?(9?RYOD;]VdLBg:uHj7Ke+PuplCo2ju%AtMunRXnDDq"eLu7r^MR'9;VC%cGjLMi_FD<U4"^\s/!?C1M)*f%^WF
%:/t@%]'][`be-0KTS6[/q(&\&<S4r?'.(crqiDcXp(a!o=-a1Q=Z(NFk\:AmfJkC%#DOdl<JuP8K3-B0_-:D+ZC%u.h+YH^n_7CdZrJ.]XolS)Rs+VlsF$J%TS"%o92?d\@[V5->)/&2kfF7QeG+Q\+^ei[_Of8HV3'1/mSW*8?9:U/#SQ@d#)0$t?@/n=kS/nmUp4eq`Y<Ic3;Ao08d^O/ShS%*3l\RUmY<2(e"<al$*nVE@ibtl&
%:hH$an3--VkG%q`@pmY^AQ[YtLF.-$_q&iH*fkSH2o>(,_k7Euo$?h/kWD;2e(8G<97UBN`_2(0s%-,mZ<1@3MgRa,h$8)><NZ;IW/.cfr%Uf3(l=LR-6Cr8B<;nbFft3,^UC%09HcHY0VZ0hW4($p)m4bF"jPe;nB42`GLH]8cC^i*t;g.3FZOGJ9fOHr$<q2$jp=+ERN3<ChTA#)/07b*aW^G)DG@r:>eL7A9NuHAbCbS@SgC4Ze
%:oh?+<I^'3fC1Jf/,%:f(c7?E$,@^E('%H]V2\B7.%bpsL&0",k).GnbJ";-HY2)b@a=<]_7%L#>?/L]!Fl%[4N=J&17Ag;V>\;8'Tc7^iq4fq4f@GrDSDVC5kOU95qhE.1mf#^16f):;ME(Y8?a*V,T^6Q/iI$EXV0MHQ`2@XVfZmtWiX^6b?&8[CUQZkA,*d#1Z\Vu?g)LROGDP-qN@5P4[[qj*6I8EYWKF1#qf,Ip)0TcU-pt=8
%:'k0$Q'\@u>N8qWF`.d!#Jf;,&""s:3MK)9Zi54qgPaEnT-b/s59oN!q;mUZ*_HS$8:5qrpMf185It;SHY,']-<`$5ihSt8gG;*pt5[9[@8r3^_pXLTqf_*l:%Fb\hq#1r$<63ft:n<hWO)\oFC3=B`46qZAC1Jf/0[@Z3`]+.>"sL\upZC5E[hS?q3apg3F,9:r'lqO1iS+A&p>o\[i%J.D5FKiMG0f@1gth5!HSQE-6e[Y_S=u^4
%:*1*'4a6LY^F!JF76)q%+cag<cH#C!9ZiZSA*FOV2BC)+$O`8t'*-jbUdC3)M42=V-qnY+4i>8A'm6nhT?*GiRDl`SiK:O/$P\mh_82tS+*1<fj#RTJE@&la_fai@e,RkJU2)7&"-B]-,KY8:LKl^rJdB35K<NrJBP+FZf<N.('B80gLb7ONkqGkZ]*"-N:X`6o*)J"k%SYkl'G5VL&eB$.i9I+cOa#F8&Ckngo1O33m]of[qc/up^
%:!c7O)8D8Is[Y@m\G!FD&&Gn@>7g$.*8RFFhV*a%iRMSMZqI?$6R@:hrQi<S:EGB$!eRDdp^DGoEh"hBkL2I`jD1cKn"m4)IGIS\,-J)+(6.n897=p8!<\Vc/QQCP!<7Z4tno##MX&!`7\2N[^ELFAb?8o]f)]e!?_*lS.9h]RP[gMJs7jIi5)_aXa`<jB<,0b8?3=<nmV(pE8=.1@4BC_1nliQNbS5AkiIC#dQYOLp68A-u'8P$nY
%:'0=)Wm:.eC0Z9LH%gSm??42)`Zc4/r!Y'IPD:/*n;B,T9qZK]jC6pBST^8QJ6`SIYF(B%/H)*=n%!Dt!)bAulDt"+'2aH*8SZp;NJ[Dtp!CP)\q^[f;-k5lbj:sSH:ZrP>JXm^IU*b:lo[g<GE;D8aI5d1c$1u3.cGs<OQbKaAiWqV5bZ(Y%8.D[.4#I@[I'5+mbq3QrgF$4iK7'R#Ac'+TdQXQBlO=XK)Hj#WS>o>&Ui!&hSXT_s
%:nHs_j"R.MK>BG8H"/OO^L[i2,88k(%3Ta;[h2pLd+i^RFWVZ6Y2tuDNY=@B.OWPe?Xaac[7]*g2On*N"C_^2:'<1$Co*VPaOP9F3Cr7YG36,OA+Vp=@(VqrJDd+[Yq[b4ESB?9oNDFm:#lCBW8/W9G3A*,N:Y&5pk'T\0<T(eU^SsfMk>m.dZl80jDSln%c8]V\LQ(8Yc&nt*qS(CSrGYSPE#3&0E4MR%3tiJnG/3(SHh=SUGMr<)
%:'ZdOMATrG>1)&jQ;iOJi5!W_c(3XF,eANDpOBHVL*17/DNiXD]@%nPCAUikXZ;2Mi`RP?XI5d7eUG%_hn.f4l[R*`7OJ3^N[98Q\RD6XGNInH_nL:ca`g\3NWrF6JqmV0jJmTNfp35<8A09\Afs<kq^!e$5s.G,eMc:0@;irpiboE./Y(<Z//oXW3mtTjrAG,=ZFe]9I2?)3'OD4#mNgr_9cc(<$(Cgdq3(.8P_jK00*1=,@Y/H!`
%:?oMIP1A?I<c4C@u_LW0;(tm>n%cuqZ6&k]so7UI0+[%Rt%b9hg6gk:@/i,F]e[ZN<UFYNIWk)o7)k38V7_VqanQ]A\du3M9;!cEE3X*U^Q>8mDVgFN?O<:??R*u=dYDV6LFWL;Vg0qi_T-2I"[chCIR!Ka_IWO^n3tf)LgYd&92KCnV$#1[?%*Q'Q_8LX%Ok]J+9X9LDmYV1"Re1D9E]<c%dPoL6Hh.t!G8lRtM8`.OWJ;J)4A^I(
%:MOFB2,NS.I_kc5QaD!o+q6\#G:%\?TAP@FI$fm8f=(8%edasaR^5n+c'\&pmo9#TlV\I`B,Q!NMZ)u--A!,g1M+O&C,H%4U-LX]"DTs4rFmb:&%];!@aUPdN)e0L<e+6flo*W78KY5]0R'cenntssU`7-B[lh[YQjfn=]j@P=bZ%<F*%r@!<1j[HEh,C0\oKZ`S2]S?XO;C;<XeN(8q>J%eS_me@jS]Au?0Hj<(,;1iLs,F:L[LZa
%:\o*8MCNoK`P&;Unh;#qamKo<Pb5gW!NeSF//NUUf69`)&h$f^_0aIMiVSQ-Gmls):0^8k?<1j/?r*A.:\EH*:%o6585u!@XKu1*39$oL*KmURGlHj,Wkq?MOgB\LbhaVNOjHupK@45mC*L##%W(DR+;#'I%F(B%'HkbjM@?Q3g8LWrK?!ELW+$n5QNMZQ<MS_"Z+NG\VPiUZmNCPoP3n@t3T,)go<71p1I?O`QlMH^1Gnj6d^UpZr
%:ELH[Lep/,*pQWji([Ktq7"6h)cJ>+cpq/Q0:i+PDZnj>\3*V90dVsJZMT@0*:P[o7jp%?%0>ut56fC#Q#K<`.B$1-+MH73?A*]"#I`hnT-SnWld<Ir;bmd->S"XeI-NljiT"qmO.ho[8-Re0@M(!b9&*Jan'MU4"e97`d(hoXP.\a.^4Jp\f7,b(jE,KBBK)GkcLF_Vg\.:E8MPk+PUip]4`(\G&U9O&5E)IoZO(Y3&nHbXq"9E"L
%:FDcC)"l;Uk2mV49OS'K]r@XaNI9TASd%g(\IaE2:_iH5:]o/l>$nX$cK;n<fLnaLjLJL"Hg^chT`k_E5;(*o/&*NN(;04sgeL3P:@VHXK>+S73g?ij</4T0-o^u?bUEKr.@KX[GVC5b*"\p"Y\D2np\'FHRTpWh03SfipHsI7CVZ(H&:JC(rrH3a7_f]I2G.L7+B:YN0QHi^d>P*!kX:u`AHt]LJ;J"mXd*?=NCNHl7[5YLCJ?hh+
%:Bch)^C1$0Sl`08sl$Tlnr/C/3:,RgYY3m=&bOapf2iiDemk)oj0P@6N/^_hPm.9,G5f<3N\fal4F:33&8@-me&gnhNq`I#C^D@9DY+`ms4\VII2V43`8'tkL\h:7lY)?jsK3?g&XD8ag>o2jf6h.+C=?'n-/slV)%D%9r[B@\)XD=c9lO)3c-0tE!WNMHNU+j=k(=r=&7A54G6.aXfXm6l5lhZUBlWVk^*UDG17+_7fqb]=i,&*/B
%:)1n0#;q#4J)g%q>8nbN]H=2qjFknJ3\s[^>Q?@%WU2/\nE[V85K_]$o..1@?%D'tVWYOj2c,.&@-gS@7FksmF[PuTVrn*ejrd?5I.TO:G/]1;)28/%a:q'--9"/-97JFL@TA((=@NE%NXL5W6Z('q(O7!8L;7A!'ABnBMr&tL8ZWHj45C<!c/t#1T9f)<Oan`2$2J`DGk;:5!RmACXR-R?\qD;?UY*>8(q>NV76!;eFehrV5q]O&5
%:FYhE&Gl9%:?h;lOg:mrS<IX*?\fS.l?0R*G7<LaEl["e<4iY'.2q<%q(_.A:?thVc**JR&#$o3h#4'O;-S2?7N3)>:f(BaC3l=A;`TKJ)@<X(MRI_2S2#Z>A]$cR1/(QT'_Rc>$FZmpZSmu'j#r-_<NeBh[2ri!=[TL2e)+V<OW==73Wcc!g@9kP-\mAiO'3J>I.;@:SEW8]P]ep+ST5VcTm2\mkX(e'_J1aH<>^'?fY=k[2Bs;33
%:o6[E[,=8J!Qc*(.gCu)!O+)2MoV:QsWB[I.mEnVL6ZSE]k]\NTGt[Q>8]JKM%-b,OPJ0q-QujYI-0`m$L<i!JL1;Z:
%:s8Tk7ZDm"UA*A?gHL#Tr&SjOrd_/&,f(lk^fD2M?:04)=VH1jC7^k5f%m=$VFV8[/C;:6H(L#1fl%o!qAr]Q!hrRg'C+QcF3l;;I=h9)sP;EJo1.MqGUWrk+N@("]:(B0<oVtn19#kdG6[tC2rDbcJRZ<-.M:_FA`Ri&TF0"/06VUB3oR(.m2UhjE6cIKj:_QeGH<k`K%DBc9r^Q%_<[t(*%bBGa9gtoL&$%VYQA&&G.@YQd4]7u5
%:R&IX7HBOH2)E=ZrIDc;;J-BR\iS8eE-8i$<Y('T^Y4jKKlWmXpHJ&Xr/[W(oX=P(t=]tU"W?g$WS:>84:ifU7$Ve5eAV.,Ik=8RTqqi1??2cOhN]rEI\j'c^Bc,%Z]#U,Kcf1CdUAIM0J#5o$l4=p2'@T!JZ0lhlT=TfhB=]qIhU)8G2:+S+WG3QJAobNA\Z,j[+]`'[f@[;+e$7TE]]!)%/Y+2)mJD"dg,a'r1#>MqJ&?C^BJJ;j
%:%4+G=oCX#&o;0!%o.*d-Jq$:XTl=f+ScGY3O@k@%F$6o_XB0JVNFb!!lXe>_"$Kb-E`HC3K[qlg`N6TV.[l8u6?<ecI9"N@4Ztl?R.M,h_4!E^AO'UZ)(TPCl`9r]+80V*"*E&X1;MdWelS19G["DX8U>eb4Uk?:Q5Dd48Q7h;,B.KoU`CIdNe1GVoQR1V:n^c.#4Nf`W2rh>&h>lVfA*)JQ>!R)[q]+!XW"KL[:Ha]ZWgL;h9<n-
%:F3BX$D<JS7JSJ^g[`'r.8<!tAGW6^q1-p)A<[;:6'q4&rDUG3[<pWjM$bKD?G,r@D<WdN'0'20j:+fcBX7Sa<Q9^h2d!alF=.(g2Ko5TZ`/C"UTYu`+/2JPae?rgSje>]2M"f8t?*1":aB%XS[=BfRdA`JIYc_oim5r"qKt\MVPgkRi],@!36-AWP0LIH]6m_$oaHXL9qOU7']I[d=Z;KqL;P>c+\,1\^P5,^P0D%TRa4*sS$"cAC
%:eFLnt_YIu\OlGT$`9+1AI4M@AMoJCle1LL.m<\VH413*$qR5`+4hRq@CXL`==^3`s\r0_50eH$q57kpa<sc>OmeMn!>+!bDa]Ui<U&V;el1Ve][;b8L?K"4p4*%BZ'#3QEh7oc->0h!Q>M(P'C[cZH)EbQAU[Q9A4Z.5;g7_I[IQVEp$4?4'NKe-=\,`A]7S94Bb`?LhP^Z&gJ#`^o\!DkM5ohnHOgtbGeOFS&!.l3*6ZW0O)`ZE+
%:OXfS,I&+-JK:p#L8:FAE6-#Q@AJgDb,3hKPhH!J.Au*XE=5qhj'X'Bu?6_\?Y`\M>kOnKCGrDr9)bD8BNQ$p;%/P1*6!PX@:lJZ+lruAgJP@m=\Y/,+`Q/5!^"LI1A'VEC$SM@-j:(nY!Yr>i2JhH+RuNMWB/g[8hN!hoVmo-DeAG*,57Ae^,I,T,dku\_\Z45ie@3nVW:-a)b\-.[@X%L;OKIZs%\Hq4g"e5rp1JFCVMAhJXBc/b
%:k^0UYeBKRL/Kq?`'94*f_@=ZO3E'(m2uI@-`4SZsLVB4kNrE=42gm?-7D?SN`TDQnbGgse]p3a+qp>Amgm?$X:;8QR3aZl1CTWU%>1hI.ZE[c[-dP*Tajeh6%MWD%k)2R(2DIbUf,A6L$D!QL>SpY%;k>*l02<3]Vk[TDjmDg#[/:F[s8ELuIVk.1:MH$p;7HN]XRH88EZM4!YLU0NXP0db(3XJlm+-./XV'pN"*:qV_d$>L):Z:_
%:1DIEY=imr@RM,iFD3,b#.GSsO)8g@&G,D]`rcu"YVP[/8,pJUIq@R&-9,a@T>okKcCMo-;C:D2bfWEQ,>@ZbNj>_=@?;#&b>C;0I0'CO>Q=:W#]bUuKS3-(+8qRTFHpRkI?2b8&kuEM\GA48b;/:oJOXK'L3<RA,;rE%P'Tt-<j]'RX,,NQ!E5"Xdc+b?1C2I]YN=H`'VDb>N/X>@qNCP,1l_kH2B&n3;2H'1.IE+jNX\C/T+\d7n
%:l4&Z6kdcc.B;PW4c^C>?j94.,#<%b5M5ZE(3kh1O>U'G$7S[5GN/a@m["s["`RGpX^+gHbos^9(jOE2jAE7:2ZuD[2a(N7[Qg&L+UeC_3qN/P6E*5(/.AOW?'"S"0TgZ'^KT+[d(IP9=l3u7)eD'79lMKmW8-?I!6qs4D/;s@`Bm_m=Dg47j]Na-YdoboRe)`eM_e`f]QWjcNDUbY+AhZ>.W7=\m+/aZ2e=)LUK7).ml+7kh.=a88
%:Df(6G44c+VR5.--=maCS@nUEgTd=4"]hO,]BX1ZGK_gucUpFT=4BO,IhG\ogE]pgsN.od.P*o[8qq7LhaM(>-`g!MB'e4Mu%Kp?pJeBRHZcqpH$OUgQG0ALSDY_@kc&piQA%+([]B+:id"cImCe=UumbW+eUI'gOCI+A]TYu`+/2JPie7EQiZ0_;X*h)\O7XdOn'[0&:kSI@/gP[WLp-RI"`N5>"^I1lR2-Lo1,*u#L'T^F.m![?$
%:)oN3`'4rYIl:c=^MV+:2jsVY@78l43)4'+cPh,)Oog/Gf[)neHPPV+lNnWt6US4Am)S3ec%:*OR6W_EbY*KOq7Sfcm[<KbKoN_5%2UhjE6dJR-Ops97`DEhH0[p5*L9AoWB1$UDTkhaio33.!XkL"=(,fu]CtL(CR!pi,pSZCk$-jKh&=k<VQd9MfDYbES%7Q7H,MQPRFc08c8hCO2[Q:k>\o-P[T[dsnASIO#\htn9Y=lK2c3";;
%:Ec*g%ECLSj"hK+iL9Kk@]iFAn*UOWmIAa1DDHZ]U=SKF=koSSDM8_><7JE!m7l"Y-<6H,6@-O$BfBL'#n'LON#B9S$&$Bbu,U^gJMt^A^4$Qm#Sc,iU#=R<<+3*$^^brYr89"2c_;3)5&)X6;HMe<0`TEMaiDqOWjF>>OJ%IOsOCaL4-EC0sLkU=r'].p!</bo4Q_l+N/SDXO'skiTW<oR3KpR7kI]raDrik6b>l*/NCPphFd<d.B
%:ie10[7bc%[(\M\BUO"<8nR*$Qr%U!VZMqAJ06d"dIk[]X4Cb4*PFZ**ksp5$U2F["kte?M5Iual!)ss2B1fY9p"%1Kj*8;G?6#U7c^aNTlbPV4kDXZ]EpLA4#AUHi7@is*72O#:%fQl_+j&&q9(@\'-of@V!1lpR%4Tpn'XM(M;"1"bB'ha8JmE$.qa4ug:I$):2e5r2HE0d%0pjhs.uGep;LMf#U1m"9:I:1j2J*n;p<h[%1ijf:
%:Mu$(Im9-0;4\Ll"99MG2B$]V,HT![B^0':Q,`K7:#R(t!KJ>8EeNeT"@a+HQ62kefi-qalo&G$(b.U5V'WbI=p[13nW-/sEPoc[(i[C[]5=OOT/o[H@J\oC.iGOIpoIO"7B%<Ja=P0s%fs=B*ZRkgoceL>Nb+Bi,idE47j2oWgDtR525@\h3jHYC,7e1!K4W/qkofb`LQpsp$-d>-[R-u_W*PDH2??eC,rHRD$ChKbm!Xb7?Ve0"[
%:V[o<b:bX('dg^;bT&o0WXkL+/$[\0eHWD89<lglW2>:q`Pi%VTmgBu[[Ld^!X0_Z68&u/:&^rt$7rHm3\8BJWmZc1PRMJ+*\\GP)>GWLa%B+qoF6=ZacsWaMrI`s6(5lnm/gBb)%]1-'1-I/=;qDj\ep9NTEN9jlrg1]t?'RSMR6@$Pmb+tJ8!+I3(e2.r)*&'GZMM1LOAdA<e'c[,dsEsL%31DpA)@R7eW*P@eJ>=[_2@S-@L/`&
%:?b!a0JXd$21Gru*EX)cbKg('SF)Nd<%<7f-rMmVEeXl_O@F)+"T)C9gG(VsL2ttPhn7#p0faB%ET0u`R$W_c#3Fpf(_tDMKA?CiClaX-[q<(F;\P0MiXGT6X-2A?f-FLnDqtH41Vu]gsgE=+8+MBE[&m7Z>E&#:BH?N4_SW[#YcDUunU?1aMm+J#:B7I1!!Toua,bIJ:Y83qJN5$/QZTR'&-=_(;O:aMY/p@LD,N4'\r'YICB8M<3
%:X[-#4e>F7WNXUbj#@$mjHEJ3aFs3mA7&F/[5\@(OE.2s?)3LMXC5C(*m%43j<I71;!\EWi"51"NZ=f6OZTrTXHqrNc_560Gif,B8fN)4Tn*@?G=q`RIg[#4R(.H%5qAp?(Eg(N=mr)(e<=s<K=$XTs=.%IC2$tG>_l6,Qb7o_5KQ#-?'TJ[h?UJ(qB2A.VimWe.)0KOne?`enB82IKlh/TWZh`aTbrKtS"m+sSLC.?lK)D\O@V>,5
%:Tt]EoTuc,2++E\>,<sBWIX/>`^GJ8RF/QH:_5P+'GOR3F(Uh6:q(q6jP%QaS<!sC8ahcd+G>U>=%K$WSR@_+Ae+6epl^84TAR!S=)S7e/)C(6Ld2L/qNK-.01A>VQr"dA'WtqZej8&r#9<Z7Q]P*8:`Mo4D(QQ/qhO*KR*-ict$HiC^HcUPZ#4nGZ6!hW(ptKXS^1Y*Ok!`u\cu'Trl1LhIs88V0AU.lt@oL[Q4aYAhSjE(ON,l#)
%:]^/c)p5En?Wr#*[>PfT<01Qkaj&4qZlHI7!Rtf]18amh9*P$XUn@uF6\J;Vo(m+6WhUkMoGn$d1gudu8=R?<5+7X]M"2:I@J'.f?h04WU;1)ejb3jUDYG$gr+CLs'l%gaD-r$oh!?s*Y+bbq5$Uos$OWG'1H7J/BTblqo&HMo0W[QsjkM4n:]mJl8I%O46\_lsshoq[_h6Z9-1NR/OG4l!Ws0W]aVVHfqr`@B;W$P`<ZdM:dRte3q
%:=XfmtlPI#ne[!'FB4fH/DuLeJI#l*u)]n$1K8Rn+ptn9PiV;jrIa<B]rbX_DF=N-b+)b`<`.hK8pr=GCE/<(9+0Z"aB5YKs<MI`pD2RApmI)`KD?>hL>RN^nYFLkZ/%@EKhF5Xk7@gbWH9&#WSC+\Fa)X)spaI3:[0JV6=c5XWBpq87ebRPQ392t0'DCVJ;!TZ+Cg$iE(OX5s8M>kZi:]Q49GpW!`HT.o-2olK]8;?`[DJWp^A/Pf
%:k@;r3m5QqJ.4/3Hs2nJE[@0a0p.Q'><aFmiL<eJY_V%mEB+n4pi4u1lA:5KMc(GV2>7/jI=ZFcq$IR"R3"Yip-N:)TIsc)Vk0.)shZ-@HZmtd1Ru,8c4L+qU6l&K<<Z;;;(W0ceQ23cGKgsd9SH&1P_GsC>(6.q?<^0KSPJ,P>q[.#%l(52dP/$"OprVen23kn/O\2!iU^''>l`5t@r+U'tm41XV!dX:AK2Q:2HAYVCl4ZdhK]C_W
%:3_EsHLY\>U>$"QN>'op77;G[rWCYLABlgJ&T>@#:d05HW01R#5H9q)(Y..J76KpOggE[DW^IUR1KZt4m=.3O]h,[A[p(GgFN"hTPi7s!6Fo7%oPTHjb-lp3I3Ut%W[rn:"]D#S'GtKZPSYfPoC429CO,8p^a7fMBg48>)aM^TV[dp"nLZ0>#c]6m)='oM<nF3aZ#J]:kFGB^!$7AKl'0K.'K]&gBdR+;@HQ&eWqBL+1Rt>)E\ZIK_
%:6&_=LFK\E%Mij$c2!&<]k;qHS%X^)Xk9d"t`(M%bML/r](3gno4R%.Jo<RNgcb#bZ<DU$4>#)2oel6#I9U+^64'5GSA[.'/F!e;gm%YZ1Onlhrg-fIp5+oRW69[Zkp$Y*6he#3U:%^QA\aBPOe.1OAmPZ/+k;<D+"4A3Hkj@ikd-o#o3-dQA7D@YQ^qPG6n`f*NE3rtr,L)qpea?gPI\@3@QFMbr*i$[ZWa*>8Ik<q$ZI=D6Q;?e(
%:f!H)pX^%<s=,WHJeiI#PFLKm1>L[YtCPB<L<I<D6<#qaJ>L$r[A7FfJfXLkoHG?L2Ng(PqUfm?C2r00Y""/"iNMEbZ=Z!]`0q=[SJoMM1i)G=j7f(4?>%PG%;Ji<iQ?'N7b%5p.cEUVtP^W2!G&hC.5'i!-d]-O:CC[HIeXa(XC0Bq-`9b7AZYt7$c<Yis*C1E%4bpMO:Z]#'7[G-O%/QQX#t=JdYZ9b?:3Q*odWY(V`--W'SN+!#
%:\,4oXl85oHfUZVHk]Z,h*m*gn=eh'!J'Ep'$LWB`ftA;kO[VQsas+H>Tc#0.iocI"pML*qU549dJ;gn:&F>3($7kuR)+PL4d>?n-?(0g17Efa)S`;oNZ)[L4NaloG]2Oqc`XVtI,@p-O1F%f%Sl8'g64mes7TS!%Li>`oD-;CjDt4M!LiTU^:E\tp&&K@7M9,ErR`GLu9OrXDaS5?SncL$jcAkF&BW/.9)h`%"$"an!mRk>sI#p;N
%:La.djhZ@>;r>.d?O[Yu6=%-Xd-ap*b^T08,",iPKO*.n4T?hU\#74W)G&0a6(3Xs]136B&6FQdTJg=n+gtmu(8?R.B,mLu'.2ht]]DndcL$B6*m_2Rkgso3>m`A4I+'K1XiTUVh7'ZWKr?<0ILh(Rdrpr$TmA@Ump/=1TIFM\?B*f"n=Aaj3gbCW*.Jr=!*Tb51^W9ZfbQJ\9G6'aK6$`tVXNmRpE0_Mg;Sr[oY(ZS/37r1Wnm#3^
%:-K76p`35j=/\chG*VU,0OG<OC6P2.u)WFrJ*#91[?7tP>"V%D^fNUiWeE\?t^.31Q/umg`]'K%^ejJctG%-@7@9ba)VmlMod_Yp$,qVf'.pU`t:a:Xqflh2ZTFj%'Q&d/=c9GoO;97#hLjNd&)+CnZ%C)Hn,/b(a.#DtY8n\u:O]!r(Vo8EUTSGR7.%+SB,lFk.Ld,q`-=j_Y9HT5']")DedHG8^C1e.;Lea2]UL4lj-1l_i?*2<N
%:81Bt&;t?>_8u;k??^iJ^I4PTmS(>H0D"mGY&W$CZQ5L-/bcSE"Z9p!3VR\N01i'is.@I>;o!oecHm+`u[A1YYRW[J@p_bRnk(mhtNZ-R,-?QQj="\?6C3YZdmPB!tcPF-Z=6GCqWJS*Do$ESVC'a1cLP2lBSfm/<rW#(_XbM@b:D&rL"T_[D+?k$2!Z'$GS2R!\"[pm1bb5p\Qr/CdKh^gYd>3XS3NmPA[\XSBE%V30N'PVL7okYq
%:(D(h=-t<*eo3cF^Tf%XOm1t;ffSl3cD^5$_DoB#[.&.-dD]D8@GYNiCr=Z_\<^[(=WB=e0=O%Z7nKq`-1da\-B8Dt)!g*R64]e5c7t*t?;?nFebrEYC=bt.eXUs6Vk"/N>jHPjao6_(2hb6B'N#*)jIhZlQa,-`l95,UqI30^%T0u)5q\&G^F83HnNjM9mLKtM^VudT(d6o?tg*%@D;'XTtl;[FLokW)RU/C13X5q^93C]cSI^uhH
%:/F0/cE#bhCDJ`!mWo#l0/f)UWXr<udI]<eUVjC?37Cij[d;/?MC)TO>HgP'?@\1YDpQ9r<(ei"uNq8_a+qq7qI!TkpGC7YoeBrH8A@Y?3nm)i+Z9kI"V,60NXqF@j>n=VLdFY^a>TZGYo0!<lZJD;PDF8l.?=jmKYJ&"^pcP8jO[YDu0-[HP`JdQ.X`8'`eeKoDCN[):lYJut>Pi8Ra\t3ojDA'TYt\"M8h#Ud/>DZpBS\Er@".f=
%:qLD"X-q&M(,.jQhd>=ub0$VtE,%g.fSZU._FgjflU,S3N/[eW&A!WDnj-l(scF]H7'+-&-Zp^/54@D3('.#lS1aUn6R$+R4-/3Q7FpKB!c'40X1L#fR6FQd$Bnqi.qlUf*1ps\!oo=)]-VA'_,2-9Z.%oa-:Pile>>VP.V^,<@,YfaJA>UVmfgb$K<e(LQ..lhVgcJjcaq7c5I[,tM9^"l9JkK%JVhccne1!u;.7k:I%f[IorJ#&0
%:fdS!M-$C]$FLd=2)m:I.&VZC-T8RBq,?!/&gApb!Fg\eHrB]8=`iCQR2\M@uUDc!iLiNpHdq'X"W#7EB/D;6IcZ3`/W=Mq'AM%+62OB8#o2MI6KBC#gc`8cT&+jJSHq^+f)Q,*4fIm_EZ>5"agQgdQ,.6`Ch6-XoXp;nJ%INLCip/^sY#tq'hKouM/q.5A=1a_3e9pq^ROPsGetj7#<!Uk6kj(`L+8r/9DQfi%-[N_j`cDVh@tS[K
%:lPm"h7pRJgYH,)nVk;+70M28a/4ZTk79O7`T$fWoO#,387h>9oqM72-1iq+]S]Nil5_(faI/:^5>a'kXT8]RE:!MlYNciXDmJ_/=g\nd&pBtGSGP)cWqbefR5G!D<N-ttN7(.GU@Mk74V3oZ04T&qE&!u?\k43K1V0TUT`4Z#Fo5[RYUEh:bea)K&.M$e_?9Dm:/f?n#HSk:gAL$.(A)s12NBj"#IR@9[KLFXs+b+8J3b1GF^GB#,
%:rAl+kX0X5$W!0&2KK\PZ!*)3Pi&Ou,\A99j=ZfM7W4h8<IlIc>^5B_YI4,BYMSMiX.!W??k6f;DLA\g\+Q/:g-tkr26=\`CTH:dD7A?4);;cd%!?4PVg=9I@nF81HXGc.ErcdLti-Ge5=s$-uAgmS<%Rn3pDfIE0m'Us-$M`cfTjV%^r%ftr"XM^'*K`R1#5ej8U(=aBJH)oDF>J=j=-]1Sd?%tQ$[t,%OWR-#)6:UBZOt9jE:SGH
%:=qQ5,H6C!$C%rFk3(]C/P3Yb*jHgnos#RiUs'-`F'>#Ao]dh0OSjD4e!;N0MLjXEXYD2Jd98f*?IV15&JlX%fo,?\l%7bqe2rlQfV'"oef2)Uo-">(6jSe:sJGac845%HL]"-eJDZ+2[]Cd8W>Mg.(p/#[a>Nabrg79VSPArOpMqhm7TAYbfOIJ!sm!asYOEL@!!`J;,p\6HGH8IqUrNA1^@-96)T!+'fg9g/eN3j6EG?gT"(Mr1-
%:HUUWM?(I.nF@ts/,nfg*SIA-Y*CnDG6O5C8pCQCd=jN<8HA<a>STk:mIic/&]b/oZ(39@eW.RLEmj#;O!!7eV+ICpte'leqi0QZQS$2gohH'YW02'3HbFYC+6i683-r_k"&(D7r"9h`r9TtK].!Zg8Y/a!66STA^&Z,b%UB#m((Cdl2HB.T]+Se5*>agG5G"i]UQ-_@Ik#Ak>luQCH<ItMchbKg1riVUt,<ALgnl:rhkGL7131d:V
%:X(EJ`ncg@pY<q=9dF^6-PB00A?pVYgNJR4DK>c7>,:t9*Q6r>F"9!\FB0u4bKVS9hLP3\+#_0f&$#b")kUMp\:o4DSGe.]Xjad\q.u"2q&;2sVMhJ*sp]4Fb\RS1or>S']5Dt1!Pn?,5$jiP(`C1Gd4V,]CK&84H6K$/q)V5H*T+m1//h/0ATUMp,(BWKdLkN_]>uB_TkU$r5js%%K@3fY?L-Wpn,`\B@\_<@e*Zm?3pb.bsZiQS%
%:8Pe4JoYI,/]fB.:SM9;LIg#Ve+K<dq,OOQG(74_].^MS/KjM>,()JXrcq9*1IUhPpdN7oEW')B&a=Jc%A@i);nj)1F2pH"LPoO9K4[CGf9"?c)AVuk<dQ/[cF\9d_-/Y.?$#>qP'nZhGmU:QCOaOaO)+?Br"-OjO,Kpaj.&l.QP^"!!-2MDjRe='p&$<-66;Oq)Fg[Hsd3B\Vjf:f%n8MGSDiar^]\P%_]bH0>p[=2KZTZ/-<Vpp+
%:ho)*^hIfHtkIuMcMFS7BRB!g@I>tTI,un6>P3PJ08N"2G4<p]@9<05#/@2+iMiA\NnJ#L\2DLt_;U6P.%3=Ga/.*<d!A\PP25?9aX'[O%AVVJ0\eLR!(F%3<=VNQn3AN59Z@e/cU7a&JN2=&0&`nZnmi]N3=uf)`;:(#J88h\ZN)!,He"rVt\KZ3c>.W24(8iUXeIe]^DW`hhEs57/J;eC3@)Lpia=+cT"-A&9[unCI"p0O.Prc!C
%:L@cuJi;^S/l*\65Oal1`Uj^VsrfIqX?9S[E%i-Cl9.l/#%N[nc/]6[o3?Mtc9#*)4%B1"!LhNh";Z6^p2T-cHB*\4N,U):H7j>Op'e-8b_Jf;WU^W^rs6A3t;Ip<dmiVBA;S:Vs^LLuRPbCkNY2MocT>9Df^iS+i&ji=&Iir=d&=Kbe')ef('M$NKh/]X5Pp;ES1(HTSk9@=(]PJS[+<7@HeIco"*`@oo+Lp,]81XY8jP'Pk.D4^Q
%:dL,9]oVSu:2%a@ngUsc=8?3Oj5pn=5hPIoiIM$p84l$JbL_j7%(W6\_fQeXZW)U^AG9Q)1-6!/U]n;R!2qTp<K>0gsqm-jh.Kq7OH6RTL)H'1*%u!E$c:7C"0+kk#'9Z/b7<%V68FBSeEm]9AU`5pKGX3ipKDHb$<^.ks[15aTe2?Yd"KOA6RlHfc^/IT!9&)IH>9+t@DLeB`mR[1`.>?WbOS"2#DEqE%,WGK-!==TR3m\65LSr[I
%:B?DIPO.&LXd#if#q;E=gD[o/*npO!]aYR7DC!V%#Lcsd0h(ot,B4tHnnI1lIA;`8)ot$f!01ZXe__7o1l-5Q^j.PHDOCT5hTZ-Ye<;.1Yc[OMfW=@0>%"9E2Hg^i_@.3^>F$:MYab,^TV]<#XZLh'@r=WL-&^_P*aeN4/2o+e,M9%"r9k:RS-;n2(5dRU0TP?'3aH^?]K*R',pU(HHph^T9$sUnCL=D5Pipd0Xc?p"H?@EJ0K^#C:
%:O`upIZR&Pe00pklm#I10&!/d;I3U><U!Fk?5r(bI;+-1p,N6'A664I1aAsofjJt^CUqW(DVCs6g[1slefb#[@DJ4[5`)[dm3)Dp#[PLTfkc.^H3+NC`UREBH@7Q"5&iPoi)LD8h&e82;kT1X\\NLU7NJ8V8a%FQV=EGDmKoMNj]=a-1'3j&L"'ftBX^_sLeNpB'4%]D8Tlh-Z<njl*rNspMRFpR!/PIR9D`A/^@D`]>La&R=n[BaP
%:q?a(2b<127FJ>Rh9,F8(78/QP)M;X-N<.b&6HNCm9#/H+B_)Wf)U3Y]@IoReG_?H$_upP6D1_"(U5;EJnH'mY/P*L[>"#P_,&QaG7!q*9Bno_4Jl\L:HYj@e0`9?9$+V9QmmC:??mEpjd4GkO9fZcSiL#?[e%B"PiD)IF;96[=81bg!7OS&E]/9ILMO8j@;$bFX."nML;s:-9^p]%glHbR*hb(AqKL3e<*D!;R&n-gAU@A(JF'Xec
%:&g<`@6qmWF&Q[VXTG(N^]tAte"5cO.)QYU\TNRV*.&QYP[V.RlN@c&uV?te>4!M#MO=-E!#+8IEE/BNW2aE[QM#(O41*-TAC;k.&Co5#j&oEIo7d+MRXdk!%"b.]\_Bi`?,f.cn2ErF]e!h370c1eAVIRio6tEqQ"#sd`It<PN&K$`$)_u0r`n1JQk`>gmXg-iIFJ:9&gR5Y96.7NR3\_LB\$Kc'2nmAcr@u;L3(AZCa1.Y/Ie?qV
%:aN1(j[qH7^7FLC7%?*BX&K-:D1&a<siVi0g9("+%nZ*]Sj2Z!R^Gd(!Q9hVMGS4Sr:SM,6OBHA#O`p:CQX45i)c4KPUouPI=]_$\dQS4l9!n1;l01ZcEY]Pc)o@>F?UmTKP>')cW^5V^;$[&]n`FtQ)7p"h/STWS&j=s,oTKA2Ao1bJ5C/-j2$jX#nefGM>%K?Mp*.NM+,TX=k:j?b3c780fBRuDE&Qj-/CL"bmXDnn^%"6$['lGL
%:7K)lidME*r9UAsSs/ITD;@8Q#dSE9KgED"ADFD_kK63aGoQE_D3`I0.7<Qj@H>7(\^"!APd2tVL4*eh90&8-BI79(op@M9jd6b1BB]5Wo'$m5M-aoI5+uOfu0(Y.YnoC6@Ef#_pR6g9J>W8F6Ef#\/'o6s"-V=TT1aPMI\?P7V?"hg./j-L:Kp!];,uJf3b6Y$Q`U76V,MfgB+rue7&[RZL1<VML'.(P%RZ`e%9Z[RR5;PnR"rNHl
%:&+UB+;X>g*nXq?KZf<R3e*sCIRndO)F%mLZ^V5@l>`WpL)\qakPekgO'UeM.P*O1GU:Mq%`C!%Bm>IcmIr]ZJ=mn21[WeOQ[2)><4:pc=JY\j+KZMX"+=[=R7,3bj;EPP+9fiq)i6k!t'eti%3g%6FUq7Bd7+1FM>BT,S`Z<["_A7GkA3pmQnrcL@iuF1^!\J>l#-'s>WKl)8B[:F9[266j>"bugp6sQ,HUmD"IAlsT__cipX!Yr.
%:<-+7;4>D5#/W<f;T6's%)m(0F3S-)8SE/WQ(Flg`3mtG<X_*!tQR(9%7FfCu*r"BsqpF"`9ir!_ZRMk]4L=i8_8;tNZM2=,f>G/OhMC'T+rEC[.jKs]IU"//)!P^*;f3i3l.dWDUDZ'N+_fo6h0;eb[A+75CD0,uHC1L4RqFk4EfCB"WoHM'RPp+3rYR#_FZ-CD!hUXMh@qZ`<WAVPF2_0u-FmTPc/k^[Zm!TG'e[*$l&`"-fcL;k
%:4tP^JbrT*9:;k4$-8a61U\XJ&[&??+VgG.p=4U+C9IZZ0OaF*<G>IkpapWL^4`K>p&2UU?qt^BT%r1_>ZRR+?]gUBFDreSHL[9gHaSTC&1A:.Trp;"7PT#]8\!o;92&r08"t=iL%3m0s$kVHpFC-/Xr7jesOchh,ad"]pP8G_pU`9m-I*X1aSDP?7],@_p+RbLBADU;q,@tG8,"B]nO=$?#UTIrM<h=AD:V&2Kb!#DY9oGj7(4XND
%:28$.Xs!PA.hVGPlH0u71n+XP08>:NR$:V:L2j[[PFr*N`]m['9E\WQ"g<&X/Cf[1r,l?@Dqa0i$^=;:C)0k"u&aI/VU%%,:Z)N:epYS:)Q:1GPPBGV&7stuI1Y)mS*A`P7Eug8jK*0)qi,HpfaH%i[Ufhg;8f&'WG\R;.:8ZYY(7j3d%f<GRa4VB7idb5fS?FpY`s+HbC[oe"#(;(ZNB7IgI\AkKM[i^2$2ZB7'Kk*C:b_Y7nuhm5
%:5:ekcaq/*3)M,f(nc_g;rWAqNf7D2fTsiq([F<4b'8/\fg;ulAD+9tjG\FG&8Aq""-rQRJ^"n='mGp//GP8t;>r9Q2<W)VBh/K`*/MNcVVf..!dZ&==8Jh[rqFpN&*')g-8DDa0g/luJD2+:?\pRBBCF9;KfbBs[PgU>gZ1[JuUtJ=G\FA@QidWjKQ>Us70B_4/DuHM^%Ddrd[#C]dB`IAL;fZ/+hF,"W:\+ngcNDoX*:Qeuf.+Sj
%:9bq"q5qC)19#RosBHdA<H+<45KOZ$:8LcCkf'@)kS$N)r,2X(3mJ\M'c?66)I@0!>-+H!O)NIgsCnsM,knHlL<,g*thN)X8^%$KeX&0bo%bEhAmN_J91:)SB"`(Vq$]_*k`MEs7iMY2M7bU]<BX]6ah@9u,=/pXtN-sr;V94PPb*3@Ra9L*D<Al?LI=]VbV,:#MEV6GnX+eLB,2oPQRB,Y;5=Agk$eXtI1WUU2YukJiA,77SrDkoT
%:5H_UIaI2(Hhhs-%Y/h6*:2MR8IcCVe9eLqm8kj;J')f4C6,A4gJiNp5_*d,SAc(<Y/.Y8M:)2j\b3>Njs1tF6C/8j%5:`iI]H+<3E88&g(?"EAjg\79)TOIc5Yn_@GLqP)aG/ld)@YMm8"Uq&A0((qgl.lFc,O$%*A<NJl;ifp6JifP0#0=#8><D*/`#$]GJN03-,B<)^u#;'Y1@"jmt.G"=">YCi*?WNQBlHYhX#1qfo'J&DtZ&h
%:G3sF(IfuW)ZA-sAoG@,u^?8e_gjIC<4)m^X%Tt`-.7FNcKI_B(CFf1OXMX!TDb40Za:SKK*[*Z$Zpu<m8%\X*5$6IfL_0R=q3'fJj9U<6Nt=8e7g=>t,No'8#_=&+le6bW&]./fNbVmiFqPr\DR!3sd_JARWMQpj#^dY9i^YY%(495"P2XUqC1^,A#HR-G1[Ab`*WO7+Qjr9k4[S'?Eb)s5@cS3geHfNRF7J?P6I=1V(11pj0#t4`
%:V_q'aD6;UBbBEVZL/bC%rd>*Nn#eLB+ehj_,!0=tqmU[Z,dQCS%rlu6L*?D-b;G2>ms:h"*("B"KIl+ug7]Z>#[8r+_;)5USPkVu_W!H$QV3o=)uDn)f]R6P&kS&qd<Wg9gt5MP3E<#i_MpCEO@@ZD5/HeS+T'TRI)9>o,Pg,\iY*+6,3Gb-MfMtC*5LFO9*Fk<oeb*E65HiS-Br;ro+t71"2,3&GaXPGL^d@9G:iX0_M:tAn8&c\
%:3$F4TKQ_$bcIUl),!0mUGeK*qBOZ4=0MKltc"i$l>#THp@2&3SGSa`@KIhHC=c/>4AA`S-%#0$D>N/fB71AKrj+JuC'AB-'@V/agfR'F1E8=`:#d^r'bo^Q/?J4EE_[RN$(5D->?U5O[dsOL]P8Q9_rj&^:L?jQ,0?i"VN#&MDnVG##S]+fe@7Fj2:\+ng:KH2&/?6JX*>-tDhKFN[hSk5Lcb#!A4`-^N7=7E`1doP=MsSfImAA'!
%:@>^2LS$km;YAG&0>M(Z8N_Y=7qfa:@.gA(L8Z@q?J_9XE)l,V\cD$lQ=!I$8($ng^&_pNm2C"-'phZ1"4#2Q\dF^YO?)3F,RmgP)\&-Fm>OZ.DQ\[g"!]L#9M:asJSDf/2=[&!a@s2E/f87:t+`!$P7;$M"CM]qW`FqK)hIaIPqM[Wb=*46WEijHtX!-`DhgE:@".*G/r%+q`'o:LT"7b3sc%p.]M+,T3f1N4-LZm!;JIf$X>?`2(
%:5djpU)N#hD%HUbdht7Xfd_snMemb(aa4=A*r4ZEOC&R?gC,pi@pt_cBZ#rW0/73Z(1#Fh*b)W$tFj5%EXo.c&[`3."b/Lal=*6aF-lP;E7WPV7I#=!)RU\.XHP-clHQft[+-Mqs`O\.g+S!!dY[Km+&k\&C2r25"\\>iY13W@UJBbdVN,*;#*%0@j]P45#Q9Jf;C].)@P2t?&RWd)d[YArpbQ`M`b2MG#m0B+fd!IpQhX3;V4V^!4
%:M`94@4>^o1Q;)di<d&p:m9)b#Ws9IY^MJp=hmdg@`NJaWQPYU]2TDt>Ct3X4DsYnb`P-Yec,"n8I;MN1kk=*OZ@2O:N-o*j^3k4O`L#b7f$dCg[EE`#]4Kd9I,D1eS&A2(.pf"@'R,uG@]KsO=N,]:)I_h,OuD+mk!JF%f8kQFSE6ZRm7J;fgN=<+^K$&OF/AlH'6,t.+Ec'dlrq-[8@'`!kDG'(be5s(dk'51iXNgHqum8]\W3e=
%:SjhGR<S5&'8EmdZYJj#0GI`A(N>Das=&T_!Eed(T1\W%FLITo%\V)^*fK3G\7;LQP<b\B&%2-m+lcgjPea6XYT=^%gqj`IZXlqsNBdY-ggKHOQ&,!]#`(2^,b[r-bJ+;nQHurV2P;2I$S*]9lib@N"dkd"80]k;7cH%IL1o%l#3kCu]&!CBs)ek*,=+Za>`J?I]k)3t':(!lO=ABZu95>DcHs8ZYjc0iu]HqH*i1W'VL9hogBU8\]
%:g0U<9:nia'iN/l1ZQ2'Y6uj;^k:OuVVceNK1N$g%""(]MYMiCKI.ho_^,@!%%pfo31SK>]F.I_C)Y'`G#UY6N)/2IVNm3=b7_9TX(2d>'RMFBm,^?K^>slO$D.h&>k;J!ML3f:aaF>N^cZ?md@oldM;qa6OUr#^j"cmm)8K:@;YN-SGE9r8uUn7T[mZ5f9/TY4>[k:3PiKf*ka>W+FK5JZM[a])6[Q#AR(?^uN:D;-a[g9C4itb_`
%:>,mmfD<1uFCTL@'`I;I"WcE>+Dd'<-/DhqNr<3njm+%-CgP.Q/B_0_/UnspA[A,^'V76X,e;IqXH<D^Mr>6p!7p2kYL_D>sZPt.R@k$6s4Qn1dfqpT^YU&$q)ks+ReWX9^.&,3sOBjo5_."C4aMlh1_=n(]3aCN>G320.9"h\fZD]MfBH?Mg8aoj<AANmcUA9HW%WB17Fgioe/dKj<IZl?p)q;iX1(?6F8K','[kniT5A$-fHb\)=
%::>HF`<3BUkZFX)CnDtN<et0k%-`fH!A`P+!C[qCp\ndS:NO4MEGp0Z65F0GQ<bZUY=kVTS>,qV]O0!sM/6/m\6WPH`cOB/nXG`uY<.hnRPheI<o#ribh?KNI:E-$uZ9r.=A$paJOZd>#CWN=4T&(`[e,Kk%mDSLC)oDoZdreJ(*b36p-MH1q&U@#5YuJ0P^:[LDV,GHHj:4=aWN>n>p\SJo-25*oM6=mn$EI'eI3mB@n]-*1g7uDH
%:jZ;g=A5Scnh2jl$+2Q_NpB:6BSAY)#.;0G+BMC&nEjoKWe6th87==n54XulITlSnc*RaN2j4-]jGZmAPjR5TUGC5?1_*?&Hj6Z3$42I5'f,db42HfNCI!*9BCgRsC/[Z#M^3e.'Y'?XJ)>qIpU=,$)9.i[p>1/YiaE@@BJ`JP8JWY!e3b`fTVVOhlmZ_BT6g(lj-e_R)HWI;eaP&B6g/Z7`+Bhc>:D'[uI+$BEdcG5,MikDW%#$lh
%:e@"=AX;)i%aLV=F]/*Eu=G?q_K_Yh*Ko2c(JhGb[XcUt2W!6ee;k9Xum&!=H)nj[d_f(p(=J]<@l"a"qCq/Hmkr>i+,bnd@mL0spfi6q1i:bI2(h4sU*]M!QPQ-1'fZeUD.Es7$?/.BJiM\6SUSecC%sq#so%S(]mtQ/\gO>o[DX5*regp2[Y&,CA993CTZPrc)JU?Q"nAstZ=gWHS0,_X[g*o^7A,1@=j1Z#sq?t\`^W+ZYoi2at
%:466AhD&#olRP\Pj#cb5qRPa<oL%Q0J7'lRX?4pL%V)MB_pK4frb6`4]3g?A6/Oio3j8VC4NA=V:j-gH72RI'LCUdjK*:CmV<B1pE`f_/%!]44WU.*%V@dh$4"`kHoDP[)]/7Q>0pf32+bd.#ur]I96`?j_N%H.q<)*?na95A[:>YAZdP[P=jc.Cr>pE_Y;5^KTLU@/FgjE0jNAUSq/f/+GlB\_4r:F]jk(O@iVZ'=#cV6-IrD>.j6
%:Eilb0Xgh,!UMF%MB_bXb>;tXKS?Qf7gJT-DN1PMsE^c22:K6q=SgN'3N9u*1kGB?gK&\VtkIQMGVfn3&SL;b?I[.UL3pHD0;kL2?&FKL$\VT\-p3fDA+@V9qEfkN:J$sYlU.5a]2p_tJpTCqs6.Sj$_U,88+m,]:2B6gh?9Aal='WBln3h\8Fk\@41B3Zu_7;>R)*7S!S=4R5_co:>WNM;UV\M!61u(NhX&;8aaA_45r\mHP?^TZB
%:l]g098j'LGKG#bF%P8(bheX]aBAB$t.-[L^V,%e+EA2k8]7ckbeI\8Ah*skGlg%T0,Sq[G/SWAP,0ol[o97!\1NIA"-amp(1g@GIR&sRR>Bf]@FI1\OTRNT[Q<o*Yc6qZ%<5?:@<GUXUblG3L(VRNr8f/)Amk!^fSC:_a:0B:g0c-<f7S-buiqp>WRL!l6"95\"!q2$cjoS#3/T%Xo^`F7GAIin**f7#S[E#4:F^AuJb1t\Fp28Ms
%:P;<-WY1MO9i<3!D;PP\!_L;od&0hCAH/l0sjZ>rc>ZBYDb'""MED]bQE4=OASlWHj't[6tgHFVDIr'OX'F"b8]16?frbV=;S"@U%(991\DE2OjO_(=/g\k9CoU/MOc6miG:g:OBMbA+gm&=7fV^\FgQS*h??%N^+"I1dVdSfT!ZiKHmW*sr<9^LX+&_/gFkE%]plrqQ.m7P]PT&Sf1c*$p>,EVRg:lap8`TW.a-bXpsloOrGYaLWg
%:-^.hod8uEdA_Q96JVK=9YPl_*M>@D=7g5(.*MZojrm^A0U@sLeiss0chNHciD#f:Jed^-BF)3d3c"K%4?-8tNN0)1pBRhA@2BC-*W.mZ"H</>RU2:3O4dGL9'We"*?DfqVp8b*iW""&Fn*sr\<WAq/8GhjQ3<(=A(tK/Z?GFh8776P4_RV9?#TYT6k>lIefS;D)Y4sO`L!@;c_B-#q2Y..fmR][r_G`Eu0MQTdFp2LtO%!0sfMjb+
%:h)ILl.RH&si64F8\"OJdH&OP7O!?LP>?W/XZ]TDTZE?h6=g*X<HsS2+^(BO_#!ui^>L@Rp]XS+Pgg1k2/l/c]5dU;HrA]Gi3</493'2FB]s[kJc>6+*s(VoK)r>%$@#\&4>bN@7D_i*UfKdem?PKC)i"Likre<4!=s1=;Z1dcY,;#WE>B/e-(PFiDLjlI[1WO8U<6*D,g>gDj)gncD6ooP3k6UP?J\k?0&NP8($=i>l4#ES?OjCm2
%:?!j,X(l"utUtLh27(&)rR6hf<VHb]eZ>$S4LtjcoB3mT0UoEFegM3QGGQH,u1AQ,5WGQ=g#AoL/c-*O6jV?qsKg'=j&Q)=\Ei;hRbB[@#7\PA%.4rVjX&5>LNn@%lVkQ3.UZh=p4%E8<Ye_]Y_qnQac,b$[cXp@0[-8V?0%UI+&!"H'?Vfa2r[-eHFL<B7"1m14kOlm:<W?Oki*88SiUD]fLRa9li,dofA7)1\'b]n`KP\C^kf3S>
%:i,c%WZLcs3dS<3=FD2q'(GV&SF<Y',,!F=CLno$$]7)lUIk]rK%EQq?@`X:2OSro'%'I/^fe[4o-%eC+>J:_4BP8No16uBGpYV)ni,r@-B(2p:8<6k@<!4>=eSc9[q&<kOLh-@;Ut%foY"]b=lTR(E1^r&-o-i4,F(1'm2VMEDfQATO[bC%`FVM:>d7N!e`5\*)<J8l3%[f=[5,E-`((D<a!a0SgRaK7FYIV$ranpt&]'H*F8XieM
%:]rQ&F2oP-:SF!sGJXh$:L,bp[^%XQ"%<b,e]3C&C?.Iii.Up#6fBqE^\,4ohG983E:TP`JX:9/;Z$XZho^;/m%!G#d]>*CSrna]3mJa8+pYKA''n+$gKC/##br`>lEP7J(euU7/TaK6JfdY0mpe%>XI0cIaQ'&eq3.*b\6@(),,$PM/G53@7Zp/r\bt$L%lgUlNLt&%=8?VP#OBSJEI!cDHopaDIgslWY0uON$>h#(81o,A)f!Tp_
%:8dV:eR;J`K7^IMT)_KDPSae%QU+[F*%&hSXWE7eLaE<FBqqGSq!HOC$YNFdGQZ`Xl`/:o'r(qTnO*-3pLkui7%<6Iq02//07W?"Q6Der&D#.<Y`I$)"\#4K>+JrMI9CX''(g`U"c:Efd%%Md9(;%#pH^p#S^$4dh,i5$if#pOq2gsUBA.Q8*kro!,SU;6"gAIcl:b>D2X4F4Kk),Bo+.^Ir6DPu`$B[\m7*=['X'f+NRW_!eX,)pT
%:hUK(m!Vb.0R,6q-A7(Fb8j=sLKZn^*R$%CqZ78VckO/jFVUm&QpSN*36fL6m3rNeR9T;2*n_P+[IqiLYM>*lB*Dc3s"]P@<:qZOt'3h*?1g@kUR&sdX>9eeQGDm6EHu3]an_VbI[jBle+]k/^:6(K^c\,&:pN(&\#8FH!rH5^Wl?3[N]9@0eSsN$=4a!2NhD:kXrR,,2pSKsFPMJT2g?rB<D"gc^m\=p:LPsuD3S?RS,Dl/l/uaC`
%:3[3=,])-6!pIsd]pILXZ43a]SdT.M`\,0:4]8CT;GH/o(r\!`toLXCl;5#%IpuT+YhioA1HTKDG/U\Mc(FLFjn,fKeoa]Cc;*V-#AkX_0e46]N7bojkl^rbHeJ9C[s&[<"i*3"Y/W]/:2^>_B/uIIuVV0HU`^(=U[3`rb)_`jU'N.Ol)JOtOmh>J*'PQ;VN5tf.n*OSL0nIERS%+?Bn/`pNW]Ynn/4WAHqAgftcX\-r@#B63YdUjW
%:"&'ArWs0.lT'@s.mJ5.Oh-E2\GO`TfQq-2=oN]K"/lFimbh.HuUf/rjZPtTJ#@b#DRF0.E?b*Q"B,.]-BBjZ4XkS76gYI:lg$Y!MkJZd8A@mnP-<ohS67OQ_7aSogf9e%!jbT.d\\`o-=eTV72_8q-bk_OIX-T#>7EjFOS[6:]PI:U0LpP'4c@V\WK%+@q?pa!,39h,SpY7KuPMMQ3,HbeU'h)s5jgs9_'>&$^.<[)ngZg2H17<8!
%:N>n0>`OZDW%DP0F_[p^U_G]YDZ,:m@ASn-E2loL$&%.M/A&%*!eI_E_a?eI1:.W#:K.q)07A7KC@bPtIR8HAUp5napKK:<8GZ@.<NlQe_j`2eN6,!c.d8WMKj]3&PSWn<iT==Vg&&h$VTnFk)Q-Y[JPcp@+apM^nZ:3I*k3_l$>=Z0*DEZcAh7e&:j`]FmP5A)M=mimbU-)J'jEpgbl0`9Um-GUf^7odI8#Z%/2"e'gToIMJ(B#0o
%:BiDFMg,I_pD7R)I>Gl>f[V4@J&ad)O>!%d;R#H<$fCkp>fordHbMSV]oTNDX)+l-MR6iRV.8WXbpM'eq&B18`oi$8&YF8'j_FW+ERLmH=YA[rRT<K_.lJku*%n3<>7SjS%-'WRm]?[UU\<e\'mhMZ5blQb)<#rrF6h$UDSc7">HB26c<g8IXj8eq3pDLY--)GkX9Ej._X"/'fQ4VVEga7$PRA0UOJ\F'+*A?&<fL)57.c,Sr:$Q"C
%:UolIkhP50$e+ZYgdk_0`^#riL*G$gdmbZ]3YIf"K6>q3qVd^<2rl=apjk)fn[o*<EVVc95+)^XF5r:K-$dHO2Y>Hds*!jubrg"!XP$O['-/(s%K?K\LbqfCQl@[3Q!Qn5M2#RojNJ).Ik_1gtYfuWV>G1W.&(mSj<+*CqitZbo'D.nTpX.WI)!aKYH_5O<F(_at(U%mMOb1lL?-Qs$Ro8c8lT$KP'K#D`SG&*LT$$5S,U\(`md*mM
%:ijF]=Ul`ZS?Q(rbc+>BK:8%4Vht*ouQ+@).)=:5g6G,3;1b@#R?(YQ>I7B1cA[f-cpPCJi'oc>W4iAcOOGH%jZH;?lhEIWA^*,?QMd[MF=Q)'qgZ_Rr+&<o(oS$YQS?:o(?qj_sk+Bn1oQW:_L0Nc)0,WAf*u.I%B"B39pQ:?.Pk%dG;":Zi4C]@H7AQF$>O?Kq;e5.5m6J*XSBg,re5.&k4k=$h\Q:OaT&f(Dasd0_UFW2k1Sjk]
%:TZ-qm6f(>>;hE('%TX]j1U802WIP%AdEE`5h,TnX7im6\X);t*^t3$#"k9hNRbhRd[(J,2Mkn,>pMX@5NMP#TFTo,&Q5;[2klnoPpBh&LFgRb'Je\_XrW>4$<;X`r-%#JX]J4`N:u>(rT22H$&-H):aAS?sZQ1o6gd@T%13=NkXNqG"CVAu0\2U9Db*b"Pei,)">,>+[d`?`@:HE]<*4C.?&KJbEr1pj_\>9[pS`_F;>?`QHV[!eh
%:4;gn@Y'MUI("aS<rM!S(j>LUlde>#TcDhiJ5n;'3B@VXK:98g6&Y(12BOu=V'g6S3H>$9WJk.XAl!_-MFV]nZkbQ6ZqZ5[U:MQC![oVU)4Ik#Kp_cS@JU$sDGdo.a7/Ru7<#C8n4#D2T?,D473q71RWW$ki:6-p$a)@co<RE&hht3SY.=0X?Ta0rt4m^NeO6]Tlj**RJDNGpHn.5L44TbUW&#qHS%m)W?TO":I*BNG)l`#3c5')uK
%:[aX7Hl#E'^\Arp*GPO0\W)=9lm*O+3G)78`kbQ8tVs<f]SK@fm*q\4t%n2Q2r_3p',Xi5*2"[GHU5'aMl1*D4j'q_/
%:!!!=j!!!Q,HAeeLCOJKtC2q-G$Om(9Kj-Z-O3T(8\06t1b(QPq!!%qQhD1d-%u^9`4Z#5`5^ED1=@`s+GD(5*ACcAO,14;]!!')*m1MQUkbL`=Vs7-r:6,ATP,(Ssd\F256"Y;=a1:/=!!#1+aLmUjoe</)*bCtD7l^PL4$C`M*Yh5,MP<TGP9/L%!!%p?9ZZq#?"+<X3pBM`?4R#9qt@s+fhRSXUdnG5URLDo!!(lOL\N5SN()6q
%:rao\fE-jnq1HGL9l1)tror);sa0VR3:"#f&!!)61mbdZ0?pjRj6UMC<-$fOkfHI@)>1-LlP[6p4`36\*!!&M\9(4'`VkocWN5aOLh=:OG*"I!Vb>X$75IT(=^FCXC!!"D]UE5Nj+f3s.V0X/r.,b.+92#V"1\X(=C%SEO>E<Y<!!%$F?R)6l@1POoEN^Dll5K^'<?J.%ROYl'X+*G0od"KU!!"EREE<\c14nBO[6EcX`c;%Z4mkQ?
%:6.QaX5h(!p7aZ$lML,SU!!):'dWKZI&8Kro]u1N4mi)6,+h\XulE*T10dp^KT-5Al!!'a'U^3]JdRn4K@;?DppPJqNdXq=bNMpd5.>iYWZ1O6t!!$0"VQH=GC##EpgB;W$Xs3oH3,\:d9)%ib$QB[3N70q<!!)q.T7sdum'2_fDu0rgQYuj(X1'bH>D%$Rj?A=h-N0^a!!)$spI:4I4MKe%e@i1Y=*4KCXN*?4c4an`pSr%N#/Bu1
%:dZ?Bu!!%<SMeY6_D@(TlD<k.fWT!mX7eM<LhUq/fpi2.HpogYZ!!$e#lXVAW6danTO:ace,6@iFaWAG^-nZbsqi;"")Ap;]!!!9g\?s\]Ab/tAfs[?/><)Z`-6'F3A1qiNXI3@W6:.MB!!!Pp>7b$-NUVq3Kpuo?VQTt"1iD!VAa<AK)mtc:8B7%(!!#+S2<r[n=gog*2JL[>fde0Fc!*C5U1Nq^XW#f-gmZ`+h>dPO7E];FI\IUp
%:=u:0NKGcBX0d8j_!%_qG%]t:dMZ,-IZTN0*B)hq2DeWU)_=F>^--OJt="Fd\!A09^FB(sI>$[hiV7EFV!2TYqQ)1nM<D+9(>>%%NHV4TQ!!#:O42Tn)M]eM9W!.2n*A%6kS]$t^WJis&^Z:0n)qRI>!!(97\FZA'oo6++Dsg:u?D[]&4ltllSWu.CQft?Bd^JH3!!(=l;=RL7SZN$[Uqbgb5Nr.JPc7^a.KXeoP=B8&ART%a=Dn)f
%:!!$R1!_>^fFCeEcD.N\Je5cPL6tp.Q!!1GH;fm%oDJ&qM!!"]LATDj2ARfgrG%F0aBk.>H!!7:/F?'A2F`_1cDerrqEWCam!<u8;:L\&n!WW5r9m-U=n,P^J9PJQi!!)=Z:^$iR7S#pc#RFp2ARRh+!`24(F`V5'!<PPc!!%:]@W-'VBju*kEd7WbI748=Ch7HpDE.eY6>URMCB+Ce<e5d."TSS#<+05i!&Fu_%7*KP7W3g=.qoP'
%:1BISf:i^Jn9K<:X?oJ'qARoo`!HM`O!d$qQ@;omo@oIJp9EG1o9LE`7DfR`9!7"8PDIlXQJ3c7#?US=E@/p;[;[<Bp9ho+N&-31>01')gBk'4:C]FGh=TD1u!!$M\Gs_m?!WmR52$Z;O@KMW\BkMQQ"p&ZCPZS,D#[.K6Y=E_LA7]f^!K^4l&o_c2Hj9[m;Df(qDJ([1!D>6TBEAnK!5qQ>Gsi>f:Ng/%#>-rWCbc%l#&eM^XXF@U
%:!*)C)D/aE7Blm,X3!-&Z"@mKNF`7<\-UDcnDg-""!!ic?6NPO7O?ik4!!1FH9L/XYfDs1s!!(:Ec2c,ic2c,ic2c,ic6*)ec8,JK!%.ao!%.ao!%.ao1&q=,@0=aV!K])=n,W%[9EK;9n;Bar"N1<07fWO3!'(%_[/ho^F\MmH!!,??98*?Gn,QGg0M;BGo)[2m"*jl(!JLP;!!/qs0/j%D3sX@=F9,#79PFPL-NU(FD#cp,L^I0Y
%:?NNFlci=Mb!<RC<"?ul`!^G'6FmB%n!:'XN!6Y?i#6BG^5mAC>!ZhDe9*!`H2[i7an3[Io%0>Jj3tOsa1CYW2#UKKW,ln8t!=0tP#UKKW?iM0-(THL3D[\E%P7L5'6Q@f];%>Gl0cfQ[b5ag3s2;SN.0fl:');_"#O;B!">^9=-B0/;!3&Nj!d+I76NDNLhZ5#(#`T-<!t*odR0k5N&-@"C#3u9T!6Y?m"q8iX.1cKu!s3W2=4q-Z
%:!:'XN!:'X.!8@a<*?c@&I2+%/#UKKW,ln;Oq'?%IeH%$(68&I.hZR")UEZT97j^M<cN$1(4\u3&AH=ne!d/&SKf2F&3<`CaFX7%i!d,Xe"<ddG!d4<'0)u"@#"Jl-=sX4O!d,Xe!!79r!!"MP!fm@>$^Wl)!C-ScFf,5;!2fgp!2fgp!2fgp!/CPI#!i6+!(-`8.Q$o"0*FWA"J'IX$;:<uZVJn5cS=0L9`ruKgAs_T6R]'82HPF%
%:s1_>0M$M-&8H:+>)NOtn#=elE!-4&!B*;]EGl]2t!@7aLs8VHgcN,Ht%Vl)T!.tA&"9sJZErmX&%EApg!)X\("@3#V!WW0YD+B+V5]m5l%S$Qc!:'XN!:'XN!:'XN!:'XN!:'X^J*R+#!/ghi,Wd3s56+?Bcu#)H%c\!W!l$3V!BC_ks7Hqs!_i\Q"\k4E&L@G`V#_eG&haA;B+?Et*%;(+0+%m!-<HQ6s$m3+.UrH'#RDp]?`ao1
%:%YFjL#=/?b"c!+S!6G5_!6G5_!6G6@rlG/^!6G5_!6G5_!6G5_!6G5_!6G5_!/U\K%RC'ps8PGF5KJCmK`Hf,9b1$AK`Eh02g%c3Nraq7K`Hf,K`M/NK`Hf,LBM/g@fV>dLN./73<kslDZG[s2ZY-/"T\/os/?>U.2j?R$IJu"-il+0h$Mg;gGu/5+T`!B%>u+G!6G5_!<<"k"iCA_!6G5_!6G5_!)E_`!'pW/&IU,,&O?OS+Js=8
%:!5qV$VY;n&VMXO<P^<p:He:+Y;bf>F6W2MjnhhgM"$s(D3?C]m5lskI!D`\TG6+mA!)FVH!!$:(q)&3KN?1.]R/d9>b5fWaaT0E_aT0E_aT0E_pYO!laT..t3tJ;H#W;WB%mTkG&C<]C:C8fV?N:(O!+.Yb;%/-Y:B:K,3rnaML.5ufFCbIQ6tKkHA7Y`As$.a@N7'u]
%:~>
%%EndAGDEmbeddedDoc
%%BeginResource: procset Altsys_header 4 0
userdict begin /AltsysDict 300 dict def end
AltsysDict begin
/bdf{bind def}bind def
/xdf{exch def}bdf
/defed{where{pop true}{false}ifelse}bdf
/ndf{1 index where{pop pop pop}{dup xcheck{bind}if def}ifelse}bdf
/d{setdash}bdf
/h{closepath}bdf
/H{}bdf
/J{setlinecap}bdf
/j{setlinejoin}bdf
/M{setmiterlimit}bdf
/n{newpath}bdf
/N{newpath}bdf
/q{gsave}bdf
/Q{grestore}bdf
/w{setlinewidth}bdf
/Xic{matrix invertmatrix concat}bdf
/Xq{matrix currentmatrix mark}bdf
/XQ{cleartomark setmatrix}bdf
/sepdef{
dup where not
{
AltsysSepDict
}
if 
3 1 roll exch put
}bdf
/st{settransfer}bdf
/colorimage defed /_rci xdf
/cntr 0 def
/readbinarystring{
/cntr 0 def
2 copy readstring
{
{
dup
(\034) search
{
length exch pop exch
dup length 0 ne
{
dup dup 0 get 32 sub 0 exch put 
/cntr cntr 1 add def
}
{
pop 1 string dup
0 6 index read pop 32 sub put
}ifelse
3 copy
putinterval pop
1 add
1 index length 1 sub
1 index sub 
dup 0 le {pop pop exit}if
getinterval
}
{
pop exit
} ifelse
} loop
}if
cntr 0 gt
{
pop 2 copy
dup length cntr sub cntr getinterval
readbinarystring
} if
pop exch pop
} bdf
/_NXLevel2 defed { 
_NXLevel2 not { 
/colorimage where {
userdict eq {
/_rci false def 
} if
} if
} if
} if
/md defed{ 
md type /dicttype eq { 
/colorimage where { 
md eq { 
/_rci false def 
}if
}if
/settransfer where {
md eq {
/st systemdict /settransfer get def
}if
}if
}if 
}if
/setstrokeadjust defed
{
true setstrokeadjust
/C{curveto}bdf
/L{lineto}bdf
/m{moveto}bdf
}
{
/dr{transform .25 sub round .25 add 
exch .25 sub round .25 add exch itransform}bdf
/C{dr curveto}bdf
/L{dr lineto}bdf
/m{dr moveto}bdf
/setstrokeadjust{pop}bdf 
}ifelse
/privrectpath { 
4 -2 roll m
dtransform round exch round exch idtransform 
2 copy 0 lt exch 0 lt xor
{dup 0 exch rlineto exch 0 rlineto neg 0 exch rlineto}
{exch dup 0 rlineto exch 0 exch rlineto neg 0 rlineto}
ifelse
closepath
}bdf
/rectclip{newpath privrectpath clip newpath}def
/rectfill{gsave newpath privrectpath fill grestore}def
/rectstroke{gsave newpath privrectpath stroke grestore}def
/_fonthacksave false def
/currentpacking defed 
{
/_bfh {/_fonthacksave currentpacking def false setpacking} bdf
/_efh {_fonthacksave setpacking} bdf
}
{
/_bfh {} bdf
/_efh {} bdf
}ifelse
/packedarray{array astore readonly}ndf
/` 
{ 
false setoverprint 
/-save0- save def
5 index concat
pop
storerect left bottom width height rectclip
pop
/MMdict_count countdictstack def
/MMop_count count 1 sub def
userdict begin
/showpage {} def
0 setgray 0 setlinecap 1 setlinewidth
0 setlinejoin 10 setmiterlimit [] 0 setdash newpath
} bdf
/currentpacking defed{true setpacking}if
/min{2 copy gt{exch}if pop}bdf
/max{2 copy lt{exch}if pop}bdf
/xformfont { currentfont exch makefont setfont } bdf
/fhnumcolors 1 
statusdict begin
/processcolors defed 
{
pop processcolors
}
{
/deviceinfo defed {
deviceinfo /Colors known {
pop deviceinfo /Colors get
} if
} if
} ifelse
end 
def
/printerRes 
gsave
matrix defaultmatrix setmatrix
72 72 dtransform
abs exch abs
max
grestore
def
/graycalcs
[
{Angle Frequency} 
{GrayAngle GrayFrequency} 
{0 Width Height matrix defaultmatrix idtransform 
dup mul exch dup mul add sqrt 72 exch div} 
{0 GrayWidth GrayHeight matrix defaultmatrix idtransform 
dup mul exch dup mul add sqrt 72 exch div} 
] def
/calcgraysteps {
forcemaxsteps
{
maxsteps
}
{
/currenthalftone defed
{currenthalftone /dicttype eq}{false}ifelse
{
currenthalftone begin
HalftoneType 4 le
{graycalcs HalftoneType 1 sub get exec}
{
HalftoneType 5 eq
{
Default begin
{graycalcs HalftoneType 1 sub get exec}
end
}
{0 60} 
ifelse
}
ifelse
end
}
{
currentscreen pop exch 
}
ifelse
printerRes 300 max exch div exch 
2 copy 
sin mul round dup mul 
3 1 roll 
cos mul round dup mul 
add 1 add 
dup maxsteps gt {pop maxsteps} if 
dup minsteps lt {pop minsteps} if 
}
ifelse
} bdf
/nextrelease defed { 
/languagelevel defed not { 
/framebuffer defed { 
0 40 string framebuffer 9 1 roll 8 {pop} repeat
dup 516 eq exch 520 eq or
{
/fhnumcolors 3 def
/currentscreen {60 0 {pop pop 1}}bdf
/calcgraysteps {maxsteps} bdf
}if
}if
}if
}if
fhnumcolors 1 ne {
/calcgraysteps {maxsteps} bdf
} if
/currentpagedevice defed {
currentpagedevice /PreRenderingEnhance known
{
currentpagedevice /PreRenderingEnhance get
{
/calcgraysteps 
{
forcemaxsteps 
{maxsteps}
{256 maxsteps min}
ifelse
} def
} if
} if
} if
/gradfrequency 144 def
printerRes 1000 lt {
/gradfrequency 72 def
} if
/adjnumsteps {
dup dtransform abs exch abs max 
printerRes div 
gradfrequency mul 
round 
5 max 
min 
}bdf
/goodsep {
spots exch get 4 get dup sepname eq exch (_vc_Registration) eq or
}bdf
/BeginGradation defed
{/bb{BeginGradation}bdf}
{/bb{}bdf}
ifelse
/EndGradation defed
{/eb{EndGradation}bdf}
{/eb{}bdf}
ifelse
/bottom -0 def 
/delta -0 def 
/frac -0 def 
/height -0 def 
/left -0 def 
/numsteps1 -0 def 
/radius -0 def 
/right -0 def 
/top -0 def 
/width -0 def 
/xt -0 def 
/yt -0 def 
/df currentflat def 
/tempstr 1 string def 
/clipflatness currentflat def 
/inverted? 
0 currenttransfer exec .5 ge def
/tc1 [0 0 0 1] def 
/tc2 [0 0 0 1] def 
/storerect{/top xdf /right xdf /bottom xdf /left xdf 
/width right left sub def /height top bottom sub def}bdf
/concatprocs{
systemdict /packedarray known 
{dup type /packedarraytype eq 2 index type /packedarraytype eq or}{false}ifelse
{ 
/proc2 exch cvlit def /proc1 exch cvlit def
proc1 aload pop proc2 aload pop
proc1 length proc2 length add packedarray cvx
}
{ 
/proc2 exch cvlit def /proc1 exch cvlit def
/newproc proc1 length proc2 length add array def
newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval
newproc cvx
}ifelse
}bdf
/i{dup 0 eq
{pop df dup} 
{dup} ifelse 
/clipflatness xdf setflat
}bdf
version cvr 38.0 le
{/setrgbcolor{
currenttransfer exec 3 1 roll
currenttransfer exec 3 1 roll
currenttransfer exec 3 1 roll
setrgbcolor}bdf}if
/vms {/vmsv save def} bdf
/vmr {vmsv restore} bdf
/vmrs{vmsv restore /vmsv save def}bdf
/eomode{ 
{/filler /eofill load def /clipper /eoclip load def}
{/filler /fill load def /clipper /clip load def}
ifelse
}bdf
/normtaper{}bdf
/logtaper{9 mul 1 add log}bdf
/CD{
/NF exch def 
{ 
exch dup 
/FID ne 1 index/UniqueID ne and
{exch NF 3 1 roll put}
{pop pop}
ifelse
}forall 
NF
}bdf
/MN{
1 index length 
/Len exch def 
dup length Len add 
string dup 
Len 
4 -1 roll 
putinterval 
dup 
0 
4 -1 roll 
putinterval 
}bdf
/RC{4 -1 roll /ourvec xdf 256 string cvs(|______)anchorsearch
{1 index MN cvn/NewN exch def cvn
findfont dup maxlength dict CD dup/FontName NewN put dup
/Encoding ourvec put NewN exch definefont pop}{pop}ifelse}bdf
/RF{ 
dup 
FontDirectory exch 
known 
{pop 3 -1 roll pop} 
{RC}
ifelse
}bdf
/FF{dup 256 string cvs(|______)exch MN cvn dup FontDirectory exch known
{exch pop findfont 3 -1 roll pop}
{pop dup findfont dup maxlength dict CD dup dup
/Encoding exch /Encoding get 256 array copy 7 -1 roll 
{3 -1 roll dup 4 -2 roll put}forall put definefont}
ifelse}bdf
/RCJ{4 -1 roll 
/ourvec xdf 
256 string cvs 
(|______) anchorsearch
{pop 
cvn 
dup FDFJ 
exch 
1 index 
eq 
{
_bfh findfont _efh 
dup 
maxlength dict 
CD 
dup 
/FontName 
3 index 
put 
dup 
/Encoding ourvec put 
1 index 
exch 
definefont 
pop 
}
{exch pop} 
ifelse
}
{pop} 
ifelse
}bdf
/RFJ{ 
dup 
FontDirectory exch 
known 
{pop 3 -1 roll pop} 
{RCJ} 
ifelse
}bdf
/hasfont
{
/resourcestatus where 
{
pop 
/Font resourcestatus
{ 
pop pop true
}
{ 
false
}
ifelse
}
{
dup FontDirectory exch known
{pop true}
{
256 string
cvs
(fonts/) exch MN
status
{pop pop pop pop true}
{false}
ifelse
}
ifelse
}
ifelse
}bdf
/FDFJ
{
dup 
hasfont 
not 
{ 
pop
/Ryumin-Light-83pv-RKSJ-H
hasfont 
{
/Ryumin-Light-83pv-RKSJ-H
}
{
/Courier
}
ifelse 
}
if
}bdf
/FFJ{
_bfh
dup 
256 string cvs 
(|______)exch MN 
cvn 
dup 
FontDirectory
exch known 
{ 
exch 
pop 
findfont 
3 -1 roll 
pop 
}
{ 
pop 
FDFJ 
dup findfont 
dup maxlength dict 
CD 
dup dup 
/Encoding exch 
/Encoding get 
dup length 256 eq
{
256 array copy 
7 -1 roll 
{ 
3 -1 roll 
dup 
4 -2 roll 
put 
}forall
put 
definefont 
}
{
7 -1 roll pop 
pop pop pop pop 
findfont
}
ifelse
}
ifelse
_efh
}bdf
/GS {
dup 
hasfont 
{
findfont
exch makesetfont
exch
pop
ts
}
{
pop pop pop
ts
} ifelse
} bdf
/RCK{4 -1 roll 
/ourvec xdf 
256 string cvs 
(|______) anchorsearch
{pop 
cvn 
dup FDFK 
exch 
1 index 
eq 
{
_bfh findfont _efh 
dup 
maxlength dict 
CD 
dup 
/FontName 
3 index 
put 
dup 
/Encoding ourvec put 
1 index 
exch 
definefont 
pop 
}
{exch pop} 
ifelse
}
{pop} 
ifelse
}bdf
/RFK{ 
dup 
FontDirectory exch 
known 
{pop 3 -1 roll pop} 
{RCK} 
ifelse
}bdf
/hasfont
{
/resourcestatus where 
{
pop 
/Font resourcestatus
{ 
pop pop true
}
{ 
false
}
ifelse
}
{
dup FontDirectory exch known
{pop true}
{
256 string
cvs
(fonts/) exch MN
status
{pop pop pop pop true}
{false}
ifelse
}
ifelse
}
ifelse
}bdf
/FDFK
{
dup 
hasfont 
not 
{ 
pop
/JCsm
hasfont 
{
/JCsm
}
{
/Courier
}
ifelse 
}
if
}bdf
/FFK{
_bfh
dup 
256 string cvs 
(|______)exch MN 
cvn 
dup 
FontDirectory
exch known 
{ 
exch 
pop 
findfont 
3 -1 roll 
pop 
}
{ 
pop 
FDFK 
dup findfont 
dup maxlength dict 
CD 
dup dup 
/Encoding exch 
/Encoding get 
256 array copy 
7 -1 roll 
{ 
3 -1 roll 
dup 
4 -2 roll 
put 
}forall
put 
definefont 
}
ifelse
_efh
}bdf
/RCTC{4 -1 roll 
/ourvec xdf 
256 string cvs 
(|______) anchorsearch
{pop 
cvn 
dup FDFTC 
exch 
1 index 
eq 
{
_bfh findfont _efh 
dup 
maxlength dict 
CD 
dup 
/FontName 
3 index 
put 
dup 
/Encoding ourvec put 
1 index 
exch 
definefont 
pop 
}
{exch pop} 
ifelse
}
{pop} 
ifelse
}bdf
/RFTC{ 
dup 
FontDirectory exch 
known 
{pop 3 -1 roll pop} 
{RCTC} 
ifelse
}bdf
/FDFTC
{
dup 
hasfont 
not 
{ 
pop
/DFMing-Lt-HK-BF
hasfont 
{
/DFMing-Lt-HK-BF
}
{
/Courier
}
ifelse 
}
if
}bdf
/FFTC{
_bfh
dup 
256 string cvs 
(|______)exch MN 
cvn 
dup 
FontDirectory
exch known 
{ 
exch 
pop 
findfont 
3 -1 roll 
pop 
}
{ 
pop 
FDFTC 
dup findfont 
dup maxlength dict 
CD 
dup dup 
/Encoding exch 
/Encoding get 
256 array copy 
7 -1 roll 
{ 
3 -1 roll 
dup 
4 -2 roll 
put 
}forall
put 
definefont 
}
ifelse
_efh
}bdf
/RCSC{4 -1 roll 
/ourvec xdf 
256 string cvs 
(|______) anchorsearch
{pop 
cvn 
dup FDFSC 
exch 
1 index 
eq 
{
_bfh findfont _efh 
dup 
maxlength dict 
CD 
dup 
/FontName 
3 index 
put 
dup 
/Encoding ourvec put 
1 index 
exch 
definefont 
pop 
}
{exch pop} 
ifelse
}
{pop} 
ifelse
}bdf
/RFSC{ 
dup 
FontDirectory exch 
known 
{pop 3 -1 roll pop} 
{RCSC} 
ifelse
}bdf
/FDFSC
{
dup 
hasfont 
not 
{ 
pop
/zh-gbscript-1.11
hasfont 
{
/zh-gbscript-1.11
}
{
/Courier
}
ifelse 
}
if
}bdf
/FFSC{
_bfh
dup 
256 string cvs 
(|______)exch MN 
cvn 
dup 
FontDirectory
exch known 
{ 
exch 
pop 
findfont 
3 -1 roll 
pop 
}
{ 
pop 
FDFSC 
dup findfont 
dup maxlength dict 
CD 
dup dup 
/Encoding exch 
/Encoding get 
256 array copy 
7 -1 roll 
{ 
3 -1 roll 
dup 
4 -2 roll 
put 
}forall
put 
definefont 
}
ifelse
_efh
}bdf
/fps{
currentflat 
exch 
dup 0 le{pop 1}if 
{
dup setflat 3 index stopped
{1.3 mul dup 3 index gt{pop setflat pop pop stop}if} 
{exit} 
ifelse
}loop 
pop setflat pop pop
}bdf
/fp{100 currentflat fps}bdf
/clipper{clip}bdf 
/W{/clipper load 100 clipflatness dup setflat fps}bdf

userdict begin /BDFontDict 29 dict def end
BDFontDict begin
/bu{}def
/bn{}def
/setTxMode{av 70 ge{pop}if pop}def
/gm{m}def
/show{pop}def
/gr{pop}def
/fnt{pop pop pop}def
/fs{pop}def
/fz{pop}def
/lin{pop pop}def
/:M {pop pop} def
/sf {pop} def
/S {pop} def
/@b {pop pop pop pop pop pop pop pop} def
/_bdsave /save load def
/_bdrestore /restore load def
/save { dup /fontsave eq {null} {_bdsave} ifelse } def
/restore { dup null eq { pop } { _bdrestore } ifelse } def
/fontsave null def
end
/MacVec 256 array def 
MacVec 0 /Helvetica findfont
/Encoding get 0 128 getinterval putinterval
MacVec 127 /DEL put MacVec 16#27 /quotesingle put MacVec 16#60 /grave put
/NUL/SOH/STX/ETX/EOT/ENQ/ACK/BEL/BS/HT/LF/VT/FF/CR/SO/SI
/DLE/DC1/DC2/DC3/DC4/NAK/SYN/ETB/CAN/EM/SUB/ESC/FS/GS/RS/US
MacVec 0 32 getinterval astore pop
/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
/registered/copyright/trademark/acute/dieresis/notequal/AE/Oslash
/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash 
/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
/guillemotright/ellipsis/nbspace/Agrave/Atilde/Otilde/OE/oe
/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
/daggerdbl/periodcentered/quotesinglbase/quotedblbase
/perthousand/Acircumflex/Ecircumflex/Aacute
/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex
/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
MacVec 128 128 getinterval astore pop
/findheaderfont {
/Helvetica findfont 
} def
end %. AltsysDict
%%EndResource
%%EndProlog

%%BeginSetup

AltsysDict begin
_bfh 

_efh 
end %. AltsysDict

%%EndSetup
AltsysDict begin 

/onlyk4{false}ndf
/ccmyk{dup 5 -1 roll sub 0 max exch}ndf
/cmyk2gray{
4 -1 roll 0.3 mul 4 -1 roll 0.59 mul 4 -1 roll 0.11 mul
add add add 1 min neg 1 add
}bdf
/setcmykcolor{1 exch sub ccmyk ccmyk ccmyk pop setrgbcolor}ndf
/maxcolor { 
max max max 
} ndf
/maxspot {
pop
} ndf
/setcmykcoloroverprint{4{dup -1 eq{pop 0}if 4 1 roll}repeat setcmykcolor}ndf
/findcmykcustomcolor{5 packedarray}ndf
/setcustomcolor{exch aload pop pop 4{4 index mul 4 1 roll}repeat setcmykcolor pop}ndf
/setseparationgray{setgray}ndf
/setoverprint{pop}ndf 
/currentoverprint false ndf
/cmykbufs2gray{
0 1 2 index length 1 sub
{ 
4 index 1 index get 0.3 mul 
4 index 2 index get 0.59 mul 
4 index 3 index get 0.11 mul 
4 index 4 index get 
add add add cvi 255 min
255 exch sub
2 index 3 1 roll put
}for
4 1 roll pop pop pop
}bdf
/colorimage{
pop pop
[
5 -1 roll/exec cvx 
6 -1 roll/exec cvx 
7 -1 roll/exec cvx 
8 -1 roll/exec cvx
/cmykbufs2gray cvx
]cvx 
image
}
%. version 47.1 on Linotronic of Postscript defines colorimage incorrectly (rgb model only)
version cvr 47.1 le 
statusdict /product get (Lino) anchorsearch{pop pop true}{pop false}ifelse
and{userdict begin bdf end}{ndf}ifelse
fhnumcolors 1 ne {/yt save def} if
/customcolorimage{
aload pop
(_vc_Registration) eq 
{
pop pop pop pop separationimage
}
{
/ik xdf /iy xdf /im xdf /ic xdf
ic im iy ik cmyk2gray /xt xdf
currenttransfer
{dup 1.0 exch sub xt mul add}concatprocs
st 
image
}
ifelse
}ndf
fhnumcolors 1 ne {yt restore} if
fhnumcolors 3 ne {/yt save def} if
/customcolorimage{
aload pop 
(_vc_Registration) eq 
{
pop pop pop pop separationimage
}
{
/ik xdf /iy xdf /im xdf /ic xdf
1.0 dup ic ik add min sub 
1.0 dup im ik add min sub 
1.0 dup iy ik add min sub 
/ic xdf /iy xdf /im xdf
currentcolortransfer
4 1 roll 
{dup 1.0 exch sub ic mul add}concatprocs 4 1 roll 
{dup 1.0 exch sub iy mul add}concatprocs 4 1 roll 
{dup 1.0 exch sub im mul add}concatprocs 4 1 roll 
setcolortransfer
{/dummy xdf dummy}concatprocs{dummy}{dummy}true 3 colorimage
}
ifelse
}ndf
fhnumcolors 3 ne {yt restore} if
fhnumcolors 4 ne {/yt save def} if
/customcolorimage{
aload pop
(_vc_Registration) eq 
{
pop pop pop pop separationimage
}
{
/ik xdf /iy xdf /im xdf /ic xdf
currentcolortransfer
{1.0 exch sub ik mul ik sub 1 add}concatprocs 4 1 roll
{1.0 exch sub iy mul iy sub 1 add}concatprocs 4 1 roll
{1.0 exch sub im mul im sub 1 add}concatprocs 4 1 roll
{1.0 exch sub ic mul ic sub 1 add}concatprocs 4 1 roll
setcolortransfer
{/dummy xdf dummy}concatprocs{dummy}{dummy}{dummy}
true 4 colorimage
}
ifelse
}ndf
fhnumcolors 4 ne {yt restore} if
/separationimage{image}ndf
/spotascmyk false ndf
/newcmykcustomcolor{6 packedarray}ndf
/inkoverprint false ndf
/setinkoverprint{pop}ndf 
/setspotcolor { 
spots exch get
dup 4 get (_vc_Registration) eq
{pop 1 exch sub setseparationgray}
{0 5 getinterval exch setcustomcolor}
ifelse
}ndf
/currentcolortransfer{currenttransfer dup dup dup}ndf
/setcolortransfer{st pop pop pop}ndf
/fas{}ndf
/sas{}ndf
/fhsetspreadsize{pop}ndf
/filler{fill}bdf 
/F{gsave {filler}fp grestore}bdf
/f{closepath F}bdf
/S{gsave {stroke}fp grestore}bdf
/s{closepath S}bdf
userdict /islevel2
systemdict /languagelevel known dup
{
pop systemdict /languagelevel get 2 ge
} if
put
islevel2 not
{
/currentcmykcolor
{
0 0 0 1 currentgray sub
} ndf
} if
/tc
{
gsave
setcmykcolor currentcmykcolor
grestore
} bind def
/testCMYKColorThrough
{
tc add add add 0 ne
} bind def
/fhiscomposite where not {
userdict /fhiscomposite
islevel2
{
gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore
add add add 4 eq
}
{
1 0 0 0 testCMYKColorThrough
0 1 0 0 testCMYKColorThrough
0 0 1 0 testCMYKColorThrough
0 0 0 1 testCMYKColorThrough
and and and
} ifelse
put
}
{ pop }
ifelse
/bc4 [0 0 0 0] def 
/_lfp4 {
1 pop 
/yt xdf 
/xt xdf 
/ang xdf 
storerect
/taperfcn xdf
/k2 xdf /y2 xdf /m2 xdf /c2 xdf
/k1 xdf /y1 xdf /m1 xdf /c1 xdf
c1 c2 sub abs
m1 m2 sub abs
y1 y2 sub abs
k1 k2 sub abs
maxcolor 
calcgraysteps mul abs round 
height abs adjnumsteps 
dup 1 lt {pop 1} if 
1 sub /numsteps1 xdf
currentflat mark 
currentflat clipflatness 
/delta top bottom sub numsteps1 1 add div def 
/right right left sub def 
/botsv top delta sub def 
{
{
W
xt yt translate 
ang rotate
xt neg yt neg translate 
dup setflat 
/bottom botsv def
0 1 numsteps1 
{
numsteps1 dup 0 eq {pop pop 0.5} {div} ifelse 
taperfcn /frac xdf
bc4 0 c2 c1 sub frac mul c1 add put
bc4 1 m2 m1 sub frac mul m1 add put
bc4 2 y2 y1 sub frac mul y1 add put
bc4 3 k2 k1 sub frac mul k1 add put
bc4 vc
1 index setflat 
{ 
mark {newpath left bottom right delta rectfill}stopped
{cleartomark exch 1.3 mul dup setflat exch 2 copy gt{stop}if}
{cleartomark exit}ifelse
}loop
/bottom bottom delta sub def
}for
}
gsave stopped grestore
{exch pop 2 index exch 1.3 mul dup 100 gt{cleartomark setflat stop}if}
{exit}ifelse
}loop
cleartomark setflat
}bdf
/bcs [0 0] def 
/_lfs4 {
/yt xdf 
/xt xdf 
/ang xdf 
storerect
/taperfcn xdf
/tint2 xdf 
/tint1 xdf 
bcs exch 1 exch put 
tint1 tint2 sub abs 
bcs 1 get maxspot 
calcgraysteps mul abs round 
height abs adjnumsteps 
dup 2 lt {pop 2} if 
1 sub /numsteps1 xdf
currentflat mark 
currentflat clipflatness 
/delta top bottom sub numsteps1 1 add div def 
/right right left sub def 
/botsv top delta sub def 
{
{
W
xt yt translate 
ang rotate
xt neg yt neg translate 
dup setflat 
/bottom botsv def
0 1 numsteps1 
{
numsteps1 div taperfcn /frac xdf
bcs 0
1.0 tint2 tint1 sub frac mul tint1 add sub
put bcs vc
1 index setflat 
{ 
mark {newpath left bottom right delta rectfill}stopped
{cleartomark exch 1.3 mul dup setflat exch 2 copy gt{stop}if}
{cleartomark exit}ifelse
}loop
/bottom bottom delta sub def
}for
}
gsave stopped grestore
{exch pop 2 index exch 1.3 mul dup 100 gt{cleartomark setflat stop}if}
{exit}ifelse
}loop
cleartomark setflat
}bdf
/_rfs6 {
/tint2 xdf 
/tint1 xdf 
bcs exch 1 exch put 
/inrad xdf 
/radius xdf 
/yt xdf 
/xt xdf 
tint1 tint2 sub abs 
bcs 1 get maxspot 
calcgraysteps mul abs round 
radius inrad sub abs 
adjnumsteps 
dup 1 lt {pop 1} if 
1 sub /numsteps1 xdf
radius inrad sub numsteps1 dup 0 eq {pop} {div} ifelse 
2 div /halfstep xdf 
currentflat mark 
currentflat clipflatness 
{
{
dup setflat 
W 
0 1 numsteps1 
{
dup /radindex xdf
numsteps1 dup 0 eq {pop pop 0.5} {div} ifelse 
/frac xdf
bcs 0
tint2 tint1 sub frac mul tint1 add
put bcs vc
1 index setflat 
{ 
newpath mark 
xt yt radius inrad sub 1 frac sub mul halfstep add inrad add 0 360
{ arc
radindex numsteps1 ne 
inrad 0 gt or 
{
xt yt 
numsteps1 0 eq
{ inrad } 
{ 
radindex 1 add numsteps1 div 1 exch sub
radius inrad sub mul halfstep add inrad add
}ifelse
dup xt add yt moveto
360 0 arcn 
} if
fill
}stopped
{cleartomark exch 1.3 mul dup setflat exch 2 copy gt{stop}if}
{cleartomark exit}ifelse
}loop
}for
}
gsave stopped grestore
{exch pop 2 index exch 1.3 mul dup 100 gt{cleartomark setflat stop}if}
{exit}ifelse
}loop
cleartomark setflat
}bdf
/_rfp6 {
1 pop 
/k2 xdf /y2 xdf /m2 xdf /c2 xdf
/k1 xdf /y1 xdf /m1 xdf /c1 xdf
/inrad xdf 
/radius xdf 
/yt xdf 
/xt xdf 
c1 c2 sub abs
m1 m2 sub abs
y1 y2 sub abs
k1 k2 sub abs
maxcolor 
calcgraysteps mul abs round 
radius inrad sub abs 
adjnumsteps 
dup 1 lt {pop 1} if 
1 sub /numsteps1 xdf
radius inrad sub numsteps1 dup 0 eq {pop} {div} ifelse 
2 div /halfstep xdf 
currentflat mark 
currentflat clipflatness 
{
{
dup setflat 
W 
0 1 numsteps1 
{
dup /radindex xdf
numsteps1 dup 0 eq {pop pop 0.5} {div} ifelse 
/frac xdf
bc4 0 c2 c1 sub frac mul c1 add put
bc4 1 m2 m1 sub frac mul m1 add put
bc4 2 y2 y1 sub frac mul y1 add put
bc4 3 k2 k1 sub frac mul k1 add put
bc4 vc
1 index setflat 
{ 
newpath mark 
xt yt radius inrad sub 1 frac sub mul halfstep add inrad add 0 360
{ arc
radindex numsteps1 ne 
inrad 0 gt or 
{
xt yt 
numsteps1 0 eq
{ inrad } 
{ 
radindex 1 add numsteps1 div 1 exch sub
radius inrad sub mul halfstep add inrad add
}ifelse
dup xt add yt moveto
360 0 arcn 
} if
fill
}stopped
{cleartomark exch 1.3 mul dup setflat exch 2 copy gt{stop}if}
{cleartomark exit}ifelse
}loop
}for
}
gsave stopped grestore
{exch pop 2 index exch 1.3 mul dup 100 gt{cleartomark setflat stop}if}
{exit}ifelse
}loop
cleartomark setflat
}bdf
/lfp4{_lfp4}ndf
/lfs4{_lfs4}ndf
/rfs6{_rfs6}ndf
/rfp6{_rfp6}ndf
/cvc [0 0 0 1] def 
/vc{
AltsysDict /cvc 2 index put 
aload length dup 4 eq
{pop dup -1 eq{pop setrgbcolor}{setcmykcolor}ifelse}
{6 eq {sethexcolor} {setspotcolor} ifelse }
ifelse
}bdf 
0 setseparationgray
/imgr {1692 1570.11 2287.28 2412 } def 
/bleed 0 def 
/clpr {1692 1570.11 2287.28 2412 } def 
/xs 1 def 
/ys 1 def 
/botx 0 def 
/overlap 0 def 
/wdist 18 def 
0 2 mul fhsetspreadsize 
0 0 ne {/df 0 def /clipflatness 0 def} if 
/maxsteps 256 def 
/forcemaxsteps false def 
/minsteps 0 def 

userdict begin /AGDOrigMtx matrix currentmatrix def end 
vms
-1879 -1961 translate

/currentpacking defed{false setpacking}if 
/spots[

1 0 0 0 (Process Cyan) false newcmykcustomcolor

0 1 0 0 (Process Magenta) false newcmykcustomcolor

0 0 1 0 (Process Yellow) false newcmykcustomcolor

0 0 0 1 (Process Black) false newcmykcustomcolor
]def
n
[] 0 d
3.863708 M
1 w
0 j
0 J
false setoverprint
0 i
false eomode
[0 0 0 1]vc
vms
true eomode
1917.6518 2011.5206 m
1917.8345 2011.4315 1918.0684 2011.508 1918.1599 2011.6957 C
1918.2514 2011.8833 1918.1679 2012.1147 1917.9851 2012.2038 C
1917.7976 2012.2953 1917.5686 2012.2164 1917.477 2012.0288 C
1917.3854 2011.8411 1917.4642 2011.6121 1917.6518 2011.5206 C
h
1918.4453 2013.1469 m
1918.6281 2013.0577 1918.8619 2013.1343 1918.9534 2013.3219 C
1919.045 2013.5096 1918.9614 2013.741 1918.7787 2013.8301 C
1918.5911 2013.9216 1918.3621 2013.8427 1918.2705 2013.655 C
1918.1789 2013.4674 1918.2577 2013.2384 1918.4453 2013.1469 C
[0 0 0 0.65]vc
true setoverprint
f 
false setoverprint
n
1898.0857 1976.373 m
1898.0857 1976.373 1900.1913 1974.5601 1908.0703 1974.5601 C
1915.9492 1974.5601 1918.2697 1976.2212 1918.2697 1976.2212 C
1918.2697 1974.7142 L
1918.2697 1974.7142 1915.9492 1973.053 1908.0703 1973.053 C
1900.1913 1973.053 1898.0857 1974.8659 1898.0857 1974.8659 C
1898.0857 1976.373 L
0.6153 w
3.863693 M
s 
n
0.4615 w
[1 0.6 0 0.05]vc
S 
n
0.3606 w
1 J
1 j
S 
n
S 
n
S 
n
S 
n
S 
n
S 
n
S 
n
0.2909 w
0 J
0 j
[0 0 0 0.7]vc
true setoverprint
S 
false setoverprint
n
1924.7289 1973.2233 m
1924.7289 1973.7124 1925.1254 1974.1089 1925.6145 1974.1089 C
1926.1036 1974.1089 1926.5001 1973.7124 1926.5001 1973.2233 C
1926.5001 1972.7341 1926.1036 1972.3376 1925.6145 1972.3376 C
1925.1254 1972.3376 1924.7289 1972.7341 1924.7289 1973.2233 C
1 J
[0 0 0 0.65]vc
s 
n
1920.2284 1969.6207 m
1920.2284 1970.1098 1920.6249 1970.5063 1921.114 1970.5063 C
1921.6031 1970.5063 1921.9997 1970.1098 1921.9997 1969.6207 C
1921.9997 1969.1316 1921.6031 1968.7351 1921.114 1968.7351 C
1920.6249 1968.7351 1920.2284 1969.1316 1920.2284 1969.6207 C
s 
n
false eomode
1906.6476 1991.1576 m
1906.6476 1991.3337 1906.7903 1991.4764 1906.9664 1991.4764 C
1907.1424 1991.4764 1907.2852 1991.3337 1907.2852 1991.1576 C
1907.2852 1990.9815 1907.1424 1990.8388 1906.9664 1990.8388 C
1906.7903 1990.8388 1906.6476 1990.9815 1906.6476 1991.1576 C
f 
n
1907.1563 1990.6794 m
1907.1563 1990.8555 1907.299 1990.9982 1907.4751 1990.9982 C
1907.6512 1990.9982 1907.7939 1990.8555 1907.7939 1990.6794 C
1907.7939 1990.5033 1907.6512 1990.3606 1907.4751 1990.3606 C
1907.299 1990.3606 1907.1563 1990.5033 1907.1563 1990.6794 C
f 
n
1907.665 1990.2012 m
1907.665 1990.3772 1907.8077 1990.52 1907.9838 1990.52 C
1908.1599 1990.52 1908.3026 1990.3772 1908.3026 1990.2012 C
1908.3026 1990.0251 1908.1599 1989.8824 1907.9838 1989.8824 C
1907.8077 1989.8824 1907.665 1990.0251 1907.665 1990.2012 C
f 
n
1908.0703 1989.5954 m
1908.0703 1989.7715 1908.213 1989.9142 1908.3891 1989.9142 C
1908.5651 1989.9142 1908.7079 1989.7715 1908.7079 1989.5954 C
1908.7079 1989.4193 1908.5651 1989.2766 1908.3891 1989.2766 C
1908.213 1989.2766 1908.0703 1989.4193 1908.0703 1989.5954 C
f 
n
1908.2522 1988.8635 m
1908.2522 1989.0396 1908.395 1989.1823 1908.5711 1989.1823 C
1908.7471 1989.1823 1908.8899 1989.0396 1908.8899 1988.8635 C
1908.8899 1988.6874 1908.7471 1988.5446 1908.5711 1988.5446 C
1908.395 1988.5446 1908.2522 1988.6874 1908.2522 1988.8635 C
f 
n
1908.3068 1988.1954 m
1908.3068 1988.3714 1908.4495 1988.5142 1908.6256 1988.5142 C
1908.8017 1988.5142 1908.9444 1988.3714 1908.9444 1988.1954 C
1908.9444 1988.0193 1908.8017 1987.8766 1908.6256 1987.8766 C
1908.4495 1987.8766 1908.3068 1988.0193 1908.3068 1988.1954 C
f 
n
1908.2019 1987.4315 m
1908.2019 1987.6076 1908.3446 1987.7504 1908.5207 1987.7504 C
1908.6968 1987.7504 1908.8395 1987.6076 1908.8395 1987.4315 C
1908.8395 1987.2555 1908.6968 1987.1127 1908.5207 1987.1127 C
1908.3446 1987.1127 1908.2019 1987.2555 1908.2019 1987.4315 C
f 
n
vmrs
1908.0969 1986.6678 m
1908.0969 1986.8439 1908.2397 1986.9866 1908.4157 1986.9866 C
1908.5918 1986.9866 1908.7346 1986.8439 1908.7346 1986.6678 C
1908.7346 1986.4917 1908.5918 1986.349 1908.4157 1986.349 C
1908.2397 1986.349 1908.0969 1986.4917 1908.0969 1986.6678 C
[0 0 0 0.65]vc
f 
n
1908.6934 1987.0503 m
1908.6934 1987.2264 1908.8362 1987.3692 1909.0123 1987.3692 C
1909.1883 1987.3692 1909.3311 1987.2264 1909.3311 1987.0503 C
1909.3311 1986.8743 1909.1883 1986.7315 1909.0123 1986.7315 C
1908.8362 1986.7315 1908.6934 1986.8743 1908.6934 1987.0503 C
f 
n
1909.0986 1987.6242 m
1909.0986 1987.8003 1909.2414 1987.9431 1909.4175 1987.9431 C
1909.5936 1987.9431 1909.7363 1987.8003 1909.7363 1987.6242 C
1909.7363 1987.4482 1909.5936 1987.3054 1909.4175 1987.3054 C
1909.2414 1987.3054 1909.0986 1987.4482 1909.0986 1987.6242 C
f 
n
1909.472 1988.2924 m
1909.472 1988.4685 1909.6147 1988.6112 1909.7908 1988.6112 C
1909.9669 1988.6112 1910.1096 1988.4685 1910.1096 1988.2924 C
1910.1096 1988.1163 1909.9669 1987.9736 1909.7908 1987.9736 C
1909.6147 1987.9736 1909.472 1988.1163 1909.472 1988.2924 C
f 
n
1909.8453 1988.9605 m
1909.8453 1989.1366 1909.9881 1989.2794 1910.1641 1989.2794 C
1910.3402 1989.2794 1910.4829 1989.1366 1910.4829 1988.9605 C
1910.4829 1988.7844 1910.3402 1988.6417 1910.1641 1988.6417 C
1909.9881 1988.6417 1909.8453 1988.7844 1909.8453 1988.9605 C
f 
n
1910.0274 1989.6924 m
1910.0274 1989.8685 1910.1701 1990.0113 1910.3462 1990.0113 C
1910.5222 1990.0113 1910.665 1989.8685 1910.665 1989.6924 C
1910.665 1989.5164 1910.5222 1989.3736 1910.3462 1989.3736 C
1910.1701 1989.3736 1910.0274 1989.5164 1910.0274 1989.6924 C
f 
n
1910.0818 1990.3606 m
1910.0818 1990.5367 1910.2246 1990.6794 1910.4007 1990.6794 C
1910.5767 1990.6794 1910.7195 1990.5367 1910.7195 1990.3606 C
1910.7195 1990.1845 1910.5767 1990.0418 1910.4007 1990.0418 C
1910.2246 1990.0418 1910.0818 1990.1845 1910.0818 1990.3606 C
f 
n
1909.9769 1991.1244 m
1909.9769 1991.3005 1910.1196 1991.4432 1910.2957 1991.4432 C
1910.4718 1991.4432 1910.6145 1991.3005 1910.6145 1991.1244 C
1910.6145 1990.9483 1910.4718 1990.8056 1910.2957 1990.8056 C
1910.1196 1990.8056 1909.9769 1990.9483 1909.9769 1991.1244 C
f 
n
1892.8095 1998.7969 m
1897.9494 1998.7969 L
1897.9494 1997.0398 L
1892.8095 1997.0398 L
1892.8095 1998.7969 L
0.5111 w
3.863693 M
s 
n
1899.4511 1995.0723 m
1899.4285 1991.8058 1899.541 1990.1024 1899.8303 1986.7047 C
1900.195 1982.4207 1900.4924 1981.1311 1901.2464 1977.629 C
0.3452 w
1 J
1 j
S 
n
1898.939 1995.8353 m
1898.8362 1990.3351 1899.0418 1986.9326 1899.0932 1982.8203 C
1899.1469 1978.5212 1899.2474 1978.8108 1899.6586 1977.4229 C
S 
n
1916.2641 1987.6162 m
1915.9731 1982.2966 1914.9727 1977.9751 1914.3066 1977.4965 C
S 
n
1917.4089 1987.9072 m
1917.1179 1982.5876 1916.8678 1978.5066 1916.2445 1977.1103 C
S 
n
1893.0696 1969.918 m
1893.0696 1970.4071 1893.4661 1970.8036 1893.9552 1970.8036 C
1894.4443 1970.8036 1894.8409 1970.4071 1894.8409 1969.918 C
1894.8409 1969.4289 1894.4443 1969.0324 1893.9552 1969.0324 C
1893.4661 1969.0324 1893.0696 1969.4289 1893.0696 1969.918 C
0.2909 w
0 j
s 
n
1888.9559 1973.3524 m
1888.9559 1973.8415 1889.3524 1974.2381 1889.8415 1974.2381 C
1890.3306 1974.2381 1890.7272 1973.8415 1890.7272 1973.3524 C
1890.7272 1972.8633 1890.3306 1972.4668 1889.8415 1972.4668 C
1889.3524 1972.4668 1888.9559 1972.8633 1888.9559 1973.3524 C
s 
n
1907.8896 1997.2056 m
1906.5505 1996.5236 L
1906.3564 1995.7392 1906.2587 1995.2934 1906.1069 1994.4998 C
1906.0121 1994.0039 1905.6365 1993.6638 1905.8851 1993.2244 C
1906.0019 1993.0181 1906.1136 1992.9083 1906.3287 1992.8086 C
1906.5938 1992.6858 1906.7976 1992.6966 1907.0773 1992.7809 C
1907.2956 1992.8467 1907.4336 1992.908 1907.5763 1993.0858 C
1907.7821 1993.3423 1907.7072 1993.5888 1907.7149 1993.9176 C
1907.7285 1994.4944 1907.06 1995.0527 1907.3822 1995.3592 C
1907.9557 1995.9046 1908.1005 1996.4766 1907.8896 1997.2056 C
0.3606 w
0 J
1 M
s 
n
1911.1042 1995.7737 m
1911.136 1995.0723 1911.678 1994.9179 1911.678 1994.3403 C
1911.678 1993.7359 1911.7302 1993.784 1911.5824 1993.4809 C
1911.4667 1993.2437 1911.3613 1993.1097 1911.136 1992.9722 C
1910.806 1992.7706 1910.5117 1992.7421 1910.1491 1992.8765 C
3.863693 M
S 
n
1907.3808 1993.004 m
1907.4498 1992.7388 1907.4641 1992.5774 1907.4432 1992.3041 C
1907.4186 1991.9824 1907.3665 1991.7952 1907.2215 1991.507 C
0.4615 w
S 
n
vmrs
1909.9374 1992.7693 m
1909.98 1992.3278 1909.963 1992.0667 1909.8635 1991.6345 C
1909.7895 1991.313 1909.7248 1991.1335 1909.5766 1990.8388 C
0.4615 w
3.863693 M
[0 0 0 0.65]vc
S 
n
1908.0719 1997.1487 m
1908.693 1997.2683 1909.0541 1997.2999 1909.6859 1997.2899 C
1910.2214 1997.2815 1910.5259 1997.25 1911.0517 1997.1487 C
1911.143 1996.7683 1911.1593 1996.5375 1911.1223 1996.148 C
1911.1095 1996.0124 1911.0978 1995.936 1911.0695 1995.8028 C
1911.1637 1995.3595 1911.1594 1995.0811 1911.0517 1994.641 C
1910.9566 1994.2519 1910.8053 1994.0639 1910.616 1993.7109 C
1910.4785 1993.4545 1910.395 1993.3126 1910.2378 1993.0678 C
1910.1418 1992.9099 1910.0585 1992.8289 1909.8978 1992.7377 C
1909.5823 1992.5587 1909.2832 1992.5587 1908.9677 1992.7377 C
1908.3713 1993.0299 1907.9123 1993.7699 1907.6073 1994.2905 C
0.3606 w
S 
n
1908.3803 1996.1909 m
1909.5447 1996.2186 L
1909.4318 1995.8236 L
1908.5429 1995.7057 L
1908.3803 1996.1909 L
f 
n
1911.014 1996.2464 m
1910.1438 1996.266 L
1910.2378 1995.8859 L
1910.8755 1995.7473 L
1911.014 1996.2464 L
f 
n
1910.016 1996.1355 m
1910.016 1995.276 L
1910.1546 1994.9156 L
1909.9883 1994.7493 L
1910.2655 1994.6661 L
1910.2932 1995.8582 L
1910.2378 1996.1355 L
1910.016 1996.1355 L
f 
n
1910.3764 1994.1116 m
1909.2675 1994.1116 L
1909.4338 1993.8898 L
1909.711 1993.7512 L
1910.321 1993.7235 L
1910.3764 1994.1116 L
f 
n
1906.5214 1996.6331 m
1907.1263 1996.9682 1907.5029 1997.113 1908.1765 1997.2694 C
1909.2767 1997.5247 1909.9721 1997.5247 1911.0723 1997.2694 C
1911.2635 1998.2244 L
1910.1083 1998.5794 1909.3406 1998.6028 1908.1659 1998.3187 C
1907.3646 1998.1249 1906.9149 1997.9248 1906.2345 1997.4593 C
1906.5214 1996.6331 L
0.4615 w
s 
n
1906.0751 1997.5549 m
1904.7069 1998.9245 L
1905.0584 1999.2895 1905.4096 1999.428 1905.9157 1999.4013 C
1906.4372 1999.3738 1906.7849 1999.186 1907.0939 1998.765 C
1907.7621 1999.1796 L
1907.6692 1999.4766 1907.6539 1999.6671 1907.6983 1999.9752 C
1907.764 2000.4311 1908.2403 2001.0246 1908.2403 2001.0246 C
1908.2722 2001.0246 1908.9612 2000.7851 1909.2259 2000.4202 C
1909.4472 2000.115 1909.5222 1999.8739 1909.5128 1999.497 C
1910.3723 1999.4013 L
1910.4226 1999.8327 1910.5881 2000.1086 1910.9447 2000.3564 C
1911.4243 2000.6896 1911.9485 2000.7007 1912.4418 2000.3883 C
1912.084 1999.9519 1911.9055 1999.6808 1911.6462 1999.1796 C
1911.4901 1998.8779 1911.4322 1998.6933 1911.2955 1998.3825 C
S 
n
1907.6849 2001.7177 m
1906.6658 2004.6476 1906.0352 2007.2396 1908.0703 2007.3271 C
1910.6638 2007.4386 1910.2755 2005.1989 1909.0711 2001.6968 C
0.3606 w
1 J
1 j
S 
n
1909.828 2001.328 m
1910.5694 2004.0716 1910.9182 2006.9294 1912.888 2006.1543 C
1914.7722 2005.4128 1914.5638 2003.8833 1911.7613 2001.4629 C
S 
n
1912.3937 1998.417 m
1915.4285 1999.4181 1917.4937 2000.6349 1918.0669 1999.17 C
S 
n
1912.7464 2001.3139 m
1913.7711 2002.7164 1915.7733 2004.5061 1916.7035 2002.6361 C
1917.8196 2000.3924 1915.212 2000.1546 1912.9077 1999.4884 C
S 
n
1907.1116 2001.3992 m
1906.1105 2004.072 1905.2008 2006.9406 1903.7854 2006.3195 C
1901.8816 2005.4842 1902.5257 2004.138 1905.9651 2000.6986 C
S 
n
1903.7359 1998.8515 m
1900.7703 1999.9234 1899.2078 2000.9975 1898.4664 1999.3495 C
S 
n
1905.2645 2000.4438 m
1904.1831 2001.681 1900.8795 2005.5544 1899.8423 2002.9525 C
1898.9383 2000.6849 1901.7264 2000.5554 1903.927 1999.7432 C
S 
n
1904.2309 1969.5367 m
1902.5954 1970.5533 1901.0289 1970.9807 1899.7373 1972.1936 C
1899.1695 1972.7269 1899.035 1973.4066 1899.3053 1973.8732 C
0.3356 w
0 J
0 j
S 
n
vmrs
1906.77 1969.2618 m
1905.5617 1970.0819 1904.8547 1970.3569 1904.5845 1971.4514 C
1904.4447 1972.0177 1904.5452 1972.5079 1904.9725 1972.896 C
0.2909 w
1 J
1 j
3.863693 M
[0 0 0 0.65]vc
S 
n
1907.6687 1969.6939 m
1906.9271 1970.6318 1906.6928 1970.6351 1906.5736 1971.452 C
1906.4997 1971.9579 1906.7307 1972.5079 1907.1235 1972.7388 C
S 
n
1905.7141 1969.3796 m
1903.9953 1970.1998 1903.4098 1970.1859 1902.3156 1971.6484 C
1901.849 1972.2722 1901.8883 1972.5471 1902.1193 1973.1709 C
S 
n
1908.2021 1969.6939 m
1908.9437 1970.6318 1909.178 1970.6351 1909.2972 1971.452 C
1909.3711 1971.9579 1909.1401 1972.5079 1908.7473 1972.7388 C
S 
n
1908.7736 1969.2384 m
1910.1389 1969.8669 1911.1505 1970.5146 1911.4207 1971.6091 C
1911.5605 1972.1754 1911.5338 1972.4686 1911.1064 1972.8566 C
S 
n
1910.1567 1969.3796 m
1911.8756 1970.1998 1912.7478 1970.299 1913.8419 1971.7615 C
1914.3085 1972.3853 1914.4821 1972.621 1913.9597 1973.1316 C
S 
n
1911.6399 1969.5367 m
1913.2755 1970.5533 1914.662 1970.6271 1915.9536 1971.8401 C
1916.5214 1972.3734 1916.2631 1973.1709 1915.9929 1973.6375 C
S 
n
1894.1077 1971.3643 m
1894.1077 1971.5582 1894.2649 1971.7155 1894.4588 1971.7155 C
1894.6528 1971.7155 1894.81 1971.5582 1894.81 1971.3643 C
1894.81 1971.1704 1894.6528 1971.0132 1894.4588 1971.0132 C
1894.2649 1971.0132 1894.1077 1971.1704 1894.1077 1971.3643 C
f 
n
1894.9201 1970.3947 m
1894.9201 1970.5887 1895.0774 1970.7459 1895.2713 1970.7459 C
1895.4652 1970.7459 1895.6225 1970.5887 1895.6225 1970.3947 C
1895.6225 1970.2008 1895.4652 1970.0436 1895.2713 1970.0436 C
1895.0774 1970.0436 1894.9201 1970.2008 1894.9201 1970.3947 C
f 
n
1894.6637 1968.9015 m
1894.6637 1969.0954 1894.8209 1969.2526 1895.0148 1969.2526 C
1895.2088 1969.2526 1895.366 1969.0954 1895.366 1968.9015 C
1895.366 1968.7075 1895.2088 1968.5503 1895.0148 1968.5503 C
1894.8209 1968.5503 1894.6637 1968.7075 1894.6637 1968.9015 C
f 
n
1893.1073 1968.4771 m
1893.1073 1968.6711 1893.2645 1968.8283 1893.4584 1968.8283 C
1893.6524 1968.8283 1893.8096 1968.6711 1893.8096 1968.4771 C
1893.8096 1968.2832 1893.6524 1968.126 1893.4584 1968.126 C
1893.2645 1968.126 1893.1073 1968.2832 1893.1073 1968.4771 C
f 
n
1892.2532 1969.5622 m
1892.2532 1969.7561 1892.4104 1969.9134 1892.6044 1969.9134 C
1892.7983 1969.9134 1892.9555 1969.7561 1892.9555 1969.5622 C
1892.9555 1969.3683 1892.7983 1969.211 1892.6044 1969.211 C
1892.4104 1969.211 1892.2532 1969.3683 1892.2532 1969.5622 C
f 
n
1892.6252 1970.9615 m
1892.6252 1971.1554 1892.7824 1971.3126 1892.9763 1971.3126 C
1893.1703 1971.3126 1893.3275 1971.1554 1893.3275 1970.9615 C
1893.3275 1970.7675 1893.1703 1970.6103 1892.9763 1970.6103 C
1892.7824 1970.6103 1892.6252 1970.7675 1892.6252 1970.9615 C
f 
n
1889.994 1974.7987 m
1889.994 1974.9926 1890.1512 1975.1499 1890.3451 1975.1499 C
1890.539 1975.1499 1890.6963 1974.9926 1890.6963 1974.7987 C
1890.6963 1974.6048 1890.539 1974.4475 1890.3451 1974.4475 C
1890.1512 1974.4475 1889.994 1974.6048 1889.994 1974.7987 C
f 
n
1890.8064 1973.8291 m
1890.8064 1974.0231 1890.9636 1974.1803 1891.1576 1974.1803 C
1891.3515 1974.1803 1891.5087 1974.0231 1891.5087 1973.8291 C
1891.5087 1973.6352 1891.3515 1973.478 1891.1576 1973.478 C
1890.9636 1973.478 1890.8064 1973.6352 1890.8064 1973.8291 C
f 
n
1890.5499 1972.3359 m
1890.5499 1972.5298 1890.7072 1972.687 1890.9011 1972.687 C
1891.095 1972.687 1891.2523 1972.5298 1891.2523 1972.3359 C
1891.2523 1972.1419 1891.095 1971.9847 1890.9011 1971.9847 C
1890.7072 1971.9847 1890.5499 1972.1419 1890.5499 1972.3359 C
f 
n
1888.9936 1971.9115 m
1888.9936 1972.1055 1889.1508 1972.2627 1889.3447 1972.2627 C
1889.5387 1972.2627 1889.6959 1972.1055 1889.6959 1971.9115 C
1889.6959 1971.7176 1889.5387 1971.5604 1889.3447 1971.5604 C
1889.1508 1971.5604 1888.9936 1971.7176 1888.9936 1971.9115 C
f 
n
1888.1395 1972.9966 m
1888.1395 1973.1905 1888.2967 1973.3477 1888.4906 1973.3477 C
1888.6846 1973.3477 1888.8418 1973.1905 1888.8418 1972.9966 C
1888.8418 1972.8026 1888.6846 1972.6454 1888.4906 1972.6454 C
1888.2967 1972.6454 1888.1395 1972.8026 1888.1395 1972.9966 C
f 
n
1888.5115 1974.3959 m
1888.5115 1974.5898 1888.6687 1974.747 1888.8626 1974.747 C
1889.0566 1974.747 1889.2138 1974.5898 1889.2138 1974.3959 C
1889.2138 1974.2019 1889.0566 1974.0447 1888.8626 1974.0447 C
1888.6687 1974.0447 1888.5115 1974.2019 1888.5115 1974.3959 C
f 
n
vmrs
1921.2665 1971.0669 m
1921.2665 1971.2609 1921.4237 1971.4181 1921.6176 1971.4181 C
1921.8116 1971.4181 1921.9688 1971.2609 1921.9688 1971.0669 C
1921.9688 1970.873 1921.8116 1970.7158 1921.6176 1970.7158 C
1921.4237 1970.7158 1921.2665 1970.873 1921.2665 1971.0669 C
[0 0 0 0.65]vc
f 
n
1922.0789 1970.0974 m
1922.0789 1970.2913 1922.2361 1970.4485 1922.4301 1970.4485 C
1922.624 1970.4485 1922.7813 1970.2913 1922.7813 1970.0974 C
1922.7813 1969.9035 1922.624 1969.7462 1922.4301 1969.7462 C
1922.2361 1969.7462 1922.0789 1969.9035 1922.0789 1970.0974 C
f 
n
1921.8224 1968.6041 m
1921.8224 1968.798 1921.9797 1968.9553 1922.1736 1968.9553 C
1922.3676 1968.9553 1922.5248 1968.798 1922.5248 1968.6041 C
1922.5248 1968.4102 1922.3676 1968.253 1922.1736 1968.253 C
1921.9797 1968.253 1921.8224 1968.4102 1921.8224 1968.6041 C
f 
n
1920.2661 1968.1798 m
1920.2661 1968.3737 1920.4233 1968.531 1920.6172 1968.531 C
1920.8112 1968.531 1920.9684 1968.3737 1920.9684 1968.1798 C
1920.9684 1967.9859 1920.8112 1967.8287 1920.6172 1967.8287 C
1920.4233 1967.8287 1920.2661 1967.9859 1920.2661 1968.1798 C
f 
n
1919.412 1969.2649 m
1919.412 1969.4588 1919.5692 1969.616 1919.7632 1969.616 C
1919.9571 1969.616 1920.1144 1969.4588 1920.1144 1969.2649 C
1920.1144 1969.0709 1919.9571 1968.9137 1919.7632 1968.9137 C
1919.5692 1968.9137 1919.412 1969.0709 1919.412 1969.2649 C
f 
n
1919.784 1970.6641 m
1919.784 1970.8581 1919.9412 1971.0153 1920.1352 1971.0153 C
1920.3291 1971.0153 1920.4864 1970.8581 1920.4864 1970.6641 C
1920.4864 1970.4702 1920.3291 1970.313 1920.1352 1970.313 C
1919.9412 1970.313 1919.784 1970.4702 1919.784 1970.6641 C
f 
n
1898.6036 2014.4573 m
1898.6036 2014.6512 1898.7609 2014.8085 1898.9548 2014.8085 C
1899.1488 2014.8085 1899.306 2014.6512 1899.306 2014.4573 C
1899.306 2014.2634 1899.1488 2014.1061 1898.9548 2014.1061 C
1898.7609 2014.1061 1898.6036 2014.2634 1898.6036 2014.4573 C
f 
n
1899.4161 2013.4877 m
1899.4161 2013.6816 1899.5733 2013.8389 1899.7673 2013.8389 C
1899.9612 2013.8389 1900.1184 2013.6816 1900.1184 2013.4877 C
1900.1184 2013.2938 1899.9612 2013.1366 1899.7673 2013.1366 C
1899.5733 2013.1366 1899.4161 2013.2938 1899.4161 2013.4877 C
f 
n
1899.1596 2011.9945 m
1899.1596 2012.1884 1899.3168 2012.3456 1899.5108 2012.3456 C
1899.7047 2012.3456 1899.862 2012.1884 1899.862 2011.9945 C
1899.862 2011.8005 1899.7047 2011.6433 1899.5108 2011.6433 C
1899.3168 2011.6433 1899.1596 2011.8005 1899.1596 2011.9945 C
f 
n
1897.6032 2011.5701 m
1897.6032 2011.7641 1897.7605 2011.9213 1897.9544 2011.9213 C
1898.1483 2011.9213 1898.3056 2011.7641 1898.3056 2011.5701 C
1898.3056 2011.3762 1898.1483 2011.219 1897.9544 2011.219 C
1897.7605 2011.219 1897.6032 2011.3762 1897.6032 2011.5701 C
f 
n
1896.7492 2012.6552 m
1896.7492 2012.8491 1896.9064 2013.0064 1897.1003 2013.0064 C
1897.2943 2013.0064 1897.4515 2012.8491 1897.4515 2012.6552 C
1897.4515 2012.4612 1897.2943 2012.304 1897.1003 2012.304 C
1896.9064 2012.304 1896.7492 2012.4612 1896.7492 2012.6552 C
f 
n
1897.1212 2014.0545 m
1897.1212 2014.2484 1897.2784 2014.4056 1897.4723 2014.4056 C
1897.6663 2014.4056 1897.8235 2014.2484 1897.8235 2014.0545 C
1897.8235 2013.8605 1897.6663 2013.7033 1897.4723 2013.7033 C
1897.2784 2013.7033 1897.1212 2013.8605 1897.1212 2014.0545 C
f 
n
1917.3463 2013.9164 m
1917.5862 2014.7113 L
1917.4432 2014.7889 1917.1319 2014.9697 1916.793 2015.0864 C
1916.0543 2015.3408 1915.5262 2015.1716 1915.3379 2014.625 C
1915.1984 2014.22 1915.3626 2013.8917 1915.5981 2013.5898 C
1915.9607 2013.1308 1916.4899 2012.7448 1916.319 2012.2487 C
1916.2126 2011.94 1915.8827 2011.7875 1915.4426 2011.9391 C
1914.7798 2012.1673 1914.8256 2012.6781 1914.8539 2012.9571 C
1914.7071 2013.0076 L
1914.4497 2012.1621 L
1914.606 2012.0573 1914.9035 2011.8529 1915.3032 2011.7153 C
1916.0722 2011.4505 1916.7144 2011.5237 1916.9603 2012.2374 C
1917.0789 2012.5816 1916.9785 2012.8653 1916.7969 2013.143 C
1916.5186 2013.5672 1915.7387 2014.0963 1915.9096 2014.5923 C
1916.0003 2014.8555 1916.2994 2014.9846 1916.7092 2014.8435 C
1917.2456 2014.6588 1917.2533 2014.2541 1917.1996 2013.9669 C
1917.3463 2013.9164 L
f 
0.2436 w
S 
n
1925.2023 2008.9548 m
1925.7113 2009.6111 L
1925.6055 2009.7348 1925.3797 2010.0151 1925.1051 2010.2455 C
1924.5067 2010.7477 1923.9531 2010.7789 1923.5814 2010.3361 C
1923.306 2010.008 1923.3416 2009.6427 1923.4533 2009.2764 C
1923.6273 2008.718 1923.9829 2008.1679 1923.6456 2007.7661 C
1923.4356 2007.5159 1923.073 2007.4917 1922.7164 2007.791 C
1922.1795 2008.2416 1922.4054 2008.7021 1922.5317 2008.9524 C
1922.4129 2009.0522 L
1921.8695 2008.3549 L
1921.9779 2008.2011 1922.1823 2007.9037 1922.5061 2007.632 C
1923.1291 2007.1092 1923.7549 2006.9475 1924.2402 2007.5257 C
1924.4743 2007.8045 1924.4823 2008.1053 1924.4122 2008.4297 C
1924.3045 2008.9255 1923.7661 2009.6989 1924.1034 2010.1007 C
1924.2823 2010.3139 1924.6079 2010.3273 1924.9399 2010.0487 C
1925.3744 2009.6841 1925.2365 2009.3035 1925.0835 2009.0546 C
1925.2023 2008.9548 L
true setoverprint
f 
false setoverprint
S 
n
true eomode
1924.2181 2006.2283 m
1925.0572 2005.2281 L
1925.1598 2005.3141 L
1924.9775 2005.5314 1924.9387 2005.6526 1925.0659 2005.7592 C
1925.1192 2005.8039 1925.1863 2005.8323 1925.2527 2005.8531 C
1925.8018 2006.0482 L
1926.6925 2004.9866 L
1926.387 2004.451 L
1926.355 2004.3893 1926.312 2004.3322 1926.2628 2004.2909 C
1926.1356 2004.1843 1925.9954 2004.3181 1925.8613 2004.4779 C
1925.7587 2004.3919 L
1926.7388 2003.2237 L
1926.8414 2003.3097 L
1926.6007 2003.5966 1926.5954 2003.7529 1926.8026 2004.1222 C
1928.353 2006.8474 L
1928.071 2007.1836 L
1925.1812 2006.1632 L
1924.7342 2006.0047 1924.5579 2006.0315 1924.3206 2006.3143 C
1924.2181 2006.2283 L
h
1927.6797 2006.7087 m
1926.8227 2005.2146 L
1926.0489 2006.1368 L
1927.6797 2006.7087 L
true setoverprint
f 
false setoverprint
n
1924.2181 2006.2283 m
1925.0572 2005.2281 L
1925.1598 2005.3141 L
1924.9775 2005.5314 1924.9387 2005.6526 1925.0659 2005.7592 C
1925.1192 2005.8039 1925.1863 2005.8323 1925.2527 2005.8531 C
1925.8018 2006.0482 L
1926.6925 2004.9866 L
1926.387 2004.451 L
1926.355 2004.3893 1926.312 2004.3322 1926.2628 2004.2909 C
1926.1356 2004.1843 1925.9954 2004.3181 1925.8613 2004.4779 C
1925.7587 2004.3919 L
1926.7388 2003.2237 L
1926.8414 2003.3097 L
1926.6007 2003.5966 1926.5954 2003.7529 1926.8026 2004.1222 C
1928.353 2006.8474 L
1928.071 2007.1836 L
1925.1812 2006.1632 L
1924.7342 2006.0047 1924.5579 2006.0315 1924.3206 2006.3143 C
1924.2181 2006.2283 L
s 
n
1927.6797 2006.7087 m
1926.8227 2005.2146 L
1926.0489 2006.1368 L
1927.6797 2006.7087 L
s 
n
1927.1473 2002.5811 m
1927.8736 2001.2707 L
1927.9906 2001.3356 L
1927.8091 2001.6632 1927.8404 2001.7723 1928.2057 2001.9748 C
1929.0346 2002.4341 L
1929.1306 2002.2609 L
1929.4496 2001.6853 1929.9062 2000.9718 1930.7398 2001.4337 C
1931.386 2001.7918 1931.3297 2002.3906 1931.0003 2002.985 C
1930.2663 2004.3094 L
1930.1492 2004.2446 L
1930.3307 2003.917 1930.2994 2003.8078 1929.9341 2003.6054 C
1927.9204 2002.4895 L
1927.5551 2002.2872 1927.446 2002.3184 1927.2644 2002.646 C
1927.1473 2002.5811 L
h
1930.2194 2003.0906 m
1930.5004 2003.2463 1930.5773 2003.24 1930.7148 2002.992 C
1930.9379 2002.5895 1930.9967 2002.2735 1930.4441 2001.9672 C
1929.8072 2001.6143 1929.5612 2001.9919 1929.3408 2002.3896 C
1929.25 2002.5535 L
1930.2194 2003.0906 L
true setoverprint
f 
false setoverprint
n
1927.1473 2002.5811 m
1927.8736 2001.2707 L
1927.9906 2001.3356 L
1927.8091 2001.6632 1927.8404 2001.7723 1928.2057 2001.9748 C
1929.0346 2002.4341 L
1929.1306 2002.2609 L
1929.4496 2001.6853 1929.9062 2000.9718 1930.7398 2001.4337 C
1931.386 2001.7918 1931.3297 2002.3906 1931.0003 2002.985 C
1930.2663 2004.3094 L
1930.1492 2004.2446 L
1930.3307 2003.917 1930.2994 2003.8078 1929.9341 2003.6054 C
1927.9204 2002.4895 L
1927.5551 2002.2872 1927.446 2002.3184 1927.2644 2002.646 C
1927.1473 2002.5811 L
s 
n
1930.2194 2003.0906 m
1930.5004 2003.2463 1930.5773 2003.24 1930.7148 2002.992 C
1930.9379 2002.5895 1930.9967 2002.2735 1930.4441 2001.9672 C
1929.8072 2001.6143 1929.5612 2001.9919 1929.3408 2002.3896 C
1929.25 2002.5535 L
1930.2194 2003.0906 L
s 
n
false eomode
1928.8521 1999.3447 m
1929.4131 1997.9556 L
1929.5373 1998.0057 L
1929.397 1998.353 1929.4414 1998.4575 1929.8286 1998.6139 C
1931.9634 1999.4761 L
1932.3506 1999.6325 1932.4551 1999.5882 1932.5954 1999.2409 C
1932.7195 1999.291 L
1932.1584 2000.6801 L
1932.0344 2000.63 L
1932.1766 2000.2778 1932.1302 2000.1782 1931.743 2000.0218 C
1929.6082 1999.1596 L
1929.221 1999.0032 1929.1185 1999.0426 1928.9762 1999.3949 C
1928.8521 1999.3447 L
true setoverprint
f 
false setoverprint
S 
n
vmrs
1929.7226 1997.1537 m
1930.3527 1994.6253 L
1931.1137 1994.7819 L
1931.0762 1994.9325 L
1930.745 1994.8665 1930.5218 1994.9653 1930.4105 1995.4118 C
1930.2915 1995.8894 L
1930.2242 1996.1594 1930.2399 1996.2074 1930.588 1996.2941 C
1931.6633 1996.5622 L
1931.8328 1995.882 L
1931.9169 1995.5446 1931.8207 1995.4655 1931.509 1995.3878 C
1931.544 1995.2476 L
1932.6194 1995.5156 L
1932.5844 1995.6558 L
1932.2415 1995.5703 1932.1559 1995.6041 1932.0718 1995.9416 C
1931.9023 1996.6217 L
1932.8219 1996.8509 L
1933.1128 1996.9234 1933.2101 1996.887 1933.2735 1996.6326 C
1933.3563 1996.3004 L
1933.5012 1995.7189 1933.2843 1995.5931 1933.0089 1995.5024 C
1933.0464 1995.3518 L
1933.792 1995.5708 L
1933.1826 1998.0161 L
1933.0527 1997.9837 L
1933.1433 1997.6203 1933.0848 1997.523 1932.6796 1997.422 C
1930.4456 1996.8652 L
1930.0404 1996.7643 1929.9431 1996.8227 1929.8525 1997.1861 C
1929.7226 1997.1537 L
[0 0 0 0.65]vc
true setoverprint
f 
false setoverprint
0.2436 w
S 
n
true eomode
1930.5872 1993.5863 m
1930.674 1992.3427 L
1930.8075 1992.352 L
1930.781 1992.731 1930.8559 1992.8113 1931.2725 1992.8404 C
1933.6599 1993.0072 L
1933.6607 1992.9966 L
1930.7655 1991.0296 L
1930.8009 1990.5225 L
1933.7278 1990.727 L
1934.1443 1990.7561 1934.2293 1990.6923 1934.2561 1990.308 C
1934.3896 1990.3173 L
1934.3029 1991.561 L
1934.1694 1991.5517 L
1934.1954 1991.1781 1934.1209 1991.0924 1933.7043 1991.0633 C
1931.4664 1990.9069 L
1931.4657 1990.9176 L
1934.2173 1992.7887 L
1934.1443 1993.8349 L
1934.0108 1993.8255 L
1934.0368 1993.4519 1933.9623 1993.3663 1933.5457 1993.3372 C
1931.2491 1993.1767 L
1930.8325 1993.1476 1930.7468 1993.222 1930.7207 1993.5957 C
1930.5872 1993.5863 L
true setoverprint
f 
false setoverprint
S 
n
false eomode
1930.763 1988.7292 m
1930.6321 1987.2366 L
1930.7654 1987.225 L
1930.7982 1987.5981 1930.8852 1987.671 1931.3012 1987.6346 C
1933.9786 1987.4003 L
1933.9609 1987.1978 L
1933.9117 1986.6381 1933.7143 1986.5318 1933.315 1986.513 C
1933.3014 1986.3584 L
1934.1305 1986.3128 L
1934.3684 1989.026 L
1933.5445 1989.1303 L
1933.5309 1988.9757 L
1933.9152 1988.883 1934.0974 1988.7542 1934.0482 1988.1945 C
1934.03 1987.9867 L
1931.3526 1988.221 L
1930.9366 1988.2574 1930.8636 1988.3443 1930.8963 1988.7175 C
1930.763 1988.7292 L
true setoverprint
f 
false setoverprint
S 
n
1930.4081 1985.859 m
1930.0963 1984.3936 L
1930.2272 1984.3657 L
1930.3052 1984.7321 1930.4005 1984.7939 1930.8089 1984.7071 C
1933.0608 1984.2284 L
1933.4693 1984.1416 1933.5311 1984.0464 1933.4532 1983.68 C
1933.5841 1983.6522 L
1933.8959 1985.1176 L
1933.765 1985.1455 L
1933.6859 1984.7739 1933.5917 1984.7173 1933.1833 1984.8041 C
1930.9314 1985.2828 L
1930.523 1985.3696 1930.46 1985.4596 1930.539 1985.8312 C
1930.4081 1985.859 L
true setoverprint
f 
false setoverprint
S 
n
true eomode
1929.9601 1983.6816 m
1929.4919 1982.4627 L
1929.6169 1982.4148 L
1929.7186 1982.6795 1929.8058 1982.7721 1929.9607 1982.7127 C
1930.0257 1982.6877 1930.083 1982.6428 1930.1334 1982.5948 C
1930.5703 1982.2093 L
1930.0734 1980.9155 L
1929.4568 1980.9229 L
1929.3872 1980.9209 1929.3165 1980.9309 1929.2565 1980.9539 C
1929.1016 1981.0134 1929.1507 1981.2009 1929.2255 1981.3957 C
1929.1005 1981.4437 L
1928.5537 1980.02 L
1928.6787 1979.9721 L
1928.813 1980.3217 1928.9471 1980.4021 1929.3707 1980.4 C
1932.506 1980.3657 L
1932.6633 1980.7753 L
1930.37 1982.8077 L
1930.0147 1983.1218 1929.9527 1983.2889 1930.0851 1983.6336 C
1929.9601 1983.6816 L
h
1932.0583 1980.8872 m
1930.3359 1980.9121 L
1930.7676 1982.0361 L
1932.0583 1980.8872 L
true setoverprint
f 
false setoverprint
n
1929.9601 1983.6816 m
1929.4919 1982.4627 L
1929.6169 1982.4148 L
1929.7186 1982.6795 1929.8058 1982.7721 1929.9607 1982.7127 C
1930.0257 1982.6877 1930.083 1982.6428 1930.1334 1982.5948 C
1930.5703 1982.2093 L
1930.0734 1980.9155 L
1929.4568 1980.9229 L
1929.3872 1980.9209 1929.3165 1980.9309 1929.2565 1980.9539 C
1929.1016 1981.0134 1929.1507 1981.2009 1929.2255 1981.3957 C
1929.1005 1981.4437 L
1928.5537 1980.02 L
1928.6787 1979.9721 L
1928.813 1980.3217 1928.9471 1980.4021 1929.3707 1980.4 C
1932.506 1980.3657 L
1932.6633 1980.7753 L
1930.37 1982.8077 L
1930.0147 1983.1218 1929.9527 1983.2889 1930.0851 1983.6336 C
1929.9601 1983.6816 L
s 
n
1932.0583 1980.8872 m
1930.3359 1980.9121 L
1930.7676 1982.0361 L
1932.0583 1980.8872 L
s 
n
false eomode
1928.1704 1979.3704 m
1926.8277 1977.1368 L
1927.4766 1976.7094 L
1927.5565 1976.8424 L
1927.2757 1977.0299 1927.1877 1977.2576 1927.4248 1977.652 C
1927.6784 1978.074 L
1927.8218 1978.3125 1927.8668 1978.3354 1928.1743 1978.1507 C
1929.1241 1977.5799 L
1928.763 1976.979 L
1928.5838 1976.6809 1928.4598 1976.693 1928.1845 1976.8584 C
1928.1101 1976.7346 L
1929.0599 1976.1638 L
1929.1344 1976.2876 L
1928.8315 1976.4697 1928.7948 1976.5541 1928.974 1976.8522 C
1929.3352 1977.453 L
1930.1474 1976.965 L
1930.4044 1976.8106 1930.4475 1976.716 1930.3124 1976.4913 C
1930.1359 1976.1977 L
1929.8272 1975.684 1929.5848 1975.7485 1929.326 1975.8791 C
1929.246 1975.7461 L
1929.928 1975.3738 L
1931.2265 1977.534 L
1931.1118 1977.6029 L
1930.9188 1977.2819 1930.8086 1977.2544 1930.4507 1977.4695 C
1928.4775 1978.6552 L
1928.1196 1978.8703 1928.0921 1978.9804 1928.2851 1979.3014 C
1928.1704 1979.3704 L
true setoverprint
f 
false setoverprint
S 
n
1916.3104 1965.8318 m
1916.6509 1965.0744 L
1916.8098 1965.1098 1917.1634 1965.1775 1917.4958 1965.3118 C
1918.2203 1965.6045 1918.5079 1966.0786 1918.2914 1966.6147 C
1918.131 1967.0117 1917.7916 1967.1518 1917.4157 1967.2251 C
1916.8409 1967.3335 1916.1882 1967.2777 1915.9917 1967.7641 C
1915.8694 1968.067 1916.0183 1968.3984 1916.4501 1968.5728 C
1917.1001 1968.8354 1917.4007 1968.4199 1917.5625 1968.1908 C
1917.7064 1968.2489 L
1917.3458 1969.0559 L
1917.1591 1969.0324 1916.8004 1968.9915 1916.4084 1968.8331 C
1915.6542 1968.5285 1915.2175 1968.0519 1915.5002 1967.352 C
1915.6365 1967.0145 1915.8984 1966.8662 1916.2177 1966.7758 C
1916.7061 1966.6383 1917.642 1966.7507 1917.8384 1966.2643 C
1917.9427 1966.0061 1917.8016 1965.7124 1917.3996 1965.5501 C
1916.8736 1965.3376 1916.6023 1965.6379 1916.4543 1965.8899 C
1916.3104 1965.8318 L
true setoverprint
f 
false setoverprint
S 
n
1913.3529 1967.7785 m
1911.8871 1967.4671 L
1911.9149 1967.3361 L
1912.2814 1967.414 1912.3766 1967.3522 1912.4633 1966.9437 C
1913.0217 1964.315 L
1912.8228 1964.2727 L
1912.2732 1964.1559 1912.1138 1964.3136 1911.9792 1964.69 C
1911.8273 1964.6577 L
1912.0259 1963.8516 L
1914.6904 1964.4179 L
1914.5494 1965.2362 L
1914.3976 1965.2039 L
1914.4212 1964.8094 1914.3513 1964.5975 1913.8017 1964.4808 C
1913.5975 1964.4374 L
1913.0392 1967.0661 L
1912.9524 1967.4745 1913.0142 1967.5698 1913.3807 1967.6476 C
1913.3529 1967.7785 L
true setoverprint
f 
false setoverprint
S 
n
1907.4046 1964.171 m
1907.4191 1963.7537 1907.3417 1963.6706 1906.9673 1963.6576 C
1906.972 1963.5238 L
1908.2716 1963.5692 L
1908.267 1963.703 L
1907.8926 1963.6899 1907.8096 1963.7673 1907.7951 1964.1847 C
1907.733 1965.9716 L
1907.7097 1966.6404 1907.8924 1966.9307 1908.5289 1966.9529 C
1909.1974 1966.9763 1909.3082 1966.5623 1909.3268 1966.0273 C
1909.3889 1964.2403 L
1909.4034 1963.823 1909.3259 1963.7399 1908.9515 1963.7269 C
1908.9562 1963.5931 L
1910.4537 1963.6454 L
1910.4491 1963.7792 L
1910.0747 1963.7661 1909.9917 1963.8435 1909.9772 1964.2608 C
1909.9151 1966.0478 L
1909.8879 1966.829 1909.5205 1967.234 1908.5899 1967.2015 C
1907.4881 1967.163 1907.3215 1966.5626 1907.3425 1965.958 C
1907.4046 1964.171 L
true setoverprint
f 
false setoverprint
S 
n
true eomode
1905.8226 1967.1711 m
1904.4536 1967.3879 L
1903.4335 1967.5494 1902.6867 1967.4184 1902.4444 1965.8903 C
1902.2104 1964.4151 1902.891 1964.0255 1903.8952 1963.8665 C
1905.2641 1963.6497 L
1905.2851 1963.7819 L
1904.9098 1963.8413 1904.8484 1963.9323 1904.9138 1964.3447 C
1905.2744 1966.6183 L
1905.3398 1967.0307 1905.4263 1967.0983 1905.8016 1967.0389 C
1905.8226 1967.1711 L
h
1904.3324 1964.4368 m
1904.2804 1964.109 1904.2139 1964.0653 1903.9338 1964.1097 C
1902.9401 1964.267 1902.9138 1964.8186 1903.0681 1965.7915 C
1903.2358 1966.849 1903.506 1967.2886 1904.415 1967.1447 C
1904.7375 1967.0936 1904.7349 1966.9748 1904.6929 1966.7104 C
1904.3324 1964.4368 L
true setoverprint
f 
false setoverprint
n
1905.8226 1967.1711 m
1904.4536 1967.3879 L
1903.4335 1967.5494 1902.6867 1967.4184 1902.4444 1965.8903 C
1902.2104 1964.4151 1902.891 1964.0255 1903.8952 1963.8665 C
1905.2641 1963.6497 L
1905.2851 1963.7819 L
1904.9098 1963.8413 1904.8484 1963.9323 1904.9138 1964.3447 C
1905.2744 1966.6183 L
1905.3398 1967.0307 1905.4263 1967.0983 1905.8016 1967.0389 C
1905.8226 1967.1711 L
s 
n
1904.3324 1964.4368 m
1904.2804 1964.109 1904.2139 1964.0653 1903.9338 1964.1097 C
1902.9401 1964.267 1902.9138 1964.8186 1903.0681 1965.7915 C
1903.2358 1966.849 1903.506 1967.2886 1904.415 1967.1447 C
1904.7375 1967.0936 1904.7349 1966.9748 1904.6929 1966.7104 C
1904.3324 1964.4368 L
s 
n
false eomode
1901.4715 1968.0233 m
1900.0548 1968.511 L
1900.0112 1968.3845 L
1900.3654 1968.2625 1900.4151 1968.1605 1900.2791 1967.7657 C
1899.5292 1965.5892 L
1899.3932 1965.1943 1899.2911 1965.1445 1898.9369 1965.2665 C
1898.8933 1965.1399 L
1900.31 1964.6522 L
1900.3536 1964.7787 L
1899.9944 1964.9024 1899.9497 1965.0027 1900.0858 1965.3975 C
1900.8357 1967.5741 L
1900.9717 1967.9689 1901.0687 1968.0204 1901.4279 1967.8967 C
1901.4715 1968.0233 L
true setoverprint
f 
false setoverprint
S 
n
1899.0827 1968.878 m
1897.7139 1969.4874 L
1897.6595 1969.3651 L
1898.0016 1969.2127 1898.0423 1969.1067 1897.8724 1968.7253 C
1896.9356 1966.6224 L
1896.7657 1966.2409 1896.6597 1966.2002 1896.3175 1966.3525 C
1896.263 1966.2303 L
1897.6318 1965.6209 L
1897.6863 1965.7432 L
1897.3392 1965.8977 1897.3034 1966.0015 1897.4733 1966.383 C
1898.4101 1968.4859 L
1898.58 1968.8673 1898.6812 1968.9102 1899.0282 1968.7557 C
1899.0827 1968.878 L
true setoverprint
f 
false setoverprint
S 
n
true eomode
1888.3929 1977.981 m
1888.1531 1978.3801 L
1885.0114 1977.7974 L
1884.6424 1977.7255 1884.5193 1977.7639 1884.3292 1978.0804 C
1884.2145 1978.0115 L
1884.9006 1976.8695 L
1885.0153 1976.9384 L
1884.8473 1977.2182 1884.8399 1977.3448 1884.9592 1977.4165 C
1885.0097 1977.4468 1885.0804 1977.4643 1885.2199 1977.492 C
1887.6391 1977.9464 L
1887.6446 1977.9373 L
1886.0871 1976.0591 L
1885.9925 1975.9462 1885.9411 1975.8966 1885.8906 1975.8663 C
1885.7575 1975.7863 1885.6574 1975.8697 1885.5251 1976.0899 C
1885.4104 1976.021 L
1886.193 1974.7184 L
1886.3077 1974.7873 L
1886.1011 1975.1313 1886.1414 1975.2305 1886.4333 1975.5868 C
1888.3929 1977.981 L
true setoverprint
f 
false setoverprint
S 
n
false eomode
1886.9535 1980.7271 m
1886.3923 1982.1162 L
1886.2682 1982.066 L
1886.4085 1981.7188 1886.3641 1981.6143 1885.9768 1981.4579 C
1883.842 1980.5956 L
1883.4548 1980.4392 1883.3503 1980.4835 1883.21 1980.8308 C
1883.0859 1980.7806 L
1883.647 1979.3915 L
1883.7711 1979.4417 L
1883.6288 1979.7939 1883.6752 1979.8934 1884.0625 1980.0498 C
1886.1973 1980.9121 L
1886.5845 1981.0685 1886.6871 1981.0292 1886.8294 1980.6769 C
1886.9535 1980.7271 L
true setoverprint
f 
false setoverprint
S 
n
1886.0231 1983.1226 m
1885.3929 1985.6509 L
1884.6319 1985.4943 L
1884.6694 1985.3438 L
1885.0006 1985.4098 1885.2238 1985.311 1885.3351 1984.8645 C
1885.4542 1984.3869 L
1885.5214 1984.1169 1885.5058 1984.0689 1885.1577 1983.9821 C
1884.0823 1983.7141 L
1883.9128 1984.3942 L
1883.8287 1984.7316 1883.9248 1984.8108 1884.2366 1984.8885 C
1884.2016 1985.0287 L
1883.1262 1984.7606 L
1883.1611 1984.6204 L
1883.504 1984.7059 1883.5897 1984.6721 1883.6738 1984.3346 C
1883.8433 1983.6545 L
1882.9237 1983.4253 L
1882.6328 1983.3528 1882.5354 1983.3892 1882.472 1983.6436 C
1882.3892 1983.9758 L
1882.2443 1984.5573 1882.4613 1984.6831 1882.7366 1984.7738 C
1882.6991 1984.9243 L
1881.9536 1984.7054 L
1882.563 1982.2601 L
1882.6929 1982.2925 L
1882.6023 1982.6559 1882.6608 1982.7532 1883.0661 1982.8542 C
1885.3 1983.4111 L
1885.7053 1983.5121 1885.8026 1983.4536 1885.8932 1983.0902 C
1886.0231 1983.1226 L
true setoverprint
f 
false setoverprint
S 
n
true eomode
1885.12 1986.9422 m
1885.0549 1988.1872 L
1884.9212 1988.1802 L
1884.941 1987.8009 1884.8647 1987.7218 1884.4477 1987.7 C
1882.0576 1987.5748 L
1882.0571 1987.5855 L
1884.9861 1989.5017 L
1884.9596 1990.0093 L
1882.0295 1989.8559 L
1881.6124 1989.834 1881.5286 1989.8993 1881.5085 1990.284 C
1881.3749 1990.277 L
1881.4399 1989.032 L
1881.5736 1989.039 L
1881.5541 1989.4131 1881.6301 1989.4974 1882.0471 1989.5192 C
1884.2875 1989.6366 L
1884.288 1989.6259 L
1881.5042 1987.803 L
1881.5589 1986.7558 L
1881.6926 1986.7627 L
1881.673 1987.1368 1881.7491 1987.2211 1882.1661 1987.243 C
1884.4653 1987.3634 L
1884.8823 1987.3852 1884.9667 1987.3093 1884.9863 1986.9352 C
1885.12 1986.9422 L
true setoverprint
f 
false setoverprint
S 
n
false eomode
1884.9553 1991.4663 m
1885.1289 1992.7008 L
1884.9964 1992.7195 L
1884.9435 1992.3433 1884.8535 1992.2803 1884.44 1992.3384 C
1882.07 1992.6715 L
1882.0715 1992.6821 L
1885.3123 1994.0043 L
1885.3831 1994.5076 L
1882.4777 1994.916 L
1882.0641 1994.9741 1881.9943 1995.0542 1882.048 1995.4357 C
1881.9154 1995.4543 L
1881.7417 1994.2198 L
1881.8743 1994.2011 L
1881.9265 1994.572 1882.0172 1994.6403 1882.4307 1994.5822 C
1884.6522 1994.27 L
1884.6507 1994.2594 L
1881.5703 1993.0011 L
1881.4242 1991.9626 L
1881.5567 1991.944 L
1881.6089 1992.3149 1881.6996 1992.3832 1882.1132 1992.325 C
1884.393 1992.0046 L
1884.8065 1991.9465 1884.8749 1991.8558 1884.8227 1991.4849 C
1884.9553 1991.4663 L
true setoverprint
f 
false setoverprint
S 
n
1885.7201 1995.9332 m
1886.5258 1998.4114 L
1885.7974 1998.6818 L
1885.7494 1998.5343 L
1886.0652 1998.4148 1886.2022 1998.2127 1886.0599 1997.7751 C
1885.9077 1997.3069 L
1885.8217 1997.0423 1885.783 1997.0099 1885.4418 1997.1207 C
1884.3878 1997.4632 L
1884.6046 1998.1298 L
1884.7121 1998.4606 1884.8356 1998.4767 1885.1411 1998.3775 C
1885.1857 1998.5149 L
1884.1317 1998.8573 L
1884.0871 1998.7199 L
1884.4231 1998.6107 1884.4778 1998.5367 1884.3703 1998.2059 C
1884.1536 1997.5393 L
1883.2523 1997.8321 L
1882.9672 1997.9248 1882.9039 1998.0072 1882.985 1998.2566 C
1883.0909 1998.5822 L
1883.2762 1999.1522 1883.5268 1999.1439 1883.8084 1999.0749 C
1883.8564 1999.2225 L
1883.1081 1999.4318 L
1882.3289 1997.0351 L
1882.4562 1996.9937 L
1882.572 1997.3499 1882.6732 1997.4014 1883.0704 1997.2724 C
1885.2599 1996.561 L
1885.657 1996.4319 1885.7086 1996.3308 1885.5928 1995.9746 C
1885.7201 1995.9332 L
true setoverprint
f 
false setoverprint
S 
n
1887.0022 1999.6247 m
1887.6068 2000.715 L
1887.4898 2000.7799 L
1887.3055 2000.4477 1887.199 2000.4211 1886.8337 2000.6235 C
1884.7407 2001.7837 L
1884.7459 2001.793 L
1888.2452 2001.8662 L
1888.4918 2002.3108 L
1885.9258 2003.7331 L
1885.5606 2003.9355 1885.524 2004.0353 1885.7109 2004.3722 C
1885.5938 2004.4371 L
1884.9892 2003.3467 L
1885.1062 2003.2818 L
1885.2879 2003.6094 1885.397 2003.6407 1885.7623 2003.4383 C
1887.7242 2002.3508 L
1887.719 2002.3414 L
1884.3923 2002.2704 L
1883.8837 2001.3532 L
1884.0007 2001.2883 L
1884.1824 2001.6159 1884.2915 2001.6472 1884.6568 2001.4447 C
1886.6702 2000.3287 L
1887.0355 2000.1263 1887.0668 2000.0172 1886.8851 1999.6895 C
1887.0022 1999.6247 L
true setoverprint
f 
false setoverprint
S 
n
vmrs
1888.7582 2007.1193 m
1888.0931 2007.6165 L
1887.9713 2007.5087 1887.6949 2007.278 1887.4692 2006.9994 C
1886.9774 2006.3923 1886.9558 2005.8383 1887.4051 2005.4745 C
1887.738 2005.205 1888.1027 2005.247 1888.4671 2005.3651 C
1889.0224 2005.5488 1889.5663 2005.914 1889.974 2005.5839 C
1890.2278 2005.3783 1890.2583 2005.0163 1889.9652 2004.6545 C
1889.524 2004.1098 1889.0596 2004.3275 1888.807 2004.4494 C
1888.7093 2004.3288 L
1889.416 2003.7979 L
1889.568 2003.909 1889.8618 2004.1186 1890.1279 2004.4471 C
1890.6399 2005.0791 1890.7907 2005.7075 1890.2041 2006.1826 C
1889.9212 2006.4117 1889.6202 2006.4144 1889.2971 2006.3386 C
1888.8031 2006.2222 1888.0391 2005.6703 1887.6314 2006.0005 C
1887.4151 2006.1757 1887.3961 2006.5009 1887.6689 2006.8377 C
1888.026 2007.2785 1888.4089 2007.1474 1888.6605 2006.9987 C
1888.7582 2007.1193 L
[0 0 0 0.65]vc
true setoverprint
f 
false setoverprint
0.2436 w
S 
n
1891.88 2006.4662 m
1892.9937 2007.4686 L
1892.9042 2007.568 L
1892.6257 2007.3174 1892.5124 2007.3234 1892.233 2007.6337 C
1890.6927 2009.3444 L
1890.4133 2009.6547 1890.4192 2009.768 1890.6976 2010.0186 C
1890.6081 2010.1181 L
1889.4944 2009.1157 L
1889.584 2009.0162 L
1889.8664 2009.2704 1889.9758 2009.2609 1890.2552 2008.9506 C
1891.7955 2007.2399 L
1892.0748 2006.9296 1892.0729 2006.8198 1891.7905 2006.5656 C
1891.88 2006.4662 L
true setoverprint
f 
false setoverprint
S 
n
1894.2421 2011.7674 m
1893.7398 2012.4287 L
1893.593 2012.3586 1893.2637 2012.213 1892.97 2012.0074 C
1892.3299 2011.5594 1892.1564 2011.0328 1892.488 2010.5592 C
1892.7337 2010.2084 1893.0958 2010.1483 1893.4786 2010.1614 C
1894.0631 2010.185 1894.6866 2010.3862 1894.9874 2009.9564 C
1895.1747 2009.6889 1895.1042 2009.3324 1894.7228 2009.0655 C
1894.1485 2008.6635 1893.7621 2009.0007 1893.5529 2009.1875 C
1893.4258 2009.0985 L
1893.9587 2008.3934 L
1894.1354 2008.4582 1894.4757 2008.5788 1894.822 2008.8212 C
1895.4883 2009.2877 1895.8065 2009.8502 1895.3736 2010.4685 C
1895.1648 2010.7667 1894.8763 2010.8522 1894.5448 2010.8685 C
1894.0379 2010.8927 1893.1514 2010.5727 1892.8505 2011.0025 C
1892.6908 2011.2305 1892.7622 2011.5484 1893.1174 2011.797 C
1893.5821 2012.1223 1893.9141 2011.8907 1894.1149 2011.6784 C
1894.2421 2011.7674 L
true setoverprint
f 
false setoverprint
S 
n
1920.8272 2012.6545 m
1920.8272 2012.8484 1920.9844 2013.0056 1921.1784 2013.0056 C
1921.3723 2013.0056 1921.5296 2012.8484 1921.5296 2012.6545 C
1921.5296 2012.4605 1921.3723 2012.3033 1921.1784 2012.3033 C
1920.9844 2012.3033 1920.8272 2012.4605 1920.8272 2012.6545 C
f 
n
1921.6396 2011.6849 m
1921.6396 2011.8788 1921.7969 2012.0361 1921.9908 2012.0361 C
1922.1848 2012.0361 1922.342 2011.8788 1922.342 2011.6849 C
1922.342 2011.491 1922.1848 2011.3337 1921.9908 2011.3337 C
1921.7969 2011.3337 1921.6396 2011.491 1921.6396 2011.6849 C
f 
n
1921.3832 2010.1916 m
1921.3832 2010.3856 1921.5404 2010.5428 1921.7344 2010.5428 C
1921.9283 2010.5428 1922.0855 2010.3856 1922.0855 2010.1916 C
1922.0855 2009.9977 1921.9283 2009.8405 1921.7344 2009.8405 C
1921.5404 2009.8405 1921.3832 2009.9977 1921.3832 2010.1916 C
f 
n
1919.8268 2009.7673 m
1919.8268 2009.9613 1919.984 2010.1185 1920.1779 2010.1185 C
1920.3719 2010.1185 1920.5291 2009.9613 1920.5291 2009.7673 C
1920.5291 2009.5734 1920.3719 2009.4161 1920.1779 2009.4161 C
1919.984 2009.4161 1919.8268 2009.5734 1919.8268 2009.7673 C
f 
n
1918.9727 2010.8523 m
1918.9727 2011.0463 1919.13 2011.2035 1919.3239 2011.2035 C
1919.5178 2011.2035 1919.675 2011.0463 1919.675 2010.8523 C
1919.675 2010.6584 1919.5178 2010.5012 1919.3239 2010.5012 C
1919.13 2010.5012 1918.9727 2010.6584 1918.9727 2010.8523 C
f 
n
1919.3447 2012.2516 m
1919.3447 2012.4456 1919.5019 2012.6028 1919.6959 2012.6028 C
1919.8898 2012.6028 1920.047 2012.4456 1920.047 2012.2516 C
1920.047 2012.0577 1919.8898 2011.9005 1919.6959 2011.9005 C
1919.5019 2011.9005 1919.3447 2012.0577 1919.3447 2012.2516 C
f 
n
1925.767 1974.6695 m
1925.767 1974.8635 1925.9242 1975.0207 1926.1181 1975.0207 C
1926.3121 1975.0207 1926.4693 1974.8635 1926.4693 1974.6695 C
1926.4693 1974.4756 1926.3121 1974.3184 1926.1181 1974.3184 C
1925.9242 1974.3184 1925.767 1974.4756 1925.767 1974.6695 C
f 
n
1926.5794 1973.7 m
1926.5794 1973.8939 1926.7366 1974.0511 1926.9306 1974.0511 C
1927.1245 1974.0511 1927.2818 1973.8939 1927.2818 1973.7 C
1927.2818 1973.506 1927.1245 1973.3488 1926.9306 1973.3488 C
1926.7366 1973.3488 1926.5794 1973.506 1926.5794 1973.7 C
f 
n
1926.3229 1972.2067 m
1926.3229 1972.4006 1926.4802 1972.5579 1926.6741 1972.5579 C
1926.868 1972.5579 1927.0253 1972.4006 1927.0253 1972.2067 C
1927.0253 1972.0128 1926.868 1971.8555 1926.6741 1971.8555 C
1926.4802 1971.8555 1926.3229 1972.0128 1926.3229 1972.2067 C
f 
n
1924.7665 1971.7824 m
1924.7665 1971.9763 1924.9238 1972.1335 1925.1177 1972.1335 C
1925.3116 1972.1335 1925.4689 1971.9763 1925.4689 1971.7824 C
1925.4689 1971.5884 1925.3116 1971.4312 1925.1177 1971.4312 C
1924.9238 1971.4312 1924.7665 1971.5884 1924.7665 1971.7824 C
f 
n
1923.9125 1972.8674 m
1923.9125 1973.0614 1924.0697 1973.2186 1924.2637 1973.2186 C
1924.4576 1973.2186 1924.6148 1973.0614 1924.6148 1972.8674 C
1924.6148 1972.6735 1924.4576 1972.5163 1924.2637 1972.5163 C
1924.0697 1972.5163 1923.9125 1972.6735 1923.9125 1972.8674 C
f 
n
1924.2844 1974.2667 m
1924.2844 1974.4606 1924.4417 1974.6179 1924.6356 1974.6179 C
1924.8295 1974.6179 1924.9868 1974.4606 1924.9868 1974.2667 C
1924.9868 1974.0728 1924.8295 1973.9155 1924.6356 1973.9155 C
1924.4417 1973.9155 1924.2844 1974.0728 1924.2844 1974.2667 C
f 
n
1921.8232 1984.0394 m
1920.9157 1982.4676 L
1920.0083 1984.0394 L
1921.8232 1984.0394 L
0.2327 w
1 J
1 j
3.863693 M
s 
n
vmrs
1921.8232 1986.5549 m
1920.9157 1988.1267 L
1920.0083 1986.5549 L
1921.8232 1986.5549 L
0.2327 w
1 J
1 j
3.863693 M
[0 0 0 0.65]vc
s 
n
1920.0824 1985.334 m
1920.0824 1985.7942 1920.4555 1986.1672 1920.9157 1986.1672 C
1921.3759 1986.1672 1921.749 1985.7942 1921.749 1985.334 C
1921.749 1984.8738 1921.3759 1984.5007 1920.9157 1984.5007 C
1920.4555 1984.5007 1920.0824 1984.8738 1920.0824 1985.334 C
0 j
s 
n
1920.9157 1991.3762 m
1920.9157 1989.1337 L
S 
n
1920.9157 1982.0271 m
1920.9157 1979.3964 L
S 
n
1919.0393 1992.4851 m
1922.6464 1992.4851 L
0.4615 w
1 j
S 
n
1919.0393 1977.8354 m
1922.6464 1977.8354 L
S 
n
1918.5706 1998.7082 m
1923.7105 1998.7082 L
1923.7105 1996.9511 L
1918.5706 1996.9511 L
1918.5706 1998.7082 L
0.5111 w
0 J
0 j
s 
n
1918.4762 1995.4595 m
1923.6161 1995.4595 L
1923.6161 1993.7024 L
1918.4762 1993.7024 L
1918.4762 1995.4595 L
s 
n
1919.0557 1993.6035 m
1922.9292 1993.6035 L
1922.9292 1976.4515 L
1919.0557 1976.4515 L
1919.0557 1993.6035 L
s 
n
1918.7891 1996.6377 m
1918.7891 1995.8307 L
1919.0166 1995.8198 1919.1726 1995.8797 1919.3343 1996.0401 C
1919.5096 1996.2141 1919.5721 1996.3924 1919.5438 1996.6377 C
1918.7891 1996.6377 L
0.2327 w
1 J
s 
n
1923.2995 1996.6377 m
1923.2995 1995.7232 L
1923.0168 1995.7326 1922.8292 1995.8237 1922.6469 1996.0401 C
1922.4878 1996.229 1922.4311 1996.3908 1922.4374 1996.6377 C
1923.2995 1996.6377 L
s 
n
1919.6512 1996.6377 m
1919.6527 1996.4165 1919.6918 1996.2807 1919.8083 1996.0925 C
1919.9174 1995.9161 1920.0121 1995.8261 1920.1937 1995.7259 C
1920.393 1995.8428 1920.4957 1995.9456 1920.6127 1996.1449 C
1920.7147 1996.3189 1920.7523 1996.4368 1920.7698 1996.6377 C
1919.6512 1996.6377 L
s 
n
1920.982 1996.6377 m
1920.9835 1996.4165 1921.0226 1996.2807 1921.1391 1996.0925 C
1921.2482 1995.9161 1921.3428 1995.8261 1921.5245 1995.7259 C
1921.772 1995.8128 1921.9106 1995.9231 1922.0509 1996.1449 C
1922.1587 1996.3154 1922.1972 1996.4363 1922.208 1996.6377 C
1920.982 1996.6377 L
s 
n
1918.1539 1976.4703 m
1923.6161 1976.4703 L
1923.6161 1974.7133 L
1918.1539 1974.7133 L
1918.1539 1976.4703 L
0.5111 w
0 J
s 
n
1893.163 1996.6569 m
1893.163 1995.8498 L
1893.3905 1995.8389 1893.5465 1995.8988 1893.7082 1996.0592 C
1893.8835 1996.2332 1893.946 1996.4115 1893.9177 1996.6569 C
1893.163 1996.6569 L
0.2327 w
1 J
s 
n
vmrs
1897.6735 1996.6569 m
1897.6735 1995.7423 L
1897.3907 1995.7518 1897.2031 1995.8428 1897.0209 1996.0592 C
1896.8618 1996.2481 1896.805 1996.41 1896.8113 1996.6569 C
1897.6735 1996.6569 L
0.2327 w
1 J
3.863693 M
[0 0 0 0.65]vc
s 
n
1894.0251 1996.6569 m
1894.0266 1996.4356 1894.0658 1996.2998 1894.1822 1996.1116 C
1894.2914 1995.9353 1894.386 1995.8453 1894.5676 1995.745 C
1894.7669 1995.8619 1894.8697 1995.9647 1894.9866 1996.164 C
1895.0887 1996.338 1895.1263 1996.4559 1895.1437 1996.6569 C
1894.0251 1996.6569 L
s 
n
1895.3559 1996.6569 m
1895.3574 1996.4356 1895.3965 1996.2998 1895.513 1996.1116 C
1895.6221 1995.9353 1895.7168 1995.8452 1895.8984 1995.745 C
1896.146 1995.8319 1896.2846 1995.9422 1896.4248 1996.164 C
1896.5326 1996.3345 1896.5712 1996.4554 1896.5819 1996.6569 C
1895.3559 1996.6569 L
s 
n
1893.6097 1977.8354 m
1897.2168 1977.8354 L
0.4615 w
1 j
S 
n
1893.4964 1993.6035 m
1897.37 1993.6035 L
1897.37 1976.5501 L
1893.4964 1976.5501 L
1893.4964 1993.6035 L
0.5111 w
0 J
0 j
s 
n
1892.702 1995.4595 m
1897.842 1995.4595 L
1897.842 1993.7024 L
1892.702 1993.7024 L
1892.702 1995.4595 L
s 
n
1896.3282 1984.2966 m
1895.4207 1982.7248 L
1894.5133 1984.2966 L
1896.3282 1984.2966 L
0.2327 w
1 J
1 j
s 
n
1896.3282 1986.8121 m
1895.4207 1988.3839 L
1894.5133 1986.8121 L
1896.3282 1986.8121 L
s 
n
1894.5875 1985.5911 m
1894.5875 1986.0513 1894.9605 1986.4244 1895.4207 1986.4244 C
1895.8809 1986.4244 1896.254 1986.0513 1896.254 1985.5911 C
1896.254 1985.131 1895.8809 1984.7579 1895.4207 1984.7579 C
1894.9605 1984.7579 1894.5875 1985.131 1894.5875 1985.5911 C
0 j
s 
n
1895.4207 1991.6334 m
1895.4207 1989.3908 L
S 
n
1895.4207 1982.2843 m
1895.4207 1979.6536 L
S 
n
1892.4872 1976.4703 m
1897.9494 1976.4703 L
1897.9494 1974.7133 L
1892.4872 1974.7133 L
1892.4872 1976.4703 L
0.5111 w
0 J
s 
n
1893.6097 1992.4851 m
1897.2168 1992.4851 L
0.4615 w
1 J
1 j
S 
n
vmrs
1905.8142 2008.8752 m
1905.6445 2008.7087 1905.4078 2008.6095 1905.1514 2008.6184 C
1904.6552 2008.6358 1904.2669 2009.0521 1904.2843 2009.5484 C
1904.3016 2010.0446 1904.7179 2010.4329 1905.2142 2010.4156 C
0.4307 w
3.863693 M
[0 0 0 0.65]vc
S 
n
1903.7875 2008.245 m
1903.6596 2008.0446 1903.4513 2007.8947 1903.1995 2007.8458 C
1902.712 2007.751 1902.2401 2008.0694 1902.1453 2008.5568 C
1902.0506 2009.0443 1902.3689 2009.5162 1902.8564 2009.611 C
S 
n
1902.0517 2007.3787 m
1901.9683 2007.1561 1901.7957 2006.9661 1901.5596 2006.8659 C
1901.1025 2006.6719 1900.5746 2006.8851 1900.3806 2007.3422 C
1900.1866 2007.7993 1900.3998 2008.3271 1900.8569 2008.5212 C
S 
n
1900.3902 2006.2784 m
1900.3549 2006.0432 1900.2256 2005.8215 1900.0154 2005.6744 C
1899.6087 2005.3896 1899.0481 2005.4885 1898.7632 2005.8952 C
1898.4784 2006.302 1898.5772 2006.8626 1898.984 2007.1474 C
S 
n
1898.8739 2004.7449 m
1898.8882 2004.5076 1898.8078 2004.2639 1898.6329 2004.0763 C
1898.2942 2003.7131 1897.7253 2003.6932 1897.3621 2004.0319 C
1896.9989 2004.3706 1896.979 2004.9395 1897.3177 2005.3027 C
S 
n
1897.7012 2003.0572 m
1897.7646 2002.8281 1897.7367 2002.573 1897.6045 2002.3531 C
1897.3488 2001.9275 1896.7964 2001.7897 1896.3707 2002.0455 C
1895.9451 2002.3012 1895.8074 2002.8536 1896.0631 2003.2793 C
S 
n
1896.7958 2001.2506 m
1896.9017 2001.0377 1896.923 2000.782 1896.8353 2000.5409 C
1896.6654 2000.0742 1896.1495 1999.8337 1895.6828 2000.0035 C
1895.2162 2000.1733 1894.9756 2000.6893 1895.1455 2001.1559 C
S 
n
1910.7341 2008.7801 m
1910.9039 2008.6136 1911.1405 2008.5144 1911.3969 2008.5234 C
1911.8931 2008.5407 1912.2814 2008.957 1912.2641 2009.4533 C
1912.2467 2009.9496 1911.8304 2010.3378 1911.3341 2010.3205 C
S 
n
1912.7608 2008.024 m
1912.8887 2007.8236 1913.097 2007.6737 1913.3489 2007.6248 C
1913.8363 2007.53 1914.3083 2007.8483 1914.403 2008.3358 C
1914.4978 2008.8232 1914.1794 2009.2952 1913.692 2009.39 C
S 
n
1914.4967 2007.0316 m
1914.5801 2006.8089 1914.7527 2006.619 1914.9888 2006.5188 C
1915.4459 2006.3247 1915.9737 2006.538 1916.1677 2006.9951 C
1916.3617 2007.4522 1916.1485 2007.98 1915.6914 2008.174 C
S 
n
1916.1581 2005.9312 m
1916.1935 2005.6961 1916.3227 2005.4744 1916.5329 2005.3273 C
1916.9396 2005.0425 1917.5003 2005.1413 1917.7851 2005.5481 C
1918.0699 2005.9548 1917.9711 2006.5155 1917.5643 2006.8003 C
S 
n
1917.6745 2004.3978 m
1917.6601 2004.1605 1917.7405 2003.9168 1917.9155 2003.7292 C
1918.2541 2003.366 1918.823 2003.3461 1919.1862 2003.6848 C
1919.5494 2004.0234 1919.5693 2004.5923 1919.2306 2004.9556 C
S 
n
1918.8471 2002.7099 m
1918.7838 2002.4808 1918.8117 2002.2257 1918.9438 2002.0058 C
1919.1995 2001.5801 1919.7519 2001.4424 1920.1776 2001.6982 C
1920.6032 2001.9539 1920.741 2002.5063 1920.4852 2002.9319 C
S 
n
1919.7525 2000.9034 m
1919.6466 2000.6905 1919.6253 2000.4348 1919.7131 2000.1937 C
1919.8829 1999.7271 1920.3988 1999.4865 1920.8655 1999.6564 C
1921.3321 1999.8262 1921.5727 2000.3421 1921.4029 2000.8087 C
S 
n
1906.9768 2010.053 m
1906.9768 2011.0472 1907.5011 2011.8532 1908.1479 2011.8532 C
1908.7947 2011.8532 1909.319 2011.0472 1909.319 2010.053 C
1909.319 2009.0588 1908.7947 2008.2528 1908.1479 2008.2528 C
1907.5011 2008.2528 1906.9768 2009.0588 1906.9768 2010.053 C
0.5332 w
s 
n
1907.2534 2011.6965 m
1900.6859 2010.8623 1894.5045 2005.3332 1893.584 1998.8198 C
1897.1092 1998.7964 L
1898.0506 2004.0135 1902.6127 2007.971 1908.1011 2007.971 C
0.5111 w
S 
n
1908.1062 2007.971 m
1913.6235 2007.971 1918.1534 2004.068 1919.0612 1998.81 C
1922.5832 1998.8198 L
1921.6783 2005.7212 1916.0834 2011.1639 1909.0627 2011.576 C
S 
n
1909.0678 1988.8662 m
1909.5447 1988.8662 L
0.3606 w
1 J
S 
n
vmrs
1906.7751 1991.7302 m
1905.3431 1991.317 L
1904.9924 1991.062 L
1905.5982 1989.9793 L
1905.8838 1988.6431 L
1908.0703 1988.8344 L
0.3606 w
1 J
3.863693 M
[0 0 0 0.65]vc
S 
n
1910.6655 1988.8104 m
1911.1329 1988.8104 L
1911.7723 1990.2025 L
1911.678 1990.5851 L
1910.9447 1990.9663 L
S 
n
1906.1069 1991.3808 m
1906.7113 1990.2025 L
1906.8069 1989.5663 L
1907.7301 1989.5663 L
S 
n
1908.9084 1989.7881 m
1909.7998 1989.8838 L
S 
n
1908.3912 1990.4639 m
1909.9368 1990.4639 L
1 j
S 
n
1904.9535 1978.7684 m
1904.8077 1978.3578 1904.7334 1978.1228 1904.6167 1977.703 C
1904.4825 1977.2199 1904.3441 1976.9525 1904.3227 1976.4515 C
1904.3178 1976.337 1904.3178 1976.2721 1904.3227 1976.1575 C
S 
n
1907.097 1978.5624 m
1906.705 1977.311 L
1906.6397 1976.2555 L
S 
n
1910.9696 1978.8665 m
1911.5249 1977.1476 L
1911.4596 1976.0268 L
S 
n
1909.8387 1978.6705 m
1910.0448 1976.6802 L
1910.0448 1975.9514 L
S 
n
1908.2606 1978.5298 m
1908.3912 1975.9514 L
S 
n
1903.2673 1979.4545 m
1903.0295 1978.8152 1902.9186 1978.4435 1902.7672 1977.7784 C
1902.5958 1977.0257 1902.5305 1976.5906 1902.4732 1975.8208 C
1902.7674 1975.7229 1902.9352 1975.6725 1903.2346 1975.5921 C
1903.8453 1975.4279 1904.5378 1975.2902 1904.8228 1975.2654 C
1905.3128 1975.2227 1908.6076 1974.9456 1910.9369 1975.4614 C
1911.3289 1975.4941 1911.7637 1975.5267 1912.2537 1975.5594 C
1912.3709 1975.5672 1912.6386 1975.639 1912.6231 1975.7554 C
1912.5477 1976.3208 1912.584 1976.528 1912.515 1977.0169 C
1912.429 1977.6269 1912.3984 1977.9833 1912.1883 1978.5624 C
1912.0724 1978.882 1911.9925 1979.0585 1911.829 1979.3565 C
S 
n
1912.5546 1995.9586 m
1916.4239 1995.9586 L
1917.7625 1995.251 L
0.2909 w
0 J
0 j
S 
n
1912.6502 1995.8247 m
1913.3308 1995.2473 L
1913.3195 1989.5904 L
1912.6519 1990.297 L
1912.6502 1995.8247 L
s 
n
1913.3013 1995.2317 m
1917.7246 1995.2317 L
1917.7246 1989.4388 L
1913.365 1989.4388 L
S 
n
1914.6057 1989.4388 m
1914.6057 1995.2317 L
1913.7475 1996.0061 L
S 
n
1915.5608 1996.0061 m
1916.5228 1995.3241 L
1916.5159 1989.5663 L
S 
n
1912.612 1994.7347 m
1913.3332 1993.9591 L
1917.6304 1993.9591 L
S 
n
1912.612 1991.7514 m
1913.2694 1990.9345 L
1917.6622 1990.9345 L
S 
n
vmrs
1919.7892 2011.2082 m
1919.7892 2011.6973 1920.1857 2012.0938 1920.6748 2012.0938 C
1921.1639 2012.0938 1921.5604 2011.6973 1921.5604 2011.2082 C
1921.5604 2010.719 1921.1639 2010.3226 1920.6748 2010.3226 C
1920.1857 2010.3226 1919.7892 2010.719 1919.7892 2011.2082 C
0.2909 w
1 J
3.863693 M
[0 0 0 0.65]vc
s 
n
1897.5656 2013.011 m
1897.5656 2013.5001 1897.9621 2013.8966 1898.4512 2013.8966 C
1898.9403 2013.8966 1899.3368 2013.5001 1899.3368 2013.011 C
1899.3368 2012.5219 1898.9403 2012.1254 1898.4512 2012.1254 C
1897.9621 2012.1254 1897.5656 2012.5219 1897.5656 2013.011 C
s 
n
1902.43 1994.3802 m
1906.6973 1982.8562 L
0.3606 w
1 j
S 
n
1902.998 1994.7688 m
1907.7361 1982.3779 L
S 
n
1903.0877 1994.8585 m
1903.0307 1995.1865 1903.0882 1995.4229 1903.2895 1995.688 C
1903.5464 1996.0265 1903.8781 1996.1616 1904.2984 1996.0991 C
1904.0313 1996.3759 1903.7219 1996.4636 1903.3492 1996.3681 C
1903.0916 1996.302 1902.941 1996.1976 1902.7888 1995.9794 C
1902.7158 1996.1527 1902.6618 1996.2472 1902.5496 1996.398 C
1902.3649 1996.6464 1902.2258 1996.7713 1901.9592 1996.9286 C
1901.8336 1996.6847 1901.7908 1996.5226 1901.7798 1996.2485 C
1901.7691 1995.9794 1901.7975 1995.8177 1901.8994 1995.5685 C
1901.6117 1995.6888 1901.3875 1995.6888 1901.0998 1995.5685 C
1900.7838 1995.4363 1900.6105 1995.2455 1900.5094 1994.9183 C
1900.8729 1995.0992 1901.1419 1995.1362 1901.5407 1995.0602 C
1901.7354 1995.0231 1901.8626 1995.0101 1902.019 1994.8884 C
1902.1836 1994.7604 1902.2603 1994.6424 1902.3105 1994.44 C
1902.3956 1994.6001 1902.4792 1994.6836 1902.6393 1994.7688 C
1902.7967 1994.8525 1902.9101 1994.8752 1903.0877 1994.8585 C
s 
n
1902.6692 1993.6104 m
1902.6841 1993.752 1902.7506 1993.847 1902.8785 1993.9094 C
1903.0125 1993.9748 1903.1375 1993.965 1903.2596 1993.8795 C
S 
n
1902.9681 1992.9602 m
1902.9314 1993.1002 1902.9732 1993.223 1903.0877 1993.3114 C
1903.2342 1993.4245 1903.445 1993.3978 1903.5585 1993.2517 C
S 
n
1910.6982 1984.6212 m
1911.2481 1983.918 1911.5065 1983.4634 1911.829 1982.631 C
1912.2721 1981.4874 1912.3954 1980.7556 1912.3517 1979.5299 C
1910.8389 1979.5299 L
1910.4254 1979.3577 1910.1797 1979.2824 1909.7407 1979.1932 C
1909.1012 1979.0633 1908.7228 1979.0877 1908.0703 1979.0952 C
1907.2108 1979.1051 1906.6723 1979.1605 1905.8783 1979.3239 C
1905.4979 1979.4021 1905.3508 1979.437 1905.0188 1979.5299 C
1904.4853 1979.3745 1904.1275 1979.3745 1903.594 1979.5299 C
1903.3496 1979.6011 1903.2142 1979.6603 1902.9959 1979.7913 C
1903.0348 1980.4162 1903.088 1980.7702 1903.2346 1981.3789 C
1903.345 1981.8372 1903.4247 1982.093 1903.594 1982.5329 C
S 
n
1904.9535 1981.4122 m
1904.8555 1980.6834 L
1904.8555 1980.0526 L
S 
n
1908.2178 1984.6212 m
1908.4239 1983.8598 L
1908.4892 1982.4676 L
S 
n
1909.414 1984.5458 m
1909.8253 1983.6566 1910.0102 1983.1259 1910.2407 1982.1737 C
1910.4347 1981.3725 1910.5074 1980.9075 1910.5675 1980.0853 C
S 
n
1903.3653 1989.7351 m
1903.7573 1989.6371 L
1904.3881 1988.9511 L
1903.7573 1990.3333 L
1903.1039 1989.9086 L
1902.5711 1988.9084 L
1902.4405 1988.4837 L
1903.8553 1988.0163 L
1904.8882 1987.1995 L
S 
n
1902.5058 1988.2877 m
1902.4441 1988.0457 1902.3926 1987.911 1902.2772 1987.6896 C
1901.9859 1987.131 1901.4691 1987.0771 1901.1463 1986.5361 C
1900.9867 1986.2687 1900.9093 1986.1057 1900.8196 1985.8074 C
1900.7256 1985.4948 1900.6591 1985.3056 1900.689 1984.9806 C
1900.7177 1984.6679 1900.6969 1984.4045 1900.9503 1984.2191 C
1901.113 1984.1001 1901.2502 1984.0643 1901.4504 1984.0884 C
1901.7086 1984.245 1901.8396 1984.3921 1902.1364 1984.4478 C
1903.2346 1984.6539 1903.6266 1984.7519 1904.4207 1984.9806 C
1904.6897 1985.0705 1904.9108 1985.0459 1904.9862 1985.4379 C
1905.1059 1986.0607 1904.8228 1986.2974 1904.7148 1986.7975 C
1904.8882 1987.0915 L
S 
n
1904.7801 1984.9479 m
1905.0701 1984.755 1905.2217 1984.6184 1905.4435 1984.3498 C
1905.6905 1984.0508 1905.8057 1983.8528 1905.9436 1983.4904 C
1905.7202 1983.2506 1905.579 1983.1263 1905.3128 1982.935 C
1905.1302 1982.8038 1905.0215 1982.7363 1904.8228 1982.631 C
1904.3901 1982.5451 1904.1289 1982.5375 1903.692 1982.5983 C
1903.0881 1982.6823 1902.7333 1982.8134 1902.2344 1983.1637 C
1901.8636 1983.4242 1901.6736 1983.6164 1901.4177 1983.9905 C
S 
n
1904.5514 1982.4676 m
1904.5411 1982.2819 1904.6014 1982.148 1904.7475 1982.0328 C
1904.9118 1981.9032 1905.0894 1981.8815 1905.2802 1981.9675 C
1905.7476 1982.1409 1906.607 1982.8923 1906.607 1982.8923 C
1906.1069 1983.4577 L
S 
n
1905.3455 1981.8368 m
1905.5876 1981.4048 1905.7707 1981.1764 1906.1395 1980.846 C
1906.4725 1980.5477 1906.6913 1980.4037 1907.097 1980.216 C
1907.3911 1979.9873 L
1907.8258 1979.9546 L
S 
n
vmrs
1907.1624 1980.8467 m
1907.3672 1980.6948 1907.4734 1980.5908 1907.6298 1980.3894 C
1907.7859 1980.1882 1907.7383 1979.9553 1907.9565 1979.8239 C
1908.1891 1979.6839 1908.42 1979.6839 1908.6526 1979.8239 C
0.3606 w
1 J
1 j
3.863693 M
[0 0 0 0.65]vc
S 
n
1907.8585 1981.0101 m
1908.1852 1980.4547 L
1908.3912 1979.8566 L
S 
n
1911.2309 1988.1896 m
1911.4554 1987.8743 1911.5254 1987.6178 1911.4923 1987.2322 C
1911.4689 1986.9595 1911.3654 1986.8228 1911.2635 1986.5688 C
1911.1413 1986.264 1911.0617 1986.0955 1910.9042 1985.8074 C
1909.218 1986.0033 L
1908.0703 1986.036 L
1906.499 1985.8727 L
S 
n
1906.8031 1985.0459 m
1908.6199 1985.144 L
1910.7962 1984.9479 L
1910.9042 1985.5133 L
S 
n
1913.9072 1989.2124 m
1913.7542 1989.105 1913.6819 1988.9939 1913.6459 1988.8104 C
1913.6188 1988.6723 1913.627 1988.5819 1913.6786 1988.451 C
1913.8902 1988.3619 1914.0132 1988.3185 1914.2339 1988.255 C
1914.5497 1988.1642 1914.734 1988.1278 1915.0607 1988.0917 C
1915.1606 1988.3177 1915.2605 1988.4395 1915.4628 1988.5817 C
1915.8228 1988.8347 1916.1634 1988.5814 1916.5836 1988.7124 C
1916.7849 1988.7751 1916.8776 1988.8733 1917.0836 1988.9184 C
1917.3364 1988.9738 1917.6328 1988.6863 1917.7471 1988.9184 C
1917.8033 1989.0327 1917.8033 1989.1308 1917.7471 1989.2451 C
S 
n
1913.3745 1988.157 m
1913.6417 1988.2611 1913.8181 1988.2849 1914.1033 1988.255 C
1914.4828 1988.2153 1914.6415 1987.996 1914.9953 1987.8529 C
1915.1259 1987.8001 1915.3415 1987.8628 1915.3321 1987.7222 C
1915.2994 1987.2322 1914.9755 1987.2045 1914.636 1987.1995 C
1914.3355 1987.1952 1914.2693 1987.544 1913.9726 1987.5916 C
1913.7534 1987.6266 1913.5761 1987.3822 1913.4072 1987.5262 C
1913.329 1987.5928 1913.2942 1987.6537 1913.2765 1987.7549 C
S 
n
1911.7637 1989.9412 m
1912.4171 1989.4411 L
1912.7864 1987.7876 L
S 
n
1913.1458 1987.6896 m
1912.4824 1987.3955 L
1911.5576 1986.2647 L
S 
n
1914.7013 1987.0915 m
1914.2012 1986.2647 1914.1033 1986.0033 1913.8092 1984.9479 C
1913.6524 1984.3849 1913.4072 1983.621 1912.7538 1983.0004 C
1912.564 1982.8201 1912.4166 1982.6758 1912.1557 1982.6963 C
1912.0352 1982.7057 1911.9637 1982.7296 1911.8616 1982.7943 C
S 
n
1916.2242 1988.9084 m
1916.5509 1988.9511 L
S 
n
1979.62 2014.7529 m
1979.62 2015.8329 1978.6943 2016.72 1977.6529 2016.72 C
1976.573 2016.72 1975.6859 2015.8329 1975.6859 2014.7529 C
1975.6859 2013.673 1976.573 2012.7859 1977.6529 2012.7859 C
1978.6943 2012.7859 1979.62 2013.673 1979.62 2014.7529 C
[1 0.45 0 0.14]vc
f 
n
1979.1957 2009.145 m
1978.6172 2009.1065 1978.1543 2009.0293 1977.6529 2009.0293 C
1977.113 2009.0293 1976.6116 2009.1065 1976.1102 2009.145 C
1976.1102 1990.7088 L
1976.6116 1990.7474 1977.113 1990.8245 1977.6529 1990.8245 C
1978.1543 1990.8245 1978.6172 1990.7474 1979.1957 1990.7088 C
1979.1957 2009.145 L
f 
n
1994.2422 2000.814 m
1991.928 1995.3757 L
1991.7738 1995.0286 1991.4652 1994.6815 1991.1952 1994.2958 C
1988.8039 1999.6955 1986.5284 2005.5581 1985.4484 2009.145 C
1984.7927 2009.1065 1984.2913 2009.0293 1983.7513 2009.0293 C
1983.1342 2009.0293 1982.5557 2009.1065 1982.0157 2009.145 C
1984.4456 2003.7838 1988.2254 1994.3729 1989.5753 1990.7088 C
1989.961 1990.7474 1990.3467 1990.8245 1990.771 1990.8245 C
1991.1181 1990.8245 1991.5038 1990.7474 1991.928 1990.7088 C
1993.8565 1996.3014 1997.7135 2004.7867 1999.7962 2009.145 C
1999.3334 2009.1065 1998.9477 2009.0293 1998.562 2009.0293 C
1998.1378 2009.0293 1997.7135 2009.1065 1997.3278 2009.145 C
1994.2422 2000.814 L
f 
n
true eomode
2015.8537 1994.6815 m
2014.8123 1993.6786 2012.7681 1992.0202 2010.1454 1992.0202 C
2005.4785 1992.0202 2003.1258 1995.7228 2003.4729 2000.0426 C
2008.9112 2000.0426 L
2011.4953 2000.0426 2014.1181 2000.0041 2016.7408 1999.9269 C
2017.1265 2006.368 2013.1924 2009.3764 2008.9112 2009.3764 C
2003.1644 2009.3764 2000.0788 2005.2495 2000.0788 1999.8883 C
2000.0788 1993.9101 2003.8586 1990.4003 2009.1812 1990.4003 C
2011.5339 1990.4003 2013.9252 1991.3259 2015.8151 1992.6758 C
2015.8537 1994.6815 L
h
2003.4729 2001.4697 m
2003.7043 2004.7095 2005.2857 2008.1808 2008.9112 2008.1808 C
2012.7296 2008.1808 2013.6552 2004.8252 2013.7324 2001.4697 C
2003.4729 2001.4697 L
f 
n
false eomode
2019.3375 1990.7088 m
2019.8389 1990.7474 2020.3403 1990.8245 2020.8803 1990.8245 C
2021.3817 1990.8245 2021.8445 1990.7474 2022.4231 1990.7088 C
2022.4231 2000.6983 L
2022.4231 2002.781 2022.5002 2004.0539 2023.8501 2005.5966 C
2024.4287 2006.2523 2025.4701 2006.5609 2026.3186 2006.5609 C
2026.9743 2006.5609 2027.5528 2006.098 2028.1313 2005.9438 C
2028.6713 2009.1836 L
2028.3242 2009.3378 2028.0156 2009.3764 2027.4756 2009.3764 C
2025.5472 2009.3764 2023.8887 2007.7565 2022.6159 2005.7509 C
2022.4231 2005.2881 L
2022.4231 2009.145 L
2021.8445 2009.1065 2021.3817 2009.0293 2020.8803 2009.0293 C
2020.3403 2009.0293 2019.8389 2009.1065 2019.3375 2009.145 C
2019.3375 1990.7088 L
f 
n
2029.5053 1994.45 m
2029.351 1993.4858 2029.0039 1992.5601 2028.6953 1991.6345 C
2030.0453 1990.8245 2031.9352 1990.4003 2033.5165 1990.4003 C
2036.9106 1990.4003 2040.6133 1992.3673 2040.6133 1996.4942 C
2040.6133 2002.6653 2031.5109 2000.0426 2031.5109 2004.9795 C
2031.5109 2007.0623 2033.0923 2008.1808 2035.0207 2008.1808 C
2036.4478 2008.1808 2037.7977 2006.908 2038.2991 2005.6352 C
2038.6463 2005.6352 L
2038.8777 2006.5609 2039.1862 2007.4865 2039.5719 2008.3736 C
2038.8777 2008.7979 2037.2191 2009.3764 2035.2136 2009.3764 C
2031.7423 2009.3764 2028.9267 2007.3708 2028.9267 2003.6682 C
2028.9267 1996.9185 2038.0291 2000.3126 2038.0291 1995.1057 C
2038.0291 1993.0615 2036.1392 1991.5959 2034.2493 1991.5959 C
2032.4366 1991.5959 2030.7395 1992.9458 2029.8138 1994.45 C
2029.5053 1994.45 L
f 
n
2047.6379 2014.7529 m
2047.6379 2015.8329 2046.7122 2016.72 2045.6709 2016.72 C
2044.5909 2016.72 2043.7038 2015.8329 2043.7038 2014.7529 C
2043.7038 2013.673 2044.5909 2012.7859 2045.6709 2012.7859 C
2046.7122 2012.7859 2047.6379 2013.673 2047.6379 2014.7529 C
f 
n
2047.2136 2009.145 m
2046.6351 2009.1065 2046.1722 2009.0293 2045.6709 2009.0293 C
2045.1309 2009.0293 2044.6295 2009.1065 2044.128 2009.145 C
2044.128 1990.7088 L
2044.6295 1990.7474 2045.1309 1990.8245 2045.6709 1990.8245 C
2046.1722 1990.8245 2046.6351 1990.7474 2047.2136 1990.7088 C
2047.2136 2009.145 L
f 
n
vmrs
2052.9801 2012.9634 m
2052.9801 2009.145 L
2050.5888 2009.145 L
2050.7045 2008.6436 2050.7045 2008.1808 2050.5888 2007.6794 C
2052.9801 2007.6794 L
2052.9801 1996.4557 L
2052.7873 1991.7502 2054.4843 1990.4003 2057.4156 1990.4003 C
2058.5341 1990.4003 2059.614 1990.7088 2060.6554 1991.0945 C
2060.6554 1992.0202 L
2060.0769 1991.9044 2059.4984 1991.7502 2058.9198 1991.7502 C
2055.7185 1991.7502 2056.0657 1995.6457 2056.0657 1997.9984 C
2056.0657 2007.6794 L
2060.154 2007.6794 L
2060.0383 2008.0651 2060.0383 2008.605 2060.154 2009.145 C
2056.0657 2009.145 L
2056.0657 2014.159 L
2052.9801 2012.9634 L
[1 0.45 0 0.14]vc
f 
n
2081.5148 2012.9634 m
2081.5148 2009.145 L
2079.1235 2009.145 L
2079.2392 2008.6436 2079.2392 2008.1808 2079.1235 2007.6794 C
2081.5148 2007.6794 L
2081.5148 1996.4557 L
2081.3219 1991.7502 2083.019 1990.4003 2085.9503 1990.4003 C
2087.0688 1990.4003 2088.1487 1990.7088 2089.1901 1991.0945 C
2089.1901 1992.0202 L
2088.6116 1991.9044 2088.033 1991.7502 2087.4545 1991.7502 C
2084.2532 1991.7502 2084.6003 1995.6457 2084.6003 1997.9984 C
2084.6003 2007.6794 L
2088.6887 2007.6794 L
2088.573 2008.0651 2088.573 2008.605 2088.6887 2009.145 C
2084.6003 2009.145 L
2084.6003 2014.159 L
2081.5148 2012.9634 L
f 
n
1973.8114 1987.0379 m
1973.3486 1986.9994 1973.0014 1986.9223 1972.6157 1986.9223 C
1972.1529 1986.9223 1971.7672 1986.9994 1971.3815 1987.0379 C
1970.5715 1984.4152 1967.4474 1976.817 1965.7118 1972.6901 C
1963.9376 1976.7399 1961.7777 1983.1424 1960.7749 1987.0379 C
1960.3892 1986.9994 1960.0807 1986.9223 1959.7721 1986.9223 C
1959.425 1986.9223 1959.0779 1986.9994 1958.7693 1987.0379 C
1957.4965 1982.9882 1954.9509 1976.1228 1953.3696 1972.7287 C
1951.5182 1977.2027 1949.8212 1982.371 1948.4713 1987.0379 C
1947.8155 1986.9994 1947.3141 1986.9223 1946.7742 1986.9223 C
1946.1956 1986.9223 1945.6171 1986.9994 1945.0771 1987.0379 C
1947.1599 1982.2168 1949.6283 1975.5828 1951.9039 1968.6018 C
1952.251 1968.6403 1952.5982 1968.7175 1952.9453 1968.7175 C
1953.2924 1968.7175 1953.601 1968.6403 1953.9866 1968.6018 C
1955.838 1974.5029 1957.9593 1980.134 1959.2321 1982.6025 C
1960.6592 1979.0541 1962.9733 1972.343 1963.9762 1968.6018 C
1964.3233 1968.6403 1964.6704 1968.7175 1965.0175 1968.7175 C
1965.3261 1968.7175 1965.6347 1968.6403 1966.0589 1968.6018 C
1968.4502 1975.66 1972.4614 1984.3767 1973.8114 1987.0379 C
f 
n
1979.1901 1987.0379 m
1978.6116 1986.9994 1978.1487 1986.9223 1977.6473 1986.9223 C
1977.1073 1986.9223 1976.6059 1986.9994 1976.1045 1987.0379 C
1976.1045 1968.6018 L
1976.6059 1968.6403 1977.1073 1968.7175 1977.6473 1968.7175 C
1978.1487 1968.7175 1978.6116 1968.6403 1979.1901 1968.6018 C
1979.1901 1987.0379 L
f 
n
true eomode
1998.325 1972.5744 m
1997.2836 1971.5716 1995.2394 1969.9131 1992.6166 1969.9131 C
1987.9498 1969.9131 1985.597 1973.6158 1985.9442 1977.9356 C
1991.3825 1977.9356 L
1993.9666 1977.9356 1996.5893 1977.897 1999.212 1977.8199 C
1999.5978 1984.261 1995.6637 1987.2694 1991.3825 1987.2694 C
1985.6356 1987.2694 1982.55 1983.1424 1982.55 1977.7813 C
1982.55 1971.803 1986.3298 1968.2932 1991.6524 1968.2932 C
1994.0052 1968.2932 1996.3965 1969.2189 1998.2864 1970.5688 C
1998.325 1972.5744 L
h
1985.9442 1979.3627 m
1986.1756 1982.6025 1987.7569 1986.0737 1991.3825 1986.0737 C
1995.2008 1986.0737 1996.1265 1982.7182 1996.2036 1979.3627 C
1985.9442 1979.3627 L
f 
n
false eomode
2001.7316 1968.6018 m
2002.233 1968.6403 2002.7344 1968.7175 2003.2744 1968.7175 C
2003.7758 1968.7175 2004.2386 1968.6403 2004.8172 1968.6018 C
2004.8172 1977.5499 L
2004.8172 1982.2939 2005.82 1985.2638 2009.8698 1985.2638 C
2013.4953 1985.2638 2014.151 1982.4482 2014.151 1978.8612 C
2014.151 1968.6018 L
2014.6524 1968.6403 2015.1538 1968.7175 2015.6938 1968.7175 C
2016.1952 1968.7175 2016.658 1968.6403 2017.2365 1968.6018 C
2017.2365 1979.7483 L
2017.2365 1984.8395 2015.5009 1987.2694 2011.0269 1987.2694 C
2008.2884 1987.2694 2006.1671 1985.8809 2004.8172 1983.5281 C
2004.8172 1987.0379 L
2004.2386 1986.9994 2003.7758 1986.9223 2003.2744 1986.9223 C
2002.7344 1986.9223 2002.233 1986.9994 2001.7316 1987.0379 C
2001.7316 1968.6018 L
f 
n
true eomode
2075.9251 2002.9103 m
2075.9251 2007.3175 2073.702 2009.4626 2069.6069 2009.4626 C
2067.3058 2009.4626 2065.1997 2008.6045 2063.3277 2007.3175 C
2063.3277 2005.1334 L
2063.7567 2005.1334 L
2064.0297 2005.9914 2065.5507 2007.8245 2068.3978 2007.8245 C
2071.323 2007.8245 2072.961 2006.1474 2072.961 2003.2613 C
2072.961 2001.3893 2071.908 2001.1553 2068.8269 2000.6482 C
2065.1607 2000.0632 2061.6116 1999.4782 2061.6116 1995.032 C
2061.6116 1992.1459 2064.0297 1990.2738 2066.7988 1990.2738 C
2069.1389 1990.2738 2070.9329 1991.0929 2072.571 1992.7309 C
2072.922 1993.082 L
2073.234 1990.7809 2074.9111 1990.4689 2076.9392 1990.8199 C
2077.3682 1990.8979 2077.8362 1991.0929 2078.1092 1991.2099 C
2078.1092 1992.0679 L
2075.8081 1991.5609 2075.9251 1992.3409 2075.9251 1993.862 C
2075.9251 2002.9103 L
h
2072.805 1994.603 m
2072.805 1994.33 2072.025 1993.667 2071.752 1993.394 C
2071.0109 1992.6529 2069.6849 1991.9119 2068.6319 1991.9119 C
2066.2528 1991.9119 2064.8097 1993.121 2064.8097 1995.578 C
2064.8097 1999.1272 2068.7879 1999.5172 2071.44 2000.0242 C
2072.805 2000.2972 L
2072.805 1994.603 L
f 
n
false eomode
2066.9257 2014.7529 m
2066.9257 2015.7789 2066.0464 2016.6216 2065.0571 2016.6216 C
2064.0311 2016.6216 2063.1884 2015.7789 2063.1884 2014.7529 C
2063.1884 2013.727 2064.0311 2012.8842 2065.0571 2012.8842 C
2066.0464 2012.8842 2066.9257 2013.727 2066.9257 2014.7529 C
f 
n
2075.644 2014.7529 m
2075.644 2015.7789 2074.7646 2016.6216 2073.7754 2016.6216 C
2072.7494 2016.6216 2071.9067 2015.7789 2071.9067 2014.7529 C
2071.9067 2013.727 2072.7494 2012.8842 2073.7754 2012.8842 C
2074.7646 2012.8842 2075.644 2013.727 2075.644 2014.7529 C
f 
n
1959.6265 2009.145 m
1959.6266 2005.7196 L
1960.9786 2008.0211 1963.0817 2009.3764 1965.7872 2009.3764 C
1970.2613 2009.3764 1971.9969 2006.9465 1971.9969 2001.8554 C
1971.9969 1990.7088 L
1971.4184 1990.7474 1970.9555 1990.8245 1970.4541 1990.8245 C
1969.9141 1990.8245 1969.4128 1990.7474 1968.9114 1990.7088 C
1968.9114 2000.9683 L
1968.9114 2004.5553 1968.2557 2007.3708 1964.6301 2007.3708 C
1961.0771 2007.3708 1959.8694 2005.0848 1959.6266 2001.3202 C
1959.6265 1990.7088 L
1959.0217 1990.7483 1958.571 1990.8245 1958.0838 1990.8245 C
1957.513 1990.8202 1957.0276 1990.7462 1956.541 1990.7088 C
1956.4919 1993.9338 L
1955.2491 1991.6398 1953.073 1990.4003 1950.4084 1990.4003 C
1946.1658 1990.4003 1944.0445 1992.5987 1944.0445 1997.8056 C
1944.0445 2009.145 L
1944.5459 2009.1065 1945.0473 2009.0293 1945.5873 2009.0293 C
1946.0887 2009.0293 1946.5515 2009.1065 1947.13 2009.145 C
1947.13 1998.7313 L
1947.13 1994.6815 1948.3257 1992.2902 1951.797 1992.2902 C
1955.2047 1992.2902 1956.2684 1994.8947 1956.4919 1997.3715 C
1956.492 2009.145 L
1957.0264 2009.1077 1957.5144 2009.034 1958.0348 2009.0293 C
1958.571 2009.0293 1959.0217 2009.1055 1959.5775 2009.145 C
1959.6265 2009.145 L
f 
n
1892.5163 1975.8411 m
1888.815 1979.4474 1886.8483 1984.5779 1886.8483 1990.2879 C
1886.8483 2001.5686 1896.2226 2011.2773 1907.5051 2011.5541 C
0.8761 w
3.863693 M
[0 0 0 0.65]vc
S 
n
1879.946 1990.2879 m
1879.946 2005.828 1892.5434 2018.4254 1908.0835 2018.4254 C
1923.6237 2018.4254 1936.2211 2005.828 1936.2211 1990.2879 C
1936.2211 1974.7478 1923.6237 1962.1504 1908.0835 1962.1504 C
1892.5434 1962.1504 1879.946 1974.7478 1879.946 1990.2879 C
s 
n
1908.8818 2011.5157 m
1920.1021 2010.947 1929.3188 2001.6494 1929.3188 1990.2879 C
1929.3188 1984.7846 1927.0526 1979.6678 1923.6187 1975.8953 C
S 
n
1920.7694 1973.2629 m
1918.0286 1971.118 1912.791 1969.1795 1908.6853 1968.9129 C
S 
n
1906.9271 1968.9915 m
1902.5233 1969.2204 1898.9612 1970.7022 1895.6684 1973.2134 C
S 
n
1894.5212 1973.8914 m
1894.5212 1974.3383 1894.8835 1974.7006 1895.3305 1974.7006 C
1895.7774 1974.7006 1896.1397 1974.3383 1896.1397 1973.8914 C
1896.1397 1973.4444 1895.7774 1973.0821 1895.3305 1973.0821 C
1894.8835 1973.0821 1894.5212 1973.4444 1894.5212 1973.8914 C
0.5538 w
1 J
1 j
s 
n
1920.3043 1973.8914 m
1920.3043 1974.3383 1920.6666 1974.7006 1921.1136 1974.7006 C
1921.5605 1974.7006 1921.9229 1974.3383 1921.9229 1973.8914 C
1921.9229 1973.4444 1921.5605 1973.0821 1921.1136 1973.0821 C
1920.6666 1973.0821 1920.3043 1973.4444 1920.3043 1973.8914 C
s 
n
vmrs
1906.2448 2015.5779 m
1906.4542 2016.2733 1907.3458 2016.6276 1907.9754 2016.2657 C
1908.3591 2016.0451 1908.5495 2015.7411 1908.57 2015.299 C
1908.5932 2014.7989 1908.3075 2014.5075 1907.9176 2014.1933 C
1907.6579 2013.984 1907.471 2013.8955 1907.1445 2013.8275 C
0.4615 w
1 J
3.863693 M
[0 0 0 0.65]vc
S 
n
1903.6957 2013.9082 m
1902.2037 2012.9991 1901.6754 2013.6709 1901.6533 2014.4597 C
1901.6329 2015.1873 1902.3289 2015.541 1903.1174 2015.6173 C
1904.5992 2015.7605 1905.0781 2013.8854 1907.0192 2013.8289 C
1907.4792 2013.837 L
1907.8989 2013.8443 L
1909.8369 2013.9685 1910.25 2015.8592 1911.7359 2015.7677 C
1912.5266 2015.719 1913.2345 2015.3898 1913.2396 2014.6619 C
1913.245 2013.8729 1912.7404 2013.183 1911.2177 2014.0396 C
S 
n
1890.8482 1997.1304 m
1890.8482 1997.1304 1890.0712 1995.9876 1889.6729 1995.2021 C
1889.3332 1994.5323 1888.9182 1993.4308 1888.9182 1993.4308 C
1889.2734 1993.0233 1889.4661 1992.8971 1889.6729 1992.4666 C
1889.9347 1991.9214 1889.876 1991.7941 1889.8125 1991.423 C
0.2909 w
0 J
true setoverprint
S 
false setoverprint
n
1891.1823 1992.0262 m
1890.1043 1991.5294 1888.3923 1990.768 1888.3527 1990.2025 C
1888.2927 1989.3448 1889.8103 1988.2223 1890.9512 1987.4672 C
1891.5062 1988.2128 1891.7108 1988.7813 1891.7583 1989.7096 C
1891.8059 1990.6394 1891.6597 1991.227 1891.1823 1992.0262 C
true setoverprint
s 
false setoverprint
n
1891.5488 1991.062 m
1890.3752 1990.5692 L
true setoverprint
S 
false setoverprint
n
1891.706 1989.7097 m
1890.3228 1989.7097 L
true setoverprint
S 
false setoverprint
n
1891.4965 1988.4837 m
1890.2181 1988.9765 L
true setoverprint
S 
false setoverprint
n
1889.7239 1988.2951 m
1889.6566 1987.9832 1889.598 1987.8088 1889.4634 1987.5195 C
1889.248 1987.0569 1889.0726 1986.8083 1888.7087 1986.4505 C
1889.1206 1985.8867 1889.3821 1985.5854 1889.8824 1985.0983 C
1890.2749 1984.716 1890.5119 1984.5139 1890.9512 1984.1865 C
true setoverprint
S 
false setoverprint
n
1925.3802 1997.1304 m
1925.3802 1997.1304 1926.1572 1995.9876 1926.5555 1995.2021 C
1926.8951 1994.5324 1927.3102 1993.4308 1927.3102 1993.4308 C
1926.9549 1993.0233 1926.7622 1992.8971 1926.5555 1992.4666 C
1926.2937 1991.9214 1926.3063 1991.7498 1926.3699 1991.3787 C
S 
n
1925.0461 1992.0262 m
1926.2661 1991.8888 1927.7941 1990.084 1928.0603 1989.5718 C
1928.3373 1989.039 1926.2661 1987.9182 1925.2771 1987.4672 C
1924.7222 1988.2128 1924.5175 1988.7814 1924.47 1989.7096 C
1924.4225 1990.6394 1924.5686 1991.227 1925.0461 1992.0262 C
s 
n
1924.6795 1991.062 m
1925.8532 1990.5692 L
S 
n
1924.5224 1989.7097 m
1925.9056 1989.7097 L
S 
n
1924.7319 1988.4837 m
1926.0103 1988.9765 L
S 
n
1926.5031 1988.0787 m
1926.5403 1987.671 1926.6006 1987.4371 1926.765 1987.0621 C
1926.97 1986.5948 1927.1479 1986.3428 1927.5197 1985.9932 C
1927.1078 1985.4293 1926.8464 1985.1281 1926.346 1984.6409 C
1925.9535 1984.2587 1925.7165 1984.0565 1925.2771 1983.7291 C
S 
n
1898.7682 1976.7455 m
1902.577 1976.7782 L
0.3606 w
1 J
1 j
S 
n
1912.6558 1976.7455 m
1917.1163 1976.7782 L
S 
n
vmrs
1905.1495 1985.6113 m
1905.4762 1985.742 L
0.3606 w
1 J
1 j
3.863693 M
[0 0 0 0.65]vc
S 
n
1908.7832 1979.8239 m
1908.7833 1979.99 1908.7761 1980.0845 1908.7506 1980.2486 C
1908.6802 1980.7024 1908.5791 1980.9637 1908.3259 1981.3468 C
1907.8912 1982.1409 L
1907.2277 1982.5329 L
1906.8031 1982.6963 L
S 
n
vmr
vmr
end
%%Trailer
\ No newline at end of file
diff --git a/doc/shared/template/colours.tex b/doc/shared/template/colours.tex
new file mode 100644
index 0000000000000000000000000000000000000000..0554ba055f86482e88e07b50a3bd4ad8a77bdbbd
--- /dev/null
+++ b/doc/shared/template/colours.tex
@@ -0,0 +1,26 @@
+\usepackage[table]{xcolor}
+
+% begin UVIE primary colours
+\iffalse
+
+% colours from numeric colour values in corporate design document
+\definecolor{uvie-blue}{RGB}{0, 99, 166}
+\definecolor{uvie-orangered}{RGB}{221, 72, 20}
+\definecolor{uvie-goldenyellow}{RGB}{234, 171, 0}
+% UVIE secondary colours
+\definecolor{uvie-gray}{RGB}{102, 102, 102}
+\definecolor{uvie-burgundy}{RGB}{167, 28, 73}
+
+\else
+% colours from actual colour samples in corporate design document
+%r: 0 g:58 b:133
+\definecolor{uvie-blue}{RGB}{0, 79, 150}
+\definecolor{uvie-orangered}{RGB}{225, 55, 15}
+\definecolor{uvie-goldenyellow}{RGB}{248, 169, 0}
+% UVIE secondary colours
+\definecolor{uvie-gray}{RGB}{104, 104, 104}
+\definecolor{uvie-burgundy}{RGB}{141, 22, 51}
+
+\fi
+% end UVIE primary colours
+
diff --git a/doc/shared/template/figures.tex b/doc/shared/template/figures.tex
new file mode 100644
index 0000000000000000000000000000000000000000..554be60a7adcbbd68dc0c7a28235adc1b2de69d4
--- /dev/null
+++ b/doc/shared/template/figures.tex
@@ -0,0 +1,2 @@
+\newcommand{\fig}[1]{Figure \ref{#1}}
+
diff --git a/doc/shared/template/fonts.tex b/doc/shared/template/fonts.tex
new file mode 100644
index 0000000000000000000000000000000000000000..efdcb275839704454067858da8525f9700a8f173
--- /dev/null
+++ b/doc/shared/template/fonts.tex
@@ -0,0 +1,61 @@
+\usepackage{fontspec}
+%
+\defaultfontfeatures[MyriadPro-SemiCondensed]{
+	Path		= ../shared/fonts/,
+	Extension	= .otf,
+	UprightFont	= *-light,
+	ItalicFont	= *-italic,
+	BoldFont	= *-bold,
+	BoldItalicFont	= *-bold-italic
+%	LetterSpace	= 5pt		% Laufweite
+}
+%
+\defaultfontfeatures[MyriadPro]{
+	Path		= ../shared/fonts/,
+	Extension	= .otf,
+	UprightFont	= *-regular,
+	ItalicFont	= *-italic,
+	BoldFont	= *-bold,
+	BoldItalicFont	= *-bold-italic
+}%
+\defaultfontfeatures[MyriadProLight]{
+	Path		= ../shared/fonts/,
+	Extension	= .otf,
+	UprightFont	= MyriadPro-light,
+	ItalicFont	= MyriadPro-light-italic,
+}
+
+\setmainfont{MyriadPro}
+
+
+
+\makeatletter
+\renewcommand\normalsize{%
+\@setfontsize\normalsize{11pt}{14pt}
+\abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@%
+\abovedisplayshortskip \z@ \@plus2\p@%
+\belowdisplayshortskip 5\p@ \@plus2\p@ \@minus3\p@%
+\belowdisplayskip \abovedisplayskip%
+\let\@listi\@listI%
+}
+\normalsize  
+\makeatother
+
+
+
+\usepackage{titlesec}
+
+\titleformat{\chapter}[hang]
+  {\fontspec{MyriadProLight}\fontsize{30}{36}\selectfont\color{uvie-blue}}
+  {\fontspec{MyriadPro}\selectfont\thechapter.}{8pt}{}
+\titlespacing*{\chapter}{0pt}{-20pt}{20pt}
+
+\titleformat{\section}
+  {\fontspec{MyriadPro}\fontsize{13}{16}\selectfont\color{uvie-blue}}
+  {\thesection}{1em}{}
+
+\titleformat{\subsection}
+  {\fontspec{MyriadPro}\fontsize{13}{16}\selectfont\color{uvie-blue}}
+  {\thesubsection}{1em}{}
+
+\DeclareMathSizes{12}{55}{15}{15}
diff --git a/doc/shared/template/size.tex b/doc/shared/template/size.tex
new file mode 100644
index 0000000000000000000000000000000000000000..0c1e2a9cedbe5ff430ed8926237f8760ca29f103
--- /dev/null
+++ b/doc/shared/template/size.tex
@@ -0,0 +1,20 @@
+% allowed UVIE logo height
+\newlength{\maxlogoheight}\setlength{\maxlogoheight}{20mm}
+\newlength{\medlogoheight}\setlength{\medlogoheight}{15mm}
+\newlength{\minlogoheight}\setlength{\minlogoheight}{10mm}
+%
+% allowed space round logo: logoheight <= x <= 0.5 logoheight 
+\def \maxlogospacing{1.0}
+\def \medlogospacing{0.75}
+\def \minlogospacing{0.5}
+
+%
+%elif \paperheight \equal {210mm} % A5
+% todo: based on papersize: >= A4: 20mm, A5/long: 15mm, all smaller: 10mm
+%\if \paperheight \equal {297mm}	  % A4
+\newlength{\logoheight}\setlength{\logoheight}{\maxlogoheight}
+%elif \paperheight \equal {210mm} % A5
+%\fi
+%
+% todo: pass as option
+\newlength{\logospacing}\setlength{\logospacing}{\medlogospacing\logoheight}
diff --git a/doc/shared/template/size.tex.orig b/doc/shared/template/size.tex.orig
new file mode 100644
index 0000000000000000000000000000000000000000..ac9639463b6ca2347e807390d6eac913bfc9a5c1
--- /dev/null
+++ b/doc/shared/template/size.tex.orig
@@ -0,0 +1,28 @@
+% allowed UVIE logo height
+\newlength{\maxlogoheight}\setlength{\maxlogoheight}{20mm}
+\newlength{\medlogoheight}\setlength{\medlogoheight}{15mm}
+\newlength{\minlogoheight}\setlength{\minlogoheight}{10mm}
+%
+% allowed space round logo: logoheight <= x <= 0.5 logoheight 
+\def \maxlogospacing{1.0}
+\def \medlogospacing{0.75}
+\def \minlogospacing{0.5}
+
+%
+%elif \paperheight \equal {210mm} % A5
+% todo: based on papersize: >= A4: 20mm, A5/long: 15mm, all smaller: 10mm
+%\if \paperheight \equal {297mm}	  % A4
+<<<<<<< HEAD
+\newlength{\logoheight}\setlength{\logoheight}{\maxlogoheight}
+=======
+\newlength{\logoheight}{\setlength{\logoheight}{\maxlogoheight}}
+>>>>>>> origin/latex_stack_fix
+%elif \paperheight \equal {210mm} % A5
+%\fi
+%
+% todo: pass as option
+<<<<<<< HEAD
+\newlength{\logospacing}\setlength{\logospacing}{\medlogospacing\logoheight}
+=======
+\newlength{\logospacing}{\setlength{\logospacing}{\medlogospacing\logoheight}}
+>>>>>>> origin/latex_stack_fix
diff --git a/doc/shared/template/tests.tex b/doc/shared/template/tests.tex
new file mode 100644
index 0000000000000000000000000000000000000000..0c930e7c6b39b49dbda93228f18abda370c92d31
--- /dev/null
+++ b/doc/shared/template/tests.tex
@@ -0,0 +1,45 @@
+%% this is an extremely crappy solution. need something
+%% flexible that can do that in one command
+
+%arg: purpose, \testrow{}
+\newcommand{\testbegin}[3]{%
+	\rowcolors{1}{white}{white}%
+	\begin{tcolorbox}[enhanced, notitle, clip upper,%
+			  sharp corners, colframe = white, colback = white,%
+		tabularx={%
+				>{\arraybackslash\centering}p{0.10\columnwidth}%
+				>{\arraybackslash\centering}p{0.05\columnwidth}%
+				>{\arraybackslash}X%
+				>{\arraybackslash}p{0.1\columnwidth}%
+			}%
+		]%
+	%
+	\vspace{-1em}%
+	\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}
+	\color{uvie-blue!75}\textbf{ID} &%
+	\multicolumn{3}{|>{\arraybackslash\raggedright}X}{\textbf{#1}}%
+	\\%
+	\vspace{-1em}%
+	\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}
+	\color{uvie-blue!75}\textbf{Purpose} &%
+	\multicolumn{3}{|>{\arraybackslash\raggedright}X}{#2}%
+	\\%
+
+	\vspace{-.65\baselineskip}	% uuuaaahhh..why? :(
+	\cellcolor{uvie-blue!75}\color{white}\textbf{TYPE} &%
+	\vspace{-.65\baselineskip}%
+	\cellcolor{uvie-blue!50}\color{white}\textbf{SEQ} &%
+	\vspace{-.65\baselineskip}%
+	\cellcolor{uvie-blue!50}\color{white}\textbf{Description} &%
+	\vspace{-.65\baselineskip}%
+	\cellcolor{uvie-blue!50}\color{white}\textbf{VERIFY} \\%
+	
+	#3 %
+
+	\end{tcolorbox}%
+}
+%arg: type, step, description, verified item
+\newcommand{\testrow}[4]{%
+	\textbf{#1} & #2 & #3 & #4 & %
+}
+
diff --git a/doc/shared/template/titlepage.tex b/doc/shared/template/titlepage.tex
new file mode 100644
index 0000000000000000000000000000000000000000..77e0da5887644aee9d404c7301f048ead0eac32c
--- /dev/null
+++ b/doc/shared/template/titlepage.tex
@@ -0,0 +1,75 @@
+\newcommand{\uvietitlepage}[3]{%
+\begin{titlepage}
+\BgThispage
+%
+%
+\begin{tikzpicture}[overlay, remember picture]
+\node[anchor	= north west,
+      xshift	= \logospacing,
+      yshift	=-\logospacing] 
+      at (current page.north west)
+     {\includegraphics[height = \logoheight]{../shared/images/uni_logo_astrophysik_cmyk.eps}}; 
+\end{tikzpicture}
+%
+\begin{tikzpicture}[overlay, remember picture]
+\node[anchor	= north east,
+      xshift	=-\logospacing,
+      yshift	=-\logospacing] 
+      at (current page.north east)
+     {\includegraphics[height = \logoheight]{../shared/images/uni_logo_farbe_02.eps}}; 
+\end{tikzpicture}
+%
+%
+%
+% main title, must not exceed 3 lines 
+\begin{tikzpicture}[overlay, remember picture]
+\node[anchor			= north west,
+      xshift			= \logospacing,
+      yshift			=-\logospacing * 3.0,
+	  minimum height	= \logospacing * 3.0,
+	  text width		= \textwidth]
+      at (current page.north west)
+      {\fontsize{30pt}{36pt}\selectfont
+       \textcolor{white}
+       {
+			\uppercase{#1}
+       }
+       \par
+      };
+\end{tikzpicture}
+%
+% subtitle, must not exceed 3 lines 
+\begin{tikzpicture}[overlay, remember picture]
+\node[anchor			= north west,
+      xshift			= \logospacing,
+      yshift			=-\logospacing * 5.5,
+	  minimum height	= \logospacing * 2.5,
+	  text width		= \textwidth]
+      at (current page.north west)
+      {\fontsize{13pt}{16pt}\selectfont
+       \textcolor{white}
+       {
+			\uppercase{\textbf {#2}}
+       }
+       \par
+      };
+\end{tikzpicture}
+%
+%\noindent
+%\hfill
+% \hspace*{-3cm}
+\begin{tikzpicture}[overlay, remember picture]
+\node[anchor=south east,		%anchor is upper left corner of the graphic
+      xshift  = 0.5cm,		%shifting around
+      yshift  = -0.5cm] 
+     	at (current page.south east) %left upper corner of the page
+     {\includegraphics[width=8.0cm]{#3}}; 
+\end{tikzpicture}
+%
+%
+\end{titlepage}
+%
+\restoregeometry
+%
+\newpage
+}% newcommand uvietitlepage
diff --git a/doc/shared/template/traceability.tex b/doc/shared/template/traceability.tex
new file mode 100644
index 0000000000000000000000000000000000000000..2104516bf4841f1c467e3d3f3de61e477d93beed
--- /dev/null
+++ b/doc/shared/template/traceability.tex
@@ -0,0 +1,510 @@
+
+\usepackage{xintexpr, xinttools}
+
+\usepackage{xr-hyper} % load before hyperref
+\usepackage{hyperref}% check if ok with hyperlinks
+\hypersetup{colorlinks=true, linkcolor=uvie-blue}
+
+\usepackage{xifthen}
+\usepackage{pifont}
+\usepackage{adjustbox}	% \rot
+
+\usepackage{stringstrings}
+
+\usepackage{csvsimple}
+
+\newcommand{\requirements}{}
+\newcommand{\designs}{}
+\providecommand*\phantomsection{}
+
+\makeatletter
+
+\newcommand{\req}[1]{%
+	\textbf{R-#1}%
+	\phantomsection
+	\def\@currentlabel{R-#1}%
+	\label{req@#1}%
+  	\@ifundefined {req@#1} {%
+  		\global\@namedef{req@#1}{}%
+  		\g@addto@macro\requirements{{req@#1}}%
+	}{}%
+}
+
+\newcommand{\reqgoal}[1]{%
+	\textbf{G-#1}%
+	\phantomsection
+	\def\@currentlabel{G-#1}%
+	\label{req@#1}%
+	\@ifundefined {req@#1} {%
+		\global\@namedef{req@#1}{}%
+		\g@addto@macro\requirements{{req@#1}}%
+	}{}%
+}
+
+\newcommand{\meetsthisreq}[1]{% (renamed from \meetsreq above)
+  \@ifundefined {req@#1@ismetby} {%
+  \global\@namedef{req@#1@ismetby}{}%
+  }{}% this is called multiple times when creating a table, generate only one
+  \ref{REQ-req@#1}%
+  \expandafter\g@addto@macro\csname req@#1@ismetby\expandafter\endcsname 
+              \expandafter {\expandafter{\@currentdesign}}%
+}
+
+\newcommand{\meetsreq}[1]{% (handles comma separated list)
+  \xintListWithSep{, }{\xintApply{ \meetsthisreq}{\xintCSVtoList{#1}}}%
+}
+
+
+
+\newcommand{\designswithreq}[1]% 
+% The space before \ref below is intentional and will be swallowed by \xintApply
+% It is not mandatory however, the thing works without it too.
+{\csname #1@ismetby\endcsname}
+
+\newcommand{\designswithreqref}[1]% 
+% The space before \ref below is intentional and will be swallowed by \xintApply
+% It is not mandatory however, the thing works without it too.
+{\xintListWithSep{, }{\xintApply { \ref}{\csname #1@ismetby\endcsname }}}
+
+\newcommand{\newdesign}[1]{%
+  	\textbf{D-#1}%
+  	\phantomsection
+  	\def\@currentlabel{D-#1}%
+	\label{design@#1}%
+  	\@ifundefined {design@#1} {%
+  		\global\@namedef{design@#1}{}%
+		\gdef\@currentdesign{design@#1}%
+  	\g@addto@macro\designs{{design@#1}}%
+	}{}
+}
+
+
+\newcommand{\design}[5]{%
+	\rowcolors{1}{white}{white}%
+	\begin{tcolorbox}[enhanced, notitle, clip upper,%
+			  sharp corners, colframe = white, colback = white,%
+		tabularx={%
+						  p{0.15\columnwidth}%
+				>{\arraybackslash\raggedright}p{0.10\columnwidth}%
+				>{\arraybackslash}X%
+			}%
+		]%
+	%
+	\vspace{-.65\baselineskip}	% uuuaaahhh..why? :(
+	\cellcolor{uvie-blue!75}\color{white}\newdesign{#1} &%
+	\vspace{-.65\baselineskip}%
+	\cellcolor{uvie-blue!50}\color{white}\textbf{Identifier} &%
+	\vspace{-.65\baselineskip}%
+	\cellcolor{uvie-blue!50}\color{white}\textbf{Function} \\%
+	& #2 & #3%
+
+	\\%
+	\vspace{-1em}%
+	\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}
+	\color{uvie-blue!75}\textbf{Purpose} &%
+	\multicolumn{2}{|>{\arraybackslash\raggedright}X}{#4}%
+
+	\ifthenelse{\isempty{#5}} {}{%
+		\\%
+		\vspace{-1em}%
+		\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}
+		\color{uvie-blue!75}\textbf{Comment} &%
+		\multicolumn{2}{|>{\arraybackslash}X}{#5}%
+	}%
+	\vspace{1em}
+	\end{tcolorbox}%
+}
+
+
+
+
+
+\newcommand{\requirement}[4]{%
+	\rowcolors{1}{white}{white}%
+	\begin{tcolorbox}[enhanced, notitle, clip upper,%
+			  sharp corners, colframe = white, colback = white,%
+		tabularx={%
+						  p{0.15\columnwidth}%
+				>{\arraybackslash\raggedright}p{0.15\columnwidth}%
+				>{\arraybackslash}X%
+			}%
+		]%
+	%
+	\vspace{-.65\baselineskip}	% uuuaaahhh..why? :(
+	\cellcolor{uvie-blue!75}\color{white}\req{#1} &%
+	\vspace{-.65\baselineskip}%
+	\cellcolor{uvie-blue!50}\color{white}\textbf{Short Text} &%
+	\vspace{-.65\baselineskip}%
+	\cellcolor{uvie-blue!50}\color{white}\textbf{Software Requirement} \\%
+	& #2 & #3%
+
+	\ifthenelse{\isempty{#4}} {}{%
+		\\%
+		\vspace{-1em}%
+		\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}%
+		\color{uvie-blue!75}\textbf{Comment}&%
+		\multicolumn{2}{|>{\arraybackslash}X}{#4}%
+	}%
+	\vspace{1em}
+	\end{tcolorbox}%
+}
+
+
+
+\newcommand{\goal}[4]{%
+	\rowcolors{1}{white}{white}%
+	\begin{tcolorbox}[enhanced, notitle, clip upper,%
+			  sharp corners, colframe = white, colback = white,%
+		tabularx={%
+						  p{0.15\columnwidth}%
+				>{\arraybackslash}p{0.2\columnwidth}%
+				>{\arraybackslash}X%
+			}%
+		]%
+	%
+	\vspace{-.65\baselineskip}	% uuuaaahhh..why? :(
+	\cellcolor{uvie-gray!75}\color{white}\reqgoal{#1} &%
+	\vspace{-.65\baselineskip}%
+	\cellcolor{uvie-gray!50}\color{white}\textbf{Short Text} &%
+	\vspace{-.65\baselineskip}%
+	\cellcolor{uvie-gray!50}\color{white}\textbf{Software Requirement} \\%
+	& #2 & #3%
+	\ifthenelse{\isempty{#4}} {}{%
+		\\%
+		\vspace{-1em}%
+		\arrayrulecolor{uvie-gray!75}\renewcommand{\arraystretch}{1.2}
+		\color{uvie-gray!75}\textbf{Comment} &%
+		\multicolumn{2}{|>{\arraybackslash}X}{#4}%
+	}%
+	\vspace{1em}
+	\end{tcolorbox}%
+}
+
+
+\newcommand{\importRequirementsOld}[2]{%
+	
+	\csvstyle{myImportReqStyle}{
+		head to column names,
+		%separator=semicolon,
+		filter=\equal{\Cat}{#2}
+	}
+
+	\csvreader[myImportReqStyle]{#1}{}
+	 {
+		\rowcolors{1}{white}{white}%
+		\begin{tcolorbox}[enhanced, notitle, clip upper,%
+				  sharp corners, colframe = white, colback = white,%
+			tabularx={%
+							  p{0.15\columnwidth}%
+					>{\arraybackslash\raggedright}p{0.15\columnwidth}%
+					>{\arraybackslash}X%
+				}%
+			]%
+		%
+		\vspace{-.65\baselineskip}	% uuuaaahhh..why? :(
+		\cellcolor{uvie-blue!75}\color{white}\req{\Cat-\N/\Type\Ver} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-blue!50}\color{white}\textbf{Short Text} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-blue!50}\color{white}\textbf{Software Requirement} \\%
+		& \ShortText & \Text%
+
+		\ifthenelse{\equal{\TopLevelReq}{}} {}{%
+			\\%
+			\vspace{-1em}%
+			\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}%
+			\color{uvie-blue!75}\textbf{Top Level}&%
+			\multicolumn{2}{|>{\arraybackslash}X}{}%
+			\\%
+			\vspace{-1em}%
+			\color{uvie-blue!75}\textbf{Requirement}&%
+			\multicolumn{2}{|>{\arraybackslash}X}{\TopLevelReq}%
+		}%
+		\vspace{1em}
+
+		\ifthenelse{\equal{\Comment}{}} {}{%
+			\\%
+			\vspace{-1em}%
+			\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}%
+			\color{uvie-blue!75}\textbf{Comment}&%
+			\multicolumn{2}{|>{\arraybackslash}X}{\Comment}%
+		}%
+		\vspace{1em}
+		\end{tcolorbox}%
+	}
+}
+
+
+\newcommand{\importRequirements}[2]{%
+	
+	\csvstyle{myImportReqStyle}{
+		head to column names,
+		separator=semicolon,
+		respect none,
+		filter=\equal{\Cat}{#2}
+	}
+
+	\csvreader[myImportReqStyle]{#1}{}
+	 {
+		\rowcolors{1}{white}{white}%
+		\begin{tcolorbox}[enhanced, notitle, clip upper,%
+				  sharp corners, colframe = white, colback = white,%
+			tabularx={%
+							  p{0.15\columnwidth}%
+					>{\arraybackslash\raggedright}p{0.15\columnwidth}%
+					>{\arraybackslash}X%
+				}%
+			]%
+		%
+		\vspace{-.65\baselineskip}	% uuuaaahhh..why? :(
+		\cellcolor{uvie-blue!75}\color{white}\req{\Cat-\N/\Type\Ver} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-blue!50}\color{white}\textbf{Short Text} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-blue!50}\color{white}\textbf{Software Requirement} \\%
+		& \ShortText & \Text%
+
+		\ifthenelse{\equal{\TopLevelReq}{}} {}{%
+			\\%
+			\vspace{-1em}%
+			\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}%
+			\color{uvie-blue!75}\textbf{Top Level}&%
+			\multicolumn{2}{|>{\arraybackslash}X}{}%
+			\\%
+			\vspace{-1em}%
+			\color{uvie-blue!75}\textbf{Requirement}&%
+			\multicolumn{2}{|>{\arraybackslash}X}{\TopLevelReq}%
+		}%
+		\vspace{1em}
+
+		\ifthenelse{\equal{\Comment}{}} {}{%
+			\\%
+			\vspace{-1em}%
+			\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}%
+			\color{uvie-blue!75}\textbf{Comment}&%
+			\multicolumn{2}{|>{\arraybackslash}X}{\Comment}%
+		}%
+		\vspace{1em}
+		\end{tcolorbox}%
+	}
+}
+
+\begin{comment}
+\newcommand{\importEcssRequirements}[2]{%
+	
+	\csvreader[head to column names,filter=\equal{\Proc}{#2}]{#1}{}
+	 {
+		\rowcolors{1}{white}{white}%
+		\begin{tcolorbox}[enhanced, notitle, clip upper,%
+				  sharp corners, colframe = white, colback = white,%
+			tabularx={%
+							  p{0.15\columnwidth}%
+					>{\arraybackslash\raggedright}p{0.15\columnwidth}%
+					>{\arraybackslash}X%
+				}%
+			]%
+		%
+		\vspace{-.65\baselineskip}	% uuuaaahhh..why? :(
+		\cellcolor{uvie-blue!50}\color{white}\textbf{ID} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-blue!50}\color{white}\textbf{Req. Title} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-blue!50}\color{white}\textbf{Requirement Text} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-blue!50}\color{white}\textbf{Ap.} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-blue!50}\color{white}\textbf{Output} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-blue!50}\color{white}\textbf{Remarks} \\%
+		& \ShortText & \Text \Comment%
+
+		\ifthenelse{\equal{\TopLevelReq}{}} {}{%
+			\\%
+			\vspace{-1em}%
+			\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}%
+			\color{uvie-blue!75}\textbf{Top Level}&%
+			\multicolumn{2}{|>{\arraybackslash}X}{}%
+			\\%
+			\vspace{-1em}%
+			\color{uvie-blue!75}\textbf{Requirement}&%
+			\multicolumn{2}{|>{\arraybackslash}X}{\TopLevelReq}%
+		}%
+		\vspace{1em}
+
+		\ifthenelse{\equal{\Comment}{}} {}{%
+			\\%
+			\vspace{-1em}%
+			\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}%
+			\color{uvie-blue!75}\textbf{Comment}&%
+			\multicolumn{2}{|>{\arraybackslash}X}{\Comment}%
+		}%
+		\vspace{1em}
+		\end{tcolorbox}%
+	}
+}
+\end{comment}
+
+\newcommand{\importGoals}[2]{%
+	
+	\csvreader[head to column names,filter=\equal{\Cat}{#2}]{#1}{}
+	{
+		\rowcolors{1}{white}{white}%
+		\begin{tcolorbox}[enhanced, notitle, clip upper,%
+				  sharp corners, colframe = white, colback = white,%
+			tabularx={%
+							  p{0.15\columnwidth}%
+					>{\arraybackslash}p{0.2\columnwidth}%
+					>{\arraybackslash}X%
+				}%
+			]%
+		%
+		\vspace{-.65\baselineskip}	% uuuaaahhh..why? :(
+		\cellcolor{uvie-gray!75}\color{white}\reqgoal{#1} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-gray!50}\color{white}\textbf{Short Text} &%
+		\vspace{-.65\baselineskip}%
+		\cellcolor{uvie-gray!50}\color{white}\textbf{Software Requirement} \\%
+		& \ShortText & \Text \Comment%
+	
+		\ifthenelse{\equal{\Comment}{}} {}{%
+			\\%
+			\vspace{-1em}%
+			\arrayrulecolor{uvie-blue!75}\renewcommand{\arraystretch}{1.2}%
+			\color{uvie-blue!75}\textbf{Comment}&%
+			\multicolumn{2}{|>{\arraybackslash}X}{\Comment}%
+		}%
+		\vspace{1em}
+		\end{tcolorbox}%
+	}
+}
+
+
+\newcommand{\exportrequirements}{%
+\message{reqstart exportrequirements}
+\AtEndDocument{%
+	\newwrite\reqfile
+	\immediate\openout\reqfile=requirements.list
+	\immediate\write\reqfile{\string\renewcommand{\string\requirements}{\requirements}}
+	\immediate\closeout\reqfile
+}
+\message{reqend exportrequirements}
+}%
+
+
+\makeatletter
+
+
+\newcommand*\traceabilitymatrix{%
+%
+	\newcommand{\numitems}[1]{{\expandafter\xintLength\expandafter{##1}}}%
+	\newcommand*\OK{\ding{51}}%
+%
+	\newcounter{numdesigns}%
+	\setcounter{numdesigns}{\numitems{\designs}}%
+	\stepcounter{numdesigns}%
+%
+	\newcommand*\rot{\multicolumn{1}{R{90}{0em}}}%
+%
+	%\begin{table}[h]
+	\newcolumntype{C}{>{\centering\arraybackslash} m{0.2cm}}%
+	\newcolumntype{R}[2]{>{\adjustbox{angle=##1,lap=\width-(##2)}\bgroup}l<{\egroup}}%
+	\rowcolors{1}{uvie-gray!25}{white}%
+	\begin{longtable}{c*{\value{numdesigns}}CC} %+1 linespacing column
+	\xintFor* ##1 in \designs \do {%
+		&  \rot{\fontspec{MyriadPro}\fontsize{8}{9}\ref{##1}\,\,\normalfont}%
+	} \\%
+	\endhead
+	% it's hilariously inefficient, faster methods are welcome...
+	\xintFor* ##1 in \requirements \do {%
+	% TODO: recolor link if goal
+	%	\isnextbyte[q]{R}{\string\ref{##1}} \par
+	%	\if T\theresult moopp\hypersetup{filecolor=uvie-burgundy}\fi
+
+		\fontspec{MyriadPro}\fontsize{8}{9}\ref{REQ-##1}\normalfont %
+		\hypersetup{filecolor=uvie-blue}
+		\xintFor* ##2 in \designs \do {%
+			&%
+			\xintFor* ##3 in {\designswithreq{##1}} \do {%
+				\ifthenelse{\equal{##2}{##3}} {%
+					\cellcolor{uvie-blue!50}%
+					%\OK
+					\xintBreakFor%
+				}{}%
+			}%
+		}\\[0.1cm]%
+	}%
+	\end{longtable}%
+	%\end{table}%
+}%
+
+
+\usepackage{stringstrings}
+
+\def\rereadauxdesignlabels{
+	\newtoks\designlist%
+	\newread\zz%
+	\immediate\openin\zz=\jobname.aux%
+	\loop%
+	\ifeof\zz\else%
+	\read\zz to \tmp%
+	\expandafter\findlabeldesign\tmp\relax\findlabel%
+	\repeat%
+}
+
+
+\long\def\findlabeldesign#1#2\findlabel{%
+ \ifx\newlabel#1\designlist\expandafter{\the\designlist\showlabeldesign#2}\fi}
+
+
+%hyperref has 4 felds in each label could use them but don't here
+\def\showlabeldesign#1#2{%
+	%\begin{minipage}{\textwidth}%
+	\findwords[q]{\expandafter\string\detokenize{#1}}{design}%
+		\ifnum\theresult>0%
+		\par\noindent\ref{#1}\dotfill\pageref{#1}
+
+		\fi%
+	%\end{minipage}%
+}
+
+
+\def\rereadauxrequirementlabels{
+	\message{reqstart rereadauxrequirementlabels}
+	\newtoks\requirementlist
+	\newread\zz
+	\immediate\openin\zz=\jobname.aux
+	\loop
+	\ifeof\zz\else
+	\message{.}
+	\read\zz to \tmp
+	\expandafter\findlabelrequirement\tmp\relax\findlabel
+	\repeat
+	\message{reqend rereadauxrequirementlabels}
+}
+
+
+\long\def\findlabelrequirement#1#2\findlabel{%
+ \ifx\newlabel#1\requirementlist\expandafter{\the\requirementlist\showlabelrequirement#2}\fi}
+
+\newsavebox{\fminipagebox}
+\NewDocumentEnvironment{fminipage}{m O{\fboxsep}}
+ {\par\kern#2\noindent\begin{lrbox}{\fminipagebox}
+  \begin{minipage}{#1}\ignorespaces}
+ {\end{minipage}\end{lrbox}%
+  \makebox[#1]{%
+    \kern\dimexpr-\fboxsep-\fboxrule\relax
+    \fbox{\usebox{\fminipagebox}}%
+    \kern\dimexpr-\fboxsep-\fboxrule\relax
+  }\par\kern#2
+ }
+
+
+%hyperref has 4 felds in each label could use them but don't here
+\def\showlabelrequirement#1#2{%
+	\begin{minipage}{\textwidth}%
+	\findwords[q]{\expandafter\string\detokenize{#1}}{req}%
+		\ifnum\theresult>0%
+		\par\noindent\ref{#1}\dotfill\pageref{#1}%
+		\fi%
+	\end{minipage}%
+}
diff --git a/doc/shared/template/univie.tex b/doc/shared/template/univie.tex
new file mode 100644
index 0000000000000000000000000000000000000000..8e3e9ff39f40fb1fae2c605c6ce9eb6c4ffebc3a
--- /dev/null
+++ b/doc/shared/template/univie.tex
@@ -0,0 +1,130 @@
+\documentclass{report}
+%\usepackage[left = 2cm, right=2cm, top = 1cm]{geometry}
+\usepackage[top = 2cm, bottom = 5cm]{geometry}
+
+\usepackage[T1]{fontenc}
+\usepackage{textcomp}
+
+%\PassOptionsToPackage{table}{xcolor}
+
+\usepackage{lastpage}
+%\usepackage{geometry}
+\input{../shared/template/fonts.tex}
+\input{../shared/template/colours.tex}
+\input{../shared/template/size.tex}
+\input{../shared/template/figures.tex}
+\input{../shared/template/util.tex}
+
+\usepackage{tabu}
+\usepackage{colortbl}
+\usepackage{graphicx}
+
+\usepackage{array, ltxtable}
+\usepackage[most]{tcolorbox}
+
+
+\usepackage[some]{background}
+\usepackage{tikz}
+\usetikzlibrary{babel}
+\backgroundsetup{
+scale=1,
+angle=0,
+opacity=1,
+placement=top,
+contents={
+	\begin{tikzpicture}[remember picture, blend mode = multiply]
+		% field heights from top down: x | x | x/2 | remainder
+		%
+		\fill[white]		(-0.5\paperwidth,                 0.0)
+							rectangle (0.5\paperwidth,       -3.0\logospacing);
+		\fill[uvie-blue!75]	(-0.5\paperwidth,                -3.0\logospacing)
+							rectangle (0.5\paperwidth, -2.0 * 3.0\logospacing);
+		\fill[uvie-blue]	(-0.5\paperwidth,          -2.0 * 3.0\logospacing)
+							rectangle (0.5\paperwidth, -2.5 * 3.0\logospacing);
+		% mext can be image or colour, but must overlap with 3rd bar in multiply
+		% blend mode
+		% todo: make conditional on image option
+		\fill[uvie-blue!75]	(-0.5\paperwidth,          -2.0 * 3.0\logospacing)
+							rectangle (0.5\paperwidth,       -1.0\paperheight);
+	\end{tikzpicture}}
+}
+%
+
+
+\makeatletter
+\let\doctitle\@title
+\makeatother
+
+\makeatletter
+\let\docdatever\@date
+\makeatother
+
+\usepackage{fancyhdr}
+\usepackage{lastpage}
+
+\def\ifalogo{\includegraphics[height = \medlogoheight]{../shared/images/uni_logo_astrophysik_cmyk.eps}}
+\fancypagestyle{plain}{ % call style plain so it is used by chapter pages as well
+	\fancyhf{}
+	\fancyhead[R]{
+		\fontspec{MyriadPro}\docdatever \\
+		\vspace{2em}
+		Page \thepage\ of \pageref{LastPage} 
+	}
+
+	\fancyhead[C]{
+		{
+			\fontspec{MyriadPro}
+			\documentid \\
+			\vspace{.7em}
+			\doctitle
+			\vspace{.9em}
+		}
+	}
+	\fancyhead[L]{
+		\ifalogo%
+	}
+}
+\setlength\headheight{80pt}
+\pagestyle{plain}
+
+
+% def \preparedby, \checkedby, \approvedby, \documentid, \docdatever, \doctitle
+\def\approvalpage{
+	\clearpage
+	\pagestyle{empty}
+	\null
+	\vfil
+
+	{\fontspec{MyriadPro}\fontsize{20}{24}\selectfont\color{uvie-blue}
+	 \doctitle}
+
+	\vspace*{1\baselineskip}
+
+	\begin{tabular}{@{}ll}
+		\textbf{Reference:}   & \documentid \\[2ex]
+		\textbf{Version:}     & \docdatever \\[6ex]
+		\textbf{Prepared by:} & \preparedby \\[1ex]
+		\textbf{Checked by:}  & \checkedby  \\[1ex]
+		\textbf{Approved by:} & \approvedby \\[1ex]
+	\end{tabular}
+
+	\vspace*{0.5\baselineskip}
+	{\footnotesize \affiliations}
+
+
+	\vfill
+
+	\begin{minipage}[b]{0.9\textwidth}
+	\footnotesize\raggedright
+	\setlength{\parskip}{0.5\baselineskip}
+	Copyright \copyright \the\year\ \par
+	Permission is granted to copy, distribute and\slash or modify this
+	document under the terms of the GNU Free Documentation License,
+	Version 1.3 or any later version published by the Free Software
+	Foundation; with no Front-Cover, no Logos of the University of Vienna.
+	\end{minipage}
+	\vspace*{2\baselineskip}
+	\cleardoublepage
+
+	\pagestyle{plain}
+}
diff --git a/doc/shared/template/univieA4.tex b/doc/shared/template/univieA4.tex
new file mode 100644
index 0000000000000000000000000000000000000000..4d33aebbb8198ebd60b36c1300478491095ac8f7
--- /dev/null
+++ b/doc/shared/template/univieA4.tex
@@ -0,0 +1,130 @@
+\documentclass{report}[a4paper]
+%\usepackage[left = 2cm, right=2cm, top = 1cm]{geometry}
+\usepackage[top = 2cm, bottom = 5cm]{geometry}
+
+\usepackage[T1]{fontenc}
+\usepackage{textcomp}
+
+%\PassOptionsToPackage{table}{xcolor}
+
+\usepackage{lastpage}
+%\usepackage{geometry}
+\input{../shared/template/fonts.tex}
+\input{../shared/template/colours.tex}
+\input{../shared/template/size.tex}
+\input{../shared/template/figures.tex}
+\input{../shared/template/util.tex}
+
+\usepackage{tabu}
+\usepackage{colortbl}
+\usepackage{graphicx}
+
+\usepackage{array, ltxtable}
+\usepackage[most]{tcolorbox}
+
+
+\usepackage[some]{background}
+\usepackage{tikz}
+\usetikzlibrary{babel}
+\backgroundsetup{
+scale=1,
+angle=0,
+opacity=1,
+placement=top,
+contents={
+	\begin{tikzpicture}[remember picture, blend mode = multiply]
+		% field heights from top down: x | x | x/2 | remainder
+		%
+		\fill[white]		(-0.5\paperwidth,                 0.0)
+							rectangle (0.5\paperwidth,       -3.0\logospacing);
+		\fill[uvie-blue!75]	(-0.5\paperwidth,                -3.0\logospacing)
+							rectangle (0.5\paperwidth, -2.0 * 3.0\logospacing);
+		\fill[uvie-blue]	(-0.5\paperwidth,          -2.0 * 3.0\logospacing)
+							rectangle (0.5\paperwidth, -2.5 * 3.0\logospacing);
+		% mext can be image or colour, but must overlap with 3rd bar in multiply
+		% blend mode
+		% todo: make conditional on image option
+		\fill[uvie-blue!75]	(-0.5\paperwidth,          -2.0 * 3.0\logospacing)
+							rectangle (0.5\paperwidth,       -1.0\paperheight);
+	\end{tikzpicture}}
+}
+%
+
+
+\makeatletter
+\let\doctitle\@title
+\makeatother
+
+\makeatletter
+\let\docdatever\@date
+\makeatother
+
+\usepackage{fancyhdr}
+\usepackage{lastpage}
+
+\def\ifalogo{\includegraphics[height = \medlogoheight]{../shared/images/uni_logo_astrophysik_cmyk.eps}}
+\fancypagestyle{plain}{ % call style plain so it is used by chapter pages as well
+	\fancyhf{}
+	\fancyhead[R]{
+		\fontspec{MyriadPro}\docdatever \\
+		\vspace{2em}
+		Page \thepage\ of \pageref*{LastPage} 
+	}
+
+	\fancyhead[C]{
+		{
+			\fontspec{MyriadPro}
+			\documentid \\
+			\vspace{.7em}
+			\doctitle
+			\vspace{.9em}
+		}
+	}
+	\fancyhead[L]{
+		\ifalogo%
+	}
+}
+\setlength\headheight{80pt}
+\pagestyle{plain}
+
+
+% def \preparedby, \checkedby, \approvedby, \documentid, \docdatever, \doctitle
+\def\approvalpage{
+	\clearpage
+	\pagestyle{empty}
+	\null
+	\vfil
+
+	{\fontspec{MyriadPro}\fontsize{20}{24}\selectfont\color{uvie-blue}
+	 \doctitle}
+
+	\vspace*{1\baselineskip}
+
+	\begin{tabular}{@{}ll}
+		\textbf{Reference:}   & \documentid \\[2ex]
+		\textbf{Version:}     & \docdatever \\[6ex]
+		\textbf{Prepared by:} & \preparedby \\[1ex]
+		\textbf{Checked by:}  & \checkedby  \\[1ex]
+		\textbf{Approved by:} & \approvedby \\[1ex]
+	\end{tabular}
+
+	\vspace*{0.5\baselineskip}
+	{\footnotesize \affiliations}
+
+
+	\vfill
+
+	\begin{minipage}[b]{0.9\textwidth}
+	\footnotesize\raggedright
+	\setlength{\parskip}{0.5\baselineskip}
+	Copyright \copyright \the\year\ \par
+	Permission is granted to copy, distribute and\slash or modify this
+	document under the terms of the GNU Free Documentation License,
+	Version 1.3 or any later version published by the Free Software
+	Foundation; with no Front-Cover, no Logos of the University of Vienna.
+	\end{minipage}
+	\vspace*{2\baselineskip}
+	\cleardoublepage
+
+	\pagestyle{plain}
+}
diff --git a/doc/shared/template/util.tex b/doc/shared/template/util.tex
new file mode 100644
index 0000000000000000000000000000000000000000..bc10f5386a796c4c48c489b2e96a7366b6eb3618
--- /dev/null
+++ b/doc/shared/template/util.tex
@@ -0,0 +1,12 @@
+\newenvironment{keywords}%
+   {\begin{trivlist}\item[]{\bfseries\sffamily Schlagworte:}\ }% oder "Keywords:"
+   {\end{trivlist}}
+%
+\author{%
+    Author 1 name \\
+    Department name \\
+    \texttt{email1@example.com}\vspace{40pt} \\
+    Author 2 name \\
+    Department name \\
+    \texttt{email2@example.com}
+    }
diff --git a/doc/um/build.sh b/doc/um/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..1389bffa1b653d474705cfc6a32fb973022ddef0
--- /dev/null
+++ b/doc/um/build.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+
+./cleanup.sh
+
+xelatex ccs_um.tex
+
+makeglossaries ccs_um
+
+biber ccs_um
+
+xelatex ccs_um.tex
+
+xelatex ccs_um.tex
+
+mv ccs_um.pdf "UVIE-CCS-UM-r1.pdf"
+
+
diff --git a/doc/um/ccs_um.tex b/doc/um/ccs_um.tex
new file mode 100644
index 0000000000000000000000000000000000000000..43a00c9643caf3039d79881b0f709ecb871367e6
--- /dev/null
+++ b/doc/um/ccs_um.tex
@@ -0,0 +1,299 @@
+%---------------------------------------------
+% Management of lists
+%---------------------------------------------		
+\newenvironment{fw_itemize}						% Control spacing between items in a list
+{\begin{itemize}
+  \setlength{\itemsep}{1mm}
+  \setlength{\parskip}{0pt}
+  \setlength{\parsep}{0pt}}
+{\end{itemize}}
+
+\newenvironment{fw_enumerate}					% Control spacing between items in an enumeration
+{\begin{enumerate}
+  \setlength{\itemsep}{1mm}
+  \setlength{\parskip}{0pt}
+  \setlength{\parsep}{0pt}}
+{\end{enumerate}}
+
+\newenvironment{fw_description}					% Control spacing between items in a description
+{\begin{description}
+  \setlength{\itemsep}{1mm}
+  \setlength{\parskip}{5pt}			% Line spacing between paragraphs in an item
+  \setlength{\parsep}{0pt}}
+{\end{description}}
+
+%---------------------------------------------
+% Title and Definitions
+%---------------------------------------------		
+
+\title{CCS \& TST UM}
+\def \documentid {UVIE-EGSE-UM-001}
+\date{Issue 0.1, April 1, 2023}
+
+\newcommand\affil[1]{\textsuperscript#1}
+
+\def\preparedby {Marko Mecina\affil{1}}
+\def\checkedby {}
+\def\approvedby {}
+
+\def\affiliations{
+	\affil{1} Department of Astrophysics, University of Vienna
+}
+
+%---------------------------------------------
+% Input files
+%---------------------------------------------		
+\input{../shared/template/univieA4.tex}
+\input{../shared/template/titlepage.tex}
+\input{../shared/glossary_egse.tex}
+
+%---------------------------------------------
+% Used Packages
+%---------------------------------------------
+\usepackage{datatool}	% Management of external databases
+\usepackage{vhistory}
+\usepackage{morewrites}
+\usepackage{pdflscape}	% Provides 'landscape mode' for selected pages
+\usepackage{csvsimple}
+\usepackage{listings}
+\usepackage{xcolor}
+\usepackage{hyperref}
+\hypersetup{}%colorlinks=true}
+\definecolor{codegray}{gray}{0.9}
+\newcommand{\code}[1]{\colorbox{codegray}{\texttt{#1}}}
+
+\usepackage[
+	backend=biber,
+	%defernumbers=true,
+    natbib=true,
+    style=numeric, %style=alphabetic,
+    %sorting=none,
+	%citestyle=authoryear
+]{biblatex}
+\addbibresource{../shared/bibliography_egse.bib}
+
+\definecolor{codegreen}{rgb}{0,0.6,0}
+\definecolor{mygray}{rgb}{0.5,0.5,0.5}
+\definecolor{codepurple}{rgb}{0.58,0,0.82}
+\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
+\definecolor{mygreen}{rgb}{0,0.6,0}
+\definecolor{mygray}{rgb}{0.5,0.5,0.5}
+\definecolor{mymauve}{rgb}{0.58,0,0.82}
+
+\lstdefinestyle{mystyle}{
+    %backgroundcolor=\color{backcolour},   
+    commentstyle=\color{codegreen},
+    keywordstyle=\color{magenta},
+    numberstyle=\tiny\color{mygray},
+    stringstyle=\color{mymauve},
+    basicstyle=\ttfamily\footnotesize,
+    breakatwhitespace=false,         
+    breaklines=true,                 
+    captionpos=b,                    
+    keepspaces=true,                 
+    numbers=left,                    
+    numbersep=5pt,                  
+    showspaces=false,                
+    showstringspaces=false,
+    showtabs=false,                  
+    tabsize=2
+}
+
+\lstset{style=mystyle}
+%\usepackage{color, colortbl}
+%
+%%In the preamble
+%\usepackage{array}
+%\newcolumntype{H}{>{\setbox0=\hbox\bgroup}c<{\egroup}@{}}
+
+%---------------------------------------------
+% Definition of colours
+%---------------------------------------------
+%\definecolor{dkgreen}{rgb}{0,0.6,0}
+%\definecolor{gray}{rgb}{0.5,0.5,0.5}
+%\definecolor{light-gray}{gray}{0.85}
+%\definecolor{mauve}{rgb}{0.58,0,0.82}
+%\definecolor{lightblue}{RGB}{128,179,255}
+%\definecolor{blue}{RGB}{41,85,204}
+%\definecolor{lbcolor}{rgb}{0.9,0.9,0.9}
+
+%---------------------------------------------
+% Miscellaneous
+%---------------------------------------------		
+
+%###########################################################################################
+%###########################################################################################
+\begin{document}
+
+\setmainfont{MyriadPro-SemiCondensed}
+\uvietitlepage%
+{UVIE EGSE}%
+{\doctitle}%
+{../shared/images/ccs_logo_2.png}
+\setmainfont{MyriadPro}
+
+\approvalpage
+
+\tableofcontents
+\newpage
+
+\begin{versionhistory}
+
+	\vhEntry{0.1}{01.04.2023}{MM}{initial version}
+
+\end{versionhistory}
+
+\chapter{Introduction}
+
+
+\chapter{Installation \& Setup}
+
+\section{Prerequisites}
+\begin{enumerate}
+\item Get CCS repository\footnote{\href{https://gitlab.phaidra.org/mecinam2/CCS}{https://gitlab.phaidra.org/mecinam2/CCS}}\vspace{5pt}\\
+\texttt{git clone https://gitlab.phaidra.org/mecinam2/CCS.git}
+    
+\item Required packages/devtools
+\begin{itemize}
+  \item make
+  \item gtk3
+  \item gtksourceview3
+  \item python-pip
+  \item python-gobject
+  \item dbus-python
+  \item mariadb
+  \item mysql-workbench (optional)
+\end{itemize}
+
+\item Initialise MySQL/MariaDB and set it up
+
+\texttt{sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql}\\
+\texttt{sudo systemctl enable --now mariadb}\\
+\texttt{sudo mariadb-secure-installation}  (optional)
+
+    To create a MariaDB user, in the CCS base directory execute
+    
+	\texttt{make db-user USER=<user> PW=<password>}
+
+    Alternatively, execute the following SQL statements:
+    
+	\texttt{CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';}\\
+	\texttt{GRANT ALL PRIVILEGES ON * . * TO 'user'@'localhost';}\\
+	\texttt{FLUSH PRIVILEGES;}
+    
+\item {Install Python packages. To install the required modules with pip in userspace or a venv, run
+   \texttt{make python-requirements} in the CCS base directory or use \texttt{pip install [--user] -r requirements.txt}.
+   If using a venv, it must have been created using the \texttt{--system-site-packages} option.
+   For more details, see requirements.txt}
+\end{enumerate}
+
+\section{Setup}
+In the CCS base directory,
+
+\begin{itemize}
+  \item first configure the [database] section in egse.cfg!
+  \item execute:\\
+   \texttt{make confignator}\\
+   \texttt{make databases}
+  \end{itemize}
+
+    
+\subsection{MIB}
+Use \texttt{CCS/Ccs/tools/import\_mib.py} to import a set of SCOS2000 MIB files into the MySQL mib-schema specified in egse.cfg
+
+\subsection{CCS \& TST}
+\texttt{./start\_ccs}: starts the CCS\\
+\texttt{./start\_tst}: starts the TST
+
+\chapter{Central Checkout System}
+
+\section{Modules}
+\subsection{Editor}
+
+\begin{figure}\label{fig:editor}
+\includegraphics[width=1.\textwidth]{../shared/images/editor.png} 
+\caption{The \emph{Editor}.}
+\end{figure}
+
+\begin{figure}\label{fig:editorlog}
+\includegraphics[width=1.\textwidth]{../shared/images/editor_log.png} 
+\caption{The log view.}
+\end{figure}
+
+\begin{figure}\label{fig:appdraw}
+\centering
+\includegraphics[width=0.3\textwidth]{../shared/images/editor_appdrawer.png} 
+\caption{App drawer.}
+\end{figure}
+
+\begin{figure}\label{fig:settings}
+\includegraphics[width=1.\textwidth]{../shared/images/config_editor.png} 
+\caption{The settings editor.}
+\end{figure}
+
+\subsection{Poolmanager}
+\begin{figure}\label{fig:pmgr}
+\centering
+\includegraphics[width=0.5\textwidth]{../shared/images/pmgr.png} 
+\caption{The \emph{Poolmanager}.}
+\end{figure}
+
+\subsection{Pool Viewer}
+\begin{figure}\label{fig:pvraw}
+\includegraphics[width=1.\textwidth]{../shared/images/pvraw.png} 
+\caption{The \emph{Pool Viewer}.}
+\end{figure}
+
+\begin{figure}\label{fig:pvdec}
+\includegraphics[width=1.\textwidth]{../shared/images/pvdec.png} 
+\caption{Decoded packet view using the MIB.}
+\end{figure}
+
+\subsection{Plotter}
+
+\subsection{Monitor}
+
+\section{Operation}
+
+\code{packet\_config\_<PROJECT>.py}
+
+\code{ccs\_function\_lib.py}
+
+\clearpage
+\subsection{Basic Connection Setup}
+\lstinputlisting[language=Python]{../../Ccs/scripts/connection_setup.py}
+
+\texttt{cfl.Tcsend\_DB()}
+
+\chapter{Test Specification Tool}
+shown in Figure~\ref{fig:tstmain}
+
+\begin{figure}\label{fig:tstmain}
+\includegraphics[width=1.\textwidth]{../shared/images/tst.png} 
+\caption{The \emph{TST} main view.}
+\end{figure}
+
+\begin{figure}\label{fig:tstsnips}
+\includegraphics[width=1.\textwidth]{../shared/images/tst_snips.png} 
+\caption{A list of step templates.}
+\end{figure}
+
+\begin{figure}\label{fig:tctab}
+\includegraphics[width=1.\textwidth]{../shared/images/tctab.png} 
+\caption{Overview of available TC packets.}
+\end{figure}
+
+\begin{figure}\label{fig:tmtab}
+\includegraphics[width=1.\textwidth]{../shared/images/tmtab.png} 
+\caption{Overview of available TM packets.}
+\end{figure}
+
+\begin{figure}\label{fig:tstdp}
+\includegraphics[width=1.\textwidth]{../shared/images/datapool.png} 
+\caption{A list of the specified data pool items.}
+\end{figure}
+
+
+\section{Workflow}
+
+\end{document}
diff --git a/doc/um/cleanup.sh b/doc/um/cleanup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..55d5c1913af62cf3afc396beaa9239498f883cf6
--- /dev/null
+++ b/doc/um/cleanup.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+rm `ls ccs_um* | grep -v tex`
diff --git a/gen_desktop_files.sh b/gen_desktop_files.sh
new file mode 100755
index 0000000000000000000000000000000000000000..eae028f70b5e3b2f50f0600a8df6a4649ba4b105
--- /dev/null
+++ b/gen_desktop_files.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# Generate desktop entries for CCS and TST apps
+
+CDIR=$1
+
+echo "[Desktop Entry]
+Name=CCS
+Icon=${CDIR}/Ccs/pixmap/ccs_logo_2.svg
+Comment=The UVIE Central Checkout System
+Exec=${CDIR}/start_ccs
+Path=${CDIR}
+Type=Application
+Categories=Development;" > ccs.desktop
+
+echo "[Desktop Entry]
+Name=TST
+Icon=${CDIR}/Tst/tst/style/tst.png
+Comment=The UVIE Test Specification Tool
+Exec=${CDIR}/start_tst
+Path=${CDIR}
+Type=Application
+Categories=Development;" > tst.desktop
diff --git a/requirements.txt b/requirements.txt
index 89a1e867a9a487c813b77388707024c529c59ec6..3ba732b9beb133feade7b6e199eb4eed0b3c00ad 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,7 +6,7 @@ scipy
 matplotlib
 cairocffi
 mysqlclient
-sqlalchemy
+sqlalchemy < 2
 sphinx
 sphinx_rtd_theme
 astropy