diff --git a/src/module_gtf/gtf.engine/engine/README.txt b/src/module_gtf/gtf.engine/engine/README.txt deleted file mode 100755 index 96459bdac3a94ee35b94e09ba4c63e35ebce34cf..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/engine/README.txt +++ /dev/null @@ -1,11 +0,0 @@ -Compilateur - - Le compilateur utilis� est MinGW version 5.1.6 - Il est disponible sur PICPOUL --> Partage --> Logiciel --> MinGW --> mingw-get-inst-20111118.exe - Une fois install�, copier le dossier openssl du dossier MinGW vers <MinGW>/include - - -Compilation - - Pour compiler, il suffit de double-cliquer sur compil.bat - La compilation r�cup�re le num�ro de r�vision SVN l'�crit dans le fichier Changelog.txt, compile l'application puis copie les fichiers dans le dossier gtf.engine diff --git a/src/module_gtf/gtf.engine/engine/compil-linux.bat b/src/module_gtf/gtf.engine/engine/compil-linux.bat deleted file mode 100755 index d395b209f8c493aa2c19890929d1126795d2b74b..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/engine/compil-linux.bat +++ /dev/null @@ -1,21 +0,0 @@ -@ECHO OFF -SET letter=%~d0 -SET currentPath=%~p0 -CALL :ChangeSlashes currentPath -CALL :LoCase letter - -REM Compilation -bash -c "cd /mnt/%letter%%currentPath% && gcc -g engine.c sha1.h sha1.c -o engine -LC:\MingW\lib\ -lregex" -REM copie vers le dossier gtf.engine -COPY "engine" "../gtf.engines/engine" -pause - -GOTO:EOF - -:LoCase -:: Subroutine to convert a variable VALUE to all lower case. -:: The argument for this subroutine is the variable NAME. -FOR %%i IN (":=" "A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i" "J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r" "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z") DO CALL SET "%1=%%%1:%%~i%%" - -:ChangeSlashes -FOR %%i IN ("\=/") DO CALL SET "%1=%%%1:%%~i%%" diff --git a/src/module_gtf/gtf.engine/engine/compil.bat b/src/module_gtf/gtf.engine/engine/compil.bat deleted file mode 100755 index cee98ded472d3fc590dc4fbcee88d2f510ab7b02..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/engine/compil.bat +++ /dev/null @@ -1,34 +0,0 @@ -@Echo OFF -%~d0 -cd %~dp0 -REM Recuperation du numero de version -for /f "delims=" %%i in ('svnversion "../engine"') do Set versionComp=%%i -REM Initialisation de la variable de recuperation de version -set versionComp = 2473:2481M -REM Verification de la structure de num de version renvoye pas SVN -echo %versionComp% | find ":" -REM Si le num de version contient : version complexe sinon version simple -if errorlevel 1 (call :simpleversion) else (call :complexeversion) - - -:simpleversion -REM Recuperation du num de version simple -for /f "delims=" %%i in ('echo %versionComp:~0,4%') do Set version=%%i -goto compil - -:complexeversion -REM Recuperation du num de version simple -for /f "delims=" %%i in ('echo %versionComp:~5,4%') do Set version=%%i -goto compil - -:compil -REM Suppression du fichier Changelog -IF EXIST Changelog.txt DEL Changelog.txt -REM Ecriture du num de version -echo %version% > Changelog.txt -REM Compilation en incluant la librairie psapi -gcc -g engine.c sha1.h sha1.c -o engine.exe -l"psapi" -LC:\MingW\lib\ -lregex -REM copie vers le dossier gtf.engine -COPY "engine.exe" "../gtf.engines/engine.exe" -COPY "Changelog.txt" "../gtf.engines/Changelog.txt" -pause \ No newline at end of file diff --git a/src/module_gtf/gtf.engine/engine/engine.c b/src/module_gtf/gtf.engine/engine/engine.c deleted file mode 100755 index 5dd2e7c7963e877d78caef15a11aef26a1a2dc0b..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/engine/engine.c +++ /dev/null @@ -1,545 +0,0 @@ -#ifdef __unix__ - #define OS_Windows 0 - #define MAX_PATH 4096 - #include <locale.h> - typedef unsigned long DWORD; - const char * separator = "/"; -#else - #define OS_Windows 1 - #include <windows.h> - #include <Winbase.h> - #include <tchar.h> - #include <psapi.h> - const char * separator = "\\"; -#endif -#include <stdio.h> -#include <ctype.h> -#include <string.h> -#include <stdlib.h> -#include <sys/types.h> -#include <unistd.h> -#include "sha1.h" -#include <time.h> -#include "regex.h" -#include "engine.h" - -#define TAILLE_MAX 1000 - -int num_pid = 0, debug = 0; -char *current_directory; -// const char * separator = "/"; - -int main(int argc, char *argv[]){ - int valid = 0;; - unsigned int i; - if (argc > 1){ - for (i = 0; i < strlen(argv[1]); ++i){ - if (!isdigit(argv[1][i])) - { - valid = 1; - break; - } - } - if (valid ==0){ - if (argc > 2){ - if (strcmp(argv[2],"d") == 0){ - debug = 1; - } - } - }else{ - printf("Syntaxe : engine.exe [moteur_number] [d]\n"); - printf("d : Debug mode\n"); - - exit(1); - } - }else{ - printf("Syntaxe : engine.exe [motor_number] [d]\n"); - printf("d : Debug mode\n"); - - exit(1); - } - //declaration des variables - int exist_pid_file = 0; - - // Nom du fichier pid - char* pid_file = malloc(strlen("pid_.txt") + strlen(argv[1]) + 1); - sprintf(pid_file, "pid_%s.txt", argv[1]); - int result = 0; - printf("1\n"); - //R�cup�ration du r�pertoire courant du fichier courant - #ifdef __unix__ - char *cwd_buffer = malloc(sizeof(char) * MAX_PATH); - current_directory = getcwd(cwd_buffer, MAX_PATH); - #else - char current_path[MAX_PATH]; - GetModuleFileName( NULL, current_path, MAX_PATH ); - current_directory = RemplacerFragment((char *)current_path, "\\engine.exe", ""); - #endif - writeToDebugLog("R�pertoire courant : ", current_directory); - //remplacement du nom de l exe par le nom du fichier pid - char* pid_file_path = malloc(strlen(current_directory) + strlen("/") + strlen(pid_file) + 1); - sprintf(pid_file_path, "%s%s%s", current_directory, separator, pid_file); - - writeToDebugLog("fichier PID : ", pid_file_path); - //test de l'existence des fichiers - exist_pid_file = findPidFile(pid_file_path); - - char tmp[5]; - sprintf(tmp, "%i", exist_pid_file); - writeToDebugLog("existence Fichier pid (0, n existe pas) : ", tmp); - char *motor_number = argv[1]; - //si fichier inexistant - if (exist_pid_file == 0){ - writeToDebugLog("Execution", " robot non existence fichier pid."); - result = execRobot(pid_file_path, motor_number); - } else { - //si fichier vide - if (num_pid == 0){ - writeToDebugLog("Execution", " robot fichier pid vide."); - result = execRobot(pid_file_path, motor_number); - } else { - sprintf(tmp, "%i", num_pid); - writeToDebugLog("num PID : ", tmp); - int process = 0; - process = verifyProcess(num_pid); - if (process == 0){ - writeToDebugLog("Execution", " robot processus fini."); - result = execRobot(pid_file_path, motor_number); - } - } - } - return result; -} - -//fonction de recherche d'un numero de pid -int findPidFile(char *pid_file_path){ - //declaration des variables - char line[512]; - int nb_lines = 0; - FILE *fic; - //ouverture du fichier - fic = fopen(pid_file_path, "r"); // ouvrir en lecture - - //si le programme n a pas trouve de fichier - if(fic == NULL){ - return 0; - } - //si le programme a trouvee un fichier - else{ - //lecture du fichier - while(fgets(line, 512, fic) != NULL){ - //recuperation du pid - num_pid = atoi(line); - //passage a la ligne suivante - nb_lines++; - } - //fermeture du fichier - fclose(fic); - return 1; - } -} - -//Fonction de remplacement de chaine de caractere par une autre : n'existe pas par defaut en c. -char *RemplacerFragment(char *source, char *vieux, char *nouveau){ - //Recuperation des parametres - char *original = source; - char temp[256]; - int ancienne_long = strlen (vieux); - int i, j, k, place = -1; - - //recherche de la position de l'occurence tant que la fonction n a pas trouvee - for (i = 0; source[i] && (place == -1); ++i){ - for (j = i, k = 0; source[j] == vieux[k]; j++, k++){ - if (!vieux[k+1]){ - place = i; - } - } - } - //remplacement de lancienne chaine par la nouvelle - if (place != -1){ - //recuperation de la chaine jusqu a l'emplacement de la chaine a remplacer - for (j=0; j < place; j++){ - temp[j] = source[j]; - } - //remplacement de l ancienne valeur par la nouvelle - for (i=0; nouveau[i]; i++, j++){ - temp[j] = nouveau[i]; - } - //reucperation de la fin de la chaine de caracteres - for (k = place + ancienne_long; source[k]; k++, j++){ - temp[j] = source[k]; - } - temp[j] = 0; - for (i=0; (source[i] = temp[i]); i++){ - } - } - return original; -} - -int execRobot(char *pid_file_path, char *motor_number){ - writeToDebugLog("path pid : ", pid_file_path); - getWritePid(pid_file_path); - char var_env_engine[MAX_PATH]; - char var_env_php[MAX_PATH]; - - strcpy(var_env_engine, "GTF_ENGINE_HOME="); - strcat(var_env_engine, current_directory); - - strcpy(var_env_php, "PHP_HOME="); - strcat(var_env_php, current_directory); - strcat(var_env_php, "/php"); - - writeToDebugLog("", var_env_php); - writeToDebugLog("", var_env_engine); - putenv(var_env_engine); - putenv(var_env_php); - putenv("PYTHONPATH="); - // Changement de la locale pour traiter les nombres - setlocale(LC_NUMERIC, "en_US.UTF8"); - - char *argument = verifyLicense(motor_number); - writeToDebugLog("value verification : ", argument); - char function_robot[512]; - if (OS_Windows == 0) { - sprintf(function_robot, "\"%s%sphp%sbin%sphp\" \"%s%sengine.php\" %s %s", current_directory, separator, separator, separator, current_directory, separator, motor_number, argument); - } else { - sprintf(function_robot, "\"\"%s%sphp%sphp.exe\" \"%s%sengine.php\" %s %s\"", current_directory, separator, separator, current_directory, separator, motor_number, argument); - } - writeToDebugLog("function : ", function_robot); - system(function_robot); - - remove(pid_file_path); - return 0; -} - -void getWritePid(char *pid_file_path){ - FILE *fic; - //ouverture du fichier - fic = fopen(pid_file_path, "w"); //"w" : mode texte en �criture (cr�ation) - //recuperation du pid - pid_t pid = getpid(); - fprintf(fic, "%i", pid); - fclose(fic); -} - - -int verifyProcess(int num_pid){ - int running = 0; - int i = 0; - int j = 0; - char *szProcessName; - char *szProcessNameWithSpaces; - #ifdef __unix__ - if (getpgid(num_pid) >= 0){ - FILE *fic; - char* process_path = malloc(strlen("/proc//comm") + 6); - sprintf(process_path, "/proc/%i/comm", num_pid); - //ouverture du fichier - fic = fopen(process_path, "r"); // ouvrir en lecture - - //si le programme n a pas trouve de fichier - if(fic != NULL){ - //lecture du fichier - char line[512]; - int nb_lines = 0; - while(fgets(line, 512, fic) != NULL){ - //recuperation du nom du pid - szProcessNameWithSpaces = line; - //passage a la ligne suivante - nb_lines++; - } - //trim - while(i < strlen(szProcessNameWithSpaces)){ - if (&szProcessNameWithSpaces[i] != " " || &szProcessNameWithSpaces[i] != "\n"){ - i++; - } else { - szProcessName[j] = szProcessNameWithSpaces[i]; - i++; - j++; - } - } - //fermeture du fichier - fclose(fic); - writeToDebugLog("Pid name: ", szProcessName); - writeToDebugLog("Exe file : engine", ""); - if (strcmp(szProcessName, "engine") == 0){ - running = 1; - } - } - } - #elif defined(_WIN32) - HANDLE hProcess=OpenProcess(PROCESS_VM_READ|PROCESS_QUERY_INFORMATION,FALSE, num_pid); - if(hProcess){ - HMODULE hMod; - DWORD unused; - if(EnumProcessModules(hProcess, &hMod, sizeof(hMod), &unused)){ - GetModuleBaseNameA(hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(char)); - writeToDebugLog("Pid name: ", szProcessName); - writeToDebugLog("Exe file : engine.exe", ""); - if (strcmp(szProcessName, "engine.exe") == 0){ - running = 1; - } - } - } - #endif - return running; -} - -char *verifyLicense(char *motor_number){ - char *returnValue = ""; - char expireDate[TAILLE_MAX] = ""; - char motorNumber[TAILLE_MAX] = ""; - - char* licence_path = malloc(strlen(current_directory) + strlen("licenseslicense.txt") + 3); - sprintf(licence_path, "%s%slicenses%slicense.txt", current_directory, separator, separator); - - FILE* fichier = NULL; - writeToDebugLog("Fichier License : ",licence_path); - fichier = fopen(licence_path, "r"); - if (fichier != NULL){ - char chaine[TAILLE_MAX] = ""; - char testChaine[TAILLE_MAX] = ""; - // char *chaine = ""; - char *key; - char *temp; - char toKey[TAILLE_MAX] = ""; - int z = 0; - while (fgets(chaine, TAILLE_MAX, fichier) != NULL){ // On lit le fichier tant qu'on ne re�oit pas d'erreur (NULL) - if (chaine[0]!= '#'){ - RemplacerFragment(chaine, "\r", ""); - copie(chaine, testChaine); - if (strncmp( verifyRegexp(testChaine, "^Expiry date: (Permanent|[0-9]{6,8})"), "error", 1000) != 0){ - RemplacerFragment(testChaine, "Expiry date: ", ""); - copie(testChaine, expireDate); - } - if (strncmp( verifyRegexp(testChaine, "^Engines: ([0-9]+)"), "error", 1000) != 0){ - RemplacerFragment(testChaine, "Engines: ", ""); - copie(testChaine, motorNumber); - } - if (chaine[0]!= 'K'){ - if (z == 0){ - z = z+1; - }else{ - strcat(toKey, "\n"); - } - temp = RemplacerFragment(chaine, "\n", ""); - strcat(toKey, temp); - }else{ - if (chaine[1]!= 'e'){ - if (z == 0){ - z = z+1; - }else{ - strcat(toKey, "\n"); - } - temp = RemplacerFragment(chaine, "\n", ""); - strcat(toKey, temp); - }else{ - if (chaine[2]!= 'y'){ - if (z == 0){ - z = z+1; - }else{ - strcat(toKey, "\n"); - } - temp = RemplacerFragment(chaine, "\n", ""); - strcat(toKey, temp); - }else{ - key=RemplacerFragment(chaine, "Key: ", ""); - } - } - } - } - } - writeToDebugLog("Expire Date: ",expireDate); - writeToDebugLog("Motor Number: ",motorNumber); - writeToDebugLog("clef: ", key); - writeToDebugLog("Toclef: ", toKey); - SHA1Context sha; - int i; - SHA1Reset(&sha); - for(i = 1; i <= 1000; i++) { - SHA1Input(&sha, toKey, strlen(toKey)); - } - if (!SHA1Result(&sha)){ - writeToErrorLog("Erreur licence : ", "Impossible de hasher la clef"); - returnValue = "E001"; - }else{ - char clefTemp[5][TAILLE_MAX]; - char *clef, *clefTest; - for(i = 0; i < 5; i++){ - sprintf(clefTemp[i], "%X ", sha.Message_Digest[i]); - } - int j=0; - for(j = 0; j < 5; j++){ - clefTest= clefTemp[j]; - if (j == 0){ - clef = clefTest; - }else{ - strcat(clef, clefTest); - } - } - writeToDebugLog("clef calcul�e: ", clef); - int result = strncmp(clef, key, 1000); - if (result == 0){ - writeToDebugLog("Comparaison Clefs: ", "Egales"); - time_t current_time; - current_time = time(NULL); - struct tm *nowtm; - int yy, mm, dd; - yy = makeInt(expireDate + 0, 4) -1900; - mm = makeInt(expireDate + 4, 2)-1; - dd = makeInt(expireDate + 6, 2); - nowtm = localtime(¤t_time); - writeToDebugLog("Comparaison Date Nombre moteur: ",motorNumber); - writeToDebugLog("Comparaison Date num�ro moteur: ",motor_number); - if (strncmp(expireDate, "permanent", 1000) ==0){ - writeToDebugLog("Comparaison Date : ", "OK"); - if (atoi(motor_number) <= atoi(motorNumber)){ - writeToDebugLog("Comparaison Moteur : ", "Ok"); - returnValue = "0"; - }else{ - writeToDebugLog("Comparaison Moteur : ", "Num�ro de moteur trop grand"); - returnValue = "E003"; - } - }else{ - if (yy < nowtm->tm_year){ - writeToDebugLog("Comparaison Date : ", "Ann�e courante sup�rieure"); - writeToErrorLog("Erreur licence : ", "Ann�e courante sup�rieure"); - returnValue = "E002"; - }else{ - if (mm < nowtm->tm_mon){ - writeToDebugLog("Comparaison Date : ", "Mois courant sup�rieur"); - returnValue = "E002"; - }else{ - if (dd < nowtm->tm_mday){ - writeToDebugLog("Comparaison Date : ", "Jour courant sup�rieur"); - returnValue = "E002"; - }else{ - writeToDebugLog("Comparaison Date : ", "OK"); - if (atoi(motor_number) <= atoi(motorNumber)){ - writeToDebugLog("Comparaison Moteur : ", "Ok"); - returnValue = "0"; - }else{ - writeToDebugLog("Comparaison Moteur : ", "Num�ro de moteur trop grand"); - writeToErrorLog("Erreur licence : ", "Num�ro de moteur trop grand"); - returnValue = "E003"; - } - } - } - } - } - - }else{ - returnValue = "E001"; - writeToDebugLog("Comparaison Clefs : ", "Diff�rentes"); - writeToErrorLog("Erreur licence : ", "Clefs diff�rentes"); - } - } - fclose(fichier); - }else{ - // On affiche un message d'erreur si on veut - writeToErrorLog("Erreur licence : ", "Ouverture du fichier impossible"); - returnValue = "E001"; - } - - return returnValue; -} - -void writeToDebugLog(char *titre, char *error){ - if (debug == 1){ - FILE *fic; - //ouverture du fichier - char* debug_file_path = malloc(strlen(current_directory) + strlen("engine.log") + 2); - sprintf(debug_file_path, "%s%sengine.log", current_directory, separator); - fic = fopen(debug_file_path, "a"); //"w" : mode texte en �criture (cr�ation) - char resultat[MAX_PATH]; - strcpy(resultat, titre); - strcat(resultat, error); - strcat(resultat, "\n"); - //recuperation du pid - fprintf(fic, "%s", resultat); - fclose(fic); - } -} - -void writeToErrorLog(char *titre, char *error){ - FILE *fic; - //ouverture du fichier - char* error_file_path = malloc(strlen(current_directory) + strlen("engine_error.log") + 2); - sprintf(error_file_path, "%s%sengine_error.log", current_directory, separator); - fic = fopen(error_file_path, "a"); //"w" : mode texte en �criture (cr�ation) - char resultat[MAX_PATH]; - strcpy(resultat, titre); - strcat(resultat, error); - strcat(resultat, "\n"); - //recuperation du pid - fprintf(fic, "%s", resultat); - fclose(fic); -} - -char *verifyRegexp (char *str_request, char *str_regex){ - char *returnValue = "error"; - int err; - regex_t preg; - err = regcomp (&preg, str_regex, REG_EXTENDED); - if (err == 0){ - int match; - size_t nmatch = 0; - regmatch_t *pmatch = NULL; - nmatch = preg.re_nsub; - pmatch = malloc (sizeof (*pmatch) * nmatch); - if (pmatch){ - match = regexec (&preg, str_request, nmatch, pmatch, 0); - regfree (&preg); - if (match == 0){ - char *site = NULL; - int start = pmatch[0].rm_so; - int end = pmatch[0].rm_eo; - size_t size = end - start; - site = malloc (sizeof (*site) * (size + 1)); - if (site){ - strncpy (site, &str_request[start], size); - site[size] = '\0'; - returnValue = site; - free (site); - } - }else if (match == REG_NOMATCH){ - returnValue = "error"; - }else{ - char *text; - size_t size; - size = regerror (err, &preg, NULL, 0); - text = malloc (sizeof (*text) * size); - if (text){ - regerror (err, &preg, text, size); - returnValue = text; - free (text); - }else{ - returnValue = "error"; - } - } - }else{ - returnValue = "error"; - } - }else{ - returnValue = "error"; - } - - return returnValue; -} - -void copie(char srce[] , char dest[]) { - register int i; /* un indice est necessaire */ - for( i=0 ; (dest[i] = srce[i]) != 0 ; i++) - ; -} - -int makeInt(const char *p, int size){ - const char *endp; - int intval = 0; - endp = p + size; - while (p < endp){ - intval = intval * 10 + *p - '0'; - p++; - } - return intval; -} diff --git a/src/module_gtf/gtf.engine/engine/engine.h b/src/module_gtf/gtf.engine/engine/engine.h deleted file mode 100755 index 88fa8fbd29a4e4588485da5f25c0cdff7e9e086d..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/engine/engine.h +++ /dev/null @@ -1,11 +0,0 @@ -int execRobot(char *pid_file_path, char *motor_number); -void getWritePid(char *pid_file_path); -int verifyProcess(int num_pid); -int findPidFile(char *pid_file_path); -void copie(char srce[] , char dest[]); -void writeToDebugLog(char *titre, char *error); -void writeToErrorLog(char *titre, char *error); -char *RemplacerFragment(char *source, char *vieux, char *nouveau); -char *verifyRegexp(char *str_request, char *str_regex); -char *verifyLicense(char *motor_number); -int makeInt(const char *,int); \ No newline at end of file diff --git a/src/module_gtf/gtf.engine/engine/php.ini b/src/module_gtf/gtf.engine/engine/php.ini deleted file mode 100755 index 982525bc240cc3348dcaae579a6d87cb56112ae5..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/engine/php.ini +++ /dev/null @@ -1,162 +0,0 @@ -[PHP] -engine = On -short_open_tag = Off -asp_tags = Off -precision = 14 -output_buffering = 4096 -zlib.output_compression = Off -implicit_flush = Off -unserialize_callback_func = -serialize_precision = 17 -disable_functions = -disable_classes = -zend.enable_gc = On -expose_php = On -max_execution_time = 30 -max_input_time = 60 -memory_limit = 128M -error_reporting = E_ALL & ~E_NOTICE -display_errors = Off -display_startup_errors = Off -log_errors = On -log_errors_max_len = 1024 -ignore_repeated_errors = Off -ignore_repeated_source = Off -report_memleaks = On -track_errors = Off -html_errors = On -error_log = php.log -variables_order = "GPCS" -request_order = "GP" -register_argc_argv = Off -auto_globals_jit = On -post_max_size = 8M -auto_prepend_file = -auto_append_file = -default_mimetype = "text/html" -include_path = ".;" -doc_root = -user_dir = - extension_dir = "ext" -enable_dl = Off -file_uploads = On -upload_max_filesize = 2M -max_file_uploads = 20 -allow_url_fopen = On -allow_url_include = Off -default_socket_timeout = 60 -extension=php_curl.dll -extension=php_gd2.dll -extension=php_ldap.dll -extension=php_mbstring.dll -extension=php_openssl.dll -extension=php_pdo_pgsql.dll -extension=php_xsl.dll -[CLI Server] -cli_server.color = On -[Date] -date.timezone = "EUROPE/Paris" -[Pdo_mysql] -pdo_mysql.cache_size = 2000 -pdo_mysql.default_socket= -[mail function] -SMTP = localhost -smtp_port = 25 -mail.add_x_header = On -[SQL] -sql.safe_mode = Off -[ODBC] -odbc.allow_persistent = On -odbc.check_persistent = On -odbc.max_persistent = -1 -odbc.max_links = -1 -odbc.defaultlrl = 4096 -odbc.defaultbinmode = 1 -[Interbase] -ibase.allow_persistent = 1 -ibase.max_persistent = -1 -ibase.max_links = -1 -ibase.timestampformat = "%Y-%m-%d %H:%M:%S" -ibase.dateformat = "%Y-%m-%d" -ibase.timeformat = "%H:%M:%S" -[MySQL] -mysql.allow_local_infile = On -mysql.allow_persistent = On -mysql.cache_size = 2000 -mysql.max_persistent = -1 -mysql.max_links = -1 -mysql.default_port = -mysql.default_socket = -mysql.default_host = -mysql.default_user = -mysql.default_password = -mysql.connect_timeout = 60 -mysql.trace_mode = Off -[MySQLi] -mysqli.max_persistent = -1 -mysqli.allow_persistent = On -mysqli.max_links = -1 -mysqli.cache_size = 2000 -mysqli.default_port = 3306 -mysqli.default_socket = -mysqli.default_host = -mysqli.default_user = -mysqli.default_pw = -mysqli.reconnect = Off -[mysqlnd] -mysqlnd.collect_statistics = On -mysqlnd.collect_memory_statistics = Off -[PostgreSQL] -pgsql.allow_persistent = On -pgsql.auto_reset_persistent = Off -pgsql.max_persistent = -1 -pgsql.max_links = -1 -pgsql.ignore_notice = 0 -pgsql.log_notice = 0 -[Sybase-CT] -sybct.allow_persistent = On -sybct.max_persistent = -1 -sybct.max_links = -1 -sybct.min_server_severity = 10 -sybct.min_client_severity = 10 -[bcmath] -bcmath.scale = 0 -[Session] -session.save_handler = files -session.use_strict_mode = 0 -session.use_cookies = 1 -session.use_only_cookies = 1 -session.name = PHPSESSID -session.auto_start = 0 -session.cookie_lifetime = 0 -session.cookie_path = / -session.cookie_domain = -session.cookie_httponly = -session.serialize_handler = php -session.gc_probability = 1 -session.gc_divisor = 1000 -session.gc_maxlifetime = 1440 -session.referer_check = -session.cache_limiter = nocache -session.cache_expire = 180 -session.use_trans_sid = 0 -session.hash_function = 0 -session.hash_bits_per_character = 5 -url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" -[MSSQL] -mssql.allow_persistent = On -mssql.max_persistent = -1 -mssql.max_links = -1 -mssql.min_error_severity = 10 -mssql.min_message_severity = 10 -mssql.compatibility_mode = Off -mssql.secure_connection = Off -[Tidy] -tidy.clean_output = Off -[soap] -soap.wsdl_cache_enabled=1 -soap.wsdl_cache_dir="/tmp" -soap.wsdl_cache_ttl=86400 -soap.wsdl_cache_limit = 5 -[ldap] -ldap.max_links = -1 diff --git a/src/module_gtf/gtf.engine/engine/sha1.c b/src/module_gtf/gtf.engine/engine/sha1.c deleted file mode 100755 index d87c7f4830013b8e7d749e398b0a15ba15acd5c4..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/engine/sha1.c +++ /dev/null @@ -1,371 +0,0 @@ -/* - * sha1.c - * - * Copyright (C) 1998, 2009 - * Paul E. Jones <paulej@packetizer.com> - * All Rights Reserved - * - ***************************************************************************** - * $Id: sha1.c 12 2009-06-22 19:34:25Z paulej $ - ***************************************************************************** - * - * Description: - * This file implements the Secure Hashing Standard as defined - * in FIPS PUB 180-1 published April 17, 1995. - * - * The Secure Hashing Standard, which uses the Secure Hashing - * Algorithm (SHA), produces a 160-bit message digest for a - * given data stream. In theory, it is highly improbable that - * two messages will produce the same message digest. Therefore, - * this algorithm can serve as a means of providing a "fingerprint" - * for a message. - * - * Portability Issues: - * SHA-1 is defined in terms of 32-bit "words". This code was - * written with the expectation that the processor has at least - * a 32-bit machine word size. If the machine word size is larger, - * the code should still function properly. One caveat to that - * is that the input functions taking characters and character - * arrays assume that only 8 bits of information are stored in each - * character. - * - * Caveats: - * SHA-1 is designed to work with messages less than 2^64 bits - * long. Although SHA-1 allows a message digest to be generated for - * messages of any number of bits less than 2^64, this - * implementation only works with messages with a length that is a - * multiple of the size of an 8-bit character. - * - */ - -#include "sha1.h" - -/* - * Define the circular shift macro - */ -#define SHA1CircularShift(bits,word) \ - ((((word) << (bits)) & 0xFFFFFFFF) | \ - ((word) >> (32-(bits)))) - -/* Function prototypes */ -void SHA1ProcessMessageBlock(SHA1Context *); -void SHA1PadMessage(SHA1Context *); - -/* - * SHA1Reset - * - * Description: - * This function will initialize the SHA1Context in preparation - * for computing a new message digest. - * - * Parameters: - * context: [in/out] - * The context to reset. - * - * Returns: - * Nothing. - * - * Comments: - * - */ -void SHA1Reset(SHA1Context *context) -{ - context->Length_Low = 0; - context->Length_High = 0; - context->Message_Block_Index = 0; - - context->Message_Digest[0] = 0x67452301; - context->Message_Digest[1] = 0xEFCDAB89; - context->Message_Digest[2] = 0x98BADCFE; - context->Message_Digest[3] = 0x10325476; - context->Message_Digest[4] = 0xC3D2E1F0; - - context->Computed = 0; - context->Corrupted = 0; -} - -/* - * SHA1Result - * - * Description: - * This function will return the 160-bit message digest into the - * Message_Digest array within the SHA1Context provided - * - * Parameters: - * context: [in/out] - * The context to use to calculate the SHA-1 hash. - * - * Returns: - * 1 if successful, 0 if it failed. - * - * Comments: - * - */ -int SHA1Result(SHA1Context *context) -{ - - if (context->Corrupted) - { - return 0; - } - - if (!context->Computed) - { - SHA1PadMessage(context); - context->Computed = 1; - } - - return 1; -} - -/* - * SHA1Input - * - * Description: - * This function accepts an array of octets as the next portion of - * the message. - * - * Parameters: - * context: [in/out] - * The SHA-1 context to update - * message_array: [in] - * An array of characters representing the next portion of the - * message. - * length: [in] - * The length of the message in message_array - * - * Returns: - * Nothing. - * - * Comments: - * - */ -void SHA1Input( SHA1Context *context, - const unsigned char *message_array, - unsigned length) -{ - if (!length) - { - return; - } - - if (context->Computed || context->Corrupted) - { - context->Corrupted = 1; - return; - } - - while(length-- && !context->Corrupted) - { - context->Message_Block[context->Message_Block_Index++] = - (*message_array & 0xFF); - - context->Length_Low += 8; - /* Force it to 32 bits */ - context->Length_Low &= 0xFFFFFFFF; - if (context->Length_Low == 0) - { - context->Length_High++; - /* Force it to 32 bits */ - context->Length_High &= 0xFFFFFFFF; - if (context->Length_High == 0) - { - /* Message is too long */ - context->Corrupted = 1; - } - } - - if (context->Message_Block_Index == 64) - { - SHA1ProcessMessageBlock(context); - } - - message_array++; - } -} - -/* - * SHA1ProcessMessageBlock - * - * Description: - * This function will process the next 512 bits of the message - * stored in the Message_Block array. - * - * Parameters: - * None. - * - * Returns: - * Nothing. - * - * Comments: - * Many of the variable names in the SHAContext, especially the - * single character names, were used because those were the names - * used in the publication. - * - * - */ -void SHA1ProcessMessageBlock(SHA1Context *context) -{ - const unsigned K[] = /* Constants defined in SHA-1 */ - { - 0x5A827999, - 0x6ED9EBA1, - 0x8F1BBCDC, - 0xCA62C1D6 - }; - int t; /* Loop counter */ - unsigned temp; /* Temporary word value */ - unsigned W[80]; /* Word sequence */ - unsigned A, B, C, D, E; /* Word buffers */ - - /* - * Initialize the first 16 words in the array W - */ - for(t = 0; t < 16; t++) - { - W[t] = ((unsigned) context->Message_Block[t * 4]) << 24; - W[t] |= ((unsigned) context->Message_Block[t * 4 + 1]) << 16; - W[t] |= ((unsigned) context->Message_Block[t * 4 + 2]) << 8; - W[t] |= ((unsigned) context->Message_Block[t * 4 + 3]); - } - - for(t = 16; t < 80; t++) - { - W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); - } - - A = context->Message_Digest[0]; - B = context->Message_Digest[1]; - C = context->Message_Digest[2]; - D = context->Message_Digest[3]; - E = context->Message_Digest[4]; - - for(t = 0; t < 20; t++) - { - temp = SHA1CircularShift(5,A) + - ((B & C) | ((~B) & D)) + E + W[t] + K[0]; - temp &= 0xFFFFFFFF; - E = D; - D = C; - C = SHA1CircularShift(30,B); - B = A; - A = temp; - } - - for(t = 20; t < 40; t++) - { - temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]; - temp &= 0xFFFFFFFF; - E = D; - D = C; - C = SHA1CircularShift(30,B); - B = A; - A = temp; - } - - for(t = 40; t < 60; t++) - { - temp = SHA1CircularShift(5,A) + - ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]; - temp &= 0xFFFFFFFF; - E = D; - D = C; - C = SHA1CircularShift(30,B); - B = A; - A = temp; - } - - for(t = 60; t < 80; t++) - { - temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]; - temp &= 0xFFFFFFFF; - E = D; - D = C; - C = SHA1CircularShift(30,B); - B = A; - A = temp; - } - - context->Message_Digest[0] = - (context->Message_Digest[0] + A) & 0xFFFFFFFF; - context->Message_Digest[1] = - (context->Message_Digest[1] + B) & 0xFFFFFFFF; - context->Message_Digest[2] = - (context->Message_Digest[2] + C) & 0xFFFFFFFF; - context->Message_Digest[3] = - (context->Message_Digest[3] + D) & 0xFFFFFFFF; - context->Message_Digest[4] = - (context->Message_Digest[4] + E) & 0xFFFFFFFF; - - context->Message_Block_Index = 0; -} - -/* - * SHA1PadMessage - * - * Description: - * According to the standard, the message must be padded to an even - * 512 bits. The first padding bit must be a '1'. The last 64 - * bits represent the length of the original message. All bits in - * between should be 0. This function will pad the message - * according to those rules by filling the Message_Block array - * accordingly. It will also call SHA1ProcessMessageBlock() - * appropriately. When it returns, it can be assumed that the - * message digest has been computed. - * - * Parameters: - * context: [in/out] - * The context to pad - * - * Returns: - * Nothing. - * - * Comments: - * - */ -void SHA1PadMessage(SHA1Context *context) -{ - /* - * Check to see if the current message block is too small to hold - * the initial padding bits and length. If so, we will pad the - * block, process it, and then continue padding into a second - * block. - */ - if (context->Message_Block_Index > 55) - { - context->Message_Block[context->Message_Block_Index++] = 0x80; - while(context->Message_Block_Index < 64) - { - context->Message_Block[context->Message_Block_Index++] = 0; - } - - SHA1ProcessMessageBlock(context); - - while(context->Message_Block_Index < 56) - { - context->Message_Block[context->Message_Block_Index++] = 0; - } - } - else - { - context->Message_Block[context->Message_Block_Index++] = 0x80; - while(context->Message_Block_Index < 56) - { - context->Message_Block[context->Message_Block_Index++] = 0; - } - } - - /* - * Store the message length as the last 8 octets - */ - context->Message_Block[56] = (context->Length_High >> 24) & 0xFF; - context->Message_Block[57] = (context->Length_High >> 16) & 0xFF; - context->Message_Block[58] = (context->Length_High >> 8) & 0xFF; - context->Message_Block[59] = (context->Length_High) & 0xFF; - context->Message_Block[60] = (context->Length_Low >> 24) & 0xFF; - context->Message_Block[61] = (context->Length_Low >> 16) & 0xFF; - context->Message_Block[62] = (context->Length_Low >> 8) & 0xFF; - context->Message_Block[63] = (context->Length_Low) & 0xFF; - - SHA1ProcessMessageBlock(context); -} diff --git a/src/module_gtf/gtf.engine/engine/sha1.h b/src/module_gtf/gtf.engine/engine/sha1.h deleted file mode 100755 index 1ca4b104a9647ebdc20f257b9525af825a3575b7..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/engine/sha1.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * sha1.h - * - * Copyright (C) 1998, 2009 - * Paul E. Jones <paulej@packetizer.com> - * All Rights Reserved - * - ***************************************************************************** - * $Id: sha1.h 12 2009-06-22 19:34:25Z paulej $ - ***************************************************************************** - * - * Description: - * This class implements the Secure Hashing Standard as defined - * in FIPS PUB 180-1 published April 17, 1995. - * - * Many of the variable names in the SHA1Context, especially the - * single character names, were used because those were the names - * used in the publication. - * - * Please read the file sha1.c for more information. - * - */ - -#ifndef _SHA1_H_ -#define _SHA1_H_ - -/* - * This structure will hold context information for the hashing - * operation - */ -typedef struct SHA1Context -{ - unsigned Message_Digest[5]; /* Message Digest (output) */ - - unsigned Length_Low; /* Message length in bits */ - unsigned Length_High; /* Message length in bits */ - - unsigned char Message_Block[64]; /* 512-bit message blocks */ - int Message_Block_Index; /* Index into message block array */ - - int Computed; /* Is the digest computed? */ - int Corrupted; /* Is the message digest corruped? */ -} SHA1Context; - -/* - * Function Prototypes - */ -void SHA1Reset(SHA1Context *); -int SHA1Result(SHA1Context *); -void SHA1Input( SHA1Context *, - const unsigned char *, - unsigned); - -#endif diff --git a/src/module_gtf/gtf.engine/gtf.engines/Traitement.class.inc b/src/module_gtf/gtf.engine/gtf.engines/Traitement.class.inc index 1a5c2f39e252daa395ee5fddd73a4a2bc1b43c75..d87dfd3606399bbe7faa0cb0bc02b8ea8a6dad23 100755 --- a/src/module_gtf/gtf.engine/gtf.engines/Traitement.class.inc +++ b/src/module_gtf/gtf.engine/gtf.engines/Traitement.class.inc @@ -16,7 +16,10 @@ require_once ("vmlib/phpUtil.inc"); require_once ("vmlib/logUtil.inc"); require_once ("vmlib/stringUtil.inc"); +require_once ("vmlib/cryptUtil.inc"); require_once ("gtf_lib/GtfFmwParser.class.inc"); +require_once ("vmlib/Email.class.inc"); +require_once ("gtf_lib/gtf_object/Order.class.inc"); require_once 'string.inc'; class Traitement { @@ -82,11 +85,45 @@ class Traitement { var $sSource; var $sSourceTemp = ""; + /** + * Paramètres de cryptage du résultat. + */ + var $bDataEncrypt = false; + var $sSecretKey; + + /** + Pramaètre pour modifir la GTF_CONNECTION_STRING + */ + var $bUseExternalDbConnection = false; + + /** + * Formatage des paramètres différent si le traitement est envoyé vers Fme Server. + */ + var $bFmeServer = false; + + /** + * Nom de répertoire du résultat de la demande. + */ + var $sResultDirectoryName = ''; + + /** + * Chemin vers le répertoire du résultat de la demande. + */ + var $sResultDirectoryPath = ''; + + /** + * Tableau contenant la liste des fichiers de destination. + */ + var $aDestinationFiles = array(); + /** * Cette méthode permet d'initialiser les variables. * \param $oBd Connexion à la base de données. * \param $iDemandeId Identifiant de la demande. * \param $sRobotLogFile Fichier de log. + * \param $sParams Liste des paramètres saisis par l'utilisateur à la création de la demande. + * \param $aProperties Tableau des properties associés à l'application + * \param $sFmwFileName Nom du fichier FMW associé à la demande. */ function __construct($oBd, $iDemandeId, $sRobotLogFile, $sParams, $aProperties, $sFmwFileName) { $this->oBd = $oBd; @@ -99,27 +136,7 @@ class Traitement { // table de correspondance entre GTF et le FMW utiliser dans les fonction d'encodage $this->aReplaceGTF = array("\r\n", " ", "(", ")", "$", "&", "@", "°", "'", ",", "\"", "{", "}", "[", "]", ";", "/", "\\", "é", "à"); $this->aReplaceFME = array("<lf>", "<space>", "<openparen>", "<closeparen>", "<dollar>", "<amp>", "<at>", "<u00b0>", "<apos>", "<comma>", "<quote>", "<opencurly>", "<closecurly>", "<openbracket>", "<closebracket>", "<semicolon>", "<solidus>", "<backslash>", "<u00e9>", "<u00e0>"); - - writeToLog(str_replace('[this->sFmwFileName]', $this->sFmwFileName, str_replace('[sParams]', $sParams, INFO_RESOURCES)), $this->sRobotLogFile); - } - - /* - * Initialisation du traitement. - * \param $oBd Connexion à la base de données. - * \param $iDemandeId Identifiant de la demande. - * \param $sLogFile Fichier de log. - * \param $sParams Liste des paramètres saisis par l'utilisateur à la création de la demande. - * \param $aProperties Tableau des properties associés à l'application - * \param $sFmwFileName Nom du fichier FMW associé à la demande. - */ - - /** - * Cette méthode permet de générer un nom de fichier unique. - * \return une chaîne de caractères. - */ - function UniqFileName() { - $sUniqFileName = date('YmdHis') . rand(1, 100000); - return $sUniqFileName; + //writeToLog(str_replace('[this->sFmwFileName]', $this->sFmwFileName, str_replace('[sParams]', $sParams, INFO_RESOURCES)), $this->sRobotLogFile); } /** @@ -154,6 +171,8 @@ class Traitement { $sExeName = "FME"; if (!$this->bErreur) { set_time_limit(0); + // Déclaration du tableau de résultat (IMPORTANT!). + $aResult = array(); //$sResultCommande = exec('"'.$this->aProperties["fme_path"].'" APPLY_SETTINGS "Python/Python Interpreter"', $aResult, $iResult); $sResultCommande = exec('"' . $this->aProperties["fme_path"] . '" APPLY_SETTINGS "Python/Use Custom Python" false', $aResult, $iResult); //writeToLog(INFO_INFORM.$sExeName."| ".'"'.$this->aProperties["fme_path"].'" APPLY_SETTINGS "Python/Python Interpreter"', $this->sRobotLogFile); @@ -168,7 +187,7 @@ class Traitement { $aResultCommande = explode("|", $sResultCommande); } //Récupération d'une erreur. - if ($iResult !=0){ + if ($iResult !=0){ //if ($iResult || ($aResultCommande[0] != 0)) { $this->bErreur = true; if (sizeOf($aResultCommande) == 1) @@ -184,17 +203,17 @@ class Traitement { } else { $this->sMessageErreur = "Erreur lors de l exécution de la commande. Consultez le log du robot."; } - $bExistFMELogFile = true; - if (file_exists($sFMELogFile) === false) { - $bExistFMELogFile = false; - } + $bExistFMELogFile = true; + if (file_exists($sFMELogFile) === false) { + $bExistFMELogFile = false; + } foreach ($aResult as $sValeur) { writeToLog(INFO_ERROR . " " . "| " . $sValeur, $this->sRobotLogFile); - if ($bExistFMELogFile === false){ - $monfichier = fopen($sFMELogFile, 'a'); - fputs($monfichier, $sValeur. "\n"); - fclose($monfichier); - } + if ($bExistFMELogFile === false){ + $monfichier = fopen($sFMELogFile, 'a'); + fputs($monfichier, $sValeur. "\n"); + fclose($monfichier); + } } writeToLog(INFO_COMMAND_ERROR . $sCommand . ".", $this->sRobotLogFile); } else { @@ -218,7 +237,7 @@ class Traitement { */ function zipFile($sZipDir, $sZipFileDir, $sZipUrl, $sZipFileName) { writeToLog(str_replace('[sZipDir]', $sZipDir, INFO_FILE_COMPRESSION), $this->sRobotLogFile); - if (createZip($sZipDir, $sZipFileDir . '/' . $sZipFileName . '.zip', 'log')) { + if (createZip($sZipDir, $sZipFileDir . '/' . $sZipFileName . '.zip', 'log', $this->sSecretKey, true)) { $sZipFile = $sZipUrl . "/" . $sZipFileName . ".zip"; writeToLog(INFO_COMPRESSED_FILES . $sZipFile . ".", $this->sRobotLogFile); } else { @@ -267,7 +286,9 @@ class Traitement { writeToLog(INFO_DECOMPRESSING_FILE . $sZipFile . ".", $this->sRobotLogFile); // Les backslashes du chemin de la variable d'environnement TEMP sont remplacés par des slashes $this->aProperties["extract_dir"] = str_replace("\\", "/", $this->aProperties["extract_dir"]); - $sExtractDir = $this->aProperties["extract_dir"] . "/" . $this->UniqFileName() . "/"; + do { + $sExtractDir = $this->aProperties["extract_dir"] . "/" . getUniqRandomId() . "/"; + }while(file_exists($sExtractDir)); $this->sSourceTemp = $sExtractDir; if (unZip($sZipFile, $sExtractDir)) { writeToLog(INFO_FILE_COMPRESSION_DIRECTORY . $sExtractDir . ".", $this->sRobotLogFile); @@ -287,61 +308,51 @@ class Traitement { * $oGtfFmwParser : Objet GtfFmwParser contenant les GUI * $oGui : Objet GUI de la source * $sDirSource : Chaine de caractère contenant le chemin d'accés à la source de données + * \return Tableau des fichiers pour le paramètre "source". */ - function updateSourceParam($oGui, $oGtfFmwParser, $sDirSource, $bUsePattern) { - $sdelimiterFichier = '"""'; - $sdelimiterParam = '"'; - $sSourceMacro = $sdelimiterFichier; - $aSourceMacro = array(); + function getSourceParam($oGui, $oGtfFmwParser, $sDirSource, $bUsePattern) { + $aSourceMacro = array(); $i = 0; - + $aSourceFiles = array(); if (is_dir($sDirSource)) { - $this->aExtension = $oGui->getExtensionArrayNoLower($oGui->sFiltreSource); + $this->aExtension = $oGui->getExtensionArray($oGui->sFiltreSource); $iExtension = count($this->aExtension); if (($this->aExtension[0] == "*.*" and $oGui->sType == "FILE_OR_URL") or $oGui->sType == "DIRNAME_SRC" or $oGui->sType == "SOURCE_GEODATABASE") { writeToLog(INFO_VALID_DATA_SOURCE_FILE_EXTENSION . $this->aExtension[0], $this->sRobotLogFile); - $sSourceMacro.= $sdelimiterParam . $sDirSource . '/**/' . $sdelimiterParam; + $aSourceFiles[] = $sDirSource . '/**/'; } else { - if ($bUsePattern){ - writeToLog(INFO_USE_PATTERN, $this->sRobotLogFile); - foreach ($this->aExtension as $sExtension) { - if ($sExtension != "*.*" or ( $sExtension == "*.*" and $iExtension == 1)) { // Si le filtre est différent de *.* (ex : *.mdb) ou si le filtre est seulement *.*. Si le filtre est multiple et que l'un d'eux est *.* (ex : *.*, *.mdb...), il ne sera pas pris en compte - $aExtension = explode(".", $sExtension); - if ($this->countFilesExtension($sDirSource, $aExtension[1]) > 0) { - if ($i != 0) - $sSourceMacro.= "<space>"; - writeToLog(INFO_VALID_DATA_SOURCE_FILE_EXTENSION . $sExtension, $this->sRobotLogFile); - $sSourceMacro.= $sdelimiterParam . $sDirSource . '/**/' . $sExtension . $sdelimiterParam; - $i++; - } - } - } - }else{ - writeToLog(INFO_NO_USE_PATTERN, $this->sRobotLogFile); - foreach ($this->aExtension as $sExtension) { - if ($sExtension != "*.*" or ( $sExtension == "*.*" and $iExtension == 1)) { // Si le filtre est différent de *.* (ex : *.mdb) ou si le filtre est seulement *.*. Si le - $aExtension = explode(".", $sExtension); - $aSourceMacroTmp = array_merge($aSourceMacro, $this->returnFileListToString($sDirSource, $aExtension[1])); - $aSourceMacro = array_unique($aSourceMacroTmp); - $i++; - } - } - foreach ($aSourceMacro as $source) { - if ($sSourceMacro != $sdelimiterFichier){ - $sSourceMacro.= "<space>"; - } - $sSourceMacro.= $sdelimiterParam . $source . $sdelimiterParam; - } + if ($bUsePattern){ + writeToLog(INFO_USE_PATTERN, $this->sRobotLogFile); + foreach ($this->aExtension as $sExtension) { + if ($sExtension != "*.*" or ( $sExtension == "*.*" and $iExtension == 1)) { // Si le filtre est différent de *.* (ex : *.mdb) ou si le filtre est seulement *.*. Si le filtre est multiple et que l'un d'eux est *.* (ex : *.*, *.mdb...), il ne sera pas pris en compte + $aExtension = explode(".", $sExtension); + if ($this->countFilesExtension($sDirSource, $aExtension[1]) > 0) { + writeToLog(INFO_VALID_DATA_SOURCE_FILE_EXTENSION . $sExtension, $this->sRobotLogFile); + $aSourceFiles[] = $sDirSource . '/**/' . $sExtension; + $i++; + } + } + } + }else{ + writeToLog(INFO_NO_USE_PATTERN, $this->sRobotLogFile); + foreach ($this->aExtension as $sExtension) { + if ($sExtension != "*.*" or ( $sExtension == "*.*" and $iExtension == 1)) { // Si le filtre est différent de *.* (ex : *.mdb) ou si le filtre est seulement *.*. Si le + $aExtension = explode(".", $sExtension); + $aSourceMacroTmp = array_merge($aSourceMacro, $this->returnFileListToString($sDirSource, $aExtension[1])); + $aSourceMacro = array_unique($aSourceMacroTmp); + $i++; + } + } + foreach ($aSourceMacro as $source) { + $aSourceFiles[] = $source; + } } } - }else { - $sSourceMacro.= $sdelimiterParam . $sDirSource . $sdelimiterParam; - } - $sSourceMacro .= $sdelimiterFichier; - $this->aParametre[$oGui->sDefault_Macro] = $sSourceMacro; - - return $sSourceMacro; + }else + $aSourceFiles[] = $sDirSource; + + return $aSourceFiles; } // Compte le nombre de fichier @@ -362,24 +373,24 @@ class Traitement { } return $num; } - - function returnFileListToString($sDirSource, $sExtension) { - $aFileList = array(); - if (!is_dir($sDirSource)) { - $path_parts = pathinfo($sDirSource); - if (is_file($sDirSource) && strtolower($path_parts['extension']) == strtolower($sExtension)){ - array_push($aFileList,$sDirSource); - } - - }else{ - foreach (scandir($sDirSource) AS $entry) { - if (!in_array($entry, array('..', '.'))){ - $aFileListTmp = $aFileList; - $aFileList = array_merge($aFileListTmp,$this->returnFileListToString($sDirSource . "/" . $entry, $sExtension)); - } - - } - } + + function returnFileListToString($sDirSource, $sExtension) { + $aFileList = array(); + if (!is_dir($sDirSource)) { + $path_parts = pathinfo($sDirSource); + if (is_file($sDirSource) && strtolower($path_parts['extension']) == strtolower($sExtension)){ + array_push($aFileList,$sDirSource); + } + + }else{ + foreach (scandir($sDirSource) AS $entry) { + if (!in_array($entry, array('..', '.'))){ + $aFileListTmp = $aFileList; + $aFileList = array_merge($aFileListTmp,$this->returnFileListToString($sDirSource . "/" . $entry, $sExtension)); + } + + } + } return $aFileList; } @@ -390,16 +401,15 @@ class Traitement { * $sDirSource : Chaine de caractère contenant le chemin d'accés à la source de données */ - function updateDestParam($oGui, $oGtfFmwParser, $sNewDir, $sDest) { + function updateDestParam($oGui, $oGtfFmwParser, $sDest) { $this->aExtension = $oGui->getExtensionArray($oGui->sFiltreDest); - if ($sDest == "" && $oGui->sType != "DIRNAME") { - $sDest = $sNewDir; - } + if ($sDest == "" && $oGui->sType != "DIRNAME") + $sDest = $this->sResultDirectoryName; $this->aParametre[$oGui->sDefault_Macro] = ""; $sDest = normalizeString($sDest); $aDest = explode(".", $sDest); if ($oGui->sType == "DIRNAME" or $oGui->sType == "DEST_GEODATABASE") { - $this->aParametre[$oGui->sDefault_Macro] = $this->aProperties["dir_export"] . "/gtf/" . $sNewDir . "/" . $sDest; + $this->aParametre[$oGui->sDefault_Macro] = $this->aProperties["dir_export"] . "/gtf/" . $this->sResultDirectoryName . "/" . $sDest; writeToLog(INFO_OUTPUT_DATA_DIRECTORY . $this->aParametre[$oGui->sDefault_Macro], $this->sRobotLogFile); } if ($oGui->sType == "FILENAME") { @@ -408,7 +418,7 @@ class Traitement { } else { $sResult = str_replace("*", $sDest, $this->aExtension[0]); } - $this->aParametre[$oGui->sDefault_Macro].= $this->aProperties["dir_export"] . "/gtf/" . $sNewDir . '/' . $sResult; + $this->aParametre[$oGui->sDefault_Macro].= $this->aProperties["dir_export"] . "/gtf/" . $this->sResultDirectoryName . '/' . $sResult; $this->sDestination = $sResult; writeToLog(INFO_OUTPUT_DATA_FILE . $this->aParametre[$oGui->sDefault_Macro], $this->sRobotLogFile); @@ -466,7 +476,7 @@ class Traitement { } } - // on encode les balises UTF-8 + // on encode les balises UTF-8 $offset = 0; $iPos = 0; @@ -503,7 +513,7 @@ class Traitement { } } - // on decode les balises UTF-8 + // on decode les balises UTF-8 $matches = array(); preg_match_all("/<u[0-9a-fA-F]{4}>/", $sStr, $matches); @@ -542,96 +552,32 @@ class Traitement { * $oGtfFmwParser : Objet GtfFmwParser contenant les GUI */ - function getTclParams($oGtfFmwParser, $sNewDir) { - $aTGui = array(); + function getTclParams($oGtfFmwParser) { $sChaine = ""; - $bUsePattern = false; - foreach ($oGtfFmwParser->aGuiObject as $aGui) { - if ($aGui->sDefault_Macro != "") { - array_push($aTGui, $aGui); - } - if ($aGui->sDefault_Macro == "GTF_FORCE_PATTERN") { - if (strtolower($aGui->sDefaultValue) == "true"){ - $bUsePattern = true; - } - } - } - foreach ($aTGui as $oGui) { - //Teste si le paramètre est une source - if ($oGui->bIsSource) { - if ($this->aParametre[$oGui->sDefault_Macro] != "" && substr($this->aParametre[$oGui->sDefault_Macro], 0, 7) != "<quote>") { - $sDirSource = $this->unZipSource($this->aParametre[$oGui->sDefault_Macro]); - $this->updateSourceParam($oGui, $oGtfFmwParser, $sDirSource, $bUsePattern); - } - } - if ($oGui->bIsDest) { - $sDest = $this->aParametre[$oGui->sDefault_Macro]; - $this->updateDestParam($oGui, $oGtfFmwParser, $sNewDir, $sDest); - } - - if ($this->aParametre[$oGui->sDefault_Macro] != "") { - - if (!$oGui->bIsSource) { - // Protection des guillemets de chaque valeur pour qu'ils soient correctement envoyé à traitement.tcl - // Cette protection s'effectue uniquement pour les paramètre qui ne sont pas sources (un paramètre source est de ce type : """"param1"" ""param2"" ""param3"""" : les guillemets seraient donc protégé et cela fait planter l'exécution) - //$this->aParametre[$oGui->sDefault_Macro] = str_replace('"', '""', $this->aParametre[$oGui->sDefault_Macro]); - } - $aBaliseToReplace = array('<GTF_EQUAL>', '<GTF_PIPE>'); - $aReplacedBalise = array('=', '|'); - $sGTFOutput = str_replace($aBaliseToReplace, $aReplacedBalise, $this->aParametre[$oGui->sDefault_Macro]); - switch ($oGui->sType) { - case "FLOAT": - $sGTFOutput = str_replace(",", ".", $sGTFOutput); - if (!$this->isDecode($sGTFOutput)) - $sGTFOutput = $this->decoderFME($sGTFOutput); - break; - case "LOOKUP_CHOICE": - if (!$this->isEncode($sGTFOutput)) - $sGTFOutput = $this->encoderFME($sGTFOutput); - break; - case "TEXT_EDIT" : - case "TEXT_EDIT_OR_NUM" : - if (!$this->isEncode($sGTFOutput)) { - //$sGTFOutput = $this->decoderFME($sGTFOutput); - $sGTFOutput = $this->encoderFME($sGTFOutput); - } - break; - case "CHOICE": - case "LOOKUP_LISTBOX": - $sGTFOutput = str_replace('"', '""', $sGTFOutput); - if (!$this->isDecode($sGTFOutput)) - $sGTFOutput = $this->decoderFME($sGTFOutput); - break; - default : - //$sGTFOutput = str_replace('"', '""', $sGTFOutput); - if (!$this->isDecode($sGTFOutput)) - $sGTFOutput = $this->decoderFME($sGTFOutput); - break; - } - // Echappement des doubles quotes pour FME. - $sGTFOutput = str_replace('"', '\"', $sGTFOutput); - // - $sChaine .= " --" . $oGui->sDefault_Macro . " \"" . $sGTFOutput . "\""; - } + $aFmeParameters = $this->getFmeParameters($oGtfFmwParser); + foreach ($aFmeParameters as $sFmeParamKey => $sFmeParamValue) { + // Echappement des doubles quotes pour FME. + $sFmeParamValue = str_replace('"', '\"', $sFmeParamValue); + // Ajout du paramètre en ligne de commande. + $sChaine .= " --" . $sFmeParamKey . " \"" . $sFmeParamValue . "\""; } - // $sChaine = substr($sChaine, 0, -1)."\""; //$sChaine = substr($sChaine, 0, -1); return $sChaine; } - function listDir($sDossier, $iDemandeId) { - $ouverture = @opendir($sDossier); + function listDir($iDemandeId) { + $ouverture = @opendir($this->sResultDirectoryPath); if (!$ouverture) return false; while ($sFichier = readdir($ouverture)) { if ($sFichier == '.' || $sFichier == '..') continue; - if (is_dir($sDossier . $sFichier)) { + if (is_dir($this->sResultDirectoryPath . $sFichier)) { closedir($ouverture); return true; } else { - $path_parts = pathinfo($sDossier . $sFichier); + $path_parts = pathinfo($this->sResultDirectoryPath . $sFichier); if ($sFichier != "fme_" . $iDemandeId . ".log") { closedir($ouverture); return true; @@ -644,29 +590,27 @@ class Traitement { /* * Fonction qui retourne le nom du fichier résultat qui sera zippé. - * $sDossier correspond au chemin complet dans lequel les fichiers/dossiers résultats seront générés - * $sNewDir correspond au numéro unique du dossier dans lequel les fichiers/dossiers résultats seront générés * $iDemandeId correspond au numéro de la demande * \return Retourne NULL (s'il y a plusieurs fichiers résultat à zipper) ou le fichier résultat qui sera zippé sous la forme 20140324141501876/ventes.xlsx */ - function CheckResult($sDossier, $sNewDir, $iDemandeId) { - $ouverture = @opendir($sDossier); + function CheckResult($iDemandeId) { + $ouverture = @opendir($this->sResultDirectoryPath); $NbFile = 0; while ($sFichier = readdir($ouverture)) { if ($sFichier == '.' || $sFichier == '..') continue; - if (is_dir($sDossier . $sFichier)) { + if (is_dir($this->sResultDirectoryPath . $sFichier)) { $NbFile = $NbFile + 2; } else { - $path_parts = pathinfo($sDossier . $sFichier); + $path_parts = pathinfo($this->sResultDirectoryPath . $sFichier); if ($sFichier != "fme_" . $iDemandeId . ".log") { $NbFile = $NbFile + 1; } } } closedir($ouverture); - $ouverture = @opendir($sDossier); + $ouverture = @opendir($this->sResultDirectoryPath); if ($NbFile != 1) { return ""; } else { @@ -675,8 +619,8 @@ class Traitement { if ($sFichier == '.' || $sFichier == '..') continue; if ($sFichier != "fme_" . $iDemandeId . ".log") { - if (preg_match($pattern, $sFichier)) { - return $sNewDir . "/" . $sFichier; + if (preg_match($pattern, $sFichier) && !$this->bDataEncrypt) { + return $this->sResultDirectoryName . "/" . $sFichier; } else { return ""; } @@ -692,49 +636,24 @@ class Traitement { */ function Process() { - $oGtfFmwParser = new GtfFmwParser($this->aProperties["workspace_dir"] . "/" . $this->sFmwFileName); - // Création du répertoire de sortie des données - $sNewDir = $this->UniqFileName(); - if (!file_exists($this->aProperties["dir_export"] . "/gtf/")){ - mkdir($this->aProperties["dir_export"] . "/gtf/"); - } - $sDestDir = $this->aProperties["dir_export"] . "/gtf/" . $sNewDir; - mkdir($sDestDir); - // Création de l'URL de téléchargement des données - $sDestUrl = $this->aProperties["url_export"] . "/gtf/" . $sNewDir; + $oGtfFmwParser = new GtfFmwParser($this->aProperties["workspace_dir"] . "/" . $this->sFmwFileName, $this->aProperties); + // Création du répertoire de résultat. + $this->sResultDirectoryName = $this->createResultDirectory(); //1 Initialisation & calcul du chemin d'accés du fichier TCL $sCommandLine = '"' . $this->aProperties["fme_path"] . '" "' . getenv("GTF_HOME") . "/" . utf8_decode($this->sFmwFileName) . '"'; - - //3 Ajout des paramètres propres au traitement - $sTclParams = $this->getTclParams($oGtfFmwParser, $sNewDir); + $sTclParams = $this->getTclParams($oGtfFmwParser); if ($sTclParams != "") $sCommandLine .= $sTclParams; - - $aTGui = array(); + $aTGui = array(); $sChaine = ""; - // Ajout des paramètres GTF_ s'ils sont associés à un paramètre publié du traitement - foreach ($oGtfFmwParser->aGuiObject as $aGui) { - switch($aGui->sDefault_Macro) { - case 'GTF_ORDER_ID': - $sCommandLine .= " --GTF_ORDER_ID \"" . $this->iDemandeId . "\""; - break; - case 'GTF_SHARED_DIR': - $sCommandLine .= " --GTF_SHARED_DIR \"" . $this->aProperties["shared_dir"] . "\""; - break; - case 'GTF_CONNECTION_STRING': - if ($aGui->sType == "PASSWORD"){ - $sCommandLine .= " --GTF_CONNECTION_STRING \"" . $this->aProperties["server"] . "," . $this->aProperties["port"] . "," . $this->aProperties["database"] . "," . $this->aProperties["login_scheduler"] . "," . $this->aProperties["password_scheduler"] . "\""; - } - break; - case 'GTF_REST_URL': - $sCommandLine .= " --GTF_REST_URL \"" . $this->aProperties["web_server_name"] . "/" . $this->aProperties["services_alias"] . "/\""; - break; - //case 'GTF_FORCE_PATTERN': - } - + + // Ajout des paramètres GTF_ s'ils sont associés à un paramètre publié du traitement + $aGtfParameters = $this->getGtfParameters($oGtfFmwParser); + foreach ($aGtfParameters as $sGtfParamKey => $sGtfParamValue) { + $sCommandLine .= ' --' . $sGtfParamKey . ' "' . $sGtfParamValue . '"'; } /* * 2 Passage des paramètres généraux @@ -742,40 +661,567 @@ class Traitement { * - LOG_ROBOT : fichier log du robot * - LOG_FILENAME : fichier log pour FME */ - $sCommandLine.= " -LOG_FILENAME \"" . $sDestDir . "/fme_" . $this->iDemandeId . ".log\" 2>&1"; + $sCommandLine.= " -LOG_FILENAME \"" . $this->getFmeLogFilePath($this->sResultDirectoryPath) . "\" 2>&1"; writeToLog(INFO_GTF_HOME . getenv("GTF_HOME"), $this->sRobotLogFile); writeToLog(INFO_FME_PATH . getenv("FME_PATH"), $this->sRobotLogFile); writeToLog(INFO_TREATMENT_COMMAND_LINE . $sCommandLine, $this->sRobotLogFile); //4 Lancement de la ligne de commande - $this->sLogFme = $sNewDir . "/fme_" . $this->iDemandeId . ".log"; + $this->sLogFme = $this->getFmeLogFilePath($this->sResultDirectoryName); $sSql = "UPDATE " . $this->aProperties['schema_gtf'] . ".order SET log_url='" . $this->sLogFme . "' WHERE order_id=" . $this->iDemandeId; $this->oBd->execute($sSql); - $this->execute($sCommandLine, $sDestDir . "/fme_" . $this->iDemandeId . ".log"); + $this->execute($sCommandLine, $this->getFmeLogFilePath($this->sResultDirectoryPath)); writeToLog(INFO_TREATMENT_COMMAND_LINE . $sCommandLine, $this->sRobotLogFile); - if (file_exists($sDestDir . "/fme_" . $this->iDemandeId . ".log") == false) { + if (file_exists($this->getFmeLogFilePath($this->sResultDirectoryPath)) == false) { $this->sLogFme = ""; } - $bHasFile = $this->listDir($sDestDir, $this->iDemandeId); - if ($this->sSourceTemp != "" && $this->aProperties["debug_mode"] == false) { - clearDir($this->sSourceTemp); + // Tous les fichiers de résultat dans une archive .zip. + $sZipFile = $this->zipResultFiles(); + return $sZipFile; + } + + /** + * Submit a job on Fme Server. + * @param {object} $oFmeServer FmeServer class object. + * @param {array} $aOrder Order parameters. + * @param {array} $aWorkspace Workpace parameters. + * @param {array} $aUser User infos. + * @param {object} $oAmazonS3 AmazonS3 class object. + * @param {boolean} $bAsync Asynchronous job. + * @return string + */ + function submitFmeServerJob($oFmeServer, $aOrder, $aWorkspace, $aUser, $oAmazonS3 = null, $bAsync = false) { + $this->oFmeServer = $oFmeServer; + $this->oAmazonS3 = $oAmazonS3; + // Création du répertoire de résultat. + $this->sResultDirectoryName = $this->createResultDirectory(); + // Fichiers sources en entrée et sortie. + $oGtfFmwParser = new GtfFmwParser($this->aProperties["workspace_dir"] . "/" . $this->sFmwFileName, $this->aProperties); + $aTGui = array(); + $aSourceFiles = array(); + $aDestinationFiles = array(); + foreach ($oGtfFmwParser->aGuiObject as $oGui) { + if ($oGui->sDefault_Macro != "") { + array_push($aTGui, $oGui); + //Teste si le paramètre est une source + if ($oGui->bIsSource) + $aSourceFiles[$oGui->sDefault_Macro] = $this->aParametre[$oGui->sDefault_Macro]; + else if ($oGui->bIsDest) + $aDestinationFiles[] = $oGui->sDefault_Macro; + } } - if ($bHasFile) { - $sIsToZip = $this->CheckResult($sDestDir, $sNewDir, $this->iDemandeId); + // Sauve la liste des fichiers de destination. + $this->aDestinationFiles = $aDestinationFiles; + // Liste des paramètres publiés. + $aFmeParameters = $this->getFmeParameters($oGtfFmwParser); + // Ajout des paramètres GTF_ s'ils sont associés à un paramètre publié du traitement. + $aFmeParameters = array_merge($aFmeParameters, $this->getGtfParameters($oGtfFmwParser)); + // Création d'un identifiant pour l'instance de GTF (si inexistant). + if (empty($this->aProperties["gtf_instance_id"])) + $this->aProperties["gtf_instance_id"] = generateGtfInstanceId(); + // Création d'un dépot pour l'instance de GTF si inexistant. + $sRepository = $this->aProperties["gtf_instance_id"]; + if ($oFmeServer->createRepository($sRepository, '') === false) + return false; + // Création d'un répertoire dans les ressources si inexistant. + $sResource = 'FME_SHAREDRESOURCE_TEMP'; + $sPath = $this->aProperties["gtf_instance_id"]; + if ($oFmeServer->createResourceConnectionDirectory($sResource, $sPath, $this->sResultDirectoryName) === false) + return false; + $sPath .= '/' . $this->sResultDirectoryName; + // Copie locale du fichier .fmw avec la version. + $sFmwFilePath = $this->aProperties["workspace_dir"] . "/" . $this->sFmwFileName; + $sRepositoryFmwFileName = pathinfo($this->sFmwFileName, PATHINFO_FILENAME) . '_v' . $aWorkspace['version'] . '.' . pathinfo($this->sFmwFileName, PATHINFO_EXTENSION); + $sRepositoryFmwFilePath = $this->aProperties["workspace_dir"] . "/" . pathinfo($this->sFmwFileName, PATHINFO_DIRNAME) . "/" . $sRepositoryFmwFileName; + if (!file_exists($sRepositoryFmwFilePath)) { + copy($sFmwFilePath, $sRepositoryFmwFilePath); + // Supprime le fichier de l'ancienne version du projet (GTF + Fme Server). + if ($aWorkspace['version'] > 0) { + $sOldFmwFileName = pathinfo($this->sFmwFileName, PATHINFO_FILENAME) . '_v' . --$aWorkspace['version'] . '.' . pathinfo($this->sFmwFileName, PATHINFO_EXTENSION); + $sOldFmwFilePath = $this->aProperties["workspace_dir"] . "/" . pathinfo($this->sFmwFileName, PATHINFO_DIRNAME) . "/" . $sOldFmwFileName; + if (file_exists($sOldFmwFilePath)) + unlink($sOldFmwFilePath); + //$oFmeServer->serviceRequest('repositories/' . $sRepository . '/items/' . $sOldFmwFileName, 'delete'); + // S3 -> copie du fichier avec la dernière version et suppression de l'ancien. + if ($this->aProperties['fileS3Uploader'] === true) { + deleteFileFromWsDataDirTree('gtf', 'workspace', $aWorkspace['workspace_id'], 'fme', $sOldFmwFileName); + copyFileInWsDataDir ('gtf', 'workspace', $aWorkspace['workspace_id'], 'fme', pathinfo($this->sFmwFileName, PATHINFO_BASENAME), $sRepositoryFmwFileName); + } + } + } + // Upload du fichier .fmw. + if ($oFmeServer->uploadWorkspaceFile($sFmwFilePath, $sRepository, false, $sRepositoryFmwFileName) === false) + return false; + // Upload des fichiers sources. + foreach($aSourceFiles as $sParamName => $sParamValue) { + if ($this->uploadFileToResourceConnection($this->aProperties["upload_dir"] . "/" . $sParamValue, $sRepository, $sResource, $sPath) === false) + return false; + /* + // Upload de plusieurs fichiers sources (ex: contenu d'une archive .zip). + $aFiles = explode('|', $aFmeParameters[$sParamName]); + foreach ($aFiles as $sFilePath) { + if ($this->uploadFileToResourceConnection($sFilePath, $sRepository, $sResource, $sPath) === false) + return false; + } + */ + } + // Upload des ressources complémentaires du projet. + $sResourcesDirectory = $this->aProperties["workspace_dir"] . '/' . pathinfo($this->sFmwFileName, PATHINFO_DIRNAME); + if (is_dir($sResourcesDirectory)) { + foreach (scandir($sResourcesDirectory) as $sFileName) { + if (is_file($sResourcesDirectory . '/' . $sFileName) && array_search(pathinfo($sFileName, PATHINFO_EXTENSION), array('fmw', 'bak')) === false) { + if ($oFmeServer->uploadWorkspaceResourceFile($sResourcesDirectory . '/' . $sFileName, $sRepository, $sRepositoryFmwFileName, false) === false) + return false; + } + } + } + // Paramètres publiés dans les données de la requête. + $aJobParams = array('publishedParameters' => array()); + // Traitement asynchrone. + if ($bAsync) { + $aJobParams['NMDirectives'] = array( + 'successTopics' => array( + 'TEST_TOPIC_FRED' + ), + 'failureTopics' => array( + 'TEST_TOPIC_FRED' + ), + 'directives' => array( + array('name' => 'order_id', 'value' => $this->iDemandeId) + ) + //'subsection' => 'REST_SERVICE' + ); + } + // Chemins pour les paramètres publiés qui sont des fichiers. + foreach ($aFmeParameters as $sParamName => $sParamValue) { + if (array_key_exists($sParamName, $aSourceFiles)) { + $aFiles = explode('|', $sParamValue); + $aPublishedParametersFiles = array(); + foreach ($aFiles as $sFilePath) + $aPublishedParametersFiles[] = '$(' . $sResource . ')/' . $sPath . '/' . $sFilePath; + $aJobParams['publishedParameters'][] = array("name" => $sParamName, "value" => $aPublishedParametersFiles); + } + else if (in_array($sParamName, $aDestinationFiles)) + $aJobParams['publishedParameters'][] = array("name" => $sParamName, "value" => '$(' . $sResource . ')/' . $sPath . '/' . $this->sResultDirectoryName . '.zip/' . pathinfo($sParamValue, PATHINFO_BASENAME)); + else + $aJobParams['publishedParameters'][] = array("name" => $sParamName, "value" => $sParamValue); + } + // Envoi d'une demande sur un traitement. + $this->oJobResult = $oFmeServer->submitJob($sRepository, $sRepositoryFmwFileName, $aJobParams, $bAsync); + if ($this->oJobResult === false) + return false; + // Demande synchrone -> téléchargement des fichiers de log et de résultat du traitement. + if ($bAsync) { + $this->aJobDestinationFiles = $aDestinationFiles; + $this->sJobResource = $sResource; + $this->sJobPath = $sPath; + } + else { + $sZipFile = ''; + if (!empty($this->oJobResult->id)) + $sZipFile = $this->downloadFmeServerJobResult($this->oJobResult->id, $oFmeServer, $aDestinationFiles, $sResource, $sPath); + return $sZipFile; + } + } + + /** + * Init all the encryption parameters of the user. + */ + function initUserEncryptionParameters() { + // Paramètres de cryptage de l'utilisateur. + $sSql = 'SELECT "order".user_id, workspace.workspace_id, "user".login, "user".dataencrypt AS user_dataencrypt, workspace.dataencrypt AS workspace_dataencrypt, "user".secretkey FROM [sSchemaGtf].order LEFT JOIN [sSchemaFramework].user ON "order".user_id = "user".user_id LEFT JOIN [sSchemaGtf].workspace ON "order".workspace_id = workspace.workspace_id WHERE order_id = [iDemandeId]'; + $aParams = array(); + $aParams['sSchemaFramework'] = array('value' => $this->aProperties["schema_framework"], 'type' => 'schema_name'); + $aParams['sSchemaGtf'] = array('value' => $this->aProperties["schema_gtf"], 'type' => 'schema_name'); + $aParams['iDemandeId'] = array('value' => $this->iDemandeId, 'type' => 'number'); + $oPDOResult = $this->oBd->executeWithParams($sSql, $aParams); + if (!$this->oBd->enErreur()) { + $aUserEncryptParams = $this->oBd->ligneSuivante($oPDOResult); + if ($aUserEncryptParams['user_dataencrypt'] === true || $aUserEncryptParams['workspace_dataencrypt'] === true) { + // Le résultat de la demande sera crypté. + $this->bDataEncrypt = true; + // Clé secrète de l'utilisateur (sinon il faut la générer). + if ($aUserEncryptParams['user_dataencrypt'] === true && !empty($aUserEncryptParams['secretkey'])) + // Décryptage de la clé secrète (suppression des caractères "NULL"). + $this->sSecretKey = str_replace(chr(0), '', des($aUserEncryptParams['login'], hexToString($aUserEncryptParams['secretkey']), 0, 0)); + else { + // Génération de la clé secrète. + $this->sSecretKey = getUniqRandomId(); + // Envoi du mail avec la clé secrète générée. + $aObjects = array(); + $aObjects['oOrder'] = new OrderLib($this->oBd, $this->iDemandeId, $this->aProperties, "v_order"); + $aObjects['oOrder']->formatOrderEmail(); + $aObjects['oOrder']->sSecretKey = $this->sSecretKey; + $oEmail = new Email($this->oBd, -1, $this->aProperties, $aObjects); + if (!empty($oEmail->oEmailTemplate->name)) + $oEmail->send(); + } + } + } + else + writeToLog(INFO_USER_ENCRYPT_PARAMETERS . "(SQL : $sSql)", $this->sRobotLogFile); + } + + /** + * Upload a file to a resource connection on Fme Server. + * @param {string} $sFilePath Path of the file to upload. + * @param {string} $sRepository Name of the repository. + * @param {string} $sResource Name of a resource connection. + * @param {string} $sPath Path, relative to the resource connection. + */ + function uploadFileToResourceConnection($sFilePath, $sRepository, $sResource, $sPath) { + // Si un objet de la classe AmazonS3 existe, les ressources seront envoyées sur S3 puis téléchargéss dans FME Server. + if (empty($this->oAmazonS3)) { + if ($this->oFmeServer->uploadResourceFile($sFilePath, $sResource, $sPath, true, true) === false) + return false; + } + else { + // Upload d'un fichier source vers S3. + //$sS3Bucket = $this->aProperties['fme_cloud_s3_bucket']; + $sS3ObjectKey = $sPath . '/' . pathinfo($sFilePath, PATHINFO_BASENAME); + if ($this->oAmazonS3->uploadFile($this->sFmeServerS3Bucket, $sS3ObjectKey, $sFilePath) === false) + return false; + // Upload du fichier S3Downloader.fmw (si inexistant). + if ($this->oFmeServer->uploadWorkspaceFile($this->aProperties['workspace_dir'] . '/S3Downloader.fmw', $sRepository, false) === false) + return false; + // Téléchargement depuis FME Server du fichier envoyé sur S3. + $aS3Params = array( + 'access_key_id' => $this->oAmazonS3->sAwsAccessKeyId, + 'secret_access_key' => $this->oAmazonS3->sAwsSecretAccessKey, + 'bucket_name' => $this->sFmeServerS3Bucket, + 'object_key' => $sS3ObjectKey + ); + $oJobResult = $this->oFmeServer->uploadResourceFileFromS3($aS3Params, $sRepository, $sResource, $sPath); + if ($oJobResult === false) + return false; + } + } + function setUseExternalDbConnection ($bValue){ + if(is_bool($bValue)){ + $this->bUseExternalDbConnection = $bValue; + } + } + + /** + * get GTF parameters. + * @param {object} $oGtfFmwParser All the GUI. + * @return array + */ + function getGtfParameters($oGtfFmwParser) { + // Ajout des paramètres GTF_ s'ils sont associés à un paramètre publié du traitement. + $aGtfParams = array(); + foreach ($oGtfFmwParser->aGuiObject as $aGui) { + switch($aGui->sDefault_Macro) { + case 'GTF_ORDER_ID': + $aGtfParams['GTF_ORDER_ID'] = $this->iDemandeId; + break; + case 'GTF_SHARED_DIR': + $aGtfParams['GTF_SHARED_DIR'] = $this->aProperties["shared_dir"]; + break; + case 'GTF_CONNECTION_STRING': + if ($aGui->sType == "PASSWORD") { + $sServer = $this->aProperties["server"]; + $iPort = $this->aProperties["port"]; + if ($this->bUseExternalDbConnection){ + $sServer = $this->aProperties["connectionStringExternalIp"]; + $iPort = $this->aProperties["connectionStringExternalPort"]; + } + $aGtfParams['GTF_CONNECTION_STRING'] = $sServer . "," . $iPort . "," . $this->aProperties["database"] . "," . $this->aProperties["login_scheduler"] . "," . $this->aProperties["password_scheduler"]; + } + else + writeToLog(INFO_GTF_CONNECTION_STRING_TYPE_PASSWORD, $this->sRobotLogFile); + break; + case 'GTF_REST_URL': + $aGtfParams['GTF_REST_URL'] = $this->aProperties["web_server_name"] . "/" . $this->aProperties["services_alias"] . '/'; + break; + case 'GTF_USER_RESTRICTION': + // Restriction de l'utilisateur. + $sSql = 'SELECT "user".restriction FROM [sSchemaGtf].order LEFT JOIN [sSchemaFramework].user ON "order".user_id = "user".user_id WHERE order_id = [iDemandeId]'; + $aParams = array(); + $aParams['sSchemaFramework'] = array('value' => $this->aProperties["schema_framework"], 'type' => 'schema_name'); + $aParams['sSchemaGtf'] = array('value' => $this->aProperties["schema_gtf"], 'type' => 'schema_name'); + $aParams['iDemandeId'] = array('value' => $this->iDemandeId, 'type' => 'number'); + $oPDOResult = $this->oBd->executeWithParams($sSql, $aParams); + if (!$this->oBd->enErreur()) { + $aUserRestriction = $this->oBd->ligneSuivante($oPDOResult); + $aGtfParams['GTF_USER_RESTRICTION'] = $aUserRestriction['restriction']; + } + else + writeToLog(INFO_USER_RESTRICTION . "(SQL : $sSql)", $this->sRobotLogFile); + break; + } + } + return $aGtfParams; + } + + /** + * format a GUI occurrence (GtfGui). + * @param {object} $oGui GUI occurrence. + * @return string + */ + function formatGuiOccurrence($oGui) { + $aBaliseToReplace = array('<GTF_EQUAL>', '<GTF_PIPE>'); + $aReplacedBalise = array('=', '|'); + $sGTFOutput = str_replace($aBaliseToReplace, $aReplacedBalise, $this->aParametre[$oGui->sDefault_Macro]); + switch ($oGui->sType) { + case "FLOAT": + $sGTFOutput = str_replace(",", ".", $sGTFOutput); + if (!$this->isDecode($sGTFOutput)) + $sGTFOutput = $this->decoderFME($sGTFOutput); + break; + case "LOOKUP_CHOICE": + if (!$this->isEncode($sGTFOutput)) + $sGTFOutput = $this->encoderFME($sGTFOutput); + break; + case "TEXT_EDIT" : + case "TEXT_EDIT_OR_NUM" : + if (!$this->isEncode($sGTFOutput)) { + //$sGTFOutput = $this->decoderFME($sGTFOutput); + $sGTFOutput = $this->encoderFME($sGTFOutput); + } + break; + case "CHOICE": + case "LOOKUP_LISTBOX": + $sGTFOutput = str_replace('"', '""', $sGTFOutput); + if (!$this->isDecode($sGTFOutput)) + $sGTFOutput = $this->decoderFME($sGTFOutput); + break; + case "LISTBOX": + if ($this->bFmeServer) + $sGTFOutput = explode('<space>', $sGTFOutput); + else if (!$this->isDecode($sGTFOutput)) + $sGTFOutput = $this->decoderFME($sGTFOutput); + break; + default : + //$sGTFOutput = str_replace('"', '""', $sGTFOutput); + if (!$this->isDecode($sGTFOutput)) + $sGTFOutput = $this->decoderFME($sGTFOutput); + break; + } + return $sGTFOutput; + } + + /** + * Compress all the result files to a zip archive. + * @return string + */ + function zipResultFiles() { + // Tous les fichiers de résultat dans une archive .zip. + $bHasFile = $this->listDir($this->iDemandeId); + if ($this->sSourceTemp != "" && $this->aProperties["debug_mode"] == false) + clearDir($this->sSourceTemp); + if ($bHasFile) { + // Paramètres de cryptage de l'utilisateur. + $this->initUserEncryptionParameters(); + // + $sIsToZip = $this->CheckResult($this->iDemandeId); + $sDestUrl = $this->aProperties["url_export"] . "/gtf/" . $this->sResultDirectoryName; if ($sIsToZip == "") { - //Compression en zip des fichiers résultant. Le parametres Array() permet de filtrer les extensions à compresser. Exemples : Array("shp","shx","dbf") ; Array("*") - $sZipFile = $this->zipFile($sDestDir, $sDestDir, $sDestUrl, $this->iDemandeId); - $sZipFile = str_replace($sDestUrl, $sNewDir, $sZipFile); - } else { - $sZipFile = str_replace($sDestUrl, $sNewDir, $sIsToZip); + //Compression en zip des fichiers résultant. Le parametres Array() permet de filtrer les extensions à compresser. Exemples : Array("shp","shx","dbf") ; Array("*") + $sZipFile = $this->zipFile($this->sResultDirectoryPath, $this->sResultDirectoryPath, $sDestUrl, $this->iDemandeId); + $sZipFile = str_replace($sDestUrl, $this->sResultDirectoryName, $sZipFile); } - } else { - $sZipFile = ""; + else + $sZipFile = str_replace($sDestUrl, $this->sResultDirectoryName, $sIsToZip); } + else + $sZipFile = ""; return $sZipFile; } + + /** + * Create a directory for the result files. + * @return string + */ + function createResultDirectory() { + // Création du répertoire de sortie des données + if (!file_exists($this->aProperties["dir_export"] . '/gtf/')){ + mkdir($this->aProperties["dir_export"] . '/gtf/'); + } + Do { + $sResultDirectoryName = getUniqRandomId(); + $this->sResultDirectoryPath = $this->aProperties["dir_export"] . '/gtf/' . $sResultDirectoryName; + }while(file_exists($this->sResultDirectoryPath)); + // Création d'un répertoire pour le fichier de log FME. + mkdir($this->sResultDirectoryPath . '/log', 0777, true); + return $sResultDirectoryName; + } + + /** + * get GTF parameters. + * @param {object} $oGtfFmwParser All the GUI. + * @return array + */ + function getFmeParameters($oGtfFmwParser) { + $aTGui = array(); + $aFmeParameters = array(); + $bUsePattern = false; + foreach ($oGtfFmwParser->aGuiObject as $aGui) { + if ($aGui->sDefault_Macro != "") { + array_push($aTGui, $aGui); + } + if ($aGui->sDefault_Macro == "GTF_FORCE_PATTERN") { + if (strtolower($aGui->sDefaultValue) == "true"){ + $bUsePattern = true; + } + } + } + foreach ($aTGui as $oGui) { + //Teste si le paramètre est une source + if ($oGui->bIsSource) { + if ($this->aParametre[$oGui->sDefault_Macro] != "" && substr($this->aParametre[$oGui->sDefault_Macro], 0, 7) != "<quote>") { + $this->aParametre[$oGui->sDefault_Macro] = str_replace('//', '/', $this->aParametre[$oGui->sDefault_Macro]); + $sSourceFilePath = $this->aParametre[$oGui->sDefault_Macro]; + $sDirSource = $this->unZipSource($this->aParametre[$oGui->sDefault_Macro]); + $aSourceFiles = $this->getSourceParam($oGui, $oGtfFmwParser, $sDirSource, $bUsePattern); + // Test si le fichier source est un .zip. + $bZipSource = false; + if (strtolower(pathinfo($sSourceFilePath, PATHINFO_EXTENSION)) == 'zip') { + $bZipSource = true; + // Si le fichier n'est pas trouvé alors il se trouve dans le répertoire upload. + if (!file_exists($sSourceFilePath)) + $sSourceFilePath = $this->aProperties["upload_dir"] . "/" . $sSourceFilePath; + } + // Formatage des fichiers sources. + foreach ($aSourceFiles as $iIndex => $sSourceFile) { + // Si le fichier source est un .zip -> paramètre publié = [chemin de l'archive zip]/[nom du fichier]. + if ($bZipSource) { + if ($this->bFmeServer) { + $sSourceFile = str_replace($sDirSource, '', $sSourceFile); + $aSourceFiles[$iIndex] = pathinfo($sSourceFilePath, PATHINFO_BASENAME) . '/' . $sSourceFile; + } + else + $aSourceFiles[$iIndex] = '""' . str_replace($sDirSource, $sSourceFilePath, $sSourceFile) . '""'; + // Supprime l'archive décompressée. + clearDir($sDirSource); + } + else if ($this->bFmeServer) + $aSourceFiles[$iIndex] = pathinfo($sSourceFile, PATHINFO_BASENAME); + else + $aSourceFiles[$iIndex] = '""' . $sSourceFile . '""'; + // Supprime les doubles slashes. + $aSourceFiles[$iIndex] = str_replace('//', '/', $aSourceFiles[$iIndex]); + } + // Paramètre au format chaine de caractère. + if ($this->bFmeServer) + $this->aParametre[$oGui->sDefault_Macro] = implode('|', $aSourceFiles); + else + $this->aParametre[$oGui->sDefault_Macro] = '"' . implode('<space>', $aSourceFiles) . '"'; + } + } + if ($oGui->bIsDest) { + $sDest = $this->aParametre[$oGui->sDefault_Macro]; + $this->updateDestParam($oGui, $oGtfFmwParser, $sDest); + } -} + if ($this->aParametre[$oGui->sDefault_Macro] != "") { + if (!$oGui->bIsSource) { + // Protection des guillemets de chaque valeur pour qu'ils soient correctement envoyé à traitement.tcl + // Cette protection s'effectue uniquement pour les paramètre qui ne sont pas sources (un paramètre source est de ce type : """"param1"" ""param2"" ""param3"""" : les guillemets seraient donc protégé et cela fait planter l'exécution) + //$this->aParametre[$oGui->sDefault_Macro] = str_replace('"', '""', $this->aParametre[$oGui->sDefault_Macro]); + } + $sGTFOutput = $this->formatGuiOccurrence($oGui); + $aFmeParameters[$oGui->sDefault_Macro] = $sGTFOutput; + } + } + return $aFmeParameters; + } + + /** + * Cryptage d'une archive .zip. + * @param {string} $sZipFilePath Path to the zip archive File. + * @param {string} $sPassword Password for the zip archive. + * @return boolean + */ + function encryptZipArchiveFiles($sZipFilePath, $sPassword) { + $zip = new ZipArchive; + $res = $zip->open($sZipFilePath); + if ($res === true) { + for ($i = 0; $i < $zip->numFiles; $i++) { + $zip->setEncryptionIndex($i, ZipArchive::EM_AES_256, $sPassword); + } + $zip->close(); + return true; + } + else + return false; + } + + /** + * Return the path for the log file. + * @param {string} $sResultDirectoryPath Path to the result directory. + * @return string + */ + function getFmeLogFilePath($sResultDirectoryPath) { + return $sResultDirectoryPath . "/log/fme_" . $this->iDemandeId . ".log"; + } + + /** + * Return the record for a job on Fme Server. + * @param {string} $iJobId The id of the job. + * @param {object} $oFmeServer FmeServer object. + * @return object + */ + function getFmeServerJobRecord($iJobId, $oFmeServer) { + return $oFmeServer->serviceRequest('transformations/jobs/id/' . $iJobId, 'get'); + } + + /** + * Download Result and log files of a job on Fme Server. + * @param {number} $iJobId The od of the job. + * @param {object} $oFmeServer FmeServer object. + * @return object + */ + function downloadFmeServerJobResult($iJobId, $oFmeServer, $aDestinationFiles, $sResource, $sPath) { + $sZipFile = ''; + // Téléchargement du fichier de log. + if ($oFmeServer->getJobLog($this->oJobResult->id, $this->getFmeLogFilePath($this->sResultDirectoryPath)) === false) + return false; + // Sauve l'url de log fme. + $this->sLogFme = $this->getFmeLogFilePath($this->sResultDirectoryName); + $sSql = "UPDATE " . $this->aProperties['schema_gtf'] . ".order SET log_url='" . $this->sLogFme . "' WHERE order_id=" . $this->iDemandeId; + $this->oBd->execute($sSql); + // Téléchargement des fichiers de résultat (si traitement). + if ($this->oJobResult->status == 'SUCCESS') { + // Télécharge l'archive .zip contenant tous les fichiers de résultat. + if (!empty($aDestinationFiles)) { + if ($oFmeServer->downloadResourceFile($sResource, $sPath . '/' . $this->sResultDirectoryName . '.zip', $this->sResultDirectoryPath . '/' . $this->iDemandeId . '.zip') === false) + return false; + $sZipFile = $this->sResultDirectoryName . '/' . $this->iDemandeId . '.zip'; + // Paramètres de cryptage de l'utilisateur. + $this->initUserEncryptionParameters(); + // Cryptage de l'archive .zip de résultat. + if ($this->bDataEncrypt) + $this->encryptZipArchiveFiles($this->sResultDirectoryPath . '/' . $this->iDemandeId . '.zip', $this->sSecretKey); + } + // Log. du résultat + if (!empty($this->oJobResult->result)) + $sStatusMessage = $this->oJobResult->result->statusMessage; + else + $sStatusMessage = $this->oJobResult->statusMessage; + writeToLog(INFO_INFORM . 'FME| ' . $sStatusMessage, $this->sRobotLogFile); + writeToLog(INFO_SUCCESSFUL_TREATMENT, $this->sRobotLogFile); + /* + // Télécharge tous les fichiers de résultat. + foreach($aDestinationFiles as $sParamName) { + $sFileName = $aFmeParameters[$sParamName]; + $oFmeServer->downloadResourceFile($sResource, $sPath . '/' . $sFileName, $this->sResultDirectoryPath . '/' . $sFileName); + } + // Tous les fichiers de résultat dans une archive .zip. + $sZipFile = $this->zipResultFiles(); + */ + return $sZipFile; + } + else { + if (!empty($this->oJobResult->result)) + $sStatusMessage = $this->oJobResult->result->statusMessage; + else + $sStatusMessage = $this->oJobResult->statusMessage; + writeToLog(INFO_INFORM . 'FME| ' . $sStatusMessage, $this->sRobotLogFile); + return false; + } + } +} ?> diff --git a/src/module_gtf/gtf.engine/gtf.engines/cacert.pem b/src/module_gtf/gtf.engine/gtf.engines/cacert.pem new file mode 100755 index 0000000000000000000000000000000000000000..39ba33683c57f4edfc507b1d3dff0a894660d536 --- /dev/null +++ b/src/module_gtf/gtf.engine/gtf.engines/cacert.pem @@ -0,0 +1,3646 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Wed Sep 20 03:12:05 2017 GMT +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.27. +## SHA256: 2b2dbe5244e0047e088c597998883a913f6c5fffd1cb5c0fe5a368c8466cb2ec +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ +5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn +vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj +CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil +e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR +OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI +CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 +48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi +trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 +qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB +AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC +ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA +A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz ++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj +f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN +kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk +CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF +URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb +CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h +oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV +IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm +66+KAQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD +T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 +MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG +A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk +WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD +YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew +MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb +m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk +HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT +xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 +3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 +2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq +TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz +4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU +9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg +aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP +eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk +zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 +ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI +KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq +nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE +I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp +MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o +tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================ +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2007 +================================================= +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK +poRq0Tl9 +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +PSCProcert +========== +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk +ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ +MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz +dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl +cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw +IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw +MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w +DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD +ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp +Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC +wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA +3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh +RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO +EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 +0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU +td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw +Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp +r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ +AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz +Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId +xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp +ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH +EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h +Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k +ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG +9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG +MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG +LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 +ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy +YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o +dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq +T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN +g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q +uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 +n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn +FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo +5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq +3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 +poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y +eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +CA Disig Root R1 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy +3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 +u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 +m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk +CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa +YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 +vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL +LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX +ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is +XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ +04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B +LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM +CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb +VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 +YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS +ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix +lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N +UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ +a7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +WoSign +====== +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ +BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO +CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX +2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 +KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR ++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez +EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk +lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 +8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY +yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R +8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq +T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj +y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC +2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes +5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ +EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh +mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx +kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi +kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +WoSign China +============ +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv +geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD +VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k +8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 +uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 +dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 +Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy +b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc +76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m ++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 +yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX +GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA +A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY +r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 +j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A +kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 +qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y +jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB +ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv +T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO +kI26oQ== +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz +0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j +Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn +RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O ++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq +/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE +Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM +lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 +yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ +eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW +FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ +7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ +Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM +8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi +FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi +yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c +J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw +sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl +OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV +MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF +JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G3 +================================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y +olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t +x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy +EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K +Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur +mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 +1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp +07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo +FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE +41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu +yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq +KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 +v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA +8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b +8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r +mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq +1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI +JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV +tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= +-----END CERTIFICATE----- + +Staat der Nederlanden EV Root CA +================================ +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M +MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl +cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk +SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW +O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r +0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 +Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV +XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr +08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV +0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd +74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx +fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa +ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu +c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq +5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN +b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN +f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi +5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 +WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK +DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy +eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 +==================================================== +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg +RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw +ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w +SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE +n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp +ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537 +jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m +ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP +9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV +4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH +HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo +BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl +lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 +B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +Certinomis - Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg +LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx +EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD +ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos +P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo +d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap +z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 +8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x +RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE +6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t +FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV +PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH +i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj +YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I +6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV +WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw +Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX +lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ +y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 +Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng +DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi +I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM +cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr +hkIGuUE= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +Certification Authority of WoSign G2 +==================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx +CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai +XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du +W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9 +5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK +v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI +hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY +P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3 +TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu ++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+ +7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= +-----END CERTIFICATE----- + +CA WoSign ECC Root +================== +-----BEGIN CERTIFICATE----- +MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD +TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v +dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK +ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU +t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw +QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R +MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0 +Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu +a/GRspBl9JrmkO5K +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +Certplus Root CA G1 +=================== +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV +BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe +Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD +ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN +r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx +Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj +BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv +LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2 +z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc +4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd +4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj +jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+ +ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G +A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY +lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG +YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/ +2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F +6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX +CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe +tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC +VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/ ++mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+ +qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +Certplus Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT +AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x +NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0 +cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN +Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud +IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV +HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl +vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +OpenTrust Root CA G1 +==================== +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx +MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM +CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa +Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87 +ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO +YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9 +xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO +9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq +3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi +n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9 +URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr +TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px +N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv +uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK +n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh +X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80 +nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm +GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/ +bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o +4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA +OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx +-----END CERTIFICATE----- + +OpenTrust Root CA G2 +==================== +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy +MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM +CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+ +Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz +4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV +eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt +UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz +3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj +3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz +9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0 +0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT +y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59 +M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI +mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG +S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp +EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ +6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr +gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo +SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0 +YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm +u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK +-----END CERTIFICATE----- + +OpenTrust Root CA G3 +==================== +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X +DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w +ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B +ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf +BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM +BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta +3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +LuxTrust Global Root 2 +====================== +-----BEGIN CERTIFICATE----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG +A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh +bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW +MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm +Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2 +xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC +wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm +1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm +FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF +wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/ +a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U +ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ +MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB +/zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5 +Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ +FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN +H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW +7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu +ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA +VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR +TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt +/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc +7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I +iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- diff --git a/src/module_gtf/gtf.engine/gtf.engines/engine.exe b/src/module_gtf/gtf.engine/gtf.engines/engine.exe index 299a2bc1ca56950134511a6694772126a6f3c03c..dda7116dacf3dfdb9bbc35f07da7d6a9ac26d98b 100755 Binary files a/src/module_gtf/gtf.engine/gtf.engines/engine.exe and b/src/module_gtf/gtf.engine/gtf.engines/engine.exe differ diff --git a/src/module_gtf/gtf.engine/gtf.engines/engine.php b/src/module_gtf/gtf.engine/gtf.engines/engine.php index 70a33d3367b59ef821e172a0f9b9d13d36d9ef03..4d7af46b28a6d713874df20c94dfbeaeabcbf782 100755 --- a/src/module_gtf/gtf.engine/gtf.engines/engine.php +++ b/src/module_gtf/gtf.engine/gtf.engines/engine.php @@ -28,6 +28,12 @@ require_once("gtf_lib/gtf_object/Order.class.inc"); require_once("vmlib/error.inc"); require_once 'string.inc'; +require_once 'gtf_lib/FmeCloud.class.inc'; +require_once 'gtf_lib/FmeServer.class.inc'; +//require_once 'aws_lib/AmazonS3.class.inc'; +require_once 'gtf_lib/FmeCloudForGtf.class.inc'; + + loadLang("engines", $properties["language"]); if ($ErrorLicense == "0") { //writeToLog('|INFO |PHP| dump prop '. var_export($properties,true),$properties["engine_log_file"]); @@ -37,26 +43,42 @@ if ($ErrorLicense == "0") { //Connexion à la base de données de Données gtf : pas de mot de passe pour le robot $oBd = new BD($properties['login_scheduler'], $properties['password_scheduler'], $properties["database"], $properties["server"], $properties["port"], $properties["sgbd"], $properties["page_encoding"]); - //$oBd = new Vm ('admin', 'admin', $properties["database"], $properties["server"], $properties["port"], $properties["sgbd"], $properties["page_encoding"]); if ($oBd->erreurRencontree) { writeToLog(INFO_BASE_CONNECTION_ERROR . $properties["database"], $properties["engine_log_file"]); } else { writeToLog(INFO_BASE_CONNECTION . $properties["database"], $properties["engine_log_file"]); - //Recherche du Moteur V2 (ExecuteWithParams) - //Selection du chemin fme + // Données du moteur fme utilisé. $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $properties['schema_gtf'], 'type' => 'schema_name'); + $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); $aParams['gtf_engine_id'] = array('value' => $properties['id_gtf_engine'], 'type' => 'number'); - $oPDOResult = $oBd->executeWithParams($aSql['pgsql']['select_fme_path'], $aParams); + $oPDOResult4 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["getFmeEngine"], $aParams); + $aFmeEngine = $oBd->ligneSuivante($oPDOResult4); + + // Si stockage sur S3 -> fichiers du projet FME dans un répertoire temporaire. + if ($properties['fileS3Uploader'] === true) { + $properties["workspace_dir"] = $properties['extract_dir'] . '/workspace'; + if (!(file_exists($properties["workspace_dir"]))) + mkdir($properties["workspace_dir"], 0777, true); + } + + // Variables d'environnement. + if ($aFmeEngine['fme_engine_type_id'] == 'desktop') { + //Recherche du Moteur V2 (ExecuteWithParams) + //Selection du chemin fme + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties['schema_gtf'], 'type' => 'schema_name'); + $aParams['gtf_engine_id'] = array('value' => $properties['id_gtf_engine'], 'type' => 'number'); + $oPDOResult = $oBd->executeWithParams($aSql['pgsql']['select_fme_path'], $aParams); - if ($aRecord = $oBd->ligneSuivante($oPDOResult)) { - $properties["fme_path"] = $aRecord['fme_path']; - } else { - $properties["fme_path"] = ''; + if ($aRecord = $oBd->ligneSuivante($oPDOResult)) { + $properties["fme_path"] = $aRecord['fme_path']; + } else { + $properties["fme_path"] = ''; + } + putenv("FME_PATH=" . $properties["fme_path"]); + putenv("GTF_HOME=" . $properties["workspace_dir"] . "/"); } - putenv("FME_PATH=" . $properties["fme_path"]); - putenv("GTF_HOME=" . $properties["workspace_dir"] . "/"); /* // Traitement des demandes en fonction du moteur @@ -95,6 +117,7 @@ if ($ErrorLicense == "0") { if ($properties["nbr_order_max"] < 1) $properties["nbr_order_max"] = 1; $aParams['iNnbrOrderMax'] = array('value' => $properties["nbr_order_max"], 'type' => 'number'); + $aParams['sTimeZone'] = array('value' => str_replace('UTC', '', $properties["server_timezone"]), 'type' => 'string'); $sEnErreur = 2; @@ -103,641 +126,665 @@ if ($ErrorLicense == "0") { } else { // On est PAS en heure creuse $oPDOResult = $oBd->executeWithParams($aSql[$properties["sgbd"]]["boucle_2"], $aParams); } - + $bAsync = true; + $properties['running_jobs_file_path'] = __DIR__ . '/' . 'gtf_engine' . $properties["id_gtf_engine"] . '_jobid.txt'; + // Suppression des traitements asynchrones sur Fme Server dont les demandes ont été supprimées sur GTF. + //removeFmeServerDeletedJobs(); + // Traitement des demandes. while ($aDemande = $oBd->ligneSuivante($oPDOResult)) { - //test pour connaitre les nombres de tentatives de chaque demande - //if ($aDemande['attempt']>=1){ modif par og 26/04/13 - if ($properties["max_attempt"] == '') { - $properties["max_attempt"] = 2; - } - if ($aDemande['attempt'] >= $properties["max_attempt"]) { - writeToLog(str_replace("[aDemande['order_id']]", $aDemande['order_id'], INFO_TOO_MANY_ORDER_ATTEMPT), $properties["engine_log_file"]); - $iStatut = 4; - - /* - //Mise à jour de la demande. - $sDateTraitement = Date('Y-m-d H:i:s'); - $sSql = $aSql[$properties["sgbd"]]["update_demande"]; - $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); - $sSql = str_replace("[iStatut]", $iStatut, $sSql); - $sSql = str_replace("[iNbSec]", 0, $sSql); - $sSql = str_replace("[sMessage]", $sMessage, $sSql); - $sSql = str_replace("[sDateTraitement]", $sDateTraitement, $sSql); - $sSql = str_replace("[sResultat]", $sResultat, $sSql); - $sSql = str_replace("[sLogFme]", $sLogFme, $sSql); - - $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); - $oPDOResult2 = $oBd->execute($sSql); - // */ - - //Mise à jour de la demande V2 - // Requete d'update de la demande - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $properties['schema_gtf'], 'type' => 'schema_name'); - $aParams['iStatut'] = array('value' => $iStatut, 'type' => 'number'); - $aParams['iNbSec'] = array('value' => 0, 'type' => 'number'); - $aParams['sDateTraitement'] = array('value' => $sDateTraitement, 'type' => 'string'); - $aParams['sResultat'] = array('value' => $sResultat, 'type' => 'string'); - $aParams['sLogFme'] = array('value' => $sLogFme, 'type' => 'string'); - $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_demande"], $aParams); - - if ($oBd->erreurRencontree) { - writeToLog(INFO_ORDER_UPDATE_ERROR . "(SQL : $sSql)", $properties["engine_log_file"]); - } else { - writeToLog(INFO_ORDER_UPDATE, $properties["engine_log_file"]); - // La demande passe en cours - sendWebsocketMessage($properties['websocket_server'], $properties['websocket_port'], $properties['websocket_alias'], array( - 'action' => 'event', - 'service' => 'GtfEvents', - 'data' => array( - 'event' => 'order_started', - 'order' => array( - 'order_id' => $aDemande['order_id'], - 'order_status_id' => $aDemande['order_status_id'], - 'user_id' => $aDemande['user_id'], - 'workspace_id' => $aDemande['workspace_id'] - ) - ) - )); + try { + //test pour connaitre les nombres de tentatives de chaque demande + //if ($aDemande['attempt']>=1){ modif par og 26/04/13 + if ($properties["max_attempt"] == '') { + $properties["max_attempt"] = 2; } - $oPDOResult2 = $oBd->fermeResultat(); - } else { + if ($aDemande['attempt'] >= $properties["max_attempt"] || empty($aDemande['user_id'])) { + if ($aDemande['attempt'] >= $properties["max_attempt"]) + writeToLog(str_replace("[aDemande['order_id']]", $aDemande['order_id'], INFO_TOO_MANY_ORDER_ATTEMPT), $properties["engine_log_file"]); + else + writeToLog(str_replace("[aDemande['order_id']]", $aDemande['order_id'], INFO_NO_ASSOCIATED_USER), $properties["engine_log_file"]); + $iStatut = 4; + + //Mise à jour de la demande V2 + $sDateTraitement = gmdate('Y-m-d H:i:s'); + if (updateOrder($aDemande["order_id"], $iStatut, $sDateTraitement, null, 0)) { + writeToLog(INFO_ORDER_UPDATE, $properties["engine_log_file"]); + // Demande non traitable + sendWebsocketOrderStatusMessage('order_started', $iStatut); + } + //$oPDOResult2 = $oBd->fermeResultat(); + } else { - /* - //Vérification des droits de l'utilsateur - $sSql = $aSql[$properties["sgbd"]]["getLogin"]; - $sSql = str_replace("[sSchemaFramework]", $properties["schema_framework"], $sSql); - $sSql = str_replace("[iUserId]", $aDemande['user_id'], $sSql); - $oPDOResult2 = $oBd->execute($sSql); - // */ + /* + //Vérification des droits de l'utilsateur + $sSql = $aSql[$properties["sgbd"]]["getLogin"]; + $sSql = str_replace("[sSchemaFramework]", $properties["schema_framework"], $sSql); + $sSql = str_replace("[iUserId]", $aDemande['user_id'], $sSql); + $oPDOResult2 = $oBd->execute($sSql); + // */ - //Vérification des droits de l'utilsateur - // Recuperation des login et droits de l'utilisateur en cour - $aParams = array(); - $aParams['sSchemaFramework'] = array('value' => $properties["schema_framework"], 'type' => 'schema_name'); - $aParams['iUserId'] = array('value' => $aDemande['user_id'], 'type' => 'number'); - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["getLogin"], $aParams); - - $aUser = $oBd->ligneSuivante($oPDOResult2); - $sGroupListId = getUserGroupsEngines($aUser["login"], $oBd, $properties["mixed_rights_management"]); - // Mise à jour du nombre de tentative dans la base - $iTentative = $aDemande['attempt'] + 1; - $sTable = $properties["schema_gtf"] . ".order"; - $sChamp = "attempt"; - $sWhere = "order_id"; - $sListDemande = $aDemande['order_id']; - $oBd->updateLinkedTable($sTable, $sChamp, $sWhere, $sListDemande, $iTentative); - - // Mise à jour de l'état de la demande de traitement - $oBd->updateLinkedTable($sTable, "order_status_id", $sWhere, $sListDemande, 5); - - writeToLog(str_replace("[aDemande['order_id']]", $aDemande['order_id'], INFO_ORDER_PROCESSING), $properties["engine_log_file"]); - // OG 27/03/2013 for table job - $sBeginExecutionDate = Date('Y-m-d H:i:s'); - $date = new DateTime(); - $iTimeStampBegin = $date->getTimestamp(); // Pour calcul de la durée - // fin OG 27/03/2013 for job - // $sContenuMail = ""; - $iNbTraitement = $iNbTraitement + 1; - $aUserToRefresh[$iNbTraitement] = $aDemande['user_id']; - $aUserToRefresh[$iNbTraitement] = $aDemande['user_id']; - - /* - //Vérification si l'utilisateur a les droits pour faire une demande de ce traitement. - $sSql = $aSql[$properties["sgbd"]]["right_user"]; - $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); - $sSql = str_replace("[sGroupListId]", $sGroupListId, $sSql); - $oPDOResult2 = $oBd->execute($sSql); - // */ - - ///* - //Vérification si l'utilisateur a les droits pour faire une demande de ce traitement. - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); - $aParams['sGroupListId'] = array('value' => str_replace(',', '|', $sGroupListId), 'type' => 'group'); - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["right_user"], $aParams); - //*/ - - if ($oBd->erreurRencontree) { - writeToLog(INFO_REQUEST_ERROR . $sSql, $properties["engine_log_file"]); - writeToLog(INFO_PHP_ERROR, $properties["engine_log_file"]); - $sMessage = "Erreur SQL."; - // $sContenuMail = 'Votre demande de traitement "'.$aDemande['workspace_nom'].'" a échoué. Voici le message d\'erreur renvoyé : <br><font color="#FF0000">'.$sMessage.'</font><br>'; - $iStatut = $sEnErreur; - } else { - if ($sGroupListId == "0") { - $bAutorisationDemande = true; - } else { - $bAutorisationDemande = false; - while ($aTraitementsAutorise = $oBd->ligneSuivante($oPDOResult2)) { + //Vérification des droits de l'utilsateur + // Recuperation des login et droits de l'utilisateur en cour + $aParams = array(); + $aParams['sSchemaFramework'] = array('value' => $properties["schema_framework"], 'type' => 'schema_name'); + $aParams['iUserId'] = array('value' => $aDemande['user_id'], 'type' => 'number'); + $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["getLogin"], $aParams); - if ($aTraitementsAutorise['workspace_id'] == $aDemande['workspace_id']) { - $bAutorisationDemande = true; - } - } + $aUser = $oBd->ligneSuivante($oPDOResult2); + $sGroupListId = getUserGroupsEngines($aUser["login"], $oBd, $properties["mixed_rights_management"]); + // Mise à jour du nombre de tentative dans la base + $iTentative = $aDemande['attempt'] + 1; + updateOrderAttempt($aDemande['order_id'], $iTentative); + // Mise a jour du message + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); + $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); + $aParams['status'] = array('value' => 2, 'type' => 'number'); + $oPDOResult3 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_message"], $aParams); + //*/ + if ($oBd->erreurRencontree) { + writeToLog(INFO_TEST_REQUEST_ERROR . '(' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); } - if ($bAutorisationDemande == true) { - if (class_exists("Traitement.class.inc") == false) { - include_once ("Traitement.class.inc"); - } + // Fin - OG 27/03/2013 for table job + $oPDOResult3 = $oBd->fermeResultat(); + + // OG 27/03/2013 for table job + $sBeginExecutionDate = Date('Y-m-d H:i:s'); + $date = new DateTime(); + $iTimeStampBegin = $date->getTimestamp(); // Pour calcul de la durée + // fin OG 27/03/2013 for job + // $sContenuMail = ""; + $iNbTraitement = $iNbTraitement + 1; + $aUserToRefresh[$iNbTraitement] = $aDemande['user_id']; + $aUserToRefresh[$iNbTraitement] = $aDemande['user_id']; - /* - // recuperer le nom du fichier fmw a traiter - $sSql = $aSql[$properties["sgbd"]]["select_traitement"]; - $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); - $sSql = str_replace("[iWorkspaceId]", $aDemande['workspace_id'], $sSql); - $oPDOResult3 = $oBd->execute($sSql); - // */ + /* + //Vérification si l'utilisateur a les droits pour faire une demande de ce traitement. + $sSql = $aSql[$properties["sgbd"]]["right_user"]; + $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); + $sSql = str_replace("[sGroupListId]", $sGroupListId, $sSql); + $oPDOResult2 = $oBd->execute($sSql); + // */ - ///* - // recuperer le nom du fichier fmw a traiter - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); - $aParams['iWorkspaceId'] = array('value' => $aDemande['workspace_id'], 'type' => 'number'); - $oPDOResult3 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["select_traitement"], $aParams); - //*/ + ///* + //Vérification si l'utilisateur a les droits pour faire une demande de ce traitement. + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); + $aParams['sGroupListId'] = array('value' => str_replace(',', '|', $sGroupListId), 'type' => 'group'); + $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["right_user"], $aParams); + //*/ - $aTraitement = $oBd->ligneSuivante($oPDOResult3); - $iEmailTemplateId = $aTraitement['email_template_id']; - $oPDOResult3 = $oBd->fermeResultat(); - // $sSql = $aSql[$properties["sgbd"]]["select_transit_dir"]; - // $oPDOResult4 = $oBd->execute($sSql); - // $aAction = $oBd->ligneSuivante ($oPDOResult4); - // $properties["transit_dir"] = $aAction["value"]; - // $oPDOResult4 = $oBd->fermeResultat(); - //Lancement du traitement correspondant à la demande. - $aLicence = getFmeLicence($properties['fme_path']); - $bLicenceIsValid = $aLicence['valid']; - $aLicence['valid'] = 1; - if ($aLicence['valid'] == 1) { - $sDateDebut = new DateTime(date("Y-m-d H:i:s")); - $oTraitement = new Traitement($oBd, $aDemande['order_id'], $properties["engine_log_file"], $aDemande['wk_params'], $properties, $aDemande['workspace_id'] . "/fme/" . $aTraitement['fmw_file']); - - if (!$oTraitement->bErreur) { - $sResultat = $oTraitement->Process(); - $sDateFin = new DateTime(date("Y-m-d H:i:s")); - $sLogFme = $oTraitement->sLogFme; + if ($oBd->erreurRencontree) { + writeToLog(INFO_REQUEST_ERROR . $sSql, $properties["engine_log_file"]); + writeToLog(INFO_PHP_ERROR, $properties["engine_log_file"]); + $sMessage = "Erreur SQL."; + // $sContenuMail = 'Votre demande de traitement "'.$aDemande['workspace_nom'].'" a échoué. Voici le message d\'erreur renvoyé : <br><font color="#FF0000">'.$sMessage.'</font><br>'; + $iStatut = $sEnErreur; + } else { + if ($sGroupListId == "0") { + $bAutorisationDemande = true; + } else { + $bAutorisationDemande = false; + while ($aTraitementsAutorise = $oBd->ligneSuivante($oPDOResult2)) { + + if ($aTraitementsAutorise['workspace_id'] == $aDemande['workspace_id']) { + $bAutorisationDemande = true; + } + } + } + if ($bAutorisationDemande == true) { + if (class_exists("Traitement.class.inc") == false) { + include_once ("Traitement.class.inc"); } - //Gestion des erreurs. - if ($oTraitement->bFmeCrash) - $iStatut = 1; - elseif ($oTraitement->bErreur) { - if ($aTraitement["failed_action_id"] != "" && $oTraitement->sSource != "") { - $aSource = explode("/", $oTraitement->sSource); - $sSourceDirectory = $properties["upload_dir"] . $aSource[0]; - - if ($aTraitement["failed_action_id"] == 1) { - clearDir($sSourceDirectory); - writeToLog(INFO_DELETE_DIRECTORY . $sSourceDirectory . '.', $properties["engine_log_file"]); - } elseif ($aTraitement["failed_action_id"] == 2) { - /* - $sSql = $aSql[$properties["sgbd"]]["select_user"]; - $sSql = str_replace("[iUserId]", $aDemande['user_id'], $sSql); - $sSql = str_replace("[sSchemaFramework]", $properties["schema_framework"], $sSql); - $oPDOResult2 = $oBd->execute($sSql); - // */ - ///* - // Selection de l'utilisateur - $aParams = array(); - $aParams['iUserId'] = array('value' => $aDemande['user_id'], 'type' => 'number'); - $aParams['sSchemaFramework'] = array('value' => $properties["schema_framework"], 'type' => 'schema_name'); - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["select_user"], $aParams); - //*/ - if ($oBd->erreurRencontree) { - writeToLog(INFO_GET_USER_INFO_ERROR . $aDemande['user_id'] . ". (SQL = " . $sSql . ")", $properties["engine_log_file"]); - } else { - $aUser = $oBd->ligneSuivante($oPDOResult2); + /* + // recuperer le nom du fichier fmw a traiter + $sSql = $aSql[$properties["sgbd"]]["select_traitement"]; + $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); + $sSql = str_replace("[iWorkspaceId]", $aDemande['workspace_id'], $sSql); + $oPDOResult3 = $oBd->execute($sSql); + // */ - $sUser = userToFolder($aUser["name"]); - if (file_exists($properties["transit_dir"])) { - if (!file_exists($properties["transit_dir"] . "/failed/")) { - mkdir($properties["transit_dir"] . "/failed/"); - } - if (!file_exists($properties["transit_dir"] . "/failed/" . $sUser)) { - mkdir($properties["transit_dir"] . "/failed/" . $sUser); - } - if (!file_exists($properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"])) { - mkdir($properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"]); + ///* + // recuperer le nom du fichier fmw a traiter + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); + $aParams['iWorkspaceId'] = array('value' => $aDemande['workspace_id'], 'type' => 'number'); + $oPDOResult3 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["select_traitement"], $aParams); + //*/ + + $aTraitement = $oBd->ligneSuivante($oPDOResult3); + $iEmailTemplateId = $aTraitement['email_template_id']; + $oPDOResult3 = $oBd->fermeResultat(); + // $sSql = $aSql[$properties["sgbd"]]["select_transit_dir"]; + // $oPDOResult4 = $oBd->execute($sSql); + // $aAction = $oBd->ligneSuivante ($oPDOResult4); + // $properties["transit_dir"] = $aAction["value"]; + // $oPDOResult4 = $oBd->fermeResultat(); + + // Si stockage sur S3 -> Téléchargement de tous les fichiers du projet FME. + if ($properties['fileS3Uploader'] === true) { + if ($iTentative == 1) { + $sWorkspaceDir = $properties["workspace_dir"] . '/' . $aDemande['workspace_id']; + if (file_exists($sWorkspaceDir)) + clearDir($sWorkspaceDir); + if (mkdir($sWorkspaceDir . '/fme', 0777, true)) { + $aTree = getDirectoryInfosFromWsDataDir('gtf', 'workspace', $aDemande['workspace_id'], 'fme'); + if (!empty($aTree)) { + if (!empty($aTree[0]['content'])) { + foreach($aTree[0]['content'] as $aFile) { + $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $aDemande['workspace_id'], 'fme', $aFile['filename']); + file_put_contents($sWorkspaceDir . '/fme/' . $aFile['filename'], $sFmwFileContent); } - rename($sSourceDirectory, $properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"]); - writeToLog(str_replace('[sSourceDirectory]', $sSourceDirectory, INFO_MOVING_FILE) . $properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"] . '.', $properties["engine_log_file"]); - } else { - writeToLog(str_replace("[properties['transit_dir']]", $properties['transit_dir'], INFO_DIRECTORY_NOT_FOUND_ENGINE), $properties["engine_log_file"]); - $iStatut = $sEnErreur; } } } } - $sMessage = $oTraitement->sMessageErreur; - $iStatut = $sEnErreur; - $sResultat = ''; - // $sContenuMail = 'Votre demande de traitement "'.$aDemande['workspace_nom'].'" a échoué. Voici le message d\'erreur renvoyé : <br><font color="#FF0000">'.$sMessage.'</font><br>'; - // $sContenuMail .= "Contactez l'administrateur pour consulter le fichier de log du robot.<br>"; - $sLienLogFme = $sLogFme; - } else { - if ($aTraitement["success_action_id"] != "" && $oTraitement->sSource != "") { - $aSource = explode("/", $oTraitement->sSource); - $sSourceDirectory = $properties["upload_dir"] . $aSource[0]; - if ($aTraitement["success_action_id"] == 1) { - clearDir($sSourceDirectory); - writeToLog(INFO_DELETE_DIRECTORY . $sSourceDirectory . '.', $properties["engine_log_file"]); - } elseif ($aTraitement["success_action_id"] == 2) { - - /* - $sSql = $aSql[$properties["sgbd"]]["select_user"]; - $sSql = str_replace("[iUserId]", $aDemande['user_id'], $sSql); - $sSql = str_replace("[sSchemaFramework]", $properties["schema_framework"], $sSql); - $oPDOResult2 = $oBd->execute($sSql); - // */ - ///* - //Selection de l'utilisateur - $aParams = array(); - $aParams['iUserId'] = array('value' => $aDemande['user_id'], 'type' => 'number'); - $aParams['sSchemaFramework'] = array('value' => $properties["schema_framework"], 'type' => 'schema_name'); - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["select_user"], $aParams); - //*/ - - if ($oBd->erreurRencontree) { - writeToLog(INFO_GET_USER_INFO_ERROR . $aDemande['user_id'] . ". (SQL = " . $sSql . ")", $properties["engine_log_file"]); - } else { - $aUser = $oBd->ligneSuivante($oPDOResult2); - - $sUser = userToFolder($aUser["name"]); - if (file_exists($properties["transit_dir"])) { - if (!file_exists($properties["transit_dir"] . "/success/")) { - mkdir($properties["transit_dir"] . "/success/"); - } - if (!file_exists($properties["transit_dir"] . "/success/" . $sUser)) { - mkdir($properties["transit_dir"] . "/success/" . $sUser); + } + + //Lancement du traitement correspondant à la demande. + $bValidFmeLicence = false; + switch($aFmeEngine['fme_engine_type_id']) { + // Traitement exécuté par une occurrence de FME Cloud via l'api rest. + case 'fme_cloud_for_gtf': + $oFmeCloudForGtf = new FmeCloudForGtf($aFmeEngine['iam_access_key_id'], $aFmeEngine['iam_secret_access_key'], $aFmeEngine['s3_region'], 'u0jtg81u4c', 'te', $properties['gtf_instance_id']); + break; + // Traitement exécuté par une occurrence de FME Server sur Fme Cloud. + case 'fme_cloud': + $oFmeCloud = new FmeCloud($aFmeEngine['server_url'], $aFmeEngine['fme_cloud_api_token']); + $oFmeCloud->sLogFilePath = $properties["engine_log_file"]; + $sMessage = ''; + // Liste des occurrences de FME Server. + $aFmeServerInstances = $oFmeCloud->serviceRequest('instances'); + if (!empty($aFmeServerInstances)) { + foreach($aFmeServerInstances as $oInstance) { + if ($oInstance->name == $aFmeEngine['fme_server_instance_name']) + $oFmeServerInstance = $oInstance; + } + if (empty($oFmeServerInstance)) { + // Aucune instace active -> mise à jour de la demande (En erreur). + writeToLog(INFO_FME_CLOUD_INSTANCE_NOT_FOUND, $properties["engine_log_file"]); + updateOrder($aDemande["order_id"], 2, gmdate('Y-m-d H:i:s')); + sendWebsocketOrderStatusMessage('order_finished_or_error', 2); + // Envoi un mail de résultat. + sendOrderResultEmail($iEmailTemplateId); + writeToLog(INFO_END_ORDER_PROCESSING, $properties["engine_log_file"]); + // Demande suivante. + continue 2; + } + else { + writeToLog(INFO_FME_CLOUD_INSTANCE_STATUS . $oFmeServerInstance->state, $properties["engine_log_file"]); + // Démarrage de l'occurence si elle est en pause. + if ($oFmeServerInstance->state == 'PAUSED') { + $oFmeCloud->startInstance($oFmeServerInstance->id); + writeToLog(INFO_LAUNCHING_FME_CLOUD_INSTANCE, $properties["engine_log_file"]); + // Nombre de tentative = 0 (instance en pause). + updateOrderAttempt($aDemande["order_id"], 0); + // Demande suivante. + continue 2; + } + else if ($oFmeServerInstance->state == 'RUNNING') { + writeToLog(INFO_FME_CLOUD_INSTANCE_RUNNING, $properties["engine_log_file"]); + // Etat de la demande -> en cours. + $oBd->updateLinkedTable($properties["schema_gtf"] . ".order", "order_status_id", "order_id", $aDemande['order_id'], 5); + sendWebsocketOrderStatusMessage('order_started', 5); + if (processFmeServerOrder('https://' . $oFmeServerInstance->public_ip, $aFmeEngine['login'], $aFmeEngine['password']) === false) + continue 2; + /* + // Stockage Amazon S3 qui contiendra les fichiers sources pour le traitement FME. + $oAmazonS3 = new AmazonS3($aFmeEngine['s3_access_key_id'], $aFmeEngine['s3_secret_access_key'], $aFmeEngine['s3_region']); + $oAmazonS3->sLogFilePath = $properties["engine_log_file"]; + $oTraitement->sFmeServerS3Bucket = $aFmeEngine['fme_server_s3_bucket']; + */ + // Mise en pause de l'occurence. + //$oFmeCloud->pauseInstance($oFmeServerInstance->id); + } + else { + // Nombre de tentative = 0 (instance en cours de démarrage). + updateOrderAttempt($aDemande["order_id"], 0); + // Demande suivante. + continue 2; + } + } + } + else { + // Aucune instace active -> mise à jour de la demande. + writeToLog(INFO_NO_FME_CLOUD_INSTANCES, $properties["engine_log_file"]); + updateOrder($aDemande["order_id"], 2, gmdate('Y-m-d H:i:s')); + sendWebsocketOrderStatusMessage('order_finished_or_error', 2); + // Envoi un mail de résultat. + sendOrderResultEmail($iEmailTemplateId); + writeToLog(INFO_END_ORDER_PROCESSING, $properties["engine_log_file"]); + // Demande suivante. + continue 2; + } + break; + // Traitement exécuté par un serveur fme via l'api rest. + case 'fme_server': + // Mise à jour de l'état de la demande de traitement (en cours). + $oBd->updateLinkedTable($properties["schema_gtf"] . ".order", "order_status_id", "order_id", $aDemande['order_id'], 5); + sendWebsocketOrderStatusMessage('order_started', 5); + writeToLog(str_replace("[aDemande['order_id']]", $aDemande['order_id'], INFO_ORDER_PROCESSING), $properties["engine_log_file"]); + // Lancement du traitement. + if (processFmeServerOrder($aFmeEngine['server_url'], $aFmeEngine['login'], $aFmeEngine['password']) === false) + continue 2; + break; + // Traitement exécuté par un fme local. + case 'desktop': + $aLicence = getFmeLicence($properties['fme_path']); + $bLicenceIsValid = $aLicence['valid']; + if ($aLicence['valid'] == 1) { + $bValidFmeLicence = true; + $sDateDebut = new DateTime(date("Y-m-d H:i:s")); + $oTraitement = new Traitement($oBd, $aDemande['order_id'], $properties["engine_log_file"], $aDemande['wk_params'], $properties, $aDemande['workspace_id'] . "/fme/" . $aTraitement['fmw_file']); + if (!$oTraitement->bErreur) { + $oTraitement->setUseExternalDbConnection($aFmeEngine['useexternaldbconnection']); + // Mise à jour de l'état de la demande de traitement (en cours). + $oBd->updateLinkedTable($properties["schema_gtf"] . ".order", "order_status_id", "order_id", $aDemande['order_id'], 5); + sendWebsocketOrderStatusMessage('order_started', 5); + writeToLog(str_replace("[aDemande['order_id']]", $aDemande['order_id'], INFO_ORDER_PROCESSING), $properties["engine_log_file"]); + // Maj du pid dans la base. + $sPidFilePath = realpath(dirname($_SERVER['SCRIPT_FILENAME']) . '/pid_' . $properties["id_gtf_engine"] . '.txt'); + if (file_exists($sPidFilePath)) { + $iPid = file_get_contents($sPidFilePath); + if (is_numeric($iPid)) + updateOrderPid($aDemande['order_id'], $iPid); + } + // Lancement du traitement. + $sResultat = $oTraitement->Process(); + $sDateFin = new DateTime(date("Y-m-d H:i:s")); + $sLogFme = $oTraitement->sLogFme; + } + //Gestion des erreurs. + + if ($oTraitement->bFmeCrash) + $iStatut = 1; + elseif ($oTraitement->bErreur) { + if ($aTraitement["failed_action_id"] != "" && $oTraitement->sSource != "") { + $aSource = explode("/", $oTraitement->sSource); + $sSourceDirectory = $properties["upload_dir"] . $aSource[0]; + + if ($aTraitement["failed_action_id"] == 1) { + clearDir($sSourceDirectory); + writeToLog(INFO_DELETE_DIRECTORY . $sSourceDirectory . '.', $properties["engine_log_file"]); + } elseif ($aTraitement["failed_action_id"] == 2) { + /* + $sSql = $aSql[$properties["sgbd"]]["select_user"]; + $sSql = str_replace("[iUserId]", $aDemande['user_id'], $sSql); + $sSql = str_replace("[sSchemaFramework]", $properties["schema_framework"], $sSql); + $oPDOResult2 = $oBd->execute($sSql); + // */ + ///* + // Selection de l'utilisateur + $aParams = array(); + $aParams['iUserId'] = array('value' => $aDemande['user_id'], 'type' => 'number'); + $aParams['sSchemaFramework'] = array('value' => $properties["schema_framework"], 'type' => 'schema_name'); + $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["select_user"], $aParams); + //*/ + if ($oBd->erreurRencontree) { + writeToLog(INFO_GET_USER_INFO_ERROR . $aDemande['user_id'] . ". (SQL = " . $sSql . ")", $properties["engine_log_file"]); + } else { + $aUser = $oBd->ligneSuivante($oPDOResult2); + + $sUser = userToFolder($aUser["name"]); + if (file_exists($properties["transit_dir"])) { + if (!file_exists($properties["transit_dir"] . "/failed/")) { + mkdir($properties["transit_dir"] . "/failed/"); + } + if (!file_exists($properties["transit_dir"] . "/failed/" . $sUser)) { + mkdir($properties["transit_dir"] . "/failed/" . $sUser); + } + if (!file_exists($properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"])) { + mkdir($properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"]); + } + rename($sSourceDirectory, $properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"]); + writeToLog(str_replace('[sSourceDirectory]', $sSourceDirectory, INFO_MOVING_FILE) . $properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"] . '.', $properties["engine_log_file"]); + } else { + writeToLog(str_replace("[properties['transit_dir']]", $properties['transit_dir'], INFO_DIRECTORY_NOT_FOUND_ENGINE), $properties["engine_log_file"]); + $iStatut = $sEnErreur; + } + } } - if (!file_exists($properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"])) { - mkdir($properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"]); + } + $sMessage = $oTraitement->sMessageErreur; + $iStatut = $sEnErreur; + $sResultat = ''; + // $sContenuMail = 'Votre demande de traitement "'.$aDemande['workspace_nom'].'" a échoué. Voici le message d\'erreur renvoyé : <br><font color="#FF0000">'.$sMessage.'</font><br>'; + // $sContenuMail .= "Contactez l'administrateur pour consulter le fichier de log du robot.<br>"; + $sLienLogFme = $sLogFme; + } else { + if ($aTraitement["success_action_id"] != "" && $oTraitement->sSource != "") { + $aSource = explode("/", $oTraitement->sSource); + $sSourceDirectory = $properties["upload_dir"] . $aSource[0]; + if ($aTraitement["success_action_id"] == 1) { + clearDir($sSourceDirectory); + writeToLog(INFO_DELETE_DIRECTORY . $sSourceDirectory . '.', $properties["engine_log_file"]); + } elseif ($aTraitement["success_action_id"] == 2) { + + /* + $sSql = $aSql[$properties["sgbd"]]["select_user"]; + $sSql = str_replace("[iUserId]", $aDemande['user_id'], $sSql); + $sSql = str_replace("[sSchemaFramework]", $properties["schema_framework"], $sSql); + $oPDOResult2 = $oBd->execute($sSql); + // */ + ///* + //Selection de l'utilisateur + $aParams = array(); + $aParams['iUserId'] = array('value' => $aDemande['user_id'], 'type' => 'number'); + $aParams['sSchemaFramework'] = array('value' => $properties["schema_framework"], 'type' => 'schema_name'); + $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["select_user"], $aParams); + //*/ + + if ($oBd->erreurRencontree) { + writeToLog(INFO_GET_USER_INFO_ERROR . $aDemande['user_id'] . ". (SQL = " . $sSql . ")", $properties["engine_log_file"]); + } else { + $aUser = $oBd->ligneSuivante($oPDOResult2); + + $sUser = userToFolder($aUser["name"]); + if (file_exists($properties["transit_dir"])) { + if (!file_exists($properties["transit_dir"] . "/success/")) { + mkdir($properties["transit_dir"] . "/success/"); + } + if (!file_exists($properties["transit_dir"] . "/success/" . $sUser)) { + mkdir($properties["transit_dir"] . "/success/" . $sUser); + } + if (!file_exists($properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"])) { + mkdir($properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"]); + } + rename($sSourceDirectory, $properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"]); + writeToLog(str_replace('[sSourceDirectory]', $sSourceDirectory, INFO_MOVING_FILE) . $properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"] . '.', $properties["engine_log_file"]); + } else { + writeToLog(str_replace("[properties['transit_dir']]", $properties['transit_dir'], INFO_DIRECTORY_NOT_FOUND_ENGINE), $properties["engine_log_file"]); + $iStatut = $sEnErreur; + } + } } - rename($sSourceDirectory, $properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"]); - writeToLog(str_replace('[sSourceDirectory]', $sSourceDirectory, INFO_MOVING_FILE) . $properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"] . '.', $properties["engine_log_file"]); - } else { - writeToLog(str_replace("[properties['transit_dir']]", $properties['transit_dir'], INFO_DIRECTORY_NOT_FOUND_ENGINE), $properties["engine_log_file"]); - $iStatut = $sEnErreur; } + $sMessage = ""; + $iStatut = 3; + $sLienLogFme = $sLogFme; } + $bDataEncrypt = $oTraitement->bDataEncrypt; + unset($oTraitement); } - } - $sMessage = ""; - $iStatut = 3; - // $sContenuMail = "Votre demande de traitement '".$aDemande['workspace_nom']."' a réussi.<br>"; - if ($sResultat != "") { - // $sContenuMail .= '<A href="'.$properties["url_export"]."/".$sResultat.'">Télécharger le résultat</A><br>'; - $sLienResultat = $sResultat; - } - $sLienLogFme = $sLogFme; + break; } - unset($oTraitement); + // Licence invalide. + if (!$bValidFmeLicence) { + $iTentative = $iTentative - 1; + updateOrderAttempt($aDemande['order_id'], $iTentative); + writeToLog(INFO_INVALID_FME_LICENCE_FILE, $properties["engine_log_file"]); + writeToLog(INFO_CONTACT_ADMINISTRATOR, $properties["engine_log_file"]); + $sMessage = "Invalid FME licence file. "; + // $sContenuMail = 'Votre demande de traitement "'.$aDemande['workspace_nom'].'" a échoué. Voici le message d\'erreur renvoyé : <br><font color="#FF0000">'.$sMessage.'</font><br>'; + $iStatut = 1; + $sLienLogFme = 'Non disponible'; + } + } else { - $iTentative = $iTentative - 1; - $sTable = $properties["schema_gtf"] . ".order"; - $sChamp = "attempt"; - $sWhere = "order_id"; - $sListDemande = $aDemande['order_id']; - $oBd->updateLinkedTable($sTable, $sChamp, $sWhere, $sListDemande, $iTentative); - writeToLog(INFO_INVALID_FME_LICENCE_FILE, $properties["engine_log_file"]); + writeToLog(INFO_NO_USER_GRANT . $aDemande['workspace_nom'] . ' n\'a pas été défini.', $properties["engine_log_file"]); writeToLog(INFO_CONTACT_ADMINISTRATOR, $properties["engine_log_file"]); - $sMessage = "Invalid FME licence file. "; + $sMessage = "Vous n''avez pas les droits nécessaires pour réaliser ce traitement."; // $sContenuMail = 'Votre demande de traitement "'.$aDemande['workspace_nom'].'" a échoué. Voici le message d\'erreur renvoyé : <br><font color="#FF0000">'.$sMessage.'</font><br>'; - $iStatut = 1; - $sLienLogFme = 'Non disponible'; - } - } else { - writeToLog(INFO_NO_USER_GRANT . $aDemande['workspace_nom'] . ' n\'a pas été défini.', $properties["engine_log_file"]); - writeToLog(INFO_CONTACT_ADMINISTRATOR, $properties["engine_log_file"]); - $sMessage = "Vous n''avez pas les droits nécessaires pour réaliser ce traitement."; - // $sContenuMail = 'Votre demande de traitement "'.$aDemande['workspace_nom'].'" a échoué. Voici le message d\'erreur renvoyé : <br><font color="#FF0000">'.$sMessage.'</font><br>'; - $iStatut = 6; + $iStatut = 6; - if (file_exists($sLogFme)) { - $sLienLogFme = $sLogFme; - } else { - $sLienLogFme = 'Non disponible'; + if (file_exists($sLogFme)) { + $sLienLogFme = $sLogFme; + } else { + $sLienLogFme = 'Non disponible'; + } } } - } - $oPDOResult2 = $oBd->fermeResultat(); + $oPDOResult2 = $oBd->fermeResultat(); - //Mise à jour de la demande. + //Mise à jour de la demande. - if ($iStatut == 3) { - /* - $sSql = $aSql[$properties["sgbd"]]["update_message"]; - $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); - $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); - $oPDOResult2 = $oBd->execute($sSql); - // */ - ///* - // Mise a jour du message - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); - $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_message"], $aParams); - //*/ - if ($oBd->erreurRencontree) { - writeToLog(INFO_TEST_REQUEST_ERROR . '(' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); + if ($iStatut == 3) { + /* + $sSql = $aSql[$properties["sgbd"]]["update_message"]; + $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); + $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); + $oPDOResult2 = $oBd->execute($sSql); + // */ + ///* + // Mise a jour du message + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); + $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); + $aParams['status'] = array('value' => 1, 'type' => 'number'); + $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_message"], $aParams); + //*/ + if ($oBd->erreurRencontree) { + writeToLog(INFO_TEST_REQUEST_ERROR . '(' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); + } + // Fin - OG 27/03/2013 for table job + $oPDOResult2 = $oBd->fermeResultat(); } - // Fin - OG 27/03/2013 for table job - $oPDOResult2 = $oBd->fermeResultat(); - } - if ($iStatut == 2 || $iStatut == 4) { + if ($iStatut == 2 || $iStatut == 4) { - /* - $sSql = $aSql[$properties["sgbd"]]["delete_message"]; - $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); - $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); - $oPDOResult2 = $oBd->execute($sSql); - // */ - ///* - - // Mise a jour du message - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); - $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_message"], $aParams); - //*/ + /* + $sSql = $aSql[$properties["sgbd"]]["delete_message"]; + $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); + $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); + $oPDOResult2 = $oBd->execute($sSql); + // */ + ///* - if ($oBd->erreurRencontree) { - writeToLog(INFO_TEST_REQUEST_ERROR . '(' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); - } - // Fin - OG 27/03/2013 for table job - $oPDOResult2 = $oBd->fermeResultat(); - } - $sDateTraitement = Date('Y-m-d H:i:s'); - - /* - $sSql = $aSql[$properties["sgbd"]]["update_demande"]; - $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); - if ($iStatut != 1) { - $timeFirst = strtotime(date_format($sDateDebut, 'Y-m-d H:i:s')); - $timeSecond = strtotime(date_format($sDateFin, 'Y-m-d H:i:s')); - $diff = $timeSecond - $timeFirst; - $iNbSec = $diff; - } else { - $iNbSec = "NULL"; - } - // OG 27/03/2013 for table job - $date = new DateTime(); - $iTimeStampEnd = $date->getTimestamp(); - $iDelay = $iTimeStampEnd - $iTimeStampBegin; - $sSql = str_replace("[iNbSec]", $iDelay, $sSql); - $sSql = str_replace("[$iStatut]", $iStatut, $sSql); - /* $sSql = str_replace("[sMessage]", $sMessage, $sSql); *//* - $sSql = str_replace("[sDateTraitement]", $sDateTraitement, $sSql); - $sSql = str_replace("[sResultat]", utf8_encode($sResultat), $sSql); - $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); - if ($sLogFme == "") { - $sSql = str_replace("'[sLogFme]'", "NULL", $sSql); - } else { - $sSql = str_replace("[sLogFme]", $sLogFme, $sSql); - } + // Mise a jour du message + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); + $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); + $aParams['status'] = array('value' => 1, 'type' => 'number'); + $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_message"], $aParams); + //*/ - $oPDOResult2 = $oBd->execute($sSql); - //*/ - - //* - // Mise a jour de la demande - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); - if ($iStatut != 1) { - $timeFirst = strtotime(date_format($sDateDebut, 'Y-m-d H:i:s')); - $timeSecond = strtotime(date_format($sDateFin, 'Y-m-d H:i:s')); - $diff = $timeSecond - $timeFirst; - $iNbSec = $diff; - } else { - $iNbSec = "NULL"; - } - // OG 27/03/2013 for table job - $date = new DateTime(); - $iTimeStampEnd = $date->getTimestamp(); - $iDelay = $iTimeStampEnd - $iTimeStampBegin; - $aParams['iNbSec'] = array('value' => $iDelay, 'type' => 'number'); - $aParams['iStatut'] = array('value' => $iStatut, 'type' => 'number'); - $aParams['sDateTraitement'] = array('value' => $sDateTraitement, 'type' => 'string'); - $aParams['sResultat'] = array('value' => utf8_encode($sResultat), 'type' => 'string'); - $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); - if ($sLogFme == "") { - $aParams['sLogFme'] = array('value' => "NULL", 'type' => 'string'); - } else { - $aParams['sLogFme'] = array('value' => $sLogFme, 'type' => 'string'); - } - - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_demande"], $aParams); - // */ - - - if ($oBd->erreurRencontree) { - writeToLog(INFO_ORDER_UPDATE_ERROR . '(' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); - } else { - writeToLog(INFO_ORDER_UPDATE, $properties["engine_log_file"]); - // La demande est terminée avec un résultat - sendWebsocketMessage($properties['websocket_server'], $properties['websocket_port'], $properties['websocket_alias'], array( - 'action' => 'event', - 'service' => 'GtfEvents', - 'data' => array( - 'event' => 'order_finished_with_result', - 'order' => array( - 'order_id' => $aDemande['order_id'], - 'order_status_id' => $aDemande['order_status_id'], - 'user_id' => $aDemande['user_id'], - 'workspace_id' => $aDemande['workspace_id'] - ) - ) - )); - } - if ($iStatut != 1) { - /* - $sSql = $aSql[$properties["sgbd"]]["insertJob"]; - $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); - $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); - $sSql = str_replace("[iWorkspaceId]", $aDemande["workspace_id"], $sSql); - $sSql = str_replace("[iUserId]", $aDemande['user_id'], $sSql); - $sSql = str_replace("[sBeginExecutionDate]", $sBeginExecutionDate, $sSql); - $sSql = str_replace("[iDelay]", $iDelay, $sSql); - $sSql = str_replace("[iGtfEngineId]", $properties["id_gtf_engine"], $sSql); - $sSql = str_replace("[iStatut]", $iStatut, $sSql); - //writeToLog('|INFORM|PHP|Test requête OG : '.$sSql,$properties["engine_log_file"]); - $oPDOResult2 = $oBd->execute($sSql); - // */ - ///* - // Insert de schemaGtf - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); - $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); - $aParams['iWorkspaceId'] = array('value' => $aDemande["workspace_id"], 'type' => 'number'); - $aParams['iUserId'] = array('value' => $aDemande['user_id'], 'type' => 'number'); - $aParams['sBeginExecutionDate'] = array('value' => $sBeginExecutionDate, 'type' => 'string'); - $aParams['iDelay'] = array('value' => $iDelay, 'type' => 'number'); - $aParams['iGtfEngineId'] = array('value' => $properties["id_gtf_engine"], 'type' => 'number'); - $aParams['iDelay'] = array('value' => $iDelay, 'type' => 'number'); - $aParams['iStatut'] = array('value' => $iStatut, 'type' => 'number'); - //writeToLog('|INFORM|PHP|Test requête OG : '.$sSql,$properties["engine_log_file"]); - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["insertJob"], $aParams); - //*/ - if ($oBd->erreurRencontree) { - writeToLog(INFO_TEST_REQUEST_ERROR . '(' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); + if ($oBd->erreurRencontree) { + writeToLog(INFO_TEST_REQUEST_ERROR . '(' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); + } + // Fin - OG 27/03/2013 for table job + $oPDOResult2 = $oBd->fermeResultat(); } - // Fin - OG 27/03/2013 for table job - $oPDOResult2 = $oBd->fermeResultat(); - } - // Mise à jour de la demande si resultat est vide - if ($sResultat == "") { + $sDateTraitement = gmdate('Y-m-d H:i:s'); /* - $sSql = $aSql[$properties["sgbd"]]["update_demande_resultat_null"]; - $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); - $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); - $oPDOResult2 = $oBd->execute($sSql); - // */ - - ///* - // Mise a jour de la demande si resultat null - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); - $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_demande_resultat_null"], $aParams); - //*/ - - if ($oBd->erreurRencontree) { - writeToLog(INFO_ORDER_UPDATE_ERROR . ' (' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); + $sSql = $aSql[$properties["sgbd"]]["update_demande"]; + $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); + if ($iStatut != 1) { + $timeFirst = strtotime(date_format($sDateDebut, 'Y-m-d H:i:s')); + $timeSecond = strtotime(date_format($sDateFin, 'Y-m-d H:i:s')); + $diff = $timeSecond - $timeFirst; + $iNbSec = $diff; } else { - writeToLog(INFO_INFO_ORDER_UPDATE_NULL, $properties["engine_log_file"]); - // La demande est terminée où en erreur - sendWebsocketMessage($properties['websocket_server'], $properties['websocket_port'], $properties['websocket_alias'], array( - 'action' => 'event', - 'service' => 'GtfEvents', - 'data' => array( - 'event' => 'order_finished_or_error', - 'order' => array( - 'order_id' => $aDemande['order_id'], - 'order_status_id' => $aDemande['order_status_id'], - 'user_id' => $aDemande['user_id'], - 'workspace_id' => $aDemande['workspace_id'] - ) - ) - )); + $iNbSec = "NULL"; + } + // OG 27/03/2013 for table job + $date = new DateTime(); + $iTimeStampEnd = $date->getTimestamp(); + $iDelay = $iTimeStampEnd - $iTimeStampBegin; + $sSql = str_replace("[iNbSec]", $iDelay, $sSql); + $sSql = str_replace("[$iStatut]", $iStatut, $sSql); + /* $sSql = str_replace("[sMessage]", $sMessage, $sSql); *//* + $sSql = str_replace("[sDateTraitement]", $sDateTraitement, $sSql); + $sSql = str_replace("[sResultat]", utf8_encode($sResultat), $sSql); + $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); + if ($sLogFme == "") { + $sSql = str_replace("'[sLogFme]'", "NULL", $sSql); + } else { + $sSql = str_replace("[sLogFme]", $sLogFme, $sSql); } - $oPDOResult2 = $oBd->fermeResultat(); - } - // Notification par e-mail. - $bMailToSend = false; - switch (strtoupper(trim($aDemande['email_option_id']))) { - case 1: - $bMailToSend = True; - break; - case 2: - $bMailToSend = False; - break; - case 3: - if ($iStatut == $sEnErreur) { - $bMailToSend = True; - } - break; - case 4: - if ($iStatut != $sEnErreur) { - $bMailToSend = True; - } - break; - default: - $bMailToSend = True; - } + $oPDOResult2 = $oBd->execute($sSql); + //*/ - // Licence invalide. - if ($iStatut == 2 && !$bLicenceIsValid) { - // Mise à jour de l'état de la demande de traitement (en attente). - $oBd->updateLinkedTable($properties["schema_gtf"] . ".order", "order_status_id", "order_id", $aDemande['order_id'], 1); - // Licence invalide : 1 mail par jour max. - $sToday = date('d/m/Y'); - $sMailLicenceFile = __DIR__ . '\mail_licence.txt'; - if (file_exists($sMailLicenceFile)) - if (file_get_contents($sMailLicenceFile) == $sToday) - $bMailToSend = false; - file_put_contents($sMailLicenceFile, $sToday); - // Mise à jour du nombre de tentative dans la base. - $oBd->updateLinkedTable($properties["schema_gtf"] . ".order", "attempt", "order_id", $aDemande['order_id'], 0); - } - - // Envoi du mail. - if ($bMailToSend == true) { - /* - $sSql = $aSql[$properties["sgbd"]]["select_user"]; - $sSql = str_replace("[iUserId]", $aDemande['user_id'], $sSql); - $sSql = str_replace("[sSchemaFramework]", $properties["schema_framework"], $sSql); - $oPDOResult2 = $oBd->execute($sSql); - // */ - ///* - - //Mise a jour de la demande si resultat null - /* + //* + // Mise a jour de la demande $aParams = array(); - $aParams['iOrderId'] = array('value' => $aDemande['order_id'], 'type' => 'number'); $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); - $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_demande_resultat_null"], $aParams); - if ($oBd->erreurRencontree) { - writeToLog(INFO_GET_USER_INFO_ERROR . $aDemande['user_id'] . ". (SQL = " . $sSql . ")", $properties["engine_log_file"]); - } else { - */ - // $aUser = $oBd->ligneSuivante ($oPDOResult2); - // $sContenuMail = "Bonjour ".$aUser["name"].",<br><br><br>".$sContenuMail; - // $sContenuMail .= "<br><br><cite><h6>Cet e-mail a été envoyé par un robot, merci de ne pas répondre.</h6></cite><br>"; - // - - if (empty($iEmailTemplateId)) - $iEmailTemplateId = $properties['default_mail_model']; + if ($iStatut != 1) { + $timeFirst = strtotime(date_format($sDateDebut, 'Y-m-d H:i:s')); + $timeSecond = strtotime(date_format($sDateFin, 'Y-m-d H:i:s')); + $diff = $timeSecond - $timeFirst; + $iNbSec = $diff; + } else + $iNbSec = "NULL"; + // OG 27/03/2013 for table job + $date = new DateTime(); + $iTimeStampEnd = $date->getTimestamp(); + $iDelay = $iTimeStampEnd - $iTimeStampBegin; + if (updateOrder($aDemande["order_id"], $iStatut, $sDateTraitement, $sLogFme, $iDelay, $sResultat)) { + writeToLog(INFO_ORDER_UPDATE, $properties["engine_log_file"]); + // La demande est terminée avec un résultat + sendWebsocketOrderStatusMessage('order_finished_with_result', $aDemande['order_status_id']); + } + if ($iStatut != 1) { + /* + $sSql = $aSql[$properties["sgbd"]]["insertJob"]; + $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); + $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); + $sSql = str_replace("[iWorkspaceId]", $aDemande["workspace_id"], $sSql); + $sSql = str_replace("[iUserId]", $aDemande['user_id'], $sSql); + $sSql = str_replace("[sBeginExecutionDate]", $sBeginExecutionDate, $sSql); + $sSql = str_replace("[iDelay]", $iDelay, $sSql); + $sSql = str_replace("[iGtfEngineId]", $properties["id_gtf_engine"], $sSql); + $sSql = str_replace("[iStatut]", $iStatut, $sSql); + //writeToLog('|INFORM|PHP|Test requête OG : '.$sSql,$properties["engine_log_file"]); + $oPDOResult2 = $oBd->execute($sSql); + // */ + ///* + // Insert de schemaGtf + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); + $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); + $aParams['iWorkspaceId'] = array('value' => $aDemande["workspace_id"], 'type' => 'number'); + $aParams['iUserId'] = array('value' => $aDemande['user_id'], 'type' => 'number'); + $aParams['sBeginExecutionDate'] = array('value' => $sBeginExecutionDate, 'type' => 'string'); + $aParams['iDelay'] = array('value' => $iDelay, 'type' => 'number'); + $aParams['iGtfEngineId'] = array('value' => $properties["id_gtf_engine"], 'type' => 'number'); + $aParams['iDelay'] = array('value' => $iDelay, 'type' => 'number'); + $aParams['iStatut'] = array('value' => $iStatut, 'type' => 'number'); + //writeToLog('|INFORM|PHP|Test requête OG : '.$sSql,$properties["engine_log_file"]); + $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["insertJob"], $aParams); + //*/ + if ($oBd->erreurRencontree) { + writeToLog(INFO_TEST_REQUEST_ERROR . '(' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); + } + // Fin - OG 27/03/2013 for table job + $oPDOResult2 = $oBd->fermeResultat(); + } + // Mise à jour de la demande si resultat est vide + if ($sResultat == "") { /* - // Nom des moteurs GTF et FME - $sSql = $aSql[$properties["sgbd"]]["get_gtf_engine_name"]; + $sSql = $aSql[$properties["sgbd"]]["update_demande_resultat_null"]; $sSql = str_replace("[sSchemaGtf]", $properties["schema_gtf"], $sSql); - $sSql = str_replace('[gtf_engine_id]', $aDemande['gtf_engine_id'], $sSql); + $sSql = str_replace("[iOrderId]", $aDemande["order_id"], $sSql); $oPDOResult2 = $oBd->execute($sSql); // */ + ///* - // Nom des moteurs GTF et FME + // Mise a jour de la demande si resultat null $aParams = array(); $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); - $aParams['gtf_engine_id'] = array('value' => $aDemande['gtf_engine_id'], 'type' => 'number'); - $oPDOResult2 = $oBd->executeWithParams($sSql = $aSql[$properties["sgbd"]]["get_gtf_engine_name"], $aParams); + $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); + $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_demande_resultat_null"], $aParams); //*/ + if ($oBd->erreurRencontree) { + writeToLog(INFO_ORDER_UPDATE_ERROR . ' (' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); + } else { + writeToLog(INFO_INFO_ORDER_UPDATE_NULL, $properties["engine_log_file"]); + // La demande est terminée où en erreur + sendWebsocketOrderStatusMessage('order_finished_or_error', $aDemande['order_status_id']); + } + $oPDOResult2 = $oBd->fermeResultat(); + } + // Notification par e-mail. + $bMailToSend = false; + switch (strtoupper(trim($aDemande['email_option_id']))) { + case 1: + $bMailToSend = True; + break; + case 2: + $bMailToSend = False; + break; + case 3: + if ($iStatut == $sEnErreur) { + $bMailToSend = True; + } + break; + case 4: + if ($iStatut != $sEnErreur) { + $bMailToSend = True; + } + break; + default: + $bMailToSend = True; + } + + // Licence invalide. + if ($iStatut == 2 && !$bLicenceIsValid) { + // Mise à jour de l'état de la demande de traitement (en attente). + $oBd->updateLinkedTable($properties["schema_gtf"] . ".order", "order_status_id", "order_id", $aDemande['order_id'], 1); + // Licence invalide : 1 mail par jour max. + $sToday = date('d/m/Y'); + $sMailLicenceFile = __DIR__ . '\mail_licence.txt'; + if (file_exists($sMailLicenceFile)) + if (file_get_contents($sMailLicenceFile) == $sToday) + $bMailToSend = false; + file_put_contents($sMailLicenceFile, $sToday); + // Mise à jour du nombre de tentative dans la base. + updateOrderAttempt($aDemande['order_id'], 0); + } + + // Envoi du mail. + if ($bMailToSend == true) { + /* + $sSql = $aSql[$properties["sgbd"]]["select_user"]; + $sSql = str_replace("[iUserId]", $aDemande['user_id'], $sSql); + $sSql = str_replace("[sSchemaFramework]", $properties["schema_framework"], $sSql); + $oPDOResult2 = $oBd->execute($sSql); + // */ + ///* + + //Mise a jour de la demande si resultat null + /* + $aParams = array(); + $aParams['iOrderId'] = array('value' => $aDemande['order_id'], 'type' => 'number'); + $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); + $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_demande_resultat_null"], $aParams); + // if ($oBd->erreurRencontree) { - writeToErrorLog(ERROR_0001); - } else - $aRow = $oBd->ligneSuivante($oPDOResult2); - - // URL de téléchargement du résultat - $sResultUrl = ''; - if ($sResultat != "") - $sResultUrl = '<a href="' . $properties["url_export"] . "/gtf/" . $sResultat . '">Télécharger le résultat</a>'; - - // Dates - $sOrderDate = date_format(date_create($aDemande['order_date']), 'd/m/Y H:i:s'); - - // Envoi du mail - $aObjects = array(); - if (!empty($sMessage)) - $aObjects['error'] = $sMessage; - $aObjects['oOrder'] = new OrderLib($oBd, $aDemande["order_id"], $properties, "v_order"); - $aObjects['oOrder']->formatOrderEmail(); - $oEmail = new Email($oBd, $iEmailTemplateId, $properties, $aObjects); - if (!empty($oEmail->oEmailTemplate->name)) - $oEmail->send(); - //} - $oPDOResult2 = $oBd->fermeResultat(); - } else { - // pas d'envoi de mail - writeToLog(INFO_NO_MAIL_SEND, $properties["engine_log_file"]); - } - } //fin du if sur les tentatives - //fin de while + writeToLog(INFO_GET_USER_INFO_ERROR . $aDemande['user_id'] . ". (SQL = " . $sSql . ")", $properties["engine_log_file"]); + } else { + */ + // $aUser = $oBd->ligneSuivante ($oPDOResult2); + // $sContenuMail = "Bonjour ".$aUser["name"].",<br><br><br>".$sContenuMail; + // $sContenuMail .= "<br><br><cite><h6>Cet e-mail a été envoyé par un robot, merci de ne pas répondre.</h6></cite><br>"; + // + // Envoi du mail + sendOrderResultEmail($iEmailTemplateId, $sMessage); + //} + $oPDOResult2 = $oBd->fermeResultat(); + } else { + // pas d'envoi de mail + writeToLog(INFO_NO_MAIL_SEND, $properties["engine_log_file"]); + } + } //fin du if sur les tentatives + //fin de while + } + catch (Exception $e) { + writeToErrorLog($e->getMessage()); + // Mise a jour du message + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties["schema_gtf"], 'type' => 'schema_name'); + $aParams['iOrderId'] = array('value' => $aDemande["order_id"], 'type' => 'number'); + $aParams['status'] = array('value' => 1, 'type' => 'number'); + $oPDOResult2 = $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_message"], $aParams); + // Mise a jour de la demande. + updateOrder($aDemande["order_id"], 2, gmdate('Y-m-d H:i:s'), null, 0); + sendWebsocketOrderStatusMessage('order_finished_or_error', 2); + } } if ($iNbTraitement >= 1) { //Crée ou modifie le fichier de maj de l'application pour l'utilisateur. @@ -784,4 +831,423 @@ function TesteHeureCreuse($sHeureMin, $sHeureMax) { } } +/** + * Mise à jour d'une demande. + * @param {number} $iOrderId Id de la demande. + * @param {number} $iStatut Statut de la demande. + * @param {string} $sExecutionDate Date de la demande. + * @param {number} $iNbSec Durée de la demande en secondes. + * @param {string} $sResultUrl Url du résultat de la demande. + * @param {string} $sLogUrl Url du log de la demande. + */ +function updateOrder($iOrderId, $iStatut, $sExecutionDate, $sLogUrl = null, $iNbSec = null, $sResultUrl = null) { + // Variables globales. + global $oBd, $properties, $aSql, $aDemande; + // Suppression du répertoire temporaire du projet. + if ($properties['fileS3Uploader'] === true) { + $aStatus = array(2, 3, 4, 6, 7); + if (in_array($iStatut, $aStatus)) { + $sWorkspacePath = $properties['workspace_dir'] . '/' . $aDemande['workspace_id']; + if (file_exists($sWorkspacePath)) + clearDir($sWorkspacePath); + } + } + // Requete d'update de la demande. + if (empty($sLogUrl)) + $sLogUrl = null; + if (empty($sResultUrl)) + $sResultUrl = null; + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties['schema_gtf'], 'type' => 'schema_name'); + $aParams['iOrderId'] = array('value' => $iOrderId, 'type' => 'number'); + $aParams['iStatut'] = array('value' => $iStatut, 'type' => 'number'); + $aParams['sDateTraitement'] = array('value' => $sExecutionDate, 'type' => 'string'); + $aParams['iNbSec'] = array('value' => $iNbSec, 'type' => 'number'); + $aParams['sResultat'] = array('value' => $sResultUrl, 'type' => 'string'); + $aParams['sLogFme'] = array('value' => $sLogUrl, 'type' => 'string'); + $oBd->executeWithParams($aSql[$properties["sgbd"]]["update_demande"], $aParams); + if ($oBd->erreurRencontree) { + writeToLog(INFO_ORDER_UPDATE_ERROR . '(' . $oBd->getBDMessage() . ')', $properties["engine_log_file"]); + return false; + } + else + return true; +} + +/** + * Envoi un mail de résultat du traitement FME. + * @param {number} $iEmailTemplateId Id du template de mail. + * @param {string} $sMessage Message. + */ +function sendOrderResultEmail($iEmailTemplateId, $sMessage = '') { + // Variables globales. + global $oBd, $properties, $aDemande, $oTraitement; + if (!empty($oTraitement)) + $oTraitement = $oTraitement; + // Envoi du mail + $aObjects = array(); + if (!empty($sMessage)) + $aObjects['error'] = $sMessage; + $aObjects['oOrder'] = new OrderLib($oBd, $aDemande["order_id"], $properties, "v_order"); + $aObjects['oOrder']->formatOrderEmail(); + if (!empty($oTraitement)) + $aObjects['oOrder']->aFields['bDataEncrypt'] = $oTraitement->bDataEncrypt; + $aObjects['oOrder']->aFields['sApplicationUrl'] = $properties['web_server_name'] . '/' . $properties['application_name']; + if (empty($iEmailTemplateId)) + $iEmailTemplateId = $properties['default_mail_model']; + $oEmail = new Email($oBd, $iEmailTemplateId, $properties, $aObjects); + if (!empty($oEmail->oEmailTemplate->name)) + $oEmail->send(); +} + +/** + * Mise à jour du nombre de tentatives de la demande. + * @param {number} $iOrderId Id de la demande. + * @param {number} $iAttempt Nombre de tentatives. + */ +function updateOrderAttempt($iOrderId, $iAttempt) { + // Variables globales. + global $oBd, $properties; + // Mise à jour du nombre de tentatives de la demande. + $oBd->updateLinkedTable($properties["schema_gtf"] . ".order", "attempt", "order_id", $iOrderId, $iAttempt); +} + +/** + * Envoi un message au websocket contenant le statut de la demande. + * @param {string} $sEvent Nom de l'évènement. + * @param {number} $iStatut Statut de la demande. + */ +function sendWebsocketOrderStatusMessage($sEvent, $iStatut) { + // Variables globales. + global $properties, $aDemande; + // Envoi du message. + sendWebsocketMessage($properties['websocket_server'], $properties['websocket_port'], $properties['websocket_alias'], array( + 'action' => 'event', + 'service' => 'GtfEvents', + 'data' => array( + 'event' => $sEvent, + 'order' => array( + 'order_id' => $aDemande['order_id'], + 'order_status_id' => $iStatut, + 'user_id' => $aDemande['user_id'], + 'workspace_id' => $aDemande['workspace_id'] + ) + ) + )); +} + +/** + * Ajoute un traitement asynchrone en cours d'exécution. + * @param {object} $oTraitement Objet de la classe Traitement. + * @param {string} $sServerUrl Url to Fme Server. + * @param {string} $sLogin User login. + * @param {string} $sPassword User password. + */ +function addFmeServerRunningJob($oTraitement, $sServerUrl, $sLogin, $sPassword) { + // Variables globales. + global $properties, $aDemande, $aFmeEngine; + // Liste des demandes asynchrones en cours. + $aRunningJobs = getFmeServerRunningJobs(); + // Paramètres de la demande asynchrone à ajouter. + $aRunningJob = array( + 'order_id' => $aDemande['order_id'], + 'fme_engine_type_id' => $aFmeEngine['fme_engine_type_id'], + 'job_id' => $oTraitement->oJobResult->id, + 'result_directory_name' => $oTraitement->sResultDirectoryName, + 'result_directory_path' => $oTraitement->sResultDirectoryPath, + 'destination_files' => $oTraitement->aJobDestinationFiles, + 'resource' => $oTraitement->sJobResource, + 'path' => $oTraitement->sJobPath, + 'fme_server_url' => $sServerUrl, + 'login' => $sLogin, + 'password' => $sPassword + ); + $aRunningJobs[] = $aRunningJob; + // Sauve la liste. + file_put_contents($properties['running_jobs_file_path'], serialize($aRunningJobs)); + // Mise à jour du job id. + updateOrderPid($aDemande['order_id'], $oTraitement->oJobResult->id); +} + +/** + * Retourne la liste des traitements asynchrones en cours d'exécution. + * return array + */ +function getFmeServerRunningJobs() { + // Variables globales. + global $properties; + // Retourne la liste des demandes asynchrones en cours ou un tableau vide. + if (file_exists($properties['running_jobs_file_path'])) + return unserialize(file_get_contents($properties['running_jobs_file_path'])); + else + return array(); +} + +/** + * Vérification de la présence d'un traitement dans la liste des traitements asynchrones en cours d'exécution. + * @param {number} $iOrderId Id de la demande en cours. + * @param {array} $aRunningJobs Tableau contenant la liste des traitements asynchrones en cours d'exécution. + * return boolean + */ +function isFmeServerJobRunning($iOrderId, $aRunningJobs) { + foreach ($aRunningJobs as $aRunningJob) { + if ($aRunningJob['order_id'] == $iOrderId) + return true; + } + return false; +} + +/** + * Retourne les infos d'un traitement asynchrones en cours d'exécution. + * @param {number} $iOrderId I de la demande en cours. + * @param {array} $aRunningJobs Tableau contenant la liste des traitements asynchrones en cours d'exécution. + * return array + */ +function getFmeServerRunningJob($iOrderId, $aRunningJobs) { + foreach ($aRunningJobs as $aRunningJob) { + if ($aRunningJob['order_id'] == $iOrderId) + return $aRunningJob; + } + return false; +} + +/** + * Supprime un traitement asynchrone en cours d'exécution. + * @param {number} $iOrderId Id de la demande en cours. + */ +function removeFmeServerRunningJob($iOrderId, $oFmeServer = null) { + // Variables globales. + global $properties; + // Liste des demandes asynchrones en cours. + $iJobIndex = null; + $aRunningJobs = getFmeServerRunningJobs(); + foreach ($aRunningJobs as $iIndex => $aRunningJob) { + if ($aRunningJob['order_id'] == $iOrderId) { + $iJobIndex = $iIndex; + break; + } + } + // Sauve la liste. + if ($iJobIndex !== null) { + // Sauve la liste des demandes asynchrones en cours. + $aRunningJob = array_splice($aRunningJobs, $iJobIndex, 1)[0]; + if (empty($aRunningJobs)) + unlink($properties['running_jobs_file_path']); + else + file_put_contents($properties['running_jobs_file_path'], serialize($aRunningJobs)); + // Supprime le job id. + //updateOrderPid($iOrderId); + // Ecriture dans les logs. + writeToLog(INFO_FME_SERVER_ASYNCHRONOUS_JOB_REMOVED_FROM_LIST . " (demande $iOrderId).", $properties["engine_log_file"]); + // Supprime le traitement sur Fme Server. + if (is_object($oFmeServer)) { + if (!empty($aRunningJob['job_id'])) + $oFmeServer->deleteJob($aRunningJob['job_id']); + // Supprime le répertoire des ressources de la demande sur Fme Server. + if (!empty($aRunningJob['resource']) && !empty($aRunningJob['path'])) + $oFmeServer->serviceRequest('resources/connections/' . $aRunningJob['resource'] . '/filesys/' . $aRunningJob['path'], 'delete'); + } + } +} + +/** + * Traitement d'une demande sur Fme Server. + * @param {string} $sServerUrl Url to Fme Server. + * @param {string} $sLogin User login. + * @param {string} $sPassword User password. + * return boolean + */ +function processFmeServerOrder($sServerUrl, $sLogin, $sPassword) { + // Variables globales utilisées. + global $oFmeServer, $properties, $oBd, $aFmeEngine, $aDemande, $aTraitement, $aUser, $iEmailTemplateId, $bAsync, $sEnErreur, $iTentative, $sDateDebut, $sDateFin; + // Variables globales modifiées. + global $oTraitement, $sMessage, $bValidFmeLicence, $sResultat, $sLogFme, $iStatut, $sLienLogFme; + // Paramètres de connexion vers Fme Server pour la demande (si elle est dans la liste des traitements asynchrones en cours). + $aRunningJobs = getFmeServerRunningJobs(); + $aRunningJob = getFmeServerRunningJob($aDemande['order_id'], $aRunningJobs); + if ($aRunningJob !== false) { + $sServerUrl = $aRunningJob['fme_server_url']; + $sLogin = $aRunningJob['login']; + $sPassword = $aRunningJob['password']; + } + // + $oFmeServer = new FmeServer($sServerUrl, $sLogin, $sPassword, 'day', 1); + $oFmeServer->sLogFilePath = $properties["engine_log_file"]; + $sMessage = ''; + // Statut de la licence Fme Server (pas pour Fme Cloud). + $oLicenseStatus = ''; + if ($aFmeEngine['fme_engine_type_id'] == 'fme_server') + $oLicenseStatus = $oFmeServer->serviceRequest('licensing/license/status'); + if ($oLicenseStatus === false) + return false; + else if ($aFmeEngine['fme_engine_type_id'] == 'fme_cloud' || (!empty($oLicenseStatus) && $oLicenseStatus->isLicensed === true && $oLicenseStatus->isLicenseExpired === false)) { + $bValidFmeLicence = true; + $oTraitement = new Traitement($oBd, $aDemande['order_id'], $properties["engine_log_file"], $aDemande['wk_params'], $properties, $aDemande['workspace_id'] . "/fme/" . $aTraitement['fmw_file']); + $oTraitement->bFmeServer = true; + // Demande suivante si le traitement est déja en cours d'exécution. + if ($aRunningJob !== false) { + // Chemin et nom du répertoire de résultat déja crée. + $oTraitement->sResultDirectoryName = $aRunningJob['result_directory_name']; + $oTraitement->sResultDirectoryPath = $aRunningJob['result_directory_path']; + // Vérification du statut de la demande. + $oJobRecord = $oTraitement->getFmeServerJobRecord($aRunningJob['job_id'], $oFmeServer); + // Si le job id n'existe pas : 2 essais puis suppression de la demande dans la liste des traitements asynchrones en cours -> non traitable. + if ($oFmeServer->aLastCurlRequestInfo['http_code'] == 404) { + if ($iTentative >= $properties["max_attempt"]) + removeFmeServerRunningJob($aDemande['order_id']); + } + if ($oJobRecord === false) { + return false; + } + $oTraitement->oJobResult = $oJobRecord; + $aRunningStatus = array('SUBMITTED', 'QUEUED', 'DELAYED', 'PAUSED', 'IN_PROCESS', 'PULLED'); + $aErrorStatus = array('DELETED', 'ABORTED', 'FME_FAILURE', 'JOB_FAILURE'); + writeToLog(INFO_FME_SERVER_JOB_STATUS . $oJobRecord->status, $properties["engine_log_file"]); + // En cours de traitement. + if (in_array($oJobRecord->status, $aRunningStatus)) { + writeToLog(INFO_FME_SERVER_ASYNCHRONOUS_JOB_IN_PROGRESS, $properties["engine_log_file"]); + // Nombre de tentative = 0 (traitement en cours d'exécution). + updateOrderAttempt($aDemande["order_id"], 0); + return false; + } + else { + // Supprime la demande dans la liste des traitements asynchrones en cours. + removeFmeServerRunningJob($aDemande['order_id']); + // Télécharge les fichiers de log (et le résultat si présent). + $sResultat = $oTraitement->downloadFmeServerJobResult($aRunningJob['job_id'], $oFmeServer, $aRunningJob['destination_files'], $aRunningJob['resource'], $aRunningJob['path']); + $oDateDebut = date_create($oJobRecord->timeStarted); + $oDateFin = date_create($oJobRecord->timeFinished); + // Terminé en erreur. + if (in_array($oJobRecord->status, $aErrorStatus) || $sResultat === false) { + updateOrder($aDemande["order_id"], 2, $oJobRecord->timeStarted, $oTraitement->sLogFme, date_diff($oDateDebut, $oDateFin)->format('%s')); + sendWebsocketOrderStatusMessage('order_finished_or_error', 2); + // Envoi d'un mail de résultat. + sendOrderResultEmail($iEmailTemplateId); + // Ecriture dans les log. + writeToLog(INFO_TREATMENT_FAILURE, $oTraitement->sRobotLogFile); + // Demande suivante. + return false; + } + else if ($oJobRecord->status == 'SUCCESS') { + $iStatut = 3; + $sLogFme = $oTraitement->sLogFme; + } + } + } + else { + $oTraitement->setUseExternalDbConnection($aFmeEngine['useexternaldbconnection']); + $sResultat = $oTraitement->submitFmeServerJob($oFmeServer, $aDemande, $aTraitement, $aUser, null, $bAsync); + if ($bAsync) { + $iStatut = 5; + addFmeServerRunningJob($oTraitement, $sServerUrl, $sLogin, $sPassword); + writeToLog(INFO_FME_SERVER_JOB_ID . $oTraitement->oJobResult->id, $properties["engine_log_file"]); + // Nombre de tentative = 0 (traitement en cours d'exécution). + updateOrderAttempt($aDemande["order_id"], 0); + // Demande suivante. + return false; + } + else { + // Erreur retournée par FME Server. + if ($sResultat === false) { + updateOrder($aDemande["order_id"], 2, gmdate('Y-m-d H:i:s'), $oTraitement->sLogFme); + sendWebsocketOrderStatusMessage('order_finished_or_error', 2); + writeToLog(INFO_TREATMENT_FAILURE, $oTraitement->sRobotLogFile); + // Envoi d'un mail de résultat. + sendOrderResultEmail($iEmailTemplateId); + // Demande suivante. + return false; + } + //$sDateFin = new DateTime(date("Y-m-d H:i:s")); + $sLogFme = $oTraitement->sLogFme; + } + } + // http 200 : $oFmeServer->aLastCurlRequestInfo['http_code'] + $sDateDebut = $oJobRecord->timeStarted; + $sDateFin = $oJobRecord->timeFinished; + if ($oTraitement->oJobResult->status == 'SUCCESS') { + $iStatut = 3; + $sLienLogFme = $sLogFme; + } + else + $iStatut = $sEnErreur; + } + else { + // Erreur dans la vérification du statut de la licence FME ou expiration. + if ($oLicenseStatus->isLicenseExpired) + $ErrorMessage = INFO_FME_SERVER_EXPIRED_LICENCE; + else + $ErrorMessage = INFO_LICENCE_STATUS_VERIFICATION_ERROR; + writeToLog($ErrorMessage, $properties["engine_log_file"]); + writeToLog(INFO_CONTACT_ADMINISTRATOR, $properties["engine_log_file"]); + updateOrder($aDemande["order_id"], 2, gmdate('Y-m-d H:i:s')); + sendWebsocketOrderStatusMessage('order_finished_or_error', 2); + // Envoi d'un mail de résultat. + if ($oLicenseStatus->isLicenseExpired === true) + $sMessage = 'Invalid FME licence file'; + sendOrderResultEmail($iEmailTemplateId, $sMessage); + // Demande suivante. + return false; + } +} + +/** + * Mise à jour du processus ou job id d'une demande. + * @param {number} $iOrderId Id de la demande. + * @param {number} $iPid Id du processus (ou job id) de la demande. + */ +function updateOrderPid($iOrderId, $iPid = null) { + // Variables globales. + global $oBd, $properties, $aSql; + // Requete d'update de la demande. + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties['schema_gtf'], 'type' => 'schema_name'); + $aParams['iOrderId'] = array('value' => $iOrderId, 'type' => 'number'); + $aParams['iPid'] = array('value' => $iPid, 'type' => 'number'); + $oBd->executeWithParams($aSql[$properties['sgbd']]['update_order_pid'], $aParams); + if ($oBd->erreurRencontree) + writeToLog(INFO_ORDER_PID_UPDATE_ERROR . "(SQL : {$aSql[$properties['sgbd']]['update_order_pid']})", $properties['engine_log_file']); +} + +/** + * Supprime tous les traitements sur Fme Server dont la demande a été supprimée dans GTF. + */ +/* +function removeFmeServerDeletedJobs() { + // Variables globales. + global $properties, $oBd, $aSql; + // Requete d'update de la demande. + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $properties['schema_gtf'], 'type' => 'schema_name'); + $oPDOResult = $oBd->executeWithParams($aSql[$properties['sgbd']]['getRunningOrders'], $aParams); + if ($oBd->erreurRencontree) + writeToLog(INFO_RUNNING_JOBS_ERROR . "(SQL : {$aSql[$properties['sgbd']]['getRunningOrders']})", $properties['engine_log_file']); + else { + $aOrders = array(); + while ($aOrder = $oBd->ligneSuivante($oPDOResult)) + $aOrders[] = $aOrder['order_id']; + // Liste des demandes asynchrones en cours. + $aRunningJobs = getFmeServerRunningJobs(); + foreach ($aRunningJobs as $iIndex => $aRunningJob) { + if (!in_array($aRunningJob['order_id'], $aOrders)) { + $oFmeServer = null; + // Supprime le traitement sur Fme Server. + if (!empty($aRunningJob['job_id'])) { + $oFmeServer = new FmeServer($aRunningJob['fme_server_url'], $aRunningJob['login'], $aRunningJob['password'], 'day', 1); + $oFmeServer->sLogFilePath = $properties["engine_log_file"]; + // Statut de la licence Fme Server (pas pour Fme Cloud). + if ($aRunningJob['fme_engine_type_id'] == 'fme_server') { + $oLicenseStatus = $oFmeServer->serviceRequest('licensing/license/status'); + if ($oLicenseStatus === false) + $oFmeServer = null; + else if (is_object($oLicenseStatus) && ($oLicenseStatus->isLicensed === false || $oLicenseStatus->isLicenseExpired === true)) + $oFmeServer = null; + } + } + // Supprime le traitement sur Fme Server. + removeFmeServerRunningJob($aRunningJob['order_id'], $oFmeServer); + } + } + } +} +*/ ?> diff --git a/src/module_gtf/gtf.engine/gtf.engines/engine.sql.inc b/src/module_gtf/gtf.engine/gtf.engines/engine.sql.inc index 3a36a236f9eefc973449705b4cd9de69dee1e0b7..24039bdf7d2614239fa52a2d26cb875c51257bcd 100755 --- a/src/module_gtf/gtf.engine/gtf.engines/engine.sql.inc +++ b/src/module_gtf/gtf.engine/gtf.engines/engine.sql.inc @@ -1,7 +1,7 @@ <?php //Requête pour engine.php pgsql -$aSql['pgsql']['boucle_1']='SELECT "order".*, rt_priority.priority_id, rt_priority.label_id as priorite_libelle_id, workspace.name as workspace_nom FROM ([sSchemaGtf]."order" LEFT JOIN [sSchemaGtf].rt_priority ON "order".priority_id = rt_priority.priority_id) LEFT JOIN [sSchemaGtf].workspace ON "order".workspace_id=workspace.workspace_id WHERE (order_status_id = 1 or order_status_id = 5) AND "order".period_id IS NULL AND "order".deleted IS not TRUE AND "order".gtf_engine_id=[iIdGtfEngine] AND "order".priority_id >= [iPriorityId] ORDER BY "order".priority_id ASC, "order".order_id ASC LIMIT [iNnbrOrderMax]'; -$aSql['pgsql']['boucle_2']='SELECT "order".*, rt_priority.priority_id, rt_priority.label_id as priorite_libelle_id, workspace.name as workspace_nom FROM ([sSchemaGtf]."order" LEFT JOIN [sSchemaGtf].rt_priority ON "order".priority_id = rt_priority.priority_id) LEFT JOIN [sSchemaGtf].workspace ON "order".workspace_id=workspace.workspace_id WHERE (order_status_id = 1 or order_status_id = 5) AND "order".period_id IS NULL AND "order".deleted IS not TRUE AND "order".gtf_engine_id=[iIdGtfEngine] AND "order".priority_id > [iPriorityId] ORDER BY "order".priority_id ASC, "order".order_id ASC LIMIT [iNnbrOrderMax]'; +$aSql['pgsql']['boucle_1']='SELECT "order".*, rt_priority.priority_id, rt_priority.label_id as priorite_libelle_id, workspace.name as workspace_nom FROM ([sSchemaGtf]."order" LEFT JOIN [sSchemaGtf].rt_priority ON "order".priority_id = rt_priority.priority_id) LEFT JOIN [sSchemaGtf].workspace ON "order".workspace_id=workspace.workspace_id WHERE (order_status_id = 1 or order_status_id = 5) AND "order".period_id IS NULL AND "order".deleted IS not TRUE AND "order".gtf_engine_id=[iIdGtfEngine] AND "order".priority_id >= [iPriorityId] AND (minexecdate IS NULL or minexecdate AT TIME ZONE [sTimeZone] <=now() AT TIME ZONE [sTimeZone]) ORDER BY "order".priority_id ASC, "order".order_id ASC LIMIT [iNnbrOrderMax]'; +$aSql['pgsql']['boucle_2']='SELECT "order".*, rt_priority.priority_id, rt_priority.label_id as priorite_libelle_id, workspace.name as workspace_nom FROM ([sSchemaGtf]."order" LEFT JOIN [sSchemaGtf].rt_priority ON "order".priority_id = rt_priority.priority_id) LEFT JOIN [sSchemaGtf].workspace ON "order".workspace_id=workspace.workspace_id WHERE (order_status_id = 1 or order_status_id = 5) AND "order".period_id IS NULL AND "order".deleted IS not TRUE AND "order".gtf_engine_id=[iIdGtfEngine] AND "order".priority_id > [iPriorityId] AND (minexecdate IS NULL or minexecdate AT TIME ZONE [sTimeZone] <=now() AT TIME ZONE [sTimeZone]) ORDER BY "order".priority_id ASC, "order".order_id ASC LIMIT [iNnbrOrderMax]'; $aSql['pgsql']['right_user']='SELECT workspace."workspace_id" FROM [sSchemaGtf].workspace RIGHT JOIN [sSchemaGtf].workspace_group ON workspace.workspace_id = workspace_group.workspace_id GROUP BY workspace."workspace_id", workspace_group."group_id" HAVING workspace_group."group_id" IN ([sGroupListId]) ORDER BY workspace."workspace_id" ASC'; $aSql['pgsql']['update_demande']="UPDATE [sSchemaGtf].order SET length_sec = [iNbSec], order_status_id=[iStatut], execution_date=[sDateTraitement], result_url=[sResultat], log_url=[sLogFme] WHERE order_id=[iOrderId]"; $aSql['pgsql']['update_demande_resultat_null']="UPDATE [sSchemaGtf].order SET result_url=NULL WHERE order_id=[iOrderId]"; @@ -9,9 +9,12 @@ $aSql['pgsql']['select_user']='SELECT * FROM [sSchemaFramework].user WHERE "user $aSql['pgsql']['select_traitement']='SELECT * FROM [sSchemaGtf].workspace WHERE workspace_id=[iWorkspaceId]'; //$aSql['pgsql']['select_transit_dir']='SELECT value FROM [sSchemaGtf].property WHERE property=\'$properties["transit_dir"]\''; $aSql['pgsql']['select_fme_path']='select local_path as fme_path from [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine where fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND gtf_engine.gtf_engine_id = [gtf_engine_id]'; -$aSql['pgsql']['update_message']="UPDATE [sSchemaGtf].message SET status=1 WHERE order_id=[iOrderId]"; +$aSql['pgsql']['update_message']="UPDATE [sSchemaGtf].message SET status=[status] WHERE order_id=[iOrderId]"; $aSql['pgsql']['delete_message']="DELETE FROM [sSchemaGtf].message where order_id=[iOrderId]"; $aSql['pgsql']['get_gtf_engine_name'] = 'SELECT gtf_engine.name AS gtf_engine_name,fme_engine.name AS fme_engine_name FROM [sSchemaGtf].gtf_engine,[sSchemaGtf].fme_engine WHERE gtf_engine.fme_engine_id=fme_engine.fme_engine_id AND gtf_engine_id=[gtf_engine_id]'; $aSql['pgsql']["getLogin"] = 'SELECT "login" from [sSchemaFramework]."user" where user_id = [iUserId]'; $aSql['pgsql']["insertJob"] = 'INSERT INTO [sSchemaGtf].job(order_id, workspace_id, "user_id", execution_date, length_sec, engine_id, order_status_id) VALUES ([iOrderId], [iWorkspaceId], [iUserId], [sBeginExecutionDate] , [iDelay], [iGtfEngineId], [iStatut])'; +$aSql['pgsql']["getFmeEngine"] = 'SELECT * from [sSchemaGtf].fme_engine WHERE fme_engine_id = (SELECT fme_engine_id FROM [sSchemaGtf].gtf_engine WHERE gtf_engine_id = [gtf_engine_id])'; +$aSql['pgsql']['update_order_pid']="UPDATE [sSchemaGtf].order SET pid=[iPid] WHERE order_id=[iOrderId]"; +$aSql['pgsql']['getRunningOrders'] = 'SELECT order_id FROM [sSchemaGtf]."order" WHERE order_status_id IN (1, 5)'; ?> diff --git a/src/module_gtf/gtf.engine/gtf.engines/lang_engines/fr-lang.inc b/src/module_gtf/gtf.engine/gtf.engines/lang_engines/fr-lang.inc index 7d5d50467c79c859e3bbc9b6426827a4d139e006..7b0356cd23a061e8f5d51d1f2d6f2c574a6fedf0 100755 --- a/src/module_gtf/gtf.engine/gtf.engines/lang_engines/fr-lang.inc +++ b/src/module_gtf/gtf.engine/gtf.engines/lang_engines/fr-lang.inc @@ -1,8 +1,8 @@ <?php //Error Licence -define('E001', "Demandes non trait�es : Fichier de licence invalide"); -define('E002', "Demandes non trait�es : Fichier de licence expir�"); -define('E003', "Demandes non trait�es : Num�ro du moteur GTF sup�rieur au nombre de moteurs disponibles"); +define('E001', "Demandes non traitées : Fichier de licence invalide"); +define('E002', "Demandes non traitées : Fichier de licence expiré"); +define('E003', "Demandes non traitées : Numéro du moteur GTF supérieur au nombre de moteurs disponibles"); ?> \ No newline at end of file diff --git a/src/module_gtf/gtf.engine/gtf.engines/properties_engine.inc b/src/module_gtf/gtf.engine/gtf.engines/properties_engine.inc index faf47c8dec9ca0a95a8bc1dc4d39883301b1394f..83162f38c8cfa9e062df6c79879b94556699aafc 100755 --- a/src/module_gtf/gtf.engine/gtf.engines/properties_engine.inc +++ b/src/module_gtf/gtf.engine/gtf.engines/properties_engine.inc @@ -14,6 +14,4 @@ $properties["notify_log_file"] = $properties["engine_log_home"]."/notify.log"; $properties["sql_log_file"] = $properties["engine_log_home"]."/sql.log"; $properties["subscription_log_file"] = $properties["engine_log_home"]."/subscription.log"; $properties["error_log_file"] = $properties['vas_home']."/log/engines"."/error.log"; - -$properties['web_server_name'] = 'https://dev.veremes.net'; ?> \ No newline at end of file diff --git a/src/module_gtf/gtf.engine/gtf.engines/string.inc b/src/module_gtf/gtf.engine/gtf.engines/string.inc index 24e8c0e4dad3153051f23879cd9a3c5e5e9c66b4..6a6a266f2cd47f53f5cdce05cd110706cd9ede60 100755 --- a/src/module_gtf/gtf.engine/gtf.engines/string.inc +++ b/src/module_gtf/gtf.engine/gtf.engines/string.inc @@ -41,6 +41,8 @@ define('INFO_TREATMENT_COMMAND_LINE', '|INFORM|PHP| Ligne de commande exécutant le traitement : '); define('INFO_NO_USE_PATTERN', '|INFORM|PHP| Utilisation des noms de fichier, sans utilisation des motifs'); define('INFO_USE_PATTERN', '|INFORM|PHP| Utilisation des motifs '); + define('INFO_USER_RESTRICTION', '|ERROR|PHP| Impossible de récupérer la paramètre "restriction" de l\'utilisateur.'); + define('INFO_GTF_CONNECTION_STRING_TYPE_PASSWORD', '|WARNING|PHP| Le paramètre "GTF_CONNECTION_STRING" doit-être de type "PASSWORD".'); // engine.php define('INFO_BASE_CONNECTION', '|INFORM|PHP| Connexion à la base de données '); @@ -56,4 +58,20 @@ define('INFO_TEST_REQUEST_ERROR', '|ERROR|PHP|Requête test en erreur. '); define('INFO_INFO_ORDER_UPDATE_NULL', '|INFORM|PHP| Mise à jour de la demande (resultat null).'); define('INFO_NO_MAIL_SEND', "|INFORM|PHP| Aucun mail n'a été envoyé "); + define('INFO_NO_ASSOCIATED_USER', "|INFORM|PHP| La demande [aDemande['order_id']] n'a pas été traitée car aucun utilisateur est associé."); + define('INFO_USER_ENCRYPT_PARAMETERS', '|ERROR|PHP| Impossible de récupérer les paramètres de cryptage de l\'utilisateur et du projet.'); + define('INFO_NO_FME_CLOUD_INSTANCES', '|ERROR|PHP| Aucune instance FME Server sur FME Cloud n\'est active.'); + define('INFO_LICENCE_STATUS_VERIFICATION_ERROR', '|ERROR|PHP| Erreur dans la vérification du statut de la licence FME.'); + define('INFO_FME_CLOUD_INSTANCE_NOT_FOUND', '|ERROR|PHP| L\'instance FME Server spécifiée sur FME Cloud n\'existe pas.'); + define('INFO_FME_SERVER_JOB_IN_PROGRESS', '|INFORM|PHP| La demande est en cours de traitement par Fme Server.'); + define('INFO_FME_SERVER_JOB_STATUS', '|INFORM|PHP| Statut de la demande asynchrone sur Fme Server : '); + define('INFO_FME_SERVER_JOB_ID', '|INFORM|PHP| Job id pour la demande asynchrone sur Fme Server : '); + define('INFO_FME_SERVER_ASYNCHRONOUS_JOB_IN_PROGRESS', '|INFORM|PHP| La demande asynchrone est en cours de traitement par Fme Server.'); + define('INFO_LAUNCHING_FME_CLOUD_INSTANCE', '|INFORM|PHP| L\'instance FME Server sur FME Cloud est en cours de démarrage.'); + define('INFO_FME_CLOUD_INSTANCE_STATUS', '|INFORM|PHP| Statut de l\'instance FME Server sur FME Cloud : '); + define('INFO_FME_CLOUD_INSTANCE_RUNNING', '|INFORM|PHP| L\'instance FME Server sur FME Cloud est opérationnelle'); + define('INFO_FME_SERVER_EXPIRED_LICENCE', '|INFORM|PHP| La licence de Fme Server a expiré.'); + define('INFO_ORDER_PID_UPDATE_ERROR', '|ERROR|PHP| Impossible de mettre à jour le pid de la demande. '); + define('INFO_FME_SERVER_ASYNCHRONOUS_JOB_REMOVED_FROM_LIST', '|INFORM|PHP| Le traitement a été retirée de la liste des traitements asynchrones en cours'); + define('INFO_RUNNING_JOBS_ERROR', '|ERROR|PHP| Impossible de récupérer la liste des demandes en attente et en cours.'); ?> \ No newline at end of file diff --git a/src/module_gtf/gtf.engine/gtf.engines/subscription.php b/src/module_gtf/gtf.engine/gtf.engines/subscription.php index c12c25e37c1e5420fa297990d647fae3fce1ef97..a25d7011ed26c03ef9603cb03801a0d6561fdcb4 100755 --- a/src/module_gtf/gtf.engine/gtf.engines/subscription.php +++ b/src/module_gtf/gtf.engine/gtf.engines/subscription.php @@ -10,6 +10,10 @@ */ //set_include_path(dirname($_SERVER["PHP_SELF"]).'/../gtf.client'.';'.dirname($_SERVER["PHP_SELF"]).'/php/lib'); //ini_set ('writeToErrorLog', dirname($_SERVER["PHP_SELF"]).'/php/php.log'); +// Si "$_SERVER["HTTP_HOST"]" n'est pas renseigné -> php notice. +if (!isset($_SERVER["HTTP_HOST"])) + $_SERVER["HTTP_HOST"] = 'localhost'; + require_once ("php_engine_conf.inc"); require_once ("gtf_lib/GtfFmwParser.class.inc"); require_once ("vmlib/Vm.class.inc"); @@ -195,7 +199,7 @@ if ($oBd->erreurRencontree) { //deplacement vers le dossier upload en fonction du type $bCopie = false; $bIsFile = false; - $sUnique = UniqFileName(); + $sUnique = getUniqRandomId(); if (is_dir($sFolder . '/' . $Entry)) { $bIsFile = false; $bCopie = rename($sFolder . "/" . $Entry, $properties["upload_dir"] . "/" . $sUnique); @@ -254,7 +258,9 @@ if ($oBd->erreurRencontree) { if ($bAutorisationDemande == true) { //Création d'une nouvelle demande. //writeToLog($properties["workspace_dir"],$properties["subscription_log_file"]); - $oGtfFmwParser = new GtfFmwParser($properties['vas_home'] . '/ws_data/gtf/workspace' . "/" . $aDemande['workspace_id'] . "/fme/" . $aDemande['fmw_file']); + // Lit le contenu du fichier .fmw du projet. + $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $aDemande['workspace_id'], 'fme', $aDemande['fmw_file']); + $oGtfFmwParser = new GtfFmwParser($aDemande['fmw_file'], $this->aProperties, $sFmwFileContent); $iNouvelId = ""; if ($bIsFile) { diff --git a/src/module_gtf/gtf.engine/gtf.messages/class/Action.class.inc b/src/module_gtf/gtf.engine/gtf.messages/class/Action.class.inc deleted file mode 100755 index 037a03a7e3c266d861d90a185f7435d40ea78b07..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/gtf.messages/class/Action.class.inc +++ /dev/null @@ -1,74 +0,0 @@ -<?php -require_once("vmlib/logUtil.inc"); - -class Action { - protected $messageclass_action_id; - protected $aParams; - protected $oMessage; - protected $aProperties; - -/*********************************************************** - Récupère les paramètres de l'action d'un message - \$messageclass_action_id : id de l'actionclass - \$oMessage : objet du message - \$aParams : paramètres de l'actionclass -***********************************************************/ - function __construct($messageclass_action_id, $oMessage, $aParams) { - $this->oMessage = $oMessage; - $this->messageclass_action_id = $messageclass_action_id; - $this->aProperties = $oMessage->aProperties; - // Application des paramètres - $this->setActionClassParameters($aParams); - } - -/******************************************************* -*******************************************************/ - function execute() { - } - - function getError(){ - writeToLog("You need to implement your action error controller", $properties["processMessage_log_file"], false); - writeToErrorLog("You need to implement your action error controller"); - return true; - } - -/******************************************************* - - \$aParams : Tableau des paramètres définis en base -*******************************************************/ - function setActionClassParameters($aParams) { - if (!empty($aParams)) { - $this->aParams = array(); - foreach($aParams as $sActionParam) { - list($sActionParamName, $sActionParamValue) = explode('=', $sActionParam); - eval('$this->aParams[\'' . $sActionParamName . '\'] = ' . $sActionParamValue . ';'); - } - $this->aParams["token"] = $this->getToken($this->aProperties); - } - } - - function getToken ($properties) { - - if($properties['web_server_name'] === "[HTTP_HOST]"){ - $properties['web_server_name'] = "https://localhost"; - } - $sUrl = $properties['web_server_name'] . '/' . $properties['services_alias'] . '/vitis/privatetoken'; - $postfields = array('user'=>$properties["login_bot"], 'password'=>$properties["pass_bot"]); - - $oToken = json_decode($this->postCurlRequest ($sUrl, $postfields)); - return $oToken->token; - } - - function postCurlRequest ($sUrl, $postfields) { - $ch = curl_init($sUrl); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); - curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json")); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); - return curl_exec($ch); - } -} -?> diff --git a/src/module_gtf/gtf.engine/gtf.messages/class/BoAction.class.inc b/src/module_gtf/gtf.engine/gtf.messages/class/BoAction.class.inc deleted file mode 100755 index 8fb5ee1dcf45531aad16327962a1f377814d94ed..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/gtf.messages/class/BoAction.class.inc +++ /dev/null @@ -1,56 +0,0 @@ -<?php -require_once("vmlib/logUtil.inc"); -require_once("Action.class.inc"); - -class BoAction Extends Action { - protected $oBusinessObject; - protected $bError; -/********************************************************** - Class constructor - \$oBd : objet PDO - \$messageclass_action_id : id de l'actionclass - \$oMessage : Objet de la classe message - \$aParams : paramètres de l'actionclass -**********************************************************/ - function __construct($oBd, $messageclass_action_id, $oMessage, $aParams, $properties) { - parent::__construct($messageclass_action_id, $oMessage, $aParams); - $iBoId = $oMessage->getBody($this->aParams['bo_id_attribute']); - //On sépare les lignes - $aBodyParameters = preg_split('/\r\n|\r|\n/', $oMessage->getBody()); - $aBodyMessage = []; - - //On récupère le contenu du body du message - foreach ($aBodyParameters as $iIndice => $sParameters) - { - $aParameters = explode(" : ", $sParameters); - if ($aParameters[0] != 'bo_id') - $aBodyMessage[trim($aParameters[0])] = trim($aParameters[1]); - } - - if (!empty($iBoId)){ - require_once($properties["vas_home"] ."/rest/ws/" . $this->aParams['module'] . "/" . $this->aParams['class'] . ".class.inc"); - $aPath = array($this->aParams['module'], $this->aParams['class'], $iBoId); - $aValues = array($this->aParams['bo_id_attribute'] => $iBoId, "token" => $this->aParams['token']); - $aValues = array_merge($aValues, $aBodyMessage); - - $this->oBusinessObject = new $this->aParams['class']($aPath, $aValues, $properties); - $this->oBusinessObject->oConnection->oBd = $oBd; - $this->bError = false; - } else { - $this->bError = true; - } - } - -/******************************************************* - Change le statut. -*******************************************************/ - function execute() { - $sTransitionMethod = $this->aParams['method']; - $this->oBusinessObject->$sTransitionMethod(); - } - - function getError() { - return $this->bError; - } -} -?> diff --git a/src/module_gtf/gtf.engine/gtf.messages/class/EmailAction.class.inc b/src/module_gtf/gtf.engine/gtf.messages/class/EmailAction.class.inc deleted file mode 100755 index fa4d14cb7da96e8092881f668c9d4a26ad196fed..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/gtf.messages/class/EmailAction.class.inc +++ /dev/null @@ -1,40 +0,0 @@ -<?php -require_once("vmlib/logUtil.inc"); -require_once("vmlib/Email.class.inc"); -require_once("Action.class.inc"); - -class EmailAction Extends Action { - protected $oEmail; - protected $bError; -/********************************************************** - - Récupère les paramètres de l'action d'un message - - Crée un objet de la classe "Email". - - Applique les paramètres - \$oBd : objet PDO - \$messageclass_action_id : id de l'actionclass - \$oMessage : Objet de la classe message - \$aParams : paramètres de l'actionclass -**********************************************************/ - function __construct($oBd, $messageclass_action_id, $oMessage, $aParams) { - parent::__construct($messageclass_action_id, $oMessage, $aParams); - $aObjects['oMessage'] = $oMessage; - $iEmailTemplateId = $this->aParams['template_id']; - if (empty($iEmailTemplateId)) - $iEmailTemplateId = $oMessage->aProperties['default_mail_model']; - $this->oEmail = new Email($oBd, $iEmailTemplateId, $oMessage->aProperties, $aObjects); - $this->bError = false; - } - -/******************************************************* - Envoi un email. -*******************************************************/ - function execute() { - if (!empty($this->oEmail->oEmailTemplate->name)) - $this->oEmail->send(); - } - - function getError() { - return $this->bError; - } -} -?> diff --git a/src/module_gtf/gtf.engine/gtf.messages/class/Message.class.inc b/src/module_gtf/gtf.engine/gtf.messages/class/Message.class.inc deleted file mode 100755 index 59ad4a9ebbf6ca3c73a433a86ebbeb7f23039193..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/gtf.messages/class/Message.class.inc +++ /dev/null @@ -1,155 +0,0 @@ -<?php -/** -* \class Message -* \file Message.class.inc -*/ - -require_once("vmlib/logUtil.inc"); - -class Message { - protected $message_id; - public $messageclass; - protected $creation_date; - protected $status; - protected $body; - protected $bo_class_name; - protected $bo_class; - protected $bo_id; - protected $sender; - protected $oBo; - protected $oBd; - protected $aBodyValue; - public $aProperties; - protected $aSql; - - /** - * Class constructor - * \param $oBd Connection object. - * \param $message_id Message id. - * \param $aProperties Array of properties. - */ - function __construct($oBd, $message_id , $aProperties) { - require("Message.class.sql.inc"); - $this->aProperties = $aProperties; - $this->oBd = $oBd; - $this->aSql = $aSql; - $sSql = $this->aSql[$oBd->sgbd]['getMessage']; - //$sSql = str_replace('[message_id]',$message_id , $sSql); - //$sSql = str_replace('[schema]',$aProperties['schema_gtf'] , $sSql); - $aParams = array( - "message_id" => array("value"=> $message_id, "type"=> 'number'), - "schema" => array("value"=> $aProperties['schema_gtf'], "type"=> 'column_name') - ); - $oResult = $oBd->executeWithParams($sSql, $aParams); - if($oBd->erreurRencontree) - $sErrorMsg = $oBd->getBDMessage(); - else { - if ($oBd->nombreLigne ($oResult) > 0) { - $oRow = $oBd->objetSuivant ($oResult); - $this->message_id = $oRow->message_id; - $this->messageclass = $oRow->messageclass; - $this->creation_date = $oRow->creation_date; - $this->status = $oRow->status; - $this->body = $oRow->body; - //$this->bo_class_name = $oRow->bo_class_name; - //$this->bo_id = $oRow->bo_id; - $this->sender = $oRow->sender; - // Extrait les paramètres pour les actions de body - if (!empty($this->body)) { - preg_match_all('/(.)+:(.)+/', $this->body, $aActionParams); - if (!empty($aActionParams[0])) { - foreach ($aActionParams[0] as $sActionParam) { - list($sIndex, $sValue) = explode(':', $sActionParam); - $this->aBodyValue[trim($sIndex)] = trim($sValue); - } - } - } - } - } - if (isset($sErrorMsg)){ - writeToLog("The message " . $message_id . "encountered this error : " . $sErrorMsg, $properties["processMessage_log_file"], false); - } - } - - /* - * function setProcessed - * \brief Change the status of a message. - * \param $processed boolean. - */ - function setProcessed($processed) { - if ($processed === true) - $this->status = 3; // Traité - else - $this->status = 2; // En erreur - } - - /* - * function process - * \brief Executes all actions of the message. - */ - function process() { - // Liste des actions du message - $sSql = $this->aSql['pgsql']['getMessageActions']; - //$sSql = str_replace("[messageclass]", $this->messageclass, $sSql); - //$sSql = str_replace("[schema]", $this->aProperties['schema_gtf'], $sSql); - $aParams = array( - "messageclass" => array("value"=> $this->messageclass, "type"=> 'string'), - "schema" => array("value"=> $this->aProperties['schema_gtf'], "type"=> 'column_name') - ); - $oActionResult = $this->oBd->executeWithParams($sSql, $aParams); - if(!$this->oBd->erreurRencontree) { - if ($this->oBd->nombreLigne($oActionResult) > 0) { - while ($oActionRow = $this->oBd->objetSuivant ($oActionResult)) { - if (file_exists(__DIR__ . '/' . $oActionRow->actionclass . '.class.inc')) { - require_once __DIR__ . '/' . $oActionRow->actionclass . '.class.inc'; - if (!empty($oActionRow->parameters)) - $aParams = explode('|', $oActionRow->parameters); - $oAction = new $oActionRow->actionclass($this->oBd, $oActionRow->messageclass_action_id, $this, $aParams, $this->aProperties); - if($oAction->getError() == false){ - $oAction->execute(); - } else { - writeToLog("ERROR : cannot create action with this body's parameters", $properties["processMessage_log_file"], false); - throw new Exception("ERROR : cannot create action with this body's parameters"); - } - } - } - } - } - } - - /* - * function getBody - * \param $key boolean. - * \return Returns the value of a parameter of action (or all the parameters and values). - */ - function getBody($key = null) { - if (is_null($key)) - return $this->body; - else { - if (isset($this->aBodyValue[$key])) - return $this->aBodyValue[$key]; - else - return null; - } - } - - /* - * function update - * \brief Saves the settings of a message. - */ - function update() { - // Tous les paramètres sauf les tableaux et objets - foreach (get_object_vars($this) as $sIndex => $value) { - if (!is_array($value) && !is_object($value)) { - // Le paramètre est une date ? - /*if (strtotime($value) !== false) - $aValues[$sIndex] = "'$value'"; - else*/ - $aValues[$sIndex] = $value; - } - } - //error_log(print_r($this->oBd, true)); - $this->oBd->update($this->aProperties['schema_gtf'], 'message', $aValues, 'message_id', $this->message_id, 'numeric'); - } -} -?> diff --git a/src/module_gtf/gtf.engine/gtf.messages/class/Message.class.sql.inc b/src/module_gtf/gtf.engine/gtf.messages/class/Message.class.sql.inc deleted file mode 100755 index 47a0f8e9d35285d7b987010d69d8850e88a887d1..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/gtf.messages/class/Message.class.sql.inc +++ /dev/null @@ -1,4 +0,0 @@ -<?php - $aSql['pgsql']['getMessage'] = "SELECT * FROM [schema].message WHERE message_id = [message_id]"; - $aSql['pgsql']['getMessageActions'] = "SELECT * FROM [schema].messageclass_action WHERE messageclass = [messageclass] ORDER BY index"; -?> \ No newline at end of file diff --git a/src/module_gtf/gtf.engine/gtf.messages/processMessages.bat b/src/module_gtf/gtf.engine/gtf.messages/processMessages.bat deleted file mode 100755 index ae8efcb51a1f8fac481668670c5bad68f23a0272..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/gtf.messages/processMessages.bat +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -set GTF_MESSAGE_HOME=%~dp0 -set PHP_HOME=%GTF_MESSAGE_HOME%..\gtf.engines\php -rem %1 correspond au paramètre passé par pycron -"%PHP_HOME%\php.exe" "%GTF_MESSAGE_HOME%processMessages.php" %1 diff --git a/src/module_gtf/gtf.engine/gtf.messages/processMessages.php b/src/module_gtf/gtf.engine/gtf.messages/processMessages.php deleted file mode 100755 index bfa420081d3d60e0607bc66189a68a73444f1b1e..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/gtf.messages/processMessages.php +++ /dev/null @@ -1,173 +0,0 @@ -<?php - session_start(); - - require_once dirname($_SERVER['PHP_SELF']).'/../gtf.engines/php_engine_conf.inc'; - require_once dirname($_SERVER['PHP_SELF']).'/../gtf.engines/properties_engine.inc'; - - require_once("vmlib/BD.class.inc"); - require_once("vmlib/Vm.class.inc"); - require_once("processMessages.sql.inc"); - require_once("class/Message.class.inc"); - - $sPidFile = __DIR__ . "/PID_processMessages.pid"; - - $oNow = new DateTime(); - $properties["processMessage_log_file"] = $properties['log_directories'] ['Application'] . "/processMessage/log_" . $oNow->format('Y-m-d') . ".log"; - - processIsRunnning ($sPidFile, $properties); - createPidFile($sPidFile, $properties); - - //journalisation des logs pour le mailReader aussi - // instanciation d'un objet pour accéder à la base compte u_vitis - $oBd = new BD ($properties['login_scheduler'], $properties['password_scheduler'], $properties["database"], $properties["server"], $properties["port"], $properties["sgbd"], $properties["page_encoding"]); - - $iMessages = 0; - $iMessagesTraite = 0; - - if ($oBd->erreurRencontree) - writeToLog('can\'t connect to database ' . $properties["database"] . " on " . $properties["server"] . ":" . $properties["port"] , $properties["processMessage_log_file"], false); - else { - // Traitement des messages en attente. - $sSql = $aSql['pgsql']['getWaitingMessages']; - - $aParams = array( - "messageclass_type" => array("value"=> 'action', "type"=> 'string'), - "schema" => array("value"=> $properties['schema_gtf'], "type"=> 'column_name') - ); - - $oMessageResult=$oBd->executeWithParams($sSql, $aParams); - if(!$oBd->erreurRencontree) { - $iMessages = $oBd->nombreLigne($oMessageResult); - if ($iMessages > 0) { - // fonction à appeler à la fin du script. - register_shutdown_function('shutdownCallBack', $oBd, $properties); - // Traitement des messages en attente. - while ($oMessageRow = $oBd->objetSuivant ($oMessageResult)) { - $iMessageId = $oMessageRow->message_id; - $oMessage = new Message($oBd, $oMessageRow->message_id, $properties); - $iOrderId = $oMessage->getBody("order_id"); - if (!empty($iOrderId)){ - $sSql = $aSql['pgsql']['getOrderStatus'];; - $sSql = str_replace("[ORDER_ID]", $iOrderId, $sSql); - $oOrderResult=$oBd->execute($sSql); - if(!$oBd->erreurRencontree) { - $oOrderRow = $oBd->objetSuivant ($oOrderResult); - if ($oOrderRow->order_status_id == 3 ){ - $oMessage->process(); - $oMessage->setProcessed(true); - $oMessage->update(); - $iMessagesTraite ++; - }else{ - writeToLog("message " . $iMessageId . " : can't be processing for the moment because the linked GTF order is not completed or it status is not 'valid'", $properties["processMessage_log_file"], false); - } - } else { - $oMessage->setProcessed(false); - $oMessage->update(); - writeToLog("message " . $iMessageId . " : can't be processing because we can't find the linked GTF order", $properties["processMessage_log_file"], false); - } - } else { - $oMessage->process(); - $oMessage->setProcessed(true); - $oMessage->update(); - $iMessagesTraite ++; - } - } - } - }else{ - writeToLog($oBd->getBDMessage(), $properties["processMessage_log_file"], false); - } - } - - writeToLog("Iteration of the process completed : " . $iMessages . "(". $iMessagesTraite ." as OK)", $properties["processMessage_log_file"], false); - - unlink($sPidFile); - - /* - * function shutDownCallBack - * @oBd Database connection object. - * @properties - */ - function shutDownCallBack($oBd, $properties) { - $aError = error_get_last(); - // Erreur fatale pendant le traitement d'un message ? - if ($aError['type'] & E_ERROR > 0) { - writeToLog("[ERROR] [PHP] while processing the message " . $GLOBALS['iMessageId'] . "check the main log file", $properties["processMessage_log_file"], false); - // Change le statut du message : "en erreur". - $oMessage = new Message($oBd, $GLOBALS['iMessageId'], $properties); - $oMessage->setProcessed(false); - $oMessage->update(); - // Re-exécute le script (au cas où il resterait des messages non traités). - if(DIRECTORY_SEPARATOR === "/"){ - // if linux - exec(__DIR__ . '/processMessages.sh'); - } else { - // if windows - exec(__DIR__ . '\processMessages.bat'); - } - } - } - - function processIsRunnning ($sPidFile, $properties){ - if (file_exists ($sPidFile)){ - // récupération du fichier .pid - $sPid = file_get_contents($sPidFile); - - $bProcessIsRunning = true; - $sOsName = PHP_OS; - // detection de l'os pour savoir comment controler le PID - if (strtoupper(substr($sOsName, 0, 3)) === 'WIN') { - $bProcessIsRunning = windowsPidCheck($sPid); - } else { - $bProcessIsRunning = linuxPidCheck($sPid); - } - - if($bProcessIsRunning === false){ - //si le fichier PID est présent mais que le PID n'existe pas sur le serveur - // on supprime le fichier .pid et on lance le mailReader - writeToLog("previous process exited without cleaning pidfile, removing", $properties["processMessage_log_file"], false); - unlink($sPidFile); - } else { - //si le process tourne déjà on ferme le process courant - writeToLog("found a running instance of processMessages.php, exiting.", $properties["processMessage_log_file"], false); - exit(0); - } - } - return true; - } - - function windowsPidCheck ($iPid){ - // fonction pour controller si un pid existe sous windows - $processes = explode( "\n", shell_exec('tasklist.exe /fi "PID eq ' . $iPid . '"')); - - foreach( $processes as $process ) { - - if( ! empty($process) && (strpos("===", $process ) === 0) ){ - continue; - } - - $matches = array(); - preg_match("/(.*?)\s+(\d+).*$/", $process, $matches); - - if(count($matches) > 0){ - return true; - } - } - return false; - } - - function linuxPidCheck ($iPid){ - // fonction pour controller si un pid existe sous linux - return file_exists("/proc/" . $iPid); - } - - function createPidFile($sPidFile , $properties){ - $file = fopen($sPidFile, 'w'); - - if($file){ - writeToLog("PID file creation with pid : " . getmypid(), $properties["processMessage_log_file"], false); - fwrite($file, getmypid()); - } - - fclose($file); - } -?> \ No newline at end of file diff --git a/src/module_gtf/gtf.engine/gtf.messages/processMessages.sh b/src/module_gtf/gtf.engine/gtf.messages/processMessages.sh deleted file mode 100755 index 89dadbfb61faff67c07e7a7c4918d45f7287a10e..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/gtf.messages/processMessages.sh +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -set GTF_MESSAGE_HOME=%~dp0 -set PHP_HOME=%GTF_MESSAGE_HOME%..\gtf.engines\php -#rem %1 correspond au paramètre passé par pycron -"../gtf.engines/php/bin/php" "./processMessages.php" %1 \ No newline at end of file diff --git a/src/module_gtf/gtf.engine/gtf.messages/processMessages.sql.inc b/src/module_gtf/gtf.engine/gtf.messages/processMessages.sql.inc deleted file mode 100755 index 6f4814573cb781855de841e3f8395d2cb12cf17a..0000000000000000000000000000000000000000 --- a/src/module_gtf/gtf.engine/gtf.messages/processMessages.sql.inc +++ /dev/null @@ -1,4 +0,0 @@ -<?php - $aSql['pgsql']['getWaitingMessages']='SELECT message.message_id FROM [schema].message,[schema].messageclass WHERE status=1 AND message.messageclass=messageclass.messageclass AND lower(messageclass_type)=lower([messageclass_type]) ORDER BY message_id;'; - $aSql['pgsql']['getOrderStatus']='SELECT order_status_id FROM s_gtf.order WHERE order_id = [ORDER_ID] LIMIT 1'; -?> \ No newline at end of file diff --git a/src/module_gtf/module/forms/configuration/configuration_vitis_configuration_gtfConfig.json b/src/module_gtf/module/forms/configuration/configuration_vitis_configuration_gtfConfig.json old mode 100755 new mode 100644 index ab1ba4d18e8a3e551a34384f6aa78b991e010fa7..2c3d7e25557d9a332a252de8c57f13252c5bf535 --- a/src/module_gtf/module/forms/configuration/configuration_vitis_configuration_gtfConfig.json +++ b/src/module_gtf/module/forms/configuration/configuration_vitis_configuration_gtfConfig.json @@ -17,6 +17,32 @@ } ] }, + { + "class": "form-field-inline gtf-instance-id", + "fields":[ + { + "type":"text", + "name":"gtf_instance_id", + "label":"FORM_GTF_INSTANCE_ID_CONFIGURATION_CONFIGURATION_GTF_CONFIG", + "read_only":true, + "nb_cols":10 + }, + { + "type": "button", + "class": "btn-ungroup btn-group-sm", + "nb_cols": 2, + "buttons": [ + { + "type": "button", + "name": "btn_generate_gtf_instance_id", + "label": "FORM_BTN_GENERATE_GTF_INSTANCE_ID_WORKSPACE_EDIT_WIDGET", + "class": "btn-primary", + "event": "generateGtfInstanceId()" + } + ] + } + ] + }, { "fields":[ { @@ -129,6 +155,31 @@ } ] }, + { + "fields":[ + { + "type":"title", + "label":"FORM_EXTERNAL_CONNSTRING_SECTION_CONFIGURATION_CONFIGURATION_GTF_CONFIG", + "name":"title_properties_ext_conn_string", + "nb_cols":12 + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"connectionStringExternalIp", + "label":"FORM_EXTERNAL_CONNSTRING_SECTION_CONFIGURATION_CONFIGURATION_CONNECTIONSTRINGIP", + "nb_cols":6 + },{ + "type":"number", + "name":"connectionStringExternalPort", + "label":"FORM_EXTERNAL_CONNSTRING_SECTION_CONFIGURATION_CONFIGURATION_CONNECTIONSTRINGPORT", + "nb_cols":6 + } + ] + }, { "fields":[ { diff --git a/src/module_gtf/module/forms/engine/engine_gtf_fme_engine.json b/src/module_gtf/module/forms/engine/engine_gtf_fme_engine.json old mode 100755 new mode 100644 index d24ab707829c9578af51cbfc68d369bb9250eac9..5aee23e556f2b293b27cc4cf195ab82d01f5edb2 --- a/src/module_gtf/module/forms/engine/engine_gtf_fme_engine.json +++ b/src/module_gtf/module/forms/engine/engine_gtf_fme_engine.json @@ -26,6 +26,34 @@ } }, "nb_cols":4 + }, + { + "type":"select", + "name":"fme_engine_type_id", + "label":"FORM_TYPE_ENGINE_FME_ENGINE", + "web_service":{ + "ressource_id":"gtf/fmeenginetypes", + "id_key":"fme_engine_type_id", + "label_key":"fme_engine_type_label", + "parameters":{ + "filter":{ + "lang":"getProperty('language')" + }, + "order_by":"fme_engine_type_label" + } + }, + "nb_cols":4 + } + ] + }, + { + "fields":[ + { + "type":"url", + "name":"server_url", + "label":"FORM_SERVER_URL_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":4 } ] }, @@ -60,6 +88,7 @@ "name":"gtf_v_fme_engine_update_form", "title":"FORM_TITLE_ENGINE_FME_ENGINE", "input_size":"xs", + "initEvent":"initGtfFmeEngineForm()", "event":"sendSimpleForm()", "nb_cols":6, "rows":[ @@ -102,6 +131,50 @@ "nb_cols":12 } ] + },{ + "fields": [ + { + "type": "radio", + "name": "useexternaldbconnection", + "label": "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE", + "nb_cols": 12, + "id": "Element_0_1_1", + "options": { + "choices": [ + { + "label": "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE_YES", + "value": true + }, + { + "label": "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE_NO", + "value": false + } + ] + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"fme_engine_type_id", + "label":"FORM_TYPE_ENGINE_FME_ENGINE", + "required":true, + "web_service":{ + "ressource_id":"gtf/fmeenginetypes", + "id_key":"fme_engine_type_id", + "label_key":"fme_engine_type_label", + "parameters":{ + "filter":{ + "lang":"getProperty('language')" + }, + "order_by":"fme_engine_type_label" + } + }, + "nb_cols":12 + } + ] }, { "fields":[ @@ -115,18 +188,274 @@ ] }, { + "fields":[ + { + "type":"url", + "name":"server_url", + "label":"FORM_SERVER_URL_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"fme_cloud_api_token", + "label":"FORM_FME_CLOUD_API_TOKEN_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"fme_server_instance_title", + "label":"FORM_FME_SERVER_INSTANCE_TITLE_ENGINE_FME_ENGINE", + "nb_cols":12, + "class":"h5", + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"fme_server_instance_name", + "label":"FORM_FME_SERVER_INSTANCE_NAME_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"login", + "label":"FORM_LOGIN_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"password", + "name":"password", + "label":"FORM_PASSWORD_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"fme_server_instance_status", + "label":"FORM_FME_SERVER_INSTANCE_STATUS_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "class":"fme_cloud_button", "fields":[ { "type":"button", "class":"btn-ungroup btn-group-sm", "nb_cols":12, + "name":"fme_cloud_button", + "buttons":[ + { + "type":"button", + "name":"start_fme_server_instance", + "label":"FORM_BTN_START_FME_SERVER_INSTANCE_ENGINE_FME_ENGINE", + "class":"btn-success", + "event":"StartFmeServerInstance()", + "disabled": true + }, + { + "type":"button", + "name":"pause_fme_server_instance", + "label":"FORM_BTN_PAUSE_FME_SERVER_INSTANCE_ENGINE_FME_ENGINE", + "class":"btn-warning", + "event":"PauseFmeServerInstance()", + "disabled": true + }, + { + "type":"button", + "name":"fme_server_instance_version", + "label":"FORM_BTN_FME_SERVER_INSTANCE_VERSION_ENGINE_FME_ENGINE", + "class":"btn-primary", + "event":"displayFmeServerInstanceInfo()", + "disabled": true + }, + { + "type":"button", + "name":"refresh_fme_server_instance_status", + "glyphicon":"refresh", + "class":"btn-primary", + "event":"refreshFmeServerInstanceStatus()", + "tooltip": { + "title":"FORM_BTN_REFRESH_FME_SERVER_INSTANCE_STATUT_STATUT_ENGINE_FME_ENGINE", + "placement": "bottom", + "trigger": "hover", + "container": "body" + } + } + ] + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"amazon_s3_title", + "label":"FORM_AMAZON_S3_TITLE_ENGINE_FME_ENGINE", + "nb_cols":12, + "class":"h5", + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"s3_access_key_id", + "label":"FORM_S3_ACCESS_KEY_ID_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"password", + "name":"s3_secret_access_key", + "label":"FORM_S3_SECRET_ACCESS_KEY_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"fme_server_s3_bucket", + "label":"FORM_FME_SERVER_S3_BUCKET_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"iam_access_key_id", + "label":"FORM_IAM_ACCESS_KEY_ID_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"password", + "name":"iam_secret_access_key", + "label":"FORM_IAM_SECRET_ACCESS_KEY_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"s3_region", + "label":"FORM_S3_REGION_ENGINE_FME_ENGINE", + "required":true, + "options":[ + "FORM_S3_REGION_US-EAST-2_ENGINE_FME_ENGINE|us-east-2", + "FORM_S3_REGION_US-EAST-1_ENGINE_FME_ENGINE|us-east-1", + "FORM_S3_REGION_US-WEST-1_ENGINE_FME_ENGINE|us-west-1", + "FORM_S3_REGION_US-WEST-2_ENGINE_FME_ENGINE|us-west-2", + "FORM_S3_REGION_AP-SOUTH-1_ENGINE_FME_ENGINE|ap-south-1", + "FORM_S3_REGION_AP-NORTHEAST-2_ENGINE_FME_ENGINE|ap-northeast-2", + "FORM_S3_REGION_AP-SOUTHEAST-1_ENGINE_FME_ENGINE|ap-southeast-1", + "FORM_S3_REGION_AP-SOUTHEAST-2_ENGINE_FME_ENGINE|ap-southeast-2", + "FORM_S3_REGION_AP-NORTHEAST-1_ENGINE_FME_ENGINE|ap-northeast-1", + "FORM_S3_REGION_CA-CENTRAL-1_ENGINE_FME_ENGINE|ca-central-1", + "FORM_S3_REGION_CN-NORTH-1_ENGINE_FME_ENGINE|cn-north-1", + "FORM_S3_REGION_EU-CENTRAL-1_ENGINE_FME_ENGINE|eu-central-1", + "FORM_S3_REGION_EU-WEST-1_ENGINE_FME_ENGINE|eu-west-1", + "FORM_S3_REGION_EU-WEST-2_ENGINE_FME_ENGINE|eu-west-2", + "FORM_S3_REGION_EU-WEST-3_ENGINE_FME_ENGINE|eu-west-3", + "FORM_S3_REGION_SA-EAST-1_ENGINE_FME_ENGINE|sa-east-1" + ], + "visible":false, + "nb_cols":12 + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"amazon_s3_button", + "buttons":[ + { + "type":"button", + "name":"test_amazon_s3_bucket", + "label":"FORM_BTN_TEST_AMAZON_S3_BUCKET_ENGINE_FME_ENGINE", + "class":"btn-primary", + "event":"testAmazonS3BucketConnection()" + } + ] + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", "buttons":[ { "type":"button", "name":"test_fme_engine", "label":"FORM_BTN_TEST_FME_ENGINE_ENGINE_FME_ENGINE", "class":"btn-primary", - "event":"testFmeEngine('local_path')" + "event":"testFmeEngine('local_path')", + "visible": false }, { "type":"submit", @@ -151,6 +480,7 @@ "name":"gtf_v_fme_engine_insert_form", "title":"FORM_TITLE_ENGINE_FME_ENGINE", "input_size":"xs", + "initEvent":"initGtfFmeEngineForm()", "event":"sendSimpleForm()", "afterEvent":"editSectionForm()", "nb_cols":6, @@ -185,6 +515,51 @@ "nb_cols":12 } ] + },{ + "fields": [ + { + "type": "radio", + "name": "useexternaldbconnection", + "label": "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE", + "nb_cols": 12, + "id": "Element_0_1_1", + "options": { + "choices": [ + { + "label": "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE_YES", + "value": true + }, + { + "label": "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE_NO", + "value": false + } + ] + }, + "default_value": false + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"fme_engine_type_id", + "label":"FORM_TYPE_ENGINE_FME_ENGINE", + "required":true, + "web_service":{ + "ressource_id":"gtf/fmeenginetypes", + "id_key":"fme_engine_type_id", + "label_key":"fme_engine_type_label", + "parameters":{ + "filter":{ + "lang":"getProperty('language')" + }, + "order_by":"fme_engine_type_label" + } + }, + "nb_cols":12 + } + ] }, { "fields":[ @@ -193,16 +568,192 @@ "name":"local_path", "label":"FORM_PATH_ENGINE_FME_ENGINE", "required":true, - "nb_cols":12 + "nb_cols":12, + "visible":false } ] }, + { + "fields":[ + { + "type":"url", + "name":"server_url", + "label":"FORM_SERVER_URL_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"fme_cloud_api_token", + "label":"FORM_FME_CLOUD_API_TOKEN_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"fme_server_instance_title", + "label":"FORM_FME_SERVER_INSTANCE_TITLE_ENGINE_FME_ENGINE", + "nb_cols":12, + "class":"h5", + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"fme_server_instance_name", + "label":"FORM_FME_SERVER_INSTANCE_NAME_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"login", + "label":"FORM_LOGIN_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"password", + "name":"password", + "label":"FORM_PASSWORD_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"amazon_s3_title", + "label":"FORM_AMAZON_S3_TITLE_ENGINE_FME_ENGINE", + "nb_cols":12, + "class":"h5", + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"s3_access_key_id", + "label":"FORM_S3_ACCESS_KEY_ID_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"password", + "name":"s3_secret_access_key", + "label":"FORM_S3_SECRET_ACCESS_KEY_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"fme_server_s3_bucket", + "label":"FORM_FME_SERVER_S3_BUCKET_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"iam_access_key_id", + "label":"FORM_IAM_ACCESS_KEY_ID_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"password", + "name":"iam_secret_access_key", + "label":"FORM_IAM_SECRET_ACCESS_KEY_ENGINE_FME_ENGINE", + "required":true, + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"s3_region", + "label":"FORM_S3_REGION_ENGINE_FME_ENGINE", + "required":true, + "options":[ + "FORM_S3_REGION_US-EAST-2_ENGINE_FME_ENGINE|us-east-2", + "FORM_S3_REGION_US-EAST-1_ENGINE_FME_ENGINE|us-east-1", + "FORM_S3_REGION_US-WEST-1_ENGINE_FME_ENGINE|us-west-1", + "FORM_S3_REGION_US-WEST-2_ENGINE_FME_ENGINE|us-west-2", + "FORM_S3_REGION_AP-SOUTH-1_ENGINE_FME_ENGINE|ap-south-1", + "FORM_S3_REGION_AP-NORTHEAST-2_ENGINE_FME_ENGINE|ap-northeast-2", + "FORM_S3_REGION_AP-SOUTHEAST-1_ENGINE_FME_ENGINE|ap-southeast-1", + "FORM_S3_REGION_AP-SOUTHEAST-2_ENGINE_FME_ENGINE|ap-southeast-2", + "FORM_S3_REGION_AP-NORTHEAST-1_ENGINE_FME_ENGINE|ap-northeast-1", + "FORM_S3_REGION_CA-CENTRAL-1_ENGINE_FME_ENGINE|ca-central-1", + "FORM_S3_REGION_CN-NORTH-1_ENGINE_FME_ENGINE|cn-north-1", + "FORM_S3_REGION_EU-CENTRAL-1_ENGINE_FME_ENGINE|eu-central-1", + "FORM_S3_REGION_EU-WEST-1_ENGINE_FME_ENGINE|eu-west-1", + "FORM_S3_REGION_EU-WEST-2_ENGINE_FME_ENGINE|eu-west-2", + "FORM_S3_REGION_EU-WEST-3_ENGINE_FME_ENGINE|eu-west-3", + "FORM_S3_REGION_SA-EAST-1_ENGINE_FME_ENGINE|sa-east-1" + ], + "visible":false, + "nb_cols":12 + } + ] + }, { "fields":[ { "type":"button", "class":"btn-ungroup btn-group-sm", "nb_cols":12, + "name":"insert_button", "buttons":[ { "type":"submit", @@ -226,6 +777,7 @@ "display":{ "name":"gtf_v_fme_engine_display_form", "title":"FORM_TITLE_ENGINE_FME_ENGINE", + "initEvent":"initGtfFmeEngineForm()", "input_size":"xs", "nb_cols":6, "rows":[ @@ -259,6 +811,16 @@ } ] }, + { + "fields":[ + { + "type":"label", + "name":"fme_engine_type_label", + "label":"FORM_TYPE_ENGINE_FME_ENGINE", + "nb_cols":12 + } + ] + }, { "fields":[ { @@ -269,11 +831,157 @@ } ] }, + { + "fields":[ + { + "type":"label", + "name":"server_url", + "label":"FORM_SERVER_URL_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"fme_cloud_api_token", + "label":"FORM_FME_CLOUD_API_TOKEN_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"fme_server_instance_title", + "label":"FORM_FME_SERVER_INSTANCE_TITLE_ENGINE_FME_ENGINE", + "nb_cols":12, + "class":"h5", + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"fme_server_instance_name", + "label":"FORM_FME_SERVER_INSTANCE_NAME_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"login", + "label":"FORM_LOGIN_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"password", + "label":"FORM_PASSWORD_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"amazon_s3_title", + "label":"FORM_AMAZON_S3_TITLE_ENGINE_FME_ENGINE", + "nb_cols":12, + "class":"h5", + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"s3_access_key_id", + "label":"FORM_S3_ACCESS_KEY_ID_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"s3_secret_access_key", + "label":"FORM_S3_SECRET_ACCESS_KEY_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"fme_server_s3_bucket", + "label":"FORM_FME_SERVER_S3_BUCKET_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"iam_access_key_id", + "label":"FORM_IAM_ACCESS_KEY_ID_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"iam_secret_access_key", + "label":"FORM_IAM_SECRET_ACCESS_KEY_ENGINE_FME_ENGINE", + "nb_cols":12, + "visible":false + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"s3_region", + "label":"FORM_S3_REGION_ENGINE_FME_ENGINE", + "visible":false, + "nb_cols":12 + } + ] + }, { "fields":[ { "type":"button", "class":"btn-ungroup btn-group-sm", + "name":"display_button", "nb_cols":12, "buttons":[ { diff --git a/src/module_gtf/module/forms/my_work/my_work_gtf_user_order.json b/src/module_gtf/module/forms/my_work/my_work_gtf_user_order.json index c0c4d1ee9a84c4629a729bc23470024f0d0a2456..a8ca40f83a1445996af53f5c338b65b308edff2e 100755 --- a/src/module_gtf/module/forms/my_work/my_work_gtf_user_order.json +++ b/src/module_gtf/module/forms/my_work/my_work_gtf_user_order.json @@ -46,27 +46,6 @@ } ] }, - { - "fields":[ - { - "type":"select", - "name":"priority_id", - "label":"FORM_PRIORITY_MY_WORK_USER_ORDER", - "web_service":{ - "ressource_id":"gtf/priorities", - "id_key":"priority_id", - "label_key":"priority_label", - "parameters":{ - "filter":{ - "lang":"getProperty('language')" - }, - "order_by":"priority_label" - } - }, - "nb_cols":4 - } - ] - }, { "fields":[ { @@ -156,28 +135,6 @@ } ] }, - { - "fields":[ - { - "type":"select", - "name":"priority_id", - "label":"FORM_PRIORITY_MY_WORK_USER_ORDER", - "web_service":{ - "ressource_id":"gtf/priorities", - "id_key":"priority_id", - "label_key":"priority_label", - "parameters":{ - "filter":{ - "lang":"getProperty('language')" - }, - "order_by":"priority_label" - } - }, - "default_value":1, - "nb_cols":12 - } - ] - }, { "fields":[ { @@ -212,6 +169,19 @@ } ] }, + { + "fields":[ + { + "type":"datetime", + "name":"minexecdate", + "label":"FORM_MINEXECDATE_MY_WORK_USER_ORDER", + "options": { + "minDate": [] + }, + "nb_cols":12 + } + ] + }, { "fields":[ { @@ -284,8 +254,8 @@ "fields":[ { "type":"label", - "name":"priority_label", - "label":"FORM_PRIORITY_MY_WORK_USER_ORDER", + "name":"minexecdate", + "label":"FORM_MINEXECDATE_MY_WORK_USER_ORDER", "nb_cols":12 } ] diff --git a/src/module_gtf/module/forms/publication/publication_gtf_workspace.json b/src/module_gtf/module/forms/publication/publication_gtf_workspace.json index 2c3777af1c5687c6d54fa856dec69ba9a9ce7357..acd287f47cceeacf9375eb5195a6b2bc4236ee1b 100755 --- a/src/module_gtf/module/forms/publication/publication_gtf_workspace.json +++ b/src/module_gtf/module/forms/publication/publication_gtf_workspace.json @@ -185,14 +185,14 @@ "content": "FORM_KEY_TOOLTIP_CONTENT_PUBLICATION_WORKSPACE", "width": "500px" }, - "nb_cols": 4 + "nb_cols": 5 }, { "type": "linkurl", "name": "fmw_file_url", "label": "FORM_FMW_FILE_URL_PUBLICATION_WORKSPACE", "target": "_self", - "nb_cols": 8 + "nb_cols": 7 } ] }, @@ -297,7 +297,7 @@ "value": false }] }, - "nb_cols": 4 + "nb_cols": 5 }, { "type": "radio", @@ -314,7 +314,65 @@ "value": false }] }, - "nb_cols": 4 + "nb_cols": 5 + } + ] + }, + { + "fields": [ + { + "type": "radio", + "name": "dataencrypt", + "label": "FORM_DATAENCRYPT_PUBLICATION_WORKSPACE", + "nb_cols": 5, + "options": { + "choices": [ + { + "label": "Oui", + "value": true + }, + { + "label": "Non", + "value": false + } + ] + }, + "default_value": false + }, + { + "type": "radio", + "name": "usepersonaldata", + "label": "FORM_USEPERSONALDATA_PUBLICATION_WORKSPACE", + "nb_cols": 5, + "options": { + "choices": [ + { + "label": "Oui", + "value": true + }, + { + "label": "Non", + "value": false + } + ] + }, + "default_value": false + } + ] + }, + { + "fields": [ + { + "type": "float", + "name": "unitcost", + "label": "FORM_UNITCOST_PUBLICATION_WORKSPACE", + "nb_cols": 5 + }, + { + "type": "float", + "name": "costpersecond", + "label": "FORM_COSTPERSECOND_PUBLICATION_WORKSPACE", + "nb_cols": 5 } ] }, @@ -450,7 +508,7 @@ }] }, "default_value": 0, - "nb_cols": 4 + "nb_cols": 5 }, { "type": "radio", @@ -468,7 +526,65 @@ }] }, "default_value": 0, - "nb_cols": 4 + "nb_cols": 5 + } + ] + }, + { + "fields": [ + { + "type": "radio", + "name": "dataencrypt", + "label": "FORM_DATAENCRYPT_USER_USER", + "nb_cols": 5, + "options": { + "choices": [ + { + "label": "Oui", + "value": true + }, + { + "label": "Non", + "value": false + } + ] + }, + "default_value": false + }, + { + "type": "radio", + "name": "usepersonaldata", + "label": "FORM_USEPERSONALDATA_PUBLICATION_WORKSPACE", + "nb_cols": 5, + "options": { + "choices": [ + { + "label": "Oui", + "value": true + }, + { + "label": "Non", + "value": false + } + ] + }, + "default_value": false + } + ] + }, + { + "fields": [ + { + "type": "float", + "name": "unitcost", + "label": "FORM_UNITCOST_PUBLICATION_WORKSPACE", + "nb_cols": 5 + }, + { + "type": "float", + "name": "costpersecond", + "label": "FORM_COSTPERSECOND_PUBLICATION_WORKSPACE", + "nb_cols": 5 } ] }, @@ -607,13 +723,45 @@ "type": "label", "name": "subscription", "label": "FORM_SUBSCRIPTION_AVAILABLE_PUBLICATION_WORKSPACE", - "nb_cols": 4 + "nb_cols": 5 }, { "type": "label", "name": "survey", "label": "FORM_SURVEY_AVAILABLE_PUBLICATION_WORKSPACE", - "nb_cols": 4 + "nb_cols": 5 + } + ] + }, + { + "fields": [ + { + "type": "label", + "name": "dataencrypt", + "label": "FORM_DATAENCRYPT_PUBLICATION_WORKSPACE", + "nb_cols": 5 + }, + { + "type": "label", + "name": "usepersonaldata", + "label": "FORM_USEPERSONALDATA_PUBLICATION_WORKSPACE", + "nb_cols": 5 + } + ] + }, + { + "fields": [ + { + "type": "label", + "name": "unitcost", + "label": "FORM_UNITCOST_PUBLICATION_WORKSPACE", + "nb_cols": 5 + }, + { + "type": "label", + "name": "costpersecond", + "label": "FORM_COSTPERSECOND_PUBLICATION_WORKSPACE", + "nb_cols": 5 } ] }, diff --git a/src/module_gtf/module/forms/supervision/supervision_gtf_order.json b/src/module_gtf/module/forms/supervision/supervision_gtf_order.json index 9ba137b52d1ba548900a4f95c13d4cb5c2043797..9cf0cd54df09f18516a7c3caa9140090bd4f9147 100755 --- a/src/module_gtf/module/forms/supervision/supervision_gtf_order.json +++ b/src/module_gtf/module/forms/supervision/supervision_gtf_order.json @@ -62,23 +62,6 @@ "label":"FORM_DATE_SUPERVISION_ORDER", "nb_cols":4 }, - { - "type":"select", - "name":"priority_id", - "label":"FORM_PRIORITY_SUPERVISION_ORDER", - "web_service":{ - "ressource_id":"gtf/priorities", - "id_key":"priority_id", - "label_key":"priority_label", - "parameters":{ - "filter":{ - "lang":"getPropertie('language')" - }, - "order_by":"priority_label" - } - }, - "nb_cols":4 - }, { "type":"select", "name":"gtf_engine_id", @@ -178,8 +161,8 @@ "fields":[ { "type":"label", - "name":"priority_label", - "label":"FORM_PRIORITY_SUPERVISION_ORDER", + "name":"login", + "label":"FORM_OWNER_SUPERVISION_ORDER", "nb_cols":12 } ] @@ -188,8 +171,8 @@ "fields":[ { "type":"label", - "name":"login", - "label":"FORM_OWNER_SUPERVISION_ORDER", + "name":"order_date", + "label":"FORM_DATE_SUPERVISION_ORDER", "nb_cols":12 } ] @@ -198,8 +181,8 @@ "fields":[ { "type":"label", - "name":"order_date", - "label":"FORM_DATE_SUPERVISION_ORDER", + "name":"execution_date", + "label":"FORM_WORK_DATE_SUPERVISION_ORDER", "nb_cols":12 } ] @@ -208,8 +191,8 @@ "fields":[ { "type":"label", - "name":"execution_date", - "label":"FORM_WORK_DATE_SUPERVISION_ORDER", + "name":"minexecdate", + "label":"FORM_MINEXECDATE_SUPERVISION_ORDER", "nb_cols":12 } ] diff --git a/src/module_gtf/module/forms/users/users_vitis_group_qualigeo.json b/src/module_gtf/module/forms/users/users_vitis_group_qualigeo.json new file mode 100755 index 0000000000000000000000000000000000000000..88b3dbe798162c8f5f4cd42ef131aab01aadc925 --- /dev/null +++ b/src/module_gtf/module/forms/users/users_vitis_group_qualigeo.json @@ -0,0 +1,155 @@ +{ + "display": { + "name": "qualigeo_group-display-form", + "title": "FORM_TITLE_USERS_GROUP", + "input_size": "xxs", + "nb_cols": 9, + "javascript": false, + "rows": [ + { + "fields": [ + { + "type": "label", + "name": "group_schema", + "label": "FORM_USERS_GROUP_QUALIGEO_DOUBLE_SELECT", + "nb_cols": 12, + "id": "Element_0_2_1" + } + ] + } + ], + "tabs": { + "position": "top", + "list": [ + { + "label": "Tab 0", + "elements": [ + "group_schema" + ] + } + ] + }, + "event": "sendSimpleForm()", + "afterEvent": "editSectionForm()" + }, + "search": {}, + "insert": {}, + "update": { + + "name": "qualigeo_group-update-form", + "title": "FORM_TITLE_USERS_GROUP", + "input_size": "xxs", + "nb_cols": 9, + "javascript": false, + "rows": [ + { + "fields": [ + { + "type": "double_select", + "name": "group_schema", + "label": "FORM_USERS_GROUP_QUALIGEO_DOUBLE_SELECT", + "required": false, + "nb_cols": 12, + "id": "Element_0_2_1", + "name_to": "group_schema", + "name_from": "group_schema_from", + "label_from": "FORM_USERS_GROUP_QUALIGEO_SCHEMA_AVAILABLE", + "label_to": "FORM_USERS_GROUP_QUALIGEO_SCHEMA_ASSOCIATE", + "id_from": "Element_0_2_1_from", + "datasource": { + "datasource_id": "datasource_3", + "sort_order": "ASC", + "distinct": "true", + "id_key": "id_schema", + "label_key": "schema", + "attributs": "schema|id_schema", + "order_by": "schema" + }, + "size": 12 + } + ] + }, + { + "fields": [ + { + "type": "button", + "class": "btn-ungroup btn-group-sm", + "nb_cols": 12, + "name": "insert_button", + "buttons": [ + { + "type": "submit", + "name": "form_submit", + "label": "FORM_UPDATE", + "class": "btn-primary" + }, + { + "type": "button", + "name": "return_list", + "label": "FORM_RETURN_LIST", + "class": "btn-primary", + "event": "setMode(\"search\")" + } + ], + "id": "undefined_5_1" + } + ] + } + ], + "tabs": { + "position": "top", + "list": [ + { + "label": "Tab 0", + "elements": [ + "insert_button", + "group_schema" + ] + } + ] + }, + "event": "sendSimpleForm()" + }, + "datasources": { + "datasource_1": { + "type": "web_service", + "dataType": "tableValue", + "name": "datasource_1", + "description": "", + "parameters": { + "schema": "s_wab", + "table": "v_module_t" + }, + "ressource_id": "vitis/genericquerys", + "id": "datasource_1" + }, + "datasource_2": { + "type": "web_service", + "dataType": "tableValue", + "name": "datasource_2", + "description": "", + "parameters": { + "schema": "s_wab", + "table": "v_privilege_t" + }, + "ressource_id": "vitis/genericquerys", + "id": "datasource_2" + }, + "datasource_3": { + "type": "web_service", + "dataType": "tableValue", + "name": "datasource_3", + "description": "", + "parameters": { + "filter": { + "relation": "AND", + "operators": [] + }, + "schema": "q_constraint", + "table": "schema" + }, + "ressource_id": "vitis/genericquerys", + "id": "datasource_3" + } + } +} \ No newline at end of file diff --git a/src/module_gtf/module/javascript/controllers/userOrderCtrl.js b/src/module_gtf/module/javascript/controllers/userOrderCtrl.js index b038298914776c9c66705d0e62fb29b80c2217c4..498efbab65ea5391ba3dda58e684425dc4ddcaf7 100755 --- a/src/module_gtf/module/javascript/controllers/userOrderCtrl.js +++ b/src/module_gtf/module/javascript/controllers/userOrderCtrl.js @@ -6,10 +6,30 @@ goog.require("vitis.modules.main"); * userOrder Controller. * . * @param {angular.$log} $log Angular log service. + * @param {angular.$rootScope} $rootScope Angular rootScope. + * @param {$translateProvider.$translate} $translate TranslateProvider translate service. + * @param {service} envSrvc Paramètres d'environnement. + * @param {service} formSrvc Service de gestion des formulaires. * @ngInject **/ -vitisApp.userOrderCtrl = function ($log) { +vitisApp.userOrderCtrl = function ($log, $rootScope, $translate, envSrvc, formSrvc) { // Initialisation $log.info("initUserOrder"); + // Attends la fin de la compilation du formulaire. + var clearListener = $rootScope.$on("formExtracted", function(event) { + // Supprime le "listener". + clearListener(); + // Texte indicatif (placeholder) si aucune date de planification est sélectionnée. + $translate(["FORM_MINEXECDATE_PLACE_HOLDER_MY_WORK_USER_ORDER"]).then(function (translations) { + if (envSrvc["sMode"] == "insert") { + var oMinExecDateFormElemDef = formSrvc["getFormElementDefinition"]("minexecdate", envSrvc["sFormDefinitionName"]); + document.getElementById(oMinExecDateFormElemDef["id"]).setAttribute("placeholder", translations["FORM_MINEXECDATE_PLACE_HOLDER_MY_WORK_USER_ORDER"]); + } + else { + if (!goog.isDefAndNotNull(envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["minexecdate"])) + envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["minexecdate"] = translations["FORM_MINEXECDATE_PLACE_HOLDER_MY_WORK_USER_ORDER"]; + } + }); + }); }; vitisApp.module.controller("userOrderCtrl", vitisApp.userOrderCtrl); diff --git a/src/module_gtf/module/javascript/directives/projectDirectoryDrtv.js b/src/module_gtf/module/javascript/directives/projectDirectoryDrtv.js index 68385c5ab6c42f5977a11190807510288fbcff17..89be6a4ac36233c139a350f0a7063da026ec8e2f 100755 --- a/src/module_gtf/module/javascript/directives/projectDirectoryDrtv.js +++ b/src/module_gtf/module/javascript/directives/projectDirectoryDrtv.js @@ -91,6 +91,13 @@ vitisApp.appProjectDirectoryTreeviewDrtv = function(propertiesSrvc, envSrvc) { "data": scope["aTreeviewLogs"]["data"] }); } + else if (response["data"]["status"] == 0) { + var oOptions = { + "className": "modal-danger", + "message": response["data"]["errorMessage"] + }; + scope["modalWindow"]("dialog", "REQUEST_ERROR", oOptions); + } } }); }; diff --git a/src/module_gtf/module/javascript/script_module.js b/src/module_gtf/module/javascript/script_module.js old mode 100755 new mode 100644 index 0aae7bb9c4ed4bc4c2a06a47cf0fc017c54dc5a4..5558663235c31ed48a18d3e75b77898f287d972d --- a/src/module_gtf/module/javascript/script_module.js +++ b/src/module_gtf/module/javascript/script_module.js @@ -238,8 +238,13 @@ vitisApp.on('appMainDrtvLoaded', function () { } // Test en erreur ? var sErrorMessage; - if (scope["oTestFmeEngineResult"]["exists"] !== true) - sErrorMessage = "ERROR_FME_PATH_ENGINE_FME_ENGINE"; + var sServerType = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["fme_engine_type_id"]; + if (sServerType == "desktop" && scope["oTestFmeEngineResult"]["exists"] !== true) + sErrorMessage = "ERROR_FME_PATH_ENGINE_FME_ENGINE"; // + else if (scope["oTestFmeEngineResult"]["expired"] === true) + sErrorMessage = "ERROR_FME_LICENSE_EXPIRED_ENGINE_FME_ENGINE"; + else if (scope["oTestFmeEngineResult"]["request_error"] === true) + sErrorMessage = "ERROR_FME_REQUEST_ERROR_ENGINE_FME_ENGINE"; else if (scope["oTestFmeEngineResult"]["valid"] !== true) sErrorMessage = "ERROR_FME_LICENSE_ENGINE_FME_ENGINE"; if (typeof (sErrorMessage) !== "undefined") { @@ -1105,7 +1110,6 @@ vitisApp.on('appMainDrtvLoaded', function () { var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); var $timeout = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$timeout"]); var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); - var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]); $log.info("initSubForm"); // Attends la fin de l'affichage du 1er formulaire. var clearListener = $rootScope.$on('formExtracted', function (event) { @@ -1119,10 +1123,6 @@ vitisApp.on('appMainDrtvLoaded', function () { scope["loadSubForm"](this.value, scope, element); }); }, 100); - } else { - // Formatage de la date de demande. - if (goog.isDefAndNotNull(envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["order_date"])) - envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["order_date"] = moment(envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["order_date"]).format('L LTS'); } }); @@ -1216,7 +1216,7 @@ vitisApp.on('appMainDrtvLoaded', function () { } }; vitisApp["compileProvider"].directive("appMessageStatusIconColumn", vitisApp.appMessageStatusIconColumnDrtv); - + /** * appMessageBodyColumn directive. * Mise en forme de la colonne "body" dans la liste de l'onglet "my_work_3" (messages de gtf). @@ -1453,7 +1453,7 @@ vitisApp.on('appMainDrtvLoaded', function () { } sColumn = "order_status_id"; } - // Onglet "Abonnements" / "Surveillances". + // Onglet "Messages". else if (envSrvc["oSelectedObject"]["name"] == "supervision_gtf_message"){ if (typeof (envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]) != "undefined" && typeof (envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["enabled"]) != "undefined") envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["status"] = JSON.parse(sFilter.toLowerCase()); @@ -2363,7 +2363,7 @@ vitisApp.on('appMainDrtvLoaded', function () { "sUrl": "modules/gtf/forms/" + envSrvc["oSelectedMode"]["mode_id"] + "/" + sTable + "_" + envSrvc["oSectionForm"][sTable]["sections"][envSrvc["oSectionForm"][sTable]["iSelectedSectionIndex"]]["name"] + ".json" }; }; - + /** * loadLicenseConfig function. * Chargement de la section "Licence" dans l'onglet "Configuration". @@ -2524,7 +2524,7 @@ vitisApp.on('appMainDrtvLoaded', function () { var oFormValues = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]; // Paramètres pour le template du widget. scope['oWidgetParams'] = { - 'client_url': propertiesSrvc['web_server_name'] + '/' + sessionStorage['appEnv'], + 'client_url': propertiesSrvc['web_server_name'] + '/' + propertiesSrvc['application_name'], 'button_label': vitisApp['htmlentities'](oFormValues['buttonText']) }; // Fichiers js à charger. @@ -2588,7 +2588,7 @@ vitisApp.on('appMainDrtvLoaded', function () { "data": {"widgetFileContent": sCode}, "scope": scope, "success": function(response) { - oFormValues['url_widget_file'] = propertiesSrvc['web_server_name'] + '/' + propertiesSrvc['ws_data_alias'] + '/gtf/widget/' + response["data"]['workspace_key'] + '.html?token=' + oFormValues['token']; + oFormValues['url_widget_file'] = response["data"]['widget_file_url']; oFormValues['btn_download_widget_file'] = oFormValues['url_widget_file']; formSrvc['getFormElementDefinition']('url_widget_file', envSrvc['sFormDefinitionName'])['visible'] = true; formSrvc['getFormElementDefinition']('btn_download_widget_file', envSrvc['sFormDefinitionName'])['visible'] = true; @@ -2677,7 +2677,8 @@ vitisApp.on('appMainDrtvLoaded', function () { "scope": scope, "success": function(response) { if (response["data"]['status'] === 1) { - oFormValues['url_widget_file'] = propertiesSrvc['web_server_name'] + '/' + propertiesSrvc['ws_data_alias'] + '/gtf/widget/' + response["data"]['workspace_key'] + '.html?token=' + oFormValues['token']; + var oFormValues = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]; + oFormValues['url_widget_file'] = response["data"]['widget_file_url']; oFormValues['btn_download_widget_file'] = oFormValues['url_widget_file']; formSrvc['getFormElementDefinition']('url_widget_file', envSrvc['sFormDefinitionName'])['visible'] = true; formSrvc['getFormElementDefinition']('btn_download_widget_file', envSrvc['sFormDefinitionName'])['visible'] = true; @@ -2697,6 +2698,8 @@ vitisApp.on('appMainDrtvLoaded', function () { var envSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(['envSrvc']); var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(['propertiesSrvc']); var formSrvc = angular.element(vitisApp.appMainDrtv).injector().get(['formSrvc']); + var $rootScope = angular.element(vitisApp.appMainDrtv).injector().get(["$rootScope"]); + var $translate = angular.element(vitisApp.appMainDrtv).injector().get(["$translate"]); // var scope = this; ajaxRequest({ @@ -2709,10 +2712,14 @@ vitisApp.on('appMainDrtvLoaded', function () { formSrvc['getFormElementDefinition']('url_widget_file', envSrvc['sFormDefinitionName'])['visible'] = false; formSrvc['getFormElementDefinition']('btn_download_widget_file', envSrvc['sFormDefinitionName'])['visible'] = false; formSrvc['getFormElementDefinition']('btn_delete_widget_file', envSrvc['sFormDefinitionName'])['visible'] = false; + // Affiche le message de succés. + $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) { + $.notify(sTranslation, "success"); + }); } else { // Affichage de la fenêtre modale d'erreur. - this['modalWindow']('dialog', response["data"]['errorMessage'], {'className': 'modal-danger'}); + $rootScope['modalWindow']('dialog', response["data"]['errorMessage'], {'className': 'modal-danger'}); } } }); @@ -2790,7 +2797,7 @@ vitisApp.on('appMainDrtvLoaded', function () { "className": "modal-danger", "message": response["data"]["errorMessage"] }; - scope["modalWindow"]("dialog", "ERROR_REEINTEGRATE_METADATA_PUBLICATION_WORKSPACE", oOptions); + scope["modalWindow"]("dialog", "ERROR_REINTEGRATE_METADATA_PUBLICATION_WORKSPACE", oOptions); } else { // Affiche le message de succés. $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) { @@ -2841,9 +2848,6 @@ vitisApp.on('appMainDrtvLoaded', function () { oFormValues["form_type"] = aTranslation[sTranslationId]; angular.element(vitisApp.appMainDrtv).scope().$emit("WorkspaceGeneralSectionReady"); }); - // Formatage de la date de création du projet FME. - if (goog.isDefAndNotNull(oFormValues["creation_date"])) - oFormValues["creation_date"] = moment(oFormValues["creation_date"]).format('L'); // Traduction des valeurs booléennes (disponible sur abonnement, disponible pour surveillance, verrou). if (envSrvc["sMode"] === "display") { var scope = this; @@ -2853,6 +2857,17 @@ vitisApp.on('appMainDrtvLoaded', function () { scope.$root["getBooleanTranslation"](oFormValues["survey"]).then(function (sTranslation) { oFormValues["survey"] = sTranslation; }); + scope.$root["getBooleanTranslation"](oFormValues["dataencrypt"]).then(function (sTranslation) { + oFormValues["dataencrypt"] = sTranslation; + }); + scope.$root["getBooleanTranslation"](oFormValues["usepersonaldata"]).then(function (sTranslation) { + oFormValues["usepersonaldata"] = sTranslation; + }); + // Symbole "Euro". + if (goog.isDefAndNotNull(oFormValues["unitcost"]) && !isNaN(oFormValues["unitcost"])) + oFormValues["unitcost"] += " €"; + if (goog.isDefAndNotNull(oFormValues["costpersecond"]) && !isNaN(oFormValues["costpersecond"])) + oFormValues["costpersecond"] += " €"; } // Paramètres du lien vers le fichier fmw du projet fme. var oFmwFileUrlElementDef = formSrvc["getFormElementDefinition"]("fmw_file_url", envSrvc["sFormDefinitionName"]); @@ -2958,12 +2973,6 @@ vitisApp.on('appMainDrtvLoaded', function () { var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); // $log.info("initPublicationWorkspaceUpdateMetaDataForm"); - // Formatage de la date de dernière sauvegarde des métadonnées. - var scope = this; - if (goog.isDefAndNotNull(envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["last_save_date"])) { - envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["last_save_date"] = moment(envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["last_save_date"]).format('L LTS'); - scope.$apply(); - } }; /** @@ -3172,22 +3181,180 @@ vitisApp.on('appMainDrtvLoaded', function () { }; /** - * loadGtfGroupQualigeo function. - * Chargement de la section "Qualigeo" dans l'onglet "Groupes" (mode "Utilisateurs"). + * displayFormFields function. + * Affiche la liste des champs de formulaire passée en paramètre et cache les autres. + * @param {array} aFormFieldsToDisplay Tableau de champs de formulaire à afficher. **/ - angular.element(vitisApp.appMainDrtv).scope()["loadGtfGroupQualigeo"] = function () { - console.log("FJHGIFHGFIHGIFHGIHGIORGHIO"); + angular.element(vitisApp.appMainDrtv).scope()["displayFormFields"] = function (aFormFieldsToDisplay) { // Injection des services. var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); - var envSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["envSrvc"]); + var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); + var formSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["formSrvc"]); + var externFunctionSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["externFunctionSrvc"]); // - $log.info("loadGtfGroupQualigeo"); - // Surcharge l'url du formulaire des groupes de Gtf. - var scope = this; - var sTable = envSrvc["oSelectedObject"]["name"]; - scope["oFormRequestParams"] = { - "sUrl": "modules/gtf/forms/" + envSrvc["oSelectedMode"]["mode_id"] + "/" + sTable + "_" + envSrvc["oSectionForm"][sTable]["sections"][envSrvc["oSectionForm"][sTable]["iSelectedSectionIndex"]]["name"] + ".json" + $log.info("displayFormFields"); + // + var aFormFields = formSrvc["getAllFormElementDefinition"](envSrvc["sFormDefinitionName"], envSrvc["oFormDefinition"]); + var i, j; + if (Array.isArray(aFormFields)) { + for (i = 0; i < aFormFields.length; i++) { + if (aFormFieldsToDisplay.indexOf(aFormFields[i]["name"]) == -1) + aFormFields[i]["visible"] = false; + else + aFormFields[i]["visible"] = true; + // Boutons + if (Array.isArray(aFormFields[i]["buttons"])) { + for (j = 0; j < aFormFields[i]["buttons"].length; j++) { + if (aFormFieldsToDisplay.indexOf(aFormFields[i]["buttons"][j]["name"]) == -1) + aFormFields[i]["buttons"][j]["visible"] = false; + else { + aFormFields[i]["buttons"][j]["visible"] = true; + aFormFields[i]["visible"] = true; + } + } + } + } + // Rafraîchit le formulaire. + var formScope = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"]).scope(); + formScope.$broadcast('$$rebind::refresh'); + formScope.$applyAsync(); + // + externFunctionSrvc["resizeWin"](); + } + }; + + /** + * initGtfFmeEngineForm function. + * Traitements avant l'affichage du formulaire de l'onglet "Moteur FME". + **/ + angular.element(vitisApp.appMainDrtv).scope()["initGtfFmeEngineForm"] = function () { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $rootScope = angular.element(vitisApp.appMainDrtv).injector().get(["$rootScope"]); + var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); + var formSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["formSrvc"]); + // + $log.info("initGtfFmeEngineForm"); + // + var clearListener = $rootScope.$on('formExtracted', function (event, sFormDefinitionName) { + // Supprime le "listener". + clearListener(); + // Affiche et cache les champs de form. suivant le type de moteur fme. + var oServerType = formSrvc["getFormElementDefinition"]("fme_engine_type_id", envSrvc["sFormDefinitionName"], envSrvc["oFormDefinition"]); + var sServerType = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["fme_engine_type_id"]; + if (typeof(sServerType) == "object") + sServerType = sServerType["selectedOption"]["value"]; + var formScope = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"]).scope(); + formScope["server_url"] = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["server_url"]; + // Affichage des champs de form. en fonction du type de moteur sélectionné. + if (envSrvc["sMode"] != "insert") + $rootScope["setGtfFmeEngineForm"](sServerType); + if (envSrvc["sMode"] != "display") { + document.getElementById(oServerType["id"]).addEventListener("change", function () { + $rootScope["setGtfFmeEngineForm"](this.value); + }); + } + // Désactivation des boutons de l'instance Fme Server suivant son statut . + if (sServerType == "fme_cloud" && envSrvc["sMode"] == "update") + $rootScope["refreshFmeServerInstanceStatus"](); + }); + }; + + /** + * setGtfFmeEngineForm function. + * Affichage des champs du formulaire de l'onglet "Moteur FME" suivant le type passé. + * @param {string} sServerType Type de moteur fme. + **/ + angular.element(vitisApp.appMainDrtv).scope()["setGtfFmeEngineForm"] = function (sServerType) { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $rootScope = angular.element(vitisApp.appMainDrtv).injector().get(["$rootScope"]); + var $timeout = angular.element(vitisApp.appMainDrtv).injector().get(["$timeout"]); + var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); + var formSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["formSrvc"]); + var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]); + // + $log.info("setGtfFmeEngineForm"); + var formScope = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"]).scope(); + // Champs de form. à afficher suivant le type de moteur fme. + var aFormFieldsToConcat = ["fme_engine_id", "name", "server_id", "fme_engine_type_id","form_submit","return_list", "useexternaldbconnection"]; + var oFormFieldsToDisplay = { + "desktop": ["local_path", "test_fme_engine"], + "fme_server": ["server_url", "login", "password", "test_fme_engine"], + "fme_cloud": ["server_url", "login", "password", "fme_cloud_api_token", "fme_server_instance_title", "start_fme_server_instance", "pause_fme_server_instance", "fme_server_instance_version", "fme_server_instance_name", "refresh_fme_server_instance_status", "fme_server_instance_status"], // , "s3_access_key_id", "s3_secret_access_key", "s3_region", "amazon_s3_title", "fme_server_s3_bucket", "test_amazon_s3_bucket" + "fme_cloud_for_gtf": ["iam_access_key_id", "iam_secret_access_key", "s3_region", "fme_server_s3_bucket"] }; + if (envSrvc["sMode"] == "display") + aFormFieldsToConcat = aFormFieldsToConcat.concat(["fme_engine_type_label", "server_name"]); + var aFormFieldsToDisplay = []; + if (typeof (oFormFieldsToDisplay[sServerType]) != "undefined") + aFormFieldsToDisplay = oFormFieldsToDisplay[sServerType]; + aFormFieldsToDisplay = aFormFieldsToDisplay.concat(aFormFieldsToConcat); + $rootScope["displayFormFields"](aFormFieldsToDisplay); + // + if (envSrvc["sMode"] != "display") { + $timeout(function () { + // Bug avec les champs de form. "password" qui reste en "readonly". + var aPasswordElem = document.querySelectorAll("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "'] input[type='password']"); + for(var i= 0; i < aPasswordElem.length; i++) + aPasswordElem[i].readOnly = false; + // Url du serveur non modifiable si le type de moteur = fme cloud. + var oFormValues = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]; + var oServerUrl = formSrvc["getFormElementDefinition"]("server_url", envSrvc["sFormDefinitionName"]); + var oServerUrlElem = document.getElementById(oServerUrl["id"]); + if (oServerUrlElem != null) { + if (sServerType == "fme_cloud") { + oServerUrlElem.readOnly = true; + formScope["server_url"] = oFormValues["server_url"]; + oFormValues["server_url"] = propertiesSrvc['fme_cloud_api_url']; + } + else { + oServerUrlElem.readOnly = false; + if (typeof(formScope["server_url"]) != "undefined") + oFormValues["server_url"] = formScope["server_url"]; + else + oFormValues["server_url"] = ''; + } + } + }); + } + } + + /** + * generateGtfInstanceId function. + * Génération de l'identifiant de l'instance de GTF. + **/ + angular.element(vitisApp.appMainDrtv).scope()["generateGtfInstanceId"] = function () { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $translate = angular.element(vitisApp.appMainDrtv).injector().get(["$translate"]); + var envSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["envSrvc"]); + var propertiesSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["propertiesSrvc"]); + // + $log.info("generateGtfInstanceId"); + // Charge le résumé de la supervision. + var formScope = angular.element('form[name=\'' + envSrvc['oFormDefinition'][envSrvc['sFormDefinitionName']]['name'] + '\']').scope(); + ajaxRequest({ + "method": "POST", + "scope": formScope, + "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/gtf/instance/generate", + "success": function(response) { + if (response["data"]["status"] === 1) { + envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["gtf_instance_id"] = response["data"]["instance_id"]; + // Affiche le message de succés. + $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) { + $.notify(sTranslation, "success"); + }); + } + else { + var oOptions = {"className": "modal-danger"}; + // Message d'erreur ? + if (response["data"]["errorMessage"] !== null) + oOptions["message"] = response["data"]["errorMessage"]; + scope["modalWindow"]("alert", "REQUEST_ERROR", oOptions); + } + } + }); }; /** @@ -3271,4 +3438,489 @@ vitisApp.on('appMainDrtvLoaded', function () { } }); }; + + /** + * StartFmeServerInstance function. + * Démarre une instance Fme Server (Fme Cloud). + **/ + angular.element(vitisApp.appMainDrtv).scope()["StartFmeServerInstance"] = function () { + // Injection des services. + var $translate = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$translate"]); + var $log = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$log"]); + var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); + var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]); + var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); + // + $log.info("StartFmeServerInstance"); + $rootScope["removeFmeServerInstanceInfo"](); + var oFormValues = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]; + var oParams = { + "fme_engine_id": oFormValues['fme_engine_id'], + }; + ajaxRequest({ + "method": "PUT", + "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/gtf/fmeengines/" + oFormValues['fme_engine_id'] + "/instances/" + oFormValues["fme_server_instance_name"] + "/start", + "data": oParams, + "success": function(response) { + if (response["data"]["status"] == 0) { + var oOptions = { + "className": "modal-danger", + "message": response["data"]["errorMessage"] + }; + $rootScope["modalWindow"]("dialog", "REQUEST_ERROR", oOptions); + } else { + // Mise à jour du statut de l'instance. + $rootScope["setFmeServerInstanceStatus"](response["data"]["instance"]["state"]); + // Affichage du message de succés. + $translate("MSG_FME_SERVER_INSTANCE_EXECUTING_START_ENGINE_FME_ENGINE").then(function (sTranslation) { + $.notify(sTranslation, "success"); + }); + } + } + }); + }; + + /** + * PauseFmeServerInstance function. + * Met en pause une instance Fme Server (Fme Cloud). + **/ + angular.element(vitisApp.appMainDrtv).scope()["PauseFmeServerInstance"] = function () { + // Injection des services. + var $translate = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$translate"]); + var $log = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$log"]); + var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); + var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]); + var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); + // + $log.info("PauseFmeServerInstance"); + // + $rootScope["removeFmeServerInstanceInfo"](); + var oFormValues = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]; + var oParams = { + "fme_engine_id": oFormValues['fme_engine_id'], + }; + ajaxRequest({ + "method": "PUT", + "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/gtf/fmeengines/" + oFormValues['fme_engine_id'] + "/instances/" + oFormValues["fme_server_instance_name"] + "/pause", + "data": oParams, + "success": function(response) { + if (response["data"]["status"] == 0) { + // Affichage du message d'erreur. + var oOptions = { + "className": "modal-danger", + "message": response["data"]["errorMessage"] + }; + $rootScope["modalWindow"]("dialog", "REQUEST_ERROR", oOptions); + } else { + // Mise à jour du statut de l'instance. + $rootScope["setFmeServerInstanceStatus"](response["data"]["instance"]["state"]); + // Affichage du message de succés. + $translate("MSG_FME_SERVER_INSTANCE_EXECUTING_PAUSE_ENGINE_FME_ENGINE").then(function (sTranslation) { + $.notify(sTranslation, "success"); + }); + } + } + }); + }; + + /** + * getFmeServerInstance function. + * Retourne une instance Fme Server (Fme Cloud). + * @param {number} sFmeEngineId Id du moteur Fme. + * @param {string} sFmeServerInstanceName Nom de l'instance Fme Server. + * @return {object} + **/ + angular.element(vitisApp.appMainDrtv).scope()["getFmeServerInstance"] = function (sFmeEngineId, sFmeServerInstanceName) { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $q = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$q"]); + var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); + var propertiesSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["propertiesSrvc"]); + // + $log.info("getFmeServerInstance"); + // Charge les infos de l'instance Fme Server sur Fme Cloud. + var deferred = $q.defer(); + var promise = deferred.promise; + ajaxRequest({ + "method": "GET", + "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/gtf/fmeengines/" + sFmeEngineId + "/instances/" + sFmeServerInstanceName, + "success": function(response) { + if (response["data"]["status"] == 0) { + var oOptions = { + "className": "modal-danger", + "message": response["data"]["errorMessage"] + }; + $rootScope["modalWindow"]("dialog", "REQUEST_ERROR", oOptions); + deferred.reject(false); + } else { + deferred.resolve(response["data"]["instance"]); + } + } + }); + return promise; + }; + + /** + * displayFmeServerInstanceInfo function. + * Affiche les informations d'une instance Fme Server sur Fme Cloud. + **/ + angular.element(vitisApp.appMainDrtv).scope()["displayFmeServerInstanceInfo"] = function () { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); + var $templateRequest = angular.element(vitisApp.appMainDrtv).injector().get(["$templateRequest"]); + var $compile = angular.element(vitisApp.appMainDrtv).injector().get(["$compile"]); + var propertiesSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["propertiesSrvc"]); + var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); + // + $log.info("displayFmeServerInstanceInfo"); + var scope = this; + var oFormValues = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]; + // Charge les infos de l'instance Fme Server sur Fme Cloud. + ajaxRequest({ + "method": "GET", + "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/gtf/fmeengines/" + oFormValues['fme_engine_id'] + "/instances/" + oFormValues["fme_server_instance_name"] + "/info", + "success": function(response) { + if (response["data"]["status"] == 0) { + var oOptions = { + "className": "modal-danger", + "message": response["data"]["errorMessage"] + }; + $rootScope["modalWindow"]("dialog", "REQUEST_ERROR", oOptions); + } else { + // Informations sur Fme server pour le template. + scope["oTestFmeEngineResult"] = { + "exists" : true, + "valid" : true, + "host" : response["data"]["info"]["host"], + "type" : response["data"]["info"]["version"], + "version" : response["data"]["info"]["build"], + }; + // Création de l'élément html pour afficher le template. + var sContainerElementName = scope["sFormDefinitionName"] + "_fme_server_info_container"; + var oLastFormElement = document.querySelector(".fme_cloud_button").nextSibling; + if (document.getElementById(sContainerElementName) === null) { + var oDiv = document.createElement("div"); + oDiv.id = scope["sFormDefinitionName"] + "_fme_server_info_container"; + oLastFormElement.parentElement.insertBefore(oDiv, oLastFormElement); + } + // Compile le template du résultat. + $templateRequest("modules/gtf/templates/testFmeEngineTpl.html").then(function (sTemplate) { + $compile($("#" + sContainerElementName).html(sTemplate).contents())(scope); + }); + } + } + }); + }; + + /** + * setFmeServerInstanceButtonsStatus function. + * Active ou désactive les boutons de l'instance Fme Server suivant son statut. + * @param {string} sFmeServerInstanceName Nom de l'instance Fme Server. + **/ + angular.element(vitisApp.appMainDrtv).scope()["setFmeServerInstanceButtonsStatus"] = function (sFmeServerInstanceStatut) { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var formSrvc = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["formSrvc"]); + var envSrvc = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["envSrvc"]); + // + $log.info("setFmeServerInstanceButtonsStatus"); + // Les boutons sont désactivés par défaut. + var oStartInstanceFormElem = formSrvc["getFormElementDefinition"]("start_fme_server_instance", envSrvc["sFormDefinitionName"]); + var oPauseInstanceFormElem = formSrvc["getFormElementDefinition"]("pause_fme_server_instance", envSrvc["sFormDefinitionName"]); + var oInstanceVersionFormElem = formSrvc["getFormElementDefinition"]("fme_server_instance_version", envSrvc["sFormDefinitionName"]); + oStartInstanceFormElem["disabled"] = true; + oPauseInstanceFormElem["disabled"] = true; + oInstanceVersionFormElem["disabled"] = true; + if (sFmeServerInstanceStatut == "RUNNING") { + oPauseInstanceFormElem["disabled"] = false; + oInstanceVersionFormElem["disabled"] = false; + } + else if (sFmeServerInstanceStatut == "PAUSED") + oStartInstanceFormElem["disabled"] = false; + // Rafraîchit le formulaire. + var formScope = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"]).scope(); + formScope.$broadcast('$$rebind::refresh'); + formScope.$applyAsync(); + }; + + /** + * removeFmeServerInstanceInfo function. + * Supprime les informations d'une instance Fme Server sur Fme Cloud. + **/ + angular.element(vitisApp.appMainDrtv).scope()["removeFmeServerInstanceInfo"] = function () { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var envSrvc = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["envSrvc"]); + // + $log.info("removeFmeServerInstanceInfo"); + var oContainerElement = document.getElementById(envSrvc["sFormDefinitionName"] + "_fme_server_info_container"); + if (oContainerElement !== null) + oContainerElement.parentElement.removeChild(oContainerElement); + }; + + /** + * refreshFmeServerInstanceStatus function. + * Charge et met à jour le statut d'une instance Fme Server. + **/ + angular.element(vitisApp.appMainDrtv).scope()["refreshFmeServerInstanceStatus"] = function () { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); + var envSrvc = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["envSrvc"]); + var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]); + // + $log.info("refreshFmeServerInstanceStatus"); + var oFormValues = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]; + // Charge le statut de l'instance Fme Server sur Fme Cloud. + ajaxRequest({ + "method": "GET", + "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/gtf/fmeengines/" + oFormValues['fme_engine_id'] + "/instances/" + oFormValues["fme_server_instance_name"], + "success": function(response) { + if (response["data"]["status"] == 0) { + var oOptions = { + "className": "modal-danger", + "message": response["data"]["errorMessage"] + }; + $rootScope["modalWindow"]("dialog", "REQUEST_ERROR", oOptions); + } else { + // Met à jour le statut. + $rootScope["setFmeServerInstanceStatus"](response["data"]["instance"]["state"]); + } + } + }); + }; + + /** + * setFmeServerInstanceStatus function. + * Met à jour le statut d'une instance Fme Server dans le formulaire "Moteur FME". + * @param {string} sFmeServerInstanceState Statut de l'instance Fme Server. + **/ + angular.element(vitisApp.appMainDrtv).scope()["setFmeServerInstanceStatus"] = function (sFmeServerInstanceState) { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); + var $translate = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$translate"]); + var envSrvc = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["envSrvc"]); + // + $log.info("setFmeServerInstanceStatus"); + var oFormValues = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]; + // Activation des boutons de l'instance Fme Server suivant son statut. + $rootScope["setFmeServerInstanceButtonsStatus"](sFmeServerInstanceState); + // Supprime le loader Ajax à côté des boutons de Fme Cloud. + var oFmeServerInstanceStatusRefreshBtnElem = document.querySelector("button[name='refresh_fme_server_instance_status'] > span"); + oFmeServerInstanceStatusRefreshBtnElem.classList.remove("fme-server-instance-status-button-rotation"); + // Traitements spécifiques si une action est cours d'exécution sur l'instance Fme Server. + if (sFmeServerInstanceState == "executing_action") { + // Loader Ajax à côté des boutons de Fme Cloud. + oFmeServerInstanceStatusRefreshBtnElem.classList.add("fme-server-instance-status-button-rotation"); + // Création d'un interval (si inexistant). + if (!goog.isNumber($rootScope["iFmeServerInstanceStatusInterval"])) { + // Vérification du statut de l'instance Fme Server jusqu'à démarrage. + var iIntervalId = setInterval(function() { + $rootScope["getFmeServerInstance"](oFormValues['fme_engine_id'], oFormValues["fme_server_instance_name"]).then(function(oInstance){ + if (goog.isObject(oInstance)) { + $rootScope["setFmeServerInstanceStatus"](oInstance["state"]); + if (oInstance["state"] != "executing_action") { + // Suppression de l'intervalle. + clearInterval(iIntervalId); + delete($rootScope["iFmeServerInstanceStatusInterval"]); + // L'instance a démarré. + if (oInstance["state"] == "RUNNING") { + // Affichage du message de succés. + $translate("MSG_FME_SERVER_INSTANCE_START_ENGINE_FME_ENGINE").then(function (sTranslation) { + $.notify(sTranslation, "success"); + }); + } + // L'instance est arrétée. + else if (oInstance["state"] == "PAUSED") { + // Affichage du message de succés. + $translate("MSG_FME_SERVER_INSTANCE_PAUSE_ENGINE_FME_ENGINE").then(function (sTranslation) { + $.notify(sTranslation, "success"); + }); + } + } + } + else { + clearInterval(iIntervalId); + delete($rootScope["iFmeServerInstanceStatusInterval"]); + } + }); + }, 6000); + $rootScope["iFmeServerInstanceStatusInterval"] = iIntervalId; + // Attends la suppression du scope. + var formScope = angular.element('form[name=\'' + envSrvc['oFormDefinition'][envSrvc['sFormDefinitionName']]['name'] + '\']').scope(); + formScope.$on("$destroy", function () { + clearInterval(iIntervalId); + delete($rootScope["iFmeServerInstanceStatusInterval"]); + }); + } + } + // Mise à jour l'affichage du statut. + var oFmeServerInstanceStateTranslation = { + "RUNNING": "FORM_FME_SERVER_INSTANCE_STATUS_RUNNING_ENGINE_FME_ENGINE", + "PAUSED": "FORM_FME_SERVER_INSTANCE_STATUS_PAUSED_ENGINE_FME_ENGINE", + "executing_action": "FORM_FME_SERVER_INSTANCE_STATUS_executing_action_ENGINE_FME_ENGINE" + }; + $translate(oFmeServerInstanceStateTranslation[sFmeServerInstanceState]).then(function (sTranslation) { + oFormValues["fme_server_instance_status"] = sTranslation; + }); + }; + + /** + * testAmazonS3BucketConnection function. + * Teste la connexion vers un bucket Amazon S3. + **/ + angular.element(vitisApp.appMainDrtv).scope()["testAmazonS3BucketConnection"] = function () { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); + var $translate = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$translate"]); + var envSrvc = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["envSrvc"]); + var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]); + // + $log.info("testAmazonS3BucketConnection"); + var oFormValues = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]; + // Charge le statut de l'instance Fme Server sur Fme Cloud. + ajaxRequest({ + "method": "GET", + "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/vitis/amazonawsservices/s3/" + oFormValues['fme_server_s3_bucket'] + "/test", + "params": { + "access_key_id": oFormValues["s3_access_key_id"], + "secret_access_key_id": oFormValues["s3_secret_access_key"], + "region": oFormValues["s3_region"]["selectedOption"]["value"], + "bucket_name": oFormValues["fme_server_s3_bucket"] + }, + "success": function(response) { + if (response["data"]["status"] == 0) { + // Affichage du message d'erreur. + var oOptions = { + "className": "modal-danger" + }; + $translate([ + "TEST_AMAZON_S3_BUCKET_ERROR_NO_SUCH_BUCKET_ENGINE_FME_ENGINE", + "TEST_AMAZON_S3_BUCKET_ERROR_INVALID_ACCESS_KEY_ID_FME_ENGINE", + "TEST_AMAZON_S3_BUCKET_ERROR_SIGNATURE_DOES_NOT_MATCH_FME_ENGINE" + ]).then(function (oTranslations) { + switch (response["data"]["message"]) { + case "NoSuchBucket": + oOptions["message"] = oTranslations["TEST_AMAZON_S3_BUCKET_ERROR_NO_SUCH_BUCKET_ENGINE_FME_ENGINE"]; + break; + case "InvalidAccessKeyId": + oOptions["message"] = oTranslations["TEST_AMAZON_S3_BUCKET_ERROR_INVALID_ACCESS_KEY_ID_FME_ENGINE"]; + break; + case "SignatureDoesNotMatch": + oOptions["message"] = oTranslations["TEST_AMAZON_S3_BUCKET_ERROR_SIGNATURE_DOES_NOT_MATCH_FME_ENGINE"]; + break; + }; + $rootScope["modalWindow"]("dialog", "REQUEST_ERROR", oOptions); + }); + } else { + // Affiche le message de succés. + $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) { + $.notify(sTranslation, "success"); + }); + } + } + }); + }; + + /** + * deleteGtfOrders function. + * Suppression d'une ou plusieurs demandes. + **/ + angular.element(vitisApp.appMainDrtv).scope()["deleteGtfOrders"] = function () { + // Injection des services. + var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); + var $log = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$log"]); + var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]); + var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); + // + $log.info("deleteGtfOrders"); + // Charge la liste des pid (job id) de demandes en cours de traitement. + ajaxRequest({ + "method": "GET", + "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/gtf/orders/running", + "success": function(response) { + if (response["data"]["status"] === 1) { + // Liste des demandes sélectionnées. + var aSelectedRows = $rootScope["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["getSelectedRows"](); + var aOrders = response["data"]["orders"]; + if (goog.isArray(aOrders) && aSelectedRows.length > 0) { + var sMessage; + for (var i = 0; i < aSelectedRows.length; i++) { + if (aOrders.indexOf(aSelectedRows[i]["order_id"]) != -1) { + sMessage = "CONFIRM_DELETE_ORDERS_SUPERVISION_ORDER"; + break; + } + } + } + // Supprime les enregistrements. + $rootScope["DeleteSelection"]({"sMessage": sMessage}); + } + else { + var oOptions = {"className": "modal-danger"}; + // Message d'erreur ? + if (response["data"]["errorMessage"] !== null) + oOptions["message"] = response["data"]["errorMessage"]; + $rootScope["modalWindow"]("alert", "REQUEST_ERROR", oOptions); + } + } + }); + }; + + /** + * stopOrderProcess function. + * Arrête une demande en cours. + */ + angular.element(vitisApp.appMainDrtv).scope()["stopOrderProcess"] = function () { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $translate = angular.element(vitisApp.appMainDrtv).injector().get(["$translate"]); + var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); + var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); + var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]); + // + $log.info("stopOrderProcess"); + // Une seule demande peut être arrêté. + var aSelectedRows = $rootScope["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["getSelectedRows"](); + var oOptions = { + "className": "modal-danger" + }; + if (aSelectedRows.length > 0) { + if (aSelectedRows.length == 1) { + if (aSelectedRows[0]["order_status_id"] == 5) { + ajaxRequest({ + "method": "PUT", + "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/gtf/orders/" + aSelectedRows[0]["order_id"] + "/stop", + "params": {"order_id": aSelectedRows[0]["order_id"]}, + //"scope": scope, + "success": function(response) { + if (response["data"]["status"] === 0) { + var oOptions = { + "className": "modal-danger", + "message": response["data"]["errorMessage"] + }; + scope["modalWindow"]("dialog", "REQUEST_ERROR", oOptions); + } else { + // + $rootScope['refreshGrid']($rootScope["gridApi"][envSrvc["sSelectedGridOptionsName"]]['grid']['appScope'], envSrvc["oGridOptions"][envSrvc["sSelectedGridOptionsName"]]); + $rootScope["refreshSupervisionRecap"](); + // Affiche le message de succés. + $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) { + $.notify(sTranslation, "success"); + }); + } + } + }); + } + else + $rootScope["modalWindow"]("dialog", "ERROR_STOP_ORDER_PROCESS_NO_RUNNING_ORDER_SUPERVISION_ORDER", oOptions); + } + else + $rootScope["modalWindow"]("dialog", "ERROR_STOP_ORDER_PROCESS_ONE_ORDER_ONLY_SUPERVISION_ORDER", oOptions); + } + else + $rootScope["modalWindow"]("dialog", "ERROR_STOP_ORDER_PROCESS_NO_SELECTION_SUPERVISION_ORDER", oOptions); + }; }); \ No newline at end of file diff --git a/src/module_gtf/module/javascript/widget/script_widget.js b/src/module_gtf/module/javascript/widget/script_widget.js index 4ade98a80c32086f8f8a2f63b6455205b0465b45..80fe1b777052202c006f3249572fa7332093e269 100755 --- a/src/module_gtf/module/javascript/widget/script_widget.js +++ b/src/module_gtf/module/javascript/widget/script_widget.js @@ -135,6 +135,8 @@ widget.initWidget = function () { var clearFormDefListener = scope.$root.$on('formDefinitionLoaded', function (event, sFormDefinitionName) { // Supprime le "listener". clearFormDefListener(); + // Sauve les valeurs d'origine. + scope["oOriginalFormValues"] = angular.copy(envSrvc["oFormValues"][sFormDefinitionName]); // Vérification avant l'envoi du formulaire envSrvc["oFormDefinition"][sFormDefinitionName]["beforeEvent"] = function () { var deferred = $q.defer(); @@ -313,10 +315,8 @@ widget.sendSubForm = function () { // Affichage du message de succés. $translate("FORM_VALIDATION_OK").then(function (sTranslation) { $.notify(sTranslation, "success"); + formScope[sFormElementName]["appFormSubmitted"] = false; // Recharge le widget. - setTimeout(function(){ - window.location.reload(); - }, 2000); // Vidage du formulaire. //angular.element("#widget_form_container").empty(); /* @@ -558,9 +558,6 @@ widget.formatSubForm = function (scope) { } else sDirectory = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["upload_directory"]; - // - envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["rows"].push({"fields": [formSrvc["getFormElementDefinition"](val["name"], scope["sFormDefinitionName"])]}); - envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]][val["name"]] = envSrvc["oFormValues"][scope["sFormDefinitionName"]][val["name"]]; // Fichier sélectionné. if (typeof (tmp["aFiles"]) != "undefined" && tmp["aFiles"].length > 0) { @@ -612,7 +609,7 @@ widget.formatSubForm = function (scope) { var aWkParams = []; i = 0; while (i < aKeys.length) { - if (aKeys[i] != "email_notifications") + if (aKeys[i] != "email_notifications" && aKeys[i] != "upload_directory") aWkParams.push(aKeys[i] + "=" + oFormValues[aKeys[i]]); i++; } diff --git a/src/module_gtf/module/lang/lang-en.json b/src/module_gtf/module/lang/lang-en.json old mode 100755 new mode 100644 index 7adda04952dd6356c25f9ca9375ebcceea502047..c1006ff20fa1f5a0ebdb9971a7a219413308e168 --- a/src/module_gtf/module/lang/lang-en.json +++ b/src/module_gtf/module/lang/lang-en.json @@ -6,12 +6,14 @@ "TITLE_MODE_SUPERVISION" : "Supervision", "TITLE_MODE_STATISTICS" : "Statistics", "TITLE_MODE_PUBLICATION_AUTHOR" : "Publication", + "TITLE_MODE_EXPLOITATION" : "Exploitation", "TEXT_MODE_MY_WORK" : "User activities", "TEXT_MODE_ENGINE" : "FME settings", "TEXT_MODE_PUBLICATION" : "Publish FME workspaces", "TEXT_MODE_SUPERVISION" : "Supervision", "TEXT_MODE_STATISTICS" : "Production of graphs and tables", "TEXT_MODE_PUBLICATION_AUTHOR" : "Publish FME workspaces", + "TEXT_MODE_EXPLOITATION" : "Exploitation", "" : "", "SECTION_UPDATE_TITLE_PUBLICATION_GTF_WORKSPACE" : "FME Project n°{{sId}}", "SECTION_DISPLAY_TITLE_PUBLICATION_GTF_WORKSPACE" : "FME Project n°{{sId}}", @@ -19,9 +21,7 @@ "SECTION_UPDATE_TITLE_PUBLICATION_GTF_EMAIL_TEMPLATE" : "Email template n°{{sId}}", "SECTION_DISPLAY_TITLE_PUBLICATION_GTF_EMAIL_TEMPLATE" : "Email template n°{{sId}}", "SECTION_INSERT_TITLE_PUBLICATION_GTF_EMAIL_TEMPLATE" : "Email template", - "SECTION_UPDATE_TITLE_PUBLICATION_AUTHOR_GTF_WORKSPACE_AUTHOR" : "FME Project n°{{sId}}", - "SECTION_DISPLAY_TITLE_PUBLICATION_AUTHOR_GTF_WORKSPACE_AUTHOR" : "FME Project n°{{sId}}", - "SECTION_INSERT_TITLE_PUBLICATION_AUTHOR_GTF_WORKSPACE_AUTHOR" : "FME Project", + "SECTION_UPDATE_TITLE_EXPLOITATION_EXPLOITATION" : "Exploitation", "" : "", "FORM_CALCULATE_STATS" : "Calculate", "FORM_TITLE_STATISTICS" : "Select parameters for the statistics", @@ -62,6 +62,12 @@ "FORM_WORK_DATE_SUPERVISION_ORDER" : "Processing date", "FORM_NOTIFICATION_SUPERVISION_ORDER" : "Notification", "FORM_URL_SUPERVISION_ORDER" : "Order URL", + "FORM_MINEXECDATE_SUPERVISION_ORDER" : "Planning date", + "CONFIRM_DELETE_ORDERS_SUPERVISION_ORDER" : "One or more orders are being executed and their processes will be deleted", + "ERROR_STOP_ORDER_PROCESS_NO_SELECTION_SUPERVISION_ORDER" : "Please select a running order to stop it", + "ERROR_STOP_ORDER_PROCESS_ONE_ORDER_ONLY_SUPERVISION_ORDER" : "You can only stop one running order at a time", + "ERROR_STOP_ORDER_PROCESS_NO_RUNNING_ORDER_SUPERVISION_ORDER" : "The selected order is not running", + "STOPPED_BOX_TITLE_SUPERVISION_ORDER" : "Stopped", "" : "", "STATUS_TITLE_SUPERVISION_SUBSCRIPTION" : "Subscriptions", "ENABLED_SUBSCRIPTION_BOX_TITLE_SUPERVISION_SUBSCRIPTION" : "Enabled", @@ -122,6 +128,10 @@ "FORM_MISSING_FORM_PUBLICATION_WORKSPACE" : "Missing form", "FORM_WORKSPACE_NAME_EXISTS_PUBLICATION_WORKSPACE" : "This name is already used by another workspace", "FORM_FMW_FILE_URL_PUBLICATION_WORKSPACE" : "fmw file of the workspace", + "FORM_DATAENCRYPT_PUBLICATION_WORKSPACE" : "Data encryption", + "FORM_USEPERSONALDATA_PUBLICATION_WORKSPACE" : "Use of personal data", + "FORM_UNITCOST_PUBLICATION_WORKSPACE": "Unit cost", + "FORM_COSTPERSECOND_PUBLICATION_WORKSPACE": "Cost per second", "" : "", "FORM_ID_PUBLICATION_WORKSPACE_UPDATE_METADATA" : "ID", "FORM_TITLE_PUBLICATION_WORKSPACE_UPDATE_METADATA" : "Project title", @@ -144,6 +154,7 @@ "ERROR_REINTEGRATE_METADATA_PUBLICATION_WORKSPACE" : "Error while project", "CONFIRM_DELETE_LOCKED_WOKSPACE_PUBLICATION_WORKSPACE": "One or more projects are locked and can not be deleted. Continue ?", "FORM_BTN_REGENERATE_METADATA_TOOLTIP_PUBLICATION_WORKSPACE" : "Remplacement des champs Description, Utilisation, Prérequis et Conditions d'utilisation saisis dans GTF par les valeurs correspondantes contenues dans le projet FME source. Attention, les valeurs actuelles seront supprimées.", + "ERROR_WORKSPACE_FILE_NOT_FOUND" : "Reading error on the.fmw file of the FME project", "" : "", "TOOLTIP_TITLE_IMPORT_TOKEN_CONNECTION" : "Generate a token", "FORM_USER_IMPORT_TOKEN_CONNECTION" : "User", @@ -193,6 +204,7 @@ "" : "", "ERROR_WORKSPACE_NOT_LINKED_USER_GROUPS_WIDGET" : "The workspace is not linked to any group of users", "ERROR_CAPTCHA_VALIDATION_WIDGET" : "The validation of the captcha failed", + "ERROR_CREATION_WIDGET_FILE" : "Error while creating the widget file", "" : "", "FORM_FMW_FILE_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "fmw file", "FORM_ADDITIONAL_RESOURCES_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Additionnal resources", @@ -208,6 +220,7 @@ "ERROR_FMW_FILE_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "The selected file is not a valid fmw file", "ERROR_ADDITIONAL_RESOURCES_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "The selected file type is not allowed", "ERROR_FILE_SIZE_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "The file size exceeds the maximum allowed size.", + "ERROR_FILE_TREE_LOADING_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Error while loading the project file list", "" : "", "DESCRIPTION_TOOLTIP_TITLE_PUBLICATION_WORKSPACE" : "Description", "" : "", @@ -229,6 +242,8 @@ "FORM_TREATMENT_WORKSPACES_MY_WORK_USER_ORDER" : "Workspaces linked to treatment", "ERROR_NO_GTF_ENGINE_CONTENT_MY_WORK_USER_ORDER" : "Please create a GTF engine to add orders", "ERROR_NO_GTF_ENGINE_TITLE_MY_WORK_USER_ORDER" : "No GTF engine", + "FORM_MINEXECDATE_MY_WORK_USER_ORDER" : "Planning date", + "FORM_MINEXECDATE_PLACE_HOLDER_MY_WORK_USER_ORDER" : "As soon as possible", "" : "", "FORM_EXECUTE_WORKSPACE_PUBLICATION_WORKSPACE_SUB_FORM" : "Execute", "FORM_PREVISU_PUBLISHED_PUBLICATION_WORKSPACE_SUB_FORM" : "Preview the published form", @@ -251,6 +266,21 @@ "FME_VERSION_ENGINE_FME_ENGINE" : "Version", "FME_VALIDITY_ENGINE_FME_ENGINE" : "Validity", "FME_TYPE_ENGINE_FME_ENGINE" : "Type", + "ERROR_FME_LICENSE_EXPIRED_ENGINE_FME_ENGINE" : "The licence has expired", + "ERROR_FME_REQUEST_ERROR_ENGINE_FME_ENGINE" : "The request returned an error", + "FORM_BTN_START_FME_SERVER_INSTANCE_ENGINE_FME_ENGINE" : "Start", + "FORM_BTN_PAUSE_FME_SERVER_INSTANCE_ENGINE_FME_ENGINE" : "Stop", + "FORM_BTN_FME_SERVER_INSTANCE_VERSION_ENGINE_FME_ENGINE" : "Version", + "MSG_FME_SERVER_INSTANCE_EXECUTING_PAUSE_ENGINE_FME_ENGINE" : "The Fme Server instance is in the process of being stopped", + "MSG_FME_SERVER_INSTANCE_PAUSE_ENGINE_FME_ENGINE" : "The Fme Server instance is stopped", + "MSG_FME_SERVER_INSTANCE_EXECUTING_START_ENGINE_FME_ENGINE" : "The Fme Server instance is starting up", + "MSG_FME_SERVER_INSTANCE_START_ENGINE_FME_ENGINE" : "The Fme Server instance is running", + "FORM_FME_SERVER_INSTANCE_NAME_ENGINE_FME_ENGINE" : "Nom de l'instance", + "FORM_BTN_REFRESH_FME_SERVER_INSTANCE_STATUT_STATUT_ENGINE_FME_ENGINE" : "Refresh", + "FORM_FME_SERVER_INSTANCE_STATUS_ENGINE_FME_ENGINE" : "Status", + "FORM_FME_SERVER_INSTANCE_STATUS_RUNNING_ENGINE_FME_ENGINE" : "Instance started", + "FORM_FME_SERVER_INSTANCE_STATUS_PAUSED_ENGINE_FME_ENGINE" : "Instance stopped", + "FORM_FME_SERVER_INSTANCE_STATUS_executing_action_ENGINE_FME_ENGINE" : "Instance in the process of stopping or starting", "" : "", "FORM_BTN_CREATE_SUBSCRIPTION_MY_WORK_GTF_USER_SUBSCRIPTION" : "Order", "FORM_BTN_UPDATE_SUBSCRIPTION_MY_WORK_GTF_USER_SUBSCRIPTION" : "Update subscription", @@ -402,9 +432,13 @@ "FORM_PASSWORD_PROXY_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Proxy server password", "FORM_DEFAULT_MAIL_MODEL_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Default email template", "FORM_LOG_SECTION_CONFIGURATION_CONFIGURATION_GTF_CONFIG": "Log", - "FORM_PYCRON_DIR_CONFIGURATION_CONFIGURATION_GTF_CONFIG": "Pycron directory (Windows) / Cron (Linux)", - "FORM_PYCRON_LOG_DIRECTORY_CONFIGURATION_CONFIGURATION_GTF_CONFIG": "Directory Pycron logs", - "FORM_GTF_DOC_ALIAS_CONFIGURATION_CONFIGURATION_GTF_CONFIG": "GTF documentation alias", + "FORM_PYCRON_DIR_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Pycron directory", + "FORM_PYCRON_LOG_DIRECTORY_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Directory Pycron logs", + "FORM_GTF_INSTANCE_ID_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "GTF instance identifier", + "FORM_BTN_GENERATE_GTF_INSTANCE_ID_WORKSPACE_EDIT_WIDGET" : "Generate", + "FORM_EXTERNAL_CONNSTRING_SECTION_CONFIGURATION_CONFIGURATION_GTF_CONFIG" :"External use of GTF_CONNECTION_STRING", + "FORM_EXTERNAL_CONNSTRING_SECTION_CONFIGURATION_CONFIGURATION_CONNECTIONSTRINGIP" : "Public IP for database's connection", + "FORM_EXTERNAL_CONNSTRING_SECTION_CONFIGURATION_CONFIGURATION_CONNECTIONSTRINGPORT" : "Public Port for database's connection", "" : "", "FORM_SUBTITLE_INFORMATIONS_CONFIGURATION_CONFIGURATION_GTF_LICENSE" : "Informations", "FORM_SUBTITLE_REQUEST_CONFIGURATION_CONFIGURATION_GTF_LICENSE" : "Request license", @@ -452,6 +486,42 @@ "FORM_ID_ENGINE_FME_ENGINE" : "ID", "FORM_PATH_ENGINE_FME_ENGINE" : "Path to the FME executable", "FORM_TITLE_ENGINE_FME_ENGINE" : "FME engine {{::name}}", + "FORM_TYPE_ENGINE_FME_ENGINE" : "Type", + "FORM_SERVER_URL_ENGINE_FME_ENGINE" : "Server url", + "FORM_LOGIN_ENGINE_FME_ENGINE" : "User", + "FORM_PASSWORD_ENGINE_FME_ENGINE" : "Password", + "FORM_S3_ACCESS_KEY_ID_ENGINE_FME_ENGINE" : "S3 access key id", + "FORM_S3_SECRET_ACCESS_KEY_ENGINE_FME_ENGINE" : "S3 secret access key", + "FORM_FME_CLOUD_API_TOKEN_ENGINE_FME_ENGINE" : "FME Cloud API token", + "FORM_S3_REGION_ENGINE_FME_ENGINE" : "S3 region", + "FORM_S3_REGION_US-EAST-2_ENGINE_FME_ENGINE" : "US East (Ohio)", + "FORM_S3_REGION_US-EAST-1_ENGINE_FME_ENGINE" : "US East (N. Virginia)", + "FORM_S3_REGION_US-WEST-1_ENGINE_FME_ENGINE" : "US West (N. California)", + "FORM_S3_REGION_US-WEST-2_ENGINE_FME_ENGINE" : "US West (Oregon)", + "FORM_S3_REGION_AP-SOUTH-1_ENGINE_FME_ENGINE" : "Asia Pacific (Mumbai)", + "FORM_S3_REGION_AP-NORTHEAST-2_ENGINE_FME_ENGINE" : "Asia Pacific (Seoul)", + "FORM_S3_REGION_AP-SOUTHEAST-1_ENGINE_FME_ENGINE" : "Asia Pacific (Singapore)", + "FORM_S3_REGION_AP-SOUTHEAST-2_ENGINE_FME_ENGINE" : "Asia Pacific (Sydney)", + "FORM_S3_REGION_AP-NORTHEAST-1_ENGINE_FME_ENGINE" : "Asia Pacific (Tokyo)", + "FORM_S3_REGION_CA-CENTRAL-1_ENGINE_FME_ENGINE" : "Canada (Central)", + "FORM_S3_REGION_CN-NORTH-1_ENGINE_FME_ENGINE" : "China (Beijing)", + "FORM_S3_REGION_EU-CENTRAL-1_ENGINE_FME_ENGINE" : "EU (Frankfurt)", + "FORM_S3_REGION_EU-WEST-1_ENGINE_FME_ENGINE" : "EU (Ireland)", + "FORM_S3_REGION_EU-WEST-2_ENGINE_FME_ENGINE" : "EU (London)", + "FORM_S3_REGION_EU-WEST-3_ENGINE_FME_ENGINE" : "EU (Paris)", + "FORM_S3_REGION_SA-EAST-1_ENGINE_FME_ENGINE" : "South America (São Paulo)", + "FORM_FME_SERVER_INSTANCE_TITLE_ENGINE_FME_ENGINE" : "FME Server instance", + "FORM_AMAZON_S3_TITLE_ENGINE_FME_ENGINE" : "Amazon S3", + "FORM_IAM_ACCESS_KEY_ID_ENGINE_FME_ENGINE" : "IAM access key to the FME Cloud for GTF service", + "FORM_IAM_SECRET_ACCESS_KEY_ENGINE_FME_ENGINE" : "IAM secret access key to the FME Cloud for GTF service", + "FORM_FME_SERVER_S3_BUCKET_ENGINE_FME_ENGINE" : "Bucket name", + "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE" : "Do you want use external GTF_CONNECTION_STRING ?", + "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE_YES" : "Yes (Public database informations)", + "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE_NO" : "No (Private database informations)", + "FORM_BTN_TEST_AMAZON_S3_BUCKET_ENGINE_FME_ENGINE" : "Tester", + "TEST_AMAZON_S3_BUCKET_ERROR_NO_SUCH_BUCKET_ENGINE_FME_ENGINE" : "The specified bucket does not exist", + "TEST_AMAZON_S3_BUCKET_ERROR_INVALID_ACCESS_KEY_ID_FME_ENGINE" : "The S3 Access Key you provided does not exist", + "TEST_AMAZON_S3_BUCKET_ERROR_SIGNATURE_DOES_NOT_MATCH_FME_ENGINE" : "The calculation of the signature does not match. Check your S3 secret access key.", "" : "", "FORM_ID_ENGINE_SERVER" : "ID", "FORM_NAME_ENGINE_SERVER" : "Name", @@ -501,5 +571,8 @@ "FORM_WIDGET_NOTIFICATIONS_NEEDED_PUBLICATION_WORKSPACE_EDIT_WIDGET" : "Email (Mandatory)", "FORM_WIDGET_NOTIFICATIONS_OPTIONAL_PUBLICATION_WORKSPACE_EDIT_WIDGET" : "Email (Optional)", "EXPIRED_WIDGET_TOKEN_ERROR_TITLE": "Session timed out", - "INVALID_WIDGET_TOKEN_ERROR_TITLE": "Invalid Session" -} \ No newline at end of file + "INVALID_WIDGET_TOKEN_ERROR_TITLE": "Invalid Session", + "FORM_USERS_GROUP_QUALIGEO_DOUBLE_SELECT": "Schemas", + "FORM_USERS_GROUP_QUALIGEO_SCHEMA_AVAILABLE": "Available schemas", + "FORM_USERS_GROUP_QUALIGEO_SCHEMA_ASSOCIATE": "Associated schemas" +} diff --git a/src/module_gtf/module/lang/lang-fr.json b/src/module_gtf/module/lang/lang-fr.json old mode 100755 new mode 100644 index 2073cf66c3c2813e6750a39e9276b3b1e269c153..691f41d64966ec515519ce437c16a43791dc1966 --- a/src/module_gtf/module/lang/lang-fr.json +++ b/src/module_gtf/module/lang/lang-fr.json @@ -6,12 +6,14 @@ "TITLE_MODE_SUPERVISION" : "Supervision", "TITLE_MODE_STATISTICS" : "Statistiques", "TITLE_MODE_PUBLICATION_AUTHOR" : "Publication", + "TITLE_MODE_EXPLOITATION" : "Exploitation", "TEXT_MODE_MY_WORK" : "Activités propres à l'utilisateur connecté", "TEXT_MODE_ENGINE" : "Gestion des moteurs", "TEXT_MODE_PUBLICATION" : "Publication des projets FME", "TEXT_MODE_SUPERVISION" : "Supervision", "TEXT_MODE_STATISTICS" : "Production de graphiques et d'états sur l'utilisation des ressources", "TEXT_MODE_PUBLICATION_AUTHOR" : "Publication des projets FME", + "TEXT_MODE_EXPLOITATION" : "Exploitation", "" : "", "SECTION_UPDATE_TITLE_PUBLICATION_GTF_WORKSPACE" : "Projet FME n°{{sId}}", "SECTION_DISPLAY_TITLE_PUBLICATION_GTF_WORKSPACE" : "Projet FME n°{{sId}}", @@ -19,9 +21,7 @@ "SECTION_UPDATE_TITLE_PUBLICATION_GTF_EMAIL_TEMPLATE" : "Modèle e-mail n°{{sId}}", "SECTION_DISPLAY_TITLE_PUBLICATION_GTF_EMAIL_TEMPLATE" : "Modèle e-mail n°{{sId}}", "SECTION_INSERT_TITLE_PUBLICATION_GTF_EMAIL_TEMPLATE" : "Modèle e-mail", - "SECTION_UPDATE_TITLE_PUBLICATION_AUTHOR_GTF_WORKSPACE_AUTHOR" : "Projet FME n°{{sId}}", - "SECTION_DISPLAY_TITLE_PUBLICATION_AUTHOR_GTF_WORKSPACE_AUTHOR" : "Projet FME n°{{sId}}", - "SECTION_INSERT_TITLE_PUBLICATION_AUTHOR_GTF_WORKSPACE_AUTHOR" : "Projet FME", + "SECTION_UPDATE_TITLE_EXPLOITATION_EXPLOITATION" : "Exploitation", "" : "", "FORM_CALCULATE_STATS" : "Calculer", "FORM_TITLE_STATISTICS" : "Sélectionnez les différents critères afin de générer votre rapport statistique", @@ -62,6 +62,12 @@ "FORM_WORK_DATE_SUPERVISION_ORDER" : "Date de traitement", "FORM_NOTIFICATION_SUPERVISION_ORDER" : "Notification", "FORM_URL_SUPERVISION_ORDER" : "URL de la demande", + "FORM_MINEXECDATE_SUPERVISION_ORDER" : "Date de planification", + "CONFIRM_DELETE_ORDERS_SUPERVISION_ORDER" : "Une ou plusieurs demandes sont en cours d'exécution et leurs processus seront supprimés.", + "ERROR_STOP_ORDER_PROCESS_NO_SELECTION_SUPERVISION_ORDER" : "Veuillez sélectioner une demande en cours pour la stopper.", + "ERROR_STOP_ORDER_PROCESS_ONE_ORDER_ONLY_SUPERVISION_ORDER" : "Vous ne pouvez stopper qu'une seule demande en cours à la fois.", + "ERROR_STOP_ORDER_PROCESS_NO_RUNNING_ORDER_SUPERVISION_ORDER" : "La demande sélectionnée n'est pas en cours d'exécution.", + "STOPPED_BOX_TITLE_SUPERVISION_ORDER" : "Stoppé", "" : "", "STATUS_TITLE_SUPERVISION_SUBSCRIPTION" : "Abonnements", "ENABLED_SUBSCRIPTION_BOX_TITLE_SUPERVISION_SUBSCRIPTION" : "Actif", @@ -122,6 +128,10 @@ "FORM_MISSING_FORM_PUBLICATION_WORKSPACE" : "Formulaire absent", "FORM_WORKSPACE_NAME_EXISTS_PUBLICATION_WORKSPACE" : "Ce nom est déja utilisé par un autre projet.", "FORM_FMW_FILE_URL_PUBLICATION_WORKSPACE" : "Fichier fmw du projet", + "FORM_DATAENCRYPT_PUBLICATION_WORKSPACE" : "Cryptage des données", + "FORM_USEPERSONALDATA_PUBLICATION_WORKSPACE" : "Utilisation de données personnelles", + "FORM_UNITCOST_PUBLICATION_WORKSPACE": "Coût unitaire", + "FORM_COSTPERSECOND_PUBLICATION_WORKSPACE": "Coût à la seconde", "" : "", "FORM_ID_PUBLICATION_WORKSPACE_UPDATE_METADATA" : "ID", "FORM_TITLE_PUBLICATION_WORKSPACE_UPDATE_METADATA" : "Titre du projet", @@ -144,6 +154,7 @@ "ERROR_REINTEGRATE_METADATA_PUBLICATION_WORKSPACE" : "Erreur pendant l'écriture du projet", "CONFIRM_DELETE_LOCKED_WOKSPACE_PUBLICATION_WORKSPACE": "Un ou plusieurs projets sont verrouillés et ne pourront être supprimés. Continuer ?", "FORM_BTN_REGENERATE_METADATA_TOOLTIP_PUBLICATION_WORKSPACE" : "Remplacement des champs Description, Utilisation, Prérequis et Conditions d'utilisation saisis dans GTF par les valeurs correspondantes contenues dans le projet FME source. Attention, les valeurs actuelles seront supprimées.", + "ERROR_WORKSPACE_FILE_NOT_FOUND" : "Erreur de lecture sur le fichier .fmw du projet FME.", "" : "", "TOOLTIP_TITLE_IMPORT_TOKEN_CONNECTION" : "Générer un jeton", "FORM_USER_IMPORT_TOKEN_CONNECTION" : "Utilisateur", @@ -190,6 +201,7 @@ "FORM_WIDGET_BTN_PUBLICATION_WORKSPACE_EDIT_WIDGET" : "Voir la fenêtre de traitement", "FORM_BUTTON_DOWNLOAD_WIDGET" : "Télécharger le widget", "FORM_BUTTON_DELETE_WIDGET" : "Supprimer le widget", + "ERROR_CREATION_WIDGET_FILE" : "Erreur pendant la création du fichier de widget", "" : "", "ERROR_WORKSPACE_NOT_LINKED_USER_GROUPS_WIDGET" : "Le traitement n'est lié à aucun groupe de l'utilisateur.", "ERROR_CAPTCHA_VALIDATION_WIDGET" : "La validation du captcha a échoué.", @@ -199,7 +211,7 @@ "FORM_DOWNLOAD_FILE_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Télécharger le fichier", "FORM_DELETE_FILE_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Supprimer le fichier", "FORM_RELOAD_DIRECTORY_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Recharger le répertoire", - "FORM_UPLOAD_FMW_FILE_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Mettre à jour", + "FORM_UPLOAD_FMW_FILE_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Télécharger", "FORM_UPLOAD_ADDITIONAL_RESOURCE_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Télécharger", "DELETE_FILE_ERROR_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Erreur pendant la suppression du fichier", "FILE_NOT_FOUND_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Le fichier est introuvable", @@ -208,6 +220,7 @@ "ERROR_FMW_FILE_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Le fichier sélectionné n'est pas un fichier fmw valide.", "ERROR_ADDITIONAL_RESOURCES_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Le type de fichier sélectionné n'est pas autorisé.", "ERROR_FILE_SIZE_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "La taille du fichier est supérieure à la taille maximale autorisée.", + "ERROR_FILE_TREE_LOADING_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY" : "Erreur pendant le chargement de la liste des fichiers du projet.", "" : "", "DESCRIPTION_TOOLTIP_TITLE_PUBLICATION_WORKSPACE" : "Description", "" : "", @@ -229,6 +242,8 @@ "FORM_TREATMENT_WORKSPACES_MY_WORK_USER_ORDER" : "Projets liés à la demande", "ERROR_NO_GTF_ENGINE_CONTENT_MY_WORK_USER_ORDER" : "Veuillez créer un moteur GTF pour ajouter des demandes.", "ERROR_NO_GTF_ENGINE_TITLE_MY_WORK_USER_ORDER" : "Aucun Moteur GTF", + "FORM_MINEXECDATE_MY_WORK_USER_ORDER" : "Date de planification", + "FORM_MINEXECDATE_PLACE_HOLDER_MY_WORK_USER_ORDER" : "Au plus tôt", "" : "", "FORM_EXECUTE_WORKSPACE_PUBLICATION_WORKSPACE_SUB_FORM" : "Exécuter", "FORM_PREVISU_PUBLISHED_PUBLICATION_WORKSPACE_SUB_FORM" : "Prévisualiser le formulaire publié", @@ -251,6 +266,21 @@ "FME_VERSION_ENGINE_FME_ENGINE" : "Version", "FME_VALIDITY_ENGINE_FME_ENGINE" : "Validité", "FME_TYPE_ENGINE_FME_ENGINE" : "Type", + "ERROR_FME_LICENSE_EXPIRED_ENGINE_FME_ENGINE" : "La licence a expiré", + "ERROR_FME_REQUEST_ERROR_ENGINE_FME_ENGINE" : "La requête a retourné une erreur", + "FORM_BTN_START_FME_SERVER_INSTANCE_ENGINE_FME_ENGINE" : "Démarrer", + "FORM_BTN_PAUSE_FME_SERVER_INSTANCE_ENGINE_FME_ENGINE" : "Arrêter", + "FORM_BTN_FME_SERVER_INSTANCE_VERSION_ENGINE_FME_ENGINE" : "Version", + "MSG_FME_SERVER_INSTANCE_EXECUTING_PAUSE_ENGINE_FME_ENGINE" : "L'instance Fme Server est en cours d'arrêt", + "MSG_FME_SERVER_INSTANCE_PAUSE_ENGINE_FME_ENGINE" : "L'instance Fme Server est arrêtée", + "MSG_FME_SERVER_INSTANCE_EXECUTING_START_ENGINE_FME_ENGINE" : "L'instance Fme Server est en cours de démarrage", + "MSG_FME_SERVER_INSTANCE_START_ENGINE_FME_ENGINE" : "L'instance Fme Server est opérationnelle", + "FORM_FME_SERVER_INSTANCE_NAME_ENGINE_FME_ENGINE" : "Nom de l'instance", + "FORM_BTN_REFRESH_FME_SERVER_INSTANCE_STATUT_STATUT_ENGINE_FME_ENGINE" : "Actualiser", + "FORM_FME_SERVER_INSTANCE_STATUS_ENGINE_FME_ENGINE" : "Statut", + "FORM_FME_SERVER_INSTANCE_STATUS_RUNNING_ENGINE_FME_ENGINE" : "Instance démarrée", + "FORM_FME_SERVER_INSTANCE_STATUS_PAUSED_ENGINE_FME_ENGINE" : "Instance arrêtée", + "FORM_FME_SERVER_INSTANCE_STATUS_executing_action_ENGINE_FME_ENGINE" : "Instance en cours d'arrêt ou de démarrage", "" : "", "FORM_BTN_CREATE_SUBSCRIPTION_MY_WORK_GTF_USER_SUBSCRIPTION" : "Demander", "FORM_BTN_UPDATE_SUBSCRIPTION_MY_WORK_GTF_USER_SUBSCRIPTION" : "MAJ abonnement", @@ -386,7 +416,6 @@ "FORM_GTF_SCHEMA_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Schéma de GTF", "FORM_GTF_HOME_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Répertoire de GTF", "FORM_NOT_COMPRESSED_EXTENSION_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Extensions des fichiers à ne pas compresser", - "FORM_NBR_ORDER_MAX_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Nombre maximum de demandes traitées simultanément", "FORM_MAX_ATTEMPT_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Nombre maximum de tentatives", "FORM_RADIO_TRUE_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Oui", @@ -402,10 +431,14 @@ "FORM_LOGIN_PROXY_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Login du serveur proxy", "FORM_PASSWORD_PROXY_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Mot de passe du serveur proxy", "FORM_DEFAULT_MAIL_MODEL_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Modèle d' e-mail par défaut", - "FORM_LOG_SECTION_CONFIGURATION_CONFIGURATION_GTF_CONFIG": "Journaux", - "FORM_PYCRON_DIR_CONFIGURATION_CONFIGURATION_GTF_CONFIG": "Répertoire de pycron (Windows) / Cron (Linux)", + "FORM_LOG_SECTION_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Journaux", + "FORM_PYCRON_DIR_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Répertoire de pycron", "FORM_PYCRON_LOG_DIRECTORY_CONFIGURATION_CONFIGURATION_GTF_CONFIG": "Répertoire des logs de pycron", - "FORM_GTF_DOC_ALIAS_CONFIGURATION_CONFIGURATION_GTF_CONFIG": "Alias de la documentation de GTF", + "FORM_GTF_INSTANCE_ID_CONFIGURATION_CONFIGURATION_GTF_CONFIG" : "Identifiant de l'instance de GTF", + "FORM_BTN_GENERATE_GTF_INSTANCE_ID_WORKSPACE_EDIT_WIDGET" : "Générer", + "FORM_EXTERNAL_CONNSTRING_SECTION_CONFIGURATION_CONFIGURATION_GTF_CONFIG" :"Utilisation de GTF_CONNECTION_STRING Externe", + "FORM_EXTERNAL_CONNSTRING_SECTION_CONFIGURATION_CONFIGURATION_CONNECTIONSTRINGIP" : "IP Public de la base de donnée", + "FORM_EXTERNAL_CONNSTRING_SECTION_CONFIGURATION_CONFIGURATION_CONNECTIONSTRINGPORT" : "Port Public de la base de donnée", "" : "", "FORM_SUBTITLE_INFORMATIONS_CONFIGURATION_CONFIGURATION_GTF_LICENSE" : "Informations", "FORM_SUBTITLE_REQUEST_CONFIGURATION_CONFIGURATION_GTF_LICENSE" : "Demander la licence", @@ -453,6 +486,42 @@ "FORM_ID_ENGINE_FME_ENGINE" : "ID", "FORM_PATH_ENGINE_FME_ENGINE" : "Chemin vers l'exécutable de FME", "FORM_TITLE_ENGINE_FME_ENGINE" : "Moteur FME {{::name}}", + "FORM_TYPE_ENGINE_FME_ENGINE" : "Type", + "FORM_SERVER_URL_ENGINE_FME_ENGINE" : "Url du serveur", + "FORM_LOGIN_ENGINE_FME_ENGINE" : "Utilisateur", + "FORM_PASSWORD_ENGINE_FME_ENGINE" : "Mot de passe", + "FORM_S3_ACCESS_KEY_ID_ENGINE_FME_ENGINE" : "Id de la clé d'accès S3", + "FORM_S3_SECRET_ACCESS_KEY_ENGINE_FME_ENGINE" : "Clé d'accès secrète S3", + "FORM_FME_CLOUD_API_TOKEN_ENGINE_FME_ENGINE" : "Token de l'API de FME Cloud", + "FORM_S3_REGION_ENGINE_FME_ENGINE" : "Région S3", + "FORM_S3_REGION_US-EAST-2_ENGINE_FME_ENGINE" : "USA Est (Ohio)", + "FORM_S3_REGION_US-EAST-1_ENGINE_FME_ENGINE" : "USA Est (Virginie du Nord)", + "FORM_S3_REGION_US-WEST-1_ENGINE_FME_ENGINE" : "USA Ouest (Californie du Nord)", + "FORM_S3_REGION_US-WEST-2_ENGINE_FME_ENGINE" : "USA Ouest (Oregon)", + "FORM_S3_REGION_AP-SOUTH-1_ENGINE_FME_ENGINE" : "Asie-Pacifique (Mumbai)", + "FORM_S3_REGION_AP-NORTHEAST-2_ENGINE_FME_ENGINE" : "Asie-Pacifique (Séoul)", + "FORM_S3_REGION_AP-SOUTHEAST-1_ENGINE_FME_ENGINE" : "Asie-Pacifique (Singapour)", + "FORM_S3_REGION_AP-SOUTHEAST-2_ENGINE_FME_ENGINE" : "Asie-Pacifique (Sydney)", + "FORM_S3_REGION_AP-NORTHEAST-1_ENGINE_FME_ENGINE" : "Asie-Pacifique (Tokyo)", + "FORM_S3_REGION_CA-CENTRAL-1_ENGINE_FME_ENGINE" : "Canada (Centre)", + "FORM_S3_REGION_CN-NORTH-1_ENGINE_FME_ENGINE" : "Chine (Pékin)", + "FORM_S3_REGION_EU-CENTRAL-1_ENGINE_FME_ENGINE" : "UE (Francfort)", + "FORM_S3_REGION_EU-WEST-1_ENGINE_FME_ENGINE" : "UE (Irlande)", + "FORM_S3_REGION_EU-WEST-2_ENGINE_FME_ENGINE" : "UE (Londres)", + "FORM_S3_REGION_EU-WEST-3_ENGINE_FME_ENGINE" : "EU (Paris)", + "FORM_S3_REGION_SA-EAST-1_ENGINE_FME_ENGINE" : "Amérique du Sud (São Paulo)", + "FORM_FME_SERVER_INSTANCE_TITLE_ENGINE_FME_ENGINE" : "Instance FME Server", + "FORM_AMAZON_S3_TITLE_ENGINE_FME_ENGINE" : "Amazon S3", + "FORM_IAM_ACCESS_KEY_ID_ENGINE_FME_ENGINE" : "Id de la clé d'accès IAM au service FME Cloud for GTF", + "FORM_IAM_SECRET_ACCESS_KEY_ENGINE_FME_ENGINE" : "Clé d'accès secrète IAM au service FME Cloud for GTF", + "FORM_FME_SERVER_S3_BUCKET_ENGINE_FME_ENGINE" : "Nom du compartiment", + "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE" : "Voulez-vous utiliser la GTF_CONNECTION_STRING externe ?", + "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE_YES" : "Oui (Informations de connexion public à la base)", + "FORM_USEEXTERNALDBCONNECTION_ENGINE_FME_ENGINE_NO" : "Non (Informations de connexion privée à la base)", + "FORM_BTN_TEST_AMAZON_S3_BUCKET_ENGINE_FME_ENGINE" : "Tester", + "TEST_AMAZON_S3_BUCKET_ERROR_NO_SUCH_BUCKET_ENGINE_FME_ENGINE" : "Le compartiment spécifié n'existe pas.", + "TEST_AMAZON_S3_BUCKET_ERROR_INVALID_ACCESS_KEY_ID_FME_ENGINE" : "La clé d'accès S3 spécifiée n'existe pas.", + "TEST_AMAZON_S3_BUCKET_ERROR_SIGNATURE_DOES_NOT_MATCH_FME_ENGINE" : "Le calcul de la signature ne correspond pas. Vérifiez votre clé d'accès secrète S3.", "" : "", "FORM_ID_ENGINE_SERVER" : "ID", "FORM_NAME_ENGINE_SERVER" : "Nom", @@ -502,5 +571,8 @@ "FORM_WIDGET_NOTIFICATIONS_NEEDED_PUBLICATION_WORKSPACE_EDIT_WIDGET" : "Adresse e-mail (Obligatoire)", "FORM_WIDGET_NOTIFICATIONS_OPTIONAL_PUBLICATION_WORKSPACE_EDIT_WIDGET" : "Adresse e-mail (Optionnelle)", "EXPIRED_WIDGET_TOKEN_ERROR": "Votre session a expirée.", - "INVALID_WIDGET_TOKEN_ERROR": "Votre session est invalide." + "INVALID_WIDGET_TOKEN_ERROR": "Votre session est invalide.", + "FORM_USERS_GROUP_QUALIGEO_DOUBLE_SELECT": "Schémas", + "FORM_USERS_GROUP_QUALIGEO_SCHEMA_AVAILABLE": "Schémas disponibles", + "FORM_USERS_GROUP_QUALIGEO_SCHEMA_ASSOCIATE": "Schémas associés" } diff --git a/src/module_gtf/module/less/configuration.less b/src/module_gtf/module/less/configuration.less index 6f1045428fc4186b06544205a917f791be2176c4..99d9f38605959cb8c7e2aefda35c2758f5b93ad4 100755 --- a/src/module_gtf/module/less/configuration.less +++ b/src/module_gtf/module/less/configuration.less @@ -2,3 +2,7 @@ .gtf-license-file-request-connect-btn { float: right !important; } +// Bouton de génération de l'instance de GTF. +.gtf-instance-id > div:nth-child(2) { + padding: 0; +} diff --git a/src/module_gtf/module/less/fmeEngines.less b/src/module_gtf/module/less/fmeEngines.less new file mode 100755 index 0000000000000000000000000000000000000000..1b6dcc949574b6d4f5cf7e5f784ca7c705be7ef2 --- /dev/null +++ b/src/module_gtf/module/less/fmeEngines.less @@ -0,0 +1,6 @@ +// Rotation du bouton d'actualisation d'une l'instance Fme Server. +.fme-server-instance-status-button-rotation { + -webkit-animation:spin 1.5s linear infinite; + -moz-animation:spin 1.5s linear infinite; + animation:spin 1.5s linear infinite; +} \ No newline at end of file diff --git a/src/module_gtf/module/less/main.less b/src/module_gtf/module/less/main.less index 74edecbdc0eabbbfae48224ed282d5f8a9bdb85e..c220a40001548b885fc48ab63e78dac96b2bcd6c 100755 --- a/src/module_gtf/module/less/main.less +++ b/src/module_gtf/module/less/main.less @@ -16,6 +16,7 @@ @import 'importWorkspace.less'; @import 'configuration.less'; @import 'workspace.less'; +@import 'fmeEngines.less'; // Récap. de supervision (Etat des demandes, abo., surv.) .recap{ diff --git a/src/module_gtf/module/templates/testFmeEngineTpl.html b/src/module_gtf/module/templates/testFmeEngineTpl.html index afb5a574fc549ed6a038308095447dbf51e12a65..d56899187e9dfce9bae48396fcacce7637cdd61f 100755 --- a/src/module_gtf/module/templates/testFmeEngineTpl.html +++ b/src/module_gtf/module/templates/testFmeEngineTpl.html @@ -5,10 +5,10 @@ <h3 class="panel-title" data-translate="SUCCESS_FME_ENGINE_FME_ENGINE"></h3> </div> <ul class="list-group"> - <li class="list-group-item"><span data-translate="FME_HOST_ENGINE_FME_ENGINE"></span> : {{::oTestFmeEngineResult.host}}</li> - <li class="list-group-item"><span data-translate="FME_VERSION_ENGINE_FME_ENGINE"></span> : {{::oTestFmeEngineResult.version}}</li> - <li class="list-group-item"><span data-translate="FME_TYPE_ENGINE_FME_ENGINE"></span> : {{::oTestFmeEngineResult.type}}</li> - <li class="list-group-item"><span data-translate="FME_VALIDITY_ENGINE_FME_ENGINE"></span> : {{::oTestFmeEngineResult.validity}}</li> + <li ng-if="::oTestFmeEngineResult.host" class="list-group-item"><span data-translate="FME_HOST_ENGINE_FME_ENGINE"></span> : {{::oTestFmeEngineResult.host}}</li> + <li ng-if="::oTestFmeEngineResult.version"class="list-group-item"><span data-translate="FME_VERSION_ENGINE_FME_ENGINE"></span> : {{::oTestFmeEngineResult.version}}</li> + <li ng-if="::oTestFmeEngineResult.type"class="list-group-item"><span data-translate="FME_TYPE_ENGINE_FME_ENGINE"></span> : {{::oTestFmeEngineResult.type}}</li> + <li ng-if="::oTestFmeEngineResult.validity"class="list-group-item"><span data-translate="FME_VALIDITY_ENGINE_FME_ENGINE"></span> : {{::oTestFmeEngineResult.validity}}</li> </ul> </div> <!-- Erreur --> diff --git a/src/module_gtf/web_service/class/gtf_lib/AmazonAWS.class.inc b/src/module_gtf/web_service/class/gtf_lib/AmazonAWS.class.inc deleted file mode 100755 index 11931ea05a4a5867ee02cb23b64021505908aa27..0000000000000000000000000000000000000000 --- a/src/module_gtf/web_service/class/gtf_lib/AmazonAWS.class.inc +++ /dev/null @@ -1,383 +0,0 @@ -<?php -require_once("vmlib/logUtil.inc"); - -/** - * \file AmazonAWS.php - * \brief Main class to use AWS services (keyGen, CrulRequest, ...) - * - * \author Frederic Carretero <frederic.carretero@veremes.com> - */ - -Class AmazonAWS { - const HASHING_ALGORITHM = 'sha256'; - public $sAwsRegion; - public $aLastCurlRequestInfo; - public $sHost; - private $sAwsAccessKeyId; - private $sAwsSecretAccessKey; - private $sHashingAlgorithmString; - - /** - * construct - * @param {string} $sAwsAccessKeyId Access key ID. - * @param {string} $sAwsSecretAccessKey Secret access key. - * @param {string} $sAwsRegion Region. - */ - function __construct ($sAwsAccessKeyId, $sAwsSecretAccessKey, $sAwsRegion) { - $this->sAwsAccessKeyId = $sAwsAccessKeyId; - $this->sAwsSecretAccessKey = $sAwsSecretAccessKey; - $this->sAwsRegion = $sAwsRegion; - $this->sHashingAlgorithmString = 'AWS4-HMAC-' . strtoupper(self::HASHING_ALGORITHM); - } - - /** - * Get value of inaccessible property. - * @param {string} $sPropertyName Name of the property. - * @return Paramter's value - */ - function __get($sPropertyName) { - if (isset($this->$sPropertyName)) - return $this->$sPropertyName; - } - - /** - * generate an header for AWS request - * @param {string} $sMainRequestString Main request String with this pattern: 'GET https://s3.amazonaws.com/azerty/?Action=ListUsers&Version=2010-05-08 HTTP/1.1'. - * @return array request header for AWS or false if error - */ - function generateAwsSignedHeaders ($sMainRequestString, $sHost, $sService, $aHeaders = array(), $sRequestPayload = 'UNSIGNED-PAYLOAD'){ - $aMainRequest = explode(" ", $sMainRequestString); - - if(count($aMainRequest) < 2){ - writeToErrorLog('sMainRequestString has to be as this pattern : GET https://s3.amazonaws.com/azerty/?Action=ListUsers&Version=2010-05-08 HTTP/1.1 and yours is ' . $sMainRequestString); - return false; - } - - $sTimestamp = time(); - // Entêtes obligatoires. - //$sXAmzDate = '20150830T123600Z';//gmdate('Ymd\THis\Z', $sTimestamp); - //$sDate = '20150830';//gmdate('Ymd', $sTimestamp); - $sXAmzDate = gmdate('Ymd\THis\Z', $sTimestamp); - $sDate = gmdate('Ymd', $sTimestamp); - - $sHashedPayload = $this->createHashedPayload($sRequestPayload); - - array_push($aHeaders, 'x-amz-date: ' . $sXAmzDate); - array_push($aHeaders, 'host: ' . $sHost); - array_push($aHeaders, 'x-amz-content-' . self::HASHING_ALGORITHM . ': ' . $sHashedPayload); - - sort($aHeaders); - - $sSignedHeaders = $this->prepareQuerySignedHeaders($aHeaders); - - // 1. Création d'une demande canonique pour Signature V4. - $sCanonicalRequest = $this->mainRequestArrayToCanonicalString($aMainRequest, $sHost, $aHeaders, $sHashedPayload, $sSignedHeaders); - - // 2. Création d'une chaîne à signer pour Signature V4. - $sStringToSign = $this->createStringToSignv2($sDate, $sXAmzDate, $sCanonicalRequest, $sService); - - // 3. Calcul de la signature pour AWS Signature V4. - $sSigningKey = $this->createSigningKey($sService, $sDate); - $sSignature = $this->calculateSignature($sStringToSign, $sSigningKey); - - // 4. Création de l'entête "Authorization" pour la requête. - $sCredentialScope = $this->createCredentialScope($sDate, $sService); - $sAuthorizationHeader = $this->generateAuthorizationHeader($this->sHashingAlgorithmString, $sCredentialScope, $sSignedHeaders, $sSignature); - - array_push($aHeaders, 'Authorization: ' . $sAuthorizationHeader); - - return $aHeaders; - } - - /** - * generate an canonical request for AWS request - * @param {array} $aMainRequest Main request String with this pattern: 'GET https://s3.amazonaws.com/azerty/?Action=ListUsers&Version=2010-05-08 HTTP/1.1' exploded on spaces. - * @param {string} $sHost HostName to parse url - * @param {array} $aHeaders sorted array of all the headers of this request - * @param {string} $sHashedPayload hash of the payload request - * @return array request header for AWS or false if error - */ - function mainRequestArrayToCanonicalString($aMainRequest, $sHost, $aHeaders, $sHashedPayload, $sSignedHeaders){ - $sHTTPRequestMethod = $aMainRequest[0]; - - $aFullUrl = explode("?", $aMainRequest[1]); - - $sCanonicalQueryString = ""; - if(count($aFullUrl) > 1){ - $sCanonicalQueryString = $this->prepareQueryString($aFullUrl[1]); - } - - $sCanonicalUri = $this->prepareQueryUri($aFullUrl[0], $sHost); - $sCanonicalHeaders = $this->prepareQueryHeaders($aHeaders); - $sCanonicalSignedHeaders = $sSignedHeaders; - - return $sHTTPRequestMethod . chr(10) . - $sCanonicalUri . chr(10) . - $sCanonicalQueryString . chr(10) . - $sCanonicalHeaders . chr(10) . - $sCanonicalSignedHeaders . chr(10) . - $sHashedPayload; - } - - /** - * Curl request - * @param {string} $sUrl Url of the Curl request. - * @param {string} $sType Type of the Curl request (GET, POST). - * @param {array} $aData Data of the Curl request. - * @param {array} $aHeaders Headers of the Curl request. - * @return Request result - */ - // - function curlRequest($sUrl, $sType, $aData = array(), $aHeaders = array(), $bMultipartFormData = false) { - // - $this->aLastCurlRequestInfo = ''; - // - $ch = curl_init(); - $sType = strtoupper($sType); - // Force la méthode de requête utilisée (GET, POST...). - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $sType); - // Url à utiliser. - if (($sType == 'GET' || $sType == 'DELETE') && !empty($aData)) - $sUrl .= '?' . http_build_query($aData); - curl_setopt($ch, CURLOPT_URL, $sUrl); - // Retour sous forme de texte. - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - // Requête POST. - if ($sType == 'POST') { - curl_setopt($ch, CURLOPT_POST, true); - // Chaîne de requête en encodage URL. - if (is_array($aData) && !$bMultipartFormData) - $aData = http_build_query($aData); - // Données de la requête. - curl_setopt($ch, CURLOPT_POSTFIELDS, $aData); - // - curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); - // Entête pour la requête en POST. - //$aHeaders[] = 'Content-Type: application/x-www-form-urlencoded'; - } - // Entête pour la requête - //$aHeaders[] = 'Accept: application/json'; - //if (!empty($this->sToken)) - //$aHeaders[] = 'Authorization: Bearer ' . $this->sToken; // Token obligatoire pour éxécuter la requête. - curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeaders); - // Durée max. de la requête. - //curl_setopt($ch, CURLOPT_TIMEOUT, 120); - // Exécute la session CURL. - // Log. - /* - $handle = fopen("curl_log.txt", "a"); - fwrite($handle, PHP_EOL . '-----------------------' . PHP_EOL); - curl_setopt($ch, CURLOPT_VERBOSE, true); - curl_setopt($ch, CURLOPT_STDERR , $handle); - */ - curl_setopt($ch, CURLINFO_HEADER_OUT, true); - // Curl error: SSL certificate problem: unable to get local issuer certificate - // Curl error n°60 - curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false); - // - $output = curl_exec($ch); - // Erreur de la requête CURL. - if(curl_errno($ch)) { - writeToErrorLog('Curl error: ' . curl_error($ch)); - writeToErrorLog('Curl error n°' . curl_errno($ch)); - } - // Informations de la requête. - $aCurlInfo = curl_getinfo($ch); - $this->aLastCurlRequestInfo = $aCurlInfo; - //file_put_contents('C:/svn/gtf_cloud/gtf.engines/log/response.log', print_r($aCurlInfo, true)); - //writeToErrorLog(print_r(curl_getinfo($ch), true)); - - // Ferme la session CURL. - curl_close($ch); - // - //fclose($handle); - // - return $output; - } - - /** - * Creating a credential scope. - * @param {string} $sDate Date (YYYYMMDD). - * @param {string} $sApiComponentService Api component service. - * @return Credential scope. - */ - function createCredentialScope($sDate, $sApiComponentService) { - return $sDate . "/" . $this->sAwsRegion . '/' . $sApiComponentService . '/aws4_request'; - } - - /** - * Creating a string to sign. - * @param {string} $sDate Date (YYYYMMDD). - * @param {string} $sTimestamp Unix timestamp. - * @param {string} $sCanonicalRequest Canonical request. - * @param {string} $sApiComponentService Api component service. - * @return String to sign. - */ - function createStringToSign($sDate, $sTimestamp, $sCanonicalRequest, $sApiComponentService) { - $sRequestDateTime = $sDate . 'T' . gmdate('His', $sTimestamp) . 'Z'; - $sCredentialScope = $this->createCredentialScope($sDate, $sApiComponentService); - $sHashedCanonicalRequest = hash(self::HASHING_ALGORITHM, $sCanonicalRequest, false); - $sStringToSign = $this->sHashingAlgorithmString . chr(10) . - $sRequestDateTime . chr(10) . - $sCredentialScope . chr(10) . - $sHashedCanonicalRequest; - return $sStringToSign; - } - - /** - * Creating a string to sign. - * @param {string} $sDate Date (YYYYMMDD). - * @param {string} $sTimestamp Unix timestamp. - * @param {string} $sCanonicalRequest Canonical request. - * @param {string} $sApiComponentService Api component service. - * @return String to sign. - */ - function createStringToSignv2($sDate, $sXAmzDate, $sCanonicalRequest, $sApiComponentService) { - $sCredentialScope = $this->createCredentialScope($sDate, $sApiComponentService); - $sHashedCanonicalRequest = hash(self::HASHING_ALGORITHM, $sCanonicalRequest, false); - $sStringToSign = $this->sHashingAlgorithmString . chr(10) . - $sXAmzDate . chr(10) . - $sCredentialScope . chr(10) . - $sHashedCanonicalRequest; - return $sStringToSign; - } - - /** - * Creating a hashed payload. - * @param {string} $sPayload CurrentPayload. - * @return String hashed Payload. - */ - function createHashedPayload($sPayload){ - if($sPayload == "UNSIGNED-PAYLOAD"){ - return $sPayload; - }else{ - return hash(self::HASHING_ALGORITHM, $sPayload, false); - } - } - - /** - * Prepare a query string for signature calculation . - * @param {string} $sQueryString queryString to prepare. - * @return QueryString prepared - */ - function prepareQueryString ($sQueryString){ - $aUri = explode("?", $sQueryString); - $sParameters = $aUri[count($aUri) - 1]; - $aParameters = explode("&", $sParameters); - - $sReturn = ""; - - //order array before treatement F < a Case sensitive - sort($aParameters); - - for ($i = 0; $i < count($aParameters); $i++){ - $aParameter = explode("=",$aParameters[$i]); - if(count($aParameter) === 2){ - $sReturn .= rawurlencode($aParameter[0]); - $sReturn .= "="; - $sReturn .= rawurlencode($aParameter[1]); - if ($i < count($aParameters) - 1){ - $sReturn .= "&"; - } - } - } - return $sReturn; - } - - /** - * Prepare a Uri for signature calculation . - * @param {string} $sUriWithoutQuery queryURI to prepare. (https://s3.amazon.aws.com/toto/tata) - * @param {string} $sHost Hostname to extract the path after domain name - * @return QueryString prepared - */ - function prepareQueryUri ($sUriWithoutQuery, $sHost){ - $aUrl = explode("/", $sUriWithoutQuery); - - $i = 0; - $aUri = array(); - $bDomainNameFound = false; - - while ($i < count($aUrl)){ - if($aUrl[$i] === $sHost && !$bDomainNameFound){ - $bDomainNameFound = true; - }else if ($bDomainNameFound){ - array_push($aUri, $aUrl[$i]); - } - $i++; - } - - return "/" . str_replace('%2F', '/', rawurlencode(implode("/", $aUri))); - } - - /** - * Prepare headers for signature calculation . - * @param {array} $aHeaders array of the headers for the request (array of string) - * @return QueryString prepared - */ - function prepareQueryHeaders ($aHeaders){ - $sReturn = ""; - for ($i = 0; $i < count($aHeaders); $i++){ - $aHeader = explode(":", $aHeaders[$i]); - if (count($aHeader) === 2){ - $sReturn .= strtolower($aHeader[0]); - $sReturn .= ":"; - $sReturn .= trim($aHeader[1]); - $sReturn .= chr(10); - } - } - return $sReturn; - } - - /** - * Prepare signed headers for signature calculation . - * @param {array} $aHeaders array of the headers for the request (array of string) - * @return QueryString prepared - */ - function prepareQuerySignedHeaders ($aHeaders){ - $sReturn = ""; - for ($i = 0; $i < count($aHeaders); $i++){ - $aHeader = explode(":", $aHeaders[$i]); - if (count($aHeader) === 2){ - $sReturn .= strtolower($aHeader[0]); - if ($i < count($aHeaders) - 1){ - $sReturn .= ";"; - } - - } - } - return $sReturn; - } - - /** - * Creating a signing Key. - * @param {string} $sApiComponentService Component service for API execution. - * @param {string} $sDate Date (YYYYMMDD). - * @return Signing key. - */ - function createSigningKey($sApiComponentService, $sDate) { - return hash_hmac(self::HASHING_ALGORITHM, 'aws4_request', hash_hmac(self::HASHING_ALGORITHM, $sApiComponentService, hash_hmac(self::HASHING_ALGORITHM, $this->sAwsRegion, hash_hmac(self::HASHING_ALGORITHM, $sDate, 'AWS4' . $this->sAwsSecretAccessKey, true), true), true), true); - } - - /** - * Calculating a Signature (Version 4 algorithm). - * @param {string} $sStringToSign String to sign. - * @param {string} $sSigningKey Signing key. - * @return Signature. - */ - function calculateSignature($sStringToSign, $sSigningKey) { - return hash_hmac(self::HASHING_ALGORITHM, $sStringToSign, $sSigningKey); - } - - /** - * Generating an authorization header. - * @param {string} $sAlgorithm String of the hashing algorithm. - * @param {string} $sCredentialScope Credential scope. - * @param {string} $sSignedHeaders Request header names. - * @param {string} $sSignature Calculated signature. - * @return Headers for request. - */ - function generateAuthorizationHeader($sAlgorithm, $sCredentialScope, $sSignedHeaders, $sSignature) { - return $sAlgorithm . ' Credential=' . $this->sAwsAccessKeyId . '/' . $sCredentialScope . ', SignedHeaders=' . $sSignedHeaders . ', Signature=' . $sSignature; - } -} -?> \ No newline at end of file diff --git a/src/module_gtf/web_service/class/gtf_lib/AmazonApiGateway.class.inc b/src/module_gtf/web_service/class/gtf_lib/AmazonApiGateway.class.inc deleted file mode 100755 index 0943464f3992027eea302e84b35986b5534c240c..0000000000000000000000000000000000000000 --- a/src/module_gtf/web_service/class/gtf_lib/AmazonApiGateway.class.inc +++ /dev/null @@ -1,88 +0,0 @@ -<?php -require_once 'gtf_lib/AmazonAwWS.class.inc'; - -/** - * \file AmazonApiGateway.php - * \brief Class to use API Gateway FME cloud - * - * \author Frederic Carretero <frederic.carretero@veremes.com> - */ - -Class AmazonApiGateway extends AmazonAWS { - const API_COMPONENT_SERVICE = 'execute-api'; - public $sRestApiId; // Identifiant de l'API. - public $sStageName; // Nom de l'étape d'un déploiement de l'API. - - /** - * construct - * @param {string} $sAwsAccessKeyId Access key ID. - * @param {string} $sAwsSecretAccessKey Secret access key. - * @param {string} $sAwsRegion Region. - * @param {string} $sRestApiId API identifier. - * @param {string} $sStageName Stage name of an API deployment. - */ - function __construct ($sAwsAccessKeyId, $sAwsSecretAccessKey, $sAwsRegion, $sRestApiId, $sStageName) { - // Paramètres obligatoires de la classe mère AmazonAWS. - parent::__construct($sAwsAccessKeyId, $sAwsSecretAccessKey, $sAwsRegion); - // Paramètres pour l'url racine de l'API. - $this->sRestApiId = $sRestApiId; - $this->sStageName = $sStageName; - //if($sAwsRegion == 'us-east-1') - //$this->sHost = trim('' . self::API_COMPONENT_SERVICE . '.amazonaws.com'); - //else - $this->sHost = trim($sRestApiId . '.' . self::API_COMPONENT_SERVICE . '.' . $sAwsRegion . '.amazonaws.com'); - } - - /** - * Generating all the headers for the request. - * @return Headers for request. - */ - function generateRequestHeaders() { - $sTimestamp = time(); - // Entêtes obligatoires. - $sXAmzDate = gmdate('Ymd\THis\Z', $sTimestamp); - $sDate = gmdate('Ymd', $sTimestamp); - // Charge utile vide hachée. - $sRequestPayload = ''; - - // 1. Création d'une demande canonique pour Signature V4. - $sHttpRequestMethod = 'GET'; - $sCanonicalUri = str_replace('%2F', '/', rawurlencode('/' . $this->sStageName)); - $sCanonicalQueryString = ''; - $sCanonicalHeaders = 'host:' . $this->sHost . chr(10) . - 'x-amz-date:' . $sXAmzDate . chr(10); - $sSignedHeaders = 'host;x-amz-date'; - $sHashedPayload = hash(self::HASHING_ALGORITHM, $sRequestPayload, false); - $sCanonicalRequest = $sHttpRequestMethod . chr(10) . - $sCanonicalUri . chr(10) . - $sCanonicalQueryString . chr(10) . - $sCanonicalHeaders . chr(10) . - $sSignedHeaders . chr(10) . - $sHashedPayload; - - // 2. Création d'une chaîne à signer pour Signature V4. - $sStringToSign = $this->createStringToSign($sDate, $sTimestamp, $sCanonicalRequest, self::API_COMPONENT_SERVICE); - - // 3. Calcul de la signature pour AWS Signature V4. - $sSigningKey = $this->createSigningKey(self::API_COMPONENT_SERVICE, $sDate); - $sSignature = $this->calculateSignature($sStringToSign, $sSigningKey); - - // 4. Création de l'entête "Authorization" pour la requête. - $sCredentialScope = $this->createCredentialScope($sDate, self::API_COMPONENT_SERVICE); - $sAuthorizationHeader = $this->generateAuthorizationHeader($this->sHashingAlgorithmString, $sCredentialScope, $sSignedHeaders, $sSignature); - - // Entêtes pour la requete. - $aHeaders = array( - 'Authorization: ' . $sAuthorizationHeader, - 'X-Amz-Date: ' . $sXAmzDate - ); - /* - echo PHP_EOL . 'Canonical request:' . PHP_EOL; - print_r($sCanonicalRequest); - echo PHP_EOL . PHP_EOL . 'String To Sign:' . PHP_EOL; - print_r($sStringToSign); - */ - return $aHeaders; - } -} -?> \ No newline at end of file diff --git a/src/module_gtf/web_service/class/gtf_lib/AmazonS3.class.inc b/src/module_gtf/web_service/class/gtf_lib/AmazonS3.class.inc deleted file mode 100755 index 5b8265d9bcc229a501602ccd7ba5abd2d0af25d1..0000000000000000000000000000000000000000 --- a/src/module_gtf/web_service/class/gtf_lib/AmazonS3.class.inc +++ /dev/null @@ -1,297 +0,0 @@ -<?php -require_once 'gtf_lib/AmazonAWS.class.inc'; - -/** - * \file AmazonS3.php - * \brief Class to upload and get file in a bucket S3 - * - * \author Frederic Carretero <frederic.carretero@veremes.com> - * \author Anthony Borghi <anthony.borghi@veremes.com> - */ - -Class AmazonS3 extends AmazonAWS { - const API_COMPONENT_SERVICE = 's3'; - - /** - * construct - * @param {string} $sAwsAccessKeyId Access key ID. - * @param {string} $sAwsSecretAccessKey Secret access key. - * @param {string} $sAwsRegion Region. - */ - function __construct ($sAwsAccessKeyId, $sAwsSecretAccessKey, $sAwsRegion) { - // Paramètres obligatoires de la classe mère AmazonAWS. - parent::__construct($sAwsAccessKeyId, $sAwsSecretAccessKey, $sAwsRegion); - /* - if($sAwsRegion == 'us-east-1') - $this->sHost = trim('s3.amazonaws.com'); - else - $this->sHost = trim('s3-' . $sAwsRegion . '.amazonaws.com'); - */ - // Url racine de l'API. - $this->sHost = trim(self::API_COMPONENT_SERVICE . '-' . $sAwsRegion . '.amazonaws.com'); - } - - /** - * Generating all the headers for a GET request. deprecated - * @param {string} $sBucket A container for objects stored in Amazon S3. - * @param {string} $sKey The unique identifier for an object within a bucket. - * @return Headers for request. - */ - function generateRequestHeaders($sBucket, $sKey, $sQueryParameter = '', $sRequestPayload = 'UNSIGNED-PAYLOAD') { - // - $sServiceEndpoint = $sBucket . '.' . $this->sHost; - $query_string = ""; - $sTimestamp = time(); - // Entêtes obligatoires. - $sXAmzDate = gmdate('Ymd\THis\Z', $sTimestamp); - $sDate = gmdate('Ymd', $sTimestamp); - //$sRequestPayload = '$sRequestPayload '; - - // 1. Création d'une demande canonique pour Signature V4. - $sHttpRequestMethod = 'GET'; - $sCanonicalUri = str_replace('%2F', '/', rawurlencode('/' . $sKey)); - $sCanonicalQueryString = $this->prepareQueryString($sQueryParameter); - $sCanonicalHeaders = 'host:' . $sServiceEndpoint . chr(10) . - 'x-amz-content-' . self::HASHING_ALGORITHM . ':' . $sRequestPayload . chr(10) . - 'x-amz-date:' . $sXAmzDate . chr(10); - $sSignedHeaders = 'host;x-amz-content-' . self::HASHING_ALGORITHM . ';x-amz-date'; - $sHashedPayload = $this->createHashedPayload($sRequestPayload); - //$sHashedPayload = $sRequestPayload; - $sCanonicalRequest = $sHttpRequestMethod . chr(10) . - $sCanonicalUri . chr(10) . - $sCanonicalQueryString . chr(10) . - $sCanonicalHeaders . chr(10) . - $sSignedHeaders . chr(10) . - $sHashedPayload; - - // 2. Création d'une chaîne à signer pour Signature V4. - $sStringToSign = $this->createStringToSign($sDate, $sTimestamp, $sCanonicalRequest, self::API_COMPONENT_SERVICE); - - // 3. Calcul de la signature pour AWS Signature V4. - $sSigningKey = $this->createSigningKey(self::API_COMPONENT_SERVICE, $sDate); - $sSignature = $this->calculateSignature($sStringToSign, $sSigningKey); - - // 4. Création de l'entête "Authorization" pour la requête. - $sCredentialScope = $this->createCredentialScope($sDate, self::API_COMPONENT_SERVICE); - $sAuthorizationHeader = $this->generateAuthorizationHeader($this->sHashingAlgorithmString, $sCredentialScope, $sSignedHeaders, $sSignature); - - // Entêtes pour la requete. - $aHeaders = array( - 'host: ' . $sServiceEndpoint, - 'x-amz-content-' . self::HASHING_ALGORITHM . ': ' . $sHashedPayload, - 'x-amz-date: ' . $sXAmzDate, - 'Authorization: ' . $sAuthorizationHeader - ); - - return $aHeaders; - } - - /** - * Generating all the data for a POST request. - * @param {string} $sBucket A container for objects stored in Amazon S3. - * @param {string} $sKey The unique identifier for an object within a bucket. - * @return Headers for request. - */ - function generatePostData($sBucket, $sKey, $sMethod = 'get') { - $sTimestamp = time(); - $sXAmzDate = gmdate('Ymd\THis\Z', $sTimestamp); - $sDate = gmdate('Ymd', $sTimestamp); - $sAcl = 'public-read'; - $sCredential = $this->sAwsAccessKeyId . '/' . $sDate . '/' . $this->sAwsRegion . '/' . self::API_COMPONENT_SERVICE . '/aws4_request'; - // 1. Création d'une chaîne à signer pour Signature V4 - $aPolicy = array( - 'expiration' => gmdate('Y-m-d\TH:i:s.000\Z', $sTimestamp + 86400), - 'conditions' => array( - array('acl' => $sAcl), - array('bucket' => $sBucket), - array('starts-with', '$Content-Type', ''), - array('starts-with', '$key', ''), - array('x-amz-algorithm' => $this->sHashingAlgorithmString), - array('x-amz-credential' => $sCredential), - array('x-amz-date' => $sXAmzDate) - ) - ); - $sStringToSign = base64_encode(json_encode($aPolicy)); - - // 2. Calcul de la signature pour AWS Signature V4. - $sSigningKey = hash_hmac(self::HASHING_ALGORITHM, 'aws4_request', hash_hmac(self::HASHING_ALGORITHM, self::API_COMPONENT_SERVICE, hash_hmac(self::HASHING_ALGORITHM, $this->sAwsRegion, hash_hmac(self::HASHING_ALGORITHM, $sDate, 'AWS4' . $this->sAwsSecretAccessKey, true), true), true), true); - $sSignature = hash_hmac(self::HASHING_ALGORITHM, $sStringToSign, $sSigningKey); - - // 3. Données (post). - $aPostData = array( - 'key' => $sKey, - 'acl' => $sAcl, - 'Content-Type' => '', - 'X-Amz-Credential' => $sCredential, - 'X-Amz-Algorithm' => $this->sHashingAlgorithmString, - 'X-Amz-Date' => $sXAmzDate, - 'Policy' => $sStringToSign, - 'X-Amz-Signature' => $sSignature - ); - return $aPostData; - } - - /** - * Downloads a file. - * @param {string} $sBucket Name of a container for objects. - * @param {string} $sKey Name of a unique identifier for an object within a bucket. - * @param {string} $sFilePath Path of the file to save. - * @return File content - */ - function downloadFile($sBucket, $sKey, $sFilePath = null) { - // Url vers le fichier. - $sUrl = 'https://' . $sBucket . '.' . $this->sHost . '/' . $sKey; - // Génération des entêtes pour la requete. - //$aHeaders = $this->generateRequestHeaders($sBucket, $sKey); - $sFullUrl = 'GET ' . $sUrl . ' HTTP/1.1'; - $aHeaders = $this->generateAwsSignedHeaders($sFullUrl, $sBucket . '.' . $this->sHost, self::API_COMPONENT_SERVICE); - - $aHeaders[] = 'Accept: application/octet-stream'; - // Transfert cURL. - $sRequestResult = $this->curlRequest($sUrl, 'get', null, $aHeaders); - // - if ($this->aLastCurlRequestInfo['http_code'] != 200) - writeToErrorLog($sRequestResult); - else { - if (!empty($sFilePath)) - file_put_contents($sFilePath, $sRequestResult); - else - return $sRequestResult; - } - } - - /** - * Upload a file. - * @param {string} $sBucket Name of a container for objects. - * @param {string} $sKey Name of a unique identifier for an object within a bucket. - * @param {string} $sFilePath Path of the file to save. - * @return File content - */ - function uploadFile($sBucket, $sKey, $sFilePath) { - if (file_exists($sFilePath)) { - $sFileName = pathinfo($sFilePath, PATHINFO_BASENAME); - // Url vers le fichier. - //$sUrl = 'https://' . $sBucket . '.' . $this->sHost . '/' . $sKey; - $sUrl = 'https://' . $sBucket . '.' . $this->sHost; - // Génération des entêtes pour la requete. - $aPostData = $this->generatePostData($sBucket, $sKey, 'post'); - $aPostData['Content-Type'] = mime_content_type($sFilePath); - $aPostData['file'] = new CurlFile(realpath($sFilePath), $aPostData['Content-Type'], $sFileName); - $aHeaders = array( - 'Content-Type: multipart/form-data', - ); - $sRequestResult = $this->curlRequest($sUrl, 'post', $aPostData, $aHeaders, true); - if ($this->aLastCurlRequestInfo['http_code'] != 204) - writeToErrorLog($sRequestResult); - } - } - - /** - * ScanDir in a bucket - * @param {string} $sBucket Name of a container for objects. - * @param {string} $sPrefix Path of the folder to scan - * @param {boolean} $bWithFileInfos boolean to add fileInfo with filename - * @return Array associative array describing directory scanned - */ - function scanDir($sBucket, $sPrefix, $bWithFileInfos = false){ - $oFiles = false; - $sQueryString = '?list-type=2&prefix=' . $sPrefix; - //URL to send request - $sUrl = 'https://' . $sBucket . '.' . $this->sHost . "/" . $sQueryString; - $sFullUrl = 'GET ' . $sUrl . ' HTTP/1.1'; - - // Génération des entêtes pour la requete. - $aHeaders = $this->generateAwsSignedHeaders($sFullUrl, $sBucket . '.' . $this->sHost, self::API_COMPONENT_SERVICE, array('Content-Type: application/x-www-form-urlencoded'), ''); - - // Transfert cURL. - $sRequestResult = $this->curlRequest($sUrl, 'get', null, $aHeaders); - //error_log($sRequestResult); - if ($this->aLastCurlRequestInfo['http_code'] != 200){ - writeToErrorLog("ERROR: ScanDir can't scan this prefix or this bucket"); - } else { - $oXMLContent= json_decode(json_encode(simplexml_load_string($sRequestResult)), true); - $oFiles = $this->awsObjectListXmlToTree($oXMLContent, $bWithFileInfos); - } - - return $oFiles; - } - - /** - * ScanDir in a bucket - * @param {object} $oXMLObject Result of the list object request AWS - * @param {boolean} $bWithFileInfos boolean to add fileInfo with filename - * @return Array associative array describing directory scanned - */ - function awsObjectListXmlToTree ($oXMLObject, $bWithFileInfos){ - - $aSave = array(); - - $sPrefix = (count($oXMLObject["Prefix"]) === 0) ? "" : $oXMLObject["Prefix"]; - - if(substr($sPrefix, -1) !== "/"){ - $sPrefix .= "/"; - } - - $oFiles = array( - "bucket" => $oXMLObject["Name"], - "sPath"=> $sPrefix, - "aContent" => array() - ); - - for($i = 0; $i < count($oXMLObject["Contents"]); $i++){ - $sFinalKey = $oXMLObject["Contents"][$i]["Key"]; - if($sPrefix !== "/"){ - $sFinalKey = str_replace($sPrefix, "", $sFinalKey); - } - $aPath = explode("/", $sFinalKey); - $sObjectName = $aPath[0]; - - $oFile = $sObjectName; - // check si existe déja - if(!in_array($sObjectName, $aSave) && $sObjectName !== ""){ - if($bWithFileInfos){ - $oFile = array( - "name"=> $sObjectName, - "isDirectory"=> (count($aPath) > 1)? 1 : 0, - "size" => $oXMLObject["Contents"][$i]["Size"], - "lastModification" => $oXMLObject["Contents"][$i]["LastModified"], - "storageType" => $oXMLObject["Contents"][$i]["StorageClass"] - ); - } - - array_push($oFiles["aContent"], $oFile); - array_push($aSave, $sObjectName); - } - } - return $oFiles; - } - - /** - * Delete a file. - * @param {string} $sBucket Name of the container for remove an objects. - * @param {string} $sKey Object's identifier to delete it. - * @return boolean true if removed false else - */ - function deleteFile($sBucket, $sKey){ - $bReturn = false; - //URL to send request - $sUrl = 'https://' . $sBucket . '.' . $this->sHost . "/" . $sKey; - $sFullUrl = 'DELETE ' . $sUrl . ' HTTP/1.1'; - - // Génération des entêtes pour la requete. - $aHeaders = $this->generateAwsSignedHeaders($sFullUrl, $sBucket . '.' . $this->sHost, self::API_COMPONENT_SERVICE, array(), ''); - - // Transfert cURL. - $sRequestResult = $this->curlRequest($sUrl, 'delete', null, $aHeaders); - - if ($this->aLastCurlRequestInfo['http_code'] != 200){ - writeToErrorLog("ERROR: it's impossible to delete this key in this bucket"); - } else { - $bReturn = true; - error_log($sRequestResult); - } - - return $bReturn; - } -} -?> \ No newline at end of file diff --git a/src/module_gtf/web_service/class/gtf_lib/GtfFmwParser.class.inc b/src/module_gtf/web_service/class/gtf_lib/GtfFmwParser.class.inc index f29e86e27af0226484ce8e602ea092ce0169acd4..d85789c4f27863fca87647cdd8654c35c4695a11 100755 --- a/src/module_gtf/web_service/class/gtf_lib/GtfFmwParser.class.inc +++ b/src/module_gtf/web_service/class/gtf_lib/GtfFmwParser.class.inc @@ -27,6 +27,8 @@ class GtfFmwParser { var $sSaveDate; var $sSaveBuild; var $sRequirement; + var $aProperties; + var $bDeleteFmwFile = false; // var $sOriginalName; @@ -35,8 +37,21 @@ class GtfFmwParser { * le fichier fmw est parcouru ligne par ligne et chaque occurrence * correspondant à un GUI est stocké dans le tableau approrié */ - function __construct($sFmwFileName) { - $this->sFmwFileName = $sFmwFileName; + function __construct($sFmwFileName, $aProperties, $sFmwFileContent = '') { + $this->aProperties = $aProperties; + // Création du fichier temporaire (si le contenu du fichier .fmw est passé et pas un nom de fichier). + if (!empty($sFmwFileContent)) { + $this->sFmwFileName = $this->aProperties['extract_dir'] . '/' . getUniqRandomId() . '/' . $sFmwFileName; + $sFmwFileDirPath = pathinfo($this->sFmwFileName, PATHINFO_DIRNAME); + if (file_exists($sFmwFileDirPath)) + cleardir($sFmwFileDirPath); + mkdir($sFmwFileDirPath, 0777, true); + file_put_contents($this->sFmwFileName, $sFmwFileContent); + $this->bDeleteFmwFile = true; + } + else + $this->sFmwFileName = $sFmwFileName; + // $oFichier = fopen(utf8_decode($this->sFmwFileName), "r"); $sRc = chr(10); // Compatible avec FME 2014 et inférieur $sRecherche = "^GUI(.*)" . $sRc; @@ -322,17 +337,16 @@ class GtfFmwParser { /** * Product a JSON form - * @param array $aProperties * @param string $sName * @return array */ - function productJson($aProperties, $sName) { + function productJson($sName) { $aJson = array("name" => "Subform", "title" => $sName, "input_size" => "xxs", "nb_cols" => 12, "rows" => array()); $aFields = array("fields" => array()); foreach ($this->aGuiObject as $oGtfGui) { // bizarre mais des lignes peuvent être vides (génération KML)... à voir if ($oGtfGui->sDefault_Macro != "") { - $aFormField = $oGtfGui->getGuiV2($aProperties); + $aFormField = $oGtfGui->getGuiV2($this->aProperties); // Décode les tags de FME et GTF dans les valeurs par défaut du formulaire json. if (!empty($aFormField[0]['default_value'])) $aFormField[0]['default_value'] = $oGtfGui->decodeFmeGtfTags($aFormField[0]['default_value']); @@ -625,7 +639,14 @@ class GtfFmwParser { fclose($ecriture); } - + /* + * Destructeur de la classe GtfFmwParser + */ + function __destruct() { + // Supprime le fichier .fmw temporaire du projet. + $sFmwFileDirPath = pathinfo($this->sFmwFileName, PATHINFO_DIRNAME); + if ($this->bDeleteFmwFile && file_exists($sFmwFileDirPath)) + cleardir($sFmwFileDirPath); + } } - ?> diff --git a/src/module_gtf/web_service/ws/License.class.inc b/src/module_gtf/web_service/ws/License.class.inc index 8f1e63df69d834a2b084cc1fbf2f2c35053dd714..33c0bcbdc7411541a7d7324de45a2b4c4328a993 100755 --- a/src/module_gtf/web_service/ws/License.class.inc +++ b/src/module_gtf/web_service/ws/License.class.inc @@ -157,7 +157,7 @@ class License extends GTF { function POST() { if ($this->aValues["action"] == 'activate') { if (!empty($_FILES['license_file'])) { - $sErrorMessage = uploadFile('license_file', "", $this->aProperties['vas_home'] . '/../gtf.engines/licenses/' . $_FILES['license_file']["name"], $_FILES['license_file']['size'] + 1); + $sErrorMessage = uploadFileToLocal('license_file', "", $this->aProperties['vas_home'] . '/../gtf.engines/licenses/' . $_FILES['license_file']["name"], $_FILES['license_file']['size'] + 1); rename($this->aProperties['vas_home'] . '/../gtf.engines/licenses/' . $_FILES['license_file']["name"], $this->aProperties['vas_home'] . '/../gtf.engines/licenses/license.txt'); if ($sErrorMessage == "") { $aXmlRacineAttribute['status'] = 1; diff --git a/src/module_gtf/web_service/ws/ServerClass.class.inc b/src/module_gtf/web_service/ws/ServerClass.class.inc index ccae65b8cc0d5d942a28a336eefc35db68d13e26..8eb898ae2f078268b9d27e156c9c01bd112ae543 100755 --- a/src/module_gtf/web_service/ws/ServerClass.class.inc +++ b/src/module_gtf/web_service/ws/ServerClass.class.inc @@ -1,225 +1,196 @@ -<?php - -require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/dbUtil.inc'; -require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/logUtil.inc'; - -class ServerClass { - - //Chemin du fichier crontab - var $sCrontabFile; - //Id du server - var $iId; - //Nom du server - var $sServerName; - //Ancien nom du server - var $sOldServerName; - //Répertoire racine - var $sGtfHome; - //Répertoire Engines - var $EnginesHome; - //Objet de labase de données - var $oBd; - - function __construct($iId, $oBd, $sGtfHome, $sOldServerName = "", $aProperties = array()) { - $this->iId = $iId; - $this->oBd = $oBd; - $this->sOldServerName = $sOldServerName; - $this->sGtfHome = $sGtfHome; - $this->aProperties = $aProperties; - $this->setValues($iId); - } - - function setValues($iId) { - if ($iId != "") { - $sSql = 'SELECT scheduler_network_home, hostname, engines_home FROM ' . $this->aProperties['schema_gtf'] . '.server where server_id=[iIdServer]'; - $aParams['iIdServer'] = array('value' => $this->iId, 'type' => 'number'); - $oPDOresult = $this->oBd->executeWithParams($sSql, $aParams); - $oServer = $this->oBd->objetSuivant($oPDOresult); - $this->sCrontabFile = $oServer->scheduler_network_home; - $this->sServerName = $oServer->hostname; - $this->EnginesHome = $oServer->engines_home; - if ($this->sOldServerName == "") { - $this->sOldServerName = $this->sServerName; - } - } - } - - function deleteCrontabValuesEngine() { - $aValuesPycronNewFile = Array(); - if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { - $sCronFile = '/tmp/' . uniqid('cron_'); - exec("crontab -u www-data -l > " . $sCronFile); - } else { - $sCronFile = $this->sCrontabFile; - } - if (is_file($sCronFile)) { - $aPycronValues = file($sCronFile); - $bWrite = true; - foreach ($aPycronValues as $sPycronValue) { - $sPycronValue = str_replace("\n", "", $sPycronValue); - $sPycronValue = str_replace("\r", "", $sPycronValue); - if ($sPycronValue == "#<gtf_engines " . gethostname() . " " . $this->sGtfHome . ">") { - - $bWrite = false; - } else if ($sPycronValue == "#</gtf_engines " . gethostname() . " " . $this->sGtfHome . ">") { - $bWrite = true; - } - if ($bWrite == true && $sPycronValue != "#</gtf_engines " . gethostname() . " " . $this->sGtfHome . ">") { - $aValuesPycronNewFile[] = $sPycronValue; - } - } - } - // On écrit dans le fichier texte - $sFichierCrontab = fopen($sCronFile, "w"); - // Le fichier texte est vidé - ftruncate($sFichierCrontab, 0); - $aValuesPycronNewFile = str_replace("\n", "", $aValuesPycronNewFile); - $aValuesPycronNewFile = str_replace("\r", "", $aValuesPycronNewFile); - foreach ($aValuesPycronNewFile as $sPycronValues2) { - fputs($sFichierCrontab, $sPycronValues2 . "\n"); - } - // Enfin fermer le fichier - fclose($sFichierCrontab); - if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { - exec("crontab -u www-data " . $sCronFile); - exec("rm " . $sCronFile); - } - } - - function deleteCrontabValuesSubscription() { - if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { - $sCronFile = '/tmp/' . uniqid('cron_'); - exec("crontab -u www-data -l > " . $sCronFile); - } else { - $sCronFile = $this->sCrontabFile; - } - $aPycronValues = file($sCronFile); - $aValuesPycronNewFile = Array(); - $bWrite = true; - foreach ($aPycronValues as $sPycronValue) { - $sPycronValue = str_replace("\n", "", $sPycronValue); - $sPycronValue = str_replace("\r", "", $sPycronValue); - - if ($sPycronValue == "#<gtf_subscription " . gethostname() . " " . $this->sGtfHome . ">") { - - $bWrite = false; - } else if ($sPycronValue == "#</gtf_subscription " . gethostname() . " " . $this->sGtfHome . ">") { - $bWrite = true; - } - if ($bWrite == true && $sPycronValue != "#</gtf_subscription " . gethostname() . " " . $this->sGtfHome . ">") { - $aValuesPycronNewFile[] = $sPycronValue; - } - } - // On écrit dans le fichier texte - $sFichierCrontab = fopen($sCronFile, "w"); - // Le fichier texte est vidé - ftruncate($sFichierCrontab, 0); - $aValuesPycronNewFile = str_replace("\n", "", $aValuesPycronNewFile); - $aValuesPycronNewFile = str_replace("\r", "", $aValuesPycronNewFile); - foreach ($aValuesPycronNewFile as $sPycronValues2) { - fputs($sFichierCrontab, $sPycronValues2 . "\n"); - } - // Enfin fermer le fichier - fclose($sFichierCrontab); - if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { - exec("crontab -u www-data " . $sCronFile); - exec("rm " . $sCronFile); - } - } - - function AddCrontabValuesEngines($sNotInList = "") { - if ($sNotInList == "") { - $sSql = 'SELECT gtf_engine_id, period, enabled FROM ' . $this->aProperties['schema_gtf'] . '.gtf_engine WHERE server_id=[iIdServer]'; - } else { - $sSql = 'SELECT gtf_engine_id, period, enabled FROM ' . $this->aProperties['schema_gtf'] . '.gtf_engine WHERE server_id=[iIdServer] AND gtf_engine_id not in ([sNotInList])'; - $aParams['sNotInList'] = array('value' => str_replace(',', '|', $sNotInList), 'type' => 'group'); - } - $aParams['iIdServer'] = array('value' => $this->iId, 'type' => 'number'); - $oPDOresult = $this->oBd->executeWithParams($sSql, $aParams); - if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { - $sCronFile = '/tmp/' . uniqid('cron_'); - exec("crontab -u www-data -l > " . $sCronFile); - } else { - $sCronFile = $this->sCrontabFile; - } - $sFichierCrontab = fopen($sCronFile, "a"); - - fputs($sFichierCrontab, "#<gtf_engines " . gethostname() . " " . $this->sGtfHome . ">" . "\n"); - while ($oGTF = $this->oBd->objetSuivant($oPDOresult)) { - if ($oGTF->enabled == true) { - $sActif = ""; - } else { - $sActif = "#"; - } - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $sLigne = $sActif . "*/" . $oGTF->period . " * * * * \"" . $this->EnginesHome . "/engine.exe\" " . $oGTF->gtf_engine_id; - } else { - $sLigne = $sActif . "*/" . $oGTF->period . " * * * * cd \"" . $this->EnginesHome . "\" && \"" . $this->EnginesHome . "/engine\" " . $oGTF->gtf_engine_id; - } - fputs($sFichierCrontab, $sLigne . "\n"); - } - fputs($sFichierCrontab, "#</gtf_engines " . gethostname() . " " . $this->sGtfHome . ">" . "\n"); - if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { - exec("crontab -u www-data " . $sCronFile); - exec("rm " . $sCronFile); - } - } - - function AddCrontabValuesSubscription() { - $sSql = 'SELECT period_id, cron_expression, enabled FROM ' . $this->aProperties['schema_gtf'] . '.period'; - $oPDOresult = $this->oBd->executeWithParams($sSql, array()); - if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { - $sCronFile = '/tmp/' . uniqid('cron_'); - exec("crontab -u www-data -l > " . $sCronFile); - } else { - $sCronFile = $this->sCrontabFile; - } - $sFichierCrontab = fopen($sCronFile, "a"); - fputs($sFichierCrontab, "#<gtf_subscription " . gethostname() . " " . $this->sGtfHome . ">" . "\n"); - while ($oPeriod = $this->oBd->objetSuivant($oPDOresult)) { - if ($oPeriod->enabled == true) { - $sActif = ""; - } else { - $sActif = "#"; - } - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $sLigne = $sActif . $oPeriod->cron_expression . " \"" . $this->EnginesHome . "/php/php.exe\" \"" . $this->EnginesHome . "/subscription.php\" " . $oPeriod->period_id; - } else { - $sLigne = $sActif . $oPeriod->cron_expression . " (\"" . $this->EnginesHome . "/php/bin/php\" \"" . $this->EnginesHome . "/subscription.php\" " . $oPeriod->period_id . ")"; - } - fputs($sFichierCrontab, $sLigne . "\n"); - } - fputs($sFichierCrontab, "#</gtf_subscription " . gethostname() . " " . $this->sGtfHome . ">" . "\n"); - if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { - exec("crontab -u www-data " . $sCronFile); - exec("rm " . $sCronFile); - } - } - - function AddPropertiesFME($sNotInList = "") { - $sFichierProperties = fopen($this->sGtfHome . "/rest/conf/gtf/properties_post_engines.inc", "w"); - fputs($sFichierProperties, "<?php" . "\n"); - $sLigne = '$properties["engines_list"] = \''; - $aParams = array(); - if ($sNotInList == "") { - $sSql = 'SELECT gtf_engine_id FROM ' . $this->aProperties['schema_gtf'] . '.gtf_engine WHERE enabled = true ORDER BY gtf_engine_id'; - } else { - $sSql = 'SELECT gtf_engine_id FROM ' . $this->aProperties['schema_gtf'] . '.gtf_engine WHERE gtf_engine_id not in (' . $sNotInList . ") AND enabled = true ORDER BY gtf_engine_id"; - $aParams['sNotInList'] = array('value' => str_replace(',', '|', $sNotInList), 'type' => 'group'); - } - $oPDOresult = $this->oBd->executeWithParams($sSql, $aParams); - while ($oFme = $this->oBd->objetSuivant($oPDOresult)) { - if ($sLigne == '$properties["engines_list"] = \'') { - $sLigne .= $oFme->gtf_engine_id; - } else { - $sLigne .= "," . $oFme->gtf_engine_id; - } - } - $sLigne .= "';"; - fputs($sFichierProperties, $sLigne . "\n"); - fputs($sFichierProperties, "?>" . "\n"); - } - -} - +<?php + +require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/dbUtil.inc'; +require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/logUtil.inc'; + +class ServerClass { + + //Chemin du fichier crontab + var $sCrontabFile; + //Id du server + var $iId; + //Nom du server + var $sServerName; + //Ancien nom du server + var $sOldServerName; + //Répertoire racine + var $sGtfHome; + //Répertoire Engines + var $EnginesHome; + //Objet de labase de données + var $oBd; + + function __construct($iId, $oBd, $sGtfHome, $sOldServerName = "", $aProperties = array()) { + $this->iId = $iId; + $this->oBd = $oBd; + $this->sOldServerName = $sOldServerName; + $this->sGtfHome = $sGtfHome; + $this->aProperties = $aProperties; + $this->setValues($iId); + } + + function setValues($iId) { + if ($iId != "") { + $sSql = 'SELECT scheduler_network_home, hostname, engines_home FROM ' . $this->aProperties['schema_gtf'] . '.server where server_id=[iIdServer]'; + $aParams['iIdServer'] = array('value' => $this->iId, 'type' => 'number'); + $oPDOresult = $this->oBd->executeWithParams($sSql, $aParams); + $oServer = $this->oBd->objetSuivant($oPDOresult); + $this->sCrontabFile = $oServer->scheduler_network_home; + $this->sServerName = $oServer->hostname; + $this->EnginesHome = $oServer->engines_home; + if ($this->sOldServerName == "") { + $this->sOldServerName = $this->sServerName; + } + } + } + + function deleteCrontabValuesEngine() { + $aValuesPycronNewFile = Array(); + if (is_file($this->sCrontabFile)) { + $aPycronValues = file($this->sCrontabFile); + $bWrite = true; + foreach ($aPycronValues as $sPycronValue) { + $sPycronValue = str_replace("\n", "", $sPycronValue); + $sPycronValue = str_replace("\r", "", $sPycronValue); + if ($sPycronValue == "#<gtf_engines " . gethostname() . " " . $this->sGtfHome . ">") { + + $bWrite = false; + } else if ($sPycronValue == "#</gtf_engines " . gethostname() . " " . $this->sGtfHome . ">") { + $bWrite = true; + } + if ($bWrite == true && $sPycronValue != "#</gtf_engines " . gethostname() . " " . $this->sGtfHome . ">") { + $aValuesPycronNewFile[] = $sPycronValue; + } + } + } + // On écrit dans le fichier texte + $sFichierCrontab = fopen($this->sCrontabFile, "w"); + // Le fichier texte est vidé + ftruncate($sFichierCrontab, 0); + $aValuesPycronNewFile = str_replace("\n", "", $aValuesPycronNewFile); + $aValuesPycronNewFile = str_replace("\r", "", $aValuesPycronNewFile); + foreach ($aValuesPycronNewFile as $sPycronValues2) { + fputs($sFichierCrontab, $sPycronValues2 . "\n"); + } + // Enfin fermer le fichier + fclose($sFichierCrontab); + } + + function deleteCrontabValuesSubscription() { + $aPycronValues = file($this->sCrontabFile); + $aValuesPycronNewFile = Array(); + $bWrite = true; + foreach ($aPycronValues as $sPycronValue) { + $sPycronValue = str_replace("\n", "", $sPycronValue); + $sPycronValue = str_replace("\r", "", $sPycronValue); + + if ($sPycronValue == "#<gtf_subscription " . gethostname() . " " . $this->sGtfHome . ">") { + + $bWrite = false; + } else if ($sPycronValue == "#</gtf_subscription " . gethostname() . " " . $this->sGtfHome . ">") { + $bWrite = true; + } + if ($bWrite == true && $sPycronValue != "#</gtf_subscription " . gethostname() . " " . $this->sGtfHome . ">") { + $aValuesPycronNewFile[] = $sPycronValue; + } + } + // On écrit dans le fichier texte + $sFichierCrontab = fopen($this->sCrontabFile, "w"); + // Le fichier texte est vidé + ftruncate($sFichierCrontab, 0); + $aValuesPycronNewFile = str_replace("\n", "", $aValuesPycronNewFile); + $aValuesPycronNewFile = str_replace("\r", "", $aValuesPycronNewFile); + foreach ($aValuesPycronNewFile as $sPycronValues2) { + fputs($sFichierCrontab, $sPycronValues2 . "\n"); + } + // Enfin fermer le fichier + fclose($sFichierCrontab); + } + + function AddCrontabValuesEngines($sNotInList = "") { + if ($sNotInList == "") { + $sSql = 'SELECT gtf_engine_id, period, enabled FROM ' . $this->aProperties['schema_gtf'] . '.gtf_engine WHERE server_id=[iIdServer]'; + } else { + $sSql = 'SELECT gtf_engine_id, period, enabled FROM ' . $this->aProperties['schema_gtf'] . '.gtf_engine WHERE server_id=[iIdServer] AND gtf_engine_id not in ([sNotInList])'; + $aParams['sNotInList'] = array('value' => str_replace(',', '|', $sNotInList), 'type' => 'group'); + } + $aParams['iIdServer'] = array('value' => $this->iId, 'type' => 'number'); + $oPDOresult = $this->oBd->executeWithParams($sSql, $aParams); + $sFichierCrontab = fopen($this->sCrontabFile, "a"); + fputs($sFichierCrontab, "#<gtf_engines " . gethostname() . " " . $this->sGtfHome . ">" . "\n"); + while ($oGTF = $this->oBd->objetSuivant($oPDOresult)) { + if ($oGTF->enabled == true) { + $sActif = ""; + } else { + $sActif = "#"; + } + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $sLigne = $sActif . "*/" . $oGTF->period . " * * * * \"" . $this->EnginesHome . "/engine.exe\" " . $oGTF->gtf_engine_id; + } else { + $sLigne = $sActif . "*/" . $oGTF->period . " * * * * cd \"" . $this->EnginesHome . "\" && \"" . $this->EnginesHome . "/engine\" " . $oGTF->gtf_engine_id; + } + fputs($sFichierCrontab, $sLigne . "\n"); + } + fputs($sFichierCrontab, "#</gtf_engines " . gethostname() . " " . $this->sGtfHome . ">" . "\n"); + if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { + $sCronTmp = '/tmp/' . uniqid('cron_'); + exec("crontab -u www-data -l > " . $sCronTmp); + exec("crontab -u www-data " . $sCronTmp); + exec("rm " . $sCronTmp); + } + } + + function AddCrontabValuesSubscription() { + $sSql = 'SELECT period_id, cron_expression, enabled FROM ' . $this->aProperties['schema_gtf'] . '.period'; + $oPDOresult = $this->oBd->executeWithParams($sSql, array()); + $sFichierCrontab = fopen($this->sCrontabFile, "a"); + fputs($sFichierCrontab, "#<gtf_subscription " . gethostname() . " " . $this->sGtfHome . ">" . "\n"); + while ($oPeriod = $this->oBd->objetSuivant($oPDOresult)) { + if ($oPeriod->enabled == true) { + $sActif = ""; + } else { + $sActif = "#"; + } + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $sLigne = $sActif . $oPeriod->cron_expression . " \"" . $this->EnginesHome . "/php/php.exe\" \"" . $this->EnginesHome . "/subscription.php\" " . $oPeriod->period_id; + } else { + $sLigne = $sActif . $oPeriod->cron_expression . " (\"" . $this->EnginesHome . "/php/bin/php\" \"" . $this->EnginesHome . "/subscription.php\" " . $oPeriod->period_id . ")"; + } + fputs($sFichierCrontab, $sLigne . "\n"); + } + fputs($sFichierCrontab, "#</gtf_subscription " . gethostname() . " " . $this->sGtfHome . ">" . "\n"); + if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { + $sCronTmp = '/tmp/' . uniqid('cron_'); + exec("crontab -u www-data -l > " . $sCronTmp); + exec("crontab -u www-data " . $sCronTmp); + exec("rm " . $sCronTmp); + } + } + + function AddPropertiesFME($sNotInList = "") { + $sFichierProperties = fopen($this->sGtfHome . "/rest/conf/gtf/properties_post_engines.inc", "w"); + fputs($sFichierProperties, "<?php" . "\n"); + $sLigne = '$properties["engines_list"] = \''; + $aParams = array(); + if ($sNotInList == "") { + $sSql = 'SELECT gtf_engine_id FROM ' . $this->aProperties['schema_gtf'] . '.gtf_engine WHERE enabled = true ORDER BY gtf_engine_id'; + } else { + $sSql = 'SELECT gtf_engine_id FROM ' . $this->aProperties['schema_gtf'] . '.gtf_engine WHERE gtf_engine_id not in (' . $sNotInList . ") AND enabled = true ORDER BY gtf_engine_id"; + $aParams['sNotInList'] = array('value' => str_replace(',', '|', $sNotInList), 'type' => 'group'); + } + $oPDOresult = $this->oBd->executeWithParams($sSql, $aParams); + while ($oFme = $this->oBd->objetSuivant($oPDOresult)) { + if ($sLigne == '$properties["engines_list"] = \'') { + $sLigne .= $oFme->gtf_engine_id; + } else { + $sLigne .= "," . $oFme->gtf_engine_id; + } + } + $sLigne .= "';"; + fputs($sFichierProperties, $sLigne . "\n"); + fputs($sFichierProperties, "?>" . "\n"); + } + +} + ?> \ No newline at end of file diff --git a/src/module_gtf/web_service/ws/UserOrders.class.inc b/src/module_gtf/web_service/ws/UserOrders.class.inc index b0919bb3ecfaf61b8412fe4a3594420d092dcbb5..eb24ba40e5fac89bc15d4d0ca9a2e56b346da25d 100755 --- a/src/module_gtf/web_service/ws/UserOrders.class.inc +++ b/src/module_gtf/web_service/ws/UserOrders.class.inc @@ -246,7 +246,7 @@ class UserOrders extends GTF { $sDirName = $this->aProperties['upload_dir'] . "/" . $this->aValues['upload_directory']; if (!is_dir($sDirName)) mkdir($sDirName, 0777, true); - uploadFile($sName, "", $sDirName . "/" . $aFile['name'], $aFile['size'] + 1); + uploadFileToLocal($sName, "", $sDirName . "/" . $aFile['name'], $aFile['size'] + 1); } } // Met à jour le n° du moteur. diff --git a/src/module_gtf/web_service/ws/Workspace.class.inc b/src/module_gtf/web_service/ws/Workspace.class.inc index 07a23d46851c83cd464c1eb8445c26eae394af73..229163284fef843c8cfc6d14a1abf9152c0ef1fc 100755 --- a/src/module_gtf/web_service/ws/Workspace.class.inc +++ b/src/module_gtf/web_service/ws/Workspace.class.inc @@ -170,71 +170,55 @@ class Workspace extends GTF { */ function GET() { if (!empty($this->aValues["form"])) { - $sDirName = $this->aProperties['workspace_dir'] . "/" . (string) $this->aValues["my_vitis_id"]; require $this->sRessourcesFile; $this->aFields = $this->getFields($this->aProperties['schema_gtf'], "v_workspace", "workspace_id"); + // Groupes rattachés au projet FME. $this->getGroups(); - - if ($this->aValues["form"] == "Default") { - $sFile = $sDirName . "/form/DSubform.json"; - } else if ($this->aValues["form"] == "Perso") { - $sFile = $sDirName . "/form/WSubform.json"; - } else if ($this->aValues["form"] == "Published") { - $sFile = $sDirName . "/form/Subform.json"; - } else { + // Fichier de formulaire. + if ($this->aValues["form"] == 'Default') + $sFile = 'DSubform.json'; + else if ($this->aValues["form"] == 'Perso') + $sFile = 'WSubform.json'; + else if ($this->aValues["form"] == 'Published') + $sFile = 'Subform.json'; + else { writeToErrorLog("Error parameter is not a known mode user :" . $_SESSION["user_id"]); - $this->oError = new VitisError(1, "Error parameter is not a known mode"); } - if (is_file($sFile)) { - $pFile = fopen($sFile, "r"); - $iSize = filesize($sFile); - $sJson = fread($pFile, $iSize); - fclose($pFile); - $aJson = json_decode($sJson, true); + // Contenu du fichier de formulaire. + $sFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'form', $sFile); + if ($sFileContent !== false) { + $aJson = json_decode($sFileContent, true); $this->aFields["json_form"] = array($aJson); $sJs = ""; $sCss = ""; - if (is_dir($sDirName . "/form")) { - if ($dh = opendir($sDirName . "/form/ressources")) { - while (($file = readdir($dh)) !== false) { - $sName = explode(".", $file); - if ($sName[1] == "js") { - // $pFileJS = fopen($sDirName . "/form/ressources/Subform.js", "r"); - // $iSize = filesize($sDirName . "/form/ressources/Subform.js"); - // $sJs = fread($pFileJS, $iSize); - // fclose($pFileJS); - - $sJs = $this->aProperties['web_server_name'] . '/' . $this->aProperties['ws_data_alias'] . "/gtf/workspace/" . (string) $this->aValues["my_vitis_id"] . "/form/ressources/Subform.js"; - } - if ($sName[1] == "css") { - /* $pFileCSS = fopen($sDirName . "/form/ressources/Subform.css", "r"); - $iSize = filesize($sDirName . "/form/ressources/Subform.css"); - $sCss = fread($pFileCSS, $iSize); - fclose($pFileCSS); */ - $sCss = $this->aProperties['web_server_name'] . '/' . $this->aProperties['ws_data_alias'] . "/gtf/workspace/" . (string) $this->aValues["my_vitis_id"] . "/form/ressources/Subform.css"; - } - } - closedir($dh); - } - } + // Url du fichier js du formulaire. + $sFileUrl = getFileUrlInWsDataDir('gtf', 'workspace', $this->aValues['my_vitis_id'], 'form/ressources', 'Subform.js'); + if ($sFileUrl !== false) + $sJs = $sFileUrl; + // Url du fichier css du formulaire. + $sFileUrl = getFileUrlInWsDataDir('gtf', 'workspace', $this->aValues['my_vitis_id'], 'form/ressources', 'Subform.css'); + if ($sFileUrl !== false) + $sCss = $sFileUrl; + // array_push($this->aFields["json_form"], $sJs); array_push($this->aFields["json_form"], $sCss); - } else { - - $this->oError = new VitisError(1, "File not found"); } + else + $this->oError = new VitisError(1, "File not found"); } else { require $this->sRessourcesFile; $this->aFields = $this->getFields($this->aProperties['schema_gtf'], "v_workspace", "workspace_id"); $this->getGroups(); // Url vers le fichier fmw du projet. - if (!empty($this->aFields['fmw_file'])) - $this->aFields['fmw_file_url'] = $this->aProperties['web_server_name'] . '/' . $this->aProperties['ws_data_alias'] . '/gtf/workspace/' . $this->aValues['my_vitis_id'] . '/fme/' . $this->aFields['fmw_file']; + if (!empty($this->aFields['fmw_file'])) { + $sFmwFileUrl = getFileUrlInWsDataDir('gtf', 'workspace', $this->aValues['my_vitis_id'], 'fme', $this->aFields['fmw_file']); + if ($sFmwFileUrl !== false) + $this->aFields['fmw_file_url'] = $sFmwFileUrl; + } } // Formatage de la colonne "form_type". - $sFile = $this->aProperties['workspace_dir'] . "/" . $this->aValues["my_vitis_id"] . '/form/Subform.json'; - if (!file_exists($sFile)) + if (!fileExistsInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json')) $this->aFields['form_type'] = ''; else { if ($this->aFields['form_type'] != "custom") @@ -273,14 +257,8 @@ class Workspace extends GTF { if ($this->oConnection->oBd->enErreur()) { $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage()); } else { - $this->aFields['workspace_id'] = $this->aValues["my_vitis_id"]; - - $sDirName = $this->aProperties['workspace_dir'] . "/" . $this->aFields["workspace_id"] . "/"; - if (is_dir($sDirName)) { - clearDir($sDirName); - } else { - writeToErrorLog("No folder link with this workspace. verify if the workspace folder already exist on the server"); - } + // Suppression du répertoire du projet FME. + deleteDirectoryInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], '', ''); } } diff --git a/src/module_gtf/web_service/ws/Workspaces.class.inc b/src/module_gtf/web_service/ws/Workspaces.class.inc index 521713a108af401fa00b0e09fad16465a2433361..0e9a34d296abd5978bb566e2f83e17972c619b6c 100755 --- a/src/module_gtf/web_service/ws/Workspaces.class.inc +++ b/src/module_gtf/web_service/ws/Workspaces.class.inc @@ -169,13 +169,11 @@ class Workspaces extends GTF { // Formatage de la colonne "form_type". if ($aReturn['sStatus'] == 1) { foreach ($this->aObjects as &$oWorkspace) { - $sFile = $this->aProperties['workspace_dir'] . "/" . $oWorkspace->aFields['workspace_id'] . '/form/Subform.json'; - if (!file_exists($sFile)) { + if (!fileExistsInWsDataDir('gtf', 'workspace', $oWorkspace->aFields['workspace_id'], 'form', 'Subform.json')) $oWorkspace->aFields['form_type'] = ''; - } else { - if ($oWorkspace->aFields['form_type'] != "custom") { + else { + if ($oWorkspace->aFields['form_type'] != "custom") $oWorkspace->aFields['form_type'] = "default"; - } } } $aXmlRacineAttribute['status'] = 1; @@ -317,25 +315,25 @@ class Workspaces extends GTF { $oWorkspace = new Workspace($this->aPath, $this->aValues, $this->aProperties, $this->oConnection); $oWorkspace->GET(); $sWorkspace_key = $oWorkspace->aFields["key"]; - // Emplacement des widgets - $sWidgetDirectory = $this->aProperties["vas_home"] . '/ws_data/gtf/widget'; - $bError = False; - if (!is_dir($sWidgetDirectory)) { - if (!mkdir($sWidgetDirectory, 0777, true)) { - $bError = True; - $this->aFields['errorMessage'] = "Failed to create directory " . $sWidgetDirectory; - } + $this->aFields['workspace_key'] = $sWorkspace_key; + // Widget dans une page html. + $sWidgetHtml = '<!DOCTYPE html>' . PHP_EOL . '<html>' . PHP_EOL . '<head>' . PHP_EOL . '<title>Widget</title>' . PHP_EOL . '<meta name="viewport" content="width=device-width, initial-scale=1.0">' . PHP_EOL . '<meta http-equiv="X-UA-Compatible" content="IE=edge">' . PHP_EOL . '</head>' . PHP_EOL . '<body>'; + $sWidgetHtml .= $this->aValues['widgetFileContent']; + $sWidgetHtml .= '' . PHP_EOL . '</body>' . PHP_EOL . '</html>'; + // Création du fichier du widget. + if (putFileContentInWsDataDir('gtf', 'widget', '', '', $sWorkspace_key . ".html", $sWidgetHtml) !== false) { + // Url du fichier du widget. + $sFileUrl = getFileUrlInWsDataDir('gtf', 'widget', '', '', $sWorkspace_key . ".html"); + if ($sFileUrl !== false) + $this->aFields['widget_file_url'] = $sFileUrl; + $aXmlRacineAttribute['status'] = 1; + $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); } - if (!$bError) { - $this->aFields['workspace_key'] = $sWorkspace_key; - // Widget dans une page html. - $sWidgetHtml = '<!DOCTYPE html>' . PHP_EOL . '<html>' . PHP_EOL . '<head>' . PHP_EOL . '<title>Widget</title>' . PHP_EOL . '<meta name="viewport" content="width=device-width, initial-scale=1.0">' . PHP_EOL . '<meta http-equiv="X-UA-Compatible" content="IE=edge">' . PHP_EOL . '</head>' . PHP_EOL . '<body>'; - $sWidgetHtml .= $this->aValues['widgetFileContent']; - $sWidgetHtml .= '' . PHP_EOL . '</body>' . PHP_EOL . '</html>'; - file_put_contents($this->aProperties["vas_home"] . '/ws_data/gtf/widget/' . $sWorkspace_key . ".html", $sWidgetHtml); + else { + $oError = new VitisError(17, 'ERROR_CREATION_WIDGET_FILE'); + $aXmlRacineAttribute['status'] = 0; + $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); } - $aXmlRacineAttribute['status'] = (int) !$bError; - $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); return $sMessage; } if (!empty($this->aValues['mode']) && $this->aValues['mode'] == "import") { @@ -380,48 +378,54 @@ class Workspaces extends GTF { } $aReturn = $this->genericPost($this->aProperties['schema_gtf'], 'workspace', $this->aProperties['schema_gtf'] . '.seq_common', 'workspace_id'); - $oWorkspace = new Workspace($this->aPath, $this->aValues, $this->aProperties, $this->oConnection); - $oWorkspace->GET(); - $sFilePathName = $this->aProperties['workspace_dir'] . "/" . $oWorkspace->aFields["workspace_id"] . "/fme/" . $_FILES['fmw_file']['name'][$i]; - $sDirName = $this->aProperties['workspace_dir'] . "/" . $oWorkspace->aFields["workspace_id"]; - // Si le répertoire existe déja : suppression. - if (is_dir($sDirName)) - clearDir($sDirName); - // - mkdir($sDirName, 0777, true); - mkdir($sDirName . "/form", 0777, true); - mkdir($sDirName . "/form/ressources", 0777, true); - mkdir($sDirName . "/fme", 0777, true); - - if (!move_uploaded_file($_FILES['fmw_file']['tmp_name'][$i], utf8_decode($sFilePathName))) { - writeToErrorLog(ERROR_0031 . $_FILES['file']['name']); - $aReturn = array(sStatus => 1, sMessage => WORKSPACE_ERROR_COPYING_FILE); - } else { - // Fichier .fmw original en .bak. - copy($sDirName . "/fme/" . utf8_decode($this->aValues['fmw_file']), $sDirName . "/fme/" . utf8_decode($this->aValues['fmw_file']) . '.bak'); - // - fclose(fopen($sDirName . "/form/ressources/Subform.js", "w+")); - fclose(fopen($sDirName . "/form/ressources/Subform.css", "w+")); - $oFmwParser = new GtfFmwParser($sDirName . "/fme/" . $_FILES['fmw_file']['name'][$i]); - // Sauve le .fmw sans les visualizers. - $oFmwParser->save($sDirName . "/fme/" . utf8_decode($this->aValues['fmw_file'])); - // Création des formulaires json. - $aJson = $oFmwParser->productJson($this->aProperties, $oWorkspace->aFields["name"]); - $fJson = fopen($sDirName . "/form/Subform.json", "w+"); - if (fwrite($fJson, json_encode($aJson)) == FALSE) { - if ($fJson == FALSE) { - writeToErrorLog("Subform.json can't be opened : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the property workspace_dir)"); - } else { - writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)"); + if ($aReturn['sStatus'] == 1) { + $oWorkspace = new Workspace($this->aPath, $this->aValues, $this->aProperties, $this->oConnection); + $oWorkspace->GET(); + $sFilePathName = $this->aProperties['workspace_dir'] . "/" . $oWorkspace->aFields["workspace_id"] . "/fme/" . $_FILES['fmw_file']['name'][$i]; + $sDirName = $this->aProperties['workspace_dir'] . "/" . $oWorkspace->aFields["workspace_id"]; + // Si le répertoire existe déja : suppression. + deleteDirectoryInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], '', ''); + // Upload du fichier fmw. + $this->aValues['fme'] = $this->aValues['fmw_file']; + $_FILES['fme'] = array( + 'name' => $_FILES['fmw_file']['name'][$i], + 'type' => $_FILES['fmw_file']['type'][$i], + 'tmp_name' => $_FILES['fmw_file']['tmp_name'][$i], + 'error' => $_FILES['fmw_file']['error'][$i], + 'size' => $_FILES['fmw_file']['size'][$i] + ); + $sErrorMessage = uploadInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], "fme", $this->aValues, -1, "fmw"); + if (!empty($sErrorMessage)) { + writeToErrorLog($sErrorMessage); + $oError = new VitisError(8, $sErrorMessage); + $aXmlRacineAttribute['status'] = 0; + $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); + } else { + // Copie du .fmw original en .bak. + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name'][$i], $_FILES['fmw_file']['name'][$i] . '.bak'); + // Création des fichiers vides de ressources js et css. + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.js', ''); + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.css', ''); + // Lit le contenu du fichier .fmw du projet. + $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name'][$i]); + // Sauve le .fmw sans les visualizers. + $oFmwParser = new GtfFmwParser($_FILES['fmw_file']['name'][$i], $this->aProperties, $sFmwFileContent); + $oFmwParser->save($oFmwParser->sFmwFileName); + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name'][$i], file_get_contents($oFmwParser->sFmwFileName)); + // Création des formulaires json. + $aJson = $oFmwParser->productJson($oWorkspace->aFields["name"]); + if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', json_encode($aJson)) !== false) { + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', 'WSubform.json'); + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', 'DSubform.json'); } + $oFmwParser->updateMetadata($this->oConnection->oBd, $oWorkspace->aFields["workspace_id"]); + // + $this->aValues["errorkeys"] = ""; } - fclose($fJson); - copy($sDirName . "/form/Subform.json", $sDirName . "/form/WSubform.json"); - copy($sDirName . "/form/Subform.json", $sDirName . "/form/DSubform.json"); - $oFmwParser->updateMetadata($this->oConnection->oBd, $oWorkspace->aFields["workspace_id"]); - $this->aValues["errorkeys"] = ""; + $sMessage = $aReturn['sMessage']; } - $sMessage = $aReturn['sMessage']; + else + return $aReturn['sMessage']; } } else { $this->aValues["fmw_file"] = $_FILES['fmw_file']['name']; @@ -502,44 +506,47 @@ class Workspaces extends GTF { } $sDirName = $this->aProperties['workspace_dir'] . "/" . $oWorkspace->aFields["workspace_id"]; // Si le répertoire existe déja : suppression. - if (is_dir($sDirName)) - clearDir($sDirName); - // - mkdir($sDirName, 0777, true); - mkdir($sDirName . "/form", 0777, true); - mkdir($sDirName . "/form/ressources", 0777, true); - mkdir($sDirName . "/fme", 0777, true); - uploadFile('fmw_file', "fmw", $sDirName . "/fme/" . $_FILES['fmw_file']['name'], $_FILES['fmw_file']['size'] + 1); - // Fichier .fmw original en .bak. - copy($sDirName . "/fme/" . utf8_decode($_FILES['fmw_file']['name']), $sDirName . "/fme/" . utf8_decode($_FILES['fmw_file']['name']) . '.bak'); - // - fclose(fopen($sDirName . "/form/ressources/Subform.js", "w+")); - fclose(fopen($sDirName . "/form/ressources/Subform.css", "w+")); - if ($this->aValues["comp_file"] != "") { - uploadFile('comp_file', "", $sDirName . "/fme/" . $_FILES['comp_file']['name'], $_FILES['comp_file']['size'] + 1); - $ext = pathinfo($_FILES['comp_file']['name'], PATHINFO_EXTENSION); - if ($ext == "zip") { - unZip($sDirName . "/fme/" . utf8_decode($_FILES['comp_file']['name']), $sDirName . "/fme/"); - } + deleteDirectoryInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], '', ''); + // Upload du fichier fmw. + $this->aValues['fme'] = $this->aValues['fmw_file']; + $_FILES['fme'] = $_FILES['fmw_file']; + $sErrorMessage = uploadInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], "fme", $this->aValues, -1, "fmw"); + // Copie du .fmw original en .bak. + if (!empty($sErrorMessage)) { + writeToErrorLog($sErrorMessage); + $oError = new VitisError(8, $sErrorMessage); + $aXmlRacineAttribute['status'] = 0; + $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); } - $oFmwParser = new GtfFmwParser($sDirName . "/fme/" . $_FILES['fmw_file']['name']); - // Sauve le .fmw sans les visualizers. - $oFmwParser->save($sDirName . "/fme/" . utf8_decode($_FILES['fmw_file']['name'])); - // Création des formulaires json. - $aJson = $oFmwParser->productJson($this->aProperties, $oWorkspace->aFields["name"]); - $fJson = fopen($sDirName . "/form/Subform.json", "w+"); - if (fwrite($fJson, json_encode($aJson)) == FALSE) { - if ($fJson == FALSE) { - writeToErrorLog("Subform.json can't be opened : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the property workspace_dir)"); - } else { - writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)"); + else { + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name'], $_FILES['fmw_file']['name'] . '.bak'); + // Création des fichiers vides de ressources js et css. + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.js', ''); + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.css', ''); + // Upload du fichier de ressource. + if ($this->aValues["comp_file"] != "") { + // Si le fichier est une archive .zip -> décompression et copie des fichiers. + if (pathinfo($this->aValues["comp_file"], PATHINFO_EXTENSION) == "zip") + unzipInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $_FILES['comp_file']['tmp_name']); + $this->aValues['fme'] = $this->aValues['comp_file']; + $_FILES['fme'] = $_FILES['comp_file']; + $sErrorMessage = uploadInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], "fme", $this->aValues); + } + // Lit le contenu du fichier .fmw du projet. + $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name']); + // Sauve le .fmw sans les visualizers. + $oFmwParser = new GtfFmwParser($_FILES['fmw_file']['name'], $this->aProperties, $sFmwFileContent); + $oFmwParser->save($oFmwParser->sFmwFileName); + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name'], file_get_contents($oFmwParser->sFmwFileName)); + // Création des formulaires json. + $aJson = $oFmwParser->productJson($oWorkspace->aFields["name"]); + if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', json_encode($aJson)) !== false) { + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', 'WSubform.json'); + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', 'DSubform.json'); } + $oFmwParser->updateMetadata($this->oConnection->oBd, $oWorkspace->aFields["workspace_id"]); + /* * ************************************************************** */ } - fclose($fJson); - copy($sDirName . "/form/Subform.json", $sDirName . "/form/WSubform.json"); - copy($sDirName . "/form/Subform.json", $sDirName . "/form/DSubform.json"); - $oFmwParser->updateMetadata($this->oConnection->oBd, $oWorkspace->aFields["workspace_id"]); - /* * ************************************************************** */ } else { writeToErrorLog("the uploaded file is not a fmw file or no file uploaded (Workspaces.class.inc : user_id->" . $_SESSION["user_id"] . ")"); $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); @@ -549,6 +556,11 @@ class Workspaces extends GTF { $sMessage = $aReturn['sMessage']; } } + else { + $oError = new VitisError(1, 'REQUEST_ERROR'); + $aXmlRacineAttribute['status'] = 0; + $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); + } }; return $sMessage; } @@ -685,9 +697,13 @@ class Workspaces extends GTF { function PUT() { if (!empty($this->aValues["action"]) && $this->aValues["action"] == "Metadata") { $aReturn = $this->reintegrateMetadata(); - $aXmlRacineAttribute['status'] = $aReturn['status']; - $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); + if ($aReturn['status'] == 1) + $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); + else { + $oError = new VitisError(13, $aReturn['message']); + $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); + } } else { $sDirName = $this->aProperties['workspace_dir'] . "/" . (string) $this->aValues["my_vitis_id"]; @@ -697,7 +713,7 @@ class Workspaces extends GTF { $error_message = ""; // Si le dossier {id} n'existe pas (Important pour gérer les erreurs) - if (!is_dir($sDirName)) { + if (isDirInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"]) !== true) { $error_message .= $sDirName . " does not exist"; writeToErrorLog("WARNING: " . $error_message); @@ -708,7 +724,7 @@ class Workspaces extends GTF { return $sMessage; } // Si le dossier {id}/fme n'existe pas (Important pour gérer les erreurs) - if (!is_dir($sDirName . "/fme")) { + if (isDirInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme') !== true) { $error_message .= $sDirName . "/fme does not exist"; writeToErrorLog("WARNING: " . $error_message); @@ -720,33 +736,33 @@ class Workspaces extends GTF { } // Si le dossier {id}/form n'existe pas il est crée - if (!is_dir($sDirName . "/form")) { + if (isDirInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form') !== true) { writeToErrorLog("WARNING: " . $sDirName . "/form dit not exist"); - @mkdir($sDirName . "/form"); + if ($this->aProperties['fileS3Uploader'] === false) + @mkdir($sDirName . "/form"); } if (!empty($this->aValues["cmd"])) { switch ($this->aValues["cmd"]) { - // DSubform: formulaire par défaut // Subform: formulaire publié // WSubform: formulaire personnalié // Remplace le formulaire publié par celui par défaut case "Default_Published": // Si le fichier par défaut n'existe pas, il est généré - if (!file_exists($sDirname . "/form/DSubform.json")) { + if (!fileExistsInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json')) { $this->aValues["cmd"] = "Default_Reset"; $this->PUT(); } - @unlink($sDirname . "/form/Subform.json"); - copy($sDirName . "/form/DSubform.json", $sDirName . "/form/Subform.json"); + // Remplace 'Subform.json' par le formulaire par défaut 'DSubform.json'. + deleteFileFromWsDataDirTree('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json'); + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', 'Subform.json'); $this->aValues["form_type"] = 'default'; break; // Regénère le formulaire par défaut en fonction du fmw case "Default_Reset": $oWorkspace = new Workspace($this->aPath, $this->aValues, $this->aProperties, $this->oConnection); $oWorkspace->GET(); - if (empty($oWorkspace->aFields["fmw_file"])) { $error_message .= "Any FME file founded in" . $sDirName . "/fme/ "; writeToErrorLog("WARNING: " . $error_message); @@ -757,70 +773,46 @@ class Workspaces extends GTF { $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); return $sMessage; } - - $oFmwParser = new GtfFmwParser($sDirName . "/fme/" . $oWorkspace->aFields["fmw_file"]); - $aJson = $oFmwParser->productJson($this->aProperties, $oWorkspace->aFields["name"]); - $fJson = fopen($sDirName . "/form/DSubform.json", "w"); - if (fwrite($fJson, json_encode($aJson)) == FALSE) { - if ($fJson == FALSE) { - writeToErrorLog("Subform.json can't be opened : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the property workspace_dir)"); - } else { - writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)"); - } - } - fclose($fJson); + // Lit le contenu du fichier .fmw du projet. + $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $oWorkspace->aFields["fmw_file"]); + // Création des formulaires json. + $oFmwParser = new GtfFmwParser($oWorkspace->aFields["fmw_file"], $this->aProperties, $sFmwFileContent); + $aJson = $oFmwParser->productJson($oWorkspace->aFields["name"]); + if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', json_encode($aJson)) === false) + writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)"); //$oFmwParser->updateMetadata($this->oConnection->oBd, $oWorkspace->aFields["workspace_id"]); break; // Remplace le formulaire publié par celui personnalisé case "Perso_Published" : - @unlink($sDirname . "/form/Subform.json"); - copy($sDirName . "/form/WSubform.json", $sDirName . "/form/Subform.json"); + deleteFileFromWsDataDirTree('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json'); + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'WSubform.json', 'Subform.json'); $this->aValues["form_type"] = 'custom'; break; // Remplace le fornulaire personnalisé par le formulaire par défaut case "Perso_Reset": // Si le fichier par défaut n'existe pas, il est généré - if (!file_exists($sDirname . "/form/DSubform.json")) { + if (!fileExistsInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json')) { $this->aValues["cmd"] = "Default_Reset"; $this->PUT(); } - @unlink($sDirname . "/form/WSubform.json"); - copy($sDirName . "/form/DSubform.json", $sDirName . "/form/WSubform.json"); + // Remplace 'Subform.json' par 'WSubform.json'. + deleteFileFromWsDataDirTree('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'WSubform.json'); + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', 'WSubform.json'); break; - // Sauvegarde le formulaire personnalisé + // Sauvegarde le formulaire personnalisé. case "Perso_Save": - $pFile = fopen($sDirName . "/form/WSubform.json", "w"); - if (fwrite($pFile, $this->aValues["Json"]) == FALSE) { - if ($fJson == FALSE) { - writeToErrorLog("Subform.json can't be opened : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the property workspace_dir)"); - } else { - writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)"); - } - } - fclose($pFile); - + // Sauve le formulaire personnalisé. + if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'WSubform.json', $this->aValues["Json"]) === false) + writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)"); + // Sauve le javascript. if ($this->aValues["Js"] != "") { - $pFileJS = fopen($sDirName . "/form/ressources/Subform.js", "w+"); - if (fwrite($pFileJS, $this->aValues["Js"]) == FALSE) { - if ($pFileJS == FALSE) { - writeToErrorLog("Subform.js can't be opened : " . $sDirName . "/form/ressources/Subform.js" . "(Workspaces.class.inc : verify the property workspace_dir)"); - } else { - writeToErrorLog("Subform.js can't be writed : " . $sDirName . "/form/ressources/Subform.js" . "(Workspaces.class.inc : verify the folder's rights)"); - } - } - fclose($pFileJS); + if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.js', $this->aValues["Js"]) === false) + writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)"); } - + // Sauve le css. if ($this->aValues["Css"] != "") { - $pFileCSS = fopen($sDirName . "/form/ressources/Subform.css", "w+"); - if (fwrite($pFileCSS, $this->aValues["Css"]) == FALSE) { - if ($pFileCSS == FALSE) { - writeToErrorLog("Subform.css can't be opened : " . $sDirName . "/form/ressources/Subform.css" . "(Workspaces.class.inc : verify the property workspace_dir)"); - } else { - writeToErrorLog("Subform.css can't be writed : " . $sDirName . "/form/ressources/Subform.css" . "(Workspaces.class.inc : verify the folder's rights)"); - } - } - fclose($pFileCSS); + if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.css', $this->aValues["Css"]) === false) + writeToErrorLog("Subform.css can't be writed : " . $sDirName . "/form/ressources/Subform.css" . "(Workspaces.class.inc : verify the folder's rights)"); } break; default : writeToErrorLog("ERROR : Bad request from Client : " . $this->aValues["cmd"] . " form user ->" . $_SESSION["user_id"]); @@ -829,14 +821,15 @@ class Workspaces extends GTF { if (!empty($this->aValues["fmw_file_file"])) { $this->aValues["fmw_file"] = $this->aValues["fmw_file_name"]; } + // Upload du fichier de ressource. if (!empty($this->aValues["comp_file_file"])) { $this->aValues["comp_file"] = $this->aValues["comp_file_name"]; - $fp = fopen($sDirName . "/fme/" . utf8_decode($this->aValues["comp_file_name"]), "w"); - fwrite($fp, $this->aValues["comp_file_file"]); - fclose($fp); - $ext = pathinfo($sDirName . "/fme/" . utf8_decode($this->aValues["comp_file_name"]), PATHINFO_EXTENSION); - if ($ext == "zip") { - unZip($sDirName . "/fme/" . utf8_decode($this->aValues["comp_file_name"]), $sDirName . "/fme/"); + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $this->aValues["comp_file_name"], $this->aValues["comp_file_file"]); + // Si le fichier est une archive .zip -> décompression et copie du répertoire. + if (pathinfo($this->aValues["comp_file"], PATHINFO_EXTENSION) == "zip") { + $sZipFilePath = $this->aProperties['extract_dir'] . '/' . $this->aValues["comp_file_name"]; + file_put_contents($sZipFilePath, $this->aValues["comp_file_file"]); + unzipInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $sZipFilePath); } } $aReturn = $this->genericPut($this->aProperties['schema_gtf'], 'workspace', 'workspace_id'); @@ -865,35 +858,38 @@ class Workspaces extends GTF { $aExt = explode(".", $this->aValues["fmw_file_name"]); if ($aExt[count($aExt) - 1] == "fmw") { // Sauve le nouveau fichier fmw. - $fp = fopen($sDirName . "/fme/" . utf8_decode($this->aValues["fmw_file_name"]), "w"); - fwrite($fp, $this->aValues["fmw_file_file"]); - fclose($fp); - // Fichier .fmw original en .bak. - copy($sDirName . "/fme/" . utf8_decode($this->aValues['fmw_file_name']), $sDirName . "/fme/" . utf8_decode($this->aValues['fmw_file_name']) . '.bak'); - // Création du nouveau formulaire. - $oFmwParser = new GtfFmwParser($sDirName . "/fme/" . $this->aValues["fmw_file_name"]); - // Sauve le .fmw sans les visualizers. - $oFmwParser->save($sDirName . "/fme/" . utf8_decode($this->aValues["fmw_file_name"])); - // Création des formulaires json. - $aJson = $oFmwParser->productJson($this->aProperties, $oWorkspace->aFields["name"]); - $fJson = fopen($sDirName . "/form/DSubform.json", "w"); - if (fwrite($fJson, json_encode($aJson)) == FALSE) { - if ($fJson == FALSE) { - writeToErrorLog("Subform.json can't be opened : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the property workspace_dir)"); - } else { - writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)"); - } + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $this->aValues["fmw_file_name"], $this->aValues["fmw_file_file"]); + // Copie du .fmw original en .bak. + if (!empty($sErrorMessage)) { + writeToErrorLog($sErrorMessage); + $oError = new VitisError(8, $sErrorMessage); + $aXmlRacineAttribute['status'] = 0; + $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); } - fclose($fJson); - if ($oWorkspace->aFields["form_type"] == 'default') { - copy($sDirName . "/form/DSubform.json", $sDirName . "/form/Subform.json"); - copy($sDirName . "/form/DSubform.json", $sDirName . "/form/WSubform.json"); + else { + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $this->aValues['fmw_file_name'], $this->aValues['fmw_file_name'] . '.bak'); + // Création des fichiers vides de ressources js et css. + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.js', ''); + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.css', ''); + // Lit le contenu du fichier .fmw du projet. + $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $this->aValues['fmw_file_name']); + // Sauve le .fmw sans les visualizers. + $oFmwParser = new GtfFmwParser($this->aValues['fmw_file_name'], $this->aProperties, $sFmwFileContent); + $oFmwParser->save($oFmwParser->sFmwFileName); + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $this->aValues['fmw_file_name'], file_get_contents($oFmwParser->sFmwFileName)); + // Création des formulaires json. + $aJson = $oFmwParser->productJson($oWorkspace->aFields["name"]); + if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', json_encode($aJson)) !== false && $oWorkspace->aFields["form_type"] == 'default') { + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', 'WSubform.json'); + copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', 'Subform.json'); + } + // Récupère les anciens paramètres. + $oFmwParser->getBdMetadata($this->oConnection->oBd, $this->aValues["my_vitis_id"]); + // Mise à jour des paramètres du nouveau fichier dans la base. + $oFmwParser->sSaveDate = gmdate('Y-m-d G:i:s'); + $oFmwParser->updateMetadata($this->oConnection->oBd, $this->aValues["my_vitis_id"]); + /*****************************************************************/ } - // Récupère les anciens paramètres. - $oFmwParser->getBdMetadata($this->oConnection->oBd, $this->aValues["my_vitis_id"]); - // Mise à jour des paramètres du nouveau fichier dans la base. - $oFmwParser->sSaveDate = gmdate('Y-m-d G:i:s'); - $oFmwParser->updateMetadata($this->oConnection->oBd, $this->aValues["my_vitis_id"]); } } else { $aXmlRacineAttribute['status'] = 1; @@ -1044,28 +1040,30 @@ class Workspaces extends GTF { if ($this->aPath[3] == "File") { $aReturn = $this->deleteWorkspaceFile(); $aXmlRacineAttribute['status'] = $aReturn['status']; - if ($aReturn['status'] == 1) { + if ($aReturn['status'] == 1) $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); - } else { - $oError = new VitisError(1, 'LICENSE_FILE_INSTALL_ERROR_CONFIGURATION_CONFIGURATION_GTF_LICENSE'); + else { + $oError = new VitisError(1, $aReturn['message']); $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); } } elseif ($this->aPath[3] == "DeleteWidgetFile") { unset($this->aPath[3]); + $aReturn = array('status' => 1, 'message' => ''); $oWorkspace = new Workspace($this->aPath, $this->aValues, $this->aProperties, $this->oConnection); $oWorkspace->GET(); $sWorkspace_key = $oWorkspace->aFields["key"]; - // Emplacement des widgets - $sWidgetFilePath = $this->aProperties["vas_home"] . '/ws_data/gtf/widget/' . $sWorkspace_key . ".html"; - $bError = False; - if (is_file($sWidgetFilePath)) { - if (!unlink($sWidgetFilePath)) { - $bError = True; - $this->aFields['errorMessage'] = "Failed to remove the widget " . $sWidgetFilePath; - } + // Suppression du fichier de widget. + if (deleteFileFromWsDataDirTree('gtf', 'widget', '', '', $sWorkspace_key . '.html') === false) { + $aReturn = array('status' => 0, 'message' => 'DELETE_FILE_ERROR_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY', 'error_code' => null); + writeToErrorLog('Failed to remove the wisget file ' . $sWorkspace_key . '.html'); + } + $aXmlRacineAttribute['status'] = $aReturn['status']; + if ($aReturn['status'] == 1) + $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); + else { + $oError = new VitisError($aReturn['error_code'], $aReturn['message']); + $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); } - $aXmlRacineAttribute['status'] = (int) !$bError; - $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); return $sMessage; } } else { @@ -1080,17 +1078,33 @@ class Workspaces extends GTF { */ function getWorkspaceDirectoryTree() { $aReturn = array('status' => 1, 'message' => ''); - $sWorkspaceDir = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme'; - $sTreeName = 'fme'; - if (is_dir($sWorkspaceDir)) { - $aDirStructure = $this->getDirStructure($sWorkspaceDir, $sTreeName); - $aTreeviewLogs["data"][] = $aDirStructure["data"]; - foreach ($aDirStructure["files"] as $aFiles) { - $aTreeviewLogs["files"][] = $aFiles; + if ($this->aProperties['fileS3Uploader'] === true) { + $aWorkspaceDirectoryTree = $this->getS3FolderInfos('ws_data/gtf/workspace/' . $this->aValues["my_vitis_id"] . '/fme'); + if ($aWorkspaceDirectoryTree === false) { + $aReturn['status'] = 0; + $aReturn['error_code'] = 13; + $aReturn['message'] = 'ERROR_FILE_TREE_LOADING_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY'; + } + else + $this->aFields['tree'] = $aWorkspaceDirectoryTree; + } + else { + $sWorkspaceDir = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme'; + $sTreeName = 'fme'; + if (is_dir($sWorkspaceDir)) { + $aDirStructure = $this->getDirStructure($sWorkspaceDir, $sTreeName); + $aTreeviewLogs["data"][] = $aDirStructure["data"]; + foreach ($aDirStructure["files"] as $aFiles) + $aTreeviewLogs["files"][] = $aFiles; + $this->aFields['tree'] = $aTreeviewLogs; + } + else { + writeToErrorLog('scandir(' . $sWorkspaceDir . '): failed to open dir'); + $aReturn['status'] = 0; + $aReturn['error_code'] = 13; + $aReturn['message'] = 'ERROR_FILE_TREE_LOADING_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY'; } - $this->aFields['tree'] = $aTreeviewLogs; - } else - writeToErrorLog('scandir(' . $sWorkspaceDir . '): failed to open dir'); + } return $aReturn; } @@ -1156,16 +1170,26 @@ class Workspaces extends GTF { * Get workspace file. */ function getWorkspaceFile() { - $aReturn = array('status' => 1, 'message' => ''); - $sFilePath = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme/' . $this->aValues['file_name']; - // Le fichier existe ? - if (file_exists($sFilePath)) { + // Chargement du contenu du fichier. + $sFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $this->aValues['file_name']); + if ($sFileContent !== false) { + // Copie du fichier dans un répertoire temporaire. + $sFilePath = $this->aProperties['extract_dir'] . '/' . getUniqRandomId() . '/' . $this->aValues['file_name']; + $sFileDirPath = pathinfo($sFilePath, PATHINFO_DIRNAME); + if (file_exists($sFileDirPath)) + cleardir($sFileDirPath); + mkdir($sFileDirPath, 0777, true); + file_put_contents($sFilePath, $sFileContent); + // Retourne les entêtes pour forcer le téléchargement du fichier. header("Content-Type: application/octet-stream"); header("Content-Transfer-Encoding: Binary"); header("Content-disposition: attachment; filename=\"" . $this->aValues['file_name'] . "\""); header('Content-Length: ' . filesize($sFilePath)); readfile($sFilePath); + cleardir($sFileDirPath); } + else + WriteToErrorLog("The file '$sWidgetFile' does not exist."); } /** @@ -1177,11 +1201,16 @@ class Workspaces extends GTF { $oWorkspace = new Workspace($this->aPath, $this->aValues, $this->aProperties, $this->oConnection); $oWorkspace->GET(); $this->aFields['workspace_key'] = $oWorkspace->aFields["key"]; - $sWidgetFilePath = $this->aProperties["vas_home"] . '/ws_data/gtf/widget/' . $this->aFields['workspace_key'] . '.html'; - // Le fichier existe ? - if (!file_exists($sWidgetFilePath)) { - $aReturn = array('status' => 0, 'error_code' => 13, 'message' => 'The file ' . $this->aFields['workspace_key'] . '.html' . 'does not exist.'); - WriteToErrorLog("The file '$sWidgetFilePath' does not exist."); + $sWidgetFile = $this->aFields['workspace_key'] . '.html'; + if (!fileExistsInWsDataDir('gtf', 'widget', '', '', $sWidgetFile)) { + $aReturn = array('status' => 0, 'error_code' => 13, 'message' => 'The file ' . $sWidgetFile . ' does not exist.'); + WriteToErrorLog("The file '$sWidgetFile' does not exist."); + } + else { + // Url du fichier du widget. + $sFileUrl = getFileUrlInWsDataDir('gtf', 'widget', '', '', $sWidgetFile); + if ($sFileUrl !== false) + $this->aFields['widget_file_url'] = $sFileUrl; } return $aReturn; } @@ -1191,14 +1220,8 @@ class Workspaces extends GTF { */ function deleteWorkspaceFile() { $aReturn = array('status' => 1, 'message' => ''); - $sFilePath = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme/' . $this->aValues['file_name']; - // Le fichier existe ? - if (file_exists(utf8_decode($sFilePath))) { - if (!unlink(utf8_decode($sFilePath))) - $aReturn = array('status' => 0, 'message' => 'DELETE_FILE_ERROR_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY', 'error_code' => null); - } else - $aReturn = array('status' => 0, 'message' => 'FILE_NOT_FOUND_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY', 'error_code' => null); - + if (deleteFileFromWsDataDirTree('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $this->aValues['file_name']) === false) + $aReturn = array('status' => 0, 'message' => 'DELETE_FILE_ERROR_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY', 'error_code' => null); return $aReturn; } @@ -1207,22 +1230,28 @@ class Workspaces extends GTF { */ function regenerateMetadata() { require $this->sRessourcesFile; - $aReturn = array('status' => 1, 'message' => ''); $aFields = $this->getFields($this->aProperties['schema_gtf'], "workspace", "workspace_id"); - $sFmwFile = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme/' . $aFields['fmw_file']; - $oObject = new GtfFmwParser($sFmwFile); - // Valeurs des colonnes "last_save_date" et "last_save_build" originales. - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); - $aParams['workspace_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number'); - $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getWorkspaceLastSaveData'], $aParams); - if (!$this->oConnection->oBd->enErreur()) { - $aRow = $this->oConnection->oBd->ligneSuivante($oPDOresult); - $oObject->sSaveDate = gmdate('Y-m-d G:i:s'); - $oObject->sSaveBuild = $aRow['last_save_build']; + // Lit le contenu du fichier .fmw du projet. + $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $aFields['fmw_file']); + // Remplace les métas données. + if ($sFmwFileContent !== false) { + $oFmwParser = new GtfFmwParser($aFields['fmw_file'], $this->aProperties, $sFmwFileContent); + // Valeurs des colonnes "last_save_date" et "last_save_build" originales. + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); + $aParams['workspace_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getWorkspaceLastSaveData'], $aParams); + if (!$this->oConnection->oBd->enErreur()) { + $aRow = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $oFmwParser->sSaveDate = gmdate('Y-m-d G:i:s'); + $oFmwParser->sSaveBuild = $aRow['last_save_build']; + $aReturn = array('status' => 1, 'message' => ''); + } + // Mise à jour du projet en base. + $oFmwParser->updateMetadata($this->oConnection->oBd, $this->aValues["my_vitis_id"]); } - // Mise à jour du projet en base. - $oObject->updateMetadata($this->oConnection->oBd, $this->aValues["my_vitis_id"]); + else + $aReturn = array('status' => 0, 'message' => 'ERROR_WORKSPACE_FILE_NOT_FOUND'); return $aReturn; } @@ -1230,15 +1259,137 @@ class Workspaces extends GTF { * Reintegrate workspace metadata. */ function reintegrateMetadata() { - $aReturn = array('status' => 1, 'message' => ''); $aFields = $this->getFields($this->aProperties['schema_gtf'], "workspace", "workspace_id"); - $sFmwFile = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme/' . $aFields['fmw_file']; - $oObject = new GtfFmwParser($sFmwFile); - $oObject->getBdMetadata($this->oConnection->oBd, $this->aValues["my_vitis_id"]); - $oObject->save($sFmwFile); + // Lit le contenu du fichier .fmw du projet. + $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $aFields['fmw_file']); + // Remplace les métas données. + if ($sFmwFileContent !== false) { + $oFmwParser = new GtfFmwParser($aFields['fmw_file'], $this->aProperties, $sFmwFileContent); + $oFmwParser->getBdMetadata($this->oConnection->oBd, $this->aValues["my_vitis_id"]); + $oFmwParser->save($oFmwParser->sFmwFileName); + putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $aFields['fmw_file'], file_get_contents($oFmwParser->sFmwFileName)); + $aReturn = array('status' => 1, 'message' => ''); + } + else { + $aReturn = array('status' => 0, 'message' => 'ERROR_WORKSPACE_FILE_NOT_FOUND'); + } return $aReturn; } + /** + *This method scan a path to get metrics of an object (S3). + *@file vmlib/phpUtil.inc + *@param $sDirectoryPath path/prefix to scan. + *@return $aArray file structure from S3. + */ + function getS3FolderInfos ($sDirectoryPath){ + global $properties; + require_once ("aws_sdk/aws-autoloader.php"); + + // traitement du bucket et de ses sous-dossiers + $sBucket = $properties['fileS3UploaderBucket']; + $sPrefix = ""; + if (strpos($sBucket, "/") > -1){ + $aBucket = explode("/", $sBucket ); + $sBucket = $aBucket[0]; + $sPrefix = implode("/", array_slice($aBucket, 1)); + } + // Création du client S3 + $s3 = new Aws\S3\S3Client(array( + 'version'=>'latest', + 'region'=> $properties['fileS3UploaderRegion'], + 'profile'=> $properties['fileS3UploaderProfil'], + 'debug' => false + )); + $sListPrefix = str_replace($properties['ws_data_dir'], $sPrefix . "/ws_data" , $sDirectoryPath); + try { + // Liste des objets. + $aList = $s3->listObjectsV2(array( + 'Bucket' => $sBucket, + 'Prefix' => $sListPrefix + )); + $date = new DateTime(); + $sDataUrl = $properties['web_server_name'] . "/rest/vitis/file_downloader?key=[KEY]&eTag=[ETAG]&d=" . $date->getTimestamp(); + $aPath = explode("/", $sDirectoryPath); + $aReturn = array(); + $aTree = array( + "filename"=> end($aPath), + "text"=> end($aPath), + 'selectable' => false, + "nodes" => array() + ); + if ($aList["KeyCount"] > 0){ + $aFiles = array(); + foreach ($aList["Contents"] as $aObject) { + $aFiles[] = array('path' => $aObject['Key']); + $sObjectPath = str_replace($sListPrefix, "", $aObject["Key"]); + $aObjectPath = explode("/", $sObjectPath); + // Libellé du fichier avec la taille. + $iFileSizeLabel = $aObject["Size"]; + $aFileSizeUnity = array('o', 'Ko', 'Mo', 'Go', 'To'); + $i = 0; + while ($iFileSizeLabel > 1024) { + $iFileSizeLabel /= 1024; + $i++; + } + $sDate = $aObject["LastModified"]->__toString(); + $aTree = $this->s3TreeBuilder($aTree, $sObjectPath, array( + "filename"=> end($aObjectPath), + "text"=> end($aObjectPath) . ' (' . round($iFileSizeLabel) . ' ' . $aFileSizeUnity[$i] . ')', + "size" => $aObject["Size"], + 'icon' => 'glyphicon glyphicon-file', + 'tags' => array(date ("d/m/Y H:i:s", strtotime($sDate))), + "path" => $aObject["Key"] + )); + } + $aReturn['files'] = $aFiles; + $aReturn['data'] = array($aTree); + } + else + $aReturn = false; + return $aReturn; + + }catch(Aws\S3\Exception\S3Exception $e){ + writeToErrorLog($e->getMessage()); + return false; + } + } + + /** + *This method scan an object key to generate a tree struct (S3). + *@file vmlib/phpUtil.inc + *@param $aTree an existing tree. + *@param $sPath Path to scan. + *@param $FileStructure object metrics structure. + *@return $aArray file structure from S3. + */ + function s3TreeBuilder ($aTree, $sPath, $FileStructure) { + $aTreeTmp = &$aTree["nodes"]; + $aPath = explode("/", $sPath); + foreach ($aPath as $sFragment){ + if(!empty($sFragment)){ + if($sFragment !== $FileStructure["filename"]){ + $key = array_search($sFragment, array_column($aTreeTmp, 'filename')); + if ($key !== false) + $aTreeTmp = &$aTreeTmp[$key]["nodes"]; + else { + $aFolder = array( + "filename"=> $sFragment, + "text"=> $sFragment, + 'selectable' => false, + "nodes" => array() + ); + array_push($aTreeTmp, $aFolder); + $key = array_search($sFragment, array_column($aTreeTmp, 'filename')); + $aTreeTmp = &$aTreeTmp[$key]["nodes"]; + } + } + else + array_push($aTreeTmp, $FileStructure); + } + } + return $aTree; + } } ?> \ No newline at end of file