Return-Path: X-Original-To: apmail-httpd-modules-dev-archive@minotaur.apache.org Delivered-To: apmail-httpd-modules-dev-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 6BAF990F7 for ; Wed, 16 Nov 2011 20:04:13 +0000 (UTC) Received: (qmail 28197 invoked by uid 500); 16 Nov 2011 20:04:13 -0000 Delivered-To: apmail-httpd-modules-dev-archive@httpd.apache.org Received: (qmail 27898 invoked by uid 500); 16 Nov 2011 20:04:12 -0000 Mailing-List: contact modules-dev-help@httpd.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: modules-dev@httpd.apache.org Delivered-To: mailing list modules-dev@httpd.apache.org Received: (qmail 27889 invoked by uid 99); 16 Nov 2011 20:04:12 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 16 Nov 2011 20:04:12 +0000 X-ASF-Spam-Status: No, hits=2.2 required=5.0 tests=HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: local policy) Received: from [63.88.113.194] (HELO mail.teralogics.com) (63.88.113.194) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 16 Nov 2011 20:04:05 +0000 X-Footer: dGVyYWxvZ2ljcy5jb20= Received: from localhost ([127.0.0.1]) by mail.teralogics.com for modules-dev@httpd.apache.org; Wed, 16 Nov 2011 15:04:42 -0500 From: "Pranesh Vadhirajan" To: Subject: Apache shared memory implementation Date: Wed, 16 Nov 2011 15:03:40 -0500 Message-ID: <008a01cca49a$d7621530$86263f90$@com> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AcykmtUh3CFP4H36QO6Q1U2VeUwaZg== Content-Language: en-us Content-Type: multipart/signed; micalg=SHA1; boundary="----=_NextPart_000_0082_01CCA470.EC62C490"; protocol="application/x-pkcs7-signature" ------=_NextPart_000_0082_01CCA470.EC62C490 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0083_01CCA470.EC62C490" ------=_NextPart_001_0083_01CCA470.EC62C490 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hello Everyone, I am trying to understand how to implement sharing of objects in memory between various processes in apache. I have been using the routines defined in to implement the shared memory mapping functionality. However, I am not seeing any actual sharing of the objects in my output. I have attached the code segment of my module containing the request handler: #include "httpd.h" #include "http_core.h" #include "http_config.h" #include #include #include #include #include "sessions.h" #include #include #include #include #include #include void set_shared_region(int *shared_int) { int fd; /* Create shared memory object and set its size */ fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); if(fd == -1) fprintf(stderr,"shm_open error"); if(ftruncate(fd, sizeof(int)) == -1) fprintf(stderr,"ftruncate error"); /* Map shared memory object */ shared_int = mmap(NULL, sizeof(int),PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(shared_int == MAP_FAILED) fprintf(stderr,"mmap error"); } int start_mutex() { if(initial_mutex_value == 0) { if(sem_init(&session_mutex,1,1) < 0) { fprintf(stderr,"error initializing semaphore"); return 0; } initial_mutex_value = 1; } return 1; } static int counter_handler(request_rec* r) { char time_buffer[30]; char entry[1024]; long int tid,pid; apr_ctime(time_buffer,r->request_time); start_mutex(); sem_wait(&session_mutex); set_shared_region(&ctr); ctr++; sem_post(&session_mutex); //tid = (long int)getthreadid(); pid = (long int)getpid(); sprintf(entry,"counter: %i, thread: %ld, process: %ld, request: %s, time: %s;",ctr,(long int)0,pid,r->the_request,time_buffer); tempToDB(entry); return DECLINED; } static void counter_register_hooks (apr_pool_t *p) { ap_hook_handler(counter_handler, NULL, NULL, APR_HOOK_REALLY_FIRST); } module AP_MODULE_DECLARE_DATA counter_module = { STANDARD20_MODULE_STUFF, NULL,//uvds_metrics_dir_conf, /* Per-Directory Configuration */ NULL,//uvds_metrics_dir_merge, /* Directory Config Merger */ NULL,//uvds_metrics_server_conf, /* Per-Server Configuration */ NULL,//uvds_metrics_server_merge, /* Server Config Merger */ NULL,//uvds_metrics_cmds, /* Command Table (Directives) */ counter_register_hooks /* Registering Hooks */ }; The handler code uses the variable ctr which is defined in the header file "sessions.h" . Here's the relevant segment in sessions.h: #include #include #include #include "libpq-fe.h" #include sem_t session_mutex; int initial_mutex_value = 0; int ctr = 0; void tempToDB(char *entry); Here's the output of my code: 64201;"counter: 1, thread: 0, process: 18194, request: POST /login?destination=login HTTP/1.1, time: Wed Nov 16 19:56:04 2011;" 64202;"counter: 2, thread: 0, process: 18194, request: POST /login?destination=login HTTP/1.1, time: Wed Nov 16 19:56:04 2011;" 64203;"counter: 3, thread: 0, process: 18194, request: GET /login HTTP/1.1, time: Wed Nov 16 19:56:05 2011;" 64204;"counter: 4, thread: 0, process: 18194, request: GET /login HTTP/1.1, time: Wed Nov 16 19:56:05 2011;" 64205;"counter: 5, thread: 0, process: 18194, request: GET /dashboard HTTP/1.1, time: Wed Nov 16 19:56:06 2011;" 64206;"counter: 6, thread: 0, process: 18194, request: GET /dashboard HTTP/1.1, time: Wed Nov 16 19:56:06 2011;" 64207;"counter: 7, thread: 0, process: 18194, request: GET /viewfeeds HTTP/1.1, time: Wed Nov 16 19:56:07 2011;" 64208;"counter: 8, thread: 0, process: 18194, request: GET /viewfeeds HTTP/1.1, time: Wed Nov 16 19:56:07 2011;" 64209;"counter: 9, thread: 0, process: 18194, request: GET /viewfeeds/dosort&sortby=none HTTP/1.1, time: Wed Nov 16 19:56:07 2011;" 64210;"counter: 10, thread: 0, process: 18194, request: GET /viewfeeds/dosort&sortby=none HTTP/1.1, time: Wed Nov 16 19:56:07 2011;" 64211;"counter: 1, thread: 0, process: 18201, request: GET /misc/viewfeeds/images/sidebar_05.png HTTP/1.1, time: Wed Nov 16 19:56:07 2011;" 64212;"counter: 2, thread: 0, process: 18201, request: GET /misc/viewfeeds/images/sidebar_05.png HTTP/1.1, time: Wed Nov 16 19:56:07 2011;" 64213;"counter: 11, thread: 0, process: 18194, request: GET /recordings HTTP/1.1, time: Wed Nov 16 19:56:08 2011;" 64214;"counter: 12, thread: 0, process: 18194, request: GET /recordings HTTP/1.1, time: Wed Nov 16 19:56:08 2011;" 64215;"counter: 13, thread: 0, process: 18194, request: GET /cop HTTP/1.1, time: Wed Nov 16 19:56:09 2011;" 64216;"counter: 14, thread: 0, process: 18194, request: GET /cop HTTP/1.1, time: Wed Nov 16 19:56:09 2011;" 64217;"counter: 15, thread: 0, process: 18194, request: GET /logout HTTP/1.1, time: Wed Nov 16 19:56:10 2011;" 64218;"counter: 16, thread: 0, process: 18194, request: GET /logout HTTP/1.1, time: Wed Nov 16 19:56:10 2011;" 64219;"counter: 17, thread: 0, process: 18194, request: GET / HTTP/1.1, time: Wed Nov 16 19:56:11 2011;" As you can see, the counter is incremented within the same process correctly, but is not shared among different processes. Sorry, for the overly verbose message, but can anybody tell me how to fix the sharing of my variable ctr so that it is shared among all process? Respectfully, Pranesh ------=_NextPart_001_0083_01CCA470.EC62C490 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hello = Everyone,

     I = am trying to understand how to implement sharing of objects in memory = between various processes in apache.  I have been using the = routines defined in <sys/mman.h> to implement the shared memory = mapping functionality.   However, I am not seeing any actual = sharing of the objects in my output. 

 

