///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright (c) 2000-2019 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v2.0     //
// which accompanies this distribution, and is available at                  //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
// Module: EPTF_CLL_TimeProfileEditor_Functions
//
// Purpose:
//   This TTCN-3 module contains functions for EPTF Time Profile Editor
//
//  Module depends on:
//    <EPTF_CLL_TimeProfileEditor_Definitions>
//    <EPTF_CLL_TimeProfileEditor_XTDPTemplates>
//    <EPTF_CLL_ExecCtrlTimeProfile_Definitions>
//    <EPTF_CLL_Common_Definitions>
//    <EPTF_CLL_Common_Functions>
//    <TCCEncoding_Functions>
//    <TCCFileIO_Functions>
//    <ttcn_ericsson_se_protocolModules_xtdp_xtdl>
//    <ttcn_ericsson_se_protocolModules_xtdp_xtdp>
//    <IPL4asp_Types>
//    <EPTF_CLL_TransportIPL4_Functions>
//    <EPTF_CLL_Base_Functions>
//    <EPTF_CLL_Transport_CommonDefinitions>
//    <XTDP_EncDecFunctions>
//
//  Module Parameters:
//    -
//
// Current Owner:
//    Janos Zoltan Svaner (ejnosvn)
//
// Last Review Date:
//    2008-??-??
//
//  Detailed Comments:
//   -
//
///////////////////////////////////////////////////////////