I have = attached the code segment of my module containing the request = handler:

 

#include = "httpd.h"

#include = "http_core.h"

#include = "http_config.h"

#include = <stdlib.h>

#include = <time.h>

#include = <sys/time.h>

#include = <sys/types.h>

#include = "sessions.h"

#include = <regex.h>

#include = <stdio.h>

#include = <sys/mman.h>

#include = <sys/stat.h>

#include = <fcntl.h>

#include = <unistd.h>

 

 

void set_shared_region(int = *shared_int)

{

   int = fd;

 

   /* Create shared memory = object and set its size */

   fd =3D = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | = S_IWUSR);

   if(fd =3D=3D = -1)

      = fprintf(stderr,"shm_open error");

 

   if(ftruncate(fd, = sizeof(int)) =3D=3D -1)

       = fprintf(stderr,"ftruncate error");

 

    /* Map shared = memory object */

   shared_int =3D = mmap(NULL, sizeof(int),PROT_READ | PROT_WRITE, MAP_SHARED, fd, = 0);

   if(shared_int =3D=3D = MAP_FAILED)

      = fprintf(stderr,"mmap error");

}

 

int = start_mutex()

{

   if(initial_mutex_value = =3D=3D 0)

   = {

      = if(sem_init(&session_mutex,1,1) < 0)

  =     {

         = fprintf(stderr,"error initializing = semaphore");

         return = 0;

      = }

      = initial_mutex_value =3D 1;

   = }

   return = 1;

}

 

static int = counter_handler(request_rec* r)

{

   char time_buffer[30]; =

   char = entry[1024];

   long int = tid,pid;

   = apr_ctime(time_buffer,r->request_time);

   = start_mutex();

   = sem_wait(&session_mutex);

   = set_shared_region(&ctr);

   = ctr++;

   = sem_post(&session_mutex);

   //tid =3D (long = int)getthreadid();

   pid =3D (long = int)getpid();

   = sprintf(entry,"counter: %i, thread: %ld, process: %ld, request: = %s,  time: %s;",ctr,(long = int)0,pid,r->the_request,time_buffer);

   = tempToDB(entry);

 

   return = DECLINED;

}

 

static void counter_register_hooks = (apr_pool_t *p)

{

   = ap_hook_handler(counter_handler, NULL, NULL, = APR_HOOK_REALLY_FIRST);

}

 

module AP_MODULE_DECLARE_DATA = counter_module =3D

{

  = STANDARD20_MODULE_STUFF,

  = NULL,//uvds_metrics_dir_conf,      /* = Per-Directory Configuration */

  = NULL,//uvds_metrics_dir_merge,       &= nbsp;   /* Directory Config Merger */

  = NULL,//uvds_metrics_server_conf,       = ;  /* Per-Server Configuration */

  = NULL,//uvds_metrics_server_merge,  /* Server Config Merger = */

  = NULL,//uvds_metrics_cmds,        =         /* Command Table (Directives) = */

  = counter_register_hooks        &nb= sp;    /* Registering Hooks */

};

 

The handler code = uses the variable ctr which is defined in the header file = “sessions.h” .  Here’s the relevant segment in = sessions.h:

 

       &= nbsp;           &n= bsp;            =             &= nbsp;   #include = <stdio.h>

#include = <stdlib.h>

#include = <string.h>

#include = "libpq-fe.h"

#include = <semaphore.h>

 

sem_t = session_mutex;

int initial_mutex_value =3D = 0;

int ctr =3D = 0;

 

void tempToDB(char = *entry);

 

 

 

Here’s the output of my code:  =

 

         &= nbsp;           &n= bsp;           &nb= sp;           &nbs= p;  64201;"counter: 1, thread: 0, process: 18194, request: = POST /login?destination=3Dlogin HTTP/1.1,  time: Wed Nov 16 = 19:56:04 2011;"

64202;"counter: 2, thread: 0, process: = 18194, request: POST /login?destination=3Dlogin HTTP/1.1,  time: = Wed Nov 16 19:56:04 2011;"

64203;"counter: 3, thread: 0, process: = 18194, request: GET /login HTTP/1.1,  time: Wed Nov 16 19:56:05 = 2011;"

64204;"counter: 4, thread: 0, process: = 18194, request: GET /login HTTP/1.1,  time: Wed Nov 16 19:56:05 = 2011;"

64205;"counter: 5, thread: 0, process: = 18194, request: GET /dashboard HTTP/1.1,  time: Wed Nov 16 19:56:06 = 2011;"

64206;"counter: 6, thread: 0, process: = 18194, request: GET /dashboard HTTP/1.1,  time: Wed Nov 16 19:56:06 = 2011;"

64207;"counter: 7, thread: 0, process: = 18194, request: GET /viewfeeds HTTP/1.1,  time: Wed Nov 16 19:56:07 = 2011;"

64208;"counter: 8, thread: 0, process: = 18194, request: GET /viewfeeds HTTP/1.1,  time: Wed Nov 16 19:56:07 = 2011;"

64209;"counter: 9, thread: 0, process: = 18194, request: GET /viewfeeds/dosort&sortby=3Dnone HTTP/1.1,  = time: Wed Nov 16 19:56:07 2011;"

64210;"counter: 10, thread: 0, process: = 18194, request: GET /viewfeeds/dosort&sortby=3Dnone HTTP/1.1,  = time: Wed Nov 16 19:56:07 2011;"

64211;"counter: 1, thread: 0, process: = 18201, request: GET /misc/viewfeeds/images/sidebar_05.png = HTTP/1.1,  time: Wed Nov 16 19:56:07 2011;"