module EPTF_CLL_TimeProfileEditor_Functions
{

//=========================================================================
// Import Part
//=========================================================================

import from EPTF_CLL_TimeProfileEditor_Definitions all;
import from EPTF_CLL_TimeProfileEditor_XTDPTemplates all;
import from EPTF_CLL_ExecCtrlTimeProfile_Definitions all;
import from EPTF_CLL_Common_Definitions all;
import from EPTF_CLL_Common_Functions all;
import from TCCFileIO_Functions all;
import from ttcn_ericsson_se_protocolModules_xtdp_xtdl all;
import from ttcn_ericsson_se_protocolModules_xtdp_xtdp all;
import from IPL4asp_Types all;
import from EPTF_CLL_TransportIPL4_Functions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_Transport_CommonDefinitions all;
import from XTDP_EncDecFunctions all;

//=========================================================================
// Functions
//=========================================================================

///////////////////////////////////////////////////////////
//  Function: f_EPTF_TimeProfileEditor_init_CT
//
//  Purpose:
//    Function to initialize the TimeProfileEditor feature
//
//  Parameters:
//    pl_selfName - *in charstring* - The name of the component
//
//  Return Value:
//    -
//
///////////////////////////////////////////////////////////
public function f_EPTF_TimeProfileEditor_init_CT(in charstring pl_selfName) runs on MAIN_CT {
  if (v_EPTF_TimeProfileEditor_initialized) {
    return;
  }
  f_EPTF_Base_init_CT(pl_selfName);
  f_EPTF_Transport_init(IPL4, pl_selfName)

  f_EPTF_Transport_registerMsgLenCallback4LGenType(IPL4, refers(f_EPTF_TimeProfileEditor_getMsgLen_XTDP), {}, c_EPTF_TimeProfileEditor_LGenType);
  f_EPTF_Transport_registerMsgCallback(IPL4, c_EPTF_TimeProfileEditor_LGenType, refers(f_EPTF_TimeProfileEditor_HandleMsgs_XTDP), refers(f_EPTF_TimeProfileEditor_HandleEvent_XTDP));
  f_EPTF_Base_registerCleanup(refers(f_EPTF_TimeProfileEditor_cleanup_CT));

  f_EPTF_TPE_init_global_variables();
  f_EPTF_TPE_open_listening_port();
  f_EPTF_TPE_init_time_sequences_properties_tree(1);
  f_EPTF_TPE_init_time_profiles_properties_tree(1);
  v_EPTF_TimeProfileEditor_initialized := true;
}

private function f_EPTF_TimeProfileEditor_cleanup_CT() runs on MAIN_CT {
  v_EPTF_TimeProfileEditor_initialized := false;
  if(connectionId > -1){
    var Result vl_result;
    f_EPTF_Transport_close(IPL4, connectionId, vl_result);
    connectionId := -1;
  }
  f_EPTF_Transport_registerMsgCallback(IPL4, c_EPTF_TimeProfileEditor_LGenType, null, null);
}

private function f_EPTF_TimeProfileEditor_getMsgLen_XTDP
(
  in EPTF_Transport_TransportType pl_transportType,
  in octetstring pl_stream,
  inout EPTF_IntegerList pl_args
)
return integer
{
  if (lengthof(pl_stream)<4)
  {
    return -1
  }
  else
  {
    return oct2int(substr(pl_stream,0, 4))
  }
}

private function f_EPTF_TimeProfileEditor_getRawMsg_XTDP(in octetstring stream) return octetstring
{
  if (lengthof(stream) <4)  {
    return ''O
  }  else {
    return substr(stream,4, lengthof(stream)-4)
  }
}

private function f_EPTF_TimeProfileEditor_HandleEvent_XTDP(
  in EPTF_Transport_TransportType pl_transportType,
  in ConnectionId pl_connId,
  in PortEvent pl_event)
runs on MAIN_CT
{
  if(ischosen(pl_event.connClosed)){
    if(pl_event.connClosed.connId == connectionId) {
      connectionId := -1;
      f_EPTF_Common_user(log2str("GUI with connection id: ", pl_event.connClosed.connId, " closed the connection."));

    }
    else {
      connectionId := -1;
      f_EPTF_Common_user(log2str("GUI with client id: ", pl_event.connClosed.connId, " closed the connection."));
    }
  }
  if(ischosen(pl_event.connOpened)){
    if(connectionId == -1) {
      f_EPTF_Common_user(log2str("New GUI connection is accepted from ", pl_event.connOpened.remName, ":", pl_event.connOpened.remPort));
      connectionId := pl_event.connOpened.connId;

      f_EPTF_TPE_create_gui();
      f_EPTF_TPE_send_model_to_gui();
    }
    else {
      f_EPTF_Common_user(log2str("A GUI is already connected with connection id ", connectionId, " new connection is closed."));
      var Result vl_result;
      f_EPTF_Transport_close(IPL4, pl_event.connOpened.connId, vl_result);
    }
  }

}

private function f_EPTF_TimeProfileEditor_unichar2charstring(in universal charstring pl_uni)
return charstring{
  var charstring vl_char := "";
  for (var integer vl_i:= 0;vl_i<lengthof(pl_uni);vl_i:=vl_i+1)
  {
    vl_char := vl_char & int2char(unichar2int(pl_uni[vl_i]));
  }
  return vl_char
}

private function f_EPTF_TimeProfileEditor_HandleMsgs_XTDP(
  in EPTF_Transport_TransportType pl_transportType,
  in ConnectionId pl_connId,
  in HostName pl_remHost,
  in PortNumber pl_remPort,
  in HostName pl_locHost,
  in PortNumber pl_locPort,
  in ProtoTuple pl_proto,
  in integer pl_userData,
  in octetstring pl_msg) runs on MAIN_CT {

  var integer vl_connId := pl_connId;
  var XTDP_Message vl_receivedMessage;

  var integer vl_succ := XTDP_EncDecFunctions.dec_XTDP_Message(f_EPTF_TimeProfileEditor_getRawMsg_XTDP(pl_msg), vl_receivedMessage);
  if(isbound(vl_receivedMessage.choice)){
    if (ischosen(vl_receivedMessage.choice.xTDP_Requests)) {
        select(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.widget.widgetId){
          case ("new_sequence_button") {
            f_EPTF_TPE_handle_add_time_sequence("");
          }
          case ("new_profile_button") {
            f_EPTF_TPE_handle_add_profile("");

          }
          case ("new_sequence_textbox") {
            f_EPTF_TPE_handle_add_time_sequence(f_EPTF_TimeProfileEditor_unichar2charstring(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));

          }
          case ("new_profile_textbox") {
            f_EPTF_TPE_handle_add_profile(f_EPTF_TimeProfileEditor_unichar2charstring(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));

          }
          case ("remove_sequence_button") {
            f_EPTF_TPE_handle_remove_time_sequence();

          }
          case ("remove_profile_button") {
            f_EPTF_TPE_handle_remove_profile();

          }
          case (c_timeSequenceListboxId) {
            f_EPTF_TPE_handle_time_sequence_listbox_change(f_EPTF_TimeProfileEditor_unichar2charstring(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));
          }
          case (c_profileListboxId) {
            f_EPTF_TPE_handle_profile_listbox_change(f_EPTF_TimeProfileEditor_unichar2charstring(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));

          }
          case ("before_row_numwidget") {
            f_EPTF_TPE_display_error("");
            currentBeforeRow := str2int(f_EPTF_TimeProfileEditor_unichar2charstring(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));

          }
          case ("before_profile_row_numwidget") {
            f_EPTF_TPE_display_error("");
            currentBeforeProfileRow := str2int(f_EPTF_TimeProfileEditor_unichar2charstring(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));

          }
          case ("add_time_sequence_row_button") {
            f_EPTF_TPE_handle_add_time_sequence_row();

          }
          case ("add_profile_row_button") {
            f_EPTF_TPE_handle_add_profile_row();

          }
          case ("remove_row_numwidget") {
            f_EPTF_TPE_handle_remove_row_numwidget_change(f_EPTF_TimeProfileEditor_unichar2charstring(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));

          }
          case ("remove_profile_row_numwidget") {
            f_EPTF_TPE_handle_remove_profile_row_numwidget_change(f_EPTF_TimeProfileEditor_unichar2charstring(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));

          }
          case ("remove_time_sequence_row_button") {
            f_EPTF_TPE_handle_remove_time_sequence_row();

          }
          case ("remove_profile_row_button") {
            f_EPTF_TPE_handle_remove_profile_row();

          }
          case ("time_unit_menu") {
            f_EPTF_TPE_handle_time_unit_change(f_EPTF_TimeProfileEditor_unichar2charstring(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));

          }
          case ("time_sequence_menu") {
            f_EPTF_TPE_handle_time_sequence_menu_change(f_EPTF_TimeProfileEditor_unichar2charstring(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));

          }
          case ("save_button") {
            f_EPTF_TPE_handle_save_putton_pressed();

          }
          case ("exit_ttcn_button") {
            f_EPTF_TPE_handle_exit_putton_pressed();
            // TTCN will exit here
          }
          case else{
            f_EPTF_TPE_handle_tree_change( unichar2char(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.widget.widgetId),
                                           unichar2char(vl_receivedMessage.choice.xTDP_Requests.xTDP_Request_list[0].action_.choice.put.argument_list[0]));
          }
        }
    }
    else if (ischosen(vl_receivedMessage.choice.xTDP_Responses)) {
         if(v_newTimeSequenceNameRequestId == vl_receivedMessage.choice.xTDP_Responses.xTDP_Response_list[0].requestId
            and success == vl_receivedMessage.choice.xTDP_Responses.xTDP_Response_list[0].responseCode){
            f_EPTF_TPE_handle_add_time_sequenceIn(unichar2char(vl_receivedMessage.choice.xTDP_Responses.xTDP_Response_list[0].argument));
         }
         if(v_newTimeProfileRequestId == vl_receivedMessage.choice.xTDP_Responses.xTDP_Response_list[0].requestId
            and success == vl_receivedMessage.choice.xTDP_Responses.xTDP_Response_list[0].responseCode){
            f_EPTF_TPE_handle_add_profileIn(unichar2char(vl_receivedMessage.choice.xTDP_Responses.xTDP_Response_list[0].argument));
         }
    }
    else if (ischosen(vl_receivedMessage.choice.xTDP_ARResponses)) {
        for(var integer vl_listi := 0; vl_listi < sizeof(vl_receivedMessage.choice.xTDP_ARResponses.xTDP_ARResponse_list); vl_listi := vl_listi + 1){
          if(not (vl_receivedMessage.choice.xTDP_ARResponses.xTDP_ARResponse_list[vl_listi].responseCode == success)){
              f_EPTF_TPE_display_error("Unhandled GUI message received. Response that is not a success!" & log2str(vl_receivedMessage));
              f_EPTF_Common_user("Unhandled GUI message received. Response that is not a success!" & log2str(vl_receivedMessage));
          }
        }
    }
    else if (ischosen(vl_receivedMessage.choice.xTDP_Bye)) {
      var Result vl_result;
      f_EPTF_Transport_close(IPL4, connectionId, vl_result);
      connectionId := -1;
    }
    else if (ischosen(vl_receivedMessage.choice.xTDP_HandshakeRequest)) {
        var ttcn_ericsson_se_protocolModules_xtdp_xtdp.XTDP_Message vl_messageToSend := {
        transactionID := vl_receivedMessage.transactionID,
          choice := {
            xTDP_Outcome := {
              responseCode := success,
              errorCode_list := {
              },
              errorMessage := omit
              ,elem_list := {}
            }
          }
        }
        if (
          vl_receivedMessage.choice.xTDP_HandshakeRequest.xtdpRequiredVersion != c_EPTF_TPE_xtdpMyVersion
          or vl_receivedMessage.choice.xTDP_HandshakeRequest.xtdlRequiredVersion != c_EPTF_TPE_xtdlMyVersion
        ) {
          // version mismatch
          vl_messageToSend := {
            transactionID := vl_receivedMessage.transactionID,
            choice := {
              xTDP_Outcome := {
                responseCode := error_,
                errorCode_list := {
                },
                errorMessage := "Version mismatch detected during handshake. Suppored XTDP/XDTL versions: "
                &log2str(c_EPTF_TPE_xtdpMyVersion)&"/"&log2str(c_EPTF_TPE_xtdlMyVersion)
                ,elem_list := {}
              }
            }
          }
          // add error codes:
          if (vl_receivedMessage.choice.xTDP_HandshakeRequest.xtdpRequiredVersion != c_EPTF_TPE_xtdpMyVersion) {
            vl_messageToSend.choice.xTDP_Outcome.errorCode_list := vl_messageToSend.choice.xTDP_Outcome.errorCode_list & {xtdpIncompatibleVersion};
          }
          if (vl_receivedMessage.choice.xTDP_HandshakeRequest.xtdlRequiredVersion != c_EPTF_TPE_xtdlMyVersion) {
            vl_messageToSend.choice.xTDP_Outcome.errorCode_list := vl_messageToSend.choice.xTDP_Outcome.errorCode_list & {xtdlIncompatibleVersion};
          }
        } else {
          // successful handshake
          v_handshakeSuccessful := vl_connId;
        }
        //send response:
        f_EPTF_TimeProfileEditor_sendXTDPMessage(vl_messageToSend);
        connectionId := vl_connId;
        //create the gui
        f_EPTF_TPE_create_gui();
        f_EPTF_TPE_send_model_to_gui();
    } else {
        f_EPTF_TPE_display_error("Unhandled GUI message received."& log2str(vl_receivedMessage));
        f_EPTF_Common_user("Unhandled GUI message received."& log2str(vl_receivedMessage));
    }
  } else {
    f_EPTF_TPE_display_error("Unhandled GUI message received because decoding fails.");
    f_EPTF_Common_user("Unhandled GUI message received because decoding fails.");
  }
}

private function f_EPTF_TPE_init_global_variables() runs on MAIN_CT {
  timeSequenceList := tsp_EPTF_ExecCtrl_TimeProfileDescrList;
  profileList := tsp_EPTF_ExecCtrl_TimeProfileList;
  currentTimeUnit := tsp_TimeProfileEditor_DisplayedTimeUnit;
  if(currentTimeUnit == "hours") {
    currentTimeUnitMultiplier := 3600.0;
  } else if(currentTimeUnit == "minutes") {
    currentTimeUnitMultiplier := 60.0;
  } else if(currentTimeUnit == "seconds") {
    currentTimeUnitMultiplier := 1.0;
  } else {
    f_EPTF_TPE_display_error("Unhandled time unit: " & currentTimeUnit);
  }
}

private function f_EPTF_TPE_open_listening_port() runs on MAIN_CT {
//  timer t_wait := 5.0; t_wait.start;
  var Result vl_result;
  var integer vl_listenSuccess := f_EPTF_Transport_listen( IPL4, {tcp := {}}, tsp_TimeProfileEditor_GuiPortListenAddr, tsp_TimeProfileEditor_GuiPortListenPort, c_EPTF_TimeProfileEditor_LGenType, vl_result, true)
  if(vl_listenSuccess > -1){
      if(vl_result.connId == -1) {
        f_EPTF_Common_user(log2str("Could not open listening port: ", tsp_TimeProfileEditor_GuiPortListenAddr, ":", tsp_TimeProfileEditor_GuiPortListenPort));
        stop;
      }
      else {
        f_EPTF_Common_user("Listening port successfully opened.");
      }
  }
  if (ispresent(vl_result.errorCode) and (vl_result.errorCode != ERROR_TEMPORARILY_UNAVAILABLE)) {
     f_EPTF_Common_user("Could not open listening port: " & log2str(vl_result));
  }
}

private function f_EPTF_TPE_nextRequestId() runs on MAIN_CT return integer {
  lastRequestId := lastRequestId + 1;
  return lastRequestId;
}

private function f_EPTF_TimeProfileEditor_sendXTDPMessage(
  in XTDP_Message pl_message ) runs on MAIN_CT {
  f_EPTF_Common_user("Send happening:"& log2str( xtdp_message));
  var Result vl_result;
  f_EPTF_Transport_send(IPL4, connectionId, f_EPTF_TPE_appendLength_XTDP(XTDP_EncDecFunctions.enc_XTDP_Message(pl_message)), vl_result, false)
}

private function f_EPTF_TPE_init_images() runs on MAIN_CT {
  const charstring c_XTDP_Image_Ok := "iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAAK/INwWK6QAAABl0RVh0&#x0D;&#x0A;U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKTSURBVHjaYvz//z8DLQBAADEx0AgABBDN&#x0D;&#x0A;DAYIIBZGRkaqGca3ikGBlYmhnpWZIQAggBgZFzLsBwZzIUMCwwWyTZzPoMAANJCZEWgKA8MHZmYG&#x0D;&#x0A;R4AAYmSYzfAeLPmPwZEhnUTDZwINZGSo5+LgSvj28xsDkP0AiAMZkhkuAAQQE8Mvhg3ifOICDH8Y&#x0D;&#x0A;9jNMZjAgysBJQAOnMMznYOa472DokKAiosIANOcCw28GQ5ChICUAAQQyeCPQFgYzBzMBoMR+hh48&#x0D;&#x0A;hvcADexlmM/KzHpf01gzwSPUg+HKjSsMl25eOgB0mCNDJsMHmFKAAGJg6GIQYOhg+K/9Xfu/xGWJ&#x0D;&#x0A;/0D2e4Y2NMNbgQa2M8xn6mf6L3hE8L/GDw2weu553P8ZOoEhjAUABBAkSTQx7GcOZXZgUmdi+HPx&#x0D;&#x0A;D8P/Tf8/MPwHuuA/0AXAMGTgBEaKOQMDixkLAyMHUMsLBoY/i4Hqfv5fwFDHkIjNYIAAYgGTPxk2&#x0D;&#x0A;/r301+Gv/F8GBnUg3w3oiy3AYGEH0mZAPghzAA0DQoaHQPYSsJ5EhhaGBbhCDSCAIC4uA3qVjeE+&#x0D;&#x0A;QwGSzCsg5gdidiSxK0C8hwEUUYnAIFyAL34BAgiRO/KABscDLRDDofIqEG8DBg0TMIgmEE6WAAHE&#x0D;&#x0A;DGcZAg1lZ7BgkGAA+RkVg1y5H2goKK1PIS6tAwQQoqz4xXAQ7KrvaHgjEJ8AGvaHQZFhOvEZCCCA&#x0D;&#x0A;UAuKGGBSiwdGGC84ckBeZ2B4CjSMEejSxchplDAACCDU0u0/wwFgSDMwfATitUD8BBhB/0k3FAQA&#x0D;&#x0A;AogZhacHTLGfGQIYbgHZ74CGLgXG/mWGH+SUSwABhIqigcEQDXRjNErCIwsABBAjraomgACiWQ0C&#x0D;&#x0A;EEA0MxggwAAC5K2bqnDzRQAAAABJRU5ErkJggg=="
  const charstring c_XTDP_Image_Configure := "iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAACXBIWXMAAAsTAAALEwEAmpwYAAAK&#x0D;&#x0A;OWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15F&#x0D;&#x0A;YZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZEsRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z&#x0D;&#x0A;97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTsAIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8E&#x0D;&#x0A;AfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4JUuQLrbPipgalyxmGCVmvihBEcuJOWGR&#x0D;&#x0A;DT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR3xKxRoowlSviN+LYVA4zAwAUSWwX&#x0D;&#x0A;cFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQdli7d1NqaQffkZKVwBALDACYr&#x0D;&#x0A;mcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtFehn4uWcQrf+L7a/80hoA&#x0D;&#x0A;YMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGXwzISF/QP/U+Hv6Gv&#x0D;&#x0A;vmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNFhImmjMtLELWb&#x0D;&#x0A;x+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH554SqTi3P/&#x0D;&#x0A;7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJVgMW&#x0D;&#x0A;SASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB&#x0D;&#x0A;5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97B&#x0D;&#x0A;CEyCqbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF&#x0D;&#x0A;8UeikHiEj6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdR&#x0D;&#x0A;Y6hZ1Ec0Ga2I1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvm&#x0D;&#x0A;HGYQM46Zw2Kx8lh9rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnEL&#x0D;&#x0A;eCm8Jt4G749n43PwpfhGfDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GS&#x0D;&#x0A;eIx4mThGfEuSIemRXEjRJCFpB+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGi&#x0D;&#x0A;RqJDYkjiuSReUlPSSXK1ZK5kheQJyeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JX&#x0D;&#x0A;pKdksDJaMm4ybJkCmYMyF2TGKQhFneJCYVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL&#x0D;&#x0A;1sielh2lITQtmhcthVZKO04bpr1borTEaQlnyfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bf&#x0D;&#x0A;Jd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48vvacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFp&#x0D;&#x0A;Rpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0CvpvfRZVUVVT1Whar3qgOqCmrZaqFq+Wpva&#x0D;&#x0A;Q3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15LWytca6tWp9aUtpy2l3audov2Ax2y&#x0D;&#x0A;joPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AAbWBtwDNoMBgxJBk6GWYathiO&#x0D;&#x0A;GdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0zllmN2S1zsrm7+QbzLvMX&#x0D;&#x0A;y/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHWztYbrE9Zv7WxtBHY&#x0D;&#x0A;HLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5sxybHSSddpySn&#x0D;&#x0A;o07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6eO7yHPFS&#x0D;&#x0A;8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPwYyAm&#x0D;&#x0A;MCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR&#x0D;&#x0A;XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rzi&#x0D;&#x0A;auNmWS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9K&#x0D;&#x0A;CU9pS8Wlxqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmf&#x0D;&#x0A;WZP5Jiss60S2dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe&#x0D;&#x0A;3kTYlLzpp3yT/LL8V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYp&#x0D;&#x0A;rih+X8IqufqN6TeV33zaEb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUV&#x0D;&#x0A;dXsJe4V7Ryt9K7uqNKp2Vr2vTqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBq&#x0D;&#x0A;qDiIOZh58EljWGPft4xvm5sUmoqbPhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWyt&#x0D;&#x0A;b6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GP&#x0D;&#x0A;h06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h/HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9td&#x0D;&#x0A;PnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavrXTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbg&#x0D;&#x0A;cOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxSfNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2&#x0D;&#x0A;S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+tfa5zvMffnP8rX82YnbiBf/Fp99L&#x0D;&#x0A;Xsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/6H7o/ujz8cGn1E+f/gUDmPP8&#x0D;&#x0A;kcBa2wAAAARnQU1BAACxjnz7UZMAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgA&#x0D;&#x0A;ABdvkl/FRgAABAZJREFUeNpiZEADO3YcP8/Pz20gJMTP8P37T4ZPn74yfPv2fcG/f/8bvbysHzAQ&#x0D;&#x0A;CQACCANt2nRo/rlzN/4jgzdvPvzfvfvk//XrDyQQaw5AAGFFq1btmX/y5BUUw3/9+v1/584T/1es&#x0D;&#x0A;2OVAjBkAAYQTLV68bf6RIxdQDP/48cv/RYu23idGP0AAMcycuW7+jBlrDbDJzZ69fv2FC7fgBv8D&#x0D;&#x0A;BvSePSf/A/UYEDIXIICY2NhYExgZGfdPmLAMRTGIz8XF6aCkJM3w589fMP779x+DoCAfw8+fvwgG&#x0D;&#x0A;B0AAAQ1mYfDwsBQAGd7RsQBsOIjm4+Pe7+5uIcDMzMQADF+QYWDMwsLM8OPHLwFCBgMEEBNQEQPQ&#x0D;&#x0A;EAZPTyuw4Q0NsxIghloKMDExAQ37Dca/fv0B46dPX4MsIJjsAAKICZiUPkAM5wEbLikpMh/kA2Zm&#x0D;&#x0A;ZrBL0fH9+89A6ZugwQABxKynZ6/BycluICIiwMDBwc6gqirLAHLp379/UTDI1U+fvmIQExNkuH37&#x0D;&#x0A;scG8iIecuV5iNyZve/0Dm8EAAcQEdEXjnj2nPrx58x7ubQj+A8ffv/9iePDgGcPnz98YgImDIUz7&#x0D;&#x0A;igGbOGv/7z8M+y/3a6GEN1AezAcIIEYQkZLSAkwBHPttbQ0E1NTkgBHEAlMGJkFZ+zfQFFZWFgbG&#x0D;&#x0A;61MZ+H7tZWB/94KBVUeG4fmVfxf+/WNwNCm/9gHZAoAAYoQxYmJqDYC29QPLCAdxcSEGHh5OBmCG&#x0D;&#x0A;AEeYj48NAz8/D8P3cxMYuL/tZBD89pJBhPk3w0cGVobvCtIMjy79BxtuXYswHCCAGNHDJjS0QgFI&#x0D;&#x0A;gTAorR4AYgFxceH5EQYPBAR+72GQZHvLIMDGwMAE1fnpDyPDZ34RhtsXGIGG/3d0br4ONhwggBiJ&#x0D;&#x0A;yZ1rSo0b5GW+12tIf2DgZmNmYETT9e3nX4a3/3kZrp1nArvcq+P6B4AAIsrgreWaAkAN+/WN/xnI&#x0D;&#x0A;Sv2H+hWq9ddfcFyAcuXzN6wM584xgw0HCCAmYgz27rz+ARjUjiePM1148BgowMfBwMDPCZEEpiCG&#x0D;&#x0A;l58YmJ9/ZJDh/c6gqfbb4PdfhvkAAcREbGkX3H/9w+8//x2PHmG6cPciMOnysDMwfAbSX34yMLz+&#x0D;&#x0A;zMDw+x8Dw8O3DKoS3xlYWf4GAAQQEylFadTUG0DDGRwPHmK6cGv/OwYGoPeBgc7A8OMPKKAhqROY&#x0D;&#x0A;5tmY/zEABBATqeV04myg4X8ZHPceZL5w4wrQwA/fGBicNRgYxHjBlvz88pfh+VumDwABxExOJbDl&#x0D;&#x0A;wpsfrtrCK2+/YPdg//tbQvLTS6CrQbkVWLVdEGR4/YWlEyCAGCmpZTpD1UGpZT0f+x8Hfo4/DK++&#x0D;&#x0A;sn349ZdpYsWamw0AAQYA0lMHydArgUYAAAAASUVORK5CYII="
  const charstring c_XTDP_Image_Play := "iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI&#x0D;&#x0A;WXMAAAsMAAALDAE/QCLIAAAAB3RJTUUH0woJEyQqW/WmUwAABHxJREFUeNqFld1vlEUUh5+Z92O/&#x0D;&#x0A;utstLZYiLAViCKlA3YoGEz+CUVOJJqIxfsW7Ergg4Yb4ByjpH6CmF69y4U0v5NIEI8YbgoRQltSK&#x0D;&#x0A;GBILlCrtbrvdfZft7vs148WWpTW0TnIymcyZJ79zcs4ZwQYrf2LSAr0ZVB9aJ0EDuoFWc5Zyi1ec&#x0D;&#x0A;1/z13ooNoIeA90EPIsghrBQAyltGR/eASaHCc3l99pLjONH/gvMnJneDOIVhfdSRSma39GRkb3ec&#x0D;&#x0A;PT01ElbEX+UO7hQVC6WSKlcbDRU2Lln6wRf79fhlx3HCx4LzJyZ3gBjDzgwP7krw5sE0+7Zrnsha&#x0D;&#x0A;GLLlqoGlWsj0XMD5QpOLU0v4DfdmTJU/e1qfO/8QbvxH6dcdmcwbbx/qFJ++kuCpPoOYZfDNTxX2&#x0D;&#x0A;bo/hhxo/1BhS0JMx2bfDorfL4nZR97hN8eyi3lkYHkrMFgoF3Qb3HTw+ip3+4MhzWfHWkIVtSfxQ&#x0D;&#x0A;4wWad17I8tUPi+zaYuH5Ci9QeKFGa83WTRbppCX+mI26m762tnL9wtDQUGC01F47JIzY6IHdmfhw&#x0D;&#x0A;3kJK8ANFM2hBtvXEeHEgxcnvNM/kArxAr9y3ItjUIan7JjOloL8UbZ/s5eZtI398wgJOpdPpl14d&#x0D;&#x0A;TImuDvACTTNoqfUCze6tcQDee97g9Lhg7xZ/zX0zUNiGz/S8suvNMDDC6kUT2AwMZjKdMhsPcety&#x0D;&#x0A;o9Jm/KTNh1/C0QMuUaSZLUdMzWVxG0lqdEhFZcAVuZwJ9CFkrictaPiKhq/QK+Wi1yn0FjzD/t4K&#x0D;&#x0A;k3+nmHVbEWGaIIw+DDsngSQylkpaAZW6wl1WeL6m6ev2vp7y3+azlJaTj5pCCJCxhIB0O263aTFf&#x0D;&#x0A;lRRdSbUhqTQM7lViXJ1JbZgWPzIQgpa1m0NJE3QD5S3P1xPUo3grfkAjqPk2Wq+f79dHV7WwWGmf&#x0D;&#x0A;qNkUOvRMtJoD7lWX1c5IJNY81Mh1p8nhMxCsTAjTAAk8aHigo6JU9TlpKbcITOKVlWVo7FUWMyIe&#x0D;&#x0A;J/nwGQBF0opIWhFxM8I2I4S/qEyat7L67n3zivOaP3Ts8rnIq35iRYmurrS9RqTSAJn2eWSsxrY0&#x0D;&#x0A;CKHbfq354aOaS/VENH+h01gomwB5ffbStXDk+1qldKy/u4uYKR7VG4/Ap7+dJ2uDth/mtOXjhZqZ&#x0D;&#x0A;yhLKr/6yR/78K1AzAAqFgt6W/3jaC9irVLTjyW5DJGOCmKWJWZqX96X5fPw+MbN1jtutPWZqBAG3&#x0D;&#x0A;Zly1WK5OdEc3xrLinxttMMCRvLW4qHMT1YY54C6H/emkxaa0iW1JLt+sY5tijVkGLFQDpqarzJXc&#x0D;&#x0A;ic3h9dGcLFwFFhzHidrgQqGgh4eS5UXdf73aMJKlatBfWw7tuBmKVMLElBIpQOuIxaU6v99ZVn/O&#x0D;&#x0A;1B5UKu6P3dGNsRVo0XGc4LE/yMjIiARSU7x7OJQdRxXWgJSiL50wEgC1RtRUkSqaNG/Fo/kLKzmd&#x0D;&#x0A;Byrr/iCr4AKwi1F/1hW5HIadE5AWKCl06ElVn8vqu/c7jYUyUAMajuOo1Yx/AWXzQW5ayEXoAAAA&#x0D;&#x0A;AElFTkSuQmCC"
  const charstring c_XTDP_Image_Pause := "iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI&#x0D;&#x0A;WXMAAAsMAAALDAE/QCLIAAAAB3RJTUUH0woJEyUmS1jbOQAABDRJREFUeNqdlc9vG0UUxz8zu7P+&#x0D;&#x0A;Edtx86PBhboJEapQKVQOReoNIVUoVCBUpAqBxC2oPSAhceDAFal/AfSwEhcOXHqAUxHlRFWgInWV&#x0D;&#x0A;mlBUqWmaFpI4sROva+/auzvDwW2apElBPOmr0Zt985mn2fdmBE+w0pkZBWYYdAFj0mAA42P0ktJe&#x0D;&#x0A;9Yp7vLvbWvEE6DHgFJgjCIoI1QeA7rQx8V1gRujofMl8ddl13fhfwaUzM+MgPsZS72X60vmnhnJy&#x0D;&#x0A;ZDDJwaEmKRVzq55hvqpZXVnR9Ybv68i/rMz9z1803/zium60I7h0ZuYAiHM4uckjz6Z442iWw/sN&#x0D;&#x0A;e/MKS/ZCDbDWjJhbCrlQDrhUWaPrezcSuv7pC+b8hYdwa1umX2RyudffOtYvPng1xXMFi4SyCGPo&#x0D;&#x0A;RmZDlhQM5WwOH1CM7FHcrpohLxAv18xYeXIida9cLpsNcOHo6bM42XdPvJIXb04oHCXpRoZOuE1d&#x0D;&#x0A;TSfUdCKDMYZ9A4psWok/7sWDQdeofVy7ODExEVq9bK8eE1bi7EvjueRkSSEldEPNTxWPucWAucWA&#x0D;&#x0A;woCi3dFcqjSZW+wwtxgwskcRhIaBjKTVtVlYCUdX4v0zI9y4bZdOTyuMOZXpS+ZK4w6x1jRaBoCP&#x0D;&#x0A;3i5snP8PV9d3nYu14WAh5vqtRLZey5yshqO/2sAwcCSX65f5ZITXkrvWdaMVbfGvzwcAVJbyeH6a&#x0D;&#x0A;JhmpWT/kiWLRBgoIWRzKCvyuxu9qzA51WJlvk0tt3XR6oVfa97xkb8K2QVgFLKdoA2lkoi+tQtZb&#x0D;&#x0A;GinAsXfuG8/XW/y/mlkc61FvCCFAJlJCk7U3FgWK5YbBkpBNCcy2nL+d3cdAyueTbZt1YwvxMNQ8&#x0D;&#x0A;bA4tbTA+utNebqVoxcmNj2aHbq/7qV3Pvwc3EAeBMFHHxugl4G6jrcdikeL/mG2BBO77HTBxVerW&#x0D;&#x0A;klTaqwIzdOpaWQZnk/6LpVVM0o5x7BjRrWmb4Gbe3FmUV9zjXaGj83Gn0VDxGsPpFnsfaLON5ZuM&#x0D;&#x0A;5ZuPgQuZXqyK19DBWisZL1/st1brAmBqasq6ak19mctmPjw8voeELXr1ZrZdVebRsPmHdSJD5dYa&#x0D;&#x0A;zfXV70p8/RkwbwGUy2XzTOn9uU7I81rHB54etEQ6IUgo05O9dUw6j3xByM0FT9fqjenBePZcXvw9&#x0D;&#x0A;CzQ3LqETJVWrmeJ0w7cPee1oNJtWDGRtHCVxbPGYlAWrjZDKXIOlFW96OLp2tijLvwGrruvGG+By&#x0D;&#x0A;uWwmJ9L1mhm91vCt9EojHG22IydpR6IvZWNLiRRgTExtrcXv823950Lz/vq69/1gPHvuAbTqum64&#x0D;&#x0A;4wsyNTUlgb4K77wWycxJjTokpShkU1YKoOnHgY511Sa4mYyXLx6UP/4MLAPru74gm+ACcKrxaN4T&#x0D;&#x0A;xSKWUxSQFWgpTNSRurWUN3cW+63VOtAEfNd1t/T7P6XWFCRCYI3ZAAAAAElFTkSuQmCC"
  const charstring c_XTDP_Image_Stop := "iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI&#x0D;&#x0A;WXMAAAsLAAALCwFtBIS3AAAAB3RJTUUH0woJEwkMqdJ5QQAAA+9JREFUeNqdlduPU0Ucxz8z59Ke&#x0D;&#x0A;bk/pXrgUtSyi2ZgVgq2Y8EKMiRok+oAJUUz0aQm8mfjgk0+a8BcYHk5CfONBTDQmQoSYGEW8LN2s&#x0D;&#x0A;iBICyC1Lt7vttqe0p+05Z8aHssuCgIvf5JvJby6f+eU3mRnBQ1Q4MG2BXg0qh9Yp0IAO0KpsKb/y&#x0D;&#x0A;i/dy70FrxUOg24E9oLciyCOsAQBUt42OrwPTQkVHC/rwKc/z4v8EFw5MbwLxPoa1Nz2Qyq4byci1&#x0D;&#x0A;w0nGRpo4VsylWporFcX83JyqNYJARcEpS9/6ZIs+ctrzvOi+4MKB6Q0gDmFndm590uG1bS6bn9Cs&#x0D;&#x0A;yVoYsj9VAwvNiMvlkGOlDj+cXaAX+H8lVO3DZ/XRY4tw455MP01nMq++sX2VePdFh6dzBgnLIIyh&#x0D;&#x0A;F+klG1IwkjHZvMFi7aDF3xU94nfE81W9sbSz6NwolUp6CZzbtv8gtvvWrhey4vWihW1JepGmG97j&#x0D;&#x0A;nqIbKrqRRmvN+iELN2WJP2/Ew52ettYzdaJYLIain+2Z7cJIfrPlqaHs3h0OriP5dipgJXrlOYcw&#x0D;&#x0A;0nz1a8D3U5WG0Z15bzNfHDcL+ycttN6THkhmCptsYqVotDQAH7295qHQj49UaHcVnZ5iLBfz+6WE&#x0D;&#x0A;W6umd1fC0Z9NYDWwNZNZJbPJCL8leRR99mMCAD9I0SQtFfVxX+TzJpBDyPyIKwh6iqCn6Oe7sg2E&#x0D;&#x0A;6nGxlukHpgnCyGHYeRNIIRMDKSuk3lJIAbYpVgS9NJ+8exMhQCYcoXDNxU6/YzHb0BgSXEesuBQX&#x0D;&#x0A;axnE4nS9eDmUNEEHqG57tuXQipNLgxrxSLXuwzXEnY7QUddEqzJwvdFWG2Ph8H9kGv0TuRV0QccV&#x0D;&#x0A;qVplaSm/AkzTrSnL0NjLvFIlzRjbjBG9qjLpXMjqqzcFQHHf6R3CTn+Zy60bHHTtRyqCISFSsNDs&#x0D;&#x0A;UZ6ZaTqd8x+MyZNfmwAFffjUmWji82Z9bt/o8CAJU/SfJ33PU6XvNMsPrBtprtUXUL3Gd2Py5E9A&#x0D;&#x0A;0wAolUr68cI7l7shzygVb3hs2BCphCBh6b7Nu9ukfScWhFy45qtqrTE5HJ87lBUz55bAALsKVrWq&#x0D;&#x0A;85ONwBz329Gom7IYck1sS2Kb4l+2DJhvhJy93KA850+ujqYO5mXpN2De87x4CVwqlfTOYqpW1aNT&#x0D;&#x0A;jcBIzTXC0WY7spNmJAYcE1NKpACtY6oLLf640lbnrzVv1ev+8eH43KHb0IrneeF9f5CJiQkJDJzl&#x0D;&#x0A;zZcimd6tsMalFDnXMRyAZhB3VKwqJp0LyXj2xO2azgL1B/4gy+ACsCvxaNYX+TyGnRfgCpQUOupK&#x0D;&#x0A;1Spn9dWbq4z5GtAEAs/z1HLGP0K45L8u7KzsAAAAAElFTkSuQmCC"
  const charstring c_XTDP_Image_Exit := "iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI&#x0D;&#x0A;WXMAAAsLAAALCwFtBIS3AAAAB3RJTUUH0woKFhstiTF0yQAABL9JREFUeNqFld9vVEUUxz8z9969&#x0D;&#x0A;+7Mt2xaowhZEUCm/QgXkQfwBCAUxIsZEIyEhKc+8+OMPICHxlRAeNhr1xQdJjA8I4UeCNIAoLNYC&#x0D;&#x0A;EiJUC4R2t90f925393bvnfFhoVAseJJvJpPMfOacOXPmCJ5i/d1rLK11u4IOjY5qAERVwXDJMrMb&#x0D;&#x0A;L5ybeNJe8RToWuADrfUKIGVBDMBDVxTc1tDvC3n4q5XLzqbT6eB/wf3daxYI2GvBR9F4vCUxa6aM&#x0D;&#x0A;zJ6Nu2ghQSRC/OYg6p+/yeVGVTWfr1aVOlu2zH3fLes6n06n/WnB/d1rOgUcSkBPdMVyElt60Eu7&#x0D;&#x0A;sNrbEYbRWKQ1fqFI/dYtaseOU+jrw/Em/izY9mffL3nx6AO48ZinB5vi8U0t72wTkZ0fYyxaiGHb&#x0D;&#x0A;4PvoiXpD9TrCMDDb2rCWLMGaNQs9ONgmHOfl+WP5TKRn851MJqPNB2Ct9ScJIXqaN6zH2tqD0Zqk&#x0D;&#x0A;euUqAHbn3PvBaXQjg0wM3QYgsrqbpF8X6utvF/mVyh6gv7e3t2wAXFq5eq0txP6mZcvCVs9mQp0p&#x0D;&#x0A;qleu0vTGa0QWLaT0cx/StlGeh/Y8an/dJLltK3Znikr/AOYzHZjjFepDQ/NSudH+a7PaB42LK1dZ&#x0D;&#x0A;wN5EU2JdbP2bguQMrJkziS5+CRkKoYOAWNdi3F9+RWhNPTdK247tjQRJSXjBc4ydOIlua0UPDob8&#x0D;&#x0A;8fF6yZB9EmgHVjQ3NUl/RguB4+KeOz8JFYaBqtVo27Ed33Vp27EdrdSUl5TsO0vrkaPMdMvSVKpr&#x0D;&#x0A;ruOmJNAhISVaW1GVCn6hgJ/PM5z+EmEYBJUKMhwGmOLpA3M/3En45i3sbI44AgPREUKkJBC1EbF6&#x0D;&#x0A;LIYqlVCOg/Y8dK3GvQMHMaLRJ1bmxNZ3ieZG7z9cgQBsiCBEYvJoq+Qgh0eQ2Ryy5GAUi9i37+Ds&#x0D;&#x0A;3jM9dd16Qq6LMTEBQkzCAZQQ0gRR9dCVyEiWcKX6sCS1IuSWMY4fmR585hSsW/9wLiVaKWpQ84Xw&#x0D;&#x0A;pIJhBbeVUyL8iOxqrQENgif/UmdONUbTBNOkVq8ToLPjUgzLkmVmNfTnQWnTQlsNyZ9+bGwyjCnh&#x0D;&#x0A;A+B5U+BBOExg2+QFqmaaN4Zamu/JjRfOTfhCHi4FfqlgmYy3t5Nd+wq6UpninLNrN878Tpxdu8G2&#x0D;&#x0A;/+N8wTIpBP74SDh8ItfclDcA5Ntb7iy/Ozy/ju42O+cifJ/y5d9JrHsVgJFPP8ePx/DjMeqxGOUT&#x0D;&#x0A;J4m/tQGAe/v2UwmHGBsaouh5x35YuvgbIDv5u51etXZxTAUHYnPmvB5fulSakQg8VgjTme95lAcG&#x0D;&#x0A;VOnu3Ut/JJNfXOyccxrIT16gtbVnrHOscNEsFrt8x5lnxeOYyRnIUAgRsh7KagjLpJ4bpTQwgDs8&#x0D;&#x0A;cjHT3rY/k3r2N2A0nU4Hk+BMJqOjPZvy88byl42SE63nsvN8txzyw2FhxmJI0wQpCdCMj41RuXJV&#x0D;&#x0A;udevl91i8diV1uSh+9BsOp2uT9tBent7JRB7f+Dam3Hff89UqksYRoeRSEQAAtetqSDI1kzzxkg4&#x0D;&#x0A;fOLkC8+fA0aA4hM7yCNwAYTmZ3Mtcx03FUKkECKhhJC+EN64FMNDLc33cs1NecAFqul0ekpC/gXY&#x0D;&#x0A;/CPMCV0dPwAAAABJRU5ErkJggg=="
  const charstring c_XTDP_Image_Shred := "iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI&#x0D;&#x0A;WXMAAAsOAAALDgFAvuFBAAAAB3RJTUUH0woCFhYuYCJz0QAAAblJREFUeJyllb+q8jAYh58ePhFd&#x0D;&#x0A;pHVxcdOlgw6ODuLU1avwAgRXBS9BvDZnF/+A0IoK2jZtzhRPk9Ni/c4PSpq8eZ/3lwQSq9PpoOR5&#x0D;&#x0A;nnw+n4RhCEAYhtqnYmEYEkWRSrPI0b9sJ4oilstl3rxXodvtxuVyYTqdslqtWCwWMg+ugeM4BqDd&#x0D;&#x0A;bhfCgyDg8Xhg2zau6xbCv0zH72TbNrVaDcdx6Pf7Lzgg/wRWcMdx2O/3hfDcrSgjx3GYz+f4vo/v&#x0D;&#x0A;+wRBoMV/HV5Zrddrrtcru92O8/nMdrtls9nkgz9xLKWkXq/TbDaRUtJqtf7uWAiBEIIkSWg0GgD4&#x0D;&#x0A;vq/N0Q6vjOMsNEkShBBUq1UqlUox+BMpqBAiN/7RHsdxTJIkRFGkQZXrQnDRHkspX8vPg6pYVm/3&#x0D;&#x0A;OAtV/yb0LVip2+1qreu6SCnp9XoIIRgOh6Rpymg0AsDzvF+Mt47VmHlIaZpq46UcZxNVgmrVuFnQ&#x0D;&#x0A;LKyBLevn5lMTiwBmqwrmgqX8ufnMRLOAWkEpx1mZABNUVKgQfL/fARgMBgAcDgcAxuMxAMfjEYDJ&#x0D;&#x0A;ZALA6XQCYDabaRwr+5iivwLWf/Rf+gaq5nuqnqksPAAAAABJRU5ErkJggg=="
  const charstring c_XTDP_Image_Save := "iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI&#x0D;&#x0A;WXMAAAsSAAALEgHS3X78AAAAB3RJTUUH0wgaFi8epxLi1wAAAsJJREFUeJzVlD2PHEUQhp/ZnTV3&#x0D;&#x0A;PvDHBcgykgMCEAGCf4CQkAgQiD8AMREidQbRRQT8A2JIQCBBgiFzAEIyEPpkGWTJvhV3uzO7091V&#x0D;&#x0A;1dUEMzvHyWs7dkutqu4Zvf3029UNT1urNskPP/76UV1PD1Qzs3pC03bEpGTLzOopZhkRxSyjaqhu&#x0D;&#x0A;onHnnznzo8V3zWL18c83Pl8A1Bvhup4evPTKtUtQce3qPp9+8Q3LJnDhuV0+++T9x9J9f+MWf966&#x0D;&#x0A;/cG3X/0C8OEZ4ZSULgrVsImbvx9y+cJ56nryxG0vmg4H3PO7I+gmkWF7VdUL71/c4+UXr/DClctP&#x0D;&#x0A;FBYxlssVKck4dyosiqgxqXrCt994lavPX2T/0rOPFXUvLJuW5aLBLD8snMQQzZRinDQd7731OqUU&#x0D;&#x0A;SoH5cTvk/XgTzYyTk5ajB8d0IWJm24h7K7qY+O2PO6hlzDKWfci9r4icETFiSDTLlvU6cHzSEqM8&#x0D;&#x0A;ilgRVUIcSspyX1KWB/+NmJQYhbZdEbpISkJKiogQYyTnLcI6WOHunN89h2UfateoiuMGk5KZlszO&#x0D;&#x0A;bMpk9xyzScVsOuEoBFIScvZHERs7z8x4583XcHdCEEJIpKSo2mCX9QctNvYvv/6JeUiP9xjALBNC&#x0D;&#x0A;IgRB1bYIn10giSCi261ISRHNmBp37/7L/fsNqjZcYR2usI72mPXiOzs1KQpJ0nZhGchMlaoq7O3V&#x0D;&#x0A;iIAq1HWhrmE6LZjBZFJQLVRVARwZiN23eZyU1bojm7FaRRaLbqTqCU8fIREdH6HZrBqskO3EMSTW&#x0D;&#x0A;60BxR9Vwz+T8cDfro7uNQv1Csp04xEQICbxgZpTiuPe9z/Mw7mPOm7ygIqgo7luIwzqyXrTkbKxW&#x0D;&#x0A;y/HkT6vg7CGq5vGfdduQujW+rY6P54vr9/5+cBBT4vZfh+RcRuKcC6X4/+ZOv7kX7h3O6YLiznWe&#x0D;&#x0A;2vYfEhrg/995S7wAAAAASUVORK5CYII="

  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_AddRequests := { xTDP_AddRequest_list := {
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
          image := {
            id := "image_ok",
            imagedata := c_XTDP_Image_Ok,
            imageurl := omit
          }
        }
      },
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
          image := {
            id := "image_configure",
            imagedata := c_XTDP_Image_Configure,
            imageurl := omit
          }
        }
      },
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
          image := {
            id := "image_play",
            imagedata := c_XTDP_Image_Play,
            imageurl := omit
          }
        }
      },
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
          image := {
            id := "image_pause",
            imagedata := c_XTDP_Image_Pause,
            imageurl := omit
          }
        }
      },
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
          image := {
            id := "image_stop",
            imagedata := c_XTDP_Image_Stop,
            imageurl := omit
          }
        }
      },
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
          image := {
            id := "image_exit",
            imagedata := c_XTDP_Image_Exit,
            imageurl := omit
          }
        }
      },
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
          image := {
            id := "image_shred",
            imagedata := c_XTDP_Image_Shred,
            imageurl := omit
          }
        }
      },
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
          image := {
            id := "image_save",
            imagedata := c_XTDP_Image_Save,
            imageurl := omit
          }
        }
      }} }
    }
  };


  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);





}