64212;"counter: 2, = thread: 0, process: 18201, request: GET = /misc/viewfeeds/images/sidebar_05.png HTTP/1.1,  time: Wed Nov 16 = 19:56:07 2011;"

64213;"counter: 11, thread: 0, process: = 18194, request: GET /recordings HTTP/1.1,  time: Wed Nov 16 = 19:56:08 2011;"

64214;"counter: 12, thread: 0, process: = 18194, request: GET /recordings HTTP/1.1,  time: Wed Nov 16 = 19:56:08 2011;"

64215;"counter: 13, thread: 0, process: = 18194, request: GET /cop HTTP/1.1,  time: Wed Nov 16 19:56:09 = 2011;"

64216;"counter: 14, thread: 0, process: = 18194, request: GET /cop HTTP/1.1,  time: Wed Nov 16 19:56:09 = 2011;"

64217;"counter: 15, thread: 0, process: = 18194, request: GET /logout HTTP/1.1,  time: Wed Nov 16 19:56:10 = 2011;"

64218;"counter: 16, thread: 0, process: = 18194, request: GET /logout HTTP/1.1,  time: Wed Nov 16 19:56:10 = 2011;"

64219;"counter: 17, thread: 0, process: = 18194, request: GET / HTTP/1.1,  time: Wed Nov 16 19:56:11 = 2011;"

 

 

As you can = see, the counter is incremented within the same process correctly, but = is not shared among different processes.  Sorry, for the overly = verbose message, but can anybody tell me how to fix the sharing of my = variable ctr so that it is shared among all process?

 

 

Respectfully,

Pranesh