private function f_EPTF_TPE_appendLength_XTDP(in octetstring stream) return octetstring
{
  return int2oct(lengthof(stream)+4,4) & stream
}

private function f_EPTF_TPE_create_gui() runs on MAIN_CT {
  timeSequencesPropertiesTreeDisabled := true;
  profilePropertiesTreeDisabled := true;
  removeRowDisabled := true;
  removeProfileRowDisabled := true;

  // remove all
  xtdp_message := {
    transactionID := omit,
    choice := {
        xTDP_RemoveRequests:= { xTDP_RemoveRequest_list := {
          {
            requestId := f_EPTF_TPE_nextRequestId(),
            widgetId := omit
          }
        }}
    }
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  // add window
  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_AddRequests := { xTDP_AddRequest_list := {
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := omit,
        widgets := {
          window := {
            about  := "",
            height := 386.0,
            help   := "",
            id     := "window",
            orientation := vertical,
            title  := "Time Profile Editor",
            width  := 820.0,
            image_list := {},
            embeddedwidgets := { embeddedwidget_list := { }}
          }
        }
      }
    } } }
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  f_EPTF_TPE_init_images();

  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_AddRequests := { xTDP_AddRequest_list := {
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
            tabpages := valueof(ts_xtdp_tabpages("main_tabbox", 1.0, omit,
            {  tabpagegroup_list:= { { tabpage := valueof(ts_xtdp_tabpage("time_sequences_tab","Time sequences", horizontal, {
                {{
                  hbox := valueof(ts_xtdp_hbox("time_sequences_hbox", 1.0, omit, horizontal, {
                    {{
                      hbox := valueof(ts_xtdp_hbox("time_sequences_left_hbox", 1.0, omit, vertical, {
                        {{
                          hbox := valueof(ts_xtdp_hbox("time_sequences_left_upper_hbox", 0.0, omit, horizontal, {
                            {{
                              textbox := valueof(ts_xtdp_textbox("new_sequence_textbox", 2.0, omit, false, false, omit, "new_time_sequence_name", omit, omit))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.0))
                            },
                            {
                              button := valueof(ts_xtdp_button("new_sequence_button", 0.5, omit, omit, "New sequence", omit, "image_ok"))
                            }}
                          }))
                        },
                        {
                          listbox := valueof(ts_xtdp_listbox(c_timeSequenceListboxId, 1.0, omit, 0, single, { listitemgroup_list:= {}}))
                        },
                        {
                          button := valueof(ts_xtdp_button("remove_sequence_button", 0.0, omit, omit, "Remove selected sequence", omit, "image_shred"))
                        }
                      }}))
                    },
                    {
                      spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                    },
                    {
                      hbox := valueof(ts_xtdp_hbox("time_sequences_right_hbox", 2.0, omit, vertical, {
                        embeddedwidget_list := {{
                          hbox := valueof(ts_xtdp_hbox("time_sequences_right_upper_hbox1", 0.0, omit, horizontal, {
                            {{
                              label_ := valueof(ts_xtdp_label("before_row_label", 0.0, omit, "Before row:"))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                            },
                            {
                              numericalwidget := valueof(ts_xtdp_numericalwidget("before_row_numwidget", 1.0, omit, integerField, int2float(currentBeforeRow), omit, true, omit, 1.0, 1000.0, 1.0))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                            },
                            {
                              button := valueof(ts_xtdp_button("add_time_sequence_row_button", 0.0, true, omit, "Add row", omit, "image_ok"))
                            }}
                          }))
                        },
                        {
                          hbox := valueof(ts_xtdp_hbox("time_sequences_right_upper_hbox2", 0.0, omit, horizontal, {
                            embeddedwidget_list := {{
                              label_ := valueof(ts_xtdp_label("remove_row_label", 0.0, omit, "Row number:"))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                            },
                            {
                              numericalwidget := valueof(ts_xtdp_numericalwidget("remove_row_numwidget", 2.0, true, integerField, 1.0, omit, true, omit, 1.0, 1000.0, 1.0))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                            },
                            {
                              button := valueof(ts_xtdp_button("remove_time_sequence_row_button", 0.5, true, omit, "Remove row", omit, "image_shred"))
                            }}
                          }))
                        },
                        {
                          spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                        },
                        {
                          label_ := valueof(ts_xtdp_label("time_sequences_properties_label", 0.0, omit, "Time sequences properties:"))
                        },
                        {
                          hbox := valueof(ts_xtdp_hbox("time_sequences_properties_tree_hbox", 1.0, omit, horizontal, {
                            {{
                              tree := timeSequencesPropertiesTree
                            }}
                          }))
                        }}
                      }))
                    }
                  }}))
                }
              }}))},
              { tabpage := valueof(ts_xtdp_tabpage("time_profiles_tab", "Time profiles", horizontal, {
                {{
                  hbox := valueof(ts_xtdp_hbox("time_profiles_hbox", 1.0, omit, horizontal, {
                    {{
                      hbox := valueof(ts_xtdp_hbox("time_profiles_left_hbox", 1.0, omit, vertical, {
                        {{
                          hbox := valueof(ts_xtdp_hbox("time_profiles_left_upper_hbox", 0.0, omit, horizontal, {
                            {{
                              textbox := valueof(ts_xtdp_textbox("new_profile_textbox", 3.0, omit, false, false, omit, "new_profile_name", omit, omit))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.0))
                            },
                            {
                              button := valueof(ts_xtdp_button("new_profile_button", 0.5, omit, omit, "New profile", omit, "image_ok"))
                            }
                          }}))
                        },
                        {
                          listbox := valueof(ts_xtdp_listbox(c_profileListboxId, 1.0, omit, 0, single, { listitemgroup_list:= {} }))
                        },
                        {
                          button := valueof(ts_xtdp_button("remove_profile_button", 0.0, omit, omit, "Remove selected profile", omit, "image_shred"))
                        }}
                      }))
                    },
                    {
                      spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                    },
                    {
                      hbox := valueof(ts_xtdp_hbox("time_profiles_right_hbox", 2.0, omit, vertical, {
                        {{
                          hbox := valueof(ts_xtdp_hbox("time_profiles_right_upper_hbox1", 0.0, omit, horizontal, {
                            {{
                              label_ := valueof(ts_xtdp_label("before_profile_row_label", 0.0, omit, "Before row:"))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                            },
                            {
                              numericalwidget := valueof(ts_xtdp_numericalwidget("before_profile_row_numwidget", 1.0, omit, integerField, int2float(currentBeforeRow), omit, true, omit, 1.0, 1000.0, 1.0))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                            },
                            {
                              button := valueof(ts_xtdp_button("add_profile_row_button", 0.0, true, omit, "Add row with sequence:", omit, "image_ok"))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                            },
                            {
                              menulist := valueof(ts_xtdp_menulist("time_sequence_menu", 1.0, omit, false, omit, { choice := { menuitemgroups := { menuitemgroup_list := {}}}}))
                            }
                          }}))
                        },
                        {
                          hbox := valueof(ts_xtdp_hbox("time_profiles_right_upper_hbox2", 0.0, omit, horizontal, {
                            {{
                              label_ := valueof(ts_xtdp_label("remove_profile_row_label", 0.0, omit, "Row number:"))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                            },
                            {
                              numericalwidget := valueof(ts_xtdp_numericalwidget("remove_profile_row_numwidget", 2.0, true, integerField, 1.0, omit, true, omit, 1.0, 1000.0, 1.0))
                            },
                            {
                              spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                            },
                            {
                              button := valueof(ts_xtdp_button("remove_profile_row_button", 0.5, true, omit, "Remove row", omit, omit))
                            }
                          }}))
                        },
                        {
                          spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                        },
                        {
                          label_ := valueof(ts_xtdp_label("profile_properties_label", 0.0, omit, "Time profile properties:"))
                        },
                        {
                          hbox := valueof(ts_xtdp_hbox("profile_properties_tree_hbox", 1.0, omit, horizontal, {
                            {{
                              tree := profilePropertiesTree
                            }
                          }}))
                        }
                      }}))
                    }
                  }}))
                }
              }}))},
              { tabpage := valueof(ts_xtdp_tabpage("preview_chart_tab", "Preview chart", horizontal, {{{
                  label_ := valueof(ts_xtdp_label("preview_chart", 0.0, omit, "Please select a time profile on the 'Time profiles' tab!"))
              }}}))},
              { tabpage := valueof(ts_xtdp_tabpage("config_file_tab", "Config file", horizontal, {{
                {
                  textbox := valueof(ts_xtdp_textbox("config_file_textbox", 1.0, omit, true, true, 0.0, "Empty config", omit, false))
                }
              }}))
            }}}
          ))
      }
    } } } }
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_AddRequests := { xTDP_AddRequest_list := {
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
          hbox := valueof(ts_xtdp_hbox("time_unit_hbox", 0.0, omit, vertical, {
            {{
              hbox := valueof(ts_xtdp_hbox("time_sequences_right_upper_hbox3", 0.0, omit, horizontal, {{
                    {
                      label_ := valueof(ts_xtdp_label("time_unit_label", 0.0, omit, "Time unit:"))
                    },
                    {
                      spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                    },
                    {
                      menulist := valueof(ts_xtdp_menulist("time_unit_menu", 0.0, omit, false, omit, { choice := { menuitemgroups := { menuitemgroup_list:= {
                            {menuitem := valueof(ts_xtdp_menuitem("time_unit_menu_seconds", "seconds", false)) },
                            {menuitem := valueof(ts_xtdp_menuitem("time_unit_menu_minutes", "minutes", false)) },
                            {menuitem := valueof(ts_xtdp_menuitem("time_unit_menu_hours", "hours", false))}
                          }}}}))
                    }
              }}))
            }}
          }))
        }
      }
    }}}
  };

  // choose the right item on reconnect
  if(currentTimeUnit == xtdp_message.choice.xTDP_AddRequests.xTDP_AddRequest_list[0].widgets.hbox.embeddedwidgets.embeddedwidget_list[0].hbox.embeddedwidgets.embeddedwidget_list[2].menulist.menupopup.choice.menuitemgroups.menuitemgroup_list[2].menuitem.label_) {
    xtdp_message.choice.xTDP_AddRequests.xTDP_AddRequest_list[0].widgets.hbox.embeddedwidgets.embeddedwidget_list[0].hbox.embeddedwidgets.embeddedwidget_list[2].menulist.menupopup.choice.menuitemgroups.menuitemgroup_list[2].menuitem.selected := true;
  } else if(currentTimeUnit == xtdp_message.choice.xTDP_AddRequests.xTDP_AddRequest_list[0].widgets.hbox.embeddedwidgets.embeddedwidget_list[0].hbox.embeddedwidgets.embeddedwidget_list[2].menulist.menupopup.choice.menuitemgroups.menuitemgroup_list[1].menuitem.label_) {
    xtdp_message.choice.xTDP_AddRequests.xTDP_AddRequest_list[0].widgets.hbox.embeddedwidgets.embeddedwidget_list[0].hbox.embeddedwidgets.embeddedwidget_list[2].menulist.menupopup.choice.menuitemgroups.menuitemgroup_list[1].menuitem.selected := true;
  } else if(currentTimeUnit == xtdp_message.choice.xTDP_AddRequests.xTDP_AddRequest_list[0].widgets.hbox.embeddedwidgets.embeddedwidget_list[0].hbox.embeddedwidgets.embeddedwidget_list[2].menulist.menupopup.choice.menuitemgroups.menuitemgroup_list[0].menuitem.label_) {
    xtdp_message.choice.xTDP_AddRequests.xTDP_AddRequest_list[0].widgets.hbox.embeddedwidgets.embeddedwidget_list[0].hbox.embeddedwidgets.embeddedwidget_list[2].menulist.menupopup.choice.menuitemgroups.menuitemgroup_list[0].menuitem.selected := true;
  }
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_AddRequests := { xTDP_AddRequest_list := {
      {
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "window",
        widgets := {
          hbox := valueof(ts_xtdp_hbox(omit, 0.0, omit, horizontal, {{
            {
              hbox := valueof(ts_xtdp_hbox(omit, 1.0, omit, vertical, {{
                {
                  hbox := valueof(ts_xtdp_hbox("error_hbox", 1.0, omit, horizontal, {
                    {{
                      label_ := valueof(ts_xtdp_label("error", 1.0, omit, "Errors: none"))
                    }}
                  }))
                },
                {
                  label_ := valueof(ts_xtdp_label("status", 1.0, omit, "Time Profile Editor started."))
                }
              }}))
            },
            {
              hbox := valueof(ts_xtdp_hbox("save_exit_hbox", 0.0, omit, horizontal, {{
                {
                  button := valueof(ts_xtdp_button("save_button", 0.0, omit, omit, "Save", omit, "image_save"))
                },
                {
                  spacer := valueof(ts_xtdp_spacer(omit, 0.1))
                },
                {
                  button := valueof(ts_xtdp_button("exit_ttcn_button", 0.0, omit, omit, "Exit TTCN", omit, "image_exit"))
                }
              }}))
            }
          }}))
        }
      }
    }
  }}}
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
}

private function f_EPTF_TPE_send_model_to_gui() runs on MAIN_CT {
  var boolean vl_selected := true;

  for(var integer i := 0; i < sizeof(timeSequenceList); i := i + 1) {
    xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_AddRequests := { xTDP_AddRequest_list := {
        {
          requestId := f_EPTF_TPE_nextRequestId(),
          parentWidgetId := c_timeSequenceListboxId,
          widgets := {
            listitem := valueof(ts_xtdp_listitem(timeSequenceList[i].name & "_id", timeSequenceList[i].name, vl_selected))
          }
        }
      }
    }}};
    f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
    vl_selected := false;
  }

  vl_selected := true;
  for(var integer i := 0; i < sizeof(profileList); i := i + 1) {
    xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_AddRequests := { xTDP_AddRequest_list := {
        {
          requestId := f_EPTF_TPE_nextRequestId(),
          parentWidgetId := c_profileListboxId,
          widgets := {
            listitem := valueof(ts_xtdp_listitem(profileList[i].name & "_profile_id", profileList[i].name, vl_selected))
          }
        }
      }
    }}};
    f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
    vl_selected := false;
  }

  if(sizeof(timeSequenceList) > 0) {
    currentTimeSequenceSelection := timeSequenceList[0].name;
    f_EPTF_TPE_set_selected_time_sequence(currentTimeSequenceSelection, false);

    vl_selected := true;
    for(var integer i := 0; i < sizeof(timeSequenceList); i := i + 1) {
      xtdp_message := {
        transactionID := omit,
        choice := {
        xTDP_AddRequests := { xTDP_AddRequest_list := {
          {
            requestId := f_EPTF_TPE_nextRequestId(),
            parentWidgetId := "time_sequence_menu",
            widgets := {
              menuitem := valueof(ts_xtdp_menuitem(timeSequenceList[i].name & "_menu_id", timeSequenceList[i].name, vl_selected))
            }
          }
        }
      }}};
      f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
      vl_selected := false;
    }
    currentTimeSequenceMenuSelection := timeSequenceList[0].name;
  }

  if(sizeof(profileList) > 0) {
    currentProfileSelection := profileList[0].name;
    f_EPTF_TPE_set_selected_profile(currentProfileSelection, false);
  }

  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_Requests := {
      ackRequested := omit,
      xTDP_Request_list := {{
        requestId := f_EPTF_TPE_nextRequestId(),
        action_ := { {settooltip:= {
          widget := {
            widgetId := "save_button",
            widgetType := string
          },
          argument_list := {"Saves the config file to: " & tsp_TimeProfileEditor_ConfigFilename}
        }}}
      }}}
    }
  }
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_Requests := {
      ackRequested := omit,
      xTDP_Request_list := {{
        requestId := f_EPTF_TPE_nextRequestId(),
        action_ := { {settooltip:= {
        widget := {
          widgetId := "exit_ttcn_button",
          widgetType := string
        },
        argument_list := { "Orders the TTCN side to exit. You will have to close the Editor GUI manually."}
        }}}
      }}
    }}
  }
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  f_EPTF_TPE_update_config();
  f_EPTF_TPE_update_chart();
}