------=_NextPart_001_0083_01CCA470.EC62C490-- ------=_NextPart_000_0082_01CCA470.EC62C490 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" 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 xCZU7wO94CTLVBowHQYDVR0OBBYEFImCZ33EnSZwAEu0UEh83j2uBG59MA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MBEGA1UdIAQKMAgwBgYEVR0gADBEBgNVHR8EPTA7MDmgN6A1hjNo dHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vQWRkVHJ1c3RFeHRlcm5hbENBUm9vdC5jcmwwNQYIKwYB BQUHAQEEKTAnMCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3 DQEBBQUAA4IBAQABvJzjYyiw8zEBwt973WKgAZ0jMQ+cknNTUeofTPrWn8TKL2d+eDMPdBa5kYeR 9Yom+mRwANge+QsEYlCHk4HU2vUj2zS7hVa0cDRueIM3HoUcxREVkl+HF72sav3xwtHMiV+xfPA+ UfI183zsYJhrOivg79+zfYbrtRv1W+yifJgT1wBQudEtc94DeHThBYUxXsuauZ2UxrmUN3Vy3ET7 Z+jw+iUeUqfaJelH4KDHPKBOsQo2+3dIn++Xivu0/uOUFKiDvFwtP9JgcWDuwnGCDOmINuPaILSj oGyqlku4gI51ykkH9jsUut/cBdmf2+Cy5k2geCbn5y1uf1/GHogVMIIFgTCCBGmgAwIBAgIRANGS Ud5YeTRlPApSKDhTrWEwDQYJKoZIhvcNAQEFBQAwga4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJV VDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29y azEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMTYwNAYDVQQDEy1VVE4tVVNFUkZp cnN0LUNsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgRW1haWwwHhcNMTEwNTE3MDAwMDAwWhcNMTIw NTE2MjM1OTU5WjAqMSgwJgYJKoZIhvcNAQkBFhl2YWRoaXJhamFuQHRlcmFsb2dpY3MuY29tMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvYppOk/+2Te+onCCsdTrnNQXtaXxytTfRcU2 XATm2UVUbKGPAIaoI8EdHcaoG+jILltTbkQxOqsbqNhjJlaPpDBcX6q+hiMUlXfXMIFPnUBthU/y IUibqlPh3mJixLPIpxjtvuZFjJ5gq7puINc7IRI1PAf6YOHudMDCZrwJDer6iUKNlDNZZmeZXXt4 542ajxhr1qoDKEgUxLmrrBCiPSeLkLgEr9yjiAYI4PYiA7AXeYNOXjzGPhiKXbaqIgh3q8Ev+ZsD BAL0mJmnJhOqpH8PBE5osAUjBGJaMC6JMRSblyqLQ6akpRikaSmdtsB/NNPr8Z0giSovnaSyS2Y+ QwIDAQABo4ICGzCCAhcwHwYDVR0jBBgwFoAUiYJnfcSdJnAAS7RQSHzePa4Ebn0wHQYDVR0OBBYE FDFATl9hSHdJixWIie7OGx9EhXvSMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMCAGA1Ud JQQZMBcGCCsGAQUFBwMEBgsrBgEEAbIxAQMFAjARBglghkgBhvhCAQEEBAMCBSAwRgYDVR0gBD8w PTA7BgwrBgEEAbIxAQIBAQEwKzApBggrBgEFBQcCARYdaHR0cHM6Ly9zZWN1cmUuY29tb2RvLm5l dC9DUFMwgaUGA1UdHwSBnTCBmjBMoEqgSIZGaHR0cDovL2NybC5jb21vZG9jYS5jb20vVVROLVVT RVJGaXJzdC1DbGllbnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDBKoEigRoZEaHR0cDovL2Ny bC5jb21vZG8ubmV0L1VUTi1VU0VSRmlyc3QtQ2xpZW50QXV0aGVudGljYXRpb25hbmRFbWFpbC5j cmwwbAYIKwYBBQUHAQEEYDBeMDYGCCsGAQUFBzAChipodHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9V VE5BQUFDbGllbnRDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTAk BgNVHREEHTAbgRl2YWRoaXJhamFuQHRlcmFsb2dpY3MuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQBZ w07bp4emQcNnICegn82h7mHgn+1ZWjAGRE988obXN6gsWG1sTF5krPE21SE3OFbWGZTam47FeB9+ nwYUqZiTbj7+uw2G6tpxE3V728iZPFaMoDn97cZzwZLEQW85OHxYcetI0GEzoyEIvF4NaRDbAFYP VV3016cjHu66Etg5ZPuzr+9ayZXgrPJXfl44buybmY7pHDS3lWWyVieUfE9eyFjHWClG6T0EBhSN 7HEw2g4DyIUPBBdAaQBh9Xnc81rdtYHrSxry1oEgNnNdoD239kzAWjlGJjlrVb6H8sZ/V5om1LuM HJD2qbrBjv+DG4IIliiDZomFSt1zVyukxj77MYIEuTCCBLUCAQEwgcQwga4xCzAJBgNVBAYTAlVT MQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VS VFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMTYwNAYDVQQD Ey1VVE4tVVNFUkZpcnN0LUNsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgRW1haWwCEQDRklHeWHk0 ZTwKUig4U61hMAkGBSsOAwIaBQCgggLJMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI hvcNAQkFMQ8XDTExMTExNjIwMDMzOVowIwYJKoZIhvcNAQkEMRYEFO9MxHe4qk+fjBU+a2AHZ3GZ EENtMIG3BgkqhkiG9w0BCQ8xgakwgaYwCwYJYIZIAWUDBAEqMAsGCWCGSAFlAwQBFjAKBggqhkiG 9w0DBzALBglghkgBZQMEAQIwDgYIKoZIhvcNAwICAgCAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgFA MA0GCCqGSIb3DQMCAgEoMAcGBSsOAwIaMAsGCWCGSAFlAwQCAzALBglghkgBZQMEAgIwCwYJYIZI AWUDBAIBMAoGCCqGSIb3DQIFMIHVBgkrBgEEAYI3EAQxgccwgcQwga4xCzAJBgNVBAYTAlVTMQsw CQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJV U1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMTYwNAYDVQQDEy1V VE4tVVNFUkZpcnN0LUNsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgRW1haWwCEQDRklHeWHk0ZTwK Uig4U61hMIHXBgsqhkiG9w0BCRACCzGBx6CBxDCBrjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVU MRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3Jr MSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmly c3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbAIRANGSUd5YeTRlPApSKDhTrWEwDQYJ KoZIhvcNAQEBBQAEggEAiPe2Jb5zgbW63bIeA6bfRDcZnM5SzSMCF07XMdYxtB5DYAqdUiDn/2D2 jI0hhGVG5dAIxxKi0q8dXs47hnPmrXkFx+QiBLrNx2VJyeRPKnyxtpQkFg+LA7vHdz1JZ56lcpsE UGE0XCa2gSJJpZBJQSM4rThYdzvRlKBZ9PHKUDrmowxbcxwpUKPQKtmnxsv0h8fpSe1lJ0L1xJK3 h2laE0oyrVEnuszTfrOyLm1at94ehBfemzyV11Ye0ZAhCUQnWS79uUCGrJRLduxhuPfp3ucT+xuY s5ykg7vgwXERXtx37JY1CwaLPjIuE1zhjHS+EfvVsHheO/ra3H3/De6rfgAAAAAAAA== ------=_NextPart_000_0082_01CCA470.EC62C490--