private function f_EPTF_TPE_update_time_sequences_properties_tree_on_gui() runs on MAIN_CT {
  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_RemoveRequests := {
      {{
        requestId := f_EPTF_TPE_nextRequestId(),
        widgetId := timeSequencesPropertiesTree.id
      }}
    }}
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_AddRequests := {
      {{
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "time_sequences_properties_tree_hbox",
        widgets := {
          tree := timeSequencesPropertiesTree
        }
      }}
    }}
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

}

private function f_EPTF_TPE_update_profile_properties_tree_on_gui() runs on MAIN_CT {
  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_RemoveRequests := {
      {{
        requestId := f_EPTF_TPE_nextRequestId(),
        widgetId := profilePropertiesTree.id
      }}
    }}
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  xtdp_message:= {
    transactionID := omit,
    choice := {
    xTDP_AddRequests := {
      {{
        requestId := f_EPTF_TPE_nextRequestId(),
        parentWidgetId := "profile_properties_tree_hbox",
        widgets := {
          tree := profilePropertiesTree
        }
      }}
    }}
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

}

private function f_EPTF_TPE_init_time_sequences_properties_tree(in integer rows) runs on MAIN_CT {
  timeSequencesPropertiesTree := valueof(ts_xtdp_tree("time_sequences_properties_tree", 1.0, true, 0.0,
  { treecolgroups := { treecolgroup_list := {
    {treecol := valueof(ts_xtdp_treecol("time_sequences_properties_tree_col_row", 1.0, false, "Row", integerField))},
    {treecol := valueof(ts_xtdp_treecol("time_sequences_properties_tree_col_start_time", 3.0, true, "Start time", floatField))},
    {treecol := valueof(ts_xtdp_treecol("time_sequences_properties_tree_col_target_value", 3.0, true, "Target value", floatField))}
  }}},
  { treeitemgroups := { treeitemgroup_list := {}}}
  ));

  timeSequencesPropertiesTree.treechildren.treeitemgroups.treeitemgroup_list[0] := { treeitem := { treerowgroups := { treerowgroup_list:= {} } } };
  for(var integer i := 0; i < rows; i := i + 1) {
    timeSequencesPropertiesTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[sizeof(timeSequencesPropertiesTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)] :=
    { treerow := { treecellgroups := { treecellgroup_list := {
      { treecell := valueof(ts_xtdp_treecell(omit, int2str(i + 1), "Row index"))},
      { treecell := valueof(ts_xtdp_treecell(omit, "0.0", "Start time"))},
      { treecell := valueof(ts_xtdp_treecell(omit, "0.0", "Target value"))}
    }}}};
  }
}

private function f_EPTF_TPE_replace_error_widget() runs on MAIN_CT {
  xtdp_message := {
      transactionID := omit,
      choice := {
        xTDP_RemoveRequests:= {
          {{
            requestId := f_EPTF_TPE_nextRequestId(),
            widgetId := "error"
          }}
        }
      }
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  if(lengthof(currentError) > 0) {
    xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_AddRequests := {
        {{
          requestId := f_EPTF_TPE_nextRequestId(),
          parentWidgetId := "error_hbox",
          widgets := {
            textbox := valueof(ts_xtdp_textbox("error", 1.0, omit, true, true, 1.0, "", omit, omit))
          }
        }}
      }}
    };
  } else {
    xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_AddRequests := {
        {{
          requestId := f_EPTF_TPE_nextRequestId(),
          parentWidgetId := "error_hbox",
          widgets := {
            label_ := valueof(ts_xtdp_label("error", 1.0, omit, ""))
          }
        }}
      }}
    };
  }
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
}

private function f_EPTF_TPE_display_error(in charstring msg) runs on MAIN_CT {
  var charstring vl_msg := " -> " & msg;

  if(lengthof(msg) > 0) {
    if(lengthof(currentError) == 0) {
      currentError := msg;
      f_EPTF_TPE_replace_error_widget();
    }
  } else {
    vl_msg := "Errors: none";
    if(lengthof(currentError) > 0) {
      currentError := msg;
      f_EPTF_TPE_replace_error_widget();
    }
  }

  xtdp_message := {
    transactionID := omit,
    choice := {
    xTDP_Requests := {
      ackRequested := omit,
      xTDP_Request_list := {{
        requestId := f_EPTF_TPE_nextRequestId(),
        action_ := { { put := {
        widget := {
          widgetId := "error",
          widgetType := string
        },
        argument_list := {vl_msg}
      }
    }
    }}}}
  }}
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
}

private function float2str_ecs(in float num) return charstring {
  var charstring par := float2str(num);
  var charstring ret := "";
  var charstring zeros := "";
  var boolean weAreAfterComma := false;
  var charstring currentChar := "";

  for(var integer i := 0; i < lengthof(par); i := i + 1) {
    currentChar := substr(par, i, 1);
    if(currentChar != "0") {
      if(lengthof(zeros) > 0) {
        ret := ret & zeros;
        zeros := "";
      }
      ret := ret & currentChar;
      if(not weAreAfterComma and currentChar == ".") {
        weAreAfterComma := true;
      }
    } else {
      if(weAreAfterComma) {
        zeros := zeros & currentChar;
      } else {
        ret := ret & currentChar;
      }
    }
  }

  if(substr(ret, lengthof(ret) - 1, 1) == ".") {
    ret := ret & "0";
  }

  return ret;
}

//////////////////////////////////////////////////////////////////
//
// GUI modification handling functions
//
//////////////////////////////////////////////////////////////////

private function f_EPTF_TPE_handle_add_time_sequence(in charstring newTimeSequenceName) runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  if(lengthof(newTimeSequenceName) == 0) {
    v_newTimeSequenceNameRequestId := f_EPTF_TPE_nextRequestId();

    xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_Requests := {
        ackRequested := true,
        xTDP_Request_list := {{
          requestId := v_newTimeSequenceNameRequestId,
          action_ := { { get := {
          widget := {
            widgetId := "new_sequence_textbox",
            widgetType := string
          }
        }
      }
      }}}}
    }}
    f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
  } else {
    f_EPTF_TPE_handle_add_time_sequenceIn(newTimeSequenceName);
  }
}

private function f_EPTF_TPE_handle_add_time_sequenceIn(in charstring pl_newTimeSequenceName) runs on MAIN_CT {
  if(lengthof(pl_newTimeSequenceName) > 0) {
    if(f_EPTF_TPE_is_unique_time_sequence_name(pl_newTimeSequenceName)) {
      currentTimeSequenceSelection := pl_newTimeSequenceName;

      timeSequenceList[sizeof(timeSequenceList)] := {
        currentTimeSequenceSelection, { { 0.0, 100.0 } }
      };

      xtdp_message := {
        transactionID := omit,
        choice := {
        xTDP_AddRequests := {
          {{
            requestId := f_EPTF_TPE_nextRequestId(),
            parentWidgetId := c_timeSequenceListboxId,
            widgets := {
              listitem := valueof(ts_xtdp_listitem(currentTimeSequenceSelection & "_id", currentTimeSequenceSelection, true))
            }
          }}
        }
        }
      };
      f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

      xtdp_message := {
        transactionID := omit,
        choice := {
        xTDP_AddRequests := {
          {{
            requestId := f_EPTF_TPE_nextRequestId(),
            parentWidgetId := "time_sequence_menu",
            widgets := {
              menuitem := valueof(ts_xtdp_menuitem(currentTimeSequenceSelection & "_menu_id", currentTimeSequenceSelection, true))
            }
          }}
        }}
      };
      f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

      currentTimeSequenceMenuSelection := currentTimeSequenceSelection;

      f_EPTF_TPE_set_selected_time_sequence(currentTimeSequenceSelection, false);
      f_EPTF_TPE_update_config();
      f_EPTF_TPE_update_chart();
    } else {
      f_EPTF_TPE_display_error("Time sequence " & pl_newTimeSequenceName & " is already added!");
      f_EPTF_TPE_set_selected_time_sequence(pl_newTimeSequenceName, true);
    }
  } else {
    f_EPTF_TPE_display_error("Error: empty time sequence name is not allowed!");
  }
}

private function f_EPTF_TPE_handle_add_profile(in charstring newProfileName) runs on MAIN_CT {
  f_EPTF_TPE_display_error("");

  if(lengthof(newProfileName) == 0) {
    v_newTimeProfileRequestId := f_EPTF_TPE_nextRequestId();

    xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_Requests := {
        ackRequested := true,
        xTDP_Request_list := {{
          requestId := v_newTimeProfileRequestId,
          action_ := { { get := {
          widget := {
            widgetId := "new_profile_textbox",
            widgetType := string
          }
        }
      }
      }}}}
    }}
    f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
  } else {
    f_EPTF_TPE_handle_add_profileIn(newProfileName);
  }
}

private function f_EPTF_TPE_handle_add_profileIn(in charstring pl_newProfileName) runs on MAIN_CT{
  if(lengthof(pl_newProfileName) > 0) {
    if(f_EPTF_TPE_is_unique_profile_name(pl_newProfileName)) {
      currentProfileSelection := pl_newProfileName;

      profileList[sizeof(profileList)] := {
        currentProfileSelection, { { currentTimeSequenceSelection, 0.0, 24.0 * currentTimeUnitMultiplier, 0 } }
      };

      xtdp_message := {
        transactionID := omit,
        choice := {
        xTDP_AddRequests := {
          {{
            requestId := f_EPTF_TPE_nextRequestId(),
            parentWidgetId := c_profileListboxId,
            widgets := {
              listitem := valueof(ts_xtdp_listitem(currentProfileSelection & "_profile_id", currentProfileSelection, true))
            }
          }}
        }
      }};
      f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

      f_EPTF_TPE_set_selected_profile(currentProfileSelection, false);
      f_EPTF_TPE_update_config();
      f_EPTF_TPE_update_chart();
    } else {
      f_EPTF_TPE_display_error("Time profile " & pl_newProfileName & " is already added!");
      f_EPTF_TPE_set_selected_profile(pl_newProfileName, true);
      f_EPTF_TPE_update_chart();
    }
  } else {
    f_EPTF_TPE_display_error("Error: empty profile name is not allowed!");
  }
}

private function f_EPTF_TPE_is_unique_time_sequence_name(in charstring newTimeSequenceName) runs on MAIN_CT return boolean {
  for(var integer i := 0; i < sizeof(timeSequenceList); i := i + 1) {
    if(timeSequenceList[i].name == newTimeSequenceName) {
      return false;
    }
  }

  return true;
}

private function f_EPTF_TPE_is_unique_profile_name(in charstring newProfileName) runs on MAIN_CT return boolean {
  for(var integer i := 0; i < sizeof(profileList); i := i + 1) {
    if(profileList[i].name == newProfileName) {
      return false;
    }
  }

  return true;
}

private function f_EPTF_TPE_get_time_sequence_index(in charstring timeSequenceName) runs on MAIN_CT return integer {
  var integer vl_index := -1;

  if(lengthof(timeSequenceName) == 0) {
    vl_index := -1;
  } else {
    for(var integer i := 0; (i < sizeof(timeSequenceList)) and (vl_index == -1); i := i + 1) {
      if(timeSequenceList[i].name == timeSequenceName) {
        vl_index := i;
      }
    }
  }

  return vl_index;
}

private function f_EPTF_TPE_get_profile_index(in charstring profileName) runs on MAIN_CT return integer {
  var integer vl_index := -1;

  if(lengthof(profileName) == 0) {
    vl_index := -1;
  } else {
    for(var integer i := 0; (i < sizeof(profileList)) and (vl_index == -1); i := i + 1) {
      if(profileList[i].name == profileName) {
        vl_index := i;
      }
    }
  }

  return vl_index;
}

private function f_EPTF_TPE_build_time_sequences_properties_tree(in charstring timeSequenceName) runs on MAIN_CT {
  var integer vl_index := f_EPTF_TPE_get_time_sequence_index(timeSequenceName);

  timeSequencesPropertiesTree.treechildren.treeitemgroups.treeitemgroup_list[0] := { treeitem := { treerowgroups := { treerowgroup_list:= {} } } };
  for(var integer i := 0; i < sizeof(timeSequenceList[vl_index].timeProfileData); i := i + 1) {
    timeSequencesPropertiesTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[i] := { treerow := { treecellgroups := { treecellgroup_list := {
      { treecell := valueof(ts_xtdp_treecell(omit, int2str(i + 1), "Row index"))},
      { treecell := valueof(ts_xtdp_treecell(omit, float2str_ecs(timeSequenceList[vl_index].timeProfileData[i].time / currentTimeUnitMultiplier), "Start time"))},
      { treecell := valueof(ts_xtdp_treecell(omit, float2str_ecs(timeSequenceList[vl_index].timeProfileData[i].targetValue), "Target value"))}
    }}}};
  }
}

private function f_EPTF_TPE_build_profile_properties_tree(in charstring profileName) runs on MAIN_CT {
  var integer vl_index := f_EPTF_TPE_get_profile_index(profileName);

  if(vl_index > -1) {
    profilePropertiesTree.treechildren.treeitemgroups.treeitemgroup_list[0] := { treeitem := { treerowgroups := { treerowgroup_list:= {} } } };
    for(var integer i := 0; i < sizeof(profileList[vl_index].timeProfileList); i := i + 1) {
      profilePropertiesTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[i] := { treerow := { treecellgroups := { treecellgroup_list := {
        { treecell := valueof(ts_xtdp_treecell(omit, int2str(i + 1), "Row index"))},
        { treecell := valueof(ts_xtdp_treecell(omit, profileList[vl_index].timeProfileList[i].timeProfileDescrName, "Time sequence"))},
        { treecell := valueof(ts_xtdp_treecell(omit, float2str_ecs(profileList[vl_index].timeProfileList[i].startTime / currentTimeUnitMultiplier), "Start time"))},
        { treecell := valueof(ts_xtdp_treecell(omit, float2str_ecs(profileList[vl_index].timeProfileList[i].periodOfRepetition / currentTimeUnitMultiplier), "Period of repetition"))},
        { treecell := valueof(ts_xtdp_treecell(omit, int2str(profileList[vl_index].timeProfileList[i].nofRepetition), "Repetition number"))}
      }}}};
    }
  }
}

private function f_EPTF_TPE_set_selected_time_sequence(in charstring newTimeSequenceName, in boolean sendListboxSelect) runs on MAIN_CT {
  if(lengthof(newTimeSequenceName) > 0 and timeSequencesPropertiesTreeDisabled) {
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {"remove_sequence_button", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {unichar2char(timeSequencesPropertiesTree.id), pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {"before_row_numwidget", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {"add_time_sequence_row_button", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {"remove_row_numwidget", pushButton}}}})));
    timeSequencesPropertiesTree.disabled := false;
    timeSequencesPropertiesTreeDisabled := false;
  } else if(lengthof(newTimeSequenceName) == 0 and not timeSequencesPropertiesTreeDisabled) {
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := { "remove_sequence_button", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := { unichar2char(timeSequencesPropertiesTree.id), pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := { "before_row_numwidget", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := { "add_time_sequence_row_button", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := { "remove_row_numwidget", pushButton}}}})));
      timeSequencesPropertiesTree.disabled := true;
      timeSequencesPropertiesTreeDisabled := true;
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := { "remove_row_numwidget", pushButton}}}})));
    currentTimeSequenceSelection := "???";
  }

  if(lengthof(newTimeSequenceName) > 0) {
    if(sendListboxSelect) {
      f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { put := { widget := {c_timeSequenceListboxId, pushButton}, argument_list := {newTimeSequenceName}}}})));
    }
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { put := { widget := {"time_sequences_properties_label", pushButton }, argument_list := {newTimeSequenceName & "'s properties:"}}}})));

    f_EPTF_TPE_build_time_sequences_properties_tree(newTimeSequenceName);
    f_EPTF_TPE_update_time_sequences_properties_tree_on_gui();
    //update the remove row button if needed
    f_EPTF_TPE_handle_remove_row_numwidget_change(int2str(currentRemoveRow));
  }
}

private function f_EPTF_TPE_set_selected_profile(in charstring newProfileName, in boolean sendListboxSelect) runs on MAIN_CT {
  if(lengthof(newProfileName) > 0 and profilePropertiesTreeDisabled) {
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {"remove_profile_button", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {unichar2char(profilePropertiesTree.id), pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {"before_profile_row_numwidget", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {"add_profile_row_button", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {"remove_profile_row_numwidget", pushButton}}}})));
    profilePropertiesTree.disabled := false;
    profilePropertiesTreeDisabled := false;
  } else if(lengthof(newProfileName) == 0 and not profilePropertiesTreeDisabled) {
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := {"remove_profile_button", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := {unichar2char(profilePropertiesTree.id), pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := {"before_profile_row_numwidget", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := {"add_profile_row_button", pushButton}}}})));
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := {"remove_profile_row_numwidget", pushButton}}}})));

    profilePropertiesTree.disabled := true;
    profilePropertiesTreeDisabled := true;
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { put := { widget := {"profile_properties_label", pushButton }, argument_list := {"Time profile properties (disabled)"}}}})));
  }

  if(lengthof(newProfileName) > 0) {
    if(sendListboxSelect) {
      f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { put := { widget := {c_profileListboxId, pushButton }, argument_list := {newProfileName}}}})));
    }
    f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { put := { widget := {"profile_properties_label", pushButton}, argument_list := { newProfileName & "'s properties:" }}}})));

    f_EPTF_TPE_build_profile_properties_tree(newProfileName);
    f_EPTF_TPE_update_profile_properties_tree_on_gui();
    //update the remove row button if needed
    f_EPTF_TPE_handle_remove_profile_row_numwidget_change(int2str(currentRemoveProfileRow));
  }
  f_EPTF_TPE_update_chart();
}

private function f_EPTF_TPE_handle_remove_time_sequence() runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  var integer vl_currentIndex := -1;
  var EPTF_ExecCtrl_TimeProfileDescrList newTimeSequenceList := {};

  if(lengthof(currentTimeSequenceSelection) > 0) {
    for(var integer i := 0; (i < sizeof(timeSequenceList)) and (vl_currentIndex == -1); i := i + 1) {
      if(timeSequenceList[i].name == currentTimeSequenceSelection) {
        vl_currentIndex := i;
      }
    }

    xtdp_message := {
      transactionID := omit,
      choice := {
        xTDP_RemoveRequests:= {
        {{
          requestId := f_EPTF_TPE_nextRequestId(),
          widgetId := currentTimeSequenceSelection & "_id"
        }}
      }
    }}
    f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

    xtdp_message := {
            transactionID := omit,
      choice := {
        xTDP_RemoveRequests:= {
        {{
          requestId := f_EPTF_TPE_nextRequestId(),
          widgetId := currentTimeSequenceSelection & "_menu_id"
        }}
      }
    }}
    f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

    if(vl_currentIndex < (sizeof(timeSequenceList) - 1)) {
      currentTimeSequenceSelection := timeSequenceList[vl_currentIndex + 1].name;
    } else if(vl_currentIndex > 0) {
      currentTimeSequenceSelection := timeSequenceList[vl_currentIndex - 1].name;
    } else {
      currentTimeSequenceSelection := "";
    }

    if(sizeof(timeSequenceList) > 0) {
      currentTimeSequenceMenuSelection := timeSequenceList[0].name;
    } else {
      currentTimeSequenceMenuSelection := "";
    }

    for(var integer i := 0; (i < sizeof(timeSequenceList)); i := i + 1) {
      if(i != vl_currentIndex) {
        newTimeSequenceList[sizeof(newTimeSequenceList)] := timeSequenceList[i];
      }
    }
    timeSequenceList := newTimeSequenceList;

    f_EPTF_TPE_set_selected_time_sequence(currentTimeSequenceSelection, true);
    f_EPTF_TPE_update_config();
    f_EPTF_TPE_update_chart();
  } else {
    f_EPTF_TPE_display_error("No time sequence is selected!");
  }
}

private function f_EPTF_TPE_handle_remove_profile() runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  var integer vl_currentIndex := -1;
  var EPTF_ExecCtrl_TimeProfileList newProfileList := {};

  if(lengthof(currentProfileSelection) > 0) {
    for(var integer i := 0; (i < sizeof(profileList)) and (vl_currentIndex == -1); i := i + 1) {
      if(profileList[i].name == currentProfileSelection) {
        vl_currentIndex := i;
      }
    }

    xtdp_message := {
      transactionID := omit,
      choice := {
        xTDP_RemoveRequests:= {
        {{
          requestId := f_EPTF_TPE_nextRequestId(),
          widgetId := currentProfileSelection & "_profile_id"
        }}
      }}
    }
    f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

    if(vl_currentIndex < (sizeof(profileList) - 1)) {
      currentProfileSelection := profileList[vl_currentIndex + 1].name;
    } else if(vl_currentIndex > 0) {
      currentProfileSelection := profileList[vl_currentIndex - 1].name;
    } else {
      currentProfileSelection := "";
    }

    for(var integer i := 0; (i < sizeof(profileList)); i := i + 1) {
      if(i != vl_currentIndex) {
        newProfileList[sizeof(newProfileList)] := profileList[i];
      }
    }
    profileList := newProfileList;

    f_EPTF_TPE_set_selected_profile(currentProfileSelection, true);
    f_EPTF_TPE_update_config();
  } else {
    f_EPTF_TPE_display_error("No time profile is selected!");
  }
}

private function f_EPTF_TPE_handle_time_sequence_listbox_change(in charstring newSelection) runs on MAIN_CT {
  if(currentTimeSequenceSelection != newSelection) {
    f_EPTF_TPE_display_error("");
  }
  currentTimeSequenceSelection := newSelection;
  f_EPTF_TPE_set_selected_time_sequence(currentTimeSequenceSelection, false);
}

private function f_EPTF_TPE_handle_profile_listbox_change(in charstring newSelection) runs on MAIN_CT {
  if(currentProfileSelection != newSelection) {
    f_EPTF_TPE_display_error("");
  }
  currentProfileSelection := newSelection;
  f_EPTF_TPE_set_selected_profile(currentProfileSelection, false);
}

private function f_EPTF_TPE_handle_add_time_sequence_row() runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  var integer vl_timeSequenceIndex := f_EPTF_TPE_get_time_sequence_index(currentTimeSequenceSelection);

  if(vl_timeSequenceIndex > -1) {
    var float newTime := 0.0;

    if(currentBeforeRow > sizeof(timeSequenceList[vl_timeSequenceIndex].timeProfileData)) {
      var integer vl_size := sizeof(timeSequenceList[vl_timeSequenceIndex].timeProfileData);
      if(vl_size > 1) {
        newTime := (2.0 * timeSequenceList[vl_timeSequenceIndex].timeProfileData[vl_size - 1].time) -
            timeSequenceList[vl_timeSequenceIndex].timeProfileData[vl_size - 2].time;
      } else if(vl_size == 1) {
        newTime := 2.0 * timeSequenceList[vl_timeSequenceIndex].timeProfileData[vl_size - 1].time;
      }
      // just append a new line
      timeSequenceList[vl_timeSequenceIndex].timeProfileData[vl_size] := { newTime, 100.0 };
    } else {
      // insert a line
      for(var integer i := sizeof(timeSequenceList[vl_timeSequenceIndex].timeProfileData); i > currentBeforeRow - 1; i := i - 1) {
        timeSequenceList[vl_timeSequenceIndex].timeProfileData[i] := timeSequenceList[vl_timeSequenceIndex].timeProfileData[i - 1];
      }

      if(currentBeforeRow - 1 > 0) {
        newTime := (timeSequenceList[vl_timeSequenceIndex].timeProfileData[currentBeforeRow - 2].time +
            timeSequenceList[vl_timeSequenceIndex].timeProfileData[currentBeforeRow].time) / 2.0;
      }

      timeSequenceList[vl_timeSequenceIndex].timeProfileData[currentBeforeRow - 1] := { newTime, 100.0 };
    }

    f_EPTF_TPE_set_selected_time_sequence(currentTimeSequenceSelection, false);
    f_EPTF_TPE_update_config();
    f_EPTF_TPE_update_chart();
    //update the remove row button if needed
    f_EPTF_TPE_handle_remove_row_numwidget_change(int2str(currentRemoveRow));
  }
}

private function f_EPTF_TPE_handle_add_profile_row() runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  var integer vl_profileIndex := f_EPTF_TPE_get_profile_index(currentProfileSelection);

  if(vl_profileIndex > -1) {
    var float newTime := 0.0;

    if(currentBeforeProfileRow > sizeof(profileList[vl_profileIndex].timeProfileList)) {
      var integer vl_size := sizeof(profileList[vl_profileIndex].timeProfileList);
      if(vl_size > 1) {
        newTime := (2.0 * profileList[vl_profileIndex].timeProfileList[vl_size - 1].startTime) -
            profileList[vl_profileIndex].timeProfileList[vl_size - 2].startTime;
      } else if(vl_size == 1) {
        if(profileList[vl_profileIndex].timeProfileList[vl_size - 1].startTime == 0.0) {
          newTime := 24.0 * currentTimeUnitMultiplier;
        } else {
          newTime := 2.0 * profileList[vl_profileIndex].timeProfileList[vl_size - 1].startTime;
        }
      }
      // just append a new line
      profileList[vl_profileIndex].timeProfileList[sizeof(profileList[vl_profileIndex].timeProfileList)] :=
          { currentTimeSequenceMenuSelection, newTime, 24.0 * currentTimeUnitMultiplier, 0 };
    } else {
      // insert a line
      for(var integer i := sizeof(profileList[vl_profileIndex].timeProfileList); i > currentBeforeProfileRow - 1; i := i - 1) {
        profileList[vl_profileIndex].timeProfileList[i] := profileList[vl_profileIndex].timeProfileList[i - 1];
      }

      if(currentBeforeProfileRow - 1 > 0) {
        newTime := (profileList[vl_profileIndex].timeProfileList[currentBeforeProfileRow - 2].startTime +
            profileList[vl_profileIndex].timeProfileList[currentBeforeProfileRow].startTime) / 2.0;
      }

      profileList[vl_profileIndex].timeProfileList[currentBeforeProfileRow - 1] :=
          { currentTimeSequenceMenuSelection, newTime, 24.0 * currentTimeUnitMultiplier, 0 };
    }

    f_EPTF_TPE_set_selected_profile(currentProfileSelection, false);
    f_EPTF_TPE_update_config();
    f_EPTF_TPE_update_chart();
    //update the remove row button if needed
    f_EPTF_TPE_handle_remove_profile_row_numwidget_change(int2str(currentRemoveProfileRow));
  }
}

private function f_EPTF_TPE_handle_remove_time_sequence_row() runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  var integer vl_timeSequenceIndex := f_EPTF_TPE_get_time_sequence_index(currentTimeSequenceSelection);

  if(vl_timeSequenceIndex > -1) {
    if(currentRemoveRow < sizeof(timeSequenceList[vl_timeSequenceIndex].timeProfileData) + 1) {
      var EPTF_ExecCtrl_TimeProfileItemList timeSequenceProperties := timeSequenceList[vl_timeSequenceIndex].timeProfileData;
      timeSequenceList[vl_timeSequenceIndex].timeProfileData := {};

      for(var integer i := 0; i < sizeof(timeSequenceProperties); i := i + 1) {
        if(i + 1 != currentRemoveRow) {
          timeSequenceList[vl_timeSequenceIndex].timeProfileData[sizeof(timeSequenceList[vl_timeSequenceIndex].timeProfileData)] :=
              timeSequenceProperties[i];
        }
      }
      f_EPTF_TPE_update_config();
      f_EPTF_TPE_update_chart();

      f_EPTF_TPE_set_selected_time_sequence(currentTimeSequenceSelection, false);
      //update the remove row button if needed
      f_EPTF_TPE_handle_remove_row_numwidget_change(int2str(currentRemoveRow));
    } else {
      f_EPTF_TPE_display_error("No such row in the properties tree, accepted values: 1.." & int2str(sizeof(timeSequenceList[vl_timeSequenceIndex].timeProfileData)));
    }
  }
}

private function f_EPTF_TPE_handle_remove_profile_row() runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  var integer vl_profileIndex := f_EPTF_TPE_get_profile_index(currentProfileSelection);

  if(vl_profileIndex > -1) {
    if(currentRemoveProfileRow < sizeof(profileList[vl_profileIndex].timeProfileList) + 1) {
      var EPTF_ExecCtrl_TimeProfileDataList profileProperties := profileList[vl_profileIndex].timeProfileList;
      profileList[vl_profileIndex].timeProfileList := {};

      for(var integer i := 0; i < sizeof(profileProperties); i := i + 1) {
        if(i + 1 != currentRemoveProfileRow) {
          profileList[vl_profileIndex].timeProfileList[sizeof(profileList[vl_profileIndex].timeProfileList)] :=
              profileProperties[i];
        }
      }
      f_EPTF_TPE_update_config();
      f_EPTF_TPE_update_chart();

      f_EPTF_TPE_set_selected_profile(currentProfileSelection, false);
      //update the remove row button if needed
      f_EPTF_TPE_handle_remove_profile_row_numwidget_change(int2str(currentRemoveProfileRow));
    } else {
      f_EPTF_TPE_display_error("No such row in the properties tree, accepted values: 1.." & int2str(sizeof(profileList[vl_profileIndex].timeProfileList)));
    }
  }
}

private function f_EPTF_TPE_handle_tree_change(in charstring widgetId, in charstring arg) runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  var charstring treeRowColRegexp := "([\\w/\\-_]+).(\\d+).(\\d+)";

  var charstring vl_treeId := regexp(widgetId, treeRowColRegexp, 0);
  var charstring vl_row := regexp(widgetId, treeRowColRegexp, 1);
  var charstring vl_col := regexp(widgetId, treeRowColRegexp, 2);

  if(lengthof(vl_treeId) > 0) {
    if(vl_treeId == timeSequencesPropertiesTree.id) {
      f_EPTF_TPE_handle_time_sequence_properties_tree_change(str2int(vl_row), str2int(vl_col), arg);
    } else if(vl_treeId == profilePropertiesTree.id) {
      f_EPTF_TPE_handle_profile_properties_tree_change(str2int(vl_row), str2int(vl_col), arg);
    } else {
      f_EPTF_TPE_display_error("Error: unhandled change of tree: " & vl_treeId & ", argument: " & arg);
    }
  } else {
    f_EPTF_TPE_display_error("Error: unhandled change of widget: " & widgetId & ", argument: " & arg);
  }
}

private function f_EPTF_TPE_handle_time_sequence_properties_tree_change(in integer row, in integer col, in charstring arg) runs on MAIN_CT {
  var integer vl_timeSequenceIndex := f_EPTF_TPE_get_time_sequence_index(currentTimeSequenceSelection);

  if(vl_timeSequenceIndex > -1) {
    if(col == 1) {
      timeSequenceList[vl_timeSequenceIndex].timeProfileData[row].time := str2float(arg) * currentTimeUnitMultiplier;
    } else if(col == 2) {
      timeSequenceList[vl_timeSequenceIndex].timeProfileData[row].targetValue := str2float(arg);
    } else {
      f_EPTF_TPE_display_error("Error: unhandled column change in time sequences properties tree.");
    }

    // bubble sort ascending based on the start time
    var boolean vl_rowMoved := false;
    if(col == 1) {
      var EPTF_ExecCtrl_TimeProfileItemList vl_newTimeProfileData := timeSequenceList[vl_timeSequenceIndex].timeProfileData;
      var EPTF_ExecCtrl_TimeProfileItem vl_profileItem;

      for(var integer i := 0; i < sizeof(vl_newTimeProfileData); i := i + 1) {
        for(var integer j := i; j < sizeof(vl_newTimeProfileData) - 1; j := j + 1) {
          if(vl_newTimeProfileData[j].time > vl_newTimeProfileData[j + 1].time) {
            vl_profileItem := vl_newTimeProfileData[j];
            vl_newTimeProfileData[j] := vl_newTimeProfileData[j + 1];
            vl_newTimeProfileData[j + 1] := vl_profileItem;
            vl_rowMoved := true;
            f_EPTF_TPE_display_error("Row " & int2str(j + 1) & " moved to " & int2str(j));
          }
        }
      }

      if(vl_rowMoved) {
        timeSequenceList[vl_timeSequenceIndex].timeProfileData := vl_newTimeProfileData;
        f_EPTF_TPE_build_time_sequences_properties_tree(currentTimeSequenceSelection);
        f_EPTF_TPE_update_time_sequences_properties_tree_on_gui();
      }
    }

    if(col == 1 or col == 2) {
      f_EPTF_TPE_update_config();
      f_EPTF_TPE_update_chart();
    }
  }
}

private function f_EPTF_TPE_handle_profile_properties_tree_change(in integer row, in integer col, in charstring arg) runs on MAIN_CT {
  var integer vl_profileIndex := f_EPTF_TPE_get_profile_index(currentProfileSelection);

  if(vl_profileIndex > -1) {
    if(col == 1) {
      profileList[vl_profileIndex].timeProfileList[row].timeProfileDescrName := arg;
    } else if(col == 2) {
      profileList[vl_profileIndex].timeProfileList[row].startTime := str2float(arg) * currentTimeUnitMultiplier;
    } else if(col == 3) {
      profileList[vl_profileIndex].timeProfileList[row].periodOfRepetition := str2float(arg) * currentTimeUnitMultiplier;
    } else if(col == 4) {
      profileList[vl_profileIndex].timeProfileList[row].nofRepetition := str2int(arg);
    } else {
      f_EPTF_TPE_display_error("Error: unhandled column change in time profile properties tree.");
    }

    if(col >= 1 and col <= 4) {
      f_EPTF_TPE_update_config();
      f_EPTF_TPE_update_chart();
    }
  }
}

private function f_EPTF_TPE_handle_remove_row_numwidget_change(in charstring newValue) runs on MAIN_CT {
  if(str2int(newValue) != currentRemoveRow) {
    f_EPTF_TPE_display_error("");
  }
  var integer vl_timeSequenceIndex := f_EPTF_TPE_get_time_sequence_index(currentTimeSequenceSelection);

  if(vl_timeSequenceIndex > -1) {
    currentRemoveRow := str2int(newValue);

    if((currentRemoveRow < sizeof(timeSequenceList[vl_timeSequenceIndex].timeProfileData) + 1) and removeRowDisabled) {
      f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {"remove_time_sequence_row_button", pushButton}}}})));
      removeRowDisabled := false;
    } else if((currentRemoveRow >= sizeof(timeSequenceList[vl_timeSequenceIndex].timeProfileData) + 1) and not removeRowDisabled) {
      f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := { "remove_time_sequence_row_button", pushButton}}}})));
      removeRowDisabled := true;
    }
  }
}

private function f_EPTF_TPE_handle_remove_profile_row_numwidget_change(in charstring newValue) runs on MAIN_CT {
  if(str2int(newValue) != currentRemoveProfileRow) {
    f_EPTF_TPE_display_error("");
  }
  var integer vl_profileIndex := f_EPTF_TPE_get_profile_index(currentProfileSelection);

  if(vl_profileIndex > -1) {
    currentRemoveProfileRow := str2int(newValue);
    if((currentRemoveProfileRow < sizeof(profileList[vl_profileIndex].timeProfileList) + 1) and removeProfileRowDisabled) {
      f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { enable := { widget := {"remove_profile_row_button", pushButton}}}})));
      removeProfileRowDisabled := false;
    } else if((currentRemoveProfileRow >= sizeof(profileList[vl_profileIndex].timeProfileList) + 1) and not removeProfileRowDisabled) {
      f_EPTF_TimeProfileEditor_sendXTDPMessage(valueof(ts_xtdp_request(connectionId, f_EPTF_TPE_nextRequestId(), { choice := { disable := { widget := {"remove_profile_row_button", pushButton}}}})));
      removeProfileRowDisabled := true;
    }
  }
}

private function f_EPTF_TPE_handle_time_unit_change(in charstring newValue) runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  var float previuosTimeUnitMultiplier := currentTimeUnitMultiplier;
  currentTimeUnit := newValue;
  if(currentTimeUnit == "hours") {
    currentTimeUnitMultiplier := 3600.0;
  } else if(currentTimeUnit == "minutes") {
    currentTimeUnitMultiplier := 60.0;
  } else if(currentTimeUnit == "seconds") {
    currentTimeUnitMultiplier := 1.0;
  } else {
    f_EPTF_TPE_display_error("Unhandled time unit: " & newValue);
  }

  var float changeFactor := currentTimeUnitMultiplier / previuosTimeUnitMultiplier;

  for(var integer i := 0; i < sizeof(timeSequenceList); i := i + 1) {
    for(var integer j := 0; j < sizeof(timeSequenceList[i].timeProfileData); j := j + 1) {
      timeSequenceList[i].timeProfileData[j].time := timeSequenceList[i].timeProfileData[j].time * changeFactor;
    }
  }

  for(var integer i := 0; i < sizeof(profileList); i := i + 1) {
    for(var integer j := 0; j < sizeof(profileList[i].timeProfileList); j := j + 1) {
      profileList[i].timeProfileList[j].startTime := profileList[i].timeProfileList[j].startTime * changeFactor;
      profileList[i].timeProfileList[j].periodOfRepetition := profileList[i].timeProfileList[j].periodOfRepetition * changeFactor;
    }
  }

  f_EPTF_TPE_update_config();
  f_EPTF_TPE_update_chart();
}

private function f_EPTF_TPE_handle_time_sequence_menu_change(in charstring newValue) runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  currentTimeSequenceMenuSelection := newValue;
}

private function f_EPTF_TPE_init_time_profiles_properties_tree(in integer rows) runs on MAIN_CT {
  profilePropertiesTree := valueof(ts_xtdp_tree("time_profiles_properties_tree", 1.0, true, 0.0,
  { treecolgroups := { treecolgroup_list := {
    {treecol := valueof(ts_xtdp_treecol("time_profiles_properties_tree_col_row", 1.0, false, "Row", integerField))},
    {treecol := valueof(ts_xtdp_treecol("time_profiles_properties_tree_col_sequence", 3.0, true, "Time sequence", string))},
    {treecol := valueof(ts_xtdp_treecol("time_profiles_properties_tree_col_start_time", 3.0, true, "Start time", floatField))},
    {treecol := valueof(ts_xtdp_treecol("time_profiles_properties_tree_col_period_of_repetition", 2.0, true, "Period of repetition", floatField))},
    {treecol := valueof(ts_xtdp_treecol("time_profiles_properties_tree_col_repetition_number", 2.0, true, "Repetition number", integerField))}
  }}},
  { treeitemgroups := { treeitemgroup_list := {}}}
  ));

  profilePropertiesTree.treechildren.treeitemgroups.treeitemgroup_list[0] := { treeitem := { treerowgroups := { treerowgroup_list:= {} } } };
  for(var integer i := 0; i < rows; i := i + 1) {
    profilePropertiesTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list[sizeof(profilePropertiesTree.treechildren.treeitemgroups.treeitemgroup_list[0].treeitem.treerowgroups.treerowgroup_list)] := { treerow := { treecellgroups := { treecellgroup_list := {
      { treecell := valueof(ts_xtdp_treecell(omit, int2str(i + 1), "Row index"))},
      { treecell := valueof(ts_xtdp_treecell(omit, "", "Time sequence"))},
      { treecell := valueof(ts_xtdp_treecell(omit, "0.0", "Start time"))},
      { treecell := valueof(ts_xtdp_treecell(omit, "1", "Period of repetition"))},
      { treecell := valueof(ts_xtdp_treecell(omit, "1", "Repetition number"))}
    }}}};
  }
}

private function f_EPTF_TPE_update_config() runs on MAIN_CT {
  currentConfig := "[MODULE_PARAMETERS]\n\n";
  currentConfig := currentConfig & c_DisplayedTimeUnitTspName & " := \"" & currentTimeUnit & "\";\n\n"
  currentConfig := currentConfig & c_TimeSequencesTspName & " := {\n";

  for(var integer i := 0; i < sizeof(timeSequenceList); i := i + 1) {
    currentConfig := currentConfig & "  {\n";
    currentConfig := currentConfig & "    name := \"" & timeSequenceList[i].name & "\",\n";
    currentConfig := currentConfig & "    timeProfileData := {\n";

    for(var integer j := 0; j < sizeof(timeSequenceList[i].timeProfileData); j := j + 1) {
      currentConfig := currentConfig & "      { time := " & float2str_ecs(timeSequenceList[i].timeProfileData[j].time) &
        ", targetValue := " & float2str_ecs(timeSequenceList[i].timeProfileData[j].targetValue) & " }";

      if(j < sizeof(timeSequenceList[i].timeProfileData) - 1) {
        currentConfig := currentConfig & ",";
      }
      currentConfig := currentConfig & "\n";
    }

    currentConfig := currentConfig & "    }\n";
    currentConfig := currentConfig & "  }";

    if(i < sizeof(timeSequenceList) - 1) {
      currentConfig := currentConfig & ",";
    }
    currentConfig := currentConfig & "\n";
  }
  currentConfig := currentConfig & "}\n\n";
  currentConfig := currentConfig & c_TimeProfilesTspName & " := {\n";

  for(var integer i := 0; i < sizeof(profileList); i := i + 1) {
    currentConfig := currentConfig & "  {\n";
    currentConfig := currentConfig & "    name := \"" & profileList[i].name & "\",\n";
    currentConfig := currentConfig & "    timeProfileList := {\n";

    for(var integer j := 0; j < sizeof(profileList[i].timeProfileList); j := j + 1) {
      currentConfig := currentConfig & "      {\n";
      currentConfig := currentConfig & "        timeProfileDescrName := \"" & profileList[i].timeProfileList[j].timeProfileDescrName & "\",\n"
      currentConfig := currentConfig & "        startTime := " & float2str_ecs(profileList[i].timeProfileList[j].startTime) & ",\n"
      currentConfig := currentConfig & "        periodOfRepetition := " & float2str_ecs(profileList[i].timeProfileList[j].periodOfRepetition) & ",\n"
      currentConfig := currentConfig & "        nofRepetition := " & int2str(profileList[i].timeProfileList[j].nofRepetition) & "\n"
      currentConfig := currentConfig & "      }";

      if(j < sizeof(profileList[i].timeProfileList) - 1) {
        currentConfig := currentConfig & ",";
      }
      currentConfig := currentConfig & "\n";
    }
    currentConfig := currentConfig & "    }\n";
    currentConfig := currentConfig & "  }";

    if(i < sizeof(profileList) - 1) {
      currentConfig := currentConfig & ",";
    }
    currentConfig := currentConfig & "\n";

  }

  currentConfig := currentConfig & "}\n";

  xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_Requests := {
        ackRequested := omit,
        xTDP_Request_list := {{
          requestId := f_EPTF_TPE_nextRequestId(),
          action_ := { { put := {
          widget := {
            widgetId := "config_file_textbox",
            widgetType := string
          },
          argument_list := {currentConfig}
        }
      }
      }}}}
  }}
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
}

private function f_EPTF_TPE_handle_save_putton_pressed() runs on MAIN_CT {
  f_EPTF_TPE_display_error("");
  var integer vl_fd := f_FIO_open_trunc_wronly(tsp_TimeProfileEditor_ConfigFilename);
  if(vl_fd != -1) {
    if(f_FIO_write_text(vl_fd, currentConfig) != lengthof(currentConfig)) {
      f_EPTF_TPE_display_error("Error: could not write to file " & tsp_TimeProfileEditor_ConfigFilename & ".");
    }
    if(f_FIO_close(vl_fd) == -1) {
      f_EPTF_TPE_display_error("Error: could not close file " & tsp_TimeProfileEditor_ConfigFilename & " after writing.");
    }
    f_EPTF_TPE_display_error("Time profile configuration data saved to file: " & tsp_TimeProfileEditor_ConfigFilename);
  } else {
    f_EPTF_TPE_display_error("Error: could not open file " & tsp_TimeProfileEditor_ConfigFilename & " for writing.");
  }
}

private function f_EPTF_TPE_handle_exit_putton_pressed() runs on MAIN_CT {
  f_EPTF_TPE_display_error("Bye!");
  xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_RemoveRequests:= {
      { {
        requestId := f_EPTF_TPE_nextRequestId(),
        widgetId := "save_exit_hbox"
      } } }
      }
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_Bye := ""
      }
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  // wait 0.1 sec before GUI port unmap
  timer t := 0.1; t.start; t.timeout;
  if(connectionId > -1){
    var Result vl_result;
    f_EPTF_Transport_close(IPL4, connectionId, vl_result);
    connectionId := -1;
  }
  f_EPTF_Base_stopAll(none);
}

private function f_EPTF_TPE_update_chart() runs on MAIN_CT {
  xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_RemoveRequests:= {
      {{
        requestId := f_EPTF_TPE_nextRequestId(),
        widgetId := "preview_chart"
      }}}
    }
  };
  f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

  if(lengthof(currentProfileSelection) > 0 and f_EPTF_TPE_get_profile_index(currentProfileSelection) > -1) {
    var TimeProfileUnitList vl_unitList := {};
    var integer vl_profileIndex := f_EPTF_TPE_get_profile_index(currentProfileSelection);

    var Chart chart;

    chart := valueof(ts_xtdp_chart("preview_chart", 1.0, omit, currentProfileSelection & "'s preview chart", false, omit, omit, true, true, omit, omit, omit, { tracegroup_list := {}}));

    xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_AddRequests := {
        {{
          requestId := f_EPTF_TPE_nextRequestId(),
          parentWidgetId := "preview_chart_tab",
          widgets := {
            chart := chart
          }
        }}
      }
    }};
    f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

    var Trace trace;
    var float currentX := -1.0;
    var float currentY := -1.0;
    var integer vl_timeSequenceIndex := 0;
    var float currentSequenceX := 0.0;
    var integer colorIndex := 0;

    for(var integer i := 0; i < sizeof(profileList[vl_profileIndex].timeProfileList); i := i + 1) {
      vl_timeSequenceIndex := f_EPTF_TPE_get_time_sequence_index(profileList[vl_profileIndex].timeProfileList[i].timeProfileDescrName);

      if(vl_timeSequenceIndex > -1 and sizeof(timeSequenceList[vl_timeSequenceIndex].timeProfileData) > 0) {
        trace := valueof(ts_xtdp_trace(
            profileList[vl_profileIndex].timeProfileList[i].timeProfileDescrName & "_trace" & int2str(i) & "_id",
            profileList[vl_profileIndex].timeProfileList[i].timeProfileDescrName,
            omit,
            colors[colorIndex],
            true,
            currentTimeUnit,
            "Target value"));

        xtdp_message := {
          transactionID := omit,
            choice := {
            xTDP_AddRequests := {
            {{
              requestId := f_EPTF_TPE_nextRequestId(),
              parentWidgetId := chart.id,
              widgets := {
                trace := trace
              }
            }}
          }
        }}
        f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);

        for(var integer j := 0; j < profileList[vl_profileIndex].timeProfileList[i].nofRepetition + 1; j := j + 1) {
          currentX := profileList[vl_profileIndex].timeProfileList[i].startTime / currentTimeUnitMultiplier;
          if(j > 0) {
            currentX := currentX + (profileList[vl_profileIndex].timeProfileList[i].periodOfRepetition / currentTimeUnitMultiplier * int2float(j));
          }

          for(var integer k := 0; k < sizeof(timeSequenceList[vl_timeSequenceIndex].timeProfileData); k := k + 1) {
            currentSequenceX := currentX + timeSequenceList[vl_timeSequenceIndex].timeProfileData[k].time / currentTimeUnitMultiplier;
            currentY := timeSequenceList[vl_timeSequenceIndex].timeProfileData[k].targetValue;

            vl_unitList[sizeof(vl_unitList)] := {
              currentSequenceX,
              profileList[vl_profileIndex].timeProfileList[i].timeProfileDescrName & "_trace" & int2str(i) & "_id",
              profileList[vl_profileIndex].timeProfileList[i].timeProfileDescrName,
              currentY
            }
          }
        }

        colorIndex := colorIndex + 1;
        if(colorIndex >= (sizeof(colors) - 1)) {
          colorIndex := 0
        }
      } else if(vl_timeSequenceIndex == -1) {
        f_EPTF_TPE_display_error("Time sequence '" & profileList[vl_profileIndex].timeProfileList[i].timeProfileDescrName & "' used in profile '" & profileList[vl_profileIndex].name & "' could be not found!");
      }
    }

    // sort vl_unitList
    var TimeProfileUnit vl_Unit;
    for(var integer i := 0; i < sizeof(vl_unitList); i := i + 1) {
      for(var integer j := i + 1; j < sizeof(vl_unitList); j := j + 1) {
        if(vl_unitList[j].startTime < vl_unitList[i].startTime) {
          vl_Unit := vl_unitList[i];
          vl_unitList[i] := vl_unitList[j];
          vl_unitList[j] := vl_Unit;
        }
        else if(vl_unitList[j].startTime  == vl_unitList[i].startTime) {
          f_EPTF_TPE_display_error("!!! Error: duplicated time sequence start time at " & float2str(vl_unitList[i].startTime) & " in: " & vl_unitList[i].traceName & " and " & vl_unitList[j].traceName);
        }
      }
    }

    // add the units to the traces
    for(var integer i := 0; i < sizeof(vl_unitList); i := i + 1) {
      if(i > 0) {
        // draw a horizontal line from the previous time unit until the beginning of the current (the step)
        xtdp_message.choice.xTDP_Requests.xTDP_Request_list[sizeof(xtdp_message.choice.xTDP_Requests.xTDP_Request_list)] := {
          requestId := f_EPTF_TPE_nextRequestId(),
          action_ := { { put := {
            widget := {
              widgetId := vl_unitList[i - 1].traceId,
              widgetType := trace
            },
            argument_list := {float2str_ecs(vl_unitList[i].startTime) & "/" & float2str_ecs(vl_unitList[i - 1].targetValue)}
          }}}
        }
        // draw a vertical line to 0.0 to finish the previous unit
        xtdp_message.choice.xTDP_Requests.xTDP_Request_list[sizeof(xtdp_message.choice.xTDP_Requests.xTDP_Request_list)] := {
          requestId := f_EPTF_TPE_nextRequestId(),
          action_ := { { put := {
            widget := {
              widgetId := vl_unitList[i - 1].traceId,
              widgetType := trace
            },
            argument_list := {float2str_ecs(vl_unitList[i].startTime) & "/0.0"}
          }}}
        }

        // draw a vertical line from 0.0 to the current target value
        xtdp_message.choice.xTDP_Requests.xTDP_Request_list[sizeof(xtdp_message.choice.xTDP_Requests.xTDP_Request_list)] := {
          requestId := f_EPTF_TPE_nextRequestId(),
          action_ := { { put := {
            widget := {
              widgetId := vl_unitList[i].traceId,
              widgetType := trace
            },
            argument_list := {float2str_ecs(vl_unitList[i].startTime) & "/0.0"}
          }}}
        }
      } else {
        // draw a vertical line from 0.0 to the current target value
        xtdp_message := {omit, { xTDP_Requests := { omit, {{
          requestId := f_EPTF_TPE_nextRequestId(),
          action_ := { { put := {
            widget := {
              widgetId := vl_unitList[i].traceId,
              widgetType := trace
            },
            argument_list := {float2str_ecs(vl_unitList[i].startTime) & "/0.0"}
          }}}
        }} }}};
      }

      // draw a vertical line to the current target value
      xtdp_message.choice.xTDP_Requests.xTDP_Request_list[sizeof(xtdp_message.choice.xTDP_Requests.xTDP_Request_list)] := {
        requestId := f_EPTF_TPE_nextRequestId(),
        action_ := { { put := {
          widget := {
            widgetId := vl_unitList[i].traceId,
            widgetType := trace
          },
          argument_list := {float2str_ecs(vl_unitList[i].startTime) & "/" & float2str_ecs(vl_unitList[i].targetValue)}
        }}}
      }

      // draw a last horizontal line containing the last Y value
      if(i == sizeof(vl_unitList) - 1) {
        xtdp_message.choice.xTDP_Requests.xTDP_Request_list[sizeof(xtdp_message.choice.xTDP_Requests.xTDP_Request_list)] := {
          requestId := f_EPTF_TPE_nextRequestId(),
          action_ := { { put := {
            widget := {
              widgetId := vl_unitList[i].traceId,
              widgetType := trace
            },
            argument_list := {float2str_ecs(vl_unitList[i].startTime + 6.0 ) & "/" & float2str_ecs(vl_unitList[i].targetValue)}
          }}}
        }
      }
    }

    if(isbound(xtdp_message.choice.xTDP_Requests.xTDP_Request_list) and sizeof(xtdp_message.choice.xTDP_Requests.xTDP_Request_list) > 0) {
      f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
    }
  } else {
    xtdp_message := {
      transactionID := omit,
      choice := {
      xTDP_AddRequests := {
        {{
          requestId := f_EPTF_TPE_nextRequestId(),
          parentWidgetId := "preview_chart_tab",
          widgets := {
            label_ := valueof(ts_xtdp_label("preview_chart", 1.0, omit, "No time profile is selected on the 'Time profiles' tab!"))
          }
        }}
      }
    }};
    f_EPTF_TimeProfileEditor_sendXTDPMessage(xtdp_message);
  }
}


}  // end of module
